{"version":3,"sources":["jsdelivr-header.js","/npm/pokemap-1@0.2.1/pokemap.bundle.js"],"names":[],"mappings":"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","file":"/npm/pokemap-1@0.2.1/pokemap.bundle.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/pokemap-1@0.2.1/pokemap.bundle.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.PokeMap = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n\"use strict\";\nvar io = require('socket.io-client');\nfunction DataService(apiEndpoint) {\n  var self = this;\n  var dbService = {\n    getPastDataByTime: function(sightingsSince, callback) {\n      var date = new Date();\n      var sightingsSinceDate = (new Date(new Date().getTime() - sightingsSince * 1000));\n      var range = Math.floor(sightingsSince / 60);\n      var xhr = new XMLHttpRequest();\n      var url = apiEndpoint + '/api/pokemon/sighting/ts/' + sightingsSinceDate.toUTCString() + '/range/' + range.toString() + 'm';\n      xhr.open(\"GET\", url, true);\n      xhr.onreadystatechange = function() {\n        if (xhr.readyState === 4 && xhr.status === 200) {\n          var json = JSON.parse(xhr.responseText);\n          callback(json);\n        } else {}\n      };\n      xhr.send();\n    },\n    getPastData: function(location, callback) {\n      var locationFrom = location.from.lng + ',' + location.from.lat;\n      var locationTo = location.to.lng + ',' + location.to.lat;\n      var xhr = new XMLHttpRequest();\n      var url = apiEndpoint + '/api/pokemon/sighting/coordinates/from/' + locationFrom + '/to/' + locationTo;\n      xhr.open(\"GET\", url, true);\n      xhr.onreadystatechange = function() {\n        if (xhr.readyState === 4 && xhr.status === 200) {\n          var json = JSON.parse(xhr.responseText);\n          callback(json);\n        } else {}\n      };\n      xhr.send();\n    },\n    getPredictedData: function(location, timestamp, callback) {\n      var locationFrom = location.from.lng + ',' + location.from.lat;\n      var locationTo = location.to.lng + ',' + location.to.lat;\n      var xhr = new XMLHttpRequest();\n      var url = apiEndpoint + 'api/pokemon/prediction/coordinates/' + locationFrom + ',' + locationTo + '/ts/' + timestamp;\n      xhr.open(\"GET\", url, true);\n      xhr.onreadystatechange = function() {\n        if (xhr.readyState === 4 && xhr.status === 200) {\n          var json = JSON.parse(xhr.responseText);\n          callback(json);\n        } else {}\n      };\n      xhr.send();\n    },\n    getPokemonDetailsById: function(id, callback) {\n      var xhr = new XMLHttpRequest();\n      var url = apiEndpoint + '/api/pokemon/id/' + id;\n      xhr.open(\"GET\", url, true);\n      xhr.onreadystatechange = function() {\n        if (xhr.readyState === 4 && xhr.status === 200) {\n          var json = JSON.parse(xhr.responseText);\n          callback(json);\n        } else {}\n      };\n      xhr.send();\n    },\n    getPokemonDataByTimeRange: function(from, to, callback) {\n      var currentTime = new Date();\n      var startTimeStamp = new Date(currentTime.getTime() + 1000 * from);\n      var startTimeStampString = startTimeStamp.toUTCString();\n      var range = to - from + 's';\n      var xhr = new XMLHttpRequest();\n      var url = apiEndpoint + 'api/pokemon/sighting/ts/' + startTimeStampString + '/range/' + range;\n      xhr.open(\"GET\", url, true);\n      xhr.onreadystatechange = function() {\n        if (xhr.readyState === 4 && xhr.status === 200) {\n          var json = JSON.parse(xhr.responseText);\n          callback(json);\n        } else {}\n      };\n      xhr.send();\n    }\n  };\n  self.getApiEndpointURL = function() {\n    return apiEndpoint;\n  };\n  self.fetchData = function(sightingsSince, predictionsUntil, updateCallback) {\n    if (sightingsSince == 0) {\n      if (predictionsUntil == 0) {\n        console.log(\"Nothing to show\");\n        return;\n      }\n    } else {\n      if (predictionsUntil == 0) {\n        dbService.getPastDataByTime(sightingsSince, updateCallback);\n      } else {\n        dbService.getPastDataByTime(sightingsSince, updateCallback);\n      }\n    }\n  };\n  self.getData = function(bounds, updateCallback) {\n    dbService.getPastData(bounds, updateCallback);\n    return;\n    if (timeRange.start < 0 && timeRange.end < 0) {\n      var pokemons = dbService.getPastData(bounds, updateCallback);\n      return pokemons;\n    } else {\n      if (timeRange.start > 0 && timeRange.end > 0) {\n        var pokemons = dbService.getPredictedData(from, to, updateCallback);\n        return pokemons;\n      } else {\n        var pokemons = dbService.getPastData(bounds, updateCallback);\n        pokemons.push(dbService.getPredictedData(bounds, updateCallback));\n        return pokemons;\n      }\n    }\n  };\n  self.getPokemonDetailsById = function(id, callback) {\n    dbService.getPokemonDetailsById(id, callback);\n  };\n  self.configureSocket = function(socketEndPoint, mapCenter, mobCallback) {\n    var twitterData = new twitterService(socketEndPoint, mapCenter, mobCallback);\n  };\n}\nfunction twitterService(socketEndPoint, mapCenter, mobCallback) {\n  console.log(socketEndPoint);\n  var socket = io.connect(socketEndPoint);\n  socket.on('connect', function() {\n    console.log('Socket connection is up');\n    socket.emit(\"settings\", {\n      mode: \"geo\",\n      lat: mapCenter.latitude,\n      lon: mapCenter.longitude,\n      radius: 5000000\n    });\n  });\n  socket.on('mob', mobCallback);\n}\nmodule.exports = DataService;\n\n//# sourceURL=C:/Users/PAUL/Documents/PokeMap-1/module/DataService.js\n},{\"socket.io-client\":65}],2:[function(require,module,exports){\n\"use strict\";\n\"use strict\";\nvar L = require('leaflet');\nrequire('leaflet-routing-machine');\nrequire('leaflet-control-geocoder');\nrequire('leaflet/dist/leaflet.css');\nrequire('../style.css');\nvar DataService = require('./DataService.js');\n(function() {\n  function PokeMap(htmlElement, options) {\n    var coordinates = options.coordinates;\n    if (!coordinates) {\n      coordinates = {\n        latitude: 48.132100,\n        longitude: 11.546914\n      };\n    }\n    var zoomLevel = options.zoomLevel;\n    var timeRange = options.timeRange;\n    var apiEndpoint = options.apiEndpoint;\n    var socketEndPoint = options.websocketEndpoint;\n    var tileLayer = options.tileLayer;\n    var tileLayerOptions = options.tileLayerOptions;\n    if (!zoomLevel) {\n      zoomLevel = 15;\n    }\n    if (!timeRange) {\n      timeRange = 1;\n    }\n    if (!apiEndpoint) {\n      throw new Error('Fatal: apiEndpoint not defined');\n    }\n    if (!socketEndPoint) {\n      throw new Error('Fatal: socketEndPoint not defined');\n    }\n    if (!tileLayer) {\n      tileLayer = 'https://api.mapbox.com/styles/v1/poulzinho/ciu2fc21400k32iqi2gkb7h7g/tiles/256/{z}/{x}/{y}?access_token=pk.eyJ1IjoicG91bHppbmhvIiwiYSI6ImNpdTJmMmlwMTAwMHAyeW55NmVpbXpoY3oifQ._S-9Yx6OXlnMMq_MgsodlA';\n    }\n    if (!tileLayerOptions) {\n      tileLayerOptions = {\n        attribution: '' + 'JS16 <a href=\"https://github.com/PokemonGoers/PokeMap-1\">PokeMap</a>, ' + 'Mapping platform &copy; <a href=\"http://mapbox.com\">Mapbox</a> ' + 'Pokemon Images © <a href=\"http://pokemondb.net/\">Pokémon Database</a>',\n        maxZoom: 18\n      };\n    }\n    var self = this;\n    this.goTo = goTo;\n    this.updatePoints = updatePoints;\n    this.navigate = navigate;\n    this.clearRoutes = clearRoutes;\n    this.filter = filter;\n    this.on = on;\n    self.timeRange = JSON.parse(JSON.stringify(timeRange));\n    var eventHandlers = {};\n    var mymap = null;\n    var pokemonLayer = null;\n    var mobsLayer = null;\n    var route;\n    var dataService = new DataService(apiEndpoint, socketEndPoint, coordinates);\n    var PokemonIcon = L.Icon.extend({options: {\n        iconSize: [30, 30],\n        shadowSize: [50, 64],\n        shadowAnchor: [4, 62],\n        popupAnchor: [-3, -76]\n      }});\n    function initMap() {\n      mymap = L.map(htmlElement);\n      L.tileLayer(tileLayer, tileLayerOptions).addTo(mymap);\n      L.Icon.Default.imagePath = '/node_modules/leaflet/dist/images';\n      self.goTo({\n        coordinates: coordinates,\n        zoomLevel: zoomLevel\n      });\n      pokemonLayer = L.layerGroup([]).addTo(mymap);\n      mobsLayer = L.layerGroup([]).addTo(mymap);\n      var previousMoveEnd = {\n        latlng: {},\n        zoom: null\n      };\n      var moveCallback = function(event) {\n        var latlng = event.target.getCenter();\n        var zoom = event.target.getZoom();\n        var coordsEqual = (previousMoveEnd.latlng.lat == latlng.lat) && (previousMoveEnd.latlng.lng == latlng.lng);\n        var zoomLevelEqual = previousMoveEnd.zoom == zoom;\n        if (coordsEqual && zoomLevelEqual) {\n          console.warn('coordinates are the same');\n          return;\n        } else {\n          previousMoveEnd.latlng = latlng;\n          previousMoveEnd.zoom = zoom;\n        }\n        updatePoints();\n        fireEvent('move', {\n          coordinates: {\n            latitude: latlng.lat,\n            longitude: latlng.lng\n          },\n          zoomLevel: zoom\n        });\n      };\n      mymap.on('moveend', moveCallback);\n      updatePoints();\n      var mobCallback = function(mob) {\n        console.log('Mob received', mob);\n        var importance = 1 - ((new Date() / 1000) - mob.timestamp) / 7200;\n        if (importance < 0) {\n          return;\n        }\n        var mobMarker = L.circleMarker(mob.coordinates, {\n          fillColor: '#ff0000',\n          color: '#ff0000',\n          opacity: importance,\n          className: 'mobMarker'\n        }).addTo(mobsLayer);\n        mobMarker.setRadius(20 * importance);\n        var clickHandler = fireEvent.bind({}, 'click', mob);\n        mobMarker.on('click', clickHandler);\n      };\n      dataService.configureSocket(socketEndPoint, coordinates, mobCallback);\n    }\n    function fireEvent(eventName, args) {\n      var handlers = eventHandlers[eventName];\n      if (Array.isArray(handlers)) {\n        handlers.map(function(handler) {\n          if (typeof(handler) === 'function') {\n            handler(args);\n          }\n        });\n      }\n    }\n    function on(eventName, callback) {\n      if (!Array.isArray(eventHandlers[eventName])) {\n        eventHandlers[eventName] = [];\n      }\n      eventHandlers[eventName].push(callback);\n    }\n    function off(eventName, callback) {\n      if (!Array.isArray(eventHandlers[eventName])) {\n        return;\n      }\n      var handlers = eventHandlers[eventName];\n      var handlersToRemove = handlers.filter(function(handler) {\n        return callback === handler;\n      });\n      handlersToRemove.map(function(handler) {\n        var index = handlers.indexOf(handler);\n        handlers.splice(index, 1);\n      });\n    }\n    function updatePoints() {\n      filter(options.filter);\n    }\n    function goTo(location) {\n      var coordinates = location.coordinates;\n      var zoomLevel = location.zoomLevel;\n      if (!zoomLevel) {\n        zoomLevel = mymap.getZoom();\n      }\n      mymap.setView([coordinates.latitude, coordinates.longitude], zoomLevel);\n    }\n    function navigate(start, destination) {\n      if (route && route.removeFrom) {\n        route.removeFrom(mymap);\n      }\n      route = L.Routing.control({\n        waypoints: [L.latLng(start.latitude, start.longitude), L.latLng(destination.latitude, destination.longitude)],\n        collapsible: true,\n        geocoder: L.Control.Geocoder.nominatim(),\n        createMarker: function() {\n          return null;\n        }\n      });\n      route.addTo(mymap);\n    }\n    function clearRoutes() {\n      if (route && route.removeFrom) {\n        route.removeFrom(mymap);\n        route = null;\n      }\n    }\n    function filter(filterOptions) {\n      var sightingsSince = filterOptions.sightingsSince;\n      var predictionsUntil = filterOptions.predictionsUntil;\n      var pokemonIds = filterOptions.pokemonIds;\n      dataService.fetchData(sightingsSince, predictionsUntil, function(response) {\n        var filteredPokemons = [];\n        if (pokemonIds && pokemonIds.length) {\n          filteredPokemons = response.data.filter(function(pokemon) {\n            return pokemonIds.indexOf(pokemon.pokemonId) > -1;\n          });\n        } else {\n          filteredPokemons = response.data;\n        }\n        pokemonLayer.clearLayers();\n        filteredPokemons.map(addPokemonMarker);\n      });\n    }\n    function updateTimeRange(timeRange) {\n      self.timeRange = timeRange;\n      updatePoints();\n    }\n    function contructIconUrl(pokemonId) {\n      return dataService.getApiEndpointURL() + '/api/pokemon/id/' + pokemonId + '/icon/gif';\n    }\n    function addPokemonMarker(pokemon) {\n      var iconUrl = contructIconUrl(pokemon.pokemonId);\n      var icon = new PokemonIcon({iconUrl: iconUrl});\n      var coordinates = L.latLng(pokemon.location.coordinates[1], pokemon.location.coordinates[0]);\n      var marker = L.marker(coordinates, {icon: icon});\n      marker.addTo(pokemonLayer).on('click', fireEvent.bind({}, 'click', pokemon));\n      return marker;\n    }\n    initMap();\n  }\n  if (typeof define === 'function' && define.amd) {\n    define([], function() {\n      return PokeMap;\n    });\n  } else if (typeof module === 'object' && module.exports) {\n    module.exports = PokeMap;\n  } else {\n    window.PokeMap = PokeMap;\n  }\n})();\n\n//# sourceURL=C:/Users/PAUL/Documents/PokeMap-1/module/main.js\n},{\"../style.css\":81,\"./DataService.js\":1,\"leaflet\":57,\"leaflet-control-geocoder\":43,\"leaflet-routing-machine\":46,\"leaflet/dist/leaflet.css\":58}],3:[function(require,module,exports){\nmodule.exports = after\n\nfunction after(count, callback, err_cb) {\n    var bail = false\n    err_cb = err_cb || noop\n    proxy.count = count\n\n    return (count === 0) ? callback() : proxy\n\n    function proxy(err, result) {\n        if (proxy.count <= 0) {\n            throw new Error('after called too many times')\n        }\n        --proxy.count\n\n        // after first error, rest are passed to err_cb\n        if (err) {\n            bail = true\n            callback(err)\n            // future error callbacks will go to error handler\n            callback = err_cb\n        } else if (proxy.count === 0 && !bail) {\n            callback(null, result)\n        }\n    }\n}\n\nfunction noop() {}\n\n},{}],4:[function(require,module,exports){\n/**\n * An abstraction for slicing an arraybuffer even when\n * ArrayBuffer.prototype.slice is not supported\n *\n * @api public\n */\n\nmodule.exports = function(arraybuffer, start, end) {\n  var bytes = arraybuffer.byteLength;\n  start = start || 0;\n  end = end || bytes;\n\n  if (arraybuffer.slice) { return arraybuffer.slice(start, end); }\n\n  if (start < 0) { start += bytes; }\n  if (end < 0) { end += bytes; }\n  if (end > bytes) { end = bytes; }\n\n  if (start >= bytes || start >= end || bytes === 0) {\n    return new ArrayBuffer(0);\n  }\n\n  var abv = new Uint8Array(arraybuffer);\n  var result = new Uint8Array(end - start);\n  for (var i = start, ii = 0; i < end; i++, ii++) {\n    result[ii] = abv[i];\n  }\n  return result.buffer;\n};\n\n},{}],5:[function(require,module,exports){\n\n/**\n * Expose `Backoff`.\n */\n\nmodule.exports = Backoff;\n\n/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction Backoff(opts) {\n  opts = opts || {};\n  this.ms = opts.min || 100;\n  this.max = opts.max || 10000;\n  this.factor = opts.factor || 2;\n  this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n  this.attempts = 0;\n}\n\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\n\nBackoff.prototype.duration = function(){\n  var ms = this.ms * Math.pow(this.factor, this.attempts++);\n  if (this.jitter) {\n    var rand =  Math.random();\n    var deviation = Math.floor(rand * this.jitter * ms);\n    ms = (Math.floor(rand * 10) & 1) == 0  ? ms - deviation : ms + deviation;\n  }\n  return Math.min(ms, this.max) | 0;\n};\n\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\n\nBackoff.prototype.reset = function(){\n  this.attempts = 0;\n};\n\n/**\n * Set the minimum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMin = function(min){\n  this.ms = min;\n};\n\n/**\n * Set the maximum duration\n *\n * @api public\n */\n\nBackoff.prototype.setMax = function(max){\n  this.max = max;\n};\n\n/**\n * Set the jitter\n *\n * @api public\n */\n\nBackoff.prototype.setJitter = function(jitter){\n  this.jitter = jitter;\n};\n\n\n},{}],6:[function(require,module,exports){\n/*\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n(function(){\n  \"use strict\";\n\n  var chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n  // Use a lookup table to find the index.\n  var lookup = new Uint8Array(256);\n  for (var i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n  }\n\n  exports.encode = function(arraybuffer) {\n    var bytes = new Uint8Array(arraybuffer),\n    i, len = bytes.length, base64 = \"\";\n\n    for (i = 0; i < len; i+=3) {\n      base64 += chars[bytes[i] >> 2];\n      base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n      base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n      base64 += chars[bytes[i + 2] & 63];\n    }\n\n    if ((len % 3) === 2) {\n      base64 = base64.substring(0, base64.length - 1) + \"=\";\n    } else if (len % 3 === 1) {\n      base64 = base64.substring(0, base64.length - 2) + \"==\";\n    }\n\n    return base64;\n  };\n\n  exports.decode =  function(base64) {\n    var bufferLength = base64.length * 0.75,\n    len = base64.length, i, p = 0,\n    encoded1, encoded2, encoded3, encoded4;\n\n    if (base64[base64.length - 1] === \"=\") {\n      bufferLength--;\n      if (base64[base64.length - 2] === \"=\") {\n        bufferLength--;\n      }\n    }\n\n    var arraybuffer = new ArrayBuffer(bufferLength),\n    bytes = new Uint8Array(arraybuffer);\n\n    for (i = 0; i < len; i+=4) {\n      encoded1 = lookup[base64.charCodeAt(i)];\n      encoded2 = lookup[base64.charCodeAt(i+1)];\n      encoded3 = lookup[base64.charCodeAt(i+2)];\n      encoded4 = lookup[base64.charCodeAt(i+3)];\n\n      bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n      bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n      bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n\n    return arraybuffer;\n  };\n})();\n\n},{}],7:[function(require,module,exports){\n(function (global){\n/**\n * Create a blob builder even when vendor prefixes exist\n */\n\nvar BlobBuilder = global.BlobBuilder\n  || global.WebKitBlobBuilder\n  || global.MSBlobBuilder\n  || global.MozBlobBuilder;\n\n/**\n * Check if Blob constructor is supported\n */\n\nvar blobSupported = (function() {\n  try {\n    var a = new Blob(['hi']);\n    return a.size === 2;\n  } catch(e) {\n    return false;\n  }\n})();\n\n/**\n * Check if Blob constructor supports ArrayBufferViews\n * Fails in Safari 6, so we need to map to ArrayBuffers there.\n */\n\nvar blobSupportsArrayBufferView = blobSupported && (function() {\n  try {\n    var b = new Blob([new Uint8Array([1,2])]);\n    return b.size === 2;\n  } catch(e) {\n    return false;\n  }\n})();\n\n/**\n * Check if BlobBuilder is supported\n */\n\nvar blobBuilderSupported = BlobBuilder\n  && BlobBuilder.prototype.append\n  && BlobBuilder.prototype.getBlob;\n\n/**\n * Helper function that maps ArrayBufferViews to ArrayBuffers\n * Used by BlobBuilder constructor and old browsers that didn't\n * support it in the Blob constructor.\n */\n\nfunction mapArrayBufferViews(ary) {\n  for (var i = 0; i < ary.length; i++) {\n    var chunk = ary[i];\n    if (chunk.buffer instanceof ArrayBuffer) {\n      var buf = chunk.buffer;\n\n      // if this is a subarray, make a copy so we only\n      // include the subarray region from the underlying buffer\n      if (chunk.byteLength !== buf.byteLength) {\n        var copy = new Uint8Array(chunk.byteLength);\n        copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));\n        buf = copy.buffer;\n      }\n\n      ary[i] = buf;\n    }\n  }\n}\n\nfunction BlobBuilderConstructor(ary, options) {\n  options = options || {};\n\n  var bb = new BlobBuilder();\n  mapArrayBufferViews(ary);\n\n  for (var i = 0; i < ary.length; i++) {\n    bb.append(ary[i]);\n  }\n\n  return (options.type) ? bb.getBlob(options.type) : bb.getBlob();\n};\n\nfunction BlobConstructor(ary, options) {\n  mapArrayBufferViews(ary);\n  return new Blob(ary, options || {});\n};\n\nmodule.exports = (function() {\n  if (blobSupported) {\n    return blobSupportsArrayBufferView ? global.Blob : BlobConstructor;\n  } else if (blobBuilderSupported) {\n    return BlobBuilderConstructor;\n  } else {\n    return undefined;\n  }\n})();\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],8:[function(require,module,exports){\n\n},{}],9:[function(require,module,exports){\n'use strict';\n// For more information about browser field, check out the browser field at https://github.com/substack/browserify-handbook#browser-field.\n\nvar styleElementsInsertedAtTop = [];\n\nvar insertStyleElement = function(styleElement, options) {\n    var head = document.head || document.getElementsByTagName('head')[0];\n    var lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1];\n\n    options = options || {};\n    options.insertAt = options.insertAt || 'bottom';\n\n    if (options.insertAt === 'top') {\n        if (!lastStyleElementInsertedAtTop) {\n            head.insertBefore(styleElement, head.firstChild);\n        } else if (lastStyleElementInsertedAtTop.nextSibling) {\n            head.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling);\n        } else {\n            head.appendChild(styleElement);\n        }\n        styleElementsInsertedAtTop.push(styleElement);\n    } else if (options.insertAt === 'bottom') {\n        head.appendChild(styleElement);\n    } else {\n        throw new Error('Invalid value for parameter \\'insertAt\\'. Must be \\'top\\' or \\'bottom\\'.');\n    }\n};\n\nmodule.exports = {\n    // Create a <link> tag with optional data attributes\n    createLink: function(href, attributes) {\n        var head = document.head || document.getElementsByTagName('head')[0];\n        var link = document.createElement('link');\n\n        link.href = href;\n        link.rel = 'stylesheet';\n\n        for (var key in attributes) {\n            if ( ! attributes.hasOwnProperty(key)) {\n                continue;\n            }\n            var value = attributes[key];\n            link.setAttribute('data-' + key, value);\n        }\n\n        head.appendChild(link);\n    },\n    // Create a <style> tag with optional data attributes\n    createStyle: function(cssText, attributes, extraOptions) {\n        extraOptions = extraOptions || {};\n\n        var style = document.createElement('style');\n        style.type = 'text/css';\n\n        for (var key in attributes) {\n            if ( ! attributes.hasOwnProperty(key)) {\n                continue;\n            }\n            var value = attributes[key];\n            style.setAttribute('data-' + key, value);\n        }\n\n        if (style.sheet) { // for jsdom and IE9+\n            style.innerHTML = cssText;\n            style.sheet.cssText = cssText;\n            insertStyleElement(style, { insertAt: extraOptions.insertAt });\n        } else if (style.styleSheet) { // for IE8 and below\n            insertStyleElement(style, { insertAt: extraOptions.insertAt });\n            style.styleSheet.cssText = cssText;\n        } else { // for Chrome, Firefox, and Safari\n            style.appendChild(document.createTextNode(cssText));\n            insertStyleElement(style, { insertAt: extraOptions.insertAt });\n        }\n    }\n};\n\n},{}],10:[function(require,module,exports){\n/**\n * Slice reference.\n */\n\nvar slice = [].slice;\n\n/**\n * Bind `obj` to `fn`.\n *\n * @param {Object} obj\n * @param {Function|String} fn or string\n * @return {Function}\n * @api public\n */\n\nmodule.exports = function(obj, fn){\n  if ('string' == typeof fn) fn = obj[fn];\n  if ('function' != typeof fn) throw new Error('bind() requires a function');\n  var args = slice.call(arguments, 2);\n  return function(){\n    return fn.apply(obj, args.concat(slice.call(arguments)));\n  }\n};\n\n},{}],11:[function(require,module,exports){\n\r\n/**\r\n * Expose `Emitter`.\r\n */\r\n\r\nif (typeof module !== 'undefined') {\r\n  module.exports = Emitter;\r\n}\r\n\r\n/**\r\n * Initialize a new `Emitter`.\r\n *\r\n * @api public\r\n */\r\n\r\nfunction Emitter(obj) {\r\n  if (obj) return mixin(obj);\r\n};\r\n\r\n/**\r\n * Mixin the emitter properties.\r\n *\r\n * @param {Object} obj\r\n * @return {Object}\r\n * @api private\r\n */\r\n\r\nfunction mixin(obj) {\r\n  for (var key in Emitter.prototype) {\r\n    obj[key] = Emitter.prototype[key];\r\n  }\r\n  return obj;\r\n}\r\n\r\n/**\r\n * Listen on the given `event` with `fn`.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.on =\r\nEmitter.prototype.addEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n  (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\r\n    .push(fn);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Adds an `event` listener that will be invoked a single\r\n * time then automatically removed.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.once = function(event, fn){\r\n  function on() {\r\n    this.off(event, on);\r\n    fn.apply(this, arguments);\r\n  }\r\n\r\n  on.fn = fn;\r\n  this.on(event, on);\r\n  return this;\r\n};\r\n\r\n/**\r\n * Remove the given callback for `event` or all\r\n * registered callbacks.\r\n *\r\n * @param {String} event\r\n * @param {Function} fn\r\n * @return {Emitter}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.off =\r\nEmitter.prototype.removeListener =\r\nEmitter.prototype.removeAllListeners =\r\nEmitter.prototype.removeEventListener = function(event, fn){\r\n  this._callbacks = this._callbacks || {};\r\n\r\n  // all\r\n  if (0 == arguments.length) {\r\n    this._callbacks = {};\r\n    return this;\r\n  }\r\n\r\n  // specific event\r\n  var callbacks = this._callbacks['$' + event];\r\n  if (!callbacks) return this;\r\n\r\n  // remove all handlers\r\n  if (1 == arguments.length) {\r\n    delete this._callbacks['$' + event];\r\n    return this;\r\n  }\r\n\r\n  // remove specific handler\r\n  var cb;\r\n  for (var i = 0; i < callbacks.length; i++) {\r\n    cb = callbacks[i];\r\n    if (cb === fn || cb.fn === fn) {\r\n      callbacks.splice(i, 1);\r\n      break;\r\n    }\r\n  }\r\n  return this;\r\n};\r\n\r\n/**\r\n * Emit `event` with the given args.\r\n *\r\n * @param {String} event\r\n * @param {Mixed} ...\r\n * @return {Emitter}\r\n */\r\n\r\nEmitter.prototype.emit = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  var args = [].slice.call(arguments, 1)\r\n    , callbacks = this._callbacks['$' + event];\r\n\r\n  if (callbacks) {\r\n    callbacks = callbacks.slice(0);\r\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\r\n      callbacks[i].apply(this, args);\r\n    }\r\n  }\r\n\r\n  return this;\r\n};\r\n\r\n/**\r\n * Return array of callbacks for `event`.\r\n *\r\n * @param {String} event\r\n * @return {Array}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.listeners = function(event){\r\n  this._callbacks = this._callbacks || {};\r\n  return this._callbacks['$' + event] || [];\r\n};\r\n\r\n/**\r\n * Check if this emitter has `event` handlers.\r\n *\r\n * @param {String} event\r\n * @return {Boolean}\r\n * @api public\r\n */\r\n\r\nEmitter.prototype.hasListeners = function(event){\r\n  return !! this.listeners(event).length;\r\n};\r\n\n},{}],12:[function(require,module,exports){\n\nmodule.exports = function(a, b){\n  var fn = function(){};\n  fn.prototype = b.prototype;\n  a.prototype = new fn;\n  a.prototype.constructor = a;\n};\n},{}],13:[function(require,module,exports){\nfunction corslite(url, callback, cors) {\n    var sent = false;\n\n    if (typeof window.XMLHttpRequest === 'undefined') {\n        return callback(Error('Browser not supported'));\n    }\n\n    if (typeof cors === 'undefined') {\n        var m = url.match(/^\\s*https?:\\/\\/[^\\/]*/);\n        cors = m && (m[0] !== location.protocol + '//' + location.domain +\n                (location.port ? ':' + location.port : ''));\n    }\n\n    var x = new window.XMLHttpRequest();\n\n    function isSuccessful(status) {\n        return status >= 200 && status < 300 || status === 304;\n    }\n\n    if (cors && !('withCredentials' in x)) {\n        // IE8-9\n        x = new window.XDomainRequest();\n\n        // Ensure callback is never called synchronously, i.e., before\n        // x.send() returns (this has been observed in the wild).\n        // See https://github.com/mapbox/mapbox.js/issues/472\n        var original = callback;\n        callback = function() {\n            if (sent) {\n                original.apply(this, arguments);\n            } else {\n                var that = this, args = arguments;\n                setTimeout(function() {\n                    original.apply(that, args);\n                }, 0);\n            }\n        }\n    }\n\n    function loaded() {\n        if (\n            // XDomainRequest\n            x.status === undefined ||\n            // modern browsers\n            isSuccessful(x.status)) callback.call(x, null, x);\n        else callback.call(x, x, null);\n    }\n\n    // Both `onreadystatechange` and `onload` can fire. `onreadystatechange`\n    // has [been supported for longer](http://stackoverflow.com/a/9181508/229001).\n    if ('onload' in x) {\n        x.onload = loaded;\n    } else {\n        x.onreadystatechange = function readystate() {\n            if (x.readyState === 4) {\n                loaded();\n            }\n        };\n    }\n\n    // Call the callback with the XMLHttpRequest object as an error and prevent\n    // it from ever being called again by reassigning it to `noop`\n    x.onerror = function error(evt) {\n        // XDomainRequest provides no evt parameter\n        callback.call(this, evt || true, null);\n        callback = function() { };\n    };\n\n    // IE9 must have onprogress be set to a unique function.\n    x.onprogress = function() { };\n\n    x.ontimeout = function(evt) {\n        callback.call(this, evt, null);\n        callback = function() { };\n    };\n\n    x.onabort = function(evt) {\n        callback.call(this, evt, null);\n        callback = function() { };\n    };\n\n    // GET is the only supported HTTP Verb by XDomainRequest and is the\n    // only one supported here.\n    x.open('GET', url, true);\n\n    // Send the request. Sending data is not supported.\n    x.send(null);\n    sent = true;\n\n    return x;\n}\n\nif (typeof module !== 'undefined') module.exports = corslite;\n\n},{}],14:[function(require,module,exports){\n(function (process){\n\n/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n               && 'undefined' != typeof chrome.storage\n                  ? chrome.storage.local\n                  : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n  'lightseagreen',\n  'forestgreen',\n  'goldenrod',\n  'dodgerblue',\n  'darkorchid',\n  'crimson'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n  // is webkit? http://stackoverflow.com/a/16459606/376773\n  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n  return (typeof document !== 'undefined' && 'WebkitAppearance' in document.documentElement.style) ||\n    // is firebug? http://stackoverflow.com/a/398120/376773\n    (window.console && (console.firebug || (console.exception && console.table))) ||\n    // is firefox >= v31?\n    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n    (navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31);\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n  try {\n    return JSON.stringify(v);\n  } catch (err) {\n    return '[UnexpectedJSONParseError]: ' + err.message;\n  }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs() {\n  var args = arguments;\n  var useColors = this.useColors;\n\n  args[0] = (useColors ? '%c' : '')\n    + this.namespace\n    + (useColors ? ' %c' : ' ')\n    + args[0]\n    + (useColors ? '%c ' : ' ')\n    + '+' + exports.humanize(this.diff);\n\n  if (!useColors) return args;\n\n  var c = 'color: ' + this.color;\n  args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1));\n\n  // the final \"%c\" is somewhat tricky, because there could be other\n  // arguments passed either before or after the %c, so we need to\n  // figure out the correct index to insert the CSS into\n  var index = 0;\n  var lastC = 0;\n  args[0].replace(/%[a-z%]/g, function(match) {\n    if ('%%' === match) return;\n    index++;\n    if ('%c' === match) {\n      // we only are interested in the *last* %c\n      // (the user may have provided their own)\n      lastC = index;\n    }\n  });\n\n  args.splice(lastC, 0, c);\n  return args;\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n  // this hackery is required for IE8/9, where\n  // the `console.log` function doesn't have 'apply'\n  return 'object' === typeof console\n    && console.log\n    && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n  try {\n    if (null == namespaces) {\n      exports.storage.removeItem('debug');\n    } else {\n      exports.storage.debug = namespaces;\n    }\n  } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n  var r;\n  try {\n    return exports.storage.debug;\n  } catch(e) {}\n\n  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n  if (typeof process !== 'undefined' && 'env' in process) {\n    return process.env.DEBUG;\n  }\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage(){\n  try {\n    return window.localStorage;\n  } catch (e) {}\n}\n\n}).call(this,require('_process'))\n},{\"./debug\":15,\"_process\":64}],15:[function(require,module,exports){\n\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = debug.debug = debug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lowercased letter, i.e. \"n\".\n */\n\nexports.formatters = {};\n\n/**\n * Previously assigned color.\n */\n\nvar prevColor = 0;\n\n/**\n * Previous log timestamp.\n */\n\nvar prevTime;\n\n/**\n * Select a color.\n *\n * @return {Number}\n * @api private\n */\n\nfunction selectColor() {\n  return exports.colors[prevColor++ % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction debug(namespace) {\n\n  // define the `disabled` version\n  function disabled() {\n  }\n  disabled.enabled = false;\n\n  // define the `enabled` version\n  function enabled() {\n\n    var self = enabled;\n\n    // set `diff` timestamp\n    var curr = +new Date();\n    var ms = curr - (prevTime || curr);\n    self.diff = ms;\n    self.prev = prevTime;\n    self.curr = curr;\n    prevTime = curr;\n\n    // add the `color` if not set\n    if (null == self.useColors) self.useColors = exports.useColors();\n    if (null == self.color && self.useColors) self.color = selectColor();\n\n    var args = new Array(arguments.length);\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i];\n    }\n\n    args[0] = exports.coerce(args[0]);\n\n    if ('string' !== typeof args[0]) {\n      // anything else let's inspect with %o\n      args = ['%o'].concat(args);\n    }\n\n    // apply any `formatters` transformations\n    var index = 0;\n    args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {\n      // if we encounter an escaped % then don't increase the array index\n      if (match === '%%') return match;\n      index++;\n      var formatter = exports.formatters[format];\n      if ('function' === typeof formatter) {\n        var val = args[index];\n        match = formatter.call(self, val);\n\n        // now we need to remove `args[index]` since it's inlined in the `format`\n        args.splice(index, 1);\n        index--;\n      }\n      return match;\n    });\n\n    // apply env-specific formatting\n    args = exports.formatArgs.apply(self, args);\n\n    var logFn = enabled.log || exports.log || console.log.bind(console);\n    logFn.apply(self, args);\n  }\n  enabled.enabled = true;\n\n  var fn = exports.enabled(namespace) ? enabled : disabled;\n\n  fn.namespace = namespace;\n\n  return fn;\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n  exports.save(namespaces);\n\n  var split = (namespaces || '').split(/[\\s,]+/);\n  var len = split.length;\n\n  for (var i = 0; i < len; i++) {\n    if (!split[i]) continue; // ignore empty strings\n    namespaces = split[i].replace(/[\\\\^$+?.()|[\\]{}]/g, '\\\\$&').replace(/\\*/g, '.*?');\n    if (namespaces[0] === '-') {\n      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n    } else {\n      exports.names.push(new RegExp('^' + namespaces + '$'));\n    }\n  }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n  exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n  var i, len;\n  for (i = 0, len = exports.skips.length; i < len; i++) {\n    if (exports.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (i = 0, len = exports.names.length; i < len; i++) {\n    if (exports.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n\n},{\"ms\":59}],16:[function(require,module,exports){\n\nmodule.exports = require('./lib/index');\n\n},{\"./lib/index\":17}],17:[function(require,module,exports){\n\nmodule.exports = require('./socket');\n\n/**\n * Exports parser\n *\n * @api public\n *\n */\nmodule.exports.parser = require('engine.io-parser');\n\n},{\"./socket\":18,\"engine.io-parser\":26}],18:[function(require,module,exports){\n(function (global){\n/**\n * Module dependencies.\n */\n\nvar transports = require('./transports/index');\nvar Emitter = require('component-emitter');\nvar debug = require('debug')('engine.io-client:socket');\nvar index = require('indexof');\nvar parser = require('engine.io-parser');\nvar parseuri = require('parseuri');\nvar parsejson = require('parsejson');\nvar parseqs = require('parseqs');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Socket;\n\n/**\n * Socket constructor.\n *\n * @param {String|Object} uri or options\n * @param {Object} options\n * @api public\n */\n\nfunction Socket (uri, opts) {\n  if (!(this instanceof Socket)) return new Socket(uri, opts);\n\n  opts = opts || {};\n\n  if (uri && 'object' === typeof uri) {\n    opts = uri;\n    uri = null;\n  }\n\n  if (uri) {\n    uri = parseuri(uri);\n    opts.hostname = uri.host;\n    opts.secure = uri.protocol === 'https' || uri.protocol === 'wss';\n    opts.port = uri.port;\n    if (uri.query) opts.query = uri.query;\n  } else if (opts.host) {\n    opts.hostname = parseuri(opts.host).host;\n  }\n\n  this.secure = null != opts.secure ? opts.secure\n    : (global.location && 'https:' === location.protocol);\n\n  if (opts.hostname && !opts.port) {\n    // if no port is specified manually, use the protocol default\n    opts.port = this.secure ? '443' : '80';\n  }\n\n  this.agent = opts.agent || false;\n  this.hostname = opts.hostname ||\n    (global.location ? location.hostname : 'localhost');\n  this.port = opts.port || (global.location && location.port\n      ? location.port\n      : (this.secure ? 443 : 80));\n  this.query = opts.query || {};\n  if ('string' === typeof this.query) this.query = parseqs.decode(this.query);\n  this.upgrade = false !== opts.upgrade;\n  this.path = (opts.path || '/engine.io').replace(/\\/$/, '') + '/';\n  this.forceJSONP = !!opts.forceJSONP;\n  this.jsonp = false !== opts.jsonp;\n  this.forceBase64 = !!opts.forceBase64;\n  this.enablesXDR = !!opts.enablesXDR;\n  this.timestampParam = opts.timestampParam || 't';\n  this.timestampRequests = opts.timestampRequests;\n  this.transports = opts.transports || ['polling', 'websocket'];\n  this.readyState = '';\n  this.writeBuffer = [];\n  this.prevBufferLen = 0;\n  this.policyPort = opts.policyPort || 843;\n  this.rememberUpgrade = opts.rememberUpgrade || false;\n  this.binaryType = null;\n  this.onlyBinaryUpgrades = opts.onlyBinaryUpgrades;\n  this.perMessageDeflate = false !== opts.perMessageDeflate ? (opts.perMessageDeflate || {}) : false;\n\n  if (true === this.perMessageDeflate) this.perMessageDeflate = {};\n  if (this.perMessageDeflate && null == this.perMessageDeflate.threshold) {\n    this.perMessageDeflate.threshold = 1024;\n  }\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx || null;\n  this.key = opts.key || null;\n  this.passphrase = opts.passphrase || null;\n  this.cert = opts.cert || null;\n  this.ca = opts.ca || null;\n  this.ciphers = opts.ciphers || null;\n  this.rejectUnauthorized = opts.rejectUnauthorized === undefined ? null : opts.rejectUnauthorized;\n  this.forceNode = !!opts.forceNode;\n\n  // other options for Node.js client\n  var freeGlobal = typeof global === 'object' && global;\n  if (freeGlobal.global === freeGlobal) {\n    if (opts.extraHeaders && Object.keys(opts.extraHeaders).length > 0) {\n      this.extraHeaders = opts.extraHeaders;\n    }\n\n    if (opts.localAddress) {\n      this.localAddress = opts.localAddress;\n    }\n  }\n\n  // set on handshake\n  this.id = null;\n  this.upgrades = null;\n  this.pingInterval = null;\n  this.pingTimeout = null;\n\n  // set on heartbeat\n  this.pingIntervalTimer = null;\n  this.pingTimeoutTimer = null;\n\n  this.open();\n}\n\nSocket.priorWebsocketSuccess = false;\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nSocket.protocol = parser.protocol; // this is an int\n\n/**\n * Expose deps for legacy compatibility\n * and standalone browser access.\n */\n\nSocket.Socket = Socket;\nSocket.Transport = require('./transport');\nSocket.transports = require('./transports/index');\nSocket.parser = require('engine.io-parser');\n\n/**\n * Creates transport of the given type.\n *\n * @param {String} transport name\n * @return {Transport}\n * @api private\n */\n\nSocket.prototype.createTransport = function (name) {\n  debug('creating transport \"%s\"', name);\n  var query = clone(this.query);\n\n  // append engine.io protocol identifier\n  query.EIO = parser.protocol;\n\n  // transport name\n  query.transport = name;\n\n  // session id if we already have one\n  if (this.id) query.sid = this.id;\n\n  var transport = new transports[name]({\n    agent: this.agent,\n    hostname: this.hostname,\n    port: this.port,\n    secure: this.secure,\n    path: this.path,\n    query: query,\n    forceJSONP: this.forceJSONP,\n    jsonp: this.jsonp,\n    forceBase64: this.forceBase64,\n    enablesXDR: this.enablesXDR,\n    timestampRequests: this.timestampRequests,\n    timestampParam: this.timestampParam,\n    policyPort: this.policyPort,\n    socket: this,\n    pfx: this.pfx,\n    key: this.key,\n    passphrase: this.passphrase,\n    cert: this.cert,\n    ca: this.ca,\n    ciphers: this.ciphers,\n    rejectUnauthorized: this.rejectUnauthorized,\n    perMessageDeflate: this.perMessageDeflate,\n    extraHeaders: this.extraHeaders,\n    forceNode: this.forceNode,\n    localAddress: this.localAddress\n  });\n\n  return transport;\n};\n\nfunction clone (obj) {\n  var o = {};\n  for (var i in obj) {\n    if (obj.hasOwnProperty(i)) {\n      o[i] = obj[i];\n    }\n  }\n  return o;\n}\n\n/**\n * Initializes transport to use and starts probe.\n *\n * @api private\n */\nSocket.prototype.open = function () {\n  var transport;\n  if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') !== -1) {\n    transport = 'websocket';\n  } else if (0 === this.transports.length) {\n    // Emit error on next tick so it can be listened to\n    var self = this;\n    setTimeout(function () {\n      self.emit('error', 'No transports available');\n    }, 0);\n    return;\n  } else {\n    transport = this.transports[0];\n  }\n  this.readyState = 'opening';\n\n  // Retry with the next transport if the transport is disabled (jsonp: false)\n  try {\n    transport = this.createTransport(transport);\n  } catch (e) {\n    this.transports.shift();\n    this.open();\n    return;\n  }\n\n  transport.open();\n  this.setTransport(transport);\n};\n\n/**\n * Sets the current transport. Disables the existing one (if any).\n *\n * @api private\n */\n\nSocket.prototype.setTransport = function (transport) {\n  debug('setting transport %s', transport.name);\n  var self = this;\n\n  if (this.transport) {\n    debug('clearing existing transport %s', this.transport.name);\n    this.transport.removeAllListeners();\n  }\n\n  // set up transport\n  this.transport = transport;\n\n  // set up transport listeners\n  transport\n  .on('drain', function () {\n    self.onDrain();\n  })\n  .on('packet', function (packet) {\n    self.onPacket(packet);\n  })\n  .on('error', function (e) {\n    self.onError(e);\n  })\n  .on('close', function () {\n    self.onClose('transport close');\n  });\n};\n\n/**\n * Probes a transport.\n *\n * @param {String} transport name\n * @api private\n */\n\nSocket.prototype.probe = function (name) {\n  debug('probing transport \"%s\"', name);\n  var transport = this.createTransport(name, { probe: 1 });\n  var failed = false;\n  var self = this;\n\n  Socket.priorWebsocketSuccess = false;\n\n  function onTransportOpen () {\n    if (self.onlyBinaryUpgrades) {\n      var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary;\n      failed = failed || upgradeLosesBinary;\n    }\n    if (failed) return;\n\n    debug('probe transport \"%s\" opened', name);\n    transport.send([{ type: 'ping', data: 'probe' }]);\n    transport.once('packet', function (msg) {\n      if (failed) return;\n      if ('pong' === msg.type && 'probe' === msg.data) {\n        debug('probe transport \"%s\" pong', name);\n        self.upgrading = true;\n        self.emit('upgrading', transport);\n        if (!transport) return;\n        Socket.priorWebsocketSuccess = 'websocket' === transport.name;\n\n        debug('pausing current transport \"%s\"', self.transport.name);\n        self.transport.pause(function () {\n          if (failed) return;\n          if ('closed' === self.readyState) return;\n          debug('changing transport and sending upgrade packet');\n\n          cleanup();\n\n          self.setTransport(transport);\n          transport.send([{ type: 'upgrade' }]);\n          self.emit('upgrade', transport);\n          transport = null;\n          self.upgrading = false;\n          self.flush();\n        });\n      } else {\n        debug('probe transport \"%s\" failed', name);\n        var err = new Error('probe error');\n        err.transport = transport.name;\n        self.emit('upgradeError', err);\n      }\n    });\n  }\n\n  function freezeTransport () {\n    if (failed) return;\n\n    // Any callback called by transport should be ignored since now\n    failed = true;\n\n    cleanup();\n\n    transport.close();\n    transport = null;\n  }\n\n  // Handle any error that happens while probing\n  function onerror (err) {\n    var error = new Error('probe error: ' + err);\n    error.transport = transport.name;\n\n    freezeTransport();\n\n    debug('probe transport \"%s\" failed because of error: %s', name, err);\n\n    self.emit('upgradeError', error);\n  }\n\n  function onTransportClose () {\n    onerror('transport closed');\n  }\n\n  // When the socket is closed while we're probing\n  function onclose () {\n    onerror('socket closed');\n  }\n\n  // When the socket is upgraded while we're probing\n  function onupgrade (to) {\n    if (transport && to.name !== transport.name) {\n      debug('\"%s\" works - aborting \"%s\"', to.name, transport.name);\n      freezeTransport();\n    }\n  }\n\n  // Remove all listeners on the transport and on self\n  function cleanup () {\n    transport.removeListener('open', onTransportOpen);\n    transport.removeListener('error', onerror);\n    transport.removeListener('close', onTransportClose);\n    self.removeListener('close', onclose);\n    self.removeListener('upgrading', onupgrade);\n  }\n\n  transport.once('open', onTransportOpen);\n  transport.once('error', onerror);\n  transport.once('close', onTransportClose);\n\n  this.once('close', onclose);\n  this.once('upgrading', onupgrade);\n\n  transport.open();\n};\n\n/**\n * Called when connection is deemed open.\n *\n * @api public\n */\n\nSocket.prototype.onOpen = function () {\n  debug('socket open');\n  this.readyState = 'open';\n  Socket.priorWebsocketSuccess = 'websocket' === this.transport.name;\n  this.emit('open');\n  this.flush();\n\n  // we check for `readyState` in case an `open`\n  // listener already closed the socket\n  if ('open' === this.readyState && this.upgrade && this.transport.pause) {\n    debug('starting upgrade probes');\n    for (var i = 0, l = this.upgrades.length; i < l; i++) {\n      this.probe(this.upgrades[i]);\n    }\n  }\n};\n\n/**\n * Handles a packet.\n *\n * @api private\n */\n\nSocket.prototype.onPacket = function (packet) {\n  if ('opening' === this.readyState || 'open' === this.readyState ||\n      'closing' === this.readyState) {\n    debug('socket receive: type \"%s\", data \"%s\"', packet.type, packet.data);\n\n    this.emit('packet', packet);\n\n    // Socket is live - any packet counts\n    this.emit('heartbeat');\n\n    switch (packet.type) {\n      case 'open':\n        this.onHandshake(parsejson(packet.data));\n        break;\n\n      case 'pong':\n        this.setPing();\n        this.emit('pong');\n        break;\n\n      case 'error':\n        var err = new Error('server error');\n        err.code = packet.data;\n        this.onError(err);\n        break;\n\n      case 'message':\n        this.emit('data', packet.data);\n        this.emit('message', packet.data);\n        break;\n    }\n  } else {\n    debug('packet received with socket readyState \"%s\"', this.readyState);\n  }\n};\n\n/**\n * Called upon handshake completion.\n *\n * @param {Object} handshake obj\n * @api private\n */\n\nSocket.prototype.onHandshake = function (data) {\n  this.emit('handshake', data);\n  this.id = data.sid;\n  this.transport.query.sid = data.sid;\n  this.upgrades = this.filterUpgrades(data.upgrades);\n  this.pingInterval = data.pingInterval;\n  this.pingTimeout = data.pingTimeout;\n  this.onOpen();\n  // In case open handler closes socket\n  if ('closed' === this.readyState) return;\n  this.setPing();\n\n  // Prolong liveness of socket on heartbeat\n  this.removeListener('heartbeat', this.onHeartbeat);\n  this.on('heartbeat', this.onHeartbeat);\n};\n\n/**\n * Resets ping timeout.\n *\n * @api private\n */\n\nSocket.prototype.onHeartbeat = function (timeout) {\n  clearTimeout(this.pingTimeoutTimer);\n  var self = this;\n  self.pingTimeoutTimer = setTimeout(function () {\n    if ('closed' === self.readyState) return;\n    self.onClose('ping timeout');\n  }, timeout || (self.pingInterval + self.pingTimeout));\n};\n\n/**\n * Pings server every `this.pingInterval` and expects response\n * within `this.pingTimeout` or closes connection.\n *\n * @api private\n */\n\nSocket.prototype.setPing = function () {\n  var self = this;\n  clearTimeout(self.pingIntervalTimer);\n  self.pingIntervalTimer = setTimeout(function () {\n    debug('writing ping packet - expecting pong within %sms', self.pingTimeout);\n    self.ping();\n    self.onHeartbeat(self.pingTimeout);\n  }, self.pingInterval);\n};\n\n/**\n* Sends a ping packet.\n*\n* @api private\n*/\n\nSocket.prototype.ping = function () {\n  var self = this;\n  this.sendPacket('ping', function () {\n    self.emit('ping');\n  });\n};\n\n/**\n * Called on `drain` event\n *\n * @api private\n */\n\nSocket.prototype.onDrain = function () {\n  this.writeBuffer.splice(0, this.prevBufferLen);\n\n  // setting prevBufferLen = 0 is very important\n  // for example, when upgrading, upgrade packet is sent over,\n  // and a nonzero prevBufferLen could cause problems on `drain`\n  this.prevBufferLen = 0;\n\n  if (0 === this.writeBuffer.length) {\n    this.emit('drain');\n  } else {\n    this.flush();\n  }\n};\n\n/**\n * Flush write buffers.\n *\n * @api private\n */\n\nSocket.prototype.flush = function () {\n  if ('closed' !== this.readyState && this.transport.writable &&\n    !this.upgrading && this.writeBuffer.length) {\n    debug('flushing %d packets in socket', this.writeBuffer.length);\n    this.transport.send(this.writeBuffer);\n    // keep track of current length of writeBuffer\n    // splice writeBuffer and callbackBuffer on `drain`\n    this.prevBufferLen = this.writeBuffer.length;\n    this.emit('flush');\n  }\n};\n\n/**\n * Sends a message.\n *\n * @param {String} message.\n * @param {Function} callback function.\n * @param {Object} options.\n * @return {Socket} for chaining.\n * @api public\n */\n\nSocket.prototype.write =\nSocket.prototype.send = function (msg, options, fn) {\n  this.sendPacket('message', msg, options, fn);\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {String} packet type.\n * @param {String} data.\n * @param {Object} options.\n * @param {Function} callback function.\n * @api private\n */\n\nSocket.prototype.sendPacket = function (type, data, options, fn) {\n  if ('function' === typeof data) {\n    fn = data;\n    data = undefined;\n  }\n\n  if ('function' === typeof options) {\n    fn = options;\n    options = null;\n  }\n\n  if ('closing' === this.readyState || 'closed' === this.readyState) {\n    return;\n  }\n\n  options = options || {};\n  options.compress = false !== options.compress;\n\n  var packet = {\n    type: type,\n    data: data,\n    options: options\n  };\n  this.emit('packetCreate', packet);\n  this.writeBuffer.push(packet);\n  if (fn) this.once('flush', fn);\n  this.flush();\n};\n\n/**\n * Closes the connection.\n *\n * @api private\n */\n\nSocket.prototype.close = function () {\n  if ('opening' === this.readyState || 'open' === this.readyState) {\n    this.readyState = 'closing';\n\n    var self = this;\n\n    if (this.writeBuffer.length) {\n      this.once('drain', function () {\n        if (this.upgrading) {\n          waitForUpgrade();\n        } else {\n          close();\n        }\n      });\n    } else if (this.upgrading) {\n      waitForUpgrade();\n    } else {\n      close();\n    }\n  }\n\n  function close () {\n    self.onClose('forced close');\n    debug('socket closing - telling transport to close');\n    self.transport.close();\n  }\n\n  function cleanupAndClose () {\n    self.removeListener('upgrade', cleanupAndClose);\n    self.removeListener('upgradeError', cleanupAndClose);\n    close();\n  }\n\n  function waitForUpgrade () {\n    // wait for upgrade to finish since we can't send packets while pausing a transport\n    self.once('upgrade', cleanupAndClose);\n    self.once('upgradeError', cleanupAndClose);\n  }\n\n  return this;\n};\n\n/**\n * Called upon transport error\n *\n * @api private\n */\n\nSocket.prototype.onError = function (err) {\n  debug('socket error %j', err);\n  Socket.priorWebsocketSuccess = false;\n  this.emit('error', err);\n  this.onClose('transport error', err);\n};\n\n/**\n * Called upon transport close.\n *\n * @api private\n */\n\nSocket.prototype.onClose = function (reason, desc) {\n  if ('opening' === this.readyState || 'open' === this.readyState || 'closing' === this.readyState) {\n    debug('socket close with reason: \"%s\"', reason);\n    var self = this;\n\n    // clear timers\n    clearTimeout(this.pingIntervalTimer);\n    clearTimeout(this.pingTimeoutTimer);\n\n    // stop event from firing again for transport\n    this.transport.removeAllListeners('close');\n\n    // ensure transport won't stay open\n    this.transport.close();\n\n    // ignore further transport communication\n    this.transport.removeAllListeners();\n\n    // set ready state\n    this.readyState = 'closed';\n\n    // clear session id\n    this.id = null;\n\n    // emit close event\n    this.emit('close', reason, desc);\n\n    // clean buffers after, so users can still\n    // grab the buffers on `close` event\n    self.writeBuffer = [];\n    self.prevBufferLen = 0;\n  }\n};\n\n/**\n * Filters upgrades, returning only those matching client transports.\n *\n * @param {Array} server upgrades\n * @api private\n *\n */\n\nSocket.prototype.filterUpgrades = function (upgrades) {\n  var filteredUpgrades = [];\n  for (var i = 0, j = upgrades.length; i < j; i++) {\n    if (~index(this.transports, upgrades[i])) filteredUpgrades.push(upgrades[i]);\n  }\n  return filteredUpgrades;\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./transport\":19,\"./transports/index\":20,\"component-emitter\":11,\"debug\":14,\"engine.io-parser\":26,\"indexof\":33,\"parsejson\":60,\"parseqs\":61,\"parseuri\":62}],19:[function(require,module,exports){\n/**\n * Module dependencies.\n */\n\nvar parser = require('engine.io-parser');\nvar Emitter = require('component-emitter');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Transport;\n\n/**\n * Transport abstract constructor.\n *\n * @param {Object} options.\n * @api private\n */\n\nfunction Transport (opts) {\n  this.path = opts.path;\n  this.hostname = opts.hostname;\n  this.port = opts.port;\n  this.secure = opts.secure;\n  this.query = opts.query;\n  this.timestampParam = opts.timestampParam;\n  this.timestampRequests = opts.timestampRequests;\n  this.readyState = '';\n  this.agent = opts.agent || false;\n  this.socket = opts.socket;\n  this.enablesXDR = opts.enablesXDR;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n  this.forceNode = opts.forceNode;\n\n  // other options for Node.js client\n  this.extraHeaders = opts.extraHeaders;\n  this.localAddress = opts.localAddress;\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Transport.prototype);\n\n/**\n * Emits an error.\n *\n * @param {String} str\n * @return {Transport} for chaining\n * @api public\n */\n\nTransport.prototype.onError = function (msg, desc) {\n  var err = new Error(msg);\n  err.type = 'TransportError';\n  err.description = desc;\n  this.emit('error', err);\n  return this;\n};\n\n/**\n * Opens the transport.\n *\n * @api public\n */\n\nTransport.prototype.open = function () {\n  if ('closed' === this.readyState || '' === this.readyState) {\n    this.readyState = 'opening';\n    this.doOpen();\n  }\n\n  return this;\n};\n\n/**\n * Closes the transport.\n *\n * @api private\n */\n\nTransport.prototype.close = function () {\n  if ('opening' === this.readyState || 'open' === this.readyState) {\n    this.doClose();\n    this.onClose();\n  }\n\n  return this;\n};\n\n/**\n * Sends multiple packets.\n *\n * @param {Array} packets\n * @api private\n */\n\nTransport.prototype.send = function (packets) {\n  if ('open' === this.readyState) {\n    this.write(packets);\n  } else {\n    throw new Error('Transport not open');\n  }\n};\n\n/**\n * Called upon open\n *\n * @api private\n */\n\nTransport.prototype.onOpen = function () {\n  this.readyState = 'open';\n  this.writable = true;\n  this.emit('open');\n};\n\n/**\n * Called with data.\n *\n * @param {String} data\n * @api private\n */\n\nTransport.prototype.onData = function (data) {\n  var packet = parser.decodePacket(data, this.socket.binaryType);\n  this.onPacket(packet);\n};\n\n/**\n * Called with a decoded packet.\n */\n\nTransport.prototype.onPacket = function (packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon close.\n *\n * @api private\n */\n\nTransport.prototype.onClose = function () {\n  this.readyState = 'closed';\n  this.emit('close');\n};\n\n},{\"component-emitter\":11,\"engine.io-parser\":26}],20:[function(require,module,exports){\n(function (global){\n/**\n * Module dependencies\n */\n\nvar XMLHttpRequest = require('xmlhttprequest-ssl');\nvar XHR = require('./polling-xhr');\nvar JSONP = require('./polling-jsonp');\nvar websocket = require('./websocket');\n\n/**\n * Export transports.\n */\n\nexports.polling = polling;\nexports.websocket = websocket;\n\n/**\n * Polling transport polymorphic constructor.\n * Decides on xhr vs jsonp based on feature detection.\n *\n * @api private\n */\n\nfunction polling (opts) {\n  var xhr;\n  var xd = false;\n  var xs = false;\n  var jsonp = false !== opts.jsonp;\n\n  if (global.location) {\n    var isSSL = 'https:' === location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    xd = opts.hostname !== location.hostname || port !== opts.port;\n    xs = opts.secure !== isSSL;\n  }\n\n  opts.xdomain = xd;\n  opts.xscheme = xs;\n  xhr = new XMLHttpRequest(opts);\n\n  if ('open' in xhr && !opts.forceJSONP) {\n    return new XHR(opts);\n  } else {\n    if (!jsonp) throw new Error('JSONP disabled');\n    return new JSONP(opts);\n  }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./polling-jsonp\":21,\"./polling-xhr\":22,\"./websocket\":24,\"xmlhttprequest-ssl\":25}],21:[function(require,module,exports){\n(function (global){\n\n/**\n * Module requirements.\n */\n\nvar Polling = require('./polling');\nvar inherit = require('component-inherit');\n\n/**\n * Module exports.\n */\n\nmodule.exports = JSONPPolling;\n\n/**\n * Cached regular expressions.\n */\n\nvar rNewline = /\\n/g;\nvar rEscapedNewline = /\\\\n/g;\n\n/**\n * Global JSONP callbacks.\n */\n\nvar callbacks;\n\n/**\n * Noop.\n */\n\nfunction empty () { }\n\n/**\n * JSONP Polling constructor.\n *\n * @param {Object} opts.\n * @api public\n */\n\nfunction JSONPPolling (opts) {\n  Polling.call(this, opts);\n\n  this.query = this.query || {};\n\n  // define global callbacks array if not present\n  // we do this here (lazily) to avoid unneeded global pollution\n  if (!callbacks) {\n    // we need to consider multiple engines in the same page\n    if (!global.___eio) global.___eio = [];\n    callbacks = global.___eio;\n  }\n\n  // callback identifier\n  this.index = callbacks.length;\n\n  // add callback to jsonp global\n  var self = this;\n  callbacks.push(function (msg) {\n    self.onData(msg);\n  });\n\n  // append to query string\n  this.query.j = this.index;\n\n  // prevent spurious errors from being emitted when the window is unloaded\n  if (global.document && global.addEventListener) {\n    global.addEventListener('beforeunload', function () {\n      if (self.script) self.script.onerror = empty;\n    }, false);\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(JSONPPolling, Polling);\n\n/*\n * JSONP only supports binary as base64 encoded strings\n */\n\nJSONPPolling.prototype.supportsBinary = false;\n\n/**\n * Closes the socket.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doClose = function () {\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  if (this.form) {\n    this.form.parentNode.removeChild(this.form);\n    this.form = null;\n    this.iframe = null;\n  }\n\n  Polling.prototype.doClose.call(this);\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nJSONPPolling.prototype.doPoll = function () {\n  var self = this;\n  var script = document.createElement('script');\n\n  if (this.script) {\n    this.script.parentNode.removeChild(this.script);\n    this.script = null;\n  }\n\n  script.async = true;\n  script.src = this.uri();\n  script.onerror = function (e) {\n    self.onError('jsonp poll error', e);\n  };\n\n  var insertAt = document.getElementsByTagName('script')[0];\n  if (insertAt) {\n    insertAt.parentNode.insertBefore(script, insertAt);\n  } else {\n    (document.head || document.body).appendChild(script);\n  }\n  this.script = script;\n\n  var isUAgecko = 'undefined' !== typeof navigator && /gecko/i.test(navigator.userAgent);\n\n  if (isUAgecko) {\n    setTimeout(function () {\n      var iframe = document.createElement('iframe');\n      document.body.appendChild(iframe);\n      document.body.removeChild(iframe);\n    }, 100);\n  }\n};\n\n/**\n * Writes with a hidden iframe.\n *\n * @param {String} data to send\n * @param {Function} called upon flush.\n * @api private\n */\n\nJSONPPolling.prototype.doWrite = function (data, fn) {\n  var self = this;\n\n  if (!this.form) {\n    var form = document.createElement('form');\n    var area = document.createElement('textarea');\n    var id = this.iframeId = 'eio_iframe_' + this.index;\n    var iframe;\n\n    form.className = 'socketio';\n    form.style.position = 'absolute';\n    form.style.top = '-1000px';\n    form.style.left = '-1000px';\n    form.target = id;\n    form.method = 'POST';\n    form.setAttribute('accept-charset', 'utf-8');\n    area.name = 'd';\n    form.appendChild(area);\n    document.body.appendChild(form);\n\n    this.form = form;\n    this.area = area;\n  }\n\n  this.form.action = this.uri();\n\n  function complete () {\n    initIframe();\n    fn();\n  }\n\n  function initIframe () {\n    if (self.iframe) {\n      try {\n        self.form.removeChild(self.iframe);\n      } catch (e) {\n        self.onError('jsonp polling iframe removal error', e);\n      }\n    }\n\n    try {\n      // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n      var html = '<iframe src=\"javascript:0\" name=\"' + self.iframeId + '\">';\n      iframe = document.createElement(html);\n    } catch (e) {\n      iframe = document.createElement('iframe');\n      iframe.name = self.iframeId;\n      iframe.src = 'javascript:0';\n    }\n\n    iframe.id = self.iframeId;\n\n    self.form.appendChild(iframe);\n    self.iframe = iframe;\n  }\n\n  initIframe();\n\n  // escape \\n to prevent it from being converted into \\r\\n by some UAs\n  // double escaping is required for escaped new lines because unescaping of new lines can be done safely on server-side\n  data = data.replace(rEscapedNewline, '\\\\\\n');\n  this.area.value = data.replace(rNewline, '\\\\n');\n\n  try {\n    this.form.submit();\n  } catch (e) {}\n\n  if (this.iframe.attachEvent) {\n    this.iframe.onreadystatechange = function () {\n      if (self.iframe.readyState === 'complete') {\n        complete();\n      }\n    };\n  } else {\n    this.iframe.onload = complete;\n  }\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./polling\":23,\"component-inherit\":12}],22:[function(require,module,exports){\n(function (global){\n/**\n * Module requirements.\n */\n\nvar XMLHttpRequest = require('xmlhttprequest-ssl');\nvar Polling = require('./polling');\nvar Emitter = require('component-emitter');\nvar inherit = require('component-inherit');\nvar debug = require('debug')('engine.io-client:polling-xhr');\n\n/**\n * Module exports.\n */\n\nmodule.exports = XHR;\nmodule.exports.Request = Request;\n\n/**\n * Empty function\n */\n\nfunction empty () {}\n\n/**\n * XHR Polling constructor.\n *\n * @param {Object} opts\n * @api public\n */\n\nfunction XHR (opts) {\n  Polling.call(this, opts);\n  this.requestTimeout = opts.requestTimeout;\n\n  if (global.location) {\n    var isSSL = 'https:' === location.protocol;\n    var port = location.port;\n\n    // some user agents have empty `location.port`\n    if (!port) {\n      port = isSSL ? 443 : 80;\n    }\n\n    this.xd = opts.hostname !== global.location.hostname ||\n      port !== opts.port;\n    this.xs = opts.secure !== isSSL;\n  } else {\n    this.extraHeaders = opts.extraHeaders;\n  }\n}\n\n/**\n * Inherits from Polling.\n */\n\ninherit(XHR, Polling);\n\n/**\n * XHR supports binary\n */\n\nXHR.prototype.supportsBinary = true;\n\n/**\n * Creates a request.\n *\n * @param {String} method\n * @api private\n */\n\nXHR.prototype.request = function (opts) {\n  opts = opts || {};\n  opts.uri = this.uri();\n  opts.xd = this.xd;\n  opts.xs = this.xs;\n  opts.agent = this.agent || false;\n  opts.supportsBinary = this.supportsBinary;\n  opts.enablesXDR = this.enablesXDR;\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n  opts.requestTimeout = this.requestTimeout;\n\n  // other options for Node.js client\n  opts.extraHeaders = this.extraHeaders;\n\n  return new Request(opts);\n};\n\n/**\n * Sends data.\n *\n * @param {String} data to send.\n * @param {Function} called upon flush.\n * @api private\n */\n\nXHR.prototype.doWrite = function (data, fn) {\n  var isBinary = typeof data !== 'string' && data !== undefined;\n  var req = this.request({ method: 'POST', data: data, isBinary: isBinary });\n  var self = this;\n  req.on('success', fn);\n  req.on('error', function (err) {\n    self.onError('xhr post error', err);\n  });\n  this.sendXhr = req;\n};\n\n/**\n * Starts a poll cycle.\n *\n * @api private\n */\n\nXHR.prototype.doPoll = function () {\n  debug('xhr poll');\n  var req = this.request();\n  var self = this;\n  req.on('data', function (data) {\n    self.onData(data);\n  });\n  req.on('error', function (err) {\n    self.onError('xhr poll error', err);\n  });\n  this.pollXhr = req;\n};\n\n/**\n * Request constructor\n *\n * @param {Object} options\n * @api public\n */\n\nfunction Request (opts) {\n  this.method = opts.method || 'GET';\n  this.uri = opts.uri;\n  this.xd = !!opts.xd;\n  this.xs = !!opts.xs;\n  this.async = false !== opts.async;\n  this.data = undefined !== opts.data ? opts.data : null;\n  this.agent = opts.agent;\n  this.isBinary = opts.isBinary;\n  this.supportsBinary = opts.supportsBinary;\n  this.enablesXDR = opts.enablesXDR;\n  this.requestTimeout = opts.requestTimeout;\n\n  // SSL options for Node.js client\n  this.pfx = opts.pfx;\n  this.key = opts.key;\n  this.passphrase = opts.passphrase;\n  this.cert = opts.cert;\n  this.ca = opts.ca;\n  this.ciphers = opts.ciphers;\n  this.rejectUnauthorized = opts.rejectUnauthorized;\n\n  // other options for Node.js client\n  this.extraHeaders = opts.extraHeaders;\n\n  this.create();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Request.prototype);\n\n/**\n * Creates the XHR object and sends the request.\n *\n * @api private\n */\n\nRequest.prototype.create = function () {\n  var opts = { agent: this.agent, xdomain: this.xd, xscheme: this.xs, enablesXDR: this.enablesXDR };\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n\n  var xhr = this.xhr = new XMLHttpRequest(opts);\n  var self = this;\n\n  try {\n    debug('xhr open %s: %s', this.method, this.uri);\n    xhr.open(this.method, this.uri, this.async);\n    try {\n      if (this.extraHeaders) {\n        xhr.setDisableHeaderCheck(true);\n        for (var i in this.extraHeaders) {\n          if (this.extraHeaders.hasOwnProperty(i)) {\n            xhr.setRequestHeader(i, this.extraHeaders[i]);\n          }\n        }\n      }\n    } catch (e) {}\n    if (this.supportsBinary) {\n      // This has to be done after open because Firefox is stupid\n      // http://stackoverflow.com/questions/13216903/get-binary-data-with-xmlhttprequest-in-a-firefox-extension\n      xhr.responseType = 'arraybuffer';\n    }\n\n    if ('POST' === this.method) {\n      try {\n        if (this.isBinary) {\n          xhr.setRequestHeader('Content-type', 'application/octet-stream');\n        } else {\n          xhr.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n        }\n      } catch (e) {}\n    }\n\n    try {\n      xhr.setRequestHeader('Accept', '*/*');\n    } catch (e) {}\n\n    // ie6 check\n    if ('withCredentials' in xhr) {\n      xhr.withCredentials = true;\n    }\n\n    if (this.requestTimeout) {\n      xhr.timeout = this.requestTimeout;\n    }\n\n    if (this.hasXDR()) {\n      xhr.onload = function () {\n        self.onLoad();\n      };\n      xhr.onerror = function () {\n        self.onError(xhr.responseText);\n      };\n    } else {\n      xhr.onreadystatechange = function () {\n        if (4 !== xhr.readyState) return;\n        if (200 === xhr.status || 1223 === xhr.status) {\n          self.onLoad();\n        } else {\n          // make sure the `error` event handler that's user-set\n          // does not throw in the same tick and gets caught here\n          setTimeout(function () {\n            self.onError(xhr.status);\n          }, 0);\n        }\n      };\n    }\n\n    debug('xhr data %s', this.data);\n    xhr.send(this.data);\n  } catch (e) {\n    // Need to defer since .create() is called directly fhrom the constructor\n    // and thus the 'error' event can only be only bound *after* this exception\n    // occurs.  Therefore, also, we cannot throw here at all.\n    setTimeout(function () {\n      self.onError(e);\n    }, 0);\n    return;\n  }\n\n  if (global.document) {\n    this.index = Request.requestsCount++;\n    Request.requests[this.index] = this;\n  }\n};\n\n/**\n * Called upon successful response.\n *\n * @api private\n */\n\nRequest.prototype.onSuccess = function () {\n  this.emit('success');\n  this.cleanup();\n};\n\n/**\n * Called if we have data.\n *\n * @api private\n */\n\nRequest.prototype.onData = function (data) {\n  this.emit('data', data);\n  this.onSuccess();\n};\n\n/**\n * Called upon error.\n *\n * @api private\n */\n\nRequest.prototype.onError = function (err) {\n  this.emit('error', err);\n  this.cleanup(true);\n};\n\n/**\n * Cleans up house.\n *\n * @api private\n */\n\nRequest.prototype.cleanup = function (fromError) {\n  if ('undefined' === typeof this.xhr || null === this.xhr) {\n    return;\n  }\n  // xmlhttprequest\n  if (this.hasXDR()) {\n    this.xhr.onload = this.xhr.onerror = empty;\n  } else {\n    this.xhr.onreadystatechange = empty;\n  }\n\n  if (fromError) {\n    try {\n      this.xhr.abort();\n    } catch (e) {}\n  }\n\n  if (global.document) {\n    delete Request.requests[this.index];\n  }\n\n  this.xhr = null;\n};\n\n/**\n * Called upon load.\n *\n * @api private\n */\n\nRequest.prototype.onLoad = function () {\n  var data;\n  try {\n    var contentType;\n    try {\n      contentType = this.xhr.getResponseHeader('Content-Type').split(';')[0];\n    } catch (e) {}\n    if (contentType === 'application/octet-stream') {\n      data = this.xhr.response || this.xhr.responseText;\n    } else {\n      if (!this.supportsBinary) {\n        data = this.xhr.responseText;\n      } else {\n        try {\n          data = String.fromCharCode.apply(null, new Uint8Array(this.xhr.response));\n        } catch (e) {\n          var ui8Arr = new Uint8Array(this.xhr.response);\n          var dataArray = [];\n          for (var idx = 0, length = ui8Arr.length; idx < length; idx++) {\n            dataArray.push(ui8Arr[idx]);\n          }\n\n          data = String.fromCharCode.apply(null, dataArray);\n        }\n      }\n    }\n  } catch (e) {\n    this.onError(e);\n  }\n  if (null != data) {\n    this.onData(data);\n  }\n};\n\n/**\n * Check if it has XDomainRequest.\n *\n * @api private\n */\n\nRequest.prototype.hasXDR = function () {\n  return 'undefined' !== typeof global.XDomainRequest && !this.xs && this.enablesXDR;\n};\n\n/**\n * Aborts the request.\n *\n * @api public\n */\n\nRequest.prototype.abort = function () {\n  this.cleanup();\n};\n\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\n\nRequest.requestsCount = 0;\nRequest.requests = {};\n\nif (global.document) {\n  if (global.attachEvent) {\n    global.attachEvent('onunload', unloadHandler);\n  } else if (global.addEventListener) {\n    global.addEventListener('beforeunload', unloadHandler, false);\n  }\n}\n\nfunction unloadHandler () {\n  for (var i in Request.requests) {\n    if (Request.requests.hasOwnProperty(i)) {\n      Request.requests[i].abort();\n    }\n  }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./polling\":23,\"component-emitter\":11,\"component-inherit\":12,\"debug\":14,\"xmlhttprequest-ssl\":25}],23:[function(require,module,exports){\n/**\n * Module dependencies.\n */\n\nvar Transport = require('../transport');\nvar parseqs = require('parseqs');\nvar parser = require('engine.io-parser');\nvar inherit = require('component-inherit');\nvar yeast = require('yeast');\nvar debug = require('debug')('engine.io-client:polling');\n\n/**\n * Module exports.\n */\n\nmodule.exports = Polling;\n\n/**\n * Is XHR2 supported?\n */\n\nvar hasXHR2 = (function () {\n  var XMLHttpRequest = require('xmlhttprequest-ssl');\n  var xhr = new XMLHttpRequest({ xdomain: false });\n  return null != xhr.responseType;\n})();\n\n/**\n * Polling interface.\n *\n * @param {Object} opts\n * @api private\n */\n\nfunction Polling (opts) {\n  var forceBase64 = (opts && opts.forceBase64);\n  if (!hasXHR2 || forceBase64) {\n    this.supportsBinary = false;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(Polling, Transport);\n\n/**\n * Transport name.\n */\n\nPolling.prototype.name = 'polling';\n\n/**\n * Opens the socket (triggers polling). We write a PING message to determine\n * when the transport is open.\n *\n * @api private\n */\n\nPolling.prototype.doOpen = function () {\n  this.poll();\n};\n\n/**\n * Pauses polling.\n *\n * @param {Function} callback upon buffers are flushed and transport is paused\n * @api private\n */\n\nPolling.prototype.pause = function (onPause) {\n  var self = this;\n\n  this.readyState = 'pausing';\n\n  function pause () {\n    debug('paused');\n    self.readyState = 'paused';\n    onPause();\n  }\n\n  if (this.polling || !this.writable) {\n    var total = 0;\n\n    if (this.polling) {\n      debug('we are currently polling - waiting to pause');\n      total++;\n      this.once('pollComplete', function () {\n        debug('pre-pause polling complete');\n        --total || pause();\n      });\n    }\n\n    if (!this.writable) {\n      debug('we are currently writing - waiting to pause');\n      total++;\n      this.once('drain', function () {\n        debug('pre-pause writing complete');\n        --total || pause();\n      });\n    }\n  } else {\n    pause();\n  }\n};\n\n/**\n * Starts polling cycle.\n *\n * @api public\n */\n\nPolling.prototype.poll = function () {\n  debug('polling');\n  this.polling = true;\n  this.doPoll();\n  this.emit('poll');\n};\n\n/**\n * Overloads onData to detect payloads.\n *\n * @api private\n */\n\nPolling.prototype.onData = function (data) {\n  var self = this;\n  debug('polling got data %s', data);\n  var callback = function (packet, index, total) {\n    // if its the first message we consider the transport open\n    if ('opening' === self.readyState) {\n      self.onOpen();\n    }\n\n    // if its a close packet, we close the ongoing requests\n    if ('close' === packet.type) {\n      self.onClose();\n      return false;\n    }\n\n    // otherwise bypass onData and handle the message\n    self.onPacket(packet);\n  };\n\n  // decode payload\n  parser.decodePayload(data, this.socket.binaryType, callback);\n\n  // if an event did not trigger closing\n  if ('closed' !== this.readyState) {\n    // if we got data we're not polling\n    this.polling = false;\n    this.emit('pollComplete');\n\n    if ('open' === this.readyState) {\n      this.poll();\n    } else {\n      debug('ignoring poll - transport state \"%s\"', this.readyState);\n    }\n  }\n};\n\n/**\n * For polling, send a close packet.\n *\n * @api private\n */\n\nPolling.prototype.doClose = function () {\n  var self = this;\n\n  function close () {\n    debug('writing close packet');\n    self.write([{ type: 'close' }]);\n  }\n\n  if ('open' === this.readyState) {\n    debug('transport open - closing');\n    close();\n  } else {\n    // in case we're trying to close while\n    // handshaking is in progress (GH-164)\n    debug('transport not open - deferring close');\n    this.once('open', close);\n  }\n};\n\n/**\n * Writes a packets payload.\n *\n * @param {Array} data packets\n * @param {Function} drain callback\n * @api private\n */\n\nPolling.prototype.write = function (packets) {\n  var self = this;\n  this.writable = false;\n  var callbackfn = function () {\n    self.writable = true;\n    self.emit('drain');\n  };\n\n  parser.encodePayload(packets, this.supportsBinary, function (data) {\n    self.doWrite(data, callbackfn);\n  });\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nPolling.prototype.uri = function () {\n  var query = this.query || {};\n  var schema = this.secure ? 'https' : 'http';\n  var port = '';\n\n  // cache busting is forced\n  if (false !== this.timestampRequests) {\n    query[this.timestampParam] = yeast();\n  }\n\n  if (!this.supportsBinary && !query.sid) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // avoid port if default for schema\n  if (this.port && (('https' === schema && Number(this.port) !== 443) ||\n     ('http' === schema && Number(this.port) !== 80))) {\n    port = ':' + this.port;\n  }\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  var ipv6 = this.hostname.indexOf(':') !== -1;\n  return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n};\n\n},{\"../transport\":19,\"component-inherit\":12,\"debug\":14,\"engine.io-parser\":26,\"parseqs\":61,\"xmlhttprequest-ssl\":25,\"yeast\":80}],24:[function(require,module,exports){\n(function (global){\n/**\n * Module dependencies.\n */\n\nvar Transport = require('../transport');\nvar parser = require('engine.io-parser');\nvar parseqs = require('parseqs');\nvar inherit = require('component-inherit');\nvar yeast = require('yeast');\nvar debug = require('debug')('engine.io-client:websocket');\nvar BrowserWebSocket = global.WebSocket || global.MozWebSocket;\nvar NodeWebSocket;\nif (typeof window === 'undefined') {\n  try {\n    NodeWebSocket = require('ws');\n  } catch (e) { }\n}\n\n/**\n * Get either the `WebSocket` or `MozWebSocket` globals\n * in the browser or try to resolve WebSocket-compatible\n * interface exposed by `ws` for Node-like environment.\n */\n\nvar WebSocket = BrowserWebSocket;\nif (!WebSocket && typeof window === 'undefined') {\n  WebSocket = NodeWebSocket;\n}\n\n/**\n * Module exports.\n */\n\nmodule.exports = WS;\n\n/**\n * WebSocket transport constructor.\n *\n * @api {Object} connection options\n * @api public\n */\n\nfunction WS (opts) {\n  var forceBase64 = (opts && opts.forceBase64);\n  if (forceBase64) {\n    this.supportsBinary = false;\n  }\n  this.perMessageDeflate = opts.perMessageDeflate;\n  this.usingBrowserWebSocket = BrowserWebSocket && !opts.forceNode;\n  if (!this.usingBrowserWebSocket) {\n    WebSocket = NodeWebSocket;\n  }\n  Transport.call(this, opts);\n}\n\n/**\n * Inherits from Transport.\n */\n\ninherit(WS, Transport);\n\n/**\n * Transport name.\n *\n * @api public\n */\n\nWS.prototype.name = 'websocket';\n\n/*\n * WebSockets support binary\n */\n\nWS.prototype.supportsBinary = true;\n\n/**\n * Opens socket.\n *\n * @api private\n */\n\nWS.prototype.doOpen = function () {\n  if (!this.check()) {\n    // let probe timeout\n    return;\n  }\n\n  var uri = this.uri();\n  var protocols = void (0);\n  var opts = {\n    agent: this.agent,\n    perMessageDeflate: this.perMessageDeflate\n  };\n\n  // SSL options for Node.js client\n  opts.pfx = this.pfx;\n  opts.key = this.key;\n  opts.passphrase = this.passphrase;\n  opts.cert = this.cert;\n  opts.ca = this.ca;\n  opts.ciphers = this.ciphers;\n  opts.rejectUnauthorized = this.rejectUnauthorized;\n  if (this.extraHeaders) {\n    opts.headers = this.extraHeaders;\n  }\n  if (this.localAddress) {\n    opts.localAddress = this.localAddress;\n  }\n\n  try {\n    this.ws = this.usingBrowserWebSocket ? new WebSocket(uri) : new WebSocket(uri, protocols, opts);\n  } catch (err) {\n    return this.emit('error', err);\n  }\n\n  if (this.ws.binaryType === undefined) {\n    this.supportsBinary = false;\n  }\n\n  if (this.ws.supports && this.ws.supports.binary) {\n    this.supportsBinary = true;\n    this.ws.binaryType = 'nodebuffer';\n  } else {\n    this.ws.binaryType = 'arraybuffer';\n  }\n\n  this.addEventListeners();\n};\n\n/**\n * Adds event listeners to the socket\n *\n * @api private\n */\n\nWS.prototype.addEventListeners = function () {\n  var self = this;\n\n  this.ws.onopen = function () {\n    self.onOpen();\n  };\n  this.ws.onclose = function () {\n    self.onClose();\n  };\n  this.ws.onmessage = function (ev) {\n    self.onData(ev.data);\n  };\n  this.ws.onerror = function (e) {\n    self.onError('websocket error', e);\n  };\n};\n\n/**\n * Writes data to socket.\n *\n * @param {Array} array of packets.\n * @api private\n */\n\nWS.prototype.write = function (packets) {\n  var self = this;\n  this.writable = false;\n\n  // encodePacket efficient as it uses WS framing\n  // no need for encodePayload\n  var total = packets.length;\n  for (var i = 0, l = total; i < l; i++) {\n    (function (packet) {\n      parser.encodePacket(packet, self.supportsBinary, function (data) {\n        if (!self.usingBrowserWebSocket) {\n          // always create a new object (GH-437)\n          var opts = {};\n          if (packet.options) {\n            opts.compress = packet.options.compress;\n          }\n\n          if (self.perMessageDeflate) {\n            var len = 'string' === typeof data ? global.Buffer.byteLength(data) : data.length;\n            if (len < self.perMessageDeflate.threshold) {\n              opts.compress = false;\n            }\n          }\n        }\n\n        // Sometimes the websocket has already been closed but the browser didn't\n        // have a chance of informing us about it yet, in that case send will\n        // throw an error\n        try {\n          if (self.usingBrowserWebSocket) {\n            // TypeError is thrown when passing the second argument on Safari\n            self.ws.send(data);\n          } else {\n            self.ws.send(data, opts);\n          }\n        } catch (e) {\n          debug('websocket closed before onclose event');\n        }\n\n        --total || done();\n      });\n    })(packets[i]);\n  }\n\n  function done () {\n    self.emit('flush');\n\n    // fake drain\n    // defer to next tick to allow Socket to clear writeBuffer\n    setTimeout(function () {\n      self.writable = true;\n      self.emit('drain');\n    }, 0);\n  }\n};\n\n/**\n * Called upon close\n *\n * @api private\n */\n\nWS.prototype.onClose = function () {\n  Transport.prototype.onClose.call(this);\n};\n\n/**\n * Closes socket.\n *\n * @api private\n */\n\nWS.prototype.doClose = function () {\n  if (typeof this.ws !== 'undefined') {\n    this.ws.close();\n  }\n};\n\n/**\n * Generates uri for connection.\n *\n * @api private\n */\n\nWS.prototype.uri = function () {\n  var query = this.query || {};\n  var schema = this.secure ? 'wss' : 'ws';\n  var port = '';\n\n  // avoid port if default for schema\n  if (this.port && (('wss' === schema && Number(this.port) !== 443) ||\n    ('ws' === schema && Number(this.port) !== 80))) {\n    port = ':' + this.port;\n  }\n\n  // append timestamp to URI\n  if (this.timestampRequests) {\n    query[this.timestampParam] = yeast();\n  }\n\n  // communicate binary support capabilities\n  if (!this.supportsBinary) {\n    query.b64 = 1;\n  }\n\n  query = parseqs.encode(query);\n\n  // prepend ? to query\n  if (query.length) {\n    query = '?' + query;\n  }\n\n  var ipv6 = this.hostname.indexOf(':') !== -1;\n  return schema + '://' + (ipv6 ? '[' + this.hostname + ']' : this.hostname) + port + this.path + query;\n};\n\n/**\n * Feature detection for WebSocket.\n *\n * @return {Boolean} whether this transport is available.\n * @api public\n */\n\nWS.prototype.check = function () {\n  return !!WebSocket && !('__initialize' in WebSocket && this.name === WS.prototype.name);\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"../transport\":19,\"component-inherit\":12,\"debug\":14,\"engine.io-parser\":26,\"parseqs\":61,\"ws\":8,\"yeast\":80}],25:[function(require,module,exports){\n(function (global){\n// browser shim for xmlhttprequest module\n\nvar hasCORS = require('has-cors');\n\nmodule.exports = function (opts) {\n  var xdomain = opts.xdomain;\n\n  // scheme must be same when usign XDomainRequest\n  // http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx\n  var xscheme = opts.xscheme;\n\n  // XDomainRequest has a flow of not sending cookie, therefore it should be disabled as a default.\n  // https://github.com/Automattic/engine.io-client/pull/217\n  var enablesXDR = opts.enablesXDR;\n\n  // XMLHttpRequest can be disabled on IE\n  try {\n    if ('undefined' !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n      return new XMLHttpRequest();\n    }\n  } catch (e) { }\n\n  // Use XDomainRequest for IE8 if enablesXDR is true\n  // because loading bar keeps flashing when using jsonp-polling\n  // https://github.com/yujiosaka/socke.io-ie8-loading-example\n  try {\n    if ('undefined' !== typeof XDomainRequest && !xscheme && enablesXDR) {\n      return new XDomainRequest();\n    }\n  } catch (e) { }\n\n  if (!xdomain) {\n    try {\n      return new global[['Active'].concat('Object').join('X')]('Microsoft.XMLHTTP');\n    } catch (e) { }\n  }\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"has-cors\":32}],26:[function(require,module,exports){\n(function (global){\n/**\n * Module dependencies.\n */\n\nvar keys = require('./keys');\nvar hasBinary = require('has-binary');\nvar sliceBuffer = require('arraybuffer.slice');\nvar after = require('after');\nvar utf8 = require('wtf-8');\n\nvar base64encoder;\nif (global && global.ArrayBuffer) {\n  base64encoder = require('base64-arraybuffer');\n}\n\n/**\n * Check if we are running an android browser. That requires us to use\n * ArrayBuffer with polling transports...\n *\n * http://ghinda.net/jpeg-blob-ajax-android/\n */\n\nvar isAndroid = typeof navigator !== 'undefined' && /Android/i.test(navigator.userAgent);\n\n/**\n * Check if we are running in PhantomJS.\n * Uploading a Blob with PhantomJS does not work correctly, as reported here:\n * https://github.com/ariya/phantomjs/issues/11395\n * @type boolean\n */\nvar isPhantomJS = typeof navigator !== 'undefined' && /PhantomJS/i.test(navigator.userAgent);\n\n/**\n * When true, avoids using Blobs to encode payloads.\n * @type boolean\n */\nvar dontSendBlobs = isAndroid || isPhantomJS;\n\n/**\n * Current protocol version.\n */\n\nexports.protocol = 3;\n\n/**\n * Packet types.\n */\n\nvar packets = exports.packets = {\n    open:     0    // non-ws\n  , close:    1    // non-ws\n  , ping:     2\n  , pong:     3\n  , message:  4\n  , upgrade:  5\n  , noop:     6\n};\n\nvar packetslist = keys(packets);\n\n/**\n * Premade error packet.\n */\n\nvar err = { type: 'error', data: 'parser error' };\n\n/**\n * Create a blob api even for blob builder when vendor prefixes exist\n */\n\nvar Blob = require('blob');\n\n/**\n * Encodes a packet.\n *\n *     <packet type id> [ <data> ]\n *\n * Example:\n *\n *     5hello world\n *     3\n *     4\n *\n * Binary is encoded in an identical principle\n *\n * @api private\n */\n\nexports.encodePacket = function (packet, supportsBinary, utf8encode, callback) {\n  if ('function' == typeof supportsBinary) {\n    callback = supportsBinary;\n    supportsBinary = false;\n  }\n\n  if ('function' == typeof utf8encode) {\n    callback = utf8encode;\n    utf8encode = null;\n  }\n\n  var data = (packet.data === undefined)\n    ? undefined\n    : packet.data.buffer || packet.data;\n\n  if (global.ArrayBuffer && data instanceof ArrayBuffer) {\n    return encodeArrayBuffer(packet, supportsBinary, callback);\n  } else if (Blob && data instanceof global.Blob) {\n    return encodeBlob(packet, supportsBinary, callback);\n  }\n\n  // might be an object with { base64: true, data: dataAsBase64String }\n  if (data && data.base64) {\n    return encodeBase64Object(packet, callback);\n  }\n\n  // Sending data as a utf-8 string\n  var encoded = packets[packet.type];\n\n  // data fragment is optional\n  if (undefined !== packet.data) {\n    encoded += utf8encode ? utf8.encode(String(packet.data)) : String(packet.data);\n  }\n\n  return callback('' + encoded);\n\n};\n\nfunction encodeBase64Object(packet, callback) {\n  // packet data is an object { base64: true, data: dataAsBase64String }\n  var message = 'b' + exports.packets[packet.type] + packet.data.data;\n  return callback(message);\n}\n\n/**\n * Encode packet helpers for binary types\n */\n\nfunction encodeArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var data = packet.data;\n  var contentArray = new Uint8Array(data);\n  var resultBuffer = new Uint8Array(1 + data.byteLength);\n\n  resultBuffer[0] = packets[packet.type];\n  for (var i = 0; i < contentArray.length; i++) {\n    resultBuffer[i+1] = contentArray[i];\n  }\n\n  return callback(resultBuffer.buffer);\n}\n\nfunction encodeBlobAsArrayBuffer(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  var fr = new FileReader();\n  fr.onload = function() {\n    packet.data = fr.result;\n    exports.encodePacket(packet, supportsBinary, true, callback);\n  };\n  return fr.readAsArrayBuffer(packet.data);\n}\n\nfunction encodeBlob(packet, supportsBinary, callback) {\n  if (!supportsBinary) {\n    return exports.encodeBase64Packet(packet, callback);\n  }\n\n  if (dontSendBlobs) {\n    return encodeBlobAsArrayBuffer(packet, supportsBinary, callback);\n  }\n\n  var length = new Uint8Array(1);\n  length[0] = packets[packet.type];\n  var blob = new Blob([length.buffer, packet.data]);\n\n  return callback(blob);\n}\n\n/**\n * Encodes a packet with binary data in a base64 string\n *\n * @param {Object} packet, has `type` and `data`\n * @return {String} base64 encoded message\n */\n\nexports.encodeBase64Packet = function(packet, callback) {\n  var message = 'b' + exports.packets[packet.type];\n  if (Blob && packet.data instanceof global.Blob) {\n    var fr = new FileReader();\n    fr.onload = function() {\n      var b64 = fr.result.split(',')[1];\n      callback(message + b64);\n    };\n    return fr.readAsDataURL(packet.data);\n  }\n\n  var b64data;\n  try {\n    b64data = String.fromCharCode.apply(null, new Uint8Array(packet.data));\n  } catch (e) {\n    // iPhone Safari doesn't let you apply with typed arrays\n    var typed = new Uint8Array(packet.data);\n    var basic = new Array(typed.length);\n    for (var i = 0; i < typed.length; i++) {\n      basic[i] = typed[i];\n    }\n    b64data = String.fromCharCode.apply(null, basic);\n  }\n  message += global.btoa(b64data);\n  return callback(message);\n};\n\n/**\n * Decodes a packet. Changes format to Blob if requested.\n *\n * @return {Object} with `type` and `data` (if any)\n * @api private\n */\n\nexports.decodePacket = function (data, binaryType, utf8decode) {\n  if (data === undefined) {\n    return err;\n  }\n  // String data\n  if (typeof data == 'string') {\n    if (data.charAt(0) == 'b') {\n      return exports.decodeBase64Packet(data.substr(1), binaryType);\n    }\n\n    if (utf8decode) {\n      data = tryDecode(data);\n      if (data === false) {\n        return err;\n      }\n    }\n    var type = data.charAt(0);\n\n    if (Number(type) != type || !packetslist[type]) {\n      return err;\n    }\n\n    if (data.length > 1) {\n      return { type: packetslist[type], data: data.substring(1) };\n    } else {\n      return { type: packetslist[type] };\n    }\n  }\n\n  var asArray = new Uint8Array(data);\n  var type = asArray[0];\n  var rest = sliceBuffer(data, 1);\n  if (Blob && binaryType === 'blob') {\n    rest = new Blob([rest]);\n  }\n  return { type: packetslist[type], data: rest };\n};\n\nfunction tryDecode(data) {\n  try {\n    data = utf8.decode(data);\n  } catch (e) {\n    return false;\n  }\n  return data;\n}\n\n/**\n * Decodes a packet encoded in a base64 string\n *\n * @param {String} base64 encoded message\n * @return {Object} with `type` and `data` (if any)\n */\n\nexports.decodeBase64Packet = function(msg, binaryType) {\n  var type = packetslist[msg.charAt(0)];\n  if (!base64encoder) {\n    return { type: type, data: { base64: true, data: msg.substr(1) } };\n  }\n\n  var data = base64encoder.decode(msg.substr(1));\n\n  if (binaryType === 'blob' && Blob) {\n    data = new Blob([data]);\n  }\n\n  return { type: type, data: data };\n};\n\n/**\n * Encodes multiple messages (payload).\n *\n *     <length>:data\n *\n * Example:\n *\n *     11:hello world2:hi\n *\n * If any contents are binary, they will be encoded as base64 strings. Base64\n * encoded strings are marked with a b before the length specifier\n *\n * @param {Array} packets\n * @api private\n */\n\nexports.encodePayload = function (packets, supportsBinary, callback) {\n  if (typeof supportsBinary == 'function') {\n    callback = supportsBinary;\n    supportsBinary = null;\n  }\n\n  var isBinary = hasBinary(packets);\n\n  if (supportsBinary && isBinary) {\n    if (Blob && !dontSendBlobs) {\n      return exports.encodePayloadAsBlob(packets, callback);\n    }\n\n    return exports.encodePayloadAsArrayBuffer(packets, callback);\n  }\n\n  if (!packets.length) {\n    return callback('0:');\n  }\n\n  function setLengthHeader(message) {\n    return message.length + ':' + message;\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, !isBinary ? false : supportsBinary, true, function(message) {\n      doneCallback(null, setLengthHeader(message));\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(results.join(''));\n  });\n};\n\n/**\n * Async array map using after\n */\n\nfunction map(ary, each, done) {\n  var result = new Array(ary.length);\n  var next = after(ary.length, done);\n\n  var eachWithIndex = function(i, el, cb) {\n    each(el, function(error, msg) {\n      result[i] = msg;\n      cb(error, result);\n    });\n  };\n\n  for (var i = 0; i < ary.length; i++) {\n    eachWithIndex(i, ary[i], next);\n  }\n}\n\n/*\n * Decodes data when a payload is maybe expected. Possible binary contents are\n * decoded from their base64 representation\n *\n * @param {String} data, callback method\n * @api public\n */\n\nexports.decodePayload = function (data, binaryType, callback) {\n  if (typeof data != 'string') {\n    return exports.decodePayloadAsBinary(data, binaryType, callback);\n  }\n\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var packet;\n  if (data == '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n  var length = ''\n    , n, msg;\n\n  for (var i = 0, l = data.length; i < l; i++) {\n    var chr = data.charAt(i);\n\n    if (':' != chr) {\n      length += chr;\n    } else {\n      if ('' == length || (length != (n = Number(length)))) {\n        // parser error - ignoring payload\n        return callback(err, 0, 1);\n      }\n\n      msg = data.substr(i + 1, n);\n\n      if (length != msg.length) {\n        // parser error - ignoring payload\n        return callback(err, 0, 1);\n      }\n\n      if (msg.length) {\n        packet = exports.decodePacket(msg, binaryType, true);\n\n        if (err.type == packet.type && err.data == packet.data) {\n          // parser error in individual packet - ignoring payload\n          return callback(err, 0, 1);\n        }\n\n        var ret = callback(packet, i + n, l);\n        if (false === ret) return;\n      }\n\n      // advance cursor\n      i += n;\n      length = '';\n    }\n  }\n\n  if (length != '') {\n    // parser error - ignoring payload\n    return callback(err, 0, 1);\n  }\n\n};\n\n/**\n * Encodes multiple messages (payload) as binary.\n *\n * <1 = binary, 0 = string><number from 0-9><number from 0-9>[...]<number\n * 255><data>\n *\n * Example:\n * 1 3 255 1 2 3, if the binary contents are interpreted as 8 bit integers\n *\n * @param {Array} packets\n * @return {ArrayBuffer} encoded payload\n * @api private\n */\n\nexports.encodePayloadAsArrayBuffer = function(packets, callback) {\n  if (!packets.length) {\n    return callback(new ArrayBuffer(0));\n  }\n\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(data) {\n      return doneCallback(null, data);\n    });\n  }\n\n  map(packets, encodeOne, function(err, encodedPackets) {\n    var totalLength = encodedPackets.reduce(function(acc, p) {\n      var len;\n      if (typeof p === 'string'){\n        len = p.length;\n      } else {\n        len = p.byteLength;\n      }\n      return acc + len.toString().length + len + 2; // string/binary identifier + separator = 2\n    }, 0);\n\n    var resultArray = new Uint8Array(totalLength);\n\n    var bufferIndex = 0;\n    encodedPackets.forEach(function(p) {\n      var isString = typeof p === 'string';\n      var ab = p;\n      if (isString) {\n        var view = new Uint8Array(p.length);\n        for (var i = 0; i < p.length; i++) {\n          view[i] = p.charCodeAt(i);\n        }\n        ab = view.buffer;\n      }\n\n      if (isString) { // not true binary\n        resultArray[bufferIndex++] = 0;\n      } else { // true binary\n        resultArray[bufferIndex++] = 1;\n      }\n\n      var lenStr = ab.byteLength.toString();\n      for (var i = 0; i < lenStr.length; i++) {\n        resultArray[bufferIndex++] = parseInt(lenStr[i]);\n      }\n      resultArray[bufferIndex++] = 255;\n\n      var view = new Uint8Array(ab);\n      for (var i = 0; i < view.length; i++) {\n        resultArray[bufferIndex++] = view[i];\n      }\n    });\n\n    return callback(resultArray.buffer);\n  });\n};\n\n/**\n * Encode as Blob\n */\n\nexports.encodePayloadAsBlob = function(packets, callback) {\n  function encodeOne(packet, doneCallback) {\n    exports.encodePacket(packet, true, true, function(encoded) {\n      var binaryIdentifier = new Uint8Array(1);\n      binaryIdentifier[0] = 1;\n      if (typeof encoded === 'string') {\n        var view = new Uint8Array(encoded.length);\n        for (var i = 0; i < encoded.length; i++) {\n          view[i] = encoded.charCodeAt(i);\n        }\n        encoded = view.buffer;\n        binaryIdentifier[0] = 0;\n      }\n\n      var len = (encoded instanceof ArrayBuffer)\n        ? encoded.byteLength\n        : encoded.size;\n\n      var lenStr = len.toString();\n      var lengthAry = new Uint8Array(lenStr.length + 1);\n      for (var i = 0; i < lenStr.length; i++) {\n        lengthAry[i] = parseInt(lenStr[i]);\n      }\n      lengthAry[lenStr.length] = 255;\n\n      if (Blob) {\n        var blob = new Blob([binaryIdentifier.buffer, lengthAry.buffer, encoded]);\n        doneCallback(null, blob);\n      }\n    });\n  }\n\n  map(packets, encodeOne, function(err, results) {\n    return callback(new Blob(results));\n  });\n};\n\n/*\n * Decodes data when a payload is maybe expected. Strings are decoded by\n * interpreting each byte as a key code for entries marked to start with 0. See\n * description of encodePayloadAsBinary\n *\n * @param {ArrayBuffer} data, callback method\n * @api public\n */\n\nexports.decodePayloadAsBinary = function (data, binaryType, callback) {\n  if (typeof binaryType === 'function') {\n    callback = binaryType;\n    binaryType = null;\n  }\n\n  var bufferTail = data;\n  var buffers = [];\n\n  var numberTooLong = false;\n  while (bufferTail.byteLength > 0) {\n    var tailArray = new Uint8Array(bufferTail);\n    var isString = tailArray[0] === 0;\n    var msgLength = '';\n\n    for (var i = 1; ; i++) {\n      if (tailArray[i] == 255) break;\n\n      if (msgLength.length > 310) {\n        numberTooLong = true;\n        break;\n      }\n\n      msgLength += tailArray[i];\n    }\n\n    if(numberTooLong) return callback(err, 0, 1);\n\n    bufferTail = sliceBuffer(bufferTail, 2 + msgLength.length);\n    msgLength = parseInt(msgLength);\n\n    var msg = sliceBuffer(bufferTail, 0, msgLength);\n    if (isString) {\n      try {\n        msg = String.fromCharCode.apply(null, new Uint8Array(msg));\n      } catch (e) {\n        // iPhone Safari doesn't let you apply to typed arrays\n        var typed = new Uint8Array(msg);\n        msg = '';\n        for (var i = 0; i < typed.length; i++) {\n          msg += String.fromCharCode(typed[i]);\n        }\n      }\n    }\n\n    buffers.push(msg);\n    bufferTail = sliceBuffer(bufferTail, msgLength);\n  }\n\n  var total = buffers.length;\n  buffers.forEach(function(buffer, i) {\n    callback(exports.decodePacket(buffer, binaryType, true), i, total);\n  });\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./keys\":27,\"after\":3,\"arraybuffer.slice\":4,\"base64-arraybuffer\":6,\"blob\":7,\"has-binary\":28,\"wtf-8\":79}],27:[function(require,module,exports){\n\n/**\n * Gets the keys for an object.\n *\n * @return {Array} keys\n * @api private\n */\n\nmodule.exports = Object.keys || function keys (obj){\n  var arr = [];\n  var has = Object.prototype.hasOwnProperty;\n\n  for (var i in obj) {\n    if (has.call(obj, i)) {\n      arr.push(i);\n    }\n  }\n  return arr;\n};\n\n},{}],28:[function(require,module,exports){\n(function (global){\n\n/*\n * Module requirements.\n */\n\nvar isArray = require('isarray');\n\n/**\n * Module exports.\n */\n\nmodule.exports = hasBinary;\n\n/**\n * Checks for binary data.\n *\n * Right now only Buffer and ArrayBuffer are supported..\n *\n * @param {Object} anything\n * @api public\n */\n\nfunction hasBinary(data) {\n\n  function _hasBinary(obj) {\n    if (!obj) return false;\n\n    if ( (global.Buffer && global.Buffer.isBuffer(obj)) ||\n         (global.ArrayBuffer && obj instanceof ArrayBuffer) ||\n         (global.Blob && obj instanceof Blob) ||\n         (global.File && obj instanceof File)\n        ) {\n      return true;\n    }\n\n    if (isArray(obj)) {\n      for (var i = 0; i < obj.length; i++) {\n          if (_hasBinary(obj[i])) {\n              return true;\n          }\n      }\n    } else if (obj && 'object' == typeof obj) {\n      if (obj.toJSON) {\n        obj = obj.toJSON();\n      }\n\n      for (var key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key) && _hasBinary(obj[key])) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  return _hasBinary(data);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"isarray\":29}],29:[function(require,module,exports){\nmodule.exports = Array.isArray || function (arr) {\n  return Object.prototype.toString.call(arr) == '[object Array]';\n};\n\n},{}],30:[function(require,module,exports){\n(function (global){\n\n/*\n * Module requirements.\n */\n\nvar isArray = require('isarray');\n\n/**\n * Module exports.\n */\n\nmodule.exports = hasBinary;\n\n/**\n * Checks for binary data.\n *\n * Right now only Buffer and ArrayBuffer are supported..\n *\n * @param {Object} anything\n * @api public\n */\n\nfunction hasBinary(data) {\n\n  function _hasBinary(obj) {\n    if (!obj) return false;\n\n    if ( (global.Buffer && global.Buffer.isBuffer && global.Buffer.isBuffer(obj)) ||\n         (global.ArrayBuffer && obj instanceof ArrayBuffer) ||\n         (global.Blob && obj instanceof Blob) ||\n         (global.File && obj instanceof File)\n        ) {\n      return true;\n    }\n\n    if (isArray(obj)) {\n      for (var i = 0; i < obj.length; i++) {\n          if (_hasBinary(obj[i])) {\n              return true;\n          }\n      }\n    } else if (obj && 'object' == typeof obj) {\n      // see: https://github.com/Automattic/has-binary/pull/4\n      if (obj.toJSON && 'function' == typeof obj.toJSON) {\n        obj = obj.toJSON();\n      }\n\n      for (var key in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, key) && _hasBinary(obj[key])) {\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  return _hasBinary(data);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"isarray\":31}],31:[function(require,module,exports){\narguments[4][29][0].apply(exports,arguments)\n},{\"dup\":29}],32:[function(require,module,exports){\n\n/**\n * Module exports.\n *\n * Logic borrowed from Modernizr:\n *\n *   - https://github.com/Modernizr/Modernizr/blob/master/feature-detects/cors.js\n */\n\ntry {\n  module.exports = typeof XMLHttpRequest !== 'undefined' &&\n    'withCredentials' in new XMLHttpRequest();\n} catch (err) {\n  // if XMLHttp support is disabled in IE then it will throw\n  // when trying to create\n  module.exports = false;\n}\n\n},{}],33:[function(require,module,exports){\n\nvar indexOf = [].indexOf;\n\nmodule.exports = function(arr, obj){\n  if (indexOf) return arr.indexOf(obj);\n  for (var i = 0; i < arr.length; ++i) {\n    if (arr[i] === obj) return i;\n  }\n  return -1;\n};\n},{}],34:[function(require,module,exports){\n(function (global){\n/*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */\n;(function () {\n  // Detect the `define` function exposed by asynchronous module loaders. The\n  // strict `define` check is necessary for compatibility with `r.js`.\n  var isLoader = typeof define === \"function\" && define.amd;\n\n  // A set of types used to distinguish objects from primitives.\n  var objectTypes = {\n    \"function\": true,\n    \"object\": true\n  };\n\n  // Detect the `exports` object exposed by CommonJS implementations.\n  var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n  // Use the `global` object exposed by Node (including Browserify via\n  // `insert-module-globals`), Narwhal, and Ringo as the default context,\n  // and the `window` object in browsers. Rhino exports a `global` function\n  // instead.\n  var root = objectTypes[typeof window] && window || this,\n      freeGlobal = freeExports && objectTypes[typeof module] && module && !module.nodeType && typeof global == \"object\" && global;\n\n  if (freeGlobal && (freeGlobal[\"global\"] === freeGlobal || freeGlobal[\"window\"] === freeGlobal || freeGlobal[\"self\"] === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  // Public: Initializes JSON 3 using the given `context` object, attaching the\n  // `stringify` and `parse` functions to the specified `exports` object.\n  function runInContext(context, exports) {\n    context || (context = root[\"Object\"]());\n    exports || (exports = root[\"Object\"]());\n\n    // Native constructor aliases.\n    var Number = context[\"Number\"] || root[\"Number\"],\n        String = context[\"String\"] || root[\"String\"],\n        Object = context[\"Object\"] || root[\"Object\"],\n        Date = context[\"Date\"] || root[\"Date\"],\n        SyntaxError = context[\"SyntaxError\"] || root[\"SyntaxError\"],\n        TypeError = context[\"TypeError\"] || root[\"TypeError\"],\n        Math = context[\"Math\"] || root[\"Math\"],\n        nativeJSON = context[\"JSON\"] || root[\"JSON\"];\n\n    // Delegate to the native `stringify` and `parse` implementations.\n    if (typeof nativeJSON == \"object\" && nativeJSON) {\n      exports.stringify = nativeJSON.stringify;\n      exports.parse = nativeJSON.parse;\n    }\n\n    // Convenience aliases.\n    var objectProto = Object.prototype,\n        getClass = objectProto.toString,\n        isProperty, forEach, undef;\n\n    // Test the `Date#getUTC*` methods. Based on work by @Yaffle.\n    var isExtended = new Date(-3509827334573292);\n    try {\n      // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical\n      // results for certain dates in Opera >= 10.53.\n      isExtended = isExtended.getUTCFullYear() == -109252 && isExtended.getUTCMonth() === 0 && isExtended.getUTCDate() === 1 &&\n        // Safari < 2.0.2 stores the internal millisecond time value correctly,\n        // but clips the values returned by the date methods to the range of\n        // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]).\n        isExtended.getUTCHours() == 10 && isExtended.getUTCMinutes() == 37 && isExtended.getUTCSeconds() == 6 && isExtended.getUTCMilliseconds() == 708;\n    } catch (exception) {}\n\n    // Internal: Determines whether the native `JSON.stringify` and `parse`\n    // implementations are spec-compliant. Based on work by Ken Snyder.\n    function has(name) {\n      if (has[name] !== undef) {\n        // Return cached feature test result.\n        return has[name];\n      }\n      var isSupported;\n      if (name == \"bug-string-char-index\") {\n        // IE <= 7 doesn't support accessing string characters using square\n        // bracket notation. IE 8 only supports this for primitives.\n        isSupported = \"a\"[0] != \"a\";\n      } else if (name == \"json\") {\n        // Indicates whether both `JSON.stringify` and `JSON.parse` are\n        // supported.\n        isSupported = has(\"json-stringify\") && has(\"json-parse\");\n      } else {\n        var value, serialized = '{\"a\":[1,true,false,null,\"\\\\u0000\\\\b\\\\n\\\\f\\\\r\\\\t\"]}';\n        // Test `JSON.stringify`.\n        if (name == \"json-stringify\") {\n          var stringify = exports.stringify, stringifySupported = typeof stringify == \"function\" && isExtended;\n          if (stringifySupported) {\n            // A test function object with a custom `toJSON` method.\n            (value = function () {\n              return 1;\n            }).toJSON = value;\n            try {\n              stringifySupported =\n                // Firefox 3.1b1 and b2 serialize string, number, and boolean\n                // primitives as object literals.\n                stringify(0) === \"0\" &&\n                // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object\n                // literals.\n                stringify(new Number()) === \"0\" &&\n                stringify(new String()) == '\"\"' &&\n                // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or\n                // does not define a canonical JSON representation (this applies to\n                // objects with `toJSON` properties as well, *unless* they are nested\n                // within an object or array).\n                stringify(getClass) === undef &&\n                // IE 8 serializes `undefined` as `\"undefined\"`. Safari <= 5.1.7 and\n                // FF 3.1b3 pass this test.\n                stringify(undef) === undef &&\n                // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s,\n                // respectively, if the value is omitted entirely.\n                stringify() === undef &&\n                // FF 3.1b1, 2 throw an error if the given value is not a number,\n                // string, array, object, Boolean, or `null` literal. This applies to\n                // objects with custom `toJSON` methods as well, unless they are nested\n                // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON`\n                // methods entirely.\n                stringify(value) === \"1\" &&\n                stringify([value]) == \"[1]\" &&\n                // Prototype <= 1.6.1 serializes `[undefined]` as `\"[]\"` instead of\n                // `\"[null]\"`.\n                stringify([undef]) == \"[null]\" &&\n                // YUI 3.0.0b1 fails to serialize `null` literals.\n                stringify(null) == \"null\" &&\n                // FF 3.1b1, 2 halts serialization if an array contains a function:\n                // `[1, true, getClass, 1]` serializes as \"[1,true,],\". FF 3.1b3\n                // elides non-JSON values from objects and arrays, unless they\n                // define custom `toJSON` methods.\n                stringify([undef, getClass, null]) == \"[null,null,null]\" &&\n                // Simple serialization test. FF 3.1b1 uses Unicode escape sequences\n                // where character escape codes are expected (e.g., `\\b` => `\\u0008`).\n                stringify({ \"a\": [value, true, false, null, \"\\x00\\b\\n\\f\\r\\t\"] }) == serialized &&\n                // FF 3.1b1 and b2 ignore the `filter` and `width` arguments.\n                stringify(null, value) === \"1\" &&\n                stringify([1, 2], null, 1) == \"[\\n 1,\\n 2\\n]\" &&\n                // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly\n                // serialize extended years.\n                stringify(new Date(-8.64e15)) == '\"-271821-04-20T00:00:00.000Z\"' &&\n                // The milliseconds are optional in ES 5, but required in 5.1.\n                stringify(new Date(8.64e15)) == '\"+275760-09-13T00:00:00.000Z\"' &&\n                // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative\n                // four-digit years instead of six-digit years. Credits: @Yaffle.\n                stringify(new Date(-621987552e5)) == '\"-000001-01-01T00:00:00.000Z\"' &&\n                // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond\n                // values less than 1000. Credits: @Yaffle.\n                stringify(new Date(-1)) == '\"1969-12-31T23:59:59.999Z\"';\n            } catch (exception) {\n              stringifySupported = false;\n            }\n          }\n          isSupported = stringifySupported;\n        }\n        // Test `JSON.parse`.\n        if (name == \"json-parse\") {\n          var parse = exports.parse;\n          if (typeof parse == \"function\") {\n            try {\n              // FF 3.1b1, b2 will throw an exception if a bare literal is provided.\n              // Conforming implementations should also coerce the initial argument to\n              // a string prior to parsing.\n              if (parse(\"0\") === 0 && !parse(false)) {\n                // Simple parsing test.\n                value = parse(serialized);\n                var parseSupported = value[\"a\"].length == 5 && value[\"a\"][0] === 1;\n                if (parseSupported) {\n                  try {\n                    // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings.\n                    parseSupported = !parse('\"\\t\"');\n                  } catch (exception) {}\n                  if (parseSupported) {\n                    try {\n                      // FF 4.0 and 4.0.1 allow leading `+` signs and leading\n                      // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow\n                      // certain octal literals.\n                      parseSupported = parse(\"01\") !== 1;\n                    } catch (exception) {}\n                  }\n                  if (parseSupported) {\n                    try {\n                      // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal\n                      // points. These environments, along with FF 3.1b1 and 2,\n                      // also allow trailing commas in JSON objects and arrays.\n                      parseSupported = parse(\"1.\") !== 1;\n                    } catch (exception) {}\n                  }\n                }\n              }\n            } catch (exception) {\n              parseSupported = false;\n            }\n          }\n          isSupported = parseSupported;\n        }\n      }\n      return has[name] = !!isSupported;\n    }\n\n    if (!has(\"json\")) {\n      // Common `[[Class]]` name aliases.\n      var functionClass = \"[object Function]\",\n          dateClass = \"[object Date]\",\n          numberClass = \"[object Number]\",\n          stringClass = \"[object String]\",\n          arrayClass = \"[object Array]\",\n          booleanClass = \"[object Boolean]\";\n\n      // Detect incomplete support for accessing string characters by index.\n      var charIndexBuggy = has(\"bug-string-char-index\");\n\n      // Define additional utility methods if the `Date` methods are buggy.\n      if (!isExtended) {\n        var floor = Math.floor;\n        // A mapping between the months of the year and the number of days between\n        // January 1st and the first of the respective month.\n        var Months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];\n        // Internal: Calculates the number of days between the Unix epoch and the\n        // first day of the given month.\n        var getDay = function (year, month) {\n          return Months[month] + 365 * (year - 1970) + floor((year - 1969 + (month = +(month > 1))) / 4) - floor((year - 1901 + month) / 100) + floor((year - 1601 + month) / 400);\n        };\n      }\n\n      // Internal: Determines if a property is a direct property of the given\n      // object. Delegates to the native `Object#hasOwnProperty` method.\n      if (!(isProperty = objectProto.hasOwnProperty)) {\n        isProperty = function (property) {\n          var members = {}, constructor;\n          if ((members.__proto__ = null, members.__proto__ = {\n            // The *proto* property cannot be set multiple times in recent\n            // versions of Firefox and SeaMonkey.\n            \"toString\": 1\n          }, members).toString != getClass) {\n            // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but\n            // supports the mutable *proto* property.\n            isProperty = function (property) {\n              // Capture and break the object's prototype chain (see section 8.6.2\n              // of the ES 5.1 spec). The parenthesized expression prevents an\n              // unsafe transformation by the Closure Compiler.\n              var original = this.__proto__, result = property in (this.__proto__ = null, this);\n              // Restore the original prototype chain.\n              this.__proto__ = original;\n              return result;\n            };\n          } else {\n            // Capture a reference to the top-level `Object` constructor.\n            constructor = members.constructor;\n            // Use the `constructor` property to simulate `Object#hasOwnProperty` in\n            // other environments.\n            isProperty = function (property) {\n              var parent = (this.constructor || constructor).prototype;\n              return property in this && !(property in parent && this[property] === parent[property]);\n            };\n          }\n          members = null;\n          return isProperty.call(this, property);\n        };\n      }\n\n      // Internal: Normalizes the `for...in` iteration algorithm across\n      // environments. Each enumerated key is yielded to a `callback` function.\n      forEach = function (object, callback) {\n        var size = 0, Properties, members, property;\n\n        // Tests for bugs in the current environment's `for...in` algorithm. The\n        // `valueOf` property inherits the non-enumerable flag from\n        // `Object.prototype` in older versions of IE, Netscape, and Mozilla.\n        (Properties = function () {\n          this.valueOf = 0;\n        }).prototype.valueOf = 0;\n\n        // Iterate over a new instance of the `Properties` class.\n        members = new Properties();\n        for (property in members) {\n          // Ignore all properties inherited from `Object.prototype`.\n          if (isProperty.call(members, property)) {\n            size++;\n          }\n        }\n        Properties = members = null;\n\n        // Normalize the iteration algorithm.\n        if (!size) {\n          // A list of non-enumerable properties inherited from `Object.prototype`.\n          members = [\"valueOf\", \"toString\", \"toLocaleString\", \"propertyIsEnumerable\", \"isPrototypeOf\", \"hasOwnProperty\", \"constructor\"];\n          // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable\n          // properties.\n          forEach = function (object, callback) {\n            var isFunction = getClass.call(object) == functionClass, property, length;\n            var hasProperty = !isFunction && typeof object.constructor != \"function\" && objectTypes[typeof object.hasOwnProperty] && object.hasOwnProperty || isProperty;\n            for (property in object) {\n              // Gecko <= 1.0 enumerates the `prototype` property of functions under\n              // certain conditions; IE does not.\n              if (!(isFunction && property == \"prototype\") && hasProperty.call(object, property)) {\n                callback(property);\n              }\n            }\n            // Manually invoke the callback for each non-enumerable property.\n            for (length = members.length; property = members[--length]; hasProperty.call(object, property) && callback(property));\n          };\n        } else if (size == 2) {\n          // Safari <= 2.0.4 enumerates shadowed properties twice.\n          forEach = function (object, callback) {\n            // Create a set of iterated properties.\n            var members = {}, isFunction = getClass.call(object) == functionClass, property;\n            for (property in object) {\n              // Store each property name to prevent double enumeration. The\n              // `prototype` property of functions is not enumerated due to cross-\n              // environment inconsistencies.\n              if (!(isFunction && property == \"prototype\") && !isProperty.call(members, property) && (members[property] = 1) && isProperty.call(object, property)) {\n                callback(property);\n              }\n            }\n          };\n        } else {\n          // No bugs detected; use the standard `for...in` algorithm.\n          forEach = function (object, callback) {\n            var isFunction = getClass.call(object) == functionClass, property, isConstructor;\n            for (property in object) {\n              if (!(isFunction && property == \"prototype\") && isProperty.call(object, property) && !(isConstructor = property === \"constructor\")) {\n                callback(property);\n              }\n            }\n            // Manually invoke the callback for the `constructor` property due to\n            // cross-environment inconsistencies.\n            if (isConstructor || isProperty.call(object, (property = \"constructor\"))) {\n              callback(property);\n            }\n          };\n        }\n        return forEach(object, callback);\n      };\n\n      // Public: Serializes a JavaScript `value` as a JSON string. The optional\n      // `filter` argument may specify either a function that alters how object and\n      // array members are serialized, or an array of strings and numbers that\n      // indicates which properties should be serialized. The optional `width`\n      // argument may be either a string or number that specifies the indentation\n      // level of the output.\n      if (!has(\"json-stringify\")) {\n        // Internal: A map of control characters and their escaped equivalents.\n        var Escapes = {\n          92: \"\\\\\\\\\",\n          34: '\\\\\"',\n          8: \"\\\\b\",\n          12: \"\\\\f\",\n          10: \"\\\\n\",\n          13: \"\\\\r\",\n          9: \"\\\\t\"\n        };\n\n        // Internal: Converts `value` into a zero-padded string such that its\n        // length is at least equal to `width`. The `width` must be <= 6.\n        var leadingZeroes = \"000000\";\n        var toPaddedString = function (width, value) {\n          // The `|| 0` expression is necessary to work around a bug in\n          // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== \"0\"`.\n          return (leadingZeroes + (value || 0)).slice(-width);\n        };\n\n        // Internal: Double-quotes a string `value`, replacing all ASCII control\n        // characters (characters with code unit values between 0 and 31) with\n        // their escaped equivalents. This is an implementation of the\n        // `Quote(value)` operation defined in ES 5.1 section 15.12.3.\n        var unicodePrefix = \"\\\\u00\";\n        var quote = function (value) {\n          var result = '\"', index = 0, length = value.length, useCharIndex = !charIndexBuggy || length > 10;\n          var symbols = useCharIndex && (charIndexBuggy ? value.split(\"\") : value);\n          for (; index < length; index++) {\n            var charCode = value.charCodeAt(index);\n            // If the character is a control character, append its Unicode or\n            // shorthand escape sequence; otherwise, append the character as-is.\n            switch (charCode) {\n              case 8: case 9: case 10: case 12: case 13: case 34: case 92:\n                result += Escapes[charCode];\n                break;\n              default:\n                if (charCode < 32) {\n                  result += unicodePrefix + toPaddedString(2, charCode.toString(16));\n                  break;\n                }\n                result += useCharIndex ? symbols[index] : value.charAt(index);\n            }\n          }\n          return result + '\"';\n        };\n\n        // Internal: Recursively serializes an object. Implements the\n        // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations.\n        var serialize = function (property, object, callback, properties, whitespace, indentation, stack) {\n          var value, className, year, month, date, time, hours, minutes, seconds, milliseconds, results, element, index, length, prefix, result;\n          try {\n            // Necessary for host object support.\n            value = object[property];\n          } catch (exception) {}\n          if (typeof value == \"object\" && value) {\n            className = getClass.call(value);\n            if (className == dateClass && !isProperty.call(value, \"toJSON\")) {\n              if (value > -1 / 0 && value < 1 / 0) {\n                // Dates are serialized according to the `Date#toJSON` method\n                // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15\n                // for the ISO 8601 date time string format.\n                if (getDay) {\n                  // Manually compute the year, month, date, hours, minutes,\n                  // seconds, and milliseconds if the `getUTC*` methods are\n                  // buggy. Adapted from @Yaffle's `date-shim` project.\n                  date = floor(value / 864e5);\n                  for (year = floor(date / 365.2425) + 1970 - 1; getDay(year + 1, 0) <= date; year++);\n                  for (month = floor((date - getDay(year, 0)) / 30.42); getDay(year, month + 1) <= date; month++);\n                  date = 1 + date - getDay(year, month);\n                  // The `time` value specifies the time within the day (see ES\n                  // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used\n                  // to compute `A modulo B`, as the `%` operator does not\n                  // correspond to the `modulo` operation for negative numbers.\n                  time = (value % 864e5 + 864e5) % 864e5;\n                  // The hours, minutes, seconds, and milliseconds are obtained by\n                  // decomposing the time within the day. See section 15.9.1.10.\n                  hours = floor(time / 36e5) % 24;\n                  minutes = floor(time / 6e4) % 60;\n                  seconds = floor(time / 1e3) % 60;\n                  milliseconds = time % 1e3;\n                } else {\n                  year = value.getUTCFullYear();\n                  month = value.getUTCMonth();\n                  date = value.getUTCDate();\n                  hours = value.getUTCHours();\n                  minutes = value.getUTCMinutes();\n                  seconds = value.getUTCSeconds();\n                  milliseconds = value.getUTCMilliseconds();\n                }\n                // Serialize extended years correctly.\n                value = (year <= 0 || year >= 1e4 ? (year < 0 ? \"-\" : \"+\") + toPaddedString(6, year < 0 ? -year : year) : toPaddedString(4, year)) +\n                  \"-\" + toPaddedString(2, month + 1) + \"-\" + toPaddedString(2, date) +\n                  // Months, dates, hours, minutes, and seconds should have two\n                  // digits; milliseconds should have three.\n                  \"T\" + toPaddedString(2, hours) + \":\" + toPaddedString(2, minutes) + \":\" + toPaddedString(2, seconds) +\n                  // Milliseconds are optional in ES 5.0, but required in 5.1.\n                  \".\" + toPaddedString(3, milliseconds) + \"Z\";\n              } else {\n                value = null;\n              }\n            } else if (typeof value.toJSON == \"function\" && ((className != numberClass && className != stringClass && className != arrayClass) || isProperty.call(value, \"toJSON\"))) {\n              // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the\n              // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3\n              // ignores all `toJSON` methods on these objects unless they are\n              // defined directly on an instance.\n              value = value.toJSON(property);\n            }\n          }\n          if (callback) {\n            // If a replacement function was provided, call it to obtain the value\n            // for serialization.\n            value = callback.call(object, property, value);\n          }\n          if (value === null) {\n            return \"null\";\n          }\n          className = getClass.call(value);\n          if (className == booleanClass) {\n            // Booleans are represented literally.\n            return \"\" + value;\n          } else if (className == numberClass) {\n            // JSON numbers must be finite. `Infinity` and `NaN` are serialized as\n            // `\"null\"`.\n            return value > -1 / 0 && value < 1 / 0 ? \"\" + value : \"null\";\n          } else if (className == stringClass) {\n            // Strings are double-quoted and escaped.\n            return quote(\"\" + value);\n          }\n          // Recursively serialize objects and arrays.\n          if (typeof value == \"object\") {\n            // Check for cyclic structures. This is a linear search; performance\n            // is inversely proportional to the number of unique nested objects.\n            for (length = stack.length; length--;) {\n              if (stack[length] === value) {\n                // Cyclic structures cannot be serialized by `JSON.stringify`.\n                throw TypeError();\n              }\n            }\n            // Add the object to the stack of traversed objects.\n            stack.push(value);\n            results = [];\n            // Save the current indentation level and indent one additional level.\n            prefix = indentation;\n            indentation += whitespace;\n            if (className == arrayClass) {\n              // Recursively serialize array elements.\n              for (index = 0, length = value.length; index < length; index++) {\n                element = serialize(index, value, callback, properties, whitespace, indentation, stack);\n                results.push(element === undef ? \"null\" : element);\n              }\n              result = results.length ? (whitespace ? \"[\\n\" + indentation + results.join(\",\\n\" + indentation) + \"\\n\" + prefix + \"]\" : (\"[\" + results.join(\",\") + \"]\")) : \"[]\";\n            } else {\n              // Recursively serialize object members. Members are selected from\n              // either a user-specified list of property names, or the object\n              // itself.\n              forEach(properties || value, function (property) {\n                var element = serialize(property, value, callback, properties, whitespace, indentation, stack);\n                if (element !== undef) {\n                  // According to ES 5.1 section 15.12.3: \"If `gap` {whitespace}\n                  // is not the empty string, let `member` {quote(property) + \":\"}\n                  // be the concatenation of `member` and the `space` character.\"\n                  // The \"`space` character\" refers to the literal space\n                  // character, not the `space` {width} argument provided to\n                  // `JSON.stringify`.\n                  results.push(quote(property) + \":\" + (whitespace ? \" \" : \"\") + element);\n                }\n              });\n              result = results.length ? (whitespace ? \"{\\n\" + indentation + results.join(\",\\n\" + indentation) + \"\\n\" + prefix + \"}\" : (\"{\" + results.join(\",\") + \"}\")) : \"{}\";\n            }\n            // Remove the object from the traversed object stack.\n            stack.pop();\n            return result;\n          }\n        };\n\n        // Public: `JSON.stringify`. See ES 5.1 section 15.12.3.\n        exports.stringify = function (source, filter, width) {\n          var whitespace, callback, properties, className;\n          if (objectTypes[typeof filter] && filter) {\n            if ((className = getClass.call(filter)) == functionClass) {\n              callback = filter;\n            } else if (className == arrayClass) {\n              // Convert the property names array into a makeshift set.\n              properties = {};\n              for (var index = 0, length = filter.length, value; index < length; value = filter[index++], ((className = getClass.call(value)), className == stringClass || className == numberClass) && (properties[value] = 1));\n            }\n          }\n          if (width) {\n            if ((className = getClass.call(width)) == numberClass) {\n              // Convert the `width` to an integer and create a string containing\n              // `width` number of space characters.\n              if ((width -= width % 1) > 0) {\n                for (whitespace = \"\", width > 10 && (width = 10); whitespace.length < width; whitespace += \" \");\n              }\n            } else if (className == stringClass) {\n              whitespace = width.length <= 10 ? width : width.slice(0, 10);\n            }\n          }\n          // Opera <= 7.54u2 discards the values associated with empty string keys\n          // (`\"\"`) only if they are used directly within an object member list\n          // (e.g., `!(\"\" in { \"\": 1})`).\n          return serialize(\"\", (value = {}, value[\"\"] = source, value), callback, properties, whitespace, \"\", []);\n        };\n      }\n\n      // Public: Parses a JSON source string.\n      if (!has(\"json-parse\")) {\n        var fromCharCode = String.fromCharCode;\n\n        // Internal: A map of escaped control characters and their unescaped\n        // equivalents.\n        var Unescapes = {\n          92: \"\\\\\",\n          34: '\"',\n          47: \"/\",\n          98: \"\\b\",\n          116: \"\\t\",\n          110: \"\\n\",\n          102: \"\\f\",\n          114: \"\\r\"\n        };\n\n        // Internal: Stores the parser state.\n        var Index, Source;\n\n        // Internal: Resets the parser state and throws a `SyntaxError`.\n        var abort = function () {\n          Index = Source = null;\n          throw SyntaxError();\n        };\n\n        // Internal: Returns the next token, or `\"$\"` if the parser has reached\n        // the end of the source string. A token may be a string, number, `null`\n        // literal, or Boolean literal.\n        var lex = function () {\n          var source = Source, length = source.length, value, begin, position, isSigned, charCode;\n          while (Index < length) {\n            charCode = source.charCodeAt(Index);\n            switch (charCode) {\n              case 9: case 10: case 13: case 32:\n                // Skip whitespace tokens, including tabs, carriage returns, line\n                // feeds, and space characters.\n                Index++;\n                break;\n              case 123: case 125: case 91: case 93: case 58: case 44:\n                // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at\n                // the current position.\n                value = charIndexBuggy ? source.charAt(Index) : source[Index];\n                Index++;\n                return value;\n              case 34:\n                // `\"` delimits a JSON string; advance to the next character and\n                // begin parsing the string. String tokens are prefixed with the\n                // sentinel `@` character to distinguish them from punctuators and\n                // end-of-string tokens.\n                for (value = \"@\", Index++; Index < length;) {\n                  charCode = source.charCodeAt(Index);\n                  if (charCode < 32) {\n                    // Unescaped ASCII control characters (those with a code unit\n                    // less than the space character) are not permitted.\n                    abort();\n                  } else if (charCode == 92) {\n                    // A reverse solidus (`\\`) marks the beginning of an escaped\n                    // control character (including `\"`, `\\`, and `/`) or Unicode\n                    // escape sequence.\n                    charCode = source.charCodeAt(++Index);\n                    switch (charCode) {\n                      case 92: case 34: case 47: case 98: case 116: case 110: case 102: case 114:\n                        // Revive escaped control characters.\n                        value += Unescapes[charCode];\n                        Index++;\n                        break;\n                      case 117:\n                        // `\\u` marks the beginning of a Unicode escape sequence.\n                        // Advance to the first character and validate the\n                        // four-digit code point.\n                        begin = ++Index;\n                        for (position = Index + 4; Index < position; Index++) {\n                          charCode = source.charCodeAt(Index);\n                          // A valid sequence comprises four hexdigits (case-\n                          // insensitive) that form a single hexadecimal value.\n                          if (!(charCode >= 48 && charCode <= 57 || charCode >= 97 && charCode <= 102 || charCode >= 65 && charCode <= 70)) {\n                            // Invalid Unicode escape sequence.\n                            abort();\n                          }\n                        }\n                        // Revive the escaped character.\n                        value += fromCharCode(\"0x\" + source.slice(begin, Index));\n                        break;\n                      default:\n                        // Invalid escape sequence.\n                        abort();\n                    }\n                  } else {\n                    if (charCode == 34) {\n                      // An unescaped double-quote character marks the end of the\n                      // string.\n                      break;\n                    }\n                    charCode = source.charCodeAt(Index);\n                    begin = Index;\n                    // Optimize for the common case where a string is valid.\n                    while (charCode >= 32 && charCode != 92 && charCode != 34) {\n                      charCode = source.charCodeAt(++Index);\n                    }\n                    // Append the string as-is.\n                    value += source.slice(begin, Index);\n                  }\n                }\n                if (source.charCodeAt(Index) == 34) {\n                  // Advance to the next character and return the revived string.\n                  Index++;\n                  return value;\n                }\n                // Unterminated string.\n                abort();\n              default:\n                // Parse numbers and literals.\n                begin = Index;\n                // Advance past the negative sign, if one is specified.\n                if (charCode == 45) {\n                  isSigned = true;\n                  charCode = source.charCodeAt(++Index);\n                }\n                // Parse an integer or floating-point value.\n                if (charCode >= 48 && charCode <= 57) {\n                  // Leading zeroes are interpreted as octal literals.\n                  if (charCode == 48 && ((charCode = source.charCodeAt(Index + 1)), charCode >= 48 && charCode <= 57)) {\n                    // Illegal octal literal.\n                    abort();\n                  }\n                  isSigned = false;\n                  // Parse the integer component.\n                  for (; Index < length && ((charCode = source.charCodeAt(Index)), charCode >= 48 && charCode <= 57); Index++);\n                  // Floats cannot contain a leading decimal point; however, this\n                  // case is already accounted for by the parser.\n                  if (source.charCodeAt(Index) == 46) {\n                    position = ++Index;\n                    // Parse the decimal component.\n                    for (; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);\n                    if (position == Index) {\n                      // Illegal trailing decimal.\n                      abort();\n                    }\n                    Index = position;\n                  }\n                  // Parse exponents. The `e` denoting the exponent is\n                  // case-insensitive.\n                  charCode = source.charCodeAt(Index);\n                  if (charCode == 101 || charCode == 69) {\n                    charCode = source.charCodeAt(++Index);\n                    // Skip past the sign following the exponent, if one is\n                    // specified.\n                    if (charCode == 43 || charCode == 45) {\n                      Index++;\n                    }\n                    // Parse the exponential component.\n                    for (position = Index; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);\n                    if (position == Index) {\n                      // Illegal empty exponent.\n                      abort();\n                    }\n                    Index = position;\n                  }\n                  // Coerce the parsed value to a JavaScript number.\n                  return +source.slice(begin, Index);\n                }\n                // A negative sign may only precede numbers.\n                if (isSigned) {\n                  abort();\n                }\n                // `true`, `false`, and `null` literals.\n                if (source.slice(Index, Index + 4) == \"true\") {\n                  Index += 4;\n                  return true;\n                } else if (source.slice(Index, Index + 5) == \"false\") {\n                  Index += 5;\n                  return false;\n                } else if (source.slice(Index, Index + 4) == \"null\") {\n                  Index += 4;\n                  return null;\n                }\n                // Unrecognized token.\n                abort();\n            }\n          }\n          // Return the sentinel `$` character if the parser has reached the end\n          // of the source string.\n          return \"$\";\n        };\n\n        // Internal: Parses a JSON `value` token.\n        var get = function (value) {\n          var results, hasMembers;\n          if (value == \"$\") {\n            // Unexpected end of input.\n            abort();\n          }\n          if (typeof value == \"string\") {\n            if ((charIndexBuggy ? value.charAt(0) : value[0]) == \"@\") {\n              // Remove the sentinel `@` character.\n              return value.slice(1);\n            }\n            // Parse object and array literals.\n            if (value == \"[\") {\n              // Parses a JSON array, returning a new JavaScript array.\n              results = [];\n              for (;; hasMembers || (hasMembers = true)) {\n                value = lex();\n                // A closing square bracket marks the end of the array literal.\n                if (value == \"]\") {\n                  break;\n                }\n                // If the array literal contains elements, the current token\n                // should be a comma separating the previous element from the\n                // next.\n                if (hasMembers) {\n                  if (value == \",\") {\n                    value = lex();\n                    if (value == \"]\") {\n                      // Unexpected trailing `,` in array literal.\n                      abort();\n                    }\n                  } else {\n                    // A `,` must separate each array element.\n                    abort();\n                  }\n                }\n                // Elisions and leading commas are not permitted.\n                if (value == \",\") {\n                  abort();\n                }\n                results.push(get(value));\n              }\n              return results;\n            } else if (value == \"{\") {\n              // Parses a JSON object, returning a new JavaScript object.\n              results = {};\n              for (;; hasMembers || (hasMembers = true)) {\n                value = lex();\n                // A closing curly brace marks the end of the object literal.\n                if (value == \"}\") {\n                  break;\n                }\n                // If the object literal contains members, the current token\n                // should be a comma separator.\n                if (hasMembers) {\n                  if (value == \",\") {\n                    value = lex();\n                    if (value == \"}\") {\n                      // Unexpected trailing `,` in object literal.\n                      abort();\n                    }\n                  } else {\n                    // A `,` must separate each object member.\n                    abort();\n                  }\n                }\n                // Leading commas are not permitted, object property names must be\n                // double-quoted strings, and a `:` must separate each property\n                // name and value.\n                if (value == \",\" || typeof value != \"string\" || (charIndexBuggy ? value.charAt(0) : value[0]) != \"@\" || lex() != \":\") {\n                  abort();\n                }\n                results[value.slice(1)] = get(lex());\n              }\n              return results;\n            }\n            // Unexpected token encountered.\n            abort();\n          }\n          return value;\n        };\n\n        // Internal: Updates a traversed object member.\n        var update = function (source, property, callback) {\n          var element = walk(source, property, callback);\n          if (element === undef) {\n            delete source[property];\n          } else {\n            source[property] = element;\n          }\n        };\n\n        // Internal: Recursively traverses a parsed JSON object, invoking the\n        // `callback` function for each value. This is an implementation of the\n        // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2.\n        var walk = function (source, property, callback) {\n          var value = source[property], length;\n          if (typeof value == \"object\" && value) {\n            // `forEach` can't be used to traverse an array in Opera <= 8.54\n            // because its `Object#hasOwnProperty` implementation returns `false`\n            // for array indices (e.g., `![1, 2, 3].hasOwnProperty(\"0\")`).\n            if (getClass.call(value) == arrayClass) {\n              for (length = value.length; length--;) {\n                update(value, length, callback);\n              }\n            } else {\n              forEach(value, function (property) {\n                update(value, property, callback);\n              });\n            }\n          }\n          return callback.call(source, property, value);\n        };\n\n        // Public: `JSON.parse`. See ES 5.1 section 15.12.2.\n        exports.parse = function (source, callback) {\n          var result, value;\n          Index = 0;\n          Source = \"\" + source;\n          result = get(lex());\n          // If a JSON string contains multiple tokens, it is invalid.\n          if (lex() != \"$\") {\n            abort();\n          }\n          // Reset the parser state.\n          Index = Source = null;\n          return callback && getClass.call(callback) == functionClass ? walk((value = {}, value[\"\"] = result, value), \"\", callback) : result;\n        };\n      }\n    }\n\n    exports[\"runInContext\"] = runInContext;\n    return exports;\n  }\n\n  if (freeExports && !isLoader) {\n    // Export for CommonJS environments.\n    runInContext(root, freeExports);\n  } else {\n    // Export for web browsers and JavaScript engines.\n    var nativeJSON = root.JSON,\n        previousJSON = root[\"JSON3\"],\n        isRestored = false;\n\n    var JSON3 = runInContext(root, (root[\"JSON3\"] = {\n      // Public: Restores the original value of the global `JSON` object and\n      // returns a reference to the `JSON3` object.\n      \"noConflict\": function () {\n        if (!isRestored) {\n          isRestored = true;\n          root.JSON = nativeJSON;\n          root[\"JSON3\"] = previousJSON;\n          nativeJSON = previousJSON = null;\n        }\n        return JSON3;\n      }\n    }));\n\n    root.JSON = {\n      \"parse\": JSON3.parse,\n      \"stringify\": JSON3.stringify\n    };\n  }\n\n  // Export for asynchronous module loaders.\n  if (isLoader) {\n    define(function () {\n      return JSON3;\n    });\n  }\n}).call(this);\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],35:[function(require,module,exports){\nvar L = require('leaflet'),\n\tNominatim = require('./geocoders/nominatim').class;\n\nmodule.exports = {\n\tclass: L.Control.extend({\n\t\toptions: {\n\t\t\tshowResultIcons: false,\n\t\t\tcollapsed: true,\n\t\t\texpand: 'click',\n\t\t\tposition: 'topright',\n\t\t\tplaceholder: 'Search...',\n\t\t\terrorMessage: 'Nothing found.'\n\t\t},\n\n\t\t_callbackId: 0,\n\n\t\tinitialize: function (options) {\n\t\t\tL.Util.setOptions(this, options);\n\t\t\tif (!this.options.geocoder) {\n\t\t\t\tthis.options.geocoder = new Nominatim();\n\t\t\t}\n\t\t},\n\n\t\tonAdd: function (map) {\n\t\t\tvar className = 'leaflet-control-geocoder',\n\t\t\t    container = L.DomUtil.create('div', className + ' leaflet-bar'),\n\t\t\t    icon = L.DomUtil.create('a', 'leaflet-control-geocoder-icon', container),\n\t\t\t    form = this._form = L.DomUtil.create('form', className + '-form', container),\n\t\t\t    input;\n\n\t\t\ticon.innerHTML = '&nbsp;';\n\t\t\ticon.href = 'javascript:void(0);';\n\t\t\tthis._map = map;\n\t\t\tthis._container = container;\n\t\t\tinput = this._input = L.DomUtil.create('input');\n\t\t\tinput.type = 'text';\n\t\t\tinput.placeholder = this.options.placeholder;\n\n\t\t\tL.DomEvent.addListener(input, 'keydown', this._keydown, this);\n\t\t\t//L.DomEvent.addListener(input, 'onpaste', this._clearResults, this);\n\t\t\t//L.DomEvent.addListener(input, 'oninput', this._clearResults, this);\n\n\t\t\tthis._errorElement = document.createElement('div');\n\t\t\tthis._errorElement.className = className + '-form-no-error';\n\t\t\tthis._errorElement.innerHTML = this.options.errorMessage;\n\n\t\t\tthis._alts = L.DomUtil.create('ul', className + '-alternatives leaflet-control-geocoder-alternatives-minimized');\n\n\t\t\tform.appendChild(input);\n\t\t\tthis._container.appendChild(this._errorElement);\n\t\t\tcontainer.appendChild(this._alts);\n\n\t\t\tL.DomEvent.addListener(form, 'submit', this._geocode, this);\n\n\t\t\tif (this.options.collapsed) {\n\t\t\t\tif (this.options.expand === 'click') {\n\t\t\t\t\tL.DomEvent.addListener(icon, 'click', function(e) {\n\t\t\t\t\t\t// TODO: touch\n\t\t\t\t\t\tif (e.button === 0 && e.detail !== 2) {\n\t\t\t\t\t\t\tthis._toggle();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, this);\n\t\t\t\t} else {\n\t\t\t\t\tL.DomEvent.addListener(icon, 'mouseover', this._expand, this);\n\t\t\t\t\tL.DomEvent.addListener(icon, 'mouseout', this._collapse, this);\n\t\t\t\t\tthis._map.on('movestart', this._collapse, this);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tL.DomEvent.addListener(icon, 'click', function(e) {\n\t\t\t\t\tthis._geocode(e);\n\t\t\t\t}, this);\n\t\t\t\tthis._expand();\n\t\t\t}\n\n\t\t\tL.DomEvent.disableClickPropagation(container);\n\n\t\t\treturn container;\n\t\t},\n\n\t\t_geocodeResult: function (results) {\n\t\t\tL.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-throbber');\n\t\t\tif (results.length === 1) {\n\t\t\t\tthis._geocodeResultSelected(results[0]);\n\t\t\t} else if (results.length > 0) {\n\t\t\t\tthis._alts.innerHTML = '';\n\t\t\t\tthis._results = results;\n\t\t\t\tL.DomUtil.removeClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized');\n\t\t\t\tfor (var i = 0; i < results.length; i++) {\n\t\t\t\t\tthis._alts.appendChild(this._createAlt(results[i], i));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tL.DomUtil.addClass(this._errorElement, 'leaflet-control-geocoder-error');\n\t\t\t}\n\t\t},\n\n\t\tmarkGeocode: function(result) {\n\t\t\tthis._map.fitBounds(result.bbox);\n\n\t\t\tif (this._geocodeMarker) {\n\t\t\t\tthis._map.removeLayer(this._geocodeMarker);\n\t\t\t}\n\n\t\t\tthis._geocodeMarker = new L.Marker(result.center)\n\t\t\t\t.bindPopup(result.html || result.name)\n\t\t\t\t.addTo(this._map)\n\t\t\t\t.openPopup();\n\n\t\t\treturn this;\n\t\t},\n\n\t\t_geocode: function(event) {\n\t\t\tL.DomEvent.preventDefault(event);\n\n\t\t\tL.DomUtil.addClass(this._container, 'leaflet-control-geocoder-throbber');\n\t\t\tthis._clearResults();\n\t\t\tthis.options.geocoder.geocode(this._input.value, this._geocodeResult, this);\n\n\t\t\treturn false;\n\t\t},\n\n\t\t_geocodeResultSelected: function(result) {\n\t\t\tif (this.options.collapsed) {\n\t\t\t\tthis._collapse();\n\t\t\t} else {\n\t\t\t\tthis._clearResults();\n\t\t\t}\n\t\t\tthis.markGeocode(result);\n\t\t},\n\n\t\t_toggle: function() {\n\t\t\tif (this._container.className.indexOf('leaflet-control-geocoder-expanded') >= 0) {\n\t\t\t\tthis._collapse();\n\t\t\t} else {\n\t\t\t\tthis._expand();\n\t\t\t}\n\t\t},\n\n\t\t_expand: function () {\n\t\t\tL.DomUtil.addClass(this._container, 'leaflet-control-geocoder-expanded');\n\t\t\tthis._input.select();\n\t\t},\n\n\t\t_collapse: function () {\n\t\t\tthis._container.className = this._container.className.replace(' leaflet-control-geocoder-expanded', '');\n\t\t\tL.DomUtil.addClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized');\n\t\t\tL.DomUtil.removeClass(this._errorElement, 'leaflet-control-geocoder-error');\n\t\t},\n\n\t\t_clearResults: function () {\n\t\t\tL.DomUtil.addClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized');\n\t\t\tthis._selection = null;\n\t\t\tL.DomUtil.removeClass(this._errorElement, 'leaflet-control-geocoder-error');\n\t\t},\n\n\t\t_createAlt: function(result, index) {\n\t\t\tvar li = L.DomUtil.create('li', ''),\n\t\t\t\ta = L.DomUtil.create('a', '', li),\n\t\t\t    icon = this.options.showResultIcons && result.icon ? L.DomUtil.create('img', '', a) : null,\n\t\t\t    text = result.html ? undefined : document.createTextNode(result.name),\n\t\t\t    clickHandler = function clickHandler(e) {\n\t\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t\t\tthis._geocodeResultSelected(result);\n\t\t\t\t};\n\n\t\t\tif (icon) {\n\t\t\t\ticon.src = result.icon;\n\t\t\t}\n\n\t\t\tli.setAttribute('data-result-index', index);\n\n\t\t\tif (result.html) {\n\t\t\t\ta.innerHTML = result.html;\n\t\t\t} else {\n\t\t\t\ta.appendChild(text);\n\t\t\t}\n\n\t\t\tL.DomEvent.addListener(li, 'click', clickHandler, this);\n\n\t\t\treturn li;\n\t\t},\n\n\t\t_keydown: function(e) {\n\t\t\tvar _this = this,\n\t\t\t    select = function select(dir) {\n\t\t\t\t\tif (_this._selection) {\n\t\t\t\t\t\tL.DomUtil.removeClass(_this._selection, 'leaflet-control-geocoder-selected');\n\t\t\t\t\t\t_this._selection = _this._selection[dir > 0 ? 'nextSibling' : 'previousSibling'];\n\t\t\t\t\t}\n\t\t\t\t\tif (!_this._selection) {\n\t\t\t\t\t\t_this._selection = _this._alts[dir > 0 ? 'firstChild' : 'lastChild'];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (_this._selection) {\n\t\t\t\t\t\tL.DomUtil.addClass(_this._selection, 'leaflet-control-geocoder-selected');\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\tswitch (e.keyCode) {\n\t\t\t// Escape\n\t\t\tcase 27:\n\t\t\t\tif (this.options.collapsed) {\n\t\t\t\t\tthis._collapse();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t// Up\n\t\t\tcase 38:\n\t\t\t\tselect(-1);\n\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t\tbreak;\n\t\t\t// Up\n\t\t\tcase 40:\n\t\t\t\tselect(1);\n\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t\tbreak;\n\t\t\t// Enter\n\t\t\tcase 13:\n\t\t\t\tif (this._selection) {\n\t\t\t\t\tvar index = parseInt(this._selection.getAttribute('data-result-index'), 10);\n\t\t\t\t\tthis._geocodeResultSelected(this._results[index]);\n\t\t\t\t\tthis._clearResults();\n\t\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}),\n\tfactory: function(options) {\n\t\treturn new L.Control.Geocoder(options);\n\t}\n};\n\n},{\"./geocoders/nominatim\":40,\"leaflet\":57}],36:[function(require,module,exports){\nvar L = require('leaflet'),\n\tUtil = require('../util');\n\nmodule.exports = {\n\tclass: L.Class.extend({\n\t\tinitialize: function(key) {\n\t\t\tthis.key = key;\n\t\t},\n\n\t\tgeocode : function (query, cb, context) {\n\t\t\tUtil.jsonp('//dev.virtualearth.net/REST/v1/Locations', {\n\t\t\t\tquery: query,\n\t\t\t\tkey : this.key\n\t\t\t}, function(data) {\n\t\t\t\tvar results = [];\n\t\t\t\tif( data.resourceSets.length > 0 ){\n\t\t\t\t\tfor (var i = data.resourceSets[0].resources.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tvar resource = data.resourceSets[0].resources[i],\n\t\t\t\t\t\t\tbbox = resource.bbox;\n\t\t\t\t\t\tresults[i] = {\n\t\t\t\t\t\t\tname: resource.name,\n\t\t\t\t\t\t\tbbox: L.latLngBounds([bbox[0], bbox[1]], [bbox[2], bbox[3]]),\n\t\t\t\t\t\t\tcenter: L.latLng(resource.point.coordinates)\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcb.call(context, results);\n\t\t\t}, this, 'jsonp');\n\t\t},\n\n\t\treverse: function(location, scale, cb, context) {\n\t\t\tUtil.jsonp('//dev.virtualearth.net/REST/v1/Locations/' + location.lat + ',' + location.lng, {\n\t\t\t\tkey : this.key\n\t\t\t}, function(data) {\n\t\t\t\tvar results = [];\n\t\t\t\tfor (var i = data.resourceSets[0].resources.length - 1; i >= 0; i--) {\n\t\t\t\t\tvar resource = data.resourceSets[0].resources[i],\n\t\t\t\t\t\tbbox = resource.bbox;\n\t\t\t\t\tresults[i] = {\n\t\t\t\t\t\tname: resource.name,\n\t\t\t\t\t\tbbox: L.latLngBounds([bbox[0], bbox[1]], [bbox[2], bbox[3]]),\n\t\t\t\t\t\tcenter: L.latLng(resource.point.coordinates)\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcb.call(context, results);\n\t\t\t}, this, 'jsonp');\n\t\t}\n\t}),\n\n\tfactory: function(key) {\n\t\treturn new L.Control.Geocoder.Bing(key);\n\t}\n};\n\n},{\"../util\":44,\"leaflet\":57}],37:[function(require,module,exports){\nvar L = require('leaflet'),\n\tUtil = require('../util');\n\nmodule.exports = {\n\tclass: L.Class.extend({\n\t\toptions: {\n\t\t\tserviceUrl: 'https://maps.googleapis.com/maps/api/geocode/json',\n\t\t\tgeocodingQueryParams: {},\n\t\t\treverseQueryParams: {}\n\t\t},\n\n\t\tinitialize: function(key, options) {\n\t\t\tthis._key = key;\n\t\t\tL.setOptions(this, options);\n\t\t\t// Backwards compatibility\n\t\t\tthis.options.serviceUrl = this.options.service_url || this.options.serviceUrl;\n\t\t},\n\n\t\tgeocode: function(query, cb, context) {\n\t\t\tvar params = {\n\t\t\t\taddress: query,\n\t\t\t};\n\n\t\t\tif (this._key && this._key.length) {\n\t\t\t\tparams.key = this._key;\n\t\t\t}\n\n\t\t\tparams = L.Util.extend(params, this.options.geocodingQueryParams);\n\n\t\t\tUtil.getJSON(this.options.serviceUrl, params, function(data) {\n\t\t\t\tvar results = [],\n\t\t\t\t\t\tloc,\n\t\t\t\t\t\tlatLng,\n\t\t\t\t\t\tlatLngBounds;\n\t\t\t\tif (data.results && data.results.length) {\n\t\t\t\t\tfor (var i = 0; i <= data.results.length - 1; i++) {\n\t\t\t\t\t\tloc = data.results[i];\n\t\t\t\t\t\tlatLng = L.latLng(loc.geometry.location);\n\t\t\t\t\t\tlatLngBounds = L.latLngBounds(L.latLng(loc.geometry.viewport.northeast), L.latLng(loc.geometry.viewport.southwest));\n\t\t\t\t\t\tresults[i] = {\n\t\t\t\t\t\t\tname: loc.formatted_address,\n\t\t\t\t\t\t\tbbox: latLngBounds,\n\t\t\t\t\t\t\tcenter: latLng,\n\t\t\t\t\t\t\tproperties: loc.address_components\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcb.call(context, results);\n\t\t\t});\n\t\t},\n\n\t\treverse: function(location, scale, cb, context) {\n\t\t\tvar params = {\n\t\t\t\tlatlng: encodeURIComponent(location.lat) + ',' + encodeURIComponent(location.lng)\n\t\t\t};\n\t\t\tparams = L.Util.extend(params, this.options.reverseQueryParams);\n\t\t\tif (this._key && this._key.length) {\n\t\t\t\tparams.key = this._key;\n\t\t\t}\n\n\t\t\tUtil.getJSON(this.options.serviceUrl, params, function(data) {\n\t\t\t\tvar results = [],\n\t\t\t\t\t\tloc,\n\t\t\t\t\t\tlatLng,\n\t\t\t\t\t\tlatLngBounds;\n\t\t\t\tif (data.results && data.results.length) {\n\t\t\t\t\tfor (var i = 0; i <= data.results.length - 1; i++) {\n\t\t\t\t\t\tloc = data.results[i];\n\t\t\t\t\t\tlatLng = L.latLng(loc.geometry.location);\n\t\t\t\t\t\tlatLngBounds = L.latLngBounds(L.latLng(loc.geometry.viewport.northeast), L.latLng(loc.geometry.viewport.southwest));\n\t\t\t\t\t\tresults[i] = {\n\t\t\t\t\t\t\tname: loc.formatted_address,\n\t\t\t\t\t\t\tbbox: latLngBounds,\n\t\t\t\t\t\t\tcenter: latLng,\n\t\t\t\t\t\t\tproperties: loc.address_components\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcb.call(context, results);\n\t\t\t});\n\t\t}\n\t}),\n\n\tfactory: function(key, options) {\n\t\treturn new L.Control.Geocoder.Google(key, options);\n\t}\n};\n\n},{\"../util\":44,\"leaflet\":57}],38:[function(require,module,exports){\nvar L = require('leaflet'),\n\tUtil = require('../util');\n\nmodule.exports = {\n\tclass: L.Class.extend({\n\t\toptions: {\n\t\t\tserviceUrl: 'https://api.tiles.mapbox.com/v4/geocode/mapbox.places-v1/'\n\t\t},\n\n\t\tinitialize: function(accessToken, options) {\n\t\t\tL.setOptions(this, options);\n\t\t\tthis._accessToken = accessToken;\n\t\t},\n\n\t\tgeocode: function(query, cb, context) {\n\t\t\tUtil.getJSON(this.options.serviceUrl + encodeURIComponent(query) + '.json', {\n\t\t\t\taccess_token: this._accessToken,\n\t\t\t}, function(data) {\n\t\t\t\tvar results = [],\n\t\t\t\tloc,\n\t\t\t\tlatLng,\n\t\t\t\tlatLngBounds;\n\t\t\t\tif (data.features && data.features.length) {\n\t\t\t\t\tfor (var i = 0; i <= data.features.length - 1; i++) {\n\t\t\t\t\t\tloc = data.features[i];\n\t\t\t\t\t\tlatLng = L.latLng(loc.center.reverse());\n\t\t\t\t\t\tif(loc.hasOwnProperty('bbox'))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlatLngBounds = L.latLngBounds(L.latLng(loc.bbox.slice(0, 2).reverse()), L.latLng(loc.bbox.slice(2, 4).reverse()));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlatLngBounds = L.latLngBounds(latLng, latLng);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresults[i] = {\n\t\t\t\t\t\t\tname: loc.place_name,\n\t\t\t\t\t\t\tbbox: latLngBounds,\n\t\t\t\t\t\t\tcenter: latLng\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcb.call(context, results);\n\t\t\t});\n\t\t},\n\n\t\tsuggest: function(query, cb, context) {\n\t\t\treturn this.geocode(query, cb, context);\n\t\t},\n\n\t\treverse: function(location, scale, cb, context) {\n\t\t\tUtil.getJSON(this.options.serviceUrl + encodeURIComponent(location.lng) + ',' + encodeURIComponent(location.lat) + '.json', {\n\t\t\t\taccess_token: this._accessToken,\n\t\t\t}, function(data) {\n\t\t\t\tvar results = [],\n\t\t\t\tloc,\n\t\t\t\tlatLng,\n\t\t\t\tlatLngBounds;\n\t\t\t\tif (data.features && data.features.length) {\n\t\t\t\t\tfor (var i = 0; i <= data.features.length - 1; i++) {\n\t\t\t\t\t\tloc = data.features[i];\n\t\t\t\t\t\tlatLng = L.latLng(loc.center.reverse());\n\t\t\t\t\t\tif(loc.hasOwnProperty('bbox'))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlatLngBounds = L.latLngBounds(L.latLng(loc.bbox.slice(0, 2).reverse()), L.latLng(loc.bbox.slice(2, 4).reverse()));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlatLngBounds = L.latLngBounds(latLng, latLng);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresults[i] = {\n\t\t\t\t\t\t\tname: loc.place_name,\n\t\t\t\t\t\t\tbbox: latLngBounds,\n\t\t\t\t\t\t\tcenter: latLng\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcb.call(context, results);\n\t\t\t});\n\t\t}\n\t}),\n\n\tfactory: function(accessToken, options) {\n\t\treturn new L.Control.Geocoder.Mapbox(accessToken, options);\n\t}\n};\n\n\n},{\"../util\":44,\"leaflet\":57}],39:[function(require,module,exports){\nvar L = require('leaflet'),\n\tUtil = require('../util');\n\nmodule.exports = {\n\tclass: L.Class.extend({\n\t\toptions: {\n\t\t\tserviceUrl: '//www.mapquestapi.com/geocoding/v1'\n\t\t},\n\n\t\tinitialize: function(key, options) {\n\t\t\t// MapQuest seems to provide URI encoded API keys,\n\t\t\t// so to avoid encoding them twice, we decode them here\n\t\t\tthis._key = decodeURIComponent(key);\n\n\t\t\tL.Util.setOptions(this, options);\n\t\t},\n\n\t\t_formatName: function() {\n\t\t\tvar r = [],\n\t\t\t\ti;\n\t\t\tfor (i = 0; i < arguments.length; i++) {\n\t\t\t\tif (arguments[i]) {\n\t\t\t\t\tr.push(arguments[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn r.join(', ');\n\t\t},\n\n\t\tgeocode: function(query, cb, context) {\n\t\t\tUtil.jsonp(this.options.serviceUrl + '/address', {\n\t\t\t\tkey: this._key,\n\t\t\t\tlocation: query,\n\t\t\t\tlimit: 5,\n\t\t\t\toutFormat: 'json'\n\t\t\t}, function(data) {\n\t\t\t\tvar results = [],\n\t\t\t\t\tloc,\n\t\t\t\t\tlatLng;\n\t\t\t\tif (data.results && data.results[0].locations) {\n\t\t\t\t\tfor (var i = data.results[0].locations.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tloc = data.results[0].locations[i];\n\t\t\t\t\t\tlatLng = L.latLng(loc.latLng);\n\t\t\t\t\t\tresults[i] = {\n\t\t\t\t\t\t\tname: this._formatName(loc.street, loc.adminArea4, loc.adminArea3, loc.adminArea1),\n\t\t\t\t\t\t\tbbox: L.latLngBounds(latLng, latLng),\n\t\t\t\t\t\t\tcenter: latLng\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcb.call(context, results);\n\t\t\t}, this);\n\t\t},\n\n\t\treverse: function(location, scale, cb, context) {\n\t\t\tUtil.jsonp(this.options.serviceUrl + '/reverse', {\n\t\t\t\tkey: this._key,\n\t\t\t\tlocation: location.lat + ',' + location.lng,\n\t\t\t\toutputFormat: 'json'\n\t\t\t}, function(data) {\n\t\t\t\tvar results = [],\n\t\t\t\t\tloc,\n\t\t\t\t\tlatLng;\n\t\t\t\tif (data.results && data.results[0].locations) {\n\t\t\t\t\tfor (var i = data.results[0].locations.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tloc = data.results[0].locations[i];\n\t\t\t\t\t\tlatLng = L.latLng(loc.latLng);\n\t\t\t\t\t\tresults[i] = {\n\t\t\t\t\t\t\tname: this._formatName(loc.street, loc.adminArea4, loc.adminArea3, loc.adminArea1),\n\t\t\t\t\t\t\tbbox: L.latLngBounds(latLng, latLng),\n\t\t\t\t\t\t\tcenter: latLng\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcb.call(context, results);\n\t\t\t}, this);\n\t\t}\n\t}),\n\n\tfactory: function(key, options) {\n\t\treturn new L.Control.Geocoder.MapQuest(key, options);\n\t}\n};\n\n},{\"../util\":44,\"leaflet\":57}],40:[function(require,module,exports){\nvar L = require('leaflet'),\n\tUtil = require('../util');\n\nmodule.exports = {\n\tclass: L.Class.extend({\n\t\toptions: {\n\t\t\tserviceUrl: '//nominatim.openstreetmap.org/',\n\t\t\tgeocodingQueryParams: {},\n\t\t\treverseQueryParams: {},\n\t\t\thtmlTemplate: function(r) {\n\t\t\t\tvar a = r.address,\n\t\t\t\t\tparts = [];\n\t\t\t\tif (a.road || a.building) {\n\t\t\t\t\tparts.push('{building} {road} {house_number}');\n\t\t\t\t}\n\n\t\t\t\tif (a.city || a.town || a.village) {\n\t\t\t\t\tparts.push('<span class=\"' + (parts.length > 0 ? 'leaflet-control-geocoder-address-detail' : '') +\n\t\t\t\t\t\t'\">{postcode} {city} {town} {village}</span>');\n\t\t\t\t}\n\n\t\t\t\tif (a.state || a.country) {\n\t\t\t\t\tparts.push('<span class=\"' + (parts.length > 0 ? 'leaflet-control-geocoder-address-context' : '') +\n\t\t\t\t\t\t'\">{state} {country}</span>');\n\t\t\t\t}\n\n\t\t\t\treturn Util.template(parts.join('<br/>'), a, true);\n\t\t\t}\n\t\t},\n\n\t\tinitialize: function(options) {\n\t\t\tL.Util.setOptions(this, options);\n\t\t},\n\n\t\tgeocode: function(query, cb, context) {\n\t\t\tUtil.jsonp(this.options.serviceUrl + 'search/', L.extend({\n\t\t\t\tq: query,\n\t\t\t\tlimit: 5,\n\t\t\t\tformat: 'json',\n\t\t\t\taddressdetails: 1\n\t\t\t}, this.options.geocodingQueryParams),\n\t\t\tfunction(data) {\n\t\t\t\tvar results = [];\n\t\t\t\tfor (var i = data.length - 1; i >= 0; i--) {\n\t\t\t\t\tvar bbox = data[i].boundingbox;\n\t\t\t\t\tfor (var j = 0; j < 4; j++) bbox[j] = parseFloat(bbox[j]);\n\t\t\t\t\tresults[i] = {\n\t\t\t\t\t\ticon: data[i].icon,\n\t\t\t\t\t\tname: data[i].display_name,\n\t\t\t\t\t\thtml: this.options.htmlTemplate ?\n\t\t\t\t\t\t\tthis.options.htmlTemplate(data[i])\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tbbox: L.latLngBounds([bbox[0], bbox[2]], [bbox[1], bbox[3]]),\n\t\t\t\t\t\tcenter: L.latLng(data[i].lat, data[i].lon),\n\t\t\t\t\t\tproperties: data[i]\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcb.call(context, results);\n\t\t\t}, this, 'json_callback');\n\t\t},\n\n\t\treverse: function(location, scale, cb, context) {\n\t\t\tUtil.jsonp(this.options.serviceUrl + 'reverse/', L.extend({\n\t\t\t\tlat: location.lat,\n\t\t\t\tlon: location.lng,\n\t\t\t\tzoom: Math.round(Math.log(scale / 256) / Math.log(2)),\n\t\t\t\taddressdetails: 1,\n\t\t\t\tformat: 'json'\n\t\t\t}, this.options.reverseQueryParams), function(data) {\n\t\t\t\tvar result = [],\n\t\t\t\t    loc;\n\n\t\t\t\tif (data && data.lat && data.lon) {\n\t\t\t\t\tloc = L.latLng(data.lat, data.lon);\n\t\t\t\t\tresult.push({\n\t\t\t\t\t\tname: data.display_name,\n\t\t\t\t\t\thtml: this.options.htmlTemplate ?\n\t\t\t\t\t\t\tthis.options.htmlTemplate(data)\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tcenter: loc,\n\t\t\t\t\t\tbounds: L.latLngBounds(loc, loc),\n\t\t\t\t\t\tproperties: data\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tcb.call(context, result);\n\t\t\t}, this, 'json_callback');\n\t\t}\n\t}),\n\n\tfactory: function(options) {\n\t\treturn new L.Control.Geocoder.Nominatim(options);\n\t}\n};\n\n},{\"../util\":44,\"leaflet\":57}],41:[function(require,module,exports){\nvar L = require('leaflet'),\n\tUtil = require('../util');\n\nmodule.exports = {\n\tclass: L.Class.extend({\n\t\toptions: {\n\t\t\tserviceUrl: '//photon.komoot.de/api/',\n\t\t\treverseUrl: '//photon.komoot.de/reverse/',\n\t\t\tnameProperties: [\n\t\t\t\t'name',\n\t\t\t\t'street',\n\t\t\t\t'suburb',\n\t\t\t\t'hamlet',\n\t\t\t\t'town',\n\t\t\t\t'city',\n\t\t\t\t'state',\n\t\t\t\t'country'\n\t\t\t]\n\t\t},\n\n\t\tinitialize: function(options) {\n\t\t\tL.setOptions(this, options);\n\t\t},\n\n\t\tgeocode: function(query, cb, context) {\n\t\t\tvar params = L.extend({\n\t\t\t\tq: query,\n\t\t\t}, this.options.geocodingQueryParams);\n\n\t\t\tUtil.getJSON(this.options.serviceUrl, params, L.bind(function(data) {\n\t\t\t\tcb.call(context, this._decodeFeatures(data));\n\t\t\t}, this));\n\t\t},\n\n\t\tsuggest: function(query, cb, context) {\n\t\t\treturn this.geocode(query, cb, context);\n\t\t},\n\n\t\treverse: function(latLng, scale, cb, context) {\n\t\t\tvar params = L.extend({\n\t\t\t\tlat: latLng.lat,\n\t\t\t\tlon: latLng.lng\n\t\t\t}, this.options.geocodingQueryParams);\n\n\t\t\tUtil.getJSON(this.options.reverseUrl, params, L.bind(function(data) {\n\t\t\t\tcb.call(context, this._decodeFeatures(data));\n\t\t\t}, this));\n\t\t},\n\n\t\t_decodeFeatures: function(data) {\n\t\t\tvar results = [],\n\t\t\t\ti,\n\t\t\t\tf,\n\t\t\t\tc,\n\t\t\t\tlatLng,\n\t\t\t\textent,\n\t\t\t\tbbox;\n\n\t\t\tif (data && data.features) {\n\t\t\t\tfor (i = 0; i < data.features.length; i++) {\n\t\t\t\t\tf = data.features[i];\n\t\t\t\t\tc = f.geometry.coordinates;\n\t\t\t\t\tlatLng = L.latLng(c[1], c[0]);\n\t\t\t\t\textent = f.properties.extent;\n\n\t\t\t\t\tif (extent) {\n\t\t\t\t\t\tbbox = L.latLngBounds([extent[1], extent[0]], [extent[3], extent[2]]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbbox = L.latLngBounds(latLng, latLng);\n\t\t\t\t\t}\n\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tname: this._deocodeFeatureName(f),\n\t\t\t\t\t\tcenter: latLng,\n\t\t\t\t\t\tbbox: bbox,\n\t\t\t\t\t\tproperties: f.properties\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn results;\n\t\t},\n\n\t\t_deocodeFeatureName: function(f) {\n\t\t\tvar j,\n\t\t\t\tname;\n\t\t\tfor (j = 0; !name && j < this.options.nameProperties.length; j++) {\n\t\t\t\tname = f.properties[this.options.nameProperties[j]];\n\t\t\t}\n\n\t\t\treturn name;\n\t\t}\n\t}),\n\n\tfactory: function(options) {\n\t\treturn new L.Control.Geocoder.Photon(options);\n\t}\n};\n\n\n},{\"../util\":44,\"leaflet\":57}],42:[function(require,module,exports){\nvar L = require('leaflet'),\n\tUtil = require('../util');\n\nmodule.exports = {\n\tclass: L.Class.extend({\n\t\toptions: {\n\t\t\tserviceUrl: 'http://api.what3words.com/'\n\t\t},\n\n\t\tinitialize: function(accessToken) {\n\t\t\tthis._accessToken = accessToken;\n\t\t},\n\n\t\tgeocode: function(query, cb, context) {\n\t\t\t//get three words and make a dot based string\n\t\t\tUtil.getJSON(this.options.serviceUrl +'w3w', {\n\t\t\t\tkey: this._accessToken,\n\t\t\t\tstring: query.split(/\\s+/).join('.'),\n\t\t\t}, function(data) {\n\t\t\t\tvar results = [], loc, latLng, latLngBounds;\n\t\t\t\tif (data.position && data.position.length) {\n\t\t\t\t\tloc = data.words;\n\t\t\t\t\tlatLng = L.latLng(data.position[0],data.position[1]);\n\t\t\t\t\tlatLngBounds = L.latLngBounds(latLng, latLng);\n\t\t\t\t\tresults[0] = {\n\t\t\t\t\t\tname: loc.join('.'),\n\t\t\t\t\t\tbbox: latLngBounds,\n\t\t\t\t\t\tcenter: latLng\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tcb.call(context, results);\n\t\t\t});\n\t\t},\n\n\t\tsuggest: function(query, cb, context) {\n\t\t\treturn this.geocode(query, cb, context);\n\t\t},\n\n\t\treverse: function(location, scale, cb, context) {\n\t\t\tUtil.getJSON(this.options.serviceUrl +'position', {\n\t\t\t\tkey: this._accessToken,\n\t\t\t\tposition: [location.lat,location.lng].join(',')\n\t\t\t}, function(data) {\n\t\t\t\tvar results = [],loc,latLng,latLngBounds;\n\t\t\t\tif (data.position && data.position.length) {\n\t\t\t\t\tloc = data.words;\n\t\t\t\t\tlatLng = L.latLng(data.position[0],data.position[1]);\n\t\t\t\t\tlatLngBounds = L.latLngBounds(latLng, latLng);\n\t\t\t\t\tresults[0] = {\n\t\t\t\t\t\tname: loc.join('.'),\n\t\t\t\t\t\tbbox: latLngBounds,\n\t\t\t\t\t\tcenter: latLng\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcb.call(context, results);\n\t\t\t});\n\t\t}\n\t}),\n\n\tfactory: function(accessToken) {\n\t\treturn new L.Control.Geocoder.What3Words(accessToken);\n\t}\n};\n\n},{\"../util\":44,\"leaflet\":57}],43:[function(require,module,exports){\nvar L = require('leaflet'),\n\tControl = require('./control'),\n\tNominatim = require('./geocoders/nominatim'),\n\tBing = require('./geocoders/bing'),\n\tMapQuest = require('./geocoders/mapquest'),\n\tMapbox = require('./geocoders/mapbox'),\n\tWhat3Words = require('./geocoders/what3words'),\n\tGoogle = require('./geocoders/google'),\n\tPhoton = require('./geocoders/photon');\n\nmodule.exports = L.Util.extend(Control.class, {\n\tNominatim: Nominatim.class,\n\tnominatim: Nominatim.factory,\n\tBing: Bing.class,\n\tbing: Bing.factory,\n\tMapQuest: MapQuest.class,\n\tmapQuest: MapQuest.factory,\n\tMapbox: Mapbox.class,\n\tmapbox: Mapbox.factory,\n\tWhat3Words: What3Words.class,\n\twhat3words: What3Words.factory,\n\tGoogle: Google.class,\n\tgoogle: Google.factory,\n\tPhoton: Photon.class,\n\tphoton: Photon.factory\n});\n\nL.Util.extend(L.Control, {\n\tGeocoder: module.exports,\n\tgeocoder: Control.factory\n});\n\n},{\"./control\":35,\"./geocoders/bing\":36,\"./geocoders/google\":37,\"./geocoders/mapbox\":38,\"./geocoders/mapquest\":39,\"./geocoders/nominatim\":40,\"./geocoders/photon\":41,\"./geocoders/what3words\":42,\"leaflet\":57}],44:[function(require,module,exports){\nvar L = require('leaflet'),\n\tlastCallbackId = 0,\n\thtmlEscape = (function() {\n\t\t// Adapted from handlebars.js\n\t\t// https://github.com/wycats/handlebars.js/\n\t\tvar badChars = /[&<>\"'`]/g;\n\t\tvar possible = /[&<>\"'`]/;\n\t\tvar escape = {\n\t\t  '&': '&amp;',\n\t\t  '<': '&lt;',\n\t\t  '>': '&gt;',\n\t\t  '\"': '&quot;',\n\t\t  '\\'': '&#x27;',\n\t\t  '`': '&#x60;'\n\t\t};\n\n\t\tfunction escapeChar(chr) {\n\t\t  return escape[chr];\n\t\t}\n\n\t\treturn function(string) {\n\t\t\tif (string == null) {\n\t\t\t\treturn '';\n\t\t\t} else if (!string) {\n\t\t\t\treturn string + '';\n\t\t\t}\n\n\t\t\t// Force a string conversion as this will be done by the append regardless and\n\t\t\t// the regex test will do this transparently behind the scenes, causing issues if\n\t\t\t// an object's to string has escaped characters in it.\n\t\t\tstring = '' + string;\n\n\t\t\tif (!possible.test(string)) {\n\t\t\t\treturn string;\n\t\t\t}\n\t\t\treturn string.replace(badChars, escapeChar);\n\t\t};\n\t})();\n\nmodule.exports = {\n\tjsonp: function(url, params, callback, context, jsonpParam) {\n\t\tvar callbackId = '_l_geocoder_' + (lastCallbackId++);\n\t\tparams[jsonpParam || 'callback'] = callbackId;\n\t\twindow[callbackId] = L.Util.bind(callback, context);\n\t\tvar script = document.createElement('script');\n\t\tscript.type = 'text/javascript';\n\t\tscript.src = url + L.Util.getParamString(params);\n\t\tscript.id = callbackId;\n\t\tdocument.getElementsByTagName('head')[0].appendChild(script);\n\t},\n\n\tgetJSON: function(url, params, callback) {\n\t\tvar xmlHttp = new XMLHttpRequest();\n\t\txmlHttp.onreadystatechange = function () {\n\t\t\tif (xmlHttp.readyState !== 4){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (xmlHttp.status !== 200 && xmlHttp.status !== 304){\n\t\t\t\tcallback('');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcallback(JSON.parse(xmlHttp.response));\n\t\t};\n\t\txmlHttp.open('GET', url + L.Util.getParamString(params), true);\n\t\txmlHttp.setRequestHeader('Accept', 'application/json');\n\t\txmlHttp.send(null);\n\t},\n\n\ttemplate: function (str, data) {\n\t\treturn str.replace(/\\{ *([\\w_]+) *\\}/g, function (str, key) {\n\t\t\tvar value = data[key];\n\t\t\tif (value === undefined) {\n\t\t\t\tvalue = '';\n\t\t\t} else if (typeof value === 'function') {\n\t\t\t\tvalue = value(data);\n\t\t\t}\n\t\t\treturn htmlEscape(value);\n\t\t});\n\t},\n\n\thtmlEscape: htmlEscape\n};\n\n},{\"leaflet\":57}],45:[function(require,module,exports){\n(function() {\n\t'use strict';\n\n\tL.Routing = L.Routing || {};\n\n\tL.Routing.Autocomplete = L.Class.extend({\n\t\toptions: {\n\t\t\ttimeout: 500,\n\t\t\tblurTimeout: 100,\n\t\t\tnoResultsMessage: 'No results found.'\n\t\t},\n\n\t\tinitialize: function(elem, callback, context, options) {\n\t\t\tL.setOptions(this, options);\n\n\t\t\tthis._elem = elem;\n\t\t\tthis._resultFn = options.resultFn ? L.Util.bind(options.resultFn, options.resultContext) : null;\n\t\t\tthis._autocomplete = options.autocompleteFn ? L.Util.bind(options.autocompleteFn, options.autocompleteContext) : null;\n\t\t\tthis._selectFn = L.Util.bind(callback, context);\n\t\t\tthis._container = L.DomUtil.create('div', 'leaflet-routing-geocoder-result');\n\t\t\tthis._resultTable = L.DomUtil.create('table', '', this._container);\n\n\t\t\t// TODO: looks a bit like a kludge to register same for input and keypress -\n\t\t\t// browsers supporting both will get duplicate events; just registering\n\t\t\t// input will not catch enter, though.\n\t\t\tL.DomEvent.addListener(this._elem, 'input', this._keyPressed, this);\n\t\t\tL.DomEvent.addListener(this._elem, 'keypress', this._keyPressed, this);\n\t\t\tL.DomEvent.addListener(this._elem, 'keydown', this._keyDown, this);\n\t\t\tL.DomEvent.addListener(this._elem, 'blur', function() {\n\t\t\t\tif (this._isOpen) {\n\t\t\t\t\tthis.close();\n\t\t\t\t}\n\t\t\t}, this);\n\t\t},\n\n\t\tclose: function() {\n\t\t\tL.DomUtil.removeClass(this._container, 'leaflet-routing-geocoder-result-open');\n\t\t\tthis._isOpen = false;\n\t\t},\n\n\t\t_open: function() {\n\t\t\tvar rect = this._elem.getBoundingClientRect();\n\t\t\tif (!this._container.parentElement) {\n\t\t\t\tthis._container.style.left = (rect.left + window.scrollX) + 'px';\n\t\t\t\tthis._container.style.top = (rect.bottom + window.scrollY) + 'px';\n\t\t\t\tthis._container.style.width = (rect.right - rect.left) + 'px';\n\t\t\t\tdocument.body.appendChild(this._container);\n\t\t\t}\n\n\t\t\tL.DomUtil.addClass(this._container, 'leaflet-routing-geocoder-result-open');\n\t\t\tthis._isOpen = true;\n\t\t},\n\n\t\t_setResults: function(results) {\n\t\t\tvar i,\n\t\t\t    tr,\n\t\t\t    td,\n\t\t\t    text;\n\n\t\t\tdelete this._selection;\n\t\t\tthis._results = results;\n\n\t\t\twhile (this._resultTable.firstChild) {\n\t\t\t\tthis._resultTable.removeChild(this._resultTable.firstChild);\n\t\t\t}\n\n\t\t\tfor (i = 0; i < results.length; i++) {\n\t\t\t\ttr = L.DomUtil.create('tr', '', this._resultTable);\n\t\t\t\ttr.setAttribute('data-result-index', i);\n\t\t\t\ttd = L.DomUtil.create('td', '', tr);\n\t\t\t\ttext = document.createTextNode(results[i].name);\n\t\t\t\ttd.appendChild(text);\n\t\t\t\t// mousedown + click because:\n\t\t\t\t// http://stackoverflow.com/questions/10652852/jquery-fire-click-before-blur-event\n\t\t\t\tL.DomEvent.addListener(td, 'mousedown', L.DomEvent.preventDefault);\n\t\t\t\tL.DomEvent.addListener(td, 'click', this._createClickListener(results[i]));\n\t\t\t}\n\n\t\t\tif (!i) {\n\t\t\t\ttr = L.DomUtil.create('tr', '', this._resultTable);\n\t\t\t\ttd = L.DomUtil.create('td', 'leaflet-routing-geocoder-no-results', tr);\n\t\t\t\ttd.innerHTML = this.options.noResultsMessage;\n\t\t\t}\n\n\t\t\tthis._open();\n\n\t\t\tif (results.length > 0) {\n\t\t\t\t// Select the first entry\n\t\t\t\tthis._select(1);\n\t\t\t}\n\t\t},\n\n\t\t_createClickListener: function(r) {\n\t\t\tvar resultSelected = this._resultSelected(r);\n\t\t\treturn L.bind(function() {\n\t\t\t\tthis._elem.blur();\n\t\t\t\tresultSelected();\n\t\t\t}, this);\n\t\t},\n\n\t\t_resultSelected: function(r) {\n\t\t\treturn L.bind(function() {\n\t\t\t\tthis.close();\n\t\t\t\tthis._elem.value = r.name;\n\t\t\t\tthis._lastCompletedText = r.name;\n\t\t\t\tthis._selectFn(r);\n\t\t\t}, this);\n\t\t},\n\n\t\t_keyPressed: function(e) {\n\t\t\tvar index;\n\n\t\t\tif (this._isOpen && e.keyCode === 13 && this._selection) {\n\t\t\t\tindex = parseInt(this._selection.getAttribute('data-result-index'), 10);\n\t\t\t\tthis._resultSelected(this._results[index])();\n\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (e.keyCode === 13) {\n\t\t\t\tthis._complete(this._resultFn, true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this._autocomplete && document.activeElement === this._elem) {\n\t\t\t\tif (this._timer) {\n\t\t\t\t\tclearTimeout(this._timer);\n\t\t\t\t}\n\t\t\t\tthis._timer = setTimeout(L.Util.bind(function() { this._complete(this._autocomplete); }, this),\n\t\t\t\t\tthis.options.timeout);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._unselect();\n\t\t},\n\n\t\t_select: function(dir) {\n\t\t\tvar sel = this._selection;\n\t\t\tif (sel) {\n\t\t\t\tL.DomUtil.removeClass(sel.firstChild, 'leaflet-routing-geocoder-selected');\n\t\t\t\tsel = sel[dir > 0 ? 'nextSibling' : 'previousSibling'];\n\t\t\t}\n\t\t\tif (!sel) {\n\t\t\t\tsel = this._resultTable[dir > 0 ? 'firstChild' : 'lastChild'];\n\t\t\t}\n\n\t\t\tif (sel) {\n\t\t\t\tL.DomUtil.addClass(sel.firstChild, 'leaflet-routing-geocoder-selected');\n\t\t\t\tthis._selection = sel;\n\t\t\t}\n\t\t},\n\n\t\t_unselect: function() {\n\t\t\tif (this._selection) {\n\t\t\t\tL.DomUtil.removeClass(this._selection.firstChild, 'leaflet-routing-geocoder-selected');\n\t\t\t}\n\t\t\tdelete this._selection;\n\t\t},\n\n\t\t_keyDown: function(e) {\n\t\t\tif (this._isOpen) {\n\t\t\t\tswitch (e.keyCode) {\n\t\t\t\t// Escape\n\t\t\t\tcase 27:\n\t\t\t\t\tthis.close();\n\t\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t\t\treturn;\n\t\t\t\t// Up\n\t\t\t\tcase 38:\n\t\t\t\t\tthis._select(-1);\n\t\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t\t\treturn;\n\t\t\t\t// Down\n\t\t\t\tcase 40:\n\t\t\t\t\tthis._select(1);\n\t\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_complete: function(completeFn, trySelect) {\n\t\t\tvar v = this._elem.value;\n\t\t\tfunction completeResults(results) {\n\t\t\t\tthis._lastCompletedText = v;\n\t\t\t\tif (trySelect && results.length === 1) {\n\t\t\t\t\tthis._resultSelected(results[0])();\n\t\t\t\t} else {\n\t\t\t\t\tthis._setResults(results);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!v) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (v !== this._lastCompletedText) {\n\t\t\t\tcompleteFn(v, completeResults, this);\n\t\t\t} else if (trySelect) {\n\t\t\t\tcompleteResults.call(this, this._results);\n\t\t\t}\n\t\t}\n\t});\n})();\n\n},{}],46:[function(require,module,exports){\n(function() {\n\t'use strict';\n\n\tvar L = require('leaflet');\n\n\tL.Routing = L.Routing || {};\n\tL.extend(L.Routing, require('./L.Routing.Itinerary'));\n\tL.extend(L.Routing, require('./L.Routing.Line'));\n\tL.extend(L.Routing, require('./L.Routing.Plan'));\n\tL.extend(L.Routing, require('./L.Routing.OSRMv1'));\n\tL.extend(L.Routing, require('./L.Routing.ErrorControl'));\n\n\tL.Routing.Control = L.Routing.Itinerary.extend({\n\t\toptions: {\n\t\t\tfitSelectedRoutes: 'smart',\n\t\t\trouteLine: function(route, options) { return L.Routing.line(route, options); },\n\t\t\tautoRoute: true,\n\t\t\trouteWhileDragging: false,\n\t\t\trouteDragInterval: 500,\n\t\t\twaypointMode: 'connect',\n\t\t\tuseZoomParameter: false,\n\t\t\tshowAlternatives: false\n\t\t},\n\n\t\tinitialize: function(options) {\n\t\t\tL.Util.setOptions(this, options);\n\n\t\t\tthis._router = this.options.router || new L.Routing.OSRMv1(options);\n\t\t\tthis._plan = this.options.plan || L.Routing.plan(this.options.waypoints, options);\n\t\t\tthis._requestCount = 0;\n\n\t\t\tL.Routing.Itinerary.prototype.initialize.call(this, options);\n\n\t\t\tthis.on('routeselected', this._routeSelected, this);\n\t\t\tthis._plan.on('waypointschanged', this._onWaypointsChanged, this);\n\t\t\tif (options.routeWhileDragging) {\n\t\t\t\tthis._setupRouteDragging();\n\t\t\t}\n\n\t\t\tif (this.options.autoRoute) {\n\t\t\t\tthis.route();\n\t\t\t}\n\t\t},\n\n\t\tonAdd: function(map) {\n\t\t\tvar container = L.Routing.Itinerary.prototype.onAdd.call(this, map);\n\n\t\t\tthis._map = map;\n\t\t\tthis._map.addLayer(this._plan);\n\n\t\t\tif (this.options.useZoomParameter) {\n\t\t\t\tthis._map.on('zoomend', function() {\n\t\t\t\t\tthis.route({\n\t\t\t\t\t\tcallback: L.bind(this._updateLineCallback, this)\n\t\t\t\t\t});\n\t\t\t\t}, this);\n\t\t\t}\n\n\t\t\tif (this._plan.options.geocoder) {\n\t\t\t\tcontainer.insertBefore(this._plan.createGeocoders(), container.firstChild);\n\t\t\t}\n\n\t\t\treturn container;\n\t\t},\n\n\t\tonRemove: function(map) {\n\t\t\tif (this._line) {\n\t\t\t\tmap.removeLayer(this._line);\n\t\t\t}\n\t\t\tmap.removeLayer(this._plan);\n\t\t\treturn L.Routing.Itinerary.prototype.onRemove.call(this, map);\n\t\t},\n\n\t\tgetWaypoints: function() {\n\t\t\treturn this._plan.getWaypoints();\n\t\t},\n\n\t\tsetWaypoints: function(waypoints) {\n\t\t\tthis._plan.setWaypoints(waypoints);\n\t\t\treturn this;\n\t\t},\n\n\t\tspliceWaypoints: function() {\n\t\t\tvar removed = this._plan.spliceWaypoints.apply(this._plan, arguments);\n\t\t\treturn removed;\n\t\t},\n\n\t\tgetPlan: function() {\n\t\t\treturn this._plan;\n\t\t},\n\n\t\tgetRouter: function() {\n\t\t\treturn this._router;\n\t\t},\n\n\t\t_routeSelected: function(e) {\n\t\t\tvar route = e.route,\n\t\t\t\talternatives = this.options.showAlternatives && e.alternatives,\n\t\t\t\tfitMode = this.options.fitSelectedRoutes,\n\t\t\t\tfitBounds =\n\t\t\t\t\t(fitMode === 'smart' && !this._waypointsVisible()) ||\n\t\t\t\t\t(fitMode !== 'smart' && fitMode);\n\n\t\t\tthis._updateLines({route: route, alternatives: alternatives});\n\n\t\t\tif (fitBounds) {\n\t\t\t\tthis._map.fitBounds(this._line.getBounds());\n\t\t\t}\n\n\t\t\tif (this.options.waypointMode === 'snap') {\n\t\t\t\tthis._plan.off('waypointschanged', this._onWaypointsChanged, this);\n\t\t\t\tthis.setWaypoints(route.waypoints);\n\t\t\t\tthis._plan.on('waypointschanged', this._onWaypointsChanged, this);\n\t\t\t}\n\t\t},\n\n\t\t_waypointsVisible: function() {\n\t\t\tvar wps = this.getWaypoints(),\n\t\t\t\tmapSize,\n\t\t\t\tbounds,\n\t\t\t\tboundsSize,\n\t\t\t\ti,\n\t\t\t\tp;\n\n\t\t\ttry {\n\t\t\t\tmapSize = this._map.getSize();\n\n\t\t\t\tfor (i = 0; i < wps.length; i++) {\n\t\t\t\t\tp = this._map.latLngToLayerPoint(wps[i].latLng);\n\n\t\t\t\t\tif (bounds) {\n\t\t\t\t\t\tbounds.extend(p);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbounds = L.bounds([p]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tboundsSize = bounds.getSize();\n\t\t\t\treturn (boundsSize.x > mapSize.x / 5 ||\n\t\t\t\t\tboundsSize.y > mapSize.y / 5) && this._waypointsInViewport();\n\n\t\t\t} catch (e) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t_waypointsInViewport: function() {\n\t\t\tvar wps = this.getWaypoints(),\n\t\t\t\tmapBounds,\n\t\t\t\ti;\n\n\t\t\ttry {\n\t\t\t\tmapBounds = this._map.getBounds();\n\t\t\t} catch (e) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfor (i = 0; i < wps.length; i++) {\n\t\t\t\tif (mapBounds.contains(wps[i].latLng)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\n\t\t_updateLines: function(routes) {\n\t\t\tvar addWaypoints = this.options.addWaypoints !== undefined ?\n\t\t\t\tthis.options.addWaypoints : true;\n\t\t\tthis._clearLines();\n\n\t\t\t// add alternatives first so they lie below the main route\n\t\t\tthis._alternatives = [];\n\t\t\tif (routes.alternatives) routes.alternatives.forEach(function(alt, i) {\n\t\t\t\tthis._alternatives[i] = this.options.routeLine(alt,\n\t\t\t\t\tL.extend({\n\t\t\t\t\t\tisAlternative: true\n\t\t\t\t\t}, this.options.altLineOptions || this.options.lineOptions));\n\t\t\t\tthis._alternatives[i].addTo(this._map);\n\t\t\t\tthis._hookAltEvents(this._alternatives[i]);\n\t\t\t}, this);\n\n\t\t\tthis._line = this.options.routeLine(routes.route,\n\t\t\t\tL.extend({\n\t\t\t\t\taddWaypoints: addWaypoints,\n\t\t\t\t\textendToWaypoints: this.options.waypointMode === 'connect'\n\t\t\t\t}, this.options.lineOptions));\n\t\t\tthis._line.addTo(this._map);\n\t\t\tthis._hookEvents(this._line);\n\t\t},\n\n\t\t_hookEvents: function(l) {\n\t\t\tl.on('linetouched', function(e) {\n\t\t\t\tthis._plan.dragNewWaypoint(e);\n\t\t\t}, this);\n\t\t},\n\n\t\t_hookAltEvents: function(l) {\n\t\t\tl.on('linetouched', function(e) {\n\t\t\t\tvar alts = this._routes.slice();\n\t\t\t\tvar selected = alts.splice(e.target._route.routesIndex, 1)[0];\n\t\t\t\tthis.fire('routeselected', {route: selected, alternatives: alts});\n\t\t\t}, this);\n\t\t},\n\n\t\t_onWaypointsChanged: function(e) {\n\t\t\tif (this.options.autoRoute) {\n\t\t\t\tthis.route({});\n\t\t\t}\n\t\t\tif (!this._plan.isReady()) {\n\t\t\t\tthis._clearLines();\n\t\t\t\tthis._clearAlts();\n\t\t\t}\n\t\t\tthis.fire('waypointschanged', {waypoints: e.waypoints});\n\t\t},\n\n\t\t_setupRouteDragging: function() {\n\t\t\tvar timer = 0,\n\t\t\t\twaypoints;\n\n\t\t\tthis._plan.on('waypointdrag', L.bind(function(e) {\n\t\t\t\twaypoints = e.waypoints;\n\n\t\t\t\tif (!timer) {\n\t\t\t\t\ttimer = setTimeout(L.bind(function() {\n\t\t\t\t\t\tthis.route({\n\t\t\t\t\t\t\twaypoints: waypoints,\n\t\t\t\t\t\t\tgeometryOnly: true,\n\t\t\t\t\t\t\tcallback: L.bind(this._updateLineCallback, this)\n\t\t\t\t\t\t});\n\t\t\t\t\t\ttimer = undefined;\n\t\t\t\t\t}, this), this.options.routeDragInterval);\n\t\t\t\t}\n\t\t\t}, this));\n\t\t\tthis._plan.on('waypointdragend', function() {\n\t\t\t\tif (timer) {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t}\n\t\t\t\tthis.route();\n\t\t\t}, this);\n\t\t},\n\n\t\t_updateLineCallback: function(err, routes) {\n\t\t\tif (!err) {\n\t\t\t\tthis._updateLines({route: routes[0], alternatives: routes.slice(1) });\n\t\t\t} else {\n\t\t\t\tthis._clearLines();\n\t\t\t}\n\t\t},\n\n\t\troute: function(options) {\n\t\t\tvar ts = ++this._requestCount,\n\t\t\t\twps;\n\n\t\t\toptions = options || {};\n\n\t\t\tif (this._plan.isReady()) {\n\t\t\t\tif (this.options.useZoomParameter) {\n\t\t\t\t\toptions.z = this._map && this._map.getZoom();\n\t\t\t\t}\n\n\t\t\t\twps = options && options.waypoints || this._plan.getWaypoints();\n\t\t\t\tthis.fire('routingstart', {waypoints: wps});\n\t\t\t\tthis._router.route(wps, options.callback || function(err, routes) {\n\t\t\t\t\t// Prevent race among multiple requests,\n\t\t\t\t\t// by checking the current request's timestamp\n\t\t\t\t\t// against the last request's; ignore result if\n\t\t\t\t\t// this isn't the latest request.\n\t\t\t\t\tif (ts === this._requestCount) {\n\t\t\t\t\t\tthis._clearLines();\n\t\t\t\t\t\tthis._clearAlts();\n\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\tthis.fire('routingerror', {error: err});\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\troutes.forEach(function(route, i) { route.routesIndex = i; });\n\n\t\t\t\t\t\tif (!options.geometryOnly) {\n\t\t\t\t\t\t\tthis.fire('routesfound', {waypoints: wps, routes: routes});\n\t\t\t\t\t\t\tthis.setAlternatives(routes);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar selectedRoute = routes.splice(0,1)[0];\n\t\t\t\t\t\t\tthis._routeSelected({route: selectedRoute, alternatives: routes});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, this, options);\n\t\t\t}\n\t\t},\n\n\t\t_clearLines: function() {\n\t\t\tif (this._line) {\n\t\t\t\tthis._map.removeLayer(this._line);\n\t\t\t\tdelete this._line;\n\t\t\t}\n\t\t\tif (this._alternatives && this._alternatives.length) {\n\t\t\t\tfor (var i in this._alternatives) {\n\t\t\t\t\tthis._map.removeLayer(this._alternatives[i]);\n\t\t\t\t}\n\t\t\t\tthis._alternatives = [];\n\t\t\t}\n\t\t}\n\t});\n\n\tL.Routing.control = function(options) {\n\t\treturn new L.Routing.Control(options);\n\t};\n\n\tmodule.exports = L.Routing;\n})();\n\n},{\"./L.Routing.ErrorControl\":47,\"./L.Routing.Itinerary\":50,\"./L.Routing.Line\":52,\"./L.Routing.OSRMv1\":54,\"./L.Routing.Plan\":55,\"leaflet\":57}],47:[function(require,module,exports){\n(function() {\n\t'use strict';\n\n\tL.Routing = L.Routing || {};\n\n\tL.Routing.ErrorControl = L.Control.extend({\n\t\toptions: {\n\t\t\theader: 'Routing error',\n\t\t\tformatMessage: function(error) {\n\t\t\t\tif (error.status < 0) {\n\t\t\t\t\treturn 'Calculating the route caused an error. Technical description follows: <code><pre>' +\n\t\t\t\t\t\terror.message + '</pre></code';\n\t\t\t\t} else {\n\t\t\t\t\treturn 'The route could not be calculated. ' +\n\t\t\t\t\t\terror.message;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tinitialize: function(routingControl, options) {\n\t\t\tL.Control.prototype.initialize.call(this, options);\n\t\t\troutingControl\n\t\t\t\t.on('routingerror', L.bind(function(e) {\n\t\t\t\t\tif (this._element) {\n\t\t\t\t\t\tthis._element.children[1].innerHTML = this.options.formatMessage(e.error);\n\t\t\t\t\t\tthis._element.style.visibility = 'visible';\n\t\t\t\t\t}\n\t\t\t\t}, this))\n\t\t\t\t.on('routingstart', L.bind(function() {\n\t\t\t\t\tif (this._element) {\n\t\t\t\t\t\tthis._element.style.visibility = 'hidden';\n\t\t\t\t\t}\n\t\t\t\t}, this));\n\t\t},\n\n\t\tonAdd: function() {\n\t\t\tvar header,\n\t\t\t\tmessage;\n\n\t\t\tthis._element = L.DomUtil.create('div', 'leaflet-bar leaflet-routing-error');\n\t\t\tthis._element.style.visibility = 'hidden';\n\n\t\t\theader = L.DomUtil.create('h3', null, this._element);\n\t\t\tmessage = L.DomUtil.create('span', null, this._element);\n\n\t\t\theader.innerHTML = this.options.header;\n\n\t\t\treturn this._element;\n\t\t},\n\n\t\tonRemove: function() {\n\t\t\tdelete this._element;\n\t\t}\n\t});\n\n\tL.Routing.errorControl = function(routingControl, options) {\n\t\treturn new L.Routing.ErrorControl(routingControl, options);\n\t};\n})();\n\n},{}],48:[function(require,module,exports){\n(function() {\n\t'use strict';\n\n\tvar L = require('leaflet');\n\n\tL.Routing = L.Routing || {};\n\n\tL.extend(L.Routing, require('./L.Routing.Localization'));\n\n\tL.Routing.Formatter = L.Class.extend({\n\t\toptions: {\n\t\t\tunits: 'metric',\n\t\t\tunitNames: {\n\t\t\t\tmeters: 'm',\n\t\t\t\tkilometers: 'km',\n\t\t\t\tyards: 'yd',\n\t\t\t\tmiles: 'mi',\n\t\t\t\thours: 'h',\n\t\t\t\tminutes: 'mín',\n\t\t\t\tseconds: 's'\n\t\t\t},\n\t\t\tlanguage: 'en',\n\t\t\troundingSensitivity: 1,\n\t\t\tdistanceTemplate: '{value} {unit}'\n\t\t},\n\n\t\tinitialize: function(options) {\n\t\t\tL.setOptions(this, options);\n\t\t},\n\n\t\tformatDistance: function(d /* Number (meters) */, sensitivity) {\n\t\t\tvar un = this.options.unitNames,\n\t\t\t\tsimpleRounding = sensitivity <= 0,\n\t\t\t\tround = simpleRounding ? function(v) { return v; } : L.bind(this._round, this),\n\t\t\t    v,\n\t\t\t    yards,\n\t\t\t\tdata,\n\t\t\t\tpow10;\n\n\t\t\tif (this.options.units === 'imperial') {\n\t\t\t\tyards = d / 0.9144;\n\t\t\t\tif (yards >= 1000) {\n\t\t\t\t\tdata = {\n\t\t\t\t\t\tvalue: round(d / 1609.344, sensitivity),\n\t\t\t\t\t\tunit: un.miles\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tdata = {\n\t\t\t\t\t\tvalue: round(yards, sensitivity),\n\t\t\t\t\t\tunit: un.yards\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tv = round(d, sensitivity);\n\t\t\t\tdata = {\n\t\t\t\t\tvalue: v >= 1000 ? (v / 1000) : v,\n\t\t\t\t\tunit: v >= 1000 ? un.kilometers : un.meters\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (simpleRounding) {\n\t\t\t\tpow10 = Math.pow(10, -sensitivity);\n\t\t\t\tdata.value = Math.round(data.value * pow10) / pow10;\n\t\t\t}\n\n\t\t\treturn L.Util.template(this.options.distanceTemplate, data);\n\t\t},\n\n\t\t_round: function(d, sensitivity) {\n\t\t\tvar s = sensitivity || this.options.roundingSensitivity,\n\t\t\t\tpow10 = Math.pow(10, (Math.floor(d / s) + '').length - 1),\n\t\t\t\tr = Math.floor(d / pow10),\n\t\t\t\tp = (r > 5) ? pow10 : pow10 / 2;\n\n\t\t\treturn Math.round(d / p) * p;\n\t\t},\n\n\t\tformatTime: function(t /* Number (seconds) */) {\n\t\t\tif (t > 86400) {\n\t\t\t\treturn Math.round(t / 3600) + ' h';\n\t\t\t} else if (t > 3600) {\n\t\t\t\treturn Math.floor(t / 3600) + ' h ' +\n\t\t\t\t\tMath.round((t % 3600) / 60) + ' min';\n\t\t\t} else if (t > 300) {\n\t\t\t\treturn Math.round(t / 60) + ' min';\n\t\t\t} else if (t > 60) {\n\t\t\t\treturn Math.floor(t / 60) + ' min' +\n\t\t\t\t\t(t % 60 !== 0 ? ' ' + (t % 60) + ' s' : '');\n\t\t\t} else {\n\t\t\t\treturn t + ' s';\n\t\t\t}\n\t\t},\n\n\t\tformatInstruction: function(instr, i) {\n\t\t\tif (instr.text === undefined) {\n\t\t\t\treturn L.Util.template(this._getInstructionTemplate(instr, i),\n\t\t\t\t\tL.extend({\n\t\t\t\t\t\texitStr: instr.exit ? L.Routing.Localization[this.options.language].formatOrder(instr.exit) : '',\n\t\t\t\t\t\tdir: L.Routing.Localization[this.options.language].directions[instr.direction]\n\t\t\t\t\t},\n\t\t\t\t\tinstr));\n\t\t\t} else {\n\t\t\t\treturn instr.text;\n\t\t\t}\n\t\t},\n\n\t\tgetIconName: function(instr, i) {\n\t\t\tswitch (instr.type) {\n\t\t\tcase 'Straight':\n\t\t\t\treturn (i === 0 ? 'depart' : 'continue');\n\t\t\tcase 'SlightRight':\n\t\t\t\treturn 'bear-right';\n\t\t\tcase 'Right':\n\t\t\t\treturn 'turn-right';\n\t\t\tcase 'SharpRight':\n\t\t\t\treturn 'sharp-right';\n\t\t\tcase 'TurnAround':\n\t\t\t\treturn 'u-turn';\n\t\t\tcase 'SharpLeft':\n\t\t\t\treturn 'sharp-left';\n\t\t\tcase 'Left':\n\t\t\t\treturn 'turn-left';\n\t\t\tcase 'SlightLeft':\n\t\t\t\treturn 'bear-left';\n\t\t\tcase 'WaypointReached':\n\t\t\t\treturn 'via';\n\t\t\tcase 'Roundabout':\n\t\t\t\treturn 'enter-roundabout';\n\t\t\tcase 'DestinationReached':\n\t\t\t\treturn 'arrive';\n\t\t\t}\n\t\t},\n\n\t\t_getInstructionTemplate: function(instr, i) {\n\t\t\tvar type = instr.type === 'Straight' ? (i === 0 ? 'Head' : 'Continue') : instr.type,\n\t\t\t\tstrings = L.Routing.Localization[this.options.language].instructions[type];\n\n\t\t\treturn strings[0] + (strings.length > 1 && instr.road ? strings[1] : '');\n\t\t}\n\t});\n\n\tmodule.exports = L.Routing;\n})();\n\n\n},{\"./L.Routing.Localization\":53,\"leaflet\":57}],49:[function(require,module,exports){\n(function() {\n\t'use strict';\n\n\tvar L = require('leaflet');\n\tL.Routing = L.Routing || {};\n\tL.extend(L.Routing, require('./L.Routing.Autocomplete'));\n\n\tfunction selectInputText(input) {\n\t\tif (input.setSelectionRange) {\n\t\t\t// On iOS, select() doesn't work\n\t\t\tinput.setSelectionRange(0, 9999);\n\t\t} else {\n\t\t\t// On at least IE8, setSeleectionRange doesn't exist\n\t\t\tinput.select();\n\t\t}\n\t}\n\n\tL.Routing.GeocoderElement = L.Class.extend({\n\t\tincludes: L.Mixin.Events,\n\n\t\toptions: {\n\t\t\tcreateGeocoder: function(i, nWps, options) {\n\t\t\t\tvar container = L.DomUtil.create('div', 'leaflet-routing-geocoder'),\n\t\t\t\t\tinput = L.DomUtil.create('input', '', container),\n\t\t\t\t\tremove = options.addWaypoints ? L.DomUtil.create('span', 'leaflet-routing-remove-waypoint', container) : undefined;\n\n\t\t\t\tinput.disabled = !options.addWaypoints;\n\n\t\t\t\treturn {\n\t\t\t\t\tcontainer: container,\n\t\t\t\t\tinput: input,\n\t\t\t\t\tcloseButton: remove\n\t\t\t\t};\n\t\t\t},\n\t\t\tgeocoderPlaceholder: function(i, numberWaypoints, plan) {\n\t\t\t\tvar l = L.Routing.Localization[plan.options.language].ui;\n\t\t\t\treturn i === 0 ?\n\t\t\t\t\tl.startPlaceholder :\n\t\t\t\t\t(i < numberWaypoints - 1 ?\n\t\t\t\t\t\tL.Util.template(l.viaPlaceholder, {viaNumber: i}) :\n\t\t\t\t\t\tl.endPlaceholder);\n\t\t\t},\n\n\t\t\tgeocoderClass: function() {\n\t\t\t\treturn '';\n\t\t\t},\n\n\t\t\twaypointNameFallback: function(latLng) {\n\t\t\t\tvar ns = latLng.lat < 0 ? 'S' : 'N',\n\t\t\t\t\tew = latLng.lng < 0 ? 'W' : 'E',\n\t\t\t\t\tlat = (Math.round(Math.abs(latLng.lat) * 10000) / 10000).toString(),\n\t\t\t\t\tlng = (Math.round(Math.abs(latLng.lng) * 10000) / 10000).toString();\n\t\t\t\treturn ns + lat + ', ' + ew + lng;\n\t\t\t},\n\t\t\tmaxGeocoderTolerance: 200,\n\t\t\tautocompleteOptions: {},\n\t\t\tlanguage: 'en',\n\t\t},\n\n\t\tinitialize: function(wp, i, nWps, options) {\n\t\t\tL.setOptions(this, options);\n\n\t\t\tvar g = this.options.createGeocoder(i, nWps, this.options),\n\t\t\t\tcloseButton = g.closeButton,\n\t\t\t\tgeocoderInput = g.input;\n\t\t\tgeocoderInput.setAttribute('placeholder', this.options.geocoderPlaceholder(i, nWps, this));\n\t\t\tgeocoderInput.className = this.options.geocoderClass(i, nWps);\n\n\t\t\tthis._element = g;\n\t\t\tthis._waypoint = wp;\n\n\t\t\tthis.update();\n\t\t\t// This has to be here, or geocoder's value will not be properly\n\t\t\t// initialized.\n\t\t\t// TODO: look into why and make _updateWaypointName fix this.\n\t\t\tgeocoderInput.value = wp.name;\n\n\t\t\tL.DomEvent.addListener(geocoderInput, 'click', function() {\n\t\t\t\tselectInputText(this);\n\t\t\t}, geocoderInput);\n\n\t\t\tif (closeButton) {\n\t\t\t\tL.DomEvent.addListener(closeButton, 'click', function() {\n\t\t\t\t\tthis.fire('delete', { waypoint: this._waypoint });\n\t\t\t\t}, this);\n\t\t\t}\n\n\t\t\tnew L.Routing.Autocomplete(geocoderInput, function(r) {\n\t\t\t\t\tgeocoderInput.value = r.name;\n\t\t\t\t\twp.name = r.name;\n\t\t\t\t\twp.latLng = r.center;\n\t\t\t\t\tthis.fire('geocoded', { waypoint: wp, value: r });\n\t\t\t\t}, this, L.extend({\n\t\t\t\t\tresultFn: this.options.geocoder.geocode,\n\t\t\t\t\tresultContext: this.options.geocoder,\n\t\t\t\t\tautocompleteFn: this.options.geocoder.suggest,\n\t\t\t\t\tautocompleteContext: this.options.geocoder\n\t\t\t\t}, this.options.autocompleteOptions));\n\t\t},\n\n\t\tgetContainer: function() {\n\t\t\treturn this._element.container;\n\t\t},\n\n\t\tsetValue: function(v) {\n\t\t\tthis._element.input.value = v;\n\t\t},\n\n\t\tupdate: function(force) {\n\t\t\tvar wp = this._waypoint,\n\t\t\t\twpCoords;\n\n\t\t\twp.name = wp.name || '';\n\n\t\t\tif (wp.latLng && (force || !wp.name)) {\n\t\t\t\twpCoords = this.options.waypointNameFallback(wp.latLng);\n\t\t\t\tif (this.options.geocoder && this.options.geocoder.reverse) {\n\t\t\t\t\tthis.options.geocoder.reverse(wp.latLng, 67108864 /* zoom 18 */, function(rs) {\n\t\t\t\t\t\tif (rs.length > 0 && rs[0].center.distanceTo(wp.latLng) < this.options.maxGeocoderTolerance) {\n\t\t\t\t\t\t\twp.name = rs[0].name;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twp.name = wpCoords;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._update();\n\t\t\t\t\t}, this);\n\t\t\t\t} else {\n\t\t\t\t\twp.name = wpCoords;\n\t\t\t\t\tthis._update();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfocus: function() {\n\t\t\tvar input = this._element.input;\n\t\t\tinput.focus();\n\t\t\tselectInputText(input);\n\t\t},\n\n\t\t_update: function() {\n\t\t\tvar wp = this._waypoint,\n\t\t\t    value = wp && wp.name ? wp.name : '';\n\t\t\tthis.setValue(value);\n\t\t\tthis.fire('reversegeocoded', {waypoint: wp, value: value});\n\t\t}\n\t});\n\n\tL.Routing.geocoderElement = function(wp, i, nWps, plan) {\n\t\treturn new L.Routing.GeocoderElement(wp, i, nWps, plan);\n\t};\n\n\tmodule.exports = L.Routing;\n})();\n\n},{\"./L.Routing.Autocomplete\":45,\"leaflet\":57}],50:[function(require,module,exports){\n(function() {\n\t'use strict';\n\n\tvar L = require('leaflet');\n\n\tL.Routing = L.Routing || {};\n\tL.extend(L.Routing, require('./L.Routing.Formatter'));\n\tL.extend(L.Routing, require('./L.Routing.ItineraryBuilder'));\n\n\tL.Routing.Itinerary = L.Control.extend({\n\t\tincludes: L.Mixin.Events,\n\n\t\toptions: {\n\t\t\tpointMarkerStyle: {\n\t\t\t\tradius: 5,\n\t\t\t\tcolor: '#03f',\n\t\t\t\tfillColor: 'white',\n\t\t\t\topacity: 1,\n\t\t\t\tfillOpacity: 0.7\n\t\t\t},\n\t\t\tsummaryTemplate: '<h2>{name}</h2><h3>{distance}, {time}</h3>',\n\t\t\ttimeTemplate: '{time}',\n\t\t\tcontainerClassName: '',\n\t\t\talternativeClassName: '',\n\t\t\tminimizedClassName: '',\n\t\t\titineraryClassName: '',\n\t\t\ttotalDistanceRoundingSensitivity: -1,\n\t\t\tshow: true,\n\t\t\tcollapsible: undefined,\n\t\t\tcollapseBtn: function(itinerary) {\n\t\t\t\tvar collapseBtn = L.DomUtil.create('span', itinerary.options.collapseBtnClass);\n\t\t\t\tL.DomEvent.on(collapseBtn, 'click', itinerary._toggle, itinerary);\n\t\t\t\titinerary._container.insertBefore(collapseBtn, itinerary._container.firstChild);\n\t\t\t},\n\t\t\tcollapseBtnClass: 'leaflet-routing-collapse-btn'\n\t\t},\n\n\t\tinitialize: function(options) {\n\t\t\tL.setOptions(this, options);\n\t\t\tthis._formatter = this.options.formatter || new L.Routing.Formatter(this.options);\n\t\t\tthis._itineraryBuilder = this.options.itineraryBuilder || new L.Routing.ItineraryBuilder({\n\t\t\t\tcontainerClassName: this.options.itineraryClassName\n\t\t\t});\n\t\t},\n\n\t\tonAdd: function(map) {\n\t\t\tvar collapsible = this.options.collapsible;\n\n\t\t\tcollapsible = collapsible || (collapsible === undefined && map.getSize().x <= 640);\n\n\t\t\tthis._container = L.DomUtil.create('div', 'leaflet-routing-container leaflet-bar ' +\n\t\t\t\t(!this.options.show ? 'leaflet-routing-container-hide ' : '') +\n\t\t\t\t(collapsible ? 'leaflet-routing-collapsible ' : '') +\n\t\t\t\tthis.options.containerClassName);\n\t\t\tthis._altContainer = this.createAlternativesContainer();\n\t\t\tthis._container.appendChild(this._altContainer);\n\t\t\tL.DomEvent.disableClickPropagation(this._container);\n\t\t\tL.DomEvent.addListener(this._container, 'mousewheel', function(e) {\n\t\t\t\tL.DomEvent.stopPropagation(e);\n\t\t\t});\n\n\t\t\tif (collapsible) {\n\t\t\t\tthis.options.collapseBtn(this);\n\t\t\t}\n\n\t\t\treturn this._container;\n\t\t},\n\n\t\tonRemove: function() {\n\t\t},\n\n\t\tcreateAlternativesContainer: function() {\n\t\t\treturn L.DomUtil.create('div', 'leaflet-routing-alternatives-container');\n\t\t},\n\n\t\tsetAlternatives: function(routes) {\n\t\t\tvar i,\n\t\t\t    alt,\n\t\t\t    altDiv;\n\n\t\t\tthis._clearAlts();\n\n\t\t\tthis._routes = routes;\n\n\t\t\tfor (i = 0; i < this._routes.length; i++) {\n\t\t\t\talt = this._routes[i];\n\t\t\t\taltDiv = this._createAlternative(alt, i);\n\t\t\t\tthis._altContainer.appendChild(altDiv);\n\t\t\t\tthis._altElements.push(altDiv);\n\t\t\t}\n\n\t\t\tthis._selectRoute({route: this._routes[0], alternatives: this._routes.slice(1)});\n\n\t\t\treturn this;\n\t\t},\n\n\t\tshow: function() {\n\t\t\tL.DomUtil.removeClass(this._container, 'leaflet-routing-container-hide');\n\t\t},\n\n\t\thide: function() {\n\t\t\tL.DomUtil.addClass(this._container, 'leaflet-routing-container-hide');\n\t\t},\n\n\t\t_toggle: function() {\n\t\t\tvar collapsed = L.DomUtil.hasClass(this._container, 'leaflet-routing-container-hide');\n\t\t\tthis[collapsed ? 'show' : 'hide']();\n\t\t},\n\n\t\t_createAlternative: function(alt, i) {\n\t\t\tvar altDiv = L.DomUtil.create('div', 'leaflet-routing-alt ' +\n\t\t\t\tthis.options.alternativeClassName +\n\t\t\t\t(i > 0 ? ' leaflet-routing-alt-minimized ' + this.options.minimizedClassName : '')),\n\t\t\t\ttemplate = this.options.summaryTemplate,\n\t\t\t\tdata = L.extend({\n\t\t\t\t\tname: alt.name,\n\t\t\t\t\tdistance: this._formatter.formatDistance(alt.summary.totalDistance, this.options.totalDistanceRoundingSensitivity),\n\t\t\t\t\ttime: this._formatter.formatTime(alt.summary.totalTime)\n\t\t\t\t}, alt);\n\t\t\taltDiv.innerHTML = typeof(template) === 'function' ? template(data) : L.Util.template(template, data);\n\t\t\tL.DomEvent.addListener(altDiv, 'click', this._onAltClicked, this);\n\t\t\tthis.on('routeselected', this._selectAlt, this);\n\n\t\t\taltDiv.appendChild(this._createItineraryContainer(alt));\n\t\t\treturn altDiv;\n\t\t},\n\n\t\t_clearAlts: function() {\n\t\t\tvar el = this._altContainer;\n\t\t\twhile (el && el.firstChild) {\n\t\t\t\tel.removeChild(el.firstChild);\n\t\t\t}\n\n\t\t\tthis._altElements = [];\n\t\t},\n\n\t\t_createItineraryContainer: function(r) {\n\t\t\tvar container = this._itineraryBuilder.createContainer(),\n\t\t\t    steps = this._itineraryBuilder.createStepsContainer(),\n\t\t\t    i,\n\t\t\t    instr,\n\t\t\t    step,\n\t\t\t    distance,\n\t\t\t    text,\n\t\t\t    icon;\n\n\t\t\tcontainer.appendChild(steps);\n\n\t\t\tfor (i = 0; i < r.instructions.length; i++) {\n\t\t\t\tinstr = r.instructions[i];\n\t\t\t\ttext = this._formatter.formatInstruction(instr, i);\n\t\t\t\tdistance = this._formatter.formatDistance(instr.distance);\n\t\t\t\ticon = this._formatter.getIconName(instr, i);\n\t\t\t\tstep = this._itineraryBuilder.createStep(text, distance, icon, steps);\n\n\t\t\t\tthis._addRowListeners(step, r.coordinates[instr.index]);\n\t\t\t}\n\n\t\t\treturn container;\n\t\t},\n\n\t\t_addRowListeners: function(row, coordinate) {\n\t\t\tL.DomEvent.addListener(row, 'mouseover', function() {\n\t\t\t\tthis._marker = L.circleMarker(coordinate,\n\t\t\t\t\tthis.options.pointMarkerStyle).addTo(this._map);\n\t\t\t}, this);\n\t\t\tL.DomEvent.addListener(row, 'mouseout', function() {\n\t\t\t\tif (this._marker) {\n\t\t\t\t\tthis._map.removeLayer(this._marker);\n\t\t\t\t\tdelete this._marker;\n\t\t\t\t}\n\t\t\t}, this);\n\t\t\tL.DomEvent.addListener(row, 'click', function(e) {\n\t\t\t\tthis._map.panTo(coordinate);\n\t\t\t\tL.DomEvent.stopPropagation(e);\n\t\t\t}, this);\n\t\t},\n\n\t\t_onAltClicked: function(e) {\n\t\t\tvar altElem = e.target || window.event.srcElement;\n\t\t\twhile (!L.DomUtil.hasClass(altElem, 'leaflet-routing-alt')) {\n\t\t\t\taltElem = altElem.parentElement;\n\t\t\t}\n\n\t\t\tvar j = this._altElements.indexOf(altElem);\n\t\t\tvar alts = this._routes.slice();\n\t\t\tvar route = alts.splice(j, 1)[0];\n\n\t\t\tthis.fire('routeselected', {\n\t\t\t\troute: route,\n\t\t\t\talternatives: alts\n\t\t\t});\n\t\t},\n\n\t\t_selectAlt: function(e) {\n\t\t\tvar altElem,\n\t\t\t    j,\n\t\t\t    n,\n\t\t\t    classFn;\n\n\t\t\taltElem = this._altElements[e.route.routesIndex];\n\n\t\t\tif (L.DomUtil.hasClass(altElem, 'leaflet-routing-alt-minimized')) {\n\t\t\t\tfor (j = 0; j < this._altElements.length; j++) {\n\t\t\t\t\tn = this._altElements[j];\n\t\t\t\t\tclassFn = j === e.route.routesIndex ? 'removeClass' : 'addClass';\n\t\t\t\t\tL.DomUtil[classFn](n, 'leaflet-routing-alt-minimized');\n\t\t\t\t\tif (this.options.minimizedClassName) {\n\t\t\t\t\t\tL.DomUtil[classFn](n, this.options.minimizedClassName);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (j !== e.route.routesIndex) n.scrollTop = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tL.DomEvent.stop(e);\n\t\t},\n\n\t\t_selectRoute: function(routes) {\n\t\t\tif (this._marker) {\n\t\t\t\tthis._map.removeLayer(this._marker);\n\t\t\t\tdelete this._marker;\n\t\t\t}\n\t\t\tthis.fire('routeselected', routes);\n\t\t}\n\t});\n\n\tL.Routing.itinerary = function(options) {\n\t\treturn new L.Routing.Itinerary(options);\n\t};\n\n\tmodule.exports = L.Routing;\n})();\n\n},{\"./L.Routing.Formatter\":48,\"./L.Routing.ItineraryBuilder\":51,\"leaflet\":57}],51:[function(require,module,exports){\n(function() {\n\t'use strict';\n\n\tvar L = require('leaflet');\n\tL.Routing = L.Routing || {};\n\n\tL.Routing.ItineraryBuilder = L.Class.extend({\n\t\toptions: {\n\t\t\tcontainerClassName: ''\n\t\t},\n\n\t\tinitialize: function(options) {\n\t\t\tL.setOptions(this, options);\n\t\t},\n\n\t\tcreateContainer: function(className) {\n\t\t\tvar table = L.DomUtil.create('table', className || ''),\n\t\t\t\tcolgroup = L.DomUtil.create('colgroup', '', table);\n\n\t\t\tL.DomUtil.create('col', 'leaflet-routing-instruction-icon', colgroup);\n\t\t\tL.DomUtil.create('col', 'leaflet-routing-instruction-text', colgroup);\n\t\t\tL.DomUtil.create('col', 'leaflet-routing-instruction-distance', colgroup);\n\n\t\t\treturn table;\n\t\t},\n\n\t\tcreateStepsContainer: function() {\n\t\t\treturn L.DomUtil.create('tbody', '');\n\t\t},\n\n\t\tcreateStep: function(text, distance, icon, steps) {\n\t\t\tvar row = L.DomUtil.create('tr', '', steps),\n\t\t\t\tspan,\n\t\t\t\ttd;\n\t\t\ttd = L.DomUtil.create('td', '', row);\n\t\t\tspan = L.DomUtil.create('span', 'leaflet-routing-icon leaflet-routing-icon-'+icon, td);\n\t\t\ttd.appendChild(span);\n\t\t\ttd = L.DomUtil.create('td', '', row);\n\t\t\ttd.appendChild(document.createTextNode(text));\n\t\t\ttd = L.DomUtil.create('td', '', row);\n\t\t\ttd.appendChild(document.createTextNode(distance));\n\t\t\treturn row;\n\t\t}\n\t});\n\n\tmodule.exports = L.Routing;\n})();\n\n},{\"leaflet\":57}],52:[function(require,module,exports){\n(function() {\n\t'use strict';\n\n\tvar L = require('leaflet');\n\n\tL.Routing = L.Routing || {};\n\n\tL.Routing.Line = L.LayerGroup.extend({\n\t\tincludes: L.Mixin.Events,\n\n\t\toptions: {\n\t\t\tstyles: [\n\t\t\t\t{color: 'black', opacity: 0.15, weight: 9},\n\t\t\t\t{color: 'white', opacity: 0.8, weight: 6},\n\t\t\t\t{color: 'red', opacity: 1, weight: 2}\n\t\t\t],\n\t\t\tmissingRouteStyles: [\n\t\t\t\t{color: 'black', opacity: 0.15, weight: 7},\n\t\t\t\t{color: 'white', opacity: 0.6, weight: 4},\n\t\t\t\t{color: 'gray', opacity: 0.8, weight: 2, dashArray: '7,12'}\n\t\t\t],\n\t\t\taddWaypoints: true,\n\t\t\textendToWaypoints: true,\n\t\t\tmissingRouteTolerance: 10\n\t\t},\n\n\t\tinitialize: function(route, options) {\n\t\t\tL.setOptions(this, options);\n\t\t\tL.LayerGroup.prototype.initialize.call(this, options);\n\t\t\tthis._route = route;\n\n\t\t\tif (this.options.extendToWaypoints) {\n\t\t\t\tthis._extendToWaypoints();\n\t\t\t}\n\n\t\t\tthis._addSegment(\n\t\t\t\troute.coordinates,\n\t\t\t\tthis.options.styles,\n\t\t\t\tthis.options.addWaypoints);\n\t\t},\n\n\t\taddTo: function(map) {\n\t\t\tmap.addLayer(this);\n\t\t\treturn this;\n\t\t},\n\t\tgetBounds: function() {\n\t\t\treturn L.latLngBounds(this._route.coordinates);\n\t\t},\n\n\t\t_findWaypointIndices: function() {\n\t\t\tvar wps = this._route.inputWaypoints,\n\t\t\t    indices = [],\n\t\t\t    i;\n\t\t\tfor (i = 0; i < wps.length; i++) {\n\t\t\t\tindices.push(this._findClosestRoutePoint(wps[i].latLng));\n\t\t\t}\n\n\t\t\treturn indices;\n\t\t},\n\n\t\t_findClosestRoutePoint: function(latlng) {\n\t\t\tvar minDist = Number.MAX_VALUE,\n\t\t\t\tminIndex,\n\t\t\t    i,\n\t\t\t    d;\n\n\t\t\tfor (i = this._route.coordinates.length - 1; i >= 0 ; i--) {\n\t\t\t\t// TODO: maybe do this in pixel space instead?\n\t\t\t\td = latlng.distanceTo(this._route.coordinates[i]);\n\t\t\t\tif (d < minDist) {\n\t\t\t\t\tminIndex = i;\n\t\t\t\t\tminDist = d;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn minIndex;\n\t\t},\n\n\t\t_extendToWaypoints: function() {\n\t\t\tvar wps = this._route.inputWaypoints,\n\t\t\t\twpIndices = this._getWaypointIndices(),\n\t\t\t    i,\n\t\t\t    wpLatLng,\n\t\t\t    routeCoord;\n\n\t\t\tfor (i = 0; i < wps.length; i++) {\n\t\t\t\twpLatLng = wps[i].latLng;\n\t\t\t\trouteCoord = L.latLng(this._route.coordinates[wpIndices[i]]);\n\t\t\t\tif (wpLatLng.distanceTo(routeCoord) >\n\t\t\t\t\tthis.options.missingRouteTolerance) {\n\t\t\t\t\tthis._addSegment([wpLatLng, routeCoord],\n\t\t\t\t\t\tthis.options.missingRouteStyles);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_addSegment: function(coords, styles, mouselistener) {\n\t\t\tvar i,\n\t\t\t\tpl;\n\n\t\t\tfor (i = 0; i < styles.length; i++) {\n\t\t\t\tpl = L.polyline(coords, styles[i]);\n\t\t\t\tthis.addLayer(pl);\n\t\t\t\tif (mouselistener) {\n\t\t\t\t\tpl.on('mousedown', this._onLineTouched, this);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_findNearestWpBefore: function(i) {\n\t\t\tvar wpIndices = this._getWaypointIndices(),\n\t\t\t\tj = wpIndices.length - 1;\n\t\t\twhile (j >= 0 && wpIndices[j] > i) {\n\t\t\t\tj--;\n\t\t\t}\n\n\t\t\treturn j;\n\t\t},\n\n\t\t_onLineTouched: function(e) {\n\t\t\tvar afterIndex = this._findNearestWpBefore(this._findClosestRoutePoint(e.latlng));\n\t\t\tthis.fire('linetouched', {\n\t\t\t\tafterIndex: afterIndex,\n\t\t\t\tlatlng: e.latlng\n\t\t\t});\n\t\t},\n\n\t\t_getWaypointIndices: function() {\n\t\t\tif (!this._wpIndices) {\n\t\t\t\tthis._wpIndices = this._route.waypointIndices || this._findWaypointIndices();\n\t\t\t}\n\n\t\t\treturn this._wpIndices;\n\t\t}\n\t});\n\n\tL.Routing.line = function(route, options) {\n\t\treturn new L.Routing.Line(route, options);\n\t};\n\n\tmodule.exports = L.Routing;\n})();\n\n},{\"leaflet\":57}],53:[function(require,module,exports){\n(function() {\n\t'use strict';\n\tL.Routing = L.Routing || {};\n\n\tL.Routing.Localization = {\n\t\t'en': {\n\t\t\tdirections: {\n\t\t\t\tN: 'north',\n\t\t\t\tNE: 'northeast',\n\t\t\t\tE: 'east',\n\t\t\t\tSE: 'southeast',\n\t\t\t\tS: 'south',\n\t\t\t\tSW: 'southwest',\n\t\t\t\tW: 'west',\n\t\t\t\tNW: 'northwest'\n\t\t\t},\n\t\t\tinstructions: {\n\t\t\t\t// instruction, postfix if the road is named\n\t\t\t\t'Head':\n\t\t\t\t\t['Head {dir}', ' on {road}'],\n\t\t\t\t'Continue':\n\t\t\t\t\t['Continue {dir}', ' on {road}'],\n\t\t\t\t'SlightRight':\n\t\t\t\t\t['Slight right', ' onto {road}'],\n\t\t\t\t'Right':\n\t\t\t\t\t['Right', ' onto {road}'],\n\t\t\t\t'SharpRight':\n\t\t\t\t\t['Sharp right', ' onto {road}'],\n\t\t\t\t'TurnAround':\n\t\t\t\t\t['Turn around'],\n\t\t\t\t'SharpLeft':\n\t\t\t\t\t['Sharp left', ' onto {road}'],\n\t\t\t\t'Left':\n\t\t\t\t\t['Left', ' onto {road}'],\n\t\t\t\t'SlightLeft':\n\t\t\t\t\t['Slight left', ' onto {road}'],\n\t\t\t\t'WaypointReached':\n\t\t\t\t\t['Waypoint reached'],\n\t\t\t\t'Roundabout':\n\t\t\t\t\t['Take the {exitStr} exit in the roundabout', ' onto {road}'],\n\t\t\t\t'DestinationReached':\n\t\t\t\t\t['Destination reached'],\n\t\t\t},\n\t\t\tformatOrder: function(n) {\n\t\t\t\tvar i = n % 10 - 1,\n\t\t\t\tsuffix = ['st', 'nd', 'rd'];\n\n\t\t\t\treturn suffix[i] ? n + suffix[i] : n + 'th';\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tstartPlaceholder: 'Start',\n\t\t\t\tviaPlaceholder: 'Via {viaNumber}',\n\t\t\t\tendPlaceholder: 'End'\n\t\t\t}\n\t\t},\n\n\t\t'de': {\n\t\t\tdirections: {\n\t\t\t\tN: 'Norden',\n\t\t\t\tNE: 'Nordosten',\n\t\t\t\tE: 'Osten',\n\t\t\t\tSE: 'Südosten',\n\t\t\t\tS: 'Süden',\n\t\t\t\tSW: 'Südwesten',\n\t\t\t\tW: 'Westen',\n\t\t\t\tNW: 'Nordwesten'\n\t\t\t},\n\t\t\tinstructions: {\n\t\t\t\t// instruction, postfix if the road is named\n\t\t\t\t'Head':\n\t\t\t\t\t['Richtung {dir}', ' auf {road}'],\n\t\t\t\t'Continue':\n\t\t\t\t\t['Geradeaus Richtung {dir}', ' auf {road}'],\n\t\t\t\t'SlightRight':\n\t\t\t\t\t['Leicht rechts abbiegen', ' auf {road}'],\n\t\t\t\t'Right':\n\t\t\t\t\t['Rechts abbiegen', ' auf {road}'],\n\t\t\t\t'SharpRight':\n\t\t\t\t\t['Scharf rechts abbiegen', ' auf {road}'],\n\t\t\t\t'TurnAround':\n\t\t\t\t\t['Wenden'],\n\t\t\t\t'SharpLeft':\n\t\t\t\t\t['Scharf links abbiegen', ' auf {road}'],\n\t\t\t\t'Left':\n\t\t\t\t\t['Links abbiegen', ' auf {road}'],\n\t\t\t\t'SlightLeft':\n\t\t\t\t\t['Leicht links abbiegen', ' auf {road}'],\n\t\t\t\t'WaypointReached':\n\t\t\t\t\t['Zwischenhalt erreicht'],\n\t\t\t\t'Roundabout':\n\t\t\t\t\t['Nehmen Sie die {exitStr} Ausfahrt im Kreisverkehr', ' auf {road}'],\n\t\t\t\t'DestinationReached':\n\t\t\t\t\t['Sie haben ihr Ziel erreicht'],\n\t\t\t},\n\t\t\tformatOrder: function(n) {\n\t\t\t\treturn n + '.';\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tstartPlaceholder: 'Start',\n\t\t\t\tviaPlaceholder: 'Via {viaNumber}',\n\t\t\t\tendPlaceholder: 'Ziel'\n\t\t\t}\n\t\t},\n\n\t\t'sv': {\n\t\t\tdirections: {\n\t\t\t\tN: 'norr',\n\t\t\t\tNE: 'nordost',\n\t\t\t\tE: 'öst',\n\t\t\t\tSE: 'sydost',\n\t\t\t\tS: 'syd',\n\t\t\t\tSW: 'sydväst',\n\t\t\t\tW: 'väst',\n\t\t\t\tNW: 'nordväst'\n\t\t\t},\n\t\t\tinstructions: {\n\t\t\t\t// instruction, postfix if the road is named\n\t\t\t\t'Head':\n\t\t\t\t\t['Åk åt {dir}', ' på {road}'],\n\t\t\t\t'Continue':\n\t\t\t\t\t['Fortsätt {dir}', ' på {road}'],\n\t\t\t\t'SlightRight':\n\t\t\t\t\t['Svagt höger', ' på {road}'],\n\t\t\t\t'Right':\n\t\t\t\t\t['Sväng höger', ' på {road}'],\n\t\t\t\t'SharpRight':\n\t\t\t\t\t['Skarpt höger', ' på {road}'],\n\t\t\t\t'TurnAround':\n\t\t\t\t\t['Vänd'],\n\t\t\t\t'SharpLeft':\n\t\t\t\t\t['Skarpt vänster', ' på {road}'],\n\t\t\t\t'Left':\n\t\t\t\t\t['Sväng vänster', ' på {road}'],\n\t\t\t\t'SlightLeft':\n\t\t\t\t\t['Svagt vänster', ' på {road}'],\n\t\t\t\t'WaypointReached':\n\t\t\t\t\t['Viapunkt nådd'],\n\t\t\t\t'Roundabout':\n\t\t\t\t\t['Tag {exitStr} avfarten i rondellen', ' till {road}'],\n\t\t\t\t'DestinationReached':\n\t\t\t\t\t['Framme vid resans mål'],\n\t\t\t},\n\t\t\tformatOrder: function(n) {\n\t\t\t\treturn ['första', 'andra', 'tredje', 'fjärde', 'femte',\n\t\t\t\t\t'sjätte', 'sjunde', 'åttonde', 'nionde', 'tionde'\n\t\t\t\t\t/* Can't possibly be more than ten exits, can there? */][n - 1];\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tstartPlaceholder: 'Från',\n\t\t\t\tviaPlaceholder: 'Via {viaNumber}',\n\t\t\t\tendPlaceholder: 'Till'\n\t\t\t}\n\t\t},\n\n\t\t'sp': {\n\t\t\tdirections: {\n\t\t\t\tN: 'norte',\n\t\t\t\tNE: 'noreste',\n\t\t\t\tE: 'este',\n\t\t\t\tSE: 'sureste',\n\t\t\t\tS: 'sur',\n\t\t\t\tSW: 'suroeste',\n\t\t\t\tW: 'oeste',\n\t\t\t\tNW: 'noroeste'\n\t\t\t},\n\t\t\tinstructions: {\n\t\t\t\t// instruction, postfix if the road is named\n\t\t\t\t'Head':\n\t\t\t\t\t['Derecho {dir}', ' sobre {road}'],\n\t\t\t\t'Continue':\n\t\t\t\t\t['Continuar {dir}', ' en {road}'],\n\t\t\t\t'SlightRight':\n\t\t\t\t\t['Leve giro a la derecha', ' sobre {road}'],\n\t\t\t\t'Right':\n\t\t\t\t\t['Derecha', ' sobre {road}'],\n\t\t\t\t'SharpRight':\n\t\t\t\t\t['Giro pronunciado a la derecha', ' sobre {road}'],\n\t\t\t\t'TurnAround':\n\t\t\t\t\t['Dar vuelta'],\n\t\t\t\t'SharpLeft':\n\t\t\t\t\t['Giro pronunciado a la izquierda', ' sobre {road}'],\n\t\t\t\t'Left':\n\t\t\t\t\t['Izquierda', ' en {road}'],\n\t\t\t\t'SlightLeft':\n\t\t\t\t\t['Leve giro a la izquierda', ' en {road}'],\n\t\t\t\t'WaypointReached':\n\t\t\t\t\t['Llegó a un punto del camino'],\n\t\t\t\t'Roundabout':\n\t\t\t\t\t['Tomar {exitStr} salida en la rotonda', ' en {road}'],\n\t\t\t\t'DestinationReached':\n\t\t\t\t\t['Llegada a destino'],\n\t\t\t},\n\t\t\tformatOrder: function(n) {\n\t\t\t\treturn n + 'º';\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tstartPlaceholder: 'Inicio',\n\t\t\t\tviaPlaceholder: 'Via {viaNumber}',\n\t\t\t\tendPlaceholder: 'Destino'\n\t\t\t}\n\t\t},\n\t\t'nl': {\n\t\t\tdirections: {\n\t\t\t\tN: 'noordelijke',\n\t\t\t\tNE: 'noordoostelijke',\n\t\t\t\tE: 'oostelijke',\n\t\t\t\tSE: 'zuidoostelijke',\n\t\t\t\tS: 'zuidelijke',\n\t\t\t\tSW: 'zuidewestelijke',\n\t\t\t\tW: 'westelijke',\n\t\t\t\tNW: 'noordwestelijke'\n\t\t\t},\n\t\t\tinstructions: {\n\t\t\t\t// instruction, postfix if the road is named\n\t\t\t\t'Head':\n\t\t\t\t\t['Vertrek in {dir} richting', ' de {road} op'],\n\t\t\t\t'Continue':\n\t\t\t\t\t['Ga in {dir} richting', ' de {road} op'],\n\t\t\t\t'SlightRight':\n\t\t\t\t\t['Volg de weg naar rechts', ' de {road} op'],\n\t\t\t\t'Right':\n\t\t\t\t\t['Ga rechtsaf', ' de {road} op'],\n\t\t\t\t'SharpRight':\n\t\t\t\t\t['Ga scherpe bocht naar rechts', ' de {road} op'],\n\t\t\t\t'TurnAround':\n\t\t\t\t\t['Keer om'],\n\t\t\t\t'SharpLeft':\n\t\t\t\t\t['Ga scherpe bocht naar links', ' de {road} op'],\n\t\t\t\t'Left':\n\t\t\t\t\t['Ga linksaf', ' de {road} op'],\n\t\t\t\t'SlightLeft':\n\t\t\t\t\t['Volg de weg naar links', ' de {road} op'],\n\t\t\t\t'WaypointReached':\n\t\t\t\t\t['Aangekomen bij tussenpunt'],\n\t\t\t\t'Roundabout':\n\t\t\t\t\t['Neem de {exitStr} afslag op de rotonde', ' de {road} op'],\n\t\t\t\t'DestinationReached':\n\t\t\t\t\t['Aangekomen op eindpunt'],\n\t\t\t},\n\t\t\tformatOrder: function(n) {\n\t\t\t\tif (n === 1 || n >= 20) {\n\t\t\t\t\treturn n + 'ste';\n\t\t\t\t} else {\n\t\t\t\t\treturn n + 'de';\n\t\t\t\t}\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tstartPlaceholder: 'Vertrekpunt',\n\t\t\t\tviaPlaceholder: 'Via {viaNumber}',\n\t\t\t\tendPlaceholder: 'Bestemming'\n\t\t\t}\n\t\t},\n\t\t'fr': {\n\t\t\tdirections: {\n\t\t\t\tN: 'nord',\n\t\t\t\tNE: 'nord-est',\n\t\t\t\tE: 'est',\n\t\t\t\tSE: 'sud-est',\n\t\t\t\tS: 'sud',\n\t\t\t\tSW: 'sud-ouest',\n\t\t\t\tW: 'ouest',\n\t\t\t\tNW: 'nord-ouest'\n\t\t\t},\n\t\t\tinstructions: {\n\t\t\t\t// instruction, postfix if the road is named\n\t\t\t\t'Head':\n\t\t\t\t\t['Tout droit au {dir}', ' sur {road}'],\n\t\t\t\t'Continue':\n\t\t\t\t\t['Continuer au {dir}', ' sur {road}'],\n\t\t\t\t'SlightRight':\n\t\t\t\t\t['Légèrement à droite', ' sur {road}'],\n\t\t\t\t'Right':\n\t\t\t\t\t['A droite', ' sur {road}'],\n\t\t\t\t'SharpRight':\n\t\t\t\t\t['Complètement à droite', ' sur {road}'],\n\t\t\t\t'TurnAround':\n\t\t\t\t\t['Faire demi-tour'],\n\t\t\t\t'SharpLeft':\n\t\t\t\t\t['Complètement à gauche', ' sur {road}'],\n\t\t\t\t'Left':\n\t\t\t\t\t['A gauche', ' sur {road}'],\n\t\t\t\t'SlightLeft':\n\t\t\t\t\t['Légèrement à gauche', ' sur {road}'],\n\t\t\t\t'WaypointReached':\n\t\t\t\t\t['Point d\\'étape atteint'],\n\t\t\t\t'Roundabout':\n\t\t\t\t\t['Au rond-point, prenez la {exitStr} sortie', ' sur {road}'],\n\t\t\t\t'DestinationReached':\n\t\t\t\t\t['Destination atteinte'],\n\t\t\t},\n\t\t\tformatOrder: function(n) {\n\t\t\t\treturn n + 'º';\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tstartPlaceholder: 'Départ',\n\t\t\t\tviaPlaceholder: 'Intermédiaire {viaNumber}',\n\t\t\t\tendPlaceholder: 'Arrivée'\n\t\t\t}\n\t\t},\n\t\t'it': {\n\t\t\tdirections: {\n\t\t\t\tN: 'nord',\n\t\t\t\tNE: 'nord-est',\n\t\t\t\tE: 'est',\n\t\t\t\tSE: 'sud-est',\n\t\t\t\tS: 'sud',\n\t\t\t\tSW: 'sud-ovest',\n\t\t\t\tW: 'ovest',\n\t\t\t\tNW: 'nord-ovest'\n\t\t\t},\n\t\t\tinstructions: {\n\t\t\t\t// instruction, postfix if the road is named\n\t\t\t\t'Head':\n\t\t\t\t\t['Dritto verso {dir}', ' su {road}'],\n\t\t\t\t'Continue':\n\t\t\t\t\t['Continuare verso {dir}', ' su {road}'],\n\t\t\t\t'SlightRight':\n\t\t\t\t\t['Mantenere la destra', ' su {road}'],\n\t\t\t\t'Right':\n\t\t\t\t\t['A destra', ' su {road}'],\n\t\t\t\t'SharpRight':\n\t\t\t\t\t['Strettamente a destra', ' su {road}'],\n\t\t\t\t'TurnAround':\n\t\t\t\t\t['Fare inversione di marcia'],\n\t\t\t\t'SharpLeft':\n\t\t\t\t\t['Strettamente a sinistra', ' su {road}'],\n\t\t\t\t'Left':\n\t\t\t\t\t['A sinistra', ' sur {road}'],\n\t\t\t\t'SlightLeft':\n\t\t\t\t\t['Mantenere la sinistra', ' su {road}'],\n\t\t\t\t'WaypointReached':\n\t\t\t\t\t['Punto di passaggio raggiunto'],\n\t\t\t\t'Roundabout':\n\t\t\t\t\t['Alla rotonda, prendere la {exitStr} uscita'],\n\t\t\t\t'DestinationReached':\n\t\t\t\t\t['Destinazione raggiunta'],\n\t\t\t},\n\t\t\tformatOrder: function(n) {\n\t\t\t\treturn n + 'º';\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tstartPlaceholder: 'Partenza',\n\t\t\t\tviaPlaceholder: 'Intermedia {viaNumber}',\n\t\t\t\tendPlaceholder: 'Destinazione'\n\t\t\t}\n\t\t},\n\t\t'pt': {\n\t\t\tdirections: {\n\t\t\t\tN: 'norte',\n\t\t\t\tNE: 'nordeste',\n\t\t\t\tE: 'leste',\n\t\t\t\tSE: 'sudeste',\n\t\t\t\tS: 'sul',\n\t\t\t\tSW: 'sudoeste',\n\t\t\t\tW: 'oeste',\n\t\t\t\tNW: 'noroeste'\n\t\t\t},\n\t\t\tinstructions: {\n\t\t\t\t// instruction, postfix if the road is named\n\t\t\t\t'Head':\n\t\t\t\t\t['Siga {dir}', ' na {road}'],\n\t\t\t\t'Continue':\n\t\t\t\t\t['Continue {dir}', ' na {road}'],\n\t\t\t\t'SlightRight':\n\t\t\t\t\t['Curva ligeira a direita', ' na {road}'],\n\t\t\t\t'Right':\n\t\t\t\t\t['Curva a direita', ' na {road}'],\n\t\t\t\t'SharpRight':\n\t\t\t\t\t['Curva fechada a direita', ' na {road}'],\n\t\t\t\t'TurnAround':\n\t\t\t\t\t['Retorne'],\n\t\t\t\t'SharpLeft':\n\t\t\t\t\t['Curva fechada a esquerda', ' na {road}'],\n\t\t\t\t'Left':\n\t\t\t\t\t['Curva a esquerda', ' na {road}'],\n\t\t\t\t'SlightLeft':\n\t\t\t\t\t['Curva ligueira a esquerda', ' na {road}'],\n\t\t\t\t'WaypointReached':\n\t\t\t\t\t['Ponto de interesse atingido'],\n\t\t\t\t'Roundabout':\n\t\t\t\t\t['Pegue a {exitStr} saída na rotatória', ' na {road}'],\n\t\t\t\t'DestinationReached':\n\t\t\t\t\t['Destino atingido'],\n\t\t\t},\n\t\t\tformatOrder: function(n) {\n\t\t\t\treturn n + 'º';\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tstartPlaceholder: 'Origem',\n\t\t\t\tviaPlaceholder: 'Intermédio {viaNumber}',\n\t\t\t\tendPlaceholder: 'Destino'\n\t\t\t}\n\t\t},\n\t\t'sk': {\n\t\t\tdirections: {\n\t\t\t\tN: 'sever',\n\t\t\t\tNE: 'serverovýchod',\n\t\t\t\tE: 'východ',\n\t\t\t\tSE: 'juhovýchod',\n\t\t\t\tS: 'juh',\n\t\t\t\tSW: 'juhozápad',\n\t\t\t\tW: 'západ',\n\t\t\t\tNW: 'serverozápad'\n\t\t\t},\n\t\t\tinstructions: {\n\t\t\t\t// instruction, postfix if the road is named\n\t\t\t\t'Head':\n\t\t\t\t\t['Mierte na {dir}', ' na {road}'],\n\t\t\t\t'Continue':\n\t\t\t\t\t['Pokračujte na {dir}', ' na {road}'],\n\t\t\t\t'SlightRight':\n\t\t\t\t\t['Mierne doprava', ' na {road}'],\n\t\t\t\t'Right':\n\t\t\t\t\t['Doprava', ' na {road}'],\n\t\t\t\t'SharpRight':\n\t\t\t\t\t['Prudko doprava', ' na {road}'],\n\t\t\t\t'TurnAround':\n\t\t\t\t\t['Otočte sa'],\n\t\t\t\t'SharpLeft':\n\t\t\t\t\t['Prudko doľava', ' na {road}'],\n\t\t\t\t'Left':\n\t\t\t\t\t['Doľava', ' na {road}'],\n\t\t\t\t'SlightLeft':\n\t\t\t\t\t['Mierne doľava', ' na {road}'],\n\t\t\t\t'WaypointReached':\n\t\t\t\t\t['Ste v prejazdovom bode.'],\n\t\t\t\t'Roundabout':\n\t\t\t\t\t['Odbočte na {exitStr} výjazde', ' na {road}'],\n\t\t\t\t'DestinationReached':\n\t\t\t\t\t['Prišli ste do cieľa.'],\n\t\t\t},\n\t\t\tformatOrder: function(n) {\n\t\t\t\tvar i = n % 10 - 1,\n\t\t\t\tsuffix = ['.', '.', '.'];\n\n\t\t\t\treturn suffix[i] ? n + suffix[i] : n + '.';\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tstartPlaceholder: 'Začiatok',\n\t\t\t\tviaPlaceholder: 'Cez {viaNumber}',\n\t\t\t\tendPlaceholder: 'Koniec'\n\t\t\t}\n\t\t},\n\t\t'el': {\n\t\t\tdirections: {\n\t\t\t\tN: 'βόρεια',\n\t\t\t\tNE: 'βορειοανατολικά',\n\t\t\t\tE: 'ανατολικά',\n\t\t\t\tSE: 'νοτιοανατολικά',\n\t\t\t\tS: 'νότια',\n\t\t\t\tSW: 'νοτιοδυτικά',\n\t\t\t\tW: 'δυτικά',\n\t\t\t\tNW: 'βορειοδυτικά'\n\t\t\t},\n\t\t\tinstructions: {\n\t\t\t\t// instruction, postfix if the road is named\n\t\t\t\t'Head':\n\t\t\t\t\t['Κατευθυνθείτε {dir}', ' στην {road}'],\n\t\t\t\t'Continue':\n\t\t\t\t\t['Συνεχίστε {dir}', ' στην {road}'],\n\t\t\t\t'SlightRight':\n\t\t\t\t\t['Ελαφρώς δεξιά', ' στην {road}'],\n\t\t\t\t'Right':\n\t\t\t\t\t['Δεξιά', ' στην {road}'],\n\t\t\t\t'SharpRight':\n\t\t\t\t\t['Απότομη δεξιά στροφή', ' στην {road}'],\n\t\t\t\t'TurnAround':\n\t\t\t\t\t['Κάντε αναστροφή'],\n\t\t\t\t'SharpLeft':\n\t\t\t\t\t['Απότομη αριστερή στροφή', ' στην {road}'],\n\t\t\t\t'Left':\n\t\t\t\t\t['Αριστερά', ' στην {road}'],\n\t\t\t\t'SlightLeft':\n\t\t\t\t\t['Ελαφρώς αριστερά', ' στην {road}'],\n\t\t\t\t'WaypointReached':\n\t\t\t\t\t['Φτάσατε στο σημείο αναφοράς'],\n\t\t\t\t'Roundabout':\n\t\t\t\t\t['Ακολουθήστε την {exitStr} έξοδο στο κυκλικό κόμβο', ' στην {road}'],\n\t\t\t\t'DestinationReached':\n\t\t\t\t\t['Φτάσατε στον προορισμό σας'],\n\t\t\t},\n\t\t\tformatOrder: function(n) {\n\t\t\t\treturn n + 'º';\n\t\t\t},\n\t\t\tui: {\n\t\t\t\tstartPlaceholder: 'Αφετηρία',\n\t\t\t\tviaPlaceholder: 'μέσω {viaNumber}',\n\t\t\t\tendPlaceholder: 'Προορισμός'\n\t\t\t}\n\t\t}\n\t};\n\n\tmodule.exports = L.Routing;\n})();\n\n},{}],54:[function(require,module,exports){\n(function() {\n\t'use strict';\n\n\tvar L = require('leaflet'),\n\t\tcorslite = require('corslite'),\n\t\tpolyline = require('polyline');\n\n\t// Ignore camelcase naming for this file, since OSRM's API uses\n\t// underscores.\n\t/* jshint camelcase: false */\n\n\tL.Routing = L.Routing || {};\n\tL.extend(L.Routing, require('./L.Routing.Waypoint'));\n\n\t/**\n\t * Works against OSRM's new API in version 5.0; this has\n\t * the API version v1.\n\t */\n\tL.Routing.OSRMv1 = L.Class.extend({\n\t\toptions: {\n\t\t\tserviceUrl: 'http://router.project-osrm.org/route/v1',\n\t\t\tprofile: 'driving',\n\t\t\ttimeout: 30 * 1000,\n\t\t\troutingOptions: {\n\t\t\t\talternatives: true,\n\t\t\t\tsteps: true\n\t\t\t},\n\t\t\tpolylinePrecision: 5\n\t\t},\n\n\t\tinitialize: function(options) {\n\t\t\tL.Util.setOptions(this, options);\n\t\t\tthis._hints = {\n\t\t\t\tlocations: {}\n\t\t\t};\n\t\t},\n\n\t\troute: function(waypoints, callback, context, options) {\n\t\t\tvar timedOut = false,\n\t\t\t\twps = [],\n\t\t\t\turl,\n\t\t\t\ttimer,\n\t\t\t\twp,\n\t\t\t\ti;\n\n\t\t\turl = this.buildRouteUrl(waypoints, L.extend({}, this.options.routingOptions, options));\n\n\t\t\ttimer = setTimeout(function() {\n\t\t\t\ttimedOut = true;\n\t\t\t\tcallback.call(context || callback, {\n\t\t\t\t\tstatus: -1,\n\t\t\t\t\tmessage: 'OSRM request timed out.'\n\t\t\t\t});\n\t\t\t}, this.options.timeout);\n\n\t\t\t// Create a copy of the waypoints, since they\n\t\t\t// might otherwise be asynchronously modified while\n\t\t\t// the request is being processed.\n\t\t\tfor (i = 0; i < waypoints.length; i++) {\n\t\t\t\twp = waypoints[i];\n\t\t\t\twps.push(new L.Routing.Waypoint(wp.latLng, wp.name, wp.options));\n\t\t\t}\n\n\t\t\tcorslite(url, L.bind(function(err, resp) {\n\t\t\t\tvar data,\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tstatusCode;\n\n\t\t\t\tclearTimeout(timer);\n\t\t\t\tif (!timedOut) {\n\t\t\t\t\terrorMessage = 'HTTP request failed: ' + err;\n\t\t\t\t\tstatusCode = -1;\n\n\t\t\t\t\tif (!err) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdata = JSON.parse(resp.responseText);\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\treturn this._routeDone(data, wps, options, callback, context);\n\t\t\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\t\t\tstatusCode = -3;\n\t\t\t\t\t\t\t\terrorMessage = ex.toString();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\t\tstatusCode = -2;\n\t\t\t\t\t\t\terrorMessage = 'Error parsing OSRM response: ' + ex.toString();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call(context || callback, {\n\t\t\t\t\t\tstatus: statusCode,\n\t\t\t\t\t\tmessage: errorMessage\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, this));\n\n\t\t\treturn this;\n\t\t},\n\n\t\t_routeDone: function(response, inputWaypoints, options, callback, context) {\n\t\t\tvar alts = [],\n\t\t\t    actualWaypoints,\n\t\t\t    i,\n\t\t\t    route;\n\n\t\t\tcontext = context || callback;\n\t\t\tif (response.code !== 'Ok') {\n\t\t\t\tcallback.call(context, {\n\t\t\t\t\tstatus: response.code\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tactualWaypoints = this._toWaypoints(inputWaypoints, response.waypoints);\n\n\t\t\tfor (i = 0; i < response.routes.length; i++) {\n\t\t\t\troute = this._convertRoute(response.routes[i], options.geometryOnly);\n\t\t\t\troute.inputWaypoints = inputWaypoints;\n\t\t\t\troute.waypoints = actualWaypoints;\n\t\t\t\talts.push(route);\n\t\t\t}\n\n\t\t\tthis._saveHintData(response.waypoints, inputWaypoints);\n\n\t\t\tcallback.call(context, null, alts);\n\t\t},\n\n\t\t_convertRoute: function(responseRoute, geometryOnly) {\n\t\t\tvar result = {\n\t\t\t\t\tname: '', // TODO\n\t\t\t\t\tsummary: {\n\t\t\t\t\t\ttotalDistance: responseRoute.distance,\n\t\t\t\t\t\ttotalTime: responseRoute.duration\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcoordinates = [],\n\t\t\t\tinstructions = [],\n\t\t\t\tindex = 0,\n\t\t\t\tlegCount = responseRoute.legs.length,\n\t\t\t\ti,\n\t\t\t\tj,\n\t\t\t\tleg,\n\t\t\t\tstep,\n\t\t\t\tgeometry,\n\t\t\t\ttype;\n\n\t\t\tif (geometryOnly) {\n\t\t\t\tresult.coordinates = this._decodePolyline(responseRoute.geometry);\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tfor (i = 0; i < legCount; i++) {\n\t\t\t\tleg = responseRoute.legs[i];\n\t\t\t\tfor (j = 0; j < leg.steps.length; j++) {\n\t\t\t\t\tstep = leg.steps[j];\n\t\t\t\t\tgeometry = this._decodePolyline(step.geometry);\n\t\t\t\t\tcoordinates.push(geometry);\n\t\t\t\t\ttype = this._maneuverToInstructionType(step.maneuver, i === legCount - 1);\n\t\t\t\t\tif (type) {\n\t\t\t\t\t\tinstructions.push({\n\t\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\t\tdistance: step.distance,\n\t\t\t\t\t\t\ttime: step.duration,\n\t\t\t\t\t\t\troad: step.name,\n\t\t\t\t\t\t\tdirection: this._bearingToDirection(step.maneuver.bearing_after),\n\t\t\t\t\t\t\texit: step.maneuver.exit,\n\t\t\t\t\t\t\tindex: index\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tindex += geometry.length;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult.coordinates = Array.prototype.concat.apply([], coordinates);\n\t\t\tresult.instructions = instructions;\n\n\t\t\treturn result;\n\t\t},\n\n\t\t_bearingToDirection: function(bearing) {\n\t\t\tvar oct = Math.round(bearing / 45) % 8;\n\t\t\treturn ['N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW'][oct];\n\t\t},\n\n\t\t_maneuverToInstructionType: function(maneuver, lastLeg) {\n\t\t\tswitch (maneuver.type) {\n\t\t\tcase 'turn':\n\t\t\tcase 'end of road':\n\t\t\t\tswitch (maneuver.modifier) {\n\t\t\t\tcase 'straight':\n\t\t\t\t\treturn 'Straight';\n\t\t\t\tcase 'slight right':\n\t\t\t\t\treturn 'SlightRight';\n\t\t\t\tcase 'right':\n\t\t\t\t\treturn 'Right';\n\t\t\t\tcase 'sharp right':\n\t\t\t\t\treturn 'SharpRight';\n\t\t\t\tcase 'sharp left':\n\t\t\t\t\treturn 'SharpLeft';\n\t\t\t\tcase 'left':\n\t\t\t\t\treturn 'Left';\n\t\t\t\tcase 'slight left':\n\t\t\t\t\treturn 'SlightLeft';\n\t\t\t\tcase 'uturn':\n\t\t\t\t\treturn 'TurnAround';\n\t\t\t\tdefault:\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'new name':\n\t\t\tcase 'merge':\n\t\t\tcase 'ramp':\n\t\t\tcase 'fork':\n\t\t\t\treturn 'Continue';\n\t\t\tcase 'arrive':\n\t\t\t\treturn lastLeg ? 'DestinationReached' : 'WaypointReached';\n\t\t\tcase 'roundabout':\n\t\t\tcase 'rotary':\n\t\t\t\treturn 'Roundabout';\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\n\t\t_decodePolyline: function(routeGeometry) {\n\t\t\tvar cs = polyline.decode(routeGeometry, this.options.polylinePrecision),\n\t\t\t\tresult = new Array(cs.length),\n\t\t\t\ti;\n\t\t\tfor (i = cs.length - 1; i >= 0; i--) {\n\t\t\t\tresult[i] = L.latLng(cs[i]);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t_toWaypoints: function(inputWaypoints, vias) {\n\t\t\tvar wps = [],\n\t\t\t    i;\n\t\t\tfor (i = 0; i < vias.length; i++) {\n\t\t\t\twps.push(L.Routing.waypoint(L.latLng(vias[i]),\n\t\t\t\t                            inputWaypoints[i].name,\n\t\t\t\t                            inputWaypoints[i].options));\n\t\t\t}\n\n\t\t\treturn wps;\n\t\t},\n\n\t\t_createName: function(nameParts) {\n\t\t\tvar name = '',\n\t\t\t\ti;\n\n\t\t\tfor (i = 0; i < nameParts.length; i++) {\n\t\t\t\tif (nameParts[i]) {\n\t\t\t\t\tif (name) {\n\t\t\t\t\t\tname += ', ';\n\t\t\t\t\t}\n\t\t\t\t\tname += nameParts[i].charAt(0).toUpperCase() + nameParts[i].slice(1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn name;\n\t\t},\n\n\t\tbuildRouteUrl: function(waypoints, options) {\n\t\t\tvar locs = [],\n\t\t\t\thints = [],\n\t\t\t\twp,\n\t\t\t\tlatLng,\n\t\t\t    computeInstructions,\n\t\t\t    computeAlternative;\n\n\t\t\tfor (var i = 0; i < waypoints.length; i++) {\n\t\t\t\twp = waypoints[i];\n\t\t\t\tlatLng = wp.latLng;\n\t\t\t\tlocs.push(latLng.lng + ',' + latLng.lat);\n\t\t\t\thints.push(this._hints[this._locationKey(latLng)] || '');\n\t\t\t}\n\n\t\t\tcomputeAlternative = computeInstructions =\n\t\t\t\t!(options && options.geometryOnly);\n\n\t\t\treturn this.options.serviceUrl + '/' + this.options.profile + '/' +\n\t\t\t\tlocs.join(';') + '?' +\n\t\t\t\t(options.z ? 'z=' + options.z + '&' : (options.geometryOnly ? 'overview=full&' : '')) +\n\t\t\t\t//'hints=' + hints.join(';') + '&' +\n\t\t\t\t'alternatives=' + computeAlternative.toString() + '&' +\n\t\t\t\t'steps=' + computeInstructions.toString() +\n\t\t\t\t(options.allowUTurns ? '&continue_straight=' + !options.allowUTurns : '');\n\t\t},\n\n\t\t_locationKey: function(location) {\n\t\t\treturn location.lat + ',' + location.lng;\n\t\t},\n\n\t\t_saveHintData: function(actualWaypoints, waypoints) {\n\t\t\tvar loc;\n\t\t\tthis._hints = {\n\t\t\t\tlocations: {}\n\t\t\t};\n\t\t\tfor (var i = actualWaypoints.length - 1; i >= 0; i--) {\n\t\t\t\tloc = waypoints[i].latLng;\n\t\t\t\tthis._hints.locations[this._locationKey(loc)] = actualWaypoints[i].hint;\n\t\t\t}\n\t\t},\n\n\t\t_convertSummary: function(osrmSummary) {\n\t\t\treturn {\n\t\t\t\ttotalDistance: osrmSummary.total_distance,\n\t\t\t\ttotalTime: osrmSummary.total_time\n\t\t\t};\n\t\t},\n\n\t\t_convertInstructions: function(osrmInstructions) {\n\t\t\tvar result = [],\n\t\t\t    i,\n\t\t\t    instr,\n\t\t\t    type,\n\t\t\t    driveDir;\n\n\t\t\tfor (i = 0; i < osrmInstructions.length; i++) {\n\t\t\t\tinstr = osrmInstructions[i];\n\t\t\t\ttype = this._drivingDirectionType(instr[0]);\n\t\t\t\tdriveDir = instr[0].split('-');\n\t\t\t\tif (type) {\n\t\t\t\t\tresult.push({\n\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\tdistance: instr[2],\n\t\t\t\t\t\ttime: instr[4],\n\t\t\t\t\t\troad: instr[1],\n\t\t\t\t\t\tdirection: instr[6],\n\t\t\t\t\t\texit: driveDir.length > 1 ? driveDir[1] : undefined,\n\t\t\t\t\t\tindex: instr[3]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t});\n\n\tL.Routing.osrmv1 = function(options) {\n\t\treturn new L.Routing.OSRM(options);\n\t};\n\n\tmodule.exports = L.Routing;\n})();\n\n},{\"./L.Routing.Waypoint\":56,\"corslite\":13,\"leaflet\":57,\"polyline\":63}],55:[function(require,module,exports){\n(function() {\n\t'use strict';\n\n\tvar L = require('leaflet');\n\tL.Routing = L.Routing || {};\n\tL.extend(L.Routing, require('./L.Routing.GeocoderElement'));\n\tL.extend(L.Routing, require('./L.Routing.Waypoint'));\n\n\tL.Routing.Plan = L.Class.extend({\n\t\tincludes: L.Mixin.Events,\n\n\t\toptions: {\n\t\t\tdragStyles: [\n\t\t\t\t{color: 'black', opacity: 0.15, weight: 9},\n\t\t\t\t{color: 'white', opacity: 0.8, weight: 6},\n\t\t\t\t{color: 'red', opacity: 1, weight: 2, dashArray: '7,12'}\n\t\t\t],\n\t\t\tdraggableWaypoints: true,\n\t\t\trouteWhileDragging: false,\n\t\t\taddWaypoints: true,\n\t\t\treverseWaypoints: false,\n\t\t\taddButtonClassName: '',\n\t\t\tlanguage: 'en',\n\t\t\tcreateGeocoderElement: L.Routing.geocoderElement,\n\t\t\tcreateMarker: function(i, wp) {\n\t\t\t\tvar options = {\n\t\t\t\t\t\tdraggable: this.draggableWaypoints\n\t\t\t\t\t},\n\t\t\t\t    marker = L.marker(wp.latLng, options);\n\n\t\t\t\treturn marker;\n\t\t\t},\n\t\t\tgeocodersClassName: ''\n\t\t},\n\n\t\tinitialize: function(waypoints, options) {\n\t\t\tL.Util.setOptions(this, options);\n\t\t\tthis._waypoints = [];\n\t\t\tthis.setWaypoints(waypoints);\n\t\t},\n\n\t\tisReady: function() {\n\t\t\tvar i;\n\t\t\tfor (i = 0; i < this._waypoints.length; i++) {\n\t\t\t\tif (!this._waypoints[i].latLng) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\tgetWaypoints: function() {\n\t\t\tvar i,\n\t\t\t\twps = [];\n\n\t\t\tfor (i = 0; i < this._waypoints.length; i++) {\n\t\t\t\twps.push(this._waypoints[i]);\n\t\t\t}\n\n\t\t\treturn wps;\n\t\t},\n\n\t\tsetWaypoints: function(waypoints) {\n\t\t\tvar args = [0, this._waypoints.length].concat(waypoints);\n\t\t\tthis.spliceWaypoints.apply(this, args);\n\t\t\treturn this;\n\t\t},\n\n\t\tspliceWaypoints: function() {\n\t\t\tvar args = [arguments[0], arguments[1]],\n\t\t\t    i;\n\n\t\t\tfor (i = 2; i < arguments.length; i++) {\n\t\t\t\targs.push(arguments[i] && arguments[i].hasOwnProperty('latLng') ? arguments[i] : L.Routing.waypoint(arguments[i]));\n\t\t\t}\n\n\t\t\t[].splice.apply(this._waypoints, args);\n\n\t\t\t// Make sure there's always at least two waypoints\n\t\t\twhile (this._waypoints.length < 2) {\n\t\t\t\tthis.spliceWaypoints(this._waypoints.length, 0, null);\n\t\t\t}\n\n\t\t\tthis._updateMarkers();\n\t\t\tthis._fireChanged.apply(this, args);\n\t\t},\n\n\t\tonAdd: function(map) {\n\t\t\tthis._map = map;\n\t\t\tthis._updateMarkers();\n\t\t},\n\n\t\tonRemove: function() {\n\t\t\tvar i;\n\t\t\tthis._removeMarkers();\n\n\t\t\tif (this._newWp) {\n\t\t\t\tfor (i = 0; i < this._newWp.lines.length; i++) {\n\t\t\t\t\tthis._map.removeLayer(this._newWp.lines[i]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdelete this._map;\n\t\t},\n\n\t\tcreateGeocoders: function() {\n\t\t\tvar container = L.DomUtil.create('div', 'leaflet-routing-geocoders ' + this.options.geocodersClassName),\n\t\t\t\twaypoints = this._waypoints,\n\t\t\t    addWpBtn,\n\t\t\t    reverseBtn;\n\n\t\t\tthis._geocoderContainer = container;\n\t\t\tthis._geocoderElems = [];\n\n\n\t\t\tif (this.options.addWaypoints) {\n\t\t\t\taddWpBtn = L.DomUtil.create('button', 'leaflet-routing-add-waypoint ' + this.options.addButtonClassName, container);\n\t\t\t\taddWpBtn.setAttribute('type', 'button');\n\t\t\t\tL.DomEvent.addListener(addWpBtn, 'click', function() {\n\t\t\t\t\tthis.spliceWaypoints(waypoints.length, 0, null);\n\t\t\t\t}, this);\n\t\t\t}\n\n\t\t\tif (this.options.reverseWaypoints) {\n\t\t\t\treverseBtn = L.DomUtil.create('button', 'leaflet-routing-reverse-waypoints', container);\n\t\t\t\treverseBtn.setAttribute('type', 'button');\n\t\t\t\tL.DomEvent.addListener(reverseBtn, 'click', function() {\n\t\t\t\t\tthis._waypoints.reverse();\n\t\t\t\t\tthis.setWaypoints(this._waypoints);\n\t\t\t\t}, this);\n\t\t\t}\n\n\t\t\tthis._updateGeocoders();\n\t\t\tthis.on('waypointsspliced', this._updateGeocoders);\n\n\t\t\treturn container;\n\t\t},\n\n\t\t_createGeocoder: function(i) {\n\t\t\tvar geocoder = this.options.createGeocoderElement(this._waypoints[i], i, this._waypoints.length, this.options);\n\t\t\tgeocoder\n\t\t\t.on('delete', function() {\n\t\t\t\tif (i > 0 || this._waypoints.length > 2) {\n\t\t\t\t\tthis.spliceWaypoints(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\tthis.spliceWaypoints(i, 1, new L.Routing.Waypoint());\n\t\t\t\t}\n\t\t\t}, this)\n\t\t\t.on('geocoded', function(e) {\n\t\t\t\tthis._updateMarkers();\n\t\t\t\tthis._fireChanged();\n\t\t\t\tthis._focusGeocoder(i + 1);\n\t\t\t\tthis.fire('waypointgeocoded', {\n\t\t\t\t\twaypointIndex: i,\n\t\t\t\t\twaypoint: e.waypoint\n\t\t\t\t});\n\t\t\t}, this)\n\t\t\t.on('reversegeocoded', function(e) {\n\t\t\t\tthis.fire('waypointgeocoded', {\n\t\t\t\t\twaypointIndex: i,\n\t\t\t\t\twaypoint: e.waypoint\n\t\t\t\t});\n\t\t\t}, this);\n\n\t\t\treturn geocoder;\n\t\t},\n\n\t\t_updateGeocoders: function() {\n\t\t\tvar elems = [],\n\t\t\t\ti,\n\t\t\t    geocoderElem;\n\n\t\t\tfor (i = 0; i < this._geocoderElems.length; i++) {\n\t\t\t\tthis._geocoderContainer.removeChild(this._geocoderElems[i].getContainer());\n\t\t\t}\n\n\t\t\tfor (i = this._waypoints.length - 1; i >= 0; i--) {\n\t\t\t\tgeocoderElem = this._createGeocoder(i);\n\t\t\t\tthis._geocoderContainer.insertBefore(geocoderElem.getContainer(), this._geocoderContainer.firstChild);\n\t\t\t\telems.push(geocoderElem);\n\t\t\t}\n\n\t\t\tthis._geocoderElems = elems.reverse();\n\t\t},\n\n\t\t_removeMarkers: function() {\n\t\t\tvar i;\n\t\t\tif (this._markers) {\n\t\t\t\tfor (i = 0; i < this._markers.length; i++) {\n\t\t\t\t\tif (this._markers[i]) {\n\t\t\t\t\t\tthis._map.removeLayer(this._markers[i]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._markers = [];\n\t\t},\n\n\t\t_updateMarkers: function() {\n\t\t\tvar i,\n\t\t\t    m;\n\n\t\t\tif (!this._map) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._removeMarkers();\n\n\t\t\tfor (i = 0; i < this._waypoints.length; i++) {\n\t\t\t\tif (this._waypoints[i].latLng) {\n\t\t\t\t\tm = this.options.createMarker(i, this._waypoints[i], this._waypoints.length);\n\t\t\t\t\tif (m) {\n\t\t\t\t\t\tm.addTo(this._map);\n\t\t\t\t\t\tif (this.options.draggableWaypoints) {\n\t\t\t\t\t\t\tthis._hookWaypointEvents(m, i);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tm = null;\n\t\t\t\t}\n\t\t\t\tthis._markers.push(m);\n\t\t\t}\n\t\t},\n\n\t\t_fireChanged: function() {\n\t\t\tthis.fire('waypointschanged', {waypoints: this.getWaypoints()});\n\n\t\t\tif (arguments.length >= 2) {\n\t\t\t\tthis.fire('waypointsspliced', {\n\t\t\t\t\tindex: Array.prototype.shift.call(arguments),\n\t\t\t\t\tnRemoved: Array.prototype.shift.call(arguments),\n\t\t\t\t\tadded: arguments\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t_hookWaypointEvents: function(m, i, trackMouseMove) {\n\t\t\tvar eventLatLng = function(e) {\n\t\t\t\t\treturn trackMouseMove ? e.latlng : e.target.getLatLng();\n\t\t\t\t},\n\t\t\t\tdragStart = L.bind(function(e) {\n\t\t\t\t\tthis.fire('waypointdragstart', {index: i, latlng: eventLatLng(e)});\n\t\t\t\t}, this),\n\t\t\t\tdrag = L.bind(function(e) {\n\t\t\t\t\tthis._waypoints[i].latLng = eventLatLng(e);\n\t\t\t\t\tthis.fire('waypointdrag', {index: i, latlng: eventLatLng(e)});\n\t\t\t\t}, this),\n\t\t\t\tdragEnd = L.bind(function(e) {\n\t\t\t\t\tthis._waypoints[i].latLng = eventLatLng(e);\n\t\t\t\t\tthis._waypoints[i].name = '';\n\t\t\t\t\tif (this._geocoderElems) {\n\t\t\t\t\t\tthis._geocoderElems[i].update(true);\n\t\t\t\t\t}\n\t\t\t\t\tthis.fire('waypointdragend', {index: i, latlng: eventLatLng(e)});\n\t\t\t\t\tthis._fireChanged();\n\t\t\t\t}, this),\n\t\t\t\tmouseMove,\n\t\t\t\tmouseUp;\n\n\t\t\tif (trackMouseMove) {\n\t\t\t\tmouseMove = L.bind(function(e) {\n\t\t\t\t\tthis._markers[i].setLatLng(e.latlng);\n\t\t\t\t\tdrag(e);\n\t\t\t\t}, this);\n\t\t\t\tmouseUp = L.bind(function(e) {\n\t\t\t\t\tthis._map.dragging.enable();\n\t\t\t\t\tthis._map.off('mouseup', mouseUp);\n\t\t\t\t\tthis._map.off('mousemove', mouseMove);\n\t\t\t\t\tdragEnd(e);\n\t\t\t\t}, this);\n\t\t\t\tthis._map.dragging.disable();\n\t\t\t\tthis._map.on('mousemove', mouseMove);\n\t\t\t\tthis._map.on('mouseup', mouseUp);\n\t\t\t\tdragStart({latlng: this._waypoints[i].latLng});\n\t\t\t} else {\n\t\t\t\tm.on('dragstart', dragStart);\n\t\t\t\tm.on('drag', drag);\n\t\t\t\tm.on('dragend', dragEnd);\n\t\t\t}\n\t\t},\n\n\t\tdragNewWaypoint: function(e) {\n\t\t\tvar newWpIndex = e.afterIndex + 1;\n\t\t\tif (this.options.routeWhileDragging) {\n\t\t\t\tthis.spliceWaypoints(newWpIndex, 0, e.latlng);\n\t\t\t\tthis._hookWaypointEvents(this._markers[newWpIndex], newWpIndex, true);\n\t\t\t} else {\n\t\t\t\tthis._dragNewWaypoint(newWpIndex, e.latlng);\n\t\t\t}\n\t\t},\n\n\t\t_dragNewWaypoint: function(newWpIndex, initialLatLng) {\n\t\t\tvar wp = new L.Routing.Waypoint(initialLatLng),\n\t\t\t\tprevWp = this._waypoints[newWpIndex - 1],\n\t\t\t\tnextWp = this._waypoints[newWpIndex],\n\t\t\t\tmarker = this.options.createMarker(newWpIndex, wp, this._waypoints.length + 1),\n\t\t\t\tlines = [],\n\t\t\t\tmouseMove = L.bind(function(e) {\n\t\t\t\t\tvar i;\n\t\t\t\t\tif (marker) {\n\t\t\t\t\t\tmarker.setLatLng(e.latlng);\n\t\t\t\t\t}\n\t\t\t\t\tfor (i = 0; i < lines.length; i++) {\n\t\t\t\t\t\tlines[i].spliceLatLngs(1, 1, e.latlng);\n\t\t\t\t\t}\n\t\t\t\t}, this),\n\t\t\t\tmouseUp = L.bind(function(e) {\n\t\t\t\t\tvar i;\n\t\t\t\t\tif (marker) {\n\t\t\t\t\t\tthis._map.removeLayer(marker);\n\t\t\t\t\t}\n\t\t\t\t\tfor (i = 0; i < lines.length; i++) {\n\t\t\t\t\t\tthis._map.removeLayer(lines[i]);\n\t\t\t\t\t}\n\t\t\t\t\tthis._map.off('mousemove', mouseMove);\n\t\t\t\t\tthis._map.off('mouseup', mouseUp);\n\t\t\t\t\tthis.spliceWaypoints(newWpIndex, 0, e.latlng);\n\t\t\t\t}, this),\n\t\t\t\ti;\n\n\t\t\tif (marker) {\n\t\t\t\tmarker.addTo(this._map);\n\t\t\t}\n\n\t\t\tfor (i = 0; i < this.options.dragStyles.length; i++) {\n\t\t\t\tlines.push(L.polyline([prevWp.latLng, initialLatLng, nextWp.latLng],\n\t\t\t\t\tthis.options.dragStyles[i]).addTo(this._map));\n\t\t\t}\n\n\t\t\tthis._map.on('mousemove', mouseMove);\n\t\t\tthis._map.on('mouseup', mouseUp);\n\t\t},\n\n\t\t_focusGeocoder: function(i) {\n\t\t\tif (this._geocoderElems[i]) {\n\t\t\t\tthis._geocoderElems[i].focus();\n\t\t\t} else {\n\t\t\t\tdocument.activeElement.blur();\n\t\t\t}\n\t\t}\n\t});\n\n\tL.Routing.plan = function(waypoints, options) {\n\t\treturn new L.Routing.Plan(waypoints, options);\n\t};\n\n\tmodule.exports = L.Routing;\n})();\n\n},{\"./L.Routing.GeocoderElement\":49,\"./L.Routing.Waypoint\":56,\"leaflet\":57}],56:[function(require,module,exports){\n(function() {\n\t'use strict';\n\n\tvar L = require('leaflet');\n\tL.Routing = L.Routing || {};\n\n\tL.Routing.Waypoint = L.Class.extend({\n\t\t\toptions: {\n\t\t\t\tallowUTurn: false,\n\t\t\t},\n\t\t\tinitialize: function(latLng, name, options) {\n\t\t\t\tL.Util.setOptions(this, options);\n\t\t\t\tthis.latLng = L.latLng(latLng);\n\t\t\t\tthis.name = name;\n\t\t\t}\n\t\t});\n\n\tL.Routing.waypoint = function(latLng, name, options) {\n\t\treturn new L.Routing.Waypoint(latLng, name, options);\n\t};\n\n\tmodule.exports = L.Routing;\n})();\n\n},{\"leaflet\":57}],57:[function(require,module,exports){\n/*\n Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com\n (c) 2010-2013, Vladimir Agafonkin\n (c) 2010-2011, CloudMade\n*/\n(function (window, document, undefined) {\r\nvar oldL = window.L,\r\n    L = {};\r\n\r\nL.version = '0.7.7';\r\n\r\n// define Leaflet for Node module pattern loaders, including Browserify\r\nif (typeof module === 'object' && typeof module.exports === 'object') {\r\n\tmodule.exports = L;\r\n\r\n// define Leaflet as an AMD module\r\n} else if (typeof define === 'function' && define.amd) {\r\n\tdefine(L);\r\n}\r\n\r\n// define Leaflet as a global L variable, saving the original L to restore later if needed\r\n\r\nL.noConflict = function () {\r\n\twindow.L = oldL;\r\n\treturn this;\r\n};\r\n\r\nwindow.L = L;\r\n\n\n/*\r\n * L.Util contains various utility functions used throughout Leaflet code.\r\n */\r\n\r\nL.Util = {\r\n\textend: function (dest) { // (Object[, Object, ...]) ->\r\n\t\tvar sources = Array.prototype.slice.call(arguments, 1),\r\n\t\t    i, j, len, src;\r\n\r\n\t\tfor (j = 0, len = sources.length; j < len; j++) {\r\n\t\t\tsrc = sources[j] || {};\r\n\t\t\tfor (i in src) {\r\n\t\t\t\tif (src.hasOwnProperty(i)) {\r\n\t\t\t\t\tdest[i] = src[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn dest;\r\n\t},\r\n\r\n\tbind: function (fn, obj) { // (Function, Object) -> Function\r\n\t\tvar args = arguments.length > 2 ? Array.prototype.slice.call(arguments, 2) : null;\r\n\t\treturn function () {\r\n\t\t\treturn fn.apply(obj, args || arguments);\r\n\t\t};\r\n\t},\r\n\r\n\tstamp: (function () {\r\n\t\tvar lastId = 0,\r\n\t\t    key = '_leaflet_id';\r\n\t\treturn function (obj) {\r\n\t\t\tobj[key] = obj[key] || ++lastId;\r\n\t\t\treturn obj[key];\r\n\t\t};\r\n\t}()),\r\n\r\n\tinvokeEach: function (obj, method, context) {\r\n\t\tvar i, args;\r\n\r\n\t\tif (typeof obj === 'object') {\r\n\t\t\targs = Array.prototype.slice.call(arguments, 3);\r\n\r\n\t\t\tfor (i in obj) {\r\n\t\t\t\tmethod.apply(context, [i, obj[i]].concat(args));\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\tlimitExecByInterval: function (fn, time, context) {\r\n\t\tvar lock, execOnUnlock;\r\n\r\n\t\treturn function wrapperFn() {\r\n\t\t\tvar args = arguments;\r\n\r\n\t\t\tif (lock) {\r\n\t\t\t\texecOnUnlock = true;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tlock = true;\r\n\r\n\t\t\tsetTimeout(function () {\r\n\t\t\t\tlock = false;\r\n\r\n\t\t\t\tif (execOnUnlock) {\r\n\t\t\t\t\twrapperFn.apply(context, args);\r\n\t\t\t\t\texecOnUnlock = false;\r\n\t\t\t\t}\r\n\t\t\t}, time);\r\n\r\n\t\t\tfn.apply(context, args);\r\n\t\t};\r\n\t},\r\n\r\n\tfalseFn: function () {\r\n\t\treturn false;\r\n\t},\r\n\r\n\tformatNum: function (num, digits) {\r\n\t\tvar pow = Math.pow(10, digits || 5);\r\n\t\treturn Math.round(num * pow) / pow;\r\n\t},\r\n\r\n\ttrim: function (str) {\r\n\t\treturn str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\r\n\t},\r\n\r\n\tsplitWords: function (str) {\r\n\t\treturn L.Util.trim(str).split(/\\s+/);\r\n\t},\r\n\r\n\tsetOptions: function (obj, options) {\r\n\t\tobj.options = L.extend({}, obj.options, options);\r\n\t\treturn obj.options;\r\n\t},\r\n\r\n\tgetParamString: function (obj, existingUrl, uppercase) {\r\n\t\tvar params = [];\r\n\t\tfor (var i in obj) {\r\n\t\t\tparams.push(encodeURIComponent(uppercase ? i.toUpperCase() : i) + '=' + encodeURIComponent(obj[i]));\r\n\t\t}\r\n\t\treturn ((!existingUrl || existingUrl.indexOf('?') === -1) ? '?' : '&') + params.join('&');\r\n\t},\r\n\ttemplate: function (str, data) {\r\n\t\treturn str.replace(/\\{ *([\\w_]+) *\\}/g, function (str, key) {\r\n\t\t\tvar value = data[key];\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\tthrow new Error('No value provided for variable ' + str);\r\n\t\t\t} else if (typeof value === 'function') {\r\n\t\t\t\tvalue = value(data);\r\n\t\t\t}\r\n\t\t\treturn value;\r\n\t\t});\r\n\t},\r\n\r\n\tisArray: Array.isArray || function (obj) {\r\n\t\treturn (Object.prototype.toString.call(obj) === '[object Array]');\r\n\t},\r\n\r\n\temptyImageUrl: 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs='\r\n};\r\n\r\n(function () {\r\n\r\n\t// inspired by http://paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n\r\n\tfunction getPrefixed(name) {\r\n\t\tvar i, fn,\r\n\t\t    prefixes = ['webkit', 'moz', 'o', 'ms'];\r\n\r\n\t\tfor (i = 0; i < prefixes.length && !fn; i++) {\r\n\t\t\tfn = window[prefixes[i] + name];\r\n\t\t}\r\n\r\n\t\treturn fn;\r\n\t}\r\n\r\n\tvar lastTime = 0;\r\n\r\n\tfunction timeoutDefer(fn) {\r\n\t\tvar time = +new Date(),\r\n\t\t    timeToCall = Math.max(0, 16 - (time - lastTime));\r\n\r\n\t\tlastTime = time + timeToCall;\r\n\t\treturn window.setTimeout(fn, timeToCall);\r\n\t}\r\n\r\n\tvar requestFn = window.requestAnimationFrame ||\r\n\t        getPrefixed('RequestAnimationFrame') || timeoutDefer;\r\n\r\n\tvar cancelFn = window.cancelAnimationFrame ||\r\n\t        getPrefixed('CancelAnimationFrame') ||\r\n\t        getPrefixed('CancelRequestAnimationFrame') ||\r\n\t        function (id) { window.clearTimeout(id); };\r\n\r\n\r\n\tL.Util.requestAnimFrame = function (fn, context, immediate, element) {\r\n\t\tfn = L.bind(fn, context);\r\n\r\n\t\tif (immediate && requestFn === timeoutDefer) {\r\n\t\t\tfn();\r\n\t\t} else {\r\n\t\t\treturn requestFn.call(window, fn, element);\r\n\t\t}\r\n\t};\r\n\r\n\tL.Util.cancelAnimFrame = function (id) {\r\n\t\tif (id) {\r\n\t\t\tcancelFn.call(window, id);\r\n\t\t}\r\n\t};\r\n\r\n}());\r\n\r\n// shortcuts for most used utility functions\r\nL.extend = L.Util.extend;\r\nL.bind = L.Util.bind;\r\nL.stamp = L.Util.stamp;\r\nL.setOptions = L.Util.setOptions;\r\n\n\n/*\r\n * L.Class powers the OOP facilities of the library.\r\n * Thanks to John Resig and Dean Edwards for inspiration!\r\n */\r\n\r\nL.Class = function () {};\r\n\r\nL.Class.extend = function (props) {\r\n\r\n\t// extended class with the new prototype\r\n\tvar NewClass = function () {\r\n\r\n\t\t// call the constructor\r\n\t\tif (this.initialize) {\r\n\t\t\tthis.initialize.apply(this, arguments);\r\n\t\t}\r\n\r\n\t\t// call all constructor hooks\r\n\t\tif (this._initHooks) {\r\n\t\t\tthis.callInitHooks();\r\n\t\t}\r\n\t};\r\n\r\n\t// instantiate class without calling constructor\r\n\tvar F = function () {};\r\n\tF.prototype = this.prototype;\r\n\r\n\tvar proto = new F();\r\n\tproto.constructor = NewClass;\r\n\r\n\tNewClass.prototype = proto;\r\n\r\n\t//inherit parent's statics\r\n\tfor (var i in this) {\r\n\t\tif (this.hasOwnProperty(i) && i !== 'prototype') {\r\n\t\t\tNewClass[i] = this[i];\r\n\t\t}\r\n\t}\r\n\r\n\t// mix static properties into the class\r\n\tif (props.statics) {\r\n\t\tL.extend(NewClass, props.statics);\r\n\t\tdelete props.statics;\r\n\t}\r\n\r\n\t// mix includes into the prototype\r\n\tif (props.includes) {\r\n\t\tL.Util.extend.apply(null, [proto].concat(props.includes));\r\n\t\tdelete props.includes;\r\n\t}\r\n\r\n\t// merge options\r\n\tif (props.options && proto.options) {\r\n\t\tprops.options = L.extend({}, proto.options, props.options);\r\n\t}\r\n\r\n\t// mix given properties into the prototype\r\n\tL.extend(proto, props);\r\n\r\n\tproto._initHooks = [];\r\n\r\n\tvar parent = this;\r\n\t// jshint camelcase: false\r\n\tNewClass.__super__ = parent.prototype;\r\n\r\n\t// add method for calling all hooks\r\n\tproto.callInitHooks = function () {\r\n\r\n\t\tif (this._initHooksCalled) { return; }\r\n\r\n\t\tif (parent.prototype.callInitHooks) {\r\n\t\t\tparent.prototype.callInitHooks.call(this);\r\n\t\t}\r\n\r\n\t\tthis._initHooksCalled = true;\r\n\r\n\t\tfor (var i = 0, len = proto._initHooks.length; i < len; i++) {\r\n\t\t\tproto._initHooks[i].call(this);\r\n\t\t}\r\n\t};\r\n\r\n\treturn NewClass;\r\n};\r\n\r\n\r\n// method for adding properties to prototype\r\nL.Class.include = function (props) {\r\n\tL.extend(this.prototype, props);\r\n};\r\n\r\n// merge new default options to the Class\r\nL.Class.mergeOptions = function (options) {\r\n\tL.extend(this.prototype.options, options);\r\n};\r\n\r\n// add a constructor hook\r\nL.Class.addInitHook = function (fn) { // (Function) || (String, args...)\r\n\tvar args = Array.prototype.slice.call(arguments, 1);\r\n\r\n\tvar init = typeof fn === 'function' ? fn : function () {\r\n\t\tthis[fn].apply(this, args);\r\n\t};\r\n\r\n\tthis.prototype._initHooks = this.prototype._initHooks || [];\r\n\tthis.prototype._initHooks.push(init);\r\n};\r\n\n\n/*\r\n * L.Mixin.Events is used to add custom events functionality to Leaflet classes.\r\n */\r\n\r\nvar eventsKey = '_leaflet_events';\r\n\r\nL.Mixin = {};\r\n\r\nL.Mixin.Events = {\r\n\r\n\taddEventListener: function (types, fn, context) { // (String, Function[, Object]) or (Object[, Object])\r\n\r\n\t\t// types can be a map of types/handlers\r\n\t\tif (L.Util.invokeEach(types, this.addEventListener, this, fn, context)) { return this; }\r\n\r\n\t\tvar events = this[eventsKey] = this[eventsKey] || {},\r\n\t\t    contextId = context && context !== this && L.stamp(context),\r\n\t\t    i, len, event, type, indexKey, indexLenKey, typeIndex;\r\n\r\n\t\t// types can be a string of space-separated words\r\n\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\tfor (i = 0, len = types.length; i < len; i++) {\r\n\t\t\tevent = {\r\n\t\t\t\taction: fn,\r\n\t\t\t\tcontext: context || this\r\n\t\t\t};\r\n\t\t\ttype = types[i];\r\n\r\n\t\t\tif (contextId) {\r\n\t\t\t\t// store listeners of a particular context in a separate hash (if it has an id)\r\n\t\t\t\t// gives a major performance boost when removing thousands of map layers\r\n\r\n\t\t\t\tindexKey = type + '_idx';\r\n\t\t\t\tindexLenKey = indexKey + '_len';\r\n\r\n\t\t\t\ttypeIndex = events[indexKey] = events[indexKey] || {};\r\n\r\n\t\t\t\tif (!typeIndex[contextId]) {\r\n\t\t\t\t\ttypeIndex[contextId] = [];\r\n\r\n\t\t\t\t\t// keep track of the number of keys in the index to quickly check if it's empty\r\n\t\t\t\t\tevents[indexLenKey] = (events[indexLenKey] || 0) + 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttypeIndex[contextId].push(event);\r\n\r\n\r\n\t\t\t} else {\r\n\t\t\t\tevents[type] = events[type] || [];\r\n\t\t\t\tevents[type].push(event);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\thasEventListeners: function (type) { // (String) -> Boolean\r\n\t\tvar events = this[eventsKey];\r\n\t\treturn !!events && ((type in events && events[type].length > 0) ||\r\n\t\t                    (type + '_idx' in events && events[type + '_idx_len'] > 0));\r\n\t},\r\n\r\n\tremoveEventListener: function (types, fn, context) { // ([String, Function, Object]) or (Object[, Object])\r\n\r\n\t\tif (!this[eventsKey]) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif (!types) {\r\n\t\t\treturn this.clearAllEventListeners();\r\n\t\t}\r\n\r\n\t\tif (L.Util.invokeEach(types, this.removeEventListener, this, fn, context)) { return this; }\r\n\r\n\t\tvar events = this[eventsKey],\r\n\t\t    contextId = context && context !== this && L.stamp(context),\r\n\t\t    i, len, type, listeners, j, indexKey, indexLenKey, typeIndex, removed;\r\n\r\n\t\ttypes = L.Util.splitWords(types);\r\n\r\n\t\tfor (i = 0, len = types.length; i < len; i++) {\r\n\t\t\ttype = types[i];\r\n\t\t\tindexKey = type + '_idx';\r\n\t\t\tindexLenKey = indexKey + '_len';\r\n\r\n\t\t\ttypeIndex = events[indexKey];\r\n\r\n\t\t\tif (!fn) {\r\n\t\t\t\t// clear all listeners for a type if function isn't specified\r\n\t\t\t\tdelete events[type];\r\n\t\t\t\tdelete events[indexKey];\r\n\t\t\t\tdelete events[indexLenKey];\r\n\r\n\t\t\t} else {\r\n\t\t\t\tlisteners = contextId && typeIndex ? typeIndex[contextId] : events[type];\r\n\r\n\t\t\t\tif (listeners) {\r\n\t\t\t\t\tfor (j = listeners.length - 1; j >= 0; j--) {\r\n\t\t\t\t\t\tif ((listeners[j].action === fn) && (!context || (listeners[j].context === context))) {\r\n\t\t\t\t\t\t\tremoved = listeners.splice(j, 1);\r\n\t\t\t\t\t\t\t// set the old action to a no-op, because it is possible\r\n\t\t\t\t\t\t\t// that the listener is being iterated over as part of a dispatch\r\n\t\t\t\t\t\t\tremoved[0].action = L.Util.falseFn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (context && typeIndex && (listeners.length === 0)) {\r\n\t\t\t\t\t\tdelete typeIndex[contextId];\r\n\t\t\t\t\t\tevents[indexLenKey]--;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclearAllEventListeners: function () {\r\n\t\tdelete this[eventsKey];\r\n\t\treturn this;\r\n\t},\r\n\r\n\tfireEvent: function (type, data) { // (String[, Object])\r\n\t\tif (!this.hasEventListeners(type)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar event = L.Util.extend({}, data, { type: type, target: this });\r\n\r\n\t\tvar events = this[eventsKey],\r\n\t\t    listeners, i, len, typeIndex, contextId;\r\n\r\n\t\tif (events[type]) {\r\n\t\t\t// make sure adding/removing listeners inside other listeners won't cause infinite loop\r\n\t\t\tlisteners = events[type].slice();\r\n\r\n\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\tlisteners[i].action.call(listeners[i].context, event);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// fire event for the context-indexed listeners as well\r\n\t\ttypeIndex = events[type + '_idx'];\r\n\r\n\t\tfor (contextId in typeIndex) {\r\n\t\t\tlisteners = typeIndex[contextId].slice();\r\n\r\n\t\t\tif (listeners) {\r\n\t\t\t\tfor (i = 0, len = listeners.length; i < len; i++) {\r\n\t\t\t\t\tlisteners[i].action.call(listeners[i].context, event);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\taddOneTimeEventListener: function (types, fn, context) {\r\n\r\n\t\tif (L.Util.invokeEach(types, this.addOneTimeEventListener, this, fn, context)) { return this; }\r\n\r\n\t\tvar handler = L.bind(function () {\r\n\t\t\tthis\r\n\t\t\t    .removeEventListener(types, fn, context)\r\n\t\t\t    .removeEventListener(types, handler, context);\r\n\t\t}, this);\r\n\r\n\t\treturn this\r\n\t\t    .addEventListener(types, fn, context)\r\n\t\t    .addEventListener(types, handler, context);\r\n\t}\r\n};\r\n\r\nL.Mixin.Events.on = L.Mixin.Events.addEventListener;\r\nL.Mixin.Events.off = L.Mixin.Events.removeEventListener;\r\nL.Mixin.Events.once = L.Mixin.Events.addOneTimeEventListener;\r\nL.Mixin.Events.fire = L.Mixin.Events.fireEvent;\r\n\n\n/*\r\n * L.Browser handles different browser and feature detections for internal Leaflet use.\r\n */\r\n\r\n(function () {\r\n\r\n\tvar ie = 'ActiveXObject' in window,\r\n\t\tielt9 = ie && !document.addEventListener,\r\n\r\n\t    // terrible browser detection to work around Safari / iOS / Android browser bugs\r\n\t    ua = navigator.userAgent.toLowerCase(),\r\n\t    webkit = ua.indexOf('webkit') !== -1,\r\n\t    chrome = ua.indexOf('chrome') !== -1,\r\n\t    phantomjs = ua.indexOf('phantom') !== -1,\r\n\t    android = ua.indexOf('android') !== -1,\r\n\t    android23 = ua.search('android [23]') !== -1,\r\n\t\tgecko = ua.indexOf('gecko') !== -1,\r\n\r\n\t    mobile = typeof orientation !== undefined + '',\r\n\t    msPointer = !window.PointerEvent && window.MSPointerEvent,\r\n\t\tpointer = (window.PointerEvent && window.navigator.pointerEnabled) ||\r\n\t\t\t\t  msPointer,\r\n\t    retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) ||\r\n\t             ('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') &&\r\n\t              window.matchMedia('(min-resolution:144dpi)').matches),\r\n\r\n\t    doc = document.documentElement,\r\n\t    ie3d = ie && ('transition' in doc.style),\r\n\t    webkit3d = ('WebKitCSSMatrix' in window) && ('m11' in new window.WebKitCSSMatrix()) && !android23,\r\n\t    gecko3d = 'MozPerspective' in doc.style,\r\n\t    opera3d = 'OTransition' in doc.style,\r\n\t    any3d = !window.L_DISABLE_3D && (ie3d || webkit3d || gecko3d || opera3d) && !phantomjs;\r\n\r\n\tvar touch = !window.L_NO_TOUCH && !phantomjs && (pointer || 'ontouchstart' in window ||\r\n\t\t(window.DocumentTouch && document instanceof window.DocumentTouch));\r\n\r\n\tL.Browser = {\r\n\t\tie: ie,\r\n\t\tielt9: ielt9,\r\n\t\twebkit: webkit,\r\n\t\tgecko: gecko && !webkit && !window.opera && !ie,\r\n\r\n\t\tandroid: android,\r\n\t\tandroid23: android23,\r\n\r\n\t\tchrome: chrome,\r\n\r\n\t\tie3d: ie3d,\r\n\t\twebkit3d: webkit3d,\r\n\t\tgecko3d: gecko3d,\r\n\t\topera3d: opera3d,\r\n\t\tany3d: any3d,\r\n\r\n\t\tmobile: mobile,\r\n\t\tmobileWebkit: mobile && webkit,\r\n\t\tmobileWebkit3d: mobile && webkit3d,\r\n\t\tmobileOpera: mobile && window.opera,\r\n\r\n\t\ttouch: touch,\r\n\t\tmsPointer: msPointer,\r\n\t\tpointer: pointer,\r\n\r\n\t\tretina: retina\r\n\t};\r\n\r\n}());\r\n\n\n/*\r\n * L.Point represents a point with x and y coordinates.\r\n */\r\n\r\nL.Point = function (/*Number*/ x, /*Number*/ y, /*Boolean*/ round) {\r\n\tthis.x = (round ? Math.round(x) : x);\r\n\tthis.y = (round ? Math.round(y) : y);\r\n};\r\n\r\nL.Point.prototype = {\r\n\r\n\tclone: function () {\r\n\t\treturn new L.Point(this.x, this.y);\r\n\t},\r\n\r\n\t// non-destructive, returns a new point\r\n\tadd: function (point) {\r\n\t\treturn this.clone()._add(L.point(point));\r\n\t},\r\n\r\n\t// destructive, used directly for performance in situations where it's safe to modify existing point\r\n\t_add: function (point) {\r\n\t\tthis.x += point.x;\r\n\t\tthis.y += point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsubtract: function (point) {\r\n\t\treturn this.clone()._subtract(L.point(point));\r\n\t},\r\n\r\n\t_subtract: function (point) {\r\n\t\tthis.x -= point.x;\r\n\t\tthis.y -= point.y;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdivideBy: function (num) {\r\n\t\treturn this.clone()._divideBy(num);\r\n\t},\r\n\r\n\t_divideBy: function (num) {\r\n\t\tthis.x /= num;\r\n\t\tthis.y /= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tmultiplyBy: function (num) {\r\n\t\treturn this.clone()._multiplyBy(num);\r\n\t},\r\n\r\n\t_multiplyBy: function (num) {\r\n\t\tthis.x *= num;\r\n\t\tthis.y *= num;\r\n\t\treturn this;\r\n\t},\r\n\r\n\tround: function () {\r\n\t\treturn this.clone()._round();\r\n\t},\r\n\r\n\t_round: function () {\r\n\t\tthis.x = Math.round(this.x);\r\n\t\tthis.y = Math.round(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tfloor: function () {\r\n\t\treturn this.clone()._floor();\r\n\t},\r\n\r\n\t_floor: function () {\r\n\t\tthis.x = Math.floor(this.x);\r\n\t\tthis.y = Math.floor(this.y);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdistanceTo: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\tvar x = point.x - this.x,\r\n\t\t    y = point.y - this.y;\r\n\r\n\t\treturn Math.sqrt(x * x + y * y);\r\n\t},\r\n\r\n\tequals: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn point.x === this.x &&\r\n\t\t       point.y === this.y;\r\n\t},\r\n\r\n\tcontains: function (point) {\r\n\t\tpoint = L.point(point);\r\n\r\n\t\treturn Math.abs(point.x) <= Math.abs(this.x) &&\r\n\t\t       Math.abs(point.y) <= Math.abs(this.y);\r\n\t},\r\n\r\n\ttoString: function () {\r\n\t\treturn 'Point(' +\r\n\t\t        L.Util.formatNum(this.x) + ', ' +\r\n\t\t        L.Util.formatNum(this.y) + ')';\r\n\t}\r\n};\r\n\r\nL.point = function (x, y, round) {\r\n\tif (x instanceof L.Point) {\r\n\t\treturn x;\r\n\t}\r\n\tif (L.Util.isArray(x)) {\r\n\t\treturn new L.Point(x[0], x[1]);\r\n\t}\r\n\tif (x === undefined || x === null) {\r\n\t\treturn x;\r\n\t}\r\n\treturn new L.Point(x, y, round);\r\n};\r\n\n\n/*\r\n * L.Bounds represents a rectangular area on the screen in pixel coordinates.\r\n */\r\n\r\nL.Bounds = function (a, b) { //(Point, Point) or Point[]\r\n\tif (!a) { return; }\r\n\r\n\tvar points = b ? [a, b] : a;\r\n\r\n\tfor (var i = 0, len = points.length; i < len; i++) {\r\n\t\tthis.extend(points[i]);\r\n\t}\r\n};\r\n\r\nL.Bounds.prototype = {\r\n\t// extend the bounds to contain the given point\r\n\textend: function (point) { // (Point)\r\n\t\tpoint = L.point(point);\r\n\r\n\t\tif (!this.min && !this.max) {\r\n\t\t\tthis.min = point.clone();\r\n\t\t\tthis.max = point.clone();\r\n\t\t} else {\r\n\t\t\tthis.min.x = Math.min(point.x, this.min.x);\r\n\t\t\tthis.max.x = Math.max(point.x, this.max.x);\r\n\t\t\tthis.min.y = Math.min(point.y, this.min.y);\r\n\t\t\tthis.max.y = Math.max(point.y, this.max.y);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetCenter: function (round) { // (Boolean) -> Point\r\n\t\treturn new L.Point(\r\n\t\t        (this.min.x + this.max.x) / 2,\r\n\t\t        (this.min.y + this.max.y) / 2, round);\r\n\t},\r\n\r\n\tgetBottomLeft: function () { // -> Point\r\n\t\treturn new L.Point(this.min.x, this.max.y);\r\n\t},\r\n\r\n\tgetTopRight: function () { // -> Point\r\n\t\treturn new L.Point(this.max.x, this.min.y);\r\n\t},\r\n\r\n\tgetSize: function () {\r\n\t\treturn this.max.subtract(this.min);\r\n\t},\r\n\r\n\tcontains: function (obj) { // (Bounds) or (Point) -> Boolean\r\n\t\tvar min, max;\r\n\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.Point) {\r\n\t\t\tobj = L.point(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.bounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof L.Bounds) {\r\n\t\t\tmin = obj.min;\r\n\t\t\tmax = obj.max;\r\n\t\t} else {\r\n\t\t\tmin = max = obj;\r\n\t\t}\r\n\r\n\t\treturn (min.x >= this.min.x) &&\r\n\t\t       (max.x <= this.max.x) &&\r\n\t\t       (min.y >= this.min.y) &&\r\n\t\t       (max.y <= this.max.y);\r\n\t},\r\n\r\n\tintersects: function (bounds) { // (Bounds) -> Boolean\r\n\t\tbounds = L.bounds(bounds);\r\n\r\n\t\tvar min = this.min,\r\n\t\t    max = this.max,\r\n\t\t    min2 = bounds.min,\r\n\t\t    max2 = bounds.max,\r\n\t\t    xIntersects = (max2.x >= min.x) && (min2.x <= max.x),\r\n\t\t    yIntersects = (max2.y >= min.y) && (min2.y <= max.y);\r\n\r\n\t\treturn xIntersects && yIntersects;\r\n\t},\r\n\r\n\tisValid: function () {\r\n\t\treturn !!(this.min && this.max);\r\n\t}\r\n};\r\n\r\nL.bounds = function (a, b) { // (Bounds) or (Point, Point) or (Point[])\r\n\tif (!a || a instanceof L.Bounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.Bounds(a, b);\r\n};\r\n\n\n/*\r\n * L.Transformation is an utility class to perform simple point transformations through a 2d-matrix.\r\n */\r\n\r\nL.Transformation = function (a, b, c, d) {\r\n\tthis._a = a;\r\n\tthis._b = b;\r\n\tthis._c = c;\r\n\tthis._d = d;\r\n};\r\n\r\nL.Transformation.prototype = {\r\n\ttransform: function (point, scale) { // (Point, Number) -> Point\r\n\t\treturn this._transform(point.clone(), scale);\r\n\t},\r\n\r\n\t// destructive transform (faster)\r\n\t_transform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\tpoint.x = scale * (this._a * point.x + this._b);\r\n\t\tpoint.y = scale * (this._c * point.y + this._d);\r\n\t\treturn point;\r\n\t},\r\n\r\n\tuntransform: function (point, scale) {\r\n\t\tscale = scale || 1;\r\n\t\treturn new L.Point(\r\n\t\t        (point.x / scale - this._b) / this._a,\r\n\t\t        (point.y / scale - this._d) / this._c);\r\n\t}\r\n};\r\n\n\n/*\r\n * L.DomUtil contains various utility functions for working with DOM.\r\n */\r\n\r\nL.DomUtil = {\r\n\tget: function (id) {\r\n\t\treturn (typeof id === 'string' ? document.getElementById(id) : id);\r\n\t},\r\n\r\n\tgetStyle: function (el, style) {\r\n\r\n\t\tvar value = el.style[style];\r\n\r\n\t\tif (!value && el.currentStyle) {\r\n\t\t\tvalue = el.currentStyle[style];\r\n\t\t}\r\n\r\n\t\tif ((!value || value === 'auto') && document.defaultView) {\r\n\t\t\tvar css = document.defaultView.getComputedStyle(el, null);\r\n\t\t\tvalue = css ? css[style] : null;\r\n\t\t}\r\n\r\n\t\treturn value === 'auto' ? null : value;\r\n\t},\r\n\r\n\tgetViewportOffset: function (element) {\r\n\r\n\t\tvar top = 0,\r\n\t\t    left = 0,\r\n\t\t    el = element,\r\n\t\t    docBody = document.body,\r\n\t\t    docEl = document.documentElement,\r\n\t\t    pos;\r\n\r\n\t\tdo {\r\n\t\t\ttop  += el.offsetTop  || 0;\r\n\t\t\tleft += el.offsetLeft || 0;\r\n\r\n\t\t\t//add borders\r\n\t\t\ttop += parseInt(L.DomUtil.getStyle(el, 'borderTopWidth'), 10) || 0;\r\n\t\t\tleft += parseInt(L.DomUtil.getStyle(el, 'borderLeftWidth'), 10) || 0;\r\n\r\n\t\t\tpos = L.DomUtil.getStyle(el, 'position');\r\n\r\n\t\t\tif (el.offsetParent === docBody && pos === 'absolute') { break; }\r\n\r\n\t\t\tif (pos === 'fixed') {\r\n\t\t\t\ttop  += docBody.scrollTop  || docEl.scrollTop  || 0;\r\n\t\t\t\tleft += docBody.scrollLeft || docEl.scrollLeft || 0;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif (pos === 'relative' && !el.offsetLeft) {\r\n\t\t\t\tvar width = L.DomUtil.getStyle(el, 'width'),\r\n\t\t\t\t    maxWidth = L.DomUtil.getStyle(el, 'max-width'),\r\n\t\t\t\t    r = el.getBoundingClientRect();\r\n\r\n\t\t\t\tif (width !== 'none' || maxWidth !== 'none') {\r\n\t\t\t\t\tleft += r.left + el.clientLeft;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t//calculate full y offset since we're breaking out of the loop\r\n\t\t\t\ttop += r.top + (docBody.scrollTop  || docEl.scrollTop  || 0);\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tel = el.offsetParent;\r\n\r\n\t\t} while (el);\r\n\r\n\t\tel = element;\r\n\r\n\t\tdo {\r\n\t\t\tif (el === docBody) { break; }\r\n\r\n\t\t\ttop  -= el.scrollTop  || 0;\r\n\t\t\tleft -= el.scrollLeft || 0;\r\n\r\n\t\t\tel = el.parentNode;\r\n\t\t} while (el);\r\n\r\n\t\treturn new L.Point(left, top);\r\n\t},\r\n\r\n\tdocumentIsLtr: function () {\r\n\t\tif (!L.DomUtil._docIsLtrCached) {\r\n\t\t\tL.DomUtil._docIsLtrCached = true;\r\n\t\t\tL.DomUtil._docIsLtr = L.DomUtil.getStyle(document.body, 'direction') === 'ltr';\r\n\t\t}\r\n\t\treturn L.DomUtil._docIsLtr;\r\n\t},\r\n\r\n\tcreate: function (tagName, className, container) {\r\n\r\n\t\tvar el = document.createElement(tagName);\r\n\t\tel.className = className;\r\n\r\n\t\tif (container) {\r\n\t\t\tcontainer.appendChild(el);\r\n\t\t}\r\n\r\n\t\treturn el;\r\n\t},\r\n\r\n\thasClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\treturn el.classList.contains(name);\r\n\t\t}\r\n\t\tvar className = L.DomUtil._getClass(el);\r\n\t\treturn className.length > 0 && new RegExp('(^|\\\\s)' + name + '(\\\\s|$)').test(className);\r\n\t},\r\n\r\n\taddClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tvar classes = L.Util.splitWords(name);\r\n\t\t\tfor (var i = 0, len = classes.length; i < len; i++) {\r\n\t\t\t\tel.classList.add(classes[i]);\r\n\t\t\t}\r\n\t\t} else if (!L.DomUtil.hasClass(el, name)) {\r\n\t\t\tvar className = L.DomUtil._getClass(el);\r\n\t\t\tL.DomUtil._setClass(el, (className ? className + ' ' : '') + name);\r\n\t\t}\r\n\t},\r\n\r\n\tremoveClass: function (el, name) {\r\n\t\tif (el.classList !== undefined) {\r\n\t\t\tel.classList.remove(name);\r\n\t\t} else {\r\n\t\t\tL.DomUtil._setClass(el, L.Util.trim((' ' + L.DomUtil._getClass(el) + ' ').replace(' ' + name + ' ', ' ')));\r\n\t\t}\r\n\t},\r\n\r\n\t_setClass: function (el, name) {\r\n\t\tif (el.className.baseVal === undefined) {\r\n\t\t\tel.className = name;\r\n\t\t} else {\r\n\t\t\t// in case of SVG element\r\n\t\t\tel.className.baseVal = name;\r\n\t\t}\r\n\t},\r\n\r\n\t_getClass: function (el) {\r\n\t\treturn el.className.baseVal === undefined ? el.className : el.className.baseVal;\r\n\t},\r\n\r\n\tsetOpacity: function (el, value) {\r\n\r\n\t\tif ('opacity' in el.style) {\r\n\t\t\tel.style.opacity = value;\r\n\r\n\t\t} else if ('filter' in el.style) {\r\n\r\n\t\t\tvar filter = false,\r\n\t\t\t    filterName = 'DXImageTransform.Microsoft.Alpha';\r\n\r\n\t\t\t// filters collection throws an error if we try to retrieve a filter that doesn't exist\r\n\t\t\ttry {\r\n\t\t\t\tfilter = el.filters.item(filterName);\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// don't set opacity to 1 if we haven't already set an opacity,\r\n\t\t\t\t// it isn't needed and breaks transparent pngs.\r\n\t\t\t\tif (value === 1) { return; }\r\n\t\t\t}\r\n\r\n\t\t\tvalue = Math.round(value * 100);\r\n\r\n\t\t\tif (filter) {\r\n\t\t\t\tfilter.Enabled = (value !== 100);\r\n\t\t\t\tfilter.Opacity = value;\r\n\t\t\t} else {\r\n\t\t\t\tel.style.filter += ' progid:' + filterName + '(opacity=' + value + ')';\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\ttestProp: function (props) {\r\n\r\n\t\tvar style = document.documentElement.style;\r\n\r\n\t\tfor (var i = 0; i < props.length; i++) {\r\n\t\t\tif (props[i] in style) {\r\n\t\t\t\treturn props[i];\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\tgetTranslateString: function (point) {\r\n\t\t// on WebKit browsers (Chrome/Safari/iOS Safari/Android) using translate3d instead of translate\r\n\t\t// makes animation smoother as it ensures HW accel is used. Firefox 13 doesn't care\r\n\t\t// (same speed either way), Opera 12 doesn't support translate3d\r\n\r\n\t\tvar is3d = L.Browser.webkit3d,\r\n\t\t    open = 'translate' + (is3d ? '3d' : '') + '(',\r\n\t\t    close = (is3d ? ',0' : '') + ')';\r\n\r\n\t\treturn open + point.x + 'px,' + point.y + 'px' + close;\r\n\t},\r\n\r\n\tgetScaleString: function (scale, origin) {\r\n\r\n\t\tvar preTranslateStr = L.DomUtil.getTranslateString(origin.add(origin.multiplyBy(-1 * scale))),\r\n\t\t    scaleStr = ' scale(' + scale + ') ';\r\n\r\n\t\treturn preTranslateStr + scaleStr;\r\n\t},\r\n\r\n\tsetPosition: function (el, point, disable3D) { // (HTMLElement, Point[, Boolean])\r\n\r\n\t\t// jshint camelcase: false\r\n\t\tel._leaflet_pos = point;\r\n\r\n\t\tif (!disable3D && L.Browser.any3d) {\r\n\t\t\tel.style[L.DomUtil.TRANSFORM] =  L.DomUtil.getTranslateString(point);\r\n\t\t} else {\r\n\t\t\tel.style.left = point.x + 'px';\r\n\t\t\tel.style.top = point.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\tgetPosition: function (el) {\r\n\t\t// this method is only used for elements previously positioned using setPosition,\r\n\t\t// so it's safe to cache the position for performance\r\n\r\n\t\t// jshint camelcase: false\r\n\t\treturn el._leaflet_pos;\r\n\t}\r\n};\r\n\r\n\r\n// prefix style property names\r\n\r\nL.DomUtil.TRANSFORM = L.DomUtil.testProp(\r\n        ['transform', 'WebkitTransform', 'OTransform', 'MozTransform', 'msTransform']);\r\n\r\n// webkitTransition comes first because some browser versions that drop vendor prefix don't do\r\n// the same for the transitionend event, in particular the Android 4.1 stock browser\r\n\r\nL.DomUtil.TRANSITION = L.DomUtil.testProp(\r\n        ['webkitTransition', 'transition', 'OTransition', 'MozTransition', 'msTransition']);\r\n\r\nL.DomUtil.TRANSITION_END =\r\n        L.DomUtil.TRANSITION === 'webkitTransition' || L.DomUtil.TRANSITION === 'OTransition' ?\r\n        L.DomUtil.TRANSITION + 'End' : 'transitionend';\r\n\r\n(function () {\r\n    if ('onselectstart' in document) {\r\n        L.extend(L.DomUtil, {\r\n            disableTextSelection: function () {\r\n                L.DomEvent.on(window, 'selectstart', L.DomEvent.preventDefault);\r\n            },\r\n\r\n            enableTextSelection: function () {\r\n                L.DomEvent.off(window, 'selectstart', L.DomEvent.preventDefault);\r\n            }\r\n        });\r\n    } else {\r\n        var userSelectProperty = L.DomUtil.testProp(\r\n            ['userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect']);\r\n\r\n        L.extend(L.DomUtil, {\r\n            disableTextSelection: function () {\r\n                if (userSelectProperty) {\r\n                    var style = document.documentElement.style;\r\n                    this._userSelect = style[userSelectProperty];\r\n                    style[userSelectProperty] = 'none';\r\n                }\r\n            },\r\n\r\n            enableTextSelection: function () {\r\n                if (userSelectProperty) {\r\n                    document.documentElement.style[userSelectProperty] = this._userSelect;\r\n                    delete this._userSelect;\r\n                }\r\n            }\r\n        });\r\n    }\r\n\r\n\tL.extend(L.DomUtil, {\r\n\t\tdisableImageDrag: function () {\r\n\t\t\tL.DomEvent.on(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t\t},\r\n\r\n\t\tenableImageDrag: function () {\r\n\t\t\tL.DomEvent.off(window, 'dragstart', L.DomEvent.preventDefault);\r\n\t\t}\r\n\t});\r\n})();\r\n\n\n/*\r\n * L.LatLng represents a geographical point with latitude and longitude coordinates.\r\n */\r\n\r\nL.LatLng = function (lat, lng, alt) { // (Number, Number, Number)\r\n\tlat = parseFloat(lat);\r\n\tlng = parseFloat(lng);\r\n\r\n\tif (isNaN(lat) || isNaN(lng)) {\r\n\t\tthrow new Error('Invalid LatLng object: (' + lat + ', ' + lng + ')');\r\n\t}\r\n\r\n\tthis.lat = lat;\r\n\tthis.lng = lng;\r\n\r\n\tif (alt !== undefined) {\r\n\t\tthis.alt = parseFloat(alt);\r\n\t}\r\n};\r\n\r\nL.extend(L.LatLng, {\r\n\tDEG_TO_RAD: Math.PI / 180,\r\n\tRAD_TO_DEG: 180 / Math.PI,\r\n\tMAX_MARGIN: 1.0E-9 // max margin of error for the \"equals\" check\r\n});\r\n\r\nL.LatLng.prototype = {\r\n\tequals: function (obj) { // (LatLng) -> Boolean\r\n\t\tif (!obj) { return false; }\r\n\r\n\t\tobj = L.latLng(obj);\r\n\r\n\t\tvar margin = Math.max(\r\n\t\t        Math.abs(this.lat - obj.lat),\r\n\t\t        Math.abs(this.lng - obj.lng));\r\n\r\n\t\treturn margin <= L.LatLng.MAX_MARGIN;\r\n\t},\r\n\r\n\ttoString: function (precision) { // (Number) -> String\r\n\t\treturn 'LatLng(' +\r\n\t\t        L.Util.formatNum(this.lat, precision) + ', ' +\r\n\t\t        L.Util.formatNum(this.lng, precision) + ')';\r\n\t},\r\n\r\n\t// Haversine distance formula, see http://en.wikipedia.org/wiki/Haversine_formula\r\n\t// TODO move to projection code, LatLng shouldn't know about Earth\r\n\tdistanceTo: function (other) { // (LatLng) -> Number\r\n\t\tother = L.latLng(other);\r\n\r\n\t\tvar R = 6378137, // earth radius in meters\r\n\t\t    d2r = L.LatLng.DEG_TO_RAD,\r\n\t\t    dLat = (other.lat - this.lat) * d2r,\r\n\t\t    dLon = (other.lng - this.lng) * d2r,\r\n\t\t    lat1 = this.lat * d2r,\r\n\t\t    lat2 = other.lat * d2r,\r\n\t\t    sin1 = Math.sin(dLat / 2),\r\n\t\t    sin2 = Math.sin(dLon / 2);\r\n\r\n\t\tvar a = sin1 * sin1 + sin2 * sin2 * Math.cos(lat1) * Math.cos(lat2);\r\n\r\n\t\treturn R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n\t},\r\n\r\n\twrap: function (a, b) { // (Number, Number) -> LatLng\r\n\t\tvar lng = this.lng;\r\n\r\n\t\ta = a || -180;\r\n\t\tb = b ||  180;\r\n\r\n\t\tlng = (lng + b) % (b - a) + (lng < a || lng === b ? b : a);\r\n\r\n\t\treturn new L.LatLng(this.lat, lng);\r\n\t}\r\n};\r\n\r\nL.latLng = function (a, b) { // (LatLng) or ([Number, Number]) or (Number, Number)\r\n\tif (a instanceof L.LatLng) {\r\n\t\treturn a;\r\n\t}\r\n\tif (L.Util.isArray(a)) {\r\n\t\tif (typeof a[0] === 'number' || typeof a[0] === 'string') {\r\n\t\t\treturn new L.LatLng(a[0], a[1], a[2]);\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\tif (a === undefined || a === null) {\r\n\t\treturn a;\r\n\t}\r\n\tif (typeof a === 'object' && 'lat' in a) {\r\n\t\treturn new L.LatLng(a.lat, 'lng' in a ? a.lng : a.lon);\r\n\t}\r\n\tif (b === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\treturn new L.LatLng(a, b);\r\n};\r\n\r\n\n\n/*\r\n * L.LatLngBounds represents a rectangular area on the map in geographical coordinates.\r\n */\r\n\r\nL.LatLngBounds = function (southWest, northEast) { // (LatLng, LatLng) or (LatLng[])\r\n\tif (!southWest) { return; }\r\n\r\n\tvar latlngs = northEast ? [southWest, northEast] : southWest;\r\n\r\n\tfor (var i = 0, len = latlngs.length; i < len; i++) {\r\n\t\tthis.extend(latlngs[i]);\r\n\t}\r\n};\r\n\r\nL.LatLngBounds.prototype = {\r\n\t// extend the bounds to contain the given point or bounds\r\n\textend: function (obj) { // (LatLng) or (LatLngBounds)\r\n\t\tif (!obj) { return this; }\r\n\r\n\t\tvar latLng = L.latLng(obj);\r\n\t\tif (latLng !== null) {\r\n\t\t\tobj = latLng;\r\n\t\t} else {\r\n\t\t\tobj = L.latLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tif (obj instanceof L.LatLng) {\r\n\t\t\tif (!this._southWest && !this._northEast) {\r\n\t\t\t\tthis._southWest = new L.LatLng(obj.lat, obj.lng);\r\n\t\t\t\tthis._northEast = new L.LatLng(obj.lat, obj.lng);\r\n\t\t\t} else {\r\n\t\t\t\tthis._southWest.lat = Math.min(obj.lat, this._southWest.lat);\r\n\t\t\t\tthis._southWest.lng = Math.min(obj.lng, this._southWest.lng);\r\n\r\n\t\t\t\tthis._northEast.lat = Math.max(obj.lat, this._northEast.lat);\r\n\t\t\t\tthis._northEast.lng = Math.max(obj.lng, this._northEast.lng);\r\n\t\t\t}\r\n\t\t} else if (obj instanceof L.LatLngBounds) {\r\n\t\t\tthis.extend(obj._southWest);\r\n\t\t\tthis.extend(obj._northEast);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// extend the bounds by a percentage\r\n\tpad: function (bufferRatio) { // (Number) -> LatLngBounds\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio,\r\n\t\t    widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\r\n\r\n\t\treturn new L.LatLngBounds(\r\n\t\t        new L.LatLng(sw.lat - heightBuffer, sw.lng - widthBuffer),\r\n\t\t        new L.LatLng(ne.lat + heightBuffer, ne.lng + widthBuffer));\r\n\t},\r\n\r\n\tgetCenter: function () { // -> LatLng\r\n\t\treturn new L.LatLng(\r\n\t\t        (this._southWest.lat + this._northEast.lat) / 2,\r\n\t\t        (this._southWest.lng + this._northEast.lng) / 2);\r\n\t},\r\n\r\n\tgetSouthWest: function () {\r\n\t\treturn this._southWest;\r\n\t},\r\n\r\n\tgetNorthEast: function () {\r\n\t\treturn this._northEast;\r\n\t},\r\n\r\n\tgetNorthWest: function () {\r\n\t\treturn new L.LatLng(this.getNorth(), this.getWest());\r\n\t},\r\n\r\n\tgetSouthEast: function () {\r\n\t\treturn new L.LatLng(this.getSouth(), this.getEast());\r\n\t},\r\n\r\n\tgetWest: function () {\r\n\t\treturn this._southWest.lng;\r\n\t},\r\n\r\n\tgetSouth: function () {\r\n\t\treturn this._southWest.lat;\r\n\t},\r\n\r\n\tgetEast: function () {\r\n\t\treturn this._northEast.lng;\r\n\t},\r\n\r\n\tgetNorth: function () {\r\n\t\treturn this._northEast.lat;\r\n\t},\r\n\r\n\tcontains: function (obj) { // (LatLngBounds) or (LatLng) -> Boolean\r\n\t\tif (typeof obj[0] === 'number' || obj instanceof L.LatLng) {\r\n\t\t\tobj = L.latLng(obj);\r\n\t\t} else {\r\n\t\t\tobj = L.latLngBounds(obj);\r\n\t\t}\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2, ne2;\r\n\r\n\t\tif (obj instanceof L.LatLngBounds) {\r\n\t\t\tsw2 = obj.getSouthWest();\r\n\t\t\tne2 = obj.getNorthEast();\r\n\t\t} else {\r\n\t\t\tsw2 = ne2 = obj;\r\n\t\t}\r\n\r\n\t\treturn (sw2.lat >= sw.lat) && (ne2.lat <= ne.lat) &&\r\n\t\t       (sw2.lng >= sw.lng) && (ne2.lng <= ne.lng);\r\n\t},\r\n\r\n\tintersects: function (bounds) { // (LatLngBounds)\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar sw = this._southWest,\r\n\t\t    ne = this._northEast,\r\n\t\t    sw2 = bounds.getSouthWest(),\r\n\t\t    ne2 = bounds.getNorthEast(),\r\n\r\n\t\t    latIntersects = (ne2.lat >= sw.lat) && (sw2.lat <= ne.lat),\r\n\t\t    lngIntersects = (ne2.lng >= sw.lng) && (sw2.lng <= ne.lng);\r\n\r\n\t\treturn latIntersects && lngIntersects;\r\n\t},\r\n\r\n\ttoBBoxString: function () {\r\n\t\treturn [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()].join(',');\r\n\t},\r\n\r\n\tequals: function (bounds) { // (LatLngBounds)\r\n\t\tif (!bounds) { return false; }\r\n\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\treturn this._southWest.equals(bounds.getSouthWest()) &&\r\n\t\t       this._northEast.equals(bounds.getNorthEast());\r\n\t},\r\n\r\n\tisValid: function () {\r\n\t\treturn !!(this._southWest && this._northEast);\r\n\t}\r\n};\r\n\r\n//TODO International date line?\r\n\r\nL.latLngBounds = function (a, b) { // (LatLngBounds) or (LatLng, LatLng)\r\n\tif (!a || a instanceof L.LatLngBounds) {\r\n\t\treturn a;\r\n\t}\r\n\treturn new L.LatLngBounds(a, b);\r\n};\r\n\n\n/*\r\n * L.Projection contains various geographical projections used by CRS classes.\r\n */\r\n\r\nL.Projection = {};\r\n\n\n/*\r\n * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS used by default.\r\n */\r\n\r\nL.Projection.SphericalMercator = {\r\n\tMAX_LATITUDE: 85.0511287798,\r\n\r\n\tproject: function (latlng) { // (LatLng) -> Point\r\n\t\tvar d = L.LatLng.DEG_TO_RAD,\r\n\t\t    max = this.MAX_LATITUDE,\r\n\t\t    lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t    x = latlng.lng * d,\r\n\t\t    y = lat * d;\r\n\r\n\t\ty = Math.log(Math.tan((Math.PI / 4) + (y / 2)));\r\n\r\n\t\treturn new L.Point(x, y);\r\n\t},\r\n\r\n\tunproject: function (point) { // (Point, Boolean) -> LatLng\r\n\t\tvar d = L.LatLng.RAD_TO_DEG,\r\n\t\t    lng = point.x * d,\r\n\t\t    lat = (2 * Math.atan(Math.exp(point.y)) - (Math.PI / 2)) * d;\r\n\r\n\t\treturn new L.LatLng(lat, lng);\r\n\t}\r\n};\r\n\n\n/*\r\n * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326 and Simple.\r\n */\r\n\r\nL.Projection.LonLat = {\r\n\tproject: function (latlng) {\r\n\t\treturn new L.Point(latlng.lng, latlng.lat);\r\n\t},\r\n\r\n\tunproject: function (point) {\r\n\t\treturn new L.LatLng(point.y, point.x);\r\n\t}\r\n};\r\n\n\n/*\r\n * L.CRS is a base object for all defined CRS (Coordinate Reference Systems) in Leaflet.\r\n */\r\n\r\nL.CRS = {\r\n\tlatLngToPoint: function (latlng, zoom) { // (LatLng, Number) -> Point\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t    scale = this.scale(zoom);\r\n\r\n\t\treturn this.transformation._transform(projectedPoint, scale);\r\n\t},\r\n\r\n\tpointToLatLng: function (point, zoom) { // (Point, Number[, Boolean]) -> LatLng\r\n\t\tvar scale = this.scale(zoom),\r\n\t\t    untransformedPoint = this.transformation.untransform(point, scale);\r\n\r\n\t\treturn this.projection.unproject(untransformedPoint);\r\n\t},\r\n\r\n\tproject: function (latlng) {\r\n\t\treturn this.projection.project(latlng);\r\n\t},\r\n\r\n\tscale: function (zoom) {\r\n\t\treturn 256 * Math.pow(2, zoom);\r\n\t},\r\n\r\n\tgetSize: function (zoom) {\r\n\t\tvar s = this.scale(zoom);\r\n\t\treturn L.point(s, s);\r\n\t}\r\n};\r\n\n\n/*\n * A simple CRS that can be used for flat non-Earth maps like panoramas or game maps.\n */\n\nL.CRS.Simple = L.extend({}, L.CRS, {\n\tprojection: L.Projection.LonLat,\n\ttransformation: new L.Transformation(1, 0, -1, 0),\n\n\tscale: function (zoom) {\n\t\treturn Math.pow(2, zoom);\n\t}\n});\n\n\n/*\r\n * L.CRS.EPSG3857 (Spherical Mercator) is the most common CRS for web mapping\r\n * and is used by Leaflet by default.\r\n */\r\n\r\nL.CRS.EPSG3857 = L.extend({}, L.CRS, {\r\n\tcode: 'EPSG:3857',\r\n\r\n\tprojection: L.Projection.SphericalMercator,\r\n\ttransformation: new L.Transformation(0.5 / Math.PI, 0.5, -0.5 / Math.PI, 0.5),\r\n\r\n\tproject: function (latlng) { // (LatLng) -> Point\r\n\t\tvar projectedPoint = this.projection.project(latlng),\r\n\t\t    earthRadius = 6378137;\r\n\t\treturn projectedPoint.multiplyBy(earthRadius);\r\n\t}\r\n});\r\n\r\nL.CRS.EPSG900913 = L.extend({}, L.CRS.EPSG3857, {\r\n\tcode: 'EPSG:900913'\r\n});\r\n\n\n/*\r\n * L.CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\r\n */\r\n\r\nL.CRS.EPSG4326 = L.extend({}, L.CRS, {\r\n\tcode: 'EPSG:4326',\r\n\r\n\tprojection: L.Projection.LonLat,\r\n\ttransformation: new L.Transformation(1 / 360, 0.5, -1 / 360, 0.5)\r\n});\r\n\n\n/*\r\n * L.Map is the central class of the API - it is used to create a map.\r\n */\r\n\r\nL.Map = L.Class.extend({\r\n\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\tcrs: L.CRS.EPSG3857,\r\n\r\n\t\t/*\r\n\t\tcenter: LatLng,\r\n\t\tzoom: Number,\r\n\t\tlayers: Array,\r\n\t\t*/\r\n\r\n\t\tfadeAnimation: L.DomUtil.TRANSITION && !L.Browser.android23,\r\n\t\ttrackResize: true,\r\n\t\tmarkerZoomAnimation: L.DomUtil.TRANSITION && L.Browser.any3d\r\n\t},\r\n\r\n\tinitialize: function (id, options) { // (HTMLElement or String, Object)\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\r\n\t\tthis._initContainer(id);\r\n\t\tthis._initLayout();\r\n\r\n\t\t// hack for https://github.com/Leaflet/Leaflet/issues/1980\r\n\t\tthis._onResize = L.bind(this._onResize, this);\r\n\r\n\t\tthis._initEvents();\r\n\r\n\t\tif (options.maxBounds) {\r\n\t\t\tthis.setMaxBounds(options.maxBounds);\r\n\t\t}\r\n\r\n\t\tif (options.center && options.zoom !== undefined) {\r\n\t\t\tthis.setView(L.latLng(options.center), options.zoom, {reset: true});\r\n\t\t}\r\n\r\n\t\tthis._handlers = [];\r\n\r\n\t\tthis._layers = {};\r\n\t\tthis._zoomBoundLayers = {};\r\n\t\tthis._tileLayersNum = 0;\r\n\r\n\t\tthis.callInitHooks();\r\n\r\n\t\tthis._addLayers(options.layers);\r\n\t},\r\n\r\n\r\n\t// public methods that modify map state\r\n\r\n\t// replaced by animation-powered implementation in Map.PanAnimation.js\r\n\tsetView: function (center, zoom) {\r\n\t\tzoom = zoom === undefined ? this.getZoom() : zoom;\r\n\t\tthis._resetView(L.latLng(center), this._limitZoom(zoom));\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetZoom: function (zoom, options) {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthis._zoom = this._limitZoom(zoom);\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\treturn this.setView(this.getCenter(), zoom, {zoom: options});\r\n\t},\r\n\r\n\tzoomIn: function (delta, options) {\r\n\t\treturn this.setZoom(this._zoom + (delta || 1), options);\r\n\t},\r\n\r\n\tzoomOut: function (delta, options) {\r\n\t\treturn this.setZoom(this._zoom - (delta || 1), options);\r\n\t},\r\n\r\n\tsetZoomAround: function (latlng, zoom, options) {\r\n\t\tvar scale = this.getZoomScale(zoom),\r\n\t\t    viewHalf = this.getSize().divideBy(2),\r\n\t\t    containerPoint = latlng instanceof L.Point ? latlng : this.latLngToContainerPoint(latlng),\r\n\r\n\t\t    centerOffset = containerPoint.subtract(viewHalf).multiplyBy(1 - 1 / scale),\r\n\t\t    newCenter = this.containerPointToLatLng(viewHalf.add(centerOffset));\r\n\r\n\t\treturn this.setView(newCenter, zoom, {zoom: options});\r\n\t},\r\n\r\n\tfitBounds: function (bounds, options) {\r\n\r\n\t\toptions = options || {};\r\n\t\tbounds = bounds.getBounds ? bounds.getBounds() : L.latLngBounds(bounds);\r\n\r\n\t\tvar paddingTL = L.point(options.paddingTopLeft || options.padding || [0, 0]),\r\n\t\t    paddingBR = L.point(options.paddingBottomRight || options.padding || [0, 0]),\r\n\r\n\t\t    zoom = this.getBoundsZoom(bounds, false, paddingTL.add(paddingBR));\r\n\r\n\t\tzoom = (options.maxZoom) ? Math.min(options.maxZoom, zoom) : zoom;\r\n\r\n\t\tvar paddingOffset = paddingBR.subtract(paddingTL).divideBy(2),\r\n\r\n\t\t    swPoint = this.project(bounds.getSouthWest(), zoom),\r\n\t\t    nePoint = this.project(bounds.getNorthEast(), zoom),\r\n\t\t    center = this.unproject(swPoint.add(nePoint).divideBy(2).add(paddingOffset), zoom);\r\n\r\n\t\treturn this.setView(center, zoom, options);\r\n\t},\r\n\r\n\tfitWorld: function (options) {\r\n\t\treturn this.fitBounds([[-90, -180], [90, 180]], options);\r\n\t},\r\n\r\n\tpanTo: function (center, options) { // (LatLng)\r\n\t\treturn this.setView(center, this._zoom, {pan: options});\r\n\t},\r\n\r\n\tpanBy: function (offset) { // (Point)\r\n\t\t// replaced with animated panBy in Map.PanAnimation.js\r\n\t\tthis.fire('movestart');\r\n\r\n\t\tthis._rawPanBy(L.point(offset));\r\n\r\n\t\tthis.fire('move');\r\n\t\treturn this.fire('moveend');\r\n\t},\r\n\r\n\tsetMaxBounds: function (bounds) {\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tthis.options.maxBounds = bounds;\r\n\r\n\t\tif (!bounds) {\r\n\t\t\treturn this.off('moveend', this._panInsideMaxBounds, this);\r\n\t\t}\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._panInsideMaxBounds();\r\n\t\t}\r\n\r\n\t\treturn this.on('moveend', this._panInsideMaxBounds, this);\r\n\t},\r\n\r\n\tpanInsideBounds: function (bounds, options) {\r\n\t\tvar center = this.getCenter(),\r\n\t\t\tnewCenter = this._limitCenter(center, this._zoom, bounds);\r\n\r\n\t\tif (center.equals(newCenter)) { return this; }\r\n\r\n\t\treturn this.panTo(newCenter, options);\r\n\t},\r\n\r\n\taddLayer: function (layer) {\r\n\t\t// TODO method is too big, refactor\r\n\r\n\t\tvar id = L.stamp(layer);\r\n\r\n\t\tif (this._layers[id]) { return this; }\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\t// TODO getMaxZoom, getMinZoom in ILayer (instead of options)\r\n\t\tif (layer.options && (!isNaN(layer.options.maxZoom) || !isNaN(layer.options.minZoom))) {\r\n\t\t\tthis._zoomBoundLayers[id] = layer;\r\n\t\t\tthis._updateZoomLevels();\r\n\t\t}\r\n\r\n\t\t// TODO looks ugly, refactor!!!\r\n\t\tif (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {\r\n\t\t\tthis._tileLayersNum++;\r\n\t\t\tthis._tileLayersToLoad++;\r\n\t\t\tlayer.on('load', this._onTileLayerLoad, this);\r\n\t\t}\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis._layerAdd(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = L.stamp(layer);\r\n\r\n\t\tif (!this._layers[id]) { return this; }\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tlayer.onRemove(this);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\tif (this._loaded) {\r\n\t\t\tthis.fire('layerremove', {layer: layer});\r\n\t\t}\r\n\r\n\t\tif (this._zoomBoundLayers[id]) {\r\n\t\t\tdelete this._zoomBoundLayers[id];\r\n\t\t\tthis._updateZoomLevels();\r\n\t\t}\r\n\r\n\t\t// TODO looks ugly, refactor\r\n\t\tif (this.options.zoomAnimation && L.TileLayer && (layer instanceof L.TileLayer)) {\r\n\t\t\tthis._tileLayersNum--;\r\n\t\t\tthis._tileLayersToLoad--;\r\n\t\t\tlayer.off('load', this._onTileLayerLoad, this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\thasLayer: function (layer) {\r\n\t\tif (!layer) { return false; }\r\n\r\n\t\treturn (L.stamp(layer) in this._layers);\r\n\t},\r\n\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tinvalidateSize: function (options) {\r\n\t\tif (!this._loaded) { return this; }\r\n\r\n\t\toptions = L.extend({\r\n\t\t\tanimate: false,\r\n\t\t\tpan: true\r\n\t\t}, options === true ? {animate: true} : options);\r\n\r\n\t\tvar oldSize = this.getSize();\r\n\t\tthis._sizeChanged = true;\r\n\t\tthis._initialCenter = null;\r\n\r\n\t\tvar newSize = this.getSize(),\r\n\t\t    oldCenter = oldSize.divideBy(2).round(),\r\n\t\t    newCenter = newSize.divideBy(2).round(),\r\n\t\t    offset = oldCenter.subtract(newCenter);\r\n\r\n\t\tif (!offset.x && !offset.y) { return this; }\r\n\r\n\t\tif (options.animate && options.pan) {\r\n\t\t\tthis.panBy(offset);\r\n\r\n\t\t} else {\r\n\t\t\tif (options.pan) {\r\n\t\t\t\tthis._rawPanBy(offset);\r\n\t\t\t}\r\n\r\n\t\t\tthis.fire('move');\r\n\r\n\t\t\tif (options.debounceMoveend) {\r\n\t\t\t\tclearTimeout(this._sizeTimer);\r\n\t\t\t\tthis._sizeTimer = setTimeout(L.bind(this.fire, this, 'moveend'), 200);\r\n\t\t\t} else {\r\n\t\t\t\tthis.fire('moveend');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.fire('resize', {\r\n\t\t\toldSize: oldSize,\r\n\t\t\tnewSize: newSize\r\n\t\t});\r\n\t},\r\n\r\n\t// TODO handler.addTo\r\n\taddHandler: function (name, HandlerClass) {\r\n\t\tif (!HandlerClass) { return this; }\r\n\r\n\t\tvar handler = this[name] = new HandlerClass(this);\r\n\r\n\t\tthis._handlers.push(handler);\r\n\r\n\t\tif (this.options[name]) {\r\n\t\t\thandler.enable();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremove: function () {\r\n\t\tif (this._loaded) {\r\n\t\t\tthis.fire('unload');\r\n\t\t}\r\n\r\n\t\tthis._initEvents('off');\r\n\r\n\t\ttry {\r\n\t\t\t// throws error in IE6-8\r\n\t\t\tdelete this._container._leaflet;\r\n\t\t} catch (e) {\r\n\t\t\tthis._container._leaflet = undefined;\r\n\t\t}\r\n\r\n\t\tthis._clearPanes();\r\n\t\tif (this._clearControlPos) {\r\n\t\t\tthis._clearControlPos();\r\n\t\t}\r\n\r\n\t\tthis._clearHandlers();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\r\n\t// public methods for getting map state\r\n\r\n\tgetCenter: function () { // (Boolean) -> LatLng\r\n\t\tthis._checkIfLoaded();\r\n\r\n\t\tif (this._initialCenter && !this._moved()) {\r\n\t\t\treturn this._initialCenter;\r\n\t\t}\r\n\t\treturn this.layerPointToLatLng(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\tgetZoom: function () {\r\n\t\treturn this._zoom;\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\tvar bounds = this.getPixelBounds(),\r\n\t\t    sw = this.unproject(bounds.getBottomLeft()),\r\n\t\t    ne = this.unproject(bounds.getTopRight());\r\n\r\n\t\treturn new L.LatLngBounds(sw, ne);\r\n\t},\r\n\r\n\tgetMinZoom: function () {\r\n\t\treturn this.options.minZoom === undefined ?\r\n\t\t\t(this._layersMinZoom === undefined ? 0 : this._layersMinZoom) :\r\n\t\t\tthis.options.minZoom;\r\n\t},\r\n\r\n\tgetMaxZoom: function () {\r\n\t\treturn this.options.maxZoom === undefined ?\r\n\t\t\t(this._layersMaxZoom === undefined ? Infinity : this._layersMaxZoom) :\r\n\t\t\tthis.options.maxZoom;\r\n\t},\r\n\r\n\tgetBoundsZoom: function (bounds, inside, padding) { // (LatLngBounds[, Boolean, Point]) -> Number\r\n\t\tbounds = L.latLngBounds(bounds);\r\n\r\n\t\tvar zoom = this.getMinZoom() - (inside ? 1 : 0),\r\n\t\t    maxZoom = this.getMaxZoom(),\r\n\t\t    size = this.getSize(),\r\n\r\n\t\t    nw = bounds.getNorthWest(),\r\n\t\t    se = bounds.getSouthEast(),\r\n\r\n\t\t    zoomNotFound = true,\r\n\t\t    boundsSize;\r\n\r\n\t\tpadding = L.point(padding || [0, 0]);\r\n\r\n\t\tdo {\r\n\t\t\tzoom++;\r\n\t\t\tboundsSize = this.project(se, zoom).subtract(this.project(nw, zoom)).add(padding);\r\n\t\t\tzoomNotFound = !inside ? size.contains(boundsSize) : boundsSize.x < size.x || boundsSize.y < size.y;\r\n\r\n\t\t} while (zoomNotFound && zoom <= maxZoom);\r\n\r\n\t\tif (zoomNotFound && inside) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn inside ? zoom : zoom - 1;\r\n\t},\r\n\r\n\tgetSize: function () {\r\n\t\tif (!this._size || this._sizeChanged) {\r\n\t\t\tthis._size = new L.Point(\r\n\t\t\t\tthis._container.clientWidth,\r\n\t\t\t\tthis._container.clientHeight);\r\n\r\n\t\t\tthis._sizeChanged = false;\r\n\t\t}\r\n\t\treturn this._size.clone();\r\n\t},\r\n\r\n\tgetPixelBounds: function () {\r\n\t\tvar topLeftPoint = this._getTopLeftPoint();\r\n\t\treturn new L.Bounds(topLeftPoint, topLeftPoint.add(this.getSize()));\r\n\t},\r\n\r\n\tgetPixelOrigin: function () {\r\n\t\tthis._checkIfLoaded();\r\n\t\treturn this._initialTopLeftPoint;\r\n\t},\r\n\r\n\tgetPanes: function () {\r\n\t\treturn this._panes;\r\n\t},\r\n\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\r\n\t// TODO replace with universal implementation after refactoring projections\r\n\r\n\tgetZoomScale: function (toZoom) {\r\n\t\tvar crs = this.options.crs;\r\n\t\treturn crs.scale(toZoom) / crs.scale(this._zoom);\r\n\t},\r\n\r\n\tgetScaleZoom: function (scale) {\r\n\t\treturn this._zoom + (Math.log(scale) / Math.LN2);\r\n\t},\r\n\r\n\r\n\t// conversion methods\r\n\r\n\tproject: function (latlng, zoom) { // (LatLng[, Number]) -> Point\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.latLngToPoint(L.latLng(latlng), zoom);\r\n\t},\r\n\r\n\tunproject: function (point, zoom) { // (Point[, Number]) -> LatLng\r\n\t\tzoom = zoom === undefined ? this._zoom : zoom;\r\n\t\treturn this.options.crs.pointToLatLng(L.point(point), zoom);\r\n\t},\r\n\r\n\tlayerPointToLatLng: function (point) { // (Point)\r\n\t\tvar projectedPoint = L.point(point).add(this.getPixelOrigin());\r\n\t\treturn this.unproject(projectedPoint);\r\n\t},\r\n\r\n\tlatLngToLayerPoint: function (latlng) { // (LatLng)\r\n\t\tvar projectedPoint = this.project(L.latLng(latlng))._round();\r\n\t\treturn projectedPoint._subtract(this.getPixelOrigin());\r\n\t},\r\n\r\n\tcontainerPointToLayerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\tlayerPointToContainerPoint: function (point) { // (Point)\r\n\t\treturn L.point(point).add(this._getMapPanePos());\r\n\t},\r\n\r\n\tcontainerPointToLatLng: function (point) {\r\n\t\tvar layerPoint = this.containerPointToLayerPoint(L.point(point));\r\n\t\treturn this.layerPointToLatLng(layerPoint);\r\n\t},\r\n\r\n\tlatLngToContainerPoint: function (latlng) {\r\n\t\treturn this.layerPointToContainerPoint(this.latLngToLayerPoint(L.latLng(latlng)));\r\n\t},\r\n\r\n\tmouseEventToContainerPoint: function (e) { // (MouseEvent)\r\n\t\treturn L.DomEvent.getMousePosition(e, this._container);\r\n\t},\r\n\r\n\tmouseEventToLayerPoint: function (e) { // (MouseEvent)\r\n\t\treturn this.containerPointToLayerPoint(this.mouseEventToContainerPoint(e));\r\n\t},\r\n\r\n\tmouseEventToLatLng: function (e) { // (MouseEvent)\r\n\t\treturn this.layerPointToLatLng(this.mouseEventToLayerPoint(e));\r\n\t},\r\n\r\n\r\n\t// map initialization methods\r\n\r\n\t_initContainer: function (id) {\r\n\t\tvar container = this._container = L.DomUtil.get(id);\r\n\r\n\t\tif (!container) {\r\n\t\t\tthrow new Error('Map container not found.');\r\n\t\t} else if (container._leaflet) {\r\n\t\t\tthrow new Error('Map container is already initialized.');\r\n\t\t}\r\n\r\n\t\tcontainer._leaflet = true;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar container = this._container;\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-container' +\r\n\t\t\t(L.Browser.touch ? ' leaflet-touch' : '') +\r\n\t\t\t(L.Browser.retina ? ' leaflet-retina' : '') +\r\n\t\t\t(L.Browser.ielt9 ? ' leaflet-oldie' : '') +\r\n\t\t\t(this.options.fadeAnimation ? ' leaflet-fade-anim' : ''));\r\n\r\n\t\tvar position = L.DomUtil.getStyle(container, 'position');\r\n\r\n\t\tif (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {\r\n\t\t\tcontainer.style.position = 'relative';\r\n\t\t}\r\n\r\n\t\tthis._initPanes();\r\n\r\n\t\tif (this._initControlPos) {\r\n\t\t\tthis._initControlPos();\r\n\t\t}\r\n\t},\r\n\r\n\t_initPanes: function () {\r\n\t\tvar panes = this._panes = {};\r\n\r\n\t\tthis._mapPane = panes.mapPane = this._createPane('leaflet-map-pane', this._container);\r\n\r\n\t\tthis._tilePane = panes.tilePane = this._createPane('leaflet-tile-pane', this._mapPane);\r\n\t\tpanes.objectsPane = this._createPane('leaflet-objects-pane', this._mapPane);\r\n\t\tpanes.shadowPane = this._createPane('leaflet-shadow-pane');\r\n\t\tpanes.overlayPane = this._createPane('leaflet-overlay-pane');\r\n\t\tpanes.markerPane = this._createPane('leaflet-marker-pane');\r\n\t\tpanes.popupPane = this._createPane('leaflet-popup-pane');\r\n\r\n\t\tvar zoomHide = ' leaflet-zoom-hide';\r\n\r\n\t\tif (!this.options.markerZoomAnimation) {\r\n\t\t\tL.DomUtil.addClass(panes.markerPane, zoomHide);\r\n\t\t\tL.DomUtil.addClass(panes.shadowPane, zoomHide);\r\n\t\t\tL.DomUtil.addClass(panes.popupPane, zoomHide);\r\n\t\t}\r\n\t},\r\n\r\n\t_createPane: function (className, container) {\r\n\t\treturn L.DomUtil.create('div', className, container || this._panes.objectsPane);\r\n\t},\r\n\r\n\t_clearPanes: function () {\r\n\t\tthis._container.removeChild(this._mapPane);\r\n\t},\r\n\r\n\t_addLayers: function (layers) {\r\n\t\tlayers = layers ? (L.Util.isArray(layers) ? layers : [layers]) : [];\r\n\r\n\t\tfor (var i = 0, len = layers.length; i < len; i++) {\r\n\t\t\tthis.addLayer(layers[i]);\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t// private methods that modify map state\r\n\r\n\t_resetView: function (center, zoom, preserveMapOffset, afterZoomAnim) {\r\n\r\n\t\tvar zoomChanged = (this._zoom !== zoom);\r\n\r\n\t\tif (!afterZoomAnim) {\r\n\t\t\tthis.fire('movestart');\r\n\r\n\t\t\tif (zoomChanged) {\r\n\t\t\t\tthis.fire('zoomstart');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._zoom = zoom;\r\n\t\tthis._initialCenter = center;\r\n\r\n\t\tthis._initialTopLeftPoint = this._getNewTopLeftPoint(center);\r\n\r\n\t\tif (!preserveMapOffset) {\r\n\t\t\tL.DomUtil.setPosition(this._mapPane, new L.Point(0, 0));\r\n\t\t} else {\r\n\t\t\tthis._initialTopLeftPoint._add(this._getMapPanePos());\r\n\t\t}\r\n\r\n\t\tthis._tileLayersToLoad = this._tileLayersNum;\r\n\r\n\t\tvar loading = !this._loaded;\r\n\t\tthis._loaded = true;\r\n\r\n\t\tthis.fire('viewreset', {hard: !preserveMapOffset});\r\n\r\n\t\tif (loading) {\r\n\t\t\tthis.fire('load');\r\n\t\t\tthis.eachLayer(this._layerAdd, this);\r\n\t\t}\r\n\r\n\t\tthis.fire('move');\r\n\r\n\t\tif (zoomChanged || afterZoomAnim) {\r\n\t\t\tthis.fire('zoomend');\r\n\t\t}\r\n\r\n\t\tthis.fire('moveend', {hard: !preserveMapOffset});\r\n\t},\r\n\r\n\t_rawPanBy: function (offset) {\r\n\t\tL.DomUtil.setPosition(this._mapPane, this._getMapPanePos().subtract(offset));\r\n\t},\r\n\r\n\t_getZoomSpan: function () {\r\n\t\treturn this.getMaxZoom() - this.getMinZoom();\r\n\t},\r\n\r\n\t_updateZoomLevels: function () {\r\n\t\tvar i,\r\n\t\t\tminZoom = Infinity,\r\n\t\t\tmaxZoom = -Infinity,\r\n\t\t\toldZoomSpan = this._getZoomSpan();\r\n\r\n\t\tfor (i in this._zoomBoundLayers) {\r\n\t\t\tvar layer = this._zoomBoundLayers[i];\r\n\t\t\tif (!isNaN(layer.options.minZoom)) {\r\n\t\t\t\tminZoom = Math.min(minZoom, layer.options.minZoom);\r\n\t\t\t}\r\n\t\t\tif (!isNaN(layer.options.maxZoom)) {\r\n\t\t\t\tmaxZoom = Math.max(maxZoom, layer.options.maxZoom);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (i === undefined) { // we have no tilelayers\r\n\t\t\tthis._layersMaxZoom = this._layersMinZoom = undefined;\r\n\t\t} else {\r\n\t\t\tthis._layersMaxZoom = maxZoom;\r\n\t\t\tthis._layersMinZoom = minZoom;\r\n\t\t}\r\n\r\n\t\tif (oldZoomSpan !== this._getZoomSpan()) {\r\n\t\t\tthis.fire('zoomlevelschange');\r\n\t\t}\r\n\t},\r\n\r\n\t_panInsideMaxBounds: function () {\r\n\t\tthis.panInsideBounds(this.options.maxBounds);\r\n\t},\r\n\r\n\t_checkIfLoaded: function () {\r\n\t\tif (!this._loaded) {\r\n\t\t\tthrow new Error('Set map center and zoom first.');\r\n\t\t}\r\n\t},\r\n\r\n\t// map events\r\n\r\n\t_initEvents: function (onOff) {\r\n\t\tif (!L.DomEvent) { return; }\r\n\r\n\t\tonOff = onOff || 'on';\r\n\r\n\t\tL.DomEvent[onOff](this._container, 'click', this._onMouseClick, this);\r\n\r\n\t\tvar events = ['dblclick', 'mousedown', 'mouseup', 'mouseenter',\r\n\t\t              'mouseleave', 'mousemove', 'contextmenu'],\r\n\t\t    i, len;\r\n\r\n\t\tfor (i = 0, len = events.length; i < len; i++) {\r\n\t\t\tL.DomEvent[onOff](this._container, events[i], this._fireMouseEvent, this);\r\n\t\t}\r\n\r\n\t\tif (this.options.trackResize) {\r\n\t\t\tL.DomEvent[onOff](window, 'resize', this._onResize, this);\r\n\t\t}\r\n\t},\r\n\r\n\t_onResize: function () {\r\n\t\tL.Util.cancelAnimFrame(this._resizeRequest);\r\n\t\tthis._resizeRequest = L.Util.requestAnimFrame(\r\n\t\t        function () { this.invalidateSize({debounceMoveend: true}); }, this, false, this._container);\r\n\t},\r\n\r\n\t_onMouseClick: function (e) {\r\n\t\tif (!this._loaded || (!e._simulated &&\r\n\t\t        ((this.dragging && this.dragging.moved()) ||\r\n\t\t         (this.boxZoom  && this.boxZoom.moved()))) ||\r\n\t\t            L.DomEvent._skipped(e)) { return; }\r\n\r\n\t\tthis.fire('preclick');\r\n\t\tthis._fireMouseEvent(e);\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\t\tif (!this._loaded || L.DomEvent._skipped(e)) { return; }\r\n\r\n\t\tvar type = e.type;\r\n\r\n\t\ttype = (type === 'mouseenter' ? 'mouseover' : (type === 'mouseleave' ? 'mouseout' : type));\r\n\r\n\t\tif (!this.hasEventListeners(type)) { return; }\r\n\r\n\t\tif (type === 'contextmenu') {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\r\n\t\tvar containerPoint = this.mouseEventToContainerPoint(e),\r\n\t\t    layerPoint = this.containerPointToLayerPoint(containerPoint),\r\n\t\t    latlng = this.layerPointToLatLng(layerPoint);\r\n\r\n\t\tthis.fire(type, {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tlayerPoint: layerPoint,\r\n\t\t\tcontainerPoint: containerPoint,\r\n\t\t\toriginalEvent: e\r\n\t\t});\r\n\t},\r\n\r\n\t_onTileLayerLoad: function () {\r\n\t\tthis._tileLayersToLoad--;\r\n\t\tif (this._tileLayersNum && !this._tileLayersToLoad) {\r\n\t\t\tthis.fire('tilelayersload');\r\n\t\t}\r\n\t},\r\n\r\n\t_clearHandlers: function () {\r\n\t\tfor (var i = 0, len = this._handlers.length; i < len; i++) {\r\n\t\t\tthis._handlers[i].disable();\r\n\t\t}\r\n\t},\r\n\r\n\twhenReady: function (callback, context) {\r\n\t\tif (this._loaded) {\r\n\t\t\tcallback.call(context || this, this);\r\n\t\t} else {\r\n\t\t\tthis.on('load', callback, context);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_layerAdd: function (layer) {\r\n\t\tlayer.onAdd(this);\r\n\t\tthis.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\r\n\t// private methods for getting map state\r\n\r\n\t_getMapPanePos: function () {\r\n\t\treturn L.DomUtil.getPosition(this._mapPane);\r\n\t},\r\n\r\n\t_moved: function () {\r\n\t\tvar pos = this._getMapPanePos();\r\n\t\treturn pos && !pos.equals([0, 0]);\r\n\t},\r\n\r\n\t_getTopLeftPoint: function () {\r\n\t\treturn this.getPixelOrigin().subtract(this._getMapPanePos());\r\n\t},\r\n\r\n\t_getNewTopLeftPoint: function (center, zoom) {\r\n\t\tvar viewHalf = this.getSize()._divideBy(2);\r\n\t\t// TODO round on display, not calculation to increase precision?\r\n\t\treturn this.project(center, zoom)._subtract(viewHalf)._round();\r\n\t},\r\n\r\n\t_latLngToNewLayerPoint: function (latlng, newZoom, newCenter) {\r\n\t\tvar topLeft = this._getNewTopLeftPoint(newCenter, newZoom).add(this._getMapPanePos());\r\n\t\treturn this.project(latlng, newZoom)._subtract(topLeft);\r\n\t},\r\n\r\n\t// layer point of the current center\r\n\t_getCenterLayerPoint: function () {\r\n\t\treturn this.containerPointToLayerPoint(this.getSize()._divideBy(2));\r\n\t},\r\n\r\n\t// offset of the specified place to the current center in pixels\r\n\t_getCenterOffset: function (latlng) {\r\n\t\treturn this.latLngToLayerPoint(latlng).subtract(this._getCenterLayerPoint());\r\n\t},\r\n\r\n\t// adjust center for view to get inside bounds\r\n\t_limitCenter: function (center, zoom, bounds) {\r\n\r\n\t\tif (!bounds) { return center; }\r\n\r\n\t\tvar centerPoint = this.project(center, zoom),\r\n\t\t    viewHalf = this.getSize().divideBy(2),\r\n\t\t    viewBounds = new L.Bounds(centerPoint.subtract(viewHalf), centerPoint.add(viewHalf)),\r\n\t\t    offset = this._getBoundsOffset(viewBounds, bounds, zoom);\r\n\r\n\t\treturn this.unproject(centerPoint.add(offset), zoom);\r\n\t},\r\n\r\n\t// adjust offset for view to get inside bounds\r\n\t_limitOffset: function (offset, bounds) {\r\n\t\tif (!bounds) { return offset; }\r\n\r\n\t\tvar viewBounds = this.getPixelBounds(),\r\n\t\t    newBounds = new L.Bounds(viewBounds.min.add(offset), viewBounds.max.add(offset));\r\n\r\n\t\treturn offset.add(this._getBoundsOffset(newBounds, bounds));\r\n\t},\r\n\r\n\t// returns offset needed for pxBounds to get inside maxBounds at a specified zoom\r\n\t_getBoundsOffset: function (pxBounds, maxBounds, zoom) {\r\n\t\tvar nwOffset = this.project(maxBounds.getNorthWest(), zoom).subtract(pxBounds.min),\r\n\t\t    seOffset = this.project(maxBounds.getSouthEast(), zoom).subtract(pxBounds.max),\r\n\r\n\t\t    dx = this._rebound(nwOffset.x, -seOffset.x),\r\n\t\t    dy = this._rebound(nwOffset.y, -seOffset.y);\r\n\r\n\t\treturn new L.Point(dx, dy);\r\n\t},\r\n\r\n\t_rebound: function (left, right) {\r\n\t\treturn left + right > 0 ?\r\n\t\t\tMath.round(left - right) / 2 :\r\n\t\t\tMath.max(0, Math.ceil(left)) - Math.max(0, Math.floor(right));\r\n\t},\r\n\r\n\t_limitZoom: function (zoom) {\r\n\t\tvar min = this.getMinZoom(),\r\n\t\t    max = this.getMaxZoom();\r\n\r\n\t\treturn Math.max(min, Math.min(max, zoom));\r\n\t}\r\n});\r\n\r\nL.map = function (id, options) {\r\n\treturn new L.Map(id, options);\r\n};\r\n\n\n/*\r\n * Mercator projection that takes into account that the Earth is not a perfect sphere.\r\n * Less popular than spherical mercator; used by projections like EPSG:3395.\r\n */\r\n\r\nL.Projection.Mercator = {\r\n\tMAX_LATITUDE: 85.0840591556,\r\n\r\n\tR_MINOR: 6356752.314245179,\r\n\tR_MAJOR: 6378137,\r\n\r\n\tproject: function (latlng) { // (LatLng) -> Point\r\n\t\tvar d = L.LatLng.DEG_TO_RAD,\r\n\t\t    max = this.MAX_LATITUDE,\r\n\t\t    lat = Math.max(Math.min(max, latlng.lat), -max),\r\n\t\t    r = this.R_MAJOR,\r\n\t\t    r2 = this.R_MINOR,\r\n\t\t    x = latlng.lng * d * r,\r\n\t\t    y = lat * d,\r\n\t\t    tmp = r2 / r,\r\n\t\t    eccent = Math.sqrt(1.0 - tmp * tmp),\r\n\t\t    con = eccent * Math.sin(y);\r\n\r\n\t\tcon = Math.pow((1 - con) / (1 + con), eccent * 0.5);\r\n\r\n\t\tvar ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con;\r\n\t\ty = -r * Math.log(ts);\r\n\r\n\t\treturn new L.Point(x, y);\r\n\t},\r\n\r\n\tunproject: function (point) { // (Point, Boolean) -> LatLng\r\n\t\tvar d = L.LatLng.RAD_TO_DEG,\r\n\t\t    r = this.R_MAJOR,\r\n\t\t    r2 = this.R_MINOR,\r\n\t\t    lng = point.x * d / r,\r\n\t\t    tmp = r2 / r,\r\n\t\t    eccent = Math.sqrt(1 - (tmp * tmp)),\r\n\t\t    ts = Math.exp(- point.y / r),\r\n\t\t    phi = (Math.PI / 2) - 2 * Math.atan(ts),\r\n\t\t    numIter = 15,\r\n\t\t    tol = 1e-7,\r\n\t\t    i = numIter,\r\n\t\t    dphi = 0.1,\r\n\t\t    con;\r\n\r\n\t\twhile ((Math.abs(dphi) > tol) && (--i > 0)) {\r\n\t\t\tcon = eccent * Math.sin(phi);\r\n\t\t\tdphi = (Math.PI / 2) - 2 * Math.atan(ts *\r\n\t\t\t            Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi;\r\n\t\t\tphi += dphi;\r\n\t\t}\r\n\r\n\t\treturn new L.LatLng(phi * d, lng);\r\n\t}\r\n};\r\n\n\n\r\nL.CRS.EPSG3395 = L.extend({}, L.CRS, {\r\n\tcode: 'EPSG:3395',\r\n\r\n\tprojection: L.Projection.Mercator,\r\n\r\n\ttransformation: (function () {\r\n\t\tvar m = L.Projection.Mercator,\r\n\t\t    r = m.R_MAJOR,\r\n\t\t    scale = 0.5 / (Math.PI * r);\r\n\r\n\t\treturn new L.Transformation(scale, 0.5, -scale, 0.5);\r\n\t}())\r\n});\r\n\n\n/*\r\n * L.TileLayer is used for standard xyz-numbered tile layers.\r\n */\r\n\r\nL.TileLayer = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\tminZoom: 0,\r\n\t\tmaxZoom: 18,\r\n\t\ttileSize: 256,\r\n\t\tsubdomains: 'abc',\r\n\t\terrorTileUrl: '',\r\n\t\tattribution: '',\r\n\t\tzoomOffset: 0,\r\n\t\topacity: 1,\r\n\t\t/*\r\n\t\tmaxNativeZoom: null,\r\n\t\tzIndex: null,\r\n\t\ttms: false,\r\n\t\tcontinuousWorld: false,\r\n\t\tnoWrap: false,\r\n\t\tzoomReverse: false,\r\n\t\tdetectRetina: false,\r\n\t\treuseTiles: false,\r\n\t\tbounds: false,\r\n\t\t*/\r\n\t\tunloadInvisibleTiles: L.Browser.mobile,\r\n\t\tupdateWhenIdle: L.Browser.mobile\r\n\t},\r\n\r\n\tinitialize: function (url, options) {\r\n\t\toptions = L.setOptions(this, options);\r\n\r\n\t\t// detecting retina displays, adjusting tileSize and zoom levels\r\n\t\tif (options.detectRetina && L.Browser.retina && options.maxZoom > 0) {\r\n\r\n\t\t\toptions.tileSize = Math.floor(options.tileSize / 2);\r\n\t\t\toptions.zoomOffset++;\r\n\r\n\t\t\tif (options.minZoom > 0) {\r\n\t\t\t\toptions.minZoom--;\r\n\t\t\t}\r\n\t\t\tthis.options.maxZoom--;\r\n\t\t}\r\n\r\n\t\tif (options.bounds) {\r\n\t\t\toptions.bounds = L.latLngBounds(options.bounds);\r\n\t\t}\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar subdomains = this.options.subdomains;\r\n\r\n\t\tif (typeof subdomains === 'string') {\r\n\t\t\tthis.options.subdomains = subdomains.split('');\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\t\tthis._animated = map._zoomAnimated;\r\n\r\n\t\t// create a container div for tiles\r\n\t\tthis._initContainer();\r\n\r\n\t\t// set up events\r\n\t\tmap.on({\r\n\t\t\t'viewreset': this._reset,\r\n\t\t\t'moveend': this._update\r\n\t\t}, this);\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tmap.on({\r\n\t\t\t\t'zoomanim': this._animateZoom,\r\n\t\t\t\t'zoomend': this._endZoomAnim\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\tif (!this.options.updateWhenIdle) {\r\n\t\t\tthis._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this);\r\n\t\t\tmap.on('move', this._limitedUpdate, this);\r\n\t\t}\r\n\r\n\t\tthis._reset();\r\n\t\tthis._update();\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tthis._container.parentNode.removeChild(this._container);\r\n\r\n\t\tmap.off({\r\n\t\t\t'viewreset': this._reset,\r\n\t\t\t'moveend': this._update\r\n\t\t}, this);\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tmap.off({\r\n\t\t\t\t'zoomanim': this._animateZoom,\r\n\t\t\t\t'zoomend': this._endZoomAnim\r\n\t\t\t}, this);\r\n\t\t}\r\n\r\n\t\tif (!this.options.updateWhenIdle) {\r\n\t\t\tmap.off('move', this._limitedUpdate, this);\r\n\t\t}\r\n\r\n\t\tthis._container = null;\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\tbringToFront: function () {\r\n\t\tvar pane = this._map._panes.tilePane;\r\n\r\n\t\tif (this._container) {\r\n\t\t\tpane.appendChild(this._container);\r\n\t\t\tthis._setAutoZIndex(pane, Math.max);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\tvar pane = this._map._panes.tilePane;\r\n\r\n\t\tif (this._container) {\r\n\t\t\tpane.insertBefore(this._container, pane.firstChild);\r\n\t\t\tthis._setAutoZIndex(pane, Math.min);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetAttribution: function () {\r\n\t\treturn this.options.attribution;\r\n\t},\r\n\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetZIndex: function (zIndex) {\r\n\t\tthis.options.zIndex = zIndex;\r\n\t\tthis._updateZIndex();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetUrl: function (url, noRedraw) {\r\n\t\tthis._url = url;\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset({hard: true});\r\n\t\t\tthis._update();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateZIndex: function () {\r\n\t\tif (this._container && this.options.zIndex !== undefined) {\r\n\t\t\tthis._container.style.zIndex = this.options.zIndex;\r\n\t\t}\r\n\t},\r\n\r\n\t_setAutoZIndex: function (pane, compare) {\r\n\r\n\t\tvar layers = pane.children,\r\n\t\t    edgeZIndex = -compare(Infinity, -Infinity), // -Infinity for max, Infinity for min\r\n\t\t    zIndex, i, len;\r\n\r\n\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\r\n\t\t\tif (layers[i] !== this._container) {\r\n\t\t\t\tzIndex = parseInt(layers[i].style.zIndex, 10);\r\n\r\n\t\t\t\tif (!isNaN(zIndex)) {\r\n\t\t\t\t\tedgeZIndex = compare(edgeZIndex, zIndex);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.options.zIndex = this._container.style.zIndex =\r\n\t\t        (isFinite(edgeZIndex) ? edgeZIndex : 0) + compare(1, -1);\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tvar i,\r\n\t\t    tiles = this._tiles;\r\n\r\n\t\tif (L.Browser.ielt9) {\r\n\t\t\tfor (i in tiles) {\r\n\t\t\t\tL.DomUtil.setOpacity(tiles[i], this.options.opacity);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tL.DomUtil.setOpacity(this._container, this.options.opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_initContainer: function () {\r\n\t\tvar tilePane = this._map._panes.tilePane;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._container = L.DomUtil.create('div', 'leaflet-layer');\r\n\r\n\t\t\tthis._updateZIndex();\r\n\r\n\t\t\tif (this._animated) {\r\n\t\t\t\tvar className = 'leaflet-tile-container';\r\n\r\n\t\t\t\tthis._bgBuffer = L.DomUtil.create('div', className, this._container);\r\n\t\t\t\tthis._tileContainer = L.DomUtil.create('div', className, this._container);\r\n\r\n\t\t\t} else {\r\n\t\t\t\tthis._tileContainer = this._container;\r\n\t\t\t}\r\n\r\n\t\t\ttilePane.appendChild(this._container);\r\n\r\n\t\t\tif (this.options.opacity < 1) {\r\n\t\t\t\tthis._updateOpacity();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_reset: function (e) {\r\n\t\tfor (var key in this._tiles) {\r\n\t\t\tthis.fire('tileunload', {tile: this._tiles[key]});\r\n\t\t}\r\n\r\n\t\tthis._tiles = {};\r\n\t\tthis._tilesToLoad = 0;\r\n\r\n\t\tif (this.options.reuseTiles) {\r\n\t\t\tthis._unusedTiles = [];\r\n\t\t}\r\n\r\n\t\tthis._tileContainer.innerHTML = '';\r\n\r\n\t\tif (this._animated && e && e.hard) {\r\n\t\t\tthis._clearBgBuffer();\r\n\t\t}\r\n\r\n\t\tthis._initContainer();\r\n\t},\r\n\r\n\t_getTileSize: function () {\r\n\t\tvar map = this._map,\r\n\t\t    zoom = map.getZoom() + this.options.zoomOffset,\r\n\t\t    zoomN = this.options.maxNativeZoom,\r\n\t\t    tileSize = this.options.tileSize;\r\n\r\n\t\tif (zoomN && zoom > zoomN) {\r\n\t\t\ttileSize = Math.round(map.getZoomScale(zoom) / map.getZoomScale(zoomN) * tileSize);\r\n\t\t}\r\n\r\n\t\treturn tileSize;\r\n\t},\r\n\r\n\t_update: function () {\r\n\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t    bounds = map.getPixelBounds(),\r\n\t\t    zoom = map.getZoom(),\r\n\t\t    tileSize = this._getTileSize();\r\n\r\n\t\tif (zoom > this.options.maxZoom || zoom < this.options.minZoom) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar tileBounds = L.bounds(\r\n\t\t        bounds.min.divideBy(tileSize)._floor(),\r\n\t\t        bounds.max.divideBy(tileSize)._floor());\r\n\r\n\t\tthis._addTilesFromCenterOut(tileBounds);\r\n\r\n\t\tif (this.options.unloadInvisibleTiles || this.options.reuseTiles) {\r\n\t\t\tthis._removeOtherTiles(tileBounds);\r\n\t\t}\r\n\t},\r\n\r\n\t_addTilesFromCenterOut: function (bounds) {\r\n\t\tvar queue = [],\r\n\t\t    center = bounds.getCenter();\r\n\r\n\t\tvar j, i, point;\r\n\r\n\t\tfor (j = bounds.min.y; j <= bounds.max.y; j++) {\r\n\t\t\tfor (i = bounds.min.x; i <= bounds.max.x; i++) {\r\n\t\t\t\tpoint = new L.Point(i, j);\r\n\r\n\t\t\t\tif (this._tileShouldBeLoaded(point)) {\r\n\t\t\t\t\tqueue.push(point);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar tilesToLoad = queue.length;\r\n\r\n\t\tif (tilesToLoad === 0) { return; }\r\n\r\n\t\t// load tiles in order of their distance to center\r\n\t\tqueue.sort(function (a, b) {\r\n\t\t\treturn a.distanceTo(center) - b.distanceTo(center);\r\n\t\t});\r\n\r\n\t\tvar fragment = document.createDocumentFragment();\r\n\r\n\t\t// if its the first batch of tiles to load\r\n\t\tif (!this._tilesToLoad) {\r\n\t\t\tthis.fire('loading');\r\n\t\t}\r\n\r\n\t\tthis._tilesToLoad += tilesToLoad;\r\n\r\n\t\tfor (i = 0; i < tilesToLoad; i++) {\r\n\t\t\tthis._addTile(queue[i], fragment);\r\n\t\t}\r\n\r\n\t\tthis._tileContainer.appendChild(fragment);\r\n\t},\r\n\r\n\t_tileShouldBeLoaded: function (tilePoint) {\r\n\t\tif ((tilePoint.x + ':' + tilePoint.y) in this._tiles) {\r\n\t\t\treturn false; // already loaded\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (!options.continuousWorld) {\r\n\t\t\tvar limit = this._getWrapTileNum();\r\n\r\n\t\t\t// don't load if exceeds world bounds\r\n\t\t\tif ((options.noWrap && (tilePoint.x < 0 || tilePoint.x >= limit.x)) ||\r\n\t\t\t\ttilePoint.y < 0 || tilePoint.y >= limit.y) { return false; }\r\n\t\t}\r\n\r\n\t\tif (options.bounds) {\r\n\t\t\tvar tileSize = this._getTileSize(),\r\n\t\t\t    nwPoint = tilePoint.multiplyBy(tileSize),\r\n\t\t\t    sePoint = nwPoint.add([tileSize, tileSize]),\r\n\t\t\t    nw = this._map.unproject(nwPoint),\r\n\t\t\t    se = this._map.unproject(sePoint);\r\n\r\n\t\t\t// TODO temporary hack, will be removed after refactoring projections\r\n\t\t\t// https://github.com/Leaflet/Leaflet/issues/1618\r\n\t\t\tif (!options.continuousWorld && !options.noWrap) {\r\n\t\t\t\tnw = nw.wrap();\r\n\t\t\t\tse = se.wrap();\r\n\t\t\t}\r\n\r\n\t\t\tif (!options.bounds.intersects([nw, se])) { return false; }\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_removeOtherTiles: function (bounds) {\r\n\t\tvar kArr, x, y, key;\r\n\r\n\t\tfor (key in this._tiles) {\r\n\t\t\tkArr = key.split(':');\r\n\t\t\tx = parseInt(kArr[0], 10);\r\n\t\t\ty = parseInt(kArr[1], 10);\r\n\r\n\t\t\t// remove tile if it's out of bounds\r\n\t\t\tif (x < bounds.min.x || x > bounds.max.x || y < bounds.min.y || y > bounds.max.y) {\r\n\t\t\t\tthis._removeTile(key);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_removeTile: function (key) {\r\n\t\tvar tile = this._tiles[key];\r\n\r\n\t\tthis.fire('tileunload', {tile: tile, url: tile.src});\r\n\r\n\t\tif (this.options.reuseTiles) {\r\n\t\t\tL.DomUtil.removeClass(tile, 'leaflet-tile-loaded');\r\n\t\t\tthis._unusedTiles.push(tile);\r\n\r\n\t\t} else if (tile.parentNode === this._tileContainer) {\r\n\t\t\tthis._tileContainer.removeChild(tile);\r\n\t\t}\r\n\r\n\t\t// for https://github.com/CloudMade/Leaflet/issues/137\r\n\t\tif (!L.Browser.android) {\r\n\t\t\ttile.onload = null;\r\n\t\t\ttile.src = L.Util.emptyImageUrl;\r\n\t\t}\r\n\r\n\t\tdelete this._tiles[key];\r\n\t},\r\n\r\n\t_addTile: function (tilePoint, container) {\r\n\t\tvar tilePos = this._getTilePos(tilePoint);\r\n\r\n\t\t// get unused tile - or create a new tile\r\n\t\tvar tile = this._getTile();\r\n\r\n\t\t/*\r\n\t\tChrome 20 layouts much faster with top/left (verify with timeline, frames)\r\n\t\tAndroid 4 browser has display issues with top/left and requires transform instead\r\n\t\t(other browsers don't currently care) - see debug/hacks/jitter.html for an example\r\n\t\t*/\r\n\t\tL.DomUtil.setPosition(tile, tilePos, L.Browser.chrome);\r\n\r\n\t\tthis._tiles[tilePoint.x + ':' + tilePoint.y] = tile;\r\n\r\n\t\tthis._loadTile(tile, tilePoint);\r\n\r\n\t\tif (tile.parentNode !== this._tileContainer) {\r\n\t\t\tcontainer.appendChild(tile);\r\n\t\t}\r\n\t},\r\n\r\n\t_getZoomForUrl: function () {\r\n\r\n\t\tvar options = this.options,\r\n\t\t    zoom = this._map.getZoom();\r\n\r\n\t\tif (options.zoomReverse) {\r\n\t\t\tzoom = options.maxZoom - zoom;\r\n\t\t}\r\n\r\n\t\tzoom += options.zoomOffset;\r\n\r\n\t\treturn options.maxNativeZoom ? Math.min(zoom, options.maxNativeZoom) : zoom;\r\n\t},\r\n\r\n\t_getTilePos: function (tilePoint) {\r\n\t\tvar origin = this._map.getPixelOrigin(),\r\n\t\t    tileSize = this._getTileSize();\r\n\r\n\t\treturn tilePoint.multiplyBy(tileSize).subtract(origin);\r\n\t},\r\n\r\n\t// image-specific code (override to implement e.g. Canvas or SVG tile layer)\r\n\r\n\tgetTileUrl: function (tilePoint) {\r\n\t\treturn L.Util.template(this._url, L.extend({\r\n\t\t\ts: this._getSubdomain(tilePoint),\r\n\t\t\tz: tilePoint.z,\r\n\t\t\tx: tilePoint.x,\r\n\t\t\ty: tilePoint.y\r\n\t\t}, this.options));\r\n\t},\r\n\r\n\t_getWrapTileNum: function () {\r\n\t\tvar crs = this._map.options.crs,\r\n\t\t    size = crs.getSize(this._map.getZoom());\r\n\t\treturn size.divideBy(this._getTileSize())._floor();\r\n\t},\r\n\r\n\t_adjustTilePoint: function (tilePoint) {\r\n\r\n\t\tvar limit = this._getWrapTileNum();\r\n\r\n\t\t// wrap tile coordinates\r\n\t\tif (!this.options.continuousWorld && !this.options.noWrap) {\r\n\t\t\ttilePoint.x = ((tilePoint.x % limit.x) + limit.x) % limit.x;\r\n\t\t}\r\n\r\n\t\tif (this.options.tms) {\r\n\t\t\ttilePoint.y = limit.y - tilePoint.y - 1;\r\n\t\t}\r\n\r\n\t\ttilePoint.z = this._getZoomForUrl();\r\n\t},\r\n\r\n\t_getSubdomain: function (tilePoint) {\r\n\t\tvar index = Math.abs(tilePoint.x + tilePoint.y) % this.options.subdomains.length;\r\n\t\treturn this.options.subdomains[index];\r\n\t},\r\n\r\n\t_getTile: function () {\r\n\t\tif (this.options.reuseTiles && this._unusedTiles.length > 0) {\r\n\t\t\tvar tile = this._unusedTiles.pop();\r\n\t\t\tthis._resetTile(tile);\r\n\t\t\treturn tile;\r\n\t\t}\r\n\t\treturn this._createTile();\r\n\t},\r\n\r\n\t// Override if data stored on a tile needs to be cleaned up before reuse\r\n\t_resetTile: function (/*tile*/) {},\r\n\r\n\t_createTile: function () {\r\n\t\tvar tile = L.DomUtil.create('img', 'leaflet-tile');\r\n\t\ttile.style.width = tile.style.height = this._getTileSize() + 'px';\r\n\t\ttile.galleryimg = 'no';\r\n\r\n\t\ttile.onselectstart = tile.onmousemove = L.Util.falseFn;\r\n\r\n\t\tif (L.Browser.ielt9 && this.options.opacity !== undefined) {\r\n\t\t\tL.DomUtil.setOpacity(tile, this.options.opacity);\r\n\t\t}\r\n\t\t// without this hack, tiles disappear after zoom on Chrome for Android\r\n\t\t// https://github.com/Leaflet/Leaflet/issues/2078\r\n\t\tif (L.Browser.mobileWebkit3d) {\r\n\t\t\ttile.style.WebkitBackfaceVisibility = 'hidden';\r\n\t\t}\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t_loadTile: function (tile, tilePoint) {\r\n\t\ttile._layer  = this;\r\n\t\ttile.onload  = this._tileOnLoad;\r\n\t\ttile.onerror = this._tileOnError;\r\n\r\n\t\tthis._adjustTilePoint(tilePoint);\r\n\t\ttile.src     = this.getTileUrl(tilePoint);\r\n\r\n\t\tthis.fire('tileloadstart', {\r\n\t\t\ttile: tile,\r\n\t\t\turl: tile.src\r\n\t\t});\r\n\t},\r\n\r\n\t_tileLoaded: function () {\r\n\t\tthis._tilesToLoad--;\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tL.DomUtil.addClass(this._tileContainer, 'leaflet-zoom-animated');\r\n\t\t}\r\n\r\n\t\tif (!this._tilesToLoad) {\r\n\t\t\tthis.fire('load');\r\n\r\n\t\t\tif (this._animated) {\r\n\t\t\t\t// clear scaled tiles after all new tiles are loaded (for performance)\r\n\t\t\t\tclearTimeout(this._clearBgBufferTimer);\r\n\t\t\t\tthis._clearBgBufferTimer = setTimeout(L.bind(this._clearBgBuffer, this), 500);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_tileOnLoad: function () {\r\n\t\tvar layer = this._layer;\r\n\r\n\t\t//Only if we are loading an actual image\r\n\t\tif (this.src !== L.Util.emptyImageUrl) {\r\n\t\t\tL.DomUtil.addClass(this, 'leaflet-tile-loaded');\r\n\r\n\t\t\tlayer.fire('tileload', {\r\n\t\t\t\ttile: this,\r\n\t\t\t\turl: this.src\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tlayer._tileLoaded();\r\n\t},\r\n\r\n\t_tileOnError: function () {\r\n\t\tvar layer = this._layer;\r\n\r\n\t\tlayer.fire('tileerror', {\r\n\t\t\ttile: this,\r\n\t\t\turl: this.src\r\n\t\t});\r\n\r\n\t\tvar newUrl = layer.options.errorTileUrl;\r\n\t\tif (newUrl) {\r\n\t\t\tthis.src = newUrl;\r\n\t\t}\r\n\r\n\t\tlayer._tileLoaded();\r\n\t}\r\n});\r\n\r\nL.tileLayer = function (url, options) {\r\n\treturn new L.TileLayer(url, options);\r\n};\r\n\n\n/*\r\n * L.TileLayer.WMS is used for putting WMS tile layers on the map.\r\n */\r\n\r\nL.TileLayer.WMS = L.TileLayer.extend({\r\n\r\n\tdefaultWmsParams: {\r\n\t\tservice: 'WMS',\r\n\t\trequest: 'GetMap',\r\n\t\tversion: '1.1.1',\r\n\t\tlayers: '',\r\n\t\tstyles: '',\r\n\t\tformat: 'image/jpeg',\r\n\t\ttransparent: false\r\n\t},\r\n\r\n\tinitialize: function (url, options) { // (String, Object)\r\n\r\n\t\tthis._url = url;\r\n\r\n\t\tvar wmsParams = L.extend({}, this.defaultWmsParams),\r\n\t\t    tileSize = options.tileSize || this.options.tileSize;\r\n\r\n\t\tif (options.detectRetina && L.Browser.retina) {\r\n\t\t\twmsParams.width = wmsParams.height = tileSize * 2;\r\n\t\t} else {\r\n\t\t\twmsParams.width = wmsParams.height = tileSize;\r\n\t\t}\r\n\r\n\t\tfor (var i in options) {\r\n\t\t\t// all keys that are not TileLayer options go to WMS params\r\n\t\t\tif (!this.options.hasOwnProperty(i) && i !== 'crs') {\r\n\t\t\t\twmsParams[i] = options[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.wmsParams = wmsParams;\r\n\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\r\n\t\tthis._crs = this.options.crs || map.options.crs;\r\n\r\n\t\tthis._wmsVersion = parseFloat(this.wmsParams.version);\r\n\r\n\t\tvar projectionKey = this._wmsVersion >= 1.3 ? 'crs' : 'srs';\r\n\t\tthis.wmsParams[projectionKey] = this._crs.code;\r\n\r\n\t\tL.TileLayer.prototype.onAdd.call(this, map);\r\n\t},\r\n\r\n\tgetTileUrl: function (tilePoint) { // (Point, Number) -> String\r\n\r\n\t\tvar map = this._map,\r\n\t\t    tileSize = this.options.tileSize,\r\n\r\n\t\t    nwPoint = tilePoint.multiplyBy(tileSize),\r\n\t\t    sePoint = nwPoint.add([tileSize, tileSize]),\r\n\r\n\t\t    nw = this._crs.project(map.unproject(nwPoint, tilePoint.z)),\r\n\t\t    se = this._crs.project(map.unproject(sePoint, tilePoint.z)),\r\n\t\t    bbox = this._wmsVersion >= 1.3 && this._crs === L.CRS.EPSG4326 ?\r\n\t\t        [se.y, nw.x, nw.y, se.x].join(',') :\r\n\t\t        [nw.x, se.y, se.x, nw.y].join(','),\r\n\r\n\t\t    url = L.Util.template(this._url, {s: this._getSubdomain(tilePoint)});\r\n\r\n\t\treturn url + L.Util.getParamString(this.wmsParams, url, true) + '&BBOX=' + bbox;\r\n\t},\r\n\r\n\tsetParams: function (params, noRedraw) {\r\n\r\n\t\tL.extend(this.wmsParams, params);\r\n\r\n\t\tif (!noRedraw) {\r\n\t\t\tthis.redraw();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\nL.tileLayer.wms = function (url, options) {\r\n\treturn new L.TileLayer.WMS(url, options);\r\n};\r\n\n\n/*\r\n * L.TileLayer.Canvas is a class that you can use as a base for creating\r\n * dynamically drawn Canvas-based tile layers.\r\n */\r\n\r\nL.TileLayer.Canvas = L.TileLayer.extend({\r\n\toptions: {\r\n\t\tasync: false\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._reset({hard: true});\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tfor (var i in this._tiles) {\r\n\t\t\tthis._redrawTile(this._tiles[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_redrawTile: function (tile) {\r\n\t\tthis.drawTile(tile, tile._tilePoint, this._map._zoom);\r\n\t},\r\n\r\n\t_createTile: function () {\r\n\t\tvar tile = L.DomUtil.create('canvas', 'leaflet-tile');\r\n\t\ttile.width = tile.height = this.options.tileSize;\r\n\t\ttile.onselectstart = tile.onmousemove = L.Util.falseFn;\r\n\t\treturn tile;\r\n\t},\r\n\r\n\t_loadTile: function (tile, tilePoint) {\r\n\t\ttile._layer = this;\r\n\t\ttile._tilePoint = tilePoint;\r\n\r\n\t\tthis._redrawTile(tile);\r\n\r\n\t\tif (!this.options.async) {\r\n\t\t\tthis.tileDrawn(tile);\r\n\t\t}\r\n\t},\r\n\r\n\tdrawTile: function (/*tile, tilePoint*/) {\r\n\t\t// override with rendering code\r\n\t},\r\n\r\n\ttileDrawn: function (tile) {\r\n\t\tthis._tileOnLoad.call(tile);\r\n\t}\r\n});\r\n\r\n\r\nL.tileLayer.canvas = function (options) {\r\n\treturn new L.TileLayer.Canvas(options);\r\n};\r\n\n\n/*\r\n * L.ImageOverlay is used to overlay images over the map (to specific geographical bounds).\r\n */\r\n\r\nL.ImageOverlay = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\topacity: 1\r\n\t},\r\n\r\n\tinitialize: function (url, bounds, options) { // (String, LatLngBounds, Object)\r\n\t\tthis._url = url;\r\n\t\tthis._bounds = L.latLngBounds(bounds);\r\n\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tif (!this._image) {\r\n\t\t\tthis._initImage();\r\n\t\t}\r\n\r\n\t\tmap._panes.overlayPane.appendChild(this._image);\r\n\r\n\t\tmap.on('viewreset', this._reset, this);\r\n\r\n\t\tif (map.options.zoomAnimation && L.Browser.any3d) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\r\n\t\tthis._reset();\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.getPanes().overlayPane.removeChild(this._image);\r\n\r\n\t\tmap.off('viewreset', this._reset, this);\r\n\r\n\t\tif (map.options.zoomAnimation) {\r\n\t\t\tmap.off('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tthis._updateOpacity();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t// TODO remove bringToFront/bringToBack duplication from TileLayer/Path\r\n\tbringToFront: function () {\r\n\t\tif (this._image) {\r\n\t\t\tthis._map._panes.overlayPane.appendChild(this._image);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\tvar pane = this._map._panes.overlayPane;\r\n\t\tif (this._image) {\r\n\t\t\tpane.insertBefore(this._image, pane.firstChild);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetUrl: function (url) {\r\n\t\tthis._url = url;\r\n\t\tthis._image.src = this._url;\r\n\t},\r\n\r\n\tgetAttribution: function () {\r\n\t\treturn this.options.attribution;\r\n\t},\r\n\r\n\t_initImage: function () {\r\n\t\tthis._image = L.DomUtil.create('img', 'leaflet-image-layer');\r\n\r\n\t\tif (this._map.options.zoomAnimation && L.Browser.any3d) {\r\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-zoom-animated');\r\n\t\t} else {\r\n\t\t\tL.DomUtil.addClass(this._image, 'leaflet-zoom-hide');\r\n\t\t}\r\n\r\n\t\tthis._updateOpacity();\r\n\r\n\t\t//TODO createImage util method to remove duplication\r\n\t\tL.extend(this._image, {\r\n\t\t\tgalleryimg: 'no',\r\n\t\t\tonselectstart: L.Util.falseFn,\r\n\t\t\tonmousemove: L.Util.falseFn,\r\n\t\t\tonload: L.bind(this._onImageLoad, this),\r\n\t\t\tsrc: this._url\r\n\t\t});\r\n\t},\r\n\r\n\t_animateZoom: function (e) {\r\n\t\tvar map = this._map,\r\n\t\t    image = this._image,\r\n\t\t    scale = map.getZoomScale(e.zoom),\r\n\t\t    nw = this._bounds.getNorthWest(),\r\n\t\t    se = this._bounds.getSouthEast(),\r\n\r\n\t\t    topLeft = map._latLngToNewLayerPoint(nw, e.zoom, e.center),\r\n\t\t    size = map._latLngToNewLayerPoint(se, e.zoom, e.center)._subtract(topLeft),\r\n\t\t    origin = topLeft._add(size._multiplyBy((1 / 2) * (1 - 1 / scale)));\r\n\r\n\t\timage.style[L.DomUtil.TRANSFORM] =\r\n\t\t        L.DomUtil.getTranslateString(origin) + ' scale(' + scale + ') ';\r\n\t},\r\n\r\n\t_reset: function () {\r\n\t\tvar image   = this._image,\r\n\t\t    topLeft = this._map.latLngToLayerPoint(this._bounds.getNorthWest()),\r\n\t\t    size = this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(topLeft);\r\n\r\n\t\tL.DomUtil.setPosition(image, topLeft);\r\n\r\n\t\timage.style.width  = size.x + 'px';\r\n\t\timage.style.height = size.y + 'px';\r\n\t},\r\n\r\n\t_onImageLoad: function () {\r\n\t\tthis.fire('load');\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tL.DomUtil.setOpacity(this._image, this.options.opacity);\r\n\t}\r\n});\r\n\r\nL.imageOverlay = function (url, bounds, options) {\r\n\treturn new L.ImageOverlay(url, bounds, options);\r\n};\r\n\n\n/*\r\n * L.Icon is an image-based icon class that you can use with L.Marker for custom markers.\r\n */\r\n\r\nL.Icon = L.Class.extend({\r\n\toptions: {\r\n\t\t/*\r\n\t\ticonUrl: (String) (required)\r\n\t\ticonRetinaUrl: (String) (optional, used for retina devices if detected)\r\n\t\ticonSize: (Point) (can be set through CSS)\r\n\t\ticonAnchor: (Point) (centered by default, can be set in CSS with negative margins)\r\n\t\tpopupAnchor: (Point) (if not specified, popup opens in the anchor point)\r\n\t\tshadowUrl: (String) (no shadow by default)\r\n\t\tshadowRetinaUrl: (String) (optional, used for retina devices if detected)\r\n\t\tshadowSize: (Point)\r\n\t\tshadowAnchor: (Point)\r\n\t\t*/\r\n\t\tclassName: ''\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tcreateIcon: function (oldIcon) {\r\n\t\treturn this._createIcon('icon', oldIcon);\r\n\t},\r\n\r\n\tcreateShadow: function (oldIcon) {\r\n\t\treturn this._createIcon('shadow', oldIcon);\r\n\t},\r\n\r\n\t_createIcon: function (name, oldIcon) {\r\n\t\tvar src = this._getIconUrl(name);\r\n\r\n\t\tif (!src) {\r\n\t\t\tif (name === 'icon') {\r\n\t\t\t\tthrow new Error('iconUrl not set in Icon options (see the docs).');\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar img;\r\n\t\tif (!oldIcon || oldIcon.tagName !== 'IMG') {\r\n\t\t\timg = this._createImg(src);\r\n\t\t} else {\r\n\t\t\timg = this._createImg(src, oldIcon);\r\n\t\t}\r\n\t\tthis._setIconStyles(img, name);\r\n\r\n\t\treturn img;\r\n\t},\r\n\r\n\t_setIconStyles: function (img, name) {\r\n\t\tvar options = this.options,\r\n\t\t    size = L.point(options[name + 'Size']),\r\n\t\t    anchor;\r\n\r\n\t\tif (name === 'shadow') {\r\n\t\t\tanchor = L.point(options.shadowAnchor || options.iconAnchor);\r\n\t\t} else {\r\n\t\t\tanchor = L.point(options.iconAnchor);\r\n\t\t}\r\n\r\n\t\tif (!anchor && size) {\r\n\t\t\tanchor = size.divideBy(2, true);\r\n\t\t}\r\n\r\n\t\timg.className = 'leaflet-marker-' + name + ' ' + options.className;\r\n\r\n\t\tif (anchor) {\r\n\t\t\timg.style.marginLeft = (-anchor.x) + 'px';\r\n\t\t\timg.style.marginTop  = (-anchor.y) + 'px';\r\n\t\t}\r\n\r\n\t\tif (size) {\r\n\t\t\timg.style.width  = size.x + 'px';\r\n\t\t\timg.style.height = size.y + 'px';\r\n\t\t}\r\n\t},\r\n\r\n\t_createImg: function (src, el) {\r\n\t\tel = el || document.createElement('img');\r\n\t\tel.src = src;\r\n\t\treturn el;\r\n\t},\r\n\r\n\t_getIconUrl: function (name) {\r\n\t\tif (L.Browser.retina && this.options[name + 'RetinaUrl']) {\r\n\t\t\treturn this.options[name + 'RetinaUrl'];\r\n\t\t}\r\n\t\treturn this.options[name + 'Url'];\r\n\t}\r\n});\r\n\r\nL.icon = function (options) {\r\n\treturn new L.Icon(options);\r\n};\r\n\n\n/*\n * L.Icon.Default is the blue marker icon used by default in Leaflet.\n */\n\nL.Icon.Default = L.Icon.extend({\n\n\toptions: {\n\t\ticonSize: [25, 41],\n\t\ticonAnchor: [12, 41],\n\t\tpopupAnchor: [1, -34],\n\n\t\tshadowSize: [41, 41]\n\t},\n\n\t_getIconUrl: function (name) {\n\t\tvar key = name + 'Url';\n\n\t\tif (this.options[key]) {\n\t\t\treturn this.options[key];\n\t\t}\n\n\t\tif (L.Browser.retina && name === 'icon') {\n\t\t\tname += '-2x';\n\t\t}\n\n\t\tvar path = L.Icon.Default.imagePath;\n\n\t\tif (!path) {\n\t\t\tthrow new Error('Couldn\\'t autodetect L.Icon.Default.imagePath, set it manually.');\n\t\t}\n\n\t\treturn path + '/marker-' + name + '.png';\n\t}\n});\n\nL.Icon.Default.imagePath = (function () {\n\tvar scripts = document.getElementsByTagName('script'),\n\t    leafletRe = /[\\/^]leaflet[\\-\\._]?([\\w\\-\\._]*)\\.js\\??/;\n\n\tvar i, len, src, matches, path;\n\n\tfor (i = 0, len = scripts.length; i < len; i++) {\n\t\tsrc = scripts[i].src;\n\t\tmatches = src.match(leafletRe);\n\n\t\tif (matches) {\n\t\t\tpath = src.split(leafletRe)[0];\n\t\t\treturn (path ? path + '/' : '') + 'images';\n\t\t}\n\t}\n}());\n\n\n/*\r\n * L.Marker is used to display clickable/draggable icons on the map.\r\n */\r\n\r\nL.Marker = L.Class.extend({\r\n\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\ticon: new L.Icon.Default(),\r\n\t\ttitle: '',\r\n\t\talt: '',\r\n\t\tclickable: true,\r\n\t\tdraggable: false,\r\n\t\tkeyboard: true,\r\n\t\tzIndexOffset: 0,\r\n\t\topacity: 1,\r\n\t\triseOnHover: false,\r\n\t\triseOffset: 250\r\n\t},\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tL.setOptions(this, options);\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tmap.on('viewreset', this.update, this);\r\n\r\n\t\tthis._initIcon();\r\n\t\tthis.update();\r\n\t\tthis.fire('add');\r\n\r\n\t\tif (map.options.zoomAnimation && map.options.markerZoomAnimation) {\r\n\t\t\tmap.on('zoomanim', this._animateZoom, this);\r\n\t\t}\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tif (this.dragging) {\r\n\t\t\tthis.dragging.disable();\r\n\t\t}\r\n\r\n\t\tthis._removeIcon();\r\n\t\tthis._removeShadow();\r\n\r\n\t\tthis.fire('remove');\r\n\r\n\t\tmap.off({\r\n\t\t\t'viewreset': this.update,\r\n\t\t\t'zoomanim': this._animateZoom\r\n\t\t}, this);\r\n\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\r\n\t\tthis.update();\r\n\r\n\t\treturn this.fire('move', { latlng: this._latlng });\r\n\t},\r\n\r\n\tsetZIndexOffset: function (offset) {\r\n\t\tthis.options.zIndexOffset = offset;\r\n\t\tthis.update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetIcon: function (icon) {\r\n\r\n\t\tthis.options.icon = icon;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._initIcon();\r\n\t\t\tthis.update();\r\n\t\t}\r\n\r\n\t\tif (this._popup) {\r\n\t\t\tthis.bindPopup(this._popup);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\t\tif (this._icon) {\r\n\t\t\tthis._setPos(this._map.latLngToLayerPoint(this._latlng).round());\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initIcon: function () {\r\n\t\tvar options = this.options,\r\n\t\t    map = this._map,\r\n\t\t    animation = (map.options.zoomAnimation && map.options.markerZoomAnimation),\r\n\t\t    classToAdd = animation ? 'leaflet-zoom-animated' : 'leaflet-zoom-hide';\r\n\r\n\t\tvar icon = options.icon.createIcon(this._icon),\r\n\t\t\taddIcon = false;\r\n\r\n\t\t// if we're not reusing the icon, remove the old one and init new one\r\n\t\tif (icon !== this._icon) {\r\n\t\t\tif (this._icon) {\r\n\t\t\t\tthis._removeIcon();\r\n\t\t\t}\r\n\t\t\taddIcon = true;\r\n\r\n\t\t\tif (options.title) {\r\n\t\t\t\ticon.title = options.title;\r\n\t\t\t}\r\n\r\n\t\t\tif (options.alt) {\r\n\t\t\t\ticon.alt = options.alt;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tL.DomUtil.addClass(icon, classToAdd);\r\n\r\n\t\tif (options.keyboard) {\r\n\t\t\ticon.tabIndex = '0';\r\n\t\t}\r\n\r\n\t\tthis._icon = icon;\r\n\r\n\t\tthis._initInteraction();\r\n\r\n\t\tif (options.riseOnHover) {\r\n\t\t\tL.DomEvent\r\n\t\t\t\t.on(icon, 'mouseover', this._bringToFront, this)\r\n\t\t\t\t.on(icon, 'mouseout', this._resetZIndex, this);\r\n\t\t}\r\n\r\n\t\tvar newShadow = options.icon.createShadow(this._shadow),\r\n\t\t\taddShadow = false;\r\n\r\n\t\tif (newShadow !== this._shadow) {\r\n\t\t\tthis._removeShadow();\r\n\t\t\taddShadow = true;\r\n\t\t}\r\n\r\n\t\tif (newShadow) {\r\n\t\t\tL.DomUtil.addClass(newShadow, classToAdd);\r\n\t\t}\r\n\t\tthis._shadow = newShadow;\r\n\r\n\r\n\t\tif (options.opacity < 1) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\r\n\t\tvar panes = this._map._panes;\r\n\r\n\t\tif (addIcon) {\r\n\t\t\tpanes.markerPane.appendChild(this._icon);\r\n\t\t}\r\n\r\n\t\tif (newShadow && addShadow) {\r\n\t\t\tpanes.shadowPane.appendChild(this._shadow);\r\n\t\t}\r\n\t},\r\n\r\n\t_removeIcon: function () {\r\n\t\tif (this.options.riseOnHover) {\r\n\t\t\tL.DomEvent\r\n\t\t\t    .off(this._icon, 'mouseover', this._bringToFront)\r\n\t\t\t    .off(this._icon, 'mouseout', this._resetZIndex);\r\n\t\t}\r\n\r\n\t\tthis._map._panes.markerPane.removeChild(this._icon);\r\n\r\n\t\tthis._icon = null;\r\n\t},\r\n\r\n\t_removeShadow: function () {\r\n\t\tif (this._shadow) {\r\n\t\t\tthis._map._panes.shadowPane.removeChild(this._shadow);\r\n\t\t}\r\n\t\tthis._shadow = null;\r\n\t},\r\n\r\n\t_setPos: function (pos) {\r\n\t\tL.DomUtil.setPosition(this._icon, pos);\r\n\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setPosition(this._shadow, pos);\r\n\t\t}\r\n\r\n\t\tthis._zIndex = pos.y + this.options.zIndexOffset;\r\n\r\n\t\tthis._resetZIndex();\r\n\t},\r\n\r\n\t_updateZIndex: function (offset) {\r\n\t\tthis._icon.style.zIndex = this._zIndex + offset;\r\n\t},\r\n\r\n\t_animateZoom: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center).round();\r\n\r\n\t\tthis._setPos(pos);\r\n\t},\r\n\r\n\t_initInteraction: function () {\r\n\r\n\t\tif (!this.options.clickable) { return; }\r\n\r\n\t\t// TODO refactor into something shared with Map/Path/etc. to DRY it up\r\n\r\n\t\tvar icon = this._icon,\r\n\t\t    events = ['dblclick', 'mousedown', 'mouseover', 'mouseout', 'contextmenu'];\r\n\r\n\t\tL.DomUtil.addClass(icon, 'leaflet-clickable');\r\n\t\tL.DomEvent.on(icon, 'click', this._onMouseClick, this);\r\n\t\tL.DomEvent.on(icon, 'keypress', this._onKeyPress, this);\r\n\r\n\t\tfor (var i = 0; i < events.length; i++) {\r\n\t\t\tL.DomEvent.on(icon, events[i], this._fireMouseEvent, this);\r\n\t\t}\r\n\r\n\t\tif (L.Handler.MarkerDrag) {\r\n\t\t\tthis.dragging = new L.Handler.MarkerDrag(this);\r\n\r\n\t\t\tif (this.options.draggable) {\r\n\t\t\t\tthis.dragging.enable();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_onMouseClick: function (e) {\r\n\t\tvar wasDragged = this.dragging && this.dragging.moved();\r\n\r\n\t\tif (this.hasEventListeners(e.type) || wasDragged) {\r\n\t\t\tL.DomEvent.stopPropagation(e);\r\n\t\t}\r\n\r\n\t\tif (wasDragged) { return; }\r\n\r\n\t\tif ((!this.dragging || !this.dragging._enabled) && this._map.dragging && this._map.dragging.moved()) { return; }\r\n\r\n\t\tthis.fire(e.type, {\r\n\t\t\toriginalEvent: e,\r\n\t\t\tlatlng: this._latlng\r\n\t\t});\r\n\t},\r\n\r\n\t_onKeyPress: function (e) {\r\n\t\tif (e.keyCode === 13) {\r\n\t\t\tthis.fire('click', {\r\n\t\t\t\toriginalEvent: e,\r\n\t\t\t\tlatlng: this._latlng\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\r\n\t\tthis.fire(e.type, {\r\n\t\t\toriginalEvent: e,\r\n\t\t\tlatlng: this._latlng\r\n\t\t});\r\n\r\n\t\t// TODO proper custom event propagation\r\n\t\t// this line will always be called if marker is in a FeatureGroup\r\n\t\tif (e.type === 'contextmenu' && this.hasEventListeners(e.type)) {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\t\tif (e.type !== 'mousedown') {\r\n\t\t\tL.DomEvent.stopPropagation(e);\r\n\t\t} else {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\t},\r\n\r\n\tsetOpacity: function (opacity) {\r\n\t\tthis.options.opacity = opacity;\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateOpacity();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_updateOpacity: function () {\r\n\t\tL.DomUtil.setOpacity(this._icon, this.options.opacity);\r\n\t\tif (this._shadow) {\r\n\t\t\tL.DomUtil.setOpacity(this._shadow, this.options.opacity);\r\n\t\t}\r\n\t},\r\n\r\n\t_bringToFront: function () {\r\n\t\tthis._updateZIndex(this.options.riseOffset);\r\n\t},\r\n\r\n\t_resetZIndex: function () {\r\n\t\tthis._updateZIndex(0);\r\n\t}\r\n});\r\n\r\nL.marker = function (latlng, options) {\r\n\treturn new L.Marker(latlng, options);\r\n};\r\n\n\n/*\n * L.DivIcon is a lightweight HTML-based icon class (as opposed to the image-based L.Icon)\n * to use with L.Marker.\n */\n\nL.DivIcon = L.Icon.extend({\n\toptions: {\n\t\ticonSize: [12, 12], // also can be set through CSS\n\t\t/*\n\t\ticonAnchor: (Point)\n\t\tpopupAnchor: (Point)\n\t\thtml: (String)\n\t\tbgPos: (Point)\n\t\t*/\n\t\tclassName: 'leaflet-div-icon',\n\t\thtml: false\n\t},\n\n\tcreateIcon: function (oldIcon) {\n\t\tvar div = (oldIcon && oldIcon.tagName === 'DIV') ? oldIcon : document.createElement('div'),\n\t\t    options = this.options;\n\n\t\tif (options.html !== false) {\n\t\t\tdiv.innerHTML = options.html;\n\t\t} else {\n\t\t\tdiv.innerHTML = '';\n\t\t}\n\n\t\tif (options.bgPos) {\n\t\t\tdiv.style.backgroundPosition =\n\t\t\t        (-options.bgPos.x) + 'px ' + (-options.bgPos.y) + 'px';\n\t\t}\n\n\t\tthis._setIconStyles(div, 'icon');\n\t\treturn div;\n\t},\n\n\tcreateShadow: function () {\n\t\treturn null;\n\t}\n});\n\nL.divIcon = function (options) {\n\treturn new L.DivIcon(options);\n};\n\n\n/*\r\n * L.Popup is used for displaying popups on the map.\r\n */\r\n\r\nL.Map.mergeOptions({\r\n\tclosePopupOnClick: true\r\n});\r\n\r\nL.Popup = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\toptions: {\r\n\t\tminWidth: 50,\r\n\t\tmaxWidth: 300,\r\n\t\t// maxHeight: null,\r\n\t\tautoPan: true,\r\n\t\tcloseButton: true,\r\n\t\toffset: [0, 7],\r\n\t\tautoPanPadding: [5, 5],\r\n\t\t// autoPanPaddingTopLeft: null,\r\n\t\t// autoPanPaddingBottomRight: null,\r\n\t\tkeepInView: false,\r\n\t\tclassName: '',\r\n\t\tzoomAnimation: true\r\n\t},\r\n\r\n\tinitialize: function (options, source) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._source = source;\r\n\t\tthis._animated = L.Browser.any3d && this.options.zoomAnimation;\r\n\t\tthis._isOpen = false;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initLayout();\r\n\t\t}\r\n\r\n\t\tvar animFade = map.options.fadeAnimation;\r\n\r\n\t\tif (animFade) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\t\tmap._panes.popupPane.appendChild(this._container);\r\n\r\n\t\tmap.on(this._getEvents(), this);\r\n\r\n\t\tthis.update();\r\n\r\n\t\tif (animFade) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 1);\r\n\t\t}\r\n\r\n\t\tthis.fire('open');\r\n\r\n\t\tmap.fire('popupopen', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\tthis._source.fire('popupopen', {popup: this});\r\n\t\t}\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\topenOn: function (map) {\r\n\t\tmap.openPopup(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap._panes.popupPane.removeChild(this._container);\r\n\r\n\t\tL.Util.falseFn(this._container.offsetWidth); // force reflow\r\n\r\n\t\tmap.off(this._getEvents(), this);\r\n\r\n\t\tif (map.options.fadeAnimation) {\r\n\t\t\tL.DomUtil.setOpacity(this._container, 0);\r\n\t\t}\r\n\r\n\t\tthis._map = null;\r\n\r\n\t\tthis.fire('close');\r\n\r\n\t\tmap.fire('popupclose', {popup: this});\r\n\r\n\t\tif (this._source) {\r\n\t\t\tthis._source.fire('popupclose', {popup: this});\r\n\t\t}\r\n\t},\r\n\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tif (this._map) {\r\n\t\t\tthis._updatePosition();\r\n\t\t\tthis._adjustPan();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetContent: function () {\r\n\t\treturn this._content;\r\n\t},\r\n\r\n\tsetContent: function (content) {\r\n\t\tthis._content = content;\r\n\t\tthis.update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tupdate: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._container.style.visibility = 'hidden';\r\n\r\n\t\tthis._updateContent();\r\n\t\tthis._updateLayout();\r\n\t\tthis._updatePosition();\r\n\r\n\t\tthis._container.style.visibility = '';\r\n\r\n\t\tthis._adjustPan();\r\n\t},\r\n\r\n\t_getEvents: function () {\r\n\t\tvar events = {\r\n\t\t\tviewreset: this._updatePosition\r\n\t\t};\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tevents.zoomanim = this._zoomAnimation;\r\n\t\t}\r\n\t\tif ('closeOnClick' in this.options ? this.options.closeOnClick : this._map.options.closePopupOnClick) {\r\n\t\t\tevents.preclick = this._close;\r\n\t\t}\r\n\t\tif (this.options.keepInView) {\r\n\t\t\tevents.moveend = this._adjustPan;\r\n\t\t}\r\n\r\n\t\treturn events;\r\n\t},\r\n\r\n\t_close: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.closePopup(this);\r\n\t\t}\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar prefix = 'leaflet-popup',\r\n\t\t\tcontainerClass = prefix + ' ' + this.options.className + ' leaflet-zoom-' +\r\n\t\t\t        (this._animated ? 'animated' : 'hide'),\r\n\t\t\tcontainer = this._container = L.DomUtil.create('div', containerClass),\r\n\t\t\tcloseButton;\r\n\r\n\t\tif (this.options.closeButton) {\r\n\t\t\tcloseButton = this._closeButton =\r\n\t\t\t        L.DomUtil.create('a', prefix + '-close-button', container);\r\n\t\t\tcloseButton.href = '#close';\r\n\t\t\tcloseButton.innerHTML = '&#215;';\r\n\t\t\tL.DomEvent.disableClickPropagation(closeButton);\r\n\r\n\t\t\tL.DomEvent.on(closeButton, 'click', this._onCloseButtonClick, this);\r\n\t\t}\r\n\r\n\t\tvar wrapper = this._wrapper =\r\n\t\t        L.DomUtil.create('div', prefix + '-content-wrapper', container);\r\n\t\tL.DomEvent.disableClickPropagation(wrapper);\r\n\r\n\t\tthis._contentNode = L.DomUtil.create('div', prefix + '-content', wrapper);\r\n\r\n\t\tL.DomEvent.disableScrollPropagation(this._contentNode);\r\n\t\tL.DomEvent.on(wrapper, 'contextmenu', L.DomEvent.stopPropagation);\r\n\r\n\t\tthis._tipContainer = L.DomUtil.create('div', prefix + '-tip-container', container);\r\n\t\tthis._tip = L.DomUtil.create('div', prefix + '-tip', this._tipContainer);\r\n\t},\r\n\r\n\t_updateContent: function () {\r\n\t\tif (!this._content) { return; }\r\n\r\n\t\tif (typeof this._content === 'string') {\r\n\t\t\tthis._contentNode.innerHTML = this._content;\r\n\t\t} else {\r\n\t\t\twhile (this._contentNode.hasChildNodes()) {\r\n\t\t\t\tthis._contentNode.removeChild(this._contentNode.firstChild);\r\n\t\t\t}\r\n\t\t\tthis._contentNode.appendChild(this._content);\r\n\t\t}\r\n\t\tthis.fire('contentupdate');\r\n\t},\r\n\r\n\t_updateLayout: function () {\r\n\t\tvar container = this._contentNode,\r\n\t\t    style = container.style;\r\n\r\n\t\tstyle.width = '';\r\n\t\tstyle.whiteSpace = 'nowrap';\r\n\r\n\t\tvar width = container.offsetWidth;\r\n\t\twidth = Math.min(width, this.options.maxWidth);\r\n\t\twidth = Math.max(width, this.options.minWidth);\r\n\r\n\t\tstyle.width = (width + 1) + 'px';\r\n\t\tstyle.whiteSpace = '';\r\n\r\n\t\tstyle.height = '';\r\n\r\n\t\tvar height = container.offsetHeight,\r\n\t\t    maxHeight = this.options.maxHeight,\r\n\t\t    scrolledClass = 'leaflet-popup-scrolled';\r\n\r\n\t\tif (maxHeight && height > maxHeight) {\r\n\t\t\tstyle.height = maxHeight + 'px';\r\n\t\t\tL.DomUtil.addClass(container, scrolledClass);\r\n\t\t} else {\r\n\t\t\tL.DomUtil.removeClass(container, scrolledClass);\r\n\t\t}\r\n\r\n\t\tthis._containerWidth = this._container.offsetWidth;\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar pos = this._map.latLngToLayerPoint(this._latlng),\r\n\t\t    animated = this._animated,\r\n\t\t    offset = L.point(this.options.offset);\r\n\r\n\t\tif (animated) {\r\n\t\t\tL.DomUtil.setPosition(this._container, pos);\r\n\t\t}\r\n\r\n\t\tthis._containerBottom = -offset.y - (animated ? 0 : pos.y);\r\n\t\tthis._containerLeft = -Math.round(this._containerWidth / 2) + offset.x + (animated ? 0 : pos.x);\r\n\r\n\t\t// bottom position the popup in case the height of the popup changes (images loading etc)\r\n\t\tthis._container.style.bottom = this._containerBottom + 'px';\r\n\t\tthis._container.style.left = this._containerLeft + 'px';\r\n\t},\r\n\r\n\t_zoomAnimation: function (opt) {\r\n\t\tvar pos = this._map._latLngToNewLayerPoint(this._latlng, opt.zoom, opt.center);\r\n\r\n\t\tL.DomUtil.setPosition(this._container, pos);\r\n\t},\r\n\r\n\t_adjustPan: function () {\r\n\t\tif (!this.options.autoPan) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t    containerHeight = this._container.offsetHeight,\r\n\t\t    containerWidth = this._containerWidth,\r\n\r\n\t\t    layerPos = new L.Point(this._containerLeft, -containerHeight - this._containerBottom);\r\n\r\n\t\tif (this._animated) {\r\n\t\t\tlayerPos._add(L.DomUtil.getPosition(this._container));\r\n\t\t}\r\n\r\n\t\tvar containerPos = map.layerPointToContainerPoint(layerPos),\r\n\t\t    padding = L.point(this.options.autoPanPadding),\r\n\t\t    paddingTL = L.point(this.options.autoPanPaddingTopLeft || padding),\r\n\t\t    paddingBR = L.point(this.options.autoPanPaddingBottomRight || padding),\r\n\t\t    size = map.getSize(),\r\n\t\t    dx = 0,\r\n\t\t    dy = 0;\r\n\r\n\t\tif (containerPos.x + containerWidth + paddingBR.x > size.x) { // right\r\n\t\t\tdx = containerPos.x + containerWidth - size.x + paddingBR.x;\r\n\t\t}\r\n\t\tif (containerPos.x - dx - paddingTL.x < 0) { // left\r\n\t\t\tdx = containerPos.x - paddingTL.x;\r\n\t\t}\r\n\t\tif (containerPos.y + containerHeight + paddingBR.y > size.y) { // bottom\r\n\t\t\tdy = containerPos.y + containerHeight - size.y + paddingBR.y;\r\n\t\t}\r\n\t\tif (containerPos.y - dy - paddingTL.y < 0) { // top\r\n\t\t\tdy = containerPos.y - paddingTL.y;\r\n\t\t}\r\n\r\n\t\tif (dx || dy) {\r\n\t\t\tmap\r\n\t\t\t    .fire('autopanstart')\r\n\t\t\t    .panBy([dx, dy]);\r\n\t\t}\r\n\t},\r\n\r\n\t_onCloseButtonClick: function (e) {\r\n\t\tthis._close();\r\n\t\tL.DomEvent.stop(e);\r\n\t}\r\n});\r\n\r\nL.popup = function (options, source) {\r\n\treturn new L.Popup(options, source);\r\n};\r\n\r\n\r\nL.Map.include({\r\n\topenPopup: function (popup, latlng, options) { // (Popup) or (String || HTMLElement, LatLng[, Object])\r\n\t\tthis.closePopup();\r\n\r\n\t\tif (!(popup instanceof L.Popup)) {\r\n\t\t\tvar content = popup;\r\n\r\n\t\t\tpopup = new L.Popup(options)\r\n\t\t\t    .setLatLng(latlng)\r\n\t\t\t    .setContent(content);\r\n\t\t}\r\n\t\tpopup._isOpen = true;\r\n\r\n\t\tthis._popup = popup;\r\n\t\treturn this.addLayer(popup);\r\n\t},\r\n\r\n\tclosePopup: function (popup) {\r\n\t\tif (!popup || popup === this._popup) {\r\n\t\t\tpopup = this._popup;\r\n\t\t\tthis._popup = null;\r\n\t\t}\r\n\t\tif (popup) {\r\n\t\t\tthis.removeLayer(popup);\r\n\t\t\tpopup._isOpen = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\n\n/*\r\n * Popup extension to L.Marker, adding popup-related methods.\r\n */\r\n\r\nL.Marker.include({\r\n\topenPopup: function () {\r\n\t\tif (this._popup && this._map && !this._map.hasLayer(this._popup)) {\r\n\t\t\tthis._popup.setLatLng(this._latlng);\r\n\t\t\tthis._map.openPopup(this._popup);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclosePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup._close();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\ttogglePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tif (this._popup._isOpen) {\r\n\t\t\t\tthis.closePopup();\r\n\t\t\t} else {\r\n\t\t\t\tthis.openPopup();\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbindPopup: function (content, options) {\r\n\t\tvar anchor = L.point(this.options.icon.options.popupAnchor || [0, 0]);\r\n\r\n\t\tanchor = anchor.add(L.Popup.prototype.options.offset);\r\n\r\n\t\tif (options && options.offset) {\r\n\t\t\tanchor = anchor.add(options.offset);\r\n\t\t}\r\n\r\n\t\toptions = L.extend({offset: anchor}, options);\r\n\r\n\t\tif (!this._popupHandlersAdded) {\r\n\t\t\tthis\r\n\t\t\t    .on('click', this.togglePopup, this)\r\n\t\t\t    .on('remove', this.closePopup, this)\r\n\t\t\t    .on('move', this._movePopup, this);\r\n\t\t\tthis._popupHandlersAdded = true;\r\n\t\t}\r\n\r\n\t\tif (content instanceof L.Popup) {\r\n\t\t\tL.setOptions(content, options);\r\n\t\t\tthis._popup = content;\r\n\t\t\tcontent._source = this;\r\n\t\t} else {\r\n\t\t\tthis._popup = new L.Popup(options, this)\r\n\t\t\t\t.setContent(content);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetPopupContent: function (content) {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tunbindPopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup = null;\r\n\t\t\tthis\r\n\t\t\t    .off('click', this.togglePopup, this)\r\n\t\t\t    .off('remove', this.closePopup, this)\r\n\t\t\t    .off('move', this._movePopup, this);\r\n\t\t\tthis._popupHandlersAdded = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetPopup: function () {\r\n\t\treturn this._popup;\r\n\t},\r\n\r\n\t_movePopup: function (e) {\r\n\t\tthis._popup.setLatLng(e.latlng);\r\n\t}\r\n});\r\n\n\n/*\r\n * L.LayerGroup is a class to combine several layers into one so that\r\n * you can manipulate the group (e.g. add/remove it) as one layer.\r\n */\r\n\r\nL.LayerGroup = L.Class.extend({\r\n\tinitialize: function (layers) {\r\n\t\tthis._layers = {};\r\n\r\n\t\tvar i, len;\r\n\r\n\t\tif (layers) {\r\n\t\t\tfor (i = 0, len = layers.length; i < len; i++) {\r\n\t\t\t\tthis.addLayer(layers[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\taddLayer: function (layer) {\r\n\t\tvar id = this.getLayerId(layer);\r\n\r\n\t\tthis._layers[id] = layer;\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.addLayer(layer);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = layer in this._layers ? layer : this.getLayerId(layer);\r\n\r\n\t\tif (this._map && this._layers[id]) {\r\n\t\t\tthis._map.removeLayer(this._layers[id]);\r\n\t\t}\r\n\r\n\t\tdelete this._layers[id];\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\thasLayer: function (layer) {\r\n\t\tif (!layer) { return false; }\r\n\r\n\t\treturn (layer in this._layers || this.getLayerId(layer) in this._layers);\r\n\t},\r\n\r\n\tclearLayers: function () {\r\n\t\tthis.eachLayer(this.removeLayer, this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tinvoke: function (methodName) {\r\n\t\tvar args = Array.prototype.slice.call(arguments, 1),\r\n\t\t    i, layer;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tlayer = this._layers[i];\r\n\r\n\t\t\tif (layer[methodName]) {\r\n\t\t\t\tlayer[methodName].apply(layer, args);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\t\tthis.eachLayer(map.addLayer, map);\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tthis.eachLayer(map.removeLayer, map);\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\teachLayer: function (method, context) {\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tmethod.call(context, this._layers[i]);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetLayer: function (id) {\r\n\t\treturn this._layers[id];\r\n\t},\r\n\r\n\tgetLayers: function () {\r\n\t\tvar layers = [];\r\n\r\n\t\tfor (var i in this._layers) {\r\n\t\t\tlayers.push(this._layers[i]);\r\n\t\t}\r\n\t\treturn layers;\r\n\t},\r\n\r\n\tsetZIndex: function (zIndex) {\r\n\t\treturn this.invoke('setZIndex', zIndex);\r\n\t},\r\n\r\n\tgetLayerId: function (layer) {\r\n\t\treturn L.stamp(layer);\r\n\t}\r\n});\r\n\r\nL.layerGroup = function (layers) {\r\n\treturn new L.LayerGroup(layers);\r\n};\r\n\n\n/*\r\n * L.FeatureGroup extends L.LayerGroup by introducing mouse events and additional methods\r\n * shared between a group of interactive layers (like vectors or markers).\r\n */\r\n\r\nL.FeatureGroup = L.LayerGroup.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\tstatics: {\r\n\t\tEVENTS: 'click dblclick mouseover mouseout mousemove contextmenu popupopen popupclose'\r\n\t},\r\n\r\n\taddLayer: function (layer) {\r\n\t\tif (this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif ('on' in layer) {\r\n\t\t\tlayer.on(L.FeatureGroup.EVENTS, this._propagateEvent, this);\r\n\t\t}\r\n\r\n\t\tL.LayerGroup.prototype.addLayer.call(this, layer);\r\n\r\n\t\tif (this._popupContent && layer.bindPopup) {\r\n\t\t\tlayer.bindPopup(this._popupContent, this._popupOptions);\r\n\t\t}\r\n\r\n\t\treturn this.fire('layeradd', {layer: layer});\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tif (!this.hasLayer(layer)) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif (layer in this._layers) {\r\n\t\t\tlayer = this._layers[layer];\r\n\t\t}\r\n\r\n\t\tif ('off' in layer) {\r\n\t\t\tlayer.off(L.FeatureGroup.EVENTS, this._propagateEvent, this);\r\n\t\t}\r\n\r\n\t\tL.LayerGroup.prototype.removeLayer.call(this, layer);\r\n\r\n\t\tif (this._popupContent) {\r\n\t\t\tthis.invoke('unbindPopup');\r\n\t\t}\r\n\r\n\t\treturn this.fire('layerremove', {layer: layer});\r\n\t},\r\n\r\n\tbindPopup: function (content, options) {\r\n\t\tthis._popupContent = content;\r\n\t\tthis._popupOptions = options;\r\n\t\treturn this.invoke('bindPopup', content, options);\r\n\t},\r\n\r\n\topenPopup: function (latlng) {\r\n\t\t// open popup on the first layer\r\n\t\tfor (var id in this._layers) {\r\n\t\t\tthis._layers[id].openPopup(latlng);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\treturn this.invoke('setStyle', style);\r\n\t},\r\n\r\n\tbringToFront: function () {\r\n\t\treturn this.invoke('bringToFront');\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\treturn this.invoke('bringToBack');\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\tvar bounds = new L.LatLngBounds();\r\n\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tbounds.extend(layer instanceof L.Marker ? layer.getLatLng() : layer.getBounds());\r\n\t\t});\r\n\r\n\t\treturn bounds;\r\n\t},\r\n\r\n\t_propagateEvent: function (e) {\r\n\t\te = L.extend({\r\n\t\t\tlayer: e.target,\r\n\t\t\ttarget: this\r\n\t\t}, e);\r\n\t\tthis.fire(e.type, e);\r\n\t}\r\n});\r\n\r\nL.featureGroup = function (layers) {\r\n\treturn new L.FeatureGroup(layers);\r\n};\r\n\n\n/*\r\n * L.Path is a base class for rendering vector paths on a map. Inherited by Polyline, Circle, etc.\r\n */\r\n\r\nL.Path = L.Class.extend({\r\n\tincludes: [L.Mixin.Events],\r\n\r\n\tstatics: {\r\n\t\t// how much to extend the clip area around the map view\r\n\t\t// (relative to its size, e.g. 0.5 is half the screen in each direction)\r\n\t\t// set it so that SVG element doesn't exceed 1280px (vectors flicker on dragend if it is)\r\n\t\tCLIP_PADDING: (function () {\r\n\t\t\tvar max = L.Browser.mobile ? 1280 : 2000,\r\n\t\t\t    target = (max / Math.max(window.outerWidth, window.outerHeight) - 1) / 2;\r\n\t\t\treturn Math.max(0, Math.min(0.5, target));\r\n\t\t})()\r\n\t},\r\n\r\n\toptions: {\r\n\t\tstroke: true,\r\n\t\tcolor: '#0033ff',\r\n\t\tdashArray: null,\r\n\t\tlineCap: null,\r\n\t\tlineJoin: null,\r\n\t\tweight: 5,\r\n\t\topacity: 0.5,\r\n\r\n\t\tfill: false,\r\n\t\tfillColor: null, //same as color by default\r\n\t\tfillOpacity: 0.2,\r\n\r\n\t\tclickable: true\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tif (!this._container) {\r\n\t\t\tthis._initElements();\r\n\t\t\tthis._initEvents();\r\n\t\t}\r\n\r\n\t\tthis.projectLatlngs();\r\n\t\tthis._updatePath();\r\n\r\n\t\tif (this._container) {\r\n\t\t\tthis._map._pathRoot.appendChild(this._container);\r\n\t\t}\r\n\r\n\t\tthis.fire('add');\r\n\r\n\t\tmap.on({\r\n\t\t\t'viewreset': this.projectLatlngs,\r\n\t\t\t'moveend': this._updatePath\r\n\t\t}, this);\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tmap.addLayer(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap._pathRoot.removeChild(this._container);\r\n\r\n\t\t// Need to fire remove event before we set _map to null as the event hooks might need the object\r\n\t\tthis.fire('remove');\r\n\t\tthis._map = null;\r\n\r\n\t\tif (L.Browser.vml) {\r\n\t\t\tthis._container = null;\r\n\t\t\tthis._stroke = null;\r\n\t\t\tthis._fill = null;\r\n\t\t}\r\n\r\n\t\tmap.off({\r\n\t\t\t'viewreset': this.projectLatlngs,\r\n\t\t\t'moveend': this._updatePath\r\n\t\t}, this);\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\t// do all projection stuff here\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\tL.setOptions(this, style);\r\n\r\n\t\tif (this._container) {\r\n\t\t\tthis._updateStyle();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis.projectLatlngs();\r\n\t\t\tthis._updatePath();\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\nL.Map.include({\r\n\t_updatePathViewport: function () {\r\n\t\tvar p = L.Path.CLIP_PADDING,\r\n\t\t    size = this.getSize(),\r\n\t\t    panePos = L.DomUtil.getPosition(this._mapPane),\r\n\t\t    min = panePos.multiplyBy(-1)._subtract(size.multiplyBy(p)._round()),\r\n\t\t    max = min.add(size.multiplyBy(1 + p * 2)._round());\r\n\r\n\t\tthis._pathViewport = new L.Bounds(min, max);\r\n\t}\r\n});\r\n\n\n/*\r\n * Extends L.Path with SVG-specific rendering code.\r\n */\r\n\r\nL.Path.SVG_NS = 'http://www.w3.org/2000/svg';\r\n\r\nL.Browser.svg = !!(document.createElementNS && document.createElementNS(L.Path.SVG_NS, 'svg').createSVGRect);\r\n\r\nL.Path = L.Path.extend({\r\n\tstatics: {\r\n\t\tSVG: L.Browser.svg\r\n\t},\r\n\r\n\tbringToFront: function () {\r\n\t\tvar root = this._map._pathRoot,\r\n\t\t    path = this._container;\r\n\r\n\t\tif (path && root.lastChild !== path) {\r\n\t\t\troot.appendChild(path);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tbringToBack: function () {\r\n\t\tvar root = this._map._pathRoot,\r\n\t\t    path = this._container,\r\n\t\t    first = root.firstChild;\r\n\r\n\t\tif (path && first !== path) {\r\n\t\t\troot.insertBefore(path, first);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetPathString: function () {\r\n\t\t// form path string here\r\n\t},\r\n\r\n\t_createElement: function (name) {\r\n\t\treturn document.createElementNS(L.Path.SVG_NS, name);\r\n\t},\r\n\r\n\t_initElements: function () {\r\n\t\tthis._map._initPathRoot();\r\n\t\tthis._initPath();\r\n\t\tthis._initStyle();\r\n\t},\r\n\r\n\t_initPath: function () {\r\n\t\tthis._container = this._createElement('g');\r\n\r\n\t\tthis._path = this._createElement('path');\r\n\r\n\t\tif (this.options.className) {\r\n\t\t\tL.DomUtil.addClass(this._path, this.options.className);\r\n\t\t}\r\n\r\n\t\tthis._container.appendChild(this._path);\r\n\t},\r\n\r\n\t_initStyle: function () {\r\n\t\tif (this.options.stroke) {\r\n\t\t\tthis._path.setAttribute('stroke-linejoin', 'round');\r\n\t\t\tthis._path.setAttribute('stroke-linecap', 'round');\r\n\t\t}\r\n\t\tif (this.options.fill) {\r\n\t\t\tthis._path.setAttribute('fill-rule', 'evenodd');\r\n\t\t}\r\n\t\tif (this.options.pointerEvents) {\r\n\t\t\tthis._path.setAttribute('pointer-events', this.options.pointerEvents);\r\n\t\t}\r\n\t\tif (!this.options.clickable && !this.options.pointerEvents) {\r\n\t\t\tthis._path.setAttribute('pointer-events', 'none');\r\n\t\t}\r\n\t\tthis._updateStyle();\r\n\t},\r\n\r\n\t_updateStyle: function () {\r\n\t\tif (this.options.stroke) {\r\n\t\t\tthis._path.setAttribute('stroke', this.options.color);\r\n\t\t\tthis._path.setAttribute('stroke-opacity', this.options.opacity);\r\n\t\t\tthis._path.setAttribute('stroke-width', this.options.weight);\r\n\t\t\tif (this.options.dashArray) {\r\n\t\t\t\tthis._path.setAttribute('stroke-dasharray', this.options.dashArray);\r\n\t\t\t} else {\r\n\t\t\t\tthis._path.removeAttribute('stroke-dasharray');\r\n\t\t\t}\r\n\t\t\tif (this.options.lineCap) {\r\n\t\t\t\tthis._path.setAttribute('stroke-linecap', this.options.lineCap);\r\n\t\t\t}\r\n\t\t\tif (this.options.lineJoin) {\r\n\t\t\t\tthis._path.setAttribute('stroke-linejoin', this.options.lineJoin);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis._path.setAttribute('stroke', 'none');\r\n\t\t}\r\n\t\tif (this.options.fill) {\r\n\t\t\tthis._path.setAttribute('fill', this.options.fillColor || this.options.color);\r\n\t\t\tthis._path.setAttribute('fill-opacity', this.options.fillOpacity);\r\n\t\t} else {\r\n\t\t\tthis._path.setAttribute('fill', 'none');\r\n\t\t}\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tvar str = this.getPathString();\r\n\t\tif (!str) {\r\n\t\t\t// fix webkit empty string parsing bug\r\n\t\t\tstr = 'M0 0';\r\n\t\t}\r\n\t\tthis._path.setAttribute('d', str);\r\n\t},\r\n\r\n\t// TODO remove duplication with L.Map\r\n\t_initEvents: function () {\r\n\t\tif (this.options.clickable) {\r\n\t\t\tif (L.Browser.svg || !L.Browser.vml) {\r\n\t\t\t\tL.DomUtil.addClass(this._path, 'leaflet-clickable');\r\n\t\t\t}\r\n\r\n\t\t\tL.DomEvent.on(this._container, 'click', this._onMouseClick, this);\r\n\r\n\t\t\tvar events = ['dblclick', 'mousedown', 'mouseover',\r\n\t\t\t              'mouseout', 'mousemove', 'contextmenu'];\r\n\t\t\tfor (var i = 0; i < events.length; i++) {\r\n\t\t\t\tL.DomEvent.on(this._container, events[i], this._fireMouseEvent, this);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_onMouseClick: function (e) {\r\n\t\tif (this._map.dragging && this._map.dragging.moved()) { return; }\r\n\r\n\t\tthis._fireMouseEvent(e);\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\t\tif (!this._map || !this.hasEventListeners(e.type)) { return; }\r\n\r\n\t\tvar map = this._map,\r\n\t\t    containerPoint = map.mouseEventToContainerPoint(e),\r\n\t\t    layerPoint = map.containerPointToLayerPoint(containerPoint),\r\n\t\t    latlng = map.layerPointToLatLng(layerPoint);\r\n\r\n\t\tthis.fire(e.type, {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tlayerPoint: layerPoint,\r\n\t\t\tcontainerPoint: containerPoint,\r\n\t\t\toriginalEvent: e\r\n\t\t});\r\n\r\n\t\tif (e.type === 'contextmenu') {\r\n\t\t\tL.DomEvent.preventDefault(e);\r\n\t\t}\r\n\t\tif (e.type !== 'mousemove') {\r\n\t\t\tL.DomEvent.stopPropagation(e);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.include({\r\n\t_initPathRoot: function () {\r\n\t\tif (!this._pathRoot) {\r\n\t\t\tthis._pathRoot = L.Path.prototype._createElement('svg');\r\n\t\t\tthis._panes.overlayPane.appendChild(this._pathRoot);\r\n\r\n\t\t\tif (this.options.zoomAnimation && L.Browser.any3d) {\r\n\t\t\t\tL.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-animated');\r\n\r\n\t\t\t\tthis.on({\r\n\t\t\t\t\t'zoomanim': this._animatePathZoom,\r\n\t\t\t\t\t'zoomend': this._endPathZoom\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tL.DomUtil.addClass(this._pathRoot, 'leaflet-zoom-hide');\r\n\t\t\t}\r\n\r\n\t\t\tthis.on('moveend', this._updateSvgViewport);\r\n\t\t\tthis._updateSvgViewport();\r\n\t\t}\r\n\t},\r\n\r\n\t_animatePathZoom: function (e) {\r\n\t\tvar scale = this.getZoomScale(e.zoom),\r\n\t\t    offset = this._getCenterOffset(e.center)._multiplyBy(-scale)._add(this._pathViewport.min);\r\n\r\n\t\tthis._pathRoot.style[L.DomUtil.TRANSFORM] =\r\n\t\t        L.DomUtil.getTranslateString(offset) + ' scale(' + scale + ') ';\r\n\r\n\t\tthis._pathZooming = true;\r\n\t},\r\n\r\n\t_endPathZoom: function () {\r\n\t\tthis._pathZooming = false;\r\n\t},\r\n\r\n\t_updateSvgViewport: function () {\r\n\r\n\t\tif (this._pathZooming) {\r\n\t\t\t// Do not update SVGs while a zoom animation is going on otherwise the animation will break.\r\n\t\t\t// When the zoom animation ends we will be updated again anyway\r\n\t\t\t// This fixes the case where you do a momentum move and zoom while the move is still ongoing.\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._updatePathViewport();\r\n\r\n\t\tvar vp = this._pathViewport,\r\n\t\t    min = vp.min,\r\n\t\t    max = vp.max,\r\n\t\t    width = max.x - min.x,\r\n\t\t    height = max.y - min.y,\r\n\t\t    root = this._pathRoot,\r\n\t\t    pane = this._panes.overlayPane;\r\n\r\n\t\t// Hack to make flicker on drag end on mobile webkit less irritating\r\n\t\tif (L.Browser.mobileWebkit) {\r\n\t\t\tpane.removeChild(root);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.setPosition(root, min);\r\n\t\troot.setAttribute('width', width);\r\n\t\troot.setAttribute('height', height);\r\n\t\troot.setAttribute('viewBox', [min.x, min.y, width, height].join(' '));\r\n\r\n\t\tif (L.Browser.mobileWebkit) {\r\n\t\t\tpane.appendChild(root);\r\n\t\t}\r\n\t}\r\n});\r\n\n\n/*\r\n * Popup extension to L.Path (polylines, polygons, circles), adding popup-related methods.\r\n */\r\n\r\nL.Path.include({\r\n\r\n\tbindPopup: function (content, options) {\r\n\r\n\t\tif (content instanceof L.Popup) {\r\n\t\t\tthis._popup = content;\r\n\t\t} else {\r\n\t\t\tif (!this._popup || options) {\r\n\t\t\t\tthis._popup = new L.Popup(options, this);\r\n\t\t\t}\r\n\t\t\tthis._popup.setContent(content);\r\n\t\t}\r\n\r\n\t\tif (!this._popupHandlersAdded) {\r\n\t\t\tthis\r\n\t\t\t    .on('click', this._openPopup, this)\r\n\t\t\t    .on('remove', this.closePopup, this);\r\n\r\n\t\t\tthis._popupHandlersAdded = true;\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tunbindPopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup = null;\r\n\t\t\tthis\r\n\t\t\t    .off('click', this._openPopup)\r\n\t\t\t    .off('remove', this.closePopup);\r\n\r\n\t\t\tthis._popupHandlersAdded = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\topenPopup: function (latlng) {\r\n\r\n\t\tif (this._popup) {\r\n\t\t\t// open the popup from one of the path's points if not specified\r\n\t\t\tlatlng = latlng || this._latlng ||\r\n\t\t\t         this._latlngs[Math.floor(this._latlngs.length / 2)];\r\n\r\n\t\t\tthis._openPopup({latlng: latlng});\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclosePopup: function () {\r\n\t\tif (this._popup) {\r\n\t\t\tthis._popup._close();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_openPopup: function (e) {\r\n\t\tthis._popup.setLatLng(e.latlng);\r\n\t\tthis._map.openPopup(this._popup);\r\n\t}\r\n});\r\n\n\n/*\r\n * Vector rendering for IE6-8 through VML.\r\n * Thanks to Dmitry Baranovsky and his Raphael library for inspiration!\r\n */\r\n\r\nL.Browser.vml = !L.Browser.svg && (function () {\r\n\ttry {\r\n\t\tvar div = document.createElement('div');\r\n\t\tdiv.innerHTML = '<v:shape adj=\"1\"/>';\r\n\r\n\t\tvar shape = div.firstChild;\r\n\t\tshape.style.behavior = 'url(#default#VML)';\r\n\r\n\t\treturn shape && (typeof shape.adj === 'object');\r\n\r\n\t} catch (e) {\r\n\t\treturn false;\r\n\t}\r\n}());\r\n\r\nL.Path = L.Browser.svg || !L.Browser.vml ? L.Path : L.Path.extend({\r\n\tstatics: {\r\n\t\tVML: true,\r\n\t\tCLIP_PADDING: 0.02\r\n\t},\r\n\r\n\t_createElement: (function () {\r\n\t\ttry {\r\n\t\t\tdocument.namespaces.add('lvml', 'urn:schemas-microsoft-com:vml');\r\n\t\t\treturn function (name) {\r\n\t\t\t\treturn document.createElement('<lvml:' + name + ' class=\"lvml\">');\r\n\t\t\t};\r\n\t\t} catch (e) {\r\n\t\t\treturn function (name) {\r\n\t\t\t\treturn document.createElement(\r\n\t\t\t\t        '<' + name + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"lvml\">');\r\n\t\t\t};\r\n\t\t}\r\n\t}()),\r\n\r\n\t_initPath: function () {\r\n\t\tvar container = this._container = this._createElement('shape');\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-vml-shape' +\r\n\t\t\t(this.options.className ? ' ' + this.options.className : ''));\r\n\r\n\t\tif (this.options.clickable) {\r\n\t\t\tL.DomUtil.addClass(container, 'leaflet-clickable');\r\n\t\t}\r\n\r\n\t\tcontainer.coordsize = '1 1';\r\n\r\n\t\tthis._path = this._createElement('path');\r\n\t\tcontainer.appendChild(this._path);\r\n\r\n\t\tthis._map._pathRoot.appendChild(container);\r\n\t},\r\n\r\n\t_initStyle: function () {\r\n\t\tthis._updateStyle();\r\n\t},\r\n\r\n\t_updateStyle: function () {\r\n\t\tvar stroke = this._stroke,\r\n\t\t    fill = this._fill,\r\n\t\t    options = this.options,\r\n\t\t    container = this._container;\r\n\r\n\t\tcontainer.stroked = options.stroke;\r\n\t\tcontainer.filled = options.fill;\r\n\r\n\t\tif (options.stroke) {\r\n\t\t\tif (!stroke) {\r\n\t\t\t\tstroke = this._stroke = this._createElement('stroke');\r\n\t\t\t\tstroke.endcap = 'round';\r\n\t\t\t\tcontainer.appendChild(stroke);\r\n\t\t\t}\r\n\t\t\tstroke.weight = options.weight + 'px';\r\n\t\t\tstroke.color = options.color;\r\n\t\t\tstroke.opacity = options.opacity;\r\n\r\n\t\t\tif (options.dashArray) {\r\n\t\t\t\tstroke.dashStyle = L.Util.isArray(options.dashArray) ?\r\n\t\t\t\t    options.dashArray.join(' ') :\r\n\t\t\t\t    options.dashArray.replace(/( *, *)/g, ' ');\r\n\t\t\t} else {\r\n\t\t\t\tstroke.dashStyle = '';\r\n\t\t\t}\r\n\t\t\tif (options.lineCap) {\r\n\t\t\t\tstroke.endcap = options.lineCap.replace('butt', 'flat');\r\n\t\t\t}\r\n\t\t\tif (options.lineJoin) {\r\n\t\t\t\tstroke.joinstyle = options.lineJoin;\r\n\t\t\t}\r\n\r\n\t\t} else if (stroke) {\r\n\t\t\tcontainer.removeChild(stroke);\r\n\t\t\tthis._stroke = null;\r\n\t\t}\r\n\r\n\t\tif (options.fill) {\r\n\t\t\tif (!fill) {\r\n\t\t\t\tfill = this._fill = this._createElement('fill');\r\n\t\t\t\tcontainer.appendChild(fill);\r\n\t\t\t}\r\n\t\t\tfill.color = options.fillColor || options.color;\r\n\t\t\tfill.opacity = options.fillOpacity;\r\n\r\n\t\t} else if (fill) {\r\n\t\t\tcontainer.removeChild(fill);\r\n\t\t\tthis._fill = null;\r\n\t\t}\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tvar style = this._container.style;\r\n\r\n\t\tstyle.display = 'none';\r\n\t\tthis._path.v = this.getPathString() + ' '; // the space fixes IE empty path string bug\r\n\t\tstyle.display = '';\r\n\t}\r\n});\r\n\r\nL.Map.include(L.Browser.svg || !L.Browser.vml ? {} : {\r\n\t_initPathRoot: function () {\r\n\t\tif (this._pathRoot) { return; }\r\n\r\n\t\tvar root = this._pathRoot = document.createElement('div');\r\n\t\troot.className = 'leaflet-vml-container';\r\n\t\tthis._panes.overlayPane.appendChild(root);\r\n\r\n\t\tthis.on('moveend', this._updatePathViewport);\r\n\t\tthis._updatePathViewport();\r\n\t}\r\n});\r\n\n\n/*\r\n * Vector rendering for all browsers that support canvas.\r\n */\r\n\r\nL.Browser.canvas = (function () {\r\n\treturn !!document.createElement('canvas').getContext;\r\n}());\r\n\r\nL.Path = (L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? L.Path : L.Path.extend({\r\n\tstatics: {\r\n\t\t//CLIP_PADDING: 0.02, // not sure if there's a need to set it to a small value\r\n\t\tCANVAS: true,\r\n\t\tSVG: false\r\n\t},\r\n\r\n\tredraw: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis.projectLatlngs();\r\n\t\t\tthis._requestUpdate();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\tL.setOptions(this, style);\r\n\r\n\t\tif (this._map) {\r\n\t\t\tthis._updateStyle();\r\n\t\t\tthis._requestUpdate();\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap\r\n\t\t    .off('viewreset', this.projectLatlngs, this)\r\n\t\t    .off('moveend', this._updatePath, this);\r\n\r\n\t\tif (this.options.clickable) {\r\n\t\t\tthis._map.off('click', this._onClick, this);\r\n\t\t\tthis._map.off('mousemove', this._onMouseMove, this);\r\n\t\t}\r\n\r\n\t\tthis._requestUpdate();\r\n\t\t\r\n\t\tthis.fire('remove');\r\n\t\tthis._map = null;\r\n\t},\r\n\r\n\t_requestUpdate: function () {\r\n\t\tif (this._map && !L.Path._updateRequest) {\r\n\t\t\tL.Path._updateRequest = L.Util.requestAnimFrame(this._fireMapMoveEnd, this._map);\r\n\t\t}\r\n\t},\r\n\r\n\t_fireMapMoveEnd: function () {\r\n\t\tL.Path._updateRequest = null;\r\n\t\tthis.fire('moveend');\r\n\t},\r\n\r\n\t_initElements: function () {\r\n\t\tthis._map._initPathRoot();\r\n\t\tthis._ctx = this._map._canvasCtx;\r\n\t},\r\n\r\n\t_updateStyle: function () {\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.stroke) {\r\n\t\t\tthis._ctx.lineWidth = options.weight;\r\n\t\t\tthis._ctx.strokeStyle = options.color;\r\n\t\t}\r\n\t\tif (options.fill) {\r\n\t\t\tthis._ctx.fillStyle = options.fillColor || options.color;\r\n\t\t}\r\n\r\n\t\tif (options.lineCap) {\r\n\t\t\tthis._ctx.lineCap = options.lineCap;\r\n\t\t}\r\n\t\tif (options.lineJoin) {\r\n\t\t\tthis._ctx.lineJoin = options.lineJoin;\r\n\t\t}\r\n\t},\r\n\r\n\t_drawPath: function () {\r\n\t\tvar i, j, len, len2, point, drawMethod;\r\n\r\n\t\tthis._ctx.beginPath();\r\n\r\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tfor (j = 0, len2 = this._parts[i].length; j < len2; j++) {\r\n\t\t\t\tpoint = this._parts[i][j];\r\n\t\t\t\tdrawMethod = (j === 0 ? 'move' : 'line') + 'To';\r\n\r\n\t\t\t\tthis._ctx[drawMethod](point.x, point.y);\r\n\t\t\t}\r\n\t\t\t// TODO refactor ugly hack\r\n\t\t\tif (this instanceof L.Polygon) {\r\n\t\t\t\tthis._ctx.closePath();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_checkIfEmpty: function () {\r\n\t\treturn !this._parts.length;\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tif (this._checkIfEmpty()) { return; }\r\n\r\n\t\tvar ctx = this._ctx,\r\n\t\t    options = this.options;\r\n\r\n\t\tthis._drawPath();\r\n\t\tctx.save();\r\n\t\tthis._updateStyle();\r\n\r\n\t\tif (options.fill) {\r\n\t\t\tctx.globalAlpha = options.fillOpacity;\r\n\t\t\tctx.fill(options.fillRule || 'evenodd');\r\n\t\t}\r\n\r\n\t\tif (options.stroke) {\r\n\t\t\tctx.globalAlpha = options.opacity;\r\n\t\t\tctx.stroke();\r\n\t\t}\r\n\r\n\t\tctx.restore();\r\n\r\n\t\t// TODO optimization: 1 fill/stroke for all features with equal style instead of 1 for each feature\r\n\t},\r\n\r\n\t_initEvents: function () {\r\n\t\tif (this.options.clickable) {\r\n\t\t\tthis._map.on('mousemove', this._onMouseMove, this);\r\n\t\t\tthis._map.on('click dblclick contextmenu', this._fireMouseEvent, this);\r\n\t\t}\r\n\t},\r\n\r\n\t_fireMouseEvent: function (e) {\r\n\t\tif (this._containsPoint(e.layerPoint)) {\r\n\t\t\tthis.fire(e.type, e);\r\n\t\t}\r\n\t},\r\n\r\n\t_onMouseMove: function (e) {\r\n\t\tif (!this._map || this._map._animatingZoom) { return; }\r\n\r\n\t\t// TODO don't do on each move\r\n\t\tif (this._containsPoint(e.layerPoint)) {\r\n\t\t\tthis._ctx.canvas.style.cursor = 'pointer';\r\n\t\t\tthis._mouseInside = true;\r\n\t\t\tthis.fire('mouseover', e);\r\n\r\n\t\t} else if (this._mouseInside) {\r\n\t\t\tthis._ctx.canvas.style.cursor = '';\r\n\t\t\tthis._mouseInside = false;\r\n\t\t\tthis.fire('mouseout', e);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.include((L.Path.SVG && !window.L_PREFER_CANVAS) || !L.Browser.canvas ? {} : {\r\n\t_initPathRoot: function () {\r\n\t\tvar root = this._pathRoot,\r\n\t\t    ctx;\r\n\r\n\t\tif (!root) {\r\n\t\t\troot = this._pathRoot = document.createElement('canvas');\r\n\t\t\troot.style.position = 'absolute';\r\n\t\t\tctx = this._canvasCtx = root.getContext('2d');\r\n\r\n\t\t\tctx.lineCap = 'round';\r\n\t\t\tctx.lineJoin = 'round';\r\n\r\n\t\t\tthis._panes.overlayPane.appendChild(root);\r\n\r\n\t\t\tif (this.options.zoomAnimation) {\r\n\t\t\t\tthis._pathRoot.className = 'leaflet-zoom-animated';\r\n\t\t\t\tthis.on('zoomanim', this._animatePathZoom);\r\n\t\t\t\tthis.on('zoomend', this._endPathZoom);\r\n\t\t\t}\r\n\t\t\tthis.on('moveend', this._updateCanvasViewport);\r\n\t\t\tthis._updateCanvasViewport();\r\n\t\t}\r\n\t},\r\n\r\n\t_updateCanvasViewport: function () {\r\n\t\t// don't redraw while zooming. See _updateSvgViewport for more details\r\n\t\tif (this._pathZooming) { return; }\r\n\t\tthis._updatePathViewport();\r\n\r\n\t\tvar vp = this._pathViewport,\r\n\t\t    min = vp.min,\r\n\t\t    size = vp.max.subtract(min),\r\n\t\t    root = this._pathRoot;\r\n\r\n\t\t//TODO check if this works properly on mobile webkit\r\n\t\tL.DomUtil.setPosition(root, min);\r\n\t\troot.width = size.x;\r\n\t\troot.height = size.y;\r\n\t\troot.getContext('2d').translate(-min.x, -min.y);\r\n\t}\r\n});\r\n\n\n/*\r\n * L.LineUtil contains different utility functions for line segments\r\n * and polylines (clipping, simplification, distances, etc.)\r\n */\r\n\r\n/*jshint bitwise:false */ // allow bitwise operations for this file\r\n\r\nL.LineUtil = {\r\n\r\n\t// Simplify polyline with vertex reduction and Douglas-Peucker simplification.\r\n\t// Improves rendering performance dramatically by lessening the number of points to draw.\r\n\r\n\tsimplify: function (/*Point[]*/ points, /*Number*/ tolerance) {\r\n\t\tif (!tolerance || !points.length) {\r\n\t\t\treturn points.slice();\r\n\t\t}\r\n\r\n\t\tvar sqTolerance = tolerance * tolerance;\r\n\r\n\t\t// stage 1: vertex reduction\r\n\t\tpoints = this._reducePoints(points, sqTolerance);\r\n\r\n\t\t// stage 2: Douglas-Peucker simplification\r\n\t\tpoints = this._simplifyDP(points, sqTolerance);\r\n\r\n\t\treturn points;\r\n\t},\r\n\r\n\t// distance from a point to a segment between two points\r\n\tpointToSegmentDistance:  function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {\r\n\t\treturn Math.sqrt(this._sqClosestPointOnSegment(p, p1, p2, true));\r\n\t},\r\n\r\n\tclosestPointOnSegment: function (/*Point*/ p, /*Point*/ p1, /*Point*/ p2) {\r\n\t\treturn this._sqClosestPointOnSegment(p, p1, p2);\r\n\t},\r\n\r\n\t// Douglas-Peucker simplification, see http://en.wikipedia.org/wiki/Douglas-Peucker_algorithm\r\n\t_simplifyDP: function (points, sqTolerance) {\r\n\r\n\t\tvar len = points.length,\r\n\t\t    ArrayConstructor = typeof Uint8Array !== undefined + '' ? Uint8Array : Array,\r\n\t\t    markers = new ArrayConstructor(len);\r\n\r\n\t\tmarkers[0] = markers[len - 1] = 1;\r\n\r\n\t\tthis._simplifyDPStep(points, markers, sqTolerance, 0, len - 1);\r\n\r\n\t\tvar i,\r\n\t\t    newPoints = [];\r\n\r\n\t\tfor (i = 0; i < len; i++) {\r\n\t\t\tif (markers[i]) {\r\n\t\t\t\tnewPoints.push(points[i]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn newPoints;\r\n\t},\r\n\r\n\t_simplifyDPStep: function (points, markers, sqTolerance, first, last) {\r\n\r\n\t\tvar maxSqDist = 0,\r\n\t\t    index, i, sqDist;\r\n\r\n\t\tfor (i = first + 1; i <= last - 1; i++) {\r\n\t\t\tsqDist = this._sqClosestPointOnSegment(points[i], points[first], points[last], true);\r\n\r\n\t\t\tif (sqDist > maxSqDist) {\r\n\t\t\t\tindex = i;\r\n\t\t\t\tmaxSqDist = sqDist;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (maxSqDist > sqTolerance) {\r\n\t\t\tmarkers[index] = 1;\r\n\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, first, index);\r\n\t\t\tthis._simplifyDPStep(points, markers, sqTolerance, index, last);\r\n\t\t}\r\n\t},\r\n\r\n\t// reduce points that are too close to each other to a single point\r\n\t_reducePoints: function (points, sqTolerance) {\r\n\t\tvar reducedPoints = [points[0]];\r\n\r\n\t\tfor (var i = 1, prev = 0, len = points.length; i < len; i++) {\r\n\t\t\tif (this._sqDist(points[i], points[prev]) > sqTolerance) {\r\n\t\t\t\treducedPoints.push(points[i]);\r\n\t\t\t\tprev = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (prev < len - 1) {\r\n\t\t\treducedPoints.push(points[len - 1]);\r\n\t\t}\r\n\t\treturn reducedPoints;\r\n\t},\r\n\r\n\t// Cohen-Sutherland line clipping algorithm.\r\n\t// Used to avoid rendering parts of a polyline that are not currently visible.\r\n\r\n\tclipSegment: function (a, b, bounds, useLastCode) {\r\n\t\tvar codeA = useLastCode ? this._lastCode : this._getBitCode(a, bounds),\r\n\t\t    codeB = this._getBitCode(b, bounds),\r\n\r\n\t\t    codeOut, p, newCode;\r\n\r\n\t\t// save 2nd code to avoid calculating it on the next segment\r\n\t\tthis._lastCode = codeB;\r\n\r\n\t\twhile (true) {\r\n\t\t\t// if a,b is inside the clip window (trivial accept)\r\n\t\t\tif (!(codeA | codeB)) {\r\n\t\t\t\treturn [a, b];\r\n\t\t\t// if a,b is outside the clip window (trivial reject)\r\n\t\t\t} else if (codeA & codeB) {\r\n\t\t\t\treturn false;\r\n\t\t\t// other cases\r\n\t\t\t} else {\r\n\t\t\t\tcodeOut = codeA || codeB;\r\n\t\t\t\tp = this._getEdgeIntersection(a, b, codeOut, bounds);\r\n\t\t\t\tnewCode = this._getBitCode(p, bounds);\r\n\r\n\t\t\t\tif (codeOut === codeA) {\r\n\t\t\t\t\ta = p;\r\n\t\t\t\t\tcodeA = newCode;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tb = p;\r\n\t\t\t\t\tcodeB = newCode;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_getEdgeIntersection: function (a, b, code, bounds) {\r\n\t\tvar dx = b.x - a.x,\r\n\t\t    dy = b.y - a.y,\r\n\t\t    min = bounds.min,\r\n\t\t    max = bounds.max;\r\n\r\n\t\tif (code & 8) { // top\r\n\t\t\treturn new L.Point(a.x + dx * (max.y - a.y) / dy, max.y);\r\n\t\t} else if (code & 4) { // bottom\r\n\t\t\treturn new L.Point(a.x + dx * (min.y - a.y) / dy, min.y);\r\n\t\t} else if (code & 2) { // right\r\n\t\t\treturn new L.Point(max.x, a.y + dy * (max.x - a.x) / dx);\r\n\t\t} else if (code & 1) { // left\r\n\t\t\treturn new L.Point(min.x, a.y + dy * (min.x - a.x) / dx);\r\n\t\t}\r\n\t},\r\n\r\n\t_getBitCode: function (/*Point*/ p, bounds) {\r\n\t\tvar code = 0;\r\n\r\n\t\tif (p.x < bounds.min.x) { // left\r\n\t\t\tcode |= 1;\r\n\t\t} else if (p.x > bounds.max.x) { // right\r\n\t\t\tcode |= 2;\r\n\t\t}\r\n\t\tif (p.y < bounds.min.y) { // bottom\r\n\t\t\tcode |= 4;\r\n\t\t} else if (p.y > bounds.max.y) { // top\r\n\t\t\tcode |= 8;\r\n\t\t}\r\n\r\n\t\treturn code;\r\n\t},\r\n\r\n\t// square distance (to avoid unnecessary Math.sqrt calls)\r\n\t_sqDist: function (p1, p2) {\r\n\t\tvar dx = p2.x - p1.x,\r\n\t\t    dy = p2.y - p1.y;\r\n\t\treturn dx * dx + dy * dy;\r\n\t},\r\n\r\n\t// return closest point on segment or distance to that point\r\n\t_sqClosestPointOnSegment: function (p, p1, p2, sqDist) {\r\n\t\tvar x = p1.x,\r\n\t\t    y = p1.y,\r\n\t\t    dx = p2.x - x,\r\n\t\t    dy = p2.y - y,\r\n\t\t    dot = dx * dx + dy * dy,\r\n\t\t    t;\r\n\r\n\t\tif (dot > 0) {\r\n\t\t\tt = ((p.x - x) * dx + (p.y - y) * dy) / dot;\r\n\r\n\t\t\tif (t > 1) {\r\n\t\t\t\tx = p2.x;\r\n\t\t\t\ty = p2.y;\r\n\t\t\t} else if (t > 0) {\r\n\t\t\t\tx += dx * t;\r\n\t\t\t\ty += dy * t;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdx = p.x - x;\r\n\t\tdy = p.y - y;\r\n\r\n\t\treturn sqDist ? dx * dx + dy * dy : new L.Point(x, y);\r\n\t}\r\n};\r\n\n\n/*\r\n * L.Polyline is used to display polylines on a map.\r\n */\r\n\r\nL.Polyline = L.Path.extend({\r\n\tinitialize: function (latlngs, options) {\r\n\t\tL.Path.prototype.initialize.call(this, options);\r\n\r\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\r\n\t},\r\n\r\n\toptions: {\r\n\t\t// how much to simplify the polyline on each zoom level\r\n\t\t// more = better performance and smoother look, less = more accurate\r\n\t\tsmoothFactor: 1.0,\r\n\t\tnoClip: false\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tthis._originalPoints = [];\r\n\r\n\t\tfor (var i = 0, len = this._latlngs.length; i < len; i++) {\r\n\t\t\tthis._originalPoints[i] = this._map.latLngToLayerPoint(this._latlngs[i]);\r\n\t\t}\r\n\t},\r\n\r\n\tgetPathString: function () {\r\n\t\tfor (var i = 0, len = this._parts.length, str = ''; i < len; i++) {\r\n\t\t\tstr += this._getPathPartStr(this._parts[i]);\r\n\t\t}\r\n\t\treturn str;\r\n\t},\r\n\r\n\tgetLatLngs: function () {\r\n\t\treturn this._latlngs;\r\n\t},\r\n\r\n\tsetLatLngs: function (latlngs) {\r\n\t\tthis._latlngs = this._convertLatLngs(latlngs);\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\taddLatLng: function (latlng) {\r\n\t\tthis._latlngs.push(L.latLng(latlng));\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tspliceLatLngs: function () { // (Number index, Number howMany)\r\n\t\tvar removed = [].splice.apply(this._latlngs, arguments);\r\n\t\tthis._convertLatLngs(this._latlngs, true);\r\n\t\tthis.redraw();\r\n\t\treturn removed;\r\n\t},\r\n\r\n\tclosestLayerPoint: function (p) {\r\n\t\tvar minDistance = Infinity, parts = this._parts, p1, p2, minPoint = null;\r\n\r\n\t\tfor (var j = 0, jLen = parts.length; j < jLen; j++) {\r\n\t\t\tvar points = parts[j];\r\n\t\t\tfor (var i = 1, len = points.length; i < len; i++) {\r\n\t\t\t\tp1 = points[i - 1];\r\n\t\t\t\tp2 = points[i];\r\n\t\t\t\tvar sqDist = L.LineUtil._sqClosestPointOnSegment(p, p1, p2, true);\r\n\t\t\t\tif (sqDist < minDistance) {\r\n\t\t\t\t\tminDistance = sqDist;\r\n\t\t\t\t\tminPoint = L.LineUtil._sqClosestPointOnSegment(p, p1, p2);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (minPoint) {\r\n\t\t\tminPoint.distance = Math.sqrt(minDistance);\r\n\t\t}\r\n\t\treturn minPoint;\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\treturn new L.LatLngBounds(this.getLatLngs());\r\n\t},\r\n\r\n\t_convertLatLngs: function (latlngs, overwrite) {\r\n\t\tvar i, len, target = overwrite ? latlngs : [];\r\n\r\n\t\tfor (i = 0, len = latlngs.length; i < len; i++) {\r\n\t\t\tif (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ttarget[i] = L.latLng(latlngs[i]);\r\n\t\t}\r\n\t\treturn target;\r\n\t},\r\n\r\n\t_initEvents: function () {\r\n\t\tL.Path.prototype._initEvents.call(this);\r\n\t},\r\n\r\n\t_getPathPartStr: function (points) {\r\n\t\tvar round = L.Path.VML;\r\n\r\n\t\tfor (var j = 0, len2 = points.length, str = '', p; j < len2; j++) {\r\n\t\t\tp = points[j];\r\n\t\t\tif (round) {\r\n\t\t\t\tp._round();\r\n\t\t\t}\r\n\t\t\tstr += (j ? 'L' : 'M') + p.x + ' ' + p.y;\r\n\t\t}\r\n\t\treturn str;\r\n\t},\r\n\r\n\t_clipPoints: function () {\r\n\t\tvar points = this._originalPoints,\r\n\t\t    len = points.length,\r\n\t\t    i, k, segment;\r\n\r\n\t\tif (this.options.noClip) {\r\n\t\t\tthis._parts = [points];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._parts = [];\r\n\r\n\t\tvar parts = this._parts,\r\n\t\t    vp = this._map._pathViewport,\r\n\t\t    lu = L.LineUtil;\r\n\r\n\t\tfor (i = 0, k = 0; i < len - 1; i++) {\r\n\t\t\tsegment = lu.clipSegment(points[i], points[i + 1], vp, i);\r\n\t\t\tif (!segment) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tparts[k] = parts[k] || [];\r\n\t\t\tparts[k].push(segment[0]);\r\n\r\n\t\t\t// if segment goes out of screen, or it's the last one, it's the end of the line part\r\n\t\t\tif ((segment[1] !== points[i + 1]) || (i === len - 2)) {\r\n\t\t\t\tparts[k].push(segment[1]);\r\n\t\t\t\tk++;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// simplify each clipped part of the polyline\r\n\t_simplifyPoints: function () {\r\n\t\tvar parts = this._parts,\r\n\t\t    lu = L.LineUtil;\r\n\r\n\t\tfor (var i = 0, len = parts.length; i < len; i++) {\r\n\t\t\tparts[i] = lu.simplify(parts[i], this.options.smoothFactor);\r\n\t\t}\r\n\t},\r\n\r\n\t_updatePath: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tthis._clipPoints();\r\n\t\tthis._simplifyPoints();\r\n\r\n\t\tL.Path.prototype._updatePath.call(this);\r\n\t}\r\n});\r\n\r\nL.polyline = function (latlngs, options) {\r\n\treturn new L.Polyline(latlngs, options);\r\n};\r\n\n\n/*\r\n * L.PolyUtil contains utility functions for polygons (clipping, etc.).\r\n */\r\n\r\n/*jshint bitwise:false */ // allow bitwise operations here\r\n\r\nL.PolyUtil = {};\r\n\r\n/*\r\n * Sutherland-Hodgeman polygon clipping algorithm.\r\n * Used to avoid rendering parts of a polygon that are not currently visible.\r\n */\r\nL.PolyUtil.clipPolygon = function (points, bounds) {\r\n\tvar clippedPoints,\r\n\t    edges = [1, 4, 2, 8],\r\n\t    i, j, k,\r\n\t    a, b,\r\n\t    len, edge, p,\r\n\t    lu = L.LineUtil;\r\n\r\n\tfor (i = 0, len = points.length; i < len; i++) {\r\n\t\tpoints[i]._code = lu._getBitCode(points[i], bounds);\r\n\t}\r\n\r\n\t// for each edge (left, bottom, right, top)\r\n\tfor (k = 0; k < 4; k++) {\r\n\t\tedge = edges[k];\r\n\t\tclippedPoints = [];\r\n\r\n\t\tfor (i = 0, len = points.length, j = len - 1; i < len; j = i++) {\r\n\t\t\ta = points[i];\r\n\t\t\tb = points[j];\r\n\r\n\t\t\t// if a is inside the clip window\r\n\t\t\tif (!(a._code & edge)) {\r\n\t\t\t\t// if b is outside the clip window (a->b goes out of screen)\r\n\t\t\t\tif (b._code & edge) {\r\n\t\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds);\r\n\t\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\t\tclippedPoints.push(p);\r\n\t\t\t\t}\r\n\t\t\t\tclippedPoints.push(a);\r\n\r\n\t\t\t// else if b is inside the clip window (a->b enters the screen)\r\n\t\t\t} else if (!(b._code & edge)) {\r\n\t\t\t\tp = lu._getEdgeIntersection(b, a, edge, bounds);\r\n\t\t\t\tp._code = lu._getBitCode(p, bounds);\r\n\t\t\t\tclippedPoints.push(p);\r\n\t\t\t}\r\n\t\t}\r\n\t\tpoints = clippedPoints;\r\n\t}\r\n\r\n\treturn points;\r\n};\r\n\n\n/*\r\n * L.Polygon is used to display polygons on a map.\r\n */\r\n\r\nL.Polygon = L.Polyline.extend({\r\n\toptions: {\r\n\t\tfill: true\r\n\t},\r\n\r\n\tinitialize: function (latlngs, options) {\r\n\t\tL.Polyline.prototype.initialize.call(this, latlngs, options);\r\n\t\tthis._initWithHoles(latlngs);\r\n\t},\r\n\r\n\t_initWithHoles: function (latlngs) {\r\n\t\tvar i, len, hole;\r\n\t\tif (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {\r\n\t\t\tthis._latlngs = this._convertLatLngs(latlngs[0]);\r\n\t\t\tthis._holes = latlngs.slice(1);\r\n\r\n\t\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\r\n\t\t\t\thole = this._holes[i] = this._convertLatLngs(this._holes[i]);\r\n\t\t\t\tif (hole[0].equals(hole[hole.length - 1])) {\r\n\t\t\t\t\thole.pop();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// filter out last point if its equal to the first one\r\n\t\tlatlngs = this._latlngs;\r\n\r\n\t\tif (latlngs.length >= 2 && latlngs[0].equals(latlngs[latlngs.length - 1])) {\r\n\t\t\tlatlngs.pop();\r\n\t\t}\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tL.Polyline.prototype.projectLatlngs.call(this);\r\n\r\n\t\t// project polygon holes points\r\n\t\t// TODO move this logic to Polyline to get rid of duplication\r\n\t\tthis._holePoints = [];\r\n\r\n\t\tif (!this._holes) { return; }\r\n\r\n\t\tvar i, j, len, len2;\r\n\r\n\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\r\n\t\t\tthis._holePoints[i] = [];\r\n\r\n\t\t\tfor (j = 0, len2 = this._holes[i].length; j < len2; j++) {\r\n\t\t\t\tthis._holePoints[i][j] = this._map.latLngToLayerPoint(this._holes[i][j]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tsetLatLngs: function (latlngs) {\r\n\t\tif (latlngs && L.Util.isArray(latlngs[0]) && (typeof latlngs[0][0] !== 'number')) {\r\n\t\t\tthis._initWithHoles(latlngs);\r\n\t\t\treturn this.redraw();\r\n\t\t} else {\r\n\t\t\treturn L.Polyline.prototype.setLatLngs.call(this, latlngs);\r\n\t\t}\r\n\t},\r\n\r\n\t_clipPoints: function () {\r\n\t\tvar points = this._originalPoints,\r\n\t\t    newParts = [];\r\n\r\n\t\tthis._parts = [points].concat(this._holePoints);\r\n\r\n\t\tif (this.options.noClip) { return; }\r\n\r\n\t\tfor (var i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tvar clipped = L.PolyUtil.clipPolygon(this._parts[i], this._map._pathViewport);\r\n\t\t\tif (clipped.length) {\r\n\t\t\t\tnewParts.push(clipped);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._parts = newParts;\r\n\t},\r\n\r\n\t_getPathPartStr: function (points) {\r\n\t\tvar str = L.Polyline.prototype._getPathPartStr.call(this, points);\r\n\t\treturn str + (L.Browser.svg ? 'z' : 'x');\r\n\t}\r\n});\r\n\r\nL.polygon = function (latlngs, options) {\r\n\treturn new L.Polygon(latlngs, options);\r\n};\r\n\n\n/*\r\n * Contains L.MultiPolyline and L.MultiPolygon layers.\r\n */\r\n\r\n(function () {\r\n\tfunction createMulti(Klass) {\r\n\r\n\t\treturn L.FeatureGroup.extend({\r\n\r\n\t\t\tinitialize: function (latlngs, options) {\r\n\t\t\t\tthis._layers = {};\r\n\t\t\t\tthis._options = options;\r\n\t\t\t\tthis.setLatLngs(latlngs);\r\n\t\t\t},\r\n\r\n\t\t\tsetLatLngs: function (latlngs) {\r\n\t\t\t\tvar i = 0,\r\n\t\t\t\t    len = latlngs.length;\r\n\r\n\t\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\t\tif (i < len) {\r\n\t\t\t\t\t\tlayer.setLatLngs(latlngs[i++]);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.removeLayer(layer);\r\n\t\t\t\t\t}\r\n\t\t\t\t}, this);\r\n\r\n\t\t\t\twhile (i < len) {\r\n\t\t\t\t\tthis.addLayer(new Klass(latlngs[i++], this._options));\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\r\n\t\t\tgetLatLngs: function () {\r\n\t\t\t\tvar latlngs = [];\r\n\r\n\t\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\t\tlatlngs.push(layer.getLatLngs());\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn latlngs;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tL.MultiPolyline = createMulti(L.Polyline);\r\n\tL.MultiPolygon = createMulti(L.Polygon);\r\n\r\n\tL.multiPolyline = function (latlngs, options) {\r\n\t\treturn new L.MultiPolyline(latlngs, options);\r\n\t};\r\n\r\n\tL.multiPolygon = function (latlngs, options) {\r\n\t\treturn new L.MultiPolygon(latlngs, options);\r\n\t};\r\n}());\r\n\n\n/*\r\n * L.Rectangle extends Polygon and creates a rectangle when passed a LatLngBounds object.\r\n */\r\n\r\nL.Rectangle = L.Polygon.extend({\r\n\tinitialize: function (latLngBounds, options) {\r\n\t\tL.Polygon.prototype.initialize.call(this, this._boundsToLatLngs(latLngBounds), options);\r\n\t},\r\n\r\n\tsetBounds: function (latLngBounds) {\r\n\t\tthis.setLatLngs(this._boundsToLatLngs(latLngBounds));\r\n\t},\r\n\r\n\t_boundsToLatLngs: function (latLngBounds) {\r\n\t\tlatLngBounds = L.latLngBounds(latLngBounds);\r\n\t\treturn [\r\n\t\t\tlatLngBounds.getSouthWest(),\r\n\t\t\tlatLngBounds.getNorthWest(),\r\n\t\t\tlatLngBounds.getNorthEast(),\r\n\t\t\tlatLngBounds.getSouthEast()\r\n\t\t];\r\n\t}\r\n});\r\n\r\nL.rectangle = function (latLngBounds, options) {\r\n\treturn new L.Rectangle(latLngBounds, options);\r\n};\r\n\n\n/*\r\n * L.Circle is a circle overlay (with a certain radius in meters).\r\n */\r\n\r\nL.Circle = L.Path.extend({\r\n\tinitialize: function (latlng, radius, options) {\r\n\t\tL.Path.prototype.initialize.call(this, options);\r\n\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\tthis._mRadius = radius;\r\n\t},\r\n\r\n\toptions: {\r\n\t\tfill: true\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tthis._latlng = L.latLng(latlng);\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tsetRadius: function (radius) {\r\n\t\tthis._mRadius = radius;\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tvar lngRadius = this._getLngRadius(),\r\n\t\t    latlng = this._latlng,\r\n\t\t    pointLeft = this._map.latLngToLayerPoint([latlng.lat, latlng.lng - lngRadius]);\r\n\r\n\t\tthis._point = this._map.latLngToLayerPoint(latlng);\r\n\t\tthis._radius = Math.max(this._point.x - pointLeft.x, 1);\r\n\t},\r\n\r\n\tgetBounds: function () {\r\n\t\tvar lngRadius = this._getLngRadius(),\r\n\t\t    latRadius = (this._mRadius / 40075017) * 360,\r\n\t\t    latlng = this._latlng;\r\n\r\n\t\treturn new L.LatLngBounds(\r\n\t\t        [latlng.lat - latRadius, latlng.lng - lngRadius],\r\n\t\t        [latlng.lat + latRadius, latlng.lng + lngRadius]);\r\n\t},\r\n\r\n\tgetLatLng: function () {\r\n\t\treturn this._latlng;\r\n\t},\r\n\r\n\tgetPathString: function () {\r\n\t\tvar p = this._point,\r\n\t\t    r = this._radius;\r\n\r\n\t\tif (this._checkIfEmpty()) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tif (L.Browser.svg) {\r\n\t\t\treturn 'M' + p.x + ',' + (p.y - r) +\r\n\t\t\t       'A' + r + ',' + r + ',0,1,1,' +\r\n\t\t\t       (p.x - 0.1) + ',' + (p.y - r) + ' z';\r\n\t\t} else {\r\n\t\t\tp._round();\r\n\t\t\tr = Math.round(r);\r\n\t\t\treturn 'AL ' + p.x + ',' + p.y + ' ' + r + ',' + r + ' 0,' + (65535 * 360);\r\n\t\t}\r\n\t},\r\n\r\n\tgetRadius: function () {\r\n\t\treturn this._mRadius;\r\n\t},\r\n\r\n\t// TODO Earth hardcoded, move into projection code!\r\n\r\n\t_getLatRadius: function () {\r\n\t\treturn (this._mRadius / 40075017) * 360;\r\n\t},\r\n\r\n\t_getLngRadius: function () {\r\n\t\treturn this._getLatRadius() / Math.cos(L.LatLng.DEG_TO_RAD * this._latlng.lat);\r\n\t},\r\n\r\n\t_checkIfEmpty: function () {\r\n\t\tif (!this._map) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tvar vp = this._map._pathViewport,\r\n\t\t    r = this._radius,\r\n\t\t    p = this._point;\r\n\r\n\t\treturn p.x - r > vp.max.x || p.y - r > vp.max.y ||\r\n\t\t       p.x + r < vp.min.x || p.y + r < vp.min.y;\r\n\t}\r\n});\r\n\r\nL.circle = function (latlng, radius, options) {\r\n\treturn new L.Circle(latlng, radius, options);\r\n};\r\n\n\n/*\r\n * L.CircleMarker is a circle overlay with a permanent pixel radius.\r\n */\r\n\r\nL.CircleMarker = L.Circle.extend({\r\n\toptions: {\r\n\t\tradius: 10,\r\n\t\tweight: 2\r\n\t},\r\n\r\n\tinitialize: function (latlng, options) {\r\n\t\tL.Circle.prototype.initialize.call(this, latlng, null, options);\r\n\t\tthis._radius = this.options.radius;\r\n\t},\r\n\r\n\tprojectLatlngs: function () {\r\n\t\tthis._point = this._map.latLngToLayerPoint(this._latlng);\r\n\t},\r\n\r\n\t_updateStyle : function () {\r\n\t\tL.Circle.prototype._updateStyle.call(this);\r\n\t\tthis.setRadius(this.options.radius);\r\n\t},\r\n\r\n\tsetLatLng: function (latlng) {\r\n\t\tL.Circle.prototype.setLatLng.call(this, latlng);\r\n\t\tif (this._popup && this._popup._isOpen) {\r\n\t\t\tthis._popup.setLatLng(latlng);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tsetRadius: function (radius) {\r\n\t\tthis.options.radius = this._radius = radius;\r\n\t\treturn this.redraw();\r\n\t},\r\n\r\n\tgetRadius: function () {\r\n\t\treturn this._radius;\r\n\t}\r\n});\r\n\r\nL.circleMarker = function (latlng, options) {\r\n\treturn new L.CircleMarker(latlng, options);\r\n};\r\n\n\n/*\r\n * Extends L.Polyline to be able to manually detect clicks on Canvas-rendered polylines.\r\n */\r\n\r\nL.Polyline.include(!L.Path.CANVAS ? {} : {\r\n\t_containsPoint: function (p, closed) {\r\n\t\tvar i, j, k, len, len2, dist, part,\r\n\t\t    w = this.options.weight / 2;\r\n\r\n\t\tif (L.Browser.touch) {\r\n\t\t\tw += 10; // polyline click tolerance on touch devices\r\n\t\t}\r\n\r\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tpart = this._parts[i];\r\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\r\n\t\t\t\tif (!closed && (j === 0)) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdist = L.LineUtil.pointToSegmentDistance(p, part[k], part[j]);\r\n\r\n\t\t\t\tif (dist <= w) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n});\r\n\n\n/*\r\n * Extends L.Polygon to be able to manually detect clicks on Canvas-rendered polygons.\r\n */\r\n\r\nL.Polygon.include(!L.Path.CANVAS ? {} : {\r\n\t_containsPoint: function (p) {\r\n\t\tvar inside = false,\r\n\t\t    part, p1, p2,\r\n\t\t    i, j, k,\r\n\t\t    len, len2;\r\n\r\n\t\t// TODO optimization: check if within bounds first\r\n\r\n\t\tif (L.Polyline.prototype._containsPoint.call(this, p, true)) {\r\n\t\t\t// click on polygon border\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// ray casting algorithm for detecting if point is in polygon\r\n\r\n\t\tfor (i = 0, len = this._parts.length; i < len; i++) {\r\n\t\t\tpart = this._parts[i];\r\n\r\n\t\t\tfor (j = 0, len2 = part.length, k = len2 - 1; j < len2; k = j++) {\r\n\t\t\t\tp1 = part[j];\r\n\t\t\t\tp2 = part[k];\r\n\r\n\t\t\t\tif (((p1.y > p.y) !== (p2.y > p.y)) &&\r\n\t\t\t\t\t\t(p.x < (p2.x - p1.x) * (p.y - p1.y) / (p2.y - p1.y) + p1.x)) {\r\n\t\t\t\t\tinside = !inside;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn inside;\r\n\t}\r\n});\r\n\n\n/*\r\n * Extends L.Circle with Canvas-specific code.\r\n */\r\n\r\nL.Circle.include(!L.Path.CANVAS ? {} : {\r\n\t_drawPath: function () {\r\n\t\tvar p = this._point;\r\n\t\tthis._ctx.beginPath();\r\n\t\tthis._ctx.arc(p.x, p.y, this._radius, 0, Math.PI * 2, false);\r\n\t},\r\n\r\n\t_containsPoint: function (p) {\r\n\t\tvar center = this._point,\r\n\t\t    w2 = this.options.stroke ? this.options.weight / 2 : 0;\r\n\r\n\t\treturn (p.distanceTo(center) <= this._radius + w2);\r\n\t}\r\n});\r\n\n\n/*\n * CircleMarker canvas specific drawing parts.\n */\n\nL.CircleMarker.include(!L.Path.CANVAS ? {} : {\n\t_updateStyle: function () {\n\t\tL.Path.prototype._updateStyle.call(this);\n\t}\n});\n\n\n/*\r\n * L.GeoJSON turns any GeoJSON data into a Leaflet layer.\r\n */\r\n\r\nL.GeoJSON = L.FeatureGroup.extend({\r\n\r\n\tinitialize: function (geojson, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\r\n\t\tif (geojson) {\r\n\t\t\tthis.addData(geojson);\r\n\t\t}\r\n\t},\r\n\r\n\taddData: function (geojson) {\r\n\t\tvar features = L.Util.isArray(geojson) ? geojson : geojson.features,\r\n\t\t    i, len, feature;\r\n\r\n\t\tif (features) {\r\n\t\t\tfor (i = 0, len = features.length; i < len; i++) {\r\n\t\t\t\t// Only add this if geometry or geometries are set and not null\r\n\t\t\t\tfeature = features[i];\r\n\t\t\t\tif (feature.geometries || feature.geometry || feature.features || feature.coordinates) {\r\n\t\t\t\t\tthis.addData(features[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar options = this.options;\r\n\r\n\t\tif (options.filter && !options.filter(geojson)) { return; }\r\n\r\n\t\tvar layer = L.GeoJSON.geometryToLayer(geojson, options.pointToLayer, options.coordsToLatLng, options);\r\n\t\tlayer.feature = L.GeoJSON.asFeature(geojson);\r\n\r\n\t\tlayer.defaultOptions = layer.options;\r\n\t\tthis.resetStyle(layer);\r\n\r\n\t\tif (options.onEachFeature) {\r\n\t\t\toptions.onEachFeature(geojson, layer);\r\n\t\t}\r\n\r\n\t\treturn this.addLayer(layer);\r\n\t},\r\n\r\n\tresetStyle: function (layer) {\r\n\t\tvar style = this.options.style;\r\n\t\tif (style) {\r\n\t\t\t// reset any custom styles\r\n\t\t\tL.Util.extend(layer.options, layer.defaultOptions);\r\n\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}\r\n\t},\r\n\r\n\tsetStyle: function (style) {\r\n\t\tthis.eachLayer(function (layer) {\r\n\t\t\tthis._setLayerStyle(layer, style);\r\n\t\t}, this);\r\n\t},\r\n\r\n\t_setLayerStyle: function (layer, style) {\r\n\t\tif (typeof style === 'function') {\r\n\t\t\tstyle = style(layer.feature);\r\n\t\t}\r\n\t\tif (layer.setStyle) {\r\n\t\t\tlayer.setStyle(style);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.extend(L.GeoJSON, {\r\n\tgeometryToLayer: function (geojson, pointToLayer, coordsToLatLng, vectorOptions) {\r\n\t\tvar geometry = geojson.type === 'Feature' ? geojson.geometry : geojson,\r\n\t\t    coords = geometry.coordinates,\r\n\t\t    layers = [],\r\n\t\t    latlng, latlngs, i, len;\r\n\r\n\t\tcoordsToLatLng = coordsToLatLng || this.coordsToLatLng;\r\n\r\n\t\tswitch (geometry.type) {\r\n\t\tcase 'Point':\r\n\t\t\tlatlng = coordsToLatLng(coords);\r\n\t\t\treturn pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng);\r\n\r\n\t\tcase 'MultiPoint':\r\n\t\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\t\tlatlng = coordsToLatLng(coords[i]);\r\n\t\t\t\tlayers.push(pointToLayer ? pointToLayer(geojson, latlng) : new L.Marker(latlng));\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tcase 'LineString':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 0, coordsToLatLng);\r\n\t\t\treturn new L.Polyline(latlngs, vectorOptions);\r\n\r\n\t\tcase 'Polygon':\r\n\t\t\tif (coords.length === 2 && !coords[1].length) {\r\n\t\t\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t\t\t}\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);\r\n\t\t\treturn new L.Polygon(latlngs, vectorOptions);\r\n\r\n\t\tcase 'MultiLineString':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 1, coordsToLatLng);\r\n\t\t\treturn new L.MultiPolyline(latlngs, vectorOptions);\r\n\r\n\t\tcase 'MultiPolygon':\r\n\t\t\tlatlngs = this.coordsToLatLngs(coords, 2, coordsToLatLng);\r\n\t\t\treturn new L.MultiPolygon(latlngs, vectorOptions);\r\n\r\n\t\tcase 'GeometryCollection':\r\n\t\t\tfor (i = 0, len = geometry.geometries.length; i < len; i++) {\r\n\r\n\t\t\t\tlayers.push(this.geometryToLayer({\r\n\t\t\t\t\tgeometry: geometry.geometries[i],\r\n\t\t\t\t\ttype: 'Feature',\r\n\t\t\t\t\tproperties: geojson.properties\r\n\t\t\t\t}, pointToLayer, coordsToLatLng, vectorOptions));\r\n\t\t\t}\r\n\t\t\treturn new L.FeatureGroup(layers);\r\n\r\n\t\tdefault:\r\n\t\t\tthrow new Error('Invalid GeoJSON object.');\r\n\t\t}\r\n\t},\r\n\r\n\tcoordsToLatLng: function (coords) { // (Array[, Boolean]) -> LatLng\r\n\t\treturn new L.LatLng(coords[1], coords[0], coords[2]);\r\n\t},\r\n\r\n\tcoordsToLatLngs: function (coords, levelsDeep, coordsToLatLng) { // (Array[, Number, Function]) -> Array\r\n\t\tvar latlng, i, len,\r\n\t\t    latlngs = [];\r\n\r\n\t\tfor (i = 0, len = coords.length; i < len; i++) {\r\n\t\t\tlatlng = levelsDeep ?\r\n\t\t\t        this.coordsToLatLngs(coords[i], levelsDeep - 1, coordsToLatLng) :\r\n\t\t\t        (coordsToLatLng || this.coordsToLatLng)(coords[i]);\r\n\r\n\t\t\tlatlngs.push(latlng);\r\n\t\t}\r\n\r\n\t\treturn latlngs;\r\n\t},\r\n\r\n\tlatLngToCoords: function (latlng) {\r\n\t\tvar coords = [latlng.lng, latlng.lat];\r\n\r\n\t\tif (latlng.alt !== undefined) {\r\n\t\t\tcoords.push(latlng.alt);\r\n\t\t}\r\n\t\treturn coords;\r\n\t},\r\n\r\n\tlatLngsToCoords: function (latLngs) {\r\n\t\tvar coords = [];\r\n\r\n\t\tfor (var i = 0, len = latLngs.length; i < len; i++) {\r\n\t\t\tcoords.push(L.GeoJSON.latLngToCoords(latLngs[i]));\r\n\t\t}\r\n\r\n\t\treturn coords;\r\n\t},\r\n\r\n\tgetFeature: function (layer, newGeometry) {\r\n\t\treturn layer.feature ? L.extend({}, layer.feature, {geometry: newGeometry}) : L.GeoJSON.asFeature(newGeometry);\r\n\t},\r\n\r\n\tasFeature: function (geoJSON) {\r\n\t\tif (geoJSON.type === 'Feature') {\r\n\t\t\treturn geoJSON;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'Feature',\r\n\t\t\tproperties: {},\r\n\t\t\tgeometry: geoJSON\r\n\t\t};\r\n\t}\r\n});\r\n\r\nvar PointToGeoJSON = {\r\n\ttoGeoJSON: function () {\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'Point',\r\n\t\t\tcoordinates: L.GeoJSON.latLngToCoords(this.getLatLng())\r\n\t\t});\r\n\t}\r\n};\r\n\r\nL.Marker.include(PointToGeoJSON);\r\nL.Circle.include(PointToGeoJSON);\r\nL.CircleMarker.include(PointToGeoJSON);\r\n\r\nL.Polyline.include({\r\n\ttoGeoJSON: function () {\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'LineString',\r\n\t\t\tcoordinates: L.GeoJSON.latLngsToCoords(this.getLatLngs())\r\n\t\t});\r\n\t}\r\n});\r\n\r\nL.Polygon.include({\r\n\ttoGeoJSON: function () {\r\n\t\tvar coords = [L.GeoJSON.latLngsToCoords(this.getLatLngs())],\r\n\t\t    i, len, hole;\r\n\r\n\t\tcoords[0].push(coords[0][0]);\r\n\r\n\t\tif (this._holes) {\r\n\t\t\tfor (i = 0, len = this._holes.length; i < len; i++) {\r\n\t\t\t\thole = L.GeoJSON.latLngsToCoords(this._holes[i]);\r\n\t\t\t\thole.push(hole[0]);\r\n\t\t\t\tcoords.push(hole);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\ttype: 'Polygon',\r\n\t\t\tcoordinates: coords\r\n\t\t});\r\n\t}\r\n});\r\n\r\n(function () {\r\n\tfunction multiToGeoJSON(type) {\r\n\t\treturn function () {\r\n\t\t\tvar coords = [];\r\n\r\n\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\tcoords.push(layer.toGeoJSON().geometry.coordinates);\r\n\t\t\t});\r\n\r\n\t\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\t\ttype: type,\r\n\t\t\t\tcoordinates: coords\r\n\t\t\t});\r\n\t\t};\r\n\t}\r\n\r\n\tL.MultiPolyline.include({toGeoJSON: multiToGeoJSON('MultiLineString')});\r\n\tL.MultiPolygon.include({toGeoJSON: multiToGeoJSON('MultiPolygon')});\r\n\r\n\tL.LayerGroup.include({\r\n\t\ttoGeoJSON: function () {\r\n\r\n\t\t\tvar geometry = this.feature && this.feature.geometry,\r\n\t\t\t\tjsons = [],\r\n\t\t\t\tjson;\r\n\r\n\t\t\tif (geometry && geometry.type === 'MultiPoint') {\r\n\t\t\t\treturn multiToGeoJSON('MultiPoint').call(this);\r\n\t\t\t}\r\n\r\n\t\t\tvar isGeometryCollection = geometry && geometry.type === 'GeometryCollection';\r\n\r\n\t\t\tthis.eachLayer(function (layer) {\r\n\t\t\t\tif (layer.toGeoJSON) {\r\n\t\t\t\t\tjson = layer.toGeoJSON();\r\n\t\t\t\t\tjsons.push(isGeometryCollection ? json.geometry : L.GeoJSON.asFeature(json));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif (isGeometryCollection) {\r\n\t\t\t\treturn L.GeoJSON.getFeature(this, {\r\n\t\t\t\t\tgeometries: jsons,\r\n\t\t\t\t\ttype: 'GeometryCollection'\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'FeatureCollection',\r\n\t\t\t\tfeatures: jsons\r\n\t\t\t};\r\n\t\t}\r\n\t});\r\n}());\r\n\r\nL.geoJson = function (geojson, options) {\r\n\treturn new L.GeoJSON(geojson, options);\r\n};\r\n\n\n/*\r\n * L.DomEvent contains functions for working with DOM events.\r\n */\r\n\r\nL.DomEvent = {\r\n\t/* inspired by John Resig, Dean Edwards and YUI addEvent implementations */\r\n\taddListener: function (obj, type, fn, context) { // (HTMLElement, String, Function[, Object])\r\n\r\n\t\tvar id = L.stamp(fn),\r\n\t\t    key = '_leaflet_' + type + id,\r\n\t\t    handler, originalHandler, newType;\r\n\r\n\t\tif (obj[key]) { return this; }\r\n\r\n\t\thandler = function (e) {\r\n\t\t\treturn fn.call(context || obj, e || L.DomEvent._getEvent());\r\n\t\t};\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\treturn this.addPointerListener(obj, type, handler, id);\r\n\t\t}\r\n\t\tif (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {\r\n\t\t\tthis.addDoubleTapListener(obj, handler, id);\r\n\t\t}\r\n\r\n\t\tif ('addEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.addEventListener('DOMMouseScroll', handler, false);\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\r\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\r\n\r\n\t\t\t\toriginalHandler = handler;\r\n\t\t\t\tnewType = (type === 'mouseenter' ? 'mouseover' : 'mouseout');\r\n\r\n\t\t\t\thandler = function (e) {\r\n\t\t\t\t\tif (!L.DomEvent._checkMouse(obj, e)) { return; }\r\n\t\t\t\t\treturn originalHandler(e);\r\n\t\t\t\t};\r\n\r\n\t\t\t\tobj.addEventListener(newType, handler, false);\r\n\r\n\t\t\t} else if (type === 'click' && L.Browser.android) {\r\n\t\t\t\toriginalHandler = handler;\r\n\t\t\t\thandler = function (e) {\r\n\t\t\t\t\treturn L.DomEvent._filterClick(e, originalHandler);\r\n\t\t\t\t};\r\n\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\t\t\t} else {\r\n\t\t\t\tobj.addEventListener(type, handler, false);\r\n\t\t\t}\r\n\r\n\t\t} else if ('attachEvent' in obj) {\r\n\t\t\tobj.attachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[key] = handler;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveListener: function (obj, type, fn) {  // (HTMLElement, String, Function)\r\n\r\n\t\tvar id = L.stamp(fn),\r\n\t\t    key = '_leaflet_' + type + id,\r\n\t\t    handler = obj[key];\r\n\r\n\t\tif (!handler) { return this; }\r\n\r\n\t\tif (L.Browser.pointer && type.indexOf('touch') === 0) {\r\n\t\t\tthis.removePointerListener(obj, type, id);\r\n\t\t} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {\r\n\t\t\tthis.removeDoubleTapListener(obj, id);\r\n\r\n\t\t} else if ('removeEventListener' in obj) {\r\n\r\n\t\t\tif (type === 'mousewheel') {\r\n\t\t\t\tobj.removeEventListener('DOMMouseScroll', handler, false);\r\n\t\t\t\tobj.removeEventListener(type, handler, false);\r\n\r\n\t\t\t} else if ((type === 'mouseenter') || (type === 'mouseleave')) {\r\n\t\t\t\tobj.removeEventListener((type === 'mouseenter' ? 'mouseover' : 'mouseout'), handler, false);\r\n\t\t\t} else {\r\n\t\t\t\tobj.removeEventListener(type, handler, false);\r\n\t\t\t}\r\n\t\t} else if ('detachEvent' in obj) {\r\n\t\t\tobj.detachEvent('on' + type, handler);\r\n\t\t}\r\n\r\n\t\tobj[key] = null;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstopPropagation: function (e) {\r\n\r\n\t\tif (e.stopPropagation) {\r\n\t\t\te.stopPropagation();\r\n\t\t} else {\r\n\t\t\te.cancelBubble = true;\r\n\t\t}\r\n\t\tL.DomEvent._skipped(e);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tdisableScrollPropagation: function (el) {\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\treturn L.DomEvent\r\n\t\t\t.on(el, 'mousewheel', stop)\r\n\t\t\t.on(el, 'MozMousePixelScroll', stop);\r\n\t},\r\n\r\n\tdisableClickPropagation: function (el) {\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\r\n\t\t\tL.DomEvent.on(el, L.Draggable.START[i], stop);\r\n\t\t}\r\n\r\n\t\treturn L.DomEvent\r\n\t\t\t.on(el, 'click', L.DomEvent._fakeStop)\r\n\t\t\t.on(el, 'dblclick', stop);\r\n\t},\r\n\r\n\tpreventDefault: function (e) {\r\n\r\n\t\tif (e.preventDefault) {\r\n\t\t\te.preventDefault();\r\n\t\t} else {\r\n\t\t\te.returnValue = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstop: function (e) {\r\n\t\treturn L.DomEvent\r\n\t\t\t.preventDefault(e)\r\n\t\t\t.stopPropagation(e);\r\n\t},\r\n\r\n\tgetMousePosition: function (e, container) {\r\n\t\tif (!container) {\r\n\t\t\treturn new L.Point(e.clientX, e.clientY);\r\n\t\t}\r\n\r\n\t\tvar rect = container.getBoundingClientRect();\r\n\r\n\t\treturn new L.Point(\r\n\t\t\te.clientX - rect.left - container.clientLeft,\r\n\t\t\te.clientY - rect.top - container.clientTop);\r\n\t},\r\n\r\n\tgetWheelDelta: function (e) {\r\n\r\n\t\tvar delta = 0;\r\n\r\n\t\tif (e.wheelDelta) {\r\n\t\t\tdelta = e.wheelDelta / 120;\r\n\t\t}\r\n\t\tif (e.detail) {\r\n\t\t\tdelta = -e.detail / 3;\r\n\t\t}\r\n\t\treturn delta;\r\n\t},\r\n\r\n\t_skipEvents: {},\r\n\r\n\t_fakeStop: function (e) {\r\n\t\t// fakes stopPropagation by setting a special event flag, checked/reset with L.DomEvent._skipped(e)\r\n\t\tL.DomEvent._skipEvents[e.type] = true;\r\n\t},\r\n\r\n\t_skipped: function (e) {\r\n\t\tvar skipped = this._skipEvents[e.type];\r\n\t\t// reset when checking, as it's only used in map container and propagates outside of the map\r\n\t\tthis._skipEvents[e.type] = false;\r\n\t\treturn skipped;\r\n\t},\r\n\r\n\t// check if element really left/entered the event target (for mouseenter/mouseleave)\r\n\t_checkMouse: function (el, e) {\r\n\r\n\t\tvar related = e.relatedTarget;\r\n\r\n\t\tif (!related) { return true; }\r\n\r\n\t\ttry {\r\n\t\t\twhile (related && (related !== el)) {\r\n\t\t\t\trelated = related.parentNode;\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn (related !== el);\r\n\t},\r\n\r\n\t_getEvent: function () { // evil magic for IE\r\n\t\t/*jshint noarg:false */\r\n\t\tvar e = window.event;\r\n\t\tif (!e) {\r\n\t\t\tvar caller = arguments.callee.caller;\r\n\t\t\twhile (caller) {\r\n\t\t\t\te = caller['arguments'][0];\r\n\t\t\t\tif (e && window.Event === e.constructor) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcaller = caller.caller;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn e;\r\n\t},\r\n\r\n\t// this is a horrible workaround for a bug in Android where a single touch triggers two click events\r\n\t_filterClick: function (e, handler) {\r\n\t\tvar timeStamp = (e.timeStamp || e.originalEvent.timeStamp),\r\n\t\t\telapsed = L.DomEvent._lastClick && (timeStamp - L.DomEvent._lastClick);\r\n\r\n\t\t// are they closer together than 500ms yet more than 100ms?\r\n\t\t// Android typically triggers them ~300ms apart while multiple listeners\r\n\t\t// on the same event should be triggered far faster;\r\n\t\t// or check if click is simulated on the element, and if it is, reject any non-simulated events\r\n\r\n\t\tif ((elapsed && elapsed > 100 && elapsed < 500) || (e.target._simulatedClick && !e._simulated)) {\r\n\t\t\tL.DomEvent.stop(e);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tL.DomEvent._lastClick = timeStamp;\r\n\r\n\t\treturn handler(e);\r\n\t}\r\n};\r\n\r\nL.DomEvent.on = L.DomEvent.addListener;\r\nL.DomEvent.off = L.DomEvent.removeListener;\r\n\n\n/*\r\n * L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too.\r\n */\r\n\r\nL.Draggable = L.Class.extend({\r\n\tincludes: L.Mixin.Events,\r\n\r\n\tstatics: {\r\n\t\tSTART: L.Browser.touch ? ['touchstart', 'mousedown'] : ['mousedown'],\r\n\t\tEND: {\r\n\t\t\tmousedown: 'mouseup',\r\n\t\t\ttouchstart: 'touchend',\r\n\t\t\tpointerdown: 'touchend',\r\n\t\t\tMSPointerDown: 'touchend'\r\n\t\t},\r\n\t\tMOVE: {\r\n\t\t\tmousedown: 'mousemove',\r\n\t\t\ttouchstart: 'touchmove',\r\n\t\t\tpointerdown: 'touchmove',\r\n\t\t\tMSPointerDown: 'touchmove'\r\n\t\t}\r\n\t},\r\n\r\n\tinitialize: function (element, dragStartTarget) {\r\n\t\tthis._element = element;\r\n\t\tthis._dragStartTarget = dragStartTarget || element;\r\n\t},\r\n\r\n\tenable: function () {\r\n\t\tif (this._enabled) { return; }\r\n\r\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\r\n\t\t\tL.DomEvent.on(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);\r\n\t\t}\r\n\r\n\t\tthis._enabled = true;\r\n\t},\r\n\r\n\tdisable: function () {\r\n\t\tif (!this._enabled) { return; }\r\n\r\n\t\tfor (var i = L.Draggable.START.length - 1; i >= 0; i--) {\r\n\t\t\tL.DomEvent.off(this._dragStartTarget, L.Draggable.START[i], this._onDown, this);\r\n\t\t}\r\n\r\n\t\tthis._enabled = false;\r\n\t\tthis._moved = false;\r\n\t},\r\n\r\n\t_onDown: function (e) {\r\n\t\tthis._moved = false;\r\n\r\n\t\tif (e.shiftKey || ((e.which !== 1) && (e.button !== 1) && !e.touches)) { return; }\r\n\r\n\t\tL.DomEvent.stopPropagation(e);\r\n\r\n\t\tif (L.Draggable._disabled) { return; }\r\n\r\n\t\tL.DomUtil.disableImageDrag();\r\n\t\tL.DomUtil.disableTextSelection();\r\n\r\n\t\tif (this._moving) { return; }\r\n\r\n\t\tvar first = e.touches ? e.touches[0] : e;\r\n\r\n\t\tthis._startPoint = new L.Point(first.clientX, first.clientY);\r\n\t\tthis._startPos = this._newPos = L.DomUtil.getPosition(this._element);\r\n\r\n\t\tL.DomEvent\r\n\t\t    .on(document, L.Draggable.MOVE[e.type], this._onMove, this)\r\n\t\t    .on(document, L.Draggable.END[e.type], this._onUp, this);\r\n\t},\r\n\r\n\t_onMove: function (e) {\r\n\t\tif (e.touches && e.touches.length > 1) {\r\n\t\t\tthis._moved = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar first = (e.touches && e.touches.length === 1 ? e.touches[0] : e),\r\n\t\t    newPoint = new L.Point(first.clientX, first.clientY),\r\n\t\t    offset = newPoint.subtract(this._startPoint);\r\n\r\n\t\tif (!offset.x && !offset.y) { return; }\r\n\t\tif (L.Browser.touch && Math.abs(offset.x) + Math.abs(offset.y) < 3) { return; }\r\n\r\n\t\tL.DomEvent.preventDefault(e);\r\n\r\n\t\tif (!this._moved) {\r\n\t\t\tthis.fire('dragstart');\r\n\r\n\t\t\tthis._moved = true;\r\n\t\t\tthis._startPos = L.DomUtil.getPosition(this._element).subtract(offset);\r\n\r\n\t\t\tL.DomUtil.addClass(document.body, 'leaflet-dragging');\r\n\t\t\tthis._lastTarget = e.target || e.srcElement;\r\n\t\t\tL.DomUtil.addClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t}\r\n\r\n\t\tthis._newPos = this._startPos.add(offset);\r\n\t\tthis._moving = true;\r\n\r\n\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\t\tthis._animRequest = L.Util.requestAnimFrame(this._updatePosition, this, true, this._dragStartTarget);\r\n\t},\r\n\r\n\t_updatePosition: function () {\r\n\t\tthis.fire('predrag');\r\n\t\tL.DomUtil.setPosition(this._element, this._newPos);\r\n\t\tthis.fire('drag');\r\n\t},\r\n\r\n\t_onUp: function () {\r\n\t\tL.DomUtil.removeClass(document.body, 'leaflet-dragging');\r\n\r\n\t\tif (this._lastTarget) {\r\n\t\t\tL.DomUtil.removeClass(this._lastTarget, 'leaflet-drag-target');\r\n\t\t\tthis._lastTarget = null;\r\n\t\t}\r\n\r\n\t\tfor (var i in L.Draggable.MOVE) {\r\n\t\t\tL.DomEvent\r\n\t\t\t    .off(document, L.Draggable.MOVE[i], this._onMove)\r\n\t\t\t    .off(document, L.Draggable.END[i], this._onUp);\r\n\t\t}\r\n\r\n\t\tL.DomUtil.enableImageDrag();\r\n\t\tL.DomUtil.enableTextSelection();\r\n\r\n\t\tif (this._moved && this._moving) {\r\n\t\t\t// ensure drag is not fired after dragend\r\n\t\t\tL.Util.cancelAnimFrame(this._animRequest);\r\n\r\n\t\t\tthis.fire('dragend', {\r\n\t\t\t\tdistance: this._newPos.distanceTo(this._startPos)\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._moving = false;\r\n\t}\r\n});\r\n\n\n/*\n\tL.Handler is a base class for handler classes that are used internally to inject\n\tinteraction features like dragging to classes like Map and Marker.\n*/\n\nL.Handler = L.Class.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t},\n\n\tenable: function () {\n\t\tif (this._enabled) { return; }\n\n\t\tthis._enabled = true;\n\t\tthis.addHooks();\n\t},\n\n\tdisable: function () {\n\t\tif (!this._enabled) { return; }\n\n\t\tthis._enabled = false;\n\t\tthis.removeHooks();\n\t},\n\n\tenabled: function () {\n\t\treturn !!this._enabled;\n\t}\n});\n\n\n/*\n * L.Handler.MapDrag is used to make the map draggable (with panning inertia), enabled by default.\n */\n\nL.Map.mergeOptions({\n\tdragging: true,\n\n\tinertia: !L.Browser.android23,\n\tinertiaDeceleration: 3400, // px/s^2\n\tinertiaMaxSpeed: Infinity, // px/s\n\tinertiaThreshold: L.Browser.touch ? 32 : 18, // ms\n\teaseLinearity: 0.25,\n\n\t// TODO refactor, move to CRS\n\tworldCopyJump: false\n});\n\nL.Map.Drag = L.Handler.extend({\n\taddHooks: function () {\n\t\tif (!this._draggable) {\n\t\t\tvar map = this._map;\n\n\t\t\tthis._draggable = new L.Draggable(map._mapPane, map._container);\n\n\t\t\tthis._draggable.on({\n\t\t\t\t'dragstart': this._onDragStart,\n\t\t\t\t'drag': this._onDrag,\n\t\t\t\t'dragend': this._onDragEnd\n\t\t\t}, this);\n\n\t\t\tif (map.options.worldCopyJump) {\n\t\t\t\tthis._draggable.on('predrag', this._onPreDrag, this);\n\t\t\t\tmap.on('viewreset', this._onViewReset, this);\n\n\t\t\t\tmap.whenReady(this._onViewReset, this);\n\t\t\t}\n\t\t}\n\t\tthis._draggable.enable();\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable.disable();\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\tvar map = this._map;\n\n\t\tif (map._panAnim) {\n\t\t\tmap._panAnim.stop();\n\t\t}\n\n\t\tmap\n\t\t    .fire('movestart')\n\t\t    .fire('dragstart');\n\n\t\tif (map.options.inertia) {\n\t\t\tthis._positions = [];\n\t\t\tthis._times = [];\n\t\t}\n\t},\n\n\t_onDrag: function () {\n\t\tif (this._map.options.inertia) {\n\t\t\tvar time = this._lastTime = +new Date(),\n\t\t\t    pos = this._lastPos = this._draggable._newPos;\n\n\t\t\tthis._positions.push(pos);\n\t\t\tthis._times.push(time);\n\n\t\t\tif (time - this._times[0] > 200) {\n\t\t\t\tthis._positions.shift();\n\t\t\t\tthis._times.shift();\n\t\t\t}\n\t\t}\n\n\t\tthis._map\n\t\t    .fire('move')\n\t\t    .fire('drag');\n\t},\n\n\t_onViewReset: function () {\n\t\t// TODO fix hardcoded Earth values\n\t\tvar pxCenter = this._map.getSize()._divideBy(2),\n\t\t    pxWorldCenter = this._map.latLngToLayerPoint([0, 0]);\n\n\t\tthis._initialWorldOffset = pxWorldCenter.subtract(pxCenter).x;\n\t\tthis._worldWidth = this._map.project([0, 180]).x;\n\t},\n\n\t_onPreDrag: function () {\n\t\t// TODO refactor to be able to adjust map pane position after zoom\n\t\tvar worldWidth = this._worldWidth,\n\t\t    halfWidth = Math.round(worldWidth / 2),\n\t\t    dx = this._initialWorldOffset,\n\t\t    x = this._draggable._newPos.x,\n\t\t    newX1 = (x - halfWidth + dx) % worldWidth + halfWidth - dx,\n\t\t    newX2 = (x + halfWidth + dx) % worldWidth - halfWidth - dx,\n\t\t    newX = Math.abs(newX1 + dx) < Math.abs(newX2 + dx) ? newX1 : newX2;\n\n\t\tthis._draggable._newPos.x = newX;\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tvar map = this._map,\n\t\t    options = map.options,\n\t\t    delay = +new Date() - this._lastTime,\n\n\t\t    noInertia = !options.inertia || delay > options.inertiaThreshold || !this._positions[0];\n\n\t\tmap.fire('dragend', e);\n\n\t\tif (noInertia) {\n\t\t\tmap.fire('moveend');\n\n\t\t} else {\n\n\t\t\tvar direction = this._lastPos.subtract(this._positions[0]),\n\t\t\t    duration = (this._lastTime + delay - this._times[0]) / 1000,\n\t\t\t    ease = options.easeLinearity,\n\n\t\t\t    speedVector = direction.multiplyBy(ease / duration),\n\t\t\t    speed = speedVector.distanceTo([0, 0]),\n\n\t\t\t    limitedSpeed = Math.min(options.inertiaMaxSpeed, speed),\n\t\t\t    limitedSpeedVector = speedVector.multiplyBy(limitedSpeed / speed),\n\n\t\t\t    decelerationDuration = limitedSpeed / (options.inertiaDeceleration * ease),\n\t\t\t    offset = limitedSpeedVector.multiplyBy(-decelerationDuration / 2).round();\n\n\t\t\tif (!offset.x || !offset.y) {\n\t\t\t\tmap.fire('moveend');\n\n\t\t\t} else {\n\t\t\t\toffset = map._limitOffset(offset, map.options.maxBounds);\n\n\t\t\t\tL.Util.requestAnimFrame(function () {\n\t\t\t\t\tmap.panBy(offset, {\n\t\t\t\t\t\tduration: decelerationDuration,\n\t\t\t\t\t\teaseLinearity: ease,\n\t\t\t\t\t\tnoMoveStart: true\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'dragging', L.Map.Drag);\n\n\n/*\n * L.Handler.DoubleClickZoom is used to handle double-click zoom on the map, enabled by default.\n */\n\nL.Map.mergeOptions({\n\tdoubleClickZoom: true\n});\n\nL.Map.DoubleClickZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tthis._map.on('dblclick', this._onDoubleClick, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._map.off('dblclick', this._onDoubleClick, this);\n\t},\n\n\t_onDoubleClick: function (e) {\n\t\tvar map = this._map,\n\t\t    zoom = map.getZoom() + (e.originalEvent.shiftKey ? -1 : 1);\n\n\t\tif (map.options.doubleClickZoom === 'center') {\n\t\t\tmap.setZoom(zoom);\n\t\t} else {\n\t\t\tmap.setZoomAround(e.containerPoint, zoom);\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'doubleClickZoom', L.Map.DoubleClickZoom);\n\n\n/*\n * L.Handler.ScrollWheelZoom is used by L.Map to enable mouse scroll wheel zoom on the map.\n */\n\nL.Map.mergeOptions({\n\tscrollWheelZoom: true\n});\n\nL.Map.ScrollWheelZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'mousewheel', this._onWheelScroll, this);\n\t\tL.DomEvent.on(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);\n\t\tthis._delta = 0;\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'mousewheel', this._onWheelScroll);\n\t\tL.DomEvent.off(this._map._container, 'MozMousePixelScroll', L.DomEvent.preventDefault);\n\t},\n\n\t_onWheelScroll: function (e) {\n\t\tvar delta = L.DomEvent.getWheelDelta(e);\n\n\t\tthis._delta += delta;\n\t\tthis._lastMousePos = this._map.mouseEventToContainerPoint(e);\n\n\t\tif (!this._startTime) {\n\t\t\tthis._startTime = +new Date();\n\t\t}\n\n\t\tvar left = Math.max(40 - (+new Date() - this._startTime), 0);\n\n\t\tclearTimeout(this._timer);\n\t\tthis._timer = setTimeout(L.bind(this._performZoom, this), left);\n\n\t\tL.DomEvent.preventDefault(e);\n\t\tL.DomEvent.stopPropagation(e);\n\t},\n\n\t_performZoom: function () {\n\t\tvar map = this._map,\n\t\t    delta = this._delta,\n\t\t    zoom = map.getZoom();\n\n\t\tdelta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n\t\tdelta = Math.max(Math.min(delta, 4), -4);\n\t\tdelta = map._limitZoom(zoom + delta) - zoom;\n\n\t\tthis._delta = 0;\n\t\tthis._startTime = null;\n\n\t\tif (!delta) { return; }\n\n\t\tif (map.options.scrollWheelZoom === 'center') {\n\t\t\tmap.setZoom(zoom + delta);\n\t\t} else {\n\t\t\tmap.setZoomAround(this._lastMousePos, zoom + delta);\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'scrollWheelZoom', L.Map.ScrollWheelZoom);\n\n\n/*\r\n * Extends the event handling code with double tap support for mobile browsers.\r\n */\r\n\r\nL.extend(L.DomEvent, {\r\n\r\n\t_touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',\r\n\t_touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',\r\n\r\n\t// inspired by Zepto touch code by Thomas Fuchs\r\n\taddDoubleTapListener: function (obj, handler, id) {\r\n\t\tvar last,\r\n\t\t    doubleTap = false,\r\n\t\t    delay = 250,\r\n\t\t    touch,\r\n\t\t    pre = '_leaflet_',\r\n\t\t    touchstart = this._touchstart,\r\n\t\t    touchend = this._touchend,\r\n\t\t    trackedTouches = [];\r\n\r\n\t\tfunction onTouchStart(e) {\r\n\t\t\tvar count;\r\n\r\n\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\ttrackedTouches.push(e.pointerId);\r\n\t\t\t\tcount = trackedTouches.length;\r\n\t\t\t} else {\r\n\t\t\t\tcount = e.touches.length;\r\n\t\t\t}\r\n\t\t\tif (count > 1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar now = Date.now(),\r\n\t\t\t\tdelta = now - (last || now);\r\n\r\n\t\t\ttouch = e.touches ? e.touches[0] : e;\r\n\t\t\tdoubleTap = (delta > 0 && delta <= delay);\r\n\t\t\tlast = now;\r\n\t\t}\r\n\r\n\t\tfunction onTouchEnd(e) {\r\n\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\tvar idx = trackedTouches.indexOf(e.pointerId);\r\n\t\t\t\tif (idx === -1) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\ttrackedTouches.splice(idx, 1);\r\n\t\t\t}\r\n\r\n\t\t\tif (doubleTap) {\r\n\t\t\t\tif (L.Browser.pointer) {\r\n\t\t\t\t\t// work around .type being readonly with MSPointer* events\r\n\t\t\t\t\tvar newTouch = { },\r\n\t\t\t\t\t\tprop;\r\n\r\n\t\t\t\t\t// jshint forin:false\r\n\t\t\t\t\tfor (var i in touch) {\r\n\t\t\t\t\t\tprop = touch[i];\r\n\t\t\t\t\t\tif (typeof prop === 'function') {\r\n\t\t\t\t\t\t\tnewTouch[i] = prop.bind(touch);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tnewTouch[i] = prop;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttouch = newTouch;\r\n\t\t\t\t}\r\n\t\t\t\ttouch.type = 'dblclick';\r\n\t\t\t\thandler(touch);\r\n\t\t\t\tlast = null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tobj[pre + touchstart + id] = onTouchStart;\r\n\t\tobj[pre + touchend + id] = onTouchEnd;\r\n\r\n\t\t// on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen\r\n\t\t// will not come through to us, so we will lose track of how many touches are ongoing\r\n\t\tvar endElement = L.Browser.pointer ? document.documentElement : obj;\r\n\r\n\t\tobj.addEventListener(touchstart, onTouchStart, false);\r\n\t\tendElement.addEventListener(touchend, onTouchEnd, false);\r\n\r\n\t\tif (L.Browser.pointer) {\r\n\t\t\tendElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveDoubleTapListener: function (obj, id) {\r\n\t\tvar pre = '_leaflet_';\r\n\r\n\t\tobj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false);\r\n\t\t(L.Browser.pointer ? document.documentElement : obj).removeEventListener(\r\n\t\t        this._touchend, obj[pre + this._touchend + id], false);\r\n\r\n\t\tif (L.Browser.pointer) {\r\n\t\t\tdocument.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id],\r\n\t\t\t\tfalse);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\n\n/*\n * Extends L.DomEvent to provide touch support for Internet Explorer and Windows-based devices.\n */\n\nL.extend(L.DomEvent, {\n\n\t//static\n\tPOINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown',\n\tPOINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove',\n\tPOINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup',\n\tPOINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',\n\n\t_pointers: [],\n\t_pointerDocumentListener: false,\n\n\t// Provides a touch events wrapper for (ms)pointer events.\n\t// Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019\n\t//ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890\n\n\taddPointerListener: function (obj, type, handler, id) {\n\n\t\tswitch (type) {\n\t\tcase 'touchstart':\n\t\t\treturn this.addPointerListenerStart(obj, type, handler, id);\n\t\tcase 'touchend':\n\t\t\treturn this.addPointerListenerEnd(obj, type, handler, id);\n\t\tcase 'touchmove':\n\t\t\treturn this.addPointerListenerMove(obj, type, handler, id);\n\t\tdefault:\n\t\t\tthrow 'Unknown touch event type';\n\t\t}\n\t},\n\n\taddPointerListenerStart: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t    pointers = this._pointers;\n\n\t\tvar cb = function (e) {\n\t\t\tif (e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {\n\t\t\t\tL.DomEvent.preventDefault(e);\n\t\t\t}\n\n\t\t\tvar alreadyInArray = false;\n\t\t\tfor (var i = 0; i < pointers.length; i++) {\n\t\t\t\tif (pointers[i].pointerId === e.pointerId) {\n\t\t\t\t\talreadyInArray = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!alreadyInArray) {\n\t\t\t\tpointers.push(e);\n\t\t\t}\n\n\t\t\te.touches = pointers.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t};\n\n\t\tobj[pre + 'touchstart' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_DOWN, cb, false);\n\n\t\t// need to also listen for end events to keep the _pointers list accurate\n\t\t// this needs to be on the body and never go away\n\t\tif (!this._pointerDocumentListener) {\n\t\t\tvar internalCb = function (e) {\n\t\t\t\tfor (var i = 0; i < pointers.length; i++) {\n\t\t\t\t\tif (pointers[i].pointerId === e.pointerId) {\n\t\t\t\t\t\tpointers.splice(i, 1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\t//We listen on the documentElement as any drags that end by moving the touch off the screen get fired there\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_UP, internalCb, false);\n\t\t\tdocument.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false);\n\n\t\t\tthis._pointerDocumentListener = true;\n\t\t}\n\n\t\treturn this;\n\t},\n\n\taddPointerListenerMove: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t    touches = this._pointers;\n\n\t\tfunction cb(e) {\n\n\t\t\t// don't fire touch moves when mouse isn't down\n\t\t\tif ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }\n\n\t\t\tfor (var i = 0; i < touches.length; i++) {\n\t\t\t\tif (touches[i].pointerId === e.pointerId) {\n\t\t\t\t\ttouches[i] = e;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\te.touches = touches.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t}\n\n\t\tobj[pre + 'touchmove' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_MOVE, cb, false);\n\n\t\treturn this;\n\t},\n\n\taddPointerListenerEnd: function (obj, type, handler, id) {\n\t\tvar pre = '_leaflet_',\n\t\t    touches = this._pointers;\n\n\t\tvar cb = function (e) {\n\t\t\tfor (var i = 0; i < touches.length; i++) {\n\t\t\t\tif (touches[i].pointerId === e.pointerId) {\n\t\t\t\t\ttouches.splice(i, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\te.touches = touches.slice();\n\t\t\te.changedTouches = [e];\n\n\t\t\thandler(e);\n\t\t};\n\n\t\tobj[pre + 'touchend' + id] = cb;\n\t\tobj.addEventListener(this.POINTER_UP, cb, false);\n\t\tobj.addEventListener(this.POINTER_CANCEL, cb, false);\n\n\t\treturn this;\n\t},\n\n\tremovePointerListener: function (obj, type, id) {\n\t\tvar pre = '_leaflet_',\n\t\t    cb = obj[pre + type + id];\n\n\t\tswitch (type) {\n\t\tcase 'touchstart':\n\t\t\tobj.removeEventListener(this.POINTER_DOWN, cb, false);\n\t\t\tbreak;\n\t\tcase 'touchmove':\n\t\t\tobj.removeEventListener(this.POINTER_MOVE, cb, false);\n\t\t\tbreak;\n\t\tcase 'touchend':\n\t\t\tobj.removeEventListener(this.POINTER_UP, cb, false);\n\t\t\tobj.removeEventListener(this.POINTER_CANCEL, cb, false);\n\t\t\tbreak;\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n\n/*\n * L.Handler.TouchZoom is used by L.Map to add pinch zoom on supported mobile browsers.\n */\n\nL.Map.mergeOptions({\n\ttouchZoom: L.Browser.touch && !L.Browser.android23,\n\tbounceAtZoomLimits: true\n});\n\nL.Map.TouchZoom = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onTouchStart, this);\n\t},\n\n\t_onTouchStart: function (e) {\n\t\tvar map = this._map;\n\n\t\tif (!e.touches || e.touches.length !== 2 || map._animatingZoom || this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToLayerPoint(e.touches[0]),\n\t\t    p2 = map.mouseEventToLayerPoint(e.touches[1]),\n\t\t    viewCenter = map._getCenterLayerPoint();\n\n\t\tthis._startCenter = p1.add(p2)._divideBy(2);\n\t\tthis._startDist = p1.distanceTo(p2);\n\n\t\tthis._moved = false;\n\t\tthis._zooming = true;\n\n\t\tthis._centerOffset = viewCenter.subtract(this._startCenter);\n\n\t\tif (map._panAnim) {\n\t\t\tmap._panAnim.stop();\n\t\t}\n\n\t\tL.DomEvent\n\t\t    .on(document, 'touchmove', this._onTouchMove, this)\n\t\t    .on(document, 'touchend', this._onTouchEnd, this);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_onTouchMove: function (e) {\n\t\tvar map = this._map;\n\n\t\tif (!e.touches || e.touches.length !== 2 || !this._zooming) { return; }\n\n\t\tvar p1 = map.mouseEventToLayerPoint(e.touches[0]),\n\t\t    p2 = map.mouseEventToLayerPoint(e.touches[1]);\n\n\t\tthis._scale = p1.distanceTo(p2) / this._startDist;\n\t\tthis._delta = p1._add(p2)._divideBy(2)._subtract(this._startCenter);\n\n\t\tif (this._scale === 1) { return; }\n\n\t\tif (!map.options.bounceAtZoomLimits) {\n\t\t\tif ((map.getZoom() === map.getMinZoom() && this._scale < 1) ||\n\t\t\t    (map.getZoom() === map.getMaxZoom() && this._scale > 1)) { return; }\n\t\t}\n\n\t\tif (!this._moved) {\n\t\t\tL.DomUtil.addClass(map._mapPane, 'leaflet-touching');\n\n\t\t\tmap\n\t\t\t    .fire('movestart')\n\t\t\t    .fire('zoomstart');\n\n\t\t\tthis._moved = true;\n\t\t}\n\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\t\tthis._animRequest = L.Util.requestAnimFrame(\n\t\t        this._updateOnMove, this, true, this._map._container);\n\n\t\tL.DomEvent.preventDefault(e);\n\t},\n\n\t_updateOnMove: function () {\n\t\tvar map = this._map,\n\t\t    origin = this._getScaleOrigin(),\n\t\t    center = map.layerPointToLatLng(origin),\n\t\t    zoom = map.getScaleZoom(this._scale);\n\n\t\tmap._animateZoom(center, zoom, this._startCenter, this._scale, this._delta, false, true);\n\t},\n\n\t_onTouchEnd: function () {\n\t\tif (!this._moved || !this._zooming) {\n\t\t\tthis._zooming = false;\n\t\t\treturn;\n\t\t}\n\n\t\tvar map = this._map;\n\n\t\tthis._zooming = false;\n\t\tL.DomUtil.removeClass(map._mapPane, 'leaflet-touching');\n\t\tL.Util.cancelAnimFrame(this._animRequest);\n\n\t\tL.DomEvent\n\t\t    .off(document, 'touchmove', this._onTouchMove)\n\t\t    .off(document, 'touchend', this._onTouchEnd);\n\n\t\tvar origin = this._getScaleOrigin(),\n\t\t    center = map.layerPointToLatLng(origin),\n\n\t\t    oldZoom = map.getZoom(),\n\t\t    floatZoomDelta = map.getScaleZoom(this._scale) - oldZoom,\n\t\t    roundZoomDelta = (floatZoomDelta > 0 ?\n\t\t            Math.ceil(floatZoomDelta) : Math.floor(floatZoomDelta)),\n\n\t\t    zoom = map._limitZoom(oldZoom + roundZoomDelta),\n\t\t    scale = map.getZoomScale(zoom) / this._scale;\n\n\t\tmap._animateZoom(center, zoom, origin, scale);\n\t},\n\n\t_getScaleOrigin: function () {\n\t\tvar centerOffset = this._centerOffset.subtract(this._delta).divideBy(this._scale);\n\t\treturn this._startCenter.add(centerOffset);\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'touchZoom', L.Map.TouchZoom);\n\n\n/*\n * L.Map.Tap is used to enable mobile hacks like quick taps and long hold.\n */\n\nL.Map.mergeOptions({\n\ttap: true,\n\ttapTolerance: 15\n});\n\nL.Map.Tap = L.Handler.extend({\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._map._container, 'touchstart', this._onDown, this);\n\t},\n\n\t_onDown: function (e) {\n\t\tif (!e.touches) { return; }\n\n\t\tL.DomEvent.preventDefault(e);\n\n\t\tthis._fireClick = true;\n\n\t\t// don't simulate click or track longpress if more than 1 touch\n\t\tif (e.touches.length > 1) {\n\t\t\tthis._fireClick = false;\n\t\t\tclearTimeout(this._holdTimeout);\n\t\t\treturn;\n\t\t}\n\n\t\tvar first = e.touches[0],\n\t\t    el = first.target;\n\n\t\tthis._startPos = this._newPos = new L.Point(first.clientX, first.clientY);\n\n\t\t// if touching a link, highlight it\n\t\tif (el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\tL.DomUtil.addClass(el, 'leaflet-active');\n\t\t}\n\n\t\t// simulate long hold but setting a timeout\n\t\tthis._holdTimeout = setTimeout(L.bind(function () {\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._fireClick = false;\n\t\t\t\tthis._onUp();\n\t\t\t\tthis._simulateEvent('contextmenu', first);\n\t\t\t}\n\t\t}, this), 1000);\n\n\t\tL.DomEvent\n\t\t\t.on(document, 'touchmove', this._onMove, this)\n\t\t\t.on(document, 'touchend', this._onUp, this);\n\t},\n\n\t_onUp: function (e) {\n\t\tclearTimeout(this._holdTimeout);\n\n\t\tL.DomEvent\n\t\t\t.off(document, 'touchmove', this._onMove, this)\n\t\t\t.off(document, 'touchend', this._onUp, this);\n\n\t\tif (this._fireClick && e && e.changedTouches) {\n\n\t\t\tvar first = e.changedTouches[0],\n\t\t\t    el = first.target;\n\n\t\t\tif (el && el.tagName && el.tagName.toLowerCase() === 'a') {\n\t\t\t\tL.DomUtil.removeClass(el, 'leaflet-active');\n\t\t\t}\n\n\t\t\t// simulate click if the touch didn't move too much\n\t\t\tif (this._isTapValid()) {\n\t\t\t\tthis._simulateEvent('click', first);\n\t\t\t}\n\t\t}\n\t},\n\n\t_isTapValid: function () {\n\t\treturn this._newPos.distanceTo(this._startPos) <= this._map.options.tapTolerance;\n\t},\n\n\t_onMove: function (e) {\n\t\tvar first = e.touches[0];\n\t\tthis._newPos = new L.Point(first.clientX, first.clientY);\n\t},\n\n\t_simulateEvent: function (type, e) {\n\t\tvar simulatedEvent = document.createEvent('MouseEvents');\n\n\t\tsimulatedEvent._simulated = true;\n\t\te.target._simulatedClick = true;\n\n\t\tsimulatedEvent.initMouseEvent(\n\t\t        type, true, true, window, 1,\n\t\t        e.screenX, e.screenY,\n\t\t        e.clientX, e.clientY,\n\t\t        false, false, false, false, 0, null);\n\n\t\te.target.dispatchEvent(simulatedEvent);\n\t}\n});\n\nif (L.Browser.touch && !L.Browser.pointer) {\n\tL.Map.addInitHook('addHandler', 'tap', L.Map.Tap);\n}\n\n\n/*\n * L.Handler.ShiftDragZoom is used to add shift-drag zoom interaction to the map\n  * (zoom to a selected bounding box), enabled by default.\n */\n\nL.Map.mergeOptions({\n\tboxZoom: true\n});\n\nL.Map.BoxZoom = L.Handler.extend({\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\t\tthis._container = map._container;\n\t\tthis._pane = map._panes.overlayPane;\n\t\tthis._moved = false;\n\t},\n\n\taddHooks: function () {\n\t\tL.DomEvent.on(this._container, 'mousedown', this._onMouseDown, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tL.DomEvent.off(this._container, 'mousedown', this._onMouseDown);\n\t\tthis._moved = false;\n\t},\n\n\tmoved: function () {\n\t\treturn this._moved;\n\t},\n\n\t_onMouseDown: function (e) {\n\t\tthis._moved = false;\n\n\t\tif (!e.shiftKey || ((e.which !== 1) && (e.button !== 1))) { return false; }\n\n\t\tL.DomUtil.disableTextSelection();\n\t\tL.DomUtil.disableImageDrag();\n\n\t\tthis._startLayerPoint = this._map.mouseEventToLayerPoint(e);\n\n\t\tL.DomEvent\n\t\t    .on(document, 'mousemove', this._onMouseMove, this)\n\t\t    .on(document, 'mouseup', this._onMouseUp, this)\n\t\t    .on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onMouseMove: function (e) {\n\t\tif (!this._moved) {\n\t\t\tthis._box = L.DomUtil.create('div', 'leaflet-zoom-box', this._pane);\n\t\t\tL.DomUtil.setPosition(this._box, this._startLayerPoint);\n\n\t\t\t//TODO refactor: move cursor to styles\n\t\t\tthis._container.style.cursor = 'crosshair';\n\t\t\tthis._map.fire('boxzoomstart');\n\t\t}\n\n\t\tvar startPoint = this._startLayerPoint,\n\t\t    box = this._box,\n\n\t\t    layerPoint = this._map.mouseEventToLayerPoint(e),\n\t\t    offset = layerPoint.subtract(startPoint),\n\n\t\t    newPos = new L.Point(\n\t\t        Math.min(layerPoint.x, startPoint.x),\n\t\t        Math.min(layerPoint.y, startPoint.y));\n\n\t\tL.DomUtil.setPosition(box, newPos);\n\n\t\tthis._moved = true;\n\n\t\t// TODO refactor: remove hardcoded 4 pixels\n\t\tbox.style.width  = (Math.max(0, Math.abs(offset.x) - 4)) + 'px';\n\t\tbox.style.height = (Math.max(0, Math.abs(offset.y) - 4)) + 'px';\n\t},\n\n\t_finish: function () {\n\t\tif (this._moved) {\n\t\t\tthis._pane.removeChild(this._box);\n\t\t\tthis._container.style.cursor = '';\n\t\t}\n\n\t\tL.DomUtil.enableTextSelection();\n\t\tL.DomUtil.enableImageDrag();\n\n\t\tL.DomEvent\n\t\t    .off(document, 'mousemove', this._onMouseMove)\n\t\t    .off(document, 'mouseup', this._onMouseUp)\n\t\t    .off(document, 'keydown', this._onKeyDown);\n\t},\n\n\t_onMouseUp: function (e) {\n\n\t\tthis._finish();\n\n\t\tvar map = this._map,\n\t\t    layerPoint = map.mouseEventToLayerPoint(e);\n\n\t\tif (this._startLayerPoint.equals(layerPoint)) { return; }\n\n\t\tvar bounds = new L.LatLngBounds(\n\t\t        map.layerPointToLatLng(this._startLayerPoint),\n\t\t        map.layerPointToLatLng(layerPoint));\n\n\t\tmap.fitBounds(bounds);\n\n\t\tmap.fire('boxzoomend', {\n\t\t\tboxZoomBounds: bounds\n\t\t});\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tif (e.keyCode === 27) {\n\t\t\tthis._finish();\n\t\t}\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'boxZoom', L.Map.BoxZoom);\n\n\n/*\n * L.Map.Keyboard is handling keyboard interaction with the map, enabled by default.\n */\n\nL.Map.mergeOptions({\n\tkeyboard: true,\n\tkeyboardPanOffset: 80,\n\tkeyboardZoomOffset: 1\n});\n\nL.Map.Keyboard = L.Handler.extend({\n\n\tkeyCodes: {\n\t\tleft:    [37],\n\t\tright:   [39],\n\t\tdown:    [40],\n\t\tup:      [38],\n\t\tzoomIn:  [187, 107, 61, 171],\n\t\tzoomOut: [189, 109, 173]\n\t},\n\n\tinitialize: function (map) {\n\t\tthis._map = map;\n\n\t\tthis._setPanOffset(map.options.keyboardPanOffset);\n\t\tthis._setZoomOffset(map.options.keyboardZoomOffset);\n\t},\n\n\taddHooks: function () {\n\t\tvar container = this._map._container;\n\n\t\t// make the container focusable by tabbing\n\t\tif (container.tabIndex === -1) {\n\t\t\tcontainer.tabIndex = '0';\n\t\t}\n\n\t\tL.DomEvent\n\t\t    .on(container, 'focus', this._onFocus, this)\n\t\t    .on(container, 'blur', this._onBlur, this)\n\t\t    .on(container, 'mousedown', this._onMouseDown, this);\n\n\t\tthis._map\n\t\t    .on('focus', this._addHooks, this)\n\t\t    .on('blur', this._removeHooks, this);\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._removeHooks();\n\n\t\tvar container = this._map._container;\n\n\t\tL.DomEvent\n\t\t    .off(container, 'focus', this._onFocus, this)\n\t\t    .off(container, 'blur', this._onBlur, this)\n\t\t    .off(container, 'mousedown', this._onMouseDown, this);\n\n\t\tthis._map\n\t\t    .off('focus', this._addHooks, this)\n\t\t    .off('blur', this._removeHooks, this);\n\t},\n\n\t_onMouseDown: function () {\n\t\tif (this._focused) { return; }\n\n\t\tvar body = document.body,\n\t\t    docEl = document.documentElement,\n\t\t    top = body.scrollTop || docEl.scrollTop,\n\t\t    left = body.scrollLeft || docEl.scrollLeft;\n\n\t\tthis._map._container.focus();\n\n\t\twindow.scrollTo(left, top);\n\t},\n\n\t_onFocus: function () {\n\t\tthis._focused = true;\n\t\tthis._map.fire('focus');\n\t},\n\n\t_onBlur: function () {\n\t\tthis._focused = false;\n\t\tthis._map.fire('blur');\n\t},\n\n\t_setPanOffset: function (pan) {\n\t\tvar keys = this._panKeys = {},\n\t\t    codes = this.keyCodes,\n\t\t    i, len;\n\n\t\tfor (i = 0, len = codes.left.length; i < len; i++) {\n\t\t\tkeys[codes.left[i]] = [-1 * pan, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.right.length; i < len; i++) {\n\t\t\tkeys[codes.right[i]] = [pan, 0];\n\t\t}\n\t\tfor (i = 0, len = codes.down.length; i < len; i++) {\n\t\t\tkeys[codes.down[i]] = [0, pan];\n\t\t}\n\t\tfor (i = 0, len = codes.up.length; i < len; i++) {\n\t\t\tkeys[codes.up[i]] = [0, -1 * pan];\n\t\t}\n\t},\n\n\t_setZoomOffset: function (zoom) {\n\t\tvar keys = this._zoomKeys = {},\n\t\t    codes = this.keyCodes,\n\t\t    i, len;\n\n\t\tfor (i = 0, len = codes.zoomIn.length; i < len; i++) {\n\t\t\tkeys[codes.zoomIn[i]] = zoom;\n\t\t}\n\t\tfor (i = 0, len = codes.zoomOut.length; i < len; i++) {\n\t\t\tkeys[codes.zoomOut[i]] = -zoom;\n\t\t}\n\t},\n\n\t_addHooks: function () {\n\t\tL.DomEvent.on(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_removeHooks: function () {\n\t\tL.DomEvent.off(document, 'keydown', this._onKeyDown, this);\n\t},\n\n\t_onKeyDown: function (e) {\n\t\tvar key = e.keyCode,\n\t\t    map = this._map;\n\n\t\tif (key in this._panKeys) {\n\n\t\t\tif (map._panAnim && map._panAnim._inProgress) { return; }\n\n\t\t\tmap.panBy(this._panKeys[key]);\n\n\t\t\tif (map.options.maxBounds) {\n\t\t\t\tmap.panInsideBounds(map.options.maxBounds);\n\t\t\t}\n\n\t\t} else if (key in this._zoomKeys) {\n\t\t\tmap.setZoom(map.getZoom() + this._zoomKeys[key]);\n\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tL.DomEvent.stop(e);\n\t}\n});\n\nL.Map.addInitHook('addHandler', 'keyboard', L.Map.Keyboard);\n\n\n/*\n * L.Handler.MarkerDrag is used internally by L.Marker to make the markers draggable.\n */\n\nL.Handler.MarkerDrag = L.Handler.extend({\n\tinitialize: function (marker) {\n\t\tthis._marker = marker;\n\t},\n\n\taddHooks: function () {\n\t\tvar icon = this._marker._icon;\n\t\tif (!this._draggable) {\n\t\t\tthis._draggable = new L.Draggable(icon, icon);\n\t\t}\n\n\t\tthis._draggable\n\t\t\t.on('dragstart', this._onDragStart, this)\n\t\t\t.on('drag', this._onDrag, this)\n\t\t\t.on('dragend', this._onDragEnd, this);\n\t\tthis._draggable.enable();\n\t\tL.DomUtil.addClass(this._marker._icon, 'leaflet-marker-draggable');\n\t},\n\n\tremoveHooks: function () {\n\t\tthis._draggable\n\t\t\t.off('dragstart', this._onDragStart, this)\n\t\t\t.off('drag', this._onDrag, this)\n\t\t\t.off('dragend', this._onDragEnd, this);\n\n\t\tthis._draggable.disable();\n\t\tL.DomUtil.removeClass(this._marker._icon, 'leaflet-marker-draggable');\n\t},\n\n\tmoved: function () {\n\t\treturn this._draggable && this._draggable._moved;\n\t},\n\n\t_onDragStart: function () {\n\t\tthis._marker\n\t\t    .closePopup()\n\t\t    .fire('movestart')\n\t\t    .fire('dragstart');\n\t},\n\n\t_onDrag: function () {\n\t\tvar marker = this._marker,\n\t\t    shadow = marker._shadow,\n\t\t    iconPos = L.DomUtil.getPosition(marker._icon),\n\t\t    latlng = marker._map.layerPointToLatLng(iconPos);\n\n\t\t// update shadow position\n\t\tif (shadow) {\n\t\t\tL.DomUtil.setPosition(shadow, iconPos);\n\t\t}\n\n\t\tmarker._latlng = latlng;\n\n\t\tmarker\n\t\t    .fire('move', {latlng: latlng})\n\t\t    .fire('drag');\n\t},\n\n\t_onDragEnd: function (e) {\n\t\tthis._marker\n\t\t    .fire('moveend')\n\t\t    .fire('dragend', e);\n\t}\n});\n\n\n/*\r\n * L.Control is a base class for implementing map controls. Handles positioning.\r\n * All other controls extend from this class.\r\n */\r\n\r\nL.Control = L.Class.extend({\r\n\toptions: {\r\n\t\tposition: 'topright'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\t},\r\n\r\n\tgetPosition: function () {\r\n\t\treturn this.options.position;\r\n\t},\r\n\r\n\tsetPosition: function (position) {\r\n\t\tvar map = this._map;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.removeControl(this);\r\n\t\t}\r\n\r\n\t\tthis.options.position = position;\r\n\r\n\t\tif (map) {\r\n\t\t\tmap.addControl(this);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tgetContainer: function () {\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\taddTo: function (map) {\r\n\t\tthis._map = map;\r\n\r\n\t\tvar container = this._container = this.onAdd(map),\r\n\t\t    pos = this.getPosition(),\r\n\t\t    corner = map._controlCorners[pos];\r\n\r\n\t\tL.DomUtil.addClass(container, 'leaflet-control');\r\n\r\n\t\tif (pos.indexOf('bottom') !== -1) {\r\n\t\t\tcorner.insertBefore(container, corner.firstChild);\r\n\t\t} else {\r\n\t\t\tcorner.appendChild(container);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveFrom: function (map) {\r\n\t\tvar pos = this.getPosition(),\r\n\t\t    corner = map._controlCorners[pos];\r\n\r\n\t\tcorner.removeChild(this._container);\r\n\t\tthis._map = null;\r\n\r\n\t\tif (this.onRemove) {\r\n\t\t\tthis.onRemove(map);\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_refocusOnMap: function () {\r\n\t\tif (this._map) {\r\n\t\t\tthis._map.getContainer().focus();\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.control = function (options) {\r\n\treturn new L.Control(options);\r\n};\r\n\r\n\r\n// adds control-related methods to L.Map\r\n\r\nL.Map.include({\r\n\taddControl: function (control) {\r\n\t\tcontrol.addTo(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveControl: function (control) {\r\n\t\tcontrol.removeFrom(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initControlPos: function () {\r\n\t\tvar corners = this._controlCorners = {},\r\n\t\t    l = 'leaflet-',\r\n\t\t    container = this._controlContainer =\r\n\t\t            L.DomUtil.create('div', l + 'control-container', this._container);\r\n\r\n\t\tfunction createCorner(vSide, hSide) {\r\n\t\t\tvar className = l + vSide + ' ' + l + hSide;\r\n\r\n\t\t\tcorners[vSide + hSide] = L.DomUtil.create('div', className, container);\r\n\t\t}\r\n\r\n\t\tcreateCorner('top', 'left');\r\n\t\tcreateCorner('top', 'right');\r\n\t\tcreateCorner('bottom', 'left');\r\n\t\tcreateCorner('bottom', 'right');\r\n\t},\r\n\r\n\t_clearControlPos: function () {\r\n\t\tthis._container.removeChild(this._controlContainer);\r\n\t}\r\n});\r\n\n\n/*\r\n * L.Control.Zoom is used for the default zoom buttons on the map.\r\n */\r\n\r\nL.Control.Zoom = L.Control.extend({\r\n\toptions: {\r\n\t\tposition: 'topleft',\r\n\t\tzoomInText: '+',\r\n\t\tzoomInTitle: 'Zoom in',\r\n\t\tzoomOutText: '-',\r\n\t\tzoomOutTitle: 'Zoom out'\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tvar zoomName = 'leaflet-control-zoom',\r\n\t\t    container = L.DomUtil.create('div', zoomName + ' leaflet-bar');\r\n\r\n\t\tthis._map = map;\r\n\r\n\t\tthis._zoomInButton  = this._createButton(\r\n\t\t        this.options.zoomInText, this.options.zoomInTitle,\r\n\t\t        zoomName + '-in',  container, this._zoomIn,  this);\r\n\t\tthis._zoomOutButton = this._createButton(\r\n\t\t        this.options.zoomOutText, this.options.zoomOutTitle,\r\n\t\t        zoomName + '-out', container, this._zoomOut, this);\r\n\r\n\t\tthis._updateDisabled();\r\n\t\tmap.on('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\r\n\t\treturn container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap.off('zoomend zoomlevelschange', this._updateDisabled, this);\r\n\t},\r\n\r\n\t_zoomIn: function (e) {\r\n\t\tthis._map.zoomIn(e.shiftKey ? 3 : 1);\r\n\t},\r\n\r\n\t_zoomOut: function (e) {\r\n\t\tthis._map.zoomOut(e.shiftKey ? 3 : 1);\r\n\t},\r\n\r\n\t_createButton: function (html, title, className, container, fn, context) {\r\n\t\tvar link = L.DomUtil.create('a', className, container);\r\n\t\tlink.innerHTML = html;\r\n\t\tlink.href = '#';\r\n\t\tlink.title = title;\r\n\r\n\t\tvar stop = L.DomEvent.stopPropagation;\r\n\r\n\t\tL.DomEvent\r\n\t\t    .on(link, 'click', stop)\r\n\t\t    .on(link, 'mousedown', stop)\r\n\t\t    .on(link, 'dblclick', stop)\r\n\t\t    .on(link, 'click', L.DomEvent.preventDefault)\r\n\t\t    .on(link, 'click', fn, context)\r\n\t\t    .on(link, 'click', this._refocusOnMap, context);\r\n\r\n\t\treturn link;\r\n\t},\r\n\r\n\t_updateDisabled: function () {\r\n\t\tvar map = this._map,\r\n\t\t\tclassName = 'leaflet-disabled';\r\n\r\n\t\tL.DomUtil.removeClass(this._zoomInButton, className);\r\n\t\tL.DomUtil.removeClass(this._zoomOutButton, className);\r\n\r\n\t\tif (map._zoom === map.getMinZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomOutButton, className);\r\n\t\t}\r\n\t\tif (map._zoom === map.getMaxZoom()) {\r\n\t\t\tL.DomUtil.addClass(this._zoomInButton, className);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.mergeOptions({\r\n\tzoomControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.zoomControl) {\r\n\t\tthis.zoomControl = new L.Control.Zoom();\r\n\t\tthis.addControl(this.zoomControl);\r\n\t}\r\n});\r\n\r\nL.control.zoom = function (options) {\r\n\treturn new L.Control.Zoom(options);\r\n};\r\n\r\n\n\n/*\r\n * L.Control.Attribution is used for displaying attribution on the map (added by default).\r\n */\r\n\r\nL.Control.Attribution = L.Control.extend({\r\n\toptions: {\r\n\t\tposition: 'bottomright',\r\n\t\tprefix: '<a href=\"http://leafletjs.com\" title=\"A JS library for interactive maps\">Leaflet</a>'\r\n\t},\r\n\r\n\tinitialize: function (options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._attributions = {};\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._container = L.DomUtil.create('div', 'leaflet-control-attribution');\r\n\t\tL.DomEvent.disableClickPropagation(this._container);\r\n\r\n\t\tfor (var i in map._layers) {\r\n\t\t\tif (map._layers[i].getAttribution) {\r\n\t\t\t\tthis.addAttribution(map._layers[i].getAttribution());\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tmap\r\n\t\t    .on('layeradd', this._onLayerAdd, this)\r\n\t\t    .on('layerremove', this._onLayerRemove, this);\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap\r\n\t\t    .off('layeradd', this._onLayerAdd)\r\n\t\t    .off('layerremove', this._onLayerRemove);\r\n\r\n\t},\r\n\r\n\tsetPrefix: function (prefix) {\r\n\t\tthis.options.prefix = prefix;\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\taddAttribution: function (text) {\r\n\t\tif (!text) { return; }\r\n\r\n\t\tif (!this._attributions[text]) {\r\n\t\t\tthis._attributions[text] = 0;\r\n\t\t}\r\n\t\tthis._attributions[text]++;\r\n\r\n\t\tthis._update();\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveAttribution: function (text) {\r\n\t\tif (!text) { return; }\r\n\r\n\t\tif (this._attributions[text]) {\r\n\t\t\tthis._attributions[text]--;\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._map) { return; }\r\n\r\n\t\tvar attribs = [];\r\n\r\n\t\tfor (var i in this._attributions) {\r\n\t\t\tif (this._attributions[i]) {\r\n\t\t\t\tattribs.push(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar prefixAndAttribs = [];\r\n\r\n\t\tif (this.options.prefix) {\r\n\t\t\tprefixAndAttribs.push(this.options.prefix);\r\n\t\t}\r\n\t\tif (attribs.length) {\r\n\t\t\tprefixAndAttribs.push(attribs.join(', '));\r\n\t\t}\r\n\r\n\t\tthis._container.innerHTML = prefixAndAttribs.join(' | ');\r\n\t},\r\n\r\n\t_onLayerAdd: function (e) {\r\n\t\tif (e.layer.getAttribution) {\r\n\t\t\tthis.addAttribution(e.layer.getAttribution());\r\n\t\t}\r\n\t},\r\n\r\n\t_onLayerRemove: function (e) {\r\n\t\tif (e.layer.getAttribution) {\r\n\t\t\tthis.removeAttribution(e.layer.getAttribution());\r\n\t\t}\r\n\t}\r\n});\r\n\r\nL.Map.mergeOptions({\r\n\tattributionControl: true\r\n});\r\n\r\nL.Map.addInitHook(function () {\r\n\tif (this.options.attributionControl) {\r\n\t\tthis.attributionControl = (new L.Control.Attribution()).addTo(this);\r\n\t}\r\n});\r\n\r\nL.control.attribution = function (options) {\r\n\treturn new L.Control.Attribution(options);\r\n};\r\n\n\n/*\n * L.Control.Scale is used for displaying metric/imperial scale on the map.\n */\n\nL.Control.Scale = L.Control.extend({\n\toptions: {\n\t\tposition: 'bottomleft',\n\t\tmaxWidth: 100,\n\t\tmetric: true,\n\t\timperial: true,\n\t\tupdateWhenIdle: false\n\t},\n\n\tonAdd: function (map) {\n\t\tthis._map = map;\n\n\t\tvar className = 'leaflet-control-scale',\n\t\t    container = L.DomUtil.create('div', className),\n\t\t    options = this.options;\n\n\t\tthis._addScales(options, className, container);\n\n\t\tmap.on(options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t\tmap.whenReady(this._update, this);\n\n\t\treturn container;\n\t},\n\n\tonRemove: function (map) {\n\t\tmap.off(this.options.updateWhenIdle ? 'moveend' : 'move', this._update, this);\n\t},\n\n\t_addScales: function (options, className, container) {\n\t\tif (options.metric) {\n\t\t\tthis._mScale = L.DomUtil.create('div', className + '-line', container);\n\t\t}\n\t\tif (options.imperial) {\n\t\t\tthis._iScale = L.DomUtil.create('div', className + '-line', container);\n\t\t}\n\t},\n\n\t_update: function () {\n\t\tvar bounds = this._map.getBounds(),\n\t\t    centerLat = bounds.getCenter().lat,\n\t\t    halfWorldMeters = 6378137 * Math.PI * Math.cos(centerLat * Math.PI / 180),\n\t\t    dist = halfWorldMeters * (bounds.getNorthEast().lng - bounds.getSouthWest().lng) / 180,\n\n\t\t    size = this._map.getSize(),\n\t\t    options = this.options,\n\t\t    maxMeters = 0;\n\n\t\tif (size.x > 0) {\n\t\t\tmaxMeters = dist * (options.maxWidth / size.x);\n\t\t}\n\n\t\tthis._updateScales(options, maxMeters);\n\t},\n\n\t_updateScales: function (options, maxMeters) {\n\t\tif (options.metric && maxMeters) {\n\t\t\tthis._updateMetric(maxMeters);\n\t\t}\n\n\t\tif (options.imperial && maxMeters) {\n\t\t\tthis._updateImperial(maxMeters);\n\t\t}\n\t},\n\n\t_updateMetric: function (maxMeters) {\n\t\tvar meters = this._getRoundNum(maxMeters);\n\n\t\tthis._mScale.style.width = this._getScaleWidth(meters / maxMeters) + 'px';\n\t\tthis._mScale.innerHTML = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';\n\t},\n\n\t_updateImperial: function (maxMeters) {\n\t\tvar maxFeet = maxMeters * 3.2808399,\n\t\t    scale = this._iScale,\n\t\t    maxMiles, miles, feet;\n\n\t\tif (maxFeet > 5280) {\n\t\t\tmaxMiles = maxFeet / 5280;\n\t\t\tmiles = this._getRoundNum(maxMiles);\n\n\t\t\tscale.style.width = this._getScaleWidth(miles / maxMiles) + 'px';\n\t\t\tscale.innerHTML = miles + ' mi';\n\n\t\t} else {\n\t\t\tfeet = this._getRoundNum(maxFeet);\n\n\t\t\tscale.style.width = this._getScaleWidth(feet / maxFeet) + 'px';\n\t\t\tscale.innerHTML = feet + ' ft';\n\t\t}\n\t},\n\n\t_getScaleWidth: function (ratio) {\n\t\treturn Math.round(this.options.maxWidth * ratio) - 10;\n\t},\n\n\t_getRoundNum: function (num) {\n\t\tvar pow10 = Math.pow(10, (Math.floor(num) + '').length - 1),\n\t\t    d = num / pow10;\n\n\t\td = d >= 10 ? 10 : d >= 5 ? 5 : d >= 3 ? 3 : d >= 2 ? 2 : 1;\n\n\t\treturn pow10 * d;\n\t}\n});\n\nL.control.scale = function (options) {\n\treturn new L.Control.Scale(options);\n};\n\n\n/*\r\n * L.Control.Layers is a control to allow users to switch between different layers on the map.\r\n */\r\n\r\nL.Control.Layers = L.Control.extend({\r\n\toptions: {\r\n\t\tcollapsed: true,\r\n\t\tposition: 'topright',\r\n\t\tautoZIndex: true\r\n\t},\r\n\r\n\tinitialize: function (baseLayers, overlays, options) {\r\n\t\tL.setOptions(this, options);\r\n\r\n\t\tthis._layers = {};\r\n\t\tthis._lastZIndex = 0;\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tfor (var i in baseLayers) {\r\n\t\t\tthis._addLayer(baseLayers[i], i);\r\n\t\t}\r\n\r\n\t\tfor (i in overlays) {\r\n\t\t\tthis._addLayer(overlays[i], i, true);\r\n\t\t}\r\n\t},\r\n\r\n\tonAdd: function (map) {\r\n\t\tthis._initLayout();\r\n\t\tthis._update();\r\n\r\n\t\tmap\r\n\t\t    .on('layeradd', this._onLayerChange, this)\r\n\t\t    .on('layerremove', this._onLayerChange, this);\r\n\r\n\t\treturn this._container;\r\n\t},\r\n\r\n\tonRemove: function (map) {\r\n\t\tmap\r\n\t\t    .off('layeradd', this._onLayerChange, this)\r\n\t\t    .off('layerremove', this._onLayerChange, this);\r\n\t},\r\n\r\n\taddBaseLayer: function (layer, name) {\r\n\t\tthis._addLayer(layer, name);\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\taddOverlay: function (layer, name) {\r\n\t\tthis._addLayer(layer, name, true);\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveLayer: function (layer) {\r\n\t\tvar id = L.stamp(layer);\r\n\t\tdelete this._layers[id];\r\n\t\tthis._update();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_initLayout: function () {\r\n\t\tvar className = 'leaflet-control-layers',\r\n\t\t    container = this._container = L.DomUtil.create('div', className);\r\n\r\n\t\t//Makes this work on IE10 Touch devices by stopping it from firing a mouseout event when the touch is released\r\n\t\tcontainer.setAttribute('aria-haspopup', true);\r\n\r\n\t\tif (!L.Browser.touch) {\r\n\t\t\tL.DomEvent\r\n\t\t\t\t.disableClickPropagation(container)\r\n\t\t\t\t.disableScrollPropagation(container);\r\n\t\t} else {\r\n\t\t\tL.DomEvent.on(container, 'click', L.DomEvent.stopPropagation);\r\n\t\t}\r\n\r\n\t\tvar form = this._form = L.DomUtil.create('form', className + '-list');\r\n\r\n\t\tif (this.options.collapsed) {\r\n\t\t\tif (!L.Browser.android) {\r\n\t\t\t\tL.DomEvent\r\n\t\t\t\t    .on(container, 'mouseover', this._expand, this)\r\n\t\t\t\t    .on(container, 'mouseout', this._collapse, this);\r\n\t\t\t}\r\n\t\t\tvar link = this._layersLink = L.DomUtil.create('a', className + '-toggle', container);\r\n\t\t\tlink.href = '#';\r\n\t\t\tlink.title = 'Layers';\r\n\r\n\t\t\tif (L.Browser.touch) {\r\n\t\t\t\tL.DomEvent\r\n\t\t\t\t    .on(link, 'click', L.DomEvent.stop)\r\n\t\t\t\t    .on(link, 'click', this._expand, this);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tL.DomEvent.on(link, 'focus', this._expand, this);\r\n\t\t\t}\r\n\t\t\t//Work around for Firefox android issue https://github.com/Leaflet/Leaflet/issues/2033\r\n\t\t\tL.DomEvent.on(form, 'click', function () {\r\n\t\t\t\tsetTimeout(L.bind(this._onInputClick, this), 0);\r\n\t\t\t}, this);\r\n\r\n\t\t\tthis._map.on('click', this._collapse, this);\r\n\t\t\t// TODO keyboard accessibility\r\n\t\t} else {\r\n\t\t\tthis._expand();\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList = L.DomUtil.create('div', className + '-base', form);\r\n\t\tthis._separator = L.DomUtil.create('div', className + '-separator', form);\r\n\t\tthis._overlaysList = L.DomUtil.create('div', className + '-overlays', form);\r\n\r\n\t\tcontainer.appendChild(form);\r\n\t},\r\n\r\n\t_addLayer: function (layer, name, overlay) {\r\n\t\tvar id = L.stamp(layer);\r\n\r\n\t\tthis._layers[id] = {\r\n\t\t\tlayer: layer,\r\n\t\t\tname: name,\r\n\t\t\toverlay: overlay\r\n\t\t};\r\n\r\n\t\tif (this.options.autoZIndex && layer.setZIndex) {\r\n\t\t\tthis._lastZIndex++;\r\n\t\t\tlayer.setZIndex(this._lastZIndex);\r\n\t\t}\r\n\t},\r\n\r\n\t_update: function () {\r\n\t\tif (!this._container) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._baseLayersList.innerHTML = '';\r\n\t\tthis._overlaysList.innerHTML = '';\r\n\r\n\t\tvar baseLayersPresent = false,\r\n\t\t    overlaysPresent = false,\r\n\t\t    i, obj;\r\n\r\n\t\tfor (i in this._layers) {\r\n\t\t\tobj = this._layers[i];\r\n\t\t\tthis._addItem(obj);\r\n\t\t\toverlaysPresent = overlaysPresent || obj.overlay;\r\n\t\t\tbaseLayersPresent = baseLayersPresent || !obj.overlay;\r\n\t\t}\r\n\r\n\t\tthis._separator.style.display = overlaysPresent && baseLayersPresent ? '' : 'none';\r\n\t},\r\n\r\n\t_onLayerChange: function (e) {\r\n\t\tvar obj = this._layers[L.stamp(e.layer)];\r\n\r\n\t\tif (!obj) { return; }\r\n\r\n\t\tif (!this._handlingClick) {\r\n\t\t\tthis._update();\r\n\t\t}\r\n\r\n\t\tvar type = obj.overlay ?\r\n\t\t\t(e.type === 'layeradd' ? 'overlayadd' : 'overlayremove') :\r\n\t\t\t(e.type === 'layeradd' ? 'baselayerchange' : null);\r\n\r\n\t\tif (type) {\r\n\t\t\tthis._map.fire(type, obj);\r\n\t\t}\r\n\t},\r\n\r\n\t// IE7 bugs out if you create a radio dynamically, so you have to do it this hacky way (see http://bit.ly/PqYLBe)\r\n\t_createRadioElement: function (name, checked) {\r\n\r\n\t\tvar radioHtml = '<input type=\"radio\" class=\"leaflet-control-layers-selector\" name=\"' + name + '\"';\r\n\t\tif (checked) {\r\n\t\t\tradioHtml += ' checked=\"checked\"';\r\n\t\t}\r\n\t\tradioHtml += '/>';\r\n\r\n\t\tvar radioFragment = document.createElement('div');\r\n\t\tradioFragment.innerHTML = radioHtml;\r\n\r\n\t\treturn radioFragment.firstChild;\r\n\t},\r\n\r\n\t_addItem: function (obj) {\r\n\t\tvar label = document.createElement('label'),\r\n\t\t    input,\r\n\t\t    checked = this._map.hasLayer(obj.layer);\r\n\r\n\t\tif (obj.overlay) {\r\n\t\t\tinput = document.createElement('input');\r\n\t\t\tinput.type = 'checkbox';\r\n\t\t\tinput.className = 'leaflet-control-layers-selector';\r\n\t\t\tinput.defaultChecked = checked;\r\n\t\t} else {\r\n\t\t\tinput = this._createRadioElement('leaflet-base-layers', checked);\r\n\t\t}\r\n\r\n\t\tinput.layerId = L.stamp(obj.layer);\r\n\r\n\t\tL.DomEvent.on(input, 'click', this._onInputClick, this);\r\n\r\n\t\tvar name = document.createElement('span');\r\n\t\tname.innerHTML = ' ' + obj.name;\r\n\r\n\t\tlabel.appendChild(input);\r\n\t\tlabel.appendChild(name);\r\n\r\n\t\tvar container = obj.overlay ? this._overlaysList : this._baseLayersList;\r\n\t\tcontainer.appendChild(label);\r\n\r\n\t\treturn label;\r\n\t},\r\n\r\n\t_onInputClick: function () {\r\n\t\tvar i, input, obj,\r\n\t\t    inputs = this._form.getElementsByTagName('input'),\r\n\t\t    inputsLen = inputs.length;\r\n\r\n\t\tthis._handlingClick = true;\r\n\r\n\t\tfor (i = 0; i < inputsLen; i++) {\r\n\t\t\tinput = inputs[i];\r\n\t\t\tobj = this._layers[input.layerId];\r\n\r\n\t\t\tif (input.checked && !this._map.hasLayer(obj.layer)) {\r\n\t\t\t\tthis._map.addLayer(obj.layer);\r\n\r\n\t\t\t} else if (!input.checked && this._map.hasLayer(obj.layer)) {\r\n\t\t\t\tthis._map.removeLayer(obj.layer);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._handlingClick = false;\r\n\r\n\t\tthis._refocusOnMap();\r\n\t},\r\n\r\n\t_expand: function () {\r\n\t\tL.DomUtil.addClass(this._container, 'leaflet-control-layers-expanded');\r\n\t},\r\n\r\n\t_collapse: function () {\r\n\t\tthis._container.className = this._container.className.replace(' leaflet-control-layers-expanded', '');\r\n\t}\r\n});\r\n\r\nL.control.layers = function (baseLayers, overlays, options) {\r\n\treturn new L.Control.Layers(baseLayers, overlays, options);\r\n};\r\n\n\n/*\n * L.PosAnimation is used by Leaflet internally for pan animations.\n */\n\nL.PosAnimation = L.Class.extend({\n\tincludes: L.Mixin.Events,\n\n\trun: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number])\n\t\tthis.stop();\n\n\t\tthis._el = el;\n\t\tthis._inProgress = true;\n\t\tthis._newPos = newPos;\n\n\t\tthis.fire('start');\n\n\t\tel.style[L.DomUtil.TRANSITION] = 'all ' + (duration || 0.25) +\n\t\t        's cubic-bezier(0,0,' + (easeLinearity || 0.5) + ',1)';\n\n\t\tL.DomEvent.on(el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this);\n\t\tL.DomUtil.setPosition(el, newPos);\n\n\t\t// toggle reflow, Chrome flickers for some reason if you don't do this\n\t\tL.Util.falseFn(el.offsetWidth);\n\n\t\t// there's no native way to track value updates of transitioned properties, so we imitate this\n\t\tthis._stepTimer = setInterval(L.bind(this._onStep, this), 50);\n\t},\n\n\tstop: function () {\n\t\tif (!this._inProgress) { return; }\n\n\t\t// if we just removed the transition property, the element would jump to its final position,\n\t\t// so we need to make it stay at the current position\n\n\t\tL.DomUtil.setPosition(this._el, this._getPos());\n\t\tthis._onTransitionEnd();\n\t\tL.Util.falseFn(this._el.offsetWidth); // force reflow in case we are about to start a new animation\n\t},\n\n\t_onStep: function () {\n\t\tvar stepPos = this._getPos();\n\t\tif (!stepPos) {\n\t\t\tthis._onTransitionEnd();\n\t\t\treturn;\n\t\t}\n\t\t// jshint camelcase: false\n\t\t// make L.DomUtil.getPosition return intermediate position value during animation\n\t\tthis._el._leaflet_pos = stepPos;\n\n\t\tthis.fire('step');\n\t},\n\n\t// you can't easily get intermediate values of properties animated with CSS3 Transitions,\n\t// we need to parse computed style (in case of transform it returns matrix string)\n\n\t_transformRe: /([-+]?(?:\\d*\\.)?\\d+)\\D*, ([-+]?(?:\\d*\\.)?\\d+)\\D*\\)/,\n\n\t_getPos: function () {\n\t\tvar left, top, matches,\n\t\t    el = this._el,\n\t\t    style = window.getComputedStyle(el);\n\n\t\tif (L.Browser.any3d) {\n\t\t\tmatches = style[L.DomUtil.TRANSFORM].match(this._transformRe);\n\t\t\tif (!matches) { return; }\n\t\t\tleft = parseFloat(matches[1]);\n\t\t\ttop  = parseFloat(matches[2]);\n\t\t} else {\n\t\t\tleft = parseFloat(style.left);\n\t\t\ttop  = parseFloat(style.top);\n\t\t}\n\n\t\treturn new L.Point(left, top, true);\n\t},\n\n\t_onTransitionEnd: function () {\n\t\tL.DomEvent.off(this._el, L.DomUtil.TRANSITION_END, this._onTransitionEnd, this);\n\n\t\tif (!this._inProgress) { return; }\n\t\tthis._inProgress = false;\n\n\t\tthis._el.style[L.DomUtil.TRANSITION] = '';\n\n\t\t// jshint camelcase: false\n\t\t// make sure L.DomUtil.getPosition returns the final position value after animation\n\t\tthis._el._leaflet_pos = this._newPos;\n\n\t\tclearInterval(this._stepTimer);\n\n\t\tthis.fire('step').fire('end');\n\t}\n\n});\n\n\n/*\n * Extends L.Map to handle panning animations.\n */\n\nL.Map.include({\n\n\tsetView: function (center, zoom, options) {\n\n\t\tzoom = zoom === undefined ? this._zoom : this._limitZoom(zoom);\n\t\tcenter = this._limitCenter(L.latLng(center), zoom, this.options.maxBounds);\n\t\toptions = options || {};\n\n\t\tif (this._panAnim) {\n\t\t\tthis._panAnim.stop();\n\t\t}\n\n\t\tif (this._loaded && !options.reset && options !== true) {\n\n\t\t\tif (options.animate !== undefined) {\n\t\t\t\toptions.zoom = L.extend({animate: options.animate}, options.zoom);\n\t\t\t\toptions.pan = L.extend({animate: options.animate}, options.pan);\n\t\t\t}\n\n\t\t\t// try animating pan or zoom\n\t\t\tvar animated = (this._zoom !== zoom) ?\n\t\t\t\tthis._tryAnimatedZoom && this._tryAnimatedZoom(center, zoom, options.zoom) :\n\t\t\t\tthis._tryAnimatedPan(center, options.pan);\n\n\t\t\tif (animated) {\n\t\t\t\t// prevent resize handler call, the view will refresh after animation anyway\n\t\t\t\tclearTimeout(this._sizeTimer);\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\n\t\t// animation didn't start, just reset the map view\n\t\tthis._resetView(center, zoom);\n\n\t\treturn this;\n\t},\n\n\tpanBy: function (offset, options) {\n\t\toffset = L.point(offset).round();\n\t\toptions = options || {};\n\n\t\tif (!offset.x && !offset.y) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif (!this._panAnim) {\n\t\t\tthis._panAnim = new L.PosAnimation();\n\n\t\t\tthis._panAnim.on({\n\t\t\t\t'step': this._onPanTransitionStep,\n\t\t\t\t'end': this._onPanTransitionEnd\n\t\t\t}, this);\n\t\t}\n\n\t\t// don't fire movestart if animating inertia\n\t\tif (!options.noMoveStart) {\n\t\t\tthis.fire('movestart');\n\t\t}\n\n\t\t// animate pan unless animate: false specified\n\t\tif (options.animate !== false) {\n\t\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-pan-anim');\n\n\t\t\tvar newPos = this._getMapPanePos().subtract(offset);\n\t\t\tthis._panAnim.run(this._mapPane, newPos, options.duration || 0.25, options.easeLinearity);\n\t\t} else {\n\t\t\tthis._rawPanBy(offset);\n\t\t\tthis.fire('move').fire('moveend');\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_onPanTransitionStep: function () {\n\t\tthis.fire('move');\n\t},\n\n\t_onPanTransitionEnd: function () {\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-pan-anim');\n\t\tthis.fire('moveend');\n\t},\n\n\t_tryAnimatedPan: function (center, options) {\n\t\t// difference between the new and current centers in pixels\n\t\tvar offset = this._getCenterOffset(center)._floor();\n\n\t\t// don't animate too far unless animate: true specified in options\n\t\tif ((options && options.animate) !== true && !this.getSize().contains(offset)) { return false; }\n\n\t\tthis.panBy(offset, options);\n\n\t\treturn true;\n\t}\n});\n\n\n/*\n * L.PosAnimation fallback implementation that powers Leaflet pan animations\n * in browsers that don't support CSS3 Transitions.\n */\n\nL.PosAnimation = L.DomUtil.TRANSITION ? L.PosAnimation : L.PosAnimation.extend({\n\n\trun: function (el, newPos, duration, easeLinearity) { // (HTMLElement, Point[, Number, Number])\n\t\tthis.stop();\n\n\t\tthis._el = el;\n\t\tthis._inProgress = true;\n\t\tthis._duration = duration || 0.25;\n\t\tthis._easeOutPower = 1 / Math.max(easeLinearity || 0.5, 0.2);\n\n\t\tthis._startPos = L.DomUtil.getPosition(el);\n\t\tthis._offset = newPos.subtract(this._startPos);\n\t\tthis._startTime = +new Date();\n\n\t\tthis.fire('start');\n\n\t\tthis._animate();\n\t},\n\n\tstop: function () {\n\t\tif (!this._inProgress) { return; }\n\n\t\tthis._step();\n\t\tthis._complete();\n\t},\n\n\t_animate: function () {\n\t\t// animation loop\n\t\tthis._animId = L.Util.requestAnimFrame(this._animate, this);\n\t\tthis._step();\n\t},\n\n\t_step: function () {\n\t\tvar elapsed = (+new Date()) - this._startTime,\n\t\t    duration = this._duration * 1000;\n\n\t\tif (elapsed < duration) {\n\t\t\tthis._runFrame(this._easeOut(elapsed / duration));\n\t\t} else {\n\t\t\tthis._runFrame(1);\n\t\t\tthis._complete();\n\t\t}\n\t},\n\n\t_runFrame: function (progress) {\n\t\tvar pos = this._startPos.add(this._offset.multiplyBy(progress));\n\t\tL.DomUtil.setPosition(this._el, pos);\n\n\t\tthis.fire('step');\n\t},\n\n\t_complete: function () {\n\t\tL.Util.cancelAnimFrame(this._animId);\n\n\t\tthis._inProgress = false;\n\t\tthis.fire('end');\n\t},\n\n\t_easeOut: function (t) {\n\t\treturn 1 - Math.pow(1 - t, this._easeOutPower);\n\t}\n});\n\n\n/*\n * Extends L.Map to handle zoom animations.\n */\n\nL.Map.mergeOptions({\n\tzoomAnimation: true,\n\tzoomAnimationThreshold: 4\n});\n\nif (L.DomUtil.TRANSITION) {\n\n\tL.Map.addInitHook(function () {\n\t\t// don't animate on browsers without hardware-accelerated transitions or old Android/Opera\n\t\tthis._zoomAnimated = this.options.zoomAnimation && L.DomUtil.TRANSITION &&\n\t\t\t\tL.Browser.any3d && !L.Browser.android23 && !L.Browser.mobileOpera;\n\n\t\t// zoom transitions run with the same duration for all layers, so if one of transitionend events\n\t\t// happens after starting zoom animation (propagating to the map pane), we know that it ended globally\n\t\tif (this._zoomAnimated) {\n\t\t\tL.DomEvent.on(this._mapPane, L.DomUtil.TRANSITION_END, this._catchTransitionEnd, this);\n\t\t}\n\t});\n}\n\nL.Map.include(!L.DomUtil.TRANSITION ? {} : {\n\n\t_catchTransitionEnd: function (e) {\n\t\tif (this._animatingZoom && e.propertyName.indexOf('transform') >= 0) {\n\t\t\tthis._onZoomTransitionEnd();\n\t\t}\n\t},\n\n\t_nothingToAnimate: function () {\n\t\treturn !this._container.getElementsByClassName('leaflet-zoom-animated').length;\n\t},\n\n\t_tryAnimatedZoom: function (center, zoom, options) {\n\n\t\tif (this._animatingZoom) { return true; }\n\n\t\toptions = options || {};\n\n\t\t// don't animate if disabled, not supported or zoom difference is too large\n\t\tif (!this._zoomAnimated || options.animate === false || this._nothingToAnimate() ||\n\t\t        Math.abs(zoom - this._zoom) > this.options.zoomAnimationThreshold) { return false; }\n\n\t\t// offset is the pixel coords of the zoom origin relative to the current center\n\t\tvar scale = this.getZoomScale(zoom),\n\t\t    offset = this._getCenterOffset(center)._divideBy(1 - 1 / scale),\n\t\t\torigin = this._getCenterLayerPoint()._add(offset);\n\n\t\t// don't animate if the zoom origin isn't within one screen from the current center, unless forced\n\t\tif (options.animate !== true && !this.getSize().contains(offset)) { return false; }\n\n\t\tthis\n\t\t    .fire('movestart')\n\t\t    .fire('zoomstart');\n\n\t\tthis._animateZoom(center, zoom, origin, scale, null, true);\n\n\t\treturn true;\n\t},\n\n\t_animateZoom: function (center, zoom, origin, scale, delta, backwards, forTouchZoom) {\n\n\t\tif (!forTouchZoom) {\n\t\t\tthis._animatingZoom = true;\n\t\t}\n\n\t\t// put transform transition on all layers with leaflet-zoom-animated class\n\t\tL.DomUtil.addClass(this._mapPane, 'leaflet-zoom-anim');\n\n\t\t// remember what center/zoom to set after animation\n\t\tthis._animateToCenter = center;\n\t\tthis._animateToZoom = zoom;\n\n\t\t// disable any dragging during animation\n\t\tif (L.Draggable) {\n\t\t\tL.Draggable._disabled = true;\n\t\t}\n\n\t\tL.Util.requestAnimFrame(function () {\n\t\t\tthis.fire('zoomanim', {\n\t\t\t\tcenter: center,\n\t\t\t\tzoom: zoom,\n\t\t\t\torigin: origin,\n\t\t\t\tscale: scale,\n\t\t\t\tdelta: delta,\n\t\t\t\tbackwards: backwards\n\t\t\t});\n\t\t\t// horrible hack to work around a Chrome bug https://github.com/Leaflet/Leaflet/issues/3689\n\t\t\tsetTimeout(L.bind(this._onZoomTransitionEnd, this), 250);\n\t\t}, this);\n\t},\n\n\t_onZoomTransitionEnd: function () {\n\t\tif (!this._animatingZoom) { return; }\n\n\t\tthis._animatingZoom = false;\n\n\t\tL.DomUtil.removeClass(this._mapPane, 'leaflet-zoom-anim');\n\n\t\tL.Util.requestAnimFrame(function () {\n\t\t\tthis._resetView(this._animateToCenter, this._animateToZoom, true, true);\n\n\t\t\tif (L.Draggable) {\n\t\t\t\tL.Draggable._disabled = false;\n\t\t\t}\n\t\t}, this);\n\t}\n});\n\n\n/*\n\tZoom animation logic for L.TileLayer.\n*/\n\nL.TileLayer.include({\n\t_animateZoom: function (e) {\n\t\tif (!this._animating) {\n\t\t\tthis._animating = true;\n\t\t\tthis._prepareBgBuffer();\n\t\t}\n\n\t\tvar bg = this._bgBuffer,\n\t\t    transform = L.DomUtil.TRANSFORM,\n\t\t    initialTransform = e.delta ? L.DomUtil.getTranslateString(e.delta) : bg.style[transform],\n\t\t    scaleStr = L.DomUtil.getScaleString(e.scale, e.origin);\n\n\t\tbg.style[transform] = e.backwards ?\n\t\t\t\tscaleStr + ' ' + initialTransform :\n\t\t\t\tinitialTransform + ' ' + scaleStr;\n\t},\n\n\t_endZoomAnim: function () {\n\t\tvar front = this._tileContainer,\n\t\t    bg = this._bgBuffer;\n\n\t\tfront.style.visibility = '';\n\t\tfront.parentNode.appendChild(front); // Bring to fore\n\n\t\t// force reflow\n\t\tL.Util.falseFn(bg.offsetWidth);\n\n\t\tvar zoom = this._map.getZoom();\n\t\tif (zoom > this.options.maxZoom || zoom < this.options.minZoom) {\n\t\t\tthis._clearBgBuffer();\n\t\t}\n\n\t\tthis._animating = false;\n\t},\n\n\t_clearBgBuffer: function () {\n\t\tvar map = this._map;\n\n\t\tif (map && !map._animatingZoom && !map.touchZoom._zooming) {\n\t\t\tthis._bgBuffer.innerHTML = '';\n\t\t\tthis._bgBuffer.style[L.DomUtil.TRANSFORM] = '';\n\t\t}\n\t},\n\n\t_prepareBgBuffer: function () {\n\n\t\tvar front = this._tileContainer,\n\t\t    bg = this._bgBuffer;\n\n\t\t// if foreground layer doesn't have many tiles but bg layer does,\n\t\t// keep the existing bg layer and just zoom it some more\n\n\t\tvar bgLoaded = this._getLoadedTilesPercentage(bg),\n\t\t    frontLoaded = this._getLoadedTilesPercentage(front);\n\n\t\tif (bg && bgLoaded > 0.5 && frontLoaded < 0.5) {\n\n\t\t\tfront.style.visibility = 'hidden';\n\t\t\tthis._stopLoadingImages(front);\n\t\t\treturn;\n\t\t}\n\n\t\t// prepare the buffer to become the front tile pane\n\t\tbg.style.visibility = 'hidden';\n\t\tbg.style[L.DomUtil.TRANSFORM] = '';\n\n\t\t// switch out the current layer to be the new bg layer (and vice-versa)\n\t\tthis._tileContainer = bg;\n\t\tbg = this._bgBuffer = front;\n\n\t\tthis._stopLoadingImages(bg);\n\n\t\t//prevent bg buffer from clearing right after zoom\n\t\tclearTimeout(this._clearBgBufferTimer);\n\t},\n\n\t_getLoadedTilesPercentage: function (container) {\n\t\tvar tiles = container.getElementsByTagName('img'),\n\t\t    i, len, count = 0;\n\n\t\tfor (i = 0, len = tiles.length; i < len; i++) {\n\t\t\tif (tiles[i].complete) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\treturn count / len;\n\t},\n\n\t// stops loading all tiles in the background layer\n\t_stopLoadingImages: function (container) {\n\t\tvar tiles = Array.prototype.slice.call(container.getElementsByTagName('img')),\n\t\t    i, len, tile;\n\n\t\tfor (i = 0, len = tiles.length; i < len; i++) {\n\t\t\ttile = tiles[i];\n\n\t\t\tif (!tile.complete) {\n\t\t\t\ttile.onload = L.Util.falseFn;\n\t\t\t\ttile.onerror = L.Util.falseFn;\n\t\t\t\ttile.src = L.Util.emptyImageUrl;\n\n\t\t\t\ttile.parentNode.removeChild(tile);\n\t\t\t}\n\t\t}\n\t}\n});\n\n\n/*\r\n * Provides L.Map with convenient shortcuts for using browser geolocation features.\r\n */\r\n\r\nL.Map.include({\r\n\t_defaultLocateOptions: {\r\n\t\twatch: false,\r\n\t\tsetView: false,\r\n\t\tmaxZoom: Infinity,\r\n\t\ttimeout: 10000,\r\n\t\tmaximumAge: 0,\r\n\t\tenableHighAccuracy: false\r\n\t},\r\n\r\n\tlocate: function (/*Object*/ options) {\r\n\r\n\t\toptions = this._locateOptions = L.extend(this._defaultLocateOptions, options);\r\n\r\n\t\tif (!navigator.geolocation) {\r\n\t\t\tthis._handleGeolocationError({\r\n\t\t\t\tcode: 0,\r\n\t\t\t\tmessage: 'Geolocation not supported.'\r\n\t\t\t});\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar onResponse = L.bind(this._handleGeolocationResponse, this),\r\n\t\t\tonError = L.bind(this._handleGeolocationError, this);\r\n\r\n\t\tif (options.watch) {\r\n\t\t\tthis._locationWatchId =\r\n\t\t\t        navigator.geolocation.watchPosition(onResponse, onError, options);\r\n\t\t} else {\r\n\t\t\tnavigator.geolocation.getCurrentPosition(onResponse, onError, options);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstopLocate: function () {\r\n\t\tif (navigator.geolocation) {\r\n\t\t\tnavigator.geolocation.clearWatch(this._locationWatchId);\r\n\t\t}\r\n\t\tif (this._locateOptions) {\r\n\t\t\tthis._locateOptions.setView = false;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_handleGeolocationError: function (error) {\r\n\t\tvar c = error.code,\r\n\t\t    message = error.message ||\r\n\t\t            (c === 1 ? 'permission denied' :\r\n\t\t            (c === 2 ? 'position unavailable' : 'timeout'));\r\n\r\n\t\tif (this._locateOptions.setView && !this._loaded) {\r\n\t\t\tthis.fitWorld();\r\n\t\t}\r\n\r\n\t\tthis.fire('locationerror', {\r\n\t\t\tcode: c,\r\n\t\t\tmessage: 'Geolocation error: ' + message + '.'\r\n\t\t});\r\n\t},\r\n\r\n\t_handleGeolocationResponse: function (pos) {\r\n\t\tvar lat = pos.coords.latitude,\r\n\t\t    lng = pos.coords.longitude,\r\n\t\t    latlng = new L.LatLng(lat, lng),\r\n\r\n\t\t    latAccuracy = 180 * pos.coords.accuracy / 40075017,\r\n\t\t    lngAccuracy = latAccuracy / Math.cos(L.LatLng.DEG_TO_RAD * lat),\r\n\r\n\t\t    bounds = L.latLngBounds(\r\n\t\t            [lat - latAccuracy, lng - lngAccuracy],\r\n\t\t            [lat + latAccuracy, lng + lngAccuracy]),\r\n\r\n\t\t    options = this._locateOptions;\r\n\r\n\t\tif (options.setView) {\r\n\t\t\tvar zoom = Math.min(this.getBoundsZoom(bounds), options.maxZoom);\r\n\t\t\tthis.setView(latlng, zoom);\r\n\t\t}\r\n\r\n\t\tvar data = {\r\n\t\t\tlatlng: latlng,\r\n\t\t\tbounds: bounds,\r\n\t\t\ttimestamp: pos.timestamp\r\n\t\t};\r\n\r\n\t\tfor (var i in pos.coords) {\r\n\t\t\tif (typeof pos.coords[i] === 'number') {\r\n\t\t\t\tdata[i] = pos.coords[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.fire('locationfound', data);\r\n\t}\r\n});\r\n\n\n}(window, document));\n},{}],58:[function(require,module,exports){\nvar css = \"/* required styles */\\n.leaflet-map-pane,\\n.leaflet-tile,\\n.leaflet-marker-icon,\\n.leaflet-marker-shadow,\\n.leaflet-tile-pane,\\n.leaflet-tile-container,\\n.leaflet-overlay-pane,\\n.leaflet-shadow-pane,\\n.leaflet-marker-pane,\\n.leaflet-popup-pane,\\n.leaflet-overlay-pane svg,\\n.leaflet-zoom-box,\\n.leaflet-image-layer,\\n.leaflet-layer {\\n  position: absolute;\\n  left: 0;\\n  top: 0;\\n}\\n.leaflet-container {\\n  overflow: hidden;\\n  -ms-touch-action: none;\\n  touch-action: none;\\n}\\n.leaflet-tile,\\n.leaflet-marker-icon,\\n.leaflet-marker-shadow {\\n  -webkit-user-select: none;\\n  -moz-user-select: none;\\n  user-select: none;\\n  -webkit-user-drag: none;\\n}\\n.leaflet-marker-icon,\\n.leaflet-marker-shadow {\\n  display: block;\\n}\\n/* map is broken in FF if you have max-width: 100% on tiles */\\n.leaflet-container img {\\n  max-width: none !important;\\n}\\n/* stupid Android 2 doesn't understand \\\"max-width: none\\\" properly */\\n.leaflet-container img.leaflet-image-layer {\\n  max-width: 15000px !important;\\n}\\n.leaflet-tile {\\n  filter: inherit;\\n  visibility: hidden;\\n}\\n.leaflet-tile-loaded {\\n  visibility: inherit;\\n}\\n.leaflet-zoom-box {\\n  width: 0;\\n  height: 0;\\n}\\n/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */\\n.leaflet-overlay-pane svg {\\n  -moz-user-select: none;\\n}\\n.leaflet-tile-pane {\\n  z-index: 2;\\n}\\n.leaflet-objects-pane {\\n  z-index: 3;\\n}\\n.leaflet-overlay-pane {\\n  z-index: 4;\\n}\\n.leaflet-shadow-pane {\\n  z-index: 5;\\n}\\n.leaflet-marker-pane {\\n  z-index: 6;\\n}\\n.leaflet-popup-pane {\\n  z-index: 7;\\n}\\n.leaflet-vml-shape {\\n  width: 1px;\\n  height: 1px;\\n}\\n.lvml {\\n  behavior: url(#default#VML);\\n  display: inline-block;\\n  position: absolute;\\n}\\n/* control positioning */\\n.leaflet-control {\\n  position: relative;\\n  z-index: 7;\\n  pointer-events: auto;\\n}\\n.leaflet-top,\\n.leaflet-bottom {\\n  position: absolute;\\n  z-index: 1000;\\n  pointer-events: none;\\n}\\n.leaflet-top {\\n  top: 0;\\n}\\n.leaflet-right {\\n  right: 0;\\n}\\n.leaflet-bottom {\\n  bottom: 0;\\n}\\n.leaflet-left {\\n  left: 0;\\n}\\n.leaflet-control {\\n  float: left;\\n  clear: both;\\n}\\n.leaflet-right .leaflet-control {\\n  float: right;\\n}\\n.leaflet-top .leaflet-control {\\n  margin-top: 10px;\\n}\\n.leaflet-bottom .leaflet-control {\\n  margin-bottom: 10px;\\n}\\n.leaflet-left .leaflet-control {\\n  margin-left: 10px;\\n}\\n.leaflet-right .leaflet-control {\\n  margin-right: 10px;\\n}\\n/* zoom and fade animations */\\n.leaflet-fade-anim .leaflet-tile,\\n.leaflet-fade-anim .leaflet-popup {\\n  opacity: 0;\\n  -webkit-transition: opacity 0.2s linear;\\n  -moz-transition: opacity 0.2s linear;\\n  -o-transition: opacity 0.2s linear;\\n  transition: opacity 0.2s linear;\\n}\\n.leaflet-fade-anim .leaflet-tile-loaded,\\n.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {\\n  opacity: 1;\\n}\\n.leaflet-zoom-anim .leaflet-zoom-animated {\\n  -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);\\n  -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);\\n  -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1);\\n  transition: transform 0.25s cubic-bezier(0,0,0.25,1);\\n}\\n.leaflet-zoom-anim .leaflet-tile,\\n.leaflet-pan-anim .leaflet-tile,\\n.leaflet-touching .leaflet-zoom-animated {\\n  -webkit-transition: none;\\n  -moz-transition: none;\\n  -o-transition: none;\\n  transition: none;\\n}\\n.leaflet-zoom-anim .leaflet-zoom-hide {\\n  visibility: hidden;\\n}\\n/* cursors */\\n.leaflet-clickable {\\n  cursor: pointer;\\n}\\n.leaflet-container {\\n  cursor: -webkit-grab;\\n  cursor: -moz-grab;\\n}\\n.leaflet-popup-pane,\\n.leaflet-control {\\n  cursor: auto;\\n}\\n.leaflet-dragging .leaflet-container,\\n.leaflet-dragging .leaflet-clickable {\\n  cursor: move;\\n  cursor: -webkit-grabbing;\\n  cursor: -moz-grabbing;\\n}\\n/* visual tweaks */\\n.leaflet-container {\\n  background: #ddd;\\n  outline: 0;\\n}\\n.leaflet-container a {\\n  color: #0078A8;\\n}\\n.leaflet-container a.leaflet-active {\\n  outline: 2px solid orange;\\n}\\n.leaflet-zoom-box {\\n  border: 2px dotted #38f;\\n  background: rgba(255,255,255,0.5);\\n}\\n/* general typography */\\n.leaflet-container {\\n  font: 12px/1.5 \\\"Helvetica Neue\\\", Arial, Helvetica, sans-serif;\\n}\\n/* general toolbar styles */\\n.leaflet-bar {\\n  box-shadow: 0 1px 5px rgba(0,0,0,0.65);\\n  border-radius: 4px;\\n}\\n.leaflet-bar a,\\n.leaflet-bar a:hover {\\n  background-color: #fff;\\n  border-bottom: 1px solid #ccc;\\n  width: 26px;\\n  height: 26px;\\n  line-height: 26px;\\n  display: block;\\n  text-align: center;\\n  text-decoration: none;\\n  color: black;\\n}\\n.leaflet-bar a,\\n.leaflet-control-layers-toggle {\\n  background-position: 50% 50%;\\n  background-repeat: no-repeat;\\n  display: block;\\n}\\n.leaflet-bar a:hover {\\n  background-color: #f4f4f4;\\n}\\n.leaflet-bar a:first-child {\\n  border-top-left-radius: 4px;\\n  border-top-right-radius: 4px;\\n}\\n.leaflet-bar a:last-child {\\n  border-bottom-left-radius: 4px;\\n  border-bottom-right-radius: 4px;\\n  border-bottom: none;\\n}\\n.leaflet-bar a.leaflet-disabled {\\n  cursor: default;\\n  background-color: #f4f4f4;\\n  color: #bbb;\\n}\\n.leaflet-touch .leaflet-bar a {\\n  width: 30px;\\n  height: 30px;\\n  line-height: 30px;\\n}\\n/* zoom control */\\n.leaflet-control-zoom-in,\\n.leaflet-control-zoom-out {\\n  font: bold 18px 'Lucida Console', Monaco, monospace;\\n  text-indent: 1px;\\n}\\n.leaflet-control-zoom-out {\\n  font-size: 20px;\\n}\\n.leaflet-touch .leaflet-control-zoom-in {\\n  font-size: 22px;\\n}\\n.leaflet-touch .leaflet-control-zoom-out {\\n  font-size: 24px;\\n}\\n/* layers control */\\n.leaflet-control-layers {\\n  box-shadow: 0 1px 5px rgba(0,0,0,0.4);\\n  background: #fff;\\n  border-radius: 5px;\\n}\\n.leaflet-control-layers-toggle {\\n  background-image: url(../../../../../node_modules/leaflet/dist/images/layers.png);\\n  width: 36px;\\n  height: 36px;\\n}\\n.leaflet-retina .leaflet-control-layers-toggle {\\n  background-image: url(../../../../../node_modules/leaflet/dist/images/layers-2x.png);\\n  background-size: 26px 26px;\\n}\\n.leaflet-touch .leaflet-control-layers-toggle {\\n  width: 44px;\\n  height: 44px;\\n}\\n.leaflet-control-layers .leaflet-control-layers-list,\\n.leaflet-control-layers-expanded .leaflet-control-layers-toggle {\\n  display: none;\\n}\\n.leaflet-control-layers-expanded .leaflet-control-layers-list {\\n  display: block;\\n  position: relative;\\n}\\n.leaflet-control-layers-expanded {\\n  padding: 6px 10px 6px 6px;\\n  color: #333;\\n  background: #fff;\\n}\\n.leaflet-control-layers-selector {\\n  margin-top: 2px;\\n  position: relative;\\n  top: 1px;\\n}\\n.leaflet-control-layers label {\\n  display: block;\\n}\\n.leaflet-control-layers-separator {\\n  height: 0;\\n  border-top: 1px solid #ddd;\\n  margin: 5px -10px 5px -6px;\\n}\\n/* attribution and scale controls */\\n.leaflet-container .leaflet-control-attribution {\\n  background: #fff;\\n  background: rgba(255, 255, 255, 0.7);\\n  margin: 0;\\n}\\n.leaflet-control-attribution,\\n.leaflet-control-scale-line {\\n  padding: 0 5px;\\n  color: #333;\\n}\\n.leaflet-control-attribution a {\\n  text-decoration: none;\\n}\\n.leaflet-control-attribution a:hover {\\n  text-decoration: underline;\\n}\\n.leaflet-container .leaflet-control-attribution,\\n.leaflet-container .leaflet-control-scale {\\n  font-size: 11px;\\n}\\n.leaflet-left .leaflet-control-scale {\\n  margin-left: 5px;\\n}\\n.leaflet-bottom .leaflet-control-scale {\\n  margin-bottom: 5px;\\n}\\n.leaflet-control-scale-line {\\n  border: 2px solid #777;\\n  border-top: none;\\n  line-height: 1.1;\\n  padding: 2px 5px 1px;\\n  font-size: 11px;\\n  white-space: nowrap;\\n  overflow: hidden;\\n  -moz-box-sizing: content-box;\\n  box-sizing: content-box;\\n  background: #fff;\\n  background: rgba(255, 255, 255, 0.5);\\n}\\n.leaflet-control-scale-line:not(:first-child) {\\n  border-top: 2px solid #777;\\n  border-bottom: none;\\n  margin-top: -2px;\\n}\\n.leaflet-control-scale-line:not(:first-child):not(:last-child) {\\n  border-bottom: 2px solid #777;\\n}\\n.leaflet-touch .leaflet-control-attribution,\\n.leaflet-touch .leaflet-control-layers,\\n.leaflet-touch .leaflet-bar {\\n  box-shadow: none;\\n}\\n.leaflet-touch .leaflet-control-layers,\\n.leaflet-touch .leaflet-bar {\\n  border: 2px solid rgba(0,0,0,0.2);\\n  background-clip: padding-box;\\n}\\n/* popup */\\n.leaflet-popup {\\n  position: absolute;\\n  text-align: center;\\n}\\n.leaflet-popup-content-wrapper {\\n  padding: 1px;\\n  text-align: left;\\n  border-radius: 12px;\\n}\\n.leaflet-popup-content {\\n  margin: 13px 19px;\\n  line-height: 1.4;\\n}\\n.leaflet-popup-content p {\\n  margin: 18px 0;\\n}\\n.leaflet-popup-tip-container {\\n  margin: 0 auto;\\n  width: 40px;\\n  height: 20px;\\n  position: relative;\\n  overflow: hidden;\\n}\\n.leaflet-popup-tip {\\n  width: 17px;\\n  height: 17px;\\n  padding: 1px;\\n  margin: -10px auto 0;\\n  -webkit-transform: rotate(45deg);\\n  -moz-transform: rotate(45deg);\\n  -ms-transform: rotate(45deg);\\n  -o-transform: rotate(45deg);\\n  transform: rotate(45deg);\\n}\\n.leaflet-popup-content-wrapper,\\n.leaflet-popup-tip {\\n  background: white;\\n  box-shadow: 0 3px 14px rgba(0,0,0,0.4);\\n}\\n.leaflet-container a.leaflet-popup-close-button {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  padding: 4px 4px 0 0;\\n  text-align: center;\\n  width: 18px;\\n  height: 14px;\\n  font: 16px/14px Tahoma, Verdana, sans-serif;\\n  color: #c3c3c3;\\n  text-decoration: none;\\n  font-weight: bold;\\n  background: transparent;\\n}\\n.leaflet-container a.leaflet-popup-close-button:hover {\\n  color: #999;\\n}\\n.leaflet-popup-scrolled {\\n  overflow: auto;\\n  border-bottom: 1px solid #ddd;\\n  border-top: 1px solid #ddd;\\n}\\n.leaflet-oldie .leaflet-popup-content-wrapper {\\n  zoom: 1;\\n}\\n.leaflet-oldie .leaflet-popup-tip {\\n  width: 24px;\\n  margin: 0 auto;\\n  -ms-filter: \\\"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)\\\";\\n  filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);\\n}\\n.leaflet-oldie .leaflet-popup-tip-container {\\n  margin-top: -1px;\\n}\\n.leaflet-oldie .leaflet-control-zoom,\\n.leaflet-oldie .leaflet-control-layers,\\n.leaflet-oldie .leaflet-popup-content-wrapper,\\n.leaflet-oldie .leaflet-popup-tip {\\n  border: 1px solid #999;\\n}\\n/* div icon */\\n.leaflet-div-icon {\\n  background: #fff;\\n  border: 1px solid #666;\\n}\\n\"; (require(\"browserify-css\").createStyle(css, { \"href\": \"node_modules\\\\leaflet\\\\dist\\\\leaflet.css\" }, { \"insertAt\": \"bottom\" })); module.exports = css;\n},{\"browserify-css\":9}],59:[function(require,module,exports){\n/**\n * Helpers.\n */\n\nvar s = 1000\nvar m = s * 60\nvar h = m * 60\nvar d = h * 24\nvar y = d * 365.25\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} options\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n  options = options || {}\n  var type = typeof val\n  if (type === 'string' && val.length > 0) {\n    return parse(val)\n  } else if (type === 'number' && isNaN(val) === false) {\n    return options.long ?\n\t\t\tfmtLong(val) :\n\t\t\tfmtShort(val)\n  }\n  throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val))\n}\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str)\n  if (str.length > 10000) {\n    return\n  }\n  var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str)\n  if (!match) {\n    return\n  }\n  var n = parseFloat(match[1])\n  var type = (match[2] || 'ms').toLowerCase()\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n\n    default:\n      return undefined\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  if (ms >= d) {\n    return Math.round(ms / d) + 'd'\n  }\n  if (ms >= h) {\n    return Math.round(ms / h) + 'h'\n  }\n  if (ms >= m) {\n    return Math.round(ms / m) + 'm'\n  }\n  if (ms >= s) {\n    return Math.round(ms / s) + 's'\n  }\n  return ms + 'ms'\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  return plural(ms, d, 'day') ||\n    plural(ms, h, 'hour') ||\n    plural(ms, m, 'minute') ||\n    plural(ms, s, 'second') ||\n    ms + ' ms'\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n  if (ms < n) {\n    return\n  }\n  if (ms < n * 1.5) {\n    return Math.floor(ms / n) + ' ' + name\n  }\n  return Math.ceil(ms / n) + ' ' + name + 's'\n}\n\n},{}],60:[function(require,module,exports){\n(function (global){\n/**\r\n * JSON parse.\r\n *\r\n * @see Based on jQuery#parseJSON (MIT) and JSON2\r\n * @api private\r\n */\r\n\r\nvar rvalidchars = /^[\\],:{}\\s]*$/;\r\nvar rvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;\r\nvar rvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;\r\nvar rvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g;\r\nvar rtrimLeft = /^\\s+/;\r\nvar rtrimRight = /\\s+$/;\r\n\r\nmodule.exports = function parsejson(data) {\r\n  if ('string' != typeof data || !data) {\r\n    return null;\r\n  }\r\n\r\n  data = data.replace(rtrimLeft, '').replace(rtrimRight, '');\r\n\r\n  // Attempt to parse using the native JSON parser first\r\n  if (global.JSON && JSON.parse) {\r\n    return JSON.parse(data);\r\n  }\r\n\r\n  if (rvalidchars.test(data.replace(rvalidescape, '@')\r\n      .replace(rvalidtokens, ']')\r\n      .replace(rvalidbraces, ''))) {\r\n    return (new Function('return ' + data))();\r\n  }\r\n};\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],61:[function(require,module,exports){\n/**\r\n * Compiles a querystring\r\n * Returns string representation of the object\r\n *\r\n * @param {Object}\r\n * @api private\r\n */\r\n\r\nexports.encode = function (obj) {\r\n  var str = '';\r\n\r\n  for (var i in obj) {\r\n    if (obj.hasOwnProperty(i)) {\r\n      if (str.length) str += '&';\r\n      str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\r\n    }\r\n  }\r\n\r\n  return str;\r\n};\r\n\r\n/**\r\n * Parses a simple querystring into an object\r\n *\r\n * @param {String} qs\r\n * @api private\r\n */\r\n\r\nexports.decode = function(qs){\r\n  var qry = {};\r\n  var pairs = qs.split('&');\r\n  for (var i = 0, l = pairs.length; i < l; i++) {\r\n    var pair = pairs[i].split('=');\r\n    qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\r\n  }\r\n  return qry;\r\n};\r\n\n},{}],62:[function(require,module,exports){\n/**\r\n * Parses an URI\r\n *\r\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\r\n * @api private\r\n */\r\n\r\nvar re = /^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\r\n\r\nvar parts = [\r\n    'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\r\n];\r\n\r\nmodule.exports = function parseuri(str) {\r\n    var src = str,\r\n        b = str.indexOf('['),\r\n        e = str.indexOf(']');\r\n\r\n    if (b != -1 && e != -1) {\r\n        str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\r\n    }\r\n\r\n    var m = re.exec(str || ''),\r\n        uri = {},\r\n        i = 14;\r\n\r\n    while (i--) {\r\n        uri[parts[i]] = m[i] || '';\r\n    }\r\n\r\n    if (b != -1 && e != -1) {\r\n        uri.source = src;\r\n        uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\r\n        uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\r\n        uri.ipv6uri = true;\r\n    }\r\n\r\n    return uri;\r\n};\r\n\n},{}],63:[function(require,module,exports){\nvar polyline = {};\n\n// Based off of [the offical Google document](https://developers.google.com/maps/documentation/utilities/polylinealgorithm)\n//\n// Some parts from [this implementation](http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/PolylineEncoder.js)\n// by [Mark McClure](http://facstaff.unca.edu/mcmcclur/)\n\nfunction encode(coordinate, factor) {\n    coordinate = Math.round(coordinate * factor);\n    coordinate <<= 1;\n    if (coordinate < 0) {\n        coordinate = ~coordinate;\n    }\n    var output = '';\n    while (coordinate >= 0x20) {\n        output += String.fromCharCode((0x20 | (coordinate & 0x1f)) + 63);\n        coordinate >>= 5;\n    }\n    output += String.fromCharCode(coordinate + 63);\n    return output;\n}\n\n// This is adapted from the implementation in Project-OSRM\n// https://github.com/DennisOSRM/Project-OSRM-Web/blob/master/WebContent/routing/OSRM.RoutingGeometry.js\npolyline.decode = function(str, precision) {\n    var index = 0,\n        lat = 0,\n        lng = 0,\n        coordinates = [],\n        shift = 0,\n        result = 0,\n        byte = null,\n        latitude_change,\n        longitude_change,\n        factor = Math.pow(10, precision || 5);\n\n    // Coordinates have variable length when encoded, so just keep\n    // track of whether we've hit the end of the string. In each\n    // loop iteration, a single coordinate is decoded.\n    while (index < str.length) {\n\n        // Reset shift, result, and byte\n        byte = null;\n        shift = 0;\n        result = 0;\n\n        do {\n            byte = str.charCodeAt(index++) - 63;\n            result |= (byte & 0x1f) << shift;\n            shift += 5;\n        } while (byte >= 0x20);\n\n        latitude_change = ((result & 1) ? ~(result >> 1) : (result >> 1));\n\n        shift = result = 0;\n\n        do {\n            byte = str.charCodeAt(index++) - 63;\n            result |= (byte & 0x1f) << shift;\n            shift += 5;\n        } while (byte >= 0x20);\n\n        longitude_change = ((result & 1) ? ~(result >> 1) : (result >> 1));\n\n        lat += latitude_change;\n        lng += longitude_change;\n\n        coordinates.push([lat / factor, lng / factor]);\n    }\n\n    return coordinates;\n};\n\npolyline.encode = function(coordinates, precision) {\n    if (!coordinates.length) return '';\n\n    var factor = Math.pow(10, precision || 5),\n        output = encode(coordinates[0][0], factor) + encode(coordinates[0][1], factor);\n\n    for (var i = 1; i < coordinates.length; i++) {\n        var a = coordinates[i], b = coordinates[i - 1];\n        output += encode(a[0] - b[0], factor);\n        output += encode(a[1] - b[1], factor);\n    }\n\n    return output;\n};\n\nif (typeof module !== undefined) module.exports = polyline;\n\n},{}],64:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],65:[function(require,module,exports){\n\n/**\n * Module dependencies.\n */\n\nvar url = require('./url');\nvar parser = require('socket.io-parser');\nvar Manager = require('./manager');\nvar debug = require('debug')('socket.io-client');\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = lookup;\n\n/**\n * Managers cache.\n */\n\nvar cache = exports.managers = {};\n\n/**\n * Looks up an existing `Manager` for multiplexing.\n * If the user summons:\n *\n *   `io('http://localhost/a');`\n *   `io('http://localhost/b');`\n *\n * We reuse the existing instance based on same scheme/port/host,\n * and we initialize sockets for each namespace.\n *\n * @api public\n */\n\nfunction lookup (uri, opts) {\n  if (typeof uri === 'object') {\n    opts = uri;\n    uri = undefined;\n  }\n\n  opts = opts || {};\n\n  var parsed = url(uri);\n  var source = parsed.source;\n  var id = parsed.id;\n  var path = parsed.path;\n  var sameNamespace = cache[id] && path in cache[id].nsps;\n  var newConnection = opts.forceNew || opts['force new connection'] ||\n                      false === opts.multiplex || sameNamespace;\n\n  var io;\n\n  if (newConnection) {\n    debug('ignoring socket cache for %s', source);\n    io = Manager(source, opts);\n  } else {\n    if (!cache[id]) {\n      debug('new io instance for %s', source);\n      cache[id] = Manager(source, opts);\n    }\n    io = cache[id];\n  }\n  if (parsed.query && !opts.query) {\n    opts.query = parsed.query;\n  } else if (opts && 'object' === typeof opts.query) {\n    opts.query = encodeQueryString(opts.query);\n  }\n  return io.socket(parsed.path, opts);\n}\n/**\n *  Helper method to parse query objects to string.\n * @param {object} query\n * @returns {string}\n */\nfunction encodeQueryString (obj) {\n  var str = [];\n  for (var p in obj) {\n    if (obj.hasOwnProperty(p)) {\n      str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p]));\n    }\n  }\n  return str.join('&');\n}\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = parser.protocol;\n\n/**\n * `connect`.\n *\n * @param {String} uri\n * @api public\n */\n\nexports.connect = lookup;\n\n/**\n * Expose constructors for standalone build.\n *\n * @api public\n */\n\nexports.Manager = require('./manager');\nexports.Socket = require('./socket');\n\n},{\"./manager\":66,\"./socket\":68,\"./url\":69,\"debug\":14,\"socket.io-parser\":71}],66:[function(require,module,exports){\n\n/**\n * Module dependencies.\n */\n\nvar eio = require('engine.io-client');\nvar Socket = require('./socket');\nvar Emitter = require('component-emitter');\nvar parser = require('socket.io-parser');\nvar on = require('./on');\nvar bind = require('component-bind');\nvar debug = require('debug')('socket.io-client:manager');\nvar indexOf = require('indexof');\nvar Backoff = require('backo2');\n\n/**\n * IE6+ hasOwnProperty\n */\n\nvar has = Object.prototype.hasOwnProperty;\n\n/**\n * Module exports\n */\n\nmodule.exports = Manager;\n\n/**\n * `Manager` constructor.\n *\n * @param {String} engine instance or engine uri/opts\n * @param {Object} options\n * @api public\n */\n\nfunction Manager (uri, opts) {\n  if (!(this instanceof Manager)) return new Manager(uri, opts);\n  if (uri && ('object' === typeof uri)) {\n    opts = uri;\n    uri = undefined;\n  }\n  opts = opts || {};\n\n  opts.path = opts.path || '/socket.io';\n  this.nsps = {};\n  this.subs = [];\n  this.opts = opts;\n  this.reconnection(opts.reconnection !== false);\n  this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n  this.reconnectionDelay(opts.reconnectionDelay || 1000);\n  this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n  this.randomizationFactor(opts.randomizationFactor || 0.5);\n  this.backoff = new Backoff({\n    min: this.reconnectionDelay(),\n    max: this.reconnectionDelayMax(),\n    jitter: this.randomizationFactor()\n  });\n  this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n  this.readyState = 'closed';\n  this.uri = uri;\n  this.connecting = [];\n  this.lastPing = null;\n  this.encoding = false;\n  this.packetBuffer = [];\n  this.encoder = new parser.Encoder();\n  this.decoder = new parser.Decoder();\n  this.autoConnect = opts.autoConnect !== false;\n  if (this.autoConnect) this.open();\n}\n\n/**\n * Propagate given event to sockets and emit on `this`\n *\n * @api private\n */\n\nManager.prototype.emitAll = function () {\n  this.emit.apply(this, arguments);\n  for (var nsp in this.nsps) {\n    if (has.call(this.nsps, nsp)) {\n      this.nsps[nsp].emit.apply(this.nsps[nsp], arguments);\n    }\n  }\n};\n\n/**\n * Update `socket.id` of all sockets\n *\n * @api private\n */\n\nManager.prototype.updateSocketIds = function () {\n  for (var nsp in this.nsps) {\n    if (has.call(this.nsps, nsp)) {\n      this.nsps[nsp].id = this.engine.id;\n    }\n  }\n};\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Manager.prototype);\n\n/**\n * Sets the `reconnection` config.\n *\n * @param {Boolean} true/false if it should automatically reconnect\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnection = function (v) {\n  if (!arguments.length) return this._reconnection;\n  this._reconnection = !!v;\n  return this;\n};\n\n/**\n * Sets the reconnection attempts config.\n *\n * @param {Number} max reconnection attempts before giving up\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionAttempts = function (v) {\n  if (!arguments.length) return this._reconnectionAttempts;\n  this._reconnectionAttempts = v;\n  return this;\n};\n\n/**\n * Sets the delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelay = function (v) {\n  if (!arguments.length) return this._reconnectionDelay;\n  this._reconnectionDelay = v;\n  this.backoff && this.backoff.setMin(v);\n  return this;\n};\n\nManager.prototype.randomizationFactor = function (v) {\n  if (!arguments.length) return this._randomizationFactor;\n  this._randomizationFactor = v;\n  this.backoff && this.backoff.setJitter(v);\n  return this;\n};\n\n/**\n * Sets the maximum delay between reconnections.\n *\n * @param {Number} delay\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.reconnectionDelayMax = function (v) {\n  if (!arguments.length) return this._reconnectionDelayMax;\n  this._reconnectionDelayMax = v;\n  this.backoff && this.backoff.setMax(v);\n  return this;\n};\n\n/**\n * Sets the connection timeout. `false` to disable\n *\n * @return {Manager} self or value\n * @api public\n */\n\nManager.prototype.timeout = function (v) {\n  if (!arguments.length) return this._timeout;\n  this._timeout = v;\n  return this;\n};\n\n/**\n * Starts trying to reconnect if reconnection is enabled and we have not\n * started reconnecting yet\n *\n * @api private\n */\n\nManager.prototype.maybeReconnectOnOpen = function () {\n  // Only try to reconnect if it's the first time we're connecting\n  if (!this.reconnecting && this._reconnection && this.backoff.attempts === 0) {\n    // keeps reconnection from firing twice for the same reconnection loop\n    this.reconnect();\n  }\n};\n\n/**\n * Sets the current transport `socket`.\n *\n * @param {Function} optional, callback\n * @return {Manager} self\n * @api public\n */\n\nManager.prototype.open =\nManager.prototype.connect = function (fn, opts) {\n  debug('readyState %s', this.readyState);\n  if (~this.readyState.indexOf('open')) return this;\n\n  debug('opening %s', this.uri);\n  this.engine = eio(this.uri, this.opts);\n  var socket = this.engine;\n  var self = this;\n  this.readyState = 'opening';\n  this.skipReconnect = false;\n\n  // emit `open`\n  var openSub = on(socket, 'open', function () {\n    self.onopen();\n    fn && fn();\n  });\n\n  // emit `connect_error`\n  var errorSub = on(socket, 'error', function (data) {\n    debug('connect_error');\n    self.cleanup();\n    self.readyState = 'closed';\n    self.emitAll('connect_error', data);\n    if (fn) {\n      var err = new Error('Connection error');\n      err.data = data;\n      fn(err);\n    } else {\n      // Only do this if there is no fn to handle the error\n      self.maybeReconnectOnOpen();\n    }\n  });\n\n  // emit `connect_timeout`\n  if (false !== this._timeout) {\n    var timeout = this._timeout;\n    debug('connect attempt will timeout after %d', timeout);\n\n    // set timer\n    var timer = setTimeout(function () {\n      debug('connect attempt timed out after %d', timeout);\n      openSub.destroy();\n      socket.close();\n      socket.emit('error', 'timeout');\n      self.emitAll('connect_timeout', timeout);\n    }, timeout);\n\n    this.subs.push({\n      destroy: function () {\n        clearTimeout(timer);\n      }\n    });\n  }\n\n  this.subs.push(openSub);\n  this.subs.push(errorSub);\n\n  return this;\n};\n\n/**\n * Called upon transport open.\n *\n * @api private\n */\n\nManager.prototype.onopen = function () {\n  debug('open');\n\n  // clear old subs\n  this.cleanup();\n\n  // mark as open\n  this.readyState = 'open';\n  this.emit('open');\n\n  // add new subs\n  var socket = this.engine;\n  this.subs.push(on(socket, 'data', bind(this, 'ondata')));\n  this.subs.push(on(socket, 'ping', bind(this, 'onping')));\n  this.subs.push(on(socket, 'pong', bind(this, 'onpong')));\n  this.subs.push(on(socket, 'error', bind(this, 'onerror')));\n  this.subs.push(on(socket, 'close', bind(this, 'onclose')));\n  this.subs.push(on(this.decoder, 'decoded', bind(this, 'ondecoded')));\n};\n\n/**\n * Called upon a ping.\n *\n * @api private\n */\n\nManager.prototype.onping = function () {\n  this.lastPing = new Date();\n  this.emitAll('ping');\n};\n\n/**\n * Called upon a packet.\n *\n * @api private\n */\n\nManager.prototype.onpong = function () {\n  this.emitAll('pong', new Date() - this.lastPing);\n};\n\n/**\n * Called with data.\n *\n * @api private\n */\n\nManager.prototype.ondata = function (data) {\n  this.decoder.add(data);\n};\n\n/**\n * Called when parser fully decodes a packet.\n *\n * @api private\n */\n\nManager.prototype.ondecoded = function (packet) {\n  this.emit('packet', packet);\n};\n\n/**\n * Called upon socket error.\n *\n * @api private\n */\n\nManager.prototype.onerror = function (err) {\n  debug('error', err);\n  this.emitAll('error', err);\n};\n\n/**\n * Creates a new socket for the given `nsp`.\n *\n * @return {Socket}\n * @api public\n */\n\nManager.prototype.socket = function (nsp, opts) {\n  var socket = this.nsps[nsp];\n  if (!socket) {\n    socket = new Socket(this, nsp, opts);\n    this.nsps[nsp] = socket;\n    var self = this;\n    socket.on('connecting', onConnecting);\n    socket.on('connect', function () {\n      socket.id = self.engine.id;\n    });\n\n    if (this.autoConnect) {\n      // manually call here since connecting evnet is fired before listening\n      onConnecting();\n    }\n  }\n\n  function onConnecting () {\n    if (!~indexOf(self.connecting, socket)) {\n      self.connecting.push(socket);\n    }\n  }\n\n  return socket;\n};\n\n/**\n * Called upon a socket close.\n *\n * @param {Socket} socket\n */\n\nManager.prototype.destroy = function (socket) {\n  var index = indexOf(this.connecting, socket);\n  if (~index) this.connecting.splice(index, 1);\n  if (this.connecting.length) return;\n\n  this.close();\n};\n\n/**\n * Writes a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nManager.prototype.packet = function (packet) {\n  debug('writing packet %j', packet);\n  var self = this;\n  if (packet.query && packet.type === 0) packet.nsp += '?' + packet.query;\n\n  if (!self.encoding) {\n    // encode, then write to engine with result\n    self.encoding = true;\n    this.encoder.encode(packet, function (encodedPackets) {\n      for (var i = 0; i < encodedPackets.length; i++) {\n        self.engine.write(encodedPackets[i], packet.options);\n      }\n      self.encoding = false;\n      self.processPacketQueue();\n    });\n  } else { // add packet to the queue\n    self.packetBuffer.push(packet);\n  }\n};\n\n/**\n * If packet buffer is non-empty, begins encoding the\n * next packet in line.\n *\n * @api private\n */\n\nManager.prototype.processPacketQueue = function () {\n  if (this.packetBuffer.length > 0 && !this.encoding) {\n    var pack = this.packetBuffer.shift();\n    this.packet(pack);\n  }\n};\n\n/**\n * Clean up transport subscriptions and packet buffer.\n *\n * @api private\n */\n\nManager.prototype.cleanup = function () {\n  debug('cleanup');\n\n  var subsLength = this.subs.length;\n  for (var i = 0; i < subsLength; i++) {\n    var sub = this.subs.shift();\n    sub.destroy();\n  }\n\n  this.packetBuffer = [];\n  this.encoding = false;\n  this.lastPing = null;\n\n  this.decoder.destroy();\n};\n\n/**\n * Close the current socket.\n *\n * @api private\n */\n\nManager.prototype.close =\nManager.prototype.disconnect = function () {\n  debug('disconnect');\n  this.skipReconnect = true;\n  this.reconnecting = false;\n  if ('opening' === this.readyState) {\n    // `onclose` will not fire because\n    // an open event never happened\n    this.cleanup();\n  }\n  this.backoff.reset();\n  this.readyState = 'closed';\n  if (this.engine) this.engine.close();\n};\n\n/**\n * Called upon engine close.\n *\n * @api private\n */\n\nManager.prototype.onclose = function (reason) {\n  debug('onclose');\n\n  this.cleanup();\n  this.backoff.reset();\n  this.readyState = 'closed';\n  this.emit('close', reason);\n\n  if (this._reconnection && !this.skipReconnect) {\n    this.reconnect();\n  }\n};\n\n/**\n * Attempt a reconnection.\n *\n * @api private\n */\n\nManager.prototype.reconnect = function () {\n  if (this.reconnecting || this.skipReconnect) return this;\n\n  var self = this;\n\n  if (this.backoff.attempts >= this._reconnectionAttempts) {\n    debug('reconnect failed');\n    this.backoff.reset();\n    this.emitAll('reconnect_failed');\n    this.reconnecting = false;\n  } else {\n    var delay = this.backoff.duration();\n    debug('will wait %dms before reconnect attempt', delay);\n\n    this.reconnecting = true;\n    var timer = setTimeout(function () {\n      if (self.skipReconnect) return;\n\n      debug('attempting reconnect');\n      self.emitAll('reconnect_attempt', self.backoff.attempts);\n      self.emitAll('reconnecting', self.backoff.attempts);\n\n      // check again for the case socket closed in above events\n      if (self.skipReconnect) return;\n\n      self.open(function (err) {\n        if (err) {\n          debug('reconnect attempt error');\n          self.reconnecting = false;\n          self.reconnect();\n          self.emitAll('reconnect_error', err.data);\n        } else {\n          debug('reconnect success');\n          self.onreconnect();\n        }\n      });\n    }, delay);\n\n    this.subs.push({\n      destroy: function () {\n        clearTimeout(timer);\n      }\n    });\n  }\n};\n\n/**\n * Called upon successful reconnect.\n *\n * @api private\n */\n\nManager.prototype.onreconnect = function () {\n  var attempt = this.backoff.attempts;\n  this.reconnecting = false;\n  this.backoff.reset();\n  this.updateSocketIds();\n  this.emitAll('reconnect', attempt);\n};\n\n},{\"./on\":67,\"./socket\":68,\"backo2\":5,\"component-bind\":10,\"component-emitter\":11,\"debug\":14,\"engine.io-client\":16,\"indexof\":33,\"socket.io-parser\":71}],67:[function(require,module,exports){\n\n/**\n * Module exports.\n */\n\nmodule.exports = on;\n\n/**\n * Helper for subscriptions.\n *\n * @param {Object|EventEmitter} obj with `Emitter` mixin or `EventEmitter`\n * @param {String} event name\n * @param {Function} callback\n * @api public\n */\n\nfunction on (obj, ev, fn) {\n  obj.on(ev, fn);\n  return {\n    destroy: function () {\n      obj.removeListener(ev, fn);\n    }\n  };\n}\n\n},{}],68:[function(require,module,exports){\n\n/**\n * Module dependencies.\n */\n\nvar parser = require('socket.io-parser');\nvar Emitter = require('component-emitter');\nvar toArray = require('to-array');\nvar on = require('./on');\nvar bind = require('component-bind');\nvar debug = require('debug')('socket.io-client:socket');\nvar hasBin = require('has-binary');\n\n/**\n * Module exports.\n */\n\nmodule.exports = exports = Socket;\n\n/**\n * Internal events (blacklisted).\n * These events can't be emitted by the user.\n *\n * @api private\n */\n\nvar events = {\n  connect: 1,\n  connect_error: 1,\n  connect_timeout: 1,\n  connecting: 1,\n  disconnect: 1,\n  error: 1,\n  reconnect: 1,\n  reconnect_attempt: 1,\n  reconnect_failed: 1,\n  reconnect_error: 1,\n  reconnecting: 1,\n  ping: 1,\n  pong: 1\n};\n\n/**\n * Shortcut to `Emitter#emit`.\n */\n\nvar emit = Emitter.prototype.emit;\n\n/**\n * `Socket` constructor.\n *\n * @api public\n */\n\nfunction Socket (io, nsp, opts) {\n  this.io = io;\n  this.nsp = nsp;\n  this.json = this; // compat\n  this.ids = 0;\n  this.acks = {};\n  this.receiveBuffer = [];\n  this.sendBuffer = [];\n  this.connected = false;\n  this.disconnected = true;\n  if (opts && opts.query) {\n    this.query = opts.query;\n  }\n  if (this.io.autoConnect) this.open();\n}\n\n/**\n * Mix in `Emitter`.\n */\n\nEmitter(Socket.prototype);\n\n/**\n * Subscribe to open, close and packet events\n *\n * @api private\n */\n\nSocket.prototype.subEvents = function () {\n  if (this.subs) return;\n\n  var io = this.io;\n  this.subs = [\n    on(io, 'open', bind(this, 'onopen')),\n    on(io, 'packet', bind(this, 'onpacket')),\n    on(io, 'close', bind(this, 'onclose'))\n  ];\n};\n\n/**\n * \"Opens\" the socket.\n *\n * @api public\n */\n\nSocket.prototype.open =\nSocket.prototype.connect = function () {\n  if (this.connected) return this;\n\n  this.subEvents();\n  this.io.open(); // ensure open\n  if ('open' === this.io.readyState) this.onopen();\n  this.emit('connecting');\n  return this;\n};\n\n/**\n * Sends a `message` event.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.send = function () {\n  var args = toArray(arguments);\n  args.unshift('message');\n  this.emit.apply(this, args);\n  return this;\n};\n\n/**\n * Override `emit`.\n * If the event is in `events`, it's emitted normally.\n *\n * @param {String} event name\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.emit = function (ev) {\n  if (events.hasOwnProperty(ev)) {\n    emit.apply(this, arguments);\n    return this;\n  }\n\n  var args = toArray(arguments);\n  var parserType = parser.EVENT; // default\n  if (hasBin(args)) { parserType = parser.BINARY_EVENT; } // binary\n  var packet = { type: parserType, data: args };\n\n  packet.options = {};\n  packet.options.compress = !this.flags || false !== this.flags.compress;\n\n  // event ack callback\n  if ('function' === typeof args[args.length - 1]) {\n    debug('emitting packet with ack id %d', this.ids);\n    this.acks[this.ids] = args.pop();\n    packet.id = this.ids++;\n  }\n\n  if (this.connected) {\n    this.packet(packet);\n  } else {\n    this.sendBuffer.push(packet);\n  }\n\n  delete this.flags;\n\n  return this;\n};\n\n/**\n * Sends a packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.packet = function (packet) {\n  packet.nsp = this.nsp;\n  this.io.packet(packet);\n};\n\n/**\n * Called upon engine `open`.\n *\n * @api private\n */\n\nSocket.prototype.onopen = function () {\n  debug('transport is open - connecting');\n\n  // write connect packet if necessary\n  if ('/' !== this.nsp) {\n    if (this.query) {\n      this.packet({type: parser.CONNECT, query: this.query});\n    } else {\n      this.packet({type: parser.CONNECT});\n    }\n  }\n};\n\n/**\n * Called upon engine `close`.\n *\n * @param {String} reason\n * @api private\n */\n\nSocket.prototype.onclose = function (reason) {\n  debug('close (%s)', reason);\n  this.connected = false;\n  this.disconnected = true;\n  delete this.id;\n  this.emit('disconnect', reason);\n};\n\n/**\n * Called with socket packet.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onpacket = function (packet) {\n  if (packet.nsp !== this.nsp) return;\n\n  switch (packet.type) {\n    case parser.CONNECT:\n      this.onconnect();\n      break;\n\n    case parser.EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.BINARY_EVENT:\n      this.onevent(packet);\n      break;\n\n    case parser.ACK:\n      this.onack(packet);\n      break;\n\n    case parser.BINARY_ACK:\n      this.onack(packet);\n      break;\n\n    case parser.DISCONNECT:\n      this.ondisconnect();\n      break;\n\n    case parser.ERROR:\n      this.emit('error', packet.data);\n      break;\n  }\n};\n\n/**\n * Called upon a server event.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onevent = function (packet) {\n  var args = packet.data || [];\n  debug('emitting event %j', args);\n\n  if (null != packet.id) {\n    debug('attaching ack callback to event');\n    args.push(this.ack(packet.id));\n  }\n\n  if (this.connected) {\n    emit.apply(this, args);\n  } else {\n    this.receiveBuffer.push(args);\n  }\n};\n\n/**\n * Produces an ack callback to emit with an event.\n *\n * @api private\n */\n\nSocket.prototype.ack = function (id) {\n  var self = this;\n  var sent = false;\n  return function () {\n    // prevent double callbacks\n    if (sent) return;\n    sent = true;\n    var args = toArray(arguments);\n    debug('sending ack %j', args);\n\n    var type = hasBin(args) ? parser.BINARY_ACK : parser.ACK;\n    self.packet({\n      type: type,\n      id: id,\n      data: args\n    });\n  };\n};\n\n/**\n * Called upon a server acknowlegement.\n *\n * @param {Object} packet\n * @api private\n */\n\nSocket.prototype.onack = function (packet) {\n  var ack = this.acks[packet.id];\n  if ('function' === typeof ack) {\n    debug('calling ack %s with %j', packet.id, packet.data);\n    ack.apply(this, packet.data);\n    delete this.acks[packet.id];\n  } else {\n    debug('bad ack %s', packet.id);\n  }\n};\n\n/**\n * Called upon server connect.\n *\n * @api private\n */\n\nSocket.prototype.onconnect = function () {\n  this.connected = true;\n  this.disconnected = false;\n  this.emit('connect');\n  this.emitBuffered();\n};\n\n/**\n * Emit buffered events (received and emitted).\n *\n * @api private\n */\n\nSocket.prototype.emitBuffered = function () {\n  var i;\n  for (i = 0; i < this.receiveBuffer.length; i++) {\n    emit.apply(this, this.receiveBuffer[i]);\n  }\n  this.receiveBuffer = [];\n\n  for (i = 0; i < this.sendBuffer.length; i++) {\n    this.packet(this.sendBuffer[i]);\n  }\n  this.sendBuffer = [];\n};\n\n/**\n * Called upon server disconnect.\n *\n * @api private\n */\n\nSocket.prototype.ondisconnect = function () {\n  debug('server disconnect (%s)', this.nsp);\n  this.destroy();\n  this.onclose('io server disconnect');\n};\n\n/**\n * Called upon forced client/server side disconnections,\n * this method ensures the manager stops tracking us and\n * that reconnections don't get triggered for this.\n *\n * @api private.\n */\n\nSocket.prototype.destroy = function () {\n  if (this.subs) {\n    // clean subscriptions to avoid reconnections\n    for (var i = 0; i < this.subs.length; i++) {\n      this.subs[i].destroy();\n    }\n    this.subs = null;\n  }\n\n  this.io.destroy(this);\n};\n\n/**\n * Disconnects the socket manually.\n *\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.close =\nSocket.prototype.disconnect = function () {\n  if (this.connected) {\n    debug('performing disconnect (%s)', this.nsp);\n    this.packet({ type: parser.DISCONNECT });\n  }\n\n  // remove socket from pool\n  this.destroy();\n\n  if (this.connected) {\n    // fire events\n    this.onclose('io client disconnect');\n  }\n  return this;\n};\n\n/**\n * Sets the compress flag.\n *\n * @param {Boolean} if `true`, compresses the sending data\n * @return {Socket} self\n * @api public\n */\n\nSocket.prototype.compress = function (compress) {\n  this.flags = this.flags || {};\n  this.flags.compress = compress;\n  return this;\n};\n\n},{\"./on\":67,\"component-bind\":10,\"component-emitter\":11,\"debug\":14,\"has-binary\":30,\"socket.io-parser\":71,\"to-array\":78}],69:[function(require,module,exports){\n(function (global){\n\n/**\n * Module dependencies.\n */\n\nvar parseuri = require('parseuri');\nvar debug = require('debug')('socket.io-client:url');\n\n/**\n * Module exports.\n */\n\nmodule.exports = url;\n\n/**\n * URL parser.\n *\n * @param {String} url\n * @param {Object} An object meant to mimic window.location.\n *                 Defaults to window.location.\n * @api public\n */\n\nfunction url (uri, loc) {\n  var obj = uri;\n\n  // default to window.location\n  loc = loc || global.location;\n  if (null == uri) uri = loc.protocol + '//' + loc.host;\n\n  // relative path support\n  if ('string' === typeof uri) {\n    if ('/' === uri.charAt(0)) {\n      if ('/' === uri.charAt(1)) {\n        uri = loc.protocol + uri;\n      } else {\n        uri = loc.host + uri;\n      }\n    }\n\n    if (!/^(https?|wss?):\\/\\//.test(uri)) {\n      debug('protocol-less url %s', uri);\n      if ('undefined' !== typeof loc) {\n        uri = loc.protocol + '//' + uri;\n      } else {\n        uri = 'https://' + uri;\n      }\n    }\n\n    // parse\n    debug('parse %s', uri);\n    obj = parseuri(uri);\n  }\n\n  // make sure we treat `localhost:80` and `localhost` equally\n  if (!obj.port) {\n    if (/^(http|ws)$/.test(obj.protocol)) {\n      obj.port = '80';\n    } else if (/^(http|ws)s$/.test(obj.protocol)) {\n      obj.port = '443';\n    }\n  }\n\n  obj.path = obj.path || '/';\n\n  var ipv6 = obj.host.indexOf(':') !== -1;\n  var host = ipv6 ? '[' + obj.host + ']' : obj.host;\n\n  // define unique id\n  obj.id = obj.protocol + '://' + host + ':' + obj.port;\n  // define href\n  obj.href = obj.protocol + '://' + host + (loc && loc.port === obj.port ? '' : (':' + obj.port));\n\n  return obj;\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"debug\":14,\"parseuri\":62}],70:[function(require,module,exports){\n(function (global){\n/*global Blob,File*/\n\n/**\n * Module requirements\n */\n\nvar isArray = require('isarray');\nvar isBuf = require('./is-buffer');\n\n/**\n * Replaces every Buffer | ArrayBuffer in packet with a numbered placeholder.\n * Anything with blobs or files should be fed through removeBlobs before coming\n * here.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @api public\n */\n\nexports.deconstructPacket = function(packet){\n  var buffers = [];\n  var packetData = packet.data;\n\n  function _deconstructPacket(data) {\n    if (!data) return data;\n\n    if (isBuf(data)) {\n      var placeholder = { _placeholder: true, num: buffers.length };\n      buffers.push(data);\n      return placeholder;\n    } else if (isArray(data)) {\n      var newData = new Array(data.length);\n      for (var i = 0; i < data.length; i++) {\n        newData[i] = _deconstructPacket(data[i]);\n      }\n      return newData;\n    } else if ('object' == typeof data && !(data instanceof Date)) {\n      var newData = {};\n      for (var key in data) {\n        newData[key] = _deconstructPacket(data[key]);\n      }\n      return newData;\n    }\n    return data;\n  }\n\n  var pack = packet;\n  pack.data = _deconstructPacket(packetData);\n  pack.attachments = buffers.length; // number of binary 'attachments'\n  return {packet: pack, buffers: buffers};\n};\n\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @api public\n */\n\nexports.reconstructPacket = function(packet, buffers) {\n  var curPlaceHolder = 0;\n\n  function _reconstructPacket(data) {\n    if (data && data._placeholder) {\n      var buf = buffers[data.num]; // appropriate buffer (should be natural order anyway)\n      return buf;\n    } else if (isArray(data)) {\n      for (var i = 0; i < data.length; i++) {\n        data[i] = _reconstructPacket(data[i]);\n      }\n      return data;\n    } else if (data && 'object' == typeof data) {\n      for (var key in data) {\n        data[key] = _reconstructPacket(data[key]);\n      }\n      return data;\n    }\n    return data;\n  }\n\n  packet.data = _reconstructPacket(packet.data);\n  packet.attachments = undefined; // no longer useful\n  return packet;\n};\n\n/**\n * Asynchronously removes Blobs or Files from data via\n * FileReader's readAsArrayBuffer method. Used before encoding\n * data as msgpack. Calls callback with the blobless data.\n *\n * @param {Object} data\n * @param {Function} callback\n * @api private\n */\n\nexports.removeBlobs = function(data, callback) {\n  function _removeBlobs(obj, curKey, containingObject) {\n    if (!obj) return obj;\n\n    // convert any blob\n    if ((global.Blob && obj instanceof Blob) ||\n        (global.File && obj instanceof File)) {\n      pendingBlobs++;\n\n      // async filereader\n      var fileReader = new FileReader();\n      fileReader.onload = function() { // this.result == arraybuffer\n        if (containingObject) {\n          containingObject[curKey] = this.result;\n        }\n        else {\n          bloblessData = this.result;\n        }\n\n        // if nothing pending its callback time\n        if(! --pendingBlobs) {\n          callback(bloblessData);\n        }\n      };\n\n      fileReader.readAsArrayBuffer(obj); // blob -> arraybuffer\n    } else if (isArray(obj)) { // handle array\n      for (var i = 0; i < obj.length; i++) {\n        _removeBlobs(obj[i], i, obj);\n      }\n    } else if (obj && 'object' == typeof obj && !isBuf(obj)) { // and object\n      for (var key in obj) {\n        _removeBlobs(obj[key], key, obj);\n      }\n    }\n  }\n\n  var pendingBlobs = 0;\n  var bloblessData = data;\n  _removeBlobs(bloblessData);\n  if (!pendingBlobs) {\n    callback(bloblessData);\n  }\n};\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./is-buffer\":72,\"isarray\":76}],71:[function(require,module,exports){\n\n/**\n * Module dependencies.\n */\n\nvar debug = require('debug')('socket.io-parser');\nvar json = require('json3');\nvar Emitter = require('component-emitter');\nvar binary = require('./binary');\nvar isBuf = require('./is-buffer');\n\n/**\n * Protocol version.\n *\n * @api public\n */\n\nexports.protocol = 4;\n\n/**\n * Packet types.\n *\n * @api public\n */\n\nexports.types = [\n  'CONNECT',\n  'DISCONNECT',\n  'EVENT',\n  'ACK',\n  'ERROR',\n  'BINARY_EVENT',\n  'BINARY_ACK'\n];\n\n/**\n * Packet type `connect`.\n *\n * @api public\n */\n\nexports.CONNECT = 0;\n\n/**\n * Packet type `disconnect`.\n *\n * @api public\n */\n\nexports.DISCONNECT = 1;\n\n/**\n * Packet type `event`.\n *\n * @api public\n */\n\nexports.EVENT = 2;\n\n/**\n * Packet type `ack`.\n *\n * @api public\n */\n\nexports.ACK = 3;\n\n/**\n * Packet type `error`.\n *\n * @api public\n */\n\nexports.ERROR = 4;\n\n/**\n * Packet type 'binary event'\n *\n * @api public\n */\n\nexports.BINARY_EVENT = 5;\n\n/**\n * Packet type `binary ack`. For acks with binary arguments.\n *\n * @api public\n */\n\nexports.BINARY_ACK = 6;\n\n/**\n * Encoder constructor.\n *\n * @api public\n */\n\nexports.Encoder = Encoder;\n\n/**\n * Decoder constructor.\n *\n * @api public\n */\n\nexports.Decoder = Decoder;\n\n/**\n * A socket.io Encoder instance\n *\n * @api public\n */\n\nfunction Encoder() {}\n\n/**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n * @param {Function} callback - function to handle encodings (likely engine.write)\n * @return Calls callback with Array of encodings\n * @api public\n */\n\nEncoder.prototype.encode = function(obj, callback){\n  debug('encoding packet %j', obj);\n\n  if (exports.BINARY_EVENT == obj.type || exports.BINARY_ACK == obj.type) {\n    encodeAsBinary(obj, callback);\n  }\n  else {\n    var encoding = encodeAsString(obj);\n    callback([encoding]);\n  }\n};\n\n/**\n * Encode packet as string.\n *\n * @param {Object} packet\n * @return {String} encoded\n * @api private\n */\n\nfunction encodeAsString(obj) {\n  var str = '';\n  var nsp = false;\n\n  // first is type\n  str += obj.type;\n\n  // attachments if we have them\n  if (exports.BINARY_EVENT == obj.type || exports.BINARY_ACK == obj.type) {\n    str += obj.attachments;\n    str += '-';\n  }\n\n  // if we have a namespace other than `/`\n  // we append it followed by a comma `,`\n  if (obj.nsp && '/' != obj.nsp) {\n    nsp = true;\n    str += obj.nsp;\n  }\n\n  // immediately followed by the id\n  if (null != obj.id) {\n    if (nsp) {\n      str += ',';\n      nsp = false;\n    }\n    str += obj.id;\n  }\n\n  // json data\n  if (null != obj.data) {\n    if (nsp) str += ',';\n    str += json.stringify(obj.data);\n  }\n\n  debug('encoded %j as %s', obj, str);\n  return str;\n}\n\n/**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n *\n * @param {Object} packet\n * @return {Buffer} encoded\n * @api private\n */\n\nfunction encodeAsBinary(obj, callback) {\n\n  function writeEncoding(bloblessData) {\n    var deconstruction = binary.deconstructPacket(bloblessData);\n    var pack = encodeAsString(deconstruction.packet);\n    var buffers = deconstruction.buffers;\n\n    buffers.unshift(pack); // add packet info to beginning of data list\n    callback(buffers); // write all the buffers\n  }\n\n  binary.removeBlobs(obj, writeEncoding);\n}\n\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n * @api public\n */\n\nfunction Decoder() {\n  this.reconstructor = null;\n}\n\n/**\n * Mix in `Emitter` with Decoder.\n */\n\nEmitter(Decoder.prototype);\n\n/**\n * Decodes an ecoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n * @return {Object} packet\n * @api public\n */\n\nDecoder.prototype.add = function(obj) {\n  var packet;\n  if ('string' == typeof obj) {\n    packet = decodeString(obj);\n    if (exports.BINARY_EVENT == packet.type || exports.BINARY_ACK == packet.type) { // binary packet's json\n      this.reconstructor = new BinaryReconstructor(packet);\n\n      // no attachments, labeled binary but no binary data to follow\n      if (this.reconstructor.reconPack.attachments === 0) {\n        this.emit('decoded', packet);\n      }\n    } else { // non-binary full packet\n      this.emit('decoded', packet);\n    }\n  }\n  else if (isBuf(obj) || obj.base64) { // raw binary data\n    if (!this.reconstructor) {\n      throw new Error('got binary data when not reconstructing a packet');\n    } else {\n      packet = this.reconstructor.takeBinaryData(obj);\n      if (packet) { // received final buffer\n        this.reconstructor = null;\n        this.emit('decoded', packet);\n      }\n    }\n  }\n  else {\n    throw new Error('Unknown type: ' + obj);\n  }\n};\n\n/**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n * @api private\n */\n\nfunction decodeString(str) {\n  var p = {};\n  var i = 0;\n\n  // look up type\n  p.type = Number(str.charAt(0));\n  if (null == exports.types[p.type]) return error();\n\n  // look up attachments if type binary\n  if (exports.BINARY_EVENT == p.type || exports.BINARY_ACK == p.type) {\n    var buf = '';\n    while (str.charAt(++i) != '-') {\n      buf += str.charAt(i);\n      if (i == str.length) break;\n    }\n    if (buf != Number(buf) || str.charAt(i) != '-') {\n      throw new Error('Illegal attachments');\n    }\n    p.attachments = Number(buf);\n  }\n\n  // look up namespace (if any)\n  if ('/' == str.charAt(i + 1)) {\n    p.nsp = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (',' == c) break;\n      p.nsp += c;\n      if (i == str.length) break;\n    }\n  } else {\n    p.nsp = '/';\n  }\n\n  // look up id\n  var next = str.charAt(i + 1);\n  if ('' !== next && Number(next) == next) {\n    p.id = '';\n    while (++i) {\n      var c = str.charAt(i);\n      if (null == c || Number(c) != c) {\n        --i;\n        break;\n      }\n      p.id += str.charAt(i);\n      if (i == str.length) break;\n    }\n    p.id = Number(p.id);\n  }\n\n  // look up json data\n  if (str.charAt(++i)) {\n    p = tryParse(p, str.substr(i));\n  }\n\n  debug('decoded %s as %j', str, p);\n  return p;\n}\n\nfunction tryParse(p, str) {\n  try {\n    p.data = json.parse(str);\n  } catch(e){\n    return error();\n  }\n  return p; \n};\n\n/**\n * Deallocates a parser's resources\n *\n * @api public\n */\n\nDecoder.prototype.destroy = function() {\n  if (this.reconstructor) {\n    this.reconstructor.finishedReconstruction();\n  }\n};\n\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n * @api private\n */\n\nfunction BinaryReconstructor(packet) {\n  this.reconPack = packet;\n  this.buffers = [];\n}\n\n/**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n *   a reconstructed packet object if all buffers have been received.\n * @api private\n */\n\nBinaryReconstructor.prototype.takeBinaryData = function(binData) {\n  this.buffers.push(binData);\n  if (this.buffers.length == this.reconPack.attachments) { // done with buffer list\n    var packet = binary.reconstructPacket(this.reconPack, this.buffers);\n    this.finishedReconstruction();\n    return packet;\n  }\n  return null;\n};\n\n/**\n * Cleans up binary packet reconstruction variables.\n *\n * @api private\n */\n\nBinaryReconstructor.prototype.finishedReconstruction = function() {\n  this.reconPack = null;\n  this.buffers = [];\n};\n\nfunction error(data){\n  return {\n    type: exports.ERROR,\n    data: 'parser error'\n  };\n}\n\n},{\"./binary\":70,\"./is-buffer\":72,\"component-emitter\":73,\"debug\":74,\"json3\":34}],72:[function(require,module,exports){\n(function (global){\n\nmodule.exports = isBuf;\n\n/**\n * Returns true if obj is a buffer or an arraybuffer.\n *\n * @api private\n */\n\nfunction isBuf(obj) {\n  return (global.Buffer && global.Buffer.isBuffer(obj)) ||\n         (global.ArrayBuffer && obj instanceof ArrayBuffer);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],73:[function(require,module,exports){\n\n/**\n * Expose `Emitter`.\n */\n\nmodule.exports = Emitter;\n\n/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nfunction Emitter(obj) {\n  if (obj) return mixin(obj);\n};\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n  for (var key in Emitter.prototype) {\n    obj[key] = Emitter.prototype[key];\n  }\n  return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n  (this._callbacks[event] = this._callbacks[event] || [])\n    .push(fn);\n  return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n  var self = this;\n  this._callbacks = this._callbacks || {};\n\n  function on() {\n    self.off(event, on);\n    fn.apply(this, arguments);\n  }\n\n  on.fn = fn;\n  this.on(event, on);\n  return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n  this._callbacks = this._callbacks || {};\n\n  // all\n  if (0 == arguments.length) {\n    this._callbacks = {};\n    return this;\n  }\n\n  // specific event\n  var callbacks = this._callbacks[event];\n  if (!callbacks) return this;\n\n  // remove all handlers\n  if (1 == arguments.length) {\n    delete this._callbacks[event];\n    return this;\n  }\n\n  // remove specific handler\n  var cb;\n  for (var i = 0; i < callbacks.length; i++) {\n    cb = callbacks[i];\n    if (cb === fn || cb.fn === fn) {\n      callbacks.splice(i, 1);\n      break;\n    }\n  }\n  return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n  this._callbacks = this._callbacks || {};\n  var args = [].slice.call(arguments, 1)\n    , callbacks = this._callbacks[event];\n\n  if (callbacks) {\n    callbacks = callbacks.slice(0);\n    for (var i = 0, len = callbacks.length; i < len; ++i) {\n      callbacks[i].apply(this, args);\n    }\n  }\n\n  return this;\n};\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n  this._callbacks = this._callbacks || {};\n  return this._callbacks[event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n  return !! this.listeners(event).length;\n};\n\n},{}],74:[function(require,module,exports){\n\n/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n               && 'undefined' != typeof chrome.storage\n                  ? chrome.storage.local\n                  : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n  'lightseagreen',\n  'forestgreen',\n  'goldenrod',\n  'dodgerblue',\n  'darkorchid',\n  'crimson'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n  // is webkit? http://stackoverflow.com/a/16459606/376773\n  return ('WebkitAppearance' in document.documentElement.style) ||\n    // is firebug? http://stackoverflow.com/a/398120/376773\n    (window.console && (console.firebug || (console.exception && console.table))) ||\n    // is firefox >= v31?\n    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n    (navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31);\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n  return JSON.stringify(v);\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs() {\n  var args = arguments;\n  var useColors = this.useColors;\n\n  args[0] = (useColors ? '%c' : '')\n    + this.namespace\n    + (useColors ? ' %c' : ' ')\n    + args[0]\n    + (useColors ? '%c ' : ' ')\n    + '+' + exports.humanize(this.diff);\n\n  if (!useColors) return args;\n\n  var c = 'color: ' + this.color;\n  args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1));\n\n  // the final \"%c\" is somewhat tricky, because there could be other\n  // arguments passed either before or after the %c, so we need to\n  // figure out the correct index to insert the CSS into\n  var index = 0;\n  var lastC = 0;\n  args[0].replace(/%[a-z%]/g, function(match) {\n    if ('%%' === match) return;\n    index++;\n    if ('%c' === match) {\n      // we only are interested in the *last* %c\n      // (the user may have provided their own)\n      lastC = index;\n    }\n  });\n\n  args.splice(lastC, 0, c);\n  return args;\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n  // this hackery is required for IE8/9, where\n  // the `console.log` function doesn't have 'apply'\n  return 'object' === typeof console\n    && console.log\n    && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n  try {\n    if (null == namespaces) {\n      exports.storage.removeItem('debug');\n    } else {\n      exports.storage.debug = namespaces;\n    }\n  } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n  var r;\n  try {\n    r = exports.storage.debug;\n  } catch(e) {}\n  return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage(){\n  try {\n    return window.localStorage;\n  } catch (e) {}\n}\n\n},{\"./debug\":75}],75:[function(require,module,exports){\n\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = debug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lowercased letter, i.e. \"n\".\n */\n\nexports.formatters = {};\n\n/**\n * Previously assigned color.\n */\n\nvar prevColor = 0;\n\n/**\n * Previous log timestamp.\n */\n\nvar prevTime;\n\n/**\n * Select a color.\n *\n * @return {Number}\n * @api private\n */\n\nfunction selectColor() {\n  return exports.colors[prevColor++ % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction debug(namespace) {\n\n  // define the `disabled` version\n  function disabled() {\n  }\n  disabled.enabled = false;\n\n  // define the `enabled` version\n  function enabled() {\n\n    var self = enabled;\n\n    // set `diff` timestamp\n    var curr = +new Date();\n    var ms = curr - (prevTime || curr);\n    self.diff = ms;\n    self.prev = prevTime;\n    self.curr = curr;\n    prevTime = curr;\n\n    // add the `color` if not set\n    if (null == self.useColors) self.useColors = exports.useColors();\n    if (null == self.color && self.useColors) self.color = selectColor();\n\n    var args = Array.prototype.slice.call(arguments);\n\n    args[0] = exports.coerce(args[0]);\n\n    if ('string' !== typeof args[0]) {\n      // anything else let's inspect with %o\n      args = ['%o'].concat(args);\n    }\n\n    // apply any `formatters` transformations\n    var index = 0;\n    args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {\n      // if we encounter an escaped % then don't increase the array index\n      if (match === '%%') return match;\n      index++;\n      var formatter = exports.formatters[format];\n      if ('function' === typeof formatter) {\n        var val = args[index];\n        match = formatter.call(self, val);\n\n        // now we need to remove `args[index]` since it's inlined in the `format`\n        args.splice(index, 1);\n        index--;\n      }\n      return match;\n    });\n\n    if ('function' === typeof exports.formatArgs) {\n      args = exports.formatArgs.apply(self, args);\n    }\n    var logFn = enabled.log || exports.log || console.log.bind(console);\n    logFn.apply(self, args);\n  }\n  enabled.enabled = true;\n\n  var fn = exports.enabled(namespace) ? enabled : disabled;\n\n  fn.namespace = namespace;\n\n  return fn;\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n  exports.save(namespaces);\n\n  var split = (namespaces || '').split(/[\\s,]+/);\n  var len = split.length;\n\n  for (var i = 0; i < len; i++) {\n    if (!split[i]) continue; // ignore empty strings\n    namespaces = split[i].replace(/\\*/g, '.*?');\n    if (namespaces[0] === '-') {\n      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n    } else {\n      exports.names.push(new RegExp('^' + namespaces + '$'));\n    }\n  }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n  exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n  var i, len;\n  for (i = 0, len = exports.skips.length; i < len; i++) {\n    if (exports.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (i = 0, len = exports.names.length; i < len; i++) {\n    if (exports.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n\n},{\"ms\":77}],76:[function(require,module,exports){\narguments[4][29][0].apply(exports,arguments)\n},{\"dup\":29}],77:[function(require,module,exports){\n/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} options\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options){\n  options = options || {};\n  if ('string' == typeof val) return parse(val);\n  return options.long\n    ? long(val)\n    : short(val);\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = '' + str;\n  if (str.length > 10000) return;\n  var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);\n  if (!match) return;\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction short(ms) {\n  if (ms >= d) return Math.round(ms / d) + 'd';\n  if (ms >= h) return Math.round(ms / h) + 'h';\n  if (ms >= m) return Math.round(ms / m) + 'm';\n  if (ms >= s) return Math.round(ms / s) + 's';\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction long(ms) {\n  return plural(ms, d, 'day')\n    || plural(ms, h, 'hour')\n    || plural(ms, m, 'minute')\n    || plural(ms, s, 'second')\n    || ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n  if (ms < n) return;\n  if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;\n  return Math.ceil(ms / n) + ' ' + name + 's';\n}\n\n},{}],78:[function(require,module,exports){\nmodule.exports = toArray\n\nfunction toArray(list, index) {\n    var array = []\n\n    index = index || 0\n\n    for (var i = index || 0; i < list.length; i++) {\n        array[i - index] = list[i]\n    }\n\n    return array\n}\n\n},{}],79:[function(require,module,exports){\n(function (global){\n/*! https://mths.be/wtf8 v1.0.0 by @mathias */\n;(function(root) {\n\n\t// Detect free variables `exports`\n\tvar freeExports = typeof exports == 'object' && exports;\n\n\t// Detect free variable `module`\n\tvar freeModule = typeof module == 'object' && module &&\n\t\tmodule.exports == freeExports && module;\n\n\t// Detect free variable `global`, from Node.js or Browserified code,\n\t// and use it as `root`\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {\n\t\troot = freeGlobal;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar stringFromCharCode = String.fromCharCode;\n\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2decode(string) {\n\t\tvar output = [];\n\t\tvar counter = 0;\n\t\tvar length = string.length;\n\t\tvar value;\n\t\tvar extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t// Taken from https://mths.be/punycode\n\tfunction ucs2encode(array) {\n\t\tvar length = array.length;\n\t\tvar index = -1;\n\t\tvar value;\n\t\tvar output = '';\n\t\twhile (++index < length) {\n\t\t\tvalue = array[index];\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t}\n\t\treturn output;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tfunction createByte(codePoint, shift) {\n\t\treturn stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);\n\t}\n\n\tfunction encodeCodePoint(codePoint) {\n\t\tif ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence\n\t\t\treturn stringFromCharCode(codePoint);\n\t\t}\n\t\tvar symbol = '';\n\t\tif ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);\n\t\t}\n\t\telse if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\telse if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence\n\t\t\tsymbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);\n\t\t\tsymbol += createByte(codePoint, 12);\n\t\t\tsymbol += createByte(codePoint, 6);\n\t\t}\n\t\tsymbol += stringFromCharCode((codePoint & 0x3F) | 0x80);\n\t\treturn symbol;\n\t}\n\n\tfunction wtf8encode(string) {\n\t\tvar codePoints = ucs2decode(string);\n\t\tvar length = codePoints.length;\n\t\tvar index = -1;\n\t\tvar codePoint;\n\t\tvar byteString = '';\n\t\twhile (++index < length) {\n\t\t\tcodePoint = codePoints[index];\n\t\t\tbyteString += encodeCodePoint(codePoint);\n\t\t}\n\t\treturn byteString;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tfunction readContinuationByte() {\n\t\tif (byteIndex >= byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\n\t\tvar continuationByte = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\n\t\tif ((continuationByte & 0xC0) == 0x80) {\n\t\t\treturn continuationByte & 0x3F;\n\t\t}\n\n\t\t// If we end up here, it’s not a continuation byte.\n\t\tthrow Error('Invalid continuation byte');\n\t}\n\n\tfunction decodeSymbol() {\n\t\tvar byte1;\n\t\tvar byte2;\n\t\tvar byte3;\n\t\tvar byte4;\n\t\tvar codePoint;\n\n\t\tif (byteIndex > byteCount) {\n\t\t\tthrow Error('Invalid byte index');\n\t\t}\n\n\t\tif (byteIndex == byteCount) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Read the first byte.\n\t\tbyte1 = byteArray[byteIndex] & 0xFF;\n\t\tbyteIndex++;\n\n\t\t// 1-byte sequence (no continuation bytes)\n\t\tif ((byte1 & 0x80) == 0) {\n\t\t\treturn byte1;\n\t\t}\n\n\t\t// 2-byte sequence\n\t\tif ((byte1 & 0xE0) == 0xC0) {\n\t\t\tvar byte2 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x1F) << 6) | byte2;\n\t\t\tif (codePoint >= 0x80) {\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\n\t\t// 3-byte sequence (may include unpaired surrogates)\n\t\tif ((byte1 & 0xF0) == 0xE0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;\n\t\t\tif (codePoint >= 0x0800) {\n\t\t\t\treturn codePoint;\n\t\t\t} else {\n\t\t\t\tthrow Error('Invalid continuation byte');\n\t\t\t}\n\t\t}\n\n\t\t// 4-byte sequence\n\t\tif ((byte1 & 0xF8) == 0xF0) {\n\t\t\tbyte2 = readContinuationByte();\n\t\t\tbyte3 = readContinuationByte();\n\t\t\tbyte4 = readContinuationByte();\n\t\t\tcodePoint = ((byte1 & 0x0F) << 0x12) | (byte2 << 0x0C) |\n\t\t\t\t(byte3 << 0x06) | byte4;\n\t\t\tif (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {\n\t\t\t\treturn codePoint;\n\t\t\t}\n\t\t}\n\n\t\tthrow Error('Invalid WTF-8 detected');\n\t}\n\n\tvar byteArray;\n\tvar byteCount;\n\tvar byteIndex;\n\tfunction wtf8decode(byteString) {\n\t\tbyteArray = ucs2decode(byteString);\n\t\tbyteCount = byteArray.length;\n\t\tbyteIndex = 0;\n\t\tvar codePoints = [];\n\t\tvar tmp;\n\t\twhile ((tmp = decodeSymbol()) !== false) {\n\t\t\tcodePoints.push(tmp);\n\t\t}\n\t\treturn ucs2encode(codePoints);\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar wtf8 = {\n\t\t'version': '1.0.0',\n\t\t'encode': wtf8encode,\n\t\t'decode': wtf8decode\n\t};\n\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine(function() {\n\t\t\treturn wtf8;\n\t\t});\n\t}\telse if (freeExports && !freeExports.nodeType) {\n\t\tif (freeModule) { // in Node.js or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = wtf8;\n\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\tvar object = {};\n\t\t\tvar hasOwnProperty = object.hasOwnProperty;\n\t\t\tfor (var key in wtf8) {\n\t\t\t\thasOwnProperty.call(wtf8, key) && (freeExports[key] = wtf8[key]);\n\t\t\t}\n\t\t}\n\t} else { // in Rhino or a web browser\n\t\troot.wtf8 = wtf8;\n\t}\n\n}(this));\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],80:[function(require,module,exports){\n'use strict';\n\nvar alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split('')\n  , length = 64\n  , map = {}\n  , seed = 0\n  , i = 0\n  , prev;\n\n/**\n * Return a string representing the specified number.\n *\n * @param {Number} num The number to convert.\n * @returns {String} The string representation of the number.\n * @api public\n */\nfunction encode(num) {\n  var encoded = '';\n\n  do {\n    encoded = alphabet[num % length] + encoded;\n    num = Math.floor(num / length);\n  } while (num > 0);\n\n  return encoded;\n}\n\n/**\n * Return the integer value specified by the given string.\n *\n * @param {String} str The string to convert.\n * @returns {Number} The integer value represented by the string.\n * @api public\n */\nfunction decode(str) {\n  var decoded = 0;\n\n  for (i = 0; i < str.length; i++) {\n    decoded = decoded * length + map[str.charAt(i)];\n  }\n\n  return decoded;\n}\n\n/**\n * Yeast: A tiny growing id generator.\n *\n * @returns {String} A unique id.\n * @api public\n */\nfunction yeast() {\n  var now = encode(+new Date());\n\n  if (now !== prev) return seed = 0, prev = now;\n  return now +'.'+ encode(seed++);\n}\n\n//\n// Map each character to its index.\n//\nfor (; i < length; i++) map[alphabet[i]] = i;\n\n//\n// Expose the `yeast`, `encode` and `decode` functions.\n//\nyeast.encode = encode;\nyeast.decode = decode;\nmodule.exports = yeast;\n\n},{}],81:[function(require,module,exports){\nvar css = \"/* required styles */\\n.leaflet-map-pane,\\n.leaflet-tile,\\n.leaflet-marker-icon,\\n.leaflet-marker-shadow,\\n.leaflet-tile-pane,\\n.leaflet-tile-container,\\n.leaflet-overlay-pane,\\n.leaflet-shadow-pane,\\n.leaflet-marker-pane,\\n.leaflet-popup-pane,\\n.leaflet-overlay-pane svg,\\n.leaflet-zoom-box,\\n.leaflet-image-layer,\\n.leaflet-layer {\\n  position: absolute;\\n  left: 0;\\n  top: 0;\\n}\\n.leaflet-container {\\n  overflow: hidden;\\n  -ms-touch-action: none;\\n  touch-action: none;\\n}\\n.leaflet-tile,\\n.leaflet-marker-icon,\\n.leaflet-marker-shadow {\\n  -webkit-user-select: none;\\n  -moz-user-select: none;\\n  user-select: none;\\n  -webkit-user-drag: none;\\n}\\n.leaflet-marker-icon,\\n.leaflet-marker-shadow {\\n  display: block;\\n}\\n/* map is broken in FF if you have max-width: 100% on tiles */\\n.leaflet-container img {\\n  max-width: none !important;\\n}\\n/* stupid Android 2 doesn't understand \\\"max-width: none\\\" properly */\\n.leaflet-container img.leaflet-image-layer {\\n  max-width: 15000px !important;\\n}\\n.leaflet-tile {\\n  filter: inherit;\\n  visibility: hidden;\\n}\\n.leaflet-tile-loaded {\\n  visibility: inherit;\\n}\\n.leaflet-zoom-box {\\n  width: 0;\\n  height: 0;\\n}\\n/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */\\n.leaflet-overlay-pane svg {\\n  -moz-user-select: none;\\n}\\n.leaflet-tile-pane {\\n  z-index: 2;\\n}\\n.leaflet-objects-pane {\\n  z-index: 3;\\n}\\n.leaflet-overlay-pane {\\n  z-index: 4;\\n}\\n.leaflet-shadow-pane {\\n  z-index: 5;\\n}\\n.leaflet-marker-pane {\\n  z-index: 6;\\n}\\n.leaflet-popup-pane {\\n  z-index: 7;\\n}\\n.leaflet-vml-shape {\\n  width: 1px;\\n  height: 1px;\\n}\\n.lvml {\\n  behavior: url(#default#VML);\\n  display: inline-block;\\n  position: absolute;\\n}\\n/* control positioning */\\n.leaflet-control {\\n  position: relative;\\n  z-index: 7;\\n  pointer-events: auto;\\n}\\n.leaflet-top,\\n.leaflet-bottom {\\n  position: absolute;\\n  z-index: 1000;\\n  pointer-events: none;\\n}\\n.leaflet-top {\\n  top: 0;\\n}\\n.leaflet-right {\\n  right: 0;\\n}\\n.leaflet-bottom {\\n  bottom: 0;\\n}\\n.leaflet-left {\\n  left: 0;\\n}\\n.leaflet-control {\\n  float: left;\\n  clear: both;\\n}\\n.leaflet-right .leaflet-control {\\n  float: right;\\n}\\n.leaflet-top .leaflet-control {\\n  margin-top: 10px;\\n}\\n.leaflet-bottom .leaflet-control {\\n  margin-bottom: 10px;\\n}\\n.leaflet-left .leaflet-control {\\n  margin-left: 10px;\\n}\\n.leaflet-right .leaflet-control {\\n  margin-right: 10px;\\n}\\n/* zoom and fade animations */\\n.leaflet-fade-anim .leaflet-tile,\\n.leaflet-fade-anim .leaflet-popup {\\n  opacity: 0;\\n  -webkit-transition: opacity 0.2s linear;\\n  -moz-transition: opacity 0.2s linear;\\n  -o-transition: opacity 0.2s linear;\\n  transition: opacity 0.2s linear;\\n}\\n.leaflet-fade-anim .leaflet-tile-loaded,\\n.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {\\n  opacity: 1;\\n}\\n.leaflet-zoom-anim .leaflet-zoom-animated {\\n  -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);\\n  -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);\\n  -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1);\\n  transition: transform 0.25s cubic-bezier(0,0,0.25,1);\\n}\\n.leaflet-zoom-anim .leaflet-tile,\\n.leaflet-pan-anim .leaflet-tile,\\n.leaflet-touching .leaflet-zoom-animated {\\n  -webkit-transition: none;\\n  -moz-transition: none;\\n  -o-transition: none;\\n  transition: none;\\n}\\n.leaflet-zoom-anim .leaflet-zoom-hide {\\n  visibility: hidden;\\n}\\n/* cursors */\\n.leaflet-clickable {\\n  cursor: pointer;\\n}\\n.leaflet-container {\\n  cursor: -webkit-grab;\\n  cursor: -moz-grab;\\n}\\n.leaflet-popup-pane,\\n.leaflet-control {\\n  cursor: auto;\\n}\\n.leaflet-dragging .leaflet-container,\\n.leaflet-dragging .leaflet-clickable {\\n  cursor: move;\\n  cursor: -webkit-grabbing;\\n  cursor: -moz-grabbing;\\n}\\n/* visual tweaks */\\n.leaflet-container {\\n  background: #ddd;\\n  outline: 0;\\n}\\n.leaflet-container a {\\n  color: #0078A8;\\n}\\n.leaflet-container a.leaflet-active {\\n  outline: 2px solid orange;\\n}\\n.leaflet-zoom-box {\\n  border: 2px dotted #38f;\\n  background: rgba(255,255,255,0.5);\\n}\\n/* general typography */\\n.leaflet-container {\\n  font: 12px/1.5 \\\"Helvetica Neue\\\", Arial, Helvetica, sans-serif;\\n}\\n/* general toolbar styles */\\n.leaflet-bar {\\n  box-shadow: 0 1px 5px rgba(0,0,0,0.65);\\n  border-radius: 4px;\\n}\\n.leaflet-bar a,\\n.leaflet-bar a:hover {\\n  background-color: #fff;\\n  border-bottom: 1px solid #ccc;\\n  width: 26px;\\n  height: 26px;\\n  line-height: 26px;\\n  display: block;\\n  text-align: center;\\n  text-decoration: none;\\n  color: black;\\n}\\n.leaflet-bar a,\\n.leaflet-control-layers-toggle {\\n  background-position: 50% 50%;\\n  background-repeat: no-repeat;\\n  display: block;\\n}\\n.leaflet-bar a:hover {\\n  background-color: #f4f4f4;\\n}\\n.leaflet-bar a:first-child {\\n  border-top-left-radius: 4px;\\n  border-top-right-radius: 4px;\\n}\\n.leaflet-bar a:last-child {\\n  border-bottom-left-radius: 4px;\\n  border-bottom-right-radius: 4px;\\n  border-bottom: none;\\n}\\n.leaflet-bar a.leaflet-disabled {\\n  cursor: default;\\n  background-color: #f4f4f4;\\n  color: #bbb;\\n}\\n.leaflet-touch .leaflet-bar a {\\n  width: 30px;\\n  height: 30px;\\n  line-height: 30px;\\n}\\n/* zoom control */\\n.leaflet-control-zoom-in,\\n.leaflet-control-zoom-out {\\n  font: bold 18px 'Lucida Console', Monaco, monospace;\\n  text-indent: 1px;\\n}\\n.leaflet-control-zoom-out {\\n  font-size: 20px;\\n}\\n.leaflet-touch .leaflet-control-zoom-in {\\n  font-size: 22px;\\n}\\n.leaflet-touch .leaflet-control-zoom-out {\\n  font-size: 24px;\\n}\\n/* layers control */\\n.leaflet-control-layers {\\n  box-shadow: 0 1px 5px rgba(0,0,0,0.4);\\n  background: #fff;\\n  border-radius: 5px;\\n}\\n.leaflet-control-layers-toggle {\\n  background-image: url(../../../../../node_modules/leaflet/dist/images/layers.png);\\n  width: 36px;\\n  height: 36px;\\n}\\n.leaflet-retina .leaflet-control-layers-toggle {\\n  background-image: url(../../../../../node_modules/leaflet/dist/images/layers-2x.png);\\n  background-size: 26px 26px;\\n}\\n.leaflet-touch .leaflet-control-layers-toggle {\\n  width: 44px;\\n  height: 44px;\\n}\\n.leaflet-control-layers .leaflet-control-layers-list,\\n.leaflet-control-layers-expanded .leaflet-control-layers-toggle {\\n  display: none;\\n}\\n.leaflet-control-layers-expanded .leaflet-control-layers-list {\\n  display: block;\\n  position: relative;\\n}\\n.leaflet-control-layers-expanded {\\n  padding: 6px 10px 6px 6px;\\n  color: #333;\\n  background: #fff;\\n}\\n.leaflet-control-layers-selector {\\n  margin-top: 2px;\\n  position: relative;\\n  top: 1px;\\n}\\n.leaflet-control-layers label {\\n  display: block;\\n}\\n.leaflet-control-layers-separator {\\n  height: 0;\\n  border-top: 1px solid #ddd;\\n  margin: 5px -10px 5px -6px;\\n}\\n/* attribution and scale controls */\\n.leaflet-container .leaflet-control-attribution {\\n  background: #fff;\\n  background: rgba(255, 255, 255, 0.7);\\n  margin: 0;\\n}\\n.leaflet-control-attribution,\\n.leaflet-control-scale-line {\\n  padding: 0 5px;\\n  color: #333;\\n}\\n.leaflet-control-attribution a {\\n  text-decoration: none;\\n}\\n.leaflet-control-attribution a:hover {\\n  text-decoration: underline;\\n}\\n.leaflet-container .leaflet-control-attribution,\\n.leaflet-container .leaflet-control-scale {\\n  font-size: 11px;\\n}\\n.leaflet-left .leaflet-control-scale {\\n  margin-left: 5px;\\n}\\n.leaflet-bottom .leaflet-control-scale {\\n  margin-bottom: 5px;\\n}\\n.leaflet-control-scale-line {\\n  border: 2px solid #777;\\n  border-top: none;\\n  line-height: 1.1;\\n  padding: 2px 5px 1px;\\n  font-size: 11px;\\n  white-space: nowrap;\\n  overflow: hidden;\\n  -moz-box-sizing: content-box;\\n  box-sizing: content-box;\\n  background: #fff;\\n  background: rgba(255, 255, 255, 0.5);\\n}\\n.leaflet-control-scale-line:not(:first-child) {\\n  border-top: 2px solid #777;\\n  border-bottom: none;\\n  margin-top: -2px;\\n}\\n.leaflet-control-scale-line:not(:first-child):not(:last-child) {\\n  border-bottom: 2px solid #777;\\n}\\n.leaflet-touch .leaflet-control-attribution,\\n.leaflet-touch .leaflet-control-layers,\\n.leaflet-touch .leaflet-bar {\\n  box-shadow: none;\\n}\\n.leaflet-touch .leaflet-control-layers,\\n.leaflet-touch .leaflet-bar {\\n  border: 2px solid rgba(0,0,0,0.2);\\n  background-clip: padding-box;\\n}\\n/* popup */\\n.leaflet-popup {\\n  position: absolute;\\n  text-align: center;\\n}\\n.leaflet-popup-content-wrapper {\\n  padding: 1px;\\n  text-align: left;\\n  border-radius: 12px;\\n}\\n.leaflet-popup-content {\\n  margin: 13px 19px;\\n  line-height: 1.4;\\n}\\n.leaflet-popup-content p {\\n  margin: 18px 0;\\n}\\n.leaflet-popup-tip-container {\\n  margin: 0 auto;\\n  width: 40px;\\n  height: 20px;\\n  position: relative;\\n  overflow: hidden;\\n}\\n.leaflet-popup-tip {\\n  width: 17px;\\n  height: 17px;\\n  padding: 1px;\\n  margin: -10px auto 0;\\n  -webkit-transform: rotate(45deg);\\n  -moz-transform: rotate(45deg);\\n  -ms-transform: rotate(45deg);\\n  -o-transform: rotate(45deg);\\n  transform: rotate(45deg);\\n}\\n.leaflet-popup-content-wrapper,\\n.leaflet-popup-tip {\\n  background: white;\\n  box-shadow: 0 3px 14px rgba(0,0,0,0.4);\\n}\\n.leaflet-container a.leaflet-popup-close-button {\\n  position: absolute;\\n  top: 0;\\n  right: 0;\\n  padding: 4px 4px 0 0;\\n  text-align: center;\\n  width: 18px;\\n  height: 14px;\\n  font: 16px/14px Tahoma, Verdana, sans-serif;\\n  color: #c3c3c3;\\n  text-decoration: none;\\n  font-weight: bold;\\n  background: transparent;\\n}\\n.leaflet-container a.leaflet-popup-close-button:hover {\\n  color: #999;\\n}\\n.leaflet-popup-scrolled {\\n  overflow: auto;\\n  border-bottom: 1px solid #ddd;\\n  border-top: 1px solid #ddd;\\n}\\n.leaflet-oldie .leaflet-popup-content-wrapper {\\n  zoom: 1;\\n}\\n.leaflet-oldie .leaflet-popup-tip {\\n  width: 24px;\\n  margin: 0 auto;\\n  -ms-filter: \\\"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)\\\";\\n  filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);\\n}\\n.leaflet-oldie .leaflet-popup-tip-container {\\n  margin-top: -1px;\\n}\\n.leaflet-oldie .leaflet-control-zoom,\\n.leaflet-oldie .leaflet-control-layers,\\n.leaflet-oldie .leaflet-popup-content-wrapper,\\n.leaflet-oldie .leaflet-popup-tip {\\n  border: 1px solid #999;\\n}\\n/* div icon */\\n.leaflet-div-icon {\\n  background: #fff;\\n  border: 1px solid #666;\\n}\\n.leaflet-routing-container,\\n.leaflet-routing-error {\\n  width: 320px;\\n  background-color: white;\\n  padding-top: 4px;\\n  transition: all 0.2s ease;\\n  box-sizing: border-box;\\n}\\n.leaflet-control-container .leaflet-routing-container-hide {\\n  width: 32px;\\n  height: 32px;\\n}\\n.leaflet-routing-container h2 {\\n  font-size: 14px;\\n}\\n.leaflet-routing-container h3 {\\n  font-size: 12px;\\n  font-weight: normal;\\n}\\n.leaflet-routing-collapsible .leaflet-routing-geocoders {\\n  margin-top: 20px;\\n}\\n.leaflet-routing-alt,\\n.leaflet-routing-geocoders,\\n.leaflet-routing-error {\\n  padding: 6px;\\n  margin-top: 2px;\\n  margin-bottom: 6px;\\n  border-bottom: 1px solid #ccc;\\n  max-height: 320px;\\n  overflow-y: auto;\\n  transition: all 0.2s ease;\\n}\\n.leaflet-control-container .leaflet-routing-container-hide .leaflet-routing-alt,\\n.leaflet-control-container .leaflet-routing-container-hide .leaflet-routing-geocoders {\\n  display: none;\\n}\\n.leaflet-bar .leaflet-routing-alt:last-child {\\n  border-bottom: none;\\n}\\n.leaflet-routing-alt-minimized {\\n  color: #888;\\n  max-height: 64px;\\n  overflow: hidden;\\n  cursor: pointer;\\n}\\n.leaflet-routing-alt table {\\n  border-collapse: collapse;\\n}\\n.leaflet-routing-alt tr:hover {\\n  background-color: #eee;\\n  cursor: pointer;\\n}\\n.leaflet-routing-alt::-webkit-scrollbar {\\n  width: 8px;\\n}\\n.leaflet-routing-alt::-webkit-scrollbar-track {\\n  border-radius: 2px;\\n  background-color: #eee;\\n}\\n.leaflet-routing-alt::-webkit-scrollbar-thumb {\\n  border-radius: 2px;\\n  background-color: #888;\\n}\\n.leaflet-routing-icon {\\n  background-image: url('../../../../../node_modules/leaflet-routing-machine/dist/leaflet.routing.icons.png');\\n  -webkit-background-size: 240px 20px;\\n  background-size: 240px 20px;\\n  background-repeat: no-repeat;\\n  margin: 0;\\n  content: '';\\n  display: inline-block;\\n  vertical-align: top;\\n  width: 20px;\\n  height: 20px;\\n}\\n.leaflet-routing-icon-continue {\\n  background-position: 0 0;\\n}\\n.leaflet-routing-icon-sharp-right {\\n  background-position: -20px 0;\\n}\\n.leaflet-routing-icon-turn-right {\\n  background-position: -40px 0;\\n}\\n.leaflet-routing-icon-bear-right {\\n  background-position: -60px 0;\\n}\\n.leaflet-routing-icon-u-turn {\\n  background-position: -80px 0;\\n}\\n.leaflet-routing-icon-sharp-left {\\n  background-position: -100px 0;\\n}\\n.leaflet-routing-icon-turn-left {\\n  background-position: -120px 0;\\n}\\n.leaflet-routing-icon-bear-left {\\n  background-position: -140px 0;\\n}\\n.leaflet-routing-icon-depart {\\n  background-position: -160px 0;\\n}\\n.leaflet-routing-icon-enter-roundabout {\\n  background-position: -180px 0;\\n}\\n.leaflet-routing-icon-arrive {\\n  background-position: -200px 0;\\n}\\n.leaflet-routing-icon-via {\\n  background-position: -220px 0;\\n}\\n.leaflet-routing-geocoders div {\\n  padding: 4px 0px 4px 0px;\\n}\\n.leaflet-routing-geocoders input {\\n  width: 303px;\\n  width: calc(100% - 4px);\\n  line-height: 1.67;\\n  border: 1px solid #ccc;\\n}\\n.leaflet-routing-geocoders button {\\n  font: bold 18px 'Lucida Console', Monaco, monospace;\\n  border: 1px solid #ccc;\\n  border-radius: 4px;\\n  background-color: white;\\n  margin: 0;\\n  margin-right: 3px;\\n  float: right;\\n  cursor: pointer;\\n  transition: background-color 0.2s ease;\\n}\\n.leaflet-routing-add-waypoint:after {\\n  content: '+';\\n}\\n.leaflet-routing-reverse-waypoints:after {\\n  font-weight: normal;\\n  content: '\\\\21c5';\\n}\\n.leaflet-routing-geocoders button:hover {\\n  background-color: #eee;\\n}\\n.leaflet-routing-geocoders input,\\n.leaflet-routing-remove-waypoint,\\n.leaflet-routing-geocoder {\\n  position: relative;\\n}\\n.leaflet-routing-geocoder-result {\\n  font: 12px/1.5 \\\"Helvetica Neue\\\", Arial, Helvetica, sans-serif;\\n  position: absolute;\\n  max-height: 0;\\n  overflow: hidden;\\n  transition: all 0.5s ease;\\n  z-index: 1000;\\n  /* Arbitrary, but try to be above \\\"most\\\" things. */\\n}\\n.leaflet-routing-geocoder-result table {\\n  width: 100%;\\n  border: 1px solid #ccc;\\n  border-radius: 0 0 4px 4px;\\n  background-color: white;\\n  cursor: pointer;\\n}\\n.leaflet-routing-geocoder-result-open {\\n  max-height: 800px;\\n}\\n.leaflet-routing-geocoder-selected,\\n.leaflet-routing-geocoder-result tr:hover {\\n  background-color: #eee;\\n}\\n.leaflet-routing-geocoder-no-results {\\n  font-style: italic;\\n  color: #888;\\n}\\n.leaflet-routing-remove-waypoint {\\n  background-color: transparent;\\n  display: inline-block;\\n  vertical-align: middle;\\n  cursor: pointer;\\n}\\n.leaflet-routing-remove-waypoint:after {\\n  position: absolute;\\n  display: block;\\n  width: 15px;\\n  height: 1px;\\n  z-index: 1;\\n  right: 1px;\\n  top: 4px;\\n  bottom: 0;\\n  margin: auto;\\n  padding: 2px;\\n  font-size: 18px;\\n  font-weight: bold;\\n  content: \\\"\\\\00d7\\\";\\n  text-align: center;\\n  cursor: pointer;\\n  color: #ccc;\\n  background: white;\\n  padding-bottom: 16px;\\n  margin-top: -16px;\\n  padding-right: 4px;\\n  line-height: 1;\\n}\\n.leaflet-routing-remove-waypoint:hover {\\n  color: black;\\n}\\n.leaflet-routing-instruction-distance {\\n  width: 48px;\\n}\\n.leaflet-routing-collapse-btn {\\n  position: absolute;\\n  top: 0;\\n  right: 6px;\\n  font-size: 24px;\\n  color: #ccc;\\n  font-weight: bold;\\n}\\n.leaflet-routing-collapse-btn:after {\\n  content: '\\\\00d7';\\n}\\n.leaflet-routing-container-hide .leaflet-routing-collapse-btn {\\n  position: relative;\\n  left: 4px;\\n  top: 4px;\\n  display: block;\\n  width: 26px;\\n  height: 23px;\\n  background-image: url('../../../../../node_modules/leaflet-routing-machine/dist/routing-icon.png');\\n}\\n.leaflet-routing-container-hide .leaflet-routing-collapse-btn:after {\\n  content: none;\\n}\\n.leaflet-top .leaflet-routing-container.leaflet-routing-container-hide {\\n  margin-top: 10px !important;\\n}\\n.leaflet-right .leaflet-routing-container.leaflet-routing-container-hide {\\n  margin-right: 10px !important;\\n}\\n.leaflet-bottom .leaflet-routing-container.leaflet-routing-container-hide {\\n  margin-bottom: 10px !important;\\n}\\n.leaflet-left .leaflet-routing-container.leaflet-routing-container-hide {\\n  margin-left: 10px !important;\\n}\\n@media only screen and (max-width: 640px) {\\n  .leaflet-routing-container {\\n    margin: 0 !important;\\n    padding: 0 !important;\\n    width: 100%;\\n    height: 100%;\\n  }\\n}\\nhtml,\\nbody,\\n#mapid {\\n  width: 100%;\\n  height: 100%;\\n  margin: 0;\\n  padding: 0;\\n}\\n.mobMarker {\\n  animation-name: pulse_animation;\\n  animation-duration: 700ms;\\n  transform-origin: 70% 70%;\\n  animation-iteration-count: infinite;\\n  animation-timing-function: linear;\\n}\\n@-webkit-keyframes pulse_animation {\\n  0% {\\n    transform: scale(1);\\n  }\\n\\n  50% {\\n    transform: scale(1.3);\\n  }\\n\\n  100% {\\n    transform: scale(1);\\n  }\\n}\\n@-moz-keyframes pulse_animation {\\n  0% {\\n    transform: scale(1);\\n  }\\n\\n  50% {\\n    transform: scale(1.3);\\n  }\\n\\n  100% {\\n    transform: scale(1);\\n  }\\n}\\n@-o-keyframes pulse_animation {\\n  0% {\\n    transform: scale(1);\\n  }\\n\\n  50% {\\n    transform: scale(1.3);\\n  }\\n\\n  100% {\\n    transform: scale(1);\\n  }\\n}\\n@-ms-keyframes pulse_animation {\\n  0% {\\n    transform: scale(1);\\n  }\\n\\n  50% {\\n    transform: scale(1.3);\\n  }\\n\\n  100% {\\n    transform: scale(1);\\n  }\\n}\\n@keyframes pulse_animation {\\n  0% {\\n    transform: scale(1);\\n  }\\n\\n  50% {\\n    transform: scale(1.3);\\n  }\\n\\n  100% {\\n    transform: scale(1);\\n  }\\n}\\n\"; (require(\"browserify-css\").createStyle(css, { \"href\": \"style.css\" }, { \"insertAt\": \"bottom\" })); module.exports = css;\n},{\"browserify-css\":9}]},{},[2])(2)\n});"]}