{"version":3,"sources":["lib/placeholder.js","service/state/state.js","container/navigate.jsx","component/logo.jsx","constants.js","component/search/query.jsx","component/menu.jsx","component/element/spinner.jsx","component/search/results.jsx","component/header.jsx","container/header.jsx","component/footer.jsx","container/footer.jsx","lib/tracking.js","lib/storage.js","component/dialog/dialog.jsx","component/dialog/login.jsx","component/currency/dollar.jsx","component/currency/index.jsx","component/money.jsx","component/membership-option.jsx","component/dialog/lockdown.jsx","component/dialog/reset-password.jsx","component/element/busy-overlay.jsx","artifacts/300x250-viviantaylor1.jpg","container/discounts.jsx","site/thicc18/webmasters.jsx","component/card/error.jsx","artifacts/500.jpg","page/500.jsx","artifacts/404.jpg","page/404.jsx","component/slide/info.jsx","component/card/image-titled.jsx","container/cards.jsx","component/banner.jsx","page/home.jsx","page/models.jsx","component/card/image-info.jsx","page/model.jsx","page/videos.jsx","component/element/player/cloudflare.jsx","component/element/player/index.jsx","component/card/download.jsx","component/element/masonry.jsx","container/masonry.jsx","container/gallery.jsx","page/video.jsx","page/welcome.jsx","page/password-reset.jsx","page/static/usc2257.jsx","page/static/privacy.jsx","page/static/terms.jsx","page/search-results.jsx","container/app.jsx","reportWebVitals.js","service/use-observable.js","service/state/interaction.js","service/argonath/client/link-state.js","service/argonath/client/link-argonath.js","service/argonath/client/index.js","service/argonath/client/link-auth.js","service/argonath/handle-error.js","service/argonath/asset.js","service/argonath/video.js","service/argonath/text.js","service/argonath/banner.js","service/argonath/homepage-features.js","lib/promise-tree.js","service/state/mutex.js","service/state/page/videos.js","service/argonath/talent.js","service/state/page/models.js","service/state/page/home.js","service/state/page/model.js","service/state/page/video.js","service/state/page/welcome.js","service/state/page/index.js","service/argonath/package.js","service/state/biller.js","service/argonath/purchase.js","service/argonath/search.js","service/state/search.js","service/state/app.js","service/state/dimension.js","index.jsx"],"names":["placeholder","width","height","svg","encodeURIComponent","NAME_SEPARATOR","addStateValue","state","name","initialValue","value","transform","identity","isEqual","equality","startsWith","defineReadOnlyProperty","subject$","ReplaySubject","next","undefined","nameObserver","buildObserverName","nameUseObserver","key","length","toUpperCase","substr","buildUseName","set","Object","defineProperties","configurable","enumerable","get","writable","useObservable","val","transformed","addDerivedValue","immediate","from","group","combine","defaultCombine","valueEquality","assert","dependencies","every","dependency","hasDependency","hasAllDependencies","join","getOwnPropertyDescriptor","updateValue","onDependencyChange","a","performUpdate","setImmediate","then","defineProperty","Error","forEach","deepSubscribe","handlers","createState","root","values","derived","createActions","noop","toJSON","entries","processed","derivedKeys","keys","slice","hasEveryDependenncy","splice","indexOf","actions","assign","staticKeys","filter","valueKeys","actionKeys","subValues","endsWith","includes","map","fromEntries","separator","split","current","subName","obsName","subscribe","subSubscription","subSubscribe","complete","error","unsubscribe","subVal","getSubValue","isClosed","subscription","closed","Array","isArray","shift","subState","depndencies","Promise","all","object","b","Navigate","props","href","onClick","disabled","rest","event","preventDefault","page","navigate","children","Logo","className","id","src","constants","color","primary","r","g","size","massive","large","standard","medium","mobile","small","tiny","CLOSE_KEYS","SearchStyles","styled","div","SearchQuery","globalSearchKey","onChange","searching","setSearching","showResultsPage","searchInputRef","useRef","useEffect","document","body","addEventListener","onBodyKeyDown","removeEventListener","classNames","Boolean","onSubmit","query","target","elements","type","ref","onInput","onKeyDown","stopPropagation","normKey","toLowerCase","onCloseClick","setTimeout","focusSearch","xmlns","viewBox","fill","d","focus","MenuStyles","Menu","onVideosClick","onModelsClick","isLoggedIn","onJoinClick","searchShown","search","useSearchShown","menuClass","role","style","padding","StyledSpinner","Spinner","ResultStyles","SearchResults","results","useResults","isSearching","useSearching","hasResults","result","navigateLink","onItemClick","images","description","item","itemId","console","StyledHeader","header","SearchResultsBox","useQuery","notOnSearchPage","path","Header","onLogoClick","hideMenu","user","showPage","Container","List","ul","constant","Item","li","Footer","onWebmastersClick","onUsc2257Click","onPrivacyClick","onTermsClick","contactEmail","onLogoutClick","mailTo","setUser","email","$contact","fetch","api","method","credentials","TRACK_PREFIX","getData","window","localStorage","getItem","JSON","parse","message","setData","setItem","stringify","css","Styles","Dialog","onClose","flexGrow","Input","input","Button","button","ForgotPassword","Login","widgetId","useState","msg","setMsg","forcePasswordReset","setForcePasswordReset","captchaV2","resolve","grecaptcha","ready","render","callback","token","onHaveCaptchaToken","autoComplete","required","data-sitekey","data-badge","data-size","captcha","execute","action","reset","getResponse","response","getElementById","passwordEle","password","$site","headers","Accept","ok","json","code","location","pathname","Dollar","Currency","symbol","Money","Large","Small","currency","amount","MembershipOption","defaultChecked","default","previous","StyledMembershipOption","htmlFor","main","sub","InputButton","LockdownDialog","site","packages","upgrade","activate","reactivate","setError","trialCredit","video","videoId","attemptTrialCredit","attemptUpgrade","option","attemptReactivate","createDialog","formData","FormData","form","package","resp","link","ResetPasswordDialog","submitted","setSubmitted","interactionId","interaction","start","success","end","StyledOverlay","BusyOverlay","text","loading","useBusy","Title","h2","StyledDiscounts","Discounts","title","hide","isServerSide","insertDummyAd","origin","script","createElement","appendChild","removeChild","dummyAd","alt","data-adplugg-zone","StyledPage","PageWebmasters","StyledCard","CardError","info","image","$support","subject","innerWidth","innerHeight","URL","Time","Date","toISOString","navigator","userAgent","Screen","errorContext","mailLink","PageServerError","image500","PageNotFound","image404","StyledSlide","StyledPicture","picture","SlideInfo","source","Action","srcSet","landscape","x1","media","portraight","textTransform","blur","CardImageTitled","titleSize","lazy","blurTitle","StyledCards","desktopColumns","mobileColumns","Cards","childrenArray","React","Children","toArray","child","Banner","special","specialLink","BannerContainer","PlayArrow","WatchNowButton","linkStyle","OurStory","News","Column","TextContent","TitleContainer","ViewAll","PageHome","latest","useLatest","recentModels","useRecentModels","features","useFeatures","useNext","news","useNews","ourStory","useOurStory","useSpecial","useSpecialLink","models","home","homeImage","model","modelId","feature","Fragment","content","coming","dangerouslySetInnerHTML","__html","h1","PageModels","useModels","contentRef","onScroll","bounds","getBoundingClientRect","threshold","bottom","hasReachedBottom","index","isLast","CardImageInfo","entry","PageModel","useModel","modelInfo","unit","dimensions","weight","measurements","cup","waist","hips","String","videos","scale","PageVideos","useVideos","CloudflarePlayer","controls","poster","autoplay","preload","primaryColor","process","onError","reload","UnavailableStyle","LoadingStyle","VideoPlayer","userHasAccess","thumbnails","DownloadButton","CardDownload","downs","onDownloadClick","onDownloadClickDefault","downloads","useDownloads","extra","download","uri","existing","StyledDiv","Masonry","documentWidth","columns","explicitColumns","colCount","Math","min","pxValue","columnCount","colIdx","eleIdx","push","column","columnClass","cssValue","un","numberValue","parseFloat","isNaN","getComputedStyle","documentElement","fontSize","dimension","useWidth","Gallery","preLoadProcessing","preloadImages","gallery","useGallery","photoIndex","usePhotoIndex","full","preLoadImages","boundedPhotoIndex","thumb","onMouseOver","onMouseOverThumb","hidePhoto","lazyLoad","showNav","showThumbnails","showPlayButton","showFullscreenButton","items","original","onSlide","startIndex","hasPriority","unshift","Image","onload","onerror","PageVideo","useVideo","vid","setVid","controller","AbortController","signal","log","abort","modelsText","arr","modelHref","Spacer","titleStyle","textShadow","thumbs","Duration","duration","long","seconds","minutes","hours","parts","pad","durationText","PageWelcome","PagePasswordReset","pattern","urlParams","URLSearchParams","confirm","PageStaticUsc2257","PageStaticPrivacy","PageStaticTerms","PageSearchResults","HIDE_MENU","App","searchParams","when","now","setTracking","setUserState","u","removeItem","del","Content","useCurrent","biller","usePackages","$page","Page","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","observable","intialState","watch","setState","createInteractionState","running","count","busy","uuid","v4","nextTick","createStateLink","ApolloLink","operation","setContext","MODE","mode","createArgonathLink","getContext","fetchOptions","argonath","clientCache","WeakMap","authClientCache","getClient","getCached","createClient","getAuthenticatedClient","createAuthenticatedClient","cache","create","has","createBaseClient","authLink","makeRequest","links","httpLink","HttpLink","retryLink","RetryLink","delay","initial","max","attempts","retryIf","stateLink","argonathLink","isServer","InMemoryCache","resultCaching","typePolicies","Query","fields","asset","merge","talent","Asset","keyArgs","invalidationPolicies","timeToLive","renewalPolicy","types","AssetBatchSearchResult","TalentListResult","ApolloClient","version","ssrMode","handleErrors","exec","extractGraphqlError","graphQLErrors","gqlError","extensions","exception","INFO","serve","stream","createAssetService","serveLoader","DataLoader","createLoaderHandler","serveAsset","streamLoader","streamAsset","downloadLoader","downloadAsset","authServeLoader","authStreamLoader","authDownloadLoader","member","load","handler","find","batch","client","gql","variables","queryResult","found","data","paths","unique","handleError","arrs","flat","unq","p","idx","createVideoService","doFind","doNext","list","args","doList","order","desc","after","limit","field","connection","edges","edge","node","cursor","pageInfo","hasNextPage","createTextService","slug","createBannerService","banner","createHomepageFeaturesService","homepageFeatures","getHomepageFeatures","promiseTree","received","mutex","executing","clearExecuting","LOADING_VIDEO","LOADING","ele","createVideosState","$catchPhrase","short","prepareVideo","createVideoPreparer","listVideo","loadFrom","lastVideo","findIndex","isVideo","isVideos","isHome","sceneId","streamVideo","prepareModels","talentId","warn","createTalentService","NAMES","LOADING_MODELS_MODEL","placeHolder","DEFAULT","createLoadingModel","createModelsState","prepareModel","createModelPreparer","listTalent","lastModel","serveImage","first","floor","random","last","randomName","LOADING_FEATURE_VIDEO","LOADING_FEATURE_MODEL","loadingVideo","LOADING_FEATURES","loadingVideoFeature","loadingModelFeature","LOADING_NEXT","DEFAULT_NEWS","DEFAULT_OUR_STORY","DEFAULT_SPECIAL","createHomeState","recent","videoList","videoNext","textFind","bannerList","reduce","c","n","nextVideo","modelIndex","createModelState","loadingModel","findTalent","notFound","prepared","VIDEO_SIZES","v","createVideoState","findVideo","galleryCount","parseInt","sceneIndex","replace","_","videoLoading","doLoad","loadVideo","downloadFile","pictureSet","finalDownloads","downloadResult","sizeMb","createWelcomeState","waiting","VERSION_ROUTE","FALSE_BASE_URL","createPackageService","getPackages","VALID_BILLERS","createBillerState","defaultPackages","availablePackages","pay","doPay","doUpgrade","tracking","pkg","reactivation","mutate","mutation","purchase","userId","createPurchaseService","payUpgrade","loadPackages","packs","pack","purchaseUpgrade","billerEnum","billerName","makePayment","joinToken","processPurchaseAction","forceRefresh","match","createSearchService","doSearch","createSearchState","debouncedSearch","searchService","debSearch","wait","timeout","clearTimeout","reject","debounce","execSearch","createAppState","$topic","interstitial","createDimensionState","pageStateFromPageData","params","normalizePath","pathUnderstood","canonicalizePath","pageStateFromPath","url","subPage","decodeURIComponent","test","qs","sort","name1","name2","createPageState","freeze","rollbar","__INITIAL__DATA__","shouldHydrate","ReactDOM","hydrate","StrictMode","__ERROR__","relative","hash","throttle","title$","path$","history","pagePath","firstPart","pushState","scrollTo"],"mappings":"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","file":"static/js/main.1.99.99.2878d9ac.chunk.js","sourcesContent":["export default function placeholder(width, height) {\n    const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\"></svg>`;\n    const src = `data:image/svg+xml;utf8,${encodeURIComponent(svg)}`;\n    return src;\n}\n","import assert from 'assert';\nimport { ReplaySubject } from 'rxjs';\nimport valueEquality from 'lodash.isequal';\nimport useObservable from '../use-observable.js';\n\nconst NAME_SEPARATOR = /\\.+(.*)/;\n\nexport function addStateValue({\n    state,\n    name,\n    value: initialValue,\n    transform = identity,\n    isEqual = equality,\n}) {\n    // Static value\n    if (name.startsWith(`$`)) {\n        defineReadOnlyProperty(state, name, initialValue);\n        return;\n    }\n\n    let value;\n    const subject$ = new ReplaySubject(1);\n    subject$.next(undefined);\n    const nameObserver = buildObserverName(name);\n    const nameUseObserver = buildUseName(name);\n    set(initialValue);\n\n    Object.defineProperties(state, {\n        [name]: {\n            configurable: true,\n            enumerable: true,\n            get: () => value,\n            set,\n        },\n        [nameObserver]: {\n            configurable: true,\n            writable: true,\n            value: subject$,\n        },\n        [nameUseObserver]: {\n            configurable: true,\n            writable: true,\n            // eslint-disable-next-line react-hooks/rules-of-hooks\n            value: () => useObservable(subject$, value),\n        },\n    });\n\n    function set(val) {\n        const transformed = transform(val);\n        if (!isEqual(transformed, value)) {\n            value = transformed;\n            subject$.next(value);\n        }\n        return val;\n    }\n}\n\nexport function addDerivedValue({\n    state,\n    name,\n    value,\n    from,\n    group,\n    combine = defaultCombine,\n    isEqual = valueEquality,\n}) {\n    if (group === undefined) {\n        group = from.length > 1;\n    }\n\n    assert(name.startsWith(`$`) === false, `Only static values may start with $`);\n    let immediate;\n    assert(\n        hasAllDependencies({ state, dependencies: from }),\n        `Missing the at least one of the following dependencies: ${from.join(`, `)}`\n    );\n\n    addStateValue({\n        state,\n        name,\n        value,\n        isEqual,\n    });\n\n    const { get, set: updateValue } = Object.getOwnPropertyDescriptor(state, name);\n    Object.defineProperty(state, name, {\n        configurable: true,\n        enumerable: true,\n        get,\n        set,\n    });\n\n    // Trigger a change whenever values this is derived from change\n    from.forEach(dependency =>\n        deepSubscribe({\n            state,\n            handlers: onDependencyChange,\n            name: dependency,\n        })\n    );\n\n    // This will set the values (eventually if combine is async)\n    performUpdate();\n\n    function set() {\n        throw new Error(\n            `Unable to set derived value \"${name}\". Set one of \"${from.join(\n                `, `\n            )} to trigger a change`\n        );\n    }\n\n    async function onDependencyChange() {\n        if (!group) {\n            await performUpdate();\n            return;\n        }\n\n        // Batch things together\n        if (immediate) {\n            return;\n        }\n\n        // TODO: Should this run next tick instead of immediate?\n        immediate = setImmediate(async () => {\n            immediate = undefined;\n            await performUpdate();\n        });\n    }\n\n    function performUpdate() {\n        const value = combine(state, ...from);\n        if (typeof value?.then === `function`) {\n            return value.then(updateValue);\n        } else {\n            updateValue(value);\n        }\n    }\n}\n\nexport default function createState({\n    root,\n    values = {},\n    derived = {},\n    transform = {},\n    createActions = noop,\n} = {}) {\n    assert(!root || typeof root === `object`, `When supplied \"root\" MUST be an object`);\n    assert(values && typeof values === `object`, `values MUST be an object`);\n\n    const state = { toJSON };\n    defineReadOnlyProperty(state, `root`, root || state);\n\n    for (const [name, value] of Object.entries(values)) {\n        addStateValue({\n            name,\n            value,\n            state,\n            transform: transform[name],\n        });\n    }\n\n    const derivedKeys = Object.keys(derived);\n    let processed;\n    do {\n        processed = false;\n        for (const name of derivedKeys.slice()) {\n            const hasEveryDependenncy = derived[name].from.every(dependency =>\n                hasDependency({\n                    state,\n                    dependency,\n                })\n            );\n\n            if (!hasEveryDependenncy) {\n                continue;\n            }\n            processed = true;\n            derivedKeys.splice(derivedKeys.indexOf(name), 1);\n\n            addDerivedValue({\n                state,\n                name,\n                ...derived[name],\n            });\n        }\n        if (processed === false && derivedKeys.length) {\n            throw new Error(\n                `Circular dependency detected (Possible keys: ${derivedKeys.join(`, `)})`\n            );\n        }\n    } while (processed);\n\n    const actions = createActions(state);\n    Object.assign(state, actions);\n    return state;\n\n    function toJSON() {\n        const staticKeys = Object.keys(values || {}).filter(key => key.startsWith(`$`));\n        const valueKeys = Object.keys(values || {})\n            .filter(key => key.startsWith(`$`) === false)\n            .filter(key => key !== `root`);\n        const derivedKeys = Object.keys(derived || {});\n        const actionKeys = Object.keys(actions || {});\n\n        const subValues = Object.keys(state)\n            .filter(key => key.startsWith(`$`) === false)\n            .filter(key => key.endsWith(`$`) === false)\n            // TODO: Generalise this when you get a chance\n            .filter(key => key === `user` || key.startsWith(`use`) === false)\n            .filter(key => key !== `root`)\n            .filter(key => actionKeys.includes(key) === false)\n            .filter(key => valueKeys.includes(key) === false)\n            .filter(key => derivedKeys.includes(key) === false)\n            .filter(key => state[key] && typeof state[key].toJSON === `function`);\n\n        const entries = [\n            ...Object.keys(values).map(key => [key, state[key]]),\n            ...subValues.map(key => [key, state[key].toJSON()]),\n            ...staticKeys.map(key => [key, state[key]]),\n        ];\n\n        return Object.fromEntries(entries);\n    }\n}\n\nfunction deepSubscribe({ state, name, handlers, separator = NAME_SEPARATOR }) {\n    const [current, subName] = name.split(separator);\n    const obsName = buildObserverName(current);\n\n    // The last one doesn't require special handling\n    if (subName === undefined) {\n        return state[obsName].subscribe(handlers);\n    }\n\n    let subSubscription = subSubscribe(state[current]);\n\n    const next = typeof handlers === `function` ? handlers : handlers.next;\n    assert(typeof next === `function`, `handlers or handlers.next MUST be a function`);\n\n    // Whenever the current value changes the sub subscription\n    //  needs to\n    // TODO: Only the first level should resepct complete\n    state[obsName].subscribe({\n        complete: () => handlers.complete && handlers.complete(),\n        error: error => handlers.error && handlers.error(error),\n        next: value => {\n            subSubscription.unsubscribe();\n            // Re-subscribe to the new one\n            subSubscription = subSubscribe(value);\n\n            // The value may have changed\n            const subVal = getSubValue(value, subName);\n            return next(subVal);\n        },\n    });\n\n    let isClosed = false;\n    const subscription = {};\n    Object.defineProperties(subscription, {\n        unsubscribe: {\n            configurable: true,\n            enumerable: true,\n            writable: true,\n            value: unsubscribe,\n        },\n        closed: {\n            configurable: true,\n            enumerable: true,\n            get: () => isClosed || subSubscription.closed,\n        },\n    });\n    return subscription;\n\n    function unsubscribe() {\n        isClosed = true;\n        subSubscription.unsubscribe();\n        subSubscription = undefined;\n    }\n\n    function subSubscribe(state) {\n        return deepSubscribe({\n            state,\n            name: subName,\n            handlers,\n            separator,\n        });\n    }\n}\n\nfunction hasAllDependencies({ state, dependencies }) {\n    // We just check for the observable\n    return dependencies.every(dependency => hasDependency({ state, dependency }));\n}\n\nfunction hasDependency({ state, dependency, separator = `.` }) {\n    // TODO: Change to regex split\n    assert(state, `state MUST be supplied`);\n    if (typeof dependency === `string`) {\n        return hasDependency({ state, dependency: dependency.split(separator) });\n    }\n    assert(Array.isArray(dependency), `dependency MUST be a string`);\n\n    const current = buildPlainName(dependency.shift());\n    if (!state[buildObserverName(current)]) {\n        return false;\n    }\n\n    if (dependency.length === 0) {\n        return true;\n    }\n\n    const subState = state[current];\n    if (!subState) {\n        return false;\n    }\n\n    return hasDependency({ state: subState, dependency, separator });\n}\n\nasync function defaultCombine(state, ...depndencies) {\n    // By default create an object with all the dependant properties attached\n    const entries = await Promise.all(\n        depndencies.map(dependency => [dependency, state[dependency]])\n    );\n    return Object.fromEntries(entries);\n}\n\nfunction buildUseName(key) {\n    if (key.length === 0) {\n        return `use`;\n    }\n    key = `${key[0].toUpperCase()}${key.substr(1)}`;\n    return `use${key}`;\n}\n\nfunction buildPlainName(value) {\n    if (value.endsWith(`$`)) {\n        return value.substr(0, value.length - 1);\n    } else {\n        return value;\n    }\n}\n\nfunction buildObserverName(value) {\n    if (value.endsWith(`$`)) {\n        return value;\n    } else {\n        return `${value}$`;\n    }\n}\n\nfunction getSubValue(object, name) {\n    if (!object || typeof object !== `object`) {\n        return undefined;\n    }\n    const [current, subName] = name.split(NAME_SEPARATOR);\n\n    if (subName === undefined) {\n        return object[current];\n    } else {\n        return getSubValue(object[current], subName);\n    }\n}\n\nfunction noop() {\n    // Does nothing\n}\n\nfunction identity(value) {\n    return value;\n}\n\nfunction equality(a, b) {\n    return a === b;\n}\n\nfunction defineReadOnlyProperty(state, name, value) {\n    Object.defineProperty(state, name, {\n        configurable: true,\n        enumerable: true,\n        writable: false,\n        value,\n    });\n}\n","import React from 'react';\nimport assert from 'assert';\n\nexport default function Navigate(props) {\n    const { href, onClick, state, disabled, ...rest } = props;\n    assert(href, `href MUST be supplied`);\n    assert(state, `state MUST be supplied`);\n\n    return (\n        <a href={href} onClick={onClickHandler} {...rest}>\n            {props.children}\n        </a>\n    );\n\n    function onClickHandler(event) {\n        if (disabled) {\n            return;\n        }\n\n        if (onClick) {\n            onClick(event);\n        } else if (href.startsWith(`/`)) {\n            event.preventDefault();\n            state.root.page.navigate(href);\n        }\n    }\n}\n","import React from 'react';\nimport Navigate from '../container/navigate.jsx';\n\nfunction Logo(props) {\n    const { onClick, state } = props;\n    return (\n        <Navigate className=\"logo\" state={state} href=\"/\" onClick={onClick}>\n            <img id=\"logo-image\" src=\"/logo.svg\" width=\"125\" height=\"70\" />\n        </Navigate>\n    );\n}\n\nexport default Logo;\n","const constants = {\n    color: {\n        primary: {\n            r: 225,\n            g: 13,\n            b: 14,\n        },\n    },\n    size: {\n        // All shown widths assume a base font size of 16px\n        massive: `120em`, // 1920px\n        large: `90em`, // 1440px\n        standard: `64em`, // 1024px\n        medium: `50em`, // 800px\n        mobile: `48em`, // 768px\n        small: `40em`, // 640px\n        tiny: `20em`, // 320px\n    },\n};\n\nexport default constants;\n","import React, { useEffect, useRef } from 'react';\nimport styled from 'styled-components';\nimport constants from '../../constants.js';\n\nconst CLOSE_KEYS = [`esc`, `escape`];\n\nconst SearchStyles = styled.div`\n    display: flex;\n    flex-direction: row;\n\n    @media (max-width: ${constants.size.small}) {\n        :not(.searching) {\n            .icon.search {\n                position: fixed;\n                bottom: 1em;\n                right: 1em;\n            }\n        }\n\n        position: absolute;\n        left: 0.5em;\n        width: 100%;\n    }\n\n    form {\n        flex-grow: 1;\n    }\n\n    .icon {\n        position: relative;\n        display: block;\n        flex-grow: 0;\n        cursor: pointer;\n        height: var(--height-header);\n        width: var(--height-header);\n        color: var(--color-action-active);\n    }\n\n    .icon.search svg {\n        position: absolute;\n        top: 15%;\n        left: 0;\n        height: 70%;\n        width: var(--height-header);\n    }\n\n    .icon.close {\n        height: 1em;\n        width: 1em;\n        font-size: calc(var(--height-header) * 0.8);\n        margin-right: 0.5em;\n    }\n\n    input {\n        width: 100%;\n        border: 1px solid var(--color-border-action);\n        border-radius: 5px;\n    }\n\n    :not(.searching) {\n        input {\n            display: none;\n        }\n\n        .icon.close {\n            display: none;\n        }\n    }\n`;\n\nexport default function SearchQuery({\n    globalSearchKey = `/`,\n    onChange,\n    searching,\n    setSearching,\n    showResultsPage,\n}) {\n    const searchInputRef = useRef(null);\n    useEffect(() => {\n        if (globalSearchKey) {\n            bind();\n        }\n        return unbind;\n\n        function bind() {\n            document.body.addEventListener(`keydown`, onBodyKeyDown);\n        }\n\n        function unbind() {\n            document.body.removeEventListener(`keydown`, onBodyKeyDown);\n        }\n    });\n\n    const classNames = [searching && `searching`].filter(Boolean).join(` `);\n    return (\n        <SearchStyles searching={searching} className={classNames}>\n            <form onSubmit={onSearchSubmit}>\n                <input\n                    type=\"text\"\n                    name=\"query\"\n                    ref={searchInputRef}\n                    placeholder=\"search\"\n                    onInput={onSearchInput}\n                    onKeyDown={onSearchKeyDown}\n                />\n            </form>\n            <a className=\"icon search\" onClick={onSearchIconClick}>\n                <svg\n                    xmlns=\"http://www.w3.org/2000/svg\"\n                    width=\"128\"\n                    height=\"128\"\n                    viewBox=\"0 0 1280 1280\"\n                >\n                    <g>\n                        <g fill=\"currentColor\">\n                            <path d=\"M982 1117 c-163 -163 -167 -172 -103 -230 79 -71 65 -76 232 89 174 173 177 179 102 243 -27 23 -57 41 -68 41 -13 0 -73 -53 -163 -143z\" />\n                            <path d=\"M444 989 c-140 -17 -284 -112 -361 -239 -86 -141 -86 -359 0 -500 32 -53 113 -136 166 -169 153 -97 369 -97 522 0 53 33 134 116 166 169 66 109 84 277 43 401 -76 228 -296 367 -536 338z m206 -175 c73 -34 136 -96 171 -169 25 -52 29 -72 29 -145 0 -70 -5 -95 -26 -140 -34 -73 -96 -136 -169 -171 -52 -25 -72 -29 -145 -29 -73 0 -93 4 -145 29 -73 35 -135 98 -169 171 -37 79 -37 201 0 280 34 73 96 136 169 171 52 25 72 29 145 29 70 0 95 -5 140 -26z\" />\n                        </g>\n                    </g>\n                </svg>\n            </a>\n            <a className=\"icon close\" onClick={onCloseClick}>\n                ✖\n            </a>\n        </SearchStyles>\n    );\n\n    function onBodyKeyDown(event) {\n        const { key } = event;\n        if (key === globalSearchKey) {\n            setSearching(true);\n            focusSearch();\n            event.preventDefault();\n        }\n    }\n\n    function onSearchKeyDown(event) {\n        event.stopPropagation();\n        const { key } = event;\n        const normKey = key.toLowerCase();\n        if (CLOSE_KEYS.includes(normKey)) {\n            onCloseClick();\n        }\n    }\n\n    function onSearchInput(event) {\n        onChange(event.target.value);\n    }\n\n    function onSearchSubmit(event) {\n        event.preventDefault();\n        const query = event.target.elements.query.value;\n        if (query) {\n            onChange(query);\n            showResultsPage();\n            setSearching(false);\n        } else {\n            setSearching(false);\n        }\n    }\n\n    function onSearchIconClick() {\n        if (searching) {\n            if (searchInputRef.current) {\n                onChange(searchInputRef.current.value);\n            }\n            showResultsPage();\n            setSearching(false);\n        } else {\n            setSearching(true);\n            // We need the dom to update\n            setTimeout(focusSearch, 10);\n        }\n    }\n\n    function onCloseClick() {\n        setSearching(false);\n    }\n\n    function focusSearch() {\n        if (searchInputRef.current) {\n            searchInputRef.current.focus();\n        }\n    }\n}\n","import React, { useState, useRef } from 'react';\nimport styled from 'styled-components';\nimport Navigate from '../container/navigate.jsx';\nimport SearchQuery from './search/query.jsx';\nimport constants from '../constants.js';\n\nconst MenuStyles = styled.div`\n    width: ${props => (props.searching ? `100%` : `auto`)};\n    ul {\n        display: flex;\n        flex-direction: row;\n        flex-wrap: nowrap;\n        justify-content: flex-end;\n        align-items: flex-end;\n        margin: 0;\n    }\n    li {\n        display: block;\n        margin-left: 0.5em;\n        margin-right: 0.5em;\n    }\n\n    .search-focus {\n        li:not(.search) {\n            display: none;\n        }\n        li.search {\n            width: 100%;\n        }\n    }\n\n    @media (max-width: ${constants.size.small}) {\n        li.videos,\n        li.models {\n            display: none;\n        }\n    }\n`;\n\nfunction Menu(props) {\n    const { onVideosClick, onModelsClick, onJoinClick, isLoggedIn, state } = props;\n\n    const searchShown = state.search.useSearchShown();\n    const menuClass = [`menu`, searchShown && `search-focus`].filter(Boolean).join(` `);\n\n    return (\n        <>\n            <MenuStyles searching={searchShown}>\n                <ul className={menuClass} role=\"menu\" style={{ padding: 0 }}>\n                    <li className=\"secondary-text search\">\n                        <SearchQuery\n                            searching={searchShown}\n                            setSearching={value => {\n                                state.search.searchShown = value;\n                            }}\n                            onChange={value => {\n                                state.search.query = value;\n                            }}\n                            showResultsPage={() =>\n                                state.page.navigate(\n                                    `/search-results?q=${encodeURIComponent(state.search.query)}`\n                                )\n                            }\n                        />\n                    </li>\n                    <li className=\"secondary-text videos\">\n                        <Navigate state={state} href=\"/videos\" onClick={onVideosClick}>\n                            Videos\n                        </Navigate>\n                    </li>\n                    <li className=\"secondary-text models\">\n                        <Navigate state={state} href=\"/models\" onClick={onModelsClick}>\n                            Models\n                        </Navigate>\n                    </li>\n                    {!isLoggedIn && (\n                        <>\n                            <li className=\"secondary-text login\">\n                                <a href=\"#login\">Login</a>\n                            </li>\n                        </>\n                    )}\n                </ul>\n            </MenuStyles>\n        </>\n    );\n}\n\nexport default Menu;\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst StyledSpinner = styled.div`\n    position: relative;\n    width: 80px;\n    height: 80px;\n    margin-left: auto;\n    margin-right: auto;\n\n    div {\n        display: inline-block;\n        position: absolute;\n        left: 8px;\n        width: 16px;\n        background: var(--color-spinner);\n        animation: spinner 1.2s cubic-bezier(0, 0.5, 0.5, 1) infinite;\n    }\n\n    div:nth-child(1) {\n        left: 8px;\n        animation-delay: -0.24s;\n    }\n    div:nth-child(2) {\n        left: 32px;\n        animation-delay: -0.12s;\n    }\n    div:nth-child(3) {\n        left: 56px;\n        animation-delay: 0;\n    }\n\n    @keyframes spinner {\n        0% {\n            top: 8px;\n            height: 64px;\n        }\n        50%,\n        100% {\n            top: 24px;\n            height: 32px;\n        }\n    }\n`;\n\nexport function Spinner(props) {\n    return (\n        <StyledSpinner {...props}>\n            <div></div>\n            <div></div>\n            <div></div>\n        </StyledSpinner>\n    );\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport Navigate from '../../container/navigate.jsx';\nimport { Spinner } from '../element/spinner.jsx';\n\nconst ResultStyles = styled.div`\n    .search-entry {\n        display: flex;\n        flex-direction: row;\n        color: var(--color-action-text);\n        background-color: rgba(var(--color-action-button-rgb), 0.8);\n        cursor: pointer;\n        transition: background-color 250ms ease-out;\n\n        .image {\n            width: 20%;\n            flex-grow: 0;\n            box-sizing: border-box;\n            padding: 0.5em;\n\n            img {\n                width: 100%;\n                height: auto;\n                border: var(--size-border) solid var(--color-border);\n            }\n        }\n\n        .details {\n            flex-grow: 1;\n            width: 80%;\n            box-sizing: border-box;\n            padding: 0.5em;\n\n            h3 {\n                line-height: 1.2em;\n                margin: 0.1em;\n            }\n\n            .description {\n                font-family: Comfortaa;\n                font-size: 1rem;\n                line-height: 1em;\n                text-transform: none;\n                font-weight: 300;\n            }\n        }\n    }\n\n    .search-entry:hover {\n        background-color: var(--color-action-button);\n    }\n`;\n\nexport default function SearchResults({ className, state }) {\n    const results = state.search.useResults();\n    const isSearching = state.search.useSearching();\n    const hasResults = !isSearching && results && results.length > 0;\n\n    return (\n        <ResultStyles className={className}>\n            {isSearching && (\n                <div className=\"search-entry\">\n                    <Spinner />\n                </div>\n            )}\n            {!isSearching && !hasResults && <div className=\"search-entry\">No results</div>}\n            {hasResults &&\n                results.map(result => (\n                    <Navigate\n                        state={state.root}\n                        key={itemKey(result)}\n                        href={navigateLink(result)}\n                        onClick={event => onItemClick(event, result)}\n                    >\n                        <div className=\"search-entry\">\n                            <div className=\"image\">\n                                <img src={result.images[0]} />\n                            </div>\n                            <div className=\"details\">\n                                <h3>{result.name}</h3>\n                                <div className=\"description\">{result.description}</div>\n                            </div>\n                        </div>\n                    </Navigate>\n                ))}\n        </ResultStyles>\n    );\n\n    function navigateLink(item) {\n        switch (item.type) {\n            case `TALENT`:\n                return `/models/${item.itemId}`;\n            case `VIDEO`:\n                return `/videos/${item.itemId}`;\n            default:\n                console.error(`Unrecognized item type \"${item.type}\"`);\n                break;\n        }\n    }\n\n    function itemKey(item) {\n        return `${item.type}:${item.itemId}`;\n    }\n\n    function onItemClick(event, result) {\n        event.preventDefault();\n        state.root.search.searchShown = false;\n        state.root.page.navigate(navigateLink(result));\n    }\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport Logo from './logo.jsx';\nimport Menu from './menu.jsx';\nimport SearchResults from './search/results.jsx';\n\nconst StyledHeader = styled.header`\n    .header {\n        position: absolute;\n        left: 0;\n        right: 0;\n        top: 0;\n        bottom: 0;\n\n        display: flex;\n        flex-direction: row;\n        flex-wrap: nowrap;\n    }\n\n    .logo {\n        flex-grow: 0;\n    }\n    .spacer {\n        flex-grow: 1;\n    }\n\n    .search-results {\n        position: absolute;\n        left: 0;\n        right: 0;\n        top: calc(var(--height-header) + 0.3em);\n        border: 2px solid var(--color-action-active);\n        max-width: 40em;\n        margin-left: auto;\n        margin-right: auto;\n    }\n`;\n\nfunction Header(props) {\n    const { onLogoClick, onVideosClick, onModelsClick, onJoinClick, isLoggedIn, hideMenu, state } =\n        props;\n    return (\n        <StyledHeader>\n            <div className=\"header\">\n                <Logo state={state} onClick={onLogoClick} />\n                <div className=\"spacer\"></div>\n                {!hideMenu && (\n                    <Menu\n                        isLoggedIn={isLoggedIn}\n                        onVideosClick={onVideosClick}\n                        onModelsClick={onModelsClick}\n                        onJoinClick={onJoinClick}\n                        state={state}\n                    />\n                )}\n            </div>\n            <SearchResultsBox state={state} />\n        </StyledHeader>\n    );\n}\n\nfunction SearchResultsBox({ state }) {\n    const query = state.search.useQuery();\n    const searchShown = state.search.useSearchShown();\n    const results = state.search.useResults();\n    const isSearching = state.search.useSearching();\n    const notOnSearchPage = state.page.path !== `/search-results`;\n    const shouldShow = query && searchShown && (isSearching || results) && notOnSearchPage;\n    if (shouldShow) {\n        return <SearchResults className=\"search-results\" state={state} />;\n    } else {\n        return null;\n    }\n}\n\nexport default Header;\n","import React from 'react';\nimport HeaderComponent from '../component/header.jsx';\n\nexport default function Header({ user, hideMenu, state }) {\n    return (\n        <>\n            <HeaderComponent\n                onLogoClick={event => showPage(event, `/`)}\n                onVideosClick={event => showPage(event, `/videos`)}\n                onModelsClick={event => showPage(event, `/models`)}\n                onJoinClick={event => showPage(event, `/join`)}\n                isLoggedIn={Boolean(user)}\n                hideMenu={hideMenu}\n                state={state}\n            />\n        </>\n    );\n\n    function showPage(event, page) {\n        event.preventDefault();\n        state.page.navigate(page);\n    }\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport constant from '../constants.js';\n\nconst Container = styled.div`\n    margin-left: auto;\n    margin-right: auto;\n    max-width: 80em;\n    box-sizing: border-box;\n    padding-left: 1px;\n    padding-right: 1px;\n`;\n\nconst List = styled.ul`\n    display: flex;\n    flex-direction: row;\n    flex-wrap: nowrap;\n    margin: 0;\n    margin-bottom: 0.5em;\n    padding: 0;\n\n    @media (max-width: ${constant.size.mobile}) {\n        flex-direction: column;\n    }\n`;\n\nconst Item = styled.li`\n    display: block;\n    margin-left: 0.5em;\n    margin-right: 0.5em;\n\n    .small {\n        font-size: 0.75em;\n    }\n\n    @media (max-width: ${constant.size.mobile}) {\n        margin-bottom: 0.5em;\n    }\n`;\n\nfunction Footer(props) {\n    const {\n        onWebmastersClick,\n        onUsc2257Click,\n        onPrivacyClick,\n        onTermsClick,\n        contactEmail,\n        onLogoutClick,\n        isLoggedIn,\n    } = props;\n    const mailTo = `mailto:${contactEmail}`;\n    return (\n        <footer>\n            <Container>\n                <List>\n                    <Item>© 2023</Item>\n                    <Item className=\"secondary-text\">\n                        <a href=\"/webmasters\" onClick={onWebmastersClick}>\n                            Webmasters\n                        </a>\n                    </Item>\n                    <Item className=\"secondary-text\">\n                        <a href=\"/privacy\" onClick={onPrivacyClick}>\n                            Privacy\n                        </a>\n                    </Item>\n                    <Item className=\"secondary-text\">\n                        <a href=\"/terms\" onClick={onTermsClick}>\n                            Terms\n                        </a>\n                    </Item>\n                    <Item className=\"secondary-text\">\n                        <a href={mailTo}>Contact Us</a>\n                    </Item>\n                    {isLoggedIn && (\n                        <Item className=\"secondary-text\">\n                            <a onClick={onLogoutClick}>Logout</a>\n                        </Item>\n                    )}\n                </List>\n                <List>\n                    <Item className=\"secondary-text\">\n                        <a href=\"/usc2257\" onClick={onUsc2257Click}>\n                            18 U.S.C. 2257 Record-Keeping Requirements Compliance Statement\n                        </a>\n                    </Item>\n                </List>\n                <List>\n                    <Item>\n                        <span className=\"small\">\n                            <b>Billing:</b> For inquiries or to cancel your membership, please visit\n                            the payment company on your statement:{` `}\n                        </span>\n                        <a className=\"secondary-text\" href=\"https://www.epoch.com/\">\n                            EPOCH\n                        </a>\n                        <span className=\"small\"> or </span>\n                        <a className=\"secondary-text\" href=\"https://www.vtsup.com/\">\n                            VEROTEL\n                        </a>\n                    </Item>\n                </List>\n            </Container>\n        </footer>\n    );\n}\n\nexport default Footer;\n","import React from 'react';\nimport FooterComponent from '../component/footer.jsx';\n\nexport default function Footer({ user, setUser, state }) {\n    return (\n        <FooterComponent\n            onWebmastersClick={event => showPage(event, `/webmasters`)}\n            onUsc2257Click={event => showPage(event, `/usc2257`)}\n            onPrivacyClick={event => showPage(event, `/privacy`)}\n            onTermsClick={event => showPage(event, `/terms`)}\n            contactEmail={state.root.email.$contact}\n            onLogoutClick={doLogout}\n            isLoggedIn={user}\n        />\n    );\n\n    function showPage(event, page) {\n        event.preventDefault();\n        state.page.navigate(page);\n    }\n\n    async function doLogout(event) {\n        event.preventDefault();\n        await fetch(`${state.root.key.api}/api/legacy/user/logout`, {\n            method: `get`,\n            credentials: `include`,\n        });\n        setUser(undefined);\n    }\n}\n","// TODO: Should this not be in a service?\nexport const TRACK_PREFIX = `trk-`;\n\nexport function setTracking() {\n    if (typeof window === `undefined`) {\n        return;\n    }\n    const uri = new URL(window.location.href);\n    for (let entry of uri.searchParams.entries()) {\n        if (entry[0].startsWith(TRACK_PREFIX)) {\n            window.localStorage.setItem(\n                entry[0],\n                JSON.stringify({\n                    when: Date.now(),\n                    value: entry[1],\n                })\n            );\n        }\n    }\n}\n\nexport function getTracking() {\n    const result = {};\n    if (typeof window === `undefined`) {\n        return result;\n    }\n    for (let index = 0; index < window.localStorage.length; index++) {\n        let key = window.localStorage.key(index);\n        if (!key.startsWith(TRACK_PREFIX)) {\n            continue;\n        }\n\n        let source;\n        try {\n            source = window.localStorage.getItem(key);\n        } catch (error) {\n            console.error(`Error reading tracking value \"${key}\" out of localStorage`, error);\n            continue;\n        }\n\n        let value;\n        try {\n            value = JSON.parse(source);\n        } catch (error) {\n            console.error(`Error parsing tracking value \"${key}\" with data: ${source}`, error);\n            continue;\n        }\n        key = key.substr(TRACK_PREFIX.length);\n        result[key] = value;\n    }\n    return result;\n}\n","export function get(key) {\n    try {\n        return window.localStorage.getItem(key);\n    } catch (error) {\n        return undefined;\n    }\n}\n\nexport function set(key, value) {\n    try {\n        return window.localStorage.setItem(key, value);\n    } catch (error) {\n        return undefined;\n    }\n}\n\nexport function del(key) {\n    try {\n        return window.localStorage.removeItem(key);\n    } catch (error) {\n        return undefined;\n    }\n}\n\nexport function getData(key) {\n    const value = get(key);\n    if (value === undefined) {\n        return undefined;\n    }\n    try {\n        return JSON.parse(value);\n    } catch (error) {\n        throw new Error(`Unable to parse data value at key ${key}. ${error.message}. ${value}`);\n    }\n}\n\nexport function setData(key, value) {\n    const serialized = JSON.stringify(value);\n    return set(key, serialized);\n}\n","import React from 'react';\nimport styled, { css } from 'styled-components';\n\nconst Container = styled.div`\n    ${({ id }) => css`\n        &#${id}:not(:target) {\n            display: none;\n        }\n\n        &#${id}:target {\n            display: flex;\n            position: fixed;\n            top: 0;\n            bottom: 0;\n            right: 0;\n            left: 0;\n            background-color: var(--color-overlay);\n            z-index: 1000;\n            justify-content: center;\n            align-items: center;\n        }\n    `}\n`;\n\nconst Styles = styled.div`\n    min-width: 20em;\n    position: relative;\n    background-color: var(--color-primary);\n    z-index: 1003;\n    border-radius: 0.5em;\n    padding: 2em;\n    margin: 1rem;\n    text-align: center;\n    font-size: 1em;\n    border: 0.25em solid var(--color-action-active);\n\n    a.close {\n        color: var(--color-primary-text);\n        font-weight: bold;\n        font-size: 1.5rem;\n        position: absolute;\n        top: 0.5rem;\n        right: 1rem;\n    }\n\n    h1 {\n        font-size: 3rem;\n        text-transform: uppercase;\n    }\n\n    .g-recaptcha {\n        transform: scale(0.86);\n        -webkit-transform: scale(0.86);\n        transform-origin: 0 0;\n        -webkit-transform-origin: 0 0;\n    }\n\n    @media (max-width: 25em) {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        height: 100%;\n        box-sizing: border-box;\n        position: absolute;\n        border: 0;\n        border-radius: 0;\n        padding: 1em;\n\n        h1 {\n            font-size: 2rem;\n        }\n    }\n`;\n\nfunction Dialog({ children, name, onClose }) {\n    return (\n        <Container id={name}>\n            <Styles>\n                <div style={{ flexGrow: 1 }} />\n                {children}\n                <div style={{ flexGrow: 1 }} />\n                <a href=\"#\" className=\"close\" onClick={onClose}>\n                    X\n                </a>\n            </Styles>\n        </Container>\n    );\n}\n\nexport default Dialog;\n","import React from 'react';\nimport { useState, useRef, useEffect } from 'react';\nimport styled from 'styled-components';\nimport Dialog from './dialog.jsx';\n\nconst EMAIL =\n    /^\\s*[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\s*$/;\n\nconst Input = styled.input`\n    margin: auto;\n    margin-bottom: 5px;\n\n    display: block;\n    width: 100%;\n`;\n\nconst Hint = styled.div`\n    font-size: 0.8em;\n    font-style: italic;\n    margin-top: 0.5em;\n`;\n\nconst Button = styled.button`\n    display: block;\n    margin: auto;\n    margin-bottom: 5px;\n    width: 100%;\n    background-color: var(--color-action);\n    color: var(--color-action-text);\n    font-weight: bold;\n    border: 1px solid transparent;\n    padding: 0.85em 1em;\n    border-radius: 2px;\n\n    &:hover {\n        background-color: var(--color-action-button);\n    }\n`;\n\nconst ForgotPassword = styled.a`\n    display: block;\n    margin: auto;\n    width: 126px;\n    color: var(--color-action-active);\n\n    &:hover {\n        color: var(--color-action-button);\n    }\n`;\n\nfunction Login({ setUser, state }) {\n    let widgetId;\n    const ref = useRef(null);\n    const [msg, setMsg] = useState(`LOGIN`);\n    const [forcePasswordReset, setForcePasswordReset] = useState(false);\n\n    useEffect(() => {\n        (async function () {\n            if (ref && state.key.captchaV2) {\n                await new Promise(resolve => window.grecaptcha.ready(resolve));\n                widgetId = window.grecaptcha.render(\n                    `recaptcha`,\n                    {\n                        callback: token => {\n                            onHaveCaptchaToken(token);\n                        },\n                    },\n                    true\n                );\n            }\n        })();\n    }, [ref]);\n\n    return (\n        <>\n            {forcePasswordReset ? (\n                <Dialog name=\"login\">\n                    <h1>NEW PASSWORD REQUIRED</h1>\n                    <p>\n                        We've updated our system and a new password is required. Please click the\n                        button to reset your password.\n                    </p>\n                    <a href=\"#reset\">\n                        <Button type=\"submit\">RESET PASSWORD</Button>\n                    </a>\n                </Dialog>\n            ) : (\n                <Dialog name=\"login\">\n                    <h1>LOGIN</h1>\n                    <form onSubmit={onSubmit}>\n                        <Input\n                            id=\"email\"\n                            type=\"email\"\n                            placeholder=\"email\"\n                            name=\"email\"\n                            autoComplete=\"email\"\n                            required\n                        />\n                        <Input\n                            id=\"password\"\n                            type=\"password\"\n                            placeholder=\"password\"\n                            name=\"password\"\n                            autoComplete=\"current-password\"\n                            required\n                        />\n                        <Button type=\"submit\">{msg}</Button>\n                    </form>\n                    <ForgotPassword href=\"#reset\">forgot password?</ForgotPassword>\n                    {state.root.key.captchaV2 && (\n                        <div\n                            id=\"recaptcha\"\n                            ref={ref}\n                            data-sitekey={state.root.key.captchaV2}\n                            data-badge=\"inline\"\n                            data-size=\"invisible\"\n                        />\n                    )}\n                </Dialog>\n            )}\n        </>\n    );\n\n    async function onSubmit(event) {\n        event.preventDefault();\n        let token;\n        if (state.key.captcha || state.key.captchaV2) {\n            await new Promise(resolve => window.grecaptcha.ready(resolve));\n        }\n\n        // TODO: How to move this to analytics long term?\n        if (state.key.captcha) {\n            token = await window.grecaptcha.execute(state.key.captcha, { action: `login` });\n        }\n\n        setMsg(`PLEASE WAIT`);\n        if (state.key.captchaV2) {\n            window.grecaptcha.reset(widgetId);\n            // Note: We purposefully overwrite the token (if it was already set)\n            const response = await window.grecaptcha.getResponse(widgetId);\n            if (response) {\n                onHaveCaptchaToken(response);\n            } else {\n                window.grecaptcha.execute(widgetId);\n            }\n        } else {\n            onHaveCaptchaToken(token);\n        }\n    }\n\n    async function onHaveCaptchaToken(token) {\n        const email = document.getElementById(`email`).value;\n        const passwordEle = document.getElementById(`password`);\n        const password = passwordEle.value;\n        try {\n            const response = await fetch(\n                `${state.key.api}/api/legacy/user/login?site=${state.$site}`,\n                {\n                    method: `post`,\n                    credentials: `include`,\n                    headers: {\n                        Accept: `application/json`,\n                        'Content-Type': `application/json`,\n                    },\n                    body: JSON.stringify({\n                        email,\n                        password,\n                        token,\n                    }),\n                }\n            );\n\n            if (response.ok) {\n                const { error, user } = await response.json();\n                if (error) {\n                    if (error.code === `auth/user-needs-reset`) {\n                        setForcePasswordReset(true);\n                        return;\n                    }\n                    throw new Error(`Login request returned an error with code ${error.code}`);\n                }\n                if (window.location.pathname === `/welcome`) {\n                    window.location.assign(`/`);\n                } else {\n                    window.location.assign(`#`);\n                }\n                setUser(user);\n                setMsg(`LOGIN`);\n                return;\n            }\n        } catch (error) {\n            console.error(`Error occurred during login`, error);\n        }\n        setMsg(`EMAIL OR PASSWORD INCORRECT`);\n    }\n}\n\nexport default Login;\n","import React from 'react';\nexport default function Dollar(props) {\n    return (\n        <>\n            <span className=\"symbol dollar\">$</span>\n            {props.children}\n        </>\n    );\n}\n","import React from 'react';\n// import loadable from '@loadable/component';\n// TODO: Re-introduce loadable\n// const SymbolDollar = loadable(() => import('./dollar.jsx'));\nimport SymbolDollar from './dollar.jsx';\n\nexport default function Currency(props) {\n    const { symbol } = props;\n    switch (symbol) {\n        case `$`:\n            return <SymbolDollar>{props.children}</SymbolDollar>;\n        default:\n            throw new Error(`No Currency handler for symbol \"${symbol}\" defined`);\n    }\n}\n","import React from 'react';\nimport Currency from './currency/index.jsx';\n\nexport default function Money({ Large, Small, currency, amount }) {\n    const small = amount % 100;\n    const large = (amount - small) / 100;\n    return (\n        <Currency symbol={currency}>\n            <Large>{large}</Large>\n            <Small>{small}</Small>\n        </Currency>\n    );\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport Money from './money.jsx';\nimport constants from '../constants.js';\n\nexport default MembershipOption;\n\nconst StyledMembershipOption = styled.div`\n    display: block;\n    margin: 1em;\n\n    input {\n        display: block;\n        margin-top: 0.25em;\n        box-sizing: border-box;\n        width: 100%;\n        height: 2.4375em;\n        box-shadow: inset 0 1px 2px rgba(var(--color-primary-text-rgb), 0.1);\n        font-weight: normal;\n        border: 1px solid rgba(var(--color-primary-text-rgb), 0.2);\n        font-size: 1em;\n        padding-left: 0.5em;\n    }\n\n    input[type='radio'] {\n        display: none;\n    }\n\n    input[type='radio']:checked + label,\n    label.option:hover {\n        color: var(--color-action-text);\n        background-color: var(--color-action-button);\n    }\n\n    input[type='radio']:checked + label > .description > span,\n    label.option:hover > .description > span {\n        color: var(--color-action-text);\n    }\n\n    input[type='radio']:checked + label > .price > .current {\n        color: var(--color-action-text);\n        background-color: var(--color-action);\n    }\n\n    .option {\n        display: flex;\n        flex-direction: row;\n        flex-wrap: nowrap;\n        align-items: stretch;\n        color: var(--color-action-button);\n        border: 1px solid rgba(var(--color-border-dark-rgb), 0.2);\n        margin-bottom: 1em;\n        padding-left: 1em;\n        line-height: 4em;\n        background-color: var(--color-join-item);\n        font-family: var(--font-secondary);\n        font-weight: 600;\n    }\n\n    .option > .description > h2 {\n        display: inline-block;\n        margin: 0;\n        margin-right: 0.5em;\n        font-weight: 500;\n        font-size: 1.8em;\n    }\n\n    .option > .description {\n        flex-grow: 1;\n    }\n\n    .option > .description > span {\n        font-family: var(--font-secondary);\n        color: var(--color-secondary-text);\n        font-weight: 200;\n    }\n\n    .option > .price {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        flex-grow: 0;\n    }\n\n    .previous {\n        position: relative;\n        white-space: nowrap;\n        height: 100%;\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        padding-left: 1em;\n        padding-right: 1em;\n        width: 6em;\n        text-align: center;\n        font-family: var(--font-secondary);\n        color: var(--color-action-text);\n    }\n\n    .previous:before {\n        content: ' ';\n        position: absolute;\n        top: 0;\n        bottom: 0;\n        left: -2em;\n        border: 2em solid transparent;\n        border-top: 2em solid var(--color-action);\n        border-bottom: 2em solid var(--color-action);\n        border-right: 0;\n    }\n\n    .previous:after {\n        content: ' ';\n        position: absolute;\n        top: 0;\n        bottom: 0;\n        left: 100%;\n        border: 2em solid transparent;\n        border-left: 2em solid var(--color-action);\n    }\n\n    .current {\n        white-space: nowrap;\n        height: 100%;\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        justify-content: flex-end;\n        padding-left: 1em;\n        padding-right: 1em;\n        width: 5em;\n        text-align: right;\n        font-family: var(--font-secondary);\n    }\n\n    .current > .symbol {\n        font-size: 1.5em;\n    }\n\n    .current > .large {\n        font-size: 1.5em;\n    }\n\n    .current > .small {\n        font-size: 0.75em;\n    }\n\n    .strike-through {\n        text-decoration: line-through;\n    }\n\n    @media (max-width: 30em) {\n        .sub {\n            display: none;\n        }\n\n        .option > .description > h2 {\n            font-size: 1.5em;\n        }\n    }\n\n    @media (max-width: ${constants.size.small}) {\n        .previous {\n            display: none;\n        }\n    }\n`;\n\nfunction MembershipOption({\n    code,\n    default: defaultChecked,\n    description,\n    previous,\n    currency,\n    current,\n}) {\n    const PriceLarge = props => <span className=\"price large\">{props.children}</span>;\n    const PriceSmall = props => <span className=\"price small\">.{props.children}</span>;\n\n    return (\n        <StyledMembershipOption key={code}>\n            <input\n                type=\"radio\"\n                name=\"package\"\n                value={code}\n                id={code}\n                defaultChecked={defaultChecked}\n            />\n            <label className=\"option\" htmlFor={code}>\n                <div className=\"description\">\n                    <h2>{description.main}</h2>\n                    <span className=\"sub\">{description.sub}</span>\n                </div>\n                <div className=\"price\">\n                    <span className=\"previous primary primary-text\">\n                        {previous && (\n                            <span>\n                                was&nbsp;\n                                <span className=\"strike-through\">\n                                    <Money\n                                        currency={currency}\n                                        amount={previous}\n                                        Large={props => <span>{props.children}</span>}\n                                        Small={props => <span>.{props.children}</span>}\n                                    />\n                                </span>\n                            </span>\n                        )}\n                    </span>\n                    <span className=\"current\">\n                        <Money\n                            currency={currency}\n                            amount={current}\n                            Large={PriceLarge}\n                            Small={PriceSmall}\n                        />\n                    </span>\n                </div>\n            </label>\n        </StyledMembershipOption>\n    );\n}\n","import React, { useState } from 'react';\nimport styled, { css } from 'styled-components';\nimport MembershipOption from '../membership-option.jsx';\nimport Dialog from './dialog.jsx';\n\nconst Button = css`\n    display: block;\n    margin: auto;\n    margin-bottom: 5px;\n    background-color: var(--color-action);\n    color: var(--color-primary);\n    font-weight: bold;\n    border: 1px solid transparent;\n    padding: 0.85em 1em;\n\n    &:hover {\n        background-color: var(--color-action-button);\n    }\n`;\n\nconst InputButton = styled.input`\n    ${Button}\n`;\n\nconst AnchorButton = styled.a`\n    ${Button}\n`;\n\nfunction LockdownDialog({ user, setUser, state, site, packages, activate, reactivate, upgrade }) {\n    const [error, setError] = useState(undefined);\n    return <Dialog name=\"lockdown\">{createDialog()}</Dialog>;\n\n    function createDialog() {\n        switch (user && user.type) {\n            case `trial`:\n                if (\n                    !user.trialCredit &&\n                    state.page.current.video &&\n                    state.page.current.video.videoId\n                ) {\n                    return (\n                        <>\n                            <h1>Trial</h1>\n                            <p>You have access to one video.</p>\n                            <form onSubmit={attemptTrialCredit}>\n                                <h2>Do you want to watch this video?</h2>\n                                <InputButton\n                                    type=\"submit\"\n                                    value=\"WATCH\"\n                                    className=\"button primary primary-text\"\n                                />\n                            </form>\n                        </>\n                    );\n                }\n                return (\n                    <>\n                        <h1>Upgrade</h1>\n                        <p>\n                            Your trial lets you watch one video. Upgrade your account for full\n                            access.\n                        </p>\n                        <form onSubmit={attemptUpgrade}>\n                            <h2>Choose Your Membership</h2>\n                            {packages\n                                .filter(option => !option.code.includes(`trial`))\n                                .map(MembershipOption)}\n                            <InputButton\n                                type=\"submit\"\n                                value=\"CONTINUE\"\n                                className=\"button primary primary-text\"\n                            />\n                        </form>\n                    </>\n                );\n            case `expired`:\n                return (\n                    <>\n                        <h1>Expired</h1>\n                        <p>Your account has expired. Re-activate your account for full access.</p>\n                        <form onSubmit={attemptReactivate}>\n                            <h2>Re-activate Now</h2>\n                            {packages\n                                .filter(option => !option.code.includes(`trial`))\n                                .map(MembershipOption)}\n                            <InputButton\n                                type=\"submit\"\n                                value=\"CONTINUE\"\n                                className=\"button primary primary-text\"\n                            />\n                        </form>\n                        {<div className=\"error\">{error}</div>}\n                    </>\n                );\n            // case `linked`:\n            //     return (\n            //         <>\n            //             <h1>Activate</h1>\n            //             <p>You need to activate your account for full access.</p>\n            //             <form onSubmit={attemptActivate}>\n            //                 <h2>Activate Now</h2>\n            //                 {packages.map(MembershipOption)}\n            //                 <InputButton\n            //                     type=\"submit\"\n            //                     value=\"CONTINUE\"\n            //                     className=\"button primary primary-text\"\n            //                 />\n            //             </form>\n            //         </>\n            //     );\n            default:\n                return (\n                    <>\n                        <h1>Join {site.toUpperCase()}</h1>\n                        <p>An account is required to access this content.</p>\n                    </>\n                );\n        }\n    }\n\n    async function attemptTrialCredit(event) {\n        event.preventDefault();\n        setError(undefined);\n        try {\n            const response = await fetch(\n                `${state.root.key.api}/api/legacy/user/trial-credit?site=${state.root.$site}`,\n                {\n                    method: `post`,\n                    credentials: `include`,\n                    headers: {\n                        Accept: `application/json`,\n                        'Content-Type': `application/json`,\n                    },\n                    body: JSON.stringify({\n                        trialCredit: state.page.current.video.videoId,\n                    }),\n                }\n            );\n\n            if (response.ok) {\n                const { error, user } = await response.json();\n                if (error) {\n                    throw new Error(\n                        `Set trial credit request returned an error with code ${error.code}`\n                    );\n                }\n                setUser(user);\n                window.location.assign(`#`);\n                return;\n            }\n        } catch (error) {\n            console.error(`Error during trial credit`, error);\n            setError(`An error occurred. Please contact support.`);\n        }\n    }\n\n    async function attemptUpgrade(event) {\n        event.preventDefault();\n\n        // TODO: This should come from some global data\n        //  dependency\n        // const tracking = getTracking();\n        const formData = new FormData(event.target);\n        const form = Object.fromEntries(formData.entries());\n\n        await upgrade({\n            package: form.package,\n        });\n    }\n\n    async function attemptReactivate(event) {\n        event.preventDefault();\n        setError(undefined);\n        const formData = new FormData(event.target);\n        const form = Object.fromEntries(formData.entries());\n        try {\n            const response = await fetch(\n                `${state.root.key.api}/api/legacy/user/reactivate?site=${state.root.$site}`,\n                {\n                    method: `post`,\n                    credentials: `include`,\n                    headers: {\n                        Accept: `application/json`,\n                        'Content-Type': `application/json`,\n                    },\n                    body: JSON.stringify({\n                        package: form.package,\n                    }),\n                }\n            );\n            if (response.ok) {\n                const resp = await response.json();\n                if (resp.error) {\n                    throw new Error();\n                }\n\n                window.location.href = resp.link;\n            }\n        } catch (error) {\n            setError(`An error occurred. Please contact support.`);\n        }\n    }\n\n    // async function attemptActivate(event) {\n    //     event.preventDefault();\n    //     // TODO: This should come from some global data\n    //     //  dependency\n    //     // const tracking = getTracking();\n    //     const formData = new FormData(event.target);\n    //     const form = Object.fromEntries(formData.entries());\n\n    //     await activate({\n    //         package: form.package,\n    //     });\n    // }\n}\n\nexport default LockdownDialog;\n","import React from 'react';\nimport { useState } from 'react';\nimport styled from 'styled-components';\nimport Dialog from './dialog.jsx';\n\nconst Input = styled.input`\n    margin: auto;\n    margin-bottom: 5px;\n\n    display: block;\n    box-sizing: border-box;\n    width: 100%;\n    height: 2.4375rem;\n    padding: 0.5rem;\n    border: 1px solid #cacaca;\n    border-radius: 0;\n    font-family: inherit;\n    font-size: 1rem;\n    font-weight: normal;\n    color: #0a0a0a;\n    appearance: none;\n\n    overflow: visible;\n\n    :focus-visible {\n        outline: 0px;\n    }\n`;\n\nconst Button = styled.button`\n    display: block;\n    margin: auto;\n    margin-bottom: 5px;\n    width: 100%;\n    background-color: var(--color-action);\n    color: var(--color-primary);\n    font-weight: bold;\n    border: 1px solid transparent;\n    padding: 0.85em 1em;\n\n    &:hover {\n        background-color: var(--color-action-button);\n    }\n`;\n\nfunction ResetPasswordDialog({ state }) {\n    const [error, setError] = useState(undefined);\n    const [submitted, setSubmitted] = useState(false);\n\n    return (\n        <Dialog name=\"reset\" onClose={() => setSubmitted(false)}>\n            <h1>FORGOT / RESET YOUR PASSWORD?</h1>\n            {submitted ? (\n                <p>Please check your email including your spam folder</p>\n            ) : (\n                <>\n                    <p>Enter your email to reset your password</p>\n                    <form onSubmit={onSubmit}>\n                        <Input\n                            type=\"email\"\n                            placeholder=\"email\"\n                            name=\"email\"\n                            required\n                            autoComplete=\"email\"\n                        />\n                        {error && <div className=\"error\">{error}</div>}\n                        <Button type=\"submit\">RESET</Button>\n                    </form>\n                </>\n            )}\n        </Dialog>\n    );\n\n    async function onSubmit(event) {\n        event.preventDefault();\n\n        const interactionId = state.root.interaction.start();\n        try {\n            setError(undefined);\n            const email = event.target.elements.email.value;\n\n            const response = await fetch(\n                `${state.root.key.api}/api/legacy/user/reset-password?site=${state.root.$site}`,\n                {\n                    method: `post`,\n                    headers: {\n                        Accept: `application/json`,\n                        'Content-Type': `application/json`,\n                    },\n                    body: JSON.stringify({\n                        email,\n                    }),\n                }\n            );\n\n            if (response.ok) {\n                const { success } = await response.json();\n                if (success) {\n                    setSubmitted(true);\n                } else {\n                    setError(`Email not found`);\n                }\n            }\n        } catch (error) {\n            console.error(`Error while submitting reset password`, error);\n            setError(`Email not found`);\n        } finally {\n            state.root.interaction.end(interactionId);\n        }\n    }\n}\n\nexport default ResetPasswordDialog;\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst StyledOverlay = styled.div`\n    position: fixed; /* Sit on top of the page content */\n    width: 100%; /* Full width (cover the whole page) */\n    height: 100%; /* Full height (cover the whole page) */\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background-color: var(--color-overlay);\n    z-index: 1002;\n\n    display: flex;\n    flex-direction: column;\n    justify-items: center;\n    justify-content: center;\n\n    .text {\n        color: var(--color-primary);\n        font-size: 3.5em;\n    }\n\n    .spinner,\n    .text {\n        margin-left: auto;\n        margin-right: auto;\n        width: auto;\n        text-align: center;\n    }\n\n    .spinner {\n        position: relative;\n        width: 80px;\n        height: 80px;\n    }\n\n    .spinner div {\n        display: inline-block;\n        position: absolute;\n        left: 8px;\n        width: 16px;\n        background: var(--color-spinner);\n        animation: spinner 1.2s cubic-bezier(0, 0.5, 0.5, 1) infinite;\n    }\n\n    .spinner div:nth-child(1) {\n        left: 8px;\n        animation-delay: -0.24s;\n    }\n    .spinner div:nth-child(2) {\n        left: 32px;\n        animation-delay: -0.12s;\n    }\n    .spinner div:nth-child(3) {\n        left: 56px;\n        animation-delay: 0;\n    }\n\n    @keyframes spinner {\n        0% {\n            top: 8px;\n            height: 64px;\n        }\n        50%,\n        100% {\n            top: 24px;\n            height: 32px;\n        }\n    }\n`;\n\nexport default function BusyOverlay(props) {\n    const { children, text, state, ...rest } = props;\n    const loading = state.interaction.useBusy();\n    if (!loading) {\n        return null;\n    }\n\n    return (\n        <StyledOverlay {...rest}>\n            {loading && (\n                <div className=\"spinner\">\n                    <div></div>\n                    <div></div>\n                    <div></div>\n                </div>\n            )}\n            {text && <div className=\"text\">{text}</div>}\n            {children}\n        </StyledOverlay>\n    );\n}\n","export default __webpack_public_path__ + \"static/media/300x250-viviantaylor1.cadb4396.jpg\";","import React, { useEffect } from 'react';\nimport styled from 'styled-components';\nimport dummyAd from '../artifacts/300x250-viviantaylor1.jpg';\n\nconst Title = styled.h2`\n    text-transform: uppercase;\n    font-size: 1.25em;\n    margin: 0.25em;\n    margin-top: 1em;\n    text-align: center;\n`;\n\nconst StyledDiscounts = styled.div`\n    display: flex;\n    flex-direction: column;\n    justify-content: left;\n    align-items: left;\n    width: 100%;\n\n    div {\n        display: flex;\n        justify-content: center;\n    }\n`;\n\nexport function Discounts({ title, hide }) {\n    const isServerSide = typeof window === `undefined`;\n    const insertDummyAd =\n        !isServerSide &&\n        (window.location.origin.includes(`localhost`) || window.location.origin.includes(`test.`));\n\n    useEffect(() => {\n        if (!isServerSide && !hide && !insertDummyAd) {\n            const script = document.createElement(`script`);\n\n            script.text = `\n            (function(ac) {\n                var d = document, s = 'script', id = 'adplugg-adjs';\n                var js, fjs = d.getElementsByTagName(s)[0];\n                if (d.getElementById(id)) return;\n                js = d.createElement(s); js.id = id; js.async = 1;\n                js.src = '//www.adplugg.com/apusers/serve/' + ac + '/js/1.1/ad.js';\n                fjs.parentNode.insertBefore(js, fjs);\n              }('A48214987'));`;\n\n            document.body.appendChild(script);\n\n            return () => {\n                document.body.removeChild(script);\n            };\n        }\n    }, [hide, insertDummyAd, isServerSide]);\n\n    return hide ? null : (\n        <StyledDiscounts>\n            {title && <Title>{title}</Title>}\n            {insertDummyAd ? (\n                <div>\n                    <img src={dummyAd} alt=\"\" width={300} height={250} />\n                </div>\n            ) : (\n                <div className=\"adplugg-tag\" data-adplugg-zone=\"footer_1_300x250\"></div>\n            )}\n        </StyledDiscounts>\n    );\n}\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst StyledPage = styled.div`\n    margin-left: auto;\n    margin-right: auto;\n\n    .callout {\n        background-color: #f7e4e1;\n        padding: 1em;\n        border: 1px solid rgba(var(--color-primary-text-rgb), 0.25);\n    }\n\n    a,\n    a:link,\n    a:visited,\n    a:hover {\n        color: #f000ff;\n        text-decoration: underline;\n    }\n`;\n\nexport default function PageWebmasters({ state }) {\n    const site = state.root.$site.toUpperCase();\n    const mailTo = `mailto:${state.root.email.$contact}`;\n    return (\n        <StyledPage className=\"page\">\n            <h1>{site} AFFILIATE PROGRAM</h1>\n            <div>\n                <p>Welcome webmasters and thank you for your interest in promoting {site}.</p>\n                <p>\n                    <strong>AFFILIATE LOGIN:</strong>\n                    {` `}\n                    <a href=\"https://www.verotel.com/login\">Click Here</a>\n                </p>\n                <p>\n                    <strong>AFFILIATE REGISTRATION:</strong>\n                    {` `}\n                    <a href=\"https://controlcenter.verotel.com/register-reseller?website=elx7rq9lk3m1xlg9jlkcu9d6uh648ju7nva7cgvv\">\n                        Click Here\n                    </a>\n                </p>\n                <p>\n                    We are a small and simple operation so we currently use{` `}\n                    <a href=\"https://controlcenter.verotel.com/register-reseller?website=elx7rq9lk3m1xlg9jlkcu9d6uh648ju7nva7cgvv\">\n                        Verotel's\n                    </a>\n                    {` `}\n                    built-in sales-tracking platform to record and track sales.\n                </p>\n                <p>\n                    <strong>AFFILIATE PAYOUT:</strong> 50%\n                </p>\n                <p>\n                    <strong>PRIMARY PAYMENT PROCESSOR:</strong> Verotel\n                </p>\n                <p>\n                    <strong>METHODS OF PAYMENT:</strong> Cheques, Wire Transfers\n                </p>\n                <p>\n                    We don't have much promotional content. If there is something you need, you can\n                    {` `}\n                    <a href={mailTo}>contact us</a> and we'll be happy to supply what we can and\n                    make custom creatives if time permits\n                </p>\n            </div>\n        </StyledPage>\n    );\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport constants from '../../constants.js';\n\nconst StyledCard = styled.div`\n    display: flex;\n    flex-direction: column;\n    justify-content: space-evenly;\n    text-align: center;\n    margin: 1em;\n\n    @media (min-width: ${constants.size.standard}) {\n        flex-direction: row;\n        div {\n            margin-top: 10em;\n        }\n    }\n`;\n\nfunction CardError({ title, info, error, state, image }) {\n    const site = state.root.$site;\n    const email = state.root.email.$support;\n    const subject = encodeURIComponent(`${site} site error`);\n    const body = encodeURIComponent(\n        [\n            `An error occurred on ${site}.com.`,\n            ``,\n            ...Object.entries(errorContext()).map(([name, value]) => `${name}: ${value}`),\n            ``,\n            error,\n        ].join(`\\n`)\n    );\n\n    const mailLink = `mailto:${email}?subject=${subject}&body=${body}`;\n    return (\n        <StyledCard>\n            {image}\n            <div style={{ flexGrow: 1 }}>\n                <h1>{title}</h1>\n                <p>{info}</p>\n                {error && (\n                    <>\n                        <p>\n                            Try again, and if the problem persists, please send this to{` `}\n                            <a href={mailLink}>{email}</a> (Text please, no screenshots)\n                        </p>\n                        <div>\n                            <span className=\"break\">{error}</span>\n                        </div>\n                    </>\n                )}\n            </div>\n        </StyledCard>\n    );\n\n    function errorContext() {\n        if (typeof window === `undefined`) {\n            return {};\n        }\n\n        const { innerWidth: width, innerHeight: height } = window;\n\n        return {\n            URL: window.location.href,\n            Time: new Date().toISOString(),\n            'User Agent': navigator.userAgent,\n            Screen: `${width}x${height}`,\n        };\n    }\n}\n\nexport default CardError;\n","export default __webpack_public_path__ + \"static/media/500.dbab06e6.jpg\";","import React from 'react';\nimport CardError from '../component/card/error.jsx';\n\nimport image500 from '../artifacts/500.jpg';\n\nexport default function PageServerError({ error, state }) {\n    return (\n        <div className=\"page\">\n            <CardError\n                state={state.root}\n                title=\"Oof!\"\n                info=\"We're so sorry, but something went very wrong\"\n                error={error}\n                image={<img src={image500} alt=\"Surprised pikachu face (Server error)\" />}\n            />\n        </div>\n    );\n}\n","export default __webpack_public_path__ + \"static/media/404.c1d574fa.jpg\";","import React from 'react';\nimport CardError from '../component/card/error.jsx';\n\nimport image404 from '../artifacts/404.jpg';\n\nexport default function PageNotFound({ state }) {\n    return (\n        <div className=\"page\">\n            <CardError\n                state={state.root}\n                title=\"Oops!\"\n                info=\"Wrong hole baby! (We can't find what you're looking for!)\"\n                image={<img src={image404} alt=\"Not found face\" />}\n            />\n        </div>\n    );\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport constant from '../../constants.js';\n\nconst StyledSlide = styled.div`\n    margin-left: auto;\n    margin-right: auto;\n    position: relative;\n\n    .badge {\n        position: absolute;\n        left: 2%;\n        top: 5%;\n        padding: 0.75em;\n        text-transform: uppercase;\n    }\n\n    .badge > h3 {\n        margin: 0;\n        font-size: 1em;\n        font-weight: bold;\n    }\n\n    .ribbon {\n        position: absolute;\n        left: 0;\n        top: 0;\n        bottom: 0;\n        right: 0;\n    }\n\n    .ribbon > .info {\n        color: var(--color-action-text);\n    }\n\n    @media all and (max-width: ${constant.size.medium}) and (max-aspect-ratio: 1 / 1) {\n        .ribbon {\n            display: flex;\n            flex-direction: column;\n        }\n\n        .ribbon > .background {\n            position: relative;\n            flex-grow: 1;\n            opacity: 0;\n        }\n\n        .ribbon > .info {\n            font-size: 1.25em;\n            flex-grow: 0;\n            text-shadow: 2px 2px 3px var(--color-tertiary-text);\n            text-align: center;\n        }\n    }\n\n    @media not all and (max-width: ${constant.size.medium}) and (max-aspect-ratio: 1 / 1) {\n        .ribbon {\n            display: block;\n        }\n\n        .ribbon > .background {\n            position: absolute;\n            left: 0;\n            top: 0;\n            bottom: 0;\n            width: 27.5%;\n            transform: skewX(-10deg);\n            transform-origin: left bottom;\n            opacity: 0.8;\n        }\n\n        .ribbon > .info {\n            position: absolute;\n            left: 7%;\n            top: 15%;\n            bottom: 0;\n            width: 22%;\n            word-wrap: break-word;\n        }\n    }\n\n    @media (max-width: ${constant.size.small}) {\n        .ribbon {\n            font-size: 0.8em;\n        }\n\n        .badge {\n            font-size: 0.8em;\n        }\n    }\n`;\nconst StyledPicture = styled.picture`\n    img {\n        display: block;\n        width: 100%;\n    }\n`;\n\nexport default function SlideInfo(props) {\n    const { size, title, info, type, source, Action, ...rest } = props;\n    return (\n        <StyledSlide className=\"slide info border\" {...rest}>\n            <div className=\"image\">\n                <StyledPicture>\n                    <source srcSet={source.landscape.x1} media={`(min-width: ${size.medium})`} />\n                    <source srcSet={source.landscape.x1} media={`(min-aspect-ratio: 1 / 1)`} />\n                    <source srcSet={source.portraight.x1} />\n                    <img src={source.landscape.x1} alt={title} />\n                </StyledPicture>\n            </div>\n            <div className=\"ribbon\">\n                <div className=\"background action\"></div>\n                <div className=\"info\">\n                    <h1>\n                        {title} {info && `- `}\n                        {info}\n                    </h1>\n                    <div>{Action && <Action />}</div>\n                </div>\n            </div>\n            <div className=\"badge\">\n                <h3>{type}</h3>\n            </div>\n        </StyledSlide>\n    );\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport { LazyLoadImage } from 'react-lazy-load-image-component';\n\nconst Container = styled.div`\n    display: flex;\n    flex-direction: column;\n\n    img {\n        width: 100%;\n    }\n`;\n\nconst Title = styled.h2`\n    font-size: ${({ size }) => size || `1em`};\n    text-transform: ${({ textTransform }) => textTransform || `uppercase`};\n    margin: 0.5em;\n    color: var(--color-tertiary-text);\n\n    ${({ blur }) =>\n        blur &&\n        `color: transparent;\n        text-shadow: 0 0 10px rgba(0,0,0,0.5);`}\n`;\n\nexport default function CardImageTitled({\n    title,\n    titleSize,\n    textTransform,\n    image,\n    lazy,\n    blurTitle,\n}) {\n    return (\n        <Container>\n            {lazy ? (\n                <LazyLoadImage src={image.x1} alt={title} />\n            ) : (\n                <img src={image.x1} alt={title} />\n            )}\n            {title && (\n                <Title blur={blurTitle} size={titleSize} textTransform={textTransform}>\n                    {title}\n                </Title>\n            )}\n        </Container>\n    );\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport constant from '../constants.js';\n\nconst StyledCards = styled.div`\n    display: flex;\n    flex-direction: row;\n    flex-wrap: wrap;\n    justify-content: center;\n    margin-left: 1px;\n    margin-right: 1px;\n\n    & > * {\n        box-sizing: border-box;\n        display: inline-block;\n        padding-left: 1px;\n        padding-right: 1px;\n        padding-bottom: 0.5em;\n        flex-grow: 0;\n        flex-shrink: 1;\n\n        flex-basis: ${({ desktopColumns }) => 100 / desktopColumns}%;\n\n        @media (max-width: ${constant.size.mobile}) {\n            flex-basis: ${({ mobileColumns }) => 100 / mobileColumns}%;\n        }\n    }\n`;\n\nexport default function Cards({ children, desktopColumns = 3, mobileColumns = 1 }) {\n    const childrenArray = React.Children.toArray(children);\n    return (\n        <StyledCards desktopColumns={desktopColumns} mobileColumns={mobileColumns}>\n            {childrenArray.map(child => (\n                <div key={child.key}>{child}</div>\n            ))}\n        </StyledCards>\n    );\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport Navigate from '../container/navigate.jsx';\nimport constant from '../constants.js';\n\nconst Styles = styled.div`\n    background-color: var(--color-action);\n\n    img {\n        display: block;\n        width: 100%;\n        margin: 0;\n        padding: 0;\n    }\n`;\n\nexport function Banner({ state, special, specialLink }) {\n    return (\n        <Styles>\n            <div className=\"page\">\n                <Navigate href={specialLink} state={state.root}>\n                    <picture>\n                        <source\n                            srcSet={special.landscape.x1}\n                            media={`(min-width: ${constant.size.small})`}\n                        />\n                        <source srcSet={special.landscape.x1} media={`(min-aspect-ratio: 1 / 1)`} />\n                        <source srcSet={special.portraight.x1} />\n                        <img src={special.landscape.x1} alt=\"Join Fit18\" />\n                    </picture>\n                </Navigate>\n            </div>\n        </Styles>\n    );\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport constant from '../constants.js';\nimport SlideInfo from '../component/slide/info.jsx';\nimport CardImageTitled from '../component/card/image-titled.jsx';\nimport Navigate from '../container/navigate.jsx';\nimport Cards from '../container/cards.jsx';\nimport { Discounts } from '../container/discounts.jsx';\nimport { Banner } from '../component/banner.jsx';\n\nconst StyledPage = styled.div`\n    display: flex;\n    flex-direction: column;\n`;\n\nconst BannerContainer = styled.div`\n    margin-bottom: 1em;\n`;\n\nconst Title = styled.h2`\n    text-transform: uppercase;\n    font-size: 1.25em;\n    margin: 0.25em;\n    margin-top: 1em;\n`;\n\nconst PlayArrow = styled.div`\n    width: 0;\n    height: 0;\n    border-top: 7px solid transparent;\n    border-bottom: 7px solid transparent;\n    border-left: 8px solid var(--color-action-text);\n    display: inline-block;\n    margin-right: 0.25em;\n`;\n\nconst WatchNowButton = styled.div`\n    color: var(--color-action-text);\n    text-transform: uppercase;\n    @media all and (max-width: ${constant.size.medium}) {\n        font-size: 0.9em;\n        h2 > span {\n            position: relative;\n            padding: 0.5em;\n            background-color: rgba(var(--color-action-active-rgb), 0.8);\n        }\n    }\n`;\n\nconst linkStyle = { width: `100%` };\n\nconst OurStory = styled.div`\n    margin-left: 1em;\n    margin-right: 1em;\n\n    h1 {\n        text-align: center;\n    }\n`;\n\nconst News = styled.div`\n    display: flex;\n    margin-left: 1em;\n    margin-right: 1em;\n\n    @media (max-width: ${constant.size.mobile}) {\n        flex-direction: column;\n    }\n`;\n\nconst Column = styled.div`\n    flex-basis: ${({ size }) => size || `33.3%`};\n\n    @media (max-width: ${constant.size.mobile}) {\n        flex-basis: inherit;\n    }\n`;\n\nconst TextContent = styled.div`\n    margin: 0.25em;\n    margin-top: 1.5em;\n    font-family: var(--font-tertiary);\n`;\n\nconst TitleContainer = styled.div`\n    display: flex;\n    justify-content: space-between;\n`;\n\nconst ViewAll = styled(Navigate)`\n    margin-bottom: 0.4em;\n    margin-right: 0.2em;\n    align-self: flex-end;\n    font-size: 0.875em;\n    padding: 0.3em;\n    padding-left: 1em;\n    padding-right: 1em;\n    font-weight: 600;\n`;\n\nexport default function PageHome({ state, user }) {\n    const latest = state.useLatest();\n    const recentModels = state.useRecentModels();\n    const features = state.useFeatures();\n    const next = state.useNext();\n    const news = state.useNews();\n    const ourStory = state.useOurStory();\n    const special = state.useSpecial();\n    const specialLink = state.useSpecialLink();\n\n    return (\n        <>\n            {!user && (\n                <BannerContainer>\n                    <Banner state={state} special={special} specialLink={specialLink} />\n                </BannerContainer>\n            )}\n            <StyledPage className=\"page\">\n                <Navigate\n                    state={state.root}\n                    style={linkStyle}\n                    href={`/videos/${latest.videoId}`}\n                    disabled={latest.loading}\n                >\n                    <SlideInfo\n                        size={constant.size}\n                        title={latest.models[0].name}\n                        info={latest.description.home}\n                        type=\"Latest Update\"\n                        source={latest.homeImage}\n                        Action={() => (\n                            <WatchNowButton className=\"watch-now primary-text\">\n                                <div className=\"background primary\"></div>\n                                <h2>\n                                    <span>\n                                        <PlayArrow />\n                                        Watch Now\n                                    </span>\n                                </h2>\n                            </WatchNowButton>\n                        )}\n                    />\n                </Navigate>\n                <TitleContainer>\n                    <Title>Recent Updates</Title>\n                    <ViewAll state={state.root} href={`/models`} className=\"action\">\n                        View all\n                    </ViewAll>\n                </TitleContainer>\n                <Cards>\n                    {recentModels.map(model => (\n                        <Navigate\n                            state={state.root}\n                            key={model.modelId}\n                            href={`/models/${model.modelId}`}\n                        >\n                            <CardImageTitled\n                                title={model.name}\n                                image={model.image.portraight}\n                                blurTitle={model.loading}\n                            />\n                        </Navigate>\n                    ))}\n                </Cards>\n                <>\n                    {features.map(feature => (\n                        <React.Fragment key={feature.title}>\n                            <Title>{feature.title}</Title>\n                            <Cards>\n                                {feature.content.map(item => {\n                                    return (\n                                        <Navigate\n                                            state={state.root}\n                                            key={item.videoId || item.modelId}\n                                            href={\n                                                (item.videoId && `/videos/${item.videoId}`) ||\n                                                `/models/${item.modelId}`\n                                            }\n                                            disabled={item.loading}\n                                        >\n                                            <CardImageTitled\n                                                title={item.title}\n                                                titleSize=\"0.875em\"\n                                                textTransform=\"none\"\n                                                image={item.image.landscape}\n                                                blurTitle={item.loading}\n                                            />\n                                        </Navigate>\n                                    );\n                                })}\n                            </Cards>\n                        </React.Fragment>\n                    ))}\n                </>\n                {next && (\n                    <SlideInfo\n                        size={constant.size}\n                        info={next.description.coming}\n                        title={next.models[0].name}\n                        type=\"Coming soon\"\n                        source={next.homeImage}\n                        style={linkStyle}\n                    />\n                )}\n                {!user && (\n                    <OurStory>\n                        <h1>{ourStory.name}</h1>\n                        <TextContent\n                            dangerouslySetInnerHTML={{ __html: ourStory.value }}\n                        ></TextContent>\n                    </OurStory>\n                )}\n                {user && (\n                    <News>\n                        <Column size=\"66.6%\">\n                            <Title>{news.name}</Title>\n                            <TextContent\n                                dangerouslySetInnerHTML={{ __html: news.value }}\n                            ></TextContent>\n                        </Column>\n                        <Column>\n                            <Title>DISCOUNTS FROM OUR FRIENDS</Title>\n                            <Discounts />\n                        </Column>\n                    </News>\n                )}\n            </StyledPage>\n        </>\n    );\n}\n","import React, { useRef, useEffect } from 'react';\nimport styled from 'styled-components';\nimport Navigate from '../container/navigate.jsx';\nimport Cards from '../container/cards.jsx';\nimport CardImageTitled from '../component/card/image-titled.jsx';\nimport { Spinner } from '../component/element/spinner.jsx';\n\nconst MAX_IMAGES = 10;\nconst LOAD_PADDING = 800;\n\nconst StyledPage = styled.div`\n    width: 100%;\n    margin-left: auto;\n    margin-right: auto;\n`;\n\nconst Title = styled.h1`\n    font-size: 1.5em;\n    text-align: center;\n    text-transform: uppercase;\n`;\n\nexport default function PageModels({ state }) {\n    const models = state.useModels();\n    const contentRef = useRef(null);\n\n    useEffect(() => {\n        document.addEventListener(`scroll`, onScroll);\n        return () => document.removeEventListener(`scroll`, onScroll);\n\n        function onScroll() {\n            if (hasReachedBottom(contentRef)) {\n                state.next();\n            }\n        }\n    }, [models]);\n\n    return (\n        <StyledPage className=\"page\" ref={contentRef}>\n            <Title className=\"heading\">All Models</Title>\n            <Cards mobileColumns={2}>\n                {models.map((model, index) => (\n                    <Navigate\n                        state={state.root}\n                        key={model.modelId}\n                        href={`/models/${model.modelId}`}\n                    >\n                        <CardImageTitled\n                            title={model.name}\n                            image={model.image.portraight}\n                            blurTitle={model.loading}\n                            lazy={index >= MAX_IMAGES}\n                        />\n                    </Navigate>\n                ))}\n            </Cards>\n            {models[models.length - 1]?.isLast ? null : <Spinner />}\n        </StyledPage>\n    );\n\n    function hasReachedBottom(ref) {\n        if (ref.current) {\n            const bounds = ref.current.getBoundingClientRect();\n            const threshold = window.innerHeight + LOAD_PADDING;\n            const reached = bounds.bottom <= threshold;\n            return reached;\n        } else {\n            return false;\n        }\n    }\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport constant from '../../constants.js';\n\nconst StyledCard = styled.div`\n    position: relative;\n\n    @media (max-width: ${constant.size.small}) {\n        display: flex;\n        flex-direction: column;\n    }\n\n    img {\n        display: block;\n        width: 100%;\n    }\n\n    .info {\n        margin: 0;\n        color: var(--color-card-text);\n        background-color: rgba(var(--color-card-rgb), 0.8);\n        padding: 2em;\n        padding-left: 4em;\n        padding-right: 4em;\n        text-align: center;\n        border: 1px solid var(--color-border);\n        text-transform: uppercase;\n    }\n\n    @media (min-width: ${constant.size.small}) {\n        .info {\n            position: absolute;\n            left: 5%;\n            top: 3%;\n        }\n    }\n\n    @media (max-width: ${constant.size.small}) {\n        .info {\n            position: relative;\n        }\n        .info:before {\n            // This is the arrow\n            content: ' ';\n            position: absolute;\n            left: 15%;\n            top: -1.5em;\n            width: 0em;\n            height: 0em;\n            border: 0.75em solid transparent;\n            border-bottom: 0.75em solid var(--color-card);\n        }\n    }\n\n    @media (min-width: ${constant.size.small}) and (max-width: ${constant.size.standard}) {\n        .info {\n            font-size: 0.8em;\n        }\n    }\n\n    h2,\n    h3 {\n        text-transform: uppercase;\n    }\n\n    h2 {\n        font-weight: 800;\n    }\n\n    h3 {\n        border-top: 1px solid var(--color-border);\n        padding-top: 1em;\n    }\n\n    @media (max-width: ${constant.size.small}) {\n        h3 {\n            padding-top: 0.5em;\n        }\n\n        h4 {\n            padding-bottom: 0;\n            margin-bottom: 0;\n        }\n    }\n`;\n\nexport default function CardImageInfo({ title, info, source }) {\n    return (\n        <StyledCard className=\"card model border\">\n            <picture>\n                <source\n                    srcSet={source.landscape.x1}\n                    media={`(min-width: ${constant.size.small})`}\n                />\n                <source srcSet={source.landscape.x1} media={`(min-aspect-ratio: 1 / 1)`} />\n                <source srcSet={source.portraight.x1} />\n                <img src={source.landscape.x1} alt={title} />\n            </picture>\n            <div className=\"card info\">\n                <h1>{title}</h1>\n                {info.map((entry, index) => (\n                    <div key={index} className=\"entry\">\n                        <h3>{entry.name}</h3>\n                        <h4>{entry.value}</h4>\n                    </div>\n                ))}\n            </div>\n        </StyledCard>\n    );\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport Navigate from '../container/navigate.jsx';\nimport CardImageInfo from '../component/card/image-info.jsx';\nimport CardImageTitled from '../component/card/image-titled.jsx';\nimport Cards from '../container/cards.jsx';\n\nconst StyledPage = styled.div`\n    position: relative;\n\n    h1 {\n        text-align: center;\n    }\n\n    .page {\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        align-items: center;\n        width: 100%;\n        margin-left: auto;\n        margin-right: auto;\n    }\n`;\n\nexport default function PageModel({ state }) {\n    const model = state.useModel();\n    const modelInfo = [\n        { name: `Height`, value: unit(model.dimensions.height, `cm`) },\n        { name: `Weight`, value: unit(model.dimensions.weight, `kg`) },\n        {\n            name: `Measurements`,\n            value: measurements(model.dimensions.measurements),\n        },\n    ];\n\n    return (\n        <StyledPage>\n            <CardImageInfo title={model.name} source={model.image} info={modelInfo} />\n            {model.videos.length > 0 && (\n                <div className=\"page\">\n                    <h1 className=\"heading\">Videos</h1>\n                    <Cards>\n                        {model.videos.map(video => (\n                            <Navigate\n                                state={state.root}\n                                key={video.videoId}\n                                href={`/videos/${video.videoId}`}\n                                disabled={video.loading}\n                            >\n                                <CardImageTitled\n                                    title={video.title}\n                                    image={video.image.landscape}\n                                    blurTitle={video.loading}\n                                />\n                            </Navigate>\n                        ))}\n                    </Cards>\n                </div>\n            )}\n        </StyledPage>\n    );\n\n    function unit(value, scale) {\n        if (value > 0 === false) {\n            return value;\n        } else {\n            return `${value}${scale}`;\n        }\n    }\n\n    function measurements(value) {\n        if (value && typeof value === `object`) {\n            return [\n                model.dimensions.measurements.cup,\n                model.dimensions.measurements.waist,\n                model.dimensions.measurements.hips,\n            ].join(` - `);\n        } else {\n            return String(value);\n        }\n    }\n}\n","import React, { useEffect, useRef } from 'react';\nimport styled from 'styled-components';\nimport CardImageTitled from '../component/card/image-titled.jsx';\nimport Navigate from '../container/navigate.jsx';\nimport { Spinner } from '../component/element/spinner.jsx';\nimport Cards from '../container/cards.jsx';\n\nconst MAX_IMAGES = 5;\nconst LOAD_PADDING = 800;\n\nconst StyledPage = styled.div`\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n    width: 100%;\n    margin-left: auto;\n    margin-right: auto;\n`;\n\nconst Title = styled.h1`\n    font-size: 1.5em;\n    text-align: center;\n    text-transform: uppercase;\n`;\n\nexport default function PageVideos({ state }) {\n    const videos = state.useVideos();\n    const contentRef = useRef(null);\n\n    useEffect(() => {\n        document.addEventListener(`scroll`, onScroll);\n        return () => document.removeEventListener(`scroll`, onScroll);\n\n        function onScroll() {\n            if (hasReachedBottom(contentRef)) {\n                state.next();\n            }\n        }\n    }, [videos]);\n\n    return (\n        <StyledPage className=\"page\" ref={contentRef}>\n            <Title className=\"heading\">All Videos</Title>\n            <Cards>\n                {videos.map((video, index) => (\n                    <Navigate\n                        state={state.root}\n                        key={video.videoId}\n                        href={`/videos/${video.videoId}`}\n                        disabled={video.loading}\n                    >\n                        <CardImageTitled\n                            title={video.title}\n                            image={video.image.landscape}\n                            blurTitle={video.loading}\n                            lazy={index >= MAX_IMAGES}\n                        />\n                    </Navigate>\n                ))}\n            </Cards>\n            {videos[videos.length - 1]?.isLast ? null : <Spinner />}\n        </StyledPage>\n    );\n\n    function hasReachedBottom(ref) {\n        if (ref.current) {\n            const bounds = ref.current.getBoundingClientRect();\n            const threshold = window.innerHeight + LOAD_PADDING;\n            const reached = bounds.bottom <= threshold;\n            return reached;\n        } else {\n            return false;\n        }\n    }\n}\n","import React from 'react';\nimport { Stream } from '@cloudflare/stream-react';\n\nexport default function CloudflarePlayer(props) {\n    const { src, controls, width, height, poster } = props;\n    return (\n        <Stream\n            className=\"cloudflare-player\"\n            src={src}\n            controls={controls}\n            width={width}\n            height={height}\n            poster={poster}\n            autoplay={false}\n            preload=\"auto\"\n            primaryColor={process.env.THEME}\n            onError={() => window.location.reload()}\n        />\n    );\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport placeholder from '../../../lib/placeholder.js';\n\n// TODO: Re-implement loadable\n// const PlayerCloudflare = loadable(() => import('./cloudflare.jsx'));\nimport PlayerCloudflare from './cloudflare.jsx';\n// import PlayerVideoJs from './videojs.jsx';\n\nconst UnavailableStyle = styled.a`\n    position: relative;\n    width: 100%;\n    .play {\n        position: absolute;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        left: 0;\n\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        align-items: center;\n\n        svg {\n            width: 30%;\n            height: 30%;\n        }\n    }\n`;\n\nconst LoadingStyle = styled.div`\n    position: relative;\n    width: 100%;\n    .spinner-container {\n        position: absolute;\n        top: 0;\n        right: 0;\n        bottom: 0;\n        left: 0;\n\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        align-items: center;\n    }\n\n    .spinner {\n        position: relative;\n        width: 80px;\n        height: 80px;\n    }\n\n    .spinner div {\n        display: inline-block;\n        position: absolute;\n        left: 8px;\n        width: 16px;\n        background: var(--color-spinner);\n        animation: spinner 1.2s cubic-bezier(0, 0.5, 0.5, 1) infinite;\n    }\n\n    .spinner div:nth-child(1) {\n        left: 8px;\n        animation-delay: -0.24s;\n    }\n    .spinner div:nth-child(2) {\n        left: 32px;\n        animation-delay: -0.12s;\n    }\n    .spinner div:nth-child(3) {\n        left: 56px;\n        animation-delay: 0;\n    }\n\n    @keyframes spinner {\n        0% {\n            top: 8px;\n            height: 64px;\n        }\n        50%,\n        100% {\n            top: 24px;\n            height: 32px;\n        }\n    }\n`;\n\nexport default function VideoPlayer(props) {\n    // TODO: When server side rendering we should always render the img\n    // TODO: We don't even want to load the cloudlfare player!\n    const { userHasAccess, src, loading, width, height, controls, poster, thumbnails, event } =\n        props;\n    const image = poster?.x1 || placeholder(width, height);\n    if (!userHasAccess) {\n        return (\n            <UnavailableStyle href=\"#lockdown\">\n                <img src={image} width={width} height={height} />\n                <div className=\"play\">\n                    <svg viewBox=\"0 0 48 48\" fill=\"#fff\">\n                        <path d=\"M14 15.06V33a2 2 0 002.93 1.77l17.09-8.97a2 2 0 000-3.54L16.93 13.3A2 2 0 0014 15.06z\"></path>\n                    </svg>\n                </div>\n            </UnavailableStyle>\n        );\n    }\n    if (loading) {\n        return (\n            <LoadingStyle>\n                <img src={image} width={width} height={height} />\n                <div className=\"spinner-container\">\n                    <div className=\"spinner\">\n                        <div></div>\n                        <div></div>\n                        <div></div>\n                    </div>\n                </div>\n            </LoadingStyle>\n        );\n    }\n\n    return <PlayerCloudflare width={width} controls={controls} poster={image} src={src} />;\n}\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst StyledCard = styled.div`\n    position: relative;\n    padding: 1em;\n    margin: 0;\n\n    h2 {\n        text-transform: uppercase;\n        text-align: center;\n        margin-top: 0;\n    }\n`;\n\nconst DownloadButton = styled.button`\n    display: block;\n    width: calc(100% - 0.4em);\n    box-sizing: border-box;\n    margin: 0.2em;\n    padding: 0.5em;\n    font-size: 1em;\n    border: 0;\n    cursor: pointer;\n    font-weight: 600;\n`;\n\nexport default function CardDownload({ state, downs, onDownloadClick = onDownloadClickDefault }) {\n    const downloads = downs || state.useDownloads();\n    if (!downloads || downloads.length === 0) {\n        return null;\n    }\n\n    const isLoading = downloads.every(download => download.uri === false);\n    const extra = isLoading ? [`blur`] : [];\n    const className = (...existing) => [...existing, ...extra].join(` `);\n    return (\n        <StyledCard className=\"card border half\">\n            <h2 className={className()}>Downloads</h2>\n            {downloads.map(download => {\n                const uri = download.uri === false ? undefined : download.uri || `#lockdown`;\n                return (\n                    <a\n                        key={download.title}\n                        href={uri}\n                        onClick={event => {\n                            if (uri) {\n                                onDownloadClick(event, download.uri);\n                            }\n                        }}\n                    >\n                        <DownloadButton className={className(`action`)}>\n                            {download.title}\n                        </DownloadButton>\n                    </a>\n                );\n            })}\n        </StyledCard>\n    );\n}\n\nfunction onDownloadClickDefault() {\n    // Do nothing so the anchor follows the standard href\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport constants from '../../constants.js';\n\nconst StyledDiv = styled.div`\n    display: flex;\n    flex-direction: row;\n    flex-wrap: nowrap;\n\n    .column2 {\n        width: 50%;\n    }\n    .column3 {\n        width: 33.333%;\n    }\n    .column4 {\n        width: 25%;\n    }\n    .column5 {\n        width: 20%;\n    }\n    .column6 {\n        width: 16.666%;\n    }\n`;\n\nexport default function Masonry(props) {\n    const { documentWidth, children: elements, columns: explicitColumns = 6, ...rest } = props;\n    const colCount = Math.min(explicitColumns, columnCount(documentWidth));\n\n    const columns = Array(colCount)\n        .fill(0)\n        .map((value, colIdx) => {\n            const result = [];\n            for (let eleIdx = colIdx; eleIdx < elements.length; eleIdx = eleIdx + colCount) {\n                result.push(elements[eleIdx]);\n            }\n            return result;\n        });\n    return (\n        <StyledDiv {...rest}>\n            {columns.map((column, index) => {\n                const columnClass = `column${colCount}`;\n                return (\n                    <div key={index} className={columnClass}>\n                        {column}\n                    </div>\n                );\n            })}\n        </StyledDiv>\n    );\n}\n\nfunction columnCount(documentWidth) {\n    if (documentWidth <= pxValue(constants.size.small)) {\n        return 2;\n    } else if (documentWidth <= pxValue(constants.size.standard)) {\n        return 3;\n    } else if (documentWidth <= pxValue(constants.size.large)) {\n        return 5;\n    } else {\n        return 6;\n    }\n}\n\nfunction pxValue(cssValue) {\n    const un = unit(cssValue);\n    const value = parseFloat(cssValue);\n    switch (un) {\n        case `px`:\n            return value;\n        case `em`:\n            return value * baseFontSize();\n        default:\n            throw new Error(`CSS unit ${un} not supported`);\n    }\n}\n\nfunction unit(value) {\n    const numberValue = parseFloat(value);\n    if (isNaN(numberValue)) {\n        return value;\n    }\n    const unit = value.substr(String(numberValue).length);\n    return unit || `px`;\n}\n\nfunction baseFontSize() {\n    if (typeof document === `undefined`) {\n        return 16;\n    } else {\n        return parseFloat(getComputedStyle(document.documentElement).fontSize);\n    }\n}\n","import React from 'react';\nimport MasonryComponent from '../component/element/masonry.jsx';\n\nexport default function Masonry({ state, ...props }) {\n    const documentWidth = state.dimension.useWidth();\n    return (\n        <MasonryComponent documentWidth={documentWidth} columns={props.columns} {...props}>\n            {props.children}\n        </MasonryComponent>\n    );\n}\n","import React, { useEffect } from 'react';\nimport { LazyLoadImage } from 'react-lazy-load-image-component';\nimport ImageGallery from 'react-image-gallery';\nimport 'react-image-gallery/styles/css/image-gallery.css';\nimport Masonry from './masonry.jsx';\nimport Navigate from './navigate.jsx';\n\nconst MAX_IMAGES = 7;\nconst PRELOAD_DELAY = 100;\n\nexport default function Gallery({ state, ...props }) {\n    const preloadImages = [];\n    let preLoadProcessing;\n    const gallery = state.useGallery();\n    const photoIndex = state.usePhotoIndex();\n\n    useEffect(() => {\n        if (gallery && photoIndex > -1 && gallery.length && gallery[0].full) {\n            preLoadImages([\n                gallery[boundedPhotoIndex(photoIndex + 1)].full,\n                gallery[boundedPhotoIndex(photoIndex + 2)].full,\n                gallery[boundedPhotoIndex(photoIndex - 1)].full,\n                gallery[boundedPhotoIndex(photoIndex - 2)].full,\n                gallery[boundedPhotoIndex(photoIndex + 3)].full,\n                gallery[boundedPhotoIndex(photoIndex + 4)].full,\n            ]);\n        } else if (gallery && photoIndex === -1 && gallery.length && gallery[0].full) {\n            preLoadImages(gallery.slice(0, 6).map(item => item.full));\n        }\n    }, [gallery, photoIndex]);\n\n    if (!gallery || gallery.length === 0) {\n        return null;\n    }\n\n    const masonryStyle = {\n        width: `100%`,\n    };\n\n    return (\n        <>\n            <Masonry style={masonryStyle} state={state.root} {...props}>\n                {gallery.map((item, index) => (\n                    <div key={index}>\n                        <div className=\"gallery-image\">\n                            {index < MAX_IMAGES && (\n                                <img\n                                    alt={`${state.video?.title}: Gallery #${index + 1}`}\n                                    src={item.thumb}\n                                    width=\"100%\"\n                                    onMouseOver={() => onMouseOverThumb(item.full)}\n                                />\n                            )}\n                            {index >= MAX_IMAGES && (\n                                <LazyLoadImage\n                                    alt={`${state.video?.title}: Gallery #${index + 1}`}\n                                    src={item.thumb}\n                                    width=\"100%\"\n                                    onMouseOver={() => onMouseOverThumb(item.full)}\n                                />\n                            )}\n                        </div>\n                    </div>\n                ))}\n            </Masonry>\n            {photoIndex > -1 && (\n                <div id=\"photo\">\n                    <div className=\"overlay\" onClick={event => hidePhoto(event)} />\n                    <div className=\"image\">\n                        <div id=\"photo-image\">\n                            <ImageGallery\n                                lazyLoad={true}\n                                showNav={true}\n                                showThumbnails={false}\n                                showPlayButton={false}\n                                showFullscreenButton={false} // TODO: set to true when fixed\n                                items={gallery.map(({ full: original }) => ({ original }))}\n                                onSlide={index => {\n                                    state.photoIndex = (index + gallery.length) % gallery.length;\n                                }}\n                                startIndex={photoIndex}\n                            />\n                        </div>\n                        <a href=\"#\" className=\"close-button\" onClick={event => hidePhoto(event)}>\n                            X\n                        </a>\n                    </div>\n                </div>\n            )}\n        </>\n    );\n\n    function onMouseOverThumb(full) {\n        if (full) {\n            preLoadImages([full], true);\n        }\n    }\n\n    function showPhoto(event, index) {\n        event.preventDefault();\n        state.photoIndex = (index + gallery.length) % gallery.length;\n    }\n\n    function hidePhoto(event) {\n        event.preventDefault();\n        state.photoIndex = -1;\n    }\n\n    function preLoadImages(images, hasPriority) {\n        if (hasPriority) {\n            preloadImages.unshift(...images.filter(Boolean));\n        } else {\n            preloadImages.push(...images.filter(Boolean));\n        }\n        if (!preLoadProcessing) {\n            preLoadProcessing = setTimeout(process, PRELOAD_DELAY);\n        }\n\n        function process() {\n            preLoadProcessing = false;\n            if (preloadImages.length === 0) {\n                return;\n            }\n            const image = new Image();\n            image.onload = () => process();\n            image.onerror = () => process();\n            image.src = preloadImages.shift();\n        }\n    }\n\n    function boundedPhotoIndex(index) {\n        return (index + gallery.length) % gallery.length;\n    }\n}\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport Player from '../component/element/player/index.jsx';\nimport Navigate from '../container/navigate.jsx';\nimport constants from '../constants.js';\nimport CardDownload from '../component/card/download.jsx';\nimport Gallery from '../container/gallery.jsx';\nimport constant from '../constants.js';\n\nimport NotFound from './404.jsx';\n\nconst StyledPage = styled.div`\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n    width: 100%;\n    margin-left: auto;\n    margin-right: auto;\n\n    .gallery-image {\n        padding: 0;\n        margin: 0.2em;\n        border: none;\n    }\n\n    @media (max-width: ${constant.size.medium}) {\n        .gallery-image {\n            padding: 0;\n            margin: 0.3em;\n            border: none;\n        }\n    }\n\n    .gallery-image > img {\n        display: block;\n        width: 100%;\n    }\n\n    .ancillary {\n        display: flex;\n        margin-top: 1em;\n        margin-bottom: 1em;\n        width: 100%;\n    }\n\n    .ancillary > div {\n        box-sizing: border-box;\n    }\n\n    #photo {\n        position: relative;\n        display: flex;\n        flex-direction: row;\n        flex-wrap: nowrap;\n        position: fixed;\n        top: var(--height-header);\n        left: 0;\n        right: 0;\n        bottom: 0;\n        padding: 2em;\n        text-align: center;\n    }\n\n    @media (max-width: ${constant.size.medium}) {\n        #photo {\n            padding: 0;\n            padding-left: 0;\n            padding-right: 0;\n        }\n    }\n\n    #photo .overlay {\n        display: block;\n        position: absolute;\n        top: 0;\n        left: 0;\n        right: 0;\n        bottom: 0;\n        background-color: var(--color-overlay);\n    }\n\n    #photo > div.image {\n        flex-grow: 1;\n        flex-shrink: 1;\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        z-index: 1000;\n        height: 100%;\n        position: relative;\n    }\n\n    #photo > div.image > .close {\n        position: absolute;\n        left: 0;\n        right: 0;\n        top: 0;\n        bottom: 0;\n        cursor: pointer;\n        z-index: 999;\n    }\n\n    #photo > div.image > .close-button {\n        position: absolute;\n        right: 0.1em;\n        top: 0.1em;\n        cursor: pointer;\n        color: var(--color-overlay-text);\n        font-weight: 800;\n        font-size: 2em;\n    }\n\n    #photo .image-gallery-slide img {\n        display: block;\n        margin: 1em;\n        margin-left: auto;\n        margin-right: auto;\n        border: 0.2em solid var(--color-primary);\n        border-radius: 5px;\n        object-fit: contain;\n        z-index: 1000;\n\n        max-height: 80vh;\n        max-width: 80vw;\n\n        width: 100%;\n        height: auto;\n\n        @media (min-aspect-ratio: 1/1) {\n            width: auto;\n            height: 100%;\n        }\n    }\n\n    #photo > div.nav {\n        flex-grow: 0;\n        color: var(--color-primary);\n        font-size: 10em;\n        cursor: pointer;\n        height: 100%;\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        z-index: 1000;\n        user-select: none;\n        border-radius: 5px;\n        transition: background-color 0.2s;\n    }\n\n    #photo > div.nav:hover {\n        background-color: rgba(var(--color-action-active-rgb), 0.5);\n    }\n\n    .cloudflare-player {\n        height: 0;\n        padding-top: 56.25%;\n        width: 100%;\n    }\n\n    .model {\n        color: var(--color-action-active);\n    }\n\n    @media (max-width: ${constants.size.small}) {\n        .ancillary {\n            flex-direction: column;\n            justify-content: center;\n        }\n\n        .ancillary .info {\n            margin-left: 1em;\n            margin-right: 1em;\n        }\n    }\n\n    @media not all and (max-width: ${constants.size.small}) {\n        .ancillary {\n            flex-direction: row;\n        }\n\n        .ancillary > .half {\n            width: 50%;\n        }\n    }\n`;\n\nexport default function PageVideo({ state, user }) {\n    const video = state.useVideo();\n    const [vid, setVid] = useState({ loading: true });\n    const userHasAccess =\n        user &&\n        (user.type === `standard` || (user.type === `trial` && user.trialCredit === video.videoId));\n\n    useEffect(() => {\n        (async () => {\n            let controller;\n            try {\n                if (!vid.token && userHasAccess && video && video.videoId) {\n                    controller = new AbortController();\n                    const response = await fetch(\n                        `${state.root.key.api}/api/legacy/data/video/${video.videoId}?site=${state.root.$site}`,\n                        {\n                            signal: controller.signal,\n                            credentials: `include`,\n                        }\n                    );\n                    if (response.ok) {\n                        const resp = await response.json();\n                        setVid({\n                            token: resp.token,\n                            downloads: resp.downloads,\n                            loading: false,\n                        });\n                        return;\n                    }\n                }\n            } catch (error) {\n                console.log(error);\n            }\n            return () => {\n                controller.abort();\n            };\n        })();\n    }, [userHasAccess, state.root.key.api, state.root.$site, vid, video]);\n\n    if (!video) {\n        return <NotFound />;\n    }\n\n    const modelsText = video.models.map((model, index, arr) => {\n        const modelHref = `/models/${model.modelId}`;\n        let Title;\n        if (index === 0) {\n            if (arr.length === 1) {\n                Title = () => <span>model: </span>;\n            } else {\n                Title = () => <span>models: </span>;\n            }\n        } else {\n            Title = () => null;\n        }\n        const Spacer = () => (index < arr.length - 1 ? <span> / </span> : null);\n        return (\n            <span key={index}>\n                <Title />\n                <Navigate state={state} key={model.modelId} href={modelHref} className=\"model\">\n                    {model.name}\n                </Navigate>\n                <Spacer />\n            </span>\n        );\n    });\n\n    // TODO: { video.thumbs && <video id='thumbs' src={video.thumbs} /> }\n\n    const titleStyle = {};\n    if (video.loading) {\n        // TODO: Fix this... need vars!\n        titleStyle.color = `transparent`;\n        titleStyle.textShadow = `0 0 10px rgba(0,0,0,0.5)`;\n    }\n\n    return (\n        <StyledPage className=\"page\">\n            <Player\n                userHasAccess={userHasAccess}\n                src={vid.token}\n                loading={video.loading || vid.loading}\n                poster={video.poster}\n                controls\n                width=\"100%\"\n                thumbnails={video.thumbs}\n            />\n            <div className=\"ancillary\">\n                <div className={user && vid.downloads ? `info half` : `info`} style={titleStyle}>\n                    <h1>{video.title}</h1>\n                    <h3>\n                        {modelsText} {modelsText && ` / `} duration:{` `}\n                        <Duration duration={video.duration} />\n                    </h3>\n                    <p>{video.description.long}</p>\n                </div>\n                {user && vid.downloads && <CardDownload downs={vid.downloads} state={state} />}\n            </div>\n            <Gallery state={state} />\n        </StyledPage>\n    );\n\n    function Duration(props) {\n        const { duration } = props;\n        if (typeof duration === `string`) {\n            return <span>{String(duration)}</span>;\n        }\n\n        const seconds = duration % 60;\n        const minutes = ((duration - seconds) / 60) % 60;\n        const hours = duration - seconds - minutes * 60;\n\n        const parts = [pad(minutes), pad(seconds)];\n        if (hours > 0) {\n            parts.unshift(pad(hours));\n        }\n\n        const durationText = parts.join(`:`);\n        return <span>{durationText}</span>;\n    }\n\n    function pad(value) {\n        value = String(value);\n        if (value.length < 2) {\n            return `0${value}`;\n        } else {\n            return value;\n        }\n    }\n}\n","import React from 'react';\nimport styled from 'styled-components';\n\nconst StyledPage = styled.div`\n    text-align: center;\n`;\n\nexport default function PageWelcome() {\n    return (\n        <StyledPage className=\"page\">\n            <h1>Thank You And Welcome!</h1>\n            <p>Thank you for becoming a member. We hope you enjoy our fit, young, girls.</p>\n            <p>It could take a moment for your account to be created</p>\n            <p>\n                <a href=\"#login\">Click here to login</a>\n            </p>\n        </StyledPage>\n    );\n}\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\n\nconst StyledPage = styled.div`\n    width: 100%;\n    margin-left: auto;\n    margin-right: auto;\n\n    display: flex;\n    flex-direction: row;\n    flex-wrap: nowrap;\n\n    .entry {\n        margin: 1em;\n    }\n\n    label {\n        display: block;\n        font-weight: 600;\n    }\n\n    input {\n        display: block;\n        margin-top: 0.25em;\n        box-sizing: border-box;\n        width: 100%;\n        height: 2.4375em;\n        box-shadow: inset 0 1px 2px rgba(var(--color-primary-text-rgb), 0.1);\n        font-weight: normal;\n        border: 1px solid rgba(var(--color-primary-text-rgb), 0.2);\n        font-size: 1em;\n        padding-left: 0.5em;\n        color: var(--color-join-item-text);\n        background-color: var(--color-join-item);\n    }\n\n    input[type='submit'] {\n        display: inline-block;\n        font-weight: 600;\n        appearance: none;\n        width: auto;\n        border: 1px solid transparent;\n        cursor: pointer;\n        background-color: var(--color-join-button);\n        color: var(--color-join-button-text);\n    }\n\n    .data {\n        margin-left: auto;\n        margin-right: auto;\n    }\n\n    .continue {\n        text-align: right;\n    }\n\n    .error {\n        color: var(--color-action);\n        font-weight: 500;\n    }\n`;\n\nexport default function PagePasswordReset({ setUser, state }) {\n    const [error, setError] = useState();\n\n    return (\n        <StyledPage className=\"page\">\n            <div className=\"data\">\n                <h1>Reset your password</h1>\n                <form onSubmit={attemptPasswordReset}>\n                    <div className=\"entry\">\n                        <label className=\"user-data\">\n                            Enter your new password:\n                            <input\n                                type=\"password\"\n                                name=\"password\"\n                                placeholder=\"Enter your new password\"\n                                autoComplete=\"new-password\"\n                                required\n                                pattern=\"^[a-zA-Z0-9]{6,}$\"\n                                title=\"Minimum 6, 0-9 and letters\"\n                            />\n                        </label>\n                    </div>\n                    <div className=\"entry\">\n                        <label className=\"user-data\">\n                            Re-Enter your new password:\n                            <input\n                                type=\"password\"\n                                name=\"confirm\"\n                                placeholder=\"Confirm your new password\"\n                                required\n                                pattern=\"^[a-zA-Z0-9]{6,}$\"\n                                title=\"Minimum 6, 0-9 and letters\"\n                            />\n                        </label>\n                    </div>\n                    <div className=\"error\">{error}</div>\n                    <div className=\"continue\">\n                        <input type=\"submit\" value=\"CONTINUE >>\" className=\"action\" />\n                    </div>\n                </form>\n            </div>\n        </StyledPage>\n    );\n\n    async function attemptPasswordReset(event) {\n        event.preventDefault();\n\n        const interactionId = state.root.interaction.start();\n        try {\n            setError(undefined);\n\n            const urlParams = new URLSearchParams(window.location.search);\n            const code = urlParams.get(`code`);\n\n            if (!code) {\n                setError(`\"code\" missing from URL. Please contact support`);\n                return;\n            }\n\n            const formData = new FormData(event.target);\n            const form = Object.fromEntries(formData.entries());\n\n            if (form.password !== form.confirm) {\n                setError(`Passwords do not match`);\n                return;\n            }\n\n            const response = await fetch(\n                `${state.root.key.api}/api/legacy/user/change-password?site=${state.root.$site}`,\n                {\n                    method: `post`,\n                    credentials: `include`,\n                    headers: {\n                        Accept: `application/json`,\n                        'Content-Type': `application/json`,\n                    },\n                    body: JSON.stringify({\n                        code,\n                        password: form.password,\n                    }),\n                }\n            );\n\n            if (response.ok) {\n                const { user, error } = await response.json();\n                if (user) {\n                    setUser(user);\n                    state.root.page.navigate(`/`);\n                    return;\n                } else if (error.code === `auth/code-does-not-exists`) {\n                    setError(`Password reset code already used`);\n                    return;\n                }\n            }\n            throw new Error();\n        } catch (error) {\n            console.error(`An error occurred: ${error.message}`);\n            setError(`Failed. Please contact support`);\n        } finally {\n            state.root.interaction.end(interactionId);\n        }\n    }\n}\n","import assert from 'assert';\nimport React from 'react';\n\nexport default function PageStaticUsc2257({ state }) {\n    const email = state.root.email.$contact;\n    assert(email, `email is required`);\n    const mailTo = `mailto:${email}`;\n    return (\n        <div className=\"page\">\n            <h1>18 U.S.C. 2257 and 2257A Record-Keeping Requirements Compliance Statement</h1>\n            <p>\n                In compliance with U.S.C. Title 18, Sections 2257 and 2257A and related regulations,\n                all performers, models, actors, actresses and other persons who appear in any visual\n                depiction of actual or simulated sexually explicit conduct appearing on or otherwise\n                contained on this website are or were 18 years of age or older at the time of the\n                creation of such depictions. Records required to be maintained pursuant to U.S.C.\n                Title 18, Sections 2257 and 2257A are located at and maintained by:\n            </p>\n            <p>\n                Please direct questions pertaining to content on this website to{` `}\n                <a href={mailTo}>{email}</a>\n            </p>\n            <p>\n                Custodian of Records c/o Extasis Group 25/F Workington Tower 78 Bonham Strand Sheung\n                Wan, HK\n            </p>\n        </div>\n    );\n}\n","import React from 'react';\nexport default function PageStaticPrivacy({ state }) {\n    const mailTo = `mailto:${state.root.email.$contact}`;\n    return (\n        <div className=\"page\">\n            <h1>Privacy Policy</h1>\n            <h3>WHO WE ARE</h3>\n            <p>\n                Extasis Group operates this website and is the controller of the information\n                collected or provided via this Website.\n            </p>\n\n            <h3>IMPORTANT NOTICE REGARDING ADULT CONTENT</h3>\n            <p>\n                This is an adult website that expressly and strictly limits its membership to\n                adults. We do not knowingly seek or collect any personal information or data from\n                persons under the age of 18. All persons under the age of 18 are strictly prohibited\n                from accessing or viewing the contents on this website. If you are under the age of\n                18 and/or under the age of majority in the jurisdiction you reside and from which\n                you access the website, you must leave this site immediately, and your account can\n                be terminated without notice.\n            </p>\n\n            <h3>WHAT DATA WE COLLECT</h3>\n            <p>\n                In order to provide our service when you subscribe we collect the following data\n                from you:\n                <br />\n                <br />\n                - Your email address, username and password so you can log in to the website.\n                <br />\n                - Your IP address to determine your general location and protect your account from\n                being hacked.\n                <br />\n                - Your name, country, ZIP or post code, credit card or other billing information,\n                through a third party billing provider (as listed below), so we can charge you the\n                subscription fees.\n                <br />\n            </p>\n\n            <h3>WHO WE SHARE YOUR DATA WITH</h3>\n            <p>\n                We only ever share your personal data with other companies if necessary for the\n                operation of our websites. These other companies are legally required to have the\n                same data security standards we do. Below you can find a complete list of who we\n                might share your data with. Note that we may change our partners in the future, in\n                which case this document will be updated.\n            </p>\n            <p>\n                If you sign up to one or more of our websites, your credit card or other billing\n                data is processed by one of our payment processor,{` `}\n                <a href=\"http://verotel.com\">verotel.com</a>\n            </p>\n            <p>\n                You can tell which of these companies processes your data from both the page you see\n                when you pay for your subscription, as well as from the billing related emails you\n                receive.\n            </p>\n            <p>We do not store your payment information in our internal systems.</p>\n\n            <h3>USE OF COOKIES</h3>\n            <p>\n                We use certain tools to collect information about users browsing our website. These\n                tools use cookies which are small text files that are stored on a user’s computer\n                hard drive. The cookies are used, among other things, for fraud reduction or for\n                security purposes. We also use cookies to recognize customers or a previous visitor\n                of our website to pre-populate website forms. Remember, though, without cookies,\n                users may not be able to take full advantage of all of our website features.\n            </p>\n\n            <h3>ANALYTICS</h3>\n            <p>\n                We may use third-party Service Providers to monitor and analyze the use of our\n                Service. You can opt-out of having made your activity on the Service available to\n                Google Analytics by installing the Google Analytics opt-out browser add-on. The\n                add-on prevents the Google Analytics JavaScript (ga.js, analytics.js, and dc.js)\n                from sharing information with Google Analytics about visits activity. For more\n                information on the privacy practices of Google, please visit the Google Privacy &\n                Terms web page:\n                <a href=\"http://www.google.com/intl/en/policies/privacy/\">\n                    http://www.google.com/intl/en/policies/privacy/\n                </a>\n            </p>\n\n            <h3>HOW LONG WE STORE YOUR DATA</h3>\n            <p>\n                Unless you ask to have it deleted, we will store your data indefinitely in order to\n                give you continued access to any content that was present at the time your\n                subscription ended.\n            </p>\n\n            <h3>ADVERTISING AND OFFERS</h3>\n            <p>\n                If you click on any advertising or special offers on this website you may be\n                directed to a third party website that is outside our control, and in some cases, we\n                might share some data with those websites in order to make things easier for you. In\n                these cases, you are responsible for making sure that these websites keep your data\n                as safe as we do.\n            </p>\n\n            <h3>SPECIAL PROVISIONS FOR USERS COVERED BY THE GDPR</h3>\n            <p>\n                Please note that, as stated above, your data will be stored on our partners’ servers\n                in the USA.\n            </p>\n\n            <h3>WHICH COUNTRIES ARE COVERED BY THE GDPR</h3>\n            <p>\n                We apply GDPR guidelines for all users in the EU, EEA, the microstates of Andorra,\n                Monaco and San Marino, as well as Switzerland.\n            </p>\n\n            <h3>YOUR DATA RIGHTS</h3>\n            <p>\n                You have the right to access or rectify the personally identifiable data we hold\n                about you.\n            </p>\n            <p>\n                You also have the right to ask for your data to be deleted. Just keep in mind that\n                we might need it in order to fulfil the rest of your subscription\n            </p>\n            <p>\n                If you want to access, rectify or delete your data, please send us an email{` `}\n                <a href={mailTo}>here</a>\n            </p>\n\n            <h3>COMPLAINTS</h3>\n            <p>\n                In the unfortunate case where you are not happy with our privacy policy or processes\n                you can send us an email <a href={mailTo}>here</a>.\n            </p>\n        </div>\n    );\n}\n","import React from 'react';\nexport default function PageStaticTerms({ state }) {\n    const site = `${state.root.$site.toUpperCase()}.com`;\n    const mailTo = `mailto:${state.root.email.$contact}`;\n    return (\n        <div className=\"page\">\n            <h1>Terms &amp; Conditions</h1>\n            <p>\n                Before Subscriber's transaction can be completed, Subscriber must read and agree to\n                these terms and conditions, \"Agreement\". By applying for access and / or services\n                from this website, Subscriber is agreeing to these terms and conditions, and is\n                agreeing to be legally bound by them. This Agreement is subject to change at any\n                time. Changes are effective when posted on this site without notice to each\n                subscriber.\n            </p>\n            <h3>PREAMBLE</h3>\n            <p>\n                Subscriber's credit card will be billed immediately after purchase. After purchase\n                Subscriber will receive an email notification with all payment details. The contract\n                is closed between Subscriber and Site as soon as the order is submitted. All\n                questions will be answered within six working days. Any motion pictures,\n                photographs, or other content found on the Site and any subscription to the Site is\n                expressly prohibited for anyone under legal age in their respective\n                country/jurisdiction, and as a minimum to anyone below 18 years of age.\n            </p>\n\n            <h3>DEFINITIONS</h3>\n            <p>\n                \"Member\" or \"Membership,\" shall mean the subscriber or user of a valid username and\n                password for the site during the term of membership.\n                <br />\"{site}\" shall mean any of the companies billing the Subscriber including any\n                additional billing companies used by {site} or changes thereof.\n                <br />\n                \"Site\" shall mean the website for which subscriber is purchasing a username and\n                password in order to access the site and its materials and obtain the benefits of\n                Membership.\n                <br />\n                \"Subscriber\" shall mean the user of the services of the site and holder of a valid\n                username and password for the Site.\n                <br />\n                \"Access Right,\" shall mean the combination of unique username and password that is\n                used to access a site. An access right is a license to use a Site for a period of\n                time that is specified.\n            </p>\n\n            <h3>DESCRIPTION OF SERVICES</h3>\n            <p>\n                {site} will provide one access right to access the Site and its materials for which\n                Subscriber is purchasing a Membership.\n            </p>\n\n            <h3>BILLING</h3>\n            <p>\n                Billing is processed by one of our partners (Verotel). Subscriber will be informed\n                at the time of subscribing what description will appear on Subscriber’s credit card,\n                bank statement, or phone bill for all applicable charges. If multiple venues are\n                joined utilizing any payment method, Subscriber’s statement will list each\n                individual purchase comprising the transaction. Billing may include other\n                information.\n            </p>\n\n            <h3>PAYMENT / FEE</h3>\n            <p>\n                The Sites may have periodic subscription fees from the time of the initial\n                enrollment for the Membership . The Subscriber is responsible for such fees\n                according to the terms and conditions of the Site.\n            </p>\n\n            <h3>AUTOMATIC RECURRING BILLING (if selected by subscriber during sign-up)</h3>\n            <p>\n                In accordance with the terms and conditions of the Site subscription fees may be\n                automatically renewed at or after the end of the original term selected, for a\n                similar period of time and for a similar or different amount, unless notice of\n                cancellation is received from the Subscriber. Unless and until this agreement is\n                cancelled in accordance with the terms hereof, Subscriber hereby authorizes {site}\n                {` `}\n                to charge Subscriber's chosen payment method to pay for the ongoing cost of\n                membership. Subscriber hereby further authorizes {site} to charge Subscriber's\n                chosen payment method for any and all additional purchases of materials provided on\n                the site. In the event of an unsuccessful recurring payment, the Site will\n                discontinue Subscriber's membership immediately.\n            </p>\n\n            <h3>ELECTRONIC RECEIPT</h3>\n            <p>\n                Subscriber will receive an email receipt to their email provided upon initial\n                subscription. Subscriber may request a copy of the account of charges of their\n                membership to the Site but\n                {site} does not guarantee the availability of such records more than 365 days after\n                a charge. Requests must be made directly to {site}. To contact {site} refer to\n                Customer Support links on the Site.\n            </p>\n\n            <h3>CANCELLATION</h3>\n            <p>\n                At any time, and without cause, subscription to the service may be terminated by\n                either:\n                {site}, the Site, or the Subscriber upon notification of the other by electronic or\n                conventional mail, by chat, or by telephone. Subscribers are liable for charges\n                incurred until the date of the termination. For billing inquiries or to cancel your\n                membership, please visit Verotel.com, our authorized sales agent.\n            </p>\n\n            <h3>REFUNDS</h3>\n            <p>\n                Refunds for purchases or recurring charges may be requested by contacting customer\n                support. Refunds or credits will not be issued for partially used Memberships.\n                Cancellation for all current and future recurring billing may be requested as set\n                forth in the above paragraph.\n                {site} reserves the right to grant any refunds or credits at its discretion. The\n                decision to refund a charge does not imply the obligation to issue additional future\n                refunds. Should a refund be issued by {site} for any reason, it will be credited\n                solely to the payment method used in the original transaction. {site} will not issue\n                refunds by cash, check, or to another payment mechanism.\n            </p>\n\n            <h3>CARDHOLDER DISPUTES/CHARGEBACKS</h3>\n            <p>\n                We review all chargebacks carefully to ensure no party is incorrectly charged. We\n                also reserve the right to deny future purchases to accounts with chargebacks that\n                may lack merit depending on the circumstances. Claims of fraud are taken seriously\n                and may result in the Site notifying Subscriber’s issuer to protect Subscriber and\n                prevent future fraudulent charges to Subscriber’s card.\n            </p>\n\n            <h3>AUTHORIZATION OF USE</h3>\n            <p>\n                Subscribers to the Site are authorized to access the service or material located at\n                this website through a single Access Right. This Access Right shall be granted for\n                sole use to one Subscriber. All Memberships are provided for personal use only and\n                shall not be used for any commercial purposes or by any other third parties.\n                Commercial use of either the Site or any material found within it is strictly\n                prohibited unless authorized by the Site. No material within the Site may be\n                transferred to any other person or entity, whether commercial or non-commercial. No\n                material within the Site may be distributed, downloaded, or otherwise obtained\n                through peer-to-peer networks or any other file sharing platforms. In addition,\n                materials may not be modified, or altered. Materials may not be displayed publicly,\n                or used for any rental, sale, or display. Materials extend to copyright, trademarks,\n                or other proprietary notices. {site}\n                and the Site reserve the right to terminate the Access Right at any time for any\n                Subscriber if the terms of this Agreement are breached. In the event that the terms\n                are breached, Subscriber will be required to immediately destroy any information or\n                material printed, downloaded or otherwise copied from the Site.\n            </p>\n\n            <h3>TRANSFER OF YOUR ACCESS RIGHT</h3>\n            <p>\n                Access to the Site - the Subscriber’s Access Right - is through a combination of a\n                username and a password. Subscribers may not release their Access Right to any\n                person, and are required to keep their Access Right confidential. {site} will not\n                release a Subscriber’s password, to anyone other than the Subscriber, except as may\n                be required by law or court order. Unauthorized access to the Site - including\n                sharing your Access Right with others - is a breach of this Agreement. Subscribers\n                acknowledge that the Site may track each Subscriber's entry to the site to prevent\n                unauthorized access. In the event of a security breach, theft, or loss of a device\n                containing the Access Right, resulting in potential unauthorized disclosure\n                Subscriber must immediately notify {site} or the Site of said security breach.\n            </p>\n\n            <h3>SANCTION AND APPROVAL OF ADULT MATERIAL</h3>\n            <p>\n                This Site contains age-restricted materials. If Subscriber is under the age of 18\n                years, or under the age of majority in the location from where accessing this Site\n                Subscriber does not have authorization or permission to enter or access any of its\n                materials. If Subscriber is over the age of 18 years and over the age of majority in\n                the location from where accessing this site by entering the website Subscriber\n                hereby agrees to comply with these terms and conditions.\n            </p>\n\n            <h3>SEVERABILITY</h3>\n            <p>\n                If any provision of this Agreement shall be held invalid or unenforceable for any\n                reason, the remaining provisions shall continue to be valid and enforceable. If a\n                court finds that any portion of this Agreement is invalid or unenforceable, but that\n                by limiting such provision it would become valid or enforceable, then such provision\n                shall be deemed to be written, construed, and enforced as so limited.\n            </p>\n\n            <h3>NOTICE</h3>\n            <p>\n                Notices by the Site to Subscribers may be given by means of electronic messages\n                through the Site, by a general posting on the Site, or by conventional mail or\n                email. Notices by Subscribers may be given by email, conventional mail, telephone or\n                fax unless otherwise specified in the Agreement. All questions, complaints, or\n                notices regarding the site must be directed to {site}, <a href={mailTo}>here</a>\n            </p>\n\n            <h3>DISCLAIMER</h3>\n            <p>\n                Subscriber understands that the Site cannot and does not guarantee or warrant that\n                files available for downloading from the Internet will be free of viruses, worms,\n                trojan horses or other code that may manifest contaminating or destructive\n                properties. Subscriber is responsible for implementing sufficient procedures and\n                checkpoints to satisfy Subscriber’s particular requirements for accuracy of data\n                input and output, and for maintaining a means external to the site for the\n                reconstruction of any lost data. Site does not assume any responsibility or risk for\n                Subscriber’s use of the Internet. However, in the event Site learns of such a\n                breach, Site will notify Subscriber so that Subscriber can take the necessary\n                precautions.\n            </p>\n            <p>\n                Subscriber’s use of the Site is at his or her own risk and the content is provided\n                “as is” - without warranties of any kind, either expressed or implied. Site\n                disclaims all warranties including any implied warranties of merchantability,\n                fitness for a particular purpose, title or non-infringement. Site does not warrant\n                that the functions or content contained in the Site will be uninterrupted or\n                error-free, that defects will be corrected, or that the Site or the server that\n                makes it available are free of viruses or other harmful components.\n            </p>\n            <p>\n                The Site does not warrant or make any representation regarding use, or the result of\n                use, of the content in terms of accuracy, reliability, or otherwise. The content may\n                include technical inaccuracies or typographical errors, and the Site may make\n                changes or improvements at any time. The Site does not warrant or make any\n                representations regarding the appropriateness of the material or content or the\n                authorization for use in all countries, states, provinces, county or any other\n                jurisdictions. If Subscriber chooses to access the Site, Subscriber does so at its\n                own risk, and subject to the laws in its own jurisdiction. Subscriber is responsible\n                for compliance with all applicable laws.\n            </p>\n\n            <h3>SUBSCRIPTION FEES AND SUBSCRIBER’S COMMUNICATION</h3>\n            <p>\n                Subscription and Membership fees to Site are subject to change at any time at the\n                sole and absolute discretion of {site}. The official standard membership rates for\n                the Site shall be set forth at the following link: {site}. The current monthly\n                membership rate which will appear on Subscriber’s credit card bill, will be debited\n                from Subscriber’s account, charged to Subscriber’s telephone, etc., depending on\n                Subscriber’s choice of payment means.\n            </p>\n        </div>\n    );\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport SearchResults from '../component/search/results.jsx';\n\nconst StyledPage = styled.div`\n    position: relative;\n\n    h1 {\n        text-align: center;\n    }\n\n    .page {\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        align-items: center;\n        width: 100%;\n        margin-left: auto;\n        margin-right: auto;\n    }\n\n    .search-results {\n    }\n`;\n\nexport default function PageSearchResults({ state }) {\n    return (\n        <StyledPage>\n            <div className=\"page\">\n                <h1 className=\"heading\">Results</h1>\n                <SearchResults className=\"search-results\" state={state.root} />\n            </div>\n        </StyledPage>\n    );\n}\n","import React, { useState, useEffect } from 'react';\nimport styled from 'styled-components';\n\nimport Header from './header.jsx';\nimport Footer from './footer.jsx';\nimport 'site/site.css';\nimport 'style/app.css';\nimport { setTracking } from '../lib/tracking.js';\nimport { del, getData, setData } from '../lib/storage.js';\nimport LoginDialog from '../component/dialog/login.jsx';\nimport LockdownDialog from '../component/dialog/lockdown.jsx';\nimport ResetPasswordDialog from '../component/dialog/reset-password.jsx';\nimport BusyOverlay from '../component/element/busy-overlay.jsx';\nimport { Discounts } from './discounts.jsx';\n\nimport PageWebmasters from 'site/webmasters.jsx';\nimport PageServerError from '../page/500.jsx';\nimport PageNotFound from '../page/404.jsx';\nimport PageHome from '../page/home.jsx';\nimport PageModels from '../page/models.jsx';\nimport PageModel from '../page/model.jsx';\nimport PageVideos from '../page/videos.jsx';\nimport PageVideo from '../page/video.jsx';\nimport PageWelcome from '../page/welcome.jsx';\n// import PageLinkedLogin from '../page/linked-login.jsx';\nimport PagePasswordReset from '../page/password-reset.jsx';\nimport PageUsc2257 from '../page/static/usc2257.jsx';\nimport PagePrivacy from '../page/static/privacy.jsx';\nimport PageTerms from '../page/static/terms.jsx';\nimport PageSearchResults from '../page/search-results.jsx';\n\nconst HIDE_MENU = [`join`];\n\nconst StyledPage = styled.div`\n    display: flex;\n    flex-direction: column;\n\n    .spacer {\n        flex-grow: 1;\n    }\n    header,\n    main,\n    footer {\n        flex-grow: 0;\n    }\n`;\n\nexport default function App({ state, error }) {\n    // Make sure we save any tracking querystring values\n    setTracking();\n    const [user, setUserState] = useState(undefined);\n    function setUser(u) {\n        if (u) {\n            setData(`user`, u);\n            setUserState(u);\n        } else {\n            del(`user`);\n            setUserState(undefined);\n        }\n    }\n    useEffect(() => {\n        const storedUser = getData(`user`);\n        storedUser &&\n            !user &&\n            fetch(`${state.root.key.api}/api/legacy/user/refresh?site=${state.root.$site}`, {\n                method: `get`,\n                credentials: `include`,\n                headers: {\n                    Accept: `application/json`,\n                },\n            }).then(response => response.ok && response.json().then(({ user: u }) => setUser(u)));\n    });\n    return (\n        <>\n            <Content user={user} setUser={setUser} state={state} error={error} />\n            <LoginDialog setUser={setUser} state={state} />\n            <ResetPasswordDialog state={state} />\n        </>\n    );\n}\n\nfunction Content({ user, setUser, state, error }) {\n    const current = state.page.useCurrent();\n    // TODO: Consider this.\n    const packages = state.biller.usePackages();\n\n    return (\n        <>\n            <StyledPage className=\"app\">\n                <Header user={user} state={state} hideMenu={HIDE_MENU.includes(current?.$page)} />\n                <main>\n                    <Page user={user} setUser={setUser} current={current} error={error} />\n                    <Discounts\n                        title=\"DISCOUNTS FROM OUR FRIENDS\"\n                        hide={\n                            !user || HIDE_MENU.includes(current?.$page) || current?.$page === `home`\n                        }\n                    />\n                </main>\n                <div className=\"spacer\" />\n                <BusyOverlay state={state} />\n                <Footer user={user} setUser={setUser} state={state} />\n            </StyledPage>\n            <LockdownDialog\n                user={user}\n                setUser={setUser}\n                state={state}\n                site={state.root.$site}\n                packages={packages}\n                activate={state.biller.activate}\n                upgrade={state.biller.upgrade}\n                reactivate={state.biller.reactivate}\n            />\n        </>\n    );\n}\n\nfunction Page({ user, current, error, setUser }) {\n    if (error) {\n        return <PageServerError error={error} state={current} />;\n    }\n    const props = { state: current, user };\n    switch (current?.$page) {\n        case `home`:\n            return <PageHome {...props} />;\n        case `model`:\n            return <PageModel {...props} />;\n        case `models`:\n            return <PageModels {...props} />;\n        case `video`:\n            return <PageVideo {...props} />;\n        case `videos`:\n            return <PageVideos {...props} />;\n        case `webmasters`:\n            return <PageWebmasters {...props} />;\n        case `usc2257`:\n            return <PageUsc2257 {...props} />;\n        case `privacy`:\n            return <PagePrivacy {...props} />;\n        case `terms`:\n            return <PageTerms {...props} />;\n        case `welcome`:\n            return <PageWelcome {...props} />;\n        // case `linked-login`:\n        //     return <PageLinkedLogin {...props} />;\n        case `password-reset`:\n            return <PagePasswordReset {...props} setUser={setUser} />;\n        case `search-results`:\n            return <PageSearchResults {...props} />;\n        case `404`:\n        default:\n            return <PageNotFound {...props} />;\n    }\n}\n","const reportWebVitals = onPerfEntry => {\n    if (onPerfEntry && onPerfEntry instanceof Function) {\n        import(`web-vitals`).then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n            getCLS(onPerfEntry);\n            getFID(onPerfEntry);\n            getFCP(onPerfEntry);\n            getLCP(onPerfEntry);\n            getTTFB(onPerfEntry);\n        });\n    }\n};\n\nexport default reportWebVitals;\n","import assert from 'assert';\nimport { useState, useEffect } from 'react';\n\nexport default function useObservable(observable, intialState) {\n    assert(observable, `observable MUST be supplied`);\n\n    const shouldWatch = typeof observable !== `function`;\n    const watch = shouldWatch ? [observable] : [];\n\n    const [state, setState] = useState(intialState);\n    useEffect(() => {\n        const obs = typeof observable === `function` ? observable() : observable;\n\n        const sub = obs.subscribe(value => {\n            setState(value);\n        });\n        return () => sub.unsubscribe();\n    }, watch);\n    return state;\n}\n","import assert from 'assert';\nimport uuid from 'uuid';\nimport createState from './state.js';\n\nexport default function createInteractionState({ root }) {\n    const running = {};\n    let count = 0;\n\n    return createState({\n        root,\n        values: {\n            busy: false,\n        },\n        createActions,\n    });\n\n    function createActions(state) {\n        return {\n            start,\n            end,\n        };\n\n        function start(id = uuid.v4()) {\n            assert(!running[id], `${id} has already been registered as running`);\n            running[id] = true;\n            count++;\n\n            if (count === 1) {\n                process.nextTick(() => {\n                    if (count >= 1) {\n                        state.busy = true;\n                    }\n                });\n            }\n\n            return id;\n        }\n\n        function end(id) {\n            if (running[id]) {\n                delete running[id];\n                count--;\n\n                if (count === 0) {\n                    process.nextTick(() => {\n                        if (count === 0) {\n                            state.busy = false;\n                        }\n                    });\n                }\n            }\n        }\n    }\n}\n","import assert from 'assert';\nimport { ApolloLink } from '@apollo/client';\n\nexport default function createStateLink(state) {\n    assert(state, `state MUST be supplied`);\n    return new ApolloLink((operation, next) => {\n        operation.setContext(previous => ({\n            ...previous,\n            state: state.root,\n        }));\n        return next(operation);\n    });\n}\n","import assert from 'assert';\nimport { ApolloLink } from '@apollo/client';\n\nconst API_KEY = `argonath-api-key`;\nconst MODE = typeof window === `undefined` ? undefined : { mode: `cors` };\n\nexport default function createArgonathLink() {\n    return new ApolloLink((operation, next) => {\n        const { state, headers, fetchOptions } = operation.getContext();\n        assert(state, `state MUST be set on the context`);\n        assert(state.key.argonath, `argonath key MUST be defined on state`);\n\n        operation.setContext(previous => ({\n            ...previous,\n            headers: {\n                ...headers,\n                [API_KEY]: state.key.argonath,\n            },\n            fetchOptions: {\n                ...fetchOptions,\n                ...MODE,\n            },\n        }));\n\n        return next(operation);\n    });\n}\n","import { ApolloClient, HttpLink, InMemoryCache, from } from '@apollo/client';\nimport { RetryLink } from '@apollo/client/link/retry';\nimport createStateLink from './link-state.js';\nimport createArgonathLink from './link-argonath.js';\nimport createAuthLink from './link-auth.js';\n\nconst RETRY = 10;\nconst DELAY = 100;\nconst MAX_DELAY = 10000;\n\nconst clientCache = new WeakMap();\nconst authClientCache = new WeakMap();\n\nexport function getClient(state) {\n    return getCached(clientCache, state, createClient);\n}\n\nexport function getAuthenticatedClient(state) {\n    return getCached(authClientCache, state, createAuthenticatedClient);\n}\n\nfunction getCached(cache, state, create) {\n    if (!cache.has(state)) {\n        cache.set(state, create(state));\n    }\n    return cache.get(state);\n}\n\nfunction createClient(state) {\n    return createBaseClient(state);\n}\n\nfunction createAuthenticatedClient(state) {\n    const authLink = createAuthLink();\n    const client = createBaseClient(state, [authLink]);\n\n    return client;\n}\n\nfunction createBaseClient(state, links = []) {\n    const httpLink = new HttpLink({\n        uri: `https://${state.root.$site}.team18media.app/graphql`,\n    });\n\n    const retryLink = new RetryLink({\n        delay: {\n            initial: DELAY,\n            max: MAX_DELAY,\n        },\n        attempts: {\n            max: RETRY,\n            retryIf: error => {\n                console.log(`retryIf`, error);\n                return !!error;\n            },\n        },\n    });\n\n    const stateLink = createStateLink(state);\n    const argonathLink = createArgonathLink();\n\n    // TODO: On the server this should\n    const isServer = typeof window === `undefined`;\n\n    // TODO: How could we tie this up to the asset loaders?\n    //  If we know what is cached we can get it from the cache\n    //  instead of from the batch...\n    const cache = new InMemoryCache({\n        // TODO: Configure good caching\n        resultCaching: !isServer,\n\n        typePolicies: {\n            Query: {\n                fields: {\n                    asset: {\n                        merge: true,\n                    },\n                    talent: {\n                        merge: true,\n                    },\n                    video: {\n                        merge: true,\n                    },\n                },\n            },\n            Asset: {\n                keyArgs: `path`,\n            },\n        },\n\n        invalidationPolicies: {\n            timeToLive: isServer ? 0 : 50 * 60 * 1000,\n            renewalPolicy: `WriteOnly`,\n\n            types: {\n                AssetBatchSearchResult: {\n                    timeToLive: isServer ? 0 : 5 * 60 * 1000,\n                },\n                TalentListResult: {\n                    timeToLive: isServer ? 0 : 5 * 60 * 1000,\n                },\n            },\n        },\n    });\n\n    return new ApolloClient({\n        link: from([stateLink, ...links, argonathLink, retryLink, httpLink]),\n        cache,\n\n        // TODO: From config\n        name: `${state.root.$site}:site`,\n        version: `1.0`,\n\n        // TODO: How to set this (server side rendering mode)\n        //  dynamically?\n        ssrMode: false,\n    });\n}\n","import assert from 'assert';\nimport { ApolloLink } from '@apollo/client';\n\nexport default function createAuthLink() {\n    return new ApolloLink(async (operation, next) => {\n        const { state } = operation.getContext();\n        assert(state, `state MUST be set on the context`);\n\n        try {\n            return await makeRequest();\n        } catch (error) {\n            throw error;\n        }\n\n        function makeRequest() {\n            operation.setContext(previous => ({\n                ...previous,\n                headers: {\n                    ...(previous && previous.headers),\n                },\n            }));\n            return next(operation);\n        }\n    });\n}\n","export default async function handleErrors(exec) {\n    try {\n        return await exec();\n    } catch (error) {\n        throw extractGraphqlError(error);\n    }\n}\n\nfunction extractGraphqlError(error) {\n    if (!Array.isArray(error.graphQLErrors)) {\n        return error;\n    }\n    const gqlError = error.graphQLErrors[0];\n    if (!gqlError) {\n        return error;\n    }\n\n    if (!gqlError.extensions) {\n        return error;\n    }\n\n    if (!gqlError.extensions.exception) {\n        Object.assign(error, gqlError.extensions);\n        return error;\n    }\n\n    error = new Error(error.message);\n    error.code = gqlError.extensions.exception.code;\n    return error;\n}\n","import { gql } from '@apollo/client';\nimport DataLoader from 'dataloader';\nimport { getClient, getAuthenticatedClient } from './client/index.js';\nimport handleError from './handle-error.js';\n\nconst MAX_CONCURRENT = 100;\n\nconst INFO = {\n    serve: `\n        type\n        uri\n    `,\n    download: `\n        type\n        uri\n    `,\n    stream: `\n        uri\n        token\n        type\n    `,\n};\n\nexport default function createAssetService(state) {\n    const serveLoader = new DataLoader(createLoaderHandler(getClient, serveAsset));\n    const streamLoader = new DataLoader(createLoaderHandler(getClient, streamAsset));\n    const downloadLoader = new DataLoader(createLoaderHandler(getClient, downloadAsset));\n\n    const authServeLoader = new DataLoader(createLoaderHandler(getAuthenticatedClient, serveAsset));\n    const authStreamLoader = new DataLoader(\n        createLoaderHandler(getAuthenticatedClient, streamAsset)\n    );\n    const authDownloadLoader = new DataLoader(\n        createLoaderHandler(getAuthenticatedClient, downloadAsset)\n    );\n\n    return {\n        serve,\n        stream,\n        download,\n    };\n\n    function serve(key, member) {\n        if (member) {\n            return authServeLoader.load(key);\n        } else {\n            return serveLoader.load(key);\n        }\n    }\n    function stream(key, member) {\n        if (member) {\n            return authStreamLoader.load(key);\n        } else {\n            return streamLoader.load(key);\n        }\n    }\n    function download(key, member) {\n        if (member) {\n            return authDownloadLoader.load(key);\n        } else {\n            return downloadLoader.load(key);\n        }\n    }\n\n    function createLoaderHandler(getClient, handler) {\n        return path => handler(path, find, batch);\n\n        async function find(path, type) {\n            const client = await getClient(state);\n            const queryResult = await client.query({\n                query: gql`\n                    query FindAssetQuery($path: String!) {\n                        asset {\n                            find(input: { path: $path }) {\n                                result {\n                                    path\n                                    mime\n                                    size\n                                    ${type} {\n                                        ${INFO[type]}\n                                    }\n                                }\n                            }\n                        }\n                    }\n                `,\n                variables: { path },\n            });\n            const found = queryResult.data.asset.find.result;\n            if (!found) {\n                throw new Error(`Missing asset at \"${path}\"`);\n            }\n            return found;\n        }\n\n        async function batch(paths, type) {\n            const client = await getClient(state);\n            const queryResult = await client.query({\n                query: gql`\n                    query BatchFindAssetQuery($paths: [String!]!) {\n                        asset {\n                            batch(input: { paths: $paths }) {\n                                result {\n                                    path\n                                    mime\n                                    size\n                                    ${type} {\n                                        ${INFO[type]}\n                                    }\n                                }\n                            }\n                        }\n                    }\n                `,\n                variables: { paths },\n            });\n            const found = queryResult.data.asset.batch.result;\n            return found;\n        }\n    }\n\n    async function downloadAsset(path, find, batch) {\n        if (Array.isArray(path)) {\n            return unique(path, items => handleError(() => batch(items, `download`)));\n        } else {\n            return handleError(() => find(path, `download`));\n        }\n    }\n\n    async function serveAsset(path, find, batch) {\n        if (Array.isArray(path)) {\n            return unique(path, items => handleError(() => batch(items, `serve`)));\n        } else {\n            return handleError(() => find(path, `serve`));\n        }\n    }\n\n    async function streamAsset(path, find, batch) {\n        if (Array.isArray(path)) {\n            return unique(path, items => handleError(() => batch(items, `stream`)));\n        } else {\n            return handleError(() => find(path, `stream`));\n        }\n    }\n\n    async function unique(path, exec) {\n        const unq = path.filter((p, idx) => path.indexOf(p) === idx);\n        const result = await split(unq, MAX_CONCURRENT, exec);\n        // const result = await exec(unq);\n        return path.map(p => result[unq.indexOf(p)]);\n\n        async function split(arr, size, exec) {\n            const arrs = [];\n            for (let index = 0; index < arr.length; index = index + size) {\n                arrs.push(arr.slice(index, index + size));\n            }\n            const result = await Promise.all(arrs.map(exec));\n            return result.flat();\n        }\n    }\n}\n","import { gql } from '@apollo/client';\nimport { getClient } from './client/index.js';\nimport handleError from './handle-error.js';\n\nexport default function createVideoService(state) {\n    return {\n        find,\n        next,\n        list,\n    };\n\n    function find(videoId) {\n        return handleError(() => doFind(videoId));\n    }\n\n    function next() {\n        return handleError(() => doNext());\n    }\n\n    function list(...args) {\n        return handleError(() => doList(...args));\n    }\n\n    async function doFind(videoId) {\n        const client = await getClient(state);\n        const result = await client.query({\n            query: gql`\n                query FindVideo($videoId: ID!) {\n                    video {\n                        find(input: { videoId: $videoId }) {\n                            result {\n                                videoId\n                                title\n                                duration\n                                galleryCount\n                                description {\n                                    short\n                                    long\n                                }\n                                talent {\n                                    type\n                                    talent {\n                                        talentId\n                                        name\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            `,\n            variables: { videoId },\n        });\n        return result.data.video.find.result;\n    }\n\n    async function doNext() {\n        const client = await getClient(state);\n        const result = await client.query({\n            query: gql`\n                query FindNextVideo {\n                    video {\n                        next {\n                            result {\n                                videoId\n                                title\n                                duration\n                                description {\n                                    short\n                                    long\n                                    coming\n                                }\n                                talent {\n                                    type\n                                    talent {\n                                        talentId\n                                        name\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            `,\n        });\n        return result.data.video.next.result;\n    }\n\n    async function doList(order, desc, after, limit) {\n        const client = await getClient(state);\n        if (order) {\n            order = [\n                {\n                    field: order,\n                    desc,\n                },\n            ];\n        }\n\n        const result = await client.query({\n            query: gql`\n                query ListVideo($order: [OrderEntry!], $after: ID, $limit: Int) {\n                    video {\n                        list(input: { order: $order, after: $after, first: $limit }) {\n                            result {\n                                edges {\n                                    node {\n                                        videoId\n                                        title\n                                        duration\n                                        description {\n                                            short\n                                            long\n                                            home\n                                        }\n                                        talent {\n                                            type\n                                            talent {\n                                                talentId\n                                                name\n                                            }\n                                        }\n                                    }\n                                    cursor\n                                }\n                                pageInfo {\n                                    hasNextPage\n                                }\n                            }\n                        }\n                    }\n                }\n            `,\n            variables: { order, after, limit },\n        });\n        const connection = result.data.video.list.result;\n        return connection.edges.map((edge, idx, arr) => ({\n            ...edge.node,\n            cursor: edge.cursor,\n            isLast: idx === arr.length - 1 && !connection.pageInfo.hasNextPage,\n        }));\n    }\n}\n","import { gql } from '@apollo/client';\nimport { getClient } from './client/index.js';\nimport handleError from './handle-error.js';\n\nexport default function createTextService(state) {\n    return {\n        find,\n    };\n\n    function find(slug) {\n        return handleError(() => doFind(slug));\n    }\n\n    async function doFind(slug) {\n        const client = await getClient(state);\n        const result = await client.query({\n            query: gql`\n                query FindText($slug: ID!) {\n                    text {\n                        find(input: { slug: $slug }) {\n                            result {\n                                slug\n                                name\n                                value\n                            }\n                        }\n                    }\n                }\n            `,\n            variables: { slug },\n        });\n        return result.data.text.find.result;\n    }\n}\n","import { gql } from '@apollo/client';\nimport { getClient } from './client/index.js';\nimport handleError from './handle-error.js';\n\nexport default function createBannerService(state) {\n    return {\n        list,\n    };\n\n    function list() {\n        return handleError(() => doList());\n    }\n\n    async function doList() {\n        const client = await getClient(state);\n        const result = await client.query({\n            query: gql`\n                query ListBanners {\n                    banner {\n                        list {\n                            result {\n                                name\n                                link\n                                start\n                            }\n                        }\n                    }\n                }\n            `,\n        });\n        return result.data.banner.list.result;\n    }\n}\n","import { gql } from '@apollo/client';\nimport { getClient } from './client/index.js';\nimport handleError from './handle-error.js';\n\nexport default function createHomepageFeaturesService(state) {\n    return {\n        homepageFeatures,\n    };\n\n    function homepageFeatures() {\n        return handleError(() => getHomepageFeatures());\n    }\n\n    async function getHomepageFeatures() {\n        const client = await getClient(state);\n        const result = await client.query({\n            query: gql`\n                query HomepageFeatures {\n                    homepageFeatures {\n                        homepageFeatures {\n                            result {\n                                title\n                                content {\n                                    title\n                                    talentId\n                                    videoId\n                                }\n                            }\n                        }\n                    }\n                }\n            `,\n        });\n        return result.data.homepageFeatures.homepageFeatures.result;\n    }\n}\n","export default async function promiseTree(value, cache = new WeakMap()) {\n    if (!value || typeof value !== `object`) {\n        return value;\n    }\n\n    if (cache.has(value)) {\n        return cache.get(value);\n    }\n\n    const received = value instanceof Promise ? await value : value;\n\n    if (!received || typeof received !== `object`) {\n        cache.set(value, received);\n        return received;\n    }\n\n    const result = Array.isArray(received) ? [] : {};\n    cache.set(value, result);\n\n    await Promise.all(\n        Object.keys(received).map(async key => {\n            result[key] = await promiseTree(received[key], cache);\n        })\n    );\n\n    return result;\n}\n","export default function mutex(handler) {\n    let executing;\n    return function mutexed() {\n        if (!executing) {\n            executing = handler();\n            if (executing && typeof executing.then === `function`) {\n                executing.then(clearExecuting, clearExecuting);\n            }\n        }\n        return executing;\n    };\n\n    function clearExecuting() {\n        executing = undefined;\n    }\n}\n","import createAssetService from '../../argonath/asset.js';\nimport createVideoService from '../../argonath/video.js';\nimport promiseTree from '../../../lib/promise-tree.js';\nimport createState from '../state.js';\nimport placeholder from '../../../lib/placeholder.js';\nimport mutex from '../mutex.js';\n\n// TODO: From config\nconst VIDEO_SIZES = [`4k`, `1080`, `720`, `360`];\nconst LIMIT = 15;\n\nconst LOADING_VIDEO = {\n    videoId: `video-loading`,\n    models: [],\n    loading: true,\n    poster: {\n        x1: placeholder(16, 9),\n    },\n    image: {\n        portraight: {\n            x1: placeholder(4, 5),\n        },\n        landscape: {\n            x1: placeholder(64, 25),\n        },\n    },\n};\n\nconst LOADING = Array(20)\n    .fill(0)\n    .map((ele, idx) => ({\n        ...LOADING_VIDEO,\n        videoId: `${LOADING_VIDEO.videoId}-${idx}`,\n    }));\n\nexport default function createVideosState({ root, values: { videos } }) {\n    let loading;\n    if (!videos) {\n        videos = loading = LOADING.map(ele => ({\n            ...ele,\n            title: root.$catchPhrase,\n            name: root.$catchPhrase,\n            description: {\n                short: root.$catchPhrase,\n                long: root.$catchPhrase,\n            },\n        }));\n    }\n\n    const prepareVideo = createVideoPreparer(root);\n    const { list: listVideo } = createVideoService(root);\n\n    // list takes (order, after, limit)\n\n    return createState({\n        root,\n\n        values: {\n            $page: `videos`,\n            title: `Videos`,\n            videos,\n        },\n\n        createActions,\n    });\n\n    function createActions(state) {\n        return {\n            load,\n            next: mutex(next),\n        };\n\n        async function load() {\n            if (state.videos !== loading) {\n                return;\n            }\n            const videos = await loadFrom(undefined);\n            state.videos = videos;\n        }\n\n        async function next() {\n            // We don't want next to be available until after\n            //  the initial load is complete\n            if (state.videos === loading) {\n                return;\n            }\n\n            const lastVideo = state.videos[state.videos.length - 1];\n            if (!lastVideo || lastVideo.isLast) {\n                return;\n            }\n\n            const after = lastVideo && lastVideo.cursor;\n            const videos = await loadFrom(after);\n\n            if (videos.length === 0 && state.videos.length > 0) {\n                state.videos[state.videos.length - 1].isLast = true;\n            }\n\n            state.videos = [...state.videos, ...videos].filter(unique);\n        }\n\n        async function loadFrom(after) {\n            let videos = await listVideo(\n                undefined, // order\n                undefined, // desc\n                after, // after\n                LIMIT // count\n            );\n            videos = await Promise.all(videos.map(video => prepareVideo(video, `videos`)));\n            return videos;\n        }\n\n        function unique(ele, idx, arr) {\n            const idIndex = arr.findIndex(item => item.videoId === ele.videoId);\n            return idx === idIndex;\n        }\n    }\n}\n\nexport function createVideoPreparer(state) {\n    // TODO: This needs to be in it's own module\n    const { serve, stream, download } = createAssetService(state);\n    return (video, mode) => prepareVideo(video, mode); //.then(finalizeDownloads);\n\n    function prepareVideo(video, mode) {\n        if (!video) {\n            return video;\n        }\n\n        const isVideo = mode === `video`;\n        const isVideos = mode === `videos`;\n        const isHome = mode === `home`;\n\n        // const downloads = isVideo && prepareDownloads(video) || [];\n        const [modelId, sceneId] = video.videoId.split(`:`);\n\n        return promiseTree({\n            ...video,\n            // downloads,\n            video: isVideo && streamVideo(`/members/streamvids/${modelId}/${modelId}-${sceneId}`),\n            thumbs:\n                isVideo &&\n                serveAsset(`/members/streamvids/${modelId}/${modelId}-${sceneId}-thumbs.mp4`, true),\n            image:\n                isVideo ||\n                (isVideos && {\n                    portraight: {\n                        x1: serveAsset(\n                            `/members/models/${modelId}/scenes/${sceneId}/selfie-sm.jpg`\n                        ),\n                    },\n                    landscape: {\n                        x1: serveAsset(\n                            `/members/models/${modelId}/scenes/${sceneId}/videothumb.jpg`\n                        ),\n                    },\n                }),\n            homeImage: isHome && {\n                portraight: {\n                    x1: serveAsset(`/members/models/${modelId}/scenes/${sceneId}/homethumb-sm.jpg`),\n                },\n                landscape: {\n                    x1: serveAsset(\n                        `/members/models/${modelId}/scenes/${sceneId}/homethumb-big.jpg`\n                    ),\n                },\n            },\n            poster: isVideo && {\n                x1: serveAsset(`/members/models/${modelId}/scenes/${sceneId}/videothumb.jpg`),\n            },\n            models: prepareModels(video.talent),\n        });\n    }\n\n    function prepareDownloads(video) {\n        const [modelId, videoId] = video.videoId.split(`:`);\n        // TODO: video does not have sizes...\n        //  We need a highest quality coming out of argonath\n        const downloads = VIDEO_SIZES\n            // .filter(size => video[`size${size}`])\n            .map(size => ({\n                title: `${size}`,\n                asset: downloadFile(\n                    `/members/streamvids/${modelId}/${modelId}-${videoId}-${size}.mp4`,\n                    true\n                ),\n            }));\n\n        if (video.galleryCount > 0) {\n            downloads.push({\n                title: `Download Picture Set`,\n                pictureSet: true,\n                asset: downloadFile(\n                    `/members/models/${modelId}/scenes/${videoId}/${modelId}-${videoId}-pics.zip`,\n                    true\n                ),\n            });\n        }\n\n        return downloads;\n    }\n\n    function prepareModels(talent) {\n        if (!talent) {\n            return [];\n        }\n\n        return talent\n            .filter(entry => entry.type === `MODEL`)\n            .map(talent => {\n                const { talentId, ...rest } = talent.talent;\n                return {\n                    modelId: talentId,\n                    ...rest,\n                    image: {\n                        portraight: {\n                            x1: serveAsset(`/members/models/${talentId}/profile-sm.jpg`),\n                        },\n                        landscape: {\n                            x1: serveAsset(`/members/models/${talentId}/profile-big.jpg`),\n                        },\n                    },\n                };\n            });\n    }\n\n    async function serveAsset(path, member) {\n        const info = await serve(path, member);\n        if (!info) {\n            console.warn(`Unable to find asset info for \"${path}\"`);\n            return;\n        }\n        if (info.serve && info.serve.uri) {\n            return info.serve.uri;\n        } else {\n            return undefined;\n        }\n    }\n\n    async function streamVideo(path) {\n        const info = await stream(path, true);\n        if (!info) {\n            console.warn(`Unable to find asset info for \"${path}\"`);\n            return undefined;\n        }\n        return info.stream;\n    }\n\n    async function downloadFile(path) {\n        const info = await download(path, true);\n        if (!info) {\n            console.warn(`Unable to find asset info for \"${path}\"`);\n            return undefined;\n        }\n        return info;\n    }\n}\n","import { gql } from '@apollo/client';\nimport { getClient } from './client/index.js';\nimport handleError from './handle-error.js';\n\nexport default function createTalentService(state) {\n    return {\n        find,\n        list,\n    };\n\n    function find(talentId) {\n        return handleError(() => doFind(talentId));\n    }\n    function list(...args) {\n        return handleError(() => doList(...args));\n    }\n\n    async function doFind(talentId) {\n        const client = await getClient(state);\n        const result = await client.query({\n            query: gql`\n                query FindTalent($talentId: ID!) {\n                    talent {\n                        find(input: { talentId: $talentId }) {\n                            result {\n                                talentId\n                                name\n                                videos {\n                                    videoId\n                                    title\n                                    description {\n                                        short\n                                        long\n                                    }\n                                }\n                                dimensions {\n                                    height\n                                    weight\n                                    measurements {\n                                        cup\n                                        waist\n                                        hips\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            `,\n            variables: { talentId },\n        });\n        return result.data.talent.find.result;\n    }\n\n    async function doList(order, desc, after, limit) {\n        const client = await getClient(state);\n        if (order) {\n            order = [\n                {\n                    field: order,\n                    desc,\n                },\n            ];\n        }\n\n        const result = await client.query({\n            query: gql`\n                query ListTalent($order: [OrderEntry!], $after: ID, $limit: Int) {\n                    talent {\n                        list(input: { order: $order, after: $after, first: $limit }) {\n                            result {\n                                edges {\n                                    node {\n                                        talentId\n                                        name\n                                    }\n                                    cursor\n                                }\n                                pageInfo {\n                                    hasNextPage\n                                }\n                            }\n                        }\n                    }\n                }\n            `,\n            variables: { order, after, limit },\n        });\n        const connection = result.data.talent.list.result;\n        return connection.edges.map((edge, idx, arr) => ({\n            ...edge.node,\n            cursor: edge.cursor,\n            isLast: idx === arr.length - 1 && !connection.pageInfo.hasNextPage,\n        }));\n    }\n}\n","import createAssetService from '../../argonath/asset.js';\nimport createTalentService from '../../argonath/talent.js';\nimport promiseTree from '../../../lib/promise-tree.js';\nimport placeHolder from '../../../lib/placeholder.js';\nimport mutex from '../mutex.js';\nimport createState from '../state.js';\n\nconst LIMIT = 15;\n\nconst NAMES = (\n    `ANGEL BELLINI KREY BAILEY BLOSSOM TAYLOR HAZEL ` +\n    `JASMINE JEWELZ JILL QUINN MACE MEADOWS KALISY DEVI EXICO ` +\n    `ROSE SU TRISTAN`\n).split(` `);\n\nconst LOADING_MODELS_MODEL = {\n    modelId: `model-loading`,\n    name: ``,\n    loading: true,\n    image: {\n        portraight: {\n            x1: placeHolder(8, 9),\n        },\n        landscape: {\n            x1: placeHolder(16, 9),\n        },\n    },\n};\n\nconst DEFAULT = [\n    createLoadingModel(0),\n    createLoadingModel(1),\n    createLoadingModel(2),\n    createLoadingModel(3),\n    createLoadingModel(4),\n    createLoadingModel(5),\n    createLoadingModel(6),\n    createLoadingModel(7),\n    createLoadingModel(8),\n];\n\nexport default function createModelsState({ root, values: { models = DEFAULT } = {} }) {\n    const prepareModel = createModelPreparer(root);\n    const { list: listTalent } = createTalentService(root);\n\n    const state = createState({\n        root,\n\n        values: {\n            $page: `models`,\n            title: `Models`,\n            models,\n        },\n\n        createActions,\n    });\n\n    return state;\n\n    function createActions() {\n        return {\n            load,\n            next: mutex(next),\n        };\n\n        async function load() {\n            if (state.models !== DEFAULT) {\n                return;\n            }\n            const models = await loadFrom(undefined);\n            state.models = models;\n        }\n\n        async function next() {\n            // We don't want next to be available until after\n            //  the initial load is complete\n            if (state.models === DEFAULT) {\n                return;\n            }\n\n            const lastModel = state.models[state.models.length - 1];\n            if (!lastModel || lastModel.isLast) {\n                return;\n            }\n\n            const after = lastModel && lastModel.cursor;\n            const models = await loadFrom(after);\n\n            if (models.length === 0 && state.models.length > 0) {\n                state.models[state.models.length - 1].isLast = true;\n            }\n\n            state.models = [...state.models, ...models].filter(unique);\n        }\n\n        async function loadFrom(after) {\n            const items = await listTalent(\n                undefined, // order\n                undefined, // desc\n                after, // after\n                LIMIT // count\n            );\n            const models = await Promise.all(items.map(talent => prepareModel(talent)));\n            return models;\n        }\n\n        function unique(ele, idx, arr) {\n            const idIndex = arr.findIndex(item => item.modelId === ele.modelId);\n            return idx === idIndex;\n        }\n    }\n}\n\nexport function createModelPreparer(state) {\n    const { serve } = createAssetService(state);\n    return function prepareModel(talent) {\n        if (!talent) {\n            return talent;\n        }\n        const { talentId, videos, ...rest } = talent;\n        return promiseTree({\n            modelId: talentId,\n            ...rest,\n            image: {\n                portraight: {\n                    x1: serveImage(`/members/models/${talentId}/profile-sm.jpg`),\n                },\n                landscape: {\n                    x1: serveImage(`/members/models/${talentId}/profile-big.jpg`),\n                },\n            },\n            videos:\n                videos &&\n                videos.map(video => {\n                    const [, sceneId] = video.videoId.split(`:`);\n                    return {\n                        ...video,\n                        image: {\n                            portraight: {\n                                x1: serveImage(\n                                    `/members/models/${talentId}/scenes/${sceneId}/selfie-sm.jpg`\n                                ),\n                            },\n                            landscape: {\n                                x1: serveImage(\n                                    `/members/models/${talentId}/scenes/${sceneId}/videothumb.jpg`\n                                ),\n                            },\n                        },\n                    };\n                }),\n        });\n    };\n\n    async function serveImage(path) {\n        if (!path) {\n            return undefined;\n        }\n        const info = await serve(path);\n        if (!info) {\n            console.warn(`Unable to find asset info for \"${path}\"`);\n            return undefined;\n        }\n        return info && info.serve && info.serve.uri;\n    }\n}\n\nfunction createLoadingModel(index) {\n    return {\n        ...LOADING_MODELS_MODEL,\n        modelId: `${LOADING_MODELS_MODEL.modelId}-${index}`,\n        name: randomName(),\n    };\n\n    function randomName() {\n        const first = NAMES[Math.floor(Math.random() * NAMES.length)];\n        const last = NAMES[Math.floor(Math.random() * NAMES.length)];\n        return `${first} ${last}`;\n    }\n}\n","import createAssetService from '../../argonath/asset.js';\nimport createVideoService from '../../argonath/video.js';\nimport createTextService from '../../argonath/text.js';\nimport createBannerService from '../../argonath/banner.js';\nimport createHomepageFeaturesService from '../../argonath/homepage-features.js';\nimport { createVideoPreparer } from './videos.js';\nimport { createModelPreparer } from './models.js';\nimport promiseTree from '../../../lib/promise-tree.js';\n\nimport createState from '../state.js';\nimport placeholder from '../../../lib/placeholder.js';\n\nconst LOADING_VIDEO = {\n    videoId: `video-loading`,\n    title: ``,\n    loading: true,\n    models: [\n        {\n            modelId: `model-loading`,\n            name: ``,\n            loading: true,\n            image: {\n                portraight: {\n                    x1: placeholder(8, 9),\n                },\n            },\n        },\n    ],\n    description: {\n        short: ``,\n        long: ``,\n    },\n    homeImage: {\n        portraight: {\n            x1: placeholder(4, 5),\n        },\n        landscape: {\n            x1: placeholder(64, 25),\n        },\n    },\n};\n\nconst LOADING_FEATURE_VIDEO = {\n    loading: true,\n    videoId: `feature-video-loading`,\n    title: `Loading video feature`,\n    image: {\n        landscape: {\n            x1: placeholder(64, 25),\n        },\n    },\n};\n\nconst LOADING_FEATURE_MODEL = {\n    loading: true,\n    modelId: `feature-model-loading`,\n    title: `Loading model feature`,\n    image: {\n        landscape: {\n            x1: placeholder(64, 25),\n        },\n    },\n};\n\nconst LOADING = [loadingVideo(0), loadingVideo(1), loadingVideo(2), loadingVideo(3)];\nconst LOADING_FEATURES = [\n    {\n        title: `featurelist-1`,\n        content: [loadingVideoFeature(0), loadingVideoFeature(1), loadingVideoFeature(2)],\n    },\n    {\n        title: `featurelist-2`,\n        content: [loadingVideoFeature(3), loadingVideoFeature(4), loadingVideoFeature(5)],\n    },\n    {\n        title: `featurelist-3`,\n        content: [loadingModelFeature(0), loadingModelFeature(1), loadingModelFeature(2)],\n    },\n];\n\n// TODO: Change this to loading once this is coming from a datasource\nconst LOADING_NEXT = {\n    videoId: `video-loading`,\n    models: [\n        {\n            modelId: `model-loading`,\n            name: ``,\n            loading: true,\n            image: {\n                portraight: {\n                    x1: placeholder(8, 9),\n                },\n            },\n        },\n    ],\n    loading: true,\n    description: {\n        short: ``,\n    },\n    homeImage: {\n        portraight: {\n            x1: placeholder(4, 5),\n        },\n        landscape: {\n            x1: placeholder(64, 25),\n        },\n    },\n};\n\nconst DEFAULT_NEWS = {\n    name: ``,\n    value: ``,\n};\nconst DEFAULT_OUR_STORY = {\n    name: ``,\n    value: ``,\n};\nconst DEFAULT_SPECIAL = {\n    portraight: {\n        x1: placeholder(3, 5),\n    },\n    landscape: {\n        x1: placeholder(16, 9),\n    },\n};\n\nexport default function createHomeState({\n    root,\n    values: {\n        recent = LOADING,\n        features = LOADING_FEATURES,\n        next = LOADING_NEXT,\n        news = DEFAULT_NEWS,\n        ourStory = DEFAULT_OUR_STORY,\n        special = DEFAULT_SPECIAL,\n        specialLink = `/join`,\n    } = {},\n}) {\n    const { serve } = createAssetService(root);\n    const { list: videoList, next: videoNext } = createVideoService(root);\n    const { find: textFind } = createTextService(root);\n    const { list: bannerList } = createBannerService(root);\n    const { homepageFeatures } = createHomepageFeaturesService(root);\n    const prepareVideo = createVideoPreparer(root);\n    const prepareModel = createModelPreparer(root);\n    const state = createState({\n        root,\n        values: {\n            $page: `home`,\n            recent,\n            features,\n            next,\n            title: ``,\n            news,\n            ourStory,\n            special,\n            specialLink,\n        },\n        derived: {\n            latest: {\n                from: [`recent`],\n                combine: state => state.recent[0],\n            },\n            recentModels: {\n                from: [`recent`],\n                // TODO: It would be better if this could somehow return\n                //  the same array every time....\n                combine: state =>\n                    state.recent.slice(1, 4).map(video => ({\n                        ...video.models[0],\n                        videoId: video.videoId,\n                    })),\n            },\n        },\n        createActions,\n    });\n    return state;\n\n    function createActions(state) {\n        return { load };\n\n        async function load() {\n            // If we've alreadt loaded do nothihg\n            if (state.recent !== LOADING) {\n                return;\n            }\n\n            try {\n                const banner = (await bannerList()).reduce((c, n) => {\n                    const now = new Date();\n                    const current = new Date(c.start);\n                    const next = new Date(n.start);\n                    // if there is a current\n                    // and next is later than now (next is in future) => current\n                    // or current is later than next (current is newer) => current\n                    // else => next\n                    return c && (next - now > 0 || current - next > 0) ? c : n;\n                });\n\n                state.special = await promiseTree({\n                    portraight: {\n                        x1: serveImage(`/graphics/homepage-${banner.name}-hero-small.jpg`),\n                    },\n                    landscape: {\n                        x1: serveImage(`/graphics/homepage-${banner.name}-hero-big.jpg`),\n                    },\n                });\n                state.specialLink = banner.link || `/join`;\n\n                const recent = await videoList(\n                    `release`, // order by release\n                    true, // desc\n                    undefined, // after\n                    4 // limit\n                );\n\n                const videos = await Promise.all(\n                    recent.map(\n                        // Prepare the video without the detailed CDN data\n                        video => prepareVideo(video, `home`)\n                    )\n                );\n\n                state.recent = videos;\n\n                const features = await homepageFeatures();\n\n                state.features = await Promise.all(\n                    features.map(async feature => ({\n                        ...feature,\n                        content: await Promise.all(\n                            feature.content.map(item => {\n                                if (item.videoId) {\n                                    return prepareVideo(item, `videos`);\n                                }\n                                if (item.talentId) {\n                                    return prepareModel(item);\n                                }\n                                return item;\n                            })\n                        ),\n                    }))\n                );\n                const nextVideo = await videoNext();\n                if (nextVideo) {\n                    state.next = await prepareVideo(nextVideo, `home`);\n                } else {\n                    state.next = undefined;\n                }\n\n                state.news = await textFind(`news`);\n                state.ourStory = await textFind(`our-story`);\n            } catch (error) {\n                console.error(error);\n            }\n        }\n    }\n\n    async function serveImage(path) {\n        if (!path) {\n            return undefined;\n        }\n        const info = await serve(path);\n        if (!info) {\n            console.warn(`Unable to find asset info for \"${path}\"`);\n            return undefined;\n        }\n        return info && info.serve && info.serve.uri;\n    }\n}\n\nfunction loadingVideo(index) {\n    return {\n        ...LOADING_VIDEO,\n        videoId: `${LOADING_VIDEO.videoId}-${index}`,\n        models: LOADING_VIDEO.models.map((model, modelIndex) => ({\n            ...model,\n            modelId: `${model.modelId}-${index}-${modelIndex}`,\n        })),\n    };\n}\n\nfunction loadingVideoFeature(index) {\n    return {\n        ...LOADING_FEATURE_VIDEO,\n        videoId: `${LOADING_FEATURE_VIDEO.videoId}-${index}`,\n    };\n}\n\nfunction loadingModelFeature(index) {\n    return {\n        ...LOADING_FEATURE_MODEL,\n        modelId: `${LOADING_FEATURE_MODEL.modelId}-${index}`,\n    };\n}\n","import createAssetService from '../../argonath/asset.js';\nimport createTalentService from '../../argonath/talent.js';\nimport promiseTree from '../../../lib/promise-tree.js';\n\nimport createState from '../state.js';\nimport placeholder from '../../../lib/placeholder.js';\n\nconst LOADING = {\n    name: ``,\n    dimensions: {\n        height: `FITNESS`,\n        weight: `IS`,\n        measurements: `SEXY`,\n    },\n    image: {\n        portraight: {\n            x1: placeholder(4, 5),\n        },\n        landscape: {\n            x1: placeholder(16, 9),\n        },\n    },\n    videos: [],\n};\n\nexport default function createModelState({ root, values: { model, modelId = `` } = {} }) {\n    const loadingModel = {\n        ...LOADING,\n        name: modelId.split(`-`).join(` `),\n        // The id needs to match for pathing\n        modelId,\n    };\n    model = model || loadingModel;\n    const { serve } = createAssetService(root);\n    const { find: findTalent } = createTalentService(root);\n\n    const state = createState({\n        root,\n\n        values: {\n            $page: `model`,\n            title: ``,\n            model,\n        },\n\n        derived: {\n            title: {\n                from: [`model`],\n                combine: state => state.model.name,\n            },\n        },\n\n        createActions,\n    });\n\n    return state;\n\n    function createActions() {\n        return {\n            load,\n        };\n\n        async function load() {\n            if (state.model !== loadingModel) {\n                return;\n            }\n\n            if (!modelId) {\n                root.page.notFound();\n                return;\n            }\n\n            const model = await findTalent(modelId);\n            if (!model) {\n                root.page.notFound();\n                return;\n            }\n\n            // TODO: Separate profile and video load\n            const prepared = await prepareModel(model);\n            state.model = prepared;\n        }\n    }\n\n    function prepareModel(talent) {\n        if (!talent) {\n            return talent;\n        }\n        const { talentId, videos, ...rest } = talent;\n        return promiseTree({\n            modelId: talentId,\n            ...rest,\n            image: {\n                portraight: {\n                    x1: serveImage(`/members/models/${talentId}/profile-sm.jpg`),\n                },\n                landscape: {\n                    x1: serveImage(`/members/models/${talentId}/profile-big.jpg`),\n                },\n            },\n            videos:\n                videos &&\n                videos.map(video => {\n                    const [, sceneId] = video.videoId.split(`:`);\n                    return {\n                        ...video,\n                        image: {\n                            portraight: {\n                                x1: serveImage(\n                                    `/members/models/${talentId}/scenes/${sceneId}/selfie-sm.jpg`\n                                ),\n                            },\n                            landscape: {\n                                x1: serveImage(\n                                    `/members/models/${talentId}/scenes/${sceneId}/videothumb.jpg`\n                                ),\n                            },\n                        },\n                    };\n                }),\n        });\n    }\n\n    async function serveImage(path) {\n        if (!path) {\n            return undefined;\n        }\n        const info = await serve(path);\n        if (!info) {\n            console.warn(`Unable to find asset info for \"${path}\"`);\n            return undefined;\n        }\n        return info && info.serve && info.serve.uri;\n    }\n}\n","import assert from 'assert';\nimport createAssetService from '../../argonath/asset.js';\nimport createVideoService from '../../argonath/video.js';\nimport createState from '../state.js';\nimport promiseTree from '../../../lib/promise-tree.js';\nimport placeholder from '../../../lib/placeholder.js';\nimport { createVideoPreparer } from './videos.js';\n\nconst VIDEO_SIZES = [`4k`, `1080`, `720`, `360`];\n\nconst LOADING = {\n    loading: true,\n    models: [],\n    duration: 0,\n    image: {\n        portraight: {\n            x1: placeholder(4, 5),\n        },\n        landscape: {\n            x1: placeholder(64, 25),\n        },\n    },\n    poster: {\n        x1: placeholder(16, 9),\n    },\n    downloads: VIDEO_SIZES.map(size => ({\n        title: `${size} - ...`,\n        uri: false,\n    })),\n    gallery: Array(20)\n        .fill(0)\n        .map((v, index) => {\n            return {\n                thumb: placeholder(2, 3),\n                full: placeholder(2, 3),\n            };\n        }),\n};\n\nexport default function createVideoState({ root, values: { video, photoIndex, videoId } = {} }) {\n    if (!videoId && video) {\n        videoId = video.videoId;\n    }\n    assert(videoId, `videoId or video is required`);\n    const loadingVideo = {\n        ...LOADING,\n        title: root.$catchPhrase,\n        description: {\n            short: root.$catchPhrase,\n            long: root.$catchPhrase,\n        },\n        // The id needs to match for pathing\n        videoId,\n    };\n    video = video || loadingVideo;\n    const prepareVideo = createVideoPreparer(root);\n    const { find: findVideo } = createVideoService(root);\n\n    return createState({\n        root,\n\n        values: {\n            $page: `video`,\n            video,\n            photoIndex: photoIndex === undefined ? -1 : photoIndex,\n        },\n\n        derived: {\n            title: {\n                from: [`video`],\n                combine: state => state.video.title,\n            },\n            downloads: {\n                from: [`video`],\n                combine: prepareDownloads,\n            },\n            gallery: {\n                from: [`video`],\n                combine: prepareGallery,\n            },\n        },\n\n        createActions,\n    });\n\n    function createActions(state) {\n        let loading, videoLoading;\n\n        return {\n            load,\n        };\n\n        function load() {\n            if (!videoId) {\n                root.page.notFound();\n                return;\n            }\n            if (!loading) {\n                loading = doLoad();\n            }\n            return loading;\n        }\n\n        async function doLoad() {\n            const video = await loadVideo();\n            if (!video) {\n                root.page.notFound();\n            }\n        }\n\n        async function loadVideo() {\n            if (!videoId) {\n                return undefined;\n            }\n            videoLoading = videoLoading || findVideo(videoId);\n            const video = await videoLoading;\n            if (!video) {\n                return undefined;\n            }\n\n            // TODO: Extract downloads in the same way as gallery\n            // TODO: Why is this running multiple times...? (Appears to be running 3 times!?)\n            const prepared = await prepareVideo(video, `video`);\n\n            // TODO: We should be createing a state from the video so\n            //  we can subscribe to values within it\n\n            state.video = prepared;\n            return video;\n        }\n    }\n\n    function prepareGallery(state) {\n        // TODO: We don't need the full images immediately\n        if (!state.video) {\n            return [];\n        }\n\n        if (Array.isArray(state.video.gallery)) {\n            return state.video.gallery;\n        }\n\n        const galleryCount = state.video.galleryCount > 0 ? parseInt(state.video.galleryCount) : 0;\n\n        const [modelId, videoId] = state.video.videoId.split(`:`);\n\n        // TODO: Need to either consider a better naming convention\n        //  or have an asset service that can return a list or\n        //  store the relevant data on the video record\n        const sceneIndex = videoId.replace(/[a-z]/gi, ``);\n        const { serve } = createAssetService(state);\n        return promiseTree(\n            Array(galleryCount)\n                .fill(0)\n                .map((_, index) => {\n                    return {\n                        thumb: serveImage(\n                            `/members/models/${modelId}/scenes/${videoId}/photos` +\n                                `/thumbs/${state.root.$site}-${modelId}-${sceneIndex}-${\n                                    index + 1\n                                }.jpg`\n                        ),\n                        // full: serveImage(\n                        //     `/members/models/${modelId}/scenes/${videoId}/photos` +\n                        //         `/${state.root.$site}-${modelId}-${sceneIndex}-${index + 1}.jpg`,\n                        //     true\n                        // ),\n                    };\n                })\n        );\n\n        async function serveImage(path, member) {\n            const info = await serve(path, member);\n            if (!info) {\n                console.warn(`Unable to find asset info for \"${path}\"`);\n                return;\n            }\n            if (info.serve && info.serve.uri) {\n                return info.serve.uri;\n            } else {\n                return undefined;\n            }\n        }\n    }\n\n    async function prepareDownloads(state) {\n        if (!state.video) {\n            return [];\n        }\n\n        if (Array.isArray(state.video.downloads)) {\n            return state.video.downloads;\n        }\n\n        const { download } = createAssetService(state);\n        const [modelId, videoId] = state.video.videoId.split(`:`);\n        // TODO: video does not have sizes...\n        //  We need a highest quality coming out of argonath\n        const downloads = VIDEO_SIZES.map(size => ({\n            title: `${size}`,\n            asset: downloadFile(\n                `/members/streamvids/${modelId}/${modelId}-${videoId}-${size}.mp4`,\n                true\n            ),\n        }));\n\n        if (state.video.galleryCount > 0) {\n            downloads.push({\n                title: `Download Picture Set`,\n                pictureSet: true,\n                asset: downloadFile(\n                    `/members/models/${modelId}/scenes/${videoId}/${modelId}-${videoId}-pics.zip`,\n                    true\n                ),\n            });\n        }\n\n        const finalDownloads = await promiseTree(downloads);\n        const result = finalDownloads\n            .filter(download => download.asset)\n            .map(downloadResult => {\n                const {\n                    title,\n                    pictureSet,\n                    asset: { size, download },\n                } = downloadResult;\n                const uri = download && download.uri;\n\n                const sizeMb = Math.floor(size / 1024 / 1024);\n                const titleText =\n                    sizeMb > 0 && pictureSet !== true ? `${title} - ${sizeMb}MB` : title;\n\n                return {\n                    title: titleText,\n                    uri,\n                };\n            });\n        return result;\n\n        async function downloadFile(path) {\n            const info = await download(path, true);\n            if (!info) {\n                console.warn(`Unable to find asset info for \"${path}\"`);\n                return undefined;\n            }\n            return info;\n        }\n    }\n}\n","import createState from '../state.js';\n\nexport default function createWelcomeState({ root }) {\n    return createState({\n        root,\n\n        values: {\n            $page: `welcome`,\n            title: `Welcome`,\n            waiting: false,\n        },\n\n        createActions,\n    });\n\n    function createActions(state) {\n        return {\n            load,\n        };\n\n        async function load() {\n            // const interactionId = root.interaction.start();\n            // state.waiting = true;\n            // try {\n            //     await root.user.welcomeLogin();\n            // } finally {\n            //     root.interaction.end(interactionId);\n            //     state.waiting = false;\n            // }\n        }\n    }\n}\n","import assert from 'assert';\n\n// Pages\nimport createHomeState from './home.js';\nimport createModelsState from './models.js';\nimport createModelState from './model.js';\nimport createVideosState from './videos.js';\nimport createVideoState from './video.js';\nimport createWelcomeState from './welcome.js';\n// import createLinkedLoginState from './linked-login.js';\nimport createState from '../state.js';\n\nconst VERSION_ROUTE = /^\\/v\\d+_\\d+_\\d+.*(\\/.*)$/;\nconst FALSE_BASE_URL = `http://cd4083406e10.com`;\n\nexport default function createPageState({ root, values: { current } = {} }) {\n    // TODO: Pass params... how to extract? They are different per page\n    current = pageStateFromPageData(root, current);\n\n    const state = createState({\n        root,\n        values: {\n            current,\n        },\n        derived: {\n            title: {\n                from: [`current.title`],\n                combine: buildTitle,\n            },\n            path: {\n                from: [`current`],\n                combine: buildPath,\n            },\n        },\n        createActions,\n    });\n\n    return state;\n\n    function createActions(state) {\n        return {\n            navigate,\n            notFound,\n        };\n\n        function notFound() {\n            state.current = createState({\n                root,\n                values: {\n                    $page: `404`,\n                    title: `Not Found`,\n                },\n            });\n        }\n\n        async function navigate(path) {\n            path = normalizePath(path);\n            assert(path.startsWith(`/`), `path MUST start with \"/\". Got \"${path}\"`);\n\n            if (!pathUnderstood(path)) {\n                notFound();\n                return;\n            }\n\n            // Make we apply the same canonical value every time to prevent\n            //  unecessary changes\n            path = canonicalizePath(path);\n\n            // Don't create a new state if not necessary\n            if (path !== state.path) {\n                // Update the current state\n                state.current = pageStateFromPath(root, path);\n            }\n\n            // This should only load if we don't already have data\n            if (typeof state.current.load === `function`) {\n                await state.current.load();\n            }\n        }\n    }\n\n    function buildTitle(state) {\n        return [`${state.root.$site}.com`, state.current?.title || state.root.$catchPhrase]\n            .filter(Boolean)\n            .join(` - `);\n    }\n\n    function buildPath(state) {\n        switch (state.current.$page) {\n            case `home`:\n                return `/`;\n            case `models`:\n                // TODO: Params should be specific\n                return `/models${params(state.current.params)}`;\n            case `videos`:\n                // TODO: Params should be specific\n                return `/videos${params(state.current.params)}`;\n            case `model`:\n                return `/models/${encodeURIComponent(state.current.model.modelId)}`;\n            case `video`:\n                if (state.current.photoIndex > -1) {\n                    return (\n                        `/videos/${encodeURIComponent(state.current.video.videoId)}` +\n                        `?photo=${encodeURIComponent(state.current.photoIndex)}`\n                    );\n                } else {\n                    return `/videos/${encodeURIComponent(state.current.video.videoId)}`;\n                }\n            case `404`:\n                // Return the current path\n                return state.path;\n            default:\n                return `/${state.current.$page}`;\n        }\n\n        function params(values) {\n            if (!values) {\n                return ``;\n            }\n            const entries = Object.fromEntries(values);\n            if (entries.length === 0) {\n                return ``;\n            }\n\n            values = entries\n                .map(([name, value]) => `${encodeURIComponent(name)}=${encodeURIComponent(value)}`)\n                .join(`&`);\n\n            return `?${values}`;\n        }\n    }\n\n    function pageStateFromPath(root, path) {\n        const url = new URL(path, FALSE_BASE_URL);\n        const params = Object.fromEntries(url.searchParams.entries());\n        let [, page, ...subPage] = url.pathname.split(`/`);\n        if (page === ``) {\n            page = `home`;\n        }\n\n        const data = { $page: page };\n        // TODO: More generic way to handle this?\n        if (page === `videos` && subPage[0]) {\n            data.$page = `video`;\n            data.videoId = decodeURIComponent(subPage[0]);\n        } else if (page === `models` && subPage[0]) {\n            data.$page = `model`;\n            data.modelId = decodeURIComponent(subPage[0]);\n        } else if (page === `join` && subPage.length) {\n            data.biller = subPage.join(`/`);\n        }\n\n        return pageStateFromPageData(root, data, params);\n    }\n\n    function pageStateFromPageData(root, { $page, ...data } = {}, params) {\n        switch ($page) {\n            case undefined:\n            case `home`:\n                return createHomeState({ root, values: data });\n            case `model`:\n                return createModelState({ root, values: data });\n            case `models`:\n                // TODO: Add relevant params as values\n                return createModelsState({ root, values: data });\n            case `video`:\n                return createVideoState({ root, values: data });\n            case `videos`:\n                return createVideosState({ root, values: data });\n            case `welcome`:\n                return createWelcomeState({ root, values: data });\n            // case `linked-login`:\n            //     return createLinkedLoginState({ root, values: data });\n            default:\n                return createState({\n                    root,\n                    values: {\n                        $page,\n                        title: $page,\n                    },\n                });\n        }\n    }\n\n    function normalizePath(path) {\n        if (path.endsWith(`/`)) {\n            path = path.substr(0, path.length - 1);\n        }\n\n        if (!path) {\n            path = `/`;\n        }\n\n        if (VERSION_ROUTE.test(path)) {\n            path = path.replace(VERSION_ROUTE, `$1`);\n        }\n\n        return path;\n    }\n\n    function canonicalizePath(path) {\n        // TODO: We need to expose this for usage externally (to check is window should push satte...\n        //  might be good externally with default values applied?)\n        const url = new URL(path, FALSE_BASE_URL);\n        let qs = ``;\n        const entries = Array.from(url.searchParams.entries());\n        if (entries.length) {\n            // TODO: Default values?\n            const params = entries\n                .sort(([name1], [name2]) => {\n                    if (name1 < name2) {\n                        return -1;\n                    } else if (name1 > name2) {\n                        return 1;\n                    } else {\n                        return 0;\n                    }\n                })\n                .map(([key, value]) => {\n                    return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;\n                })\n                .join(`&`);\n            qs = `?${params}`;\n        }\n\n        return `${url.pathname}${qs}`;\n    }\n\n    function pathUnderstood(path) {\n        const url = new URL(path, FALSE_BASE_URL);\n        const [, page, ...subPage] = url.pathname.split(`/`);\n        switch (page) {\n            case ``:\n            case `home`:\n            case `webmasters`:\n            case `usc2257`:\n            case `privacy`:\n            case `terms`:\n            case `welcome`:\n            case `linked-login`:\n            case `password-reset`:\n            case `search-results`:\n                return subPage.length === 0;\n            case `models`:\n            case `videos`:\n                return subPage.length <= 1;\n            default:\n                return false;\n        }\n    }\n\n    function ignoreFirst(handler) {\n        let first = true;\n        return function firstIgnored(...args) {\n            if (first) {\n                first = false;\n                return undefined;\n            } else {\n                return handler(...args);\n            }\n        };\n    }\n}\n","import { gql } from '@apollo/client';\nimport { getClient } from './client/index.js';\nimport handleError from './handle-error.js';\n\nexport default function createPackageService(state) {\n    return {\n        packages,\n    };\n\n    function packages() {\n        return handleError(() => getPackages());\n    }\n\n    async function getPackages() {\n        const client = await getClient(state);\n        const result = await client.query({\n            query: gql`\n                query ListPackages {\n                    package {\n                        list {\n                            result {\n                                edges {\n                                    node {\n                                        sub\n                                        code\n                                        current\n                                        previous\n                                        description\n                                        default\n                                        trial\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            `,\n        });\n        const found = result.data.package.list.result.edges.map(edge => edge.node);\n        return found;\n    }\n}\n","import assert from 'assert';\nimport createState from './state.js';\nimport createPackageService from '../argonath/package.js';\nimport createPurchaseService from '../argonath/purchase.js';\nimport mutex from './mutex.js';\n\nconst LOADING = {\n    current: 2999,\n    previous: 0,\n    currency: `$`,\n};\n\nconst VALID_BILLERS = [`verotel/flex-pay`, `verotel/rum`];\n\nexport default function createBillerState({\n    root,\n    values: { biller = VALID_BILLERS[0], packages } = {},\n}) {\n    const defaultPackages = Array(3)\n        .fill(0)\n        .map((_, index) => ({\n            ...LOADING,\n            code: `loading-${index}`,\n            loading: true,\n            description: root.$catchPhrase,\n            default: index === 1,\n        }));\n\n    const { packages: availablePackages } = createPackageService(root);\n    const { pay, upgrade: payUpgrade } = createPurchaseService(root);\n\n    const state = createState({\n        root,\n        values: {\n            biller,\n            packages: packages || defaultPackages,\n            error: undefined,\n        },\n        transform: {\n            biller: value => {\n                assert(\n                    VALID_BILLERS.includes(biller),\n                    `Biller \"${value}\" is invalid. Valid billers are: ${VALID_BILLERS.join(`, `)}`\n                );\n                return value;\n            },\n        },\n        createActions,\n    });\n    return state;\n\n    function createActions(state) {\n        return {\n            load: mutex(load),\n            join,\n            activate,\n            reactivate,\n            upgrade,\n        };\n\n        async function load() {\n            try {\n                const packages = await loadPackages();\n                state.packages = packages;\n            } catch (error) {\n                // TODO: Retry?\n                console.error(`Error loading packages`, error);\n            }\n        }\n\n        async function loadPackages() {\n            const packs = await availablePackages();\n            const result = packs.map(pack => ({\n                code: pack.code,\n                currency: `$`,\n                current: pack.current,\n                previous: pack.previous,\n                default: pack.default,\n\n                description: {\n                    main: pack.description,\n                    sub: pack.sub,\n                },\n            }));\n            return result;\n        }\n    }\n\n    function upgrade({ package: pkg }) {\n        return purchaseUpgrade({\n            package: pkg,\n            userId: state.root.user.user.sub,\n        });\n    }\n\n    function join({ email, password, tracking, package: pkg }) {\n        // TODO:Captcha\n        return purchase({\n            email,\n            password,\n            tracking,\n            package: pkg,\n            reactivation: false,\n        });\n    }\n\n    function activate({ tracking, package: pkg }) {\n        // TODO:Captcha\n        return purchase({\n            tracking,\n            package: pkg,\n            reactivation: false,\n        });\n    }\n\n    function reactivate({ email, password, tracking, package: pkg }) {\n        // TODO:Captcha\n        return purchase({\n            email,\n            password,\n            tracking,\n            package: pkg,\n            reactivation: true,\n        });\n    }\n\n    async function purchase({ email, password, tracking, package: pkg, reactivation }) {\n        // Get the biller enum name\n        const billerEnum = billerName(state.biller);\n\n        const interactionId = root.interaction.start();\n        let result;\n        try {\n            result = await makePayment({\n                email,\n                password,\n                tracking,\n                reactivation,\n                package: pkg,\n                biller: billerEnum,\n            });\n\n            const label = reactivation\n                ? `Reactivation of ${pkg} on ${billerEnum}`\n                : `Purchase of ${pkg} on ${billerEnum}`;\n        } finally {\n            root.interaction.end(interactionId);\n        }\n\n        if (result) {\n            // This will allow an autologin to happen later\n            if (result.token) {\n                root.user.joinToken = result.token;\n            }\n            processPurchaseAction(result);\n        }\n    }\n\n    async function purchaseUpgrade({ package: pkg, userId }) {\n        const billerEnum = billerName(state.biller);\n        const interactionId = root.interaction.start();\n        let result;\n        try {\n            state.error = undefined;\n            result = await payUpgrade({\n                userId,\n                biller: billerEnum,\n                package: pkg,\n            });\n        } catch (error) {\n            console.error(`An error occurred while a user tried to upgrade`, error);\n            state.error = {\n                type: `generic`,\n                message: `An error occurred while trying to upgrade. Please contact support`,\n            };\n        } finally {\n            root.interaction.end(interactionId);\n        }\n\n        if (result) {\n            state.root.user.forceRefresh = true;\n            processPurchaseAction(result);\n        }\n    }\n\n    async function processPurchaseAction(action) {\n        switch (action.type) {\n            case `REDIRECT`:\n                // TODO: Do this through navigate service?\n                window.location.assign(action.uri);\n                break;\n            case `CONFIRM`:\n                // TODO: We need a confirmation dialog\n                throw new Error(`not implemented`);\n                break;\n            case `COMPLETE`:\n                // TODO: We need a message dialog\n                console.warn(`TODO - Add message dialog to indicate payment complete`);\n                break;\n            default:\n                console.error(`An unknown result type \"${action.type}\" was received.`);\n                break;\n        }\n    }\n\n    async function makePayment({ email, password, tracking, package: pkg, biller, reactivation }) {\n        try {\n            state.error = undefined;\n            return await pay({\n                email,\n                biller,\n                password,\n                tracking,\n                reactivation,\n                package: pkg,\n            });\n        } catch (error) {\n            // TODO: Figure out why this isn't coming back correctly\n            if (error.message.match(/match the pattern/)) {\n                error.code = `auth/invalid-password`;\n            }\n            switch (error.code) {\n                case `auth/email-already-exists`:\n                    state.error = {\n                        type: `email`,\n                        message: `The email address you entered is already in use`,\n                    };\n                    break;\n                case `auth/email-inactive`:\n                    state.error = {\n                        type: `email`,\n                        message: `The email address you entered is already in use. Please login to activate your account`,\n                    };\n                    break;\n                case `auth/invalid-password`:\n                    state.error = {\n                        type: `password`,\n                        // TODO: Get the correct code back\n                        message: `The password you entered is invalid`,\n                        // message: `The password you entered is invalid. ${error.message}`\n                    };\n                    break;\n                default:\n                    console.error(`An unknown error occurred while a user tried to join`, error);\n                    state.error = {\n                        type: `generic`,\n                        message: `An error occurred while trying to join. Please contact support`,\n                    };\n                    break;\n            }\n        }\n    }\n}\n\nfunction billerName(biller) {\n    if (!biller) {\n        return undefined;\n    }\n    switch (biller) {\n        case `verotel/flex-pay`:\n            return `VEROTEL_FLEX`;\n        case `verotel/rum`:\n            return `VEROTEL_RUM`;\n        default:\n            throw new Error(`Unknown biller name \"${biller}\" received`);\n    }\n}\n","import { gql } from '@apollo/client';\nimport { getAuthenticatedClient } from './client/index.js';\nimport handleError from './handle-error.js';\n\nexport default function createPurchaseService(state) {\n    return {\n        pay,\n        upgrade,\n    };\n\n    function pay(...args) {\n        return handleError(() => doPay(...args));\n    }\n\n    function upgrade(...args) {\n        return handleError(() => doUpgrade(...args));\n    }\n\n    async function doPay({ email, password, tracking, package: pkg, biller, reactivation }) {\n        // Note: We use authed client for things like re-activation\n        const client = await getAuthenticatedClient(state);\n        const result = await client.mutate({\n            mutation: gql`\n                mutation Pay($input: PayInput!) {\n                    purchase {\n                        pay(input: $input) {\n                            result {\n                                type\n                                uri\n                                token\n                                message\n                                options\n                            }\n                        }\n                    }\n                }\n            `,\n            variables: {\n                input: {\n                    email,\n                    password,\n                    tracking,\n                    package: pkg,\n                    biller,\n                    reactivation,\n                },\n            },\n        });\n        return result.data.purchase.pay.result;\n    }\n\n    async function doUpgrade({ biller, userId, package: pkg }) {\n        const client = await getAuthenticatedClient(state);\n        const result = await client.mutate({\n            mutation: gql`\n                mutation Upgrade($input: UpgradeInput!) {\n                    purchase {\n                        upgrade(input: $input) {\n                            result {\n                                type\n                                uri\n                                token\n                                message\n                                options\n                            }\n                        }\n                    }\n                }\n            `,\n            variables: {\n                input: {\n                    userId,\n                    biller,\n                    package: pkg,\n                },\n            },\n        });\n        return result.data.purchase.upgrade.result;\n    }\n}\n","import { gql } from '@apollo/client';\nimport { getClient } from './client/index.js';\nimport handleError from './handle-error.js';\n\nexport default function createSearchService(state) {\n    return {\n        search,\n    };\n\n    function search(query) {\n        return handleError(() => doSearch(query));\n    }\n\n    async function doSearch(query) {\n        const client = await getClient(state);\n        const result = await client.query({\n            query: gql`\n                query Search($query: String!) {\n                    search {\n                        search(input: { query: $query }) {\n                            result {\n                                type\n                                itemId\n                                name\n                                description\n                                images\n                            }\n                        }\n                    }\n                }\n            `,\n            variables: { query },\n        });\n        return result.data.search.search.result;\n    }\n}\n","import createState from './state.js';\nimport createAssetService from '../argonath/asset.js';\nimport createSearchService from '../argonath/search.js';\n\nconst DEBOUNCE = 600;\n\nexport default function createSearchState({ root }) {\n    const { serve } = createAssetService(root);\n    const { search: searchService } = createSearchService(root);\n    let debouncedSearch;\n    return createState({\n        root,\n        values: {\n            query: ``,\n            searching: false,\n            searchShown: false,\n        },\n        derived: {\n            results: {\n                from: [`query`],\n                combine: search,\n            },\n        },\n    });\n\n    async function search(state) {\n        if (!state.query) {\n            return undefined;\n        }\n\n        const results = await debSearch(state);\n        const result = await Promise.all(\n            results.map(async result => ({\n                ...result,\n                images: await Promise.all(result.images.map(serveImage)),\n            }))\n        );\n        return result;\n    }\n\n    async function serveImage(path) {\n        const info = await serve(path);\n        return info && info.serve && info.serve.uri;\n    }\n\n    function debSearch(state) {\n        if (!debouncedSearch) {\n            debouncedSearch = debounce(() => execSearch(state), DEBOUNCE);\n        }\n        return debouncedSearch();\n    }\n\n    async function execSearch(state) {\n        try {\n            state.searching = true;\n            return await searchService(state.query);\n        } finally {\n            state.searching = false;\n        }\n    }\n\n    function debounce(handler, wait) {\n        let timeout;\n        return function exec() {\n            if (timeout) {\n                clearTimeout(timeout);\n            }\n            return new Promise(function promiseHandler(resolve, reject) {\n                timeout = setTimeout(async () => {\n                    try {\n                        const result = await handler();\n                        resolve(result);\n                    } catch (error) {\n                        reject(error);\n                    }\n                }, wait);\n            });\n        };\n    }\n}\n","import assert from 'assert';\nimport createPageState from './page/index.js';\nimport createBillerState from './biller.js';\nimport createDimensionState from './dimension.js';\nimport createInteractionState from './interaction.js';\nimport createSearchState from './search.js';\nimport createState from './state.js';\n\nexport default function createAppState({\n    $site,\n    $catchPhrase,\n    $topic,\n\n    key,\n    user,\n    page,\n    email,\n    dimension,\n    interstitial,\n}) {\n    assert($site, `site MUST be supplied`);\n    assert($catchPhrase, `catchPhrase MUST be supplied`);\n    assert($topic, `topic MUST be supplied`);\n    assert(email, `email MUST be supplied`);\n    assert(email.$contact, `email.contact MUST be supplied`);\n    assert(email.$support, `email.support MUST be supplied`);\n\n    const root = createState({\n        values: {\n            $site,\n            $topic,\n            $catchPhrase,\n        },\n    });\n\n    root.email = createState({\n        values: {\n            $support: email.$support,\n            $contact: email.$contact,\n        },\n    });\n\n    root.interaction = createInteractionState({\n        root,\n    });\n\n    root.biller = createBillerState({\n        root,\n    });\n\n    root.dimension = createDimensionState({\n        root,\n        values: dimension,\n    });\n\n    root.page = createPageState({\n        root,\n        values: page,\n    });\n\n    root.key = createState({\n        root,\n        values: key,\n    });\n\n    root.search = createSearchState({ root });\n\n    Object.freeze(root);\n    return root;\n}\n","import createState from './state.js';\n\nexport default function createDimensionState({ root, values: { width, height } }) {\n    const state = createState({\n        root,\n        values: {\n            width,\n            height,\n        },\n        derived: {\n            dimensions: {\n                from: [`width`, `height`],\n            },\n        },\n    });\n    return state;\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport merge from 'lodash.merge';\nimport throttle from 'lodash.throttle';\nimport App from './container/app.jsx';\nimport reportWebVitals from './reportWebVitals';\nimport createAppState from './service/state/app.js';\n\nconst VERSION_ROUTE = /^v\\d+_\\d+_\\d+.*$/;\nconst RESIZE_THROTTLE = 300;\nconst DYNAMIC = [`/welcome`];\n\n// const tokens = {\n//     refreshToken: getData(PERSISTED_REFRESH_TOKEN_NAME),\n//     idToken: getData(PERSISTED_ID_TOKEN_NAME),\n// };\n\n// const mobileRedirectLink = process.env.MOBILE_REDIRECT_LINK;\n\n// if (mobileRedirectLink && isMobile(navigator.userAgent)) {\n//     const urlParams = new URLSearchParams(window.location.search);\n//     const redirectParam = urlParams.get(`redirect`);\n//     const fromAffiliate = !!urlParams.get(`reseller_id`);\n//     const redirectCookie = readCookie(`redirect`);\n\n//     if (redirectParam === `false` || fromAffiliate) {\n//         createCookie(`redirect`, `false`, 999);\n//     }\n\n//     if (\n//         !tokens.idToken &&\n//         redirectCookie !== `false` &&\n//         redirectParam !== `false` &&\n//         !fromAffiliate\n//     ) {\n//         window.location.replace(mobileRedirectLink);\n//     }\n// }\n\n// function createCookie(name, value, days) {\n//     if (days) {\n//         const date = new Date();\n//         date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n//         document.cookie = `${name}=${value}; expires=${date.toGMTString()}`;\n//     } else {\n//         document.cookie = `${name}=${value}`;\n//     }\n// }\n\n// function readCookie(name) {\n//     const cookie = document.cookie.split(`;`).find(c => c.trimLeft().startsWith(`${name}=`));\n\n//     if (cookie) {\n//         return cookie.replace(`${name}=`, ``).trim();\n//     }\n// }\n\n// function isMobile(agent) {\n//     return (\n//         typeof agent === `string` &&\n//         [/Android/i, /webOS/i, /iPhone/i, /iPod/i, /BlackBerry/i, /Windows Phone/i].some(check =>\n//             check.test(agent)\n//         )\n//     );\n// }\n\nconst state = createAppState({\n    key: {\n        // Note: We purposefully leave the captcha\n        //  keys out here so they won't be available\n        //  in dev (where they should not be needed)\n        api: process.env.API_URL,\n        argonath: process.env.ARGONATH_API_KEY,\n        rollbar: process.env.ROLLBAR,\n    },\n    email: {\n        $support: process.env.SUPPORT_EMAIL,\n        $contact: process.env.CONTACT_EMAIL,\n    },\n    $site: process.env.SITE,\n    $catchPhrase: process.env.CATCH_PHRASE,\n    $topic: process.env.TOPIC,\n\n    dimension: {\n        width: window.innerWidth,\n        height: window.innerHeight,\n    },\n\n    interstitial: {\n        interstitial: process.env.INTERSTITIAL,\n    },\n\n    ...merge(window.__INITIAL__DATA__, {}),\n});\n\n// We do this so when a member returns they don't get the server side rendered version\nconst shouldHydrate =\n    window.__INITIAL__DATA__ && DYNAMIC.includes(window.location.pathname) === false;\n\nperformRender();\nsetImmediate(postInit);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n\nfunction subscribe() {\n    window.addEventListener(`popstate`, event => {\n        const { state: page } = event;\n        if (page) {\n            state.page.navigate(page);\n        } else {\n            // The initial page has a value of null which we need to handle\n            const relative = [\n                window.location.pathname,\n                window.location.search,\n                window.location.hash,\n            ].join(``);\n            state.page.navigate(relative);\n        }\n    });\n\n    window.addEventListener(\n        `resize`,\n        throttle(() => {\n            const { innerWidth: width, innerHeight: height } = window;\n            state.dimension.width = width;\n            state.dimension.height = height;\n        }, RESIZE_THROTTLE)\n    );\n\n    // Note: It is important we only do this when everything is ready since\n    //  subscribe will trigger immediately\n    state.page.title$.subscribe({\n        next: current => {\n            document.title = current;\n        },\n    });\n\n    state.page.path$.subscribe({\n        next: current => {\n            if (current && window.history.state !== state.page.path) {\n                let pagePath = state.page.path;\n\n                // TODO: Don't think this is available on older browsers\n                const [, firstPart] = window.location.pathname.split(`/`);\n                if (VERSION_ROUTE.test(firstPart)) {\n                    pagePath = `/${firstPart}${pagePath}`;\n                }\n\n                if (pagePath === `/password-reset` && window.location.search.startsWith(`?code=`)) {\n                    const urlParams = new URLSearchParams(window.location.search);\n                    const code = urlParams.get(`code`);\n                    window.history.pushState(\n                        pagePath,\n                        state.page.title,\n                        `${pagePath}?code=${code}`\n                    );\n                } else {\n                    window.history.pushState(pagePath, state.page.title, pagePath);\n                }\n                // TODO: Not on hash change\n                window.scrollTo(0, 0);\n            }\n        },\n    });\n}\n\nfunction performRender() {\n    if (shouldHydrate) {\n        ReactDOM.hydrate(\n            <React.StrictMode>\n                <App state={state} error={window.__ERROR__} />\n            </React.StrictMode>,\n            document.getElementById(`root`)\n        );\n    } else {\n        ReactDOM.render(\n            <React.StrictMode>\n                <App state={state} error={window.__ERROR__} />\n            </React.StrictMode>,\n            document.getElementById(`root`)\n        );\n    }\n}\n\nfunction postInit() {\n    // Kick off the packages load\n    state.biller.load();\n\n    if (!shouldHydrate) {\n        // TODO: hashbang\n        state.page.navigate(`${window.location.pathname}${window.location.search}`);\n    }\n\n    state.dimension.width = window.innerWidth;\n    state.dimension.height = window.innerHeight;\n\n    subscribe();\n}\n"],"sourceRoot":""}