{"id":4843,"date":"2025-09-09T11:52:01","date_gmt":"2025-09-09T16:52:01","guid":{"rendered":"https:\/\/visitquito.ec\/eventos\/"},"modified":"2026-10-15T09:38:56","modified_gmt":"2026-10-15T14:38:56","slug":"eventos","status":"publish","type":"page","link":"https:\/\/visitquito.ec\/es\/eventos\/","title":{"rendered":"Qu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4843\" class=\"elementor elementor-4843 elementor-4511\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-405816e e-flex e-con-boxed e-con e-parent\" data-id=\"405816e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-2687ac4 e-con-full e-flex e-con e-child\" data-id=\"2687ac4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bf1a9ca elementor-widget elementor-widget-image\" data-id=\"bf1a9ca\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/visitquito.ec\/es\/conciertos-y-grandes-eventos-en-quito\/\">\n\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"1280\" height=\"259\" src=\"https:\/\/visitquito.ec\/wp-content\/uploads\/2026\/04\/HeroShoot-grandes-eventos-es.jpg\" class=\"attachment-full size-full wp-image-9581\" alt=\"Quito ciudad de Grandes Eventos - VisitQuito - Quito turismo\" srcset=\"https:\/\/visitquito.ec\/wp-content\/uploads\/2026\/04\/HeroShoot-grandes-eventos-es.jpg 1280w, https:\/\/visitquito.ec\/wp-content\/uploads\/2026\/04\/HeroShoot-grandes-eventos-es-300x61.jpg 300w, https:\/\/visitquito.ec\/wp-content\/uploads\/2026\/04\/HeroShoot-grandes-eventos-es-1024x207.jpg 1024w, https:\/\/visitquito.ec\/wp-content\/uploads\/2026\/04\/HeroShoot-grandes-eventos-es-768x155.jpg 768w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-00ca843 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"00ca843\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e6b813e elementor-widget elementor-widget-heading\" data-id=\"e6b813e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Qu\u00e9 hacer en Quito hoy: agenda de eventos en Quito<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c21d286 e-grid e-con-full e-con e-child\" data-id=\"c21d286\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e02fbb7 elementor-widget elementor-widget-text-editor\" data-id=\"e02fbb7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Encuentra <strong>qu\u00e9 hacer en Quito hoy,<\/strong> esta semana y durante el mes en una sola agenda actualizada. Aqu\u00ed podr\u00e1s consultar conciertos, festivales, teatro, ferias, congresos, actividades culturales y eventos especiales en distintos recintos de la ciudad. Explora la agenda por fecha, categor\u00eda o lugar y descubre planes para disfrutar Quito en cualquier momento del a\u00f1o.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-85229e9 elementor-widget elementor-widget-text-editor\" data-id=\"85229e9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Si est\u00e1s buscando hoy en Quito conciertos, eventos culturales, festivales, ferias o actividades para hacer en familia, esta p\u00e1gina re\u00fane una selecci\u00f3n actualizada de eventos en Quito para ayudarte a encontrar planes seg\u00fan tus intereses. Desde grandes conciertos hasta agenda cultural, congresos y experiencias urbanas, aqu\u00ed puedes revisar los eventos del d\u00eda, de la semana y del mes.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d173e1f elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"d173e1f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-647db8e elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-heading\" data-id=\"647db8e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Agenda de Grandes Eventos<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c378ec6 e-con-full e-flex e-con e-child\" data-id=\"c378ec6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-96d73ea elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-skin-carousel elementor-arrows-yes elementor-pagination-type-bullets elementor-pagination-position-outside elementor-widget elementor-widget-media-carousel\" data-id=\"96d73ea\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;slides_per_view&quot;:&quot;3&quot;,&quot;slides_to_scroll&quot;:&quot;1&quot;,&quot;slides_per_view_mobile&quot;:&quot;1&quot;,&quot;space_between_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:0,&quot;sizes&quot;:[]},&quot;skin&quot;:&quot;carousel&quot;,&quot;effect&quot;:&quot;slide&quot;,&quot;show_arrows&quot;:&quot;yes&quot;,&quot;pagination&quot;:&quot;bullets&quot;,&quot;speed&quot;:500,&quot;autoplay&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;loop&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;space_between&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:10,&quot;sizes&quot;:[]},&quot;space_between_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:10,&quot;sizes&quot;:[]}}\" data-widget_type=\"media-carousel.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-swiper\">\n\t\t\t\t\t<div class=\"elementor-main-swiper swiper\" role=\"region\" aria-roledescription=\"carousel\" aria-label=\"Slides\">\n\t\t\t\t<div class=\"swiper-wrapper\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\">\n\t\t\t\t\t\t\t<a href=\"https:\/\/www.feelthetickets.com\/\" target=\"_blank\">\t\t<div class=\"elementor-carousel-image\" role=\"img\" aria-label=\"ARCANGEL-1920X1080\" style=\"background-image: url(&#039;https:\/\/visitquito.ec\/wp-content\/uploads\/2026\/07\/ARCANGEL-1920X1080-1.jpg&#039;)\">\n\n\t\t\t\n\t\t\t\t\t<\/div>\n\t\t<\/a>\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\">\n\t\t\t\t\t\t\t<a href=\"https:\/\/www.feelthetickets.com\/\" target=\"_blank\">\t\t<div class=\"elementor-carousel-image\" role=\"img\" aria-label=\"FTC-29AGO\" style=\"background-image: url(&#039;https:\/\/visitquito.ec\/wp-content\/uploads\/2026\/06\/FTC-29AGO.jpg&#039;)\">\n\n\t\t\t\n\t\t\t\t\t<\/div>\n\t\t<\/a>\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\">\n\t\t\t\t\t\t\t<a href=\"https:\/\/www.feelthetickets.com\/\" target=\"_blank\">\t\t<div class=\"elementor-carousel-image\" role=\"img\" aria-label=\"ROMEO-SANTOS-26-SEPTIEMBRE\" style=\"background-image: url(&#039;https:\/\/visitquito.ec\/wp-content\/uploads\/2026\/06\/ROMEO-SANTOS-26-SEPTIEMBRE.jpg&#039;)\">\n\n\t\t\t\n\t\t\t\t\t<\/div>\n\t\t<\/a>\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-slide\" role=\"group\" aria-roledescription=\"slide\">\n\t\t\t\t\t\t\t<a href=\"https:\/\/www.feelthetickets.com\/\" target=\"_blank\">\t\t<div class=\"elementor-carousel-image\" role=\"img\" aria-label=\"DEPLEPPARD-30OCT\" style=\"background-image: url(&#039;https:\/\/visitquito.ec\/wp-content\/uploads\/2026\/06\/DEPLEPPARD-30OCT.jpg&#039;)\">\n\n\t\t\t\n\t\t\t\t\t<\/div>\n\t\t<\/a>\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-prev\" role=\"button\" tabindex=\"0\" aria-label=\"Anterior\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-left\" viewBox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M646 125C629 125 613 133 604 142L308 442C296 454 292 471 292 487 292 504 296 521 308 533L604 854C617 867 629 875 646 875 663 875 679 871 692 858 704 846 713 829 713 812 713 796 708 779 692 767L438 487 692 225C700 217 708 204 708 187 708 171 704 154 692 142 675 129 663 125 646 125Z\"><\/path><\/svg>\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<div class=\"elementor-swiper-button elementor-swiper-button-next\" role=\"button\" tabindex=\"0\" aria-label=\"Siguiente\">\n\t\t\t\t\t\t\t<svg aria-hidden=\"true\" class=\"e-font-icon-svg e-eicon-chevron-right\" viewBox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M696 533C708 521 713 504 713 487 713 471 708 454 696 446L400 146C388 133 375 125 354 125 338 125 325 129 313 142 300 154 292 171 292 187 292 204 296 221 308 233L563 492 304 771C292 783 288 800 288 817 288 833 296 850 308 863 321 871 338 875 354 875 371 875 388 867 400 854L696 533Z\"><\/path><\/svg>\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"swiper-pagination\"><\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-53aacc10 e-flex e-con-boxed e-con e-parent\" data-id=\"53aacc10\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-60e7b6c1 e-con-full e-flex e-con e-child\" data-id=\"60e7b6c1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1ca8183a elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"1ca8183a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-38089a66 elementor-widget elementor-widget-heading\" data-id=\"38089a66\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Eventos<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-25567285 e-con-full e-flex e-con e-child\" data-id=\"25567285\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e55fcc9 elementor-widget elementor-widget-shortcode\" data-id=\"e55fcc9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">    <style>\n:root {\n      --accent: #22ffa5;\n      --accent-deep: #11d98a;\n      --accent-soft: rgba(34, 255, 165, .14);\n      --bg: #f3f5f4;\n      --panel: #ffffff;\n      --text: #111111;\n      --muted: #6b6f72;\n      --line: #e4e8e6;\n      --line-dark: #cfd7d3;\n      --chip: #f8faf9;\n      --shadow: 0 18px 40px rgba(17, 17, 17, .06);\n      --shadow-soft: 0 10px 20px rgba(17, 17, 17, .04);\n      --radius: 22px;\n    }\n    * { box-sizing: border-box; }\n    html { scroll-behavior: smooth; }\n    body {\n      margin: 0;\n      background:\n        radial-gradient(circle at top left, rgba(34,255,165,.12), transparent 25%),\n        linear-gradient(180deg, #f8faf9 0%, var(--bg) 100%);\n      color: var(--text);\n      font-family: 'Raleway', sans-serif;\n    }\n    a { color: inherit; }\n    .wrap {\n      max-width: 1440px;\n      margin: 0 auto;\n      padding: 24px 18px 42px;\n    }\n    .panel {\n      background: rgba(255,255,255,.88);\n      backdrop-filter: blur(8px);\n      border: 1px solid rgba(255,255,255,.65);\n      border-radius: 28px;\n      box-shadow: var(--shadow);\n      overflow: hidden;\n    }\n    .head {\n      position: relative;\n      padding: 30px 28px 10px;\n      border-bottom: 1px solid var(--line);\n      background:\n        linear-gradient(180deg, rgba(34,255,165,.08) 0%, rgba(255,255,255,.96) 70%);\n    }\n    .eyebrow {\n      display: inline-flex;\n      align-items: center;\n      gap: 8px;\n      margin-bottom: 14px;\n      padding: 8px 12px;\n      background: rgba(17,17,17,.92);\n      color: #fff;\n      border-radius: 999px;\n      font-size: 11px;\n      font-weight: 800;\n      letter-spacing: .12em;\n      text-transform: uppercase;\n    }\n    .title {\n      margin: 0 0 10px;\n      font-size: clamp(28px, 3vw, 46px);\n      line-height: 1.02;\n      font-weight: 900;\n      letter-spacing: -.03em;\n      max-width: 900px;\n    }\n    .sub {\n      margin: 0;\n      max-width: 900px;\n      font-size: 15px;\n      color: var(--muted);\n      line-height: 1.55;\n    }\n    .summary {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n      gap: 12px;\n      padding: 18px 28px 8px;\n    }\n    .summary-card {\n      background: linear-gradient(180deg, #ffffff 0%, #f9fbfa 100%);\n      border: 1px solid var(--line);\n      border-radius: 18px;\n      padding: 16px 16px 15px;\n      box-shadow: var(--shadow-soft);\n    }\n    .summary-label {\n      display: block;\n      margin-bottom: 8px;\n      font-size: 12px;\n      text-transform: uppercase;\n      letter-spacing: .08em;\n      font-weight: 800;\n      color: var(--muted);\n    }\n    .summary-value {\n      font-size: clamp(20px, 2vw, 30px);\n      font-weight: 900;\n      line-height: 1;\n      letter-spacing: -.03em;\n    }\n    .summary-help {\n      margin-top: 8px;\n      font-size: 13px;\n      color: var(--muted);\n      line-height: 1.45;\n    }\n    .controls {\n      padding: 14px 28px 12px;\n      display: grid;\n      gap: 10px;\n    }\n    .lang-switch {\n      display: flex;\n      justify-content: flex-end;\n      gap: 8px;\n    }\n    .lang-btn {\n      min-width: 54px;\n      height: 38px;\n      border-radius: 999px;\n      border: 1px solid var(--line);\n      background: #fff;\n      color: var(--text);\n      font: inherit;\n      font-size: 12px;\n      font-weight: 900;\n      cursor: pointer;\n      transition: transform .18s ease, border-color .18s ease, background .18s ease, box-shadow .18s ease;\n    }\n    .lang-btn:hover {\n      transform: translateY(-1px);\n      border-color: var(--accent);\n      box-shadow: 0 10px 22px rgba(17,17,17,.06);\n    }\n    .lang-btn.active {\n      background: linear-gradient(180deg, var(--accent) 0%, #b8ffd9 100%);\n      border-color: transparent;\n      box-shadow: 0 12px 26px rgba(34,255,165,.28);\n    }\n\n    .sub,\n    .summary,\n    .notice {\n      display: none !important;\n    }\n    .tabs-wrap {\n      display: flex;\n      gap: 10px;\n      overflow-x: auto;\n      padding-bottom: 2px;\n      scrollbar-width: thin;\n    }\n    .tabs-wrap::-webkit-scrollbar { height: 6px; }\n    .tabs-wrap::-webkit-scrollbar-thumb {\n      background: rgba(17,17,17,.18);\n      border-radius: 999px;\n    }\n    .tab {\n      flex: 0 0 auto;\n      display: inline-flex;\n      align-items: center;\n      gap: 8px;\n      border: 1px solid var(--line);\n      background: var(--chip);\n      color: var(--text);\n      border-radius: 999px;\n      padding: 11px 14px;\n      font: inherit;\n      font-size: 12px;\n      font-weight: 900;\n      text-transform: uppercase;\n      cursor: pointer;\n      transition: transform .18s ease, border-color .18s ease, background .18s ease, box-shadow .18s ease;\n      white-space: nowrap;\n    }\n    .tab:hover {\n      border-color: var(--accent);\n      transform: translateY(-1px);\n      box-shadow: 0 10px 22px rgba(17,17,17,.06);\n    }\n    .tab.active {\n      background: linear-gradient(180deg, var(--accent) 0%, #b8ffd9 100%);\n      border-color: transparent;\n      box-shadow: 0 12px 26px rgba(34,255,165,.28);\n    }\n    .tab-count {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      min-width: 22px;\n      height: 22px;\n      padding: 0 6px;\n      background: rgba(17,17,17,.08);\n      border-radius: 999px;\n      font-size: 11px;\n      font-weight: 900;\n    }\n    .tab.active .tab-count {\n      background: rgba(17,17,17,.14);\n    }\n    .filters {\n      display: grid;\n      grid-template-columns: minmax(0, 1.4fr) minmax(220px, .9fr) minmax(220px, .9fr);\n      gap: 12px;\n    }\n    .field {\n      position: relative;\n      display: flex;\n      align-items: center;\n      min-height: 54px;\n      border: 1px solid var(--line);\n      border-radius: 16px;\n      background: #fff;\n      box-shadow: var(--shadow-soft);\n    }\n    .field svg {\n      position: absolute;\n      left: 16px;\n      width: 18px;\n      height: 18px;\n      color: var(--muted);\n      pointer-events: none;\n    }\n    .field input,\n    .field select {\n      width: 100%;\n      min-height: 54px;\n      border: 0;\n      background: transparent;\n      outline: 0;\n      padding: 15px 16px 15px 48px;\n      font: inherit;\n      font-size: 14px;\n      color: var(--text);\n      border-radius: 16px;\n    }\n    .field select {\n      appearance: none;\n      cursor: pointer;\n      padding-right: 42px;\n    }\n    .field.select::after {\n      content: \"\u25be\";\n      position: absolute;\n      right: 16px;\n      color: var(--muted);\n      font-size: 14px;\n      pointer-events: none;\n    }\n    .meta {\n      display: flex;\n      justify-content: space-between;\n      gap: 12px;\n      align-items: center;\n      flex-wrap: wrap;\n    }\n    .meta p {\n      margin: 0;\n      color: var(--muted);\n      font-size: 14px;\n    }\n    .table-shell {\n      padding: 0 28px 10px;\n    }\n    .table-wrap {\n      border: 1px solid var(--line);\n      border-radius: 20px;\n      overflow: hidden;\n      background: #fff;\n      box-shadow: var(--shadow-soft);\n    }\n    table {\n      width: 100%;\n      border-collapse: collapse;\n      table-layout: fixed;\n    }\n    thead th {\n      padding: 14px 16px;\n      text-align: left;\n      font-size: 11.5px;\n      font-weight: 900;\n      text-transform: uppercase;\n      letter-spacing: .12em;\n      color: var(--muted);\n      border-bottom: 1px solid var(--line);\n      background: linear-gradient(180deg, #fbfcfc 0%, #f4f7f6 100%);\n      white-space: nowrap;\n    }\n    tbody tr {\n      transition: background .18s ease, transform .18s ease, box-shadow .18s ease;\n    }\n    tbody tr:nth-child(even) {\n      background: #fcfdfd;\n    }\n    tbody tr:hover {\n      background: #f7fffb;\n      box-shadow: inset 4px 0 0 var(--accent);\n    }\n    tbody td {\n      padding: 14px 16px;\n      font-size: 14px;\n      border-bottom: 1px solid #eef1ef;\n      vertical-align: middle;\n    }\n    tbody tr:last-child td {\n      border-bottom: 0;\n    }\n    .date-cell,\n    .time-cell,\n    .link-cell {\n      text-align: center;\n      vertical-align: middle;\n    }\n    .date-text {\n      display: inline-block;\n      font-family: 'Raleway', sans-serif;\n      font-size: 20px;\n      font-weight: 800;\n      color: #111111;\n      line-height: 1.1;\n      letter-spacing: -0.02em;\n      white-space: nowrap;\n    }\n    .artist {\n      font-weight: 900;\n      font-size: 15px;\n      line-height: 1.15;\n      margin-bottom: 2px;\n      letter-spacing: -.01em;\n    }\n    .tour {\n      color: var(--muted);\n      font-size: 12.5px;\n      line-height: 1.45;\n      white-space: normal;\n      overflow: visible;\n      text-overflow: initial;\n      display: block;\n      overflow-wrap: anywhere;\n      word-break: normal;\n    }\n    .venue {\n      font-weight: 800;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n    .more {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      gap: 8px;\n      text-decoration: none;\n      color: #111;\n      font-weight: 900;\n      padding: 11px 14px;\n      border-radius: 999px;\n      border: 1px solid transparent;\n      transition: background .18s ease, border-color .18s ease, transform .18s ease;\n      margin: 0 auto;\n    }\n    .more svg {\n      width: 16px;\n      height: 16px;\n      flex: none;\n    }\n    .more:hover {\n      background: var(--accent-soft);\n      border-color: rgba(34,255,165,.4);\n      transform: translateY(-1px);\n    }\n    .action-stack {\n      display: flex;\n      flex-direction: column;\n      align-items: flex-start;\n      justify-content: flex-start;\n      gap: 8px;\n      width: 100%;\n    }\n    .link-cell {\n      text-align: left;\n    }\n    .save-btn {\n      display: inline-flex;\n      align-items: center;\n      justify-content: flex-start;\n      gap: 8px;\n      text-decoration: none;\n      color: #111;\n      font-weight: 900;\n      padding: 0;\n      border: 0;\n      background: transparent;\n      transition: opacity .18s ease, transform .18s ease;\n      font: inherit;\n      cursor: pointer;\n      text-align: left;\n      white-space: nowrap;\n      line-height: 1;\n      align-self: flex-start;\n    }\n    .save-btn:hover {\n      opacity: .8;\n      transform: translateY(-1px);\n    }\n    .more {\n      white-space: nowrap;\n      line-height: 1;\n      align-self: flex-start;\n      justify-content: flex-start;\n      text-align: left;\n    }\n    .more svg,\n    .save-btn svg {\n      width: 18px;\n      height: 18px;\n      flex: none;\n    }\n    @media print {\n      body {\n        background: #fff !important;\n      }\n      .controls,\n      .footerbar,\n      .notice,\n      .link-cell {\n        display: none !important;\n      }\n      .wrap {\n        max-width: none;\n        padding: 0;\n      }\n      .panel {\n        border: 0;\n        box-shadow: none;\n        border-radius: 0;\n        background: #fff;\n      }\n      .head {\n        border-bottom: 1px solid #ddd;\n        padding: 18px 0 12px;\n      }\n      .table-shell {\n        padding: 0;\n      }\n      .table-wrap {\n        border: 0;\n        box-shadow: none;\n      }\n      table {\n        table-layout: auto;\n      }\n      thead {\n        display: table-header-group !important;\n      }\n      tbody,\n      tr,\n      td {\n        display: table-row-group;\n      }\n      tbody tr {\n        page-break-inside: avoid;\n      }\n    }\n    .venue-mobile { display: none; }\n    .date-stack {\n      display: inline-flex;\n      flex-direction: column;\n      align-items: flex-start;\n      gap: 6px;\n    }\n    .multiday-badge {\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n      padding: 6px 10px;\n      border-radius: 999px;\n      background: rgba(34,255,165,.12);\n      border: 1px solid rgba(34,255,165,.35);\n      font-size: 11px;\n      font-weight: 800;\n      line-height: 1;\n      color: #111;\n      white-space: nowrap;\n    }\n    .multiday-badge svg {\n      width: 13px;\n      height: 13px;\n      flex: none;\n      opacity: .75;\n    }\n    .multiday-note {\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n      margin-top: 4px;\n      font-size: 12px;\n      font-weight: 800;\n      color: var(--muted);\n      line-height: 1.3;\n    }\n    .multiday-note svg {\n      width: 13px;\n      height: 13px;\n      flex: none;\n      opacity: .75;\n    }\n    .meta {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 12px;\n    }\n    .footerbar {\n      padding: 10px 28px 26px;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      gap: 14px;\n      flex-wrap: wrap;\n    }\n    .pager-info {\n      color: var(--muted);\n      font-size: 14px;\n    }\n    .pagination {\n      display: flex;\n      gap: 8px;\n      flex-wrap: wrap;\n    }\n    .page-btn {\n      min-width: 44px;\n      height: 42px;\n      padding: 0 14px;\n      border-radius: 12px;\n      border: 1px solid var(--line);\n      background: #fff;\n      font: inherit;\n      font-weight: 900;\n      cursor: pointer;\n      transition: transform .18s ease, border-color .18s ease, background .18s ease;\n    }\n    .page-btn:hover:not(:disabled) {\n      transform: translateY(-1px);\n      border-color: var(--accent);\n    }\n    .page-btn.active {\n      background: linear-gradient(180deg, var(--accent) 0%, #b6ffd8 100%);\n      border-color: transparent;\n    }\n    .page-btn:disabled {\n      opacity: .45;\n      cursor: not-allowed;\n    }\n    .empty {\n      display: none;\n      margin: 0 28px 18px;\n      padding: 18px;\n      border: 1px dashed var(--line-dark);\n      border-radius: 16px;\n      background: #fbfbfb;\n      color: var(--muted);\n      font-weight: 700;\n    }\n    .notice {\n      margin: 0;\n      padding: 0 28px 28px;\n      color: var(--muted);\n      font-size: 13px;\n      line-height: 1.5;\n    }\n\n    @media (max-width: 991px) {\n      .summary {\n        grid-template-columns: 1fr;\n      }\n      .filters {\n        grid-template-columns: 1fr;\n      }\n      .date-pill {\n        min-width: 110px;\n      }\n    }\n\n    @media (max-width: 767px) {\n      .wrap {\n        padding: 10px 10px 22px;\n      }\n      .panel {\n        border-radius: 20px;\n      }\n      .head,\n      .controls,\n      .table-shell,\n      .footerbar,\n      .notice {\n        padding-left: 12px;\n        padding-right: 12px;\n      }\n      .summary {\n        padding: 12px 12px 6px;\n      }\n      .title {\n        font-size: 29px;\n      }\n      .sub,\n      .meta p,\n      .pager-info {\n        font-size: 13px;\n      }\n      .tabs-wrap {\n        gap: 8px;\n      }\n      .tab {\n        padding: 10px 12px;\n        font-size: 11px;\n      }\n      .field,\n      .field input,\n      .field select {\n        min-height: 50px;\n      }\n      .table-wrap {\n        border-radius: 16px;\n        overflow: visible;\n        border: 0;\n        background: transparent;\n        box-shadow: none;\n      }\n      table,\n      thead,\n      tbody,\n      tr,\n      td {\n        display: block;\n        width: 100%;\n      }\n      thead {\n        display: none;\n      }\n      tbody {\n        display: grid;\n        gap: 12px;\n      }\n      tbody tr {\n        background: linear-gradient(180deg, #ffffff 0%, #fbfcfc 100%) !important;\n        border: 1px solid var(--line);\n        border-radius: 18px;\n        box-shadow: var(--shadow-soft);\n        padding: 14px;\n      }\n      tbody tr:hover {\n        box-shadow: var(--shadow-soft);\n      }\n      tbody td {\n        border: 0;\n        padding: 0;\n      }\n      td.date-cell {\n        margin-bottom: 8px;\n      }\n      td.time-cell {\n        display: block;\n        margin-bottom: 10px;\n      }\n      td.artist-cell {\n        margin-bottom: 8px;\n      }\n      td.tour-cell {\n        margin-bottom: 10px;\n      }\n      td.venue-cell {\n        margin-bottom: 12px;\n      }\n      .date-text {\n        font-size: 18px;\n      }\n      .date-stack {\n        width: 100%;\n      }\n      .multiday-badge {\n        font-size: 10.5px;\n        padding: 6px 9px;\n      }\n      .multiday-note {\n        font-size: 12px;\n      }\n      .time-mobile {\n        display: inline-flex;\n        align-items: center;\n        gap: 8px;\n        padding: 8px 11px;\n        border-radius: 999px;\n        background: rgba(17,17,17,.06);\n        font-size: 12px;\n        font-weight: 800;\n        color: #111;\n        line-height: 1;\n      }\n      .time-mobile svg {\n        width: 14px;\n        height: 14px;\n        opacity: .7;\n      }\n      .artist {\n        font-size: 18px;\n        line-height: 1.22;\n        letter-spacing: -.01em;\n      }\n      .tour,\n      .venue {\n        white-space: normal;\n        overflow: visible;\n        text-overflow: initial;\n        font-size: 13px;\n        line-height: 1.45;\n      }\n      .venue-cell .venue {\n        display: none;\n      }\n      .venue-mobile {\n        display: inline-flex;\n        align-items: center;\n        gap: 8px;\n        font-size: 13px;\n        font-weight: 800;\n        line-height: 1.35;\n      }\n      .venue-mobile svg {\n        width: 14px;\n        height: 14px;\n        opacity: .7;\n        flex: none;\n        margin-top: 1px;\n      }\n      .mobile-meta {\n        display: flex;\n        align-items: center;\n        justify-content: stretch;\n        gap: 10px;\n        margin-top: 12px;\n        flex-wrap: wrap;\n        width: 100%;\n      }\n      .link-cell .more,\n      .link-cell .save-btn {\n        width: 100%;\n        min-height: 44px;\n        padding: 12px 14px;\n        border-radius: 999px;\n        justify-content: flex-start;\n        white-space: nowrap;\n        text-align: left;\n      }\n      .link-cell .more {\n        background: rgba(34,255,165,.12);\n        border: 1px solid rgba(34,255,165,.35);\n      }\n      .link-cell .save-btn {\n        background: #fff;\n        border: 1px solid rgba(17,17,17,.10);\n      }\n      .toolbar-actions {\n        padding: 0 0 12px;\n        justify-content: stretch;\n      }\n      .meta {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        gap: 12px;\n      }\n      .footerbar {\n        align-items: flex-start;\n      }\n      .pagination {\n        width: 100%;\n      }\n      .page-btn {\n        min-width: 40px;\n        height: 40px;\n      }\n    }\n  \n    .event-date-inline{\n      font-size: 18px;\n      font-weight: 800;\n      letter-spacing: -.02em;\n      line-height: 1.1;\n      white-space: nowrap;\n    }\n    .table td.col-fecha,\n    .table th.col-fecha{\n      width: 16%;\n      min-width: 150px;\n    }\n    .table td.col-masinfo,\n    .table th.col-masinfo{\n      width: 11%;\n      min-width: 120px;\n      text-align: center;\n    }\n    .info-link{\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      gap: 8px;\n      width: 100%;\n      text-align: center;\n    }\n\n  \n    .event-date-inline{\n      display: inline-block !important;\n      font-family: 'Raleway', sans-serif !important;\n      font-size: 20px !important;\n      font-weight: 800 !important;\n      color: #111111 !important;\n      line-height: 1.1 !important;\n      letter-spacing: -0.02em !important;\n      white-space: nowrap !important;\n      text-transform: none !important;\n      background: transparent !important;\n      padding: 0 !important;\n      border: 0 !important;\n      border-radius: 0 !important;\n      box-shadow: none !important;\n    }\n    <\/style>\n\n<section class=\"wrap\">\n    <div class=\"panel\">\n      <div class=\"head\">\n        <div class=\"eyebrow\" id=\"eyebrowText\">Agenda de Eventos 2026 \u00b7 Quito<\/div>\n        <h2 class=\"title\" id=\"titleText\">Qu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades<\/h2>\n        \n      <\/div>\n\n      <div class=\"controls\">\n        <div class=\"lang-switch\" aria-label=\"Selector de idioma \/ Language selector\">\n          <button type=\"button\" class=\"lang-btn active\" id=\"langEsBtn\">ES<\/button>\n          <button type=\"button\" class=\"lang-btn\" id=\"langEnBtn\">EN<\/button>\n        <\/div>\n        <div class=\"tabs-wrap\" id=\"monthTabs\"><\/div>\n\n        <div class=\"filters\">\n          <label class=\"field\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"11\" cy=\"11\" r=\"7\"><\/circle><path d=\"m21 21-4.35-4.35\"><\/path><\/svg>\n            <input id=\"searchInput\" type=\"text\" placeholder=\"Buscar por artista, tour, festival o congreso\" aria-label=\"Buscar por artista, tour, festival o congreso\">\n          <\/label>\n          <label class=\"field select\">\n            <select id=\"venueFilter\" aria-label=\"Filtrar por recinto\">\n              <option value=\"todos\">Todos los recintos<\/option>\n            <\/select>\n          <\/label>\n          <label class=\"field select\">\n            <select id=\"categoryFilter\" aria-label=\"Filtrar por categor\u00eda\"><\/select>\n          <\/label>\n        <\/div>\n\n        <div class=\"meta\">\n          <p id=\"activeMonthLabel\">Mostrando: todos<\/p>\n          <p id=\"resultsLabel\"><\/p>\n        <\/div>\n      <\/div>\n\n      <div class=\"table-shell\">\n        <div class=\"table-wrap\">\n          <table>\n            <thead>\n              <tr>\n                <th style=\"width:18%\">Fecha<\/th>\n                <th style=\"width:8%\">Hora<\/th>\n                <th style=\"width:26%\">Artista \/ festival<\/th>\n                <th style=\"width:30%\">Tour \/ detalle<\/th>\n                <th style=\"width:18%\">Lugar<\/th>\n                <th style=\"width:14%\">M\u00e1s Info.<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody id=\"concertTableBody\"><\/tbody>\n          <\/table>\n        <\/div>\n      <\/div>\n\n      <div class=\"empty\" id=\"emptyState\">No hay eventos disponibles con los filtros seleccionados.<\/div>\n\n      <div class=\"footerbar\">\n        <div class=\"pager-info\" id=\"pagerInfo\"><\/div>\n        <div class=\"pagination\" id=\"pagination\"><\/div>\n      <\/div>\n\n      <p class=\"notice\">En escritorio, cada concierto se mantiene en una sola l\u00ednea. En m\u00f3vil, cada fila se reorganiza en una tarjeta m\u00e1s legible para conservar toda la informaci\u00f3n sin comprimir el contenido.<\/p>\n    <\/div>\n  <\/section>\n\n    <script>\n    window.QT_AGENDA_DATA = [{\"id\":\"evt-2026-0208\",\"date\":\"2026-10-16\",\"endDate\":\"2026-11-03\",\"time\":\"10:00 en adelante\",\"artist\":\"JARD\u00cdN EMBRUJADO QUITO 2026.\",\"tour\":\"Un recorrido nocturno con senderos cubiertos de niebla, pasadizos, ambientaci\u00f3n tem\u00e1tica y escenarios de miedo dise\u00f1ados para recorrer en grupo o con amigos.\",\"tour_en\":\"A nighttime tour featuring fog-shrouded trails, secret passages, themed decor, and spooky scenes designed to be explored in a group or with friends.\",\"venue\":\"JARD\u00cdN BOT\u00c1NICO QUITO\",\"venue_en\":\"JARD\u00cdN BOT\u00c1NICO QUITO\",\"category\":\"festival o feria\",\"source\":\"https:\/\/redtickets.ec\/evento\/Jardin-Embrujado-Quito-2026\/1794\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0216\",\"date\":\"2026-10-22\",\"endDate\":\"2026-10-23\",\"time\":\"9:00 en adelante\",\"artist\":\"AMVEPE 2026\",\"tour\":\"Encuentro profesional programado en el Centro de Convenciones Metropolitano de Quito.\",\"tour_en\":\"Professional event scheduled at the Quito Metropolitan Convention Center.\",\"venue\":\"Centro de Convenciones Metropolitano de Quito\",\"venue_en\":\"Quito Metropolitan Convention Center\",\"category\":\"congreso o acad\u00e9mico\",\"source\":\"https:\/\/ccmq.ec\/calendario\/congreso-oficial-felino-amvepe-2026\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0219\",\"date\":\"2026-10-23\",\"endDate\":\"2026-10-24\",\"time\":\"20:00 en adelante\",\"artist\":\"Sonidos de Libertad: Casilda El Origen\",\"tour\":\"Obra esc\u00e9nica sobre ra\u00edces africanas, esclavitud, resistencia y esperanza.\",\"tour_en\":\"Stage production exploring African roots, slavery, resistance and hope.\",\"venue\":\"Teatro Demetrio Aguilera Malta - CCE\",\"venue_en\":\"Demetrio Aguilera Malta Theater - CCE\",\"category\":\"musical o artes esc\u00e9nicas\",\"source\":\"https:\/\/fomento.casadelacultura.gob.ec\/escenarios2026.html\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0227\",\"date\":\"2026-10-24\",\"endDate\":\"2026-10-24\",\"time\":\"11:00 en adelante\",\"artist\":\"Cantautores ecuatorianos EP\",\"tour\":\"Concierto protagonizado por el Coro Infantil y el Coro Juvenil.\",\"tour_en\":\"Concert featuring the Children's Choir and Youth Choir.\",\"venue\":\"Auditorio Ra\u00fal Garz\u00f3n - Centro Cultural Mamacuchara\",\"venue_en\":\"Ra\u00fal Garz\u00f3n Auditorium - Mamacuchara Cultural Center\",\"category\":\"musical o artes esc\u00e9nicas\",\"source\":\"https:\/\/quitoinforma.quito.gob.ec\/2026\/09\/28\/pasillos-operas-y-musica-tradicional-quito-vive-un-octubre-dedicado-a-nuestra-musica\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0220\",\"date\":\"2026-10-24\",\"endDate\":\"2026-10-24\",\"time\":\"15:00-17:00\",\"artist\":\"ESTUDIA Y TRABAJA EN AUSTRALIA\",\"tour\":\"\u00bfEst\u00e1s pensando en estudiar en Australia pero no sabes por d\u00f3nde empezar? Este evento gratuito es para ti. No necesitas llegar sabiendo qu\u00e9 estudiar, d\u00f3nde vivir o c\u00f3mo hacer el proceso de visado.\",\"tour_en\":\"Are you thinking about studying in Australia but don't know where to start? This free event is for you. You don't need to know what to study, where to live, or how to go through the visa process before you come.\",\"venue\":\"CCMQ\",\"venue_en\":\"CCMQ\",\"category\":\"festival o feria\",\"source\":\"https:\/\/ccmq.ec\/calendario\/estudia-trabaja-australia-quito\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0226\",\"date\":\"2026-10-24\",\"endDate\":\"2026-10-24\",\"time\":\"16:00 en adelante\",\"artist\":\"Somos Agua\",\"tour\":\"Obra de danza contempor\u00e1nea inspirada en memorias y pr\u00e1cticas comunitarias vinculadas al agua.\",\"tour_en\":\"Contemporary dance work inspired by community memories and practices connected to water.\",\"venue\":\"Teatro Benjam\u00edn Carri\u00f3n - CCE\",\"venue_en\":\"Benjam\u00edn Carri\u00f3n Theater - CCE\",\"category\":\"musical o artes esc\u00e9nicas\",\"source\":\"https:\/\/fomento.casadelacultura.gob.ec\/escenarios2026.html\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0225\",\"date\":\"2026-10-24\",\"endDate\":\"2026-10-24\",\"time\":\"18:00 en adelante\",\"artist\":\"Magos Rondan Quito - XV edici\u00f3n\",\"tour\":\"Festival esc\u00e9nico de magia e ilusionismo en su decimoquinta edici\u00f3n.\",\"tour_en\":\"15th edition of the performing arts festival focused on magic and illusion.\",\"venue\":\"Teatro Nacional - Casa de la Cultura Ecuatoriana\",\"venue_en\":\"National Theater - Casa de la Cultura Ecuatoriana\",\"category\":\"musical o artes esc\u00e9nicas\",\"source\":\"https:\/\/fomento.casadelacultura.gob.ec\/escenarios2026.html\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0222\",\"date\":\"2026-10-24\",\"endDate\":\"2026-10-24\",\"time\":\"19:00\",\"artist\":\"The Rasmus\",\"tour\":\"Weirdo Tour 2026\",\"tour_en\":\"Weirdo Tour 2026\",\"venue\":\"Teatro Bol\u00edvar\",\"venue_en\":\"Bol\u00edvar Theater\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.therasmusstore.com\/event-details-registration\/weirdo-tour-2026-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0223\",\"date\":\"2026-10-24\",\"endDate\":\"2026-10-24\",\"time\":\"20:00\",\"artist\":\"Akriila\",\"tour\":\"El Tour de Lucy 2026\",\"tour_en\":\"El Tour de Lucy 2026\",\"venue\":\"Teatro San Gabriel\",\"venue_en\":\"Teatro San Gabriel\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/akriila-2026-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0224\",\"date\":\"2026-10-24\",\"endDate\":\"2026-10-24\",\"time\":\"20:00\",\"artist\":\"Humbe\",\"tour\":\"Due\u00f1o del Cielo Tour\",\"tour_en\":\"Due\u00f1o del Cielo Tour\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.ticketshow.com.ec\/evento\/Humbe-en-Quito-2026\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0221\",\"date\":\"2026-10-24\",\"endDate\":\"2026-10-24\",\"time\":\"20:00 en adelante\",\"artist\":\"Jaze\",\"tour\":\"QNEPT Tour II \u00b7 concierto en Quito.\",\"tour_en\":\"QNEPT Tour II \u00b7 live concert in Quito.\",\"venue\":\"Auditorio del Colegio de Economistas\",\"venue_en\":\"Colegio de Economistas Auditorium\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.bandsintown.com\/es\/e\/108592659-jaze-at-auditorio-del-colegio-de-economistas?came_from=274\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0228\",\"date\":\"2026-10-27\",\"endDate\":\"2026-10-27\",\"time\":\"8:00 en adelante\",\"artist\":\"Reputation Day\",\"tour\":\"Encuentro profesional programado en el Centro de Convenciones Metropolitano de Quito.\",\"tour_en\":\"Professional event scheduled at the Quito Metropolitan Convention Center.\",\"venue\":\"Centro de Convenciones Metropolitano de Quito\",\"venue_en\":\"Quito Metropolitan Convention Center\",\"category\":\"congreso o acad\u00e9mico\",\"source\":\"https:\/\/ccmq.ec\/calendario\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0229\",\"date\":\"2026-10-28\",\"endDate\":\"2026-10-28\",\"time\":\"19:00 en adelante\",\"artist\":\"Compositores ecuatorianos: estrenos absolutos\",\"tour\":\"Concierto con la Banda Sinf\u00f3nica Metropolitana de Quito y estrenos de compositores ecuatorianos.\",\"tour_en\":\"Concert by the Metropolitan Symphonic Band featuring premieres by Ecuadorian composers.\",\"venue\":\"Quito - recinto no precisado en la nota\",\"venue_en\":\"Quito - venue not specified in the source\",\"category\":\"musical o artes esc\u00e9nicas\",\"source\":\"https:\/\/quitoinforma.quito.gob.ec\/2026\/09\/28\/pasillos-operas-y-musica-tradicional-quito-vive-un-octubre-dedicado-a-nuestra-musica\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0230\",\"date\":\"2026-10-29\",\"endDate\":\"2026-10-29\",\"time\":\"21:00 en adelante\",\"artist\":\"RHYE\",\"tour\":\"Joy Tour (Acoustic) \u00b7 primera presentaci\u00f3n de RHYE en Ecuador.\",\"tour_en\":\"Joy Tour (Acoustic) \u00b7 RHYE's first performance in Ecuador.\",\"venue\":\"SoundGarden UIO\",\"venue_en\":\"SoundGarden UIO\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/rhye-joy-2026-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0233\",\"date\":\"2026-10-30\",\"endDate\":\"2026-10-30\",\"time\":\"20:00 en adelante\",\"artist\":\"El Gloween\",\"tour\":\"Fiesta tem\u00e1tica de Halloween en Quito.\",\"tour_en\":\"Halloween-themed party in Quito.\",\"venue\":\"Plaza Las Am\u00e9ricas - Quito\",\"venue_en\":\"Plaza Las Am\u00e9ricas - Quito\",\"category\":\"festival o feria\",\"source\":\"https:\/\/impulseventickets.com\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0238\",\"date\":\"2026-10-31\",\"endDate\":\"2026-10-31\",\"time\":\"07:50-16:30\",\"artist\":\"Llano Grande entre guaguas y tradiciones\",\"tour\":\"Llano Grande entre guaguas y tradiciones\",\"tour_en\":\"Llano Grande entre guaguas y tradiciones\",\"venue\":\"Llano Grande, Quito\",\"venue_en\":\"Llano Grande, Quito\",\"category\":\"rutas tur\u00edsticas\",\"source\":\"https:\/\/forms.gle\/svHbBgg55qpX7Ljg9\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0239\",\"date\":\"2026-10-31\",\"endDate\":\"2026-10-31\",\"time\":\"17:15-20:00\",\"artist\":\"Ruta Noches Patrimoniales - Museo de la ciudad\",\"tour\":\"Visita el Museo de la ciudad. Experiencia Gastron\u00f3mica y fotograf\u00eda grupal.\",\"tour_en\":\"Visit the City Museum. Culinary experience and group photo.\",\"venue\":\"Museo de la ciudad\",\"venue_en\":\"Museo de la ciudad\",\"category\":\"rutas tur\u00edsticas\",\"source\":\"https:\/\/forms.gle\/Xo4WsGpuNssMFbzA6\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0240\",\"date\":\"2026-10-31\",\"endDate\":\"2026-10-31\",\"time\":\"18:00-22:00\",\"artist\":\"Noches Patrimoniales\",\"tour\":\"El programa Noches Patrimoniales es una iniciativa oficial gestionada por Quito Turismo, dise\u00f1ada para reactivar cultural y econ\u00f3micamente el Centro Hist\u00f3rico de Quito durante los \u00faltimos s\u00e1bados de cada mes.\",\"tour_en\":\"The \u201cNoches Patrimoniales\u201d program is an official initiative organized by Quito Turismo, designed to revitalize Quito's Historic Center both culturally and economically on the last Saturday of every month.\",\"venue\":\"Centro Hist\u00f3rico de Quito\",\"venue_en\":\"Centro Hist\u00f3rico de Quito\",\"category\":\"festival o feria\",\"source\":\"\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0235\",\"date\":\"2026-10-31\",\"endDate\":\"2026-10-31\",\"time\":\"20:00 en adelante\",\"artist\":\"Casita del Terror\",\"tour\":\"Fiesta tem\u00e1tica de Halloween con m\u00fasica, personajes, sorpresas y concurso de disfraces.\",\"tour_en\":\"Halloween-themed party featuring music, characters, surprises and a costume contest.\",\"venue\":\"BASE Distrito Creativo\",\"venue_en\":\"BASE Distrito Creativo\",\"category\":\"festival o feria\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/casita-del-terror\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0236\",\"date\":\"2026-10-31\",\"endDate\":\"2026-10-31\",\"time\":\"Por confirmar\",\"artist\":\"La Granja de Zen\u00f3n\",\"tour\":\"Espect\u00e1culo familiar en Quito.\",\"tour_en\":\"Family show in Quito.\",\"venue\":\"Quito - consultar ticketera\",\"venue_en\":\"Quito - check ticketing platform\",\"category\":\"musical o artes esc\u00e9nicas\",\"source\":\"https:\/\/www.ticketshow.com.ec\/eventos\/Teatro\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0234\",\"date\":\"2026-10-31\",\"endDate\":\"2026-10-31\",\"time\":\"Por confirmar\",\"artist\":\"La Plaza del Terror - \u00d1engo Flow\",\"tour\":\"Halloween Concert con \u00d1engo Flow y concurso de disfraces.\",\"tour_en\":\"Halloween Concert featuring \u00d1engo Flow and a costume contest.\",\"venue\":\"Plaza de Toros Quito\",\"venue_en\":\"Quito Bullring\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.laplazadelterror.com\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0237\",\"date\":\"2026-10-31\",\"endDate\":\"2026-10-31\",\"time\":\"Por confirmar\",\"artist\":\"Las Guardianas KPOP World Tour\",\"tour\":\"Espect\u00e1culo K-pop programado en Quito.\",\"tour_en\":\"K-pop live show scheduled in Quito.\",\"venue\":\"Quito - consultar ticketera\",\"venue_en\":\"Quito - check ticketing platform\",\"category\":\"musical o artes esc\u00e9nicas\",\"source\":\"https:\/\/www.ticketshow.com.ec\/eventos\/Teatro\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0241\",\"date\":\"2026-11-05\",\"endDate\":\"2026-11-05\",\"time\":\"19:00\",\"artist\":\"Carlos Rivera & Reik\",\"tour\":\"\u00a1Viva M\u00e9xico! Tour + Reik Tour 2026\",\"tour_en\":\"\u00a1Viva M\u00e9xico! Tour + Reik Tour 2026\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.ticketshow.com.ec\/evento\/Carlos-Rivera-y-Reik-Quito-2026\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0242\",\"date\":\"2026-11-06\",\"endDate\":\"2026-11-06\",\"time\":\"19:00\",\"artist\":\"Cultura Prof\u00e9tica & Gondwana con Quique Neira\",\"tour\":\"\u00danica presentaci\u00f3n en Ecuador de Cultura Prof\u00e9tica, junto al reencuentro de Gondwana con Quique Neira. Un evento \u00fanico y especial que no te puedes perder.\",\"tour_en\":\"Cultura Prof\u00e9tica's only performance in Ecuador, along with Gondwana's reunion with Quique Neira. A unique and special event you won't want to miss.\",\"venue\":\"Plaza de Toros Quito\",\"venue_en\":\"Plaza de Toros Quito\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/gondwana-y-cultura-profetica-2026\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0243\",\"date\":\"2026-11-06\",\"endDate\":\"2026-11-06\",\"time\":\"20:30\",\"artist\":\"Alejandro Fern\u00e1ndez\",\"tour\":\"De Rey a Rey\",\"tour_en\":\"De Rey a Rey\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.ticketshow.com.ec\/evento\/Alejandro-Fernandez-en-Quito-Quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0244\",\"date\":\"2026-11-12\",\"endDate\":\"2026-11-14\",\"time\":\"09:00\",\"artist\":\"OIL & POWER 2026\",\"tour\":\"Congreso y feria especializada \u00b7 12 al 14 de noviembre\",\"tour_en\":\"Congreso y feria especializada \u00b7 12 al 14 de noviembre\",\"venue\":\"CCMQ\",\"venue_en\":\"CCMQ\",\"category\":\"congreso o acad\u00e9mico\",\"source\":\"https:\/\/ccmq.ec\/calendario\/oil-power\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0248\",\"date\":\"2026-11-14\",\"endDate\":\"2026-11-14\",\"time\":\"11:00\",\"artist\":\"ABRAKDABRA FEST\",\"tour\":\"Barones con Sherpa, Leo Jim\u00e9nez, Saratoga, Stravaganzza y 037\",\"tour_en\":\"Barones con Sherpa, Leo Jim\u00e9nez, Saratoga, Stravaganzza y 037\",\"venue\":\"Club La Campi\u00f1a - Antiguo Country Club De La Fae\",\"venue_en\":\"Club La Campi\u00f1a - Antiguo Country Club De La Fae\",\"category\":\"festival o feria\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/abrakdbra-2026-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0245\",\"date\":\"2026-11-14\",\"endDate\":\"2026-11-14\",\"time\":\"19:00 en adelante\",\"artist\":\"Amar Azul\",\"tour\":\"Concierto de Amar Azul en Quito.\",\"tour_en\":\"Amar Azul live in Quito.\",\"venue\":\"Plaza de Toros Quito\",\"venue_en\":\"Quito Bullring\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/laticketera.ec\/tc-events\/amar-azul\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0247\",\"date\":\"2026-11-14\",\"endDate\":\"2026-11-14\",\"time\":\"21:00 en adelante\",\"artist\":\"Fazzini\",\"tour\":\"Concierto de rap y trap independiente en Quito.\",\"tour_en\":\"Independent rap and trap concert in Quito.\",\"venue\":\"BASE Distrito Creativo\",\"venue_en\":\"BASE Distrito Creativo\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/fazzini-en-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0246\",\"date\":\"2026-11-14\",\"endDate\":\"2026-11-14\",\"time\":\"Por confirmar\",\"artist\":\"Soy Luna - El \u00daltimo Show\",\"tour\":\"Espect\u00e1culo musical de Soy Luna en Quito.\",\"tour_en\":\"Soy Luna musical show in Quito.\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"musical o artes esc\u00e9nicas\",\"source\":\"https:\/\/topshows.ec\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0249\",\"date\":\"2026-11-15\",\"endDate\":\"2026-11-15\",\"time\":\"20:00\",\"artist\":\"Cypress Hill\",\"tour\":\"Dios Bendiga Tour\",\"tour_en\":\"Dios Bendiga Tour\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.songkick.com\/es\/concerts\/43261312-cypress-hill-at-coliseo-general-ruminahui\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0251\",\"date\":\"2026-11-20\",\"endDate\":\"2026-11-20\",\"time\":\"20:00\",\"artist\":\"Elefante\",\"tour\":\"30 Aniversario Tour\",\"tour_en\":\"30th Anniversary Tour\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.songkick.com\/es\/concerts\/43315647-elefante-at-coliseo-general-ruminahui\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0250\",\"date\":\"2026-11-20\",\"endDate\":\"2026-11-20\",\"time\":\"20:00\",\"artist\":\"Hot Chip\",\"tour\":\"La ic\u00f3nica banda brit\u00e1nica Hot Chip llega a Quito para una noche donde el electro-pop, el dance y la energ\u00eda de la pista se encuentran en un mismo lugar.\",\"tour_en\":\"The iconic British band Hot Chip is coming to Quito for a night where electro-pop, dance music, and the energy of the dance floor all come together in one place.\",\"venue\":\"SoundGarden UIO\",\"venue_en\":\"SoundGarden UIO\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/hot-chip-2026-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0252\",\"date\":\"2026-11-20\",\"endDate\":\"2026-11-20\",\"time\":\"Por confirmar\",\"artist\":\"Opera IX\",\"tour\":\"Latin American Tour 2026 \u00b7 presentaci\u00f3n de black metal sinf\u00f3nico en Quito.\",\"tour_en\":\"Latin American Tour 2026 \u00b7 symphonic black metal show in Quito.\",\"venue\":\"Quito - recinto por confirmar\",\"venue_en\":\"Quito - venue to be confirmed\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.meet2go.com\/ev\/opera-ix\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0253\",\"date\":\"2026-11-21\",\"endDate\":\"2026-11-21\",\"time\":\"13:00 en adelante\",\"artist\":\"DJ Padre Guilherme\",\"tour\":\"Set de m\u00fasica electr\u00f3nica del sacerdote y DJ portugu\u00e9s Padre Guilherme.\",\"tour_en\":\"Electronic music set by Portuguese priest and DJ Padre Guilherme.\",\"venue\":\"Centro de Exposiciones Quito\",\"venue_en\":\"Quito Exhibition Center\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.meet2go.com\/ev\/padreguilhermequito2\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0255\",\"date\":\"2026-11-24\",\"endDate\":\"2026-11-24\",\"time\":\"20:00 en adelante\",\"artist\":\"Militarie Gun\",\"tour\":\"Primera presentaci\u00f3n en Quito de la banda estadounidense de hardcore y post-punk.\",\"tour_en\":\"First Quito performance by the American hardcore and post-punk band.\",\"venue\":\"BASE Distrito Creativo\",\"venue_en\":\"BASE Distrito Creativo\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/militarie-gun-en-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0254\",\"date\":\"2026-11-24\",\"endDate\":\"2026-11-24\",\"time\":\"21:00\",\"artist\":\"The Strokes\",\"tour\":\"Reality Awaits South America 2026\",\"tour_en\":\"Reality Awaits South America 2026\",\"venue\":\"Estadio Ol\u00edmpico Atahualpa\",\"venue_en\":\"Atahualpa Olympic Stadium\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/conciertosecuador.com\/concierto\/the-strokes\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0256\",\"date\":\"2026-11-27\",\"endDate\":\"2026-11-27\",\"time\":\"19:00\",\"artist\":\"Rafael Lechowski\",\"tour\":\"Concierto en Quito 2026\",\"tour_en\":\"Live in Quito 2026\",\"venue\":\"Quito\",\"venue_en\":\"Quito\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/rafael-lechowski-2026-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0257\",\"date\":\"2026-11-28\",\"endDate\":\"2026-11-28\",\"time\":\"Por Confirmar\",\"artist\":\"KAPO\",\"tour\":\"llega a Ecuador con su Afro Rosa Tour. Una nueva emoci\u00f3n para que que disfrutemos juntos en este 2026.\",\"tour_en\":\"The iconic British band Hot Chip is coming to Quito for a night where electro-pop, dance music, and the energy of the dance floor all come together in one place.\",\"venue\":\"Coliseo Rumi\u00f1ahui\",\"venue_en\":\"Coliseo Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.ticketshow.com.ec\/evento\/KAPO-EN-QUITO-2026\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0258\",\"date\":\"2026-12-12\",\"endDate\":\"2026-12-12\",\"time\":\"19:00\",\"artist\":\"El Tri\",\"tour\":\"Concierto de rock en Quito 2026\",\"tour_en\":\"Rock concert in Quito 2026\",\"venue\":\"Plaza de Toros Quito\",\"venue_en\":\"Quito Bullring\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/eltri-2026-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0259\",\"date\":\"2026-12-19\",\"endDate\":\"2026-12-19\",\"time\":\"20:00-04:00\",\"artist\":\"MELODIC MOVEMENT PRES. KASIA\",\"tour\":\"KASIA (Drumcode) La nueva generaci\u00f3n del techno. Para una presentacion unica con Melodic Movement en Quito Ecuador.\",\"tour_en\":\"KASIA (Drumcode) The new generation of techno. For a unique performance with Melodic Movement in Quito, Ecuador\",\"venue\":\"Quito\",\"venue_en\":\"Quito\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.meet2go.com\/ev\/kasiamelodicmovement\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"}];\n\n(function(){\nconst concertData = window.QT_AGENDA_DATA || [];\n    const rowsPerPage = 5;\n    let currentLang = 'es';\n    const monthNamesEs = [\"enero\", \"febrero\", \"marzo\", \"abril\", \"mayo\", \"junio\", \"julio\", \"agosto\", \"septiembre\", \"octubre\", \"noviembre\", \"diciembre\"];\n    const monthNamesEn = [\"january\", \"february\", \"march\", \"april\", \"may\", \"june\", \"july\", \"august\", \"september\", \"october\", \"november\", \"december\"];\n    const monthMap = {\n      enero: 1, febrero: 2, marzo: 3, abril: 4, mayo: 5, junio: 6,\n      julio: 7, agosto: 8, septiembre: 9, octubre: 10, noviembre: 11, diciembre: 12\n    };\n    const UI = {\n      es: {\n        eyebrow: 'Agenda de Eventos 2026 \u00b7 Quito',\n        title: 'Qu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades',\n        searchPlaceholder: 'Buscar por artista, tour, festival o congreso',\n        searchAria: 'Buscar por artista, tour, festival o congreso',\n        venueAria: 'Filtrar por recinto',\n        categoryAria: 'Filtrar por categor\u00eda',\n        allVenues: 'Todos los recintos',\n        allCategories: 'Todas las categor\u00edas',\n        categories: {\n          'concierto o tour': 'Concierto o tour',\n          'festival o feria': 'Festival o feria',\n          'congreso o acad\u00e9mico': 'Congreso o acad\u00e9mico',\n          'musical o artes esc\u00e9nicas': 'Musical o artes esc\u00e9nicas',\n          'rutas tur\u00edsticas': 'Rutas Tur\u00edsticas',\n          'actividad cultural': 'Actividad cultural'\n        },\n        tabsAll: 'Todos',\n        date: 'Fecha', time: 'Hora', event: 'Artista \/ festival', detail: 'Tour \/ detalle', venue: 'Lugar', more: 'M\u00e1s Info.',\n        noLink: 'Sin enlace', save: 'Guardar Evento',\n        noEvents: 'No hay eventos disponibles con los filtros seleccionados.',\n        multiDay: 'Multid\u00eda',\n        availableFrom: 'Disponible del', to: 'al',\n        resultsOne: 'evento disponible', resultsMany: 'eventos disponibles',\n        showingRange: 'Mostrando', of: 'de',\n        allMonths: 'todos los meses', allVenuesMeta: 'todos los recintos', allCategoriesMeta: 'todas las categor\u00edas'\n      },\n      en: {\n        eyebrow: '2026 Events Agenda \u00b7 Quito',\n        title: 'What to do in Quito today: events, concerts and activities agenda',\n        searchPlaceholder: 'Search by artist, tour, festival or congress',\n        searchAria: 'Search by artist, tour, festival or congress',\n        venueAria: 'Filter by venue',\n        categoryAria: 'Filter by category',\n        allVenues: 'All venues',\n        allCategories: 'All categories',\n        categories: {\n          'concierto o tour': 'Concert or tour',\n          'festival o feria': 'Festival or fair',\n          'congreso o acad\u00e9mico': 'Congress or academic',\n          'musical o artes esc\u00e9nicas': 'Musical or performing arts',\n          'rutas tur\u00edsticas': 'Tourist Routes',\n          'actividad cultural': 'Cultural activity'\n        },\n        tabsAll: 'All',\n        date: 'Date', time: 'Time', event: 'Artist \/ festival', detail: 'Tour \/ details', venue: 'Venue', more: 'More Info.',\n        noLink: 'No link', save: 'Save Event',\n        noEvents: 'No events are available with the selected filters.',\n        multiDay: 'Multi-day',\n        availableFrom: 'Available from', to: 'to',\n        resultsOne: 'event available', resultsMany: 'events available',\n        showingRange: 'Showing', of: 'of',\n        allMonths: 'all months', allVenuesMeta: 'all venues', allCategoriesMeta: 'all categories'\n      }\n    };\n    const VALID_CATEGORIES = new Set([\n      'concierto o tour',\n      'festival o feria',\n      'congreso o acad\u00e9mico',\n      'musical o artes esc\u00e9nicas',\n      'rutas tur\u00edsticas',\n      'actividad cultural'\n    ]);\n    const collator = new Intl.Collator('es', { sensitivity: 'base', numeric: true });\n\n    let activeMonth = 'todos';\n    let currentPage = 1;\n    let searchTerm = '';\n    let activeVenue = 'todos';\n    let activeCategory = 'todos';\n\n    const tabsContainer = document.getElementById('monthTabs');\n    const tableBody = document.getElementById('concertTableBody');\n    const emptyState = document.getElementById('emptyState');\n    const monthLabelEl = document.getElementById('activeMonthLabel');\n    const resultsLabelEl = document.getElementById('resultsLabel');\n    const pagerInfoEl = document.getElementById('pagerInfo');\n    const paginationEl = document.getElementById('pagination');\n    const searchInputEl = document.getElementById('searchInput');\n    const venueFilterEl = document.getElementById('venueFilter');\n    const categoryFilterEl = document.getElementById('categoryFilter');\n    const tableWrapEl = document.querySelector('.table-wrap');\n\n    function normalizeText(value) {\n      return String(value || '')\n        .toLowerCase()\n        .normalize('NFD')\n        .replace(\/[\\u0300-\\u036f]\/g, '')\n        .replace(\/\\s+\/g, ' ')\n        .trim();\n    }\n\n    function isValidUrl(value) {\n      try {\n        new URL(String(value || ''));\n        return true;\n      } catch (error) {\n        return false;\n      }\n    }\n\n    function parseLocalDate(dateStr, endOfDay = true) {\n      if (!dateStr || !\/^\\d{4}-\\d{2}-\\d{2}$\/.test(dateStr)) return null;\n      const [year, month, day] = dateStr.split('-').map(Number);\n      return endOfDay\n        ? new Date(year, month - 1, day, 23, 59, 59, 999)\n        : new Date(year, month - 1, day, 0, 0, 0, 0);\n    }\n\n    function toIsoDate(year, month, day) {\n      return `${String(year)}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n    }\n\n    function extractEndDate(item) {\n      if (item.endDate && \/^\\d{4}-\\d{2}-\\d{2}$\/.test(item.endDate)) return item.endDate;\n\n      const baseDate = item.date;\n      if (!\/^\\d{4}-\\d{2}-\\d{2}$\/.test(baseDate)) return baseDate;\n      const [year, month] = baseDate.split('-').map(Number);\n      const haystack = normalizeText(`${item.time} ${item.tour} ${item.artist}`);\n\n      const rangeMonthMatch = haystack.match(\/(?:del\\s+)?(\\d{1,2})\\s+al\\s+(\\d{1,2})\\s+de\\s+(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)\/);\n      if (rangeMonthMatch) {\n        const endDay = Number(rangeMonthMatch[2]);\n        const monthName = rangeMonthMatch[3];\n        const endMonth = monthMap[monthName] || month;\n        return toIsoDate(year, endMonth, endDay);\n      }\n\n      const multiDaysMatch = haystack.match(\/(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)\\s+(\\d{1,2})-(\\d{1,2})-(\\d{1,2})\/);\n      if (multiDaysMatch) {\n        const endDay = Number(multiDaysMatch[4]);\n        const endMonth = monthMap[multiDaysMatch[1]] || month;\n        return toIsoDate(year, endMonth, endDay);\n      }\n\n      return baseDate;\n    }\n\n    function extractSortTime(value) {\n      const text = String(value || '');\n      const match = text.match(\/(\\d{1,2})[:hH](\\d{2})\/);\n      if (!match) return 9999;\n      const hours = Number(match[1]);\n      const minutes = Number(match[2]);\n      if (Number.isNaN(hours) || Number.isNaN(minutes)) return 9999;\n      return (hours * 60) + minutes;\n    }\n\n    function normalizeVenue(value) {\n      const venue = String(value || '').trim();\n      if (!venue) return 'Por confirmar';\n      if (venue.includes('Centro de Convenciones Metropolitano de Quito')) return 'CCMQ';\n      if (venue === 'P\/C') return 'Por confirmar';\n      return venue;\n    }\n\n    function normalizeCategoryValue(value) {\n      const normalized = normalizeText(value);\n      const categoryAliases = {\n        'concierto o tour': 'concierto o tour',\n        'festival': 'festival o feria',\n        'festival o feria': 'festival o feria',\n        'congreso': 'congreso o acad\u00e9mico',\n        'congreso o academico': 'congreso o acad\u00e9mico',\n        'musical o artes escenicas': 'musical o artes esc\u00e9nicas',\n        'rutas turisticas': 'rutas tur\u00edsticas',\n        'actividad cultural': 'actividad cultural'\n      };\n      return categoryAliases[normalized] || '';\n    }\n\n    function inferCategory(item) {\n      const explicit = normalizeCategoryValue(item.category);\n      if (explicit) return explicit;\n\n      const artistName = normalizeText(item.artist);\n      const forcedTouristRoutes = [\n        'ruta turistica de llano grande',\n        'ruta de leyenda la agostada del ano diez',\n        'ruta garcia moreno',\n        'ruta leon',\n        'ruta plaza del teatro',\n        'alquimia sensorial'\n      ];\n      if (forcedTouristRoutes.includes(artistName)) return 'rutas tur\u00edsticas';\n\n      const text = normalizeText(`${item.artist} ${item.tour} ${item.venue}`);\n      const stageKeywords = ['musical', 'teatro', 'showman', 'artes escenicas', 'artes esc\u00e9nicas', 'opera', '\u00f3pera', 'danza', 'escenico', 'esc\u00e9nico', 'ballet'];\n      const academicKeywords = ['congreso', 'cumbre', 'conferencia', 'expo', 'summit', 'academic', 'academico', 'acad\u00e9mico', 'camp', 'campamento', 'technology', 'tecnologia', 'tecnolog\u00eda', 'telerobotics', 'vehicular', 'seminario', 'inmersiva', 'feria especializada'];\n      const festivalKeywords = ['festival', 'fest', 'feria', 'salon', 'sal\u00f3n', 'street fest', 'gastro fest', 'bike fest', 'llacta flow', 'live al parque', 'mundial del vallenato', 'pizza fest', 'tango', 'race', 'maraton', 'marat\u00f3n', 'chocolate', 'cacao', 'cafe', 'caf\u00e9', 'hueca fest', 'utmb', 'trail', 'copa cervecera'];\n      const routeKeywords = ['ruta', 'rutas', 'recorrido', 'itinerario', 'pasaporte experiencias', 'mixology tour', 'quito eterno', 'pifo'];\nif (stageKeywords.some(keyword => text.includes(keyword))) return 'musical o artes esc\u00e9nicas';\n      if (academicKeywords.some(keyword => text.includes(keyword))) return 'congreso o acad\u00e9mico';\n      if (routeKeywords.some(keyword => text.includes(keyword))) return 'rutas tur\u00edsticas';\n      if (festivalKeywords.some(keyword => text.includes(keyword))) return 'festival o feria';\n      return 'concierto o tour';\n    }\n\n    \n    function getMonthNames() {\n      return currentLang === 'en' ? monthNamesEn : monthNamesEs;\n    }\n\n    function displayTour(item) {\n      return currentLang === 'en' ? (item.tour_en || item.tour || '') : (item.tour || '');\n    }\n\n    function displayVenue(item) {\n      return currentLang === 'en' ? (item.venue_en || item.venue || '') : (item.venue || '');\n    }\n\n    function displaySourceName(item) {\n      return currentLang === 'en' ? (item.sourceName_en || item.sourceName || UI.en.more) : (item.sourceName || UI.es.more);\n    }\n\n    function updateUIText() {\n      const t = UI[currentLang];\n      document.documentElement.lang = currentLang;\n      document.getElementById('eyebrowText').textContent = t.eyebrow;\n      document.getElementById('titleText').textContent = t.title;\n      searchInputEl.placeholder = t.searchPlaceholder;\n      searchInputEl.setAttribute('aria-label', t.searchAria);\n      venueFilterEl.setAttribute('aria-label', t.venueAria);\n      categoryFilterEl.setAttribute('aria-label', t.categoryAria);\n      document.querySelector('thead th:nth-child(1)').textContent = t.date;\n      document.querySelector('thead th:nth-child(2)').textContent = t.time;\n      document.querySelector('thead th:nth-child(3)').textContent = t.event;\n      document.querySelector('thead th:nth-child(4)').textContent = t.detail;\n      document.querySelector('thead th:nth-child(5)').textContent = t.venue;\n      document.querySelector('thead th:nth-child(6)').textContent = t.more;\n      emptyState.textContent = t.noEvents;\n      document.getElementById('langEsBtn').classList.toggle('active', currentLang === 'es');\n      document.getElementById('langEnBtn').classList.toggle('active', currentLang === 'en');\n    }\n\nfunction normalizeEvent(item, index) {\n      const venue = normalizeVenue(item.venue);\n      const category = inferCategory(item);\n      const source = isValidUrl(item.source) ? item.source : '';\n      const endDate = extractEndDate(item);\n\n      return {\n        ...item,\n        id: normalizeText(`${item.date}__${item.artist}__${venue}`) || `evento-${index}`,\n        date: item.date,\n        endDate,\n        time: String(item.time || '').trim() || 'Por confirmar',\n        sortTime: extractSortTime(item.time),\n        artist: String(item.artist || '').trim(),\n        tour: String(item.tour || '').trim(),\n        tour_en: String(item.tour_en || item.tour || '').trim(),\n        venue,\n        venue_en: String(item.venue_en || venue || '').trim(),\n        source,\n        sourceName: String(item.sourceName || 'M\u00e1s Info.').trim() || 'M\u00e1s Info.',\n        sourceName_en: String(item.sourceName_en || item.sourceName || 'More Info.').trim() || 'More Info.',\n        category\n      };\n    }\n\n    function dedupeEvents(items) {\n      const map = new Map();\n      items.forEach((item) => {\n        if (!map.has(item.id)) map.set(item.id, item);\n      });\n      return Array.from(map.values());\n    }\n\n    const EVENTS = dedupeEvents(concertData.map(normalizeEvent));\n\n    function getMonthIndex(dateStr) {\n      const [, month] = dateStr.split('-').map(Number);\n      return month - 1;\n    }\n\n    function isMultiDay(item) {\n      return Boolean(item.endDate && item.endDate !== item.date);\n    }\n\n    function formatShortDateEs(dateStr) {\n      const [, month, day] = dateStr.split('-');\n      const monthName = getMonthNames()[Number(month) - 1];\n      return `${Number(day)} ${monthName.slice(0, 3)}`;\n    }\n\n    function desktopDateMarkup(item) {\n      const [, month, day] = item.date.split('-');\n      const monthName = getMonthNames()[Number(month) - 1];\n      const monthLabel = monthName.charAt(0).toUpperCase() + monthName.slice(1);\n      const multiDayMarkup = isMultiDay(item)\n        ? `<span class=\"multiday-badge\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"><\/rect><path d=\"M16 2v4M8 2v4M3 10h18\"><\/path><\/svg>${UI[currentLang].multiDay}<\/span>`\n        : '';\n      return `<div class=\"date-stack\"><div class=\"date-text\">${Number(day)} ${monthLabel}<\/div>${multiDayMarkup}<\/div>`;\n    }\n\n    function getMultiDayNote(item) {\n      if (!isMultiDay(item)) return '';\n      return `<div class=\"multiday-note\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M8 2v4M16 2v4M3 10h18\"><\/path><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"><\/rect><\/svg>${UI[currentLang].availableFrom} ${formatShortDateEs(item.date)} ${UI[currentLang].to} ${formatShortDateEs(item.endDate)}<\/div>`;\n    }\n\n    function getSearchBlob(item) {\n      return normalizeText(`${item.artist} ${item.tour} ${item.tour_en || \"\"} ${item.venue} ${item.venue_en || \"\"} ${item.category}`);\n    }\n\n    function upcomingEvents() {\n      const now = new Date();\n      return EVENTS\n        .filter(item => {\n          const endDate = parseLocalDate(item.endDate || item.date, true);\n          return endDate ? endDate.getTime() >= now.getTime() : false;\n        })\n        .sort((a, b) => {\n          if (a.date !== b.date) return a.date.localeCompare(b.date);\n          if (a.sortTime !== b.sortTime) return a.sortTime - b.sortTime;\n          return collator.compare(a.artist, b.artist);\n        });\n    }\n\n    function getAvailableMonths(events) {\n      return [...new Set(events.map(item => getMonthIndex(item.date)))];\n    }\n\n    function getMonthCount(events, monthIndex) {\n      return events.filter(item => getMonthIndex(item.date) === monthIndex).length;\n    }\n\n    \n    function populateCategoryOptions() {\n      const currentValue = categoryFilterEl.value || 'todos';\n      const t = UI[currentLang];\n      const options = [\n        ['todos', t.allCategories],\n        ['concierto o tour', t.categories['concierto o tour']],\n        ['festival o feria', t.categories['festival o feria']],\n        ['congreso o acad\u00e9mico', t.categories['congreso o acad\u00e9mico']],\n        ['musical o artes esc\u00e9nicas', t.categories['musical o artes esc\u00e9nicas']],\n        ['rutas tur\u00edsticas', t.categories['rutas tur\u00edsticas']],\n        ['actividad cultural', t.categories['actividad cultural']]\n      ];\n      categoryFilterEl.innerHTML = options.map(([value, label]) => `<option value=\"${value}\">${label}<\/option>`).join('');\n      categoryFilterEl.value = options.some(([value]) => value === currentValue) ? currentValue : 'todos';\n    }\n\n    function populateVenueOptions(events) {\n      const currentValue = venueFilterEl.value || 'todos';\n      const venues = [...new Set(events.map(item => item.venue).filter(Boolean))]\n        .sort((a, b) => collator.compare(a, b));\n\n      venueFilterEl.innerHTML = `<option value=\"todos\">${UI[currentLang].allVenues}<\/option>` +\n        venues.map(venue => `<option value=\"${venue}\">${venue}<\/option>`).join('');\n\n      if (venues.includes(currentValue)) {\n        venueFilterEl.value = currentValue;\n      } else {\n        venueFilterEl.value = 'todos';\n        activeVenue = 'todos';\n      }\n    }\n\n    function renderTabs(events) {\n      const months = getAvailableMonths(events);\n      tabsContainer.innerHTML = '';\n\n      const addBtn = (label, value, count) => {\n        const btn = document.createElement('button');\n        btn.className = `tab ${activeMonth === value ? 'active' : ''}`;\n        btn.type = 'button';\n        btn.innerHTML = `<span>${label}<\/span><span class=\"tab-count\">${count}<\/span>`;\n        btn.addEventListener('click', () => {\n          activeMonth = value;\n          currentPage = 1;\n          update();\n        });\n        tabsContainer.appendChild(btn);\n      };\n\n      addBtn(UI[currentLang].tabsAll, 'todos', events.length);\n      const names = getMonthNames();\n      months.forEach(monthIndex => addBtn(names[monthIndex], monthIndex, getMonthCount(events, monthIndex)));\n    }\n\n    function filteredEvents() {\n      const events = upcomingEvents();\n      return events.filter(item => {\n        const monthPass = activeMonth === 'todos' ? true : getMonthIndex(item.date) === activeMonth;\n        const venuePass = activeVenue === 'todos' ? true : item.venue === activeVenue;\n        const categoryPass = activeCategory === 'todos' ? true : item.category === activeCategory;\n        const searchPass = !searchTerm ? true : getSearchBlob(item).includes(searchTerm);\n        return monthPass && venuePass && categoryPass && searchPass;\n      });\n    }\n\n    function renderInfoLink(item) {\n      if (!item.source) {\n        return `<span class=\"more\" style=\"opacity:.45; pointer-events:none;\">${UI[currentLang].noLink}<\/span>`;\n      }\n      return `\n        <a class=\"more\" href=\"${item.source}\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"${currentLang === 'en' ? `View more information about ${item.artist}` : `Ver m\u00e1s informaci\u00f3n de ${item.artist}`}\">\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M14 3h7v7\"><\/path><path d=\"M10 14L21 3\"><\/path><path d=\"M21 14v7H3V3h7\"><\/path><\/svg>\n          ${UI[currentLang].more}\n        <\/a>`;\n    }\n\n    function rowTemplate(item) {\n      return `\n        <tr>\n          <td class=\"date-cell\">${desktopDateMarkup(item)}<\/td>\n          <td class=\"time-cell\">\n            <div class=\"time-mobile\">${item.time}<\/div>\n          <\/td>\n          <td class=\"artist-cell\"><div class=\"artist\">${item.artist}<\/div><\/td>\n          <td class=\"tour-cell\">\n            <div class=\"tour\" title=\"${displayTour(item)}\">${displayTour(item)}<\/div>\n            ${getMultiDayNote(item)}\n          <\/td>\n          <td class=\"venue-cell\">\n            <div class=\"venue\" title=\"${displayVenue(item)}\">${displayVenue(item)}<\/div>\n            <div class=\"venue-mobile\" title=\"${displayVenue(item)}\">\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 21s-6-4.35-6-10a6 6 0 1 1 12 0c0 5.65-6 10-6 10Z\"><\/path><circle cx=\"12\" cy=\"11\" r=\"2.5\"><\/circle><\/svg>\n              <span>${displayVenue(item)}<\/span>\n            <\/div>\n          <\/td>\n          <td class=\"link-cell\">\n            <div class=\"mobile-meta action-stack\">\n              ${renderInfoLink(item)}\n              <button type=\"button\" class=\"save-btn\" data-event-id=\"${item.id}\" aria-label=\"${currentLang === 'en' ? `Save ${item.artist} to the calendar` : `Guardar ${item.artist} en el calendario`}\"><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h9\"><\/path><path d=\"M15 3h6v6\"><\/path><path d=\"M10 14L21 3\"><\/path><\/svg>${UI[currentLang].save}<\/button>\n            <\/div>\n          <\/td>\n        <\/tr>\n      `;\n    }\n\n    function renderTable(events) {\n      const total = events.length;\n      const totalPages = Math.max(1, Math.ceil(total \/ rowsPerPage));\n      if (currentPage > totalPages) currentPage = totalPages;\n\n      const start = (currentPage - 1) * rowsPerPage;\n      const pageItems = events.slice(start, start + rowsPerPage);\n\n      tableBody.innerHTML = pageItems.map(rowTemplate).join('');\n      emptyState.style.display = total ? 'none' : 'block';\n      tableWrapEl.style.display = total ? 'block' : 'none';\n\n      resultsLabelEl.textContent = `${total} ${total === 1 ? UI[currentLang].resultsOne : UI[currentLang].resultsMany}`;\n      pagerInfoEl.textContent = total ? `${UI[currentLang].showingRange} ${start + 1}-${Math.min(start + rowsPerPage, total)} ${UI[currentLang].of} ${total}` : '';\n\n      paginationEl.innerHTML = '';\n      const totalPagesSafe = Math.max(1, totalPages);\n\n      const prev = document.createElement('button');\n      prev.className = 'page-btn';\n      prev.textContent = '\u2039';\n      prev.disabled = currentPage === 1 || !total;\n      prev.addEventListener('click', () => { currentPage--; update(false); });\n      paginationEl.appendChild(prev);\n\n      for (let i = 1; i <= totalPagesSafe; i++) {\n        const btn = document.createElement('button');\n        btn.className = `page-btn ${i === currentPage ? 'active' : ''}`;\n        btn.textContent = i;\n        btn.addEventListener('click', () => { currentPage = i; update(false); });\n        paginationEl.appendChild(btn);\n      }\n\n      const next = document.createElement('button');\n      next.className = 'page-btn';\n      next.textContent = '\u203a';\n      next.disabled = currentPage === totalPagesSafe || !total;\n      next.addEventListener('click', () => { currentPage++; update(false); });\n      paginationEl.appendChild(next);\n    }\n\n    function update(resetTabs = true) {\n      const upcoming = upcomingEvents();\n      const months = getAvailableMonths(upcoming);\n\n      if (activeMonth !== 'todos' && !months.includes(activeMonth)) {\n        activeMonth = months[0] ?? 'todos';\n        currentPage = 1;\n      }\n\n      if (resetTabs) renderTabs(upcoming);\n      populateVenueOptions(upcoming);\n      populateCategoryOptions();\n\n      const events = filteredEvents();\n      const monthText = activeMonth === 'todos' ? UI[currentLang].allMonths : getMonthNames()[activeMonth];\n      const venueText = activeVenue === 'todos' ? UI[currentLang].allVenuesMeta : activeVenue;\n      const categoryText = activeCategory === 'todos' ? UI[currentLang].allCategoriesMeta : UI[currentLang].categories[activeCategory];\n      monthLabelEl.textContent = `${UI[currentLang].showingRange}: ${monthText} \u00b7 ${venueText} \u00b7 ${categoryText}`;\n      renderTable(events);\n    }\n\n    searchInputEl.addEventListener('input', (event) => {\n      searchTerm = normalizeText(event.target.value.trim());\n      currentPage = 1;\n      update(false);\n    });\n\n    venueFilterEl.addEventListener('change', (event) => {\n      activeVenue = event.target.value;\n      currentPage = 1;\n      update(false);\n    });\n\n    categoryFilterEl.addEventListener('change', (event) => {\n      activeCategory = event.target.value;\n      currentPage = 1;\n      update(false);\n    });\n\n    document.getElementById('langEsBtn').addEventListener('click', () => {\n      currentLang = 'es';\n      updateUIText();\n      currentPage = 1;\n      update();\n    });\n\n    document.getElementById('langEnBtn').addEventListener('click', () => {\n      currentLang = 'en';\n      updateUIText();\n      currentPage = 1;\n      update();\n    });\n\n    function pad2(value) {\n      return String(value).padStart(2, '0');\n    }\n\n    function parseDateParts(dateStr) {\n      const [year, month, day] = String(dateStr).split('-').map(Number);\n      return { year, month, day };\n    }\n\n    function sanitizeIcsText(value) {\n      return String(value || '')\n        .replace(\/\\\\\/g, '\\\\\\\\')\n        .replace(\/\\r?\\n\/g, '\\\\n')\n        .replace(\/,\/g, '\\\\,')\n        .replace(\/;\/g, '\\\\;');\n    }\n\n    function parseEventTimes(item) {\n      const startParts = parseDateParts(item.date);\n      const endDateValue = item.endDate || item.date;\n      const endParts = parseDateParts(endDateValue);\n      const match = String(item.time || '').match(\/(\\d{1,2})[:hH](\\d{2})\/);\n\n      if (match) {\n        const hour = Number(match[1]);\n        const minute = Number(match[2]);\n        const start = new Date(startParts.year, startParts.month - 1, startParts.day, hour, minute, 0, 0);\n        const end = new Date(start);\n        end.setHours(end.getHours() + 2);\n\n        if (endDateValue !== item.date) {\n          end.setFullYear(endParts.year, endParts.month - 1, endParts.day);\n          end.setHours(hour + 2, minute, 0, 0);\n        }\n\n        return { allDay: false, start, end };\n      }\n\n      \/\/ All-day fallback for events without a parsable single-hour start\n      const start = new Date(startParts.year, startParts.month - 1, startParts.day, 0, 0, 0, 0);\n      const end = new Date(endParts.year, endParts.month - 1, endParts.day + 1, 0, 0, 0, 0);\n      return { allDay: true, start, end };\n    }\n\n    function formatICSDate(date, allDay = false) {\n      const year = date.getFullYear();\n      const month = pad2(date.getMonth() + 1);\n      const day = pad2(date.getDate());\n\n      if (allDay) return `${year}${month}${day}`;\n\n      const hours = pad2(date.getHours());\n      const minutes = pad2(date.getMinutes());\n      const seconds = pad2(date.getSeconds());\n      return `${year}${month}${day}T${hours}${minutes}${seconds}`;\n    }\n\n    function buildICSContent(item) {\n      const timing = parseEventTimes(item);\n      const uid = `${item.id}@visitquito-ec`;\n      const lines = [\n        'BEGIN:VCALENDAR',\n        'VERSION:2.0',\n        'PRODID:-\/\/Visit Quito\/\/Agenda Eventos\/\/ES',\n        'CALSCALE:GREGORIAN',\n        'BEGIN:VEVENT',\n        `UID:${sanitizeIcsText(uid)}`,\n        `SUMMARY:${sanitizeIcsText(item.artist)}`,\n      ];\n\n      if (timing.allDay) {\n        lines.push(`DTSTART;VALUE=DATE:${formatICSDate(timing.start, true)}`);\n        lines.push(`DTEND;VALUE=DATE:${formatICSDate(timing.end, true)}`);\n      } else {\n        lines.push(`DTSTART:${formatICSDate(timing.start, false)}`);\n        lines.push(`DTEND:${formatICSDate(timing.end, false)}`);\n      }\n\n      lines.push(`LOCATION:${sanitizeIcsText(displayVenue(item))}`);\n      lines.push(`DESCRIPTION:${sanitizeIcsText(displayTour(item))}`);\n      if (item.source) lines.push(`URL:${sanitizeIcsText(item.source)}`);\n      lines.push('END:VEVENT', 'END:VCALENDAR');\n\n      return lines.join('\\r\\n');\n    }\n\n    function downloadICS(itemId) {\n      const item = EVENTS.find(event => event.id === itemId);\n      if (!item) return;\n\n      const icsContent = buildICSContent(item);\n      const blob = new Blob([icsContent], { type: 'text\/calendar;charset=utf-8' });\n      const blobUrl = URL.createObjectURL(blob);\n      const link = document.createElement('a');\n      link.href = blobUrl;\n      link.download = `${normalizeText(item.artist).replace(\/\\s+\/g, '-') || 'evento'}.ics`;\n      document.body.appendChild(link);\n      link.click();\n      link.remove();\n      setTimeout(() => URL.revokeObjectURL(blobUrl), 1000);\n    }\n\n    tableBody.addEventListener('click', (event) => {\n      const saveButton = event.target.closest('.save-btn');\n      if (!saveButton) return;\n      downloadICS(saveButton.getAttribute('data-event-id'));\n    });\n\n    updateUIText();\n    update();\n})();\n    <\/script>\n    <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Qu\u00e9 hacer en Quito hoy: agenda de eventos en Quito Encuentra qu\u00e9 hacer en Quito hoy, esta semana y durante el mes en una sola agenda actualizada. Aqu\u00ed podr\u00e1s consultar conciertos, festivales, teatro, ferias, congresos, actividades culturales y eventos especiales en distintos recintos de la ciudad. Explora la agenda por fecha, categor\u00eda o lugar y [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-4843","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"Descubre qu\u00e9 hacer en Quito hoy y durante el mes: conciertos, festivales, teatro, ferias, congresos y actividades para todos. Consulta la agenda actualizada\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/visitquito.ec\/es\/eventos\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Visit Quito - The World Turns Around You\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Qu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades - Visit Quito\" \/>\n\t\t<meta property=\"og:description\" content=\"Descubre qu\u00e9 hacer en Quito hoy y durante el mes: conciertos, festivales, teatro, ferias, congresos y actividades para todos. Consulta la agenda actualizada\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/visitquito.ec\/es\/eventos\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/visitquito.ec\/wp-content\/uploads\/2025\/08\/Logo-Loader-Visit-Quito.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/visitquito.ec\/wp-content\/uploads\/2025\/08\/Logo-Loader-Visit-Quito.png\" \/>\n\t\t<meta property=\"og:image:width\" content=\"1063\" \/>\n\t\t<meta property=\"og:image:height\" content=\"1000\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2025-09-09T16:52:01+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-10-15T14:38:56+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/visitquito.ec\/\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@visitquito\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Qu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades - Visit Quito\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Descubre qu\u00e9 hacer en Quito hoy y durante el mes: conciertos, festivales, teatro, ferias, congresos y actividades para todos. Consulta la agenda actualizada\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@visitquito\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/visitquito.ec\/wp-content\/uploads\/2025\/08\/Logo-Loader-Visit-Quito.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/eventos\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/eventos\\\/#listItem\",\"name\":\"Qu\\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/eventos\\\/#listItem\",\"position\":2,\"name\":\"Qu\\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/#listItem\",\"name\":\"Home\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/#organization\",\"name\":\"Visit Quito\",\"description\":\"The World Turns Around You\",\"url\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/\",\"telephone\":\"+59322993300\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/visitquito.ec\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/Logo-Loader-Visit-Quito.png\",\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/eventos\\\/#organizationLogo\",\"width\":1063,\"height\":1000,\"caption\":\"Visit Quito in Quito, Ecuador (Visit Quito)\"},\"image\":{\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/eventos\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/visitquito.ec\\\/\",\"https:\\\/\\\/x.com\\\/visitquito\",\"https:\\\/\\\/www.instagram.com\\\/visit_quito\\\/\",\"https:\\\/\\\/www.tiktok.com\\\/@visit_quito\"]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/eventos\\\/#webpage\",\"url\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/eventos\\\/\",\"name\":\"Qu\\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades - Visit Quito\",\"description\":\"Descubre qu\\u00e9 hacer en Quito hoy y durante el mes: conciertos, festivales, teatro, ferias, congresos y actividades para todos. Consulta la agenda actualizada\",\"inLanguage\":\"es-ES\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/eventos\\\/#breadcrumblist\"},\"datePublished\":\"2025-09-09T11:52:01-05:00\",\"dateModified\":\"2026-10-15T09:38:56-05:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/\",\"name\":\"Visit Quito\",\"description\":\"The World Turns Around You\",\"inLanguage\":\"es-ES\",\"publisher\":{\"@id\":\"https:\\\/\\\/visitquito.ec\\\/es\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Qu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades - Visit Quito","description":"Descubre qu\u00e9 hacer en Quito hoy y durante el mes: conciertos, festivales, teatro, ferias, congresos y actividades para todos. Consulta la agenda actualizada","canonical_url":"https:\/\/visitquito.ec\/es\/eventos\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/visitquito.ec\/es\/eventos\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/visitquito.ec\/es\/#listItem","position":1,"name":"Home","item":"https:\/\/visitquito.ec\/es\/","nextItem":{"@type":"ListItem","@id":"https:\/\/visitquito.ec\/es\/eventos\/#listItem","name":"Qu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades"}},{"@type":"ListItem","@id":"https:\/\/visitquito.ec\/es\/eventos\/#listItem","position":2,"name":"Qu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades","previousItem":{"@type":"ListItem","@id":"https:\/\/visitquito.ec\/es\/#listItem","name":"Home"}}]},{"@type":"Organization","@id":"https:\/\/visitquito.ec\/es\/#organization","name":"Visit Quito","description":"The World Turns Around You","url":"https:\/\/visitquito.ec\/es\/","telephone":"+59322993300","logo":{"@type":"ImageObject","url":"https:\/\/visitquito.ec\/wp-content\/uploads\/2025\/08\/Logo-Loader-Visit-Quito.png","@id":"https:\/\/visitquito.ec\/es\/eventos\/#organizationLogo","width":1063,"height":1000,"caption":"Visit Quito in Quito, Ecuador (Visit Quito)"},"image":{"@id":"https:\/\/visitquito.ec\/es\/eventos\/#organizationLogo"},"sameAs":["https:\/\/www.facebook.com\/visitquito.ec\/","https:\/\/x.com\/visitquito","https:\/\/www.instagram.com\/visit_quito\/","https:\/\/www.tiktok.com\/@visit_quito"]},{"@type":"WebPage","@id":"https:\/\/visitquito.ec\/es\/eventos\/#webpage","url":"https:\/\/visitquito.ec\/es\/eventos\/","name":"Qu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades - Visit Quito","description":"Descubre qu\u00e9 hacer en Quito hoy y durante el mes: conciertos, festivales, teatro, ferias, congresos y actividades para todos. Consulta la agenda actualizada","inLanguage":"es-ES","isPartOf":{"@id":"https:\/\/visitquito.ec\/es\/#website"},"breadcrumb":{"@id":"https:\/\/visitquito.ec\/es\/eventos\/#breadcrumblist"},"datePublished":"2025-09-09T11:52:01-05:00","dateModified":"2026-10-15T09:38:56-05:00"},{"@type":"WebSite","@id":"https:\/\/visitquito.ec\/es\/#website","url":"https:\/\/visitquito.ec\/es\/","name":"Visit Quito","description":"The World Turns Around You","inLanguage":"es-ES","publisher":{"@id":"https:\/\/visitquito.ec\/es\/#organization"}}]},"og:locale":"es_ES","og:site_name":"Visit Quito - The World Turns Around You","og:type":"article","og:title":"Qu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades - Visit Quito","og:description":"Descubre qu\u00e9 hacer en Quito hoy y durante el mes: conciertos, festivales, teatro, ferias, congresos y actividades para todos. Consulta la agenda actualizada","og:url":"https:\/\/visitquito.ec\/es\/eventos\/","og:image":"https:\/\/visitquito.ec\/wp-content\/uploads\/2025\/08\/Logo-Loader-Visit-Quito.png","og:image:secure_url":"https:\/\/visitquito.ec\/wp-content\/uploads\/2025\/08\/Logo-Loader-Visit-Quito.png","og:image:width":1063,"og:image:height":1000,"article:published_time":"2025-09-09T16:52:01+00:00","article:modified_time":"2026-10-15T14:38:56+00:00","article:publisher":"https:\/\/www.facebook.com\/visitquito.ec\/","twitter:card":"summary_large_image","twitter:site":"@visitquito","twitter:title":"Qu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades - Visit Quito","twitter:description":"Descubre qu\u00e9 hacer en Quito hoy y durante el mes: conciertos, festivales, teatro, ferias, congresos y actividades para todos. Consulta la agenda actualizada","twitter:creator":"@visitquito","twitter:image":"https:\/\/visitquito.ec\/wp-content\/uploads\/2025\/08\/Logo-Loader-Visit-Quito.png"},"aioseo_meta_data":{"post_id":"4843","title":null,"description":"Descubre qu\u00e9 hacer en Quito hoy y durante el mes: conciertos, festivales, teatro, ferias, congresos y actividades para todos. Consulta la agenda actualizada","keywords":null,"keyphrases":{"focus":{"keyphrase":"Qu\u00e9 hacer en Quito hoy","score":80},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"seo_analyzer_scan_date":"2026-04-14 19:09:14","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"open_ai":null,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":[],"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2025-09-23 21:54:10","updated":"2026-10-15 15:27:00","focus_keyword":"Qu\u00e9 hacer en Quito hoy","additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/visitquito.ec\/es\/\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tQu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/visitquito.ec\/es\/"},{"label":"Qu\u00e9 hacer en Quito hoy: agenda de eventos, conciertos y actividades","link":"https:\/\/visitquito.ec\/es\/eventos\/"}],"_links":{"self":[{"href":"https:\/\/visitquito.ec\/es\/wp-json\/wp\/v2\/pages\/4843","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/visitquito.ec\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/visitquito.ec\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/visitquito.ec\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/visitquito.ec\/es\/wp-json\/wp\/v2\/comments?post=4843"}],"version-history":[{"count":205,"href":"https:\/\/visitquito.ec\/es\/wp-json\/wp\/v2\/pages\/4843\/revisions"}],"predecessor-version":[{"id":12906,"href":"https:\/\/visitquito.ec\/es\/wp-json\/wp\/v2\/pages\/4843\/revisions\/12906"}],"wp:attachment":[{"href":"https:\/\/visitquito.ec\/es\/wp-json\/wp\/v2\/media?parent=4843"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}