{"version":3,"sources":["webpack:///./src/constants.ts","webpack:///./src/components/pages/dashboard/challenge/constants.ts","webpack:///./src/components/language-select/language-select.tsx","webpack:///./src/components/plot/plot.tsx","webpack:///./src/components/pages/dashboard/challenge/images/ibm.svg","webpack:///./src/components/pages/dashboard/challenge/images/lenovo.svg","webpack:///./src/components/pages/dashboard/challenge/images/mozilla.svg","webpack:///./src/components/pages/dashboard/challenge/images/sap.svg","webpack:///./src/components/share-buttons/share-buttons.tsx","webpack:///./src/components/share-modal/share-modal.tsx","webpack:///./src/components/pages/dashboard/awards/star.svg","webpack:///./src/components/pages/dashboard/awards/stars.svg","webpack:///./src/components/pages/dashboard/challenge/images/stars-disabled.svg","webpack:///./src/components/pages/dashboard/challenge/images/stars.svg","webpack:///./src/components/onboarding-modal/images/dashboard.png","webpack:///./src/components/onboarding-modal/images/invite.jpg","webpack:///./src/components/onboarding-modal/images/contribute.png","webpack:///./src/components/onboarding-modal/images/1-red-copy.svg","webpack:///./src/components/invite-modal/images/mail.svg","webpack:///./src/hooks/use-router.ts","webpack:///./src/components/pages/dashboard/stats/contribution-activity.tsx","webpack:///./src/components/pages/dashboard/stats/stats-card.tsx","webpack:///./src/components/pages/dashboard/stats/leaderboard-card.tsx","webpack:///./src/components/pages/dashboard/ui.tsx","webpack:///./src/components/pages/dashboard/stats/progress-card.tsx","webpack:///./src/components/pages/dashboard/stats/stats.tsx","webpack:///./src/components/pages/dashboard/goals/custom-goal-steps.tsx","webpack:///./src/components/pages/dashboard/goals/custom-goal.tsx","webpack:///./src/components/pages/dashboard/goals/goal-row.tsx","webpack:///./src/components/pages/dashboard/goals/goals.tsx","webpack:///./src/components/pages/dashboard/awards/awards.tsx","webpack:///./src/components/pages/dashboard/challenge/team-avatar.tsx","webpack:///./src/components/pages/dashboard/challenge/weekly-challenge-board.tsx","webpack:///./src/components/pages/dashboard/challenge/weekly-challenge.tsx","webpack:///./src/components/pages/dashboard/challenge/challenge-list.tsx","webpack:///./src/components/pages/dashboard/challenge/leaderboard-card.tsx","webpack:///./src/components/pages/dashboard/challenge/team-card.tsx","webpack:///./src/components/pages/dashboard/challenge/challenge-offline.tsx","webpack:///./src/components/onboarding-modal/onboarding-modal.tsx","webpack:///./src/components/pages/dashboard/challenge/challenge.tsx","webpack:///./src/components/invite-modal/invite-modal.tsx","webpack:///./src/components/pages/dashboard/dashboard.tsx"],"names":["DAILY_GOALS","Object","freeze","speak","listen","BENEFITS","WHATS_PUBLIC","challengeLogos","ibm","background","border","url","require","lenovo","mozilla","sap","getNow","dateParam","location","search","match","date","dateStr","dateObj","Date","isNaN","getTime","isValidDate","isChallengeLive","challenge","now","start","end","isBeforeChallenge","pilotDates","isEnrolled","account","enrollment","_a","weeklyChallengeCopy","title","subtitle","explanation","FINAL_CHALLENGE_WEEK","length","contributableLocales","ALL_LOCALES","value","onChange","React","Downshift","initialInputValue","getItemProps","highlightedIndex","isOpen","toggleMenu","className","onClick","Localized","id","concat","map","l","i","key","join","item","Y_OFFSET","TOTAL_LINE_MARGIN","LINE_OFFSET","TEXT_OFFSET","PLOT_PADDING","Plot","constructor","state","width","svgRef","updateSize","this","setState","current","getBoundingClientRect","componentDidMount","window","addEventListener","componentWillUnmount","removeEventListener","render","children","data","formatNumber","max","renderXTickLabel","tickCount","tickMultipliers","props","tickMultiplier","slice","reverse","find","m","ticks","height","ref","Array","from","_","y","x","dominantBaseline","textAnchor","Math","round","x1","y1","x2","y2","stroke","datum","BAR_HEIGHT","n","toString","BarPlot","reduce","d","toLocaleString","hour","minute","replace","barWidth","getBarX","offset","stopColor","fill","module","exports","SHARE_URL","URLS","HTTP_ROOT","withLocalization","getString","shareTextId","locale","useLocale","addNotification","useAction","Notifications","actions","addPill","encodedShareText","encodeURIComponent","link","shareURLInputRef","useRef","select","document","execCommand","trackSharing","FontIcon","type","readOnly","href","target","rel","text","Modal","innerClassName","src","alt","elems","bold","ShareButtons","useRouter","useContext","RouterContext","ContributionActivity","api","fetchContributionActivity","connect","StatsCard","iconButtons","overlay","tabs","currentLocale","setLocale","useState","selectedTab","setSelectedTab","keys","useEffect","label","LanguageSelect","Lottie","lazy","animationData","FetchRow","UnconnectedLeaderboard","rows","isAtEnd","playingClipIndex","audioRef","scroller","youRow","playAvatarClip","clipUrl","position","self","trackVoiceAvatar","play","pause","currentTime","scrollToUser","row","scrollTop","offsetTop","updateScrollIndicator","el","style","setProperty","min","scrollHeight","clientHeight","forLocale","fetchLeaderboard","fetchMore","cursor","globalLocale","trackDashboard","newRows","allRows","filter","r1","r2","clientHash","sort","defaultOptions","loop","autoplay","rendererSettings","preserveAspectRatio","items","prevPosition","nextPosition","Infinity","you","isProduction","avatarClipUrl","Avatar","avatar_url","preload","onEnded","onError","onMouseEnter","onMouseLeave","username","Suspense","fallback","options","eventListeners","total","MicIcon","OldPlayIcon","floor","onScroll","Leaderboard","forwardRef","LeaderboardCard","useAccount","saveAccount","User","showInfo","setShowInfo","showOverlay","setShowOverlay","leaderboardRef","Boolean","visible","BookmarkIcon","EyeIcon","EyeOffIcon","Icon","PlayOutlineIcon","display","InfoIcon","CrossIcon","LocalizedGetAttribute","attribute","Toggle","offText","onText","defaultChecked","event","checked","vars","minutes","profileLink","LocaleLink","to","PROFILE_INFO","Fraction","numerator","denominator","percentage","Circle","radius","strokeW","center","rest","strokeWidth","r","cx","cy","RADIUS","STROKE","CircleProgress","circumference","PI","size","color","strokeDasharray","strokeDashoffset","ProgressCard","personalCurrent","personalGoal","custom_goals","customGoals","useAPI","overallCurrent","setOverallCurrent","fetchDailyClipsCount","fetchDailyVotesCount","fetchAndSetOverallCount","overallGoal","isSpeak","customGoal","g","currentCustomGoal","undefined","hasCustomGoalForThis","goalsPath","DASHBOARD","GOALS","amount","LinkButton","rounded","left","goal","outline","absolute","toLocaleRouteBuilder","SPEAK","LISTEN","StatsPage","allGoals","dashboardLocale","goals","globalGoals","o","Buttons","ArrowButton","ArrowLeft","CloseButton","ViewGoal","onNext","days_interval","PenIcon","toUpperCase","nextButtonProps","history","toLocaleRoute","hours","language","attrs","LabeledSelect","Button","disabled","push","closeButtonProps","currentFields","marginBottom","totalHours","periodMonths","people","clipsPerDay","completedFields","daysInterval","subscribed","setSubscribed","privacyAgreed","setPrivacyAgreed","isSubscribed","useIsSubscribed","basket_token","getManageSubscriptionURL","SettingsIcon","privacyLink","PRIVACY","blank","TERMS","CheckIcon","showShareModal","setShowShareModal","isWeekly","ShareModal","count","onRequestClose","ShareIcon","STATE_KEYS","STEPS","Radio","onChecked","StepButtons","setStepIndex","stepIndex","touchedStepIndex","isCompleted","isActive","CompletedFields","states","completedStates","stateKey","labelId","findIndex","k","CurrentFields","currentStateKey","name","obj","CustomGoal","email","refreshUser","refresh","hasStartParam","includes","pathname","setTouchedStepIndex","initialState","showOverwriteModal","setShowOverwriteModal","showAbortEditModal","setShowAbortEditModal","Step","steps","handleNext","confirmed","nextIndex","createGoal","locales","some","accent","subscribeToNewsletter","showViewGoal","buttons","Cancel","Yes","Exit","visibility","Wave","viewBox","stopOpacity","fillRule","opacity","mixBlendMode","transform","xlinkHref","GoalBox","isNext","streaks","clips","votes","toLocaleDateString","year","month","day","GoalRow","goalInfo","GoalsPage","entries","NoAwardsPage","INTERVAL_LABELS","1","7","AwardBox","award","AwardsPage","seenAwards","then","awards","a","buckets","bucket","team","logo","boxSizing","padding","WeeklyChallengeBoard","isDisabled","week","individualAvatarUrl","teamToken","weekly","user","role","speak_total","listen_total","TeamAvatar","invite","invite_total","WeeklyChallenge","currentWeek","pastWeek","notifications","useNotifications","index","notification","kind","NotificationPill","ChevronDown","PointsIcon","ChallengeList","callService","service","fetchTopMembers","member","fetchTopTeams","fetchTopContributors","transformRankingToString","ranking","String","challengeComplete","isYou","toLowerCase","w1_points","w1","w2_points","w2","w3_points","w3","points","approved","accuracy","Percentage","FilledCheckIcon","showVisibleIcon","recorded","validated","TeamboardCard","teamboardRef","justifyContent","withRouter","duration","addAchievement","earlyEnroll","img","OperationButtons","PlayOutlineGreenIcon","OnboardingModal","step","setStep","stepData","isLastStep","trackChallenge","prevStep","SkipIcon","Overlay","hideOverlay","radio","setVisibleRadio","visibleForTeam","visibleForAll","LabeledCheckbox","showOnboardingModal","setShowOnboardingModal","setWeekly","fetchWeeklyProgress","_b","LeaderBoardCard","challengeTeams","readableName","TeamBoardCard","scrollTo","top","behavior","ChallengeOffline","Redirect","copiedRecently","setCopiedRecently","inputRef","timer","setTimeout","fetchInviteStatus","showInviteSendToast","hasEarnedSessionToast","challengeEnded","sessionStorage","setItem","JSON","stringify","clearTimeout","BalanceText","origin","TopBar","setShowInviteModal","isAboveMdWidth","setIsAboveMdWidth","isChallengeEnrolled","isChallengeTabSelected","endsWith","pathParts","split","unseenAwards","seen_at","isContributable","titleBarLocales","dropdownLocales","checkSize","innerWidth","LocaleNavLink","CHALLENGE","STATS","path","AWARDS","NATIVE_NAMES","ChallengeBar","DashboardContent","Page","setAllGoals","fetchGoals","setAllPoints","fetchChallengePoints","Dashboard","showInviteModal","pages","subPath","defaultPage","unshift","ChallengePage","useLayoutEffect","InviteModal","parse","getItem","removeItem","setInviteContributeAchievement","Switch","Route","exact","params"],"mappings":"0FAAA,sGAAO,MAAMA,EAAcC,OAAOC,OAAO,CACvCC,MAAO,CAAC,IAAK,KACbC,OAAQ,CAAC,OAGEC,EAAW,CACtB,YACA,gBACA,aACA,mBACA,aACA,mBAGWC,EAAe,CAC1B,mBACA,+BACA,wBACA,mCACA,mC,iCChBF,8OAAO,MAAMC,EAMT,CACFC,IAAK,CAAEC,WAAY,OAAQC,QAAQ,EAAMC,IAAKC,EAAQ,MACtDC,OAAQ,CACNJ,WAAY,OACZC,QAAQ,EACRC,IAAKC,EAAQ,MAEfE,QAAS,CACPL,WAAY,OACZC,QAAQ,EACRC,IAAKC,EAAQ,MAEfG,IAAK,CAAEN,WAAY,OAAQC,QAAQ,EAAMC,IAAKC,EAAQ,OAQlDI,EAAS,KACb,MAAMC,EACJC,SAASC,QAAUD,SAASC,OAAOC,MAAM,sBACrCC,EAAOJ,aAAS,EAATA,EAAY,GACzB,OAAOI,GATYC,KACnB,MAAMC,EAAU,IAAIC,KAAKF,GACzB,OAAOC,aAAmBC,OAASC,MAAMF,EAAQG,YAOlCC,CAAYN,GAAQ,IAAIG,KAAKH,GAAQ,IAAIG,MAG7CI,EAAmBC,IAC9B,MAAMC,EAAMd,IACZ,OAAOc,GAAOD,EAAUE,OAASD,EAAMD,EAAUG,KAGtCC,EAAqBJ,GACpBb,IACCa,EAAUE,MAGZG,EAAgC,CAC3CH,MAAO,IAAIP,KAAK,cAChBQ,IAAK,IAAIR,KAAK,eAGHW,EAAcC,IAAuB,aAC7B,QAD6B,EAChDA,aAAO,EAAPA,EAASC,kBAAUC,WAAA,EAAAA,EAAET,WAEVU,EAAsB,CACjC,CACEC,MAAO,yBACPC,SAAU,8DACVC,YACE,iGAEJ,CACEF,MAAO,mBACPC,SAAU,+CACVC,YACE,qGAEJ,CACEF,MAAO,sBACPC,SACE,+EACFC,YACE,sEAIOC,EAAuBJ,EAAoBK,OAAS,G,iCC5EjE,mEAIA,MAAMC,EAAuBjC,EAAQ,IAIxBkC,EAAc,cAEZ,YAAC,MACdC,EADc,SAEdC,GAFa,SAObC,gBAACC,IAAS,CAACC,kBAAmBJ,EAAOC,SAAUA,GAC5C,QAAC,aAAEI,EAAF,iBAAgBC,EAAhB,OAAkCC,EAAlC,WAA0CC,GAA3C,SACCN,uBAAKO,UAAU,kBAAkBC,QAAS,IAAMF,KAC9CN,gBAACS,IAAS,CAACC,GAAIZ,GACbE,uBAAKO,UAAU,aAEhBF,GACCL,sBAAIQ,QAAS,IAAMF,KAChB,CAACT,GAAac,OAAOf,GAAsBgB,IAAI,CAACC,EAAGC,IAClDd,gBAACS,IAAS,CAACM,IAAKF,EAAGH,GAAIG,GACrBb,oCACEO,UAAW,CACTM,IAAMf,EAAQ,WAAa,GAC3BM,IAAqBU,EAAI,cAAgB,IACzCE,KAAK,MACHb,EAAa,CAAEc,KAAMJ,IAAI,CAC7Bf,MAAOe,a,m5BC/BlB,MAAMK,EAAW,GACXC,EAAoB,IAEpBC,EAAcC,GACdC,EAAe,GAcd,MAAOC,UAAavB,YAAlCwB,c,oBAME,KAAAC,MAEI,CACFC,MAAO,GAGT,KAAAC,OAAS3B,cAWT,KAAA4B,WAAa,KACXC,KAAKC,SAAS,CACZJ,MAAOG,KAAKF,OAAOI,QAAQC,wBAAwBN,SAXjDO,oB,yCACJC,OAAOC,iBAAiB,SAAUN,KAAKD,YACvCC,KAAKD,gBAGPQ,uBACEF,OAAOG,oBAAoB,SAAUR,KAAKD,YAS5CU,SACE,IAAIjD,cAAA,SACFkD,EADE,KAEFC,EAFE,aAGFC,EAHE,IAIFC,EAJE,iBAKFC,EALE,UAMFC,EANE,gBAOFC,GAAexD,EACfyD,iGAEF,MAAM,MAAEpB,GAAUG,KAAKJ,MAEjBsB,EACJF,EACGG,QACAC,UACAC,KAAKC,GAAKT,EAAMS,IAAM,EACrBC,GAASR,EAAY,GAAKG,EAIhC,OAFAL,GAAaU,EAASV,EAAMU,EAG1BpD,qCACE0B,MAAM,OACN2B,OAAO,OACP9C,UAAU,QACNuC,EAAK,CACTQ,IAAKzB,KAAKF,SACT4B,MAAMC,KAAK,CAAE7D,OAAQiD,IAAahC,IAAI,CAAC6C,EAAG3C,KACzC,MAAM4C,EAAK5C,EAAIK,EAAqByB,EAAY1B,EAChD,OACElB,gBAACA,WAAc,CAACe,IAAKD,GACnBd,wBACEO,UAAU,aACVoD,EAhFW,GAiFXD,EAAGA,EACHE,iBAAiB,SACjBC,WAAW,OACVpB,EACCqB,KAAKC,OAAQnB,EAAY,EAAI9B,GAAK4B,GAAQE,EAAY,MAG1D5C,wBACEgE,GAAI5C,EACJ6C,GAAIP,EACJQ,GAAIxC,EAAQJ,EACZ6C,GAAIT,EACJU,OAAO,uBAKd5B,EAAK5B,IAAI,CAACyD,EAAOvD,IAChBd,wBACEe,IAAKD,EACLP,UAAU,eACVoD,EACEvC,EACAN,IAAMY,EAAQJ,EAxGD,IAwG+BkB,EAAK7C,QAEnD+D,EAAGxC,EAAWC,GACbwB,EAAiB0B,EAAOvD,KAG5ByB,EAAS,CAAEb,QAAOgB,UAM3B,MAIM4B,EAAanD,GAAqB,EADrB,GAGnB,SAASsB,EAAa8B,GACpB,OAAOA,EAAI,IAAOT,KAAKC,MAAMQ,EAAI,KAAQ,IAAMA,EAAEC,WAG5C,MAAMC,EAAU,QAAC,KACtBjC,GADqB,SAKrBxC,gBAACuB,EAAI,CACHiB,KAAMA,EACNC,aAAcA,EACdC,KAAMF,GAAQ,IAAIkC,OAAO,CAAChC,EAAKiC,IAAMb,KAAKpB,IAAIA,EAAKiC,EAAE7E,OAAQ,GAC7D6C,iBAAkB,IAAa,IAAZ,KAAEvE,GAAU,EAS7B,OARmB,IAAIG,KAAKH,GACzBwG,eAAe,GAAI,CAClBC,KAAM,UACNC,OAAQ,YAETC,QAAQ,OAAQ,IAChBA,QAAQ,MAAO,KAIpBnC,UA3Be,EA4BfC,gBAAiB,CAAC,EAAG,GAAI,IAAK,MAC7B,IAAmB,IAAlB,IAAEH,EAAF,MAAOhB,GAAW,EAClB,MAAMsD,EAAWtD,EAAQ,IA/BV,EADA,GAiCTuD,EAAWnE,GACfM,EACAE,EACA0D,EAAW,EACVlE,GAAKY,EAAQJ,EA1JK,IAoHT,GAwCZ,OACEtB,gCACGuD,MAAMC,KAAK,CAAE7D,OA1CN,KA0C2BiB,IAAI,CAAC6C,EAAG3C,IACzCd,wBACEe,IAAKD,EACLP,UAAU,KACVoD,EAAGsB,EAAQnE,GACX4C,EAAGxC,EACHQ,MAAOsD,EACP3B,OAAQiB,KAIZtE,4BACEA,kCAAgBU,GAAG,cAAcwD,GAAG,KAAKC,GAAG,QAC1CnE,wBAAMkF,OAAO,KAAKC,UAAU,YAC5BnF,wBAAMkF,OAAO,MAAMC,UAAU,eAG/B3C,GAAQ,IAAI5B,IAAI,CAAC,EAAgBE,KAAa,IAA7B,MAAEhB,GAA2B,EAC9C,MAAMuD,EAAUvD,EAAQwE,EAAc5B,GAAO,EAC7C,OACE1C,wBACEe,IAAKD,EACLsE,KAAK,oBACL7E,UAAWO,EAAI,IAjEb,GAiE+B,UAAY,GAC7C6C,EAAGsB,EAAQnE,GACX4C,EAAGxC,EAAWoD,EAAajB,EAC3B3B,MAAOsD,EACP3B,OAAQA,W,0CC7LxBgC,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,iHCgB3C,MAAMC,EAAYC,IAAKC,UAqERC,mBA/Df,YAAuD,IAAjC,UAAEC,EAAF,YAAaC,GAAoB,EACrD,MAAOC,GAAUC,cACXC,EAAkBC,YAAUC,IAAcC,QAAQC,SAClDC,EAAmBC,mBAEnBV,EADJC,GAEc,aADa,CAAEU,KAAMf,KAG/BgB,EAAmBC,iBAAO,MAEhC,OACExG,gCACEA,0BACEU,GAAG,YACHH,UAAU,eACVC,QAAS,KACP+F,EAAiBxE,QAAQ0E,SACzBC,SAASC,YAAY,QACrBC,YAAa,OAAQf,GAErBE,EACE/F,gCACEA,gBAAC6G,IAAQ,CAACC,KAAK,OAAOvG,UAAU,SAAU,IAC1CP,gBAACS,IAAS,CAACC,GAAG,eACZV,kCAKRA,yBAAO8G,KAAK,OAAOC,UAAQ,EAACjH,MAAOyF,EAAWjC,IAAKiD,IACnDvG,gBAAC6G,IAAQ,CAACC,KAAK,UAEjB9G,qBACEO,UAAU,eACVyG,KACE,gDACAX,mBAAmBd,GAErB0B,OAAO,SACPC,IAAI,sBACJ1G,QAAS,IAAMoG,YAAa,WAAYf,IACxC7F,gBAAC6G,IAAQ,CAACC,KAAK,cAEjB9G,qBACEO,UAAU,eACVyG,KAAM,yCAA2CZ,EACjDa,OAAO,SACPC,IAAI,sBACJ1G,QAAS,IAAMoG,YAAa,UAAWf,IACvC7F,gBAAC6G,IAAQ,CAACC,KAAK,aAEjB9G,qBACEO,UAAU,eACVyG,KAAM,yCACNC,OAAO,SACPC,IAAI,sBACJ1G,QAAS,IAAMoG,YAAa,WAAYf,IACxC7F,gBAAC6G,IAAQ,CAACC,KAAK,kB,qVCxEPzH,Q,IAAA,YACduG,EADc,MAEdrG,EAFc,KAGd4H,GAAI9H,EACJyD,sCAMI,OACJ9C,gBAACoH,IAAKpK,eAACqK,eAAe,eAAkBvE,GACtC9C,uBAAKO,UAAU,mBACbP,uBAAKO,UAAU,OAAO+G,IAAI,gBAAgBC,IAAI,WAE/ChI,EACCS,0BAAKT,GAELS,gBAACS,IAAS,CAACC,GAAG,kBAAkB8G,MAAO,CAAEC,KAAMzH,4BAC7CA,4BAGHmH,GAAQnH,yBAAImH,GACbnH,uBAAKO,UAAU,iBACbP,gBAAC0H,EAAY1K,iBAAK,CAAE4I,qB,oBC/B1BP,EAAOC,QAAU,IAA0B,wC,0NCA3CD,EAAOC,QAAU,IAA0B,wC,0CCA3CD,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,sFCA3CD,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,gECA3CD,EAAOC,QAAU,IAA0B,wC,wICGrC,SAAUqC,IACd,OAAOC,qBAAWC,K,0VCepB,MAAMC,UAA6B9H,YAAnCwB,c,oBACE,KAAAC,MAAe,CAAEe,KAAM,IAEjBP,oB,yCACJ,MAAM,IAAE8F,EAAF,KAAOvE,EAAP,OAAaqC,GAAWhE,KAAKiB,YAC7BjB,KAAKC,SAAS,CAClBU,WAAYuF,EAAIC,0BAA0BxE,EAAMqC,QAGpDvD,SACE,OAAOtC,gBAACyE,IAAO,CAACjC,KAAMX,KAAKJ,MAAMe,QAItByF,kBAAwB,QAAC,IAAEF,GAAH,QAAyB,CAAEA,QAAnDE,CACbH,G,qCCzBY,SAAUI,EAAV,GAgBb,IAhBiC,UAChC3H,EADgC,MAEhChB,EAFgC,YAGhC4I,EAHgC,QAIhCC,EAJgC,KAKhCC,EALgC,UAMhCzJ,EANgC,cAOhC0J,GASD,EACC,MAAOzC,EAAQ0C,GAAaC,mBAAS3I,MAC9B4I,EAAaC,GAAkBF,mBAASxL,OAAO2L,KAAKN,GAAM,IAKjE,OAJAO,oBAAU,IAAML,EAAUD,GAAgCzI,KAAc,CACtEyI,IAIAtI,uBAAKO,UAAW,eAAiBA,GAAa,KAC3C6H,EACDpI,uBAAKO,UAAU,qBACbP,uBAAKO,UAAU,kBACZ3B,EACCoB,sBAAIO,UAAU,mBAAmBhB,GAEjCS,gBAACS,IAAS,CAACC,GAAInB,GACbS,4BAGHmI,GAEHnI,uBAAKO,UAAU,WACbP,uBAAKO,UAAU,QACZvD,OAAO2L,KAAKN,GAAMzH,IAAIiI,GACdjK,EACLoB,0BACEe,IAAK8H,EACL/B,KAAK,SACLvG,UAAWsI,GAASJ,EAAc,WAAa,GAC/CjI,QAAS,IAAMkI,EAAeG,IAC7BA,GAGH7I,gBAACS,IAAS,CAACM,IAAK8H,EAAOnI,GAAImI,GACzB7I,0BACE8G,KAAK,SACLvG,UAAWsI,GAASJ,EAAc,WAAa,GAC/CjI,QAAS,IAAMkI,EAAeG,QAMvCjK,EACCoB,wBAAMO,UAAU,gBAAc,gBAE9BP,gBAAC8I,IAAc,CAAChJ,MAAO+F,EAAQ9F,SAAUwI,KAG7CvI,uBAAKO,UAAU,WACZ8H,EAAKI,GAAa,CAAE5C,OAAQA,GAAUhG,IAAc,KAAOgG,O,2TC1CtE,MAAMkD,EAASC,eAAK,IAAM,mCACpBC,EAAgBtL,EAAQ,IAqB9B,MAAMuL,EAAYpG,GAChB9C,sBAAIO,UAAU,QACZP,0CAAa8C,GACX9C,oCAKa0F,YACjB,QAAC,UAAEC,EAAF,MAAa7F,GAAd,SACEE,uBAAKO,UAAU,QACbP,uBAAKO,UAAU,SACH,MAATT,EAAgB6F,EAAU,8BAAgC7F,GAE7DE,uBAAKO,UAAU,WACH,MAATT,EACG6F,EAAU,8BACV7B,KAAKC,MAAMjE,IAEjBE,uBAAKO,UAAU,WAAW,QAWhC,MAAM4I,UAA+BnJ,YAArCwB,c,oBACE,KAAAC,MAAe,CACb2H,KAAM,GACNC,SAAS,EACTC,iBAAkB,MAEpB,KAAAC,SAAWvJ,cAEX,KAAAwJ,SAAiDxJ,cACjD,KAAAyJ,OAA4CzJ,cAoC5C,KAAA0J,eAAiB,SAAUC,EAAiBC,EAAeC,GACzD,MAAM,OAAEhE,GAAWhE,KAAKiB,MACxBgH,YAAiBD,EAAO,cAAgB,SAAUhE,GAEd,OAAhChE,KAAKJ,MAAM6H,kBACbzH,KAAKC,SAAS,CAAEwH,iBAAkBM,IAElC/H,KAAK0H,SAASxH,QAAQuF,IAAMqC,EAE5B9H,KAAK0H,SAASxH,QAAQgI,SAEtBlI,KAAK0H,SAASxH,QAAQiI,QACtBnI,KAAK0H,SAASxH,QAAQkI,YAAc,EACpCpI,KAAKC,SAAS,CAAEwH,iBAAkB,SAItC,KAAAY,aAAe,KACb,MAAMC,EAAMtI,KAAK4H,OAAO1H,QACxB,IAAKoI,EAAK,OAEV,MAAMX,EAAW3H,KAAK2H,SAASzH,QAC/ByH,EAASY,UAAYD,EAAIE,UAAYb,EAASa,UAC9CxI,KAAKyI,yBAGP,KAAAA,sBAAwB,KACtB,MACMC,EAAK1I,KAAK2H,SAASzH,QACzBwI,EAAGC,MAAMC,YACP,kBACA3G,KAAK4G,IAAIH,EAAGH,UAJD,IAIoB,MAEjCG,EAAGC,MAAMC,YACP,iBACA3G,KAAK4G,IAAIH,EAAGI,aAAeJ,EAAGH,UAAYG,EAAGK,aARlC,IAQwD,OArEjE3I,oB,yCACJ,MAAM,IAAE8F,EAAF,OAAOlC,EAAP,KAAeiB,GAASjF,KAAKiB,MACnCjB,KAAKC,SACH,CACEsH,WAAYrB,EAAI8C,UAAUhF,GAAQiF,iBAAiBhE,IAErDjF,KAAKqI,iBAIHa,UAAUC,G,yCACd,MAAM,IAAEjD,EAAF,aAAOkD,EAAP,OAAqBpF,EAArB,KAA6BiB,GAASjF,KAAKiB,MACjDoI,YAAe,wBAAyBD,GACxC,MAAME,QAAgBpD,EAAI8C,UAAUhF,GAAQiF,iBAAiBhE,EAAMkE,GACnEnJ,KAAKC,SACH,IAAa,IAAZ,KAAEsH,GAAU,EACX,MAAMgC,EAAU,IACXD,KACA/B,EAAKiC,OACNC,IAAOH,EAAQjI,KAAMqI,GAAYD,EAAGE,YAAcD,EAAGC,cAIzD,OADAJ,EAAQK,KAAK,CAACH,EAAIC,IAAQD,EAAG1B,SAAW2B,EAAG3B,SAAW,GAAK,GACpD,CACLR,KAAMgC,EACN/B,QAA2B,GAAlB8B,EAAQxL,SAGrB,KACEkC,KAAKyI,6BA4CXhI,SACE,MAAM,KAAE8G,EAAF,QAAQC,EAAR,iBAAiBC,GAAqBzH,KAAKJ,MAC3CiK,EAAiB,CACrBC,MAAM,EACNC,UAAU,EACV3C,cAAeA,EACf4C,iBAAkB,CAChBC,oBAAqB,mBAKnBC,EAAQ3C,EAAKxI,IAAI,CAACuJ,EAAKrJ,KAC3B,MAAMkL,EAAelL,EAAI,EAAIsI,EAAKtI,EAAI,GAAG8I,SAAW,KAC9CqC,EACJnL,EAAIsI,EAAKzJ,OAAS,EAAIyJ,EAAKtI,EAAI,GAAG8I,SAAWP,EAAU,EAAI6C,IAC7D,MAAO,CACLF,GAAgBA,EAAe,EAAI7B,EAAIP,SACrC5J,gBAACkJ,EAAQ,CACPnI,IAAKoJ,EAAIP,SAAW,OACpBpJ,QAAS,IACPqB,KAAKkJ,UAAU,CACbjH,KAAKpB,IAAIsJ,EAAe,EAAG7B,EAAIP,SAzJ5B,GA0JHO,EAAIP,aAIR,KACJ5J,sBACEe,IAAKoJ,EAAIP,SACTrJ,UAAW,QAAU4J,EAAIgC,IAAM,MAAQ,IACvC7I,IAAK6G,EAAIgC,IAAMtK,KAAK4H,OAAS,MAC7BzJ,uBAAKO,UAAU,YACZ4J,EAAIP,SAAW,GAAK,IACpBO,EAAIP,SAAW,GAGhBwC,eACsB,OAAtBjC,EAAIkC,cA0CJrM,uBAAKO,UAAU,oBACbP,gBAACsM,IAAM,CAAC5O,IAAKyM,EAAIoC,cAtCjBvM,2BACEA,yBACEwM,QAAQ,OACRlJ,IAAKzB,KAAK0H,SACVkD,QAAS,IAAM5K,KAAKC,SAAS,CAAEwH,iBAAkB,OACjDoD,QAAS,IAAM7K,KAAKC,SAAS,CAAEwH,iBAAkB,SAEnDtJ,0BACEO,UAAU,mBACVoM,aAAc,IACZ9K,KAAK6H,eACHS,EAAIkC,cACJlC,EAAIP,SACJO,EAAIgC,KAGRS,aAAc,IACZ/K,KAAK6H,eACHS,EAAIkC,cACJlC,EAAIP,SACJO,EAAIgC,KAGR3L,QAAS,IACPqB,KAAK6H,eACHS,EAAIkC,cACJlC,EAAIP,SACJO,EAAIgC,MAGRnM,2BACEA,gBAACsM,IAAM,CAAC5O,IAAKyM,EAAIoC,gBAW3BvM,uBAAKO,UAAU,WAAWhB,MAAO4K,EAAI0C,UAClC1C,EAAI0C,UAAY,MAChB1C,EAAIgC,KACHnM,gCACG,KACDA,gBAACS,IAAS,CAACC,GAAG,OACZV,8BAHJ,MASHsJ,IAAqBa,EAAIP,UACxB5J,uBAAKO,UAAU,UACbP,gBAAC8M,WAAQ,CAACC,SAAU/M,6BAClBA,uBAAKO,UAAU,aACbP,gBAAC+I,EAAM,CACLiE,QAAStB,EACTuB,eAAgB,GAChB5J,OAAQ,GACR3B,MAAO,QAGD,KAGhB1B,uBAAKO,UAAU,QAAQhB,MAAO4K,EAAI+C,OACZ,QAAnBrL,KAAKiB,MAAMgE,KACV9G,gBAACmN,IAAO,MAERnN,gBAACoN,IAAW,CAAC7M,UAAU,UApPfgE,EAsPI4F,EAAI+C,MArPrB3I,EAAI,IAAOT,KAAKuJ,MAAM9I,EAAI,KAAQ,IAAMA,KAwPzC0H,GACAA,EAAe,EAAI9B,EAAIP,UACvBqC,EA7PW,EA6PiB9B,EAAIP,SAC9B5J,gBAACkJ,EAAQ,CACPnI,IAAKoJ,EAAIP,SAAW,OACpBpJ,QAAS,IACPqB,KAAKkJ,UAAU,CACbZ,EAAIP,SAAW,EACf9F,KAAK4G,IAAIP,EAAIP,SAAW,EAnQrB,EAmQqCqC,EAAe,OAI3D,MArQZ,IAAsB1H,IAyQlB,OACEvE,sBACEO,UAAU,cACV+C,IAAKzB,KAAK2H,SACV8D,SAAUzL,KAAKyI,uBACdyB,IAKT,MAAMwB,EAActF,YAClB,QAAC,IAAEF,EAAF,OAAOlC,GAAR,QAAiC,CAC/BkC,MACAkD,aAAcpF,IAEhB,KACA,KACA,CAAE2H,YAAY,GAPIvF,CAQlBkB,GAUY,SAAUsE,EAAV,GAIb,IAJuC,cACtCnF,GAGD,EACC,MAAMnJ,EAAUuO,cACVC,EAAc3H,YAAU4H,IAAK1H,QAAQyH,cAEpCE,EAAUC,GAAetF,oBAAS,IAClCuF,EAAaC,GAAkBxF,oBAAS,GAEzCyF,EAAiBzH,iBAAO,MAE9B,OACExG,gBAACkI,EAASlL,eACR+D,IAAI,eACA,CAAEuH,iBAAe,CACrB/H,UAAW,qBAAuBwN,EAAc,cAAgB,IAChExO,MAAM,mBACN4I,YACEnI,uBAAKO,UAAU,gBACZ2N,QAAQ/O,aAAO,EAAPA,EAASgP,UAChBnO,gCACEA,0BACE8G,KAAK,SACLtG,QAAS,KACPyN,EAAelM,QAAQmI,iBAEzBlK,gBAACoO,IAAY,MAAI,IACjBpO,gBAACS,IAAS,CAACC,GAAG,gBACZV,wBAAMO,UAAU,WAIpBP,uBAAKO,UAAU,kBAInBP,0BAAQ8G,KAAK,SAAStG,QAAS,IAAMwN,GAAe,KACjD7O,aAAO,EAAPA,EAASgP,SAAUnO,gBAACqO,IAAO,MAAMrO,gBAACsO,IAAU,MAC7CtO,gBAACS,IAAS,CAACC,GAAG,kBACZV,wBAAMO,UAAU,WAIpBP,uBAAKO,UAAU,iBAEfP,uBACEO,UAAU,mBACVoM,aAAc,IAAMmB,GAAY,GAChClB,aAAc,IAAMkB,GAAY,IAC/BD,GACC7N,uBAAKO,UAAU,aACbP,0BACG,CACC,CAAEuO,KAAMpB,IAAStE,MAAO,mBACxB,CAAE0F,KAAMC,IAAiB3F,MAAO,qBAChCjI,IAAI,QAAC,KAAE2N,EAAF,MAAQ1F,GAAT,SACJ7I,sBAAIe,IAAK8H,GACP7I,uBAAKO,UAAU,QACbP,gBAACuO,EAAI,OACA,IACPvO,gBAACS,IAAS,CAACC,GAAImI,GACb7I,kCAKRA,uBAAKwK,MAAO,CAAEnH,OAAQ,KACpBrD,uBAAKO,UAAU,eAIrBP,0BACEO,UAAWsN,EAAW,SAAW,GACjCrD,MAAO,CAAEiE,QAAS,QAClBjO,QAAS,IAAMsN,GAAaD,GAC5B/G,KAAK,UACL9G,gBAAC0O,IAAQ,SAKjBtG,QACE2F,GACE/N,uBAAKO,UAAU,uBACbP,0BACEO,UAAU,gBACVuG,KAAK,SACLtG,QAAS,IAAMwN,GAAe,IAC9BhO,gBAAC2O,IAAS,OAEZ3O,gBAAC4O,IAAqB,CACpBlO,GAAG,yBACHmO,UAAU,SACThG,GAAS7I,0BAAK6I,IAEjB7I,gBAAC8O,IAAM,CACLC,QAAQ,SACRC,OAAO,UACPC,eAAgBf,QAAQ/O,EAAQgP,SAChCpO,SAAWmP,IACTvB,EAAY,CAAEQ,QAASe,EAAMjI,OAAOkI,aAGxCnP,gBAACS,IAAS,CAACC,GAAG,uBAAuB0O,KAAM,CAAEC,QAAS,KACpDrP,qBAAGO,UAAU,eAEfP,uBAAKO,UAAU,QACbP,gBAAC0O,IAAQ,MACT1O,gBAACS,IAAS,CACRC,GAAG,0BACH8G,MAAO,CACL8H,YAAatP,gBAACuP,IAAU,CAACC,GAAIhK,IAAKiK,iBAEpCzP,qBAAGO,UAAU,YAMvB8H,KAAM,CACJ,iBAAkB,QAAC,OAAExC,GAAH,SAChB7F,gBAACuN,EAAW,CACVxM,IAAK,IAAM8E,EACXA,OAAQA,EACRiB,KAAK,OACLxD,IAAK2K,KAGT,kBAAmB,QAAC,OAAEpI,GAAH,SACjB7F,gBAACuN,EAAW,CACVxM,IAAK,IAAM8E,EACXA,OAAQA,EACRiB,KAAK,OACLxD,IAAK2K,S,kWChdX,SAAUyB,EAAV,GAUL,IAVwB,UACvBC,EADuB,YAEvBC,EAFuB,WAGvBC,EAHuB,UAIvBtP,GAMD,EACC,OACEP,uBACEO,UAAW,WAAWA,EAAY,IAAIA,EAAc,KAClDoP,GAAa,GAAK,YAAc,MAElC3P,uBAAKO,UAAU,aAAaoP,GAC5B3P,uBAAKO,UAAU,eACZsP,EAAa,MAAQ,MACrBD,IAMT,MAAME,EAAUzQ,I,IAAA,OACd0Q,EADc,QAEdC,EAFc,OAGdC,GAAM5Q,EACN6Q,qCAKI,OACJlQ,wCACEmQ,YAAaH,EACbI,EAAGL,EACHM,GAAIJ,EACJK,GAAIL,EACJ7K,KAAK,eACD8K,KAIFK,EAAS,GACTC,EAAS,EAET,SAAUC,EAAV,GAYL,IAZ8B,UAC7BlQ,EAAY,GADiB,MAE7BT,EAF6B,YAG7B8P,EAH6B,OAI7BG,EAASQ,EAJoB,QAK7BP,EAAUQ,GAOX,EACK,IAAO1Q,GAASA,GAAS,IAC3BiQ,EAAS,GACAjQ,GAAS,IAClBiQ,EAAS,IAEX,MAAMW,EAAgB,EAAI5M,KAAK6M,GAAKZ,EAC9BE,EAASF,EAASC,EAClBY,EAAgB,EAATX,EACb,OACEjQ,uBACEO,UAAW,mBAAmBA,EAC9BiK,MAAO,CAAEqG,MAAO,eAChB7Q,uBAAK0B,MAAOkP,EAAMvN,OAAQuN,GACxB5Q,gBAAC8P,EAAM,CAACC,OAAQA,EAAQC,QAASA,EAASC,OAAQA,IAClDjQ,gBAAC8P,EAAM,CACLC,OAAQA,EACRC,QAASA,EACTC,OAAQA,EACR1P,UAAU,kBACVuQ,gBAAiBJ,EACjBK,iBACEL,EAAgB5M,KAAKpB,IAAI,EAAI5C,GAAS8P,GAAe,GAAI,MAa9DA,EACC5P,gBAAC0P,EAAQ,CAACC,UAAW7P,EAAO8P,YAAaA,IAEzC5P,gBAAC0P,EAAQ,CACPC,UACE7L,KAAKC,MAAM,IAAMjE,IAAU,IAAM,MAAQgE,KAAKC,MAAM,IAAMjE,GAE5D+P,YAAU,K,iTCjFN,SAAUmB,EAAV,GAKN,IAL6B,OACnCnL,EADmC,gBAEnCoL,EAFmC,aAGnCC,EAHmC,KAInCpK,GACM,EACN,MAAOmE,GAAgBnF,eACfqL,aAAcC,GAAgB1D,eAAgB,GACtD,IAAI3F,EAAMsJ,cACV,MAAOC,EAAgBC,GAAqB/I,mBAAS,MAcrDI,oBAAU,MAZV,W,kCACO/C,GACHqF,YAAe,kBAAmBD,GAEpClD,EAAMA,EAAI8C,UAAUhF,GAAU,MAC9B0L,OACkB,UAATzK,EACHiB,EAAIyJ,uBACJzJ,EAAI0J,2BAKVC,IACC,IAEH,MAAMC,EAAc5U,IAAY+J,GAAM,GAChC8K,EAAkB,SAAR9K,EACV+K,EAAaT,aAAW,EAAXA,EAAalO,KAAK4O,GAAKA,EAAEjM,QAAUA,GAChDkM,EAAoBF,EAAaA,EAAW9P,QAAQ+E,QAAQkL,EAC5DC,OAA6CD,IAAtBD,EACvBG,EAAY1M,IAAK2M,WAAatM,EAAS,IAAMA,EAAS,IAAML,IAAK4M,MAEvE,OACEpS,uBAAKO,UAAW,iBAAmBuG,GACjC9G,uBAAKO,UAAU,YACZ0R,EACCjS,gBAAC0P,EAAQ,CACPC,UAAWoC,EACXnC,YAAaiC,EAAWQ,SAG1BrS,gBAAC0P,EAAQ,CACPC,UAC4B,iBAAnBsB,EAA8BA,EAAkB,IAEzDrB,aACGsB,GAAgBhF,IACflM,uBAAKO,UAAU,YAAU,KAEzB2Q,IACI,MAIZlR,gBAACS,IAAS,CAACC,GAAIkR,EAAU,qBAAuB,uBAC9C5R,uBAAKO,UAAU,iBAEjBP,uBAAKO,UAAU,uBACZsR,GAAcI,EACbjS,gBAACuP,IAAU,CAAChP,UAAU,mBAAmBiP,GAAI0C,GAC3ClS,gBAACyQ,EAAc,CAAC3Q,MAAOiS,EAAoBF,EAAWQ,SACtDrS,uBAAKO,UAAU,oBACbP,gBAACS,IAAS,CACRC,GACEqR,EAAoBF,EAAWQ,OAAS,EACpC,mBACA,gBAENrS,iCAKL6R,GACC7R,gBAACS,IAAS,CAACC,GAAG,sBACZV,gBAACsS,IAAU,CAACC,SAAO,EAAC/C,GAAI0C,OAOlClS,uBAAKO,UAAU,iBACbP,uBAAKO,UAAU,YACbP,uBAAKO,UAAU,aACZqR,EACC5R,gBAACmN,IAAO,MAERnN,gBAACoN,IAAW,CAAC5C,MAAO,CAAEZ,SAAU,WAAY4I,KAAM,QAM1DxS,uBAAKO,UAAU,WACbP,gBAAC0P,EAAQ,CACPC,UAA6B,MAAlB2B,EAAyB,IAAMA,EAC1C1B,YAAa+B,IAEf3R,gBAACS,IAAS,CACRC,GACEkR,EAAU,2BAA6B,6BAEzC5R,uBAAKO,UAAU,iBAEjBP,gBAACS,IAAS,CAACC,GAAG,kBAAkB0O,KAAM,CAAEqD,KAAMd,IAC5C3R,gBAACsS,IAAU,CACTC,SAAO,EACPG,SAAO,EACPC,UAAQ,EACRnD,GAAIoD,YAAqB/M,GAAUoF,EAA/B2H,CACFhB,EAAUpM,IAAKqN,MAAQrN,IAAKsN,QAE9BtS,QAAS,IACP0K,YAAe0G,EAAU,YAAc,aAAc3G,Q,OCrFpD8H,MA/CG,QAAC,SAAEC,EAAF,gBAAYC,GAAb,SAChBD,EACEhT,uBAAKO,UAAU,cACbP,uBAAKO,UAAU,SACZ,CAAC,QAAS,UAAUK,IAAIkG,IACvB,MAAO/E,EAASmR,GAASF,EAASG,YACxB,SAARrM,EAAkB,QAAU,SAE9B,OACE9G,gBAACgR,EAAY,CACXjQ,IAAK+F,EAAOmM,EACZnM,KAAMA,EACNjB,OAAQoN,EACRhC,gBAAiBlP,EACjBmP,aACE8B,GACKE,EAAMhQ,KAAK4O,IAAMA,EAAE1T,OAAS,CAAEqU,KAAMvG,MAAYuG,KACjD,UAOdzS,uBAAKO,UAAU,SACbP,gBAACkI,EAAS,CACRnH,IAAI,eACJxB,MAAM,wBACN+I,cAAe2K,EACf5K,KAAM,CAAC,MAAO,YAAY3D,OACxB,CAAC0O,EAAQ5P,IAAcxG,+BAClBoW,GAAC,CACJ,CAAC5P,GAAO,QAAC,OAAEqC,GAAH,SACN7F,gBAAC8H,EAAoB9K,eACnB+D,IAAK8E,EAASrC,GACV,CAAEA,OAAMqC,eAIlB,MAGJ7F,gBAACyN,EAAe,CAACnF,cAAe2K,MAGlC,M,6VC3BN,MAAMI,EAAWhU,I,IAAA,SAAEkD,GAAQlD,EAAEyD,oBAAgD,OAC3E9C,qCAAKO,UAAU,kBAAqBuC,GACjCP,EACDvC,uBAAKO,UAAU,aAIb+S,EAAexQ,GACnB9C,wCAAQO,UAAU,eAAeuG,KAAM,UAAqBhE,GAC1D9C,gBAACuT,IAAS,OAIRC,EAAe1Q,GACnB9C,wCAAQ8G,KAAM,SAAiBvG,UAAU,gBAAmBuC,GAC1D9C,gBAAC2O,IAAS,OAID8E,EAAW,QAAC,OACvB5N,EADuB,OAEvB6N,EACA7B,YAAY,OAAEQ,EAAF,QAAUtQ,EAAV,cAAmB4R,IAHT,SAStB3T,uBAAKO,UAAU,oBACbP,uBAAKO,UAAU,OACbP,0CACAA,0BAAQO,UAAU,cAAcuG,KAAK,SAAStG,QAASkT,GACrD1T,gBAAC4T,IAAO,QAGX5W,OAAO2L,KAAK5G,GAASnB,IAAIG,IACxB,MAAMjB,EAASiC,EAAgBhB,GAC/B,OACEf,uBAAKe,IAAKA,EAAKR,UAAW,YAAcQ,GACtCf,gBAAC0P,EAAQ,CAACC,UAAW7P,EAAO8P,YAAayC,IAEzCrS,uBAAKO,UAAU,YACbP,gBAACyQ,EAAc,CAAC3Q,MAAOA,EAAQuS,IAC/BrS,uBAAKO,UAAU,YACK,GAAjBoT,EAAqB,iBAAmB,kBAI7C3T,gBAACsS,IAAU,CACT/R,UAAU,MACVgS,SAAO,EACPI,UAAQ,EACRnD,GAAI,IAAM3J,GAAiB,SAAP9E,EAAiByE,IAAKqN,MAAQrN,IAAKsN,SACtD/R,EAAI,GAAG8S,cAAgB9S,EAAIiC,MAAM,SA2B/B,OACb0C,YAAiB,IAAyD,IAAxD,UAAEC,EAAF,gBAAasN,EAAb,gBAA8Ba,GAA0B,EACxE,MAAM,QAAEC,GAAYpM,KACb,CAAEqM,GAAiBlO,eACnBD,EAAQ0C,GAAaC,mBAAS,IACrC,OACExI,gCACEA,uBAAKO,UAAU,QACbP,gBAACS,IAAS,CAACC,GAAG,qBACZV,4BAEFA,gBAACS,IAAS,CACRC,GACEuS,EACI,8BACA,sCAEN7D,KAAM,CACJ6E,MAAO,IACPC,SAAUvO,EAAUsN,KAEtBjT,wBAAMO,UAAU,eAIpBP,uBAAKO,UAAU,SACbP,uBAAKO,UAAU,OAAO+G,IAAI,gBAAgBC,IAAI,iBAG9C0L,GACAjT,uBAAKO,UAAU,eACbP,gBAACS,IAAS,CACRC,GAAG,iCACHyT,MAAO,CAAEtL,OAAO,IAChB7I,gBAACoU,IAAa,CACZtU,MAAO+F,EACP9F,SAAWmP,GAAe3G,EAAU2G,EAAMjI,OAAOnH,QACjDE,0BAAQe,IAAI,QAAQjB,MAAM,KACzBF,IAAqBgB,IAAIC,GACxBb,gBAACS,IAAS,CAACC,GAAIG,GACbb,0BAAQe,IAAKF,EAAGf,MAAOe,SAQnCb,gBAACS,IAAS,CAACC,GAAG,cACZV,gBAACqU,IAAMrX,eACLuD,UAAU,qBACVgS,SAAO,GACHuB,EAAe,CACnBQ,UAAWrB,IAAoBpN,EAC/BrF,QACEyS,EACIa,EAAgBtT,QAChB,KACEuT,EAAQQ,KACNP,EACExO,IAAK2M,UAAY,IAAMtM,EAASL,IAAK4M,MAAQ,mBAWnE,QAAC,iBAAEoC,EAAF,cAAoBC,EAApB,gBAAmCX,GAApC,SACE9T,gCACEA,uBAAKO,UAAU,UACbP,gBAACS,IAAS,CAACC,GAAG,aACZV,4BAEDyU,GAEHzU,gBAACqT,EAAO,CAAC7I,MAAO,CAAEkK,aAAc,KAC9B1U,gBAACwT,EAAWxW,iBAAKwX,IACjBxU,gBAACsT,EAAWtW,iBAAK8W,KAEnB9T,uBAAKO,UAAU,SACbP,uBAAKO,UAAU,OAAO+G,IAAI,gBAAgBC,IAAI,eAC9CvH,uBAAKO,UAAU,QACbP,gBAACS,IAAS,CAACC,GAAG,eACZV,4BAEFA,gBAACS,IAAS,CACRC,GAAG,qCACH0O,KAAM,CACJuF,WAAY,IACZC,aAAc,EACdC,OAAQ,IACRC,YAAa,KAEf9U,+BAOV,QAAC,iBACCwU,EADD,gBAECO,EAFD,cAGCN,EAHD,gBAICX,EAJD,MAKCrS,GALF,SAOEzB,gCACEA,uBAAKO,UAAU,UACZwU,EACD/U,gBAACS,IAAS,CACRC,GAA0B,GAAtBe,EAAMuT,aAAoB,kBAAoB,oBAClDhV,4BAEDyU,GAEHzU,gBAACqT,EAAO,KACNrT,gBAACwT,EAAWxW,iBAAKwX,IACjBxU,gBAACsT,EAAWtW,iBAAK8W,OAKvB,QAAC,iBAAEU,EAAF,gBAAoBO,EAApB,cAAqCN,EAArC,gBAAoDX,GAArD,SACE9T,gCACEA,uBAAKO,UAAU,UACZwU,EACD/U,gBAACS,IAAS,CAACC,GAAG,mBACZV,4BAEDyU,GAEHzU,gBAACqT,EAAO,KACNrT,gBAACwT,EAAWxW,iBAAKwX,IACjBxU,gBAACsT,EAAWtW,iBAAK8W,OAKvB,IAOyC,IAPxC,iBACCU,EADD,gBAECO,EAFD,gBAGCjB,EAHD,WAKCmB,EALD,cAMCC,GACuC,EACvC,MAAM/V,EAAUuO,eACTyH,EAAeC,GAAoB5M,oBAAS,GAC7C6M,EAAeC,cAErB,OACEtV,uBAAKO,UAAU,UACZwU,EACA5V,EAAQoW,aACU,OAAjBF,GACErV,gCACEA,gBAACS,IAAS,CACRC,GACE2U,EACI,wBACA,4BAEN7N,MAAO,CAAEC,KAAMzH,4BACfA,qBAAGO,UAAU,uBAEfP,qBACEO,UAAU,uBACVyG,KAAMwO,YAAyBrW,GAC/B8H,OAAO,SACPC,IAAI,uBACJlH,gBAACS,IAAS,CAACC,GAAG,8BACZV,8BAEFA,gBAACyV,IAAY,QAKnBzV,gCACEA,yBAAOO,UAAU,OACfP,yBACE8G,KAAK,WACLqI,QAAS8F,EACTlV,SAAUmP,GAASgG,EAAchG,EAAMjI,OAAOkI,WAEhDnP,gBAACS,IAAS,CAACC,GAAG,qBACZV,uBAAKO,UAAU,cAGnBP,yBAAOO,UAAU,OACfP,yBACE8G,KAAK,WACLqI,QAASgG,EACTpV,SAAUmP,GAASkG,EAAiBlG,EAAMjI,OAAOkI,WAEnDnP,uBAAKO,UAAU,WACbP,gBAACS,IAAS,CACRC,GAAG,iBACH8G,MAAO,CACLkO,YAAa1V,gBAACuP,IAAU,CAACC,GAAIhK,IAAKmQ,QAASC,OAAK,MAElD5V,gCAINA,gBAACS,IAAS,CAACC,GAAG,gBACZV,gBAACuP,IAAU,CAACC,GAAIhK,IAAKqQ,MAAOtV,UAAU,QAAQqV,OAAK,MAIzD5V,gBAACqT,EAAO,KACNrT,gBAACwT,EAAWxW,iBAAKwX,IACjBxU,gBAACqU,IAAMrX,eACLuV,SAAO,EACPhS,UAAU,UACNuT,EAAe,CACnBQ,SAAUW,IAAeE,IACzBnV,gBAAC8V,IAAS,MAAI,IACd9V,gBAACS,IAAS,CAACC,GAAG,gBACZV,kCAQZ0F,YAAiB,IAA+C,IAA9C,UAAEC,EAAF,gBAAamO,EAAb,MAA8BrS,GAAgB,EAC9D,MAAOsU,EAAgBC,GAAqBxN,oBAAS,GAC/CyN,EAAiC,GAAtBxU,EAAMuT,aACvB,OACEhV,uBAAKO,UAAU,UACZwV,GACC/V,gBAACkW,IAAU,CACT3W,MAAOoG,EAAU,mBACjBwB,KAAMxB,EACJsQ,EACI,mCACA,kCACJ,CACEE,MAAO1U,EAAM4Q,OACbvL,KAAMnB,EAAU,mBAAqBlE,EAAMqF,QAG/ClB,YAAY,kBACZwQ,eAAgB,KACdJ,GAAkB,GAClB,MAAM,QAAExV,GAAYsT,EAChBtT,GACFA,OAKRR,uBAAKO,UAAU,SACbP,uBAAKO,UAAU,WACfP,gBAAC8V,IAAS,OAEZ9V,gBAACS,IAAS,CAACC,GAAIuV,EAAW,sBAAwB,sBAChDjW,4BAEFA,yBACEA,gBAACS,IAAS,CAACC,GAAG,kBACZV,8BAEFA,2BACAA,gBAACS,IAAS,CAACC,GAAG,uBACZV,+BAGJA,gBAACqU,IAAM,CACL9B,SAAO,EACPhS,UAAU,eACVC,QAAS,IAAMwV,GAAkB,IACjChW,gBAACqW,IAAS,MAAI,IACdrW,gBAACS,IAAS,CAACC,GAAG,cACZV,+BAGJA,gBAACwT,EAAWxW,iBAAK8W,Q,2nBC1XzB,MAAMwC,EAAoD,CACxD,KACA,eACA,SACA,QAGIC,EACG,EADHA,EAEQ,EAFRA,EAGI,EAHJA,GAIO,EAGPC,GAASnX,I,IAAA,SACbkD,EADa,UAEbkU,GAASpX,EACTyD,gCAIwC,OACxC9C,yBAAOO,UAAU,OACfP,uCACE8G,KAAK,QACL/G,SAAUmP,GAASA,EAAMjI,OAAOkI,SAAWsH,GAAaA,KACpD3T,IAEN9C,uBAAKO,UAAU,WAAWgC,KAI9B,SAASmU,GAAT,GAUC,IAVoB,aACnBC,EADmB,MAEnBlV,EAFmB,UAGnBmV,EAHmB,iBAInBC,GAMD,EACC,OACE7W,uBAAKO,UAAU,uBACZqW,EAAY,GACXA,EAAY,GACZ,IAAKrT,MAAM,GAAWoF,QAAQ/H,IAAIE,IAChC,MAAMyD,EAAIzD,EAAI,EACRgW,EACoB,MAAxBrV,EAAM6U,EAAW/R,KAAesS,GAAoBtS,EAChDwS,EAAWxS,GAAKqS,EACtB,OACE5W,gBAACA,WAAc,CAACe,IAAKD,GACnBd,uBACEO,UAAW,CACT,cACAwW,EAAW,SAAW,GACtBD,EAAc,YAAc,IAC5B9V,KAAK,MACPhB,0BACE8G,KAAK,SACLtG,QAAS,IAAMmW,EAAapS,GAC5B+P,SAAU/P,EAAI,GAAiC,MAA5B9C,EAAM6U,EAAW/R,EAAI,KACvCA,IAGJA,EAAI,GACHvE,gCACEA,uBACEO,UACE,SAAWuW,GAAeC,EAAW,OAAS,MAGlD/W,uBAAKO,UAAW,SAAWuW,EAAc,OAAS,WAUpE,SAASE,GAAT,GAUC,IAVwB,aACvBL,EADuB,MAEvBlV,EAFuB,OAGvBwV,EAHuB,UAIvBL,GAMD,EACC,MAAMM,EACJN,EAAYL,EAAe,GAAKD,EAAWtT,MAAM,EAAG4T,GACtD,OACE5W,uBAAKO,UAAU,oBACZ2W,EAAgBtW,IAAIuW,IACnB,IAAKF,EAAOE,GAAW,OAAO,KAC9B,MAAOC,EAAStX,GAASmX,EAAOE,GAAUjU,KACxC,QAAE,CAAEpD,GAAJ,SAAoBA,GAAS2B,EAAM0V,KAErC,OACEnX,gBAACwW,GAAK,CAACzV,IAAKoW,EAAUhI,SAAO,EAACmF,UAAQ,GACpCtU,gBAACS,IAASzD,iBACS,UAAZma,EACD,CAAEzW,GAAI,qBAAsB0O,KAAM,CAAE+G,MAAOrW,IAC3C,CACEY,GACc,QAAZyW,GAA+B,QAATrX,EAClB,6BACAsX,IAEZpX,8BAEFA,0BACE8G,KAAK,SACLtG,QAAS,IACPmW,EAAaL,EAAWe,UAAUC,GAAKA,GAAKH,KAE9CnX,gBAAC4T,IAAO,WAStB,SAAS2D,GAAT,GAUC,IAVsB,SACrBzV,EADqB,MAErBL,EAFqB,OAGrBwV,EAHqB,UAIrBL,GAMD,EACC,MAAMY,EAAkBlB,EAAWM,GACnC,OACE5W,uBAAKO,UAAU,WACX0W,EAAOO,IAAoB,IAAI5W,IAAI,QAAEwW,EAAStX,GAAX,SAC1B,MAATA,EAAgB,KACdE,gBAACwW,GAAK,CACJzV,IAAKjB,EACL2X,KAAMD,EACNrI,QAASrP,GAAS2B,EAAM+V,GACxBf,UAAW,IACT3U,EAAS,OAAD,sCACHL,GAAK,CACR,CAAC+V,GAAkB1X,IAEhBwW,EAAWtT,MAAM4T,EAAY,GAAGlS,OACjC,CAACgT,EAAU3W,KACT2W,EAAI3W,GAAO,KACJ2W,GAET,OAIc,UAAnBF,EACCxX,gCACEA,gBAACS,IAAS,CAACC,GAAG,qBAAqB0O,KAAM,CAAE+G,MAAOrW,IAChDE,8BAEFA,gBAACS,IAAS,CAACC,GAAI0W,GACbpX,wBAAMO,UAAU,YAIpBP,gBAACS,IAAS,CAACC,GAAI0W,GACbpX,kCAUF,SAAU2X,GAAV,GAIb,IAJkC,gBACjC1E,GAGD,EACC,MAAM,QAAEc,EAAF,SAAW9V,GAAa0J,IACxBI,EAAMsJ,cACNlS,EAAUuO,eACV,aAAEyD,EAAF,MAAgByG,GAAUzY,GAAW,GACrC0S,EAAaV,aAAY,EAAZA,EAAcjO,KAAK4O,GAAKA,EAAEjM,QAAUoN,GACjD4E,EAAc7R,YAAU4H,IAAK1H,QAAQ4R,SACrCnK,EAAc3H,YAAU4H,IAAK1H,QAAQyH,aAErCoK,EAAgB9Z,EAASC,OAAO8Z,SAAS,UACxCpB,EAAWD,GAAgBnO,oBAC/BqJ,GAAckG,EAAgBxB,EAAmBA,GAEhDwB,GACFhE,EAAQhP,QAAQ9G,EAASga,UAG3B,MAAOpB,EAAkBqB,GAAuB1P,mBAAS+N,IAClDtB,EAAYC,GAAiB1M,oBAAS,GACvC2P,EAAetG,EACjB,CACEmD,aAAcnD,EAAW8B,cACzBtB,OAAQR,EAAWQ,OACnBvL,KAC4C,GAA1C9J,OAAO2L,KAAKkJ,EAAW9P,SAASpC,OAC5B3C,OAAO2L,KAAKkJ,EAAW9P,SAAS,GAChC,QAER,CACEiT,aAAc,KACd3C,OAAQ,KACRvL,KAAM,OAELrF,EAAOK,GAAY0G,mBAA2B2P,IAC9CC,EAAoBC,GAAyB7P,oBAAS,IACtD8P,EAAoBC,GAAyB/P,oBAAS,GAEvDgQ,EAAOC,EAAM7B,GAEbK,EAAc,CAClBjC,aAAc,CACZ,CAAC,aAAc,GACf,CAAC,cAAe,IAElB3C,OAAQ,CACN,CAAC,OAAQ,IACT,CAAC,UAAW,IACZ,CAAC,YAAa,IACd,CAAC,MAAO,KACRzR,IAAI,QAAEwW,EAAStX,GAAX,QAAsB,CAC1BsX,EAAU,eACT3V,EAAMuT,cAAgB,GAAMlV,KAE/BgH,KAAM,CACJ,CAAC,QAAS,SACV,CAAC,SAAU,UACX,CAAC,wBAAyB,UAI9B,SAAe4R,IAA4B,IAAjBC,EAAiB,wD,yCACzC,MAAMC,GAAahC,EAAY,GAAK6B,EAAM9Y,QACtCkS,GAAe8G,GAAaC,GAAarC,GAI7CI,EAAaiC,GACbV,EAAoBpU,KAAKpB,IAAImU,EAAkB+B,IAC3CA,GAAarC,KACf2B,EAAoB3B,SACdxO,EAAI8Q,WAAW5F,EAAiBxR,GACjCtC,EAAQ2Z,QAAQC,KAAKlY,GAAKA,EAAEgF,QAAUoN,WACnCtF,EAAY,OAAD,wBACZxO,GAAO,CACV2Z,QAAS3Z,EAAQ2Z,QAAQnY,OAAO,CAC9BkF,OAAQoN,EACR+F,OAAQ,SAIV/D,UACIlN,EAAIkR,sBAAsBrB,IAElCC,MApBAQ,GAAsB,MAwB1B,MAAMa,EAAetC,GAAaL,GAAe1E,EACjD,OACE7R,uBAAKO,UAAW,gBAAkB2Y,EAAe,GAAK,QAAUtC,IAC7DwB,GACCpY,gBAACoH,IAAK,CACJ+R,QAAS,CACPC,OAAQ,IAAMf,GAAsB,GACpCgB,IAAK,KACHhB,GAAsB,GACtBK,GAAW,KAGftC,eAAgB,IAAMiC,GAAsB,IAC5CrY,gBAACS,IAAS,CAACC,GAAG,8BACZV,8BAEFA,2BACAA,gBAACS,IAAS,CAACC,GAAG,oBACZV,+BAILsY,GACCtY,gBAACoH,IAAK,CACJ+R,QAAS,CACPG,KAAM,IAAMf,GAAsB,GAClCc,IAAK,KACHd,GAAsB,GACtBzW,EAASqW,GACTD,EAAoB3B,GACpBI,EAAaJ,KAGjBH,eAAgB,IAAMmC,GAAsB,IAC5CvY,gBAACS,IAAS,CAACC,GAAG,kBACZV,8BAEFA,2BACAA,gBAACS,IAAS,CAACC,GAAG,wBACZV,+BAINA,gBAAC0W,GAAW1Z,eACV2Z,aAAc7V,IACZoX,EAAoBpU,KAAKpB,IAAImU,EAAkB/V,IAC/C6V,EAAa7V,KAEX,CAAEW,QAAOmV,YAAWC,sBAEzBqC,EACClZ,gBAACyT,EAAQ,CACP5N,OAAQoN,EACRS,OAAQ,IAAMgF,IACd7G,WAAYA,IAGd7R,gBAACwY,EAAIxb,eACHwX,iBAAkB,CAChBhU,QAAS,KACP+X,GAAsB,IAExB/N,MAAOqH,EAAa,GAAK,CAAE0H,WAAY,WAEzCxE,gBACE/U,gBAACgX,GAAeha,iBAAK,CAAE2Z,eAAclV,QAAOwV,SAAQL,eAEtDnC,cACEzU,gBAACuX,GAAava,iBAAK,CAAE8E,WAAUL,QAAOwV,SAAQL,eAEhD9C,gBAAiB,CACfQ,SACEsC,EAAYL,GACZK,EAAYL,GACoB,MAAhC9U,EAAM6U,EAAWM,IACnBpW,QAAS,IAAMkY,KAEjBjX,MAAOA,GACH,CAAEwR,kBAAiBgC,aAAYC,oB,OC1W7C,MAAMsE,GAAO,IACXxZ,uBAAK0B,MAAM,MAAM2B,OAAO,KAAKoW,QAAQ,cACnCzZ,4BACEA,kCAAgBU,GAAG,SAASsD,GAAG,MAAME,GAAG,MAAMD,GAAG,OAAOE,GAAG,MACzDnE,wBAAMkF,OAAO,KAAKC,UAAU,UAAUuU,YAAY,MAClD1Z,wBAAMkF,OAAO,OAAOC,UAAU,oBAEhCnF,wBACEU,GAAG,SACHiE,EAAE,uIAGN3E,uBACEoF,KAAK,eACLuU,SAAS,UACTC,QAAQ,KACRpP,MAAO,CAAEqP,aAAc,YACvBC,UAAU,2BACVC,UAAU,aAKVC,GAAU,QAAC,KACf5b,EADe,KAEfqU,EAFe,OAGfwH,EAHe,KAIfnT,GAJc,SAMd9G,uBAAKO,UAAW,YAAcuG,GAAQ1I,EAAO,QAAU,MACnDA,GAAQ6b,IAAWja,gBAACwZ,GAAI,MAC1BxZ,uBAAKO,UAAU,QAAQkS,GACvBzS,2BACAA,gBAACS,IAAS,CACRC,GACG,CACCwZ,QAAS,OACTC,MAAO,aACPC,MAAO,eACCtT,GAEZsI,KAAM,CAAE+G,MAAO1D,IACfzS,uBAAKO,UAAU,UAEhBnC,GACC4B,uBAAKO,UAAU,QACZ,IAAIhC,KAAKH,GAAMic,wBAAmBrI,EAAW,CAC5CsI,KAAM,UACNC,MAAO,QACPC,IAAK,eAOD,SAAUC,GAAV,GAIb,IAHCC,UAAW5T,GAAO/E,EAASmR,KAG5B,EACC,OACElT,uBAAKO,UAAU,YACbP,gBAACS,IAAS,CACRC,GAAK,CAAEyZ,MAAO,QAASC,MAAO,UAAmBtT,IAASA,GAC1D9G,4BAEFA,uBAAKO,UAAU,cACZ2S,EAAMtS,IAAI,CAAC6R,EAAM3R,IAChBd,gBAACga,GAAOhd,eACN+D,IAAKD,GACD2R,EAAI,CACR3L,KAAMA,EACNmT,QAAS/G,EAAMpS,EAAI,IAAO,IAAY1C,W,OC5DnCuc,OAZG,QAAC,SAAE3H,EAAF,gBAAYC,GAAb,SAChBjT,uBAAKO,UAAU,eACbP,uBAAKO,UAAU,aACZyS,GACChW,OAAO4d,QAAQ5H,EAASG,aAAavS,IAAI,CAAC8Z,EAAU5Z,IAClDd,gBAACya,GAAO,CAAC1Z,IAAKD,EAAG4Z,SAAUA,MAGjC1a,gBAAC2X,GAAU3a,eAAC+D,IAAKkS,GAAqB,CAAEA,uB,OCJ5C,MAAM4H,GAAe,QAAC,gBAAE5H,GAAH,SACnBjT,uBAAKO,UAAU,kBACbP,uBAAKsH,IAAK3J,EAAQ,KAAgB4J,IAAI,UACtCvH,kEACAA,gBAACsS,IAAU,CACTC,SAAO,EACP/C,GACEhK,IAAK2M,WACJc,EAAkB,IAAMA,EAAkB,IAC3CzN,IAAK4M,OAAK,0BAIdpS,gGAIE8a,GAA6C,CACjDC,EAAG,QACHC,EAAG,UAGCxB,GAAO,IACXxZ,uBAAKO,UAAU,OAAOmB,MAAM,MAAM2B,OAAO,KAAKoW,QAAQ,cACpDzZ,4BACEA,kCAAgBU,GAAG,SAASsD,GAAG,MAAME,GAAG,MAAMD,GAAG,OAAOE,GAAG,MACzDnE,wBAAMkF,OAAO,KAAKC,UAAU,UAAUuU,YAAY,MAClD1Z,wBAAMkF,OAAO,OAAOC,UAAU,OAAOuU,YAAY,SAEnD1Z,wBACEU,GAAG,SACHiE,EAAE,uHAGN3E,uBACEoF,KAAK,eACLuU,SAAS,UACTC,QAAQ,KACRE,UAAU,2BACVC,UAAU,aAKVkB,GAAW,QAAC,MAAEC,GAAH,SACflb,sBAAIO,UAAW,aAAe2a,EAAMpU,MAClC9G,gBAACwZ,GAAI,MACLxZ,uBAAKO,UAAU,OAAO+G,IAAK3J,EAAQ,KAAe4J,IAAI,SACtDvH,uBAAKO,UAAU,YACZua,GAAgBI,EAAMvH,gBAAkBuH,EAAMvH,eAEjD3T,uBAAKO,UAAU,SACfP,uBAAKO,UAAU,UAAU2a,EAAM7I,OAA/B,UACArS,uBAAKO,UAAU,QACZ2a,EAAMpU,KAAK,GAAG+M,cAAgBqH,EAAMpU,KAAK9D,MAAM,IAElDhD,uBAAKO,UAAU,QACX,CAAErD,MAAO8C,gBAACmN,IAAO,MAAKhQ,OAAQ6C,gBAACwO,IAAe,OAAc0M,EAAMpU,SAK5D,SAAUqU,GAAV,GAA+C,IAA1B,gBAAElI,GAAwB,EAC3D,MAAM9T,EAAUuO,cACV3F,EAAMsJ,cACNwG,EAAc7R,YAAU4H,IAAK1H,QAAQ4R,SAQ3C,GANAlP,oBAAU,KACRb,EAAIqT,aAAaC,KAAK,KACpBxD,OAED,KAEE1Y,EACH,OAAO,KAGT,MAAMmc,EAASnc,EAAQmc,OAAOjQ,OAC5BkQ,IAAMtI,GAAmBsI,EAAE1V,QAAUoN,GAGvC,GAAqB,GAAjBqI,EAAO3b,OACT,OAAOK,gBAAC6a,GAAY7d,iBAAK,CAAEiW,qBAG7B,MAAMuI,EAAUF,EAAO5W,OAAO,CAAC8W,EAASN,KACtC,MAAMO,EAASD,EAAQN,EAAMvH,eAE7B,OADA6H,EAAQN,EAAMvH,eAAiB8H,EAAS,IAAIA,EAAQP,GAAS,CAACA,GACvDM,GACN,IAEH,OACExb,uBAAKO,UAAU,eACZib,EAAQ5a,IAAI,CAAC6a,EAAe3a,IAC3B2a,EACEzb,gBAACA,WAAc,CAACe,IAAKD,GACnBd,0BAAK8a,GAAgBha,IAAMA,GAC3Bd,0BACGyb,EAAO7a,IAAI,CAACsa,EAAOpa,IAClBd,gBAACib,GAAQ,CAACla,IAAKD,EAAGoa,MAAOA,OAI7B,O,uBC7GG,OAA2C,IAA1C,KAAEQ,GAAwC,EACxD,MAAMC,EAAOre,KAAeoe,GAC5B,IAAKC,EAAM,OAAO,KAClB,MAAM,IAAEje,EAAF,WAAOF,EAAP,OAAmBC,GAAWke,EACpC,OACE3b,gBAACsM,IAAM,CACL/L,UAAU,OACV7C,IAAKA,EACL8M,MAAK,eACHhN,aACAoe,UAAW,aACXC,QAAS,OACLpe,GAAU,CACZA,OAAQ,6B,OCRJ,SAAUqe,GAAV,GAYb,IAZ4C,WAC3CC,EAD2C,KAE3CC,EAF2C,oBAG3CC,EAH2C,UAI3CC,EAJ2C,OAK3CC,GAOD,EACC,MAAM,KAAEC,EAAF,KAAQV,GAASS,GAAU,GACjC,OACEnc,uBAAKO,UAAW,oBAAmBwb,EAAa,WAAa,KAC3D/b,uBAAKO,UAAU,mBACbP,uBACEO,UAAU,OACV+G,IAEM3J,EADJoe,EACY,IACA,KAEdxU,IAAI,GACJ8U,KAAK,iBAEPrc,qBAAGO,UAAU,SAASjB,KAAoB0c,GAAMzc,OAChDS,uBAAKO,UAAU,kBAAf,QAAsCyb,EAAO,KAE7CD,GACA/b,uBAAKO,UAAU,2BACbP,uBAAKO,UAAU,eACbP,uBAAKO,UAAU,2BACbP,gBAACsM,IAAM,CAAC5O,IAAKue,GAA4C,KACzDjc,wCAEFA,uBAAKO,UAAU,0BACbP,uBAAKO,UAAU,aACbP,gBAACuP,IAAU,CAAChP,UAAU,YAAYiP,GAAIhK,IAAKqN,OAA3C,QAEE7S,wBAAMO,UAAU,gBAElBP,gBAACyQ,EAAc,CACblQ,UAAU,6BACVT,MAAOsc,EAAKlf,MACZ0S,YAAawM,EAAKE,YAClBtM,QAAS,EACTD,OAAQ,KAEV/P,gBAAC0P,EAAQ,CACPC,UAAWyM,EAAKlf,MAChB0S,YAAawM,EAAKE,YAClB/b,UAAU,+BAGdP,uBAAKO,UAAU,YACfP,uBAAKO,UAAU,aACbP,gBAACuP,IAAU,CAAChP,UAAU,aAAaiP,GAAIhK,IAAKsN,QAA5C,SAEE9S,wBAAMO,UAAU,iBAElBP,gBAACyQ,EAAc,CACblQ,UAAU,8BACVT,MAAOsc,EAAKjf,OACZyS,YAAawM,EAAKG,aAClBvM,QAAS,EACTD,OAAQ,KAEV/P,gBAAC0P,EAAQ,CACPC,UAAWyM,EAAKjf,OAChByS,YAAawM,EAAKG,aAClBhc,UAAU,kCAKlBP,uBAAKO,UAAU,eACbP,uBAAKO,UAAU,2BACbP,gBAACwc,GAAU,CAACd,KAAMQ,IAClBlc,kCAEFA,uBAAKO,UAAU,qCACbP,uBAAKO,UAAU,kBAEbP,qBAAGO,UAAU,aACVjB,KAAoB0c,GAAMxc,UAE7BQ,uBAAKO,UAAU,cACfP,qBAAGO,UAAU,eACVjB,KAAoB0c,GAAMvc,cAG/BO,uBAAKO,UAAU,oBACbP,gBAACyQ,EAAc,CACblQ,UAAU,4BACVT,MAAO4b,EAAKe,OAASf,EAAKgB,aAC1B1M,QAAS,EACTD,OAAQ,KAEV/P,gBAAC0P,EAAQ,CACPC,UAAY,IAAM+L,EAAKe,OAAUf,EAAKgB,aACtCnc,UAAU,2BACVsP,YAAU,IAEZ7P,qBAAGO,UAAU,qBAAb,MACMmb,EAAKgB,aADX,iB,oBC1GF,SAAUC,GAAV,GAIb,IAJuC,OACtCR,GAGD,EACKS,EAAcT,EAAOH,KACrBa,EAA0B,GAC9B,OAAQD,GACN,KAAK,EACH,MACF,KAAK,EACHC,EAAStI,KAAKqI,EAAc,GAC5B,MACF,KAAK,EACHC,EAAStI,KAAKqI,EAAc,GAC5BC,EAAStI,KAAKqI,EAAc,GAGlBC,EAASld,OAAvB,MACMR,EAAUuO,cACVoP,EAAgBC,cAEtB,OACE/c,uBAAKO,UAAU,oBACbP,uBAAKO,UAAU,iBACbP,8CACAA,uBAAKO,UAAU,SACbP,wBAAMO,UAAU,QAAM,QACrBjB,KAAoBsB,IAAI,CAAC6C,EAAGuZ,IAC3Bhd,wBACEe,IAAKic,EACLzc,UAAW,gBACTqc,IAAgBI,EAAQ,SAAW,KAEpCA,EAAQ,KAIfhd,uBAAKO,UAAU,eACZuc,EACElc,IACCqc,GACuB,QAArBA,EAAaC,MACS,gBAAtBD,EAAanW,MACX9G,gBAACmd,KAAgB,CACfpc,IAAKkc,EAAavc,GAClBuc,aAAcA,KAIrBha,YAGPjD,uBAAKO,UAAU,kBACbP,2BACEA,qBAAGO,UAAU,gBAAc,qBAC1B4b,GACCnc,gBAAC8b,GAAoB,CACnBE,KAAMY,EACNX,oBAAqB9c,EAAQoN,WAC7B2P,UAAW/c,EAAQC,WAAWsc,KAC9BS,OAAQA,IAGZnc,qBAAGO,UAAU,sBAAb,uBACsBP,gBAACod,IAAW,QAGnCR,EAAcld,MACbM,2BACEA,qBAAGO,UAAU,gBAAc,kBAC1B4b,GACCnc,gBAAC8b,GAAoB,CACnBC,YAAU,EACVC,KAAMY,EAAc,EACpBX,oBAAqB9c,EAAQoN,WAC7B2P,UAAW/c,EAAQC,WAAWsc,QAKtC1b,2BACEA,qBAAGO,UAAU,gBAAgB,GAC3Bqc,EAAc,OAAS,qBACZA,IAAgBld,KAAuB,IAAM,MACzC,IAAhBkd,EACGT,GACEnc,gBAAC8b,GAAoB,CACnBC,YAAU,EACVC,KAAMY,EAAc,EACpBX,oBAAqB9c,EAAQoN,WAC7B2P,UAAW/c,EAAQC,WAAWsc,OAGlCmB,EAASjc,IACP,CAACd,EAAOkd,IACNb,GACEnc,gBAAC8b,GAAoB,CACnBC,YAAU,EACVC,KAAMlc,EACNiB,IAAKic,EACLf,oBAAqB9c,EAAQoN,WAC7B2P,UAAW/c,EAAQC,WAAWsc,WCnGpD,MAAM2B,GAAa,QAAC,UAAE9c,GAAH,SACjBP,uBAAKO,UAAW,eAAeA,KAE3B2I,GAAYpG,GAChB9C,sBAAIO,UAAU,QACZP,0CAAa8C,GACX9C,oCA2BN,MAAMsd,WAAsBtd,YAA5BwB,c,oBACE,KAAAC,MAAe,CACb2H,KAAM,GACNC,SAAS,GAEX,KAAAG,SAAiDxJ,cACjD,KAAAyJ,OAA4CzJ,cAE5C,KAAAsK,sBAAwB,KACtB,MACMC,EAAK1I,KAAK2H,SAASzH,QACzBwI,EAAGC,MAAMC,YACP,kBACA3G,KAAK4G,IAAIH,EAAGH,UAJD,IAIoB,MAEjCG,EAAGC,MAAMC,YACP,iBACA3G,KAAK4G,IAAIH,EAAGI,aAAeJ,EAAGH,UAAYG,EAAGK,aARlC,IAQwD,OAIvE,KAAA2S,YAAevS,IACb,MAAM,QAAEwS,EAAF,IAAWzV,EAAX,KAAgBjB,GAASjF,KAAKiB,MACpC,OAAQ0a,GACN,IAAK,gBACHzV,EAAI0V,gBA9CG,KA8CqB3W,EAAMkE,GAAQqQ,KAAKqC,IAC7C7b,KAAKC,SACH,IAAa,IAAZ,KAAEsH,GAAU,EAEX,MAAO,CACLA,KAFc,IAAIA,KAASsU,GAG3BrU,QAA0B,GAAjBqU,EAAO/d,SAGpB,KACEkC,KAAKyI,4BAIX,MACF,IAAK,YACHvC,EAAI4V,cA9DG,KA8DmB3S,GAAQqQ,KAAK7Y,IACrCX,KAAKC,SACH,IAAa,IAAZ,KAAEsH,GAAU,EAEX,MAAO,CACLA,KAFc,IAAIA,KAAS5G,GAG3B6G,QAAwB,GAAf7G,EAAK7C,SAGlB,KACEkC,KAAKyI,4BAIX,MACF,IAAK,mBACHvC,EAAI6V,qBA9EG,KA8E0B9W,EAAMkE,GAAQqQ,KAAK7Y,IAClDX,KAAKC,SACH,IAAa,IAAZ,KAAEsH,GAAU,EAEX,MAAO,CACLA,KAFc,IAAIA,KAAS5G,GAG3B6G,QAAwB,GAAf7G,EAAK7C,SAGlB,KACEkC,KAAKyI,8BAYjB,KAAAS,UAAaC,IACXnJ,KAAK0b,YAAYvS,IAGnB,KAAAd,aAAe,KACb,MAAMC,EAAMtI,KAAK4H,OAAO1H,QACnBoI,IAELtI,KAAK2H,SAASzH,QAAQqI,UACpBD,EAAIE,UAAYxI,KAAK2H,SAASzH,QAAQsI,UACxCxI,KAAKyI,0BAGP,KAAAuT,yBAA4BC,IAC1B,OAAQA,GACN,KAAK,EACH,MAAO,MACT,KAAK,EACH,MAAO,MACT,KAAK,EACH,MAAO,MACT,QACE,OAAOC,OAAOD,GAAW,OA1B/B7b,oBACEJ,KAAK0b,cA6BPjb,SACE,MAAM,KAAE8G,EAAF,QAAQC,GAAYxH,KAAKJ,OACzB,KAAE2a,EAAF,KAAQV,EAAR,KAAcM,EAAd,kBAAoBgC,GAAsBnc,KAAKiB,MAG/CiJ,EAAQ3C,EAAKxI,IAAI,CAACuJ,EAAKrJ,KAC3B,MAAMkL,EAAelL,EAAI,EAAIsI,EAAKtI,EAAI,GAAG8I,SAAW,KAC9CqC,EACJnL,EAAIsI,EAAKzJ,OAAS,EAAIyJ,EAAKtI,EAAI,GAAG8I,SAAWP,EAAU,EAAI6C,IACvD+R,EACJ9T,EAAIsN,QACHiE,EAAOU,EAAKjd,QAAQC,WAAWsc,KAAOU,EAAKjd,QAAQ0N,UACtD,MAAO,GACHb,GAAgBA,EAAe,EAAI7B,EAAIP,UACvC5J,gBAACkJ,GAAQ,CACPnI,IAAKoJ,EAAIP,SAAW,OACpBpJ,QAAS,IACPqB,KAAKkJ,UAAU,CACbjH,KAAKpB,IAAIsJ,EAAe,EAAG7B,EAAIP,SAjJ5B,GAkJHO,EAAIP,aAKZ8R,EACE1b,sBACEe,IAAKoJ,EAAIP,SACTrJ,UAAW,YAAW0d,EAAQ,OAAS,IACvC3a,IAAK2a,EAAQpc,KAAK4H,OAAS,MAC3BzJ,uBAAKO,UAAU,WACbP,uBAAKO,UAAU,YACZ4J,EAAIP,SAAW,EAAI,IAAM,IACzBO,EAAIP,SAAW,GAElB5J,uBAAKO,UAAU,oBACbP,gBAACwc,GAAU,CAACd,KAAMvR,EAAIsN,KAAKyG,iBAE7Ble,uBAAKO,UAAU,WAAWhB,MAAO4K,EAAIsN,MAClCtN,EAAIsN,MAAQ,QAGjBzX,uBAAKO,UAAU,OAAOhB,MAAM,QACzB4K,EAAIgU,WAAanC,EAAO,EACvBhc,gCACEA,gBAACqd,GAAU,CACT9c,UAAW4J,EAAIiU,IAAM,EAAI,eAAejU,EAAIiU,GAAO,KAEpDvc,KAAKgc,yBAAyB1T,EAAIiU,KAGrC,MAGJpe,uBAAKO,UAAU,OAAOhB,MAAM,QACzB4K,EAAIkU,WAAarC,EAAO,EACvBhc,gCACEA,gBAACqd,GAAU,CACT9c,UAAW4J,EAAImU,IAAM,EAAI,eAAenU,EAAImU,GAAO,KAEpDzc,KAAKgc,yBAAyB1T,EAAImU,KAGrC,MAGJte,uBAAKO,UAAU,OAAOhB,MAAM,QACzB4K,EAAIoU,YAAcvC,EAAO,GAAKgC,GAC7Bhe,gCACEA,gBAACqd,GAAU,CACT9c,UAAW4J,EAAIqU,IAAM,EAAI,eAAerU,EAAIqU,GAAO,KAEpD3c,KAAKgc,yBAAyB1T,EAAIqU,KAGrC,MAGJxe,uBAAKO,UAAU,SAAS4J,EAAIoU,WAAa,QAG3Cve,sBACEe,IAAKoJ,EAAIP,SACTrJ,UAAW,OAAM0d,EAAQ,OAAS,IAClC3a,IAAK2a,EAAQpc,KAAK4H,OAAS,MAC3BzJ,uBAAKO,UAAU,WACbP,uBAAKO,UAAU,YACZ4J,EAAIP,SAAW,EAAI,IAAM,IACzBO,EAAIP,SAAW,GAElB5J,uBAAKO,UAAU,oBACbP,gBAACsM,IAAM,CAAC5O,IAAKyM,EAAIoC,cAEnBvM,uBAAKO,UAAU,WAAWhB,MAAO4K,EAAIsN,MAClCtN,EAAIsN,MAAQ,QAGjBzX,uBAAKO,UAAU,QAAQhB,MAAO4K,EAAIsU,QAChCze,gBAACqd,GAAU,CACT9c,UACE4J,EAAIP,SAAW,EAAI,gBAAeO,EAAIP,SAAW,GAAM,KAG1DO,EAAIsU,QAEPze,uBAAKO,UAAU,WAAWhB,MAAO4K,EAAIuU,UACnC1e,gBAAC8V,IAAS,MACT3L,EAAIuU,UAEP1e,uBAAKO,UAAU,YAAY4J,EAAIwU,UAAY,MAA3C,SAGF1S,GACAA,EAAe,EAAI9B,EAAIP,UACvBqC,EAhPS,EAgPmB9B,EAAIP,UAC9B5J,gBAACkJ,GAAQ,CACPnI,IAAKoJ,EAAIP,SAAW,OACpBpJ,QAAS,IACPqB,KAAKkJ,UAAU,CACbZ,EAAIP,SAAW,EACf9F,KAAK4G,IAAIP,EAAIP,SAAW,EAtPvB,EAsPuCqC,EAAe,UAQrE,OACEjM,sBACEO,UAAU,cACV+C,IAAKzB,KAAK2H,SACV8D,SAAUzL,KAAKyI,uBACftK,sBAAIO,UAAU,SAASQ,IAAI,UACxB2a,EACC1b,gCACEA,wBAAMO,UAAU,WAAS,kBACzBP,wBAAMO,UAAU,QAAM,MACtBP,wBAAMO,UAAU,QAAM,MACtBP,wBAAMO,UAAU,QAAM,MACtBP,wBAAMO,UAAU,SAAO,iBAGzBP,gCACEA,wBAAMO,UAAU,WAAS,kBACzBP,wBAAMO,UAAU,SAAO,UACvBP,wBAAMO,UAAU,YAAU,YAC1BP,wBAAMO,UAAU,YAAU,cAI/BwL,IAKM9D,mBACb,QAAC,IAAEF,EAAF,KAAOqU,GAAR,QAA+B,CAC7BrU,MACAqU,SAEF,KACA,KACA,CAAE5O,YAAY,GAPDvF,CAQbqV,IC1SF,MAAMsB,GAAa,IAAM5e,uBAAKO,UAAU,WAAS,KAC3Cse,GAAkB,IACtB7e,uBAAKO,UAAU,gBACbP,gBAAC8V,IAAS,OAGRuH,GAAa,IAAMrd,uBAAKO,UAAU,gBAE1B,SAAUkN,GAAV,GAYb,IAZuC,MACtClO,EADsC,gBAEtCuf,EAFsC,YAGtC/Q,EAHsC,QAItCyP,EAJsC,KAKtC9B,GAOD,EACC,MAAMvc,EAAUuO,eAETG,EAAUC,GAAetF,oBAAS,GAEnCyF,EAAiBzH,iBAAO,MAC9B,OACExG,gBAACkI,EAAS,CACRnH,IAAI,cACJR,UAAU,mBACVhB,MAAOA,EACPX,WAAW,EACXuJ,YACEnI,uBAAKO,UAAU,gBACZ2N,QAAQ/O,EAAQgP,UACfnO,gCACEA,0BACE8G,KAAK,SACLtG,QAAS,KACPyN,EAAelM,QAAQmI,iBAEzBlK,gBAACoO,IAAY,MALf,IAKmBpO,wBAAMO,UAAU,QAAM,oBAGzCP,uBAAKO,UAAU,kBAGlBue,GACC9e,gCACEA,0BAAQ8G,KAAK,SAAStG,QAASuN,GAC5B5O,EAAQgP,QAAUnO,gBAACqO,IAAO,MAAMrO,gBAACsO,IAAU,MAC5CtO,wBAAMO,UAAU,QAAM,sBAExBP,uBAAKO,UAAU,kBAGnBP,uBACEO,UAAU,mBACVoM,aAAc,IAAMmB,GAAY,GAChClB,aAAc,IAAMkB,GAAY,IAC/BD,GACC7N,uBAAKO,UAAU,aACbP,0BACG,CACC,CAAEuO,KAAM8O,GAAYxU,MAAO,UAC3B,CAAE0F,KAAMsQ,GAAiBhW,MAAO,kBAChC,CAAE0F,KAAMqQ,GAAY/V,MAAO,qBAC3BjI,IAAI,QAAC,KAAE2N,EAAF,MAAQ1F,GAAT,SACJ7I,sBAAIe,IAAK8H,GACP7I,uBAAKO,UAAU,aACbP,gBAACuO,EAAI,OACA,IACPvO,4BAAO6I,OAIb7I,uBAAKwK,MAAO,CAAEnH,OAAQ,KACpBrD,uBAAKO,UAAU,eAIrBP,0BACEO,UAAWsN,EAAW,SAAW,GACjCrD,MAAO,CAAEiE,QAAS,QAClBjO,QAAS,IAAMsN,GAAaD,GAC5B/G,KAAK,UACL9G,gBAAC0O,IAAQ,SAKjBrG,KAAM,CACJ0W,SAAU,IACR/e,gBAACsd,GAAa,CACZvc,IAAI,gBACJ+F,KAAK,OACL0W,QAASA,EACTla,IAAK2K,IAGT+Q,UAAW,IACThf,gBAACsd,GAAa,CACZvc,IAAI,iBACJ+F,KAAK,OACL0W,QAASA,EACTla,IAAK2K,OC1GjB,MAAM2Q,GAAa,IAAM5e,uBAAKO,UAAU,WAAS,KAC3Cse,GAAkB,IACtB7e,uBAAKO,UAAU,gBACbP,gBAAC8V,IAAS,OAGRuH,GAAa,IAAMrd,uBAAKO,UAAU,gBAE1B,SAAU0e,GAAV,GAYb,IAZqC,MACpC1f,EADoC,gBAEpCuf,EAFoC,YAGpC/Q,EAHoC,KAIpCiO,EAJoC,kBAKpCgC,GAOD,EACC,MAAM7e,EAAUuO,eAETG,EAAUC,GAAetF,oBAAS,GAEnC0W,EAAe1Y,iBAAO,MAC5B,OACExG,uBAAKO,UAAU,+BACbP,uBAAKO,UAAU,qBACbP,uBAAKO,UAAU,kBACbP,sBAAIO,UAAU,mBAAmBhB,GACjCS,uBAAKO,UAAU,gBACZ2N,QAAQ/O,EAAQgP,UACfnO,gCACEA,0BACE8G,KAAK,SACLtG,QAAS,KACP0e,EAAand,QAAQmI,iBAEvBlK,gBAACoO,IAAY,MALf,IAKmBpO,wBAAMO,UAAU,QAAM,oBAGzCP,uBAAKO,UAAU,kBAGlBue,GACC9e,gCACEA,0BAAQ8G,KAAK,SAAStG,QAASuN,GAC5B5O,EAAQgP,QAAUnO,gBAACqO,IAAO,MAAMrO,gBAACsO,IAAU,MAC5CtO,wBAAMO,UAAU,QAAM,sBAExBP,uBAAKO,UAAU,kBAGnBP,uBACEO,UAAU,mBACVoM,aAAc,IAAMmB,GAAY,GAChClB,aAAc,IAAMkB,GAAY,IAC/BD,GACC7N,uBAAKO,UAAU,aACbP,0BACG,CACC,CAAEuO,KAAM8O,GAAYxU,MAAO,UAC3B,CAAE0F,KAAMsQ,GAAiBhW,MAAO,kBAChC,CAAE0F,KAAMqQ,GAAY/V,MAAO,qBAC3BjI,IAAI,QAAC,KAAE2N,EAAF,MAAQ1F,GAAT,SACJ7I,sBAAIe,IAAK8H,GACP7I,uBAAKO,UAAU,aACbP,gBAACuO,EAAI,OACA,IACPvO,4BAAO6I,OAIb7I,uBAAKwK,MAAO,CAAEnH,OAAQ,KACpBrD,uBAAKO,UAAU,eAIrBP,0BACEO,UAAWsN,EAAW,SAAW,GACjCrD,MAAO,CAAEiE,QAAS,QAClBjO,QAAS,IAAMsN,GAAaD,GAC5B/G,KAAK,UACL9G,gBAAC0O,IAAQ,UAKjB1O,uBAAKO,UAAU,UAAUiK,MAAO,CAAE2U,eAAgB,aAChDnf,wBAAMO,UAAU,gBAAc,iBAEhCP,uBAAKO,UAAU,WACbP,gBAACsd,GAAa,CACZvc,IAAI,YACJyc,QAAQ,YACRla,IAAK4b,EACLxD,MAAI,EACJsC,kBAAmBA,EACnBhC,KAAMA,O,OChDHoD,oBArDf,YAGuE,IAH7C,SACxBC,EADwB,SAExBphB,GACqE,EACrE,MAAMqhB,EAAiBtZ,YAAUC,IAAcC,QAAQoZ,gBAavD,OAVA1W,oBAAU,K,MACJ5J,OAAmC,QAAlB,EAAIf,EAASwD,aAAKpC,WAAA,EAAAA,EAAEkgB,cACvCD,EACE,GACA,sDACA,YAGH,IAEItgB,aAAkBqgB,GACvBrf,uBAAKO,UAAU,uCACbP,uBAAKO,UAAU,iBACbP,sBAAIO,UAAU,oBAAd,yCACyC,IACtC8e,EAASvgB,MAAM8F,eAAe,QAjBpB,CAAE0V,KAAM,UAAWC,MAAO,QAASC,IAAK,aAmBrDxa,2BACEA,gBAACuP,IAAU,CAAChP,UAAU,YAAYiP,GAAIhK,IAAKqN,OAA3C,QAEE7S,wBAAMO,UAAU,gBAElBP,gBAACuP,IAAU,CAAChP,UAAU,aAAaiP,GAAIhK,IAAKsN,QAA5C,SAEE9S,wBAAMO,UAAU,kBAGpBP,qBAAGO,UAAU,iBAAe,+DAMhCP,uBAAKO,UAAU,wCACbP,uBAAKO,UAAU,iBACbP,sBAAIO,UAAU,oBAAkB,0DAGhCP,gBAACsS,IAAU,CAAC/R,UAAU,qBAAqBgS,SAAO,EAAC/C,GAAIhK,IAAK4M,OAAK,6B,OCpCzE,MAAMmE,GAAyB,CAC7B,CACEhX,MAAO,oEACPigB,IAAK7hB,EAAQ,KACb4J,IAAK,aAEP,CACEhI,MAAO,4DACPigB,IAAK7hB,EAAQ,KACb4J,IAAK,UAEP,CACEhI,MACE,uEACFigB,IAAK7hB,EAAQ,KACb4J,IAAK,cAEP,CACEhI,MAAO,0BAGLkgB,GAAmB,IAErBzf,uBAAKO,UAAU,qBACbP,uBAAKO,UAAU,aACbP,gBAACuP,IAAU,CAACC,GAAIhK,IAAKqN,OAArB,QAEE7S,gBAACmN,IAAO,QAGZnN,uBAAKO,UAAU,cACbP,gBAACuP,IAAU,CAACC,GAAIhK,IAAKsN,QAArB,SAEE9S,gBAAC0f,IAAoB,SA6ChBC,OAvCS,IAA8B,IAA7B,eAAEvJ,GAA2B,GAC/CwJ,EAAMC,GAAWrX,mBAAiB,GACvC,MAAMsX,EAAWvJ,GAAMqJ,GACjBG,EAAaH,IAASrJ,GAAM5W,OAAS,EAG3C,OAFAiJ,oBAAU,IAAMoX,YAAe,oBAAqB,IAGlDhgB,gBAACoH,IAAK,CAACC,eAAe,mBAAmB+O,eAAgBA,GACvDpW,uBAAKO,UAAU,oBACVqf,EADL,OACerJ,GAAM5W,QAErBK,qBAAGO,UAAU,0BAA0Buf,EAASvgB,OAC/CwgB,EACC/f,uBAAKO,UAAU,QACbP,uBAAKsH,IAAK3J,EAAQ,KAA4B4C,UAAU,cAG1DP,uBAAKO,UAAU,mBACbP,uBAAKsH,IAAKwY,EAASN,IAAKjY,IAAKuY,EAASvY,OAGzCwY,EACC/f,gBAACyf,GAAgB,MAEjBzf,uBAAKO,UAAU,sBACbP,gBAACqU,IAAM,CACL9B,SAAO,EACPG,SAAO,EACPlS,QAAS,KACPqf,EAAQI,GAAYA,EAAW,KAJnC,OAOEjgB,gBAACkgB,IAAQ,U,OCvErB,MAAMC,GAAU,IAAkD,IAAjD,YAAEC,GAA+C,EAChE,MAAMjhB,EAAUuO,cACVC,EAAc3H,YAAU4H,IAAK1H,QAAQyH,cACpC0S,EAAOC,GAAmB9X,mBAASrJ,EAAQgP,SAC5CoS,EAAiB/Z,iBAAO,MACxBga,EAAgBha,iBAAO,MAG7B,OACExG,uBAAKO,UAAU,uBACbP,0BAAQO,UAAU,gBAAgBuG,KAAK,SAAStG,QAAS4f,GACvDpgB,gBAAC2O,IAAS,OAEZ3O,oDACAA,uBAAKO,UAAU,gBACbP,yBACE8G,KAAK,WACLmI,eAAgBf,QAAQ/O,EAAQgP,SAChCpO,SAAWmP,IACToR,EAAgBpR,EAAMjI,OAAOkI,SACxBD,EAAMjI,OAAOkI,SAChBxB,EAAY,CAAEQ,QAAS,OAI7BnO,qCACAA,uCAEDkO,QAAQmS,IACPrgB,uBAAKO,UAAU,gBACbP,gBAACygB,IAAe,CACd5X,MAAM,kBACNoG,eAzBc,IAyBE9P,EAAQgP,QACxB7K,IAAKkd,EACLzgB,SAAWmP,IACLA,EAAMjI,OAAOkI,UACfxB,EAAY,CAAEQ,QA7BJ,IA8BVoS,EAAexe,QAAQoN,SAAU,MAIvCnP,gBAACygB,IAAe,CACd5X,MAAM,wBACNoG,eArCe,IAqCC9P,EAAQgP,QACxB7K,IAAKid,EACLxgB,SAAWmP,IACLA,EAAMjI,OAAOkI,UACfxB,EAAY,CAAEQ,QAzCH,IA0CXqS,EAAcze,QAAQoN,SAAU,OAM1CnP,qBAAGO,UAAU,aAAW,oLAKxBP,uBAAKO,UAAU,QACbP,gBAAC0O,IAAQ,MACT1O,qBAAGO,UAAU,QAAb,oEACoE,IAClEP,gBAACuP,IAAU,CAACC,GAAIhK,IAAKiK,cAAY,oBAsF5B2P,oBA/Ef,SAAuBtc,G,QACrB,MAAOiL,EAAaC,GAAkBxF,oBAAS,GAEzC8W,EAAiBtZ,YAAUC,IAAcC,QAAQoZ,iBAChDoB,EAAqBC,GAA0BnY,mBAChC,QADwC,EAC5D1F,EAAM7E,SAASwD,aAAKpC,WAAA,EAAAA,EAAEqhB,sBAEjBvE,EAAQyE,GAAapY,mBAAS,MAC/BrJ,EAAUuO,cACV3F,EAAMsJ,cAQZ,OAPAzI,oBAAU,KACRb,EAAI8Y,sBAAsBxF,KAAKvb,GAASA,GAAS8gB,EAAU9gB,KAC1D,IACH8I,oBAAU,IAAMoX,YAAe,kBAAmB,KAEZ,QAAnB,EAAA7gB,aAAO,EAAPA,EAASC,kBAAU0hB,WAAA,EAAAA,EAAEpF,OAAQvc,EAAQC,WAAWR,UAI/DD,aAAgBM,MAClBe,uBAAKO,UAAU,iCACZmgB,GACC1gB,gBAAC2f,GAAe,CACdvJ,eAAgB,K,MACduK,GAAuB,IACC,QAAxB,EAAI7d,EAAM7E,SAASwD,aAAKpC,WAAA,EAAAA,EAAEkgB,cACxBD,EACE,GACA,0DAMTnD,GAAUnc,gBAAC2c,GAAe,CAACR,OAAQA,KACnChd,aAAO,EAAPA,EAASC,aACRY,uBAAKO,UAAW,oBAAmBwN,EAAc,cAAgB,KAC9DA,GAAe/N,gBAACmgB,GAAO,CAACC,YAAa,IAAMpS,GAAe,KAC3DhO,uBAAKO,UAAU,gBACbP,gBAAC+gB,GAAe,CACdxhB,MACEyhB,kBAAe7hB,EAAQC,WAAWsc,MAAMuF,aADnC,iBAGPnC,iBAAe,EACf/Q,YAAa,IAAMC,GAAe,GAClCwP,QAAQ,mBAGZxd,uBAAKO,UAAU,gBACZ4b,GACCnc,gBAACkhB,GAAa,CACZ3hB,MAAM,6BACNyc,KAAMG,EAAOH,KACbgC,kBAAmB7B,EAAO6B,qBAIhChe,uBAAKO,UAAU,gBACbP,gBAAC+gB,GAAe,CACdxhB,MAAM,qCACNuf,iBAAe,EACf/Q,YAAa,KACXC,GAAe,GACf9L,OAAOif,SAAS,CACdC,IAAK,EACLC,SAAU,YAGd7D,QAAQ,wBAOlBxd,gBAACshB,GAAgB,CAACjC,SAAUpgB,OAzD5Be,gBAACuhB,IAAQ,CAAC/R,GAAIhK,IAAK2M,e,0WCzFP9S,O,IACdD,YAAY,UAAER,EAAF,KAAa8c,EAAb,OAAmBe,IAAQpd,EACvCyD,uBAEA,MAAO0e,EAAgBC,GAAqBjZ,oBAAkB,GACxDkZ,EAAWlb,mBACXuB,EAAMsJ,cAqCZ,OAnCAzI,oBAAU,KACR,GAAI4Y,EAAgB,CAClB,MAAMG,EAAQC,WAAW,KACvBH,GAAkB,IACjB,KA0BH,OAxBA1Z,EACG8Z,oBACAxG,KACC,IAIK,IAJJ,oBACCyG,GAAsB,EADvB,sBAECC,GAAwB,EAFzB,eAGCC,GAAiB,GACd,EACHC,eAAeC,QACb,sBACAC,KAAKC,UAAUN,IAEjBG,eAAeC,QACb,wBACAC,KAAKC,UAAUL,IAEjBE,eAAeC,QACb,iBACAC,KAAKC,UAAUJ,MAIvBC,eAAeC,QAAQ,YAAa,QAE7B,IAAMG,aAAaV,KAE3B,CAACH,IACJ5Y,oBAAU,IAAMoX,YAAe,gBAAiB,IAG9ChgB,gBAACoH,IAAKpK,iBAAK8F,EAAK,CAAEuE,eAAe,iBAC/BrH,uBAAKuH,IAAI,GAAGD,IAAK3J,EAAQ,KAAsB0e,KAAK,iBAEpDrc,0BACEA,gBAACsiB,KAAW,mEAKdtiB,yBACE+G,UAAQ,EACRzD,IAAKoe,EACL5a,KAAK,OACLhH,MAAO,GAAGoC,OAAOjE,SAASskB,qBAAqB3jB,UAAkB8c,YAAee,MAGlFzc,gBAACqU,IAAM,CACL9B,SAAO,EACP/R,QAAS,KACHkhB,EAAS3f,UACV2f,EAAS3f,QAA6B0E,SACvCC,SAASC,YAAY,QACrB8a,GAAkB,MAGrBD,EAAiB,SAAW,YAC7BxhB,gBAAC6G,IAAQ,CAACC,KAAK,OAAOvG,UAAU,Y,kBClExC,MAEMiiB,GAAS,IAMV,IANW,gBACdvP,EADc,mBAEdwP,GAIG,EACH,MAAM,QAAE1O,EAAF,SAAW9V,GAAa0J,KACvB,CAAEqM,GAAiBlO,cACpB3G,EAAUuO,eACTgV,EAAgBC,GAAqBna,oBAAS,GAC/Coa,EAAsB1jB,aAAWC,GACjC0jB,EACJ5kB,EAASga,SAAS6K,SAAS,eAAiBF,EAE9C,SAASra,EAAUzI,GACjB,MAAMijB,EAAY9kB,EAASga,SAAS+K,MAAM,KAC1CjP,EAAQQ,KACN,CAACP,EAAcxO,IAAK2M,WAAYrS,EAAOijB,EAAUA,EAAUpjB,OAAS,IACjE0L,OAAO6C,SACPlN,KAAK,MAIZ,MAAMiiB,EAAe9jB,EACjBA,EAAQmc,OAAOjQ,OAAOkQ,IAAMA,EAAE2H,SAASvjB,OACvC,EAEEmZ,EAAU,CAAC,IAAInY,QAClBxB,EAAUA,EAAQ2Z,QAAU,IAC1BlY,IAAI,QAAC,OAAEiF,GAAH,SAAgBA,IACpBwF,OAAOxK,GAAKsiB,YAAgBtiB,KAE3BuiB,EAAkBV,EACpB5J,EAAQ9V,MAAM,EApCW,GAqCzB,GACEqgB,EAAkBX,EACpB5J,EAAQ9V,MAvCiB,GAwCzB8V,EAeJ,OAbAlQ,oBAAU,KACR,MAAM0a,EAAY,KAChB,MAAM,WAAEC,GAAerhB,OACvBygB,EAAkBY,GAAc,MAKlC,OAHAD,IACAphB,OAAOC,iBAAiB,SAAUmhB,GAE3B,KACLphB,OAAOG,oBAAoB,SAAUihB,KAEtC,CAACT,IAGF7iB,uBAAKO,UAAW,WAAUqiB,EAAsB,kBAAoB,KAClE5iB,uBAAKO,UAAU,cACbP,2BACG4iB,GACC5iB,gBAACwjB,IAAa,CACZziB,IAAKyE,IAAKie,UACVjU,GACEhK,IAAK2M,WACJc,EAAkB,IAAMA,EAAkB,IAC3CzN,IAAKie,WAEPzjB,wCAGH,CACC,CAAC,QAASwF,IAAKke,OACf,CAAC,QAASle,IAAK4M,QACfxR,IAAI,QAAEiI,EAAO8a,GAAT,SACJ3jB,gBAACwjB,IAAa,CACZziB,IAAK4iB,EACLnU,GACEhK,IAAK2M,WACJc,EAAkB,IAAMA,EAAkB,IAC3C0Q,GAEF3jB,gBAACS,IAAS,CAACC,GAAImI,GACb7I,+BAINA,gBAACwjB,IAAa,CACZhU,GACEhK,IAAK2M,WACJc,EAAkB,IAAMA,EAAkB,IAC3CzN,IAAKoe,QAEP5jB,0BACEA,gBAACS,IAAS,CAACC,GAAG,UACZV,8BACW,IACZijB,EAAe,GACdjjB,wBAAMO,UAAU,SACb0iB,EAAe,EAAI,KAAOA,MAMpCJ,EACC7iB,uBAAKO,UAAU,+BACbP,yCACAA,wBAAMO,UAAU,iBAAe,YAGjCP,uBAAKO,UAAU,aACbP,4BACEA,gBAACS,IAAS,CAACC,GAAG,kBACZV,8BAFJ,KAMCojB,EAAgBxiB,IAAIC,GACnBb,yBAAOe,IAAKF,GACVb,yBACE8G,KAAK,QACL2Q,KAAK,WACLtI,QAAStO,GAAKoS,EACdlT,SAAU,IAAMwI,EAAU1H,KAE3BA,EACCb,4BAAO6jB,KAAahjB,IAEpBb,gBAACS,IAAS,CAACC,GAAIb,KACbG,gCAKPqjB,EAAgB1jB,OAAS,GACxBK,0BACEO,UACE8iB,EAAgBrL,SAAS/E,GAAmB,WAAa,GAE3DwE,KAAK,WACL3X,MAAOmT,EACPlT,SAAU,IAA0B,IAAvBkH,QAAQ,MAAEnH,IAAa,EAC9BA,GACFyI,EAAUzI,KAGbsjB,EAAgBzjB,OAAS,GAAKK,0BAAQF,MAAM,KAC5CujB,EAAgBziB,IAAIC,GACnBA,EACEb,0BAAQe,IAAKF,EAAGf,MAAOe,GACpBgjB,KAAahjB,IAGhBb,gBAACS,IAAS,CAACM,IAAKlB,IAAaa,GAAIG,GAAQhB,KACvCG,0BAAQF,MAAOe,GAAQhB,WAStCgjB,GACC7iB,gBAAC8jB,GAAY,CAACrB,mBAAoBA,MAM1C,SAASsB,GAAT,GAUC,IAVyB,KACxBC,EADwB,gBAExB/Q,GAQD,EACC,MAAMlL,EAAMsJ,eACL2B,EAAUiR,GAAezb,mBAAS,MAMzC,OAJAI,oBAAU,KACRb,EAAImc,WAAWjR,GAAmB,MAAMoI,KAAK4I,IAC5C,CAAChR,IAEGjT,gBAACgkB,EAAIhnB,iBAAK,CAAEgW,WAAUC,qBAM/B,MAAM6Q,GAAe,IAA8C,IAA7C,mBAAErB,GAA2C,EACjE,MAAM1a,EAAMsJ,eACLoN,EAAQ0F,GAAgB3b,mBAAS,CAAE4T,KAAM,EAAGV,KAAM,IAMzD,OAJA9S,oBAAU,KACRb,EAAIqc,uBAAuB/I,KAAKvb,GAASA,GAASqkB,EAAarkB,KAE9D,IAEDE,uBAAKO,UAAU,iBACZ5B,aAAgBM,OACfe,uBAAKO,UAAU,UACbP,uBAAKsH,IAAK3J,EAAQ,KAAsB4J,IAAI,UAC5CvH,wBAAMO,UAAU,SAASke,EAAOrC,MAChCpc,wBAAMO,UAAU,kBAAgB,cAIpCP,gBAACqU,IAAM,CACL9B,SAAO,EACPhS,UAAU,aACVC,QAAS,IAAMiiB,GAAmB,IAClCziB,wBAAMO,UAAU,WAAS,UACzBP,wBAAMO,UAAU,iBAMV,SAAU8jB,KACtB,MAAM,MAAElmB,GAAUwJ,IACZxI,EAAUuO,cACV3F,EAAMsJ,eACL,CAAE2C,GAAiBlO,eACnBwe,EAAiB7B,GAAsBja,oBAAkB,GAC1D8W,EAAiBtZ,YAAUC,IAAcC,QAAQoZ,gBACjDsD,EAAsB1jB,aAAWC,GACjColB,EAAQ,CACZ,CAAEC,QAAShf,IAAKke,MAAOM,KAAMjR,GAC7B,CAAEyR,QAAShf,IAAK4M,MAAO4R,KAAMrJ,IAC7B,CAAE6J,QAAShf,IAAKoe,OAAQI,KAAM7I,KAEhC,IAAIsJ,EAAcjf,IAAKke,MAgBvB,OAfId,IAEF2B,EAAMG,QAAQ,CAAEF,QAAShf,IAAKie,UAAWO,KAAMW,KAC3ChmB,aAAgBM,QAClBwlB,EAAcjf,IAAKie,YAIvBmB,0BAAgB,KACTzlB,IACH8iB,eAAeC,QAAQ,cAAejkB,SAASga,UAC/C/V,OAAOjE,SAAS+I,KAAO,WAExB,IAGDhH,uBACEO,UAGQ,oBAIP+jB,GACCtkB,gBAAC6kB,GAAW,CACVzlB,WAAYD,EAAQC,WACpBgX,eAAgB,KACdqM,GAAmB,GACfN,KAAK2C,MAAM7C,eAAe8C,QAAQ,0BACpCzF,EAAe,GAAI,+BACnB2C,eAAe+C,WAAW,wBAGzB7C,KAAK2C,MAAM7C,eAAe8C,QAAQ,oBAClC5C,KAAK2C,MAAM7C,eAAe8C,QAAQ,4BACnC5C,KAAK2C,MAAM7C,eAAe8C,QAAQ,qBAElCzF,EACE,GACA,6EAEF2C,eAAe+C,WAAW,yBAC1B/C,eAAe+C,WAAW,kBAG1Bjd,EAAIkd,qCAKZjlB,uBAAKO,UAAU,SACbP,gBAACklB,IAAM,KACJX,EAAM3jB,IAAI,QAAC,QAAE4jB,EAAF,KAAWR,GAAZ,SACThkB,gBAACmlB,IAAK,CACJpkB,IAAKyjB,EACLY,OAAK,EACLzB,KAAMxlB,EAAMwlB,KAAOa,EACnBliB,OAAQ,IACNtC,gCACEA,gBAACwiB,GAAM,CACLvP,gBAAgB,GAChBwP,mBAAoBA,IAEtBziB,gBAAC+jB,GAAgB/mB,eAACiW,gBAAgB,IAAO,CAAE+Q,eAKnDhkB,gBAACmlB,IAAK,CACJxB,KAAMxlB,EAAMwlB,KAAO,oBACnBrhB,OAAQ,QACNnE,OACEknB,QAAQ,gBAAEpS,KAFN,SAKNjT,gCACEA,gBAACwiB,GAAMxlB,iBACD,CAAEiW,mBAAiB,CACvBwP,mBAAoBA,KAEtBziB,gBAACklB,IAAM,KACJX,EAAM3jB,IAAI,QAAC,QAAE4jB,EAAF,KAAWR,GAAZ,SACThkB,gBAACmlB,IAAK,CACJpkB,IAAKyjB,EACLY,OAAK,EACLzB,KAAMxlB,EAAMwlB,KAAO,IAAM1Q,EAAkBuR,EAC3CliB,OAAQ,IACNtC,gBAAC+jB,GAAgB/mB,iBAAK,CAAEiW,kBAAiB+Q,cAI/ChkB,gBAACmlB,IAAK,CACJ7iB,OAAQ,IACNtC,gBAACuhB,IAAQ,CACP/R,GAAIwE,EAAcxO,IAAK2M,UAAYsS,YAQjDzkB,gBAACmlB,IAAK,CACJ7iB,OAAQ,IACNtC,gBAACuhB,IAAQ,CAAC/R,GAAIwE,EAAcxO,IAAK2M,UAAYsS","file":"6.js?id=bee1df4f58d6cc221ffd","sourcesContent":["export const DAILY_GOALS = Object.freeze({\n  speak: [120, 250],\n  listen: [240],\n});\n\nexport const BENEFITS = [\n  'rich-data',\n  'improve-audio',\n  'keep-track',\n  'compare-progress',\n  'view-goals',\n  'join-newsletter',\n];\n\nexport const WHATS_PUBLIC = [\n  'email-not-public',\n  'recordings-and-locale-public',\n  'username-optin-public',\n  'demographic-deidentified-clarity',\n  'username-email-not-demographic',\n];\n","import { ChallengeDuration, ChallengeTeamToken } from 'common';\nimport { UserClient } from 'common';\n\nexport const challengeLogos: {\n  [key in ChallengeTeamToken]: {\n    background: string;\n    border: boolean;\n    url: string;\n  };\n} = {\n  ibm: { background: '#fff', border: true, url: require('./images/ibm.svg') },\n  lenovo: {\n    background: '#fff',\n    border: true,\n    url: require('./images/lenovo.svg'),\n  },\n  mozilla: {\n    background: '#000',\n    border: false,\n    url: require('./images/mozilla.svg'),\n  },\n  sap: { background: '#fff', border: true, url: require('./images/sap.svg') },\n};\n\nconst isValidDate = (dateStr: string) => {\n  const dateObj = new Date(dateStr);\n  return dateObj instanceof Date && !isNaN(dateObj.getTime());\n};\n\nconst getNow = () => {\n  const dateParam =\n    location.search && location.search.match(/date=(\\d+-\\d+-\\d+)/);\n  const date = dateParam?.[1];\n  return date && isValidDate(date) ? new Date(date) : new Date();\n};\n\nexport const isChallengeLive = (challenge: ChallengeDuration) => {\n  const now = getNow();\n  return now >= challenge.start && now < challenge.end;\n};\n\nexport const isBeforeChallenge = (challenge: ChallengeDuration) => {\n  const now = getNow();\n  return now < challenge.start;\n};\n\nexport const pilotDates: ChallengeDuration = {\n  start: new Date('2019-11-19'),\n  end: new Date('2019-12-10'),\n};\n\nexport const isEnrolled = (account: UserClient) =>\n  account?.enrollment?.challenge;\n\nexport const weeklyChallengeCopy = [\n  {\n    title: 'Sign up and Contribute',\n    subtitle: 'Win a prize by being the team with the highest sign up rate',\n    explanation:\n      'This is the percentage of team invites that have been accepted out of the current total sent.',\n  },\n  {\n    title: \"Let's get social\",\n    subtitle: 'The most socially active team wins the prize',\n    explanation:\n      'This is the number of invites your team has sent inviting others to join the Open Voice Challenge',\n  },\n  {\n    title: 'Top the Leaderboard',\n    subtitle:\n      'The team that validates the highest percentage of voice clips wins the prize',\n    explanation:\n      'This is the percentage of clips the team has accurately validated',\n  },\n];\n\nexport const FINAL_CHALLENGE_WEEK = weeklyChallengeCopy.length - 1;\n","import { Localized } from '@fluent/react';\nimport Downshift from 'downshift';\nimport * as React from 'react';\n\nconst contributableLocales = require('../../../../locales/contributable.json') as string[];\n\nimport './language-select.css';\n\nexport const ALL_LOCALES = 'all-locales';\n\nexport default ({\n  value,\n  onChange,\n}: {\n  value: string;\n  onChange: (locale: string) => any;\n}) => (\n  <Downshift initialInputValue={value} onChange={onChange}>\n    {({ getItemProps, highlightedIndex, isOpen, toggleMenu }) => (\n      <div className=\"language-select\" onClick={() => toggleMenu()}>\n        <Localized id={value}>\n          <div className=\"current\" />\n        </Localized>\n        {isOpen && (\n          <ul onClick={() => toggleMenu()}>\n            {[ALL_LOCALES].concat(contributableLocales).map((l, i) => (\n              <Localized key={l} id={l}>\n                <li\n                  className={[\n                    l === value ? 'selected' : '',\n                    highlightedIndex === i ? 'highlighted' : '',\n                  ].join(' ')}\n                  {...getItemProps({ item: l })}\n                  value={l}\n                />\n              </Localized>\n            ))}\n          </ul>\n        )}\n      </div>\n    )}\n  </Downshift>\n);\n","import * as React from 'react';\n\nexport const Y_OFFSET = 10;\nexport const TOTAL_LINE_MARGIN = 154;\nexport const TEXT_OFFSET = 40;\nexport const LINE_OFFSET = TEXT_OFFSET + 5;\nexport const PLOT_PADDING = 13;\n\nimport './plot.css';\n\nexport type PlotProps = {\n  children: (state: { max: number; width: number }) => React.ReactNode;\n  data: any[];\n  formatNumber: (n: number) => string;\n  max: number;\n  renderXTickLabel: (datum: any, i: number) => React.ReactNode;\n  tickCount: number;\n  tickMultipliers: number[];\n} & React.SVGProps<SVGElement>;\n\nexport default class Plot extends React.Component<\n  PlotProps,\n  {\n    width: number;\n  }\n> {\n  state: {\n    width: number;\n  } = {\n    width: 0,\n  };\n\n  svgRef = React.createRef<SVGSVGElement>();\n\n  async componentDidMount() {\n    window.addEventListener('resize', this.updateSize);\n    this.updateSize();\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener('resize', this.updateSize);\n  }\n\n  updateSize = () => {\n    this.setState({\n      width: this.svgRef.current.getBoundingClientRect().width,\n    });\n  };\n\n  render() {\n    let {\n      children,\n      data,\n      formatNumber,\n      max,\n      renderXTickLabel,\n      tickCount,\n      tickMultipliers,\n      ...props\n    } = this.props;\n    const { width } = this.state;\n\n    const tickMultiplier =\n      tickMultipliers\n        .slice()\n        .reverse()\n        .find(m => max > m) || 1;\n    const ticks = (tickCount - 1) * tickMultiplier;\n\n    max = max + (ticks - (max % ticks));\n\n    return (\n      <svg\n        width=\"100%\"\n        height=\"100%\"\n        className=\"plot\"\n        {...props}\n        ref={this.svgRef}>\n        {Array.from({ length: tickCount }).map((_, i) => {\n          const y = (i * TOTAL_LINE_MARGIN) / tickCount + Y_OFFSET;\n          return (\n            <React.Fragment key={i}>\n              <text\n                className=\"tick-label\"\n                x={TEXT_OFFSET}\n                y={y}\n                dominantBaseline=\"middle\"\n                textAnchor=\"end\">\n                {formatNumber(\n                  Math.round(((tickCount - 1 - i) * max) / (tickCount - 1))\n                )}\n              </text>\n              <line\n                x1={LINE_OFFSET}\n                y1={y}\n                x2={width + PLOT_PADDING}\n                y2={y}\n                stroke=\"rgba(0,0,0,0.2)\"\n              />\n            </React.Fragment>\n          );\n        })}\n        {data.map((datum, i) => (\n          <text\n            key={i}\n            className=\"x tick-label\"\n            x={\n              LINE_OFFSET +\n              i * ((width - PLOT_PADDING - TEXT_OFFSET) / data.length)\n            }\n            y={Y_OFFSET + TOTAL_LINE_MARGIN}>\n            {renderXTickLabel(datum, i)}\n          </text>\n        ))}\n        {children({ width, max })}\n      </svg>\n    );\n  }\n}\n\nconst BAR_COUNT = 10;\nconst BAR_WIDTH_LG = 15;\nconst BAR_WIDTH_XS = 7;\nconst TICK_COUNT = 4;\nconst BAR_HEIGHT = TOTAL_LINE_MARGIN * ((TICK_COUNT - 1) / TICK_COUNT);\n\nfunction formatNumber(n: number) {\n  return n > 1000 ? Math.round(n / 1000) + 'k' : n.toString();\n}\n\nexport const BarPlot = ({\n  data,\n}: {\n  data: { date: string; value: number }[];\n}) => (\n  <Plot\n    data={data}\n    formatNumber={formatNumber}\n    max={(data || []).reduce((max, d) => Math.max(max, d.value), 0)}\n    renderXTickLabel={({ date }) => {\n      const timeString = new Date(date)\n        .toLocaleString([], {\n          hour: '2-digit',\n          minute: '2-digit',\n        })\n        .replace(':00 ', '')\n        .replace(/\\./g, '');\n\n      return timeString;\n    }}\n    tickCount={TICK_COUNT}\n    tickMultipliers={[5, 10, 100, 1000]}>\n    {({ max, width }) => {\n      const barWidth = width < 400 ? BAR_WIDTH_XS : BAR_WIDTH_LG;\n      const getBarX = (i: number) =>\n        LINE_OFFSET +\n        PLOT_PADDING -\n        barWidth / 2 +\n        (i * (width - PLOT_PADDING - TEXT_OFFSET)) / BAR_COUNT;\n\n      return (\n        <>\n          {Array.from({ length: BAR_COUNT }).map((_, i) => (\n            <rect\n              key={i}\n              className=\"bg\"\n              x={getBarX(i)}\n              y={Y_OFFSET}\n              width={barWidth}\n              height={BAR_HEIGHT}\n            />\n          ))}\n\n          <defs>\n            <linearGradient id=\"blue-purple\" x2=\"0%\" y2=\"100%\">\n              <stop offset=\"5%\" stopColor=\"#88d1f1\" />\n              <stop offset=\"95%\" stopColor=\"#b1b5e5\" />\n            </linearGradient>\n          </defs>\n          {(data || []).map(({ value }: any, i: number) => {\n            const height = (value * BAR_HEIGHT) / max || 0;\n            return (\n              <rect\n                key={i}\n                fill=\"url(#blue-purple)\"\n                className={i + 1 === BAR_COUNT ? 'current' : ''}\n                x={getBarX(i)}\n                y={Y_OFFSET + BAR_HEIGHT - height}\n                width={barWidth}\n                height={height}\n              />\n            );\n          })}\n        </>\n      );\n    }}\n  </Plot>\n);\n","module.exports = __webpack_public_path__ + \"d88c16c3d756a31c343700e0e26d9192.svg\";","module.exports = __webpack_public_path__ + \"6a6a438d4cddcfec4d51f0bd644f154a.svg\";","module.exports = __webpack_public_path__ + \"a914cfc32246a0eee02b5fa521269781.svg\";","module.exports = __webpack_public_path__ + \"723827e558eaea61ef4e2741e9fcd8f4.svg\";","import {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport * as React from 'react';\nimport { useRef } from 'react';\nimport { trackSharing } from '../../services/tracker';\nimport { Notifications } from '../../stores/notifications';\nimport { FontIcon } from '../ui/icons';\nimport { useLocale } from '../locale-helpers';\nimport URLS from '../../urls';\n\nimport './share-buttons.css';\nimport { useAction } from '../../hooks/store-hooks';\n\nconst SHARE_URL = URLS.HTTP_ROOT;\n\ninterface Props extends WithLocalizationProps {\n  shareTextId?: string;\n}\n\nfunction ShareButtons({ getString, shareTextId }: Props) {\n  const [locale] = useLocale();\n  const addNotification = useAction(Notifications.actions.addPill);\n  const encodedShareText = encodeURIComponent(\n    shareTextId\n      ? getString(shareTextId, { link: SHARE_URL })\n      : getString('share-text', { link: SHARE_URL })\n  );\n  const shareURLInputRef = useRef(null);\n\n  return (\n    <>\n      <button\n        id=\"link-copy\"\n        className=\"share-button\"\n        onClick={() => {\n          shareURLInputRef.current.select();\n          document.execCommand('copy');\n          trackSharing('link', locale);\n\n          addNotification(\n            <>\n              <FontIcon type=\"link\" className=\"icon\" />{' '}\n              <Localized id=\"link-copied\">\n                <span />\n              </Localized>\n            </>\n          );\n        }}>\n        <input type=\"text\" readOnly value={SHARE_URL} ref={shareURLInputRef} />\n        <FontIcon type=\"link\" />\n      </button>\n      <a\n        className=\"share-button\"\n        href={\n          'https://www.facebook.com/sharer/sharer.php?u=' +\n          encodeURIComponent(SHARE_URL)\n        }\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        onClick={() => trackSharing('facebook', locale)}>\n        <FontIcon type=\"facebook\" />\n      </a>\n      <a\n        className=\"share-button\"\n        href={'https://twitter.com/intent/tweet?text=' + encodedShareText}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        onClick={() => trackSharing('twitter', locale)}>\n        <FontIcon type=\"twitter\" />\n      </a>\n      <a\n        className=\"share-button\"\n        href={'https://de.linkedin.com/company/kenbun'}\n        target=\"_blank\"\n        rel=\"noopener noreferrer\"\n        onClick={() => trackSharing('linkedin', locale)}>\n        <FontIcon type=\"linkedin\" />\n      </a>\n    </>\n  );\n}\n\nexport default withLocalization(ShareButtons);\n","import { Localized } from '@fluent/react';\nimport * as React from 'react';\nimport Modal from '../modal/modal';\nimport ShareButtons from '../share-buttons/share-buttons';\n\nimport './share-modal.css';\n\nexport default ({\n  shareTextId,\n  title,\n  text,\n  ...props\n}: {\n  onRequestClose: () => any;\n  shareTextId?: string;\n  title?: React.ReactNode;\n  text?: React.ReactNode;\n}) => (\n  <Modal innerClassName=\"share-modal\" {...props}>\n    <div className=\"image-container\">\n      <img className=\"mars\" src=\"/img/mars.svg\" alt=\"Robot\" />\n    </div>\n    {title ? (\n      <h1>{title}</h1>\n    ) : (\n      <Localized id=\"share-title-new\" elems={{ bold: <b /> }}>\n        <h1 />\n      </Localized>\n    )}\n    {text && <p>{text}</p>}\n    <div className=\"share-buttons\">\n      <ShareButtons {...{ shareTextId }} />\n    </div>\n  </Modal>\n);\n","module.exports = __webpack_public_path__ + \"6da66396a441e5698d0067a10c1ed2fe.svg\";","module.exports = __webpack_public_path__ + \"fe78694a26ed01b4d4f25c4d8d87c585.svg\";","module.exports = __webpack_public_path__ + \"ec9b352c80c59fbe4a4679e7422c98f1.svg\";","module.exports = __webpack_public_path__ + \"86dbebdb5d1d98f4a55a652beb7ba65e.svg\";","module.exports = __webpack_public_path__ + \"b26e3833c6360586802d77c75f01337f.png\";","module.exports = __webpack_public_path__ + \"2a8de167cf0cde6ea9b91b745fe8d105.jpg\";","module.exports = __webpack_public_path__ + \"ee7f16983e987478358a50fd85fb6e60.png\";","module.exports = __webpack_public_path__ + \"243a226eeb4cfe7363adee00e1da87b6.svg\";","module.exports = __webpack_public_path__ + \"61daed2d17bd8a27b1e946a36981bcaf.svg\";","import { useContext } from 'react';\nimport { __RouterContext as RouterContext } from 'react-router';\n\nexport function useRouter() {\n  return useContext(RouterContext);\n}\n","import * as React from 'react';\nimport { connect } from 'react-redux';\nimport API from '../../../../services/api';\nimport StateTree from '../../../../stores/tree';\nimport { BarPlot } from '../../../plot/plot';\n\ninterface PropsFromState {\n  api: API;\n}\n\ninterface Props extends PropsFromState {\n  locale: string;\n  from: 'you' | 'everyone';\n}\n\ninterface State {\n  data: any[];\n}\n\nclass ContributionActivity extends React.Component<Props> {\n  state: State = { data: [] };\n\n  async componentDidMount() {\n    const { api, from, locale } = this.props;\n    await this.setState({\n      data: await api.fetchContributionActivity(from, locale),\n    });\n  }\n  render() {\n    return <BarPlot data={this.state.data} />;\n  }\n}\n\nexport default connect<PropsFromState>(({ api }: StateTree) => ({ api }))(\n  ContributionActivity\n);\n","import { Localized } from '@fluent/react';\nimport * as React from 'react';\nimport { useState, useEffect } from 'react';\nimport LanguageSelect, {\n  ALL_LOCALES,\n} from '../../../language-select/language-select';\n\nimport './stats-card.css';\n\nexport default function StatsCard({\n  className,\n  title,\n  iconButtons,\n  overlay,\n  tabs,\n  challenge,\n  currentLocale,\n}: {\n  className?: string;\n  title: string;\n  iconButtons?: React.ReactNode;\n  overlay?: React.ReactNode;\n  tabs?: { [label: string]: (props: { locale?: string }) => any };\n  challenge?: boolean;\n  currentLocale?: string;\n}) {\n  const [locale, setLocale] = useState(ALL_LOCALES);\n  const [selectedTab, setSelectedTab] = useState(Object.keys(tabs)[0]);\n  useEffect(() => setLocale(currentLocale ? currentLocale : ALL_LOCALES), [\n    currentLocale,\n  ]);\n\n  return (\n    <div className={'stats-card ' + (className || '')}>\n      {overlay}\n      <div className=\"stats-card__inner\">\n        <div className=\"title-and-icon\">\n          {challenge ? (\n            <h2 className=\"challenge-title\">{title}</h2>\n          ) : (\n            <Localized id={title}>\n              <h2 />\n            </Localized>\n          )}\n          {iconButtons}\n        </div>\n        <div className=\"filters\">\n          <div className=\"tabs\">\n            {Object.keys(tabs).map(label => {\n              return challenge ? (\n                <button\n                  key={label}\n                  type=\"button\"\n                  className={label == selectedTab ? 'selected' : ''}\n                  onClick={() => setSelectedTab(label)}>\n                  {label}\n                </button>\n              ) : (\n                <Localized key={label} id={label}>\n                  <button\n                    type=\"button\"\n                    className={label == selectedTab ? 'selected' : ''}\n                    onClick={() => setSelectedTab(label)}\n                  />\n                </Localized>\n              );\n            })}\n          </div>\n          {challenge ? (\n            <span className=\"english-only\">English Only</span>\n          ) : (\n            <LanguageSelect value={locale} onChange={setLocale} />\n          )}\n        </div>\n        <div className=\"content\">\n          {tabs[selectedTab]({ locale: locale == ALL_LOCALES ? null : locale })}\n        </div>\n      </div>\n    </div>\n  );\n}\n","import {\n  Localized,\n  withLocalization,\n  WithLocalizationProps,\n} from '@fluent/react';\nimport * as React from 'react';\nimport { useRef, useState } from 'react';\nimport { connect } from 'react-redux';\nimport { useAccount, useAction } from '../../../../hooks/store-hooks';\nimport API from '../../../../services/api';\nimport { trackDashboard, trackVoiceAvatar } from '../../../../services/tracker';\nimport { Locale } from '../../../../stores/locale';\nimport StateTree from '../../../../stores/tree';\nimport { User } from '../../../../stores/user';\nimport URLS from '../../../../urls';\nimport { LocaleLink, LocalizedGetAttribute } from '../../../locale-helpers';\n\nimport {\n  BookmarkIcon,\n  CheckIcon,\n  CrossIcon,\n  EyeIcon,\n  EyeOffIcon,\n  InfoIcon,\n  MicIcon,\n  OldPlayIcon,\n  PlayIcon,\n  PlayOutlineIcon,\n} from '../../../ui/icons';\nimport { Avatar, Toggle } from '../../../ui/ui';\nimport StatsCard from './stats-card';\nimport { isProduction } from '../../../../utility';\nimport { Suspense, lazy } from 'react';\nconst Lottie = lazy(() => import('react-lottie'));\nconst animationData = require('../../../layout/data.json');\n\nimport './leaderboard.css';\n\nconst FETCH_SIZE = 5;\n\nfunction formatNumber(n: number) {\n  return n > 1000 ? Math.floor(n / 1000) + 'k' : n;\n}\n\ninterface PropsFromState {\n  api: API;\n  globalLocale: Locale.State;\n}\n\ninterface Props extends PropsFromState {\n  ref: { current: any };\n  locale: string;\n  type: 'clip' | 'vote';\n}\n\nconst FetchRow = (props: React.HTMLProps<HTMLButtonElement>) => (\n  <li className=\"more\">\n    <button {...(props as any)}>\n      <div>...</div>\n    </button>\n  </li>\n);\n\nconst RateColumn = withLocalization(\n  ({ getString, value }: { value: number } & WithLocalizationProps) => (\n    <div className=\"rate\">\n      <div className=\"exact\">\n        {value == null ? getString('not-available-abbreviation') : value}\n      </div>\n      <div className=\"rounded\">\n        {value == null\n          ? getString('not-available-abbreviation')\n          : Math.round(value)}\n      </div>\n      <div className=\"percent\">{'%'}</div>\n    </div>\n  )\n);\n\ninterface State {\n  rows: { position: number; [key: string]: any }[];\n  isAtEnd: boolean;\n  playingClipIndex: number;\n}\n\nclass UnconnectedLeaderboard extends React.Component<Props, State> {\n  state: State = {\n    rows: [],\n    isAtEnd: false,\n    playingClipIndex: null,\n  };\n  audioRef = React.createRef<HTMLAudioElement>();\n\n  scroller: { current: HTMLUListElement | null } = React.createRef();\n  youRow: { current: HTMLLIElement | null } = React.createRef();\n\n  async componentDidMount() {\n    const { api, locale, type } = this.props;\n    this.setState(\n      {\n        rows: await api.forLocale(locale).fetchLeaderboard(type),\n      },\n      this.scrollToUser\n    );\n  }\n\n  async fetchMore(cursor: [number, number]) {\n    const { api, globalLocale, locale, type } = this.props;\n    trackDashboard('leaderboard-load-more', globalLocale);\n    const newRows = await api.forLocale(locale).fetchLeaderboard(type, cursor);\n    this.setState(\n      ({ rows }) => {\n        const allRows = [\n          ...newRows,\n          ...rows.filter(\n            r1 => !newRows.find((r2: any) => r1.clientHash == r2.clientHash)\n          ),\n        ];\n        allRows.sort((r1, r2) => (r1.position > r2.position ? 1 : -1));\n        return {\n          rows: allRows,\n          isAtEnd: newRows.length == 0,\n        };\n      },\n      () => {\n        this.updateScrollIndicator();\n      }\n    );\n  }\n\n  playAvatarClip = function (clipUrl: string, position: any, self: boolean) {\n    const { locale } = this.props;\n    trackVoiceAvatar(self ? 'self-listen' : 'listen', locale);\n\n    if (this.state.playingClipIndex === null) {\n      this.setState({ playingClipIndex: position });\n\n      this.audioRef.current.src = clipUrl;\n\n      this.audioRef.current.play();\n    } else {\n      this.audioRef.current.pause();\n      this.audioRef.current.currentTime = 0;\n      this.setState({ playingClipIndex: null });\n    }\n  };\n\n  scrollToUser = () => {\n    const row = this.youRow.current;\n    if (!row) return;\n\n    const scroller = this.scroller.current;\n    scroller.scrollTop = row.offsetTop - scroller.offsetTop;\n    this.updateScrollIndicator();\n  };\n\n  updateScrollIndicator = () => {\n    const SIZE = 32;\n    const el = this.scroller.current;\n    el.style.setProperty(\n      '--before-height',\n      Math.min(el.scrollTop, SIZE) + 'px'\n    );\n    el.style.setProperty(\n      '--after-height',\n      Math.min(el.scrollHeight - el.scrollTop - el.clientHeight, SIZE) + 'px'\n    );\n  };\n\n  render() {\n    const { rows, isAtEnd, playingClipIndex } = this.state;\n    const defaultOptions = {\n      loop: true,\n      autoplay: true,\n      animationData: animationData,\n      rendererSettings: {\n        preserveAspectRatio: 'xMidYMid slice',\n      },\n    };\n\n    // TODO: Render <Fetchrow>s outside of `items` to flatten the list.\n    const items = rows.map((row, i) => {\n      const prevPosition = i > 0 ? rows[i - 1].position : null;\n      const nextPosition =\n        i < rows.length - 1 ? rows[i + 1].position : isAtEnd ? 0 : Infinity;\n      return [\n        prevPosition && prevPosition + 1 < row.position ? (\n          <FetchRow\n            key={row.position + 'prev'}\n            onClick={() =>\n              this.fetchMore([\n                Math.max(prevPosition + 1, row.position - FETCH_SIZE),\n                row.position,\n              ])\n            }\n          />\n        ) : null,\n        <li\n          key={row.position}\n          className={'row ' + (row.you ? 'you' : '')}\n          ref={row.you ? this.youRow : null}>\n          <div className=\"position\">\n            {row.position < 9 && '0'}\n            {row.position + 1}\n          </div>\n\n          {!isProduction() ? (\n            row.avatarClipUrl === null ? (\n              <div className=\"avatar-container\">\n                <Avatar url={row.avatar_url} />\n              </div>\n            ) : (\n              <div>\n                <audio\n                  preload=\"auto\"\n                  ref={this.audioRef}\n                  onEnded={() => this.setState({ playingClipIndex: null })}\n                  onError={() => this.setState({ playingClipIndex: null })}\n                />\n                <button\n                  className=\"avatar-container\"\n                  onMouseEnter={() =>\n                    this.playAvatarClip(\n                      row.avatarClipUrl,\n                      row.position,\n                      row.you\n                    )\n                  }\n                  onMouseLeave={() =>\n                    this.playAvatarClip(\n                      row.avatarClipUrl,\n                      row.position,\n                      row.you\n                    )\n                  }\n                  onClick={() =>\n                    this.playAvatarClip(\n                      row.avatarClipUrl,\n                      row.position,\n                      row.you\n                    )\n                  }>\n                  <div>\n                    <Avatar url={row.avatar_url} />\n                  </div>\n                </button>\n              </div>\n            )\n          ) : (\n            <div className=\"avatar-container\">\n              <Avatar url={row.avatar_url} />\n            </div>\n          )}\n\n          <div className=\"username\" title={row.username}>\n            {row.username || '???'}\n            {row.you && (\n              <>\n                {' ('}\n                <Localized id=\"you\">\n                  <span />\n                </Localized>\n                )\n              </>\n            )}\n          </div>\n          {playingClipIndex === row.position && (\n            <div className=\"lottie\">\n              <Suspense fallback={<div />}>\n                <div className=\"animation\">\n                  <Lottie\n                    options={defaultOptions}\n                    eventListeners={[]}\n                    height={80}\n                    width={250}\n                  />\n                </div>\n              </Suspense>{' '}\n            </div>\n          )}\n          <div className=\"total\" title={row.total}>\n            {this.props.type == 'clip' ? (\n              <MicIcon />\n            ) : (\n              <OldPlayIcon className=\"play\" />\n            )}\n            {formatNumber(row.total)}\n          </div>\n        </li>,\n        nextPosition &&\n        nextPosition - 1 > row.position &&\n        nextPosition - FETCH_SIZE > row.position ? (\n          <FetchRow\n            key={row.position + 'next'}\n            onClick={() =>\n              this.fetchMore([\n                row.position + 1,\n                Math.min(row.position + 1 + FETCH_SIZE, nextPosition - 1),\n              ])\n            }\n          />\n        ) : null,\n      ];\n    });\n\n    return (\n      <ul\n        className=\"leaderboard\"\n        ref={this.scroller}\n        onScroll={this.updateScrollIndicator}>\n        {items}\n      </ul>\n    );\n  }\n}\nconst Leaderboard = connect<PropsFromState>(\n  ({ api, locale }: StateTree) => ({\n    api,\n    globalLocale: locale,\n  }),\n  null,\n  null,\n  { forwardRef: true }\n)(UnconnectedLeaderboard);\n\nconst FilledCheckIcon = () => (\n  <div className=\"filled-check\">\n    <CheckIcon />\n  </div>\n);\n\nconst Percentage = () => <div className=\"percent\">%</div>;\n\nexport default function LeaderboardCard({\n  currentLocale,\n}: {\n  currentLocale?: string;\n}) {\n  const account = useAccount();\n  const saveAccount = useAction(User.actions.saveAccount);\n\n  const [showInfo, setShowInfo] = useState(false);\n  const [showOverlay, setShowOverlay] = useState(false);\n\n  const leaderboardRef = useRef(null);\n\n  return (\n    <StatsCard\n      key=\"leaderboard\"\n      {...{ currentLocale }}\n      className={'leaderboard-card ' + (showOverlay ? 'has-overlay' : '')}\n      title=\"top-contributors\"\n      iconButtons={\n        <div className=\"icon-buttons\">\n          {Boolean(account?.visible) && (\n            <>\n              <button\n                type=\"button\"\n                onClick={() => {\n                  leaderboardRef.current.scrollToUser();\n                }}>\n                <BookmarkIcon />{' '}\n                <Localized id=\"show-ranking\">\n                  <span className=\"text\" />\n                </Localized>\n              </button>\n\n              <div className=\"icon-divider\" />\n            </>\n          )}\n\n          <button type=\"button\" onClick={() => setShowOverlay(true)}>\n            {account?.visible ? <EyeIcon /> : <EyeOffIcon />}\n            <Localized id=\"set-visibility\">\n              <span className=\"text\" />\n            </Localized>\n          </button>\n\n          <div className=\"icon-divider\" />\n\n          <div\n            className=\"leaderboard-info\"\n            onMouseEnter={() => setShowInfo(true)}\n            onMouseLeave={() => setShowInfo(false)}>\n            {showInfo && (\n              <div className=\"info-menu\">\n                <ul>\n                  {[\n                    { Icon: MicIcon, label: 'speak-goal-text' },\n                    { Icon: PlayOutlineIcon, label: 'listen-goal-text' },\n                  ].map(({ Icon, label }) => (\n                    <li key={label}>\n                      <div className=\"icon\">\n                        <Icon />\n                      </div>{' '}\n                      <Localized id={label}>\n                        <span />\n                      </Localized>\n                    </li>\n                  ))}\n                </ul>\n                <div style={{ height: 10 }}>\n                  <div className=\"triangle\" />\n                </div>\n              </div>\n            )}\n            <button\n              className={showInfo ? 'active' : ''}\n              style={{ display: 'flex' }}\n              onClick={() => setShowInfo(!showInfo)}\n              type=\"button\">\n              <InfoIcon />\n            </button>\n          </div>\n        </div>\n      }\n      overlay={\n        showOverlay && (\n          <div className=\"leaderboard-overlay\">\n            <button\n              className=\"close-overlay\"\n              type=\"button\"\n              onClick={() => setShowOverlay(false)}>\n              <CrossIcon />\n            </button>\n            <LocalizedGetAttribute\n              id=\"leaderboard-visibility\"\n              attribute=\"label\">\n              {label => <h2>{label}</h2>}\n            </LocalizedGetAttribute>\n            <Toggle\n              offText=\"hidden\"\n              onText=\"visible\"\n              defaultChecked={Boolean(account.visible)}\n              onChange={(event: any) => {\n                saveAccount({ visible: event.target.checked });\n              }}\n            />\n            <Localized id=\"visibility-explainer\" vars={{ minutes: 20 }}>\n              <p className=\"explainer\" />\n            </Localized>\n            <div className=\"info\">\n              <InfoIcon />\n              <Localized\n                id=\"visibility-overlay-note\"\n                elems={{\n                  profileLink: <LocaleLink to={URLS.PROFILE_INFO} />,\n                }}>\n                <p className=\"note\" />\n              </Localized>\n            </div>\n          </div>\n        )\n      }\n      tabs={{\n        'recorded-clips': ({ locale }) => (\n          <Leaderboard\n            key={'c' + locale}\n            locale={locale}\n            type=\"clip\"\n            ref={leaderboardRef}\n          />\n        ),\n        'validated-clips': ({ locale }) => (\n          <Leaderboard\n            key={'v' + locale}\n            locale={locale}\n            type=\"vote\"\n            ref={leaderboardRef}\n          />\n        ),\n      }}\n    />\n  );\n}\n","import * as React from 'react';\n\nimport './ui.css';\n\nexport function Fraction({\n  numerator,\n  denominator,\n  percentage,\n  className,\n}: {\n  numerator: React.ReactNode;\n  denominator?: React.ReactNode;\n  percentage?: boolean;\n  className?: string;\n}) {\n  return (\n    <div\n      className={`fraction${className ? ` ${className}` : ''}${\n        numerator <= 99 ? ' md-right' : ''\n      }`}>\n      <div className=\"numerator\">{numerator}</div>\n      <div className=\"denominator\">\n        {percentage ? ' % ' : ' / '}\n        {denominator}\n      </div>\n    </div>\n  );\n}\n\nconst Circle = ({\n  radius,\n  strokeW,\n  center,\n  ...rest\n}: React.SVGProps<SVGCircleElement> & {\n  radius: number;\n  strokeW: number;\n  center: number;\n}) => (\n  <circle\n    strokeWidth={strokeW}\n    r={radius}\n    cx={center}\n    cy={center}\n    fill=\"transparent\"\n    {...rest}\n  />\n);\n\nconst RADIUS = 30;\nconst STROKE = 2;\n\nexport function CircleProgress({\n  className = '',\n  value,\n  denominator,\n  radius = RADIUS,\n  strokeW = STROKE,\n}: {\n  className?: string;\n  value: number;\n  denominator?: number; // If unset, we show `value` as a percentage.\n  radius?: number;\n  strokeW?: number;\n}) {\n  if (0.1 <= value || value <= 0.99) {\n    radius = 44;\n  } else if (value >= 1) {\n    radius = 50;\n  }\n  const circumference = 2 * Math.PI * radius;\n  const center = radius + strokeW;\n  const size = center * 2;\n  return (\n    <div\n      className={`circle-progress ${className}`}\n      style={{ color: 'var(--red)' }}>\n      <svg width={size} height={size}>\n        <Circle radius={radius} strokeW={strokeW} center={center} />\n        <Circle\n          radius={radius}\n          strokeW={strokeW}\n          center={center}\n          className=\"progress-circle\"\n          strokeDasharray={circumference}\n          strokeDashoffset={\n            circumference * Math.max(1 - value / (denominator || 1), 0)\n          }\n        />\n        {/* {!denominator && (\n            <text\n              x={center}\n              y={center}\n              textAnchor=\"middle\"\n              dominantBaseline=\"central\">\n              {Math.round(100 * value)}%\n            </text>\n        )} */}\n      </svg>\n      {denominator ? (\n        <Fraction numerator={value} denominator={denominator} />\n      ) : (\n        <Fraction\n          numerator={\n            Math.round(100 * value) >= 100 ? '100' : Math.round(100 * value)\n          }\n          percentage\n        />\n      )}\n    </div>\n  );\n}\n","import { Localized } from '@fluent/react';\nimport * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport { DAILY_GOALS } from '../../../../constants';\nimport { useAccount, useAPI } from '../../../../hooks/store-hooks';\nimport { trackDashboard } from '../../../../services/tracker';\nimport URLS from '../../../../urls';\nimport {\n  LocaleLink,\n  toLocaleRouteBuilder,\n  useLocale,\n} from '../../../locale-helpers';\nimport { MicIcon, OldPlayIcon } from '../../../ui/icons';\nimport { LinkButton } from '../../../ui/ui';\nimport { CircleProgress, Fraction } from '../ui';\n\nimport './progress-card.css';\n\ninterface Props {\n  type: 'speak' | 'listen';\n  locale: string;\n  personalCurrent?: number;\n  personalGoal?: number;\n}\n\nexport default function ProgressCard({\n  locale,\n  personalCurrent,\n  personalGoal,\n  type,\n}: Props) {\n  const [globalLocale] = useLocale();\n  const { custom_goals: customGoals } = useAccount() || {};\n  let api = useAPI();\n  const [overallCurrent, setOverallCurrent] = useState(null);\n\n  async function fetchAndSetOverallCount() {\n    if (!locale) {\n      trackDashboard('change-language', globalLocale);\n    }\n    api = api.forLocale(locale || null);\n    setOverallCurrent(\n      await (type === 'speak'\n        ? api.fetchDailyClipsCount()\n        : api.fetchDailyVotesCount())\n    );\n  }\n\n  useEffect(() => {\n    fetchAndSetOverallCount();\n  }, []);\n\n  const overallGoal = DAILY_GOALS[type][0];\n  const isSpeak = type == 'speak';\n  const customGoal = customGoals?.find(g => g.locale == locale);\n  const currentCustomGoal = customGoal ? customGoal.current[type] : undefined;\n  const hasCustomGoalForThis = currentCustomGoal !== undefined;\n  const goalsPath = URLS.DASHBOARD + (locale ? '/' + locale : '') + URLS.GOALS;\n\n  return (\n    <div className={'progress-card ' + type}>\n      <div className=\"personal\">\n        {hasCustomGoalForThis ? (\n          <Fraction\n            numerator={currentCustomGoal}\n            denominator={customGoal.amount}\n          />\n        ) : (\n          <Fraction\n            numerator={\n              typeof personalCurrent == 'number' ? personalCurrent : '?'\n            }\n            denominator={\n              (personalGoal == Infinity ? (\n                <div className=\"infinity\">∞</div>\n              ) : (\n                personalGoal\n              )) || '?'\n            }\n          />\n        )}\n        <Localized id={isSpeak ? 'clips-you-recorded' : 'clips-you-validated'}>\n          <div className=\"description\" />\n        </Localized>\n        <div className=\"custom-goal-section\">\n          {customGoal && hasCustomGoalForThis ? (\n            <LocaleLink className=\"custom-goal-link\" to={goalsPath}>\n              <CircleProgress value={currentCustomGoal / customGoal.amount} />\n              <div className=\"custom-goal-text\">\n                <Localized\n                  id={\n                    currentCustomGoal / customGoal.amount < 1\n                      ? 'toward-next-goal'\n                      : 'goal-reached'\n                  }>\n                  <span />\n                </Localized>\n              </div>\n            </LocaleLink>\n          ) : (\n            !customGoal && (\n              <Localized id=\"create-custom-goal\">\n                <LinkButton rounded to={goalsPath} />\n              </Localized>\n            )\n          )}\n        </div>\n      </div>\n\n      <div className=\"progress-wrap\">\n        <div className=\"progress\">\n          <div className=\"icon-wrap\">\n            {isSpeak ? (\n              <MicIcon />\n            ) : (\n              <OldPlayIcon style={{ position: 'relative', left: 3 }} />\n            )}\n          </div>\n        </div>\n      </div>\n\n      <div className=\"overall\">\n        <Fraction\n          numerator={overallCurrent == null ? '?' : overallCurrent}\n          denominator={overallGoal}\n        />\n        <Localized\n          id={\n            isSpeak ? 'todays-recorded-progress' : 'todays-validated-progress'\n          }>\n          <div className=\"description\" />\n        </Localized>\n        <Localized id=\"help-reach-goal\" vars={{ goal: overallGoal }}>\n          <LinkButton\n            rounded\n            outline\n            absolute\n            to={toLocaleRouteBuilder(locale || globalLocale)(\n              isSpeak ? URLS.SPEAK : URLS.LISTEN\n            )}\n            onClick={() =>\n              trackDashboard(isSpeak ? 'speak-cta' : 'listen-cta', globalLocale)\n            }\n          />\n        </Localized>\n      </div>\n    </div>\n  );\n}\n","import * as React from 'react';\nimport Props from '../props';\nimport ContributionActivity from './contribution-activity';\nimport LeaderboardCard from './leaderboard-card';\nimport ProgressCard from './progress-card';\nimport StatsCard from './stats-card';\n\nimport './stats.css';\n\nconst StatsPage = ({ allGoals, dashboardLocale }: Props) =>\n  allGoals ? (\n    <div className=\"stats-page\">\n      <div className=\"cards\">\n        {['speak', 'listen'].map(type => {\n          const [current, goals] = allGoals.globalGoals[\n            type == 'speak' ? 'clips' : 'votes'\n          ];\n          return (\n            <ProgressCard\n              key={type + dashboardLocale}\n              type={type as any}\n              locale={dashboardLocale}\n              personalCurrent={current}\n              personalGoal={\n                allGoals\n                  ? (goals.find(g => !g.date) || { goal: Infinity }).goal\n                  : null\n              }\n            />\n          );\n        })}\n      </div>\n\n      <div className=\"cards\">\n        <StatsCard\n          key=\"contribution\"\n          title=\"contribution-activity\"\n          currentLocale={dashboardLocale}\n          tabs={['you', 'everyone'].reduce(\n            (o: any, from: any) => ({\n              ...o,\n              [from]: ({ locale }: { locale: string }) => (\n                <ContributionActivity\n                  key={locale + from}\n                  {...{ from, locale }}\n                />\n              ),\n            }),\n            {}\n          )}\n        />\n        <LeaderboardCard currentLocale={dashboardLocale} />\n      </div>\n    </div>\n  ) : null;\n\nexport default StatsPage;\n","import { Localized, withLocalization } from '@fluent/react';\nimport * as React from 'react';\nimport { useState } from 'react';\nimport { CustomGoal, CustomGoalParams } from 'common';\nimport { UserClient } from 'common';\nimport URLS from '../../../../urls';\nimport { useAccount, useIsSubscribed } from '../../../../hooks/store-hooks';\nimport { useRouter } from '../../../../hooks/use-router';\nimport { getManageSubscriptionURL } from '../../../../utility';\nimport {\n  contributableLocales,\n  LocaleLink,\n  useLocale,\n} from '../../../locale-helpers';\nimport ShareModal from '../../../share-modal/share-modal';\nimport {\n  ArrowLeft,\n  CheckIcon,\n  CrossIcon,\n  PenIcon,\n  SettingsIcon,\n  ShareIcon,\n} from '../../../ui/icons';\nimport { Button, LabeledSelect, LinkButton } from '../../../ui/ui';\nimport { CircleProgress, Fraction } from '../ui';\nimport { useEffect } from 'react';\n\nconst Buttons = ({ children, ...props }: React.HTMLProps<HTMLDivElement>) => (\n  <div className=\"buttons padded\" {...props}>\n    {children}\n    <div className=\"filler\" />\n  </div>\n);\n\nconst ArrowButton = (props: React.HTMLProps<HTMLButtonElement>) => (\n  <button className=\"arrow-button\" type={'button' as any} {...props}>\n    <ArrowLeft />\n  </button>\n);\n\nconst CloseButton = (props: React.HTMLProps<HTMLButtonElement>) => (\n  <button type={'button' as any} className=\"close-button\" {...props}>\n    <CrossIcon />\n  </button>\n);\n\nexport const ViewGoal = ({\n  locale,\n  onNext,\n  customGoal: { amount, current, days_interval },\n}: {\n  locale: string;\n  onNext: () => any;\n  customGoal: CustomGoal;\n}) => (\n  <div className=\"padded view-goal\">\n    <div className=\"top\">\n      <h2>Custom Goals</h2>\n      <button className=\"edit-button\" type=\"button\" onClick={onNext}>\n        <PenIcon />\n      </button>\n    </div>\n    {Object.keys(current).map(key => {\n      const value = (current as any)[key];\n      return (\n        <div key={key} className={'goal-box ' + key}>\n          <Fraction numerator={value} denominator={amount} />\n\n          <div className=\"relative\">\n            <CircleProgress value={value / amount} />\n            <div className=\"interval\">\n              {days_interval == 7 ? 'Of weekly goal' : 'Of daily goal'}\n            </div>\n          </div>\n\n          <LinkButton\n            className=\"cta\"\n            rounded\n            absolute\n            to={'/' + locale + (key == 'speak' ? URLS.SPEAK : URLS.LISTEN)}>\n            {key[0].toUpperCase() + key.slice(1)}\n          </LinkButton>\n        </div>\n      );\n    })}\n  </div>\n);\n\ninterface CustomGoalStepProps {\n  dashboardLocale: string;\n\n  completedFields: React.ReactNode;\n  currentFields: React.ReactNode;\n\n  closeButtonProps: React.HTMLProps<HTMLButtonElement>;\n  nextButtonProps: React.HTMLProps<HTMLButtonElement>;\n\n  state: CustomGoalParams;\n\n  subscribed: boolean;\n  setSubscribed: (subscribed: boolean) => void;\n}\n\ninterface AccountProps {\n  account: UserClient;\n}\n\nexport default [\n  withLocalization(({ getString, dashboardLocale, nextButtonProps }: any) => {\n    const { history } = useRouter();\n    const [, toLocaleRoute] = useLocale();\n    const [locale, setLocale] = useState('');\n    return (\n      <>\n        <div className=\"text\">\n          <Localized id=\"build-custom-goal\">\n            <h1 />\n          </Localized>\n          <Localized\n            id={\n              dashboardLocale\n                ? 'help-reach-hours-pluralized'\n                : 'help-reach-hours-general-pluralized'\n            }\n            vars={{\n              hours: 10000,\n              language: getString(dashboardLocale),\n            }}>\n            <span className=\"sub-head\" />\n          </Localized>\n        </div>\n\n        <div className=\"waves\">\n          <img className=\"mars\" src=\"/img/mars.svg\" alt=\"Mars Robot\" />\n        </div>\n\n        {!dashboardLocale && (\n          <div className=\"select-wrap\">\n            <Localized\n              id=\"request-language-form-language\"\n              attrs={{ label: true }}>\n              <LabeledSelect\n                value={locale}\n                onChange={(event: any) => setLocale(event.target.value)}>\n                <option key=\"empty\" value=\"\" />\n                {contributableLocales.map(l => (\n                  <Localized id={l}>\n                    <option key={l} value={l} />\n                  </Localized>\n                ))}\n              </LabeledSelect>\n            </Localized>\n          </div>\n        )}\n\n        <Localized id=\"set-a-goal\">\n          <Button\n            className=\"get-started-button\"\n            rounded\n            {...nextButtonProps}\n            disabled={!dashboardLocale && !locale}\n            onClick={\n              dashboardLocale\n                ? nextButtonProps.onClick\n                : () => {\n                    history.push(\n                      toLocaleRoute(\n                        URLS.DASHBOARD + '/' + locale + URLS.GOALS + '?start'\n                      )\n                    );\n                  }\n            }\n          />\n        </Localized>\n      </>\n    );\n  }),\n\n  ({ closeButtonProps, currentFields, nextButtonProps }) => (\n    <>\n      <div className=\"padded\">\n        <Localized id=\"goal-type\">\n          <h2 />\n        </Localized>\n        {currentFields}\n      </div>\n      <Buttons style={{ marginBottom: 20 }}>\n        <CloseButton {...closeButtonProps} />\n        <ArrowButton {...nextButtonProps} />\n      </Buttons>\n      <div className=\"waves\">\n        <img className=\"mars\" src=\"/img/mars.svg\" alt=\"Mars Robot\" />\n        <div className=\"text\">\n          <Localized id=\"cant-decide\">\n            <h4 />\n          </Localized>\n          <Localized\n            id=\"activity-needed-calculation-plural\"\n            vars={{\n              totalHours: 10000,\n              periodMonths: 6,\n              people: 1000,\n              clipsPerDay: 45,\n            }}>\n            <p />\n          </Localized>\n        </div>\n      </div>\n    </>\n  ),\n\n  ({\n    closeButtonProps,\n    completedFields,\n    currentFields,\n    nextButtonProps,\n    state,\n  }) => (\n    <>\n      <div className=\"padded\">\n        {completedFields}\n        <Localized\n          id={state.daysInterval == 7 ? 'how-many-a-week' : 'how-many-per-day'}>\n          <h2 />\n        </Localized>\n        {currentFields}\n      </div>\n      <Buttons>\n        <CloseButton {...closeButtonProps} />\n        <ArrowButton {...nextButtonProps} />\n      </Buttons>\n    </>\n  ),\n\n  ({ closeButtonProps, completedFields, currentFields, nextButtonProps }) => (\n    <>\n      <div className=\"padded\">\n        {completedFields}\n        <Localized id=\"which-goal-type\">\n          <h2 />\n        </Localized>\n        {currentFields}\n      </div>\n      <Buttons>\n        <CloseButton {...closeButtonProps} />\n        <ArrowButton {...nextButtonProps} />\n      </Buttons>\n    </>\n  ),\n\n  ({\n    closeButtonProps,\n    completedFields,\n    nextButtonProps,\n\n    subscribed,\n    setSubscribed,\n  }: CustomGoalStepProps & AccountProps) => {\n    const account = useAccount();\n    const [privacyAgreed, setPrivacyAgreed] = useState(false);\n    const isSubscribed = useIsSubscribed();\n\n    return (\n      <div className=\"padded\">\n        {completedFields}\n        {account.basket_token ? (\n          isSubscribed !== null && (\n            <>\n              <Localized\n                id={\n                  isSubscribed\n                    ? 'receiving-emails-info'\n                    : 'not-receiving-emails-info'\n                }\n                elems={{ bold: <b /> }}>\n                <p className=\"subscription-info\" />\n              </Localized>\n              <a\n                className=\"manage-subscriptions\"\n                href={getManageSubscriptionURL(account)}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\">\n                <Localized id=\"manage-email-subscriptions\">\n                  <span />\n                </Localized>\n                <SettingsIcon />\n              </a>\n            </>\n          )\n        ) : (\n          <>\n            <label className=\"box\">\n              <input\n                type=\"checkbox\"\n                checked={subscribed}\n                onChange={event => setSubscribed(event.target.checked)}\n              />\n              <Localized id=\"email-opt-in-info\">\n                <div className=\"content\" />\n              </Localized>\n            </label>\n            <label className=\"box\">\n              <input\n                type=\"checkbox\"\n                checked={privacyAgreed}\n                onChange={event => setPrivacyAgreed(event.target.checked)}\n              />\n              <div className=\"content\">\n                <Localized\n                  id=\"accept-privacy\"\n                  elems={{\n                    privacyLink: <LocaleLink to={URLS.PRIVACY} blank />,\n                  }}>\n                  <span />\n                </Localized>\n              </div>\n            </label>\n            <Localized id=\"read-terms-q\">\n              <LocaleLink to={URLS.TERMS} className=\"terms\" blank />\n            </Localized>\n          </>\n        )}\n        <Buttons>\n          <CloseButton {...closeButtonProps} />\n          <Button\n            rounded\n            className=\"submit\"\n            {...nextButtonProps}\n            disabled={subscribed && !privacyAgreed}>\n            <CheckIcon />{' '}\n            <Localized id=\"confirm-goal\">\n              <span />\n            </Localized>\n          </Button>\n        </Buttons>\n      </div>\n    );\n  },\n\n  withLocalization(({ getString, nextButtonProps, state }: any) => {\n    const [showShareModal, setShowShareModal] = useState(false);\n    const isWeekly = state.daysInterval == 7;\n    return (\n      <div className=\"padded\">\n        {showShareModal && (\n          <ShareModal\n            title={getString('help-share-goal')}\n            text={getString(\n              isWeekly\n                ? 'share-n-weekly-contribution-goal'\n                : 'share-n-daily-contribution-goal',\n              {\n                count: state.amount,\n                type: getString('share-goal-type-' + state.type),\n              }\n            )}\n            shareTextId=\"goal-share-text\"\n            onRequestClose={() => {\n              setShowShareModal(false);\n              const { onClick } = nextButtonProps as any;\n              if (onClick) {\n                onClick();\n              }\n            }}\n          />\n        )}\n        <div className=\"check\">\n          <div className=\"shadow\" />\n          <CheckIcon />\n        </div>\n        <Localized id={isWeekly ? 'weekly-goal-created' : 'daily-goal-created'}>\n          <h2 />\n        </Localized>\n        <p>\n          <Localized id=\"track-progress\">\n            <span />\n          </Localized>\n          <br />\n          <Localized id=\"return-to-edit-goal\">\n            <span />\n          </Localized>\n        </p>\n        <Button\n          rounded\n          className=\"share-button\"\n          onClick={() => setShowShareModal(true)}>\n          <ShareIcon />{' '}\n          <Localized id=\"share-goal\">\n            <span />\n          </Localized>\n        </Button>\n        <CloseButton {...nextButtonProps} />\n      </div>\n    );\n  }),\n] as React.ComponentType<CustomGoalStepProps>[];\n","import { Localized } from '@fluent/react';\nimport * as React from 'react';\nimport { useState } from 'react';\nimport { CustomGoalParams } from 'common';\nimport { useAccount, useAction, useAPI } from '../../../../hooks/store-hooks';\nimport { User } from '../../../../stores/user';\nimport Modal from '../../../modal/modal';\nimport { PenIcon } from '../../../ui/icons';\nimport steps, { ViewGoal } from './custom-goal-steps';\n\nimport './custom-goal.css';\nimport { useRouter } from '../../../../hooks/use-router';\n\nconst STATE_KEYS: ReadonlyArray<keyof CustomGoalParams> = [\n  null, // first step has no state\n  'daysInterval',\n  'amount',\n  'type',\n];\n\nconst STEPS = {\n  INTRO: 0,\n  EDIT_START: 1,\n  SUBMIT: 4,\n  COMPLETED: 5,\n};\n\nconst Radio = ({\n  children,\n  onChecked,\n  ...props\n}: {\n  children: React.ReactNode;\n  onChecked?: () => any;\n} & React.HTMLProps<HTMLInputElement>) => (\n  <label className=\"box\">\n    <input\n      type=\"radio\"\n      onChange={event => event.target.checked && onChecked && onChecked()}\n      {...props}\n    />\n    <div className=\"content\">{children}</div>\n  </label>\n);\n\nfunction StepButtons({\n  setStepIndex,\n  state,\n  stepIndex,\n  touchedStepIndex,\n}: {\n  setStepIndex: (index: number) => void;\n  state: CustomGoalParams;\n  stepIndex: number;\n  touchedStepIndex: number;\n}) {\n  return (\n    <div className=\"padded step-buttons\">\n      {stepIndex > 0 &&\n        stepIndex < 5 &&\n        [...(Array(4) as any).keys()].map(i => {\n          const n = i + 1;\n          const isCompleted =\n            state[STATE_KEYS[n]] != null && touchedStepIndex >= n;\n          const isActive = n == stepIndex;\n          return (\n            <React.Fragment key={i}>\n              <div\n                className={[\n                  'step-button',\n                  isActive ? 'active' : '',\n                  isCompleted ? 'completed' : '',\n                ].join(' ')}>\n                <button\n                  type=\"button\"\n                  onClick={() => setStepIndex(n)}\n                  disabled={n > 1 && state[STATE_KEYS[n - 1]] == null}>\n                  {n}\n                </button>\n              </div>\n              {n < 4 && (\n                <>\n                  <div\n                    className={\n                      'line ' + (isCompleted || isActive ? 'fill' : '')\n                    }\n                  />\n                  <div className={'line ' + (isCompleted ? 'fill' : '')} />\n                </>\n              )}\n            </React.Fragment>\n          );\n        })}\n    </div>\n  );\n}\n\nfunction CompletedFields({\n  setStepIndex,\n  state,\n  states,\n  stepIndex,\n}: {\n  setStepIndex: (index: number) => void;\n  state: CustomGoalParams;\n  states: any;\n  stepIndex: number;\n}) {\n  const completedStates =\n    stepIndex > STEPS.SUBMIT ? [] : STATE_KEYS.slice(1, stepIndex);\n  return (\n    <div className=\"fields completed\">\n      {completedStates.map(stateKey => {\n        if (!states[stateKey]) return null;\n        const [labelId, value] = states[stateKey].find(\n          ([, value]: any) => value == state[stateKey]\n        );\n        return (\n          <Radio key={stateKey} checked disabled>\n            <Localized\n              {...(stateKey == 'amount'\n                ? { id: 'n-clips-pluralized', vars: { count: value } }\n                : {\n                    id:\n                      stateKey == 'type' && value == 'both'\n                        ? 'both-speak-and-listen-long'\n                        : labelId,\n                  })}>\n              <span />\n            </Localized>\n            <button\n              type=\"button\"\n              onClick={() =>\n                setStepIndex(STATE_KEYS.findIndex(k => k == stateKey))\n              }>\n              <PenIcon />\n            </button>\n          </Radio>\n        );\n      })}\n    </div>\n  );\n}\n\nfunction CurrentFields({\n  setState,\n  state,\n  states,\n  stepIndex,\n}: {\n  setState: (state: CustomGoalParams) => void;\n  state: CustomGoalParams;\n  states: any;\n  stepIndex: number;\n}) {\n  const currentStateKey = STATE_KEYS[stepIndex];\n  return (\n    <div className=\"fields\">\n      {(states[currentStateKey] || []).map(([labelId, value]: any) =>\n        value == null ? null : (\n          <Radio\n            key={value}\n            name={currentStateKey}\n            checked={value == state[currentStateKey]}\n            onChecked={() =>\n              setState({\n                ...state,\n                [currentStateKey]: value,\n                // reset following states\n                ...STATE_KEYS.slice(stepIndex + 1).reduce(\n                  (obj: any, key: string) => {\n                    obj[key] = null;\n                    return obj;\n                  },\n                  {}\n                ),\n              })\n            }>\n            {currentStateKey == 'amount' ? (\n              <>\n                <Localized id=\"n-clips-pluralized\" vars={{ count: value }}>\n                  <span />\n                </Localized>\n                <Localized id={labelId}>\n                  <span className=\"right\" />\n                </Localized>\n              </>\n            ) : (\n              <Localized id={labelId}>\n                <span />\n              </Localized>\n            )}\n          </Radio>\n        )\n      )}\n    </div>\n  );\n}\n\nexport default function CustomGoal({\n  dashboardLocale,\n}: {\n  dashboardLocale: string;\n}) {\n  const { history, location } = useRouter();\n  const api = useAPI();\n  const account = useAccount();\n  const { custom_goals, email } = account || {};\n  const customGoal = custom_goals?.find(g => g.locale == dashboardLocale);\n  const refreshUser = useAction(User.actions.refresh);\n  const saveAccount = useAction(User.actions.saveAccount);\n\n  const hasStartParam = location.search.includes('start');\n  const [stepIndex, setStepIndex] = useState(\n    !customGoal && hasStartParam ? STEPS.EDIT_START : STEPS.INTRO\n  );\n  if (hasStartParam) {\n    history.replace(location.pathname);\n  }\n\n  const [touchedStepIndex, setTouchedStepIndex] = useState(STEPS.INTRO);\n  const [subscribed, setSubscribed] = useState(false);\n  const initialState = customGoal\n    ? {\n        daysInterval: customGoal.days_interval,\n        amount: customGoal.amount,\n        type:\n          Object.keys(customGoal.current).length == 1\n            ? Object.keys(customGoal.current)[0]\n            : 'both',\n      }\n    : {\n        daysInterval: null,\n        amount: null,\n        type: null,\n      };\n  const [state, setState] = useState<CustomGoalParams>(initialState);\n  const [showOverwriteModal, setShowOverwriteModal] = useState(false);\n  const [showAbortEditModal, setShowAbortEditModal] = useState(false);\n\n  const Step = steps[stepIndex];\n\n  const states: any = {\n    daysInterval: [\n      ['daily-goal', 1],\n      ['weekly-goal', 7],\n    ],\n    amount: [\n      ['easy', 15],\n      ['average', 30],\n      ['difficult', 45],\n      ['pro', 60],\n    ].map(([labelId, value]) => [\n      labelId + '-difficulty',\n      (state.daysInterval || 0) * (value as number),\n    ]),\n    type: [\n      ['speak', 'speak'],\n      ['listen', 'listen'],\n      ['both-speak-and-listen', 'both'],\n    ],\n  };\n\n  async function handleNext(confirmed = false) {\n    const nextIndex = (stepIndex + 1) % steps.length;\n    if (customGoal && !confirmed && nextIndex == STEPS.EDIT_START) {\n      setShowOverwriteModal(true);\n      return;\n    }\n    setStepIndex(nextIndex);\n    setTouchedStepIndex(Math.max(touchedStepIndex, nextIndex));\n    if (nextIndex == STEPS.COMPLETED) {\n      setTouchedStepIndex(STEPS.INTRO);\n      await api.createGoal(dashboardLocale, state);\n      if (!account.locales.some(l => l.locale == dashboardLocale)) {\n        await saveAccount({\n          ...account,\n          locales: account.locales.concat({\n            locale: dashboardLocale,\n            accent: '',\n          }),\n        });\n      }\n      if (subscribed) {\n        await api.subscribeToNewsletter(email);\n      }\n      refreshUser();\n    }\n  }\n\n  const showViewGoal = stepIndex == STEPS.INTRO && customGoal;\n  return (\n    <div className={'custom-goal ' + (showViewGoal ? '' : 'step-' + stepIndex)}>\n      {showOverwriteModal && (\n        <Modal\n          buttons={{\n            Cancel: () => setShowOverwriteModal(false),\n            Yes: () => {\n              setShowOverwriteModal(false);\n              handleNext(true);\n            },\n          }}\n          onRequestClose={() => setShowOverwriteModal(false)}>\n          <Localized id=\"lose-goal-progress-warning\">\n            <span />\n          </Localized>\n          <br />\n          <Localized id=\"want-to-continue\">\n            <span />\n          </Localized>\n        </Modal>\n      )}\n      {showAbortEditModal && (\n        <Modal\n          buttons={{\n            Exit: () => setShowAbortEditModal(false),\n            Yes: () => {\n              setShowAbortEditModal(false);\n              setState(initialState);\n              setTouchedStepIndex(STEPS.INTRO);\n              setStepIndex(STEPS.INTRO);\n            },\n          }}\n          onRequestClose={() => setShowAbortEditModal(false)}>\n          <Localized id=\"finish-editing\">\n            <span />\n          </Localized>\n          <br />\n          <Localized id=\"lose-changes-warning\">\n            <span />\n          </Localized>\n        </Modal>\n      )}\n      <StepButtons\n        setStepIndex={i => {\n          setTouchedStepIndex(Math.max(touchedStepIndex, i));\n          setStepIndex(i);\n        }}\n        {...{ state, stepIndex, touchedStepIndex }}\n      />\n      {showViewGoal ? (\n        <ViewGoal\n          locale={dashboardLocale}\n          onNext={() => handleNext()}\n          customGoal={customGoal}\n        />\n      ) : (\n        <Step\n          closeButtonProps={{\n            onClick: () => {\n              setShowAbortEditModal(true);\n            },\n            style: customGoal ? {} : { visibility: 'hidden' },\n          }}\n          completedFields={\n            <CompletedFields {...{ setStepIndex, state, states, stepIndex }} />\n          }\n          currentFields={\n            <CurrentFields {...{ setState, state, states, stepIndex }} />\n          }\n          nextButtonProps={{\n            disabled:\n              stepIndex > STEPS.INTRO &&\n              stepIndex < STEPS.SUBMIT &&\n              state[STATE_KEYS[stepIndex]] == null,\n            onClick: () => handleNext(),\n          }}\n          state={state}\n          {...{ dashboardLocale, subscribed, setSubscribed }}\n        />\n      )}\n    </div>\n  );\n}\n","import * as React from 'react';\nimport { Localized } from '@fluent/react';\nimport { GlobalGoal } from 'common';\n\nimport './goal-row.css';\n\nconst Wave = () => (\n  <svg width=\"160\" height=\"70\" viewBox=\"0 0 160 70\">\n    <defs>\n      <linearGradient id=\"wave-b\" x1=\"50%\" x2=\"50%\" y1=\"100%\" y2=\"0%\">\n        <stop offset=\"0%\" stopColor=\"#FF4F5E\" stopOpacity=\"0\" />\n        <stop offset=\"100%\" stopColor=\"rgba(0,0,0,.4)\" />\n      </linearGradient>\n      <path\n        id=\"wave-a\"\n        d=\"M0 45.229c21.074-18.809 28.61-2.594 54.87-2.594C83.025 42.635 86.378 21 111.59 21c27.04 0 29.061 20.902 48.41 24.229V91H0V45.229z\"\n      />\n    </defs>\n    <use\n      fill=\"url(#wave-b)\"\n      fillRule=\"evenodd\"\n      opacity=\".5\"\n      style={{ mixBlendMode: 'multiply' }}\n      transform=\"matrix(-1 0 0 1 160 -21)\"\n      xlinkHref=\"#wave-a\"\n    />\n  </svg>\n);\n\nconst GoalBox = ({\n  date,\n  goal,\n  isNext,\n  type,\n}: GlobalGoal & { isNext: boolean; type: string }) => (\n  <div className={'goal-box ' + type + (date ? ' done' : '')}>\n    {(date || isNext) && <Wave />}\n    <div className=\"goal\">{goal}</div>\n    <hr />\n    <Localized\n      id={\n        ({\n          streaks: 'days',\n          clips: 'recordings',\n          votes: 'validations',\n        } as any)[type]\n      }\n      vars={{ count: goal }}>\n      <div className=\"unit\" />\n    </Localized>\n    {date && (\n      <div className=\"date\">\n        {new Date(date).toLocaleDateString(undefined, {\n          year: 'numeric',\n          month: 'short',\n          day: 'numeric',\n        })}\n      </div>\n    )}\n  </div>\n);\n\nexport default function GoalRow({\n  goalInfo: [type, [current, goals]],\n}: {\n  goalInfo: [string, [number, GlobalGoal[]]];\n}) {\n  return (\n    <div className=\"goal-row\">\n      <Localized\n        id={({ clips: 'speak', votes: 'listen' } as any)[type] || type}>\n        <h3 />\n      </Localized>\n      <div className=\"goal-boxes\">\n        {goals.map((goal, i) => (\n          <GoalBox\n            key={i}\n            {...goal}\n            type={type}\n            isNext={(goals[i - 1] || ({} as any)).date}\n          />\n        ))}\n      </div>\n    </div>\n  );\n}\n","import * as React from 'react';\nimport Props from '../props';\nimport CustomGoal from './custom-goal';\nimport GoalRow from './goal-row';\n\nimport './goals.css';\n\nconst GoalsPage = ({ allGoals, dashboardLocale }: Props) => (\n  <div className=\"goals-inner\">\n    <div className=\"goal-rows\">\n      {allGoals &&\n        Object.entries(allGoals.globalGoals).map((goalInfo, i) => (\n          <GoalRow key={i} goalInfo={goalInfo} />\n        ))}\n    </div>\n    <CustomGoal key={dashboardLocale} {...{ dashboardLocale }} />\n  </div>\n);\n\nexport default GoalsPage;\n","import * as React from 'react';\nimport { useEffect } from 'react';\nimport { useAccount, useAction, useAPI } from '../../../../hooks/store-hooks';\nimport { User } from '../../../../stores/user';\nimport URLS from '../../../../urls';\nimport { MicIcon, PlayOutlineIcon } from '../../../ui/icons';\nimport { LinkButton } from '../../../ui/ui';\nimport Props from '../props';\n\nimport './awards.css';\n\nconst NoAwardsPage = ({ dashboardLocale }: { dashboardLocale: string }) => (\n  <div className=\"no-awards-page\">\n    <img src={require('./stars.svg')} alt=\"Stars\" />\n    <h1>Earn your first award, create a goal</h1>\n    <LinkButton\n      rounded\n      to={\n        URLS.DASHBOARD +\n        (dashboardLocale ? '/' + dashboardLocale : '') +\n        URLS.GOALS\n      }>\n      Get started with goals\n    </LinkButton>\n    <p>When you complete a personal goal, your awards will show up here.</p>\n  </div>\n);\n\nconst INTERVAL_LABELS: { [key: number]: string } = {\n  1: 'Daily',\n  7: 'Weekly',\n};\n\nconst Wave = () => (\n  <svg className=\"wave\" width=\"172\" height=\"70\" viewBox=\"0 0 172 70\">\n    <defs>\n      <linearGradient id=\"wave-b\" x1=\"50%\" x2=\"50%\" y1=\"100%\" y2=\"0%\">\n        <stop offset=\"0%\" stopColor=\"#040101\" stopOpacity=\"0\" />\n        <stop offset=\"100%\" stopColor=\"#000\" stopOpacity=\"0.3\" />\n      </linearGradient>\n      <path\n        id=\"wave-a\"\n        d=\"M0 49.237c22.655-18.809 30.755-2.594 58.986-2.594C89.25 46.643 100.896 10 128 10c21 0 26 9 44 16.117V80H0V49.237z\"\n      />\n    </defs>\n    <use\n      fill=\"url(#wave-b)\"\n      fillRule=\"evenodd\"\n      opacity=\".5\"\n      transform=\"matrix(-1 0 0 1 172 -10)\"\n      xlinkHref=\"#wave-a\"\n    />\n  </svg>\n);\n\nconst AwardBox = ({ award }: any) => (\n  <li className={'award-box ' + award.type}>\n    <Wave />\n    <img className=\"star\" src={require('./star.svg')} alt=\"Star\" />\n    <div className=\"interval\">\n      {INTERVAL_LABELS[award.days_interval] || award.days_interval}\n    </div>\n    <div className=\"line\" />\n    <div className=\"amount\">{award.amount} Clips</div>\n    <div className=\"type\">\n      {award.type[0].toUpperCase() + award.type.slice(1)}\n    </div>\n    <div className=\"icon\">\n      {({ speak: <MicIcon />, listen: <PlayOutlineIcon /> } as any)[award.type]}\n    </div>\n  </li>\n);\n\nexport default function AwardsPage({ dashboardLocale }: Props) {\n  const account = useAccount();\n  const api = useAPI();\n  const refreshUser = useAction(User.actions.refresh);\n\n  useEffect(() => {\n    api.seenAwards().then(() => {\n      refreshUser();\n    });\n  }, []);\n\n  if (!account) {\n    return null;\n  }\n\n  const awards = account.awards.filter(\n    a => !dashboardLocale || a.locale == dashboardLocale\n  );\n\n  if (awards.length == 0) {\n    return <NoAwardsPage {...{ dashboardLocale }} />;\n  }\n\n  const buckets = awards.reduce((buckets, award) => {\n    const bucket = buckets[award.days_interval];\n    buckets[award.days_interval] = bucket ? [...bucket, award] : [award];\n    return buckets;\n  }, []);\n\n  return (\n    <div className=\"award-lists\">\n      {buckets.map((bucket: any[], i: number) =>\n        bucket ? (\n          <React.Fragment key={i}>\n            <h2>{INTERVAL_LABELS[i] || i}</h2>\n            <ul>\n              {bucket.map((award, i) => (\n                <AwardBox key={i} award={award} />\n              ))}\n            </ul>\n          </React.Fragment>\n        ) : null\n      )}\n    </div>\n  );\n}\n","import * as React from 'react';\nimport { Avatar } from '../../../ui/ui';\nimport { ChallengeTeamToken } from 'common';\nimport { challengeLogos } from './constants';\n\nexport default ({ team }: { team: ChallengeTeamToken }) => {\n  const logo = challengeLogos[team];\n  if (!logo) return null;\n  const { url, background, border } = logo;\n  return (\n    <Avatar\n      className=\"team\"\n      url={url}\n      style={{\n        background,\n        boxSizing: 'border-box',\n        padding: '5px',\n        ...(border && {\n          border: '2px solid var(--grey)',\n        }),\n      }}\n    />\n  );\n};\n","import * as React from 'react';\nimport { LocaleLink } from '../../../locale-helpers';\nimport { CircleProgress, Fraction } from '../../../pages/dashboard/ui';\nimport { WeeklyChallenge, ChallengeTeamToken } from 'common';\nimport { Avatar } from '../../../ui/ui';\nimport URLS from '../../../../urls';\nimport TeamAvatar from './team-avatar';\nimport { weeklyChallengeCopy } from './constants';\nimport './weekly-challenge-board.css';\n\nexport default function WeeklyChallengeBoard({\n  isDisabled,\n  week,\n  individualAvatarUrl,\n  teamToken,\n  weekly,\n}: {\n  isDisabled?: boolean;\n  week: number;\n  individualAvatarUrl: string;\n  teamToken: ChallengeTeamToken;\n  weekly?: WeeklyChallenge;\n}) {\n  const { user, team } = weekly || {};\n  return (\n    <div className={`challenge-board ${isDisabled ? 'disabled' : ''}`}>\n      <div className=\"title-container\">\n        <img\n          className=\"icon\"\n          src={\n            isDisabled\n              ? require('./images/stars-disabled.svg')\n              : require('./images/stars.svg')\n          }\n          alt=\"\"\n          role=\"presentation\"\n        />\n        <p className=\"title\">{weeklyChallengeCopy[week].title}</p>\n        <div className=\"week-container\">Week {week + 1}</div>\n      </div>\n      {!isDisabled && (\n        <div className=\"challenge-board-content\">\n          <div className=\"content-row\">\n            <div className=\"column avatar-container\">\n              <Avatar url={individualAvatarUrl ? individualAvatarUrl : ''} />\n              <p>Individual</p>\n            </div>\n            <div className=\"column challenge-stats\">\n              <div className=\"container\">\n                <LocaleLink className=\"speak-btn\" to={URLS.SPEAK}>\n                  Speak\n                  <span className=\"speak-icon\"></span>\n                </LocaleLink>\n                <CircleProgress\n                  className=\"speak-bar progress-desktop\"\n                  value={user.speak}\n                  denominator={user.speak_total}\n                  strokeW={4}\n                  radius={66}\n                />\n                <Fraction\n                  numerator={user.speak}\n                  denominator={user.speak_total}\n                  className=\"speak-bar progress-mobile\"\n                />\n              </div>\n              <div className=\"divider\" />\n              <div className=\"container\">\n                <LocaleLink className=\"listen-btn\" to={URLS.LISTEN}>\n                  Listen\n                  <span className=\"listen-icon\"></span>\n                </LocaleLink>\n                <CircleProgress\n                  className=\"listen-bar progress-desktop\"\n                  value={user.listen}\n                  denominator={user.listen_total}\n                  strokeW={4}\n                  radius={66}\n                />\n                <Fraction\n                  numerator={user.listen}\n                  denominator={user.listen_total}\n                  className=\"listen-bar progress-mobile\"\n                />\n              </div>\n            </div>\n          </div>\n          <div className=\"content-row\">\n            <div className=\"column avatar-container\">\n              <TeamAvatar team={teamToken} />\n              <p>Team</p>\n            </div>\n            <div className=\"column challenge-stats team-stats\">\n              <div className=\"container team\">\n                {/* TODO: Change .team-text and .team-invite classNames. */}\n                <p className=\"team-text\">\n                  {weeklyChallengeCopy[week].subtitle}\n                </p>\n                <div className=\"v-divider\" />\n                <p className=\"team-invite\">\n                  {weeklyChallengeCopy[week].explanation}\n                </p>\n              </div>\n              <div className=\"container invite\">\n                <CircleProgress\n                  className=\"team-bar progress-desktop\"\n                  value={team.invite / team.invite_total}\n                  strokeW={4}\n                  radius={66}\n                />\n                <Fraction\n                  numerator={(100 * team.invite) / team.invite_total}\n                  className=\"team-bar progress-mobile\"\n                  percentage\n                />\n                <p className=\"team-invite-total\">\n                  of {team.invite_total} invites\n                </p>\n              </div>\n            </div>\n          </div>\n        </div>\n      )}\n    </div>\n  );\n}\n","import * as React from 'react';\nimport WeeklyChallengeBoard from './weekly-challenge-board';\nimport { WeeklyChallenge } from 'common';\nimport { useAccount, useNotifications } from '../../../../hooks/store-hooks';\nimport NotificationPill from '../../../notification-pill/notification-pill';\nimport { FINAL_CHALLENGE_WEEK, weeklyChallengeCopy } from './constants';\nimport { ChevronDown } from '../../../ui/icons';\nimport './weekly-challenge.css';\n\nexport default function WeeklyChallenge({\n  weekly,\n}: {\n  weekly?: WeeklyChallenge;\n}) {\n  let currentWeek = weekly.week;\n  let pastWeek: Array<number> = [];\n  switch (currentWeek) {\n    case 0:\n      break;\n    case 1:\n      pastWeek.push(currentWeek - 1);\n      break;\n    case 2:\n      pastWeek.push(currentWeek - 1);\n      pastWeek.push(currentWeek - 2);\n      break;\n  }\n  const label = pastWeek.length === 0 ? 'Future' : 'Past';\n  const account = useAccount();\n  const notifications = useNotifications();\n\n  return (\n    <div className=\"weekly-container\">\n      <div className=\"weekly-topbar\">\n        <h2>Weekly Challenge</h2>\n        <div className=\"weeks\">\n          <span className=\"week\">Week</span>\n          {weeklyChallengeCopy.map((_, index) => (\n            <span\n              key={index}\n              className={`week-number ${\n                currentWeek === index ? 'active' : ''\n              }`}>\n              {index + 1}\n            </span>\n          ))}\n        </div>\n        <div className=\"week-points\">\n          {notifications\n            .map(\n              notification =>\n                notification.kind == 'pill' &&\n                notification.type === 'achievement' && (\n                  <NotificationPill\n                    key={notification.id}\n                    notification={notification}\n                  />\n                )\n            )\n            .reverse()}\n        </div>\n      </div>\n      <div className=\"weekly-content\">\n        <div>\n          <p className=\"weekly-title\">Current challenge</p>\n          {weekly && (\n            <WeeklyChallengeBoard\n              week={currentWeek}\n              individualAvatarUrl={account.avatar_url}\n              teamToken={account.enrollment.team}\n              weekly={weekly}\n            />\n          )}\n          <p className=\"challenge-dropdown\">\n            Show All Challenges <ChevronDown />\n          </p>\n        </div>\n        {currentWeek < FINAL_CHALLENGE_WEEK && (\n          <div>\n            <p className=\"weekly-title\">Next challenge</p>\n            {weekly && (\n              <WeeklyChallengeBoard\n                isDisabled\n                week={currentWeek + 1}\n                individualAvatarUrl={account.avatar_url}\n                teamToken={account.enrollment.team}\n              />\n            )}\n          </div>\n        )}\n        <div>\n          <p className=\"weekly-title\">{`${\n            currentWeek ? 'Past' : 'Future'\n          } challenge${currentWeek === FINAL_CHALLENGE_WEEK ? 's' : ''}`}</p>\n          {currentWeek === 0\n            ? weekly && (\n                <WeeklyChallengeBoard\n                  isDisabled\n                  week={currentWeek + 2}\n                  individualAvatarUrl={account.avatar_url}\n                  teamToken={account.enrollment.team}\n                />\n              )\n            : pastWeek.map(\n                (value, index) =>\n                  weekly && (\n                    <WeeklyChallengeBoard\n                      isDisabled\n                      week={value}\n                      key={index}\n                      individualAvatarUrl={account.avatar_url}\n                      teamToken={account.enrollment.team}\n                    />\n                  )\n              )}\n        </div>\n      </div>\n    </div>\n  );\n}\n","// Largely copied from `leaderboard-card.tsx`.\n// TODO: Refactor to reduce duplication with the LeaderboardCard component.\nimport * as React from 'react';\nimport API from '../../../../services/api';\nimport { User } from '../../../../stores/user';\nimport StateTree from '../../../../stores/tree';\nimport { Avatar } from '../../../ui/ui';\nimport TeamAvatar from './team-avatar';\nimport { CheckIcon } from '../../../ui/icons';\nimport { connect } from 'react-redux';\nimport { challengeTeams } from 'common';\n\nconst PointsIcon = ({ className }: { className: string }) => (\n  <div className={`star-points ${className}`} />\n);\nconst FetchRow = (props: React.HTMLProps<HTMLButtonElement>) => (\n  <li className=\"more\">\n    <button {...(props as any)}>\n      <div>...</div>\n    </button>\n  </li>\n);\n\nconst FETCH_SIZE = 5;\nconst locale = 'en';\n\ninterface PropsFromState {\n  api: API;\n  user: User.State;\n}\n\ninterface Props extends PropsFromState {\n  ref: { current: any };\n  service: string;\n  team?: boolean;\n  type?: 'clip' | 'vote';\n  week?: number;\n  challengeComplete?: boolean;\n}\n\ninterface State {\n  rows: { position: number; [key: string]: any }[];\n  isAtEnd: boolean;\n}\n\nclass ChallengeList extends React.Component<Props, State> {\n  state: State = {\n    rows: [],\n    isAtEnd: false,\n  };\n  scroller: { current: HTMLUListElement | null } = React.createRef();\n  youRow: { current: HTMLLIElement | null } = React.createRef();\n\n  updateScrollIndicator = () => {\n    const SIZE = 32;\n    const el = this.scroller.current;\n    el.style.setProperty(\n      '--before-height',\n      Math.min(el.scrollTop, SIZE) + 'px'\n    );\n    el.style.setProperty(\n      '--after-height',\n      Math.min(el.scrollHeight - el.scrollTop - el.clientHeight, SIZE) + 'px'\n    );\n  };\n\n  callService = (cursor?: [number, number]) => {\n    const { service, api, type } = this.props;\n    switch (service) {\n      case 'team-progress':\n        api.fetchTopMembers(locale, type, cursor).then(member => {\n          this.setState(\n            ({ rows }) => {\n              const allRows = [...rows, ...member];\n              return {\n                rows: allRows,\n                isAtEnd: member.length == 0,\n              };\n            },\n            () => {\n              this.updateScrollIndicator();\n            }\n          );\n        });\n        break;\n      case 'top-teams':\n        api.fetchTopTeams(locale, cursor).then(data => {\n          this.setState(\n            ({ rows }) => {\n              const allRows = [...rows, ...data];\n              return {\n                rows: allRows,\n                isAtEnd: data.length == 0,\n              };\n            },\n            () => {\n              this.updateScrollIndicator();\n            }\n          );\n        });\n        break;\n      case 'top-contributors':\n        api.fetchTopContributors(locale, type, cursor).then(data => {\n          this.setState(\n            ({ rows }) => {\n              const allRows = [...rows, ...data];\n              return {\n                rows: allRows,\n                isAtEnd: data.length == 0,\n              };\n            },\n            () => {\n              this.updateScrollIndicator();\n            }\n          );\n        });\n\n        break;\n    }\n  };\n  componentDidMount() {\n    this.callService();\n  }\n\n  fetchMore = (cursor: [number, number]) => {\n    this.callService(cursor);\n  };\n\n  scrollToUser = () => {\n    const row = this.youRow.current;\n    if (!row) return;\n\n    this.scroller.current.scrollTop =\n      row.offsetTop - this.scroller.current.offsetTop;\n    this.updateScrollIndicator();\n  };\n\n  transformRankingToString = (ranking: number) => {\n    switch (ranking) {\n      case 1:\n        return '1st';\n      case 2:\n        return '2nd';\n      case 3:\n        return '3rd';\n      default:\n        return String(ranking) + 'th';\n    }\n  };\n\n  render() {\n    const { rows, isAtEnd } = this.state;\n    const { user, team, week, challengeComplete } = this.props;\n    // TODO: Render <Fetchrow>s outside of `items` to flatten the list.\n\n    const items = rows.map((row, i) => {\n      const prevPosition = i > 0 ? rows[i - 1].position : null;\n      const nextPosition =\n        i < rows.length - 1 ? rows[i + 1].position : isAtEnd ? 0 : Infinity;\n      const isYou =\n        row.name ===\n        (team ? user.account.enrollment.team : user.account.username);\n      return [\n        !!prevPosition && prevPosition + 1 < row.position && (\n          <FetchRow\n            key={row.position + 'prev'}\n            onClick={() =>\n              this.fetchMore([\n                Math.max(prevPosition + 1, row.position - FETCH_SIZE),\n                row.position,\n              ])\n            }\n          />\n        ),\n        team ? (\n          <li\n            key={row.position}\n            className={`row team${isYou ? ' you' : ''}`}\n            ref={isYou ? this.youRow : null}>\n            <div className=\"ranking\">\n              <div className=\"position\">\n                {row.position + 1 < 10 && '0'}\n                {row.position + 1}\n              </div>\n              <div className=\"avatar-container\">\n                <TeamAvatar team={row.name.toLowerCase()} />\n              </div>\n              <div className=\"username\" title={row.name}>\n                {row.name || '???'}\n              </div>\n            </div>\n            <div className=\"week\" title=\"Week\">\n              {row.w1_points && week > 0 ? (\n                <>\n                  <PointsIcon\n                    className={row.w1 <= 3 ? `star-points-${row.w1}` : ''}\n                  />\n                  {this.transformRankingToString(row.w1)}\n                </>\n              ) : (\n                '--'\n              )}\n            </div>\n            <div className=\"week\" title=\"Week\">\n              {row.w2_points && week > 1 ? (\n                <>\n                  <PointsIcon\n                    className={row.w2 <= 3 ? `star-points-${row.w2}` : ''}\n                  />\n                  {this.transformRankingToString(row.w2)}\n                </>\n              ) : (\n                '--'\n              )}\n            </div>\n            <div className=\"week\" title=\"Week\">\n              {row.w3_points && (week > 2 || challengeComplete) ? (\n                <>\n                  <PointsIcon\n                    className={row.w3 <= 3 ? `star-points-${row.w3}` : ''}\n                  />\n                  {this.transformRankingToString(row.w3)}\n                </>\n              ) : (\n                '--'\n              )}\n            </div>\n            <div className=\"total\">{row.w3_points || 'N/A'}</div>\n          </li>\n        ) : (\n          <li\n            key={row.position}\n            className={`row${isYou ? ' you' : ''}`}\n            ref={isYou ? this.youRow : null}>\n            <div className=\"ranking\">\n              <div className=\"position\">\n                {row.position + 1 < 10 && '0'}\n                {row.position + 1}\n              </div>\n              <div className=\"avatar-container\">\n                <Avatar url={row.avatar_url} />\n              </div>\n              <div className=\"username\" title={row.name}>\n                {row.name || '???'}\n              </div>\n            </div>\n            <div className=\"point\" title={row.points}>\n              <PointsIcon\n                className={\n                  row.position < 3 ? `star-points-${row.position + 1}` : ''\n                }\n              />\n              {row.points}\n            </div>\n            <div className=\"approved\" title={row.approved}>\n              <CheckIcon />\n              {row.approved}\n            </div>\n            <div className=\"accuracy\">{row.accuracy || 'N/A'} %</div>\n          </li>\n        ),\n        !!nextPosition &&\n          nextPosition - 1 > row.position &&\n          nextPosition - FETCH_SIZE > row.position && (\n            <FetchRow\n              key={row.position + 'next'}\n              onClick={() =>\n                this.fetchMore([\n                  row.position + 1,\n                  Math.min(row.position + 1 + FETCH_SIZE, nextPosition - 1),\n                ])\n              }\n            />\n          ),\n      ];\n    });\n    // [TODO]: This should be a <table>.\n    return (\n      <ul\n        className=\"leaderboard\"\n        ref={this.scroller}\n        onScroll={this.updateScrollIndicator}>\n        <li className=\"header\" key=\"header\">\n          {team ? (\n            <>\n              <span className=\"ranking\">Ranking & Name</span>\n              <span className=\"week\">W1</span>\n              <span className=\"week\">W2</span>\n              <span className=\"week\">W3</span>\n              <span className=\"total\">Total Points</span>\n            </>\n          ) : (\n            <>\n              <span className=\"ranking\">Ranking & Name</span>\n              <span className=\"point\">Points</span>\n              <span className=\"approved\">Approved</span>\n              <span className=\"accuracy\">Accuracy</span>\n            </>\n          )}\n        </li>\n        {items}\n      </ul>\n    );\n  }\n}\nexport default connect<PropsFromState>(\n  ({ api, user }: StateTree) => ({\n    api,\n    user,\n  }),\n  null,\n  null,\n  { forwardRef: true }\n)(ChallengeList);\n","import * as React from 'react';\nimport { useRef, useState } from 'react';\nimport { useAccount } from '../../../../hooks/store-hooks';\n\nimport {\n  BookmarkIcon,\n  CheckIcon,\n  EyeIcon,\n  EyeOffIcon,\n  InfoIcon,\n} from '../../../ui/icons';\n\nimport StatsCard from '../stats/stats-card';\nimport ChallengeList from './challenge-list';\n\nconst Percentage = () => <div className=\"percent\">%</div>;\nconst FilledCheckIcon = () => (\n  <div className=\"filled-check\">\n    <CheckIcon />\n  </div>\n);\nconst PointsIcon = () => <div className=\"star-points\" />;\n\nexport default function LeaderboardCard({\n  title,\n  showVisibleIcon,\n  showOverlay,\n  service,\n  team,\n}: {\n  title: string;\n  showVisibleIcon?: boolean;\n  showOverlay?: (event: React.MouseEvent<HTMLInputElement>) => void;\n  service: 'top-teams' | 'team-progress' | 'top-contributors';\n  team?: boolean;\n}) {\n  const account = useAccount();\n\n  const [showInfo, setShowInfo] = useState(false);\n\n  const leaderboardRef = useRef(null);\n  return (\n    <StatsCard\n      key=\"leaderboard\"\n      className=\"leaderboard-card\"\n      title={title}\n      challenge={true}\n      iconButtons={\n        <div className=\"icon-buttons\">\n          {Boolean(account.visible) && (\n            <>\n              <button\n                type=\"button\"\n                onClick={() => {\n                  leaderboardRef.current.scrollToUser();\n                }}>\n                <BookmarkIcon /> <span className=\"text\">Show my ranking</span>\n              </button>\n\n              <div className=\"icon-divider\" />\n            </>\n          )}\n          {showVisibleIcon && (\n            <>\n              <button type=\"button\" onClick={showOverlay}>\n                {account.visible ? <EyeIcon /> : <EyeOffIcon />}\n                <span className=\"text\">Set my visibility</span>\n              </button>\n              <div className=\"icon-divider\" />\n            </>\n          )}\n          <div\n            className=\"leaderboard-info\"\n            onMouseEnter={() => setShowInfo(true)}\n            onMouseLeave={() => setShowInfo(false)}>\n            {showInfo && (\n              <div className=\"info-menu\">\n                <ul>\n                  {[\n                    { Icon: PointsIcon, label: 'Points' },\n                    { Icon: FilledCheckIcon, label: 'Total Approved' },\n                    { Icon: Percentage, label: 'Overall Accuracy' },\n                  ].map(({ Icon, label }) => (\n                    <li key={label}>\n                      <div className=\"info-icon\">\n                        <Icon />\n                      </div>{' '}\n                      <span>{label}</span>\n                    </li>\n                  ))}\n                </ul>\n                <div style={{ height: 10 }}>\n                  <div className=\"triangle\" />\n                </div>\n              </div>\n            )}\n            <button\n              className={showInfo ? 'active' : ''}\n              style={{ display: 'flex' }}\n              onClick={() => setShowInfo(!showInfo)}\n              type=\"button\">\n              <InfoIcon />\n            </button>\n          </div>\n        </div>\n      }\n      tabs={{\n        recorded: () => (\n          <ChallengeList\n            key=\"recorded-list\"\n            type=\"clip\"\n            service={service}\n            ref={leaderboardRef}\n          />\n        ),\n        validated: () => (\n          <ChallengeList\n            key=\"validated-list\"\n            type=\"vote\"\n            service={service}\n            ref={leaderboardRef}\n          />\n        ),\n      }}\n    />\n  );\n}\n","import * as React from 'react';\nimport { useRef, useState } from 'react';\nimport { useAccount } from '../../../../hooks/store-hooks';\n\nimport {\n  BookmarkIcon,\n  CheckIcon,\n  EyeIcon,\n  EyeOffIcon,\n  InfoIcon,\n} from '../../../ui/icons';\n\nimport ChallengeList from './challenge-list';\n\nconst Percentage = () => <div className=\"percent\">%</div>;\nconst FilledCheckIcon = () => (\n  <div className=\"filled-check\">\n    <CheckIcon />\n  </div>\n);\nconst PointsIcon = () => <div className=\"star-points\" />;\n\nexport default function TeamboardCard({\n  title,\n  showVisibleIcon,\n  showOverlay,\n  week,\n  challengeComplete,\n}: {\n  title: string;\n  showVisibleIcon?: boolean;\n  showOverlay?: (event: React.MouseEvent<HTMLInputElement>) => void;\n  week?: number;\n  challengeComplete?: boolean;\n}) {\n  const account = useAccount();\n\n  const [showInfo, setShowInfo] = useState(false);\n\n  const teamboardRef = useRef(null);\n  return (\n    <div className=\"stats-card leaderboard-card\">\n      <div className=\"stats-card__inner\">\n        <div className=\"title-and-icon\">\n          <h2 className=\"challenge-title\">{title}</h2>\n          <div className=\"icon-buttons\">\n            {Boolean(account.visible) && (\n              <>\n                <button\n                  type=\"button\"\n                  onClick={() => {\n                    teamboardRef.current.scrollToUser();\n                  }}>\n                  <BookmarkIcon /> <span className=\"text\">Show my ranking</span>\n                </button>\n\n                <div className=\"icon-divider\" />\n              </>\n            )}\n            {showVisibleIcon && (\n              <>\n                <button type=\"button\" onClick={showOverlay}>\n                  {account.visible ? <EyeIcon /> : <EyeOffIcon />}\n                  <span className=\"text\">Set my visibility</span>\n                </button>\n                <div className=\"icon-divider\" />\n              </>\n            )}\n            <div\n              className=\"leaderboard-info\"\n              onMouseEnter={() => setShowInfo(true)}\n              onMouseLeave={() => setShowInfo(false)}>\n              {showInfo && (\n                <div className=\"info-menu\">\n                  <ul>\n                    {[\n                      { Icon: PointsIcon, label: 'Points' },\n                      { Icon: FilledCheckIcon, label: 'Total Approved' },\n                      { Icon: Percentage, label: 'Overall Accuracy' },\n                    ].map(({ Icon, label }) => (\n                      <li key={label}>\n                        <div className=\"info-icon\">\n                          <Icon />\n                        </div>{' '}\n                        <span>{label}</span>\n                      </li>\n                    ))}\n                  </ul>\n                  <div style={{ height: 10 }}>\n                    <div className=\"triangle\" />\n                  </div>\n                </div>\n              )}\n              <button\n                className={showInfo ? 'active' : ''}\n                style={{ display: 'flex' }}\n                onClick={() => setShowInfo(!showInfo)}\n                type=\"button\">\n                <InfoIcon />\n              </button>\n            </div>\n          </div>\n        </div>\n        <div className=\"filters\" style={{ justifyContent: 'flex-end' }}>\n          <span className=\"english-only\">English Only</span>\n        </div>\n        <div className=\"content\">\n          <ChallengeList\n            key=\"team-list\"\n            service=\"top-teams\"\n            ref={teamboardRef}\n            team\n            challengeComplete={challengeComplete}\n            week={week}\n          />\n        </div>\n      </div>\n    </div>\n  );\n}\n","import * as React from 'react';\nimport { useEffect } from 'react';\nimport { RouteComponentProps, withRouter } from 'react-router';\nimport { LocaleLink } from '../../../locale-helpers';\nimport { ChallengeDuration } from 'common';\nimport { isBeforeChallenge } from './constants';\nimport { LinkButton } from '../../../ui/ui';\nimport URLS from '../../../../urls';\nimport { Notifications } from '../../../../stores/notifications';\nimport { useAction } from '../../../../hooks/store-hooks';\nimport './challenge-offline.css';\n\nfunction ChallengeOffline({\n  duration,\n  location,\n}: { duration: ChallengeDuration } & RouteComponentProps<any, any, any>) {\n  const addAchievement = useAction(Notifications.actions.addAchievement);\n  const dateFormat = { year: 'numeric', month: 'short', day: 'numeric' };\n\n  useEffect(() => {\n    if (isBeforeChallenge && location.state?.earlyEnroll) {\n      addAchievement(\n        50,\n        'Bonus! You signed up in time for some extra points.',\n        'success'\n      );\n    }\n  }, []);\n\n  return isBeforeChallenge(duration) ? (\n    <div className=\"challenge-blank-state pre-challenge\">\n      <div className=\"challenge-cta\">\n        <h1 className=\"challenge-header\">\n          The Open Voice Challenge will start on{' '}\n          {duration.start.toLocaleString('en-US', dateFormat)}\n        </h1>\n        <div>\n          <LocaleLink className=\"speak-btn\" to={URLS.SPEAK}>\n            Speak\n            <span className=\"speak-icon\"></span>\n          </LocaleLink>\n          <LocaleLink className=\"listen-btn\" to={URLS.LISTEN}>\n            Listen\n            <span className=\"listen-icon\"></span>\n          </LocaleLink>\n        </div>\n        <p className=\"challenge-alt\">\n          In the mean time you can still contribute to Common Voice\n        </p>\n      </div>\n    </div>\n  ) : (\n    <div className=\"challenge-blank-state post-challenge\">\n      <div className=\"challenge-cta\">\n        <h1 className=\"challenge-header\">\n          While you wait for the next one, create a custom goal!\n        </h1>\n        <LinkButton className=\"custom-goal-button\" rounded to={URLS.GOALS}>\n          Create a custom goal\n        </LinkButton>\n      </div>\n    </div>\n  );\n}\n\nexport default withRouter(ChallengeOffline);\n","import * as React from 'react';\nimport { useEffect, useState } from 'react';\nimport { Button } from '../ui/ui';\nimport { PlayOutlineGreenIcon, MicIcon, SkipIcon } from '../ui/icons';\nimport Modal from '../modal/modal';\nimport URLS from '../../urls';\nimport { LocaleLink } from '../locale-helpers';\nimport { trackChallenge } from '../../services/tracker';\nimport './onboarding-modal.css';\n\ninterface Step {\n  title: string;\n  alt?: string;\n  img?: string;\n}\ninterface Props {\n  onRequestClose: () => void;\n}\n\ntype StepType = Step;\n\nconst STEPS: Array<StepType> = [\n  {\n    title: 'Track your team and indvidual progress on the challenge dashboard',\n    img: require('./images/dashboard.png'),\n    alt: 'dashboard',\n  },\n  {\n    title: 'Invite friends and colleagues to join your challenge team',\n    img: require('./images/invite.jpg'),\n    alt: 'invite',\n  },\n  {\n    title:\n      'Earn points by contributing your voice and validating recorded clips',\n    img: require('./images/contribute.png'),\n    alt: 'contribute',\n  },\n  {\n    title: 'Ready to get started?',\n  },\n];\nconst OperationButtons = () => {\n  return (\n    <div className=\"operation-buttons\">\n      <div className=\"speak-btn\">\n        <LocaleLink to={URLS.SPEAK}>\n          Speak\n          <MicIcon />\n        </LocaleLink>\n      </div>\n      <div className=\"listen-btn\">\n        <LocaleLink to={URLS.LISTEN}>\n          Listen\n          <PlayOutlineGreenIcon />\n        </LocaleLink>\n      </div>\n    </div>\n  );\n};\nconst OnboardingModal = ({ onRequestClose }: Props) => {\n  let [step, setStep] = useState<number>(0);\n  const stepData = STEPS[step];\n  const isLastStep = step === STEPS.length - 1;\n  useEffect(() => trackChallenge('modal-onboarding'), []);\n\n  return (\n    <Modal innerClassName=\"onboarding-modal\" onRequestClose={onRequestClose}>\n      <div className=\"step-container\">\n        {++step} of {STEPS.length}\n      </div>\n      <p className=\"onboarding-modal-title\">{stepData.title}</p>\n      {isLastStep ? (\n        <div className=\"wave\">\n          <img src={require('./images/1-red-copy.svg')} className=\"red-copy\" />\n        </div>\n      ) : (\n        <div className=\"image-container\">\n          <img src={stepData.img} alt={stepData.alt} />\n        </div>\n      )}\n      {isLastStep ? (\n        <OperationButtons />\n      ) : (\n        <div className=\"onboarding-buttons\">\n          <Button\n            rounded\n            outline\n            onClick={() => {\n              setStep(prevStep => prevStep + 1);\n            }}>\n            Next\n            <SkipIcon />\n          </Button>\n        </div>\n      )}\n    </Modal>\n  );\n};\nexport default OnboardingModal;\n","import * as React from 'react';\nimport { useState, useEffect, useRef } from 'react';\nimport { Redirect, RouteComponentProps, withRouter } from 'react-router';\nimport { challengeTeams } from 'common';\nimport WeeklyChallenge from './weekly-challenge';\nimport LeaderBoardCard from './leaderboard-card';\nimport TeamBoardCard from './team-card';\nimport ChallengeOffline from './challenge-offline';\nimport URLS from '../../../../urls';\nimport { LocaleLink } from '../../../locale-helpers';\nimport { useAccount, useAction, useAPI } from '../../../../hooks/store-hooks';\nimport { User } from '../../../../stores/user';\nimport { CrossIcon, InfoIcon } from '../../../ui/icons';\nimport { LabeledCheckbox } from '../../../ui/ui';\nimport { Notifications } from '../../../../stores/notifications';\nimport { trackChallenge } from '../../../../services/tracker';\nimport OnboardingModal from '../../../onboarding-modal/onboarding-modal';\nimport { isChallengeLive, pilotDates } from './constants';\nimport Props from '../props';\nimport './challenge.css';\n\nconst Overlay = ({ hideOverlay }: { hideOverlay?: () => void }) => {\n  const account = useAccount();\n  const saveAccount = useAction(User.actions.saveAccount);\n  const [radio, setVisibleRadio] = useState(account.visible);\n  const visibleForTeam = useRef(null);\n  const visibleForAll = useRef(null);\n  const VISIBLE_FOR_TEAM = 2;\n  const VISIBLE_FOR_ALL = 1;\n  return (\n    <div className=\"leaderboard-overlay\">\n      <button className=\"close-overlay\" type=\"button\" onClick={hideOverlay}>\n        <CrossIcon />\n      </button>\n      <h2>Leaderboard Visibility</h2>\n      <div className=\"toggle-input\">\n        <input\n          type=\"checkbox\"\n          defaultChecked={Boolean(account.visible)}\n          onChange={(event: any) => {\n            setVisibleRadio(event.target.checked);\n            if (!event.target.checked) {\n              saveAccount({ visible: 0 });\n            }\n          }}\n        />\n        <div>Hidden</div>\n        <div>Visible</div>\n      </div>\n      {Boolean(radio) && (\n        <div className=\"visible-btns\">\n          <LabeledCheckbox\n            label=\"Visible for all\"\n            defaultChecked={account.visible === VISIBLE_FOR_ALL}\n            ref={visibleForAll}\n            onChange={(event: any) => {\n              if (event.target.checked) {\n                saveAccount({ visible: VISIBLE_FOR_ALL });\n                visibleForTeam.current.checked = false;\n              }\n            }}\n          />\n          <LabeledCheckbox\n            label=\"Visible for team only\"\n            defaultChecked={account.visible === VISIBLE_FOR_TEAM}\n            ref={visibleForTeam}\n            onChange={(event: any) => {\n              if (event.target.checked) {\n                saveAccount({ visible: VISIBLE_FOR_TEAM });\n                visibleForAll.current.checked = false;\n              }\n            }}\n          />\n        </div>\n      )}\n      <p className=\"explainer\">\n        This setting controls your leaderboard visibility. When hidden, your\n        progress will be private. This means your image, user name and progress\n        will not appear on the leaderboard.\n      </p>\n      <div className=\"info\">\n        <InfoIcon />\n        <p className=\"note\">\n          Note: When set to 'Visible', this setting can be changed from the{' '}\n          <LocaleLink to={URLS.PROFILE_INFO}>Profile page</LocaleLink>\n        </p>\n      </div>\n    </div>\n  );\n};\n\nfunction ChallengePage(props: Props & RouteComponentProps<any, any, any>) {\n  const [showOverlay, setShowOverlay] = useState(false);\n  // [TODO]: Hook this up to the DB so we only see it once.\n  const addAchievement = useAction(Notifications.actions.addAchievement);\n  const [showOnboardingModal, setShowOnboardingModal] = useState(\n    props.location.state?.showOnboardingModal\n  );\n  const [weekly, setWeekly] = useState(null);\n  const account = useAccount();\n  const api = useAPI();\n  useEffect(() => {\n    api.fetchWeeklyProgress().then(value => value && setWeekly(value));\n  }, []);\n  useEffect(() => trackChallenge('dashboard-view'), []);\n\n  const isEnrolled = account?.enrollment?.team && account.enrollment.challenge;\n\n  return !isEnrolled ? (\n    <Redirect to={URLS.DASHBOARD} /> // TODO: it shouldn't even try to fetch any challenge data in useEffect if not enrolled\n  ) : isChallengeLive(pilotDates) ? (\n    <div className=\"challenge challenge-container\">\n      {showOnboardingModal && (\n        <OnboardingModal\n          onRequestClose={() => {\n            setShowOnboardingModal(false);\n            if (props.location.state?.earlyEnroll) {\n              addAchievement(\n                50,\n                'Bonus! You signed up in time for some extra points.'\n              );\n            }\n          }}\n        />\n      )}\n      {weekly && <WeeklyChallenge weekly={weekly} />}\n      {account?.enrollment && (\n        <div className={`range-container ${showOverlay ? 'has-overlay' : ''}`}>\n          {showOverlay && <Overlay hideOverlay={() => setShowOverlay(false)} />}\n          <div className=\"leader-board\">\n            <LeaderBoardCard\n              title={`${\n                challengeTeams[account.enrollment.team].readableName\n              } Team Progress`}\n              showVisibleIcon\n              showOverlay={() => setShowOverlay(true)}\n              service=\"team-progress\"\n            />\n          </div>\n          <div className=\"leader-board\">\n            {weekly && (\n              <TeamBoardCard\n                title=\"Overall Challenge Top Team\"\n                week={weekly.week}\n                challengeComplete={weekly.challengeComplete}\n              />\n            )}\n          </div>\n          <div className=\"leader-board\">\n            <LeaderBoardCard\n              title=\"Overall Challenge Top Contributors\"\n              showVisibleIcon\n              showOverlay={() => {\n                setShowOverlay(true);\n                window.scrollTo({\n                  top: 0,\n                  behavior: 'smooth',\n                });\n              }}\n              service=\"top-contributors\"\n            />\n          </div>\n        </div>\n      )}\n    </div>\n  ) : (\n    <ChallengeOffline duration={pilotDates} />\n  );\n}\n\nexport default withRouter(ChallengePage);\n","/**\n * NOTE: Want to add a mailto form to this component? Start here:\n *       https://github.com/mozilla/common-voice/pull/2440\n */\nimport * as React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport BalanceText from 'react-balance-text';\nimport Modal, { ModalProps } from '../modal/modal';\nimport { FontIcon } from '../ui/icons';\nimport { Button } from '../ui/ui';\nimport { useAPI } from '../../hooks/store-hooks';\nimport { trackChallenge } from '../../services/tracker';\nimport { Enrollment } from 'common';\n\nimport './invite-modal.css';\n\nexport interface InviteModalProps extends ModalProps {\n  enrollment: Enrollment;\n}\n\nexport default ({\n  enrollment: { challenge, team, invite },\n  ...props\n}: InviteModalProps) => {\n  const [copiedRecently, setCopiedRecently] = useState<boolean>(false);\n  const inputRef = useRef();\n  const api = useAPI();\n  // Reset the button's copied state after a brief timeout.\n  useEffect(() => {\n    if (copiedRecently) {\n      const timer = setTimeout(() => {\n        setCopiedRecently(false);\n      }, 2000);\n      // To check whether or not it is the first invite.\n      api\n        .fetchInviteStatus()\n        .then(\n          ({\n            showInviteSendToast = false,\n            hasEarnedSessionToast = false,\n            challengeEnded = true,\n          }) => {\n            sessionStorage.setItem(\n              'showInviteSendToast',\n              JSON.stringify(showInviteSendToast)\n            );\n            sessionStorage.setItem(\n              'hasEarnedSessionToast',\n              JSON.stringify(hasEarnedSessionToast)\n            );\n            sessionStorage.setItem(\n              'challengeEnded',\n              JSON.stringify(challengeEnded)\n            );\n          }\n        );\n      sessionStorage.setItem('hasShared', 'true');\n\n      return () => clearTimeout(timer);\n    }\n  }, [copiedRecently]);\n  useEffect(() => trackChallenge('modal-invite'), []);\n\n  return (\n    <Modal {...props} innerClassName=\"invite-modal\">\n      <img alt=\"\" src={require('./images/mail.svg')} role=\"presentation\" />\n\n      <h1>\n        <BalanceText>\n          Invite colleagues and friends to join your challenge team\n        </BalanceText>\n      </h1>\n\n      <input\n        readOnly\n        ref={inputRef}\n        type=\"text\"\n        value={`${window.location.origin}/?challenge=${challenge}&team=${team}&invite=${invite}`}\n      />\n\n      <Button\n        rounded\n        onClick={() => {\n          if (inputRef.current) {\n            (inputRef.current as HTMLInputElement).select();\n            document.execCommand('copy');\n            setCopiedRecently(true);\n          }\n        }}>\n        {copiedRecently ? 'Copied' : 'Copy link'}\n        <FontIcon type=\"link\" className=\"icon\" />\n      </Button>\n    </Modal>\n  );\n};\n","import { Localized } from '@fluent/react';\nimport * as React from 'react';\nimport {useEffect, useLayoutEffect, useState} from 'react';\nimport { Redirect, Route, Switch } from 'react-router';\nimport { useAccount, useAPI, useAction } from '../../../hooks/store-hooks';\nimport { useRouter } from '../../../hooks/use-router';\nimport URLS from '../../../urls';\nimport { ALL_LOCALES } from '../../language-select/language-select';\nimport {\n  isContributable,\n  LocaleNavLink,\n  useLocale,\n} from '../../locale-helpers';\nimport { Notifications } from '../../../stores/notifications';\nimport StatsPage from './stats/stats';\nimport GoalsPage from './goals/goals';\nimport AwardsPage from './awards/awards';\nimport ChallengePage from './challenge/challenge';\nimport { Button } from '../../ui/ui';\nimport InviteModal from '../../invite-modal/invite-modal';\nimport { isChallengeLive, pilotDates, isEnrolled } from './challenge/constants';\nimport './dashboard.css';\nimport { NATIVE_NAMES } from '../../../services/localization';\n\nconst TITLE_BAR_LOCALE_COUNT = 3;\n\nconst TopBar = ({\n  dashboardLocale,\n  setShowInviteModal,\n}: {\n  dashboardLocale: string;\n  setShowInviteModal(arg: any): void;\n}) => {\n  const { history, location } = useRouter();\n  const [, toLocaleRoute] = useLocale();\n  const account = useAccount();\n  const [isAboveMdWidth, setIsAboveMdWidth] = useState(true);\n  const isChallengeEnrolled = isEnrolled(account);\n  const isChallengeTabSelected =\n    location.pathname.endsWith('/challenge') && isChallengeEnrolled;\n\n  function setLocale(value: string) {\n    const pathParts = location.pathname.split('/');\n    history.push(\n      [toLocaleRoute(URLS.DASHBOARD), value, pathParts[pathParts.length - 1]]\n        .filter(Boolean)\n        .join('/')\n    );\n  }\n\n  const unseenAwards = account\n    ? account.awards.filter(a => !a.seen_at).length\n    : 0;\n\n  const locales = [''].concat(\n    (account ? account.locales : [])\n      .map(({ locale }) => locale)\n      .filter(l => isContributable(l))\n  );\n  const titleBarLocales = isAboveMdWidth\n    ? locales.slice(0, TITLE_BAR_LOCALE_COUNT)\n    : [];\n  const dropdownLocales = isAboveMdWidth\n    ? locales.slice(TITLE_BAR_LOCALE_COUNT)\n    : locales;\n\n  useEffect(() => {\n    const checkSize = () => {\n      const { innerWidth } = window;\n      setIsAboveMdWidth(innerWidth >= 768);\n    };\n    checkSize();\n    window.addEventListener('resize', checkSize);\n\n    return () => {\n      window.removeEventListener('resize', checkSize);\n    };\n  }, [isChallengeTabSelected]);\n\n  return (\n    <div className={`top-bar${isChallengeEnrolled ? ' with-challenge' : ''}`}>\n      <div className=\"underlined\">\n        <nav>\n          {isChallengeEnrolled && (\n            <LocaleNavLink\n              key={URLS.CHALLENGE}\n              to={\n                URLS.DASHBOARD +\n                (dashboardLocale ? '/' + dashboardLocale : '') +\n                URLS.CHALLENGE\n              }>\n              <h2>Challenge</h2>\n            </LocaleNavLink>\n          )}\n          {[\n            ['stats', URLS.STATS],\n            ['goals', URLS.GOALS],\n          ].map(([label, path]) => (\n            <LocaleNavLink\n              key={path}\n              to={\n                URLS.DASHBOARD +\n                (dashboardLocale ? '/' + dashboardLocale : '') +\n                path\n              }>\n              <Localized id={label}>\n                <h2 />\n              </Localized>\n            </LocaleNavLink>\n          ))}\n          <LocaleNavLink\n            to={\n              URLS.DASHBOARD +\n              (dashboardLocale ? '/' + dashboardLocale : '') +\n              URLS.AWARDS\n            }>\n            <h2>\n              <Localized id=\"awards\">\n                <span />\n              </Localized>{' '}\n              {unseenAwards > 0 && (\n                <span className=\"badge\">\n                  {unseenAwards > 9 ? '9+' : unseenAwards}\n                </span>\n              )}\n            </h2>\n          </LocaleNavLink>\n        </nav>\n        {isChallengeTabSelected ? (\n          <div className=\"language challenge-language\">\n            <span>Language:</span>\n            <span className=\"language-text\">English</span>\n          </div>\n        ) : (\n          <div className=\"languages\">\n            <span>\n              <Localized id=\"your-languages\">\n                <span />\n              </Localized>\n              :\n            </span>\n            {titleBarLocales.map(l => (\n              <label key={l}>\n                <input\n                  type=\"radio\"\n                  name=\"language\"\n                  checked={l == dashboardLocale}\n                  onChange={() => setLocale(l)}\n                />\n                {l ? (\n                  <span>{NATIVE_NAMES[l]}</span>\n                ) : (\n                  <Localized id={ALL_LOCALES}>\n                    <span />\n                  </Localized>\n                )}\n              </label>\n            ))}\n            {dropdownLocales.length > 0 && (\n              <select\n                className={\n                  dropdownLocales.includes(dashboardLocale) ? 'selected' : ''\n                }\n                name=\"language\"\n                value={dashboardLocale}\n                onChange={({ target: { value } }) => {\n                  if (value) {\n                    setLocale(value);\n                  }\n                }}>\n                {titleBarLocales.length > 0 && <option value=\"\" />}\n                {dropdownLocales.map(l =>\n                  l ? (\n                    <option key={l} value={l}>\n                      {NATIVE_NAMES[l]}\n                    </option>\n                  ) : (\n                    <Localized key={ALL_LOCALES} id={l ? l : ALL_LOCALES}>\n                      <option value={l ? l : ALL_LOCALES} />\n                    </Localized>\n                  )\n                )}\n              </select>\n            )}\n          </div>\n        )}\n      </div>\n      {isChallengeTabSelected && (\n        <ChallengeBar setShowInviteModal={setShowInviteModal} />\n      )}\n    </div>\n  );\n};\n\nfunction DashboardContent({\n  Page,\n  dashboardLocale,\n}: {\n  Page:\n    | typeof ChallengePage\n    | typeof StatsPage\n    | typeof GoalsPage\n    | typeof AwardsPage;\n  dashboardLocale: string;\n}) {\n  const api = useAPI();\n  const [allGoals, setAllGoals] = useState(null);\n\n  useEffect(() => {\n    api.fetchGoals(dashboardLocale || null).then(setAllGoals);\n  }, [dashboardLocale]);\n\n  return <Page {...{ allGoals, dashboardLocale }} />;\n}\n\ninterface ChallengeBarProps {\n  setShowInviteModal(arg: any): void;\n}\nconst ChallengeBar = ({ setShowInviteModal }: ChallengeBarProps) => {\n  const api = useAPI();\n  const [points, setAllPoints] = useState({ user: 0, team: 0 });\n\n  useEffect(() => {\n    api.fetchChallengePoints().then(value => value && setAllPoints(value));\n    // TODO: investigate how this interacts with asynchronous user loading\n  }, []);\n  return (\n    <div className=\"challenge-bar\">\n      {isChallengeLive(pilotDates) && (\n        <div className=\"points\">\n          <img src={require('./awards/star.svg')} alt=\"score\" />\n          <span className=\"score\">{points.user}</span>\n          <span className=\"label label-my\">My points</span>\n        </div>\n      )}\n\n      <Button\n        rounded\n        className=\"invite-btn\"\n        onClick={() => setShowInviteModal(true)}>\n        <span className=\"content\">Invite</span>\n        <span className=\"plus-icon\"></span>\n      </Button>\n    </div>\n  );\n};\n\nexport default function Dashboard() {\n  const { match } = useRouter();\n  const account = useAccount();\n  const api = useAPI();\n  const [, toLocaleRoute] = useLocale();\n  const [showInviteModal, setShowInviteModal] = useState<boolean>(false);\n  const addAchievement = useAction(Notifications.actions.addAchievement);\n  const isChallengeEnrolled = isEnrolled(account);\n  const pages = [\n    { subPath: URLS.STATS, Page: StatsPage },\n    { subPath: URLS.GOALS, Page: GoalsPage },\n    { subPath: URLS.AWARDS, Page: AwardsPage },\n  ];\n  let defaultPage = URLS.STATS;\n  if (isChallengeEnrolled) {\n    // @ts-ignore\n    pages.unshift({ subPath: URLS.CHALLENGE, Page: ChallengePage });\n    if (isChallengeLive(pilotDates)) {\n      defaultPage = URLS.CHALLENGE;\n    }\n  }\n\n  useLayoutEffect(() => {\n    if (!account) {\n      sessionStorage.setItem('redirectURL', location.pathname);\n      window.location.href = '/login';\n    }\n  }, []);\n\n  return (\n    <div\n      className={\n        'dashboard' + isChallengeEnrolled\n          ? ' ' + isChallengeLive(pilotDates)\n            ? 'challenge-online'\n            : 'challenge-offline'\n          : ''\n      }>\n      {showInviteModal && (\n        <InviteModal\n          enrollment={account.enrollment}\n          onRequestClose={() => {\n            setShowInviteModal(false);\n            if (JSON.parse(sessionStorage.getItem('showInviteSendToast'))) {\n              addAchievement(50, 'You sent your first invite!');\n              sessionStorage.removeItem('showInviteSendToast');\n            }\n            if (\n              !JSON.parse(sessionStorage.getItem('challengeEnded')) &&\n              !JSON.parse(sessionStorage.getItem('hasEarnedSessionToast')) &&\n              JSON.parse(sessionStorage.getItem('hasContributed'))\n            ) {\n              addAchievement(\n                50,\n                \"You're on a roll! You sent an invite and contributed in the same session.\"\n              );\n              sessionStorage.removeItem('hasEarnedSessionToast');\n              sessionStorage.removeItem('hasContributed');\n              // Tell back-end user get unexpected achievement: invite + contribute in the same session\n              // Each user can only get once.\n              api.setInviteContributeAchievement();\n            }\n          }}\n        />\n      )}\n      <div className=\"inner\">\n        <Switch>\n          {pages.map(({ subPath, Page }) => (\n            <Route\n              key={subPath}\n              exact\n              path={match.path + subPath}\n              render={() => (\n                <>\n                  <TopBar\n                    dashboardLocale=\"\"\n                    setShowInviteModal={setShowInviteModal}\n                  />\n                  <DashboardContent dashboardLocale=\"\" {...{ Page }} />\n                </>\n              )}\n            />\n          ))}\n          <Route\n            path={match.path + '/:dashboardLocale'}\n            render={({\n              match: {\n                params: { dashboardLocale },\n              },\n            }) => (\n              <>\n                <TopBar\n                  {...{ dashboardLocale }}\n                  setShowInviteModal={setShowInviteModal}\n                />\n                <Switch>\n                  {pages.map(({ subPath, Page }) => (\n                    <Route\n                      key={subPath}\n                      exact\n                      path={match.path + '/' + dashboardLocale + subPath}\n                      render={() => (\n                        <DashboardContent {...{ dashboardLocale, Page }} />\n                      )}\n                    />\n                  ))}\n                  <Route\n                    render={() => (\n                      <Redirect\n                        to={toLocaleRoute(URLS.DASHBOARD + defaultPage)}\n                      />\n                    )}\n                  />\n                </Switch>\n              </>\n            )}\n          />\n          <Route\n            render={() => (\n              <Redirect to={toLocaleRoute(URLS.DASHBOARD + defaultPage)} />\n            )}\n          />\n        </Switch>\n      </div>\n    </div>\n  );\n}\n"],"sourceRoot":""}