gitextract_8g1dy2zt/ ├── .github/ │ └── workflows/ │ └── webapp-linting-and-unit-tests.yaml ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── Makefile ├── README.md └── packages/ ├── back-nest/ │ ├── .eslintrc.js │ ├── .gitignore │ ├── .prettierrc │ ├── Dockerfile │ ├── README.md │ ├── docker-compose.yml │ ├── nest-cli.json │ ├── package.json │ ├── scripts/ │ │ ├── seed-local.sh │ │ └── seed-production.sh │ ├── src/ │ │ ├── app.module.ts │ │ ├── auth/ │ │ │ ├── auth.module.ts │ │ │ └── github/ │ │ │ ├── github.controller.ts │ │ │ ├── github.guard.ts │ │ │ └── github.strategy.ts │ │ ├── challenges/ │ │ │ ├── challenges.module.ts │ │ │ ├── commands/ │ │ │ │ ├── calculate-language-runner.ts │ │ │ │ ├── challenge-import-runner.ts │ │ │ │ ├── reformat-challenges-runner.ts │ │ │ │ └── unsynced-file-import-runner.ts │ │ │ ├── entities/ │ │ │ │ ├── challenge.entity.ts │ │ │ │ ├── language.dto.ts │ │ │ │ └── unsynced-file.entity.ts │ │ │ ├── languages.controller.ts │ │ │ └── services/ │ │ │ ├── challenge.service.ts │ │ │ ├── literal.service.ts │ │ │ ├── parser.service.ts │ │ │ ├── tests/ │ │ │ │ └── parser.service.spec.ts │ │ │ ├── ts-parser.factory.ts │ │ │ ├── unsynced-file-filterer.ts │ │ │ ├── unsynced-file-importer.ts │ │ │ └── unsynced-file.service.ts │ │ ├── commands.ts │ │ ├── config/ │ │ │ ├── cors.ts │ │ │ └── postgres.ts │ │ ├── connectors/ │ │ │ └── github/ │ │ │ ├── github.module.ts │ │ │ ├── schemas/ │ │ │ │ ├── github-blob.dto.ts │ │ │ │ ├── github-repository.dto.ts │ │ │ │ └── github-tree.dto.ts │ │ │ └── services/ │ │ │ └── github-api.ts │ │ ├── database.module.ts │ │ ├── filters/ │ │ │ └── exception.filter.ts │ │ ├── main.ts │ │ ├── middlewares/ │ │ │ └── guest-user.ts │ │ ├── projects/ │ │ │ ├── commands/ │ │ │ │ ├── import-untracked-projects-runner.ts │ │ │ │ └── sync-untracked-projects-runner.ts │ │ │ ├── entities/ │ │ │ │ ├── project.entity.ts │ │ │ │ └── untracked-project.entity.ts │ │ │ ├── project.controller.ts │ │ │ ├── projects.module.ts │ │ │ └── services/ │ │ │ ├── project.service.ts │ │ │ ├── projects-from-file-reader.ts │ │ │ └── untracked-projects.service.ts │ │ ├── races/ │ │ │ ├── entities/ │ │ │ │ └── race-settings.dto.ts │ │ │ ├── race.controllers.ts │ │ │ ├── race.exceptions.ts │ │ │ ├── race.gateway.ts │ │ │ ├── races.module.ts │ │ │ └── services/ │ │ │ ├── add-keystroke.service.ts │ │ │ ├── countdown.service.ts │ │ │ ├── keystroke-validator.service.ts │ │ │ ├── locker.service.ts │ │ │ ├── progress.service.ts │ │ │ ├── race-events.service.ts │ │ │ ├── race-manager.service.ts │ │ │ ├── race-player.service.ts │ │ │ ├── race.service.ts │ │ │ ├── results-handler.service.ts │ │ │ ├── session-state.service.ts │ │ │ └── tests/ │ │ │ └── race-player.service.spec.ts │ │ ├── results/ │ │ │ ├── entities/ │ │ │ │ ├── leaderboard-result.dto.ts │ │ │ │ └── result.entity.ts │ │ │ ├── errors.ts │ │ │ ├── results.controller.ts │ │ │ ├── results.module.ts │ │ │ └── services/ │ │ │ ├── result-calculation.service.ts │ │ │ ├── result-factory.service.ts │ │ │ └── results.service.ts │ │ ├── seeder/ │ │ │ ├── commands/ │ │ │ │ └── challenge.seeder.ts │ │ │ └── seeder.module.ts │ │ ├── sessions/ │ │ │ ├── session.adapter.ts │ │ │ ├── session.entity.ts │ │ │ ├── session.middleware.ts │ │ │ └── types.d.ts │ │ ├── tracking/ │ │ │ ├── entities/ │ │ │ │ └── event.entity.ts │ │ │ ├── tracking.module.ts │ │ │ └── tracking.service.ts │ │ ├── users/ │ │ │ ├── controllers/ │ │ │ │ └── user.controller.ts │ │ │ ├── entities/ │ │ │ │ ├── upsertGithubUserDTO.ts │ │ │ │ └── user.entity.ts │ │ │ ├── services/ │ │ │ │ └── user.service.ts │ │ │ ├── users.module.ts │ │ │ └── utils/ │ │ │ └── generateRandomUsername.ts │ │ └── utils/ │ │ └── validateDTO.ts │ ├── tracked-projects.txt │ ├── tsconfig.build.json │ └── tsconfig.json └── webapp-next/ ├── .eslintrc.json ├── .gitignore ├── .prettierrc ├── README.md ├── Socket.ts ├── assets/ │ └── icons/ │ ├── BattleIcon.tsx │ ├── CopyIcon.tsx │ ├── CrossIcon.tsx │ ├── CrownIcon.tsx │ ├── DiscordLogo.tsx │ ├── DownArrowIcon.tsx │ ├── GithubLogo.tsx │ ├── InfoIcon.tsx │ ├── KogWheel.tsx │ ├── LinkIcon.tsx │ ├── OnlineIcon.tsx │ ├── PlayIcon.tsx │ ├── ProfileIcon.tsx │ ├── ReloadIcon.tsx │ ├── RightArrowIcon.tsx │ ├── TerminalIcon.tsx │ ├── TwitchLogo.tsx │ ├── UserGroupIcon.tsx │ ├── WarningIcon.tsx │ ├── YoutubeLogo.tsx │ └── index.tsx ├── common/ │ ├── api/ │ │ ├── auth.ts │ │ ├── races.ts │ │ ├── types.ts │ │ └── user.ts │ ├── components/ │ │ ├── Avatar.tsx │ │ ├── BattleMatcher.tsx │ │ ├── Button.tsx │ │ ├── Footer/ │ │ │ └── YoutubeLink.tsx │ │ ├── Footer.tsx │ │ ├── Layout.tsx │ │ ├── NewNavbar.tsx │ │ ├── Overlay.tsx │ │ ├── buttons/ │ │ │ ├── GithubLoginButton.tsx │ │ │ └── ModalCloseButton.tsx │ │ ├── modals/ │ │ │ ├── GithubLoginModal.tsx │ │ │ ├── GithubModal.tsx │ │ │ ├── Modal.tsx │ │ │ ├── ProfileModal.tsx │ │ │ └── SettingsModal.tsx │ │ └── overlays/ │ │ ├── GithubLoginOverlay.tsx │ │ └── SettingsOverlay.tsx │ ├── github/ │ │ └── stargazers.ts │ ├── hooks/ │ │ ├── useIsPlaying.ts │ │ └── useSocket.ts │ ├── services/ │ │ └── Socket.ts │ ├── state/ │ │ └── user-store.ts │ └── utils/ │ ├── clipboard.ts │ ├── cpmToWPM.ts │ ├── getServerUrl.ts │ ├── router.ts │ └── toHumanReadableTime.ts ├── components/ │ ├── Countdown.tsx │ ├── Navbar.tsx │ └── Stream.tsx ├── hooks/ │ ├── useKeyMap.ts │ └── useTotalSeconds.ts ├── modules/ │ └── play2/ │ ├── components/ │ │ ├── CodeArea.tsx │ │ ├── HiddenCodeInput.tsx │ │ ├── IncorrectChars.tsx │ │ ├── NextChar.tsx │ │ ├── RaceSettings.tsx │ │ ├── ResultsChart.tsx │ │ ├── SmoothCaret.tsx │ │ ├── TweetResult.tsx │ │ ├── TypedChars.tsx │ │ ├── UntypedChars.tsx │ │ ├── leaderboard/ │ │ │ ├── Leaderboard.tsx │ │ │ └── LeaderboardButton.tsx │ │ ├── play-footer/ │ │ │ ├── ChallengeSource/ │ │ │ │ ├── ChallengeSource.tsx │ │ │ │ └── index.ts │ │ │ └── PlayFooter/ │ │ │ ├── PlayFooter.tsx │ │ │ └── index.ts │ │ ├── play-header/ │ │ │ └── PlayHeader/ │ │ │ ├── PlayHeader.tsx │ │ │ └── index.tsx │ │ └── race-settings/ │ │ └── LanguageSelector.tsx │ ├── containers/ │ │ ├── CodeTypingContainer.tsx │ │ └── ResultsContainer.tsx │ ├── hooks/ │ │ ├── useChallenge.ts │ │ ├── useEndGame.ts │ │ ├── useFocusRef.ts │ │ ├── useGame.ts │ │ ├── useGameIdQueryParam.ts │ │ ├── useIsCompleted.ts │ │ ├── useNodeRect.ts │ │ └── useResetStateOnUnmount.ts │ ├── services/ │ │ └── Game.ts │ └── state/ │ ├── code-store.ts │ ├── connection-store.ts │ ├── game-store.ts │ ├── settings-store.ts │ └── trends-store.ts ├── next.config.js ├── package.json ├── pages/ │ ├── 404.tsx │ ├── _app.tsx │ ├── _document.tsx │ ├── index.tsx │ └── results/ │ └── [id].tsx ├── postcss.config.js ├── public/ │ └── robots.txt ├── styles/ │ └── globals.css ├── tailwind.config.js ├── tsconfig.json └── utils/ ├── calculateAccuracy.ts ├── cpmToWpm.ts ├── getTimeDifference.ts ├── humanize.ts └── stripIndentation.ts