{"id":229,"date":"2026-03-19T11:08:07","date_gmt":"2026-03-19T09:08:07","guid":{"rendered":"https:\/\/www.mrvin.com\/producto\/"},"modified":"2026-06-16T08:16:50","modified_gmt":"2026-06-16T06:16:50","slug":"product","status":"publish","type":"page","link":"https:\/\/www.mrvin.com\/es\/product\/","title":{"rendered":"Producto"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"229\" class=\"elementor elementor-229 elementor-189\" data-elementor-post-type=\"page\">\n\t\t\t\t<section class=\"elementor-element elementor-element-5aa03e3e e-con-full e-flex e-con e-parent\" data-id=\"5aa03e3e\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-62f1d3e7 elementor-widget elementor-widget-shortcode\" data-id=\"62f1d3e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n<style>\n#vp_bfrmE4 *, #vp_bfrmE4 *::before, #vp_bfrmE4 *::after { box-sizing:border-box; margin:0; padding:0; }\n\n#vp_bfrmE4 {\n  --navy:      #04243F;\n  --navy-80:   rgba(4,36,63,0.80);\n  --navy-60:   rgba(4,36,63,0.60);\n  --navy-40:   rgba(4,36,63,0.40);\n  --navy-12:   rgba(4,36,63,0.12);\n  --navy-06:   rgba(4,36,63,0.06);\n  --blue:      #2563EB;\n  --blue-dark: #1D4ED8;\n  --blue-10:   rgba(37,99,235,0.10);\n  --blue-06:   rgba(37,99,235,0.06);\n  --green:     #10B981;\n  --green-bg:  #ECFDF5;\n  --green-tx:  #065F46;\n  --orange:    #F59E0B;\n  --white:     #FFFFFF;\n  --surface:   #F8FAFC;\n  --border:    rgba(4,36,63,0.08);\n  --font:      'DM Sans', system-ui, sans-serif;\n  --serif:     'DM Serif Display', Georgia, serif;\n  --mono:      'DM Mono', monospace;\n  --radius:    16px;\n  --radius-sm: 10px;\n  --shadow-sm: 0 1px 3px rgba(4,36,63,0.06);\n  --shadow-md: 0 4px 20px rgba(4,36,63,0.08);\n  --shadow-lg: 0 12px 48px rgba(4,36,63,0.12);\n\n  font-family: var(--font); color: var(--navy); position: relative;\n  max-width: 1120px; margin: 0 auto; padding: 48px 24px 80px;\n  -webkit-font-smoothing: antialiased; line-height: 1.5;\n}\n#vp_bfrmE4::before {\n  content:''; position:absolute; top:-200px; left:50%; transform:translateX(-50%);\n  width:900px; height:900px; background:radial-gradient(circle,rgba(37,99,235,0.07) 0%,transparent 70%);\n  pointer-events:none; z-index:0;\n}\n#vp_bfrmE4 .vp-loading {\n  display:flex; flex-direction:column; align-items:center; padding-top:40px;\n  position:relative; z-index:1; animation:vp_bfrmE4_fadeIn 0.5s ease;\n}\n@keyframes vp_bfrmE4_fadeIn { from{opacity:0;transform:translateY(12px)} to{opacity:1;transform:translateY(0)} }\n#vp_bfrmE4 .vp-vin-pill {\n  display:inline-flex; align-items:center; gap:8px; background:var(--navy-06);\n  border:1px solid var(--border); border-radius:100px; padding:6px 16px 6px 12px;\n  font-family:var(--mono); font-size:13px; font-weight:500; color:var(--navy-60);\n  letter-spacing:0.04em; margin-bottom:32px;\n}\n#vp_bfrmE4 .vp-vin-pill svg { flex-shrink:0; opacity:0.4; }\n#vp_bfrmE4 .vp-vin-pill span { color:var(--navy); }\n#vp_bfrmE4 .vp-ring-wrap { position:relative; width:160px; height:160px; margin-bottom:28px; }\n#vp_bfrmE4 .vp-ring-svg { width:100%; height:100%; transform:rotate(-90deg); }\n#vp_bfrmE4 .vp-ring-bg { fill:none; stroke:var(--navy-06); stroke-width:6; }\n#vp_bfrmE4 .vp-ring-fill {\n  fill:none; stroke:var(--blue); stroke-width:6; stroke-linecap:round;\n  stroke-dasharray:408.4; stroke-dashoffset:408.4;\n  \/* stroke + filter are in the list so the blue->green at 100% cross-fades\n     instead of snapping (which reads as a rendering glitch). *\/\n  transition:stroke-dashoffset 0.6s cubic-bezier(0.4,0,0.2,1), stroke 0.45s ease, filter 0.45s ease;\n  filter:drop-shadow(0 0 8px rgba(37,99,235,0.3));\n}\n#vp_bfrmE4 .vp-ring-pct { position:absolute; inset:0; display:flex; flex-direction:column; align-items:center; justify-content:center; transition:opacity 0.16s ease, transform 0.3s cubic-bezier(0.4,0,0.2,1); }\n#vp_bfrmE4 .vp-ring-pct-num { font-family:var(--serif); font-size:42px; color:var(--navy); line-height:1; }\n#vp_bfrmE4 .vp-ring-pct-label { font-size:12px; color:var(--navy-40); font-weight:500; margin-top:2px; text-transform:uppercase; letter-spacing:0.08em; }\n\n\/* ---- completion: the ring resolves into a checkmark instead of vanishing ----\n * The check lives in its OWN svg: .vp-ring-svg carries transform:rotate(-90deg)\n * (that is what puts the ring's start at 12 o'clock), so a path added there\n * would render on its side. pathLength=100 normalises the draw to 100 -> 0. *\/\n#vp_bfrmE4 .vp-ring-check { position:absolute; inset:0; width:100%; height:100%; opacity:0; }\n#vp_bfrmE4 .vp-ring-check path {\n  fill:none; stroke:var(--green); stroke-width:7; stroke-linecap:round; stroke-linejoin:round;\n  stroke-dasharray:100; stroke-dashoffset:100;\n}\n#vp_bfrmE4 .vp-ring-halo {\n  position:absolute; inset:0; border-radius:50%;\n  border:2px solid var(--green); opacity:0; pointer-events:none;\n}\n#vp_bfrmE4 .vp-ring-wrap.is-done .vp-ring-fill { stroke:var(--green); filter:drop-shadow(0 0 11px rgba(16,185,129,0.34)); }\n#vp_bfrmE4 .vp-ring-wrap.is-done .vp-ring-pct { opacity:0; transform:scale(0.8); transition-delay:0.06s; }\n#vp_bfrmE4 .vp-ring-wrap.is-done .vp-ring-check { opacity:1; }\n#vp_bfrmE4 .vp-ring-wrap.is-done .vp-ring-check path { animation:vp_bfrmE4_draw 0.44s cubic-bezier(0.25,0.9,0.3,1) 0.2s forwards; }\n#vp_bfrmE4 .vp-ring-wrap.is-done { animation:vp_bfrmE4_punch 0.52s cubic-bezier(0.34,1.5,0.64,1) 0.18s; }\n#vp_bfrmE4 .vp-ring-wrap.is-done .vp-ring-halo { animation:vp_bfrmE4_halo 0.78s cubic-bezier(0.2,0.7,0.3,1) 0.22s; }\n@keyframes vp_bfrmE4_draw  { to { stroke-dashoffset:0 } }\n@keyframes vp_bfrmE4_punch { 0%{transform:scale(1)} 42%{transform:scale(1.055)} 100%{transform:scale(1)} }\n@keyframes vp_bfrmE4_halo  { 0%{opacity:0.5;transform:scale(1)} 100%{opacity:0;transform:scale(1.34)} }\n@media (prefers-reduced-motion:reduce) {\n  #vp_bfrmE4 .vp-ring-wrap.is-done,\n  #vp_bfrmE4 .vp-ring-wrap.is-done .vp-ring-halo { animation:none; }\n  #vp_bfrmE4 .vp-ring-wrap.is-done .vp-ring-check path { animation:none; stroke-dashoffset:0; }\n}\n\n#vp_bfrmE4 .vp-load-headline { font-family:var(--serif); font-size:clamp(24px,4vw,36px); color:var(--navy); text-align:center; margin-bottom:8px; line-height:1.15; transition:opacity 0.22s ease; }\n#vp_bfrmE4 .vp-load-step { font-size:14px; color:var(--navy-40); text-align:center; margin-bottom:48px; transition:opacity 0.2s ease; min-height:20px; }\n#vp_bfrmE4 .vp-content { display:grid; grid-template-columns:1fr 420px; gap:40px; align-items:stretch; margin-top:8px; position:relative; z-index:1; }\n#vp_bfrmE4 .vp-left { display:flex; flex-direction:column; }\n#vp_bfrmE4 .vp-includes {\n  background:var(--white); border:1px solid var(--border); border-radius:var(--radius);\n  padding:32px; box-shadow:var(--shadow-sm); flex:1; display:flex; flex-direction:column;\n}\n#vp_bfrmE4 .vp-includes .vp-features { flex:1; }\n#vp_bfrmE4 .vp-includes-head { display:flex; align-items:center; gap:12px; margin-bottom:24px; }\n#vp_bfrmE4 .vp-includes-icon {\n  width:40px; height:40px; border-radius:10px;\n  background:linear-gradient(135deg,var(--blue),var(--blue-dark));\n  display:flex; align-items:center; justify-content:center;\n  box-shadow:0 2px 8px rgba(37,99,235,0.25); flex-shrink:0;\n}\n#vp_bfrmE4 .vp-includes-title { font-family:var(--serif); font-size:22px; color:var(--navy); }\n#vp_bfrmE4 .vp-includes-sub { font-size:13px; color:var(--navy-40); font-weight:400; }\n#vp_bfrmE4 .vp-features { list-style:none; }\n#vp_bfrmE4 .vp-feature { display:flex; align-items:flex-start; gap:14px; padding:14px 0; border-bottom:1px solid var(--border); }\n#vp_bfrmE4 .vp-feature:last-child { border-bottom:none; }\n#vp_bfrmE4 .vp-feature-check {\n  width:28px; height:28px; border-radius:50%; background:var(--blue-06);\n  display:flex; align-items:center; justify-content:center; flex-shrink:0; margin-top:1px;\n  transition:background 0.3s ease, transform 0.3s ease;\n}\n#vp_bfrmE4 .vp-feature.is-checked .vp-feature-check { background:var(--green-bg); transform:scale(1.05); }\n#vp_bfrmE4 .vp-feature-check svg { width:14px; height:14px; }\n#vp_bfrmE4 .vp-feature-check .chk-p { color:var(--navy-12); }\n#vp_bfrmE4 .vp-feature.is-checked .chk-p { display:none; }\n#vp_bfrmE4 .vp-feature-check .chk-d { display:none; color:var(--green); }\n#vp_bfrmE4 .vp-feature.is-checked .chk-d { display:block; }\n#vp_bfrmE4 .vp-feature-name { font-size:15px; font-weight:600; color:var(--navy); line-height:1.3; }\n#vp_bfrmE4 .vp-feature-desc { font-size:13px; color:var(--navy-40); margin-top:2px; line-height:1.4; }\n#vp_bfrmE4 .vp-testimonials { margin-top:32px; position:relative; z-index:1; }\n#vp_bfrmE4 .vp-testimonials-label { font-size:12px; font-weight:600; color:var(--navy-40); text-transform:uppercase; letter-spacing:0.08em; margin-bottom:14px; }\n#vp_bfrmE4 .vp-testi-scroll { position:relative; overflow:hidden; }\n#vp_bfrmE4 .vp-testi-track { display:flex; gap:16px; width:max-content; animation:vp_bfrmE4_scroll 28s linear infinite; }\n#vp_bfrmE4 .vp-testi-track:hover { animation-play-state:paused; }\n@keyframes vp_bfrmE4_scroll { 0%{transform:translateX(0)} 100%{transform:translateX(-50%)} }\n#vp_bfrmE4 .vp-testi-card {\n  background:var(--white); border:1px solid var(--border); border-radius:var(--radius-sm);\n  padding:20px 22px; min-width:280px; max-width:300px; flex-shrink:0; box-shadow:var(--shadow-sm);\n  transition:transform 0.2s ease, box-shadow 0.2s ease;\n}\n#vp_bfrmE4 .vp-testi-card:hover { transform:translateY(-2px); box-shadow:var(--shadow-md); }\n#vp_bfrmE4 .vp-testi-top { display:flex; align-items:center; gap:10px; margin-bottom:10px; }\n#vp_bfrmE4 .vp-testi-avatar { width:32px; height:32px; border-radius:50%; background:var(--blue-10); display:flex; align-items:center; justify-content:center; font-size:13px; font-weight:700; color:var(--blue); flex-shrink:0; overflow:hidden; }\n#vp_bfrmE4 .vp-testi-avatar img { width:100%; height:100%; object-fit:cover; display:block; }\n#vp_bfrmE4 .vp-testi-name { font-size:14px; font-weight:600; color:var(--navy); }\n#vp_bfrmE4 .vp-testi-verified { width:14px; height:14px; color:var(--blue); flex-shrink:0; }\n#vp_bfrmE4 .vp-testi-text { font-size:13px; color:var(--navy-60); line-height:1.55; }\n#vp_bfrmE4 .vp-testi-stars { margin-top:10px; font-size:13px; color:var(--orange); letter-spacing:1px; }\n#vp_bfrmE4 .vp-testi-scroll::before, #vp_bfrmE4 .vp-testi-scroll::after { content:''; position:absolute; top:0; bottom:0; width:48px; z-index:2; pointer-events:none; }\n#vp_bfrmE4 .vp-testi-scroll::before { left:0; background:linear-gradient(90deg,var(--white) 0%,transparent 100%); }\n#vp_bfrmE4 .vp-testi-scroll::after  { right:0; background:linear-gradient(270deg,var(--white) 0%,transparent 100%); }\n#vp_bfrmE4 .vp-right { position:sticky; top:24px; display:flex; flex-direction:column; }\n#vp_bfrmE4 .vp-report-card { background:var(--navy); border-radius:20px; padding:32px 28px 28px; color:var(--white); box-shadow:var(--shadow-lg), 0 0 0 1px rgba(255,255,255,0.04) inset; flex:1; display:flex; flex-direction:column; }\n#vp_bfrmE4 .vp-rc-features { list-style:none; margin-bottom:28px; flex:1; }\n#vp_bfrmE4 .vp-rc-badge { display:inline-flex; align-items:center; gap:6px; background:rgba(255,255,255,0.08); border:1px solid rgba(255,255,255,0.10); border-radius:100px; padding:5px 14px; font-size:12px; font-weight:600; color:rgba(255,255,255,0.70); margin-bottom:20px; text-transform:uppercase; letter-spacing:0.06em; }\n#vp_bfrmE4 .vp-rc-badge-dot { width:6px; height:6px; border-radius:50%; background:var(--green); animation:vp_bfrmE4_pulse 2s ease-in-out infinite; }\n@keyframes vp_bfrmE4_pulse { 0%,100%{opacity:1} 50%{opacity:0.3} }\n#vp_bfrmE4 .vp-rc-title { font-family:var(--serif); font-size:26px; color:var(--white); margin-bottom:4px; }\n#vp_bfrmE4 .vp-rc-sub { font-size:13px; color:rgba(255,255,255,0.45); margin-bottom:24px; }\n#vp_bfrmE4 .vp-rc-feat { display:flex; align-items:center; gap:10px; padding:10px 0; border-bottom:1px solid rgba(255,255,255,0.06); font-size:14px; color:rgba(255,255,255,0.75); font-weight:500; }\n#vp_bfrmE4 .vp-rc-feat:last-child { border-bottom:none; }\n#vp_bfrmE4 .vp-rc-feat svg { width:16px; height:16px; color:var(--green); flex-shrink:0; }\n#vp_bfrmE4 .vp-rc-price-block { background:rgba(255,255,255,0.06); border:1px solid rgba(255,255,255,0.08); border-radius:14px; padding:20px; text-align:center; margin-bottom:20px; }\n#vp_bfrmE4 .vp-rc-price-row { display:flex; align-items:baseline; justify-content:center; gap:10px; margin-bottom:4px; }\n#vp_bfrmE4 .vp-rc-price-old { font-size:16px; color:rgba(255,255,255,0.35); text-decoration:line-through; }\n#vp_bfrmE4 .vp-rc-price-current { font-family:var(--serif); font-size:38px; color:var(--white); line-height:1; }\n#vp_bfrmE4 .vp-rc-price-currency { font-size:18px; color:rgba(255,255,255,0.60); font-weight:500; }\n#vp_bfrmE4 .vp-rc-discount { display:inline-flex; align-items:center; background:rgba(16,185,129,0.15); color:#6EE7B7; font-size:12px; font-weight:700; padding:3px 10px; border-radius:100px; margin-left:4px; }\n#vp_bfrmE4 .vp-rc-price-note { font-size:12px; color:rgba(255,255,255,0.35); margin-top:4px; }\n#vp_bfrmE4 .vp-rc-cta {\n  display:flex; align-items:center; justify-content:center; gap:8px; width:100%; padding:16px;\n  border:none; border-radius:12px; background:var(--blue); color:var(--white); font-family:var(--font);\n  font-size:16px; font-weight:700; cursor:pointer; text-decoration:none;\n  transition:background 0.2s ease, transform 0.15s ease, box-shadow 0.2s ease;\n  box-shadow:0 4px 16px rgba(37,99,235,0.35); margin-bottom:16px;\n}\n#vp_bfrmE4 .vp-rc-cta:hover { background:var(--blue-dark); transform:translateY(-1px); box-shadow:0 6px 24px rgba(37,99,235,0.45); color:var(--white); text-decoration:none; }\n#vp_bfrmE4 .vp-rc-cta:active { transform:translateY(0); }\n#vp_bfrmE4 .vp-rc-cta svg { flex-shrink:0; }\n#vp_bfrmE4 .vp-rc-timing { display:flex; align-items:center; justify-content:center; gap:6px; font-size:12px; color:rgba(255,255,255,0.35); }\n#vp_bfrmE4 .vp-rc-timing svg { flex-shrink:0; opacity:0.5; }\n#vp_bfrmE4 .vp-bundle-wrap { margin-top:24px; }\n#vp_bfrmE4 .vp-trust { margin-top:48px; padding-top:32px; border-top:1px solid var(--border); display:flex; align-items:center; justify-content:center; gap:40px; flex-wrap:wrap; position:relative; z-index:1; }\n#vp_bfrmE4 .vp-trust-item { display:flex; align-items:center; gap:8px; font-size:13px; color:var(--navy-60); font-weight:500; }\n#vp_bfrmE4 .vp-trust-item svg { color:var(--green); flex-shrink:0; }\n#vp_bfrmE4 .vp-success { display:none; flex-direction:column; align-items:center; padding-top:40px; position:relative; z-index:1; }\n#vp_bfrmE4 .vp-success-icon { width:72px; height:72px; border-radius:50%; background:var(--green-bg); display:flex; align-items:center; justify-content:center; margin-bottom:20px; }\n#vp_bfrmE4 .vp-success-icon svg { width:32px; height:32px; color:var(--green); }\n#vp_bfrmE4 .vp-success-headline { font-family:var(--serif); font-size:clamp(24px,4vw,32px); color:var(--navy); text-align:center; margin-bottom:6px; }\n#vp_bfrmE4 .vp-success-sub { font-size:15px; color:var(--navy-40); text-align:center; margin-bottom:12px; }\n\/* \u2500\u2500 Free recall teaser (revealed by renderRecalls only when campaigns exist) \u2500\u2500 *\/\n#vp_bfrmE4 .vp-recalls { width:100%; max-width:640px; margin:18px auto 0; background:#FFF7ED; border:1px solid #FDBA74; border-radius:14px; padding:16px 18px; text-align:left; }\n#vp_bfrmE4 .vp-recalls[hidden] { display:none; }\n#vp_bfrmE4 .vp-recalls-head { display:flex; align-items:center; gap:10px; margin-bottom:8px; }\n#vp_bfrmE4 .vp-recalls-flag { flex:0 0 auto; width:22px; height:22px; border-radius:50%; background:#EA580C; color:#fff; font-size:14px; font-weight:700; line-height:22px; text-align:center; }\n#vp_bfrmE4 .vp-recalls-title { font-size:15px; font-weight:700; color:#7C2D12; line-height:1.3; }\n#vp_bfrmE4 .vp-recalls-count { margin-left:auto; flex:0 0 auto; background:#FFEDD5; color:#9A3412; border:1px solid #FDBA74; border-radius:999px; font-size:13px; font-weight:700; padding:2px 10px; }\n#vp_bfrmE4 .vp-recalls-list { list-style:none; margin:0; padding:0; }\n#vp_bfrmE4 .vp-recalls-item { padding:8px 0; border-top:1px solid #FED7AA; }\n#vp_bfrmE4 .vp-recalls-item:first-child { border-top:none; }\n#vp_bfrmE4 .vp-recalls-meta { display:flex; flex-wrap:wrap; gap:12px; font-size:12px; color:#9A3412; font-weight:600; letter-spacing:0.02em; margin-bottom:2px; }\n#vp_bfrmE4 .vp-recalls-teaser { font-size:13.5px; color:#7C2D12; line-height:1.45; }\n#vp_bfrmE4 .vp-recalls-unlock { display:flex; align-items:center; gap:7px; margin-top:10px; font-size:12.5px; color:#9A3412; }\n#vp_bfrmE4 .vp-recalls-unlock svg { flex:0 0 auto; }\n\/* \"!\" + count chip on the Safety recalls feature row *\/\n#vp_bfrmE4 .vp-feature-flag { display:inline-block; margin-left:8px; min-width:20px; padding:0 7px; border-radius:999px; background:#EA580C; color:#fff; font-size:12px; font-weight:700; line-height:20px; text-align:center; vertical-align:middle; }\n#vp_bfrmE4 .vp-feature-flag[hidden] { display:none; }\n\/* \u2500\u2500 Persistent EU-numberplate banner (plate flow only) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n#vp_bfrmE4 .vp-plate-banner { display:flex; justify-content:center; margin:0 auto 32px; }\n#vp_bfrmE4 .vp-plate-card { display:inline-flex; align-items:stretch; height:54px; min-width:200px; background:var(--white); border:1.5px solid #1A1A1A; border-radius:8px; box-shadow:0 2px 8px rgba(4,36,63,0.10), inset 0 -2px 0 rgba(0,0,0,0.04); overflow:hidden; font-family:'Helvetica Neue','Arial Narrow',Arial,sans-serif; }\n#vp_bfrmE4 .vp-plate-eu { display:flex; flex-direction:column; align-items:center; justify-content:center; width:42px; background:#003399; color:#FFF; padding:6px 4px; gap:2px; flex:none; }\n#vp_bfrmE4 .vp-plate-eu-stars { display:block; width:22px; height:22px; }\n#vp_bfrmE4 .vp-plate-eu-code { font-size:13px; font-weight:700; letter-spacing:0.4px; line-height:1; color:#FFF; }\n#vp_bfrmE4 .vp-plate-text { display:flex; align-items:center; padding:0 20px; font-size:30px; font-weight:800; letter-spacing:3px; color:#1A1A1A; line-height:1; white-space:nowrap; }\n@media (max-width:480px) {\n  #vp_bfrmE4 .vp-plate-card { height:48px; min-width:180px; }\n  #vp_bfrmE4 .vp-plate-eu { width:36px; }\n  #vp_bfrmE4 .vp-plate-eu-stars { width:18px; height:18px; }\n  #vp_bfrmE4 .vp-plate-eu-code { font-size:11px; }\n  #vp_bfrmE4 .vp-plate-text { padding:0 14px; font-size:24px; letter-spacing:2px; }\n}\n\n\/* \u2500\u2500 Larger vehicle reveal on success (replaces .vp-vehicle-chip) \u2500\u2500\u2500\u2500\u2500 *\/\n#vp_bfrmE4 .vp-vehicle-chip { display:none; align-items:center; gap:10px; background:var(--surface); border:1px solid var(--border); border-radius:100px; padding:8px 20px 8px 8px; margin-bottom:40px; }\n#vp_bfrmE4 .vp-vehicle-card { display:none; flex-direction:column; align-items:center; gap:8px; margin:8px 0 24px; max-width:560px; text-align:center; }\n#vp_bfrmE4 .vp-vehicle-logo { width:64px; height:64px; border-radius:50%; background:var(--white); border:1px solid var(--border); display:flex; align-items:center; justify-content:center; overflow:hidden; box-shadow:var(--shadow-sm); }\n#vp_bfrmE4 .vp-vehicle-logo img { width:46px; height:46px; object-fit:contain; }\n#vp_bfrmE4 .vp-vehicle-logo svg { width:28px; height:28px; color:var(--navy-40); }\n#vp_bfrmE4 .vp-vehicle-name-large { font-family:var(--serif); font-size:clamp(24px,3.5vw,32px); color:var(--navy); line-height:1.15; margin:6px 0 0; }\n#vp_bfrmE4 .vp-vehicle-year-large { font-size:16px; color:var(--navy-60); margin:0; }\n#vp_bfrmE4 .vp-vin-verify { display:flex; flex-direction:column; align-items:center; gap:6px; padding:14px 18px; margin-top:10px; background:var(--surface); border:1px solid var(--border); border-radius:var(--radius-sm); max-width:480px; }\n#vp_bfrmE4 .vp-vin-verify-row { display:flex; align-items:baseline; gap:8px; font-family:var(--mono); }\n#vp_bfrmE4 .vp-vin-verify-label { font-size:11px; font-weight:700; color:var(--navy-40); letter-spacing:0.08em; text-transform:uppercase; font-family:var(--font); }\n#vp_bfrmE4 .vp-vin-verify-mask { display:inline-block; font-size:15px; color:var(--navy-40); letter-spacing:1px; filter:blur(1.5px); user-select:none; }\n#vp_bfrmE4 .vp-vin-verify-tail { font-size:18px; font-weight:700; color:var(--navy); letter-spacing:1px; }\n#vp_bfrmE4 .vp-vin-verify-msg { font-size:12px; color:var(--navy-60); line-height:1.45; max-width:380px; }\n\n\/* Old chip helper styles kept only because legacy markup elsewhere may reference them. *\/\n#vp_bfrmE4 .vp-vehicle-logo + .vp-vehicle-name { font-size:14px; font-weight:600; color:var(--navy); }\n#vp_bfrmE4 .vp-vehicle-vin-tag { font-family:var(--mono); font-size:11px; color:var(--navy-40); background:var(--navy-06); padding:3px 8px; border-radius:4px; }\n@media (max-width:860px) {\n  #vp_bfrmE4 .vp-content { grid-template-columns:1fr; gap:24px; }\n  #vp_bfrmE4 .vp-right { position:static; order:-1; }\n  #vp_bfrmE4 { padding:32px 16px 60px; }\n  #vp_bfrmE4 .vp-trust { gap:20px; }\n  #vp_bfrmE4 .vp-testi-card { min-width:250px; }\n}\n@media (max-width:480px) {\n  #vp_bfrmE4 .vp-report-card { padding:24px 20px 20px; border-radius:16px; }\n  #vp_bfrmE4 .vp-includes { padding:24px 20px; }\n  #vp_bfrmE4 .vp-rc-price-current { font-size:32px; }\n}\n\n<\/style>\n\n<div id=\"vp_bfrmE4\">\n\n  \n  \n  <div class=\"vp-loading\" id=\"vp_bfrmE4_loading\">\n        <div class=\"vp-vin-pill\">\n      <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"\/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/><\/svg>\n      <span id=\"vp_bfrmE4_vin\">\u2014<\/span>\n    <\/div>\n        <div class=\"vp-ring-wrap\" id=\"vp_bfrmE4_ringwrap\">\n      <svg class=\"vp-ring-svg\" viewBox=\"0 0 140 140\">\n        <circle class=\"vp-ring-bg\" cx=\"70\" cy=\"70\" r=\"65\"\/>\n        <circle class=\"vp-ring-fill\" id=\"vp_bfrmE4_ring\" cx=\"70\" cy=\"70\" r=\"65\"\/>\n      <\/svg>\n      <span class=\"vp-ring-halo\" aria-hidden=\"true\"><\/span>\n      <svg class=\"vp-ring-check\" viewBox=\"0 0 140 140\" aria-hidden=\"true\">\n        <path d=\"M45 72 L62 88 L96 52\" pathLength=\"100\"\/>\n      <\/svg>\n      <div class=\"vp-ring-pct\">\n        <div class=\"vp-ring-pct-num\" id=\"vp_bfrmE4_pct\">0%<\/div>\n        <div class=\"vp-ring-pct-label\">Hecho<\/div>\n      <\/div>\n    <\/div>\n    <h1 class=\"vp-load-headline\" id=\"vp_bfrmE4_load_h\" aria-live=\"polite\">Analizar el historial del veh\u00edculo<\/h1>\n    <p class=\"vp-load-step\" id=\"vp_bfrmE4_step\"><\/p>\n  <\/div>\n\n  <div class=\"vp-success\" id=\"vp_bfrmE4_success\">\n    <div class=\"vp-success-icon\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n    <\/div>\n    <h1 class=\"vp-success-headline\" id=\"vp_bfrmE4_succ_h\">Comprobaci\u00f3n del VIN completada<\/h1>\n    <p class=\"vp-success-sub\" id=\"vp_bfrmE4_succ_sub\">El informe de tu veh\u00edculo est\u00e1 listo para acceder a \u00e9l al instante.<\/p>\n    <div class=\"vp-vehicle-card\" id=\"vp_bfrmE4_chip\">\n      <div class=\"vp-vehicle-logo\" id=\"vp_bfrmE4_logo\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"1\" y=\"3\" width=\"15\" height=\"13\" rx=\"2\"\/><polygon points=\"23 7 16 12 16 2 23 7\"\/><\/svg>\n      <\/div>\n      <h2 class=\"vp-vehicle-name-large\" id=\"vp_bfrmE4_vname\"><\/h2>\n      <p class=\"vp-vehicle-year-large\" id=\"vp_bfrmE4_vyear\"><\/p>\n      <div class=\"vp-vin-verify\" id=\"vp_bfrmE4_vverify\" style=\"display:none;\">\n        <div class=\"vp-vin-verify-row\">\n          <span class=\"vp-vin-verify-label\">VIN<\/span>\n          <span class=\"vp-vin-verify-mask\" aria-hidden=\"true\">\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022<\/span>          <span class=\"vp-vin-verify-tail\" id=\"vp_bfrmE4_vvin\"><\/span>\n        <\/div>\n        <p class=\"vp-vin-verify-msg\">Comprueba que los \u00faltimos 5 caracteres coinciden con tu n\u00famero de bastidor. El n\u00famero de bastidor completo aparece en la p\u00e1gina siguiente. <\/p>\n      <\/div>\n    <\/div>\n        <div class=\"vp-recalls\" id=\"vp_bfrmE4_recalls\" hidden>\n      <div class=\"vp-recalls-head\">\n        <span class=\"vp-recalls-flag\" aria-hidden=\"true\">!<\/span>\n        <span class=\"vp-recalls-title\">Se han detectado retiradas por motivos de seguridad relacionadas con este veh\u00edculo<\/span>\n        <span class=\"vp-recalls-count\" id=\"vp_bfrmE4_recalls_count\"><\/span>\n      <\/div>\n      <ul class=\"vp-recalls-list\" id=\"vp_bfrmE4_recalls_list\"><\/ul>\n      <div class=\"vp-recalls-unlock\">\n        <svg width=\"13\" height=\"13\" 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=\"11\" width=\"18\" height=\"11\" rx=\"2\"\/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/><\/svg>\n        En el informe completo encontrar\u00e1s descripciones detalladas, consecuencias e instrucciones de reparaci\u00f3n.      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"vp-content\">\n    <div class=\"vp-left\">\n      <div class=\"vp-includes\">\n        <div class=\"vp-includes-head\">\n          <div class=\"vp-includes-icon\">\n            <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\/><polyline points=\"14 2 14 8 20 8\"\/><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"\/><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"\/><polyline points=\"10 9 9 9 8 9\"\/><\/svg>\n          <\/div>\n          <div>\n            <div class=\"vp-includes-title\">Informe del veh\u00edculo<\/div>\n            <div class=\"vp-includes-sub\">El informe incluye:<\/div>\n          <\/div>\n        <\/div>\n                <ul class=\"vp-features\" id=\"vp_bfrmE4_feats\">\n                    <li class=\"vp-feature\">\n                        <div class=\"vp-feature-check\">\n              <svg class=\"chk-p\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"4\" opacity=\"0.3\"\/><\/svg>\n              <svg class=\"chk-d\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            <\/div>\n                        <div class=\"vp-feature-text\">\n              <div class=\"vp-feature-name\">Detalles t\u00e9cnicos<\/div>\n              <div class=\"vp-feature-desc\">El informe contiene detalles t\u00e9cnicos del veh\u00edculo.<\/div>\n            <\/div>\n          <\/li>\n                    <li class=\"vp-feature\">\n                        <div class=\"vp-feature-check\">\n              <svg class=\"chk-p\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"4\" opacity=\"0.3\"\/><\/svg>\n              <svg class=\"chk-d\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            <\/div>\n                        <div class=\"vp-feature-text\">\n              <div class=\"vp-feature-name\">Historial de kilometraje<\/div>\n              <div class=\"vp-feature-desc\">Comprobamos el cuentakil\u00f3metros \/ historial de kilometraje.<\/div>\n            <\/div>\n          <\/li>\n                    <li class=\"vp-feature\">\n                        <div class=\"vp-feature-check\">\n              <svg class=\"chk-p\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"4\" opacity=\"0.3\"\/><\/svg>\n              <svg class=\"chk-d\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            <\/div>\n                        <div class=\"vp-feature-text\">\n              <div class=\"vp-feature-name\">Historial de accidentes<\/div>\n              <div class=\"vp-feature-desc\">Comprobamos posibles accidentes y reclamaciones al seguro.<\/div>\n            <\/div>\n          <\/li>\n                    <li class=\"vp-feature\">\n                        <div class=\"vp-feature-check\">\n              <svg class=\"chk-p\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"4\" opacity=\"0.3\"\/><\/svg>\n              <svg class=\"chk-d\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            <\/div>\n                        <div class=\"vp-feature-text\">\n              <div class=\"vp-feature-name\">Veh\u00edculos robados<\/div>\n              <div class=\"vp-feature-desc\">Comprobamos las bases de datos de veh\u00edculos robados.<\/div>\n            <\/div>\n          <\/li>\n                    <li class=\"vp-feature\">\n                        <div class=\"vp-feature-check\">\n              <svg class=\"chk-p\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"4\" opacity=\"0.3\"\/><\/svg>\n              <svg class=\"chk-d\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            <\/div>\n                        <div class=\"vp-feature-text\">\n              <div class=\"vp-feature-name\">Costes de mantenimiento<\/div>\n              <div class=\"vp-feature-desc\">Inf\u00f3rmate sobre el coste de mantenimiento del veh\u00edculo.<\/div>\n            <\/div>\n          <\/li>\n                    <li class=\"vp-feature\">\n                        <div class=\"vp-feature-check\">\n              <svg class=\"chk-p\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"4\" opacity=\"0.3\"\/><\/svg>\n              <svg class=\"chk-d\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            <\/div>\n                        <div class=\"vp-feature-text\">\n              <div class=\"vp-feature-name\">Informaci\u00f3n de servicio<\/div>\n              <div class=\"vp-feature-desc\">Intervalos de servicio e informaci\u00f3n de mantenimiento.<\/div>\n            <\/div>\n          <\/li>\n                    <li class=\"vp-feature\">\n                        <div class=\"vp-feature-check\">\n              <svg class=\"chk-p\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"4\" opacity=\"0.3\"\/><\/svg>\n              <svg class=\"chk-d\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            <\/div>\n                        <div class=\"vp-feature-text\">\n              <div class=\"vp-feature-name\">Valor de mercado<\/div>\n              <div class=\"vp-feature-desc\">Valor de mercado, kilometraje medio y listados.<\/div>\n            <\/div>\n          <\/li>\n                    <li class=\"vp-feature\">\n                        <div class=\"vp-feature-check\">\n              <svg class=\"chk-p\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"4\" opacity=\"0.3\"\/><\/svg>\n              <svg class=\"chk-d\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            <\/div>\n                        <div class=\"vp-feature-text\">\n              <div class=\"vp-feature-name\">Problemas comunes<\/div>\n              <div class=\"vp-feature-desc\">Aver\u00edas y problemas comunes de este veh\u00edculo.<\/div>\n            <\/div>\n          <\/li>\n                    <li class=\"vp-feature\" data-recalls=\"1\">\n                        <div class=\"vp-feature-check\">\n              <svg class=\"chk-p\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"4\" opacity=\"0.3\"\/><\/svg>\n              <svg class=\"chk-d\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            <\/div>\n                        <div class=\"vp-feature-text\">\n              <div class=\"vp-feature-name\">Retiradas por motivos de seguridad<span class=\"vp-feature-flag\" id=\"vp_bfrmE4_recalls_flag\" hidden>!<\/span><\/div>\n              <div class=\"vp-feature-desc\">Comprobamos las campa\u00f1as de retirada por motivos de seguridad que tienen en marcha los fabricantes.<\/div>\n            <\/div>\n          <\/li>\n                  <\/ul>\n              <\/div>\n    <\/div>\n\n        <div class=\"vp-right\">\n      <div class=\"vp-report-card\">\n        <div class=\"vp-rc-badge\" id=\"vp_bfrmE4_badge\">\n          <span class=\"vp-rc-badge-dot\"><\/span>\n          Comprobaci\u00f3n en curso        <\/div>\n        <div class=\"vp-rc-title\">Informe completo del veh\u00edculo<\/div>\n        <div class=\"vp-rc-sub\">Acceso online instant\u00e1neo tras la compra<\/div>\n\n        <ul class=\"vp-rc-features\">\n                    <li class=\"vp-rc-feat\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            Detalles t\u00e9cnicos y especificaciones          <\/li>\n                    <li class=\"vp-rc-feat\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            Historial de kilometraje completo          <\/li>\n                    <li class=\"vp-rc-feat\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            Registros de accidentes y seguros          <\/li>\n                    <li class=\"vp-rc-feat\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            Comprobaci\u00f3n de veh\u00edculos robados          <\/li>\n                    <li class=\"vp-rc-feat\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n            Valor de mercado y listados          <\/li>\n                  <\/ul>\n\n                  <div class=\"vp-rc-price-block\">\n            <div class=\"vp-rc-price-row\">\n              <span class=\"vp-rc-price-old\">24,90 \u20ac<\/span>              <span class=\"vp-rc-price-current\">19,90<\/span>\n              <span class=\"vp-rc-price-currency\">\u20ac<\/span>\n              <span class=\"vp-rc-discount\">&minus;20%<\/span>            <\/div>\n            <div class=\"vp-rc-price-note\">Pago \u00fanico - Sin suscripci\u00f3n<\/div>\n          <\/div>\n          <a class=\"vp-rc-cta\" id=\"vp_bfrmE4_cta\" href=\"#\">\n            Obtener informe completo            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg>\n          <\/a>\n        \n        <div class=\"vp-rc-timing\">\n          <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><polyline points=\"12 6 12 12 16 14\"\/><\/svg>\n          Informe listo en 5 minutos        <\/div>\n      <\/div>\n    <\/div>\n      <\/div>\n\n  <div class=\"vp-testimonials\">\n    <div class=\"vp-testimonials-label\">Lo que dicen nuestros clientes<\/div>\n    <div class=\"vp-testi-scroll\">\n      <div class=\"vp-testi-track\">\n                                    <div class=\"vp-testi-card\">\n            <div class=\"vp-testi-top\">\n              <div class=\"vp-testi-avatar\"><img decoding=\"async\" src=\"https:\/\/www.mrvin.com\/wp-content\/uploads\/2026\/05\/men\/51.jpg\" alt=\"Carlos M.\" loading=\"lazy\"><\/div>\n              <span class=\"vp-testi-name\">Carlos M.<\/span>\n              <svg class=\"vp-testi-verified\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\/><\/svg>\n            <\/div>\n            <div class=\"vp-testi-text\">Me ahorr\u00f3 miles de euros mostrando el retroceso de kilometraje oculto. Merece totalmente la pena. <\/div>\n            <div class=\"vp-testi-stars\">\u2605\u2605\u2605\u2605\u2605<\/div>\n          <\/div>\n                    <div class=\"vp-testi-card\">\n            <div class=\"vp-testi-top\">\n              <div class=\"vp-testi-avatar\"><img decoding=\"async\" src=\"https:\/\/www.mrvin.com\/wp-content\/uploads\/2026\/05\/women\/43.jpg\" alt=\"Laura G.\" loading=\"lazy\"><\/div>\n              <span class=\"vp-testi-name\">Laura G.<\/span>\n              <svg class=\"vp-testi-verified\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\/><\/svg>\n            <\/div>\n            <div class=\"vp-testi-text\">Ya lo he utilizado dos veces, nunca compro un coche sin comprobarlo antes.<\/div>\n            <div class=\"vp-testi-stars\">\u2605\u2605\u2605\u2605\u2605<\/div>\n          <\/div>\n                    <div class=\"vp-testi-card\">\n            <div class=\"vp-testi-top\">\n              <div class=\"vp-testi-avatar\"><img decoding=\"async\" src=\"https:\/\/www.mrvin.com\/wp-content\/uploads\/2026\/05\/men\/22.jpg\" alt=\"Javier R.\" loading=\"lazy\"><\/div>\n              <span class=\"vp-testi-name\">Javier R.<\/span>\n              <svg class=\"vp-testi-verified\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\/><\/svg>\n            <\/div>\n            <div class=\"vp-testi-text\">El vendedor afirm\u00f3 que no hab\u00eda accidentes... el informe mostraba dos. Esquivaste una bala. <\/div>\n            <div class=\"vp-testi-stars\">\u2605\u2605\u2605\u2605\u2605<\/div>\n          <\/div>\n                    <div class=\"vp-testi-card\">\n            <div class=\"vp-testi-top\">\n              <div class=\"vp-testi-avatar\"><img decoding=\"async\" src=\"https:\/\/www.mrvin.com\/wp-content\/uploads\/2026\/05\/women\/54.jpg\" alt=\"Mar\u00eda P.\" loading=\"lazy\"><\/div>\n              <span class=\"vp-testi-name\">Mar\u00eda P.<\/span>\n              <svg class=\"vp-testi-verified\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\/><\/svg>\n            <\/div>\n            <div class=\"vp-testi-text\">Comprob\u00e9 el n\u00famero de bastidor y encontr\u00e9 dos accidentes anteriores. Muchas gracias. <\/div>\n            <div class=\"vp-testi-stars\">\u2605\u2605\u2605\u2605\u2606<\/div>\n          <\/div>\n                                      <div class=\"vp-testi-card\">\n            <div class=\"vp-testi-top\">\n              <div class=\"vp-testi-avatar\"><img decoding=\"async\" src=\"https:\/\/www.mrvin.com\/wp-content\/uploads\/2026\/05\/men\/51.jpg\" alt=\"Carlos M.\" loading=\"lazy\"><\/div>\n              <span class=\"vp-testi-name\">Carlos M.<\/span>\n              <svg class=\"vp-testi-verified\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\/><\/svg>\n            <\/div>\n            <div class=\"vp-testi-text\">Me ahorr\u00f3 miles de euros mostrando el retroceso de kilometraje oculto. Merece totalmente la pena. <\/div>\n            <div class=\"vp-testi-stars\">\u2605\u2605\u2605\u2605\u2605<\/div>\n          <\/div>\n                    <div class=\"vp-testi-card\">\n            <div class=\"vp-testi-top\">\n              <div class=\"vp-testi-avatar\"><img decoding=\"async\" src=\"https:\/\/www.mrvin.com\/wp-content\/uploads\/2026\/05\/women\/43.jpg\" alt=\"Laura G.\" loading=\"lazy\"><\/div>\n              <span class=\"vp-testi-name\">Laura G.<\/span>\n              <svg class=\"vp-testi-verified\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\/><\/svg>\n            <\/div>\n            <div class=\"vp-testi-text\">Ya lo he utilizado dos veces, nunca compro un coche sin comprobarlo antes.<\/div>\n            <div class=\"vp-testi-stars\">\u2605\u2605\u2605\u2605\u2605<\/div>\n          <\/div>\n                    <div class=\"vp-testi-card\">\n            <div class=\"vp-testi-top\">\n              <div class=\"vp-testi-avatar\"><img decoding=\"async\" src=\"https:\/\/www.mrvin.com\/wp-content\/uploads\/2026\/05\/men\/22.jpg\" alt=\"Javier R.\" loading=\"lazy\"><\/div>\n              <span class=\"vp-testi-name\">Javier R.<\/span>\n              <svg class=\"vp-testi-verified\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\/><\/svg>\n            <\/div>\n            <div class=\"vp-testi-text\">El vendedor afirm\u00f3 que no hab\u00eda accidentes... el informe mostraba dos. Esquivaste una bala. <\/div>\n            <div class=\"vp-testi-stars\">\u2605\u2605\u2605\u2605\u2605<\/div>\n          <\/div>\n                    <div class=\"vp-testi-card\">\n            <div class=\"vp-testi-top\">\n              <div class=\"vp-testi-avatar\"><img decoding=\"async\" src=\"https:\/\/www.mrvin.com\/wp-content\/uploads\/2026\/05\/women\/54.jpg\" alt=\"Mar\u00eda P.\" loading=\"lazy\"><\/div>\n              <span class=\"vp-testi-name\">Mar\u00eda P.<\/span>\n              <svg class=\"vp-testi-verified\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"\/><\/svg>\n            <\/div>\n            <div class=\"vp-testi-text\">Comprob\u00e9 el n\u00famero de bastidor y encontr\u00e9 dos accidentes anteriores. Muchas gracias. <\/div>\n            <div class=\"vp-testi-stars\">\u2605\u2605\u2605\u2605\u2606<\/div>\n          <\/div>\n                        <\/div>\n    <\/div>\n  <\/div>\n\n    <div class=\"vp-trust\">\n        <div class=\"vp-trust-item\">\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n      Datos oficiales de fuentes privadas    <\/div>\n        <div class=\"vp-trust-item\">\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n      M\u00e1s de 100 000 coches revisados    <\/div>\n        <div class=\"vp-trust-item\">\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n      Informaci\u00f3n m\u00e1s reciente    <\/div>\n        <div class=\"vp-trust-item\">\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\n      M\u00e1s de 1.000 socios de datos    <\/div>\n      <\/div>\n  \n  \n<\/div>\n\n<script>\n(function(){\n  var U    = 'vp_bfrmE4';\n  var i18n = {\"steps\":[\"Conexi\\u00f3n a bases de datos...\",\"Comprobaci\\u00f3n de los registros de kilometraje...\",\"Escanear el historial de accidentes...\",\"Verificar las bases de datos robadas...\",\"Analizar los datos de mantenimiento...\",\"Compilar el valor de mercado...\",\"Comprobando las retiradas por motivos de seguridad...\",\"Finalizando el informe...\"],\"readyHeadline\":\"El informe ya est\\u00e1 listo\",\"badgeDone\":\"Comprobaci\\u00f3n completa\",\"timing\":\"Informe listo en 5 minutos\",\"vinAjax\":\"https:\\\/\\\/www.mrvin.com\\\/wp-admin\\\/admin-ajax.php?action=vp_vin_basic&lang=es\",\"plateAjax\":\"https:\\\/\\\/www.mrvin.com\\\/wp-admin\\\/admin-ajax.php?action=vp_plate_basic&lang=es\",\"suggestAjax\":\"https:\\\/\\\/www.mrvin.com\\\/wp-admin\\\/admin-ajax.php?action=vp_vin_suggest&lang=es\",\"eventAjax\":\"https:\\\/\\\/www.mrvin.com\\\/wp-admin\\\/admin-ajax.php?action=vp_vin_event&lang=es\",\"checkoutUrl\":\"https:\\\/\\\/www.mrvin.com\\\/es\\\/checkout\\\/\",\"vehicleFoundHeadline\":\"Hemos encontrado tu veh\\u00edculo\",\"vehicleFoundSub\":\"Comprueba que es el correcto antes de continuar.\",\"instant\":0,\"sgPrompt\":\"\\u00bfEst\\u00e1s seguro de que el VIN es correcto? \\u00bfTe refer\\u00edas a {vin} ({brand})?\",\"sgMulti\":\"\\u00bfEst\\u00e1s seguro de que el n\\u00famero de bastidor es correcto? \\u00bfTe refer\\u00edas a alguno de estos? \",\"sgOne\":\"\\u00bfEst\\u00e1s seguro de que el VIN es correcto? \\u00bfQuiz\\u00e1s quer\\u00edas decir: \",\"sgConfirm\":\"Por favor, confirma que el VIN es correcto.\",\"sgRecheck\":\"Por favor, comprueba bien cada car\\u00e1cter compar\\u00e1ndolo con el documento del veh\\u00edculo.\",\"sgCorrected\":\"Hemos corregido tu VIN a {vin}.\",\"sgSearch\":\"Busca eso\",\"sgKeep\":\"Mi n\\u00famero de chasis es correcto\",\"pfNotFound\":\"No hemos podido encontrar esa matr\\u00edcula.\",\"pfUnsupported\":\"La b\\u00fasqueda por matr\\u00edcula a\\u00fan no est\\u00e1 disponible para este pa\\u00eds.\",\"pfError\":\"Ahora mismo no hemos podido comprobar esa matr\\u00edcula.\",\"pfDaily\":\"Has alcanzado el l\\u00edmite diario de b\\u00fasquedas de matr\\u00edculas.\",\"pfSub\":\"Introduce el VIN para confirmar el veh\\u00edculo.\",\"pfCta\":\"Comprueba el VIN\",\"pfPlaceholder\":\"N.\\u00ba de bastidor (17 caracteres)\",\"pfBad\":\"Eso no parece un VIN v\\u00e1lido de 17 caracteres.\",\"pfMiss\":\"No hemos podido encontrar ning\\u00fan veh\\u00edculo con ese n\\u00famero de chasis. Por favor, compru\\u00e9balo con la documentaci\\u00f3n del veh\\u00edculo. \",\"pfWorking\":\"Comprobando\\u2026\"};\n\n  var CIRC     = 2 * Math.PI * 65;\n  var ringFill = document.getElementById(U + '_ring');\n  var ringWrapEl = document.getElementById(U + '_ringwrap');\n  var loadHEl  = document.getElementById(U + '_load_h');\n  var pctEl    = document.getElementById(U + '_pct');\n  var stepEl   = document.getElementById(U + '_step');\n  var loadEl   = document.getElementById(U + '_loading');\n  var succEl   = document.getElementById(U + '_success');\n  var feats    = document.querySelectorAll('#' + U + '_feats .vp-feature');\n  var badgeEl  = document.getElementById(U + '_badge');\n  var chipEl   = document.getElementById(U + '_chip');     \/\/ .vp-vehicle-card wrapper\n  var logoEl   = document.getElementById(U + '_logo');\n  var vnameEl  = document.getElementById(U + '_vname');     \/\/ make + model (large)\n  var vyearEl  = document.getElementById(U + '_vyear');     \/\/ year (separate line)\n  var vvinEl   = document.getElementById(U + '_vvin');      \/\/ tail (last 5 chars only)\n  var vverifyEl = document.getElementById(U + '_vverify');  \/\/ entire verify block (.vp-vin-verify)\n  var succHEl  = document.getElementById(U + '_succ_h');\n  var succSubEl = document.getElementById(U + '_succ_sub');\n  var ctaEl    = document.getElementById(U + '_cta');\n  var steps    = i18n.steps || [];\n  var INSTANT  = !!i18n.instant;   \/\/ embedded-in-checkout variant\n  \/\/ Instant mode runs a much tighter ticker (see the interval below), so keep\n  \/\/ only the four highest-signal steps; the standalone page shows all seven.\n  if (INSTANT && steps.length > 4) steps = steps.slice(0, 4);\n\n  \/* \u2500\u2500 Floating sticky buy-bar (INSTANT only) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  var fabEl     = document.getElementById(U + '_fab');\n  var fabBarEl  = document.getElementById(U + '_fab_bar');\n  var fabNameEl = document.getElementById(U + '_fab_name');\n  var fabLogoEl = document.getElementById(U + '_fab_logo');\n  var fabStatEl = fabEl ? fabEl.querySelector('.vp-fab-status-txt') : null;\n  var fabCtaEl  = document.getElementById(U + '_fab_cta');\n\n  \/\/ Generic car glyph used as the buy-bar logo fallback (lookup miss \/ logo 404 \/\n  \/\/ no data) \u2014 so the loading ring never spins forever.\n  var FAB_CAR_SVG = '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"1\" y=\"3\" width=\"15\" height=\"13\" rx=\"2\"\/><polygon points=\"23 7 16 12 16 2 23 7\"\/><\/svg>';\n  var fabLogoSettled = false;\n  function fabLogoFallback() {\n    if (fabLogoEl && !fabLogoSettled) { fabLogoEl.innerHTML = FAB_CAR_SVG; fabLogoSettled = true; }\n  }\n\n  \/\/ Smooth-scroll to the real WooCommerce checkout form sitting below the preview.\n  function scrollToCheckout() {\n    var form = document.querySelector('form.checkout.woocommerce-checkout');\n    if (form && typeof form.scrollIntoView === 'function') {\n      try { form.scrollIntoView({ behavior: 'smooth', block: 'start' }); }\n      catch (e) { form.scrollIntoView(); }\n    }\n  }\n\n  \/**\n   * Return only the last 5 characters of a VIN. The leading dots in the DOM are\n   * static markup (`\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022`) \u2014 the full VIN is never written into the DOM,\n   * so view-source \/ DOM inspection only reveals the last 5 characters.\n   *\/\n  function vinTail(v) { return (typeof v === 'string' && v.length >= 5) ? v.slice(-5) : (v || ''); }\n\n  var progress = 0, lastStep = -1, checked = 0;\n\n  if (ringFill) {\n    ringFill.style.strokeDasharray  = CIRC;\n    ringFill.style.strokeDashoffset = CIRC;\n  }\n\n  \/* \u2500\u2500 Read VIN \/ plate \/ country from URL (with sessionStorage fallback) \u2500\u2500\u2500\u2500\u2500 *\/\n  var qp = new URLSearchParams(window.location.search);\n  var vin = qp.get('vin') || '';\n  if (vin) {\n    vin = vin.toUpperCase();\n    \/\/ Only the last 5 chars are written to the DOM; the full VIN stays in this closure.\n    var vinEl = document.getElementById(U + '_vin');\n    if (vinEl) vinEl.textContent = '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022' + vinTail(vin);\n  }\n  \/\/ Plate stays in its raw form (with separators like AK-6000) for the lookup;\n  \/\/ the backend normalizes it. The plate is rendered server-side in the persistent\n  \/\/ `.vp-plate-banner`, so we don't need to write it into the loading-pill anymore.\n  var plate = (qp.get('plate') || '').toUpperCase().replace(\/[^A-Z0-9 \\-]\/g, '').slice(0, 15);\n  var countryIso = (qp.get('country_iso') || '').toUpperCase();\n  if (!countryIso) {\n    try { countryIso = (sessionStorage.getItem('mrvinPlateCountryIso') || '').toUpperCase(); }\n    catch (e) { countryIso = ''; }\n  }\n  if (countryIso && !\/^[A-Z]{2}$\/.test(countryIso)) countryIso = '';\n\n  \/* \u2500\u2500 Build checkout URL with VIN + country \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\n   *  i18n.checkoutUrl is the WPML-translated checkout page URL\n   *  generated server-side (e.g. \/de\/kasse\/, \/fr\/caisse\/, \/checkout\/).\n   *  The checkout flow auto-adds the correct language-specific\n   *  product to the cart, so we append ?vin=\u2026 and ?country_iso=\u2026\n   *  so \/checkout\/ can route the backend lookup to the right\n   *  regional sub-API.\n   * \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  function buildCheckoutUrl() {\n    var base = i18n.checkoutUrl || '';\n    if (!base) return '';\n    if (!vin && !plate && !countryIso) return base;\n    var url;\n    try { url = new URL(base, window.location.origin); }\n    catch (e) {\n      var sep = base.indexOf('?') !== -1 ? '&' : '?';\n      var tail = [];\n      if (vin)        tail.push('vin='         + encodeURIComponent(vin));\n      if (!vin && plate) tail.push('plate='    + encodeURIComponent(plate));\n      if (countryIso) tail.push('country_iso=' + encodeURIComponent(countryIso));\n      return base + (tail.length ? sep + tail.join('&') : '');\n    }\n    if (vin)        url.searchParams.set('vin', vin);\n    if (!vin && plate) url.searchParams.set('plate', plate);\n    if (countryIso) url.searchParams.set('country_iso', countryIso);\n    return url.toString();\n  }\n\n  \/* Wire up CTA button.\n     INSTANT mode: the real WooCommerce checkout form is already on this page,\n     directly below \u2014 so \"Get Full Report\" just smooth-scrolls down to it.\n     STANDARD mode (\/product\/): navigate to checkout. The full VIN must NOT\n     appear in any DOM attribute, so we DO NOT set ctaEl.href at startup;\n     navigation happens programmatically on click, so the VIN only enters the\n     URL bar at the moment of redirect. *\/\n  if (ctaEl) {\n    ctaEl.setAttribute('href', '#');\n    ctaEl.setAttribute('role', 'button');\n    ctaEl.addEventListener('click', function(e) {\n      e.preventDefault();\n\n      if (INSTANT) {\n        var form = document.querySelector('form.checkout.woocommerce-checkout');\n        if (form && typeof form.scrollIntoView === 'function') {\n          try { form.scrollIntoView({ behavior: 'smooth', block: 'start' }); }\n          catch (e2) { form.scrollIntoView(); }\n        }\n        return;\n      }\n\n      \/\/ Already have a VIN (either entered directly or resolved earlier) \u2192 go now.\n      if (vin) {\n        window.location.href = buildCheckoutUrl();\n        return;\n      }\n      \/\/ Plate-only path: block until the plate lookup resolves.\n      if (plate && vinDataPromise && typeof vinDataPromise.then === 'function') {\n        ctaEl.setAttribute('aria-busy', 'true');\n        vinDataPromise.then(function(){\n          ctaEl.removeAttribute('aria-busy');\n          window.location.href = buildCheckoutUrl();\n        });\n        return;\n      }\n      \/\/ Fallback (no inputs at all) \u2014 go to plain checkout base.\n      window.location.href = buildCheckoutUrl();\n    });\n  }\n\n  \/* \u2500\u2500 Car brand logo lookup \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n  var LOGO_CDN = 'https:\/\/cdn.jsdelivr.net\/gh\/filippofilip95\/car-logos-dataset@master\/logos\/thumb\/';\n  var LOGO_MAP = {\n    'alfa romeo':'alfa-romeo','aston martin':'aston-martin','audi':'audi',\n    'bentley':'bentley','bmw':'bmw','bugatti':'bugatti','buick':'buick',\n    'cadillac':'cadillac','chevrolet':'chevrolet','chrysler':'chrysler',\n    'citroen':'citroen','cupra':'cupra','dacia':'dacia','daewoo':'daewoo',\n    'daihatsu':'daihatsu','dodge':'dodge','ds':'ds','ferrari':'ferrari',\n    'fiat':'fiat','ford':'ford','genesis':'genesis','gmc':'gmc',\n    'honda':'honda','hummer':'hummer','hyundai':'hyundai','infiniti':'infiniti',\n    'isuzu':'isuzu','jaguar':'jaguar','jeep':'jeep','kia':'kia',\n    'lamborghini':'lamborghini','lancia':'lancia','land rover':'land-rover',\n    'landrover':'land-rover','lexus':'lexus','lincoln':'lincoln','lotus':'lotus',\n    'maserati':'maserati','mazda':'mazda','mclaren':'mclaren',\n    'mercedes':'mercedes-benz','mercedes-benz':'mercedes-benz',\n    'mini':'mini','mitsubishi':'mitsubishi','nissan':'nissan','opel':'opel',\n    'peugeot':'peugeot','pontiac':'pontiac','porsche':'porsche','ram':'ram',\n    'renault':'renault','rolls-royce':'rolls-royce','rolls royce':'rolls-royce',\n    'rover':'rover','saab':'saab','seat':'seat','skoda':'skoda','smart':'smart',\n    'ssangyong':'ssangyong','subaru':'subaru','suzuki':'suzuki','tesla':'tesla',\n    'toyota':'toyota','vauxhall':'vauxhall','volkswagen':'volkswagen',\n    'vw':'volkswagen','vw ag':'volkswagen','volvo':'volvo'\n  };\n\n  function tryShowLogo(make) {\n    if (!logoEl || !make) return;\n    var key = make.toLowerCase().trim();\n    var slug = LOGO_MAP[key] || null;\n    if (!slug) {\n      for (var k in LOGO_MAP) {\n        if (key.indexOf(k) !== -1 || k.indexOf(key) !== -1) { slug = LOGO_MAP[k]; break; }\n      }\n    }\n    if (!slug) { fabLogoFallback(); return; }   \/\/ unknown make \u2192 stop the ring\n    var img = new Image();\n    img.onload = function() {\n      logoEl.innerHTML = '';\n      var imgTag = document.createElement('img');\n      imgTag.src = img.src;\n      imgTag.alt = make;\n      \/\/ Inline `object-fit` only \u2014 let the CSS rule for `.vp-vehicle-logo img`\n      \/\/ handle width\/height so the larger 64\u00d764 reveal sizing isn't fought.\n      imgTag.style.objectFit = 'contain';\n      logoEl.appendChild(imgTag);\n\n      \/\/ Mirror the same logo into the floating buy-bar (replaces the loading ring).\n      if (fabLogoEl) {\n        var fabImg = document.createElement('img');\n        fabImg.src = img.src; fabImg.alt = make;\n        fabLogoEl.innerHTML = '';\n        fabLogoEl.appendChild(fabImg);\n        fabLogoSettled = true;\n      }\n\n      \/\/ \u2026and into the checkout \"You're checking\u2026\" box logo (variant B).\n      if (INSTANT) {\n        var cczLogo = document.getElementById('ccz-vehicle-logo');\n        if (cczLogo) { cczLogo.src = img.src; cczLogo.style.display = ''; }\n      }\n    };\n    \/\/ CDN miss \u2192 stop the ring and show the generic car glyph instead.\n    img.onerror = function() { fabLogoFallback(); };\n    img.src = LOGO_CDN + slug + '.png';\n  }\n\n  \/**\n   * @param failedPlate when this VIN was typed to rescue a plate search that found nothing, the\n   *        plate that failed. Recorded against the lookup so the plate funnel can count rescues;\n   *        it changes nothing about the lookup itself.\n   *\/\n  function fetchVinData(vinCode, failedPlate) {\n    var base = i18n.vinAjax || '';\n    if (!base) return Promise.resolve(null);\n    try {\n      var url = new URL(base, window.location.origin);\n      url.searchParams.set('vin', vinCode);\n      if (countryIso) url.searchParams.set('country_iso', countryIso);\n      if (failedPlate) url.searchParams.set('failed_plate', failedPlate);\n      return fetch(url.toString(), {credentials:'same-origin'})\n        .then(function(r){ return r.json(); })\n        .then(function(json){\n          if (!json || !json.success || !json.data) return null;\n          return {\n            vin:          (json.data.vin          || vinCode).trim(),\n            manufacturer: (json.data.manufacturer || '').trim(),\n            model:        (json.data.model        || '').trim(),\n            year:         String(json.data.year   || '').trim(),\n            recalls:      json.data.recalls || null\n          };\n        })\n        .catch(function(){ return null; });\n    } catch(e) { return Promise.resolve(null); }\n  }\n\n  \/* \"Did you mean\" \/ brand fallback. Runs only when the preview returned no\n     vehicle: proxies the backend validate endpoint and shows an advisory\n     banner. Soft-warn \u2014 the checkout flow is never blocked. *\/\n  var sgShown = false;\n  function escHtml(s){ return String(s).replace(\/[&<>\"']\/g, function(c){ return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]; }); }\n  function suggestUrlFor(targetVin){\n    var u = new URL(window.location.href);\n    u.searchParams.set('vin', targetVin);\n    u.searchParams.delete('plate');\n    return u.toString();\n  }\n  function ensureSuggestBox(){\n    var box = document.getElementById(U + '_suggest');\n    if (box) return box;\n    box = document.createElement('div');\n    box.id = U + '_suggest';\n    box.style.cssText = \"margin:0 auto 16px;max-width:560px;background:#EEF2FF;border:1px solid #C7D2FE;color:#1E3A8A;border-radius:12px;padding:14px 16px;font:500 14px\/1.5 'DM Sans',system-ui,sans-serif;text-align:center;\";\n    var anchor = succEl || loadEl;\n    if (anchor && anchor.parentNode) anchor.parentNode.insertBefore(box, anchor);\n    else { var root = document.getElementById(U); if (root) root.insertBefore(box, root.firstChild); }\n    return box;\n  }\n  \/* \u2500\u2500 Plate-lookup fallback \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   * Shown when a number-plate search ends with no vehicle. Before this, that outcome was silent:\n   * the scan completed, no car appeared, and checkout's VIN guard blocked the pay button with \u2014\n   * in snippet 9's own words \u2014 \"nothing near the pay buttons\" to explain it. The buyer's only\n   * remaining signal was that clicking Pay did nothing.\n   *\n   * Deliberately built for every plate country, not just the new one. LV and GB have always failed\n   * this way; France merely made it worth fixing.\n   *\n   * A VIN typed here re-enters the ORDINARY VIN path (vp_vin_basic), so the server writes the same\n   * session keys a VIN search always writes and checkout unblocks through the existing\n   * mrvin_vehicle event \u2014 no second gate, no special case downstream. *\/\n  var pfShown = false;\n  function showPlateFallback(kind){\n    if (pfShown) return;\n    pfShown = true;\n    var head = kind === 'unsupported' ? i18n.pfUnsupported\n             : kind === 'notFound'    ? i18n.pfNotFound\n             : kind === 'dailyLimit'  ? i18n.pfDaily\n             : i18n.pfError;   \/\/ 'rateLimited' and 'error' both mean \"try the VIN instead\"\n\n    var box = document.createElement('div');\n    box.id = U + '_platefail';\n    box.style.cssText = \"margin:0 auto 16px;max-width:560px;background:#FFF7ED;border:1px solid #FED7AA;color:#7C2D12;border-radius:12px;padding:16px;font:500 14px\/1.5 'DM Sans',system-ui,sans-serif;text-align:center;\";\n    box.innerHTML =\n        '<div style=\"font-weight:700;margin-bottom:4px\">' + escHtml(head) + '<\/div>'\n      + '<div style=\"margin-bottom:12px\">' + escHtml(i18n.pfSub) + '<\/div>'\n      \/\/ wrap+gap rather than a fixed row: the CTA label triples in length in some languages, and a\n      \/\/ nowrap row would push the button off the card.\n      + '<div style=\"display:flex;flex-wrap:wrap;gap:8px;justify-content:center\">'\n      +   '<input id=\"' + U + '_pfvin\" type=\"text\" inputmode=\"latin\" autocapitalize=\"characters\" spellcheck=\"false\" maxlength=\"17\" '\n      +     'placeholder=\"' + escHtml(i18n.pfPlaceholder) + '\" '\n      +     'style=\"flex:1 1 240px;min-width:0;padding:10px 12px;border:1px solid #FDBA74;border-radius:8px;font:600 15px\/1.2 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase\">'\n      +   '<button id=\"' + U + '_pfgo\" type=\"button\" style=\"flex:0 0 auto;padding:10px 18px;border:0;border-radius:8px;background:#EA580C;color:#fff;font:700 14px\/1.2 \\'DM Sans\\',system-ui,sans-serif;cursor:pointer\">'\n      +     escHtml(i18n.pfCta) + '<\/button>'\n      + '<\/div>'\n      + '<div id=\"' + U + '_pferr\" style=\"margin-top:8px;color:#B91C1C;display:none\"><\/div>';\n\n    var anchor = succEl || loadEl;\n    if (anchor && anchor.parentNode) anchor.parentNode.insertBefore(box, anchor);\n    else { var root = document.getElementById(U); if (root) root.insertBefore(box, root.firstChild); }\n\n    var input = document.getElementById(U + '_pfvin');\n    var go    = document.getElementById(U + '_pfgo');\n    \/\/ Strip as they type: I, O and Q are not legal VIN characters, and a pasted VIN routinely\n    \/\/ carries spaces or dashes from a PDF.\n    input.addEventListener('input', function(){\n      var cleaned = input.value.toUpperCase().replace(\/[^A-HJ-NPR-Z0-9]\/g, '');\n      if (cleaned !== input.value) input.value = cleaned;\n    });\n    input.addEventListener('keydown', function(e){ if (e.key === 'Enter') { e.preventDefault(); go.click(); } });\n    go.addEventListener('click', function(){ fallbackVinLookup(input.value.trim(), box, go); });\n    try { input.focus({preventScroll:true}); } catch(e) { }\n  }\n\n  function pfError(box, msg){\n    var el = box.querySelector('[id$=\"_pferr\"]');\n    if (!el) return;\n    el.textContent = msg;\n    el.style.display = msg ? 'block' : 'none';\n  }\n\n  function fallbackVinLookup(vinTyped, box, go){\n    if (vinTyped.length !== 17) { pfError(box, i18n.pfBad); return; }\n    pfError(box, '');\n    var label = go.textContent;\n    go.disabled = true;\n    go.textContent = i18n.pfWorking;\n\n    \/\/ The plate that failed rides along so the funnel can count this rescue \u2014 see\n    \/\/ WebVehicleApi.getVehiclePreview. It is context for the log row only; the lookup is a plain\n    \/\/ VIN search.\n    fetchVinData(vinTyped, plate).then(function(d){\n      go.disabled = false;\n      go.textContent = label;\n      if (!d || (!d.manufacturer && !d.model)) { pfError(box, i18n.pfMiss); maybeSuggest(vinTyped); return; }\n      \/\/ Promote the typed VIN into page state: unlike a plate-resolved VIN, the buyer supplied this\n      \/\/ one, so buildCheckoutUrl() may carry it and there is nothing to withhold.\n      vin = vinTyped;\n      box.parentNode && box.parentNode.removeChild(box);\n      applyVinData(d);   \/\/ also fires mrvin_vehicle, which releases checkout's VIN guard\n    }).catch(function(){\n      go.disabled = false;\n      go.textContent = label;\n      pfError(box, i18n.pfMiss);\n    });\n  }\n\n  function maybeSuggest(vinCode){\n    if (sgShown || !vinCode) return;\n    var base = i18n.suggestAjax || '';\n    if (!base) return;\n    sgShown = true;\n    try {\n      var url = new URL(base, window.location.origin);\n      url.searchParams.set('vin', vinCode);\n      fetch(url.toString(), {credentials:'same-origin'})\n        .then(function(r){ return r.json(); })\n        .then(function(j){ if (j && j.success && j.data) renderSuggest(j.data); })\n        .catch(function(){});\n    } catch(e){}\n  }\n  \/\/ Fire-and-forget tracking beacon (training signal) via the WP proxy.\n  function sgEvent(outcome, extra){\n    try {\n      var base = i18n.eventAjax || ''; if (!base) return;\n      var fd = new FormData();\n      fd.append('typed', vin || '');\n      fd.append('outcome', outcome);\n      if (extra){ for (var k in extra){ if (extra[k] != null) fd.append(k, extra[k]); } }\n      if (navigator.sendBeacon) navigator.sendBeacon(base, fd);\n      else fetch(base, {method:'POST', body:fd, keepalive:true, credentials:'same-origin'});\n    } catch(e){}\n  }\n  \/\/ Render a VIN with the changed character positions bolded (1-based positions).\n  function boldVin(vinStr, positions){\n    positions = positions || [];\n    var s = '';\n    for (var i = 0; i < vinStr.length; i++){\n      var ch = escHtml(vinStr.charAt(i));\n      s += (positions.indexOf(i + 1) >= 0) ? '<b style=\"color:#1D4ED8\">' + ch + '<\/b>' : ch;\n    }\n    return s;\n  }\n  function renderSuggest(d){\n    var sugg = d.suggestions || [];\n\n    \/\/ Deterministic I\/O\/Q fix: tell them what changed and take them to the fixed VIN.\n    if (d.autoCorrect && d.suggestion){\n      var box1 = ensureSuggestBox();\n      box1.innerHTML = '<div>' + escHtml((i18n.sgCorrected || 'We corrected your VIN to {vin}.').replace('{vin}', d.suggestion)) + '<\/div>';\n      box1.style.display = 'block';\n      sgEvent('chosen', {verdict:'corrected', chosen:d.suggestion, suggested:d.suggestion});\n      setTimeout(function(){ window.location.href = suggestUrlFor(d.suggestion); }, 1600);\n      return;\n    }\n\n    \/\/ Typo with one or more known-WMI options: let the visitor pick the right one.\n    if (d.verdict === 'likely_typo' && sugg.length){\n      var joined = sugg.map(function(s){ return s.vin; }).join(',');\n      var head = sugg.length > 1\n        ? (i18n.sgMulti || 'Are you sure the VIN is correct? Did you mean one of these?')\n        : (i18n.sgOne   || 'Are you sure the VIN is correct? Did you mean:');\n      var html = '<div style=\"margin-bottom:12px\">' + escHtml(head) + '<\/div>';\n      html += '<div style=\"display:flex;flex-direction:column;gap:8px;align-items:stretch;\">';\n      sugg.forEach(function(s){\n        html += '<a href=\"' + escHtml(suggestUrlFor(s.vin)) + '\" data-vin=\"' + escHtml(s.vin) + '\" class=\"' + U + '_sg_opt\" '\n             +  'style=\"display:flex;justify-content:space-between;gap:12px;align-items:center;text-decoration:none;'\n             +  'background:#fff;border:1px solid #C7D2FE;border-radius:10px;padding:10px 14px;color:#1E3A8A;\">'\n             +  '<span style=\"font-family:\\'DM Mono\\',ui-monospace,monospace;font-size:15px;letter-spacing:1px;\">' + boldVin(s.vin, s.diffPositions) + '<\/span>'\n             +  (s.brand ? '<span style=\"font-weight:600;opacity:.75;\">' + escHtml(s.brand) + '<\/span>' : '')\n             +  '<\/a>';\n      });\n      html += '<\/div>';\n      html += '<button type=\"button\" id=\"' + U + '_sg_keep\" style=\"background:transparent;border:0;color:#1E3A8A;font-weight:600;cursor:pointer;margin-top:12px;padding:6px;\">' + escHtml(i18n.sgKeep || 'My VIN is correct') + '<\/button>';\n      var box = ensureSuggestBox();\n      box.innerHTML = html;\n      box.style.display = 'block';\n      sgEvent('shown', {verdict:'likely_typo', suggested:joined});\n      Array.prototype.forEach.call(document.getElementsByClassName(U + '_sg_opt'), function(a){\n        a.addEventListener('click', function(){ sgEvent('chosen', {verdict:'likely_typo', chosen:a.getAttribute('data-vin'), suggested:joined}); });\n      });\n      var keep = document.getElementById(U + '_sg_keep');\n      if (keep) keep.addEventListener('click', function(){ sgEvent('dismissed', {verdict:'likely_typo', suggested:joined}); box.style.display = 'none'; });\n      return;\n    }\n\n    \/\/ Everything else (a legit VIN we just have no data for, or an unrecognised\n    \/\/ one we cannot improve): show nothing, exactly as before the suggester.\n  }\n\n  function fetchPlateData(plateCode, iso) {\n    var base = i18n.plateAjax || '';\n    if (!base || !plateCode || !iso) return Promise.resolve(null);\n    try {\n      var url = new URL(base, window.location.origin);\n      url.searchParams.set('plate',       plateCode);\n      url.searchParams.set('country_iso', iso);\n      return fetch(url.toString(), {credentials:'same-origin'})\n        .then(function(r){ return r.json(); })\n        .then(function(json){\n          \/\/ Every failure used to collapse to null here, and null is indistinguishable from\n          \/\/ \"nothing was searched\" \u2014 so the scan animation ran its course, showed no vehicle, said\n          \/\/ nothing, and checkout silently refused to accept a payment with no explanation anywhere\n          \/\/ near the pay button. The server has always sent a reason; only this line threw it away.\n          if (!json || !json.success || !json.data) return plateFailure(json);\n          if (!json.data.vinResolved) return {plateFailed:true, kind:'notFound'};\n          \/\/ Deliberately do NOT promote the VIN into page state. The buyer\n          \/\/ searched by plate and never supplied a VIN, so it stays server-side\n          \/\/ in the `vp_vin` session key. Leaving `vin` empty also keeps\n          \/\/ buildCheckoutUrl() on the ?plate= form, so the resolved VIN never\n          \/\/ reaches the URL bar either. Checkout is unblocked by the\n          \/\/ `vinResolved` flag below, not by the VIN itself.\n          return {\n            vinMasked:    (json.data.vinMasked || '').trim(),\n            vinResolved:  true,\n            manufacturer: (json.data.manufacturer || '').trim(),\n            model:        (json.data.model        || '').trim(),\n            year:         String(json.data.year   || '').trim(),\n            recalls:      json.data.recalls || null\n          };\n        })\n        .catch(function(){ return {plateFailed:true, kind:'error'}; });\n    } catch(e) { return Promise.resolve({plateFailed:true, kind:'error'}); }\n  }\n\n  \/**\n   * Which failure the server described. The distinction is worth keeping: an unsupported country is\n   * permanent and the buyer should go straight to the VIN, a rate-limit or network error is\n   * temporary, and a genuine miss means the registry simply has no such plate. All three end at the\n   * same VIN prompt, but they should not claim the same cause.\n   *\/\n  function plateFailure(json) {\n    var d = (json && json.data) || {};\n    var kind = d.unsupported ? 'unsupported'\n             \/\/ Checked before rateLimited: the day gate sets BOTH flags so an older cached copy\n             \/\/ of this script still degrades to the generic \"try the VIN\" message.\n             : d.dailyLimit  ? 'dailyLimit'\n             : d.rateLimited ? 'rateLimited'\n             : d.notFound    ? 'notFound'\n             : 'error';\n    return {plateFailed:true, kind:kind};\n  }\n\n  \/\/ Branch on what we got from the URL: if a plate was submitted, resolve\n  \/\/ it via the plate endpoint (which returns the VIN + basic vehicle data);\n  \/\/ otherwise fall through to the existing VIN preview.\n  var vinDataPromise = plate && !vin\n    ? fetchPlateData(plate, countryIso)\n    : (vin ? fetchVinData(vin) : Promise.resolve(null));\n\n  \/\/ INSTANT reveal waits for the real decode (the tight ticker outpaces the\n  \/\/ lookup, and completing without a vehicle reads as broken). The interval\n  \/\/ below holds at 96% until this flips; the timer caps a hung request.\n  var vinDataSettled = false;\n  vinDataPromise.then(function(){ vinDataSettled = true; }, function(){ vinDataSettled = true; });\n  \/\/ Plate journeys get 35s to match the WP-side plate-preview cap \u2014 the 96% hold must\n  \/\/ outlast the slowest honest registry answer or a slow plate lookup completes into a\n  \/\/ page with no vehicle on it. VIN journeys keep the original 12s: their decode is\n  \/\/ fast and a longer hold would only stretch the normal animation.\n  setTimeout(function(){ vinDataSettled = true; }, (plate && !vin) ? 35000 : 12000);\n\n  function setProgress(pct) {\n    var offset = CIRC - (pct \/ 100) * CIRC;\n    if (ringFill) ringFill.style.strokeDashoffset = offset;\n    if (pctEl)    pctEl.textContent = pct + '%';\n\n    if (stepEl && steps.length) {\n      var idx = Math.min(Math.floor((pct \/ 100) * steps.length), steps.length - 1);\n      if (idx !== lastStep) {\n        stepEl.style.opacity = '0';\n        setTimeout(function(){ stepEl.textContent = steps[idx]; stepEl.style.opacity = '1'; }, 150);\n        lastStep = idx;\n      }\n    }\n\n    var shouldCheck = Math.floor((pct \/ 100) * feats.length);\n    while (checked < shouldCheck && checked < feats.length) {\n      feats[checked].classList.add('is-checked');\n      checked++;\n    }\n\n    \/\/ Mirror the checking progress in the floating buy-bar.\n    if (fabBarEl) fabBarEl.style.width = pct + '%';\n  }\n\n  \/\/ The ring resolves in place at 100%: stroke goes green, \"100%\" steps aside,\n  \/\/ and a checkmark draws inside the circle the shopper has been watching. Runs\n  \/\/ BEFORE showSuccess() swaps in the vehicle panel, so the completion is seen.\n  function completeRing() {\n    \/\/ Flip on the next frame: setProgress(100) has just written a new\n    \/\/ stroke-dashoffset, and same-frame class + property changes get coalesced\n    \/\/ into one style recalc, which skips the closing transition.\n    if (ringWrapEl) requestAnimationFrame(function(){ ringWrapEl.classList.add('is-done'); });\n\n    \/\/ The badge belongs to the completion, not to the panel swap \u2014 leaving it on\n    \/\/ \"checking in progress\" for the ~1s hold contradicts the finished ring.\n    if (badgeEl) {\n      badgeEl.innerHTML = '<span class=\"vp-rc-badge-dot\" style=\"background:#10B981\"><\/span> ' +\n        (i18n.badgeDone || 'Check complete');\n    }\n\n    \/\/ Start the swap almost immediately, NOT after the check finishes drawing:\n    \/\/ a 340ms wait left \"Analyzing Vehicle History\" sitting under a completed\n    \/\/ green checkmark, and by the time the crossfade dip cleared there was under\n    \/\/ a second of \"Report is ready\" left before the panel took the screen. The\n    \/\/ headline now changes WHILE the check draws, which is also the beat that\n    \/\/ makes the two read as one event. The step line goes with it.\n    setTimeout(function(){\n      if (stepEl) stepEl.style.opacity = '0';\n      if (loadHEl && i18n.readyHeadline) {\n        loadHEl.style.opacity = '0';\n        setTimeout(function(){\n          loadHEl.textContent = i18n.readyHeadline;\n          loadHEl.style.opacity = '1';\n        }, 180);\n      }\n    }, 120);\n  }\n\n  function showSuccess() {\n    for (var i = checked; i < feats.length; i++) feats[i].classList.add('is-checked');\n\n    if (loadEl) {\n      loadEl.style.transition = 'opacity 0.3s ease';\n      loadEl.style.opacity = '0';\n      setTimeout(function(){\n        loadEl.style.display = 'none';\n        if (succEl) { succEl.style.display = 'flex'; succEl.style.animation = U + '_fadeIn 0.5s ease'; }\n      }, 300);\n    }\n\n    \/\/ Show the masked VIN tail in the verify block. Full VIN never written here.\n    if (vin && vvinEl) vvinEl.textContent = INSTANT ? vin : vinTail(vin);\n    if (vin && vverifyEl) vverifyEl.style.display = '';\n\n    \/\/ INSTANT mode: complete the floating buy-bar \u2014 fill the bar, flip the status\n    \/\/ to \"check complete\", and enable the \"Get Full Report\" button.\n    if (INSTANT) {\n      if (fabBarEl) fabBarEl.style.width = '100%';\n      if (fabEl)    fabEl.classList.add('is-done');\n      \/\/ The green is-done state already says the check finished; the status\n      \/\/ line carries the delivery promise instead of repeating it.\n      if (fabStatEl) fabStatEl.textContent = (i18n.timing || i18n.badgeDone || 'Check complete');\n      if (fabCtaEl) { fabCtaEl.disabled = false; fabCtaEl.setAttribute('aria-disabled', 'false'); }\n      \/\/ Safety net: if no brand logo has resolved shortly after completion\n      \/\/ (slow\/failed lookup), stop the ring and show the generic glyph.\n      setTimeout(fabLogoFallback, 4000);\n\n      \/\/ Notify any host listener (kept for forward-compat; no redirect here).\n      try {\n        document.dispatchEvent(new CustomEvent('mrvin_proc_complete', { detail: { uid: U } }));\n      } catch (e) {\n        window.mrvinProcComplete = true;\n        try { document.dispatchEvent(new Event('mrvin_proc_complete')); } catch (e2) {}\n      }\n    }\n  }\n\n  \/* Free recall teaser. Only ever ADDS to the page: no data, count 0, or a missing element all\n     leave the layout exactly as server-rendered. Teaser text\/dates go in via textContent, so\n     nothing from the API is ever parsed as HTML. *\/\n  function renderRecalls(rc) {\n    if (!rc || !rc.count || !rc.items || !rc.items.length) return;\n    var flag = document.getElementById(U + '_recalls_flag');\n    if (flag) { flag.textContent = '! ' + rc.count; flag.hidden = false; }\n    var panel = document.getElementById(U + '_recalls');\n    var list  = document.getElementById(U + '_recalls_list');\n    if (!panel || !list) return;\n    var countEl = document.getElementById(U + '_recalls_count');\n    if (countEl) countEl.textContent = rc.count;\n    list.textContent = '';\n    \/\/ Four rows keep the card scannable; the count chip already says how many exist in total.\n    rc.items.slice(0, 4).forEach(function(item){\n      var li = document.createElement('li');\n      li.className = 'vp-recalls-item';\n      var meta = document.createElement('div');\n      meta.className = 'vp-recalls-meta';\n      if (item.date) {\n        var dateEl = document.createElement('span');\n        dateEl.textContent = item.date;\n        meta.appendChild(dateEl);\n      }\n      if (item.component) {\n        var catEl = document.createElement('span');\n        \/\/ \"FUEL SYSTEM, GASOLINE\" \u2192 \"Fuel System, Gasoline\" (registry categories arrive shouty)\n        catEl.textContent = String(item.component).toLowerCase().replace(\/(^|[\\s,\\\/(])\\S\/g, function(m){ return m.toUpperCase(); });\n        meta.appendChild(catEl);\n      }\n      var teaserEl = document.createElement('div');\n      teaserEl.className = 'vp-recalls-teaser';\n      teaserEl.textContent = item.teaser || '';\n      if (meta.childNodes.length) li.appendChild(meta);\n      li.appendChild(teaserEl);\n      list.appendChild(li);\n    });\n    panel.hidden = false;\n  }\n\n  function applyVinData(data) {\n    \/\/ A failure object carries no vehicle \u2014 it flows through the same promise so the completion\n    \/\/ handler can see WHY nothing arrived, but there is nothing here to render.\n    if (!data || data.plateFailed) return;\n\n    renderRecalls(data.recalls);\n\n    var hasMake  = !!data.manufacturer;\n    var hasModel = !!data.model;\n    var hasYear  = !!data.year;\n\n    if ((hasMake || hasModel) && vnameEl) {\n      var parts = [data.manufacturer, data.model].filter(Boolean);\n      vnameEl.textContent = parts.join(' ');\n      if (chipEl) chipEl.style.display = 'flex';\n      \/\/ Mirror the resolved make + model into the floating buy-bar.\n      if (fabNameEl) fabNameEl.textContent = parts.join(' ');\n    }\n    if (hasYear && vyearEl) vyearEl.textContent = data.year;\n\n    \/\/ VIN flow: the buyer typed the VIN themselves, so INSTANT may echo it in\n    \/\/ full. Plate flow never receives the real VIN \u2014 only `vinMasked`.\n    var vinShown = data.vin ? (INSTANT ? data.vin : vinTail(data.vin))\n                            : (data.vinMasked || '');\n    if (vinShown && vvinEl) vvinEl.textContent = vinShown;\n    if (vinShown && vverifyEl) vverifyEl.style.display = '';\n\n    \/\/ Once we actually have vehicle data, swap the success headline\/sub from the\n    \/\/ generic \"VIN Check Complete\" to the more direct \"We found your vehicle \u2014\n    \/\/ verify this is the right one\" message.\n    if ((hasMake || hasModel) && succHEl && i18n.vehicleFoundHeadline) {\n      succHEl.textContent = i18n.vehicleFoundHeadline;\n    }\n    if ((hasMake || hasModel) && succSubEl && i18n.vehicleFoundSub) {\n      succSubEl.textContent = i18n.vehicleFoundSub;\n    }\n\n    if (hasMake) tryShowLogo(data.manufacturer);\n    else fabLogoFallback();   \/\/ no make resolved \u2192 stop the loading ring\n\n    \/\/ Mirror the fresh vehicle into the checkout \"You're checking\u2026\" box\n    \/\/ (.ccz-topbox in the checkout-design snippet). It renders server-side with\n    \/\/ EMPTY vehicle fields when the session data is stale, so this is what fills\n    \/\/ it \u2014 instantly, once the lookup resolves and the animation has ended.\n    if (INSTANT && (hasMake || hasModel)) {\n      var cczName = document.getElementById('ccz-vehicle-name');\n      if (cczName) {\n        var cczLbl = [data.manufacturer, data.model].filter(Boolean).join(' ');\n        if (hasYear) cczLbl += ' (' + data.year + ')';\n        cczName.textContent = cczLbl;\n      }\n      var cczVin = document.getElementById('ccz-vehicle-vin');\n      if (cczVin && vinShown && !cczVin.textContent.replace(\/\\s\/g, '')) {\n        cczVin.textContent = vinShown;\n      }\n      \/\/ Tell the checkout evidence carousel (snippet 9, module 10c) which\n      \/\/ vehicle resolved so it can swap its \"Recent order\" story to a\n      \/\/ matching make\/model. Detail carries make\/model only, never the VIN.\n      \/\/ `vinResolved` is a plain boolean (again, never the VIN) telling snippet\n      \/\/ 9's VIN guard that the server now holds a usable VIN in the session \u2014\n      \/\/ without it, a ?plate= checkout stays blocked because SESSION_VIN_OK was\n      \/\/ baked false at PHP render time, before this lookup landed.\n      try {\n        document.dispatchEvent(new CustomEvent('mrvin_vehicle', {\n          detail: {\n            manufacturer: data.manufacturer || '',\n            model:        data.model || '',\n            vinResolved:  !!(data.vin || data.vinResolved)\n          }\n        }));\n      } catch (e) {}\n    }\n  }\n\n  \/* \u2500\u2500 Floating buy-bar behaviour (INSTANT only) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\n   *  - Slides up once the user scrolls past the top of the preview.\n   *  - Its \"Get Full Report\" button jumps to the real checkout form (it only\n   *    becomes enabled once the checking animation completes \u2014 see showSuccess). *\/\n  \/\/ Collapsed includes panel: the toggle expands\/hides the full feature list.\n  if (INSTANT) {\n    var incT = document.getElementById(U + '_inc_toggle');\n    if (incT) incT.addEventListener('click', function(){\n      var panel = incT.closest('.vp-includes');\n      if (!panel) return;\n      var open = panel.classList.toggle('is-open');\n      incT.setAttribute('aria-expanded', open ? 'true' : 'false');\n      var s = incT.querySelector('[data-show]'), h = incT.querySelector('[data-hide]');\n      if (s) s.hidden = open;\n      if (h) h.hidden = !open;\n    });\n  }\n\n  if (INSTANT && fabEl) {\n    \/\/ Seed the buy-bar with the user's own VIN tail \/ plate immediately so it\n    \/\/ never shows a stale or placeholder vehicle while checking; applyVinData\n    \/\/ upgrades it to the resolved make + model once the lookup resolves.\n    if (fabNameEl) {\n      if (plate)    fabNameEl.textContent = plate;\n      else if (vin) fabNameEl.textContent = '\u2022\u2022\u2022 ' + vinTail(vin);\n    }\n    if (fabCtaEl) {\n      fabCtaEl.addEventListener('click', function(e){\n        e.preventDefault();\n        if (fabCtaEl.disabled) return;\n        scrollToCheckout();\n      });\n    }\n    var sentinel = document.getElementById(U + '_fab_sentinel');\n    if (sentinel && 'IntersectionObserver' in window) {\n      new IntersectionObserver(function(entries){\n        entries.forEach(function(en){\n          \/\/ Show the bar when the sentinel (top of the preview) is scrolled away.\n          if (en.isIntersecting) fabEl.classList.remove('is-visible');\n          else                   fabEl.classList.add('is-visible');\n        });\n      }, { threshold: 0 }).observe(sentinel);\n    } else {\n      \/\/ No IntersectionObserver: reveal on a simple scroll threshold.\n      window.addEventListener('scroll', function(){\n        if (window.pageYOffset > 220) fabEl.classList.add('is-visible');\n        else fabEl.classList.remove('is-visible');\n      }, { passive: true });\n    }\n  }\n\n  \/\/ Animation runs ~7s on average (was ~4.6s) \u2014 gives the backend headroom to deliver\n  \/\/ make\/model\/year before the success reveal. INSTANT mode (embedded above the\n  \/\/ checkout) runs a tighter ~2.5s ticker instead: the shopper should reach the\n  \/\/ form fast, and applyVinData updates the rendered chip in place if the lookup\n  \/\/ resolves after the reveal (vinDataPromise.then keeps listening for late data).\n  \/\/ Instant: many small steps on a short cadence so the ring GLIDES (big jumps\n  \/\/ kept restarting the 0.6s ring transition mid-flight and read as stutter on\n  \/\/ phones); ~4.2s total. Standalone keeps its original pacing.\n  var TICK_MS   = INSTANT ? 250 : 1000;\n  var TICK_STEP = INSTANT ? 5   : 11;\n  var TICK_RAND = INSTANT ? 3   : 9;\n  var iv = setInterval(function(){\n    progress = Math.min(100, progress + Math.floor(Math.random() * TICK_RAND) + TICK_STEP);\n    \/\/ Hold just short of done until the decode settles (instant mode only).\n    if (INSTANT && progress >= 100 && !vinDataSettled) progress = 96;\n    setProgress(progress);\n\n    if (progress >= 100) {\n      clearInterval(iv);\n      completeRing();\n      \/\/ Hold for the ~780ms of completion beats PLUS a readable beat on\n      \/\/ \"Report is ready\" \u2014 at 1500 the headline landed with ~900ms to live and\n      \/\/ was already fading; you could watch the whole page and miss it.\n      setTimeout(function(){\n        showSuccess();\n        vinDataPromise.then(function(d){\n          applyVinData(d);\n          \/\/ A plate that resolved to nothing: ask for the VIN rather than ending on a page that\n          \/\/ shows no car and a pay button that quietly will not work.\n          if (d && d.plateFailed) { showPlateFallback(d.kind); return; }\n          \/\/ No make\/model resolved -> offer \"did you mean\" \/ brand fallback.\n          if (!d || (!d.manufacturer && !d.model)) maybeSuggest(vin);\n        }).catch(function(){ maybeSuggest(vin); });\n      }, INSTANT ? 1500 : 2600);\n    }\n  }, TICK_MS);\n})();\n<\/script>\n    <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-229","page","type-page","status-publish","hentry"],"blocksy_meta":[],"yoast_head":"<title>Producto - MrVIN<\/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:\/\/www.mrvin.com\/es\/product\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Producto - MrVIN\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mrvin.com\/es\/product\/\" \/>\n<meta property=\"og:site_name\" content=\"MrVIN\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-16T06:16:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mrvin.com\/wp-content\/uploads\/logo\/mrvin-social-preview.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.mrvin.com\/wp-content\/uploads\/logo\/mrvin-social-preview.png\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mrvin.com\\\/es\\\/product\\\/\",\"url\":\"https:\\\/\\\/www.mrvin.com\\\/es\\\/product\\\/\",\"name\":\"Producto - MrVIN\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mrvin.com\\\/#website\"},\"datePublished\":\"2026-03-19T09:08:07+00:00\",\"dateModified\":\"2026-06-16T06:16:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mrvin.com\\\/es\\\/product\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mrvin.com\\\/es\\\/product\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mrvin.com\\\/es\\\/product\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mrvin.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Producto\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mrvin.com\\\/#website\",\"url\":\"https:\\\/\\\/www.mrvin.com\\\/\",\"name\":\"MrVIN\",\"description\":\"Get instant vehicle history reports\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mrvin.com\\\/#organization\"},\"alternateName\":[\"Mr VIN\",\"Mr. VIN\",\"MRVIN\",\"Mr.VIN\",\"MrVIN.com\"],\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mrvin.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mrvin.com\\\/#organization\",\"name\":\"MrVIN\",\"url\":\"https:\\\/\\\/www.mrvin.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.mrvin.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mrvin.com\\\/wp-content\\\/uploads\\\/email\\\/mrvin-logo-horizontal.png\",\"contentUrl\":\"https:\\\/\\\/www.mrvin.com\\\/wp-content\\\/uploads\\\/email\\\/mrvin-logo-horizontal.png\",\"width\":450,\"height\":123,\"caption\":\"MrVIN\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mrvin.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/company\\\/mrvin\\\/\",\"https:\\\/\\\/www.instagram.com\\\/mrvin_com\\\/\",\"https:\\\/\\\/www.facebook.com\\\/people\\\/Mr-VIN\\\/61590451420892\\\/\",\"https:\\\/\\\/www.wikidata.org\\\/wiki\\\/Q141044861\",\"https:\\\/\\\/www.trustpilot.com\\\/review\\\/mrvin.com\",\"https:\\\/\\\/www.youtube.com\\\/@mrvin_com\",\"https:\\\/\\\/x.com\\\/mrvin_com\",\"https:\\\/\\\/www.crunchbase.com\\\/organization\\\/mrvin\"],\"alternateName\":[\"Mr VIN\",\"Mr. VIN\",\"MRVIN\",\"Mr.VIN\",\"MrVIN.com\"],\"identifier\":{\"@type\":\"PropertyValue\",\"propertyID\":\"Wikidata\",\"value\":\"Q141044861\"},\"legalName\":\"VERIFY SIA\",\"foundingDate\":\"2026-01-20\",\"vatID\":\"LV40203713379\",\"taxID\":\"40203713379\",\"email\":\"info@mrvin.com\",\"address\":{\"@type\":\"PostalAddress\",\"streetAddress\":\"Roberta Hir\u0161a 1\",\"addressLocality\":\"R\u012bga\",\"postalCode\":\"LV-1045\",\"addressCountry\":\"LV\"},\"areaServed\":\"Europe\",\"knowsAbout\":[\"Vehicle history reports\",\"Vehicle identification number\",\"Odometer fraud detection\",\"Used car inspection\"]}]}<\/script>","yoast_head_json":{"title":"Producto - MrVIN","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:\/\/www.mrvin.com\/es\/product\/","og_locale":"es_ES","og_type":"article","og_title":"Producto - MrVIN","og_url":"https:\/\/www.mrvin.com\/es\/product\/","og_site_name":"MrVIN","article_modified_time":"2026-06-16T06:16:50+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.mrvin.com\/wp-content\/uploads\/logo\/mrvin-social-preview.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_image":"https:\/\/www.mrvin.com\/wp-content\/uploads\/logo\/mrvin-social-preview.png","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mrvin.com\/es\/product\/","url":"https:\/\/www.mrvin.com\/es\/product\/","name":"Producto - MrVIN","isPartOf":{"@id":"https:\/\/www.mrvin.com\/#website"},"datePublished":"2026-03-19T09:08:07+00:00","dateModified":"2026-06-16T06:16:50+00:00","breadcrumb":{"@id":"https:\/\/www.mrvin.com\/es\/product\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mrvin.com\/es\/product\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.mrvin.com\/es\/product\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mrvin.com\/es\/"},{"@type":"ListItem","position":2,"name":"Producto"}]},{"@type":"WebSite","@id":"https:\/\/www.mrvin.com\/#website","url":"https:\/\/www.mrvin.com\/","name":"MrVIN","description":"Get instant vehicle history reports","publisher":{"@id":"https:\/\/www.mrvin.com\/#organization"},"alternateName":["Mr VIN","Mr. VIN","MRVIN","Mr.VIN","MrVIN.com"],"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mrvin.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.mrvin.com\/#organization","name":"MrVIN","url":"https:\/\/www.mrvin.com\/","logo":{"@type":"ImageObject","@id":"https:\/\/www.mrvin.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.mrvin.com\/wp-content\/uploads\/email\/mrvin-logo-horizontal.png","contentUrl":"https:\/\/www.mrvin.com\/wp-content\/uploads\/email\/mrvin-logo-horizontal.png","width":450,"height":123,"caption":"MrVIN"},"image":{"@id":"https:\/\/www.mrvin.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/mrvin\/","https:\/\/www.instagram.com\/mrvin_com\/","https:\/\/www.facebook.com\/people\/Mr-VIN\/61590451420892\/","https:\/\/www.wikidata.org\/wiki\/Q141044861","https:\/\/www.trustpilot.com\/review\/mrvin.com","https:\/\/www.youtube.com\/@mrvin_com","https:\/\/x.com\/mrvin_com","https:\/\/www.crunchbase.com\/organization\/mrvin"],"alternateName":["Mr VIN","Mr. VIN","MRVIN","Mr.VIN","MrVIN.com"],"identifier":{"@type":"PropertyValue","propertyID":"Wikidata","value":"Q141044861"},"legalName":"VERIFY SIA","foundingDate":"2026-01-20","vatID":"LV40203713379","taxID":"40203713379","email":"info@mrvin.com","address":{"@type":"PostalAddress","streetAddress":"Roberta Hir\u0161a 1","addressLocality":"R\u012bga","postalCode":"LV-1045","addressCountry":"LV"},"areaServed":"Europe","knowsAbout":["Vehicle history reports","Vehicle identification number","Odometer fraud detection","Used car inspection"]}]}},"_links":{"self":[{"href":"https:\/\/www.mrvin.com\/es\/wp-json\/wp\/v2\/pages\/229","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mrvin.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.mrvin.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.mrvin.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mrvin.com\/es\/wp-json\/wp\/v2\/comments?post=229"}],"version-history":[{"count":1,"href":"https:\/\/www.mrvin.com\/es\/wp-json\/wp\/v2\/pages\/229\/revisions"}],"predecessor-version":[{"id":230,"href":"https:\/\/www.mrvin.com\/es\/wp-json\/wp\/v2\/pages\/229\/revisions\/230"}],"wp:attachment":[{"href":"https:\/\/www.mrvin.com\/es\/wp-json\/wp\/v2\/media?parent=229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}