{"id":56811,"date":"2026-02-25T02:02:26","date_gmt":"2026-02-25T02:02:26","guid":{"rendered":"https:\/\/yatezzitos.com\/?page_id=56811"},"modified":"2026-04-16T19:27:48","modified_gmt":"2026-04-16T19:27:48","slug":"mi-reserva","status":"publish","type":"page","link":"https:\/\/yatezzitos.com\/en\/mi-reserva\/","title":{"rendered":"Mi reserva"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"56811\" class=\"elementor elementor-56811\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9448398 e-flex e-con-boxed e-con e-parent\" data-id=\"9448398\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b345cfa elementor-widget elementor-widget-html\" data-id=\"b345cfa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"yzzr-root\" class=\"yzzr\">\n  <div class=\"yzzr-card yzzr-hero\">\n    <h1 class=\"yzzr-title\">Mi reserva<\/h1>\n    <p id=\"yzzr-hello\" class=\"yzzr-sub\">Cargando informaci\u00f3n de tu reserva...<\/p>\n    <div style=\"height:10px\"><\/div>\n    <span id=\"yzzr-load-status\" class=\"yzzr-status\">Consultando...<\/span>\n    <div id=\"yzzr-countdown\" class=\"yzzr-countdown\">\n      <div class=\"yzzr-timebox\">\n        <div id=\"yzzr-d\" class=\"yzzr-time-num\">--<\/div>\n        <div class=\"yzzr-time-lbl\">D\u00edas<\/div>\n      <\/div>\n      <div class=\"yzzr-timebox\">\n        <div id=\"yzzr-h\" class=\"yzzr-time-num\">--<\/div>\n        <div class=\"yzzr-time-lbl\">Horas<\/div>\n      <\/div>\n      <div class=\"yzzr-timebox\">\n        <div id=\"yzzr-m\" class=\"yzzr-time-num\">--<\/div>\n        <div class=\"yzzr-time-lbl\">Min<\/div>\n      <\/div>\n      <div class=\"yzzr-timebox\">\n        <div id=\"yzzr-s\" class=\"yzzr-time-num\">--<\/div>\n        <div class=\"yzzr-time-lbl\">Seg<\/div>\n      <\/div>\n    <\/div>\n    <p id=\"yzzr-count-note\" class=\"yzzr-note\"><\/p>\n  <\/div>\n\n  <div id=\"yzzr-error\" class=\"yzzr-card yzzr-hidden\">\n    <h2 id=\"yzzr-error-title\" class=\"yzzr-err-title\">Reserva no disponible<\/h2>\n    <p id=\"yzzr-error-msg\" class=\"yzzr-sub\">No pudimos cargar la reserva.<\/p>\n  <\/div>\n\n  <div id=\"yzzr-img-wrap\" class=\"yzzr-card yzzr-img-wrap yzzr-hidden\">\n    <img id=\"yzzr-img\" class=\"yzzr-img\" alt=\"Embarcaci\u00f3n\">\n  <\/div>\n\n  <div id=\"yzzr-content\" class=\"yzzr-hidden\">\n    <div class=\"yzzr-grid\">\n      <div class=\"yzzr-card\">\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Cliente<\/div>\n          <div id=\"yzzr-name\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Embarcaci\u00f3n<\/div>\n          <div id=\"yzzr-yacht\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Tipo de experiencia reservada<\/div>\n          <div id=\"yzzr-exp\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Destino<\/div>\n          <div id=\"yzzr-dest\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Fecha<\/div>\n          <div id=\"yzzr-date\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Horario<\/div>\n          <div id=\"yzzr-time\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Pasajeros<\/div>\n          <div id=\"yzzr-pax\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Marina<\/div>\n          <div id=\"yzzr-marina\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Ubicaci\u00f3n de abordaje<\/div>\n          <div class=\"yzzr-v\"><a id=\"yzzr-meeting-link\" class=\"yzzr-map-link yzzr-disabled\" href=\"#\" target=\"_blank\"\n              rel=\"noopener\">\u2014<\/a><\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"yzzr-card\">\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Estado de la reserva<\/div>\n          <div><span id=\"yzzr-res-status\" class=\"yzzr-pill is-pending\">Pendiente de confirmaci\u00f3n<\/span><\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Reservaci\u00f3n ID<\/div>\n          <div id=\"yzzr-res-id\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Anticipo pagado<\/div>\n          <div id=\"yzzr-deposit\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Saldo pendiente<\/div>\n          <div id=\"yzzr-balance\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">Costo total<\/div>\n          <div id=\"yzzr-total\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div class=\"yzzr-row\">\n          <div class=\"yzzr-k\">M\u00e9todo de pago<\/div>\n          <div id=\"yzzr-payment\" class=\"yzzr-v\">\u2014<\/div>\n        <\/div>\n        <div style=\"text-align:center;padding:10px 0 4px\">\n          <button class=\"yzzr-btn\" type=\"button\" data-yzz-open-cargos style=\"background:linear-gradient(135deg,#7c3aed,#4f46e5);color:#fff;font-size:15px;border-radius:12px;padding:14px 20px;width:100%;max-width:380px;margin:0 auto\">\ud83d\udcb0 Ver cargos adicionales por destino<\/button>\n          <p style=\"font-size:11px;color:#9ca3af;margin:6px 0 0\">Impuestos de muelle, acceso a playas, propinas y m\u00e1s<\/p>\n        <\/div>\n        <div class=\"yzzr-actions\">\n          <a id=\"yzzr-map-btn\" class=\"yzzr-btn yzzr-btn-primary yzzr-hidden\" href=\"#\" target=\"_blank\" rel=\"noopener\">\ud83d\udccd\n            Ver ubicaci\u00f3n<\/a>\n          <button id=\"yzzr-receipt-btn\" class=\"yzzr-btn yzzr-btn-success\" type=\"button\">\ud83e\uddfe Descargar recibo de\n            dep\u00f3sito<\/button>\n          <button id=\"yzzr-balance-btn\" class=\"yzzr-btn yzzr-btn-warning yzzr-hidden\" type=\"button\">\ud83d\udcb3 Pagar\n            balance<\/button>\n          <a id=\"yzzr-wa-btn\" class=\"yzzr-btn yzzr-btn-dark\" href=\"#\" target=\"_blank\" rel=\"noopener\">\ud83d\udfe2 Contactar por\n            WhatsApp<\/a>\n        <\/div>\n        <p class=\"yzzr-note\">Si alg\u00fan dato no aparece, se mostrar\u00e1 como \u201c\u2014\u201d.<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"yzzr-card\">\n      <details class=\"yzzr-faq\">\n        <summary>Caracter\u00edsticas y amenidades incluidas<\/summary>\n        <div id=\"yzzr-amenities-list\" class=\"yzzr-amen-list\"><\/div>\n      <\/details>\n    <\/div>\n\n    <div class=\"yzzr-card\">\n      <h2 class=\"yzzr-sec-title\">Pol\u00edtica de anticipo y pago<\/h2>\n      <div class=\"yzzr-faq-wrap\">\n        <details class=\"yzzr-faq\">\n          <summary>\u00bfC\u00f3mo funciona el anticipo?<\/summary>\n          <p><b>Anticipo:<\/b> 50% del costo total para confirmar tu reservaci\u00f3n.<\/p>\n        <\/details>\n        <details class=\"yzzr-faq\">\n          <summary>\u00bfCu\u00e1ndo se paga el balance restante?<\/summary>\n          <p><b>Balance restante:<\/b> Se abona el d\u00eda del evento antes de iniciar el viaje (efectivo, transferencia o\n            tarjeta con 5% adicional).<\/p>\n        <\/details>\n      <\/div>\n    <\/div>\n\n    <div class=\"yzzr-card yzzr-inline-actions\">\n      <button id=\"yzzr-reco-btn\" class=\"yzzr-btn yzzr-btn-primary\" type=\"button\">\ud83e\udded Recomendaciones del viaje<\/button>\n      <button id=\"yzzr-terms-btn\" class=\"yzzr-btn yzzr-btn-dark\" type=\"button\">\ud83d\udcd8 T\u00e9rminos y condiciones<\/button>\n    <\/div>\n    <div id=\"yzz-cargos-modal\" class=\"yzz-ca-overlay\" style=\"display:none\" role=\"dialog\" aria-modal=\"true\">\n  <div class=\"yzz-ca-box\">\n    <div class=\"yzz-ca-head\">\n      <strong>\ud83d\udcb0 Cargos adicionales<\/strong>\n      <button type=\"button\" class=\"yzz-ca-close\" data-yzz-ca-close>&times;<\/button>\n    <\/div>\n\n    <!-- Tabs horizontales de destinos -->\n    <div class=\"yzz-ca-tabs-wrap\">\n      <div class=\"yzz-ca-tabs\" id=\"yzz-ca-tabs\">\n        <!-- llenos din\u00e1micamente por JS -->\n      <\/div>\n    <\/div>\n\n    <!-- Notas generales (siempre visibles) -->\n    <div class=\"yzz-ca-info-grid\">\n      <div class=\"yzz-ca-info-card\">\n        <div class=\"yzz-ca-info-icon\">\ud83d\udcb5<\/div>\n        <div>\n          <div class=\"yzz-ca-info-title\">Propina para tripulantes<\/div>\n          <div class=\"yzz-ca-info-desc\">La propina <strong>no est\u00e1 incluida<\/strong> en ning\u00fan viaje. Se recomienda entre un <strong>5% y 10%<\/strong> del costo del yate como reconocimiento a nuestros capitanes y marineros que dan su m\u00e1ximo por tu experiencia.<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"yzz-ca-info-card\">\n        <div class=\"yzz-ca-info-icon\">\ud83c\udd7f\ufe0f<\/div>\n        <div>\n          <div class=\"yzz-ca-info-title\">Estacionamiento en marina<\/div>\n          <div class=\"yzz-ca-info-desc\">La tarifa de estacionamiento <strong>no est\u00e1 incluida<\/strong> y var\u00eda seg\u00fan cada marina. Consulta costos directamente en la marina o con tu asesor.<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"yzz-ca-info-card\">\n        <div class=\"yzz-ca-info-icon\">\ud83c\udfdd\ufe0f<\/div>\n        <div>\n          <div class=\"yzz-ca-info-title\">Acceso a playas protegidas<\/div>\n          <div class=\"yzz-ca-info-desc\">Algunas playas como <strong>Balandra<\/strong> y <strong>Esp\u00edritu Santo<\/strong> cobran una tarifa de acceso gestionada por autoridades ambientales, ajena a Yatezzitos.<\/div>\n        <\/div>\n      <\/div>\n      <div class=\"yzz-ca-info-card\">\n        <div class=\"yzz-ca-info-icon\">\u2693<\/div>\n        <div>\n          <div class=\"yzz-ca-info-title\">Impuesto de muelle<\/div>\n          <div class=\"yzz-ca-info-desc\">El impuesto de muelle es <strong>establecido por cada marina<\/strong> y es ajeno a Yatezzitos. Se paga <strong>\u00fanicamente en efectivo (pesos mexicanos)<\/strong> directamente en la marina antes de que el viaje inicie.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Tabla de cargos por destino -->\n    <div id=\"yzz-ca-content\" class=\"yzz-ca-content\"><\/div>\n  <\/div>\n<\/div>\n\n<style>\n  .yzz-ca-overlay{position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:10000;display:flex;align-items:center;justify-content:center;padding:14px}\n  .yzz-ca-box{background:#fff;border-radius:18px;max-width:640px;width:100%;max-height:88vh;overflow-y:auto;position:relative;box-shadow:0 20px 60px rgba(0,0,0,.3)}\n  .yzz-ca-head{display:flex;justify-content:space-between;align-items:center;padding:18px 20px 12px;border-bottom:1px solid #e5e7eb;position:sticky;top:0;background:#fff;z-index:2;border-radius:18px 18px 0 0}\n  .yzz-ca-head strong{font-size:18px;color:#111827}\n  .yzz-ca-close{background:none;border:none;font-size:24px;cursor:pointer;color:#6b7280;line-height:1}\n  .yzz-ca-close:hover{color:#111}\n  .yzz-ca-tabs-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;padding:12px 20px 0;scrollbar-width:none}\n  .yzz-ca-tabs-wrap::-webkit-scrollbar{display:none}\n  .yzz-ca-tabs{display:flex;gap:8px;flex-wrap:nowrap}\n  .yzz-ca-tab{flex-shrink:0;padding:8px 16px;border-radius:999px;border:2px solid #e5e7eb;background:#fafafa;font-size:13px;font-weight:700;cursor:pointer;white-space:nowrap;color:#374151;transition:all .15s}\n  .yzz-ca-tab:hover{border-color:#93c5fd;background:#eff6ff}\n  .yzz-ca-tab.is-active{background:#1d4ed8;color:#fff;border-color:#1d4ed8}\n  .yzz-ca-info-grid{display:grid;grid-template-columns:1fr;gap:8px;padding:14px 20px 0}\n  @media(min-width:500px){.yzz-ca-info-grid{grid-template-columns:1fr 1fr}}\n  .yzz-ca-info-card{display:flex;gap:10px;padding:10px 12px;border:1px solid #e5e7eb;border-radius:12px;background:#f9fafb}\n  .yzz-ca-info-icon{font-size:22px;flex-shrink:0;line-height:1.3}\n  .yzz-ca-info-title{font-weight:800;font-size:13px;margin-bottom:2px;color:#111827}\n  .yzz-ca-info-desc{font-size:12px;line-height:1.45;color:#4b5563}\n  .yzz-ca-content{padding:14px 20px 20px}\n  .yzz-ca-table{width:100%;border-collapse:collapse;font-size:13px;margin-top:4px}\n  .yzz-ca-table th{text-align:left;padding:10px 8px;background:#f1f5f9;color:#334155;font-weight:700;border-bottom:2px solid #e2e8f0}\n  .yzz-ca-table td{padding:10px 8px;border-bottom:1px solid #e5e7eb;color:#1f2937}\n  .yzz-ca-table tr:last-child td{border-bottom:0}\n  .yzz-ca-table tr:hover td{background:#f8fafc}\n  .yzz-ca-section-title{font-size:14px;font-weight:800;margin:14px 0 6px;color:#0f172a}\n  .yzz-ca-note{font-size:12px;color:#6b7280;margin:6px 0 0;line-height:1.45}\n<\/style>\n\n<script>\n(function(){\n  \/* \u2500\u2500 Datos reales de marinas por destino \u2500\u2500 *\/\n  var CARGOS = [\n    {\n      dest: 'Canc\u00fan',\n      marinas: [\n        { name: 'Marina V&V',              muelle: '$250 MXN p\/p', vehiculo: '\u2014' },\n        { name: 'Muelle Flamingos',         muelle: '$200 MXN p\/p', vehiculo: '$200 MXN' },\n        { name: 'Residencial Nautilus',     muelle: '$150 MXN p\/p', vehiculo: '\u2014' },\n        { name: 'Aquatours',                muelle: '$150 MXN p\/p', vehiculo: '\u2014' },\n        { name: 'Puerto Canc\u00fan Muelle 7',   muelle: '$250 MXN p\/p', vehiculo: '\u2014' },\n        { name: 'Puesta del Sol',           muelle: '$150 MXN p\/p', vehiculo: '\u2014' },\n        { name: 'Hacienda del Mar',         muelle: '$250 MXN p\/p', vehiculo: '\u2014' },\n        { name: 'Marina Kaybal',            muelle: '$200 MXN p\/p', vehiculo: '$200 MXN' },\n        { name: 'Golf Puerto Canc\u00fan',       muelle: '$200 MXN p\/p', vehiculo: '$200 MXN' }\n      ],\n      playas: []\n    },\n    {\n      dest: 'Acapulco',\n      marinas: [\n        { name: 'Marina Acapulco',           muelle: 'Sin impuesto', vehiculo: '\u2014' },\n        { name: 'Marina Santa Luc\u00eda',        muelle: 'Sin impuesto', vehiculo: '\u2014' },\n        { name: 'Club de Yates de Acapulco', muelle: 'Sin impuesto', vehiculo: '\u2014' },\n        { name: 'Malec\u00f3n de Acapulco',       muelle: 'Sin impuesto', vehiculo: '\u2014' },\n        { name: 'Terminal Mar\u00edtima',          muelle: 'Sin impuesto', vehiculo: '\u2014' }\n      ],\n      playas: []\n    },\n    {\n      dest: 'Huatulco',\n      marinas: [\n        { name: 'Holiday Inn',               muelle: 'Sin impuesto', vehiculo: '\u2014' },\n        { name: 'Marina Tur\u00edstica Chahu\u00e9',   muelle: 'Sin impuesto', vehiculo: '\u2014' }\n      ],\n      playas: [\n        { name: 'Parque Nacional Bah\u00edas de Huatulco', costo: '$60 MXN p\/p', nota: 'Cobro obligatorio por acceso al \u00e1rea natural protegida' }\n      ]\n    },\n    {\n      dest: 'Ixtapa',\n      marinas: [\n        { name: 'Porto Ixtapa',            muelle: 'Sin impuesto', vehiculo: '\u2014' },\n        { name: 'Muelle de Zihuatanejo',   muelle: 'Sin impuesto', vehiculo: '\u2014' },\n        { name: 'Marina Ixtapa',           muelle: 'Sin impuesto', vehiculo: '\u2014' }\n      ],\n      playas: []\n    },\n    {\n      dest: 'La Paz',\n      marinas: [\n        { name: 'Marina El Palmar',  muelle: 'Sin impuesto', vehiculo: '\u2014' },\n        { name: 'Marina Palmira',    muelle: 'Sin impuesto', vehiculo: '\u2014' },\n        { name: 'Marina La Paz',     muelle: 'Sin impuesto', vehiculo: '\u2014' },\n        { name: 'Marina Don Jos\u00e9',   muelle: 'Sin impuesto', vehiculo: '\u2014' },\n        { name: 'Marina Abaroa',     muelle: 'Sin impuesto', vehiculo: '\u2014' }\n      ],\n      playas: [\n        { name: 'Playa Balandra',       costo: '$68 MXN p\/p',    nota: 'Cobro obligatorio de acceso' },\n        { name: 'Isla Esp\u00edritu Santo',  costo: '$108 MXN p\/p',   nota: 'Cobro obligatorio de acceso' },\n        { name: 'Nado con lobos marinos', costo: '$1,500 MXN',   nota: 'Gu\u00eda obligatorio para el nado (costo por gu\u00eda, no por persona)' }\n      ]\n    },\n    {\n      dest: 'Los Cabos',\n      marinas: [\n        { name: 'Marina Cabo Muelle 2',  muelle: '$20 MXN p\/p',   vehiculo: '\u2014' },\n        { name: 'Marina Cabo Muelle F',  muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Terminal de Cabo',       muelle: '$100 MXN p\/p',  vehiculo: '\u2014' },\n        { name: 'Marina Cabo Muelle B',  muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Marina Cabo Muelle J',  muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Marina Cabo Muelle M',  muelle: '$50 MXN p\/p',   vehiculo: '\u2014' },\n        { name: 'Marina Cabo Muelle C',  muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Marina Cabo Muelle E',  muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Marina Cabo',           muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Marina Cabo Muelle H',  muelle: '$100 MXN p\/p',  vehiculo: '\u2014' },\n        { name: 'Marina Cabo Muelle L',  muelle: '$50 MXN p\/p',   vehiculo: '\u2014' },\n        { name: 'Marina Cabo Muelle D',  muelle: 'Sin impuesto',  vehiculo: '\u2014' }\n      ],\n      playas: []\n    },\n    {\n      dest: 'Mazatl\u00e1n',\n      marinas: [\n        { name: 'Marina Fonatur (Operadora Portuaria)',            muelle: '$20 MXN p\/p',   vehiculo: '$50 MXN' },\n        { name: 'Marina Mazatl\u00e1n Muelle 8',                        muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Restaurante Ana Mar',                             muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Marina Mazatl\u00e1n Muelle 10',                       muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Isla Mazatl\u00e1n Muelle A \/ La Tostader\u00eda del Mar',  muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Marina Mazatl\u00e1n Muelle 7 (Gus Gus)',              muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Marina Mazatl\u00e1n Muelle 3',                        muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Naviera Tres Mar\u00edas',                             muelle: 'Sin impuesto',  vehiculo: '\u2014' },\n        { name: 'Marina Mazatl\u00e1n Muelle 7',                        muelle: 'Sin impuesto',  vehiculo: '\u2014' }\n      ],\n      playas: []\n    },\n    {\n      dest: 'Nuevo Vallarta',\n      marinas: [\n        { name: 'Marina Nuevo Vallarta',        muelle: 'Sin impuesto',   vehiculo: '\u2014' },\n        { name: 'Marina Cruz de Huanacaxtle',   muelle: '$400 MXN p\/p',   vehiculo: '\u2014' },\n        { name: 'Marina Paradise Village',      muelle: 'Sin impuesto',   vehiculo: '\u2014' }\n      ],\n      playas: [],\n      notas: ['\u26a0\ufe0f La embarcaci\u00f3n Kusi Wasi (Marina Cruz de Huanacaxtle) exige propina obligatoria del 10% del costo del viaje.']\n    },\n    {\n      dest: 'Playa del Carmen',\n      marinas: [\n        { name: 'Gran Marina (Puerto Aventuras)',  muelle: '$400 MXN p\/p',  vehiculo: '\u2014' },\n        { name: 'Marina Cozumel ASIPONA',          muelle: 'Sin impuesto',  vehiculo: '\u2014' }\n      ],\n      playas: [],\n      notas: [\n        '\u26a0\ufe0f Algunas embarcaciones en Gran Marina (Sunseeker 55, Azimut 43, Bali 40, Aventura 34) exigen propina obligatoria del 10%.',\n        '\u26a0\ufe0f La embarcaci\u00f3n Blue Ray en Marina Cozumel ASIPONA cobra $200 MXN p\/p de impuesto de muelle.'\n      ]\n    },\n    {\n      dest: 'Puerto Vallarta',\n      marinas: [\n        { name: 'Marina Vallarta Muelle C',        muelle: '$50 MXN p\/p',   vehiculo: '\u2014' },\n        { name: 'Marina Vallarta Muelle E',        muelle: '$50 MXN p\/p',   vehiculo: '\u2014' },\n        { name: 'Marina Vallarta Muelle F',        muelle: '$50 MXN p\/p',   vehiculo: '\u2014' },\n        { name: 'Marina Vallarta Muelle G',        muelle: '$50 MXN p\/p',   vehiculo: '\u2014' },\n        { name: 'Marina Vallarta Muelle H',        muelle: '$50 MXN p\/p',   vehiculo: '\u2014' },\n        { name: 'Marina Vallarta Muelle I',        muelle: '$50 MXN p\/p',   vehiculo: '\u2014' },\n        { name: 'Marina Vallarta Muelle J',        muelle: '$50 MXN p\/p',   vehiculo: '\u2014' },\n        { name: 'Marina Vallarta Muelle K',        muelle: '$50\u2013$100 MXN p\/p', vehiculo: '\u2014' },\n        { name: 'Marina Vallarta Muelle M',        muelle: '$50 MXN p\/p',   vehiculo: '\u2014' },\n        { name: 'Marina Flamingo Vallarta Hotel',  muelle: 'Sin impuesto',  vehiculo: '\u2014' }\n      ],\n      playas: [],\n      notas: ['\u26a0\ufe0f Algunas embarcaciones absorben el impuesto de muelle y lo ofrecen como cortes\u00eda. Verifica con tu asesor.']\n    }\n  ];\n\n  var tabsEl = document.getElementById('yzz-ca-tabs');\n  var contentEl = document.getElementById('yzz-ca-content');\n  var overlay = document.getElementById('yzz-cargos-modal');\n  if (!tabsEl || !contentEl || !overlay) return;\n\n  function renderTabs() {\n    tabsEl.innerHTML = CARGOS.map(function(c, i){\n      return '<button class=\"yzz-ca-tab'+(i===0? ' is-active':'')+'\" data-yzz-ca-idx=\"'+i+'\">\ud83d\udccd '+c.dest+'<\/button>';\n    }).join('');\n  }\n\n  function renderContent(idx) {\n    var c = CARGOS[idx]; if (!c) return;\n    var hasVehiculo = c.marinas.some(function(m){ return m.vehiculo && m.vehiculo !== '\u2014'; });\n    var h = '<div class=\"yzz-ca-section-title\">\u2693 Impuestos de muelle \u2014 '+c.dest+'<\/div>';\n    h += '<table class=\"yzz-ca-table\"><thead><tr><th>Marina<\/th><th>Impuesto<\/th>';\n    if (hasVehiculo) h += '<th>Veh\u00edculo<\/th>';\n    h += '<\/tr><\/thead><tbody>';\n    c.marinas.forEach(function(m){\n      h += '<tr><td>'+m.name+'<\/td><td><strong>'+m.muelle+'<\/strong><\/td>';\n      if (hasVehiculo) h += '<td>'+(m.vehiculo||'\u2014')+'<\/td>';\n      h += '<\/tr>';\n    });\n    h += '<\/tbody><\/table>';\n    if (c.playas && c.playas.length) {\n      h += '<div class=\"yzz-ca-section-title\">\ud83c\udfdd\ufe0f Acceso a playas \u2014 '+c.dest+'<\/div>';\n      h += '<table class=\"yzz-ca-table\"><thead><tr><th>Playa \/ Isla<\/th><th>Costo<\/th><th>Notas<\/th><\/tr><\/thead><tbody>';\n      c.playas.forEach(function(p){ h += '<tr><td>'+p.name+'<\/td><td><strong>'+p.costo+'<\/strong><\/td><td>'+(p.nota||'\u2014')+'<\/td><\/tr>'; });\n      h += '<\/tbody><\/table>';\n    }\n    if (c.notas && c.notas.length) {\n      c.notas.forEach(function(n){ h += '<p class=\"yzz-ca-note\" style=\"background:#fef3c7;border:1px solid #f59e0b;border-radius:8px;padding:8px 12px;color:#92400e;font-weight:600\">'+n+'<\/p>'; });\n    }\n    h += '<p class=\"yzz-ca-note\">\u26a0\ufe0f Los montos son aproximados y pueden cambiar sin previo aviso. Verifica con tu asesor antes del viaje.<\/p>';\n    contentEl.innerHTML = h;\n  }\n\n  renderTabs();\n  renderContent(0);\n\n  tabsEl.addEventListener('click', function(e){\n    var btn = e.target.closest('[data-yzz-ca-idx]');\n    if (!btn) return;\n    tabsEl.querySelectorAll('.yzz-ca-tab').forEach(function(t){ t.classList.remove('is-active'); });\n    btn.classList.add('is-active');\n    renderContent(Number(btn.getAttribute('data-yzz-ca-idx')));\n  });\n\n  \/\/ Open \/ close\n  function openCargos(){ overlay.style.display = 'flex'; document.body.style.overflow = 'hidden'; }\n  function closeCargos(){ overlay.style.display = 'none'; document.body.style.overflow = ''; }\n\n  document.addEventListener('click', function(e){\n    if (e.target.closest('[data-yzz-open-cargos]')) { e.preventDefault(); openCargos(); return; }\n    if (e.target.closest('[data-yzz-ca-close]'))    { e.preventDefault(); closeCargos(); return; }\n    if (e.target === overlay) closeCargos();\n  });\n  document.addEventListener('keydown', function(e){ if (e.key === 'Escape' && overlay.style.display === 'flex') closeCargos(); });\n\n  \/\/ Exponer globalmente para poder abrir desde otros scripts\n  window.yzzOpenCargos = openCargos;\n})();\n<\/script>\n  <\/div>\n<\/div>\n\n<div id=\"yzzr-receipt-modal\" class=\"yzzr-modal\" aria-hidden=\"true\">\n  <div class=\"yzzr-modal-back\" data-yzzr-close=\"yzzr-receipt-modal\"><\/div>\n  <div class=\"yzzr-modal-wrap\">\n    <div class=\"yzzr-modal-card\">\n      <div class=\"yzzr-modal-head\">\n        <strong>Recibo de dep\u00f3sito<\/strong>\n        <button type=\"button\" class=\"yzzr-close\" data-yzzr-close=\"yzzr-receipt-modal\">Cerrar<\/button>\n      <\/div>\n      <p class=\"yzzr-note\">Si el formulario no carga en el popup, usa el enlace de respaldo.<\/p>\n      <iframe id=\"yzzr-receipt-frame\" title=\"Recibo de dep\u00f3sito\"\n        style=\"width:100%;height:70vh;border:0;border-radius:10px;background:#fff\"><\/iframe>\n      <div style=\"height:8px\"><\/div>\n      <a id=\"yzzr-receipt-fallback\" class=\"yzzr-btn yzzr-btn-primary\" href=\"#\" target=\"_blank\" rel=\"noopener\">Abrir\n        formulario en nueva pesta\u00f1a<\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div id=\"yzzr-balance-modal\" class=\"yzzr-modal\" aria-hidden=\"true\">\n  <div class=\"yzzr-modal-back\" data-yzzr-close=\"yzzr-balance-modal\"><\/div>\n  <div class=\"yzzr-modal-wrap\">\n    <div class=\"yzzr-modal-card\">\n      <div class=\"yzzr-modal-head\">\n        <strong>Pagar balance pendiente<\/strong>\n        <button type=\"button\" class=\"yzzr-close\" data-yzzr-close=\"yzzr-balance-modal\">Cerrar<\/button>\n      <\/div>\n      <p id=\"yzzr-balance-amount\" class=\"yzzr-note\"><\/p>\n      <div id=\"yzzr-balance-choices\" class=\"yzzr-pay-choices\">\n        <button id=\"yzzr-balance-card-btn\" class=\"yzzr-btn yzzr-btn-primary\" type=\"button\">Pagar con tarjeta de cr\u00e9dito\n          \/ d\u00e9bito<\/button>\n        <button id=\"yzzr-balance-transfer-btn\" class=\"yzzr-btn yzzr-btn-dark\" type=\"button\">Pagar con transferencia\n          bancaria<\/button>\n      <\/div>\n      <div id=\"yzzr-balance-survey-wrap\" class=\"yzzr-survey-wrap\">\n        <iframe src=\"\" style=\"border:none;width:100%;min-height:680px;\" scrolling=\"no\" id=\"yzzr-balance-survey-frame\"\n          title=\"survey\"><\/iframe>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div id=\"yzzr-reco-modal\" class=\"yzzr-modal\" aria-hidden=\"true\">\n  <div class=\"yzzr-modal-back\" data-yzzr-close=\"yzzr-reco-modal\"><\/div>\n  <div class=\"yzzr-modal-wrap\">\n    <div class=\"yzzr-modal-card\">\n      <div class=\"yzzr-modal-head\">\n        <strong>Recomendaciones para tu aventura en el mar<\/strong>\n        <button type=\"button\" class=\"yzzr-close\" data-yzzr-close=\"yzzr-reco-modal\">Cerrar<\/button>\n      <\/div>\n      <div class=\"yzzr-copy\">\n        <p><b>Alimentos y bebidas:<\/b> Le recomendamos llevar sus alimentos y bebidas favoritas para disfrutar durante\n          el recorrido. Aunque muchos destinos ofrecen la opci\u00f3n de bajar a un restaurante o env\u00edos a bordo del yate,\n          incluir snacks saludables, bebidas refrescantes y opciones especiales mejora la experiencia.<\/p>\n        <p><b>Toallas:<\/b> Lleve toallas suficientes para usted y sus acompa\u00f1antes para mantenerse c\u00f3modos y secos\n          durante el recorrido.<\/p>\n        <p><b>Protecci\u00f3n solar:<\/b> Lleve protector solar, sombrero, gafas con protecci\u00f3n UV y ropa ligera para\n          protegerse de los rayos solares.<\/p>\n        <p><b>Medicamentos para el mareo:<\/b> Si es propenso al mareo, considere prevenci\u00f3n antes de abordar.<\/p>\n        <p><b>Actitud positiva:<\/b> Venga preparado para relajarse, explorar y crear recuerdos inolvidables.<\/p>\n        <p><b>Hidrataci\u00f3n:<\/b> Lleve suficiente agua potable, especialmente si har\u00e1 snorkel, kayac o paddleboard.<\/p>\n        <p><b>Ropa adecuada:<\/b> Use ropa c\u00f3moda, ligera y de secado r\u00e1pido. Lleve una muda adicional.<\/p>\n        <p><b>Calzado adecuado:<\/b> Evite suelas duras o tacones. Recomendamos calzado antideslizante o n\u00e1utico.<\/p>\n        <p><b>Fotograf\u00eda y entretenimiento:<\/b> Proteja su celular o use c\u00e1mara impermeable. Lleve bater\u00eda port\u00e1til.<\/p>\n        <p><b>Disfrute responsable:<\/b> Si consume alcohol, h\u00e1galo con moderaci\u00f3n para mantener una experiencia segura.\n        <\/p>\n        <p><b>Respete las indicaciones de la tripulaci\u00f3n:<\/b> Ellos est\u00e1n capacitados para su seguridad y comodidad.<\/p>\n        <p><b>Puntualidad:<\/b> Llegue al menos 30 minutos antes de la salida programada.<\/p>\n        <p>Siguiendo estas recomendaciones, su experiencia con Yatezzitos ser\u00e1 c\u00f3moda, segura y memorable. \u00a1Nos vemos a\n          bordo!<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<div id=\"yzzr-terms-modal\" class=\"yzzr-modal\" aria-hidden=\"true\">\n  <div class=\"yzzr-modal-back\" data-yzzr-close=\"yzzr-terms-modal\"><\/div>\n  <div class=\"yzzr-modal-wrap\">\n    <div class=\"yzzr-modal-card\">\n      <div class=\"yzzr-modal-head\">\n        <strong>T\u00e9rminos y condiciones del servicio<\/strong>\n        <button type=\"button\" class=\"yzzr-close\" data-yzzr-close=\"yzzr-terms-modal\">Cerrar<\/button>\n      <\/div>\n      <div class=\"yzzr-copy\">\n        <p><b>1. Reembolso<\/b><\/p>\n        <p><b>1.1 Cancelaciones:<\/b> No se realizan reembolsos por cancelaci\u00f3n. Se ofrece re-agendar bajo condiciones\n          establecidas.<\/p>\n        <p><b>1.2 Condiciones clim\u00e1ticas:<\/b> Si el mal clima impide navegaci\u00f3n segura, se permite re-agendar sin costo\n          adicional.<\/p>\n        <p><b>2. Cambios<\/b><\/p>\n        <p><b>2.1 Cambio de titular:<\/b> Debe notificarse con m\u00ednimo 24 horas de anticipaci\u00f3n.<\/p>\n        <p><b>2.2 Cambio de fecha:<\/b> Debe solicitarse con al menos 14 d\u00edas de anticipaci\u00f3n.<\/p>\n        <p><b>2.3 Cambio de embarcaci\u00f3n:<\/b> No aplica salvo autorizaci\u00f3n extraordinaria de Yatezzitos M\u00e9xico.<\/p>\n        <p><b>2.4 Fecha abierta:<\/b> Puede otorgarse en casos especiales, sujeta a disponibilidad y ajustes en precio.\n        <\/p>\n        <p><b>3. Reservaci\u00f3n<\/b><\/p>\n        <p><b>3.1<\/b> Se requiere anticipo de 50% para confirmar la reservaci\u00f3n.<\/p>\n        <p><b>3.2<\/b> Si el anticipo queda incompleto, se debe completar hasta 7 d\u00edas antes del viaje.<\/p>\n        <p><b>4. Responsabilidad de da\u00f1os y riesgos<\/b><\/p>\n        <p><b>4.1<\/b> Los clientes son responsables de da\u00f1os ocasionados durante el uso de la embarcaci\u00f3n.<\/p>\n        <p><b>4.2<\/b> Deben seguirse todas las instrucciones de la tripulaci\u00f3n.<\/p>\n        <p><b>5. Horarios y puntualidad<\/b><\/p>\n        <p><b>5.1<\/b> Tolerancia m\u00e1xima de 15 minutos siempre que no afecte otras reservaciones.<\/p>\n        <p><b>5.2<\/b> Retrasos mayores a 60 minutos sin justificaci\u00f3n se consideran servicio cumplido.<\/p>\n        <p><b>5.3<\/b> Se recomienda llegar 30 minutos antes de la salida.<\/p>\n        <p><b>6. P\u00e9rdida de objetos personales<\/b><\/p>\n        <p>Yatezzitos no se hace responsable de objetos extraviados durante el recorrido.<\/p>\n        <p>Gracias por confiar en Yatezzitos M\u00e9xico.<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<style>\n  #yzzr-root {\n    max-width: 980px;\n    margin: 0 auto;\n    padding: 16px;\n    color: #111827;\n    font-family: var(--yzz-font-family, Arial, sans-serif);\n    box-sizing: border-box\n  }\n\n  #yzzr-root *,\n  .yzzr-modal * {\n    box-sizing: border-box\n  }\n\n  .yzzr-card {\n    background: #fff;\n    border: 1px solid #e5e7eb;\n    border-radius: 14px;\n    padding: 16px;\n    margin-bottom: 12px\n  }\n\n  .yzzr-title {\n    margin: 0 0 8px;\n    font-size: 28px;\n    line-height: 1.15\n  }\n\n  .yzzr-sub {\n    margin: 0;\n    color: #6b7280\n  }\n\n  .yzzr-note {\n    margin: 10px 0 0;\n    font-size: 12px;\n    color: #6b7280;\n    line-height: 1.45\n  }\n\n  .yzzr-sec-title {\n    margin: 0 0 10px;\n    font-size: 18px;\n    line-height: 1.3\n  }\n\n  .yzzr-grid {\n    display: grid;\n    grid-template-columns: 1fr;\n    gap: 12px\n  }\n\n  .yzzr-row {\n    display: flex;\n    justify-content: space-between;\n    gap: 10px;\n    border-bottom: 1px dashed #e5e7eb;\n    padding: 10px 0\n  }\n\n  .yzzr-row:last-child {\n    border-bottom: 0\n  }\n\n  .yzzr-k {\n    color: #6b7280\n  }\n\n  .yzzr-v {\n    font-weight: 700;\n    text-align: right;\n    word-break: break-word;\n    overflow-wrap: anywhere;\n    max-width: 62%\n  }\n\n  .yzzr-status {\n    display: inline-flex;\n    align-items: center;\n    border-radius: 999px;\n    background: #e5e7eb;\n    padding: 6px 10px;\n    font-size: 13px;\n    font-weight: 700\n  }\n\n  .yzzr-status.is-ok {\n    background: #d1fae5;\n    color: #065f46\n  }\n\n  .yzzr-status.is-warn {\n    background: #fef3c7;\n    color: #92400e\n  }\n\n  .yzzr-status.is-error {\n    background: #fee2e2;\n    color: #991b1b\n  }\n\n  .yzzr-countdown {\n    display: grid;\n    grid-template-columns: repeat(4, 1fr);\n    gap: 8px;\n    margin-top: 12px\n  }\n\n  .yzzr-timebox {\n    background: #0b1939;\n    color: #fff;\n    border-radius: 10px;\n    text-align: center;\n    padding: 10px\n  }\n\n  .yzzr-time-num {\n    font-size: 24px;\n    font-weight: 800;\n    line-height: 1\n  }\n\n  .yzzr-time-lbl {\n    font-size: 11px;\n    color: #cbd5e1;\n    text-transform: uppercase;\n    margin-top: 4px\n  }\n\n  .yzzr-pill {\n    display: inline-flex;\n    align-items: center;\n    border-radius: 999px;\n    padding: 6px 10px;\n    font-size: 12px;\n    font-weight: 700\n  }\n\n  .yzzr-pill.is-confirmed {\n    background: #d1fae5;\n    color: #065f46\n  }\n\n  .yzzr-pill.is-pending {\n    background: #fef3c7;\n    color: #92400e\n  }\n\n  .yzzr-pill.is-cancelled {\n    background: #fee2e2;\n    color: #991b1b\n  }\n\n  .yzzr-pill.is-other {\n    background: #e5e7eb;\n    color: #1f2937\n  }\n\n  .yzzr-actions {\n    display: grid;\n    grid-template-columns: 1fr;\n    gap: 8px;\n    margin-top: 12px\n  }\n\n  .yzzr-inline-actions {\n    display: grid;\n    grid-template-columns: 1fr;\n    gap: 8px\n  }\n\n  .yzzr-btn {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 100%;\n    border: 0;\n    border-radius: 10px;\n    padding: 12px 14px;\n    font-weight: 700;\n    text-decoration: none;\n    color: #fff;\n    cursor: pointer;\n    text-align: center;\n    min-height: 44px;\n    touch-action: manipulation\n  }\n\n  .yzzr-btn-primary {\n    background: #194395\n  }\n\n  .yzzr-btn-success {\n    background: #00945e\n  }\n\n  .yzzr-btn-dark {\n    background: #111827\n  }\n\n  .yzzr-btn-warning {\n    background: #d97706\n  }\n\n  .yzzr-btn:hover,\n  .yzzr-btn:focus,\n  .yzzr-btn:active {\n    color: #fff !important;\n    text-decoration: none !important\n  }\n\n  .yzzr-map-link {\n    font-weight: 700;\n    color: #194395;\n    text-decoration: underline;\n    word-break: break-all\n  }\n\n  .yzzr-map-link.yzzr-disabled {\n    pointer-events: none;\n    color: #9ca3af;\n    text-decoration: none\n  }\n\n  .yzzr-hidden {\n    display: none !important\n  }\n\n  .yzzr-img-wrap {\n    padding: 0;\n    overflow: hidden\n  }\n\n  .yzzr-img {\n    display: block;\n    width: 100%;\n    height: auto;\n    max-height: 420px;\n    object-fit: cover\n  }\n\n  .yzzr-amen-list {\n    display: grid;\n    grid-template-columns: 1fr;\n    gap: 8px\n  }\n\n  .yzzr-amen-item {\n    display: flex;\n    gap: 10px;\n    align-items: flex-start;\n    padding: 10px 12px;\n    border: 1px solid #e5e7eb;\n    border-radius: 10px;\n    background: #fafafa\n  }\n\n  .yzzr-amen-emo {\n    font-size: 18px;\n    line-height: 1.2\n  }\n\n  .yzzr-amen-txt {\n    font-size: 14px;\n    line-height: 1.35\n  }\n\n  .yzzr-faq-wrap {\n    display: grid;\n    grid-template-columns: 1fr;\n    gap: 10px\n  }\n\n  .yzzr-faq {\n    border: 1px solid #e5e7eb;\n    border-radius: 10px;\n    padding: 10px;\n    background: #fcfcfd\n  }\n\n  .yzzr-faq summary {\n    cursor: pointer;\n    font-weight: 700\n  }\n\n  .yzzr-faq p {\n    margin: 10px 0 0;\n    line-height: 1.45\n  }\n\n  .yzzr-faq .yzzr-amen-list {\n    margin-top: 10px\n  }\n\n  .yzzr-modal {\n    display: none;\n    position: fixed;\n    inset: 0;\n    z-index: 999999\n  }\n\n  .yzzr-modal.open {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 12px\n  }\n\n  .yzzr-modal-back {\n    position: absolute;\n    inset: 0;\n    background: rgba(0, 0, 0, .58);\n    z-index: 0\n  }\n\n  .yzzr-modal-wrap {\n    position: relative;\n    z-index: 1;\n    width: min(100%, 900px);\n    max-width: 900px;\n    margin: 0;\n    padding: 0\n  }\n\n  .yzzr-modal-card {\n    background: #fff;\n    border-radius: 14px;\n    border: 1px solid #e5e7eb;\n    padding: 14px;\n    max-height: calc(100dvh - 24px);\n    overflow: auto;\n    -webkit-overflow-scrolling: touch\n  }\n\n  .yzzr-modal-head {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 8px;\n    margin-bottom: 8px\n  }\n\n  .yzzr-close {\n    border: 0;\n    background: #f3f4f6;\n    border-radius: 8px;\n    padding: 8px 10px;\n    font-weight: 700;\n    cursor: pointer;\n    min-height: 40px\n  }\n\n  .yzzr-copy p {\n    margin: 0 0 10px;\n    line-height: 1.5\n  }\n\n  .yzzr-survey-wrap {\n    display: none;\n    border: 1px solid #e5e7eb;\n    border-radius: 10px;\n    overflow: hidden;\n    margin-top: 10px\n  }\n\n  .yzzr-survey-wrap.active {\n    display: block\n  }\n\n  .yzzr-pay-choices {\n    display: grid;\n    grid-template-columns: 1fr;\n    gap: 8px\n  }\n\n  .yzzr-err-title {\n    margin: 0 0 6px;\n    color: #991b1b;\n    font-size: 22px\n  }\n\n  @media(min-width:760px) {\n    .yzzr-grid {\n      grid-template-columns: 1fr 1fr\n    }\n\n    .yzzr-inline-actions {\n      grid-template-columns: 1fr 1fr\n    }\n  }\n\n  @media(max-width:759px) {\n    .yzzr-modal.open {\n      align-items: flex-end;\n      padding: 0\n    }\n\n    .yzzr-modal-wrap {\n      width: 100%;\n      max-width: none\n    }\n\n    .yzzr-modal-card {\n      border-radius: 18px 18px 0 0;\n      border-left: 0;\n      border-right: 0;\n      border-bottom: 0;\n      max-height: min(86dvh, calc(100dvh - 24px));\n      padding: 16px 14px calc(16px + env(safe-area-inset-bottom))\n    }\n  }\n<\/style>\n\n<script>\n  (function () {\n    var root = document.getElementById('yzzr-root');\n    if (!root) { return; }\n\n    var DASH = '\u2014';\n    var PATHNAME = (location.pathname || '').toLowerCase();\n    var IS_EN = \/^\\\/en(\\\/|$)\/.test(PATHNAME);\n    function tt(es, en) { return IS_EN ? en : es; }\n    var WA_NUMBER = '526691324073';\n    var SURVEY_BASE = 'https:\/\/link.yatezzitos.com\/widget\/survey\/OXyI9rBvZVpcE877iYso';\n    var TRANSFER_URL = location.origin + (function () {\n      var p = (location.pathname || '').toLowerCase();\n      if (\/^\\\/en(\\\/|$)\/.test(p)) return '\/en';\n      if (\/^\\\/es(\\\/|$)\/.test(p)) return '\/es';\n      return '\/es';\n    })() + '\/pagos-con-transferencia\/';\n    var RECEIPT_BASE = 'https:\/\/link.yatezzitos.com\/documents\/doc-form\/6781ebb6ec779a2e3e9dcc33?locale=' + (IS_EN ? 'en' : 'es');\n    var state = {\n      qt: (new URLSearchParams(location.search).get('qt') || '').trim(),\n      data: null,\n      countdownId: null,\n      balanceAmount: NaN\n    };\n    var debugMode = (function () {\n      var v = (new URLSearchParams(location.search).get('debug') || '').trim().toLowerCase();\n      return v === '1' || v === 'true' || v === 'yes';\n    })();\n    function applyReservationLocale() {\n      if (!IS_EN) return;\n      var map = {\n        'Cliente': 'Customer',\n        'Embarcaci\u00f3n': 'Yacht',\n        'Tipo de experiencia reservada': 'Reserved experience',\n        'Destino': 'Destination',\n        'Fecha': 'Date',\n        'Horario': 'Schedule',\n        'Pasajeros': 'Guests',\n        'Marina': 'Marina',\n        'Ubicaci\u00f3n de abordaje': 'Boarding location',\n        'Estado de la reserva': 'Reservation status',\n        'Reservaci\u00f3n ID': 'Reservation ID',\n        'Anticipo pagado': 'Deposit paid',\n        'Saldo pendiente': 'Remaining balance',\n        'Costo total': 'Total cost',\n        'M\u00e9todo de pago': 'Payment method'\n      };\n      var labels = root.querySelectorAll('.yzzr-row .yzzr-k');\n      labels.forEach(function (el) {\n        var txt = String(el.textContent || '').trim();\n        if (map[txt]) el.textContent = map[txt];\n      });\n      if ($('yzzr-hello')) $('yzzr-hello').textContent = 'Loading your reservation details...';\n      if ($('yzzr-load-status')) $('yzzr-load-status').textContent = 'Checking...';\n      if ($('yzzr-error-title')) $('yzzr-error-title').textContent = 'Reservation unavailable';\n      if ($('yzzr-error-msg')) $('yzzr-error-msg').textContent = 'We could not load the reservation.';\n      if ($('yzzr-name')) $('yzzr-name').textContent = DASH;\n      if ($('yzzr-meeting-link')) $('yzzr-meeting-link').textContent = DASH;\n      if ($('yzzr-res-status')) $('yzzr-res-status').textContent = 'Pending confirmation';\n      if ($('yzzr-map-btn')) $('yzzr-map-btn').textContent = '\ud83d\udccd View location';\n      if ($('yzzr-receipt-btn')) $('yzzr-receipt-btn').textContent = '\ud83e\uddfe Download deposit receipt';\n      if ($('yzzr-balance-btn')) $('yzzr-balance-btn').textContent = '\ud83d\udcb3 Pay balance';\n      if ($('yzzr-wa-btn')) $('yzzr-wa-btn').textContent = '\ud83d\udfe2 Contact on WhatsApp';\n      var titles = root.querySelectorAll('.yzzr-title');\n      titles.forEach(function (t) { t.textContent = 'My reservation'; });\n      var countLbls = root.querySelectorAll('.yzzr-time-lbl');\n      if (countLbls[0]) countLbls[0].textContent = 'Days';\n      if (countLbls[1]) countLbls[1].textContent = 'Hours';\n      if (countLbls[2]) countLbls[2].textContent = 'Min';\n      if (countLbls[3]) countLbls[3].textContent = 'Sec';\n      var secTitle = root.querySelector('.yzzr-sec-title');\n      if (secTitle) secTitle.textContent = 'Deposit and payment policy';\n      var faqSummaries = root.querySelectorAll('.yzzr-faq > summary');\n      faqSummaries.forEach(function (summary) {\n        var txt = String(summary.textContent || '').trim();\n        if (txt === 'Caracter\u00edsticas y amenidades incluidas') summary.textContent = 'Included features and amenities';\n        if (txt === '\u00bfC\u00f3mo funciona el anticipo?') summary.textContent = 'How does the deposit work?';\n        if (txt === '\u00bfCu\u00e1ndo se paga el balance restante?') summary.textContent = 'When is the remaining balance due?';\n      });\n      if ($('yzzr-reco-btn')) $('yzzr-reco-btn').textContent = '\ud83e\udded Trip recommendations';\n      if ($('yzzr-terms-btn')) $('yzzr-terms-btn').textContent = '\ud83d\udcd8 Terms and conditions';\n      var note = root.querySelector('.yzzr-actions + .yzzr-note');\n      if (note) note.textContent = 'If any field is missing, it will be shown as \u201c\u2014\u201d.';\n\n      var receiptHead = root.querySelector('#yzzr-receipt-modal .yzzr-modal-head strong');\n      if (receiptHead) receiptHead.textContent = 'Deposit receipt';\n      var receiptNote = root.querySelector('#yzzr-receipt-modal .yzzr-note');\n      if (receiptNote) receiptNote.textContent = 'If the form does not load in the popup, use the backup link.';\n      if ($('yzzr-receipt-fallback')) $('yzzr-receipt-fallback').textContent = 'Open form in a new tab';\n      var balanceHead = root.querySelector('#yzzr-balance-modal .yzzr-modal-head strong');\n      if (balanceHead) balanceHead.textContent = 'Pay pending balance';\n      if ($('yzzr-balance-card-btn')) $('yzzr-balance-card-btn').textContent = 'Pay with credit\/debit card';\n      if ($('yzzr-balance-transfer-btn')) $('yzzr-balance-transfer-btn').textContent = 'Pay by bank transfer';\n      var recoHead = root.querySelector('#yzzr-reco-modal .yzzr-modal-head strong');\n      if (recoHead) recoHead.textContent = 'Recommendations for your sea adventure';\n      var termsHead = root.querySelector('#yzzr-terms-modal .yzzr-modal-head strong');\n      if (termsHead) termsHead.textContent = 'Service terms and conditions';\n      var closeBtns = root.querySelectorAll('.yzzr-close');\n      closeBtns.forEach(function (btn) { btn.textContent = 'Close'; });\n    }\n    applyReservationLocale();\n\n    function $(id) { return document.getElementById(id); }\n    function mountReservationModalToBody(id) {\n      var modal = $(id);\n      if (modal && modal.parentNode !== document.body) {\n        document.body.appendChild(modal);\n      }\n    }\n    mountReservationModalToBody('yzzr-receipt-modal');\n    mountReservationModalToBody('yzzr-balance-modal');\n    mountReservationModalToBody('yzzr-reco-modal');\n    mountReservationModalToBody('yzzr-terms-modal');\n    function nonEmpty(v) { return v !== undefined && v !== null && String(v).trim() !== ''; }\n    function normalizeKey(key) { return String(key || '').toLowerCase().replace(\/[^a-z0-9]\/g, ''); }\n    function unique(arr) { return arr.filter(function (v, i) { return arr.indexOf(v) === i; }); }\n    function setText(id, value) { var el = $(id); if (!el) return; el.textContent = nonEmpty(value) ? String(value) : DASH; }\n    function show(id) { var el = $(id); if (el) { el.classList.remove('yzzr-hidden'); } }\n    function hide(id) { var el = $(id); if (el) { el.classList.add('yzzr-hidden'); } }\n\n    function getScopes(raw) {\n      return [raw, raw && typeof raw.payload === 'object' ? raw.payload : null, raw && typeof raw.data === 'object' ? raw.data : null];\n    }\n\n    function pick(raw, keys) {\n      var scopes = getScopes(raw);\n      var normalized = (keys || []).map(normalizeKey);\n      for (var s = 0; s < scopes.length; s++) {\n        var scope = scopes[s];\n        if (!scope) { continue; }\n        for (var i = 0; i < keys.length; i++) {\n          var key = keys[i];\n          if (Object.prototype.hasOwnProperty.call(scope, key) && nonEmpty(scope[key])) return scope[key];\n        }\n      }\n      for (var ss = 0; ss < scopes.length; ss++) {\n        var looseScope = scopes[ss];\n        if (!looseScope) { continue; }\n        for (var k in looseScope) {\n          if (!Object.prototype.hasOwnProperty.call(looseScope, k)) continue;\n          if (!nonEmpty(looseScope[k])) continue;\n          if (normalized.indexOf(normalizeKey(k)) > -1) return looseScope[k];\n        }\n      }\n      return '';\n    }\n\n    function pickByPattern(obj, regex) {\n      if (!obj || typeof obj !== 'object') return '';\n      for (var k in obj) {\n        if (!Object.prototype.hasOwnProperty.call(obj, k)) continue;\n        if (!nonEmpty(obj[k])) continue;\n        if (regex.test(String(k))) return obj[k];\n      }\n      return '';\n    }\n\n    function pickAmenitiesSource(raw) {\n      var direct = pick(raw, [\n        'amenities_raw',\n        'amenities_raw_text',\n        'caractersticas_y_amenidades_del_yate',\n        'caracteristicas_y_amenidades_del_yate',\n        'caracteristicas_amenidades_del_yate',\n        'amenidades',\n        'amenity_list',\n        'amenities'\n      ]);\n      if (nonEmpty(direct)) return direct;\n      var fuzzy = pickByPattern(raw, \/(amenid|amenit|caracteri|caracters|feature|inclu)\/i);\n      if (nonEmpty(fuzzy)) return fuzzy;\n      if (raw && typeof raw.payload === 'object') {\n        var nested = pickByPattern(raw.payload, \/(amenid|amenit|caracteri|caracters|feature|inclu)\/i);\n        if (nonEmpty(nested)) return nested;\n      }\n      if (raw && typeof raw.data === 'object') {\n        var nestedData = pickByPattern(raw.data, \/(amenid|amenit|caracteri|caracters|feature|inclu)\/i);\n        if (nonEmpty(nestedData)) return nestedData;\n      }\n      return '';\n    }\n\n    function normalizeAmenityKey(value) {\n      return String(value || '')\n        .toLowerCase()\n        .normalize('NFD')\n        .replace(\/[\\u0300-\\u036f]\/g, '')\n        .replace(\/[()]\/g, '')\n        .replace(\/\\s+\/g, ' ')\n        .trim();\n    }\n\n    var AMENITY_EMOJI_MAP = {\n      'agua embotellada': '\ud83d\udca7',\n      'aire acondicionado': '\u2744\ufe0f',\n      'alfombra \/ tapete acuatico': '\ud83c\udf0a',\n      'cervezas 12': '\ud83c\udf7a',\n      'cervezas 24': '\ud83c\udf7a',\n      'ceviches o alimentos de bienvenida': '\ud83c\udf64',\n      'chalecos salvavidas': '\ud83d\udedf',\n      'chef a bordo': '\ud83d\udc68\u200d\ud83c\udf73',\n      'cocina funcional': '\ud83c\udf7d\ufe0f',\n      'conexion usb para telefonos': '\ud83d\udd0c',\n      'dona inflable': '\ud83d\udedf',\n      'equipo de pesca deportiva': '\ud83c\udfa3',\n      'equipo de snorkel': '\ud83e\udd3f',\n      'equipo de sonido conexion bluetooth': '\ud83d\udd0a',\n      'luces subacuaticas': '\ud83d\udca1',\n      'frente acolchonado': '\ud83d\udee5\ufe0f',\n      'fruta fresca de bienvenida': '\ud83c\udf49',\n      'gastos de peaje \/ impuestos de muelle': '\ud83e\uddfe',\n      'acceso a todas las playas \/ brazaletes': '\ud83c\udfdd\ufe0f',\n      'campamento para playa': '\u26f1\ufe0f',\n      'guacamole de bienvenida': '\ud83e\udd51',\n      'gps': '\ud83e\udded',\n      'guia de turismo': '\ud83e\uddd1\u200d\ud83d\udcbc',\n      'hielera': '\ud83e\uddca',\n      'hielo': '\ud83e\uddca',\n      'internet': '\ud83d\udcf6',\n      'jetski \/ moto acuatica': '\ud83c\udfcd\ufe0f',\n      'juguetes inflables': '\ud83d\udedf',\n      'kayacs dobles': '\ud83d\udef6',\n      'kayac individual': '\ud83d\udef6',\n      'tabla de paddle board': '\ud83c\udfc4',\n      'kit de primeros auxilios': '\u26d1\ufe0f',\n      'lancha auxiliar \/ dingui': '\ud83d\udea4',\n      'margaritas \/ bebidas durante el viaje': '\ud83c\udf79',\n      'capitan y marinero certificados': '\ud83d\udc68\u200d\u2708\ufe0f',\n      'mesa de comedor': '\ud83c\udf7d\ufe0f',\n      'parrilla': '\ud83d\udd25',\n      'refrescos': '\ud83e\udd64',\n      'refrigerador': '\ud83e\uddca',\n      'sala con tv': '\ud83d\udcfa',\n      'seguro de viaje': '\ud83d\udee1\ufe0f',\n      'suite nupcial': '\ud83d\udc8d',\n      'terraza \/ flybridge': '\u2600\ufe0f',\n      'toallas': '\ud83e\uddfa',\n      'tripulantes multilingues': '\ud83d\udde3\ufe0f'\n    };\n\n    function amenityEmoji(item) {\n      var normalized = normalizeAmenityKey(item);\n      if (AMENITY_EMOJI_MAP[normalized]) return AMENITY_EMOJI_MAP[normalized];\n      return '\u2705';\n    }\n\n    function parseAmenities(raw) {\n      if (!nonEmpty(raw)) return [];\n      if (Array.isArray(raw)) return raw.map(function (x) { return String(x).trim(); }).filter(Boolean);\n      var s = String(raw).trim().replace(\/&quot;\/g, '\"').replace(\/&#34;\/g, '\"').replace(\/\\\\\"\/g, '\"');\n      for (var i = 0; i < 2; i++) {\n        if ((s[0] === '[' && s[s.length - 1] === ']') || (s[0] === '{' && s[s.length - 1] === '}') || (s[0] === '\"' && s[s.length - 1] === '\"')) {\n          try {\n            var j = JSON.parse(s);\n            if (Array.isArray(j)) return j.map(function (x) { return String(x).trim(); }).filter(Boolean);\n            if (j && Array.isArray(j.values)) return j.values.map(function (x) { return String(x).trim(); }).filter(Boolean);\n            if (typeof j === 'string') { s = j.trim(); continue; }\n          } catch (e) { }\n        }\n        break;\n      }\n      if ((s[0] === '\"' && s[s.length - 1] === '\"') || (s[0] === \"'\" && s[s.length - 1] === \"'\")) s = s.slice(1, -1);\n      return s.split(\/\\n|,|;|\\|\/).map(function (x) { return String(x).replace(\/^\\s*[-\u2022]\\s*\/, '').trim(); }).filter(Boolean);\n    }\n\n    function renderAmenities(raw) {\n      var box = $('yzzr-amenities-list');\n      if (!box) return;\n      var items = parseAmenities(raw);\n      if (!items.length) {\n        box.innerHTML = '<p class=\"yzzr-note\">' + tt('No hay amenidades registradas en esta reservaci\u00f3n.', 'No amenities were registered for this reservation.') + '<\/p>';\n        return;\n      }\n      box.innerHTML = items.map(function (it) {\n        return '<div class=\"yzzr-amen-item\"><span class=\"yzzr-amen-emo\">' + amenityEmoji(it) + '<\/span><div class=\"yzzr-amen-txt\">' + it + '<\/div><\/div>';\n      }).join('');\n    }\n\n    function normalizeUrl(value) {\n      if (!nonEmpty(value)) return '';\n      var txt = String(value).trim();\n      if (\/^www\\.\/i.test(txt)) txt = 'https:\/\/' + txt;\n      try { return new URL(txt).toString(); } catch (e) { return ''; }\n    }\n\n    function parseMaybeJson(value) {\n      if (!nonEmpty(value) || typeof value !== 'string') return null;\n      var txt = String(value).trim();\n      if (!txt) return null;\n      var first = txt.charAt(0);\n      if (first !== '{' && first !== '[' && first !== '\"') return null;\n      try { return JSON.parse(txt); } catch (e) { return null; }\n    }\n\n    function extractFirstUrl(value, depth) {\n      depth = depth || 0;\n      if (depth > 6 || value == null) return '';\n      if (typeof value === 'string') {\n        var txt = value.trim();\n        var direct = normalizeUrl(txt);\n        if (direct) return direct;\n        var parsed = parseMaybeJson(txt);\n        if (parsed != null) return extractFirstUrl(parsed, depth + 1);\n        return '';\n      }\n      if (Array.isArray(value)) {\n        for (var i = 0; i < value.length; i++) {\n          var hit = extractFirstUrl(value[i], depth + 1);\n          if (hit) return hit;\n        }\n        return '';\n      }\n      if (typeof value === 'object') {\n        for (var k in value) {\n          if (!Object.prototype.hasOwnProperty.call(value, k)) continue;\n          if (\/(url|link|src|download)\/i.test(String(k))) {\n            var hitDirect = extractFirstUrl(value[k], depth + 1);\n            if (hitDirect) return hitDirect;\n          }\n        }\n        for (var k2 in value) {\n          if (!Object.prototype.hasOwnProperty.call(value, k2)) continue;\n          var hitAny = extractFirstUrl(value[k2], depth + 1);\n          if (hitAny) return hitAny;\n        }\n      }\n      return '';\n    }\n\n    function cleanDisplayText(value) {\n      if (!nonEmpty(value)) return '';\n      if (typeof value !== 'string') value = String(value);\n      var txt = value.trim();\n      if (!txt) return '';\n      var parsed = parseMaybeJson(txt);\n      if (parsed != null) {\n        if (Array.isArray(parsed)) {\n          return parsed.length ? cleanDisplayText(parsed[0]) : '';\n        }\n        if (typeof parsed === 'object') {\n          var preferred = ['name', 'label', 'title', 'value', 'text'];\n          for (var i = 0; i < preferred.length; i++) {\n            var key = preferred[i];\n            if (Object.prototype.hasOwnProperty.call(parsed, key)) {\n              var got = cleanDisplayText(parsed[key]);\n              if (got) return got;\n            }\n          }\n        }\n        return '';\n      }\n      if (\/^https?:\\\/\\\/\/i.test(txt)) return '';\n      if (txt.length > 180 && \/(documentid|mimetype|encoding|uuid|fieldname|meta)\/i.test(txt)) return '';\n      return txt;\n    }\n\n    function parseAmount(value) {\n      if (typeof value === 'number') return isFinite(value) ? value : NaN;\n      if (!nonEmpty(value)) return NaN;\n      var cleaned = String(value).replace(\/[^0-9,.\\-]\/g, '').replace(\/\\s+\/g, '');\n      if (cleaned === '' || cleaned === '-' || cleaned === '.' || cleaned === ',') return NaN;\n      var hasDot = cleaned.indexOf('.') > -1;\n      var hasComma = cleaned.indexOf(',') > -1;\n      if (hasDot && hasComma) {\n        if (cleaned.lastIndexOf(',') > cleaned.lastIndexOf('.')) cleaned = cleaned.replace(\/\\.\/g, '').replace(',', '.');\n        else cleaned = cleaned.replace(\/,\/g, '');\n      } else if (hasComma) {\n        if (\/,\\d{1,2}$\/.test(cleaned)) cleaned = cleaned.replace(',', '.');\n        else cleaned = cleaned.replace(\/,\/g, '');\n      }\n      var n = Number(cleaned);\n      return isFinite(n) ? n : NaN;\n    }\n\n    function mxn(value) {\n      return new Intl.NumberFormat('es-MX', { style: 'currency', currency: 'MXN', maximumFractionDigits: 0 }).format(value);\n    }\n\n    function setLoadStatus(text, cls) {\n      var el = $('yzzr-load-status');\n      if (!el) return;\n      el.textContent = text;\n      el.className = 'yzzr-status' + (cls ? (' ' + cls) : '');\n    }\n\n    function normalizeStatus(rawStatus) {\n      if (!nonEmpty(rawStatus)) return { label: tt('Pendiente de confirmaci\u00f3n', 'Pending confirmation'), className: 'is-pending' };\n      var label = String(rawStatus).trim();\n      var norm = label.toLowerCase().normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '');\n      if (norm === 'open' || norm === 'won' || norm === 'lost' || norm === 'abandoned') {\n        return { label: tt('Pendiente de confirmaci\u00f3n', 'Pending confirmation'), className: 'is-pending' };\n      }\n      if (norm.indexOf('cancel') > -1 || norm.indexOf('rechaz') > -1) return { label: label, className: 'is-cancelled' };\n      if (norm.indexOf('confirm') > -1 || norm.indexOf('reservad') > -1 || norm.indexOf('pagad') > -1) return { label: label, className: 'is-confirmed' };\n      if (norm.indexOf('pend') > -1 || norm.indexOf('proceso') > -1) return { label: label, className: 'is-pending' };\n      return { label: label, className: 'is-other' };\n    }\n\n    function looksLikePaymentMethod(value) {\n      if (!nonEmpty(value)) return false;\n      var text = String(value).toLowerCase().normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '');\n      return \/(transfer|tarjet|card|credito|debito|efectivo|cash|spei|pago)\/.test(text);\n    }\n\n    function looksLikeReservationId(value) {\n      if (!nonEmpty(value)) return false;\n      var text = String(value).trim();\n      if (\/^(rsv|res|bk|booking)[-_ ]?\\d+\/i.test(text)) return true;\n      if (\/^[A-Za-z]{2,}[-_ ]?\\d{2,}$\/i.test(text)) return true;\n      if (\/^\\d{4,}$\/.test(text)) return true;\n      return false;\n    }\n\n    function paintReservationStatus(value) {\n      var st = normalizeStatus(value);\n      var pill = $('yzzr-res-status');\n      if (!pill) return;\n      pill.textContent = st.label;\n      pill.className = 'yzzr-pill ' + st.className;\n    }\n\n    function parseDateTime(dateStr, timeStr) {\n      if (!nonEmpty(dateStr)) return null;\n      var d = String(dateStr).trim();\n      var t = nonEmpty(timeStr) ? String(timeStr).trim() : '00:00';\n      if (d.indexOf('T') > -1) {\n        var asIso = new Date(d);\n        if (!isNaN(asIso.getTime())) return asIso;\n      }\n      var iso = d.match(\/^(\\d{4})-(\\d{1,2})-(\\d{1,2})$\/);\n      var lat = d.match(\/^(\\d{1,2})[\\\/\\-](\\d{1,2})[\\\/\\-](\\d{2,4})$\/);\n      var tm = t.match(\/^(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)?$\/i);\n      var hh = tm ? Number(tm[1]) : 0;\n      var mm = tm ? Number(tm[2] || 0) : 0;\n      var ap = tm && tm[3] ? tm[3].toLowerCase() : '';\n      if (ap === 'pm' && hh < 12) hh += 12;\n      if (ap === 'am' && hh === 12) hh = 0;\n      if (iso) return new Date(Number(iso[1]), Number(iso[2]) - 1, Number(iso[3]), hh, mm, 0);\n      if (lat) {\n        var year = lat[3].length === 2 ? Number('20' + lat[3]) : Number(lat[3]);\n        return new Date(year, Number(lat[2]) - 1, Number(lat[1]), hh, mm, 0);\n      }\n      return null;\n    }\n\n    function setCountdownNumbers(d, h, m, s) {\n      $('yzzr-d').textContent = String(d).padStart(2, '0');\n      $('yzzr-h').textContent = String(h).padStart(2, '0');\n      $('yzzr-m').textContent = String(m).padStart(2, '0');\n      $('yzzr-s').textContent = String(s).padStart(2, '0');\n    }\n\n    function stopCountdown() {\n      if (state.countdownId) {\n        clearInterval(state.countdownId);\n        state.countdownId = null;\n      }\n    }\n\n    function startCountdown(target) {\n      stopCountdown();\n      var note = $('yzzr-count-note');\n      var tick = function () {\n        var diff = target.getTime() - Date.now();\n        if (diff <= 0) {\n          setCountdownNumbers(0, 0, 0, 0);\n          if (note) note.textContent = tt('Tu salida es hoy o ya comenz\u00f3.', 'Your departure is today or has already started.');\n          setLoadStatus(tt('Reserva lista', 'Reservation ready'), 'is-ok');\n          return;\n        }\n        var days = Math.floor(diff \/ 86400000); diff -= days * 86400000;\n        var hours = Math.floor(diff \/ 3600000); diff -= hours * 3600000;\n        var mins = Math.floor(diff \/ 60000); diff -= mins * 60000;\n        var secs = Math.floor(diff \/ 1000);\n        setCountdownNumbers(days, hours, mins, secs);\n        if (note) note.textContent = IS_EN\n          ? ('Your trip is in ' + days + ' day(s).')\n          : ('Faltan ' + days + ' d\u00eda(s) para tu viaje.');\n      };\n      tick();\n      state.countdownId = setInterval(tick, 1000);\n    }\n\n    function langPrefix() {\n      var p = (location.pathname || '').toLowerCase();\n      if (\/^\\\/es(\\\/|$)\/.test(p)) return '\/es';\n      if (\/^\\\/en(\\\/|$)\/.test(p)) return '\/en';\n      return '';\n    }\n\n    \/\/ La p\u00e1gina \u00abMi Reserva\u00bb consume el endpoint \/received (recibo de dep\u00f3sito),\n    \/\/ NO el endpoint \/quote (cotizaciones).\n    var apiCandidates = unique([\n      location.origin + langPrefix() + '\/wp-json\/yzz\/v1\/contact-live',\n      location.origin + '\/wp-json\/yzz\/v1\/contact-live',\n      location.origin + '\/es\/wp-json\/yzz\/v1\/contact-live',\n      location.origin + '\/en\/wp-json\/yzz\/v1\/contact-live'\n    ]);\n\n    async function fetchOne(url) {\n      var ctrl = new AbortController();\n      var timer = setTimeout(function () { ctrl.abort(); }, 9000);\n      try {\n        var response = await fetch(url, { method: 'GET', cache: 'no-store', credentials: 'omit', signal: ctrl.signal });\n        var body = await response.json().catch(function () { return {}; });\n        if (response.ok && body && !body.error) return { ok: true, data: body };\n        return { ok: false, error: (body && body.error) ? String(body.error) : ('http_' + response.status) };\n      } catch (e) {\n        return { ok: false, error: 'network' };\n      } finally {\n        clearTimeout(timer);\n      }\n    }\n\n    async function fetchReservation() {\n      var notFound = false;\n      var lastError = 'network';\n      for (var i = 0; i < apiCandidates.length; i++) {\n        var qs = 'qt=' + encodeURIComponent(state.qt) + '&_ts=' + Date.now();\n        if (debugMode) { qs += '&debug=1'; }\n        var result = await fetchOne(apiCandidates[i] + '?' + qs);\n        if (result.ok) {\n          if (debugMode && result.data && result.data._meta && result.data._meta.ghl_debug) {\n            try { console.log('YZZ GHL DEBUG', result.data._meta.ghl_debug); } catch (e) { }\n          }\n          return result.data;\n        }\n        lastError = result.error || lastError;\n        if (result.error === 'not_found') notFound = true;\n        if (result.error === 'missing_qt') throw new Error('missing_qt');\n      }\n      if (notFound) throw new Error('not_found');\n      throw new Error(lastError || 'network');\n    }\n\n    function setWa(message) {\n      var btn = $('yzzr-wa-btn');\n      if (!btn) return;\n      btn.href = 'https:\/\/api.whatsapp.com\/send?phone=' + WA_NUMBER + '&text=' + encodeURIComponent(message || tt('Hola, necesito ayuda con mi reserva.', 'Hi, I need help with my reservation.'));\n    }\n\n    function syncReservationBodyModalState() {\n      var anyOpen = document.querySelector('.yzzr-modal.open');\n      document.body.style.overflow = anyOpen ? 'hidden' : '';\n    }\n\n    function openModal(id) {\n      mountReservationModalToBody(id);\n      var modal = $(id);\n      if (!modal) return;\n      modal.classList.add('open');\n      modal.setAttribute('aria-hidden', 'false');\n      syncReservationBodyModalState();\n    }\n\n    function closeModal(id) {\n      var modal = $(id);\n      if (!modal) return;\n      modal.classList.remove('open');\n      modal.setAttribute('aria-hidden', 'true');\n      syncReservationBodyModalState();\n    }\n\n    function ensureEmbedScript() {\n      if (document.getElementById('yzz-ghl-survey-script')) return;\n      var script = document.createElement('script');\n      script.id = 'yzz-ghl-survey-script';\n      script.src = 'https:\/\/link.yatezzitos.com\/js\/form_embed.js';\n      document.body.appendChild(script);\n    }\n\n    function firstName(full) {\n      if (!nonEmpty(full)) return '';\n      return String(full).trim().split(\/\\s+\/)[0] || '';\n    }\n\n    function assignAliasesToUrl(url, value, aliases) {\n      if (!nonEmpty(value)) return;\n      for (var i = 0; i < aliases.length; i++) {\n        url.searchParams.set(aliases[i], String(value));\n      }\n    }\n\n    function buildReceiptUrl() {\n      var d = state.data || {};\n      var url = new URL(RECEIPT_BASE);\n      var fullName = nonEmpty(d.name) ? String(d.name).trim() : [d.first_name, d.last_name].filter(nonEmpty).join(' ');\n      var first = nonEmpty(d.first_name) ? String(d.first_name).trim() : firstName(fullName);\n      var last = nonEmpty(d.last_name) ? String(d.last_name).trim() : (nonEmpty(fullName) ? String(fullName).split(\/\\s+\/).slice(1).join(' ') : '');\n      var email = nonEmpty(d.email) ? String(d.email).trim() : '';\n      var phone = nonEmpty(d.phone) ? String(d.phone).trim() : '';\n\n      if (nonEmpty(state.qt)) {\n        url.searchParams.set('qt', state.qt);\n        url.searchParams.set('token', state.qt);\n        url.searchParams.set('quote_token', state.qt);\n      }\n      if (nonEmpty(d.reservation_id)) {\n        url.searchParams.set('reservation_id', d.reservation_id);\n        url.searchParams.set('reservacion_id', d.reservation_id);\n      }\n\n      assignAliasesToUrl(url, fullName, ['name', 'nombre', 'full_name', 'fullName']);\n      assignAliasesToUrl(url, first, ['first_name', 'firstname', 'firstName', 'contact.first_name', 'contact[first_name]']);\n      assignAliasesToUrl(url, last, ['last_name', 'lastname', 'lastName', 'contact.last_name', 'contact[last_name]']);\n      assignAliasesToUrl(url, email, ['email', 'correo', 'contact_email', 'contact.email', 'contact[email]']);\n      assignAliasesToUrl(url, phone, ['phone', 'telefono', 'contact_phone', 'mobile']);\n      assignAliasesToUrl(url, d.contact_id, ['contact_id', 'contactId', 'cid']);\n      return url.toString();\n    }\n\n    function buildBalanceTransferUrl() {\n      var url = new URL(TRANSFER_URL);\n      url.searchParams.set('qt', state.qt);\n      if (isFinite(state.balanceAmount)) {\n        url.searchParams.set('a', String(Math.round(state.balanceAmount)));\n        url.searchParams.set('amount', String(Math.round(state.balanceAmount)));\n      }\n      if (state.data && nonEmpty(state.data.reservation_id)) {\n        url.searchParams.set('reservation_id', state.data.reservation_id);\n      }\n      url.searchParams.set('payment_type', 'balance');\n      return url.toString();\n    }\n\n    function buildBalanceSurveyUrl() {\n      var d = state.data || {};\n      var url = new URL(SURVEY_BASE);\n      var fullName = nonEmpty(d.name) ? String(d.name).trim() : [d.first_name, d.last_name].filter(nonEmpty).join(' ');\n      var first = nonEmpty(d.first_name) ? String(d.first_name).trim() : firstName(fullName);\n      var last = nonEmpty(d.last_name) ? String(d.last_name).trim() : (nonEmpty(fullName) ? String(fullName).split(\/\\s+\/).slice(1).join(' ') : '');\n      var email = nonEmpty(d.email) ? String(d.email).trim() : '';\n      var phone = nonEmpty(d.phone) ? String(d.phone).trim() : '';\n      var amount = isFinite(state.balanceAmount) ? String(Math.round(state.balanceAmount)) : '';\n\n      url.searchParams.set('qt', state.qt);\n      url.searchParams.set('payment_context', 'balance');\n      if (nonEmpty(d.contact_id)) url.searchParams.set('contact_id', d.contact_id);\n      if (nonEmpty(d.reservation_id)) {\n        url.searchParams.set('reservation_id', d.reservation_id);\n        url.searchParams.set('reservacion_id', d.reservation_id);\n      }\n\n      assignAliasesToUrl(url, fullName, ['name', 'nombre', 'full_name']);\n      assignAliasesToUrl(url, first, ['first_name', 'contact.first_name', 'contact[first_name]']);\n      assignAliasesToUrl(url, last, ['last_name', 'contact.last_name', 'contact[last_name]']);\n      assignAliasesToUrl(url, email, ['email', 'correo', 'contact_email', 'contact.email', 'contact[email]']);\n      assignAliasesToUrl(url, phone, ['phone', 'telefono', 'contact_phone']);\n      assignAliasesToUrl(url, amount, ['amount', 'balance_due', 'remaining_balance', 'payment_amount']);\n      return url.toString();\n    }\n\n    function openReceiptModal() {\n      var url = buildReceiptUrl();\n      $('yzzr-receipt-frame').src = url;\n      $('yzzr-receipt-fallback').href = url;\n      openModal('yzzr-receipt-modal');\n    }\n\n    function resetBalanceModal() {\n      var choices = $('yzzr-balance-choices');\n      var wrap = $('yzzr-balance-survey-wrap');\n      if (choices) choices.style.display = 'grid';\n      if (wrap) wrap.classList.remove('active');\n      if ($('yzzr-balance-survey-frame')) $('yzzr-balance-survey-frame').src = '';\n    }\n\n    function openBalanceModal() {\n      resetBalanceModal();\n      $('yzzr-balance-amount').textContent = isFinite(state.balanceAmount)\n        ? (tt('Saldo pendiente: ', 'Remaining balance: ') + mxn(state.balanceAmount))\n        : tt('Selecciona el m\u00e9todo para pagar el balance pendiente.', 'Select a payment method for your pending balance.');\n      openModal('yzzr-balance-modal');\n    }\n\n    function openBalanceCardSurvey() {\n      ensureEmbedScript();\n      var choices = $('yzzr-balance-choices');\n      var wrap = $('yzzr-balance-survey-wrap');\n      var frame = $('yzzr-balance-survey-frame');\n      if (choices) choices.style.display = 'none';\n      if (wrap) wrap.classList.add('active');\n      if (frame) frame.src = buildBalanceSurveyUrl();\n    }\n\n    function showError(title, message, waMessage) {\n      hide('yzzr-content');\n      hide('yzzr-img-wrap');\n      show('yzzr-error');\n      setText('yzzr-error-title', title);\n      setText('yzzr-error-msg', message);\n      setLoadStatus(tt('Reserva no disponible', 'Reservation unavailable'), 'is-error');\n      paintReservationStatus(tt('Pendiente de confirmaci\u00f3n', 'Pending confirmation'));\n      setWa(waMessage || (IS_EN ? ('Hi, I need help with my reservation. Token: ' + (state.qt || 'no_token')) : ('Hola, necesito ayuda con mi reserva. Token: ' + (state.qt || 'sin_token'))));\n    }\n\n    function render(raw) {\n      hide('yzzr-error');\n      show('yzzr-content');\n\n      var data = {\n        name: pick(raw, ['name', 'full_name', 'contact_name']),\n        first_name: pick(raw, ['first_name', 'firstName', 'firstname', 'nombre', 'contact_first_name', 'contactfirstname', 'contactfirst_name']),\n        last_name: pick(raw, ['last_name', 'lastName', 'lastname', 'apellido', 'apellidos', 'contact_last_name', 'contactlastname', 'contactlast_name']),\n        email: pick(raw, ['email', 'correo', 'contact_email', 'contactemail']),\n        phone: pick(raw, ['phone', 'telefono', 'contact_phone', 'mobile', 'whatsapp', 'contactphone']),\n        contact_id: pick(raw, ['contact_id', 'contactid', 'cid', 'id']),\n        yacht: cleanDisplayText(pick(raw, ['y', 'yacht_name', 'yacht', 'embarcacion', 'embarcacion_nombre', 'boat_name'])),\n        destination: pick(raw, ['d', 'destinos', 'destino']),\n        exp: pick(raw, ['exp', 'experiencia', 'experiencia_reservada', 'tipo_de_experiencia_reservada', 'tipo_experiencia']),\n        date: pick(raw, ['f', 'fecha_de_viaje', 'travel_date']),\n        hs: pick(raw, ['hs', 'departure_time', 'hora_de_salida']),\n        hr: pick(raw, ['hr', 'return_time', 'hora_de_regreso']),\n        pax: pick(raw, ['pax', 'number_of_passengers', 'passengers']),\n        marina: pick(raw, ['mar', 'marina_name', 'nombre_de_la_marina']),\n        meeting_point: pick(raw, ['meeting_point', 'ubicacion_de_abordaje', 'maps', 'google_maps_link']),\n        status: pick(raw, ['reservation_status', 'status', 'estado_de_la_reserva', 'estadodelareserva', 'status_booking', 'booking_status', 'status_reserva']),\n        deposit_paid: pick(raw, ['deposit_paid', 'deposit_amount', 'deposito_entregado', 'anticipo_pagado', 'anticipo', 'deposito_pagado', 'abono', 'a', 'contact_deposit_amount', 'contactdepositamount']),\n        remaining_balance: pick(raw, ['remaining_balance', 'balance_due', 'saldo_pendiente', 'saldo', 'restante', 'saldo_restante', 'adeudo', 'adeudo_pendiente', 'amount_due', 'contact_balance_due', 'contactbalancedue']),\n        payment_method: pick(raw, ['payment_method', 'metodo_de_pago', 'metododepago', 'metodo_pago', 'metodopago', 'forma_de_pago', 'forma_pago']),\n        reservation_id: pick(raw, ['reservation_id', 'reservacion_id', 'reserva_id', 'id_reserva', 'booking_id', 'id_booking', 'idbooking', 'id_booking_reserva']),\n        total: pick(raw, ['total', 'total_cost', 'costo_total', 'precio_total', 'monto_total']),\n        img: pick(raw, ['img', 'image', 'imagen_principal_del_yate_upload']),\n        amenities_raw: pickAmenitiesSource(raw)\n      };\n\n      if (!nonEmpty(data.yacht)) {\n        data.yacht = cleanDisplayText(pickByPattern(raw, \/(yacht.*name|nombre.*yate|embarcacion|boat.*name)\/i));\n      }\n\n      if (nonEmpty(data.reservation_id) && !nonEmpty(data.payment_method) && looksLikePaymentMethod(data.reservation_id)) {\n        data.payment_method = data.reservation_id;\n        data.reservation_id = '';\n      }\n      if (nonEmpty(data.payment_method) && !nonEmpty(data.reservation_id) && looksLikeReservationId(data.payment_method) && !looksLikePaymentMethod(data.payment_method)) {\n        data.reservation_id = data.payment_method;\n        data.payment_method = '';\n      }\n      if (nonEmpty(data.payment_method) && nonEmpty(data.reservation_id)) {\n        var payLooksMethod = looksLikePaymentMethod(data.payment_method);\n        var payLooksId = looksLikeReservationId(data.payment_method);\n        var resLooksMethod = looksLikePaymentMethod(data.reservation_id);\n        var resLooksId = looksLikeReservationId(data.reservation_id);\n        if (!payLooksMethod && payLooksId && resLooksMethod && !resLooksId) {\n          var tmpValue = data.payment_method;\n          data.payment_method = data.reservation_id;\n          data.reservation_id = tmpValue;\n        }\n      }\n\n      var dep = parseAmount(data.deposit_paid);\n      var bal = parseAmount(data.remaining_balance);\n      var total = parseAmount(data.total);\n      if (!isFinite(dep) && isFinite(total) && isFinite(bal)) dep = total - bal;\n      if (!isFinite(bal) && isFinite(total) && isFinite(dep)) bal = total - dep;\n      if (isFinite(dep) && isFinite(bal)) {\n        var expectedTotal = dep + bal;\n        if (!isFinite(total) || Math.abs(total - expectedTotal) > 1) {\n          total = expectedTotal;\n        }\n      }\n\n      if (isFinite(dep)) data.deposit_paid = String(Math.round(dep));\n      if (isFinite(bal)) data.remaining_balance = String(Math.round(bal));\n      if (isFinite(total)) data.total = String(Math.round(total));\n      state.balanceAmount = isFinite(bal) ? Math.max(0, bal) : NaN;\n      state.data = data;\n\n      $('yzzr-hello').textContent = nonEmpty(data.name)\n        ? (IS_EN ? ('Hi ' + data.name + ', your reservation is ready.') : ('Hola ' + data.name + ', tu reserva est\u00e1 lista.'))\n        : tt('Aqu\u00ed est\u00e1 la informaci\u00f3n de tu reserva.', 'Here is your reservation information.');\n      setText('yzzr-name', data.name);\n      setText('yzzr-yacht', data.yacht);\n      setText('yzzr-exp', data.exp);\n      setText('yzzr-dest', data.destination);\n      setText('yzzr-date', data.date);\n      setText('yzzr-time', [data.hs, data.hr].filter(nonEmpty).join(' - '));\n      setText('yzzr-pax', data.pax);\n      setText('yzzr-marina', data.marina);\n      setText('yzzr-res-id', data.reservation_id);\n      setText('yzzr-payment', data.payment_method);\n      setText('yzzr-deposit', isFinite(dep) ? mxn(dep) : data.deposit_paid);\n      setText('yzzr-balance', isFinite(bal) ? mxn(bal) : data.remaining_balance);\n      setText('yzzr-total', isFinite(total) ? mxn(total) : data.total);\n      paintReservationStatus(data.status);\n      setLoadStatus(tt('Reserva cargada', 'Reservation loaded'), 'is-ok');\n      renderAmenities(data.amenities_raw);\n\n      var mapUrl = normalizeUrl(data.meeting_point);\n      if (mapUrl) {\n        $('yzzr-meeting-link').href = mapUrl;\n        $('yzzr-meeting-link').classList.remove('yzzr-disabled');\n        $('yzzr-meeting-link').textContent = tt('Ver ubicaci\u00f3n', 'View location');\n        $('yzzr-map-btn').href = mapUrl;\n        show('yzzr-map-btn');\n      } else {\n        $('yzzr-meeting-link').removeAttribute('href');\n        $('yzzr-meeting-link').classList.add('yzzr-disabled');\n        $('yzzr-meeting-link').textContent = DASH;\n        hide('yzzr-map-btn');\n      }\n\n      var normalizedImg = extractFirstUrl(data.img);\n      if (!normalizedImg) {\n        normalizedImg = extractFirstUrl(pick(raw, ['img', 'image', 'imagen_principal_del_yate_upload']));\n      }\n      if (nonEmpty(normalizedImg)) {\n        $('yzzr-img').src = normalizedImg;\n        show('yzzr-img-wrap');\n      } else {\n        hide('yzzr-img-wrap');\n      }\n\n      if (isFinite(state.balanceAmount) && state.balanceAmount > 0) {\n        show('yzzr-balance-btn');\n        $('yzzr-balance-btn').textContent = (IS_EN ? '\ud83d\udcb3 Pay balance ' : '\ud83d\udcb3 Pagar balance ') + mxn(state.balanceAmount);\n      } else {\n        hide('yzzr-balance-btn');\n      }\n\n      var dt = parseDateTime(data.date, data.hs);\n      if (dt && !isNaN(dt.getTime())) startCountdown(dt);\n      else {\n        stopCountdown();\n        setCountdownNumbers(0, 0, 0, 0);\n        $('yzzr-count-note').textContent = tt('No se pudo calcular el contador por formato de fecha\/hora.', 'Could not calculate countdown due to date\/time format.');\n        setLoadStatus(tt('Reserva cargada con advertencias', 'Reservation loaded with warnings'), 'is-warn');\n      }\n\n      var waMsg = (IS_EN ? 'Hi, I need help with my reservation.' : 'Hola, necesito ayuda con mi reserva.') +\n        (IS_EN ? '\\nToken: ' : '\\nToken: ') + state.qt +\n        (nonEmpty(data.reservation_id) ? (IS_EN ? ('\\nReservation: ' + data.reservation_id) : ('\\nReserva: ' + data.reservation_id)) : '') +\n        (nonEmpty(data.status) ? (IS_EN ? ('\\nStatus: ' + data.status) : ('\\nEstado: ' + data.status)) : '') +\n        (nonEmpty(data.date) ? (IS_EN ? ('\\nDate: ' + data.date + (nonEmpty(data.hs) ? (' ' + data.hs) : '')) : ('\\nFecha: ' + data.date + (nonEmpty(data.hs) ? (' ' + data.hs) : ''))) : '');\n      setWa(waMsg);\n    }\n\n    document.addEventListener('click', function (e) {\n      var closeTarget = e.target && e.target.getAttribute ? e.target.getAttribute('data-yzzr-close') : null;\n      if (closeTarget) {\n        if (closeTarget === 'yzzr-balance-modal') resetBalanceModal();\n        closeModal(closeTarget);\n        return;\n      }\n      if (e.target.closest('#yzzr-receipt-btn')) { e.preventDefault(); openReceiptModal(); return; }\n      if (e.target.closest('#yzzr-balance-btn')) { e.preventDefault(); openBalanceModal(); return; }\n      if (e.target.closest('#yzzr-balance-card-btn')) { e.preventDefault(); openBalanceCardSurvey(); return; }\n      if (e.target.closest('#yzzr-balance-transfer-btn')) { e.preventDefault(); window.location.href = buildBalanceTransferUrl(); return; }\n      if (e.target.closest('#yzzr-reco-btn')) { e.preventDefault(); openModal('yzzr-reco-modal'); return; }\n      if (e.target.closest('#yzzr-terms-btn')) { e.preventDefault(); openModal('yzzr-terms-modal'); return; }\n    });\n\n    document.addEventListener('keydown', function (e) {\n      if (e.key === 'Escape') {\n        closeModal('yzzr-receipt-modal');\n        closeModal('yzzr-balance-modal');\n        closeModal('yzzr-reco-modal');\n        closeModal('yzzr-terms-modal');\n        resetBalanceModal();\n      }\n    });\n\n    if (!nonEmpty(state.qt)) {\n      showError(\n        tt('Token inv\u00e1lido o ausente', 'Invalid or missing token'),\n        tt('Este enlace no contiene el token de reserva (qt). Solicita un enlace nuevo a tu asesor.', 'This link does not contain the reservation token (qt). Ask your advisor for a new link.'),\n        tt('Hola, mi enlace de reserva no trae token (qt). \u00bfMe apoyas con uno nuevo?', 'Hi, my reservation link does not include a token (qt). Can you send me a new one?')\n      );\n      return;\n    }\n\n    setWa((IS_EN ? 'Hi, I need help with my reservation. Token: ' : 'Hola, necesito ayuda con mi reserva. Token: ') + state.qt);\n    setLoadStatus(tt('Consultando reserva...', 'Checking reservation...'), '');\n    fetchReservation().then(function (raw) {\n      render(raw);\n    }).catch(function (err) {\n      var reason = err && err.message ? String(err.message) : 'network';\n      if (reason === 'not_found') {\n        showError(\n          tt('Reserva no encontrada', 'Reservation not found'),\n          tt('No encontramos una reserva asociada a este enlace. Solicita un enlace actualizado a tu asesor.', 'No reservation was found for this link. Ask your advisor for an updated link.'),\n          (IS_EN ? 'Hi, I could not open my reservation. Token: ' : 'Hola, no pude abrir mi reserva. Token: ') + state.qt\n        );\n        return;\n      }\n      if (reason === 'missing_qt') {\n        showError(\n          tt('Token inv\u00e1lido', 'Invalid token'),\n          tt('El endpoint respondi\u00f3 que falta el token. Verifica que el enlace tenga ?qt=...', 'The endpoint indicates the token is missing. Verify the link includes ?qt=...'),\n          (IS_EN ? 'Hi, my reservation link seems invalid. Token: ' : 'Hola, mi enlace de reserva parece inv\u00e1lido. Token: ') + state.qt\n        );\n        return;\n      }\n      showError(\n        tt('No pudimos cargar tu reserva', 'We could not load your reservation'),\n        tt('Tuvimos un problema de conexi\u00f3n o de lectura. Intenta de nuevo en unos minutos.', 'We had a connection or data-read issue. Please try again in a few minutes.'),\n        (IS_EN ? 'Hi, I could not load my reservation due to a connection error. Token: ' : 'Hola, no pude cargar mi reserva por error de conexi\u00f3n. Token: ') + state.qt\n      );\n    });\n  })();\n<\/script>\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>Mi reserva Cargando informaci\u00f3n de tu reserva&#8230; Consultando&#8230; &#8212; D\u00edas &#8212; Horas &#8212; Min &#8212; Seg Reserva no disponible No pudimos cargar la reserva. Cliente \u2014 Embarcaci\u00f3n \u2014 Tipo de experiencia reservada \u2014 Destino \u2014 Fecha \u2014 Horario \u2014 Pasajeros \u2014 Marina \u2014 Ubicaci\u00f3n de abordaje \u2014 Estado de la reserva Pendiente de confirmaci\u00f3n Reservaci\u00f3n [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_yoast_wpseo_focuskw":"","_yoast_wpseo_title":"","_yoast_wpseo_metadesc":"","footnotes":""},"class_list":["post-56811","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.4 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Mi reserva - Yatezzitos<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/yatezzitos.com\/en\/mi-reserva\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mi reserva\" \/>\n<meta property=\"og:description\" content=\"Mi reserva Cargando informaci\u00f3n de tu reserva&#8230; Consultando&#8230; &#8212; D\u00edas &#8212; Horas &#8212; Min &#8212; Seg Reserva no disponible No pudimos cargar la reserva. Cliente \u2014 Embarcaci\u00f3n \u2014 Tipo de experiencia reservada \u2014 Destino \u2014 Fecha \u2014 Horario \u2014 Pasajeros \u2014 Marina \u2014 Ubicaci\u00f3n de abordaje \u2014 Estado de la reserva Pendiente de confirmaci\u00f3n Reservaci\u00f3n [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/yatezzitos.com\/en\/mi-reserva\/\" \/>\n<meta property=\"og:site_name\" content=\"Yatezzitos\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/es-la.facebook.com\/Yatezzitos\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-16T19:27:48+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@yatezzitos\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/yatezzitos.com\\\/mi-reserva\\\/\",\"url\":\"https:\\\/\\\/yatezzitos.com\\\/mi-reserva\\\/\",\"name\":\"Mi reserva - Yatezzitos\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/yatezzitos.com\\\/#website\"},\"datePublished\":\"2026-02-25T02:02:26+00:00\",\"dateModified\":\"2026-04-16T19:27:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/yatezzitos.com\\\/mi-reserva\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/yatezzitos.com\\\/mi-reserva\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/yatezzitos.com\\\/mi-reserva\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\\\/\\\/yatezzitos.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mi reserva\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/yatezzitos.com\\\/#website\",\"url\":\"https:\\\/\\\/yatezzitos.com\\\/\",\"name\":\"Yatezzitos M\u00e9xico\",\"description\":\"Renta de Yates en M\u00e9xico\",\"alternateName\":\"Yatezzitos\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/yatezzitos.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Mi reserva - Yatezzitos","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/yatezzitos.com\/en\/mi-reserva\/","og_locale":"en_US","og_type":"article","og_title":"Mi reserva","og_description":"Mi reserva Cargando informaci\u00f3n de tu reserva&#8230; Consultando&#8230; &#8212; D\u00edas &#8212; Horas &#8212; Min &#8212; Seg Reserva no disponible No pudimos cargar la reserva. Cliente \u2014 Embarcaci\u00f3n \u2014 Tipo de experiencia reservada \u2014 Destino \u2014 Fecha \u2014 Horario \u2014 Pasajeros \u2014 Marina \u2014 Ubicaci\u00f3n de abordaje \u2014 Estado de la reserva Pendiente de confirmaci\u00f3n Reservaci\u00f3n [&hellip;]","og_url":"https:\/\/yatezzitos.com\/en\/mi-reserva\/","og_site_name":"Yatezzitos","article_publisher":"https:\/\/es-la.facebook.com\/Yatezzitos\/","article_modified_time":"2026-04-16T19:27:48+00:00","twitter_card":"summary_large_image","twitter_site":"@yatezzitos","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/yatezzitos.com\/mi-reserva\/","url":"https:\/\/yatezzitos.com\/mi-reserva\/","name":"Mi reserva - Yatezzitos","isPartOf":{"@id":"https:\/\/yatezzitos.com\/#website"},"datePublished":"2026-02-25T02:02:26+00:00","dateModified":"2026-04-16T19:27:48+00:00","breadcrumb":{"@id":"https:\/\/yatezzitos.com\/mi-reserva\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/yatezzitos.com\/mi-reserva\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/yatezzitos.com\/mi-reserva\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Inicio","item":"https:\/\/yatezzitos.com\/es\/"},{"@type":"ListItem","position":2,"name":"Mi reserva"}]},{"@type":"WebSite","@id":"https:\/\/yatezzitos.com\/#website","url":"https:\/\/yatezzitos.com\/","name":"Yatezzitos Mexico","description":"Yacht Charter in Mexico","alternateName":"Yatezzitos","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/yatezzitos.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/yatezzitos.com\/en\/wp-json\/wp\/v2\/pages\/56811","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yatezzitos.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/yatezzitos.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/yatezzitos.com\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/yatezzitos.com\/en\/wp-json\/wp\/v2\/comments?post=56811"}],"version-history":[{"count":12,"href":"https:\/\/yatezzitos.com\/en\/wp-json\/wp\/v2\/pages\/56811\/revisions"}],"predecessor-version":[{"id":58398,"href":"https:\/\/yatezzitos.com\/en\/wp-json\/wp\/v2\/pages\/56811\/revisions\/58398"}],"wp:attachment":[{"href":"https:\/\/yatezzitos.com\/en\/wp-json\/wp\/v2\/media?parent=56811"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}