{"id":4843,"date":"2025-09-09T11:52:01","date_gmt":"2025-09-09T16:52:01","guid":{"rendered":"https:\/\/visitquito.ec\/eventos\/"},"modified":"2026-08-14T12:44:29","modified_gmt":"2026-08-14T17:44:29","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-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-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-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:\/\/visitquito.ec\/es\/grandes-eventos-calendario\/ftc-live-al-parque-29-agosto\/\">\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-0094\",\"date\":\"2026-08-07\",\"endDate\":\"2026-08-29\",\"time\":\"16:30-17:30\",\"artist\":\"Vag\u00f3n de sorpresas\",\"tour\":\"Carrito educativo que recorre las salas del Museo de la Ciudad con activaciones l\u00fadicas y art\u00edsticas. Programado los viernes y s\u00e1bados de agosto.\",\"tour_en\":\"An educational cart moves through the Museum of the City with playful and artistic activities. Scheduled on Fridays and Saturdays in August.\",\"venue\":\"Museo de la Ciudad\",\"venue_en\":\"Museo de la Ciudad\",\"category\":\"actividad cultural\",\"source\":\"https:\/\/fundacionmuseosquito.gob.ec\/museo-de-la-ciudad\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0111\",\"date\":\"2026-08-08\",\"endDate\":\"2026-08-29\",\"time\":\"11:00-16:30\",\"artist\":\"Casitas de Tela\",\"tour\":\"Exploraci\u00f3n libre para primera infancia con telas de distintos colores, texturas y tama\u00f1os. Actividad de los s\u00e1bados de agosto.\",\"tour_en\":\"Open-ended early-childhood exploration using fabrics of different colors, textures and sizes. Scheduled on Saturdays in August.\",\"venue\":\"Museo Interactivo de Ciencia\",\"venue_en\":\"Museo Interactivo de Ciencia\",\"category\":\"actividad cultural\",\"source\":\"https:\/\/fundacionmuseosquito.gob.ec\/museo-interactivo-de-ciencia\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0126\",\"date\":\"2026-08-09\",\"endDate\":\"2026-08-23\",\"time\":\"11:00-16:30\",\"artist\":\"Mi planta de p\u00e1ramo\",\"tour\":\"Actividad infantil con materiales reciclados para dise\u00f1ar una planta inspirada en especies del p\u00e1ramo. Programada los domingos de agosto.\",\"tour_en\":\"Children's activity using recycled materials to design a plant inspired by p\u00e1ramo species. Scheduled on Sundays in August.\",\"venue\":\"Museo Interactivo de Ciencia\",\"venue_en\":\"Museo Interactivo de Ciencia\",\"category\":\"actividad cultural\",\"source\":\"https:\/\/fundacionmuseosquito.gob.ec\/museo-interactivo-de-ciencia\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0135\",\"date\":\"2026-08-21\",\"endDate\":\"2026-08-21\",\"time\":\"19:00\",\"artist\":\"Show Metal Sinf\u00f3nico\",\"tour\":\"Fabio Lione, Edu Falaschi, Bertoncelli y Tit\u00e1n con orquesta y coros.\",\"tour_en\":\"Fabio Lione, Edu Falaschi, Bertoncelli and Tit\u00e1n with orchestra and choir.\",\"venue\":\"Teatro Nacional CCE\",\"venue_en\":\"CCE National Theater\",\"category\":\"festival o feria\",\"source\":\"https:\/\/www.buenplan.com.ec\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0136\",\"date\":\"2026-08-21\",\"endDate\":\"2026-08-23\",\"time\":\"Jornada completa \u00b7 del 21 al 23 de agosto\",\"artist\":\"Festival Internacional del Globo 2026\",\"tour\":\"5.\u00aa edici\u00f3n con globos aerost\u00e1ticos, gastronom\u00eda, conciertos y actividades para visitantes.\",\"tour_en\":\"5th edition featuring hot-air balloons, gastronomy, concerts and visitor activities.\",\"venue\":\"Ciudad Mitad del Mundo\",\"venue_en\":\"Mitad del Mundo City\",\"category\":\"festival o feria\",\"source\":\"https:\/\/fig.mitaddelmundo.gob.ec\/#entradas-fig\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0138\",\"date\":\"2026-08-23\",\"endDate\":\"2026-08-23\",\"time\":\"20:00\",\"artist\":\"Zhamira\",\"tour\":\"Curita para el Coraz\u00f3n Tour\",\"tour_en\":\"Curita para el Coraz\u00f3n Tour\",\"venue\":\"Teatro San Gabriel\",\"venue_en\":\"Teatro San Gabriel\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.agendaconcerts.cat\/es\/concert\/12017\/zhamira-teatro-san-gabriel-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0139\",\"date\":\"2026-08-27\",\"endDate\":\"2026-08-27\",\"time\":\"17:00-19:15\",\"artist\":\"La Mariscal Cosmopolita: Cacao de Origen, Culturas del Mundo y Tradici\u00f3n\",\"tour\":\"Ruta guiada por la diversidad cultural y gastron\u00f3mica de La Mariscal, con visitas a IBEC y Casal Catal\u00e0, CatF\u00e9 Art, Santhorno & Casa Silberstein, PIMKAY Galer\u00eda y Caf\u00e9, La Ruta del Caf\u00e9 y Cacao & Cacao Shop.\",\"tour_en\":\"Guided route exploring La Mariscal's cultural and gastronomic diversity, with stops at IBEC and Casal Catal\u00e0, CatF\u00e9 Art, Santhorno & Casa Silberstein, PIMKAY Galer\u00eda y Caf\u00e9, La Ruta del Caf\u00e9 and Cacao & Cacao Shop.\",\"venue\":\"La Mariscal, Quito\",\"venue_en\":\"La Mariscal, Quito\",\"category\":\"rutas tur\u00edsticas\",\"source\":\"https:\/\/forms.gle\/Gcz9zWGNZBLihkPo6\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0140\",\"date\":\"2026-08-27\",\"endDate\":\"2026-08-27\",\"time\":\"20:00\",\"artist\":\"Dante Gebel\",\"tour\":\"Conferencia \/ show en Quito 2026\",\"tour_en\":\"Conferencia \/ show en Quito 2026\",\"venue\":\"Teatro Nacional CCE\",\"venue_en\":\"Teatro Nacional CCE\",\"category\":\"congreso o acad\u00e9mico\",\"source\":\"https:\/\/www.ticketshow.com.ec\/evento\/Dante-Gebel-Quito-2026\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0141\",\"date\":\"2026-08-27\",\"endDate\":\"2026-08-27\",\"time\":\"20:30\",\"artist\":\"Rawayana\",\"tour\":\"\u00bfD\u00f3nde es el After? Tour\",\"tour_en\":\"\u00bfD\u00f3nde es el After? Tour\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.ticketshow.com.ec\/evento\/RAWAYANA-QUITO-2026\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0142\",\"date\":\"2026-08-28\",\"endDate\":\"2026-08-28\",\"time\":\"17:00-22:00\",\"artist\":\"Ruta Garc\u00eda Moreno\",\"tour\":\"Recorrido nocturno por la calle Garc\u00eda Moreno con patrimonio, museos, arte, gastronom\u00eda y comercios locales.\",\"tour_en\":\"Evening route along Garc\u00eda Moreno Street, featuring heritage, museums, art, gastronomy and local businesses.\",\"venue\":\"Calle Garc\u00eda Moreno, Centro Hist\u00f3rico de Quito\",\"venue_en\":\"Garc\u00eda Moreno Street, Quito Historic Center\",\"category\":\"rutas tur\u00edsticas\",\"source\":\"https:\/\/quitoinforma.quito.gob.ec\/2026\/07\/29\/las-rutas-de-la-ciudad-llega-con-musica-cultura-y-una-agenda-especial-junto-a-los-bomberos-de-quito\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0143\",\"date\":\"2026-08-29\",\"endDate\":\"2026-08-29\",\"time\":\"07:50-16:00\",\"artist\":\"Ruta Tulipe\u2013Rumisitana\",\"tour\":\"Ruta por el Choc\u00f3 Andino que conecta el Museo de Sitio Tulipe con la Casa Rumisitana y experiencias del territorio.\",\"tour_en\":\"Andean Choc\u00f3 route connecting the Tulipe Site Museum with Casa Rumisitana and local territorial experiences.\",\"venue\":\"Tulipe y Rumisitana, Choc\u00f3 Andino\",\"venue_en\":\"Tulipe and Rumisitana, Andean Choc\u00f3\",\"category\":\"rutas tur\u00edsticas\",\"source\":\"https:\/\/www.quitoinforma.gob.ec\/tag\/tulipe\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0144\",\"date\":\"2026-08-29\",\"endDate\":\"2026-08-29\",\"time\":\"09:00\",\"artist\":\"Recorrido Libertario\",\"tour\":\"Recorrido hist\u00f3rico por espacios relacionados con la independencia de Quito, desde el Centro Hist\u00f3rico hasta el Panecillo.\",\"tour_en\":\"Historical route through sites connected with Quito's independence, from the Historic Center to El Panecillo.\",\"venue\":\"Centro Hist\u00f3rico \u2013 Panecillo\",\"venue_en\":\"Historic Center \u2013 El Panecillo\",\"category\":\"rutas tur\u00edsticas\",\"source\":\"https:\/\/pichinchaesturismo.com\/es-ec\/pichincha\/quito\/rutas-culturales\/rutas-libertarias-quito-a6eb7f213\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0145\",\"date\":\"2026-08-29\",\"endDate\":\"2026-08-29\",\"time\":\"11:00-22:00\",\"artist\":\"Ruta Le\u00f3n\",\"tour\":\"Activaci\u00f3n cultural y comunitaria entre San Blas y La Tola, con arte, gastronom\u00eda, comercio local y apropiaci\u00f3n del espacio p\u00fablico.\",\"tour_en\":\"Cultural and community activation between San Blas and La Tola, featuring art, gastronomy, local businesses and public-space experiences.\",\"venue\":\"Calle Vicente Le\u00f3n, San Blas y La Tola\",\"venue_en\":\"Vicente Le\u00f3n Street, San Blas and La Tola\",\"category\":\"rutas tur\u00edsticas\",\"source\":\"https:\/\/quitoinforma.quito.gob.ec\/2026\/07\/29\/las-rutas-de-la-ciudad-llega-con-musica-cultura-y-una-agenda-especial-junto-a-los-bomberos-de-quito\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0146\",\"date\":\"2026-08-29\",\"endDate\":\"2026-08-29\",\"time\":\"16:00\",\"artist\":\"FTC Live al Parque 2026\",\"tour\":\"Festival musical de alta convocatoria con artistas nacionales e internacionales.\",\"tour_en\":\"Large-scale music festival featuring national and international artists.\",\"venue\":\"Parque Bicentenario de Quito\",\"venue_en\":\"Bicentenario Park, Quito\",\"category\":\"festival o feria\",\"source\":\"https:\/\/www.songkick.com\/es\/festivals\/3780332-ftc-live-al-parque\/id\/43154938-ftc-live-al-parque-2026\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0147\",\"date\":\"2026-08-29\",\"endDate\":\"2026-08-29\",\"time\":\"20:00\",\"artist\":\"Seattle Supersonics\",\"tour\":\"Tributo internacional a Nirvana \u00b7 World Tour 2026\",\"tour_en\":\"International Nirvana tribute \u00b7 World Tour 2026\",\"venue\":\"Teatro San Gabriel\",\"venue_en\":\"Teatro San Gabriel\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/orionshowbusiness.com\/event\/seattlesupersonicsquito\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0148\",\"date\":\"2026-09-02\",\"endDate\":\"2026-09-02\",\"time\":\"19:00\",\"artist\":\"Paul Gilbert\",\"tour\":\"Concierto en Quito 2026\",\"tour_en\":\"Live in Quito 2026\",\"venue\":\"Teatro San Gabriel\",\"venue_en\":\"Teatro San Gabriel\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/music.apple.com\/pe\/concerts\/ce.286eff24-237f-4525-827c-29654d9ff297\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0149\",\"date\":\"2026-09-03\",\"endDate\":\"2026-09-03\",\"time\":\"19:00\",\"artist\":\"La Era Dorada\",\"tour\":\"Espect\u00e1culo esc\u00e9nico y musical presentado en el Teatro Nacional Sucre.\",\"tour_en\":\"Stage and musical production presented at Teatro Nacional Sucre.\",\"venue\":\"Teatro Nacional Sucre\",\"venue_en\":\"Teatro Nacional Sucre\",\"category\":\"musical o artes esc\u00e9nicas\",\"source\":\"https:\/\/teatrosucre.com\/event\/la-era-dorada\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0150\",\"date\":\"2026-09-03\",\"endDate\":\"2026-09-03\",\"time\":\"20:00\",\"artist\":\"Carlos Vives y Aterciopelados\",\"tour\":\"Tour al Sol 2026 + La Pipa de la Paz Tour 30 A\u00f1os\",\"tour_en\":\"Tour al Sol 2026 + La Pipa de la Paz 30th Anniversary Tour\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.ticketshow.com.ec\/evento\/CARLOS-VIVES-QUITO-2026\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0151\",\"date\":\"2026-09-04\",\"endDate\":\"2026-09-04\",\"time\":\"19:00\",\"artist\":\"Homer el Mero Mero\",\"tour\":\"Concierto en Quito 2026\",\"tour_en\":\"Live in Quito 2026\",\"venue\":\"Centro de Exposiciones Quito\",\"venue_en\":\"Quito Exhibition Center\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/homer-el-mero-mero-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0152\",\"date\":\"2026-09-05\",\"endDate\":\"2026-09-05\",\"time\":\"19:00\",\"artist\":\"\u00c1lvaro D\u00edaz\",\"tour\":\"Omakase Tour\",\"tour_en\":\"Omakase Tour\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/music.apple.com\/co\/concerts\/ce.1255a0a7-b2cf-433b-91a5-bf3254018ae3\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0153\",\"date\":\"2026-09-09\",\"endDate\":\"2026-09-09\",\"time\":\"20:00\",\"artist\":\"WWE Live in Quito 2026\",\"tour\":\"Show 360\u00b0\",\"tour_en\":\"Show 360\u00b0\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/wwe\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0154\",\"date\":\"2026-09-11\",\"endDate\":\"2026-09-13\",\"time\":\"09:00\",\"artist\":\"EXPODENTAL 2026\",\"tour\":\"Feria especializada del sector dental \u00b7 11 al 13 de septiembre\",\"tour_en\":\"Feria especializada del sector dental \u00b7 11 al 13 de septiembre\",\"venue\":\"CCMQ\",\"venue_en\":\"CCMQ\",\"category\":\"congreso o acad\u00e9mico\",\"source\":\"https:\/\/ccmq.ec\/calendario\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0155\",\"date\":\"2026-09-11\",\"endDate\":\"2026-09-11\",\"time\":\"19:00\",\"artist\":\"Ken-Y\",\"tour\":\"Concierto en Quito 2026\",\"tour_en\":\"Live in Quito 2026\",\"venue\":\"\u00c1gora Casa de la Cultura Ecuatoriana\",\"venue_en\":\"\u00c1gora of the Ecuadorian House of Culture\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/ken-y-2026-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0156\",\"date\":\"2026-09-11\",\"endDate\":\"2026-09-11\",\"time\":\"20:00\",\"artist\":\"John Peter\",\"tour\":\"Concierto del cantautor ecuatoriano con influencias de soul, g\u00f3spel y pop.\",\"tour_en\":\"Concert by the Ecuadorian singer-songwriter, influenced by soul, gospel and pop.\",\"venue\":\"Casa de la M\u00fasica\",\"venue_en\":\"Casa de la M\u00fasica\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.casadelamusica.ec\/programacion\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0157\",\"date\":\"2026-09-11\",\"endDate\":\"2026-09-11\",\"time\":\"20:00\",\"artist\":\"NASA Histoires\",\"tour\":\"D\u00edas Malos Tour\",\"tour_en\":\"D\u00edas Malos Tour\",\"venue\":\"Teatro San Gabriel\",\"venue_en\":\"Teatro San Gabriel\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/open.spotify.com\/concert\/1kqEH8hvCY8CIa1uYbcP02\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0158\",\"date\":\"2026-09-17\",\"endDate\":\"2026-09-18\",\"time\":\"09:00\",\"artist\":\"EXPOSMARTISP 2026\",\"tour\":\"Exposici\u00f3n especializada \u00b7 17 al 18 de septiembre\",\"tour_en\":\"Exposici\u00f3n especializada \u00b7 17 al 18 de septiembre\",\"venue\":\"CCMQ\",\"venue_en\":\"CCMQ\",\"category\":\"congreso o acad\u00e9mico\",\"source\":\"https:\/\/ccmq.ec\/calendario\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0159\",\"date\":\"2026-09-17\",\"endDate\":\"2026-09-17\",\"time\":\"20:00\",\"artist\":\"Andr\u00e9s Cepeda\",\"tour\":\"Nuestra vida en canciones\",\"tour_en\":\"Nuestra vida en canciones\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.ticketshow.com.ec\/evento\/ANDRES-CEPEDA-QUITO-2026\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0160\",\"date\":\"2026-09-19\",\"endDate\":\"2026-09-19\",\"time\":\"19:00\",\"artist\":\"Trueno\",\"tour\":\"Tour Turrazo 2026\",\"tour_en\":\"Tour Turrazo 2026\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/trueno-turrazo-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0161\",\"date\":\"2026-09-22\",\"endDate\":\"2026-09-22\",\"time\":\"20:00\",\"artist\":\"TINI\",\"tour\":\"FUTTTURA World Tour 2026\",\"tour_en\":\"FUTTTURA World Tour 2026\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.songkick.com\/es\/concerts\/43233292-tini-at-coliseo-general-ruminahui\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0162\",\"date\":\"2026-09-23\",\"endDate\":\"2026-09-23\",\"time\":\"19:00\",\"artist\":\"Buika Experiencia Sinf\u00f3nica Tour 2026\",\"tour\":\"Experiencia sinf\u00f3nica de Buika en Quito.\",\"tour_en\":\"Buika's symphonic experience in Quito.\",\"venue\":\"Teatro Nacional Sucre\",\"venue_en\":\"Teatro Nacional Sucre\",\"category\":\"musical o artes esc\u00e9nicas\",\"source\":\"https:\/\/teatrosucre.com\/event\/buika-experiencia-sinfonica-tour-2026\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0163\",\"date\":\"2026-09-23\",\"endDate\":\"2026-09-23\",\"time\":\"20:00\",\"artist\":\"Sonata Arctica\",\"tour\":\"30th Anniversary Tour + Blacksun + Kill City\",\"tour_en\":\"30th Anniversary Tour + Blacksun + Kill City\",\"venue\":\"Teatro San Gabriel\",\"venue_en\":\"Teatro San Gabriel\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.songkick.com\/es\/concerts\/43079231-sonata-arctica-at-teatro-san-gabriel\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0164\",\"date\":\"2026-09-26\",\"endDate\":\"2026-09-26\",\"time\":\"20:00\",\"artist\":\"Romeo Santos y Prince Royce\",\"tour\":\"Mas tarde que nunca\",\"tour_en\":\"Mas tarde que nunca\",\"venue\":\"Estadio Ol\u00edmpico Atahualpa\",\"venue_en\":\"Estadio Ol\u00edmpico Atahualpa\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.instagram.com\/p\/DYNH91WCebQ\/?img_index=2\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0165\",\"date\":\"2026-09-30\",\"endDate\":\"2026-09-30\",\"time\":\"20:00\",\"artist\":\"This Is Michael\",\"tour\":\"Espect\u00e1culo homenaje a Michael Jackson\",\"tour_en\":\"Espect\u00e1culo homenaje a Michael Jackson\",\"venue\":\"Teatro Nacional CCE\",\"venue_en\":\"Teatro Nacional CCE\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.ticketshow.com.ec\/evento\/QUITO-THIS-IS-MICHAEL-2026\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0166\",\"date\":\"2026-10-01\",\"endDate\":\"2026-10-01\",\"time\":\"19:00\",\"artist\":\"Andr\u00e9s Obreg\u00f3n\",\"tour\":\"Todo Pasa Tour\",\"tour_en\":\"Todo Pasa Tour\",\"venue\":\"Teatro San Gabriel\",\"venue_en\":\"Teatro San Gabriel\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/event\/andres-obregon-2026-quito\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0167\",\"date\":\"2026-10-03\",\"endDate\":\"2026-10-03\",\"time\":\"20:00\",\"artist\":\"TIM\u00d8\",\"tour\":\"Canto Pa\u2019 No Llorar Tour\",\"tour_en\":\"Canto Pa\u2019 No Llorar Tour\",\"venue\":\"Teatro San Gabriel\",\"venue_en\":\"Teatro San Gabriel\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.bandsintown.com\/es\/e\/108513182-timo-at-teatro-san-gabriel?came_from=274\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0168\",\"date\":\"2026-10-04\",\"endDate\":\"2026-10-04\",\"time\":\"19:00\",\"artist\":\"Apocalyptica\",\"tour\":\"Concierto en Quito 2026\",\"tour_en\":\"Live in Quito 2026\",\"venue\":\"Teatro San Gabriel\",\"venue_en\":\"Teatro San Gabriel\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.apocalyptica.com\/dates\/apocalyptica-dates-04-oct-2026-ec-qu-25--995-.html\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0169\",\"date\":\"2026-10-09\",\"endDate\":\"2026-10-09\",\"time\":\"20:00\",\"artist\":\"Grupo Frontera\",\"tour\":\"Concierto en Quito 2026\",\"tour_en\":\"Concierto en Quito 2026\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.songkick.com\/es\/concerts\/42943273-grupo-frontera-at-coliseo-general-ruminahui\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0170\",\"date\":\"2026-10-14\",\"endDate\":\"2026-10-14\",\"time\":\"19:30\",\"artist\":\"The Raven Age\",\"tour\":\"Invitado especial de Iron Maiden\",\"tour_en\":\"Invitado especial de Iron Maiden\",\"venue\":\"Estadio Ol\u00edmpico Atahualpa\",\"venue_en\":\"Estadio Ol\u00edmpico Atahualpa\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/ironmaiden\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0171\",\"date\":\"2026-10-14\",\"endDate\":\"2026-10-14\",\"time\":\"21:00\",\"artist\":\"Iron Maiden\",\"tour\":\"Run For Your Lives World Tour\",\"tour_en\":\"Run For Your Lives World Tour\",\"venue\":\"Estadio Ol\u00edmpico Atahualpa\",\"venue_en\":\"Estadio Ol\u00edmpico Atahualpa\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.buenplan.com.ec\/ironmaiden\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0172\",\"date\":\"2026-10-15\",\"endDate\":\"2026-10-15\",\"time\":\"20:00\",\"artist\":\"Yami Safdie\",\"tour\":\"Querida Yo Tour 2026\",\"tour_en\":\"Querida Yo Tour 2026\",\"venue\":\"Teatro San Gabriel\",\"venue_en\":\"Teatro San Gabriel\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/topshows.ec\/shows\/yami-safdie-en-quito\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0173\",\"date\":\"2026-10-16\",\"endDate\":\"2026-10-16\",\"time\":\"20:00\",\"artist\":\"ROCKLATAM 2026\",\"tour\":\"Los Aut\u00e9nticos Decadentes, Vilma Palma e Vampiros y Los Prisioneros con Miguel Tapia.\",\"tour_en\":\"Los Aut\u00e9nticos Decadentes, Vilma Palma e Vampiros and Los Prisioneros with Miguel Tapia.\",\"venue\":\"Coliseo General Rumi\u00f1ahui\",\"venue_en\":\"Coliseo General Rumi\u00f1ahui\",\"category\":\"festival o feria\",\"source\":\"https:\/\/www.ontimetickets.com\/event-details\/rocklatam-2026-quito-1\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0174\",\"date\":\"2026-10-20\",\"endDate\":\"2026-10-20\",\"time\":\"20:00\",\"artist\":\"Six Feet Under\",\"tour\":\"Concierto de death metal en Quito 2026\",\"tour_en\":\"Death metal concert in Quito 2026\",\"venue\":\"Miami Convenciones y Eventos\",\"venue_en\":\"Miami Convenciones y Eventos\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.lasentradas.com.ec\/evento\/six-feet-under\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0175\",\"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-0176\",\"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-0177\",\"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-0178\",\"date\":\"2026-10-29\",\"endDate\":\"2026-10-29\",\"time\":\"19:30\",\"artist\":\"Concierto D\u00eda de los Pueblos Afroecuatorianos\",\"tour\":\"Concierto de la Orquesta Sinf\u00f3nica Nacional del Ecuador y el Teatro Nacional Sucre.\",\"tour_en\":\"Concert by the National Symphony Orchestra of Ecuador and Teatro Nacional Sucre.\",\"venue\":\"Teatro Nacional Sucre\",\"venue_en\":\"Teatro Nacional Sucre\",\"category\":\"musical o artes esc\u00e9nicas\",\"source\":\"https:\/\/www.sinfonicanacional.gob.ec\/site\/index.php?Itemid=0&id=2329&option=com_ohanah&view=event\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0179\",\"date\":\"2026-10-30\",\"endDate\":\"2026-10-30\",\"time\":\"19:00\",\"artist\":\"Def Leppard\",\"tour\":\"Concierto en Quito 2026 \u00b7 invitado especial: Extreme\",\"tour_en\":\"Concierto en Quito 2026 \u00b7 invitado especial: Extreme\",\"venue\":\"Estadio Ol\u00edmpico Atahualpa\",\"venue_en\":\"Estadio Ol\u00edmpico Atahualpa\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.livenation.lat\/def-leppard-tickets-adp3791\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0180\",\"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.ecuavisa.com\/musica\/carlos-rivera-reik-compartiran-escenario-ecuador-20260723-0085.html\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0181\",\"date\":\"2026-11-05\",\"endDate\":\"2026-11-05\",\"time\":\"Por confirmar\",\"artist\":\"Cultura Prof\u00e9tica\",\"tour\":\"En Bucle World Tour\",\"tour_en\":\"En Bucle World Tour\",\"venue\":\"Por confirmar\",\"venue_en\":\"To be confirmed\",\"category\":\"concierto o tour\",\"source\":\"https:\/\/www.eluniverso.com\/entretenimiento\/musica\/cultura-profetica-anuncia-gira-internacional-en-bucle-con-dos-conciertos-en-ecuador-nota\/?outputType=amp\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0182\",\"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-0183\",\"date\":\"2026-11-07\",\"endDate\":\"2026-11-07\",\"time\":\"20:30\",\"artist\":\"Daniel 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-0184\",\"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\/\",\"sourceName\":\"M\u00e1s Info.\",\"sourceName_en\":\"More Info.\"},{\"id\":\"evt-2026-0185\",\"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-0186\",\"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-0187\",\"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-0188\",\"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-0189\",\"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-0190\",\"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.facebook.com\/volcanofmecuador\/\",\"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":[],"_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":196,"href":"https:\/\/visitquito.ec\/es\/wp-json\/wp\/v2\/pages\/4843\/revisions"}],"predecessor-version":[{"id":12547,"href":"https:\/\/visitquito.ec\/es\/wp-json\/wp\/v2\/pages\/4843\/revisions\/12547"}],"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}]}}