@react-google-maps/marker-clusterer 2.16.1 → 2.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"cjs.min.js","sources":["../src/ClusterIcon.tsx","../src/Cluster.tsx","../src/Clusterer.tsx"],"sourcesContent":["/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\n\nimport { ClusterIconStyle, ClusterIconInfo } from './types'\n\nexport class ClusterIcon {\n cluster: Cluster\n className: string\n clusterClassName: string\n styles: ClusterIconStyle[]\n center: google.maps.LatLng | undefined\n div: HTMLDivElement | null\n sums: ClusterIconInfo | null\n visible: boolean\n url: string\n height: number\n width: number\n anchorText: number[]\n anchorIcon: number[]\n textColor: string\n textSize: number\n textDecoration: string\n fontWeight: string\n fontStyle: string\n fontFamily: string\n backgroundPosition: string\n cMouseDownInCluster: boolean | null\n cDraggingMapByCluster: boolean | null\n timeOut: number | null\n\n boundsChangedListener: google.maps.MapsEventListener | null\n\n constructor(cluster: Cluster, styles: ClusterIconStyle[]) {\n cluster.getClusterer().extend(ClusterIcon, google.maps.OverlayView)\n\n this.cluster = cluster\n\n this.clusterClassName = this.cluster.getClusterer().getClusterClass()\n\n this.className = this.clusterClassName\n\n this.styles = styles\n\n this.center = undefined\n\n this.div = null\n\n this.sums = null\n\n this.visible = false\n\n this.boundsChangedListener = null\n\n this.url = ''\n\n this.height = 0\n this.width = 0\n\n this.anchorText = [0, 0]\n this.anchorIcon = [0, 0]\n\n this.textColor = 'black'\n this.textSize = 11\n this.textDecoration = 'none'\n this.fontWeight = 'bold'\n this.fontStyle = 'normal'\n this.fontFamily = 'Arial,sans-serif'\n\n this.backgroundPosition = '0 0'\n\n this.cMouseDownInCluster = null\n this.cDraggingMapByCluster = null\n this.timeOut = null;\n\n (this as unknown as google.maps.OverlayView).setMap(cluster.getMap()) // Note: this causes onAdd to be called\n\n this.onBoundsChanged = this.onBoundsChanged.bind(this)\n this.onMouseDown = this.onMouseDown.bind(this)\n this.onClick = this.onClick.bind(this)\n this.onMouseOver = this.onMouseOver.bind(this)\n this.onMouseOut = this.onMouseOut.bind(this)\n this.onAdd = this.onAdd.bind(this)\n this.onRemove = this.onRemove.bind(this)\n this.draw = this.draw.bind(this)\n this.hide = this.hide.bind(this)\n this.show = this.show.bind(this)\n this.useStyle = this.useStyle.bind(this)\n this.setCenter = this.setCenter.bind(this)\n this.getPosFromLatLng = this.getPosFromLatLng.bind(this)\n }\n\n onBoundsChanged() {\n this.cDraggingMapByCluster = this.cMouseDownInCluster\n }\n\n onMouseDown() {\n this.cMouseDownInCluster = true\n\n this.cDraggingMapByCluster = false\n }\n\n onClick(event: Event) {\n this.cMouseDownInCluster = false\n\n if (!this.cDraggingMapByCluster) {\n const markerClusterer = this.cluster.getClusterer()\n\n /**\n * This event is fired when a cluster marker is clicked.\n * @name MarkerClusterer#click\n * @param {Cluster} c The cluster that was clicked.\n * @event\n */\n google.maps.event.trigger(markerClusterer, 'click', this.cluster)\n google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster) // deprecated name\n\n // The default click handler follows. Disable it by setting\n // the zoomOnClick property to false.\n if (markerClusterer.getZoomOnClick()) {\n // Zoom into the cluster.\n const maxZoom = markerClusterer.getMaxZoom()\n\n const bounds = this.cluster.getBounds()\n\n const map = (markerClusterer as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null && 'fitBounds' in map) {\n map.fitBounds(bounds)\n }\n\n\n // There is a fix for Issue 170 here:\n this.timeOut = window.setTimeout(() => {\n const map = (markerClusterer as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null) {\n if ('fitBounds' in map) {\n map.fitBounds(bounds)\n }\n\n const zoom = map.getZoom() || 0\n\n // Don't zoom beyond the max zoom level\n if (\n maxZoom !== null &&\n zoom > maxZoom\n ) {\n map.setZoom(maxZoom + 1)\n }\n }\n }, 100)\n }\n\n // Prevent event propagation to the map:\n event.cancelBubble = true\n\n if (event.stopPropagation) {\n event.stopPropagation()\n }\n }\n }\n\n onMouseOver() {\n /**\n * This event is fired when the mouse moves over a cluster marker.\n * @name MarkerClusterer#mouseover\n * @param {Cluster} c The cluster that the mouse moved over.\n * @event\n */\n google.maps.event.trigger(\n this.cluster.getClusterer(),\n 'mouseover',\n this.cluster\n )\n }\n\n onMouseOut() {\n /**\n * This event is fired when the mouse moves out of a cluster marker.\n * @name MarkerClusterer#mouseout\n * @param {Cluster} c The cluster that the mouse moved out of.\n * @event\n */\n google.maps.event.trigger(\n this.cluster.getClusterer(),\n 'mouseout',\n this.cluster\n )\n }\n\n onAdd() {\n this.div = document.createElement('div')\n\n this.div.className = this.className\n\n if (this.visible) {\n this.show()\n }\n\n ;(this as unknown as google.maps.OverlayView).getPanes()?.overlayMouseTarget.appendChild(this.div)\n\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null) {\n // Fix for Issue 157\n this.boundsChangedListener = google.maps.event.addListener(\n map,\n 'bounds_changed',\n this.onBoundsChanged\n )\n\n this.div.addEventListener('mousedown', this.onMouseDown)\n\n this.div.addEventListener('click', this.onClick)\n\n this.div.addEventListener('mouseover', this.onMouseOver)\n\n this.div.addEventListener('mouseout', this.onMouseOut)\n }\n }\n\n onRemove() {\n if (this.div && this.div.parentNode) {\n this.hide()\n\n if (this.boundsChangedListener !== null) {\n google.maps.event.removeListener(this.boundsChangedListener)\n }\n\n this.div.removeEventListener('mousedown', this.onMouseDown)\n\n this.div.removeEventListener('click', this.onClick)\n\n this.div.removeEventListener('mouseover', this.onMouseOver)\n\n this.div.removeEventListener('mouseout', this.onMouseOut)\n\n this.div.parentNode.removeChild(this.div)\n\n if (this.timeOut !== null) {\n window.clearTimeout(this.timeOut)\n\n this.timeOut = null\n }\n\n this.div = null\n }\n }\n\n draw() {\n if (this.visible && this.div !== null && this.center) {\n const pos = this.getPosFromLatLng(this.center)\n\n this.div.style.top = pos !== null ? `${pos.y}px` : '0'\n this.div.style.left = pos !== null ? `${pos.x}px` : '0'\n }\n }\n\n hide() {\n if (this.div) {\n this.div.style.display = 'none'\n }\n\n this.visible = false\n }\n\n show() {\n if (this.div && this.center) {\n const divTitle = this.sums === null ||\n typeof this.sums.title === 'undefined' ||\n this.sums.title === '' ? this.cluster.getClusterer().getTitle() : this.sums.title\n\n // NOTE: values must be specified in px units\n const bp = this.backgroundPosition.split(' ')\n\n const spriteH = parseInt(bp[0].replace(/^\\s+|\\s+$/g, ''), 10)\n const spriteV = parseInt(bp[1].replace(/^\\s+|\\s+$/g, ''), 10)\n\n const pos = this.getPosFromLatLng(this.center)\n\n this.div.className = this.className\n this.div .setAttribute('style', `cursor: pointer; position: absolute; top: ${pos !== null ? `${pos.y}px` : '0'}; left: ${pos !== null ? `${pos.x}px` : '0'}; width: ${this.width}px; height: ${this.height}px; `)\n\n const img = document.createElement('img')\n\n img.alt = divTitle\n img.src = this.url\n img.width = this.width\n img.height = this.height\n img.setAttribute('style', `position: absolute; top: ${spriteV}px; left: ${spriteH}px`)\n\n if (!this.cluster.getClusterer().enableRetinaIcons) {\n img.style.clip = `rect(-${spriteV}px, -${spriteH + this.width}px, -${\n spriteV + this.height\n }, -${spriteH})`\n }\n\n const textElm = document.createElement('div')\n\n textElm .setAttribute('style', `position: absolute; top: ${this.anchorText[0]}px; left: ${this.anchorText[1]}px; color: ${this.textColor}; font-size: ${this.textSize}px; font-family: ${this.fontFamily}; font-weight: ${this.fontWeight}; fontStyle: ${this.fontStyle}; text-decoration: ${this.textDecoration}; text-align: center; width: ${this.width}px; line-height: ${this.height}px`)\n\n if (this.sums?.text) textElm.innerText = `${this.sums?.text}`\n if (this.sums?.html) textElm.innerHTML = `${this.sums?.html}`\n\n this.div.innerHTML = ''\n\n this.div.appendChild(img)\n this.div.appendChild(textElm)\n\n this.div.title = divTitle\n\n this.div.style.display = ''\n }\n\n this.visible = true\n }\n\n useStyle(sums: ClusterIconInfo) {\n this.sums = sums\n\n const styles = this.cluster.getClusterer().getStyles()\n\n const style =\n styles[Math.min(styles.length - 1, Math.max(0, sums.index - 1))]\n\n this.url = style.url\n this.height = style.height\n this.width = style.width\n\n if (style.className)\n this.className = `${this.clusterClassName} ${style.className}`\n\n this.anchorText = style.anchorText || [0, 0]\n this.anchorIcon = style.anchorIcon || [this.height / 2, this.width / 2]\n\n this.textColor = style.textColor || 'black'\n\n this.textSize = style.textSize || 11\n\n this.textDecoration = style.textDecoration || 'none'\n\n this.fontWeight = style.fontWeight || 'bold'\n\n this.fontStyle = style.fontStyle || 'normal'\n\n this.fontFamily = style.fontFamily || 'Arial,sans-serif'\n\n this.backgroundPosition = style.backgroundPosition || '0 0'\n }\n\n setCenter(center: google.maps.LatLng) {\n this.center = center\n }\n\n getPosFromLatLng(latlng: google.maps.LatLng): google.maps.Point | null {\n const pos = (this as unknown as google.maps.OverlayView).getProjection().fromLatLngToDivPixel(latlng)\n\n if (pos !== null) {\n pos.x -= this.anchorIcon[1]\n\n pos.y -= this.anchorIcon[0]\n }\n\n return pos\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Clusterer } from './Clusterer'\n\nimport { ClusterIcon } from './ClusterIcon'\n\nimport { MarkerExtended } from './types'\n\nexport class Cluster {\n markerClusterer: Clusterer\n map: google.maps.Map | google.maps.StreetViewPanorama | null\n gridSize: number\n minClusterSize: number\n averageCenter: boolean\n markers: MarkerExtended[]\n center: google.maps.LatLng | undefined\n bounds: google.maps.LatLngBounds | null\n clusterIcon: ClusterIcon\n\n constructor(markerClusterer: Clusterer) {\n this.markerClusterer = markerClusterer\n\n this.map = (this.markerClusterer as unknown as google.maps.OverlayView).getMap()\n\n this.gridSize = this.markerClusterer.getGridSize()\n\n this.minClusterSize = this.markerClusterer.getMinimumClusterSize()\n\n this.averageCenter = this.markerClusterer.getAverageCenter()\n\n this.markers = []\n\n this.center = undefined\n\n this.bounds = null\n\n this.clusterIcon = new ClusterIcon(this, this.markerClusterer.getStyles())\n\n this.getSize = this.getSize.bind(this)\n this.getMarkers = this.getMarkers.bind(this)\n this.getCenter = this.getCenter.bind(this)\n this.getMap = this.getMap.bind(this)\n this.getClusterer = this.getClusterer.bind(this)\n this.getBounds = this.getBounds.bind(this)\n this.remove = this.remove.bind(this)\n this.addMarker = this.addMarker.bind(this)\n this.isMarkerInClusterBounds = this.isMarkerInClusterBounds.bind(this)\n this.calculateBounds = this.calculateBounds.bind(this)\n this.updateIcon = this.updateIcon.bind(this)\n this.isMarkerAlreadyAdded = this.isMarkerAlreadyAdded.bind(this)\n }\n\n getSize(): number {\n return this.markers.length\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getCenter(): google.maps.LatLng | undefined {\n return this.center\n }\n\n getMap(): google.maps.Map | google.maps.StreetViewPanorama | null {\n return this.map\n }\n\n getClusterer(): Clusterer {\n return this.markerClusterer\n }\n\n getBounds(): google.maps.LatLngBounds {\n const bounds = new google.maps.LatLngBounds(this.center, this.center)\n\n const markers = this.getMarkers()\n\n for (let i = 0; i < markers.length; i++) {\n const position = markers[i].getPosition()\n\n if (position) {\n bounds.extend(position)\n }\n }\n\n return bounds\n }\n\n remove() {\n (this.clusterIcon as unknown as google.maps.OverlayView).setMap(null)\n\n this.markers = []\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n delete this.markers\n }\n\n addMarker(marker: MarkerExtended): boolean {\n if (this.isMarkerAlreadyAdded(marker)) {\n return false\n }\n\n if (!this.center) {\n const position = marker.getPosition()\n\n if (position) {\n this.center = position\n\n this.calculateBounds()\n }\n } else {\n if (this.averageCenter) {\n const position = marker.getPosition()\n\n if (position) {\n const length = this.markers.length + 1\n\n this.center = new google.maps.LatLng(\n (this.center.lat() * (length - 1) + position.lat()) / length,\n (this.center.lng() * (length - 1) + position.lng()) / length\n )\n\n this.calculateBounds()\n }\n }\n }\n\n marker.isAdded = true\n\n this.markers.push(marker)\n\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map?.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n // Zoomed in past max zoom, so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount < this.minClusterSize) {\n // Min cluster size not reached so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount === this.minClusterSize) {\n // Hide the markers that were showing.\n for (let i = 0; i < mCount; i++) {\n this.markers[i].setMap(null)\n }\n } else {\n marker.setMap(null)\n }\n\n return true\n }\n\n isMarkerInClusterBounds(marker: MarkerExtended): boolean {\n if (this.bounds !== null) {\n const position = marker.getPosition()\n\n if (position) {\n return this.bounds.contains(position)\n }\n }\n\n return false\n }\n\n calculateBounds() {\n this.bounds = this.markerClusterer.getExtendedBounds(\n new google.maps.LatLngBounds(this.center, this.center)\n )\n }\n\n updateIcon() {\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map?.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n this.clusterIcon.hide()\n\n return\n }\n\n if (mCount < this.minClusterSize) {\n // Min cluster size not yet reached.\n this.clusterIcon.hide()\n\n return\n }\n\n if (this.center) {\n this.clusterIcon.setCenter(this.center)\n }\n\n this.clusterIcon.useStyle(\n this.markerClusterer.getCalculator()(this.markers, this.markerClusterer.getStyles().length)\n )\n\n this.clusterIcon.show()\n }\n\n isMarkerAlreadyAdded(marker: MarkerExtended): boolean {\n if (this.markers.includes) {\n return this.markers.includes(marker)\n }\n\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n return true\n }\n }\n\n return false\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\nimport { ClusterIcon } from './ClusterIcon'\n\nimport {\n MarkerExtended,\n ClustererOptions,\n ClusterIconStyle,\n TCalculator,\n ClusterIconInfo,\n} from './types'\n\n/**\n * Supports up to 9007199254740991 (Number.MAX_SAFE_INTEGER) markers\n * which is not a problem as max array length is 4294967296 (2**32)\n */\nfunction CALCULATOR(\n markers: MarkerExtended[],\n numStyles: number\n): ClusterIconInfo {\n const count = markers.length\n\n const numberOfDigits = count.toString().length\n\n const index = Math.min(numberOfDigits, numStyles)\n\n return {\n text: count.toString(),\n index,\n title: '',\n }\n}\n\nconst BATCH_SIZE = 2000\n\nconst BATCH_SIZE_IE = 500\n\nconst IMAGE_PATH =\n 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'\n\nconst IMAGE_EXTENSION = 'png'\n\nconst IMAGE_SIZES = [53, 56, 66, 78, 90]\n\nconst CLUSTERER_CLASS = 'cluster'\n\nexport class Clusterer {\n markers: MarkerExtended[]\n clusters: Cluster[]\n listeners: google.maps.MapsEventListener[]\n activeMap: google.maps.Map | google.maps.StreetViewPanorama | null\n ready: boolean\n gridSize: number\n minClusterSize: number\n maxZoom: number | null\n styles: ClusterIconStyle[]\n title: string\n zoomOnClick: boolean\n averageCenter: boolean\n ignoreHidden: boolean\n enableRetinaIcons: boolean\n imagePath: string\n imageExtension: string\n imageSizes: number[]\n calculator: TCalculator\n batchSize: number\n batchSizeIE: number\n clusterClass: string\n timerRefStatic: number | null\n\n constructor(\n map: google.maps.Map,\n optMarkers: MarkerExtended[] = [],\n optOptions: ClustererOptions = {}\n ) {\n this.getMinimumClusterSize = this.getMinimumClusterSize.bind(this)\n this.setMinimumClusterSize = this.setMinimumClusterSize.bind(this)\n this.getEnableRetinaIcons = this.getEnableRetinaIcons.bind(this)\n this.setEnableRetinaIcons = this.setEnableRetinaIcons.bind(this)\n this.addToClosestCluster = this.addToClosestCluster.bind(this)\n this.getImageExtension = this.getImageExtension.bind(this)\n this.setImageExtension = this.setImageExtension.bind(this)\n this.getExtendedBounds = this.getExtendedBounds.bind(this)\n this.getAverageCenter = this.getAverageCenter.bind(this)\n this.setAverageCenter = this.setAverageCenter.bind(this)\n this.getTotalClusters = this.getTotalClusters.bind(this)\n this.fitMapToMarkers = this.fitMapToMarkers.bind(this)\n this.getIgnoreHidden = this.getIgnoreHidden.bind(this)\n this.setIgnoreHidden = this.setIgnoreHidden.bind(this)\n this.getClusterClass = this.getClusterClass.bind(this)\n this.setClusterClass = this.setClusterClass.bind(this)\n this.getTotalMarkers = this.getTotalMarkers.bind(this)\n this.getZoomOnClick = this.getZoomOnClick.bind(this)\n this.setZoomOnClick = this.setZoomOnClick.bind(this)\n this.getBatchSizeIE = this.getBatchSizeIE.bind(this)\n this.setBatchSizeIE = this.setBatchSizeIE.bind(this)\n this.createClusters = this.createClusters.bind(this)\n this.onZoomChanged = this.onZoomChanged.bind(this)\n this.getImageSizes = this.getImageSizes.bind(this)\n this.setImageSizes = this.setImageSizes.bind(this)\n this.getCalculator = this.getCalculator.bind(this)\n this.setCalculator = this.setCalculator.bind(this)\n this.removeMarkers = this.removeMarkers.bind(this)\n this.resetViewport = this.resetViewport.bind(this)\n this.getImagePath = this.getImagePath.bind(this)\n this.setImagePath = this.setImagePath.bind(this)\n this.pushMarkerTo = this.pushMarkerTo.bind(this)\n this.removeMarker = this.removeMarker.bind(this)\n this.clearMarkers = this.clearMarkers.bind(this)\n this.setupStyles = this.setupStyles.bind(this)\n this.getGridSize = this.getGridSize.bind(this)\n this.setGridSize = this.setGridSize.bind(this)\n this.getClusters = this.getClusters.bind(this)\n this.getMaxZoom = this.getMaxZoom.bind(this)\n this.setMaxZoom = this.setMaxZoom.bind(this)\n this.getMarkers = this.getMarkers.bind(this)\n this.addMarkers = this.addMarkers.bind(this)\n this.getStyles = this.getStyles.bind(this)\n this.setStyles = this.setStyles.bind(this)\n this.addMarker = this.addMarker.bind(this)\n this.onRemove = this.onRemove.bind(this)\n this.getTitle = this.getTitle.bind(this)\n this.setTitle = this.setTitle.bind(this)\n this.repaint = this.repaint.bind(this)\n this.onIdle = this.onIdle.bind(this)\n this.redraw = this.redraw.bind(this)\n this.extend = this.extend.bind(this)\n this.onAdd = this.onAdd.bind(this)\n this.draw = this.draw.bind(this)\n\n this.extend(Clusterer, google.maps.OverlayView)\n\n this.markers = []\n this.clusters = []\n this.listeners = []\n this.activeMap = null\n this.ready = false\n this.gridSize = optOptions.gridSize || 60\n this.minClusterSize = optOptions.minimumClusterSize || 2\n this.maxZoom = optOptions.maxZoom || null\n this.styles = optOptions.styles || []\n\n this.title = optOptions.title || ''\n\n this.zoomOnClick = true\n\n if (optOptions.zoomOnClick !== undefined) {\n this.zoomOnClick = optOptions.zoomOnClick\n }\n\n this.averageCenter = false\n\n if (optOptions.averageCenter !== undefined) {\n this.averageCenter = optOptions.averageCenter\n }\n\n this.ignoreHidden = false\n\n if (optOptions.ignoreHidden !== undefined) {\n this.ignoreHidden = optOptions.ignoreHidden\n }\n\n this.enableRetinaIcons = false\n\n if (optOptions.enableRetinaIcons !== undefined) {\n this.enableRetinaIcons = optOptions.enableRetinaIcons\n }\n this.imagePath = optOptions.imagePath || IMAGE_PATH\n\n this.imageExtension = optOptions.imageExtension || IMAGE_EXTENSION\n\n this.imageSizes = optOptions.imageSizes || IMAGE_SIZES\n\n this.calculator = optOptions.calculator || CALCULATOR\n\n this.batchSize = optOptions.batchSize || BATCH_SIZE\n\n this.batchSizeIE = optOptions.batchSizeIE || BATCH_SIZE_IE\n\n this.clusterClass = optOptions.clusterClass || CLUSTERER_CLASS\n\n if (navigator.userAgent.toLowerCase().indexOf('msie') !== -1) {\n // Try to avoid IE timeout when processing a huge number of markers:\n this.batchSize = this.batchSizeIE\n }\n\n this.timerRefStatic = null\n\n this.setupStyles()\n\n this.addMarkers(optMarkers, true);\n\n (this as unknown as google.maps.OverlayView).setMap(map) // Note: this causes onAdd to be called\n }\n\n onZoomChanged() {\n this.resetViewport(false)\n\n // Workaround for this Google bug: when map is at level 0 and \"-\" of\n // zoom slider is clicked, a \"zoom_changed\" event is fired even though\n // the map doesn't zoom out any further. In this situation, no \"idle\"\n // event is triggered so the cluster markers that have been removed\n // do not get redrawn. Same goes for a zoom in at maxZoom.\n if (\n (this as unknown as google.maps.OverlayView).getMap()?.getZoom() === ((this as unknown as google.maps.OverlayView).get('minZoom') || 0) ||\n (this as unknown as google.maps.OverlayView).getMap()?.getZoom() === (this as unknown as google.maps.OverlayView).get('maxZoom')\n ) {\n google.maps.event.trigger(this, 'idle')\n }\n }\n\n onIdle() {\n this.redraw()\n }\n\n onAdd() {\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n this.activeMap = map\n\n this.ready = true\n\n this.repaint()\n\n if (map !== null) {\n // Add the map event listeners\n this.listeners = [\n google.maps.event.addListener(\n map,\n 'zoom_changed',\n this.onZoomChanged\n ),\n google.maps.event.addListener(\n map,\n 'idle',\n this.onIdle\n ),\n ]\n }\n }\n\n onRemove() {\n // Put all the managed markers back on the map:\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].getMap() !== this.activeMap) {\n this.markers[i].setMap(this.activeMap)\n }\n }\n\n // Remove all clusters:\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].remove()\n }\n\n this.clusters = []\n\n // Remove map event listeners:\n for (let i = 0; i < this.listeners.length; i++) {\n google.maps.event.removeListener(this.listeners[i])\n }\n\n this.listeners = []\n\n this.activeMap = null\n\n this.ready = false\n }\n\n draw() { return }\n\n setupStyles() {\n if (this.styles.length > 0) {\n return\n }\n\n for (let i = 0; i < this.imageSizes.length; i++) {\n this.styles.push({\n url: `${this.imagePath + (i + 1)}.${this.imageExtension}`,\n height: this.imageSizes[i],\n width: this.imageSizes[i],\n })\n }\n }\n\n fitMapToMarkers() {\n const markers = this.getMarkers()\n\n const bounds = new google.maps.LatLngBounds()\n\n for (let i = 0; i < markers.length; i++) {\n const position = markers[i].getPosition()\n\n if (position) {\n bounds.extend(position)\n }\n }\n\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null && 'fitBounds' in map) {\n map.fitBounds(bounds)\n }\n\n }\n\n getGridSize(): number {\n return this.gridSize\n }\n\n setGridSize(gridSize: number) {\n this.gridSize = gridSize\n }\n\n getMinimumClusterSize(): number {\n return this.minClusterSize\n }\n\n setMinimumClusterSize(minimumClusterSize: number) {\n this.minClusterSize = minimumClusterSize\n }\n\n getMaxZoom(): number | null {\n return this.maxZoom\n }\n\n setMaxZoom(maxZoom: number) {\n this.maxZoom = maxZoom\n }\n\n getStyles(): ClusterIconStyle[] {\n return this.styles\n }\n\n setStyles(styles: ClusterIconStyle[]) {\n this.styles = styles\n }\n\n getTitle(): string {\n return this.title\n }\n\n setTitle(title: string) {\n this.title = title\n }\n\n getZoomOnClick(): boolean {\n return this.zoomOnClick\n }\n\n setZoomOnClick(zoomOnClick: boolean) {\n this.zoomOnClick = zoomOnClick\n }\n\n getAverageCenter(): boolean {\n return this.averageCenter\n }\n\n setAverageCenter(averageCenter: boolean) {\n this.averageCenter = averageCenter\n }\n\n getIgnoreHidden(): boolean {\n return this.ignoreHidden\n }\n\n setIgnoreHidden(ignoreHidden: boolean) {\n this.ignoreHidden = ignoreHidden\n }\n\n getEnableRetinaIcons(): boolean {\n return this.enableRetinaIcons\n }\n\n setEnableRetinaIcons(enableRetinaIcons: boolean) {\n this.enableRetinaIcons = enableRetinaIcons\n }\n\n getImageExtension(): string {\n return this.imageExtension\n }\n\n setImageExtension(imageExtension: string) {\n this.imageExtension = imageExtension\n }\n\n getImagePath(): string {\n return this.imagePath\n }\n\n setImagePath(imagePath: string) {\n this.imagePath = imagePath\n }\n\n getImageSizes(): number[] {\n return this.imageSizes\n }\n\n setImageSizes(imageSizes: number[]) {\n this.imageSizes = imageSizes\n }\n\n getCalculator(): TCalculator {\n return this.calculator\n }\n\n setCalculator(calculator: TCalculator) {\n this.calculator = calculator\n }\n\n getBatchSizeIE(): number {\n return this.batchSizeIE\n }\n\n setBatchSizeIE(batchSizeIE: number) {\n this.batchSizeIE = batchSizeIE\n }\n\n getClusterClass(): string {\n return this.clusterClass\n }\n\n setClusterClass(clusterClass: string) {\n this.clusterClass = clusterClass\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getTotalMarkers(): number {\n return this.markers.length\n }\n\n getClusters(): Cluster[] {\n return this.clusters\n }\n\n getTotalClusters(): number {\n return this.clusters.length\n }\n\n addMarker(marker: MarkerExtended, optNoDraw: boolean) {\n this.pushMarkerTo(marker)\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n addMarkers(markers: MarkerExtended[], optNoDraw: boolean) {\n for (const key in markers) {\n if (Object.prototype.hasOwnProperty.call(markers, key)) {\n this.pushMarkerTo(markers[key])\n }\n }\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n pushMarkerTo(marker: MarkerExtended) {\n // If the marker is draggable add a listener so we can update the clusters on the dragend:\n if (marker.getDraggable()) {\n google.maps.event.addListener(marker, 'dragend', () => {\n if (this.ready) {\n marker.isAdded = false\n\n this.repaint()\n }\n })\n }\n\n marker.isAdded = false\n\n this.markers.push(marker)\n }\n\n removeMarker_(marker: MarkerExtended): boolean {\n let index = -1\n\n if (this.markers.indexOf) {\n index = this.markers.indexOf(marker)\n } else {\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n index = i\n\n break\n }\n }\n }\n\n if (index === -1) {\n // Marker is not in our list of markers, so do nothing:\n return false\n }\n\n marker.setMap(null)\n\n this.markers.splice(index, 1) // Remove the marker from the list of managed markers\n\n return true\n }\n\n removeMarker(marker: MarkerExtended, optNoDraw: boolean): boolean {\n const removed = this.removeMarker_(marker)\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n removeMarkers(markers: MarkerExtended[], optNoDraw: boolean): boolean {\n let removed = false\n\n for (let i = 0; i < markers.length; i++) {\n removed = removed || this.removeMarker_(markers[i])\n }\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n clearMarkers() {\n this.resetViewport(true)\n\n this.markers = []\n }\n\n repaint() {\n const oldClusters = this.clusters.slice()\n\n this.clusters = []\n\n this.resetViewport(false)\n\n this.redraw()\n\n // Remove the old clusters.\n // Do it in a timeout to prevent blinking effect.\n setTimeout(function timeout() {\n for (let i = 0; i < oldClusters.length; i++) {\n oldClusters[i].remove()\n }\n }, 0)\n }\n\n getExtendedBounds(bounds: google.maps.LatLngBounds): google.maps.LatLngBounds {\n const projection = (this as unknown as google.maps.OverlayView).getProjection()\n\n // Convert the points to pixels and the extend out by the grid size.\n const trPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng())\n )\n\n if (trPix !== null) {\n trPix.x += this.gridSize\n trPix.y -= this.gridSize\n }\n\n const blPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng())\n )\n\n if (blPix !== null) {\n blPix.x -= this.gridSize\n blPix.y += this.gridSize\n }\n\n\n // Extend the bounds to contain the new bounds.\n if (trPix !== null) {\n // Convert the pixel points back to LatLng nw\n const point1 = projection.fromDivPixelToLatLng(trPix)\n\n if (point1 !== null) {\n bounds.extend(point1)\n }\n }\n\n if (blPix !== null) {\n // Convert the pixel points back to LatLng sw\n const point2 = projection.fromDivPixelToLatLng(blPix)\n\n if (point2 !== null) {\n bounds.extend(\n point2\n )\n }\n }\n\n\n return bounds\n }\n\n redraw() {\n // Redraws all the clusters.\n this.createClusters(0)\n }\n\n resetViewport(optHide: boolean) {\n // Remove all the clusters\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].remove()\n }\n\n this.clusters = []\n\n // Reset the markers to not be added and to be removed from the map.\n for (let i = 0; i < this.markers.length; i++) {\n const marker = this.markers[i]\n\n marker.isAdded = false\n\n if (optHide) {\n marker.setMap(null)\n }\n }\n }\n\n distanceBetweenPoints(p1: google.maps.LatLng, p2: google.maps.LatLng): number {\n const R = 6371 // Radius of the Earth in km\n\n const dLat = ((p2.lat() - p1.lat()) * Math.PI) / 180\n const dLon = ((p2.lng() - p1.lng()) * Math.PI) / 180\n\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos((p1.lat() * Math.PI) / 180) *\n Math.cos((p2.lat() * Math.PI) / 180) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2)\n\n return R * (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)))\n }\n\n isMarkerInBounds(marker: MarkerExtended, bounds: google.maps.LatLngBounds): boolean {\n const position = marker.getPosition()\n\n if (position) {\n return bounds.contains(position)\n }\n\n return false\n }\n\n addToClosestCluster(marker: MarkerExtended) {\n let cluster\n\n let distance = 40000 // Some large number\n\n let clusterToAddTo = null\n\n for (let i = 0; i < this.clusters.length; i++) {\n cluster = this.clusters[i]\n\n const center = cluster.getCenter()\n\n const position = marker.getPosition()\n\n if (center && position) {\n const d = this.distanceBetweenPoints(center, position)\n\n if (d < distance) {\n distance = d\n\n clusterToAddTo = cluster\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker)\n } else {\n cluster = new Cluster(this)\n\n cluster.addMarker(marker)\n\n this.clusters.push(cluster)\n }\n }\n\n createClusters(iFirst: number) {\n if (!this.ready) {\n return\n }\n\n // Cancel previous batch processing if we're working on the first batch:\n if (iFirst === 0) {\n /**\n * This event is fired when the <code>Clusterer</code> begins\n * clustering markers.\n * @name Clusterer#clusteringbegin\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringbegin', this)\n\n if (this.timerRefStatic !== null) {\n window.clearTimeout(this.timerRefStatic)\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n delete this.timerRefStatic\n }\n }\n\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n const bounds = map !== null && 'getBounds' in map ? map.getBounds() : null\n\n const zoom = map?.getZoom() || 0\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n //\n // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug:\n const mapBounds = zoom > 3\n ? new google.maps.LatLngBounds(\n bounds?.getSouthWest(),\n bounds?.getNorthEast()\n )\n : new google.maps.LatLngBounds(\n new google.maps.LatLng(85.02070771743472, -178.48388434375),\n new google.maps.LatLng(-85.08136444384544, 178.00048865625)\n )\n\n const extendedMapBounds = this.getExtendedBounds(mapBounds)\n\n const iLast = Math.min(iFirst + this.batchSize, this.markers.length)\n\n for (let i = iFirst; i < iLast; i++) {\n const marker = this.markers[i]\n\n if (!marker.isAdded && this.isMarkerInBounds(marker, extendedMapBounds) && (!this.ignoreHidden || (this.ignoreHidden && marker.getVisible()))) {\n this.addToClosestCluster(marker)\n }\n }\n\n if (iLast < this.markers.length) {\n this.timerRefStatic = window.setTimeout(\n () => {\n this.createClusters(iLast)\n },\n 0\n )\n } else {\n this.timerRefStatic = null\n\n /**\n * This event is fired when the <code>Clusterer</code> stops\n * clustering markers.\n * @name Clusterer#clusteringend\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringend', this)\n\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].updateIcon()\n }\n }\n }\n\n extend<A extends typeof ClusterIcon | typeof Clusterer>(obj1: A, obj2: typeof google.maps.OverlayView): A {\n return function applyExtend(this: A, object: typeof google.maps.OverlayView): A {\n for (const property in object.prototype) {\n // @ts-ignore\n this.prototype[property] = object.prototype[property as keyof google.maps.OverlayView]\n }\n\n return this\n }.apply<A, [typeof google.maps.OverlayView], any>(obj1, [obj2])\n }\n}\n"],"names":["ClusterIcon","cluster","styles","getClusterer","extend","google","maps","OverlayView","this","clusterClassName","getClusterClass","className","center","undefined","div","sums","visible","boundsChangedListener","url","height","width","anchorText","anchorIcon","textColor","textSize","textDecoration","fontWeight","fontStyle","fontFamily","backgroundPosition","cMouseDownInCluster","cDraggingMapByCluster","timeOut","setMap","getMap","onBoundsChanged","bind","onMouseDown","onClick","onMouseOver","onMouseOut","onAdd","onRemove","draw","hide","show","useStyle","setCenter","getPosFromLatLng","prototype","event","markerClusterer_1","trigger","getZoomOnClick","maxZoom_1","getMaxZoom","bounds_1","getBounds","map","fitBounds","window","setTimeout","zoom","getZoom","setZoom","cancelBubble","stopPropagation","document","createElement","_a","getPanes","overlayMouseTarget","appendChild","addListener","addEventListener","parentNode","removeListener","removeEventListener","removeChild","clearTimeout","pos","style","top","concat","y","left","x","display","divTitle","title","getTitle","bp","split","spriteH","parseInt","replace","spriteV","setAttribute","img","alt","src","enableRetinaIcons","clip","textElm","text","innerText","_b","_c","html","innerHTML","_d","getStyles","Math","min","length","max","index","latlng","getProjection","fromLatLngToDivPixel","Cluster","markerClusterer","gridSize","getGridSize","minClusterSize","getMinimumClusterSize","averageCenter","getAverageCenter","markers","bounds","clusterIcon","getSize","getMarkers","getCenter","remove","addMarker","isMarkerInClusterBounds","calculateBounds","updateIcon","isMarkerAlreadyAdded","LatLngBounds","i","position","getPosition","marker","length_1","LatLng","lat","lng","isAdded","push","mCount","maxZoom","contains","getExtendedBounds","getCalculator","includes","CALCULATOR","numStyles","count","numberOfDigits","toString","IMAGE_SIZES","Clusterer","optMarkers","optOptions","setMinimumClusterSize","getEnableRetinaIcons","setEnableRetinaIcons","addToClosestCluster","getImageExtension","setImageExtension","setAverageCenter","getTotalClusters","fitMapToMarkers","getIgnoreHidden","setIgnoreHidden","setClusterClass","getTotalMarkers","setZoomOnClick","getBatchSizeIE","setBatchSizeIE","createClusters","onZoomChanged","getImageSizes","setImageSizes","setCalculator","removeMarkers","resetViewport","getImagePath","setImagePath","pushMarkerTo","removeMarker","clearMarkers","setupStyles","setGridSize","getClusters","setMaxZoom","addMarkers","setStyles","setTitle","repaint","onIdle","redraw","clusters","listeners","activeMap","ready","minimumClusterSize","zoomOnClick","ignoreHidden","imagePath","imageExtension","imageSizes","calculator","batchSize","batchSizeIE","clusterClass","navigator","userAgent","toLowerCase","indexOf","timerRefStatic","get","optNoDraw","key","Object","hasOwnProperty","call","_this","getDraggable","removeMarker_","splice","removed","oldClusters","slice","projection","trPix","getNorthEast","blPix","getSouthWest","point1","fromDivPixelToLatLng","point2","optHide","distanceBetweenPoints","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","isMarkerInBounds","distance","clusterToAddTo","d","iFirst","mapBounds","extendedMapBounds","iLast","getVisible","obj1","obj2","object","property","apply"],"mappings":"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"}
1
+ {"version":3,"file":"cjs.min.js","sources":["../src/ClusterIcon.tsx","../src/Cluster.tsx","../src/Clusterer.tsx"],"sourcesContent":["/* global google */\n/* eslint-disable filenames/match-regex */\nimport type { Cluster } from './Cluster'\n\nimport type { ClusterIconStyle, ClusterIconInfo } from './types'\n\nexport class ClusterIcon {\n cluster: Cluster\n className: string\n clusterClassName: string\n styles: ClusterIconStyle[]\n center: google.maps.LatLng | undefined\n div: HTMLDivElement | null\n sums: ClusterIconInfo | null\n visible: boolean\n url: string\n height: number\n width: number\n anchorText: [number, number]\n anchorIcon: [number, number]\n textColor: string\n textSize: number\n textDecoration: string\n fontWeight: string\n fontStyle: string\n fontFamily: string\n backgroundPosition: string\n cMouseDownInCluster: boolean | null\n cDraggingMapByCluster: boolean | null\n timeOut: number | null\n\n boundsChangedListener: google.maps.MapsEventListener | null\n\n constructor(cluster: Cluster, styles: ClusterIconStyle[]) {\n cluster.getClusterer().extend(ClusterIcon, google.maps.OverlayView)\n\n this.cluster = cluster\n\n this.clusterClassName = this.cluster.getClusterer().getClusterClass()\n\n this.className = this.clusterClassName\n\n this.styles = styles\n\n this.center = undefined\n\n this.div = null\n\n this.sums = null\n\n this.visible = false\n\n this.boundsChangedListener = null\n\n this.url = ''\n\n this.height = 0\n this.width = 0\n\n this.anchorText = [0, 0]\n this.anchorIcon = [0, 0]\n\n this.textColor = 'black'\n this.textSize = 11\n this.textDecoration = 'none'\n this.fontWeight = 'bold'\n this.fontStyle = 'normal'\n this.fontFamily = 'Arial,sans-serif'\n\n this.backgroundPosition = '0 0'\n\n this.cMouseDownInCluster = null\n this.cDraggingMapByCluster = null\n this.timeOut = null;\n\n (this as unknown as google.maps.OverlayView).setMap(cluster.getMap()) // Note: this causes onAdd to be called\n\n this.onBoundsChanged = this.onBoundsChanged.bind(this)\n this.onMouseDown = this.onMouseDown.bind(this)\n this.onClick = this.onClick.bind(this)\n this.onMouseOver = this.onMouseOver.bind(this)\n this.onMouseOut = this.onMouseOut.bind(this)\n this.onAdd = this.onAdd.bind(this)\n this.onRemove = this.onRemove.bind(this)\n this.draw = this.draw.bind(this)\n this.hide = this.hide.bind(this)\n this.show = this.show.bind(this)\n this.useStyle = this.useStyle.bind(this)\n this.setCenter = this.setCenter.bind(this)\n this.getPosFromLatLng = this.getPosFromLatLng.bind(this)\n }\n\n onBoundsChanged() {\n this.cDraggingMapByCluster = this.cMouseDownInCluster\n }\n\n onMouseDown() {\n this.cMouseDownInCluster = true\n\n this.cDraggingMapByCluster = false\n }\n\n onClick(event: Event) {\n this.cMouseDownInCluster = false\n\n if (!this.cDraggingMapByCluster) {\n const markerClusterer = this.cluster.getClusterer()\n\n /**\n * This event is fired when a cluster marker is clicked.\n * @name MarkerClusterer#click\n * @param {Cluster} c The cluster that was clicked.\n * @event\n */\n google.maps.event.trigger(markerClusterer, 'click', this.cluster)\n google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster) // deprecated name\n\n // The default click handler follows. Disable it by setting\n // the zoomOnClick property to false.\n if (markerClusterer.getZoomOnClick()) {\n // Zoom into the cluster.\n const maxZoom = markerClusterer.getMaxZoom()\n\n const bounds = this.cluster.getBounds()\n\n const map = (markerClusterer as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null && 'fitBounds' in map) {\n map.fitBounds(bounds)\n }\n\n\n // There is a fix for Issue 170 here:\n this.timeOut = window.setTimeout(() => {\n const map = (markerClusterer as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null) {\n if ('fitBounds' in map) {\n map.fitBounds(bounds)\n }\n\n const zoom = map.getZoom() || 0\n\n // Don't zoom beyond the max zoom level\n if (\n maxZoom !== null &&\n zoom > maxZoom\n ) {\n map.setZoom(maxZoom + 1)\n }\n }\n }, 100)\n }\n\n // Prevent event propagation to the map:\n event.cancelBubble = true\n\n if (event.stopPropagation) {\n event.stopPropagation()\n }\n }\n }\n\n onMouseOver() {\n /**\n * This event is fired when the mouse moves over a cluster marker.\n * @name MarkerClusterer#mouseover\n * @param {Cluster} c The cluster that the mouse moved over.\n * @event\n */\n google.maps.event.trigger(\n this.cluster.getClusterer(),\n 'mouseover',\n this.cluster\n )\n }\n\n onMouseOut() {\n /**\n * This event is fired when the mouse moves out of a cluster marker.\n * @name MarkerClusterer#mouseout\n * @param {Cluster} c The cluster that the mouse moved out of.\n * @event\n */\n google.maps.event.trigger(\n this.cluster.getClusterer(),\n 'mouseout',\n this.cluster\n )\n }\n\n onAdd() {\n this.div = document.createElement('div')\n\n this.div.className = this.className\n\n if (this.visible) {\n this.show()\n }\n\n ;(this as unknown as google.maps.OverlayView).getPanes()?.overlayMouseTarget.appendChild(this.div)\n\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null) {\n // Fix for Issue 157\n this.boundsChangedListener = google.maps.event.addListener(\n map,\n 'bounds_changed',\n this.onBoundsChanged\n )\n\n this.div.addEventListener('mousedown', this.onMouseDown)\n\n this.div.addEventListener('click', this.onClick)\n\n this.div.addEventListener('mouseover', this.onMouseOver)\n\n this.div.addEventListener('mouseout', this.onMouseOut)\n }\n }\n\n onRemove() {\n if (this.div && this.div.parentNode) {\n this.hide()\n\n if (this.boundsChangedListener !== null) {\n google.maps.event.removeListener(this.boundsChangedListener)\n }\n\n this.div.removeEventListener('mousedown', this.onMouseDown)\n\n this.div.removeEventListener('click', this.onClick)\n\n this.div.removeEventListener('mouseover', this.onMouseOver)\n\n this.div.removeEventListener('mouseout', this.onMouseOut)\n\n this.div.parentNode.removeChild(this.div)\n\n if (this.timeOut !== null) {\n window.clearTimeout(this.timeOut)\n\n this.timeOut = null\n }\n\n this.div = null\n }\n }\n\n draw() {\n if (this.visible && this.div !== null && this.center) {\n const pos = this.getPosFromLatLng(this.center)\n\n this.div.style.top = pos !== null ? `${pos.y}px` : '0'\n this.div.style.left = pos !== null ? `${pos.x}px` : '0'\n }\n }\n\n hide() {\n if (this.div) {\n this.div.style.display = 'none'\n }\n\n this.visible = false\n }\n\n show() {\n if (this.div && this.center) {\n const divTitle = this.sums === null ||\n typeof this.sums.title === 'undefined' ||\n this.sums.title === '' ? this.cluster.getClusterer().getTitle() : this.sums.title\n\n // NOTE: values must be specified in px units\n const bp = this.backgroundPosition.split(' ')\n\n const spriteH = parseInt(bp[0]?.replace(/^\\s+|\\s+$/g, '') || '0', 10)\n const spriteV = parseInt(bp[1]?.replace(/^\\s+|\\s+$/g, '') || '0', 10)\n\n const pos = this.getPosFromLatLng(this.center)\n\n this.div.className = this.className\n this.div .setAttribute('style', `cursor: pointer; position: absolute; top: ${pos !== null ? `${pos.y}px` : '0'}; left: ${pos !== null ? `${pos.x}px` : '0'}; width: ${this.width}px; height: ${this.height}px; `)\n\n const img = document.createElement('img')\n\n img.alt = divTitle\n img.src = this.url\n img.width = this.width\n img.height = this.height\n img.setAttribute('style', `position: absolute; top: ${spriteV}px; left: ${spriteH}px`)\n\n if (!this.cluster.getClusterer().enableRetinaIcons) {\n img.style.clip = `rect(-${spriteV}px, -${spriteH + this.width}px, -${\n spriteV + this.height\n }, -${spriteH})`\n }\n\n const textElm = document.createElement('div')\n\n textElm .setAttribute('style', `position: absolute; top: ${this.anchorText[0]}px; left: ${this.anchorText[1]}px; color: ${this.textColor}; font-size: ${this.textSize}px; font-family: ${this.fontFamily}; font-weight: ${this.fontWeight}; fontStyle: ${this.fontStyle}; text-decoration: ${this.textDecoration}; text-align: center; width: ${this.width}px; line-height: ${this.height}px`)\n\n if (this.sums?.text) textElm.innerText = `${this.sums?.text}`\n if (this.sums?.html) textElm.innerHTML = `${this.sums?.html}`\n\n this.div.innerHTML = ''\n\n this.div.appendChild(img)\n this.div.appendChild(textElm)\n\n this.div.title = divTitle\n\n this.div.style.display = ''\n }\n\n this.visible = true\n }\n\n useStyle(sums: ClusterIconInfo) {\n this.sums = sums\n\n const styles = this.cluster.getClusterer().getStyles()\n\n const style =\n styles[Math.min(styles.length - 1, Math.max(0, sums.index - 1))]\n\n if (style) {\n this.url = style.url\n this.height = style.height\n this.width = style.width\n\n if (style.className) {\n this.className = `${this.clusterClassName} ${style.className}`\n }\n\n this.anchorText = style.anchorText || [0, 0]\n this.anchorIcon = style.anchorIcon || [this.height / 2, this.width / 2]\n\n this.textColor = style.textColor || 'black'\n\n this.textSize = style.textSize || 11\n\n this.textDecoration = style.textDecoration || 'none'\n\n this.fontWeight = style.fontWeight || 'bold'\n\n this.fontStyle = style.fontStyle || 'normal'\n\n this.fontFamily = style.fontFamily || 'Arial,sans-serif'\n\n this.backgroundPosition = style.backgroundPosition || '0 0'\n }\n }\n\n setCenter(center: google.maps.LatLng) {\n this.center = center\n }\n\n getPosFromLatLng(latlng: google.maps.LatLng): google.maps.Point | null {\n const pos = (this as unknown as google.maps.OverlayView).getProjection().fromLatLngToDivPixel(latlng)\n\n if (pos !== null) {\n pos.x -= this.anchorIcon[1]\n\n pos.y -= this.anchorIcon[0]\n }\n\n return pos\n }\n}\n","/* global google */\n\nimport type { Clusterer } from './Clusterer'\n\nimport { ClusterIcon } from './ClusterIcon'\n\nimport type { MarkerExtended } from './types'\n\nexport class Cluster {\n markerClusterer: Clusterer\n map: google.maps.Map | google.maps.StreetViewPanorama | null\n gridSize: number\n minClusterSize: number\n averageCenter: boolean\n markers: MarkerExtended[]\n center: google.maps.LatLng | undefined\n bounds: google.maps.LatLngBounds | null\n clusterIcon: ClusterIcon\n\n constructor(markerClusterer: Clusterer) {\n this.markerClusterer = markerClusterer\n\n this.map = (this.markerClusterer as unknown as google.maps.OverlayView).getMap()\n\n this.gridSize = this.markerClusterer.getGridSize()\n\n this.minClusterSize = this.markerClusterer.getMinimumClusterSize()\n\n this.averageCenter = this.markerClusterer.getAverageCenter()\n\n this.markers = []\n\n this.center = undefined\n\n this.bounds = null\n\n this.clusterIcon = new ClusterIcon(this, this.markerClusterer.getStyles())\n\n this.getSize = this.getSize.bind(this)\n this.getMarkers = this.getMarkers.bind(this)\n this.getCenter = this.getCenter.bind(this)\n this.getMap = this.getMap.bind(this)\n this.getClusterer = this.getClusterer.bind(this)\n this.getBounds = this.getBounds.bind(this)\n this.remove = this.remove.bind(this)\n this.addMarker = this.addMarker.bind(this)\n this.isMarkerInClusterBounds = this.isMarkerInClusterBounds.bind(this)\n this.calculateBounds = this.calculateBounds.bind(this)\n this.updateIcon = this.updateIcon.bind(this)\n this.isMarkerAlreadyAdded = this.isMarkerAlreadyAdded.bind(this)\n }\n\n getSize(): number {\n return this.markers.length\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getCenter(): google.maps.LatLng | undefined {\n return this.center\n }\n\n getMap(): google.maps.Map | google.maps.StreetViewPanorama | null {\n return this.map\n }\n\n getClusterer(): Clusterer {\n return this.markerClusterer\n }\n\n getBounds(): google.maps.LatLngBounds {\n const bounds = new google.maps.LatLngBounds(this.center, this.center)\n\n const markers = this.getMarkers()\n\n for (const marker of markers) {\n const position = marker.getPosition()\n\n if (position) {\n bounds.extend(position)\n }\n }\n\n return bounds\n }\n\n remove() {\n (this.clusterIcon as unknown as google.maps.OverlayView).setMap(null)\n\n this.markers = []\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n delete this.markers\n }\n\n addMarker(marker: MarkerExtended): boolean {\n if (this.isMarkerAlreadyAdded(marker)) {\n return false\n }\n\n if (!this.center) {\n const position = marker.getPosition()\n\n if (position) {\n this.center = position\n\n this.calculateBounds()\n }\n } else {\n if (this.averageCenter) {\n const position = marker.getPosition()\n\n if (position) {\n const length = this.markers.length + 1\n\n this.center = new google.maps.LatLng(\n (this.center.lat() * (length - 1) + position.lat()) / length,\n (this.center.lng() * (length - 1) + position.lng()) / length\n )\n\n this.calculateBounds()\n }\n }\n }\n\n marker.isAdded = true\n\n this.markers.push(marker)\n\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map?.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n // Zoomed in past max zoom, so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount < this.minClusterSize) {\n // Min cluster size not reached so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount === this.minClusterSize) {\n // Hide the markers that were showing.\n for (const markerElement of this.markers) {\n markerElement.setMap(null)\n }\n } else {\n marker.setMap(null)\n }\n\n return true\n }\n\n isMarkerInClusterBounds(marker: MarkerExtended): boolean {\n if (this.bounds !== null) {\n const position = marker.getPosition()\n\n if (position) {\n return this.bounds.contains(position)\n }\n }\n\n return false\n }\n\n calculateBounds() {\n this.bounds = this.markerClusterer.getExtendedBounds(\n new google.maps.LatLngBounds(this.center, this.center)\n )\n }\n\n updateIcon() {\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map?.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n this.clusterIcon.hide()\n\n return\n }\n\n if (mCount < this.minClusterSize) {\n // Min cluster size not yet reached.\n this.clusterIcon.hide()\n\n return\n }\n\n if (this.center) {\n this.clusterIcon.setCenter(this.center)\n }\n\n this.clusterIcon.useStyle(\n this.markerClusterer.getCalculator()(this.markers, this.markerClusterer.getStyles().length)\n )\n\n this.clusterIcon.show()\n }\n\n isMarkerAlreadyAdded(marker: MarkerExtended): boolean {\n if (this.markers.includes) {\n return this.markers.includes(marker)\n }\n\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n return true\n }\n }\n\n return false\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\nimport type { ClusterIcon } from './ClusterIcon'\n\nimport type {\n MarkerExtended,\n ClustererOptions,\n ClusterIconStyle,\n TCalculator,\n ClusterIconInfo,\n} from './types'\n\n/**\n * Supports up to 9007199254740991 (Number.MAX_SAFE_INTEGER) markers\n * which is not a problem as max array length is 4294967296 (2**32)\n */\nfunction CALCULATOR(\n markers: MarkerExtended[],\n numStyles: number\n): ClusterIconInfo {\n const count = markers.length\n\n const numberOfDigits = count.toString().length\n\n const index = Math.min(numberOfDigits, numStyles)\n\n return {\n text: count.toString(),\n index,\n title: '',\n }\n}\n\nconst BATCH_SIZE = 2000\n\nconst BATCH_SIZE_IE = 500\n\nconst IMAGE_PATH =\n 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'\n\nconst IMAGE_EXTENSION = 'png'\n\nconst IMAGE_SIZES = [53, 56, 66, 78, 90]\n\nconst CLUSTERER_CLASS = 'cluster'\n\nexport class Clusterer implements google.maps.OverlayView {\n markers: MarkerExtended[]\n clusters: Cluster[]\n listeners: google.maps.MapsEventListener[]\n activeMap: google.maps.Map | google.maps.StreetViewPanorama | null\n ready: boolean\n gridSize: number\n minClusterSize: number\n maxZoom: number | null\n styles: ClusterIconStyle[]\n title: string\n zoomOnClick: boolean\n averageCenter: boolean\n ignoreHidden: boolean\n enableRetinaIcons: boolean\n imagePath: string\n imageExtension: string\n imageSizes: number[]\n calculator: TCalculator\n batchSize: number\n batchSizeIE: number\n clusterClass: string\n timerRefStatic: number | null\n\n constructor(\n map: google.maps.Map,\n optMarkers: MarkerExtended[] = [],\n optOptions: ClustererOptions = {}\n ) {\n this.getMinimumClusterSize = this.getMinimumClusterSize.bind(this)\n this.setMinimumClusterSize = this.setMinimumClusterSize.bind(this)\n this.getEnableRetinaIcons = this.getEnableRetinaIcons.bind(this)\n this.setEnableRetinaIcons = this.setEnableRetinaIcons.bind(this)\n this.addToClosestCluster = this.addToClosestCluster.bind(this)\n this.getImageExtension = this.getImageExtension.bind(this)\n this.setImageExtension = this.setImageExtension.bind(this)\n this.getExtendedBounds = this.getExtendedBounds.bind(this)\n this.getAverageCenter = this.getAverageCenter.bind(this)\n this.setAverageCenter = this.setAverageCenter.bind(this)\n this.getTotalClusters = this.getTotalClusters.bind(this)\n this.fitMapToMarkers = this.fitMapToMarkers.bind(this)\n this.getIgnoreHidden = this.getIgnoreHidden.bind(this)\n this.setIgnoreHidden = this.setIgnoreHidden.bind(this)\n this.getClusterClass = this.getClusterClass.bind(this)\n this.setClusterClass = this.setClusterClass.bind(this)\n this.getTotalMarkers = this.getTotalMarkers.bind(this)\n this.getZoomOnClick = this.getZoomOnClick.bind(this)\n this.setZoomOnClick = this.setZoomOnClick.bind(this)\n this.getBatchSizeIE = this.getBatchSizeIE.bind(this)\n this.setBatchSizeIE = this.setBatchSizeIE.bind(this)\n this.createClusters = this.createClusters.bind(this)\n this.onZoomChanged = this.onZoomChanged.bind(this)\n this.getImageSizes = this.getImageSizes.bind(this)\n this.setImageSizes = this.setImageSizes.bind(this)\n this.getCalculator = this.getCalculator.bind(this)\n this.setCalculator = this.setCalculator.bind(this)\n this.removeMarkers = this.removeMarkers.bind(this)\n this.resetViewport = this.resetViewport.bind(this)\n this.getImagePath = this.getImagePath.bind(this)\n this.setImagePath = this.setImagePath.bind(this)\n this.pushMarkerTo = this.pushMarkerTo.bind(this)\n this.removeMarker = this.removeMarker.bind(this)\n this.clearMarkers = this.clearMarkers.bind(this)\n this.setupStyles = this.setupStyles.bind(this)\n this.getGridSize = this.getGridSize.bind(this)\n this.setGridSize = this.setGridSize.bind(this)\n this.getClusters = this.getClusters.bind(this)\n this.getMaxZoom = this.getMaxZoom.bind(this)\n this.setMaxZoom = this.setMaxZoom.bind(this)\n this.getMarkers = this.getMarkers.bind(this)\n this.addMarkers = this.addMarkers.bind(this)\n this.getStyles = this.getStyles.bind(this)\n this.setStyles = this.setStyles.bind(this)\n this.addMarker = this.addMarker.bind(this)\n this.onRemove = this.onRemove.bind(this)\n this.getTitle = this.getTitle.bind(this)\n this.setTitle = this.setTitle.bind(this)\n this.repaint = this.repaint.bind(this)\n this.onIdle = this.onIdle.bind(this)\n this.redraw = this.redraw.bind(this)\n this.onAdd = this.onAdd.bind(this)\n this.draw = this.draw.bind(this)\n\n this.extend = this.extend.bind(this)\n this.extend(Clusterer, google.maps.OverlayView)\n\n this.markers = []\n this.clusters = []\n this.listeners = []\n this.activeMap = null\n this.ready = false\n this.gridSize = optOptions.gridSize || 60\n this.minClusterSize = optOptions.minimumClusterSize || 2\n this.maxZoom = optOptions.maxZoom || null\n this.styles = optOptions.styles || []\n\n this.title = optOptions.title || ''\n\n this.zoomOnClick = true\n\n if (optOptions.zoomOnClick !== undefined) {\n this.zoomOnClick = optOptions.zoomOnClick\n }\n\n this.averageCenter = false\n\n if (optOptions.averageCenter !== undefined) {\n this.averageCenter = optOptions.averageCenter\n }\n\n this.ignoreHidden = false\n\n if (optOptions.ignoreHidden !== undefined) {\n this.ignoreHidden = optOptions.ignoreHidden\n }\n\n this.enableRetinaIcons = false\n\n if (optOptions.enableRetinaIcons !== undefined) {\n this.enableRetinaIcons = optOptions.enableRetinaIcons\n }\n this.imagePath = optOptions.imagePath || IMAGE_PATH\n\n this.imageExtension = optOptions.imageExtension || IMAGE_EXTENSION\n\n this.imageSizes = optOptions.imageSizes || IMAGE_SIZES\n\n this.calculator = optOptions.calculator || CALCULATOR\n\n this.batchSize = optOptions.batchSize || BATCH_SIZE\n\n this.batchSizeIE = optOptions.batchSizeIE || BATCH_SIZE_IE\n\n this.clusterClass = optOptions.clusterClass || CLUSTERER_CLASS\n\n if (navigator.userAgent.toLowerCase().indexOf('msie') !== -1) {\n // Try to avoid IE timeout when processing a huge number of markers:\n this.batchSize = this.batchSizeIE\n }\n\n this.timerRefStatic = null\n\n this.setupStyles()\n\n this.addMarkers(optMarkers, true);\n\n (this as unknown as google.maps.OverlayView).setMap(map) // Note: this causes onAdd to be called\n }\n\n onZoomChanged(): void {\n this.resetViewport(false)\n\n // Workaround for this Google bug: when map is at level 0 and \"-\" of\n // zoom slider is clicked, a \"zoom_changed\" event is fired even though\n // the map doesn't zoom out any further. In this situation, no \"idle\"\n // event is triggered so the cluster markers that have been removed\n // do not get redrawn. Same goes for a zoom in at maxZoom.\n if (\n (this as unknown as google.maps.OverlayView).getMap()?.getZoom() === ((this as unknown as google.maps.OverlayView).get('minZoom') || 0) ||\n (this as unknown as google.maps.OverlayView).getMap()?.getZoom() === (this as unknown as google.maps.OverlayView).get('maxZoom')\n ) {\n google.maps.event.trigger(this, 'idle')\n }\n }\n\n onIdle(): void {\n this.redraw()\n }\n\n onAdd(): void {\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n this.activeMap = map\n\n this.ready = true\n\n this.repaint()\n\n if (map !== null) {\n // Add the map event listeners\n this.listeners = [\n google.maps.event.addListener(\n map,\n 'zoom_changed',\n this.onZoomChanged\n ),\n google.maps.event.addListener(\n map,\n 'idle',\n this.onIdle\n ),\n ]\n }\n }\n\n onRemove(): void {\n // Put all the managed markers back on the map:\n for (const marker of this.markers) {\n if (marker.getMap() !== this.activeMap) {\n marker.setMap(this.activeMap)\n }\n }\n\n // Remove all clusters:\n for (const cluster of this.clusters) {\n cluster.remove()\n }\n\n this.clusters = []\n\n // Remove map event listeners:\n for (const listener of this.listeners) {\n google.maps.event.removeListener(listener)\n }\n\n this.listeners = []\n\n this.activeMap = null\n\n this.ready = false\n }\n\n draw(): void { return }\n\n getMap(): null { return null }\n\n getPanes(): null { return null }\n\n getProjection() {\n return {\n fromContainerPixelToLatLng(): null { return null },\n fromDivPixelToLatLng(): null { return null},\n fromLatLngToContainerPixel(): null { return null},\n fromLatLngToDivPixel(): null { return null},\n getVisibleRegion(): null { return null },\n getWorldWidth(): number { return 0 }\n }\n }\n\n setMap(): void { return }\n\n addListener() {\n return {\n remove() { return }\n }\n }\n\n bindTo(): void { return }\n\n get(): void { return }\n\n notify(): void { return }\n\n set(): void { return }\n setValues(): void { return }\n unbind(): void { return }\n unbindAll(): void { return }\n\n setupStyles(): void {\n if (this.styles.length > 0) {\n return\n }\n\n for (let i = 0; i < this.imageSizes.length; i++) {\n this.styles.push({\n url: `${this.imagePath + (i + 1)}.${this.imageExtension}`,\n height: this.imageSizes[i] || 0,\n width: this.imageSizes[i] || 0,\n })\n }\n }\n\n fitMapToMarkers(): void {\n const markers = this.getMarkers()\n\n const bounds = new google.maps.LatLngBounds()\n\n for (const marker of markers) {\n const position = marker.getPosition()\n\n if (position) {\n bounds.extend(position)\n }\n }\n\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n if (map !== null && 'fitBounds' in map) {\n map.fitBounds(bounds)\n }\n\n }\n\n getGridSize(): number {\n return this.gridSize\n }\n\n setGridSize(gridSize: number) {\n this.gridSize = gridSize\n }\n\n getMinimumClusterSize(): number {\n return this.minClusterSize\n }\n\n setMinimumClusterSize(minimumClusterSize: number) {\n this.minClusterSize = minimumClusterSize\n }\n\n getMaxZoom(): number | null {\n return this.maxZoom\n }\n\n setMaxZoom(maxZoom: number) {\n this.maxZoom = maxZoom\n }\n\n getStyles(): ClusterIconStyle[] {\n return this.styles\n }\n\n setStyles(styles: ClusterIconStyle[]) {\n this.styles = styles\n }\n\n getTitle(): string {\n return this.title\n }\n\n setTitle(title: string) {\n this.title = title\n }\n\n getZoomOnClick(): boolean {\n return this.zoomOnClick\n }\n\n setZoomOnClick(zoomOnClick: boolean) {\n this.zoomOnClick = zoomOnClick\n }\n\n getAverageCenter(): boolean {\n return this.averageCenter\n }\n\n setAverageCenter(averageCenter: boolean) {\n this.averageCenter = averageCenter\n }\n\n getIgnoreHidden(): boolean {\n return this.ignoreHidden\n }\n\n setIgnoreHidden(ignoreHidden: boolean) {\n this.ignoreHidden = ignoreHidden\n }\n\n getEnableRetinaIcons(): boolean {\n return this.enableRetinaIcons\n }\n\n setEnableRetinaIcons(enableRetinaIcons: boolean) {\n this.enableRetinaIcons = enableRetinaIcons\n }\n\n getImageExtension(): string {\n return this.imageExtension\n }\n\n setImageExtension(imageExtension: string) {\n this.imageExtension = imageExtension\n }\n\n getImagePath(): string {\n return this.imagePath\n }\n\n setImagePath(imagePath: string) {\n this.imagePath = imagePath\n }\n\n getImageSizes(): number[] {\n return this.imageSizes\n }\n\n setImageSizes(imageSizes: number[]) {\n this.imageSizes = imageSizes\n }\n\n getCalculator(): TCalculator {\n return this.calculator\n }\n\n setCalculator(calculator: TCalculator) {\n this.calculator = calculator\n }\n\n getBatchSizeIE(): number {\n return this.batchSizeIE\n }\n\n setBatchSizeIE(batchSizeIE: number) {\n this.batchSizeIE = batchSizeIE\n }\n\n getClusterClass(): string {\n return this.clusterClass\n }\n\n setClusterClass(clusterClass: string) {\n this.clusterClass = clusterClass\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getTotalMarkers(): number {\n return this.markers.length\n }\n\n getClusters(): Cluster[] {\n return this.clusters\n }\n\n getTotalClusters(): number {\n return this.clusters.length\n }\n\n addMarker(marker: MarkerExtended, optNoDraw: boolean) {\n this.pushMarkerTo(marker)\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n addMarkers(markers: MarkerExtended[], optNoDraw: boolean) {\n for (const key in markers) {\n if (Object.prototype.hasOwnProperty.call(markers, key)) {\n const marker = markers[key]\n\n if (marker) {\n this.pushMarkerTo(marker)\n }\n }\n }\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n pushMarkerTo(marker: MarkerExtended) {\n // If the marker is draggable add a listener so we can update the clusters on the dragend:\n if (marker.getDraggable()) {\n google.maps.event.addListener(marker, 'dragend', () => {\n if (this.ready) {\n marker.isAdded = false\n\n this.repaint()\n }\n })\n }\n\n marker.isAdded = false\n\n this.markers.push(marker)\n }\n\n removeMarker_(marker: MarkerExtended): boolean {\n let index = -1\n\n if (this.markers.indexOf) {\n index = this.markers.indexOf(marker)\n } else {\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n index = i\n\n break\n }\n }\n }\n\n if (index === -1) {\n // Marker is not in our list of markers, so do nothing:\n return false\n }\n\n marker.setMap(null)\n\n this.markers.splice(index, 1) // Remove the marker from the list of managed markers\n\n return true\n }\n\n removeMarker(marker: MarkerExtended, optNoDraw: boolean): boolean {\n const removed = this.removeMarker_(marker)\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n removeMarkers(markers: MarkerExtended[], optNoDraw: boolean): boolean {\n let removed = false\n\n for (const marker of markers) {\n removed = removed || this.removeMarker_(marker)\n }\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n clearMarkers() {\n this.resetViewport(true)\n\n this.markers = []\n }\n\n repaint() {\n const oldClusters = this.clusters.slice()\n\n this.clusters = []\n\n this.resetViewport(false)\n\n this.redraw()\n\n // Remove the old clusters.\n // Do it in a timeout to prevent blinking effect.\n setTimeout(function timeout() {\n for (const oldCluster of oldClusters) {\n oldCluster.remove()\n }\n }, 0)\n }\n\n getExtendedBounds(bounds: google.maps.LatLngBounds): google.maps.LatLngBounds {\n const projection = (this as unknown as google.maps.OverlayView).getProjection()\n\n // Convert the points to pixels and the extend out by the grid size.\n const trPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng())\n )\n\n if (trPix !== null) {\n trPix.x += this.gridSize\n trPix.y -= this.gridSize\n }\n\n const blPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng())\n )\n\n if (blPix !== null) {\n blPix.x -= this.gridSize\n blPix.y += this.gridSize\n }\n\n\n // Extend the bounds to contain the new bounds.\n if (trPix !== null) {\n // Convert the pixel points back to LatLng nw\n const point1 = projection.fromDivPixelToLatLng(trPix)\n\n if (point1 !== null) {\n bounds.extend(point1)\n }\n }\n\n if (blPix !== null) {\n // Convert the pixel points back to LatLng sw\n const point2 = projection.fromDivPixelToLatLng(blPix)\n\n if (point2 !== null) {\n bounds.extend(\n point2\n )\n }\n }\n\n\n return bounds\n }\n\n redraw() {\n // Redraws all the clusters.\n this.createClusters(0)\n }\n\n resetViewport(optHide: boolean) {\n // Remove all the clusters\n for (const cluster of this.clusters) {\n cluster.remove()\n }\n\n this.clusters = []\n\n // Reset the markers to not be added and to be removed from the map.\n for (const marker of this.markers) {\n marker.isAdded = false\n\n if (optHide) {\n marker.setMap(null)\n }\n }\n }\n\n distanceBetweenPoints(p1: google.maps.LatLng, p2: google.maps.LatLng): number {\n const R = 6371 // Radius of the Earth in km\n\n const dLat = ((p2.lat() - p1.lat()) * Math.PI) / 180\n const dLon = ((p2.lng() - p1.lng()) * Math.PI) / 180\n\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos((p1.lat() * Math.PI) / 180) *\n Math.cos((p2.lat() * Math.PI) / 180) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2)\n\n return R * (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)))\n }\n\n isMarkerInBounds(marker: MarkerExtended, bounds: google.maps.LatLngBounds): boolean {\n const position = marker.getPosition()\n\n if (position) {\n return bounds.contains(position)\n }\n\n return false\n }\n\n addToClosestCluster(marker: MarkerExtended) {\n let cluster\n\n let distance = 40000 // Some large number\n\n let clusterToAddTo = null\n\n for (const clusterElement of this.clusters) {\n cluster = clusterElement\n\n const center = cluster.getCenter()\n\n const position = marker.getPosition()\n\n if (center && position) {\n const d = this.distanceBetweenPoints(center, position)\n\n if (d < distance) {\n distance = d\n\n clusterToAddTo = cluster\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker)\n } else {\n cluster = new Cluster(this)\n\n cluster.addMarker(marker)\n\n this.clusters.push(cluster)\n }\n }\n\n createClusters(iFirst: number) {\n if (!this.ready) {\n return\n }\n\n // Cancel previous batch processing if we're working on the first batch:\n if (iFirst === 0) {\n /**\n * This event is fired when the <code>Clusterer</code> begins\n * clustering markers.\n * @name Clusterer#clusteringbegin\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringbegin', this)\n\n if (this.timerRefStatic !== null) {\n window.clearTimeout(this.timerRefStatic)\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n delete this.timerRefStatic\n }\n }\n\n const map = (this as unknown as google.maps.OverlayView).getMap()\n\n const bounds = map !== null && 'getBounds' in map ? map.getBounds() : null\n\n const zoom = map?.getZoom() || 0\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n //\n // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug:\n const mapBounds = zoom > 3\n ? new google.maps.LatLngBounds(\n bounds?.getSouthWest(),\n bounds?.getNorthEast()\n )\n : new google.maps.LatLngBounds(\n new google.maps.LatLng(85.02070771743472, -178.48388434375),\n new google.maps.LatLng(-85.08136444384544, 178.00048865625)\n )\n\n const extendedMapBounds = this.getExtendedBounds(mapBounds)\n\n const iLast = Math.min(iFirst + this.batchSize, this.markers.length)\n\n for (let i = iFirst; i < iLast; i++) {\n const marker = this.markers[i]\n\n if (marker && !marker.isAdded && this.isMarkerInBounds(marker, extendedMapBounds) && (!this.ignoreHidden || (this.ignoreHidden && marker.getVisible()))) {\n this.addToClosestCluster(marker)\n }\n }\n\n if (iLast < this.markers.length) {\n this.timerRefStatic = window.setTimeout(\n () => {\n this.createClusters(iLast)\n },\n 0\n )\n } else {\n this.timerRefStatic = null\n\n /**\n * This event is fired when the <code>Clusterer</code> stops\n * clustering markers.\n * @name Clusterer#clusteringend\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringend', this)\n\n for (const cluster of this.clusters) {\n cluster.updateIcon()\n }\n }\n }\n\n extend<A extends typeof Clusterer | typeof ClusterIcon>(obj1: A, obj2: typeof google.maps.OverlayView): A {\n return function applyExtend(this: A, object: typeof google.maps.OverlayView): A {\n for (const property in object.prototype) {\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n const prop = property as keyof google.maps.OverlayView & (string & {})\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.prototype[prop] = object.prototype[prop]\n }\n\n return this\n }.apply<A, [typeof google.maps.OverlayView], A>(obj1, [obj2])\n }\n}\n"],"names":["ClusterIcon","cluster","styles","getClusterer","extend","google","maps","OverlayView","this","clusterClassName","getClusterClass","className","center","undefined","div","sums","visible","boundsChangedListener","url","height","width","anchorText","anchorIcon","textColor","textSize","textDecoration","fontWeight","fontStyle","fontFamily","backgroundPosition","cMouseDownInCluster","cDraggingMapByCluster","timeOut","setMap","getMap","onBoundsChanged","bind","onMouseDown","onClick","onMouseOver","onMouseOut","onAdd","onRemove","draw","hide","show","useStyle","setCenter","getPosFromLatLng","prototype","event","markerClusterer_1","trigger","getZoomOnClick","maxZoom_1","getMaxZoom","bounds_1","getBounds","map","fitBounds","window","setTimeout","zoom","getZoom","setZoom","cancelBubble","stopPropagation","document","createElement","_a","getPanes","overlayMouseTarget","appendChild","addListener","addEventListener","parentNode","removeListener","removeEventListener","removeChild","clearTimeout","pos","style","top","concat","y","left","x","display","divTitle","title","getTitle","bp","split","spriteH","parseInt","replace","spriteV","_b","setAttribute","img","alt","src","enableRetinaIcons","clip","textElm","_c","text","innerText","_d","_e","html","innerHTML","_f","getStyles","Math","min","length","max","index","latlng","getProjection","fromLatLngToDivPixel","Cluster","markerClusterer","gridSize","getGridSize","minClusterSize","getMinimumClusterSize","averageCenter","getAverageCenter","markers","bounds","clusterIcon","getSize","getMarkers","getCenter","remove","addMarker","isMarkerInClusterBounds","calculateBounds","updateIcon","isMarkerAlreadyAdded","LatLngBounds","markers_1","_i","position","getPosition","marker","length_1","LatLng","lat","lng","isAdded","push","mCount","maxZoom","contains","getExtendedBounds","getCalculator","includes","i","CALCULATOR","numStyles","count","numberOfDigits","toString","BATCH_SIZE","BATCH_SIZE_IE","IMAGE_PATH","IMAGE_EXTENSION","IMAGE_SIZES","CLUSTERER_CLASS","Clusterer","optMarkers","optOptions","setMinimumClusterSize","getEnableRetinaIcons","setEnableRetinaIcons","addToClosestCluster","getImageExtension","setImageExtension","setAverageCenter","getTotalClusters","fitMapToMarkers","getIgnoreHidden","setIgnoreHidden","setClusterClass","getTotalMarkers","setZoomOnClick","getBatchSizeIE","setBatchSizeIE","createClusters","onZoomChanged","getImageSizes","setImageSizes","setCalculator","removeMarkers","resetViewport","getImagePath","setImagePath","pushMarkerTo","removeMarker","clearMarkers","setupStyles","setGridSize","getClusters","setMaxZoom","addMarkers","setStyles","setTitle","repaint","onIdle","redraw","clusters","listeners","activeMap","ready","minimumClusterSize","zoomOnClick","ignoreHidden","imagePath","imageExtension","imageSizes","calculator","batchSize","batchSizeIE","clusterClass","navigator","userAgent","toLowerCase","indexOf","timerRefStatic","get","listener","fromContainerPixelToLatLng","fromDivPixelToLatLng","fromLatLngToContainerPixel","getVisibleRegion","getWorldWidth","bindTo","notify","set","setValues","unbind","unbindAll","optNoDraw","key","Object","hasOwnProperty","call","_this","getDraggable","removeMarker_","splice","removed","markers_2","oldClusters","slice","oldClusters_1","projection","trPix","getNorthEast","blPix","getSouthWest","point1","point2","optHide","distanceBetweenPoints","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","isMarkerInBounds","distance","clusterToAddTo","d","iFirst","mapBounds","extendedMapBounds","iLast","getVisible","obj1","obj2","object","property","prop","apply"],"mappings":"oEAMA,IAAAA,EAAA,WA2BE,SAAYA,EAAAC,EAAkBC,GAC5BD,EAAQE,eAAeC,OAAOJ,EAAaK,OAAOC,KAAKC,aAEvDC,KAAKP,QAAUA,EAEfO,KAAKC,iBAAmBD,KAAKP,QAAQE,eAAeO,kBAEpDF,KAAKG,UAAYH,KAAKC,iBAEtBD,KAAKN,OAASA,EAEdM,KAAKI,YAASC,EAEdL,KAAKM,IAAM,KAEXN,KAAKO,KAAO,KAEZP,KAAKQ,SAAU,EAEfR,KAAKS,sBAAwB,KAE7BT,KAAKU,IAAM,GAEXV,KAAKW,OAAS,EACdX,KAAKY,MAAQ,EAEbZ,KAAKa,WAAa,CAAC,EAAG,GACtBb,KAAKc,WAAa,CAAC,EAAG,GAEtBd,KAAKe,UAAY,QACjBf,KAAKgB,SAAW,GAChBhB,KAAKiB,eAAiB,OACtBjB,KAAKkB,WAAa,OAClBlB,KAAKmB,UAAY,SACjBnB,KAAKoB,WAAa,mBAElBpB,KAAKqB,mBAAqB,MAE1BrB,KAAKsB,oBAAsB,KAC3BtB,KAAKuB,sBAAwB,KAC7BvB,KAAKwB,QAAU,KAEdxB,KAA4CyB,OAAOhC,EAAQiC,UAE5D1B,KAAK2B,gBAAkB3B,KAAK2B,gBAAgBC,KAAK5B,MACjDA,KAAK6B,YAAc7B,KAAK6B,YAAYD,KAAK5B,MACzCA,KAAK8B,QAAU9B,KAAK8B,QAAQF,KAAK5B,MACjCA,KAAK+B,YAAc/B,KAAK+B,YAAYH,KAAK5B,MACzCA,KAAKgC,WAAahC,KAAKgC,WAAWJ,KAAK5B,MACvCA,KAAKiC,MAAQjC,KAAKiC,MAAML,KAAK5B,MAC7BA,KAAKkC,SAAWlC,KAAKkC,SAASN,KAAK5B,MACnCA,KAAKmC,KAAOnC,KAAKmC,KAAKP,KAAK5B,MAC3BA,KAAKoC,KAAOpC,KAAKoC,KAAKR,KAAK5B,MAC3BA,KAAKqC,KAAOrC,KAAKqC,KAAKT,KAAK5B,MAC3BA,KAAKsC,SAAWtC,KAAKsC,SAASV,KAAK5B,MACnCA,KAAKuC,UAAYvC,KAAKuC,UAAUX,KAAK5B,MACrCA,KAAKwC,iBAAmBxC,KAAKwC,iBAAiBZ,KAAK5B,KACpD,CAuRH,OArRER,EAAAiD,UAAAd,gBAAA,WACE3B,KAAKuB,sBAAwBvB,KAAKsB,qBAGpC9B,EAAAiD,UAAAZ,YAAA,WACE7B,KAAKsB,qBAAsB,EAE3BtB,KAAKuB,uBAAwB,GAG/B/B,EAAOiD,UAAAX,QAAP,SAAQY,GAGN,GAFA1C,KAAKsB,qBAAsB,GAEtBtB,KAAKuB,sBAAuB,CAC/B,IAAMoB,EAAkB3C,KAAKP,QAAQE,eAarC,GALAE,OAAOC,KAAK4C,MAAME,QAAQD,EAAiB,QAAS3C,KAAKP,SACzDI,OAAOC,KAAK4C,MAAME,QAAQD,EAAiB,eAAgB3C,KAAKP,SAI5DkD,EAAgBE,iBAAkB,CAEpC,IAAMC,EAAUH,EAAgBI,aAE1BC,EAAShD,KAAKP,QAAQwD,YAEtBC,EAAOP,EAAuDjB,SAExD,OAARwB,GAAgB,cAAeA,GACjCA,EAAIC,UAAUH,GAKhBhD,KAAKwB,QAAU4B,OAAOC,YAAW,WAC/B,IAAMH,EAAOP,EAAuDjB,SAEpE,GAAY,OAARwB,EAAc,CACZ,cAAeA,GACjBA,EAAIC,UAAUH,GAGhB,IAAMM,EAAOJ,EAAIK,WAAa,EAIhB,OAAZT,GACAQ,EAAOR,GAEPI,EAAIM,QAAQV,EAAU,EAEzB,CACF,GAAE,IACJ,CAGDJ,EAAMe,cAAe,EAEjBf,EAAMgB,iBACRhB,EAAMgB,iBAET,GAGHlE,EAAAiD,UAAAV,YAAA,WAOElC,OAAOC,KAAK4C,MAAME,QAChB5C,KAAKP,QAAQE,eACb,YACAK,KAAKP,UAITD,EAAAiD,UAAAT,WAAA,WAOEnC,OAAOC,KAAK4C,MAAME,QAChB5C,KAAKP,QAAQE,eACb,WACAK,KAAKP,UAITD,EAAAiD,UAAAR,MAAA,iBACEjC,KAAKM,IAAMqD,SAASC,cAAc,OAElC5D,KAAKM,IAAIH,UAAYH,KAAKG,UAEtBH,KAAKQ,SACPR,KAAKqC,OAGmD,QAAzDwB,EAAC7D,KAA4C8D,kBAAY,IAAAD,GAAAA,EAAAE,mBAAmBC,YAAYhE,KAAKM,KAE9F,IAAM4C,EAAOlD,KAA4C0B,SAE7C,OAARwB,IAEFlD,KAAKS,sBAAwBZ,OAAOC,KAAK4C,MAAMuB,YAC7Cf,EACA,iBACAlD,KAAK2B,iBAGP3B,KAAKM,IAAI4D,iBAAiB,YAAalE,KAAK6B,aAE5C7B,KAAKM,IAAI4D,iBAAiB,QAASlE,KAAK8B,SAExC9B,KAAKM,IAAI4D,iBAAiB,YAAalE,KAAK+B,aAE5C/B,KAAKM,IAAI4D,iBAAiB,WAAYlE,KAAKgC,cAI/CxC,EAAAiD,UAAAP,SAAA,WACMlC,KAAKM,KAAON,KAAKM,IAAI6D,aACvBnE,KAAKoC,OAE8B,OAA/BpC,KAAKS,uBACPZ,OAAOC,KAAK4C,MAAM0B,eAAepE,KAAKS,uBAGxCT,KAAKM,IAAI+D,oBAAoB,YAAarE,KAAK6B,aAE/C7B,KAAKM,IAAI+D,oBAAoB,QAASrE,KAAK8B,SAE3C9B,KAAKM,IAAI+D,oBAAoB,YAAarE,KAAK+B,aAE/C/B,KAAKM,IAAI+D,oBAAoB,WAAYrE,KAAKgC,YAE9ChC,KAAKM,IAAI6D,WAAWG,YAAYtE,KAAKM,KAEhB,OAAjBN,KAAKwB,UACP4B,OAAOmB,aAAavE,KAAKwB,SAEzBxB,KAAKwB,QAAU,MAGjBxB,KAAKM,IAAM,OAIfd,EAAAiD,UAAAN,KAAA,WACE,GAAInC,KAAKQ,SAAwB,OAAbR,KAAKM,KAAgBN,KAAKI,OAAQ,CACpD,IAAMoE,EAAMxE,KAAKwC,iBAAiBxC,KAAKI,QAEvCJ,KAAKM,IAAImE,MAAMC,IAAc,OAARF,EAAe,GAAAG,OAAGH,EAAII,QAAQ,IACnD5E,KAAKM,IAAImE,MAAMI,KAAe,OAARL,EAAe,GAAAG,OAAGH,EAAIM,QAAQ,GACrD,GAGHtF,EAAAiD,UAAAL,KAAA,WACMpC,KAAKM,MACPN,KAAKM,IAAImE,MAAMM,QAAU,QAG3B/E,KAAKQ,SAAU,GAGjBhB,EAAAiD,UAAAJ,KAAA,2BACE,GAAIrC,KAAKM,KAAON,KAAKI,OAAQ,CAC3B,IAAM4E,EAAyB,OAAdhF,KAAKO,WACK,IAApBP,KAAKO,KAAK0E,OACG,KAApBjF,KAAKO,KAAK0E,MAAejF,KAAKP,QAAQE,eAAeuF,WAAclF,KAAKO,KAAK0E,MAGvEE,EAAKnF,KAAKqB,mBAAmB+D,MAAM,KAEnCC,EAAUC,UAAc,QAALzB,EAAAsB,EAAG,UAAE,IAAAtB,OAAA,EAAAA,EAAE0B,QAAQ,aAAc,MAAO,IAAK,IAC5DC,EAAUF,UAAc,QAALG,EAAAN,EAAG,UAAE,IAAAM,OAAA,EAAAA,EAAEF,QAAQ,aAAc,MAAO,IAAK,IAE5Df,EAAMxE,KAAKwC,iBAAiBxC,KAAKI,QAEvCJ,KAAKM,IAAIH,UAAYH,KAAKG,UAC1BH,KAAKM,IAAKoF,aAAa,QAAS,6CAA6Cf,OAAQ,OAARH,EAAe,UAAGA,EAAII,EAAK,MAAG,IAAG,YAAAD,OAAmB,OAARH,EAAe,UAAGA,EAAIM,EAAC,MAAO,IAAG,aAAAH,OAAY3E,KAAKY,MAAK,gBAAA+D,OAAe3E,KAAKW,OAAY,SAEhN,IAAMgF,EAAMhC,SAASC,cAAc,OAEnC+B,EAAIC,IAAMZ,EACVW,EAAIE,IAAM7F,KAAKU,IACfiF,EAAI/E,MAAQZ,KAAKY,MACjB+E,EAAIhF,OAASX,KAAKW,OAClBgF,EAAID,aAAa,QAAS,4BAA4Bf,OAAAa,EAAoB,cAAAb,OAAAU,EAAW,OAEhFrF,KAAKP,QAAQE,eAAemG,oBAC/BH,EAAIlB,MAAMsB,KAAO,SAASpB,OAAAa,EAAe,SAAAb,OAAAU,EAAUrF,KAAKY,MAAK,SAAA+D,OAC3Da,EAAUxF,KAAKW,OAAM,OAAAgE,OACjBU,EAAO,MAGf,IAAMW,EAAUrC,SAASC,cAAc,OAEvCoC,EAASN,aAAa,QAAS,mCAA4B1F,KAAKa,WAAW,wBAAeb,KAAKa,WAAW,yBAAgBb,KAAKe,UAAS,iBAAA4D,OAAgB3E,KAAKgB,SAA4B,qBAAA2D,OAAA3E,KAAKoB,WAA4B,mBAAAuD,OAAA3E,KAAKkB,WAAU,iBAAAyD,OAAgB3E,KAAKmB,UAAS,uBAAAwD,OAAsB3E,KAAKiB,eAA8C,iCAAA0D,OAAA3E,KAAKY,MAAyB,qBAAA+D,OAAA3E,KAAKW,OAAU,gBAEzXsF,EAAAjG,KAAKO,2BAAM2F,QAAMF,EAAQG,UAAY,GAAGxB,OAAS,QAATyB,EAAApG,KAAKO,YAAI,IAAA6F,OAAA,EAAAA,EAAEF,gBACnDG,EAAArG,KAAKO,2BAAM+F,QAAMN,EAAQO,UAAY,GAAG5B,OAAS,QAAT6B,EAAAxG,KAAKO,YAAI,IAAAiG,OAAA,EAAAA,EAAEF,OAEvDtG,KAAKM,IAAIiG,UAAY,GAErBvG,KAAKM,IAAI0D,YAAY2B,GACrB3F,KAAKM,IAAI0D,YAAYgC,GAErBhG,KAAKM,IAAI2E,MAAQD,EAEjBhF,KAAKM,IAAImE,MAAMM,QAAU,EAC1B,CAED/E,KAAKQ,SAAU,GAGjBhB,EAAQiD,UAAAH,SAAR,SAAS/B,GACPP,KAAKO,KAAOA,EAEZ,IAAMb,EAASM,KAAKP,QAAQE,eAAe8G,YAErChC,EACJ/E,EAAOgH,KAAKC,IAAIjH,EAAOkH,OAAS,EAAGF,KAAKG,IAAI,EAAGtG,EAAKuG,MAAQ,KAE1DrC,IACFzE,KAAKU,IAAM+D,EAAM/D,IACjBV,KAAKW,OAAS8D,EAAM9D,OACpBX,KAAKY,MAAQ6D,EAAM7D,MAEf6D,EAAMtE,YACRH,KAAKG,UAAY,GAAAwE,OAAG3E,KAAKC,iBAAgB,KAAA0E,OAAIF,EAAMtE,YAGrDH,KAAKa,WAAa4D,EAAM5D,YAAc,CAAC,EAAG,GAC1Cb,KAAKc,WAAa2D,EAAM3D,YAAc,CAACd,KAAKW,OAAS,EAAGX,KAAKY,MAAQ,GAErEZ,KAAKe,UAAY0D,EAAM1D,WAAa,QAEpCf,KAAKgB,SAAWyD,EAAMzD,UAAY,GAElChB,KAAKiB,eAAiBwD,EAAMxD,gBAAkB,OAE9CjB,KAAKkB,WAAauD,EAAMvD,YAAc,OAEtClB,KAAKmB,UAAYsD,EAAMtD,WAAa,SAEpCnB,KAAKoB,WAAaqD,EAAMrD,YAAc,mBAEtCpB,KAAKqB,mBAAqBoD,EAAMpD,oBAAsB,QAI1D7B,EAASiD,UAAAF,UAAT,SAAUnC,GACRJ,KAAKI,OAASA,GAGhBZ,EAAgBiD,UAAAD,iBAAhB,SAAiBuE,GACf,IAAMvC,EAAOxE,KAA4CgH,gBAAgBC,qBAAqBF,GAQ9F,OANY,OAARvC,IACFA,EAAIM,GAAK9E,KAAKc,WAAW,GAEzB0D,EAAII,GAAK5E,KAAKc,WAAW,IAGpB0D,GAEVhF,CAAD,ICzWA0H,EAAA,WAWE,SAAAA,EAAYC,GACVnH,KAAKmH,gBAAkBA,EAEvBnH,KAAKkD,IAAOlD,KAAKmH,gBAAuDzF,SAExE1B,KAAKoH,SAAWpH,KAAKmH,gBAAgBE,cAErCrH,KAAKsH,eAAiBtH,KAAKmH,gBAAgBI,wBAE3CvH,KAAKwH,cAAgBxH,KAAKmH,gBAAgBM,mBAE1CzH,KAAK0H,QAAU,GAEf1H,KAAKI,YAASC,EAEdL,KAAK2H,OAAS,KAEd3H,KAAK4H,YAAc,IAAIpI,EAAYQ,KAAMA,KAAKmH,gBAAgBV,aAE9DzG,KAAK6H,QAAU7H,KAAK6H,QAAQjG,KAAK5B,MACjCA,KAAK8H,WAAa9H,KAAK8H,WAAWlG,KAAK5B,MACvCA,KAAK+H,UAAY/H,KAAK+H,UAAUnG,KAAK5B,MACrCA,KAAK0B,OAAS1B,KAAK0B,OAAOE,KAAK5B,MAC/BA,KAAKL,aAAeK,KAAKL,aAAaiC,KAAK5B,MAC3CA,KAAKiD,UAAYjD,KAAKiD,UAAUrB,KAAK5B,MACrCA,KAAKgI,OAAShI,KAAKgI,OAAOpG,KAAK5B,MAC/BA,KAAKiI,UAAYjI,KAAKiI,UAAUrG,KAAK5B,MACrCA,KAAKkI,wBAA0BlI,KAAKkI,wBAAwBtG,KAAK5B,MACjEA,KAAKmI,gBAAkBnI,KAAKmI,gBAAgBvG,KAAK5B,MACjDA,KAAKoI,WAAapI,KAAKoI,WAAWxG,KAAK5B,MACvCA,KAAKqI,qBAAuBrI,KAAKqI,qBAAqBzG,KAAK5B,KAC5D,CA4KH,OA1KEkH,EAAAzE,UAAAoF,QAAA,WACE,OAAO7H,KAAK0H,QAAQd,QAGtBM,EAAAzE,UAAAqF,WAAA,WACE,OAAO9H,KAAK0H,SAGdR,EAAAzE,UAAAsF,UAAA,WACE,OAAO/H,KAAKI,QAGd8G,EAAAzE,UAAAf,OAAA,WACE,OAAO1B,KAAKkD,KAGdgE,EAAAzE,UAAA9C,aAAA,WACE,OAAOK,KAAKmH,iBAGdD,EAAAzE,UAAAQ,UAAA,WAKE,IAJA,IAAM0E,EAAS,IAAI9H,OAAOC,KAAKwI,aAAatI,KAAKI,OAAQJ,KAAKI,YAIzCmI,EAFLvI,KAAK8H,aAEAU,EAAOD,EAAA3B,OAAP4B,IAAS,CAAzB,IACGC,EADSF,EAAAC,GACSE,cAEpBD,GACFd,EAAO/H,OAAO6I,EAEjB,CAED,OAAOd,GAGTT,EAAAzE,UAAAuF,OAAA,WACGhI,KAAK4H,YAAmDnG,OAAO,MAEhEzB,KAAK0H,QAAU,UAIR1H,KAAK0H,SAGdR,EAASzE,UAAAwF,UAAT,SAAUU,SAMAF,EALR,GAAIzI,KAAKqI,qBAAqBM,GAC5B,OAAO,EAGT,GAAK3I,KAAKI,QASR,GAAIJ,KAAKwH,gBACDiB,EAAWE,EAAOD,eAEV,CACZ,IAAME,EAAS5I,KAAK0H,QAAQd,OAAS,EAErC5G,KAAKI,OAAS,IAAIP,OAAOC,KAAK+I,QAC3B7I,KAAKI,OAAO0I,OAASF,EAAS,GAAKH,EAASK,OAASF,GACrD5I,KAAKI,OAAO2I,OAASH,EAAS,GAAKH,EAASM,OAASH,GAGxD5I,KAAKmI,iBACN,OApBGM,EAAWE,EAAOD,iBAGtB1I,KAAKI,OAASqI,EAEdzI,KAAKmI,mBAmBTQ,EAAOK,SAAU,EAEjBhJ,KAAK0H,QAAQuB,KAAKN,GAElB,IAAMO,EAASlJ,KAAK0H,QAAQd,OAEtBuC,EAAUnJ,KAAKmH,gBAAgBpE,aAE/BO,EAAe,QAARO,EAAA7D,KAAKkD,WAAG,IAAAW,OAAA,EAAAA,EAAEN,UAEvB,GAAgB,OAAZ4F,QAAoC,IAAT7F,GAAwBA,EAAO6F,EAExDR,EAAOjH,WAAa1B,KAAKkD,KAC3ByF,EAAOlH,OAAOzB,KAAKkD,UAEhB,GAAIgG,EAASlJ,KAAKsH,eAEnBqB,EAAOjH,WAAa1B,KAAKkD,KAC3ByF,EAAOlH,OAAOzB,KAAKkD,UAEhB,GAAIgG,IAAWlJ,KAAKsH,eAEzB,IAA4B,IAAAkB,EAAA,EAAA/C,EAAAzF,KAAK0H,QAALc,EAAA/C,EAAAmB,OAAA4B,IAAc,CAAlB/C,EAAA+C,GACR/G,OAAO,KACtB,MAEDkH,EAAOlH,OAAO,MAGhB,OAAO,GAGTyF,EAAuBzE,UAAAyF,wBAAvB,SAAwBS,GACtB,GAAoB,OAAhB3I,KAAK2H,OAAiB,CACxB,IAAMc,EAAWE,EAAOD,cAExB,GAAID,EACF,OAAOzI,KAAK2H,OAAOyB,SAASX,EAE/B,CAED,OAAO,GAGTvB,EAAAzE,UAAA0F,gBAAA,WACEnI,KAAK2H,OAAS3H,KAAKmH,gBAAgBkC,kBACjC,IAAIxJ,OAAOC,KAAKwI,aAAatI,KAAKI,OAAQJ,KAAKI,UAInD8G,EAAAzE,UAAA2F,WAAA,iBACQc,EAASlJ,KAAK0H,QAAQd,OAEtBuC,EAAUnJ,KAAKmH,gBAAgBpE,aAE/BO,EAAe,QAARO,EAAA7D,KAAKkD,WAAG,IAAAW,OAAA,EAAAA,EAAEN,UAEP,OAAZ4F,QAAoC,IAAT7F,GAAwBA,EAAO6F,GAM1DD,EAASlJ,KAAKsH,eALhBtH,KAAK4H,YAAYxF,QAYfpC,KAAKI,QACPJ,KAAK4H,YAAYrF,UAAUvC,KAAKI,QAGlCJ,KAAK4H,YAAYtF,SACftC,KAAKmH,gBAAgBmC,eAArBtJ,CAAqCA,KAAK0H,QAAS1H,KAAKmH,gBAAgBV,YAAYG,SAGtF5G,KAAK4H,YAAYvF,SAGnB6E,EAAoBzE,UAAA4F,qBAApB,SAAqBM,GACnB,GAAI3I,KAAK0H,QAAQ6B,SACf,OAAOvJ,KAAK0H,QAAQ6B,SAASZ,GAG/B,IAAK,IAAIa,EAAI,EAAGA,EAAIxJ,KAAK0H,QAAQd,OAAQ4C,IACvC,GAAIb,IAAW3I,KAAK0H,QAAQ8B,GAC1B,OAAO,EAIX,OAAO,GAEVtC,CAAD,IC7MA,SAASuC,EACP/B,EACAgC,GAEA,IAAMC,EAAQjC,EAAQd,OAEhBgD,EAAiBD,EAAME,WAAWjD,OAElCE,EAAQJ,KAAKC,IAAIiD,EAAgBF,GAEvC,MAAO,CACLxD,KAAMyD,EAAME,WACZ/C,MAAKA,EACL7B,MAAO,GAEX,CAEA,IAAM6E,EAAa,IAEbC,EAAgB,IAEhBC,EACJ,yFAEIC,EAAkB,MAElBC,EAAc,CAAC,GAAI,GAAI,GAAI,GAAI,IAE/BC,EAAkB,UAExBC,EAAA,WAwBE,SAAAA,EACElH,EACAmH,EACAC,QADA,IAAAD,IAAAA,EAAiC,SACjC,IAAAC,IAAAA,EAAiC,CAAA,GAEjCtK,KAAKuH,sBAAwBvH,KAAKuH,sBAAsB3F,KAAK5B,MAC7DA,KAAKuK,sBAAwBvK,KAAKuK,sBAAsB3I,KAAK5B,MAC7DA,KAAKwK,qBAAuBxK,KAAKwK,qBAAqB5I,KAAK5B,MAC3DA,KAAKyK,qBAAuBzK,KAAKyK,qBAAqB7I,KAAK5B,MAC3DA,KAAK0K,oBAAsB1K,KAAK0K,oBAAoB9I,KAAK5B,MACzDA,KAAK2K,kBAAoB3K,KAAK2K,kBAAkB/I,KAAK5B,MACrDA,KAAK4K,kBAAoB5K,KAAK4K,kBAAkBhJ,KAAK5B,MACrDA,KAAKqJ,kBAAoBrJ,KAAKqJ,kBAAkBzH,KAAK5B,MACrDA,KAAKyH,iBAAmBzH,KAAKyH,iBAAiB7F,KAAK5B,MACnDA,KAAK6K,iBAAmB7K,KAAK6K,iBAAiBjJ,KAAK5B,MACnDA,KAAK8K,iBAAmB9K,KAAK8K,iBAAiBlJ,KAAK5B,MACnDA,KAAK+K,gBAAkB/K,KAAK+K,gBAAgBnJ,KAAK5B,MACjDA,KAAKgL,gBAAkBhL,KAAKgL,gBAAgBpJ,KAAK5B,MACjDA,KAAKiL,gBAAkBjL,KAAKiL,gBAAgBrJ,KAAK5B,MACjDA,KAAKE,gBAAkBF,KAAKE,gBAAgB0B,KAAK5B,MACjDA,KAAKkL,gBAAkBlL,KAAKkL,gBAAgBtJ,KAAK5B,MACjDA,KAAKmL,gBAAkBnL,KAAKmL,gBAAgBvJ,KAAK5B,MACjDA,KAAK6C,eAAiB7C,KAAK6C,eAAejB,KAAK5B,MAC/CA,KAAKoL,eAAiBpL,KAAKoL,eAAexJ,KAAK5B,MAC/CA,KAAKqL,eAAiBrL,KAAKqL,eAAezJ,KAAK5B,MAC/CA,KAAKsL,eAAiBtL,KAAKsL,eAAe1J,KAAK5B,MAC/CA,KAAKuL,eAAiBvL,KAAKuL,eAAe3J,KAAK5B,MAC/CA,KAAKwL,cAAgBxL,KAAKwL,cAAc5J,KAAK5B,MAC7CA,KAAKyL,cAAgBzL,KAAKyL,cAAc7J,KAAK5B,MAC7CA,KAAK0L,cAAgB1L,KAAK0L,cAAc9J,KAAK5B,MAC7CA,KAAKsJ,cAAgBtJ,KAAKsJ,cAAc1H,KAAK5B,MAC7CA,KAAK2L,cAAgB3L,KAAK2L,cAAc/J,KAAK5B,MAC7CA,KAAK4L,cAAgB5L,KAAK4L,cAAchK,KAAK5B,MAC7CA,KAAK6L,cAAgB7L,KAAK6L,cAAcjK,KAAK5B,MAC7CA,KAAK8L,aAAe9L,KAAK8L,aAAalK,KAAK5B,MAC3CA,KAAK+L,aAAe/L,KAAK+L,aAAanK,KAAK5B,MAC3CA,KAAKgM,aAAehM,KAAKgM,aAAapK,KAAK5B,MAC3CA,KAAKiM,aAAejM,KAAKiM,aAAarK,KAAK5B,MAC3CA,KAAKkM,aAAelM,KAAKkM,aAAatK,KAAK5B,MAC3CA,KAAKmM,YAAcnM,KAAKmM,YAAYvK,KAAK5B,MACzCA,KAAKqH,YAAcrH,KAAKqH,YAAYzF,KAAK5B,MACzCA,KAAKoM,YAAcpM,KAAKoM,YAAYxK,KAAK5B,MACzCA,KAAKqM,YAAcrM,KAAKqM,YAAYzK,KAAK5B,MACzCA,KAAK+C,WAAa/C,KAAK+C,WAAWnB,KAAK5B,MACvCA,KAAKsM,WAAatM,KAAKsM,WAAW1K,KAAK5B,MACvCA,KAAK8H,WAAa9H,KAAK8H,WAAWlG,KAAK5B,MACvCA,KAAKuM,WAAavM,KAAKuM,WAAW3K,KAAK5B,MACvCA,KAAKyG,UAAYzG,KAAKyG,UAAU7E,KAAK5B,MACrCA,KAAKwM,UAAYxM,KAAKwM,UAAU5K,KAAK5B,MACrCA,KAAKiI,UAAYjI,KAAKiI,UAAUrG,KAAK5B,MACrCA,KAAKkC,SAAWlC,KAAKkC,SAASN,KAAK5B,MACnCA,KAAKkF,SAAWlF,KAAKkF,SAAStD,KAAK5B,MACnCA,KAAKyM,SAAWzM,KAAKyM,SAAS7K,KAAK5B,MACnCA,KAAK0M,QAAU1M,KAAK0M,QAAQ9K,KAAK5B,MACjCA,KAAK2M,OAAS3M,KAAK2M,OAAO/K,KAAK5B,MAC/BA,KAAK4M,OAAS5M,KAAK4M,OAAOhL,KAAK5B,MAC/BA,KAAKiC,MAAQjC,KAAKiC,MAAML,KAAK5B,MAC7BA,KAAKmC,KAAOnC,KAAKmC,KAAKP,KAAK5B,MAE3BA,KAAKJ,OAASI,KAAKJ,OAAOgC,KAAK5B,MAC/BA,KAAKJ,OAAOwK,EAAWvK,OAAOC,KAAKC,aAEnCC,KAAK0H,QAAU,GACf1H,KAAK6M,SAAW,GAChB7M,KAAK8M,UAAY,GACjB9M,KAAK+M,UAAY,KACjB/M,KAAKgN,OAAQ,EACbhN,KAAKoH,SAAWkD,EAAWlD,UAAY,GACvCpH,KAAKsH,eAAiBgD,EAAW2C,oBAAsB,EACvDjN,KAAKmJ,QAAUmB,EAAWnB,SAAW,KACrCnJ,KAAKN,OAAS4K,EAAW5K,QAAU,GAEnCM,KAAKiF,MAAQqF,EAAWrF,OAAS,GAEjCjF,KAAKkN,aAAc,OAEY7M,IAA3BiK,EAAW4C,cACblN,KAAKkN,YAAc5C,EAAW4C,aAGhClN,KAAKwH,eAAgB,OAEYnH,IAA7BiK,EAAW9C,gBACbxH,KAAKwH,cAAgB8C,EAAW9C,eAGlCxH,KAAKmN,cAAe,OAEY9M,IAA5BiK,EAAW6C,eACbnN,KAAKmN,aAAe7C,EAAW6C,cAGjCnN,KAAK8F,mBAAoB,OAEYzF,IAAjCiK,EAAWxE,oBACb9F,KAAK8F,kBAAoBwE,EAAWxE,mBAEtC9F,KAAKoN,UAAY9C,EAAW8C,WAAapD,EAEzChK,KAAKqN,eAAiB/C,EAAW+C,gBAAkBpD,EAEnDjK,KAAKsN,WAAahD,EAAWgD,YAAcpD,EAE3ClK,KAAKuN,WAAajD,EAAWiD,YAAc9D,EAE3CzJ,KAAKwN,UAAYlD,EAAWkD,WAAa1D,EAEzC9J,KAAKyN,YAAcnD,EAAWmD,aAAe1D,EAE7C/J,KAAK0N,aAAepD,EAAWoD,cAAgBvD,GAEY,IAAvDwD,UAAUC,UAAUC,cAAcC,QAAQ,UAE5C9N,KAAKwN,UAAYxN,KAAKyN,aAGxBzN,KAAK+N,eAAiB,KAEtB/N,KAAKmM,cAELnM,KAAKuM,WAAWlC,GAAY,GAE3BrK,KAA4CyB,OAAOyB,EACrD,CAqnBH,OAnnBEkH,EAAA3H,UAAA+I,cAAA,mBACExL,KAAK6L,eAAc,YAQhBhI,EAAA7D,KAA4C0B,+BAAU6B,cAAgBvD,KAA4CgO,IAAI,YAAc,KAC9E,QAAtDvI,EAAAzF,KAA4C0B,gBAAU,IAAA+D,OAAA,EAAAA,EAAAlC,aAAevD,KAA4CgO,IAAI,YAEtHnO,OAAOC,KAAK4C,MAAME,QAAQ5C,KAAM,SAIpCoK,EAAA3H,UAAAkK,OAAA,WACE3M,KAAK4M,UAGPxC,EAAA3H,UAAAR,MAAA,WACE,IAAMiB,EAAOlD,KAA4C0B,SAEzD1B,KAAK+M,UAAY7J,EAEjBlD,KAAKgN,OAAQ,EAEbhN,KAAK0M,UAEO,OAARxJ,IAEFlD,KAAK8M,UAAY,CACfjN,OAAOC,KAAK4C,MAAMuB,YAChBf,EACA,eACAlD,KAAKwL,eAEP3L,OAAOC,KAAK4C,MAAMuB,YAChBf,EACA,OACAlD,KAAK2M,WAMbvC,EAAA3H,UAAAP,SAAA,WAEE,IAAqB,IAAAsG,EAAA,EAAA3E,EAAA7D,KAAK0H,QAALc,EAAA3E,EAAA+C,OAAA4B,IAAc,CAA9B,IAAMG,EAAM9E,EAAA2E,GACXG,EAAOjH,WAAa1B,KAAK+M,WAC3BpE,EAAOlH,OAAOzB,KAAK+M,UAEtB,CAGD,IAAsB,IAAAtH,EAAA,EAAAQ,EAAAjG,KAAK6M,SAALpH,EAAAQ,EAAAW,OAAAnB,IAAe,CAAnBQ,EAAAR,GACRuC,QACT,CAEDhI,KAAK6M,SAAW,GAGhB,IAAuB,IAAAzG,EAAA,EAAAC,EAAArG,KAAK8M,UAAL1G,EAAAC,EAAAO,OAAAR,IAAgB,CAAlC,IAAM6H,EAAQ5H,EAAAD,GACjBvG,OAAOC,KAAK4C,MAAM0B,eAAe6J,EAClC,CAEDjO,KAAK8M,UAAY,GAEjB9M,KAAK+M,UAAY,KAEjB/M,KAAKgN,OAAQ,GAGf5C,EAAA3H,UAAAN,KAAA,WAAqB,EAErBiI,EAAA3H,UAAAf,OAAA,WAAiB,OAAO,IAAI,EAE5B0I,EAAA3H,UAAAqB,SAAA,WAAmB,OAAO,IAAI,EAE9BsG,EAAA3H,UAAAuE,cAAA,WACE,MAAO,CACLkH,2BAAqC,WAAA,OAAO,IAAM,EAClDC,qBAA+B,WAAA,OAAO,IAAK,EAC3CC,2BAAqC,WAAA,OAAO,IAAK,EACjDnH,qBAA+B,WAAA,OAAO,IAAK,EAC3CoH,iBAA2B,WAAA,OAAO,IAAM,EACxCC,cAA0B,WAAA,OAAO,CAAG,IAIxClE,EAAA3H,UAAAhB,OAAA,WAAuB,EAEvB2I,EAAA3H,UAAAwB,YAAA,WACE,MAAO,CACL+D,OAAM,WAAa,IAIvBoC,EAAA3H,UAAA8L,OAAA,WAAuB,EAEvBnE,EAAA3H,UAAAuL,IAAA,WAAoB,EAEpB5D,EAAA3H,UAAA+L,OAAA,WAAuB,EAEvBpE,EAAA3H,UAAAgM,IAAA,WAAoB,EACpBrE,EAAA3H,UAAAiM,UAAA,WAA0B,EAC1BtE,EAAA3H,UAAAkM,OAAA,WAAuB,EACvBvE,EAAA3H,UAAAmM,UAAA,WAA0B,EAE1BxE,EAAA3H,UAAA0J,YAAA,WACE,KAAInM,KAAKN,OAAOkH,OAAS,GAIzB,IAAK,IAAI4C,EAAI,EAAGA,EAAIxJ,KAAKsN,WAAW1G,OAAQ4C,IAC1CxJ,KAAKN,OAAOuJ,KAAK,CACfvI,IAAK,GAAAiE,OAAG3E,KAAKoN,WAAa5D,EAAI,GAAE,KAAA7E,OAAI3E,KAAKqN,gBACzC1M,OAAQX,KAAKsN,WAAW9D,IAAM,EAC9B5I,MAAOZ,KAAKsN,WAAW9D,IAAM,KAKnCY,EAAA3H,UAAAsI,gBAAA,WAKE,IAJA,IAAMrD,EAAU1H,KAAK8H,aAEfH,EAAS,IAAI9H,OAAOC,KAAKwI,iBAEVC,EAAAb,EAAAc,EAAOD,EAAA3B,OAAP4B,IAAS,CAAzB,IACGC,EADSF,EAAAC,GACSE,cAEpBD,GACFd,EAAO/H,OAAO6I,EAEjB,CAED,IAAMvF,EAAOlD,KAA4C0B,SAE7C,OAARwB,GAAgB,cAAeA,GACjCA,EAAIC,UAAUwE,IAKlByC,EAAA3H,UAAA4E,YAAA,WACE,OAAOrH,KAAKoH,UAGdgD,EAAW3H,UAAA2J,YAAX,SAAYhF,GACVpH,KAAKoH,SAAWA,GAGlBgD,EAAA3H,UAAA8E,sBAAA,WACE,OAAOvH,KAAKsH,gBAGd8C,EAAqB3H,UAAA8H,sBAArB,SAAsB0C,GACpBjN,KAAKsH,eAAiB2F,GAGxB7C,EAAA3H,UAAAM,WAAA,WACE,OAAO/C,KAAKmJ,SAGdiB,EAAU3H,UAAA6J,WAAV,SAAWnD,GACTnJ,KAAKmJ,QAAUA,GAGjBiB,EAAA3H,UAAAgE,UAAA,WACE,OAAOzG,KAAKN,QAGd0K,EAAS3H,UAAA+J,UAAT,SAAU9M,GACRM,KAAKN,OAASA,GAGhB0K,EAAA3H,UAAAyC,SAAA,WACE,OAAOlF,KAAKiF,OAGdmF,EAAQ3H,UAAAgK,SAAR,SAASxH,GACPjF,KAAKiF,MAAQA,GAGfmF,EAAA3H,UAAAI,eAAA,WACE,OAAO7C,KAAKkN,aAGd9C,EAAc3H,UAAA2I,eAAd,SAAe8B,GACblN,KAAKkN,YAAcA,GAGrB9C,EAAA3H,UAAAgF,iBAAA,WACE,OAAOzH,KAAKwH,eAGd4C,EAAgB3H,UAAAoI,iBAAhB,SAAiBrD,GACfxH,KAAKwH,cAAgBA,GAGvB4C,EAAA3H,UAAAuI,gBAAA,WACE,OAAOhL,KAAKmN,cAGd/C,EAAe3H,UAAAwI,gBAAf,SAAgBkC,GACdnN,KAAKmN,aAAeA,GAGtB/C,EAAA3H,UAAA+H,qBAAA,WACE,OAAOxK,KAAK8F,mBAGdsE,EAAoB3H,UAAAgI,qBAApB,SAAqB3E,GACnB9F,KAAK8F,kBAAoBA,GAG3BsE,EAAA3H,UAAAkI,kBAAA,WACE,OAAO3K,KAAKqN,gBAGdjD,EAAiB3H,UAAAmI,kBAAjB,SAAkByC,GAChBrN,KAAKqN,eAAiBA,GAGxBjD,EAAA3H,UAAAqJ,aAAA,WACE,OAAO9L,KAAKoN,WAGdhD,EAAY3H,UAAAsJ,aAAZ,SAAaqB,GACXpN,KAAKoN,UAAYA,GAGnBhD,EAAA3H,UAAAgJ,cAAA,WACE,OAAOzL,KAAKsN,YAGdlD,EAAa3H,UAAAiJ,cAAb,SAAc4B,GACZtN,KAAKsN,WAAaA,GAGpBlD,EAAA3H,UAAA6G,cAAA,WACE,OAAOtJ,KAAKuN,YAGdnD,EAAa3H,UAAAkJ,cAAb,SAAc4B,GACZvN,KAAKuN,WAAaA,GAGpBnD,EAAA3H,UAAA4I,eAAA,WACE,OAAOrL,KAAKyN,aAGdrD,EAAc3H,UAAA6I,eAAd,SAAemC,GACbzN,KAAKyN,YAAcA,GAGrBrD,EAAA3H,UAAAvC,gBAAA,WACE,OAAOF,KAAK0N,cAGdtD,EAAe3H,UAAAyI,gBAAf,SAAgBwC,GACd1N,KAAK0N,aAAeA,GAGtBtD,EAAA3H,UAAAqF,WAAA,WACE,OAAO9H,KAAK0H,SAGd0C,EAAA3H,UAAA0I,gBAAA,WACE,OAAOnL,KAAK0H,QAAQd,QAGtBwD,EAAA3H,UAAA4J,YAAA,WACE,OAAOrM,KAAK6M,UAGdzC,EAAA3H,UAAAqI,iBAAA,WACE,OAAO9K,KAAK6M,SAASjG,QAGvBwD,EAAA3H,UAAAwF,UAAA,SAAUU,EAAwBkG,GAChC7O,KAAKgM,aAAarD,GAEbkG,GACH7O,KAAK4M,UAITxC,EAAA3H,UAAA8J,WAAA,SAAW7E,EAA2BmH,GACpC,IAAK,IAAMC,KAAOpH,EAChB,GAAIqH,OAAOtM,UAAUuM,eAAeC,KAAKvH,EAASoH,GAAM,CACtD,IAAMnG,EAASjB,EAAQoH,GAEnBnG,GACF3I,KAAKgM,aAAarD,EAErB,CAGEkG,GACH7O,KAAK4M,UAITxC,EAAY3H,UAAAuJ,aAAZ,SAAarD,GAAb,IAeCuG,EAAAlP,KAbK2I,EAAOwG,gBACTtP,OAAOC,KAAK4C,MAAMuB,YAAY0E,EAAQ,WAAW,WAC3CuG,EAAKlC,QACPrE,EAAOK,SAAU,EAEjBkG,EAAKxC,UAET,IAGF/D,EAAOK,SAAU,EAEjBhJ,KAAK0H,QAAQuB,KAAKN,IAGpByB,EAAa3H,UAAA2M,cAAb,SAAczG,GACZ,IAAI7B,GAAS,EAEb,GAAI9G,KAAK0H,QAAQoG,QACfhH,EAAQ9G,KAAK0H,QAAQoG,QAAQnF,QAE7B,IAAK,IAAIa,EAAI,EAAGA,EAAIxJ,KAAK0H,QAAQd,OAAQ4C,IACvC,GAAIb,IAAW3I,KAAK0H,QAAQ8B,GAAI,CAC9B1C,EAAQ0C,EAER,KACD,CAIL,OAAe,IAAX1C,IAKJ6B,EAAOlH,OAAO,MAEdzB,KAAK0H,QAAQ2H,OAAOvI,EAAO,IAEpB,IAGTsD,EAAA3H,UAAAwJ,aAAA,SAAatD,EAAwBkG,GACnC,IAAMS,EAAUtP,KAAKoP,cAAczG,GAMnC,OAJKkG,GAAaS,GAChBtP,KAAK0M,UAGA4C,GAGTlF,EAAA3H,UAAAmJ,cAAA,SAAclE,EAA2BmH,GAGvC,IAFA,IAAIS,GAAU,MAEOC,EAAA7H,EAAAc,EAAO+G,EAAA3I,OAAP4B,IAAS,CAAzB,IAAMG,EAAM4G,EAAA/G,GACf8G,EAAUA,GAAWtP,KAAKoP,cAAczG,EACzC,CAMD,OAJKkG,GAAaS,GAChBtP,KAAK0M,UAGA4C,GAGTlF,EAAA3H,UAAAyJ,aAAA,WACElM,KAAK6L,eAAc,GAEnB7L,KAAK0H,QAAU,IAGjB0C,EAAA3H,UAAAiK,QAAA,WACE,IAAM8C,EAAcxP,KAAK6M,SAAS4C,QAElCzP,KAAK6M,SAAW,GAEhB7M,KAAK6L,eAAc,GAEnB7L,KAAK4M,SAILvJ,YAAW,WACT,IAAyB,QAAAqM,EAAAF,EAAAhH,EAAWkH,EAAA9I,OAAX4B,IAAa,CAAjBkH,EAAAlH,GACRR,QACZ,CACF,GAAE,IAGLoC,EAAiB3H,UAAA4G,kBAAjB,SAAkB1B,GAChB,IAAMgI,EAAc3P,KAA4CgH,gBAG1D4I,EAAQD,EAAW1I,qBAEvB,IAAIpH,OAAOC,KAAK+I,OAAOlB,EAAOkI,eAAe/G,MAAOnB,EAAOkI,eAAe9G,QAG9D,OAAV6G,IACFA,EAAM9K,GAAK9E,KAAKoH,SAChBwI,EAAMhL,GAAK5E,KAAKoH,UAGlB,IAAM0I,EAAQH,EAAW1I,qBAEvB,IAAIpH,OAAOC,KAAK+I,OAAOlB,EAAOoI,eAAejH,MAAOnB,EAAOoI,eAAehH,QAU5E,GAPc,OAAV+G,IACFA,EAAMhL,GAAK9E,KAAKoH,SAChB0I,EAAMlL,GAAK5E,KAAKoH,UAKJ,OAAVwI,EAAgB,CAElB,IAAMI,EAASL,EAAWxB,qBAAqByB,GAEhC,OAAXI,GACFrI,EAAO/H,OAAOoQ,EAEjB,CAED,GAAc,OAAVF,EAAgB,CAElB,IAAMG,EAAUN,EAAWxB,qBAAqB2B,GAEjC,OAAXG,GACFtI,EAAO/H,OACLqQ,EAGL,CAGD,OAAOtI,GAGTyC,EAAA3H,UAAAmK,OAAA,WAEE5M,KAAKuL,eAAe,IAGtBnB,EAAa3H,UAAAoJ,cAAb,SAAcqE,GAEZ,IAAsB,IAAA1H,EAAA,EAAA3E,EAAA7D,KAAK6M,SAALrE,EAAA3E,EAAA+C,OAAA4B,IAAe,CAAnB3E,EAAA2E,GACRR,QACT,CAEDhI,KAAK6M,SAAW,GAGhB,IAAqB,IAAApH,EAAA,EAAAQ,EAAAjG,KAAK0H,QAALjC,EAAAQ,EAAAW,OAAAnB,IAAc,CAA9B,IAAMkD,EAAM1C,EAAAR,GACfkD,EAAOK,SAAU,EAEbkH,GACFvH,EAAOlH,OAAO,KAEjB,GAGH2I,EAAA3H,UAAA0N,sBAAA,SAAsBC,EAAwBC,GAC5C,IAEMC,GAASD,EAAGvH,MAAQsH,EAAGtH,OAASpC,KAAK6J,GAAM,IAC3CC,GAASH,EAAGtH,MAAQqH,EAAGrH,OAASrC,KAAK6J,GAAM,IAE3CE,EACJ/J,KAAKgK,IAAIJ,EAAO,GAAK5J,KAAKgK,IAAIJ,EAAO,GACrC5J,KAAKiK,IAAKP,EAAGtH,MAAQpC,KAAK6J,GAAM,KAC9B7J,KAAKiK,IAAKN,EAAGvH,MAAQpC,KAAK6J,GAAM,KAChC7J,KAAKgK,IAAIF,EAAO,GAChB9J,KAAKgK,IAAIF,EAAO,GAEpB,OAAY,EAAI9J,KAAKkK,MAAMlK,KAAKmK,KAAKJ,GAAI/J,KAAKmK,KAAK,EAAIJ,IAZ7C,MAeZrG,EAAA3H,UAAAqO,iBAAA,SAAiBnI,EAAwBhB,GACvC,IAAMc,EAAWE,EAAOD,cAExB,QAAID,GACKd,EAAOyB,SAASX,IAM3B2B,EAAmB3H,UAAAiI,oBAAnB,SAAoB/B,GAOlB,IANA,IAAIlJ,EAEAsR,EAAW,IAEXC,EAAiB,KAEQxI,EAAA,EAAA3E,EAAA7D,KAAK6M,SAALrE,EAAA3E,EAAA+C,OAAA4B,IAAe,CAAvC,IAGGpI,GAFNX,EADuBoE,EAAA2E,IAGAT,YAEjBU,EAAWE,EAAOD,cAExB,GAAItI,GAAUqI,EAAU,CACtB,IAAMwI,EAAIjR,KAAKmQ,sBAAsB/P,EAAQqI,GAEzCwI,EAAIF,IACNA,EAAWE,EAEXD,EAAiBvR,EAEpB,CACF,CAEGuR,GAAkBA,EAAe9I,wBAAwBS,GAC3DqI,EAAe/I,UAAUU,KAEzBlJ,EAAU,IAAIyH,EAAQlH,OAEdiI,UAAUU,GAElB3I,KAAK6M,SAAS5D,KAAKxJ,KAIvB2K,EAAc3H,UAAA8I,eAAd,SAAe2F,GAAf,IA+EChC,EAAAlP,KA9EC,GAAKA,KAAKgN,MAAV,CAKe,IAAXkE,IAQFrR,OAAOC,KAAK4C,MAAME,QAAQ5C,KAAM,kBAAmBA,MAEvB,OAAxBA,KAAK+N,iBACP3K,OAAOmB,aAAavE,KAAK+N,uBAIlB/N,KAAK+N,iBA2BhB,IAvBA,IAAM7K,EAAOlD,KAA4C0B,SAEnDiG,GAAiB,OAARzE,GAAgB,cAAeA,EAAMA,EAAID,YAAc,MAOhEkO,IALQjO,aAAA,EAAAA,EAAKK,YAAa,GAKP,EACnB,IAAI1D,OAAOC,KAAKwI,aACdX,aAAM,EAANA,EAAQoI,eACRpI,aAAM,EAANA,EAAQkI,gBAEV,IAAIhQ,OAAOC,KAAKwI,aACd,IAAIzI,OAAOC,KAAK+I,OAAO,mBAAoB,iBAC3C,IAAIhJ,OAAOC,KAAK+I,QAAQ,kBAAmB,kBAG7CuI,EAAoBpR,KAAKqJ,kBAAkB8H,GAE3CE,EAAQ3K,KAAKC,IAAIuK,EAASlR,KAAKwN,UAAWxN,KAAK0H,QAAQd,QAEpD4C,EAAI0H,EAAQ1H,EAAI6H,EAAO7H,IAAK,CACnC,IAAMb,EAAS3I,KAAK0H,QAAQ8B,GAExBb,IAAWA,EAAOK,SAAWhJ,KAAK8Q,iBAAiBnI,EAAQyI,MAAwBpR,KAAKmN,cAAiBnN,KAAKmN,cAAgBxE,EAAO2I,eACvItR,KAAK0K,oBAAoB/B,EAE5B,CAED,GAAI0I,EAAQrR,KAAK0H,QAAQd,OACvB5G,KAAK+N,eAAiB3K,OAAOC,YAC3B,WACE6L,EAAK3D,eAAe8F,EACrB,GACD,OAEG,CACLrR,KAAK+N,eAAiB,KAStBlO,OAAOC,KAAK4C,MAAME,QAAQ5C,KAAM,gBAAiBA,MAEjD,IAAsB,IAAAwI,EAAA,EAAA3E,EAAA7D,KAAK6M,SAALrE,EAAA3E,EAAA+C,OAAA4B,IAAe,CAAnB3E,EAAA2E,GACRJ,YACT,CACF,CA3EA,GA8EHgC,EAAA3H,UAAA7C,OAAA,SAAwD2R,EAASC,GAC/D,OAAO,SAA8BC,GACnC,IAAK,IAAMC,KAAYD,EAAOhP,UAAW,CAGvC,IAAMkP,EAAOD,EAIb1R,KAAKyC,UAAUkP,GAAQF,EAAOhP,UAAUkP,EACzC,CAED,OAAO3R,IACR,EAAC4R,MAA8CL,EAAM,CAACC,KAE1DpH,CAAD"}
package/dist/esm.js CHANGED
@@ -160,15 +160,15 @@ var ClusterIcon = /** @class */ (function () {
160
160
  this.visible = false;
161
161
  };
162
162
  ClusterIcon.prototype.show = function () {
163
- var _a, _b, _c, _d;
163
+ var _a, _b, _c, _d, _e, _f;
164
164
  if (this.div && this.center) {
165
165
  var divTitle = this.sums === null ||
166
166
  typeof this.sums.title === 'undefined' ||
167
167
  this.sums.title === '' ? this.cluster.getClusterer().getTitle() : this.sums.title;
168
168
  // NOTE: values must be specified in px units
169
169
  var bp = this.backgroundPosition.split(' ');
170
- var spriteH = parseInt(bp[0].replace(/^\s+|\s+$/g, ''), 10);
171
- var spriteV = parseInt(bp[1].replace(/^\s+|\s+$/g, ''), 10);
170
+ var spriteH = parseInt(((_a = bp[0]) === null || _a === void 0 ? void 0 : _a.replace(/^\s+|\s+$/g, '')) || '0', 10);
171
+ var spriteV = parseInt(((_b = bp[1]) === null || _b === void 0 ? void 0 : _b.replace(/^\s+|\s+$/g, '')) || '0', 10);
172
172
  var pos = this.getPosFromLatLng(this.center);
173
173
  this.div.className = this.className;
174
174
  this.div.setAttribute('style', "cursor: pointer; position: absolute; top: ".concat(pos !== null ? "".concat(pos.y, "px") : '0', "; left: ").concat(pos !== null ? "".concat(pos.x, "px") : '0', "; width: ").concat(this.width, "px; height: ").concat(this.height, "px; "));
@@ -183,10 +183,10 @@ var ClusterIcon = /** @class */ (function () {
183
183
  }
184
184
  var textElm = document.createElement('div');
185
185
  textElm.setAttribute('style', "position: absolute; top: ".concat(this.anchorText[0], "px; left: ").concat(this.anchorText[1], "px; color: ").concat(this.textColor, "; font-size: ").concat(this.textSize, "px; font-family: ").concat(this.fontFamily, "; font-weight: ").concat(this.fontWeight, "; fontStyle: ").concat(this.fontStyle, "; text-decoration: ").concat(this.textDecoration, "; text-align: center; width: ").concat(this.width, "px; line-height: ").concat(this.height, "px"));
186
- if ((_a = this.sums) === null || _a === void 0 ? void 0 : _a.text)
187
- textElm.innerText = "".concat((_b = this.sums) === null || _b === void 0 ? void 0 : _b.text);
188
- if ((_c = this.sums) === null || _c === void 0 ? void 0 : _c.html)
189
- textElm.innerHTML = "".concat((_d = this.sums) === null || _d === void 0 ? void 0 : _d.html);
186
+ if ((_c = this.sums) === null || _c === void 0 ? void 0 : _c.text)
187
+ textElm.innerText = "".concat((_d = this.sums) === null || _d === void 0 ? void 0 : _d.text);
188
+ if ((_e = this.sums) === null || _e === void 0 ? void 0 : _e.html)
189
+ textElm.innerHTML = "".concat((_f = this.sums) === null || _f === void 0 ? void 0 : _f.html);
190
190
  this.div.innerHTML = '';
191
191
  this.div.appendChild(img);
192
192
  this.div.appendChild(textElm);
@@ -199,20 +199,23 @@ var ClusterIcon = /** @class */ (function () {
199
199
  this.sums = sums;
200
200
  var styles = this.cluster.getClusterer().getStyles();
201
201
  var style = styles[Math.min(styles.length - 1, Math.max(0, sums.index - 1))];
202
- this.url = style.url;
203
- this.height = style.height;
204
- this.width = style.width;
205
- if (style.className)
206
- this.className = "".concat(this.clusterClassName, " ").concat(style.className);
207
- this.anchorText = style.anchorText || [0, 0];
208
- this.anchorIcon = style.anchorIcon || [this.height / 2, this.width / 2];
209
- this.textColor = style.textColor || 'black';
210
- this.textSize = style.textSize || 11;
211
- this.textDecoration = style.textDecoration || 'none';
212
- this.fontWeight = style.fontWeight || 'bold';
213
- this.fontStyle = style.fontStyle || 'normal';
214
- this.fontFamily = style.fontFamily || 'Arial,sans-serif';
215
- this.backgroundPosition = style.backgroundPosition || '0 0';
202
+ if (style) {
203
+ this.url = style.url;
204
+ this.height = style.height;
205
+ this.width = style.width;
206
+ if (style.className) {
207
+ this.className = "".concat(this.clusterClassName, " ").concat(style.className);
208
+ }
209
+ this.anchorText = style.anchorText || [0, 0];
210
+ this.anchorIcon = style.anchorIcon || [this.height / 2, this.width / 2];
211
+ this.textColor = style.textColor || 'black';
212
+ this.textSize = style.textSize || 11;
213
+ this.textDecoration = style.textDecoration || 'none';
214
+ this.fontWeight = style.fontWeight || 'bold';
215
+ this.fontStyle = style.fontStyle || 'normal';
216
+ this.fontFamily = style.fontFamily || 'Arial,sans-serif';
217
+ this.backgroundPosition = style.backgroundPosition || '0 0';
218
+ }
216
219
  };
217
220
  ClusterIcon.prototype.setCenter = function (center) {
218
221
  this.center = center;
@@ -228,6 +231,7 @@ var ClusterIcon = /** @class */ (function () {
228
231
  return ClusterIcon;
229
232
  }());
230
233
 
234
+ /* global google */
231
235
  var Cluster = /** @class */ (function () {
232
236
  function Cluster(markerClusterer) {
233
237
  this.markerClusterer = markerClusterer;
@@ -270,8 +274,9 @@ var Cluster = /** @class */ (function () {
270
274
  Cluster.prototype.getBounds = function () {
271
275
  var bounds = new google.maps.LatLngBounds(this.center, this.center);
272
276
  var markers = this.getMarkers();
273
- for (var i = 0; i < markers.length; i++) {
274
- var position = markers[i].getPosition();
277
+ for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
278
+ var marker = markers_1[_i];
279
+ var position = marker.getPosition();
275
280
  if (position) {
276
281
  bounds.extend(position);
277
282
  }
@@ -326,8 +331,9 @@ var Cluster = /** @class */ (function () {
326
331
  }
327
332
  else if (mCount === this.minClusterSize) {
328
333
  // Hide the markers that were showing.
329
- for (var i = 0; i < mCount; i++) {
330
- this.markers[i].setMap(null);
334
+ for (var _i = 0, _b = this.markers; _i < _b.length; _i++) {
335
+ var markerElement = _b[_i];
336
+ markerElement.setMap(null);
331
337
  }
332
338
  }
333
339
  else {
@@ -457,9 +463,9 @@ var Clusterer = /** @class */ (function () {
457
463
  this.repaint = this.repaint.bind(this);
458
464
  this.onIdle = this.onIdle.bind(this);
459
465
  this.redraw = this.redraw.bind(this);
460
- this.extend = this.extend.bind(this);
461
466
  this.onAdd = this.onAdd.bind(this);
462
467
  this.draw = this.draw.bind(this);
468
+ this.extend = this.extend.bind(this);
463
469
  this.extend(Clusterer, google.maps.OverlayView);
464
470
  this.markers = [];
465
471
  this.clusters = [];
@@ -534,25 +540,53 @@ var Clusterer = /** @class */ (function () {
534
540
  };
535
541
  Clusterer.prototype.onRemove = function () {
536
542
  // Put all the managed markers back on the map:
537
- for (var i = 0; i < this.markers.length; i++) {
538
- if (this.markers[i].getMap() !== this.activeMap) {
539
- this.markers[i].setMap(this.activeMap);
543
+ for (var _i = 0, _a = this.markers; _i < _a.length; _i++) {
544
+ var marker = _a[_i];
545
+ if (marker.getMap() !== this.activeMap) {
546
+ marker.setMap(this.activeMap);
540
547
  }
541
548
  }
542
549
  // Remove all clusters:
543
- for (var i = 0; i < this.clusters.length; i++) {
544
- this.clusters[i].remove();
550
+ for (var _b = 0, _c = this.clusters; _b < _c.length; _b++) {
551
+ var cluster = _c[_b];
552
+ cluster.remove();
545
553
  }
546
554
  this.clusters = [];
547
555
  // Remove map event listeners:
548
- for (var i = 0; i < this.listeners.length; i++) {
549
- google.maps.event.removeListener(this.listeners[i]);
556
+ for (var _d = 0, _e = this.listeners; _d < _e.length; _d++) {
557
+ var listener = _e[_d];
558
+ google.maps.event.removeListener(listener);
550
559
  }
551
560
  this.listeners = [];
552
561
  this.activeMap = null;
553
562
  this.ready = false;
554
563
  };
555
564
  Clusterer.prototype.draw = function () { return; };
565
+ Clusterer.prototype.getMap = function () { return null; };
566
+ Clusterer.prototype.getPanes = function () { return null; };
567
+ Clusterer.prototype.getProjection = function () {
568
+ return {
569
+ fromContainerPixelToLatLng: function () { return null; },
570
+ fromDivPixelToLatLng: function () { return null; },
571
+ fromLatLngToContainerPixel: function () { return null; },
572
+ fromLatLngToDivPixel: function () { return null; },
573
+ getVisibleRegion: function () { return null; },
574
+ getWorldWidth: function () { return 0; }
575
+ };
576
+ };
577
+ Clusterer.prototype.setMap = function () { return; };
578
+ Clusterer.prototype.addListener = function () {
579
+ return {
580
+ remove: function () { return; }
581
+ };
582
+ };
583
+ Clusterer.prototype.bindTo = function () { return; };
584
+ Clusterer.prototype.get = function () { return; };
585
+ Clusterer.prototype.notify = function () { return; };
586
+ Clusterer.prototype.set = function () { return; };
587
+ Clusterer.prototype.setValues = function () { return; };
588
+ Clusterer.prototype.unbind = function () { return; };
589
+ Clusterer.prototype.unbindAll = function () { return; };
556
590
  Clusterer.prototype.setupStyles = function () {
557
591
  if (this.styles.length > 0) {
558
592
  return;
@@ -560,16 +594,17 @@ var Clusterer = /** @class */ (function () {
560
594
  for (var i = 0; i < this.imageSizes.length; i++) {
561
595
  this.styles.push({
562
596
  url: "".concat(this.imagePath + (i + 1), ".").concat(this.imageExtension),
563
- height: this.imageSizes[i],
564
- width: this.imageSizes[i],
597
+ height: this.imageSizes[i] || 0,
598
+ width: this.imageSizes[i] || 0,
565
599
  });
566
600
  }
567
601
  };
568
602
  Clusterer.prototype.fitMapToMarkers = function () {
569
603
  var markers = this.getMarkers();
570
604
  var bounds = new google.maps.LatLngBounds();
571
- for (var i = 0; i < markers.length; i++) {
572
- var position = markers[i].getPosition();
605
+ for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
606
+ var marker = markers_1[_i];
607
+ var position = marker.getPosition();
573
608
  if (position) {
574
609
  bounds.extend(position);
575
610
  }
@@ -690,7 +725,10 @@ var Clusterer = /** @class */ (function () {
690
725
  Clusterer.prototype.addMarkers = function (markers, optNoDraw) {
691
726
  for (var key in markers) {
692
727
  if (Object.prototype.hasOwnProperty.call(markers, key)) {
693
- this.pushMarkerTo(markers[key]);
728
+ var marker = markers[key];
729
+ if (marker) {
730
+ this.pushMarkerTo(marker);
731
+ }
694
732
  }
695
733
  }
696
734
  if (!optNoDraw) {
@@ -741,8 +779,9 @@ var Clusterer = /** @class */ (function () {
741
779
  };
742
780
  Clusterer.prototype.removeMarkers = function (markers, optNoDraw) {
743
781
  var removed = false;
744
- for (var i = 0; i < markers.length; i++) {
745
- removed = removed || this.removeMarker_(markers[i]);
782
+ for (var _i = 0, markers_2 = markers; _i < markers_2.length; _i++) {
783
+ var marker = markers_2[_i];
784
+ removed = removed || this.removeMarker_(marker);
746
785
  }
747
786
  if (!optNoDraw && removed) {
748
787
  this.repaint();
@@ -761,8 +800,9 @@ var Clusterer = /** @class */ (function () {
761
800
  // Remove the old clusters.
762
801
  // Do it in a timeout to prevent blinking effect.
763
802
  setTimeout(function timeout() {
764
- for (var i = 0; i < oldClusters.length; i++) {
765
- oldClusters[i].remove();
803
+ for (var _i = 0, oldClusters_1 = oldClusters; _i < oldClusters_1.length; _i++) {
804
+ var oldCluster = oldClusters_1[_i];
805
+ oldCluster.remove();
766
806
  }
767
807
  }, 0);
768
808
  };
@@ -806,13 +846,14 @@ var Clusterer = /** @class */ (function () {
806
846
  };
807
847
  Clusterer.prototype.resetViewport = function (optHide) {
808
848
  // Remove all the clusters
809
- for (var i = 0; i < this.clusters.length; i++) {
810
- this.clusters[i].remove();
849
+ for (var _i = 0, _a = this.clusters; _i < _a.length; _i++) {
850
+ var cluster = _a[_i];
851
+ cluster.remove();
811
852
  }
812
853
  this.clusters = [];
813
854
  // Reset the markers to not be added and to be removed from the map.
814
- for (var i = 0; i < this.markers.length; i++) {
815
- var marker = this.markers[i];
855
+ for (var _b = 0, _c = this.markers; _b < _c.length; _b++) {
856
+ var marker = _c[_b];
816
857
  marker.isAdded = false;
817
858
  if (optHide) {
818
859
  marker.setMap(null);
@@ -841,8 +882,9 @@ var Clusterer = /** @class */ (function () {
841
882
  var cluster;
842
883
  var distance = 40000; // Some large number
843
884
  var clusterToAddTo = null;
844
- for (var i = 0; i < this.clusters.length; i++) {
845
- cluster = this.clusters[i];
885
+ for (var _i = 0, _a = this.clusters; _i < _a.length; _i++) {
886
+ var clusterElement = _a[_i];
887
+ cluster = clusterElement;
846
888
  var center = cluster.getCenter();
847
889
  var position = marker.getPosition();
848
890
  if (center && position) {
@@ -898,7 +940,7 @@ var Clusterer = /** @class */ (function () {
898
940
  var iLast = Math.min(iFirst + this.batchSize, this.markers.length);
899
941
  for (var i = iFirst; i < iLast; i++) {
900
942
  var marker = this.markers[i];
901
- if (!marker.isAdded && this.isMarkerInBounds(marker, extendedMapBounds) && (!this.ignoreHidden || (this.ignoreHidden && marker.getVisible()))) {
943
+ if (marker && !marker.isAdded && this.isMarkerInBounds(marker, extendedMapBounds) && (!this.ignoreHidden || (this.ignoreHidden && marker.getVisible()))) {
902
944
  this.addToClosestCluster(marker);
903
945
  }
904
946
  }
@@ -917,16 +959,20 @@ var Clusterer = /** @class */ (function () {
917
959
  * @event
918
960
  */
919
961
  google.maps.event.trigger(this, 'clusteringend', this);
920
- for (var i = 0; i < this.clusters.length; i++) {
921
- this.clusters[i].updateIcon();
962
+ for (var _i = 0, _a = this.clusters; _i < _a.length; _i++) {
963
+ var cluster = _a[_i];
964
+ cluster.updateIcon();
922
965
  }
923
966
  }
924
967
  };
925
968
  Clusterer.prototype.extend = function (obj1, obj2) {
926
969
  return function applyExtend(object) {
927
970
  for (var property in object.prototype) {
971
+ // eslint-disable-next-line @typescript-eslint/ban-types
972
+ var prop = property;
973
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
928
974
  // @ts-ignore
929
- this.prototype[property] = object.prototype[property];
975
+ this.prototype[prop] = object.prototype[prop];
930
976
  }
931
977
  return this;
932
978
  }.apply(obj1, [obj2]);