{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?7e02","webpack:///./src/components/projectList.vue?9015","webpack:///./src/App.vue?acd5","webpack:///./src/components/projectList.vue?81ba","webpack:///src/components/projectList.vue","webpack:///./src/components/projectList.vue?e122","webpack:///./src/components/projectList.vue?4610","webpack:///./src/components/baseMap.vue?1d26","webpack:///src/components/baseMap.vue","webpack:///./src/components/baseMap.vue?9730","webpack:///./src/components/baseMap.vue?5690","webpack:///./src/components/addressSearch.vue?7edc","webpack:///src/components/addressSearch.vue","webpack:///./src/components/addressSearch.vue?3169","webpack:///./src/components/addressSearch.vue?7ad3","webpack:///src/App.vue","webpack:///./src/App.vue?1160","webpack:///./src/App.vue?bff9","webpack:///./src/main.js","webpack:///./src/assets/MapClass.js","webpack:///./src/components/baseMap.vue?e3f0","webpack:///./src/components/addressSearch.vue?79fd"],"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","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","_vm","this","_h","$createElement","_c","_self","attrs","on","openRegionMap","onAddressInputChanged","staticClass","selectedRegionFromMap","selectedProjectFromMap","regions","selectProjectFromSidebar","showAllRegions","clearSelectedData","staticRenderFns","class","selectedRegion","RegionId","filterRegions","isMobileMode","$event","_v","_l","region","RegionTitle","_e","onRegionClick","_s","selectedProject","ProjectId","filterProjects","project","index","ProjectTitle","openProject","Purpose","ProjectPageUrl","MapPdfUrl","Projects","props","Array","String","methods","handleOrientationChange","isMobile","showProjectsInRegion","$emit","syncWidth","mounted","addEventListener","updated","component","ref","onInput","addSearchIcon","onInputChange","e","target","listOfSuggestions","forEach","suggestion","closeAllLists","elmnt","x","addressInput","addIcon","components","projectList","baseMap","AddressSearch","mapControl","regionIds","regionHeaders","showProjects","regionId","projectIdsWithData","projectId","xyObject","openProjectMapClass","openProjectFromMap","projectIdAndData","launchPopup","document","projectListings","Regions","console","log","MapControlClass","Vue","config","productionTip","render","h","App","$mount","GEOCODING_MINIMUM_TEXT_LENGTH_FOR_ADDRESS_SUGGESTIONS","GEOCODING_SUGGESTIONS_URL","GEOCODING_FIND_ADDRESS_URL","REGION_SERVICE_URL","REGION_SERVICE_REGION_ID_FIELD","REGIONS_WITH_PROJECTS_URLS","PROJECTS_SERVICES_PROJECT_ID_FIELD","API_KEY","DEFAULT_MAP_FEATURE_STYLE","fillColor","weight","color","opacity","fillOpacity","DEFAULT_MAP_FEATURE_MOUSEOVER_STYLE","LABEL_STYLE","DEFAULT_REGION_LABEL_STYLE","PROJECT_LABEL_STYLE","DEFAULT_REGION_MAX_LABEL_ZOOM_NUMBER","DEFAULT_PROJECT_MAX_LABEL_ZOOM_NUMBER","REGION_LABEL_CLASS_NAME","PROJECT_LABEL_CLASS_NAME","LABEL_HIGHLIGHT_CLASS_NAME","TOPOGRAPHIC_BASEMAP_ICON","IMAGERY_BASEMAP_ICON","ADDRESS_LOCATION_ICON","DEFAULT_BASEMAP_ID","BASEMAP_INFO","imagery","label","icon","topographic","BasemapChangerButton","map","basemapInfo","_loaded","_map","_basemapInfo","_changingBasemap","basemapChangerDiv","L","DomUtil","basemapIds","keys","basemapIcons","Util","basemapId","basemapStyleElement","createElement","innerHTML","_basemapChangerButtonStyle","replace","head","appendChild","basemapChangerButtonControl","control","position","onAdd","_basemapChangerTemplate","intervalHandle","setInterval","parentElement","_basemapChangerButton","querySelector","DomEvent","_onBasemapChangerButtonClick","evt","stop","clearInterval","addTo","hasClass","_basemapChangerButtonToggleClass","_changeBasemap","removeClass","addClass","indexOf","_basemapLayer","removeLayer","esri","Vector","vectorBasemapLayer","apikey","_basemapLabelLayer","setTimeout","AddressSearcher","apiKey","findAddressUrl","suggestionsUrl","minimumTextLengthForAddressSuggestions","_apiKey","_findAddressUrl","_suggestionsUrl","_minimumTextLengthForAddressSuggestions","text","callbackMethod","mapCenterLatLng","getCenter","post","lng","lat","encodeURIComponent","error","response","y","GeometryUtil","latLng","xyObject1","xyObject2","x1","x2","y1","y2","Math","sqrt","pow","bounds","originalPixel","newPixel","topLeft","min","bottomRight","max","changeInX","changeInY","point","boundsA","boundsB","aMin","aMax","bMin","bMax","intersectsOrOverlaps","aContainedXs","bContainedXs","aContainedYs","bContainedYs","maxDist","aX","aY","bX","bY","dist","aMinMax","bMinMax","minAbXys","minDists","Infinity","a","b","pointXyObject","lineSegmentEndpoint1XyObject","lineSegmentEndpoint2XyObject","A","B","E","AB","BE","AE","AB_BE","AB_AE","DistanceBetweenXyObjects","abs","listOfListsOfXyObjects","Q1","Q2","Q3","Q4","xyObjects","sQ1","sQ2","sQ3","sQ4","thisXyObject","layer","centerXyObject","arrayOfLatLngArray","getLatLngs","_FlattenListOfListOfUnknown","quadrantListsOfListsOfXyObjects","_QuadrantListByXyObject","quadrantListOfListsOfXyObjects","_getCenterOfGeometry","listOfListsOfUnknownListsIn","listOfListsOfUnknownLists","listOfUnknownList","pop","listOfXyObjects","unknownListOrLatLng","LatLngToXyObject","containsXyObject","every","lastXyObject","returnDistance","thisDistance","_shortestDistanceFromPointToLineSegment","firstXyObject","centersAndAreas","f","center","area","len","xy1","xy2","weightedCenterXs","weightedCenterYs","totalArea","centerAndArea","finalCenter","mapDivId","regionSymbolStyle","projectSymbolStyle","regionSymbolMouseoverStyle","projectSymbolMouseoverStyle","regionLabelStyle","projectLabelStyle","_regionSymbolStyle","_projectSymbolStyle","_regionSymbolMouseoverStyle","_projectSymbolMouseoverStyle","trim","toLowerCase","_currentRegionId","tooltipStyleElement","Support","cors","setView","basemapChangerButton","showBasemap","shortestDistance","closestUiLayerWithFeature","_geoJsonLayer","getLayers","uiLayerWithFeature","featureDistance","GetDistanceFromLayerToXyObject","idWithData","_getFeatureId","_getFeatureData","url","returnFields","geometry","withinDistance","query","fields","nearby","XyObjectToLatLng","returnGeometry","run","featureCollection","_","innerHtml","_popup","popup","setLatLng","setContent","openOn","isOpen","closePopup","_idFieldName","feature","properties","_featureShouldBeVisible","setStyle","_labelMarker","labelElement","getElement","classList","contains","add","Browser","ie","opera","edge","bringToFront","_onFeatureMouseInCallback","featureId","latlng","remove","_onFeatureMouseOutCallback","_onFeatureClickCallback","GetCenterOfGeometryFromLayer","zoomNumber","zoomFinishedCallback","once","flyTo","_addressMarker","address","marker","iconUrl","iconSize","iconAnchor","bindTooltip","beyondMaxLabelZoomNumber","getZoom","_maxLabelZoomNumber","eachLayer","_isRemoved","centerOfFeature","_getCenterOfFeatureFromLayer","labelMarkersDataByXs","labelMarkersDataByYs","labelContainer","childNodes","centerLatLng","getLatLng","centerPixel","latLngToLayerPoint","markerBoundsRect","getBoundingClientRect","markerBounds","left","top","right","bottom","labelMarkerData","minX","maxX","minY","maxY","centerXy","overlapDistanceX","overlapDistanceY","overlapIndex","cantMoveCount","moved","overlappingLabelMarkers","maxTries","labelMarkerDataA","labelMarkerDataB","layerPointToLatLng","sort","labelMarkerDataIdsMoved","topA","overlapYDist","canMoveY","id","leftA","overlapXDist","canMoveX","_featureIds","isArray","undefined","_featureData","latLngBounds","geoJsonLayerLayers","layerBounds","getBounds","extend","featureData","labelClassName","divIcon","className","html","bubblingMouseEvents","labelMarker","_labelIsAddedToMap","geoJsonLayerLayer","_hasNoLabelMarker","zoomed","_adjustLabelPlacement","_layerLayer","off","mouseover","_onFeatureMouseOver","mouseout","_onFeatureMouseOut","click","_onFeatureClick","removedLayer","tooltipMarker","isValid","fitBounds","style","callback","hasLayer","options","fetchAllFeatures","_query","geoJSON","idsWithData","onFeatureMouseInCallback","onFeatureMouseOutCallback","onFeatureClickCallback","afterShowCallback","_layerUrl","_onFeatureLayerLoad","_replaceGeoJsonLayer","regionIdsWithData","maxLabelZoomNumber","_show"],"mappings":"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","file":"js/app.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\t\"app\": 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([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./projectList.vue?vue&type=style&index=0&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('AddressSearch',{on:{\"openRegionMap\":_vm.openRegionMap,\"onAddressInputChanged\":_vm.onAddressInputChanged}}),_c('div',{staticClass:\"map-container\"},[_c('projectList',{attrs:{\"selectedRegionFromMap\":this.selectedRegionFromMap,\"selectedProjectFromMap\":this.selectedProjectFromMap,\"regions\":_vm.regions},on:{\"selectProject\":_vm.selectProjectFromSidebar,\"openRegionMap\":_vm.openRegionMap,\"showAllRegions\":_vm.showAllRegions,\"clearSelectedData\":_vm.clearSelectedData}}),_c('baseMap')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:{'project-selected': this.selectedRegion.RegionId, 'hide': !this.filterRegions() || this.filterRegions().length == 0},attrs:{\"id\":\"region-list\",\"data-region\":this.selectedRegionFromMap,\"data-project\":this.selectedProjectFromMap}},[_c('a',{staticClass:\"show-all-regions\",class:{'show': _vm.isMobileMode && _vm.selectedRegionFromMap},attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.clearSelectedData($event)}}},[_vm._v(\" Show All Regions \")]),_vm._l((_vm.filterRegions()),function(region){return _c('div',{key:region.RegionTitle,staticClass:\"region-project\",class:{ 'active': region === _vm.selectedRegion }},[(!_vm.isMobileMode)?_c('a',{staticClass:\"region\",attrs:{\"href\":\"#\",\"id\":region.RegionId},on:{\"click\":function($event){return _vm.onRegionClick(region.RegionId, $event)}}},[_vm._v(\" \"+_vm._s(region.RegionTitle)+\" \"),_c('span',{staticClass:\"fal\",class:{'fa-minus': region === _vm.selectedRegion, 'fa-plus': region !== _vm.selectedRegion }})]):_vm._e(),(_vm.isMobileMode)?_c('span',{staticClass:\"region-span\",attrs:{\"id\":region.RegionId}},[_vm._v(\" \"+_vm._s(region.RegionTitle)+\" \")]):_vm._e(),(!_vm.isMobileMode || (_vm.selectedProject && _vm.selectedProject.ProjectId))?_c('div',{staticClass:\"projects-container\"},[_vm._l((_vm.filterProjects(region)),function(project,index){return _c('div',{key:project.ProjectTitle,staticClass:\"project\",class:{ 'active': project === _vm.selectedProject },attrs:{\"id\":project.ProjectId}},[(!_vm.isMobileMode)?_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.openProject(project.ProjectId, index, $event)}}},[_vm._v(\" \"+_vm._s(project.ProjectTitle)+\" \"),_c('span',{staticClass:\"fal\",class:{'fa-minus': project === _vm.selectedProject, 'fa-plus': project !== _vm.selectedProject }})]):_vm._e(),_c('div',{staticClass:\"project-info\"},[(_vm.isMobileMode)?_c('div',{staticClass:\"title-container\"},[_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){return _vm.openProject(project.ProjectId, index, $event)}}},[_c('i',{staticClass:\"fal fa-times pr-2\"}),_vm._v(\" Close \")]),_c('h4',[_vm._v(_vm._s(project.ProjectTitle))])]):_vm._e(),(!_vm.isMobileMode)?_c('h4',[_vm._v(_vm._s(project.ProjectTitle))]):_vm._e(),_c('p',[_c('strong',[_vm._v(\"Purpose: \")]),_vm._v(\" \"+_vm._s(project.Purpose))]),_c('a',{attrs:{\"href\":project.ProjectPageUrl,\"src\":project.ProjectPageUrl}},[_vm._v(\"View Project Page\")]),(project.MapPdfUrl)?_c('a',{staticClass:\"pdf-link\",attrs:{\"href\":project.MapPdfUrl}},[_vm._v(\"Detailed Project Map (pdf)\")]):_vm._e()])])}),(region.Projects.length === 0)?_c('div',{staticClass:\"project\"},[_c('p',{staticClass:\"no-projects\"},[_vm._v(\"No active projects.\")])]):_vm._e()],2):_vm._e()])})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./projectList.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./projectList.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./projectList.vue?vue&type=template&id=3e49806a&\"\nimport script from \"./projectList.vue?vue&type=script&lang=js&\"\nexport * from \"./projectList.vue?vue&type=script&lang=js&\"\nimport style0 from \"./projectList.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"map\"}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./baseMap.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./baseMap.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./baseMap.vue?vue&type=template&id=747efd3a&scoped=true&\"\nimport script from \"./baseMap.vue?vue&type=script&lang=js&\"\nexport * from \"./baseMap.vue?vue&type=script&lang=js&\"\nimport style0 from \"./baseMap.vue?vue&type=style&index=0&id=747efd3a&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"747efd3a\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"address-search\"},[_c('div',{staticClass:\"autocomplete\"},[_c('input',{ref:\"addressInput\",attrs:{\"id\":\"addressInput\",\"name\":\"addressInput\",\"type\":\"text\",\"placeholder\":\"Enter Address or Zip Code\"},on:{\"input\":function($event){return _vm.onInput($event)}}}),_c('button',{staticClass:\"button\",attrs:{\"id\":\"addressInputLabel\",\"for\":\"addressInput\"},on:{\"click\":_vm.addSearchIcon}},[_vm._v(\"Search\")])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./addressSearch.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./addressSearch.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./addressSearch.vue?vue&type=template&id=f50f3b20&\"\nimport script from \"./addressSearch.vue?vue&type=script&lang=js&\"\nexport * from \"./addressSearch.vue?vue&type=script&lang=js&\"\nimport style0 from \"./addressSearch.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=48dfe544&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport App from './App.vue'\n\nVue.config.productionTip = false\n\nnew Vue({\n render: h => h(App),\n}).$mount('#regions-map')\n","\n const GEOCODING_MINIMUM_TEXT_LENGTH_FOR_ADDRESS_SUGGESTIONS = 4;\n const GEOCODING_SUGGESTIONS_URL = \"https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/suggest?f=json&category=Address,Postal&countyCode=USA&preferredLabelValues=localCity&location={loc}&text={text}&token={token}\"\n const GEOCODING_FIND_ADDRESS_URL = \"https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/findAddressCandidates?f=json&countryCode=USA&category=Address,Postal&outSR=4326&outFields=X,Y&location={loc}&SingleLine={text}&token={token}\"\n const REGION_SERVICE_URL = \"https://services.arcgis.com/DmE6Z8jKWf8lv84J/arcgis/rest/services/ET_Projects_Read_Only/FeatureServer/8\";\n const REGION_SERVICE_REGION_ID_FIELD = \"REGIONID\";\n const REGIONS_WITH_PROJECTS_URLS = {\n \"VAC\": \"https://services.arcgis.com/DmE6Z8jKWf8lv84J/arcgis/rest/services/ET_Projects_Read_Only/FeatureServer/0\",\n \"VAE\": \"https://services.arcgis.com/DmE6Z8jKWf8lv84J/arcgis/rest/services/ET_Projects_Read_Only/FeatureServer/1\",\n \"VAN\": \"https://services.arcgis.com/DmE6Z8jKWf8lv84J/arcgis/rest/services/ET_Projects_Read_Only/FeatureServer/2\",\n \"VAW\": \"https://services.arcgis.com/DmE6Z8jKWf8lv84J/arcgis/rest/services/ET_Projects_Read_Only/FeatureServer/3\",\n \"NCA\": \"https://services.arcgis.com/DmE6Z8jKWf8lv84J/arcgis/rest/services/ET_Projects_Read_Only/FeatureServer/4\",\n \"SCA\": \"https://services.arcgis.com/DmE6Z8jKWf8lv84J/arcgis/rest/services/ET_Projects_Read_Only/FeatureServer/5\",\n \"SCN\": \"https://services.arcgis.com/DmE6Z8jKWf8lv84J/arcgis/rest/services/ET_Projects_Read_Only/FeatureServer/6\",\n \"SCC\": \"https://services.arcgis.com/DmE6Z8jKWf8lv84J/arcgis/rest/services/ET_Projects_Read_Only/FeatureServer/7\",\n \"SCB\": \"https://services.arcgis.com/DmE6Z8jKWf8lv84J/ArcGIS/rest/services/ET_Projects_Charleston_Beaufort_SC_Read_Only/FeatureServer/0\"\n };\n const PROJECTS_SERVICES_PROJECT_ID_FIELD = \"PROJECT_ID\";\n const API_KEY = \"AAPKa0025b841ae84d3bb8b849d26553e3c1nXbSwCOcMgqB0QkNfl3fjGoEfnEpwCJcYksPJzuapD4H5WZdWD-ppnaVjWkcMwTN\";\n const DEFAULT_MAP_FEATURE_STYLE = {\n fillColor: \"#0072CE\",\n weight: 1,\n color: \"#0072CE\",\n opacity: 1,\n fillOpacity: 0.4\n };\n const DEFAULT_MAP_FEATURE_MOUSEOVER_STYLE = {\n weight: 5,\n fillOpacity: 0.7\n };\n const LABEL_STYLE = `\n .label-region {\n text-align: center;\n margin-top: -1em;\n font-family: \"urbano-regular\";\n font-size: 14px;\n }\n\n .label-region div {\n position: relative;\n left: -50%;\n font-family: \"urbano-regular\";\n font-size: 14px;\n }\n\n .label-project {\n text-align: center;\n margin-top: -1em;\n font-family: \"urbano-regular\";\n font-size: 14px;\n }\n\n .label-project div {\n position: relative;\n left: -50%;\n font-family: \"urbano-regular\";\n font-size: 14px;\n } \n `;\n const DEFAULT_REGION_LABEL_STYLE = `\n .label-region {\n font-weight: 700;\n text-transform: uppercase;\n }\n\n .label-region div {\n text-shadow: 0px 0px 4px rgba(255,255,255,1);\n white-space: nowrap;\n }\n\n .label-region.label-highlight div {\n color: #FFFFFF;\n text-shadow: 0px 0px 4px rgba(0, 0, 0, 1);\n }\n `;\n const PROJECT_LABEL_STYLE = `\n .label-project {\n font-weight: 700;\n text-transform: uppercase;\n }\n\n .label-project div {\n text-shadow: 0px 0px 4px rgba(255,255,255,1);\n white-space: nowrap;\n }\n\n .label-project.label-highlight div {\n color: #FFFFFF;\n text-shadow: 0px 0px 4px rgba(0, 0, 0, 1);\n }\n `;\n const DEFAULT_REGION_MAX_LABEL_ZOOM_NUMBER = 5;\n const DEFAULT_PROJECT_MAX_LABEL_ZOOM_NUMBER = 8;\n const REGION_LABEL_CLASS_NAME = \"label-region\";\n const PROJECT_LABEL_CLASS_NAME = \"label-project\"\n const LABEL_HIGHLIGHT_CLASS_NAME = \"label-highlight\";\n const TOPOGRAPHIC_BASEMAP_ICON = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5QgLETcbaqpMzgAAAAd0RVh0QXV0aG9yAKmuzEgAAAAMdEVYdERlc2NyaXB0aW9uABMJISMAAAAKdEVYdENvcHlyaWdodACsD8w6AAAADnRFWHRDcmVhdGlvbiB0aW1lADX3DwkAAAAJdEVYdFNvZnR3YXJlAF1w/zoAAAALdEVYdERpc2NsYWltZXIAt8C0jwAAAAh0RVh0V2FybmluZwDAG+aHAAAAB3RFWHRTb3VyY2UA9f+D6wAAAAh0RVh0Q29tbWVudAD2zJa/AAAABnRFWHRUaXRsZQCo7tInAAAfzUlEQVR4nF2c6Y8kV3bdf/dtEZGZVdXd1c0mh+TMkJJlDzCwR4LsDzL8SX+xMID+AkmANTIkSxas0QjiInHrrZZcIuJt1x/ey+wZN8AmmFXIjHzvLuecey4lxYOWUljXFVUFhCEEjDWkmBAjxJgAxVqLtQ7vHapKzplalRgT3nsAfv1Pv8Z5x83NDc+fP8daS86FUhK1FpxzOOfJOZFSZpomAErOxJTIOZFzJoTAOE4YY6i1EGPEWkcInlqVZVkwxnJ1dUUphWVeECM45wBYloXTaWa73RCCxxhQreSSQCsgqAqyf3yt4ziRUnsgZz1iBFBiXAHBWkOtFWMMwzBgrWW/31NrxbmAIMzzzOs3r9ntdmy3O46HA2KEm5sbrLWoKimuiDEYY7DWICL9cArGCCJCKZV5PpFS5ubmmmEYiDGRUiSEgIiQUsI5TwgDKOSSKbmgqkh/H1WllAKA9eCcIP13tSq1KvOSceeb9D5gjCOnTEkVpF5ur/3cMwwDIKxrxLkWBSllRIRxGhnCwLIsTNNEqYW0tNu8vr7GO9dvqB2GKogIIiACtSrGCNZahmFAlX44M957nPPUWqm1UnLBWYe1lnVdKaVdTi4ZLUqpBSOGMIT2OSZRtVByu+A1RWKq3D8eceeQEhGcdZSilJwwhv6apdZ2GO3GMuu6IgLGWKw1aIWcMy8+eEGMkRQT+/2BnBObumH2CzoGxnGglMIwjMS4UnIGoUcIlFKotWCt4/o6kFIixkgpmd1u1y4jZcQIPgSWZWm3LqBov5CENRbr2/M6Z6lUlnXp6aQY67l/e8ecwaSUEaQdgrEEH7Bi0VpRrYhpJ+mc62mSqLWSUu4PV7DW4qzDe89ut2OcRl68eI6IMC8LX331JYfDkWVZcc5Ra2nvkTM5ZwCMMQhQSwUU5zzGGEqpxBhRbRHiQ2AcR0SEZV7IKQMCQK3td8UIwzBgjEFV+4UZUiqA8PbdA2tWVjWYXDJVW1hpbR98KUylAuCcQxCWZWVdV4wxPR/brZVSCP1GlmUlhMCzZ8/46MOPmMaRq90V+/2e77//Dudamg1haLfTH7qUjHWWaZqw1rIsS3/vlmIlF5ZlxVrDMIykFFHajZecETGUUthut3jvL/lfayt4KIxh5P7hyOG0klQw0w4zDiPQQnhZFtY1IsYyjhNDv3kRQ8oJ52yruMvcQ9VeCpOqYo3Fe0fJhePxyJMnT3h2+wzn3KWYffHFl5zmE2tsdeR8m62j1F4kW2qllCmlYq2jaiXnjKq23xPB+xYlKSfiurZaNI541zqSVgUFZywlFw6HI2/fvsMYj/UTLmwwuS4UzVTNlJrIeSWnBe8dIQSsNcS4siwLtVSc85dcy7mwrgu5pNZeBEBBFO8dKUeGIfD8xS37/R5jPLXAV199wzJH1jVjjCeECWs9YMgpEeOMtUIpEZGK94aUVnywOGcoJVJrRs4psiZSzngXEBUEwYhFELRUFq0cc+HNmwdsCSATdbzi0XlMzAulJsQoxiiqmZIXai0YYy9VP+dMyg0PTNP7/qxVOZ1OPD4+9Nwul+peSsY5yzAEXr78kJwKV1dPyKnw5s0dKRZQwRjLMIxYaym1tvfRgmrFWMF5i1LxziKGC6ZQVXIplFoRTEuvXKhFex0DVFhi4v5wIhWDC1dUv+UkgZP1GCOmV1KDiAHO7UlIqeWm9751AVqnMMZcXuv1h3VZOR4PvWBVVJUQWtVXhZubGz7/7HMeHx+4vX3GvBz59a//qVXvWolrK6jee4xtzzEMwyVFjDHtdaUdklacsTjb/jm35FILKkruhx9z4vHtPetppYaBuNsRhy3VjgQz4ZY1Mg47alGgtDwOAXqBqVVxzjFNE+saexTAOE6X1miMwTnL6TSTUmIcRzabDc5aRGiFqhe5H//kUx7uH1rrq9oiqVRKaT1+sxkxZuit14EI1jiMFIy0dnm+WdORaa2tPogI2+22IVqBeV15/eY1eYmM45a8veFOPKtxgIdVcd6NaBVybeDCh1ZY1hRRbbfbkJdlmkZSsu21GKlaO6qzLRqAeZ45HU+UUi8Aq0HfTE4RYz1X11u2u4nb58847Pc8PDzw/fff85Of/JRxGlpExci6LEh//xaZpkVXj1JoGKIUC1LxwVP7z2spvHr9mtO6sAkbGLbMLrCEDVEHXIatAeesJ2cFFZxriKuk1NFa7elgLqEcQqDWFm7W2EtFdtYhItRameeF0+lIKZlxHC/F1HlDzrHhBtfqy8P9PY/7PaqtZZ1OM+PY0s0YB2ir5rRIKxVMT1U6gBMjWLUNnfZnePPuLfO64IeBJ09eMIsnVSWKUAWqQk3grHWUUvHO4Z1HFeIaUaHXBfofuYSzMYZpGsm5kZSGw9vhTFMLmxhjD/1CrUoYHFBx1vcCVnAu8PLDlzgfeAgPHI9H5nlmsx24ubkhxhPjOCBiOxByiCjVKfn83uWMXxzWOxTh7etXzOtK0cqHLz/AmS1xLoAipeAsmFp5uH/A5VwJfmAIAemhLUY6gNCOsuSSDjnnBiqmCe8F1cpaG2AB33GBwfvAsswsy8I8z+RsEFOZpolxnChFyTkC8PTpU8Zh5KuvvqbWyhpnHh/3PH36lOBHjFiMtCittfb890htqWBEWuqK4ZvvvuX+8RHjLM9ub4klk50lOovNiU3KSJ7JKRN1Rd68+UG32x3WmNbq4ooRxVhL1fpbJMWRcyuKqhUjBh98J0yZlDKmH9y5q4AyzwvrspBrRCRjnWMaN4zjBmdDz2tLLY2U5Zz5u7/7X9w+v+WjDz/i6vrqUuQ2mw0pNoJljMEZ1wueYJzl7f0db969QwXGzcTtixeICD8sjlN2kBKj7ZeGkqzH+TDgnCfFSM6pEYuqVGnFpNFU00OwFSEQlKYDOFfx3uOdZ41rj5wGiIwRNpsJY4R11ZZWCMfjgVKUzQTODWgt1AohNPx+e3vL7e0t02YihEBcI0bMpT2rNsYXjEecBREeD3vu7++BlorPnz9HrOHx8ZEH3VLEsSkFedxTibjdhtWNuHEYUK2UzpOttShy4ejGNBrbimDLNRRSiuSSO1fwWHduSXqhrbVC8J5xmDAGkISIZb8/MJ9OlFzZ7QQwvTYkrBU++/yzhjWcb9jDt2c4kxuExlxtRnDkpfDw9pF0mrEBXry4xY2W13czh8URnSerEtQynxaQxPZ6h2jFeWs4zadWIAwXEmE68NGObsGAVnIqndcHVJswoRVOp8bbhzASUwI94/b2XkFG1hUwws3NMw6HA4fjEYCbJ0+oGhHA+wFrxwvLVFXiGrGu01vvkI47ZtlTlsi77/csDyuewo8+uSZMkX3Zc7c6TvoRWsCQma3jsLkheIOzGwZAlnmvJZcLwLHmnPsttEUMOacL2TnzbiOmPUxXaNZlxTrXimmvBTk3OKu18QNrpfFyaSBmnmfiurbCOE0Yadg++JGcM8Mw4L1v3aSTrxgbLBeE7GeOj5G770/oqtw+H3n60cRJVt7Myv16Q+JlF10yCuRaQBQjFacVt8zLJbdaa61YYzHmrNw0TlBL4/DW2UsoGjGU+v51aNzbWEPwgWnyLMtCzLEpOQWGMLaOocL11Q0H2XM8zuRc2O2uGMexcQRo8pZpFd6p+x1hBoWYC/vHR2KuWBfYPnvGqc4cqjJXYQWKAa8ZS6EaixpHQUALVRMOaa2t4Xo5xzu208zzh15weE+REALrGtFaEZqUVUulaEGLkiVjrLnUjFyartdapL9wjmEYAekdKOF9iyBnHVrbgQKXehBCaCQoZcpSSDHhhoHN9ppTVY5LZjHCKp5iHVkqvmTW+ciKpY47cBbEABVjjCUMgVIKKcZe1BzLujQubdsX0Koo7dZNR4ZnBbdqOyTrbPu5aSLqsizv26VpRbKUc8u0Xe1JXF/fsNtdNSRZGrK01pJLZj41LFFq6RS8hb9zjtPh1OqMwHi95W6ZOVbDoTjW6lHrUamUGlmWE7lkxDqqhQKItRjtvd57j/NNeIwpthtQparivOvyVMFYcxEjgVacEI7HU5Ozh9Cioef+uTV6H5jGDcMwMQxjk9PXhDFNeK1VmTZbpB9gU6CWdug95XJuB7LGlVIKh8cDuRT86KnecFIlu4lsJqqZSElxzjZtMSWePHtGj36cAScV472nBX4TMbwPzPPcQl0aaMippcgQhot601t9j4RMjCt/8Rd/wZvXb3jz5g1//ud/zuPjI7/85S/57rvvGoS2rqG5ArUoIYyAwYgl+IEUy0UmP56ObKYN0zgxTdOlI1nXgNfd/R3ehQa/rzbs40x2jkUdWUdycVjxECNXVzc8uX1JigVbK14LNi0MmnDe+xbi2qq71op3voVLbblofSMaYoQUEzHFJj0bg2gDRSEE/vnX/8zD/QM/+9nPOB1PpJx48+YNf/WXf8WnP/4xf/SHf8T//Ou/5v7+nj/4gz/gh+9/aKJlXHn5wctWa4wwjIGPPvyoyXDWUUslpffDGRHh8eGBlDLDboMLnnXNZBko6lAGvHHkNeFtZV3BhS1xXbFe8DXjNbIzYACcbzQYIOXU+rZvA49c8oXx/Tb1teZ9vqec+Prrr/HB8+/f/Duv37zuQkcDTtvtlq+/+pr7+wfu3t3x1Zdf8cW/fsGXX37Bk6dPeHx4ZJ5n/uEf/oG//Mu/ZJqm1pa1RWapLSrOF5VT5ng6gQjbqyvWnIglYUKg4lB1iDqCONb9kXWtFMC6gK2VQTPXXrgOBhNjxHT9/6zPr+vaFBfnLlg/l9zAibNstpvWt62hoszLyq9+9Tf84hd/yOeff87hcGjUtD1x1/dX3r17x9///f8mxpVp02rByw9e8uz2GVdXVzjn2Gw23NzcMI4T3nuCDx1HcMEnb9+9w4hhGCbEOAqgzlIwVLXUYljnyHbyvH31PQqkDMEJtiQ2pvJktFx5QZblTrWCMQ4jnloNyxwpZQ9SGacJ5zyneaZUbQ82jBgRcincPxy5u3vgeLjnpz/5hMPxnru3r9Fa+fjjT3n1/Wvevn7H55//HjdPn/C3f/u3PHn6lJuba/aPe56/eM67t+8QEb788kuurq/5z7/4L5ehDCIXYaTWFgWvXr1qqvPTn5IHy7tyYhkCKxskX+GrIAWsn3k4fkPYvMDbDaFGbmzhg61llIyWFTkd32gpFRGLcwPODqCG0+kdSsH5phEc5xkjBus8zrfhBMawLInDYUakYiQT49ypa2UaJ4Id0CqknKmqxBTZ7XY468ilSfElF+7u73h8eOSTTz/h+uamSWHWgiprjJfByfF45IdXrxDgR5/+Pm+XhbtaWMNEZETKgMmGwYFxmeP8DmMnpBp2TvlwF7gyGVdXKBF3hvpaCzmtoIpzA+M4gCilVo7HuXMF02d2mdM840PAe8fNzRVxXTgcZmop+OAZhg3WGEIY0No+Y+0DzvOs0ZsGbnLOvHjxgg8++OBSbIWzstx0iXNLPp6OWGP6BRyoRLzbsdQA4lHNqCmc1kg5FWzYYRG8qVwNA6OzkCMURXPFlKKXD6taiGlhjccuR7v3sNeYszBEqZX9fs9+/9jG1ga2m5FpHAhhwFqH9NaWa2WNscFtpOVuGDidTsynmRACm+2W3W53lp7IOVNqbQIobQZpRIgxMs8LxrYpdeaOyrHPDC1aLN4LMT/w3asvSaVg/QYybCzsBo+tFVMVam0ospGdeDn5WitVMykpkgXrHNfX1xznE2ib4tY+el4PbWYnumEcAjfX18S4dhrdWtppf2Q5zTjr2F3tEBFOp1PvKq3AnuHyOI6UUvsUSi5t+YxTcleXc1LsE8sc74llIFcYhpE5QTUrpZwYJuHJ0yccZ7jCsHVKkIopmZoTOa7UnHFn8THnghguCmwbfynOe7bbHbvdjmVZSblArr1AQYmRRSvChiEMDMPYvQCJpG2IWlDG0PDG8XS8cH1j279LLU3Ht67BZa2E/vtNCK2IGA7HYxvidrh+XypRBbWO2MgsJVdurq+42k5teiSeyQvbINgasVRyycQ1glZMLk1vb2HWNQBtPbxJXYnTqeV2CIFhGHqLa+FZa0ZronTGhwqCxfkB5wPOe4y1FG3DDO9DIzbdyCCmDT5rl9FBGUKbSVZVUs79Czf4nVJCOxlLdUMxW9SGpjYZ8DZAsTjxaE5YA1NQvGSsZlRbFFUqiOBMMwJgpFlLzorOWXaS2maDRQvDMHWjQ5PDlxihZIwoWgpaCqUPL6x1WGcYxpFKz7nUkN2ZCdruPVDOSpT2vNf39LyUC0k6C7UiLQIKTylmIoulGEVUeHw4sRtgHDyGym5T2ISKrWcbQKFSka5tOFXtGrzttpJMzpV1bXC3DTZaiiy6tEMYBq6urjHLiTRnRCoiennQlCvWgh8cYRgxzlJSosbUkGWpF4YYUwQF622/gMK8rh1xdmZZCktK2D6SG8LQJklyS8YS1ZAlIcVweFzY3txgnUXNkd02ETRhU0UUlAoC4iylZlzOCWdNH0LQJzp9tteZXfPetG4wLzMxZzbTxHazodiC5hVjm2a/LitrKogxjAyEKXSa3GS1NXYW2QcpJZc+zdHLQbeL6EjUNTU6l9IjxXF1ddXQZb6iWIfxFUNh//DI82cfsgsGoxWre4KPmBQROdtyaKCqJKqCE18Rl8k1UWpGQkUkEgaPYDHOUCtQuyJbKiUtLJoJwTWoan2DmzGTS0KoWOPQEln2K8MYsNZhhoDpbI4uT1nv0NzkqqqtsoyiSKmoNai0QQq1YFTBOmTYcsQTrUcoDHnBENk9m1iq4R4IGHbqeBoLPlXoEyVFsUbIomgtuFQWqmbm5dQOQBSojNMNgqFo7RMi6bkLqBLXBS2ChgkfBqwxxDijWtsYzDYCW0pinQs+DIQ+Aj/T7JQyuYufprvGvHd4o6RWNhCxbcZQFa0ZsR5xgaQOdQIZTE4sj2+5+ehTjklJIggwGMeQVzQVqkr/bu07BO+ppc03OM0Hcm5hIrR5/9kIpZ2ASNf0gUuBTCn38VdjiyF4xnG4uEboYQ2gtV6k9bNF7vJH2l9t6NKmUaWWi9LkfYPNORdUBBcGikKuIMaSi3KcV5Y1QS1YBaeZjXdQMuex1lmubwcdusNElKqZw3HP4+MDirLZjCzLiaoF720fhjRGdrGoQFeNG1k5HI6IGKZpwzCEy0C16X4D1rmmAscICN55pqmN0c+5aYzpg0+5YIJmrHSsy0xRbVwkDMTSIgQjrEWx44ZcKkYLXgsbU9kFwZSM7TOF3+5y58sxVTM5R0ppQ4mUYhMtpbKuM1ULzpk+9iq/MzG+qMl9aLosM/niH2jmhub3ORsYEmt3llU9zx3b36W0CBHTZxEi5BQpvUjPp0bGXBgRa1gLCP1GrccOG1QMTQ7J7BxMRpBakYsvsXWV82FYa3F3d28ZxwnnBKTSlFJhmgKi7b8RaYCnR+z7N2mUWMQ0PcHYrtzQR+L2Amlrrd1lerbDnQcsFhnHbo1p+L/0w0l9TG9dOwwfRnwYKAKpCM4JxoDbbEixOS4dlY0x7JzBacKKQaV95jn9zjjEOYtZlhPGtg9xzjKOA+u6tHmAhZxXlNptL/UidTsfMNLcHeu6UmppokXtPGFdL15iAGdtY4A+NFocY08HsM7hnMX2VlsbA+qRUzns961IGiEME2sCtQFTEzU38cZ0y66lsvWGjYWaEiIOMe5yYfzWJYLgkMo8HwmhhWrKkdTHX+oV8RZnm7tSteKsI7jmLjXOtDli/5JNHG3av71ESbOuGOtwxmA7AWoUvHl2rW0ssZqKFkDbgw7DQMmJN3d3LY+dww0j94tSjcHmEw93d5gQGDdbRuewNRKMEkTQXClFMFZ6jZGL9im9E7lSE0hgGJvhYZ5njDSluNaCEZiXmWCV4Kc2HutvYqxc3B6NRL1ngc34XC63LMbivO+DELqTU94btCy43mmKtppgpXbb3ELJmdsPbzHOsSyZOSpjnsnznqvty26OzNhSyMtMMYExDJQIivzOM2knWbYZvgyn05HD/pF1WfoPBES7PrCiWhpkbV4JtDY8nst7BzlAjCvrujT7jH1vnzkXQVWl5Myyrn3G917opB+EtU1HcB0wPT4+UEphHEe2uy2lVNbYJHajmZfPn6E58dUXX/L48MjgHd4atGS0CsZ4tIe+MeZSCM/irhPTyEtFQXOvyu3BS61NTAwG78Y2ZWn2a4y4C2kyvDcttSL43q5+dnHVUnBjG8WjlVqUVAtqPda5/nCCGIc6i6uF4+meh4cHsgrT9obkNuyjcCxQvEHswGZwPHz3A9/90/9BPnjOp+6nfPX9N2y95Xoztc8WxQXH27dv+eyzz/iX3/wLT58+4eWHH+K6Mt6KVUeB0gekYCi6krLh6uqmMaliQA2KxbiA4Wys1A5amivcGIuQMdL0wFZ5mxPd9i9bciFVRTDd3d0KU+pc+/H+gWVZwFmGm1tmE3jIiVUMauCYKo6Cz4mv/v5v+I//40/49h//jl//33/km2/+nT/+4z/ip599xhdf/xuI5dtvv+WTj3/Mn/3ZL/nTP/3T5lTdDFcENyHqyGtlPWVKErQYRA2GVp1LztSUQTNGCmhEyKie3d4t1Lfb7WWMbZ3FB884jE3DUyV2t3nOhbOJ+Sx3c1YZVFtaHg8YY9iMI89urjE54dLKhsyWyrfff8OiERkc//W//wmvHu6QMXDz4pZf/Lc/RgfP7//8Z7hh4NmzZ3jv+NWv/pqf//zn/OY3v+H169fIMX6v67pQSuR4OnT7SsbY5g8IYWQaNzg7Ms8R7wamaYc1gZQLRsH0KDpb2s9f0Jj3udcmwrX7e1zv8c1dAs197p0HEWJRvv7iXznuH7FW+OTTT9ndPONxSfzwcGS/KveHE2/nBz7++EMGFJ8jTyaPrZnB2dbGncWPA64Iy+F0gezGmounwZVoGPwOfGUIW7bTE5ZlJqZj4wFZGpwuiXVZiNKssNvNFUaUnBRR07uBu+wSaK0Y47rVptntcj67PuhFsmkRpXsPzrbZ/f6B43GPscLV9TVXV1egyjYEPrgStj4RSmS8eoFRxRmYhsDNboclIz2itE/7S61st9uGJWisc55npmnEoY6aFVXBmIHdNLGdbkj5SIxrmxR3BchZS4yJ03GPkWZqAoNWoXamdfbuGft+TH5eyDjvHTU/gsO7vrjUFWO0LU89vHsDVJwfeHp7izgParAYrreW4ByDgd0wcP9wT1DlZpwwuUBNTZQVIeVCKhkvBhkM3lnWGHvHaZKfK7lpfRXtQCZ1ehrYbkauTAMMMUWsWRE5UUrmsN+z2Ram4QYx712iWhXr2nZXg56tDpRuqKpdGjuPzEEIYbjsIB2PRw6P96RUefb8A2yYiNVQqryXyoywLCeePbniJrxA14XJKAEa1NWmLBsVrPFY2xa/csmovkep3nu6uqnkvpbiXMfNme4Woxcsw/XuCbvtNTm3dCilUHLBO4+1riEr7/6/NvgeIIkR4hovg1ZVZZ6PXF89aba7NfLq1Q8Ygeuba66fPkOGiWOB1/eP1KoM3pHjyuF0YleU3SBt+SEXbMkgbZrknWNeF3Iu+LGZv3NKF+KW8/sVPmrNfa+Oiw8w50pKfR/IhQ50Wjh7tyFcbS5WuKYk157jpiM8+o5hU3SaxbYV/qYRtDCdxollXRi0D0vmmZJWPvjRj3HjhlOBb++OLMWQayXPM99/+2/83uc/Zb+cUA1M1mItTTbLqVvrAm4cm5W2qz8YiOvKssx98GtwWnN3X5SLE8zYxsubQtVyvEHWLlwWsFikGmyXo5uGx6Ub0MPxXPyat0jQqjzuH9g/7ptrdNqwLJHgA4+PjxwPR7TMjNNEqsrjkjhmWNWiNpAcTM9fMlvH/elI1QRDwASHc0KurZUWKiZ4qIaSFkTrWXdpo7sQcM7i4rqw2WxYl2Y7kb4MVavpDnCD9sWjlFITKYxFMI045YR1zbfXiuI5irikwpl8QFtcfHh8ZFlWnjx5yrImrPNdOAmE22ccjw8c10SRzOOqrFiyDaRSGKYrwjiSSqRowRilUlhTxXjX0GZVcq247ns8U+Fz293t7GUw45Y1o6yEcSLF1FQXsW1NRRWldAuc4HuxK2RS6nq+a94+VaHkpviefQXOOUotDGEk55VlOeDCyJwy+zlTXasHaX7EizJ6S0qRX3/zPenmQ+zNyEEHVjugIlAN88OJjYOg8HSEZ95gRUkxEktmO0yAEpylrAm/JpJUsjZZLudMyZngmxPGKeciF9uKSy2kFBmGqe0M6fstrS4MUmu5cP2zi9wYc5HOzxtgpbZFR+vaYVzf3JCrEFzg00+eI8Zx9+6e29tbNEU0r1QR/sN/+hlrVTQXxPVbNI51nlkfH9je7BiCZQyBtS9zDSEQnAcjGKRvoZQ+zO3DkN6mz4KOAi6nhBGhVuk7gW0gWkrBiDYPsHGkFFslF9O3Sg0i5RJaZ4X13P+taSt2KTeXp6A4J1g/ME0jQvMbv3n9irdvlMP9PR9/9CE/vHnD7We/j0yB0lAxVloL1BLxVhm8YXCmLUUXxSCMw9CXMJqgcna0XGpS1zNjSoTecmlmT9P9/E2Frf0GGxss3Z6e3o/Hey+21lwUngZhz5hef0c9Pm+VqNJ8xgpDCBwPezZj4PrmiuPhQFVl2m756ONPuDssiJ+oYvtGWMWJcrUZeHa9w0thG+zli282m44p6EbutuFafjt6+0aKXtzsvSNtpg3vlnes68rNdIMAp3kGpdvYmmeoLTC735Gzz1/W9IkyXUYvPUW0eww1gZG+7ARM48CrH17xr//ylh99/AkGmDYTqHI8Lsw1sBSwwXa9Uagpcj0FWBKThcmDQQkuYLrQcb640+kItP8NADRhVLvkfu791jaT1/8DeP70u+3RRP0AAAAASUVORK5CYII=\";\n const IMAGERY_BASEMAP_ICON = \"data:image/png;base64,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\";\n const ADDRESS_LOCATION_ICON = \"data:image/png;base64,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\";\n const DEFAULT_BASEMAP_ID = \"topographic\";\n const BASEMAP_INFO = {\n imagery: { label: \"Imagery\", value: \"ArcGIS:Imagery\", icon: IMAGERY_BASEMAP_ICON },\n topographic: { label: \"Topographic\", value: \"ArcGIS:Topographic\", icon: TOPOGRAPHIC_BASEMAP_ICON }\n };\n class BasemapChangerButton {\n _basemapChangerTemplate = `\n \n `;\n _basemapChangerButtonToggleClass = \"toggle\";\n _basemapChangerButtonStyle = `\n .basemap-changer-button {\n -webkit-filter: opacity(.8);\n -moz-filter: opacity(.8);\n filter: opacity(.8);\n -webkit-transition: all 100ms ease-in;\n -moz-transition: all 100ms ease-in;\n transition: all 100ms ease-in;\n height: 3em;\n color: #FFFFFF;\n cursor: pointer;\n text-align: center;\n text-shadow: 0 0 0.2em #000000;\n width: auto;\n background: url({defaultBasemapImage});\n background-size: cover;\n background-repeat: no-repeat;\n }\n\n .basemap-changer-button.toggle {\n background: url({toggleBasemapImage});\n }\n\n .basemap-changer-button:hover {\n -webkit-filter: opacity(1);\n -moz-filter: opacity(1);\n filter: opacity(1);\n }\n `;\n _basemapInfo;\n _basemapChangerButton;\n _basemapLayer;\n _basemapLabelLayer;\n _changingBasemap;\n _loaded;\n constructor(map, basemapInfo) {\n this._loaded = false;\n this._map = map;\n this._basemapInfo = basemapInfo;\n this._changingBasemap = false;\n //container for button\n const basemapChangerDiv = window.L.DomUtil.create('div', 'basemap-changer');\n const basemapIds = Object.keys(this._basemapInfo);\n const basemapIcons = basemapIds.map(window.L.Util.bind(function (basemapId) { return this._basemapInfo[basemapId].icon; }, this));\n //add basemap changer button styling to window \n const basemapStyleElement = window.document.createElement(\"style\");\n basemapStyleElement.innerHTML = this._basemapChangerButtonStyle.replace(\"{defaultBasemapImage}\", basemapIcons[0]).replace(\"{toggleBasemapImage}\", basemapIcons[1]);\n window.document.head.appendChild(basemapStyleElement);\n //leaflet control to house container and position relative to map\n const basemapChangerButtonControl = window.L.control({ position: \"bottomright\" });\n basemapChangerButtonControl.onAdd = window.L.Util.bind(function () {\n //add button to container\n basemapChangerDiv.innerHTML = this._basemapChangerTemplate;\n //interval to ensure container is added to document before adding event handlers\n const intervalHandle = setInterval(window.L.Util.bind(function () {\n if (basemapChangerDiv.parentElement) {\n this._basemapChangerButton = basemapChangerDiv.querySelector(\".basemap-changer-button\");\n window.L.DomEvent.on(this._basemapChangerButton, \"click dblclick touchend\", window.L.Util.bind(this._onBasemapChangerButtonClick, this));\n //prevent map interaction\n window.L.DomEvent.on(this._basemapChangerButton, \"touchmove touchstart\", function (evt) {\n window.L.DomEvent.stop(evt);\n });\n this._loaded = true;\n clearInterval(intervalHandle);\n }\n }, this), 0);\n //return container which will insert it into the control's container element\n return basemapChangerDiv;\n }, this);\n //adds the control to the map, which triggers control's onAdd above\n basemapChangerButtonControl.addTo(this._map);\n }\n _onBasemapChangerButtonClick(evt) {\n //lock with changing basemap property to handle bug caused by leaflet\n if (this._changingBasemap) {\n return;\n }\n this._changingBasemap = true;\n //prevent map interaction\n window.L.DomEvent.stop(evt);\n //find which way to toggle\n if (window.L.DomUtil.hasClass(this._basemapChangerButton, this._basemapChangerButtonToggleClass)) {\n //if toggle class present, change basemap to FIRST then REMOVE toggle class\n this._changeBasemap(Object.keys(this._basemapInfo)[0]);\n window.L.DomUtil.removeClass(this._basemapChangerButton, this._basemapChangerButtonToggleClass);\n } else {\n //if toggle class NOT present, change basemap to SECOND then ADD toggle class\n this._changeBasemap(Object.keys(this._basemapInfo)[1]);\n window.L.DomUtil.addClass(this._basemapChangerButton, this._basemapChangerButtonToggleClass);\n }\n }\n showBasemap(basemapId) {\n \n this._changeBasemap(basemapId);\n //interval to ensure container is added to document before updating button element's class\n const intervalHandle = setInterval(window.L.Util.bind(function () {\n if (this._loaded) {\n const basemapIds = Object.keys(this._basemapInfo);\n //if toggle class present but basemapId parameter is NOT SECOND in basemap info, REMOVE toggle class \n if (window.L.DomUtil.hasClass(this._basemapChangerButton, this._basemapChangerButtonToggleClass)) {\n if (basemapIds.indexOf(basemapId) < 1) {\n window.L.DomUtil.removeClass(this._basemapChangerButton, this._basemapChangerButtonToggleClass);\n }\n } else {\n //if toggle class NOT present but basemapId parameter is NOT FIRST in basemap info, ADD toggle class \n if (basemapIds.indexOf(basemapId) > 0) {\n window.L.DomUtil.addClass(this._basemapChangerButton, this._basemapChangerButtonToggleClass);\n }\n }\n clearInterval(intervalHandle);\n }\n }, this), 0);\n\n }\n _changeBasemap(basemapId) {\n //remove basemap layer if exists and set null\n if (this._basemapLayer) {\n this._map.removeLayer(this._basemapLayer);\n this._basemapLayer = null;\n }\n //get basemap info from basemapId\n const basemapInfo = this._basemapInfo[basemapId];\n //create basemap layer and add to map\n this._basemapLayer = window.L.esri.Vector.vectorBasemapLayer(basemapInfo.value, { apikey: API_KEY });\n this._basemapLayer.addTo(this._map);\n //remove basemap label layer if exists and set to null\n if (this._basemapLabelLayer) {\n this._map.removeLayer(this._basemapLabelLayer);\n this._basemapLabelLayer = null;\n }\n //unlock changing basemap\n setTimeout(window.L.Util.bind(function () {\n this._changingBasemap = false;\n }, this), 500);\n }\n }\n class AddressSearcher {\n _apiKey;\n _findAddressUrl;\n _suggestionsUrl;\n _minimumTextLengthForAddressSuggestions;\n constructor(apiKey, findAddressUrl = null, suggestionsUrl = null, minimumTextLengthForAddressSuggestions = null) {\n this._apiKey = apiKey;\n this._findAddressUrl = findAddressUrl;\n this._suggestionsUrl = suggestionsUrl;\n this._minimumTextLengthForAddressSuggestions = minimumTextLengthForAddressSuggestions;\n }\n getListOfAddressSuggestions(text, callbackMethod) {\n //do not search for suggestions if text does NOT meet minimum length\n if (text && text.length >= this._minimumTextLengthForAddressSuggestions) {\n //map center used to get better results\n const mapCenterLatLng = this._map.getCenter();\n window.L.esri.post(this._suggestionsUrl.replace(\"{loc}\", mapCenterLatLng.lng + \",\" + mapCenterLatLng.lat).replace(\"{text}\", encodeURIComponent(text)).replace(\"{token}\", this._apiKey), {}, function (error, response) {\n if (error) {\n console.error(error);\n }\n if (response[\"suggestions\"]) {\n //supply list of address suggestions in callback\n callbackMethod(response[\"suggestions\"].map(function (suggestion) {\n return suggestion.text;\n }));\n }\n }, this);\n }\n }\n findAddressLocation(text, callbackMethod) {\n //do not search for addresses if text does NOT meet minimum length\n if (text && text.length >= this._minimumTextLengthForAddressSuggestions) {\n //map center used to get better results\n const mapCenterLatLng = this._map.getCenter();\n window.L.esri.post(this._findAddressUrl.replace(\"{loc}\", mapCenterLatLng.lng + \",\" + mapCenterLatLng.lat).replace(\"{text}\", encodeURIComponent(text)).replace(\"{token}\", this._apiKey), {}, function (error, response) {\n if (error) {\n console.error(error);\n }\n if (response[\"candidates\"] && response[\"candidates\"].length > 0) {\n //return xy location of best matched address (if found) in callback\n callbackMethod({ x: response[\"candidates\"][0][\"location\"][\"x\"], y: response[\"candidates\"][0][\"location\"][\"y\"] });\n }\n }, this);\n }\n }\n }\n class GeometryUtil {\n static XyObjectToLatLng(xyObject) {\n return window.L.latLng(xyObject.y, xyObject.x);\n }\n static LatLngToXyObject(latLng) {\n return { x: latLng.lng, y: latLng.lat };\n }\n static DistanceBetweenXyObjects(xyObject1, xyObject2) {\n const x1 = xyObject1.x;\n const x2 = xyObject2.x;\n const y1 = xyObject1.y;\n const y2 = xyObject2.y;\n return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));\n }\n static GetMovedBounds(bounds, originalPixel, newPixel) {\n //top left as leaflet point\n const topLeft = bounds.min;\n //bottom right as leaflet point\n const bottomRight = bounds.max;\n //get new x - original x and new y - original y\n const changeInX = newPixel.x - originalPixel.x;\n const changeInY = newPixel.y - originalPixel.y;\n //create new bounds adjusting x and y of original by change x and y\n return window.L.bounds(window.L.point(topLeft.x + changeInX, topLeft.y + changeInY), window.L.point(bottomRight.x + changeInX), window.L.point(bottomRight.y + changeInY));\n }\n static GetDistanceBetweenBounds(boundsA, boundsB) {\n //get the min and max points (top left and bottom right)\n const aMin = boundsA.min, aMax = boundsA.max, bMin = boundsB.min, bMax = boundsB.max;\n //test if the 2 bounds intersect or overlap\n const intersectsOrOverlaps = bMax.x >= aMin.x && bMin.x <= aMax.x && bMax.y >= aMin.y && bMin.y <= aMax.y;\n //handle bounds that intersect or overlap differently\n if (intersectsOrOverlaps) {\n //find the xs and ys in each bounds that intersect or overlap\n const aContainedXs = [];\n const bContainedXs = [];\n const aContainedYs = [];\n const bContainedYs = [];\n if (aMax.x >= bMin.x && aMax.x <= bMax.x) {\n aContainedXs.push(aMax.x);\n }\n if (aMin.x >= bMin.x && aMin.x <= bMax.x) {\n aContainedXs.push(aMin.x);\n }\n if (bMax.x >= aMin.x && bMax.x <= aMax.x) {\n bContainedXs.push(bMax.x);\n }\n if (bMin.x >= aMin.x && bMin.x <= aMax.x) {\n bContainedXs.push(bMin.x);\n }\n if (aMax.y >= bMin.y && aMax.y <= bMax.y) {\n aContainedYs.push(aMax.y);\n }\n if (aMin.y >= bMin.y && aMin.y <= bMax.y) {\n aContainedYs.push(aMin.y);\n }\n if (bMax.y >= aMin.y && bMax.y <= aMax.y) {\n bContainedYs.push(bMax.y);\n }\n if (bMin.y >= aMin.y && bMin.y <= aMax.y) {\n bContainedYs.push(bMin.y);\n }\n //using the xs and ys that overlap, find the maximum distance between points created from them\n //(finding maximum to account for negative distance)\n let maxDist = 0;\n aContainedXs.forEach(function (aX) {\n aContainedYs.forEach(function (aY) {\n bContainedXs.forEach(function (bX) {\n bContainedYs.forEach(function (bY) {\n const dist = Math.sqrt(Math.pow(aX - bX, 2) + Math.pow(aY - bY, 2));\n if (dist > maxDist) {\n maxDist = dist;\n }\n });\n });\n });\n });\n return 0 - maxDist;\n } else {\n //find the minimum distance between x and y min and maxes\n const aMinMax = [[aMin.x, aMax.x], [aMin.y, aMax.y]];\n const bMinMax = [[bMin.x, bMax.x], [bMin.y, bMax.y]];\n const minAbXys = [[0, 0], [0, 0]];\n const minDists = [Infinity, Infinity]\n for (let a = 0, b = 2; a < b; a++) {\n const min = minDists[a];\n for (let c = 0, d = 2; c < d; c++) {\n const dist = aMinMax[a][c] > bMinMax[a][c] ? aMinMax[a][c] - bMinMax[a][c] : bMinMax[a][c] - aMinMax[a][c];\n if (dist < min) {\n minDists[a] = dist;\n minAbXys[a] = [aMinMax[a][c], bMinMax[a][c]];\n }\n }\n }\n //find the distance between the minimum distance xs and ys\n return Math.sqrt(Math.pow(minAbXys[0][0] - minAbXys[0][1], 2) + Math.pow(minAbXys[1][0] - minAbXys[1][1], 2));\n }\n }\n static _shortestDistanceFromPointToLineSegment(pointXyObject, lineSegmentEndpoint1XyObject, lineSegmentEndpoint2XyObject) {\n const A = lineSegmentEndpoint1XyObject;\n const B = lineSegmentEndpoint2XyObject;\n const E = pointXyObject;\n const AB = { x: B.x - A.x, y: B.y - A.y };\n const BE = { x: E.x - B.x, y: E.y - B.y };\n const AE = { x: E.x - A.y, y: E.y - A.y };\n const AB_BE = (AB.x * BE.x + AB.y * BE.y);\n const AB_AE = (AB.x * AE.y + AB.y * AE.y);\n if (AB_BE > 0) {\n return GeometryUtil.DistanceBetweenXyObjects(B, pointXyObject);\n } else if (AB_AE < 0) {\n return GeometryUtil.DistanceBetweenXyObjects(A, pointXyObject);\n } else {\n return Math.abs(AB.x * AE.y - AB.y * AE.x) / Math.sqrt(AB.x * AB.x + AB.y * AB.y);\n }\n }\n static _QuadrantListByXyObject(listOfListsOfXyObjects, xyObject) {\n //Q1 - Q4 will be lists of lists of xy objects for each quadrant\n const Q1 = [];\n const Q2 = [];\n const Q3 = [];\n const Q4 = [];\n //loop through the list of lists of xy objects\n listOfListsOfXyObjects.forEach(function (xyObjects) {\n //sQ1 - sQ4 will be lists of xy objects for each quadrant\n const sQ1 = [];\n const sQ2 = [];\n const sQ3 = [];\n const sQ4 = [];\n //iterate through the list xy objects\n xyObjects.forEach(function (thisXyObject) {\n //if the current xy object's X coordinate is LESS than the xy object parameter's X\n if (thisXyObject.x < xyObject.x) {\n //AND the current xy object's Y coordinate is LESS than the xy object parameter's Y\n if (thisXyObject.y < xyObject.y) {\n sQ1.push(thisXyObject);\n }\n //AND the current xy object's Y coordinate is GREATER than the xy object parameter's Y\n else {\n sQ2.push(thisXyObject);\n }\n }\n //if the current xy object's X coordinate is GREATER than the xy object parameter's X\n else {\n //AND the current xy object's Y coordinate is LESS than the xy object parameter's Y\n if (thisXyObject.y < xyObject.y) {\n sQ3.push(thisXyObject);\n }\n //AND the current xy object's Y coordinate is GREATER than the xy object parameter's Y\n else {\n sQ4.push(thisXyObject);\n }\n }\n });\n //if sQ lists contain any points, push to the Q lists\n if (sQ1.length > 0) {\n Q1.push(sQ1);\n }\n if (sQ2.length > 0) {\n Q2.push(sQ2);\n }\n if (sQ3.length > 0) {\n Q3.push(sQ3);\n }\n if (sQ4.length > 0) {\n Q4.push(sQ4);\n }\n });\n //return the quadranted lists of lists of xy objects\n return [Q1, Q2, Q3, Q4];\n }\n static GetQuadrantCenters(layer, centerXyObject) {\n //get lists of lat/lng data from the feature's layer\n const arrayOfLatLngArray = layer.getLatLngs();\n //flatten the lists into list of lists of xy objects\n const listOfListsOfXyObjects = GeometryUtil._FlattenListOfListOfUnknown(arrayOfLatLngArray);\n //split list of lists of xy objects into quadrants using the center xy object\n const quadrantListsOfListsOfXyObjects = this._QuadrantListByXyObject(listOfListsOfXyObjects, centerXyObject);\n //return the center of each quadrant list of lists of xy objects\n return quadrantListsOfListsOfXyObjects.map(window.L.Util.bind(function (quadrantListOfListsOfXyObjects) {\n return GeometryUtil._getCenterOfGeometry(quadrantListOfListsOfXyObjects);\n }, this));\n }\n static _FlattenListOfListOfUnknown(listOfListsOfUnknownListsIn) {\n const listOfListsOfUnknownLists = listOfListsOfUnknownListsIn.slice();\n const listOfListsOfXyObjects = [];\n //coordinates from feature geometry may be a list of lists of points or a list of lists of lists of points (multipart geometry)\n //so if list of lists of points, make into list of lists of lists of points to ensure same structure\n //iterate and flatten into list of points and then build back up to list of lists of lists\n while (listOfListsOfUnknownLists.length > 0) {\n const listOfUnknownList = listOfListsOfUnknownLists.pop();\n //the contents of will be known (points), so iteratively build back up using this list \n const listOfXyObjects = [];\n listOfUnknownList.forEach(function (unknownListOrLatLng) {\n //if list is actually leaflet LatLng object, add xy point to list\n if (unknownListOrLatLng && \"lat\" in unknownListOrLatLng && \"lng\" in unknownListOrLatLng) {\n listOfXyObjects.push(GeometryUtil.LatLngToXyObject(unknownListOrLatLng));\n }\n //otherwise add the list to list of lists of unknown\n else {\n listOfListsOfUnknownLists.push(unknownListOrLatLng);\n }\n });\n //if points were collected this iteration, then add to output list of lists of points\n if (listOfXyObjects.length > 0) {\n listOfListsOfXyObjects.push(listOfXyObjects);\n }\n }\n //return the processed list of lists of xy objects\n return listOfListsOfXyObjects;\n }\n static _polygonContainsXyObject(listOfListsOfXyObjects, xyObject) {\n let containsXyObject = false;\n listOfListsOfXyObjects.every(function (listOfXyObjects) {\n containsXyObject = false;\n //let last xy object hold the xy object from the previous iteration of the below loop\n let lastXyObject = null;\n //algorithm to find if point is inside\n listOfXyObjects.every(function (thisXyObject) {\n //if this is the first iteration, just set last xy object\n if (!lastXyObject) {\n lastXyObject = listOfXyObjects[listOfXyObjects.length - 1];\n }\n if (((thisXyObject.y > xyObject.y) !== (lastXyObject.y > xyObject.y)) && (xyObject.x < (lastXyObject.x - thisXyObject.x) * (xyObject.y - thisXyObject.y) / (lastXyObject.y - thisXyObject.y) + thisXyObject.x)) {\n containsXyObject = !containsXyObject;\n }\n //set the last xy object equal to the current xy object to set up for the next iteration\n lastXyObject = thisXyObject;\n });\n if (containsXyObject) {\n return false;\n }\n return true;\n });\n return containsXyObject;\n }\n static GetDistanceFromLayerToXyObject(layer, xyObject) {\n //if the layer parameter is null or undefined return Infinity\n if (!layer) {\n return Infinity;\n }\n //get lists of lat/lng data from the feature's layer\n const arrayOfLatLngArray = layer.getLatLngs();\n //if the method doesn't return an array, return Infinity (this should not happen)\n if (!(arrayOfLatLngArray instanceof Array)) {\n return Infinity;\n }\n //flatten the lists into list of lists of xy objects\n const listOfListsOfXyObjects = GeometryUtil._FlattenListOfListOfUnknown(arrayOfLatLngArray);\n //variable to indicate if the polygon contains the element\n let containsXyObject = false;\n //let the return distance equal infinity to start, replacing with shorter distances when found\n let returnDistance = Infinity;\n //loop through the list of lists of xy objects\n listOfListsOfXyObjects.every(function (listOfXyObjects) {\n //set contains xy object to false for this sub polygon\n containsXyObject = false;\n //let last xy object hold the xy object from the previous iteration of the below loop\n let lastXyObject = null;\n //iterate through the list xy objects\n listOfXyObjects.forEach(function (thisXyObject) {\n //set last xy object to last xy object in array if null \n if (!lastXyObject) {\n lastXyObject = listOfXyObjects[listOfXyObjects.length - 1];\n }\n //algorithm section to test if sub polygon contains the xy object\n if (((thisXyObject.y > xyObject.y) !== (lastXyObject.y > xyObject.y)) && (xyObject.x < (lastXyObject.x - thisXyObject.x) * (xyObject.y - thisXyObject.y) / (lastXyObject.y - thisXyObject.y) + thisXyObject.x)) {\n containsXyObject = !containsXyObject;\n }\n //get the distance from the xy object to the line segment formed from last xy object and this xy object\n const thisDistance = GeometryUtil._shortestDistanceFromPointToLineSegment(xyObject, lastXyObject, thisXyObject);\n //if the distance returned is less than the return distance, make this new distance the return distance\n if (thisDistance < returnDistance) {\n returnDistance = thisDistance;\n }\n //set the last xy object equal to the current xy object to set up for the next iteration\n lastXyObject = thisXyObject;\n });\n //if the polygon contains the xy object end iteration and return 0 distance\n if (containsXyObject) {\n return false;\n }\n });\n //return the shortest distance between the xy object parameter and the feature's layer\n //if the polygon contains the xy object return 0\n return containsXyObject ? 0 : returnDistance;\n }\n static _getCenterOfGeometry(listOfListsOfXyObjects) {\n //fist xy object will be used if the geometry has no area\n let firstXyObject;\n //find center point and area for each part\n const centersAndAreas = [];\n listOfListsOfXyObjects.forEach(function (xyObjects) {\n let f, center, x = 0, y = 0, area = 0;\n const len = xyObjects.length;\n for (let i = 0, j = len - 1; i < len; j = i++) {\n const xy1 = xyObjects[i];\n const xy2 = xyObjects[j];\n if (!firstXyObject) {\n firstXyObject = xy1;\n }\n f = xy1.y * xy2.x - xy2.y * xy1.x;\n x += (xy1.x + xy2.x) * f;\n y += (xy1.y + xy2.y) * f;\n area += f * 3;\n }\n\n if (area !== 0) {\n center = { x: x / area, y: y / area };\n centersAndAreas.push({ center: center, area: area });\n }\n\n });\n //if only singlepart geometry (only one center), return center\n if (centersAndAreas.length === 1) {\n return centersAndAreas[0].center;\n }\n //if multipart geometry combine center points by weighting each part's area\n let weightedCenterXs = 0, weightedCenterYs = 0, totalArea = 0;\n centersAndAreas.forEach(function (centerAndArea) {\n weightedCenterXs += centerAndArea.center.x * centerAndArea.area;\n weightedCenterYs += centerAndArea.center.y * centerAndArea.area;\n totalArea += centerAndArea.area;\n });\n //account multipart geometry without area (e.g. all points at same location)\n if (totalArea === 0) {\n return firstXyObject;\n }\n //finish computing weigted center\n const finalCenter = { x: weightedCenterXs / totalArea, y: weightedCenterYs / totalArea };\n return finalCenter;\n }\n static GetCenterOfGeometryFromLayer(layer) {\n //get lists of lat/lng data from the feature's layer\n const arrayOfLatLngArray = layer.getLatLngs();\n //flatten the lists into list of lists of xy objects\n const listOfListsOfXyObjects = GeometryUtil._FlattenListOfListOfUnknown(arrayOfLatLngArray);\n //call private method to do the rest of the work\n return GeometryUtil._getCenterOfGeometry(listOfListsOfXyObjects);\n }\n }\n // eslint-disable-next-line no-unused-vars\n class MapControlClass extends AddressSearcher {\n _regionSymbolStyle;\n _regionSymbolMouseoverStyle;\n _projectSymbolStyle;\n _projectSymbolMouseoverStyle;\n _map;\n _idFieldName;\n _featureIds;\n _featureData;\n _currentRegionId;\n _geoJsonLayer;\n _layerUrl;\n _addressMarker;\n _onFeatureMouseInCallback;\n _onFeatureMouseOutCallback;\n _onFeatureClickCallback;\n constructor(mapDivId, basemapId = null, regionSymbolStyle = null, projectSymbolStyle = null, regionSymbolMouseoverStyle = null, projectSymbolMouseoverStyle = null, regionLabelStyle = null, projectLabelStyle = null) {\n //call constructor of super class AddressSearcher\n super(API_KEY, GEOCODING_FIND_ADDRESS_URL, GEOCODING_SUGGESTIONS_URL, GEOCODING_MINIMUM_TEXT_LENGTH_FOR_ADDRESS_SUGGESTIONS);\n //allow constructor parameters to override defaults if preset\n this._regionSymbolStyle = regionSymbolStyle || DEFAULT_MAP_FEATURE_STYLE;\n this._projectSymbolStyle = projectSymbolStyle || DEFAULT_MAP_FEATURE_STYLE;\n this._regionSymbolMouseoverStyle = regionSymbolMouseoverStyle || DEFAULT_MAP_FEATURE_MOUSEOVER_STYLE;\n this._projectSymbolMouseoverStyle = projectSymbolMouseoverStyle || DEFAULT_MAP_FEATURE_MOUSEOVER_STYLE;\n regionLabelStyle = regionLabelStyle || DEFAULT_REGION_LABEL_STYLE;\n projectLabelStyle = projectLabelStyle || PROJECT_LABEL_STYLE;\n //account for casing issues\n basemapId = basemapId.trim().toLowerCase() || DEFAULT_BASEMAP_ID;\n //if basemapId parameter passed is not within basemap info, set to default\n if (Object.keys(BASEMAP_INFO).indexOf(basemapId) < 0) {\n basemapId = DEFAULT_BASEMAP_ID;\n }\n //default current region id to null\n this._currentRegionId = null;\n //add label styling to window, putting new line between style variables\n const tooltipStyleElement = window.document.createElement(\"style\");\n tooltipStyleElement.innerHTML = LABEL_STYLE + `\n ` + regionLabelStyle + `\n ` + projectLabelStyle;\n window.document.head.appendChild(tooltipStyleElement);\n window.L.esri.Support.cors = false;\n //create map\n this._map = window.L.map(mapDivId).setView([37.35, -77.75], 8);\n //add basemap toggle button\n const basemapChangerButton = new BasemapChangerButton(this._map, BASEMAP_INFO);\n //show basemap corresponding to basemapId\n basemapChangerButton.showBasemap(basemapId);\n }\n getClosestFeatureToXY(xyObject, callbackMethod) {\n setTimeout(window.L.Util.bind(function () {\n //set shortest distance to infinity loop through features testing if distance less than shortest to identify closest feature\n let shortestDistance = Infinity;\n let closestUiLayerWithFeature = null;\n this._geoJsonLayer.getLayers().map(window.L.Util.bind(function (uiLayerWithFeature) {\n const featureDistance = GeometryUtil.GetDistanceFromLayerToXyObject(uiLayerWithFeature, xyObject);\n if (featureDistance < shortestDistance) {\n //set shortest distance to this feature's distance\n shortestDistance = featureDistance;\n //set closest feature's id to this feature's id\n closestUiLayerWithFeature = uiLayerWithFeature;\n }\n }, this));\n //populate return data with closest feature's id and data\n const idWithData = {};\n idWithData[this._getFeatureId(closestUiLayerWithFeature)] = this._getFeatureData(closestUiLayerWithFeature);\n //return data in callback\n return callbackMethod(idWithData)\n }, this));\n }\n _query(url, returnFields, geometry, withinDistance, callbackMethod) {\n //executes a query to ArcGIS Service using supplied parameters\n //callback will get feature collection returned from query\n if (geometry) {\n //search by location/geometry, distance parameter may be passed to buffer the search location \n window.L.esri.query({ url: url }).fields(returnFields).nearby(GeometryUtil.XyObjectToLatLng(geometry), withinDistance).returnGeometry(false).run(function (error, featureCollection, _) {\n if (error) {\n console.error(error);\n console.log(_)\n\n }\n callbackMethod(featureCollection);\n });\n } else {\n //search by url alone\n window.L.esri.query({ url: url }).fields(returnFields).returnGeometry(true).run(function (error, featureCollection, _) {\n if (error) {\n console.error(error);\n console.log(_)\n }\n callbackMethod(featureCollection);\n return;\n });\n }\n }\n showPopup(xyObject, innerHtml) {\n //if popup object doesn't exist, create it\n if (!this._popup) {\n this._popup = window.L.popup();\n }\n //show popup at lat/lng from xyObject with content of innerHtml parameter\n this._popup.setLatLng(GeometryUtil.XyObjectToLatLng(xyObject)).setContent(innerHtml).openOn(this._map);\n }\n hidePopup() {\n //ensure popup exists and is open\n if (this._popup && this._popup.isOpen()) {\n //close popup removes the popup layer from the map\n this._map.closePopup(this._popup);\n }\n }\n _getFeatureId(uiLayerWithFeature) {\n //get feature id if exists\n return this._idFieldName && uiLayerWithFeature && uiLayerWithFeature.feature && uiLayerWithFeature.feature.properties ? uiLayerWithFeature.feature.properties[this._idFieldName] : null;\n }\n _onFeatureMouseOver(e) {\n let uiLayerWithFeature = e.target;\n //ensure symbology is NOT changed and callback is NOT called if the feature is hidden\n if (!this._featureShouldBeVisible(uiLayerWithFeature.feature)) {\n return;\n }\n //apply highlighted style to the feature\n //set the style of the layer (feature) based on the id field's name (so region can be styled differently than projects)\n if (this._idFieldName === REGION_SERVICE_REGION_ID_FIELD) {\n uiLayerWithFeature.setStyle(this._regionSymbolMouseoverStyle);\n } else {\n uiLayerWithFeature.setStyle(this._projectSymbolMouseoverStyle);\n }\n //if the feature has a label marker, add the label highlight class from the label marker\n if (uiLayerWithFeature._labelMarker) {\n let labelElement = uiLayerWithFeature._labelMarker.getElement();\n if (!labelElement.classList.contains(LABEL_HIGHLIGHT_CLASS_NAME)) {\n labelElement.classList.add(LABEL_HIGHLIGHT_CLASS_NAME);\n }\n }\n //depending on browser, need to bring feature's layer to the front for visibility of new symbology\n if (!window.L.Browser.ie && !window.L.Browser.opera && !window.L.Browser.edge) {\n uiLayerWithFeature.bringToFront();\n }\n //if callback passed to \"show\" method, get feature's id and event's lat/lon and return in callback\n if (this._onFeatureMouseInCallback) {\n let featureId = this._getFeatureId(uiLayerWithFeature);\n this._onFeatureMouseInCallback(featureId, GeometryUtil.LatLngToXyObject(e.latlng));\n }\n }\n _onFeatureMouseOut(e) {\n let uiLayerWithFeature = e.target;\n //ensure symbology is NOT changed and callback is NOT called if the feature is hidden\n if (!this._featureShouldBeVisible(uiLayerWithFeature.feature)) {\n return;\n }\n //apply non-highlighted style to the feature\n //set the style of the layer (feature) based on the id field's name (so region can be styled differently than projects)\n if (this._idFieldName === REGION_SERVICE_REGION_ID_FIELD) {\n uiLayerWithFeature.setStyle(this._regionSymbolStyle);\n } else {\n uiLayerWithFeature.setStyle(this._projectSymbolStyle);\n }\n //if the feature has a label marker, remove the label highlight class from the label marker\n if (uiLayerWithFeature._labelMarker) {\n let labelElement = uiLayerWithFeature._labelMarker.getElement();\n if (labelElement.classList.contains(LABEL_HIGHLIGHT_CLASS_NAME)) {\n labelElement.classList.remove(LABEL_HIGHLIGHT_CLASS_NAME);\n }\n }\n //if callback passed to \"show\" method, get feature's id and event's lat/lon and return in callback\n if (this._onFeatureMouseOutCallback) {\n let featureId = this._getFeatureId(uiLayerWithFeature);\n this._onFeatureMouseOutCallback(featureId, GeometryUtil.LatLngToXyObject(e.latlng));\n }\n }\n _onFeatureClick(e) {\n //if callback passed to \"show\" method, get feature's id and event's lat/lon and return in callback\n if (this._onFeatureClickCallback) {\n let uiLayerWithFeature = e.target;\n //ensure callback is NOT called if the feature is hidden\n if (!this._featureShouldBeVisible(uiLayerWithFeature.feature)) {\n return;\n }\n let featureId = this._getFeatureId(uiLayerWithFeature);\n this._onFeatureClickCallback(featureId, GeometryUtil.LatLngToXyObject(e.latlng));\n }\n }\n get currentRegionId() {\n //return the current region id\n return this._currentRegionId;\n }\n get isMapShowingRegions() {\n //if the id field name matches the region service id field name constant then yes, else no\n return this._idFieldName === REGION_SERVICE_REGION_ID_FIELD;\n }\n get isMapShowingProjects() {\n //if the id field name matches the project services id field name constant then yes, else no\n return this._idFieldName === PROJECTS_SERVICES_PROJECT_ID_FIELD;\n }\n _getCenterOfFeatureFromLayer(layer) {\n //pass feature's layer to GeometryUtil static GetCenterOfGeometryFromLayer method\n return GeometryUtil.GetCenterOfGeometryFromLayer(layer);\n }\n zoomTo(xyObject, zoomNumber, zoomFinishedCallback = null) {\n setTimeout(window.L.Util.bind(function () {\n //if a callback was passed call it when zoom ends\n if (zoomFinishedCallback) {\n this._map.once(\"zoomend\", window.L.Util.bind(function () {\n zoomFinishedCallback();\n }, this));\n }\n //zoom to the xy location at the scale specified by the zoom number\n this._map.flyTo(GeometryUtil.XyObjectToLatLng(xyObject), zoomNumber);\n }, this));\n }\n removeAddressLocationIcon() {\n //remove the previously added address marker (icon) if it exists\n if (this._addressMarker) {\n this._addressMarker.remove();\n }\n }\n addAddressLocationIcon(xyObject, address) {\n //if existing icon exists, remove it\n if (this._addressMarker) {\n this._addressMarker.remove();\n }\n //create a new address marker (icon) using icon url from consts and xyObject parameter and add it to the map\n this._addressMarker = window.L.marker(GeometryUtil.XyObjectToLatLng(xyObject), {\n icon: window.L.icon({\n iconUrl: ADDRESS_LOCATION_ICON,\n iconSize: [42, 64],\n iconAnchor: [21, 64]\n })\n }).addTo(this._map);\n //if address parameter, add label to address marker\n if (address) {\n this._addressMarker.bindTooltip(address);\n }\n }\n _adjustLabelPlacement() {\n //test if the current zoom number is less than the max label zoom number\n const beyondMaxLabelZoomNumber = this._map.getZoom() < this._maxLabelZoomNumber;\n //reset original label location\n this._geoJsonLayer.eachLayer(window.L.Util.bind(function (layer) {\n if (layer._labelMarker) {\n //if beyond max label zoom number\n if(beyondMaxLabelZoomNumber){\n //if not already removed\n if(!layer._labelMarker._isRemoved){\n //remove label\n layer._labelMarker.remove();\n layer._labelMarker._isRemoved = true;\n }\n } else {\n //otherwise\n //if label has been removed from map\n if(layer._labelMarker._isRemoved){\n //add back\n layer._labelMarker.addTo(this._map);\n layer._labelMarker._isRemoved = false;\n }\n //then get the center of the feature (which is where the label will be placed)\n let centerOfFeature = this._getCenterOfFeatureFromLayer(layer);\n //set label to show at center\n layer._labelMarker.setLatLng({ lat: centerOfFeature.y, lng: centerOfFeature.x });\n }\n }\n }, this));\n //top and bottom reversed in this method for ease of thought\n //put label marker datas in 2 arrays, one to be sorted by X, one by Y\n const labelMarkersDataByXs = [];\n const labelMarkersDataByYs = []\n //loop through layers and add label marker data to arrays if layer contains label marker\n this._geoJsonLayer.eachLayer(window.L.Util.bind(function (layer) {\n if (layer._labelMarker) {\n //the label's containing element\n const labelContainer = layer._labelMarker.getElement();\n //test to ensure the label has drawn properly (cannot perform adjustment if not)\n if (labelContainer && labelContainer.childNodes && labelContainer.childNodes.length > 0) {\n //center coordinates will be used to move overlapping markers\n const centerLatLng = layer._labelMarker.getLatLng();\n const centerPixel = this._map.latLngToLayerPoint(centerLatLng);\n //bounds will be used to determine if markers overlap\n const markerBoundsRect = layer._labelMarker.getElement().childNodes[0].getBoundingClientRect();\n //convert to leaflet bounds and add padding\n const markerBounds = window.L.bounds(window.L.point(markerBoundsRect.left - 1, markerBoundsRect.top - 1), window.L.point(markerBoundsRect.right + 1, markerBoundsRect.bottom + 1));\n //label marker data object to contain many properties for use in detecting and removing overlap\n const labelMarkerData = { minX: markerBounds.min.x, maxX: markerBounds.max.x, minY: markerBounds.min.y, maxY: markerBounds.max.y, marker: layer._labelMarker, centerXy: centerPixel, bounds: markerBounds, overlapDistanceX: 0, overlapDistanceY: 0, overlapIndex: 0, cantMoveCount: 0, moved: false };\n //add label marker data to each array\n labelMarkersDataByXs.push(labelMarkerData);\n labelMarkersDataByYs.push(labelMarkerData);\n }\n }\n }, this));\n //overlapping arrays to be iteratively re-populated\n let overlappingLabelMarkers = [];\n let maxTries = 0;\n do {\n if (++maxTries > 10) {\n break;\n }\n //set array to empty array to start empty for this iteration\n overlappingLabelMarkers = [];\n //index to identify A and B in list where 2 others may have same distance\n let overlapIndex = 0;\n //loop through label markers to find overlaps and add to overlap array\n for (let a = 0; a < labelMarkersDataByXs.length - 1; a++) {\n for (let b = a + 1; b < labelMarkersDataByXs.length; b++) {\n //testing between A and B for overlap\n const labelMarkerDataA = labelMarkersDataByXs[a];\n const labelMarkerDataB = labelMarkersDataByXs[b];\n //overlap X distance\n const overlapDistanceX = labelMarkerDataA.minX < labelMarkerDataB.minX ? labelMarkerDataA.maxX - labelMarkerDataB.minX : labelMarkerDataB.maxX - labelMarkerDataA.minX;\n //overlap Y distance\n const overlapDistanceY = labelMarkerDataA.minY < labelMarkerDataB.minY ? labelMarkerDataA.maxY - labelMarkerDataB.minY : labelMarkerDataB.maxY - labelMarkerDataA.minY;\n //if overlap X and Y > 0 and has been tried to be moved < 5 times...\n if (overlapDistanceX > 0 && overlapDistanceY > 0 && labelMarkerDataA.cantMoveCount < 5 && labelMarkerDataB.cantMoveCount < 5) {\n //then set overlap X property on A and B...\n labelMarkerDataA.overlapDistanceX = overlapDistanceX;\n labelMarkerDataB.overlapDistanceX = overlapDistanceX;\n //then set overlap Y property on A and B...\n labelMarkerDataA.overlapDistanceY = overlapDistanceY;\n labelMarkerDataB.overlapDistanceY = overlapDistanceY;\n //and set index (in case another A and B have same distance)\n labelMarkerDataA.overlapIndex = ++overlapIndex;\n labelMarkerDataB.overlapIndex = overlapIndex;\n //add both A and B to overlapping array\n overlappingLabelMarkers.push(labelMarkerDataA);\n overlappingLabelMarkers.push(labelMarkerDataB);\n }\n }\n }\n if (overlappingLabelMarkers.length < 1) {\n //if needs moving, move\n labelMarkersDataByXs.forEach(window.L.Util.bind(function (labelMarkerData) {\n if (labelMarkerData.moved) {\n labelMarkerData.marker.setLatLng(this._map.layerPointToLatLng(labelMarkerData.centerXy));\n }\n }, this));\n return;\n }\n //sort by index (to get correctly identified pairs)\n overlappingLabelMarkers.sort(function (a, b) { return a.overlapIndex === b.overlapIndex ? 0 : a.overlapIndex < b.overlapIndex ? -1 : 1; });\n //sort by X for efficiency\n labelMarkersDataByXs.sort(function (a, b) { return a.minX === b.minX ? 0 : a.minX < b.minX ? -1 : 1; });\n //array to hold markers moved by Y, to avoid testing for moving by X later\n const labelMarkerDataIdsMoved = [];\n //loop through overlap Ys to see if can move Y\n for (let a = 0; a < overlappingLabelMarkers.length - 1; a += 2) {\n const b = a + 1;\n //try first being A then second being A\n for (let c = 0; c < 2; c++) {\n const labelMarkerDataA = overlappingLabelMarkers[c === 0 ? a : b];\n const labelMarkerDataB = overlappingLabelMarkers[c === 0 ? b : a];\n //if A is above B then try to move up rather than down\n const topA = labelMarkerDataA.minY > labelMarkerDataB.minY;\n //get the overlap X distance (distance may have changed from label marker data properties)\n const overlapYDist = topA ? labelMarkerDataB.maxY - labelMarkerDataA.minY : labelMarkerDataA.maxY - labelMarkerDataB.minY;\n if (overlapYDist <= 0) {\n break;\n }\n //assume can move unless tests prove otherwise\n let canMoveY = true;\n //loop through array of label marker datas sorted by X\n labelMarkersDataByXs.every(function (labelMarkerData) {\n //break once this min X > A's max X as array is sorted and this is now out of bounds for tests\n if (labelMarkerData.minX > labelMarkerDataA.maxX) {\n return false;\n }\n //continue if this label marker data is equal to label marker data A or B\n if (labelMarkerData.marker.id === labelMarkerDataA.marker.id || labelMarkerData.marker.id === labelMarkerDataB.marker.id) {\n return true;\n }\n //if this min or max X overlaps A's min or max X test if can move Y\n if ((labelMarkerData.minX <= labelMarkerDataA.minX && labelMarkerData.maxX >= labelMarkerDataA.minX) || (labelMarkerData.minX <= labelMarkerDataA.maxX && labelMarkerData.maxX >= labelMarkerDataA.maxX)) {\n if (topA) {\n //move up, test to see if this above A\n if (labelMarkerData.minY > labelMarkerDataA.maxY) {\n //compare the distance between this and A\n if (labelMarkerData.minY - labelMarkerDataA.maxY < overlapYDist) {\n //if the distance between this and A is < overlap distance...\n //can't move\n canMoveY = false;\n return false;\n }\n }\n } else {\n //move down, test to see if this is below A\n if (labelMarkerData.maxY < labelMarkerDataA.minY) {\n //compare the distance between this and A\n if (labelMarkerDataA.minY - labelMarkerData.maxY < overlapYDist) {\n //if the distance between this and A is < overlap distance...\n //can't move\n canMoveY = false;\n return false;\n }\n }\n }\n }\n });\n //if can move, set new coordinate properties\n if (canMoveY) {\n //if top then add overlap distance Y, if not then subtract distance\n labelMarkerDataA.minY = topA ? labelMarkerDataA.minY + overlapYDist : labelMarkerDataA.minY - overlapYDist;\n labelMarkerDataA.maxY = topA ? labelMarkerDataA.maxY + overlapYDist : labelMarkerDataA.maxY - overlapYDist;\n labelMarkerDataA.centerXy.y = topA ? labelMarkerDataA.centerXy.y + overlapYDist : labelMarkerDataA.centerXy.y - overlapYDist;\n //indicate that the marker needs to be moved\n labelMarkerDataA.moved = true;\n //add A and B to moved array (to test when looking to move X)\n labelMarkerDataIdsMoved.push(labelMarkerDataA.marker.id);\n labelMarkerDataIdsMoved.push(labelMarkerDataB.marker.id);\n //resort by Xs since changed coordinates\n labelMarkersDataByXs.sort(function (a, b) { return a.minX === b.minX ? 0 : a.minX < b.minX ? -1 : 1; });\n //break out of loop (so that if first is A no need to try second as A because already removed overlap)\n break;\n }\n }\n }\n //short circuit, if moved array length === overlap length, then all have been moved\n if (labelMarkerDataIdsMoved.length === overlappingLabelMarkers.length) {\n continue;\n }\n //sort by Y for efficiency\n labelMarkersDataByYs.sort(function (a, b) { return a.minY === b.minX ? 0 : a.minX < b.minX ? -1 : 1; });\n //loop through overlap Xs to see if can move X\n for (let a = 0; a < overlappingLabelMarkers.length - 1; a += 2) {\n const b = a + 1;\n //try first being A then second being A\n for (let c = 0; c < 2; c++) {\n const labelMarkerDataA = overlappingLabelMarkers[c === 0 ? a : b];\n const labelMarkerDataB = overlappingLabelMarkers[c === 0 ? b : a];\n //test if A is right or left of B\n const leftA = labelMarkerDataA.minX < labelMarkerDataB.minX;\n //get overlap X distance\n const overlapXDist = leftA ? labelMarkerDataA.maxX - labelMarkerDataB.minX : labelMarkerDataB.maxX - labelMarkerDataA.minX;\n if (overlapXDist <= 0) {\n break;\n }\n //assume can move X unless tests prove cannot\n let canMoveX = true;\n //loop through array of label marker datas sorted by Y\n labelMarkersDataByYs.every(function (labelMarkerData) {\n //break once this min Y > A's max Y as array is sorted and this is now out of bounds for tests\n if (labelMarkerData.minY > labelMarkerDataA.maxY) {\n return false;\n }\n //if the overlap has already been removed, continue\n if (labelMarkerDataIdsMoved.indexOf(labelMarkerData.marker.id) < 0) {\n return true;\n }\n //continue if this label marker data is equal to label marker data A or B\n if (labelMarkerData.marker.id === labelMarkerDataA.marker.id || labelMarkerData.marker.id === labelMarkerDataB.marker.id) {\n return true;\n }\n //if this min or max Y overlaps A's min or max Y test if can move X\n if ((labelMarkerData.minY <= labelMarkerDataA.minY && labelMarkerData.maxY >= labelMarkerDataA.minY) || (labelMarkerData.minY <= labelMarkerDataA.maxY && labelMarkerData.maxY >= labelMarkerDataA.maxY)) {\n if (leftA) {\n //move left, test to see if this left of A\n if (labelMarkerData.maxX < labelMarkerDataA.minX) {\n //compare the distance between this and A\n if (labelMarkerDataA.minX - labelMarkerData.maxX < overlapXDist) {\n //if the distance between this and A is < overlap distance...\n //can't move\n canMoveX = false;\n return false;\n }\n }\n } else {\n //move down, test to see if this is right of A\n if (labelMarkerData.minX > labelMarkerDataA.maxX) {\n //compare the distance between this and A\n if (labelMarkerData.minX - labelMarkerDataA.maxX < overlapXDist) {\n //if the distance between this and A is < overlap distance...\n //can't move\n canMoveX = false;\n return false;\n }\n }\n }\n }\n });\n //if can move, set new coordinate properties\n if (canMoveX) {\n //if left then subtract overlap distance X, if not then add distance\n labelMarkerDataA.minX = leftA ? labelMarkerDataA.minX - overlapXDist : labelMarkerDataA.minX + overlapXDist;\n labelMarkerDataA.maxX = leftA ? labelMarkerDataA.maxX - overlapXDist : labelMarkerDataA.maxX + overlapXDist;\n labelMarkerDataA.centerXy.x = leftA ? labelMarkerDataA.centerXy.x - overlapXDist : labelMarkerDataA.centerXy.x + overlapXDist;\n //indicate that marker needs to be moved\n labelMarkerDataA.moved = true;\n //resort by Ys since changed coordinates\n labelMarkersDataByYs.sort(function (a, b) { return a.minY === b.minX ? 0 : a.minX < b.minX ? -1 : 1; });\n //break out of loop (so that if first is A no need to try second as A because already removed overlap)\n break;\n } else {\n //cant move, so increment can't move\n labelMarkerDataA.cantMoveCount++;\n }\n }\n }\n } while (overlappingLabelMarkers.length > 0);\n //if needs moving, move\n labelMarkersDataByXs.forEach(window.L.Util.bind(function (labelMarkerData) {\n if (labelMarkerData.moved) {\n labelMarkerData.marker.setLatLng(this._map.layerPointToLatLng(labelMarkerData.centerXy));\n }\n }, this));\n }\n _featureShouldBeVisible(feature) {\n //ensure feature id list exists and feature has an id\n if (!this._featureIds || !window.L.Util.isArray(this._featureIds) || feature.properties[this._idFieldName] === null || feature.properties[this._idFieldName] === undefined) {\n //if not return false (feature should NOT be visible)\n return false;\n }\n //if feature's id is a string adjust to remove spacing and casing\n if (typeof feature.properties[this._idFieldName] === \"string\") {\n //check if feature's id is within feature id list and return true if it is (feature should be visible)\n if (this._featureIds.indexOf(feature.properties[this._idFieldName].trim().toLowerCase()) > -1) {\n return true;\n }\n } else {\n //check if feature's id is within feature id list and return true if it is (feature should be visible)\n if (this._featureIds.indexOf(feature.properties[this._idFieldName]) > -1) {\n return true;\n }\n }\n //if made it to this point return false (feature should NOT be visible)\n return false;\n }\n _getFeatureData(uiLayerWithFeature) {\n if (!uiLayerWithFeature || !uiLayerWithFeature.feature) {\n return null;\n }\n const feature = uiLayerWithFeature.feature;\n //ensure feature data exists and feature has an id\n if (!this._featureData || typeof this._featureData !== \"object\" || feature.properties[this._idFieldName] === null || feature.properties[this._idFieldName] === undefined) {\n //if not return null (no feature data)\n return null;\n }\n //if feature's id is a string adjust to remove spacing and casing\n if (typeof feature.properties[this._idFieldName] === \"string\") {\n const featureId = feature.properties[this._idFieldName].trim().toLowerCase();\n //check if feature's id is within feature id list and if so return feature data using that id\n if (this._featureIds.indexOf(featureId) > -1) {\n return this._featureData[featureId];\n }\n } else {\n const featureId = feature.properties[this._idFieldName];\n //check if feature's id is within feature id list and if so return feature data using that id\n if (this._featureIds.indexOf(featureId) > -1) {\n return this._featureData[featureId];\n }\n }\n //if made it to this point return null (no feature data)\n return null;\n }\n _onFeatureLayerLoad() {\n //bounds will hold the extent of all visible features\n const bounds = window.L.latLngBounds([]);\n //get the individual feature layers for the geo json layer\n const geoJsonLayerLayers = this._geoJsonLayer.getLayers();\n //loop through the layers (1 per feature) to apply symbology and events\n geoJsonLayerLayers.forEach(window.L.Util.bind(function (layer) {\n //test if feature is in list of feature Ids in \"show\" method\n if (!this._featureShouldBeVisible(layer.feature)) {\n //make feature invisible and without a label marker\n layer.setStyle({\n fillOpacity: 0,\n opacity: 0\n });\n //remove label\n if (layer._labelMarker) {\n layer._labelMarker.remove();\n }\n } else {\n //get the layer extent and add it to the bounds object\n const layerBounds = layer.getBounds();\n bounds.extend(layerBounds);\n //set the style of the layer (feature) based on the id field's name (so region can be styled differently than projects)\n if (this._idFieldName === REGION_SERVICE_REGION_ID_FIELD) {\n layer.setStyle(this._regionSymbolStyle);\n } else {\n layer.setStyle(this._projectSymbolStyle);\n }\n //if an existing label marker exists, remove it and add it back to ensure it displays properly\n if (layer._labelMarker) {\n layer._labelMarker.remove();\n layer._labelMarker.addTo(this._map);\n } else {\n //if an existing label does not exist, get feature data then create it\n const featureData = this._getFeatureData(layer);\n //ensure feature data provided has a label property (if not set has no label marker)\n if (!featureData || !featureData.label) {\n layer._hasNoLabelMarker = true;\n } else {\n //get the center of the feature (which is where the label will be placed)\n let centerOfFeature = this._getCenterOfFeatureFromLayer(layer);\n //get the label class name using the id field name (so region labels can be styled differently than project labels)\n let labelClassName = this._idFieldName === REGION_SERVICE_REGION_ID_FIELD ? REGION_LABEL_CLASS_NAME : PROJECT_LABEL_CLASS_NAME;\n //create the label marker using the class and feature data and add it to the map\n layer._labelMarker = window.L.marker({ lat: centerOfFeature.y, lng: centerOfFeature.x }, {\n icon: window.L.divIcon({\n iconSize: null,\n className: labelClassName,\n html: \"
\" + featureData.label + \"
\"\n }),\n bubblingMouseEvents: true\n });\n layer._labelMarker.once(\"add\", window.L.Util.bind(function (e) {\n //get the label marker from the event\n const labelMarker = e.target;\n //mark the label marker as added to map\n labelMarker._labelIsAddedToMap = true;\n //if every label marker for the geo json has been added (excluding layers that don't have label)\n if (geoJsonLayerLayers.every(window.L.Util.bind(function (geoJsonLayerLayer) {\n return !this._featureShouldBeVisible(geoJsonLayerLayer.feature) || (geoJsonLayerLayer._labelMarker && geoJsonLayerLayer._labelMarker._labelIsAddedToMap) || geoJsonLayerLayer._hasNoLabelMarker;\n }, this))) {\n //want to call adjust labels after add, but not if immediately zoomed\n let zoomed = false;\n this._map.on(\"zoomend\", window.L.Util.bind(function () {\n zoomed = true;\n setTimeout(window.L.Util.bind(function () {\n this._adjustLabelPlacement();\n }, this), 0);\n }, this));\n setTimeout(window.L.Util.bind(function () {\n //call the method to adjust the label placements if zoom wasn't immediately called\n if (!zoomed) {\n this._adjustLabelPlacement();\n }\n }, this), 0);\n }\n }, this));\n layer._labelMarker.addTo(this._map);\n //save the layer on the label marker for use in events\n layer._labelMarker._layerLayer = layer;\n }\n }\n //remove any existing event handlers and re-add them to ensure they fire\n layer.off();\n layer.on({\n mouseover: window.L.Util.bind(this._onFeatureMouseOver, this),\n mouseout: window.L.Util.bind(this._onFeatureMouseOut, this),\n click: window.L.Util.bind(this._onFeatureClick, this),\n remove: function (e) {\n //remove the label marker (if it exists) when the layer is removed\n let removedLayer = e.target;\n if (removedLayer._labelMarker) {\n removedLayer._labelMarker.remove();\n }\n }\n });\n //if the feature layer has a label marker, add events\n if (layer._labelMarker) {\n //add same event handlers as feature to label marker so that label marker doesn't block cursor from firing event on feature\n //remove any existing event handlers and re-add them to ensure they fire\n layer._labelMarker.off();\n layer._labelMarker.on({\n mouseover: window.L.Util.bind(function (e) {\n let tooltipMarker = e.target;\n //call the mouse over callback passed in the show method\n this._onFeatureMouseOver({ target: tooltipMarker._layerLayer, latlng: e.latlng });\n }, this),\n mouseout: window.L.Util.bind(function (e) {\n let tooltipMarker = e.target;\n //call the mouse out callback passed in the show method\n this._onFeatureMouseOut({ target: tooltipMarker._layerLayer, latlng: e.latlng });\n }, this),\n click: window.L.Util.bind(function (e) {\n let tooltipMarker = e.target;\n //call the click callback passed in the show method\n this._onFeatureClick({ target: tooltipMarker._layerLayer, latlng: e.latlng });\n }, this)\n });\n }\n }\n }, this));\n //check if bounds is valid (e.g. if no features in layer then will NOT be valid)\n if (bounds.isValid()) {\n //zoom to the extent of all visible features\n this._map.fitBounds(bounds);\n }\n }\n _replaceGeoJsonLayer(url, style, callback) {\n //remove existing geoJson Layer (if exists)\n if (this._geoJsonLayer && this._map.hasLayer(this._geoJsonLayer)) {\n this._map.removeLayer(this._geoJsonLayer);\n }\n //query ArcGIS Service to retrieve ids and geometries for new geoJson layer\n let options = {\n fetchAllFeatures: true,\n style: style\n };\n this._query(url, [this._idFieldName], null, null, window.L.Util.bind(function (featureCollection) {\n //create the geoJson layer from the query results and add it to the map\n this._geoJsonLayer = window.L.geoJSON(featureCollection, options);\n //after the layer is added, call the callback\n this._geoJsonLayer.on(\"add\", window.L.Util.bind(callback, this));\n //add the layer to the map\n this._geoJsonLayer.addTo(this._map);\n }, this));\n }\n _show(idsWithData, url, onFeatureMouseInCallback, onFeatureMouseOutCallback, onFeatureClickCallback, afterShowCallback) {\n setTimeout(window.L.Util.bind(function () {\n //ids will be used to filter which features will be visible\n this._featureData = {};\n this._featureIds = Object.keys(idsWithData).map(window.L.Util.bind(function (id) {\n const featureId = id.trim().toLowerCase();\n this._featureData[featureId] = idsWithData[id];\n return featureId;\n }, this));\n //callbacks will be called for events on features\n this._onFeatureMouseInCallback = onFeatureMouseInCallback;\n this._onFeatureMouseOutCallback = onFeatureMouseOutCallback;\n this._onFeatureClickCallback = onFeatureClickCallback;\n //if the layer url has not changed, the geoJson layer simply needs re-filtering\n if (this._layerUrl === url) {\n this._onFeatureLayerLoad(true);\n if (afterShowCallback) {\n afterShowCallback();\n }\n } else {\n //if the layer url has changed, we need to retrieve new data and then filter\n this._layerUrl = url;\n this._replaceGeoJsonLayer(url, this._regionSymbolStyle, window.L.Util.bind(function () {\n this._onFeatureLayerLoad(false);\n if (afterShowCallback) {\n afterShowCallback();\n }\n }, this));\n }\n }, this));\n }\n showRegions(regionIdsWithData, onFeatureMouseInCallback = null, onFeatureMouseOutCallback = null, onFeatureClickCallback = null, afterShowCallback = null, maxLabelZoomNumber = null) {\n //set the current region id to null (current region only applicable when showing projects)\n this._currentRegionId = null;\n //set Id field name\n this._idFieldName = REGION_SERVICE_REGION_ID_FIELD;\n //set the maximum zoom (out) number for labels\n this._maxLabelZoomNumber = maxLabelZoomNumber || DEFAULT_REGION_MAX_LABEL_ZOOM_NUMBER;\n //only specified region Ids will show (be visible)\n this._show(regionIdsWithData, REGION_SERVICE_URL, onFeatureMouseInCallback, onFeatureMouseOutCallback, onFeatureClickCallback, afterShowCallback);\n }\n showProjects(regionId, projectIdsWithData, onFeatureMouseInCallback = null, onFeatureMouseOutCallback = null, onFeatureClickCallback = null, afterShowCallback = null, maxLabelZoomNumber = null) {\n //set the current region id from the region id parameter (to be used in getter for current region)\n this._currentRegionId = regionId;\n //set Id field name\n this._idFieldName = PROJECTS_SERVICES_PROJECT_ID_FIELD;\n //set the maximum zoom (out) number for labels\n this._maxLabelZoomNumber = maxLabelZoomNumber || DEFAULT_PROJECT_MAX_LABEL_ZOOM_NUMBER;\n //only specified project Ids will show (be visible)\n //project Ids must be within region of specified region Id\n this._show(projectIdsWithData, REGIONS_WITH_PROJECTS_URLS[regionId], onFeatureMouseInCallback, onFeatureMouseOutCallback, onFeatureClickCallback, afterShowCallback);\n }\n }\nwindow.MapControlClass = MapControlClass;\n\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./baseMap.vue?vue&type=style&index=0&id=747efd3a&scoped=true&lang=css&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./addressSearch.vue?vue&type=style&index=0&lang=css&\""],"sourceRoot":""}