{"id":2943,"date":"2026-02-05T16:46:12","date_gmt":"2026-02-05T19:46:12","guid":{"rendered":"http:\/\/nutrideportiva.cl\/?page_id=2943"},"modified":"2026-02-05T16:46:15","modified_gmt":"2026-02-05T19:46:15","slug":"entrenamiento","status":"publish","type":"page","link":"https:\/\/nutrideportiva.cl\/index.php\/entrenamiento\/","title":{"rendered":"Entrenamiento"},"content":{"rendered":"\n<!doctype html>\n<html lang=\"es\">\n<head>\n  <meta charset=\"utf-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" \/>\n  <title>Herramientas de Calculo: 1RM + Carga Aer\u00f3bica + Rutinas Full + Nutrici\u00f3n<\/title>\n\n  <style>\n    :root{\n      --bg:#ffffff;\n      --card:#ffffff;\n      --muted:#4b5563;\n      --text:#111827;\n      --accent:#c40000;\n      --line:#e5e7eb;\n      --ok:#15803d;\n      --warn:#b45309;\n      --radius:14px;\n\n      --inputBg:#ffffff;\n      --theadBg:#f9fafb;\n      --btnBg:#f3f4f6;\n      --btnBgHover:#e5e7eb;\n\n      --btnAccentBg:#fee2e2;\n      --btnAccentBorder:#fecaca;\n      --btnAccentHover:#fecaca;\n    }\n\n    *{ box-sizing:border-box; }\n    body{\n      margin:0;\n      font-family:system-ui,-apple-system,Segoe UI,Roboto,Arial;\n      background:var(--bg);\n      color:var(--text);\n    }\n    header{ padding:22px 16px 10px; max-width:1100px; margin:0 auto; }\n    h1{ margin:0 0 6px; font-size:20px; }\n    p{ margin:6px 0; color:var(--muted); line-height:1.4; }\n\n    .wrap{ max-width:1100px; margin:0 auto; padding:10px 16px 36px; display:grid; gap:14px; }\n\n    .card{\n      background:var(--card);\n      border:1px solid var(--line);\n      border-radius:var(--radius);\n      padding:14px;\n      box-shadow:0 2px 10px rgba(0,0,0,0.04);\n    }\n\n    .row{ display:flex; flex-wrap:wrap; gap:10px; align-items:end; }\n    .grid2{ display:grid; grid-template-columns:1fr 1fr; gap:12px; }\n    @media (max-width: 900px){ .grid2{ grid-template-columns:1fr; } }\n\n    label{ display:block; font-size:12px; color:var(--muted); margin-bottom:6px; }\n    input, select, button, textarea{\n      font:inherit;\n      color:var(--text);\n      background:var(--inputBg);\n      border:1px solid var(--line);\n      border-radius:10px;\n      padding:10px 10px;\n      outline:none;\n    }\n    input::placeholder, textarea::placeholder{ color:#9ca3af; }\n    input[type=\"number\"]{ width:160px; }\n    textarea{ width:100%; min-height:70px; resize:vertical; }\n\n    button{ cursor:pointer; background:var(--btnBg); }\n    button:hover{ background:var(--btnBgHover); }\n\n    .btn-accent{\n      background:var(--btnAccentBg);\n      border-color:var(--btnAccentBorder);\n    }\n    .btn-accent:hover{ background:var(--btnAccentHover); }\n\n    table{ width:100%; border-collapse:collapse; overflow:hidden; border-radius:12px; }\n    th, td{ border-bottom:1px solid var(--line); padding:10px 8px; vertical-align:top; }\n    th{\n      text-align:left;\n      font-size:12px;\n      color:var(--muted);\n      background:var(--theadBg);\n      position:sticky;\n      top:0;\n      z-index:1;\n    }\n    td{ font-size:13px; }\n\n    .small{ font-size:12px; color:var(--muted); }\n    .muted{ color:var(--muted); }\n    .result{ color:var(--accent); font-weight:800; }\n    .ok{ color:var(--ok); font-weight:800; }\n    .warn{ color:var(--warn); font-weight:700; }\n\n    .pill{\n      display:inline-block;\n      padding:3px 8px;\n      border:1px solid var(--line);\n      border-radius:999px;\n      font-size:12px;\n      color:var(--muted);\n      background:#fff;\n    }\n\n    .section-title{ display:flex; justify-content:space-between; align-items:baseline; gap:10px; margin-bottom:10px; }\n    .section-title h2{ margin:0; font-size:16px; }\n\n    .two-col{ display:grid; grid-template-columns: 1.2fr .8fr; gap:12px; }\n    @media (max-width: 900px){ .two-col{ grid-template-columns:1fr; } }\n\n    .footer-note{ color:var(--muted); font-size:12px; margin-top:8px; }\n    .hr{ height:1px; background:var(--line); margin:10px 0; border:0; }\n  <\/style>\n<\/head>\n\n<body>\n<header>\n  <h1>Herramientas de Auto Calculo<\/h1>\n  <p>1RM (todas las f\u00f3rmulas) \u2022 Carga aer\u00f3bica\/zonas \u2022 Rutinas FullBody (1\u20135) \u2022 Nutrici\u00f3n con objetivo (subir\/bajar\/mantener) \u2022 Guardado autom\u00e1tico.<\/p>\n<\/header>\n\n<div class=\"wrap\">\n\n  <!-- =========================\n       0) CONTROLES GENERALES\n  ========================== -->\n  <section class=\"card\">\n    <div class=\"section-title\">\n      <h2>0) Controles generales<\/h2>\n      <span class=\"pill\">autosave \u2713<\/span>\n    <\/div>\n\n    <div class=\"row\">\n      <div>\n        <label>Redondeo de cargas<\/label>\n        <select id=\"rounding\">\n          <option value=\"none\">Sin redondeo<\/option>\n          <option value=\"0.5\">A 0.5 kg<\/option>\n          <option value=\"1\">A 1 kg<\/option>\n          <option value=\"2.5\">A 2.5 kg<\/option>\n          <option value=\"5\">A 5 kg<\/option>\n        <\/select>\n      <\/div>\n\n      <div>\n        <label>Modo 1RM<\/label>\n        <select id=\"mode\">\n          <option value=\"shared\">Replicar datos (1 peso + 1 reps para todas)<\/option>\n          <option value=\"perRow\">Individual por f\u00f3rmula (cada fila con inputs)<\/option>\n        <\/select>\n      <\/div>\n\n      <div>\n        <button id=\"clearAll\" class=\"btn-accent\">Borrar todo (reset)<\/button>\n      <\/div>\n    <\/div>\n\n    <p class=\"footer-note\">Tip: usa redondeo 2.5 kg si trabajas con discos est\u00e1ndar, o 0.5\u20131 kg si tienes microcargas.<\/p>\n  <\/section>\n\n  <!-- =========================\n       1) 1RM MULTI-F\u00d3RMULA\n  ========================== -->\n  <section class=\"card\">\n    <div class=\"section-title\">\n      <h2>1) Calculadora 1RM (todas las f\u00f3rmulas)<\/h2>\n      <span class=\"pill\">promedio + rango<\/span>\n    <\/div>\n\n    <div class=\"row\">\n      <div>\n        <label>Repeticiones (1\u201320)<\/label>\n        <input id=\"sharedReps\" type=\"number\" min=\"1\" max=\"20\" step=\"1\" placeholder=\"Ej: 8\" \/>\n      <\/div>\n\n      <div>\n        <label>Peso (kg)<\/label>\n        <input id=\"sharedWeight\" type=\"number\" min=\"0\" step=\"0.5\" placeholder=\"Ej: 80\" \/>\n      <\/div>\n\n      <div>\n        <button id=\"btnCalcRM\">Calcular 1RM<\/button>\n      <\/div>\n    <\/div>\n\n    <p class=\"footer-note\">Mejor precisi\u00f3n cuando reps \u2264 10\u201312. Si reps es muy alto, usa el promedio como referencia (no como verdad absoluta).<\/p>\n\n    <div style=\"margin-top:12px; overflow:auto; max-height:420px;\">\n      <table id=\"rmTable\" aria-label=\"Tabla 1RM\">\n        <thead>\n          <tr>\n            <th>F\u00f3rmula<\/th>\n            <th>A\u00f1o<\/th>\n            <th>Reps<\/th>\n            <th>Peso<\/th>\n            <th>1RM<\/th>\n            <th>Nota t\u00e9cnica<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody><!-- JS --><\/tbody>\n      <\/table>\n    <\/div>\n\n    <div class=\"two-col\" style=\"margin-top:12px;\">\n      <div class=\"card\" style=\"padding:12px;\">\n        <div class=\"row\">\n          <div>\n            <div class=\"small\">Promedio 1RM<\/div>\n            <div id=\"rmAvg\" class=\"result\">\u2014<\/div>\n          <\/div>\n          <div>\n            <div class=\"small\">M\u00edn \/ M\u00e1x<\/div>\n            <div id=\"rmMinMax\" class=\"result\">\u2014<\/div>\n          <\/div>\n          <div>\n            <div class=\"small\">F\u00f3rmulas v\u00e1lidas<\/div>\n            <div id=\"rmCount\" class=\"ok\">\u2014<\/div>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"card\" style=\"padding:12px;\">\n        <div class=\"small\">Atajo para rutinas<\/div>\n        <p class=\"muted\" style=\"margin:6px 0 0;\">\n          Copia el 1RM promedio y p\u00e9galo en \u201cRM para rutinas\u201d (si no tienes un 1RM real medido).\n        <\/p>\n      <\/div>\n    <\/div>\n  <\/section>\n\n  <!-- =========================\n       2) RM PARA RUTINAS\n  ========================== -->\n  <section class=\"card\">\n    <div class=\"section-title\">\n      <h2>2) RM para rutinas (ingresa tus 1RM por ejercicio)<\/h2>\n      <span class=\"pill\">1 set \u2192 5 rutinas<\/span>\n    <\/div>\n\n    <div class=\"row\">\n      <div><label>Bench Press (kg)<\/label><input type=\"number\" id=\"rmBench\" min=\"0\" step=\"0.5\" placeholder=\"Ej: 100\"><\/div>\n      <div><label>Squat (kg)<\/label><input type=\"number\" id=\"rmSquat\" min=\"0\" step=\"0.5\" placeholder=\"Ej: 140\"><\/div>\n      <div><label>Deadlift (kg)<\/label><input type=\"number\" id=\"rmDeadlift\" min=\"0\" step=\"0.5\" placeholder=\"Ej: 170\"><\/div>\n      <div><label>Leg Press (kg)<\/label><input type=\"number\" id=\"rmLegPress\" min=\"0\" step=\"0.5\" placeholder=\"Ej: 220\"><\/div>\n      <div><label>Shoulder Press (kg)<\/label><input type=\"number\" id=\"rmShoulder\" min=\"0\" step=\"0.5\" placeholder=\"Ej: 70\"><\/div>\n\n      <div>\n        <button id=\"calcRoutines\">Calcular pesos rutinas<\/button>\n      <\/div>\n    <\/div>\n\n    <p class=\"footer-note\">Los pesos \u201cproporcionales\u201d son gu\u00edas. Ajusta por t\u00e9cnica, RPE, fatiga, series efectivas y equipo disponible.<\/p>\n  <\/section>\n\n  <!-- =========================\n       3) RUTINAS FULL\n  ========================== -->\n  <section class=\"card\">\n    <div class=\"section-title\">\n      <h2>3) Rutinas FullBody (1\u20135) + carga aer\u00f3bica sugerida<\/h2>\n      <span class=\"pill\">tablas din\u00e1micas<\/span>\n    <\/div>\n    <div id=\"routinesContainer\" class=\"grid2\"><!-- JS --><\/div>\n  <\/section>\n\n  <!-- =========================\n       4) CARGA AER\u00d3BICA \/ FC \/ ZONAS\n  ========================== -->\n  <section class=\"card\">\n    <div class=\"section-title\">\n      <h2>4) Carga aer\u00f3bica (zonas + sesi\u00f3n sugerida)<\/h2>\n      <span class=\"pill\">salud \/ bajar \/ rendimiento<\/span>\n    <\/div>\n\n    <div class=\"row\">\n      <div><label>Edad (a\u00f1os)<\/label><input type=\"number\" id=\"age\" min=\"10\" max=\"100\" step=\"1\" placeholder=\"Ej: 30\"><\/div>\n      <div><label>Tiempo disponible (min)<\/label><input type=\"number\" id=\"minutes\" min=\"5\" max=\"300\" step=\"5\" placeholder=\"Ej: 30\"><\/div>\n      <div>\n        <label>Objetivo<\/label>\n        <select id=\"goal\">\n          <option value=\"salud\">Salud<\/option>\n          <option value=\"bajar\">Bajar de peso<\/option>\n          <option value=\"rendimiento\">Rendimiento<\/option>\n        <\/select>\n      <\/div>\n      <div>\n        <label>Sesiones\/semana (aer\u00f3bico)<\/label>\n        <select id=\"aeroDays\">\n          <option value=\"2\">2<\/option>\n          <option value=\"3\" selected>3<\/option>\n          <option value=\"4\">4<\/option>\n          <option value=\"5\">5<\/option>\n        <\/select>\n      <\/div>\n      <div><button id=\"calcHR\">Calcular zonas + sesi\u00f3n<\/button><\/div>\n    <\/div>\n\n    <div class=\"card\" style=\"margin-top:10px;\">\n      <div class=\"row\">\n        <div>\n          <div class=\"small\">HRmax estimada<\/div>\n          <div id=\"hrMaxOut\" class=\"result\">\u2014<\/div>\n        <\/div>\n        <div>\n          <div class=\"small\">Zona base (Z2 aprox.)<\/div>\n          <div id=\"hrZ2\" class=\"result\">\u2014<\/div>\n        <\/div>\n        <div>\n          <div class=\"small\">Zona intensa (intervalos)<\/div>\n          <div id=\"hrHI\" class=\"result\">\u2014<\/div>\n        <\/div>\n        <div>\n          <div class=\"small\">Tipo recomendado<\/div>\n          <div id=\"hrType\" class=\"ok\">\u2014<\/div>\n        <\/div>\n      <\/div>\n      <hr class=\"hr\"\/>\n      <div class=\"small\">Sesi\u00f3n sugerida (lista para copiar)<\/div>\n      <div id=\"aeroSession\" class=\"muted\" style=\"margin-top:6px;\">\u2014<\/div>\n      <p class=\"footer-note\">HRmax \u2248 208 \u2212 0.7\u00d7edad. Para personalizar fino, usa FC reposo (Karvonen) y\/o test de campo.<\/p>\n    <\/div>\n  <\/section>\n\n  <!-- =========================\n       5) NUTRICI\u00d3N (CON OBJETIVO)\n  ========================== -->\n  <section class=\"card\">\n    <div class=\"section-title\">\n      <h2>5) Nutrici\u00f3n (con objetivo obligatorio)<\/h2>\n      <span class=\"pill\">Mifflin + d\u00e9ficit\/super\u00e1vit<\/span>\n    <\/div>\n\n    <div class=\"row\">\n      <div>\n        <label>Objetivo<\/label>\n        <select id=\"nGoal\">\n          <option value=\"\" selected>\u2014 Selecciona \u2014<\/option>\n          <option value=\"cut\">Bajar (d\u00e9ficit)<\/option>\n          <option value=\"maintain\">Mantener<\/option>\n          <option value=\"bulk\">Subir (super\u00e1vit)<\/option>\n        <\/select>\n      <\/div>\n\n      <div>\n        <label>Ritmo (agresividad)<\/label>\n        <select id=\"nAgg\">\n          <option value=\"mild\" selected>Suave<\/option>\n          <option value=\"moderate\">Moderado<\/option>\n          <option value=\"aggressive\">Agresivo<\/option>\n        <\/select>\n      <\/div>\n\n      <div>\n        <label>Sexo<\/label>\n        <select id=\"sex\">\n          <option value=\"m\">Hombre<\/option>\n          <option value=\"f\">Mujer<\/option>\n        <\/select>\n      <\/div>\n\n      <div><label>Edad<\/label><input type=\"number\" id=\"nAge\" min=\"10\" max=\"100\" step=\"1\" placeholder=\"Ej: 30\"><\/div>\n      <div><label>Peso (kg)<\/label><input type=\"number\" id=\"nWeight\" min=\"0\" step=\"0.1\" placeholder=\"Ej: 80\"><\/div>\n      <div><label>Estatura (cm)<\/label><input type=\"number\" id=\"nHeight\" min=\"0\" step=\"1\" placeholder=\"Ej: 175\"><\/div>\n\n      <div>\n        <label>Actividad<\/label>\n        <select id=\"activity\">\n          <option value=\"1.2\">Sedentario (1.2)<\/option>\n          <option value=\"1.375\">Ligero (1.375)<\/option>\n          <option value=\"1.55\" selected>Moderado (1.55)<\/option>\n          <option value=\"1.725\">Alto (1.725)<\/option>\n          <option value=\"1.9\">Muy alto (1.9)<\/option>\n        <\/select>\n      <\/div>\n\n      <div><button id=\"calcNutri\">Calcular calor\u00edas + macros<\/button><\/div>\n    <\/div>\n\n    <div class=\"card\" style=\"margin-top:10px;\">\n      <div class=\"row\">\n        <div>\n          <div class=\"small\">BMR (Mifflin)<\/div>\n          <div id=\"bmrOut\" class=\"result\">\u2014<\/div>\n        <\/div>\n        <div>\n          <div class=\"small\">TDEE (actividad)<\/div>\n          <div id=\"tdeeOut\" class=\"result\">\u2014<\/div>\n        <\/div>\n        <div>\n          <div class=\"small\">Meta kcal\/d\u00eda<\/div>\n          <div id=\"kcalOut\" class=\"result\">\u2014<\/div>\n        <\/div>\n      <\/div>\n\n      <hr class=\"hr\"\/>\n\n      <div class=\"row\">\n        <div>\n          <div class=\"small\">Prote\u00ednas (g\/d\u00eda)<\/div>\n          <div id=\"pOut\" class=\"result\">\u2014<\/div>\n        <\/div>\n        <div>\n          <div class=\"small\">Carbohidratos (g\/d\u00eda)<\/div>\n          <div id=\"cOut\" class=\"result\">\u2014<\/div>\n        <\/div>\n        <div>\n          <div class=\"small\">Grasas (g\/d\u00eda)<\/div>\n          <div id=\"fOut\" class=\"result\">\u2014<\/div>\n        <\/div>\n      <\/div>\n\n      <div style=\"margin-top:10px;\">\n        <div class=\"small\">Notas \/ pauta pr\u00e1ctica<\/div>\n        <div id=\"nutriTips\" class=\"muted\" style=\"margin-top:6px;\">\u2014<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\" style=\"margin-top:10px;\">\n      <div class=\"section-title\"><h2 style=\"font-size:14px;\">Plantilla r\u00e1pida de d\u00eda<\/h2><span class=\"pill\">editable<\/span><\/div>\n      <label class=\"small\">Ejemplo simple (puedes editar y copiar)<\/label>\n      <textarea id=\"mealTemplate\" placeholder=\"Desayuno: ...&#10;Almuerzo: ...&#10;Cena: ...&#10;Colaciones: ...\"><\/textarea>\n      <p class=\"footer-note\">La plantilla no \u201ccalcula\u201d alimentos: es un bloc para que pegues tu pauta y la lleves al d\u00eda a d\u00eda.<\/p>\n    <\/div>\n  <\/section>\n\n<\/div>\n\n<script>\n\/* =========================\n   UTILIDADES\n========================= *\/\nconst $ = (sel, root=document) => root.querySelector(sel);\nconst clamp = (n, a, b) => Math.min(Math.max(n, a), b);\nconst toNum = (v) => {\n  const n = Number(v);\n  return Number.isFinite(n) ? n : 0;\n};\nconst roundTo = (value, step) => {\n  if (!step || step === \"none\") return value;\n  const s = Number(step);\n  if (!Number.isFinite(s) || s <= 0) return value;\n  return Math.round(value \/ s) * s;\n};\nconst fmtKg = (n) => `${n.toFixed(2)} kg`;\nconst fmtInt = (n) => `${Math.round(n)}`;\n\n\/* =========================\n   PERSISTENCIA (localStorage)\n========================= *\/\nconst LS_KEY = \"nutrideportiva_suite_white_v2\";\nconst loadState = () => {\n  try { return JSON.parse(localStorage.getItem(LS_KEY) || \"{}\"); }\n  catch { return {}; }\n};\nconst saveState = (patch) => {\n  const st = loadState();\n  const next = { ...st, ...patch };\n  localStorage.setItem(LS_KEY, JSON.stringify(next));\n  return next;\n};\nconst bindAutosave = (id) => {\n  const el = document.getElementById(id);\n  if (!el) return;\n  const st = loadState();\n  if (st[id] !== undefined) el.value = st[id];\n  el.addEventListener(\"input\", () => saveState({ [id]: el.value }));\n  el.addEventListener(\"change\", () => saveState({ [id]: el.value }));\n};\n\n\/* =========================\n   1RM: TODAS LAS F\u00d3RMULAS\n========================= *\/\nconst FORMULAS = [\n  { key:\"epley\",    name:\"Epley\",          year:1975, note:\"Buena pr\u00e1ctica general en reps bajas.\", calc:(w,r)=> w*(1+0.0333*r) },\n  { key:\"brzycki\",  name:\"Brzycki\",        year:1993, note:\"Precisa en 1\u201310 reps (t\u00edpico en fuerza).\", calc:(w,r)=> (r>=37?0:w*(36\/(37-r))) },\n  { key:\"mayhew\",   name:\"Mayhew et al.\",  year:1992, note:\"Usada mucho en press banca\/estimaciones.\", calc:(w,r)=> (100*w)\/(52.2+41.9*Math.exp(-0.055*r)) },\n  { key:\"lander\",   name:\"Lander (exp)\",   year:1985, note:\"Modelo exponencial cl\u00e1sico.\", calc:(w,r)=> (100*w)\/(48.8+53.8*Math.exp(-0.075*r)) },\n  { key:\"wathan\",   name:\"Wathan\",         year:1994, note:\"Muy similar a Lander (forma exponencial).\", calc:(w,r)=> (100*w)\/(48.8+53.8*Math.exp(-0.075*r)) },\n  { key:\"oconner\",  name:\"O'Conner et al.\",year:1989, note:\"Lineal simple, \u00fatil como referencia.\", calc:(w,r)=> w*(1+0.025*r) },\n  { key:\"lombardi\", name:\"Lombardi\",       year:1989, note:\"Potencia; suele subir menos con reps altas.\", calc:(w,r)=> (r<=0?0:w*Math.pow(r,0.10)) },\n  { key:\"schwartz\", name:\"Schwartz\",       year:1990, note:\"Potencia con exponente peque\u00f1o.\", calc:(w,r)=> (r<=0?0:w*Math.pow(r,0.075)) }\n];\n\nfunction renderRMTable(){\n  const tbody = $(\"#rmTable tbody\");\n  tbody.innerHTML = \"\";\n\n  const mode = $(\"#mode\").value;\n  const sharedReps = $(\"#sharedReps\").value;\n  const sharedWeight = $(\"#sharedWeight\").value;\n\n  for (const f of FORMULAS){\n    const repsId = `reps_${f.key}`;\n    const weightId = `w_${f.key}`;\n\n    const tr = document.createElement(\"tr\");\n    tr.innerHTML = `\n      <td><strong>${f.name}<\/strong><\/td>\n      <td>${f.year ?? \"\u2014\"}<\/td>\n      <td><input id=\"${repsId}\" type=\"number\" min=\"1\" max=\"20\" step=\"1\" placeholder=\"reps\" ${mode===\"shared\" ? \"disabled\" : \"\"}><\/td>\n      <td><input id=\"${weightId}\" type=\"number\" min=\"0\" step=\"0.5\" placeholder=\"kg\" ${mode===\"shared\" ? \"disabled\" : \"\"}><\/td>\n      <td class=\"result\" id=\"out_${f.key}\">\u2014<\/td>\n      <td class=\"small\">${f.note}<\/td>\n    `;\n    tbody.appendChild(tr);\n\n    if (mode === \"perRow\"){\n      bindAutosave(repsId);\n      bindAutosave(weightId);\n    } else {\n      $(\"#\"+repsId).value = sharedReps || \"\";\n      $(\"#\"+weightId).value = sharedWeight || \"\";\n    }\n  }\n  computeAllRM();\n}\n\nfunction getInputsForFormula(key){\n  const mode = $(\"#mode\").value;\n  if (mode === \"shared\"){\n    return {\n      r: clamp(toNum($(\"#sharedReps\").value), 0, 20),\n      w: Math.max(0, toNum($(\"#sharedWeight\").value))\n    };\n  }\n  return {\n    r: clamp(toNum($(`#reps_${key}`).value), 0, 20),\n    w: Math.max(0, toNum($(`#w_${key}`).value))\n  };\n}\n\nfunction computeAllRM(){\n  const rounding = $(\"#rounding\").value;\n  const values = [];\n\n  for (const f of FORMULAS){\n    const { r, w } = getInputsForFormula(f.key);\n    const outEl = $(`#out_${f.key}`);\n\n    if (w <= 0 || r <= 0){\n      outEl.textContent = \"\u2014\";\n      continue;\n    }\n\n    const raw = f.calc(w, r);\n    const safe = (Number.isFinite(raw) &#038;&#038; raw > 0) ? raw : 0;\n    const rounded = (rounding === \"none\") ? safe : roundTo(safe, rounding);\n\n    if (!rounded){\n      outEl.textContent = \"\u2014\";\n      continue;\n    }\n\n    outEl.textContent = fmtKg(rounded);\n    values.push(rounded);\n  }\n\n  if (!values.length){\n    $(\"#rmAvg\").textContent = \"\u2014\";\n    $(\"#rmMinMax\").textContent = \"\u2014\";\n    $(\"#rmCount\").textContent = \"0\";\n    return;\n  }\n\n  const avg = values.reduce((a,b)=>a+b,0)\/values.length;\n  const min = Math.min(...values);\n  const max = Math.max(...values);\n\n  $(\"#rmAvg\").textContent = fmtKg((rounding===\"none\")?avg:roundTo(avg, rounding));\n  $(\"#rmMinMax\").textContent = `${fmtKg(min)} \/ ${fmtKg(max)}`;\n  $(\"#rmCount\").textContent = String(values.length);\n}\n\n\/* =========================\n   RUTINAS (FULLBODY 1\u20135)\n========================= *\/\nconst ROUTINES = [\n  {\n    title:\"Rutina 1\",\n    aero:\"Z2 15\u201320 min (caminar r\u00e1pido \/ trote suave) post fuerza o separado.\",\n    time:\"~75\u201390 min total\",\n    rows:[\n      { ex:\"Squat (Sentadilla)\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmSquat\", mult:0.80, note:\"Controla descenso; core activo.\" },\n      { ex:\"Bench Press (Press banca)\", reps:\"6\u201310\", sets:\"3\", rest:\"1.5\u20132.5 min\", from:\"rmBench\", mult:0.80, note:\"Esc\u00e1pulas estables.\" },\n      { ex:\"Deadlift (Peso muerto)\", reps:\"6\u20138\", sets:\"3\", rest:\"2\u20133 min\", from:\"rmDeadlift\", mult:0.80, note:\"Columna neutral.\" },\n      { ex:\"Leg Press (Prensa)\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmLegPress\", mult:0.80, note:\"Empuja con talones.\" },\n      { ex:\"Shoulder Press\", reps:\"6\u201310\", sets:\"3\", rest:\"1.5\u20132 min\", from:\"rmShoulder\", mult:0.80, note:\"Evita hiperextensi\u00f3n lumbar.\" },\n      { ex:\"Pull-ups (Dominadas)\", reps:\"5\u20138\", sets:\"3\", rest:\"2\u20133 min\", fixed:\"Seg\u00fan nivel\", note:\"Peso corporal \/ asistidas \/ lastre.\" }\n    ]\n  },\n  {\n    title:\"Rutina 2\",\n    aero:\"Z2 20\u201325 min continuo.\",\n    time:\"~80\u201395 min total\",\n    rows:[\n      { ex:\"Leg Extension\", reps:\"10\u201314\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmSquat\", mult:0.55, note:\"Sin rebotes.\" },\n      { ex:\"Dumbbell Row\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmBench\", mult:0.50, note:\"Sin impulso.\" },\n      { ex:\"RDL (Peso muerto rumano)\", reps:\"8\u201310\", sets:\"3\", rest:\"1.5\u20132.5 min\", from:\"rmDeadlift\", mult:0.60, note:\"Cadera atr\u00e1s; isquios.\" },\n      { ex:\"Flyes (Aperturas)\", reps:\"10\u201315\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmBench\", mult:0.35, note:\"Rango c\u00f3modo.\" },\n      { ex:\"Elevaci\u00f3n lateral\", reps:\"10\u201315\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmShoulder\", mult:0.30, note:\"Sin balanceo.\" },\n      { ex:\"Curl b\u00edceps (barra)\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmBench\", mult:0.30, note:\"Control exc\u00e9ntrico.\" }\n    ]\n  },\n  {\n    title:\"Rutina 3\",\n    aero:\"Bici Z2 25\u201330 min (cadencia estable).\",\n    time:\"~75\u201390 min total\",\n    rows:[\n      { ex:\"Leg Press\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmLegPress\", mult:0.80, note:\"Controla profundidad.\" },\n      { ex:\"Pullover mancuerna\", reps:\"10\u201314\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmBench\", mult:0.40, note:\"Sin dolor hombro.\" },\n      { ex:\"Lat pull-down\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmDeadlift\", mult:0.50, note:\"Al pecho (no tras nuca).\" },\n      { ex:\"Curl martillo\", reps:\"10\u201312\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmBench\", mult:0.30, note:\"Sin columpio.\" },\n      { ex:\"Face pull\", reps:\"12\u201315\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmShoulder\", mult:0.25, note:\"Codos altos.\" },\n      { ex:\"Fondos (m\u00e1quina)\", reps:\"8\u201310\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmBench\", mult:0.45, note:\"Rango c\u00f3modo.\" }\n    ]\n  },\n  {\n    title:\"Rutina 4\",\n    aero:\"Caminata r\u00e1pida 20\u201325 min (Z2).\",\n    time:\"~65\u201380 min total\",\n    rows:[\n      { ex:\"Extensi\u00f3n de piernas\", reps:\"10\u201314\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmSquat\", mult:0.55, note:\"Pausa arriba.\" },\n      { ex:\"Press Arnold\", reps:\"8\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmShoulder\", mult:0.65, note:\"Control rotaci\u00f3n.\" },\n      { ex:\"Barbell Row\", reps:\"8\u201310\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmDeadlift\", mult:0.45, note:\"Tronco firme.\" },\n      { ex:\"Curl b\u00edceps (barra)\", reps:\"10\u201312\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmBench\", mult:0.30, note:\"Sin cheating.\" },\n      { ex:\"Flyes\", reps:\"10\u201314\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmBench\", mult:0.35, note:\"Recorrido c\u00f3modo.\" }\n    ]\n  },\n  {\n    title:\"Rutina 5\",\n    aero:\"Bici o el\u00edptica 20\u201325 min (Z2).\",\n    time:\"~70\u201385 min total\",\n    rows:[\n      { ex:\"Step-ups\", reps:\"10\u201312\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmSquat\", mult:0.35, note:\"Control rodilla.\" },\n      { ex:\"Rotaci\u00f3n externa (bandas)\", reps:\"12\u201315\", sets:\"3\", rest:\"1\u20131.5 min\", fixed:\"T\u00e9cnico\", note:\"Baja carga, control.\" },\n      { ex:\"Dumbbell Row\", reps:\"8\u201310\", sets:\"3\", rest:\"1\u20132 min\", from:\"rmBench\", mult:0.50, note:\"Core activo.\" },\n      { ex:\"Curl mancuerna\", reps:\"10\u201312\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmBench\", mult:0.25, note:\"Rango completo.\" },\n      { ex:\"Fondos (m\u00e1quina)\", reps:\"10\u201312\", sets:\"3\", rest:\"1\u20131.5 min\", from:\"rmBench\", mult:0.40, note:\"Controla descenso.\" },\n      { ex:\"Leg raises\", reps:\"10\u201315\", sets:\"3\", rest:\"1\u20131.5 min\", fixed:\"Peso corporal\", note:\"Sin columpiar.\" }\n    ]\n  }\n];\n\nfunction renderRoutines(){\n  const container = $(\"#routinesContainer\");\n  container.innerHTML = \"\";\n\n  ROUTINES.forEach((rt, idx) => {\n    const card = document.createElement(\"div\");\n    card.className = \"card\";\n    card.innerHTML = `\n      <div class=\"section-title\">\n        <h2 style=\"font-size:14px; margin:0;\"><span class=\"pill\" style=\"margin-right:8px;\">${idx+1}<\/span>${rt.title}<\/h2>\n      <\/div>\n\n      <div style=\"overflow:auto;\">\n        <table>\n          <thead>\n            <tr>\n              <th>Ejercicio<\/th>\n              <th>Reps<\/th>\n              <th>Series<\/th>\n              <th>Descanso<\/th>\n              <th>Peso sugerido<\/th>\n              <th>Obs.<\/th>\n            <\/tr>\n          <\/thead>\n          <tbody>\n            ${rt.rows.map((r,i)=>`\n              <tr>\n                <td>${r.ex}<\/td>\n                <td>${r.reps}<\/td>\n                <td>${r.sets}<\/td>\n                <td>${r.rest}<\/td>\n                <td class=\"result\" id=\"rt_${idx}_${i}\">${r.fixed ?? \"\u2014\"}<\/td>\n                <td class=\"small\">${r.note}<\/td>\n              <\/tr>\n            `).join(\"\")}\n          <\/tbody>\n        <\/table>\n      <\/div>\n\n      <p class=\"muted\" style=\"margin:10px 0 0;\"><strong>Aer\u00f3bico:<\/strong> ${rt.aero}<\/p>\n      <p class=\"muted\" style=\"margin:4px 0 0;\"><strong>Tiempo estimado:<\/strong> ${rt.time}<\/p>\n    `;\n    container.appendChild(card);\n  });\n}\n\nfunction calcRoutines(){\n  const rounding = $(\"#rounding\").value;\n  const rm = {\n    rmBench: Math.max(0, toNum($(\"#rmBench\").value)),\n    rmSquat: Math.max(0, toNum($(\"#rmSquat\").value)),\n    rmDeadlift: Math.max(0, toNum($(\"#rmDeadlift\").value)),\n    rmLegPress: Math.max(0, toNum($(\"#rmLegPress\").value)),\n    rmShoulder: Math.max(0, toNum($(\"#rmShoulder\").value))\n  };\n\n  saveState({\n    rmBench: $(\"#rmBench\").value,\n    rmSquat: $(\"#rmSquat\").value,\n    rmDeadlift: $(\"#rmDeadlift\").value,\n    rmLegPress: $(\"#rmLegPress\").value,\n    rmShoulder: $(\"#rmShoulder\").value\n  });\n\n  ROUTINES.forEach((rt, idx) => {\n    rt.rows.forEach((row, i) => {\n      const cell = $(`#rt_${idx}_${i}`);\n      if (!cell) return;\n\n      if (row.fixed){\n        cell.textContent = row.fixed;\n        return;\n      }\n\n      const base = rm[row.from] || 0;\n      if (base <= 0){\n        cell.textContent = \"\u2014\";\n        return;\n      }\n\n      const val = base * row.mult;\n      const out = (rounding === \"none\") ? val : roundTo(val, rounding);\n      cell.textContent = fmtKg(out);\n    });\n  });\n}\n\n\/* =========================\n   AER\u00d3BICO \/ FC \/ SESI\u00d3N\n========================= *\/\nfunction calcAerobic(){\n  const age = clamp(toNum($(\"#age\").value), 10, 100);\n  const mins = clamp(toNum($(\"#minutes\").value), 5, 300);\n  const goal = $(\"#goal\").value;\n  const days = clamp(toNum($(\"#aeroDays\").value), 2, 5);\n\n  saveState({ age: $(\"#age\").value, minutes: $(\"#minutes\").value, goal, aeroDays: $(\"#aeroDays\").value });\n\n  if (!age){\n    $(\"#hrMaxOut\").textContent = \"\u2014\";\n    $(\"#hrZ2\").textContent = \"\u2014\";\n    $(\"#hrHI\").textContent = \"\u2014\";\n    $(\"#hrType\").textContent = \"\u2014\";\n    $(\"#aeroSession\").textContent = \"Ingresa tu edad para calcular zonas.\";\n    return;\n  }\n\n  const hrMax = 208 - 0.7 * age;\n  \/\/ Z2 aproximada (60\u201370% HRmax), HI (80\u201390% HRmax)\n  const z2Lo = Math.round(hrMax * 0.60);\n  const z2Hi = Math.round(hrMax * 0.70);\n  const hiLo = Math.round(hrMax * 0.80);\n  const hiHi = Math.round(hrMax * 0.90);\n\n  $(\"#hrMaxOut\").textContent = `${fmtInt(hrMax)} lpm`;\n  $(\"#hrZ2\").textContent = `${z2Lo}\u2013${z2Hi} lpm`;\n  $(\"#hrHI\").textContent = `${hiLo}\u2013${hiHi} lpm`;\n\n  let type = \"\";\n  let session = \"\";\n\n  if (goal === \"salud\"){\n    type = \"Base aer\u00f3bica (Z2)\";\n    session =\n      `\u2022 Calentamiento 5\u20138 min (subiendo a Z2)\\n`+\n      `\u2022 Bloque principal ${Math.max(10, mins-10)} min en Z2 (${z2Lo}\u2013${z2Hi} lpm)\\n`+\n      `\u2022 Vuelta a la calma 3\u20135 min suave\\n`+\n      `\u2022 Frecuencia: ${days} d\u00edas\/semana (si haces fuerza, ideal post fuerza o en d\u00edas separados)`;\n  } else if (goal === \"bajar\"){\n    type = \"Z2 + toque de intensidad\";\n    const main = Math.max(10, mins - 12);\n    const ints = Math.min(10, Math.max(4, Math.round(mins\/6))); \/\/ 4\u201310 intervalos\n    session =\n      `\u2022 Calentamiento 6\u20138 min\\n`+\n      `\u2022 Z2 ${Math.max(8, Math.round(main*0.6))} min (${z2Lo}\u2013${z2Hi} lpm)\\n`+\n      `\u2022 Intervalos: ${ints}\u00d7(30\u201345 s en ${hiLo}\u2013${hiHi} + 60\u201390 s suave)\\n`+\n      `\u2022 Enfriar 3\u20135 min\\n`+\n      `\u2022 Frecuencia: ${days} d\u00edas\/semana (al menos 2 en Z2)`;\n  } else {\n    type = \"Umbral\/intervalos (rendimiento)\";\n    const ints = Math.min(12, Math.max(6, Math.round(mins\/4)));\n    session =\n      `\u2022 Calentamiento 8\u201310 min\\n`+\n      `\u2022 Intervalos: ${ints}\u00d7(60 s en ${hiLo}\u2013${hiHi} + 60\u201390 s suave)\\n`+\n      `\u2022 Si sobra tiempo: Z2 5\u201310 min\\n`+\n      `\u2022 Enfriar 3\u20135 min\\n`+\n      `\u2022 Frecuencia: ${days} d\u00edas\/semana (1\u20132 sesiones intensas, resto Z2)`;\n  }\n\n  $(\"#hrType\").textContent = type;\n  $(\"#aeroSession\").textContent = session;\n}\n\n\/* =========================\n   NUTRICI\u00d3N (OBJETIVO OBLIGATORIO)\n========================= *\/\nfunction calcNutrition(){\n  const goal = $(\"#nGoal\").value;\n  const agg = $(\"#nAgg\").value;\n  const sex = $(\"#sex\").value;\n  const age = clamp(toNum($(\"#nAge\").value), 10, 100);\n  const w = Math.max(0, toNum($(\"#nWeight\").value));\n  const h = Math.max(0, toNum($(\"#nHeight\").value));\n  const act = Number($(\"#activity\").value);\n\n  saveState({\n    nGoal: goal, nAgg: agg, sex,\n    nAge: $(\"#nAge\").value, nWeight: $(\"#nWeight\").value, nHeight: $(\"#nHeight\").value,\n    activity: $(\"#activity\").value\n  });\n\n  if (!goal){\n    $(\"#nutriTips\").innerHTML = `<span class=\"warn\">Selecciona un objetivo (bajar \/ mantener \/ subir) para calcular.<\/span>`;\n    $(\"#bmrOut\").textContent = \"\u2014\";\n    $(\"#tdeeOut\").textContent = \"\u2014\";\n    $(\"#kcalOut\").textContent = \"\u2014\";\n    $(\"#pOut\").textContent = \"\u2014\";\n    $(\"#cOut\").textContent = \"\u2014\";\n    $(\"#fOut\").textContent = \"\u2014\";\n    return;\n  }\n\n  if (!age || !w || !h){\n    $(\"#nutriTips\").textContent = \"Completa edad, peso y estatura.\";\n    return;\n  }\n\n  const s = sex === \"m\" ? 5 : -161;\n  const bmr = 10*w + 6.25*h - 5*age + s;\n  const tdee = bmr * act;\n\n  \/\/ magnitud seg\u00fan agresividad\n  const deltas = {\n    cut:  { mild:-0.10, moderate:-0.15, aggressive:-0.20 },\n    bulk: { mild:+0.05, moderate:+0.10, aggressive:+0.15 },\n    maintain: { mild:0, moderate:0, aggressive:0 }\n  };\n  const delta = deltas[goal][agg] ?? 0;\n  const kcal = tdee * (1 + delta);\n\n  \/\/ Macros por objetivo (simple, pr\u00e1ctico)\n  \/\/ Prote:\n  \/\/ - cut: 2.0\u20132.2 g\/kg\n  \/\/ - maintain: 1.6\u20131.8 g\/kg\n  \/\/ - bulk: 1.8\u20132.0 g\/kg\n  const pPerKg =\n    goal === \"cut\" ? (agg===\"aggressive\" ? 2.2 : 2.0) :\n    goal === \"bulk\" ? (agg===\"aggressive\" ? 2.0 : 1.8) :\n    1.7;\n\n  \/\/ Grasas:\n  \/\/ - cut\/maintain: 0.8 g\/kg\n  \/\/ - bulk: 1.0 g\/kg\n  const fPerKg = (goal === \"bulk\") ? 1.0 : 0.8;\n\n  const p = pPerKg * w;\n  const f = fPerKg * w;\n\n  const kcalFromP = p * 4;\n  const kcalFromF = f * 9;\n  const c = Math.max(0, (kcal - kcalFromP - kcalFromF) \/ 4);\n\n  $(\"#bmrOut\").textContent = `${Math.round(bmr)} kcal`;\n  $(\"#tdeeOut\").textContent = `${Math.round(tdee)} kcal`;\n  $(\"#kcalOut\").textContent = `${Math.round(kcal)} kcal`;\n  $(\"#pOut\").textContent = `${Math.round(p)} g`;\n  $(\"#fOut\").textContent = `${Math.round(f)} g`;\n  $(\"#cOut\").textContent = `${Math.round(c)} g`;\n\n  let tip = \"\";\n  if (goal === \"cut\"){\n    tip =\n      `D\u00e9ficit ${Math.round(Math.abs(delta)*100)}% (${agg}). `+\n      `Prioriza prote\u00edna alta y volumen de comida. Ajusta cada 10\u201314 d\u00edas seg\u00fan progreso real (peso\/medidas\/rendimiento). `+\n      `Si el rendimiento cae fuerte, reduce agresividad o sube carbohidratos en d\u00edas de fuerza.`;\n  } else if (goal === \"bulk\"){\n    tip =\n      `Super\u00e1vit ${Math.round(delta*100)}% (${agg}). `+\n      `Meta: subir lento y sostener progresi\u00f3n de cargas. Si sube grasa muy r\u00e1pido, baja 100\u2013200 kcal o elige \u201csuave\u201d. `+\n      `Carbos suelen ser tu palanca de performance.`;\n  } else {\n    tip =\n      `Mantenci\u00f3n: estabiliza ingesta, sue\u00f1o y volumen de entrenamiento. `+\n      `\u00datil para recomposici\u00f3n si el entrenamiento est\u00e1 bien periodizado y la prote\u00edna es alta.`;\n  }\n\n  $(\"#nutriTips\").textContent = tip;\n}\n\n\/* =========================\n   INIT\n========================= *\/\nfunction init(){\n  [\n    \"rounding\",\"mode\",\"sharedReps\",\"sharedWeight\",\n    \"rmBench\",\"rmSquat\",\"rmDeadlift\",\"rmLegPress\",\"rmShoulder\",\n    \"age\",\"minutes\",\"goal\",\"aeroDays\",\n    \"nGoal\",\"nAgg\",\"sex\",\"nAge\",\"nWeight\",\"nHeight\",\"activity\",\n    \"mealTemplate\"\n  ].forEach(bindAutosave);\n\n  const st = loadState();\n  if (st.rounding) $(\"#rounding\").value = st.rounding;\n  if (st.mode) $(\"#mode\").value = st.mode;\n  if (st.goal) $(\"#goal\").value = st.goal;\n  if (st.aeroDays) $(\"#aeroDays\").value = st.aeroDays;\n\n  if (st.nGoal !== undefined) $(\"#nGoal\").value = st.nGoal;\n  if (st.nAgg) $(\"#nAgg\").value = st.nAgg;\n  if (st.sex) $(\"#sex\").value = st.sex;\n  if (st.activity) $(\"#activity\").value = st.activity;\n\n  renderRMTable();\n  renderRoutines();\n  calcRoutines();\n\n  \/\/ RM\n  $(\"#mode\").addEventListener(\"change\", () => { saveState({ mode: $(\"#mode\").value }); renderRMTable(); });\n  $(\"#rounding\").addEventListener(\"change\", () => {\n    saveState({ rounding: $(\"#rounding\").value });\n    computeAllRM();\n    calcRoutines();\n  });\n  $(\"#btnCalcRM\").addEventListener(\"click\", computeAllRM);\n\n  [\"sharedReps\",\"sharedWeight\"].forEach(id=>{\n    $(\"#\"+id).addEventListener(\"input\", () => {\n      saveState({ [id]: $(\"#\"+id).value });\n      if ($(\"#mode\").value === \"shared\"){\n        FORMULAS.forEach(f=>{\n          const r = $(\"#sharedReps\").value;\n          const w = $(\"#sharedWeight\").value;\n          const repsEl = document.getElementById(`reps_${f.key}`);\n          const wEl = document.getElementById(`w_${f.key}`);\n          if (repsEl) repsEl.value = r || \"\";\n          if (wEl) wEl.value = w || \"\";\n        });\n      }\n      computeAllRM();\n    });\n  });\n\n  $(\"#rmTable\").addEventListener(\"input\", (e) => {\n    if ($(\"#mode\").value !== \"perRow\") return;\n    const t = e.target;\n    if (!(t instanceof HTMLInputElement)) return;\n    if (!t.id.startsWith(\"reps_\") && !t.id.startsWith(\"w_\")) return;\n    saveState({ [t.id]: t.value });\n    computeAllRM();\n  });\n\n  \/\/ Rutinas\n  $(\"#calcRoutines\").addEventListener(\"click\", calcRoutines);\n\n  \/\/ Aer\u00f3bico\n  $(\"#calcHR\").addEventListener(\"click\", calcAerobic);\n  if ($(\"#age\").value) calcAerobic();\n\n  \/\/ Nutri\n  $(\"#calcNutri\").addEventListener(\"click\", calcNutrition);\n  if ($(\"#nGoal\").value && $(\"#nAge\").value && $(\"#nWeight\").value && $(\"#nHeight\").value) calcNutrition();\n\n  \/\/ Clear\n  $(\"#clearAll\").addEventListener(\"click\", () => {\n    localStorage.removeItem(LS_KEY);\n    location.reload();\n  });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", init);\n<\/script>\n\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Herramientas de Calculo: 1RM + Carga Aer\u00f3bica + Rutinas Full + Nutrici\u00f3n Herramientas de Auto Calculo 1RM (todas las f\u00f3rmulas) \u2022 Carga aer\u00f3bica\/zonas \u2022 Rutinas [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2943","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/pages\/2943","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/comments?post=2943"}],"version-history":[{"count":1,"href":"https:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/pages\/2943\/revisions"}],"predecessor-version":[{"id":2945,"href":"https:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/pages\/2943\/revisions\/2945"}],"wp:attachment":[{"href":"https:\/\/nutrideportiva.cl\/index.php\/wp-json\/wp\/v2\/media?parent=2943"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}