{"id":4122,"date":"2026-01-30T12:17:44","date_gmt":"2026-01-30T15:17:44","guid":{"rendered":"https:\/\/hub.gamepro.network\/access\/"},"modified":"2026-04-03T07:25:01","modified_gmt":"2026-04-03T10:25:01","slug":"access","status":"publish","type":"page","link":"https:\/\/hub.gamepro.network\/pt\/access\/","title":{"rendered":"Access"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4122\" class=\"elementor elementor-4122\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6fd05897 e-con-full e-flex e-con e-parent\" data-id=\"6fd05897\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;video&quot;,&quot;background_video_link&quot;:&quot;https:\\\/\\\/hub.gamepro.network\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/gamepro-video.mp4&quot;,&quot;background_play_on_mobile&quot;:&quot;yes&quot;}\">\n\t\t<div class=\"elementor-background-video-container\">\n\t\t\t\t\t\t\t<video class=\"elementor-background-video-hosted\" role=\"presentation\" autoplay muted playsinline loop><\/video>\n\t\t\t\t\t<\/div><div class=\"elementor-element elementor-element-2e2551d4 e-con-full e-flex e-con e-child\" data-id=\"2e2551d4\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-7d71e821 e-con-full loginSection e-flex e-con e-child\" data-id=\"7d71e821\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1f56f0d elementor-widget elementor-widget-theme-site-logo elementor-widget-image\" data-id=\"1f56f0d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"theme-site-logo.default\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/hub.gamepro.network\/pt\">\n\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"651\" height=\"140\" src=\"https:\/\/hub.gamepro.network\/wp-content\/uploads\/2026\/03\/gamepro-logo-branco.png\" class=\"attachment-full size-full wp-image-13709\" alt=\"\" srcset=\"https:\/\/hub.gamepro.network\/wp-content\/uploads\/2026\/03\/gamepro-logo-branco.png 651w, https:\/\/hub.gamepro.network\/wp-content\/uploads\/2026\/03\/gamepro-logo-branco-300x65.png 300w, https:\/\/hub.gamepro.network\/wp-content\/uploads\/2026\/03\/gamepro-logo-branco-600x129.png 600w\" sizes=\"(max-width: 651px) 100vw, 651px\" \/>\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a677e63 elementor-widget__width-inherit elementor-widget elementor-widget-shortcode\" data-id=\"a677e63\" 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\"><div class=\"trp-shortcode-switcher__wrapper\"\r\n     style=\"--bg:#1f1f1f7d;--bg-hover:#0000000d;--text:#ffffff;--text-hover:#ffffffb5;--border:1px solid #0000001a;--border-width:1px;--border-color:#0000001a;--border-radius:5px;--flag-radius:2px;--flag-size:18px;--aspect-ratio:4\/3;--font-size:14px;--transition-duration:0.2s\"\r\n     role=\"group\"\r\n     data-open-mode=\"hover\">\r\n\r\n    \r\n        <!-- ANCHOR (in-flow only; sizing\/borders; inert) -->\r\n        <div class=\"trp-language-switcher trp-ls-dropdown trp-shortcode-switcher trp-shortcode-anchor trp-open-on-hover\"\r\n             aria-hidden=\"true\"\r\n             inert\r\n             data-no-translation>\r\n                <div class=\"trp-current-language-item__wrapper\">\r\n        <a class=\"trp-language-item trp-language-item__default trp-language-item__current\" data-no-translation href=\"https:\/\/hub.gamepro.network\/pt\/wp-json\/wp\/v2\/pages\/4122#TRPLINKPROCESSED\" title=\"Portugu\u00eas\"><img decoding=\"async\" src=\"https:\/\/hub.gamepro.network\/wp-content\/plugins\/translatepress-multilingual\/assets\/flags\/4x3\/pt_PT.svg\" class=\"trp-flag-image\" alt=\"\" role=\"presentation\" loading=\"lazy\" \/><span class=\"trp-language-item-name\">Portugu\u00eas<\/span><\/a>                    <svg class=\"trp-shortcode-arrow\" width=\"20\" height=\"20\" viewBox=\"0 0 20 21\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\r\n                <path d=\"M5 8L10 13L15 8\" stroke=\"var(--text)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\r\n            <\/svg>\r\n            <\/div>\r\n            <\/div>\r\n\r\n        <!-- OVERLAY (positioned; interactive surface) -->\r\n        <div class=\"trp-language-switcher trp-ls-dropdown trp-shortcode-switcher trp-shortcode-overlay trp-open-on-hover\"\r\n             role=\"navigation\"\r\n             aria-label=\"Website language selector\"\r\n             data-no-translation\r\n        >\r\n                <div class=\"trp-current-language-item__wrapper\">\r\n        <div class=\"trp-language-item trp-language-item__default trp-language-item__current\" data-no-translation role=\"button\" aria-expanded=\"false\" tabindex=\"0\" aria-label=\"Change language\" aria-controls=\"trp-shortcode-dropdown-69d2860631834\"><img decoding=\"async\" src=\"https:\/\/hub.gamepro.network\/wp-content\/plugins\/translatepress-multilingual\/assets\/flags\/4x3\/pt_PT.svg\" class=\"trp-flag-image\" alt=\"\" role=\"presentation\" loading=\"lazy\" \/><span class=\"trp-language-item-name\">Portugu\u00eas<\/span><\/div>                    <svg class=\"trp-shortcode-arrow\" width=\"20\" height=\"20\" viewBox=\"0 0 20 21\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\r\n                <path d=\"M5 8L10 13L15 8\" stroke=\"var(--text)\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\r\n            <\/svg>\r\n            <\/div>\r\n    \r\n            <div class=\"trp-switcher-dropdown-list\"\r\n                 id=\"trp-shortcode-dropdown-69d2860631834\"\r\n                 role=\"group\"\r\n                 aria-label=\"Available languages\"\r\n                 hidden\r\n                 inert\r\n            >\r\n                                                            <a class=\"trp-language-item\" href=\"https:\/\/hub.gamepro.network\/pt\/wp-json\/wp\/v2\/pages\/4122#TRPLINKPROCESSED\" title=\"Portugu\u00eas do Brasil\">\r\n                            <img decoding=\"async\" src=\"https:\/\/hub.gamepro.network\/wp-content\/plugins\/translatepress-multilingual\/assets\/flags\/4x3\/pt_BR.svg\" class=\"trp-flag-image\" alt=\"\" role=\"presentation\" loading=\"lazy\" \/>                                                            <span class=\"trp-language-item-name\" data-no-translation>Portugu\u00eas do Brasil<\/span>\r\n                                                                                <\/a>\r\n                                            <a class=\"trp-language-item\" href=\"https:\/\/hub.gamepro.network\/pt\/wp-json\/wp\/v2\/pages\/4122#TRPLINKPROCESSED\" title=\"English\">\r\n                            <img decoding=\"async\" src=\"https:\/\/hub.gamepro.network\/wp-content\/plugins\/translatepress-multilingual\/assets\/flags\/4x3\/en_US.svg\" class=\"trp-flag-image\" alt=\"\" role=\"presentation\" loading=\"lazy\" \/>                                                            <span class=\"trp-language-item-name\" data-no-translation>English<\/span>\r\n                                                                                <\/a>\r\n                                            <a class=\"trp-language-item\" href=\"https:\/\/hub.gamepro.network\/pt\/wp-json\/wp\/v2\/pages\/4122#TRPLINKPROCESSED\" title=\"Espa\u00f1ol\">\r\n                            <img decoding=\"async\" src=\"https:\/\/hub.gamepro.network\/wp-content\/plugins\/translatepress-multilingual\/assets\/flags\/4x3\/es_ES.svg\" class=\"trp-flag-image\" alt=\"\" role=\"presentation\" loading=\"lazy\" \/>                                                            <span class=\"trp-language-item-name\" data-no-translation>Espa\u00f1ol<\/span>\r\n                                                                                <\/a>\r\n                                            <a class=\"trp-language-item\" href=\"https:\/\/hub.gamepro.network\/pt\/wp-json\/wp\/v2\/pages\/4122#TRPLINKPROCESSED\" title=\"Fran\u00e7ais\">\r\n                            <img decoding=\"async\" src=\"https:\/\/hub.gamepro.network\/wp-content\/plugins\/translatepress-multilingual\/assets\/flags\/4x3\/fr_FR.svg\" class=\"trp-flag-image\" alt=\"\" role=\"presentation\" loading=\"lazy\" \/>                                                            <span class=\"trp-language-item-name\" data-no-translation>Fran\u00e7ais<\/span>\r\n                                                                                <\/a>\r\n                                                <\/div>\r\n        <\/div>\r\n\r\n    <\/div>\r\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7e0c2d94 elementor-widget__width-inherit fm-actions-align-space-between elementor-widget elementor-widget-login_free_members\" data-id=\"7e0c2d94\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"login_free_members.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"fm-login-widget\" id=\"fm-login-7e0c2d94\" data-fm-version=\"2025-11-07\"><div class=\"fm-tab-content default\" id=\"fm-login-content-7e0c2d94\" data-content=\"login\"><form class=\"fm-actions\" id=\"fm-login-form-7e0c2d94\"><div class=\"fm-field\"><label>Email<\/label><input type=\"email\" class=\"fm-input\" id=\"fm-login-email-7e0c2d94\" placeholder=\"email@exemplo.com\" \/><div class=\"fm-error\" data-error-for=\"fm-login-email-7e0c2d94\"><\/div><\/div><div class=\"fm-field\"><label>Senha<\/label><div class=\"fm-password-wrap\"><input type=\"password\" class=\"fm-input\" id=\"fm-login-password-7e0c2d94\" placeholder=\"******\" \/><span class=\"fm-eye\" data-target=\"fm-login-password-7e0c2d94\"><i class=\"fas fa-eye\"><\/i><\/span><\/div><div class=\"fm-error\" data-error-for=\"fm-login-password-7e0c2d94\"><\/div><\/div><label class=\"fm-remember\" style=\"display:block;text-align:center;margin:8px 0 12px\"><input type=\"checkbox\" id=\"fm-remember-7e0c2d94\" \/> Bot\u00e3o lembrar senha<\/label><button type=\"submit\" class=\"fm-btn\" id=\"fm-login-btn-7e0c2d94\">Entrar<\/button><a href=\"#\" class=\"fm-forgot\" id=\"fm-forgot-7e0c2d94\" role=\"button\">Esqueci minha senha<\/a><\/form><div class=\"fm-message\" id=\"fm-login-msg-7e0c2d94\"><\/div><div class=\"fm-modal-overlay\" id=\"fm-pr-overlay-7e0c2d94\" hidden><\/div><div class=\"fm-modal\" id=\"fm-pr-modal-7e0c2d94\" hidden role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"fm-pr-title-7e0c2d94\" aria-describedby=\"fm-pr-desc-7e0c2d94\">  <div class=\"fm-dialog\">    <button class=\"fm-close\" id=\"fm-pr-close-7e0c2d94\" aria-label=\"Fechar\">&times;<\/button>    <h3 id=\"fm-pr-title-7e0c2d94\">Recuperar senha<\/h3>    <p class=\"fm-sub\" id=\"fm-pr-desc-7e0c2d94\">Insira seu email para recuperar sua senha.<\/p>    <div class=\"fm-error\" id=\"fm-pr-error-7e0c2d94\" style=\"display:none\"><\/div>    <div class=\"fm-message\" id=\"fm-pr-msg-7e0c2d94\"><\/div>    <div class=\"fm-step\" id=\"fm-pr-step-email-7e0c2d94\">      <div class=\"fm-field\"><label>Email<\/label><input type=\"email\" class=\"fm-input\" id=\"fm-pr-email-7e0c2d94\" placeholder=\"email@exemplo.com\" \/><div class=\"fm-error\" data-error-for=\"fm-pr-email-7e0c2d94\"><\/div><\/div>      <div class=\"fm-actions\"><button class=\"fm-btn\" id=\"fm-pr-request-btn-7e0c2d94\">Recuperar senha<\/button><\/div>    <\/div>    <div class=\"fm-step\" id=\"fm-pr-step-code-7e0c2d94\" hidden>      <p class=\"fm-sub\" id=\"fm-pr-sent-7e0c2d94\"><\/p>      <div class=\"fm-field\"><label>C\u00f3digo de 6 d\u00edgitos<\/label><input type=\"text\" inputmode=\"numeric\" pattern=\"[0-9]*\" maxlength=\"6\" class=\"fm-input\" id=\"fm-pr-code-7e0c2d94\" placeholder=\"000000\" \/><div class=\"fm-error\" data-error-for=\"fm-pr-code-7e0c2d94\"><\/div><\/div>      <div class=\"fm-actions\"><button class=\"fm-btn\" id=\"fm-pr-verify-btn-7e0c2d94\">Validar c\u00f3digo<\/button><button class=\"fm-btn secondary\" id=\"fm-pr-resend-btn-7e0c2d94\" disabled>Reenviar c\u00f3digo em 180s<\/button><\/div>      <div class=\"fm-countdown\" id=\"fm-pr-countdown-7e0c2d94\"><\/div>    <\/div>    <div class=\"fm-step\" id=\"fm-pr-step-reset-7e0c2d94\" hidden>      <div class=\"fm-field\"><label>Nova senha<\/label><div class=\"fm-password-wrap\"><input type=\"password\" class=\"fm-input\" id=\"fm-pr-pass-7e0c2d94\" placeholder=\"******\" \/><span class=\"fm-eye\" data-target=\"fm-pr-pass-7e0c2d94\"><i class=\"fas fa-eye\"><\/i><\/span><\/div><div class=\"fm-error\" data-error-for=\"fm-pr-pass-7e0c2d94\"><\/div><\/div>      <div class=\"fm-field\"><label>Confirmar senha<\/label><div class=\"fm-password-wrap\"><input type=\"password\" class=\"fm-input\" id=\"fm-pr-pass2-7e0c2d94\" placeholder=\"******\" \/><span class=\"fm-eye\" data-target=\"fm-pr-pass2-7e0c2d94\"><i class=\"fas fa-eye\"><\/i><\/span><\/div><div class=\"fm-error\" data-error-for=\"fm-pr-pass2-7e0c2d94\"><\/div><\/div>      <div class=\"fm-actions\"><button class=\"fm-btn\" id=\"fm-pr-reset-btn-7e0c2d94\">Alterar senha e logar<\/button><\/div>    <\/div>  <\/div><\/div><\/div><style>\r\n                .fm-login-widget{display:block;overflow:hidden;border-radius:8px;padding:16px}\r\n                .fm-tabs{display:flex;gap:0;align-items:flex-end;border-bottom:none;margin-bottom:16px}\r\n                .fm-tab{background:none;border:none;cursor:pointer;padding:6px 0;line-height:1.2;color:#F9025B;font-weight:600;flex:1;text-align:center;border-bottom:1px solid transparent;border-radius:0}\r\n                .fm-tab.active{border-bottom-color: currentColor}\r\n                .fm-field{margin:12px auto;width:100%;max-width:420px}\r\n                .fm-tab-content{border:none;border-radius:0;padding:0}\r\n                .fm-tab-content{display:none}\r\n                .fm-tab-content.default{display:block}\r\n                \/* removed :target rule; visibility handled via JS *\/\r\n                .fm-input{width:100%;background:#111;border:1px solid transparent;color:#eee;border-radius:10px;height:36px;line-height:36px;padding:0 12px}\r\n                .fm-input.fm-invalid{border-color:#F9025B}\r\n                .fm-error{display:none;color:#F9025B;font-size:12px;margin-top:4px;text-align:left}\r\n                .fm-password-wrap{position:relative}\r\n                .fm-eye{position:absolute;right:8px;top:50%;transform:translateY(-50%);cursor:pointer}\r\n                .fm-btn{border:0;cursor:pointer}\r\n                .fm-actions{display:flex;flex-direction:column;align-items:center}\r\n                .fm-actions-align-center .fm-actions{align-items:center}\r\n                .fm-actions-align-flex-end .fm-actions{align-items:flex-end}\r\n                .fm-actions-align-space-between .fm-actions .fm-btn{width:100%}\r\n                .fm-message{margin-top:8px;text-align:center}\r\n                .fm-btn.is-loading{opacity:.8;position:relative}\r\n                .fm-btn.is-loading::after{content:\"\";position:absolute;right:12px;top:50%;transform:translateY(-50%);width:16px;height:16px;border:2px solid rgba(255,255,255,.6);border-top-color:#F9025B;border-radius:50%;animation:fm-spin .8s linear infinite}\r\n                @keyframes fm-spin{from{transform:translateY(-50%) rotate(0)}to{transform:translateY(-50%) rotate(360deg)}}\r\n                \/* Forgot link *\/\r\n                .fm-forgot{margin-top:10px;display:inline-block;color:var(--e-global-color-primary, var(--fm-primary, #F9025B));font-weight:600;text-decoration:none}\r\n                .fm-forgot:hover{opacity:.9}\r\n                \/* Modal styles *\/\r\n                .fm-modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:9998}\r\n                .fm-modal{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:9999}\r\n                .fm-modal[hidden], .fm-modal-overlay[hidden]{display:none}\r\n                .fm-dialog{position:relative;background:#0f0f0f;border:1px solid rgba(255,255,255,.12);border-radius:12px;max-width:480px;width:calc(100% - 32px);padding:16px;box-shadow:0 20px 60px rgba(0,0,0,.5)}\r\n                .fm-dialog h3{margin:0 0 8px;font-size:18px}\r\n                .fm-dialog .fm-sub{font-size:13px;color:#aaa;margin-bottom:8px}\r\n                .fm-close{position:absolute;right:12px;top:12px;background:transparent;border:0;color:#bbb;font-size:20px;cursor:pointer}\r\n                .fm-step[hidden]{display:none}\r\n                .fm-countdown{font-size:12px;color:#aaa;margin-top:6px;text-align:center}\r\n                .fm-btn.secondary{background:transparent;color:#F9025B;border:1px solid currentColor;border-radius:8px;padding:8px 12px}\r\n                \/* Tornar o bot\u00e3o de reenvio visualmente menor que o de valida\u00e7\u00e3o *\/\r\n                .fm-btn.secondary{padding:6px 10px;font-size:12px;line-height:1.2;width:auto !important;display:inline-flex;align-items:center;justify-content:center}\r\n            <\/style><script>\r\n(function(){\r\n  try {\r\n    var root = document.getElementById(\"fm-login-7e0c2d94\");\r\n    if (!root) { console.warn(\"FM root not found\", { widgetId: \"7e0c2d94\" }); return; }\r\n    var nonce = \"79007c83f1\";\r\n    var regNonce = \"39b2bd6437\";\r\n    var membersUrl = \"https:\/\/hub.gamepro.network\/\";\r\n    var adminEmail = \"site@gamepro.academy\";\r\n    var selectedCourses = [];\r\n    console.log(\"FM Login Widget active\", { widgetId: \"7e0c2d94\", version: \"2025-11-07\", membersUrl: membersUrl, selectedCourses: selectedCourses });\r\n\r\n    try {\r\n      var p = String((window.location && window.location.pathname) ? window.location.pathname : '');\r\n      var isAccess = (\/\\\/access\\\/?$\/).test(p);\r\n      var qs = String((window.location && window.location.search) ? window.location.search : '');\r\n      if (isAccess && qs.indexOf('fm_nc=') === -1) {\r\n        try {\r\n          var u = new URL(String(window.location.href || ''), window.location.origin);\r\n          u.searchParams.set('fm_nc', '1');\r\n          window.location.replace(u.toString());\r\n          return;\r\n        } catch(__e) {\r\n          var href = String(window.location.href || '');\r\n          var sep = (href.indexOf('?') === -1) ? '?' : '&';\r\n          window.location.replace(href + sep + 'fm_nc=1');\r\n          return;\r\n        }\r\n      }\r\n    } catch(_e) {}\r\n\r\n    function apiPost(url, body) {\r\n      return fetch(url, {\r\n        method: \"POST\",\r\n        headers: { \"Content-Type\": \"application\/json\" },\r\n        credentials: \"same-origin\",\r\n        body: JSON.stringify(body)\r\n      }).then(function(r){\r\n        return r.text().then(function(t){\r\n          var data = {};\r\n          try { data = t ? JSON.parse(t) : {}; } catch(e) { data = { error: t || \"\" }; }\r\n          return { status: r.status, data: data };\r\n        });\r\n      }).catch(function(err){\r\n        \/\/ Mant\u00e9m fluxo de tratamento uniforme retornando um objeto em vez de rejeitar\r\n        return { status: 0, data: { error: (err && err.message) ? err.message : \"Network error\" } };\r\n      });\r\n    }\r\n\r\n    function stripDbUnsafeChars(v){\r\n      v = (v == null) ? \"\" : String(v);\r\n      var cleaned = v.replace(\/[\\uD800-\\uDFFF]\/g, \"\").replace(\/\\u0000\/g, \"\");\r\n      return { value: cleaned, removed: cleaned !== v };\r\n    }\r\n\r\n    function showTabByHash(){\r\n      try {\r\n        var hash = window.location.hash;\r\n        var contents = root.querySelectorAll(\".fm-tab-content\");\r\n        for (var i=0; i<contents.length; i++) { contents[i].style.display = \"none\"; }\r\n        var id = (hash && root.querySelector(hash)) ? hash.substring(1) : \"fm-login-content-7e0c2d94\";\r\n        var el = document.getElementById(id);\r\n        if (el) { el.style.display = \"block\"; }\r\n        var tabs = root.querySelectorAll(\".fm-tab\");\r\n        for (var j=0; j<tabs.length; j++) {\r\n          var ac = tabs[j].getAttribute(\"aria-controls\");\r\n          if (ac === id) { tabs[j].classList.add(\"active\"); } else { tabs[j].classList.remove(\"active\"); }\r\n        }\r\n        console.log(\"FM showTabByHash\", { hash: hash, activeId: id });\r\n      } catch (e) {\r\n        console.error(\"FM showTabByHash error\", e);\r\n      }\r\n    }\r\n\r\n    showTabByHash();\r\n    window.addEventListener(\"hashchange\", showTabByHash);\r\n\r\n    \/\/ Garantir troca de abas via clique, mesmo se tema impedir navega\u00e7\u00e3o padr\u00e3o\r\n    root.querySelectorAll(\".fm-tab\").forEach(function(tab){\r\n      tab.addEventListener(\"click\", function(ev){\r\n        try {\r\n          var target = tab.getAttribute(\"href\") || (\"#\" + tab.getAttribute(\"aria-controls\"));\r\n          if (target) { window.location.hash = target; }\r\n          console.log(\"FM tab click\", { target: target });\r\n        } catch (e) { console.error(\"FM tab click error\", e); }\r\n      });\r\n    });\r\n\r\n    function getClosestByClass(node, className){\n      while (node && node !== root) {\n        if (node.classList && node.classList.contains(className)) {\n          return node;\n        }\n        node = node.parentNode;\n      }\n      return null;\n    }\n\n    function togglePasswordVisibility(eye){\n      if (!eye || !root.contains(eye)) return;\n      var id = eye.getAttribute(\"data-target\");\n      var input = document.getElementById(id);\n      if (!input) { console.warn(\"FM eye target missing\", { id: id }); return; }\n      var nextType = input.type === \"password\" ? \"text\" : \"password\";\n      input.setAttribute(\"type\", nextType);\n      eye.setAttribute(\"aria-pressed\", nextType === \"text\" ? \"true\" : \"false\");\n      console.log(\"FM eye toggle\", { id: id, type: nextType });\n    }\n\n    root.addEventListener(\"click\", function(e){\n      var eye = getClosestByClass(e.target, \"fm-eye\");\n      if (!eye) return;\n      e.preventDefault();\n      togglePasswordVisibility(eye);\n    });\n\r\n    var loginForm = document.getElementById(\"fm-login-form-7e0c2d94\");\r\n    var remember = document.getElementById(\"fm-remember-7e0c2d94\");\r\n    try {\r\n      var se = localStorage.getItem(\"fm_login_email\");\r\n      if (se) {\r\n        var emailInput = document.getElementById(\"fm-login-email-7e0c2d94\");\r\n        if (emailInput) { emailInput.value = se; }\r\n        if (remember) { remember.checked = true; }\r\n        console.log(\"FM remembered email\", { email: se });\r\n      }\r\n    } catch(e){ console.warn(\"FM localStorage read error\", e); }\r\n\r\n    function setFieldError(id, message){\r\n      var err = root.querySelector('[data-error-for=\"'+id+'\"]');\r\n      var input = document.getElementById(id);\r\n      if (err) { err.textContent = message || ''; err.style.display = message ? 'block' : 'none'; }\r\n      if (input) { if (message) { input.classList.add('fm-invalid'); } else { input.classList.remove('fm-invalid'); } }\r\n    }\r\n    function clearErrors(){\r\n      var errors = root.querySelectorAll('.fm-error');\r\n      for (var i=0;i<errors.length;i++){ errors[i].textContent=''; errors[i].style.display='none'; }\r\n      var inputs = root.querySelectorAll('.fm-input');\r\n      for (var j=0;j<inputs.length;j++){ inputs[j].classList.remove('fm-invalid'); }\r\n    }\r\n    function setLoading(btn, isLoading){\r\n      if (!btn) return;\r\n      try{ btn.disabled = !!isLoading; }catch(e){}\r\n      if (isLoading) { btn.classList.add('is-loading'); } else { btn.classList.remove('is-loading'); }\r\n    }\r\n    function withLoading(btn, promise){\r\n      setLoading(btn, true);\r\n      if (promise && promise.finally) {\r\n        return promise.finally(function(){ setLoading(btn, false); });\r\n      }\r\n      return promise.then(function(v){ setLoading(btn, false); return v; }, function(e){ setLoading(btn, false); throw e; });\r\n    }\r\n\r\n    if (loginForm) {\r\n      loginForm.addEventListener(\"submit\", function(e){\r\n        e.preventDefault();\r\n        var email = document.getElementById(\"fm-login-email-7e0c2d94\").value.trim();\r\n        var password = document.getElementById(\"fm-login-password-7e0c2d94\").value;\r\n        var msg = document.getElementById(\"fm-login-msg-7e0c2d94\");\r\n        msg.textContent = \"\";\r\n        clearErrors();\r\n        var hasErr = false;\r\n        if (!email) { setFieldError(\"fm-login-email-7e0c2d94\", \"Informe o email\"); hasErr = true; }\r\n        if (!password) { setFieldError(\"fm-login-password-7e0c2d94\", \"Informe a senha\"); hasErr = true; }\r\n        if (hasErr) { msg.textContent = \"Informe email e senha\"; return; }\r\n        console.log(\"FM Login Submit\", { email: email, remember: !!(remember && remember.checked) });\r\n        var loginBtn = document.getElementById(\"fm-login-btn-7e0c2d94\");\r\n        withLoading(loginBtn, apiPost(\"\/wp-json\/free-members\/v1\/login\", { email: email, password: password }))\r\n          .then(function(res){\r\n            console.log(\"FM Login Response\", { status: res && res.status, data: res && res.data });\r\n            if (res && res.status === 200) {\r\n              try { if (remember && remember.checked) { localStorage.setItem(\"fm_login_email\", email); } else { localStorage.removeItem(\"fm_login_email\"); } } catch(e){}\r\n              var dest = (res && res.data && res.data.redirect) ? res.data.redirect : membersUrl;\r\n              console.log(\"FM Login Success\", { redirect: dest });\r\n              window.location.href = dest;\r\n            } else {\r\n              var code = res ? res.status : 0;\r\n              var err = (res && res.data && (res.data.error || res.data.message)) ? (res.data.error || res.data.message) : \"\";\r\n              console.warn(\"FM Login Error\", { status: code, error: err });\r\n              if (code === 404) { setFieldError(\"fm-login-email-7e0c2d94\", \"Usu\u00e1rio n\u00e3o encontrado\"); msg.textContent = \"Usu\u00e1rio n\u00e3o encontrado\"; }\r\n              else if (code === 401) { setFieldError(\"fm-login-password-7e0c2d94\", \"Senha incorreta\"); msg.textContent = \"Senha incorreta\"; }\r\n              else if (code === 400) { msg.textContent = \"Informe email e senha\"; }\r\n              else { msg.textContent = err || \"Falha no login\"; }\r\n            }\r\n          })\r\n          .catch(function(err){ console.error(\"FM Login Network Error\", err); msg.textContent = \"Erro de rede no login\"; });\r\n      });\r\n    } else {\r\n      console.warn(\"FM loginForm not found\");\r\n    }\r\n\r\n    var regForm = document.getElementById(\"fm-reg-form-7e0c2d94\");\r\n    if (regForm) {\r\n      regForm.addEventListener(\"submit\", function(e){\r\n        e.preventDefault();\r\n        var nameEl = document.getElementById(\"fm-reg-name-7e0c2d94\");\r\n        var emailEl = document.getElementById(\"fm-reg-email-7e0c2d94\");\r\n        var passwordEl = document.getElementById(\"fm-reg-password-7e0c2d94\");\r\n        var name = nameEl ? nameEl.value.trim() : \"\";\r\n        var email = emailEl ? emailEl.value.trim() : \"\";\r\n        var password = passwordEl ? passwordEl.value : \"\";\r\n        var password2El = document.getElementById(\"fm-reg-password2-7e0c2d94\");\r\n        var phoneEl = document.getElementById(\"fm-reg-phone-7e0c2d94\");\r\n        var msg = document.getElementById(\"fm-reg-msg-7e0c2d94\");\r\n        msg.textContent = \"\";\r\n        clearErrors();\r\n\r\n        var anyRemoved = false;\r\n        var nameSan = stripDbUnsafeChars(name);\r\n        if (nameSan.removed) { anyRemoved = true; name = nameSan.value; if (nameEl) nameEl.value = name; }\r\n        var passSan = stripDbUnsafeChars(password);\r\n        if (passSan.removed) { anyRemoved = true; password = passSan.value; if (passwordEl) passwordEl.value = password; }\r\n        if (password2El) {\r\n          var p2San = stripDbUnsafeChars(password2El.value);\r\n          if (p2San.removed) { anyRemoved = true; password2El.value = p2San.value; }\r\n        }\r\n        if (phoneEl) {\r\n          var phoneSan = stripDbUnsafeChars(phoneEl.value);\r\n          if (phoneSan.removed) { anyRemoved = true; phoneEl.value = phoneSan.value; }\r\n        }\r\n        if (anyRemoved) {\r\n          msg.textContent = \"Removemos alguns caracteres n\u00e3o suportados (ex.: emojis). Revise os campos.\";\r\n        }\r\n\r\n        var regBtn = document.getElementById(\"fm-reg-btn-7e0c2d94\");\r\n        var hasErr = false;\r\n        if (!name) { setFieldError(\"fm-reg-name-7e0c2d94\", \"Informe seu nome\"); hasErr = true; }\r\n        if (!email) { setFieldError(\"fm-reg-email-7e0c2d94\", \"Informe seu email\"); hasErr = true; }\r\n        else if (email.indexOf('@') < 1) { setFieldError(\"fm-reg-email-7e0c2d94\", \"Email inv\u00e1lido\"); hasErr = true; }\r\n        var minLen = 8;\r\n        var maxLen = 25;\r\n        if (!password || password.length < minLen || password.length > maxLen) { setFieldError(\"fm-reg-password-7e0c2d94\", \"A senha deve ter de \" + minLen + \" a \" + maxLen + \" caracteres\"); hasErr = true; }\r\n        if (password2El) {\r\n          if (!password2El.value) { setFieldError(\"fm-reg-password2-7e0c2d94\", \"Confirme sua senha\"); hasErr = true; }\r\n          else if (password !== password2El.value) { setFieldError(\"fm-reg-password2-7e0c2d94\", \"As senhas n\u00e3o coincidem\"); hasErr = true; }\r\n        }\r\n        if (hasErr) { msg.textContent = \"Corrija os campos destacados\"; return; }\r\n        var phone = phoneEl ? phoneEl.value : \"\";\r\n        console.log(\"FM Register Submit\", { name: name, email: email, phone: phone, courses: selectedCourses });\r\n        withLoading(regBtn, apiPost(\"\/wp-json\/free-members\/v1\/students\/public\", { fm_nonce: regNonce, name: name, email: email, phone: phone, passwordMode: \"manual\", passwordValue: password, courses: selectedCourses }))\r\n          .then(function(res){\r\n            console.log(\"FM Register Response\", { status: res && res.status, data: res && res.data });\r\n            if (res && res.status >= 200 && res.status < 300) {\r\n              withLoading(regBtn, apiPost(\"\/wp-json\/free-members\/v1\/login\", { email: email, password: password }))\r\n                .then(function(lr){\r\n                  console.log(\"FM Auto Login Response\", { status: lr && lr.status, data: lr && lr.data });\r\n                  if (lr && lr.status === 200) {\r\n                    var dest = (lr && lr.data && lr.data.redirect) ? lr.data.redirect : membersUrl;\r\n                    console.log(\"FM Auto Login Success\", { redirect: dest });\r\n                    window.location.href = dest;\r\n                  } else {\r\n                    var lerr = (lr && lr.data && (lr.data.error || lr.data.message)) ? (lr.data.error || lr.data.message) : \"\";\r\n                    msg.textContent = lerr || \"Cadastro ok, mas falhou login\";\r\n                  }\r\n                })\r\n                .catch(function(err){ console.error(\"FM Auto Login Network Error\", err); msg.textContent = \"Cadastro ok, erro no login\"; });\r\n            } else {\r\n              var code = res ? res.status : 0;\r\n              var err = (res && res.data && (res.data.error || res.data.message)) ? (res.data.error || res.data.message) : \"\";\r\n              console.warn(\"FM Register Error\", { status: code, error: err });\r\n              if (code === 409) { setFieldError(\"fm-reg-email-7e0c2d94\", \"Email j\u00e1 cadastrado\"); msg.textContent = \"Email j\u00e1 cadastrado\"; }\r\n              else if (code === 400) {\r\n                msg.textContent = err || \"Dados inv\u00e1lidos\";\r\n                if (err) {\r\n                  if (err.indexOf(\"Senha\") !== -1) { setFieldError(\"fm-reg-password-7e0c2d94\", err); }\r\n                  else if (err.indexOf(\"Email\") !== -1) { setFieldError(\"fm-reg-email-7e0c2d94\", err); }\r\n                  else if (err.indexOf(\"Nome\") !== -1) { setFieldError(\"fm-reg-name-7e0c2d94\", err); }\r\n                }\r\n              }\r\n              else if (code === 403) { msg.textContent = err || \"Sem permiss\u00e3o para cadastrar\"; }\r\n              else { msg.textContent = err || \"Falha no cadastro\"; }\r\n            }\r\n          })\r\n          .catch(function(err){ console.error(\"FM Register Network Error\", err); msg.textContent = \"Erro de rede no cadastro\"; });\r\n      });\r\n    }\r\n\r\n    \/\/ ===== Recupera\u00e7\u00e3o de senha (OTP) =====\r\n    var forgotLink = document.getElementById(\"fm-forgot-7e0c2d94\");\r\n    var overlay = document.getElementById(\"fm-pr-overlay-7e0c2d94\");\r\n    var modal = document.getElementById(\"fm-pr-modal-7e0c2d94\");\r\n    var stepEmail = document.getElementById(\"fm-pr-step-email-7e0c2d94\");\r\n    var stepCode = document.getElementById(\"fm-pr-step-code-7e0c2d94\");\r\n    var stepReset = document.getElementById(\"fm-pr-step-reset-7e0c2d94\");\r\n    var msgBox = document.getElementById(\"fm-pr-msg-7e0c2d94\");\r\n    var errorBox = document.getElementById(\"fm-pr-error-7e0c2d94\");\r\n    var closeBtn = document.getElementById(\"fm-pr-close-7e0c2d94\");\r\n    var sentText = document.getElementById(\"fm-pr-sent-7e0c2d94\");\r\n    var prEmailInput = document.getElementById(\"fm-pr-email-7e0c2d94\");\r\n    var prCodeInput = document.getElementById(\"fm-pr-code-7e0c2d94\");\r\n    var prPassInput = document.getElementById(\"fm-pr-pass-7e0c2d94\");\r\n    var prPass2Input = document.getElementById(\"fm-pr-pass2-7e0c2d94\");\r\n    var requestBtn = document.getElementById(\"fm-pr-request-btn-7e0c2d94\");\r\n    var verifyBtn = document.getElementById(\"fm-pr-verify-btn-7e0c2d94\");\r\n    var resendBtn = document.getElementById(\"fm-pr-resend-btn-7e0c2d94\");\r\n    var resetBtn = document.getElementById(\"fm-pr-reset-btn-7e0c2d94\");\r\n    var countdownEl = document.getElementById(\"fm-pr-countdown-7e0c2d94\");\r\n    var prEmailValue = \"\";\r\n    var resendTimer = null;\r\n    var resendLeft = 180;\r\n\r\n    function prSetFieldError(id, message){\r\n      var err = root.querySelector('[data-error-for=\"'+id+'\"]');\r\n      var input = document.getElementById(id);\r\n      if (err) { err.textContent = message || ''; err.style.display = message ? 'block' : 'none'; }\r\n      if (input) { if (message) { input.classList.add('fm-invalid'); } else { input.classList.remove('fm-invalid'); } }\r\n    }\r\n    function prClearAll(){\r\n      [\"fm-pr-email-7e0c2d94\", \"fm-pr-code-7e0c2d94\", \"fm-pr-pass-7e0c2d94\", \"fm-pr-pass2-7e0c2d94\"].forEach(function(id){ prSetFieldError(id, \"\"); });\r\n      if (errorBox) { errorBox.style.display = 'none'; errorBox.textContent = ''; }\r\n      if (msgBox) { msgBox.textContent = ''; }\r\n    }\r\n    var prTitle = document.getElementById(\"fm-pr-title-7e0c2d94\");\r\n    var prDesc = document.getElementById(\"fm-pr-desc-7e0c2d94\");\r\n    function prShowStep(step){\r\n      if (!modal) return;\r\n      stepEmail.hidden = (step !== 'email');\r\n      stepCode.hidden = (step !== 'code');\r\n      stepReset.hidden = (step !== 'reset');\r\n      if (prTitle) prTitle.hidden = (step === 'code');\r\n      if (prDesc) prDesc.hidden = (step === 'code');\r\n    }\r\n    function prOpen(){\r\n      prClearAll();\r\n      prShowStep('email');\r\n      overlay && (overlay.hidden = false);\r\n      modal && (modal.hidden = false);\r\n      setTimeout(function(){ if (prEmailInput) prEmailInput.focus(); }, 50);\r\n    }\r\n    function prClose(){\r\n      overlay && (overlay.hidden = true);\r\n      modal && (modal.hidden = true);\r\n      try { if (resendTimer) { clearInterval(resendTimer); resendTimer = null; } } catch(e){}\r\n    }\r\n    function startResend(sec){\r\n      resendLeft = sec || 180;\r\n      if (resendBtn) { resendBtn.disabled = true; resendBtn.textContent = 'Reenviar c\u00f3digo em ' + resendLeft + 's'; }\r\n      if (countdownEl) countdownEl.textContent = '';\r\n      try { if (resendTimer) clearInterval(resendTimer); } catch(e){}\r\n      resendTimer = setInterval(function(){\r\n        resendLeft -= 1;\r\n        if (resendLeft <= 0){\r\n          clearInterval(resendTimer); resendTimer = null;\r\n          if (resendBtn) { resendBtn.disabled = false; resendBtn.textContent = 'Reenviar c\u00f3digo'; }\r\n        } else {\r\n          if (resendBtn) { resendBtn.textContent = 'Reenviar c\u00f3digo em ' + resendLeft + 's'; }\r\n        }\r\n      }, 1000);\r\n    }\r\n\r\n    function validEmail(e){ return \/.+@.+\\..+\/.test(e); }\r\n\r\n    if (forgotLink) {\r\n      forgotLink.addEventListener('click', function(ev){\r\n        ev.preventDefault();\r\n        if (forgotLink.disabled || forgotLink.classList.contains('is-loading')) return;\r\n\r\n        var loginEmailEl = document.getElementById(\"fm-login-email-7e0c2d94\");\r\n        var loginMsgEl = document.getElementById(\"fm-login-msg-7e0c2d94\");\r\n        var emailInLogin = loginEmailEl ? loginEmailEl.value.trim() : '';\r\n        \r\n        if (!emailInLogin) {\r\n          prOpen();\r\n          return;\r\n        }\r\n        \r\n        clearErrors();\r\n        if (!validEmail(emailInLogin)) {\r\n          setFieldError(\"fm-login-email-7e0c2d94\", \"Email inv\u00e1lido\");\r\n          if (loginMsgEl) loginMsgEl.textContent = \"Email inv\u00e1lido\";\r\n          return;\r\n        }\r\n\r\n        if (loginMsgEl) {\r\n            loginMsgEl.textContent = \"Processando...\";\r\n            loginMsgEl.style.opacity = \"0.7\";\r\n        }\r\n\r\n        withLoading(forgotLink, apiPost('\/wp-json\/free-members\/v1\/password-reset\/request', { email: emailInLogin }))\r\n          .then(function(res){\r\n            if (loginMsgEl) loginMsgEl.style.opacity = \"1\";\r\n            var code = res ? res.status : 0;\r\n            var data = res ? res.data : {};\r\n            console.log('FM Password Reset Auto Request', { status: code, data: data });\r\n            if (code >= 200 && code < 300){\r\n              prEmailValue = emailInLogin;\r\n              var msg = 'Enviamos um c\u00f3digo de 6 d\u00edgitos para o email ' + emailInLogin + '. Se n\u00e3o estiver na caixa de entrada, verifique o spam.';\r\n              if (sentText) sentText.textContent = msg;\r\n              if (loginMsgEl) loginMsgEl.textContent = \"\"; \/\/ Limpa msg de processando\r\n              prShowStep('code');\r\n              overlay && (overlay.hidden = false);\r\n              modal && (modal.hidden = false);\r\n              startResend(Math.max(((data && (data.cooldown || data.requestCooldownSec)) ? (data.cooldown || data.requestCooldownSec) : 0), 180));\r\n              if (prCodeInput) setTimeout(function(){ prCodeInput.focus(); }, 50);\r\n            } else if (code === 404) {\r\n              var adminMsg = adminEmail ? (' Entre em contato com o suporte via ' + adminEmail + '.') : '';\r\n              setFieldError(\"fm-login-email-7e0c2d94\", \"Usu\u00e1rio n\u00e3o encontrado\" + adminMsg);\r\n              if (loginMsgEl) loginMsgEl.textContent = \"Usu\u00e1rio n\u00e3o encontrado\";\r\n            } else {\r\n              var err = (data && (data.error || data.message)) ? (data.error || data.message) : 'Falha ao enviar c\u00f3digo';\r\n              if (loginMsgEl) loginMsgEl.textContent = err;\r\n            }\r\n          })\r\n          .catch(function(err){ \r\n            console.error('FM Password Reset Auto Request Error', err); \r\n            if (loginMsgEl) {\r\n                loginMsgEl.style.opacity = \"1\";\r\n                loginMsgEl.textContent = 'Erro de rede ao enviar c\u00f3digo'; \r\n            }\r\n            setLoading(forgotLink, false);\r\n          });\r\n      });\r\n    }\r\n    if (overlay) { overlay.addEventListener('click', prClose); }\r\n    if (closeBtn) { closeBtn.addEventListener('click', prClose); }\r\n    if (modal) {\r\n      modal.addEventListener('keydown', function(ev){ if (ev.key === 'Escape') prClose(); });\r\n    }\r\n\r\n    if (requestBtn) {\r\n      requestBtn.addEventListener('click', function(){\r\n        prClearAll();\r\n        var email = prEmailInput ? prEmailInput.value.trim() : '';\r\n        if (!email) { prSetFieldError('fm-pr-email-7e0c2d94', 'Informe seu email'); return; }\r\n        if (!validEmail(email)) { prSetFieldError('fm-pr-email-7e0c2d94', 'Email inv\u00e1lido'); return; }\r\n        prEmailValue = email;\r\n        withLoading(requestBtn, apiPost('\/wp-json\/free-members\/v1\/password-reset\/request', { email: email }))\r\n          .then(function(res){\r\n            var code = res ? res.status : 0;\r\n            var data = res ? res.data : {};\r\n            console.log('FM Password Reset Request', { status: code, data: data });\r\n            if (code >= 200 && code < 300){\r\n              var msg = 'Enviamos um c\u00f3digo de 6 d\u00edgitos para o email ' + email + '. Se n\u00e3o estiver na caixa de entrada, verifique o spam.';\r\n              if (sentText) sentText.textContent = msg;\r\n              prShowStep('code');\r\n              startResend(Math.max(((data && (data.cooldown || data.requestCooldownSec)) ? (data.cooldown || data.requestCooldownSec) : 0), 180));\r\n              if (prCodeInput) setTimeout(function(){ prCodeInput.focus(); }, 50);\r\n            } else if (code === 404) {\r\n              var adminMsg = adminEmail ? (' Entre em contato com o suporte via ' + adminEmail + '.') : '';\r\n              prSetFieldError('fm-pr-email-7e0c2d94', 'Usu\u00e1rio n\u00e3o encontrado.' + adminMsg);\r\n            } else {\r\n              var err = (data && (data.error || data.message)) ? (data.error || data.message) : 'Falha ao enviar c\u00f3digo';\r\n              if (errorBox) { errorBox.style.display = 'block'; errorBox.textContent = err; }\r\n            }\r\n          })\r\n          .catch(function(err){ console.error('FM Password Reset Request Error', err); if (errorBox) { errorBox.style.display = 'block'; errorBox.textContent = 'Erro de rede ao enviar c\u00f3digo'; } });\r\n      });\r\n    }\r\n\r\n    if (resendBtn) {\r\n      resendBtn.addEventListener('click', function(){\r\n        if (resendBtn.disabled) return;\r\n        if (!prEmailValue) return;\r\n        withLoading(resendBtn, apiPost('\/wp-json\/free-members\/v1\/password-reset\/request', { email: prEmailValue }))\r\n          .then(function(res){\r\n            var code = res ? res.status : 0;\r\n            var data = res ? res.data : {};\r\n            console.log('FM Password Reset Resend', { status: code, data: data });\r\n            if (code >= 200 && code < 300){\r\n              startResend(Math.max(((data && (data.cooldown || data.requestCooldownSec)) ? (data.cooldown || data.requestCooldownSec) : 0), 180));\r\n              if (msgBox) msgBox.textContent = 'Novo c\u00f3digo enviado. Verifique sua caixa de entrada\/spam.';\r\n            } else {\r\n              var err = (data && (data.error || data.message)) ? (data.error || data.message) : 'Falha ao reenviar c\u00f3digo';\r\n              if (errorBox) { errorBox.style.display = 'block'; errorBox.textContent = err; }\r\n            }\r\n          })\r\n          .catch(function(err){ console.error('FM Password Reset Resend Error', err); if (errorBox) { errorBox.style.display = 'block'; errorBox.textContent = 'Erro de rede ao reenviar'; } });\r\n      });\r\n    }\r\n\r\n    if (verifyBtn) {\r\n      verifyBtn.addEventListener('click', function(){\r\n        prClearAll();\r\n        var codeVal = prCodeInput ? prCodeInput.value.trim() : '';\r\n        if (!codeVal) { prSetFieldError('fm-pr-code-7e0c2d94', 'Informe o c\u00f3digo'); return; }\r\n        if (!\/^\\d{6}$\/.test(codeVal)) { prSetFieldError('fm-pr-code-7e0c2d94', 'C\u00f3digo deve ter 6 d\u00edgitos'); return; }\r\n        withLoading(verifyBtn, apiPost('\/wp-json\/free-members\/v1\/password-reset\/verify', { email: prEmailValue, code: codeVal }))\r\n          .then(function(res){\r\n            var code = res ? res.status : 0;\r\n            var data = res ? res.data : {};\r\n            console.log('FM Password Reset Verify', { status: code, data: data });\r\n            if (code >= 200 && code < 300){\r\n              prShowStep('reset');\r\n              if (prPassInput) setTimeout(function(){ prPassInput.focus(); }, 50);\r\n            } else {\r\n              var err = (data && (data.error || data.message)) ? (data.error || data.message) : 'C\u00f3digo inv\u00e1lido';\r\n              prSetFieldError('fm-pr-code-7e0c2d94', err);\r\n            }\r\n          })\r\n          .catch(function(err){ console.error('FM Password Reset Verify Error', err); prSetFieldError('fm-pr-code-7e0c2d94', 'Erro de rede ao validar'); });\r\n      });\r\n    }\r\n\r\n    if (resetBtn) {\r\n      resetBtn.addEventListener('click', function(){\r\n        prClearAll();\r\n        var pass = prPassInput ? prPassInput.value : '';\r\n        var pass2 = prPass2Input ? prPass2Input.value : '';\r\n        var anyRemoved = false;\r\n        var passSan = stripDbUnsafeChars(pass);\r\n        if (passSan.removed) { anyRemoved = true; pass = passSan.value; if (prPassInput) prPassInput.value = pass; }\r\n        var pass2San = stripDbUnsafeChars(pass2);\r\n        if (pass2San.removed) { anyRemoved = true; pass2 = pass2San.value; if (prPass2Input) prPass2Input.value = pass2; }\r\n        if (anyRemoved && msgBox) { msgBox.textContent = \"Removemos alguns caracteres n\u00e3o suportados (ex.: emojis). Revise as senhas.\"; }\r\n        var minLen = 8;\r\n        var maxLen = 25;\r\n        var hasErr = false;\r\n        if (!pass || pass.length < minLen) { prSetFieldError('fm-pr-pass-7e0c2d94', 'A senha deve ter pelo menos ' + minLen + ' caracteres'); hasErr = true; }\r\n        if (pass && pass.length > maxLen) { prSetFieldError('fm-pr-pass-7e0c2d94', 'A senha deve ter no m\u00e1ximo ' + maxLen + ' caracteres'); hasErr = true; }\r\n        if (!pass2) { prSetFieldError('fm-pr-pass2-7e0c2d94', 'Confirme sua senha'); hasErr = true; }\r\n        if (pass && pass2 && pass !== pass2) { prSetFieldError('fm-pr-pass2-7e0c2d94', 'As senhas n\u00e3o coincidem'); hasErr = true; }\r\n        if (hasErr) return;\r\n        var codeVal = prCodeInput ? prCodeInput.value.trim() : '';\r\n        withLoading(resetBtn, apiPost('\/wp-json\/free-members\/v1\/password-reset\/reset', { email: prEmailValue, code: codeVal, password: pass, confirm: pass2 }))\r\n          .then(function(res){\r\n            var st = res ? res.status : 0;\r\n            var data = res ? res.data : {};\r\n            console.log('FM Password Reset Final', { status: st, data: data });\r\n            if (st >= 200 && st < 300){\r\n              \/\/ Autologin por garantia\r\n              withLoading(resetBtn, apiPost('\/wp-json\/free-members\/v1\/login', { email: prEmailValue, password: pass }))\r\n                .then(function(lr){\r\n                  var dest = (lr && lr.data && lr.data.redirect) ? lr.data.redirect : membersUrl;\r\n                  window.location.href = dest;\r\n                })\r\n                .catch(function(){ window.location.href = membersUrl; });\r\n            } else {\r\n              var err = (data && (data.error || data.message)) ? (data.error || data.message) : 'Falha ao redefinir senha';\r\n              if (errorBox) { errorBox.style.display = 'block'; errorBox.textContent = err; }\r\n            }\r\n          })\r\n          .catch(function(err){ console.error('FM Password Reset Final Error', err); if (errorBox) { errorBox.style.display = 'block'; errorBox.textContent = 'Erro de rede ao redefinir'; } });\r\n      });\r\n    }\r\n  } catch(err) { console.error(\"FM login widget error:\", err); }\r\n})();\r\n<\/script><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>EmailSenha Bot\u00e3o lembrar senhaEntrarEsqueci minha senha &times; Recuperar senha Insira seu email para recuperar sua senha. Email Recuperar senha C\u00f3digo de 6 d\u00edgitos Validar c\u00f3digoReenviar c\u00f3digo em 180s Nova senha Confirmar senha Alterar senha e logar<\/p>","protected":false},"author":0,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-4122","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/hub.gamepro.network\/pt\/wp-json\/wp\/v2\/pages\/4122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hub.gamepro.network\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/hub.gamepro.network\/pt\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/hub.gamepro.network\/pt\/wp-json\/wp\/v2\/comments?post=4122"}],"version-history":[{"count":129,"href":"https:\/\/hub.gamepro.network\/pt\/wp-json\/wp\/v2\/pages\/4122\/revisions"}],"predecessor-version":[{"id":18723,"href":"https:\/\/hub.gamepro.network\/pt\/wp-json\/wp\/v2\/pages\/4122\/revisions\/18723"}],"wp:attachment":[{"href":"https:\/\/hub.gamepro.network\/pt\/wp-json\/wp\/v2\/media?parent=4122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}