SYMBOL INDEX (140 symbols across 36 files) FILE: cron/leetcode/models.py class Configuration (line 7) | class Configuration: method __init__ (line 8) | def __init__(self): class GraphqlQuery (line 14) | class GraphqlQuery: method __init__ (line 15) | def __init__(self, query=None, variables=None, operation_name=None): class GraphqlQueryGetQuestionDetailVariables (line 21) | class GraphqlQueryGetQuestionDetailVariables: method __init__ (line 22) | def __init__(self, title_slug=None): class GraphqlQuestionDetail (line 26) | class GraphqlQuestionDetail: method __init__ (line 27) | def __init__(self, question_id=None, title=None, difficulty=None, class GraphqlData (line 37) | class GraphqlData: method __init__ (line 38) | def __init__(self, question=None): class GraphqlResponse (line 42) | class GraphqlResponse: method __init__ (line 43) | def __init__(self, data=None): class ApiClient (line 47) | class ApiClient: method __init__ (line 48) | def __init__(self, configuration=None): class DefaultApi (line 52) | class DefaultApi: method __init__ (line 53) | def __init__(self, api_client=None): method graphql_post (line 56) | def graphql_post(self, body=None): FILE: cron/leetcode/rest.py class ApiException (line 1) | class ApiException(Exception): method __init__ (line 2) | def __init__(self, status=None, reason=None, body=None): method __str__ (line 7) | def __str__(self): FILE: cron/update_questions.py function create_leetcode_api (line 9) | def create_leetcode_api(): function get_question_metadata (line 38) | def get_question_metadata(api, title_slug): function construct_company_tag_list (line 69) | def construct_company_tag_list(company_tag_stats_v2): function update_question_metadata (line 84) | def update_question_metadata(question, response): function read_questions (line 105) | def read_questions(file_name): function write_questions (line 119) | def write_questions(file_name, questions): function main (line 133) | def main(file_name): FILE: public/sw.js constant CACHE_NAME (line 2) | const CACHE_NAME = "lc-patterns-v2"; constant PRECACHE_URLS (line 4) | const PRECACHE_URLS = [ FILE: scripts/generate-sw-precache.mjs constant OUT_DIR (line 4) | const OUT_DIR = "out"; constant SW_PATH (line 5) | const SW_PATH = join(OUT_DIR, "sw.js"); constant PRECACHE_EXTENSIONS (line 7) | const PRECACHE_EXTENSIONS = new Set([ function collectFiles (line 11) | function collectFiles(dir, base = dir) { FILE: src/app/layout.tsx function RootLayout (line 68) | function RootLayout({ FILE: src/app/not-found.tsx function NotFound (line 3) | function NotFound() { FILE: src/app/page.tsx function Home (line 16) | function Home() { FILE: src/components/layout/AuthContext.test.tsx type AuthCallback (line 4) | type AuthCallback = (event: string, session: { user: Record { function formatCount (line 16) | function formatCount(n: number): string { function GitHubLink (line 21) | async function GitHubLink() { FILE: src/components/layout/Logo.tsx function Logo (line 1) | function Logo() { FILE: src/components/layout/ServiceWorkerRegistrar.tsx function ServiceWorkerRegistrar (line 6) | function ServiceWorkerRegistrar() { FILE: src/components/layout/ThemeToggle.tsx function subscribe (line 7) | function subscribe(callback: () => void) { function getSnapshot (line 16) | function getSnapshot() { function getServerSnapshot (line 20) | function getServerSnapshot() { function ThemeToggle (line 24) | function ThemeToggle() { FILE: src/components/layout/UserMenu.tsx function UserMenu (line 6) | function UserMenu() { FILE: src/components/layout/ViewSwitcher.tsx type View (line 12) | type View = "table" | "beginner" | "experienced"; constant VIEW_KEY (line 14) | const VIEW_KEY = "leetcode-patterns-view"; function isValidView (line 22) | function isValidView(v: string | null): v is View { function ViewSwitcher (line 26) | function ViewSwitcher({ FILE: src/components/panels/AboutPanel.tsx function AboutPanel (line 7) | function AboutPanel() { FILE: src/components/panels/AcknowledgementsPanel.tsx function AcknowledgementsPanel (line 25) | function AcknowledgementsPanel() { FILE: src/components/panels/TipsPanel.tsx function formatApproach (line 8) | function formatApproach(text: string) { function TipsPanel (line 59) | function TipsPanel() { FILE: src/components/questions/ConfirmModal.tsx function ConfirmModal (line 1) | function ConfirmModal({ FILE: src/components/questions/FilterToolbar.tsx type FilterToolbarProps (line 14) | interface FilterToolbarProps { function FilterToolbar (line 43) | function FilterToolbar({ FILE: src/components/questions/GroupHeaderRow.tsx type GroupHeaderRowProps (line 16) | interface GroupHeaderRowProps { FILE: src/components/questions/NoteModal.tsx type EditingNote (line 3) | interface EditingNote { function NoteModal (line 10) | function NoteModal({ FILE: src/components/questions/ProgressBar.tsx type ProgressStats (line 1) | interface ProgressStats { function ProgressBar (line 8) | function ProgressBar({ stats, pct }: { stats: ProgressStats; pct: number... FILE: src/components/questions/QuestionRow.tsx type QuestionRowProps (line 11) | interface QuestionRowProps { FILE: src/components/questions/QuestionsTable.tsx function daysDiff (line 300) | function daysDiff(isoDate: string): number { function reviewPillStyle (line 308) | function reviewPillStyle(isoDate: string): string { function relativeDate (line 320) | function relativeDate(isoDate: string, mode: "past" | "future"): string { function subscribeMobile (line 336) | function subscribeMobile(callback: () => void) { function getMobileSnapshot (line 342) | function getMobileSnapshot() { function getMobileServerSnapshot (line 346) | function getMobileServerSnapshot() { function useIsMobile (line 350) | function useIsMobile() { function parseInitialFilters (line 354) | function parseInitialFilters(searchParams: URLSearchParams) { function QuestionsTable (line 365) | function QuestionsTable({ data, updatedDate }: { data: Question[]; updat... FILE: src/components/questions/ReviewDateModal.tsx constant PRESETS (line 4) | const PRESETS = [ function addDays (line 12) | function addDays(dateStr: string, days: number): string { type ReviewDateTarget (line 18) | interface ReviewDateTarget { function ReviewDateModal (line 23) | function ReviewDateModal({ FILE: src/components/roadmaps/RoadmapView.tsx function InlineMarkdown (line 20) | function InlineMarkdown({ text }: { text: string }) { type Props (line 56) | interface Props { function RoadmapView (line 61) | function RoadmapView({ roadmap, questions }: Props) { FILE: src/data/roadmaps.ts type RoadmapQuestion (line 1) | interface RoadmapQuestion { type RoadmapPhase (line 6) | interface RoadmapPhase { type Roadmap (line 13) | interface Roadmap { FILE: src/lib/analytics.ts function trackEvent (line 3) | function trackEvent(eventName: string, params?: Record): number[] { FILE: src/lib/storage.ts constant MAX_NOTE_LENGTH (line 4) | const MAX_NOTE_LENGTH = 10_000; constant STORAGE_KEY (line 6) | const STORAGE_KEY = "leetcode-patterns-completed"; constant STARRED_KEY (line 7) | const STARRED_KEY = "leetcode-patterns-starred"; constant NOTES_KEY (line 8) | const NOTES_KEY = "leetcode-patterns-notes"; constant SHUFFLE_KEY (line 9) | const SHUFFLE_KEY = "leetcode-patterns-shuffle-order"; constant SOLVED_DATES_KEY (line 10) | const SOLVED_DATES_KEY = "leetcode-patterns-solved-dates"; constant REMINDERS_KEY (line 11) | const REMINDERS_KEY = "leetcode-patterns-reminders"; constant LEGACY_SLUGS (line 14) | const LEGACY_SLUGS = ["contains-duplicate","missing-number","find-all-nu... function loadJson (line 16) | function loadJson(key: string, fallback: T): T { function saveJson (line 25) | function saveJson(key: string, value: unknown): void { function loadCompleted (line 29) | function loadCompleted(): Set { function saveCompleted (line 33) | function saveCompleted(ids: Set): void { function loadStarred (line 37) | function loadStarred(): Set { function saveStarred (line 41) | function saveStarred(ids: Set): void { function loadNotes (line 45) | function loadNotes(): Record { function saveNotes (line 49) | function saveNotes(notes: Record): void { function loadSolvedDates (line 53) | function loadSolvedDates(): Record { function saveSolvedDates (line 57) | function saveSolvedDates(dates: Record): void { function loadReminders (line 61) | function loadReminders(): Record { function saveReminders (line 65) | function saveReminders(reminders: Record): void { function loadShuffleOrder (line 69) | function loadShuffleOrder(): number[] | null { function saveShuffleOrder (line 73) | function saveShuffleOrder(order: number[] | null): void { function migrateLegacyProgress (line 78) | function migrateLegacyProgress(data: Question[]): Set | null { FILE: src/lib/sw.test.ts function createMockCache (line 7) | function createMockCache() { type MockCache (line 25) | type MockCache = ReturnType; function createMockCaches (line 27) | function createMockCaches() { type FetchEvent (line 50) | interface FetchEvent { function loadSW (line 56) | function loadSW(mockSelf: Record) { function makeFetchEvent (line 145) | function makeFetchEvent(url: string, overrides: Partial { function downloadAndMerge (line 36) | async function downloadAndMerge(userId: string): Promise { function doUpload (line 63) | async function doUpload(userId: string): Promise { function scheduleUpload (line 72) | function scheduleUpload(userId: string): void { function flushPendingUpload (line 82) | function flushPendingUpload(): void { function mergeFromRealtimePayload (line 94) | function mergeFromRealtimePayload(data: Record): boolean { function setsEqual (line 138) | function setsEqual(a: Set, b: Set): boolean { function recordsEqual (line 144) | function recordsEqual(a: Record, b: Record