{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./ts/leaflet/bounds.ts","webpack:///./ts/leaflet/icon.ts","webpack:///./ts/leaflet/components/Map.tsx","webpack:///./ts/trip-planner-entry.ts","webpack:///./ts/trip-planner/trip-planner-loader.tsx","webpack:///./ts/trip-planner/components/TripPlannerPage.tsx"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","11","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","markers","points","map","latLng","latitude","latLngBounds","defaultIconOpts","iconAnchor","iconSize","popupAnchor","icon","opts","iconOpts","icon_anchor","icon_size","popup_anchor","undefined","Icon","iconUrl","iconRetinaUrl","defaultZoomOpts","maxZoom","minZoom","scrollWheelZoom","style","touchAction","memo","bounds","boundsByMarkers","mapData","defaultCenter","polylines","tileServerUrl","zoom","leaflet","FullscreenControl","getBounds","TileLayer","boundsOrByMarkers","position","longitude","mapCenter","nonNullZoom","center","attribution","url","polyline","id","Math","floor","random","positions","color","weight","dashArray","lineCap","lineJoin","marker","icon_opts","ref","markerEl","angle","setRotationAngle","rotateMarker","leafletElement","zIndexOffset","z_index","keyboard","tooltip","maxHeight","onLoad","mapDataEl","document","getElementById","JSON","parse","innerHTML","render","onRemove","dispatch","type","payload","onUpdate","detail","label","toLowerCase","rotation_angle","title","removeMarker","reduce","acc","concat","reducer","state","action","Error","useReducer","useEffect","onRemoveCb","ev","onUpdateCb","addEventListener","removeEventListener"],"mappings":"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","file":"./tripplanner-a3f93c61eeb68ea0dfa0b513250baa8c.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t11: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([538,0,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import { LatLng, latLng, LatLngBounds, latLngBounds } from \"leaflet\";\nimport { MapMarker as Marker } from \"./components/__mapdata\";\n\nconst getBounds = (markers: Marker[]): LatLngBounds => {\n  const points: LatLng[] = markers.map(m => latLng(m.latitude, m.longitude));\n  return latLngBounds(points);\n};\n\nexport default getBounds;\n","import { Icon } from \"leaflet\";\nimport { IconOpts } from \"../leaflet/components/__mapdata\";\n\nexport type IconType = (\n  icon: string | null,\n  opts: IconOpts | undefined\n) => Icon | undefined;\n\ninterface LeafletOpts {\n  iconSize: [number, number];\n  iconAnchor: [number, number];\n  popupAnchor: [number, number];\n}\n\nexport const defaultIconOpts: LeafletOpts = {\n  iconAnchor: [22, 55],\n  iconSize: [45, 75],\n  popupAnchor: [0, -37]\n};\n\nexport default (\n  icon: string | null,\n  opts?: IconOpts | null\n): Icon | undefined => {\n  const iconOpts =\n    opts !== null && opts\n      ? {\n          iconAnchor: opts.icon_anchor || defaultIconOpts.iconAnchor,\n          iconSize: opts.icon_size || defaultIconOpts.iconSize,\n          popupAnchor: opts.popup_anchor || defaultIconOpts.popupAnchor\n        }\n      : defaultIconOpts;\n  return icon === null\n    ? undefined\n    : new Icon({\n        ...iconOpts,\n        iconUrl: `/images/icon-${icon}.svg`,\n        iconRetinaUrl: `/images/icon-${icon}.svg`\n      });\n};\n","import React, { ReactElement } from \"react\";\nimport deepEqual from \"fast-deep-equal\";\nimport {\n  Icon,\n  LatLngBounds,\n  Marker as LeafletMarker,\n  MarkerOptions\n} from \"leaflet\";\nimport Leaflet from \"react-leaflet\";\nimport { MapData, MapMarker, IconOpts } from \"./__mapdata\";\n\nexport interface ZoomOpts {\n  maxZoom: number;\n  minZoom: number;\n  scrollWheelZoom: boolean;\n  style: object;\n}\n\nexport const defaultZoomOpts: ZoomOpts = {\n  maxZoom: 18,\n  minZoom: 9,\n  scrollWheelZoom: false,\n  style: { touchAction: \"none\" } // fix for chrome-android to prevent zooming page\n};\n\ninterface Props {\n  bounds?: LatLngBounds;\n  boundsByMarkers?: boolean;\n  mapData: MapData;\n}\n\nconst mapCenter = (\n  markers: MapMarker[],\n  { latitude, longitude }: { latitude: number; longitude: number }\n): [number, number] | undefined => {\n  if (markers.length === 1) return [markers[0].latitude, markers[0].longitude];\n  return [latitude, longitude];\n};\n\nconst rotateMarker = (\n  markerEl: LeafletMarker<MarkerOptions>,\n  { rotation_angle: angle }: MapMarker\n): void => {\n  // TS does not recognize setRotationAngle, which\n  // is added by the leaflet-rotatedmarker plugin\n  // @ts-ignore\n  markerEl.setRotationAngle(angle);\n};\n\nconst Component = ({\n  bounds,\n  boundsByMarkers,\n  mapData: {\n    default_center: defaultCenter,\n    markers,\n    polylines,\n    tile_server_url: tileServerUrl,\n    zoom\n  }\n}: Props): ReactElement<HTMLElement> | null => {\n  if (typeof window !== \"undefined\" && tileServerUrl !== \"\") {\n    /* eslint-disable */\n    const leaflet: typeof Leaflet = require(\"react-leaflet\");\n    const buildIcon: (\n      icon: string | null,\n      opts?: IconOpts\n    ) => Icon | undefined = require(\"../icon\").default;\n    require(\"leaflet-rotatedmarker\");\n    const FullscreenControl = require(\"react-leaflet-fullscreen\");\n    const getBounds = require(\"../bounds\").default;\n    /* eslint-enable */\n    const { Map, Marker, Polyline, Popup, TileLayer } = leaflet;\n    /* istanbul ignore next */\n    const boundsOrByMarkers = bounds || (boundsByMarkers && getBounds(markers));\n    const position = mapCenter(markers, defaultCenter);\n    const nonNullZoom = zoom === null ? undefined : zoom;\n    return (\n      <Map\n        bounds={boundsOrByMarkers}\n        center={position}\n        zoom={nonNullZoom}\n        {...defaultZoomOpts}\n      >\n        <TileLayer\n          attribution='&amp;copy <a href=\"http://osm.org/copyright\">OpenStreetMap</a> contributors'\n          url={`${tileServerUrl}/osm_tiles/{z}/{x}/{y}.png`}\n        />\n        {polylines.map(\n          /* istanbul ignore next */\n          polyline => (\n            <Polyline\n              key={\n                polyline.id || `polyline-${Math.floor(Math.random() * 1000)}`\n              }\n              positions={polyline.positions}\n              color={polyline.color}\n              weight={polyline.weight}\n              dashArray={polyline[\"dotted?\"] ? \"4px 8px\" : \"none\"}\n              lineCap={polyline[\"dotted?\"] ? \"butt\" : \"round\"}\n              lineJoin={polyline[\"dotted?\"] ? \"miter\" : \"round\"}\n            />\n          )\n        )}\n        {markers.map(marker => (\n          <Marker\n            icon={buildIcon(marker.icon, marker.icon_opts)}\n            key={\n              marker.id ||\n              /* istanbul ignore next */ `marker-${Math.floor(\n                Math.random() * 1000\n              )}`\n            }\n            position={[marker.latitude, marker.longitude]}\n            ref={ref => ref && rotateMarker(ref.leafletElement, marker)}\n            zIndexOffset={marker.z_index}\n            keyboard={false}\n          >\n            {marker.tooltip && <Popup maxHeight={175}>{marker.tooltip}</Popup>}\n          </Marker>\n        ))}\n        <FullscreenControl />\n      </Map>\n    );\n  }\n  return null;\n};\n\nexport default React.memo(Component, deepEqual);\n","import tripPlanner from \"./trip-planner/trip-planner-loader\";\n\ntripPlanner();\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport TripPlannerPage from \"./components/TripPlannerPage\";\nimport { MapData } from \"../leaflet/components/__mapdata\";\n\nconst render = (): void => {\n  const mapDataEl = document.getElementById(\"js-trip-planner-map-data\");\n  if (!mapDataEl) return;\n\n  const mapData = JSON.parse(mapDataEl.innerHTML) as MapData;\n  ReactDOM.render(\n    <TripPlannerPage mapData={mapData} />,\n    document.getElementById(\"react-root\")\n  );\n};\n\nexport const onLoad = (): void => {\n  render();\n};\n\nexport default onLoad;\n","import React, { Dispatch, ReactElement, useReducer, useEffect } from \"react\";\nimport LeafletMap from \"../../leaflet/components/Map\";\nimport {\n  MapData,\n  MapMarker as Marker\n} from \"../../leaflet/components/__mapdata\";\nimport getBounds from \"../../leaflet/bounds\";\n\ninterface Props {\n  mapData: MapData;\n}\n\nexport interface State {\n  markers: Marker[];\n}\n\ninterface UpdateAction {\n  type: \"UPDATE_MARKER\";\n  payload: {\n    marker: Marker;\n  };\n}\n\ninterface RemoveAction {\n  type: \"REMOVE_MARKER\";\n  payload: {\n    id: string;\n  };\n}\n\nexport type Action = UpdateAction | RemoveAction;\n\nexport type RemoveEvent = Event & { detail: { label: string } };\nexport type UpdateEvent = Event & {\n  detail: {\n    latitude: number;\n    longitude: number;\n    label: string;\n    title: string;\n  };\n};\n\nexport const onRemove = (\n  { detail: { label } }: RemoveEvent,\n  dispatch: Dispatch<Action>\n): void => {\n  dispatch({ type: \"REMOVE_MARKER\", payload: { id: label } });\n};\n\nexport const onUpdate = (\n  { detail }: UpdateEvent,\n  dispatch: Dispatch<Action>\n): void => {\n  const marker: Marker = {\n    icon: `map-pin-${detail.label.toLowerCase()}`,\n    id: detail.label,\n    latitude: detail.latitude,\n    longitude: detail.longitude,\n    rotation_angle: 0, // eslint-disable-line camelcase\n    tooltip: <div>{detail.title}</div>\n  };\n\n  dispatch({ type: \"UPDATE_MARKER\", payload: { marker } });\n};\n\nconst removeMarker = (markers: Marker[], id: string | null): Marker[] =>\n  markers.reduce(\n    (acc: Marker[], m: Marker) => (m.id === id ? acc : acc.concat(m)),\n    []\n  );\n\nexport const reducer = (state: State, action: Action): State => {\n  switch (action.type) {\n    case \"UPDATE_MARKER\":\n      return {\n        markers: removeMarker(state.markers, action.payload.marker.id).concat(\n          action.payload.marker\n        )\n      };\n\n    case \"REMOVE_MARKER\":\n      return { markers: removeMarker(state.markers, action.payload.id) };\n\n    default:\n      // @ts-ignore\n      throw new Error(`unexpected action type: ${action.type}`);\n  }\n};\n\nconst TripPlannerPage = ({ mapData }: Props): ReactElement<HTMLElement> => {\n  const [state, dispatch] = useReducer(reducer, { markers: mapData.markers });\n  useEffect(() => {\n    const onRemoveCb = (ev: Event): void =>\n      onRemove(ev as RemoveEvent, dispatch);\n    const onUpdateCb = (ev: Event): void =>\n      onUpdate(ev as UpdateEvent, dispatch);\n\n    document.addEventListener(\"trip-plan:remove-marker\", onRemoveCb);\n    document.addEventListener(\"trip-plan:update-marker\", onUpdateCb);\n\n    return () => {\n      document.removeEventListener(\"trip-plan:remove-marker\", onRemoveCb);\n      document.removeEventListener(\"trip-plan:update-marker\", onUpdateCb);\n    };\n  });\n  const bounds = state.markers.length ? getBounds(state.markers) : undefined;\n\n  return (\n    <LeafletMap\n      bounds={bounds}\n      mapData={{ ...mapData, markers: state.markers }}\n    />\n  );\n};\n\nexport default TripPlannerPage;\n"],"sourceRoot":""}