{"version":3,"file":"mapbox-web-draw.mjs","sources":["../src/lib/mode_handler.js","../node_modules/wgs84/index.js","../node_modules/@mapbox/geojson-area/index.js","../src/constants.js","../src/lib/sort_features.js","../src/lib/string_set.js","../src/lib/features_at.js","../src/lib/map_event_to_bounding_box.js","../src/lib/get_features_and_set_cursor.js","../src/lib/euclidean_distance.js","../src/lib/is_click.js","../src/lib/is_tap.js","../node_modules/hat/index.js","../node_modules/@turf/helpers/dist/es/index.js","../node_modules/@turf/invariant/dist/es/index.js","../node_modules/@turf/destination/dist/es/index.js","../node_modules/@turf/circle/dist/es/index.js","../node_modules/@turf/distance/dist/es/index.js","../src/modes/custom/lib/plot_util.js","../src/modes/custom/lib/algorithm/ellipse.js","../src/modes/custom/lib/algorithm/fine_arrow.js","../src/modes/custom/lib/algorithm/assault_direction.js","../src/modes/custom/lib/algorithm/attack_arrow.js","../src/modes/custom/lib/algorithm/tailed_attack_arrow.js","../src/modes/custom/lib/algorithm/squad_combat.js","../src/modes/custom/lib/algorithm/double_arrow.js","../src/modes/custom/lib/algorithm/circle.js","../src/modes/custom/lib/algorithm/rectangle.js","../src/modes/custom/lib/algorithm/sector.js","../src/modes/custom/lib/algorithm/lune.js","../src/modes/custom/lib/algorithm/closed_curve.js","../src/modes/custom/lib/algorithm/curve.js","../src/modes/custom/lib/algorithm/arc.js","../src/feature_types/feature.js","../src/feature_types/point.js","../src/feature_types/line_string.js","../src/feature_types/polygon.js","../src/feature_types/multi_feature.js","../src/modes/mode_interface_accessors.js","../src/modes/mode_interface.js","../src/modes/object_to_mode.js","../src/lib/to_dense_array.js","../src/render.js","../src/store.js","../node_modules/xtend/immutable.js","../src/lib/common_selectors.js","../node_modules/@mapbox/point-geometry/index.js","../src/lib/mouse_event_point.js","../src/lib/create_vertex.js","../src/lib/create_supplementary_points.js","../src/lib/create_midpoint.js","../src/lib/double_click_zoom.js","../node_modules/@mapbox/geojson-normalize/index.js","../node_modules/geojson-flatten/dist/index.js","../node_modules/@mapbox/geojson-coords/index.js","../node_modules/@mapbox/geojson-coords/flatten.js","../node_modules/traverse/index.js","../node_modules/@mapbox/extent/index.js","../node_modules/@mapbox/geojson-extent/index.js","../src/lib/constrain_feature_movement.js","../src/lib/move_features.js","../src/modes/simple_select.js","../src/modes/direct_select.js","../src/modes/draw_point.js","../src/lib/is_event_at_coordinates.js","../src/modes/draw_polygon.js","../src/modes/draw_line_string.js","../src/modes/static_mode.js","../src/modes/custom/polygon_shape_factory.js","../src/modes/custom/polyline_shape_factory.js","../src/modes/custom/draw_symbol.js","../src/modes/custom/index.js","../src/modes/index.js","../src/options.js","../src/lib/theme.js","../node_modules/lodash.isequal/index.js","../node_modules/jsonlint-lines/lib/jsonlint.js","../src/api.js","../src/lib/string_sets_are_equal.js","../src/ui.js","../src/index.js","../src/events.js"],"sourcesContent":["\nconst ModeHandler = function(mode, DrawContext) {\n\n  const handlers = {\n    drag: [],\n    click: [],\n    mousemove: [],\n    mousedown: [],\n    mouseup: [],\n    mouseout: [],\n    keydown: [],\n    keyup: [],\n    touchstart: [],\n    touchmove: [],\n    touchend: [],\n    tap: []\n  };\n\n  const ctx = {\n    on(event, selector, fn) {\n      if (handlers[event] === undefined) {\n        throw new Error(`Invalid event type: ${event}`);\n      }\n      handlers[event].push({\n        selector,\n        fn\n      });\n    },\n    render(id) {\n      DrawContext.store.featureChanged(id);\n    }\n  };\n\n  const delegate = function (eventName, event) {\n    const handles = handlers[eventName];\n    let iHandle = handles.length;\n    while (iHandle--) {\n      const handle = handles[iHandle];\n      if (handle.selector(event)) {\n        const skipRender = handle.fn.call(ctx, event);\n        if (!skipRender) {\n          DrawContext.store.render();\n        }\n        DrawContext.ui.updateMapClasses();\n\n        // ensure an event is only handled once\n        // we do this to let modes have multiple overlapping selectors\n        // and relay on order of oppertations to filter\n        break;\n      }\n    }\n  };\n\n  mode.start.call(ctx);\n\n  return {\n    render: mode.render,\n    stop() {\n      if (mode.stop) mode.stop();\n    },\n    trash() {\n      if (mode.trash) {\n        mode.trash();\n        DrawContext.store.render();\n      }\n    },\n    combineFeatures() {\n      if (mode.combineFeatures) {\n        mode.combineFeatures();\n      }\n    },\n    uncombineFeatures() {\n      if (mode.uncombineFeatures) {\n        mode.uncombineFeatures();\n      }\n    },\n    drag(event) {\n      delegate('drag', event);\n    },\n    click(event) {\n      delegate('click', event);\n    },\n    mousemove(event) {\n      delegate('mousemove', event);\n    },\n    mousedown(event) {\n      delegate('mousedown', event);\n    },\n    mouseup(event) {\n      delegate('mouseup', event);\n    },\n    mouseout(event) {\n      delegate('mouseout', event);\n    },\n    keydown(event) {\n      delegate('keydown', event);\n    },\n    keyup(event) {\n      delegate('keyup', event);\n    },\n    touchstart(event) {\n      delegate('touchstart', event);\n    },\n    touchmove(event) {\n      delegate('touchmove', event);\n    },\n    touchend(event) {\n      delegate('touchend', event);\n    },\n    tap(event) {\n      delegate('tap', event);\n    }\n  };\n};\n\nexport default ModeHandler;\n","module.exports.RADIUS = 6378137;\nmodule.exports.FLATTENING = 1/298.257223563;\nmodule.exports.POLAR_RADIUS = 6356752.3142;\n","var wgs84 = require('wgs84');\n\nmodule.exports.geometry = geometry;\nmodule.exports.ring = ringArea;\n\nfunction geometry(_) {\n    var area = 0, i;\n    switch (_.type) {\n        case 'Polygon':\n            return polygonArea(_.coordinates);\n        case 'MultiPolygon':\n            for (i = 0; i < _.coordinates.length; i++) {\n                area += polygonArea(_.coordinates[i]);\n            }\n            return area;\n        case 'Point':\n        case 'MultiPoint':\n        case 'LineString':\n        case 'MultiLineString':\n            return 0;\n        case 'GeometryCollection':\n            for (i = 0; i < _.geometries.length; i++) {\n                area += geometry(_.geometries[i]);\n            }\n            return area;\n    }\n}\n\nfunction polygonArea(coords) {\n    var area = 0;\n    if (coords && coords.length > 0) {\n        area += Math.abs(ringArea(coords[0]));\n        for (var i = 1; i < coords.length; i++) {\n            area -= Math.abs(ringArea(coords[i]));\n        }\n    }\n    return area;\n}\n\n/**\n * Calculate the approximate area of the polygon were it projected onto\n *     the earth.  Note that this area will be positive if ring is oriented\n *     clockwise, otherwise it will be negative.\n *\n * Reference:\n * Robert. G. Chamberlain and William H. Duquette, \"Some Algorithms for\n *     Polygons on a Sphere\", JPL Publication 07-03, Jet Propulsion\n *     Laboratory, Pasadena, CA, June 2007 http://trs-new.jpl.nasa.gov/dspace/handle/2014/40409\n *\n * Returns:\n * {float} The approximate signed geodesic area of the polygon in square\n *     meters.\n */\n\nfunction ringArea(coords) {\n    var p1, p2, p3, lowerIndex, middleIndex, upperIndex, i,\n    area = 0,\n    coordsLength = coords.length;\n\n    if (coordsLength > 2) {\n        for (i = 0; i < coordsLength; i++) {\n            if (i === coordsLength - 2) {// i = N-2\n                lowerIndex = coordsLength - 2;\n                middleIndex = coordsLength -1;\n                upperIndex = 0;\n            } else if (i === coordsLength - 1) {// i = N-1\n                lowerIndex = coordsLength - 1;\n                middleIndex = 0;\n                upperIndex = 1;\n            } else { // i = 0 to N-3\n                lowerIndex = i;\n                middleIndex = i+1;\n                upperIndex = i+2;\n            }\n            p1 = coords[lowerIndex];\n            p2 = coords[middleIndex];\n            p3 = coords[upperIndex];\n            area += ( rad(p3[0]) - rad(p1[0]) ) * Math.sin( rad(p2[1]));\n        }\n\n        area = area * wgs84.RADIUS * wgs84.RADIUS / 2;\n    }\n\n    return area;\n}\n\nfunction rad(_) {\n    return _ * Math.PI / 180;\n}","export const classes = {\n  CONTROL_BASE: 'mapboxgl-ctrl',\n  CONTROL_PREFIX: 'mapboxgl-ctrl-',\n  CONTROL_BUTTON: 'mapbox-gl-draw_ctrl-draw-btn',\n  CONTROL_BUTTON_LINE: 'mapbox-gl-draw_line',\n  CONTROL_BUTTON_POLYGON: 'mapbox-gl-draw_polygon',\n  CONTROL_BUTTON_POINT: 'mapbox-gl-draw_point',\n  CONTROL_BUTTON_TRASH: 'mapbox-gl-draw_trash',\n  CONTROL_BUTTON_COMBINE_FEATURES: 'mapbox-gl-draw_combine',\n  CONTROL_BUTTON_UNCOMBINE_FEATURES: 'mapbox-gl-draw_uncombine',\n  CONTROL_GROUP: 'mapboxgl-ctrl-group',\n  ATTRIBUTION: 'mapboxgl-ctrl-attrib',\n  ACTIVE_BUTTON: 'active',\n  BOX_SELECT: 'mapbox-gl-draw_boxselect'\n};\n\nexport const sources = {\n  HOT: 'mapbox-gl-draw-hot',\n  COLD: 'mapbox-gl-draw-cold'\n};\n\nexport const cursors = {\n  ADD: 'add',\n  MOVE: 'move',\n  DRAG: 'drag',\n  POINTER: 'pointer',\n  NONE: 'none'\n};\n\nexport const types = {\n  POLYGON: 'polygon',\n  LINE: 'line_string',\n  POINT: 'point'\n};\n\nexport const geojsonTypes = {\n  FEATURE: 'Feature',\n  POLYGON: 'Polygon',\n  LINE_STRING: 'LineString',\n  POINT: 'Point',\n  FEATURE_COLLECTION: 'FeatureCollection',\n  MULTI_PREFIX: 'Multi',\n  MULTI_POINT: 'MultiPoint',\n  MULTI_LINE_STRING: 'MultiLineString',\n  MULTI_POLYGON: 'MultiPolygon'\n};\n\nexport const modes = {\n  DRAW_LINE_STRING: 'draw_line_string',\n  DRAW_POLYGON: 'draw_polygon',\n  DRAW_POINT: 'draw_point',\n  SIMPLE_SELECT: 'simple_select',\n  DIRECT_SELECT: 'direct_select',\n  STATIC: 'static'\n};\n\nexport const events = {\n  CREATE: 'draw.create',\n  DELETE: 'draw.delete',\n  UPDATE: 'draw.update',\n  SELECTION_CHANGE: 'draw.selectionchange',\n  MODE_CHANGE: 'draw.modechange',\n  ACTIONABLE: 'draw.actionable',\n  RENDER: 'draw.render',\n  COMBINE_FEATURES: 'draw.combine',\n  UNCOMBINE_FEATURES: 'draw.uncombine'\n};\n\nexport const updateActions = {\n  MOVE: 'move',\n  CHANGE_COORDINATES: 'change_coordinates'\n};\n\nexport const meta = {\n  FEATURE: 'feature',\n  MIDPOINT: 'midpoint',\n  VERTEX: 'vertex'\n};\n\nexport const activeStates = {\n  ACTIVE: 'true',\n  INACTIVE: 'false'\n};\n\nexport const interactions = [\n  'scrollZoom',\n  'boxZoom',\n  'dragRotate',\n  'dragPan',\n  'keyboard',\n  'doubleClickZoom',\n  'touchZoomRotate'\n];\n\nexport const LAT_MIN = -90;\nexport const LAT_RENDERED_MIN = -85;\nexport const LAT_MAX = 90;\nexport const LAT_RENDERED_MAX = 85;\nexport const LNG_MIN = -270;\nexport const LNG_MAX = 270;\n","import area from '@mapbox/geojson-area';\nimport * as Constants from '../constants';\n\nconst FEATURE_SORT_RANKS = {\n  Point: 0,\n  LineString: 1,\n  Polygon: 2\n};\n\nfunction comparator(a, b) {\n  const score = FEATURE_SORT_RANKS[a.geometry.type] - FEATURE_SORT_RANKS[b.geometry.type];\n\n  if (score === 0 && a.geometry.type === Constants.geojsonTypes.POLYGON) {\n    return a.area - b.area;\n  }\n\n  return score;\n}\n\n// Sort in the order above, then sort polygons by area ascending.\nfunction sortFeatures(features) {\n  return features.map((feature) => {\n    if (feature.geometry.type === Constants.geojsonTypes.POLYGON) {\n      feature.area = area.geometry({\n        type: Constants.geojsonTypes.FEATURE,\n        property: {},\n        geometry: feature.geometry\n      });\n    }\n    return feature;\n  }).sort(comparator).map((feature) => {\n    delete feature.area;\n    return feature;\n  });\n}\n\nexport default sortFeatures;\n","function StringSet(items) {\n  this._items = {};\n  this._nums = {};\n  this._length = items ? items.length : 0;\n  if (!items) return;\n  for (let i = 0, l = items.length; i < l; i++) {\n    this.add(items[i]);\n    if (items[i] === undefined) continue;\n    if (typeof items[i] === 'string') this._items[items[i]] = i;\n    else this._nums[items[i]] = i;\n\n  }\n}\n\nStringSet.prototype.add = function(x) {\n  if (this.has(x)) return this;\n  this._length++;\n  if (typeof x === 'string') this._items[x] = this._length;\n  else this._nums[x] = this._length;\n  return this;\n};\n\nStringSet.prototype.delete = function(x) {\n  if (this.has(x) === false) return this;\n  this._length--;\n  delete this._items[x];\n  delete this._nums[x];\n  return this;\n};\n\nStringSet.prototype.has = function(x) {\n  if (typeof x !== 'string' && typeof x !== 'number') return false;\n  return this._items[x] !== undefined || this._nums[x] !== undefined;\n};\n\nStringSet.prototype.values = function() {\n  const values = [];\n  Object.keys(this._items).forEach((k) => {\n    values.push({ k, v: this._items[k] });\n  });\n  Object.keys(this._nums).forEach((k) => {\n    values.push({ k: JSON.parse(k), v: this._nums[k] });\n  });\n\n  return values.sort((a, b) => a.v - b.v).map(a => a.k);\n};\n\nStringSet.prototype.clear = function() {\n  this._length = 0;\n  this._items = {};\n  this._nums = {};\n  return this;\n};\n\nexport default StringSet;\n","import sortFeatures from './sort_features';\nimport mapEventToBoundingBox from './map_event_to_bounding_box';\nimport * as Constants from '../constants';\nimport StringSet from './string_set';\n\nconst META_TYPES = [\n  Constants.meta.FEATURE,\n  Constants.meta.MIDPOINT,\n  Constants.meta.VERTEX\n];\n\n// Requires either event or bbox\nexport default {\n  click: featuresAtClick,\n  touch: featuresAtTouch\n};\n\nfunction featuresAtClick(event, bbox, ctx) {\n  return featuresAt(event, bbox, ctx, ctx.options.clickBuffer);\n}\n\nfunction featuresAtTouch(event, bbox, ctx) {\n  return featuresAt(event, bbox, ctx, ctx.options.touchBuffer);\n}\n\nfunction featuresAt(event, bbox, ctx, buffer) {\n  if (ctx.map === null) return [];\n\n  const box = (event) ? mapEventToBoundingBox(event, buffer) : bbox;\n\n  const queryParams = {};\n  if (ctx.options.styles) queryParams.layers = ctx.options.styles.map(s => s.id);\n\n  const features = ctx.map.queryRenderedFeatures(box, queryParams)\n    .filter(feature => META_TYPES.indexOf(feature.properties.meta) !== -1);\n\n  const featureIds = new StringSet();\n  const uniqueFeatures = [];\n  features.forEach((feature) => {\n    const featureId = feature.properties.id;\n    if (featureIds.has(featureId)) return;\n    featureIds.add(featureId);\n    uniqueFeatures.push(feature);\n  });\n\n  return sortFeatures(uniqueFeatures);\n}\n","/**\n * Returns a bounding box representing the event's location.\n *\n * @param {Event} mapEvent - Mapbox GL JS map event, with a point properties.\n * @return {Array<Array<number>>} Bounding box.\n */\nfunction mapEventToBoundingBox(mapEvent, buffer = 0) {\n  return [\n    [mapEvent.point.x - buffer, mapEvent.point.y - buffer],\n    [mapEvent.point.x + buffer, mapEvent.point.y + buffer]\n  ];\n}\n\nexport default mapEventToBoundingBox;\n","import featuresAt from './features_at';\nimport * as Constants from '../constants';\n\nexport default function getFeatureAtAndSetCursors(event, ctx) {\n  const features = featuresAt.click(event, null, ctx);\n  const classes = { mouse: Constants.cursors.NONE };\n\n  if (features[0]) {\n    classes.mouse = (features[0].properties.active === Constants.activeStates.ACTIVE) ?\n      Constants.cursors.MOVE : Constants.cursors.POINTER;\n    classes.feature = features[0].properties.meta;\n  }\n\n  if (ctx.events.currentModeName().indexOf('draw') !== -1) {\n    classes.mouse = Constants.cursors.ADD;\n  }\n\n  ctx.ui.queueMapClasses(classes);\n  ctx.ui.updateMapClasses();\n\n  return features[0];\n}\n","export default function(a, b) {\n  const x = a.x - b.x;\n  const y = a.y - b.y;\n  return Math.sqrt((x * x) + (y * y));\n}\n","import euclideanDistance from './euclidean_distance';\n\nconst FINE_TOLERANCE = 4;\nconst GROSS_TOLERANCE = 12;\nconst INTERVAL = 500;\n\nexport default function isClick(start, end, options = {}) {\n  const fineTolerance = (options.fineTolerance != null) ? options.fineTolerance : FINE_TOLERANCE;\n  const grossTolerance = (options.grossTolerance != null) ? options.grossTolerance : GROSS_TOLERANCE;\n  const interval = (options.interval != null) ? options.interval : INTERVAL;\n\n  start.point = start.point || end.point;\n  start.time = start.time || end.time;\n  const moveDistance = euclideanDistance(start.point, end.point);\n\n  return moveDistance < fineTolerance ||\n    (moveDistance < grossTolerance && (end.time - start.time) < interval);\n}\n","import euclideanDistance from './euclidean_distance';\n\nconst TOLERANCE = 25;\nconst INTERVAL = 250;\n\nexport default function isTap(start, end, options = {}) {\n  const tolerance = (options.tolerance != null) ? options.tolerance : TOLERANCE;\n  const interval = (options.interval != null) ? options.interval : INTERVAL;\n\n  start.point = start.point || end.point;\n  start.time = start.time || end.time;\n  const moveDistance = euclideanDistance(start.point, end.point);\n\n  return moveDistance < tolerance && (end.time - start.time) < interval;\n}\n","var hat = module.exports = function (bits, base) {\n    if (!base) base = 16;\n    if (bits === undefined) bits = 128;\n    if (bits <= 0) return '0';\n    \n    var digits = Math.log(Math.pow(2, bits)) / Math.log(base);\n    for (var i = 2; digits === Infinity; i *= 2) {\n        digits = Math.log(Math.pow(2, bits / i)) / Math.log(base) * i;\n    }\n    \n    var rem = digits - Math.floor(digits);\n    \n    var res = '';\n    \n    for (var i = 0; i < Math.floor(digits); i++) {\n        var x = Math.floor(Math.random() * base).toString(base);\n        res = x + res;\n    }\n    \n    if (rem) {\n        var b = Math.pow(base, rem);\n        var x = Math.floor(Math.random() * b).toString(base);\n        res = x + res;\n    }\n    \n    var parsed = parseInt(res, base);\n    if (parsed !== Infinity && parsed >= Math.pow(2, bits)) {\n        return hat(bits, base)\n    }\n    else return res;\n};\n\nhat.rack = function (bits, base, expandBy) {\n    var fn = function (data) {\n        var iters = 0;\n        do {\n            if (iters ++ > 10) {\n                if (expandBy) bits += expandBy;\n                else throw new Error('too many ID collisions, use more bits')\n            }\n            \n            var id = hat(bits, base);\n        } while (Object.hasOwnProperty.call(hats, id));\n        \n        hats[id] = data;\n        return id;\n    };\n    var hats = fn.hats = {};\n    \n    fn.get = function (id) {\n        return fn.hats[id];\n    };\n    \n    fn.set = function (id, value) {\n        fn.hats[id] = value;\n        return fn;\n    };\n    \n    fn.bits = bits || 128;\n    fn.base = base || 16;\n    return fn;\n};\n","/**\n * @module helpers\n */\n/**\n * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.\n *\n * @memberof helpers\n * @type {number}\n */\nexport var earthRadius = 6371008.8;\n/**\n * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.\n *\n * @memberof helpers\n * @type {Object}\n */\nexport var factors = {\n    centimeters: earthRadius * 100,\n    centimetres: earthRadius * 100,\n    degrees: earthRadius / 111325,\n    feet: earthRadius * 3.28084,\n    inches: earthRadius * 39.37,\n    kilometers: earthRadius / 1000,\n    kilometres: earthRadius / 1000,\n    meters: earthRadius,\n    metres: earthRadius,\n    miles: earthRadius / 1609.344,\n    millimeters: earthRadius * 1000,\n    millimetres: earthRadius * 1000,\n    nauticalmiles: earthRadius / 1852,\n    radians: 1,\n    yards: earthRadius * 1.0936,\n};\n/**\n * Units of measurement factors based on 1 meter.\n *\n * @memberof helpers\n * @type {Object}\n */\nexport var unitsFactors = {\n    centimeters: 100,\n    centimetres: 100,\n    degrees: 1 / 111325,\n    feet: 3.28084,\n    inches: 39.37,\n    kilometers: 1 / 1000,\n    kilometres: 1 / 1000,\n    meters: 1,\n    metres: 1,\n    miles: 1 / 1609.344,\n    millimeters: 1000,\n    millimetres: 1000,\n    nauticalmiles: 1 / 1852,\n    radians: 1 / earthRadius,\n    yards: 1.0936133,\n};\n/**\n * Area of measurement factors based on 1 square meter.\n *\n * @memberof helpers\n * @type {Object}\n */\nexport var areaFactors = {\n    acres: 0.000247105,\n    centimeters: 10000,\n    centimetres: 10000,\n    feet: 10.763910417,\n    hectares: 0.0001,\n    inches: 1550.003100006,\n    kilometers: 0.000001,\n    kilometres: 0.000001,\n    meters: 1,\n    metres: 1,\n    miles: 3.86e-7,\n    millimeters: 1000000,\n    millimetres: 1000000,\n    yards: 1.195990046,\n};\n/**\n * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.\n *\n * @name feature\n * @param {Geometry} geometry input geometry\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature} a GeoJSON Feature\n * @example\n * var geometry = {\n *   \"type\": \"Point\",\n *   \"coordinates\": [110, 50]\n * };\n *\n * var feature = turf.feature(geometry);\n *\n * //=feature\n */\nexport function feature(geom, properties, options) {\n    if (options === void 0) { options = {}; }\n    var feat = { type: \"Feature\" };\n    if (options.id === 0 || options.id) {\n        feat.id = options.id;\n    }\n    if (options.bbox) {\n        feat.bbox = options.bbox;\n    }\n    feat.properties = properties || {};\n    feat.geometry = geom;\n    return feat;\n}\n/**\n * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.\n * For GeometryCollection type use `helpers.geometryCollection`\n *\n * @name geometry\n * @param {string} type Geometry Type\n * @param {Array<any>} coordinates Coordinates\n * @param {Object} [options={}] Optional Parameters\n * @returns {Geometry} a GeoJSON Geometry\n * @example\n * var type = \"Point\";\n * var coordinates = [110, 50];\n * var geometry = turf.geometry(type, coordinates);\n * // => geometry\n */\nexport function geometry(type, coordinates, _options) {\n    if (_options === void 0) { _options = {}; }\n    switch (type) {\n        case \"Point\":\n            return point(coordinates).geometry;\n        case \"LineString\":\n            return lineString(coordinates).geometry;\n        case \"Polygon\":\n            return polygon(coordinates).geometry;\n        case \"MultiPoint\":\n            return multiPoint(coordinates).geometry;\n        case \"MultiLineString\":\n            return multiLineString(coordinates).geometry;\n        case \"MultiPolygon\":\n            return multiPolygon(coordinates).geometry;\n        default:\n            throw new Error(type + \" is invalid\");\n    }\n}\n/**\n * Creates a {@link Point} {@link Feature} from a Position.\n *\n * @name point\n * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<Point>} a Point feature\n * @example\n * var point = turf.point([-75.343, 39.984]);\n *\n * //=point\n */\nexport function point(coordinates, properties, options) {\n    if (options === void 0) { options = {}; }\n    if (!coordinates) {\n        throw new Error(\"coordinates is required\");\n    }\n    if (!Array.isArray(coordinates)) {\n        throw new Error(\"coordinates must be an Array\");\n    }\n    if (coordinates.length < 2) {\n        throw new Error(\"coordinates must be at least 2 numbers long\");\n    }\n    if (!isNumber(coordinates[0]) || !isNumber(coordinates[1])) {\n        throw new Error(\"coordinates must contain numbers\");\n    }\n    var geom = {\n        type: \"Point\",\n        coordinates: coordinates,\n    };\n    return feature(geom, properties, options);\n}\n/**\n * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.\n *\n * @name points\n * @param {Array<Array<number>>} coordinates an array of Points\n * @param {Object} [properties={}] Translate these properties to each Feature\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Point>} Point Feature\n * @example\n * var points = turf.points([\n *   [-75, 39],\n *   [-80, 45],\n *   [-78, 50]\n * ]);\n *\n * //=points\n */\nexport function points(coordinates, properties, options) {\n    if (options === void 0) { options = {}; }\n    return featureCollection(coordinates.map(function (coords) {\n        return point(coords, properties);\n    }), options);\n}\n/**\n * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.\n *\n * @name polygon\n * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<Polygon>} Polygon Feature\n * @example\n * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });\n *\n * //=polygon\n */\nexport function polygon(coordinates, properties, options) {\n    if (options === void 0) { options = {}; }\n    for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {\n        var ring = coordinates_1[_i];\n        if (ring.length < 4) {\n            throw new Error(\"Each LinearRing of a Polygon must have 4 or more Positions.\");\n        }\n        for (var j = 0; j < ring[ring.length - 1].length; j++) {\n            // Check if first point of Polygon contains two numbers\n            if (ring[ring.length - 1][j] !== ring[0][j]) {\n                throw new Error(\"First and last Position are not equivalent.\");\n            }\n        }\n    }\n    var geom = {\n        type: \"Polygon\",\n        coordinates: coordinates,\n    };\n    return feature(geom, properties, options);\n}\n/**\n * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.\n *\n * @name polygons\n * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection\n * @example\n * var polygons = turf.polygons([\n *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],\n *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],\n * ]);\n *\n * //=polygons\n */\nexport function polygons(coordinates, properties, options) {\n    if (options === void 0) { options = {}; }\n    return featureCollection(coordinates.map(function (coords) {\n        return polygon(coords, properties);\n    }), options);\n}\n/**\n * Creates a {@link LineString} {@link Feature} from an Array of Positions.\n *\n * @name lineString\n * @param {Array<Array<number>>} coordinates an array of Positions\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<LineString>} LineString Feature\n * @example\n * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});\n * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});\n *\n * //=linestring1\n * //=linestring2\n */\nexport function lineString(coordinates, properties, options) {\n    if (options === void 0) { options = {}; }\n    if (coordinates.length < 2) {\n        throw new Error(\"coordinates must be an array of two or more positions\");\n    }\n    var geom = {\n        type: \"LineString\",\n        coordinates: coordinates,\n    };\n    return feature(geom, properties, options);\n}\n/**\n * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.\n *\n * @name lineStrings\n * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]\n * associated with the FeatureCollection\n * @param {string|number} [options.id] Identifier associated with the FeatureCollection\n * @returns {FeatureCollection<LineString>} LineString FeatureCollection\n * @example\n * var linestrings = turf.lineStrings([\n *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],\n *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]\n * ]);\n *\n * //=linestrings\n */\nexport function lineStrings(coordinates, properties, options) {\n    if (options === void 0) { options = {}; }\n    return featureCollection(coordinates.map(function (coords) {\n        return lineString(coords, properties);\n    }), options);\n}\n/**\n * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.\n *\n * @name featureCollection\n * @param {Feature[]} features input features\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {FeatureCollection} FeatureCollection of Features\n * @example\n * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});\n * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});\n * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});\n *\n * var collection = turf.featureCollection([\n *   locationA,\n *   locationB,\n *   locationC\n * ]);\n *\n * //=collection\n */\nexport function featureCollection(features, options) {\n    if (options === void 0) { options = {}; }\n    var fc = { type: \"FeatureCollection\" };\n    if (options.id) {\n        fc.id = options.id;\n    }\n    if (options.bbox) {\n        fc.bbox = options.bbox;\n    }\n    fc.features = features;\n    return fc;\n}\n/**\n * Creates a {@link Feature<MultiLineString>} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiLineString\n * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiLineString>} a MultiLineString feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);\n *\n * //=multiLine\n */\nexport function multiLineString(coordinates, properties, options) {\n    if (options === void 0) { options = {}; }\n    var geom = {\n        type: \"MultiLineString\",\n        coordinates: coordinates,\n    };\n    return feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature<MultiPoint>} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiPoint\n * @param {Array<Array<number>>} coordinates an array of Positions\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPoint>} a MultiPoint feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPt = turf.multiPoint([[0,0],[10,10]]);\n *\n * //=multiPt\n */\nexport function multiPoint(coordinates, properties, options) {\n    if (options === void 0) { options = {}; }\n    var geom = {\n        type: \"MultiPoint\",\n        coordinates: coordinates,\n    };\n    return feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature<MultiPolygon>} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name multiPolygon\n * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<MultiPolygon>} a multipolygon feature\n * @throws {Error} if no coordinates are passed\n * @example\n * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);\n *\n * //=multiPoly\n *\n */\nexport function multiPolygon(coordinates, properties, options) {\n    if (options === void 0) { options = {}; }\n    var geom = {\n        type: \"MultiPolygon\",\n        coordinates: coordinates,\n    };\n    return feature(geom, properties, options);\n}\n/**\n * Creates a {@link Feature<GeometryCollection>} based on a\n * coordinate array. Properties can be added optionally.\n *\n * @name geometryCollection\n * @param {Array<Geometry>} geometries an array of GeoJSON Geometries\n * @param {Object} [properties={}] an Object of key-value pairs to add as properties\n * @param {Object} [options={}] Optional Parameters\n * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature\n * @param {string|number} [options.id] Identifier associated with the Feature\n * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature\n * @example\n * var pt = turf.geometry(\"Point\", [100, 0]);\n * var line = turf.geometry(\"LineString\", [[101, 0], [102, 1]]);\n * var collection = turf.geometryCollection([pt, line]);\n *\n * // => collection\n */\nexport function geometryCollection(geometries, properties, options) {\n    if (options === void 0) { options = {}; }\n    var geom = {\n        type: \"GeometryCollection\",\n        geometries: geometries,\n    };\n    return feature(geom, properties, options);\n}\n/**\n * Round number to precision\n *\n * @param {number} num Number\n * @param {number} [precision=0] Precision\n * @returns {number} rounded number\n * @example\n * turf.round(120.4321)\n * //=120\n *\n * turf.round(120.4321, 2)\n * //=120.43\n */\nexport function round(num, precision) {\n    if (precision === void 0) { precision = 0; }\n    if (precision && !(precision >= 0)) {\n        throw new Error(\"precision must be a positive number\");\n    }\n    var multiplier = Math.pow(10, precision || 0);\n    return Math.round(num * multiplier) / multiplier;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @name radiansToLength\n * @param {number} radians in radians across the sphere\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} distance\n */\nexport function radiansToLength(radians, units) {\n    if (units === void 0) { units = \"kilometers\"; }\n    var factor = factors[units];\n    if (!factor) {\n        throw new Error(units + \" units is invalid\");\n    }\n    return radians * factor;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @name lengthToRadians\n * @param {number} distance in real units\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} radians\n */\nexport function lengthToRadians(distance, units) {\n    if (units === void 0) { units = \"kilometers\"; }\n    var factor = factors[units];\n    if (!factor) {\n        throw new Error(units + \" units is invalid\");\n    }\n    return distance / factor;\n}\n/**\n * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet\n *\n * @name lengthToDegrees\n * @param {number} distance in real units\n * @param {string} [units=\"kilometers\"] can be degrees, radians, miles, inches, yards, metres,\n * meters, kilometres, kilometers.\n * @returns {number} degrees\n */\nexport function lengthToDegrees(distance, units) {\n    return radiansToDegrees(lengthToRadians(distance, units));\n}\n/**\n * Converts any bearing angle from the north line direction (positive clockwise)\n * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line\n *\n * @name bearingToAzimuth\n * @param {number} bearing angle, between -180 and +180 degrees\n * @returns {number} angle between 0 and 360 degrees\n */\nexport function bearingToAzimuth(bearing) {\n    var angle = bearing % 360;\n    if (angle < 0) {\n        angle += 360;\n    }\n    return angle;\n}\n/**\n * Converts an angle in radians to degrees\n *\n * @name radiansToDegrees\n * @param {number} radians angle in radians\n * @returns {number} degrees between 0 and 360 degrees\n */\nexport function radiansToDegrees(radians) {\n    var degrees = radians % (2 * Math.PI);\n    return (degrees * 180) / Math.PI;\n}\n/**\n * Converts an angle in degrees to radians\n *\n * @name degreesToRadians\n * @param {number} degrees angle between 0 and 360 degrees\n * @returns {number} angle in radians\n */\nexport function degreesToRadians(degrees) {\n    var radians = degrees % 360;\n    return (radians * Math.PI) / 180;\n}\n/**\n * Converts a length to the requested unit.\n * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet\n *\n * @param {number} length to be converted\n * @param {Units} [originalUnit=\"kilometers\"] of the length\n * @param {Units} [finalUnit=\"kilometers\"] returned unit\n * @returns {number} the converted length\n */\nexport function convertLength(length, originalUnit, finalUnit) {\n    if (originalUnit === void 0) { originalUnit = \"kilometers\"; }\n    if (finalUnit === void 0) { finalUnit = \"kilometers\"; }\n    if (!(length >= 0)) {\n        throw new Error(\"length must be a positive number\");\n    }\n    return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);\n}\n/**\n * Converts a area to the requested unit.\n * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches, hectares\n * @param {number} area to be converted\n * @param {Units} [originalUnit=\"meters\"] of the distance\n * @param {Units} [finalUnit=\"kilometers\"] returned unit\n * @returns {number} the converted area\n */\nexport function convertArea(area, originalUnit, finalUnit) {\n    if (originalUnit === void 0) { originalUnit = \"meters\"; }\n    if (finalUnit === void 0) { finalUnit = \"kilometers\"; }\n    if (!(area >= 0)) {\n        throw new Error(\"area must be a positive number\");\n    }\n    var startFactor = areaFactors[originalUnit];\n    if (!startFactor) {\n        throw new Error(\"invalid original units\");\n    }\n    var finalFactor = areaFactors[finalUnit];\n    if (!finalFactor) {\n        throw new Error(\"invalid final units\");\n    }\n    return (area / startFactor) * finalFactor;\n}\n/**\n * isNumber\n *\n * @param {*} num Number to validate\n * @returns {boolean} true/false\n * @example\n * turf.isNumber(123)\n * //=true\n * turf.isNumber('foo')\n * //=false\n */\nexport function isNumber(num) {\n    return !isNaN(num) && num !== null && !Array.isArray(num);\n}\n/**\n * isObject\n *\n * @param {*} input variable to validate\n * @returns {boolean} true/false\n * @example\n * turf.isObject({elevation: 10})\n * //=true\n * turf.isObject('foo')\n * //=false\n */\nexport function isObject(input) {\n    return !!input && input.constructor === Object;\n}\n/**\n * Validate BBox\n *\n * @private\n * @param {Array<number>} bbox BBox to validate\n * @returns {void}\n * @throws Error if BBox is not valid\n * @example\n * validateBBox([-180, -40, 110, 50])\n * //=OK\n * validateBBox([-180, -40])\n * //=Error\n * validateBBox('Foo')\n * //=Error\n * validateBBox(5)\n * //=Error\n * validateBBox(null)\n * //=Error\n * validateBBox(undefined)\n * //=Error\n */\nexport function validateBBox(bbox) {\n    if (!bbox) {\n        throw new Error(\"bbox is required\");\n    }\n    if (!Array.isArray(bbox)) {\n        throw new Error(\"bbox must be an Array\");\n    }\n    if (bbox.length !== 4 && bbox.length !== 6) {\n        throw new Error(\"bbox must be an Array of 4 or 6 numbers\");\n    }\n    bbox.forEach(function (num) {\n        if (!isNumber(num)) {\n            throw new Error(\"bbox must only contain numbers\");\n        }\n    });\n}\n/**\n * Validate Id\n *\n * @private\n * @param {string|number} id Id to validate\n * @returns {void}\n * @throws Error if Id is not valid\n * @example\n * validateId([-180, -40, 110, 50])\n * //=Error\n * validateId([-180, -40])\n * //=Error\n * validateId('Foo')\n * //=OK\n * validateId(5)\n * //=OK\n * validateId(null)\n * //=Error\n * validateId(undefined)\n * //=Error\n */\nexport function validateId(id) {\n    if (!id) {\n        throw new Error(\"id is required\");\n    }\n    if ([\"string\", \"number\"].indexOf(typeof id) === -1) {\n        throw new Error(\"id must be a number or a string\");\n    }\n}\n","import { isNumber, } from \"@turf/helpers\";\n/**\n * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.\n *\n * @name getCoord\n * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers\n * @returns {Array<number>} coordinates\n * @example\n * var pt = turf.point([10, 10]);\n *\n * var coord = turf.getCoord(pt);\n * //= [10, 10]\n */\nexport function getCoord(coord) {\n    if (!coord) {\n        throw new Error(\"coord is required\");\n    }\n    if (!Array.isArray(coord)) {\n        if (coord.type === \"Feature\" &&\n            coord.geometry !== null &&\n            coord.geometry.type === \"Point\") {\n            return coord.geometry.coordinates;\n        }\n        if (coord.type === \"Point\") {\n            return coord.coordinates;\n        }\n    }\n    if (Array.isArray(coord) &&\n        coord.length >= 2 &&\n        !Array.isArray(coord[0]) &&\n        !Array.isArray(coord[1])) {\n        return coord;\n    }\n    throw new Error(\"coord must be GeoJSON Point or an Array of numbers\");\n}\n/**\n * Unwrap coordinates from a Feature, Geometry Object or an Array\n *\n * @name getCoords\n * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array\n * @returns {Array<any>} coordinates\n * @example\n * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);\n *\n * var coords = turf.getCoords(poly);\n * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]\n */\nexport function getCoords(coords) {\n    if (Array.isArray(coords)) {\n        return coords;\n    }\n    // Feature\n    if (coords.type === \"Feature\") {\n        if (coords.geometry !== null) {\n            return coords.geometry.coordinates;\n        }\n    }\n    else {\n        // Geometry\n        if (coords.coordinates) {\n            return coords.coordinates;\n        }\n    }\n    throw new Error(\"coords must be GeoJSON Feature, Geometry Object or an Array\");\n}\n/**\n * Checks if coordinates contains a number\n *\n * @name containsNumber\n * @param {Array<any>} coordinates GeoJSON Coordinates\n * @returns {boolean} true if Array contains a number\n */\nexport function containsNumber(coordinates) {\n    if (coordinates.length > 1 &&\n        isNumber(coordinates[0]) &&\n        isNumber(coordinates[1])) {\n        return true;\n    }\n    if (Array.isArray(coordinates[0]) && coordinates[0].length) {\n        return containsNumber(coordinates[0]);\n    }\n    throw new Error(\"coordinates must only contain numbers\");\n}\n/**\n * Enforce expectations about types of GeoJSON objects for Turf.\n *\n * @name geojsonType\n * @param {GeoJSON} value any GeoJSON object\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nexport function geojsonType(value, type, name) {\n    if (!type || !name) {\n        throw new Error(\"type and name required\");\n    }\n    if (!value || value.type !== type) {\n        throw new Error(\"Invalid input to \" +\n            name +\n            \": must be a \" +\n            type +\n            \", given \" +\n            value.type);\n    }\n}\n/**\n * Enforce expectations about types of {@link Feature} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @name featureOf\n * @param {Feature} feature a feature with an expected geometry type\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} error if value is not the expected type.\n */\nexport function featureOf(feature, type, name) {\n    if (!feature) {\n        throw new Error(\"No feature passed\");\n    }\n    if (!name) {\n        throw new Error(\".featureOf() requires a name\");\n    }\n    if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n        throw new Error(\"Invalid input to \" + name + \", Feature with geometry required\");\n    }\n    if (!feature.geometry || feature.geometry.type !== type) {\n        throw new Error(\"Invalid input to \" +\n            name +\n            \": must be a \" +\n            type +\n            \", given \" +\n            feature.geometry.type);\n    }\n}\n/**\n * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.\n * Internally this uses {@link geojsonType} to judge geometry types.\n *\n * @name collectionOf\n * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged\n * @param {string} type expected GeoJSON type\n * @param {string} name name of calling function\n * @throws {Error} if value is not the expected type.\n */\nexport function collectionOf(featureCollection, type, name) {\n    if (!featureCollection) {\n        throw new Error(\"No featureCollection passed\");\n    }\n    if (!name) {\n        throw new Error(\".collectionOf() requires a name\");\n    }\n    if (!featureCollection || featureCollection.type !== \"FeatureCollection\") {\n        throw new Error(\"Invalid input to \" + name + \", FeatureCollection required\");\n    }\n    for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {\n        var feature = _a[_i];\n        if (!feature || feature.type !== \"Feature\" || !feature.geometry) {\n            throw new Error(\"Invalid input to \" + name + \", Feature with geometry required\");\n        }\n        if (!feature.geometry || feature.geometry.type !== type) {\n            throw new Error(\"Invalid input to \" +\n                name +\n                \": must be a \" +\n                type +\n                \", given \" +\n                feature.geometry.type);\n        }\n    }\n}\n/**\n * Get Geometry from Feature or Geometry Object\n *\n * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object\n * @returns {Geometry|null} GeoJSON Geometry Object\n * @throws {Error} if geojson is not a Feature or Geometry Object\n * @example\n * var point = {\n *   \"type\": \"Feature\",\n *   \"properties\": {},\n *   \"geometry\": {\n *     \"type\": \"Point\",\n *     \"coordinates\": [110, 40]\n *   }\n * }\n * var geom = turf.getGeom(point)\n * //={\"type\": \"Point\", \"coordinates\": [110, 40]}\n */\nexport function getGeom(geojson) {\n    if (geojson.type === \"Feature\") {\n        return geojson.geometry;\n    }\n    return geojson;\n}\n/**\n * Get GeoJSON object's type, Geometry type is prioritize.\n *\n * @param {GeoJSON} geojson GeoJSON object\n * @param {string} [name=\"geojson\"] name of the variable to display in error message (unused)\n * @returns {string} GeoJSON type\n * @example\n * var point = {\n *   \"type\": \"Feature\",\n *   \"properties\": {},\n *   \"geometry\": {\n *     \"type\": \"Point\",\n *     \"coordinates\": [110, 40]\n *   }\n * }\n * var geom = turf.getType(point)\n * //=\"Point\"\n */\nexport function getType(geojson, _name) {\n    if (geojson.type === \"FeatureCollection\") {\n        return \"FeatureCollection\";\n    }\n    if (geojson.type === \"GeometryCollection\") {\n        return \"GeometryCollection\";\n    }\n    if (geojson.type === \"Feature\" && geojson.geometry !== null) {\n        return geojson.geometry.type;\n    }\n    return geojson.type;\n}\n","// http://en.wikipedia.org/wiki/Haversine_formula\n// http://www.movable-type.co.uk/scripts/latlong.html\nimport { degreesToRadians, lengthToRadians, point, radiansToDegrees, } from \"@turf/helpers\";\nimport { getCoord } from \"@turf/invariant\";\n/**\n * Takes a {@link Point} and calculates the location of a destination point given a distance in\n * degrees, radians, miles, or kilometers; and bearing in degrees.\n * This uses the [Haversine formula](http://en.wikipedia.org/wiki/Haversine_formula) to account for global curvature.\n *\n * @name destination\n * @param {Coord} origin starting point\n * @param {number} distance distance from the origin point\n * @param {number} bearing ranging from -180 to 180\n * @param {Object} [options={}] Optional parameters\n * @param {string} [options.units='kilometers'] miles, kilometers, degrees, or radians\n * @param {Object} [options.properties={}] Translate properties to Point\n * @returns {Feature<Point>} destination point\n * @example\n * var point = turf.point([-75.343, 39.984]);\n * var distance = 50;\n * var bearing = 90;\n * var options = {units: 'miles'};\n *\n * var destination = turf.destination(point, distance, bearing, options);\n *\n * //addToMap\n * var addToMap = [point, destination]\n * destination.properties['marker-color'] = '#f00';\n * point.properties['marker-color'] = '#0f0';\n */\nexport default function destination(origin, distance, bearing, options) {\n    if (options === void 0) { options = {}; }\n    // Handle input\n    var coordinates1 = getCoord(origin);\n    var longitude1 = degreesToRadians(coordinates1[0]);\n    var latitude1 = degreesToRadians(coordinates1[1]);\n    var bearingRad = degreesToRadians(bearing);\n    var radians = lengthToRadians(distance, options.units);\n    // Main\n    var latitude2 = Math.asin(Math.sin(latitude1) * Math.cos(radians) +\n        Math.cos(latitude1) * Math.sin(radians) * Math.cos(bearingRad));\n    var longitude2 = longitude1 +\n        Math.atan2(Math.sin(bearingRad) * Math.sin(radians) * Math.cos(latitude1), Math.cos(radians) - Math.sin(latitude1) * Math.sin(latitude2));\n    var lng = radiansToDegrees(longitude2);\n    var lat = radiansToDegrees(latitude2);\n    return point([lng, lat], options.properties);\n}\n","import destination from \"@turf/destination\";\nimport { polygon, } from \"@turf/helpers\";\n/**\n * Takes a {@link Point} and calculates the circle polygon given a radius in degrees, radians, miles, or kilometers; and steps for precision.\n *\n * @name circle\n * @param {Feature<Point>|number[]} center center point\n * @param {number} radius radius of the circle\n * @param {Object} [options={}] Optional parameters\n * @param {number} [options.steps=64] number of steps\n * @param {string} [options.units='kilometers'] miles, kilometers, degrees, or radians\n * @param {Object} [options.properties={}] properties\n * @returns {Feature<Polygon>} circle polygon\n * @example\n * var center = [-75.343, 39.984];\n * var radius = 5;\n * var options = {steps: 10, units: 'kilometers', properties: {foo: 'bar'}};\n * var circle = turf.circle(center, radius, options);\n *\n * //addToMap\n * var addToMap = [turf.point(center), circle]\n */\nfunction circle(center, radius, options) {\n    if (options === void 0) { options = {}; }\n    // default params\n    var steps = options.steps || 64;\n    var properties = options.properties\n        ? options.properties\n        : !Array.isArray(center) && center.type === \"Feature\" && center.properties\n            ? center.properties\n            : {};\n    // main\n    var coordinates = [];\n    for (var i = 0; i < steps; i++) {\n        coordinates.push(destination(center, radius, (i * -360) / steps, options).geometry\n            .coordinates);\n    }\n    coordinates.push(coordinates[0]);\n    return polygon([coordinates], properties);\n}\nexport default circle;\n","import { getCoord } from \"@turf/invariant\";\nimport { radiansToLength, degreesToRadians, } from \"@turf/helpers\";\n//http://en.wikipedia.org/wiki/Haversine_formula\n//http://www.movable-type.co.uk/scripts/latlong.html\n/**\n * Calculates the distance between two {@link Point|points} in degrees, radians, miles, or kilometers.\n * This uses the [Haversine formula](http://en.wikipedia.org/wiki/Haversine_formula) to account for global curvature.\n *\n * @name distance\n * @param {Coord | Point} from origin point or coordinate\n * @param {Coord | Point} to destination point or coordinate\n * @param {Object} [options={}] Optional parameters\n * @param {string} [options.units='kilometers'] can be degrees, radians, miles, or kilometers\n * @returns {number} distance between the two points\n * @example\n * var from = turf.point([-75.343, 39.984]);\n * var to = turf.point([-75.534, 39.123]);\n * var options = {units: 'miles'};\n *\n * var distance = turf.distance(from, to, options);\n *\n * //addToMap\n * var addToMap = [from, to];\n * from.properties.distance = distance;\n * to.properties.distance = distance;\n */\nfunction distance(from, to, options) {\n    if (options === void 0) { options = {}; }\n    var coordinates1 = getCoord(from);\n    var coordinates2 = getCoord(to);\n    var dLat = degreesToRadians(coordinates2[1] - coordinates1[1]);\n    var dLon = degreesToRadians(coordinates2[0] - coordinates1[0]);\n    var lat1 = degreesToRadians(coordinates1[1]);\n    var lat2 = degreesToRadians(coordinates2[1]);\n    var a = Math.pow(Math.sin(dLat / 2), 2) +\n        Math.pow(Math.sin(dLon / 2), 2) * Math.cos(lat1) * Math.cos(lat2);\n    return radiansToLength(2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)), options.units);\n}\nexport default distance;\n","const HALF_PI = Math.PI / 2,\n    TWO_PI = Math.PI * 2,\n    FITTING_COUNT = 100,\n    ZERO_TOLERANCE = 0.0001;\n\nexport const wgsToMercator = function (point) {\n    let wgsLon = point[0]\n    let wgsLat = point[1]\n    let x = wgsLon * 20037508.34 / 180.;\n    let y = Math.log(Math.tan((90. + wgsLat) * Math.PI / 360.)) / (Math.PI / 180.);\n    y = y * 20037508.34 / 180.;\n    return [x, y];\n};\nexport const mercatorToWGS = function (point) {\n    let mercatorLon = point[0];\n    let mercatorLat = point[1]\n    let x = mercatorLon / 20037508.34 * 180.;\n    let y = mercatorLat / 20037508.34 * 180.;\n    y = 180 / Math.PI * (2 * Math.atan(Math.exp(y * Math.PI / 180.)) - Math.PI / 2);\n    return [x, y];\n}\nexport const distance = function (pnt1, pnt2) {\n    return Math.sqrt(Math.pow((pnt1[0] - pnt2[0]), 2) + Math.pow((pnt1[1] - pnt2[1]), 2));;\n};\n\nexport const wholeDistance = function (points) {\n    let totalDistance = 0;\n    for (let i = 0; i < points.length - 1; i++)\n        totalDistance += distance(points[i], points[i + 1]);\n    return totalDistance;\n};\n\nexport const getBaseLength = function (points) {\n    return Math.pow(wholeDistance(points), 0.99);\n};\n\nexport const mid = function (pnt1, pnt2) {\n    return [(pnt1[0] + pnt2[0]) / 2, (pnt1[1] + pnt2[1]) / 2];\n};\n\nexport const getCircleCenterOfThreePoints = function (pnt1, pnt2, pnt3) {\n    let pntA = [(pnt1[0] + pnt2[0]) / 2, (pnt1[1] + pnt2[1]) / 2];\n    let pntB = [pntA[0] - pnt1[1] + pnt2[1], pntA[1] + pnt1[0] - pnt2[0]];\n    let pntC = [(pnt1[0] + pnt3[0]) / 2, (pnt1[1] + pnt3[1]) / 2];\n    let pntD = [pntC[0] - pnt1[1] + pnt3[1], pntC[1] + pnt1[0] - pnt3[0]];\n    return getIntersectPoint(pntA, pntB, pntC, pntD);\n};\n\nexport const getIntersectPoint = function (pntA, pntB, pntC, pntD) {\n    let e, f, y, x;\n    if (pntA[1] == pntB[1]) {\n        f = (pntD[0] - pntC[0]) / (pntD[1] - pntC[1]);\n        x = f * (pntA[1] - pntC[1]) + pntC[0];\n        y = pntA[1];\n        return [x, y];\n    }\n    if (pntC[1] == pntD[1]) {\n        e = (pntB[0] - pntA[0]) / (pntB[1] - pntA[1]);\n        x = e * (pntC[1] - pntA[1]) + pntA[0];\n        y = pntC[1];\n        return [x, y];\n    }\n    e = (pntB[0] - pntA[0]) / (pntB[1] - pntA[1]);\n    f = (pntD[0] - pntC[0]) / (pntD[1] - pntC[1]);\n    y = (e * pntA[1] - pntA[0] - f * pntC[1] + pntC[0]) / (e - f);\n    x = e * y - e * pntA[1] + pntA[0];\n    return [x, y];\n};\n\nexport const getAzimuth = function (startPnt, endPnt) {\n    let azimuth;\n    let angle = Math.asin(Math.abs(endPnt[1] - startPnt[1]) / distance(startPnt, endPnt));\n\n    if (endPnt[1] >= startPnt[1] && endPnt[0] >= startPnt[0])\n        azimuth = angle + Math.PI;\n    else if (endPnt[1] >= startPnt[1] && endPnt[0] < startPnt[0])\n        azimuth = TWO_PI - angle;\n    else if (endPnt[1] < startPnt[1] && endPnt[0] < startPnt[0])\n        azimuth = angle;\n    else if (endPnt[1] < startPnt[1] && endPnt[0] >= startPnt[0])\n        azimuth = Math.PI - angle;\n    return azimuth;\n};\n\nexport const getAngleOfThreePoints = function (pntA, pntB, pntC) {\n    let angle = getAzimuth(pntB, pntA) - getAzimuth(pntB, pntC);\n    return (angle < 0 ? angle + TWO_PI : angle);\n};\n\nexport const isClockWise = function (pnt1, pnt2, pnt3) {\n    return ((pnt3[1] - pnt1[1]) * (pnt2[0] - pnt1[0]) > (pnt2[1] - pnt1[1]) * (pnt3[0] - pnt1[0]));\n};\n\nexport const getPointOnLine = function (t, startPnt, endPnt) {\n    let x = startPnt[0] + (t * (endPnt[0] - startPnt[0]));\n    let y = startPnt[1] + (t * (endPnt[1] - startPnt[1]));\n    return [x, y];\n};\n\nexport const getCubicValue = function (t, startPnt, cPnt1, cPnt2, endPnt) {\n    t = Math.max(Math.min(t, 1), 0);\n    let tp = 1 - t;\n    let t2 = t * t;\n    let t3 = t2 * t;\n    let tp2 = tp * tp;\n    let tp3 = tp2 * tp;\n    let x = (tp3 * startPnt[0]) + (3 * tp2 * t * cPnt1[0]) + (3 * tp * t2 * cPnt2[0]) + (t3 * endPnt[0]);\n    let y = (tp3 * startPnt[1]) + (3 * tp2 * t * cPnt1[1]) + (3 * tp * t2 * cPnt2[1]) + (t3 * endPnt[1]);\n    return [x, y];\n};\n\nexport const getThirdPoint = function (startPnt, endPnt, angle, distance, clockWise) {\n    let azimuth = getAzimuth(startPnt, endPnt);\n    let alpha = clockWise ? azimuth + angle : azimuth - angle;\n    let dx = distance * Math.cos(alpha);\n    let dy = distance * Math.sin(alpha);\n    return [endPnt[0] + dx, endPnt[1] + dy];\n};\n\nexport const getArcPoints = function (center, radius, startAngle, endAngle) {\n    let x, y, pnts = [];\n    let angleDiff = endAngle - startAngle;\n    angleDiff = angleDiff < 0 ? angleDiff + TWO_PI : angleDiff;\n    for (let i = 0; i <= FITTING_COUNT; i++) {\n        let angle = startAngle + angleDiff * i / FITTING_COUNT;\n        x = center[0] + radius * Math.cos(angle);\n        y = center[1] + radius * Math.sin(angle);\n        // pnts.push([x, y]);\n        pnts.push([mercatorToWGS([x, y])[0], mercatorToWGS([x, y])[1]]);\n\n    }\n    return pnts;\n};\n\nexport const getBisectorNormals = function (t, pnt1, pnt2, pnt3) {\n    let normal = getNormal(pnt1, pnt2, pnt3);\n    let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1]);\n    let uX = normal[0] / dist;\n    let uY = normal[1] / dist;\n    let d1 = distance(pnt1, pnt2);\n    let d2 = distance(pnt2, pnt3);\n    let bisectorNormalLeft, bisectorNormalRight;\n    let x, y, dt;\n    if (dist > ZERO_TOLERANCE) {\n        if (isClockWise(pnt1, pnt2, pnt3)) {\n            dt = t * d1;\n            x = pnt2[0] - dt * uY;\n            y = pnt2[1] + dt * uX;\n            bisectorNormalRight = [x, y];\n            dt = t * d2;\n            x = pnt2[0] + dt * uY;\n            y = pnt2[1] - dt * uX;\n            bisectorNormalLeft = [x, y];\n        }\n        else {\n            dt = t * d1;\n            x = pnt2[0] + dt * uY;\n            y = pnt2[1] - dt * uX;\n            bisectorNormalRight = [x, y];\n            dt = t * d2;\n            x = pnt2[0] - dt * uY;\n            y = pnt2[1] + dt * uX;\n            bisectorNormalLeft = [x, y];\n        }\n    }\n    else {\n        x = pnt2[0] + t * (pnt1[0] - pnt2[0]);\n        y = pnt2[1] + t * (pnt1[1] - pnt2[1]);\n        bisectorNormalRight = [x, y];\n        x = pnt2[0] + t * (pnt3[0] - pnt2[0]);\n        y = pnt2[1] + t * (pnt3[1] - pnt2[1]);\n        bisectorNormalLeft = [x, y];\n    }\n    return [bisectorNormalRight, bisectorNormalLeft];\n};\n\nexport const getNormal = function (pnt1, pnt2, pnt3) {\n    let dX1 = pnt1[0] - pnt2[0];\n    let dY1 = pnt1[1] - pnt2[1];\n    let d1 = Math.sqrt(dX1 * dX1 + dY1 * dY1);\n    dX1 /= d1;\n    dY1 /= d1;\n\n    let dX2 = pnt3[0] - pnt2[0];\n    let dY2 = pnt3[1] - pnt2[1];\n    let d2 = Math.sqrt(dX2 * dX2 + dY2 * dY2);\n    dX2 /= d2;\n    dY2 /= d2;\n\n    let uX = dX1 + dX2;\n    let uY = dY1 + dY2;\n    return [uX, uY];\n};\n\nexport const getCurvePoints = function (t, controlPoints) {\n    let leftControl = getLeftMostControlPoint(controlPoints);\n    let normals = [leftControl];\n    let pnt1, pnt2, pnt3;\n    for (let i = 0; i < controlPoints.length - 2; i++) {\n        pnt1 = controlPoints[i];\n        pnt2 = controlPoints[i + 1];\n        pnt3 = controlPoints[i + 2];\n        let normalPoints = getBisectorNormals(t, pnt1, pnt2, pnt3);\n        normals = normals.concat(normalPoints);\n    }\n    let rightControl = getRightMostControlPoint(controlPoints);\n    normals.push(rightControl);\n    let points = [];\n    for (let i = 0; i < controlPoints.length - 1; i++) {\n        pnt1 = controlPoints[i];\n        pnt2 = controlPoints[i + 1];\n        points.push(pnt1);\n        for (let t = 0; t < FITTING_COUNT; t++) {\n            let pnt = getCubicValue(t / FITTING_COUNT, pnt1, normals[i * 2], normals[i * 2 + 1], pnt2);\n            points.push(pnt);\n        }\n        points.push(pnt2);\n    }\n    return points;\n};\n\nexport const getLeftMostControlPoint = function (controlPoints) {\n    let pnt1 = controlPoints[0];\n    let pnt2 = controlPoints[1];\n    let pnt3 = controlPoints[2];\n    let pnts = getBisectorNormals(0, pnt1, pnt2, pnt3);\n    let normalRight = pnts[0];\n    let normal = getNormal(pnt1, pnt2, pnt3);\n    let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1]);\n    let controlX, controlY;\n    if (dist > ZERO_TOLERANCE) {\n        let midPoint = mid(pnt1, pnt2);\n        let pX = pnt1[0] - midPoint[0];\n        let pY = pnt1[1] - midPoint[1];\n\n        let d1 = distance(pnt1, pnt2);\n        // normal at midpoint\n        let n = 2.0 / d1;\n        let nX = -n * pY;\n        let nY = n * pX;\n\n        // upper triangle of symmetric transform matrix\n        let a11 = nX * nX - nY * nY\n        let a12 = 2 * nX * nY;\n        let a22 = nY * nY - nX * nX;\n\n        let dX = normalRight[0] - midPoint[0];\n        let dY = normalRight[1] - midPoint[1];\n\n        // coordinates of reflected vector\n        controlX = midPoint[0] + a11 * dX + a12 * dY;\n        controlY = midPoint[1] + a12 * dX + a22 * dY;\n    }\n    else {\n        controlX = pnt1[0] + .3 * (pnt2[0] - pnt1[0]);\n        controlY = pnt1[1] + .3 * (pnt2[1] - pnt1[1]);\n    }\n    return [controlX, controlY];\n};\n\nexport const getRightMostControlPoint = function (controlPoints) {\n    let count = controlPoints.length;\n    let pnt1 = controlPoints[count - 3];\n    let pnt2 = controlPoints[count - 2];\n    let pnt3 = controlPoints[count - 1];\n    let pnts = getBisectorNormals(0, pnt1, pnt2, pnt3);\n    let normalLeft = pnts[1];\n    let normal = getNormal(pnt1, pnt2, pnt3);\n    let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1]);\n    let controlX, controlY;\n    if (dist > ZERO_TOLERANCE) {\n        let midPoint = mid(pnt2, pnt3);\n        let pX = pnt3[0] - midPoint[0];\n        let pY = pnt3[1] - midPoint[1];\n\n        let d1 = distance(pnt2, pnt3);\n        // normal at midpoint\n        let n = 2.0 / d1;\n        let nX = -n * pY;\n        let nY = n * pX;\n\n        // upper triangle of symmetric transform matrix\n        let a11 = nX * nX - nY * nY\n        let a12 = 2 * nX * nY;\n        let a22 = nY * nY - nX * nX;\n\n        let dX = normalLeft[0] - midPoint[0];\n        let dY = normalLeft[1] - midPoint[1];\n\n        // coordinates of reflected vector\n        controlX = midPoint[0] + a11 * dX + a12 * dY;\n        controlY = midPoint[1] + a12 * dX + a22 * dY;\n    }\n    else {\n        controlX = pnt3[0] + .3 * (pnt2[0] - pnt3[0]);\n        controlY = pnt3[1] + .3 * (pnt2[1] - pnt3[1]);\n    }\n    return [controlX, controlY];\n};\n\nexport const getBezierPoints = function (points) {\n    if (points.length <= 2)\n        return points;\n\n    let bezierPoints = [];\n    let n = points.length - 1;\n    for (let t = 0; t <= 1; t += 0.01) {\n        let x = 0, y = 0;\n        for (let index = 0; index <= n; index++) {\n            let factor = getBinomialFactor(n, index);\n            let a = Math.pow(t, index);\n            let b = Math.pow((1 - t), (n - index));\n            x += factor * a * b * points[index][0];\n            y += factor * a * b * points[index][1];\n        }\n        bezierPoints.push([x, y]);\n    }\n    bezierPoints.push(points[n]);\n    return bezierPoints;\n};\n\nexport const getBinomialFactor = function (n, index) {\n    return getFactorial(n) / (getFactorial(index) * getFactorial(n - index));\n};\n\nexport const getFactorial = function (n) {\n    if (n <= 1)\n        return 1;\n    if (n == 2)\n        return 2;\n    if (n == 3)\n        return 6;\n    if (n == 4)\n        return 24;\n    if (n == 5)\n        return 120;\n    let result = 1;\n    for (let i = 1; i <= n; i++)\n        result *= i;\n    return result;\n};\n\nexport const getQBSplinePoints = function (points) {\n    if (points.length <= 2)\n        return points;\n\n    let n = 2;\n\n    let bSplinePoints = [];\n    let m = points.length - n - 1;\n    bSplinePoints.push(points[0]);\n    for (let i = 0; i <= m; i++) {\n        for (let t = 0; t <= 1; t += 0.05) {\n            let x = 0, y = 0;\n            for (let k = 0; k <= n; k++) {\n                let factor = getQuadricBSplineFactor(k, t);\n                x += factor * points[i + k][0];\n                y += factor * points[i + k][1];\n            }\n            bSplinePoints.push([x, y]);\n        }\n    }\n    bSplinePoints.push(points[points.length - 1]);\n    return bSplinePoints;\n};\n\nexport const getQuadricBSplineFactor = function (k, t) {\n    if (k == 0)\n        return Math.pow(t - 1, 2) / 2;\n    if (k == 1)\n        return (-2 * Math.pow(t, 2) + 2 * t + 1) / 2;\n    if (k == 2)\n        return Math.pow(t, 2) / 2;\n    return 0;\n};","import * as plotUtil from '../plot_util'\n\nfunction generatePoints(center, majorRadius, minorRadius) {\n    let x, y, angle, points = [];\n    for (let i = 0; i <= 100; i++) {\n        angle = Math.PI * 2 * i / 100;\n        x = center[0] + majorRadius * Math.cos(angle);\n        y = center[1] + minorRadius * Math.sin(angle);\n        points.push([plotUtil.mercatorToWGS([x, y])[0], plotUtil.mercatorToWGS([x, y])[1]]);\n    }\n    return points;\n};\n\nexport default function (coordinates) {\n    if (coordinates.length < 2) return [];\n    let pnt1 = plotUtil.wgsToMercator(coordinates[0]);\n    let pnt2 = plotUtil.wgsToMercator(coordinates[1]);\n    let center = plotUtil.mid(pnt1, pnt2);\n    let majorRadius = Math.abs((pnt1[0] - pnt2[0]) / 2);\n    let minorRadius = Math.abs((pnt1[1] - pnt2[1]) / 2);\n    return [generatePoints(center, majorRadius, minorRadius)];\n}","\nimport * as plotUtil from '../plot_util'\n\nconst HALF_PI = Math.PI / 2\n/**** 细直箭头 */\nconst fine_arrow_opts = {\n    tailWidthFactor: 0.15,\n    neckWidthFactor: 0.2,\n    headWidthFactor: 0.25,\n    headAngle: Math.PI / 8.5,\n    neckAngle: Math.PI / 13\n}\n\nexport const arrow_algorithm = function (coordinates, opt) {\n    if (coordinates.length < 2) return []\n    let [pnt1, pnt2] = coordinates;\n    let len = plotUtil.getBaseLength(coordinates)\n    const { neckWidthFactor, tailWidthFactor, headWidthFactor, headAngle, neckAngle } = opt\n    let tailWidth = len * tailWidthFactor;\n    let neckWidth = len * neckWidthFactor;\n    let headWidth = len * headWidthFactor;\n    let tailLeft = plotUtil.getThirdPoint(pnt2, pnt1, HALF_PI, tailWidth, true);\n    let tailRight = plotUtil.getThirdPoint(pnt2, pnt1, HALF_PI, tailWidth, false);\n    let headLeft = plotUtil.getThirdPoint(pnt1, pnt2, headAngle, headWidth, false);\n    let headRight = plotUtil.getThirdPoint(pnt1, pnt2, headAngle, headWidth, true);\n    let neckLeft = plotUtil.getThirdPoint(pnt1, pnt2, neckAngle, neckWidth, false);\n    let neckRight = plotUtil.getThirdPoint(pnt1, pnt2, neckAngle, neckWidth, true);\n    return [[tailLeft, neckLeft, headLeft, pnt2, headRight, neckRight, tailRight]];\n}\n\nexport default function (coordinates) {\n    return arrow_algorithm(coordinates, fine_arrow_opts);\n}","import { arrow_algorithm } from './fine_arrow'\n/**** 进攻方向 */\nconst assault_Direction_opts = {\n    tailWidthFactor: 0.2,\n    neckWidthFactor: 0.25,\n    headWidthFactor: 0.3,\n    headAngle: Math.PI / 4,\n    neckAngle: Math.PI * 0.17741\n}\n\n\nexport default function (coordinates) {\n    return arrow_algorithm(coordinates, assault_Direction_opts);\n}","\nimport * as plotUtil from '../plot_util'\n\n/** 进攻箭头 */\nconst attack_arrow_opts = {\n    headHeightFactor: 0.18,\n    headWidthFactor: 0.3,\n    neckHeightFactor: 0.85,\n    neckWidthFactor: 0.15,\n    headTailFactor: 0.8\n}\n\nconst HALF_PI = Math.PI / 2\n\nexport const getAttackArrowHeadPoints = function (points) {\n    let len = plotUtil.getBaseLength(points);\n    let headHeight = len * attack_arrow_opts.headHeightFactor;\n    let headPnt = points[points.length - 1];\n    let headWidth = headHeight * attack_arrow_opts.headWidthFactor;\n    let neckWidth = headHeight * attack_arrow_opts.neckWidthFactor;\n    let neckHeight = headHeight * attack_arrow_opts.neckHeightFactor;\n    let headEndPnt = plotUtil.getThirdPoint(points[points.length - 2], headPnt, 0, headHeight, true);\n    let neckEndPnt = plotUtil.getThirdPoint(points[points.length - 2], headPnt, 0, neckHeight, true);\n    let headLeft = plotUtil.getThirdPoint(headPnt, headEndPnt, HALF_PI, headWidth, false);\n    let headRight = plotUtil.getThirdPoint(headPnt, headEndPnt, HALF_PI, headWidth, true);\n    let neckLeft = plotUtil.getThirdPoint(headPnt, neckEndPnt, HALF_PI, neckWidth, false);\n    let neckRight = plotUtil.getThirdPoint(headPnt, neckEndPnt, HALF_PI, neckWidth, true);\n    return [neckLeft, headLeft, headPnt, headRight, neckRight];\n}\n\nexport const getAttackArrowBodyPoints = function (points, neckLeft, neckRight, tailWidthFactor) {\n    let allLen = plotUtil.wholeDistance(points);\n    let len = plotUtil.getBaseLength(points);\n    let tailWidth = len * tailWidthFactor;\n    let neckWidth = plotUtil.distance(neckLeft, neckRight);\n    let widthDif = (tailWidth - neckWidth) / 2;\n    let tempLen = 0, leftBodyPnts = [], rightBodyPnts = [];\n    for (let i = 1; i < points.length - 1; i++) {\n        let angle = plotUtil.getAngleOfThreePoints(points[i - 1], points[i], points[i + 1]) / 2;\n        tempLen += plotUtil.distance(points[i - 1], points[i]);\n        let w = (tailWidth / 2 - tempLen / allLen * widthDif) / Math.sin(angle);\n        let left = plotUtil.getThirdPoint(points[i - 1], points[i], Math.PI - angle, w, true);\n        let right = plotUtil.getThirdPoint(points[i - 1], points[i], angle, w, false);\n        leftBodyPnts.push(left);\n        rightBodyPnts.push(right);\n    }\n    return leftBodyPnts.concat(rightBodyPnts);\n}\n\nexport default function (coordinates) {\n    if (coordinates.length < 3) return [coordinates];\n    let [tailLeft, tailRight] = coordinates;\n    if (plotUtil.isClockWise(coordinates[0], coordinates[1], coordinates[2])) {\n        tailLeft = coordinates[1];\n        tailRight = coordinates[0];\n    }\n    let midTail = plotUtil.mid(tailLeft, tailRight);\n    let bonePnts = [midTail].concat(coordinates.slice(2));\n    // 计算箭头\n    let headPnts = getAttackArrowHeadPoints(bonePnts, tailLeft, tailRight);\n    let neckLeft = headPnts[0];\n    let neckRight = headPnts[4];\n    let tailWidthFactor = plotUtil.distance(tailLeft, tailRight) / plotUtil.getBaseLength(bonePnts);\n    // 计算箭身\n    let bodyPnts = getAttackArrowBodyPoints(bonePnts, neckLeft, neckRight, tailWidthFactor);\n    // 整合\n    let count = bodyPnts.length;\n    let leftPnts = [tailLeft].concat(bodyPnts.slice(0, count / 2));\n    leftPnts.push(neckLeft);\n    let rightPnts = [tailRight].concat(bodyPnts.slice(count / 2, count));\n    rightPnts.push(neckRight);\n\n    leftPnts = plotUtil.getQBSplinePoints(leftPnts);\n    rightPnts = plotUtil.getQBSplinePoints(rightPnts);\n\n    return [leftPnts.concat(headPnts, rightPnts.reverse())]\n}","\nimport * as plotUtil from '../plot_util'\nimport { getAttackArrowHeadPoints, getAttackArrowBodyPoints } from './attack_arrow'\n/** 燕尾进攻箭头 */\nconst tailed_attack_arrow_opts = {\n    headHeightFactor: 0.18,\n    headWidthFactor: 0.3,\n    neckHeightFactor: 0.85,\n    neckWidthFactor: 0.15,\n    headTailFactor: 0.8,\n    tailWidthFactor: 0.1,\n    swallowTailFactor: 1\n}\n\nexport default function (coordinates) {\n    if (coordinates.length < 3) return [coordinates];\n    let [tailLeft, tailRight] = coordinates;\n    if (plotUtil.isClockWise(coordinates[0], coordinates[1], coordinates[2])) {\n        tailLeft = coordinates[1];\n        tailRight = coordinates[0];\n    }\n    let midTail = plotUtil.mid(tailLeft, tailRight);\n    let bonePnts = [midTail].concat(coordinates.slice(2));\n    // 计算箭头\n    let headPnts = getAttackArrowHeadPoints(bonePnts, tailLeft, tailRight);\n    let neckLeft = headPnts[0];\n    let neckRight = headPnts[4];\n    let tailWidth = plotUtil.distance(tailLeft, tailRight);\n    let allLen = plotUtil.getBaseLength(bonePnts);\n    let len = allLen * tailed_attack_arrow_opts.tailWidthFactor * tailed_attack_arrow_opts.swallowTailFactor;\n    const swallowTailPnt = plotUtil.getThirdPoint(bonePnts[1], bonePnts[0], 0, len, true);\n    let factor = tailWidth / allLen;\n    let bodyPnts = getAttackArrowBodyPoints(bonePnts, neckLeft, neckRight, factor);\n    let count = bodyPnts.length;\n    let leftPnts = [tailLeft].concat(bodyPnts.slice(0, count / 2));\n    leftPnts.push(neckLeft);\n    let rightPnts = [tailRight].concat(bodyPnts.slice(count / 2, count));\n    rightPnts.push(neckRight);\n\n    leftPnts = plotUtil.getQBSplinePoints(leftPnts);\n    rightPnts = plotUtil.getQBSplinePoints(rightPnts);\n    return [leftPnts.concat(headPnts, rightPnts.reverse(), [swallowTailPnt])];\n}","import { getAttackArrowHeadPoints, getAttackArrowBodyPoints } from './attack_arrow'\nimport * as plotUtil from '../plot_util'\n\nconst HALF_PI = Math.PI / 2\n\nconst squadCombatOpts = {\n    tailWidthFactor: 0.1\n}\n\nconst getSquadCombatTailPoints = function (points) {\n    let allLen = plotUtil.getBaseLength(points);\n    let tailWidth = allLen * squadCombatOpts.tailWidthFactor;\n    let tailLeft = plotUtil.getThirdPoint(points[1], points[0], HALF_PI, tailWidth, false);\n    let tailRight = plotUtil.getThirdPoint(points[1], points[0], HALF_PI, tailWidth, true);\n    return [tailLeft, tailRight];\n};\n\nexport default function (coordinates) {\n    if (coordinates.length < 2) return []\n    let tailPnts = getSquadCombatTailPoints(coordinates);\n    let headPnts = getAttackArrowHeadPoints(coordinates, tailPnts[0], tailPnts[1]);\n    let neckLeft = headPnts[0];\n    let neckRight = headPnts[4];\n    let bodyPnts = getAttackArrowBodyPoints(coordinates, neckLeft, neckRight, squadCombatOpts.tailWidthFactor);\n    let count = bodyPnts.length;\n    let leftPnts = [tailPnts[0]].concat(bodyPnts.slice(0, count / 2));\n    leftPnts.push(neckLeft);\n    let rightPnts = [tailPnts[1]].concat(bodyPnts.slice(count / 2, count));\n    rightPnts.push(neckRight);\n\n    leftPnts = plotUtil.getQBSplinePoints(leftPnts);\n    rightPnts = plotUtil.getQBSplinePoints(rightPnts);\n\n    return [leftPnts.concat(headPnts, rightPnts.reverse())];\n}","\nimport * as plotUtil from '../plot_util'\n\nconst double_arrow_opts = {\n    headHeightFactor: 0.25,\n    headWidthFactor: 0.3,\n    neckHeightFactor: 0.85,\n    neckWidthFactor: 0.15,\n    fixPointCount: 4,\n}\n\nconst HALF_PI = Math.PI / 2\n\nconst getTempPoint4 = function (linePnt1, linePnt2, point) {\n    let midPnt = plotUtil.mid(linePnt1, linePnt2);\n    let len = plotUtil.distance(midPnt, point);\n    let angle = plotUtil.getAngleOfThreePoints(linePnt1, midPnt, point);\n    let symPnt, distance1, distance2, mid;\n    if (angle < HALF_PI) {\n        distance1 = len * Math.sin(angle);\n        distance2 = len * Math.cos(angle);\n        mid = plotUtil.getThirdPoint(linePnt1, midPnt, HALF_PI, distance1, false);\n        symPnt = plotUtil.getThirdPoint(midPnt, mid, HALF_PI, distance2, true);\n    }\n    else if (angle >= HALF_PI && angle < Math.PI) {\n        distance1 = len * Math.sin(Math.PI - angle);\n        distance2 = len * Math.cos(Math.PI - angle);\n        mid = plotUtil.getThirdPoint(linePnt1, midPnt, HALF_PI, distance1, false);\n        symPnt = plotUtil.getThirdPoint(midPnt, mid, HALF_PI, distance2, false);\n    }\n    else if (angle >= Math.PI && angle < Math.PI * 1.5) {\n        distance1 = len * Math.sin(angle - Math.PI);\n        distance2 = len * Math.cos(angle - Math.PI);\n        mid = plotUtil.getThirdPoint(linePnt1, midPnt, HALF_PI, distance1, true);\n        symPnt = plotUtil.getThirdPoint(midPnt, mid, HALF_PI, distance2, true);\n    }\n    else {\n        distance1 = len * Math.sin(Math.PI * 2 - angle);\n        distance2 = len * Math.cos(Math.PI * 2 - angle);\n        mid = plotUtil.getThirdPoint(linePnt1, midPnt, HALF_PI, distance1, true);\n        symPnt = plotUtil.getThirdPoint(midPnt, mid, HALF_PI, distance2, false);\n    }\n    return symPnt;\n};\n\nconst getArrowPoints = function (pnt1, pnt2, pnt3, clockWise) {\n    let midPnt = plotUtil.mid(pnt1, pnt2);\n    let len = plotUtil.distance(midPnt, pnt3);\n    let midPnt1 = plotUtil.getThirdPoint(pnt3, midPnt, 0, len * 0.3, true);\n    let midPnt2 = plotUtil.getThirdPoint(pnt3, midPnt, 0, len * 0.5, true);\n    //let midPnt3=PlotUtils.getThirdPoint(pnt3, midPnt, 0, len * 0.7, true);\n    midPnt1 = plotUtil.getThirdPoint(midPnt, midPnt1, HALF_PI, len / 5, clockWise);\n    midPnt2 = plotUtil.getThirdPoint(midPnt, midPnt2, HALF_PI, len / 4, clockWise);\n    //midPnt3=PlotUtils.getThirdPoint(midPnt, midPnt3, Constants.HALF_PI, len / 5, clockWise);\n\n    let points = [midPnt, midPnt1, midPnt2, pnt3];\n    // 计算箭头部分\n    let arrowPnts = getArrowHeadPoints(points, double_arrow_opts.headHeightFactor, double_arrow_opts.headWidthFactor, double_arrow_opts.neckHeightFactor, double_arrow_opts.neckWidthFactor);\n    let neckLeftPoint = arrowPnts[0];\n    let neckRightPoint = arrowPnts[4];\n    // 计算箭身部分\n    let tailWidthFactor = plotUtil.distance(pnt1, pnt2) / plotUtil.getBaseLength(points) / 2;\n    let bodyPnts =getArrowBodyPoints(points, neckLeftPoint, neckRightPoint, tailWidthFactor);\n    let n = bodyPnts.length;\n    let lPoints = bodyPnts.slice(0, n / 2);\n    let rPoints = bodyPnts.slice(n / 2, n);\n    lPoints.push(neckLeftPoint);\n    rPoints.push(neckRightPoint);\n    lPoints = lPoints.reverse();\n    lPoints.push(pnt2);\n    rPoints = rPoints.reverse();\n    rPoints.push(pnt1);\n    return lPoints.reverse().concat(arrowPnts, rPoints);\n};\n\n\nconst getArrowHeadPoints = function (points, tailLeft, tailRight) {\n    let len = plotUtil.getBaseLength(points);\n    let headHeight = len * double_arrow_opts.headHeightFactor;\n    let headPnt = points[points.length - 1];\n    let tailWidth = plotUtil.distance(tailLeft, tailRight);\n    let headWidth = headHeight * double_arrow_opts.headWidthFactor;\n    let neckWidth = headHeight * double_arrow_opts.neckWidthFactor;\n    let neckHeight = headHeight * double_arrow_opts.neckHeightFactor;\n    let headEndPnt = plotUtil.getThirdPoint(points[points.length - 2], headPnt, 0, headHeight, true);\n    let neckEndPnt = plotUtil.getThirdPoint(points[points.length - 2], headPnt, 0, neckHeight, true);\n    let headLeft = plotUtil.getThirdPoint(headPnt, headEndPnt, HALF_PI, headWidth, false);\n    let headRight = plotUtil.getThirdPoint(headPnt, headEndPnt, HALF_PI, headWidth, true);\n    let neckLeft = plotUtil.getThirdPoint(headPnt, neckEndPnt, HALF_PI, neckWidth, false);\n    let neckRight = plotUtil.getThirdPoint(headPnt, neckEndPnt, HALF_PI, neckWidth, true);\n    return [neckLeft, headLeft, headPnt, headRight, neckRight];\n};\n\nconst getArrowBodyPoints = function (points, neckLeft, neckRight, tailWidthFactor) {\n    let allLen = plotUtil.wholeDistance(points);\n    let len = plotUtil.getBaseLength(points);\n    let tailWidth = len * tailWidthFactor;\n    let neckWidth = plotUtil.distance(neckLeft, neckRight);\n    let widthDif = (tailWidth - neckWidth) / 2;\n    let tempLen = 0, leftBodyPnts = [], rightBodyPnts = [];\n    for (let i = 1; i < points.length - 1; i++) {\n        let angle = plotUtil.getAngleOfThreePoints(points[i - 1], points[i], points[i + 1]) / 2;\n        tempLen += plotUtil.distance(points[i - 1], points[i]);\n        let w = (tailWidth / 2 - tempLen / allLen * widthDif) / Math.sin(angle);\n        let left = plotUtil.getThirdPoint(points[i - 1], points[i], Math.PI - angle, w, true);\n        let right = plotUtil.getThirdPoint(points[i - 1], points[i], angle, w, false);\n        leftBodyPnts.push(left);\n        rightBodyPnts.push(right);\n    }\n    return leftBodyPnts.concat(rightBodyPnts);\n};\n\nexport default function (coordinates) {\n    if (coordinates.length < 3) return [coordinates];\n    let [pnt1, pnt2, pnt3] = coordinates\n    let count = coordinates.length;\n    let tempPoint4, connPoint;\n    if (count == 3)\n        tempPoint4 = getTempPoint4(pnt1, pnt2, pnt3);\n    else\n        tempPoint4 = coordinates[3];\n    if (count == 3 || count == 4)\n        connPoint = plotUtil.mid(pnt1, pnt2);\n    else\n        connPoint = dcoordinate[4];\n    let leftArrowPnts, rightArrowPnts;\n    if (plotUtil.isClockWise(pnt1, pnt2, pnt3)) {\n        leftArrowPnts = getArrowPoints(pnt1, connPoint, tempPoint4, false);\n        rightArrowPnts = getArrowPoints(connPoint, pnt2, pnt3, true);\n    } else {\n        leftArrowPnts = getArrowPoints(pnt2, connPoint, pnt3, false);\n        rightArrowPnts = getArrowPoints(connPoint, pnt1, tempPoint4, true);\n    }\n    let m = leftArrowPnts.length;\n    let t = (m - 5) / 2;\n\n    let llBodyPnts = leftArrowPnts.slice(0, t);\n    let lArrowPnts = leftArrowPnts.slice(t, t + 5);\n    let lrBodyPnts = leftArrowPnts.slice(t + 5, m);\n\n    let rlBodyPnts = rightArrowPnts.slice(0, t);\n    let rArrowPnts = rightArrowPnts.slice(t, t + 5);\n    let rrBodyPnts = rightArrowPnts.slice(t + 5, m);\n\n    rlBodyPnts = plotUtil.getBezierPoints(rlBodyPnts);\n    let bodyPnts = plotUtil.getBezierPoints(rrBodyPnts.concat(llBodyPnts.slice(1)));\n    lrBodyPnts = plotUtil.getBezierPoints(lrBodyPnts);\n\n    let pnts = rlBodyPnts.concat(rArrowPnts, bodyPnts, lArrowPnts, lrBodyPnts);\n    return [pnts]\n}","import circle from '@turf/circle'\nimport distance from '@turf/distance'\nimport { point } from '@turf/helpers'\n\n/**\n * 圆\n * @param {*} coordinates \n * @param {*} radius \n * @returns \n */\nexport default function (coordinates, radius) {\n    if(coordinates.length<2) return [];\n    const [center, circle_point] = coordinates;\n    let circle_radius;\n    if (radius) {\n        circle_radius = radius\n    } else {\n        circle_radius = distance(point(center), point(circle_point));\n    }\n    return circle(center, circle_radius, { steps: 128 }).geometry.coordinates;\n}\n","export default function (coordinates) {\n    if (coordinates.length < 2) {\n        return []\n    } else {\n        let pnt1 = coordinates[0];\n        let pnt2 = coordinates[1];\n        let xmin = Math.min(pnt1[0], pnt2[0]);\n        let xmax = Math.max(pnt1[0], pnt2[0]);\n        let ymin = Math.min(pnt1[1], pnt2[1]);\n        let ymax = Math.max(pnt1[1], pnt2[1]);\n        let tl = [xmin, ymax];\n        let tr = [xmax, ymax];\n        let br = [xmax, ymin];\n        let bl = [xmin, ymin];\n        return [[tl, tr, br, bl, tl]];\n    }\n}","import * as plotUtil from '../plot_util'\n\nexport default function (coordinates) {\n    if (coordinates.length < 3) return [coordinates];\n    let [center,pnt2,pnt3] = coordinates;\n    let radius = plotUtil.distance(plotUtil.wgsToMercator(pnt2), plotUtil.wgsToMercator(center));\n    let startAngle = plotUtil.getAzimuth(plotUtil.wgsToMercator(pnt2), plotUtil.wgsToMercator(center));\n    let endAngle = plotUtil.getAzimuth(plotUtil.wgsToMercator(pnt3), plotUtil.wgsToMercator(center));\n    let pList = plotUtil.getArcPoints(plotUtil.wgsToMercator(center), radius, startAngle, endAngle);\n    pList.push(center);\n    return [pList];\n}","import * as plotUtil from '../plot_util'\n\nexport default function (coordinates) {\n    if (coordinates.length < 3) return [coordinates];\n    let pnt1 = plotUtil.wgsToMercator(coordinates[0]);\n    let pnt2 = plotUtil.wgsToMercator(coordinates[1]);\n    let pnt3 = plotUtil.wgsToMercator(coordinates[2]);\n    let center = plotUtil.getCircleCenterOfThreePoints(pnt1, pnt2, pnt3);\n    let radius = plotUtil.distance(pnt1, center);\n\n    let angle1 = plotUtil.getAzimuth(pnt1, center);\n    let angle2 = plotUtil.getAzimuth(pnt2, center);\n    let startAngle, endAngle;\n    if (plotUtil.isClockWise(pnt1, pnt2, pnt3)) {\n        startAngle = angle2;\n        endAngle = angle1;\n    }\n    else {\n        startAngle = angle1;\n        endAngle = angle2;\n    }\n    let points = plotUtil.getArcPoints(center, radius, startAngle, endAngle);\n    return [points];\n}","import * as plotUtil from '../plot_util'\n\nconst t = 0.3;\nconst FITTING_COUNT = 100;\nexport default function (coordinates) {\n    if (coordinates.length < 3) return [coordinates];\n    const points = coordinates.slice();\n    points.push(points[0], points[1]);\n    let normals = [];\n    for (let i = 0; i < points.length - 2; i++) {\n        let normalPoints = plotUtil.getBisectorNormals(t, points[i], points[i + 1], points[i + 2]);\n        normals = normals.concat(normalPoints);\n    }\n    let count = normals.length;\n    normals = [normals[count - 1]].concat(normals.slice(0, count - 1));\n\n    let pList = [];\n    for (let i = 0; i < points.length - 2; i++) {\n        let pnt1 = points[i];\n        let pnt2 = points[i + 1];\n        pList.push(pnt1);\n        for (let t = 0; t <= FITTING_COUNT; t++) {\n            let pnt = plotUtil.getCubicValue(t / FITTING_COUNT, pnt1, normals[i * 2], normals[i * 2 + 1], pnt2);\n            pList.push(pnt);\n        }\n        pList.push(pnt2);\n    }\n    return [pList];\n}","import * as plotUtil from '../plot_util'\n\nexport default function (coordinates) {\n    if (coordinates.length < 3) return coordinates;\n    return plotUtil.getCurvePoints(0.3, coordinates);\n}","import * as plotUtil from '../plot_util'\n\nexport default function (coordinates) {\n    if (coordinates.length < 3) return coordinates;\n    let pnt1 = plotUtil.wgsToMercator(coordinates[0]);\n    let pnt2 = plotUtil.wgsToMercator(coordinates[1]);\n    let pnt3 = plotUtil.wgsToMercator(coordinates[2]);\n    let center = plotUtil.getCircleCenterOfThreePoints(pnt1, pnt2, pnt3);\n    let radius = plotUtil.distance(pnt1, center);\n\n    let angle1 = plotUtil.getAzimuth(pnt1, center);\n    let angle2 = plotUtil.getAzimuth(pnt2, center);\n    let startAngle, endAngle;\n    if (plotUtil.isClockWise(pnt1, pnt2, pnt3)) {\n        startAngle = angle2;\n        endAngle = angle1;\n    }\n    else {\n        startAngle = angle1;\n        endAngle = angle2;\n    }\n    return plotUtil.getArcPoints(center, radius, startAngle, endAngle);\n}","import hat from 'hat';\nimport * as Constants from '../constants';\nimport * as algorithm from '../modes/custom/lib/algorithm/index'\nconst Feature = function(ctx, geojson) {\n  this.ctx = ctx;\n  this.properties = geojson.properties || {};\n  const {properties} = geojson\n  if(properties.isCustom && properties.coordinates && properties.coordinates.length>0){\n    this.coordinates = algorithm[`${geojson.properties.type}_algorithm`](geojson.properties.coordinates)\n  }else{\n    this.coordinates = geojson.geometry.coordinates;\n  }\n  this.id = geojson.id || hat();\n  this.type = geojson.geometry.type;\n};\n\nFeature.prototype.changed = function() {\n  this.ctx.store.featureChanged(this.id);\n};\n\nFeature.prototype.incomingCoords = function(coords) {\n  this.setCoordinates(coords);\n};\n\nFeature.prototype.setCoordinates = function(coords) {\n  this.coordinates = coords;\n  this.changed();\n};\n\nFeature.prototype.getCoordinates = function() {\n  return JSON.parse(JSON.stringify(this.coordinates));\n};\n\nFeature.prototype.setProperty = function(property, value) {\n  this.properties[property] = value;\n};\n\nFeature.prototype.toGeoJSON = function(isCustom) {\n  return JSON.parse(JSON.stringify({\n    id: this.id,\n    type: Constants.geojsonTypes.FEATURE,\n    properties: this.properties,\n    geometry: {\n      coordinates: isCustom?[]:this.getCoordinates(),\n      type: this.type\n    }\n  }));\n};\n\nFeature.prototype.internal = function(mode) {\n  const properties = {\n    id: this.id,\n    meta: Constants.meta.FEATURE,\n    'meta:type': this.type,\n    active: Constants.activeStates.INACTIVE,\n    mode\n  };\n\n  if (this.ctx.options.userProperties) {\n    for (const name in this.properties) {\n      properties[`user_${name}`] = this.properties[name];\n    }\n  }\n\n  return {\n    type: Constants.geojsonTypes.FEATURE,\n    properties,\n    geometry: {\n      coordinates: this.getCoordinates(),\n      type: this.type\n    }\n  };\n};\n\nexport default Feature;\n","import Feature from './feature';\n\nfunction loadImage(map, imageId, imageUrl) {\n  return new Promise((resolve) => {\n    if (map.hasImage(imageId)) {\n      resolve()\n    } else {\n      map.loadImage(imageUrl, (error, image) => {\n        map.addImage(imageId, image)\n        resolve()\n      })\n    }\n  })\n}\nconst Point = function (ctx, geojson) {\n  const { properties } = geojson\n  if (properties['image-id'] && properties['image-url']) {\n    loadImage(ctx.map, properties['image-id'], properties['image-url'])\n  }\n  Feature.call(this, ctx, geojson);\n};\n\nPoint.prototype = Object.create(Feature.prototype);\n\nPoint.prototype.isValid = function () {\n  return typeof this.coordinates[0] === 'number' &&\n    typeof this.coordinates[1] === 'number';\n};\n\nPoint.prototype.updateCoordinate = function (pathOrLng, lngOrLat, lat) {\n  if (arguments.length === 3) {\n    this.coordinates = [lngOrLat, lat];\n  } else {\n    this.coordinates = [pathOrLng, lngOrLat];\n  }\n  this.changed();\n};\n\nPoint.prototype.getCoordinate = function () {\n  return this.getCoordinates();\n};\n\nexport default Point;\n","import Feature from './feature';\n\nconst LineString = function(ctx, geojson) {\n  Feature.call(this, ctx, geojson);\n};\n\nLineString.prototype = Object.create(Feature.prototype);\n\nLineString.prototype.isValid = function() {\n  return this.coordinates.length > 1;\n};\n\nLineString.prototype.addCoordinate = function(path, lng, lat) {\n  this.changed();\n  const id = parseInt(path, 10);\n  this.coordinates.splice(id, 0, [lng, lat]);\n};\n\nLineString.prototype.getCoordinate = function(path) {\n  const id = parseInt(path, 10);\n  return JSON.parse(JSON.stringify(this.coordinates[id]));\n};\n\nLineString.prototype.removeCoordinate = function(path) {\n  this.changed();\n  this.coordinates.splice(parseInt(path, 10), 1);\n};\n\nLineString.prototype.updateCoordinate = function(path, lng, lat) {\n  const id = parseInt(path, 10);\n  this.coordinates[id] = [lng, lat];\n  this.changed();\n};\n\nexport default LineString;\n","import Feature from './feature';\n\nconst Polygon = function(ctx, geojson) {\n  Feature.call(this, ctx, geojson);\n  if(!geojson.properties.isCustom)\n    this.coordinates = this.coordinates.map(ring => ring.slice(0, -1));\n};\n\nPolygon.prototype = Object.create(Feature.prototype);\n\nPolygon.prototype.isValid = function() {\n  if (this.coordinates.length === 0) return false;\n  return this.coordinates.every(ring => ring.length > 2);\n};\n\n// Expects valid geoJSON polygon geometry: first and last positions must be equivalent.\nPolygon.prototype.incomingCoords = function(coords) {\n  this.coordinates = coords.map(ring => ring.slice(0, -1));\n  this.changed();\n};\n\n// Does NOT expect valid geoJSON polygon geometry: first and last positions should not be equivalent.\nPolygon.prototype.setCoordinates = function(coords) {\n  this.coordinates = coords;\n  this.changed();\n};\n\nPolygon.prototype.addCoordinate = function(path, lng, lat) {\n  this.changed();\n  const ids = path.split('.').map(x => parseInt(x, 10));\n\n  const ring = this.coordinates[ids[0]];\n\n  ring.splice(ids[1], 0, [lng, lat]);\n};\n\nPolygon.prototype.removeCoordinate = function(path) {\n  this.changed();\n  const ids = path.split('.').map(x => parseInt(x, 10));\n  const ring = this.coordinates[ids[0]];\n  if (ring) {\n    ring.splice(ids[1], 1);\n    if (ring.length < 3) {\n      this.coordinates.splice(ids[0], 1);\n    }\n  }\n};\n\nPolygon.prototype.getCoordinate = function(path) {\n  const ids = path.split('.').map(x => parseInt(x, 10));\n  const ring = this.coordinates[ids[0]];\n  return JSON.parse(JSON.stringify(ring[ids[1]]));\n};\n\nPolygon.prototype.getCoordinates = function() {\n  return this.coordinates.map(coords => coords.concat([coords[0]]));\n};\n\nPolygon.prototype.updateCoordinate = function(path, lng, lat) {\n  this.changed();\n  const parts = path.split('.');\n  const ringId = parseInt(parts[0], 10);\n  const coordId = parseInt(parts[1], 10);\n\n  if (this.coordinates[ringId] === undefined) {\n    this.coordinates[ringId] = [];\n  }\n\n  this.coordinates[ringId][coordId] = [lng, lat];\n};\n\nexport default Polygon;\n","import Feature from './feature';\nimport * as Constants from '../constants';\nimport hat from 'hat';\n\nimport MultiPoint from './point';\nimport MultiLineString from './line_string';\nimport MultiPolygon from './polygon';\n\nconst models = {\n  MultiPoint,\n  MultiLineString,\n  MultiPolygon\n};\n\nconst takeAction = (features, action, path, lng, lat) => {\n  const parts = path.split('.');\n  const idx = parseInt(parts[0], 10);\n  const tail = (!parts[1]) ? null : parts.slice(1).join('.');\n  return features[idx][action](tail, lng, lat);\n};\n\nconst MultiFeature = function(ctx, geojson) {\n  Feature.call(this, ctx, geojson);\n\n  delete this.coordinates;\n  this.model = models[geojson.geometry.type];\n  if (this.model === undefined) throw new TypeError(`${geojson.geometry.type} is not a valid type`);\n  this.features = this._coordinatesToFeatures(geojson.geometry.coordinates);\n};\n\nMultiFeature.prototype = Object.create(Feature.prototype);\n\nMultiFeature.prototype._coordinatesToFeatures = function(coordinates) {\n  const Model = this.model.bind(this);\n  return coordinates.map(coords => new Model(this.ctx, {\n    id: hat(),\n    type: Constants.geojsonTypes.FEATURE,\n    properties: {},\n    geometry: {\n      coordinates: coords,\n      type: this.type.replace('Multi', '')\n    }\n  }));\n};\n\nMultiFeature.prototype.isValid = function() {\n  return this.features.every(f => f.isValid());\n};\n\nMultiFeature.prototype.setCoordinates = function(coords) {\n  this.features = this._coordinatesToFeatures(coords);\n  this.changed();\n};\n\nMultiFeature.prototype.getCoordinate = function(path) {\n  return takeAction(this.features, 'getCoordinate', path);\n};\n\nMultiFeature.prototype.getCoordinates = function() {\n  return JSON.parse(JSON.stringify(this.features.map((f) => {\n    if (f.type === Constants.geojsonTypes.POLYGON) return f.getCoordinates();\n    return f.coordinates;\n  })));\n};\n\nMultiFeature.prototype.updateCoordinate = function(path, lng, lat) {\n  takeAction(this.features, 'updateCoordinate', path, lng, lat);\n  this.changed();\n};\n\nMultiFeature.prototype.addCoordinate = function(path, lng, lat) {\n  takeAction(this.features, 'addCoordinate', path, lng, lat);\n  this.changed();\n};\n\nMultiFeature.prototype.removeCoordinate = function(path) {\n  takeAction(this.features, 'removeCoordinate', path);\n  this.changed();\n};\n\nMultiFeature.prototype.getFeatures = function() {\n  return this.features;\n};\n\nexport default MultiFeature;\n","import * as Constants from '../constants';\nimport featuresAt from '../lib/features_at';\nimport Point from '../feature_types/point';\nimport LineString from '../feature_types/line_string';\nimport Polygon from '../feature_types/polygon';\nimport MultiFeature from '../feature_types/multi_feature';\n\nexport default function ModeInterface(ctx) {\n  this.map = ctx.map;\n  this.drawConfig = JSON.parse(JSON.stringify(ctx.options || {}));\n  this._ctx = ctx;\n}\n\n/**\n * Sets Draw's interal selected state\n * @name this.setSelected\n * @param {DrawFeature[]} - whats selected as a [DrawFeature](https://github.com/mapbox/mapbox-gl-draw/blob/main/src/feature_types/feature.js)\n */\nModeInterface.prototype.setSelected = function(features) {\n  return this._ctx.store.setSelected(features);\n};\n\n/**\n * Sets Draw's internal selected coordinate state\n * @name this.setSelectedCoordinates\n * @param {Object[]} coords - a array of {coord_path: 'string', featureId: 'string'}\n */\nModeInterface.prototype.setSelectedCoordinates = function(coords) {\n  this._ctx.store.setSelectedCoordinates(coords);\n  coords.reduce((m, c) => {\n    if (m[c.feature_id] === undefined) {\n      m[c.feature_id] = true;\n      this._ctx.store.get(c.feature_id).changed();\n    }\n    return m;\n  }, {});\n};\n\n/**\n * Get all selected features as a [DrawFeature](https://github.com/mapbox/mapbox-gl-draw/blob/main/src/feature_types/feature.js)\n * @name this.getSelected\n * @returns {DrawFeature[]}\n */\nModeInterface.prototype.getSelected = function() {\n  return this._ctx.store.getSelected();\n};\n\n/**\n * Get the ids of all currently selected features\n * @name this.getSelectedIds\n * @returns {String[]}\n */\nModeInterface.prototype.getSelectedIds = function() {\n  return this._ctx.store.getSelectedIds();\n};\n\n/**\n * Check if a feature is selected\n * @name this.isSelected\n * @param {String} id - a feature id\n * @returns {Boolean}\n */\nModeInterface.prototype.isSelected = function(id) {\n  return this._ctx.store.isSelected(id);\n};\n\n/**\n * Get a [DrawFeature](https://github.com/mapbox/mapbox-gl-draw/blob/main/src/feature_types/feature.js) by its id\n * @name this.getFeature\n * @param {String} id - a feature id\n * @returns {DrawFeature}\n */\nModeInterface.prototype.getFeature = function(id) {\n  return this._ctx.store.get(id);\n};\n\n/**\n * Add a feature to draw's internal selected state\n * @name this.select\n * @param {String} id\n */\nModeInterface.prototype.select = function(id) {\n  return this._ctx.store.select(id);\n};\n\n/**\n * Remove a feature from draw's internal selected state\n * @name this.delete\n * @param {String} id\n */\nModeInterface.prototype.deselect = function(id) {\n  return this._ctx.store.deselect(id);\n};\n\n/**\n * Delete a feature from draw\n * @name this.deleteFeature\n * @param {String} id - a feature id\n */\nModeInterface.prototype.deleteFeature = function(id, opts = {}) {\n  return this._ctx.store.delete(id, opts);\n};\n\n/**\n * Add a [DrawFeature](https://github.com/mapbox/mapbox-gl-draw/blob/main/src/feature_types/feature.js) to draw.\n * See `this.newFeature` for converting geojson into a DrawFeature\n * @name this.addFeature\n * @param {DrawFeature} feature - the feature to add\n */\nModeInterface.prototype.addFeature = function(feature) {\n  return this._ctx.store.add(feature);\n};\n\n/**\n * Clear all selected features\n */\nModeInterface.prototype.clearSelectedFeatures = function() {\n  return this._ctx.store.clearSelected();\n};\n\n/**\n * Clear all selected coordinates\n */\nModeInterface.prototype.clearSelectedCoordinates = function() {\n  return this._ctx.store.clearSelectedCoordinates();\n};\n\n/**\n * Indicate if the different action are currently possible with your mode\n * See [draw.actionalbe](https://github.com/mapbox/mapbox-gl-draw/blob/main/API.md#drawactionable) for a list of possible actions. All undefined actions are set to **false** by default\n * @name this.setActionableState\n * @param {Object} actions\n */\nModeInterface.prototype.setActionableState = function(actions = {}) {\n  const newSet = {\n    trash: actions.trash || false,\n    combineFeatures: actions.combineFeatures || false,\n    uncombineFeatures: actions.uncombineFeatures || false\n  };\n  return this._ctx.events.actionable(newSet);\n};\n\n/**\n * Trigger a mode change\n * @name this.changeMode\n * @param {String} mode - the mode to transition into\n * @param {Object} opts - the options object to pass to the new mode\n * @param {Object} eventOpts - used to control what kind of events are emitted.\n */\nModeInterface.prototype.changeMode = function(mode, opts = {}, eventOpts = {}) {\n  return this._ctx.events.changeMode(mode, opts, eventOpts);\n};\n\n/**\n * Update the state of draw map classes\n * @name this.updateUIClasses\n * @param {Object} opts\n */\nModeInterface.prototype.updateUIClasses = function(opts) {\n  return  this._ctx.ui.queueMapClasses(opts);\n};\n\n/**\n * If a name is provided it makes that button active, else if makes all buttons inactive\n * @name this.activateUIButton\n * @param {String?} name - name of the button to make active, leave as undefined to set buttons to be inactive\n */\nModeInterface.prototype.activateUIButton = function(name) {\n  return this._ctx.ui.setActiveButton(name);\n};\n\n/**\n * Get the features at the location of an event object or in a bbox\n * @name this.featuresAt\n * @param {Event||NULL} event - a mapbox-gl event object\n * @param {BBOX||NULL} bbox - the area to get features from\n * @param {String} bufferType - is this `click` or `tap` event, defaults to click\n */\nModeInterface.prototype.featuresAt = function(event, bbox, bufferType = 'click') {\n  if (bufferType !== 'click' && bufferType !== 'touch') throw new Error('invalid buffer type');\n  return featuresAt[bufferType](event, bbox, this._ctx);\n};\n\n/**\n * Create a new [DrawFeature](https://github.com/mapbox/mapbox-gl-draw/blob/main/src/feature_types/feature.js) from geojson\n * @name this.newFeature\n * @param {GeoJSONFeature} geojson\n * @returns {DrawFeature}\n */\nModeInterface.prototype.newFeature = function(geojson) {\n  const type = geojson.geometry.type;\n  if (type === Constants.geojsonTypes.POINT) return new Point(this._ctx, geojson);\n  if (type === Constants.geojsonTypes.LINE_STRING) return new LineString(this._ctx, geojson);\n  if (type === Constants.geojsonTypes.POLYGON) return new Polygon(this._ctx, geojson);\n  return new MultiFeature(this._ctx, geojson);\n};\n\n/**\n * Check is an object is an instance of a [DrawFeature](https://github.com/mapbox/mapbox-gl-draw/blob/main/src/feature_types/feature.js)\n * @name this.isInstanceOf\n * @param {String} type - `Point`, `LineString`, `Polygon`, `MultiFeature`\n * @param {Object} feature - the object that needs to be checked\n * @returns {Boolean}\n */\nModeInterface.prototype.isInstanceOf = function(type, feature) {\n  if (type === Constants.geojsonTypes.POINT) return feature instanceof Point;\n  if (type === Constants.geojsonTypes.LINE_STRING) return feature instanceof LineString;\n  if (type === Constants.geojsonTypes.POLYGON) return feature instanceof Polygon;\n  if (type === 'MultiFeature') return feature instanceof MultiFeature;\n  throw new Error(`Unknown feature class: ${type}`);\n};\n\n/**\n * Force draw to rerender the feature of the provided id\n * @name this.doRender\n * @param {String} id - a feature id\n */\nModeInterface.prototype.doRender = function(id) {\n  return this._ctx.store.featureChanged(id);\n};\n\n","import ModeInterface from './mode_interface_accessors';\nexport default ModeInterface;\n\n/**\n * Triggered while a mode is being transitioned into.\n * @param opts {Object} - this is the object passed via `draw.changeMode('mode', opts)`;\n * @name MODE.onSetup\n * @returns {Object} - this object will be passed to all other life cycle functions\n */\nModeInterface.prototype.onSetup = function() {};\n\n/**\n * Triggered when a drag event is detected on the map\n * @name MODE.onDrag\n * @param state {Object} - a mutible state object created by onSetup\n * @param e {Object} - the captured event that is triggering this life cycle event\n */\nModeInterface.prototype.onDrag = function() {};\n\n/**\n * Triggered when the mouse is clicked\n * @name MODE.onClick\n * @param state {Object} - a mutible state object created by onSetup\n * @param e {Object} - the captured event that is triggering this life cycle event\n */\nModeInterface.prototype.onClick = function() {};\n\n/**\n * Triggered with the mouse is moved\n * @name MODE.onMouseMove\n * @param state {Object} - a mutible state object created by onSetup\n * @param e {Object} - the captured event that is triggering this life cycle event\n */\nModeInterface.prototype.onMouseMove = function() {};\n\n/**\n * Triggered when the mouse button is pressed down\n * @name MODE.onMouseDown\n * @param state {Object} - a mutible state object created by onSetup\n * @param e {Object} - the captured event that is triggering this life cycle event\n */\nModeInterface.prototype.onMouseDown = function() {};\n\n/**\n * Triggered when the mouse button is released\n * @name MODE.onMouseUp\n * @param state {Object} - a mutible state object created by onSetup\n * @param e {Object} - the captured event that is triggering this life cycle event\n */\nModeInterface.prototype.onMouseUp = function() {};\n\n/**\n * Triggered when the mouse leaves the map's container\n * @name MODE.onMouseOut\n * @param state {Object} - a mutible state object created by onSetup\n * @param e {Object} - the captured event that is triggering this life cycle event\n */\nModeInterface.prototype.onMouseOut = function() {};\n\n/**\n * Triggered when a key up event is detected\n * @name MODE.onKeyUp\n * @param state {Object} - a mutible state object created by onSetup\n * @param e {Object} - the captured event that is triggering this life cycle event\n */\nModeInterface.prototype.onKeyUp = function() {};\n\n/**\n * Triggered when a key down event is detected\n * @name MODE.onKeyDown\n * @param state {Object} - a mutible state object created by onSetup\n * @param e {Object} - the captured event that is triggering this life cycle event\n */\nModeInterface.prototype.onKeyDown = function() {};\n\n/**\n * Triggered when a touch event is started\n * @name MODE.onTouchStart\n * @param state {Object} - a mutible state object created by onSetup\n * @param e {Object} - the captured event that is triggering this life cycle event\n */\nModeInterface.prototype.onTouchStart = function() {};\n\n/**\n * Triggered when one drags thier finger on a mobile device\n * @name MODE.onTouchMove\n * @param state {Object} - a mutible state object created by onSetup\n * @param e {Object} - the captured event that is triggering this life cycle event\n */\nModeInterface.prototype.onTouchMove = function() {};\n\n/**\n * Triggered when one removes their finger from the map\n * @name MODE.onTouchEnd\n * @param state {Object} - a mutible state object created by onSetup\n * @param e {Object} - the captured event that is triggering this life cycle event\n */\nModeInterface.prototype.onTouchEnd = function() {};\n\n/**\n * Triggered when one quicly taps the map\n * @name MODE.onTap\n * @param state {Object} - a mutible state object created by onSetup\n * @param e {Object} - the captured event that is triggering this life cycle event\n */\nModeInterface.prototype.onTap = function() {};\n\n/**\n * Triggered when the mode is being exited, to be used for cleaning up artifacts such as invalid features\n * @name MODE.onStop\n * @param state {Object} - a mutible state object created by onSetup\n */\nModeInterface.prototype.onStop = function() {};\n\n/**\n * Triggered when [draw.trash()](https://github.com/mapbox/mapbox-gl-draw/blob/main/API.md#trash-draw) is called.\n * @name MODE.onTrash\n * @param state {Object} - a mutible state object created by onSetup\n */\nModeInterface.prototype.onTrash = function() {};\n\n/**\n * Triggered when [draw.combineFeatures()](https://github.com/mapbox/mapbox-gl-draw/blob/main/API.md#combinefeatures-draw) is called.\n * @name MODE.onCombineFeature\n * @param state {Object} - a mutible state object created by onSetup\n */\nModeInterface.prototype.onCombineFeature = function() {};\n\n/**\n * Triggered when [draw.uncombineFeatures()](https://github.com/mapbox/mapbox-gl-draw/blob/main/API.md#uncombinefeatures-draw) is called.\n * @name MODE.onUncombineFeature\n * @param state {Object} - a mutible state object created by onSetup\n */\nModeInterface.prototype.onUncombineFeature = function() {};\n\n/**\n * Triggered per feature on render to convert raw features into set of features for display on the map\n * See [styling draw](https://github.com/mapbox/mapbox-gl-draw/blob/main/API.md#styling-draw) for information about what geojson properties Draw uses as part of rendering.\n * @name MODE.toDisplayFeatures\n * @param state {Object} - a mutible state object created by onSetup\n * @param geojson {Object} - a geojson being evaulated. To render, pass to `display`.\n * @param display {Function} - all geojson objects passed to this be rendered onto the map\n */\nModeInterface.prototype.toDisplayFeatures = function() {\n  throw new Error('You must overwrite toDisplayFeatures');\n};\n\n","import ModeInterface from './mode_interface';\n\nconst eventMapper = {\n  drag: 'onDrag',\n  click: 'onClick',\n  mousemove: 'onMouseMove',\n  mousedown: 'onMouseDown',\n  mouseup: 'onMouseUp',\n  mouseout: 'onMouseOut',\n  keyup: 'onKeyUp',\n  keydown: 'onKeyDown',\n  touchstart: 'onTouchStart',\n  touchmove: 'onTouchMove',\n  touchend: 'onTouchEnd',\n  tap: 'onTap'\n};\n\nconst eventKeys = Object.keys(eventMapper);\n\nexport default function(modeObject) {\n  const modeObjectKeys = Object.keys(modeObject);\n\n  return function(ctx, startOpts = {}) {\n    let state = {};\n\n    const mode = modeObjectKeys.reduce((m, k) => {\n      m[k] = modeObject[k];\n      return m;\n    }, new ModeInterface(ctx));\n\n    function wrapper(eh) {\n      return e => mode[eh](state, e);\n    }\n\n    return {\n      start() {\n        state = mode.onSetup(startOpts); // this should set ui buttons\n\n        // Adds event handlers for all event options\n        // add sets the selector to false for all\n        // handlers that are not present in the mode\n        // to reduce on render calls for functions that\n        // have no logic\n        eventKeys.forEach((key) => {\n          const modeHandler = eventMapper[key];\n          let selector = () => false;\n          if (modeObject[modeHandler]) {\n            selector = () => true;\n          }\n          this.on(key, selector, wrapper(modeHandler));\n        });\n\n      },\n      stop() {\n        mode.onStop(state);\n      },\n      trash() {\n        mode.onTrash(state);\n      },\n      combineFeatures() {\n        mode.onCombineFeatures(state);\n      },\n      uncombineFeatures() {\n        mode.onUncombineFeatures(state);\n      },\n      render(geojson, push) {\n        mode.toDisplayFeatures(state, geojson, push);\n      }\n    };\n  };\n}\n","/**\n * Derive a dense array (no `undefined`s) from a single value or array.\n *\n * @param {any} x\n * @return {Array<any>}\n */\nfunction toDenseArray(x) {\n  return [].concat(x).filter(y => y !== undefined);\n}\n\nexport default toDenseArray;\n","import * as Constants from './constants';\n\nexport default function render() {\n  // eslint-disable-next-line no-invalid-this\n  const store = this;\n  const mapExists = store.ctx.map && store.ctx.map.getSource(Constants.sources.HOT) !== undefined;\n  if (!mapExists) return cleanup();\n\n  const mode = store.ctx.events.currentModeName();\n\n  store.ctx.ui.queueMapClasses({ mode });\n\n  let newHotIds = [];\n  let newColdIds = [];\n\n  if (store.isDirty) {\n    newColdIds = store.getAllIds();\n  } else {\n    newHotIds = store.getChangedIds().filter(id => store.get(id) !== undefined);\n    newColdIds = store.sources.hot.filter(geojson => geojson.properties.id && newHotIds.indexOf(geojson.properties.id) === -1 && store.get(geojson.properties.id) !== undefined).map(geojson => geojson.properties.id);\n  }\n\n\n  store.sources.hot = [];\n  const lastColdCount = store.sources.cold.length;\n  store.sources.cold = store.isDirty ? [] : store.sources.cold.filter((geojson) => {\n    const id = geojson.properties.id || geojson.properties.parent;\n    return newHotIds.indexOf(id) === -1;\n  });\n\n  const coldChanged = lastColdCount !== store.sources.cold.length || newColdIds.length > 0;\n  newHotIds.forEach(id => renderFeature(id, 'hot'));\n  newColdIds.forEach(id => renderFeature(id, 'cold'));\n\n  function renderFeature(id, source) {\n    const feature = store.get(id);\n    const featureInternal = feature.internal(mode);\n    store.ctx.events.currentModeRender(featureInternal, (geojson) => {\n      store.sources[source].push(geojson);\n    });\n  }\n\n\n  /********************** cilc add *********************/\n  /* if (newHotIds.length > 0 && store.sources.hot.length > 0) {\n    if (store.getSelected()[0]) {\n      //有select，feature编辑中\n      store.ctx.map.fire('draw.liveEdit', { feature: store.getSelected()[0].toGeoJSON() })\n    }\n    else {\n      //无select，绘制中\n      if (coldChanged) {\n        //store.ctx.map.fire('draw.liveDrawFinish', { feature: features[features.length - 1].toGeoJSON() })\n        store.ctx.map.fire('draw.liveDrawFinish', { feature: store.get(store.getChangedIds()[0]).toGeoJSON() })\n      }\n      else {\n        //store.ctx.map.fire('draw.liveDraw', { feature: features[features.length - 1].toGeoJSON() })\n        store.ctx.map.fire('draw.liveDraw', { feature: store.get(store.getChangedIds()[0]).toGeoJSON() })\n      }\n    }\n  } else if (coldChanged && store.getSelected().length === 0 && lastColdCount > 0 && store._emitSelectionChange) {\n    const changeIds = store.getChangedIds(),\n      changedFeature = store.get(changeIds[changeIds.length - 1])\n    if (changedFeature)\n      store.ctx.map.fire('draw.liveEditFinish', { feature: changedFeature.toGeoJSON() })\n  } */\n\n  /********************** finish **********************/\n\n  if (coldChanged) {\n    store.ctx.map.getSource(Constants.sources.COLD).setData({\n      type: Constants.geojsonTypes.FEATURE_COLLECTION,\n      features: store.sources.cold\n    });\n  }\n  store.ctx.map.getSource(Constants.sources.HOT).setData({\n    type: Constants.geojsonTypes.FEATURE_COLLECTION,\n    features: store.sources.hot\n  });\n\n  if (store._emitSelectionChange) {\n    store.ctx.map.fire(Constants.events.SELECTION_CHANGE, {\n      features: store.getSelected().map(feature => feature.toGeoJSON()),\n      points: store.getSelectedCoordinates().map(coordinate => ({\n        type: Constants.geojsonTypes.FEATURE,\n        properties: {},\n        geometry: {\n          type: Constants.geojsonTypes.POINT,\n          coordinates: coordinate.coordinates\n        }\n      }))\n    });\n    store._emitSelectionChange = false;\n  }\n\n  if (store._deletedFeaturesToEmit.length) {\n    const geojsonToEmit = store._deletedFeaturesToEmit.map(feature => feature.toGeoJSON());\n\n    store._deletedFeaturesToEmit = [];\n\n    store.ctx.map.fire(Constants.events.DELETE, {\n      features: geojsonToEmit\n    });\n  }\n\n  cleanup();\n  store.ctx.map.fire(Constants.events.RENDER, {});\n\n  function cleanup() {\n    store.isDirty = false;\n    store.clearChangedIds();\n  }\n}\n","import toDenseArray from './lib/to_dense_array';\nimport StringSet from './lib/string_set';\nimport render from './render';\nimport {interactions} from './constants';\n\nexport default function Store(ctx) {\n  this._features = {};\n  this._featureIds = new StringSet();\n  this._selectedFeatureIds = new StringSet();\n  this._selectedCoordinates = [];\n  this._changedFeatureIds = new StringSet();\n  this._deletedFeaturesToEmit = [];\n  this._emitSelectionChange = false;\n  this._mapInitialConfig = {};\n  this.ctx = ctx;\n  this.sources = {\n    hot: [],\n    cold: []\n  };\n\n  // Deduplicate requests to render and tie them to animation frames.\n  let renderRequest;\n  this.render = () => {\n    if (!renderRequest) {\n      renderRequest = requestAnimationFrame(() => {\n        renderRequest = null;\n        render.call(this);\n      });\n    } \n  };\n  this.isDirty = false;\n}\n\n\n/**\n * Delays all rendering until the returned function is invoked\n * @return {Function} renderBatch\n */\nStore.prototype.createRenderBatch = function() {\n  const holdRender = this.render;\n  let numRenders = 0;\n  this.render = function() {\n    numRenders++;\n  };\n\n  return () => {\n    this.render = holdRender;\n    if (numRenders > 0) {\n      this.render();\n    }\n  };\n};\n\n/**\n * Sets the store's state to dirty.\n * @return {Store} this\n */\nStore.prototype.setDirty = function() {\n  this.isDirty = true;\n  return this;\n};\n\n/**\n * Sets a feature's state to changed.\n * @param {string} featureId\n * @return {Store} this\n */\nStore.prototype.featureChanged = function(featureId) {\n  this._changedFeatureIds.add(featureId);\n  return this;\n};\n\n/**\n * Gets the ids of all features currently in changed state.\n * @return {Store} this\n */\nStore.prototype.getChangedIds = function() {\n  return this._changedFeatureIds.values();\n};\n\n/**\n * Sets all features to unchanged state.\n * @return {Store} this\n */\nStore.prototype.clearChangedIds = function() {\n  this._changedFeatureIds.clear();\n  return this;\n};\n\n/**\n * Gets the ids of all features in the store.\n * @return {Store} this\n */\nStore.prototype.getAllIds = function() {\n  return this._featureIds.values();\n};\n\n/**\n * Adds a feature to the store.\n * @param {Object} feature\n *\n * @return {Store} this\n */\nStore.prototype.add = function(feature) {\n  this.featureChanged(feature.id);\n  this._features[feature.id] = feature;\n  this._featureIds.add(feature.id);\n  return this;\n};\n\n/**\n * Deletes a feature or array of features from the store.\n * Cleans up after the deletion by deselecting the features.\n * If changes were made, sets the state to the dirty\n * and fires an event.\n * @param {string | Array<string>} featureIds\n * @param {Object} [options]\n * @param {Object} [options.silent] - If `true`, this invocation will not fire an event.\n * @return {Store} this\n */\nStore.prototype.delete = function(featureIds, options = {}) {\n  toDenseArray(featureIds).forEach((id) => {\n    if (!this._featureIds.has(id)) return;\n    this._featureIds.delete(id);\n    this._selectedFeatureIds.delete(id);\n    if (!options.silent) {\n      if (this._deletedFeaturesToEmit.indexOf(this._features[id]) === -1) {\n        this._deletedFeaturesToEmit.push(this._features[id]);\n      }\n    }\n    delete this._features[id];\n    this.isDirty = true;\n  });\n  refreshSelectedCoordinates(this, options);\n  return this;\n};\n\n/**\n * Returns a feature in the store matching the specified value.\n * @return {Object | undefined} feature\n */\nStore.prototype.get = function(id) {\n  return this._features[id];\n};\n\n/**\n * Returns all features in the store.\n * @return {Array<Object>}\n */\nStore.prototype.getAll = function() {\n  return Object.keys(this._features).map(id => this._features[id]);\n};\n\n/**\n * Adds features to the current selection.\n * @param {string | Array<string>} featureIds\n * @param {Object} [options]\n * @param {Object} [options.silent] - If `true`, this invocation will not fire an event.\n * @return {Store} this\n */\nStore.prototype.select = function(featureIds, options = {}) {\n  toDenseArray(featureIds).forEach((id) => {\n    if (this._selectedFeatureIds.has(id)) return;\n    this._selectedFeatureIds.add(id);\n    this._changedFeatureIds.add(id);\n    if (!options.silent) {\n      this._emitSelectionChange = true;\n    }\n  });\n  return this;\n};\n\n/**\n * Deletes features from the current selection.\n * @param {string | Array<string>} featureIds\n * @param {Object} [options]\n * @param {Object} [options.silent] - If `true`, this invocation will not fire an event.\n * @return {Store} this\n */\nStore.prototype.deselect = function(featureIds, options = {}) {\n  toDenseArray(featureIds).forEach((id) => {\n    if (!this._selectedFeatureIds.has(id)) return;\n    this._selectedFeatureIds.delete(id);\n    this._changedFeatureIds.add(id);\n    if (!options.silent) {\n      this._emitSelectionChange = true;\n    }\n  });\n  refreshSelectedCoordinates(this, options);\n  return this;\n};\n\n/**\n * Clears the current selection.\n * @param {Object} [options]\n * @param {Object} [options.silent] - If `true`, this invocation will not fire an event.\n * @return {Store} this\n */\nStore.prototype.clearSelected = function(options = {}) {\n  this.deselect(this._selectedFeatureIds.values(), { silent: options.silent });\n  return this;\n};\n\n/**\n * Sets the store's selection, clearing any prior values.\n * If no feature ids are passed, the store is just cleared.\n * @param {string | Array<string> | undefined} featureIds\n * @param {Object} [options]\n * @param {Object} [options.silent] - If `true`, this invocation will not fire an event.\n * @return {Store} this\n */\nStore.prototype.setSelected = function(featureIds, options = {}) {\n  featureIds = toDenseArray(featureIds);\n\n  // Deselect any features not in the new selection\n  this.deselect(this._selectedFeatureIds.values().filter(id => featureIds.indexOf(id) === -1), { silent: options.silent });\n\n  // Select any features in the new selection that were not already selected\n  this.select(featureIds.filter(id => !this._selectedFeatureIds.has(id)), { silent: options.silent });\n\n  return this;\n};\n\n/**\n * Sets the store's coordinates selection, clearing any prior values.\n * @param {Array<Array<string>>} coordinates\n * @return {Store} this\n */\nStore.prototype.setSelectedCoordinates = function(coordinates) {\n  this._selectedCoordinates = coordinates;\n  this._emitSelectionChange = true;\n  return this;\n};\n\n/**\n * Clears the current coordinates selection.\n * @param {Object} [options]\n * @return {Store} this\n */\nStore.prototype.clearSelectedCoordinates = function() {\n  this._selectedCoordinates = [];\n  this._emitSelectionChange = true;\n  return this;\n};\n\n/**\n * Returns the ids of features in the current selection.\n * @return {Array<string>} Selected feature ids.\n */\nStore.prototype.getSelectedIds = function() {\n  return this._selectedFeatureIds.values();\n};\n\n/**\n * Returns features in the current selection.\n * @return {Array<Object>} Selected features.\n */\nStore.prototype.getSelected = function() {\n  return this._selectedFeatureIds.values().map(id => this.get(id));\n};\n\n/**\n * Returns selected coordinates in the currently selected feature.\n * @return {Array<Object>} Selected coordinates.\n */\nStore.prototype.getSelectedCoordinates = function() {\n  const selected = this._selectedCoordinates.map((coordinate) => {\n    const feature = this.get(coordinate.feature_id);\n    if(feature.properties.isCustom){\n      // 自定义图形\n      return {\n        coordinates: feature.properties.coordinates[parseInt(coordinate.coord_path)]\n      }\n    }\n    return {\n      coordinates: feature.getCoordinate(coordinate.coord_path)\n    };\n  });\n  return selected;\n};\n\n/**\n * Indicates whether a feature is selected.\n * @param {string} featureId\n * @return {boolean} `true` if the feature is selected, `false` if not.\n */\nStore.prototype.isSelected = function(featureId) {\n  return this._selectedFeatureIds.has(featureId);\n};\n\n/**\n * Sets a property on the given feature\n * @param {string} featureId\n * @param {string} property property\n * @param {string} property value\n*/\nStore.prototype.setFeatureProperty = function(featureId, property, value) {\n  this.get(featureId).setProperty(property, value);\n  this.featureChanged(featureId);\n};\n\nfunction refreshSelectedCoordinates(store, options) {\n  const newSelectedCoordinates = store._selectedCoordinates.filter(point => store._selectedFeatureIds.has(point.feature_id));\n  if (store._selectedCoordinates.length !== newSelectedCoordinates.length && !options.silent) {\n    store._emitSelectionChange = true;\n  }\n  store._selectedCoordinates = newSelectedCoordinates;\n}\n\n/**\n * Stores the initial config for a map, so that we can set it again after we're done.\n*/\nStore.prototype.storeMapConfig = function() {\n  interactions.forEach((interaction) => {\n    const interactionSet = this.ctx.map[interaction];\n    if (interactionSet) {\n      this._mapInitialConfig[interaction] = this.ctx.map[interaction].isEnabled();\n    }\n  });\n};\n\n/**\n * Restores the initial config for a map, ensuring all is well.\n*/\nStore.prototype.restoreMapConfig = function() {\n  Object.keys(this._mapInitialConfig).forEach((key) => {\n    const value = this._mapInitialConfig[key];\n    if (value) {\n      this.ctx.map[key].enable();\n    } else {\n      this.ctx.map[key].disable();\n    }\n  });\n};\n\n/**\n * Returns the initial state of an interaction setting.\n * @param {string} interaction\n * @return {boolean} `true` if the interaction is enabled, `false` if not.\n * Defaults to `true`. (Todo: include defaults.)\n*/\nStore.prototype.getInitialConfigValue = function(interaction) {\n  if (this._mapInitialConfig[interaction] !== undefined) {\n    return this._mapInitialConfig[interaction];\n  } else {\n    // This needs to be set to whatever the default is for that interaction\n    // It seems to be true for all cases currently, so let's send back `true`.\n    return true;\n  }\n};\n","module.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n    var target = {}\n\n    for (var i = 0; i < arguments.length; i++) {\n        var source = arguments[i]\n\n        for (var key in source) {\n            if (hasOwnProperty.call(source, key)) {\n                target[key] = source[key]\n            }\n        }\n    }\n\n    return target\n}\n","import * as Constants from '../constants';\n\nexport function isOfMetaType(type) {\n  return function(e) {\n    const featureTarget = e.featureTarget;\n    if (!featureTarget) return false;\n    if (!featureTarget.properties) return false;\n    return featureTarget.properties.meta === type;\n  };\n}\n\nexport function isShiftMousedown(e) {\n  if (!e.originalEvent) return false;\n  if (!e.originalEvent.shiftKey) return false;\n  return e.originalEvent.button === 0;\n}\n\nexport function isActiveFeature(e) {\n  if (!e.featureTarget) return false;\n  if (!e.featureTarget.properties) return false;\n  return e.featureTarget.properties.active === Constants.activeStates.ACTIVE &&\n    e.featureTarget.properties.meta === Constants.meta.FEATURE;\n}\n\nexport function isInactiveFeature(e) {\n  if (!e.featureTarget) return false;\n  if (!e.featureTarget.properties) return false;\n  return e.featureTarget.properties.active === Constants.activeStates.INACTIVE &&\n    e.featureTarget.properties.meta === Constants.meta.FEATURE;\n}\n\nexport function noTarget(e) {\n  return e.featureTarget === undefined;\n}\n\nexport function isFeature(e) {\n  if (!e.featureTarget) return false;\n  if (!e.featureTarget.properties) return false;\n  return e.featureTarget.properties.meta === Constants.meta.FEATURE;\n}\n\nexport function isVertex(e) {\n  const featureTarget = e.featureTarget;\n  if (!featureTarget) return false;\n  if (!featureTarget.properties) return false;\n  return featureTarget.properties.meta === Constants.meta.VERTEX;\n}\n\nexport function isShiftDown(e) {\n  if (!e.originalEvent) return false;\n  return e.originalEvent.shiftKey === true;\n}\n\nexport function isEscapeKey(e) {\n  return e.keyCode === 27;\n}\n\nexport function isEnterKey(e) {\n  return e.keyCode === 13;\n}\n\nexport function isTrue() {\n  return true;\n}\n","'use strict';\n\nmodule.exports = Point;\n\n/**\n * A standalone point geometry with useful accessor, comparison, and\n * modification methods.\n *\n * @class Point\n * @param {Number} x the x-coordinate. this could be longitude or screen\n * pixels, or any other sort of unit.\n * @param {Number} y the y-coordinate. this could be latitude or screen\n * pixels, or any other sort of unit.\n * @example\n * var point = new Point(-77, 38);\n */\nfunction Point(x, y) {\n    this.x = x;\n    this.y = y;\n}\n\nPoint.prototype = {\n\n    /**\n     * Clone this point, returning a new point that can be modified\n     * without affecting the old one.\n     * @return {Point} the clone\n     */\n    clone: function() { return new Point(this.x, this.y); },\n\n    /**\n     * Add this point's x & y coordinates to another point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    add:     function(p) { return this.clone()._add(p); },\n\n    /**\n     * Subtract this point's x & y coordinates to from point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    sub:     function(p) { return this.clone()._sub(p); },\n\n    /**\n     * Multiply this point's x & y coordinates by point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    multByPoint:    function(p) { return this.clone()._multByPoint(p); },\n\n    /**\n     * Divide this point's x & y coordinates by point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    divByPoint:     function(p) { return this.clone()._divByPoint(p); },\n\n    /**\n     * Multiply this point's x & y coordinates by a factor,\n     * yielding a new point.\n     * @param {Point} k factor\n     * @return {Point} output point\n     */\n    mult:    function(k) { return this.clone()._mult(k); },\n\n    /**\n     * Divide this point's x & y coordinates by a factor,\n     * yielding a new point.\n     * @param {Point} k factor\n     * @return {Point} output point\n     */\n    div:     function(k) { return this.clone()._div(k); },\n\n    /**\n     * Rotate this point around the 0, 0 origin by an angle a,\n     * given in radians\n     * @param {Number} a angle to rotate around, in radians\n     * @return {Point} output point\n     */\n    rotate:  function(a) { return this.clone()._rotate(a); },\n\n    /**\n     * Rotate this point around p point by an angle a,\n     * given in radians\n     * @param {Number} a angle to rotate around, in radians\n     * @param {Point} p Point to rotate around\n     * @return {Point} output point\n     */\n    rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },\n\n    /**\n     * Multiply this point by a 4x1 transformation matrix\n     * @param {Array<Number>} m transformation matrix\n     * @return {Point} output point\n     */\n    matMult: function(m) { return this.clone()._matMult(m); },\n\n    /**\n     * Calculate this point but as a unit vector from 0, 0, meaning\n     * that the distance from the resulting point to the 0, 0\n     * coordinate will be equal to 1 and the angle from the resulting\n     * point to the 0, 0 coordinate will be the same as before.\n     * @return {Point} unit vector point\n     */\n    unit:    function() { return this.clone()._unit(); },\n\n    /**\n     * Compute a perpendicular point, where the new y coordinate\n     * is the old x coordinate and the new x coordinate is the old y\n     * coordinate multiplied by -1\n     * @return {Point} perpendicular point\n     */\n    perp:    function() { return this.clone()._perp(); },\n\n    /**\n     * Return a version of this point with the x & y coordinates\n     * rounded to integers.\n     * @return {Point} rounded point\n     */\n    round:   function() { return this.clone()._round(); },\n\n    /**\n     * Return the magitude of this point: this is the Euclidean\n     * distance from the 0, 0 coordinate to this point's x and y\n     * coordinates.\n     * @return {Number} magnitude\n     */\n    mag: function() {\n        return Math.sqrt(this.x * this.x + this.y * this.y);\n    },\n\n    /**\n     * Judge whether this point is equal to another point, returning\n     * true or false.\n     * @param {Point} other the other point\n     * @return {boolean} whether the points are equal\n     */\n    equals: function(other) {\n        return this.x === other.x &&\n               this.y === other.y;\n    },\n\n    /**\n     * Calculate the distance from this point to another point\n     * @param {Point} p the other point\n     * @return {Number} distance\n     */\n    dist: function(p) {\n        return Math.sqrt(this.distSqr(p));\n    },\n\n    /**\n     * Calculate the distance from this point to another point,\n     * without the square root step. Useful if you're comparing\n     * relative distances.\n     * @param {Point} p the other point\n     * @return {Number} distance\n     */\n    distSqr: function(p) {\n        var dx = p.x - this.x,\n            dy = p.y - this.y;\n        return dx * dx + dy * dy;\n    },\n\n    /**\n     * Get the angle from the 0, 0 coordinate to this point, in radians\n     * coordinates.\n     * @return {Number} angle\n     */\n    angle: function() {\n        return Math.atan2(this.y, this.x);\n    },\n\n    /**\n     * Get the angle from this point to another point, in radians\n     * @param {Point} b the other point\n     * @return {Number} angle\n     */\n    angleTo: function(b) {\n        return Math.atan2(this.y - b.y, this.x - b.x);\n    },\n\n    /**\n     * Get the angle between this point and another point, in radians\n     * @param {Point} b the other point\n     * @return {Number} angle\n     */\n    angleWith: function(b) {\n        return this.angleWithSep(b.x, b.y);\n    },\n\n    /*\n     * Find the angle of the two vectors, solving the formula for\n     * the cross product a x b = |a||b|sin(θ) for θ.\n     * @param {Number} x the x-coordinate\n     * @param {Number} y the y-coordinate\n     * @return {Number} the angle in radians\n     */\n    angleWithSep: function(x, y) {\n        return Math.atan2(\n            this.x * y - this.y * x,\n            this.x * x + this.y * y);\n    },\n\n    _matMult: function(m) {\n        var x = m[0] * this.x + m[1] * this.y,\n            y = m[2] * this.x + m[3] * this.y;\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _add: function(p) {\n        this.x += p.x;\n        this.y += p.y;\n        return this;\n    },\n\n    _sub: function(p) {\n        this.x -= p.x;\n        this.y -= p.y;\n        return this;\n    },\n\n    _mult: function(k) {\n        this.x *= k;\n        this.y *= k;\n        return this;\n    },\n\n    _div: function(k) {\n        this.x /= k;\n        this.y /= k;\n        return this;\n    },\n\n    _multByPoint: function(p) {\n        this.x *= p.x;\n        this.y *= p.y;\n        return this;\n    },\n\n    _divByPoint: function(p) {\n        this.x /= p.x;\n        this.y /= p.y;\n        return this;\n    },\n\n    _unit: function() {\n        this._div(this.mag());\n        return this;\n    },\n\n    _perp: function() {\n        var y = this.y;\n        this.y = this.x;\n        this.x = -y;\n        return this;\n    },\n\n    _rotate: function(angle) {\n        var cos = Math.cos(angle),\n            sin = Math.sin(angle),\n            x = cos * this.x - sin * this.y,\n            y = sin * this.x + cos * this.y;\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _rotateAround: function(angle, p) {\n        var cos = Math.cos(angle),\n            sin = Math.sin(angle),\n            x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),\n            y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _round: function() {\n        this.x = Math.round(this.x);\n        this.y = Math.round(this.y);\n        return this;\n    }\n};\n\n/**\n * Construct a point from an array if necessary, otherwise if the input\n * is already a Point, or an unknown type, return it unchanged\n * @param {Array<Number>|Point|*} a any kind of input value\n * @return {Point} constructed point, or passed-through value.\n * @example\n * // this\n * var point = Point.convert([0, 1]);\n * // is equivalent to\n * var point = new Point(0, 1);\n */\nPoint.convert = function (a) {\n    if (a instanceof Point) {\n        return a;\n    }\n    if (Array.isArray(a)) {\n        return new Point(a[0], a[1]);\n    }\n    return a;\n};\n","import Point from '@mapbox/point-geometry';\n\n/**\n * Returns a Point representing a mouse event's position\n * relative to a containing element.\n *\n * @param {MouseEvent} mouseEvent\n * @param {Node} container\n * @returns {Point}\n */\nfunction mouseEventPoint(mouseEvent, container) {\n  const rect = container.getBoundingClientRect();\n  return new Point(\n    mouseEvent.clientX - rect.left - (container.clientLeft || 0),\n    mouseEvent.clientY - rect.top - (container.clientTop || 0)\n  );\n}\n\nexport default mouseEventPoint;\n","import * as Constants from '../constants';\n\n/**\n * Returns GeoJSON for a Point representing the\n * vertex of another feature.\n *\n * @param {string} parentId\n * @param {Array<number>} coordinates\n * @param {string} path - Dot-separated numbers indicating exactly\n *   where the point exists within its parent feature's coordinates.\n * @param {boolean} selected\n * @return {GeoJSON} Point\n */\nexport default function(parentId, coordinates, path, selected) {\n  return {\n    type: Constants.geojsonTypes.FEATURE,\n    properties: {\n      meta: Constants.meta.VERTEX,\n      parent: parentId,\n      coord_path: path,\n      active: (selected) ? Constants.activeStates.ACTIVE : Constants.activeStates.INACTIVE\n    },\n    geometry: {\n      type: Constants.geojsonTypes.POINT,\n      coordinates\n    }\n  };\n}\n","import createVertex from './create_vertex';\nimport createMidpoint from './create_midpoint';\nimport * as Constants from '../constants';\n\nfunction createSupplementaryPoints(geojson, options = {}, basePath = null) {\n  const { type, coordinates } = geojson.geometry;\n  const featureId = geojson.properties && geojson.properties.id;\n\n  let supplementaryPoints = [];\n\n  if( geojson.properties && geojson.properties.user_isCustom && geojson.properties.user_coordinates.length>0){\n    // 是自定义图形\n    // const c_basePath = basePath !== null?basePath:'';\n    geojson.properties.user_coordinates.forEach((coordinate,index)=>{\n      supplementaryPoints.push(createVertex(featureId, coordinate, index, isSelectedPath(index)));\n    })\n    return supplementaryPoints;\n  }\n\n  if (type === Constants.geojsonTypes.POINT) {\n    // For points, just create a vertex\n    supplementaryPoints.push(createVertex(featureId, coordinates, basePath, isSelectedPath(basePath)));\n  } else if (type === Constants.geojsonTypes.POLYGON) {\n    // Cycle through a Polygon's rings and\n    // process each line\n    coordinates.forEach((line, lineIndex) => {\n      processLine(line, (basePath !== null) ? `${basePath}.${lineIndex}` : String(lineIndex));\n    });\n  } else if (type === Constants.geojsonTypes.LINE_STRING) {\n    processLine(coordinates, basePath);\n  } else if (type.indexOf(Constants.geojsonTypes.MULTI_PREFIX) === 0) {\n    processMultiGeometry();\n  }\n\n  function processLine(line, lineBasePath) {\n    let firstPointString = '';\n    let lastVertex = null;\n    line.forEach((point, pointIndex) => {\n      const pointPath = (lineBasePath !== undefined && lineBasePath !== null) ? `${lineBasePath}.${pointIndex}` : String(pointIndex);\n      const vertex = createVertex(featureId, point, pointPath, isSelectedPath(pointPath));\n\n      // If we're creating midpoints, check if there was a\n      // vertex before this one. If so, add a midpoint\n      // between that vertex and this one.\n      if (options.midpoints && lastVertex) {\n        const midpoint = createMidpoint(featureId, lastVertex, vertex, options.map);\n        if (midpoint) {\n          supplementaryPoints.push(midpoint);\n        }\n      }\n      lastVertex = vertex;\n\n      // A Polygon line's last point is the same as the first point. If we're on the last\n      // point, we want to draw a midpoint before it but not another vertex on it\n      // (since we already a vertex there, from the first point).\n      const stringifiedPoint = JSON.stringify(point);\n      if (firstPointString !== stringifiedPoint) {\n        supplementaryPoints.push(vertex);\n      }\n      if (pointIndex === 0) {\n        firstPointString = stringifiedPoint;\n      }\n    });\n  }\n\n  function isSelectedPath(path) {\n    if (!options.selectedPaths) return false;\n    return options.selectedPaths.indexOf(path) !== -1;\n  }\n\n  // Split a multi-geometry into constituent\n  // geometries, and accumulate the supplementary points\n  // for each of those constituents\n  function processMultiGeometry() {\n    const subType = type.replace(Constants.geojsonTypes.MULTI_PREFIX, '');\n    coordinates.forEach((subCoordinates, index) => {\n      const subFeature = {\n        type: Constants.geojsonTypes.FEATURE,\n        properties: geojson.properties,\n        geometry: {\n          type: subType,\n          coordinates: subCoordinates\n        }\n      };\n      supplementaryPoints = supplementaryPoints.concat(createSupplementaryPoints(subFeature, options, index));\n    });\n  }\n\n  return supplementaryPoints;\n}\n\nexport default createSupplementaryPoints;\n","import * as Constants from '../constants';\n\nexport default function(parent, startVertex, endVertex, map) {\n  const startCoord = startVertex.geometry.coordinates;\n  const endCoord = endVertex.geometry.coordinates;\n\n  // If a coordinate exceeds the projection, we can't calculate a midpoint,\n  // so run away\n  if (startCoord[1] > Constants.LAT_RENDERED_MAX ||\n    startCoord[1] < Constants.LAT_RENDERED_MIN ||\n    endCoord[1] > Constants.LAT_RENDERED_MAX ||\n    endCoord[1] < Constants.LAT_RENDERED_MIN) {\n    return null;\n  }\n\n  const ptA = map.project([ startCoord[0], startCoord[1] ]);\n  const ptB = map.project([ endCoord[0], endCoord[1] ]);\n  const mid = map.unproject([ (ptA.x + ptB.x) / 2, (ptA.y + ptB.y) / 2 ]);\n\n  return {\n    type: Constants.geojsonTypes.FEATURE,\n    properties: {\n      meta: Constants.meta.MIDPOINT,\n      parent,\n      lng: mid.lng,\n      lat: mid.lat,\n      coord_path: endVertex.properties.coord_path\n    },\n    geometry: {\n      type: Constants.geojsonTypes.POINT,\n      coordinates: [mid.lng, mid.lat]\n    }\n  };\n}\n","export default {\n  enable(ctx) {\n    setTimeout(() => {\n      // First check we've got a map and some context.\n      if (!ctx.map || !ctx.map.doubleClickZoom || !ctx._ctx || !ctx._ctx.store || !ctx._ctx.store.getInitialConfigValue) return;\n      // Now check initial state wasn't false (we leave it disabled if so)\n      if (!ctx._ctx.store.getInitialConfigValue('doubleClickZoom')) return;\n      ctx.map.doubleClickZoom.enable();\n    }, 0);\n  },\n  disable(ctx) {\n    setTimeout(() => {\n      if (!ctx.map || !ctx.map.doubleClickZoom) return;\n      // Always disable here, as it's necessary in some cases.\n      ctx.map.doubleClickZoom.disable();\n    }, 0);\n  }\n};\n","module.exports = normalize;\n\nvar types = {\n    Point: 'geometry',\n    MultiPoint: 'geometry',\n    LineString: 'geometry',\n    MultiLineString: 'geometry',\n    Polygon: 'geometry',\n    MultiPolygon: 'geometry',\n    GeometryCollection: 'geometry',\n    Feature: 'feature',\n    FeatureCollection: 'featurecollection'\n};\n\n/**\n * Normalize a GeoJSON feature into a FeatureCollection.\n *\n * @param {object} gj geojson data\n * @returns {object} normalized geojson data\n */\nfunction normalize(gj) {\n    if (!gj || !gj.type) return null;\n    var type = types[gj.type];\n    if (!type) return null;\n\n    if (type === 'geometry') {\n        return {\n            type: 'FeatureCollection',\n            features: [{\n                type: 'Feature',\n                properties: {},\n                geometry: gj\n            }]\n        };\n    } else if (type === 'feature') {\n        return {\n            type: 'FeatureCollection',\n            features: [gj]\n        };\n    } else if (type === 'featurecollection') {\n        return gj;\n    }\n}\n","module.exports=function e(t){switch(t&&t.type||null){case\"FeatureCollection\":return t.features=t.features.reduce(function(t,r){return t.concat(e(r))},[]),t;case\"Feature\":return t.geometry?e(t.geometry).map(function(e){var r={type:\"Feature\",properties:JSON.parse(JSON.stringify(t.properties)),geometry:e};return void 0!==t.id&&(r.id=t.id),r}):t;case\"MultiPoint\":return t.coordinates.map(function(e){return{type:\"Point\",coordinates:e}});case\"MultiPolygon\":return t.coordinates.map(function(e){return{type:\"Polygon\",coordinates:e}});case\"MultiLineString\":return t.coordinates.map(function(e){return{type:\"LineString\",coordinates:e}});case\"GeometryCollection\":return t.geometries.map(e).reduce(function(e,t){return e.concat(t)},[]);case\"Point\":case\"Polygon\":case\"LineString\":return[t]}};\n//# sourceMappingURL=index.js.map\n","var geojsonNormalize = require('@mapbox/geojson-normalize'),\n    geojsonFlatten = require('geojson-flatten'),\n    flatten = require('./flatten');\n\nmodule.exports = function(_) {\n    if (!_) return [];\n    var normalized = geojsonFlatten(geojsonNormalize(_)),\n        coordinates = [];\n    normalized.features.forEach(function(feature) {\n        if (!feature.geometry) return;\n        coordinates = coordinates.concat(flatten(feature.geometry.coordinates));\n    });\n    return coordinates;\n};\n","module.exports = function flatten(list) {\n    return _flatten(list);\n\n    function _flatten(list) {\n        if (Array.isArray(list) && list.length &&\n            typeof list[0] === 'number') {\n            return [list];\n        }\n        return list.reduce(function (acc, item) {\n            if (Array.isArray(item) && Array.isArray(item[0])) {\n                return acc.concat(_flatten(item));\n            } else {\n                acc.push(item);\n                return acc;\n            }\n        }, []);\n    }\n};\n","var traverse = module.exports = function (obj) {\n    return new Traverse(obj);\n};\n\nfunction Traverse (obj) {\n    this.value = obj;\n}\n\nTraverse.prototype.get = function (ps) {\n    var node = this.value;\n    for (var i = 0; i < ps.length; i ++) {\n        var key = ps[i];\n        if (!node || !hasOwnProperty.call(node, key)) {\n            node = undefined;\n            break;\n        }\n        node = node[key];\n    }\n    return node;\n};\n\nTraverse.prototype.has = function (ps) {\n    var node = this.value;\n    for (var i = 0; i < ps.length; i ++) {\n        var key = ps[i];\n        if (!node || !hasOwnProperty.call(node, key)) {\n            return false;\n        }\n        node = node[key];\n    }\n    return true;\n};\n\nTraverse.prototype.set = function (ps, value) {\n    var node = this.value;\n    for (var i = 0; i < ps.length - 1; i ++) {\n        var key = ps[i];\n        if (!hasOwnProperty.call(node, key)) node[key] = {};\n        node = node[key];\n    }\n    node[ps[i]] = value;\n    return value;\n};\n\nTraverse.prototype.map = function (cb) {\n    return walk(this.value, cb, true);\n};\n\nTraverse.prototype.forEach = function (cb) {\n    this.value = walk(this.value, cb, false);\n    return this.value;\n};\n\nTraverse.prototype.reduce = function (cb, init) {\n    var skip = arguments.length === 1;\n    var acc = skip ? this.value : init;\n    this.forEach(function (x) {\n        if (!this.isRoot || !skip) {\n            acc = cb.call(this, acc, x);\n        }\n    });\n    return acc;\n};\n\nTraverse.prototype.paths = function () {\n    var acc = [];\n    this.forEach(function (x) {\n        acc.push(this.path); \n    });\n    return acc;\n};\n\nTraverse.prototype.nodes = function () {\n    var acc = [];\n    this.forEach(function (x) {\n        acc.push(this.node);\n    });\n    return acc;\n};\n\nTraverse.prototype.clone = function () {\n    var parents = [], nodes = [];\n    \n    return (function clone (src) {\n        for (var i = 0; i < parents.length; i++) {\n            if (parents[i] === src) {\n                return nodes[i];\n            }\n        }\n        \n        if (typeof src === 'object' && src !== null) {\n            var dst = copy(src);\n            \n            parents.push(src);\n            nodes.push(dst);\n            \n            forEach(objectKeys(src), function (key) {\n                dst[key] = clone(src[key]);\n            });\n            \n            parents.pop();\n            nodes.pop();\n            return dst;\n        }\n        else {\n            return src;\n        }\n    })(this.value);\n};\n\nfunction walk (root, cb, immutable) {\n    var path = [];\n    var parents = [];\n    var alive = true;\n    \n    return (function walker (node_) {\n        var node = immutable ? copy(node_) : node_;\n        var modifiers = {};\n        \n        var keepGoing = true;\n        \n        var state = {\n            node : node,\n            node_ : node_,\n            path : [].concat(path),\n            parent : parents[parents.length - 1],\n            parents : parents,\n            key : path.slice(-1)[0],\n            isRoot : path.length === 0,\n            level : path.length,\n            circular : null,\n            update : function (x, stopHere) {\n                if (!state.isRoot) {\n                    state.parent.node[state.key] = x;\n                }\n                state.node = x;\n                if (stopHere) keepGoing = false;\n            },\n            'delete' : function (stopHere) {\n                delete state.parent.node[state.key];\n                if (stopHere) keepGoing = false;\n            },\n            remove : function (stopHere) {\n                if (isArray(state.parent.node)) {\n                    state.parent.node.splice(state.key, 1);\n                }\n                else {\n                    delete state.parent.node[state.key];\n                }\n                if (stopHere) keepGoing = false;\n            },\n            keys : null,\n            before : function (f) { modifiers.before = f },\n            after : function (f) { modifiers.after = f },\n            pre : function (f) { modifiers.pre = f },\n            post : function (f) { modifiers.post = f },\n            stop : function () { alive = false },\n            block : function () { keepGoing = false }\n        };\n        \n        if (!alive) return state;\n        \n        function updateState() {\n            if (typeof state.node === 'object' && state.node !== null) {\n                if (!state.keys || state.node_ !== state.node) {\n                    state.keys = objectKeys(state.node)\n                }\n                \n                state.isLeaf = state.keys.length == 0;\n                \n                for (var i = 0; i < parents.length; i++) {\n                    if (parents[i].node_ === node_) {\n                        state.circular = parents[i];\n                        break;\n                    }\n                }\n            }\n            else {\n                state.isLeaf = true;\n                state.keys = null;\n            }\n            \n            state.notLeaf = !state.isLeaf;\n            state.notRoot = !state.isRoot;\n        }\n        \n        updateState();\n        \n        // use return values to update if defined\n        var ret = cb.call(state, state.node);\n        if (ret !== undefined && state.update) state.update(ret);\n        \n        if (modifiers.before) modifiers.before.call(state, state.node);\n        \n        if (!keepGoing) return state;\n        \n        if (typeof state.node == 'object'\n        && state.node !== null && !state.circular) {\n            parents.push(state);\n            \n            updateState();\n            \n            forEach(state.keys, function (key, i) {\n                path.push(key);\n                \n                if (modifiers.pre) modifiers.pre.call(state, state.node[key], key);\n                \n                var child = walker(state.node[key]);\n                if (immutable && hasOwnProperty.call(state.node, key)) {\n                    state.node[key] = child.node;\n                }\n                \n                child.isLast = i == state.keys.length - 1;\n                child.isFirst = i == 0;\n                \n                if (modifiers.post) modifiers.post.call(state, child);\n                \n                path.pop();\n            });\n            parents.pop();\n        }\n        \n        if (modifiers.after) modifiers.after.call(state, state.node);\n        \n        return state;\n    })(root).node;\n}\n\nfunction copy (src) {\n    if (typeof src === 'object' && src !== null) {\n        var dst;\n        \n        if (isArray(src)) {\n            dst = [];\n        }\n        else if (isDate(src)) {\n            dst = new Date(src.getTime ? src.getTime() : src);\n        }\n        else if (isRegExp(src)) {\n            dst = new RegExp(src);\n        }\n        else if (isError(src)) {\n            dst = { message: src.message };\n        }\n        else if (isBoolean(src)) {\n            dst = new Boolean(src);\n        }\n        else if (isNumber(src)) {\n            dst = new Number(src);\n        }\n        else if (isString(src)) {\n            dst = new String(src);\n        }\n        else if (Object.create && Object.getPrototypeOf) {\n            dst = Object.create(Object.getPrototypeOf(src));\n        }\n        else if (src.constructor === Object) {\n            dst = {};\n        }\n        else {\n            var proto =\n                (src.constructor && src.constructor.prototype)\n                || src.__proto__\n                || {}\n            ;\n            var T = function () {};\n            T.prototype = proto;\n            dst = new T;\n        }\n        \n        forEach(objectKeys(src), function (key) {\n            dst[key] = src[key];\n        });\n        return dst;\n    }\n    else return src;\n}\n\nvar objectKeys = Object.keys || function keys (obj) {\n    var res = [];\n    for (var key in obj) res.push(key)\n    return res;\n};\n\nfunction toS (obj) { return Object.prototype.toString.call(obj) }\nfunction isDate (obj) { return toS(obj) === '[object Date]' }\nfunction isRegExp (obj) { return toS(obj) === '[object RegExp]' }\nfunction isError (obj) { return toS(obj) === '[object Error]' }\nfunction isBoolean (obj) { return toS(obj) === '[object Boolean]' }\nfunction isNumber (obj) { return toS(obj) === '[object Number]' }\nfunction isString (obj) { return toS(obj) === '[object String]' }\n\nvar isArray = Array.isArray || function isArray (xs) {\n    return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nvar forEach = function (xs, fn) {\n    if (xs.forEach) return xs.forEach(fn)\n    else for (var i = 0; i < xs.length; i++) {\n        fn(xs[i], i, xs);\n    }\n};\n\nforEach(objectKeys(Traverse.prototype), function (key) {\n    traverse[key] = function (obj) {\n        var args = [].slice.call(arguments, 1);\n        var t = new Traverse(obj);\n        return t[key].apply(t, args);\n    };\n});\n\nvar hasOwnProperty = Object.hasOwnProperty || function (obj, key) {\n    return key in obj;\n};\n","module.exports = Extent;\n\nfunction Extent(bbox) {\n    if (!(this instanceof Extent)) {\n        return new Extent(bbox);\n    }\n    this._bbox = bbox || [Infinity, Infinity, -Infinity, -Infinity];\n    this._valid = !!bbox;\n}\n\nExtent.prototype.include = function(ll) {\n    this._valid = true;\n    this._bbox[0] = Math.min(this._bbox[0], ll[0]);\n    this._bbox[1] = Math.min(this._bbox[1], ll[1]);\n    this._bbox[2] = Math.max(this._bbox[2], ll[0]);\n    this._bbox[3] = Math.max(this._bbox[3], ll[1]);\n    return this;\n};\n\nExtent.prototype.equals = function(_) {\n    var other;\n    if (_ instanceof Extent) { other = _.bbox(); } else { other = _; }\n    return this._bbox[0] == other[0] &&\n        this._bbox[1] == other[1] &&\n        this._bbox[2] == other[2] &&\n        this._bbox[3] == other[3];\n};\n\nExtent.prototype.center = function(_) {\n    if (!this._valid) return null;\n    return [\n        (this._bbox[0] + this._bbox[2]) / 2,\n        (this._bbox[1] + this._bbox[3]) / 2]\n};\n\nExtent.prototype.union = function(_) {\n    this._valid = true;\n    var other;\n    if (_ instanceof Extent) { other = _.bbox(); } else { other = _; }\n    this._bbox[0] = Math.min(this._bbox[0], other[0]);\n    this._bbox[1] = Math.min(this._bbox[1], other[1]);\n    this._bbox[2] = Math.max(this._bbox[2], other[2]);\n    this._bbox[3] = Math.max(this._bbox[3], other[3]);\n    return this;\n};\n\nExtent.prototype.bbox = function() {\n    if (!this._valid) return null;\n    return this._bbox;\n};\n\nExtent.prototype.contains = function(ll) {\n    if (!ll) return this._fastContains();\n    if (!this._valid) return null;\n    var lon = ll[0], lat = ll[1];\n    return this._bbox[0] <= lon &&\n        this._bbox[1] <= lat &&\n        this._bbox[2] >= lon &&\n        this._bbox[3] >= lat;\n};\n\nExtent.prototype.intersect = function(_) {\n    if (!this._valid) return null;\n\n    var other;\n    if (_ instanceof Extent) { other = _.bbox(); } else { other = _; }\n\n    return !(\n      this._bbox[0] > other[2] ||\n      this._bbox[2] < other[0] ||\n      this._bbox[3] < other[1] ||\n      this._bbox[1] > other[3]\n    );\n};\n\nExtent.prototype._fastContains = function() {\n    if (!this._valid) return new Function('return null;');\n    var body = 'return ' +\n        this._bbox[0] + '<= ll[0] &&' +\n        this._bbox[1] + '<= ll[1] &&' +\n        this._bbox[2] + '>= ll[0] &&' +\n        this._bbox[3] + '>= ll[1]';\n    return new Function('ll', body);\n};\n\nExtent.prototype.polygon = function() {\n    if (!this._valid) return null;\n    return {\n        type: 'Polygon',\n        coordinates: [\n            [\n                // W, S\n                [this._bbox[0], this._bbox[1]],\n                // E, S\n                [this._bbox[2], this._bbox[1]],\n                // E, N\n                [this._bbox[2], this._bbox[3]],\n                // W, N\n                [this._bbox[0], this._bbox[3]],\n                // W, S\n                [this._bbox[0], this._bbox[1]]\n            ]\n        ]\n    };\n};\n","var geojsonCoords = require('@mapbox/geojson-coords'),\n    traverse = require('traverse'),\n    extent = require('@mapbox/extent');\n\nvar geojsonTypesByDataAttributes = {\n    features: ['FeatureCollection'],\n    coordinates: ['Point', 'MultiPoint', 'LineString', 'MultiLineString', 'Polygon', 'MultiPolygon'],\n    geometry: ['Feature'],\n    geometries: ['GeometryCollection']\n}\n\nvar dataAttributes = Object.keys(geojsonTypesByDataAttributes);\n\nmodule.exports = function(_) {\n    return getExtent(_).bbox();\n};\n\nmodule.exports.polygon = function(_) {\n    return getExtent(_).polygon();\n};\n\nmodule.exports.bboxify = function(_) {\n    return traverse(_).map(function(value) {\n        if (!value) return ;\n\n        var isValid = dataAttributes.some(function(attribute){\n            if(value[attribute]) {\n                return geojsonTypesByDataAttributes[attribute].indexOf(value.type) !== -1;\n            }\n            return false;\n        });\n\n        if(isValid){\n            value.bbox = getExtent(value).bbox();\n            this.update(value);\n        }\n\n    });\n};\n\nfunction getExtent(_) {\n    var bbox = [Infinity, Infinity, -Infinity, -Infinity],\n        ext = extent(),\n        coords = geojsonCoords(_);\n    for (var i = 0; i < coords.length; i++) ext.include(coords[i]);\n    return ext;\n}\n","import extent from '@mapbox/geojson-extent';\nimport * as Constants from '../constants';\n\nconst {\n  LAT_MIN,\n  LAT_MAX,\n  LAT_RENDERED_MIN,\n  LAT_RENDERED_MAX,\n  LNG_MIN,\n  LNG_MAX\n} = Constants;\n\n// Ensure that we do not drag north-south far enough for\n// - any part of any feature to exceed the poles\n// - any feature to be completely lost in the space between the projection's\n//   edge and the poles, such that it couldn't be re-selected and moved back\nexport default function(geojsonFeatures, delta) {\n  // \"inner edge\" = a feature's latitude closest to the equator\n  let northInnerEdge = LAT_MIN;\n  let southInnerEdge = LAT_MAX;\n  // \"outer edge\" = a feature's latitude furthest from the equator\n  let northOuterEdge = LAT_MIN;\n  let southOuterEdge = LAT_MAX;\n\n  let westEdge = LNG_MAX;\n  let eastEdge = LNG_MIN;\n\n  geojsonFeatures.forEach((feature) => {\n    const bounds = extent(feature);\n    const featureSouthEdge = bounds[1];\n    const featureNorthEdge = bounds[3];\n    const featureWestEdge = bounds[0];\n    const featureEastEdge = bounds[2];\n    if (featureSouthEdge > northInnerEdge) northInnerEdge = featureSouthEdge;\n    if (featureNorthEdge < southInnerEdge) southInnerEdge = featureNorthEdge;\n    if (featureNorthEdge > northOuterEdge) northOuterEdge = featureNorthEdge;\n    if (featureSouthEdge < southOuterEdge) southOuterEdge = featureSouthEdge;\n    if (featureWestEdge < westEdge) westEdge = featureWestEdge;\n    if (featureEastEdge > eastEdge) eastEdge = featureEastEdge;\n  });\n\n\n  // These changes are not mutually exclusive: we might hit the inner\n  // edge but also have hit the outer edge and therefore need\n  // another readjustment\n  const constrainedDelta = delta;\n  if (northInnerEdge + constrainedDelta.lat > LAT_RENDERED_MAX) {\n    constrainedDelta.lat = LAT_RENDERED_MAX - northInnerEdge;\n  }\n  if (northOuterEdge + constrainedDelta.lat > LAT_MAX) {\n    constrainedDelta.lat = LAT_MAX - northOuterEdge;\n  }\n  if (southInnerEdge + constrainedDelta.lat < LAT_RENDERED_MIN) {\n    constrainedDelta.lat = LAT_RENDERED_MIN - southInnerEdge;\n  }\n  if (southOuterEdge + constrainedDelta.lat < LAT_MIN) {\n    constrainedDelta.lat = LAT_MIN - southOuterEdge;\n  }\n  if (westEdge + constrainedDelta.lng <= LNG_MIN) {\n    constrainedDelta.lng += Math.ceil(Math.abs(constrainedDelta.lng) / 360) * 360;\n  }\n  if (eastEdge + constrainedDelta.lng >= LNG_MAX) {\n    constrainedDelta.lng -= Math.ceil(Math.abs(constrainedDelta.lng) / 360) * 360;\n  }\n\n  return constrainedDelta;\n}\n","import constrainFeatureMovement from './constrain_feature_movement';\nimport * as Constants from '../constants';\n\nexport default function(features, delta) {\n  const constrainedDelta = constrainFeatureMovement(features.map(feature => feature.toGeoJSON()), delta);\n\n  features.forEach((feature) => {\n    const currentCoordinates = feature.getCoordinates();\n\n    const moveCoordinate = (coord) => {\n      const point = {\n        lng: coord[0] + constrainedDelta.lng,\n        lat: coord[1] + constrainedDelta.lat\n      };\n      return [point.lng, point.lat];\n    };\n    const moveRing = ring => ring.map(coord => moveCoordinate(coord));\n    const moveMultiPolygon = multi => multi.map(ring => moveRing(ring));\n\n    let nextCoordinates;\n    if (feature.type === Constants.geojsonTypes.POINT) {\n      nextCoordinates = moveCoordinate(currentCoordinates);\n    } else if (feature.type === Constants.geojsonTypes.LINE_STRING || feature.type === Constants.geojsonTypes.MULTI_POINT) {\n      nextCoordinates = currentCoordinates.map(moveCoordinate);\n    } else if (feature.type === Constants.geojsonTypes.POLYGON || feature.type === Constants.geojsonTypes.MULTI_LINE_STRING) {\n      nextCoordinates = currentCoordinates.map(moveRing);\n    } else if (feature.type === Constants.geojsonTypes.MULTI_POLYGON) {\n      nextCoordinates = currentCoordinates.map(moveMultiPolygon);\n    }\n\n    feature.incomingCoords(nextCoordinates);\n\n    if(feature.properties && feature.properties.isCustom){\n      // 自定义图形 更新点\n      feature.properties.coordinates.forEach(coordinate=>{\n        coordinate[0] += constrainedDelta.lng;\n        coordinate[1] += constrainedDelta.lat;\n      })\n    }\n  });\n}\n","import * as CommonSelectors from '../lib/common_selectors';\nimport mouseEventPoint from '../lib/mouse_event_point';\nimport createSupplementaryPoints from '../lib/create_supplementary_points';\nimport StringSet from '../lib/string_set';\nimport doubleClickZoom from '../lib/double_click_zoom';\nimport moveFeatures from '../lib/move_features';\nimport * as Constants from '../constants';\n\nconst SimpleSelect = {};\n\nSimpleSelect.onSetup = function (opts) {\n  // turn the opts into state.\n  const state = {\n    dragMoveLocation: null,\n    boxSelectStartLocation: null,\n    boxSelectElement: undefined,\n    boxSelecting: false,\n    canBoxSelect: false,\n    dragMoving: false,\n    canDragMove: false,\n    initiallySelectedFeatureIds: opts.featureIds || []\n  };\n\n  this.setSelected(state.initiallySelectedFeatureIds.filter(id => this.getFeature(id) !== undefined));\n  this.fireActionable();\n\n  this.setActionableState({\n    combineFeatures: true,\n    uncombineFeatures: true,\n    trash: true\n  });\n\n  return state;\n};\n\nSimpleSelect.fireUpdate = function () {\n  this.map.fire(Constants.events.UPDATE, {\n    action: Constants.updateActions.MOVE,\n    features: this.getSelected().map(f => f.toGeoJSON())\n  });\n};\n\nSimpleSelect.fireActionable = function () {\n  const selectedFeatures = this.getSelected();\n\n  const multiFeatures = selectedFeatures.filter(\n    feature => this.isInstanceOf('MultiFeature', feature)\n  );\n\n  let combineFeatures = false;\n\n  if (selectedFeatures.length > 1) {\n    combineFeatures = true;\n    const featureType = selectedFeatures[0].type.replace('Multi', '');\n    selectedFeatures.forEach((feature) => {\n      if (feature.type.replace('Multi', '') !== featureType) {\n        combineFeatures = false;\n      }\n    });\n  }\n\n  const uncombineFeatures = multiFeatures.length > 0;\n  const trash = selectedFeatures.length > 0;\n\n  this.setActionableState({\n    combineFeatures, uncombineFeatures, trash\n  });\n};\n\nSimpleSelect.getUniqueIds = function (allFeatures) {\n  if (!allFeatures.length) return [];\n  const ids = allFeatures.map(s => s.properties.id)\n    .filter(id => id !== undefined)\n    .reduce((memo, id) => {\n      memo.add(id);\n      return memo;\n    }, new StringSet());\n\n  return ids.values();\n};\n\nSimpleSelect.stopExtendedInteractions = function (state) {\n  if (state.boxSelectElement) {\n    if (state.boxSelectElement.parentNode) state.boxSelectElement.parentNode.removeChild(state.boxSelectElement);\n    state.boxSelectElement = null;\n  }\n\n  this.map.dragPan.enable();\n\n  state.boxSelecting = false;\n  state.canBoxSelect = false;\n  state.dragMoving = false;\n  state.canDragMove = false;\n};\n\nSimpleSelect.onStop = function () {\n  doubleClickZoom.enable(this);\n};\n\nSimpleSelect.onMouseMove = function (state) {\n  // On mousemove that is not a drag, stop extended interactions.\n  // This is useful if you drag off the canvas, release the button,\n  // then move the mouse back over the canvas --- we don't allow the\n  // interaction to continue then, but we do let it continue if you held\n  // the mouse button that whole time\n  this.stopExtendedInteractions(state);\n\n  // Skip render\n  return true;\n};\n\nSimpleSelect.onMouseOut = function (state) {\n  // As soon as you mouse leaves the canvas, update the feature\n  if (state.dragMoving) return this.fireUpdate();\n\n  // Skip render\n  return true;\n};\n\nSimpleSelect.onTap = SimpleSelect.onClick = function (state, e) {\n  // Click (with or without shift) on no feature\n  if (CommonSelectors.noTarget(e)) return this.clickAnywhere(state, e); // also tap\n  if (CommonSelectors.isOfMetaType(Constants.meta.VERTEX)(e)) return this.clickOnVertex(state, e); //tap\n  if (CommonSelectors.isFeature(e)) return this.clickOnFeature(state, e);\n};\n\nSimpleSelect.clickAnywhere = function (state) {\n  // Clear the re-render selection\n  const wasSelected = this.getSelectedIds();\n  if (wasSelected.length) {\n    this.clearSelectedFeatures();\n    wasSelected.forEach(id => this.doRender(id));\n  }\n  doubleClickZoom.enable(this);\n  this.stopExtendedInteractions(state);\n};\n\nSimpleSelect.clickOnVertex = function (state, e) {\n  // Enter direct select mode\n  this.changeMode(Constants.modes.DIRECT_SELECT, {\n    featureId: e.featureTarget.properties.parent,\n    coordPath: e.featureTarget.properties.coord_path,\n    startPos: e.lngLat\n  });\n  this.updateUIClasses({ mouse: Constants.cursors.MOVE });\n};\n\nSimpleSelect.startOnActiveFeature = function (state, e) {\n  // Stop any already-underway extended interactions\n  this.stopExtendedInteractions(state);\n\n  // Disable map.dragPan immediately so it can't start\n  this.map.dragPan.disable();\n\n  // Re-render it and enable drag move\n  this.doRender(e.featureTarget.properties.id);\n\n  // Set up the state for drag moving\n  state.canDragMove = true;\n  state.dragMoveLocation = e.lngLat;\n};\n\nSimpleSelect.clickOnFeature = function (state, e) {\n  if (e.featureTarget.properties.user_editable === false) {\n    this.map.fire('draw.unEditable',{id:e.featureTarget.properties.id})\n    return\n  }\n  // Stop everything\n  doubleClickZoom.disable(this);\n  this.stopExtendedInteractions(state);\n\n  const isShiftClick = CommonSelectors.isShiftDown(e);\n  const selectedFeatureIds = this.getSelectedIds();\n  const featureId = e.featureTarget.properties.id;\n  const isFeatureSelected = this.isSelected(featureId);\n\n  // Click (without shift) on any selected feature but a point\n  if (!isShiftClick && isFeatureSelected && this.getFeature(featureId).type !== Constants.geojsonTypes.POINT) {\n    // Enter direct select mode\n    return this.changeMode(Constants.modes.DIRECT_SELECT, {\n      featureId\n    });\n  }\n\n  // Shift-click on a selected feature\n  if (isFeatureSelected && isShiftClick) {\n    // Deselect it\n    this.deselect(featureId);\n    this.updateUIClasses({ mouse: Constants.cursors.POINTER });\n    if (selectedFeatureIds.length === 1) {\n      doubleClickZoom.enable(this);\n    }\n    // Shift-click on an unselected feature\n  } else if (!isFeatureSelected && isShiftClick) {\n    // Add it to the selection\n    this.select(featureId);\n    this.updateUIClasses({ mouse: Constants.cursors.MOVE });\n    // Click (without shift) on an unselected feature\n  } else if (!isFeatureSelected && !isShiftClick) {\n    // Make it the only selected feature\n    selectedFeatureIds.forEach(id => this.doRender(id));\n    this.setSelected(featureId);\n    this.updateUIClasses({ mouse: Constants.cursors.MOVE });\n  }\n\n  // No matter what, re-render the clicked feature\n  this.doRender(featureId);\n};\n\nSimpleSelect.onMouseDown = function (state, e) {\n  if (CommonSelectors.isActiveFeature(e)) return this.startOnActiveFeature(state, e);\n  if (this.drawConfig.boxSelect && CommonSelectors.isShiftMousedown(e)) return this.startBoxSelect(state, e);\n};\n\nSimpleSelect.startBoxSelect = function (state, e) {\n  this.stopExtendedInteractions(state);\n  this.map.dragPan.disable();\n  // Enable box select\n  state.boxSelectStartLocation = mouseEventPoint(e.originalEvent, this.map.getContainer());\n  state.canBoxSelect = true;\n};\n\nSimpleSelect.onTouchStart = function (state, e) {\n  if (CommonSelectors.isActiveFeature(e)) return this.startOnActiveFeature(state, e);\n};\n\nSimpleSelect.onDrag = function (state, e) {\n  if (state.canDragMove) return this.dragMove(state, e);\n  if (this.drawConfig.boxSelect && state.canBoxSelect) return this.whileBoxSelect(state, e);\n};\n\nSimpleSelect.whileBoxSelect = function (state, e) {\n  state.boxSelecting = true;\n  this.updateUIClasses({ mouse: Constants.cursors.ADD });\n\n  // Create the box node if it doesn't exist\n  if (!state.boxSelectElement) {\n    state.boxSelectElement = document.createElement('div');\n    state.boxSelectElement.classList.add(Constants.classes.BOX_SELECT);\n    this.map.getContainer().appendChild(state.boxSelectElement);\n  }\n\n  // Adjust the box node's width and xy position\n  const current = mouseEventPoint(e.originalEvent, this.map.getContainer());\n  const minX = Math.min(state.boxSelectStartLocation.x, current.x);\n  const maxX = Math.max(state.boxSelectStartLocation.x, current.x);\n  const minY = Math.min(state.boxSelectStartLocation.y, current.y);\n  const maxY = Math.max(state.boxSelectStartLocation.y, current.y);\n  const translateValue = `translate(${minX}px, ${minY}px)`;\n  state.boxSelectElement.style.transform = translateValue;\n  state.boxSelectElement.style.WebkitTransform = translateValue;\n  state.boxSelectElement.style.width = `${maxX - minX}px`;\n  state.boxSelectElement.style.height = `${maxY - minY}px`;\n};\n\nSimpleSelect.dragMove = function (state, e) {\n  // Dragging when drag move is enabled\n  state.dragMoving = true;\n  e.originalEvent.stopPropagation();\n\n  const delta = {\n    lng: e.lngLat.lng - state.dragMoveLocation.lng,\n    lat: e.lngLat.lat - state.dragMoveLocation.lat\n  };\n\n  moveFeatures(this.getSelected(), delta);\n\n  state.dragMoveLocation = e.lngLat;\n};\n\nSimpleSelect.onMouseUp = function (state, e) {\n  // End any extended interactions\n  if (state.dragMoving) {\n    this.fireUpdate();\n  } else if (state.boxSelecting) {\n    const bbox = [\n      state.boxSelectStartLocation,\n      mouseEventPoint(e.originalEvent, this.map.getContainer())\n    ];\n    const featuresInBox = this.featuresAt(null, bbox, 'click');\n    const idsToSelect = this.getUniqueIds(featuresInBox)\n      .filter(id => !this.isSelected(id));\n\n    if (idsToSelect.length) {\n      this.select(idsToSelect);\n      idsToSelect.forEach(id => this.doRender(id));\n      this.updateUIClasses({ mouse: Constants.cursors.MOVE });\n    }\n  }\n  this.stopExtendedInteractions(state);\n};\n\nSimpleSelect.toDisplayFeatures = function (state, geojson, display) {\n  geojson.properties.active = (this.isSelected(geojson.properties.id)) ?\n    Constants.activeStates.ACTIVE : Constants.activeStates.INACTIVE;\n  display(geojson);\n  this.fireActionable();\n  if (geojson.properties.active !== Constants.activeStates.ACTIVE ||\n    geojson.geometry.type === Constants.geojsonTypes.POINT) return;\n  createSupplementaryPoints(geojson).forEach(display);\n};\n\nSimpleSelect.onTrash = function () {\n  this.deleteFeature(this.getSelectedIds());\n  this.fireActionable();\n};\n\nSimpleSelect.onCombineFeatures = function () {\n  const selectedFeatures = this.getSelected();\n\n  if (selectedFeatures.length === 0 || selectedFeatures.length < 2) return;\n\n  const coordinates = [], featuresCombined = [];\n  const featureType = selectedFeatures[0].type.replace('Multi', '');\n\n  for (let i = 0; i < selectedFeatures.length; i++) {\n    const feature = selectedFeatures[i];\n\n    if (feature.type.replace('Multi', '') !== featureType) {\n      return;\n    }\n    if (feature.type.includes('Multi')) {\n      feature.getCoordinates().forEach((subcoords) => {\n        coordinates.push(subcoords);\n      });\n    } else {\n      coordinates.push(feature.getCoordinates());\n    }\n\n    featuresCombined.push(feature.toGeoJSON());\n  }\n\n  if (featuresCombined.length > 1) {\n    const multiFeature = this.newFeature({\n      type: Constants.geojsonTypes.FEATURE,\n      properties: featuresCombined[0].properties,\n      geometry: {\n        type: `Multi${featureType}`,\n        coordinates\n      }\n    });\n\n    this.addFeature(multiFeature);\n    this.deleteFeature(this.getSelectedIds(), { silent: true });\n    this.setSelected([multiFeature.id]);\n\n    this.map.fire(Constants.events.COMBINE_FEATURES, {\n      createdFeatures: [multiFeature.toGeoJSON()],\n      deletedFeatures: featuresCombined\n    });\n  }\n  this.fireActionable();\n};\n\nSimpleSelect.onUncombineFeatures = function () {\n  const selectedFeatures = this.getSelected();\n  if (selectedFeatures.length === 0) return;\n\n  const createdFeatures = [];\n  const featuresUncombined = [];\n\n  for (let i = 0; i < selectedFeatures.length; i++) {\n    const feature = selectedFeatures[i];\n\n    if (this.isInstanceOf('MultiFeature', feature)) {\n      feature.getFeatures().forEach((subFeature) => {\n        this.addFeature(subFeature);\n        subFeature.properties = feature.properties;\n        createdFeatures.push(subFeature.toGeoJSON());\n        this.select([subFeature.id]);\n      });\n      this.deleteFeature(feature.id, { silent: true });\n      featuresUncombined.push(feature.toGeoJSON());\n    }\n  }\n\n  if (createdFeatures.length > 1) {\n    this.map.fire(Constants.events.UNCOMBINE_FEATURES, {\n      createdFeatures,\n      deletedFeatures: featuresUncombined\n    });\n  }\n  this.fireActionable();\n};\n\nexport default SimpleSelect;\n","import { noTarget, isOfMetaType, isActiveFeature, isInactiveFeature, isShiftDown } from '../lib/common_selectors';\nimport createSupplementaryPoints from '../lib/create_supplementary_points';\nimport constrainFeatureMovement from '../lib/constrain_feature_movement';\nimport doubleClickZoom from '../lib/double_click_zoom';\nimport * as Constants from '../constants';\nimport moveFeatures from '../lib/move_features';\n\nimport * as algorithm from './custom/lib/algorithm/index'\n\n\nconst isVertex = isOfMetaType(Constants.meta.VERTEX);\nconst isMidpoint = isOfMetaType(Constants.meta.MIDPOINT);\n\nconst DirectSelect = {};\n\n// INTERNAL FUCNTIONS\n\nDirectSelect.fireUpdate = function () {\n  this.map.fire(Constants.events.UPDATE, {\n    action: Constants.updateActions.CHANGE_COORDINATES,\n    features: this.getSelected().map(f => f.toGeoJSON())\n  });\n};\n\nDirectSelect.fireActionable = function (state) {\n  this.setActionableState({\n    combineFeatures: false,\n    uncombineFeatures: false,\n    trash: state.selectedCoordPaths.length > 0\n  });\n};\n\nDirectSelect.startDragging = function (state, e) {\n  this.map.dragPan.disable();\n  state.canDragMove = true;\n  state.dragMoveLocation = e.lngLat;\n};\n\nDirectSelect.stopDragging = function (state) {\n  this.map.dragPan.enable();\n  state.dragMoving = false;\n  state.canDragMove = false;\n  state.dragMoveLocation = null;\n};\n\nDirectSelect.onVertex = function (state, e) {\n  this.startDragging(state, e);\n  const about = e.featureTarget.properties;\n  const selectedIndex = state.selectedCoordPaths.indexOf(about.coord_path);\n  if (!isShiftDown(e) && selectedIndex === -1) {\n    state.selectedCoordPaths = [about.coord_path];\n  } else if (isShiftDown(e) && selectedIndex === -1) {\n    state.selectedCoordPaths.push(about.coord_path);\n  }\n\n  const selectedCoordinates = this.pathsToCoordinates(state.featureId, state.selectedCoordPaths);\n  this.setSelectedCoordinates(selectedCoordinates);\n};\n\nDirectSelect.onMidpoint = function (state, e) {\n  this.startDragging(state, e);\n  const about = e.featureTarget.properties;\n  state.feature.addCoordinate(about.coord_path, about.lng, about.lat);\n  this.fireUpdate();\n  state.selectedCoordPaths = [about.coord_path];\n};\n\nDirectSelect.pathsToCoordinates = function (featureId, paths) {\n  return paths.map(coord_path => ({ feature_id: featureId, coord_path }));\n};\n\nDirectSelect.onFeature = function (state, e) {\n  if (state.selectedCoordPaths.length === 0) this.startDragging(state, e);\n  else this.stopDragging(state);\n};\n\nDirectSelect.dragFeature = function (state, e, delta) {\n  moveFeatures(this.getSelected(), delta);\n  state.dragMoveLocation = e.lngLat;\n};\n\nDirectSelect.dragVertex = function (state, e, delta) {\n  if (state.feature.properties.isCustom) {\n    // 自定义图形\n    const { coordinates, type } = state.feature.properties\n    coordinates[state.selectedCoordPaths[0]] = [e.lngLat.lng, e.lngLat.lat]\n    state.feature.setCoordinates(algorithm[`${type}_algorithm`](coordinates))\n    return\n  }\n  const selectedCoords = state.selectedCoordPaths.map(coord_path => state.feature.getCoordinate(coord_path));\n  const selectedCoordPoints = selectedCoords.map(coords => ({\n    type: Constants.geojsonTypes.FEATURE,\n    properties: {},\n    geometry: {\n      type: Constants.geojsonTypes.POINT,\n      coordinates: coords\n    }\n  }));\n\n  const constrainedDelta = constrainFeatureMovement(selectedCoordPoints, delta);\n  for (let i = 0; i < selectedCoords.length; i++) {\n    const coord = selectedCoords[i];\n    state.feature.updateCoordinate(state.selectedCoordPaths[i], coord[0] + constrainedDelta.lng, coord[1] + constrainedDelta.lat);\n  }\n};\n\nDirectSelect.clickNoTarget = function () {\n  this.changeMode(Constants.modes.SIMPLE_SELECT);\n};\n\nDirectSelect.clickInactive = function () {\n  this.changeMode(Constants.modes.SIMPLE_SELECT);\n};\n\nDirectSelect.clickActiveFeature = function (state) {\n  state.selectedCoordPaths = [];\n  this.clearSelectedCoordinates();\n  state.feature.changed();\n};\n\n// EXTERNAL FUNCTIONS\n\nDirectSelect.onSetup = function (opts) {\n  const featureId = opts.featureId;\n  const feature = this.getFeature(featureId);\n\n  if (!feature) {\n    throw new Error('You must provide a featureId to enter direct_select mode');\n  }\n\n  if (feature.type === Constants.geojsonTypes.POINT) {\n    throw new TypeError('direct_select mode doesn\\'t handle point features');\n  }\n\n  const state = {\n    featureId,\n    feature,\n    dragMoveLocation: opts.startPos || null,\n    dragMoving: false,\n    canDragMove: false,\n    selectedCoordPaths: opts.coordPath ? [opts.coordPath] : []\n  };\n\n  this.setSelectedCoordinates(this.pathsToCoordinates(featureId, state.selectedCoordPaths));\n  this.setSelected(featureId);\n  doubleClickZoom.disable(this);\n\n  this.setActionableState({\n    trash: true\n  });\n\n  return state;\n};\n\nDirectSelect.onStop = function () {\n  doubleClickZoom.enable(this);\n  this.clearSelectedCoordinates();\n};\n\nDirectSelect.toDisplayFeatures = function (state, geojson, push) {\n  if (state.featureId === geojson.properties.id) {\n    geojson.properties.active = Constants.activeStates.ACTIVE;\n    push(geojson);\n    createSupplementaryPoints(geojson, {\n      map: this.map,\n      midpoints: true,\n      selectedPaths: state.selectedCoordPaths\n    }).forEach(push);\n  } else {\n    geojson.properties.active = Constants.activeStates.INACTIVE;\n    push(geojson);\n  }\n  this.fireActionable(state);\n};\n\nDirectSelect.onTrash = function (state) {\n  // Uses number-aware sorting to make sure '9' < '10'. Comparison is reversed because we want them\n  // in reverse order so that we can remove by index safely.\n  state.selectedCoordPaths\n    .sort((a, b) => b.localeCompare(a, 'en', { numeric: true }))\n    .forEach(id => state.feature.removeCoordinate(id));\n  this.fireUpdate();\n  state.selectedCoordPaths = [];\n  this.clearSelectedCoordinates();\n  this.fireActionable(state);\n  if (state.feature.isValid() === false) {\n    this.deleteFeature([state.featureId]);\n    this.changeMode(Constants.modes.SIMPLE_SELECT, {});\n  }\n};\n\nDirectSelect.onMouseMove = function (state, e) {\n  // On mousemove that is not a drag, stop vertex movement.\n  const isFeature = isActiveFeature(e);\n  const onVertex = isVertex(e);\n  const noCoords = state.selectedCoordPaths.length === 0;\n  if (isFeature && noCoords) this.updateUIClasses({ mouse: Constants.cursors.MOVE });\n  else if (onVertex && !noCoords) this.updateUIClasses({ mouse: Constants.cursors.MOVE });\n  else this.updateUIClasses({ mouse: Constants.cursors.NONE });\n  this.stopDragging(state);\n\n  // Skip render\n  return true;\n};\n\nDirectSelect.onMouseOut = function (state) {\n  // As soon as you mouse leaves the canvas, update the feature\n  if (state.dragMoving) this.fireUpdate();\n\n  // Skip render\n  return true;\n};\n\nDirectSelect.onTouchStart = DirectSelect.onMouseDown = function (state, e) {\n  if (isVertex(e)) return this.onVertex(state, e);\n  if (isActiveFeature(e)) return this.onFeature(state, e);\n  if (isMidpoint(e)) return this.onMidpoint(state, e);\n};\n\nDirectSelect.onDrag = function (state, e) {\n  if (state.canDragMove !== true) return;\n  state.dragMoving = true;\n  e.originalEvent.stopPropagation();\n\n  const delta = {\n    lng: e.lngLat.lng - state.dragMoveLocation.lng,\n    lat: e.lngLat.lat - state.dragMoveLocation.lat\n  };\n  if (state.selectedCoordPaths.length > 0) this.dragVertex(state, e, delta);\n  else this.dragFeature(state, e, delta);\n\n  state.dragMoveLocation = e.lngLat;\n};\n\nDirectSelect.onClick = function (state, e) {\n  if (noTarget(e)) return this.clickNoTarget(state, e);\n  if (isActiveFeature(e)) return this.clickActiveFeature(state, e);\n  if (isInactiveFeature(e)) return this.clickInactive(state, e);\n  this.stopDragging(state);\n};\n\nDirectSelect.onTap = function (state, e) {\n  if (noTarget(e)) return this.clickNoTarget(state, e);\n  if (isActiveFeature(e)) return this.clickActiveFeature(state, e);\n  if (isInactiveFeature(e)) return this.clickInactive(state, e);\n};\n\nDirectSelect.onTouchEnd = DirectSelect.onMouseUp = function (state) {\n  if (state.dragMoving) {\n    this.fireUpdate();\n  }\n  this.stopDragging(state);\n};\n\nexport default DirectSelect;\n\n","import * as CommonSelectors from '../lib/common_selectors';\nimport * as Constants from '../constants';\n\nconst DrawPoint = {};\n\nDrawPoint.onSetup = function() {\n  const point = this.newFeature({\n    type: Constants.geojsonTypes.FEATURE,\n    properties: {},\n    geometry: {\n      type: Constants.geojsonTypes.POINT,\n      coordinates: []\n    }\n  });\n\n  this.addFeature(point);\n\n  this.clearSelectedFeatures();\n  this.updateUIClasses({ mouse: Constants.cursors.ADD });\n  this.activateUIButton(Constants.types.POINT);\n\n  this.setActionableState({\n    trash: true\n  });\n\n  return { point };\n};\n\nDrawPoint.stopDrawingAndRemove = function(state) {\n  this.deleteFeature([state.point.id], { silent: true });\n  this.changeMode(Constants.modes.SIMPLE_SELECT);\n};\n\nDrawPoint.onTap = DrawPoint.onClick = function(state, e) {\n  this.updateUIClasses({ mouse: Constants.cursors.MOVE });\n  state.point.updateCoordinate('', e.lngLat.lng, e.lngLat.lat);\n  this.map.fire(Constants.events.CREATE, {\n    features: [state.point.toGeoJSON()]\n  });\n  this.changeMode(Constants.modes.SIMPLE_SELECT, { featureIds: [state.point.id] });\n};\n\nDrawPoint.onStop = function(state) {\n  this.activateUIButton();\n  if (!state.point.getCoordinate().length) {\n    this.deleteFeature([state.point.id], { silent: true });\n  }\n};\n\nDrawPoint.toDisplayFeatures = function(state, geojson, display) {\n  // Never render the point we're drawing\n  const isActivePoint = geojson.properties.id === state.point.id;\n  geojson.properties.active = (isActivePoint) ? Constants.activeStates.ACTIVE : Constants.activeStates.INACTIVE;\n  if (!isActivePoint) return display(geojson);\n};\n\nDrawPoint.onTrash = DrawPoint.stopDrawingAndRemove;\n\nDrawPoint.onKeyUp = function(state, e) {\n  if (CommonSelectors.isEscapeKey(e) || CommonSelectors.isEnterKey(e)) {\n    return this.stopDrawingAndRemove(state, e);\n  }\n};\n\nexport default DrawPoint;\n","function isEventAtCoordinates(event, coordinates) {\n  if (!event.lngLat) return false;\n  return event.lngLat.lng === coordinates[0] && event.lngLat.lat === coordinates[1];\n}\n\nexport default isEventAtCoordinates;\n","import * as CommonSelectors from '../lib/common_selectors';\nimport doubleClickZoom from '../lib/double_click_zoom';\nimport * as Constants from '../constants';\nimport isEventAtCoordinates from '../lib/is_event_at_coordinates';\nimport createVertex from '../lib/create_vertex';\n\nconst DrawPolygon = {};\n\nDrawPolygon.onSetup = function () {\n  const polygon = this.newFeature({\n    type: Constants.geojsonTypes.FEATURE,\n    properties: {\n      name: '多边形',\n      'fill-color': '#54A6F2',\n      'line-color': '#54A6F2',\n      opacity: 0.1,\n      visible: true,\n      description: \"\",\n      'properties-dictionary': [\n        { key: 'name', label: '名称', type: 'string' },\n        { key: 'fill-color', label: '填充色', type: 'color' },\n        { key: 'line-color', label: '边框色', type: 'color' },\n        { key: 'opacity', label: '透明度', type: 'number', step: 0.1, min: 0, max: 1 },\n        { key: 'description', label: '说明', type: 'textArea' }\n      ]\n    },\n    geometry: {\n      type: Constants.geojsonTypes.POLYGON,\n      coordinates: [[]]\n    }\n  });\n\n  this.addFeature(polygon);\n\n  this.clearSelectedFeatures();\n  doubleClickZoom.disable(this);\n  this.updateUIClasses({ mouse: Constants.cursors.ADD });\n  this.activateUIButton(Constants.types.POLYGON);\n  this.setActionableState({\n    trash: true\n  });\n\n  return {\n    polygon,\n    currentVertexPosition: 0\n  };\n};\n\nDrawPolygon.clickAnywhere = function (state, e) {\n  if (state.currentVertexPosition > 0 && isEventAtCoordinates(e, state.polygon.coordinates[0][state.currentVertexPosition - 1])) {\n    return this.changeMode(Constants.modes.SIMPLE_SELECT, { featureIds: [state.polygon.id] });\n  }\n  this.updateUIClasses({ mouse: Constants.cursors.ADD });\n  state.polygon.updateCoordinate(`0.${state.currentVertexPosition}`, e.lngLat.lng, e.lngLat.lat);\n  state.currentVertexPosition++;\n  state.polygon.updateCoordinate(`0.${state.currentVertexPosition}`, e.lngLat.lng, e.lngLat.lat);\n};\n\nDrawPolygon.clickOnVertex = function (state) {\n  return this.changeMode(Constants.modes.SIMPLE_SELECT, { featureIds: [state.polygon.id] });\n};\n\nDrawPolygon.onMouseMove = function (state, e) {\n  state.polygon.updateCoordinate(`0.${state.currentVertexPosition}`, e.lngLat.lng, e.lngLat.lat);\n  if (CommonSelectors.isVertex(e)) {\n    this.updateUIClasses({ mouse: Constants.cursors.POINTER });\n  }\n};\n\nDrawPolygon.onTap = DrawPolygon.onClick = function (state, e) {\n  if (CommonSelectors.isVertex(e)) return this.clickOnVertex(state, e);\n  return this.clickAnywhere(state, e);\n};\n\nDrawPolygon.onKeyUp = function (state, e) {\n  if (CommonSelectors.isEscapeKey(e)) {\n    this.deleteFeature([state.polygon.id], { silent: true });\n    this.changeMode(Constants.modes.SIMPLE_SELECT);\n  } else if (CommonSelectors.isEnterKey(e)) {\n    this.changeMode(Constants.modes.SIMPLE_SELECT, { featureIds: [state.polygon.id] });\n  }\n};\n\nDrawPolygon.onStop = function (state) {\n  this.updateUIClasses({ mouse: Constants.cursors.NONE });\n  doubleClickZoom.enable(this);\n  this.activateUIButton();\n\n  // check to see if we've deleted this feature\n  if (this.getFeature(state.polygon.id) === undefined) return;\n\n  //remove last added coordinate\n  state.polygon.removeCoordinate(`0.${state.currentVertexPosition}`);\n  if (state.polygon.isValid()) {\n    this.map.fire(Constants.events.CREATE, {\n      features: [state.polygon.toGeoJSON()]\n    });\n  } else {\n    this.deleteFeature([state.polygon.id], { silent: true });\n    this.changeMode(Constants.modes.SIMPLE_SELECT, {}, { silent: true });\n  }\n};\n\nDrawPolygon.toDisplayFeatures = function (state, geojson, display) {\n  const isActivePolygon = geojson.properties.id === state.polygon.id;\n  geojson.properties.active = (isActivePolygon) ? Constants.activeStates.ACTIVE : Constants.activeStates.INACTIVE;\n  if (!isActivePolygon) return display(geojson);\n\n  // Don't render a polygon until it has two positions\n  // (and a 3rd which is just the first repeated)\n  if (geojson.geometry.coordinates.length === 0) return;\n\n  const coordinateCount = geojson.geometry.coordinates[0].length;\n  // 2 coordinates after selecting a draw type\n  // 3 after creating the first point\n  if (coordinateCount < 3) {\n    return;\n  }\n  geojson.properties.meta = Constants.meta.FEATURE;\n  display(createVertex(state.polygon.id, geojson.geometry.coordinates[0][0], '0.0', false));\n  if (coordinateCount > 3) {\n    // Add a start position marker to the map, clicking on this will finish the feature\n    // This should only be shown when we're in a valid spot\n    const endPos = geojson.geometry.coordinates[0].length - 3;\n    display(createVertex(state.polygon.id, geojson.geometry.coordinates[0][endPos], `0.${endPos}`, false));\n  }\n  if (coordinateCount <= 4) {\n    // If we've only drawn two positions (plus the closer),\n    // make a LineString instead of a Polygon\n    const lineCoordinates = [\n      [geojson.geometry.coordinates[0][0][0], geojson.geometry.coordinates[0][0][1]], [geojson.geometry.coordinates[0][1][0], geojson.geometry.coordinates[0][1][1]]\n    ];\n    // create an initial vertex so that we can track the first point on mobile devices\n    display({\n      type: Constants.geojsonTypes.FEATURE,\n      properties: geojson.properties,\n      geometry: {\n        coordinates: lineCoordinates,\n        type: Constants.geojsonTypes.LINE_STRING\n      }\n    });\n    if (coordinateCount === 3) {\n      return;\n    }\n  }\n  // render the Polygon\n  return display(geojson);\n};\n\nDrawPolygon.onTrash = function (state) {\n  this.deleteFeature([state.polygon.id], { silent: true });\n  this.changeMode(Constants.modes.SIMPLE_SELECT);\n};\n\nexport default DrawPolygon;\n","import * as CommonSelectors from '../lib/common_selectors';\nimport isEventAtCoordinates from '../lib/is_event_at_coordinates';\nimport doubleClickZoom from '../lib/double_click_zoom';\nimport * as Constants from '../constants';\nimport createVertex from '../lib/create_vertex';\n\nconst DrawLineString = {};\n\nDrawLineString.onSetup = function (opts) {\n  opts = opts || {};\n  const featureId = opts.featureId;\n\n  let line, currentVertexPosition;\n  let direction = 'forward';\n  if (featureId) {\n    line = this.getFeature(featureId);\n    if (!line) {\n      throw new Error('Could not find a feature with the provided featureId');\n    }\n    let from = opts.from;\n    if (from && from.type === 'Feature' && from.geometry && from.geometry.type === 'Point') {\n      from = from.geometry;\n    }\n    if (from && from.type === 'Point' && from.coordinates && from.coordinates.length === 2) {\n      from = from.coordinates;\n    }\n    if (!from || !Array.isArray(from)) {\n      throw new Error('Please use the `from` property to indicate which point to continue the line from');\n    }\n    const lastCoord = line.coordinates.length - 1;\n    if (line.coordinates[lastCoord][0] === from[0] && line.coordinates[lastCoord][1] === from[1]) {\n      currentVertexPosition = lastCoord + 1;\n      // add one new coordinate to continue from\n      line.addCoordinate(currentVertexPosition, ...line.coordinates[lastCoord]);\n    } else if (line.coordinates[0][0] === from[0] && line.coordinates[0][1] === from[1]) {\n      direction = 'backwards';\n      currentVertexPosition = 0;\n      // add one new coordinate to continue from\n      line.addCoordinate(currentVertexPosition, ...line.coordinates[0]);\n    } else {\n      throw new Error('`from` should match the point at either the start or the end of the provided LineString');\n    }\n  } else {\n    line = this.newFeature({\n      type: Constants.geojsonTypes.FEATURE,\n      properties: {\n        name: '折线',\n        'line-color': opts.lineColor || '#54A6F2',\n        'line-width':  opts.lineWidth || 2,\n        opacity: opts.opacity || 1,\n        visible: true,\n        description: \"\",\n        'properties-dictionary': [\n          { key: 'name', label: '名称', type: 'string' },\n          { key: 'line-color', label: '颜色', type: 'color' },\n          { key: 'line-width', label: '宽度', type: 'number', step: 0.1, min: 0 },\n          { key: 'opacity', label: '透明度', type: 'number', step: 0.1, min: 0, max: 1 },\n          { key: 'description', label: '说明', type: 'textArea' }\n        ]\n      },\n      geometry: {\n        type: Constants.geojsonTypes.LINE_STRING,\n        coordinates: []\n      }\n    });\n    currentVertexPosition = 0;\n    this.addFeature(line);\n  }\n\n  this.clearSelectedFeatures();\n  doubleClickZoom.disable(this);\n  this.updateUIClasses({ mouse: Constants.cursors.ADD });\n  this.activateUIButton(Constants.types.LINE);\n  this.setActionableState({\n    trash: true\n  });\n\n  return {\n    line,\n    currentVertexPosition,\n    direction\n  };\n};\n\nDrawLineString.clickAnywhere = function (state, e) {\n  if (state.currentVertexPosition > 0 && isEventAtCoordinates(e, state.line.coordinates[state.currentVertexPosition - 1]) ||\n    state.direction === 'backwards' && isEventAtCoordinates(e, state.line.coordinates[state.currentVertexPosition + 1])) {\n    return this.changeMode(Constants.modes.SIMPLE_SELECT, { featureIds: [state.line.id] });\n  }\n  this.updateUIClasses({ mouse: Constants.cursors.ADD });\n  state.line.updateCoordinate(state.currentVertexPosition, e.lngLat.lng, e.lngLat.lat);\n  if (state.direction === 'forward') {\n    state.currentVertexPosition++;\n    state.line.updateCoordinate(state.currentVertexPosition, e.lngLat.lng, e.lngLat.lat);\n  } else {\n    state.line.addCoordinate(0, e.lngLat.lng, e.lngLat.lat);\n  }\n};\n\nDrawLineString.clickOnVertex = function (state) {\n  return this.changeMode(Constants.modes.SIMPLE_SELECT, { featureIds: [state.line.id] });\n};\n\nDrawLineString.onMouseMove = function (state, e) {\n  state.line.updateCoordinate(state.currentVertexPosition, e.lngLat.lng, e.lngLat.lat);\n  if (CommonSelectors.isVertex(e)) {\n    this.updateUIClasses({ mouse: Constants.cursors.POINTER });\n  }\n};\n\nDrawLineString.onTap = DrawLineString.onClick = function (state, e) {\n  if (CommonSelectors.isVertex(e)) return this.clickOnVertex(state, e);\n  this.clickAnywhere(state, e);\n};\n\nDrawLineString.onKeyUp = function (state, e) {\n  if (CommonSelectors.isEnterKey(e)) {\n    this.changeMode(Constants.modes.SIMPLE_SELECT, { featureIds: [state.line.id] });\n  } else if (CommonSelectors.isEscapeKey(e)) {\n    this.deleteFeature([state.line.id], { silent: true });\n    this.changeMode(Constants.modes.SIMPLE_SELECT);\n  }\n};\n\nDrawLineString.onStop = function (state) {\n  doubleClickZoom.enable(this);\n  this.activateUIButton();\n\n  // check to see if we've deleted this feature\n  if (this.getFeature(state.line.id) === undefined) return;\n\n  //remove last added coordinate\n  state.line.removeCoordinate(`${state.currentVertexPosition}`);\n  if (state.line.isValid()) {\n    this.map.fire(Constants.events.CREATE, {\n      features: [state.line.toGeoJSON()]\n    });\n  } else {\n    this.deleteFeature([state.line.id], { silent: true });\n    this.changeMode(Constants.modes.SIMPLE_SELECT, {}, { silent: true });\n  }\n};\n\nDrawLineString.onTrash = function (state) {\n  this.deleteFeature([state.line.id], { silent: true });\n  this.changeMode(Constants.modes.SIMPLE_SELECT);\n};\n\nDrawLineString.toDisplayFeatures = function (state, geojson, display) {\n  const isActiveLine = geojson.properties.id === state.line.id;\n  geojson.properties.active = (isActiveLine) ? Constants.activeStates.ACTIVE : Constants.activeStates.INACTIVE;\n  if (!isActiveLine) return display(geojson);\n  // Only render the line if it has at least one real coordinate\n  if (geojson.geometry.coordinates.length < 2) return;\n  geojson.properties.meta = Constants.meta.FEATURE;\n  display(createVertex(\n    state.line.id,\n    geojson.geometry.coordinates[state.direction === 'forward' ? geojson.geometry.coordinates.length - 2 : 1],\n    `${state.direction === 'forward' ? geojson.geometry.coordinates.length - 2 : 1}`,\n    false\n  ));\n\n  display(geojson);\n};\n\nexport default DrawLineString;\n","const StaticMode = {};\n\nStaticMode.onSetup = function() {\n  this.setActionableState(); // default actionable state is false for all actions\n  return {};\n};\n\nStaticMode.toDisplayFeatures = function(state, geojson, display) {\n  display(geojson);\n};\n\nexport default StaticMode;","import draw_polygon from '../draw_polygon'\nimport * as algorithm from './lib/algorithm/index'\nimport * as Constants from '../../constants';\nimport doubleClickZoom from '../../lib/double_click_zoom'\nimport createVertex from '../../lib/create_vertex';\n\nconst DrawPolygonShape = { ...draw_polygon }\n\nDrawPolygonShape.onSetup = function () {\n    const polygon = this.newFeature({\n        type: Constants.geojsonTypes.FEATURE,\n        properties: {\n            name: this.name,\n            isCustom: true,\n            type: this.type,\n            coordinates: [],\n            'fill-color': '#54A6F2',\n            'line-color': '#54A6F2',\n            opacity: 0.1,\n            visible: true,\n            description: \"\",\n            'properties-dictionary': [\n                { key: 'name', label: '名称', type: 'string' },\n                { key: 'fill-color', label: '填充色', type: 'color' },\n                { key: 'line-color', label: '边框色', type: 'color' },\n                { key: 'opacity', label: '透明度', type: 'number', step: 0.1, min: 0, max: 1 },\n                { key: 'description', label: '说明', type: 'textArea' }\n            ]\n        },\n        geometry: {\n            type: Constants.geojsonTypes.POLYGON,\n            coordinates: []\n        }\n    });\n\n    this.addFeature(polygon);\n\n    this.clearSelectedFeatures();\n    doubleClickZoom.disable(this);\n    this.updateUIClasses({ mouse: Constants.cursors.ADD });\n    this.activateUIButton(Constants.types.POLYGON);\n    this.setActionableState({\n        trash: true\n    });\n\n    return {\n        polygon,\n        algorithmName: this.algorithmName,\n        fixedPointCount: this.fixedPointCount,\n        currentVertexPosition: 0,\n    };\n}\n\nDrawPolygonShape.clickAnywhere = function (state, e) {\n    state.currentVertexPosition++;\n    state.polygon.properties.coordinates.push([e.lngLat.lng, e.lngLat.lat]);\n    state.polygon.setCoordinates(algorithm[state.algorithmName](state.polygon.properties.coordinates));\n    if (state.currentVertexPosition >= state.fixedPointCount) {\n        // 结束绘制\n        this.changeMode(Constants.modes.SIMPLE_SELECT, { featureIds: [state.polygon.id] }, { silent: false });\n    }\n}\n\nDrawPolygonShape.onMouseMove = function (state, e) {\n    if (state.currentVertexPosition > 0) {\n        state.polygon.setCoordinates(algorithm[state.algorithmName]([].concat(state.polygon.properties.coordinates, [[e.lngLat.lng, e.lngLat.lat]])))\n    }\n}\n\nDrawPolygonShape.toDisplayFeatures = function (state, geojson, display) {\n    const isActivePolygon = geojson.properties.id === state.polygon.id;\n    geojson.properties.active = (isActivePolygon) ? Constants.activeStates.ACTIVE : Constants.activeStates.INACTIVE;\n    if (!isActivePolygon) return display(geojson);\n    if (geojson.geometry.coordinates.length === 0) return;\n\n    if (state.fixedPointCount > 2 && geojson.geometry.coordinates[0].length < 4) {\n        const lineCoordinates = geojson.geometry.coordinates[0].slice(0, 2);\n        display({\n            type: Constants.geojsonTypes.FEATURE,\n            properties: geojson.properties,\n            geometry: {\n                coordinates: lineCoordinates,\n                type: Constants.geojsonTypes.LINE_STRING\n            }\n        });\n    }\n\n    geojson.properties.user_coordinates.forEach((coordinate, index) => {\n        display(createVertex(state.polygon.id, coordinate, `0.${index}`, false));\n    })\n\n    // render the Polygon\n    return display(geojson);\n}\n\nDrawPolygonShape.onStop = function (state) {\n    this.updateUIClasses({ mouse: Constants.cursors.NONE });\n    doubleClickZoom.enable(this);\n    this.activateUIButton();\n\n    // check to see if we've deleted this feature\n    if (this.getFeature(state.polygon.id) === undefined) return;\n    //remove last added coordinate\n    //state.polygon.removeCoordinate(`0.${state.currentVertexPosition}`);\n    if (state.polygon.isValid()) {\n        this.map.fire(Constants.events.CREATE, {\n            features: [state.polygon.toGeoJSON(true)]\n        });\n    } else {\n        this.deleteFeature([state.polygon.id], { silent: true });\n        this.changeMode(Constants.modes.SIMPLE_SELECT, {}, { silent: true });\n    }\n};\n\n// export default DrawPolygonShape;\n\n/**\n * 多个点的polygon图形，双击结束\n * @param {*} opts \n * @param {String} opts.type 类型 用draw_${type}调用\n * @param {String} opts.name 名字 用于编辑面板上展示\n * @param {Number} opts.fixedPointCount 骨骼点数量\n * @returns \n */\nconst polygonShapeFractory = function (opts) {\n    const target = { ...DrawPolygonShape }\n    target.name = opts.name\n    target.type = opts.type\n    target.algorithmName = `${opts.type}_algorithm`\n    target.fixedPointCount = opts.fixedPointCount\n    return target\n}\n\nexport default polygonShapeFractory;","import draw_polyline from '../draw_line_string'\nimport * as algorithm from './lib/algorithm/index'\nimport * as Constants from '../../constants';\nimport doubleClickZoom from '../../lib/double_click_zoom'\nimport createVertex from '../../lib/create_vertex';\n\nconst DrawPolylineShape = { ...draw_polyline }\n\nDrawPolylineShape.onSetup = function () {\n    const line = this.newFeature({\n        type: Constants.geojsonTypes.FEATURE,\n        properties: {\n            name: this.name,\n            isCustom: true,\n            type: this.type,\n            coordinates: [],\n            'line-color': '#54A6F2',\n            'line-width': 2,\n            opacity: 1,\n            visible: true,\n            description: \"\",\n            'properties-dictionary': [\n                { key: 'name', label: '名称', type: 'string' },\n                { key: 'line-color', label: '颜色', type: 'color' },\n                { key: 'line-width', label: '宽度', type: 'number', step: 0.1, min: 0 },\n                { key: 'opacity', label: '透明度', type: 'number', step: 0.1, min: 0, max: 1 },\n                { key: 'description', label: '说明', type: 'textArea' }\n            ]\n        },\n        geometry: {\n            type: Constants.geojsonTypes.LINE_STRING,\n            coordinates: []\n        }\n    });\n\n    this.addFeature(line);\n\n    this.clearSelectedFeatures();\n    doubleClickZoom.disable(this);\n    this.updateUIClasses({ mouse: Constants.cursors.ADD });\n    this.activateUIButton(Constants.types.POLYGON);\n    this.setActionableState({\n        trash: true\n    });\n\n    return {\n        line,\n        algorithmName: this.algorithmName,\n        fixedPointCount: this.fixedPointCount,\n        currentVertexPosition: 0,\n    };\n}\n\nDrawPolylineShape.clickAnywhere = function (state, e) {\n    state.currentVertexPosition++;\n    state.line.properties.coordinates.push([e.lngLat.lng, e.lngLat.lat]);\n    state.line.setCoordinates(algorithm[state.algorithmName](state.line.properties.coordinates));\n    if (state.currentVertexPosition >= state.fixedPointCount) {\n        // 结束绘制\n        this.changeMode(Constants.modes.SIMPLE_SELECT, { featureIds: [state.line.id] }, { silent: false });\n    }\n}\n\nDrawPolylineShape.onMouseMove = function (state, e) {\n    if (state.currentVertexPosition > 0) {\n        state.line.setCoordinates(algorithm[state.algorithmName]([].concat(state.line.properties.coordinates, [[e.lngLat.lng, e.lngLat.lat]])))\n    }\n}\n\nDrawPolylineShape.toDisplayFeatures = function (state, geojson, display) {\n    const isActiveLine = geojson.properties.id === state.line.id;\n    geojson.properties.active = (isActiveLine) ? Constants.activeStates.ACTIVE : Constants.activeStates.INACTIVE;\n    if (!isActiveLine) return display(geojson);\n    // Only render the line if it has at least one real coordinate\n    if (geojson.geometry.coordinates.length < 2) return;\n    geojson.properties.meta = Constants.meta.FEATURE;\n\n    geojson.properties.user_coordinates.forEach((coordinate, index) => {\n        display(createVertex(state.line.id, coordinate, `0.${index}`, false));\n    })\n\n    return display(geojson);\n}\n\nDrawPolylineShape.onStop = function (state) {\n    this.updateUIClasses({ mouse: Constants.cursors.NONE });\n    doubleClickZoom.enable(this);\n    this.activateUIButton();\n\n    // check to see if we've deleted this feature\n    if (this.getFeature(state.line.id) === undefined) return;\n    //remove last added coordinate\n    //state.line.removeCoordinate(`0.${state.currentVertexPosition}`);\n    if (state.line.isValid()) {\n        this.map.fire(Constants.events.CREATE, {\n            features: [state.line.toGeoJSON(true)]\n        });\n    } else {\n        this.deleteFeature([state.line.id], { silent: true });\n        this.changeMode(Constants.modes.SIMPLE_SELECT, {}, { silent: true });\n    }\n};\n\n// export default DrawPolylineShape;\n\n/**\n * 多个点的polygon图形，双击结束\n * @param {*} opts \n * @param {String} opts.type 类型 用draw_${type}调用\n * @param {String} opts.name 名字 用于编辑面板上展示\n * @param {Number} opts.fixedPointCount 骨骼点数量\n * @returns \n */\nconst polylineShapeFractory = function (opts) {\n    const target = { ...DrawPolylineShape }\n    target.name = opts.name\n    target.type = opts.type\n    target.algorithmName = `${opts.type}_algorithm`\n    target.fixedPointCount = opts.fixedPointCount\n    return target\n}\n\nexport default polylineShapeFractory;","import draw_point from '../draw_point'\nimport * as Constants from '../../constants';\n\nexport const DrawText = { ...draw_point }\n\nDrawText.onSetup = function (opts = {}) {\n    const point = this.newFeature({\n        type: Constants.geojsonTypes.FEATURE,\n        properties: {\n            name: '文字注记',\n            'display-type': 'symbol',\n            'text-size': 16,\n            'text-color': '#000000',\n            text: '文字注记',\n            visible: true,\n            description: \"\",\n            'properties-dictionary': [\n                { key: 'name', label: '名称', type: 'string' },\n                { key: 'text', label: '文字内容', type: 'string', },\n                { key: 'text-size', label: '文字大小', type: 'number', min: 0 },\n                { key: 'text-color', label: '文字颜色', type: 'color' },\n                { key: 'description', label: '说明', type: 'textArea' }\n            ],\n            ...opts\n        },\n        geometry: {\n            type: Constants.geojsonTypes.POINT,\n            coordinates: []\n        }\n    });\n\n    this.addFeature(point);\n    0\n    this.clearSelectedFeatures();\n    this.updateUIClasses({ mouse: Constants.cursors.ADD });\n    this.activateUIButton(Constants.types.POINT);\n\n    this.setActionableState({\n        trash: true\n    });\n\n    return { point };\n};\n\nfunction loadImage(map, imageId, imageUrl) {\n    return new Promise((resolve) => {\n        if (map.hasImage(imageId)) {\n            resolve()\n        } else {\n            map.loadImage(imageUrl, (error, image) => {\n                map.addImage(imageId, image)\n                resolve()\n            })\n        }\n    })\n}\n\nexport const DrawImage = { ...draw_point }\n/**\n *\n * @param {*} opts\n * @param {*} opts.imageId\n * @param {*} opts.imageUrl\n * @returns\n */\nDrawImage.onSetup = function (opts) {\n    const { imageId, imageUrl } = opts\n    if (!imageId || !imageUrl) throw new Error('必须传入图标信息')\n\n    const appendProperties = {}\n    let appendDictionary = []\n    if (opts.appendDictionary) {\n        appendDictionary = opts.appendDictionary\n        appendDictionary.forEach(element => {\n            appendProperties[element.key] = element.default\n        });\n    }\n\n    const iconSize = opts.iconSize ? opts.iconSize : 1;\n\n    const point = this.newFeature({\n        type: Constants.geojsonTypes.FEATURE,\n        properties: {\n            name: '符号标绘',\n            'display-type': 'symbol',\n            'icon-size': iconSize,\n            description: \"\",\n            'properties-dictionary': [\n                { key: 'name', label: '名称', type: 'string' },\n                { key: 'icon-size', label: '图标放大倍数', type: 'number', min: 0, step: 0.01 },\n                { key: 'description', label: '说明', type: 'textArea' },\n                ...appendDictionary\n            ],\n            ...appendProperties\n        },\n        geometry: {\n            type: Constants.geojsonTypes.POINT,\n            coordinates: []\n        }\n    });\n\n    this.addFeature(point);\n\n    loadImage(this.map, imageId, imageUrl).then(() => {\n        point.properties['image-id'] = imageId\n        point.properties['image-url'] = imageUrl\n    })\n\n    this.clearSelectedFeatures();\n    this.updateUIClasses({ mouse: Constants.cursors.ADD });\n    this.activateUIButton(Constants.types.POINT);\n\n    this.setActionableState({\n        trash: true\n    });\n    return { point };\n};\n\n\nexport const DrawCamera = { ...draw_point }\n/**\n *\n * @param {*} opts\n * @param {*} opts.imageId\n * @param {*} opts.imageUrl\n * @returns\n */\nDrawCamera.onSetup = function (opts) {\n    const { imageId, imageUrl } = opts\n    if (!imageId || !imageUrl) throw new Error('必须传入图标信息')\n\n    const appendProperties = {}\n    let appendDictionary = []\n    if (opts.appendDictionary) {\n        appendDictionary = opts.appendDictionary\n        appendDictionary.forEach(element => {\n            appendProperties[element.key] = element.default\n        });\n    }\n\n    const iconSize = opts.iconSize ? opts.iconSize : 1;\n\n    const point = this.newFeature({\n        type: Constants.geojsonTypes.FEATURE,\n        properties: {\n            name: '视频点标绘',\n            'display-type': 'symbol',\n            'icon-size': iconSize,\n            'camera-url':'',\n            'properties-dictionary': [\n                { key: 'name', label: '名称', type: 'string' },\n                { key: 'icon-size', label: '图标放大倍数', type: 'number', min: 0, step: 0.01 },\n                { key: 'camera-url', label: '视频地址', type: 'textArea' },\n                ...appendDictionary\n            ],\n            ...appendProperties\n        },\n        geometry: {\n            type: Constants.geojsonTypes.POINT,\n            coordinates: []\n        }\n    });\n\n    this.addFeature(point);\n\n    loadImage(this.map, imageId, imageUrl).then(() => {\n        point.properties['image-id'] = imageId\n        point.properties['image-url'] = imageUrl\n    })\n\n    this.clearSelectedFeatures();\n    this.updateUIClasses({ mouse: Constants.cursors.ADD });\n    this.activateUIButton(Constants.types.POINT);\n\n    this.setActionableState({\n        trash: true\n    });\n    return { point };\n};","import polygonShapeFractory from './polygon_shape_factory';\nimport polylineShapeFractory from './polyline_shape_factory';\nimport { DrawText, DrawImage, DrawCamera } from './draw_symbol'\n\nexport default {\n    // 圆\n    draw_circle: polygonShapeFractory({ name: '圆', type: 'circle', fixedPointCount: 2 }),\n    // 细直箭头\n    draw_fine_arrow: polygonShapeFractory({ name: '细直箭头', type: 'fine_arrow', fixedPointCount: 2 }),\n    // 椭圆\n    draw_ellipse: polygonShapeFractory({ name: '椭圆', type: 'ellipse', fixedPointCount: 2 }),\n    // 矩形\n    draw_rectangle: polygonShapeFractory({ name: '矩形', type: 'rectangle', fixedPointCount: 2 }),\n    // 突击方向\n    draw_assault_direction: polygonShapeFractory({ name: '突击方向', type: 'assault_direction', fixedPointCount: 2 }),\n    // 钳击 \n    draw_double_arrow: polygonShapeFractory({ name: '钳击', type: 'double_arrow', fixedPointCount: 4 }),\n    // 扇形\n    draw_sector: polygonShapeFractory({ name: '扇形', type: 'sector', fixedPointCount: 3 }),\n    // 弓形\n    draw_lune: polygonShapeFractory({ name: '弓形', type: 'lune', fixedPointCount: 3 }),\n    // 进攻箭头\n    draw_attack_arrow: polygonShapeFractory({ name: '进攻箭头', type: 'attack_arrow', fixedPointCount: Infinity }),\n    // 燕尾进攻箭头\n    draw_tailed_attack_arrow: polygonShapeFractory({ name: '燕尾进攻箭头', type: 'tailed_attack_arrow', fixedPointCount: Infinity }),\n    // 战斗小队 ？？？啥意思\n    draw_squad_combat: polygonShapeFractory({ name: '战斗小队', type: 'squad_combat', fixedPointCount: Infinity }),\n    // 闭合曲面\n    draw_closed_curve: polygonShapeFractory({ name: '闭合曲面', type: 'closed_curve', fixedPointCount: Infinity }),\n\n    // 曲线\n    draw_curve: polylineShapeFractory({ name: '曲线', type: 'curve', fixedPointCount: Infinity }),\n    // 弧线\n    draw_arc: polylineShapeFractory({ name: '弧线', type: 'arc', fixedPointCount: 3 }),\n\n    draw_text: DrawText,\n    draw_image: DrawImage,\n    draw_camera: DrawCamera,\n};\n","\nimport simple_select from './simple_select';\nimport direct_select from './direct_select';\nimport draw_point from './draw_point';\nimport draw_polygon from './draw_polygon';\nimport draw_line_string from './draw_line_string';\nimport static_mode from './static_mode';\n\nimport custom from './custom/index'\n\nexport default {\n  simple_select,\n  direct_select,\n  draw_point,\n  draw_polygon,\n  draw_line_string,\n  static: static_mode,\n\n  ...custom\n};\n"," \n \n import xtend from 'xtend';\nimport * as Constants from './constants';\n\nimport styles from './lib/theme';\nimport modes from './modes/index';\n\nconst defaultOptions = {\n  defaultMode: Constants.modes.SIMPLE_SELECT,\n  keybindings: true,\n  touchEnabled: true,\n  clickBuffer: 2,\n  touchBuffer: 25,\n  boxSelect: true,\n  displayControlsDefault: true,\n  styles,\n  modes,\n  controls: {},\n  userProperties: false\n};\n\nconst showControls = {\n  point: true,\n  line_string: true,\n  polygon: true,\n  trash: true,\n  combine_features: false,\n  uncombine_features: false\n};\n\nconst hideControls = {\n  point: false,\n  line_string: false,\n  polygon: false,\n  trash: false,\n  combine_features: true,\n  uncombine_features: true\n};\n\nfunction addSources(styles, sourceBucket) {\n  return styles.map((style) => {\n    if (style.source) return style;\n    return xtend(style, {\n      id: `${style.id}.${sourceBucket}`,\n      source: (sourceBucket === 'hot') ? Constants.sources.HOT : Constants.sources.COLD\n    });\n  });\n}\n\nexport default function(options = {}) {\n  let withDefaults = xtend(options);\n\n  if (!options.controls) {\n    withDefaults.controls = {};\n  }\n\n  if (options.displayControlsDefault === false) {\n    withDefaults.controls = xtend(hideControls, options.controls);\n  } else {\n    withDefaults.controls = xtend(showControls, options.controls);\n  }\n\n  withDefaults = xtend(defaultOptions, withDefaults);\n\n  // Layers with a shared source should be adjacent for performance reasons\n  withDefaults.styles = addSources(withDefaults.styles, 'cold').concat(addSources(withDefaults.styles, 'hot'));\n\n  return withDefaults;\n}\n","export default [\n  {\n    'id': 'gl-draw-symbol-inactive',\n    'type': 'symbol',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['==', 'user_display-type', 'symbol'],\n      ['==', 'active', 'false'],\n      ['==', '$type', 'Point'],\n      ['==', 'meta', 'feature'],\n      ['!=', 'mode', 'static']\n    ],\n    'paint': {\n      'text-color': ['get', 'user_text-color'],\n    },\n    'layout': {\n      'text-allow-overlap': true,\n      'icon-allow-overlap': true,\n      'text-size': ['get', 'user_text-size'],\n      'icon-image': ['get', 'user_image-id'],\n      'icon-size': ['get', 'user_icon-size'],\n      'text-field': ['get', 'user_text'],\n      'text-font':['Open Sans Regular']\n    }\n  },\n  {\n    'id': 'gl-draw-symbol-active',\n    'type': 'symbol',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['==', 'user_display-type', 'symbol'],\n      ['==', '$type', 'Point'],\n      ['==', 'active', 'true'],\n      ['==', 'meta', 'feature']\n    ],\n    'paint': {\n      'text-color': ['get', 'user_text-color'],\n    },\n    'layout': {\n      'text-allow-overlap': true,\n      'icon-allow-overlap': true,\n      'text-size': ['get', 'user_text-size'],\n      'icon-image': ['get', 'user_image-id'],\n      'icon-size': ['get', 'user_icon-size'],\n      'text-field': ['get', 'user_text'],\n      'text-font':['Open Sans Regular']\n    }\n  },\n  {\n    'id': 'gl-draw-polygon-fill-inactive',\n    'type': 'fill',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['==', 'active', 'false'],\n      ['==', '$type', 'Polygon'],\n      ['!=', 'mode', 'static']\n    ],\n    'paint': {\n      'fill-color': ['get', 'user_fill-color'],\n      'fill-outline-color': ['get', 'user_line-color'],\n      'fill-opacity': ['get', 'user_opacity']\n    },\n  },\n  {\n    'id': 'gl-draw-polygon-fill-active',\n    'type': 'fill',\n    'filter': ['all', ['!=', 'user_visible', false], ['==', 'active', 'true'], ['==', '$type', 'Polygon']],\n    'paint': {\n      'fill-color': ['get', 'user_fill-color'],\n      'fill-outline-color': ['get', 'user_line-color'],\n      'fill-opacity': ['get', 'user_opacity']\n    },\n  },\n  {\n    'id': 'gl-draw-polygon-midpoint',\n    'type': 'circle',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['==', '$type', 'Point'],\n      ['==', 'meta', 'midpoint']],\n    'paint': {\n      'circle-radius': 3,\n      'circle-color': '#fbb03b'\n    }\n  },\n  {\n    'id': 'gl-draw-polygon-stroke-inactive',\n    'type': 'line',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['==', 'active', 'false'],\n      ['==', '$type', 'Polygon'],\n      ['!=', 'mode', 'static']\n    ],\n    'layout': {\n      'line-cap': 'round',\n      'line-join': 'round'\n    },\n    'paint': {\n      'line-color': ['get', 'user_line-color'],\n      'line-width': 2\n    }\n  },\n  {\n    'id': 'gl-draw-polygon-stroke-active',\n    'type': 'line',\n    'filter': ['all', ['!=', 'user_visible', false], ['==', 'active', 'true'], ['==', '$type', 'Polygon']],\n    'layout': {\n      'line-cap': 'round',\n      'line-join': 'round'\n    },\n    'paint': {\n      'line-color': ['get', 'user_line-color'],\n      'line-dasharray': [0.2, 2],\n      'line-width': 2\n    }\n  },\n  {\n    'id': 'gl-draw-line-inactive',\n    'type': 'line',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['==', 'active', 'false'],\n      ['==', '$type', 'LineString'],\n      ['!=', 'mode', 'static']\n    ],\n    'layout': {\n      'line-cap': 'round',\n      'line-join': 'round'\n    },\n    'paint': {\n      'line-color': ['get', 'user_line-color'],\n      'line-width': ['get', 'user_line-width'],\n      'line-opacity': ['get', 'user_opacity'],\n    }\n  },\n  {\n    'id': 'gl-draw-line-active',\n    'type': 'line',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['==', '$type', 'LineString'],\n      ['==', 'active', 'true']\n    ],\n    'layout': {\n      'line-cap': 'round',\n      'line-join': 'round'\n    },\n    'paint': {\n      'line-dasharray': [0.2, 2],\n      'line-color': ['get', 'user_line-color'],\n      'line-width': 2,\n      'line-opacity': 1,\n    }\n  },\n  {\n    'id': 'gl-draw-polygon-and-line-vertex-stroke-inactive',\n    'type': 'circle',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['==', 'meta', 'vertex'],\n      ['==', '$type', 'Point'],\n      ['!=', 'mode', 'static']\n    ],\n    'paint': {\n      'circle-radius': 5,\n      'circle-color': '#fff'\n    }\n  },\n  {\n    'id': 'gl-draw-polygon-and-line-vertex-inactive',\n    'type': 'circle',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['==', 'meta', 'vertex'],\n      ['==', '$type', 'Point'],\n      ['!=', 'mode', 'static']\n    ],\n    'paint': {\n      'circle-radius': 3,\n      'circle-color': '#fbb03b'\n    }\n  },\n  {\n    'id': 'gl-draw-point-point-stroke-inactive',\n    'type': 'circle',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['!has', 'user_display-type'],\n      ['==', 'active', 'false'],\n      ['==', '$type', 'Point'],\n      ['==', 'meta', 'feature'],\n      ['!=', 'mode', 'static']\n    ],\n    'paint': {\n      'circle-radius': 5,\n      'circle-opacity': 1,\n      'circle-color': '#fff'\n    }\n  },\n  {\n    'id': 'gl-draw-point-inactive',\n    'type': 'circle',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['!has', 'user_display-type'],\n      ['==', 'active', 'false'],\n      ['==', '$type', 'Point'],\n      ['==', 'meta', 'feature'],\n      ['!=', 'mode', 'static']\n    ],\n    'paint': {\n      'circle-radius': 3,\n      'circle-color': '#3bb2d0'\n    }\n  },\n  {\n    'id': 'gl-draw-point-stroke-active',\n    'type': 'circle',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['==', '$type', 'Point'],\n      ['==', 'active', 'true'],\n      ['!=', 'meta', 'midpoint']\n    ],\n    'paint': {\n      'circle-radius': 7,\n      'circle-color': '#fff'\n    }\n  },\n  {\n    'id': 'gl-draw-point-active',\n    'type': 'circle',\n    'filter': ['all',\n      ['!=', 'user_visible', false],\n      ['==', '$type', 'Point'],\n      ['!=', 'meta', 'midpoint'],\n      ['==', 'active', 'true']],\n    'paint': {\n      'circle-radius': 5,\n      'circle-color': '#fbb03b'\n    }\n  },\n  {\n    'id': 'gl-draw-polygon-fill-static',\n    'type': 'fill',\n    'filter': ['all', ['!=', 'user_visible', false], ['==', 'mode', 'static'], ['==', '$type', 'Polygon']],\n    'paint': {\n      'fill-color': '#404040',\n      'fill-outline-color': '#404040',\n      'fill-opacity': 0.1\n    }\n  },\n  {\n    'id': 'gl-draw-polygon-stroke-static',\n    'type': 'line',\n    'filter': ['all', ['!=', 'user_visible', false], ['==', 'mode', 'static'], ['==', '$type', 'Polygon']],\n    'layout': {\n      'line-cap': 'round',\n      'line-join': 'round'\n    },\n    'paint': {\n      'line-color': '#404040',\n      'line-width': 2\n    }\n  },\n  {\n    'id': 'gl-draw-line-static',\n    'type': 'line',\n    'filter': ['all', ['!=', 'user_visible', false], ['==', 'mode', 'static'], ['==', '$type', 'LineString']],\n    'layout': {\n      'line-cap': 'round',\n      'line-join': 'round'\n    },\n    'paint': {\n      'line-color': '#404040',\n      'line-width': 2\n    }\n  },\n  {\n    'id': 'gl-draw-point-static',\n    'type': 'circle',\n    'filter': ['all', ['!=', 'user_visible', false], ['==', 'mode', 'static'], ['==', '$type', 'Point']],\n    'paint': {\n      'circle-radius': 5,\n      'circle-color': '#404040'\n    }\n  },\n];\n","/**\n * Lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright JS Foundation and other contributors <https://js.foundation/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    asyncTag = '[object AsyncFunction]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    nullTag = '[object Null]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    proxyTag = '[object Proxy]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]',\n    undefinedTag = '[object Undefined]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\n/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n    funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n    Symbol = root.Symbol,\n    Uint8Array = root.Uint8Array,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable,\n    splice = arrayProto.splice,\n    symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols,\n    nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n    nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n    Map = getNative(root, 'Map'),\n    Promise = getNative(root, 'Promise'),\n    Set = getNative(root, 'Set'),\n    WeakMap = getNative(root, 'WeakMap'),\n    nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Unordered comparison\n *  2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = objIsArr ? arrayTag : getTag(object),\n      othTag = othIsArr ? arrayTag : getTag(other);\n\n  objTag = objTag == argsTag ? objectTag : objTag;\n  othTag = othTag == argsTag ? objectTag : othTag;\n\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && isBuffer(object)) {\n    if (!isBuffer(other)) {\n      return false;\n    }\n    objIsArr = true;\n    objIsObj = false;\n  }\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n  }\n  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  var stacked = stack.get(array);\n  if (stacked && stack.get(other)) {\n    return stacked == other;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, bitmask, customizer, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= COMPARE_UNORDERED_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Assume cyclic values are equal.\n  var stacked = stack.get(object);\n  if (stacked && stack.get(other)) {\n    return stacked == other;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  length = length == null ? MAX_SAFE_INTEGER : length;\n  return !!length &&\n    (typeof value == 'number' || reIsUint.test(value)) &&\n    (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n  return baseIsEqual(value, other);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = isEqual;\n","/* parser generated by jison 0.4.17 */\n/*\n  Returns a Parser object of the following structure:\n\n  Parser: {\n    yy: {}\n  }\n\n  Parser.prototype: {\n    yy: {},\n    trace: function(),\n    symbols_: {associative list: name ==> number},\n    terminals_: {associative list: number ==> name},\n    productions_: [...],\n    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),\n    table: [...],\n    defaultActions: {...},\n    parseError: function(str, hash),\n    parse: function(input),\n\n    lexer: {\n        EOF: 1,\n        parseError: function(str, hash),\n        setInput: function(input),\n        input: function(),\n        unput: function(str),\n        more: function(),\n        less: function(n),\n        pastInput: function(),\n        upcomingInput: function(),\n        showPosition: function(),\n        test_match: function(regex_match_array, rule_index),\n        next: function(),\n        lex: function(),\n        begin: function(condition),\n        popState: function(),\n        _currentRules: function(),\n        topState: function(),\n        pushState: function(condition),\n\n        options: {\n            ranges: boolean           (optional: true ==> token location info will include a .range[] member)\n            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)\n            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)\n        },\n\n        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n        rules: [...],\n        conditions: {associative list: name ==> set},\n    }\n  }\n\n\n  token location info (@$, _$, etc.): {\n    first_line: n,\n    last_line: n,\n    first_column: n,\n    last_column: n,\n    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)\n  }\n\n\n  the parseError function receives a 'hash' object with these members for lexer and parser errors: {\n    text:        (matched text)\n    token:       (the produced terminal token, if any)\n    line:        (yylineno)\n  }\n  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {\n    loc:         (yylloc)\n    expected:    (string describing the set of expected tokens)\n    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)\n  }\n*/\nvar jsonlint = (function(){\nvar o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,12],$V1=[1,13],$V2=[1,9],$V3=[1,10],$V4=[1,11],$V5=[1,14],$V6=[1,15],$V7=[14,18,22,24],$V8=[18,22],$V9=[22,24];\nvar parser = {trace: function trace() { },\nyy: {},\nsymbols_: {\"error\":2,\"JSONString\":3,\"STRING\":4,\"JSONNumber\":5,\"NUMBER\":6,\"JSONNullLiteral\":7,\"NULL\":8,\"JSONBooleanLiteral\":9,\"TRUE\":10,\"FALSE\":11,\"JSONText\":12,\"JSONValue\":13,\"EOF\":14,\"JSONObject\":15,\"JSONArray\":16,\"{\":17,\"}\":18,\"JSONMemberList\":19,\"JSONMember\":20,\":\":21,\",\":22,\"[\":23,\"]\":24,\"JSONElementList\":25,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",4:\"STRING\",6:\"NUMBER\",8:\"NULL\",10:\"TRUE\",11:\"FALSE\",14:\"EOF\",17:\"{\",18:\"}\",21:\":\",22:\",\",23:\"[\",24:\"]\"},\nproductions_: [0,[3,1],[5,1],[7,1],[9,1],[9,1],[12,2],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[15,2],[15,3],[20,3],[19,1],[19,3],[16,2],[16,3],[25,1],[25,3]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:\n // replace escaped characters with actual character\n          this.$ = yytext.replace(/\\\\(\\\\|\")/g, \"$\"+\"1\")\n                     .replace(/\\\\n/g,'\\n')\n                     .replace(/\\\\r/g,'\\r')\n                     .replace(/\\\\t/g,'\\t')\n                     .replace(/\\\\v/g,'\\v')\n                     .replace(/\\\\f/g,'\\f')\n                     .replace(/\\\\b/g,'\\b');\n        \nbreak;\ncase 2:\nthis.$ = Number(yytext);\nbreak;\ncase 3:\nthis.$ = null;\nbreak;\ncase 4:\nthis.$ = true;\nbreak;\ncase 5:\nthis.$ = false;\nbreak;\ncase 6:\nreturn this.$ = $$[$0-1];\nbreak;\ncase 13:\nthis.$ = {}; Object.defineProperty(this.$, '__line__', {\n            value: this._$.first_line,\n            enumerable: false\n        })\nbreak;\ncase 14: case 19:\nthis.$ = $$[$0-1]; Object.defineProperty(this.$, '__line__', {\n            value: this._$.first_line,\n            enumerable: false\n        })\nbreak;\ncase 15:\nthis.$ = [$$[$0-2], $$[$0]];\nbreak;\ncase 16:\nthis.$ = {}; this.$[$$[$0][0]] = $$[$0][1];\nbreak;\ncase 17:\n\n            this.$ = $$[$0-2];\n            if ($$[$0-2][$$[$0][0]] !== undefined) {\n                if (!this.$.__duplicateProperties__) {\n                    Object.defineProperty(this.$, '__duplicateProperties__', {\n                        value: [],\n                        enumerable: false\n                    });\n                }\n                this.$.__duplicateProperties__.push($$[$0][0]);\n            }\n            $$[$0-2][$$[$0][0]] = $$[$0][1];\n        \nbreak;\ncase 18:\nthis.$ = []; Object.defineProperty(this.$, '__line__', {\n            value: this._$.first_line,\n            enumerable: false\n        })\nbreak;\ncase 20:\nthis.$ = [$$[$0]];\nbreak;\ncase 21:\nthis.$ = $$[$0-2]; $$[$0-2].push($$[$0]);\nbreak;\n}\n},\ntable: [{3:5,4:$V0,5:6,6:$V1,7:3,8:$V2,9:4,10:$V3,11:$V4,12:1,13:2,15:7,16:8,17:$V5,23:$V6},{1:[3]},{14:[1,16]},o($V7,[2,7]),o($V7,[2,8]),o($V7,[2,9]),o($V7,[2,10]),o($V7,[2,11]),o($V7,[2,12]),o($V7,[2,3]),o($V7,[2,4]),o($V7,[2,5]),o([14,18,21,22,24],[2,1]),o($V7,[2,2]),{3:20,4:$V0,18:[1,17],19:18,20:19},{3:5,4:$V0,5:6,6:$V1,7:3,8:$V2,9:4,10:$V3,11:$V4,13:23,15:7,16:8,17:$V5,23:$V6,24:[1,21],25:22},{1:[2,6]},o($V7,[2,13]),{18:[1,24],22:[1,25]},o($V8,[2,16]),{21:[1,26]},o($V7,[2,18]),{22:[1,28],24:[1,27]},o($V9,[2,20]),o($V7,[2,14]),{3:20,4:$V0,20:29},{3:5,4:$V0,5:6,6:$V1,7:3,8:$V2,9:4,10:$V3,11:$V4,13:30,15:7,16:8,17:$V5,23:$V6},o($V7,[2,19]),{3:5,4:$V0,5:6,6:$V1,7:3,8:$V2,9:4,10:$V3,11:$V4,13:31,15:7,16:8,17:$V5,23:$V6},o($V8,[2,17]),o($V8,[2,15]),o($V9,[2,21])],\ndefaultActions: {16:[2,6]},\nparseError: function parseError(str, hash) {\n    if (hash.recoverable) {\n        this.trace(str);\n    } else {\n        function _parseError (msg, hash) {\n            this.message = msg;\n            this.hash = hash;\n        }\n        _parseError.prototype = Error;\n\n        throw new _parseError(str, hash);\n    }\n},\nparse: function parse(input) {\n    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n    var args = lstack.slice.call(arguments, 1);\n    var lexer = Object.create(this.lexer);\n    var sharedState = { yy: {} };\n    for (var k in this.yy) {\n        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n            sharedState.yy[k] = this.yy[k];\n        }\n    }\n    lexer.setInput(input, sharedState.yy);\n    sharedState.yy.lexer = lexer;\n    sharedState.yy.parser = this;\n    if (typeof lexer.yylloc == 'undefined') {\n        lexer.yylloc = {};\n    }\n    var yyloc = lexer.yylloc;\n    lstack.push(yyloc);\n    var ranges = lexer.options && lexer.options.ranges;\n    if (typeof sharedState.yy.parseError === 'function') {\n        this.parseError = sharedState.yy.parseError;\n    } else {\n        this.parseError = Object.getPrototypeOf(this).parseError;\n    }\n    function popStack(n) {\n        stack.length = stack.length - 2 * n;\n        vstack.length = vstack.length - n;\n        lstack.length = lstack.length - n;\n    }\n    _token_stack:\n        var lex = function () {\n            var token;\n            token = lexer.lex() || EOF;\n            if (typeof token !== 'number') {\n                token = self.symbols_[token] || token;\n            }\n            return token;\n        };\n    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n    while (true) {\n        state = stack[stack.length - 1];\n        if (this.defaultActions[state]) {\n            action = this.defaultActions[state];\n        } else {\n            if (symbol === null || typeof symbol == 'undefined') {\n                symbol = lex();\n            }\n            action = table[state] && table[state][symbol];\n        }\n                    if (typeof action === 'undefined' || !action.length || !action[0]) {\n                var errStr = '';\n                expected = [];\n                for (p in table[state]) {\n                    if (this.terminals_[p] && p > TERROR) {\n                        expected.push('\\'' + this.terminals_[p] + '\\'');\n                    }\n                }\n                if (lexer.showPosition) {\n                    errStr = 'Parse error on line ' + (yylineno + 1) + ':\\n' + lexer.showPosition() + '\\nExpecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n                } else {\n                    errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n                }\n                this.parseError(errStr, {\n                    text: lexer.match,\n                    token: this.terminals_[symbol] || symbol,\n                    line: lexer.yylineno,\n                    loc: yyloc,\n                    expected: expected\n                });\n            }\n        if (action[0] instanceof Array && action.length > 1) {\n            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n        }\n        switch (action[0]) {\n        case 1:\n            stack.push(symbol);\n            vstack.push(lexer.yytext);\n            lstack.push(lexer.yylloc);\n            stack.push(action[1]);\n            symbol = null;\n            if (!preErrorSymbol) {\n                yyleng = lexer.yyleng;\n                yytext = lexer.yytext;\n                yylineno = lexer.yylineno;\n                yyloc = lexer.yylloc;\n                if (recovering > 0) {\n                    recovering--;\n                }\n            } else {\n                symbol = preErrorSymbol;\n                preErrorSymbol = null;\n            }\n            break;\n        case 2:\n            len = this.productions_[action[1]][1];\n            yyval.$ = vstack[vstack.length - len];\n            yyval._$ = {\n                first_line: lstack[lstack.length - (len || 1)].first_line,\n                last_line: lstack[lstack.length - 1].last_line,\n                first_column: lstack[lstack.length - (len || 1)].first_column,\n                last_column: lstack[lstack.length - 1].last_column\n            };\n            if (ranges) {\n                yyval._$.range = [\n                    lstack[lstack.length - (len || 1)].range[0],\n                    lstack[lstack.length - 1].range[1]\n                ];\n            }\n            r = this.performAction.apply(yyval, [\n                yytext,\n                yyleng,\n                yylineno,\n                sharedState.yy,\n                action[1],\n                vstack,\n                lstack\n            ].concat(args));\n            if (typeof r !== 'undefined') {\n                return r;\n            }\n            if (len) {\n                stack = stack.slice(0, -1 * len * 2);\n                vstack = vstack.slice(0, -1 * len);\n                lstack = lstack.slice(0, -1 * len);\n            }\n            stack.push(this.productions_[action[1]][0]);\n            vstack.push(yyval.$);\n            lstack.push(yyval._$);\n            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n            stack.push(newState);\n            break;\n        case 3:\n            return true;\n        }\n    }\n    return true;\n}};\n/* generated by jison-lex 0.3.4 */\nvar lexer = (function(){\nvar lexer = ({\n\nEOF:1,\n\nparseError:function parseError(str, hash) {\n        if (this.yy.parser) {\n            this.yy.parser.parseError(str, hash);\n        } else {\n            throw new Error(str);\n        }\n    },\n\n// resets the lexer, sets new input\nsetInput:function (input, yy) {\n        this.yy = yy || this.yy || {};\n        this._input = input;\n        this._more = this._backtrack = this.done = false;\n        this.yylineno = this.yyleng = 0;\n        this.yytext = this.matched = this.match = '';\n        this.conditionStack = ['INITIAL'];\n        this.yylloc = {\n            first_line: 1,\n            first_column: 0,\n            last_line: 1,\n            last_column: 0\n        };\n        if (this.options.ranges) {\n            this.yylloc.range = [0,0];\n        }\n        this.offset = 0;\n        return this;\n    },\n\n// consumes and returns one char from the input\ninput:function () {\n        var ch = this._input[0];\n        this.yytext += ch;\n        this.yyleng++;\n        this.offset++;\n        this.match += ch;\n        this.matched += ch;\n        var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n        if (lines) {\n            this.yylineno++;\n            this.yylloc.last_line++;\n        } else {\n            this.yylloc.last_column++;\n        }\n        if (this.options.ranges) {\n            this.yylloc.range[1]++;\n        }\n\n        this._input = this._input.slice(1);\n        return ch;\n    },\n\n// unshifts one char (or a string) into the input\nunput:function (ch) {\n        var len = ch.length;\n        var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n        this._input = ch + this._input;\n        this.yytext = this.yytext.substr(0, this.yytext.length - len);\n        //this.yyleng -= len;\n        this.offset -= len;\n        var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n        this.match = this.match.substr(0, this.match.length - 1);\n        this.matched = this.matched.substr(0, this.matched.length - 1);\n\n        if (lines.length - 1) {\n            this.yylineno -= lines.length - 1;\n        }\n        var r = this.yylloc.range;\n\n        this.yylloc = {\n            first_line: this.yylloc.first_line,\n            last_line: this.yylineno + 1,\n            first_column: this.yylloc.first_column,\n            last_column: lines ?\n                (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n                 + oldLines[oldLines.length - lines.length].length - lines[0].length :\n              this.yylloc.first_column - len\n        };\n\n        if (this.options.ranges) {\n            this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n        }\n        this.yyleng = this.yytext.length;\n        return this;\n    },\n\n// When called from action, caches matched text and appends it on next action\nmore:function () {\n        this._more = true;\n        return this;\n    },\n\n// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\nreject:function () {\n        if (this.options.backtrack_lexer) {\n            this._backtrack = true;\n        } else {\n            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n                text: \"\",\n                token: null,\n                line: this.yylineno\n            });\n\n        }\n        return this;\n    },\n\n// retain first n characters of the match\nless:function (n) {\n        this.unput(this.match.slice(n));\n    },\n\n// displays already matched input, i.e. for error messages\npastInput:function () {\n        var past = this.matched.substr(0, this.matched.length - this.match.length);\n        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n    },\n\n// displays upcoming input, i.e. for error messages\nupcomingInput:function () {\n        var next = this.match;\n        if (next.length < 20) {\n            next += this._input.substr(0, 20-next.length);\n        }\n        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n    },\n\n// displays the character position where the lexing error occurred, i.e. for error messages\nshowPosition:function () {\n        var pre = this.pastInput();\n        var c = new Array(pre.length + 1).join(\"-\");\n        return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n    },\n\n// test the lexed token: return FALSE when not a match, otherwise return token\ntest_match:function (match, indexed_rule) {\n        var token,\n            lines,\n            backup;\n\n        if (this.options.backtrack_lexer) {\n            // save context\n            backup = {\n                yylineno: this.yylineno,\n                yylloc: {\n                    first_line: this.yylloc.first_line,\n                    last_line: this.last_line,\n                    first_column: this.yylloc.first_column,\n                    last_column: this.yylloc.last_column\n                },\n                yytext: this.yytext,\n                match: this.match,\n                matches: this.matches,\n                matched: this.matched,\n                yyleng: this.yyleng,\n                offset: this.offset,\n                _more: this._more,\n                _input: this._input,\n                yy: this.yy,\n                conditionStack: this.conditionStack.slice(0),\n                done: this.done\n            };\n            if (this.options.ranges) {\n                backup.yylloc.range = this.yylloc.range.slice(0);\n            }\n        }\n\n        lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n        if (lines) {\n            this.yylineno += lines.length;\n        }\n        this.yylloc = {\n            first_line: this.yylloc.last_line,\n            last_line: this.yylineno + 1,\n            first_column: this.yylloc.last_column,\n            last_column: lines ?\n                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n                         this.yylloc.last_column + match[0].length\n        };\n        this.yytext += match[0];\n        this.match += match[0];\n        this.matches = match;\n        this.yyleng = this.yytext.length;\n        if (this.options.ranges) {\n            this.yylloc.range = [this.offset, this.offset += this.yyleng];\n        }\n        this._more = false;\n        this._backtrack = false;\n        this._input = this._input.slice(match[0].length);\n        this.matched += match[0];\n        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n        if (this.done && this._input) {\n            this.done = false;\n        }\n        if (token) {\n            return token;\n        } else if (this._backtrack) {\n            // recover context\n            for (var k in backup) {\n                this[k] = backup[k];\n            }\n            return false; // rule action called reject() implying the next rule should be tested instead.\n        }\n        return false;\n    },\n\n// return next match in input\nnext:function () {\n        if (this.done) {\n            return this.EOF;\n        }\n        if (!this._input) {\n            this.done = true;\n        }\n\n        var token,\n            match,\n            tempMatch,\n            index;\n        if (!this._more) {\n            this.yytext = '';\n            this.match = '';\n        }\n        var rules = this._currentRules();\n        for (var i = 0; i < rules.length; i++) {\n            tempMatch = this._input.match(this.rules[rules[i]]);\n            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n                match = tempMatch;\n                index = i;\n                if (this.options.backtrack_lexer) {\n                    token = this.test_match(tempMatch, rules[i]);\n                    if (token !== false) {\n                        return token;\n                    } else if (this._backtrack) {\n                        match = false;\n                        continue; // rule action called reject() implying a rule MISmatch.\n                    } else {\n                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n                        return false;\n                    }\n                } else if (!this.options.flex) {\n                    break;\n                }\n            }\n        }\n        if (match) {\n            token = this.test_match(match, rules[index]);\n            if (token !== false) {\n                return token;\n            }\n            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n            return false;\n        }\n        if (this._input === \"\") {\n            return this.EOF;\n        } else {\n            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n                text: \"\",\n                token: null,\n                line: this.yylineno\n            });\n        }\n    },\n\n// return next match that has a token\nlex:function lex() {\n        var r = this.next();\n        if (r) {\n            return r;\n        } else {\n            return this.lex();\n        }\n    },\n\n// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\nbegin:function begin(condition) {\n        this.conditionStack.push(condition);\n    },\n\n// pop the previously active lexer condition state off the condition stack\npopState:function popState() {\n        var n = this.conditionStack.length - 1;\n        if (n > 0) {\n            return this.conditionStack.pop();\n        } else {\n            return this.conditionStack[0];\n        }\n    },\n\n// produce the lexer rule set which is active for the currently active lexer condition state\n_currentRules:function _currentRules() {\n        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n        } else {\n            return this.conditions[\"INITIAL\"].rules;\n        }\n    },\n\n// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\ntopState:function topState(n) {\n        n = this.conditionStack.length - 1 - Math.abs(n || 0);\n        if (n >= 0) {\n            return this.conditionStack[n];\n        } else {\n            return \"INITIAL\";\n        }\n    },\n\n// alias for begin(condition)\npushState:function pushState(condition) {\n        this.begin(condition);\n    },\n\n// return the number of states currently on the stack\nstateStackSize:function stateStackSize() {\n        return this.conditionStack.length;\n    },\noptions: {},\nperformAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:/* skip whitespace */\nbreak;\ncase 1:return 6\nbreak;\ncase 2:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 4\nbreak;\ncase 3:return 17\nbreak;\ncase 4:return 18\nbreak;\ncase 5:return 23\nbreak;\ncase 6:return 24\nbreak;\ncase 7:return 22\nbreak;\ncase 8:return 21\nbreak;\ncase 9:return 10\nbreak;\ncase 10:return 11\nbreak;\ncase 11:return 8\nbreak;\ncase 12:return 14\nbreak;\ncase 13:return 'INVALID'\nbreak;\n}\n},\nrules: [/^(?:\\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\\.[0-9]+)?([eE][-+]?[0-9]+)?\\b)/,/^(?:\"(?:\\\\[\\\\\"bfnrt\\/]|\\\\u[a-fA-F0-9]{4}|[^\\\\\\0-\\x09\\x0a-\\x1f\"])*\")/,/^(?:\\{)/,/^(?:\\})/,/^(?:\\[)/,/^(?:\\])/,/^(?:,)/,/^(?::)/,/^(?:true\\b)/,/^(?:false\\b)/,/^(?:null\\b)/,/^(?:$)/,/^(?:.)/],\nconditions: {\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],\"inclusive\":true}}\n});\nreturn lexer;\n})();\nparser.lexer = lexer;\nfunction Parser () {\n  this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\nreturn new Parser;\n})();\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\nexports.parser = jsonlint;\nexports.Parser = jsonlint.Parser;\nexports.parse = function () { return jsonlint.parse.apply(jsonlint, arguments); };\nexports.main = function commonjsMain(args) {\n    if (!args[1]) {\n        console.log('Usage: '+args[0]+' FILE');\n        process.exit(1);\n    }\n    var source = require('fs').readFileSync(require('path').normalize(args[1]), \"utf8\");\n    return exports.parser.parse(source);\n};\nif (typeof module !== 'undefined' && require.main === module) {\n  exports.main(process.argv.slice(1));\n}\n}","import isEqual from 'lodash.isequal';\nimport normalize from '@mapbox/geojson-normalize';\nimport hat from 'hat';\nimport featuresAt from './lib/features_at';\nimport stringSetsAreEqual from './lib/string_sets_are_equal';\nimport geojsonhint from '@mapbox/geojsonhint';\nimport * as Constants from './constants';\nimport StringSet from './lib/string_set';\n\nimport Polygon from './feature_types/polygon';\nimport LineString from './feature_types/line_string';\nimport Point from './feature_types/point';\nimport MultiFeature from './feature_types/multi_feature';\n\nconst featureTypes = {\n  Polygon,\n  LineString,\n  Point,\n  MultiPolygon: MultiFeature,\n  MultiLineString: MultiFeature,\n  MultiPoint: MultiFeature\n};\n\nexport default function (ctx, api) {\n\n  api.modes = Constants.modes;\n\n  api.getFeatureIdsAt = function (point) {\n    const features = featuresAt.click({ point }, null, ctx);\n    return features.map(feature => feature.properties.id);\n  };\n\n  api.getSelectedIds = function () {\n    return ctx.store.getSelectedIds();\n  };\n\n  api.getSelected = function () {\n    return {\n      type: Constants.geojsonTypes.FEATURE_COLLECTION,\n      features: ctx.store.getSelectedIds().map(id => ctx.store.get(id)).map(feature => feature.toGeoJSON())\n    };\n  };\n\n  api.getSelectedPoints = function () {\n    return {\n      type: Constants.geojsonTypes.FEATURE_COLLECTION,\n      features: ctx.store.getSelectedCoordinates().map(coordinate => ({\n        type: Constants.geojsonTypes.FEATURE,\n        properties: {},\n        geometry: {\n          type: Constants.geojsonTypes.POINT,\n          coordinates: coordinate.coordinates\n        }\n      }))\n    };\n  };\n\n  api.set = function (featureCollection) {\n    if (featureCollection.type === undefined || featureCollection.type !== Constants.geojsonTypes.FEATURE_COLLECTION || !Array.isArray(featureCollection.features)) {\n      throw new Error('Invalid FeatureCollection');\n    }\n    const renderBatch = ctx.store.createRenderBatch();\n    let toDelete = ctx.store.getAllIds().slice();\n    const newIds = api.add(featureCollection);\n    const newIdsLookup = new StringSet(newIds);\n\n    toDelete = toDelete.filter(id => !newIdsLookup.has(id));\n    if (toDelete.length) {\n      api.delete(toDelete);\n    }\n\n    renderBatch();\n    return newIds;\n  };\n\n  api.add = function (geojson) {\n    // 关闭geojson错误检查，以避免无法添加线图形\n    /* const errors = geojsonhint.hint(geojson, { precisionWarning: false }).filter(e => e.level !== 'message');\n    if (errors.length) {\n      throw new Error(errors[0].message);\n    } */\n    const featureCollection = JSON.parse(JSON.stringify(normalize(geojson)));\n\n    const ids = featureCollection.features.map((feature) => {\n      feature.id = feature.id || hat();\n\n      if (feature.geometry === null) {\n        throw new Error('Invalid geometry: null');\n      }\n\n      if (ctx.store.get(feature.id) === undefined || ctx.store.get(feature.id).type !== feature.geometry.type) {\n        // If the feature has not yet been created ...\n        const Model = featureTypes[feature.geometry.type];\n        if (Model === undefined) {\n          throw new Error(`Invalid geometry type: ${feature.geometry.type}.`);\n        }\n        const internalFeature = new Model(ctx, feature);\n        ctx.store.add(internalFeature);\n      } else {\n        // If a feature of that id has already been created, and we are swapping it out ...\n        const internalFeature = ctx.store.get(feature.id);\n        internalFeature.properties = feature.properties;\n        if (!isEqual(internalFeature.getCoordinates(), feature.geometry.coordinates)) {\n          internalFeature.incomingCoords(feature.geometry.coordinates);\n        }\n      }\n      return feature.id;\n    });\n\n    ctx.store.render();\n    return ids;\n  };\n\n\n  api.get = function (id) {\n    const feature = ctx.store.get(id);\n    if (feature) {\n      return feature.toGeoJSON(Boolean(feature.properties.isCustom));\n    }\n  };\n\n  api.getAll = function () {\n    return {\n      type: Constants.geojsonTypes.FEATURE_COLLECTION,\n      features: ctx.store.getAll().map(feature => feature.toGeoJSON(Boolean(feature.properties.isCustom)))\n    };\n  };\n\n  api.delete = function (featureIds) {\n    ctx.store.delete(featureIds, { silent: true });\n    // If we were in direct select mode and our selected feature no longer exists\n    // (because it was deleted), we need to get out of that mode.\n    if (api.getMode() === Constants.modes.DIRECT_SELECT && !ctx.store.getSelectedIds().length) {\n      ctx.events.changeMode(Constants.modes.SIMPLE_SELECT, undefined, { silent: true });\n    } else {\n      ctx.store.render();\n    }\n\n    return api;\n  };\n\n  api.deleteAll = function () {\n    ctx.store.delete(ctx.store.getAllIds(), { silent: true });\n    // If we were in direct select mode, now our selected feature no longer exists,\n    // so escape that mode.\n    if (api.getMode() === Constants.modes.DIRECT_SELECT) {\n      ctx.events.changeMode(Constants.modes.SIMPLE_SELECT, undefined, { silent: true });\n    } else {\n      ctx.store.render();\n    }\n\n    return api;\n  };\n\n  api.changeMode = function (mode, modeOptions = {}) {\n    // Avoid changing modes just to re-select what's already selected\n    if (mode === Constants.modes.SIMPLE_SELECT && api.getMode() === Constants.modes.SIMPLE_SELECT) {\n      if (stringSetsAreEqual((modeOptions.featureIds || []), ctx.store.getSelectedIds())) return api;\n      // And if we are changing the selection within simple_select mode, just change the selection,\n      // instead of stopping and re-starting the mode\n      ctx.store.setSelected(modeOptions.featureIds, { silent: true });\n      ctx.store.render();\n      return api;\n    }\n\n    if (mode === Constants.modes.DIRECT_SELECT && api.getMode() === Constants.modes.DIRECT_SELECT &&\n      modeOptions.featureId === ctx.store.getSelectedIds()[0]) {\n      return api;\n    }\n\n    ctx.events.changeMode(mode, modeOptions, { silent: true });\n    return api;\n  };\n\n  api.getMode = function () {\n    return ctx.events.getMode();\n  };\n\n  api.trash = function () {\n    ctx.events.trash({ silent: true });\n    return api;\n  };\n\n  api.combineFeatures = function () {\n    ctx.events.combineFeatures({ silent: true });\n    return api;\n  };\n\n  api.uncombineFeatures = function () {\n    ctx.events.uncombineFeatures({ silent: true });\n    return api;\n  };\n\n  api.setFeatureProperty = function (featureId, property, value) {\n    ctx.store.setFeatureProperty(featureId, property, value);\n    ctx.store.render();\n    return api;\n  };\n\n  return api;\n}\n","export default function(a, b) {\n  if (a.length !== b.length) return false;\n  return JSON.stringify(a.map(id => id).sort()) === JSON.stringify(b.map(id => id).sort());\n}\n","import xtend from 'xtend';\nimport * as Constants from './constants';\n\nconst classTypes = ['mode', 'feature', 'mouse'];\n\nexport default function(ctx) {\n\n\n  const buttonElements = {};\n  let activeButton = null;\n\n  let currentMapClasses = {\n    mode: null, // e.g. mode-direct_select\n    feature: null, // e.g. feature-vertex\n    mouse: null // e.g. mouse-move\n  };\n\n  let nextMapClasses = {\n    mode: null,\n    feature: null,\n    mouse: null\n  };\n\n  function clearMapClasses() {\n    queueMapClasses({mode:null, feature:null, mouse:null});\n    updateMapClasses();\n  }\n\n  function queueMapClasses(options) {\n    nextMapClasses = xtend(nextMapClasses, options);\n  }\n\n  function updateMapClasses() {\n    if (!ctx.container) return;\n\n    const classesToRemove = [];\n    const classesToAdd = [];\n\n    classTypes.forEach((type) => {\n      if (nextMapClasses[type] === currentMapClasses[type]) return;\n\n      classesToRemove.push(`${type}-${currentMapClasses[type]}`);\n      if (nextMapClasses[type] !== null) {\n        classesToAdd.push(`${type}-${nextMapClasses[type]}`);\n      }\n    });\n\n    if (classesToRemove.length > 0) {\n      ctx.container.classList.remove(...classesToRemove);\n    }\n\n    if (classesToAdd.length > 0) {\n      ctx.container.classList.add(...classesToAdd);\n    }\n\n    currentMapClasses = xtend(currentMapClasses, nextMapClasses);\n  }\n\n  function createControlButton(id, options = {}) {\n    const button = document.createElement('button');\n    button.className = `${Constants.classes.CONTROL_BUTTON} ${options.className}`;\n    button.setAttribute('title', options.title);\n    options.container.appendChild(button);\n\n    button.addEventListener('click', (e) => {\n      e.preventDefault();\n      e.stopPropagation();\n\n      const clickedButton = e.target;\n      if (clickedButton === activeButton) {\n        deactivateButtons();\n        options.onDeactivate();\n        return;\n      }\n\n      setActiveButton(id);\n      options.onActivate();\n    }, true);\n\n    return button;\n  }\n\n  function deactivateButtons() {\n    if (!activeButton) return;\n    activeButton.classList.remove(Constants.classes.ACTIVE_BUTTON);\n    activeButton = null;\n  }\n\n  function setActiveButton(id) {\n    deactivateButtons();\n\n    const button = buttonElements[id];\n    if (!button) return;\n\n    if (button && id !== 'trash') {\n      button.classList.add(Constants.classes.ACTIVE_BUTTON);\n      activeButton = button;\n    }\n  }\n\n  function addButtons() {\n    const controls = ctx.options.controls;\n    const controlGroup = document.createElement('div');\n    controlGroup.className = `${Constants.classes.CONTROL_GROUP} ${Constants.classes.CONTROL_BASE}`;\n\n    if (!controls) return controlGroup;\n\n    if (controls[Constants.types.LINE]) {\n      buttonElements[Constants.types.LINE] = createControlButton(Constants.types.LINE, {\n        container: controlGroup,\n        className: Constants.classes.CONTROL_BUTTON_LINE,\n        title: `LineString tool ${ctx.options.keybindings ? '(l)' : ''}`,\n        onActivate: () => ctx.events.changeMode(Constants.modes.DRAW_LINE_STRING),\n        onDeactivate: () => ctx.events.trash()\n      });\n    }\n\n    if (controls[Constants.types.POLYGON]) {\n      buttonElements[Constants.types.POLYGON] = createControlButton(Constants.types.POLYGON, {\n        container: controlGroup,\n        className: Constants.classes.CONTROL_BUTTON_POLYGON,\n        title: `Polygon tool ${ctx.options.keybindings ? '(p)' : ''}`,\n        onActivate: () => ctx.events.changeMode(Constants.modes.DRAW_POLYGON),\n        onDeactivate: () => ctx.events.trash()\n      });\n    }\n\n    if (controls[Constants.types.POINT]) {\n      buttonElements[Constants.types.POINT] = createControlButton(Constants.types.POINT, {\n        container: controlGroup,\n        className: Constants.classes.CONTROL_BUTTON_POINT,\n        title: `Marker tool ${ctx.options.keybindings ? '(m)' : ''}`,\n        onActivate: () => ctx.events.changeMode(Constants.modes.DRAW_POINT),\n        onDeactivate: () => ctx.events.trash()\n      });\n    }\n\n    if (controls.trash) {\n      buttonElements.trash = createControlButton('trash', {\n        container: controlGroup,\n        className: Constants.classes.CONTROL_BUTTON_TRASH,\n        title: 'Delete',\n        onActivate: () => {\n          ctx.events.trash();\n        }\n      });\n    }\n\n    if (controls.combine_features) {\n      buttonElements.combine_features = createControlButton('combineFeatures', {\n        container: controlGroup,\n        className: Constants.classes.CONTROL_BUTTON_COMBINE_FEATURES,\n        title: 'Combine',\n        onActivate: () => {\n          ctx.events.combineFeatures();\n        }\n      });\n    }\n\n    if (controls.uncombine_features) {\n      buttonElements.uncombine_features = createControlButton('uncombineFeatures', {\n        container: controlGroup,\n        className: Constants.classes.CONTROL_BUTTON_UNCOMBINE_FEATURES,\n        title: 'Uncombine',\n        onActivate: () => {\n          ctx.events.uncombineFeatures();\n        }\n      });\n    }\n\n    //TODO 添加自定义按钮\n\n    return controlGroup;\n  }\n\n  function removeButtons() {\n    Object.keys(buttonElements).forEach((buttonId) => {\n      const button = buttonElements[buttonId];\n      if (button.parentNode) {\n        button.parentNode.removeChild(button);\n      }\n      delete buttonElements[buttonId];\n    });\n  }\n\n  return {\n    setActiveButton,\n    queueMapClasses,\n    updateMapClasses,\n    clearMapClasses,\n    addButtons,\n    removeButtons\n  };\n}\n","import events from './events';\nimport Store from './store';\nimport * as Constants from './constants';\nimport setupOptions from './options';\nimport setupAPI from './api';\nimport ui from './ui';\n\nexport default class drawUtil {\n\n    constructor(map, options) {\n\n        options = setupOptions(options);\n\n        const ctx = {\n            options\n        };\n        this.ctx = ctx;\n\n        let api = setupAPI(ctx, this);\n        ctx.api = api;\n\n        ctx.map = map;\n        ctx.events = events(ctx);\n        ctx.ui = ui(ctx);\n        ctx.container = map.getContainer();\n        ctx.store = new Store(ctx);\n\n        if (ctx.options.boxSelect) {\n            map.boxZoom.disable();\n            // Need to toggle dragPan on and off or else first\n            // dragPan disable attempt in simple_select doesn't work\n            map.dragPan.disable();\n            map.dragPan.enable();\n        }\n\n        /* if (map.loaded()) {\n            this.connect();\n        } */\n        this.connect();\n\n        ctx.events.start();\n    }\n\n    connect() {\n        const { ctx } = this\n\n        this.addLayers();\n        this.updateLayersZIndexWapepr = () => {\n            this.updateLayersZIndex()\n        }\n\n        ctx.map.on(\"layerAdded\", this.updateLayersZIndexWapepr)\n        ctx.map.on(\"layerMoved\", this.updateLayersZIndexWapepr)\n\n        ctx.store.storeMapConfig();\n        ctx.events.addEventListeners();\n    }\n\n    addLayers() {\n        const { ctx } = this\n        // drawn features style\n        ctx.map.addSource(Constants.sources.COLD, {\n            data: {\n                type: Constants.geojsonTypes.FEATURE_COLLECTION,\n                features: []\n            },\n            buffer:512,\n            type: 'geojson'\n        });\n\n        // hot features style\n        ctx.map.addSource(Constants.sources.HOT, {\n            data: {\n                type: Constants.geojsonTypes.FEATURE_COLLECTION,\n                features: []\n            },\n            buffer:512,\n            type: 'geojson'\n        });\n\n        ctx.options.styles.forEach((style) => {\n            ctx.map.addLayer(style);\n        });\n\n        ctx.store.setDirty(true);\n        ctx.store.render();\n    }\n\n    updateLayersZIndex() {\n        const { ctx } = this,\n            map = ctx.map,\n            styles = ctx.options.styles\n        let { layers = [] } = map.getStyle();\n        if (layers.length === 0 || layers[layers.length - 1].id === styles[styles.length - 1].id) return\n        styles.forEach((style) => {\n            if (map.getLayer(style.id)) {\n                map.moveLayer(style.id, null, false);\n            }\n        });\n    }\n\n    removeLayers() {\n        const { ctx } = this\n        ctx.options.styles.forEach((style) => {\n            if (ctx.map.getLayer(style.id)) {\n                ctx.map.removeLayer(style.id);\n            }\n        });\n\n        if (ctx.map.getSource(Constants.sources.COLD)) {\n            ctx.map.removeSource(Constants.sources.COLD);\n        }\n\n        if (ctx.map.getSource(Constants.sources.HOT)) {\n            ctx.map.removeSource(Constants.sources.HOT);\n        }\n    }\n\n    destroy() {\n        const { ctx } = this\n\n        ctx.map.off(\"layerAdded\", this.updateLayersZIndexWapepr)\n        ctx.map.off(\"layerMoved\", this.updateLayersZIndexWapepr)\n\n        this.removeLayers();\n        ctx.store.restoreMapConfig();\n        ctx.events.removeEventListeners();\n        ctx.map = null;\n        ctx.container = null;\n        ctx.store = null;\n        return this;\n    }\n}\n","import setupModeHandler from './lib/mode_handler';\nimport getFeaturesAndSetCursor from './lib/get_features_and_set_cursor';\nimport featuresAt from './lib/features_at';\nimport isClick from './lib/is_click';\nimport isTap from './lib/is_tap';\nimport * as Constants from './constants';\nimport objectToMode from './modes/object_to_mode';\n\nexport default function(ctx) {\n\n  const modes = Object.keys(ctx.options.modes).reduce((m, k) => {\n    m[k] = objectToMode(ctx.options.modes[k]);\n    return m;\n  }, {});\n\n  let mouseDownInfo = {};\n  let touchStartInfo = {};\n  const events = {};\n  let currentModeName = null;\n  let currentMode = null;\n\n  events.drag = function(event, isDrag) {\n    if (isDrag({\n      point: event.point,\n      time: new Date().getTime()\n    })) {\n      ctx.ui.queueMapClasses({ mouse: Constants.cursors.DRAG });\n      currentMode.drag(event);\n    } else {\n      event.originalEvent.stopPropagation();\n    }\n  };\n\n  events.mousedrag = function(event) {\n    events.drag(event, endInfo => !isClick(mouseDownInfo, endInfo));\n  };\n\n  events.touchdrag = function(event) {\n    events.drag(event, endInfo => !isTap(touchStartInfo, endInfo));\n  };\n\n  events.mousemove = function(event) {\n    const button = event.originalEvent.buttons !== undefined ? event.originalEvent.buttons : event.originalEvent.which;\n    if (button === 1) {\n      return events.mousedrag(event);\n    }\n    const target = getFeaturesAndSetCursor(event, ctx);\n    event.featureTarget = target;\n    currentMode.mousemove(event);\n  };\n\n  events.mousedown = function(event) {\n    mouseDownInfo = {\n      time: new Date().getTime(),\n      point: event.point\n    };\n    const target = getFeaturesAndSetCursor(event, ctx);\n    event.featureTarget = target;\n    currentMode.mousedown(event);\n  };\n\n  events.mouseup = function(event) {\n    const target = getFeaturesAndSetCursor(event, ctx);\n    event.featureTarget = target;\n\n    if (isClick(mouseDownInfo, {\n      point: event.point,\n      time: new Date().getTime()\n    })) {\n      currentMode.click(event);\n    } else {\n      currentMode.mouseup(event);\n    }\n  };\n\n  events.mouseout = function(event) {\n    currentMode.mouseout(event);\n  };\n\n  events.touchstart = function(event) {\n    // Prevent emulated mouse events because we will fully handle the touch here.\n    // This does not stop the touch events from propogating to mapbox though.\n    event.originalEvent.preventDefault();\n    if (!ctx.options.touchEnabled) {\n      return;\n    }\n\n    touchStartInfo = {\n      time: new Date().getTime(),\n      point: event.point\n    };\n    const target = featuresAt.touch(event, null, ctx)[0];\n    event.featureTarget = target;\n    currentMode.touchstart(event);\n  };\n\n  events.touchmove = function(event) {\n    event.originalEvent.preventDefault();\n    if (!ctx.options.touchEnabled) {\n      return;\n    }\n\n    currentMode.touchmove(event);\n    return events.touchdrag(event);\n  };\n\n  events.touchend = function(event) {\n    event.originalEvent.preventDefault();\n    if (!ctx.options.touchEnabled) {\n      return;\n    }\n\n    const target = featuresAt.touch(event, null, ctx)[0];\n    event.featureTarget = target;\n    if (isTap(touchStartInfo, {\n      time: new Date().getTime(),\n      point: event.point\n    })) {\n      currentMode.tap(event);\n    } else {\n      currentMode.touchend(event);\n    }\n  };\n\n  // 8 - Backspace\n  // 46 - Delete\n  const isKeyModeValid = code => !(code === 8 || code === 46 || (code >= 48 && code <= 57));\n\n  events.keydown = function(event) {\n    if ((event.srcElement || event.target).classList[0] !== 'mapboxgl-canvas') return; // we only handle events on the map\n\n    if ((event.keyCode === 8 || event.keyCode === 46) && ctx.options.controls.trash) {\n      event.preventDefault();\n      currentMode.trash();\n    } else if (isKeyModeValid(event.keyCode)) {\n      currentMode.keydown(event);\n    } else if (event.keyCode === 49 && ctx.options.controls.point) {\n      changeMode(Constants.modes.DRAW_POINT);\n    } else if (event.keyCode === 50 && ctx.options.controls.line_string) {\n      changeMode(Constants.modes.DRAW_LINE_STRING);\n    } else if (event.keyCode === 51 && ctx.options.controls.polygon) {\n      changeMode(Constants.modes.DRAW_POLYGON);\n    }\n  };\n\n  events.keyup = function(event) {\n    if (isKeyModeValid(event.keyCode)) {\n      currentMode.keyup(event);\n    }\n  };\n\n  events.zoomend = function() {\n    ctx.store.changeZoom();\n  };\n\n  events.data = function(event) {\n    if (event.dataType === 'style') {\n      const { setup, map, options, store } = ctx;\n      const hasLayers = options.styles.some(style => map.getLayer(style.id));\n      if (!hasLayers) {\n        setup.addLayers();\n        store.setDirty();\n        store.render();\n      }\n    }\n  };\n\n  function changeMode(modename, nextModeOptions, eventOptions = {}) {\n    currentMode.stop();\n\n    const modebuilder = modes[modename];\n    if (modebuilder === undefined) {\n      throw new Error(`${modename} is not valid`);\n    }\n    currentModeName = modename;\n    const mode = modebuilder(ctx, nextModeOptions);\n    currentMode = setupModeHandler(mode, ctx);\n\n    if (!eventOptions.silent) {\n      ctx.map.fire(Constants.events.MODE_CHANGE, { mode: modename});\n    }\n\n    ctx.store.setDirty();\n    ctx.store.render();\n  }\n\n  const actionState = {\n    trash: false,\n    combineFeatures: false,\n    uncombineFeatures: false\n  };\n\n  function actionable(actions) {\n    let changed = false;\n    Object.keys(actions).forEach((action) => {\n      if (actionState[action] === undefined) throw new Error('Invalid action type');\n      if (actionState[action] !== actions[action]) changed = true;\n      actionState[action] = actions[action];\n    });\n    if (changed) ctx.map.fire(Constants.events.ACTIONABLE, { actions: actionState });\n  }\n\n  const api = {\n    start() {\n      currentModeName = ctx.options.defaultMode;\n      currentMode = setupModeHandler(modes[currentModeName](ctx), ctx);\n    },\n    changeMode,\n    actionable,\n    currentModeName() {\n      return currentModeName;\n    },\n    currentModeRender(geojson, push) {\n      return currentMode.render(geojson, push);\n    },\n    fire(name, event) {\n      if (events[name]) {\n        events[name](event);\n      }\n    },\n    addEventListeners() {\n      ctx.map.on('mousemove', events.mousemove);\n      ctx.map.on('mousedown', events.mousedown);\n      ctx.map.on('mouseup', events.mouseup);\n      ctx.map.on('data', events.data);\n\n      ctx.map.on('touchmove', events.touchmove);\n      ctx.map.on('touchstart', events.touchstart);\n      ctx.map.on('touchend', events.touchend);\n\n      ctx.container.addEventListener('mouseout', events.mouseout);\n\n      if (ctx.options.keybindings) {\n        ctx.container.addEventListener('keydown', events.keydown);\n        ctx.container.addEventListener('keyup', events.keyup);\n      }\n    },\n    removeEventListeners() {\n      ctx.map.off('mousemove', events.mousemove);\n      ctx.map.off('mousedown', events.mousedown);\n      ctx.map.off('mouseup', events.mouseup);\n      ctx.map.off('data', events.data);\n\n      ctx.map.off('touchmove', events.touchmove);\n      ctx.map.off('touchstart', events.touchstart);\n      ctx.map.off('touchend', events.touchend);\n\n      ctx.container.removeEventListener('mouseout', events.mouseout);\n\n      if (ctx.options.keybindings) {\n        ctx.container.removeEventListener('keydown', events.keydown);\n        ctx.container.removeEventListener('keyup', events.keyup);\n      }\n    },\n    trash(options) {\n      currentMode.trash(options);\n    },\n    combineFeatures() {\n      currentMode.combineFeatures();\n    },\n    uncombineFeatures() {\n      currentMode.uncombineFeatures();\n    },\n    getMode() {\n      return currentModeName;\n    }\n  };\n\n  return api;\n}\n"],"names":["const","ModeHandler","mode","DrawContext","handlers","drag","click","mousemove","mousedown","mouseup","mouseout","keydown","keyup","touchstart","touchmove","touchend","tap","ctx","on","event","selector","fn","undefined","Error","push","render","id","store","featureChanged","delegate","eventName","handles","iHandle","length","handle","call","ui","updateMapClasses","start","stop","trash","combineFeatures","uncombineFeatures","polygonArea","coords","area","Math","abs","ringArea","i","p1","p2","lowerIndex","middleIndex","upperIndex","coordsLength","rad","sin","wgs84","_","PI","geometry","type","coordinates","geometries","classes","sources","cursors","types","geojsonTypes","modes","DRAW_LINE_STRING","DRAW_POLYGON","DRAW_POINT","SIMPLE_SELECT","DIRECT_SELECT","STATIC","events","updateActions","meta","activeStates","interactions","FEATURE_SORT_RANKS","Point","LineString","Polygon","comparator","a","b","score","Constants.geojsonTypes","StringSet","items","this","_items","_nums","_length","let","l","add","prototype","x","has","delete","values","Object","keys","forEach","k","v","JSON","parse","sort","map","clear","META_TYPES","Constants.meta","bbox","featuresAt","options","clickBuffer","touch","touchBuffer","buffer","box","mapEvent","point","y","mapEventToBoundingBox","queryParams","styles","layers","s","features","queryRenderedFeatures","filter","feature","indexOf","properties","featureIds","uniqueFeatures","featureId","property","sortFeatures","getFeatureAtAndSetCursors","mouse","Constants.cursors","active","Constants.activeStates","currentModeName","queueMapClasses","sqrt","isClick","end","fineTolerance","grossTolerance","interval","time","moveDistance","euclideanDistance","isTap","tolerance","hat","module","bits","base","digits","log","pow","Infinity","rem","floor","res","random","toString","parsed","parseInt","rack","expandBy","data","iters","hasOwnProperty","hats","get","set","value","factors","centimeters","earthRadius","centimetres","degrees","feet","inches","kilometers","kilometres","meters","metres","miles","millimeters","millimetres","nauticalmiles","radians","yards","geom","feat","Array","isArray","isNumber","radiansToDegrees","degreesToRadians","num","isNaN","getCoord","coord","destination","origin","distance","bearing","coordinates1","longitude1","latitude1","bearingRad","units","factor","lengthToRadians","latitude2","asin","cos","atan2","circle","center","radius","steps","_i","coordinates_1","ring","j","polygon","from","to","coordinates2","dLat","dLon","lat1","lat2","radiansToLength","TWO_PI","wgsToMercator","wgsLon","wgsLat","tan","mercatorToWGS","mercatorLon","atan","exp","pnt1","pnt2","wholeDistance","points","totalDistance","getBaseLength","mid","getCircleCenterOfThreePoints","pnt3","pntA","pntB","pntC","pntD","getIntersectPoint","e","f","getAzimuth","startPnt","endPnt","azimuth","angle","getAngleOfThreePoints","isClockWise","getCubicValue","t","cPnt1","cPnt2","tp","max","min","t2","t3","tp2","tp3","getThirdPoint","clockWise","alpha","dx","dy","getArcPoints","startAngle","endAngle","pnts","angleDiff","getBisectorNormals","bisectorNormalLeft","bisectorNormalRight","dt","normal","getNormal","dist","uX","uY","d1","d2","dX1","dY1","dX2","dY2","getLeftMostControlPoint","controlPoints","controlX","controlY","normalRight","midPoint","pX","pY","n","nX","nY","a11","a12","a22","dX","dY","getRightMostControlPoint","count","normalLeft","getBezierPoints","bezierPoints","index","getBinomialFactor","getFactorial","result","getQBSplinePoints","bSplinePoints","m","getQuadricBSplineFactor","generatePoints","majorRadius","minorRadius","plotUtil.mercatorToWGS","HALF_PI","fine_arrow_opts","tailWidthFactor","neckWidthFactor","headWidthFactor","headAngle","neckAngle","arrow_algorithm","opt","len","plotUtil.getBaseLength","tailWidth","neckWidth","headWidth","tailLeft","plotUtil.getThirdPoint","tailRight","headLeft","headRight","assault_Direction_opts","attack_arrow_opts","getAttackArrowHeadPoints","headHeight","headPnt","neckHeight","headEndPnt","neckEndPnt","getAttackArrowBodyPoints","neckLeft","neckRight","allLen","plotUtil.wholeDistance","widthDif","plotUtil.distance","tempLen","leftBodyPnts","rightBodyPnts","plotUtil.getAngleOfThreePoints","w","left","right","concat","tailed_attack_arrow_opts","squadCombatOpts","double_arrow_opts","getArrowPoints","midPnt","plotUtil.mid","midPnt1","midPnt2","arrowPnts","getArrowHeadPoints","neckLeftPoint","neckRightPoint","bodyPnts","getArrowBodyPoints","lPoints","slice","rPoints","reverse","circle_point","plotUtil.wgsToMercator","plotUtil.isClockWise","bonePnts","headPnts","leftPnts","rightPnts","plotUtil.getQBSplinePoints","swallowTailPnt","tailPnts","xmin","xmax","ymin","ymax","tl","tempPoint4","connPoint","leftArrowPnts","rightArrowPnts","linePnt1","linePnt2","symPnt","distance1","distance2","getTempPoint4","dcoordinate","llBodyPnts","lArrowPnts","lrBodyPnts","rlBodyPnts","rArrowPnts","rrBodyPnts","plotUtil.getBezierPoints","plotUtil.getAzimuth","pList","plotUtil.getArcPoints","plotUtil.getCircleCenterOfThreePoints","angle1","angle2","normals","normalPoints","plotUtil.getBisectorNormals","pnt","plotUtil.getCubicValue","rightControl","plotUtil.getCurvePoints","Feature","geojson","isCustom","algorithm","changed","incomingCoords","setCoordinates","getCoordinates","stringify","setProperty","toGeoJSON","internal","meta:type","userProperties","name","imageId","imageUrl","Promise","resolve","hasImage","loadImage","error","image","addImage","create","isValid","updateCoordinate","pathOrLng","lngOrLat","lat","arguments","getCoordinate","addCoordinate","path","lng","splice","removeCoordinate","every","ids","split","parts","ringId","coordId","models","MultiPoint","MultiLineString","MultiPolygon","takeAction","action","idx","tail","join","MultiFeature","model","TypeError","_coordinatesToFeatures","ModeInterface","drawConfig","_ctx","Model","bind","replace","getFeatures","setSelected","setSelectedCoordinates","reduce","c","feature_id","getSelected","getSelectedIds","isSelected","getFeature","select","deselect","deleteFeature","opts","addFeature","clearSelectedFeatures","clearSelected","clearSelectedCoordinates","setActionableState","actions","newSet","actionable","changeMode","eventOpts","updateUIClasses","activateUIButton","setActiveButton","bufferType","newFeature","isInstanceOf","doRender","onSetup","onDrag","onClick","onMouseMove","onMouseDown","onMouseUp","onMouseOut","onKeyUp","onKeyDown","onTouchStart","onTouchMove","onTouchEnd","onTap","onStop","onTrash","onCombineFeature","onUncombineFeature","toDisplayFeatures","eventMapper","eventKeys","modeObject","modeObjectKeys","startOpts","state","key","eh","modeHandler","onCombineFeatures","onUncombineFeatures","toDenseArray","getSource","Constants.sources","cleanup","newHotIds","newColdIds","isDirty","getAllIds","getChangedIds","hot","lastColdCount","cold","parent","coldChanged","renderFeature","source","featureInternal","currentModeRender","setData","_emitSelectionChange","fire","Constants.events","getSelectedCoordinates","coordinate","_deletedFeaturesToEmit","geojsonToEmit","clearChangedIds","Store","renderRequest","_features","_featureIds","_selectedFeatureIds","_selectedCoordinates","_changedFeatureIds","_mapInitialConfig","requestAnimationFrame","refreshSelectedCoordinates","newSelectedCoordinates","silent","createRenderBatch","holdRender","numRenders","setDirty","getAll","coord_path","setFeatureProperty","storeMapConfig","interaction","isEnabled","restoreMapConfig","enable","disable","getInitialConfigValue","target","isOfMetaType","featureTarget","isActiveFeature","isInactiveFeature","noTarget","isVertex","isShiftDown","originalEvent","shiftKey","isEscapeKey","keyCode","isEnterKey","mouseEventPoint","mouseEvent","container","rect","getBoundingClientRect","clientX","clientLeft","clientY","top","clientTop","parentId","selected","createSupplementaryPoints","basePath","subType","supplementaryPoints","user_isCustom","user_coordinates","createVertex","isSelectedPath","processLine","line","lineBasePath","firstPointString","lastVertex","pointIndex","pointPath","String","vertex","midpoints","midpoint","startVertex","endVertex","startCoord","endCoord","ptA","project","ptB","unproject","createMidpoint","stringifiedPoint","selectedPaths","lineIndex","subCoordinates","subFeature","clone","p","_add","sub","_sub","multByPoint","_multByPoint","divByPoint","_divByPoint","mult","_mult","div","_div","rotate","_rotate","rotateAround","_rotateAround","matMult","_matMult","unit","_unit","perp","_perp","round","_round","mag","equals","other","distSqr","angleTo","angleWith","angleWithSep","convert","setTimeout","doubleClickZoom","gj","GeometryCollection","FeatureCollection","normalized","r","geojsonFlatten","geojsonNormalize","_flatten","list","acc","item","traverse","obj","Traverse","walk","root","cb","immutable","parents","alive","walker","node_","node","copy","modifiers","keepGoing","isRoot","level","circular","update","stopHere","remove","before","after","pre","post","block","updateState","objectKeys","isLeaf","notLeaf","notRoot","ret","child","isLast","isFirst","pop","src","dst","toS","Date","getTime","isRegExp","RegExp","isError","message","isBoolean","Boolean","Number","isString","getPrototypeOf","constructor","proto","__proto__","T","ps","init","skip","paths","nodes","xs","args","apply","Extent","_bbox","_valid","include","ll","union","contains","_fastContains","lon","intersect","Function","body","geojsonTypesByDataAttributes","dataAttributes","getExtent","ext","extent","geojsonCoords","some","attribute","geojsonFeatures","delta","northInnerEdge","southInnerEdge","northOuterEdge","southOuterEdge","westEdge","eastEdge","bounds","featureSouthEdge","featureNorthEdge","featureWestEdge","featureEastEdge","constrainedDelta","ceil","constrainFeatureMovement","nextCoordinates","currentCoordinates","moveCoordinate","moveRing","multi","SimpleSelect","dragMoveLocation","boxSelectStartLocation","boxSelectElement","boxSelecting","canBoxSelect","dragMoving","canDragMove","initiallySelectedFeatureIds","fireActionable","fireUpdate","Constants.updateActions","selectedFeatures","multiFeatures","featureType","getUniqueIds","allFeatures","memo","stopExtendedInteractions","parentNode","removeChild","dragPan","CommonSelectors.noTarget","clickAnywhere","CommonSelectors.isOfMetaType","clickOnVertex","CommonSelectors.isFeature","clickOnFeature","wasSelected","Constants.modes","coordPath","startPos","lngLat","startOnActiveFeature","user_editable","isShiftClick","CommonSelectors.isShiftDown","selectedFeatureIds","isFeatureSelected","CommonSelectors.isActiveFeature","boxSelect","button","CommonSelectors.isShiftMousedown","startBoxSelect","getContainer","dragMove","whileBoxSelect","document","createElement","classList","Constants.classes","appendChild","current","minX","maxX","minY","maxY","translateValue","style","transform","WebkitTransform","width","height","stopPropagation","moveFeatures","featuresInBox","idsToSelect","display","featuresCombined","includes","subcoords","multiFeature","createdFeatures","deletedFeatures","featuresUncombined","isMidpoint","DirectSelect","selectedCoordPaths","startDragging","stopDragging","onVertex","about","selectedIndex","selectedCoordinates","pathsToCoordinates","onMidpoint","onFeature","dragFeature","dragVertex","selectedCoords","clickNoTarget","clickInactive","clickActiveFeature","localeCompare","numeric","isFeature","noCoords","DrawPoint","isEventAtCoordinates","Constants.types","stopDrawingAndRemove","isActivePoint","CommonSelectors.isEscapeKey","CommonSelectors.isEnterKey","DrawPolygon","fill-color","line-color","opacity","visible","description","properties-dictionary","label","step","currentVertexPosition","CommonSelectors.isVertex","isActivePolygon","coordinateCount","endPos","lineCoordinates","DrawLineString","direction","lastCoord","lineColor","line-width","lineWidth","isActiveLine","StaticMode","DrawPolygonShape","draw_polygon","algorithmName","fixedPointCount","polygonShapeFractory","DrawPolylineShape","draw_polyline","polylineShapeFractory","DrawText","draw_point","display-type","text-size","text-color","text","DrawImage","appendProperties","appendDictionary","element","default","iconSize","icon-size","then","DrawCamera","camera-url","draw_circle","draw_fine_arrow","draw_ellipse","draw_rectangle","draw_assault_direction","draw_double_arrow","draw_sector","draw_lune","draw_attack_arrow","draw_tailed_attack_arrow","draw_squad_combat","draw_closed_curve","draw_curve","draw_arc","draw_text","draw_image","draw_camera","simple_select","direct_select","draw_line_string","static","static_mode","custom","defaultOptions","defaultMode","keybindings","touchEnabled","displayControlsDefault","paint","layout","text-allow-overlap","icon-allow-overlap","icon-image","text-field","text-font","fill-outline-color","fill-opacity","circle-radius","circle-color","line-cap","line-join","line-dasharray","line-opacity","circle-opacity","controls","showControls","line_string","combine_features","uncombine_features","hideControls","addSources","sourceBucket","xtend","argsTag","mapTag","objectTag","setTag","reIsHostCtor","reIsUint","typedArrayTags","freeGlobal","global","freeSelf","self","freeExports","exports","nodeType","freeModule","moduleExports","freeProcess","process","nodeUtil","binding","nodeIsTypedArray","isTypedArray","arraySome","array","predicate","mapToArray","size","setToArray","uid","func","arrayProto","funcProto","objectProto","coreJsData","funcToString","maskSrcKey","exec","IE_PROTO","nativeObjectToString","reIsNative","Buffer","Symbol","Uint8Array","propertyIsEnumerable","symToStringTag","toStringTag","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeKeys","arg","DataView","getNative","Map","Set","WeakMap","nativeCreate","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","Hash","entries","entry","ListCache","MapCache","SetCache","__data__","Stack","arrayLikeKeys","inherited","isArr","isArg","isArguments","isBuff","isType","skipIndexes","iteratee","baseTimes","isIndex","assocIndexOf","eq","baseGetTag","isOwn","tag","unmasked","getRawTag","objectToString","baseIsArguments","isObjectLike","baseIsEqual","bitmask","customizer","stack","object","equalFunc","objIsArr","othIsArr","objTag","getTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","byteLength","byteOffset","isPartial","stacked","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","getAllKeys","objLength","othLength","skipCtor","objValue","othValue","compared","objCtor","othCtor","equalObjects","baseIsEqualDeep","baseIsNative","isObject","isMasked","isFunction","test","baseKeys","Ctor","arrLength","seen","arrValue","othIndex","keysFunc","symbolsFunc","offset","arrayPush","baseGetAllKeys","getSymbols","getMapData","getValue","hash","string","pairs","LARGE_ARRAY_SIZE","resIndex","arrayFilter","symbol","ArrayBuffer","ctorString","isLength","baseUnary","jsonlint","o","$V0","$V1","$V2","$V3","$V4","$V5","$V6","$V7","$V8","$V9","parser","trace","yy","symbols_","JSONString","STRING","JSONNumber","NUMBER","JSONNullLiteral","NULL","JSONBooleanLiteral","TRUE","FALSE","JSONText","JSONValue","EOF","JSONObject","JSONArray","{","}","JSONMemberList","JSONMember",":",",","[","]","JSONElementList","$accept","$end","terminals_","2","4","6","8","10","11","14","17","18","21","22","23","24","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","$","defineProperty","first_line","enumerable","__duplicateProperties__","table","3","5","7","9","12","13","15","16","1","19","20","25","defaultActions","parseError","str","recoverable","_parseError","msg","input","vstack","lstack","TERROR","lexer","sharedState","setInput","yylloc","yyloc","ranges","newState","expected","lex","token","yyval","errStr","showPosition","match","loc","last_line","first_column","last_column","range","_input","_more","_backtrack","done","matched","conditionStack","ch","unput","lines","substr","oldLines","more","reject","backtrack_lexer","less","pastInput","past","upcomingInput","next","test_match","indexed_rule","backup","matches","tempMatch","rules","_currentRules","flex","begin","condition","popState","conditions","topState","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","INITIAL","inclusive","Parser","console","exit","require$$0","readFileSync","require$$1","normalize","require","main","argv","featureTypes","api","getFeatureIdsAt","getSelectedPoints","featureCollection","renderBatch","toDelete","newIds","newIdsLookup","internalFeature","isEqual","getMode","deleteAll","modeOptions","classTypes","drawUtil","withDefaults","setupOptions","setupAPI","objectToMode","mouseDownInfo","touchStartInfo","currentMode","isDrag","mousedrag","endInfo","touchdrag","buttons","which","getFeaturesAndSetCursor","preventDefault","isKeyModeValid","code","modename","nextModeOptions","eventOptions","modebuilder","setupModeHandler","srcElement","zoomend","changeZoom","dataType","getLayer","setup","addLayers","actionState","addEventListeners","addEventListener","removeEventListeners","off","removeEventListener","buttonElements","activeButton","currentMapClasses","nextMapClasses","classesToRemove","classesToAdd","createControlButton","className","setAttribute","title","deactivateButtons","onDeactivate","onActivate","controlGroup","buttonId","boxZoom","connect","updateLayersZIndexWapepr","updateLayersZIndex","addSource","addLayer","getStyle","moveLayer","removeLayers","removeLayer","removeSource","destroy"],"mappings":"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"}