{"version":3,"sources":["vendor/markerclusterer.js","components/googleMaps.js","components/googleMapsMarker.js"],"names":["MarkerClusterer","map","opt_markers","opt_options","this","extend","google","maps","OverlayView","map_","markers_","clusters_","sizes","styles_","ready_","options","gridSize_","minClusterSize_","maxZoom_","imagePath_","MARKER_CLUSTER_IMAGE_PATH_","imageExtension_","MARKER_CLUSTER_IMAGE_EXTENSION_","zoomOnClick_","undefined","averageCenter_","setupStyles_","setMap","prevZoom_","getZoom","that","event","addListener","zoom","minZoom","maxZoom","Math","min","mapTypes","getMapTypeId","max","resetViewport","redraw","length","Object","keys","addMarkers","Cluster","markerClusterer","markerClusterer_","getMap","getGridSize","getMinClusterSize","isAverageCenter","center_","bounds_","clusterIcon_","ClusterIcon","getStyles","cluster","styles","opt_padding","getMarkerClusterer","padding_","cluster_","div_","sums_","visible_","prototype","obj1","obj2","object","property","apply","onAdd","setReady_","draw","size","i","push","url","height","width","fitMapToMarkers","marker","markers","getMarkers","bounds","LatLngBounds","getPosition","fitBounds","setStyles","isZoomOnClick","getTotalMarkers","setMaxZoom","getMaxZoom","calculator_","numStyles","index","count","dv","parseInt","text","setCalculator","calculator","getCalculator","opt_nodraw","pushMarkerTo_","isAdded","repaint","addMarker","removeMarker_","indexOf","m","splice","removeMarker","removed","removeMarkers","markersCopy","slice","r","ready","createClusters_","getTotalClusters","setGridSize","setMinClusterSize","getExtendedBounds","projection","getProjection","tr","LatLng","getNorthEast","lat","lng","bl","getSouthWest","trPix","fromLatLngToDivPixel","x","y","blPix","ne","fromDivPixelToLatLng","sw","isMarkerInBounds_","contains","clearMarkers","opt_hide","remove","oldClusters","window","setTimeout","distanceBetweenPoints_","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","addToClosestCluster_","distance","clusterToAddTo","center","getCenter","d","isMarkerInClusterBounds","mapBounds","getBounds","isMarkerAlreadyAdded","l","calculateBounds_","len","updateIcon","getSize","mz","hide","sums","setCenter","setSums","show","triggerClusterClick","trigger","document","createElement","pos","getPosFromLatLng_","style","cssText","createCss","innerHTML","getPanes","overlayMouseTarget","appendChild","addDomListener","latlng","width_","height_","top","left","display","onRemove","parentNode","removeChild","text_","index_","useStyle","url_","textColor_","anchor_","textSize_","backgroundPosition_","backgroundPosition","txtColor","txtSize","join","o","result","name","hasOwnProperty","dmx","Component","initialData","maptype","latitude","longitude","attributes","type","String","Number","default","address","scrollwheel","Boolean","tilt","Array","methods","props","goToMarker","id","findMarker","position","panToMarker","panTo","bounceMarker","setAnimation","fitBoundsToMarkers","stopBounce","showInfo","info","openInfoWindow","removeAllMarkers","setMapType","setMapTypeId","setZoom","refresh","reload","update","events","Event","boundschanged","centerchanged","maptypechanged","zoomchanged","mapclick","markerclick","markerpositionchanged","render","node","$parse","geocodeCache","JSON","parse","localStorage","geocoder","Geocoder","infoWindow","InfoWindow","getMarkerTypes","Map","mapTypeId","scaleControl","zoomControl","panControl","streetViewControl","mapTypeControl","rotateControl","fullscreenControl","set","onMapClick","bind","debounce","onBoundsChanged","onCenterChanged","onMaptypeChanged","onZoomChanged","dispatchEvent","googleMapsTheme","setOptions","setTilt","imagePath","getImageFolder","gridSize","minimumClusterSize","geocode","trafficLayer","TrafficLayer","transitLayer","TransitLayer","bikeLayer","BicyclingLayer","stringify","repeatItems","isArray","forEach","scope","DataScope","parent","label","labelColor","title","image","animation","draggable","e","latLng","toJSON","onMarkerClick","onMarkerPositionChanged","results","status","geometry","location","console","warn","content","setContent","open","script","querySelector","src","replace","getMarkerAnimation","toLowerCase","find","children","child","static","Marker","icon","markerTypes","setIcon","setLabel","color","setPosition","setVisible","filter","clearInstanceListeners","markerUrl","iconsUrl","black","grey","orange","white","yellow","purple","green","start","end","arrow","tree","lodging","bar","restaurant","horsebackriding","convienancestore","hiker","swimming","fishing","golfer","sportvenue","setTitle","setDraggable"],"mappings":";;;;;;AAoEA,SAAAA,gBAAAC,EAAAC,EAAAC,GAMAC,KAAAC,OAAAL,gBAAAM,OAAAC,KAAAC,aACAJ,KAAAK,KAAAR,EAMAG,KAAAM,SAAA,GAKAN,KAAAO,UAAA,GAEAP,KAAAQ,MAAA,CAAA,GAAA,GAAA,GAAA,GAAA,IAKAR,KAAAS,QAAA,GAMAT,KAAAU,QAAA,EAEA,IAAAC,EAAAZ,GAAA,GAMAC,KAAAY,UAAAD,EAAA,UAAA,GAKAX,KAAAa,gBAAAF,EAAA,oBAAA,EAOAX,KAAAc,SAAAH,EAAA,SAAA,KAEAX,KAAAS,QAAAE,EAAA,QAAA,GAMAX,KAAAe,WAAAJ,EAAA,WACAX,KAAAgB,2BAMAhB,KAAAiB,gBAAAN,EAAA,gBACAX,KAAAkB,gCAMAlB,KAAAmB,cAAA,EAEAC,MAAAT,EAAA,cACAX,KAAAmB,aAAAR,EAAA,aAOAX,KAAAqB,gBAAA,EAEAD,MAAAT,EAAA,gBACAX,KAAAqB,eAAAV,EAAA,eAGAX,KAAAsB,eAEAtB,KAAAuB,OAAA1B,GAMAG,KAAAwB,UAAAxB,KAAAK,KAAAoB,UAGA,IAAAC,EAAA1B,KACAE,OAAAC,KAAAwB,MAAAC,YAAA5B,KAAAK,KAAA,gBAAA,WAEA,IAAAwB,EAAAH,EAAArB,KAAAoB,UACAK,EAAAJ,EAAArB,KAAAyB,SAAA,EACAC,EAAAC,KAAAC,IAAAP,EAAArB,KAAA0B,SAAA,IACAL,EAAArB,KAAA6B,SAAAR,EAAArB,KAAA8B,gBAAAJ,SACAF,EAAAG,KAAAC,IAAAD,KAAAI,IAAAP,EAAAC,GAAAC,GAEAL,EAAAF,WAAAK,IACAH,EAAAF,UAAAK,EACAH,EAAAW,oBAIAnC,OAAAC,KAAAwB,MAAAC,YAAA5B,KAAAK,KAAA,QAAA,WACAqB,EAAAY,YAIAxC,IAAAA,EAAAyC,QAAAC,OAAAC,KAAA3C,GAAAyC,SACAvC,KAAA0C,WAAA5C,GAAA,GAsnBA,SAAA6C,QAAAC,GACA5C,KAAA6C,iBAAAD,EACA5C,KAAAK,KAAAuC,EAAAE,SACA9C,KAAAY,UAAAgC,EAAAG,cACA/C,KAAAa,gBAAA+B,EAAAI,oBACAhD,KAAAqB,eAAAuB,EAAAK,kBACAjD,KAAAkD,QAAA,KACAlD,KAAAM,SAAA,GACAN,KAAAmD,QAAA,KACAnD,KAAAoD,aAAA,IAAAC,YAAArD,KAAA4C,EAAAU,YACAV,EAAAG,eAuNA,SAAAM,YAAAE,EAAAC,EAAAC,GACAF,EAAAG,qBAAAzD,OAAAoD,YAAAnD,OAAAC,KAAAC,aAEAJ,KAAAS,QAAA+C,EACAxD,KAAA2D,SAAAF,GAAA,EACAzD,KAAA4D,SAAAL,EACAvD,KAAAkD,QAAA,KACAlD,KAAAK,KAAAkD,EAAAT,SACA9C,KAAA6D,KAAA,KACA7D,KAAA8D,MAAA,KACA9D,KAAA+D,UAAA,EAEA/D,KAAAuB,OAAAvB,KAAAK,MAx1BAT,gBAAAoE,UAAAhD,2BAAA,cASApB,gBAAAoE,UAAA9C,gCAAA,MAWAtB,gBAAAoE,UAAA/D,OAAA,SAAAgE,EAAAC,GACA,OAAA,SAAAC,GACA,IAAA,IAAAC,KAAAD,EAAAH,UACAhE,KAAAgE,UAAAI,GAAAD,EAAAH,UAAAI,GAEA,OAAApE,MACAqE,MAAAJ,EAAA,CAAAC,KAQAtE,gBAAAoE,UAAAM,MAAA,WACAtE,KAAAuE,WAAA,IAOA3E,gBAAAoE,UAAAQ,KAAA,aAOA5E,gBAAAoE,UAAA1C,aAAA,WACA,IAAAtB,KAAAS,QAAA8B,OAIA,IAAA,IAAAkC,EAAAC,EAAA,EAAAD,EAAAzE,KAAAQ,MAAAkE,GAAAA,IACA1E,KAAAS,QAAAkE,KAAA,CACAC,IAAA5E,KAAAe,YAAA2D,EAAA,GAAA,IAAA1E,KAAAiB,gBACA4D,OAAAJ,EACAK,MAAAL,KAQA7E,gBAAAoE,UAAAe,gBAAA,WAGA,IAFA,IAEAC,EAFAC,EAAAjF,KAAAkF,aACAC,EAAA,IAAAjF,OAAAC,KAAAiF,aACAV,EAAA,EAAAM,EAAAC,EAAAP,GAAAA,IACAS,EAAAlF,OAAA+E,EAAAK,eAGArF,KAAAK,KAAAiF,UAAAH,IASAvF,gBAAAoE,UAAAuB,UAAA,SAAA/B,GACAxD,KAAAS,QAAA+C,GASA5D,gBAAAoE,UAAAV,UAAA,WACA,OAAAtD,KAAAS,SASAb,gBAAAoE,UAAAwB,cAAA,WACA,OAAAxF,KAAAmB,cAQAvB,gBAAAoE,UAAAf,gBAAA,WACA,OAAAjD,KAAAqB,gBASAzB,gBAAAoE,UAAAkB,WAAA,WACA,OAAAlF,KAAAM,UASAV,gBAAAoE,UAAAyB,gBAAA,WACA,OAAAzF,KAAAM,SAAAiC,QASA3C,gBAAAoE,UAAA0B,WAAA,SAAA3D,GACA/B,KAAAc,SAAAiB,GASAnC,gBAAAoE,UAAA2B,WAAA,WACA,OAAA3F,KAAAc,UAYAlB,gBAAAoE,UAAA4B,YAAA,SAAAX,EAAAY,GAIA,IAHA,IAAAC,EAAA,EACAC,EAAAd,EAAA1C,OACAyD,EAAAD,EACA,IAAAC,GACAA,EAAAC,SAAAD,EAAA,GAAA,IACAF,IAIA,MAAA,CACAI,KAAAH,EACAD,MAHAA,EAAA9D,KAAAC,IAAA6D,EAAAD,KAgBAjG,gBAAAoE,UAAAmC,cAAA,SAAAC,GACApG,KAAA4F,YAAAQ,GASAxG,gBAAAoE,UAAAqC,cAAA,WACA,OAAArG,KAAA4F,aAUAhG,gBAAAoE,UAAAtB,WAAA,SAAAuC,EAAAqB,GACA,GAAArB,EAAA1C,OACA,IAAA,IAAAmC,EAAA,EAAAM,EAAAC,EAAAP,GAAAA,IACA1E,KAAAuG,cAAAvB,QAEA,GAAAxC,OAAAC,KAAAwC,GAAA1C,OACA,IAAA,IAAAyC,KAAAC,EACAjF,KAAAuG,cAAAtB,EAAAD,IAGAsB,GACAtG,KAAAsC,UAWA1C,gBAAAoE,UAAAuC,cAAA,SAAAvB,GAEA,GADAA,EAAAwB,SAAA,EACAxB,EAAA,UAAA,CAGA,IAAAtD,EAAA1B,KACAE,OAAAC,KAAAwB,MAAAC,YAAAoD,EAAA,WAAA,WACAA,EAAAwB,SAAA,EACA9E,EAAA+E,aAGAzG,KAAAM,SAAAqE,KAAAK,IAUApF,gBAAAoE,UAAA0C,UAAA,SAAA1B,EAAAsB,GACAtG,KAAAuG,cAAAvB,GACAsB,GACAtG,KAAAsC,UAYA1C,gBAAAoE,UAAA2C,cAAA,SAAA3B,GACA,IAAAc,GAAA,EACA,GAAA9F,KAAAM,SAAAsG,QACAd,EAAA9F,KAAAM,SAAAsG,QAAA5B,QAEA,IAAA,IAAA6B,EAAAnC,EAAA,EAAAmC,EAAA7G,KAAAM,SAAAoE,GAAAA,IACA,GAAAmC,GAAA7B,EAAA,CACAc,EAAApB,EACA,MAKA,OAAA,GAAAoB,IAKAd,EAAAzD,OAAA,MAEAvB,KAAAM,SAAAwG,OAAAhB,EAAA,IAEA,IAWAlG,gBAAAoE,UAAA+C,aAAA,SAAA/B,EAAAsB,GACA,IAAAU,EAAAhH,KAAA2G,cAAA3B,GAEA,QAAAsB,IAAAU,KACAhH,KAAAqC,gBACArC,KAAAsC,UACA,IAaA1C,gBAAAoE,UAAAiD,cAAA,SAAAhC,EAAAqB,GAMA,IAHA,IAGAtB,EAHAkC,EAAAjC,IAAAjF,KAAAkF,aAAAD,EAAAkC,QAAAlC,EACA+B,GAAA,EAEAtC,EAAA,EAAAM,EAAAkC,EAAAxC,GAAAA,IAAA,CACA,IAAA0C,EAAApH,KAAA2G,cAAA3B,GACAgC,EAAAA,GAAAI,EAGA,IAAAd,GAAAU,EAGA,OAFAhH,KAAAqC,gBACArC,KAAAsC,UACA,GAWA1C,gBAAAoE,UAAAO,UAAA,SAAA8C,GACArH,KAAAU,SACAV,KAAAU,OAAA2G,EACArH,KAAAsH,oBAUA1H,gBAAAoE,UAAAuD,iBAAA,WACA,OAAAvH,KAAAO,UAAAgC,QASA3C,gBAAAoE,UAAAlB,OAAA,WACA,OAAA9C,KAAAK,MASAT,gBAAAoE,UAAAzC,OAAA,SAAA1B,GACAG,KAAAK,KAAAR,GASAD,gBAAAoE,UAAAjB,YAAA,WACA,OAAA/C,KAAAY,WASAhB,gBAAAoE,UAAAwD,YAAA,SAAA/C,GACAzE,KAAAY,UAAA6D,GASA7E,gBAAAoE,UAAAhB,kBAAA,WACA,OAAAhD,KAAAa,iBAQAjB,gBAAAoE,UAAAyD,kBAAA,SAAAhD,GACAzE,KAAAa,gBAAA4D,GAUA7E,gBAAAoE,UAAA0D,kBAAA,SAAAvC,GACA,IAAAwC,EAAA3H,KAAA4H,gBAGAC,EAAA,IAAA3H,OAAAC,KAAA2H,OAAA3C,EAAA4C,eAAAC,MACA7C,EAAA4C,eAAAE,OACAC,EAAA,IAAAhI,OAAAC,KAAA2H,OAAA3C,EAAAgD,eAAAH,MACA7C,EAAAgD,eAAAF,OAGAG,EAAAT,EAAAU,qBAAAR,GACAO,EAAAE,GAAAtI,KAAAY,UACAwH,EAAAG,GAAAvI,KAAAY,UAEA,IAAA4H,EAAAb,EAAAU,qBAAAH,GACAM,EAAAF,GAAAtI,KAAAY,UACA4H,EAAAD,GAAAvI,KAAAY,UAGA,IAAA6H,EAAAd,EAAAe,qBAAAN,GACAO,EAAAhB,EAAAe,qBAAAF,GAMA,OAHArD,EAAAlF,OAAAwI,GACAtD,EAAAlF,OAAA0I,GAEAxD,GAYAvF,gBAAAoE,UAAA4E,kBAAA,SAAA5D,EAAAG,GACA,OAAAA,EAAA0D,SAAA7D,EAAAK,gBAOAzF,gBAAAoE,UAAA8E,aAAA,WACA9I,KAAAqC,eAAA,GAGArC,KAAAM,SAAA,IAQAV,gBAAAoE,UAAA3B,cAAA,SAAA0G,GAEA,IAAA,IAAAxF,EAAAmB,EAAA,EAAAnB,EAAAvD,KAAAO,UAAAmE,GAAAA,IACAnB,EAAAyF,SAIA,IAAAhE,EAAA,IAAAN,EAAA,EAAAM,EAAAhF,KAAAM,SAAAoE,GAAAA,IACAM,EAAAwB,SAAA,EACAuC,GACA/D,EAAAzD,OAAA,MAIAvB,KAAAO,UAAA,IAMAX,gBAAAoE,UAAAyC,QAAA,WACA,IAAAwC,EAAAjJ,KAAAO,UAAA4G,QACAnH,KAAAO,UAAAgC,OAAA,EACAvC,KAAAqC,gBACArC,KAAAsC,SAIA4G,OAAAC,YAAA,WACA,IAAA,IAAA5F,EAAAmB,EAAA,EAAAnB,EAAA0F,EAAAvE,GAAAA,IACAnB,EAAAyF,WAEA,IAOApJ,gBAAAoE,UAAA1B,OAAA,WACAtC,KAAAsH,mBAaA1H,gBAAAoE,UAAAoF,uBAAA,SAAAC,EAAAC,GACA,IAAAD,IAAAC,EACA,OAAA,EAGA,IACAC,GAAAD,EAAAtB,MAAAqB,EAAArB,OAAAhG,KAAAwH,GAAA,IACAC,GAAAH,EAAArB,MAAAoB,EAAApB,OAAAjG,KAAAwH,GAAA,IACAE,EAAA1H,KAAA2H,IAAAJ,EAAA,GAAAvH,KAAA2H,IAAAJ,EAAA,GACAvH,KAAA4H,IAAAP,EAAArB,MAAAhG,KAAAwH,GAAA,KAAAxH,KAAA4H,IAAAN,EAAAtB,MAAAhG,KAAAwH,GAAA,KACAxH,KAAA2H,IAAAF,EAAA,GAAAzH,KAAA2H,IAAAF,EAAA,GAGA,OARA,MAMA,EAAAzH,KAAA6H,MAAA7H,KAAA8H,KAAAJ,GAAA1H,KAAA8H,KAAA,EAAAJ,MAYA9J,gBAAAoE,UAAA+F,qBAAA,SAAA/E,GAIA,IAHA,IAiBAzB,EAjBAyG,EAAA,IACAC,EAAA,KAEAvF,GADAM,EAAAK,cACA,GAAA9B,EAAAvD,KAAAO,UAAAmE,GAAAA,IAAA,CACA,IAAAwF,EAAA3G,EAAA4G,YACA,GAAAD,EAAA,CACA,IAAAE,EAAApK,KAAAoJ,uBAAAc,EAAAlF,EAAAK,eACA+E,EAAAJ,IACAA,EAAAI,EACAH,EAAA1G,IAKA0G,GAAAA,EAAAI,wBAAArF,GACAiF,EAAAvD,UAAA1B,KAEAzB,EAAA,IAAAZ,QAAA3C,OACA0G,UAAA1B,GACAhF,KAAAO,UAAAoE,KAAApB,KAUA3D,gBAAAoE,UAAAsD,gBAAA,WACA,GAAAtH,KAAAU,OAUA,IAJA,IAIAsE,EAJAsF,EAAA,IAAApK,OAAAC,KAAAiF,aAAApF,KAAAK,KAAAkK,YAAApC,eACAnI,KAAAK,KAAAkK,YAAAxC,gBACA5C,EAAAnF,KAAA0H,kBAAA4C,GAEA5F,EAAA,EAAAM,EAAAhF,KAAAM,SAAAoE,GAAAA,KACAM,EAAAwB,SAAAxG,KAAA4I,kBAAA5D,EAAAG,IACAnF,KAAA+J,qBAAA/E,IAiCArC,QAAAqB,UAAAwG,qBAAA,SAAAxF,GACA,GAAAhF,KAAAM,SAAAsG,QACA,OAAA,GAAA5G,KAAAM,SAAAsG,QAAA5B,GAEA,IAAA,IAAA6B,EAAAnC,EAAA,EAAAmC,EAAA7G,KAAAM,SAAAoE,GAAAA,IACA,GAAAmC,GAAA7B,EACA,OAAA,EAIA,OAAA,GAUArC,QAAAqB,UAAA0C,UAAA,SAAA1B,GACA,GAAAhF,KAAAwK,qBAAAxF,GACA,OAAA,EAGA,GAAAhF,KAAAkD,SAIA,GAAAlD,KAAAqB,eAAA,CACA,IAAAoJ,EAAAzK,KAAAM,SAAAiC,OAAA,EACAyF,GAAAhI,KAAAkD,QAAA8E,OAAAyC,EAAA,GAAAzF,EAAAK,cAAA2C,OAAAyC,EACAxC,GAAAjI,KAAAkD,QAAA+E,OAAAwC,EAAA,GAAAzF,EAAAK,cAAA4C,OAAAwC,EACAzK,KAAAkD,QAAA,IAAAhD,OAAAC,KAAA2H,OAAAE,EAAAC,GACAjI,KAAA0K,yBARA1K,KAAAkD,QAAA8B,EAAAK,cACArF,KAAA0K,mBAWA1F,EAAAwB,SAAA,EACAxG,KAAAM,SAAAqE,KAAAK,GAEA,IAAA2F,EAAA3K,KAAAM,SAAAiC,OAMA,GALAoI,EAAA3K,KAAAa,iBAAAmE,EAAAlC,UAAA9C,KAAAK,MAEA2E,EAAAzD,OAAAvB,KAAAK,MAGAsK,GAAA3K,KAAAa,gBAEA,IAAA,IAAA6D,EAAA,EAAAA,EAAAiG,EAAAjG,IACA1E,KAAAM,SAAAoE,GAAAnD,OAAA,MASA,OALAoJ,GAAA3K,KAAAa,iBACAmE,EAAAzD,OAAA,MAGAvB,KAAA4K,cACA,GASAjI,QAAAqB,UAAAN,mBAAA,WACA,OAAA1D,KAAA6C,kBASAF,QAAAqB,UAAAuG,UAAA,WAGA,IAFA,IAEAvF,EAFAG,EAAA,IAAAjF,OAAAC,KAAAiF,aAAApF,KAAAkD,QAAAlD,KAAAkD,SACA+B,EAAAjF,KAAAkF,aACAR,EAAA,EAAAM,EAAAC,EAAAP,GAAAA,IACAS,EAAAlF,OAAA+E,EAAAK,eAEA,OAAAF,GAOAxC,QAAAqB,UAAAgF,OAAA,WACAhJ,KAAAoD,aAAA4F,SACAhJ,KAAAM,SAAAiC,OAAA,SACAvC,KAAAM,UASAqC,QAAAqB,UAAA6G,QAAA,WACA,OAAA7K,KAAAM,SAAAiC,QASAI,QAAAqB,UAAAkB,WAAA,WACA,OAAAlF,KAAAM,UASAqC,QAAAqB,UAAAmG,UAAA,WACA,OAAAnK,KAAAkD,SASAP,QAAAqB,UAAA0G,iBAAA,WACA,IAAAvF,EAAA,IAAAjF,OAAAC,KAAAiF,aAAApF,KAAAkD,QAAAlD,KAAAkD,SACAlD,KAAAmD,QAAAnD,KAAA6C,iBAAA6E,kBAAAvC,IAUAxC,QAAAqB,UAAAqG,wBAAA,SAAArF,GACA,OAAAhF,KAAAmD,QAAA0F,SAAA7D,EAAAK,gBASA1C,QAAAqB,UAAAlB,OAAA,WACA,OAAA9C,KAAAK,MAOAsC,QAAAqB,UAAA4G,WAAA,WACA,IAAA/I,EAAA7B,KAAAK,KAAAoB,UACAqJ,EAAA9K,KAAA6C,iBAAA8C,aAEA,GAAAmF,GAAAjJ,EAAAiJ,EAEA,IAAA,IAAA9F,EAAAN,EAAA,EAAAM,EAAAhF,KAAAM,SAAAoE,GAAAA,IACAM,EAAAzD,OAAAvB,KAAAK,WAKA,GAAAL,KAAAM,SAAAiC,OAAAvC,KAAAa,gBAEAb,KAAAoD,aAAA2H,WAFA,CAMA,IAAAlF,EAAA7F,KAAA6C,iBAAAS,YAAAf,OACAyI,EAAAhL,KAAA6C,iBAAAwD,eAAArG,CAAAA,KAAAM,SAAAuF,GACA7F,KAAAoD,aAAA6H,UAAAjL,KAAAkD,SACAlD,KAAAoD,aAAA8H,QAAAF,GACAhL,KAAAoD,aAAA+H,SAwCA9H,YAAAW,UAAAoH,oBAAA,WACA,IAAAxI,EAAA5C,KAAA4D,SAAAF,qBAGAxD,OAAAC,KAAAwB,MAAA0J,QAAAzI,EAAAvC,KAAA,eAAAL,KAAA4D,UAEAhB,EAAA4C,iBAEAxF,KAAAK,KAAAiF,UAAAtF,KAAA4D,SAAA2G,cASAlH,YAAAW,UAAAM,MAAA,WAEA,GADAtE,KAAA6D,KAAAyH,SAAAC,cAAA,OACAvL,KAAA+D,SAAA,CACA,IAAAyH,EAAAxL,KAAAyL,kBAAAzL,KAAAkD,SACAlD,KAAA6D,KAAA6H,MAAAC,QAAA3L,KAAA4L,UAAAJ,GACAxL,KAAA6D,KAAAgI,UAAA7L,KAAA8D,MAAAoC,KAGAlG,KAAA8L,WACAC,mBAAAC,YAAAhM,KAAA6D,MAEA,IAAAnC,EAAA1B,KACAE,OAAAC,KAAAwB,MAAAsK,eAAAjM,KAAA6D,KAAA,SAAA,WACAnC,EAAA0J,0BAYA/H,YAAAW,UAAAyH,kBAAA,SAAAS,GACA,IAAAV,EAAAxL,KAAA4H,gBAAAS,qBAAA6D,GAGA,OAFAV,EAAAlD,GAAArC,SAAAjG,KAAAmM,OAAA,EAAA,IACAX,EAAAjD,GAAAtC,SAAAjG,KAAAoM,QAAA,EAAA,IACAZ,GAQAnI,YAAAW,UAAAQ,KAAA,WACA,GAAAxE,KAAA+D,SAAA,CACA,IAAAyH,EAAAxL,KAAAyL,kBAAAzL,KAAAkD,SACAlD,KAAA6D,KAAA6H,MAAAW,IAAAb,EAAAjD,EAAA,KACAvI,KAAA6D,KAAA6H,MAAAY,KAAAd,EAAAlD,EAAA,OAQAjF,YAAAW,UAAA+G,KAAA,WACA/K,KAAA6D,OACA7D,KAAA6D,KAAA6H,MAAAa,QAAA,QAEAvM,KAAA+D,UAAA,GAOAV,YAAAW,UAAAmH,KAAA,WACA,GAAAnL,KAAA6D,KAAA,CACA,IAAA2H,EAAAxL,KAAAyL,kBAAAzL,KAAAkD,SACAlD,KAAA6D,KAAA6H,MAAAC,QAAA3L,KAAA4L,UAAAJ,GACAxL,KAAA6D,KAAA6H,MAAAa,QAAA,GAEAvM,KAAA+D,UAAA,GAOAV,YAAAW,UAAAgF,OAAA,WACAhJ,KAAAuB,OAAA,OAQA8B,YAAAW,UAAAwI,SAAA,WACAxM,KAAA6D,MAAA7D,KAAA6D,KAAA4I,aACAzM,KAAA+K,OACA/K,KAAA6D,KAAA4I,WAAAC,YAAA1M,KAAA6D,MACA7D,KAAA6D,KAAA,OAYAR,YAAAW,UAAAkH,QAAA,SAAAF,GACAhL,KAAA8D,MAAAkH,EACAhL,KAAA2M,MAAA3B,EAAA9E,KACAlG,KAAA4M,OAAA5B,EAAAlF,MACA9F,KAAA6D,OACA7D,KAAA6D,KAAAgI,UAAAb,EAAA9E,MAGAlG,KAAA6M,YAOAxJ,YAAAW,UAAA6I,SAAA,WACA,IAAA/G,EAAA9D,KAAAI,IAAA,EAAApC,KAAA8D,MAAAgC,MAAA,GACAA,EAAA9D,KAAAC,IAAAjC,KAAAS,QAAA8B,OAAA,EAAAuD,GACA,IAAA4F,EAAA1L,KAAAS,QAAAqF,GACA9F,KAAA8M,KAAApB,EAAA,IACA1L,KAAAoM,QAAAV,EAAA,OACA1L,KAAAmM,OAAAT,EAAA,MACA1L,KAAA+M,WAAArB,EAAA,UACA1L,KAAAgN,QAAAtB,EAAA,OACA1L,KAAAiN,UAAAvB,EAAA,SACA1L,KAAAkN,oBAAAxB,EAAA,oBASArI,YAAAW,UAAAiH,UAAA,SAAAf,GACAlK,KAAAkD,QAAAgH,GAUA7G,YAAAW,UAAA4H,UAAA,SAAAJ,GACA,IAAAE,EAAA,GACAA,EAAA/G,KAAA,wBAAA3E,KAAA8M,KAAA,MACA,IAAAK,EAAAnN,KAAAkN,oBAAAlN,KAAAkN,oBAAA,MACAxB,EAAA/G,KAAA,uBAAAwI,EAAA,KAEA,iBAAAnN,KAAAgN,SACA,iBAAAhN,KAAAgN,QAAA,IAAAhN,KAAAgN,QAAA,GAAA,GACAhN,KAAAgN,QAAA,GAAAhN,KAAAoM,QACAV,EAAA/G,KAAA,WAAA3E,KAAAoM,QAAApM,KAAAgN,QAAA,IACA,mBAAAhN,KAAAgN,QAAA,GAAA,OAEAtB,EAAA/G,KAAA,UAAA3E,KAAAoM,QAAA,mBAAApM,KAAAoM,QACA,OAEA,iBAAApM,KAAAgN,QAAA,IAAAhN,KAAAgN,QAAA,GAAA,GACAhN,KAAAgN,QAAA,GAAAhN,KAAAmM,OACAT,EAAA/G,KAAA,UAAA3E,KAAAmM,OAAAnM,KAAAgN,QAAA,IACA,oBAAAhN,KAAAgN,QAAA,GAAA,OAEAtB,EAAA/G,KAAA,SAAA3E,KAAAmM,OAAA,2BAGAT,EAAA/G,KAAA,UAAA3E,KAAAoM,QAAA,mBACApM,KAAAoM,QAAA,aAAApM,KAAAmM,OAAA,0BAGA,IAAAiB,EAAApN,KAAA+M,WAAA/M,KAAA+M,WAAA,QACAM,EAAArN,KAAAiN,UAAAjN,KAAAiN,UAAA,GAKA,OAHAvB,EAAA/G,KAAA,uBAAA6G,EAAAjD,EAAA,YACAiD,EAAAlD,EAAA,aAAA8E,EAAA,kCACAC,EAAA,sDACA3B,EAAA4B,KAAA,KAOApE,OAAA,gBAAAtJ,gBACAA,gBAAAoE,UAAA,UAAApE,gBAAAoE,UAAA0C,UACA9G,gBAAAoE,UAAA,WAAApE,gBAAAoE,UAAAtB,WACA9C,gBAAAoE,UAAA,aACApE,gBAAAoE,UAAA8E,aACAlJ,gBAAAoE,UAAA,gBACApE,gBAAAoE,UAAAe,gBACAnF,gBAAAoE,UAAA,cACApE,gBAAAoE,UAAAqC,cACAzG,gBAAAoE,UAAA,YACApE,gBAAAoE,UAAAjB,YACAnD,gBAAAoE,UAAA,kBACApE,gBAAAoE,UAAA0D,kBACA9H,gBAAAoE,UAAA,OAAApE,gBAAAoE,UAAAlB,OACAlD,gBAAAoE,UAAA,WAAApE,gBAAAoE,UAAAkB,WACAtF,gBAAAoE,UAAA,WAAApE,gBAAAoE,UAAA2B,WACA/F,gBAAAoE,UAAA,UAAApE,gBAAAoE,UAAAV,UACA1D,gBAAAoE,UAAA,iBACApE,gBAAAoE,UAAAuD,iBACA3H,gBAAAoE,UAAA,gBACApE,gBAAAoE,UAAAyB,gBACA7F,gBAAAoE,UAAA,OAAApE,gBAAAoE,UAAA1B,OACA1C,gBAAAoE,UAAA,aACApE,gBAAAoE,UAAA+C,aACAnH,gBAAAoE,UAAA,cACApE,gBAAAoE,UAAAiD,cACArH,gBAAAoE,UAAA,cACApE,gBAAAoE,UAAA3B,cACAzC,gBAAAoE,UAAA,QACApE,gBAAAoE,UAAAyC,QACA7G,gBAAAoE,UAAA,cACApE,gBAAAoE,UAAAmC,cACAvG,gBAAAoE,UAAA,YACApE,gBAAAoE,UAAAwD,YACA5H,gBAAAoE,UAAA,WACApE,gBAAAoE,UAAA0B,WACA9F,gBAAAoE,UAAA,MAAApE,gBAAAoE,UAAAM,MACA1E,gBAAAoE,UAAA,KAAApE,gBAAAoE,UAAAQ,KAEA7B,QAAAqB,UAAA,UAAArB,QAAAqB,UAAAmG,UACAxH,QAAAqB,UAAA,QAAArB,QAAAqB,UAAA6G,QACAlI,QAAAqB,UAAA,WAAArB,QAAAqB,UAAAkB,WAEA7B,YAAAW,UAAA,MAAAX,YAAAW,UAAAM,MACAjB,YAAAW,UAAA,KAAAX,YAAAW,UAAAQ,KACAnB,YAAAW,UAAA,SAAAX,YAAAW,UAAAwI,SAEAhK,OAAAC,KAAAD,OAAAC,MAAA,SAAA8K,GACA,IAAAC,EAAA,GACA,IAAA,IAAAC,KAAAF,EACAA,EAAAG,eAAAD,IACAD,EAAA7I,KAAA8I,GAEA,OAAAD,GCpyCAG,IAAAC,UAAA,cAAA,CAEAC,YAAA,CACAhM,KAAA,GACAiM,QAAA,UACAC,SAAA,KACAC,UAAA,MAGAC,WAAA,CACAnJ,MAAA,CACAoJ,KAAA,CAAAC,OAAAC,QACAC,QAAA,QAGAxJ,OAAA,CACAqJ,KAAA,CAAAC,OAAAC,QACAC,QAAA,KAGAN,SAAA,CACAG,KAAAE,OACAC,QAAA,MAGAL,UAAA,CACAE,KAAAE,OACAC,QAAA,MAGAC,QAAA,CACAJ,KAAAC,OACAE,QAAA,MAWAxM,KAAA,CACAqM,KAAAE,OACAC,QAAA,IAGAP,QAAA,CACAI,KAAAC,OACAE,QAAA,WAGAE,YAAA,CACAL,KAAAM,QACAH,SAAA,GAGAI,KAAA,CACAP,KAAAM,QACAH,SAAA,GAGA,iBAAA,CACAH,KAAAM,QACAH,SAAA,GAGA,gBAAA,CACAH,KAAAM,QACAH,SAAA,GAGA,qBAAA,CACAH,KAAAM,QACAH,SAAA,GAGA,eAAA,CACAH,KAAAM,QACAH,SAAA,GAGA,qBAAA,CACAH,KAAAM,QACAH,SAAA,GAGA,kBAAA,CACAH,KAAAM,QACAH,SAAA,GAGA,kBAAA,CACAH,KAAAM,QACAH,SAAA,GAGA,gBAAA,CACAH,KAAAM,QACAH,SAAA,GAGA,gBAAA,CACAH,KAAAM,QACAH,SAAA,GAGA,kBAAA,CACAH,KAAAM,QACAH,SAAA,GAGApJ,QAAA,CACAiJ,KAAAQ,MACAL,QAAA,MAGA,YAAA,CACAH,KAAAC,OACAE,QAAA,MAGA,kBAAA,CACAH,KAAAC,OACAE,QAAA,YAGA,mBAAA,CACAH,KAAAC,OACAE,QAAA,aAGA,iBAAA,CACAH,KAAAC,OACAE,QAAA,WAGA,eAAA,CACAH,KAAAC,OACAE,QAAA,SAGA,qBAAA,CACAH,KAAAC,OACAE,QAAA,SAGA,eAAA,CACAH,KAAAC,OACAE,QAAA,SAGA,cAAA,CACAH,KAAAC,OACAE,QAAA,QAGA,cAAA,CACAH,KAAAC,OACAE,QAAA,QAGA,eAAA,CACAH,KAAAC,OACAE,QAAA,QAGA,mBAAA,CACAH,KAAAC,OACAE,QAAA,aAGA,mBAAA,CACAH,KAAAC,OACAE,QAAA,aAGA,oBAAA,CACAH,KAAAE,OACAC,QAAA,IAGA,mBAAA,CACAH,KAAAE,OACAC,QAAA,MAGA,mBAAA,CACAH,KAAAE,OACAC,QAAA,IAIAM,QAAA,CACAjI,UAAA,SAAA/F,GACA,IAAAqE,EAAAhF,KAAA0G,UAAA/F,GACAX,KAAAuD,SAAAvD,KAAA4O,MAAA,mBACA5O,KAAAuD,QAAAmD,UAAA1B,GAEAA,EAAAzD,OAAAvB,KAAAH,MAIAgP,WAAA,SAAAC,GACA,IAAA9J,EAAAhF,KAAA+O,WAAAD,GACA9J,GACAhF,KAAAH,IAAAoL,UAAAjG,EAAAgK,WAIAC,YAAA,SAAAH,GACA,IAAA9J,EAAAhF,KAAA+O,WAAAD,GACA9J,GACAhF,KAAAH,IAAAqP,MAAAlK,EAAAgK,WAIAG,aAAA,SAAAL,GACA,IAAA9J,EAAAhF,KAAA+O,WAAAD,GACA9J,GACAA,EAAAoK,aAAA,IAIAC,mBAAA,WACA,GAAArP,KAAAiF,QAAA1C,OAAA,CAGA,IAFA,IAAA4C,EAAA,IAAAjF,OAAAC,KAAAiF,aAEAV,EAAA,EAAAA,EAAA1E,KAAAiF,QAAA1C,OAAAmC,IACAS,EAAAlF,OAAAD,KAAAiF,QAAAP,GAAAW,eAGArF,KAAAH,IAAAyF,UAAAH,KAIAmK,WAAA,SAAAR,GACA,IAAA9J,EAAAhF,KAAA+O,WAAAD,GACA9J,GACAA,EAAAoK,aAAA,OAIAG,SAAA,SAAAT,GACA,IAAA9J,EAAAhF,KAAA+O,WAAAD,GACA9J,GAAAA,EAAAwK,MACAxP,KAAAyP,eAAAzK,EAAAA,EAAAwK,OAIAE,iBAAA,WACA1P,KAAA0P,oBAGAR,MAAA,SAAAnB,EAAAC,GACAhO,KAAAH,IAAAqP,MAAA,CAAAlH,KAAA+F,EAAA9F,KAAA+F,KAGA/C,UAAA,SAAA8C,EAAAC,GACAhO,KAAAH,IAAAoL,UAAA,CAAAjD,KAAA+F,EAAA9F,KAAA+F,KAGA2B,WAAA,SAAA7B,GACA9N,KAAAH,IAAA+P,aAAA9B,IAGA+B,QAAA,SAAAhO,GACA7B,KAAAH,IAAAgQ,QAAAhO,IAGAiO,QAAA,WACA5P,OAAAC,KAAAwB,MAAA0J,QAAArL,KAAAH,IAAA,WAGAkQ,OAAA,WACA/P,KAAAgQ,OAAA,MAIAC,OAAA,CACA5I,MAAA6I,MACAC,cAAAD,MACAE,cAAAF,MACAG,eAAAH,MACAI,YAAAJ,MACAK,SAAAL,MACAM,YAAAN,MACAO,sBAAAP,OAGAQ,OAAA,SAAAC,GACA3Q,KAAA4Q,SAEAD,EAAAjF,MAAAa,QAAA,QACAoE,EAAAjF,MAAA5G,MAAA9E,KAAA6K,QAAA7K,KAAA4O,MAAA9J,OACA6L,EAAAjF,MAAA7G,OAAA7E,KAAA6K,QAAA7K,KAAA4O,MAAA/J,QAEA7E,KAAA6Q,aAAAC,KAAAC,MAAAC,aAAAH,cAAA,MACA7Q,KAAAiR,SAAA,IAAA/Q,OAAAC,KAAA+Q,SACAlR,KAAAmR,WAAA,IAAAjR,OAAAC,KAAAiR,WAEApR,KAAAiF,QAAA,GACAjF,KAAAqR,iBAEArR,KAAAH,IAAA,IAAAK,OAAAC,KAAAmR,IAAAX,EAAA,CACA9O,MAAA7B,KAAA4O,MAAA/M,KACAqI,OAAA,CAAAlC,KAAAhI,KAAA4O,MAAAb,SAAA9F,KAAAjI,KAAA4O,MAAAZ,WACAuD,UAAAvR,KAAA4O,MAAAd,QACAS,YAAAvO,KAAA4O,MAAAL,YACAiD,aAAAxR,KAAA4O,MAAA,iBACA6C,YAAAzR,KAAA4O,MAAA,gBACA8C,WAAA1R,KAAA4O,MAAA,eACA+C,kBAAA3R,KAAA4O,MAAA,sBACAgD,eAAA5R,KAAA4O,MAAA,mBACAiD,cAAA7R,KAAA4O,MAAA,kBACAkD,kBAAA9R,KAAA4O,MAAA,wBAGA5O,KAAA+R,IAAA,YAAA/R,KAAA4O,MAAAb,UACA/N,KAAA+R,IAAA,aAAA/R,KAAA4O,MAAAZ,WACAhO,KAAA+R,IAAA,UAAA/R,KAAAH,IAAAsC,gBACAnC,KAAA+R,IAAA,OAAA/R,KAAAH,IAAA4B,WAEAzB,KAAAH,IAAA+B,YAAA,QAAA5B,KAAAgS,WAAAC,KAAAjS,OACAA,KAAAH,IAAA+B,YAAA,iBAAA+L,IAAAuE,SAAAlS,KAAAmS,gBAAAF,KAAAjS,MAAA,MACAA,KAAAH,IAAA+B,YAAA,iBAAA+L,IAAAuE,SAAAlS,KAAAoS,gBAAAH,KAAAjS,MAAA,MACAA,KAAAH,IAAA+B,YAAA,oBAAA+L,IAAAuE,SAAAlS,KAAAqS,iBAAAJ,KAAAjS,MAAA,MACAA,KAAAH,IAAA+B,YAAA,eAAA+L,IAAAuE,SAAAlS,KAAAsS,cAAAL,KAAAjS,MAAA,MACAmJ,WAAAnJ,KAAAuS,cAAAN,KAAAjS,KAAA,SAAA,KAEAkJ,OAAAsJ,iBACAxS,KAAAH,IAAA4S,WAAA,CAAAjP,OAAA0F,OAAAsJ,kBAGAxS,KAAA4O,MAAAH,MACAzO,KAAAH,IAAA6S,QAAA,IAGA1S,KAAAkF,aAEAlF,KAAA4O,MAAA,qBACA5O,KAAAuD,QAAA,IAAA3D,gBAAAI,KAAAH,IAAAG,KAAAiF,QAAA,CACA0N,UAAA3S,KAAA4S,iBACAC,SAAA7S,KAAA4O,MAAA,qBACAkE,mBAAA9S,KAAA4O,MAAA,oBACA7M,QAAA/B,KAAA4O,MAAA,uBAIA5O,KAAA4O,MAAAb,UAAA/N,KAAA4O,MAAAZ,YAAAhO,KAAA4O,MAAAN,SACAtO,KAAA+S,QAAA/S,KAAA4O,MAAAN,SAGAtO,KAAA4O,MAAA,mBACA5O,KAAAgT,aAAA,IAAA9S,OAAAC,KAAA8S,aACAjT,KAAAgT,aAAAzR,OAAAvB,KAAAH,MAGAG,KAAA4O,MAAA,mBACA5O,KAAAkT,aAAA,IAAAhT,OAAAC,KAAAgT,aACAnT,KAAAkT,aAAA3R,OAAAvB,KAAAH,MAGAG,KAAA4O,MAAA,qBACA5O,KAAAoT,UAAA,IAAAlT,OAAAC,KAAAkT,eACArT,KAAAoT,UAAA7R,OAAAvB,KAAAH,OAIAmQ,OAAA,SAAApB,GAqBA,GApBA5O,KAAA4O,MAAAb,UAAAa,EAAAb,UAAA/N,KAAA4O,MAAAZ,WAAAY,EAAAZ,WACAhO,KAAAH,IAAAoL,UAAA,CAAAjD,KAAAhI,KAAA4O,MAAAb,SAAA9F,KAAAjI,KAAA4O,MAAAZ,YAGAhO,KAAA4O,MAAAN,SAAAtO,KAAA4O,MAAAN,SAAAM,EAAAN,SACAtO,KAAA+S,QAAA/S,KAAA4O,MAAAN,SAGAtO,KAAA4O,MAAA/M,MAAA+M,EAAA/M,MACA7B,KAAAH,IAAAgQ,SAAA7P,KAAA4O,MAAA/M,MAGA7B,KAAA4O,MAAAd,SAAAc,EAAAd,SACA9N,KAAAH,IAAA+P,aAAA5P,KAAA4O,MAAAd,SAGA9N,KAAA4O,MAAAH,MAAAG,EAAAH,MACAzO,KAAAH,IAAA6S,QAAA1S,KAAA4O,MAAAH,KAAA,GAAA,GAGAqC,KAAAwC,UAAAtT,KAAA4O,MAAA3J,UAAA6L,KAAAwC,UAAA1E,EAAA3J,SAAA,CACAjF,KAAA0P,mBAEA,IAAAzK,EAAA0I,IAAA4F,YAAAvT,KAAA4O,MAAA3J,SAEAyJ,MAAA8E,QAAAvO,KACAA,EAAAwO,SAAA,SAAAzO,GAMA,IAAA0O,EAAA,IAAA/F,IAAAgG,UAAA3O,EAAAhF,KAAA4T,QACA5T,KAAA0G,UAAA,CACAoI,GAAAnB,IAAAoD,MAAA/Q,KAAA4O,MAAA,aAAA8E,GACA3F,UAAAJ,IAAAoD,MAAA/Q,KAAA4O,MAAA,mBAAA8E,GACA1F,WAAAL,IAAAoD,MAAA/Q,KAAA4O,MAAA,oBAAA8E,GACApF,QAAAX,IAAAoD,MAAA/Q,KAAA4O,MAAA,kBAAA8E,GACAG,MAAAlG,IAAAoD,MAAA/Q,KAAA4O,MAAA,gBAAA8E,GACAI,WAAAnG,IAAAoD,MAAA/Q,KAAA4O,MAAA,sBAAA8E,GACAK,MAAApG,IAAAoD,MAAA/Q,KAAA4O,MAAA,gBAAA8E,GACAlE,KAAA7B,IAAAoD,MAAA/Q,KAAA4O,MAAA,eAAA8E,GACAxF,KAAAP,IAAAoD,MAAA/Q,KAAA4O,MAAA,eAAA8E,GACAM,MAAArG,IAAAoD,MAAA/Q,KAAA4O,MAAA,gBAAA8E,GACAO,UAAAtG,IAAAoD,MAAA/Q,KAAA4O,MAAA,oBAAA8E,GACAQ,YAAAvG,IAAAoD,MAAA/Q,KAAA4O,MAAA,oBAAA8E,OAEA1T,MAEAA,KAAA4O,MAAA,qBACA5O,KAAAuD,QAAA,IAAA3D,gBAAAI,KAAAH,IAAAG,KAAAiF,QAAA,CACA0N,UAAA3S,KAAA4S,iBACAC,SAAA7S,KAAA4O,MAAA,qBACAkE,mBAAA9S,KAAA4O,MAAA,oBACA7M,QAAA/B,KAAA4O,MAAA,wBAMAkC,KAAAwC,UAAAtT,KAAA4O,QAAAkC,KAAAwC,UAAA1E,IACA5O,KAAAH,IAAA4S,WAAA,CACAlE,YAAAvO,KAAA4O,MAAAL,YACAiD,aAAAxR,KAAA4O,MAAA,iBACA6C,YAAAzR,KAAA4O,MAAA,gBACA8C,WAAA1R,KAAA4O,MAAA,eACA+C,kBAAA3R,KAAA4O,MAAA,sBACAgD,eAAA5R,KAAA4O,MAAA,mBACAiD,cAAA7R,KAAA4O,MAAA,kBACAkD,kBAAA9R,KAAA4O,MAAA,wBAIA5O,KAAA4O,MAAA,kBAAAA,EAAA,mBACA5O,KAAAgT,aAAAhT,KAAAgT,cAAA,IAAA9S,OAAAC,KAAA8S,aACAjT,KAAAgT,aAAAzR,OAAAvB,KAAA4O,MAAA,iBAAA5O,KAAAH,IAAA,OAGAG,KAAA4O,MAAA,kBAAAA,EAAA,mBACA5O,KAAAkT,aAAAlT,KAAAkT,cAAA,IAAAhT,OAAAC,KAAAgT,aACAnT,KAAAkT,aAAA3R,OAAAvB,KAAA4O,MAAA,iBAAA5O,KAAAH,IAAA,OAGAG,KAAA4O,MAAA,oBAAAA,EAAA,qBACA5O,KAAAoT,UAAApT,KAAAoT,WAAA,IAAAlT,OAAAC,KAAAkT,eACArT,KAAAoT,UAAA7R,OAAAvB,KAAA4O,MAAA,mBAAA5O,KAAAH,IAAA,QAIAmS,WAAA,SAAAmC,GACAnU,KAAAuS,cAAA,WAAA,KAAA,CAAAxE,SAAAoG,EAAAC,OAAApM,MAAAgG,UAAAmG,EAAAC,OAAAnM,MAAA+G,SAAAmF,EAAAC,OAAAC,YAGAlC,gBAAA,WACAnS,KAAAuS,cAAA,kBAGAH,gBAAA,WACA,IAAAlI,EAAAlK,KAAAH,IAAAsK,YACAnK,KAAA+R,IAAA,WAAA7H,EAAAlC,OACAhI,KAAA+R,IAAA,YAAA7H,EAAAjC,OACAjI,KAAAuS,cAAA,kBAGAF,iBAAA,WACArS,KAAA+R,IAAA,UAAA/R,KAAAH,IAAAsC,gBACAnC,KAAAuS,cAAA,mBAGAD,cAAA,WACAtS,KAAA+R,IAAA,OAAA/R,KAAAH,IAAA4B,WACAzB,KAAAuS,cAAA,gBAGA+B,cAAA,SAAAtP,GACAhF,KAAAuS,cAAA,cAAA,KAAA,CAAAzD,GAAA9J,EAAA8J,MAGAyF,wBAAA,SAAAvP,GACAhF,KAAAuS,cAAA,wBAAA,KAAA,CAAAzD,GAAA9J,EAAA8J,GAAAf,SAAA/I,EAAAgK,SAAAhH,MAAAgG,UAAAhJ,EAAAgK,SAAA/G,MAAA+G,SAAAhK,EAAAgK,SAAAqF,YAGAtB,QAAA,SAAAzE,GACAA,IACAtO,KAAA6Q,aAAAvC,GACAtO,KAAAH,IAAAoL,UAAAjL,KAAA6Q,aAAAvC,IAEAtO,KAAAiR,SAAA8B,QAAA,CAAAzE,QAAAtO,KAAA4O,MAAAN,SAAA,SAAAkG,EAAAC,GACA,MAAAA,GACAzU,KAAA6Q,aAAAvC,GAAAkG,EAAA,GAAAE,SAAAC,SACA3U,KAAAH,IAAAoL,UAAAjL,KAAA6Q,aAAAvC,IACA0C,aAAAH,aAAAC,KAAAwC,UAAAtT,KAAA6Q,eAEA+D,QAAAC,KAAA,wDAAAJ,IAEAxC,KAAAjS,SAKAyP,eAAA,SAAAzK,EAAA8P,GACA9U,KAAAmR,WAAA4D,WAAAD,GACA9U,KAAAmR,WAAA6D,KAAAhV,KAAAH,IAAAmF,IAGA6F,QAAA,SAAApG,GACA,MAAA,iBAAAA,GAAA,KAAAA,EAAA0C,OAAA,GACA1C,EAEAwB,SAAAxB,EAAA,IAAA,MAIAmO,eAAA,WACA,IAAAqC,EAAA3J,SAAA4J,cAAA,mCACA,OAAAD,GAAAA,EAAAE,IACAF,EAAAE,IAAAC,QAAA,oBAAA,YAEA,0FAGAC,mBAAA,SAAApB,GACA,OAAAA,EAAAqB,eACA,IAAA,SAAA,OAAA,EACA,IAAA,OAAA,OAAA,EAGA,OAAA,MAGAvG,WAAA,SAAAD,GACA,OAAA9O,KAAAiF,QAAAsQ,MAAA,SAAAvQ,GACA,OAAAA,EAAA8J,IAAAA,MAIA5J,WAAA,SAAAyL,GACA,IAAA,IAAAjM,EAAA,EAAAA,EAAA1E,KAAAwV,SAAAjT,OAAAmC,IAAA,CACA,IAAA+Q,EAAAzV,KAAAwV,SAAA9Q,GAEA+Q,aAAA9H,IAAAC,UAAA,wBACA6H,EAAAzQ,OAAAhF,KAAA0G,UAAA,CACAgP,QAAA,EACA5G,GAAA2G,EAAAhI,KACAM,UAAA0H,EAAA7G,MAAAb,SACAC,WAAAyH,EAAA7G,MAAAZ,UACAM,QAAAmH,EAAA7G,MAAAN,QACAuF,MAAA4B,EAAA7G,MAAAiF,MACAC,WAAA2B,EAAA7G,MAAA,eACAmF,MAAA0B,EAAA7G,MAAAmF,MACAvE,KAAAiG,EAAA7G,MAAAY,KACAtB,KAAAuH,EAAA7G,MAAAV,KACA8F,MAAAyB,EAAA7G,MAAAoF,MACAC,UAAAwB,EAAA7G,MAAAqF,UACAC,YAAAuB,EAAA7G,MAAAsF,eAMAxN,UAAA,SAAA/F,GACA,IAAAqE,EAAA,IAAA9E,OAAAC,KAAAwV,OAAA,CACAD,OAAA/U,EAAA+U,SAAA,EACA1G,SAAA,CAAAhH,KAAArH,EAAAoN,SAAA9F,KAAAtH,EAAAqN,WACA6F,MAAAlT,EAAAkT,MACAE,MAAApT,EAAAoT,MACA6B,KAAA5V,KAAA6V,YAAAlV,EAAAuN,MACAgG,UAAAvT,EAAAuT,YA4DA,OAzDAvT,EAAAmO,KACA9J,EAAA8J,GAAAnO,EAAAmO,IAGAnO,EAAAqT,OACAhP,EAAA8Q,QAAAnV,EAAAqT,OAGArT,EAAAkT,OAAAlT,EAAAmT,YACA9O,EAAA+Q,SAAA,CACAC,MAAArV,EAAAmT,WACA5N,KAAAvF,EAAAkT,QAIAlT,EAAA6O,OACAxK,EAAAwK,KAAA7O,EAAA6O,KACAxK,EAAApD,YAAA,QAAA5B,KAAAyP,eAAAwC,KAAAjS,KAAAgF,EAAArE,EAAA6O,QAGA7O,EAAAsT,WACAjP,EAAAoK,aAAApP,KAAAqV,mBAAA1U,EAAAsT,YAGAtT,EAAAoN,UAAApN,EAAAqN,YACArN,EAAA2N,QACAtO,KAAA6Q,aAAAlQ,EAAA2N,SACAtJ,EAAAiR,YAAAjW,KAAA6Q,aAAAlQ,EAAA2N,UAEAtO,KAAAiR,SAAA8B,QAAA,CAAAzE,QAAA3N,EAAA2N,SAAA,SAAAkG,EAAAC,GACA,MAAAA,GACAzU,KAAA6Q,aAAAlQ,EAAA2N,SAAAkG,EAAA,GAAAE,SAAAC,SACA3P,EAAAiR,YAAAjW,KAAA6Q,aAAAlQ,EAAA2N,UACAtJ,EAAAkR,YAAA,GACAlF,aAAAH,aAAAC,KAAAwC,UAAAtT,KAAA6Q,eAEA+D,QAAAC,KAAA,wDAAAJ,IAEAxC,KAAAjS,OAKAgF,EAAAkR,YAAA,IAIAlW,KAAAH,MAAAG,KAAA4O,MAAA,oBACA5J,EAAAzD,OAAAvB,KAAAH,KAIAmF,EAAApD,YAAA,QAAA5B,KAAAsU,cAAArC,KAAAjS,KAAAgF,IACAA,EAAApD,YAAA,mBAAA5B,KAAAuU,wBAAAtC,KAAAjS,KAAAgF,IAEAhF,KAAAiF,QAAAN,KAAAK,GAEAA,GAGA0K,iBAAA,WACA1P,KAAAuD,SACAvD,KAAAuD,QAAAuF,eAGA9I,KAAAiF,QAAAjF,KAAAiF,QAAAkR,QAAA,SAAAnR,GACA,QAAAA,EAAA0Q,SACAxV,OAAAC,KAAAwB,MAAAyU,uBAAApR,GACAA,EAAAzD,OAAA,OACA,OAOA8P,eAAA,WACA,IAAAgF,EAAA,oCACAC,EAAA,yDAEAtW,KAAA6V,YAAA,CACAU,MAAAF,EAAA,mBACAG,KAAAH,EAAA,kBACAI,OAAAJ,EAAA,oBACAK,MAAAL,EAAA,mBACAM,OAAAN,EAAA,oBACAO,OAAAP,EAAA,oBACAQ,MAAAR,EAAA,mBACAS,MAAAT,EAAA,eACAU,IAAAV,EAAA,aACAW,MAAAX,EAAA,YACAY,KAAAX,EAAA,WACAY,QAAAZ,EAAA,cACAa,IAAAb,EAAA,UACAc,WAAAd,EAAA,iBACAe,gBAAAf,EAAA,sBACAgB,iBAAAhB,EAAA,uBACAiB,MAAAjB,EAAA,YACAkB,SAAAlB,EAAA,eACAmB,QAAAnB,EAAA,cACAoB,OAAApB,EAAA,aACAqB,WAAArB,EAAA,qBC1qBA3I,IAAAC,UAAA,qBAAA,CAEAK,WAAA,CACAF,SAAA,CACAG,KAAAE,OACAC,QAAA,MAGAL,UAAA,CACAE,KAAAE,OACAC,QAAA,MAGAC,QAAA,CACAJ,KAAAC,OACAE,QAAA,MAGAwF,MAAA,CACA3F,KAAAC,OACAE,QAAA,MAGA,cAAA,CACAH,KAAAC,OACAE,QAAA,MAGA0F,MAAA,CACA7F,KAAAC,OACAE,QAAA,MAGAmB,KAAA,CACAtB,KAAAC,OACAE,QAAA,MAGAH,KAAA,CACAA,KAAAC,OACAE,QAAA,MAGA2F,MAAA,CACA9F,KAAAC,OACAE,QAAA,MAGA4F,UAAA,CACA/F,KAAAC,OACAE,QAAA,MAGA6F,UAAA,CACAhG,KAAAM,QACAH,SAAA,IAIA2B,OAAA,SAAApB,GACA5O,KAAA4O,MAAAb,UAAAa,EAAAb,UAAA/N,KAAA4O,MAAAZ,WAAAY,EAAAZ,YACAhO,KAAAgF,OAAAiR,YAAA,CAAAjO,KAAAhI,KAAA4O,MAAAb,SAAA9F,KAAAjI,KAAA4O,MAAAZ,YACAhO,KAAAgF,OAAAkR,YAAA,IAGAlW,KAAA4O,MAAAN,SAAAM,EAAAN,UACAtO,KAAA4T,OAAA/C,aAAA7Q,KAAA4O,MAAAN,SACAtO,KAAAgF,OAAAiR,YAAAjW,KAAA4T,OAAA/C,aAAA7Q,KAAA4O,MAAAN,UAEAtO,KAAA4T,OAAA3C,SAAA8B,QAAA,CAAAzE,QAAAtO,KAAA4O,MAAAN,SAAA,SAAAkG,EAAAC,GACA,MAAAA,GACAzU,KAAA4T,OAAA/C,aAAA7Q,KAAA4O,MAAAN,SAAAkG,EAAA,GAAAE,SAAAC,SACA3U,KAAAgF,OAAAiR,YAAAjW,KAAA4T,OAAA/C,aAAA7Q,KAAA4O,MAAAN,UACAtO,KAAAgF,OAAAkR,YAAA,GACAlF,aAAAH,aAAAC,KAAAwC,UAAAtT,KAAA4T,OAAA/C,eAEA+D,QAAAC,KAAA,wDAAAJ,IAEAxC,KAAAjS,QAIAA,KAAA4O,MAAAiF,OAAAjF,EAAAiF,OAAA7T,KAAA4O,MAAA,gBAAAA,EAAA,gBACA5O,KAAAgF,OAAA+Q,SAAA,CACAC,MAAAhW,KAAA4O,MAAA,eACA1I,KAAAlG,KAAA4O,MAAAiF,QAIA7T,KAAA4O,MAAAmF,OAAAnF,EAAAmF,OACA/T,KAAAgF,OAAA4S,SAAA5X,KAAA4O,MAAAmF,OAGA/T,KAAA4O,MAAAY,MAAAZ,EAAAY,OACAxP,KAAAgF,OAAAmM,WAAA,IAAAjR,OAAAC,KAAAgR,WAAA,CACA2D,QAAA9U,KAAA4O,MAAAY,QAIAxP,KAAA4O,MAAAV,MAAAU,EAAAV,MACAlO,KAAAgF,OAAA8Q,QAAA9V,KAAA4T,OAAAiC,YAAA7V,KAAA4O,MAAAV,OAGAlO,KAAA4O,MAAAoF,OAAApF,EAAAoF,OACAhU,KAAAgF,OAAA8Q,QAAA9V,KAAA4O,MAAAoF,OAGAhU,KAAA4O,MAAAqF,WAAArF,EAAAqF,WACAjU,KAAAgF,OAAAoK,aAAApP,KAAA4T,OAAAyB,mBAAArV,KAAA4O,MAAAqF,YAGAjU,KAAA4O,MAAAsF,WAAAtF,EAAAsF,WACAlU,KAAAgF,OAAA6S,aAAA7X,KAAA4O,MAAAsF","file":"../dmxGoogleMaps/dmxGoogleMaps.js","sourcesContent":["// ==ClosureCompiler==\n// @compilation_level ADVANCED_OPTIMIZATIONS\n// @externs_url http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/maps/google_maps_api_v3_3.js\n// ==/ClosureCompiler==\n\n/**\n * @name MarkerClusterer for Google Maps v3\n * @version version 1.0.1\n * @author Luke Mahe\n * @fileoverview\n * The library creates and manages per-zoom-level clusters for large amounts of\n * markers.\n *
\n * This is a v3 implementation of the\n * v2 MarkerClusterer.\n */\n\n/**\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/**\n * A Marker Clusterer that clusters markers.\n *\n * @param {google.maps.Map} map The Google map to attach to.\n * @param {Array.=} opt_markers Optional markers to add to\n * the cluster.\n * @param {Object=} opt_options support the following options:\n * 'gridSize': (number) The grid size of a cluster in pixels.\n * 'maxZoom': (number) The maximum zoom level that a marker can be part of a\n * cluster.\n * 'zoomOnClick': (boolean) Whether the default behaviour of clicking on a\n * cluster is to zoom into it.\n * 'imagePath': (string) The base URL where the images representing\n * clusters will be found. The full URL will be:\n * {imagePath}[1-5].{imageExtension}\n * Default: '../images/m'.\n * 'imageExtension': (string) The suffix for images URL representing\n * clusters will be found. See _imagePath_ for details.\n * Default: 'png'.\n * 'averageCenter': (boolean) Whether the center of each cluster should be\n * the average of all markers in the cluster.\n * 'minimumClusterSize': (number) The minimum number of markers to be in a\n * cluster before the markers are hidden and a count\n * is shown.\n * 'styles': (object) An object that has style properties:\n * 'url': (string) The image url.\n * 'height': (number) The image height.\n * 'width': (number) The image width.\n * 'anchor': (Array) The anchor position of the label text.\n * 'textColor': (string) The text color.\n * 'textSize': (number) The text size.\n * 'backgroundPosition': (string) The position of the backgound x, y.\n * @constructor\n * @extends google.maps.OverlayView\n */\nfunction MarkerClusterer(map, opt_markers, opt_options) {\n // MarkerClusterer implements google.maps.OverlayView interface. We use the\n // extend function to extend MarkerClusterer with google.maps.OverlayView\n // because it might not always be available when the code is defined so we\n // look for it at the last possible moment. If it doesn't exist now then\n // there is no point going ahead :)\n this.extend(MarkerClusterer, google.maps.OverlayView);\n this.map_ = map;\n\n /**\n * @type {Array.}\n * @private\n */\n this.markers_ = [];\n\n /**\n * @type {Array.}\n */\n this.clusters_ = [];\n\n this.sizes = [53, 56, 66, 78, 90];\n\n /**\n * @private\n */\n this.styles_ = [];\n\n /**\n * @type {boolean}\n * @private\n */\n this.ready_ = false;\n\n var options = opt_options || {};\n\n /**\n * @type {number}\n * @private\n */\n this.gridSize_ = options['gridSize'] || 60;\n\n /**\n * @private\n */\n this.minClusterSize_ = options['minimumClusterSize'] || 2;\n\n\n /**\n * @type {?number}\n * @private\n */\n this.maxZoom_ = options['maxZoom'] || null;\n\n this.styles_ = options['styles'] || [];\n\n /**\n * @type {string}\n * @private\n */\n this.imagePath_ = options['imagePath'] ||\n this.MARKER_CLUSTER_IMAGE_PATH_;\n\n /**\n * @type {string}\n * @private\n */\n this.imageExtension_ = options['imageExtension'] ||\n this.MARKER_CLUSTER_IMAGE_EXTENSION_;\n\n /**\n * @type {boolean}\n * @private\n */\n this.zoomOnClick_ = true;\n\n if (options['zoomOnClick'] != undefined) {\n this.zoomOnClick_ = options['zoomOnClick'];\n }\n\n /**\n * @type {boolean}\n * @private\n */\n this.averageCenter_ = false;\n\n if (options['averageCenter'] != undefined) {\n this.averageCenter_ = options['averageCenter'];\n }\n\n this.setupStyles_();\n\n this.setMap(map);\n\n /**\n * @type {number}\n * @private\n */\n this.prevZoom_ = this.map_.getZoom();\n\n // Add the map event listeners\n var that = this;\n google.maps.event.addListener(this.map_, 'zoom_changed', function() {\n // Determines map type and prevent illegal zoom levels\n var zoom = that.map_.getZoom();\n var minZoom = that.map_.minZoom || 0;\n var maxZoom = Math.min(that.map_.maxZoom || 100,\n that.map_.mapTypes[that.map_.getMapTypeId()].maxZoom);\n zoom = Math.min(Math.max(zoom,minZoom),maxZoom);\n\n if (that.prevZoom_ != zoom) {\n that.prevZoom_ = zoom;\n that.resetViewport();\n }\n });\n\n google.maps.event.addListener(this.map_, 'idle', function() {\n that.redraw();\n });\n\n // Finally, add the markers\n if (opt_markers && (opt_markers.length || Object.keys(opt_markers).length)) {\n this.addMarkers(opt_markers, false);\n }\n}\n\n\n/**\n * The marker cluster image path.\n *\n * @type {string}\n * @private\n */\nMarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PATH_ = '../images/m';\n\n\n/**\n * The marker cluster image path.\n *\n * @type {string}\n * @private\n */\nMarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_EXTENSION_ = 'png';\n\n\n/**\n * Extends a objects prototype by anothers.\n *\n * @param {Object} obj1 The object to be extended.\n * @param {Object} obj2 The object to extend with.\n * @return {Object} The new extended object.\n * @ignore\n */\nMarkerClusterer.prototype.extend = function(obj1, obj2) {\n return (function(object) {\n for (var property in object.prototype) {\n this.prototype[property] = object.prototype[property];\n }\n return this;\n }).apply(obj1, [obj2]);\n};\n\n\n/**\n * Implementaion of the interface method.\n * @ignore\n */\nMarkerClusterer.prototype.onAdd = function() {\n this.setReady_(true);\n};\n\n/**\n * Implementaion of the interface method.\n * @ignore\n */\nMarkerClusterer.prototype.draw = function() {};\n\n/**\n * Sets up the styles object.\n *\n * @private\n */\nMarkerClusterer.prototype.setupStyles_ = function() {\n if (this.styles_.length) {\n return;\n }\n\n for (var i = 0, size; size = this.sizes[i]; i++) {\n this.styles_.push({\n url: this.imagePath_ + (i + 1) + '.' + this.imageExtension_,\n height: size,\n width: size\n });\n }\n};\n\n/**\n * Fit the map to the bounds of the markers in the clusterer.\n */\nMarkerClusterer.prototype.fitMapToMarkers = function() {\n var markers = this.getMarkers();\n var bounds = new google.maps.LatLngBounds();\n for (var i = 0, marker; marker = markers[i]; i++) {\n bounds.extend(marker.getPosition());\n }\n\n this.map_.fitBounds(bounds);\n};\n\n\n/**\n * Sets the styles.\n *\n * @param {Object} styles The style to set.\n */\nMarkerClusterer.prototype.setStyles = function(styles) {\n this.styles_ = styles;\n};\n\n\n/**\n * Gets the styles.\n *\n * @return {Object} The styles object.\n */\nMarkerClusterer.prototype.getStyles = function() {\n return this.styles_;\n};\n\n\n/**\n * Whether zoom on click is set.\n *\n * @return {boolean} True if zoomOnClick_ is set.\n */\nMarkerClusterer.prototype.isZoomOnClick = function() {\n return this.zoomOnClick_;\n};\n\n/**\n * Whether average center is set.\n *\n * @return {boolean} True if averageCenter_ is set.\n */\nMarkerClusterer.prototype.isAverageCenter = function() {\n return this.averageCenter_;\n};\n\n\n/**\n * Returns the array of markers in the clusterer.\n *\n * @return {Array.} The markers.\n */\nMarkerClusterer.prototype.getMarkers = function() {\n return this.markers_;\n};\n\n\n/**\n * Returns the number of markers in the clusterer\n *\n * @return {Number} The number of markers.\n */\nMarkerClusterer.prototype.getTotalMarkers = function() {\n return this.markers_.length;\n};\n\n\n/**\n * Sets the max zoom for the clusterer.\n *\n * @param {number} maxZoom The max zoom level.\n */\nMarkerClusterer.prototype.setMaxZoom = function(maxZoom) {\n this.maxZoom_ = maxZoom;\n};\n\n\n/**\n * Gets the max zoom for the clusterer.\n *\n * @return {number} The max zoom level.\n */\nMarkerClusterer.prototype.getMaxZoom = function() {\n return this.maxZoom_;\n};\n\n\n/**\n * The function for calculating the cluster icon image.\n *\n * @param {Array.} markers The markers in the clusterer.\n * @param {number} numStyles The number of styles available.\n * @return {Object} A object properties: 'text' (string) and 'index' (number).\n * @private\n */\nMarkerClusterer.prototype.calculator_ = function(markers, numStyles) {\n var index = 0;\n var count = markers.length;\n var dv = count;\n while (dv !== 0) {\n dv = parseInt(dv / 10, 10);\n index++;\n }\n\n index = Math.min(index, numStyles);\n return {\n text: count,\n index: index\n };\n};\n\n\n/**\n * Set the calculator function.\n *\n * @param {function(Array, number)} calculator The function to set as the\n * calculator. The function should return a object properties:\n * 'text' (string) and 'index' (number).\n *\n */\nMarkerClusterer.prototype.setCalculator = function(calculator) {\n this.calculator_ = calculator;\n};\n\n\n/**\n * Get the calculator function.\n *\n * @return {function(Array, number)} the calculator function.\n */\nMarkerClusterer.prototype.getCalculator = function() {\n return this.calculator_;\n};\n\n\n/**\n * Add an array of markers to the clusterer.\n *\n * @param {Array.} markers The markers to add.\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\n */\nMarkerClusterer.prototype.addMarkers = function(markers, opt_nodraw) {\n if (markers.length) {\n for (var i = 0, marker; marker = markers[i]; i++) {\n this.pushMarkerTo_(marker);\n }\n } else if (Object.keys(markers).length) {\n for (var marker in markers) {\n this.pushMarkerTo_(markers[marker]);\n }\n }\n if (!opt_nodraw) {\n this.redraw();\n }\n};\n\n\n/**\n * Pushes a marker to the clusterer.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @private\n */\nMarkerClusterer.prototype.pushMarkerTo_ = function(marker) {\n marker.isAdded = false;\n if (marker['draggable']) {\n // If the marker is draggable add a listener so we update the clusters on\n // the drag end.\n var that = this;\n google.maps.event.addListener(marker, 'dragend', function() {\n marker.isAdded = false;\n that.repaint();\n });\n }\n this.markers_.push(marker);\n};\n\n\n/**\n * Adds a marker to the clusterer and redraws if needed.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @param {boolean=} opt_nodraw Whether to redraw the clusters.\n */\nMarkerClusterer.prototype.addMarker = function(marker, opt_nodraw) {\n this.pushMarkerTo_(marker);\n if (!opt_nodraw) {\n this.redraw();\n }\n};\n\n\n/**\n * Removes a marker and returns true if removed, false if not\n *\n * @param {google.maps.Marker} marker The marker to remove\n * @return {boolean} Whether the marker was removed or not\n * @private\n */\nMarkerClusterer.prototype.removeMarker_ = function(marker) {\n var index = -1;\n if (this.markers_.indexOf) {\n index = this.markers_.indexOf(marker);\n } else {\n for (var i = 0, m; m = this.markers_[i]; i++) {\n if (m == marker) {\n index = i;\n break;\n }\n }\n }\n\n if (index == -1) {\n // Marker is not in our list of markers.\n return false;\n }\n\n marker.setMap(null);\n\n this.markers_.splice(index, 1);\n\n return true;\n};\n\n\n/**\n * Remove a marker from the cluster.\n *\n * @param {google.maps.Marker} marker The marker to remove.\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\n * @return {boolean} True if the marker was removed.\n */\nMarkerClusterer.prototype.removeMarker = function(marker, opt_nodraw) {\n var removed = this.removeMarker_(marker);\n\n if (!opt_nodraw && removed) {\n this.resetViewport();\n this.redraw();\n return true;\n } else {\n return false;\n }\n};\n\n\n/**\n * Removes an array of markers from the cluster.\n *\n * @param {Array.} markers The markers to remove.\n * @param {boolean=} opt_nodraw Optional boolean to force no redraw.\n */\nMarkerClusterer.prototype.removeMarkers = function(markers, opt_nodraw) {\n // create a local copy of markers if required\n // (removeMarker_ modifies the getMarkers() array in place)\n var markersCopy = markers === this.getMarkers() ? markers.slice() : markers;\n var removed = false;\n\n for (var i = 0, marker; marker = markersCopy[i]; i++) {\n var r = this.removeMarker_(marker);\n removed = removed || r;\n }\n\n if (!opt_nodraw && removed) {\n this.resetViewport();\n this.redraw();\n return true;\n }\n};\n\n\n/**\n * Sets the clusterer's ready state.\n *\n * @param {boolean} ready The state.\n * @private\n */\nMarkerClusterer.prototype.setReady_ = function(ready) {\n if (!this.ready_) {\n this.ready_ = ready;\n this.createClusters_();\n }\n};\n\n\n/**\n * Returns the number of clusters in the clusterer.\n *\n * @return {number} The number of clusters.\n */\nMarkerClusterer.prototype.getTotalClusters = function() {\n return this.clusters_.length;\n};\n\n\n/**\n * Returns the google map that the clusterer is associated with.\n *\n * @return {google.maps.Map} The map.\n */\nMarkerClusterer.prototype.getMap = function() {\n return this.map_;\n};\n\n\n/**\n * Sets the google map that the clusterer is associated with.\n *\n * @param {google.maps.Map} map The map.\n */\nMarkerClusterer.prototype.setMap = function(map) {\n this.map_ = map;\n};\n\n\n/**\n * Returns the size of the grid.\n *\n * @return {number} The grid size.\n */\nMarkerClusterer.prototype.getGridSize = function() {\n return this.gridSize_;\n};\n\n\n/**\n * Sets the size of the grid.\n *\n * @param {number} size The grid size.\n */\nMarkerClusterer.prototype.setGridSize = function(size) {\n this.gridSize_ = size;\n};\n\n\n/**\n * Returns the min cluster size.\n *\n * @return {number} The grid size.\n */\nMarkerClusterer.prototype.getMinClusterSize = function() {\n return this.minClusterSize_;\n};\n\n/**\n * Sets the min cluster size.\n *\n * @param {number} size The grid size.\n */\nMarkerClusterer.prototype.setMinClusterSize = function(size) {\n this.minClusterSize_ = size;\n};\n\n\n/**\n * Extends a bounds object by the grid size.\n *\n * @param {google.maps.LatLngBounds} bounds The bounds to extend.\n * @return {google.maps.LatLngBounds} The extended bounds.\n */\nMarkerClusterer.prototype.getExtendedBounds = function(bounds) {\n var projection = this.getProjection();\n\n // Turn the bounds into latlng.\n var tr = new google.maps.LatLng(bounds.getNorthEast().lat(),\n bounds.getNorthEast().lng());\n var bl = new google.maps.LatLng(bounds.getSouthWest().lat(),\n bounds.getSouthWest().lng());\n\n // Convert the points to pixels and the extend out by the grid size.\n var trPix = projection.fromLatLngToDivPixel(tr);\n trPix.x += this.gridSize_;\n trPix.y -= this.gridSize_;\n\n var blPix = projection.fromLatLngToDivPixel(bl);\n blPix.x -= this.gridSize_;\n blPix.y += this.gridSize_;\n\n // Convert the pixel points back to LatLng\n var ne = projection.fromDivPixelToLatLng(trPix);\n var sw = projection.fromDivPixelToLatLng(blPix);\n\n // Extend the bounds to contain the new bounds.\n bounds.extend(ne);\n bounds.extend(sw);\n\n return bounds;\n};\n\n\n/**\n * Determins if a marker is contained in a bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @param {google.maps.LatLngBounds} bounds The bounds to check against.\n * @return {boolean} True if the marker is in the bounds.\n * @private\n */\nMarkerClusterer.prototype.isMarkerInBounds_ = function(marker, bounds) {\n return bounds.contains(marker.getPosition());\n};\n\n\n/**\n * Clears all clusters and markers from the clusterer.\n */\nMarkerClusterer.prototype.clearMarkers = function() {\n this.resetViewport(true);\n\n // Set the markers a empty array.\n this.markers_ = [];\n};\n\n\n/**\n * Clears all existing clusters and recreates them.\n * @param {boolean} opt_hide To also hide the marker.\n */\nMarkerClusterer.prototype.resetViewport = function(opt_hide) {\n // Remove all the clusters\n for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {\n cluster.remove();\n }\n\n // Reset the markers to not be added and to be invisible.\n for (var i = 0, marker; marker = this.markers_[i]; i++) {\n marker.isAdded = false;\n if (opt_hide) {\n marker.setMap(null);\n }\n }\n\n this.clusters_ = [];\n};\n\n/**\n *\n */\nMarkerClusterer.prototype.repaint = function() {\n var oldClusters = this.clusters_.slice();\n this.clusters_.length = 0;\n this.resetViewport();\n this.redraw();\n\n // Remove the old clusters.\n // Do it in a timeout so the other clusters have been drawn first.\n window.setTimeout(function() {\n for (var i = 0, cluster; cluster = oldClusters[i]; i++) {\n cluster.remove();\n }\n }, 0);\n};\n\n\n/**\n * Redraws the clusters.\n */\nMarkerClusterer.prototype.redraw = function() {\n this.createClusters_();\n};\n\n\n/**\n * Calculates the distance between two latlng locations in km.\n * @see http://www.movable-type.co.uk/scripts/latlong.html\n *\n * @param {google.maps.LatLng} p1 The first lat lng point.\n * @param {google.maps.LatLng} p2 The second lat lng point.\n * @return {number} The distance between the two points in km.\n * @private\n*/\nMarkerClusterer.prototype.distanceBetweenPoints_ = function(p1, p2) {\n if (!p1 || !p2) {\n return 0;\n }\n\n var R = 6371; // Radius of the Earth in km\n var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;\n var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;\n var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) *\n Math.sin(dLon / 2) * Math.sin(dLon / 2);\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n var d = R * c;\n return d;\n};\n\n\n/**\n * Add a marker to a cluster, or creates a new cluster.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @private\n */\nMarkerClusterer.prototype.addToClosestCluster_ = function(marker) {\n var distance = 40000; // Some large number\n var clusterToAddTo = null;\n var pos = marker.getPosition();\n for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {\n var center = cluster.getCenter();\n if (center) {\n var d = this.distanceBetweenPoints_(center, marker.getPosition());\n if (d < distance) {\n distance = d;\n clusterToAddTo = cluster;\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker);\n } else {\n var cluster = new Cluster(this);\n cluster.addMarker(marker);\n this.clusters_.push(cluster);\n }\n};\n\n\n/**\n * Creates the clusters.\n *\n * @private\n */\nMarkerClusterer.prototype.createClusters_ = function() {\n if (!this.ready_) {\n return;\n }\n\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n var mapBounds = new google.maps.LatLngBounds(this.map_.getBounds().getSouthWest(),\n this.map_.getBounds().getNorthEast());\n var bounds = this.getExtendedBounds(mapBounds);\n\n for (var i = 0, marker; marker = this.markers_[i]; i++) {\n if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {\n this.addToClosestCluster_(marker);\n }\n }\n};\n\n\n/**\n * A cluster that contains markers.\n *\n * @param {MarkerClusterer} markerClusterer The markerclusterer that this\n * cluster is associated with.\n * @constructor\n * @ignore\n */\nfunction Cluster(markerClusterer) {\n this.markerClusterer_ = markerClusterer;\n this.map_ = markerClusterer.getMap();\n this.gridSize_ = markerClusterer.getGridSize();\n this.minClusterSize_ = markerClusterer.getMinClusterSize();\n this.averageCenter_ = markerClusterer.isAverageCenter();\n this.center_ = null;\n this.markers_ = [];\n this.bounds_ = null;\n this.clusterIcon_ = new ClusterIcon(this, markerClusterer.getStyles(),\n markerClusterer.getGridSize());\n}\n\n/**\n * Determins if a marker is already added to the cluster.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker is already added.\n */\nCluster.prototype.isMarkerAlreadyAdded = function(marker) {\n if (this.markers_.indexOf) {\n return this.markers_.indexOf(marker) != -1;\n } else {\n for (var i = 0, m; m = this.markers_[i]; i++) {\n if (m == marker) {\n return true;\n }\n }\n }\n return false;\n};\n\n\n/**\n * Add a marker the cluster.\n *\n * @param {google.maps.Marker} marker The marker to add.\n * @return {boolean} True if the marker was added.\n */\nCluster.prototype.addMarker = function(marker) {\n if (this.isMarkerAlreadyAdded(marker)) {\n return false;\n }\n\n if (!this.center_) {\n this.center_ = marker.getPosition();\n this.calculateBounds_();\n } else {\n if (this.averageCenter_) {\n var l = this.markers_.length + 1;\n var lat = (this.center_.lat() * (l-1) + marker.getPosition().lat()) / l;\n var lng = (this.center_.lng() * (l-1) + marker.getPosition().lng()) / l;\n this.center_ = new google.maps.LatLng(lat, lng);\n this.calculateBounds_();\n }\n }\n\n marker.isAdded = true;\n this.markers_.push(marker);\n\n var len = this.markers_.length;\n if (len < this.minClusterSize_ && marker.getMap() != this.map_) {\n // Min cluster size not reached so show the marker.\n marker.setMap(this.map_);\n }\n\n if (len == this.minClusterSize_) {\n // Hide the markers that were showing.\n for (var i = 0; i < len; i++) {\n this.markers_[i].setMap(null);\n }\n }\n\n if (len >= this.minClusterSize_) {\n marker.setMap(null);\n }\n\n this.updateIcon();\n return true;\n};\n\n\n/**\n * Returns the marker clusterer that the cluster is associated with.\n *\n * @return {MarkerClusterer} The associated marker clusterer.\n */\nCluster.prototype.getMarkerClusterer = function() {\n return this.markerClusterer_;\n};\n\n\n/**\n * Returns the bounds of the cluster.\n *\n * @return {google.maps.LatLngBounds} the cluster bounds.\n */\nCluster.prototype.getBounds = function() {\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n var markers = this.getMarkers();\n for (var i = 0, marker; marker = markers[i]; i++) {\n bounds.extend(marker.getPosition());\n }\n return bounds;\n};\n\n\n/**\n * Removes the cluster\n */\nCluster.prototype.remove = function() {\n this.clusterIcon_.remove();\n this.markers_.length = 0;\n delete this.markers_;\n};\n\n\n/**\n * Returns the number of markers in the cluster.\n *\n * @return {number} The number of markers in the cluster.\n */\nCluster.prototype.getSize = function() {\n return this.markers_.length;\n};\n\n\n/**\n * Returns a list of the markers in the cluster.\n *\n * @return {Array.} The markers in the cluster.\n */\nCluster.prototype.getMarkers = function() {\n return this.markers_;\n};\n\n\n/**\n * Returns the center of the cluster.\n *\n * @return {google.maps.LatLng} The cluster center.\n */\nCluster.prototype.getCenter = function() {\n return this.center_;\n};\n\n\n/**\n * Calculated the extended bounds of the cluster with the grid.\n *\n * @private\n */\nCluster.prototype.calculateBounds_ = function() {\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\n this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);\n};\n\n\n/**\n * Determines if a marker lies in the clusters bounds.\n *\n * @param {google.maps.Marker} marker The marker to check.\n * @return {boolean} True if the marker lies in the bounds.\n */\nCluster.prototype.isMarkerInClusterBounds = function(marker) {\n return this.bounds_.contains(marker.getPosition());\n};\n\n\n/**\n * Returns the map that the cluster is associated with.\n *\n * @return {google.maps.Map} The map.\n */\nCluster.prototype.getMap = function() {\n return this.map_;\n};\n\n\n/**\n * Updates the cluster icon\n */\nCluster.prototype.updateIcon = function() {\n var zoom = this.map_.getZoom();\n var mz = this.markerClusterer_.getMaxZoom();\n\n if (mz && zoom > mz) {\n // The zoom is greater than our max zoom so show all the markers in cluster.\n for (var i = 0, marker; marker = this.markers_[i]; i++) {\n marker.setMap(this.map_);\n }\n return;\n }\n\n if (this.markers_.length < this.minClusterSize_) {\n // Min cluster size not yet reached.\n this.clusterIcon_.hide();\n return;\n }\n\n var numStyles = this.markerClusterer_.getStyles().length;\n var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);\n this.clusterIcon_.setCenter(this.center_);\n this.clusterIcon_.setSums(sums);\n this.clusterIcon_.show();\n};\n\n\n/**\n * A cluster icon\n *\n * @param {Cluster} cluster The cluster to be associated with.\n * @param {Object} styles An object that has style properties:\n * 'url': (string) The image url.\n * 'height': (number) The image height.\n * 'width': (number) The image width.\n * 'anchor': (Array) The anchor position of the label text.\n * 'textColor': (string) The text color.\n * 'textSize': (number) The text size.\n * 'backgroundPosition: (string) The background postition x, y.\n * @param {number=} opt_padding Optional padding to apply to the cluster icon.\n * @constructor\n * @extends google.maps.OverlayView\n * @ignore\n */\nfunction ClusterIcon(cluster, styles, opt_padding) {\n cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);\n\n this.styles_ = styles;\n this.padding_ = opt_padding || 0;\n this.cluster_ = cluster;\n this.center_ = null;\n this.map_ = cluster.getMap();\n this.div_ = null;\n this.sums_ = null;\n this.visible_ = false;\n\n this.setMap(this.map_);\n}\n\n\n/**\n * Triggers the clusterclick event and zoom's if the option is set.\n */\nClusterIcon.prototype.triggerClusterClick = function() {\n var markerClusterer = this.cluster_.getMarkerClusterer();\n\n // Trigger the clusterclick event.\n google.maps.event.trigger(markerClusterer.map_, 'clusterclick', this.cluster_);\n\n if (markerClusterer.isZoomOnClick()) {\n // Zoom into the cluster.\n this.map_.fitBounds(this.cluster_.getBounds());\n }\n};\n\n\n/**\n * Adding the cluster icon to the dom.\n * @ignore\n */\nClusterIcon.prototype.onAdd = function() {\n this.div_ = document.createElement('DIV');\n if (this.visible_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.cssText = this.createCss(pos);\n this.div_.innerHTML = this.sums_.text;\n }\n\n var panes = this.getPanes();\n panes.overlayMouseTarget.appendChild(this.div_);\n\n var that = this;\n google.maps.event.addDomListener(this.div_, 'click', function() {\n that.triggerClusterClick();\n });\n};\n\n\n/**\n * Returns the position to place the div dending on the latlng.\n *\n * @param {google.maps.LatLng} latlng The position in latlng.\n * @return {google.maps.Point} The position in pixels.\n * @private\n */\nClusterIcon.prototype.getPosFromLatLng_ = function(latlng) {\n var pos = this.getProjection().fromLatLngToDivPixel(latlng);\n pos.x -= parseInt(this.width_ / 2, 10);\n pos.y -= parseInt(this.height_ / 2, 10);\n return pos;\n};\n\n\n/**\n * Draw the icon.\n * @ignore\n */\nClusterIcon.prototype.draw = function() {\n if (this.visible_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.top = pos.y + 'px';\n this.div_.style.left = pos.x + 'px';\n }\n};\n\n\n/**\n * Hide the icon.\n */\nClusterIcon.prototype.hide = function() {\n if (this.div_) {\n this.div_.style.display = 'none';\n }\n this.visible_ = false;\n};\n\n\n/**\n * Position and show the icon.\n */\nClusterIcon.prototype.show = function() {\n if (this.div_) {\n var pos = this.getPosFromLatLng_(this.center_);\n this.div_.style.cssText = this.createCss(pos);\n this.div_.style.display = '';\n }\n this.visible_ = true;\n};\n\n\n/**\n * Remove the icon from the map\n */\nClusterIcon.prototype.remove = function() {\n this.setMap(null);\n};\n\n\n/**\n * Implementation of the onRemove interface.\n * @ignore\n */\nClusterIcon.prototype.onRemove = function() {\n if (this.div_ && this.div_.parentNode) {\n this.hide();\n this.div_.parentNode.removeChild(this.div_);\n this.div_ = null;\n }\n};\n\n\n/**\n * Set the sums of the icon.\n *\n * @param {Object} sums The sums containing:\n * 'text': (string) The text to display in the icon.\n * 'index': (number) The style index of the icon.\n */\nClusterIcon.prototype.setSums = function(sums) {\n this.sums_ = sums;\n this.text_ = sums.text;\n this.index_ = sums.index;\n if (this.div_) {\n this.div_.innerHTML = sums.text;\n }\n\n this.useStyle();\n};\n\n\n/**\n * Sets the icon to the the styles.\n */\nClusterIcon.prototype.useStyle = function() {\n var index = Math.max(0, this.sums_.index - 1);\n index = Math.min(this.styles_.length - 1, index);\n var style = this.styles_[index];\n this.url_ = style['url'];\n this.height_ = style['height'];\n this.width_ = style['width'];\n this.textColor_ = style['textColor'];\n this.anchor_ = style['anchor'];\n this.textSize_ = style['textSize'];\n this.backgroundPosition_ = style['backgroundPosition'];\n};\n\n\n/**\n * Sets the center of the icon.\n *\n * @param {google.maps.LatLng} center The latlng to set as the center.\n */\nClusterIcon.prototype.setCenter = function(center) {\n this.center_ = center;\n};\n\n\n/**\n * Create the css text based on the position of the icon.\n *\n * @param {google.maps.Point} pos The position.\n * @return {string} The css style text.\n */\nClusterIcon.prototype.createCss = function(pos) {\n var style = [];\n style.push('background-image:url(' + this.url_ + ');');\n var backgroundPosition = this.backgroundPosition_ ? this.backgroundPosition_ : '0 0';\n style.push('background-position:' + backgroundPosition + ';');\n\n if (typeof this.anchor_ === 'object') {\n if (typeof this.anchor_[0] === 'number' && this.anchor_[0] > 0 &&\n this.anchor_[0] < this.height_) {\n style.push('height:' + (this.height_ - this.anchor_[0]) +\n 'px; padding-top:' + this.anchor_[0] + 'px;');\n } else {\n style.push('height:' + this.height_ + 'px; line-height:' + this.height_ +\n 'px;');\n }\n if (typeof this.anchor_[1] === 'number' && this.anchor_[1] > 0 &&\n this.anchor_[1] < this.width_) {\n style.push('width:' + (this.width_ - this.anchor_[1]) +\n 'px; padding-left:' + this.anchor_[1] + 'px;');\n } else {\n style.push('width:' + this.width_ + 'px; text-align:center;');\n }\n } else {\n style.push('height:' + this.height_ + 'px; line-height:' +\n this.height_ + 'px; width:' + this.width_ + 'px; text-align:center;');\n }\n\n var txtColor = this.textColor_ ? this.textColor_ : 'black';\n var txtSize = this.textSize_ ? this.textSize_ : 11;\n\n style.push('cursor:pointer; top:' + pos.y + 'px; left:' +\n pos.x + 'px; color:' + txtColor + '; position:absolute; font-size:' +\n txtSize + 'px; font-family:Arial,sans-serif; font-weight:bold');\n return style.join('');\n};\n\n\n// Export Symbols for Closure\n// If you are not going to compile with closure then you can remove the\n// code below.\nwindow['MarkerClusterer'] = MarkerClusterer;\nMarkerClusterer.prototype['addMarker'] = MarkerClusterer.prototype.addMarker;\nMarkerClusterer.prototype['addMarkers'] = MarkerClusterer.prototype.addMarkers;\nMarkerClusterer.prototype['clearMarkers'] =\n MarkerClusterer.prototype.clearMarkers;\nMarkerClusterer.prototype['fitMapToMarkers'] =\n MarkerClusterer.prototype.fitMapToMarkers;\nMarkerClusterer.prototype['getCalculator'] =\n MarkerClusterer.prototype.getCalculator;\nMarkerClusterer.prototype['getGridSize'] =\n MarkerClusterer.prototype.getGridSize;\nMarkerClusterer.prototype['getExtendedBounds'] =\n MarkerClusterer.prototype.getExtendedBounds;\nMarkerClusterer.prototype['getMap'] = MarkerClusterer.prototype.getMap;\nMarkerClusterer.prototype['getMarkers'] = MarkerClusterer.prototype.getMarkers;\nMarkerClusterer.prototype['getMaxZoom'] = MarkerClusterer.prototype.getMaxZoom;\nMarkerClusterer.prototype['getStyles'] = MarkerClusterer.prototype.getStyles;\nMarkerClusterer.prototype['getTotalClusters'] =\n MarkerClusterer.prototype.getTotalClusters;\nMarkerClusterer.prototype['getTotalMarkers'] =\n MarkerClusterer.prototype.getTotalMarkers;\nMarkerClusterer.prototype['redraw'] = MarkerClusterer.prototype.redraw;\nMarkerClusterer.prototype['removeMarker'] =\n MarkerClusterer.prototype.removeMarker;\nMarkerClusterer.prototype['removeMarkers'] =\n MarkerClusterer.prototype.removeMarkers;\nMarkerClusterer.prototype['resetViewport'] =\n MarkerClusterer.prototype.resetViewport;\nMarkerClusterer.prototype['repaint'] =\n MarkerClusterer.prototype.repaint;\nMarkerClusterer.prototype['setCalculator'] =\n MarkerClusterer.prototype.setCalculator;\nMarkerClusterer.prototype['setGridSize'] =\n MarkerClusterer.prototype.setGridSize;\nMarkerClusterer.prototype['setMaxZoom'] =\n MarkerClusterer.prototype.setMaxZoom;\nMarkerClusterer.prototype['onAdd'] = MarkerClusterer.prototype.onAdd;\nMarkerClusterer.prototype['draw'] = MarkerClusterer.prototype.draw;\n\nCluster.prototype['getCenter'] = Cluster.prototype.getCenter;\nCluster.prototype['getSize'] = Cluster.prototype.getSize;\nCluster.prototype['getMarkers'] = Cluster.prototype.getMarkers;\n\nClusterIcon.prototype['onAdd'] = ClusterIcon.prototype.onAdd;\nClusterIcon.prototype['draw'] = ClusterIcon.prototype.draw;\nClusterIcon.prototype['onRemove'] = ClusterIcon.prototype.onRemove;\n\nObject.keys = Object.keys || function(o) { \n var result = []; \n for(var name in o) { \n if (o.hasOwnProperty(name)) \n result.push(name); \n } \n return result; \n};\n","dmx.Component('google-maps', {\r\n\r\n initialData: {\r\n zoom: 10,\r\n maptype: 'roadmap',\r\n latitude: null,\r\n longitude: null\r\n },\r\n\r\n attributes: {\r\n width: {\r\n type: [String, Number],\r\n default: '100%'\r\n },\r\n\r\n height: {\r\n type: [String, Number],\r\n default: 400\r\n },\r\n\r\n latitude: {\r\n type: Number,\r\n default: null\r\n },\r\n\r\n longitude: {\r\n type: Number,\r\n default: null\r\n },\r\n\r\n address: {\r\n type: String,\r\n default: null\r\n },\r\n\r\n /*\r\n Zoom Levels\r\n 1: World\r\n 5: Landmass/continent\r\n 10: City\r\n 15: Streets\r\n 20: Buildings\r\n */\r\n zoom: {\r\n type: Number,\r\n default: 10\r\n },\r\n\r\n maptype: {\r\n type: String,\r\n default: 'roadmap' // roadmap, satellite, hybrid, terrain\r\n },\r\n\r\n scrollwheel: {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n tilt: {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n 'rotate-control': {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n 'scale-control': {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n 'fullscreen-control': {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n 'zoom-control': {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n 'streetview-control': {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n 'maptype-control': {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n 'enable-clusters': {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n 'traffic-layer': {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n 'transit-layer': {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n 'bicycling-layer': {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n markers: {\r\n type: Array,\r\n default: null\r\n },\r\n\r\n 'marker-id': {\r\n type: String,\r\n default: 'id'\r\n },\r\n\r\n 'marker-latitude': {\r\n type: String,\r\n default: 'latitude'\r\n },\r\n\r\n 'marker-longitude': {\r\n type: String,\r\n default: 'longitude'\r\n },\r\n\r\n 'marker-address': {\r\n type: String,\r\n default: 'address'\r\n },\r\n\r\n 'marker-label': {\r\n type: String,\r\n default: 'label'\r\n },\r\n\r\n 'marker-label-color': {\r\n type: String,\r\n default: 'label'\r\n },\r\n\r\n 'marker-title': {\r\n type: String,\r\n default: 'title'\r\n },\r\n\r\n 'marker-info': {\r\n type: String,\r\n default: 'info'\r\n },\r\n\r\n 'marker-type': {\r\n type: String,\r\n default: 'type'\r\n },\r\n\r\n 'marker-image': {\r\n type: String,\r\n default: 'type'\r\n },\r\n\r\n 'marker-animation': {\r\n type: String,\r\n default: 'animation' // bounce and drop\r\n },\r\n\r\n 'marker-draggable': {\r\n type: String,\r\n default: 'draggable'\r\n },\r\n\r\n 'cluster-grid-size': {\r\n type: Number,\r\n default: 60\r\n },\r\n\r\n 'cluster-max-zoom': {\r\n type: Number,\r\n default: null\r\n },\r\n\r\n 'min-cluster-size': {\r\n type: Number,\r\n default: 2\r\n }\r\n },\r\n\r\n methods: {\r\n addMarker: function(options) {\r\n var marker = this.addMarker(options);\r\n if (this.cluster && this.props['enable-clusters']) {\r\n this.cluster.addMarker(marker);\r\n } else {\r\n marker.setMap(this.map);\r\n }\r\n },\r\n\r\n goToMarker: function(id) {\r\n var marker = this.findMarker(id);\r\n if (marker) {\r\n this.map.setCenter(marker.position);\r\n }\r\n },\r\n\r\n panToMarker: function(id) {\r\n var marker = this.findMarker(id);\r\n if (marker) {\r\n this.map.panTo(marker.position);\r\n }\r\n },\r\n\r\n bounceMarker: function(id) {\r\n var marker = this.findMarker(id);\r\n if (marker) {\r\n marker.setAnimation(1);\r\n }\r\n },\r\n\r\n fitBoundsToMarkers: function() {\r\n if (this.markers.length) {\r\n var bounds = new google.maps.LatLngBounds();\r\n\r\n for (var i = 0; i < this.markers.length; i++) {\r\n bounds.extend(this.markers[i].getPosition());\r\n }\r\n\r\n this.map.fitBounds(bounds);\r\n }\r\n },\r\n\r\n stopBounce: function(id) {\r\n var marker = this.findMarker(id);\r\n if (marker) {\r\n marker.setAnimation(null);\r\n }\r\n },\r\n\r\n showInfo: function(id) {\r\n var marker = this.findMarker(id);\r\n if (marker && marker.info) {\r\n this.openInfoWindow(marker, marker.info);\r\n }\r\n },\r\n\r\n removeAllMarkers: function() {\r\n this.removeAllMarkers();\r\n },\r\n\r\n panTo: function(latitude, longitude) {\r\n this.map.panTo({ lat: +latitude, lng: +longitude });\r\n },\r\n\r\n setCenter: function(latitude, longitude) {\r\n this.map.setCenter({ lat: +latitude, lng: +longitude });\r\n },\r\n\r\n setMapType: function(maptype) {\r\n this.map.setMapTypeId(maptype);\r\n },\r\n\r\n setZoom: function(zoom) {\r\n this.map.setZoom(zoom);\r\n },\r\n\r\n refresh: function() {\r\n google.maps.event.trigger(this.map, 'resize');\r\n },\r\n\r\n reload: function() {\r\n this.update({});\r\n }\r\n },\r\n\r\n events: {\r\n ready: Event,\r\n boundschanged: Event,\r\n centerchanged: Event,\r\n maptypechanged: Event,\r\n zoomchanged: Event,\r\n mapclick: Event,\r\n markerclick: Event,\r\n markerpositionchanged: Event\r\n },\r\n\r\n render: function(node) {\r\n this.$parse();\r\n\r\n node.style.display = 'block';\r\n node.style.width = this.getSize(this.props.width);\r\n node.style.height = this.getSize(this.props.height);\r\n\r\n this.geocodeCache = JSON.parse(localStorage.geocodeCache || '{}');\r\n this.geocoder = new google.maps.Geocoder();\r\n this.infoWindow = new google.maps.InfoWindow();\r\n\r\n this.markers = [];\r\n this.getMarkerTypes();\r\n\r\n this.map = new google.maps.Map(node, {\r\n zoom: +this.props.zoom,\r\n center: { lat: +this.props.latitude, lng: +this.props.longitude },\r\n mapTypeId: this.props.maptype,\r\n scrollwheel: this.props.scrollwheel,\r\n scaleControl: this.props['scale-control'],\r\n zoomControl: this.props['zoom-control'],\r\n panControl: this.props['pan-control'],\r\n streetViewControl: this.props['streetview-control'],\r\n mapTypeControl: this.props['maptype-control'],\r\n rotateControl: this.props['rotate-control'],\r\n fullscreenControl: this.props['fullscreen-control']\r\n });\r\n\r\n this.set('latitude', +this.props.latitude);\r\n this.set('longitude', +this.props.longitude);\r\n this.set('maptype', this.map.getMapTypeId());\r\n this.set('zoom', this.map.getZoom());\r\n\r\n this.map.addListener('click', this.onMapClick.bind(this));\r\n this.map.addListener('bounds_changed', dmx.debounce(this.onBoundsChanged.bind(this), 100));\r\n this.map.addListener('center_changed', dmx.debounce(this.onCenterChanged.bind(this), 100));\r\n this.map.addListener('maptypeid_changed', dmx.debounce(this.onMaptypeChanged.bind(this), 100));\r\n this.map.addListener('zoom_changed', dmx.debounce(this.onZoomChanged.bind(this), 100));\r\n setTimeout(this.dispatchEvent.bind(this, 'ready'), 100);\r\n\r\n if (window.googleMapsTheme) {\r\n this.map.setOptions({ styles: window.googleMapsTheme });\r\n }\r\n\r\n if (this.props.tilt) {\r\n this.map.setTilt(45);\r\n }\r\n\r\n this.getMarkers();\r\n\r\n if (this.props['enable-clusters']) {\r\n this.cluster = new MarkerClusterer(this.map, this.markers, {\r\n imagePath: this.getImageFolder(),\r\n gridSize: this.props['cluster-grid-size'],\r\n minimumClusterSize: this.props['min-cluster-size'],\r\n maxZoom: this.props['cluster-max-zoom']\r\n });\r\n }\r\n\r\n if (!(this.props.latitude && this.props.longitude) && this.props.address) {\r\n this.geocode(this.props.address);\r\n }\r\n\r\n if (this.props['traffic-layer']) {\r\n this.trafficLayer = new google.maps.TrafficLayer();\r\n this.trafficLayer.setMap(this.map);\r\n }\r\n\r\n if (this.props['transit-layer']) {\r\n this.transitLayer = new google.maps.TransitLayer();\r\n this.transitLayer.setMap(this.map);\r\n }\r\n\r\n if (this.props['bicycling-layer']) {\r\n this.bikeLayer = new google.maps.BicyclingLayer();\r\n this.bikeLayer.setMap(this.map);\r\n }\r\n },\r\n\r\n update: function(props) {\r\n if (this.props.latitude != props.latitude || this.props.longitude != props.longitude) {\r\n this.map.setCenter({ lat: +this.props.latitude, lng: +this.props.longitude });\r\n }\r\n\r\n if (this.props.address && this.props.address != props.address) {\r\n this.geocode(this.props.address);\r\n }\r\n\r\n if (this.props.zoom != props.zoom) {\r\n this.map.setZoom(+this.props.zoom);\r\n }\r\n\r\n if (this.props.maptype != props.maptype) {\r\n this.map.setMapTypeId(this.props.maptype);\r\n }\r\n\r\n if (this.props.tilt != props.tilt) {\r\n this.map.setTilt(this.props.tilt ? 45 : 0);\r\n }\r\n\r\n if (JSON.stringify(this.props.markers) != JSON.stringify(props.markers)) {\r\n this.removeAllMarkers();\r\n\r\n var markers = dmx.repeatItems(this.props.markers);\r\n\r\n if (Array.isArray(markers)) {\r\n markers.forEach(function(marker) {\r\n // Normally the current component is the parent scope\r\n // in this case we take the parent since it causes some\r\n // problems when latitude/longitude is missing from the\r\n // marker, it then uses the latitude/longitude from the\r\n // map which it shouldn't\r\n var scope = new dmx.DataScope(marker, this.parent);\r\n this.addMarker({\r\n id: dmx.parse(this.props['marker-id'], scope),\r\n latitude: +dmx.parse(this.props['marker-latitude'], scope),\r\n longitude: +dmx.parse(this.props['marker-longitude'], scope),\r\n address: dmx.parse(this.props['marker-address'], scope),\r\n label: dmx.parse(this.props['marker-label'], scope),\r\n labelColor: dmx.parse(this.props['marker-label-color'], scope),\r\n title: dmx.parse(this.props['marker-title'], scope),\r\n info: dmx.parse(this.props['marker-info'], scope),\r\n type: dmx.parse(this.props['marker-type'], scope),\r\n image: dmx.parse(this.props['marker-image'], scope),\r\n animation: dmx.parse(this.props['marker-animation'], scope),\r\n draggable: !!dmx.parse(this.props['marker-draggable'], scope)\r\n });\r\n }, this);\r\n\r\n if (this.props['enable-clusters']) {\r\n this.cluster = new MarkerClusterer(this.map, this.markers, {\r\n imagePath: this.getImageFolder(),\r\n gridSize: this.props['cluster-grid-size'],\r\n minimumClusterSize: this.props['min-cluster-size'],\r\n maxZoom: this.props['cluster-max-zoom']\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (JSON.stringify(this.props) != JSON.stringify(props)) {\r\n this.map.setOptions({\r\n scrollwheel: this.props.scrollwheel,\r\n scaleControl: this.props['scale-control'],\r\n zoomControl: this.props['zoom-control'],\r\n panControl: this.props['pan-control'],\r\n streetViewControl: this.props['streetview-control'],\r\n mapTypeControl: this.props['maptype-control'],\r\n rotateControl: this.props['rotate-control'],\r\n fullscreenControl: this.props['fullscreen-control']\r\n });\r\n }\r\n\r\n if (this.props['traffic-layer'] != props['traffic-layer']) {\r\n this.trafficLayer = this.trafficLayer || new google.maps.TrafficLayer();\r\n this.trafficLayer.setMap(this.props['traffic-layer'] ? this.map : null);\r\n }\r\n\r\n if (this.props['transit-layer'] != props['transit-layer']) {\r\n this.transitLayer = this.transitLayer || new google.maps.TransitLayer();\r\n this.transitLayer.setMap(this.props['transit-layer'] ? this.map : null);\r\n }\r\n\r\n if (this.props['bicycling-layer'] != props['bicycling-layer']) {\r\n this.bikeLayer = this.bikeLayer || new google.maps.BicyclingLayer();\r\n this.bikeLayer.setMap(this.props['bicycling-layer'] ? this.map : null);\r\n }\r\n },\r\n\r\n onMapClick: function(e) {\r\n this.dispatchEvent('mapclick', null, { latitude: e.latLng.lat(), longitude: e.latLng.lng(), position: e.latLng.toJSON() });\r\n },\r\n\r\n onBoundsChanged: function() {\r\n this.dispatchEvent('boundschanged');\r\n },\r\n\r\n onCenterChanged: function() {\r\n var center = this.map.getCenter();\r\n this.set('latitude', center.lat());\r\n this.set('longitude', center.lng());\r\n this.dispatchEvent('centerchanged');\r\n },\r\n\r\n onMaptypeChanged: function() {\r\n this.set('maptype', this.map.getMapTypeId());\r\n this.dispatchEvent('maptypechanged');\r\n },\r\n\r\n onZoomChanged: function() {\r\n this.set('zoom', this.map.getZoom());\r\n this.dispatchEvent('zoomchanged');\r\n },\r\n\r\n onMarkerClick: function(marker) {\r\n this.dispatchEvent('markerclick', null, { id: marker.id });\r\n },\r\n\r\n onMarkerPositionChanged: function(marker) {\r\n this.dispatchEvent('markerpositionchanged', null, { id: marker.id, latitude: marker.position.lat(), longitude: marker.position.lng(), position: marker.position.toJSON() });\r\n },\r\n\r\n geocode: function(address) {\r\n if (address) {\r\n if (this.geocodeCache[address]) {\r\n this.map.setCenter(this.geocodeCache[address]);\r\n } else {\r\n this.geocoder.geocode({ address: this.props.address }, function(results, status) {\r\n if (status == 'OK') {\r\n this.geocodeCache[address] = results[0].geometry.location;\r\n this.map.setCenter(this.geocodeCache[address]);\r\n localStorage.geocodeCache = JSON.stringify(this.geocodeCache);\r\n } else {\r\n console.warn('Geocode was not successful for the following reason: ' + status)\r\n }\r\n }.bind(this));\r\n }\r\n }\r\n },\r\n\r\n openInfoWindow: function(marker, content) {\r\n this.infoWindow.setContent(content);\r\n this.infoWindow.open(this.map, marker);\r\n },\r\n\r\n getSize: function(size) {\r\n if (typeof size == 'string' && size.slice(-1) == '%') {\r\n return size;\r\n } else {\r\n return parseInt(size, 10) + 'px';\r\n }\r\n },\r\n\r\n getImageFolder: function() {\r\n var script = document.querySelector('script[src$=\"dmxGoogleMaps.js\"]');\r\n if (script && script.src) {\r\n return script.src.replace(/dmxGoogleMaps.js$/, 'images/m');\r\n }\r\n return 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m';\r\n },\r\n\r\n getMarkerAnimation: function(animation) {\r\n switch (animation.toLowerCase()) {\r\n case 'bounce': return 1;\r\n case 'drop': return 2;\r\n }\r\n\r\n return null;\r\n },\r\n\r\n findMarker: function(id) {\r\n return this.markers.find(function(marker) {\r\n return marker.id == id;\r\n });\r\n },\r\n\r\n getMarkers: function(node) {\r\n for (var i = 0; i < this.children.length; i++) {\r\n var child = this.children[i];\r\n\r\n if (child instanceof dmx.Component('google-maps-marker')) {\r\n child.marker = this.addMarker({\r\n static: true,\r\n id: child.name,\r\n latitude: +child.props.latitude,\r\n longitude: +child.props.longitude,\r\n address: child.props.address,\r\n label: child.props.label,\r\n labelColor: child.props['label-color'],\r\n title: child.props.title,\r\n info: child.props.info,\r\n type: child.props.type,\r\n image: child.props.image,\r\n animation: child.props.animation,\r\n draggable: !!child.props.draggable\r\n });\r\n }\r\n }\r\n },\r\n\r\n addMarker: function(options) {\r\n var marker = new google.maps.Marker({\r\n static: options.static || false,\r\n position: { lat: +options.latitude, lng: +options.longitude },\r\n label: options.label,\r\n title: options.title,\r\n icon: this.markerTypes[options.type],\r\n draggable: options.draggable\r\n });\r\n\r\n if (options.id) {\r\n marker.id = options.id;\r\n }\r\n\r\n if (options.image) {\r\n marker.setIcon(options.image);\r\n }\r\n\r\n if (options.label && options.labelColor) {\r\n marker.setLabel({\r\n color: options.labelColor,\r\n text: options.label\r\n });\r\n }\r\n\r\n if (options.info) {\r\n marker.info = options.info;\r\n marker.addListener('click', this.openInfoWindow.bind(this, marker, options.info));\r\n }\r\n\r\n if (options.animation) {\r\n marker.setAnimation(this.getMarkerAnimation(options.animation));\r\n }\r\n\r\n if (!(options.latitude && options.longitude)) {\r\n if (options.address) {\r\n if (this.geocodeCache[options.address]) {\r\n marker.setPosition(this.geocodeCache[options.address]);\r\n } else {\r\n this.geocoder.geocode({ address: options.address }, function(results, status) {\r\n if (status == 'OK') {\r\n this.geocodeCache[options.address] = results[0].geometry.location;\r\n marker.setPosition(this.geocodeCache[options.address]);\r\n marker.setVisible(true);\r\n localStorage.geocodeCache = JSON.stringify(this.geocodeCache);\r\n } else {\r\n console.warn('Geocode was not successful for the following reason: ' + status)\r\n }\r\n }.bind(this));\r\n }\r\n } else {\r\n // Do not add?\r\n //return marker;\r\n marker.setVisible(false);\r\n }\r\n }\r\n\r\n if (this.map && !this.props['enable-clusters']) {\r\n marker.setMap(this.map);\r\n }\r\n\r\n // events\r\n marker.addListener('click', this.onMarkerClick.bind(this, marker));\r\n marker.addListener('position_changed', this.onMarkerPositionChanged.bind(this, marker));\r\n\r\n this.markers.push(marker);\r\n\r\n return marker;\r\n },\r\n\r\n removeAllMarkers: function() {\r\n if (this.cluster) {\r\n this.cluster.clearMarkers();\r\n }\r\n\r\n this.markers = this.markers.filter(function(marker) {\r\n if (!marker.static) {\r\n google.maps.event.clearInstanceListeners(marker);\r\n marker.setMap(null);\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n },\r\n\r\n getMarkerTypes: function() {\r\n var markerUrl = 'https://maps.google.com/mapfiles/';\r\n var iconsUrl = 'https://maps.google.com/intl/en_us/mapfiles/ms/micons/';\r\n\r\n this.markerTypes = {\r\n black: markerUrl + 'marker_black.png',\r\n grey: markerUrl + 'marker_grey.png',\r\n orange: markerUrl + 'marker_orange.png',\r\n white: markerUrl + 'marker_white.png',\r\n yellow: markerUrl + 'marker_yellow.png',\r\n purple: markerUrl + 'marker_purple.png',\r\n green: markerUrl + 'marker_green.png',\r\n start: markerUrl + 'dd-start.png',\r\n end: markerUrl + 'dd-end.png',\r\n arrow: markerUrl + 'arrow.png',\r\n tree: iconsUrl + 'tree.png',\r\n lodging: iconsUrl + 'lodging.png',\r\n bar: iconsUrl + 'bar.png',\r\n restaurant: iconsUrl + 'restaurant.png',\r\n horsebackriding: iconsUrl + 'horsebackriding.png',\r\n convienancestore: iconsUrl + 'convienancestore.png',\r\n hiker: iconsUrl + 'hiker.png',\r\n swimming: iconsUrl + 'swimming.png',\r\n fishing: iconsUrl + 'fishing.png',\r\n golfer: iconsUrl + 'golfer.png',\r\n sportvenue: iconsUrl + 'sportvenue.png'\r\n }\r\n }\r\n\r\n});\r\n","dmx.Component('google-maps-marker', {\r\n\r\n attributes: {\r\n latitude: {\r\n type: Number,\r\n default: null\r\n },\r\n\r\n longitude: {\r\n type: Number,\r\n default: null\r\n },\r\n\r\n address: {\r\n type: String,\r\n default: null\r\n },\r\n\r\n label: {\r\n type: String,\r\n default: null\r\n },\r\n\r\n 'label-color': {\r\n type: String,\r\n default: null\r\n },\r\n\r\n title: {\r\n type: String,\r\n default: null\r\n },\r\n\r\n info: {\r\n type: String,\r\n default: null\r\n },\r\n\r\n type: {\r\n type: String,\r\n default: null\r\n },\r\n\r\n image: {\r\n type: String,\r\n default: null\r\n },\r\n\r\n animation: {\r\n type: String,\r\n default: null\r\n },\r\n\r\n draggable: {\r\n type: Boolean,\r\n default: false\r\n }\r\n },\r\n\r\n update: function(props) {\r\n if (this.props.latitude != props.latitude || this.props.longitude != props.longitude) {\r\n this.marker.setPosition({ lat: +this.props.latitude, lng: +this.props.longitude });\r\n this.marker.setVisible(true);\r\n }\r\n\r\n if (this.props.address != props.address) {\r\n if (this.parent.geocodeCache[this.props.address]) {\r\n this.marker.setPosition(this.parent.geocodeCache[this.props.address]);\r\n } else {\r\n this.parent.geocoder.geocode({ address: this.props.address }, function(results, status) {\r\n if (status == 'OK') {\r\n this.parent.geocodeCache[this.props.address] = results[0].geometry.location;\r\n this.marker.setPosition(this.parent.geocodeCache[this.props.address]);\r\n this.marker.setVisible(true);\r\n localStorage.geocodeCache = JSON.stringify(this.parent.geocodeCache);\r\n } else {\r\n console.warn('Geocode was not successful for the following reason: ' + status)\r\n }\r\n }.bind(this));\r\n }\r\n }\r\n\r\n if (this.props.label != props.label || this.props['label-color'] != props['label-color']) {\r\n this.marker.setLabel({\r\n color: this.props['label-color'],\r\n text: this.props.label\r\n });\r\n }\r\n\r\n if (this.props.title != props.title) {\r\n this.marker.setTitle(this.props.title);\r\n }\r\n\r\n if (this.props.info != props.info) {\r\n this.marker.infoWindow = new google.maps.infoWindow({\r\n content: this.props.info\r\n });\r\n }\r\n\r\n if (this.props.type != props.type) {\r\n this.marker.setIcon(this.parent.markerTypes[this.props.type]);\r\n }\r\n\r\n if (this.props.image != props.image) {\r\n this.marker.setIcon(this.props.image);\r\n }\r\n\r\n if (this.props.animation != props.animation) {\r\n this.marker.setAnimation(this.parent.getMarkerAnimation(this.props.animation));\r\n }\r\n\r\n if (this.props.draggable != props.draggable) {\r\n this.marker.setDraggable(this.props.draggable);\r\n }\r\n }\r\n\r\n});\r\n"]}