1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,95057,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={formatUrl:function(){return i},formatWithValidation:function(){return c},urlObjectKeys:function(){return s}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90809)._(e.r(98183)),l=/https?|ftp|gopher|file/;function i(e){let{auth:t,hostname:r}=e,n=e.protocol||"",a=e.pathname||"",i=e.hash||"",s=e.query||"",c=!1;t=t?encodeURIComponent(t).replace(/%3A/i,":")+"@":"",e.host?c=t+e.host:r&&(c=t+(~r.indexOf(":")?`[${r}]`:r),e.port&&(c+=":"+e.port)),s&&"object"==typeof s&&(s=String(o.urlQueryToSearchParams(s)));let u=e.search||s&&`?${s}`||"";return n&&!n.endsWith(":")&&(n+=":"),e.slashes||(!n||l.test(n))&&!1!==c?(c="//"+(c||""),a&&"/"!==a[0]&&(a="/"+a)):c||(c=""),i&&"#"!==i[0]&&(i="#"+i),u&&"?"!==u[0]&&(u="?"+u),a=a.replace(/[?#]/g,encodeURIComponent),u=u.replace("#","%23"),`${n}${c}${a}${u}${i}`}let s=["auth","hash","host","hostname","href","path","pathname","port","protocol","query","search","slashes"];function c(e){return i(e)}},18581,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"useMergedRef",{enumerable:!0,get:function(){return a}});let n=e.r(71645);function a(e,t){let r=(0,n.useRef)(null),a=(0,n.useRef)(null);return(0,n.useCallback)(n=>{if(null===n){let e=r.current;e&&(r.current=null,e());let t=a.current;t&&(a.current=null,t())}else e&&(r.current=o(e,n)),t&&(a.current=o(t,n))},[e,t])}function o(e,t){if("function"!=typeof e)return e.current=t,()=>{e.current=null};{let r=e(t);return"function"==typeof r?r:()=>e(null)}}("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},73668,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"isLocalURL",{enumerable:!0,get:function(){return o}});let n=e.r(18967),a=e.r(52817);function o(e){if(!(0,n.isAbsoluteUrl)(e))return!0;try{let t=(0,n.getLocationOrigin)(),r=new URL(e,t);return r.origin===t&&(0,a.hasBasePath)(r.pathname)}catch(e){return!1}}},84508,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"errorOnce",{enumerable:!0,get:function(){return n}});let n=e=>{}},22016,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n={default:function(){return m},useLinkStatus:function(){return y}};for(var a in n)Object.defineProperty(r,a,{enumerable:!0,get:n[a]});let o=e.r(90809),l=e.r(43476),i=o._(e.r(71645)),s=e.r(95057),c=e.r(8372),u=e.r(18581),d=e.r(18967),f=e.r(5550);e.r(33525);let p=e.r(88540),h=e.r(91949),g=e.r(73668),b=e.r(9396);function m(t){var r,n;let a,o,m,[y,x]=(0,i.useOptimistic)(h.IDLE_LINK_STATUS),j=(0,i.useRef)(null),{href:w,as:_,children:C,prefetch:S=null,passHref:P,replace:E,shallow:L,scroll:k,onClick:T,onMouseEnter:A,onTouchStart:N,legacyBehavior:$=!1,onNavigate:O,transitionTypes:M,ref:R,unstable_dynamicOnHover:U,...I}=t;a=C,$&&("string"==typeof a||"number"==typeof a)&&(a=(0,l.jsx)("a",{children:a}));let F=i.default.useContext(c.AppRouterContext),B=!1!==S,q=!1!==S?null===(n=S)||"auto"===n?b.FetchStrategy.PPR:b.FetchStrategy.Full:b.FetchStrategy.PPR,D="string"==typeof(r=_||w)?r:(0,s.formatUrl)(r);if($){if(a?.$$typeof===Symbol.for("react.lazy"))throw Object.defineProperty(Error("`<Link legacyBehavior>` received a direct child that is either a Server Component, or JSX that was loaded with React.lazy(). This is not supported. Either remove legacyBehavior, or make the direct child a Client Component that renders the Link's `<a>` tag."),"__NEXT_ERROR_CODE",{value:"E863",enumerable:!1,configurable:!0});o=i.default.Children.only(a)}let K=$?o&&"object"==typeof o&&o.ref:R,z=i.default.useCallback(e=>(null!==F&&(j.current=(0,h.mountLinkInstance)(e,D,F,q,B,x)),()=>{j.current&&((0,h.unmountLinkForCurrentNavigation)(j.current),j.current=null),(0,h.unmountPrefetchableInstance)(e)}),[B,D,F,q,x]),G={ref:(0,u.useMergedRef)(z,K),onClick(t){$||"function"!=typeof T||T(t),$&&o.props&&"function"==typeof o.props.onClick&&o.props.onClick(t),!F||t.defaultPrevented||function(t,r,n,a,o,l,s){if("u">typeof window){let c,{nodeName:u}=t.currentTarget;if("A"===u.toUpperCase()&&((c=t.currentTarget.getAttribute("target"))&&"_self"!==c||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.nativeEvent&&2===t.nativeEvent.which)||t.currentTarget.hasAttribute("download"))return;if(!(0,g.isLocalURL)(r)){a&&(t.preventDefault(),location.replace(r));return}if(t.preventDefault(),l){let e=!1;if(l({preventDefault:()=>{e=!0}}),e)return}let{dispatchNavigateAction:d}=e.r(99781);i.default.startTransition(()=>{d(r,a?"replace":"push",!1===o?p.ScrollBehavior.NoScroll:p.ScrollBehavior.Default,n.current,s)})}}(t,D,j,E,k,O,M)},onMouseEnter(e){$||"function"!=typeof A||A(e),$&&o.props&&"function"==typeof o.props.onMouseEnter&&o.props.onMouseEnter(e),F&&B&&(0,h.onNavigationIntent)(e.currentTarget,!0===U)},onTouchStart:function(e){$||"function"!=typeof N||N(e),$&&o.props&&"function"==typeof o.props.onTouchStart&&o.props.onTouchStart(e),F&&B&&(0,h.onNavigationIntent)(e.currentTarget,!0===U)}};return(0,d.isAbsoluteUrl)(D)?G.href=D:$&&!P&&("a"!==o.type||"href"in o.props)||(G.href=(0,f.addBasePath)(D)),m=$?i.default.cloneElement(o,G):(0,l.jsx)("a",{...I,...G,children:a}),(0,l.jsx)(v.Provider,{value:y,children:m})}e.r(84508);let v=(0,i.createContext)(h.IDLE_LINK_STATUS),y=()=>(0,i.useContext)(v);("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esMo
1dule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18566,(e,t,r)=>{t.exports=e.r(76562)},19575,e=>{"use strict";var t=e.i(71645);e.s(["useDownloadPlatform",0,function(){let[e,r]=(0,t.useState)("unknown");return(0,t.useEffect)(()=>{let e,t;r((e=window.navigator.userAgent,t=/Macintosh/i.test(e)&&window.navigator.maxTouchPoints>1,/iPhone|iPad|iPod/i.test(e)||t?"ios":/Android/i.test(e)?"android":"desktop"))},[]),e}])},58902,e=>{"use strict";var t=e.i(43476),r=e.i(22016),n=e.i(71645),a=e.i(58249),o=e.i(25859),l=e.i(19575);e.s(["default",0,function({androidLabel:e="Try the free web tool",campaign:i,children:s,className:c,content:u,customProductPageId:d,source:f}){let p=(0,l.useDownloadPlatform)(),[h,g]=(0,n.useState)(()=>(0,o.directAppStoreUrl)({campaign:i,cta:u,customProductPageId:d}));return((0,n.useEffect)(()=>{g((0,o.buildWebAttributionLink)({campaign:i,cta:u,customProductPageId:d}).href)},[i,u,d]),"android"===p)?(0,t.jsx)(r.default,{className:c,href:"/tools/body-fat-from-photo/","data-cta-source":f,"data-cta-content":`${u}_android_tool`,"data-cta-platform":"android",onClick:()=>(0,a.trackOncePerDay)("cta_platform_alternative_click",{source:f,cta_content:`${u}_android_tool`,destination:"body_fat_web_tool"},`${f}:${u}:android_tool`),children:e}):(0,t.jsx)("a",{className:c,href:h,target:"_blank",rel:"noopener","data-cta-source":f,"data-cta-content":u,"data-cta-campaign":i,"data-cta-custom-product-page-id":d,"data-cta-platform":"unknown"===p?"apple":p,children:s})}])},28466,e=>{"use strict";var t=e.i(43476),r=e.i(71645),n=e.i(22016),a=e.i(18566),o=e.i(58902);e.s(["default",0,function(){let e=(0,a.usePathname)()||"/",[l,i]=(0,r.useState)(!1),s=e.replace(/index\.html$/,"").replace(/\/$/,"")||"/",c=/^\/blog($|\/)/.test(s),u=/^\/comics($|\/|\.html$)/.test(s),d=/^\/tools($|\/)/.test(s),f=/^\/about($|\/)/.test(s),p=/^\/leaderboard($|\/)/.test(s),h=e=>e?"active":void 0;return(0,t.jsx)("nav",{className:"blog-nav",children:(0,t.jsxs)("div",{className:"container blog-nav-inner",children:[(0,t.jsxs)(n.default,{href:"/",className:"blog-nav-logo",children:[(0,t.jsx)("img",{src:"/assets/favicons/favicon.webp",alt:"GainFrame",loading:"lazy",className:"blog-nav-icon"}),(0,t.jsx)("span",{className:"blog-nav-wordmark",children:"GainFrame"})]}),(0,t.jsxs)("button",{className:`nav-hamburger${l?" nav-hamburger--open":""}`,"aria-label":l?"Close menu":"Open menu","aria-expanded":l,"aria-controls":"site-navigation-links",onClick:()=>i(e=>!e),children:[(0,t.jsx)("span",{}),(0,t.jsx)("span",{}),(0,t.jsx)("span",{})]}),(0,t.jsxs)("div",{id:"site-navigation-links",className:`blog-nav-links${l?" nav-open":""}`,children:[(0,t.jsx)(n.default,{href:"/comics/",className:h(u),onClick:()=>i(!1),children:"Comics"}),(0,t.jsx)(n.default,{href:"/tools/",className:h(d),onClick:()=>i(!1),children:"Tools"}),(0,t.jsx)(n.default,{href:"/about/",className:h(f),onClick:()=>i(!1),children:"About"}),(0,t.jsx)(n.default,{href:"/leaderboard/",className:h(p),onClick:()=>i(!1),children:"Leaderboard"}),(0,t.jsx)(n.default,{href:"/blog/",className:h(c),onClick:()=>i(!1),children:"Blog"}),(0,t.jsx)(o.default,{className:"nav-cta-btn",source:"blog_nav",content:"nav_download",campaign:"web-blog-nav",androidLabel:"Try free tool",children:"Get the app"})]})]})})}])},50356,e=>{"use strict";var t=e.i(71645);e.s(["default",0,function(){return(0,t.useEffect)(()=>{let e=document.querySelectorAll(".scroll-reveal, .scroll-reveal-left, .scroll-reveal-right, .parallax-float, .badge-pop, .tilt-in, .hero-text-stagger, .hero-image-stagger");if(!e.length)return;let t=e=>e.classList.add("visible");if(!("IntersectionObserver"in window))return void e.forEach(t);let r=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&(t(e.target),r.unobserve(e.target))})},{threshold:.01,rootMargin:"0px 0px -5% 0px"});return e.forEach(e=>{let n=e.getBoundingClientRect();n.top<window.innerHeight&&n.bottom>0?t(e):r.observe(e)}),()=>r.disconnect()},[]),null}])},64956,e=>{"use strict";var t=e.i(43476),r=e.i(58902);e.s(["default",0,function(){return(0,t.jsx)("section",{className:"blog-product-bridge","aria-labelledby":"blog-product-bridge-title",children:(0,t.jsxs)("div",{className:"container blog-product-bridge-inner",children:[(0,t.jsxs)("div",{className:"blog-product-bridge-copy",children:[(0,t.jsx)("h2",{id:"blog-product-bridge-title",children:"Reading about progress is useful. Seeing yours is better."}),(0,t.jsx)("p",{children:"Turn one gym photo into body-fat, FFMI, and muscle-group trends, then keep the signal going with consistent check-ins."})]}),(0,t.jsxs)("div",{className:"blog-product-bridge-actions",children:[(0,t.jsx)(r.default,{className:"blog-product-bridge-button",source:"blog_index",content:"product_bridge",campaign:"web-blog-index",androidLabel:"Try the free body-fat tool",children:"Try GainFrame free"}),(0,t.jsx)("p",{className:"blog-product-bridge-proof",children:"4.9 â
from 35 ratings · 5,000 lifters · Private by design"})]})]})})}])},1749,e=>{"use strict";var t=e.i(71645);e.s(["default",0,function(){return(0,t.useEffect)(()=>{let e=document.querySelector(".blog-filter"),t=document.querySelector(".blog-grid");if(!e||!t)return;let r=Array.from(e.querySelectorAll(".blog-filter-pill")),n=e.querySelector("[data-blog-filter-select]"),a=document.querySelector("[data-blog-filter-status]"),o=t.innerHTML,l=a?.textContent??"",i=0,s=null,c={all:"All"},u=new Set(["all"]);
1r.forEach(e=>{let t=e.dataset.tag;t&&(u.add(t),c[t]=(e.textContent??"").replace(/\d+\s*$/,"").trim())}),n&&Array.from(n.options).forEach(e=>{e.value&&(u.add(e.value),c[e.value]=e.textContent?e.textContent.replace(/\s*\(\d+\)\s*$/,"").trim():e.value)});let d=()=>{let e=new URLSearchParams(window.location.search).get("tag");return e&&u.has(e)?e:"all"},f=()=>{t.querySelectorAll(".blog-card").forEach(e=>{e.classList.add("visible")})},p=async e=>{let u=++i;if(r.forEach(t=>{let r=t.dataset.tag===e;t.classList.toggle("is-active",r),t.setAttribute("aria-pressed",r?"true":"false")}),n){let t=!r.some(t=>t.dataset.tag===e)&&"all"!==e;n.value=t?e:"",n.classList.toggle("is-active",t)}if("all"===e)return void("all"!==t.dataset.blogFilterMode&&(t.innerHTML=o),t.dataset.blogFilterMode="all",t.removeAttribute("aria-busy"),f(),a&&(a.textContent=l));t.setAttribute("aria-busy","true"),a&&(a.textContent=`Loading ${c[e]} postsâ¦`);try{let r,n=await (!s&&(s=fetch("/blog-index.json",{headers:{Accept:"application/json"}}).then(async e=>{if(!e.ok)throw Error(`Blog index request failed (${e.status})`);let t=await e.json();if(!(t&&"object"==typeof t&&"number"==typeof t.total&&"number"==typeof t.pageSize&&Array.isArray(t.posts)&&t.posts.every(e=>e&&"string"==typeof e.categorySlug&&"string"==typeof e.html)))throw Error("Blog index response was invalid");return t}).catch(e=>{throw s=null,e})),s);if(u!==i)return;let o=n.posts.filter(t=>t.categorySlug===e);if((r=document.createElement("template")).innerHTML=o.map(e=>e.html).join("\n"),t.replaceChildren(r.content.cloneNode(!0)),f(),t.dataset.blogFilterMode=e,t.removeAttribute("aria-busy"),a){let t=o.length;0===t?a.textContent="No posts found for this topic.":a.textContent=`Showing ${t} ${c[e]} ${1===t?"post":"posts"}`}}catch{if(u!==i)return;t.removeAttribute("aria-busy"),a&&(a.textContent="We couldnât load that topic. The current archive page is still available.")}},h=e=>{let t=new URL(window.location.href);"all"===e?t.searchParams.delete("tag"):t.searchParams.set("tag",e),window.history.pushState({tag:e},"",t),p(e)},g=e=>{let t=e.target,r=t?.closest(".blog-filter-pill");r&&r.dataset.tag&&h(r.dataset.tag)},b=()=>h(n?.value||"all"),m=()=>void p(d());return e.addEventListener("click",g),n?.addEventListener("change",b),window.addEventListener("popstate",m),p(d()),()=>{i+=1,e.removeEventListener("click",g),n?.removeEventListener("change",b),window.removeEventListener("popstate",m)}},[]),null}])}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.