From f86630c51eb6ed3c0efec52ca8848781cbcad821 Mon Sep 17 00:00:00 2001 From: sherl Date: Fri, 2 Jan 2026 17:50:52 +0100 Subject: [PATCH] feat: add link generation support (short/sentence links) + wordlist --- .gitignore | 3 + src/app.ts | 3 +- src/controllers/authController.ts | 4 + src/controllers/linkController.ts | 79 + src/routes/linkRoutes.ts | 100 + src/routes/miscRoutes.ts | 1 + src/routes/userRoutes.ts | 4 +- src/schemas/authSchema.ts | 2 +- src/schemas/linkSchema.ts | 61 + src/services/linkService.ts | 137 + src/tools/validateSchema.ts | 5 +- wordlist.example-large.ts | 7069 +++++++++++++++++++++++++++++ 12 files changed, 7462 insertions(+), 6 deletions(-) create mode 100644 src/controllers/linkController.ts create mode 100644 src/routes/linkRoutes.ts create mode 100644 src/schemas/linkSchema.ts create mode 100644 src/services/linkService.ts create mode 100644 wordlist.example-large.ts diff --git a/.gitignore b/.gitignore index 549e630..2f663a6 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ temp/ # .env .env + +# wordlist +src/tools/wordlist.ts diff --git a/src/app.ts b/src/app.ts index 5c00ddf..1110809 100644 --- a/src/app.ts +++ b/src/app.ts @@ -7,6 +7,7 @@ import { AppDataSource } from './data-source' import inferUser from './middleware/inferUser'; import miscRouter from './routes/miscRoutes'; import userRouter from './routes/userRoutes'; +import linkRouter from './routes/linkRoutes'; import { getCorsConfig } from './tools/cors'; AppDataSource.initialize().then(async () => { @@ -18,7 +19,7 @@ AppDataSource.initialize().then(async () => { app.use(express.json()); app.use(getCorsConfig()); app.use(inferUser); - app.use(miscRouter, userRouter); + app.use(miscRouter, userRouter, linkRouter); if (process.env['DEBUG'] === 'true') { const swaggerJsdocOpts = { diff --git a/src/controllers/authController.ts b/src/controllers/authController.ts index a5f5774..8080931 100644 --- a/src/controllers/authController.ts +++ b/src/controllers/authController.ts @@ -7,6 +7,8 @@ import { generateSha512 } from '../tools/hasher'; import * as jwt from '../tools/jwt'; /** + * `POST /api/v1/user/signIn` + * * Handles requests for user logon * * @param {Request} req The Express request @@ -77,6 +79,8 @@ export async function loginUserHandler( } /** + * `POST /api/v1/user/signUp` + * * Handles requests for user registration * * @param {Request} req The Express request diff --git a/src/controllers/linkController.ts b/src/controllers/linkController.ts new file mode 100644 index 0000000..356200d --- /dev/null +++ b/src/controllers/linkController.ts @@ -0,0 +1,79 @@ +import { Request, Response } from 'express'; +import { Link } from '../entities/Link'; +import { User } from '../entities/User'; +import * as ms from '../schemas/miscSchema'; +import * as ls from '../schemas/linkSchema'; +import { LinkService } from '../services/linkService'; +import { UserService } from '../services/userService'; +import * as jwt from '../tools/jwt'; +import { generateSentenceString, generateShortString } from '../tools/wordlist'; + +/** + * `GET /api/v1/link/short` + * + * Handles requests for short link generation + * + * @param {Request} req The Express request + * @param {Response} res The Express resource + */ +export async function generateShortLinkHandler( + req: Request<{}, {}, {}, ls.ShortLinkRequestDTO['query']>, + res: Response +) { + + // Using locals here, as Request stores all parsed data + // in strings for queries (QueryString.ParsedQs). + const val = res.locals.validated as ls.ShortLinkRequestDTO; + + let generatedShortString: string = generateShortString( + val.query[ 'length'] ?? 9, + val.query['alphanum'] ?? true, + val.query[ 'case'] ?? null + ); + let generatedSubdomain: string | null = null; + + if (val.query['withSubdomain'] === true && jwt.getEnvString('useSubdomains', true) === 'true') + generatedSubdomain = generateSentenceString('[subdomain]'); + + const userResponse: ls.LinkResponseDTO = { + status: 'ok', + uri: generatedShortString, + subdomain: generatedSubdomain + }; + + return res.status(200) + .send(userResponse); +} + +/** + * `GET /api/v1/link/fromWordlist` + * + * Handles requests for pseudo-sentence link generation + * + * @param {Request} req The Express request + * @param {Response} res The Express resource + */ +export async function generateSentenceLinkHandler( + req: Request<{}, {}, {}, ls.SentenceLinkRequestDTO['query']>, + res: Response +) { + + // Using locals here, as Request stores all parsed data + // in strings for queries (QueryString.ParsedQs). + const val = res.locals.validated as ls.SentenceLinkRequestDTO; + + let generatedSentenceString: string = generateSentenceString(); + let generatedSubdomain: string | null = null; + + if (val.query['withSubdomain'] === true && jwt.getEnvString('useSubdomains', true) === 'true') + generatedSubdomain = generateSentenceString('[subdomain]'); + + const userResponse: ls.LinkResponseDTO = { + status: 'ok', + uri: generatedSentenceString, + subdomain: generatedSubdomain + }; + + return res.status(200) + .send(userResponse); +} diff --git a/src/routes/linkRoutes.ts b/src/routes/linkRoutes.ts new file mode 100644 index 0000000..ac1fbbd --- /dev/null +++ b/src/routes/linkRoutes.ts @@ -0,0 +1,100 @@ +import { Router } from 'express'; +import validateSchema from '../tools/validateSchema'; +import * as lc from '../controllers/linkController'; +import * as ls from '../schemas/linkSchema'; + +const linkRouter = Router(); + +/** + * @openapi + * + * /api/v1/link/short: + * get: + * description: Generates a new short link + * tags: [Link] + * summary: Get a new short link + * parameters: + * - name: length + * in: query + * description: generated URL's length + * required: false + * schema: + * type: integer + * format: int32 + * default: 9 + * minimum: 2 + * maximum: 127 + * - name: alphanum + * in: query + * description: whether to use numbers in generated URL + * required: false + * schema: + * type: boolean + * default: true + * - name: case + * in: query + * description: whether to use uppercase ("upper"), lowercase ("lower") or mixed case (default) + * schema: + * type: string + * - name: withSubdomain + * in: query + * description: whether to generate a subdomain too (will be generated only if supported by server) + * required: false + * schema: + * type: boolean + * default: false + * produces: + * - application/json + * responses: + * 200: + * description: Link generated successfully + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/LinkResponseDTO' + * 400: + * description: Bad request + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ErrorDTO' + */ +linkRouter.get('/api/v1/link/short', validateSchema(ls.shortLinkRequestSchema), lc.generateShortLinkHandler); + + +/** + * @openapi + * + * /api/v1/link/fromWordlist: + * get: + * description: Generates a new pseudosentence link from wordlist. + * tags: [Link] + * summary: Get a new "sentence" link + * parameters: + * - name: withSubdomain + * in: query + * description: whether to generate a subdomain too (will be generated only if supported by server) + * required: false + * schema: + * type: boolean + * default: false + * produces: + * - application/json + * responses: + * 200: + * description: Link generated successfully + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/LinkResponseDTO' + * 400: + * description: Bad request + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/ErrorDTO' + */ +linkRouter.get('/api/v1/link/fromWordlist', validateSchema(ls.sentenceLinkRequestSchema), lc.generateSentenceLinkHandler); + + +export default linkRouter; \ No newline at end of file diff --git a/src/routes/miscRoutes.ts b/src/routes/miscRoutes.ts index f82d2c7..beb0ec4 100644 --- a/src/routes/miscRoutes.ts +++ b/src/routes/miscRoutes.ts @@ -21,6 +21,7 @@ miscRouter.get('/', (req: Request, res: Response) => res.send("Hello world!")); * get: * tags: [Healthcheck] * description: Provides a response when backend is running + * summary: Check if backend is running * responses: * 200: * description: Backend is online diff --git a/src/routes/userRoutes.ts b/src/routes/userRoutes.ts index 524e3d9..ca8dbfa 100644 --- a/src/routes/userRoutes.ts +++ b/src/routes/userRoutes.ts @@ -1,7 +1,7 @@ -import { Router, Request, Response } from 'express'; +import { Router } from 'express'; import validateSchema from '../tools/validateSchema'; import * as ac from '../controllers/authController'; -import * as as from '../schemas/authSchema'; +import * as as from '../schemas/authSchema'; const userRouter = Router(); diff --git a/src/schemas/authSchema.ts b/src/schemas/authSchema.ts index 491d472..e6d18fc 100644 --- a/src/schemas/authSchema.ts +++ b/src/schemas/authSchema.ts @@ -58,7 +58,7 @@ export type LoginRequestDTO = z.TypeOf; * properties: * status: * type: string - * default: ok on success otherwise ErrorDTO with error + * default: ok on success, otherwise ErrorDTO with error * name: * type: string * default: username diff --git a/src/schemas/linkSchema.ts b/src/schemas/linkSchema.ts new file mode 100644 index 0000000..af6b0eb --- /dev/null +++ b/src/schemas/linkSchema.ts @@ -0,0 +1,61 @@ +import z from 'zod'; + +const shortLinkRequestSchemaQuery = z.object({ + // https://zod.dev/v4?id=stringbool + length: z.coerce + .number('Length must be a number') + .min( 3, 'Length is too small (try something longer than 3)') + .max(128, 'Length is too long (try something shorter than 128)') + .optional(), + alphanum: z.stringbool('Alphanum must be a boolean') + .optional(), + case: z.enum(['lower', 'upper']) + .optional(), + withSubdomain: z.stringbool('WithSubdomain must be a boolean') + .optional() +}); + +export const shortLinkRequestSchema = z.object({ + query: shortLinkRequestSchemaQuery +}); +export type ShortLinkRequestDTO = z.TypeOf; + +const sentenceLinkRequestSchemaQuery = z.object({ + // https://zod.dev/v4?id=stringbool + withSubdomain: z.stringbool('WithSubdomain must be a boolean') + .optional() +}); + +export const sentenceLinkRequestSchema = z.object({ + query: sentenceLinkRequestSchemaQuery +}); +export type SentenceLinkRequestDTO = z.TypeOf; + + +/** + * @swagger + * components: + * schemas: + * LinkResponseDTO: + * type: object + * required: + * - status + * - uri + * - subdomain + * properties: + * status: + * type: string + * default: ok on success, otherwise ErrorDTO with error + * uri: + * type: string + * default: username + * subdomain: + * type: string + * default: subdomain or null + */ +export type LinkResponseDTO = { + status: 'ok'; + uri: string; + subdomain?: string | null; // null when server does not support generating subdomains +}; + diff --git a/src/services/linkService.ts b/src/services/linkService.ts new file mode 100644 index 0000000..c261dae --- /dev/null +++ b/src/services/linkService.ts @@ -0,0 +1,137 @@ +import { Link } from '../entities/Link'; +import { User } from '../entities/User'; +import { AppDataSource } from '../data-source'; +import { getEnvString } from '../tools/jwt'; + +export type IdResponse = { + id: number; + exists: boolean; +}; + +export class LinkService { + dataSource = AppDataSource; + linkRepo = this.dataSource.getRepository(Link); + + // Retrieve config to check whether subdomains are allowed + useSubdomains: boolean = getEnvString('useSubdomains', true) === 'true'; + + /** + * Simply insert a new link entity anonymously. + * + * @param {Link} link The link to insert + */ + async addAnonymous(link: Link): Promise { + let result: IdResponse = { id: -1, exists: false }; + + // Sanity check: don't allow for adding links + // with subdomains if server has it disabled. + if (link.subdomain && !this.useSubdomains) link.subdomain = null; + + // Check if entry can be inserted. + if (await this.canInsert(link)) { + await this.linkRepo.insert(link); + + // Then get new link's ID + const insertedLink: Link[] = await this.linkRepo.findBy({ + shortUri: link.shortUri, + fullUrl: link.fullUrl + }); + + // Return appropriate id (or error) + if (insertedLink.length !== 1) { + result.id = -2; + result.exists = false; + } else { + result.id = insertedLink[0].id; + result.exists = true; + } + } + + return result; + } + + /** + * Adds a new link entity, and links it with passed user. + * + * USE ONLY FOR AUTHENTICATED USERS. For unauthenticated users + * use addAnonymous() instead. Returns IdResponse, containing + * exists field indicating if an existing field has been found, + * and if so, what is it's id. If exists is false, ID of the + * newly created entity gets returned. + * + * Errors: an error ocurred if ID is negative. + * + * This can be: + * + * - -1 - link can't be inserted (because an entry with shortUri or shortUri+subdomain combo exist), + * + * - -2 - no conflicting entry exists but transaction failed anyway. + * + * @param {Link} link The link + * @param {User} user The user + * @return {Promise} Dictionary containing link ID and whether it already existed, or was just inserted + */ + async addIfNew(link: Link, user: User): Promise { + + let result: IdResponse = { id: -1, exists: false }; + + // If no conflicts are found, + // proceed with creating a new link entry. + if (await this.canInsert(link)) { + // Commit a transaction + this.dataSource.transaction(async (t) => { + link.author = user; + user.links.push(link); + t.insert(Link, link); + t.save(user); + }); + + // Then get new link's ID + const insertedLink: Link[] = await this.linkRepo.findBy({ + shortUri: link.shortUri, + fullUrl: link.fullUrl + }); + + // Return appropriate id (or error) + if (insertedLink.length !== 1) { + result.id = -2; + result.exists = false; + } else { + result.id = insertedLink[0].id; + result.exists = true; + } + + } + + return result; + } + + async canInsert(link: Link): Promise { + let shortUriExists: boolean = true + + // If both subdomains are enabled, and user + // provided a subdomain, find if a record exists + // that either has the exact shortUri + // or shortUri and subdomain combo. + // If any of these turns out to be true, the request + // must be invalidated and we can't proceed + // with creation of a new link. + if (this.useSubdomains && link.subdomain) + { + shortUriExists = await this.linkRepo.existsBy({ + shortUri: link.shortUri, + subdomain: link.subdomain + }); + } + // If custom subdomains are disabled, fallback to + // checking only by the URIs - thus discarding + // any possible subdomains. + else + { + shortUriExists = await this.linkRepo.existsBy({ shortUri: link.shortUri }); + } + + return !shortUriExists; + } + +} diff --git a/src/tools/validateSchema.ts b/src/tools/validateSchema.ts index 4702e62..d9cdce8 100644 --- a/src/tools/validateSchema.ts +++ b/src/tools/validateSchema.ts @@ -8,11 +8,12 @@ const validate = (schema: z.ZodObject) => (req: Request, res: Response, next: NextFunction) => { try { - schema.parse({ + let validatedData = schema.parse({ body: req.body, query: req.query, params: req.params, }); + res.locals.validated = validatedData; next(); } catch (e: any) { if (e instanceof z.ZodError) { @@ -24,7 +25,7 @@ const validate = return res.status(400) .json(errorResponse); } else { - console.log('Generic error triggered:', e); + console.log('Generic validation error triggered:', e); let errorResponse: ErrorDTO = { status: 'error', error: 'Unknown error', diff --git a/wordlist.example-large.ts b/wordlist.example-large.ts new file mode 100644 index 0000000..523fb3b --- /dev/null +++ b/wordlist.example-large.ts @@ -0,0 +1,7069 @@ +// Sample wordlist for kittyurl. +// Copy into src/tools/wordlist.ts, or bring your own. +// +// When using Docker, you can mount your own +// wordlist to /app/src/wordlist.ts. +// When contributing, please sort the words, +// and list one per line in lowercase. +// +// This snippet may help you order your list: +// console.log( +// [...new Set(wordlist)] +// .sort() +// .join('\n') +// ); + +// 4680 adjectives +const adjectives: string[] = [ + "abnormal", + "abounding", + "abrasive", + "abrupt", + "absent", + "absentminded", + "absolute", + "absorbed", + "absorbing", + "abstracted", + "absurd", + "abundant", + "abusive", + "abysmal", + "academic", + "acceptable", + "accepting", + "accessible", + "accidental", + "acclaimed", + "accommodating", + "accompanying", + "accountable", + "accurate", + "accusative", + "accused", + "accusing", + "acerbic", + "achievable", + "aching", + "acid", + "acidic", + "acknowledged", + "acoustic", + "acrid", + "acrimonious", + "acrobatic", + "actionable", + "active", + "actual", + "ad", + "adamant", + "adaptable", + "adaptive", + "addicted", + "addictive", + "additional", + "adept", + "adequate", + "adhesive", + "adjacent", + "adjoining", + "adjustable", + "administrative", + "admirable", + "admired", + "admiring", + "adopted", + "adoptive", + "adorable", + "adored", + "adoring", + "adrenalized", + "adroit", + "adult", + "advanced", + "advantageous", + "adventurous", + "adversarial", + "advisable", + "aerial", + "affable", + "affected", + "affectionate", + "affirmative", + "affordable", + "afraid", + "afternoon", + "ageless", + "aggravated", + "aggravating", + "aggressive", + "agitated", + "agonizing", + "agrarian", + "agreeable", + "aimless", + "airline", + "airsick", + "ajar", + "alarmed", + "alarming", + "alert", + "algebraic", + "alien", + "alienated", + "alike", + "alive", + "all", + "alleged", + "allowable", + "alluring", + "allusive", + "alone", + "aloof", + "alterable", + "alternating", + "alternative", + "amazed", + "amazing", + "ambiguous", + "ambitious", + "ambulant", + "ambulatory", + "amiable", + "amicable", + "amphibian", + "amused", + "amusing", + "ancient", + "anecdotal", + "anemic", + "angelic", + "angered", + "angry", + "angular", + "animal", + "animated", + "annoyed", + "annoying", + "annual", + "anonymous", + "another", + "antagonistic", + "anticipated", + "anticlimactic", + "anticorrosive", + "antiquated", + "antiseptic", + "antisocial", + "antsy", + "anxious", + "any", + "apathetic", + "apologetic", + "apologizing", + "appalling", + "appealing", + "appetizing", + "applauding", + "applicable", + "applicative", + "appreciative", + "apprehensive", + "approachable", + "approaching", + "appropriate", + "approving", + "approximate", + "aquatic", + "architectural", + "ardent", + "arduous", + "arguable", + "argumentative", + "arid", + "aristocratic", + "aromatic", + "arresting", + "arrogant", + "artful", + "artificial", + "artistic", + "artless", + "ashamed", + "aspiring", + "assertive", + "assignable", + "assorted", + "assumable", + "assured", + "assuring", + "astonished", + "astonishing", + "astounded", + "astounding", + "astringent", + "astronomical", + "astute", + "asymmetrical", + "athletic", + "atomic", + "atrocious", + "attachable", + "attainable", + "attentive", + "attractive", + "attributable", + "atypical", + "audacious", + "auspicious", + "authentic", + "authoritarian", + "authoritative", + "autobiographic", + "autographed", + "automatic", + "autonomous", + "available", + "avenging", + "average", + "avian", + "avid", + "avoidable", + "awake", + "awakening", + "aware", + "away", + "awesome", + "awful", + "awkward", + "axiomatic", + "babbling", + "baby", + "background", + "backhanded", + "bacterial", + "bad", + "baffled", + "baffling", + "bald", + "balding", + "balmy", + "bandaged", + "banging", + "bankable", + "banned", + "bantering", + "barbaric", + "barbarous", + "barbequed", + "barefooted", + "barking", + "barren", + "bashful", + "basic", + "battered", + "batty", + "bawling", + "beady", + "beaming", + "bearable", + "beautiful", + "beckoning", + "bedazzled", + "bedazzling", + "beefy", + "beeping", + "befitting", + "befuddled", + "beginning", + "belching", + "believable", + "bellicose", + "belligerent", + "bellowing", + "bendable", + "beneficial", + "benevolent", + "benign", + "bent", + "berserk", + "best", + "betrayed", + "better", + "better", + "bewildered", + "bewildering", + "bewitched", + "bewitching", + "biased", + "biblical", + "big", + "bigger", + "biggest", + "bighearted", + "bigoted", + "bilingual", + "billable", + "billowy", + "binary", + "binding", + "bioactive", + "biodegradable", + "biographical", + "biting", + "bitter", + "bizarre", + "black", + "blamable", + "blameless", + "bland", + "blank", + "blaring", + "blasphemous", + "blatant", + "blazing", + "bleached", + "bleak", + "bleary", + "blessed", + "blind", + "blindfolded", + "blinding", + "blissful", + "blistering", + "bloated", + "blonde", + "bloodied", + "bloodthirsty", + "bloody", + "blooming", + "blossoming", + "blue", + "blundering", + "blunt", + "blurred", + "blurry", + "blushing", + "boastful", + "bodacious", + "bohemian", + "boiling", + "boisterous", + "bold", + "bookish", + "booming", + "boorish", + "bordering", + "bored", + "boring", + "born", + "bossy", + "both", + "bothered", + "bouncing", + "bouncy", + "bouncy", + "boundless", + "bountiful", + "boyish", + "braided", + "brainless", + "brainy", + "brash", + "brassy", + "brave", + "brawny", + "brazen", + "breakable", + "breathable", + "breathless", + "breathtaking", + "breezy", + "bribable", + "brick", + "brief", + "bright", + "brilliant", + "briny", + "brisk", + "bristly", + "broad", + "broken", + "bronchial", + "bronze", + "bronzed", + "brooding", + "brown", + "bruised", + "brunette", + "brutal", + "brutish", + "bubbly", + "budget", + "bulky", + "bumpy", + "bungling", + "buoyant", + "bureaucratic", + "burly", + "burnable", + "burning", + "bushy", + "busiest", + "business", + "bustling", + "busy", + "buttery", + "buzzing", + "cackling", + "caged", + "cagey", + "calculable", + "calculated", + "calculating", + "callous", + "calm", + "calming", + "camouflaged", + "cancelled", + "cancerous", + "candid", + "cantankerous", + "capable", + "capricious", + "captivated", + "captivating", + "captive", + "carefree", + "careful", + "careless", + "caring", + "carnivorous", + "carpeted", + "carsick", + "casual", + "catastrophic", + "catatonic", + "catchable", + "caustic", + "cautious", + "cavalier", + "cavernous", + "ceaseless", + "celebrated", + "celestial", + "centered", + "central", + "cerebral", + "ceremonial", + "certain", + "certifiable", + "certified", + "challenged", + "challenging", + "chance", + "changeable", + "changing", + "chanting", + "charging", + "charismatic", + "charitable", + "charmed", + "charming", + "chattering", + "chatting", + "chatty", + "chauvinistic", + "cheap", + "cheapest", + "cheeky", + "cheerful", + "cheering", + "cheerless", + "cheery", + "chemical", + "chewable", + "chewy", + "chic", + "chicken", + "chief", + "childish", + "childlike", + "chilling", + "chilly", + "chivalrous", + "choice", + "choking", + "choppy", + "chronological", + "chubby", + "chuckling", + "chunky", + "cinematic", + "circling", + "circular", + "circumstantial", + "civil", + "civilian", + "civilized", + "clammy", + "clamoring", + "clandestine", + "clanging", + "clapping", + "clashing", + "classic", + "classical", + "classifiable", + "classified", + "classy", + "clean", + "cleanable", + "clear", + "cleared", + "clearheaded", + "clever", + "climatic", + "climbable", + "clinging", + "clingy", + "clinical", + "cliquish", + "clogged", + "cloistered", + "close", + "closeable", + "closed", + "cloudless", + "cloudy", + "clownish", + "clueless", + "clumsy", + "cluttered", + "coachable", + "coarse", + "cockamamie", + "cocky", + "codified", + "coercive", + "cognitive", + "coherent", + "cohesive", + "coincidental", + "cold", + "coldhearted", + "collaborative", + "collapsed", + "collapsing", + "collectable", + "collegial", + "colloquial", + "colonial", + "colorful", + "colorless", + "colossal", + "combative", + "combined", + "comfortable", + "comforted", + "comforting", + "comical", + "commanding", + "commemorative", + "commendable", + "commercial", + "committed", + "common", + "communal", + "communicable", + "communicative", + "communist", + "compact", + "comparable", + "comparative", + "compassionate", + "compelling", + "competent", + "competitive", + "complacent", + "complaining", + "complete", + "completed", + "complex", + "compliant", + "complicated", + "complimentary", + "compound", + "comprehensive", + "compulsive", + "compulsory", + "computer", + "computerized", + "concealable", + "concealed", + "conceited", + "conceivable", + "concerned", + "concerning", + "concerted", + "concise", + "concurrent", + "condemned", + "condensed", + "condescending", + "conditional", + "confident", + "confidential", + "confirmable", + "confirmed", + "conflicted", + "conflicting", + "conformable", + "confounded", + "confused", + "confusing", + "congenial", + "congested", + "congressional", + "congruent", + "congruous", + "connectable", + "connected", + "connecting", + "connective", + "conscientious", + "conscious", + "consecutive", + "consensual", + "consenting", + "conservative", + "considerable", + "considerate", + "consistent", + "consoling", + "conspicuous", + "conspiratorial", + "constant", + "constitutional", + "constrictive", + "constructive", + "consumable", + "consummate", + "contagious", + "containable", + "contemplative", + "contemporary", + "contemptible", + "contemptuous", + "content", + "contented", + "contentious", + "contextual", + "continual", + "continuing", + "continuous", + "contoured", + "contractual", + "contradicting", + "contradictory", + "contrarian", + "contrary", + "contributive", + "contrite", + "controllable", + "controlling", + "controversial", + "convenient", + "conventional", + "conversational", + "convinced", + "convincing", + "convoluted", + "convulsive", + "cooing", + "cooked", + "cool", + "coolest", + "cooperative", + "coordinated", + "copious", + "coquettish", + "cordial", + "corner", + "cornered", + "corny", + "corporate", + "corpulent", + "correct", + "correctable", + "corrective", + "corresponding", + "corrosive", + "corrupt", + "corrupting", + "corruptive", + "cosmetic", + "cosmic", + "costly", + "cottony", + "coughing", + "courageous", + "courteous", + "covert", + "coveted", + "cowardly", + "cowering", + "coy", + "cozy", + "crabby", + "cracked", + "crackling", + "crafty", + "craggy", + "crammed", + "cramped", + "cranky", + "crashing", + "crass", + "craven", + "crawling", + "crazy", + "creaking", + "creaky", + "creamy", + "creative", + "credible", + "creeping", + "creepy", + "crestfallen", + "criminal", + "crippled", + "crippling", + "crisp", + "crispy", + "critical", + "crooked", + "cropped", + "cross", + "crossed", + "crotchety", + "crowded", + "crucial", + "crude", + "cruel", + "crumbling", + "crumbly", + "crumply", + "crunchable", + "crunching", + "crunchy", + "crunchy", + "crushable", + "crushed", + "crusty", + "crying", + "cryptic", + "crystalline", + "crystallized", + "cuddly", + "culpable", + "cultural", + "cultured", + "cumbersome", + "cumulative", + "cunning", + "curable", + "curative", + "curious", + "curly", + "current", + "cursed", + "curt", + "curved", + "curvy", + "customary", + "cut", + "cute", + "cutting", + "cylindrical", + "cynical", + "daffy", + "daft", + "daily", + "dainty", + "damaged", + "damaging", + "damp", + "danceable", + "dandy", + "dangerous", + "dapper", + "daring", + "dark", + "darkened", + "dashing", + "daughterly", + "daunting", + "dawdling", + "day", + "dazed", + "dazzling", + "dead", + "deadly", + "deadpan", + "deaf", + "deafening", + "dear", + "debatable", + "debonair", + "decadent", + "decayed", + "decaying", + "deceitful", + "deceivable", + "deceiving", + "decent", + "decentralized", + "deceptive", + "decimated", + "decipherable", + "decisive", + "declining", + "decorative", + "decorous", + "decreasing", + "decrepit", + "dedicated", + "deep", + "deepening", + "defeated", + "defective", + "defendable", + "defenseless", + "defensible", + "defensive", + "defiant", + "deficient", + "definable", + "definitive", + "deformed", + "degenerative", + "degraded", + "dehydrated", + "dejected", + "delectable", + "deliberate", + "deliberative", + "delicate", + "delicious", + "delighted", + "delightful", + "delinquent", + "delirious", + "deliverable", + "deluded", + "demanding", + "demented", + "democratic", + "demonic", + "demonstrative", + "demure", + "deniable", + "dense", + "dependable", + "dependent", + "deplorable", + "deploring", + "depraved", + "depressed", + "depressing", + "depressive", + "deprived", + "deranged", + "derivative", + "derogative", + "derogatory", + "descriptive", + "deserted", + "designer", + "desirable", + "desirous", + "desolate", + "despairing", + "desperate", + "despicable", + "despised", + "despondent", + "destroyed", + "destructive", + "detachable", + "detached", + "detailed", + "detectable", + "determined", + "detestable", + "detrimental", + "devastated", + "devastating", + "devious", + "devoted", + "devout", + "dexterous", + "diabolical", + "diagonal", + "didactic", + "different", + "difficult", + "diffuse", + "digestive", + "digital", + "dignified", + "digressive", + "dilapidated", + "diligent", + "dim", + "diminishing", + "diminutive", + "dingy", + "diplomatic", + "dire", + "direct", + "direful", + "dirty", + "disabled", + "disadvantaged", + "disadvantageous", + "disaffected", + "disagreeable", + "disappearing", + "disappointed", + "disappointing", + "disapproving", + "disarming", + "disastrous", + "discarded", + "discernable", + "disciplined", + "disconnected", + "discontented", + "discordant", + "discouraged", + "discouraging", + "discourteous", + "discredited", + "discreet", + "discriminating", + "discriminatory", + "discussable", + "disdainful", + "diseased", + "disenchanted", + "disgraceful", + "disgruntled", + "disgusted", + "disgusting", + "disheartened", + "disheartening", + "dishonest", + "dishonorable", + "disillusioned", + "disinclined", + "disingenuous", + "disinterested", + "disjointed", + "dislikeable", + "disliked", + "disloyal", + "dismal", + "dismissive", + "disobedient", + "disorderly", + "disorganized", + "disparaging", + "disparate", + "dispassionate", + "dispensable", + "displaced", + "displeased", + "displeasing", + "disposable", + "disproportionate", + "disproved", + "disputable", + "disputatious", + "disputed", + "disreputable", + "disrespectful", + "disruptive", + "dissatisfied", + "dissimilar", + "dissolvable", + "dissolving", + "dissonant", + "dissuasive", + "distant", + "distasteful", + "distinct", + "distinctive", + "distinguished", + "distracted", + "distracting", + "distraught", + "distressed", + "distressing", + "distrustful", + "disturbed", + "disturbing", + "divergent", + "diverging", + "diverse", + "diversified", + "divided", + "divine", + "divisive", + "dizzy", + "dizzying", + "doable", + "documentary", + "dogged", + "doggish", + "dogmatic", + "doleful", + "dollish", + "domed", + "domestic", + "dominant", + "domineering", + "dorky", + "dorsal", + "doting", + "double", + "doubtful", + "doubting", + "dovish", + "dowdy", + "down", + "downhearted", + "downloadable", + "downtown", + "downward", + "dozing", + "drab", + "drained", + "dramatic", + "drastic", + "dreaded", + "dreadful", + "dreaming", + "dreamy", + "dreary", + "drenched", + "dress", + "dressy", + "dried", + "dripping", + "drivable", + "driven", + "droll", + "drooping", + "droopy", + "drowsy", + "drunk", + "dry", + "dual", + "dubious", + "due", + "dulcet", + "dull", + "duplicitous", + "durable", + "dusty", + "dutiful", + "dwarfish", + "dwindling", + "dynamic", + "dysfunctional", + "each", + "eager", + "early", + "earnest", + "earthshaking", + "earthy", + "east", + "eastern", + "easy", + "eatable", + "eccentric", + "echoing", + "ecological", + "economic", + "economical", + "economy", + "ecstatic", + "edgy", + "editable", + "educated", + "educational", + "eerie", + "effective", + "effervescent", + "efficacious", + "efficient", + "effortless", + "effusive", + "egalitarian", + "egocentric", + "egomaniacal", + "egotistical", + "eight", + "eighth", + "either", + "elaborate", + "elastic", + "elated", + "elderly", + "electric", + "electrical", + "electrifying", + "electronic", + "elegant", + "elementary", + "elevated", + "elfish", + "eligible", + "elite", + "eloquent", + "elusive", + "emaciated", + "embarrassed", + "embarrassing", + "embattled", + "embittered", + "emblematic", + "emboldened", + "embroiled", + "emergency", + "eminent", + "emotional", + "emotionless", + "empirical", + "empty", + "enamored", + "enchanted", + "enchanting", + "encouraged", + "encouraging", + "encrusted", + "endangered", + "endearing", + "endemic", + "endless", + "endurable", + "enduring", + "energetic", + "energizing", + "enforceable", + "engaging", + "engrossing", + "enhanced", + "enigmatic", + "enjoyable", + "enlarged", + "enlightened", + "enormous", + "enough", + "enraged", + "ensuing", + "enterprising", + "entertained", + "entertaining", + "enthralled", + "enthused", + "enthusiastic", + "enticing", + "entire", + "entranced", + "entrepreneurial", + "enumerable", + "enviable", + "envious", + "environmental", + "episodic", + "equable", + "equal", + "equidistant", + "equitable", + "equivalent", + "erasable", + "erect", + "eroding", + "errant", + "erratic", + "erroneous", + "eruptive", + "escalating", + "esoteric", + "essential", + "established", + "estimated", + "estranged", + "eternal", + "ethereal", + "ethical", + "ethnic", + "euphemistic", + "euphoric", + "evasive", + "even", + "evenhanded", + "evening", + "eventful", + "eventual", + "everlasting", + "every", + "evil", + "evocative", + "exacerbating", + "exact", + "exacting", + "exaggerated", + "exalted", + "exasperated", + "exasperating", + "excellent", + "exceptional", + "excessive", + "exchangeable", + "excitable", + "excited", + "exciting", + "exclusive", + "excruciating", + "excusable", + "executable", + "exemplary", + "exhausted", + "exhausting", + "exhaustive", + "exhilarated", + "exhilarating", + "existing", + "exotic", + "expandable", + "expanded", + "expanding", + "expansive", + "expectant", + "expected", + "expedient", + "expeditious", + "expendable", + "expensive", + "experimental", + "expert", + "expired", + "expiring", + "explainable", + "explicit", + "exploding", + "exploitative", + "exploited", + "explosive", + "exponential", + "exposed", + "express", + "expressionistic", + "expressionless", + "expressive", + "exquisite", + "extemporaneous", + "extendable", + "extended", + "extension", + "extensive", + "exterior", + "external", + "extra", + "extraneous", + "extraordinary", + "extravagant", + "extreme", + "exuberant", + "fabled", + "fabulous", + "facetious", + "facial", + "factitious", + "factual", + "faded", + "fading", + "failed", + "faint", + "fainthearted", + "fair", + "faithful", + "faithless", + "fallacious", + "false", + "falsified", + "faltering", + "familiar", + "famished", + "famous", + "fanatical", + "fanciful", + "fancy", + "fantastic", + "far", + "faraway", + "farcical", + "farsighted", + "fascinated", + "fascinating", + "fascistic", + "fashionable", + "fast", + "fastest", + "fastidious", + "fat", + "fatal", + "fateful", + "fatherly", + "fathomable", + "fathomless", + "fatigued", + "faulty", + "favorable", + "favorite", + "fawning", + "feared", + "fearful", + "fearless", + "fearsome", + "feathered", + "feathery", + "feckless", + "federal", + "feeble", + "feebleminded", + "feeling", + "feigned", + "feisty", + "felonious", + "female", + "feminine", + "fermented", + "ferocious", + "fertile", + "fervent", + "fervid", + "festive", + "festive", + "fetching", + "fetid", + "feudal", + "feverish", + "few", + "fewer", + "fictional", + "fictitious", + "fidgeting", + "fidgety", + "fiendish", + "fierce", + "fiery", + "fifth", + "filmy", + "filtered", + "filthy", + "final", + "financial", + "fine", + "finicky", + "finite", + "fireproof", + "firm", + "first", + "fiscal", + "fishy", + "fit", + "fitted", + "fitting", + "five", + "fixable", + "fixed", + "flabby", + "flagrant", + "flaky", + "flamboyant", + "flaming", + "flammable", + "flashy", + "flat", + "flattened", + "flattered", + "flattering", + "flavored", + "flavorful", + "flavorless", + "flawed", + "flawless", + "fleeting", + "flexible", + "flickering", + "flimsy", + "flippant", + "flirtatious", + "floating", + "flooded", + "floppy", + "floral", + "flowering", + "flowery", + "fluent", + "fluffy", + "fluffy", + "flushed", + "fluttering", + "flying", + "foamy", + "focused", + "foggy", + "folded", + "following", + "fond", + "foolhardy", + "foolish", + "forbidding", + "forceful", + "foreboding", + "foregoing", + "foreign", + "forensic", + "foreseeable", + "forged", + "forgetful", + "forgettable", + "forgivable", + "forgiving", + "forgotten", + "forked", + "formal", + "formative", + "former", + "formidable", + "formless", + "formulaic", + "forthright", + "fortuitous", + "fortunate", + "forward", + "foul", + "four", + "fourth", + "foxy", + "fractional", + "fractious", + "fragile", + "fragmented", + "fragrant", + "frail", + "frank", + "frantic", + "fraternal", + "fraudulent", + "frayed", + "freakish", + "freaky", + "freckled", + "free", + "freezing", + "frequent", + "fresh", + "fretful", + "fried", + "friendly", + "frightened", + "frightening", + "frightful", + "frigid", + "frilly", + "frisky", + "frivolous", + "front", + "frosty", + "frothy", + "frowning", + "frozen", + "frugal", + "fruitful", + "fruitless", + "fruity", + "frumpy", + "frustrated", + "frustrating", + "fulfilled", + "fulfilling", + "full", + "fumbling", + "fuming", + "fun", + "functional", + "fundamental", + "funky", + "funniest", + "funny", + "furious", + "furry", + "furthest", + "furtive", + "fussy", + "futile", + "future", + "futuristic", + "fuzzy", + "gabby", + "gainful", + "gallant", + "galling", + "game", + "gangly", + "gaping", + "garbled", + "gargantuan", + "garish", + "garrulous", + "gaseous", + "gasping", + "gaudy", + "gaunt", + "gauzy", + "gawky", + "general", + "generative", + "generic", + "generous", + "genial", + "gentle", + "genuine", + "geographic", + "geologic", + "geometric", + "geriatric", + "ghastly", + "ghostly", + "ghoulish", + "giant", + "giddy", + "gifted", + "gigantic", + "giggling", + "gilded", + "giving", + "glad", + "glamorous", + "glaring", + "glass", + "glassy", + "gleaming", + "glib", + "glistening", + "glittering", + "glittery", + "global", + "globular", + "gloomy", + "glorious", + "glossy", + "glowing", + "gluey", + "glum", + "gluttonous", + "gnarly", + "gold", + "golden", + "good", + "gooey", + "gooey", + "goofy", + "goofy", + "gorgeous", + "graceful", + "gracious", + "gradual", + "grainy", + "grand", + "grandiose", + "graphic", + "grateful", + "gratified", + "gratifying", + "grating", + "gratis", + "gratuitous", + "grave", + "gray", + "greasy", + "great", + "greatest", + "greedy", + "green", + "gregarious", + "grey", + "grieving", + "grim", + "grimacing", + "grimy", + "grinding", + "grinning", + "gripping", + "gritty", + "grizzled", + "groaning", + "groggy", + "groomed", + "groovy", + "groovy", + "gross", + "grotesque", + "grouchy", + "growling", + "grubby", + "grueling", + "gruesome", + "gruff", + "grumbling", + "grumpy", + "guaranteed", + "guarded", + "guiltless", + "guilty", + "gullible", + "gurgling", + "gushing", + "gushy", + "gusty", + "gutsy", + "habitable", + "habitual", + "haggard", + "hairless", + "hairy", + "half", + "halfhearted", + "hallowed", + "halting", + "handsome", + "handy", + "hanging", + "haphazard", + "hapless", + "happy", + "hard", + "hardworking", + "hardy", + "harebrained", + "harmful", + "harmless", + "harmonic", + "harmonious", + "harried", + "harsh", + "hasty", + "hated", + "hateful", + "haughty", + "haunting", + "hawkish", + "hazardous", + "hazy", + "head", + "heady", + "healthy", + "heartbreaking", + "heartbroken", + "heartless", + "heartrending", + "hearty", + "heated", + "heavenly", + "heavy", + "hectic", + "hefty", + "heinous", + "helpful", + "helpless", + "her", + "heroic", + "hesitant", + "hideous", + "high", + "highest", + "highfalutin", + "hilarious", + "his", + "hissing", + "historical", + "hoarse", + "hoggish", + "holiday", + "holistic", + "hollow", + "home", + "homeless", + "homely", + "homeopathic", + "homey", + "homogeneous", + "honest", + "honking", + "honorable", + "hopeful", + "hopeless", + "horizontal", + "hormonal", + "horned", + "horrendous", + "horrible", + "horrid", + "horrific", + "horrified", + "horrifying", + "hospitable", + "hostile", + "hot", + "hot", + "hotheaded", + "house", + "howling", + "huffy", + "huge", + "huggable", + "hulking", + "human", + "humanitarian", + "humanlike", + "humble", + "humdrum", + "humid", + "humiliated", + "humiliating", + "humming", + "humongous", + "humorless", + "humorous", + "hungry", + "hurried", + "hurt", + "hurtful", + "hushed", + "husky", + "hydraulic", + "hydrothermal", + "hygienic", + "hyperbolic", + "hypercritical", + "hyperirritable", + "hypersensitive", + "hypertensive", + "hypnotic", + "hypnotizable", + "hypothetical", + "hysterical", + "icky", + "iconoclastic", + "icy", + "ideal", + "idealistic", + "identical", + "identifiable", + "idiosyncratic", + "idiotic", + "idyllic", + "ignorable", + "ignorant", + "ill", + "illegal", + "illegible", + "illegitimate", + "illicit", + "illiterate", + "illogical", + "illuminating", + "illusive", + "illustrious", + "imaginable", + "imaginary", + "imaginative", + "imitative", + "immaculate", + "immanent", + "immature", + "immeasurable", + "immediate", + "immense", + "immensurable", + "imminent", + "immobile", + "immodest", + "immoral", + "immortal", + "immovable", + "impartial", + "impassable", + "impassioned", + "impatient", + "impeccable", + "impenetrable", + "imperative", + "imperceptible", + "imperceptive", + "imperfect", + "imperial", + "imperialistic", + "impermeable", + "impersonal", + "impertinent", + "impervious", + "impetuous", + "impish", + "implausible", + "implicit", + "implosive", + "impolite", + "imponderable", + "important", + "imported", + "imposing", + "impossible", + "impoverished", + "impractical", + "imprecise", + "impressionable", + "impressive", + "improbable", + "improper", + "improvable", + "improved", + "improving", + "imprudent", + "impulsive", + "impure", + "inaccessible", + "inaccurate", + "inactive", + "inadequate", + "inadmissible", + "inadvertent", + "inadvisable", + "inalienable", + "inalterable", + "inane", + "inanimate", + "inapplicable", + "inappropriate", + "inapt", + "inarguable", + "inarticulate", + "inartistic", + "inattentive", + "inaudible", + "inauspicious", + "incalculable", + "incandescent", + "incapable", + "incessant", + "incidental", + "inclusive", + "incoherent", + "incomparable", + "incompatible", + "incompetent", + "incomplete", + "incomprehensible", + "inconceivable", + "inconclusive", + "incongruent", + "incongruous", + "inconsequential", + "inconsiderable", + "inconsiderate", + "inconsistent", + "inconsolable", + "inconspicuous", + "incontrovertible", + "inconvenient", + "incorrect", + "incorrigible", + "incorruptible", + "increasing", + "incredible", + "incredulous", + "incremental", + "incurable", + "indecent", + "indecipherable", + "indecisive", + "indefensible", + "indefinable", + "indefinite", + "indelible", + "independent", + "indescribable", + "indestructible", + "indeterminable", + "indeterminate", + "indicative", + "indifferent", + "indigenous", + "indignant", + "indirect", + "indiscreet", + "indiscriminate", + "indispensable", + "indisputable", + "indistinct", + "individual", + "individualistic", + "indivisible", + "indomitable", + "inductive", + "indulgent", + "industrial", + "industrious", + "ineffective", + "ineffectual", + "inefficient", + "inelegant", + "ineloquent", + "inequitable", + "inert", + "inescapable", + "inevitable", + "inexact", + "inexcusable", + "inexhaustible", + "inexpedient", + "inexpensive", + "inexplicable", + "inexpressible", + "inexpressive", + "inextricable", + "infallible", + "infamous", + "infantile", + "infatuated", + "infected", + "infectious", + "inferable", + "inferior", + "infernal", + "infinite", + "infinitesimal", + "inflamed", + "inflammable", + "inflammatory", + "inflatable", + "inflated", + "inflexible", + "influential", + "informal", + "informative", + "informed", + "infrequent", + "infuriated", + "infuriating", + "ingenious", + "ingenuous", + "inglorious", + "ingratiating", + "inhabitable", + "inharmonious", + "inherent", + "inhibited", + "inhospitable", + "inhuman", + "inhumane", + "initial", + "injudicious", + "injured", + "injurious", + "innate", + "inner", + "innocent", + "innocuous", + "innovative", + "innumerable", + "inoffensive", + "inoperable", + "inoperative", + "inopportune", + "inordinate", + "inorganic", + "inquiring", + "inquisitive", + "insane", + "insatiable", + "inscrutable", + "insecure", + "insensible", + "insensitive", + "inseparable", + "inside", + "insidious", + "insightful", + "insignificant", + "insincere", + "insipid", + "insistent", + "insolent", + "inspirational", + "inspired", + "inspiring", + "instant", + "instantaneous", + "instinctive", + "instinctual", + "institutional", + "instructive", + "instrumental", + "insubordinate", + "insufferable", + "insufficient", + "insulted", + "insulting", + "insurable", + "insurmountable", + "intangible", + "integral", + "intellectual", + "intelligent", + "intelligible", + "intended", + "intense", + "intensive", + "intentional", + "interactive", + "interchangeable", + "interdepartmental", + "interdependent", + "interested", + "interesting", + "interior", + "intermediate", + "intermittent", + "internal", + "international", + "interpersonal", + "interracial", + "intestinal", + "intimate", + "intimidating", + "intolerable", + "intolerant", + "intravenous", + "intrepid", + "intricate", + "intrigued", + "intriguing", + "intrinsic", + "introductory", + "introspective", + "introverted", + "intrusive", + "intuitive", + "invalid", + "invaluable", + "invasive", + "inventive", + "invigorating", + "invincible", + "invisible", + "invited", + "inviting", + "involuntary", + "involved", + "inward", + "irascible", + "irate", + "iridescent", + "irksome", + "iron", + "ironic", + "irrational", + "irreconcilable", + "irrefutable", + "irregular", + "irrelative", + "irrelevant", + "irremovable", + "irreparable", + "irreplaceable", + "irrepressible", + "irresistible", + "irresponsible", + "irretrievably", + "irreverent", + "irreversible", + "irrevocable", + "irritable", + "irritated", + "irritating", + "isolated", + "itchy", + "its", + "jabbering", + "jaded", + "jagged", + "jarring", + "jaundiced", + "jazzy", + "jazzy", + "jealous", + "jeering", + "jerky", + "jiggling", + "jittery", + "jobless", + "jocular", + "joint", + "jolly", + "jovial", + "joyful", + "joyless", + "joyous", + "jubilant", + "judgmental", + "judicious", + "juicy", + "jumbled", + "jumpy", + "junior", + "just", + "justifiable", + "juvenile", + "kaput", + "keen", + "key", + "kind", + "kindhearted", + "kindly", + "kinesthetic", + "kingly", + "kitchen", + "knavish", + "knightly", + "knobbed", + "knobby", + "knotty", + "knowable", + "knowing", + "knowledgeable", + "known", + "labored", + "laborious", + "lackadaisical", + "lacking", + "lacy", + "lame", + "lamentable", + "languid", + "languishing", + "lanky", + "larcenous", + "large", + "larger", + "largest", + "lascivious", + "last", + "lasting", + "late", + "latent", + "later", + "lateral", + "latest", + "latter", + "laudable", + "laughable", + "laughing", + "lavish", + "lawful", + "lawless", + "lax", + "lazy", + "lead", + "leading", + "lean", + "learnable", + "learned", + "leased", + "least", + "leather", + "leathery", + "lecherous", + "leering", + "left", + "legal", + "legendary", + "legible", + "legislative", + "legitimate", + "lengthy", + "lenient", + "less", + "lesser", + "lethal", + "lethargic", + "level", + "liable", + "libelous", + "liberal", + "licensed", + "life", + "lifeless", + "lifelike", + "lifelong", + "light", + "lighthearted", + "likable", + "likeable", + "likely", + "limber", + "limited", + "limitless", + "limp", + "limping", + "linear", + "lined", + "lingering", + "linguistic", + "liquid", + "listless", + "literal", + "literary", + "literate", + "lithe", + "lithographic", + "litigious", + "little", + "livable", + "live", + "lively", + "livid", + "living", + "loathsome", + "local", + "locatable", + "locked", + "lofty", + "logarithmic", + "logical", + "logistic", + "lonely", + "long", + "longer", + "longest", + "longing", + "loose", + "lopsided", + "loquacious", + "lordly", + "lost", + "loud", + "lousy", + "loutish", + "lovable", + "loveable", + "lovely", + "loving", + "low", + "lower", + "lowly", + "loyal", + "lucent", + "lucid", + "lucky", + "lucrative", + "ludicrous", + "lukewarm", + "lulling", + "luminescent", + "luminous", + "lumpy", + "lurid", + "luscious", + "lush", + "lustrous", + "luxurious", + "lying", + "lyrical", + "macabre", + "Machiavellian", + "macho", + "mad", + "maddening", + "magenta", + "magic", + "magical", + "magnanimous", + "magnetic", + "magnificent", + "maiden", + "main", + "maintainable", + "majestic", + "major", + "makeable", + "makeshift", + "maladjusted", + "male", + "malevolent", + "malicious", + "malignant", + "malleable", + "mammoth", + "manageable", + "managerial", + "mandatory", + "maneuverable", + "mangy", + "maniacal", + "manic", + "manicured", + "manipulative", + "manual", + "many", + "marbled", + "marginal", + "marked", + "marketable", + "married", + "marshmallowy", + "marvelous", + "masked", + "massive", + "master", + "masterful", + "matchless", + "material", + "materialistic", + "maternal", + "mathematical", + "matronly", + "matted", + "mature", + "maximum", + "meager", + "mean", + "meandering", + "meaningful", + "meaningless", + "measly", + "measurable", + "meaty", + "mechanical", + "medical", + "medicinal", + "meditative", + "medium", + "meek", + "melancholy", + "mellow", + "melodic", + "melodious", + "melodramatic", + "melted", + "memorable", + "menacing", + "menial", + "mental", + "merciful", + "merciless", + "mercurial", + "mere", + "merry", + "messy", + "metabolic", + "metallic", + "metaphoric", + "meteoric", + "meticulous", + "microscopic", + "microwaveable", + "middle", + "midweek", + "mighty", + "mild", + "militant", + "militaristic", + "military", + "milky", + "mincing", + "mindful", + "mindless", + "mini", + "miniature", + "minimal", + "minimum", + "minor", + "minty", + "minute", + "miraculous", + "mirthful", + "miscellaneous", + "mischievous", + "miscreant", + "miserable", + "miserly", + "misguided", + "misleading", + "mission", + "mistaken", + "mistrustful", + "mistrusting", + "misty", + "mixed", + "mnemonic", + "moaning", + "mobile", + "mocking", + "moderate", + "modern", + "modest", + "modified", + "modular", + "moist", + "moldy", + "momentary", + "momentous", + "monetary", + "monopolistic", + "monosyllabic", + "monotone", + "monotonous", + "monstrous", + "monumental", + "moody", + "moral", + "moralistic", + "morbid", + "mordant", + "more", + "moronic", + "morose", + "mortal", + "mortified", + "most", + "mother", + "motherly", + "motionless", + "motivated", + "motivating", + "motivational", + "motor", + "mountain", + "mountainous", + "mournful", + "mouthwatering", + "movable", + "moved", + "moving", + "much", + "muddled", + "muddy", + "muffled", + "muggy", + "multicultural", + "multifaceted", + "multipurpose", + "multitalented", + "mumbled", + "mundane", + "municipal", + "murky", + "muscular", + "mushy", + "musical", + "musky", + "musty", + "mutative", + "mute", + "muted", + "mutinous", + "muttering", + "mutual", + "my", + "myopic", + "mysterious", + "mystic", + "mystical", + "mystified", + "mystifying", + "mythical", + "naive", + "nameless", + "narcissistic", + "narrow", + "nasal", + "nasty", + "national", + "native", + "natural", + "naughty", + "nauseating", + "nauseous", + "nautical", + "navigable", + "near", + "nearby", + "nearest", + "nearsighted", + "neat", + "nebulous", + "necessary", + "needless", + "needy", + "nefarious", + "negative", + "neglected", + "neglectful", + "negligent", + "negligible", + "negotiable", + "neighborly", + "neither", + "nerdy", + "nervous", + "neurological", + "neurotic", + "neutral", + "new", + "newest", + "next", + "nice", + "nifty", + "nightmarish", + "nimble", + "nine", + "ninth", + "nippy", + "no", + "noble", + "nocturnal", + "noiseless", + "noisy", + "nominal", + "nonabrasive", + "nonaggressive", + "nonchalant", + "noncommittal", + "noncompetitive", + "nonconsecutive", + "nondescript", + "nondestructive", + "nonexclusive", + "nonnegotiable", + "nonproductive", + "nonrefundable", + "nonrenewable", + "nonresponsive", + "nonrestrictive", + "nonreturnable", + "nonsensical", + "nonspecific", + "nonstop", + "nontransferable", + "nonverbal", + "nonviolent", + "normal", + "north", + "northeast", + "northerly", + "northwest", + "nostalgic", + "nosy", + "notable", + "noticeable", + "notorious", + "novel", + "noxious", + "null", + "numb", + "numberless", + "numbing", + "numerable", + "numeric", + "numerous", + "nutritional", + "nutritious", + "nutty", + "oafish", + "obedient", + "obeisant", + "obese", + "objectionable", + "objective", + "obligatory", + "obliging", + "oblique", + "oblivious", + "oblong", + "obnoxious", + "obscene", + "obscure", + "observable", + "observant", + "obsessive", + "obsolete", + "obstinate", + "obstructive", + "obtainable", + "obtrusive", + "obtuse", + "obvious", + "occasional", + "occupational", + "occupied", + "oceanic", + "odd", + "odiferous", + "odious", + "odorless", + "odorous", + "offbeat", + "offensive", + "offhanded", + "official", + "officious", + "oily", + "OK", + "okay", + "old", + "older", + "oldest", + "ominous", + "omniscient", + "omnivorous", + "one", + "onerous", + "only", + "opaque", + "open", + "opened", + "openhanded", + "openhearted", + "opening", + "operable", + "operatic", + "operational", + "operative", + "opinionated", + "opportune", + "opportunistic", + "opposable", + "opposed", + "opposing", + "opposite", + "oppressive", + "optimal", + "optimistic", + "optional", + "opulent", + "oral", + "orange", + "ordinary", + "organic", + "organizational", + "original", + "ornamental", + "ornate", + "ornery", + "orphaned", + "orthopedic", + "ossified", + "ostentatious", + "other", + "otherwise", + "our", + "outer", + "outermost", + "outgoing", + "outlandish", + "outraged", + "outrageous", + "outside", + "outspoken", + "outstanding", + "outward", + "oval", + "overactive", + "overaggressive", + "overall", + "overambitious", + "overassertive", + "overbearing", + "overcast", + "overcautious", + "overconfident", + "overcritical", + "overcrowded", + "overemotional", + "overenthusiastic", + "overjoyed", + "overoptimistic", + "overpowering", + "overpriced", + "overprotective", + "overqualified", + "overrated", + "oversensitive", + "oversized", + "overt", + "overwhelmed", + "overwhelming", + "overworked", + "overwrought", + "overzealous", + "own", + "oxymoronic", + "padded", + "painful", + "painless", + "painstaking", + "palatable", + "palatial", + "pale", + "pallid", + "palpable", + "paltry", + "pampered", + "pancakey", + "panicky", + "panoramic", + "paradoxical", + "parallel", + "paranormal", + "parasitic", + "parched", + "pardonable", + "parental", + "parenthetic", + "parking", + "parsimonious", + "partial", + "particular", + "partisan", + "party", + "passing", + "passionate", + "passive", + "past", + "pastoral", + "patched", + "patchy", + "patented", + "paternal", + "paternalistic", + "pathetic", + "pathological", + "patient", + "patriotic", + "patronizing", + "patterned", + "payable", + "peaceable", + "peaceful", + "peculiar", + "pedantic", + "pedestrian", + "peerless", + "peeved", + "peevish", + "penetrable", + "penetrating", + "pensive", + "peppery", + "perceivable", + "perceptible", + "perceptive", + "perceptual", + "peremptory", + "perennial", + "perfect", + "perfumed", + "perilous", + "period", + "periodic", + "peripheral", + "perishable", + "perky", + "permanent", + "permeable", + "permissible", + "permissive", + "pernicious", + "perpendicular", + "perpetual", + "perplexed", + "perplexing", + "persevering", + "persistent", + "personable", + "personal", + "persuasive", + "pert", + "pertinent", + "perturbed", + "perturbing", + "pervasive", + "perverse", + "pessimistic", + "petite", + "pettish", + "petty", + "petulant", + "pharmaceutical", + "phenomenal", + "philanthropic", + "philosophical", + "phobic", + "phonemic", + "phonetic", + "phosphorescent", + "photographic", + "physical", + "physiological", + "picturesque", + "piercing", + "pigheaded", + "pink", + "pious", + "piquant", + "piteous", + "pithy", + "pitiful", + "pitiless", + "pivotal", + "placid", + "plaid", + "plain", + "plane", + "planned", + "plastic", + "platonic", + "plausible", + "playful", + "pleading", + "pleasant", + "pleased", + "pleasing", + "pleasurable", + "plentiful", + "pliable", + "plodding", + "plopping", + "plucky", + "plump", + "pluralistic", + "plus", + "plush", + "pneumatic", + "poetic", + "poignant", + "pointless", + "poised", + "poisonous", + "polished", + "polite", + "political", + "polluted", + "polyunsaturated", + "pompous", + "ponderous", + "poor", + "poorer", + "poorest", + "popping", + "popular", + "populous", + "porous", + "portable", + "portly", + "positive", + "possessive", + "possible", + "post", + "posthumous", + "postoperative", + "potable", + "potent", + "potential", + "powdery", + "powerful", + "powerless", + "practical", + "pragmatic", + "praiseworthy", + "precarious", + "precious", + "precipitous", + "precise", + "precocious", + "preconceived", + "predicative", + "predictable", + "predisposed", + "predominant", + "preeminent", + "preemptive", + "prefabricated", + "preferable", + "preferential", + "pregnant", + "prehistoric", + "prejudiced", + "prejudicial", + "preliminary", + "premature", + "premeditated", + "premium", + "prenatal", + "preoccupied", + "preoperative", + "preparative", + "prepared", + "preposterous", + "prescriptive", + "present", + "presentable", + "presidential", + "pressing", + "pressurized", + "prestigious", + "presumable", + "presumptive", + "presumptuous", + "pretend", + "pretentious", + "pretty", + "prevalent", + "preventable", + "preventative", + "preventive", + "previous", + "priceless", + "pricey", + "prickly", + "prim", + "primary", + "primitive", + "primordial", + "princely", + "principal", + "principled", + "prior", + "prissy", + "pristine", + "private", + "prize", + "prized", + "proactive", + "probabilistic", + "probable", + "problematic", + "procedural", + "prodigious", + "productive", + "profane", + "professed", + "professional", + "professorial", + "proficient", + "profitable", + "profound", + "profuse", + "programmable", + "progressive", + "prohibitive", + "prolific", + "prominent", + "promised", + "promising", + "prompt", + "pronounceable", + "pronounced", + "proof", + "proper", + "prophetic", + "proportional", + "proportionate", + "proportioned", + "prospective", + "prosperous", + "protective", + "prototypical", + "proud", + "proverbial", + "provisional", + "provocative", + "provoking", + "proximal", + "proximate", + "prudent", + "prudential", + "prying", + "psychedelic", + "psychiatric", + "psychological", + "psychosomatic", + "psychotic", + "public", + "puckish", + "puffy", + "pugnacious", + "pumped", + "punctual", + "pungent", + "punishable", + "punitive", + "puny", + "pure", + "purified", + "puritanical", + "purple", + "purported", + "purposeful", + "purposeless", + "purring", + "pushy", + "pusillanimous", + "putrid", + "puzzled", + "puzzling", + "pyrotechnic", + "quackish", + "quacky", + "quaint", + "qualified", + "qualitative", + "quality", + "quantifiable", + "quantitative", + "quarrelsome", + "queasy", + "queenly", + "querulous", + "questionable", + "quick", + "quickest", + "quiet", + "quintessential", + "quirky", + "quirky", + "quivering", + "quizzical", + "quotable", + "rabid", + "racial", + "racist", + "radiant", + "radical", + "radioactive", + "ragged", + "raging", + "rainbow", + "rainy", + "rakish", + "rambling", + "rambunctious", + "rampageous", + "rampant", + "rancid", + "rancorous", + "random", + "rank", + "rapid", + "rapturous", + "rare", + "rascally", + "rash", + "rasping", + "raspy", + "rational", + "ratty", + "ravenous", + "raving", + "ravishing", + "raw", + "reactive", + "ready", + "real", + "realistic", + "reasonable", + "reassured", + "reassuring", + "rebel", + "rebellious", + "receding", + "recent", + "receptive", + "recessive", + "rechargeable", + "reciprocal", + "reckless", + "reclusive", + "recognizable", + "recognized", + "rectangular", + "rectifiable", + "recurrent", + "recyclable", + "red", + "reddish", + "redeemable", + "redolent", + "redundant", + "referential", + "refillable", + "reflective", + "refractive", + "refreshing", + "refundable", + "refurbished", + "refutable", + "regal", + "regional", + "regretful", + "regrettable", + "regular", + "reigning", + "relatable", + "relative", + "relaxed", + "relaxing", + "relentless", + "relevant", + "reliable", + "relieved", + "religious", + "reluctant", + "remaining", + "remarkable", + "remedial", + "reminiscent", + "remorseful", + "remorseless", + "remote", + "removable", + "renegotiable", + "renewable", + "rented", + "repairable", + "repaired", + "repeatable", + "repeated", + "repentant", + "repetitious", + "repetitive", + "replaceable", + "replicable", + "reported", + "reprehensible", + "representative", + "repressive", + "reproachful", + "reproductive", + "republican", + "repugnant", + "repulsive", + "reputable", + "reputed", + "rescued", + "resealable", + "resentful", + "reserved", + "resident", + "residential", + "residual", + "resilient", + "resolute", + "resolvable", + "resonant", + "resounding", + "resourceful", + "respectable", + "respectful", + "respective", + "responsible", + "responsive", + "rested", + "restful", + "restless", + "restored", + "restrained", + "restrictive", + "retired", + "retroactive", + "retrogressive", + "retrospective", + "reusable", + "revamped", + "revealing", + "revengeful", + "reverent", + "reverential", + "reverse", + "reversible", + "reviewable", + "reviled", + "revisable", + "revised", + "revocable", + "revolting", + "revolutionary", + "rewarding", + "rhetorical", + "rhythmic", + "rich", + "richer", + "richest", + "ridiculing", + "ridiculous", + "right", + "righteous", + "rightful", + "rigid", + "rigorous", + "ringing", + "riotous", + "ripe", + "rippling", + "risky", + "ritualistic", + "ritzy", + "riveting", + "roaring", + "roasted", + "robotic", + "robust", + "rocketing", + "roguish", + "romantic", + "roomy", + "rosy", + "rotating", + "rotten", + "rotting", + "rotund", + "rough", + "round", + "roundtable", + "rousing", + "routine", + "rowdy", + "royal", + "ruddy", + "rude", + "rudimentary", + "rueful", + "rugged", + "ruined", + "ruinous", + "rumbling", + "rumpled", + "ruptured", + "rural", + "rusted", + "rustic", + "rustling", + "rusty", + "ruthless", + "rutted", + "saccharin", + "sacred", + "sacrificial", + "sacrilegious", + "sad", + "saddened", + "safe", + "saintly", + "salacious", + "salient", + "salt", + "salted", + "salty", + "salvageable", + "salvaged", + "same", + "sanctimonious", + "sandy", + "sane", + "sanguine", + "sanitary", + "sappy", + "sarcastic", + "sardonic", + "sassy", + "sassy", + "satin", + "satiny", + "satiric", + "satirical", + "satisfactory", + "satisfied", + "satisfying", + "saucy", + "savage", + "savory", + "savvy", + "scalding", + "scaly", + "scandalous", + "scant", + "scanty", + "scarce", + "scared", + "scarred", + "scary", + "scathing", + "scattered", + "scenic", + "scented", + "scheduled", + "schematic", + "scholarly", + "scholastic", + "scientific", + "scintillating", + "scorching", + "scornful", + "scrabbled", + "scraggly", + "scrappy", + "scratched", + "scratchy", + "scrawny", + "screaming", + "screeching", + "scribbled", + "scriptural", + "scruffy", + "scrumptious", + "scrupulous", + "sculpted", + "sculptural", + "scummy", + "sea", + "sealed", + "seamless", + "searching", + "searing", + "seasick", + "seasonable", + "seasonal", + "secluded", + "second", + "secondary", + "secret", + "secretive", + "secular", + "secure", + "secured", + "sedate", + "seditious", + "seductive", + "seedy", + "seeming", + "seemly", + "seething", + "seismic", + "select", + "selected", + "selective", + "selfish", + "selfless", + "sellable", + "semiconscious", + "semiofficial", + "semiprecious", + "semiprofessional", + "senior", + "sensational", + "senseless", + "sensible", + "sensitive", + "sensual", + "sensuous", + "sentimental", + "separate", + "sequential", + "serendipitous", + "serene", + "serial", + "serious", + "serrated", + "serviceable", + "seven", + "seventh", + "several", + "severe", + "shabbiest", + "shabby", + "shaded", + "shadowed", + "shadowy", + "shady", + "shaggy", + "shaky", + "shallow", + "shamefaced", + "shameful", + "shameless", + "shapeless", + "shapely", + "sharp", + "sharpened", + "shattered", + "shattering", + "sheepish", + "sheer", + "sheltered", + "shifty", + "shimmering", + "shining", + "shiny", + "shivering", + "shivery", + "shocked", + "shocking", + "shoddy", + "short", + "shortsighted", + "showy", + "shrewd", + "shrieking", + "shrill", + "shut", + "shy", + "sick", + "sickened", + "sickening", + "sickly", + "signed", + "significant", + "silent", + "silky", + "silly", + "silly", + "silver", + "simian", + "similar", + "simple", + "simpleminded", + "simplified", + "simplistic", + "simultaneous", + "sincere", + "sinful", + "single", + "singular", + "sinister", + "sinuous", + "sisterly", + "six", + "sixth", + "sizable", + "sizzling", + "skeptical", + "sketchy", + "skilled", + "skillful", + "skimpy", + "skinny", + "skittish", + "slanderous", + "slanted", + "slanting", + "sleek", + "sleeping", + "sleepless", + "sleepy", + "slender", + "slick", + "slight", + "slim", + "slimy", + "slippery", + "sloped", + "sloping", + "sloppy", + "slothful", + "slow", + "sluggish", + "slushy", + "sly", + "small", + "smaller", + "smallest", + "smarmy", + "smart", + "smarter", + "smartest", + "smashing", + "smeared", + "smelly", + "smiling", + "smoggy", + "smoked", + "smoky", + "smooth", + "smothering", + "smudged", + "smug", + "snapping", + "snappish", + "snappy", + "snarling", + "snazzy", + "sneaky", + "snide", + "snippy", + "snobbish", + "snoopy", + "snooty", + "snoring", + "snotty", + "snug", + "snuggly", + "soaked", + "soaking", + "soaking", + "soaring", + "sober", + "sociable", + "social", + "socialist", + "sociological", + "soft", + "softhearted", + "soggy", + "solar", + "soldierly", + "sole", + "solemn", + "solicitous", + "solid", + "solitary", + "somatic", + "somber", + "some", + "sonic", + "sonly", + "soothed", + "soothing", + "sophisticated", + "sordid", + "sore", + "sorrowful", + "sorry", + "soulful", + "soulless", + "soundless", + "sour", + "south", + "southeasterly", + "southern", + "southwestern", + "spacious", + "spare", + "sparing", + "sparkling", + "sparkly", + "sparkly", + "sparse", + "spasmodic", + "spastic", + "spatial", + "spattered", + "special", + "specialist", + "specialized", + "specific", + "speckled", + "spectacular", + "spectral", + "speculative", + "speechless", + "speedy", + "spellbinding", + "spendthrift", + "spherical", + "spicy", + "spiffy", + "spiffy", + "spiky", + "spinal", + "spineless", + "spiral", + "spiraled", + "spirited", + "spiritless", + "spiritual", + "spiteful", + "splashing", + "splashy", + "splattered", + "splendid", + "splintered", + "spoiled", + "spoken", + "spongy", + "spontaneous", + "spooky", + "sporadic", + "sporting", + "sportsmanly", + "spotless", + "spotted", + "spotty", + "springy", + "sprite", + "spry", + "spurious", + "squalid", + "squandered", + "square", + "squashed", + "squashy", + "squatting", + "squawking", + "squealing", + "squeamish", + "squeezable", + "squiggly", + "squirming", + "squirrelly", + "squishy", + "stable", + "stackable", + "stacked", + "staggering", + "stagnant", + "stained", + "stale", + "stanch", + "standard", + "standing", + "standoffish", + "starched", + "stark", + "startled", + "startling", + "starving", + "stately", + "static", + "statistical", + "statuesque", + "status", + "statutory", + "staunch", + "steadfast", + "steady", + "stealth", + "steaming", + "steamy", + "steel", + "steely", + "steep", + "stereophonic", + "stereotyped", + "stereotypical", + "sterile", + "stern", + "sticky", + "stiff", + "stifled", + "stifling", + "stigmatic", + "still", + "stilled", + "stilted", + "stimulating", + "stinging", + "stingy", + "stinking", + "stinky", + "stirring", + "stock", + "stodgy", + "stoic", + "stony", + "stormy", + "stout", + "straggly", + "straight", + "straightforward", + "stranded", + "strange", + "strategic", + "streaked", + "street", + "strenuous", + "stressful", + "stretchy", + "strict", + "strident", + "striking", + "stringent", + "striped", + "strong", + "stronger", + "strongest", + "structural", + "stubborn", + "stubby", + "studied", + "studious", + "stuffed", + "stuffy", + "stumbling", + "stunned", + "stunning", + "stupendous", + "sturdy", + "stuttering", + "stylish", + "stylistic", + "suave", + "subconscious", + "subdued", + "subject", + "subjective", + "sublime", + "subliminal", + "submissive", + "subordinate", + "subsequent", + "subservient", + "substantial", + "substantiated", + "substitute", + "subterranean", + "subtitled", + "subtle", + "subversive", + "successful", + "successive", + "succinct", + "succulent", + "such", + "sudden", + "suffering", + "sufficient", + "sugary", + "suggestive", + "suitable", + "sulky", + "sullen", + "sumptuous", + "sunny", + "super", + "superabundant", + "superb", + "supercilious", + "superficial", + "superhuman", + "superior", + "superlative", + "supernatural", + "supersensitive", + "supersonic", + "superstitious", + "supple", + "supportive", + "supposed", + "suppressive", + "supreme", + "sure", + "surgical", + "surly", + "surmountable", + "surprised", + "surprising", + "surrealistic", + "survivable", + "susceptible", + "suspected", + "suspicious", + "sustainable", + "swaggering", + "swanky", + "swaying", + "sweaty", + "sweeping", + "sweet", + "sweltering", + "swift", + "swimming", + "swinish", + "swishing", + "swollen", + "swooping", + "syllabic", + "syllogistic", + "symbiotic", + "symbolic", + "symmetrical", + "sympathetic", + "symptomatic", + "synergistic", + "synonymous", + "syntactic", + "synthetic", + "systematic", + "taboo", + "tacit", + "tacky", + "tactful", + "tactical", + "tactless", + "tactual", + "tainted", + "talented", + "talkative", + "tall", + "taller", + "tallest", + "tame", + "tamed", + "tan", + "tangential", + "tangible", + "tangled", + "tangy", + "tangy", + "tanned", + "tantalizing", + "tapered", + "tardy", + "targeted", + "tarnished", + "tart", + "tasteful", + "tasteless", + "tasty", + "tattered", + "taunting", + "taut", + "taxing", + "teachable", + "tearful", + "tearing", + "teasing", + "technical", + "technological", + "tectonic", + "tedious", + "teenage", + "teensy", + "teeny", + "telegraphic", + "telekinetic", + "telepathic", + "telephonic", + "telescopic", + "telling", + "temperamental", + "temperate", + "tempestuous", + "temporary", + "tempted", + "tempting", + "ten", + "tenable", + "tenacious", + "tender", + "tenderhearted", + "tense", + "tentative", + "tenth", + "tenuous", + "tepid", + "terminal", + "terrestrial", + "terrible", + "terrific", + "terrified", + "terrifying", + "territorial", + "terse", + "tested", + "testy", + "tetchy", + "textual", + "textural", + "thankful", + "thankless", + "that", + "the", + "theatrical", + "their", + "thematic", + "theological", + "theoretical", + "therapeutic", + "thermal", + "these", + "thick", + "thievish", + "thin", + "thinkable", + "third", + "thirsty", + "this", + "thorny", + "thorough", + "those", + "thoughtful", + "thoughtless", + "thrashed", + "threatened", + "threatening", + "three", + "thriftless", + "thrifty", + "thrilled", + "thrilling", + "throbbing", + "thumping", + "thundering", + "thunderous", + "ticking", + "tickling", + "ticklish", + "tidal", + "tidy", + "tight", + "tightfisted", + "time", + "timeless", + "timely", + "timid", + "timorous", + "tiny", + "tipsy", + "tired", + "tireless", + "tiresome", + "tiring", + "tolerable", + "tolerant", + "tonal", + "toneless", + "toothsome", + "toothy", + "top", + "topical", + "topographical", + "tormented", + "torpid", + "torrential", + "torrid", + "torturous", + "total", + "touched", + "touching", + "touchy", + "tough", + "towering", + "toxic", + "traditional", + "tragic", + "trainable", + "trained", + "training", + "traitorous", + "tranquil", + "transcendent", + "transcendental", + "transformational", + "transformative", + "transformed", + "transient", + "transitional", + "transitory", + "translucent", + "transparent", + "transplanted", + "trapped", + "trashed", + "trashy", + "traumatic", + "treacherous", + "treasonable", + "treasonous", + "treasured", + "treatable", + "tremendous", + "tremulous", + "trenchant", + "trendy", + "triangular", + "tribal", + "trick", + "tricky", + "trim", + "tripping", + "trite", + "triumphant", + "trivial", + "tropical", + "troubled", + "troublesome", + "troubling", + "truculent", + "true", + "trusted", + "trustful", + "trusting", + "trustworthy", + "trusty", + "truthful", + "trying", + "tumultuous", + "tuneful", + "tuneless", + "turbulent", + "twinkling", + "twinkly", + "twisted", + "twitchy", + "two", + "typical", + "tyrannical", + "tyrannous", + "ubiquitous", + "ugly", + "ultimate", + "ultraconservative", + "ultrasensitive", + "ultrasonic", + "ultraviolet", + "unabashed", + "unabated", + "unable", + "unacceptable", + "unaccompanied", + "unaccountable", + "unaccustomed", + "unacknowledged", + "unadorned", + "unadulterated", + "unadventurous", + "unadvised", + "unaffected", + "unaffordable", + "unafraid", + "unaggressive", + "unaided", + "unalienable", + "unalterable", + "unaltered", + "unambiguous", + "unanimous", + "unannounced", + "unanswerable", + "unanticipated", + "unapologetic", + "unappealing", + "unappetizing", + "unappreciative", + "unapproachable", + "unashamed", + "unassailable", + "unassertive", + "unassisted", + "unattached", + "unattainable", + "unattractive", + "unauthorized", + "unavailable", + "unavailing", + "unavoidable", + "unbalanced", + "unbearable", + "unbeatable", + "unbeaten", + "unbecoming", + "unbelievable", + "unbelieving", + "unbendable", + "unbending", + "unbiased", + "unblemished", + "unblinking", + "unblushing", + "unbounded", + "unbreakable", + "unbridled", + "uncanny", + "uncaring", + "unceasing", + "unceremonious", + "uncertain", + "unchangeable", + "unchanging", + "uncharacteristic", + "uncharitable", + "uncharted", + "uncivil", + "uncivilized", + "unclassified", + "unclean", + "uncluttered", + "uncomely", + "uncomfortable", + "uncommitted", + "uncommon", + "uncommunicative", + "uncomplaining", + "uncomprehending", + "uncompromising", + "unconcerned", + "unconditional", + "unconfirmed", + "unconquerable", + "unconscionable", + "unconscious", + "unconstitutional", + "unconstrained", + "unconstructive", + "uncontainable", + "uncontrollable", + "unconventional", + "unconvinced", + "unconvincing", + "uncooked", + "uncooperative", + "uncoordinated", + "uncouth", + "uncovered", + "uncreative", + "uncritical", + "undamaged", + "undated", + "undaunted", + "undeclared", + "undefeated", + "undefined", + "undemocratic", + "undeniable", + "undependable", + "underdeveloped", + "underfunded", + "underhanded", + "underprivileged", + "understandable", + "understanding", + "understated", + "understood", + "undeserved", + "undesirable", + "undetected", + "undeterred", + "undeveloped", + "undeviating", + "undifferentiated", + "undignified", + "undiminished", + "undiplomatic", + "undisciplined", + "undiscovered", + "undisguised", + "undisputed", + "undistinguished", + "undivided", + "undoubted", + "unearthly", + "uneasy", + "uneducated", + "unemotional", + "unemployed", + "unencumbered", + "unending", + "unendurable", + "unenforceable", + "unenthusiastic", + "unenviable", + "unequal", + "unequaled", + "unequivocal", + "unerring", + "uneven", + "uneventful", + "unexceptional", + "unexcited", + "unexpected", + "unexplainable", + "unexplored", + "unexpressive", + "unfailing", + "unfair", + "unfaithful", + "unfaltering", + "unfamiliar", + "unfashionable", + "unfathomable", + "unfavorable", + "unfeeling", + "unfettered", + "unfilled", + "unflagging", + "unflappable", + "unflattering", + "unflinching", + "unfocused", + "unforeseeable", + "unforgettable", + "unforgivable", + "unforgiving", + "unfortunate", + "unfriendly", + "unfulfilled", + "ungallant", + "ungenerous", + "ungentlemanly", + "unglamorous", + "ungraceful", + "ungracious", + "ungrateful", + "unguarded", + "unhandsome", + "unhappy", + "unharmed", + "unhealthy", + "unheated", + "unheeded", + "unhelpful", + "unhesitating", + "unhurried", + "uniform", + "unilateral", + "unimaginable", + "unimaginative", + "unimpeachable", + "unimpeded", + "unimpressive", + "unincorporated", + "uninformed", + "uninhabitable", + "uninhibited", + "uninitiated", + "uninjured", + "uninspired", + "uninsurable", + "unintelligent", + "unintelligible", + "unintended", + "unintentional", + "uninterested", + "uninterrupted", + "uninvited", + "unique", + "united", + "universal", + "unjust", + "unjustifiable", + "unkempt", + "unkind", + "unknowing", + "unknown", + "unlawful", + "unlicensed", + "unlikable", + "unlikely", + "unlivable", + "unloved", + "unlucky", + "unmanageable", + "unmanly", + "unmanned", + "unmarketable", + "unmasked", + "unmatched", + "unmemorable", + "unmentionable", + "unmerciful", + "unmistakable", + "unmitigated", + "unmodified", + "unmotivated", + "unnatural", + "unnecessary", + "unnerved", + "unnerving", + "unnoticeable", + "unobserved", + "unobtainable", + "unobtrusive", + "unofficial", + "unopened", + "unopposed", + "unorthodox", + "unostentatious", + "unpalatable", + "unpardonable", + "unpersuasive", + "unperturbed", + "unplanned", + "unpleasant", + "unprecedented", + "unpredictable", + "unpretentious", + "unprincipled", + "unproductive", + "unprofessional", + "unprofitable", + "unpromising", + "unpronounceable", + "unprovoked", + "unqualified", + "unquantifiable", + "unquenchable", + "unquestionable", + "unquestioned", + "unquestioning", + "unraveled", + "unreachable", + "unreadable", + "unrealistic", + "unrealized", + "unreasonable", + "unreceptive", + "unrecognizable", + "unrecognized", + "unredeemable", + "unregulated", + "unrelenting", + "unreliable", + "unremarkable", + "unremitting", + "unrepentant", + "unrepresentative", + "unrepresented", + "unreserved", + "unrespectable", + "unresponsive", + "unrestrained", + "unripe", + "unrivaled", + "unromantic", + "unruffled", + "unruly", + "unsafe", + "unsalvageable", + "unsatisfactory", + "unsatisfied", + "unscheduled", + "unscholarly", + "unscientific", + "unscrupulous", + "unseasonable", + "unseemly", + "unselfish", + "unsettled", + "unsettling", + "unshakable", + "unshapely", + "unsightly", + "unsigned", + "unsinkable", + "unskilled", + "unsociable", + "unsolicited", + "unsolvable", + "unsolved", + "unsophisticated", + "unsound", + "unsparing", + "unspeakable", + "unspoiled", + "unstable", + "unstated", + "unsteady", + "unstoppable", + "unstressed", + "unstructured", + "unsubstantial", + "unsubstantiated", + "unsuccessful", + "unsuitable", + "unsuited", + "unsupervised", + "unsupported", + "unsure", + "unsurpassable", + "unsurpassed", + "unsurprising", + "unsuspected", + "unsuspecting", + "unsustainable", + "unsympathetic", + "unsystematic", + "untainted", + "untamable", + "untamed", + "untapped", + "untenable", + "untested", + "unthinkable", + "unthinking", + "untidy", + "untimely", + "untitled", + "untouchable", + "untraditional", + "untrained", + "untried", + "untroubled", + "untrustworthy", + "untruthful", + "unused", + "unusual", + "unverified", + "unwary", + "unwashed", + "unwatchable", + "unwavering", + "unwholesome", + "unwieldy", + "unwilling", + "unwise", + "unwitting", + "unworkable", + "unworldly", + "unworthy", + "unwritten", + "unyielding", + "upbeat", + "upmost", + "upper", + "uppity", + "upright", + "uproarious", + "upset", + "upsetting", + "upstairs", + "uptight", + "upward", + "urbane", + "urgent", + "usable", + "used", + "useful", + "useless", + "usual", + "utilitarian", + "utopian", + "utter", + "uttermost", + "vacant", + "vacillating", + "vacuous", + "vagabond", + "vagrant", + "vague", + "vain", + "valiant", + "valid", + "valorous", + "valuable", + "vanishing", + "vapid", + "vaporous", + "variable", + "varied", + "various", + "varying", + "vast", + "vegetable", + "vegetarian", + "vegetative", + "vehement", + "velvety", + "velvety", + "venal", + "venerable", + "vengeful", + "venomous", + "venturesome", + "venturous", + "veracious", + "verbal", + "verbose", + "verdant", + "verifiable", + "verified", + "veritable", + "vernacular", + "versatile", + "versed", + "vertical", + "very", + "vexed", + "vexing", + "viable", + "vibrant", + "vibrating", + "vicarious", + "vicious", + "victorious", + "vigilant", + "vigorous", + "vile", + "villainous", + "vindictive", + "vinegary", + "violent", + "violet", + "viperous", + "viral", + "virtual", + "virtuous", + "virulent", + "visceral", + "viscous", + "visible", + "visionary", + "visual", + "vital", + "vitriolic", + "vivacious", + "vivid", + "vocal", + "vocational", + "voiceless", + "volatile", + "volcanic", + "voluminous", + "voluntary", + "voluptuous", + "voracious", + "vulgar", + "vulnerable", + "wacky", + "wacky", + "wailing", + "waiting", + "wakeful", + "wandering", + "wanting", + "wanton", + "warlike", + "warm", + "warmest", + "warning", + "warring", + "wary", + "waspish", + "waste", + "wasted", + "wasteful", + "watchful", + "waterlogged", + "waterproof", + "watertight", + "watery", + "wavering", + "wax", + "waxen", + "weak", + "weakened", + "wealthy", + "wearisome", + "weary", + "wee", + "weedy", + "weekly", + "weightless", + "weighty", + "weird", + "welcoming", + "well", + "west", + "western", + "wet", + "what", + "wheezing", + "which", + "whimpering", + "whimsical", + "whimsical", + "whining", + "whispering", + "whistling", + "white", + "whole", + "wholehearted", + "wholesale", + "wholesome", + "whooping", + "whopping", + "whose", + "wicked", + "wide", + "widespread", + "wiggly", + "wild", + "willful", + "willing", + "wily", + "windy", + "winning", + "winsome", + "winter", + "wintery", + "wiry", + "wise", + "wishful", + "wispy", + "wistful", + "withering", + "witless", + "witty", + "wizardly", + "wobbly", + "woeful", + "wolfish", + "wonderful", + "wondrous", + "wonted", + "wood", + "wooden", + "wooing", + "wool", + "woolen", + "woozy", + "wordless", + "wordy", + "work", + "workable", + "working", + "worldly", + "worn", + "worn", + "worn", + "worried", + "worrisome", + "worrying", + "worse", + "worshipful", + "worst", + "worth", + "worthless", + "worthwhile", + "worthy", + "wounding", + "wrathful", + "wrenching", + "wretched", + "wriggling", + "wriggly", + "wrinkled", + "wrinkly", + "written", + "wrong", + "wrongful", + "wry", + "yawning", + "yearly", + "yearning", + "yellow", + "yelping", + "yielding", + "young", + "younger", + "youngest", + "youthful", + "yummy", + "zany", + "zany", + "zealous", + "zestful", + "zesty", + "zesty", + "zippy", + "zonked", + "zoological" +]; + +// 64 adverbs +const adverbs: string[] = [ + "accidentally", + "anxiously", + "awkwardly", + "calmly", + "carefully", + "cautiously", + "cheerfully", + "clumsily", + "completely", + "confidently", + "deeply", + "deliberately", + "dramatically", + "eagerly", + "easily", + "elegantly", + "enthusiastically", + "eventually", + "faithfully", + "flamboyantly", + "foolishly", + "frantically", + "generously", + "gently", + "gracefully", + "hastily", + "highly", + "hilariously", + "hungrily", + "irritably", + "kindly", + "lethargically", + "loudly", + "mostly", + "mysteriously", + "neatly", + "nonchalantly", + "painfully", + "particularly", + "poorly", + "promptly", + "proudly", + "quickly", + "rapidly", + "recklessly", + "reluctantly", + "repeatedly", + "rudely", + "safely", + "secretly", + "sheepishly", + "silently", + "smoothly", + "stealthily", + "straight", + "strangely", + "strongly", + "suspiciously", + "timidly", + "truly", + "warmly", + "well", + "widely", + "wildly" +]; + +// 5 conjunctions +const conjunctions: string[] = [ + "and", + "because", + "but", + "or", + "while" +]; + +// 1704 nouns +const nouns: string[] = [ + "ability", + "abroad", + "abuse", + "access", + "accident", + "account", + "act", + "action", + "active", + "activity", + "actor", + "ad", + "addition", + "address", + "administration", + "adult", + "advance", + "advantage", + "advertising", + "advice", + "affair", + "affect", + "afternoon", + "age", + "agency", + "agent", + "agreement", + "air", + "airline", + "airplane", + "airport", + "alarm", + "alcohol", + "alternative", + "ambition", + "amount", + "analysis", + "analyst", + "anger", + "angle", + "animal", + "ankle", + "annual", + "answer", + "anxiety", + "anybody", + "anything", + "anywhere", + "apartment", + "appeal", + "appearance", + "apple", + "apples", + "application", + "appointment", + "area", + "argument", + "arm", + "army", + "arrival", + "art", + "article", + "aside", + "ask", + "aspect", + "assignment", + "assist", + "assistance", + "assistant", + "associate", + "association", + "assumption", + "atmosphere", + "attack", + "attempt", + "attention", + "attitude", + "audience", + "author", + "average", + "award", + "awareness", + "baby", + "back", + "background", + "backpack", + "bad", + "bag", + "bagel", + "bake", + "balance", + "ball", + "balloons", + "balls", + "bananas", + "band", + "bandaid", + "bank", + "bar", + "barn", + "base", + "baseball", + "basis", + "basket", + "bat", + "bath", + "bathroom", + "bathtub", + "battery", + "battle", + "beach", + "bead", + "bean", + "bear", + "beat", + "beautiful", + "bed", + "bedroom", + "bee", + "beer", + "beginning", + "being", + "bell", + "belt", + "bench", + "bend", + "benefit", + "bet", + "beyond", + "bicycle", + "bid", + "big", + "bike", + "bill", + "bird", + "birth", + "birthday", + "bit", + "bite", + "bitter", + "black", + "blame", + "blank", + "blanket", + "blind", + "block", + "blocks", + "blood", + "blow", + "blue", + "board", + "boat", + "body", + "bone", + "bonus", + "book", + "books", + "boot", + "boots", + "border", + "boss", + "bother", + "bottle", + "bottom", + "bow", + "bowl", + "box", + "boy", + "boyfriend", + "bracelet", + "brain", + "branch", + "brave", + "bread", + "break", + "breakfast", + "breast", + "breath", + "brick", + "bridge", + "brief", + "brilliant", + "broad", + "broom", + "brother", + "brown", + "brush", + "bubbles", + "bucket", + "buddy", + "budget", + "bug", + "building", + "bunch", + "burn", + "bus", + "business", + "butter", + "butterfly", + "button", + "buy", + "buyer", + "cabinet", + "cable", + "cake", + "calendar", + "call", + "calm", + "camera", + "camp", + "campaign", + "can", + "cancel", + "cancer", + "candidate", + "candle", + "candy", + "cap", + "capital", + "car", + "card", + "care", + "career", + "carpet", + "carrots", + "carry", + "case", + "cash", + "cat", + "catch", + "category", + "cause", + "cd", + "celebration", + "cell", + "cereal", + "chain", + "chair", + "chalk", + "challenge", + "champion", + "championship", + "chance", + "change", + "channel", + "chapter", + "character", + "charge", + "charity", + "chart", + "check", + "cheek", + "cheese", + "chemical", + "chemistry", + "cherry", + "chest", + "chicken", + "child", + "childhood", + "chip", + "chips", + "chocolate", + "choice", + "church", + "cigarette", + "circle", + "city", + "claim", + "class", + "classic", + "classroom", + "clerk", + "click", + "client", + "climate", + "clock", + "closet", + "clothes", + "cloud", + "clown", + "club", + "clue", + "coach", + "coast", + "coat", + "code", + "coffee", + "cold", + "collar", + "collection", + "college", + "comb", + "combination", + "combine", + "comfort", + "comfortable", + "command", + "comment", + "commercial", + "commission", + "committee", + "common", + "communication", + "community", + "company", + "comparison", + "competition", + "complaint", + "complex", + "computer", + "concentrate", + "concept", + "concern", + "concert", + "conclusion", + "condition", + "conference", + "confidence", + "conflict", + "confusion", + "connection", + "consequence", + "consideration", + "consist", + "constant", + "construction", + "contact", + "contest", + "context", + "contract", + "contribution", + "control", + "conversation", + "convert", + "cook", + "cookie", + "cookies", + "copy", + "corn", + "corner", + "cost", + "count", + "counter", + "country", + "county", + "couple", + "courage", + "course", + "court", + "cousin", + "cover", + "cow", + "crack", + "crackers", + "craft", + "crash", + "crayons", + "crazy", + "cream", + "creative", + "credit", + "crew", + "criticism", + "cross", + "crown", + "cry", + "culture", + "cup", + "cupcake", + "currency", + "current", + "curtain", + "curve", + "customer", + "cut", + "cycle", + "damage", + "dance", + "dare", + "dark", + "data", + "database", + "date", + "daughter", + "day", + "dead", + "deal", + "dealer", + "dear", + "death", + "debate", + "debt", + "decision", + "deep", + "definition", + "degree", + "delay", + "delivery", + "demand", + "department", + "departure", + "dependent", + "deposit", + "depression", + "depth", + "description", + "design", + "designer", + "desire", + "desk", + "detail", + "development", + "device", + "devil", + "diamond", + "diaper", + "diet", + "difference", + "difficulty", + "dig", + "dimension", + "dinner", + "dinosaur", + "direction", + "director", + "dirt", + "disaster", + "discipline", + "discount", + "discussion", + "disease", + "dish", + "disk", + "display", + "distance", + "distribution", + "district", + "divide", + "doctor", + "document", + "dog", + "dolls", + "dolphin", + "door", + "dot", + "double", + "doubt", + "doughnut", + "draft", + "drag", + "drama", + "draw", + "drawer", + "drawing", + "dream", + "dress", + "dresser", + "drink", + "drive", + "driver", + "drop", + "drum", + "drunk", + "duck", + "due", + "dump", + "dust", + "duty", + "ear", + "earring", + "earth", + "ease", + "east", + "eat", + "economics", + "economy", + "edge", + "editor", + "education", + "effect", + "effective", + "efficiency", + "effort", + "egg", + "eggs", + "elbow", + "election", + "elephant", + "elevator", + "emergency", + "emotion", + "emphasis", + "employ", + "employee", + "employer", + "employment", + "end", + "energy", + "engine", + "engineer", + "engineering", + "entertainment", + "enthusiasm", + "entrance", + "entry", + "envelope", + "environment", + "equal", + "equipment", + "equivalent", + "error", + "escape", + "essay", + "establishment", + "estate", + "estimate", + "evening", + "event", + "evidence", + "exam", + "examination", + "example", + "exchange", + "excitement", + "excuse", + "exercise", + "exit", + "experience", + "expert", + "explanation", + "expression", + "extension", + "extent", + "external", + "extreme", + "eye", + "eyes", + "face", + "fact", + "factor", + "fail", + "failure", + "fall", + "familiar", + "family", + "fan", + "farm", + "farmer", + "fat", + "father", + "fault", + "fear", + "feather", + "feature", + "fee", + "feed", + "feedback", + "feel", + "feeling", + "feet", + "female", + "fence", + "few", + "field", + "fight", + "figure", + "file", + "fill", + "film", + "final", + "finance", + "finding", + "finger", + "fingernail", + "fingers", + "finish", + "fire", + "fish", + "fishing", + "fix", + "flashlight", + "flight", + "floor", + "flow", + "flower", + "fly", + "focus", + "fold", + "following", + "food", + "foot", + "football", + "force", + "forever", + "fork", + "form", + "formal", + "fortune", + "foundation", + "frame", + "freedom", + "friend", + "friendship", + "fries", + "frog", + "front", + "fruit", + "fuel", + "fun", + "function", + "funeral", + "funny", + "future", + "gain", + "game", + "gap", + "garage", + "garbage", + "garden", + "gas", + "gate", + "gather", + "gear", + "gene", + "general", + "ghost", + "gift", + "giraffe", + "girl", + "girlfriend", + "give", + "glad", + "glass", + "glasses", + "glove", + "glue", + "go", + "goal", + "god", + "gold", + "golf", + "good", + "government", + "grab", + "grade", + "grand", + "grandfather", + "grandmother", + "grapes", + "grass", + "great", + "green", + "grocery", + "ground", + "group", + "growth", + "guarantee", + "guard", + "guess", + "guest", + "guidance", + "guide", + "guitar", + "guy", + "habit", + "hair", + "half", + "hall", + "hamburger", + "hammer", + "hand", + "handle", + "hands", + "hang", + "hanger", + "harm", + "hat", + "hate", + "head", + "health", + "hearing", + "heart", + "heat", + "heavy", + "height", + "helicopter", + "hell", + "hello", + "help", + "hide", + "high", + "highlight", + "highway", + "hips", + "hire", + "historian", + "history", + "hit", + "hold", + "hole", + "holiday", + "home", + "homework", + "honey", + "hook", + "hoop", + "hope", + "horror", + "horse", + "hose", + "hospital", + "host", + "hotdog", + "hotel", + "hour", + "house", + "housing", + "human", + "hunt", + "hurry", + "hurt", + "husband", + "ice", + "idea", + "ideal", + "if", + "illegal", + "image", + "imagination", + "impact", + "implement", + "importance", + "impress", + "impression", + "improvement", + "incident", + "income", + "increase", + "independence", + "independent", + "indication", + "individual", + "industry", + "inevitable", + "inflation", + "influence", + "information", + "initial", + "initiative", + "injury", + "insect", + "inside", + "inspection", + "inspector", + "instance", + "instruction", + "insurance", + "intention", + "interaction", + "interest", + "internal", + "international", + "internet", + "interview", + "introduction", + "investment", + "invite", + "iron", + "island", + "issue", + "it", + "item", + "jacket", + "job", + "join", + "joint", + "joke", + "judge", + "judgment", + "juice", + "jump", + "jump rope", + "junior", + "jury", + "kangaroo", + "keep", + "key", + "keys", + "kick", + "kid", + "kill", + "kind", + "king", + "kiss", + "kitchen", + "knee", + "knife", + "knowledge", + "lab", + "lack", + "ladder", + "lady", + "lake", + "lamp", + "land", + "landscape", + "language", + "laugh", + "law", + "lawyer", + "lay", + "layer", + "lead", + "leader", + "leadership", + "leading", + "leaf", + "league", + "leather", + "leave", + "lecture", + "leg", + "length", + "lesson", + "let", + "letter", + "level", + "library", + "lie", + "life", + "lift", + "light", + "limit", + "line", + "link", + "lion", + "lip", + "list", + "listen", + "literature", + "living", + "lizard", + "load", + "loan", + "local", + "location", + "lock", + "log", + "long", + "look", + "loss", + "love", + "low", + "luck", + "lunch", + "machine", + "magazine", + "mail", + "mailbox", + "main", + "maintenance", + "major", + "make", + "male", + "mall", + "man", + "management", + "manager", + "manner", + "manufacturer", + "many", + "map", + "march", + "mark", + "marker", + "market", + "marketing", + "marriage", + "master", + "match", + "mate", + "material", + "math", + "matter", + "maximum", + "maybe", + "meal", + "meaning", + "measurement", + "meat", + "media", + "medicine", + "medium", + "meet", + "meeting", + "member", + "membership", + "memory", + "mention", + "menu", + "mess", + "message", + "metal", + "method", + "microphone", + "middle", + "midnight", + "might", + "milk", + "mind", + "mine", + "minimum", + "minor", + "minute", + "mirror", + "miss", + "mission", + "mistake", + "mix", + "mixture", + "mobile", + "mode", + "model", + "mom", + "moment", + "money", + "monitor", + "monkey", + "month", + "mood", + "moon", + "morning", + "mortgage", + "most", + "mother", + "motor", + "motorcycle", + "mountain", + "mouse", + "mouth", + "move", + "movie", + "mud", + "muscle", + "music", + "nail", + "name", + "napkin", + "nasty", + "nation", + "national", + "native", + "natural", + "nature", + "neat", + "necessary", + "neck", + "necklace", + "negative", + "negotiation", + "nerve", + "nest", + "net", + "network", + "news", + "newspaper", + "night", + "nobody", + "noise", + "normal", + "north", + "nose", + "note", + "nothing", + "notice", + "novel", + "number", + "nurse", + "object", + "objective", + "obligation", + "occasion", + "octopus", + "offer", + "office", + "officer", + "official", + "oil", + "opening", + "operation", + "opinion", + "opportunity", + "opposite", + "option", + "orange", + "oranges", + "order", + "ordinary", + "organization", + "original", + "other", + "outcome", + "outside", + "oven", + "owl", + "owner", + "pace", + "pack", + "package", + "page", + "pain", + "paint", + "painting", + "paints", + "pair", + "pajamas", + "pan", + "panic", + "pants", + "paper", + "parent", + "park", + "parking", + "part", + "particular", + "partner", + "party", + "pass", + "passage", + "passenger", + "passion", + "past", + "path", + "patience", + "patient", + "pattern", + "pause", + "pay", + "payment", + "peace", + "peak", + "pear", + "peas", + "pen", + "penalty", + "pencil", + "pension", + "people", + "percentage", + "perception", + "performance", + "period", + "permission", + "permit", + "person", + "personal", + "personality", + "perspective", + "phase", + "philosophy", + "phone", + "photo", + "phrase", + "physical", + "physics", + "piano", + "pick", + "picture", + "pie", + "piece", + "pig", + "pillow", + "pin", + "pipe", + "pirate", + "pitch", + "pizza", + "place", + "plan", + "plane", + "plant", + "plastic", + "plate", + "platform", + "play", + "player", + "pleasure", + "plenty", + "poem", + "poet", + "poetry", + "point", + "police", + "policy", + "politics", + "pollution", + "pool", + "pop", + "popcorn", + "popsicle", + "population", + "position", + "positive", + "possession", + "possibility", + "possible", + "post", + "pot", + "potato", + "potatoes", + "potential", + "pound", + "power", + "practice", + "preference", + "preparation", + "presence", + "present", + "presentation", + "president", + "press", + "pressure", + "pretzel", + "price", + "pride", + "priest", + "primary", + "princess", + "principle", + "print", + "prior", + "priority", + "private", + "prize", + "problem", + "procedure", + "process", + "produce", + "product", + "profession", + "professional", + "professor", + "profile", + "profit", + "program", + "progress", + "project", + "promise", + "promotion", + "prompt", + "proof", + "property", + "proposal", + "protection", + "psychology", + "public", + "pudding", + "pull", + "pumpkin", + "punch", + "puppets", + "purchase", + "purple", + "purpose", + "purse", + "push", + "put", + "puzzles", + "quality", + "quantity", + "quarter", + "queen", + "question", + "quiet", + "quit", + "quote", + "rabbit", + "race", + "radio", + "rain", + "rainbow", + "raise", + "raisins", + "range", + "rate", + "ratio", + "raw", + "reach", + "reaction", + "read", + "reading", + "reality", + "reason", + "reception", + "recipe", + "recognition", + "recommendation", + "record", + "recording", + "recover", + "red", + "reference", + "reflection", + "refrigerator", + "refuse", + "region", + "register", + "regret", + "regular", + "relation", + "relationship", + "relative", + "release", + "relief", + "remote", + "remove", + "rent", + "repair", + "repeat", + "replacement", + "reply", + "report", + "representative", + "republic", + "reputation", + "request", + "requirement", + "research", + "reserve", + "resident", + "resist", + "resolution", + "resolve", + "resort", + "resource", + "respect", + "respond", + "response", + "responsibility", + "rest", + "restaurant", + "result", + "return", + "reveal", + "revenue", + "review", + "revolution", + "reward", + "rice", + "rich", + "ride", + "ring", + "rip", + "rise", + "risk", + "river", + "road", + "rock", + "role", + "roll", + "roof", + "room", + "rope", + "rough", + "round", + "routine", + "row", + "royal", + "rub", + "ruin", + "rule", + "run", + "rush", + "sad", + "safe", + "safety", + "sail", + "salad", + "salary", + "sale", + "salt", + "sample", + "sand", + "sandwich", + "satisfaction", + "save", + "savings", + "scale", + "scene", + "schedule", + "scheme", + "school", + "science", + "scissors", + "scooter", + "score", + "scratch", + "screen", + "screw", + "script", + "sea", + "search", + "season", + "seat", + "second", + "secret", + "secretary", + "section", + "sector", + "security", + "selection", + "self", + "sell", + "senior", + "sense", + "sensitive", + "sentence", + "series", + "serve", + "service", + "session", + "set", + "setting", + "sex", + "shake", + "shame", + "shampoo", + "shape", + "share", + "she", + "sheep", + "shelter", + "shift", + "shine", + "ship", + "shirt", + "shock", + "shoe", + "shoes", + "shoot", + "shop", + "shopping", + "shorts", + "shot", + "shoulder", + "shoulders", + "shovel", + "show", + "shower", + "sick", + "side", + "sign", + "signal", + "signature", + "significance", + "silly", + "silver", + "simple", + "sing", + "singer", + "single", + "sink", + "sir", + "sister", + "site", + "situation", + "size", + "skateboard", + "skill", + "skin", + "skirt", + "sky", + "sleep", + "slice", + "slide", + "slinky", + "slip", + "smell", + "smile", + "smoke", + "snake", + "snow", + "soap", + "society", + "sock", + "socks", + "soda", + "sofa", + "soft", + "software", + "soil", + "solid", + "solution", + "somewhere", + "son", + "song", + "sort", + "sound", + "soup", + "source", + "south", + "space", + "spaghetti", + "spare", + "speaker", + "special", + "specialist", + "specific", + "speech", + "speed", + "spell", + "spend", + "spider", + "spiderweb", + "spirit", + "spiritual", + "spite", + "split", + "spoon", + "sport", + "spot", + "spray", + "spread", + "spring", + "square", + "squirrel", + "stable", + "staff", + "stage", + "stairs", + "stamps", + "stand", + "standard", + "star", + "stars", + "start", + "state", + "statement", + "station", + "status", + "stay", + "steak", + "steal", + "step", + "stick", + "sticker", + "still", + "stock", + "stomach", + "stool", + "stop", + "storage", + "store", + "storm", + "story", + "stove", + "strain", + "stranger", + "strategy", + "straw", + "strawberries", + "street", + "strength", + "stress", + "stretch", + "strike", + "string", + "strip", + "stroke", + "structure", + "struggle", + "student", + "studio", + "study", + "stuff", + "stupid", + "style", + "subject", + "substance", + "success", + "suck", + "sugar", + "suggestion", + "suit", + "suitcase", + "summer", + "sun", + "sunglasses", + "supermarket", + "support", + "surgery", + "surprise", + "surround", + "survey", + "suspect", + "sweater", + "sweet", + "swim", + "swimming", + "swimsuit", + "swing", + "switch", + "sympathy", + "system", + "table", + "tackle", + "taco", + "tale", + "talk", + "tank", + "tap", + "tape", + "target", + "task", + "taste", + "tax", + "tea", + "teach", + "teacher", + "teaching", + "team", + "teapot", + "tear", + "technology", + "teddybear", + "teeth", + "telephone", + "television", + "tell", + "temperature", + "temporary", + "tennis", + "tension", + "term", + "test", + "text", + "thanks", + "theme", + "theory", + "thing", + "thought", + "throat", + "ticket", + "tie", + "tiger", + "till", + "time", + "tip", + "title", + "today", + "toe", + "toes", + "toilet", + "tomatoes", + "tomorrow", + "tone", + "tongue", + "tonight", + "tool", + "tooth", + "toothbrush", + "top", + "topic", + "total", + "touch", + "tough", + "tour", + "tourist", + "towel", + "towels", + "tower", + "town", + "toy", + "track", + "tractor", + "trade", + "tradition", + "traffic", + "train", + "trainer", + "training", + "transition", + "transportation", + "trash", + "travel", + "treat", + "tree", + "triangle", + "trick", + "tricycle", + "trip", + "trouble", + "truck", + "trust", + "truth", + "try", + "tummy", + "tune", + "turn", + "turtle", + "tv", + "twist", + "type", + "umbrella", + "uncle", + "understanding", + "underwear", + "union", + "unique", + "unit", + "university", + "upper", + "upstairs", + "use", + "user", + "usual", + "vacation", + "vacuum", + "valuable", + "value", + "variation", + "variety", + "vast", + "vegetable", + "vehicle", + "version", + "video", + "view", + "village", + "virus", + "visit", + "visual", + "voice", + "volume", + "waffle", + "wagon", + "wait", + "wake", + "walk", + "wall", + "war", + "warning", + "wash", + "washcloth", + "watch", + "water", + "wave", + "way", + "weakness", + "wealth", + "wear", + "weather", + "web", + "wedding", + "week", + "weekend", + "weight", + "weird", + "welcome", + "west", + "western", + "wheel", + "whereas", + "while", + "whistle", + "white", + "whole", + "wife", + "will", + "win", + "wind", + "window", + "wine", + "wing", + "winner", + "winter", + "wish", + "witness", + "woman", + "wonder", + "wood", + "word", + "work", + "worker", + "working", + "world", + "worry", + "worth", + "wrap", + "writer", + "writing", + "yard", + "year", + "yellow", + "yesterday", + "yogurt", + "you", + "young", + "youth", + "yoyo", + "zebra", + "zipper", + "zone" +]; + +// 158 subdomain names, cat adjectives +const subdomains: string[] = [ + "active", + "affectionate", + "agile", + "agreeable", + "alert", + "amusing", + "anxious", + "beautiful", + "behavioral", + "beloved", + "best", + "big", + "bossy", + "bright", + "calico", + "calm", + "caring", + "catlike", + "cheerful", + "chill", + "chubby", + "clean", + "clever", + "clumsy", + "comic", + "courageous", + "crafty", + "crazy", + "cuddly", + "curious", + "cute", + "daring", + "delicate", + "demanding", + "dependent", + "devoted", + "domestic", + "domesticated", + "dominant", + "entertaining", + "faithful", + "fast", + "feline", + "fixed", + "fluffy", + "foolish", + "friendly", + "frisky", + "fun", + "funny", + "furry", + "fuzzy", + "gentle", + "giant", + "good", + "goofy", + "gorgeous", + "graceful", + "greedy", + "grumpy", + "handsome", + "happy", + "healthy", + "heartwarming", + "hilarious", + "housebroken", + "huggable", + "hungry", + "independent", + "instinctual", + "intelligent", + "jolly", + "joyful", + "keen", + "kindhearted", + "kingly", + "laidback", + "lazy", + "likable", + "little", + "lovable", + "loved", + "loving", + "loyal", + "mellow", + "merry", + "mischievous", + "moody", + "muscular", + "mysterious", + "naughty", + "needy", + "neurotic", + "neutered", + "orange", + "outgoing", + "pampered", + "perfect", + "personable", + "picky", + "playful", + "pleasant", + "pouncing", + "precious", + "pretty", + "priceless", + "protective", + "purebred", + "purrfect", + "purring", + "queenly", + "quick", + "quiet", + "quirky", + "rebellious", + "regal", + "relaxed", + "rescued", + "rubbing", + "scratchable", + "scrawny", + "scruffy", + "sensitive", + "shiny", + "shy", + "silly", + "sleek", + "sleepy", + "smart", + "small", + "sneaky", + "snuggly", + "soft", + "spayed", + "spoiled", + "spotted", + "spry", + "stray", + "stubborn", + "submissive", + "sultry", + "superior", + "sweet", + "tabby", + "temperamental", + "territorial", + "timid", + "tortoiseshell", + "tough", + "trainable", + "trained", + "trustworthy", + "trusty", + "unique", + "warm", + "wild", + "willing", + "wonderful" +]; + +// 333 verbs, Gerund form +const verbs: string[] = [ + "accepting", + "adding", + "admiring", + "admitting", + "advising", + "agreeing", + "allowing", + "announcing", + "appearing", + "applying", + "appreciating", + "approving", + "arguing", + "arriving", + "asking", + "assuming", + "attacking", + "avoiding", + "baking", + "balancing", + "banning", + "bathing", + "beatboxing", + "beating", + "becoming", + "beginning", + "being", + "believing", + "belonging", + "bending", + "betting", + "binding", + "biting", + "blowing", + "boogying", + "bouncing", + "breakdancing", + "breaking", + "bringing", + "building", + "burning", + "buying", + "calling", + "calming", + "canceling", + "capoeiring", + "carrying", + "catching", + "changing", + "choosing", + "cleaning", + "climbing", + "closing", + "collecting", + "coming", + "committing", + "comparing", + "competing", + "complaining", + "completing", + "concentrating", + "concerning", + "confirming", + "connecting", + "considering", + "consisting", + "consulting", + "continuing", + "contributing", + "controlling", + "cooking", + "copying", + "correcting", + "counting", + "creating", + "crossing", + "crying", + "cutting", + "dancing", + "dealing", + "deciding", + "decreasing", + "defending", + "defining", + "delivering", + "denying", + "depending", + "describing", + "designing", + "destroying", + "developing", + "digging", + "disagreeing", + "disappearing", + "discovering", + "discussing", + "disliking", + "dividing", + "doing", + "doubting", + "dragging", + "drawing", + "dreaming", + "dressing", + "drinking", + "driving", + "dropping", + "drying", + "dying", + "eating", + "educating", + "encouraging", + "ending", + "enjoying", + "entering", + "escaping", + "establishing", + "examining", + "existing", + "expecting", + "explaining", + "exploring", + "expressing", + "extending", + "failing", + "falling", + "feeding", + "feeling", + "fighting", + "finding", + "finishing", + "fitting", + "fixing", + "flailing", + "flipping", + "flying", + "focusing", + "following", + "forcing", + "forgetting", + "forgiving", + "freerunning", + "freezing", + "frying", + "getting", + "giving", + "gliding", + "going", + "grooving", + "growing", + "guessing", + "happening", + "hating", + "having", + "hearing", + "helping", + "hiding", + "hitting", + "holding", + "hoping", + "hopping", + "hugging", + "hurrying", + "identifying", + "ignoring", + "imagining", + "improving", + "including", + "increasing", + "informing", + "insisting", + "introducing", + "inviting", + "joining", + "juggling", + "jumping", + "keeping", + "kicking", + "killing", + "kissing", + "knocking", + "knowing", + "krumping", + "laughing", + "laying", + "leading", + "leaping", + "learning", + "leaving", + "lending", + "letting", + "lifting", + "lighting", + "liking", + "listening", + "living", + "looking", + "losing", + "loving", + "lying", + "making", + "managing", + "marking", + "mattering", + "meaning", + "measuring", + "meeting", + "mentioning", + "minding", + "missing", + "moonwalking", + "moving", + "needing", + "noticing", + "offering", + "opening", + "operating", + "ordering", + "organizing", + "owning", + "painting", + "parking", + "parkouring", + "participating", + "passing", + "paying", + "performing", + "planning", + "playing", + "pointing", + "possessing", + "posting", + "pouring", + "practicing", + "prancing", + "preferring", + "preparing", + "presenting", + "pressing", + "preventing", + "printing", + "producing", + "promising", + "protecting", + "providing", + "proving", + "pulling", + "punching", + "pushing", + "putting", + "qualifying", + "questioning", + "quitting", + "raining", + "raising", + "reaching", + "reading", + "realizing", + "receiving", + "recognizing", + "recording", + "reducing", + "referring", + "reflecting", + "refusing", + "regretting", + "relating", + "relaxing", + "releasing", + "relying", + "remembering", + "removing", + "repairing", + "repeating", + "replacing", + "replying", + "reporting", + "representing", + "requesting", + "requiring", + "resting", + "returning", + "revealing", + "riding", + "ringing", + "rising", + "risking", + "rolling", + "running", + "sashaying", + "saving", + "saying", + "seeing", + "selling", + "sending", + "serving", + "setting", + "shaking", + "sharing", + "shimmying", + "shooting", + "showing", + "shuffling", + "shutting", + "singing", + "sitting", + "skateboarding", + "skipping", + "sleeping", + "sliding", + "smelling", + "smiling", + "solving", + "speaking", + "spending", + "spinning", + "standing", + "starting", + "staying", + "stealing", + "sticking", + "stopping", + "strutting", + "studying", + "succeeding", + "suffering", + "surfing", + "thinking", + "twerking", + "voguing", + "wobbling", + "yodeling", + "zooming" +]; + +/** + * Predefined template strings. + * + * @type string[] + */ +const templates: string[] = [ + '[verb]-[noun]-while-[verb]', + '[verb]-[adverb]-[conjunction]-[verb]', + '[verb]-[adjective]-[noun]', + '[adverb]-[verb]-[noun]-[noun]', + '[adverb]-[verb]-[adjective]-[noun]' +]; + +const pick = (arr: string[] | string) => arr[Math.floor(Math.random() * arr.length)]; + +// [!] Must be exported [!] +/** + * Retrieves a random template. + * + * @return {string} The template. + */ +export function getTemplate(): string { + return pick(templates); +} + +// [!] Must be exported [!] +/** + * Generates a pseudo-random sentence from a template. + * If no template gets passed, it will be chosen from one of + * the predefined templates. + * + * @param {string} [template=getTemplate()] The template + */ +export function generateSentenceString(template: string = getTemplate()): string { + + let sentence: string = template + .replaceAll( '[adjective]', () => pick( adjectives)) + .replaceAll( '[adverb]', () => pick( adverbs)) + .replaceAll('[conjunction]', () => pick(conjunctions)) + .replaceAll( '[noun]', () => pick( nouns)) + .replaceAll( '[subdomain]', () => pick( subdomains)) + .replaceAll( '[verb]', () => pick( verbs)) + .replaceAll( '[num]', () => pick('0123456789')); + + return sentence; +} + +const chars: string = 'ABCDEFGHJKMNPQRSTUVWXYZ'; + +// [!] Must be exported [!] +/** + * Generates a short text sequence given constraints. + * + * @param {number} [length=9] The length + * @param {boolean} [alphanum=true] The alphanum (false = letters only) + * @param {(null|string)} [casing=null] The casing (lower/upper) + * @return {string} A short string of characters. + */ +export function generateShortString( + length: number = 9, + alphanum: boolean = true, + casing: string | null = null +): string { + + // https://stackoverflow.com/a/1349426 + let result: string = ''; + let characters: string = chars; + + // If casing is small, use lowercase characters. + if (casing !== null && (casing === 'small' || casing === 'lower')) + characters = chars.toLowerCase(); + // If casing is null, mix lowercase with uppercase. + else if (casing === null) + characters += chars.toLowerCase(); + // Otherwise use uppercase. + + // If alphanumeric characters are to be used, + // append 0 through 9 to characters. + if (alphanum) + characters += '0123456789'; + + for (let i = 0; i < length; i++) + result += characters.charAt(Math.floor(Math.random() * characters.length)); + + return result; +}