PageSourceSearch

https://falando.app/_next/static/chunks/37872-883e8023994d1df9.js

js falando.app collected 2026-10-02 00:45:04 UTC 32,422 bytes, 1 lines download raw bytes

1!function(){try{var e="u">typeof window?window:"u">typeof global?global:"u">typeof globalThis?globalThis:"u">typeof self?self:{},t=(new e.Error).stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="316e6752-20de-4c58-bd22-18adb1285950",e._sentryDebugIdIdentifier="sentry-dbid-316e6752-20de-4c58-bd22-18adb1285950")}catch(e){}}();"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[14476,37872,51732,83253,83925],{6711:(e,t,r)=>{r.d(t,{c:()=>o});var n=r(12115);let i={isOnTrial:!1,isExpiredFree:!1,daysLeft:null,dayIndex:null,totalDays:null,expiresAt:null};function a(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Date;if("admin"===e.role||e.hasLifetimeAccess)return!0;if(e.complimentaryAccess){let r=e.complimentaryAccessExpiresAt;if(!r||r.getTime()>t.getTime())return!0}let r=e.subscriptionStatus??"";return"active"===r||"trialing"===r}var s=r(53584);function o(){let e=(0,s.useSupabaseAuthStore)(e=>e.user),t=e?.role,r=e?.trialStartedAt?.getTime(),o=e?.trialExpiresAt?.getTime(),l=e?.trialReused,u=e?.subscriptionStatus,d=e?.hasLifetimeAccess,c=e?.complimentaryAccess,f=e?.complimentaryAccessExpiresAt?.getTime();return(0,n.useMemo)(()=>(function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Date;if(!e||!e.trialExpiresAt)return i;let r=e.trialExpiresAt,n=r.getTime();if(!Number.isFinite(n))return i;let s=e.trialStartedAt?.getTime(),o=void 0!==s&&Number.isFinite(s)&&n>s?Math.max(1,Math.round((n-s)/864e5)):7;if(n>t.getTime()){if("paid user"!==e.role||a(e,t))return{...i,expiresAt:r,totalDays:o};let s=Math.min(o,Math.max(1,Math.ceil((n-t.getTime())/864e5))),l=Math.min(o,Math.max(1,o-s+1));return{isOnTrial:!0,isExpiredFree:!1,daysLeft:s,dayIndex:l,totalDays:o,expiresAt:r}}let l="free user"===e.role&&!e.trialReused&&!a(e,t);return{...i,isExpiredFree:l,totalDays:o,expiresAt:r}})(e?{role:t,trialStartedAt:void 0!==r?new Date(r):null,trialExpiresAt:void 0!==o?new Date(o):null,trialReused:l,subscriptionStatus:u,hasLifetimeAccess:d,complimentaryAccess:c,complimentaryAccessExpiresAt:void 0!==f?new Date(f):null}:null),[!!e,t,r,o,l,u,d,c,f])}},8974:(e,t,r)=>{r.d(t,{Ey:()=>o,kR:()=>a,po:()=>s});var n=r(12115);let i=[];function a(e){return i.push(e),()=>{let t=i.indexOf(e);-1!==t&&i.splice(t,1)}}function s(e,t){let r=(0,n.useRef)(t);r.current=t,(0,n.useEffect)(()=>{if(e)return a(()=>r.current())},[e])}function o(){let e=i[i.length-1];return!!e&&(e(),!0)}},14476:(e,t,r)=>{r.d(t,{Cv:()=>i,X7:()=>s,YW:()=>o,runAutoLearningOnServer:()=>a});
1class n extends Error{code;constructor(e,t){super(e),this.name="AutoLearningRequestError",this.code=t}}function i(e){return e instanceof n&&"DECK_LIMIT"===e.code}let a=async function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=await fetch("/api/auto-learning",{...t.signal?{signal:t.signal}:{},method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),i=await r.json();if(!r.ok||!i.success)throw new n(i.error||"Failed to run auto-learning",i.code);return i},s=async(e,t)=>{let r=await a({listeningCount:0,trigger:"manual",useSettingsCounts:!1,vocabularyCount:t});return{added:r.vocabularyAdded,nextLevel:r.nextVocabularyLevel}},o=async(e,t)=>{let r=await a({listeningCount:t,trigger:"manual",useSettingsCounts:!1,vocabularyCount:0});return{added:r.listeningAdded,nextLevel:r.nextListeningLevel}}},17257:(e,t,r)=>{r.d(t,{Dx:()=>h,f5:()=>m,gC:()=>g,lQ:()=>y,vb:()=>f});var n=r(93263),i=r(51732),a=r(53584),s=r(98922),o=r(83781),l=r(43672),u=r(43564);function d(e,t){return(0,u.Ms)(e,t)}function c(e,t){if(a.useSupabaseAuthStore.getState().user?.id!==e)throw Error(`The account changed while ${t}`)}async function f(e){let t=a.useSupabaseAuthStore.getState().user;if((0,n.isOfflineNow)()){if(!t||!(0,s.m)(t))throw Error("Offline study is unavailable");return{session:(0,i.startOfflineStudy)(t.id,e,(0,o.Ln)()),closedSessions:[],lastStudyDate:void 0,totalStudyTime:void 0,reused:!1}}let r=await (0,l.apiFetch)("/api/progress/study-sessions",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...e,clientClosedAt:new Date().toISOString(),lastActivityAt:d(e.mode,e.contentRef)})});return c(t?.id,"starting study"),t&&(0,s.m)(t)&&(0,i.rememberStudySession)(r.session),r}async function m(e){let t=a.useSupabaseAuthStore.getState().user?.id;if(t&&(0,i.hasOfflineStudy)(t,e.sessionId)){let a=(0,i.finalizeOfflineStudy)(t,e.sessionId,{endTime:e.clientEndedAt??(0,o.Ln)().toISOString(),duration:e.clientDuration,grammarPointsStudiedCount:e.grammarPointsStudiedCount,vocabularyItemsStudiedCount:e.vocabularyItemsStudiedCount,listeningItemsStudiedCount:e.listeningItemsStudiedCount,reviewsCompleted:e.reviewsCompleted,accuracy:e.accuracy,mode:e.mode,contentRef:e.contentRef,metadata:e.metadataDelta,interactions:e.interactionsDelta}),{requestDrainSoon:s}=await Promise.all([r.e(34663),r.e(98896)]).then(r.bind(r,19510));if((0,n.isOfflineNow)())s(0);else try{let{syncOfflineStudies:e}=await r.e(51226).then(r.bind(r,51226));await e(t)}catch(e){throw s(0),e}return c(t,"finishing study"),{...a,lastStudyDate:a.session.endTime,totalStudyTime:void 0}}let s=await (0,l.apiFetch)("/api/progress/study-sessions",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({...e,clientEndedAt:e.clientEndedAt??new Date().toISOString(),lastActivityAt:e.lastActivityAt??d(e.mode,e.contentRef)})});return c(t,"finishing study"),s}async function h(e){let t=a.useSupabaseAuthStore.getState().user?.id,s=[];if(t)for(let r of(0,i.readOfflineStudies)(t))r.endTime||r.id===e.excludeSessionId||s.push((0,i.finalizeOfflineStudy)(t,r.id,{duration:e.clientDurations?.[r.id]??r.duration}).session);if(s.length){let{requestDrainSoon:e}=await Promise.all([r.e(34663),r.e(98896)]).then(r.bind(r,19510));e(),c(t,"reconciling study")}if((0,n.isOfflineNow)())return{sessions:s,totalSecondsAdded:s.reduce((e,t)=>e+t.duration,0),lastStudyDate:void 0,totalStudyTime:void 0};let o=await (0,l.apiFetch)("/api/progress/study-sessions",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({clientClosedAt:new Date().toISOString(),lastActivityAt:d(e.mode,e.contentRef),setLastStudyDate:e.setLastStudyDate??!1,minOpenSeconds:30,clientDurations:e.clientDurations,excludeSessionId:e.excludeSessionId})});return c(t,"reconciling study"),{...o,sessions:[...o.sessions??[],...s]}}async function g(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return(0,l.apiFetch)("/api/progress/streak",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({claimDailyGoal:!0===e.claimDailyGoal,lastActivityAt:d()})})}async function y(e){let t=a.useSupabaseAuthStore.getState().user?.id,{addStudyTimeAction:n}=await r.e(90367).then(r.bind(r,12748)),i=await n({studyTime:e});return c(t,"recording study time"),i}},20004:(e,t,r)=>{r.d(t,{A:()=>l});
1var n=r(95155),i=r(19749),a=r(76287),s=r(80531),o=r(92285);function l(e){let t,r,l,u,d,c=(0,i.c)(13),{size:f,className:m,shapeSeed:h,belt:g}=e;c[0]!==f?(t=Math.round(.6*f),c[0]=f,c[1]=t):t=c[1];let y=Math.max(16,t),p=g?`ring-2 ring-offset-2 ring-offset-white ${o.R[g.rank]?.ring??"ring-gray-300"}`:"",S=`bg-primary-100 dark:bg-primary-900 avatar-blob flex items-center justify-center ${p} ${void 0===m?"":m}`;return c[2]!==h?(r=(0,s.x)(h),c[2]=h,c[3]=r):r=c[3],c[4]!==f||c[5]!==r?(l={width:f,height:f,...r},c[4]=f,c[5]=r,c[6]=l):l=c[6],c[7]!==y?(u=(0,n.jsx)(a.A,{className:"text-primary-600 dark:text-primary-100",style:{width:y,height:y}}),c[7]=y,c[8]=u):u=c[8],c[9]!==S||c[10]!==l||c[11]!==u?(d=(0,n.jsx)("div",{className:S,style:l,children:u}),c[9]=S,c[10]=l,c[11]=u,c[12]=d):d=c[12],d}},20269:(e,t,r)=>{r.d(t,{X:()=>f});var n=r(14476),i=r(29993),a=r(56093),s=r(47035),o=r(1573),l=r(53584),u=r(78219);let d=new Map,c=new Map;async function f(e){let t,r=l.useSupabaseAuthStore.getState().user;if(!r?.id)return;let f=r.id,m=e?.force===!0,h=d.get(f);h?await h:!m&&Date.now()-(c.get(f)??0)<3e5||(t=(async()=>{try{let e=await (0,n.runAutoLearningOnServer)({markCompleted:!0,useSettingsCounts:!0});if(l.useSupabaseAuthStore.getState().user?.id!==f)return;let t=o.useSupabaseSRSStore.getState().srsItems.some(e=>e.userId===f);(0,i.Y1)(e,t)&&await Promise.allSettled([s.useSupabaseProgressStore.getState().loadUserProgress(f),(0,a.R)(()=>o.useSupabaseSRSStore.getState().loadUserSRSData(f))]),c.set(f,Date.now())}catch(e){(0,n.Cv)(e)||u.a.error("Auto learning failed:",e)}finally{d.get(f)===t&&d.delete(f)}})(),d.set(f,t),await t)}},20428:(e,t,r)=>{r.d(t,{C:()=>s});var n=r(95155),i=r(19749),a=r(52325);function s(e){let t,r=(0,i.c)(5),{children:s}=e,o=(0,a.C)(),l=o||void 0,u=o?"h-full opacity-40":"contents";return r[0]!==s||r[1]!==o||r[2]!==l||r[3]!==u?(t=(0,n.jsx)("div",{inert:o,"aria-disabled":l,className:u,"data-testid":"unavailable-offline",children:s}),r[0]=s,r[1]=o,r[2]=l,r[3]=u,r[4]=t):t=r[4],t}},21249:(e,t,r)=>{r.r(t),r.d(t,{PendingLink:()=>d});var n=r(95155),i=r(19749),a=r(73549),s=r.n(a),o=r(52325);let l=new Set(["/home","/offline","/reviews","/quick-practice","/practice-mistakes","/verb-conjugation-practice","/vocabulary","/grammar","/listening","/conjugation-tables","/crossword","/time-attack","/settings"]);function u(){let e,t=(0,i.c)(1),{pending:r}=(0,a.useLinkStatus)();return r?(t[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,n.jsx)("span",{"aria-hidden":!0,className:"link-pending"}),t[0]=e):e=t[0],e):null}function d(e){let t,r,a=(0,i.c)(8),{children:d,...c}=e,f=(0,o.C)(),m="string"==typeof c.href?c.href:c.href.pathname??"";if(f&&!function(e){if(!e.startsWith("/")||e.startsWith("//"))return!1;let t=e.split(/[?#]/)[0].replace(/\/$/,"");return l.has(t)||/^\/(grammar|vocabulary|listening)\/[^/]+$/.test(t)}(m))return(0,n.jsx)("span",{role:"link","aria-disabled":"true",className:`${c.className??""} opacity-40 cursor-not-allowed`,title:c.title,children:d});if(f){let e,{href:t,as:r,prefetch:i,replace:s,scroll:o,shallow:l,locale:u,legacyBehavior:f,passHref:m,onNavigate:h,...g}=c,y="string"==typeof t?t:t.pathname??"";if("string"!=typeof t){let e=new URLSearchParams;if("string"==typeof t.query)y+=`?${t.query}`;else{for(let[r,n]of Object.entries(t.query??{}))for(let t of Array.isArray(n)?n:[n])null!=t&&e.append(r,String(t));e.size&&(y+=`?${e}`)}t.hash&&(y+=t.hash.startsWith("#")?t.hash:`#${t.hash}`)}return a[0]!==g||a[1]!==d||a[2]!==y?(e=(0,n.jsx)("a",{...g,href:y,children:d}),a[0]=g,a[1]=d,a[2]=y,a[3]=e):e=a[3],e}return a[4]===Symbol.for("react.memo_cache_sentinel")?(t=(0,n.jsx)(u,{}),a[4]=t):t=a[4],a[5]!==d||a[6]!==c?(r=(0,n.jsxs)(s(),{...c,children:[t,d]}),a[5]=d,a[6]=c,a[7]=r):r=a[7],r}},21265:(e,t,r)=>{r.d(t,{M:()=>s});var n=r(19749),i=r(12115),a=r(63118);function s(){let e,t,r=(0,n.c)(2),[s,l]=(0,i.useState)(o);return r[0]===Symbol.for("react.memo_cache_sentinel")?(e=()=>((0,a.pG)(),l((0,a.getNetworkStatus)()),(0,a.rP)(l)),t=[],r[0]=e,r[1]=t):(e=r[0],t=r[1]),(0,i.useEffect)(e,t),s}function o(){return(0,a.getNetworkStatus)()}},29993:(e,t,r)=>{function n(e,t){return!!e.completedAt||(e.vocabularyAdded??0)+(e.listeningAdded??0)>0||!t}function i(e){return e.hasDeck?"done":e.loadSucceeded&&!e.alreadyReseeded?"reseed":"retry"}async function a(e){let{hasDeck:t,seed:r,recover:n,onSeedError:i}=e;if(!t()){try{await r()}catch(e){i(e)}await n()}}r.d(t,{ID:()=>i,Y1:()=>n,ve:()=>a})},30749:(e,t,r)=>{r.d(t,{z:()=>l});
1var n=r(95155),i=r(19749),a=r(74389),s=r(12115);let o=s.useLayoutEffect;function l(e){let t,r,l,u,d,c,f=(0,i.c)(20),{value:m,from:h,locale:g,durationMs:y,decimals:p,suffix:S,className:w}=e,v=void 0===h?0:h,b=void 0===y?900:y,x=void 0===p?0:p,A=void 0===S?"":S,T=(0,a.I)(),k=(0,s.useRef)(null),I=(0,s.useRef)(null);f[0]!==x||f[1]!==g?(t=new Intl.NumberFormat(g,{minimumFractionDigits:x,maximumFractionDigits:x}),f[0]=x,f[1]=g,f[2]=t):t=f[2];let D=t;f[3]!==b||f[4]!==D||f[5]!==v||f[6]!==T||f[7]!==A||f[8]!==m?(r=()=>{let e=k.current;if(!e)return;let t=Number.isFinite(v)?v:0,r=t=>{let r=`${D.format(t)}${A}`;e.textContent!==r&&(e.textContent=r)};if(T||"function"!=typeof window.requestAnimationFrame||"hidden"===document.visibilityState||b<=0||t===m)return void r(m);let n=null,i=!1,a=()=>{i=!0,null!==I.current&&window.cancelAnimationFrame(I.current),I.current=null,document.removeEventListener("visibilitychange",s),r(m)},s=()=>{"hidden"===document.visibilityState&&a()},o=e=>{if(i)return;I.current=null,null===n&&(n=e);let s=Math.min(1,(e-n)/b);s>=1?a():(r(t+(m-t)*(1-Math.pow(1-s,3))),I.current=window.requestAnimationFrame(o))};return r(t),document.addEventListener("visibilitychange",s),I.current=window.requestAnimationFrame(o),a},l=[m,v,b,T,D,A],f[3]=b,f[4]=D,f[5]=v,f[6]=T,f[7]=A,f[8]=m,f[9]=r,f[10]=l):(r=f[9],l=f[10]),o(r,l);let N=`tabular-nums ${void 0===w?"":w}`;return f[11]!==N?(u=N.trim(),f[11]=N,f[12]=u):u=f[12],f[13]!==D||f[14]!==m?(d=D.format(m),f[13]=D,f[14]=m,f[15]=d):d=f[15],f[16]!==A||f[17]!==u||f[18]!==d?(c=(0,n.jsxs)("span",{ref:k,className:u,children:[d,A]}),f[16]=A,f[17]=u,f[18]=d,f[19]=c):c=f[19],c}},47756:(e,t,r)=>{r.d(t,{A:()=>d});var n=r(95155),i=r(19749),a=r(12115),s=r(80531),o=r(92285),l=r(73981);let u=()=>{let e,t=(0,i.c)(1);return t[0]===Symbol.for("react.memo_cache_sentinel")?(e=(0,n.jsx)("div",{className:"w-full h-full bg-gradient-to-br from-gray-200 to-gray-300 avatar-blob flex items-center justify-center",children:(0,n.jsx)("svg",{className:"w-3/5 h-3/5 text-gray-500",fill:"currentColor",viewBox:"0 0 24 24",children:(0,n.jsx)("path",{d:"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"})})}),t[0]=e):e=t[0],e};function d(e){let t,r,d,c,f,m,h,g,y=(0,i.c)(27),{src:p,alt:S,size:w,belt:v,className:b,priority:x,shapeSeed:A}=e,T=void 0===w?48:w,k=void 0!==x&&x,[I,D]=(0,a.useState)(!1),N=v?.rank;if(y[0]!==N)t=N?o.R[N]?.ring??"ring-gray-300":"ring-gray-300",y[0]=N,y[1]=t;else t=y[1];let _=t;y[2]!==T?(r={width:T,height:T},y[2]=T,y[3]=r):r=y[3];let C=r;y[4]!==I||y[5]!==T||y[6]!==p?(c=(d=function(e,t){if(!e||!e.includes("googleusercontent.com/"))return e;let r=Math.min(Math.max(2*Math.max(Math.round(t)||0,1),96),512);return/=s\d+/.test(e)?e.replace(/=s\d+/,`=s${r}`):/\/s\d+(-[a-z0-9]+)*\//.test(e)?e.replace(/\/s\d+(-[a-z0-9]+)*\//,`/s${r}-c/`):`${e}=s${r}-c`}(p,T))&&"/default-avatar.png"!==d&&""!==d.trim()&&!I,y[4]=I,y[5]=T,y[6]=p,y[7]=d,y[8]=c):(d=y[7],c=y[8]);let M=c,O=`relative avatar-blob ring-2 ring-offset-2 ring-offset-white ${_} ${void 0===b?"":b}`,j=C.width,E=C.height;return y[9]!==A?(f=(0,s.x)(A),y[9]=A,y[10]=f):f=y[10],y[11]!==C.height||y[12]!==C.width||y[13]!==f?(m={width:j,height:E,...f},y[11]=C.height,y[12]=C.width,y[13]=f,y[14]=m):m=y[14],y[15]!==S||y[16]!==C.height||y[17]!==C.width||y[18]!==M||y[19]!==k||y[20]!==d?(h=(0,n.jsx)("div",{className:"w-full h-full overflow-hidden avatar-blob",children:M?(0,n.jsx)(l.default,{src:d,alt:S,width:C.width,height:C.height,sizes:`${C.width}px`,priority:k,className:"w-full h-full object-cover avatar-blob",onError:()=>D(!0)}):(0,n.jsx)(u,{})}),y[15]=S,y[16]=C.height,y[17]=C.width,y[18]=M,y[19]=k,y[20]=d,y[21]=h):h=y[21],y[22]!==S||y[23]!==m||y[24]!==h||y[25]!==O?(g=(0,n.jsx)("div",{className:O,style:m,"aria-label":S,children:h}),y[22]=S,y[23]=m,y[24]=h,y[25]=O,y[26]=g):g=y[26],g}},51732:(e,t,r)=>{r.r(t),r.d(t,{acknowledgeOfflineStudies:()=>h,checkpointOfflineStudy:()=>f,clearOfflineStudies:()=>d,finalizeOfflineStudy:()=>m,hasOfflineStudy:()=>g,readOfflineStudies:()=>u,rememberStudySession:()=>l,startOfflineStudy:()=>c});let n="falando:offline:study:v1:uid:",i=new Map,a=(e,t)=>`${n}${e}:${t}`;function s(e,t){if("u"<typeof localStorage)return null;let r=localStorage.getItem(a(e,t));if(!r)return null;let n=JSON.parse(r);if(n.row?.id!==t||n.row.userId!==e||!Number.isFinite(n.row.duration))throw Error("Invalid saved study session");return n}
1function o(e){localStorage.setItem(a(e.row.userId,e.row.id),JSON.stringify(e))}function l(e){o({row:e,checkpointAt:e.endTime??e.startTime}),e.endTime||i.set(e.id,a(e.userId,e.id))}function u(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if("u"<typeof localStorage)return[];let r=`${n}${e}:`;return Array.from({length:localStorage.length},(e,t)=>localStorage.key(t)).filter(e=>!!e?.startsWith(r)).map(t=>s(e,t.slice(r.length))).filter(e=>t||!e.synced).map(e=>e.row).sort((e,t)=>e.startTime.localeCompare(t.startTime))}function d(e){for(let t of u(e,!0))localStorage.removeItem(a(e,t.id)),i.delete(t.id)}function c(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Date,n={id:crypto.randomUUID(),userId:e,startTime:r.toISOString(),createdAt:r.toISOString(),duration:0,grammarPointsStudiedCount:0,vocabularyItemsStudiedCount:0,listeningItemsStudiedCount:0,reviewsCompleted:0,accuracy:0,...t};return o({row:n,checkpointAt:r.toISOString()}),i.set(n.id,a(e,n.id)),n}function f(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:new Date,n=arguments.length>3?arguments[3]:void 0,a=i.get(e);if(!a)return;let s=localStorage.getItem(a);if(!s)throw Error("The active offline study session is missing");let l=JSON.parse(s);if(!l.row.endTime){if(!Number.isFinite(t)||t<0)throw Error("Invalid active study duration");if(void 0!==n){if(!Number.isInteger(n)||n<0||n>1e5)throw Error("Invalid study interactions");l.row.interactions=Math.max(l.row.interactions??0,n)}l.row.duration=Math.min(28800,Math.floor(t)),l.checkpointAt=r.toISOString(),o(l)}}function m(e,t,r,n){let a=s(e,t)??(n?{row:{...n,endTime:void 0},checkpointAt:n.startTime}:null);if(!a||a.row.userId!==e)throw Error("The offline study session is unavailable");if(a.row.endTime)return{session:a.row,secondsAdded:0};let l=r.endTime??a.checkpointAt,u=r.duration??a.row.duration;if(!Number.isFinite(u)||u<0||!Number.isFinite(Date.parse(l)))throw Error("Invalid study duration");let d=Math.max(0,Math.floor((Date.parse(l)-Date.parse(a.row.startTime))/1e3));if(Date.parse(l)<Date.parse(a.row.startTime))throw Error("Study end precedes its start");let c=Object.fromEntries(Object.entries(r).filter(e=>{let[,t]=e;return void 0!==t})),f={...a.row,...c,id:t,userId:e,endTime:l,duration:Math.min(28800,Math.floor(u),d+1)};return o({row:f,checkpointAt:l}),i.delete(t),{session:f,secondsAdded:f.duration}}function h(e,t){let r=u(e,!0).filter(t=>s(e,t.id)?.synced);for(let[t,n]of r.entries())(t<r.length-2e3||Date.parse(n.startTime)<Date.now()-10368e6)&&localStorage.removeItem(a(e,n.id));for(let r of t){let t=s(e,r);t?.row.endTime&&o({...t,synced:!0})}}function g(e,t){return null!==s(e,t)}},52325:(e,t,r)=>{r.d(t,{C:()=>o});var n=r(19749),i=r(21265),a=r(53584),s=r(98922);function o(){let e,t=(0,n.c)(3),r=(0,i.M)(),o=(0,a.useSupabaseAuthStore)(l);return t[0]!==r||t[1]!==o?(e=!!o&&(0,s.m)(o)&&(!r.online||!1===r.
1serverReachable),t[0]=r,t[1]=o,t[2]=e):e=t[2],e}function l(e){return e.user}},54435:(e,t,r)=>{r.d(t,{_:()=>a});var n=r(19749),i=r(12115);function a(e){let t,r,a=(0,n.c)(3),s=void 0===e?767:e,[o,l]=(0,i.useState)(!1);return a[0]!==s?(t=()=>{let e=window.matchMedia(`(max-width: ${s}px)`),t=()=>l(e.matches);return t(),e.addEventListener("change",t),()=>e.removeEventListener("change",t)},r=[s],a[0]=s,a[1]=t,a[2]=r):(t=a[1],r=a[2]),(0,i.useEffect)(t,r),o}},55999:(e,t,r)=>{r.d(t,{f:()=>m,u:()=>c});var n=r(95155),i=r(19749),a=r(71952),s=r(73583),o=r(99345),l=r(12115),u=r(88840),d=r(69300);function c(e){let t,r,c,m,h,g,y,p,S,w,v,b,x,A,T,k=(0,i.c)(47),{isOpen:I,onClose:D,onConfirm:N,title:_,message:C,confirmText:M,cancelText:O,tone:j,mode:E,initialFocus:$}=e,P=void 0===E?"confirm":E,R=void 0===$?"confirm":$,F=(0,o.c)("common");k[0]!==M||k[1]!==F?(t=M??F("confirm"),k[0]=M,k[1]=F,k[2]=t):t=k[2];let L=t;k[3]!==O||k[4]!==P||k[5]!==F?(r=O??F("info"===P?"ok":"cancel"),k[3]=O,k[4]=P,k[5]=F,k[6]=r):r=k[6];let U=r,J=f[void 0===j?"default":j],z=(0,l.useRef)(null),q=(0,l.useRef)(null),K="confirm"===P;k[7]!==R||k[8]!==I||k[9]!==K?(c={isOpen:I,confirmRef:z,cancelRef:q,arrowKeyNav:K,initialFocus:R},k[7]=R,k[8]=I,k[9]=K,k[10]=c):c=k[10],(0,d.D)(c),k[11]!==_?(m=(0,n.jsx)(a.lG.Title,{as:"h3",className:"font-display min-w-0 flex-1 text-lg font-semibold leading-6 tracking-tight text-gray-900 dark:text-gray-100",children:_}),k[11]=_,k[12]=m):m=k[12],k[13]!==F?(h=F("close"),k[13]=F,k[14]=h):h=k[14],k[15]===Symbol.for("react.memo_cache_sentinel")?(g=(0,n.jsx)(s.A,{className:"h-5 w-5","aria-hidden":!0}),k[15]=g):g=k[15],k[16]!==D||k[17]!==h?(y=(0,n.jsx)("button",{type:"button",onClick:D,className:"shrink-0 -m-1 rounded-md p-1 text-gray-500 transition-colors hover:bg-gray-100 hover:text-gray-700 dark:text-white/60 dark:hover:bg-white/10 dark:hover:text-white focus:outline-none focus:ring-2 focus:ring-primary-500","aria-label":h,children:g}),k[16]=D,k[17]=h,k[18]=y):y=k[18],k[19]!==y||k[20]!==m?(p=(0,n.jsxs)("div",{className:"flex items-start gap-3 px-5 pt-5",children:[m,y]}),k[19]=y,k[20]=m,k[21]=p):p=k[21],k[22]!==C?(S=C?(0,n.jsx)("div",{className:"px-5 pt-3 pb-2 text-sm text-gray-600 dark:text-gray-300 whitespace-pre-line",children:C}):(0,n.jsx)("div",{className:"shrink-0 pb-2"}),k[22]=C,k[23]=S):S=k[23],k[24]!==p||k[25]!==S?(w=(0,n.jsxs)("div",{className:"min-h-0 flex-1 overflow-y-auto [overflow-wrap:anywhere]",children:[p,S]}),k[24]=p,k[25]=S,k[26]=w):w=k[26],k[27]!==P||k[28]!==D||k[29]!==U?(v="confirm"===P&&(0,n.jsx)("button",{ref:q,type:"button",onClick:D,className:"btn-neutral btn-sm inline-flex w-full justify-center whitespace-normal [overflow-wrap:anywhere] sm:w-auto",children:U}),k[27]=P,k[28]=D,k[29]=U,k[30]=v):v=k[30],k[31]!==P||k[32]!==D||k[33]!==N?(b=()=>{"confirm"===P&&N?.(),D()},k[31]=P,k[32]=D,k[33]=N,k[34]=b):b=k[34];let G=`btn-sm inline-flex w-full justify-center whitespace-normal [overflow-wrap:anywhere] sm:w-auto ${J}`,W="info"===P?U:L;return k[35]!==b||k[36]!==G||k[37]!==W?(x=(0,n.jsx)("button",{ref:z,type:"button",onClick:b,className:G,children:W}),k[35]=b,k[36]=G,k[37]=W,k[38]=x):x=k[38],k[39]!==v||k[40]!==x?(A=(0,n.jsxs)("div",{className:"shrink-0 flex flex-col-reverse gap-2 px-5 pt-3 pb-5 sm:flex-row sm:justify-end sm:gap-3",children:[v,x]}),k[39]=v,k[40]=x,k[41]=A):A=k[41],k[42]!==I||k[43]!==D||k[44]!==w||k[45]!==A?(T=(0,n.jsxs)(u.a,{isOpen:I,onClose:D,panelClassName:"surface flex w-full max-w-md max-h-full flex-col overflow-hidden text-start align-middle transition-all",children:[w,A]}),k[42]=I,k[43]=D,k[44]=w,k[45]=A,k[46]=T):T=k[46],T}let f={default:"btn-primary",destructive:"btn-danger",info:"btn-primary",success:"btn-depth [--btn-edge:#166534] bg-green-600 hover:bg-green-700 text-white font-medium focus:outline-none focus-visible:ring-2 focus-visible:ring-green-500"};function m(){let e,t,r,a,s,o=(0,i.c)(16),[u,d]=(0,l.useState)(null);o[0]===Symbol.for("react.memo_cache_sentinel")?(e=e=>new Promise(t=>{d({...e,mode:"confirm",resolve:t})}),o[0]=e):e=o[0];let f=e;o[1]===Symbol.for("react.memo_cache_sentinel")?(t=e=>new Promise(t=>{d({...e,cancelText:e.okText,mode:"info",resolve:()=>t()})}),o[1]=t):t=o[1];let m=t;o[2]!==u?(r=()=>{u?.resolve(!0)},o[2]=u,o[3]=r):r=o[3];let h=r;o[4]!==u?(a=()=>{u?.resolve(!1),d(null)},o[4]=u,o[5]=a):a=o[5];let g=a,y=!!u,p=u?.title??"",S=u?.message,w=u?.confirmText,v=u?.cancelText,b=u?.tone??"default",x=u?.mode??"confirm";return o[6]!==g||o[7]!==h||o[8]!==x||o[9]!==y||o[10]!==p||o[11]!==S||o[12]!==w||o[13]!==v||o[14]!==b?(s={confirm:f,alert:m,modal:(0,n.jsx)(c,{isOpen:y,onClose:g,onConfirm:h,title:p,message:S,confirmText:w,cancelText:v,tone:b,mode:x})},o[6]=g,o[7]=h,o[8]=x,o[9]=y,o[10]=p,o[11]=S,o[12]=w,o[13]=v,o[14]=b,o[15]=s):s=o[15],s}},56093:(e,t,r)=>{r.d(t,{R:()=>n});async function n(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=Math.max(1,t.attempts??3),n=t.delayMs??(e=>300*2**(e-1)),i=t.sleep??(e=>new Promise(t=>setTimeout(t,e))),a={success:!1};for(let t=0;t<r;t+=1){t>0&&await i(n(t));try{a=await e()??{success:!1}}catch(e){a={success:!1,error:e instanceof Error?e.message:"load threw"}}if(a.success)break}return a}},65441:(e,t,r)=>{r.d(t,{e:()=>l});var n=r(19749),i=r(20269),a=r(30299),s=r(53584),o=r(12115);
1function l(){let e,t,r=(0,n.c)(4),l=(0,s.useSupabaseAuthStore)(d),c=(0,a.useDashboardStore)(u);r[0]!==c||r[1]!==l?(e=()=>{l&&((0,i.X)(),c())},t=[l,c],r[0]=c,r[1]=l,r[2]=e,r[3]=t):(e=r[2],t=r[3]),(0,o.useEffect)(e,t)}function u(e){return e.refreshAll}function d(e){return e.user?.id}},75540:(e,t,r)=>{r.d(t,{A9:()=>g,Fn:()=>l,K2:()=>d,N9:()=>m,Oh:()=>h,TR:()=>p,WA:()=>S,__syncAuthStreakSummary:()=>b,__syncAuthStudySummary:()=>v,mG:()=>x,mN:()=>w,vH:()=>y,xw:()=>u});var n=r(51336),i=r(43564),a=r(32475),s=r(53584),o=r(17257);function l(e,t){return(0,i.AT)(e,t)}function u(e,t){return(0,i.iG)(e,t)}function d(e){try{let t=(0,i.Ms)();return(0,i.lH)(e,t,6e4)}catch{return e}}let c=null,f=null;function m(){c=null,f=null}async function h(e){let t=Date.now();if(c&&c.userId===e&&t-c.at<2e3)return c.promise;let r=(async()=>{let{data:t,error:r}=await (0,n.Nj)(()=>a.supabase.from("profiles").select("streak, streak_updated_date, daily_goal_met_date, weekly_goal_met_week_start").eq("id",e).single(),{timeoutMs:15e3,retries:1});if(r)throw r;return{streak:Number(t?.streak)||0,streakUpdatedDate:t?.streak_updated_date?new Date(t.streak_updated_date):null,dailyGoalMetDate:t?.daily_goal_met_date??null,weeklyGoalMetWeekStart:t?.weekly_goal_met_week_start??null}})().catch(e=>{throw c=null,e});return c={userId:e,at:t,promise:r},r}async function g(e,t,r){let i=Date.now();if(f&&f.userId===e&&i-f.at<2e3&&f.startMs<=t.getTime()&&f.endMs>=r.getTime())return f.promise;let s=(async()=>{let{data:i,error:s}=await (0,n.Nj)(()=>a.supabase.from("study_sessions").select("start_time, end_time, duration").eq("user_id",e).lt("start_time",r.toISOString()).or(`end_time.is.null,end_time.gte.${t.toISOString()}`),{timeoutMs:15e3,retries:1});if(s)throw s;return(i||[]).map(e=>({startTime:new Date(e.start_time),endTime:e.end_time?new Date(e.end_time):void 0,duration:Number(e.duration)||0}))})().catch(e=>{throw f=null,e});return f={userId:e,at:i,startMs:t.getTime(),endMs:r.getTime(),promise:s},s}function y(e,t,r,n){return(0,i.OJ)(e,t,r,n)}function p(e){return{id:e.id,userId:e.userId,startTime:new Date(e.startTime),endTime:e.endTime?new Date(e.endTime):void 0,duration:Number(e.duration)||0,grammarPointsStudied:Array(Number(e.grammarPointsStudiedCount)||0).fill(""),vocabularyItemsStudied:Array(Number(e.vocabularyItemsStudiedCount)||0).fill(""),listeningItemsStudied:Array(Number(e.listeningItemsStudiedCount)||0).fill(""),reviewsCompleted:Number(e.reviewsCompleted)||0,accuracy:Number(e.accuracy)||0,createdAt:new Date(e.createdAt),mode:e.mode??void 0,contentRef:e.contentRef??void 0,metadata:e.metadata??null,interactions:Number(e.interactions)||0}}function S(e,t){let r=[...e];for(let e of t){let t=r.findIndex(t=>t.id===e.id);if(t>=0){r[t]=e;continue}r.push(e)}return r.sort((e,t)=>t.createdAt.getTime()-e.createdAt.getTime())}function w(e,t,r){let n=new Map;for(let e of t)n.set(e.id,e);for(let t of e){if(t.userId!==r)continue;let e=n.get(t.id);if(!e){n.set(t.id,t);continue}t.endTime&&!e.endTime&&n.set(t.id,t)}return[...n.values()].sort((e,t)=>t.createdAt.getTime()-e.createdAt.getTime())}function v(e){let t=s.useSupabaseAuthStore.getState().user;if(!t)return;let r=e.totalStudyTime??t.totalStudyTime,n=e.lastStudyDate?new Date(e.lastStudyDate):t.lastStudyDate??null;(r!==t.totalStudyTime||n?.getTime()!==t.lastStudyDate?.getTime())&&s.useSupabaseAuthStore.setState({user:{...t,totalStudyTime:r,lastStudyDate:n}})}function b(e){let t=s.useSupabaseAuthStore.getState().user;t&&(t.streak!==e.streak||t.streakUpdatedDate?.getTime()!==e.streakUpdatedDate?.getTime())&&s.useSupabaseAuthStore.setState({user:{...t,streak:e.streak,streakUpdatedDate:e.streakUpdatedDate}})}async function x(e,t){let{isOfflineNow:n}=await Promise.resolve().then(r.bind(r,93263));if(n()){let{previewOfflineProgress:n}=await Promise.all([r.e(55929),r.e(14700),r.e(89754)]).then(r.bind(r,89754));return n(e,t)}let i=await (0,o.gC)();if(s.useSupabaseAuthStore.getState().user?.id!==e)throw Error("The account changed while reconciling the streak");return i.changed&&m(),{streak:i.streak,streakUpdatedDate:i.streakUpdatedDate?new Date(i.streakUpdatedDate):null}}},76994:(e,t,r)=>{r.d(t,{t:()=>o});var n=r(19749),i=r(71675),a=r(48018),s=r(52594);function o(){let e,t,r=(0,n.c)(5),o=(0,i.QY)().user?.email??"",u=(0,s.use
1SupabaseSettingsStore)(l);r[0]!==o?(e=a._.includes(o),r[0]=o,r[1]=e):e=r[1];let d=e,c=d&&u;return r[2]!==d||r[3]!==c?(t={isSimpleMode:c,canAccessSimpleMode:d},r[2]=d,r[3]=c,r[4]=t):t=r[4],t}function l(e){return e.learning.simpleMode}},80531:(e,t,r)=>{r.d(t,{x:()=>i});let n=["58% 42% 55% 45% / 52% 48% 42% 58%","45% 55% 42% 58% / 48% 52% 58% 42%","52% 48% 58% 42% / 45% 55% 48% 52%","48% 52% 45% 55% / 58% 42% 55% 45%","55% 45% 48% 52% / 42% 58% 52% 48%","42% 58% 52% 48% / 55% 45% 45% 55%"];function i(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"--avatar-blob";return null==e||""===e?{}:{[t]:n[function(e){let t=String(e),r=0x811c9dc5;for(let e=0;e<t.length;e++)r^=t.charCodeAt(e),r=Math.imul(r,0x1000193);return r>>>0}(e)%n.length]}}},83253:(e,t,r)=>{r.d(t,{H:()=>l,Zn:()=>c,clearOfflineProgressSnapshot:()=>d,j9:()=>a,jG:()=>s,kt:()=>u,qs:()=>o});let n=e=>`falando:offline:progress:v1:uid:${e}`,i=e=>`falando:offline:progress-refresh:v1:uid:${e}`;function a(e){return"u">typeof localStorage&&"1"===localStorage.getItem(i(e))}function s(e){localStorage.setItem(i(e),"1")}function o(e){localStorage.removeItem(i(e))}function l(e){if("u"<typeof localStorage)return null;let t=localStorage.getItem(n(e));if(!t)return null;let r=JSON.parse(t);if(r.userId!==e||!Number.isFinite(r.totalStudyTime)||!Number.isFinite(Date.parse(r.syncedAt)))throw Error("Invalid saved progress");return r}function u(e){localStorage.setItem(n(e.userId),JSON.stringify(e))}function d(e){"u">typeof localStorage&&(localStorage.removeItem(n(e)),o(e))}function c(e,t){let r=l(e);return r?{...t,total_study_time:r.totalStudyTime,last_study_date:r.lastStudyDate,streak:r.streak,streak_updated_date:r.streakUpdatedDate,...void 0!==r.experience?{experience:r.experience}:{}}:t}},83925:(e,t,r)=>{r.r(t),r.d(t,{clearPendingSessionAward:()=>c,holdSessionAward:()=>i,isSessionAwardActive:()=>a,readPendingSessionAward:()=>d,readPendingSessionAwards:()=>u,writePendingSessionAward:()=>l});let n=new Set;function i(e,t){let r=`${e}:${t}`;return n.add(r),()=>{n.delete(r)}}function a(e,t){return n.has(`${e}:${t}`)}function s(e){return"falando:pendingSessionAward:"+e}function o(){try{return window.localStorage}catch{return null}}function l(e,t){if(e.userId&&e.dedupeKey&&e.basePoints>0)try{let t=o();if(!t)throw Error("Session reward storage is unavailable");t.setItem(s(e.userId)+":"+encodeURIComponent(e.dedupeKey),JSON.stringify(e))}catch(e){if(t?.strict)throw e;console.warn("Session reward could not be saved on this device:",e)}}function u(e){if(arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),!e)return[];let t=o();if(!t)return[];try{let r=s(e),n=Array.from({length:t.length},(e,r)=>t.key(r)).filter(e=>!!e&&(e===r||e.startsWith(r+":"))),i=new Map;for(let r of n){let n=null;try{n=JSON.parse(t.getItem(r)||"null")}catch{t.removeItem(r);continue}if(!n||n.userId!==e||"string"!=typeof n.dedupeKey||!n.dedupeKey||"number"!=typeof n.basePoints||!Number.isFinite(n.basePoints)||n.basePoints<=0||"number"!=typeof n.createdAt||!Number.isFinite(n.createdAt)){t.removeItem(r);continue}i.set(n.dedupeKey,{...n,source:n.source||"reviews"})}return[...i.values()].sort((e,t)=>e.createdAt-t.createdAt)}catch{return[]}}function d(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now();return u(e,t)[0]??null}function c(e,t){if(!e)return;let r=t??d(e)?.dedupeKey;if(r)try{let t=o();t?.removeItem(s(e)+":"+encodeURIComponent(r));let n=t?.getItem(s(e));n&&JSON.parse(n)?.dedupeKey===r&&t?.removeItem(s(e))}catch{}}},93482:(e,t,r)=>{r.d(t,{C:()=>a});var n=r(95155),i=r(19749);function a(e){let t,r,a=(0,i.c)(3),{className:s}=e;return a[0]===Symbol.for("react.memo_cache_sentinel")?(t=(0,n.jsx)("path",{d:"M12 2v20M3.34 7l17.32 10M3.34 17L20.66 7M9 4l3 3 3-3M9 20l3-3 3 3M3.57 10.6l4.1-1.1-1.1-4.1M17.43 18.6l-1.1-4.1 4.1-1.1M6.57 18.6l1.1-4.1-4.1-1.1M20.43 10.6l-4.1-1.1 1.1-4.1"}),a[0]=t):t=a[0],a[1]!==s?(r=(0,n.jsx)("svg",{className:s,"data-frozen-streak-icon":"","aria-hidden":"true",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",children:t}),a[1]=s,a[2]=r):r=a[2],r}}}]);

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.