@rsltda/components 1.0.17 → 1.0.18
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":"rs-components.iife.js","sources":["../src/utils/define.ts","../src/pin/gasgas.png?url","../src/pin/gasgas_distribuidor.png?url","../src/pin/hqv.png?url","../src/pin/hqv_distribuidor.png?url","../src/pin/ktm.png?url","../src/pin/ktm_distribuidor.png?url","../src/pin/rs.png?url","../src/pin/rs_distribuidor.png?url","../src/pin/voge.png?url","../src/pin/voge_distribuidor.png?url","../src/components/rs-map.ts","../src/ws/gear.svg?raw","../src/ws/motorcycle.svg?raw","../src/components/rs-whatsapp.ts","../src/index.ts"],"sourcesContent":["// Registro seguro para evitar DOMException por doble definición\r\nexport function safeDefine(tag: string, Ctor: CustomElementConstructor) {\r\n if (!customElements.get(tag)) customElements.define(tag, Ctor);\r\n}\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAByVJREFUeNrUW11sFFUUPrvbsluhu21aqrZbaampQKPyJyIx2FIggURpkSi+CItCYtTUGqLUBEvTmGhCtAg+iPJT4MFEDO2LaFugvhRbNO0LUAnImv4gQukvwrYUPefune223dK5s/fObk9zM9vZO7Nzvvud35mxgEnS4MxOwM18HLk4XPxzsPzCt/U4Wpb1Xeox47osipXOwE0Bjk0hFJ5MCIhKHFUqwbAoVLwUx2YJpyPlq3AUqwDCooDmpPh7CnAl5fcgCLuiEgBUnih+AkeGYrNtwVGIQHhlnMwqSXmi+hkTlAfuS5o54JFnAFf+EJgvZBJ5yISWiAEQQeWlgWAJ0+abIfJCICww6hOsBpVP4DYfDZLAna95DEAATvAER0ge3bYBElfnQ4wzXtf8fy/+AZeLyvWevgJZUKwcAFQ+18jqP1VzDKY/+4ww2O3ln0Lbbt1uJlPUFGIMEKBU9IDM8qKA8sP9/XDrh2ro+qlO17F3/2oX+SlCKk8ZA4yu/uLzZyDWncqUb16UD0PXe1X6BCEWiDKgSPRqnMtymPIk1yq+YsrHzUuHJ2tOgC0+XrYJaAz1SAeAe35hx5fy6vrA55s/+mk/a/u7THlixN0LreOOccybEwBHO0ZACpQAwOt48Ri1cgXb3m48B3cutEHswy5wrvbvu3HoKFzduWfUfPp+8aUm9vkORgE6RvQnyVTRDOpl5wEviF4JUV2j/43jVWybvG5VYHVdq/JZdKBBpqJ9r0nXccPhPVcFA4SLj+S1K0foX13r/8GgHCBu7hNsO9TeCXeu+L095QljTcaAPC09CiCtunnWpUyIMfPP1gXo37L0JcMlM5rAAtkMEFaeMj9Hepru+UnrR3zs9YNHwi2ZlSVCusW1dAkkvrxO+LhuTJSu7T9uSiGhFIArJZ9AFm6ncUc4mdzr64fumlOmKS/qA/6DKSToAyymMWCsrfc0NEH3ybOQsnE1TM+ZC10n66Cv4Tykb/dAjMs5EuZwv+OxNDZHk9vnL8I/39UEjtXONdFvhCs2vRPfsCdRp9cRKtXNrtwPw0jfezdvjiQ0KS62fwYWQbFxDhgeHIDZe3ePmmd12GH2l6P33fcNgtVugce/2QfO5c9DLALma/eyc9GSDnZ0+ouktg64e3nCQqnngK/rM9kMaAmVYFCqSylt/69N4N65w5/0HD4G6R/vYKEsBpMeAuFWTR1PflawQdJbe5ptg48lB5hW9HYgFNLc9s/3sf+potSqSmLAJNcqnQG5ocKL+/1tEDMzGWKdTgRiAGLxsyMrkyc4HWDD/ZQN2lNmwhCuHg0L/tkwIbLZ7f4tMkE7dhrS3IL/U41gwe9pX/yi+TD451V2rDbv+oEj4Gu7MdHlViEDfpbtBMkEvhi7P3HNc5CwbMm4+Zrdk4kkrVkJ93r7Rtk/reAw7qPvAlGAz9H8ACVGj7y2PuSxk9i/B53gYdkAREsTVGpPwCoQVsiuvFNA+RaRhohoV7hqCgBQKTLZqvLkERKhRTLSFW42UhqTQ9MaIjMWzhvnOMmxUQOUnF6wULwXSI3pWYJCJYlQUDj0ibTGSGHX8oUw9/tKsFqHYFb5R5D84lq4j8kP5Q/+vsAccH9YDPZEFySsysf43zqqPhj4/YLen3sLw5+QnxJOhSm8IAuo8ZihR/mc6qOs8dG6cTPMKi1hhVHrK5sgGzO9zq2VYMPwRqusJUeUM8QH3T+gPEKnePW2wWTUAuQLSvUoH6Ay0ltrgFLsv7T1HcjYVQKD7Z2sZKYMsHXLBwA0tCwT64Gsr/fqvTtUprQaHOMHEnhOkDHZymstr4HGc6N6A9Tutqe7WZpMwFCjlNrmwS2xaWlpYHXFQ5N7sZ7VzzStH0DP6iAIhHjIhn1clhttvI91gqkZOnNDgZ/6aAYkM3LmMEVp9XtrT7GsUbN3TbTjBhs79VySxyCTjT8hwlPNkEWHLShtHUYgSFEalPqS9/dhjUA3Pn0dHWxO6pub/ExAX/D3wSPsO/rMwML9FEEeIPVGbD9sALiEvBtLitIKUncHeEfIikUPdX7pPgA5toe4eZCind9WQk/daX8Y3PI6Uj81cI7fcvImuzdQHI4CMh6RMXSrXJIYuiUukwHaCvREQPkeo55fKgC88CiLAAAeGQ9OynxO8AwYvH9oQMjx5ck4kVXiRRWbSH2PrJNJA4D3C8wwhTJZT4lKNYFwq0Wzqa/CBFSbglTqKwOAZ2UV0U59lQzQKjOvZOqrAFUNADw+eyRSv1DRQiljgExT8Ey5V2YkRgXhHl/UMEBCra7E65sOAE+QjITGQjNenTODAcA9uEjToiycJkfUAaCtqM6yuV72m2FRAQCnc6EOuy80cVFMZYAWGh9UMOWZ9cpsRADgIOyawB8Uh/sG2JQAIMgfeMfE+4pIXEhEABjjD7xmxPuoFHrvUNYboEblfwEGAG2z94z2Sp1xAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABXFJREFUeNrUW0tsE0cY/u0aBC3YRtCSQBCO6COkUkuqAlEuJCggwQEw5EClKsR9obZAidQeWoRIyoGqqtQEEIgL4SWBxCuckJIUzAUoqIp7SVukCkuJUah4ODYvJelj/vHs4KSJ45mdmV3/0mjt9fze+b/5/sfM7nrAkFz1vx4kh0WkVZMWYJ+z5Qo7RkmLVaVuJU2My6PZ6BA5rCNt0xgGTyQIxFHS2nWC4dFo+C7SGhT8HRrfTlqjDiA8GmiOhm/XgCsa30pAaHIlAMR4pPh50kKa3TZGWpgAEVfxZ15FxiPVLxswHlgs6WaAO88AZnwbmBd0iRrChJhjADhovDIQPDZ9vhucFwShQjYmeCWNDzKfd4MEWfA1GgTb2IXdIovIpPxoxAXIhaplZ39q+TyY/+VWmFwyJ2+d/sPH4K9THfl2LxV1BZ+EHbtkjH9l40pYcGifsF6ovEwEAGRmjTYGyM7+pNkBqPjlJ3hh+nT6faDzEtw7cx6GBtJ56T+8eE3kckIsEGXAFzKzP2vtCm58/94DcHtnq854gAyNKGcAi/wPZUZUfuYgBFYsh7/TabhR8i49V3b4e5ixYe2Eutk6+aZFwoAZOhhQLWM80h+NR0l1XOLB0DL+6W9/wD+p1MjU5PfD1IVvjNARSYvoqgSEqGoAlsnS35K7pzPpuui99c9XNpVr/qfzautODsCDji6Zy1az/QSlAEgtPgKVS+hxqO8OD2Yz16/j9H6r4wT9PJxKQ0/dp5kprF3OfxfIANnytg4XkALAvzJjTLLrOZW9gUxAxMD40tLF9HP8qx2Z/lVvwiRWJ0jQn2dPHQBIVX5jBbBcQW3OR5v4Z0n6C02WDzQKBrtsf5+w/8IyHjDRZSTpLyQ+3Rco2vaZsA76/q2PtxhZRGgF4GlPL/y5eSsUfVCft84TkhYTh45QXRMiUgj9CwUkpA7wqGZAcrxAOJav9+0/Qo8lWxroEctfjPAzV9XyPsMDKeg/fo734SvAk+dg+H4qp651PsdYlbtAbLxqsPTbb2Ba5WJ4dP0m+PyZFOcjRrzWsoenOTQq1PQ1TCGru2c9v3O6L9izg6bKbN37F7vostmqFpNXb0Dxh/U0QD7++SY9N0iC5ARjVQ5APFep27f7Oyje/jnN7RjE5m5uoMZjqYtV3azVtbTYsYy3gEFAHpy9QIsfK//jTKPxlm6wagkMJu5w41Enj8lSviP061gnp71TTo+zI/XUODQe5eWG90fU+fi7NcPZNT8ChsYPJhJcFzOHpYvnsHJ8kZXG3H1SaeGx2g2C426CFn9SB1PmzeV+bUnvD238d+4aAT89PutNwL0LnXStMFoX+2AMGbo7wP8b+2f3w9iBv9vdExDdELkNZm5+2BG8s1yhwwVQ2gsgAx4V6ezV+ecOSbs2ANgdmJibjRfdFZa5L9DqYgCExyZ1a8ylwTBOZr9UVEn2zpAbY0Gz1sXQKAYEWU0QKuTZl2YAe1an2UWzH5FVtPt8QDdI7hUqlCiZkBpZZbuPyDS6YPZtjcEWAOzmg5PVYYvdR2S8imYg6YDxSuKQbQBY5eVEQIyoeHBS5XOCl0Hy/qHpwKfaBUwHxKSdtKcNABaMTLhCs6qnRJW6gKHaQBn1dbiAbldQSn1tALDaoMXt1NfJAGtlFldMfR2g6gGA5eeIQuqHdUVUXQxQ6QqRgntlRmFWwD2+sM7xeUG/RGxQP6J7cNoBYAWSTGoMm3h1zgQDgEXwqGDKi5oYmxEArBnNc9kcVf1mmCsAYHQO5+H3YYOTYpQBVmrMtWCqMfXKrCMAMBCaxokHjXa3twoCgKx4EB+V71ucGIgjAIyKB3ET+d6Vgu8dqnoDVFb+E2AAEkYQxr2UiokAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABG5JREFUeNrkW01ME0EUfm0UDxgoqOGgCa1EPWBiBZSDBwsoZxuNeNNe0JuSmBi8ABeBk3BS8EC44V9s4s2D1sQLEW09ikFqwsXESDV4QRN8L51Kf2bbnd2Z2dn4kkmbne523jff996b2d0AaLKtAQjhRxRbDFsj+15sr9lnClsm8BByOsYVUOx0GD/OYbvMcbiWERDz2JIqwQgodHwE2xUJlyPnk9iGVAARUEBzcvyGAlzJ+WkEYdRIANB5ovgzbGHFss1giyMQWRkXC0pynqj+SoPzwGJJmgHuPQOY83Og30gSPciEjGcAeOi8NBACLjWfBu+NQDjuNCYEHTofYpo3wUIs+GoNgnPsj02xKE7KXS0SwD+KGTT75RYRlYITBoyAuTanlAGGz74jFogy4DqYbyNKGMAi/7rIxb/8wBN+S4x0e+2lRWRAk91r7hD4/5jogDteAnzflON8F7r0tt9eWiSpIggp2QCcFhnwz18Aw4f5fSvYd3+18vi1CEBbPf+cMy1CeMXYfoJUACwXH7exEH1XtlI/uw/gZnteBoNF9WInCqmprvIazXjs3sn896cYwmbLwliknkngD8ClxUppPT4B0LAN3jEVEohazfT4x8rjk0fzjpDzBRkMHAC4g8f3PK/8/cX9285fWKzsv3UoD6aVrBpKmWN7VSqSBbiV3ywn4bTtBni0lnekMNjhIwALp9DBNb4DVw9aO18rpvS32GerGwZwbXy58tj6ZikrnnQDnA9XB2xlo7rzfW+s+0hunmyI0IzxZsQq8pNcXnzl91Vzvma2CXkEwMSyvd9RHCD9TnyyyAob7ljY2+IBAJlvAEucsogCHY8RROGZVXv5XqSP5ONGyCIAlCS6mc/8YLTQzR8ozXKtoohiRZcFnalGmGy3rf+cCgAyxVrmFTKD4fxskCPNdWIzUQiUSzl+H9UI7zl9naHqY5WZBf7F74ZdAOk+61q9tREH22t/HdC0M38O2YMO6z4CuLwijGoE4EPxWbUWJjToVskLHip2ovWCY5UogRT4x1LSAWBbz1kfOJ9RuSGS9AEA8yrrgHkfAJBUBgCTQcZk53XsCk8bDIDw2BzdGtsagFXQcydYxLI4+xFdawETY8GYk5OcMoDqr7RBLHA0+44ZwJ7VGTNo9hNOT3T7fACxIOqx8ymckB5PNkTQhgyYfVdjcAUAu/ngZXU45fYRmaAk/eU8cF5KHHINgIcBMSHjwUmZzwnSbfOYHwKfbAnoDog5N2lPGQAsGOmQwpisp0SlSkBTbSCN+iokoFoKUqmvDABWG0yZTn1lElC0WJJOfZUSKNQGCYnUj6uKqEFVF5YohYTvXpmRmBVojy+ucnxBUG8JF9RPqB6ccgBYgeQkNcZ1vDqngwEEAsWClGDKS2kZm66lG0uNtJtc64EWZSnPMwYUpca4Dd3HQaMFdf4Zo3W1BVOPrldmPQGAgTBqEQ+G3G5v+QKAQoSH0lvtSRYo4b8AoCweZHXkeyON3juU9QaoU/srwAB77Uga7jO8tAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hJREFUeNrkWv91sjAUTXv6v+0EuoFsIJ2gdgM2KE4gTsBxAusE6ATRCdAJaCdAJ+DLTX2U9tNWKCSB3HPeIUgE7s19+QHcMHW4F+GIcEX0TuUitqftRsROxIF1AAMRvohYRFYyuAjvJFwriS8qkD4X6elcrRACNxnWRPycEIHJ5JHTSUPkixGfHGYUvFMLZYoiPdOJaiWfaQgjRNBF3ggRHM3kiyIMdPT2qSECUMeoFJFB5ClCVeRdA8lTKEkFbrAA3ObWV+KCqAUCLMoQuqnQ85cbLu4/1jCHw8fq1nEc9vb2JrfngGMI13VlnMNms5FxAbjQQxOtP67SIlEUZYvFQpYFoQzAfhzH2SWMx+PsJwRB8Nt13SYEKLXKA0kiikA5SRJJLk3TzPO8//4ThmFOEMB+xTQItPb+IEtAq4s0kKQBYX0ZJMJgMJB1EHALOYDqX3LIL/cQNSFAei15EAE5AATpdzgA5LFPIvi+/4Us5zw/FwlDQalRrKNyZngVedgdhBAgXHQEEaU+gVoa5KhPOJcaFHDSlQJkygUAKSJebE2y9Xfgd+Q6iEMoOAVbcsUfO8GsiWHw4knFzTMhwOfj3e2W9Xq9fKjDsPb+/p4f7/f78j/AbreTQ+V6vZb1ptMp2+/3X+rgfLSP+vP5XNatg9tdHdagcXs2m7HRaJSP+SCGMsitVqvP3pTz/NhyuWQiFSQ57GP7/Pws64AsiQABUT4ej0y4hj081DPU39WZIyBPQpAIaLmnpye5j2Ovr6+yBeEO1Ad5YDgcSlFo4gRMJhN5vDhpgrN+mAQ1KsDhp0fTuKnHx0cm8lOSQGuBIAAHFGdvLy8vOSlKATgEZRCk3+ECAIKhDpwGAa+8V6tWgZVXhbdlUr1FL2Z2TQiwb5EAjdyr06IUaOyZQNIC8qWmwbclBVi1wP5LG94FaH0wGhtMPlJhMc9gAVxVeWZiZ5hUIXJrYkdTETOVF7s3zAWJDsU9G3PfxBGB68w7E16Vaf9KROfrstCE3lfXxxIpM+jbQV+DAGPTxmFuS8ene6Gk5aOoaxEoEMA3fT0e22Z9VXMDo63/HaGN1m9yscRZC+GyDk54dKTCmLUcfxkVItYBODZav461gss6hjJrhYB1ENcumznrMFyb8r7KgslhloC3fapb91Q5YhaC5geJDXl/CZ7uvP8nwAAeipVa4iJE4AAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABIlJREFUeNrkWs11ozAQlnf3bm8H7iD4treQCuKtIKSCcM0p5LgnXiqwOyCpAPu2NzsV4A5wKmD1sR4iE4k/I4HN9948jBlAM5o/jRgxc5hwsjjZnMaH3yLWh+OK05bTnl0AppxcThtOSU0KOTkHxZ2l4IsGQssoPjzrLBSBQfotCS5ThNf2gEctPgs+HRxmX81kWWw6naZHEdvtlu12u/RYAjD85rTr08w7hxmSzt58Pk8Wi0USx3FSBvCA17btMmuw+iS8dKCO4yRRFCVNgXuhvD4rQSo8N/EkDMOkLeBZeGbflGCpZr2KqdcFnqlwi7gs7uiK9rFMeN3AOyRK2JhWQNCF8CVK8E0Jb+dfDtM0CbgDT6MyJRhxhVB86WQyOSnSN8Vms1GVz2Zn3/f9pCt4nmfcCoJ8uusScAVYYE4BC12lMEX+DLxiYzwgFd603/9f1fKBZiUvSmFVyYtroNVqxdbrtZTn+vqa8biT/n5+fmbcEo5eyemnjtmf582tSr5HJUcZAgUNZQxFEEspCILChRFMX6wWJTy2DgX4+fq+LFWRoCD8hstAOJgt6v08XNfNBMQR51UgUaanPfoXBT8xT2PWRV9F9AaREjCD4AFR3U9KKrKQkmAY6FDAUeWnqvUhPK3+wEcpkiwAwlMag5BQpCisWFOQYojINfJ1h8RltFSGpf5PJg+BQJQlyCJIUIoJNNMQjsxY5hpi1JcpgGJLjvQqQCY8CS7Opmo5i/9huhAcioKl4EhWUTUIEpoqYFRTAZ8nyecpOjn39/ef1RJPUUh/lOootYn8IOoQgff29jblQVrDfyIPnkfnuPbw8HD0vFSQ0aiRbD9a6YAe8jbyMY7j8TirAZD/IRyf8Yz/5uYmu3Z3d8fe3t5S4XCOI3eNlIcUQe8gntlsxrg7fKk1mqCxAjCY/CxAeNDT01NW+IAPAuIchQ0Exgy+v7+nvLgG4Pzj4+NIGO4K7PX1Nb0mCktFkNhPNKGAvdiazisAg+LBKDVhDBLXISAAC8B1GvjLy0s26Kurq8wFyB3INWAFABSG/6E8WeUpsYC99jpAFoi6AhVQTVaF3+pYfVtm1zbI0nKt89bhNlkL6IZiLeDosIAval4ul53PPuJJlbG2hegM+gG1yuDvDTY9f4nRFwVIPi2ZwuPjo8z//3D6a2wvoGc9QSON0S97/ajnTQZEvEuxUxSYsDxHtSNkCgXdJGO+GHWhBMx8wWZpZDL+eKqlKpbAOtwBcaaoj1gn97e1NxipBoPAmG9bnQI0SYpaZKZnv/S7ANEaTtkmx70lH0oY9/3SjCAjmC66PFXSJdIbeBVRvvXtsFO/EbLrDgB9ASx16UgLK+ogNWhuzHQtfhpvlRskn/UA0o8lDFDMevTtoNuBAuasZwgNCh+yHsIyaPpT1lN4BhTgsp5jMzTTl9UGgzP9PPwhmn7lxdKlmr4uV+hVwdOFK8zZmeOUrBCwC4A1RNNvY61gswtDnbWCxy4QVZfNIbtg2EPy+yYLJosNBOG5l7ptl8oBGyCoPoiG4PcqOF37/T8BBgCThigH5VpvfwAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABJZJREFUeNrsW79PE1Ec/9ZWfoWDm4yLeOwidZaEDg4mLDiqgx1hsk7oRJmECV10BBZ0McUB49aSYOJgUrAOJg4t8Ae0iAFKgPN966Fce+/uvbt77+6on+RLmvbufd/3+76/7wBoc8Qk8VEJpQiNEkoapDZdUyO0YdAaoYLxXaSBQucI6S4pZ6wRScGLHgRvpnxUFKF6PHEWi1DDGgOSxgY1R/MY6QG1/xIkb/5hv/FVh9ruKRTW91n4VAjdM2JFaJAmVKWdnNqf0DOTffrGepeu18CW8Bq8Fu+xsYSqwTM0wlMFX3ytOApNI7zXQRGBKyFJO/n0A0WvbsddC39GuAauZWMJySADXtlqY15O3c4abJSgBqGAnCzhGZSQCyLPSxWeQQlS64S8lc+LFv6MKDGhLKsOSBkK+BcM+hNQLumg9p1AZacDtrYTtgtcHzgG7dqRa+3Xfsbh1kgCKtv15p+wPliR7vvnTX9+VnGs6DC1lUsdIlwhJyPym5hqA50taQu/c1ICqQY9uwKFD1dGSLgwf3MV9LCD/P1niugG+dU4cYMe24UeP9Uhxpm8ss8UmJ7aM/HOPm9xg3FCi6IsYL5Z4yzlrRWhCzhUeY5ug7wtrp0XaQHJ5uA3fOOQevH7D72wUYrZBsM0Nkaq7sx4SCeB85fpO+SNe6jtHlP36De4/JhyQiYaH+v1FAdwDxbrMiPOqYCsydnGuuHunTr14qtXjiEWU0ibS095338cEQtQoF5PwNbO5RbaJSkP16Fhs9QNn7+07GFGlAuYUwKD6WLQmp6i/772qQdSY3v0oDOr2LoZyx7scCnodnL09n5DSCsQ94DMxJ5Q/glZgmJAfPHqlPLrCZCcbqTUc6lych/CBk/FzPBQt21AXFnulR4EeV2gYBrObZ9w3byyfNJIW9TR0uQhLL1RGv0EKyz2UBCpgIqZeZ1rs9gAVbeOgZxcC5HavpHPM08PiJLYFIu8LRqiikgFrLWc6mqnL7716P4eZCb7iCK6GuU0k0VZ814TGQM0p2bISxnMO1OgNEOa6EBY9GMS1Nw2o0J4hqiUdrgoIxNk/LCC5gjOmwEop5+RoQDNKoWRVtW1K+CDEJ77kBcllWogCXm/8jjvZAh5AP0BqrRSeImWxze/dfGZE8dsENdGHjx7EokqbXDhxhJYTt5mgFJ2K0TcgwK6rUZkh/VTePvuqNEGp0aOfNH0zJwCE09+Ndam4CVvBShkQGqVHQqr7oefeC/DgDWwR2OIBZZ5HjZBmPdZAh5egzneqXE6R1kvAnh9QULj9T8iGAwOxP++HHEGfEmiTBqbzdIB1zMSQoMQ8MtUCyDulRihpy+0MJJAvvh+3AcF1AxXSklW/Byhj2GZFKlg846QACoHGfmZmySBlIaQoixB+DyEGCkJCkhCyCHyTdF5iAA0QQGxGsbAR0O2nQIf8+zwogY+GpI+mr4GEYUfrpCBiKPYbqbvlytE2vT9cIUMXDAU28303RZIkSp4eJFmUMA4XHAsRL3W92N4YhUPitBGaP5fowuV8tzEg8D8PhGgAhYJDRufV+A/gsFvAQYAGFubR/xBobMAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA9xJREFUeNrsWz124jAQHjY5gEtK7wkwJ1hKSvYGvkGcE4Qtt+JxAucGpkxn6NKZdOnMDUyZzqvhmd2gSLJk/dmw33vzSBxjSaOZb37kANw4Ro7GCYjMiPwgEjUSUPcciewb2RHZNtcGDVx0RqTuKFnzjEEuvNBYOC35UBQRaO64jEUEfeWAqJlg2GoesxkEQQBRFJ1+3+/3cDweYbvdyoxzIPKz4YreICZS8XaOLLZOkqQuiqJuA96D9+J3BJZQNWP2ZvHchadpWncFfrdFEd6VEPF2Po7juqqqWhf4DHyWwBIin4RXsiams+siaxAoIfChgMzV4iWUkPmI804XL6EEp3lCzvJ5V+BwQukqD5g1CvhHBiSml2V5+jwcDicRIQzDk3QF5gzT6ZQ1DuYHG+e+/9n0V6tVa0aHoY0ozIYrZC6Y/2JQspNfwhZea1MCyQa1XYEzjlJEuO9g/pdZUHyZi6Ab5Hne6gaPj48wGql54HK5hKenp4ux8RqFBZFnWxawojUuk96ygC7QkuW1ug2Ozbh3ZdMCInq3zwUNC5vNBt7e3oRkeC6M2jCZTL4QJ46N30VS5M3RNJT8mLNDF7JYLLR4AOfAeK407hQVcOFwZPIwn8+5N4/H45Ofi8rc9/f30y5+fHz8DaGfBXcXn8MDWtjr6yt9+ZcTCyAEpM3khDCFFoJhVQScg44FfPPeOyMcQBbJ/BtaWJIkVse/d7VQJMT1ei0kRDqkPjw89K7np5XMENYWmnuWZc5JUKsIorNA3dh/7iCppMmMbDC3qYCUnrRuTk/n9qgE2U4Sjs1QZGqTBHcs3zbSWCT+j4RHFCGVGAnG3tm0gLCtGNJxBdWeAqcYCm0TYWGiE0SXzSqmLyiHCxeRIDFhBTSDq0YAzu4nLhQQshi8S1Z4dgU8CFEBJ/tzYv7cnmDXOK4aRXAM4B+g+j0Nwt3s2h+QAT5bkEc4PyWqeEroYgkyOy9YfAkesBSltSYqRQmfP8vS19GYcGLI1Fju6pTKEg1Wb0djzNSYJVgEYdyXITy8B2N8W+FkavdHBkKikv9hHw9LX7qXiC9JYAcIP1XOSIh8B88vU6Vg75WYXvq+VGLkQIz4/p0BBRwbV5o5VvxvIi996RQFIHhHyIKUPplfukiyKDH0FKWDxefQY8wcKCCCnsPmm6IrGABCS4RY9ZH4OhVK10Z80r3DayU+btpv0PRDGChMuEICA0dxa6ZvyhUGbfomXCGBK0Nxa6bfNUEaVMKjilhCAQu4cqRDz/VNNE9YfFDADYH+X6OrCnld+MCb3997VMAzkUnz8wb+ww/+CDAA4q4zpysTtacAAAAASUVORK5CYII=\"","type ZoneKey = 'norte' | 'rm' | 'centro' | 'sur';\ntype ZoneFilter = ZoneKey | 'all';\n\nconst LOCAL_POINTS_LOADERS = import.meta.glob('../json/PuntosMapas_*.json', {\n import: 'default'\n}) as Record<string, () => Promise<unknown>>;\n\nconst LOCAL_MARKER_ICON_URLS = import.meta.glob('../pin/*.png', {\n eager: true,\n import: 'default',\n query: '?url'\n}) as Record<string, string>;\n\ninterface MapPointPhone {\n id: number;\n dist: number;\n telefono: string;\n nombre: string;\n whatsapp: number;\n watshapp?: number;\n orden: number;\n}\n\ninterface MapPointApi {\n id: number;\n titulo: string;\n rut: string;\n direccion: string;\n comuna: number;\n tipo: number;\n lat: string;\n lng: string;\n url: string;\n email: string;\n adicional: string;\n portada: string;\n googlelink: string;\n activo: number;\n marca: number;\n comuna_name: string;\n provincia_name: string;\n region_name: string;\n telefonos: MapPointPhone[];\n}\n\ninterface MapPoint extends MapPointApi {\n zone: ZoneKey;\n}\n\ninterface MapPosition {\n lat: number;\n lng: number;\n}\n\ninterface PointsCacheEntry {\n timestamp: number;\n data: MapPointApi[];\n}\n\ninterface PointsCacheRecord extends PointsCacheEntry {\n key: string;\n}\n\nconst DEFAULT_BRAND_COLOR = '#000000';\nconst FONT_AWESOME_LOCAL_PATH = '/assets/fontawesome/css/all.min.css';\nconst DEFAULT_POINTS_API_URL = 'https://ap2.rs-shop.cl/web/PuntosMapas';\nconst BRAND_COLORS: Record<string, string> = {\n gasgas: '#cb0d25',\n ktm: '#ff6600'\n};\nconst BRAND_ALIASES: Record<string, string> = {\n gas: 'gasgas',\n gasgas: 'gasgas',\n husqvarna: 'hqv'\n};\nconst TYPE_CODES: Record<string, number> = {\n sucursal: 0,\n distribuidor: 1\n};\nconst ZONE_ORDER: ZoneKey[] = ['norte', 'rm', 'centro', 'sur'];\nconst ZONE_LABELS: Record<ZoneKey, string> = {\n norte: 'Zona Norte',\n rm: 'RM',\n centro: 'Zona Centro',\n sur: 'Zona Sur'\n};\nconst TYPE_LABELS: Record<number, string> = {\n 0: 'Sucursales',\n 1: 'Distribuidores'\n};\nconst CONTINENTAL_CHILE_BOUNDS = {\n minLat: -56.5,\n maxLat: -17,\n minLng: -76,\n maxLng: -66\n};\nconst DEFAULT_POINTS_CACHE_TTL_MS = 30 * 24 * 60 * 60 * 1000;\nconst POINTS_CACHE_DB_NAME = 'rs-map-cache';\nconst POINTS_CACHE_STORE_NAME = 'points';\nconst REGION_ZONE_MAP: Record<string, ZoneKey> = {\n 'region de arica y parinacota': 'norte',\n 'arica y parinacota': 'norte',\n 'region de tarapaca': 'norte',\n tarapaca: 'norte',\n 'region de antofagasta': 'norte',\n antofagasta: 'norte',\n 'region de atacama': 'norte',\n atacama: 'norte',\n 'region de coquimbo': 'norte',\n coquimbo: 'norte',\n 'region de valparaiso': 'centro',\n valparaiso: 'centro',\n 'region del libertador general bernardo o higgins': 'centro',\n \"region del libertador general bernardo o'higgins\": 'centro',\n \"libertador bernardo o'higgins\": 'centro',\n ohiggins: 'centro',\n 'region del maule': 'centro',\n maule: 'centro',\n 'region de nuble': 'centro',\n nuble: 'centro',\n 'region del biobio': 'centro',\n biobio: 'centro',\n 'region metropolitana de santiago': 'rm',\n 'region metropolitana': 'rm',\n 'rm': 'rm',\n santiago: 'rm',\n 'region de la araucania': 'sur',\n araucania: 'sur',\n 'region de los rios': 'sur',\n 'los rios': 'sur',\n 'region de los lagos': 'sur',\n 'los lagos': 'sur',\n 'region de aysen del general carlos ibanez del campo': 'sur',\n 'region de aysen': 'sur',\n aysen: 'sur',\n 'region de magallanes y la antartica chilena': 'sur',\n magallanes: 'sur'\n};\n\nexport class RsMap extends HTMLElement {\n static tag = 'rs-map';\n private static googleMapsLoaderPromise: Promise<void> | null = null;\n private static pointsCacheDbPromise: Promise<IDBDatabase | null> | null = null;\n private root: ShadowRoot;\n private mapEl!: HTMLDivElement;\n private map: any;\n private pointModalOverlayEl!: HTMLElement;\n private pointModalTitleEl!: HTMLElement;\n private pointModalBodyEl!: HTMLElement;\n private pointModalCloseButton!: HTMLButtonElement;\n private markers: any[] = [];\n private marca = '';\n private marcaKey = 'default';\n private tipo = '';\n private tipoCode: number | null = null;\n private pointsController?: AbortController;\n private points: MapPoint[] = [];\n private pointsByZone: Record<ZoneKey, MapPoint[]> = {\n norte: [],\n rm: [],\n centro: [],\n sur: []\n };\n private initialViewApplied = false;\n private zonesContainer!: HTMLElement;\n private componentMessageEl!: HTMLElement;\n private mapLayoutEl!: HTMLElement;\n private zoneButtons: HTMLButtonElement[] = [];\n private nearestButton!: HTMLButtonElement;\n private panelTitleEl!: HTMLElement;\n private activeZone: ZoneFilter = 'all';\n private mapHeight = '';\n private googleMapsApiKey = '';\n private pointsApiUrl = DEFAULT_POINTS_API_URL;\n private markerIconBaseUrl = '';\n private defaultMarkerIconUrl = '';\n private pointsCacheTtlMs = DEFAULT_POINTS_CACHE_TTL_MS;\n private static fontAwesomeAttached = false;\n private panAnimationFrame: number | null = null;\n private highlightTimeout: number | null = null;\n private isSyncingInitialAttributes = false;\n private refreshQueued = false;\n private localPointsRequests = new Map<string, Promise<MapPointApi[] | null>>();\n\n static get observedAttributes() {\n return [\n 'marca',\n 'tipo',\n 'height',\n 'google-maps-key',\n 'points-api-url',\n 'cache-days',\n 'marker-icon-base',\n 'marker-icon-default'\n ];\n }\n\n constructor() {\n super();\n RsMap.ensureFontAwesome();\n this.root = this.attachShadow({ mode: 'open' });\n this.root.innerHTML = `\n <link rel=\"stylesheet\" href=\"${FONT_AWESOME_LOCAL_PATH}\" />\n <style>\n :host {\n display: block;\n position: relative;\n width: 100%;\n height: var(--map-height, 520px);\n --rs-map-accent: ${DEFAULT_BRAND_COLOR};\n }\n .map-layout {\n display: grid;\n grid-template-columns: minmax(0, 2.5fr) minmax(220px, 1fr);\n gap: 16px;\n width: 100%;\n height: 100%;\n }\n .map-panel,\n #map {\n width: 100%;\n height: 100%;\n animation: mapSlide 90s infinite;\n animation-timing-function: ease-in-out; \n }\n .map-panel {\n border-radius: 8px;\n overflow: hidden;\n border: 2px solid var(--rs-map-accent);\n }\n #map {\n background: #f5f5f5;\n }\n .component-shell {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .component-message {\n margin: 0;\n font-size: 1rem;\n color: #555;\n text-align: center;\n padding: 24px 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n .component-message[hidden] {\n display: none;\n }\n .map-layout[hidden] {\n display: none;\n }\n .points-panel {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n border-top: 4px solid var(--rs-map-accent);\n padding: 16px;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n background: #fff;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .panel-message {\n margin: 0;\n font-size: 0.95rem;\n color: #555;\n text-align: center;\n padding: 32px 12px;\n }\n .panel-content[hidden] {\n display: none;\n }\n .points-panel h2 {\n margin: 0 0 8px;\n font-size: 1rem;\n color: var(--rs-map-accent);\n }\n .zone-filters {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n overflow-x: auto;\n padding-bottom: 8px;\n flex-wrap: nowrap;\n }\n .zone-button {\n border: 1px solid var(--rs-map-accent);\n border-radius: 999px;\n padding: 6px 12px;\n font-size: 0.85rem;\n background: transparent;\n color: var(--rs-map-accent);\n cursor: pointer;\n transition: background 0.2s ease, color 0.2s ease;\n text-align: center;\n white-space: nowrap;\n }\n .zone-button:hover,\n .zone-button:focus-visible {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .zone-button.is-active {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .zone-button--secondary {\n flex-shrink: 0;\n border-color: #444;\n color: #444;\n }\n .zone-button--secondary i {\n margin-right: 6px;\n }\n .panel-header {\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n }\n .panel-header h2[data-panel-title] {\n margin: 0;\n font-size: 1.25rem;\n }\n .zones-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n overflow-y: auto;\n }\n .zone-section {\n border-top: 2px solid #eee;\n padding-top: 12px;\n }\n .zone-section[hidden] {\n display: none;\n }\n .zone-section__header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n margin: 0 0 8px;\n font-weight: 600;\n color: #333;\n }\n .zone-section__empty {\n margin: 0;\n font-size: 0.85rem;\n color: #777;\n }\n .zone-section__list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .point-card {\n border: 1px solid #e6e6e6;\n border-radius: 8px;\n padding: 10px;\n background: #fff;\n display: flex;\n flex-direction: column;\n gap: 6px;\n overflow: hidden;\n transition: border 0.2s ease, box-shadow 0.2s ease;\n }\n .point-card--highlight {\n border: 2px solid var(--rs-map-accent);\n box-shadow: 0 0 0 2px rgba(30, 136, 229, 0.2);\n animation: highlightFade 3s forwards;\n }\n @keyframes highlightFade {\n 0% {\n border-color: var(--rs-map-accent);\n box-shadow: 0 0 0 2px rgba(30, 136, 229, 0.2);\n }\n 80% {\n border-color: #111;\n box-shadow: 0 0 0 2px rgba(17, 17, 17, 0.2);\n }\n 100% {\n border-color: #e6e6e6;\n box-shadow: none;\n }\n }\n .point-card__title {\n margin: -10px -10px 8px;\n padding: 10px;\n font-size: 0.95rem;\n font-weight: 600;\n text-align: center;\n color: #fff;\n background: var(--rs-map-accent);\n }\n .point-card__focus {\n border: 1px solid var(--rs-map-accent);\n border-radius: 999px;\n padding: 4px 12px;\n font-size: 0.8rem;\n background: transparent;\n color: var(--rs-map-accent);\n cursor: pointer;\n }\n .point-card__focus:hover,\n .point-card__focus:focus-visible {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .point-card__map-actions {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n align-self: flex-start;\n margin-top: 8px;\n }\n .point-card__mobile-navigation {\n display: none;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n }\n .point-card__mobile-nav-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: 1px solid var(--rs-map-accent);\n border-radius: 999px;\n padding: 4px 12px;\n background: var(--rs-map-accent);\n color: #fff;\n font-size: 0.8rem;\n text-decoration: none;\n }\n .point-card__mobile-nav-link:hover,\n .point-card__mobile-nav-link:focus-visible {\n filter: brightness(0.94);\n }\n .point-card__coordinate-warning {\n display: flex;\n align-items: center;\n gap: 6px;\n border: 1px solid #d6dbe3;\n border-radius: 999px;\n padding: 4px 12px;\n background: #f8fafc;\n color: #4b5563;\n font-size: 0.8rem;\n line-height: 1.35;\n align-self: flex-start;\n margin-top: 8px;\n }\n .point-card__coordinate-warning i {\n color: #6b7280;\n }\n @media (max-width: 768px) {\n .map-layout {\n grid-template-columns: 1fr;\n }\n .map-panel {\n display: none;\n }\n .panel-header {\n flex-direction: column;\n align-items: stretch;\n }\n .zone-filters {\n flex-wrap: wrap;\n }\n .point-card__focus {\n display: none;\n }\n .point-card__mobile-navigation {\n display: flex;\n }\n }\n .point-card__address,\n .point-card__meta,\n .point-card__contact {\n margin: 0;\n font-size: 0.85rem;\n color: #555;\n }\n .point-card__contact {\n margin: 0 0 6px;\n font-size: 0.85rem;\n color: #555;\n }\n .point-card__contact-title {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n color: #333;\n margin-bottom: 4px;\n }\n .point-card__phone-list {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .point-card__phone-item {\n display: flex;\n gap: 8px;\n align-items: flex-start;\n }\n .point-card__phone-icon {\n width: 16px;\n display: inline-flex;\n justify-content: center;\n color: var(--rs-map-accent);\n font-size: 0.85rem;\n }\n .point-card__phone-content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .point-card__phone-name {\n font-weight: 600;\n color: #333;\n }\n .point-card__phone-number {\n font-family: 'Segoe UI', system-ui, sans-serif;\n font-size: 0.85rem;\n }\n .point-card__phone-number--link {\n color: var(--rs-map-accent);\n text-decoration: none;\n }\n .point-card__phone-number--link:hover,\n .point-card__phone-number--link:focus-visible {\n text-decoration: underline;\n }\n .point-card__address-block {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .point-card__details {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-top: 6px;\n }\n .point-card__details[hidden] {\n display: none;\n }\n .point-card__toggle {\n border: 1px solid var(--rs-map-accent);\n border-radius: 16px;\n padding: 4px 10px;\n background: transparent;\n color: var(--rs-map-accent);\n font-size: 0.8rem;\n cursor: pointer;\n align-self: flex-start;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n .point-card__toggle:hover,\n .point-card__toggle:focus-visible {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .point-card__actions {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n margin-top: 8px;\n }\n .point-card__action {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 0.8rem;\n }\n .point-card__actions a.point-card__action {\n color: var(--rs-map-accent);\n text-decoration: none;\n border-bottom: 1px solid transparent;\n }\n .point-card__actions a.point-card__action:hover,\n .point-card__actions a.point-card__action:focus-visible {\n border-color: currentColor;\n }\n .point-card__actions .point-card__action i {\n font-size: 0.85rem;\n }\n .point-card__actions .point-card__action--text {\n color: #444;\n }\n .point-card__extra {\n margin: 0;\n font-size: 0.8rem;\n color: #444;\n }\n .point-card__extra a {\n color: var(--rs-map-accent);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n }\n .point-card__extra a:hover,\n .point-card__extra a:focus-visible {\n color: #444;\n text-decoration: underline;\n }\n .point-card__extra-icon {\n font-size: 0.75rem;\n }\n .empty-state {\n margin: 0;\n font-size: 0.9rem;\n color: #777;\n text-align: center;\n }\n .points-panel p {\n margin: 0;\n color: #666;\n font-size: 0.9rem;\n }\n .point-modal-overlay {\n position: absolute;\n inset: 0;\n z-index: 30;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n background: rgba(0, 0, 0, 0.48);\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n }\n .point-modal-overlay[hidden] {\n display: none;\n }\n .point-modal {\n width: min(560px, 100%);\n max-height: calc(100% - 16px);\n border-radius: 8px;\n overflow: hidden;\n background: #f7f7fb;\n color: #151515;\n box-shadow: 0 18px 48px rgba(0, 0, 0, 0.32);\n display: flex;\n flex-direction: column;\n }\n .point-modal__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 14px 18px;\n background: #000;\n color: #fff;\n }\n .point-modal__title {\n margin: 0;\n font-size: 1.15rem;\n font-weight: 700;\n line-height: 1.2;\n }\n .point-modal__close {\n border: 0;\n width: 34px;\n height: 34px;\n border-radius: 50%;\n background: transparent;\n color: #fff;\n cursor: pointer;\n font-size: 1.1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .point-modal__close:hover,\n .point-modal__close:focus-visible {\n background: rgba(255, 255, 255, 0.14);\n }\n .point-modal__body {\n padding: 20px 24px 24px;\n overflow-y: auto;\n line-height: 1.45;\n }\n .point-modal__cover {\n width: calc(100% + 48px);\n max-height: 300px;\n object-fit: cover;\n margin: -20px -24px 18px;\n display: block;\n background: #e5e7eb;\n }\n .point-modal__section {\n margin: 0 0 20px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .point-modal__section:last-child {\n margin-bottom: 0;\n }\n .point-modal__line {\n margin: 0;\n font-size: 0.95rem;\n color: #242424;\n }\n .point-modal__label {\n font-weight: 700;\n }\n .point-modal__phone-list {\n list-style: none;\n padding: 0;\n margin: 4px 0 0;\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n .point-modal__phone-item {\n font-size: 0.94rem;\n color: #222;\n }\n .point-modal__extra {\n margin: 0;\n font-size: 0.94rem;\n color: #242424;\n }\n .point-modal__extra a,\n .point-modal__link {\n color: #111;\n font-weight: 600;\n text-decoration: none;\n border-bottom: 1px solid currentColor;\n }\n .point-modal__extra a:hover,\n .point-modal__extra a:focus-visible,\n .point-modal__link:hover,\n .point-modal__link:focus-visible {\n color: var(--rs-map-accent);\n }\n .point-modal__actions {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n }\n @media (max-width: 768px) {\n .point-modal-overlay {\n position: fixed;\n }\n .point-modal {\n max-height: calc(100dvh - 24px);\n }\n .point-modal__body {\n padding: 16px 18px 20px;\n }\n .point-modal__cover {\n width: calc(100% + 36px);\n margin: -16px -18px 16px;\n }\n }\n </style>\n <div class=\"component-shell\">\n <p class=\"component-message\" data-component-message>Cargando puntos...</p>\n <div class=\"map-layout\" data-map-layout hidden>\n <div class=\"map-panel\">\n <div id=\"map\"></div>\n </div>\n <aside class=\"points-panel\" aria-live=\"polite\">\n <div class=\"zone-filters\" role=\"group\" aria-label=\"Filtrar por zona\">\n <button class=\"zone-button\" type=\"button\" data-zone=\"norte\" data-label=\"Zona Norte\" aria-pressed=\"false\">Zona Norte</button>\n <button class=\"zone-button\" type=\"button\" data-zone=\"rm\" data-label=\"RM\" aria-pressed=\"false\">RM</button>\n <button class=\"zone-button\" type=\"button\" data-zone=\"centro\" data-label=\"Zona Centro\" aria-pressed=\"false\">Zona Centro</button>\n <button class=\"zone-button\" type=\"button\" data-zone=\"sur\" data-label=\"Zona Sur\" aria-pressed=\"false\">Zona Sur</button>\n </div>\n <div class=\"panel-header\">\n <h2 data-panel-title>Puntos del mapa</h2>\n <button class=\"zone-button zone-button--secondary\" type=\"button\" data-action=\"nearest\">\n <i class=\"fa-solid fa-location-dot\" aria-hidden=\"true\"></i>\n Buscar tienda cercana\n </button>\n </div>\n <div class=\"zones-container\" data-zone-container></div>\n </aside>\n </div>\n </div>\n <div class=\"point-modal-overlay\" data-point-modal-overlay hidden>\n <section class=\"point-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"rs-map-point-modal-title\">\n <header class=\"point-modal__header\">\n <h2 class=\"point-modal__title\" id=\"rs-map-point-modal-title\" data-point-modal-title></h2>\n <button class=\"point-modal__close\" type=\"button\" data-point-modal-close aria-label=\"Cerrar\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </header>\n <div class=\"point-modal__body\" data-point-modal-body></div>\n </section>\n </div>\n `;\n }\n\n connectedCallback() {\n this.mapEl = this.root.querySelector<HTMLDivElement>('#map')!;\n this.panelTitleEl = this.root.querySelector<HTMLElement>('[data-panel-title]')!;\n this.zonesContainer = this.root.querySelector<HTMLElement>('[data-zone-container]')!;\n this.componentMessageEl = this.root.querySelector<HTMLElement>('[data-component-message]')!;\n this.mapLayoutEl = this.root.querySelector<HTMLElement>('[data-map-layout]')!;\n this.pointModalOverlayEl = this.root.querySelector<HTMLElement>('[data-point-modal-overlay]')!;\n this.pointModalTitleEl = this.root.querySelector<HTMLElement>('[data-point-modal-title]')!;\n this.pointModalBodyEl = this.root.querySelector<HTMLElement>('[data-point-modal-body]')!;\n this.pointModalCloseButton = this.root.querySelector<HTMLButtonElement>('[data-point-modal-close]')!;\n this.zoneButtons = Array.from(this.root.querySelectorAll<HTMLButtonElement>('[data-zone]'));\n this.nearestButton = this.root.querySelector<HTMLButtonElement>('[data-action=\"nearest\"]')!;\n this.zoneButtons.forEach((btn) => btn.addEventListener('click', this.handleZoneButtonClick));\n if (this.nearestButton) {\n this.nearestButton.addEventListener('click', this.handleNearestClick);\n }\n this.pointModalOverlayEl.addEventListener('click', this.handlePointModalOverlayClick);\n this.pointModalCloseButton.addEventListener('click', this.closePointModal);\n window.addEventListener('keydown', this.handlePointModalKeydown);\n this.updateZoneButtons();\n this.setMapHeight(this.getAttribute('height'));\n this.setComponentState('loading');\n this.syncAttributesToState();\n }\n\n disconnectedCallback() {\n this.pointsController?.abort();\n this.zoneButtons.forEach((btn) => btn.removeEventListener('click', this.handleZoneButtonClick));\n if (this.nearestButton) {\n this.nearestButton.removeEventListener('click', this.handleNearestClick);\n }\n this.pointModalOverlayEl?.removeEventListener('click', this.handlePointModalOverlayClick);\n this.pointModalCloseButton?.removeEventListener('click', this.closePointModal);\n window.removeEventListener('keydown', this.handlePointModalKeydown);\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null) {\n if (name === 'marca') {\n this.setMarca(newValue ?? '');\n } else if (name === 'tipo') {\n this.setTipo(newValue ?? '');\n } else if (name === 'height') {\n this.setMapHeight(newValue);\n } else if (name === 'google-maps-key') {\n this.setGoogleMapsKey(newValue);\n } else if (name === 'points-api-url') {\n this.setPointsApiUrl(newValue);\n } else if (name === 'cache-days') {\n this.setCacheDays(newValue);\n } else if (name === 'marker-icon-base') {\n this.setMarkerIconBase(newValue);\n } else if (name === 'marker-icon-default') {\n this.setDefaultMarkerIcon(newValue);\n }\n }\n\n private loadGoogleMaps() {\n if ((window as any)._rsGoogleMapsLoaded) {\n return Promise.resolve().then(() => {\n this.initMap();\n });\n }\n\n if (!this.googleMapsApiKey) {\n console.error('Falta la clave de Google Maps. Define el atributo \"google-maps-key\" en <rs-map>.');\n return Promise.resolve();\n }\n\n if (!RsMap.googleMapsLoaderPromise) {\n RsMap.googleMapsLoaderPromise = new Promise<void>((resolve, reject) => {\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-rs-google-maps=\"true\"]');\n if (existingScript) {\n existingScript.addEventListener('load', () => resolve(), { once: true });\n existingScript.addEventListener(\n 'error',\n () => reject(new Error('Error al cargar la API de Google Maps')),\n { once: true }\n );\n return;\n }\n\n const script = document.createElement('script');\n const params = new URLSearchParams({\n key: this.googleMapsApiKey,\n v: 'weekly'\n });\n script.src = `https://maps.googleapis.com/maps/api/js?${params.toString()}`;\n script.async = true;\n script.defer = true;\n script.dataset.rsGoogleMaps = 'true';\n\n script.onload = () => {\n (window as any)._rsGoogleMapsLoaded = true;\n resolve();\n };\n\n script.onerror = () => {\n RsMap.googleMapsLoaderPromise = null;\n reject(new Error('Error al cargar la API de Google Maps'));\n };\n\n document.head.appendChild(script);\n });\n }\n\n return RsMap.googleMapsLoaderPromise\n .then(() => {\n (window as any)._rsGoogleMapsLoaded = true;\n this.initMap();\n })\n .catch((error) => {\n console.error(error instanceof Error ? error.message : 'Error al cargar la API de Google Maps');\n });\n }\n\n private initMap() {\n const g = (window as any).google;\n if (!g) {\n console.error('Google Maps aun no esta disponible.');\n return;\n }\n\n const initialCenter = this.getInitialCenter();\n this.map = new g.maps.Map(this.mapEl, {\n center: initialCenter,\n zoom: 14,\n mapTypeId: 'roadmap'\n });\n if (this.points.length) {\n this.updateMarkers(this.points);\n }\n }\n\n private getInitialCenter() {\n const firstPoint = this.getFirstValidPoint();\n if (firstPoint) {\n return firstPoint;\n }\n return { lat: -33.4489, lng: -70.6693 };\n }\n\n private getFirstValidPoint(): MapPosition | null {\n for (const point of this.points) {\n const position = this.getPointPosition(point);\n if (position) {\n return position;\n }\n }\n return null;\n }\n\n private syncAttributesToState() {\n this.isSyncingInitialAttributes = true;\n this.setMarca(this.getAttribute('marca') ?? '');\n this.setTipo(this.getAttribute('tipo') ?? '');\n this.setGoogleMapsKey(this.getAttribute('google-maps-key'));\n this.setPointsApiUrl(this.getAttribute('points-api-url'));\n this.setCacheDays(this.getAttribute('cache-days'));\n this.setMarkerIconBase(this.getAttribute('marker-icon-base'));\n this.setDefaultMarkerIcon(this.getAttribute('marker-icon-default'));\n this.isSyncingInitialAttributes = false;\n this.queueRefreshPoints();\n }\n\n private setMapHeight(value: string | null) {\n const normalized = (value ?? '').trim();\n if (!normalized) {\n this.mapHeight = '';\n this.style.removeProperty('--map-height');\n return;\n }\n this.mapHeight = normalized;\n this.style.setProperty('--map-height', normalized);\n }\n\n private setGoogleMapsKey(value: string | null) {\n this.googleMapsApiKey = (value ?? '').trim();\n if (this.googleMapsApiKey && this.isConnected) {\n void this.loadGoogleMaps();\n }\n }\n\n private setPointsApiUrl(value: string | null) {\n const normalized = (value ?? '').trim();\n this.pointsApiUrl = normalized || DEFAULT_POINTS_API_URL;\n if (this.pointsApiUrl && this.isConnected && !this.isSyncingInitialAttributes) {\n this.queueRefreshPoints();\n }\n }\n\n private setCacheDays(value: string | null) {\n const normalized = (value ?? '').trim();\n if (!normalized) {\n this.pointsCacheTtlMs = DEFAULT_POINTS_CACHE_TTL_MS;\n return;\n }\n\n const days = Number(normalized);\n if (!Number.isFinite(days) || days < 0) {\n this.pointsCacheTtlMs = DEFAULT_POINTS_CACHE_TTL_MS;\n return;\n }\n\n this.pointsCacheTtlMs = days * 24 * 60 * 60 * 1000;\n }\n\n private setMarkerIconBase(value: string | null) {\n const normalized = (value ?? '').trim();\n if (!normalized) {\n this.markerIconBaseUrl = '';\n return;\n }\n this.markerIconBaseUrl = normalized.endsWith('/') ? normalized : `${normalized}/`;\n }\n\n private setDefaultMarkerIcon(value: string | null) {\n this.defaultMarkerIconUrl = (value ?? '').trim();\n }\n\n private setMarca(value: string) {\n this.marca = value.trim();\n this.marcaKey = this.normalizeBrandKey(this.marca);\n this.applyBrandColor();\n if (!this.isSyncingInitialAttributes) {\n this.queueRefreshPoints();\n }\n }\n\n private setTipo(value: string) {\n this.tipo = value.trim();\n this.tipoCode = this.normalizeTipo(this.tipo);\n this.updatePanelTitle();\n if (!this.isSyncingInitialAttributes) {\n this.queueRefreshPoints();\n }\n }\n\n private queueRefreshPoints() {\n if (this.refreshQueued) {\n return;\n }\n this.refreshQueued = true;\n queueMicrotask(() => {\n this.refreshQueued = false;\n void this.refreshPoints();\n });\n }\n\n get marcaFilter() {\n return this.marca;\n }\n\n get tipoFilter() {\n return this.tipo;\n }\n\n private updatePanelTitle() {\n if (!this.panelTitleEl) {\n return;\n }\n const label = this.getTipoLabel();\n this.panelTitleEl.textContent = label ?? 'Puntos del mapa';\n }\n\n private getTipoLabel() {\n if (this.tipoCode !== null && this.tipoCode in TYPE_LABELS) {\n return TYPE_LABELS[this.tipoCode];\n }\n const normalized = this.tipo.trim().toLowerCase();\n const normalizedCode = normalized && normalized in TYPE_CODES ? TYPE_CODES[normalized] : null;\n if (normalizedCode !== null && normalizedCode in TYPE_LABELS) {\n return TYPE_LABELS[normalizedCode];\n }\n return null;\n }\n\n private applyBrandColor() {\n const color = BRAND_COLORS[this.marcaKey] ?? DEFAULT_BRAND_COLOR;\n this.style.setProperty('--rs-map-accent', color);\n }\n\n private normalizeTipo(value: string): number | null {\n if (!value) {\n return null;\n }\n const normalized = value.trim().toLowerCase();\n if (normalized in TYPE_CODES) {\n return TYPE_CODES[normalized];\n }\n const numeric = Number(normalized);\n if (Number.isFinite(numeric) && (numeric === 0 || numeric === 1)) {\n return numeric;\n }\n return null;\n }\n\n private async refreshPoints() {\n if (!this.isConnected || !this.marca || this.tipoCode === null) {\n return;\n }\n\n if (!this.pointsApiUrl) {\n console.error('Falta la URL de la API de puntos. Define el atributo \"points-api-url\" en <rs-map>.');\n this.setComponentState('error');\n return;\n }\n\n this.pointsController?.abort();\n const controller = new AbortController();\n this.pointsController = controller;\n\n const marcaRequestValue = this.getMarcaRequestValue();\n const params = new URLSearchParams({\n marca: marcaRequestValue,\n tipo: String(this.tipoCode)\n });\n\n const hasQuery = this.pointsApiUrl.includes('?');\n const needsAmp = hasQuery && !/[?&]$/.test(this.pointsApiUrl);\n const separator = hasQuery ? (needsAmp ? '&' : '') : '?';\n const requestUrl = `${this.pointsApiUrl}${separator}${params.toString()}`;\n const cacheKey = this.getPointsCacheKey(requestUrl);\n const cachedPayload = await this.readPointsCache(cacheKey);\n const hasFreshCache = cachedPayload && Date.now() - cachedPayload.timestamp < this.pointsCacheTtlMs;\n const localFallbackPayload = cachedPayload ? null : await this.getLocalPointsFallback(marcaRequestValue, this.tipoCode);\n\n if (cachedPayload) {\n this.applyPointsPayload(cachedPayload.data);\n this.setComponentState('ready');\n if (hasFreshCache) {\n return;\n }\n } else if (localFallbackPayload) {\n this.applyPointsPayload(localFallbackPayload);\n this.setComponentState('ready');\n } else {\n this.setComponentState('loading');\n }\n\n try {\n const response = await fetch(requestUrl, {\n signal: controller.signal\n });\n\n if (!response.ok) {\n throw new Error(`Respuesta ${response.status}`);\n }\n\n const payload = await response.json();\n if (!Array.isArray(payload)) {\n throw new Error('La respuesta de puntos no es valida.');\n }\n const typedPayload = payload as MapPointApi[];\n await this.writePointsCache(cacheKey, typedPayload);\n this.applyPointsPayload(typedPayload);\n this.setComponentState('ready');\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n return;\n }\n if (cachedPayload || localFallbackPayload) {\n console.warn('Se mantienen puntos locales por error al refrescar el mapa', error);\n return;\n }\n console.error('No se pudieron cargar los puntos del mapa', error);\n this.setComponentState('error');\n }\n }\n\n private applyPointsPayload(payload: MapPointApi[]) {\n this.points = this.transformPoints(payload);\n this.reportUnmappablePoints(this.points);\n this.renderPoints(this.points);\n this.initialViewApplied = false;\n this.updateMarkers(this.points);\n }\n\n private reportUnmappablePoints(points: MapPoint[]) {\n const unmappablePoints = points\n .filter((point) => !this.getPointPosition(point))\n .map((point) => ({\n id: point.id,\n titulo: point.titulo,\n direccion: point.direccion,\n lat: point.lat,\n lng: point.lng\n }));\n\n if (unmappablePoints.length) {\n console.warn('Puntos con coordenadas fuera de rango o invalidas; no se muestran como markers.', unmappablePoints);\n }\n }\n\n private getPointsCacheKey(requestUrl: string) {\n return `rs-map:points:${requestUrl}`;\n }\n\n private async getLocalPointsFallback(marca: string, tipoCode: number): Promise<MapPointApi[] | null> {\n const normalizedBrand = this.normalizeBrandKey(marca);\n const path = `../json/PuntosMapas_${normalizedBrand}_${tipoCode}.json`;\n const existingRequest = this.localPointsRequests.get(path);\n if (existingRequest) {\n return existingRequest;\n }\n\n const loader = LOCAL_POINTS_LOADERS[path];\n if (!loader) {\n return null;\n }\n\n const request = loader()\n .then((payload) => {\n const parsedPayload = this.parseLocalPointsPayload(payload);\n return parsedPayload?.length ? parsedPayload : null;\n })\n .catch(() => null);\n\n this.localPointsRequests.set(path, request);\n return request;\n }\n\n private parseLocalPointsPayload(value: unknown): MapPointApi[] | null {\n if (!Array.isArray(value)) {\n return null;\n }\n\n return value as MapPointApi[];\n }\n\n private async readPointsCache(cacheKey: string): Promise<PointsCacheEntry | null> {\n const dbEntry = await this.readPointsCacheFromIndexedDb(cacheKey);\n if (dbEntry) {\n return dbEntry;\n }\n\n try {\n const raw = window.localStorage.getItem(cacheKey);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw) as PointsCacheEntry;\n if (!parsed || !Array.isArray(parsed.data) || !Number.isFinite(parsed.timestamp)) {\n window.localStorage.removeItem(cacheKey);\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n }\n\n private async writePointsCache(cacheKey: string, payload: MapPointApi[]) {\n const entry: PointsCacheEntry = {\n timestamp: Date.now(),\n data: payload\n };\n\n await this.writePointsCacheToIndexedDb(cacheKey, entry);\n\n try {\n window.localStorage.setItem(cacheKey, JSON.stringify(entry));\n } catch {\n // Ignore storage errors and keep runtime behavior.\n }\n }\n\n private async readPointsCacheFromIndexedDb(cacheKey: string): Promise<PointsCacheEntry | null> {\n const db = await RsMap.openPointsCacheDb();\n if (!db) {\n return null;\n }\n\n return new Promise((resolve) => {\n const transaction = db.transaction(POINTS_CACHE_STORE_NAME, 'readonly');\n const store = transaction.objectStore(POINTS_CACHE_STORE_NAME);\n const request = store.get(cacheKey);\n\n request.onsuccess = () => {\n const result = request.result as PointsCacheRecord | undefined;\n if (!result || !Array.isArray(result.data) || !Number.isFinite(result.timestamp)) {\n resolve(null);\n return;\n }\n resolve({\n timestamp: result.timestamp,\n data: result.data\n });\n };\n\n request.onerror = () => resolve(null);\n });\n }\n\n private async writePointsCacheToIndexedDb(cacheKey: string, entry: PointsCacheEntry) {\n const db = await RsMap.openPointsCacheDb();\n if (!db) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n const transaction = db.transaction(POINTS_CACHE_STORE_NAME, 'readwrite');\n const store = transaction.objectStore(POINTS_CACHE_STORE_NAME);\n const request = store.put({\n key: cacheKey,\n timestamp: entry.timestamp,\n data: entry.data\n } satisfies PointsCacheRecord);\n\n request.onsuccess = () => resolve();\n request.onerror = () => resolve();\n });\n }\n\n private static openPointsCacheDb(): Promise<IDBDatabase | null> {\n if (typeof window === 'undefined' || !('indexedDB' in window)) {\n return Promise.resolve(null);\n }\n\n if (!RsMap.pointsCacheDbPromise) {\n RsMap.pointsCacheDbPromise = new Promise((resolve) => {\n const request = window.indexedDB.open(POINTS_CACHE_DB_NAME, 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(POINTS_CACHE_STORE_NAME)) {\n db.createObjectStore(POINTS_CACHE_STORE_NAME, { keyPath: 'key' });\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => resolve(null);\n });\n }\n\n return RsMap.pointsCacheDbPromise;\n }\n\n private transformPoints(payload: MapPointApi[]): MapPoint[] {\n return payload.map((point) => ({\n ...point,\n zone: this.getZoneForPoint(point)\n }));\n }\n\n private renderPoints(points: MapPoint[]) {\n if (!this.zonesContainer) {\n return;\n }\n\n const grouped = this.groupPoints(points);\n this.pointsByZone = grouped;\n this.updateZoneButtonCounts();\n\n const fragment = document.createDocumentFragment();\n\n ZONE_ORDER.forEach((zoneKey) => {\n const section = document.createElement('section');\n section.className = 'zone-section';\n section.dataset.zoneSection = zoneKey;\n\n const header = document.createElement('div');\n header.className = 'zone-section__header';\n const title = document.createElement('span');\n title.textContent = ZONE_LABELS[zoneKey];\n header.appendChild(title);\n section.appendChild(header);\n\n if (grouped[zoneKey].length === 0) {\n const empty = document.createElement('p');\n empty.className = 'zone-section__empty';\n empty.textContent = 'Sin puntos en esta zona.';\n section.appendChild(empty);\n } else {\n const list = document.createElement('div');\n list.className = 'zone-section__list';\n grouped[zoneKey].forEach((point) => {\n list.appendChild(this.createPointCard(point));\n });\n section.appendChild(list);\n }\n\n fragment.appendChild(section);\n });\n\n this.zonesContainer.replaceChildren(fragment);\n this.updateZoneVisibility();\n }\n\n private groupPoints(points: MapPoint[]): Record<ZoneKey, MapPoint[]> {\n const grouped: Record<ZoneKey, MapPoint[]> = {\n norte: [],\n rm: [],\n centro: [],\n sur: []\n };\n points.forEach((point) => {\n grouped[point.zone].push(point);\n });\n return grouped;\n }\n\n private createPointCard(point: MapPoint) {\n const card = document.createElement('article');\n card.className = 'point-card';\n card.dataset.pointId = String(point.id);\n const coordinateWarning = this.getPointCoordinateWarning(point);\n\n const title = document.createElement('h3');\n title.className = 'point-card__title';\n title.textContent = point.titulo || 'Sin nombre';\n card.appendChild(title);\n\n const addressBlock = document.createElement('div');\n addressBlock.className = 'point-card__address-block';\n\n const address = document.createElement('p');\n address.className = 'point-card__address';\n address.textContent = point.direccion || 'Sin direccion';\n addressBlock.appendChild(address);\n\n if (point.comuna_name) {\n const comuna = document.createElement('p');\n comuna.className = 'point-card__meta';\n comuna.textContent = point.comuna_name;\n addressBlock.appendChild(comuna);\n }\n\n if (point.provincia_name) {\n const provincia = document.createElement('p');\n provincia.className = 'point-card__meta';\n provincia.textContent = point.provincia_name;\n addressBlock.appendChild(provincia);\n }\n\n if (point.region_name) {\n const regionLine = document.createElement('p');\n regionLine.className = 'point-card__meta';\n regionLine.textContent = point.region_name;\n addressBlock.appendChild(regionLine);\n }\n\n card.appendChild(addressBlock);\n\n let mapPositionElement: HTMLElement | null = null;\n const position = this.getPointPosition(point);\n if (position) {\n const mapActions = document.createElement('div');\n mapActions.className = 'point-card__map-actions';\n\n const focusButton = document.createElement('button');\n focusButton.type = 'button';\n focusButton.className = 'point-card__focus';\n const icon = this.createIconElement('fa-solid fa-location-crosshairs');\n focusButton.appendChild(icon);\n focusButton.appendChild(document.createTextNode(' Ver en el mapa'));\n focusButton.addEventListener('click', () => {\n void this.focusPointWithZoom(position.lat, position.lng);\n this.scrollToPointCard(point.id);\n });\n mapActions.appendChild(focusButton);\n mapActions.appendChild(this.createMobileNavigationActions(position));\n mapPositionElement = mapActions;\n } else if (coordinateWarning) {\n const warning = document.createElement('div');\n warning.className = 'point-card__coordinate-warning';\n const icon = this.createIconElement('fa-solid fa-circle-info');\n warning.appendChild(icon);\n const text = document.createElement('span');\n text.textContent = coordinateWarning;\n warning.appendChild(text);\n mapPositionElement = warning;\n }\n\n const details = document.createElement('div');\n details.className = 'point-card__details';\n details.hidden = true;\n let hasDetails = false;\n\n const actions = document.createElement('div');\n actions.className = 'point-card__actions';\n let mapLinkElement: HTMLAnchorElement | null = null;\n\n if (point.url && point.url !== '#') {\n const siteLink = document.createElement('a');\n siteLink.href = point.url;\n siteLink.target = '_blank';\n siteLink.rel = 'noopener noreferrer';\n siteLink.className = 'point-card__action';\n const icon = this.createIconElement('fa-solid fa-globe');\n siteLink.appendChild(icon);\n siteLink.appendChild(document.createTextNode('Sitio web'));\n actions.appendChild(siteLink);\n }\n\n if (point.email) {\n const emailLink = document.createElement('a');\n emailLink.href = `mailto:${point.email}`;\n emailLink.target = '_blank';\n emailLink.rel = 'noopener noreferrer';\n emailLink.className = 'point-card__action point-card__action--text';\n const icon = this.createIconElement('fa-solid fa-envelope');\n emailLink.appendChild(icon);\n emailLink.appendChild(document.createTextNode(point.email));\n actions.appendChild(emailLink);\n }\n\n if (actions.childElementCount) {\n details.appendChild(actions);\n hasDetails = true;\n }\n\n if (point.telefonos?.length) {\n const contactSection = document.createElement('div');\n contactSection.className = 'point-card__contact';\n const contactTitle = document.createElement('div');\n contactTitle.className = 'point-card__contact-title';\n const icon = this.createIconElement('fa-solid fa-phone');\n contactTitle.appendChild(icon);\n contactTitle.appendChild(document.createTextNode('Telefonos'));\n contactSection.appendChild(contactTitle);\n\n const phoneList = document.createElement('ul');\n phoneList.className = 'point-card__phone-list';\n\n point.telefonos\n .slice()\n .sort((a, b) => a.orden - b.orden)\n .forEach((phone) => {\n const item = document.createElement('li');\n item.className = 'point-card__phone-item';\n\n const iconWrapper = document.createElement('span');\n iconWrapper.className = 'point-card__phone-icon';\n const hasWhatsapp = this.isWhatsappPhone(phone);\n if (hasWhatsapp) {\n const whatsappIcon = this.createIconElement('fa-brands fa-whatsapp');\n iconWrapper.appendChild(whatsappIcon);\n } else {\n iconWrapper.textContent = '-';\n }\n item.appendChild(iconWrapper);\n\n const content = document.createElement('div');\n content.className = 'point-card__phone-content';\n\n const name = document.createElement('span');\n name.className = 'point-card__phone-name';\n name.textContent = phone.nombre;\n content.appendChild(name);\n\n const numberEl = hasWhatsapp ? document.createElement('a') : document.createElement('span');\n numberEl.className = 'point-card__phone-number';\n if (hasWhatsapp) {\n const link = this.getWhatsappLink(phone.telefono);\n if (link) {\n (numberEl as HTMLAnchorElement).href = link;\n (numberEl as HTMLAnchorElement).target = '_blank';\n (numberEl as HTMLAnchorElement).rel = 'noopener noreferrer';\n numberEl.classList.add('point-card__phone-number--link');\n }\n }\n numberEl.textContent = phone.telefono;\n content.appendChild(numberEl);\n\n item.appendChild(content);\n phoneList.appendChild(item);\n });\n\n contactSection.appendChild(phoneList);\n details.appendChild(contactSection);\n hasDetails = true;\n }\n\n if (point.adicional) {\n const extra = document.createElement('p');\n extra.className = 'point-card__extra';\n extra.innerHTML = point.adicional;\n extra.querySelectorAll('a').forEach((link) => {\n link.classList.add('point-card__extra-link');\n const icon = this.createIconElement('fa-solid fa-arrow-up-right-from-square');\n icon.classList.add('point-card__extra-icon');\n link.appendChild(icon);\n });\n details.appendChild(extra);\n hasDetails = true;\n }\n\n if (point.googlelink) {\n mapLinkElement = document.createElement('a');\n mapLinkElement.href = point.googlelink;\n mapLinkElement.target = '_blank';\n mapLinkElement.rel = 'noopener noreferrer';\n mapLinkElement.className = 'point-card__action';\n const icon = this.createIconElement('fa-solid fa-map-location-dot');\n mapLinkElement.appendChild(icon);\n mapLinkElement.appendChild(document.createTextNode('Google Maps'));\n }\n\n if (mapLinkElement) {\n const mapWrapper = document.createElement('div');\n mapWrapper.className = 'point-card__actions';\n mapWrapper.appendChild(mapLinkElement);\n details.appendChild(mapWrapper);\n hasDetails = true;\n }\n\n if (hasDetails) {\n const toggle = document.createElement('button');\n toggle.type = 'button';\n toggle.className = 'point-card__toggle';\n const toggleIcon = this.createIconElement('fa-solid fa-circle-info');\n const toggleText = document.createElement('span');\n toggleText.textContent = 'Mas informacion';\n toggle.appendChild(toggleIcon);\n toggle.appendChild(toggleText);\n toggle.addEventListener('click', () => {\n const isHidden = details.hidden;\n details.hidden = !isHidden;\n toggleText.textContent = isHidden ? 'Ocultar informacion' : 'Mas informacion';\n toggleIcon.className = isHidden ? 'fa-solid fa-circle-xmark' : 'fa-solid fa-circle-info';\n });\n card.appendChild(toggle);\n card.appendChild(details);\n }\n\n if (mapPositionElement) {\n card.appendChild(mapPositionElement);\n }\n\n return card;\n }\n\n private createMobileNavigationActions(position: MapPosition) {\n const actions = document.createElement('div');\n actions.className = 'point-card__mobile-navigation';\n actions.appendChild(\n this.createMobileNavigationLink(\n `https://www.google.com/maps/dir/?api=1&destination=${position.lat},${position.lng}&travelmode=driving`,\n 'Ir con Google Maps',\n 'fa-brands fa-google'\n )\n );\n actions.appendChild(\n this.createMobileNavigationLink(\n `https://waze.com/ul?ll=${position.lat},${position.lng}&navigate=yes`,\n 'Ir con Waze',\n 'fa-brands fa-waze'\n )\n );\n return actions;\n }\n\n private createMobileNavigationLink(url: string, label: string, iconClass: string) {\n const link = document.createElement('a');\n link.href = url;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.className = 'point-card__mobile-nav-link';\n link.appendChild(this.createIconElement(iconClass));\n link.appendChild(document.createTextNode(label));\n return link;\n }\n\n private getZoneForPoint(point: MapPointApi): ZoneKey {\n const normalizedRegion = this.normalizeRegionName(point.region_name || '');\n if (normalizedRegion && normalizedRegion in REGION_ZONE_MAP) {\n return REGION_ZONE_MAP[normalizedRegion];\n }\n if (normalizedRegion.includes('metropolitana')) {\n return 'rm';\n }\n if (\n normalizedRegion.includes('araucania') ||\n normalizedRegion.includes('rios') ||\n normalizedRegion.includes('lagos') ||\n normalizedRegion.includes('aysen') ||\n normalizedRegion.includes('magallanes')\n ) {\n return 'sur';\n }\n if (\n normalizedRegion.includes('arica') ||\n normalizedRegion.includes('tarapaca') ||\n normalizedRegion.includes('antofagasta') ||\n normalizedRegion.includes('atacama') ||\n normalizedRegion.includes('coquimbo')\n ) {\n return 'norte';\n }\n return 'centro';\n }\n\n private normalizeRegionName(input: string) {\n return input\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .trim();\n }\n\n private getMarcaRequestValue() {\n const normalized = this.normalizeBrandToken(this.marca);\n return BRAND_ALIASES[normalized] ?? this.marca;\n }\n\n private normalizeBrandKey(value: string) {\n const normalized = this.normalizeBrandToken(value);\n if (!normalized) {\n return 'default';\n }\n return BRAND_ALIASES[normalized] ?? normalized;\n }\n\n private normalizeBrandToken(value: string) {\n const normalized = value\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '');\n return normalized;\n }\n\n private getMarkerIcon(point?: Pick<MapPointApi, 'tipo'>) {\n const key = this.marcaKey || 'default';\n const localIconUrl = this.getLocalMarkerIconUrl(key, point);\n if (localIconUrl) {\n return localIconUrl;\n }\n if (this.markerIconBaseUrl) {\n return `${this.markerIconBaseUrl}${key}.png`;\n }\n if (this.defaultMarkerIconUrl) {\n return this.defaultMarkerIconUrl;\n }\n return null;\n }\n\n private getLocalMarkerIconUrl(key: string, point?: Pick<MapPointApi, 'tipo'>) {\n const pointTipoCode = point ? Number(point.tipo) : NaN;\n const tipoCode = Number.isFinite(pointTipoCode) ? pointTipoCode : this.tipoCode;\n const fileName = tipoCode === 1 ? `${key}_distribuidor.png` : `${key}.png`;\n return LOCAL_MARKER_ICON_URLS[`../pin/${fileName}`] ?? null;\n }\n\n private getPointCoordinateWarning(point: Pick<MapPointApi, 'lat' | 'lng'>) {\n if (this.getPointPosition(point)) {\n return null;\n }\n\n const lat = Number(point.lat);\n const lng = Number(point.lng);\n const rawCoordinates = `lat ${point.lat || 'sin dato'}, lng ${point.lng || 'sin dato'}`;\n if (!Number.isFinite(lat) || !Number.isFinite(lng)) {\n return `Ubicacion por revisar: ${rawCoordinates}.`;\n }\n return `Ubicacion por revisar: ${rawCoordinates}.`;\n }\n\n private getPointPosition(point: Pick<MapPointApi, 'lat' | 'lng'>): MapPosition | null {\n const lat = Number(point.lat);\n const lng = Number(point.lng);\n if (!this.isMappableCoordinate(lat, lng)) {\n return null;\n }\n return { lat, lng };\n }\n\n private isMappableCoordinate(lat: number, lng: number) {\n return (\n Number.isFinite(lat) &&\n Number.isFinite(lng) &&\n lat >= CONTINENTAL_CHILE_BOUNDS.minLat &&\n lat <= CONTINENTAL_CHILE_BOUNDS.maxLat &&\n lng >= CONTINENTAL_CHILE_BOUNDS.minLng &&\n lng <= CONTINENTAL_CHILE_BOUNDS.maxLng\n );\n }\n\n private updateMarkers(points: MapPoint[]) {\n const g = (window as any).google;\n if (!g || !this.map) {\n return;\n }\n this.markers.forEach((marker) => marker.setMap(null));\n this.markers = [];\n\n const validPoints: Array<{ point: MapPoint; position: MapPosition }> = [];\n points.forEach((point) => {\n const position = this.getPointPosition(point);\n if (position) {\n validPoints.push({ point, position });\n }\n });\n\n if (!validPoints.length) {\n return;\n }\n\n const bounds = new g.maps.LatLngBounds();\n\n validPoints.forEach(({ point, position }) => {\n const { lat, lng } = position;\n const iconUrl = this.getMarkerIcon(point);\n const icon =\n iconUrl && this.map\n ? {\n url: iconUrl,\n scaledSize: new g.maps.Size(64, 64),\n anchor: new g.maps.Point(32, 64)\n }\n : undefined;\n const marker = new g.maps.Marker({\n map: this.map,\n position: { lat, lng },\n title: point.titulo,\n icon\n });\n marker.addListener('click', () => {\n this.openPointModal(point);\n this.scrollToPointCard(point.id);\n });\n this.markers.push(marker);\n const markerPosition = marker.getPosition();\n if (markerPosition) {\n bounds.extend(markerPosition);\n }\n });\n\n if (!this.initialViewApplied && this.markers.length) {\n const position = this.markers[0].getPosition();\n if (position) {\n this.map.setCenter(position);\n this.map.setZoom(14);\n this.initialViewApplied = true;\n return;\n }\n }\n\n if (this.markers.length === 1) {\n const position = this.markers[0].getPosition();\n if (position) {\n this.map.setCenter(position);\n }\n this.map.setZoom(14);\n } else {\n this.map.fitBounds(bounds);\n }\n }\n\n private openPointModal(point: MapPoint) {\n if (!this.pointModalOverlayEl || !this.pointModalTitleEl || !this.pointModalBodyEl) {\n return;\n }\n this.pointModalTitleEl.textContent = point.titulo || 'Sin nombre';\n this.pointModalBodyEl.replaceChildren(this.createPointModalContent(point));\n this.pointModalOverlayEl.removeAttribute('hidden');\n this.pointModalCloseButton?.focus();\n }\n\n private closePointModal = () => {\n if (!this.pointModalOverlayEl) {\n return;\n }\n this.pointModalOverlayEl.setAttribute('hidden', '');\n this.pointModalBodyEl?.replaceChildren();\n };\n\n private handlePointModalOverlayClick = (event: Event) => {\n if (event.target === this.pointModalOverlayEl) {\n this.closePointModal();\n }\n };\n\n private handlePointModalKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && this.pointModalOverlayEl && !this.pointModalOverlayEl.hasAttribute('hidden')) {\n this.closePointModal();\n }\n };\n\n private createPointModalContent(point: MapPoint) {\n const fragment = document.createDocumentFragment();\n\n if (point.portada) {\n const cover = document.createElement('img');\n cover.className = 'point-modal__cover';\n cover.src = point.portada;\n cover.alt = point.titulo || 'Imagen del punto';\n cover.loading = 'lazy';\n cover.addEventListener('error', () => cover.remove(), { once: true });\n fragment.appendChild(cover);\n }\n\n const locationSection = this.createPointModalSection();\n this.appendPointModalLine(locationSection, 'Direccion', point.direccion);\n this.appendPointModalLine(locationSection, 'Comuna', point.comuna_name);\n this.appendPointModalLine(locationSection, 'Provincia', point.provincia_name);\n this.appendPointModalLine(locationSection, 'Region', point.region_name);\n this.appendPointModalLine(locationSection, 'RUT', point.rut);\n if (locationSection.childElementCount) {\n fragment.appendChild(locationSection);\n }\n\n const contactSection = this.createPointModalSection();\n this.appendPointModalLine(contactSection, 'Correo', point.email);\n if (point.telefonos?.length) {\n const label = document.createElement('p');\n label.className = 'point-modal__line';\n const strong = document.createElement('span');\n strong.className = 'point-modal__label';\n strong.textContent = 'Telefonos:';\n label.appendChild(strong);\n contactSection.appendChild(label);\n\n const phoneList = document.createElement('ul');\n phoneList.className = 'point-modal__phone-list';\n point.telefonos\n .slice()\n .sort((a, b) => a.orden - b.orden)\n .forEach((phone) => {\n phoneList.appendChild(this.createPointModalPhoneItem(phone));\n });\n contactSection.appendChild(phoneList);\n }\n if (contactSection.childElementCount) {\n fragment.appendChild(contactSection);\n }\n\n if (point.adicional) {\n const extraSection = this.createPointModalSection();\n const extra = document.createElement('div');\n extra.className = 'point-modal__extra';\n extra.innerHTML = point.adicional;\n extra.querySelectorAll('a').forEach((link) => {\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n });\n extraSection.appendChild(extra);\n fragment.appendChild(extraSection);\n }\n\n const actions = this.createPointModalActions(point);\n if (actions.childElementCount) {\n fragment.appendChild(actions);\n }\n\n return fragment;\n }\n\n private createPointModalSection() {\n const section = document.createElement('div');\n section.className = 'point-modal__section';\n return section;\n }\n\n private appendPointModalLine(section: HTMLElement, label: string, value: string) {\n const normalized = (value ?? '').trim();\n if (!normalized || normalized === '#') {\n return;\n }\n const line = document.createElement('p');\n line.className = 'point-modal__line';\n const strong = document.createElement('span');\n strong.className = 'point-modal__label';\n strong.textContent = `${label}: `;\n line.appendChild(strong);\n line.appendChild(document.createTextNode(normalized));\n section.appendChild(line);\n }\n\n private createPointModalPhoneItem(phone: MapPointPhone) {\n const item = document.createElement('li');\n item.className = 'point-modal__phone-item';\n\n const label = document.createElement('span');\n label.className = 'point-modal__label';\n label.textContent = `${phone.nombre || 'Telefono'}: `;\n item.appendChild(label);\n\n const phoneNumber = (phone.telefono ?? '').trim();\n const whatsappLink = this.isWhatsappPhone(phone) ? this.getWhatsappLink(phoneNumber) : null;\n if (whatsappLink) {\n const link = document.createElement('a');\n link.href = whatsappLink;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.className = 'point-modal__link';\n link.textContent = phoneNumber;\n item.appendChild(link);\n } else {\n item.appendChild(document.createTextNode(phoneNumber));\n }\n\n return item;\n }\n\n private createPointModalActions(point: MapPoint) {\n const actions = document.createElement('div');\n actions.className = 'point-modal__section point-modal__actions';\n\n if (point.url && point.url !== '#') {\n actions.appendChild(this.createPointModalLink(point.url, 'Sitio web'));\n }\n if (point.googlelink) {\n actions.appendChild(this.createPointModalLink(point.googlelink, 'Google Maps'));\n }\n if (point.email) {\n actions.appendChild(this.createPointModalLink(`mailto:${point.email}`, 'Enviar correo', false));\n }\n\n return actions;\n }\n\n private createPointModalLink(href: string, text: string, external = true) {\n const link = document.createElement('a');\n link.href = href;\n link.className = 'point-modal__link';\n link.textContent = text;\n if (external) {\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n }\n return link;\n }\n\n private handleZoneButtonClick = (event: Event) => {\n const button = event.currentTarget as HTMLButtonElement;\n const zone = button.dataset.zone as ZoneKey;\n if (!zone) {\n return;\n }\n this.setActiveZone(zone);\n this.scrollToZoneSection(zone);\n };\n\n private setActiveZone(_zone: ZoneFilter) {}\n\n private scrollToZoneSection(zone: ZoneKey) {\n if (!this.zonesContainer) {\n return;\n }\n const section = this.zonesContainer.querySelector<HTMLElement>(`[data-zone-section=\"${zone}\"]`);\n if (!section) {\n return;\n }\n section.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n private updateZoneButtons() {\n this.zoneButtons.forEach((btn) => {\n const zone = btn.dataset.zone as ZoneKey;\n const isActive = this.activeZone === zone;\n btn.classList.toggle('is-active', isActive);\n btn.setAttribute('aria-pressed', String(isActive));\n });\n }\n\n private updateZoneButtonCounts() {\n this.zoneButtons.forEach((btn) => {\n const zone = btn.dataset.zone as ZoneKey;\n const baseLabel = btn.dataset.label || btn.textContent || '';\n btn.textContent = baseLabel;\n });\n }\n\n private updateZoneVisibility() {\n if (!this.zonesContainer) {\n return;\n }\n const sections = this.zonesContainer.querySelectorAll<HTMLElement>('[data-zone-section]');\n sections.forEach((section) => {\n section.removeAttribute('hidden');\n });\n }\n\n private handleNearestClick = () => {\n if (!navigator.geolocation) {\n alert('La geolocalizacion no esta soportada en este navegador.');\n return;\n }\n navigator.geolocation.getCurrentPosition(\n (pos) => {\n const { latitude, longitude } = pos.coords;\n const nearest = this.findNearestPoint(latitude, longitude);\n if (nearest) {\n const nearestPosition = this.getPointPosition(nearest);\n if (nearestPosition) {\n this.centerMapOnPoint(nearestPosition.lat, nearestPosition.lng);\n }\n this.scrollToPointCard(nearest.id);\n } else {\n alert('No hay puntos disponibles para calcular la tienda cercana.');\n }\n },\n () => {\n alert('No se pudo obtener tu ubicacion.');\n }\n );\n };\n\n private findNearestPoint(lat: number, lng: number): MapPoint | null {\n if (!this.points.length) {\n return null;\n }\n let nearest: MapPoint | null = null;\n let bestDistance = Infinity;\n this.points.forEach((point) => {\n const position = this.getPointPosition(point);\n if (!position) {\n return;\n }\n const distance = this.haversine(lat, lng, position.lat, position.lng);\n if (distance < bestDistance) {\n bestDistance = distance;\n nearest = point;\n }\n });\n return nearest;\n }\n\n private haversine(lat1: number, lon1: number, lat2: number, lon2: number) {\n const toRad = (deg: number) => (deg * Math.PI) / 180;\n const R = 6371e3;\n const dLat = toRad(lat2 - lat1);\n const dLon = toRad(lon2 - lon1);\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n return R * c;\n }\n\n private scrollToPointCard(pointId: number) {\n if (!this.zonesContainer) {\n return;\n }\n const card = this.zonesContainer.querySelector<HTMLElement>(`[data-point-id=\"${pointId}\"]`);\n if (!card) {\n return;\n }\n card.scrollIntoView({ behavior: 'smooth', block: 'center' });\n this.highlightPointCard(card);\n }\n\n private highlightPointCard(card: HTMLElement) {\n if (this.highlightTimeout !== null) {\n clearTimeout(this.highlightTimeout);\n this.highlightTimeout = null;\n }\n this.zonesContainer?.querySelectorAll('.point-card--highlight').forEach((el) => {\n el.classList.remove('point-card--highlight');\n });\n card.classList.add('point-card--highlight');\n this.highlightTimeout = window.setTimeout(() => {\n card.classList.remove('point-card--highlight');\n this.highlightTimeout = null;\n }, 3500);\n }\n\n private setComponentState(state: 'loading' | 'ready' | 'error') {\n if (!this.componentMessageEl || !this.mapLayoutEl) {\n return;\n }\n if (state === 'ready') {\n this.componentMessageEl.setAttribute('hidden', '');\n this.mapLayoutEl.removeAttribute('hidden');\n } else {\n const text = state === 'loading' ? 'Cargando puntos...' : 'Mapa temporalmente no disponible';\n this.componentMessageEl.textContent = text;\n this.componentMessageEl.removeAttribute('hidden');\n this.mapLayoutEl.setAttribute('hidden', '');\n }\n }\n\n private centerMapOnPoint(lat: number, lng: number, targetZoom = 14) {\n const g = (window as any).google;\n if (!g || !this.map || !Number.isFinite(lat) || !Number.isFinite(lng)) {\n return;\n }\n const currentZoom = typeof this.map.getZoom === 'function' ? this.map.getZoom() : null;\n const needsZoom = !currentZoom || currentZoom < targetZoom;\n this.animateMapPan(lat, lng, () => {\n if (needsZoom) {\n this.map.setZoom(targetZoom);\n }\n });\n }\n\n private async focusPointWithZoom(lat: number, lng: number) {\n const g = (window as any).google;\n if (!g || !this.map || !Number.isFinite(lat) || !Number.isFinite(lng)) {\n return;\n }\n\n await this.animateZoomTo(8, 800);\n await this.wait(500);\n await new Promise<void>((resolve) => {\n this.animateMapPan(lat, lng, resolve);\n });\n await this.wait(500);\n await this.animateZoomTo(18, 800);\n }\n\n private wait(ms: number) {\n return new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n }\n\n private async animateZoomTo(targetZoom: number, duration = 600) {\n const g = (window as any).google;\n if (\n !g ||\n !this.map ||\n typeof this.map.getZoom !== 'function' ||\n typeof this.map.setZoom !== 'function'\n ) {\n return;\n }\n const startZoom = this.map.getZoom();\n if (!Number.isFinite(startZoom)) {\n this.map.setZoom(targetZoom);\n return;\n }\n const delta = targetZoom - startZoom;\n if (Math.abs(delta) < 0.01) {\n this.map.setZoom(targetZoom);\n return;\n }\n\n await new Promise<void>((resolve) => {\n const startTime = performance.now();\n const ease = (t: number) => 1 - Math.pow(1 - t, 3);\n\n const step = (now: number) => {\n const elapsed = now - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const eased = ease(progress);\n const nextZoom = startZoom + delta * eased;\n this.map.setZoom(Math.round(nextZoom * 100) / 100);\n if (progress < 1) {\n requestAnimationFrame(step);\n } else {\n this.map.setZoom(targetZoom);\n resolve();\n }\n };\n\n requestAnimationFrame(step);\n });\n }\n\n private animateMapPan(targetLat: number, targetLng: number, onComplete?: () => void) {\n const g = (window as any).google;\n if (!g || !this.map) {\n return;\n }\n if (this.panAnimationFrame !== null) {\n cancelAnimationFrame(this.panAnimationFrame);\n this.panAnimationFrame = null;\n }\n const startCenter = this.map.getCenter();\n if (!startCenter) {\n this.map.setCenter({ lat: targetLat, lng: targetLng });\n onComplete?.();\n return;\n }\n const startLat = startCenter.lat();\n const startLng = startCenter.lng();\n const deltaLat = targetLat - startLat;\n const deltaLng = targetLng - startLng;\n const duration = 600;\n const startTime = performance.now();\n\n const ease = (t: number) => 1 - Math.pow(1 - t, 3);\n\n const step = (now: number) => {\n const elapsed = now - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const eased = ease(progress);\n const nextLat = startLat + deltaLat * eased;\n const nextLng = startLng + deltaLng * eased;\n this.map.setCenter({ lat: nextLat, lng: nextLng });\n if (progress < 1) {\n this.panAnimationFrame = requestAnimationFrame(step);\n } else {\n this.panAnimationFrame = null;\n onComplete?.();\n }\n };\n\n this.panAnimationFrame = requestAnimationFrame(step);\n }\n\n private static ensureFontAwesome() {\n if (RsMap.fontAwesomeAttached) {\n return;\n }\n const existing = document.querySelector(`link[href=\"${FONT_AWESOME_LOCAL_PATH}\"]`);\n if (existing) {\n RsMap.fontAwesomeAttached = true;\n return;\n }\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = FONT_AWESOME_LOCAL_PATH;\n link.crossOrigin = 'anonymous';\n link.referrerPolicy = 'no-referrer';\n link.addEventListener('load', () => {\n RsMap.fontAwesomeAttached = true;\n });\n document.head.appendChild(link);\n }\n\n private createIconElement(className: string) {\n const icon = document.createElement('i');\n icon.className = className;\n icon.setAttribute('aria-hidden', 'true');\n return icon;\n }\n\n private isWhatsappPhone(phone: MapPointPhone) {\n return Boolean(phone.whatsapp || phone.watshapp);\n }\n\n private getWhatsappLink(phone: string) {\n const digits = phone.replace(/\\D+/g, '');\n if (!digits) {\n return null;\n }\n return `https://wa.me/${digits}`;\n }\n}\n","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\r\\n<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->\\r\\n<!DOCTYPE svg PUBLIC \\\"-//W3C//DTD SVG 1.1//EN\\\" \\\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\\\">\\r\\n<svg version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" x=\\\"0px\\\" y=\\\"0px\\\" viewBox=\\\"0 0 1000 1000\\\" enable-background=\\\"new 0 0 1000 1000\\\" xml:space=\\\"preserve\\\" style=\\\"fill: #ffffff;\\\">\\r\\n<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>\\r\\n<g><path d=\\\"M965.1,437.2c-24.9-8.4-52.2-8.7-78.1-13.5c-41.3-8.3-45.5-55.5-61.6-87c-17.4-27.9-1.8-58.7,17.9-80.2c16.7-22.2,45.4-50.8,21.8-78.9c-22.1-17.9-37.3-48.8-67.4-53.1c-30.2,2.7-50,30-74.7,45.2c-33.8,26.5-71.6-3.8-105.1-14.8c-30.2-6.9-45.2-36.2-45.6-65.2c-5.5-27.6-1.1-66.3-34.8-76.6c-36.1-3.3-99-13.6-104.1,37.7c-7.8,33.8-0.3,78.4-36.1,97.9c-30.8,10.5-59.5,30.1-92.3,31.9c-38.2-5.7-59.8-46-96.2-55.8c-32.6-2.2-48.3,31.8-70.7,49.7c-23.6,20.9-7.6,51.7,9.9,70.3c18.9,24.9,47.2,54.4,28.4,87.8c-16.4,31.3-19.6,75.8-57,89.7c-29.6,7.7-62.6,3.9-89.8,18.5c-25.6,30-28.1,94.8,5.4,120.4c36.3,14.9,84.8,0.8,111.7,35.3c13.3,29.6,28.4,59.5,35.6,91.1c-0.7,43.9-48.4,67.1-58.2,107.8c9.5,38.8,52.5,81.3,96.4,74.3c33.2-16.3,57.3-56.9,98.4-51.3c30.2,11.8,62.2,21.7,89.5,39.2c29.7,30.2,13.4,78.3,33.4,112.9c29.9,25.7,94.7,28.3,120.1-5.4c14.8-36.3,0.9-84.9,35.2-111.8c29.5-13.3,59.5-28.4,91-35.6c42.3,0,64.7,46,103.3,56c32.5,2.2,48.3-31.8,70.7-49.7c24.5-22.1,6.1-53.2-11.6-72.5c-18.9-24-45-53.3-26.7-85.6c16.4-31.3,19.6-75.7,57-89.6c29.6-7.7,62.6-4,89.8-18.5C996.1,527.5,998.6,462.7,965.1,437.2z M577.6,593.4c-21.6,18-49.5,28-77.5,27.9c-79.1,3-142.8-83.6-116.4-158.4c20.6-76,121.1-111.4,184.6-64.9C634.9,439.4,640,545.6,577.6,593.4z\\\"/></g>\\r\\n</svg>\"","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\r\\n<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->\\r\\n<!DOCTYPE svg PUBLIC \\\"-//W3C//DTD SVG 1.1//EN\\\" \\\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\\\">\\r\\n<svg version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" x=\\\"0px\\\" y=\\\"0px\\\" viewBox=\\\"0 0 1000 1000\\\" enable-background=\\\"new 0 0 1000 1000\\\" xml:space=\\\"preserve\\\" style=\\\"fill: #ffffff;\\\">\\r\\n<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>\\r\\n<g><g><g><path d=\\\"M171.2,451.6c-89,0-161.2,72.2-161.2,161.2c0,89,72.2,161.2,161.2,161.2c65,0,120.9-38.6,146.4-94l38.3,29.5c0,0,281.5,2,296.9-6.7c0,0-34.9-95.4,9.4-135.7c4.7-4.2,10.5-9.1,17-14.2c-7.4,18.5-11.6,38.7-11.6,59.9c0,89,72.2,161.2,161.2,161.2c89,0,161.2-72.2,161.2-161.2c0-89.1-72.2-161.2-161.2-161.2c-1.5,0-2.9,0.2-4.3,0.2c11.6-7.6,19.1-12.3,19.1-12.3l-12.1-10.8c0,0,34.9-8,26.9-25.5c-8.1-17.5-92.7-122.3-92.7-122.3s15-32.2-16-55.1l-14.9,32.2c0,0-38-26.2-53.1-21.2c-15.1,5-37.8,7.6-44.8,18.6l-7,6.6c0,0-2,11.6,9.6,28.7c0,0,116.4,35.8,121.9,62c0,0,8.1,16.6-26.7,20.6l-7,9.1l-18.7,1l-33.7-77.1c0,0-32.3,8.6-48.9,21.7l2.5,13.1c0,0-135.5-92.2-263,44.3c0,0-94.2,27.2-160.2-56.4c0,0-1-27.2-160.2-22.2l11.1,11.6c0,0-11.1,1-15.6,8.1c-4.5,7,2.5,14.6,38.8,14.6c0,0,82.1,93.7,145.1,88.2l89.7,43.3l39.8,68c0,0,0.1,5.8,0.5,14.8c-9.2,2-19.6,4.2-30.6,6.5C302.9,497.9,242.5,451.6,171.2,451.6z M828.8,501c61.7,0,111.8,50.2,111.8,111.8c0,61.7-50.2,111.8-111.8,111.8c-61.7,0-111.8-50.2-111.8-111.8C717,551.2,767.1,501,828.8,501z M171.2,724.7c-61.6,0-111.8-50.2-111.8-111.8c0-61.7,50.2-111.8,111.8-111.8c47.4,0,87.9,29.7,104.1,71.4c-59.3,12.6-118.1,25.2-118.1,25.2l7.6,41.8l116.1-5.1C270.9,685.7,225.5,724.7,171.2,724.7z M364.8,630.6c3.3,11.2,7.6,20.1,13.2,23.9l-51.8,2c2.2-7.9,3.9-16.1,4.9-24.5L364.8,630.6z\\\"/></g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g></g>\\r\\n</svg>\"","const DEFAULT_LABEL = 'WhatsApp';\nconst DEFAULT_ARIA_LABEL = 'Contactar por WhatsApp';\nconst DEFAULT_MENU_LABEL = 'compra de motos';\nconst DEFAULT_CLOSED_MESSAGE = 'En este momento no es posible atender su solicitud. Le invitamos a contactarnos dentro de nuestro horario de atencion.';\nconst DEFAULT_WHATSAPP_COLOR = '#25d366';\nconst DEFAULT_BRAND_COLOR = '#000000';\nconst DEFAULT_OPTION_ICON = 'motorcycle';\nconst WHATSAPP_BASE_URL = 'https://wa.me/';\nconst OPTION_ICON_SVGS = import.meta.glob('../ws/*.svg', {\n eager: true,\n import: 'default',\n query: '?raw'\n}) as Record<string, string>;\nconst BRAND_COLORS: Record<string, string> = {\n gasgas: '#cb0d25',\n hqv: '#002550',\n ktm: '#ff6600',\n rs: '#000000',\n voge: '#000000'\n};\nconst BRAND_ALIASES: Record<string, string> = {\n gas: 'gasgas',\n gasgas: 'gasgas',\n husqvarna: 'hqv'\n};\nconst DAY_ALIASES: Record<string, number> = {\n '0': 0,\n '7': 0,\n dom: 0,\n domingo: 0,\n sun: 0,\n sunday: 0,\n '1': 1,\n lun: 1,\n lunes: 1,\n mon: 1,\n monday: 1,\n '2': 2,\n mar: 2,\n martes: 2,\n tue: 2,\n tuesday: 2,\n '3': 3,\n mie: 3,\n miercoles: 3,\n wed: 3,\n wednesday: 3,\n '4': 4,\n jue: 4,\n jueves: 4,\n thu: 4,\n thursday: 4,\n '5': 5,\n vie: 5,\n viernes: 5,\n fri: 5,\n friday: 5,\n '6': 6,\n sab: 6,\n sabado: 6,\n sat: 6,\n saturday: 6\n};\nconst WEEKDAY_SHORT_BY_ENGLISH: Record<string, number> = {\n sun: 0,\n mon: 1,\n tue: 2,\n wed: 3,\n thu: 4,\n fri: 5,\n sat: 6\n};\nconst OPTION_ICON_SVGS_BY_KEY = Object.fromEntries(\n Object.entries(OPTION_ICON_SVGS).map(([path, svg]) => {\n const name = path.split('/').pop()?.replace(/\\.svg$/i, '') ?? '';\n return [normalizeToken(name), normalizeIconSvg(svg)];\n })\n);\n\ninterface WhatsappMenuOption {\n label: string;\n telefono: string;\n mensaje: string;\n target: string;\n icon: string;\n}\n\nfunction normalizeIconSvg(svg: string) {\n return svg\n .replace(/<\\?xml[\\s\\S]*?\\?>\\s*/i, '')\n .replace(/<!DOCTYPE[\\s\\S]*?>\\s*/i, '')\n .replace(/<metadata>[\\s\\S]*?<\\/metadata>\\s*/i, '')\n .replace(/<svg\\b/i, '<svg class=\"menu-link-icon\" aria-hidden=\"true\" focusable=\"false\"')\n .replace(/style=\"fill:\\s*#ffffff;?\"/i, 'style=\"fill: currentColor;\"');\n}\n\nfunction normalizeToken(value: string) {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '');\n}\n\nexport class RsWhatsapp extends HTMLElement {\n static tag = 'rs-whatsapp';\n\n private root: ShadowRoot;\n private buttonEl!: HTMLButtonElement;\n private menuEl!: HTMLElement;\n private generatedOptionsEl!: HTMLElement;\n private customMenuSlotEl!: HTMLSlotElement;\n private closedMessageEl!: HTMLElement;\n private closedMessageTextEl!: HTMLElement;\n private labelEl!: HTMLSpanElement;\n private childrenObserver?: MutationObserver;\n\n static get observedAttributes() {\n return [\n 'telefono',\n 'mensaje',\n 'label',\n 'menu-label',\n 'aria-label',\n 'position',\n 'show-label',\n 'target',\n 'marca',\n 'icon',\n 'horario',\n 'fuera-horario',\n 'mensaje-fuera-horario',\n 'time-zone'\n ];\n }\n\n constructor() {\n super();\n this.root = this.attachShadow({ mode: 'open' });\n this.root.innerHTML = `\n <style>\n :host {\n position: fixed;\n right: var(--rs-whatsapp-right, 24px);\n bottom: var(--rs-whatsapp-bottom, 24px);\n z-index: var(--rs-whatsapp-z-index, 9999);\n display: inline-block;\n --rs-whatsapp-brand-color: ${DEFAULT_WHATSAPP_COLOR};\n font-family: var(--rs-whatsapp-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif);\n }\n :host([position=\"bottom-left\"]) {\n right: auto;\n left: var(--rs-whatsapp-left, 24px);\n bottom: var(--rs-whatsapp-bottom, 24px);\n top: auto;\n }\n :host([position=\"top-right\"]) {\n right: var(--rs-whatsapp-right, 24px);\n left: auto;\n bottom: auto;\n top: var(--rs-whatsapp-top, 24px);\n }\n :host([position=\"top-left\"]) {\n right: auto;\n left: var(--rs-whatsapp-left, 24px);\n bottom: auto;\n top: var(--rs-whatsapp-top, 24px);\n }\n .button {\n box-sizing: border-box;\n border: 0;\n width: var(--rs-whatsapp-size, 60px);\n min-width: var(--rs-whatsapp-size, 60px);\n height: var(--rs-whatsapp-size, 60px);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n border-radius: 999px;\n background: var(--rs-whatsapp-bg, ${DEFAULT_WHATSAPP_COLOR});\n color: var(--rs-whatsapp-color, #ffffff);\n box-shadow: var(--rs-whatsapp-shadow, 0 10px 24px rgb(0 0 0 / 22%));\n cursor: pointer;\n font: inherit;\n transition: transform 0.2s ease, box-shadow 0.2s ease, filter 0.2s ease;\n outline: none;\n }\n .button:hover,\n .button:focus-visible {\n transform: translateY(-2px);\n filter: brightness(1.03);\n box-shadow: var(--rs-whatsapp-shadow-hover, 0 14px 28px rgb(0 0 0 / 26%));\n }\n .button:active {\n transform: translateY(0);\n }\n .icon-stack {\n width: calc(var(--rs-whatsapp-size, 60px) * 0.52);\n height: calc(var(--rs-whatsapp-size, 60px) * 0.52);\n position: relative;\n flex: 0 0 auto;\n display: block;\n }\n .icon-stack svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n display: block;\n transition: opacity 0.18s ease, transform 0.22s ease;\n }\n .whatsapp-icon {\n opacity: 1;\n transform: rotate(0deg) scale(1);\n }\n .close-icon {\n opacity: 0;\n transform: rotate(-90deg) scale(0.72);\n }\n :host([open]) .whatsapp-icon {\n opacity: 0;\n transform: rotate(90deg) scale(0.72);\n }\n :host([open]) .close-icon {\n opacity: 1;\n transform: rotate(0deg) scale(1);\n }\n .label {\n display: none;\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.95rem;\n font-weight: 700;\n line-height: 1;\n }\n :host([show-label]) .button {\n width: auto;\n min-width: var(--rs-whatsapp-size, 60px);\n padding: 0 20px 0 16px;\n }\n :host([show-label]) .label {\n display: inline;\n }\n .menu {\n box-sizing: border-box;\n position: absolute;\n right: 0;\n bottom: calc(var(--rs-whatsapp-size, 60px) + 12px);\n width: min(var(--rs-whatsapp-menu-width, 280px), calc(100vw - 32px));\n padding: 8px;\n border: 1px solid var(--rs-whatsapp-menu-border, #e5e7eb);\n border-radius: var(--rs-whatsapp-menu-radius, 8px);\n background: var(--rs-whatsapp-menu-bg, #ffffff);\n color: var(--rs-whatsapp-menu-color, #111827);\n box-shadow: var(--rs-whatsapp-menu-shadow, 0 18px 38px rgb(0 0 0 / 18%));\n transform-origin: bottom right;\n }\n .menu[hidden] {\n display: none;\n }\n .menu-heading {\n padding: 10px 12px 12px;\n border-bottom: 1px solid var(--rs-whatsapp-menu-border, #e5e7eb);\n margin-bottom: 6px;\n text-align: center;\n }\n .menu-welcome,\n .menu-question {\n display: block;\n margin: 0;\n font-size: 0.92rem;\n font-weight: 600;\n line-height: 1.35;\n color: var(--rs-whatsapp-menu-muted, #4b5563);\n }\n .menu-brand {\n display: block;\n margin: 2px 0;\n font-size: 1.2rem;\n font-weight: 800;\n line-height: 1.2;\n color: var(--rs-whatsapp-menu-brand, #111827);\n }\n .menu-options {\n display: grid;\n gap: 2px;\n }\n .menu-options[hidden] {\n display: none;\n }\n .closed-message {\n margin: 0;\n padding: 14px 12px;\n border-radius: 6px;\n background: var(--rs-whatsapp-closed-bg, #f3f4f6);\n color: var(--rs-whatsapp-closed-color, #374151);\n font-size: 0.95rem;\n font-weight: 600;\n line-height: 1.35;\n text-align: center;\n white-space: pre-line;\n }\n .closed-message[hidden],\n slot[hidden] {\n display: none;\n }\n :host([position=\"bottom-left\"]) .menu {\n right: auto;\n left: 0;\n transform-origin: bottom left;\n }\n :host([position=\"top-right\"]) .menu {\n top: calc(var(--rs-whatsapp-size, 60px) + 12px);\n bottom: auto;\n transform-origin: top right;\n }\n :host([position=\"top-left\"]) .menu {\n top: calc(var(--rs-whatsapp-size, 60px) + 12px);\n right: auto;\n bottom: auto;\n left: 0;\n transform-origin: top left;\n }\n .menu-link,\n ::slotted(a),\n ::slotted(button) {\n box-sizing: border-box;\n width: 100%;\n min-height: 44px;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: 0.95rem;\n font-weight: 700;\n line-height: 1.2;\n text-align: left;\n text-decoration: none;\n cursor: pointer;\n }\n .menu-link:hover,\n .menu-link:focus-visible,\n ::slotted(a:hover),\n ::slotted(a:focus-visible),\n ::slotted(button:hover),\n ::slotted(button:focus-visible) {\n background: var(--rs-whatsapp-menu-hover-bg, #f3f4f6);\n outline: none;\n }\n .menu-link[aria-disabled=\"true\"] {\n cursor: not-allowed;\n opacity: 0.62;\n }\n .menu-link-icon {\n width: 44px;\n height: 32px;\n flex: 0 0 auto;\n color: var(--rs-whatsapp-menu-icon-color, var(--rs-whatsapp-brand-color));\n }\n @media (max-width: 640px) {\n :host {\n right: var(--rs-whatsapp-mobile-right, 16px);\n bottom: var(--rs-whatsapp-mobile-bottom, 16px);\n }\n :host([position=\"bottom-left\"]) {\n left: var(--rs-whatsapp-mobile-left, 16px);\n }\n :host([position=\"top-right\"]) {\n top: var(--rs-whatsapp-mobile-top, 16px);\n }\n :host([position=\"top-left\"]) {\n left: var(--rs-whatsapp-mobile-left, 16px);\n top: var(--rs-whatsapp-mobile-top, 16px);\n }\n :host([show-label]) .label {\n max-width: 120px;\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .button,\n .icon-stack svg {\n transition: none;\n }\n }\n </style>\n <div class=\"menu\" role=\"dialog\" aria-labelledby=\"rs-whatsapp-menu-title\" hidden>\n <div class=\"menu-heading\" id=\"rs-whatsapp-menu-title\">\n <span class=\"menu-welcome\">Bienvenido a</span>\n <span class=\"menu-brand\">RS-SHOP</span>\n <span class=\"menu-question\">¿En que te podemos ayudar?</span>\n </div>\n <div class=\"closed-message\" data-closed-message hidden>\n <slot name=\"fuera-horario\">\n <span data-closed-message-text></span>\n </slot>\n </div>\n <div class=\"menu-options\" data-generated-options></div>\n <slot name=\"menu\"></slot>\n </div>\n <button class=\"button\" type=\"button\" aria-haspopup=\"dialog\" aria-expanded=\"false\">\n <span class=\"icon-stack\" aria-hidden=\"true\">\n <svg class=\"whatsapp-icon\" viewBox=\"0 0 448 512\" focusable=\"false\">\n <path fill=\"currentColor\" d=\"M380.9 97.1c-41.9-42-97.7-65.1-157-65.1-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3 18.6-68.1-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1s56.2 81.2 56.1 130.5c0 101.8-84.9 184.6-186.6 184.6zM325.1 300.5c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8s-14.3 18-17.6 21.8c-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7s-12.5-30.1-17.1-41.2c-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2s-9.7 1.4-14.8 6.9c-5.1 5.6-19.4 19-19.4 46.3s19.9 53.7 22.6 57.4c2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4s4.6-24.1 3.2-26.4c-1.3-2.5-5-3.9-10.5-6.6z\" />\n </svg>\n <svg class=\"close-icon\" viewBox=\"0 0 24 24\" focusable=\"false\">\n <path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.6\" d=\"M6 6l12 12M18 6L6 18\" />\n </svg>\n </span>\n <span class=\"label\"></span>\n </button>\n `;\n }\n\n connectedCallback() {\n this.buttonEl = this.root.querySelector<HTMLButtonElement>('button')!;\n this.menuEl = this.root.querySelector<HTMLElement>('.menu')!;\n this.generatedOptionsEl = this.root.querySelector<HTMLElement>('[data-generated-options]')!;\n this.customMenuSlotEl = this.root.querySelector<HTMLSlotElement>('slot[name=\"menu\"]')!;\n this.closedMessageEl = this.root.querySelector<HTMLElement>('[data-closed-message]')!;\n this.closedMessageTextEl = this.root.querySelector<HTMLElement>('[data-closed-message-text]')!;\n this.labelEl = this.root.querySelector<HTMLSpanElement>('.label')!;\n this.buttonEl.addEventListener('click', this.handleButtonClick);\n this.menuEl.addEventListener('click', this.handleMenuClick);\n this.customMenuSlotEl.addEventListener('slotchange', this.handleCustomMenuSlotChange);\n document.addEventListener('click', this.handleDocumentClick);\n document.addEventListener('keydown', this.handleDocumentKeydown);\n this.childrenObserver = new MutationObserver(this.handleChildrenMutation);\n this.childrenObserver.observe(this, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true,\n attributeFilter: ['label', 'telefono', 'mensaje', 'target', 'icon', 'dias', 'desde', 'hasta']\n });\n this.syncAttributesToState();\n }\n\n disconnectedCallback() {\n this.buttonEl?.removeEventListener('click', this.handleButtonClick);\n this.menuEl?.removeEventListener('click', this.handleMenuClick);\n this.customMenuSlotEl?.removeEventListener('slotchange', this.handleCustomMenuSlotChange);\n document.removeEventListener('click', this.handleDocumentClick);\n document.removeEventListener('keydown', this.handleDocumentKeydown);\n this.childrenObserver?.disconnect();\n }\n\n attributeChangedCallback() {\n if (this.isConnected) {\n this.syncAttributesToState();\n }\n }\n\n private syncAttributesToState() {\n const label = (this.getAttribute('label') ?? '').trim() || DEFAULT_LABEL;\n const menuLabel = (this.getAttribute('menu-label') ?? '').trim() || DEFAULT_MENU_LABEL;\n const ariaLabel = (this.getAttribute('aria-label') ?? '').trim() || DEFAULT_ARIA_LABEL;\n const target = (this.getAttribute('target') ?? '_blank').trim() || '_blank';\n const icon = (this.getAttribute('icon') ?? DEFAULT_OPTION_ICON).trim() || DEFAULT_OPTION_ICON;\n const isClosed = this.isOutsideBusinessHours();\n\n this.labelEl.textContent = label;\n this.buttonEl.setAttribute('aria-label', ariaLabel);\n this.buttonEl.setAttribute('title', ariaLabel);\n this.syncBrandVariant();\n\n this.closedMessageTextEl.textContent = this.getClosedMessage();\n this.closedMessageEl.hidden = !isClosed;\n this.customMenuSlotEl.hidden = isClosed;\n\n if (isClosed) {\n this.generatedOptionsEl.hidden = true;\n this.generatedOptionsEl.replaceChildren();\n return;\n }\n\n this.renderMenuOptions(menuLabel, target, icon);\n }\n\n private buildWhatsappUrl(telefonoValue: string | null, mensajeValue: string | null) {\n const telefono = this.sanitizePhone(telefonoValue);\n\n if (!telefono) {\n return '';\n }\n\n const mensaje = (mensajeValue ?? '').trim();\n const query = mensaje ? `?text=${encodeURIComponent(mensaje)}` : '';\n\n return `${WHATSAPP_BASE_URL}${telefono}${query}`;\n }\n\n private sanitizePhone(value: string | null) {\n return (value ?? '').replace(/[^\\d]/g, '');\n }\n\n private syncBrandVariant() {\n const marca = (this.getAttribute('marca') ?? '').trim();\n\n if (!marca) {\n this.style.setProperty('--rs-whatsapp-brand-color', DEFAULT_WHATSAPP_COLOR);\n return;\n }\n\n const brandKey = this.normalizeBrandKey(marca);\n const color = BRAND_COLORS[brandKey] ?? DEFAULT_BRAND_COLOR;\n this.style.setProperty('--rs-whatsapp-brand-color', color);\n }\n\n private normalizeBrandKey(value: string) {\n const normalized = normalizeToken(value);\n return BRAND_ALIASES[normalized] ?? normalized;\n }\n\n private renderMenuOptions(fallbackLabel: string, fallbackTarget: string, fallbackIcon: string) {\n const hasCustomMenu = this.customMenuSlotEl.assignedElements({ flatten: true }).length > 0;\n\n if (hasCustomMenu) {\n this.generatedOptionsEl.hidden = true;\n this.generatedOptionsEl.replaceChildren();\n return;\n }\n\n const options = this.getWhatsappOptions(fallbackLabel, fallbackTarget, fallbackIcon).filter((option) => {\n return this.sanitizePhone(option.telefono);\n });\n const links = options.map((option) => this.createMenuLink(option));\n\n this.generatedOptionsEl.replaceChildren(...links);\n this.generatedOptionsEl.hidden = false;\n }\n\n private getWhatsappOptions(fallbackLabel: string, fallbackTarget: string, fallbackIcon: string): WhatsappMenuOption[] {\n const optionElements = Array.from(this.querySelectorAll<RsWhatsappOption>(RsWhatsappOption.tag));\n\n if (optionElements.length) {\n return optionElements.map((optionEl) => ({\n label: (optionEl.getAttribute('label') ?? optionEl.textContent ?? '').trim() || fallbackLabel,\n telefono: (optionEl.getAttribute('telefono') ?? '').trim(),\n mensaje: (optionEl.getAttribute('mensaje') ?? '').trim(),\n target: (optionEl.getAttribute('target') ?? fallbackTarget).trim() || fallbackTarget,\n icon: (optionEl.getAttribute('icon') ?? fallbackIcon).trim() || fallbackIcon\n }));\n }\n\n return [\n {\n label: fallbackLabel,\n telefono: (this.getAttribute('telefono') ?? '').trim(),\n mensaje: (this.getAttribute('mensaje') ?? '').trim(),\n target: fallbackTarget,\n icon: fallbackIcon\n }\n ];\n }\n\n private createMenuLink(option: WhatsappMenuOption) {\n const linkEl = document.createElement('a');\n const labelEl = document.createElement('span');\n const href = this.buildWhatsappUrl(option.telefono, option.mensaje);\n\n linkEl.className = 'menu-link';\n linkEl.rel = 'noopener noreferrer';\n linkEl.target = option.target;\n labelEl.className = 'menu-label';\n labelEl.textContent = option.label;\n const iconEl = this.createOptionIcon(option.icon);\n\n if (iconEl) {\n linkEl.append(iconEl);\n }\n\n linkEl.append(labelEl);\n\n if (href) {\n linkEl.href = href;\n linkEl.tabIndex = 0;\n return linkEl;\n }\n\n linkEl.setAttribute('aria-disabled', 'true');\n linkEl.tabIndex = -1;\n return linkEl;\n }\n\n private createOptionIcon(icon: string) {\n const iconKey = normalizeToken(icon);\n const iconSvg = iconKey === 'none' ? '' : OPTION_ICON_SVGS_BY_KEY[iconKey || DEFAULT_OPTION_ICON];\n\n if (!iconSvg) {\n return null;\n }\n\n const template = document.createElement('template');\n template.innerHTML = iconSvg;\n return template.content.firstElementChild?.cloneNode(true) ?? document.createElement('span');\n }\n\n private getClosedMessage() {\n const message = (this.getAttribute('mensaje-fuera-horario') ?? '').trim() || DEFAULT_CLOSED_MESSAGE;\n const scheduleSummary = this.getScheduleSummary();\n\n return scheduleSummary ? `${message}\\nHorario de atencion:\\n${scheduleSummary}` : message;\n }\n\n private isOutsideBusinessHours() {\n const manualClosedValue = this.getAttribute('fuera-horario');\n\n if (manualClosedValue !== null) {\n const normalized = normalizeToken(manualClosedValue);\n return normalized !== 'false' && normalized !== '0' && normalized !== 'no';\n }\n\n const schedule = this.getScheduleSegments().join(';');\n\n if (!schedule) {\n return false;\n }\n\n return !this.isWithinBusinessHours(schedule);\n }\n\n private getScheduleSegments() {\n const scheduleElements = Array.from(this.querySelectorAll<RsWhatsappSchedule>(RsWhatsappSchedule.tag));\n\n if (scheduleElements.length) {\n return scheduleElements\n .map((scheduleEl) => {\n const days = (scheduleEl.getAttribute('dias') ?? '').trim();\n const start = (scheduleEl.getAttribute('desde') ?? '').trim();\n const end = (scheduleEl.getAttribute('hasta') ?? '').trim();\n\n if (!days || !start || !end) {\n return '';\n }\n\n return `${days} ${start}-${end}`;\n })\n .filter(Boolean);\n }\n\n return (this.getAttribute('horario') ?? '')\n .split(';')\n .map((segment) => segment.trim())\n .filter(Boolean);\n }\n\n private getScheduleSummary() {\n const scheduleElements = Array.from(this.querySelectorAll<RsWhatsappSchedule>(RsWhatsappSchedule.tag));\n\n if (scheduleElements.length) {\n return scheduleElements\n .map((scheduleEl) => {\n const days = (scheduleEl.getAttribute('dias') ?? '').trim();\n const start = (scheduleEl.getAttribute('desde') ?? '').trim();\n const end = (scheduleEl.getAttribute('hasta') ?? '').trim();\n\n if (!days || !start || !end) {\n return '';\n }\n\n return `${days} ${start}-${end}`;\n })\n .filter(Boolean)\n .join('\\n');\n }\n\n return (this.getAttribute('horario') ?? '')\n .split(';')\n .map((segment) => segment.trim())\n .filter(Boolean)\n .join('\\n');\n }\n\n private isWithinBusinessHours(schedule: string) {\n const currentTime = this.getCurrentTimeParts();\n\n return schedule.split(';').some((segment) => {\n return this.isScheduleSegmentActive(segment, currentTime.day, currentTime.minutes);\n });\n }\n\n private getCurrentTimeParts() {\n const timeZone = (this.getAttribute('time-zone') ?? '').trim();\n\n if (!timeZone) {\n const now = new Date();\n return {\n day: now.getDay(),\n minutes: now.getHours() * 60 + now.getMinutes()\n };\n }\n\n try {\n const now = new Date();\n const weekday = new Intl.DateTimeFormat('en-US', {\n timeZone,\n weekday: 'short'\n })\n .format(now)\n .toLowerCase();\n const timeParts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n hour12: false,\n hour: '2-digit',\n minute: '2-digit'\n }).formatToParts(now);\n const hour = Number(timeParts.find((part) => part.type === 'hour')?.value ?? 0) % 24;\n const minute = Number(timeParts.find((part) => part.type === 'minute')?.value ?? 0);\n\n return {\n day: WEEKDAY_SHORT_BY_ENGLISH[weekday] ?? now.getDay(),\n minutes: hour * 60 + minute\n };\n } catch {\n const now = new Date();\n return {\n day: now.getDay(),\n minutes: now.getHours() * 60 + now.getMinutes()\n };\n }\n }\n\n private isScheduleSegmentActive(segment: string, currentDay: number, currentMinutes: number) {\n const match = segment\n .trim()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .match(/^(.+?)\\s+(\\d{1,2}:\\d{2})\\s*-\\s*(\\d{1,2}:\\d{2})$/);\n\n if (!match) {\n return false;\n }\n\n const days = this.parseScheduleDays(match[1]);\n const startMinutes = this.parseScheduleTime(match[2]);\n const endMinutes = this.parseScheduleTime(match[3]);\n\n if (!days.includes(currentDay) || startMinutes === null || endMinutes === null) {\n return false;\n }\n\n if (startMinutes <= endMinutes) {\n return currentMinutes >= startMinutes && currentMinutes <= endMinutes;\n }\n\n return currentMinutes >= startMinutes || currentMinutes <= endMinutes;\n }\n\n private parseScheduleDays(value: string) {\n const normalized = value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/\\s+/g, '');\n\n if (normalized === '*' || normalized === 'todos' || normalized === 'all') {\n return [0, 1, 2, 3, 4, 5, 6];\n }\n\n return normalized.split(',').flatMap((part) => {\n const [startToken, endToken] = part.split('-');\n const startDay = this.parseScheduleDay(startToken);\n const endDay = endToken ? this.parseScheduleDay(endToken) : startDay;\n\n if (startDay === null || endDay === null) {\n return [];\n }\n\n if (startDay === endDay) {\n return [startDay];\n }\n\n const days: number[] = [];\n let currentDay = startDay;\n\n while (true) {\n days.push(currentDay);\n\n if (currentDay === endDay) {\n return days;\n }\n\n currentDay = (currentDay + 1) % 7;\n }\n });\n }\n\n private parseScheduleDay(value: string | undefined) {\n if (!value) {\n return null;\n }\n\n const key = normalizeToken(value);\n return DAY_ALIASES[key] ?? null;\n }\n\n private parseScheduleTime(value: string) {\n const [hourValue, minuteValue] = value.split(':');\n const hour = Number(hourValue);\n const minute = Number(minuteValue);\n\n if (!Number.isInteger(hour) || !Number.isInteger(minute) || hour < 0 || hour > 23 || minute < 0 || minute > 59) {\n return null;\n }\n\n return hour * 60 + minute;\n }\n\n private setMenuOpen(isOpen: boolean) {\n this.menuEl.hidden = !isOpen;\n this.buttonEl.setAttribute('aria-expanded', String(isOpen));\n this.toggleAttribute('open', isOpen);\n }\n\n private handleButtonClick = () => {\n if (this.menuEl.hidden) {\n this.syncAttributesToState();\n }\n\n this.setMenuOpen(this.menuEl.hidden);\n };\n\n private handleMenuClick = (event: MouseEvent) => {\n const path = event.composedPath();\n const disabledLink = path.find((node) => {\n return node instanceof HTMLAnchorElement && node.getAttribute('aria-disabled') === 'true';\n });\n\n if (disabledLink) {\n event.preventDefault();\n return;\n }\n\n const interactiveElement = path.find((node) => {\n return node instanceof HTMLAnchorElement || node instanceof HTMLButtonElement;\n });\n\n if (interactiveElement) {\n this.setMenuOpen(false);\n }\n };\n\n private handleCustomMenuSlotChange = () => {\n this.syncAttributesToState();\n };\n\n private handleChildrenMutation = () => {\n this.syncAttributesToState();\n };\n\n private handleDocumentClick = (event: MouseEvent) => {\n if (this.menuEl.hidden || event.composedPath().includes(this)) {\n return;\n }\n\n this.setMenuOpen(false);\n };\n\n private handleDocumentKeydown = (event: KeyboardEvent) => {\n if (this.menuEl.hidden || event.key !== 'Escape') {\n return;\n }\n\n this.setMenuOpen(false);\n this.buttonEl.focus();\n };\n}\n\nexport class RsWhatsappOption extends HTMLElement {\n static tag = 'rs-whatsapp-option';\n}\n\nexport class RsWhatsappSchedule extends HTMLElement {\n static tag = 'rs-whatsapp-schedule';\n}\n","import { safeDefine } from './utils/define';\nimport { RsMap } from './components/rs-map';\nimport { RsWhatsapp, RsWhatsappOption, RsWhatsappSchedule } from './components/rs-whatsapp';\n\n\n// En dev, registramos directamente para probar en el navegador\nsafeDefine(RsMap.tag, RsMap);\nsafeDefine(RsWhatsappOption.tag, RsWhatsappOption);\nsafeDefine(RsWhatsappSchedule.tag, RsWhatsappSchedule);\nsafeDefine(RsWhatsapp.tag, RsWhatsapp);\n\nexport { RsMap, RsWhatsapp, RsWhatsappOption, RsWhatsappSchedule, safeDefine };\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'rs-map': RsMap;\n 'rs-whatsapp': RsWhatsapp;\n 'rs-whatsapp-option': RsWhatsappOption;\n 'rs-whatsapp-schedule': RsWhatsappSchedule;\n }\n}\n"],"names":["safeDefine","tag","Ctor","__vite_glob_1_0","__vite_glob_1_1","__vite_glob_1_2","__vite_glob_1_3","__vite_glob_1_4","__vite_glob_1_5","__vite_glob_1_6","__vite_glob_1_7","__vite_glob_1_8","__vite_glob_1_9","LOCAL_POINTS_LOADERS","PuntosMapas_gasgas_0$1","m","PuntosMapas_gasgas_1$1","PuntosMapas_hqv_0$1","PuntosMapas_hqv_1$1","PuntosMapas_ktm_0$1","PuntosMapas_ktm_1$1","PuntosMapas_voge_0$1","PuntosMapas_voge_1$1","LOCAL_MARKER_ICON_URLS","DEFAULT_BRAND_COLOR","FONT_AWESOME_LOCAL_PATH","DEFAULT_POINTS_API_URL","BRAND_COLORS","BRAND_ALIASES","TYPE_CODES","ZONE_ORDER","ZONE_LABELS","TYPE_LABELS","CONTINENTAL_CHILE_BOUNDS","DEFAULT_POINTS_CACHE_TTL_MS","POINTS_CACHE_DB_NAME","POINTS_CACHE_STORE_NAME","REGION_ZONE_MAP","_RsMap","__publicField","_a","event","zone","pos","latitude","longitude","nearest","nearestPosition","btn","_b","_c","name","_oldValue","newValue","resolve","reject","existingScript","script","params","error","g","initialCenter","firstPoint","point","position","value","normalized","days","label","normalizedCode","color","numeric","controller","marcaRequestValue","hasQuery","needsAmp","separator","requestUrl","cacheKey","cachedPayload","hasFreshCache","localFallbackPayload","response","payload","typedPayload","points","unmappablePoints","marca","tipoCode","path","existingRequest","loader","request","parsedPayload","dbEntry","raw","parsed","entry","db","result","grouped","fragment","zoneKey","section","header","title","empty","list","card","coordinateWarning","addressBlock","address","comuna","provincia","regionLine","mapPositionElement","mapActions","focusButton","icon","warning","text","details","hasDetails","actions","mapLinkElement","siteLink","emailLink","contactSection","contactTitle","phoneList","a","b","phone","item","iconWrapper","hasWhatsapp","whatsappIcon","content","numberEl","link","extra","mapWrapper","toggle","toggleIcon","toggleText","isHidden","url","iconClass","normalizedRegion","input","key","localIconUrl","pointTipoCode","fileName","lat","lng","rawCoordinates","marker","validPoints","bounds","iconUrl","markerPosition","cover","locationSection","strong","extraSection","line","phoneNumber","whatsappLink","href","external","_zone","isActive","baseLabel","bestDistance","distance","lat1","lon1","lat2","lon2","toRad","deg","dLat","dLon","pointId","el","state","targetZoom","currentZoom","needsZoom","ms","duration","startZoom","delta","startTime","ease","t","step","now","elapsed","progress","eased","nextZoom","targetLat","targetLng","onComplete","startCenter","startLat","startLng","deltaLat","deltaLng","nextLat","nextLng","className","digits","RsMap","__vite_glob_0_0","__vite_glob_0_1","DEFAULT_LABEL","DEFAULT_ARIA_LABEL","DEFAULT_MENU_LABEL","DEFAULT_CLOSED_MESSAGE","DEFAULT_WHATSAPP_COLOR","DEFAULT_OPTION_ICON","WHATSAPP_BASE_URL","OPTION_ICON_SVGS","DAY_ALIASES","WEEKDAY_SHORT_BY_ENGLISH","OPTION_ICON_SVGS_BY_KEY","svg","normalizeToken","normalizeIconSvg","RsWhatsapp","node","_d","menuLabel","ariaLabel","target","_e","isClosed","telefonoValue","mensajeValue","telefono","mensaje","query","brandKey","fallbackLabel","fallbackTarget","fallbackIcon","links","option","optionElements","RsWhatsappOption","optionEl","_f","linkEl","labelEl","iconEl","iconKey","iconSvg","template","message","scheduleSummary","manualClosedValue","schedule","scheduleElements","RsWhatsappSchedule","scheduleEl","start","end","segment","currentTime","timeZone","weekday","timeParts","hour","part","minute","currentDay","currentMinutes","match","startMinutes","endMinutes","startToken","endToken","startDay","endDay","hourValue","minuteValue","isOpen"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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"}
|
|
1
|
+
{"version":3,"file":"rs-components.iife.js","sources":["../src/utils/define.ts","../src/pin/gasgas.png?url","../src/pin/gasgas_distribuidor.png?url","../src/pin/hqv.png?url","../src/pin/hqv_distribuidor.png?url","../src/pin/ktm.png?url","../src/pin/ktm_distribuidor.png?url","../src/pin/rs.png?url","../src/pin/rs_distribuidor.png?url","../src/pin/voge.png?url","../src/pin/voge_distribuidor.png?url","../src/components/rs-map.ts","../src/ws/gear.svg?raw","../src/ws/motorcycle.svg?raw","../src/components/rs-whatsapp.ts","../src/index.ts"],"sourcesContent":["// Registro seguro para evitar DOMException por doble definición\r\nexport function safeDefine(tag: string, Ctor: CustomElementConstructor) {\r\n if (!customElements.get(tag)) customElements.define(tag, Ctor);\r\n}\r\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABXFJREFUeNrUW0tsE0cY/u0aBC3YRtCSQBCO6COkUkuqAlEuJCggwQEw5EClKsR9obZAidQeWoRIyoGqqtQEEIgL4SWBxCuckJIUzAUoqIp7SVukCkuJUah4ODYvJelj/vHs4KSJ45mdmV3/0mjt9fze+b/5/sfM7nrAkFz1vx4kh0WkVZMWYJ+z5Qo7RkmLVaVuJU2My6PZ6BA5rCNt0xgGTyQIxFHS2nWC4dFo+C7SGhT8HRrfTlqjDiA8GmiOhm/XgCsa30pAaHIlAMR4pPh50kKa3TZGWpgAEVfxZ15FxiPVLxswHlgs6WaAO88AZnwbmBd0iRrChJhjADhovDIQPDZ9vhucFwShQjYmeCWNDzKfd4MEWfA1GgTb2IXdIovIpPxoxAXIhaplZ39q+TyY/+VWmFwyJ2+d/sPH4K9THfl2LxV1BZ+EHbtkjH9l40pYcGifsF6ovEwEAGRmjTYGyM7+pNkBqPjlJ3hh+nT6faDzEtw7cx6GBtJ56T+8eE3kckIsEGXAFzKzP2vtCm58/94DcHtnq854gAyNKGcAi/wPZUZUfuYgBFYsh7/TabhR8i49V3b4e5ixYe2Eutk6+aZFwoAZOhhQLWM80h+NR0l1XOLB0DL+6W9/wD+p1MjU5PfD1IVvjNARSYvoqgSEqGoAlsnS35K7pzPpuui99c9XNpVr/qfzautODsCDji6Zy1az/QSlAEgtPgKVS+hxqO8OD2Yz16/j9H6r4wT9PJxKQ0/dp5kprF3OfxfIANnytg4XkALAvzJjTLLrOZW9gUxAxMD40tLF9HP8qx2Z/lVvwiRWJ0jQn2dPHQBIVX5jBbBcQW3OR5v4Z0n6C02WDzQKBrtsf5+w/8IyHjDRZSTpLyQ+3Rco2vaZsA76/q2PtxhZRGgF4GlPL/y5eSsUfVCft84TkhYTh45QXRMiUgj9CwUkpA7wqGZAcrxAOJav9+0/Qo8lWxroEctfjPAzV9XyPsMDKeg/fo734SvAk+dg+H4qp651PsdYlbtAbLxqsPTbb2Ba5WJ4dP0m+PyZFOcjRrzWsoenOTQq1PQ1TCGru2c9v3O6L9izg6bKbN37F7vostmqFpNXb0Dxh/U0QD7++SY9N0iC5ARjVQ5APFep27f7Oyje/jnN7RjE5m5uoMZjqYtV3azVtbTYsYy3gEFAHpy9QIsfK//jTKPxlm6wagkMJu5w41Enj8lSviP061gnp71TTo+zI/XUODQe5eWG90fU+fi7NcPZNT8ChsYPJhJcFzOHpYvnsHJ8kZXG3H1SaeGx2g2C426CFn9SB1PmzeV+bUnvD238d+4aAT89PutNwL0LnXStMFoX+2AMGbo7wP8b+2f3w9iBv9vdExDdELkNZm5+2BG8s1yhwwVQ2gsgAx4V6ezV+ecOSbs2ANgdmJibjRfdFZa5L9DqYgCExyZ1a8ylwTBOZr9UVEn2zpAbY0Gz1sXQKAYEWU0QKuTZl2YAe1an2UWzH5FVtPt8QDdI7hUqlCiZkBpZZbuPyDS6YPZtjcEWAOzmg5PVYYvdR2S8imYg6YDxSuKQbQBY5eVEQIyoeHBS5XOCl0Hy/qHpwKfaBUwHxKSdtKcNABaMTLhCs6qnRJW6gKHaQBn1dbiAbldQSn1tALDaoMXt1NfJAGtlFldMfR2g6gGA5eeIQuqHdUVUXQxQ6QqRgntlRmFWwD2+sM7xeUG/RGxQP6J7cNoBYAWSTGoMm3h1zgQDgEXwqGDKi5oYmxEArBnNc9kcVf1mmCsAYHQO5+H3YYOTYpQBVmrMtWCqMfXKrCMAMBCaxokHjXa3twoCgKx4EB+V71ucGIgjAIyKB3ET+d6Vgu8dqnoDVFb+E2AAEkYQxr2UiokAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABu9JREFUeNrMW19oU1cYP6kytras6cC6F2syGBPaoWXiqg5s9KW6DZM9aAWh7QbKYNTloWxCt9gp+CBodQ+jwmbztLGX1CHoi7Y+OOrAtWUtFAZr1JfZPpgUWyaMue/35Zw2Sf/de+45N/ngcJN7T27O9+/3/b5zk4DwSQKbokE67KDRQqNGvs6Xu/I4TGPsxexgxpd1WVY6RIcojfYVFF5PYIgkjUGbxghYVDxBo8PA7aD8II24DUMELIQ5FP/cgl2h/GUywpmyNAApjxBP0QhZTtsxGjEyRNrEzSoMKY9QH/JBeSGxZFQavPQRIJW/JvwXpESEImGsZAYoofLGjBDwmPOj2nHcGBbBmmqRyT4TYxPTXo3QpIsJFZrKB2XOO5aOtgNiaPCcaNn7Nr+/dO4TcSf1DR8hOI/rmOdSghJ8tWSj5ueuyS92JFDuhyuf8euaV6tETU2VCG2p4/c44j3O79vTwCP9eEYM3/vDVUCRUy5RFMStpwB9UYtb728lJacf9DueH37npHhIRtCQsNtU0ImAhNsPQJm7v06yd5n00+tiyb+mqbyKzIi1CNDxfnEExHuuEfhVkaITHOZIj317GgkM5wkPOr1GgOsocAuCp/QQ/41F70L5RPcRVjrn+UZ+nzPKZMF8TXEVoRUuvB+UnZ1WyWMOm1fugjWVBUdu/+5NFszXlKgVA8g+3htryS4shdKJD8R/Myk+GpagTFXjBthncpUPH89KwJu1wRCtGMBz85Ef7gM/DYlItIePFmR7WRkACO8kt1v2NhTM9yAhGwYI6q5m8ObIYq2Hcr0XfuYymKsME/we5xUXUPM9tsxWqbBrInT95m/i8MFdXPJUuVOlcEdjyBQRstcNErK+8PJF4PsDV7rYCKsJlI+2nxdZ7ykgiAwFysoA+awwQuxvq2yGVISMTfzltS0unQFUiwtqm+g+Rsh+22oYo2Ver2N0agA3GJBZDQhVLucMcGQR3FT7q9C/7+ovouPoAaa9StS5XJms4iiopaOKEIAjzsOoaq8A53DfddbqSDY4joCqba2rlRdEABRPdLfl5gZywYVe/8uuj9gAWHTzzreY+d1/8CfPD9fXiSczWfHdhZPilZdfYkVx/fXNtfy6dX8TvQ7S/Rt5sLHpCPLUn7y11nJHxMJU0nQZXLPDShKh2R/7eoUSeJ8iY4LBr/1oRIxPptnrigx1kcIAv+0NIVZaRcflqzdkmE/yPFxXRnAgjvcI3RhgfE3rkFdUTsLbHW0R8ub7nB5QPju3wKUQ5W4odU4a4DaXQCgZlLtC6zKcLZsKGKXOWnVBcNVNUJWvAD6kwyghehO1tNjwfErGqGXPVrOBMBfvf79zUVTUxRbnB0l5NQ+fm6Z7hWnu07ySGK7fzNeKO0svewJuN0SmhT8PP7wIniw32doQGRTlL0k3kyts3rxE4spJOrvCozqdIXIfGAFKDHxQ3GGJBk+I6UdPlj0XwGcAlk6Vp/CPuVnXBtcGqNr23M22ExTevXMbIf9Z8c/zf/lBSFvsPa4UmbmFxWbofM9xAsFqET30LgHcEn5l5+bdUORPqf6n3ejjuhskCw9QFCScgCGUR8mDguAIF89+zGVsf+wrkUqeFjFqfID68LJqkrbSdbUvkEP7SqdLS9Paht3qs9ED0CScKK8E4T0uPXn4YDMrj2hIP5oR7cQZQKQ6u67wUIJ5qeQXIt7zvZM19Vpth4twICg5QWg9z6v9P7BBKKoEzwdC9ZsYC2AYRAA2RqKHduWRnjoiR5XitTePO/G+1layVgTgtzpkBFh8xUfjIDDIXVBceBaKh4j3K6q8vSHMisL7YIfX5Q4QPpNPrfE5zHEgnbolQ/sXIsCC1Tg38loJmByUwACLg8fT3P9PM32GnDrxIfN8nO/rvyGvzchGq7Fg72AFGdbJfVNbYngaO7R8E/QZe1Bxe3gfqA9623vhRy516BDRA+S2y0aoIswzTgx825WrEPIeDkpg3IsCJn4ikxKaT4wMSJ/OI3EjKVDkgUwJlM/oIr8nIrRMFqYykhy1+myAY15/IGUkBfJSAVjQ4pPyAL6IiRtVGFxU3MfQ7zR1sw3GlrUw9TelQsCHKDhN3r9lLHJNr063W/Q79G2kgO1UMBr65lNgKRXSlAroFZrLOfStpYCTZqkcQt9mCgj5x4ZOg6Efs5RWFlLAfCoYITy+poDBquB6j68sUsBQr24F9f1LgUKClNXoFQ6S96dsL8+PCAAo9onc3+CcSq+XTY6yM4CUmMO2edj0P8PKwgCyNMYc5H3MR6f4gAHLS+NaDdNuU3+HK8cUUJFwZhU8iNus92VjgDw8SBfV+75SLKQkBijCg7Qf9b4sBf87NPUPUF35X4ABAKGkEPOWRpLLAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABG5JREFUeNrkW01ME0EUfm0UDxgoqOGgCa1EPWBiBZSDBwsoZxuNeNNe0JuSmBi8ABeBk3BS8EC44V9s4s2D1sQLEW09ikFqwsXESDV4QRN8L51Kf2bbnd2Z2dn4kkmbne523jff996b2d0AaLKtAQjhRxRbDFsj+15sr9lnClsm8BByOsYVUOx0GD/OYbvMcbiWERDz2JIqwQgodHwE2xUJlyPnk9iGVAARUEBzcvyGAlzJ+WkEYdRIANB5ovgzbGHFss1giyMQWRkXC0pynqj+SoPzwGJJmgHuPQOY83Og30gSPciEjGcAeOi8NBACLjWfBu+NQDjuNCYEHTofYpo3wUIs+GoNgnPsj02xKE7KXS0SwD+KGTT75RYRlYITBoyAuTanlAGGz74jFogy4DqYbyNKGMAi/7rIxb/8wBN+S4x0e+2lRWRAk91r7hD4/5jogDteAnzflON8F7r0tt9eWiSpIggp2QCcFhnwz18Aw4f5fSvYd3+18vi1CEBbPf+cMy1CeMXYfoJUACwXH7exEH1XtlI/uw/gZnteBoNF9WInCqmprvIazXjs3sn896cYwmbLwliknkngD8ClxUppPT4B0LAN3jEVEohazfT4x8rjk0fzjpDzBRkMHAC4g8f3PK/8/cX9285fWKzsv3UoD6aVrBpKmWN7VSqSBbiV3ywn4bTtBni0lnekMNjhIwALp9DBNb4DVw9aO18rpvS32GerGwZwbXy58tj6ZikrnnQDnA9XB2xlo7rzfW+s+0hunmyI0IzxZsQq8pNcXnzl91Vzvma2CXkEwMSyvd9RHCD9TnyyyAob7ljY2+IBAJlvAEucsogCHY8RROGZVXv5XqSP5ONGyCIAlCS6mc/8YLTQzR8ozXKtoohiRZcFnalGmGy3rf+cCgAyxVrmFTKD4fxskCPNdWIzUQiUSzl+H9UI7zl9naHqY5WZBf7F74ZdAOk+61q9tREH22t/HdC0M38O2YMO6z4CuLwijGoE4EPxWbUWJjToVskLHip2ovWCY5UogRT4x1LSAWBbz1kfOJ9RuSGS9AEA8yrrgHkfAJBUBgCTQcZk53XsCk8bDIDw2BzdGtsagFXQcydYxLI4+xFdawETY8GYk5OcMoDqr7RBLHA0+44ZwJ7VGTNo9hNOT3T7fACxIOqx8ymckB5PNkTQhgyYfVdjcAUAu/ngZXU45fYRmaAk/eU8cF5KHHINgIcBMSHjwUmZzwnSbfOYHwKfbAnoDog5N2lPGQAsGOmQwpisp0SlSkBTbSCN+iokoFoKUqmvDABWG0yZTn1lElC0WJJOfZUSKNQGCYnUj6uKqEFVF5YohYTvXpmRmBVojy+ucnxBUG8JF9RPqB6ccgBYgeQkNcZ1vDqngwEEAsWClGDKS2kZm66lG0uNtJtc64EWZSnPMwYUpca4Dd3HQaMFdf4Zo3W1BVOPrldmPQGAgTBqEQ+G3G5v+QKAQoSH0lvtSRYo4b8AoCweZHXkeyON3juU9QaoU/srwAB77Uga7jO8tAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hJREFUeNrkWv91sjAUTXv6v+0EuoFsIJ2gdgM2KE4gTsBxAusE6ATRCdAJaCdAJ+DLTX2U9tNWKCSB3HPeIUgE7s19+QHcMHW4F+GIcEX0TuUitqftRsROxIF1AAMRvohYRFYyuAjvJFwriS8qkD4X6elcrRACNxnWRPycEIHJ5JHTSUPkixGfHGYUvFMLZYoiPdOJaiWfaQgjRNBF3ggRHM3kiyIMdPT2qSECUMeoFJFB5ClCVeRdA8lTKEkFbrAA3ObWV+KCqAUCLMoQuqnQ85cbLu4/1jCHw8fq1nEc9vb2JrfngGMI13VlnMNms5FxAbjQQxOtP67SIlEUZYvFQpYFoQzAfhzH2SWMx+PsJwRB8Nt13SYEKLXKA0kiikA5SRJJLk3TzPO8//4ThmFOEMB+xTQItPb+IEtAq4s0kKQBYX0ZJMJgMJB1EHALOYDqX3LIL/cQNSFAei15EAE5AATpdzgA5LFPIvi+/4Us5zw/FwlDQalRrKNyZngVedgdhBAgXHQEEaU+gVoa5KhPOJcaFHDSlQJkygUAKSJebE2y9Xfgd+Q6iEMoOAVbcsUfO8GsiWHw4knFzTMhwOfj3e2W9Xq9fKjDsPb+/p4f7/f78j/AbreTQ+V6vZb1ptMp2+/3X+rgfLSP+vP5XNatg9tdHdagcXs2m7HRaJSP+SCGMsitVqvP3pTz/NhyuWQiFSQ57GP7/Pws64AsiQABUT4ej0y4hj081DPU39WZIyBPQpAIaLmnpye5j2Ovr6+yBeEO1Ad5YDgcSlFo4gRMJhN5vDhpgrN+mAQ1KsDhp0fTuKnHx0cm8lOSQGuBIAAHFGdvLy8vOSlKATgEZRCk3+ECAIKhDpwGAa+8V6tWgZVXhbdlUr1FL2Z2TQiwb5EAjdyr06IUaOyZQNIC8qWmwbclBVi1wP5LG94FaH0wGhtMPlJhMc9gAVxVeWZiZ5hUIXJrYkdTETOVF7s3zAWJDsU9G3PfxBGB68w7E16Vaf9KROfrstCE3lfXxxIpM+jbQV+DAGPTxmFuS8ene6Gk5aOoaxEoEMA3fT0e22Z9VXMDo63/HaGN1m9yscRZC+GyDk54dKTCmLUcfxkVItYBODZav461gss6hjJrhYB1ENcumznrMFyb8r7KgslhloC3fapb91Q5YhaC5geJDXl/CZ7uvP8nwAAeipVa4iJE4AAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABIlJREFUeNrkWs11ozAQlnf3bm8H7iD4treQCuKtIKSCcM0p5LgnXiqwOyCpAPu2NzsV4A5wKmD1sR4iE4k/I4HN9948jBlAM5o/jRgxc5hwsjjZnMaH3yLWh+OK05bTnl0AppxcThtOSU0KOTkHxZ2l4IsGQssoPjzrLBSBQfotCS5ThNf2gEctPgs+HRxmX81kWWw6naZHEdvtlu12u/RYAjD85rTr08w7hxmSzt58Pk8Wi0USx3FSBvCA17btMmuw+iS8dKCO4yRRFCVNgXuhvD4rQSo8N/EkDMOkLeBZeGbflGCpZr2KqdcFnqlwi7gs7uiK9rFMeN3AOyRK2JhWQNCF8CVK8E0Jb+dfDtM0CbgDT6MyJRhxhVB86WQyOSnSN8Vms1GVz2Zn3/f9pCt4nmfcCoJ8uusScAVYYE4BC12lMEX+DLxiYzwgFd603/9f1fKBZiUvSmFVyYtroNVqxdbrtZTn+vqa8biT/n5+fmbcEo5eyemnjtmf582tSr5HJUcZAgUNZQxFEEspCILChRFMX6wWJTy2DgX4+fq+LFWRoCD8hstAOJgt6v08XNfNBMQR51UgUaanPfoXBT8xT2PWRV9F9AaREjCD4AFR3U9KKrKQkmAY6FDAUeWnqvUhPK3+wEcpkiwAwlMag5BQpCisWFOQYojINfJ1h8RltFSGpf5PJg+BQJQlyCJIUIoJNNMQjsxY5hpi1JcpgGJLjvQqQCY8CS7Opmo5i/9huhAcioKl4EhWUTUIEpoqYFRTAZ8nyecpOjn39/ef1RJPUUh/lOootYn8IOoQgff29jblQVrDfyIPnkfnuPbw8HD0vFSQ0aiRbD9a6YAe8jbyMY7j8TirAZD/IRyf8Yz/5uYmu3Z3d8fe3t5S4XCOI3eNlIcUQe8gntlsxrg7fKk1mqCxAjCY/CxAeNDT01NW+IAPAuIchQ0Exgy+v7+nvLgG4Pzj4+NIGO4K7PX1Nb0mCktFkNhPNKGAvdiazisAg+LBKDVhDBLXISAAC8B1GvjLy0s26Kurq8wFyB3INWAFABSG/6E8WeUpsYC99jpAFoi6AhVQTVaF3+pYfVtm1zbI0nKt89bhNlkL6IZiLeDosIAval4ul53PPuJJlbG2hegM+gG1yuDvDTY9f4nRFwVIPi2ZwuPjo8z//3D6a2wvoGc9QSON0S97/ajnTQZEvEuxUxSYsDxHtSNkCgXdJGO+GHWhBMx8wWZpZDL+eKqlKpbAOtwBcaaoj1gn97e1NxipBoPAmG9bnQI0SYpaZKZnv/S7ANEaTtkmx70lH0oY9/3SjCAjmC66PFXSJdIbeBVRvvXtsFO/EbLrDgB9ASx16UgLK+ogNWhuzHQtfhpvlRskn/UA0o8lDFDMevTtoNuBAuasZwgNCh+yHsIyaPpT1lN4BhTgsp5jMzTTl9UGgzP9PPwhmn7lxdKlmr4uV+hVwdOFK8zZmeOUrBCwC4A1RNNvY61gswtDnbWCxy4QVZfNIbtg2EPy+yYLJosNBOG5l7ptl8oBGyCoPoiG4PcqOF37/T8BBgCThigH5VpvfwAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABJZJREFUeNrsW79PE1Ec/9ZWfoWDm4yLeOwidZaEDg4mLDiqgx1hsk7oRJmECV10BBZ0McUB49aSYOJgUrAOJg4t8Ae0iAFKgPN966Fce+/uvbt77+6on+RLmvbufd/3+76/7wBoc8Qk8VEJpQiNEkoapDZdUyO0YdAaoYLxXaSBQucI6S4pZ6wRScGLHgRvpnxUFKF6PHEWi1DDGgOSxgY1R/MY6QG1/xIkb/5hv/FVh9ruKRTW91n4VAjdM2JFaJAmVKWdnNqf0DOTffrGepeu18CW8Bq8Fu+xsYSqwTM0wlMFX3ytOApNI7zXQRGBKyFJO/n0A0WvbsddC39GuAauZWMJySADXtlqY15O3c4abJSgBqGAnCzhGZSQCyLPSxWeQQlS64S8lc+LFv6MKDGhLKsOSBkK+BcM+hNQLumg9p1AZacDtrYTtgtcHzgG7dqRa+3Xfsbh1kgCKtv15p+wPliR7vvnTX9+VnGs6DC1lUsdIlwhJyPym5hqA50taQu/c1ICqQY9uwKFD1dGSLgwf3MV9LCD/P1niugG+dU4cYMe24UeP9Uhxpm8ss8UmJ7aM/HOPm9xg3FCi6IsYL5Z4yzlrRWhCzhUeY5ug7wtrp0XaQHJ5uA3fOOQevH7D72wUYrZBsM0Nkaq7sx4SCeB85fpO+SNe6jtHlP36De4/JhyQiYaH+v1FAdwDxbrMiPOqYCsydnGuuHunTr14qtXjiEWU0ibS095338cEQtQoF5PwNbO5RbaJSkP16Fhs9QNn7+07GFGlAuYUwKD6WLQmp6i/772qQdSY3v0oDOr2LoZyx7scCnodnL09n5DSCsQ94DMxJ5Q/glZgmJAfPHqlPLrCZCcbqTUc6lych/CBk/FzPBQt21AXFnulR4EeV2gYBrObZ9w3byyfNJIW9TR0uQhLL1RGv0EKyz2UBCpgIqZeZ1rs9gAVbeOgZxcC5HavpHPM08PiJLYFIu8LRqiikgFrLWc6mqnL7716P4eZCb7iCK6GuU0k0VZ814TGQM0p2bISxnMO1OgNEOa6EBY9GMS1Nw2o0J4hqiUdrgoIxNk/LCC5gjOmwEop5+RoQDNKoWRVtW1K+CDEJ77kBcllWogCXm/8jjvZAh5AP0BqrRSeImWxze/dfGZE8dsENdGHjx7EokqbXDhxhJYTt5mgFJ2K0TcgwK6rUZkh/VTePvuqNEGp0aOfNH0zJwCE09+Ndam4CVvBShkQGqVHQqr7oefeC/DgDWwR2OIBZZ5HjZBmPdZAh5egzneqXE6R1kvAnh9QULj9T8iGAwOxP++HHEGfEmiTBqbzdIB1zMSQoMQ8MtUCyDulRihpy+0MJJAvvh+3AcF1AxXSklW/Byhj2GZFKlg846QACoHGfmZmySBlIaQoixB+DyEGCkJCkhCyCHyTdF5iAA0QQGxGsbAR0O2nQIf8+zwogY+GpI+mr4GEYUfrpCBiKPYbqbvlytE2vT9cIUMXDAU28303RZIkSp4eJFmUMA4XHAsRL3W92N4YhUPitBGaP5fowuV8tzEg8D8PhGgAhYJDRufV+A/gsFvAQYAGFubR/xBobMAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA9xJREFUeNrsWz124jAQHjY5gEtK7wkwJ1hKSvYGvkGcE4Qtt+JxAucGpkxn6NKZdOnMDUyZzqvhmd2gSLJk/dmw33vzSBxjSaOZb37kANw4Ro7GCYjMiPwgEjUSUPcciewb2RHZNtcGDVx0RqTuKFnzjEEuvNBYOC35UBQRaO64jEUEfeWAqJlg2GoesxkEQQBRFJ1+3+/3cDweYbvdyoxzIPKz4YreICZS8XaOLLZOkqQuiqJuA96D9+J3BJZQNWP2ZvHchadpWncFfrdFEd6VEPF2Po7juqqqWhf4DHyWwBIin4RXsiams+siaxAoIfChgMzV4iWUkPmI804XL6EEp3lCzvJ5V+BwQukqD5g1CvhHBiSml2V5+jwcDicRIQzDk3QF5gzT6ZQ1DuYHG+e+/9n0V6tVa0aHoY0ozIYrZC6Y/2JQspNfwhZea1MCyQa1XYEzjlJEuO9g/pdZUHyZi6Ab5Hne6gaPj48wGql54HK5hKenp4ux8RqFBZFnWxawojUuk96ygC7QkuW1ug2Ozbh3ZdMCInq3zwUNC5vNBt7e3oRkeC6M2jCZTL4QJ46N30VS5M3RNJT8mLNDF7JYLLR4AOfAeK407hQVcOFwZPIwn8+5N4/H45Ofi8rc9/f30y5+fHz8DaGfBXcXn8MDWtjr6yt9+ZcTCyAEpM3khDCFFoJhVQScg44FfPPeOyMcQBbJ/BtaWJIkVse/d7VQJMT1ei0kRDqkPjw89K7np5XMENYWmnuWZc5JUKsIorNA3dh/7iCppMmMbDC3qYCUnrRuTk/n9qgE2U4Sjs1QZGqTBHcs3zbSWCT+j4RHFCGVGAnG3tm0gLCtGNJxBdWeAqcYCm0TYWGiE0SXzSqmLyiHCxeRIDFhBTSDq0YAzu4nLhQQshi8S1Z4dgU8CFEBJ/tzYv7cnmDXOK4aRXAM4B+g+j0Nwt3s2h+QAT5bkEc4PyWqeEroYgkyOy9YfAkesBSltSYqRQmfP8vS19GYcGLI1Fju6pTKEg1Wb0djzNSYJVgEYdyXITy8B2N8W+FkavdHBkKikv9hHw9LX7qXiC9JYAcIP1XOSIh8B88vU6Vg75WYXvq+VGLkQIz4/p0BBRwbV5o5VvxvIi996RQFIHhHyIKUPplfukiyKDH0FKWDxefQY8wcKCCCnsPmm6IrGABCS4RY9ZH4OhVK10Z80r3DayU+btpv0PRDGChMuEICA0dxa6ZvyhUGbfomXCGBK0Nxa6bfNUEaVMKjilhCAQu4cqRDz/VNNE9YfFDADYH+X6OrCnld+MCb3997VMAzkUnz8wb+ww/+CDAA4q4zpysTtacAAAAASUVORK5CYII=\"","type ZoneKey = 'norte' | 'rm' | 'centro' | 'sur';\ntype ZoneFilter = ZoneKey | 'all';\n\nconst LOCAL_POINTS_LOADERS = import.meta.glob('../json/PuntosMapas_*.json', {\n import: 'default'\n}) as Record<string, () => Promise<unknown>>;\n\nconst LOCAL_MARKER_ICON_URLS = import.meta.glob('../pin/*.png', {\n eager: true,\n import: 'default',\n query: '?url'\n}) as Record<string, string>;\n\ninterface MapPointPhone {\n id: number;\n dist: number;\n telefono: string;\n nombre: string;\n whatsapp: number;\n watshapp?: number;\n orden: number;\n}\n\ninterface MapPointApi {\n id: number;\n titulo: string;\n rut: string;\n direccion: string;\n comuna: number;\n tipo: number;\n lat: string;\n lng: string;\n url: string;\n email: string;\n adicional: string;\n portada: string;\n googlelink: string;\n activo: number;\n marca: number;\n comuna_name: string;\n provincia_name: string;\n region_name: string;\n telefonos: MapPointPhone[];\n}\n\ninterface MapPoint extends MapPointApi {\n zone: ZoneKey;\n}\n\ninterface MapPosition {\n lat: number;\n lng: number;\n}\n\ninterface PointsCacheEntry {\n timestamp: number;\n data: MapPointApi[];\n}\n\ninterface PointsCacheRecord extends PointsCacheEntry {\n key: string;\n}\n\nconst DEFAULT_BRAND_COLOR = '#000000';\nconst FONT_AWESOME_LOCAL_PATH = '/assets/fontawesome/css/all.min.css';\nconst DEFAULT_POINTS_API_URL = 'https://ap2.rs-shop.cl/web/PuntosMapas';\nconst BRAND_COLORS: Record<string, string> = {\n gasgas: '#cb0d25',\n ktm: '#ff6600'\n};\nconst BRAND_ALIASES: Record<string, string> = {\n gas: 'gasgas',\n gasgas: 'gasgas',\n husqvarna: 'hqv'\n};\nconst TYPE_CODES: Record<string, number> = {\n sucursal: 0,\n distribuidor: 1\n};\nconst ZONE_ORDER: ZoneKey[] = ['norte', 'rm', 'centro', 'sur'];\nconst ZONE_LABELS: Record<ZoneKey, string> = {\n norte: 'Zona Norte',\n rm: 'RM',\n centro: 'Zona Centro',\n sur: 'Zona Sur'\n};\nconst TYPE_LABELS: Record<number, string> = {\n 0: 'Sucursales',\n 1: 'Distribuidores'\n};\nconst CONTINENTAL_CHILE_BOUNDS = {\n minLat: -56.5,\n maxLat: -17,\n minLng: -76,\n maxLng: -66\n};\nconst DEFAULT_POINTS_CACHE_TTL_MS = 30 * 24 * 60 * 60 * 1000;\nconst POINTS_CACHE_DB_NAME = 'rs-map-cache';\nconst POINTS_CACHE_STORE_NAME = 'points';\nconst REGION_ZONE_MAP: Record<string, ZoneKey> = {\n 'region de arica y parinacota': 'norte',\n 'arica y parinacota': 'norte',\n 'region de tarapaca': 'norte',\n tarapaca: 'norte',\n 'region de antofagasta': 'norte',\n antofagasta: 'norte',\n 'region de atacama': 'norte',\n atacama: 'norte',\n 'region de coquimbo': 'norte',\n coquimbo: 'norte',\n 'region de valparaiso': 'centro',\n valparaiso: 'centro',\n 'region del libertador general bernardo o higgins': 'centro',\n \"region del libertador general bernardo o'higgins\": 'centro',\n \"libertador bernardo o'higgins\": 'centro',\n ohiggins: 'centro',\n 'region del maule': 'centro',\n maule: 'centro',\n 'region de nuble': 'centro',\n nuble: 'centro',\n 'region del biobio': 'centro',\n biobio: 'centro',\n 'region metropolitana de santiago': 'rm',\n 'region metropolitana': 'rm',\n 'rm': 'rm',\n santiago: 'rm',\n 'region de la araucania': 'sur',\n araucania: 'sur',\n 'region de los rios': 'sur',\n 'los rios': 'sur',\n 'region de los lagos': 'sur',\n 'los lagos': 'sur',\n 'region de aysen del general carlos ibanez del campo': 'sur',\n 'region de aysen': 'sur',\n aysen: 'sur',\n 'region de magallanes y la antartica chilena': 'sur',\n magallanes: 'sur'\n};\n\nexport class RsMap extends HTMLElement {\n static tag = 'rs-map';\n private static googleMapsLoaderPromise: Promise<void> | null = null;\n private static pointsCacheDbPromise: Promise<IDBDatabase | null> | null = null;\n private root: ShadowRoot;\n private mapEl!: HTMLDivElement;\n private map: any;\n private pointModalOverlayEl!: HTMLElement;\n private pointModalTitleEl!: HTMLElement;\n private pointModalBodyEl!: HTMLElement;\n private pointModalCloseButton!: HTMLButtonElement;\n private markers: any[] = [];\n private marca = '';\n private marcaKey = 'default';\n private tipo = '';\n private tipoCode: number | null = null;\n private pointsController?: AbortController;\n private points: MapPoint[] = [];\n private pointsByZone: Record<ZoneKey, MapPoint[]> = {\n norte: [],\n rm: [],\n centro: [],\n sur: []\n };\n private initialViewApplied = false;\n private zonesContainer!: HTMLElement;\n private componentMessageEl!: HTMLElement;\n private mapLayoutEl!: HTMLElement;\n private zoneButtons: HTMLButtonElement[] = [];\n private nearestButton!: HTMLButtonElement;\n private panelTitleEl!: HTMLElement;\n private activeZone: ZoneFilter = 'all';\n private mapHeight = '';\n private googleMapsApiKey = '';\n private pointsApiUrl = DEFAULT_POINTS_API_URL;\n private markerIconBaseUrl = '';\n private defaultMarkerIconUrl = '';\n private pointsCacheTtlMs = DEFAULT_POINTS_CACHE_TTL_MS;\n private static fontAwesomeAttached = false;\n private panAnimationFrame: number | null = null;\n private highlightTimeout: number | null = null;\n private isSyncingInitialAttributes = false;\n private refreshQueued = false;\n private localPointsRequests = new Map<string, Promise<MapPointApi[] | null>>();\n\n static get observedAttributes() {\n return [\n 'marca',\n 'tipo',\n 'height',\n 'google-maps-key',\n 'points-api-url',\n 'cache-days',\n 'marker-icon-base',\n 'marker-icon-default'\n ];\n }\n\n constructor() {\n super();\n RsMap.ensureFontAwesome();\n this.root = this.attachShadow({ mode: 'open' });\n this.root.innerHTML = `\n <link rel=\"stylesheet\" href=\"${FONT_AWESOME_LOCAL_PATH}\" />\n <style>\n :host {\n display: block;\n position: relative;\n width: 100%;\n height: var(--map-height, 520px);\n --rs-map-accent: ${DEFAULT_BRAND_COLOR};\n }\n .map-layout {\n display: grid;\n grid-template-columns: minmax(0, 2.5fr) minmax(220px, 1fr);\n gap: 16px;\n width: 100%;\n height: 100%;\n }\n .map-panel,\n #map {\n width: 100%;\n height: 100%;\n animation: mapSlide 90s infinite;\n animation-timing-function: ease-in-out; \n }\n .map-panel {\n border-radius: 8px;\n overflow: hidden;\n border: 2px solid var(--rs-map-accent);\n }\n #map {\n background: #f5f5f5;\n }\n .component-shell {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .component-message {\n margin: 0;\n font-size: 1rem;\n color: #555;\n text-align: center;\n padding: 24px 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n .component-message[hidden] {\n display: none;\n }\n .map-layout[hidden] {\n display: none;\n }\n .points-panel {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n border-top: 4px solid var(--rs-map-accent);\n padding: 16px;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n background: #fff;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .panel-message {\n margin: 0;\n font-size: 0.95rem;\n color: #555;\n text-align: center;\n padding: 32px 12px;\n }\n .panel-content[hidden] {\n display: none;\n }\n .points-panel h2 {\n margin: 0 0 8px;\n font-size: 1rem;\n color: var(--rs-map-accent);\n }\n .zone-filters {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n overflow-x: auto;\n padding-bottom: 8px;\n flex-wrap: nowrap;\n }\n .zone-button {\n border: 1px solid var(--rs-map-accent);\n border-radius: 999px;\n padding: 6px 12px;\n font-size: 0.85rem;\n background: transparent;\n color: var(--rs-map-accent);\n cursor: pointer;\n transition: background 0.2s ease, color 0.2s ease;\n text-align: center;\n white-space: nowrap;\n }\n .zone-button:hover,\n .zone-button:focus-visible {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .zone-button.is-active {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .zone-button--secondary {\n flex-shrink: 0;\n border-color: #444;\n color: #444;\n }\n .zone-button--secondary i {\n margin-right: 6px;\n }\n .panel-header {\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n }\n .panel-header h2[data-panel-title] {\n margin: 0;\n font-size: 1.25rem;\n }\n .zones-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n overflow-y: auto;\n }\n .zone-section {\n border-top: 2px solid #eee;\n padding-top: 12px;\n }\n .zone-section[hidden] {\n display: none;\n }\n .zone-section__header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n margin: 0 0 8px;\n font-weight: 600;\n color: #333;\n }\n .zone-section__empty {\n margin: 0;\n font-size: 0.85rem;\n color: #777;\n }\n .zone-section__list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .point-card {\n border: 1px solid #e6e6e6;\n border-radius: 8px;\n padding: 10px;\n background: #fff;\n display: flex;\n flex-direction: column;\n gap: 6px;\n overflow: hidden;\n transition: border 0.2s ease, box-shadow 0.2s ease;\n }\n .point-card--highlight {\n border: 2px solid var(--rs-map-accent);\n box-shadow: 0 0 0 2px rgba(30, 136, 229, 0.2);\n animation: highlightFade 3s forwards;\n }\n @keyframes highlightFade {\n 0% {\n border-color: var(--rs-map-accent);\n box-shadow: 0 0 0 2px rgba(30, 136, 229, 0.2);\n }\n 80% {\n border-color: #111;\n box-shadow: 0 0 0 2px rgba(17, 17, 17, 0.2);\n }\n 100% {\n border-color: #e6e6e6;\n box-shadow: none;\n }\n }\n .point-card__title {\n margin: -10px -10px 8px;\n padding: 10px;\n font-size: 0.95rem;\n font-weight: 600;\n text-align: center;\n color: #fff;\n background: var(--rs-map-accent);\n }\n .point-card__focus {\n border: 1px solid var(--rs-map-accent);\n border-radius: 999px;\n padding: 4px 12px;\n font-size: 0.8rem;\n background: transparent;\n color: var(--rs-map-accent);\n cursor: pointer;\n }\n .point-card__focus:hover,\n .point-card__focus:focus-visible {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .point-card__map-actions {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n align-self: flex-start;\n margin-top: 8px;\n }\n .point-card__mobile-navigation {\n display: none;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n }\n .point-card__mobile-nav-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: 1px solid var(--rs-map-accent);\n border-radius: 999px;\n padding: 4px 12px;\n background: var(--rs-map-accent);\n color: #fff;\n font-size: 0.8rem;\n text-decoration: none;\n }\n .point-card__mobile-nav-link:hover,\n .point-card__mobile-nav-link:focus-visible {\n filter: brightness(0.94);\n }\n .point-card__coordinate-warning {\n display: flex;\n align-items: center;\n gap: 6px;\n border: 1px solid #d6dbe3;\n border-radius: 999px;\n padding: 4px 12px;\n background: #f8fafc;\n color: #4b5563;\n font-size: 0.8rem;\n line-height: 1.35;\n align-self: flex-start;\n margin-top: 8px;\n }\n .point-card__coordinate-warning i {\n color: #6b7280;\n }\n @media (max-width: 768px) {\n .map-layout {\n grid-template-columns: 1fr;\n }\n .map-panel {\n display: none;\n }\n .panel-header {\n flex-direction: column;\n align-items: stretch;\n }\n .zone-filters {\n flex-wrap: wrap;\n }\n .point-card__focus {\n display: none;\n }\n .point-card__mobile-navigation {\n display: flex;\n }\n }\n .point-card__address,\n .point-card__meta,\n .point-card__contact {\n margin: 0;\n font-size: 0.85rem;\n color: #555;\n }\n .point-card__contact {\n margin: 0 0 6px;\n font-size: 0.85rem;\n color: #555;\n }\n .point-card__contact-title {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n color: #333;\n margin-bottom: 4px;\n }\n .point-card__phone-list {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .point-card__phone-item {\n display: flex;\n gap: 8px;\n align-items: flex-start;\n }\n .point-card__phone-icon {\n width: 16px;\n display: inline-flex;\n justify-content: center;\n color: var(--rs-map-accent);\n font-size: 0.85rem;\n }\n .point-card__phone-content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .point-card__phone-name {\n font-weight: 600;\n color: #333;\n }\n .point-card__phone-number {\n font-family: 'Segoe UI', system-ui, sans-serif;\n font-size: 0.85rem;\n }\n .point-card__phone-number--link {\n color: var(--rs-map-accent);\n text-decoration: none;\n }\n .point-card__phone-number--link:hover,\n .point-card__phone-number--link:focus-visible {\n text-decoration: underline;\n }\n .point-card__address-block {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .point-card__details {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-top: 6px;\n }\n .point-card__details[hidden] {\n display: none;\n }\n .point-card__toggle {\n border: 1px solid var(--rs-map-accent);\n border-radius: 16px;\n padding: 4px 10px;\n background: transparent;\n color: var(--rs-map-accent);\n font-size: 0.8rem;\n cursor: pointer;\n align-self: flex-start;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n .point-card__toggle:hover,\n .point-card__toggle:focus-visible {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .point-card__actions {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n margin-top: 8px;\n }\n .point-card__action {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 0.8rem;\n }\n .point-card__actions a.point-card__action {\n color: var(--rs-map-accent);\n text-decoration: none;\n border-bottom: 1px solid transparent;\n }\n .point-card__actions a.point-card__action:hover,\n .point-card__actions a.point-card__action:focus-visible {\n border-color: currentColor;\n }\n .point-card__actions .point-card__action i {\n font-size: 0.85rem;\n }\n .point-card__actions .point-card__action--text {\n color: #444;\n }\n .point-card__extra {\n margin: 0;\n font-size: 0.8rem;\n color: #444;\n }\n .point-card__extra a {\n color: var(--rs-map-accent);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n }\n .point-card__extra a:hover,\n .point-card__extra a:focus-visible {\n color: #444;\n text-decoration: underline;\n }\n .point-card__extra-icon {\n font-size: 0.75rem;\n }\n .empty-state {\n margin: 0;\n font-size: 0.9rem;\n color: #777;\n text-align: center;\n }\n .points-panel p {\n margin: 0;\n color: #666;\n font-size: 0.9rem;\n }\n .point-modal-overlay {\n position: absolute;\n inset: 0;\n z-index: 30;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n background: rgba(0, 0, 0, 0.48);\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n }\n .point-modal-overlay[hidden] {\n display: none;\n }\n .point-modal {\n width: min(560px, 100%);\n max-height: calc(100% - 16px);\n border-radius: 8px;\n overflow: hidden;\n background: #f7f7fb;\n color: #151515;\n box-shadow: 0 18px 48px rgba(0, 0, 0, 0.32);\n display: flex;\n flex-direction: column;\n }\n .point-modal__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 14px 18px;\n background: #000;\n color: #fff;\n }\n .point-modal__title {\n margin: 0;\n font-size: 1.15rem;\n font-weight: 700;\n line-height: 1.2;\n }\n .point-modal__close {\n border: 0;\n width: 34px;\n height: 34px;\n border-radius: 50%;\n background: transparent;\n color: #fff;\n cursor: pointer;\n font-size: 1.1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .point-modal__close:hover,\n .point-modal__close:focus-visible {\n background: rgba(255, 255, 255, 0.14);\n }\n .point-modal__body {\n padding: 20px 24px 24px;\n overflow-y: auto;\n line-height: 1.45;\n }\n .point-modal__cover {\n width: calc(100% + 48px);\n max-height: 300px;\n object-fit: cover;\n margin: -20px -24px 18px;\n display: block;\n background: #e5e7eb;\n }\n .point-modal__section {\n margin: 0 0 20px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .point-modal__section:last-child {\n margin-bottom: 0;\n }\n .point-modal__line {\n margin: 0;\n font-size: 0.95rem;\n color: #242424;\n }\n .point-modal__label {\n font-weight: 700;\n }\n .point-modal__phone-list {\n list-style: none;\n padding: 0;\n margin: 4px 0 0;\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n .point-modal__phone-item {\n font-size: 0.94rem;\n color: #222;\n }\n .point-modal__extra {\n margin: 0;\n font-size: 0.94rem;\n color: #242424;\n }\n .point-modal__extra a,\n .point-modal__link {\n color: #111;\n font-weight: 600;\n text-decoration: none;\n border-bottom: 1px solid currentColor;\n }\n .point-modal__extra a:hover,\n .point-modal__extra a:focus-visible,\n .point-modal__link:hover,\n .point-modal__link:focus-visible {\n color: var(--rs-map-accent);\n }\n .point-modal__actions {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n }\n @media (max-width: 768px) {\n .point-modal-overlay {\n position: fixed;\n }\n .point-modal {\n max-height: calc(100dvh - 24px);\n }\n .point-modal__body {\n padding: 16px 18px 20px;\n }\n .point-modal__cover {\n width: calc(100% + 36px);\n margin: -16px -18px 16px;\n }\n }\n </style>\n <div class=\"component-shell\">\n <p class=\"component-message\" data-component-message>Cargando puntos...</p>\n <div class=\"map-layout\" data-map-layout hidden>\n <div class=\"map-panel\">\n <div id=\"map\"></div>\n </div>\n <aside class=\"points-panel\" aria-live=\"polite\">\n <div class=\"zone-filters\" role=\"group\" aria-label=\"Filtrar por zona\">\n <button class=\"zone-button\" type=\"button\" data-zone=\"norte\" data-label=\"Zona Norte\" aria-pressed=\"false\">Zona Norte</button>\n <button class=\"zone-button\" type=\"button\" data-zone=\"rm\" data-label=\"RM\" aria-pressed=\"false\">RM</button>\n <button class=\"zone-button\" type=\"button\" data-zone=\"centro\" data-label=\"Zona Centro\" aria-pressed=\"false\">Zona Centro</button>\n <button class=\"zone-button\" type=\"button\" data-zone=\"sur\" data-label=\"Zona Sur\" aria-pressed=\"false\">Zona Sur</button>\n </div>\n <div class=\"panel-header\">\n <h2 data-panel-title>Puntos del mapa</h2>\n <button class=\"zone-button zone-button--secondary\" type=\"button\" data-action=\"nearest\">\n <i class=\"fa-solid fa-location-dot\" aria-hidden=\"true\"></i>\n Buscar tienda cercana\n </button>\n </div>\n <div class=\"zones-container\" data-zone-container></div>\n </aside>\n </div>\n </div>\n <div class=\"point-modal-overlay\" data-point-modal-overlay hidden>\n <section class=\"point-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"rs-map-point-modal-title\">\n <header class=\"point-modal__header\">\n <h2 class=\"point-modal__title\" id=\"rs-map-point-modal-title\" data-point-modal-title></h2>\n <button class=\"point-modal__close\" type=\"button\" data-point-modal-close aria-label=\"Cerrar\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </header>\n <div class=\"point-modal__body\" data-point-modal-body></div>\n </section>\n </div>\n `;\n }\n\n connectedCallback() {\n this.mapEl = this.root.querySelector<HTMLDivElement>('#map')!;\n this.panelTitleEl = this.root.querySelector<HTMLElement>('[data-panel-title]')!;\n this.zonesContainer = this.root.querySelector<HTMLElement>('[data-zone-container]')!;\n this.componentMessageEl = this.root.querySelector<HTMLElement>('[data-component-message]')!;\n this.mapLayoutEl = this.root.querySelector<HTMLElement>('[data-map-layout]')!;\n this.pointModalOverlayEl = this.root.querySelector<HTMLElement>('[data-point-modal-overlay]')!;\n this.pointModalTitleEl = this.root.querySelector<HTMLElement>('[data-point-modal-title]')!;\n this.pointModalBodyEl = this.root.querySelector<HTMLElement>('[data-point-modal-body]')!;\n this.pointModalCloseButton = this.root.querySelector<HTMLButtonElement>('[data-point-modal-close]')!;\n this.zoneButtons = Array.from(this.root.querySelectorAll<HTMLButtonElement>('[data-zone]'));\n this.nearestButton = this.root.querySelector<HTMLButtonElement>('[data-action=\"nearest\"]')!;\n this.zoneButtons.forEach((btn) => btn.addEventListener('click', this.handleZoneButtonClick));\n if (this.nearestButton) {\n this.nearestButton.addEventListener('click', this.handleNearestClick);\n }\n this.pointModalOverlayEl.addEventListener('click', this.handlePointModalOverlayClick);\n this.pointModalCloseButton.addEventListener('click', this.closePointModal);\n window.addEventListener('keydown', this.handlePointModalKeydown);\n this.updateZoneButtons();\n this.setMapHeight(this.getAttribute('height'));\n this.setComponentState('loading');\n this.syncAttributesToState();\n }\n\n disconnectedCallback() {\n this.pointsController?.abort();\n this.zoneButtons.forEach((btn) => btn.removeEventListener('click', this.handleZoneButtonClick));\n if (this.nearestButton) {\n this.nearestButton.removeEventListener('click', this.handleNearestClick);\n }\n this.pointModalOverlayEl?.removeEventListener('click', this.handlePointModalOverlayClick);\n this.pointModalCloseButton?.removeEventListener('click', this.closePointModal);\n window.removeEventListener('keydown', this.handlePointModalKeydown);\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null) {\n if (name === 'marca') {\n this.setMarca(newValue ?? '');\n } else if (name === 'tipo') {\n this.setTipo(newValue ?? '');\n } else if (name === 'height') {\n this.setMapHeight(newValue);\n } else if (name === 'google-maps-key') {\n this.setGoogleMapsKey(newValue);\n } else if (name === 'points-api-url') {\n this.setPointsApiUrl(newValue);\n } else if (name === 'cache-days') {\n this.setCacheDays(newValue);\n } else if (name === 'marker-icon-base') {\n this.setMarkerIconBase(newValue);\n } else if (name === 'marker-icon-default') {\n this.setDefaultMarkerIcon(newValue);\n }\n }\n\n private loadGoogleMaps() {\n if ((window as any)._rsGoogleMapsLoaded) {\n return Promise.resolve().then(() => {\n this.initMap();\n });\n }\n\n if (!this.googleMapsApiKey) {\n console.error('Falta la clave de Google Maps. Define el atributo \"google-maps-key\" en <rs-map>.');\n return Promise.resolve();\n }\n\n if (!RsMap.googleMapsLoaderPromise) {\n RsMap.googleMapsLoaderPromise = new Promise<void>((resolve, reject) => {\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-rs-google-maps=\"true\"]');\n if (existingScript) {\n existingScript.addEventListener('load', () => resolve(), { once: true });\n existingScript.addEventListener(\n 'error',\n () => reject(new Error('Error al cargar la API de Google Maps')),\n { once: true }\n );\n return;\n }\n\n const script = document.createElement('script');\n const params = new URLSearchParams({\n key: this.googleMapsApiKey,\n v: 'weekly'\n });\n script.src = `https://maps.googleapis.com/maps/api/js?${params.toString()}`;\n script.async = true;\n script.defer = true;\n script.dataset.rsGoogleMaps = 'true';\n\n script.onload = () => {\n (window as any)._rsGoogleMapsLoaded = true;\n resolve();\n };\n\n script.onerror = () => {\n RsMap.googleMapsLoaderPromise = null;\n reject(new Error('Error al cargar la API de Google Maps'));\n };\n\n document.head.appendChild(script);\n });\n }\n\n return RsMap.googleMapsLoaderPromise\n .then(() => {\n (window as any)._rsGoogleMapsLoaded = true;\n this.initMap();\n })\n .catch((error) => {\n console.error(error instanceof Error ? error.message : 'Error al cargar la API de Google Maps');\n });\n }\n\n private initMap() {\n const g = (window as any).google;\n if (!g) {\n console.error('Google Maps aun no esta disponible.');\n return;\n }\n\n const initialCenter = this.getInitialCenter();\n this.map = new g.maps.Map(this.mapEl, {\n center: initialCenter,\n zoom: 14,\n mapTypeId: 'roadmap'\n });\n if (this.points.length) {\n this.updateMarkers(this.points);\n }\n }\n\n private getInitialCenter() {\n const firstPoint = this.getFirstValidPoint();\n if (firstPoint) {\n return firstPoint;\n }\n return { lat: -33.4489, lng: -70.6693 };\n }\n\n private getFirstValidPoint(): MapPosition | null {\n for (const point of this.points) {\n const position = this.getPointPosition(point);\n if (position) {\n return position;\n }\n }\n return null;\n }\n\n private syncAttributesToState() {\n this.isSyncingInitialAttributes = true;\n this.setMarca(this.getAttribute('marca') ?? '');\n this.setTipo(this.getAttribute('tipo') ?? '');\n this.setGoogleMapsKey(this.getAttribute('google-maps-key'));\n this.setPointsApiUrl(this.getAttribute('points-api-url'));\n this.setCacheDays(this.getAttribute('cache-days'));\n this.setMarkerIconBase(this.getAttribute('marker-icon-base'));\n this.setDefaultMarkerIcon(this.getAttribute('marker-icon-default'));\n this.isSyncingInitialAttributes = false;\n this.queueRefreshPoints();\n }\n\n private setMapHeight(value: string | null) {\n const normalized = (value ?? '').trim();\n if (!normalized) {\n this.mapHeight = '';\n this.style.removeProperty('--map-height');\n return;\n }\n this.mapHeight = normalized;\n this.style.setProperty('--map-height', normalized);\n }\n\n private setGoogleMapsKey(value: string | null) {\n this.googleMapsApiKey = (value ?? '').trim();\n if (this.googleMapsApiKey && this.isConnected) {\n void this.loadGoogleMaps();\n }\n }\n\n private setPointsApiUrl(value: string | null) {\n const normalized = (value ?? '').trim();\n this.pointsApiUrl = normalized || DEFAULT_POINTS_API_URL;\n if (this.pointsApiUrl && this.isConnected && !this.isSyncingInitialAttributes) {\n this.queueRefreshPoints();\n }\n }\n\n private setCacheDays(value: string | null) {\n const normalized = (value ?? '').trim();\n if (!normalized) {\n this.pointsCacheTtlMs = DEFAULT_POINTS_CACHE_TTL_MS;\n return;\n }\n\n const days = Number(normalized);\n if (!Number.isFinite(days) || days < 0) {\n this.pointsCacheTtlMs = DEFAULT_POINTS_CACHE_TTL_MS;\n return;\n }\n\n this.pointsCacheTtlMs = days * 24 * 60 * 60 * 1000;\n }\n\n private setMarkerIconBase(value: string | null) {\n const normalized = (value ?? '').trim();\n if (!normalized) {\n this.markerIconBaseUrl = '';\n return;\n }\n this.markerIconBaseUrl = normalized.endsWith('/') ? normalized : `${normalized}/`;\n }\n\n private setDefaultMarkerIcon(value: string | null) {\n this.defaultMarkerIconUrl = (value ?? '').trim();\n }\n\n private setMarca(value: string) {\n this.marca = value.trim();\n this.marcaKey = this.normalizeBrandKey(this.marca);\n this.applyBrandColor();\n if (!this.isSyncingInitialAttributes) {\n this.queueRefreshPoints();\n }\n }\n\n private setTipo(value: string) {\n this.tipo = value.trim();\n this.tipoCode = this.normalizeTipo(this.tipo);\n this.updatePanelTitle();\n if (!this.isSyncingInitialAttributes) {\n this.queueRefreshPoints();\n }\n }\n\n private queueRefreshPoints() {\n if (this.refreshQueued) {\n return;\n }\n this.refreshQueued = true;\n queueMicrotask(() => {\n this.refreshQueued = false;\n void this.refreshPoints();\n });\n }\n\n get marcaFilter() {\n return this.marca;\n }\n\n get tipoFilter() {\n return this.tipo;\n }\n\n private updatePanelTitle() {\n if (!this.panelTitleEl) {\n return;\n }\n const label = this.getTipoLabel();\n this.panelTitleEl.textContent = label ?? 'Puntos del mapa';\n }\n\n private getTipoLabel() {\n if (this.tipoCode !== null && this.tipoCode in TYPE_LABELS) {\n return TYPE_LABELS[this.tipoCode];\n }\n const normalized = this.tipo.trim().toLowerCase();\n const normalizedCode = normalized && normalized in TYPE_CODES ? TYPE_CODES[normalized] : null;\n if (normalizedCode !== null && normalizedCode in TYPE_LABELS) {\n return TYPE_LABELS[normalizedCode];\n }\n return null;\n }\n\n private applyBrandColor() {\n const color = BRAND_COLORS[this.marcaKey] ?? DEFAULT_BRAND_COLOR;\n this.style.setProperty('--rs-map-accent', color);\n }\n\n private normalizeTipo(value: string): number | null {\n if (!value) {\n return null;\n }\n const normalized = value.trim().toLowerCase();\n if (normalized in TYPE_CODES) {\n return TYPE_CODES[normalized];\n }\n const numeric = Number(normalized);\n if (Number.isFinite(numeric) && (numeric === 0 || numeric === 1)) {\n return numeric;\n }\n return null;\n }\n\n private async refreshPoints() {\n if (!this.isConnected || !this.marca || this.tipoCode === null) {\n return;\n }\n\n if (!this.pointsApiUrl) {\n console.error('Falta la URL de la API de puntos. Define el atributo \"points-api-url\" en <rs-map>.');\n this.setComponentState('error');\n return;\n }\n\n this.pointsController?.abort();\n const controller = new AbortController();\n this.pointsController = controller;\n\n const marcaRequestValue = this.getMarcaRequestValue();\n const params = new URLSearchParams({\n marca: marcaRequestValue,\n tipo: String(this.tipoCode)\n });\n\n const hasQuery = this.pointsApiUrl.includes('?');\n const needsAmp = hasQuery && !/[?&]$/.test(this.pointsApiUrl);\n const separator = hasQuery ? (needsAmp ? '&' : '') : '?';\n const requestUrl = `${this.pointsApiUrl}${separator}${params.toString()}`;\n const cacheKey = this.getPointsCacheKey(requestUrl);\n const cachedPayload = await this.readPointsCache(cacheKey);\n const hasFreshCache = cachedPayload && Date.now() - cachedPayload.timestamp < this.pointsCacheTtlMs;\n const localFallbackPayload = cachedPayload ? null : await this.getLocalPointsFallback(marcaRequestValue, this.tipoCode);\n\n if (cachedPayload) {\n this.applyPointsPayload(cachedPayload.data);\n this.setComponentState('ready');\n if (hasFreshCache) {\n return;\n }\n } else if (localFallbackPayload) {\n this.applyPointsPayload(localFallbackPayload);\n this.setComponentState('ready');\n } else {\n this.setComponentState('loading');\n }\n\n try {\n const response = await fetch(requestUrl, {\n signal: controller.signal\n });\n\n if (!response.ok) {\n throw new Error(`Respuesta ${response.status}`);\n }\n\n const payload = await response.json();\n if (!Array.isArray(payload)) {\n throw new Error('La respuesta de puntos no es valida.');\n }\n const typedPayload = payload as MapPointApi[];\n await this.writePointsCache(cacheKey, typedPayload);\n this.applyPointsPayload(typedPayload);\n this.setComponentState('ready');\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n return;\n }\n if (cachedPayload || localFallbackPayload) {\n console.warn('Se mantienen puntos locales por error al refrescar el mapa', error);\n return;\n }\n console.error('No se pudieron cargar los puntos del mapa', error);\n this.setComponentState('error');\n }\n }\n\n private applyPointsPayload(payload: MapPointApi[]) {\n this.points = this.transformPoints(payload);\n this.reportUnmappablePoints(this.points);\n this.renderPoints(this.points);\n this.initialViewApplied = false;\n this.updateMarkers(this.points);\n }\n\n private reportUnmappablePoints(points: MapPoint[]) {\n const unmappablePoints = points\n .filter((point) => !this.getPointPosition(point))\n .map((point) => ({\n id: point.id,\n titulo: point.titulo,\n direccion: point.direccion,\n lat: point.lat,\n lng: point.lng\n }));\n\n if (unmappablePoints.length) {\n console.warn('Puntos con coordenadas fuera de rango o invalidas; no se muestran como markers.', unmappablePoints);\n }\n }\n\n private getPointsCacheKey(requestUrl: string) {\n return `rs-map:points:${requestUrl}`;\n }\n\n private async getLocalPointsFallback(marca: string, tipoCode: number): Promise<MapPointApi[] | null> {\n const normalizedBrand = this.normalizeBrandKey(marca);\n const path = `../json/PuntosMapas_${normalizedBrand}_${tipoCode}.json`;\n const existingRequest = this.localPointsRequests.get(path);\n if (existingRequest) {\n return existingRequest;\n }\n\n const loader = LOCAL_POINTS_LOADERS[path];\n if (!loader) {\n return null;\n }\n\n const request = loader()\n .then((payload) => {\n const parsedPayload = this.parseLocalPointsPayload(payload);\n return parsedPayload?.length ? parsedPayload : null;\n })\n .catch(() => null);\n\n this.localPointsRequests.set(path, request);\n return request;\n }\n\n private parseLocalPointsPayload(value: unknown): MapPointApi[] | null {\n if (!Array.isArray(value)) {\n return null;\n }\n\n return value as MapPointApi[];\n }\n\n private async readPointsCache(cacheKey: string): Promise<PointsCacheEntry | null> {\n const dbEntry = await this.readPointsCacheFromIndexedDb(cacheKey);\n if (dbEntry) {\n return dbEntry;\n }\n\n try {\n const raw = window.localStorage.getItem(cacheKey);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw) as PointsCacheEntry;\n if (!parsed || !Array.isArray(parsed.data) || !Number.isFinite(parsed.timestamp)) {\n window.localStorage.removeItem(cacheKey);\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n }\n\n private async writePointsCache(cacheKey: string, payload: MapPointApi[]) {\n const entry: PointsCacheEntry = {\n timestamp: Date.now(),\n data: payload\n };\n\n await this.writePointsCacheToIndexedDb(cacheKey, entry);\n\n try {\n window.localStorage.setItem(cacheKey, JSON.stringify(entry));\n } catch {\n // Ignore storage errors and keep runtime behavior.\n }\n }\n\n private async readPointsCacheFromIndexedDb(cacheKey: string): Promise<PointsCacheEntry | null> {\n const db = await RsMap.openPointsCacheDb();\n if (!db) {\n return null;\n }\n\n return new Promise((resolve) => {\n const transaction = db.transaction(POINTS_CACHE_STORE_NAME, 'readonly');\n const store = transaction.objectStore(POINTS_CACHE_STORE_NAME);\n const request = store.get(cacheKey);\n\n request.onsuccess = () => {\n const result = request.result as PointsCacheRecord | undefined;\n if (!result || !Array.isArray(result.data) || !Number.isFinite(result.timestamp)) {\n resolve(null);\n return;\n }\n resolve({\n timestamp: result.timestamp,\n data: result.data\n });\n };\n\n request.onerror = () => resolve(null);\n });\n }\n\n private async writePointsCacheToIndexedDb(cacheKey: string, entry: PointsCacheEntry) {\n const db = await RsMap.openPointsCacheDb();\n if (!db) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n const transaction = db.transaction(POINTS_CACHE_STORE_NAME, 'readwrite');\n const store = transaction.objectStore(POINTS_CACHE_STORE_NAME);\n const request = store.put({\n key: cacheKey,\n timestamp: entry.timestamp,\n data: entry.data\n } satisfies PointsCacheRecord);\n\n request.onsuccess = () => resolve();\n request.onerror = () => resolve();\n });\n }\n\n private static openPointsCacheDb(): Promise<IDBDatabase | null> {\n if (typeof window === 'undefined' || !('indexedDB' in window)) {\n return Promise.resolve(null);\n }\n\n if (!RsMap.pointsCacheDbPromise) {\n RsMap.pointsCacheDbPromise = new Promise((resolve) => {\n const request = window.indexedDB.open(POINTS_CACHE_DB_NAME, 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(POINTS_CACHE_STORE_NAME)) {\n db.createObjectStore(POINTS_CACHE_STORE_NAME, { keyPath: 'key' });\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => resolve(null);\n });\n }\n\n return RsMap.pointsCacheDbPromise;\n }\n\n private transformPoints(payload: MapPointApi[]): MapPoint[] {\n return payload.map((point) => ({\n ...point,\n zone: this.getZoneForPoint(point)\n }));\n }\n\n private renderPoints(points: MapPoint[]) {\n if (!this.zonesContainer) {\n return;\n }\n\n const grouped = this.groupPoints(points);\n this.pointsByZone = grouped;\n this.updateZoneButtonCounts();\n\n const fragment = document.createDocumentFragment();\n\n ZONE_ORDER.forEach((zoneKey) => {\n const section = document.createElement('section');\n section.className = 'zone-section';\n section.dataset.zoneSection = zoneKey;\n\n const header = document.createElement('div');\n header.className = 'zone-section__header';\n const title = document.createElement('span');\n title.textContent = ZONE_LABELS[zoneKey];\n header.appendChild(title);\n section.appendChild(header);\n\n if (grouped[zoneKey].length === 0) {\n const empty = document.createElement('p');\n empty.className = 'zone-section__empty';\n empty.textContent = 'Sin puntos en esta zona.';\n section.appendChild(empty);\n } else {\n const list = document.createElement('div');\n list.className = 'zone-section__list';\n grouped[zoneKey].forEach((point) => {\n list.appendChild(this.createPointCard(point));\n });\n section.appendChild(list);\n }\n\n fragment.appendChild(section);\n });\n\n this.zonesContainer.replaceChildren(fragment);\n this.updateZoneVisibility();\n }\n\n private groupPoints(points: MapPoint[]): Record<ZoneKey, MapPoint[]> {\n const grouped: Record<ZoneKey, MapPoint[]> = {\n norte: [],\n rm: [],\n centro: [],\n sur: []\n };\n points.forEach((point) => {\n grouped[point.zone].push(point);\n });\n return grouped;\n }\n\n private createPointCard(point: MapPoint) {\n const card = document.createElement('article');\n card.className = 'point-card';\n card.dataset.pointId = String(point.id);\n const coordinateWarning = this.getPointCoordinateWarning(point);\n\n const title = document.createElement('h3');\n title.className = 'point-card__title';\n title.textContent = point.titulo || 'Sin nombre';\n card.appendChild(title);\n\n const addressBlock = document.createElement('div');\n addressBlock.className = 'point-card__address-block';\n\n const address = document.createElement('p');\n address.className = 'point-card__address';\n address.textContent = point.direccion || 'Sin direccion';\n addressBlock.appendChild(address);\n\n if (point.comuna_name) {\n const comuna = document.createElement('p');\n comuna.className = 'point-card__meta';\n comuna.textContent = point.comuna_name;\n addressBlock.appendChild(comuna);\n }\n\n if (point.provincia_name) {\n const provincia = document.createElement('p');\n provincia.className = 'point-card__meta';\n provincia.textContent = point.provincia_name;\n addressBlock.appendChild(provincia);\n }\n\n if (point.region_name) {\n const regionLine = document.createElement('p');\n regionLine.className = 'point-card__meta';\n regionLine.textContent = point.region_name;\n addressBlock.appendChild(regionLine);\n }\n\n card.appendChild(addressBlock);\n\n let mapPositionElement: HTMLElement | null = null;\n const position = this.getPointPosition(point);\n if (position) {\n const mapActions = document.createElement('div');\n mapActions.className = 'point-card__map-actions';\n\n const focusButton = document.createElement('button');\n focusButton.type = 'button';\n focusButton.className = 'point-card__focus';\n const icon = this.createIconElement('fa-solid fa-location-crosshairs');\n focusButton.appendChild(icon);\n focusButton.appendChild(document.createTextNode(' Ver en el mapa'));\n focusButton.addEventListener('click', () => {\n void this.focusPointWithZoom(position.lat, position.lng);\n this.scrollToPointCard(point.id);\n });\n mapActions.appendChild(focusButton);\n mapActions.appendChild(this.createMobileNavigationActions(position));\n mapPositionElement = mapActions;\n } else if (coordinateWarning) {\n const warning = document.createElement('div');\n warning.className = 'point-card__coordinate-warning';\n const icon = this.createIconElement('fa-solid fa-circle-info');\n warning.appendChild(icon);\n const text = document.createElement('span');\n text.textContent = coordinateWarning;\n warning.appendChild(text);\n mapPositionElement = warning;\n }\n\n const details = document.createElement('div');\n details.className = 'point-card__details';\n details.hidden = true;\n let hasDetails = false;\n\n const actions = document.createElement('div');\n actions.className = 'point-card__actions';\n let mapLinkElement: HTMLAnchorElement | null = null;\n\n if (point.url && point.url !== '#') {\n const siteLink = document.createElement('a');\n siteLink.href = point.url;\n siteLink.target = '_blank';\n siteLink.rel = 'noopener noreferrer';\n siteLink.className = 'point-card__action';\n const icon = this.createIconElement('fa-solid fa-globe');\n siteLink.appendChild(icon);\n siteLink.appendChild(document.createTextNode('Sitio web'));\n actions.appendChild(siteLink);\n }\n\n if (point.email) {\n const emailLink = document.createElement('a');\n emailLink.href = `mailto:${point.email}`;\n emailLink.target = '_blank';\n emailLink.rel = 'noopener noreferrer';\n emailLink.className = 'point-card__action point-card__action--text';\n const icon = this.createIconElement('fa-solid fa-envelope');\n emailLink.appendChild(icon);\n emailLink.appendChild(document.createTextNode(point.email));\n actions.appendChild(emailLink);\n }\n\n if (actions.childElementCount) {\n details.appendChild(actions);\n hasDetails = true;\n }\n\n if (point.telefonos?.length) {\n const contactSection = document.createElement('div');\n contactSection.className = 'point-card__contact';\n const contactTitle = document.createElement('div');\n contactTitle.className = 'point-card__contact-title';\n const icon = this.createIconElement('fa-solid fa-phone');\n contactTitle.appendChild(icon);\n contactTitle.appendChild(document.createTextNode('Telefonos'));\n contactSection.appendChild(contactTitle);\n\n const phoneList = document.createElement('ul');\n phoneList.className = 'point-card__phone-list';\n\n point.telefonos\n .slice()\n .sort((a, b) => a.orden - b.orden)\n .forEach((phone) => {\n const item = document.createElement('li');\n item.className = 'point-card__phone-item';\n\n const iconWrapper = document.createElement('span');\n iconWrapper.className = 'point-card__phone-icon';\n const hasWhatsapp = this.isWhatsappPhone(phone);\n if (hasWhatsapp) {\n const whatsappIcon = this.createIconElement('fa-brands fa-whatsapp');\n iconWrapper.appendChild(whatsappIcon);\n } else {\n iconWrapper.textContent = '-';\n }\n item.appendChild(iconWrapper);\n\n const content = document.createElement('div');\n content.className = 'point-card__phone-content';\n\n const name = document.createElement('span');\n name.className = 'point-card__phone-name';\n name.textContent = phone.nombre;\n content.appendChild(name);\n\n const numberEl = hasWhatsapp ? document.createElement('a') : document.createElement('span');\n numberEl.className = 'point-card__phone-number';\n if (hasWhatsapp) {\n const link = this.getWhatsappLink(phone.telefono);\n if (link) {\n (numberEl as HTMLAnchorElement).href = link;\n (numberEl as HTMLAnchorElement).target = '_blank';\n (numberEl as HTMLAnchorElement).rel = 'noopener noreferrer';\n numberEl.classList.add('point-card__phone-number--link');\n }\n }\n numberEl.textContent = phone.telefono;\n content.appendChild(numberEl);\n\n item.appendChild(content);\n phoneList.appendChild(item);\n });\n\n contactSection.appendChild(phoneList);\n details.appendChild(contactSection);\n hasDetails = true;\n }\n\n if (point.adicional) {\n const extra = document.createElement('p');\n extra.className = 'point-card__extra';\n extra.innerHTML = point.adicional;\n extra.querySelectorAll('a').forEach((link) => {\n link.classList.add('point-card__extra-link');\n const icon = this.createIconElement('fa-solid fa-arrow-up-right-from-square');\n icon.classList.add('point-card__extra-icon');\n link.appendChild(icon);\n });\n details.appendChild(extra);\n hasDetails = true;\n }\n\n if (point.googlelink) {\n mapLinkElement = document.createElement('a');\n mapLinkElement.href = point.googlelink;\n mapLinkElement.target = '_blank';\n mapLinkElement.rel = 'noopener noreferrer';\n mapLinkElement.className = 'point-card__action';\n const icon = this.createIconElement('fa-solid fa-map-location-dot');\n mapLinkElement.appendChild(icon);\n mapLinkElement.appendChild(document.createTextNode('Google Maps'));\n }\n\n if (mapLinkElement) {\n const mapWrapper = document.createElement('div');\n mapWrapper.className = 'point-card__actions';\n mapWrapper.appendChild(mapLinkElement);\n details.appendChild(mapWrapper);\n hasDetails = true;\n }\n\n if (hasDetails) {\n const toggle = document.createElement('button');\n toggle.type = 'button';\n toggle.className = 'point-card__toggle';\n const toggleIcon = this.createIconElement('fa-solid fa-circle-info');\n const toggleText = document.createElement('span');\n toggleText.textContent = 'Mas informacion';\n toggle.appendChild(toggleIcon);\n toggle.appendChild(toggleText);\n toggle.addEventListener('click', () => {\n const isHidden = details.hidden;\n details.hidden = !isHidden;\n toggleText.textContent = isHidden ? 'Ocultar informacion' : 'Mas informacion';\n toggleIcon.className = isHidden ? 'fa-solid fa-circle-xmark' : 'fa-solid fa-circle-info';\n });\n card.appendChild(toggle);\n card.appendChild(details);\n }\n\n if (mapPositionElement) {\n card.appendChild(mapPositionElement);\n }\n\n return card;\n }\n\n private createMobileNavigationActions(position: MapPosition) {\n const actions = document.createElement('div');\n actions.className = 'point-card__mobile-navigation';\n actions.appendChild(\n this.createMobileNavigationLink(\n `https://www.google.com/maps/dir/?api=1&destination=${position.lat},${position.lng}&travelmode=driving`,\n 'Ir con Google Maps',\n 'fa-brands fa-google'\n )\n );\n actions.appendChild(\n this.createMobileNavigationLink(\n `https://waze.com/ul?ll=${position.lat},${position.lng}&navigate=yes`,\n 'Ir con Waze',\n 'fa-brands fa-waze'\n )\n );\n return actions;\n }\n\n private createMobileNavigationLink(url: string, label: string, iconClass: string) {\n const link = document.createElement('a');\n link.href = url;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.className = 'point-card__mobile-nav-link';\n link.appendChild(this.createIconElement(iconClass));\n link.appendChild(document.createTextNode(label));\n return link;\n }\n\n private getZoneForPoint(point: MapPointApi): ZoneKey {\n const normalizedRegion = this.normalizeRegionName(point.region_name || '');\n if (normalizedRegion && normalizedRegion in REGION_ZONE_MAP) {\n return REGION_ZONE_MAP[normalizedRegion];\n }\n if (normalizedRegion.includes('metropolitana')) {\n return 'rm';\n }\n if (\n normalizedRegion.includes('araucania') ||\n normalizedRegion.includes('rios') ||\n normalizedRegion.includes('lagos') ||\n normalizedRegion.includes('aysen') ||\n normalizedRegion.includes('magallanes')\n ) {\n return 'sur';\n }\n if (\n normalizedRegion.includes('arica') ||\n normalizedRegion.includes('tarapaca') ||\n normalizedRegion.includes('antofagasta') ||\n normalizedRegion.includes('atacama') ||\n normalizedRegion.includes('coquimbo')\n ) {\n return 'norte';\n }\n return 'centro';\n }\n\n private normalizeRegionName(input: string) {\n return input\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .trim();\n }\n\n private getMarcaRequestValue() {\n const normalized = this.normalizeBrandToken(this.marca);\n return BRAND_ALIASES[normalized] ?? this.marca;\n }\n\n private normalizeBrandKey(value: string) {\n const normalized = this.normalizeBrandToken(value);\n if (!normalized) {\n return 'default';\n }\n return BRAND_ALIASES[normalized] ?? normalized;\n }\n\n private normalizeBrandToken(value: string) {\n const normalized = value\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '');\n return normalized;\n }\n\n private getMarkerIcon(point?: Pick<MapPointApi, 'tipo'>) {\n const key = this.marcaKey || 'default';\n const localIconUrl = this.getLocalMarkerIconUrl(key, point);\n if (localIconUrl) {\n return localIconUrl;\n }\n if (this.markerIconBaseUrl) {\n return `${this.markerIconBaseUrl}${key}.png`;\n }\n if (this.defaultMarkerIconUrl) {\n return this.defaultMarkerIconUrl;\n }\n return null;\n }\n\n private getLocalMarkerIconUrl(key: string, point?: Pick<MapPointApi, 'tipo'>) {\n const pointTipoCode = point ? Number(point.tipo) : NaN;\n const tipoCode = Number.isFinite(pointTipoCode) ? pointTipoCode : this.tipoCode;\n const fileName = tipoCode === 1 ? `${key}_distribuidor.png` : `${key}.png`;\n return LOCAL_MARKER_ICON_URLS[`../pin/${fileName}`] ?? null;\n }\n\n private getPointCoordinateWarning(point: Pick<MapPointApi, 'lat' | 'lng'>) {\n if (this.getPointPosition(point)) {\n return null;\n }\n\n const lat = Number(point.lat);\n const lng = Number(point.lng);\n const rawCoordinates = `lat ${point.lat || 'sin dato'}, lng ${point.lng || 'sin dato'}`;\n if (!Number.isFinite(lat) || !Number.isFinite(lng)) {\n return `Ubicacion por revisar: ${rawCoordinates}.`;\n }\n return `Ubicacion por revisar: ${rawCoordinates}.`;\n }\n\n private getPointPosition(point: Pick<MapPointApi, 'lat' | 'lng'>): MapPosition | null {\n const lat = Number(point.lat);\n const lng = Number(point.lng);\n if (!this.isMappableCoordinate(lat, lng)) {\n return null;\n }\n return { lat, lng };\n }\n\n private isMappableCoordinate(lat: number, lng: number) {\n return (\n Number.isFinite(lat) &&\n Number.isFinite(lng) &&\n lat >= CONTINENTAL_CHILE_BOUNDS.minLat &&\n lat <= CONTINENTAL_CHILE_BOUNDS.maxLat &&\n lng >= CONTINENTAL_CHILE_BOUNDS.minLng &&\n lng <= CONTINENTAL_CHILE_BOUNDS.maxLng\n );\n }\n\n private updateMarkers(points: MapPoint[]) {\n const g = (window as any).google;\n if (!g || !this.map) {\n return;\n }\n this.markers.forEach((marker) => marker.setMap(null));\n this.markers = [];\n\n const validPoints: Array<{ point: MapPoint; position: MapPosition }> = [];\n points.forEach((point) => {\n const position = this.getPointPosition(point);\n if (position) {\n validPoints.push({ point, position });\n }\n });\n\n if (!validPoints.length) {\n return;\n }\n\n const bounds = new g.maps.LatLngBounds();\n\n validPoints.forEach(({ point, position }) => {\n const { lat, lng } = position;\n const iconUrl = this.getMarkerIcon(point);\n const icon =\n iconUrl && this.map\n ? {\n url: iconUrl,\n scaledSize: new g.maps.Size(64, 64),\n anchor: new g.maps.Point(32, 64)\n }\n : undefined;\n const marker = new g.maps.Marker({\n map: this.map,\n position: { lat, lng },\n title: point.titulo,\n icon\n });\n marker.addListener('click', () => {\n this.openPointModal(point);\n this.scrollToPointCard(point.id);\n });\n this.markers.push(marker);\n const markerPosition = marker.getPosition();\n if (markerPosition) {\n bounds.extend(markerPosition);\n }\n });\n\n if (!this.initialViewApplied && this.markers.length) {\n const position = this.markers[0].getPosition();\n if (position) {\n this.map.setCenter(position);\n this.map.setZoom(14);\n this.initialViewApplied = true;\n return;\n }\n }\n\n if (this.markers.length === 1) {\n const position = this.markers[0].getPosition();\n if (position) {\n this.map.setCenter(position);\n }\n this.map.setZoom(14);\n } else {\n this.map.fitBounds(bounds);\n }\n }\n\n private openPointModal(point: MapPoint) {\n if (!this.pointModalOverlayEl || !this.pointModalTitleEl || !this.pointModalBodyEl) {\n return;\n }\n this.pointModalTitleEl.textContent = point.titulo || 'Sin nombre';\n this.pointModalBodyEl.replaceChildren(this.createPointModalContent(point));\n this.pointModalOverlayEl.removeAttribute('hidden');\n this.pointModalCloseButton?.focus();\n }\n\n private closePointModal = () => {\n if (!this.pointModalOverlayEl) {\n return;\n }\n this.pointModalOverlayEl.setAttribute('hidden', '');\n this.pointModalBodyEl?.replaceChildren();\n };\n\n private handlePointModalOverlayClick = (event: Event) => {\n if (event.target === this.pointModalOverlayEl) {\n this.closePointModal();\n }\n };\n\n private handlePointModalKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && this.pointModalOverlayEl && !this.pointModalOverlayEl.hasAttribute('hidden')) {\n this.closePointModal();\n }\n };\n\n private createPointModalContent(point: MapPoint) {\n const fragment = document.createDocumentFragment();\n\n if (point.portada) {\n const cover = document.createElement('img');\n cover.className = 'point-modal__cover';\n cover.src = point.portada;\n cover.alt = point.titulo || 'Imagen del punto';\n cover.loading = 'lazy';\n cover.addEventListener('error', () => cover.remove(), { once: true });\n fragment.appendChild(cover);\n }\n\n const locationSection = this.createPointModalSection();\n this.appendPointModalLine(locationSection, 'Direccion', point.direccion);\n this.appendPointModalLine(locationSection, 'Comuna', point.comuna_name);\n this.appendPointModalLine(locationSection, 'Provincia', point.provincia_name);\n this.appendPointModalLine(locationSection, 'Region', point.region_name);\n this.appendPointModalLine(locationSection, 'RUT', point.rut);\n if (locationSection.childElementCount) {\n fragment.appendChild(locationSection);\n }\n\n const contactSection = this.createPointModalSection();\n this.appendPointModalLine(contactSection, 'Correo', point.email);\n if (point.telefonos?.length) {\n const label = document.createElement('p');\n label.className = 'point-modal__line';\n const strong = document.createElement('span');\n strong.className = 'point-modal__label';\n strong.textContent = 'Telefonos:';\n label.appendChild(strong);\n contactSection.appendChild(label);\n\n const phoneList = document.createElement('ul');\n phoneList.className = 'point-modal__phone-list';\n point.telefonos\n .slice()\n .sort((a, b) => a.orden - b.orden)\n .forEach((phone) => {\n phoneList.appendChild(this.createPointModalPhoneItem(phone));\n });\n contactSection.appendChild(phoneList);\n }\n if (contactSection.childElementCount) {\n fragment.appendChild(contactSection);\n }\n\n if (point.adicional) {\n const extraSection = this.createPointModalSection();\n const extra = document.createElement('div');\n extra.className = 'point-modal__extra';\n extra.innerHTML = point.adicional;\n extra.querySelectorAll('a').forEach((link) => {\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n });\n extraSection.appendChild(extra);\n fragment.appendChild(extraSection);\n }\n\n const actions = this.createPointModalActions(point);\n if (actions.childElementCount) {\n fragment.appendChild(actions);\n }\n\n return fragment;\n }\n\n private createPointModalSection() {\n const section = document.createElement('div');\n section.className = 'point-modal__section';\n return section;\n }\n\n private appendPointModalLine(section: HTMLElement, label: string, value: string) {\n const normalized = (value ?? '').trim();\n if (!normalized || normalized === '#') {\n return;\n }\n const line = document.createElement('p');\n line.className = 'point-modal__line';\n const strong = document.createElement('span');\n strong.className = 'point-modal__label';\n strong.textContent = `${label}: `;\n line.appendChild(strong);\n line.appendChild(document.createTextNode(normalized));\n section.appendChild(line);\n }\n\n private createPointModalPhoneItem(phone: MapPointPhone) {\n const item = document.createElement('li');\n item.className = 'point-modal__phone-item';\n\n const label = document.createElement('span');\n label.className = 'point-modal__label';\n label.textContent = `${phone.nombre || 'Telefono'}: `;\n item.appendChild(label);\n\n const phoneNumber = (phone.telefono ?? '').trim();\n const whatsappLink = this.isWhatsappPhone(phone) ? this.getWhatsappLink(phoneNumber) : null;\n if (whatsappLink) {\n const link = document.createElement('a');\n link.href = whatsappLink;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.className = 'point-modal__link';\n link.textContent = phoneNumber;\n item.appendChild(link);\n } else {\n item.appendChild(document.createTextNode(phoneNumber));\n }\n\n return item;\n }\n\n private createPointModalActions(point: MapPoint) {\n const actions = document.createElement('div');\n actions.className = 'point-modal__section point-modal__actions';\n\n if (point.url && point.url !== '#') {\n actions.appendChild(this.createPointModalLink(point.url, 'Sitio web'));\n }\n if (point.googlelink) {\n actions.appendChild(this.createPointModalLink(point.googlelink, 'Google Maps'));\n }\n if (point.email) {\n actions.appendChild(this.createPointModalLink(`mailto:${point.email}`, 'Enviar correo', false));\n }\n\n return actions;\n }\n\n private createPointModalLink(href: string, text: string, external = true) {\n const link = document.createElement('a');\n link.href = href;\n link.className = 'point-modal__link';\n link.textContent = text;\n if (external) {\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n }\n return link;\n }\n\n private handleZoneButtonClick = (event: Event) => {\n const button = event.currentTarget as HTMLButtonElement;\n const zone = button.dataset.zone as ZoneKey;\n if (!zone) {\n return;\n }\n this.setActiveZone(zone);\n this.scrollToZoneSection(zone);\n };\n\n private setActiveZone(_zone: ZoneFilter) {}\n\n private scrollToZoneSection(zone: ZoneKey) {\n if (!this.zonesContainer) {\n return;\n }\n const section = this.zonesContainer.querySelector<HTMLElement>(`[data-zone-section=\"${zone}\"]`);\n if (!section) {\n return;\n }\n section.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n private updateZoneButtons() {\n this.zoneButtons.forEach((btn) => {\n const zone = btn.dataset.zone as ZoneKey;\n const isActive = this.activeZone === zone;\n btn.classList.toggle('is-active', isActive);\n btn.setAttribute('aria-pressed', String(isActive));\n });\n }\n\n private updateZoneButtonCounts() {\n this.zoneButtons.forEach((btn) => {\n const zone = btn.dataset.zone as ZoneKey;\n const baseLabel = btn.dataset.label || btn.textContent || '';\n btn.textContent = baseLabel;\n });\n }\n\n private updateZoneVisibility() {\n if (!this.zonesContainer) {\n return;\n }\n const sections = this.zonesContainer.querySelectorAll<HTMLElement>('[data-zone-section]');\n sections.forEach((section) => {\n section.removeAttribute('hidden');\n });\n }\n\n private handleNearestClick = () => {\n if (!navigator.geolocation) {\n alert('La geolocalizacion no esta soportada en este navegador.');\n return;\n }\n navigator.geolocation.getCurrentPosition(\n (pos) => {\n const { latitude, longitude } = pos.coords;\n const nearest = this.findNearestPoint(latitude, longitude);\n if (nearest) {\n const nearestPosition = this.getPointPosition(nearest);\n if (nearestPosition) {\n this.centerMapOnPoint(nearestPosition.lat, nearestPosition.lng);\n }\n this.scrollToPointCard(nearest.id);\n } else {\n alert('No hay puntos disponibles para calcular la tienda cercana.');\n }\n },\n () => {\n alert('No se pudo obtener tu ubicacion.');\n }\n );\n };\n\n private findNearestPoint(lat: number, lng: number): MapPoint | null {\n if (!this.points.length) {\n return null;\n }\n let nearest: MapPoint | null = null;\n let bestDistance = Infinity;\n this.points.forEach((point) => {\n const position = this.getPointPosition(point);\n if (!position) {\n return;\n }\n const distance = this.haversine(lat, lng, position.lat, position.lng);\n if (distance < bestDistance) {\n bestDistance = distance;\n nearest = point;\n }\n });\n return nearest;\n }\n\n private haversine(lat1: number, lon1: number, lat2: number, lon2: number) {\n const toRad = (deg: number) => (deg * Math.PI) / 180;\n const R = 6371e3;\n const dLat = toRad(lat2 - lat1);\n const dLon = toRad(lon2 - lon1);\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n return R * c;\n }\n\n private scrollToPointCard(pointId: number) {\n if (!this.zonesContainer) {\n return;\n }\n const card = this.zonesContainer.querySelector<HTMLElement>(`[data-point-id=\"${pointId}\"]`);\n if (!card) {\n return;\n }\n card.scrollIntoView({ behavior: 'smooth', block: 'center' });\n this.highlightPointCard(card);\n }\n\n private highlightPointCard(card: HTMLElement) {\n if (this.highlightTimeout !== null) {\n clearTimeout(this.highlightTimeout);\n this.highlightTimeout = null;\n }\n this.zonesContainer?.querySelectorAll('.point-card--highlight').forEach((el) => {\n el.classList.remove('point-card--highlight');\n });\n card.classList.add('point-card--highlight');\n this.highlightTimeout = window.setTimeout(() => {\n card.classList.remove('point-card--highlight');\n this.highlightTimeout = null;\n }, 3500);\n }\n\n private setComponentState(state: 'loading' | 'ready' | 'error') {\n if (!this.componentMessageEl || !this.mapLayoutEl) {\n return;\n }\n if (state === 'ready') {\n this.componentMessageEl.setAttribute('hidden', '');\n this.mapLayoutEl.removeAttribute('hidden');\n } else {\n const text = state === 'loading' ? 'Cargando puntos...' : 'Mapa temporalmente no disponible';\n this.componentMessageEl.textContent = text;\n this.componentMessageEl.removeAttribute('hidden');\n this.mapLayoutEl.setAttribute('hidden', '');\n }\n }\n\n private centerMapOnPoint(lat: number, lng: number, targetZoom = 14) {\n const g = (window as any).google;\n if (!g || !this.map || !Number.isFinite(lat) || !Number.isFinite(lng)) {\n return;\n }\n const currentZoom = typeof this.map.getZoom === 'function' ? this.map.getZoom() : null;\n const needsZoom = !currentZoom || currentZoom < targetZoom;\n this.animateMapPan(lat, lng, () => {\n if (needsZoom) {\n this.map.setZoom(targetZoom);\n }\n });\n }\n\n private async focusPointWithZoom(lat: number, lng: number) {\n const g = (window as any).google;\n if (!g || !this.map || !Number.isFinite(lat) || !Number.isFinite(lng)) {\n return;\n }\n\n await this.animateZoomTo(8, 800);\n await this.wait(500);\n await new Promise<void>((resolve) => {\n this.animateMapPan(lat, lng, resolve);\n });\n await this.wait(500);\n await this.animateZoomTo(18, 800);\n }\n\n private wait(ms: number) {\n return new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n }\n\n private async animateZoomTo(targetZoom: number, duration = 600) {\n const g = (window as any).google;\n if (\n !g ||\n !this.map ||\n typeof this.map.getZoom !== 'function' ||\n typeof this.map.setZoom !== 'function'\n ) {\n return;\n }\n const startZoom = this.map.getZoom();\n if (!Number.isFinite(startZoom)) {\n this.map.setZoom(targetZoom);\n return;\n }\n const delta = targetZoom - startZoom;\n if (Math.abs(delta) < 0.01) {\n this.map.setZoom(targetZoom);\n return;\n }\n\n await new Promise<void>((resolve) => {\n const startTime = performance.now();\n const ease = (t: number) => 1 - Math.pow(1 - t, 3);\n\n const step = (now: number) => {\n const elapsed = now - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const eased = ease(progress);\n const nextZoom = startZoom + delta * eased;\n this.map.setZoom(Math.round(nextZoom * 100) / 100);\n if (progress < 1) {\n requestAnimationFrame(step);\n } else {\n this.map.setZoom(targetZoom);\n resolve();\n }\n };\n\n requestAnimationFrame(step);\n });\n }\n\n private animateMapPan(targetLat: number, targetLng: number, onComplete?: () => void) {\n const g = (window as any).google;\n if (!g || !this.map) {\n return;\n }\n if (this.panAnimationFrame !== null) {\n cancelAnimationFrame(this.panAnimationFrame);\n this.panAnimationFrame = null;\n }\n const startCenter = this.map.getCenter();\n if (!startCenter) {\n this.map.setCenter({ lat: targetLat, lng: targetLng });\n onComplete?.();\n return;\n }\n const startLat = startCenter.lat();\n const startLng = startCenter.lng();\n const deltaLat = targetLat - startLat;\n const deltaLng = targetLng - startLng;\n const duration = 600;\n const startTime = performance.now();\n\n const ease = (t: number) => 1 - Math.pow(1 - t, 3);\n\n const step = (now: number) => {\n const elapsed = now - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const eased = ease(progress);\n const nextLat = startLat + deltaLat * eased;\n const nextLng = startLng + deltaLng * eased;\n this.map.setCenter({ lat: nextLat, lng: nextLng });\n if (progress < 1) {\n this.panAnimationFrame = requestAnimationFrame(step);\n } else {\n this.panAnimationFrame = null;\n onComplete?.();\n }\n };\n\n this.panAnimationFrame = requestAnimationFrame(step);\n }\n\n private static ensureFontAwesome() {\n if (RsMap.fontAwesomeAttached) {\n return;\n }\n const existing = document.querySelector(`link[href=\"${FONT_AWESOME_LOCAL_PATH}\"]`);\n if (existing) {\n RsMap.fontAwesomeAttached = true;\n return;\n }\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = FONT_AWESOME_LOCAL_PATH;\n link.crossOrigin = 'anonymous';\n link.referrerPolicy = 'no-referrer';\n link.addEventListener('load', () => {\n RsMap.fontAwesomeAttached = true;\n });\n document.head.appendChild(link);\n }\n\n private createIconElement(className: string) {\n const icon = document.createElement('i');\n icon.className = className;\n icon.setAttribute('aria-hidden', 'true');\n return icon;\n }\n\n private isWhatsappPhone(phone: MapPointPhone) {\n return Boolean(phone.whatsapp || phone.watshapp);\n }\n\n private getWhatsappLink(phone: string) {\n const digits = phone.replace(/\\D+/g, '');\n if (!digits) {\n return null;\n }\n return `https://wa.me/${digits}`;\n }\n}\n","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\r\\n<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->\\r\\n<!DOCTYPE svg PUBLIC \\\"-//W3C//DTD SVG 1.1//EN\\\" \\\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\\\">\\r\\n<svg version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" x=\\\"0px\\\" y=\\\"0px\\\" viewBox=\\\"0 0 1000 1000\\\" enable-background=\\\"new 0 0 1000 1000\\\" xml:space=\\\"preserve\\\" style=\\\"fill: #ffffff;\\\">\\r\\n<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>\\r\\n<g><path d=\\\"M965.1,437.2c-24.9-8.4-52.2-8.7-78.1-13.5c-41.3-8.3-45.5-55.5-61.6-87c-17.4-27.9-1.8-58.7,17.9-80.2c16.7-22.2,45.4-50.8,21.8-78.9c-22.1-17.9-37.3-48.8-67.4-53.1c-30.2,2.7-50,30-74.7,45.2c-33.8,26.5-71.6-3.8-105.1-14.8c-30.2-6.9-45.2-36.2-45.6-65.2c-5.5-27.6-1.1-66.3-34.8-76.6c-36.1-3.3-99-13.6-104.1,37.7c-7.8,33.8-0.3,78.4-36.1,97.9c-30.8,10.5-59.5,30.1-92.3,31.9c-38.2-5.7-59.8-46-96.2-55.8c-32.6-2.2-48.3,31.8-70.7,49.7c-23.6,20.9-7.6,51.7,9.9,70.3c18.9,24.9,47.2,54.4,28.4,87.8c-16.4,31.3-19.6,75.8-57,89.7c-29.6,7.7-62.6,3.9-89.8,18.5c-25.6,30-28.1,94.8,5.4,120.4c36.3,14.9,84.8,0.8,111.7,35.3c13.3,29.6,28.4,59.5,35.6,91.1c-0.7,43.9-48.4,67.1-58.2,107.8c9.5,38.8,52.5,81.3,96.4,74.3c33.2-16.3,57.3-56.9,98.4-51.3c30.2,11.8,62.2,21.7,89.5,39.2c29.7,30.2,13.4,78.3,33.4,112.9c29.9,25.7,94.7,28.3,120.1-5.4c14.8-36.3,0.9-84.9,35.2-111.8c29.5-13.3,59.5-28.4,91-35.6c42.3,0,64.7,46,103.3,56c32.5,2.2,48.3-31.8,70.7-49.7c24.5-22.1,6.1-53.2-11.6-72.5c-18.9-24-45-53.3-26.7-85.6c16.4-31.3,19.6-75.7,57-89.6c29.6-7.7,62.6-4,89.8-18.5C996.1,527.5,998.6,462.7,965.1,437.2z M577.6,593.4c-21.6,18-49.5,28-77.5,27.9c-79.1,3-142.8-83.6-116.4-158.4c20.6-76,121.1-111.4,184.6-64.9C634.9,439.4,640,545.6,577.6,593.4z\\\"/></g>\\r\\n</svg>\"","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\r\\n<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->\\r\\n<!DOCTYPE svg PUBLIC \\\"-//W3C//DTD SVG 1.1//EN\\\" \\\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\\\">\\r\\n<svg version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" x=\\\"0px\\\" y=\\\"0px\\\" viewBox=\\\"0 0 1000 1000\\\" enable-background=\\\"new 0 0 1000 1000\\\" xml:space=\\\"preserve\\\" style=\\\"fill: #ffffff;\\\">\\r\\n<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>\\r\\n<g><g><g><path d=\\\"M171.2,451.6c-89,0-161.2,72.2-161.2,161.2c0,89,72.2,161.2,161.2,161.2c65,0,120.9-38.6,146.4-94l38.3,29.5c0,0,281.5,2,296.9-6.7c0,0-34.9-95.4,9.4-135.7c4.7-4.2,10.5-9.1,17-14.2c-7.4,18.5-11.6,38.7-11.6,59.9c0,89,72.2,161.2,161.2,161.2c89,0,161.2-72.2,161.2-161.2c0-89.1-72.2-161.2-161.2-161.2c-1.5,0-2.9,0.2-4.3,0.2c11.6-7.6,19.1-12.3,19.1-12.3l-12.1-10.8c0,0,34.9-8,26.9-25.5c-8.1-17.5-92.7-122.3-92.7-122.3s15-32.2-16-55.1l-14.9,32.2c0,0-38-26.2-53.1-21.2c-15.1,5-37.8,7.6-44.8,18.6l-7,6.6c0,0-2,11.6,9.6,28.7c0,0,116.4,35.8,121.9,62c0,0,8.1,16.6-26.7,20.6l-7,9.1l-18.7,1l-33.7-77.1c0,0-32.3,8.6-48.9,21.7l2.5,13.1c0,0-135.5-92.2-263,44.3c0,0-94.2,27.2-160.2-56.4c0,0-1-27.2-160.2-22.2l11.1,11.6c0,0-11.1,1-15.6,8.1c-4.5,7,2.5,14.6,38.8,14.6c0,0,82.1,93.7,145.1,88.2l89.7,43.3l39.8,68c0,0,0.1,5.8,0.5,14.8c-9.2,2-19.6,4.2-30.6,6.5C302.9,497.9,242.5,451.6,171.2,451.6z M828.8,501c61.7,0,111.8,50.2,111.8,111.8c0,61.7-50.2,111.8-111.8,111.8c-61.7,0-111.8-50.2-111.8-111.8C717,551.2,767.1,501,828.8,501z M171.2,724.7c-61.6,0-111.8-50.2-111.8-111.8c0-61.7,50.2-111.8,111.8-111.8c47.4,0,87.9,29.7,104.1,71.4c-59.3,12.6-118.1,25.2-118.1,25.2l7.6,41.8l116.1-5.1C270.9,685.7,225.5,724.7,171.2,724.7z M364.8,630.6c3.3,11.2,7.6,20.1,13.2,23.9l-51.8,2c2.2-7.9,3.9-16.1,4.9-24.5L364.8,630.6z\\\"/></g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g></g>\\r\\n</svg>\"","const DEFAULT_LABEL = 'WhatsApp';\nconst DEFAULT_ARIA_LABEL = 'Contactar por WhatsApp';\nconst DEFAULT_MENU_LABEL = 'compra de motos';\nconst DEFAULT_CLOSED_MESSAGE = 'En este momento no es posible atender su solicitud. Le invitamos a contactarnos dentro de nuestro horario de atencion.';\nconst DEFAULT_WHATSAPP_COLOR = '#25d366';\nconst DEFAULT_BRAND_COLOR = '#000000';\nconst DEFAULT_OPTION_ICON = 'motorcycle';\nconst WHATSAPP_BASE_URL = 'https://wa.me/';\nconst OPTION_ICON_SVGS = import.meta.glob('../ws/*.svg', {\n eager: true,\n import: 'default',\n query: '?raw'\n}) as Record<string, string>;\nconst BRAND_COLORS: Record<string, string> = {\n gasgas: '#cb0d25',\n hqv: '#002550',\n ktm: '#ff6600',\n rs: '#000000',\n voge: '#000000'\n};\nconst BRAND_ALIASES: Record<string, string> = {\n gas: 'gasgas',\n gasgas: 'gasgas',\n husqvarna: 'hqv'\n};\nconst DAY_ALIASES: Record<string, number> = {\n '0': 0,\n '7': 0,\n dom: 0,\n domingo: 0,\n sun: 0,\n sunday: 0,\n '1': 1,\n lun: 1,\n lunes: 1,\n mon: 1,\n monday: 1,\n '2': 2,\n mar: 2,\n martes: 2,\n tue: 2,\n tuesday: 2,\n '3': 3,\n mie: 3,\n miercoles: 3,\n wed: 3,\n wednesday: 3,\n '4': 4,\n jue: 4,\n jueves: 4,\n thu: 4,\n thursday: 4,\n '5': 5,\n vie: 5,\n viernes: 5,\n fri: 5,\n friday: 5,\n '6': 6,\n sab: 6,\n sabado: 6,\n sat: 6,\n saturday: 6\n};\nconst WEEKDAY_SHORT_BY_ENGLISH: Record<string, number> = {\n sun: 0,\n mon: 1,\n tue: 2,\n wed: 3,\n thu: 4,\n fri: 5,\n sat: 6\n};\nconst OPTION_ICON_SVGS_BY_KEY = Object.fromEntries(\n Object.entries(OPTION_ICON_SVGS).map(([path, svg]) => {\n const name = path.split('/').pop()?.replace(/\\.svg$/i, '') ?? '';\n return [normalizeToken(name), normalizeIconSvg(svg)];\n })\n);\n\ninterface WhatsappMenuOption {\n label: string;\n telefono: string;\n mensaje: string;\n target: string;\n icon: string;\n}\n\nfunction normalizeIconSvg(svg: string) {\n return svg\n .replace(/<\\?xml[\\s\\S]*?\\?>\\s*/i, '')\n .replace(/<!DOCTYPE[\\s\\S]*?>\\s*/i, '')\n .replace(/<metadata>[\\s\\S]*?<\\/metadata>\\s*/i, '')\n .replace(/<svg\\b/i, '<svg class=\"menu-link-icon\" aria-hidden=\"true\" focusable=\"false\"')\n .replace(/style=\"fill:\\s*#ffffff;?\"/i, 'style=\"fill: currentColor;\"');\n}\n\nfunction normalizeToken(value: string) {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '');\n}\n\nfunction isIconUrl(value: string) {\n return /^(https?:\\/\\/|\\/\\/|data:image\\/|blob:|\\/|\\.\\/|\\.\\.\\/)/i.test(value.trim());\n}\n\nexport class RsWhatsapp extends HTMLElement {\n static tag = 'rs-whatsapp';\n\n private root: ShadowRoot;\n private buttonEl!: HTMLButtonElement;\n private menuEl!: HTMLElement;\n private generatedOptionsEl!: HTMLElement;\n private customMenuSlotEl!: HTMLSlotElement;\n private closedMessageEl!: HTMLElement;\n private closedMessageTextEl!: HTMLElement;\n private labelEl!: HTMLSpanElement;\n private childrenObserver?: MutationObserver;\n\n static get observedAttributes() {\n return [\n 'telefono',\n 'mensaje',\n 'label',\n 'menu-label',\n 'aria-label',\n 'position',\n 'show-label',\n 'target',\n 'marca',\n 'icon',\n 'horario',\n 'fuera-horario',\n 'mensaje-fuera-horario',\n 'time-zone'\n ];\n }\n\n constructor() {\n super();\n this.root = this.attachShadow({ mode: 'open' });\n this.root.innerHTML = `\n <style>\n :host {\n position: fixed;\n right: var(--rs-whatsapp-right, 24px);\n bottom: var(--rs-whatsapp-bottom, 24px);\n z-index: var(--rs-whatsapp-z-index, 9999);\n display: inline-block;\n --rs-whatsapp-brand-color: ${DEFAULT_WHATSAPP_COLOR};\n font-family: var(--rs-whatsapp-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif);\n }\n :host([position=\"bottom-left\"]) {\n right: auto;\n left: var(--rs-whatsapp-left, 24px);\n bottom: var(--rs-whatsapp-bottom, 24px);\n top: auto;\n }\n :host([position=\"top-right\"]) {\n right: var(--rs-whatsapp-right, 24px);\n left: auto;\n bottom: auto;\n top: var(--rs-whatsapp-top, 24px);\n }\n :host([position=\"top-left\"]) {\n right: auto;\n left: var(--rs-whatsapp-left, 24px);\n bottom: auto;\n top: var(--rs-whatsapp-top, 24px);\n }\n .button {\n box-sizing: border-box;\n border: 0;\n width: var(--rs-whatsapp-size, 60px);\n min-width: var(--rs-whatsapp-size, 60px);\n height: var(--rs-whatsapp-size, 60px);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n border-radius: 999px;\n background: var(--rs-whatsapp-bg, ${DEFAULT_WHATSAPP_COLOR});\n color: var(--rs-whatsapp-color, #ffffff);\n box-shadow: var(--rs-whatsapp-shadow, 0 10px 24px rgb(0 0 0 / 22%));\n cursor: pointer;\n font: inherit;\n transition: transform 0.2s ease, box-shadow 0.2s ease, filter 0.2s ease;\n outline: none;\n }\n .button:hover,\n .button:focus-visible {\n transform: translateY(-2px);\n filter: brightness(1.03);\n box-shadow: var(--rs-whatsapp-shadow-hover, 0 14px 28px rgb(0 0 0 / 26%));\n }\n .button:active {\n transform: translateY(0);\n }\n .icon-stack {\n width: calc(var(--rs-whatsapp-size, 60px) * 0.52);\n height: calc(var(--rs-whatsapp-size, 60px) * 0.52);\n position: relative;\n flex: 0 0 auto;\n display: block;\n }\n .icon-stack svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n display: block;\n transition: opacity 0.18s ease, transform 0.22s ease;\n }\n .whatsapp-icon {\n opacity: 1;\n transform: rotate(0deg) scale(1);\n }\n .close-icon {\n opacity: 0;\n transform: rotate(-90deg) scale(0.72);\n }\n :host([open]) .whatsapp-icon {\n opacity: 0;\n transform: rotate(90deg) scale(0.72);\n }\n :host([open]) .close-icon {\n opacity: 1;\n transform: rotate(0deg) scale(1);\n }\n .label {\n display: none;\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.95rem;\n font-weight: 700;\n line-height: 1;\n }\n :host([show-label]) .button {\n width: auto;\n min-width: var(--rs-whatsapp-size, 60px);\n padding: 0 20px 0 16px;\n }\n :host([show-label]) .label {\n display: inline;\n }\n .menu {\n box-sizing: border-box;\n position: absolute;\n right: 0;\n bottom: calc(var(--rs-whatsapp-size, 60px) + 12px);\n width: min(var(--rs-whatsapp-menu-width, 280px), calc(100vw - 32px));\n padding: 8px;\n border: 1px solid var(--rs-whatsapp-menu-border, #e5e7eb);\n border-radius: var(--rs-whatsapp-menu-radius, 8px);\n background: var(--rs-whatsapp-menu-bg, #ffffff);\n color: var(--rs-whatsapp-menu-color, #111827);\n box-shadow: var(--rs-whatsapp-menu-shadow, 0 18px 38px rgb(0 0 0 / 18%));\n transform-origin: bottom right;\n }\n .menu[hidden] {\n display: none;\n }\n .menu-heading {\n padding: 10px 12px 12px;\n border-bottom: 1px solid var(--rs-whatsapp-menu-border, #e5e7eb);\n margin-bottom: 6px;\n text-align: center;\n }\n .menu-welcome,\n .menu-question {\n display: block;\n margin: 0;\n font-size: 0.92rem;\n font-weight: 600;\n line-height: 1.35;\n color: var(--rs-whatsapp-menu-muted, #4b5563);\n }\n .menu-brand {\n display: block;\n margin: 2px 0;\n font-size: 1.2rem;\n font-weight: 800;\n line-height: 1.2;\n color: var(--rs-whatsapp-menu-brand, #111827);\n }\n .menu-options {\n display: grid;\n gap: 2px;\n }\n .menu-options[hidden] {\n display: none;\n }\n .closed-message {\n margin: 0;\n padding: 14px 12px;\n border-radius: 6px;\n background: var(--rs-whatsapp-closed-bg, #f3f4f6);\n color: var(--rs-whatsapp-closed-color, #374151);\n font-size: 0.95rem;\n font-weight: 600;\n line-height: 1.35;\n text-align: center;\n white-space: pre-line;\n }\n .closed-message[hidden],\n slot[hidden] {\n display: none;\n }\n :host([position=\"bottom-left\"]) .menu {\n right: auto;\n left: 0;\n transform-origin: bottom left;\n }\n :host([position=\"top-right\"]) .menu {\n top: calc(var(--rs-whatsapp-size, 60px) + 12px);\n bottom: auto;\n transform-origin: top right;\n }\n :host([position=\"top-left\"]) .menu {\n top: calc(var(--rs-whatsapp-size, 60px) + 12px);\n right: auto;\n bottom: auto;\n left: 0;\n transform-origin: top left;\n }\n .menu-link,\n ::slotted(a),\n ::slotted(button) {\n box-sizing: border-box;\n width: 100%;\n min-height: 44px;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: 0.95rem;\n font-weight: 700;\n line-height: 1.2;\n text-align: left;\n text-decoration: none;\n cursor: pointer;\n }\n .menu-link:hover,\n .menu-link:focus-visible,\n ::slotted(a:hover),\n ::slotted(a:focus-visible),\n ::slotted(button:hover),\n ::slotted(button:focus-visible) {\n background: var(--rs-whatsapp-menu-hover-bg, #f3f4f6);\n outline: none;\n }\n .menu-link[aria-disabled=\"true\"] {\n cursor: not-allowed;\n opacity: 0.62;\n }\n .menu-link-icon {\n width: 44px;\n height: 32px;\n flex: 0 0 auto;\n color: var(--rs-whatsapp-menu-icon-color, var(--rs-whatsapp-brand-color));\n object-fit: contain;\n }\n @media (max-width: 640px) {\n :host {\n right: var(--rs-whatsapp-mobile-right, 16px);\n bottom: var(--rs-whatsapp-mobile-bottom, 16px);\n }\n :host([position=\"bottom-left\"]) {\n left: var(--rs-whatsapp-mobile-left, 16px);\n }\n :host([position=\"top-right\"]) {\n top: var(--rs-whatsapp-mobile-top, 16px);\n }\n :host([position=\"top-left\"]) {\n left: var(--rs-whatsapp-mobile-left, 16px);\n top: var(--rs-whatsapp-mobile-top, 16px);\n }\n :host([show-label]) .label {\n max-width: 120px;\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .button,\n .icon-stack svg {\n transition: none;\n }\n }\n </style>\n <div class=\"menu\" role=\"dialog\" aria-labelledby=\"rs-whatsapp-menu-title\" hidden>\n <div class=\"menu-heading\" id=\"rs-whatsapp-menu-title\">\n <span class=\"menu-welcome\">Bienvenido a</span>\n <span class=\"menu-brand\">RS-SHOP</span>\n <span class=\"menu-question\">¿En que te podemos ayudar?</span>\n </div>\n <div class=\"closed-message\" data-closed-message hidden>\n <slot name=\"fuera-horario\">\n <span data-closed-message-text></span>\n </slot>\n </div>\n <div class=\"menu-options\" data-generated-options></div>\n <slot name=\"menu\"></slot>\n </div>\n <button class=\"button\" type=\"button\" aria-haspopup=\"dialog\" aria-expanded=\"false\">\n <span class=\"icon-stack\" aria-hidden=\"true\">\n <svg class=\"whatsapp-icon\" viewBox=\"0 0 448 512\" focusable=\"false\">\n <path fill=\"currentColor\" d=\"M380.9 97.1c-41.9-42-97.7-65.1-157-65.1-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3 18.6-68.1-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1s56.2 81.2 56.1 130.5c0 101.8-84.9 184.6-186.6 184.6zM325.1 300.5c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8s-14.3 18-17.6 21.8c-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7s-12.5-30.1-17.1-41.2c-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2s-9.7 1.4-14.8 6.9c-5.1 5.6-19.4 19-19.4 46.3s19.9 53.7 22.6 57.4c2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4s4.6-24.1 3.2-26.4c-1.3-2.5-5-3.9-10.5-6.6z\" />\n </svg>\n <svg class=\"close-icon\" viewBox=\"0 0 24 24\" focusable=\"false\">\n <path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.6\" d=\"M6 6l12 12M18 6L6 18\" />\n </svg>\n </span>\n <span class=\"label\"></span>\n </button>\n `;\n }\n\n connectedCallback() {\n this.buttonEl = this.root.querySelector<HTMLButtonElement>('button')!;\n this.menuEl = this.root.querySelector<HTMLElement>('.menu')!;\n this.generatedOptionsEl = this.root.querySelector<HTMLElement>('[data-generated-options]')!;\n this.customMenuSlotEl = this.root.querySelector<HTMLSlotElement>('slot[name=\"menu\"]')!;\n this.closedMessageEl = this.root.querySelector<HTMLElement>('[data-closed-message]')!;\n this.closedMessageTextEl = this.root.querySelector<HTMLElement>('[data-closed-message-text]')!;\n this.labelEl = this.root.querySelector<HTMLSpanElement>('.label')!;\n this.buttonEl.addEventListener('click', this.handleButtonClick);\n this.menuEl.addEventListener('click', this.handleMenuClick);\n this.customMenuSlotEl.addEventListener('slotchange', this.handleCustomMenuSlotChange);\n document.addEventListener('click', this.handleDocumentClick);\n document.addEventListener('keydown', this.handleDocumentKeydown);\n this.childrenObserver = new MutationObserver(this.handleChildrenMutation);\n this.childrenObserver.observe(this, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true,\n attributeFilter: ['label', 'telefono', 'mensaje', 'target', 'icon', 'dias', 'desde', 'hasta']\n });\n this.syncAttributesToState();\n }\n\n disconnectedCallback() {\n this.buttonEl?.removeEventListener('click', this.handleButtonClick);\n this.menuEl?.removeEventListener('click', this.handleMenuClick);\n this.customMenuSlotEl?.removeEventListener('slotchange', this.handleCustomMenuSlotChange);\n document.removeEventListener('click', this.handleDocumentClick);\n document.removeEventListener('keydown', this.handleDocumentKeydown);\n this.childrenObserver?.disconnect();\n }\n\n attributeChangedCallback() {\n if (this.isConnected) {\n this.syncAttributesToState();\n }\n }\n\n private syncAttributesToState() {\n const label = (this.getAttribute('label') ?? '').trim() || DEFAULT_LABEL;\n const menuLabel = (this.getAttribute('menu-label') ?? '').trim() || DEFAULT_MENU_LABEL;\n const ariaLabel = (this.getAttribute('aria-label') ?? '').trim() || DEFAULT_ARIA_LABEL;\n const target = (this.getAttribute('target') ?? '_blank').trim() || '_blank';\n const icon = (this.getAttribute('icon') ?? DEFAULT_OPTION_ICON).trim() || DEFAULT_OPTION_ICON;\n const isClosed = this.isOutsideBusinessHours();\n\n this.labelEl.textContent = label;\n this.buttonEl.setAttribute('aria-label', ariaLabel);\n this.buttonEl.setAttribute('title', ariaLabel);\n this.syncBrandVariant();\n\n this.closedMessageTextEl.textContent = this.getClosedMessage();\n this.closedMessageEl.hidden = !isClosed;\n this.customMenuSlotEl.hidden = isClosed;\n\n if (isClosed) {\n this.generatedOptionsEl.hidden = true;\n this.generatedOptionsEl.replaceChildren();\n return;\n }\n\n this.renderMenuOptions(menuLabel, target, icon);\n }\n\n private buildWhatsappUrl(telefonoValue: string | null, mensajeValue: string | null) {\n const telefono = this.sanitizePhone(telefonoValue);\n\n if (!telefono) {\n return '';\n }\n\n const mensaje = (mensajeValue ?? '').trim();\n const query = mensaje ? `?text=${encodeURIComponent(mensaje)}` : '';\n\n return `${WHATSAPP_BASE_URL}${telefono}${query}`;\n }\n\n private sanitizePhone(value: string | null) {\n return (value ?? '').replace(/[^\\d]/g, '');\n }\n\n private syncBrandVariant() {\n const marca = (this.getAttribute('marca') ?? '').trim();\n\n if (!marca) {\n this.style.setProperty('--rs-whatsapp-brand-color', DEFAULT_WHATSAPP_COLOR);\n return;\n }\n\n const brandKey = this.normalizeBrandKey(marca);\n const color = BRAND_COLORS[brandKey] ?? DEFAULT_BRAND_COLOR;\n this.style.setProperty('--rs-whatsapp-brand-color', color);\n }\n\n private normalizeBrandKey(value: string) {\n const normalized = normalizeToken(value);\n return BRAND_ALIASES[normalized] ?? normalized;\n }\n\n private renderMenuOptions(fallbackLabel: string, fallbackTarget: string, fallbackIcon: string) {\n const hasCustomMenu = this.customMenuSlotEl.assignedElements({ flatten: true }).length > 0;\n\n if (hasCustomMenu) {\n this.generatedOptionsEl.hidden = true;\n this.generatedOptionsEl.replaceChildren();\n return;\n }\n\n const options = this.getWhatsappOptions(fallbackLabel, fallbackTarget, fallbackIcon).filter((option) => {\n return this.sanitizePhone(option.telefono);\n });\n const links = options.map((option) => this.createMenuLink(option));\n\n this.generatedOptionsEl.replaceChildren(...links);\n this.generatedOptionsEl.hidden = false;\n }\n\n private getWhatsappOptions(fallbackLabel: string, fallbackTarget: string, fallbackIcon: string): WhatsappMenuOption[] {\n const optionElements = Array.from(this.querySelectorAll<RsWhatsappOption>(RsWhatsappOption.tag));\n\n if (optionElements.length) {\n return optionElements.map((optionEl) => ({\n label: (optionEl.getAttribute('label') ?? optionEl.textContent ?? '').trim() || fallbackLabel,\n telefono: (optionEl.getAttribute('telefono') ?? '').trim(),\n mensaje: (optionEl.getAttribute('mensaje') ?? '').trim(),\n target: (optionEl.getAttribute('target') ?? fallbackTarget).trim() || fallbackTarget,\n icon: (optionEl.getAttribute('icon') ?? fallbackIcon).trim() || fallbackIcon\n }));\n }\n\n return [\n {\n label: fallbackLabel,\n telefono: (this.getAttribute('telefono') ?? '').trim(),\n mensaje: (this.getAttribute('mensaje') ?? '').trim(),\n target: fallbackTarget,\n icon: fallbackIcon\n }\n ];\n }\n\n private createMenuLink(option: WhatsappMenuOption) {\n const linkEl = document.createElement('a');\n const labelEl = document.createElement('span');\n const href = this.buildWhatsappUrl(option.telefono, option.mensaje);\n\n linkEl.className = 'menu-link';\n linkEl.rel = 'noopener noreferrer';\n linkEl.target = option.target;\n labelEl.className = 'menu-label';\n labelEl.textContent = option.label;\n const iconEl = this.createOptionIcon(option.icon);\n\n if (iconEl) {\n linkEl.append(iconEl);\n }\n\n linkEl.append(labelEl);\n\n if (href) {\n linkEl.href = href;\n linkEl.tabIndex = 0;\n return linkEl;\n }\n\n linkEl.setAttribute('aria-disabled', 'true');\n linkEl.tabIndex = -1;\n return linkEl;\n }\n\n private createOptionIcon(icon: string) {\n const normalizedIcon = icon.trim();\n const iconKey = normalizeToken(normalizedIcon);\n\n if (iconKey === 'none') {\n return null;\n }\n\n if (isIconUrl(normalizedIcon)) {\n const imageEl = document.createElement('img');\n imageEl.className = 'menu-link-icon';\n imageEl.src = normalizedIcon;\n imageEl.alt = '';\n imageEl.setAttribute('aria-hidden', 'true');\n imageEl.decoding = 'async';\n return imageEl;\n }\n\n const iconSvg = OPTION_ICON_SVGS_BY_KEY[iconKey || DEFAULT_OPTION_ICON];\n\n if (!iconSvg) {\n return null;\n }\n\n const template = document.createElement('template');\n template.innerHTML = iconSvg;\n return template.content.firstElementChild?.cloneNode(true) ?? document.createElement('span');\n }\n\n private getClosedMessage() {\n const message = (this.getAttribute('mensaje-fuera-horario') ?? '').trim() || DEFAULT_CLOSED_MESSAGE;\n const scheduleSummary = this.getScheduleSummary();\n\n return scheduleSummary ? `${message}\\nHorario de atencion:\\n${scheduleSummary}` : message;\n }\n\n private isOutsideBusinessHours() {\n const manualClosedValue = this.getAttribute('fuera-horario');\n\n if (manualClosedValue !== null) {\n const normalized = normalizeToken(manualClosedValue);\n return normalized !== 'false' && normalized !== '0' && normalized !== 'no';\n }\n\n const schedule = this.getScheduleSegments().join(';');\n\n if (!schedule) {\n return false;\n }\n\n return !this.isWithinBusinessHours(schedule);\n }\n\n private getScheduleSegments() {\n const scheduleElements = Array.from(this.querySelectorAll<RsWhatsappSchedule>(RsWhatsappSchedule.tag));\n\n if (scheduleElements.length) {\n return scheduleElements\n .map((scheduleEl) => {\n const days = (scheduleEl.getAttribute('dias') ?? '').trim();\n const start = (scheduleEl.getAttribute('desde') ?? '').trim();\n const end = (scheduleEl.getAttribute('hasta') ?? '').trim();\n\n if (!days || !start || !end) {\n return '';\n }\n\n return `${days} ${start}-${end}`;\n })\n .filter(Boolean);\n }\n\n return (this.getAttribute('horario') ?? '')\n .split(';')\n .map((segment) => segment.trim())\n .filter(Boolean);\n }\n\n private getScheduleSummary() {\n const scheduleElements = Array.from(this.querySelectorAll<RsWhatsappSchedule>(RsWhatsappSchedule.tag));\n\n if (scheduleElements.length) {\n return scheduleElements\n .map((scheduleEl) => {\n const days = (scheduleEl.getAttribute('dias') ?? '').trim();\n const start = (scheduleEl.getAttribute('desde') ?? '').trim();\n const end = (scheduleEl.getAttribute('hasta') ?? '').trim();\n\n if (!days || !start || !end) {\n return '';\n }\n\n return `${days} ${start}-${end}`;\n })\n .filter(Boolean)\n .join('\\n');\n }\n\n return (this.getAttribute('horario') ?? '')\n .split(';')\n .map((segment) => segment.trim())\n .filter(Boolean)\n .join('\\n');\n }\n\n private isWithinBusinessHours(schedule: string) {\n const currentTime = this.getCurrentTimeParts();\n\n return schedule.split(';').some((segment) => {\n return this.isScheduleSegmentActive(segment, currentTime.day, currentTime.minutes);\n });\n }\n\n private getCurrentTimeParts() {\n const timeZone = (this.getAttribute('time-zone') ?? '').trim();\n\n if (!timeZone) {\n const now = new Date();\n return {\n day: now.getDay(),\n minutes: now.getHours() * 60 + now.getMinutes()\n };\n }\n\n try {\n const now = new Date();\n const weekday = new Intl.DateTimeFormat('en-US', {\n timeZone,\n weekday: 'short'\n })\n .format(now)\n .toLowerCase();\n const timeParts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n hour12: false,\n hour: '2-digit',\n minute: '2-digit'\n }).formatToParts(now);\n const hour = Number(timeParts.find((part) => part.type === 'hour')?.value ?? 0) % 24;\n const minute = Number(timeParts.find((part) => part.type === 'minute')?.value ?? 0);\n\n return {\n day: WEEKDAY_SHORT_BY_ENGLISH[weekday] ?? now.getDay(),\n minutes: hour * 60 + minute\n };\n } catch {\n const now = new Date();\n return {\n day: now.getDay(),\n minutes: now.getHours() * 60 + now.getMinutes()\n };\n }\n }\n\n private isScheduleSegmentActive(segment: string, currentDay: number, currentMinutes: number) {\n const match = segment\n .trim()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .match(/^(.+?)\\s+(\\d{1,2}:\\d{2})\\s*-\\s*(\\d{1,2}:\\d{2})$/);\n\n if (!match) {\n return false;\n }\n\n const days = this.parseScheduleDays(match[1]);\n const startMinutes = this.parseScheduleTime(match[2]);\n const endMinutes = this.parseScheduleTime(match[3]);\n\n if (!days.includes(currentDay) || startMinutes === null || endMinutes === null) {\n return false;\n }\n\n if (startMinutes <= endMinutes) {\n return currentMinutes >= startMinutes && currentMinutes <= endMinutes;\n }\n\n return currentMinutes >= startMinutes || currentMinutes <= endMinutes;\n }\n\n private parseScheduleDays(value: string) {\n const normalized = value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/\\s+/g, '');\n\n if (normalized === '*' || normalized === 'todos' || normalized === 'all') {\n return [0, 1, 2, 3, 4, 5, 6];\n }\n\n return normalized.split(',').flatMap((part) => {\n const [startToken, endToken] = part.split('-');\n const startDay = this.parseScheduleDay(startToken);\n const endDay = endToken ? this.parseScheduleDay(endToken) : startDay;\n\n if (startDay === null || endDay === null) {\n return [];\n }\n\n if (startDay === endDay) {\n return [startDay];\n }\n\n const days: number[] = [];\n let currentDay = startDay;\n\n while (true) {\n days.push(currentDay);\n\n if (currentDay === endDay) {\n return days;\n }\n\n currentDay = (currentDay + 1) % 7;\n }\n });\n }\n\n private parseScheduleDay(value: string | undefined) {\n if (!value) {\n return null;\n }\n\n const key = normalizeToken(value);\n return DAY_ALIASES[key] ?? null;\n }\n\n private parseScheduleTime(value: string) {\n const [hourValue, minuteValue] = value.split(':');\n const hour = Number(hourValue);\n const minute = Number(minuteValue);\n\n if (!Number.isInteger(hour) || !Number.isInteger(minute) || hour < 0 || hour > 23 || minute < 0 || minute > 59) {\n return null;\n }\n\n return hour * 60 + minute;\n }\n\n private setMenuOpen(isOpen: boolean) {\n this.menuEl.hidden = !isOpen;\n this.buttonEl.setAttribute('aria-expanded', String(isOpen));\n this.toggleAttribute('open', isOpen);\n }\n\n private handleButtonClick = () => {\n if (this.menuEl.hidden) {\n this.syncAttributesToState();\n }\n\n this.setMenuOpen(this.menuEl.hidden);\n };\n\n private handleMenuClick = (event: MouseEvent) => {\n const path = event.composedPath();\n const disabledLink = path.find((node) => {\n return node instanceof HTMLAnchorElement && node.getAttribute('aria-disabled') === 'true';\n });\n\n if (disabledLink) {\n event.preventDefault();\n return;\n }\n\n const interactiveElement = path.find((node) => {\n return node instanceof HTMLAnchorElement || node instanceof HTMLButtonElement;\n });\n\n if (interactiveElement) {\n this.setMenuOpen(false);\n }\n };\n\n private handleCustomMenuSlotChange = () => {\n this.syncAttributesToState();\n };\n\n private handleChildrenMutation = () => {\n this.syncAttributesToState();\n };\n\n private handleDocumentClick = (event: MouseEvent) => {\n if (this.menuEl.hidden || event.composedPath().includes(this)) {\n return;\n }\n\n this.setMenuOpen(false);\n };\n\n private handleDocumentKeydown = (event: KeyboardEvent) => {\n if (this.menuEl.hidden || event.key !== 'Escape') {\n return;\n }\n\n this.setMenuOpen(false);\n this.buttonEl.focus();\n };\n}\n\nexport class RsWhatsappOption extends HTMLElement {\n static tag = 'rs-whatsapp-option';\n}\n\nexport class RsWhatsappSchedule extends HTMLElement {\n static tag = 'rs-whatsapp-schedule';\n}\n","import { safeDefine } from './utils/define';\nimport { RsMap } from './components/rs-map';\nimport { RsWhatsapp, RsWhatsappOption, RsWhatsappSchedule } from './components/rs-whatsapp';\n\n\n// En dev, registramos directamente para probar en el navegador\nsafeDefine(RsMap.tag, RsMap);\nsafeDefine(RsWhatsappOption.tag, RsWhatsappOption);\nsafeDefine(RsWhatsappSchedule.tag, RsWhatsappSchedule);\nsafeDefine(RsWhatsapp.tag, RsWhatsapp);\n\nexport { RsMap, RsWhatsapp, RsWhatsappOption, RsWhatsappSchedule, safeDefine };\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'rs-map': RsMap;\n 'rs-whatsapp': RsWhatsapp;\n 'rs-whatsapp-option': RsWhatsappOption;\n 'rs-whatsapp-schedule': RsWhatsappSchedule;\n }\n}\n"],"names":["safeDefine","tag","Ctor","__vite_glob_1_0","__vite_glob_1_1","__vite_glob_1_2","__vite_glob_1_3","__vite_glob_1_4","__vite_glob_1_5","__vite_glob_1_6","__vite_glob_1_7","__vite_glob_1_8","__vite_glob_1_9","LOCAL_POINTS_LOADERS","PuntosMapas_gasgas_0$1","m","PuntosMapas_gasgas_1$1","PuntosMapas_hqv_0$1","PuntosMapas_hqv_1$1","PuntosMapas_ktm_0$1","PuntosMapas_ktm_1$1","PuntosMapas_voge_0$1","PuntosMapas_voge_1$1","LOCAL_MARKER_ICON_URLS","DEFAULT_BRAND_COLOR","FONT_AWESOME_LOCAL_PATH","DEFAULT_POINTS_API_URL","BRAND_COLORS","BRAND_ALIASES","TYPE_CODES","ZONE_ORDER","ZONE_LABELS","TYPE_LABELS","CONTINENTAL_CHILE_BOUNDS","DEFAULT_POINTS_CACHE_TTL_MS","POINTS_CACHE_DB_NAME","POINTS_CACHE_STORE_NAME","REGION_ZONE_MAP","_RsMap","__publicField","_a","event","zone","pos","latitude","longitude","nearest","nearestPosition","btn","_b","_c","name","_oldValue","newValue","resolve","reject","existingScript","script","params","error","g","initialCenter","firstPoint","point","position","value","normalized","days","label","normalizedCode","color","numeric","controller","marcaRequestValue","hasQuery","needsAmp","separator","requestUrl","cacheKey","cachedPayload","hasFreshCache","localFallbackPayload","response","payload","typedPayload","points","unmappablePoints","marca","tipoCode","path","existingRequest","loader","request","parsedPayload","dbEntry","raw","parsed","entry","db","result","grouped","fragment","zoneKey","section","header","title","empty","list","card","coordinateWarning","addressBlock","address","comuna","provincia","regionLine","mapPositionElement","mapActions","focusButton","icon","warning","text","details","hasDetails","actions","mapLinkElement","siteLink","emailLink","contactSection","contactTitle","phoneList","a","b","phone","item","iconWrapper","hasWhatsapp","whatsappIcon","content","numberEl","link","extra","mapWrapper","toggle","toggleIcon","toggleText","isHidden","url","iconClass","normalizedRegion","input","key","localIconUrl","pointTipoCode","fileName","lat","lng","rawCoordinates","marker","validPoints","bounds","iconUrl","markerPosition","cover","locationSection","strong","extraSection","line","phoneNumber","whatsappLink","href","external","_zone","isActive","baseLabel","bestDistance","distance","lat1","lon1","lat2","lon2","toRad","deg","dLat","dLon","pointId","el","state","targetZoom","currentZoom","needsZoom","ms","duration","startZoom","delta","startTime","ease","t","step","now","elapsed","progress","eased","nextZoom","targetLat","targetLng","onComplete","startCenter","startLat","startLng","deltaLat","deltaLng","nextLat","nextLng","className","digits","RsMap","__vite_glob_0_0","__vite_glob_0_1","DEFAULT_LABEL","DEFAULT_ARIA_LABEL","DEFAULT_MENU_LABEL","DEFAULT_CLOSED_MESSAGE","DEFAULT_WHATSAPP_COLOR","DEFAULT_OPTION_ICON","WHATSAPP_BASE_URL","OPTION_ICON_SVGS","DAY_ALIASES","WEEKDAY_SHORT_BY_ENGLISH","OPTION_ICON_SVGS_BY_KEY","svg","normalizeToken","normalizeIconSvg","isIconUrl","RsWhatsapp","node","_d","menuLabel","ariaLabel","target","_e","isClosed","telefonoValue","mensajeValue","telefono","mensaje","query","brandKey","fallbackLabel","fallbackTarget","fallbackIcon","links","option","optionElements","RsWhatsappOption","optionEl","_f","linkEl","labelEl","iconEl","normalizedIcon","iconKey","imageEl","iconSvg","template","message","scheduleSummary","manualClosedValue","schedule","scheduleElements","RsWhatsappSchedule","scheduleEl","start","end","segment","currentTime","timeZone","weekday","timeParts","hour","part","minute","currentDay","currentMinutes","match","startMinutes","endMinutes","startToken","endToken","startDay","endDay","hourValue","minuteValue","isOpen"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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"}
|