From b94bacc026049fbe9e48f9c83c7bb0876644c81b Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Sun, 2 Apr 2023 21:02:49 -0600 Subject: [PATCH] Auth stuff --- package-lock.json | 87 - package.json | 5 - server/package-lock.json | 72 +- server/package.json | 4 +- server/src/app.controller.ts | 12 - server/src/app.module.ts | 8 +- server/src/app.service.ts | 8 - server/src/auth/auth.controller.ts | 88 + server/src/auth/auth.guard.ts | 32 + server/src/auth/auth.module.ts | 13 + server/src/auth/auth.service.ts | 60 + server/src/auth/words.ts | 5010 ++++++++++++++++++++++++++++ server/src/timer/timer.module.ts | 4 + 13 files changed, 5280 insertions(+), 123 deletions(-) delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 server/src/app.controller.ts delete mode 100644 server/src/app.service.ts create mode 100644 server/src/auth/auth.controller.ts create mode 100644 server/src/auth/auth.guard.ts create mode 100644 server/src/auth/auth.module.ts create mode 100644 server/src/auth/auth.service.ts create mode 100644 server/src/auth/words.ts create mode 100644 server/src/timer/timer.module.ts diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 0712090..0000000 --- a/package-lock.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "friends", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "@types/cookie-parser": "^1.4.3" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cookie-parser": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.3.tgz", - "integrity": "sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" - }, - "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 3a15914..0000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependencies": { - "@types/cookie-parser": "^1.4.3" - } -} diff --git a/server/package-lock.json b/server/package-lock.json index 3d30a9b..ae4b451 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -13,10 +13,10 @@ "@nestjs/core": "^9.0.0", "@nestjs/platform-express": "^9.0.0", "@prisma/client": "^4.12.0", - "@types/cookie-parser": "^1.4.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "cookie-parser": "^1.4.6", + "openpgp": "^5.7.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0" }, @@ -24,9 +24,11 @@ "@nestjs/cli": "^9.0.0", "@nestjs/schematics": "^9.0.0", "@nestjs/testing": "^9.0.0", + "@types/cookie-parser": "^1.4.3", "@types/express": "^4.17.13", "@types/jest": "29.5.0", "@types/node": "18.15.11", + "@types/openpgp": "^4.4.18", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", @@ -1804,10 +1806,20 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -1817,6 +1829,7 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -1825,6 +1838,7 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.3.tgz", "integrity": "sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w==", + "dev": true, "dependencies": { "@types/express": "*" } @@ -1865,6 +1879,7 @@ "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -1876,6 +1891,7 @@ "version": "4.17.33", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -1934,12 +1950,23 @@ "node_modules/@types/mime": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true }, "node_modules/@types/node": { "version": "18.15.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", + "dev": true + }, + "node_modules/@types/openpgp": { + "version": "4.4.18", + "resolved": "https://registry.npmjs.org/@types/openpgp/-/openpgp-4.4.18.tgz", + "integrity": "sha512-8PGX6byEni97ZRRp2fVguSk4hbw4e+0vd8XHmyUt0+PjRoMcOZHsn+StQQjfo/wA/3kf/KCbV6I4pwmSC5/LKg==", + "dev": true, + "dependencies": { + "@types/bn.js": "*" + } }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -1956,12 +1983,14 @@ "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true }, "node_modules/@types/semver": { "version": "7.3.13", @@ -1973,6 +2002,7 @@ "version": "1.15.1", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, "dependencies": { "@types/mime": "*", "@types/node": "*" @@ -2562,6 +2592,17 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2719,6 +2760,11 @@ "node": ">= 6" } }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -5788,6 +5834,11 @@ "node": ">=6" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -6001,6 +6052,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openpgp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-5.7.0.tgz", + "integrity": "sha512-wchYJQfFbSaocUvUIYqNrWD+lRSmFSG1d3Ak2CHeXFocDSEsf7Uc1zUzHjSdlZPTvGeeXPQ+MJrwVtalL4QCBg==", + "dependencies": { + "asn1.js": "^5.0.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", diff --git a/server/package.json b/server/package.json index 897c617..9276ea2 100644 --- a/server/package.json +++ b/server/package.json @@ -24,10 +24,10 @@ "@nestjs/core": "^9.0.0", "@nestjs/platform-express": "^9.0.0", "@prisma/client": "^4.12.0", - "@types/cookie-parser": "^1.4.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "cookie-parser": "^1.4.6", + "openpgp": "^5.7.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.2.0" }, @@ -35,9 +35,11 @@ "@nestjs/cli": "^9.0.0", "@nestjs/schematics": "^9.0.0", "@nestjs/testing": "^9.0.0", + "@types/cookie-parser": "^1.4.3", "@types/express": "^4.17.13", "@types/jest": "29.5.0", "@types/node": "18.15.11", + "@types/openpgp": "^4.4.18", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", diff --git a/server/src/app.controller.ts b/server/src/app.controller.ts deleted file mode 100644 index cce879e..0000000 --- a/server/src/app.controller.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; -import { AppService } from './app.service'; - -@Controller() -export class AppController { - constructor(private readonly appService: AppService) {} - - @Get() - getHello(): string { - return this.appService.getHello(); - } -} diff --git a/server/src/app.module.ts b/server/src/app.module.ts index 5921107..8c1b629 100644 --- a/server/src/app.module.ts +++ b/server/src/app.module.ts @@ -1,11 +1,9 @@ import { Module } from '@nestjs/common'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; import { PrismaModule } from './prisma/prisma.module'; +import { TimerModule } from './timer/timer.module'; +import { AuthModule } from './auth/auth.module'; @Module({ - imports: [PrismaModule], - controllers: [AppController], - providers: [AppService], + imports: [PrismaModule, TimerModule, AuthModule], }) export class AppModule {} diff --git a/server/src/app.service.ts b/server/src/app.service.ts deleted file mode 100644 index 927d7cc..0000000 --- a/server/src/app.service.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class AppService { - getHello(): string { - return 'Hello World!'; - } -} diff --git a/server/src/auth/auth.controller.ts b/server/src/auth/auth.controller.ts new file mode 100644 index 0000000..172736a --- /dev/null +++ b/server/src/auth/auth.controller.ts @@ -0,0 +1,88 @@ +import { + Controller, + Get, + Post, + Body, + Param, + NotFoundException, + BadRequestException, + Res, + UseGuards, + Req, +} from '@nestjs/common'; +import { IsNotEmpty } from 'class-validator'; +import { readKey, readCleartextMessage, verify } from 'openpgp'; +import { AuthService } from './auth.service'; +import { AuthGuard } from './auth.guard'; + +export class LoginUserDTO { + @IsNotEmpty() + signature: string; +} + +@Controller('/auth') +export class AuthController { + constructor(private readonly authService: AuthService) {} + + @UseGuards(AuthGuard) + @Get('/logout') + async logout(@Res({ passthrough: true }) res, @Req() req) { + res.cookie('god_token', '', { + maxAge: -1, + path: '/', + }); + return await this.authService.deleteToken(req.token); + } + + @Get('/:name') + async retrieveGodToken(@Param('name') name: string) { + const friend = await this.authService.findFriendByName(name); + if (!friend) throw new NotFoundException('Friend not found with that name'); + + return await this.authService.createTokenForFriend(friend); + } + + @Post() + async verifyFriend( + @Res({ passthrough: true }) res, + @Body() { signature }: LoginUserDTO, + ) { + let signatureObj; + try { + signatureObj = await readCleartextMessage({ + cleartextMessage: signature, + }); + } catch (e) { + throw new BadRequestException('Invalid PGP Signature'); + } + const { text: token } = signatureObj; + + const referencedToken = await this.authService.findGodTokenWithFriend( + token, + ); + if (!referencedToken) + throw new NotFoundException('Could not find God Token to sign'); + + const { friend } = referencedToken; + const publicKeyObj = await readKey({ armoredKey: friend.public_key }); + const verificationResult = await verify({ + message: signatureObj, + verificationKeys: publicKeyObj, + }); + + const { verified } = verificationResult.signatures[0]; + if (await verified) { + res.cookie('god_token', token, { + httpOnly: true, + path: '/', + expires: referencedToken.expiration, + }); + + return await this.authService.signToken(token); + } + + throw new BadRequestException( + "PGP signature could not be verified with user's public key", + ); + } +} diff --git a/server/src/auth/auth.guard.ts b/server/src/auth/auth.guard.ts new file mode 100644 index 0000000..8b871e4 --- /dev/null +++ b/server/src/auth/auth.guard.ts @@ -0,0 +1,32 @@ +import { + Injectable, + CanActivate, + ExecutionContext, + UnauthorizedException, +} from '@nestjs/common'; +import { AuthService } from './auth.service'; + +@Injectable() +export class AuthGuard implements CanActivate { + constructor(private authService: AuthService) {} + + async canActivate(context: ExecutionContext): Promise { + const req = context.switchToHttp().getRequest(); + + if (!req.cookies.god_token) throw new UnauthorizedException('No session'); + + const token = await this.authService.findGodTokenWithFriend( + req.cookies.god_token, + ); + + if (!token) throw new UnauthorizedException('Could not verify session'); + if (new Date().getTime() > token.expiration.getTime()) + throw new UnauthorizedException('Session has expired'); + + const { friend } = token; + req.friend = friend; + req.token = token.token; + + return true; + } +} diff --git a/server/src/auth/auth.module.ts b/server/src/auth/auth.module.ts new file mode 100644 index 0000000..59345b6 --- /dev/null +++ b/server/src/auth/auth.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { PrismaModule } from '../prisma/prisma.module'; +import { AuthController } from './auth.controller'; +import { AuthGuard } from './auth.guard'; +import { AuthService } from './auth.service'; + +@Module({ + imports: [PrismaModule], + controllers: [AuthController], + exports: [AuthGuard], + providers: [AuthService, AuthGuard], +}) +export class AuthModule {} diff --git a/server/src/auth/auth.service.ts b/server/src/auth/auth.service.ts new file mode 100644 index 0000000..a396169 --- /dev/null +++ b/server/src/auth/auth.service.ts @@ -0,0 +1,60 @@ +import { Injectable } from '@nestjs/common'; +import { Friend } from '@prisma/client'; +import { randomInt } from 'crypto'; + +import { PrismaService } from '../prisma/prisma.service'; +import words from './words'; + +export const GOD_TOKEN_EXPIRATION_MS = 420 * 69 * 1000; +export const GOD_TOKEN_LENGTH = 25; + +@Injectable() +export class AuthService { + constructor(private readonly prismaService: PrismaService) {} + + private makeGodToken = (godTokenLength = GOD_TOKEN_LENGTH) => + Array(godTokenLength) + .fill(null) + .map(() => words[randomInt(0, words.length)]) + .join(' '); + + public findFriendByName(name: string) { + return this.prismaService.friend.findUnique({ + where: { name }, + }); + } + + public createTokenForFriend(friend: Friend) { + return this.prismaService.godToken.create({ + data: { + token: this.makeGodToken(), + friend_id: friend.id, + expiration: new Date(new Date().getTime() + GOD_TOKEN_EXPIRATION_MS), + }, + }); + } + + public deleteToken(token: string) { + return this.prismaService.godToken.delete({ + where: { token }, + }); + } + + public signToken(token: string) { + return this.prismaService.godToken.update({ + where: { token }, + data: { + signed: true, + }, + }); + } + + public findGodTokenWithFriend(token: string) { + return this.prismaService.godToken.findUnique({ + where: { token }, + include: { + friend: true, + }, + }); + } +} diff --git a/server/src/auth/words.ts b/server/src/auth/words.ts new file mode 100644 index 0000000..22c0c4c --- /dev/null +++ b/server/src/auth/words.ts @@ -0,0 +1,5010 @@ +export default [ + "the", + "be", + "and", + "of", + "a", + "in", + "to", + "have", + "it", + "I", + "that", + "for", + "you", + "he", + "with", + "on", + "do", + "say", + "this", + "they", + "at", + "but", + "we", + "his", + "from", + "that", + "not", + "n't", + "by", + "she", + "or", + "as", + "what", + "go", + "their", + "can", + "who", + "get", + "if", + "would", + "her", + "all", + "my", + "make", + "about", + "know", + "will", + "as", + "up", + "one", + "time", + "there", + "year", + "so", + "think", + "when", + "which", + "them", + "some", + "me", + "people", + "take", + "out", + "into", + "just", + "see", + "him", + "your", + "come", + "could", + "now", + "than", + "like", + "other", + "how", + "then", + "its", + "our", + "two", + "more", + "these", + "want", + "way", + "look", + "first", + "also", + "new", + "because", + "day", + "more", + "use", + "no", + "man", + "find", + "here", + "thing", + "give", + "many", + "well", + "only", + "those", + "tell", + "one", + "very", + "her", + "even", + "back", + "any", + "good", + "woman", + "through", + "us", + "life", + "child", + "there", + "work", + "down", + "may", + "after", + "should", + "call", + "world", + "over", + "school", + "still", + "try", + "in", + "as", + "last", + "ask", + "need", + "too", + "feel", + "three", + "when", + "state", + "never", + "become", + "between", + "high", + "really", + "something", + "most", + "another", + "much", + "family", + "own", + "out", + "leave", + "put", + "old", + "while", + "mean", + "on", + "keep", + "student", + "why", + "let", + "great", + "same", + "big", + "group", + "begin", + "seem", + "country", + "help", + "talk", + "where", + "turn", + "problem", + "every", + "start", + "hand", + "might", + "American", + "show", + "part", + "about", + "against", + "place", + "over", + "such", + "again", + "few", + "case", + "most", + "week", + "company", + "where", + "system", + "each", + "right", + "program", + "hear", + "so", + "question", + "during", + "work", + "play", + "government", + "run", + "small", + "number", + "off", + "always", + "move", + "like", + "night", + "live", + "Mr", + "point", + "believe", + "hold", + "today", + "bring", + "happen", + "next", + "without", + "before", + "large", + "all", + "million", + "must", + "home", + "under", + "water", + "room", + "write", + "mother", + "area", + "national", + "money", + "story", + "young", + "fact", + "month", + "different", + "lot", + "right", + "study", + "book", + "eye", + "job", + "word", + "though", + "business", + "issue", + "side", + "kind", + "four", + "head", + "far", + "black", + "long", + "both", + "little", + "house", + "yes", + "after", + "since", + "long", + "provide", + "service", + "around", + "friend", + "important", + "father", + "sit", + "away", + "until", + "power", + "hour", + "game", + "often", + "yet", + "line", + "political", + "end", + "among", + "ever", + "stand", + "bad", + "lose", + "however", + "member", + "pay", + "law", + "meet", + "car", + "city", + "almost", + "include", + "continue", + "set", + "later", + "community", + "much", + "name", + "five", + "once", + "white", + "least", + "president", + "learn", + "real", + "change", + "team", + "minute", + "best", + "several", + "idea", + "kid", + "body", + "information", + "nothing", + "ago", + "right", + "lead", + "social", + "understand", + "whether", + "back", + "watch", + "together", + "follow", + "around", + "parent", + "only", + "stop", + "face", + "anything", + "create", + "public", + "already", + "speak", + "others", + "read", + "level", + "allow", + "add", + "office", + "spend", + "door", + "health", + "person", + "art", + "sure", + "such", + "war", + "history", + "party", + "within", + "grow", + "result", + "open", + "change", + "morning", + "walk", + "reason", + "low", + "win", + "research", + "girl", + "guy", + "early", + "food", + "before", + "moment", + "himself", + "air", + "teacher", + "force", + "offer", + "enough", + "both", + "education", + "across", + "although", + "remember", + "foot", + "second", + "boy", + "maybe", + "toward", + "able", + "age", + "off", + "policy", + "everything", + "love", + "process", + "music", + "including", + "consider", + "appear", + "actually", + "buy", + "probably", + "human", + "wait", + "serve", + "market", + "die", + "send", + "expect", + "home", + "sense", + "build", + "stay", + "fall", + "oh", + "nation", + "plan", + "cut", + "college", + "interest", + "death", + "course", + "someone", + "experience", + "behind", + "reach", + "local", + "kill", + "six", + "remain", + "effect", + "use", + "yeah", + "suggest", + "class", + "control", + "raise", + "care", + "perhaps", + "little", + "late", + "hard", + "field", + "else", + "pass", + "former", + "sell", + "major", + "sometimes", + "require", + "along", + "development", + "themselves", + "report", + "role", + "better", + "economic", + "effort", + "up", + "decide", + "rate", + "strong", + "possible", + "heart", + "drug", + "show", + "leader", + "light", + "voice", + "wife", + "whole", + "police", + "mind", + "finally", + "pull", + "return", + "free", + "military", + "price", + "report", + "less", + "according", + "decision", + "explain", + "son", + "hope", + "even", + "develop", + "view", + "relationship", + "carry", + "town", + "road", + "drive", + "arm", + "true", + "federal", + "break", + "better", + "difference", + "thank", + "receive", + "value", + "international", + "building", + "action", + "full", + "model", + "join", + "season", + "society", + "because", + "tax", + "director", + "early", + "position", + "player", + "agree", + "especially", + "record", + "pick", + "wear", + "paper", + "special", + "space", + "ground", + "form", + "support", + "event", + "official", + "whose", + "matter", + "everyone", + "center", + "couple", + "site", + "end", + "project", + "hit", + "base", + "activity", + "star", + "table", + "need", + "court", + "produce", + "eat", + "American", + "teach", + "oil", + "half", + "situation", + "easy", + "cost", + "industry", + "figure", + "face", + "street", + "image", + "itself", + "phone", + "either", + "data", + "cover", + "quite", + "picture", + "clear", + "practice", + "piece", + "land", + "recent", + "describe", + "product", + "doctor", + "wall", + "patient", + "worker", + "news", + "test", + "movie", + "certain", + "north", + "love", + "personal", + "open", + "support", + "simply", + "third", + "technology", + "catch", + "step", + "baby", + "computer", + "type", + "attention", + "draw", + "film", + "Republican", + "tree", + "source", + "red", + "nearly", + "organization", + "choose", + "cause", + "hair", + "look", + "point", + "century", + "evidence", + "window", + "difficult", + "listen", + "soon", + "culture", + "billion", + "chance", + "brother", + "energy", + "period", + "course", + "summer", + "less", + "realize", + "hundred", + "available", + "plant", + "likely", + "opportunity", + "term", + "short", + "letter", + "condition", + "choice", + "place", + "single", + "rule", + "daughter", + "administration", + "south", + "husband", + "Congress", + "floor", + "campaign", + "material", + "population", + "well", + "call", + "economy", + "medical", + "hospital", + "church", + "close", + "thousand", + "risk", + "current", + "fire", + "future", + "wrong", + "involve", + "defense", + "anyone", + "increase", + "security", + "bank", + "myself", + "certainly", + "west", + "sport", + "board", + "seek", + "per", + "subject", + "officer", + "private", + "rest", + "behavior", + "deal", + "performance", + "fight", + "throw", + "top", + "quickly", + "past", + "goal", + "second", + "bed", + "order", + "author", + "fill", + "represent", + "focus", + "foreign", + "drop", + "plan", + "blood", + "upon", + "agency", + "push", + "nature", + "color", + "no", + "recently", + "store", + "reduce", + "sound", + "note", + "fine", + "before", + "near", + "movement", + "page", + "enter", + "share", + "than", + "common", + "poor", + "other", + "natural", + "race", + "concern", + "series", + "significant", + "similar", + "hot", + "language", + "each", + "usually", + "response", + "dead", + "rise", + "animal", + "factor", + "decade", + "article", + "shoot", + "east", + "save", + "seven", + "artist", + "away", + "scene", + "stock", + "career", + "despite", + "central", + "eight", + "thus", + "treatment", + "beyond", + "happy", + "exactly", + "protect", + "approach", + "lie", + "size", + "dog", + "fund", + "serious", + "occur", + "media", + "ready", + "sign", + "thought", + "list", + "individual", + "simple", + "quality", + "pressure", + "accept", + "answer", + "hard", + "resource", + "identify", + "left", + "meeting", + "determine", + "prepare", + "disease", + "whatever", + "success", + "argue", + "cup", + "particularly", + "amount", + "ability", + "staff", + "recognize", + "indicate", + "character", + "growth", + "loss", + "degree", + "wonder", + "attack", + "herself", + "region", + "television", + "box", + "TV", + "training", + "pretty", + "trade", + "deal", + "election", + "everybody", + "physical", + "lay", + "general", + "feeling", + "standard", + "bill", + "message", + "fail", + "outside", + "arrive", + "analysis", + "benefit", + "name", + "sex", + "forward", + "lawyer", + "present", + "section", + "environmental", + "glass", + "answer", + "skill", + "sister", + "PM", + "professor", + "operation", + "financial", + "crime", + "stage", + "ok", + "compare", + "authority", + "miss", + "design", + "sort", + "one", + "act", + "ten", + "knowledge", + "gun", + "station", + "blue", + "state", + "strategy", + "little", + "clearly", + "discuss", + "indeed", + "force", + "truth", + "song", + "example", + "democratic", + "check", + "environment", + "leg", + "dark", + "public", + "various", + "rather", + "laugh", + "guess", + "executive", + "set", + "study", + "prove", + "hang", + "entire", + "rock", + "design", + "enough", + "forget", + "since", + "claim", + "note", + "remove", + "manager", + "help", + "close", + "sound", + "enjoy", + "network", + "legal", + "religious", + "cold", + "form", + "final", + "main", + "science", + "green", + "memory", + "card", + "above", + "seat", + "cell", + "establish", + "nice", + "trial", + "expert", + "that", + "spring", + "firm", + "Democrat", + "radio", + "visit", + "management", + "care", + "avoid", + "imagine", + "tonight", + "huge", + "ball", + "no", + "close", + "finish", + "yourself", + "talk", + "theory", + "impact", + "respond", + "statement", + "maintain", + "charge", + "popular", + "traditional", + "onto", + "reveal", + "direction", + "weapon", + "employee", + "cultural", + "contain", + "peace", + "head", + "control", + "base", + "pain", + "apply", + "play", + "measure", + "wide", + "shake", + "fly", + "interview", + "manage", + "chair", + "fish", + "particular", + "camera", + "structure", + "politics", + "perform", + "bit", + "weight", + "suddenly", + "discover", + "candidate", + "top", + "production", + "treat", + "trip", + "evening", + "affect", + "inside", + "conference", + "unit", + "best", + "style", + "adult", + "worry", + "range", + "mention", + "rather", + "far", + "deep", + "past", + "edge", + "individual", + "specific", + "writer", + "trouble", + "necessary", + "throughout", + "challenge", + "fear", + "shoulder", + "institution", + "middle", + "sea", + "dream", + "bar", + "beautiful", + "property", + "instead", + "improve", + "stuff", + "detail", + "method", + "sign", + "somebody", + "magazine", + "hotel", + "soldier", + "reflect", + "heavy", + "sexual", + "cause", + "bag", + "heat", + "fall", + "marriage", + "tough", + "sing", + "surface", + "purpose", + "exist", + "pattern", + "whom", + "skin", + "agent", + "owner", + "machine", + "gas", + "down", + "ahead", + "generation", + "commercial", + "address", + "cancer", + "test", + "item", + "reality", + "coach", + "step", + "Mrs", + "yard", + "beat", + "violence", + "total", + "tend", + "investment", + "discussion", + "finger", + "garden", + "notice", + "collection", + "modern", + "task", + "partner", + "positive", + "civil", + "kitchen", + "consumer", + "shot", + "budget", + "wish", + "painting", + "scientist", + "safe", + "agreement", + "capital", + "mouth", + "nor", + "victim", + "newspaper", + "instead", + "threat", + "responsibility", + "smile", + "attorney", + "score", + "account", + "interesting", + "break", + "audience", + "rich", + "dinner", + "figure", + "vote", + "western", + "relate", + "travel", + "debate", + "prevent", + "citizen", + "majority", + "none", + "front", + "born", + "admit", + "senior", + "assume", + "wind", + "key", + "professional", + "mission", + "fast", + "alone", + "customer", + "suffer", + "speech", + "successful", + "option", + "participant", + "southern", + "fresh", + "eventually", + "no", + "forest", + "video", + "global", + "Senate", + "reform", + "access", + "restaurant", + "judge", + "publish", + "cost", + "relation", + "like", + "release", + "own", + "bird", + "opinion", + "credit", + "critical", + "corner", + "concerned", + "recall", + "version", + "stare", + "safety", + "effective", + "neighborhood", + "original", + "act", + "troop", + "income", + "directly", + "hurt", + "species", + "immediately", + "track", + "basic", + "strike", + "hope", + "sky", + "freedom", + "absolutely", + "plane", + "nobody", + "achieve", + "object", + "attitude", + "labor", + "refer", + "concept", + "client", + "powerful", + "perfect", + "nine", + "therefore", + "conduct", + "announce", + "conversation", + "examine", + "touch", + "please", + "attend", + "completely", + "vote", + "variety", + "sleep", + "turn", + "involved", + "investigation", + "nuclear", + "researcher", + "press", + "conflict", + "spirit", + "experience", + "replace", + "British", + "encourage", + "lot", + "lot", + "lot", + "lot", + "argument", + "by", + "once", + "camp", + "brain", + "feature", + "afternoon", + "AM", + "weekend", + "dozen", + "possibility", + "along", + "insurance", + "department", + "battle", + "beginning", + "date", + "generally", + "African", + "very", + "sorry", + "crisis", + "complete", + "fan", + "stick", + "define", + "easily", + "through", + "hole", + "element", + "vision", + "status", + "normal", + "Chinese", + "ship", + "solution", + "stone", + "slowly", + "scale", + "bit", + "university", + "introduce", + "driver", + "attempt", + "park", + "spot", + "lack", + "ice", + "boat", + "drink", + "sun", + "front", + "distance", + "wood", + "handle", + "truck", + "return", + "mountain", + "survey", + "supposed", + "tradition", + "winter", + "village", + "Soviet", + "refuse", + "sales", + "roll", + "communication", + "run", + "screen", + "gain", + "resident", + "hide", + "gold", + "club", + "future", + "farm", + "potential", + "increase", + "middle", + "European", + "presence", + "independent", + "district", + "shape", + "reader", + "Ms", + "contract", + "crowd", + "Christian", + "express", + "apartment", + "willing", + "strength", + "previous", + "band", + "obviously", + "horse", + "interested", + "target", + "prison", + "ride", + "guard", + "terms", + "demand", + "reporter", + "deliver", + "text", + "share", + "tool", + "wild", + "vehicle", + "observe", + "flight", + "inside", + "facility", + "understanding", + "average", + "emerge", + "advantage", + "quick", + "light", + "leadership", + "earn", + "pound", + "basis", + "bright", + "operate", + "guest", + "sample", + "contribute", + "tiny", + "block", + "protection", + "settle", + "feed", + "collect", + "additional", + "while", + "highly", + "identity", + "title", + "mostly", + "lesson", + "faith", + "river", + "promote", + "living", + "present", + "count", + "unless", + "marry", + "tomorrow", + "technique", + "path", + "ear", + "shop", + "folk", + "order", + "principle", + "survive", + "lift", + "border", + "competition", + "jump", + "gather", + "limit", + "fit", + "claim", + "cry", + "equipment", + "worth", + "associate", + "critic", + "warm", + "aspect", + "result", + "insist", + "failure", + "annual", + "French", + "Christmas", + "comment", + "responsible", + "affair", + "approach", + "until", + "procedure", + "regular", + "spread", + "chairman", + "baseball", + "soft", + "ignore", + "egg", + "measure", + "belief", + "demonstrate", + "anybody", + "murder", + "gift", + "religion", + "review", + "editor", + "past", + "engage", + "coffee", + "document", + "speed", + "cross", + "influence", + "anyway", + "threaten", + "commit", + "female", + "youth", + "wave", + "move", + "afraid", + "quarter", + "background", + "native", + "broad", + "wonderful", + "deny", + "apparently", + "slightly", + "reaction", + "twice", + "suit", + "perspective", + "growing", + "blow", + "construction", + "kind", + "intelligence", + "destroy", + "cook", + "connection", + "charge", + "burn", + "shoe", + "view", + "grade", + "context", + "committee", + "hey", + "mistake", + "focus", + "smile", + "location", + "clothes", + "Indian", + "quiet", + "dress", + "promise", + "aware", + "neighbor", + "complete", + "drive", + "function", + "bone", + "active", + "extend", + "chief", + "average", + "combine", + "wine", + "below", + "cool", + "voter", + "mean", + "demand", + "learning", + "bus", + "hell", + "dangerous", + "remind", + "moral", + "United", + "category", + "relatively", + "victory", + "key", + "academic", + "visit", + "Internet", + "healthy", + "fire", + "negative", + "following", + "historical", + "medicine", + "tour", + "depend", + "photo", + "finding", + "grab", + "direct", + "classroom", + "contact", + "justice", + "participate", + "daily", + "fair", + "pair", + "famous", + "exercise", + "knee", + "flower", + "tape", + "hire", + "familiar", + "appropriate", + "supply", + "fully", + "cut", + "will", + "actor", + "birth", + "search", + "tie", + "democracy", + "eastern", + "primary", + "yesterday", + "circle", + "device", + "progress", + "next", + "front", + "bottom", + "island", + "exchange", + "clean", + "studio", + "train", + "lady", + "colleague", + "application", + "neck", + "lean", + "damage", + "plastic", + "tall", + "plate", + "hate", + "otherwise", + "writing", + "press", + "male", + "start", + "alive", + "expression", + "football", + "intend", + "attack", + "chicken", + "army", + "abuse", + "theater", + "shut", + "map", + "extra", + "session", + "danger", + "welcome", + "domestic", + "lots", + "literature", + "rain", + "desire", + "assessment", + "injury", + "respect", + "northern", + "nod", + "paint", + "fuel", + "leaf", + "direct", + "dry", + "Russian", + "instruction", + "fight", + "pool", + "climb", + "sweet", + "lead", + "engine", + "fourth", + "salt", + "expand", + "importance", + "metal", + "fat", + "ticket", + "software", + "disappear", + "corporate", + "strange", + "lip", + "reading", + "urban", + "mental", + "increasingly", + "lunch", + "educational", + "somewhere", + "farmer", + "above", + "sugar", + "planet", + "favorite", + "explore", + "obtain", + "enemy", + "greatest", + "complex", + "surround", + "athlete", + "invite", + "repeat", + "carefully", + "soul", + "scientific", + "impossible", + "panel", + "meaning", + "mom", + "married", + "alone", + "instrument", + "predict", + "weather", + "presidential", + "emotional", + "commitment", + "Supreme", + "bear", + "pocket", + "thin", + "temperature", + "surprise", + "poll", + "proposal", + "consequence", + "half", + "breath", + "sight", + "cover", + "balance", + "adopt", + "minority", + "straight", + "attempt", + "connect", + "works", + "teaching", + "belong", + "aid", + "advice", + "okay", + "photograph", + "empty", + "regional", + "trail", + "novel", + "code", + "somehow", + "organize", + "jury", + "breast", + "Iraqi", + "human", + "acknowledge", + "theme", + "storm", + "union", + "record", + "desk", + "fear", + "thanks", + "fruit", + "under", + "expensive", + "yellow", + "conclusion", + "prime", + "shadow", + "struggle", + "conclude", + "analyst", + "dance", + "limit", + "like", + "regulation", + "being", + "last", + "ring", + "largely", + "shift", + "revenue", + "mark", + "locate", + "county", + "appearance", + "package", + "difficulty", + "bridge", + "recommend", + "obvious", + "train", + "basically", + "e-mail", + "generate", + "anymore", + "propose", + "thinking", + "possibly", + "trend", + "visitor", + "loan", + "currently", + "comfortable", + "investor", + "but", + "profit", + "angry", + "crew", + "deep", + "accident", + "male", + "meal", + "hearing", + "traffic", + "muscle", + "notion", + "capture", + "prefer", + "truly", + "earth", + "Japanese", + "chest", + "search", + "thick", + "cash", + "museum", + "beauty", + "emergency", + "unique", + "feature", + "internal", + "ethnic", + "link", + "stress", + "content", + "select", + "root", + "nose", + "declare", + "outside", + "appreciate", + "actual", + "bottle", + "hardly", + "setting", + "launch", + "dress", + "file", + "sick", + "outcome", + "ad", + "defend", + "matter", + "judge", + "duty", + "sheet", + "ought", + "ensure", + "Catholic", + "extremely", + "extent", + "component", + "mix", + "long-term", + "slow", + "contrast", + "zone", + "wake", + "challenge", + "airport", + "chief", + "brown", + "standard", + "shirt", + "pilot", + "warn", + "ultimately", + "cat", + "contribution", + "capacity", + "ourselves", + "estate", + "guide", + "circumstance", + "snow", + "English", + "politician", + "steal", + "pursue", + "slip", + "percentage", + "meat", + "funny", + "neither", + "soil", + "influence", + "surgery", + "correct", + "Jewish", + "blame", + "estimate", + "due", + "basketball", + "late", + "golf", + "investigate", + "crazy", + "significantly", + "chain", + "address", + "branch", + "combination", + "just", + "frequently", + "governor", + "relief", + "user", + "dad", + "kick", + "part", + "manner", + "ancient", + "silence", + "rating", + "golden", + "motion", + "German", + "gender", + "solve", + "fee", + "landscape", + "used", + "bowl", + "equal", + "long", + "official", + "forth", + "frame", + "typical", + "except", + "conservative", + "eliminate", + "host", + "hall", + "trust", + "ocean", + "score", + "row", + "producer", + "afford", + "meanwhile", + "regime", + "division", + "confirm", + "fix", + "appeal", + "mirror", + "tooth", + "smart", + "length", + "entirely", + "rely", + "topic", + "complain", + "issue", + "variable", + "back", + "range", + "telephone", + "perception", + "attract", + "confidence", + "bedroom", + "secret", + "debt", + "rare", + "his", + "tank", + "nurse", + "coverage", + "opposition", + "aside", + "anywhere", + "bond", + "file", + "pleasure", + "master", + "era", + "requirement", + "check", + "stand", + "fun", + "expectation", + "wing", + "separate", + "now", + "clear", + "struggle", + "mean", + "somewhat", + "pour", + "stir", + "judgment", + "clean", + "except", + "beer", + "English", + "reference", + "tear", + "doubt", + "grant", + "seriously", + "account", + "minister", + "totally", + "hero", + "industrial", + "cloud", + "stretch", + "winner", + "volume", + "travel", + "seed", + "surprised", + "rest", + "fashion", + "pepper", + "separate", + "busy", + "intervention", + "copy", + "tip", + "below", + "cheap", + "aim", + "cite", + "welfare", + "vegetable", + "gray", + "dish", + "beach", + "improvement", + "everywhere", + "opening", + "overall", + "divide", + "initial", + "terrible", + "oppose", + "contemporary", + "route", + "multiple", + "essential", + "question", + "league", + "criminal", + "careful", + "core", + "upper", + "rush", + "necessarily", + "specifically", + "tired", + "rise", + "tie", + "employ", + "holiday", + "dance", + "vast", + "resolution", + "household", + "fewer", + "abortion", + "apart", + "witness", + "match", + "barely", + "sector", + "representative", + "lack", + "beneath", + "beside", + "black", + "incident", + "limited", + "proud", + "flow", + "faculty", + "increased", + "waste", + "merely", + "mass", + "emphasize", + "experiment", + "definitely", + "bomb", + "enormous", + "tone", + "liberal", + "massive", + "engineer", + "wheel", + "female", + "decline", + "invest", + "promise", + "cable", + "towards", + "expose", + "rural", + "AIDS", + "Jew", + "narrow", + "cream", + "secretary", + "gate", + "solid", + "hill", + "typically", + "noise", + "grass", + "unfortunately", + "hat", + "legislation", + "succeed", + "either", + "celebrate", + "achievement", + "fishing", + "drink", + "accuse", + "hand", + "useful", + "land", + "secret", + "reject", + "talent", + "taste", + "characteristic", + "milk", + "escape", + "cast", + "sentence", + "unusual", + "closely", + "convince", + "height", + "physician", + "assess", + "sleep", + "plenty", + "ride", + "virtually", + "first", + "addition", + "sharp", + "creative", + "lower", + "behind", + "approve", + "explanation", + "outside", + "gay", + "campus", + "proper", + "live", + "guilty", + "living", + "acquire", + "compete", + "technical", + "plus", + "mind", + "potential", + "immigrant", + "weak", + "illegal", + "hi", + "alternative", + "interaction", + "column", + "personality", + "signal", + "curriculum", + "list", + "honor", + "passenger", + "assistance", + "forever", + "fun", + "regard", + "Israeli", + "association", + "twenty", + "knock", + "review", + "wrap", + "lab", + "offer", + "display", + "criticism", + "asset", + "depression", + "spiritual", + "musical", + "journalist", + "prayer", + "suspect", + "scholar", + "warning", + "climate", + "cheese", + "observation", + "childhood", + "payment", + "sir", + "permit", + "cigarette", + "definition", + "priority", + "bread", + "creation", + "graduate", + "request", + "emotion", + "scream", + "dramatic", + "universe", + "gap", + "excellent", + "deeply", + "prosecutor", + "mark", + "green", + "lucky", + "drag", + "airline", + "library", + "agenda", + "recover", + "factory", + "selection", + "primarily", + "roof", + "unable", + "expense", + "initiative", + "diet", + "arrest", + "funding", + "therapy", + "wash", + "schedule", + "sad", + "brief", + "housing", + "post", + "purchase", + "existing", + "dark", + "steel", + "regarding", + "shout", + "remaining", + "visual", + "fairly", + "chip", + "violent", + "silent", + "suppose", + "self", + "bike", + "tea", + "perceive", + "comparison", + "settlement", + "layer", + "planning", + "far", + "description", + "later", + "slow", + "slide", + "widely", + "wedding", + "inform", + "portion", + "territory", + "immediate", + "opponent", + "abandon", + "link", + "mass", + "lake", + "transform", + "tension", + "display", + "leading", + "bother", + "consist", + "alcohol", + "enable", + "bend", + "saving", + "gain", + "desert", + "shall", + "error", + "release", + "cop", + "Arab", + "double", + "walk", + "sand", + "Spanish", + "rule", + "hit", + "print", + "preserve", + "passage", + "formal", + "transition", + "existence", + "album", + "participation", + "arrange", + "atmosphere", + "joint", + "reply", + "cycle", + "opposite", + "lock", + "whole", + "deserve", + "consistent", + "resistance", + "discovery", + "tear", + "exposure", + "pose", + "stream", + "sale", + "trust", + "benefit", + "pot", + "grand", + "mine", + "hello", + "coalition", + "tale", + "knife", + "resolve", + "racial", + "phase", + "present", + "joke", + "coat", + "Mexican", + "symptom", + "contact", + "manufacturer", + "philosophy", + "potato", + "interview", + "foundation", + "quote", + "online", + "pass", + "negotiation", + "good", + "urge", + "occasion", + "dust", + "breathe", + "elect", + "investigator", + "jacket", + "glad", + "ordinary", + "reduction", + "rarely", + "shift", + "pack", + "suicide", + "numerous", + "touch", + "substance", + "discipline", + "elsewhere", + "iron", + "practical", + "moreover", + "passion", + "volunteer", + "implement", + "essentially", + "gene", + "enforcement", + "vs", + "sauce", + "independence", + "marketing", + "priest", + "amazing", + "intense", + "advance", + "employer", + "shock", + "inspire", + "adjust", + "retire", + "sure", + "visible", + "kiss", + "illness", + "cap", + "habit", + "competitive", + "juice", + "congressional", + "involvement", + "dominate", + "previously", + "whenever", + "transfer", + "analyze", + "another", + "attach", + "for", + "Indian", + "disaster", + "parking", + "prospect", + "boss", + "complaint", + "championship", + "coach", + "exercise", + "fundamental", + "severe", + "enhance", + "mystery", + "impose", + "poverty", + "other", + "entry", + "fat", + "spending", + "king", + "evaluate", + "symbol", + "still", + "trade", + "maker", + "mood", + "accomplish", + "emphasis", + "illustrate", + "boot", + "monitor", + "Asian", + "entertainment", + "bean", + "evaluation", + "creature", + "commander", + "digital", + "arrangement", + "concentrate", + "total", + "usual", + "anger", + "psychological", + "heavily", + "peak", + "approximately", + "increasing", + "disorder", + "missile", + "equally", + "vary", + "wire", + "round", + "distribution", + "transportation", + "holy", + "ring", + "twin", + "command", + "commission", + "interpretation", + "breakfast", + "stop", + "strongly", + "engineering", + "luck", + "so-called", + "constant", + "race", + "clinic", + "veteran", + "smell", + "tablespoon", + "capable", + "nervous", + "tourist", + "light", + "toss", + "crucial", + "bury", + "pray", + "tomato", + "exception", + "butter", + "deficit", + "bathroom", + "objective", + "block", + "electronic", + "ally", + "journey", + "reputation", + "mixture", + "surely", + "tower", + "smoke", + "confront", + "pure", + "glance", + "dimension", + "toy", + "prisoner", + "fellow", + "smooth", + "nearby", + "peer", + "designer", + "personnel", + "shape", + "educator", + "relative", + "immigration", + "belt", + "teaspoon", + "birthday", + "implication", + "perfectly", + "coast", + "supporter", + "accompany", + "silver", + "teenager", + "recognition", + "retirement", + "flag", + "recovery", + "whisper", + "watch", + "gentleman", + "corn", + "moon", + "inner", + "junior", + "rather", + "throat", + "salary", + "swing", + "observer", + "due", + "straight", + "publication", + "pretty", + "crop", + "dig", + "strike", + "permanent", + "plant", + "phenomenon", + "anxiety", + "unlike", + "wet", + "literally", + "resist", + "convention", + "embrace", + "supply", + "assist", + "exhibition", + "construct", + "viewer", + "pan", + "consultant", + "soon", + "line", + "administrator", + "date", + "occasionally", + "mayor", + "consideration", + "CEO", + "secure", + "pink", + "smoke", + "estimate", + "buck", + "historic", + "poem", + "grandmother", + "bind", + "fifth", + "constantly", + "enterprise", + "favor", + "testing", + "stomach", + "apparent", + "weigh", + "install", + "sensitive", + "suggestion", + "mail", + "recipe", + "reasonable", + "preparation", + "wooden", + "elementary", + "concert", + "aggressive", + "false", + "intention", + "channel", + "extreme", + "tube", + "drawing", + "protein", + "quit", + "absence", + "roll", + "Latin", + "rapidly", + "jail", + "comment", + "diversity", + "honest", + "Palestinian", + "pace", + "employment", + "speaker", + "impression", + "essay", + "respondent", + "giant", + "cake", + "historian", + "negotiate", + "restore", + "substantial", + "pop", + "particular", + "specialist", + "origin", + "approval", + "mine", + "quietly", + "advise", + "conventional", + "drop", + "count", + "depth", + "wealth", + "disability", + "shell", + "general", + "criticize", + "fast", + "professional", + "effectively", + "biological", + "pack", + "onion", + "deputy", + "flat", + "brand", + "assure", + "mad", + "award", + "criteria", + "dealer", + "via", + "alternative", + "utility", + "precisely", + "arise", + "armed", + "nevertheless", + "highway", + "clinical", + "routine", + "schedule", + "wage", + "normally", + "phrase", + "ingredient", + "stake", + "Muslim", + "dream", + "fiber", + "activist", + "Islamic", + "snap", + "terrorism", + "refugee", + "incorporate", + "hip", + "ultimate", + "switch", + "corporation", + "valuable", + "assumption", + "gear", + "graduate", + "barrier", + "minor", + "provision", + "killer", + "assign", + "gang", + "developing", + "classic", + "chemical", + "wave", + "label", + "teen", + "index", + "vacation", + "advocate", + "draft", + "extraordinary", + "heaven", + "rough", + "yell", + "pregnant", + "distant", + "drama", + "satellite", + "personally", + "wonder", + "clock", + "chocolate", + "Italian", + "Canadian", + "ceiling", + "sweep", + "advertising", + "universal", + "spin", + "house", + "button", + "bell", + "rank", + "darkness", + "ahead", + "clothing", + "super", + "yield", + "fence", + "portrait", + "paint", + "survival", + "roughly", + "lawsuit", + "bottom", + "testimony", + "bunch", + "beat", + "wind", + "found", + "burden", + "react", + "chamber", + "furniture", + "cooperation", + "string", + "ceremony", + "communicate", + "taste", + "cheek", + "lost", + "profile", + "mechanism", + "disagree", + "like", + "penalty", + "match", + "ie", + "advance", + "resort", + "destruction", + "bear", + "unlikely", + "tissue", + "constitutional", + "pant", + "stranger", + "infection", + "cabinet", + "broken", + "apple", + "electric", + "proceed", + "track", + "bet", + "literary", + "virus", + "stupid", + "dispute", + "fortune", + "strategic", + "assistant", + "overcome", + "remarkable", + "occupy", + "statistics", + "shopping", + "cousin", + "encounter", + "wipe", + "initially", + "blind", + "white", + "port", + "honor", + "electricity", + "genetic", + "adviser", + "pay", + "spokesman", + "retain", + "latter", + "incentive", + "slave", + "chemical", + "translate", + "accurate", + "whereas", + "terror", + "though", + "expansion", + "elite", + "Olympic", + "dirt", + "odd", + "rice", + "bullet", + "tight", + "Bible", + "chart", + "solar", + "decline", + "conservative", + "process", + "square", + "stick", + "concentration", + "complicated", + "gently", + "champion", + "scenario", + "telescope", + "reflection", + "revolution", + "strip", + "interpret", + "friendly", + "tournament", + "fiction", + "detect", + "balance", + "likely", + "tremendous", + "lifetime", + "recommendation", + "flow", + "senator", + "market", + "hunting", + "salad", + "guarantee", + "innocent", + "boundary", + "pause", + "remote", + "satisfaction", + "journal", + "bench", + "lover", + "raw", + "awareness", + "surprising", + "withdraw", + "general", + "deck", + "similarly", + "newly", + "pole", + "testify", + "mode", + "dialogue", + "imply", + "naturally", + "mutual", + "founder", + "top", + "advanced", + "pride", + "dismiss", + "aircraft", + "delivery", + "mainly", + "bake", + "freeze", + "platform", + "finance", + "sink", + "attractive", + "respect", + "diverse", + "relevant", + "ideal", + "joy", + "worth", + "regularly", + "working", + "singer", + "evolve", + "shooting", + "partly", + "unknown", + "assistant", + "offense", + "counter", + "DNA", + "smell", + "potentially", + "transfer", + "thirty", + "justify", + "protest", + "crash", + "craft", + "treaty", + "terrorist", + "insight", + "possess", + "politically", + "tap", + "lie", + "extensive", + "episode", + "double", + "swim", + "tire", + "fault", + "loose", + "free", + "shortly", + "originally", + "considerable", + "prior", + "intellectual", + "mix", + "assault", + "relax", + "stair", + "adventure", + "external", + "proof", + "confident", + "headquarters", + "sudden", + "dirty", + "violation", + "tongue", + "license", + "hold", + "shelter", + "rub", + "controversy", + "entrance", + "favorite", + "practice", + "properly", + "fade", + "defensive", + "tragedy", + "net", + "characterize", + "funeral", + "profession", + "alter", + "spot", + "constitute", + "establishment", + "squeeze", + "imagination", + "target", + "mask", + "convert", + "comprehensive", + "prominent", + "presentation", + "regardless", + "easy", + "load", + "stable", + "introduction", + "appeal", + "pretend", + "not", + "elderly", + "representation", + "deer", + "split", + "violate", + "partnership", + "pollution", + "emission", + "steady", + "vital", + "neither", + "fate", + "earnings", + "oven", + "distinction", + "segment", + "nowhere", + "poet", + "mere", + "exciting", + "variation", + "comfort", + "radical", + "stress", + "adapt", + "Irish", + "honey", + "correspondent", + "pale", + "musician", + "significance", + "load", + "round", + "vessel", + "storage", + "flee", + "mm-hmm", + "leather", + "distribute", + "evolution", + "ill", + "tribe", + "shelf", + "can", + "grandfather", + "lawn", + "buyer", + "dining", + "wisdom", + "council", + "vulnerable", + "instance", + "garlic", + "capability", + "poetry", + "celebrity", + "gradually", + "stability", + "doubt", + "fantasy", + "scared", + "guide", + "plot", + "framework", + "gesture", + "depending", + "ongoing", + "psychology", + "since", + "counselor", + "witness", + "chapter", + "fellow", + "divorce", + "owe", + "pipe", + "athletic", + "slight", + "math", + "shade", + "tail", + "sustain", + "mount", + "obligation", + "angle", + "palm", + "differ", + "custom", + "store", + "economist", + "fifteen", + "soup", + "celebration", + "efficient", + "damage", + "composition", + "satisfy", + "pile", + "briefly", + "carbon", + "closer", + "consume", + "scheme", + "crack", + "frequency", + "tobacco", + "survivor", + "besides", + "in", + "psychologist", + "wealthy", + "galaxy", + "given", + "fund", + "ski", + "limitation", + "OK", + "trace", + "appointment", + "preference", + "meter", + "explosion", + "arrest", + "publicly", + "incredible", + "fighter", + "rapid", + "admission", + "hunter", + "educate", + "painful", + "friendship", + "aide", + "infant", + "calculate", + "fifty", + "rid", + "porch", + "tendency", + "uniform", + "formation", + "scholarship", + "reservation", + "efficiency", + "waste", + "qualify", + "mall", + "derive", + "scandal", + "PC", + "helpful", + "impress", + "heel", + "resemble", + "privacy", + "fabric", + "surprise", + "contest", + "proportion", + "guideline", + "rifle", + "maintenance", + "conviction", + "trick", + "organic", + "tent", + "examination", + "publisher", + "strengthen", + "French", + "proposed", + "myth", + "sophisticated", + "cow", + "etc", + "standing", + "asleep", + "tennis", + "nerve", + "barrel", + "bombing", + "membership", + "ratio", + "menu", + "purchase", + "controversial", + "desperate", + "rate", + "lifestyle", + "humor", + "loud", + "glove", + "suspect", + "sufficient", + "narrative", + "photographer", + "helicopter", + "Catholic", + "modest", + "provider", + "delay", + "agricultural", + "explode", + "stroke", + "scope", + "punishment", + "handful", + "badly", + "horizon", + "curious", + "downtown", + "girlfriend", + "prompt", + "request", + "cholesterol", + "absorb", + "adjustment", + "taxpayer", + "eager", + "principal", + "detailed", + "motivation", + "assignment", + "restriction", + "across", + "Palestinian", + "laboratory", + "workshop", + "differently", + "auto", + "romantic", + "cotton", + "motor", + "sue", + "flavor", + "overlook", + "float", + "undergo", + "sequence", + "demonstration", + "jet", + "orange", + "consumption", + "assert", + "blade", + "temporary", + "medication", + "print", + "cabin", + "bite", + "relative", + "edition", + "valley", + "yours", + "pitch", + "pine", + "brilliant", + "versus", + "manufacturing", + "risk", + "Christian", + "complex", + "absolute", + "chef", + "discrimination", + "offensive", + "German", + "suit", + "boom", + "register", + "appoint", + "heritage", + "God", + "terrorist", + "dominant", + "successfully", + "shit", + "lemon", + "hungry", + "sense", + "dry", + "wander", + "submit", + "economics", + "naked", + "anticipate", + "nut", + "legacy", + "extension", + "shrug", + "fly", + "battery", + "arrival", + "legitimate", + "orientation", + "inflation", + "cope", + "flame", + "cluster", + "host", + "wound", + "dependent", + "shower", + "institutional", + "depict", + "operating", + "flesh", + "garage", + "operator", + "instructor", + "collapse", + "borrow", + "furthermore", + "comedy", + "mortgage", + "sanction", + "civilian", + "twelve", + "weekly", + "habitat", + "grain", + "brush", + "consciousness", + "devote", + "crack", + "measurement", + "province", + "ease", + "seize", + "ethics", + "nomination", + "permission", + "wise", + "actress", + "summit", + "acid", + "odds", + "gifted", + "frustration", + "medium", + "function", + "physically", + "grant", + "distinguish", + "shore", + "repeatedly", + "lung", + "firm", + "running", + "correct", + "distinct", + "artistic", + "discourse", + "basket", + "ah", + "fighting", + "impressive", + "competitor", + "ugly", + "worried", + "portray", + "powder", + "ghost", + "persuade", + "moderate", + "subsequent", + "continued", + "cookie", + "carrier", + "cooking", + "frequent", + "ban", + "swing", + "orange", + "awful", + "admire", + "pet", + "miracle", + "exceed", + "rhythm", + "widespread", + "killing", + "lovely", + "sin", + "charity", + "script", + "tactic", + "identification", + "transformation", + "everyday", + "headline", + "crash", + "venture", + "invasion", + "military", + "nonetheless", + "adequate", + "piano", + "grocery", + "intensity", + "exhibit", + "high", + "blanket", + "margin", + "principal", + "quarterback", + "mouse", + "rope", + "concrete", + "prescription", + "African-American", + "chase", + "document", + "brick", + "recruit", + "patch", + "consensus", + "horror", + "recording", + "changing", + "painter", + "colonial", + "pie", + "sake", + "gaze", + "courage", + "pregnancy", + "swear", + "defeat", + "clue", + "reinforce", + "win", + "confusion", + "slice", + "occupation", + "dear", + "coal", + "sacred", + "criminal", + "formula", + "cognitive", + "collective", + "exact", + "uncle", + "square", + "captain", + "sigh", + "attribute", + "dare", + "okay", + "homeless", + "cool", + "gallery", + "soccer", + "defendant", + "tunnel", + "fitness", + "lap", + "grave", + "toe", + "container", + "virtue", + "abroad", + "architect", + "dramatically", + "makeup", + "inquiry", + "rose", + "surprisingly", + "highlight", + "decrease", + "indication", + "rail", + "anniversary", + "couch", + "alliance", + "hypothesis", + "boyfriend", + "compose", + "peer", + "mess", + "rank", + "legend", + "regulate", + "adolescent", + "shine", + "norm", + "upset", + "remark", + "resign", + "reward", + "gentle", + "related", + "organ", + "lightly", + "concerning", + "invent", + "laughter", + "fit", + "northwest", + "counseling", + "tight", + "receiver", + "ritual", + "insect", + "interrupt", + "salmon", + "favor", + "trading", + "concern", + "magic", + "superior", + "combat", + "stem", + "surgeon", + "acceptable", + "physics", + "rape", + "counsel", + "brush", + "jeans", + "hunt", + "continuous", + "log", + "echo", + "pill", + "excited", + "sculpture", + "compound", + "integrate", + "flour", + "bitter", + "bare", + "slope", + "rent", + "presidency", + "serving", + "subtle", + "greatly", + "bishop", + "drinking", + "delay", + "cry", + "acceptance", + "collapse", + "shop", + "pump", + "candy", + "evil", + "final", + "finance", + "pleased", + "medal", + "beg", + "sponsor", + "ethical", + "secondary", + "slam", + "export", + "experimental", + "melt", + "midnight", + "net", + "curve", + "integrity", + "entitle", + "evident", + "logic", + "essence", + "park", + "exclude", + "harsh", + "closet", + "suburban", + "greet", + "favor", + "interior", + "corridor", + "murder", + "retail", + "pitcher", + "march", + "snake", + "pitch", + "excuse", + "cross", + "weakness", + "pig", + "cold", + "classical", + "estimated", + "T-shirt", + "online", + "unemployment", + "civilization", + "fold", + "patient", + "pop", + "daily", + "reverse", + "missing", + "correlation", + "humanity", + "flash", + "developer", + "reliable", + "excitement", + "beef", + "Islam", + "Roman", + "stretch", + "architecture", + "occasional", + "administrative", + "elbow", + "deadly", + "Muslim", + "Hispanic", + "allegation", + "tip", + "confuse", + "airplane", + "monthly", + "duck", + "dose", + "Korean", + "plead", + "initiate", + "lecture", + "van", + "sixth", + "bay", + "mainstream", + "suburb", + "sandwich", + "unlike", + "trunk", + "rumor", + "implementation", + "swallow", + "motivate", + "render", + "longtime", + "trap", + "restrict", + "cloth", + "seemingly", + "legislative", + "effectiveness", + "enforce", + "lens", + "reach", + "inspector", + "lend", + "plain", + "fraud", + "companion", + "contend", + "nail", + "array", + "strict", + "assemble", + "frankly", + "rat", + "burst", + "hallway", + "cave", + "inevitable", + "southwest", + "monster", + "speed", + "protest", + "unexpected", + "obstacle", + "facilitate", + "encounter", + "rip", + "herb", + "overwhelming", + "integration", + "crystal", + "recession", + "wish", + "top", + "written", + "motive", + "label", + "flood", + "pen", + "ownership", + "nightmare", + "notice", + "inspection", + "supervisor", + "consult", + "arena", + "laugh", + "diagnosis", + "possession", + "forgive", + "warm", + "consistently", + "basement", + "project", + "drift", + "drain", + "last", + "prosecution", + "maximum", + "announcement", + "warrior", + "prediction", + "bacteria", + "questionnaire", + "mud", + "infrastructure", + "hurry", + "privilege", + "temple", + "medium", + "outdoor", + "suck", + "and/or", + "broadcast", + "re", + "leap", + "random", + "past", + "wrist", + "curtain", + "monitor", + "pond", + "domain", + "guilt", + "cattle", + "subject", + "walking", + "playoff", + "minimum", + "fiscal", + "skirt", + "dump", + "hence", + "database", + "uncomfortable", + "aim", + "execute", + "limb", + "ideology", + "average", + "welcome", + "tune", + "continuing", + "hay", + "railroad", + "endure", + "radiation", + "horn", + "chronic", + "peaceful", + "innovation", + "strain", + "guitar", + "replacement", + "behave", + "administer", + "simultaneously", + "dancer", + "amendment", + "guard", + "pad", + "transmission", + "await", + "retired", + "trigger", + "spill", + "grateful", + "grace", + "virtual", + "response", + "colony", + "adoption", + "slide", + "indigenous", + "closed", + "convict", + "civilian", + "towel", + "modify", + "particle", + "award", + "glance", + "prize", + "landing", + "conduct", + "blue", + "boost", + "bat", + "alarm", + "festival", + "grip", + "weird", + "undermine", + "freshman", + "sweat", + "outer", + "European", + "drunk", + "survey", + "research", + "separation", + "traditionally", + "stuff", + "govern", + "southeast", + "intelligent", + "wherever", + "ballot", + "rhetoric", + "convinced", + "driving", + "vitamin", + "enthusiasm", + "accommodate", + "praise", + "injure", + "wilderness", + "nearby", + "endless", + "mandate", + "pause", + "excuse", + "respectively", + "uncertainty", + "chaos", + "short", + "mechanical", + "canvas", + "forty", + "matter", + "lobby", + "profound", + "format", + "trait", + "currency", + "turkey", + "reserve", + "beam", + "abuse", + "astronomer", + "corruption", + "contractor", + "apologize", + "doctrine", + "genuine", + "thumb", + "unity", + "compromise", + "horrible", + "behavioral", + "exclusive", + "scatter", + "commonly", + "convey", + "rush", + "twist", + "complexity", + "fork", + "disk", + "relieve", + "suspicion", + "lock", + "finish", + "health-care", + "health-care", + "health-care", + "health-care", + "residence", + "shame", + "meaningful", + "sidewalk", + "Olympics", + "technological", + "signature", + "pleasant", + "wow", + "suspend", + "rebel", + "frozen", + "desire", + "spouse", + "fluid", + "pension", + "resume", + "theoretical", + "sodium", + "blow", + "promotion", + "delicate", + "forehead", + "rebuild", + "bounce", + "electrical", + "hook", + "detective", + "traveler", + "click", + "compensation", + "signal", + "exit", + "attraction", + "dedicate", + "altogether", + "pickup", + "carve", + "needle", + "belly", + "ship", + "scare", + "portfolio", + "shuttle", + "invisible", + "timing", + "engagement", + "ankle", + "transaction", + "rescue", + "counterpart", + "historically", + "firmly", + "mild", + "rider", + "doll", + "noon", + "exhibit", + "amid", + "identical", + "precise", + "anxious", + "structural", + "residential", + "loud", + "diagnose", + "carbohydrate", + "liberty", + "poster", + "theology", + "nonprofit", + "crawl", + "oxygen", + "handsome", + "magic", + "sum", + "provided", + "businessman", + "promising", + "conscious", + "determination", + "donor", + "hers", + "pastor", + "jazz", + "opera", + "Japanese", + "bite", + "frame", + "evil", + "acquisition", + "pit", + "hug", + "wildlife", + "punish", + "giant", + "primary", + "equity", + "wrong", + "doorway", + "departure", + "elevator", + "teenage", + "guidance", + "happiness", + "statue", + "pursuit", + "repair", + "decent", + "gym", + "oral", + "clerk", + "Israeli", + "envelope", + "reporting", + "destination", + "fist", + "endorse", + "exploration", + "generous", + "bath", + "rescue", + "thereby", + "overall", + "indicator", + "sunlight", + "feedback", + "spectrum", + "purple", + "laser", + "bold", + "reluctant", + "starting", + "expertise", + "practically", + "program", + "picture", + "tune", + "eating", + "age", + "volunteer", + "hint", + "sharply", + "parade", + "advocate", + "realm", + "ban", + "strip", + "cancel", + "blend", + "therapist", + "slice", + "peel", + "pizza", + "recipient", + "hesitate", + "flip", + "accounting", + "debate", + "bias", + "huh", + "metaphor", + "candle", + "handle", + "worry", + "judicial", + "entity", + "suffering", + "full-time", + "feel", + "lamp", + "garbage", + "servant", + "addition", + "regulatory", + "diplomatic", + "elegant", + "inside", + "reception", + "vanish", + "automatically", + "chin", + "trail", + "necessity", + "confess", + "racism", + "starter", + "interior", + "banking", + "casual", + "gravity", + "enroll", + "diminish", + "prevention", + "Arab", + "value", + "minimize", + "chop", + "performer", + "intent", + "isolate", + "pump", + "inventory", + "productive", + "assembly", + "civic", + "silk", + "magnitude", + "steep", + "hostage", + "collector", + "popularity", + "kiss", + "alien", + "dynamic", + "scary", + "equation", + "angel", + "switch", + "offering", + "rage", + "photography", + "repair", + "toilet", + "disappointed", + "precious", + "prohibit", + "representative", + "content", + "realistic", + "Russian", + "hidden", + "command", + "tender", + "wake", + "gathering", + "outstanding", + "stumble", + "lonely", + "automobile", + "artificial", + "dawn", + "abstract", + "descend", + "silly", + "hook", + "tide", + "shared", + "hopefully", + "readily", + "cooperate", + "revolutionary", + "romance", + "hardware", + "pillow", + "kit", + "cook", + "spread", + "continent", + "seal", + "circuit", + "sink", + "ruling", + "shortage", + "annually", + "lately", + "trap", + "scan", + "fool", + "deadline", + "rear", + "processing", + "ranch", + "coastal", + "undertake", + "softly", + "reserve", + "burning", + "verbal", + "tribal", + "ridiculous", + "automatic", + "diamond", + "credibility", + "import", + "sexually", + "spring", + "way", + "divine", + "sentiment", + "cart", + "oversee", + "stem", + "o'clock", + "elder", + "pro", + "inspiration", + "Dutch", + "quantity", + "trailer", + "mate", + "Greek", + "genius", + "monument", + "bid", + "quest", + "sacrifice", + "invitation", + "accuracy", + "juror", + "officially", + "broker", + "treasure", + "loyalty", + "credit", + "shock", + "talented", + "gasoline", + "stiff", + "output", + "nominee", + "extended", + "please", + "diabetes", + "slap", + "toxic", + "alleged", + "jaw", + "grief", + "mysterious", + "rocket", + "donate", + "inmate", + "tackle", + "dynamics", + "bow", + "ours", + "senior", + "dignity", + "carpet", + "parental", + "bubble", + "heat", + "buddy", + "barn", + "sword", + "flash", + "seventh", + "glory", + "tightly", + "protective", + "tuck", + "drum", + "faint", + "post", + "queen", + "dilemma", + "input", + "specialize", + "northeast", + "shallow", + "liability", + "sail", + "merchant", + "stadium", + "improved", + "bloody", + "defeat", + "associated", + "withdrawal", + "refrigerator", + "nest", + "near", + "thoroughly", + "lane", + "ancestor", + "condemn", + "steam", + "accent", + "escape", + "optimistic", + "unite", + "cage", + "equip", + "shrimp", + "homeland", + "exchange", + "rack", + "costume", + "wolf", + "courtroom", + "statute", + "cartoon", + "besides", + "productivity", + "grin", + "symbolic", + "seal", + "bug", + "bless", + "aunt", + "agriculture", + "rock", + "hostile", + "root", + "conceive", + "combined", + "instantly", + "bankruptcy", + "vaccine", + "bonus", + "collaboration", + "mixed", + "opposed", + "orbit", + "grasp", + "patience", + "spite", + "tropical", + "voting", + "patrol", + "willingness", + "position", + "revelation", + "rent", + "calm", + "jewelry", + "Cuban", + "haul", + "concede", + "trace", + "wagon", + "afterward", + "spectacular", + "ruin", + "sheer", + "prior", + "immune", + "reliability", + "ass", + "alongside", + "bush", + "exotic", + "fascinating", + "secure", + "clip", + "thigh", + "bull", + "drawer", + "regard", + "sheep", + "discourage", + "coordinator", + "ideological", + "runner", + "secular", + "intimate", + "empire", + "cab", + "divorce", + "exam", + "documentary", + "neutral", + "biology", + "flexible", + "progressive", + "web", + "conspiracy", + "catch", + "casualty", + "republic", + "execution", + "terrific", + "whale", + "functional", + "star", + "draft", + "instinct", + "teammate", + "aluminum", + "whoever", + "ministry", + "verdict", + "instruct", + "skull", + "self-esteem", + "ease", + "cooperative", + "manipulate", + "bee", + "practitioner", + "loop", + "edit", + "whip", + "puzzle", + "mushroom", + "subsidy", + "boil", + "tragic", + "mathematics", + "mechanic", + "jar", + "respect", + "earthquake", + "pork", + "creativity", + "safely", + "underlying", + "dessert", + "sympathy", + "fisherman", + "incredibly", + "isolation", + "sock", + "near", + "jump", + "eleven", + "sexy", + "entrepreneur", + "syndrome", + "bureau", + "seat", + "workplace", + "ambition", + "touchdown", + "utilize", + "breeze", + "costly", + "ambitious", + "Christianity", + "presumably", + "influential", + "translation", + "uncertain", + "dissolve", + "object", + "statistical", + "gut", + "metropolitan", + "rolling", + "aesthetic", + "spell", + "insert", + "booth", + "helmet", + "waist", + "expected", + "lion", + "accomplishment", + "royal", + "panic", + "cast", + "crush", + "actively", + "cliff", + "minimal", + "cord", + "fortunately", + "cocaine", + "illusion", + "anonymous", + "tolerate", + "appreciation", + "commissioner", + "harm", + "flexibility", + "instructional", + "scramble", + "casino", + "tumor", + "decorate", + "sort", + "charge", + "pulse", + "equivalent", + "fixed", + "experienced", + "donation", + "diary", + "sibling", + "irony", + "spoon", + "midst", + "alley", + "upset", + "interact", + "soap", + "cute", + "rival", + "short-term", + "punch", + "pin", + "hockey", + "passing", + "persist", + "supplier", + "known", + "momentum", + "purse", + "shed", + "liquid", + "icon", + "elephant", + "consequently", + "legislature", + "associate", + "franchise", + "correctly", + "mentally", + "foster", + "bicycle", + "encouraging", + "cheat", + "access", + "heal", + "fever", + "filter", + "rabbit", + "coin", + "exploit", + "accessible", + "organism", + "sensation", + "partially", + "stay", + "upstairs", + "dried", + "minimum", + "pro", + "conservation", + "shove", + "backyard", + "charter", + "stove", + "consent", + "comprise", + "reminder", + "alike", + "placement", + "dough", + "grandchild", + "dam", + "reportedly", + "well-known", + "surrounding", + "ecological", + "outfit", + "unprecedented", + "columnist", + "workout", + "preliminary", + "patent", + "shy", + "quote", + "trash", + "disabled", + "gross", + "damn", + "hormone", + "texture", + "counter", + "pencil", + "associate", + "frontier", + "spray", + "bet", + "disclose", + "custody", + "banker", + "beast", + "interfere", + "oak", + "case", + "eighth", + "notebook", + "outline", + "gaze", + "attendance", + "speculation", + "uncover", + "behalf", + "innovative", + "shark", + "reward", + "mill", + "installation", + "stimulate", + "tag", + "vertical", + "swimming", + "fleet", + "catalog", + "outsider", + "sacrifice", + "desperately", + "stance", + "compel", + "sensitivity", + "someday", + "instant", + "debut", + "proclaim", + "worldwide", + "hike", + "required", + "confrontation", + "colorful", + "ideal", + "constitution", + "trainer", + "Thanksgiving", + "scent", + "stack", + "eyebrow", + "sack", + "cease", + "inherit", + "tray", + "pioneer", + "organizational", + "textbook", + "uh", + "nasty", + "shrink", + "model", + "emerging", + "dot", + "wheat", + "fierce", + "envision", + "rational", + "kingdom", + "aisle", + "weaken", + "protocol", + "exclusively", + "vocal", + "marketplace", + "openly", + "unfair", + "terrain", + "deploy", + "risky", + "pasta", + "genre", + "distract", + "merit", + "planner", + "depressed", + "chunk", + "closest", + "discount", + "no", + "ladder", + "jungle", + "migration", + "breathing", + "invade", + "hurricane", + "retailer", + "classify", + "wound", + "coup", + "aid", + "ambassador", + "density", + "supportive", + "curiosity", + "skip", + "aggression", + "stimulus", + "journalism", + "robot", + "flood", + "dip", + "likewise", + "informal", + "Persian", + "feather", + "sphere", + "tighten", + "boast", + "pat", + "perceived", + "sole", + "publicity", + "major", + "unfold", + "joke", + "well-being", + "validity", + "ecosystem", + "strictly", + "partial", + "collar", + "weed", + "compliance", + "streak", + "supposedly", + "added", + "builder", + "glimpse", + "premise", + "specialty", + "deem", + "artifact", + "sneak", + "monkey", + "mentor", + "two-thirds", + "listener", + "lightning", + "legally", + "sleeve", + "disappointment", + "disturb", + "rib", + "excessive", + "high-tech", + "debris", + "pile", + "rod", + "logical", + "liberal", + "ash", + "socially", + "parish", + "slavery", + "blank", + "commodity", + "cure", + "mineral", + "hunger", + "dying", + "developmental", + "faster", + "spare", + "halfway", + "cure", + "equality", + "cemetery", + "harassment", + "deliberately", + "fame", + "regret", + "striking", + "likelihood", + "carrot", + "atop", + "toll", + "rim", + "embarrassed", + "fucking", + "cling", + "isolated", + "blink", + "suspicious", + "wheelchair", + "squad", + "eligible", + "processor", + "plunge", + "this", + "sponsor", + "grin", + "color", + "demographic", + "rain", + "chill", + "refuge", + "steer", + "legislator", + "rally", + "programming", + "cheer", + "outlet", + "intact", + "vendor", + "thrive", + "peanut", + "chew", + "elaborate", + "intellectual", + "conception", + "auction", + "steak", + "comply", + "triumph", + "shareholder", + "comparable", + "transport", + "conscience", + "calculation", + "considerably", + "interval", + "scratch", + "awake", + "jurisdiction", + "inevitably", + "feminist", + "constraint", + "emotionally", + "expedition", + "allegedly", + "compromise", + "strain", + "similarity", + "butt", + "lid", + "dumb", + "bulk", + "sprinkle", + "mortality", + "philosophical", + "conversion", + "patron", + "municipal", + "any", + "liver", + "harmony", + "solely", + "tolerance", + "instant", + "goat", + "arm", + "blessing", + "banana", + "running", + "palace", + "formerly", + "peasant", + "neat", + "grandparent", + "lawmaker", + "supermarket", + "cruise", + "mobile", + "plain", + "part", + "calendar", + "widow", + "deposit", + "beard", + "brake", + "downtown", + "screening", + "impulse", + "forbid", + "fur", + "brutal", + "predator", + "poke", + "opt", + "voluntary", + "trouble", + "valid", + "forum", + "dancing", + "happily", + "soar", + "removal", + "autonomy", + "enact", + "round", + "thread", + "light", + "landmark", + "unhappy", + "offender", + "coming", + "privately", + "fraction", + "distinctive", + "tourism", + "threshold", + "calm", + "routinely", + "suite", + "remark", + "regulator", + "straw", + "theological", + "apart", + "exhaust", + "globe", + "fragile", + "objection", + "chemistry", + "old-fashioned", + "crowded", + "circle", + "blast", + "prevail", + "overnight", + "denial", + "rental", + "fantastic", + "fragment", + "level", + "screw", + "warmth", + "undergraduate", + "liquid", + "headache", + "policeman", + "yield", + "projection", + "battle", + "suitable", + "mention", + "graduation", + "drill", + "cruel", + "mansion", + "regard", + "grape", + "authorize", + "cottage", + "driveway", + "charm", + "sexuality", + "loyal", + "clay", + "pound", + "balloon", + "invention", + "ego", + "fare", + "homework", + "disc", + "sofa", + "guarantee", + "availability", + "radar", + "frown", + "regain", + "leave", + "permit", + "sweater", + "rehabilitation", + "rubber", + "retreat", + "molecule", + "freely", + "favorable", + "steadily", + "veteran", + "integrated", + "ha", + "youngster", + "broadcast", + "premium", + "accountability", + "overwhelm", + "one-third", + "contemplate", + "update", + "spark", + "ironically", + "fatigue", + "beyond", + "speculate", + "marker", + "low", + "preach", + "bucket", + "bomb", + "blond", + "confession", + "provoke", + "marble", + "substantially", + "twist", + "defender", + "fish", + "explicit", + "transport", + "disturbing", + "surveillance", + "magnetic", + "technician", + "mutter", + "devastating", + "depart", + "arrow", + "trauma", + "neighboring", + "soak", + "ribbon", + "meantime", + "transmit", + "screen", + "harvest", + "consecutive", + "republican", + "coordinate", + "worldwide", + "within", + "spy", + "slot", + "riot", + "nutrient", + "citizenship", + "severely", + "sovereignty", + "ridge", + "brave", + "lighting", + "specify", + "contributor", + "frustrate", + "crowd", + "articulate", + "importantly", + "transit", + "dense", + "seminar", + "electronics", + "sunny", + "shorts", + "swell", + "accusation", + "soften", + "photograph", + "straighten", + "terribly", + "cue", + "sudden", + "bride", + "biography", + "hazard", + "compelling", + "seldom", + "tile", + "economically", + "honestly", + "troubled", + "bow", + "twentieth", + "balanced", + "foreigner", + "launch", + "convenience", + "delight", + "weave", + "timber", + "till", + "accurately", + "plea", + "bulb", + "copy", + "flying", + "sustainable", + "devil", + "bolt", + "cargo", + "spine", + "seller", + "skilled", + "managing", + "public", + "marine", + "dock", + "organized", + "fog", + "diplomat", + "boring", + "sometime", + "summary", + "missionary", + "epidemic", + "fatal", + "trim", + "warehouse", + "accelerate", + "butterfly", + "bronze", + "drown", + "inherent", + "praise", + "nationwide", + "spit", + "harvest", + "kneel", + "vacuum", + "selected", + "dictate", + "stereotype", + "sensor", + "laundry", + "manual", + "pistol", + "naval", + "immigrant", + "plaintiff", + "kid", + "middle-class", + "apology", + "till", +]; diff --git a/server/src/timer/timer.module.ts b/server/src/timer/timer.module.ts new file mode 100644 index 0000000..0658584 --- /dev/null +++ b/server/src/timer/timer.module.ts @@ -0,0 +1,4 @@ +import { Module } from '@nestjs/common'; + +@Module({}) +export class TimerModule {}