{"version":3,"file":"main.9cdd8ab0.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/queryString.ts","webpack://@finviz/website/./js/app/shared/cookie.ts","webpack://@finviz/website/./js/app/shared/sentry/constants.ts","webpack://@finviz/website/./js/app/shared/sentry/init.ts","webpack://@finviz/website/./js/app/shared/utils.ts","webpack://@finviz/website/./js/main/components/delayed.tsx","webpack://@finviz/website/./js/main/components/error-view.tsx","webpack://@finviz/website/./js/main/components/loading.tsx","webpack://@finviz/website/./js/main/components/notification/hooks.ts","webpack://@finviz/website/./js/main/components/notification/notification-wrapper.tsx","webpack://@finviz/website/./js/main/components/notification/with-notification-context.tsx","webpack://@finviz/website/./js/main/components/notification/notification.tsx","webpack://@finviz/website/./js/main/constants.ts","webpack://@finviz/website/./js/main/context.ts","webpack://@finviz/website/./js/main/hooks/useCachedLoaderData.tsx","webpack://@finviz/website/./js/main/hooks/useVisualViewport.ts","webpack://@finviz/website/./js/main/modules/portfolio/index.ts","webpack://@finviz/website/./js/main/modules/quote/index.tsx","webpack://@finviz/website/./js/main/index.tsx","webpack://@finviz/website/./js/main/modules/quote/types.ts","webpack://@finviz/website/./js/main/modules/quote/utils.ts","webpack://@finviz/website/./js/main/services/routing.ts","webpack://@finviz/website/./js/main/types.ts","webpack://@finviz/website/./js/main/util-routing.tsx","webpack://@finviz/website/./js/main/util.tsx","webpack://@finviz/website/../node_modules/@ariakit/react-core/esm/__chunks/5KB2YIDT.js","webpack://@finviz/website/../node_modules/@ariakit/react-core/esm/__chunks/JJ3MV4KB.js"],"sourcesContent":["export type ObjectHash = Record\r\n\r\nexport const decodeQueryString = function = ObjectHash>(\r\n search = window.location.search\r\n): T {\r\n const vars = search.substring(1).split('&')\r\n const obj: ObjectHash = {}\r\n vars.forEach((pair) => {\r\n const delimiterPos = pair.indexOf('='),\r\n key = decodeURIComponent(pair.substring(0, delimiterPos)),\r\n value = decodeURIComponent(pair.substring(delimiterPos + 1))\r\n obj[key] = value\r\n })\r\n return obj as T\r\n}\r\n\r\nexport const encodeQueryString = function (values: ObjectHash, whitelistedValues: string[] = []) {\r\n return Object.keys(values).reduce((prev, key) => {\r\n const value = values[key]\r\n if (!['', null, undefined].includes(value) || whitelistedValues.includes(value)) {\r\n return prev + (prev.length > 0 ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value)\r\n }\r\n return prev\r\n }, '')\r\n}\r\n","export function getParsedCookies(cookieName: string) {\r\n const parseCookies = document.cookie\r\n .split(';')\r\n .map((cookieString) => cookieString.split('='))\r\n .reduce(\r\n (acc, v) => {\r\n acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim())\r\n return acc\r\n },\r\n {} as Record\r\n )\r\n\r\n return cookieName ? parseCookies[cookieName] : parseCookies\r\n}\r\n\r\nexport function getCookie(name: string) {\r\n var re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n}\r\n\r\nexport function setCookie(name: string, value: string, expires: Date) {\r\n var cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (/\\bfinviz\\b/.test(document.location.hostname)) {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n}\r\n","import {\r\n dedupeIntegration,\r\n extraErrorDataIntegration,\r\n httpClientIntegration,\r\n thirdPartyErrorFilterIntegration,\r\n} from '@sentry/browser'\r\n\r\nexport const sentryOptions = {\r\n dsn: 'https://11de51e753454212a2845e5899a38cae@sentry.io/33153',\r\n allowUrls: [/finviz\\.com/, /www\\.finviz\\.com/, /elite\\.finviz\\.com/],\r\n release: typeof window !== 'undefined' && 'FinvizSentrySettings' in window ? FinvizSentrySettings.release : undefined,\r\n environment:\r\n typeof window !== 'undefined' && 'FinvizSentrySettings' in window ? FinvizSentrySettings.environment : undefined,\r\n sendDefaultPii: true,\r\n integrations: [\r\n dedupeIntegration(),\r\n extraErrorDataIntegration(),\r\n httpClientIntegration({ failedRequestTargets: [/finviz\\.com/] }),\r\n thirdPartyErrorFilterIntegration({\r\n filterKeys: ['finviz'], //NOTE: same application keys as specified in Sentry bundle plugin `webpack.config.js` -> `sentryWebpackPlugin`\r\n behaviour: 'apply-tag-if-exclusively-contains-third-party-frames',\r\n }),\r\n ],\r\n /**\r\n * Ignore if error message matches\r\n * For ignoring specific files, or errors in specific files use `ignoreStack` below\r\n */\r\n ignoreErrors: [\r\n 'TypeError: Failed to fetch',\r\n 'TypeError: NetworkError when attempting to fetch resource.',\r\n 'ChunkLoadError: Loading chunk',\r\n 'Error: Loading CSS chunk',\r\n /^TypeError: Load failed$/,\r\n ],\r\n /**\r\n * Ignore error if a script name in the stack matches any of these\r\n * For global ignore pattenrs use `ignoreErrors` above\r\n */\r\n ignoreStack: [\r\n // Ignore all quantserve scripts\r\n 'quantcount.com',\r\n 'quantserve.com',\r\n // Ignore network errors from cmp script\r\n 'investingchannel.com',\r\n ['cmp2.js', /(AbortError|NetworkError|aborted|network)/i],\r\n ] satisfies Array,\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\n\r\nimport { ThrowableError } from '../../../main/services/api'\r\nimport { sentryOptions } from './constants'\r\n\r\nif ('FinvizSentrySettings' in window && !('sentryDisabled' in window)) {\r\n Sentry.init({\r\n ...sentryOptions,\r\n beforeSend(event: Sentry.ErrorEvent, hint: Sentry.EventHint) {\r\n const error = hint.originalException as Error | null\r\n const errorFrames = event.exception?.values?.[0]?.stacktrace?.frames ?? []\r\n\r\n const isIgnoredError = sentryOptions.ignoreStack.some((ignorePattern) => {\r\n const [ignoreSource, ignoreMessage] = Array.isArray(ignorePattern) ? ignorePattern : [ignorePattern]\r\n const isIgnoredScript = errorFrames.some((frame) => frame?.filename?.includes(ignoreSource))\r\n const isIgnoredMessage =\r\n ignoreMessage && typeof error?.message === 'string' ? error.message.match(ignoreMessage) : false\r\n\r\n return ignoreMessage ? isIgnoredScript && isIgnoredMessage : isIgnoredScript\r\n })\r\n\r\n if (isIgnoredError) return null\r\n\r\n // Completely ignore 524 errors, track other network errors as `info` if the status is 520+\r\n const statusCode = error instanceof ThrowableError ? error.status : (event.contexts?.response?.status_code ?? -1)\r\n if (statusCode === 500) {\r\n return { ...event, level: 'error', fingerprint: ['500'] }\r\n } else if (statusCode > 500 && statusCode < 520) {\r\n return { ...event, level: 'info', fingerprint: ['500+'] }\r\n } else if (statusCode > 520) {\r\n // Completely ignore 524 errors\r\n if (statusCode === 524) return null\r\n return { ...event, level: 'info', fingerprint: ['520+'] }\r\n }\r\n\r\n return event\r\n },\r\n })\r\n\r\n if (FinvizSentrySettings.id > 0) {\r\n Sentry.setUser({ id: String(FinvizSentrySettings.id) })\r\n }\r\n\r\n try {\r\n Sentry.setTags({\r\n dpr: window.devicePixelRatio,\r\n redesign: window.FinvizSettings?.hasRedesignEnabled,\r\n dark: window.FinvizSettings?.hasDarkTheme,\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n } catch {}\r\n}\r\n\r\nwindow['Sentry'] = {\r\n captureException: Sentry.captureException,\r\n captureMessage: Sentry.captureMessage,\r\n withScope: Sentry.withScope,\r\n}\r\n","import { setCookieRequest } from '../../main/services/api'\r\nimport { decodeQueryString, encodeQueryString } from '../queryString'\r\nimport { getCookie, setCookie } from './cookie'\r\n\r\nexport const formatDateToStringUS = (date: Date) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n })\r\n\r\nconst DRAWING_QUOTE_PAGE_COOKIE_NAME = 'charts-draw'\r\nexport function getIsDrawingEnabledOnQuotePage() {\r\n return getCookie(DRAWING_QUOTE_PAGE_COOKIE_NAME) === 'on'\r\n}\r\n\r\nexport async function setIsDrawingEnabledOnQuotePage(isEnabled: boolean) {\r\n return setCookieRequest(DRAWING_QUOTE_PAGE_COOKIE_NAME, isEnabled ? 'on' : 'off')\r\n .catch(() => {\r\n // fallback to JS otherwise draw toggle won't work if API doesn't work\r\n setIsDrawingEnabledOnQuotePageCookieViaJS(isEnabled)\r\n })\r\n .finally(() => {\r\n const { i: idea, ...rest } = decodeQueryString()\r\n if (idea) {\r\n document.location = `quote.ashx?${encodeQueryString(rest)}`\r\n } else {\r\n document.location.reload()\r\n }\r\n })\r\n}\r\n\r\nfunction setIsDrawingEnabledOnQuotePageCookieViaJS(isEnabled: boolean) {\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n setCookie(DRAWING_QUOTE_PAGE_COOKIE_NAME, isEnabled ? 'on' : 'off', expires)\r\n}\r\n\r\nexport function parseInitData(elementId: string): T | undefined {\r\n try {\r\n const initDataElement = document.getElementById(elementId)!\r\n return JSON.parse(initDataElement.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return\r\n }\r\n}\r\n\r\nexport function getSidebarFromCookie() {\r\n const chartsUrl = getCookie('chartsUrl')\r\n const decodedCookie = chartsUrl ? decodeQueryString<{ sidebar?: string }>(chartsUrl) : null\r\n return decodedCookie?.sidebar || undefined\r\n}\r\n","import * as React from 'react'\r\n\r\nexport interface DelayedProps {\r\n /**\r\n * The delay in milliseconds before the component is rendered.\r\n *\r\n * @default 300\r\n */\r\n delay?: number\r\n\r\n /**\r\n * Delay in milliseconds before rendering timeout state.\r\n */\r\n timeout?: number\r\n\r\n /**\r\n * Throw on timeout (suspense)\r\n */\r\n throwOnTimeout?: boolean\r\n\r\n /**\r\n * Component visible during the delay.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n delayComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when timeout is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n timeoutComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when delay is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function Delayed({\r\n delay = 300,\r\n timeout = 0,\r\n throwOnTimeout = false,\r\n delayComponent,\r\n timeoutComponent,\r\n children,\r\n}: DelayedProps) {\r\n const [visible, setVisible] = React.useState(false)\r\n const [hasTimedOut, setHasTimedOut] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const visibilityTimeout = window.setTimeout(() => setVisible(true), delay)\r\n\r\n let failedTimeout: number\r\n if (timeout > 0) {\r\n failedTimeout = window.setTimeout(() => {\r\n setHasTimedOut(true)\r\n if (throwOnTimeout) throw new Error()\r\n }, timeout)\r\n }\r\n\r\n return () => {\r\n clearTimeout(visibilityTimeout)\r\n clearTimeout(failedTimeout)\r\n }\r\n }, [delay, timeout, throwOnTimeout])\r\n\r\n if (!visible) return <>{delayComponent}\r\n\r\n if (hasTimedOut) {\r\n return <>{timeoutComponent}\r\n }\r\n\r\n return <>{children}\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\nimport { ReactNode, useEffect } from 'react'\r\nimport { FallbackProps } from 'react-error-boundary'\r\nimport { useRouteError } from 'react-router-dom'\r\n\r\nimport { link } from '../services/routing'\r\nimport { Button } from './button'\r\nimport { Heading, Paragraph } from './typography'\r\n\r\ninterface ErrorViewProps {\r\n /**\r\n * Title of the message\r\n */\r\n title?: ReactNode\r\n\r\n /**\r\n * Body text\r\n */\r\n message?: ReactNode\r\n\r\n /**\r\n * Show contact support text under the message\r\n *\r\n * @default true\r\n */\r\n showContact?: boolean\r\n\r\n /**\r\n * Show refresh page button under the text\r\n *\r\n * @default true\r\n */\r\n showRefresh?: boolean\r\n}\r\n\r\nexport function ErrorView({ title, message, showContact = true, showRefresh = true }: ErrorViewProps) {\r\n return (\r\n
\r\n {title}\r\n {message}\r\n\r\n {showContact && (\r\n \r\n Our development team has been notified of this. If the error persists, please{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n )}\r\n\r\n {showRefresh && (\r\n \r\n Refresh page\r\n \r\n )}\r\n
\r\n )\r\n}\r\n\r\nexport function DefaultErrorBoundary({\r\n error,\r\n title = 'Application error',\r\n message = 'We’re sorry but an unknown error occured.',\r\n ...props\r\n}: Partial) {\r\n useEffect(() => {\r\n // Ignore webpack chunk loading errors\r\n if (error?.name === 'ChunkLoadError') return\r\n // Otherwise log to Sentry\r\n Sentry.captureException(error, { level: 'fatal' })\r\n // so we can see error in logs\r\n console.error('ErrorBoundary:', JSON.stringify(error))\r\n }, [error])\r\n\r\n return \r\n}\r\n\r\nexport function RouterErrorElement() {\r\n const error = useRouteError() as Error\r\n return \r\n}\r\n","import { link } from '../services/routing'\r\nimport { Delayed, DelayedProps } from './delayed'\r\nimport { ErrorView } from './error-view'\r\nimport { Spinner } from './spinner'\r\n\r\ntype LoadingProps = Pick\r\n\r\nexport function Loading({ delay, timeout, throwOnTimeout }: LoadingProps) {\r\n return (\r\n \r\n There’s been an error loading the application.\r\n
\r\n Please make sure your internet connection is stable and refresh the page. If the error persists, please{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n }\r\n />\r\n }\r\n >\r\n \r\n \r\n )\r\n}\r\n\r\nexport function LoadingScreen(props: LoadingProps) {\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nexport type NotificationContextType = ReturnType\r\n\r\nexport enum NotificationPosition {\r\n TopLeft,\r\n TopRight,\r\n BottomLeft,\r\n BottomRight,\r\n}\r\n\r\nexport interface NotificationOptions {\r\n position?: NotificationPosition\r\n inline?: boolean\r\n}\r\n\r\nexport const NotificationContext = React.createContext<{\r\n show: (element: JSX.Element, options?: NotificationOptions) => void\r\n hide: () => void\r\n}>({\r\n show: () => {},\r\n hide: () => {},\r\n})\r\n\r\nexport function useNotification() {\r\n return React.useContext(NotificationContext)\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { getVisualViewport, useVisualViewport } from '../../hooks/useVisualViewport'\r\nimport { NotificationContext, NotificationOptions, NotificationPosition } from './hooks'\r\n\r\ninterface NotificationState {\r\n element: JSX.Element\r\n options: Partial\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren) {\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n const [notification, setNotification] = React.useState(null)\r\n const { viewport, setViewport } = useVisualViewport({ enabled: !!notification })\r\n\r\n const context = React.useRef({\r\n show: (element: JSX.Element, options: Partial = {}) => {\r\n setViewport(() => getVisualViewport(window.visualViewport))\r\n setNotification({ element, options })\r\n setIsOpen(true)\r\n },\r\n hide: () => setIsOpen(false),\r\n })\r\n\r\n const positionClass = React.useMemo(() => {\r\n const { position = NotificationPosition.BottomLeft } = notification?.options ?? {}\r\n return {\r\n '[--inset-t:1rem] items-start pt-inset-top': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.TopRight,\r\n ].includes(position),\r\n '[--inset-r:1rem] justify-end landscape-secondary:pr-inset-right': [\r\n NotificationPosition.TopRight,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-b:1rem] items-end pb-inset-bottom': [\r\n NotificationPosition.BottomLeft,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-l:1rem] justify-start landscape-primary:pl-inset-left': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.BottomLeft,\r\n ].includes(position),\r\n }\r\n }, [notification?.options])\r\n\r\n const WrapperComponent = React.useMemo(\r\n () => (notification?.options.inline ? React.Fragment : Ariakit.Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {isOpen && (\r\n \r\n \r\n {notification?.element}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { NotificationContextType, useNotification } from './hooks'\r\n\r\nexport function withNotificationContext(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n const WithNotificationContext = (props: Omit) => {\r\n const notification = useNotification()\r\n return \r\n }\r\n\r\n WithNotificationContext.displayName = `withNotificationContext(${displayName})`\r\n\r\n return WithNotificationContext\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { useNotification } from './hooks'\r\n\r\ninterface NotificationProps {\r\n className?: string\r\n /**\r\n * Default button text\r\n * @default Close\r\n */\r\n closeText?: string\r\n\r\n /**\r\n * Custom buttons. Overrides `closeText`\r\n */\r\n actions?: JSX.Element\r\n\r\n /**\r\n * When set, the notification will automatically close\r\n */\r\n timeoutInMs?: number\r\n}\r\n\r\nexport function Notification({\r\n className,\r\n closeText = 'Close',\r\n actions,\r\n timeoutInMs,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const notification = useNotification()\r\n\r\n React.useEffect(() => {\r\n let timeoutId: number\r\n if (timeoutInMs) {\r\n timeoutId = window.setTimeout(() => {\r\n notification.hide()\r\n }, timeoutInMs)\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n }, [notification, timeoutInMs])\r\n\r\n return (\r\n \r\n
{children}
\r\n
\r\n {actions ?? (\r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","export const CRYPTO_TICKERS = [\r\n 'BTCUSD',\r\n 'LTCUSD',\r\n 'ETHUSD',\r\n 'XRPUSD',\r\n 'BCHUSD',\r\n 'BTCEUR',\r\n 'LTCEUR',\r\n 'ETHEUR',\r\n 'XRPEUR',\r\n 'BCHEUR',\r\n 'LTCBTC',\r\n 'ETHBTC',\r\n 'XRPBTC',\r\n 'BCHBTC',\r\n]\r\n\r\n// Keep in sync with the copy in Charts repo - app/constants/common.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n quoteFinancials = 'quoteFinancials',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\nexport enum QuoteRoutes {\r\n OptionsChain = 'oc',\r\n OptionsVolatility = 'ocv',\r\n Revenue = 'rv',\r\n Dividends = 'dv',\r\n Earnings = 'ea',\r\n Forecast = 'fc',\r\n Performance = 'p',\r\n ShortInterest = 'si',\r\n Traffic = 'tr',\r\n LatestFilings = 'lf',\r\n}\r\n\r\nexport const FINANCIALS_SECTION_LABELS = {\r\n [QuoteRoutes.Revenue]: 'Revenue',\r\n [QuoteRoutes.Dividends]: 'Dividends',\r\n [QuoteRoutes.Earnings]: 'Earnings',\r\n [QuoteRoutes.Forecast]: 'Forecast',\r\n}\r\n\r\nexport const OPTIONS_SECTION_LABELS = {\r\n [QuoteRoutes.OptionsChain]: 'Prices',\r\n [QuoteRoutes.OptionsVolatility]: 'Volatility & Greeks',\r\n}\r\n\r\n// @TODO: Reuse across the app (website & charts)\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n","import { createContext, useContext } from 'react'\r\n\r\nexport const SETTINGS_CONTEXT_DEFAULT = {\r\n versionImages: 0,\r\n nodeChartsDomain: '',\r\n hasUserPremium: false,\r\n name: '',\r\n email: '',\r\n hasDarkTheme: false,\r\n}\r\n\r\nexport const SettingsContext = createContext(SETTINGS_CONTEXT_DEFAULT)\r\n\r\nexport function useSettings() {\r\n return useContext(SettingsContext)\r\n}\r\n","import * as React from 'react'\r\nimport { ReactNode } from 'react'\r\nimport { useLoaderData } from 'react-router-dom'\r\n\r\nexport type CachedLoaderDataContextType = ReturnType\r\n\r\nexport const CachedLoaderDataContext = React.createContext<{\r\n data: any\r\n isCached: boolean\r\n} | null>(null)\r\n\r\nexport function useCachedLoaderData() {\r\n const context = React.useContext<{ data: DataType; isCached: boolean } | null>(CachedLoaderDataContext)\r\n\r\n if (context === null) {\r\n throw new Error(\r\n 'Error! Extracting context without wrapping your component with the CachedLoaderDataContextProvider'\r\n )\r\n }\r\n\r\n return context\r\n}\r\n\r\ninterface CachedLoaderDataContextProviderProps {\r\n children: ReactNode\r\n isNullValidData?: boolean\r\n}\r\nexport function CachedLoaderDataContextProvider({\r\n children,\r\n isNullValidData = false,\r\n}: CachedLoaderDataContextProviderProps) {\r\n const loaderData = useLoaderData() as DataType\r\n const dataCacheRef = React.useRef(loaderData)\r\n\r\n const value = React.useMemo(() => {\r\n if (loaderData !== undefined && (loaderData !== null || isNullValidData)) {\r\n dataCacheRef.current = loaderData\r\n }\r\n return { data: dataCacheRef.current, isCached: !loaderData }\r\n }, [loaderData, isNullValidData])\r\n\r\n return {children}\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nexport function getVisualViewport(visualViewport: VisualViewport | null) {\r\n const width = visualViewport?.width ?? window.innerWidth\r\n const height = visualViewport?.height ?? window.innerHeight\r\n const scale = visualViewport?.scale ?? 1\r\n\r\n return {\r\n top: visualViewport?.offsetTop ?? 0,\r\n left: visualViewport?.offsetLeft ?? 0,\r\n scale: Math.round((1 / scale) * 100) / 100,\r\n width: Math.round(width * scale),\r\n height: Math.round(height * scale),\r\n unscaledWidth: width,\r\n unscaledHeight: height,\r\n }\r\n}\r\n\r\nexport function useVisualViewport({ enabled = true, onScroll = true }: { enabled?: boolean; onScroll?: boolean } = {}) {\r\n const [viewport, setViewport] = React.useState(getVisualViewport(window.visualViewport))\r\n\r\n React.useEffect(() => {\r\n if (!enabled) return\r\n\r\n const handleChange = throttle((ev: Event) => {\r\n const viewport = ev.currentTarget as VisualViewport\r\n if (viewport) {\r\n setViewport(() => getVisualViewport(viewport))\r\n }\r\n }, 50)\r\n\r\n window.visualViewport?.addEventListener('resize', handleChange)\r\n if (onScroll) window.visualViewport?.addEventListener('scroll', handleChange)\r\n handleChange({ currentTarget: window.visualViewport } as Event)\r\n\r\n return () => {\r\n window.visualViewport?.removeEventListener('resize', handleChange)\r\n window.visualViewport?.removeEventListener('scroll', handleChange)\r\n }\r\n }, [enabled, onScroll])\r\n\r\n return React.useMemo(() => ({ viewport, setViewport }), [viewport])\r\n}\r\n","import { revalidateOnQueryChange } from '../../util-routing'\r\nimport { lazyLoadComponent } from '../../util-routing'\r\n\r\nexport const portfolioModule = [\r\n {\r\n path: '/portfolio.ashx',\r\n shouldRevalidate: revalidateOnQueryChange(['pid']),\r\n loaderBundle: () => import(/* webpackChunkName: \"portfolio-view-loaders\" */ './routes/View/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'portfolio-view',\r\n load: () => import(/* webpackChunkName: \"portfolio-view\" */ './routes/View/Route'),\r\n }),\r\n },\r\n {\r\n path: '/create_new_portfolio.ashx',\r\n loaderBundle: () => import(/* webpackChunkName: \"portfolio-empty-loaders\" */ './routes/EmptyView/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'portfolio-empty',\r\n load: () => import(/* webpackChunkName: \"portfolio-empty\" */ './routes/EmptyView/Route'),\r\n }),\r\n },\r\n {\r\n path: '/portfolio_edit.ashx',\r\n loaderBundle: () => import(/* webpackChunkName: \"portfolio-edit-loaders\" */ './routes/BulkEdit/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'portfolio-edit',\r\n load: () => import(/* webpackChunkName: \"portfolio-edit\" */ './routes/BulkEdit/Route'),\r\n }),\r\n },\r\n]\r\n","import * as React from 'react'\r\nimport { ScrollRestoration, ShouldRevalidateFunction, useSearchParams } from 'react-router-dom'\r\n\r\nimport { shouldRevalidateOnQueryChange } from '../../util-routing'\r\nimport { LazyRouteDefinition, createRouteViewSwitch, lazyLoadComponent } from '../../util-routing'\r\nimport { QuoteQuery, QuoteSubview } from './types'\r\nimport { getQuoteSubview, getQuoteSubviewFromQuery } from './utils'\r\n\r\nconst QuoteSharedWrapper = lazyLoadComponent({\r\n chunkName: 'quote-portal-components',\r\n load: () => import(/* webpackChunkName: \"quote-portal-components\" */ './components/QuoteSharedWrapper'),\r\n})\r\n\r\nexport function getShouldRevalidateQuoteRoute(): ShouldRevalidateFunction {\r\n return (args) => {\r\n const route = getQuoteSubview(args.currentUrl.searchParams.get('ty') as QuoteSubview)\r\n\r\n switch (route) {\r\n case QuoteSubview.OptionsChain:\r\n case QuoteSubview.OptionsVolatility:\r\n return shouldRevalidateOnQueryChange(args, ['e', 's', 'ov'])\r\n\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nconst optionsBundle = {\r\n loader: () => import(/* webpackChunkName: \"options-loaders\" */ '../options/loaders'),\r\n Component: lazyLoadComponent({\r\n chunkName: 'options',\r\n load: () => import(/* webpackChunkName: \"options\" */ '../options'),\r\n }),\r\n}\r\n\r\nconst { loader, action, ViewSwitch } = createRouteViewSwitch({\r\n defaultView: '',\r\n viewParam: QuoteQuery.Type,\r\n views: {\r\n [QuoteSubview.OptionsChain]: optionsBundle,\r\n [QuoteSubview.OptionsVolatility]: optionsBundle,\r\n [QuoteSubview.Revenue]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'revenue',\r\n load: () => import(/* webpackChunkName: \"revenue\" */ '../revenue'),\r\n }),\r\n },\r\n [QuoteSubview.Dividends]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'dividends',\r\n load: () => import(/* webpackChunkName: \"dividends\" */ '../dividends'),\r\n }),\r\n },\r\n [QuoteSubview.Eearnings]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'earnings',\r\n load: () => import(/* webpackChunkName: \"earnings\" */ '../earnings'),\r\n }),\r\n },\r\n [QuoteSubview.Forecast]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'forecast',\r\n load: () => import(/* webpackChunkName: \"forecast\" */ '../forecast'),\r\n }),\r\n },\r\n [QuoteSubview.ShortInterest]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'short-interest',\r\n load: () => import(/* webpackChunkName: \"short-interest\" */ '../short-interest'),\r\n }),\r\n },\r\n [QuoteSubview.Traffic]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'traffic',\r\n load: () => import(/* webpackChunkName: \"traffic\" */ '../traffic'),\r\n }),\r\n },\r\n [QuoteSubview.LatestFilings]: {\r\n Component: lazyLoadComponent({\r\n chunkName: 'latest-filings',\r\n load: () => import(/* webpackChunkName: \"latest-filings\" */ '../latest-filings'),\r\n }),\r\n },\r\n },\r\n})\r\n\r\nexport const quoteModule: LazyRouteDefinition[] = [\r\n {\r\n path: '/quote.ashx',\r\n loader,\r\n action,\r\n shouldRevalidate: getShouldRevalidateQuoteRoute(),\r\n Component: function QuoteRoot() {\r\n const [searchParams] = useSearchParams()\r\n const subview = getQuoteSubviewFromQuery(searchParams)\r\n\r\n React.useEffect(() => {\r\n if (FinvizSettings.hasUserPremium || FinvizSettings.hasRedesignEnabled) {\r\n import(/* webpackChunkName: \"recent_quotes\" */ '../../../app/shared/recent_quotes')\r\n .then(({ RenderRecentQuotes }) => {\r\n RenderRecentQuotes()\r\n })\r\n .catch()\r\n }\r\n }, [])\r\n\r\n return (\r\n <>\r\n {/* Intentionally do not trigger upper router loading boundary, these components use portals */}\r\n \r\n \r\n \r\n\r\n \r\n\r\n {/**\r\n * We precompute the element height on the backend so that the content under\r\n * options doesn’t jump when options render, so we can put restore scroll here.\r\n */}\r\n {subview && }\r\n \r\n )\r\n },\r\n },\r\n]\r\n","import '../app/shared/sentry/init'\r\n\r\nimport { Suspense } from 'react'\r\nimport * as ReactDOM from 'react-dom/client'\r\nimport { Outlet, RouterProvider, createBrowserRouter } from 'react-router-dom'\r\n\r\nimport '../../styles/charts.css'\r\nimport '../../styles/modal.css'\r\nimport '../../styles/tailwind.css'\r\nimport '../../styles/timeframe-bar.css'\r\nimport { RouterErrorElement } from './components/error-view'\r\nimport { LoadingScreen } from './components/loading'\r\nimport { NotificationWrapper } from './components/notification'\r\nimport { SettingsContext } from './context'\r\nimport { portfolioModule } from './modules/portfolio'\r\nimport { quoteModule } from './modules/quote'\r\nimport { lazyLoadComponent } from './util-routing'\r\nimport { defineLazyRoutes } from './util-routing'\r\n\r\nconst router = createBrowserRouter([\r\n {\r\n path: '/',\r\n element: (\r\n }>\r\n \r\n \r\n \r\n \r\n \r\n \r\n ),\r\n ErrorBoundary: RouterErrorElement,\r\n children: defineLazyRoutes([\r\n ...portfolioModule,\r\n ...quoteModule,\r\n {\r\n path: '/charts',\r\n Component: lazyLoadComponent({\r\n chunkName: 'charts',\r\n load: () => import(/* webpackChunkName: \"charts\" */ './modules/charts'),\r\n }),\r\n },\r\n {\r\n path: '/save_to_portfolio.ashx',\r\n Component: lazyLoadComponent({\r\n chunkName: 'save-to-portfolio',\r\n load: () => import(/* webpackChunkName: \"save-to-portfolio\" */ './modules/save-to-portfolio/Route'),\r\n }),\r\n },\r\n {\r\n path: '/create_alert.ashx',\r\n Component: lazyLoadComponent({\r\n chunkName: 'create-alert',\r\n load: () => import(/* webpackChunkName: \"create-alert\" */ './modules/create-alert/Route'),\r\n }),\r\n },\r\n ]),\r\n },\r\n])\r\n\r\nconst rootEl = document.getElementById('root')\r\nconst root = ReactDOM.createRoot(rootEl!)\r\n\r\nroot.render()\r\n","// Do not import any file here. It might end up in the main bundle\r\n\r\nexport enum QuoteQuery {\r\n Ticker = 't',\r\n Type = 'ty',\r\n Period = 'p',\r\n DateRange = 'r',\r\n}\r\n\r\n// Keep in sync with FullViewUrlQuery.cs\r\nexport enum QuoteView {\r\n // Default subviews for views\r\n ChartDetail = 'c',\r\n Financials = 'dv',\r\n Options = 'oc',\r\n}\r\n\r\n// Keep in sync with FullViewUrlQuery.cs\r\nexport enum QuoteSubview {\r\n ComparePerf = 'p',\r\n OptionsChain = 'oc',\r\n OptionsVolatility = 'ocv',\r\n Dividends = 'dv',\r\n Eearnings = 'ea',\r\n Forecast = 'fc',\r\n Revenue = 'rv',\r\n ShortInterest = 'si',\r\n Traffic = 'tr',\r\n LatestFilings = 'lf',\r\n}\r\n","// Do not import any other file here, it might end up in the main bundle\r\nimport { QuoteQuery, QuoteSubview, QuoteView } from './types'\r\n\r\nexport function getQuoteSubviewFromQuery(query: URLSearchParams) {\r\n return getQuoteSubview(query.get(QuoteQuery.Type) as QuoteView | QuoteSubview)\r\n}\r\n\r\n// Keep in sync with FullViewUrlQuery.cs\r\nexport function getQuoteSubview(type: QuoteSubview | QuoteView) {\r\n return Object.values(QuoteSubview).find((value) => value === type) ?? null\r\n}\r\n\r\n// Keep in sync with FullViewUrlQuery.cs\r\nexport function getQuoteView(type: QuoteView | QuoteSubview) {\r\n switch (getQuoteSubview(type)) {\r\n case QuoteSubview.Dividends:\r\n case QuoteSubview.Eearnings:\r\n case QuoteSubview.Forecast:\r\n case QuoteSubview.Revenue:\r\n return QuoteView.Financials\r\n case QuoteSubview.OptionsChain:\r\n case QuoteSubview.OptionsVolatility:\r\n return QuoteView.Options\r\n case null:\r\n return QuoteView.ChartDetail // No subview is active == chart detail\r\n default:\r\n return null // Eg. Short interest doesn’t belong to any parent group\r\n }\r\n}\r\n","import * as pathToRegexp from 'path-to-regexp'\r\n\r\nimport { cleanTicker } from '../util'\r\n\r\n/**\r\n * Compile route path by applying parameters to it\r\n *\r\n * @example\r\n * // Outputs /route/1?query=foo\r\n * compilePath('/route/:id?query=:query', { id: 1, query: 'foo' })\r\n */\r\nfunction compilePath(\r\n path: string,\r\n params?: pathToRegexp.ParamData,\r\n options?: pathToRegexp.ParseOptions & pathToRegexp.CompileOptions\r\n) {\r\n return pathToRegexp.compile(path, options)(params)\r\n}\r\n\r\nexport const path = {\r\n home: '/',\r\n news: '/news.ashx',\r\n screener: '/screener.ashx',\r\n charts: '/charts',\r\n groups: '/groups.ashx',\r\n portfolio: '/portfolio.ashx',\r\n insider: '/insidertrading.ashx',\r\n elite: '/elite.ashx',\r\n search: '/search.ashx\\\\?p=:ticker',\r\n quote: '/quote.ashx\\\\?t=:ticker',\r\n contact: '/contact.ashx',\r\n\r\n alerts: '/alerts.ashx',\r\n help: '/help/screener.ashx',\r\n account: '/myaccount.ashx',\r\n login: '/login.ashx',\r\n logout: '/logout.ashx',\r\n\r\n // Maps\r\n maps: '/map.ashx',\r\n bubbles: '/bubbles.ashx',\r\n\r\n // Futures\r\n futures: '/futures.ashx',\r\n futuresPerf: '/futures_performance.ashx',\r\n futuresCharts: '/futures_charts.ashx',\r\n futuresChartDetail: '/futures_charts.ashx\\\\?t=:ticker',\r\n\r\n // Forex\r\n forex: '/forex.ashx',\r\n forexPerf: '/forex_performance.ashx',\r\n forexCharts: '/forex_charts.ashx',\r\n forexChartDetail: '/forex_charts.ashx\\\\?t=:ticker',\r\n\r\n // Crypto\r\n crypto: '/crypto.ashx',\r\n cryptoPerf: '/crypto_performance.ashx',\r\n cryptoCharts: '/crypto_charts.ashx',\r\n cryptoChartDetail: '/crypto_charts.ashx\\\\?t=:ticker',\r\n\r\n // Backtsest\r\n backtests: '/backtests.ashx',\r\n backtestCreate: '/backtest_create.ashx',\r\n backtestDetail: '/backtest_detail.ashx\\\\?id=:backtestId',\r\n backtestPresets: 'backtests.ashx\\\\?presets=1',\r\n}\r\n\r\nexport const link = {\r\n toHome: () => path.home,\r\n toNews: () => path.news,\r\n toScreener: () => path.screener,\r\n toCharts: () => path.charts,\r\n toGroups: () => path.groups,\r\n toPortfolio: () => path.portfolio,\r\n toInsider: () => path.insider,\r\n toElite: () => path.elite,\r\n toSearch: (ticker: string) => compilePath(path.search, { ticker }),\r\n toQuote: (ticker: string) => compilePath(path.quote, { ticker }),\r\n toContact: () => path.contact,\r\n\r\n toAlerts: () => path.alerts,\r\n toHelp: () => path.help,\r\n toAccount: () => path.account,\r\n toLogin: () => path.login,\r\n toLogout: () => path.logout,\r\n\r\n toMaps: () => path.maps,\r\n toBubbles: () => path.bubbles,\r\n\r\n toFutures: () => path.futures,\r\n toFuturesPerf: () => path.futuresPerf,\r\n toFuturesCharts: () => path.futuresCharts,\r\n toFuturesChartDetail: (ticker: string) => compilePath(path.futuresChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toForex: () => path.forex,\r\n toForexPerf: () => path.forexPerf,\r\n toForexCharts: () => path.forexCharts,\r\n toForexChartDetail: (ticker: string) => compilePath(path.forexChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toCrypto: () => path.crypto,\r\n toCryptoPerf: () => path.cryptoPerf,\r\n toCryptoCharts: () => path.cryptoCharts,\r\n toCryptoChartDetail: (ticker: string) => compilePath(path.cryptoChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toBacktests: () => path.backtests,\r\n toBacktestCreate: () => path.backtestCreate,\r\n toBacktestDetail: (backtestId: string | number) =>\r\n compilePath(path.backtestDetail, { backtestId: String(backtestId) }),\r\n toBacktestPresets: () => path.backtestPresets,\r\n}\r\n","export enum Instrument {\r\n Stock = 'stock',\r\n Forex = 'forex',\r\n Crypto = 'crypto',\r\n Futures = 'futures',\r\n MarketSentiment = 'market_sentiment',\r\n Group = 'group',\r\n}\r\n\r\nexport type RecordType = Record\r\n\r\nexport type PartialBy = Omit & Partial>\r\n\r\nexport type NullableNumbers = { [K in keyof Obj]: Obj[K] extends number ? number | null : Obj[K] }\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport type SortableValue = string | null | number | Date\r\nexport enum SortDirection {\r\n Ascending = 1,\r\n Descending = -1,\r\n}\r\n\r\nexport enum FeatureFlag {\r\n RedesignedPages = 'redesign',\r\n PortfolioRedesign = 'redesignpfo',\r\n OptionsGreeks = 'greeks',\r\n TrafficPage = 'trafficPage',\r\n ScreenerAddFilter = 'screeneraddfilter',\r\n}\r\n","import React, { ComponentType, LazyExoticComponent, lazy } from 'react'\r\nimport {\r\n ActionFunction,\r\n ActionFunctionArgs,\r\n LoaderFunction,\r\n LoaderFunctionArgs,\r\n type RouteObject,\r\n type ShouldRevalidateFunction,\r\n type ShouldRevalidateFunctionArgs,\r\n useSearchParams,\r\n} from 'react-router-dom'\r\n\r\nimport { parseInitData } from '../app/shared/utils'\r\nimport { CachedLoaderDataContextProvider } from './hooks/useCachedLoaderData'\r\n\r\n/**\r\n * This fn creates a revalidator rule which always revalidates loader when the\r\n * specified keys change but ignores changes to other keys. It also allows\r\n * `revalidator.revalidate` to work even if the query didn’t\r\n */\r\n\r\nexport function revalidateOnQueryChange(keys: string[]): ShouldRevalidateFunction {\r\n return (args) => {\r\n const prevParams = args.currentUrl.searchParams\r\n const nextParams = args.nextUrl.searchParams\r\n const requiredChanged = keys.some((key) => prevParams.get(key) !== nextParams.get(key))\r\n const otherChanged = [...prevParams.keys(), ...nextParams.keys()].some(\r\n (key, index, arr) =>\r\n // Get unique keys\r\n !keys.includes(key) &&\r\n arr.indexOf(key) === index &&\r\n // Check changed keys\r\n prevParams.get(key) !== nextParams.get(key)\r\n )\r\n\r\n if (!requiredChanged && otherChanged) {\r\n return false\r\n }\r\n\r\n return args.defaultShouldRevalidate\r\n }\r\n}\r\n\r\n/**\r\n * This fn does the same as `revalidateOnQueryChange`\r\n * except you need to provide `ShouldRevalidateFunctionArgs` manually\r\n */\r\n\r\nexport function shouldRevalidateOnQueryChange(args: ShouldRevalidateFunctionArgs, keys: string[]) {\r\n return revalidateOnQueryChange(keys)(args)\r\n}\r\n\r\nexport function parseRouteInitData({\r\n elementId = 'route-init-data',\r\n fallback = null,\r\n removeElement = true,\r\n}: { elementId?: string; fallback?: DataType | null; removeElement?: boolean } = {}): DataType | null {\r\n const element = document.getElementById(elementId)\r\n let initialData = fallback\r\n\r\n if (!element) return fallback\r\n\r\n try {\r\n const parsedData = parseInitData(elementId)\r\n if (removeElement) element.remove()\r\n\r\n if (parsedData) initialData = parsedData\r\n } catch {\r\n initialData = fallback\r\n }\r\n\r\n return initialData\r\n}\r\n\r\n/**\r\n * Function which wraps React.lazy and checks whether a chunk is preloaded\r\n * from async-manifest. If yes, kick in the promise resolve early so we can\r\n * instantly render the component\r\n */\r\nexport function lazyLoadComponent({\r\n chunkName,\r\n load,\r\n}: {\r\n chunkName: string\r\n load: () => Promise<{ default: ComponentType }>\r\n}): LazyExoticComponent> {\r\n // Resolve earlier if prefetch element is present\r\n const hasPreloadElement = document.querySelector(`[data-chunk-id=${chunkName}]`)\r\n\r\n if (hasPreloadElement) {\r\n const componentLoader = load()\r\n\r\n return lazy(() => componentLoader)\r\n }\r\n\r\n return lazy(load)\r\n}\r\n\r\nexport type LazyRouteDefinition = Omit & {\r\n loaderBundle?: () => Promise<{ loader?: LoaderFunction; action?: ActionFunction }>\r\n Component?: ReturnType | (() => JSX.Element)\r\n}\r\n\r\n/**\r\n * Transforms top level async routes and their loaders to react router route definitions.\r\n * - `loaderBundle` must return promise module with exports `{ loader?, action? }`\r\n * - `Component` can be a react component or `lazyLoadComponent`.\r\n *\r\n * If `loaderBundle` and `Component` is set, the component is automatically wrapped in\r\n * ``\r\n *\r\n * Do not use this for query param routes\r\n */\r\nexport function defineLazyRoutes(routes: LazyRouteDefinition[]): RouteObject[] {\r\n return routes.map(({ loaderBundle, Component, ...props }) => {\r\n const loader =\r\n props.loader ??\r\n (loaderBundle ? (args: LoaderFunctionArgs) => loaderBundle().then((mod) => mod.loader?.(args)) : undefined)\r\n\r\n const action =\r\n props.action ??\r\n (loaderBundle ? (args: ActionFunctionArgs) => loaderBundle().then((mod) => mod.action?.(args)) : undefined)\r\n\r\n return {\r\n ...props,\r\n loader,\r\n action,\r\n lazy: async () => ({\r\n // We’re rewriting Component if we have a loader\r\n Component: loader && Component ? undefined : Component,\r\n // Wrap each route in its own provider so they don’t share loader cache\r\n element:\r\n loader && Component ? (\r\n \r\n \r\n \r\n ) : undefined,\r\n }),\r\n children: defineLazyRoutes((props.children as any) ?? []),\r\n } as RouteObject\r\n })\r\n}\r\n\r\n/**\r\n * Argument to `createModuleViewSwitch` when manually specifying the route\r\n */\r\ntype ObjectRoute = {\r\n useDefaultLoader?: boolean\r\n Component: ReturnType\r\n loader?: () => Promise<{ loader: LoaderFunction }>\r\n action?: () => Promise<{ action: ActionFunction }>\r\n}\r\n\r\n/**\r\n * A very thin and naive abstraction over react router which allows routing\r\n * by (single) query params\r\n */\r\nexport function createRouteViewSwitch(options: {\r\n viewParam: ViewParamType\r\n defaultView: ViewType | null\r\n views: Record\r\n}) {\r\n /**\r\n * Load the module (should probably be replaced with our async utils code or\r\n * react query so we get retry). Needs to stay `async`, so we can await in\r\n * action/loader switch even if the module is of `ObjectModule` type\r\n */\r\n function getModuleFromURL(search: URLSearchParams): ObjectRoute | null {\r\n const viewQueryParam = (search.get(options.viewParam) as ViewType) ?? options.defaultView\r\n return options.views[viewQueryParam]\r\n }\r\n\r\n function action(args: ActionFunctionArgs): ReturnType {\r\n const url = new URL(args.request.url)\r\n const route = getModuleFromURL(url.searchParams)\r\n if (!route?.action) return null\r\n return route.action().then((actionModule) => actionModule.action(args))\r\n }\r\n\r\n function loader(args: LoaderFunctionArgs): ReturnType {\r\n const url = new URL(args.request.url)\r\n const route = getModuleFromURL(url.searchParams)\r\n\r\n // Use default loader if none is defined\r\n if (!route?.loader) return parseRouteInitData()\r\n\r\n return route.loader().then((loaderModule) => loaderModule.loader(args))\r\n }\r\n\r\n // Handle the actual view switching\r\n function ViewSwitch() {\r\n const [searchParams] = useSearchParams()\r\n const Component = getModuleFromURL(searchParams)?.Component\r\n\r\n return {Component && }\r\n }\r\n\r\n return {\r\n defaultView: options.defaultView,\r\n action,\r\n loader,\r\n ViewSwitch,\r\n }\r\n}\r\n","import isPlainObject from 'lodash.isplainobject'\r\n\r\nimport { getCookie } from '../app/shared/cookie'\r\nimport { CRYPTO_TICKERS } from './constants'\r\nimport { FeatureFlag, Instrument, SortDirection, SortableValue } from './types'\r\nimport { RecordType } from './types'\r\n\r\nconst isObject = (value: any): value is RecordType => isPlainObject(value)\r\n\r\n/**\r\n * Parse text as JSON\r\n */\r\nexport function parseAsJSON(value: unknown | Shape): Shape | undefined {\r\n if (isObject(value)) {\r\n return value as Shape\r\n }\r\n\r\n let parsedValue\r\n try {\r\n if (typeof value === 'string') {\r\n parsedValue = JSON.parse(value)\r\n }\r\n } catch {\r\n return\r\n }\r\n return parsedValue\r\n}\r\n\r\n/**\r\n * remove @ symbol from a ticker\r\n */\r\nexport function cleanTicker(ticker: string) {\r\n return ticker.startsWith('@') ? ticker.substring(1) : ticker\r\n}\r\n\r\n/**\r\n * Get instrument for a ticker.\r\n *\r\n * - If ticker doesn’t start with `@` - stock\r\n * - Otherwise\r\n * - one of `CRYPTO_TICKERS` - crypto\r\n * - has length of 6 - forex\r\n * - none of above - future\r\n *\r\n * NOTE: counterpart in charts 'charts/app/utils/chart.js'\r\n */\r\n\r\nexport function getInstrumentForTicker(ticker: string): Instrument {\r\n if (!ticker?.startsWith('@')) return Instrument.Stock\r\n\r\n const cleanedTicker = cleanTicker(ticker)\r\n\r\n if (CRYPTO_TICKERS.includes(cleanedTicker.toUpperCase())) return Instrument.Crypto\r\n if (cleanedTicker.length === 6) return Instrument.Forex\r\n\r\n return Instrument.Futures\r\n}\r\n\r\n/**\r\n * Async load Resize observer polyfill when we need it\r\n */\r\nlet resizeObserverPolyfill: typeof window.ResizeObserver\r\n\r\nexport async function loadResizeObserverPolyfill() {\r\n if (typeof window.ResizeObserver === 'undefined') {\r\n const polyfill = await import('resize-observer-polyfill')\r\n resizeObserverPolyfill = polyfill.default\r\n window.ResizeObserver = resizeObserverPolyfill\r\n return resizeObserverPolyfill as typeof window.ResizeObserver\r\n }\r\n}\r\n\r\nexport async function getIsBrave() {\r\n return (navigator.brave && (await navigator.brave.isBrave())) || false\r\n}\r\n\r\nexport function deserializeFeatureFlags(): Partial> | undefined {\r\n try {\r\n const cookie = decodeURIComponent(getCookie('featureFlags'))\r\n const flags = cookie.split('_').map((value) => {\r\n const [key, val] = value.split(':')\r\n return [key, val === '1']\r\n })\r\n\r\n return Object.fromEntries(flags)\r\n } catch {\r\n return\r\n }\r\n}\r\n\r\nexport function serializeFeatureFlags(flags: Partial>) {\r\n return Object.entries(flags)\r\n .map(([key, val]) => `${key}:${Number(val)}`)\r\n .join('_')\r\n}\r\n\r\nexport enum ChildPosition {\r\n topLeft,\r\n topRight,\r\n bottomLeft,\r\n bottomRight,\r\n center,\r\n topCenter,\r\n rightCenter,\r\n bottomCenter,\r\n leftCenter,\r\n}\r\n\r\nexport function getFlexAlignClasses(position: ChildPosition) {\r\n return {\r\n 'justify-start': [ChildPosition.topLeft, ChildPosition.bottomLeft, ChildPosition.leftCenter].includes(position),\r\n 'justify-center': [ChildPosition.center, ChildPosition.topCenter, ChildPosition.bottomCenter].includes(position),\r\n 'justify-end': [ChildPosition.topRight, ChildPosition.bottomRight, ChildPosition.rightCenter].includes(position),\r\n 'items-start': [ChildPosition.topLeft, ChildPosition.topRight, ChildPosition.topCenter].includes(position),\r\n 'items-center': [ChildPosition.center, ChildPosition.rightCenter, ChildPosition.leftCenter].includes(position),\r\n 'items-end': [ChildPosition.bottomLeft, ChildPosition.bottomRight, ChildPosition.bottomCenter].includes(position),\r\n }\r\n}\r\n\r\ninterface NumberFormatOptions {\r\n fractions: number\r\n multiply: number\r\n showPlusSign: boolean\r\n defaultValue: string\r\n prefix: string\r\n withSpace: boolean\r\n}\r\n\r\nconst intlCache: { [key: number]: Intl.NumberFormat } = {}\r\nconst dollarIntlCache: { [key: number]: Intl.NumberFormat } = {}\r\n\r\nfunction getIntl(fractions: number) {\r\n if (!intlCache[fractions])\r\n intlCache[fractions] = new Intl.NumberFormat('en-US', {\r\n minimumFractionDigits: fractions,\r\n maximumFractionDigits: fractions,\r\n })\r\n return intlCache[fractions]\r\n}\r\n\r\nfunction getDollarIntl(fractions: number) {\r\n if (!dollarIntlCache[fractions])\r\n dollarIntlCache[fractions] = new Intl.NumberFormat('en-US', {\r\n minimumFractionDigits: fractions,\r\n maximumFractionDigits: fractions,\r\n style: 'currency',\r\n currency: 'USD',\r\n })\r\n return dollarIntlCache[fractions]\r\n}\r\n\r\nexport function shortFormatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-', multiply = 1 }: Partial = {}\r\n) {\r\n let num = value\r\n if (num === undefined || num === null || !Number.isFinite(num)) return defaultValue\r\n\r\n num *= multiply\r\n\r\n let suffix = ''\r\n const absValue = Math.abs(num)\r\n if (absValue >= 1e9) {\r\n num /= 1e9\r\n suffix = 'B'\r\n } else if (absValue >= 1e6) {\r\n num /= 1e6\r\n suffix = 'M'\r\n } else if (absValue >= 1000) {\r\n num /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n const formatted = getIntl(fractions).format(num)\r\n\r\n return (showPlusSign && num > 0 ? '+' : '') + formatted + suffix\r\n}\r\n\r\nexport function shortFormatDollar(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-', multiply = 1 }: Partial = {}\r\n) {\r\n let num = value\r\n if (num === undefined || num === null || !Number.isFinite(num)) return defaultValue\r\n\r\n num *= multiply\r\n\r\n let suffix = ''\r\n const absValue = Math.abs(num)\r\n if (absValue >= 1e9) {\r\n num /= 1e9\r\n suffix = 'B'\r\n } else if (absValue >= 1e6) {\r\n num /= 1e6\r\n suffix = 'M'\r\n } else if (absValue >= 1000) {\r\n num /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n const formatted = getDollarIntl(fractions).format(num)\r\n\r\n return (showPlusSign && num > 0 ? '+' : '') + formatted + suffix\r\n}\r\n\r\nexport function formatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-' }: Partial = {}\r\n) {\r\n if (value === undefined || value === null) return defaultValue\r\n\r\n const fixedValue = value.toFixed(fractions)\r\n const signPrefix = showPlusSign && value > 0 ? '+' : ''\r\n\r\n if (parseFloat(fixedValue) === 0 && value !== 0) {\r\n return {signPrefix + fixedValue}\r\n }\r\n\r\n const formatted = getIntl(fractions).format(value)\r\n\r\n return signPrefix + formatted\r\n}\r\n\r\nexport function formatDollar(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-' }: Partial = {}\r\n) {\r\n if (value === undefined || value === null) return defaultValue\r\n\r\n const fixedValue = value.toFixed(fractions)\r\n const signPrefix = showPlusSign && value > 0 ? '+' : ''\r\n\r\n const formatted = getDollarIntl(fractions).format(value)\r\n\r\n if (parseFloat(fixedValue) === 0 && value !== 0) {\r\n return {signPrefix + formatted}\r\n }\r\n\r\n return signPrefix + formatted\r\n}\r\n\r\nexport interface SortByColumnOptions {\r\n /**\r\n * Change order of `null` values.\r\n * - `false` Force sort null as first (asc) and last (desc)\r\n * - `true` Always sort null as last regardless of order\r\n * @default false\r\n */\r\n sortNullAsLast?: boolean\r\n\r\n /**\r\n * When true, null values will not be treated as special values\r\n * @default false\r\n */\r\n ignoreNullForComparison?: boolean\r\n}\r\n\r\nexport function sortByColumn(\r\n options: SortByColumnOptions & {\r\n a: SortableValue\r\n b: SortableValue\r\n direction: SortDirection\r\n }\r\n) {\r\n if (options.a === options.b) return 0\r\n\r\n // Compare as strings\r\n if (typeof options.a === 'string' && typeof options.b === 'string')\r\n return options.a.localeCompare(options.b) * options.direction\r\n\r\n // Always sort null last if enabled\r\n if (options.sortNullAsLast && options.a === null) return Infinity\r\n if (options.sortNullAsLast && options.b === null) return -Infinity\r\n\r\n // Sort null first/last depending on direction\r\n if (!options.ignoreNullForComparison && options.a === null) return -options.direction\r\n if (!options.ignoreNullForComparison && options.b === null) return options.direction\r\n\r\n // Compare as numbers\r\n return (Number(options.a) - Number(options.b)) * options.direction\r\n}\r\n\r\nexport function moveItemInArray(arr: ItemType[], sourceIndex: number, destinationIndex: number) {\r\n // make sure sourceIndex and destinationIndex are inside of arr\r\n const from = Math.max(0, Math.min(sourceIndex, arr.length - 1))\r\n const to = Math.min(arr.length - 1, Math.max(destinationIndex, 0))\r\n\r\n const items = [...arr]\r\n const [removed] = items.splice(from, 1)\r\n items.splice(to, 0, removed)\r\n\r\n return items\r\n}\r\n\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n\r\n/**\r\n * Used as a callback to autoFocusOnShow/autoFocusOnHide to make sure the page\r\n * doesn’t jump when focusing the element\r\n */\r\nexport function focusWithoutScroll(element: HTMLElement | null) {\r\n requestAnimationFrame(() => {\r\n element?.focus({ preventScroll: element.ariaHasPopup !== null })\r\n })\r\n\r\n return !element\r\n}\r\n\r\nexport function blurWithoutScroll(element: HTMLElement | null) {\r\n element?.focus({ preventScroll: true })\r\n\r\n return !element\r\n}\r\n\r\n/**\r\n * Can be used as a callback for events if you just need to prevent the default action\r\n */\r\nexport function preventDefault(ev: React.MouseEvent) {\r\n ev.preventDefault()\r\n}\r\n\r\nexport function getNavigationLinkUrl(\r\n url: URL,\r\n preservedKeys?: string[],\r\n removeQueryKeys?: string[],\r\n additionalQueryValues: Record = {}\r\n) {\r\n const newUrl = new URL(url)\r\n\r\n if (preservedKeys?.length) {\r\n for (const key of newUrl.searchParams.keys()) {\r\n if (!preservedKeys.includes(key)) newUrl.searchParams.delete(key)\r\n }\r\n }\r\n\r\n removeQueryKeys?.forEach((key) => {\r\n newUrl.searchParams.delete(key)\r\n })\r\n\r\n Object.entries(additionalQueryValues).forEach(([key, value]) => {\r\n newUrl.searchParams.set(key, value as string)\r\n })\r\n\r\n return newUrl\r\n}\r\n\r\nexport function getElitePageLink(campaign?: string) {\r\n const url = '/elite.ashx'\r\n const query = new URLSearchParams('utm_source=finviz&utm_medium=banner')\r\n\r\n if (campaign) {\r\n query.set('utm_campaign', campaign)\r\n\r\n return `${url}?${query.toString()}`\r\n }\r\n\r\n return url\r\n}\r\n","\"use client\";\nimport {\n useButton\n} from \"./JJ3MV4KB.js\";\nimport {\n useDialogScopedContext\n} from \"./XXVAHUAO.js\";\nimport {\n createElement,\n createHook,\n forwardRef\n} from \"./5M6RSQEC.js\";\nimport {\n useEvent\n} from \"./6O5OEQGF.js\";\nimport {\n __objRest,\n __spreadProps,\n __spreadValues\n} from \"./4R3V3JGP.js\";\n\n// src/dialog/dialog-dismiss.tsx\nimport { useMemo } from \"react\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nvar TagName = \"button\";\nvar useDialogDismiss = createHook(\n function useDialogDismiss2(_a) {\n var _b = _a, { store } = _b, props = __objRest(_b, [\"store\"]);\n const context = useDialogScopedContext();\n store = store || context;\n const onClickProp = props.onClick;\n const onClick = useEvent((event) => {\n onClickProp == null ? void 0 : onClickProp(event);\n if (event.defaultPrevented)\n return;\n store == null ? void 0 : store.hide();\n });\n const children = useMemo(\n () => /* @__PURE__ */ jsxs(\n \"svg\",\n {\n \"aria-label\": \"Dismiss popup\",\n display: \"block\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: \"1.5pt\",\n viewBox: \"0 0 16 16\",\n height: \"1em\",\n width: \"1em\",\n children: [\n /* @__PURE__ */ jsx(\"line\", { x1: \"4\", y1: \"4\", x2: \"12\", y2: \"12\" }),\n /* @__PURE__ */ jsx(\"line\", { x1: \"4\", y1: \"12\", x2: \"12\", y2: \"4\" })\n ]\n }\n ),\n []\n );\n props = __spreadProps(__spreadValues({\n \"data-dialog-dismiss\": \"\",\n children\n }, props), {\n onClick\n });\n props = useButton(props);\n return props;\n }\n);\nvar DialogDismiss = forwardRef(function DialogDismiss2(props) {\n const htmlProps = useDialogDismiss(props);\n return createElement(TagName, htmlProps);\n});\n\nexport {\n useDialogDismiss,\n DialogDismiss\n};\n","\"use client\";\nimport {\n useCommand\n} from \"./KSZPJCUA.js\";\nimport {\n createElement,\n createHook,\n forwardRef\n} from \"./5M6RSQEC.js\";\nimport {\n useMergeRefs,\n useTagName\n} from \"./6O5OEQGF.js\";\nimport {\n __spreadProps,\n __spreadValues\n} from \"./4R3V3JGP.js\";\n\n// src/button/button.ts\nimport { useEffect, useRef, useState } from \"react\";\nimport { isButton } from \"@ariakit/core/utils/dom\";\nvar TagName = \"button\";\nvar useButton = createHook(\n function useButton2(props) {\n const ref = useRef(null);\n const tagName = useTagName(ref, TagName);\n const [isNativeButton, setIsNativeButton] = useState(\n () => !!tagName && isButton({ tagName, type: props.type })\n );\n useEffect(() => {\n if (!ref.current)\n return;\n setIsNativeButton(isButton(ref.current));\n }, []);\n props = __spreadProps(__spreadValues({\n role: !isNativeButton && tagName !== \"a\" ? \"button\" : void 0\n }, props), {\n ref: useMergeRefs(ref, props.ref)\n });\n props = useCommand(props);\n return props;\n }\n);\nvar Button = forwardRef(function Button2(props) {\n const htmlProps = useButton(props);\n return createElement(TagName, htmlProps);\n});\n\nexport {\n useButton,\n Button\n};\n"],"names":["decodeQueryString","vars","arguments","length","undefined","window","location","search","substring","split","obj","forEach","pair","delimiterPos","indexOf","key","decodeURIComponent","value","encodeQueryString","values","whitelistedValues","Object","keys","reduce","prev","includes","encodeURIComponent","getParsedCookies","cookieName","parseCookies","document","cookie","map","cookieString","acc","v","trim","getCookie","name","re","RegExp","replace","setCookie","expires","toUTCString","test","hostname","sentryOptions","dsn","allowUrls","release","FinvizSentrySettings","environment","sendDefaultPii","integrations","dedupeIntegration","extraErrorDataIntegration","httpClientIntegration","failedRequestTargets","thirdPartyErrorFilterIntegration","filterKeys","behaviour","ignoreErrors","ignoreStack","Sentry","beforeSend","event","hint","_event$exception$valu","_event$exception","_event$contexts$respo","_event$contexts","error","originalException","errorFrames","exception","stacktrace","frames","some","ignorePattern","ignoreSource","ignoreMessage","Array","isArray","isIgnoredScript","frame","_frame$filename","filename","isIgnoredMessage","message","match","statusCode","ThrowableError","status","contexts","response","status_code","level","fingerprint","id","String","_window$FinvizSetting","_window$FinvizSetting2","dpr","devicePixelRatio","redesign","FinvizSettings","hasRedesignEnabled","dark","hasDarkTheme","innerWidth","innerHeight","captureException","captureMessage","withScope","formatDateToStringUS","date","toLocaleDateString","day","month","year","parseInitData","elementId","initDataElement","getElementById","JSON","parse","textContent","e","getSidebarFromCookie","chartsUrl","decodedCookie","sidebar","Delayed","_ref","delay","timeout","throwOnTimeout","delayComponent","timeoutComponent","children","visible","setVisible","React","hasTimedOut","setHasTimedOut","visibilityTimeout","setTimeout","failedTimeout","Error","clearTimeout","_jsx","_Fragment","ErrorView","title","showContact","showRefresh","_jsxs","className","Heading","Paragraph","href","link","toContact","Button","as","origin","pathname","DefaultErrorBoundary","_ref2","props","useEffect","console","stringify","RouterErrorElement","useRouteError","Loading","Spinner","LoadingScreen","NotificationPosition","NotificationContext","show","hide","useNotification","NotificationWrapper","isOpen","setIsOpen","notification","setNotification","viewport","setViewport","useVisualViewport","enabled","context","element","options","getVisualViewport","visualViewport","positionClass","_notification$options","position","BottomLeft","TopLeft","TopRight","BottomRight","WrapperComponent","inline","Ariakit","Provider","current","role","classnames","unmountOnHide","open","onClose","modal","backdrop","focusable","hideOnEscape","hideOnInteractOutside","autoFocusOnShow","autoFocusOnHide","style","width","height","transform","left","top","scale","willChange","withNotificationContext","WrappedComponent","_WrappedComponent$dis","displayName","WithNotificationContext","notificationContext","Notification","closeText","actions","timeoutInMs","timeoutId","theme","CRYPTO_TICKERS","TIMEFRAME","SpecificChartFunctionality","QuoteRoutes","FINANCIALS_SECTION_LABELS","Revenue","Dividends","Earnings","Forecast","OPTIONS_SECTION_LABELS","OptionsChain","OptionsVolatility","MONTHS","SETTINGS_CONTEXT_DEFAULT","versionImages","nodeChartsDomain","hasUserPremium","email","SettingsContext","createContext","useSettings","useContext","CachedLoaderDataContext","useCachedLoaderData","CachedLoaderDataContextProvider","isNullValidData","loaderData","useLoaderData","dataCacheRef","data","isCached","_visualViewport$width","_visualViewport$heigh","_visualViewport$scale","_visualViewport$offse","_visualViewport$offse2","offsetTop","offsetLeft","Math","round","unscaledWidth","unscaledHeight","onScroll","_window$visualViewpor","_window$visualViewpor2","handleChange","throttle","ev","currentTarget","addEventListener","_window$visualViewpor3","_window$visualViewpor4","removeEventListener","portfolioModule","path","shouldRevalidate","revalidateOnQueryChange","loaderBundle","Component","lazyLoadComponent","chunkName","load","QuoteSharedWrapper","optionsBundle","loader","action","ViewSwitch","createRouteViewSwitch","defaultView","viewParam","QuoteQuery","Type","views","QuoteSubview","Eearnings","ShortInterest","Traffic","LatestFilings","quoteModule","args","getQuoteSubview","currentUrl","searchParams","get","shouldRevalidateOnQueryChange","useSearchParams","subview","getQuoteSubviewFromQuery","then","RenderRecentQuotes","catch","fallback","ScrollRestoration","router","createBrowserRouter","Suspense","Outlet","ErrorBoundary","defineLazyRoutes","rootEl","ReactDOM","render","RouterProvider","QuoteView","query","type","_Object$values$find","find","getQuoteView","Financials","Options","ChartDetail","compilePath","params","pathToRegexp","toHome","toNews","toScreener","toCharts","toGroups","toPortfolio","toInsider","toElite","toSearch","ticker","toQuote","toAlerts","toHelp","toAccount","toLogin","toLogout","toMaps","toBubbles","toFutures","toFuturesPerf","toFuturesCharts","toFuturesChartDetail","cleanTicker","toForex","toForexPerf","toForexCharts","toForexChartDetail","toCrypto","toCryptoPerf","toCryptoCharts","toCryptoChartDetail","toBacktests","toBacktestCreate","toBacktestDetail","backtestId","toBacktestPresets","Instrument","DateRangeType","SortDirection","FeatureFlag","prevParams","nextParams","nextUrl","requiredChanged","otherChanged","index","arr","defaultShouldRevalidate","parseRouteInitData","removeElement","initialData","parsedData","remove","querySelector","componentLoader","lazy","routes","_props$loader","_props$action","_ref3","mod","_mod$loader","call","_mod$action","async","getModuleFromURL","_ref4","viewQueryParam","route","URL","request","url","actionModule","loaderModule","_getModuleFromURL","startsWith","getInstrumentForTicker","Stock","cleanedTicker","toUpperCase","Crypto","Forex","Futures","resizeObserverPolyfill","loadResizeObserverPolyfill","ResizeObserver","polyfill","default","getIsBrave","navigator","brave","isBrave","deserializeFeatureFlags","flags","val","fromEntries","serializeFeatureFlags","entries","Number","join","ChildPosition","getFlexAlignClasses","topLeft","bottomLeft","leftCenter","center","topCenter","bottomCenter","topRight","bottomRight","rightCenter","intlCache","dollarIntlCache","getIntl","fractions","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","getDollarIntl","currency","shortFormatNumber","showPlusSign","defaultValue","multiply","num","isFinite","suffix","absValue","abs","format","shortFormatDollar","formatNumber","fixedValue","toFixed","signPrefix","parseFloat","toString","formatDollar","formatted","sortByColumn","a","b","localeCompare","direction","sortNullAsLast","Infinity","ignoreNullForComparison","moveItemInArray","sourceIndex","destinationIndex","from","max","min","to","items","removed","splice","getUuid","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","c","getRandomValues","Uint8Array","focusWithoutScroll","requestAnimationFrame","focus","preventScroll","ariaHasPopup","blurWithoutScroll","preventDefault","getNavigationLinkUrl","preservedKeys","removeQueryKeys","additionalQueryValues","newUrl","delete","set","getElitePageLink","campaign","URLSearchParams","useDialogDismiss","_a","_b","store","onClickProp","onClick","defaultPrevented","useMemo","jsxs","display","fill","stroke","strokeLinecap","strokeLinejoin","strokeWidth","viewBox","jsx","x1","y1","x2","y2","DialogDismiss","htmlProps","TagName","useButton","ref","useRef","tagName","isNativeButton","setIsNativeButton","useState"],"sourceRoot":""}