aboutsummaryrefslogtreecommitdiffstats
path: root/bot
diff options
context:
space:
mode:
Diffstat (limited to 'bot')
-rw-r--r--bot/__init__.py13
-rw-r--r--bot/command.py18
-rw-r--r--bot/constants.py8
-rw-r--r--bot/exts/avatar_modification/avatar_modify.py2
-rw-r--r--bot/exts/core/extensions.py4
-rw-r--r--bot/exts/core/help.py5
-rw-r--r--bot/exts/core/internal_eval/_internal_eval.py1
-rw-r--r--bot/exts/events/advent_of_code/_cog.py49
-rw-r--r--bot/exts/events/advent_of_code/_helpers.py9
-rw-r--r--bot/exts/events/advent_of_code/views/dayandstarview.py71
-rw-r--r--bot/exts/events/hacktoberfest/hacktober-issue-finder.py11
-rw-r--r--bot/exts/fun/anagram.py110
-rw-r--r--bot/exts/fun/duck_game.py42
-rw-r--r--bot/exts/fun/hangman.py182
-rw-r--r--bot/exts/fun/quack.py75
-rw-r--r--bot/exts/fun/tic_tac_toe.py16
-rw-r--r--bot/exts/fun/trivia_quiz.py426
-rw-r--r--bot/exts/holidays/easter/earth_photos.py3
-rw-r--r--bot/exts/holidays/halloween/candy_collection.py9
-rw-r--r--bot/exts/holidays/halloween/scarymovie.py1
-rw-r--r--bot/exts/holidays/halloween/spookynamerate.py6
-rw-r--r--bot/exts/holidays/halloween/spookyreact.py8
-rw-r--r--bot/exts/holidays/hanukkah/hanukkah_embed.py2
-rw-r--r--bot/exts/holidays/valentines/lovecalculator.py3
-rw-r--r--bot/exts/utilities/bookmark.py13
-rw-r--r--bot/exts/utilities/challenges.py335
-rw-r--r--bot/exts/utilities/conversationstarters.py91
-rw-r--r--bot/exts/utilities/emoji.py6
-rw-r--r--bot/exts/utilities/githubinfo.py4
-rw-r--r--bot/exts/utilities/issues.py28
-rw-r--r--bot/exts/utilities/realpython.py16
-rw-r--r--bot/exts/utilities/reddit.py10
-rw-r--r--bot/exts/utilities/wikipedia.py6
-rw-r--r--bot/exts/utilities/wtf_python.py138
-rw-r--r--bot/group.py18
-rw-r--r--bot/monkey_patches.py67
-rw-r--r--bot/resources/fun/anagram.json17668
-rw-r--r--bot/resources/fun/hangman_words.txt877
-rw-r--r--bot/resources/fun/trivia_quiz.json96
-rw-r--r--bot/resources/holidays/halloween/bat-clipart.pngbin12313 -> 19006 bytes
-rw-r--r--bot/resources/utilities/py_topics.yaml1
-rw-r--r--bot/resources/utilities/wtf_python_logo.jpgbin0 -> 19481 bytes
-rw-r--r--bot/utils/checks.py9
-rw-r--r--bot/utils/halloween/spookifications.py3
44 files changed, 20075 insertions, 385 deletions
diff --git a/bot/__init__.py b/bot/__init__.py
index b64f4732..b19bd76a 100644
--- a/bot/__init__.py
+++ b/bot/__init__.py
@@ -12,9 +12,7 @@ from functools import partial, partialmethod
import arrow
from discord.ext import commands
-from bot import log
-from bot.command import Command
-from bot.group import Group
+from bot import log, monkey_patches
log.setup()
@@ -25,11 +23,12 @@ start_time = arrow.utcnow()
if os.name == "nt":
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
+monkey_patches.patch_typing()
# Monkey-patch discord.py decorators to use the both the Command and Group subclasses which supports root aliases.
# Must be patched before any cogs are added.
-commands.command = partial(commands.command, cls=Command)
-commands.GroupMixin.command = partialmethod(commands.GroupMixin.command, cls=Command)
+commands.command = partial(commands.command, cls=monkey_patches.Command)
+commands.GroupMixin.command = partialmethod(commands.GroupMixin.command, cls=monkey_patches.Command)
-commands.group = partial(commands.group, cls=Group)
-commands.GroupMixin.group = partialmethod(commands.GroupMixin.group, cls=Group)
+commands.group = partial(commands.group, cls=monkey_patches.Group)
+commands.GroupMixin.group = partialmethod(commands.GroupMixin.group, cls=monkey_patches.Group)
diff --git a/bot/command.py b/bot/command.py
deleted file mode 100644
index 0fb900f7..00000000
--- a/bot/command.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from discord.ext import commands
-
-
-class Command(commands.Command):
- """
- A `discord.ext.commands.Command` subclass which supports root aliases.
-
- A `root_aliases` keyword argument is added, which is a sequence of alias names that will act as
- top-level commands rather than being aliases of the command's group. It's stored as an attribute
- also named `root_aliases`.
- """
-
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.root_aliases = kwargs.get("root_aliases", [])
-
- if not isinstance(self.root_aliases, (list, tuple)):
- raise TypeError("Root aliases of a command must be a list or a tuple of strings.")
diff --git a/bot/constants.py b/bot/constants.py
index ae6e02c1..9d12000e 100644
--- a/bot/constants.py
+++ b/bot/constants.py
@@ -88,6 +88,7 @@ class AdventOfCode:
ignored_days = environ.get("AOC_IGNORED_DAYS", "").split(",")
leaderboard_displayed_members = 10
leaderboard_cache_expiry_seconds = 1800
+ max_day_and_star_results = 15
year = int(environ.get("AOC_YEAR", datetime.utcnow().year))
role_id = int(environ.get("AOC_ROLE_ID", 518565788744024082))
@@ -101,8 +102,8 @@ class Cats:
class Channels(NamedTuple):
- advent_of_code = int(environ.get("AOC_CHANNEL_ID", 782715290437943306))
- advent_of_code_commands = int(environ.get("AOC_COMMANDS_CHANNEL_ID", 607247579608121354))
+ advent_of_code = int(environ.get("AOC_CHANNEL_ID", 897932085766004786))
+ advent_of_code_commands = int(environ.get("AOC_COMMANDS_CHANNEL_ID", 897932607545823342))
bot = 267659945086812160
organisation = 551789653284356126
devlog = int(environ.get("CHANNEL_DEVLOG", 622895325144940554))
@@ -281,11 +282,12 @@ if Client.month_override is not None:
class Roles(NamedTuple):
+ owner = 267627879762755584
admin = int(environ.get("BOT_ADMIN_ROLE_ID", 267628507062992896))
moderator = 267629731250176001
- owner = 267627879762755584
helpers = int(environ.get("ROLE_HELPERS", 267630620367257601))
core_developers = 587606783669829632
+ everyone = int(environ.get("BOT_GUILD", 267624335836053506))
class Tokens(NamedTuple):
diff --git a/bot/exts/avatar_modification/avatar_modify.py b/bot/exts/avatar_modification/avatar_modify.py
index 87eb05e6..fbee96dc 100644
--- a/bot/exts/avatar_modification/avatar_modify.py
+++ b/bot/exts/avatar_modification/avatar_modify.py
@@ -239,7 +239,7 @@ class AvatarModify(commands.Cog):
description=f"Here is your lovely avatar, surrounded by\n a beautiful {option} flag. Enjoy :D"
)
embed.set_image(url=f"attachment://{file_name}")
- embed.set_footer(text=f"Made by {ctx.author.display_name}.", icon_url=ctx.author.avatar.url)
+ embed.set_footer(text=f"Made by {ctx.author.display_name}.", icon_url=ctx.author.display_avatar.url)
await ctx.send(file=file, embed=embed)
@avatar_modify.group(
diff --git a/bot/exts/core/extensions.py b/bot/exts/core/extensions.py
index 424bacac..d809d2b9 100644
--- a/bot/exts/core/extensions.py
+++ b/bot/exts/core/extensions.py
@@ -18,7 +18,7 @@ from bot.utils.pagination import LinePaginator
log = logging.getLogger(__name__)
-UNLOAD_BLACKLIST = {f"{exts.__name__}.utils.extensions"}
+UNLOAD_BLACKLIST = {f"{exts.__name__}.core.extensions"}
BASE_PATH_LEN = len(exts.__name__.split("."))
@@ -152,7 +152,7 @@ class Extensions(commands.Cog):
Grey indicates that the extension is unloaded.
Green indicates that the extension is currently loaded.
"""
- embed = Embed(colour=Colour.blurple())
+ embed = Embed(colour=Colour.og_blurple())
embed.set_author(
name="Extensions List",
url=Client.github_bot_repo,
diff --git a/bot/exts/core/help.py b/bot/exts/core/help.py
index 4b766b50..db3c2aa6 100644
--- a/bot/exts/core/help.py
+++ b/bot/exts/core/help.py
@@ -13,10 +13,7 @@ from rapidfuzz import process
from bot import constants
from bot.bot import Bot
from bot.constants import Emojis
-from bot.utils.pagination import (
- FIRST_EMOJI, LAST_EMOJI,
- LEFT_EMOJI, LinePaginator, RIGHT_EMOJI,
-)
+from bot.utils.pagination import FIRST_EMOJI, LAST_EMOJI, LEFT_EMOJI, LinePaginator, RIGHT_EMOJI
DELETE_EMOJI = Emojis.trashcan
diff --git a/bot/exts/core/internal_eval/_internal_eval.py b/bot/exts/core/internal_eval/_internal_eval.py
index 4f6b4321..12a860fa 100644
--- a/bot/exts/core/internal_eval/_internal_eval.py
+++ b/bot/exts/core/internal_eval/_internal_eval.py
@@ -10,6 +10,7 @@ from bot.bot import Bot
from bot.constants import Client, Roles
from bot.utils.decorators import with_role
from bot.utils.extensions import invoke_help_command
+
from ._helpers import EvalContext
__all__ = ["InternalEval"]
diff --git a/bot/exts/events/advent_of_code/_cog.py b/bot/exts/events/advent_of_code/_cog.py
index ca60e517..2c1f4541 100644
--- a/bot/exts/events/advent_of_code/_cog.py
+++ b/bot/exts/events/advent_of_code/_cog.py
@@ -2,16 +2,16 @@ import json
import logging
from datetime import datetime, timedelta
from pathlib import Path
+from typing import Optional
import arrow
import discord
from discord.ext import commands
from bot.bot import Bot
-from bot.constants import (
- AdventOfCode as AocConfig, Channels, Colours, Emojis, Month, Roles, WHITELISTED_CHANNELS,
-)
+from bot.constants import AdventOfCode as AocConfig, Channels, Colours, Emojis, Month, Roles, WHITELISTED_CHANNELS
from bot.exts.events.advent_of_code import _helpers
+from bot.exts.events.advent_of_code.views.dayandstarview import AoCDropdownView
from bot.utils.decorators import InChannelCheckFailure, in_month, whitelist_override, with_role
from bot.utils.extensions import invoke_help_command
@@ -150,7 +150,7 @@ class AdventOfCode(commands.Cog):
else:
try:
join_code = await _helpers.get_public_join_code(author)
- except _helpers.FetchingLeaderboardFailed:
+ except _helpers.FetchingLeaderboardFailedError:
await ctx.send(":x: Failed to get join code! Notified maintainers.")
return
@@ -185,14 +185,29 @@ class AdventOfCode(commands.Cog):
brief="Get a snapshot of the PyDis private AoC leaderboard",
)
@whitelist_override(channels=AOC_WHITELIST_RESTRICTED)
- async def aoc_leaderboard(self, ctx: commands.Context) -> None:
- """Get the current top scorers of the Python Discord Leaderboard."""
+ async def aoc_leaderboard(
+ self,
+ ctx: commands.Context,
+ day_and_star: Optional[bool] = False,
+ maximum_scorers: Optional[int] = 10
+ ) -> None:
+ """
+ Get the current top scorers of the Python Discord Leaderboard.
+
+ Additionally, you can provide an argument `day_and_star` (Boolean) to have the bot send a View
+ that will let you filter by day and star.
+ """
+ if maximum_scorers > AocConfig.max_day_and_star_results or maximum_scorers <= 0:
+ raise commands.BadArgument(
+ f"The maximum number of results you can query is {AocConfig.max_day_and_star_results}"
+ )
async with ctx.typing():
try:
leaderboard = await _helpers.fetch_leaderboard()
- except _helpers.FetchingLeaderboardFailed:
+ except _helpers.FetchingLeaderboardFailedError:
await ctx.send(":x: Unable to fetch leaderboard!")
return
+ if not day_and_star:
number_of_participants = leaderboard["number_of_participants"]
@@ -203,6 +218,22 @@ class AdventOfCode(commands.Cog):
info_embed = _helpers.get_summary_embed(leaderboard)
await ctx.send(content=f"{header}\n\n{table}", embed=info_embed)
+ return
+
+ # This is a dictionary that contains solvers in respect of day, and star.
+ # e.g. 1-1 means the solvers of the first star of the first day and their completion time
+ per_day_and_star = json.loads(leaderboard['leaderboard_per_day_and_star'])
+ view = AoCDropdownView(
+ day_and_star_data=per_day_and_star,
+ maximum_scorers=maximum_scorers,
+ original_author=ctx.author
+ )
+ message = await ctx.send(
+ content="Please select a day and a star to filter by!",
+ view=view
+ )
+ await view.wait()
+ await message.edit(view=None)
@in_month(Month.DECEMBER)
@adventofcode_group.command(
@@ -231,7 +262,7 @@ class AdventOfCode(commands.Cog):
"""Send an embed with daily completion statistics for the Python Discord leaderboard."""
try:
leaderboard = await _helpers.fetch_leaderboard()
- except _helpers.FetchingLeaderboardFailed:
+ except _helpers.FetchingLeaderboardFailedError:
await ctx.send(":x: Can't fetch leaderboard for stats right now!")
return
@@ -267,7 +298,7 @@ class AdventOfCode(commands.Cog):
async with ctx.typing():
try:
await _helpers.fetch_leaderboard(invalidate_cache=True)
- except _helpers.FetchingLeaderboardFailed:
+ except _helpers.FetchingLeaderboardFailedError:
await ctx.send(":x: Something went wrong while trying to refresh the cache!")
else:
await ctx.send("\N{OK Hand Sign} Refreshed leaderboard cache!")
diff --git a/bot/exts/events/advent_of_code/_helpers.py b/bot/exts/events/advent_of_code/_helpers.py
index 5fedb60f..af64bc81 100644
--- a/bot/exts/events/advent_of_code/_helpers.py
+++ b/bot/exts/events/advent_of_code/_helpers.py
@@ -105,6 +105,7 @@ def _parse_raw_leaderboard_data(raw_leaderboard_data: dict) -> dict:
# The data we get from the AoC website is structured by member, not by day/star,
# which means we need to iterate over the members to transpose the data to a per
# star view. We need that per star view to compute rank scores per star.
+ per_day_star_stats = collections.defaultdict(list)
for member in raw_leaderboard_data.values():
name = member["name"] if member["name"] else f"Anonymous #{member['id']}"
member_id = member["id"]
@@ -122,6 +123,11 @@ def _parse_raw_leaderboard_data(raw_leaderboard_data: dict) -> dict:
star_results[(day, star)].append(
StarResult(member_id=member_id, completion_time=completion_time)
)
+ per_day_star_stats[f"{day}-{star}"].append(
+ {'completion_time': int(data["get_star_ts"]), 'member_name': name}
+ )
+ for key in per_day_star_stats:
+ per_day_star_stats[key] = sorted(per_day_star_stats[key], key=operator.itemgetter('completion_time'))
# Now that we have a transposed dataset that holds the completion time of all
# participants per star, we can compute the rank-based scores each participant
@@ -151,7 +157,7 @@ def _parse_raw_leaderboard_data(raw_leaderboard_data: dict) -> dict:
# this data to JSON in order to cache it in Redis.
daily_stats[day] = {"star_one": star_one, "star_two": star_two}
- return {"daily_stats": daily_stats, "leaderboard": sorted_leaderboard}
+ return {"daily_stats": daily_stats, "leaderboard": sorted_leaderboard, 'per_day_and_star': per_day_star_stats}
def _format_leaderboard(leaderboard: dict[str, dict]) -> str:
@@ -289,6 +295,7 @@ async def fetch_leaderboard(invalidate_cache: bool = False) -> dict:
"leaderboard_fetched_at": leaderboard_fetched_at,
"number_of_participants": number_of_participants,
"daily_stats": json.dumps(parsed_leaderboard_data["daily_stats"]),
+ "leaderboard_per_day_and_star": json.dumps(parsed_leaderboard_data["per_day_and_star"])
}
# Store the new values in Redis
diff --git a/bot/exts/events/advent_of_code/views/dayandstarview.py b/bot/exts/events/advent_of_code/views/dayandstarview.py
new file mode 100644
index 00000000..243db32e
--- /dev/null
+++ b/bot/exts/events/advent_of_code/views/dayandstarview.py
@@ -0,0 +1,71 @@
+from datetime import datetime
+
+import discord
+
+AOC_DAY_AND_STAR_TEMPLATE = "{rank: >4} | {name:25.25} | {completion_time: >10}"
+
+
+class AoCDropdownView(discord.ui.View):
+ """Interactive view to filter AoC stats by Day and Star."""
+
+ def __init__(self, original_author: discord.Member, day_and_star_data: dict[str: dict], maximum_scorers: int):
+ super().__init__()
+ self.day = 0
+ self.star = 0
+ self.data = day_and_star_data
+ self.maximum_scorers = maximum_scorers
+ self.original_author = original_author
+
+ def generate_output(self) -> str:
+ """Generates a formatted codeblock with AoC statistics based on the currently selected day and star."""
+ header = AOC_DAY_AND_STAR_TEMPLATE.format(
+ rank="Rank",
+ name="Name", completion_time="Completion time (UTC)"
+ )
+ lines = [f"{header}\n{'-' * (len(header) + 2)}"]
+
+ for rank, scorer in enumerate(self.data[f"{self.day}-{self.star}"][:self.maximum_scorers]):
+ time_data = datetime.fromtimestamp(scorer['completion_time']).strftime("%I:%M:%S %p")
+ lines.append(AOC_DAY_AND_STAR_TEMPLATE.format(
+ datastamp="",
+ rank=rank + 1,
+ name=scorer['member_name'],
+ completion_time=time_data)
+ )
+ joined_lines = "\n".join(lines)
+ return f"Statistics for Day: {self.day}, Star: {self.star}.\n ```\n{joined_lines}\n```"
+
+ async def interaction_check(self, interaction: discord.Interaction) -> bool:
+ """Global check to ensure that the interacting user is the user who invoked the command originally."""
+ return interaction.user == self.original_author
+
+ @discord.ui.select(
+ placeholder="Day",
+ options=[discord.SelectOption(label=str(i)) for i in range(1, 26)],
+ custom_id="day_select"
+ )
+ async def day_select(self, select: discord.ui.Select, interaction: discord.Interaction) -> None:
+ """Dropdown to choose a Day of the AoC."""
+ self.day = select.values[0]
+
+ @discord.ui.select(
+ placeholder="Star",
+ options=[discord.SelectOption(label=str(i)) for i in range(1, 3)],
+ custom_id="star_select"
+ )
+ async def star_select(self, select: discord.ui.Select, interaction: discord.Interaction) -> None:
+ """Dropdown to choose either the first or the second star."""
+ self.star = select.values[0]
+
+ @discord.ui.button(label="Fetch", style=discord.ButtonStyle.blurple)
+ async def fetch(self, button: discord.ui.Button, interaction: discord.Interaction) -> None:
+ """Button that fetches the statistics based on the dropdown values."""
+ if self.day == 0 or self.star == 0:
+ await interaction.response.send_message(
+ "You have to select a value from both of the dropdowns!",
+ ephemeral=True
+ )
+ else:
+ await interaction.response.edit_message(content=self.generate_output())
+ self.day = 0
+ self.star = 0
diff --git a/bot/exts/events/hacktoberfest/hacktober-issue-finder.py b/bot/exts/events/hacktoberfest/hacktober-issue-finder.py
index e3053851..1774564b 100644
--- a/bot/exts/events/hacktoberfest/hacktober-issue-finder.py
+++ b/bot/exts/events/hacktoberfest/hacktober-issue-finder.py
@@ -52,10 +52,10 @@ class HacktoberIssues(commands.Cog):
async def get_issues(self, ctx: commands.Context, option: str) -> Optional[dict]:
"""Get a list of the python issues with the label 'hacktoberfest' from the Github api."""
if option == "beginner":
- if (ctx.message.created_at - self.cache_timer_beginner).seconds <= 60:
+ if (ctx.message.created_at.replace(tzinfo=None) - self.cache_timer_beginner).seconds <= 60:
log.debug("using cache")
return self.cache_beginner
- elif (ctx.message.created_at - self.cache_timer_normal).seconds <= 60:
+ elif (ctx.message.created_at.replace(tzinfo=None) - self.cache_timer_normal).seconds <= 60:
log.debug("using cache")
return self.cache_normal
@@ -88,10 +88,10 @@ class HacktoberIssues(commands.Cog):
if option == "beginner":
self.cache_beginner = data
- self.cache_timer_beginner = ctx.message.created_at
+ self.cache_timer_beginner = ctx.message.created_at.replace(tzinfo=None)
else:
self.cache_normal = data
- self.cache_timer_normal = ctx.message.created_at
+ self.cache_timer_normal = ctx.message.created_at.replace(tzinfo=None)
return data
@@ -100,7 +100,8 @@ class HacktoberIssues(commands.Cog):
"""Format the issue data into a embed."""
title = issue["title"]
issue_url = issue["url"].replace("api.", "").replace("/repos/", "/")
- body = issue["body"]
+ # issues can have empty bodies, which in that case GitHub doesn't include the key in the API response
+ body = issue.get("body", "")
labels = [label["name"] for label in issue["labels"]]
embed = discord.Embed(title=title)
diff --git a/bot/exts/fun/anagram.py b/bot/exts/fun/anagram.py
new file mode 100644
index 00000000..9aee5f18
--- /dev/null
+++ b/bot/exts/fun/anagram.py
@@ -0,0 +1,110 @@
+import asyncio
+import json
+import logging
+import random
+from pathlib import Path
+
+import discord
+from discord.ext import commands
+
+from bot.bot import Bot
+from bot.constants import Colours
+
+log = logging.getLogger(__name__)
+
+TIME_LIMIT = 60
+
+# anagram.json file contains all the anagrams
+with open(Path("bot/resources/fun/anagram.json"), "r") as f:
+ ANAGRAMS_ALL = json.load(f)
+
+
+class AnagramGame:
+ """
+ Used for creating instances of anagram games.
+
+ Once multiple games can be run at the same time, this class' instances
+ can be used for keeping track of each anagram game.
+ """
+
+ def __init__(self, scrambled: str, correct: list[str]) -> None:
+ self.scrambled = scrambled
+ self.correct = set(correct)
+
+ self.winners = set()
+
+ async def message_creation(self, message: discord.Message) -> None:
+ """Check if the message is a correct answer and remove it from the list of answers."""
+ if message.content.lower() in self.correct:
+ self.winners.add(message.author.mention)
+ self.correct.remove(message.content.lower())
+
+
+class Anagram(commands.Cog):
+ """Cog for the Anagram game command."""
+
+ def __init__(self, bot: Bot):
+ self.bot = bot
+
+ self.games: dict[int, AnagramGame] = {}
+
+ @commands.command(name="anagram", aliases=("anag", "gram", "ag"))
+ @commands.guild_only()
+ async def anagram_command(self, ctx: commands.Context) -> None:
+ """
+ Given shuffled letters, rearrange them into anagrams.
+
+ Show an embed with scrambled letters which if rearranged can form words.
+ After a specific amount of time, list the correct answers and whether someone provided a
+ correct answer.
+ """
+ if self.games.get(ctx.channel.id):
+ await ctx.send("An anagram is already being solved in this channel!")
+ return
+
+ scrambled_letters, correct = random.choice(list(ANAGRAMS_ALL.items()))
+
+ game = AnagramGame(scrambled_letters, correct)
+ self.games[ctx.channel.id] = game
+
+ anagram_embed = discord.Embed(
+ title=f"Find anagrams from these letters: '{scrambled_letters.upper()}'",
+ description=f"You have {TIME_LIMIT} seconds to find correct words.",
+ colour=Colours.purple,
+ )
+
+ await ctx.send(embed=anagram_embed)
+ await asyncio.sleep(TIME_LIMIT)
+
+ if game.winners:
+ win_list = ", ".join(game.winners)
+ content = f"Well done {win_list} for getting it right!"
+ else:
+ content = "Nobody got it right."
+
+ answer_embed = discord.Embed(
+ title=f"The words were: `{'`, `'.join(ANAGRAMS_ALL[game.scrambled])}`!",
+ colour=Colours.pink,
+ )
+
+ await ctx.send(content, embed=answer_embed)
+
+ # Game is finished, let's remove it from the dict
+ self.games.pop(ctx.channel.id)
+
+ @commands.Cog.listener()
+ async def on_message(self, message: discord.Message) -> None:
+ """Check a message for an anagram attempt and pass to an ongoing game."""
+ if message.author.bot or not message.guild:
+ return
+
+ game = self.games.get(message.channel.id)
+ if not game:
+ return
+
+ await game.message_creation(message)
+
+
+def setup(bot: Bot) -> None:
+ """Load the Anagram cog."""
+ bot.add_cog(Anagram(bot))
diff --git a/bot/exts/fun/duck_game.py b/bot/exts/fun/duck_game.py
index 1ef7513f..10b03a49 100644
--- a/bot/exts/fun/duck_game.py
+++ b/bot/exts/fun/duck_game.py
@@ -11,7 +11,7 @@ from PIL import Image, ImageDraw, ImageFont
from discord.ext import commands
from bot.bot import Bot
-from bot.constants import Colours, MODERATION_ROLES
+from bot.constants import MODERATION_ROLES
from bot.utils.decorators import with_role
DECK = list(product(*[(0, 1, 2)]*4))
@@ -130,6 +130,9 @@ class DuckGame:
while len(self.solutions) < minimum_solutions:
self.board = random.sample(DECK, size)
+ self.board_msg = None
+ self.found_msg = None
+
@property
def board(self) -> list[tuple[int]]:
"""Accesses board property."""
@@ -181,7 +184,7 @@ class DuckGamesDirector(commands.Cog):
)
@commands.cooldown(rate=1, per=2, type=commands.BucketType.channel)
async def start_game(self, ctx: commands.Context) -> None:
- """Generate a board, send the game embed, and end the game after a time limit."""
+ """Start a new Duck Duck Duck Goose game."""
if ctx.channel.id in self.current_games:
await ctx.send("There's already a game running!")
return
@@ -191,8 +194,8 @@ class DuckGamesDirector(commands.Cog):
game.running = True
self.current_games[ctx.channel.id] = game
- game.msg_content = ""
- game.embed_msg = await self.send_board_embed(ctx, game)
+ game.board_msg = await self.send_board_embed(ctx, game)
+ game.found_msg = await self.send_found_embed(ctx)
await asyncio.sleep(GAME_DURATION)
# Checking for the channel ID in the currently running games is not sufficient.
@@ -245,13 +248,13 @@ class DuckGamesDirector(commands.Cog):
if answer in game.solutions:
game.claimed_answers[answer] = msg.author
game.scores[msg.author] += CORRECT_SOLN
- await self.display_claimed_answer(game, msg.author, answer)
+ await self.append_to_found_embed(game, f"{str(answer):12s} - {msg.author.display_name}")
else:
await msg.add_reaction(EMOJI_WRONG)
game.scores[msg.author] += INCORRECT_SOLN
async def send_board_embed(self, ctx: commands.Context, game: DuckGame) -> discord.Message:
- """Create and send the initial game embed. This will be edited as the game goes on."""
+ """Create and send an embed to display the board."""
image = assemble_board_image(game.board, game.rows, game.columns)
with BytesIO() as image_stream:
image.save(image_stream, format="png")
@@ -259,19 +262,27 @@ class DuckGamesDirector(commands.Cog):
file = discord.File(fp=image_stream, filename="board.png")
embed = discord.Embed(
title="Duck Duck Duck Goose!",
- color=Colours.bright_green,
+ color=discord.Color.dark_purple(),
)
embed.set_image(url="attachment://board.png")
return await ctx.send(embed=embed, file=file)
- async def display_claimed_answer(self, game: DuckGame, author: discord.Member, answer: tuple[int]) -> None:
- """Add a claimed answer to the game embed."""
+ async def send_found_embed(self, ctx: commands.Context) -> discord.Message:
+ """Create and send an embed to display claimed answers. This will be edited as the game goes on."""
+ # Can't be part of the board embed because of discord.py limitations with editing an embed with an image.
+ embed = discord.Embed(
+ title="Flights Found",
+ color=discord.Color.dark_purple(),
+ )
+ return await ctx.send(embed=embed)
+
+ async def append_to_found_embed(self, game: DuckGame, text: str) -> None:
+ """Append text to the claimed answers embed."""
async with game.editing_embed:
- # We specifically edit the message contents instead of the embed
- # Because we load in the image from the file, editing any portion of the embed
- # Does weird things to the image and this works around that weirdness
- game.msg_content = f"{game.msg_content}\n{str(answer):12s} - {author.display_name}"
- await game.embed_msg.edit(content=game.msg_content)
+ found_embed, = game.found_msg.embeds
+ old_desc = found_embed.description or ""
+ found_embed.description = f"{old_desc.rstrip()}\n{text}"
+ await game.found_msg.edit(embed=found_embed)
async def end_game(self, channel: discord.TextChannel, game: DuckGame, end_message: str) -> None:
"""Edit the game embed to reflect the end of the game and mark the game as not running."""
@@ -296,8 +307,7 @@ class DuckGamesDirector(commands.Cog):
missed_text = "Flights everyone missed:\n" + "\n".join(f"{ans}" for ans in missed)
else:
missed_text = "All the flights were found!"
-
- await game.embed_msg.edit(content=f"{missed_text}")
+ await self.append_to_found_embed(game, f"\n{missed_text}")
@start_game.command(name="help")
async def show_rules(self, ctx: commands.Context) -> None:
diff --git a/bot/exts/fun/hangman.py b/bot/exts/fun/hangman.py
new file mode 100644
index 00000000..a2c8c735
--- /dev/null
+++ b/bot/exts/fun/hangman.py
@@ -0,0 +1,182 @@
+from asyncio import TimeoutError
+from pathlib import Path
+from random import choice
+
+from discord import Embed, Message
+from discord.ext import commands
+
+from bot.bot import Bot
+from bot.constants import Colours, NEGATIVE_REPLIES
+
+# Defining all words in the list of words as a global variable
+ALL_WORDS = Path("bot/resources/fun/hangman_words.txt").read_text().splitlines()
+
+# Defining a dictionary of images that will be used for the game to represent the hangman person
+IMAGES = {
+ 6: "https://cdn.discordapp.com/attachments/859123972884922418/888133201497837598/hangman0.png",
+ 5: "https://cdn.discordapp.com/attachments/859123972884922418/888133595259084800/hangman1.png",
+ 4: "https://cdn.discordapp.com/attachments/859123972884922418/888134194474139688/hangman2.png",
+ 3: "https://cdn.discordapp.com/attachments/859123972884922418/888133758069395466/hangman3.png",
+ 2: "https://cdn.discordapp.com/attachments/859123972884922418/888133786724859924/hangman4.png",
+ 1: "https://cdn.discordapp.com/attachments/859123972884922418/888133828831477791/hangman5.png",
+ 0: "https://cdn.discordapp.com/attachments/859123972884922418/888133845449338910/hangman6.png",
+}
+
+
+class Hangman(commands.Cog):
+ """
+ Cog for the Hangman game.
+
+ Hangman is a classic game where the user tries to guess a word, with a limited amount of tries.
+ """
+
+ def __init__(self, bot: Bot):
+ self.bot = bot
+
+ @staticmethod
+ def create_embed(tries: int, user_guess: str) -> Embed:
+ """
+ Helper method that creates the embed where the game information is shown.
+
+ This includes how many letters the user has guessed so far, and the hangman photo itself.
+ """
+ hangman_embed = Embed(
+ title="Hangman",
+ color=Colours.python_blue,
+ )
+ hangman_embed.set_image(url=IMAGES[tries])
+ hangman_embed.add_field(
+ name=f"You've guessed `{user_guess}` so far.",
+ value="Guess the word by sending a message with a letter!"
+ )
+ hangman_embed.set_footer(text=f"Tries remaining: {tries}")
+ return hangman_embed
+
+ @commands.command()
+ async def hangman(
+ self,
+ ctx: commands.Context,
+ min_length: int = 0,
+ max_length: int = 25,
+ min_unique_letters: int = 0,
+ max_unique_letters: int = 25,
+ ) -> None:
+ """
+ Play hangman against the bot, where you have to guess the word it has provided!
+
+ The arguments for this command mean:
+ - min_length: the minimum length you want the word to be (i.e. 2)
+ - max_length: the maximum length you want the word to be (i.e. 5)
+ - min_unique_letters: the minimum unique letters you want the word to have (i.e. 4)
+ - max_unique_letters: the maximum unique letters you want the word to have (i.e. 7)
+ """
+ # Filtering the list of all words depending on the configuration
+ filtered_words = [
+ word for word in ALL_WORDS
+ if min_length < len(word) < max_length
+ and min_unique_letters < len(set(word)) < max_unique_letters
+ ]
+
+ if not filtered_words:
+ filter_not_found_embed = Embed(
+ title=choice(NEGATIVE_REPLIES),
+ description="No words could be found that fit all filters specified.",
+ color=Colours.soft_red,
+ )
+ await ctx.send(embed=filter_not_found_embed)
+ return
+
+ word = choice(filtered_words)
+ # `pretty_word` is used for comparing the indices where the guess of the user is similar to the word
+ # The `user_guess` variable is prettified by adding spaces between every dash, and so is the `pretty_word`
+ pretty_word = ''.join([f"{letter} " for letter in word])[:-1]
+ user_guess = ("_ " * len(word))[:-1]
+ tries = 6
+ guessed_letters = set()
+
+ def check(msg: Message) -> bool:
+ return msg.author == ctx.author and msg.channel == ctx.channel
+
+ original_message = await ctx.send(embed=Embed(
+ title="Hangman",
+ description="Loading game...",
+ color=Colours.soft_green
+ ))
+
+ # Game loop
+ while user_guess.replace(' ', '') != word:
+ # Edit the message to the current state of the game
+ await original_message.edit(embed=self.create_embed(tries, user_guess))
+
+ try:
+ message = await self.bot.wait_for(
+ event="message",
+ timeout=60.0,
+ check=check
+ )
+ except TimeoutError:
+ timeout_embed = Embed(
+ title=choice(NEGATIVE_REPLIES),
+ description="Looks like the bot timed out! You must send a letter within 60 seconds.",
+ color=Colours.soft_red,
+ )
+ await original_message.edit(embed=timeout_embed)
+ return
+
+ # If the user enters a capital letter as their guess, it is automatically converted to a lowercase letter
+ normalized_content = message.content.lower()
+ # The user should only guess one letter per message
+ if len(normalized_content) > 1:
+ letter_embed = Embed(
+ title=choice(NEGATIVE_REPLIES),
+ description="You can only send one letter at a time, try again!",
+ color=Colours.dark_green,
+ )
+ await ctx.send(embed=letter_embed, delete_after=4)
+ continue
+
+ # Checks for repeated guesses
+ elif normalized_content in guessed_letters:
+ already_guessed_embed = Embed(
+ title=choice(NEGATIVE_REPLIES),
+ description=f"You have already guessed `{normalized_content}`, try again!",
+ color=Colours.dark_green,
+ )
+ await ctx.send(embed=already_guessed_embed, delete_after=4)
+ continue
+
+ # Checks for correct guesses from the user
+ elif normalized_content in word:
+ positions = {idx for idx, letter in enumerate(pretty_word) if letter == normalized_content}
+ user_guess = "".join(
+ [normalized_content if index in positions else dash for index, dash in enumerate(user_guess)]
+ )
+
+ else:
+ tries -= 1
+
+ if tries <= 0:
+ losing_embed = Embed(
+ title="You lost.",
+ description=f"The word was `{word}`.",
+ color=Colours.soft_red,
+ )
+ await original_message.edit(embed=self.create_embed(tries, user_guess))
+ await ctx.send(embed=losing_embed)
+ return
+
+ guessed_letters.add(normalized_content)
+
+ # The loop exited meaning that the user has guessed the word
+ await original_message.edit(embed=self.create_embed(tries, user_guess))
+ win_embed = Embed(
+ title="You won!",
+ description=f"The word was `{word}`.",
+ color=Colours.grass_green
+ )
+ await ctx.send(embed=win_embed)
+
+
+def setup(bot: Bot) -> None:
+ """Load the Hangman cog."""
+ bot.add_cog(Hangman(bot))
diff --git a/bot/exts/fun/quack.py b/bot/exts/fun/quack.py
new file mode 100644
index 00000000..0c228aed
--- /dev/null
+++ b/bot/exts/fun/quack.py
@@ -0,0 +1,75 @@
+import logging
+import random
+from typing import Literal, Optional
+
+import discord
+from discord.ext import commands
+
+from bot.bot import Bot
+from bot.constants import Colours, NEGATIVE_REPLIES
+
+API_URL = 'https://quackstack.pythondiscord.com'
+
+log = logging.getLogger(__name__)
+
+
+class Quackstack(commands.Cog):
+ """Cog used for wrapping Quackstack."""
+
+ def __init__(self, bot: Bot):
+ self.bot = bot
+
+ @commands.command()
+ async def quack(
+ self,
+ ctx: commands.Context,
+ ducktype: Literal["duck", "manduck"] = "duck",
+ *,
+ seed: Optional[str] = None
+ ) -> None:
+ """
+ Use the Quackstack API to generate a random duck.
+
+ If a seed is provided, a duck is generated based on the given seed.
+ Either "duck" or "manduck" can be provided to change the duck type generated.
+ """
+ ducktype = ducktype.lower()
+ quackstack_url = f"{API_URL}/{ducktype}"
+ params = {}
+ if seed is not None:
+ try:
+ seed = int(seed)
+ except ValueError:
+ # We just need to turn the string into an integer any way possible
+ seed = int.from_bytes(seed.encode(), "big")
+ params["seed"] = seed
+
+ async with self.bot.http_session.get(quackstack_url, params=params) as response:
+ error_embed = discord.Embed(
+ title=random.choice(NEGATIVE_REPLIES),
+ description="The request failed. Please try again later.",
+ color=Colours.soft_red,
+ )
+ if response.status != 200:
+ log.error(f"Response to Quackstack returned code {response.status}")
+ await ctx.send(embed=error_embed)
+ return
+
+ data = await response.json()
+ file = data["file"]
+
+ embed = discord.Embed(
+ title=f"Quack! Here's a {ducktype} for you.",
+ description=f"A {ducktype} from Quackstack.",
+ color=Colours.grass_green,
+ url=f"{API_URL}/docs"
+ )
+
+ embed.set_image(url=API_URL + file)
+
+ await ctx.send(embed=embed)
+
+
+def setup(bot: Bot) -> None:
+ """Loads the Quack cog."""
+ bot.add_cog(Quackstack(bot))
diff --git a/bot/exts/fun/tic_tac_toe.py b/bot/exts/fun/tic_tac_toe.py
index 5c4f8051..946b6f7b 100644
--- a/bot/exts/fun/tic_tac_toe.py
+++ b/bot/exts/fun/tic_tac_toe.py
@@ -72,10 +72,12 @@ class Player:
class AI:
"""Tic Tac Toe AI class for against computer gaming."""
- def __init__(self, symbol: str):
+ def __init__(self, bot_user: discord.Member, symbol: str):
+ self.user = bot_user
self.symbol = symbol
- async def get_move(self, board: dict[int, str], _: discord.Message) -> tuple[bool, int]:
+ @staticmethod
+ async def get_move(board: dict[int, str], _: discord.Message) -> tuple[bool, int]:
"""Get move from AI. AI use Minimax strategy."""
possible_moves = [i for i, emoji in board.items() if emoji in list(Emojis.number_emojis.values())]
@@ -97,8 +99,8 @@ class AI:
return False, random.choice(open_edges)
def __str__(self) -> str:
- """Return `AI` as user name."""
- return "AI"
+ """Return mention of @Sir Lancebot."""
+ return self.user.mention
class Game:
@@ -107,6 +109,7 @@ class Game:
def __init__(self, players: list[Union[Player, AI]], ctx: Context):
self.players = players
self.ctx = ctx
+ self.channel = ctx.channel
self.board = {
1: Emojis.number_emojis[1],
2: Emojis.number_emojis[2],
@@ -173,7 +176,8 @@ class Game:
self.canceled = True
return False, "User declined"
- async def add_reactions(self, msg: discord.Message) -> None:
+ @staticmethod
+ async def add_reactions(msg: discord.Message) -> None:
"""Add number emojis to message."""
for nr in Emojis.number_emojis.values():
await msg.add_reaction(nr)
@@ -265,7 +269,7 @@ class TicTacToe(Cog):
return
if opponent is None:
game = Game(
- [Player(ctx.author, ctx, Emojis.x_square), AI(Emojis.o_square)],
+ [Player(ctx.author, ctx, Emojis.x_square), AI(ctx.me, Emojis.o_square)],
ctx
)
else:
diff --git a/bot/exts/fun/trivia_quiz.py b/bot/exts/fun/trivia_quiz.py
index cf9e6cd3..712c8a12 100644
--- a/bot/exts/fun/trivia_quiz.py
+++ b/bot/exts/fun/trivia_quiz.py
@@ -3,190 +3,211 @@ import json
import logging
import operator
import random
+import re
+import string
+from collections import defaultdict
from dataclasses import dataclass
+from datetime import datetime, timedelta
from pathlib import Path
from typing import Callable, Optional
import discord
-from discord.ext import commands
+from discord.ext import commands, tasks
from rapidfuzz import fuzz
from bot.bot import Bot
-from bot.constants import Colours, NEGATIVE_REPLIES, Roles
+from bot.constants import Client, Colours, NEGATIVE_REPLIES, Roles
logger = logging.getLogger(__name__)
-DEFAULT_QUESTION_LIMIT = 6
+DEFAULT_QUESTION_LIMIT = 7
STANDARD_VARIATION_TOLERANCE = 88
DYNAMICALLY_GEN_VARIATION_TOLERANCE = 97
+MAX_ERROR_FETCH_TRIES = 3
+
WRONG_ANS_RESPONSE = [
"No one answered correctly!",
"Better luck next time...",
]
-N_PREFIX_STARTS_AT = 5
-N_PREFIXES = [
- "penta", "hexa", "hepta", "octa", "nona",
- "deca", "hendeca", "dodeca", "trideca", "tetradeca",
-]
+RULES = (
+ "No cheating and have fun!",
+ "Points for each question reduces by 25 after 10s or after a hint. Total time is 30s per question"
+)
-PLANETS = [
- ("1st", "Mercury"),
- ("2nd", "Venus"),
- ("3rd", "Earth"),
- ("4th", "Mars"),
- ("5th", "Jupiter"),
- ("6th", "Saturn"),
- ("7th", "Uranus"),
- ("8th", "Neptune"),
-]
-
-TAXONOMIC_HIERARCHY = [
- "species", "genus", "family", "order",
- "class", "phylum", "kingdom", "domain",
-]
-
-UNITS_TO_BASE_UNITS = {
- "hertz": ("(unit of frequency)", "s^-1"),
- "newton": ("(unit of force)", "m*kg*s^-2"),
- "pascal": ("(unit of pressure & stress)", "m^-1*kg*s^-2"),
- "joule": ("(unit of energy & quantity of heat)", "m^2*kg*s^-2"),
- "watt": ("(unit of power)", "m^2*kg*s^-3"),
- "coulomb": ("(unit of electric charge & quantity of electricity)", "s*A"),
- "volt": ("(unit of voltage & electromotive force)", "m^2*kg*s^-3*A^-1"),
- "farad": ("(unit of capacitance)", "m^-2*kg^-1*s^4*A^2"),
- "ohm": ("(unit of electric resistance)", "m^2*kg*s^-3*A^-2"),
- "weber": ("(unit of magnetic flux)", "m^2*kg*s^-2*A^-1"),
- "tesla": ("(unit of magnetic flux density)", "kg*s^-2*A^-1"),
-}
+WIKI_FEED_API_URL = "https://en.wikipedia.org/api/rest_v1/feed/featured/{date}"
+TRIVIA_QUIZ_ICON = (
+ "https://raw.githubusercontent.com/python-discord/branding/main/icons/trivia_quiz/trivia-quiz-dist.png"
+)
@dataclass(frozen=True)
class QuizEntry:
- """Dataclass for a quiz entry (a question and a string containing answers separated by commas)."""
+ """Stores quiz entry (a question and a list of answers)."""
question: str
- answer: str
-
-
-def linear_system(q_format: str, a_format: str) -> QuizEntry:
- """Generate a system of linear equations with two unknowns."""
- x, y = random.randint(2, 5), random.randint(2, 5)
- answer = a_format.format(x, y)
-
- coeffs = random.sample(range(1, 6), 4)
-
- question = q_format.format(
- coeffs[0],
- coeffs[1],
- coeffs[0] * x + coeffs[1] * y,
- coeffs[2],
- coeffs[3],
- coeffs[2] * x + coeffs[3] * y,
- )
-
- return QuizEntry(question, answer)
-
-
-def mod_arith(q_format: str, a_format: str) -> QuizEntry:
- """Generate a basic modular arithmetic question."""
- quotient, m, b = random.randint(30, 40), random.randint(10, 20), random.randint(200, 350)
- ans = random.randint(0, 9) # max remainder is 9, since the minimum modulus is 10
- a = quotient * m + ans - b
-
- question = q_format.format(a, b, m)
- answer = a_format.format(ans)
+ answers: list[str]
+ var_tol: int
+
+
+class DynamicQuestionGen:
+ """Class that contains functions to generate math/science questions for TriviaQuiz Cog."""
+
+ N_PREFIX_STARTS_AT = 5
+ N_PREFIXES = [
+ "penta", "hexa", "hepta", "octa", "nona",
+ "deca", "hendeca", "dodeca", "trideca", "tetradeca",
+ ]
+
+ PLANETS = [
+ ("1st", "Mercury"),
+ ("2nd", "Venus"),
+ ("3rd", "Earth"),
+ ("4th", "Mars"),
+ ("5th", "Jupiter"),
+ ("6th", "Saturn"),
+ ("7th", "Uranus"),
+ ("8th", "Neptune"),
+ ]
+
+ TAXONOMIC_HIERARCHY = [
+ "species", "genus", "family", "order",
+ "class", "phylum", "kingdom", "domain",
+ ]
+
+ UNITS_TO_BASE_UNITS = {
+ "hertz": ("(unit of frequency)", "s^-1"),
+ "newton": ("(unit of force)", "m*kg*s^-2"),
+ "pascal": ("(unit of pressure & stress)", "m^-1*kg*s^-2"),
+ "joule": ("(unit of energy & quantity of heat)", "m^2*kg*s^-2"),
+ "watt": ("(unit of power)", "m^2*kg*s^-3"),
+ "coulomb": ("(unit of electric charge & quantity of electricity)", "s*A"),
+ "volt": ("(unit of voltage & electromotive force)", "m^2*kg*s^-3*A^-1"),
+ "farad": ("(unit of capacitance)", "m^-2*kg^-1*s^4*A^2"),
+ "ohm": ("(unit of electric resistance)", "m^2*kg*s^-3*A^-2"),
+ "weber": ("(unit of magnetic flux)", "m^2*kg*s^-2*A^-1"),
+ "tesla": ("(unit of magnetic flux density)", "kg*s^-2*A^-1"),
+ }
+
+ @classmethod
+ def linear_system(cls, q_format: str, a_format: str) -> QuizEntry:
+ """Generate a system of linear equations with two unknowns."""
+ x, y = random.randint(2, 5), random.randint(2, 5)
+ answer = a_format.format(x, y)
+
+ coeffs = random.sample(range(1, 6), 4)
+
+ question = q_format.format(
+ coeffs[0],
+ coeffs[1],
+ coeffs[0] * x + coeffs[1] * y,
+ coeffs[2],
+ coeffs[3],
+ coeffs[2] * x + coeffs[3] * y,
+ )
- return QuizEntry(question, answer)
+ return QuizEntry(question, [answer], DYNAMICALLY_GEN_VARIATION_TOLERANCE)
+ @classmethod
+ def mod_arith(cls, q_format: str, a_format: str) -> QuizEntry:
+ """Generate a basic modular arithmetic question."""
+ quotient, m, b = random.randint(30, 40), random.randint(10, 20), random.randint(200, 350)
+ ans = random.randint(0, 9) # max remainder is 9, since the minimum modulus is 10
+ a = quotient * m + ans - b
-def ngonal_prism(q_format: str, a_format: str) -> QuizEntry:
- """Generate a question regarding vertices on n-gonal prisms."""
- n = random.randint(0, len(N_PREFIXES) - 1)
+ question = q_format.format(a, b, m)
+ answer = a_format.format(ans)
- question = q_format.format(N_PREFIXES[n])
- answer = a_format.format((n + N_PREFIX_STARTS_AT) * 2)
+ return QuizEntry(question, [answer], DYNAMICALLY_GEN_VARIATION_TOLERANCE)
- return QuizEntry(question, answer)
+ @classmethod
+ def ngonal_prism(cls, q_format: str, a_format: str) -> QuizEntry:
+ """Generate a question regarding vertices on n-gonal prisms."""
+ n = random.randint(0, len(cls.N_PREFIXES) - 1)
+ question = q_format.format(cls.N_PREFIXES[n])
+ answer = a_format.format((n + cls.N_PREFIX_STARTS_AT) * 2)
-def imag_sqrt(q_format: str, a_format: str) -> QuizEntry:
- """Generate a negative square root question."""
- ans_coeff = random.randint(3, 10)
+ return QuizEntry(question, [answer], DYNAMICALLY_GEN_VARIATION_TOLERANCE)
- question = q_format.format(ans_coeff ** 2)
- answer = a_format.format(ans_coeff)
+ @classmethod
+ def imag_sqrt(cls, q_format: str, a_format: str) -> QuizEntry:
+ """Generate a negative square root question."""
+ ans_coeff = random.randint(3, 10)
- return QuizEntry(question, answer)
+ question = q_format.format(ans_coeff ** 2)
+ answer = a_format.format(ans_coeff)
+ return QuizEntry(question, [answer], DYNAMICALLY_GEN_VARIATION_TOLERANCE)
-def binary_calc(q_format: str, a_format: str) -> QuizEntry:
- """Generate a binary calculation question."""
- a = random.randint(15, 20)
- b = random.randint(10, a)
- oper = random.choice(
- (
- ("+", operator.add),
- ("-", operator.sub),
- ("*", operator.mul),
+ @classmethod
+ def binary_calc(cls, q_format: str, a_format: str) -> QuizEntry:
+ """Generate a binary calculation question."""
+ a = random.randint(15, 20)
+ b = random.randint(10, a)
+ oper = random.choice(
+ (
+ ("+", operator.add),
+ ("-", operator.sub),
+ ("*", operator.mul),
+ )
)
- )
- # if the operator is multiplication, lower the values of the two operands to make it easier
- if oper[0] == "*":
- a -= 5
- b -= 5
+ # if the operator is multiplication, lower the values of the two operands to make it easier
+ if oper[0] == "*":
+ a -= 5
+ b -= 5
- question = q_format.format(a, oper[0], b)
- answer = a_format.format(oper[1](a, b))
+ question = q_format.format(a, oper[0], b)
+ answer = a_format.format(oper[1](a, b))
- return QuizEntry(question, answer)
+ return QuizEntry(question, [answer], DYNAMICALLY_GEN_VARIATION_TOLERANCE)
+ @classmethod
+ def solar_system(cls, q_format: str, a_format: str) -> QuizEntry:
+ """Generate a question on the planets of the Solar System."""
+ planet = random.choice(cls.PLANETS)
-def solar_system(q_format: str, a_format: str) -> QuizEntry:
- """Generate a question on the planets of the Solar System."""
- planet = random.choice(PLANETS)
+ question = q_format.format(planet[0])
+ answer = a_format.format(planet[1])
- question = q_format.format(planet[0])
- answer = a_format.format(planet[1])
+ return QuizEntry(question, [answer], DYNAMICALLY_GEN_VARIATION_TOLERANCE)
- return QuizEntry(question, answer)
+ @classmethod
+ def taxonomic_rank(cls, q_format: str, a_format: str) -> QuizEntry:
+ """Generate a question on taxonomic classification."""
+ level = random.randint(0, len(cls.TAXONOMIC_HIERARCHY) - 2)
+ question = q_format.format(cls.TAXONOMIC_HIERARCHY[level])
+ answer = a_format.format(cls.TAXONOMIC_HIERARCHY[level + 1])
-def taxonomic_rank(q_format: str, a_format: str) -> QuizEntry:
- """Generate a question on taxonomic classification."""
- level = random.randint(0, len(TAXONOMIC_HIERARCHY) - 2)
+ return QuizEntry(question, [answer], DYNAMICALLY_GEN_VARIATION_TOLERANCE)
- question = q_format.format(TAXONOMIC_HIERARCHY[level])
- answer = a_format.format(TAXONOMIC_HIERARCHY[level + 1])
+ @classmethod
+ def base_units_convert(cls, q_format: str, a_format: str) -> QuizEntry:
+ """Generate a SI base units conversion question."""
+ unit = random.choice(list(cls.UNITS_TO_BASE_UNITS))
- return QuizEntry(question, answer)
-
-
-def base_units_convert(q_format: str, a_format: str) -> QuizEntry:
- """Generate a SI base units conversion question."""
- unit = random.choice(list(UNITS_TO_BASE_UNITS))
-
- question = q_format.format(
- unit + " " + UNITS_TO_BASE_UNITS[unit][0]
- )
- answer = a_format.format(
- UNITS_TO_BASE_UNITS[unit][1]
- )
+ question = q_format.format(
+ unit + " " + cls.UNITS_TO_BASE_UNITS[unit][0]
+ )
+ answer = a_format.format(
+ cls.UNITS_TO_BASE_UNITS[unit][1]
+ )
- return QuizEntry(question, answer)
+ return QuizEntry(question, [answer], DYNAMICALLY_GEN_VARIATION_TOLERANCE)
DYNAMIC_QUESTIONS_FORMAT_FUNCS = {
- 201: linear_system,
- 202: mod_arith,
- 203: ngonal_prism,
- 204: imag_sqrt,
- 205: binary_calc,
- 301: solar_system,
- 302: taxonomic_rank,
- 303: base_units_convert,
+ 201: DynamicQuestionGen.linear_system,
+ 202: DynamicQuestionGen.mod_arith,
+ 203: DynamicQuestionGen.ngonal_prism,
+ 204: DynamicQuestionGen.imag_sqrt,
+ 205: DynamicQuestionGen.binary_calc,
+ 301: DynamicQuestionGen.solar_system,
+ 302: DynamicQuestionGen.taxonomic_rank,
+ 303: DynamicQuestionGen.base_units_convert,
}
@@ -202,7 +223,7 @@ class TriviaQuiz(commands.Cog):
self.questions = self.load_questions()
self.question_limit = 0
- self.player_scores = {} # A variable to store all player's scores for a bot session.
+ self.player_scores = defaultdict(int) # A variable to store all player's scores for a bot session.
self.game_player_scores = {} # A variable to store temporary game player's scores.
self.categories = {
@@ -212,8 +233,72 @@ class TriviaQuiz(commands.Cog):
"science": "Put your understanding of science to the test!",
"cs": "A large variety of computer science questions.",
"python": "Trivia on our amazing language, Python!",
+ "wikipedia": "Guess the title of random wikipedia passages.",
}
+ self.get_wiki_questions.start()
+
+ def cog_unload(self) -> None:
+ """Cancel `get_wiki_questions` task when Cog will unload."""
+ self.get_wiki_questions.cancel()
+
+ @tasks.loop(hours=24.0)
+ async def get_wiki_questions(self) -> None:
+ """Get yesterday's most read articles from wikipedia and format them like trivia questions."""
+ error_fetches = 0
+ wiki_questions = []
+ # trivia_quiz.json follows a pattern, every new category starts with the next century.
+ start_id = 501
+ yesterday = datetime.strftime(datetime.now() - timedelta(1), '%Y/%m/%d')
+
+ while error_fetches < MAX_ERROR_FETCH_TRIES:
+ async with self.bot.http_session.get(url=WIKI_FEED_API_URL.format(date=yesterday)) as r:
+ if r.status != 200:
+ error_fetches += 1
+ continue
+ raw_json = await r.json()
+ articles_raw = raw_json["mostread"]["articles"]
+
+ for article in articles_raw:
+ question = article.get("extract")
+ if not question:
+ continue
+
+ # Normalize the wikipedia article title to remove all punctuations from it
+ for word in re.split(r"[\s-]", title := article["normalizedtitle"]):
+ cleaned_title = re.sub(
+ rf'\b{word.strip(string.punctuation)}\b', word, title, flags=re.IGNORECASE
+ )
+
+ # Since the extract contains the article name sometimes this would replace all the matching words
+ # in that article with *** of that length.
+ # NOTE: This removes the "answer" for 99% of the cases, but sometimes the wikipedia article is
+ # very different from the words in the extract, for example the title would be the nickname of a
+ # person (Bob Ross) whereas in the extract it would the full name (Robert Norman Ross) so it comes
+ # out as (Robert Norman ****) and (Robert Norman Ross) won't be a right answer :(
+ for word in re.split(r"[\s-]", cleaned_title):
+ word = word.strip(string.punctuation)
+ secret_word = r"\*" * len(word)
+ question = re.sub(rf'\b{word}\b', f"**{secret_word}**", question, flags=re.IGNORECASE)
+
+ formatted_article_question = {
+ "id": start_id,
+ "question": f"Guess the title of the Wikipedia article.\n\n{question}",
+ "answer": cleaned_title,
+ "info": article["extract"]
+ }
+ start_id += 1
+ wiki_questions.append(formatted_article_question)
+
+ # If everything has gone smoothly until now, we can break out of the while loop
+ break
+
+ if error_fetches < MAX_ERROR_FETCH_TRIES:
+ self.questions["wikipedia"] = wiki_questions.copy()
+ else:
+ del self.categories["wikipedia"]
+ logger.warning(f"Not loading wikipedia guess questions, hit max error fetches: {MAX_ERROR_FETCH_TRIES}.")
+
@staticmethod
def load_questions() -> dict:
"""Load the questions from the JSON file."""
@@ -221,7 +306,7 @@ class TriviaQuiz(commands.Cog):
return json.loads(p.read_text(encoding="utf-8"))
- @commands.group(name="quiz", aliases=["trivia"], invoke_without_command=True)
+ @commands.group(name="quiz", aliases=("trivia", "triviaquiz"), invoke_without_command=True)
async def quiz_game(self, ctx: commands.Context, category: Optional[str], questions: Optional[int]) -> None:
"""
Start a quiz!
@@ -233,6 +318,7 @@ class TriviaQuiz(commands.Cog):
- science: Put your understanding of science to the test!
- cs: A large variety of computer science questions.
- python: Trivia on our amazing language, Python!
+ - wikipedia: Guess the title of random wikipedia passages.
(More to come!)
"""
@@ -246,7 +332,7 @@ class TriviaQuiz(commands.Cog):
if self.game_status[ctx.channel.id]:
await ctx.send(
"Game is already running... "
- f"do `{self.bot.command_prefix}quiz stop`"
+ f"do `{Client.prefix}quiz stop`"
)
return
@@ -264,7 +350,7 @@ class TriviaQuiz(commands.Cog):
topic_length = len(topic)
if questions is None:
- self.question_limit = DEFAULT_QUESTION_LIMIT
+ self.question_limit = min(DEFAULT_QUESTION_LIMIT, topic_length)
else:
if questions > topic_length:
await ctx.send(
@@ -279,13 +365,13 @@ class TriviaQuiz(commands.Cog):
await ctx.send(
embed=self.make_error_embed(
"You must choose to complete at least one question. "
- f"(or enter nothing for the default value of {DEFAULT_QUESTION_LIMIT + 1} questions)"
+ f"(or enter nothing for the default value of {DEFAULT_QUESTION_LIMIT} questions)"
)
)
return
else:
- self.question_limit = questions - 1
+ self.question_limit = questions
# Start game if not running.
if not self.game_status[ctx.channel.id]:
@@ -296,13 +382,13 @@ class TriviaQuiz(commands.Cog):
await ctx.send(embed=start_embed) # send an embed with the rules
await asyncio.sleep(5)
- done_question = []
+ done_questions = []
hint_no = 0
- answers = None
+ quiz_entry = None
while self.game_status[ctx.channel.id]:
# Exit quiz if number of questions for a round are already sent.
- if len(done_question) > self.question_limit and hint_no == 0:
+ if len(done_questions) == self.question_limit and hint_no == 0:
await ctx.send("The round has ended.")
await self.declare_winner(ctx.channel, self.game_player_scores[ctx.channel.id])
@@ -317,32 +403,27 @@ class TriviaQuiz(commands.Cog):
# Select a random question which has not been used yet.
while True:
question_dict = random.choice(topic)
- if question_dict["id"] not in done_question:
- done_question.append(question_dict["id"])
+ if question_dict["id"] not in done_questions:
+ done_questions.append(question_dict["id"])
break
if "dynamic_id" not in question_dict:
- question = question_dict["question"]
- answers = question_dict["answer"].split(", ")
-
- var_tol = STANDARD_VARIATION_TOLERANCE
+ quiz_entry = QuizEntry(
+ question_dict["question"],
+ quiz_answers if isinstance(quiz_answers := question_dict["answer"], list) else [quiz_answers],
+ STANDARD_VARIATION_TOLERANCE
+ )
else:
format_func = DYNAMIC_QUESTIONS_FORMAT_FUNCS[question_dict["dynamic_id"]]
-
quiz_entry = format_func(
question_dict["question"],
question_dict["answer"],
)
- question, answers = quiz_entry.question, quiz_entry.answer
- answers = [answers]
-
- var_tol = DYNAMICALLY_GEN_VARIATION_TOLERANCE
-
embed = discord.Embed(
colour=Colours.gold,
- title=f"Question #{len(done_question)}",
- description=question,
+ title=f"Question #{len(done_questions)}",
+ description=quiz_entry.question,
)
if img_url := question_dict.get("img_url"):
@@ -354,13 +435,13 @@ class TriviaQuiz(commands.Cog):
def contains_correct_answer(m: discord.Message) -> bool:
return m.channel == ctx.channel and any(
fuzz.ratio(answer.lower(), m.content.lower()) > variation_tolerance
- for answer in answers
+ for answer in quiz_entry.answers
)
return contains_correct_answer
try:
- msg = await self.bot.wait_for("message", check=check_func(var_tol), timeout=10)
+ msg = await self.bot.wait_for("message", check=check_func(quiz_entry.var_tol), timeout=10)
except asyncio.TimeoutError:
# In case of TimeoutError and the game has been stopped, then do nothing.
if not self.game_status[ctx.channel.id]:
@@ -388,10 +469,10 @@ class TriviaQuiz(commands.Cog):
await self.send_answer(
ctx.channel,
- answers,
+ quiz_entry.answers,
False,
question_dict,
- self.question_limit - len(done_question) + 1,
+ self.question_limit - len(done_questions),
)
await asyncio.sleep(1)
@@ -421,10 +502,10 @@ class TriviaQuiz(commands.Cog):
await self.send_answer(
ctx.channel,
- answers,
+ quiz_entry.answers,
True,
question_dict,
- self.question_limit - len(done_question) + 1,
+ self.question_limit - len(done_questions),
)
await self.send_score(ctx.channel, self.game_player_scores[ctx.channel.id])
@@ -432,19 +513,18 @@ class TriviaQuiz(commands.Cog):
def make_start_embed(self, category: str) -> discord.Embed:
"""Generate a starting/introduction embed for the quiz."""
+ rules = "\n".join([f"{index}: {rule}" for index, rule in enumerate(RULES, start=1)])
+
start_embed = discord.Embed(
- colour=Colours.blue,
- title="A quiz game is starting!",
+ title="Quiz game Starting!!",
description=(
- f"This game consists of {self.question_limit + 1} questions.\n\n"
- "**Rules: **\n"
- "1. Only enclose your answer in backticks when the question tells you to.\n"
- "2. If the question specifies an answer format, follow it or else it won't be accepted.\n"
- "3. You have 30s per question. Points for each question reduces by 25 after 10s or after a hint.\n"
- "4. No cheating and have fun!\n\n"
- f"**Category**: {category}"
+ f"Each game consists of {self.question_limit} questions.\n"
+ f"**Rules :**\n{rules}"
+ f"\n **Category** : {category}"
),
+ colour=Colours.blue
)
+ start_embed.set_thumbnail(url=TRIVIA_QUIZ_ICON)
return start_embed
@@ -503,6 +583,7 @@ class TriviaQuiz(commands.Cog):
title="Score Board",
description="",
)
+ embed.set_thumbnail(url=TRIVIA_QUIZ_ICON)
sorted_dict = sorted(player_data.items(), key=operator.itemgetter(1), reverse=True)
for item in sorted_dict:
@@ -534,8 +615,8 @@ class TriviaQuiz(commands.Cog):
winners_mention = winner.mention
await channel.send(
- f"Congratulations {winners_mention} :tada: "
- f"You have won this quiz game with a grand total of {highest_points} points!"
+ f"{winners_mention} Congratulations "
+ f"on winning this quiz game with a grand total of {highest_points} points :tada:"
)
def category_embed(self) -> discord.Embed:
@@ -578,7 +659,8 @@ class TriviaQuiz(commands.Cog):
description="",
)
- if info is not None:
+ # Don't check for info is not None, as we want to filter out empty strings.
+ if info:
embed.description += f"**Information**\n{info}\n\n"
embed.description += (
diff --git a/bot/exts/holidays/easter/earth_photos.py b/bot/exts/holidays/easter/earth_photos.py
index f65790af..27442f1c 100644
--- a/bot/exts/holidays/easter/earth_photos.py
+++ b/bot/exts/holidays/easter/earth_photos.py
@@ -4,8 +4,7 @@ import discord
from discord.ext import commands
from bot.bot import Bot
-from bot.constants import Colours
-from bot.constants import Tokens
+from bot.constants import Colours, Tokens
log = logging.getLogger(__name__)
diff --git a/bot/exts/holidays/halloween/candy_collection.py b/bot/exts/holidays/halloween/candy_collection.py
index 4afd5913..bb9c93be 100644
--- a/bot/exts/holidays/halloween/candy_collection.py
+++ b/bot/exts/holidays/halloween/candy_collection.py
@@ -83,6 +83,11 @@ class CandyCollection(commands.Cog):
# if its not a candy or skull, and it is one of 10 most recent messages,
# proceed to add a skull/candy with higher chance
if str(reaction.emoji) not in (EMOJIS["SKULL"], EMOJIS["CANDY"]):
+ # Ensure the reaction is not for a bot's message so users can't spam
+ # reaction buttons like in .help to get candies.
+ if message.author.bot:
+ return
+
recent_message_ids = map(
lambda m: m.id,
await self.hacktober_channel.history(limit=10).flatten()
@@ -134,7 +139,7 @@ class CandyCollection(commands.Cog):
@property
def hacktober_channel(self) -> discord.TextChannel:
"""Get #hacktoberbot channel from its ID."""
- return self.bot.get_channel(id=Channels.community_bot_commands)
+ return self.bot.get_channel(Channels.community_bot_commands)
@staticmethod
async def send_spook_msg(
@@ -182,7 +187,7 @@ class CandyCollection(commands.Cog):
for index, record in enumerate(top_five)
) if top_five else "No Candies"
- e = discord.Embed(colour=discord.Colour.blurple())
+ e = discord.Embed(colour=discord.Colour.og_blurple())
e.add_field(
name="Top Candy Records",
value=generate_leaderboard(),
diff --git a/bot/exts/holidays/halloween/scarymovie.py b/bot/exts/holidays/halloween/scarymovie.py
index 33659fd8..89310b97 100644
--- a/bot/exts/holidays/halloween/scarymovie.py
+++ b/bot/exts/holidays/halloween/scarymovie.py
@@ -6,6 +6,7 @@ from discord.ext import commands
from bot.bot import Bot
from bot.constants import Tokens
+
log = logging.getLogger(__name__)
diff --git a/bot/exts/holidays/halloween/spookynamerate.py b/bot/exts/holidays/halloween/spookynamerate.py
index 2e59d4a8..a3aa4f13 100644
--- a/bot/exts/holidays/halloween/spookynamerate.py
+++ b/bot/exts/holidays/halloween/spookynamerate.py
@@ -143,7 +143,7 @@ class SpookyNameRate(Cog):
if data["author"] == ctx.author.id:
await ctx.send(
"But you have already added an entry! Type "
- f"`{self.bot.command_prefix}spookynamerate "
+ f"`{Client.prefix}spookynamerate "
"delete` to delete it, and then you can add it again"
)
return
@@ -185,7 +185,7 @@ class SpookyNameRate(Cog):
return
await ctx.send(
- f"But you don't have an entry... :eyes: Type `{self.bot.command_prefix}spookynamerate add your entry`"
+ f"But you don't have an entry... :eyes: Type `{Client.prefix}spookynamerate add your entry`"
)
@Cog.listener()
@@ -225,7 +225,7 @@ class SpookyNameRate(Cog):
"Okkey... Welcome to the **Spooky Name Rate Game**! It's a relatively simple game.\n"
f"Everyday, a random name will be sent in <#{Channels.community_bot_commands}> "
"and you need to try and spookify it!\nRegister your name using "
- f"`{self.bot.command_prefix}spookynamerate add spookified name`"
+ f"`{Client.prefix}spookynamerate add spookified name`"
)
await self.data.set("first_time", False)
diff --git a/bot/exts/holidays/halloween/spookyreact.py b/bot/exts/holidays/halloween/spookyreact.py
index 25e783f4..e228b91d 100644
--- a/bot/exts/holidays/halloween/spookyreact.py
+++ b/bot/exts/holidays/halloween/spookyreact.py
@@ -47,12 +47,12 @@ class SpookyReact(Cog):
Short-circuit helper check.
Return True if:
- * author is the bot
+ * author is a bot
* prefix is not None
"""
- # Check for self reaction
- if message.author == self.bot.user:
- log.debug(f"Ignoring reactions on self message. Message ID: {message.id}")
+ # Check if message author is a bot
+ if message.author.bot:
+ log.debug(f"Ignoring reactions on bot message. Message ID: {message.id}")
return True
# Check for command invocation
diff --git a/bot/exts/holidays/hanukkah/hanukkah_embed.py b/bot/exts/holidays/hanukkah/hanukkah_embed.py
index 00125be3..ac3eab7b 100644
--- a/bot/exts/holidays/hanukkah/hanukkah_embed.py
+++ b/bot/exts/holidays/hanukkah/hanukkah_embed.py
@@ -37,7 +37,7 @@ class HanukkahEmbed(commands.Cog):
hanukkah_dates.append(date)
return hanukkah_dates
- @in_month(Month.DECEMBER)
+ @in_month(Month.NOVEMBER, Month.DECEMBER)
@commands.command(name="hanukkah", aliases=("chanukah",))
async def hanukkah_festival(self, ctx: commands.Context) -> None:
"""Tells you about the Hanukkah Festivaltime of festival, festival day, etc)."""
diff --git a/bot/exts/holidays/valentines/lovecalculator.py b/bot/exts/holidays/valentines/lovecalculator.py
index 3999db2b..a53014e5 100644
--- a/bot/exts/holidays/valentines/lovecalculator.py
+++ b/bot/exts/holidays/valentines/lovecalculator.py
@@ -74,7 +74,8 @@ class LoveCalculator(Cog):
# We need the -1 due to how bisect returns the point
# see the documentation for further detail
# https://docs.python.org/3/library/bisect.html#bisect.bisect
- index = bisect.bisect(LOVE_DATA, (love_percent,)) - 1
+ love_threshold = [threshold for threshold, _ in LOVE_DATA]
+ index = bisect.bisect(love_threshold, love_percent) - 1
# We already have the nearest "fit" love level
# We only need the dict, so we can ditch the first element
_, data = LOVE_DATA[index]
diff --git a/bot/exts/utilities/bookmark.py b/bot/exts/utilities/bookmark.py
index a91ef1c0..a11c366b 100644
--- a/bot/exts/utilities/bookmark.py
+++ b/bot/exts/utilities/bookmark.py
@@ -7,7 +7,7 @@ import discord
from discord.ext import commands
from bot.bot import Bot
-from bot.constants import Categories, Colours, ERROR_REPLIES, Icons, WHITELISTED_CHANNELS
+from bot.constants import Colours, ERROR_REPLIES, Icons, Roles
from bot.utils.converters import WrappedMessageConverter
from bot.utils.decorators import whitelist_override
@@ -16,7 +16,6 @@ log = logging.getLogger(__name__)
# Number of seconds to wait for other users to bookmark the same message
TIMEOUT = 120
BOOKMARK_EMOJI = "📌"
-WHITELISTED_CATEGORIES = (Categories.help_in_use,)
class Bookmark(commands.Cog):
@@ -87,8 +86,8 @@ class Bookmark(commands.Cog):
await message.add_reaction(BOOKMARK_EMOJI)
return message
- @whitelist_override(channels=WHITELISTED_CHANNELS, categories=WHITELISTED_CATEGORIES)
@commands.command(name="bookmark", aliases=("bm", "pin"))
+ @whitelist_override(roles=(Roles.everyone,))
async def bookmark(
self,
ctx: commands.Context,
@@ -99,7 +98,13 @@ class Bookmark(commands.Cog):
"""Send the author a link to `target_message` via DMs."""
if not target_message:
if not ctx.message.reference:
- raise commands.UserInputError("You must either provide a valid message to bookmark, or reply to one.")
+ raise commands.UserInputError(
+ "You must either provide a valid message to bookmark, or reply to one."
+ "\n\nThe lookup strategy for a message is as follows (in order):"
+ "\n1. Lookup by '{channel ID}-{message ID}' (retrieved by shift-clicking on 'Copy ID')"
+ "\n2. Lookup by message ID (the message **must** have been sent after the bot last started)"
+ "\n3. Lookup by message URL"
+ )
target_message = ctx.message.reference.resolved
# Prevent users from bookmarking a message in a channel they don't have access to
diff --git a/bot/exts/utilities/challenges.py b/bot/exts/utilities/challenges.py
new file mode 100644
index 00000000..234eb0be
--- /dev/null
+++ b/bot/exts/utilities/challenges.py
@@ -0,0 +1,335 @@
+import logging
+from asyncio import to_thread
+from random import choice
+from typing import Union
+
+from bs4 import BeautifulSoup
+from discord import Embed, Interaction, SelectOption, ui
+from discord.ext import commands
+
+from bot.bot import Bot
+from bot.constants import Colours, Emojis, NEGATIVE_REPLIES
+
+log = logging.getLogger(__name__)
+API_ROOT = "https://www.codewars.com/api/v1/code-challenges/{kata_id}"
+
+# Map difficulty for the kata to color we want to display in the embed.
+# These colors are representative of the colors that each kyu's level represents on codewars.com
+MAPPING_OF_KYU = {
+ 8: 0xdddbda, 7: 0xdddbda, 6: 0xecb613, 5: 0xecb613,
+ 4: 0x3c7ebb, 3: 0x3c7ebb, 2: 0x866cc7, 1: 0x866cc7
+}
+
+# Supported languages for a kata on codewars.com
+SUPPORTED_LANGUAGES = {
+ "stable": [
+ "c", "c#", "c++", "clojure", "coffeescript", "coq", "crystal", "dart", "elixir",
+ "f#", "go", "groovy", "haskell", "java", "javascript", "kotlin", "lean", "lua", "nasm",
+ "php", "python", "racket", "ruby", "rust", "scala", "shell", "sql", "swift", "typescript"
+ ],
+ "beta": [
+ "agda", "bf", "cfml", "cobol", "commonlisp", "elm", "erlang", "factor",
+ "forth", "fortran", "haxe", "idris", "julia", "nim", "objective-c", "ocaml",
+ "pascal", "perl", "powershell", "prolog", "purescript", "r", "raku", "reason", "solidity", "vb.net"
+ ]
+}
+
+
+class InformationDropdown(ui.Select):
+ """A dropdown inheriting from ui.Select that allows finding out other information about the kata."""
+
+ def __init__(self, language_embed: Embed, tags_embed: Embed, other_info_embed: Embed, main_embed: Embed):
+ options = [
+ SelectOption(
+ label="Main Information",
+ description="See the kata's difficulty, description, etc.",
+ emoji="🌎"
+ ),
+ SelectOption(
+ label="Languages",
+ description="See what languages this kata supports!",
+ emoji=Emojis.reddit_post_text
+ ),
+ SelectOption(
+ label="Tags",
+ description="See what categories this kata falls under!",
+ emoji=Emojis.stackoverflow_tag
+ ),
+ SelectOption(
+ label="Other Information",
+ description="See how other people performed on this kata and more!",
+ emoji="ℹ"
+ )
+ ]
+
+ # We map the option label to the embed instance so that it can be easily looked up later in O(1)
+ self.mapping_of_embeds = {
+ "Main Information": main_embed,
+ "Languages": language_embed,
+ "Tags": tags_embed,
+ "Other Information": other_info_embed,
+ }
+
+ super().__init__(
+ placeholder="See more information regarding this kata",
+ min_values=1,
+ max_values=1,
+ options=options
+ )
+
+ async def callback(self, interaction: Interaction) -> None:
+ """Callback for when someone clicks on a dropdown."""
+ # Edit the message to the embed selected in the option
+ # The `original_message` attribute is set just after the message is sent with the view.
+ # The attribute is not set during initialization.
+ result_embed = self.mapping_of_embeds[self.values[0]]
+ await self.original_message.edit(embed=result_embed)
+
+
+class Challenges(commands.Cog):
+ """
+ Cog for the challenge command.
+
+ The challenge command pulls a random kata from codewars.com.
+ A kata is the name for a challenge, specific to codewars.com.
+
+ The challenge command also has filters to customize the kata that is given.
+ You can specify the language the kata should be from, difficulty and topic of the kata.
+ """
+
+ def __init__(self, bot: Bot):
+ self.bot = bot
+
+ async def kata_id(self, search_link: str, params: dict) -> Union[str, Embed]:
+ """
+ Uses bs4 to get the HTML code for the page of katas, where the page is the link of the formatted `search_link`.
+
+ This will webscrape the search page with `search_link` and then get the ID of a kata for the
+ codewars.com API to use.
+ """
+ async with self.bot.http_session.get(search_link, params=params) as response:
+ if response.status != 200:
+ error_embed = Embed(
+ title=choice(NEGATIVE_REPLIES),
+ description="We ran into an error when getting the kata from codewars.com, try again later.",
+ color=Colours.soft_red
+ )
+ log.error(f"Unexpected response from codewars.com, status code: {response.status}")
+ return error_embed
+
+ soup = BeautifulSoup(await response.text(), features="lxml")
+ first_kata_div = await to_thread(soup.find_all, "div", class_="item-title px-0")
+
+ if not first_kata_div:
+ raise commands.BadArgument("No katas could be found with the filters provided.")
+ elif len(first_kata_div) >= 3:
+ first_kata_div = choice(first_kata_div[:3])
+ elif "q=" not in search_link:
+ first_kata_div = choice(first_kata_div)
+ else:
+ first_kata_div = first_kata_div[0]
+
+ # There are numerous divs before arriving at the id of the kata, which can be used for the link.
+ first_kata_id = first_kata_div.a["href"].split("/")[-1]
+ return first_kata_id
+
+ async def kata_information(self, kata_id: str) -> Union[dict, Embed]:
+ """
+ Returns the information about the Kata.
+
+ Uses the codewars.com API to get information about the kata using `kata_id`.
+ """
+ async with self.bot.http_session.get(API_ROOT.format(kata_id=kata_id)) as response:
+ if response.status != 200:
+ error_embed = Embed(
+ title=choice(NEGATIVE_REPLIES),
+ description="We ran into an error when getting the kata information, try again later.",
+ color=Colours.soft_red
+ )
+ log.error(f"Unexpected response from codewars.com/api/v1, status code: {response.status}")
+ return error_embed
+
+ return await response.json()
+
+ @staticmethod
+ def main_embed(kata_information: dict) -> Embed:
+ """Creates the main embed which displays the name, difficulty and description of the kata."""
+ kata_description = kata_information["description"]
+ kata_url = f"https://codewars.com/kata/{kata_information['id']}"
+
+ # Ensuring it isn't over the length 1024
+ if len(kata_description) > 1024:
+ kata_description = "\n".join(kata_description[:1000].split("\n")[:-1]) + "..."
+ kata_description += f" [continue reading]({kata_url})"
+
+ kata_embed = Embed(
+ title=kata_information["name"],
+ description=kata_description,
+ color=MAPPING_OF_KYU[int(kata_information["rank"]["name"].replace(" kyu", ""))],
+ url=kata_url
+ )
+ kata_embed.add_field(name="Difficulty", value=kata_information["rank"]["name"], inline=False)
+ return kata_embed
+
+ @staticmethod
+ def language_embed(kata_information: dict) -> Embed:
+ """Creates the 'language embed' which displays all languages the kata supports."""
+ kata_url = f"https://codewars.com/kata/{kata_information['id']}"
+
+ languages = "\n".join(map(str.title, kata_information["languages"]))
+ language_embed = Embed(
+ title=kata_information["name"],
+ description=f"```yaml\nSupported Languages:\n{languages}\n```",
+ color=Colours.python_blue,
+ url=kata_url
+ )
+ return language_embed
+
+ @staticmethod
+ def tags_embed(kata_information: dict) -> Embed:
+ """
+ Creates the 'tags embed' which displays all the tags of the Kata.
+
+ Tags explain what the kata is about, this is what codewars.com calls categories.
+ """
+ kata_url = f"https://codewars.com/kata/{kata_information['id']}"
+
+ tags = "\n".join(kata_information["tags"])
+ tags_embed = Embed(
+ title=kata_information["name"],
+ description=f"```yaml\nTags:\n{tags}\n```",
+ color=Colours.grass_green,
+ url=kata_url
+ )
+ return tags_embed
+
+ @staticmethod
+ def miscellaneous_embed(kata_information: dict) -> Embed:
+ """
+ Creates the 'other information embed' which displays miscellaneous information about the kata.
+
+ This embed shows statistics such as the total number of people who completed the kata,
+ the total number of stars of the kata, etc.
+ """
+ kata_url = f"https://codewars.com/kata/{kata_information['id']}"
+
+ embed = Embed(
+ title=kata_information["name"],
+ description="```nim\nOther Information\n```",
+ color=Colours.grass_green,
+ url=kata_url
+ )
+ embed.add_field(
+ name="`Total Score`",
+ value=f"```css\n{kata_information['voteScore']}\n```",
+ inline=False
+ )
+ embed.add_field(
+ name="`Total Stars`",
+ value=f"```css\n{kata_information['totalStars']}\n```",
+ inline=False
+ )
+ embed.add_field(
+ name="`Total Completed`",
+ value=f"```css\n{kata_information['totalCompleted']}\n```",
+ inline=False
+ )
+ embed.add_field(
+ name="`Total Attempts`",
+ value=f"```css\n{kata_information['totalAttempts']}\n```",
+ inline=False
+ )
+ return embed
+
+ @staticmethod
+ def create_view(dropdown: InformationDropdown, link: str) -> ui.View:
+ """
+ Creates the discord.py View for the Discord message components (dropdowns and buttons).
+
+ The discord UI is implemented onto the embed, where the user can choose what information about the kata they
+ want, along with a link button to the kata itself.
+ """
+ view = ui.View()
+ view.add_item(dropdown)
+ view.add_item(ui.Button(label="View the Kata", url=link))
+ return view
+
+ @commands.command(aliases=["kata"])
+ @commands.cooldown(1, 5, commands.BucketType.user)
+ async def challenge(self, ctx: commands.Context, language: str = "python", *, query: str = None) -> None:
+ """
+ The challenge command pulls a random kata (challenge) from codewars.com.
+
+ The different ways to use this command are:
+ `.challenge <language>` - Pulls a random challenge within that language's scope.
+ `.challenge <language> <difficulty>` - The difficulty can be from 1-8,
+ 1 being the hardest, 8 being the easiest. This pulls a random challenge within that difficulty & language.
+ `.challenge <language> <query>` - Pulls a random challenge with the query provided under the language
+ `.challenge <language> <query>, <difficulty>` - Pulls a random challenge with the query provided,
+ under that difficulty within the language's scope.
+ """
+ if language.lower() not in SUPPORTED_LANGUAGES["stable"] + SUPPORTED_LANGUAGES["beta"]:
+ raise commands.BadArgument("This is not a recognized language on codewars.com!")
+
+ get_kata_link = f"https://codewars.com/kata/search/{language}"
+ params = {}
+
+ if language and not query:
+ level = f"-{choice([1, 2, 3, 4, 5, 6, 7, 8])}"
+ params["r[]"] = level
+ elif "," in query:
+ query_splitted = query.split("," if ", " not in query else ", ")
+
+ if len(query_splitted) > 2:
+ raise commands.BadArgument(
+ "There can only be one comma within the query, separating the difficulty and the query itself."
+ )
+
+ query, level = query_splitted
+ params["q"] = query
+ params["r[]"] = f"-{level}"
+ elif query.isnumeric():
+ params["r[]"] = f"-{query}"
+ else:
+ params["q"] = query
+
+ params["beta"] = str(language in SUPPORTED_LANGUAGES["beta"]).lower()
+
+ first_kata_id = await self.kata_id(get_kata_link, params)
+ if isinstance(first_kata_id, Embed):
+ # We ran into an error when retrieving the website link
+ await ctx.send(embed=first_kata_id)
+ return
+
+ kata_information = await self.kata_information(first_kata_id)
+ if isinstance(kata_information, Embed):
+ # Something went wrong when trying to fetch the kata information
+ await ctx.d(embed=kata_information)
+ return
+
+ kata_embed = self.main_embed(kata_information)
+ language_embed = self.language_embed(kata_information)
+ tags_embed = self.tags_embed(kata_information)
+ miscellaneous_embed = self.miscellaneous_embed(kata_information)
+
+ dropdown = InformationDropdown(
+ main_embed=kata_embed,
+ language_embed=language_embed,
+ tags_embed=tags_embed,
+ other_info_embed=miscellaneous_embed
+ )
+ kata_view = self.create_view(dropdown, f"https://codewars.com/kata/{first_kata_id}")
+ original_message = await ctx.send(
+ embed=kata_embed,
+ view=kata_view
+ )
+ dropdown.original_message = original_message
+
+ wait_for_kata = await kata_view.wait()
+ if wait_for_kata:
+ await original_message.edit(embed=kata_embed, view=None)
+
+
+def setup(bot: Bot) -> None:
+ """Load the Challenges cog."""
+ bot.add_cog(Challenges(bot))
diff --git a/bot/exts/utilities/conversationstarters.py b/bot/exts/utilities/conversationstarters.py
index dd537022..8bf2abfd 100644
--- a/bot/exts/utilities/conversationstarters.py
+++ b/bot/exts/utilities/conversationstarters.py
@@ -1,11 +1,15 @@
+import asyncio
+from contextlib import suppress
+from functools import partial
from pathlib import Path
+from typing import Union
+import discord
import yaml
-from discord import Color, Embed
from discord.ext import commands
from bot.bot import Bot
-from bot.constants import WHITELISTED_CHANNELS
+from bot.constants import MODERATION_ROLES, WHITELISTED_CHANNELS
from bot.utils.decorators import whitelist_override
from bot.utils.randomization import RandomCycle
@@ -35,35 +39,88 @@ TOPICS = {
class ConvoStarters(commands.Cog):
"""General conversation topics."""
- @commands.command()
- @whitelist_override(channels=ALL_ALLOWED_CHANNELS)
- async def topic(self, ctx: commands.Context) -> None:
+ def __init__(self, bot: Bot):
+ self.bot = bot
+
+ @staticmethod
+ def _build_topic_embed(channel_id: int) -> discord.Embed:
"""
- Responds with a random topic to start a conversation.
+ Build an embed containing a conversation topic.
If in a Python channel, a python-related topic will be given.
-
Otherwise, a random conversation topic will be received by the user.
"""
# No matter what, the form will be shown.
- embed = Embed(description=f"Suggest more topics [here]({SUGGESTION_FORM})!", color=Color.blurple())
+ embed = discord.Embed(
+ description=f"Suggest more topics [here]({SUGGESTION_FORM})!",
+ color=discord.Colour.og_blurple()
+ )
try:
- # Fetching topics.
- channel_topics = TOPICS[ctx.channel.id]
-
- # If the channel isn't Python-related.
+ channel_topics = TOPICS[channel_id]
except KeyError:
+ # Channel doesn't have any topics.
embed.title = f"**{next(TOPICS['default'])}**"
-
- # If the channel ID doesn't have any topics.
else:
embed.title = f"**{next(channel_topics)}**"
+ return embed
+
+ @staticmethod
+ def _predicate(
+ command_invoker: Union[discord.User, discord.Member],
+ message: discord.Message,
+ reaction: discord.Reaction,
+ user: discord.User
+ ) -> bool:
+ user_is_moderator = any(role.id in MODERATION_ROLES for role in getattr(user, "roles", []))
+ user_is_invoker = user.id == command_invoker.id
+
+ is_right_reaction = all((
+ reaction.message.id == message.id,
+ str(reaction.emoji) == "🔄",
+ user_is_moderator or user_is_invoker
+ ))
+ return is_right_reaction
+
+ async def _listen_for_refresh(
+ self,
+ command_invoker: Union[discord.User, discord.Member],
+ message: discord.Message
+ ) -> None:
+ await message.add_reaction("🔄")
+ while True:
+ try:
+ reaction, user = await self.bot.wait_for(
+ "reaction_add",
+ check=partial(self._predicate, command_invoker, message),
+ timeout=60.0
+ )
+ except asyncio.TimeoutError:
+ with suppress(discord.NotFound):
+ await message.clear_reaction("🔄")
+ break
+
+ try:
+ await message.edit(embed=self._build_topic_embed(message.channel.id))
+ except discord.NotFound:
+ break
+
+ with suppress(discord.NotFound):
+ await message.remove_reaction(reaction, user)
- finally:
- await ctx.send(embed=embed)
+ @commands.command()
+ @commands.cooldown(1, 60*2, commands.BucketType.channel)
+ @whitelist_override(channels=ALL_ALLOWED_CHANNELS)
+ async def topic(self, ctx: commands.Context) -> None:
+ """
+ Responds with a random topic to start a conversation.
+
+ Allows the refresh of a topic by pressing an emoji.
+ """
+ message = await ctx.send(embed=self._build_topic_embed(ctx.channel.id))
+ self.bot.loop.create_task(self._listen_for_refresh(ctx.author, message))
def setup(bot: Bot) -> None:
"""Load the ConvoStarters cog."""
- bot.add_cog(ConvoStarters())
+ bot.add_cog(ConvoStarters(bot))
diff --git a/bot/exts/utilities/emoji.py b/bot/exts/utilities/emoji.py
index 55d6b8e9..fa438d7f 100644
--- a/bot/exts/utilities/emoji.py
+++ b/bot/exts/utilities/emoji.py
@@ -107,11 +107,11 @@ class Emojis(commands.Cog):
title=f"Emoji Information: {emoji.name}",
description=textwrap.dedent(f"""
**Name:** {emoji.name}
- **Created:** {time_since(emoji.created_at, precision="hours")}
- **Date:** {datetime.strftime(emoji.created_at, "%d/%m/%Y")}
+ **Created:** {time_since(emoji.created_at.replace(tzinfo=None), precision="hours")}
+ **Date:** {datetime.strftime(emoji.created_at.replace(tzinfo=None), "%d/%m/%Y")}
**ID:** {emoji.id}
"""),
- color=Color.blurple(),
+ color=Color.og_blurple(),
url=str(emoji.url),
).set_thumbnail(url=emoji.url)
diff --git a/bot/exts/utilities/githubinfo.py b/bot/exts/utilities/githubinfo.py
index d00b408d..539e388b 100644
--- a/bot/exts/utilities/githubinfo.py
+++ b/bot/exts/utilities/githubinfo.py
@@ -67,7 +67,7 @@ class GithubInfo(commands.Cog):
embed = discord.Embed(
title=f"`{user_data['login']}`'s GitHub profile info",
description=f"```\n{user_data['bio']}\n```\n" if user_data["bio"] else "",
- colour=discord.Colour.blurple(),
+ colour=discord.Colour.og_blurple(),
url=user_data["html_url"],
timestamp=datetime.strptime(user_data["created_at"], "%Y-%m-%dT%H:%M:%SZ")
)
@@ -139,7 +139,7 @@ class GithubInfo(commands.Cog):
embed = discord.Embed(
title=repo_data["name"],
description=repo_data["description"],
- colour=discord.Colour.blurple(),
+ colour=discord.Colour.og_blurple(),
url=repo_data["html_url"]
)
diff --git a/bot/exts/utilities/issues.py b/bot/exts/utilities/issues.py
index 8a7ebed0..b6d5a43e 100644
--- a/bot/exts/utilities/issues.py
+++ b/bot/exts/utilities/issues.py
@@ -9,14 +9,7 @@ from discord.ext import commands
from bot.bot import Bot
from bot.constants import (
- Categories,
- Channels,
- Colours,
- ERROR_REPLIES,
- Emojis,
- NEGATIVE_REPLIES,
- Tokens,
- WHITELISTED_CHANNELS
+ Categories, Channels, Colours, ERROR_REPLIES, Emojis, NEGATIVE_REPLIES, Tokens, WHITELISTED_CHANNELS
)
from bot.utils.decorators import whitelist_override
from bot.utils.extensions import invoke_help_command
@@ -185,7 +178,7 @@ class Issues(commands.Cog):
return resp
@whitelist_override(channels=WHITELISTED_CHANNELS, categories=WHITELISTED_CATEGORIES)
- @commands.command(aliases=("pr",))
+ @commands.command(aliases=("issues", "pr", "prs"))
async def issue(
self,
ctx: commands.Context,
@@ -197,14 +190,23 @@ class Issues(commands.Cog):
# Remove duplicates
numbers = set(numbers)
- if len(numbers) > MAXIMUM_ISSUES:
- embed = discord.Embed(
+ err_message = None
+ if not numbers:
+ err_message = "You must have at least one issue/PR!"
+
+ elif len(numbers) > MAXIMUM_ISSUES:
+ err_message = f"Too many issues/PRs! (maximum of {MAXIMUM_ISSUES})"
+
+ # If there's an error with command invocation then send an error embed
+ if err_message is not None:
+ err_embed = discord.Embed(
title=random.choice(ERROR_REPLIES),
color=Colours.soft_red,
- description=f"Too many issues/PRs! (maximum of {MAXIMUM_ISSUES})"
+ description=err_message
)
- await ctx.send(embed=embed)
+ await ctx.send(embed=err_embed)
await invoke_help_command(ctx)
+ return
results = [await self.fetch_issues(number, repository, user) for number in numbers]
await ctx.send(embed=self.format_embed(results, user, repository))
diff --git a/bot/exts/utilities/realpython.py b/bot/exts/utilities/realpython.py
index ef8b2638..bf8f1341 100644
--- a/bot/exts/utilities/realpython.py
+++ b/bot/exts/utilities/realpython.py
@@ -1,5 +1,6 @@
import logging
from html import unescape
+from typing import Optional
from urllib.parse import quote_plus
from discord import Embed
@@ -31,9 +32,18 @@ class RealPython(commands.Cog):
@commands.command(aliases=["rp"])
@commands.cooldown(1, 10, commands.cooldowns.BucketType.user)
- async def realpython(self, ctx: commands.Context, *, user_search: str) -> None:
- """Send 5 articles that match the user's search terms."""
- params = {"q": user_search, "limit": 5, "kind": "article"}
+ async def realpython(self, ctx: commands.Context, amount: Optional[int] = 5, *, user_search: str) -> None:
+ """
+ Send some articles from RealPython that match the search terms.
+
+ By default the top 5 matches are sent, this can be overwritten to
+ a number between 1 and 5 by specifying an amount before the search query.
+ """
+ if not 1 <= amount <= 5:
+ await ctx.send("`amount` must be between 1 and 5 (inclusive).")
+ return
+
+ params = {"q": user_search, "limit": amount, "kind": "article"}
async with self.bot.http_session.get(url=API_ROOT, params=params) as response:
if response.status != 200:
logger.error(
diff --git a/bot/exts/utilities/reddit.py b/bot/exts/utilities/reddit.py
index e6cb5337..782583d2 100644
--- a/bot/exts/utilities/reddit.py
+++ b/bot/exts/utilities/reddit.py
@@ -244,7 +244,7 @@ class Reddit(Cog):
# Use only starting summary page for #reddit channel posts.
embed.description = self.build_pagination_pages(posts, paginate=False)
- embed.colour = Colour.blurple()
+ embed.colour = Colour.og_blurple()
return embed
@loop()
@@ -312,7 +312,7 @@ class Reddit(Cog):
await ctx.send(f"Here are the top {subreddit} posts of all time!")
embed = Embed(
- color=Colour.blurple()
+ color=Colour.og_blurple()
)
await ImagePaginator.paginate(pages, ctx, embed)
@@ -325,7 +325,7 @@ class Reddit(Cog):
await ctx.send(f"Here are today's top {subreddit} posts!")
embed = Embed(
- color=Colour.blurple()
+ color=Colour.og_blurple()
)
await ImagePaginator.paginate(pages, ctx, embed)
@@ -338,7 +338,7 @@ class Reddit(Cog):
await ctx.send(f"Here are this week's top {subreddit} posts!")
embed = Embed(
- color=Colour.blurple()
+ color=Colour.og_blurple()
)
await ImagePaginator.paginate(pages, ctx, embed)
@@ -349,7 +349,7 @@ class Reddit(Cog):
"""Send a paginated embed of all the subreddits we're relaying."""
embed = Embed()
embed.title = "Relayed subreddits."
- embed.colour = Colour.blurple()
+ embed.colour = Colour.og_blurple()
await LinePaginator.paginate(
RedditConfig.subreddits,
diff --git a/bot/exts/utilities/wikipedia.py b/bot/exts/utilities/wikipedia.py
index eccc1f8c..e5e8e289 100644
--- a/bot/exts/utilities/wikipedia.py
+++ b/bot/exts/utilities/wikipedia.py
@@ -82,13 +82,11 @@ class WikipediaSearch(commands.Cog):
if contents:
embed = Embed(
title="Wikipedia Search Results",
- colour=Color.blurple()
+ colour=Color.og_blurple()
)
embed.set_thumbnail(url=WIKI_THUMBNAIL)
embed.timestamp = datetime.utcnow()
- await LinePaginator.paginate(
- contents, ctx, embed
- )
+ await LinePaginator.paginate(contents, ctx, embed, restrict_to_user=ctx.author)
else:
await ctx.send(
"Sorry, we could not find a wikipedia article using that search term."
diff --git a/bot/exts/utilities/wtf_python.py b/bot/exts/utilities/wtf_python.py
new file mode 100644
index 00000000..980b3dba
--- /dev/null
+++ b/bot/exts/utilities/wtf_python.py
@@ -0,0 +1,138 @@
+import logging
+import random
+import re
+from typing import Optional
+
+import rapidfuzz
+from discord import Embed, File
+from discord.ext import commands, tasks
+
+from bot import constants
+from bot.bot import Bot
+
+log = logging.getLogger(__name__)
+
+WTF_PYTHON_RAW_URL = "http://raw.githubusercontent.com/satwikkansal/wtfpython/master/"
+BASE_URL = "https://github.com/satwikkansal/wtfpython"
+LOGO_PATH = "./bot/resources/utilities/wtf_python_logo.jpg"
+
+ERROR_MESSAGE = f"""
+Unknown WTF Python Query. Please try to reformulate your query.
+
+**Examples**:
+```md
+{constants.Client.prefix}wtf wild imports
+{constants.Client.prefix}wtf subclass
+{constants.Client.prefix}wtf del
+```
+If the problem persists send a message in <#{constants.Channels.dev_contrib}>
+"""
+
+MINIMUM_CERTAINTY = 55
+
+
+class WTFPython(commands.Cog):
+ """Cog that allows getting WTF Python entries from the WTF Python repository."""
+
+ def __init__(self, bot: Bot):
+ self.bot = bot
+ self.headers: dict[str, str] = {}
+ self.fetch_readme.start()
+
+ @tasks.loop(minutes=60)
+ async def fetch_readme(self) -> None:
+ """Gets the content of README.md from the WTF Python Repository."""
+ async with self.bot.http_session.get(f"{WTF_PYTHON_RAW_URL}README.md") as resp:
+ log.trace("Fetching the latest WTF Python README.md")
+ if resp.status == 200:
+ raw = await resp.text()
+ self.parse_readme(raw)
+
+ def parse_readme(self, data: str) -> None:
+ """
+ Parses the README.md into a dict.
+
+ It parses the readme into the `self.headers` dict,
+ where the key is the heading and the value is the
+ link to the heading.
+ """
+ # Match the start of examples, until the end of the table of contents (toc)
+ table_of_contents = re.search(
+ r"\[👀 Examples\]\(#-examples\)\n([\w\W]*)<!-- tocstop -->", data
+ )[0].split("\n")
+
+ for header in list(map(str.strip, table_of_contents)):
+ match = re.search(r"\[▶ (.*)\]\((.*)\)", header)
+ if match:
+ hyper_link = match[0].split("(")[1].replace(")", "")
+ self.headers[match[0]] = f"{BASE_URL}/{hyper_link}"
+
+ def fuzzy_match_header(self, query: str) -> Optional[str]:
+ """
+ Returns the fuzzy match of a query if its ratio is above "MINIMUM_CERTAINTY" else returns None.
+
+ "MINIMUM_CERTAINTY" is the lowest score at which the fuzzy match will return a result.
+ The certainty returned by rapidfuzz.process.extractOne is a score between 0 and 100,
+ with 100 being a perfect match.
+ """
+ match, certainty, _ = rapidfuzz.process.extractOne(query, self.headers.keys())
+ return match if certainty > MINIMUM_CERTAINTY else None
+
+ @commands.command(aliases=("wtf", "WTF"))
+ async def wtf_python(self, ctx: commands.Context, *, query: Optional[str] = None) -> None:
+ """
+ Search WTF Python repository.
+
+ Gets the link of the fuzzy matched query from https://github.com/satwikkansal/wtfpython.
+ Usage:
+ --> .wtf wild imports
+ """
+ if query is None:
+ no_query_embed = Embed(
+ title="WTF Python?!",
+ colour=constants.Colours.dark_green,
+ description="A repository filled with suprising snippets that can make you say WTF?!\n\n"
+ f"[Go to the Repository]({BASE_URL})"
+ )
+ logo = File(LOGO_PATH, filename="wtf_logo.jpg")
+ no_query_embed.set_thumbnail(url="attachment://wtf_logo.jpg")
+ await ctx.send(embed=no_query_embed, file=logo)
+ return
+
+ if len(query) > 50:
+ embed = Embed(
+ title=random.choice(constants.ERROR_REPLIES),
+ description=ERROR_MESSAGE,
+ colour=constants.Colours.soft_red,
+ )
+ match = None
+ else:
+ match = self.fuzzy_match_header(query)
+
+ if not match:
+ embed = Embed(
+ title=random.choice(constants.ERROR_REPLIES),
+ description=ERROR_MESSAGE,
+ colour=constants.Colours.soft_red,
+ )
+ await ctx.send(embed=embed)
+ return
+
+ embed = Embed(
+ title="WTF Python?!",
+ colour=constants.Colours.dark_green,
+ description=f"""Search result for '{query}': {match.split("]")[0].replace("[", "")}
+ [Go to Repository Section]({self.headers[match]})""",
+ )
+ logo = File(LOGO_PATH, filename="wtf_logo.jpg")
+ embed.set_thumbnail(url="attachment://wtf_logo.jpg")
+ await ctx.send(embed=embed, file=logo)
+
+ def cog_unload(self) -> None:
+ """Unload the cog and cancel the task."""
+ self.fetch_readme.cancel()
+
+
+def setup(bot: Bot) -> None:
+ """Load the WTFPython Cog."""
+ bot.add_cog(WTFPython(bot))
diff --git a/bot/group.py b/bot/group.py
deleted file mode 100644
index a7bc59b7..00000000
--- a/bot/group.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from discord.ext import commands
-
-
-class Group(commands.Group):
- """
- A `discord.ext.commands.Group` subclass which supports root aliases.
-
- A `root_aliases` keyword argument is added, which is a sequence of alias names that will act as
- top-level groups rather than being aliases of the command's group. It's stored as an attribute
- also named `root_aliases`.
- """
-
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- self.root_aliases = kwargs.get("root_aliases", [])
-
- if not isinstance(self.root_aliases, (list, tuple)):
- raise TypeError("Root aliases of a group must be a list or a tuple of strings.")
diff --git a/bot/monkey_patches.py b/bot/monkey_patches.py
new file mode 100644
index 00000000..fa6627d1
--- /dev/null
+++ b/bot/monkey_patches.py
@@ -0,0 +1,67 @@
+import logging
+from datetime import datetime, timedelta
+
+from discord import Forbidden, http
+from discord.ext import commands
+
+log = logging.getLogger(__name__)
+
+
+class Command(commands.Command):
+ """
+ A `discord.ext.commands.Command` subclass which supports root aliases.
+
+ A `root_aliases` keyword argument is added, which is a sequence of alias names that will act as
+ top-level commands rather than being aliases of the command's group. It's stored as an attribute
+ also named `root_aliases`.
+ """
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.root_aliases = kwargs.get("root_aliases", [])
+
+ if not isinstance(self.root_aliases, (list, tuple)):
+ raise TypeError("Root aliases of a command must be a list or a tuple of strings.")
+
+
+class Group(commands.Group):
+ """
+ A `discord.ext.commands.Group` subclass which supports root aliases.
+
+ A `root_aliases` keyword argument is added, which is a sequence of alias names that will act as
+ top-level groups rather than being aliases of the command's group. It's stored as an attribute
+ also named `root_aliases`.
+ """
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.root_aliases = kwargs.get("root_aliases", [])
+
+ if not isinstance(self.root_aliases, (list, tuple)):
+ raise TypeError("Root aliases of a group must be a list or a tuple of strings.")
+
+
+def patch_typing() -> None:
+ """
+ Sometimes discord turns off typing events by throwing 403's.
+
+ Handle those issues by patching the trigger_typing method so it ignores 403's in general.
+ """
+ log.debug("Patching send_typing, which should fix things breaking when discord disables typing events. Stay safe!")
+
+ original = http.HTTPClient.send_typing
+ last_403 = None
+
+ async def honeybadger_type(self, channel_id: int) -> None: # noqa: ANN001
+ nonlocal last_403
+ if last_403 and (datetime.utcnow() - last_403) < timedelta(minutes=5):
+ log.warning("Not sending typing event, we got a 403 less than 5 minutes ago.")
+ return
+ try:
+ await original(self, channel_id)
+ except Forbidden:
+ last_403 = datetime.utcnow()
+ log.warning("Got a 403 from typing event!")
+ pass
+
+ http.HTTPClient.send_typing = honeybadger_type
diff --git a/bot/resources/fun/anagram.json b/bot/resources/fun/anagram.json
new file mode 100644
index 00000000..ea5a5794
--- /dev/null
+++ b/bot/resources/fun/anagram.json
@@ -0,0 +1,17668 @@
+{
+ "eht": [
+ "eth",
+ "het",
+ "the"
+ ],
+ "adn": [
+ "and",
+ "dan",
+ "nad"
+ ],
+ "for": [
+ "for",
+ "fro",
+ "orf"
+ ],
+ "ahtt": [
+ "hatt",
+ "tath",
+ "that"
+ ],
+ "hist": [
+ "hist",
+ "hits",
+ "isth",
+ "shit",
+ "sith",
+ "this",
+ "tshi"
+ ],
+ "hitw": [
+ "whit",
+ "with"
+ ],
+ "not": [
+ "not",
+ "ont",
+ "ton"
+ ],
+ "aer": [
+ "aer",
+ "are",
+ "ear",
+ "era",
+ "rea"
+ ],
+ "fmor": [
+ "form",
+ "from"
+ ],
+ "enw": [
+ "new",
+ "wen"
+ ],
+ "emor": [
+ "mero",
+ "more",
+ "omer",
+ "rome"
+ ],
+ "asw": [
+ "saw",
+ "swa",
+ "was"
+ ],
+ "acn": [
+ "anc",
+ "can"
+ ],
+ "aegp": [
+ "gape",
+ "page",
+ "peag",
+ "pega"
+ ],
+ "ahs": [
+ "ahs",
+ "ash",
+ "has",
+ "sah",
+ "sha"
+ ],
+ "acehrs": [
+ "arches",
+ "ascher",
+ "casher",
+ "chares",
+ "chaser",
+ "eschar",
+ "raches",
+ "recash",
+ "search"
+ ],
+ "eefr": [
+ "feer",
+ "fere",
+ "free",
+ "reef"
+ ],
+ "btu": [
+ "btu",
+ "but",
+ "tub"
+ ],
+ "oru": [
+ "our",
+ "uro"
+ ],
+ "eno": [
+ "eon",
+ "neo",
+ "one"
+ ],
+ "ehort": [
+ "other",
+ "theor",
+ "thore",
+ "throe",
+ "toher"
+ ],
+ "eimt": [
+ "emit",
+ "item",
+ "mite",
+ "time"
+ ],
+ "ehty": [
+ "hyte",
+ "yeth",
+ "they"
+ ],
+ "eist": [
+ "seit",
+ "site",
+ "ties"
+ ],
+ "amy": [
+ "amy",
+ "yam",
+ "may",
+ "mya"
+ ],
+ "ahtw": [
+ "thaw",
+ "wath",
+ "what"
+ ],
+ "ehirt": [
+ "ither",
+ "rithe",
+ "their"
+ ],
+ "ensw": [
+ "news",
+ "sewn",
+ "snew",
+ "wens"
+ ],
+ "otu": [
+ "out",
+ "tou"
+ ],
+ "esu": [
+ "esu",
+ "sue",
+ "use"
+ ],
+ "any": [
+ "any",
+ "yan",
+ "nay"
+ ],
+ "eehrt": [
+ "ether",
+ "rethe",
+ "theer",
+ "there",
+ "three"
+ ],
+ "ees": [
+ "ese",
+ "see"
+ ],
+ "lnoy": [
+ "lyon",
+ "loyn",
+ "only"
+ ],
+ "his": [
+ "his",
+ "hsi",
+ "ihs",
+ "ish",
+ "shi"
+ ],
+ "ehnw": [
+ "hewn",
+ "when"
+ ],
+ "eehr": [
+ "heer",
+ "here"
+ ],
+ "how": [
+ "how",
+ "who"
+ ],
+ "alos": [
+ "also",
+ "laos",
+ "sola"
+ ],
+ "now": [
+ "now",
+ "own",
+ "won"
+ ],
+ "egt": [
+ "get",
+ "gte",
+ "teg"
+ ],
+ "eivw": [
+ "view",
+ "wive"
+ ],
+ "eilnno": [
+ "lionne",
+ "online"
+ ],
+ "first": [
+ "first",
+ "frist",
+ "frits",
+ "rifts"
+ ],
+ "been": [
+ "been",
+ "bene",
+ "eben"
+ ],
+ "eerw": [
+ "ewer",
+ "weer",
+ "were"
+ ],
+ "ceeirssv": [
+ "scrieves",
+ "services"
+ ],
+ "emos": [
+ "meso",
+ "mose",
+ "some"
+ ],
+ "eehst": [
+ "sheet",
+ "these"
+ ],
+ "ist": [
+ "ist",
+ "its",
+ "sit",
+ "tis",
+ "tsi"
+ ],
+ "eikl": [
+ "kiel",
+ "like"
+ ],
+ "ceeirsv": [
+ "cerevis",
+ "cresive",
+ "scrieve",
+ "service"
+ ],
+ "ahnt": [
+ "hant",
+ "tanh",
+ "than"
+ ],
+ "ceipr": [
+ "price",
+ "recip",
+ "repic"
+ ],
+ "adet": [
+ "adet",
+ "ated",
+ "date",
+ "tade",
+ "tead",
+ "teda"
+ ],
+ "opt": [
+ "opt",
+ "pot",
+ "top"
+ ],
+ "adh": [
+ "dah",
+ "dha",
+ "had"
+ ],
+ "ilst": [
+ "list",
+ "lits",
+ "silt",
+ "slit",
+ "tils"
+ ],
+ "aemn": [
+ "amen",
+ "enam",
+ "mane",
+ "mean",
+ "name",
+ "nema"
+ ],
+ "jstu": [
+ "just",
+ "juts"
+ ],
+ "eorv": [
+ "over",
+ "rove"
+ ],
+ "aestt": [
+ "state",
+ "taste",
+ "tates",
+ "teats",
+ "testa"
+ ],
+ "aery": [
+ "aery",
+ "ayre",
+ "eyra",
+ "yare",
+ "year"
+ ],
+ "ady": [
+ "ady",
+ "day",
+ "yad"
+ ],
+ "inot": [
+ "into",
+ "nito",
+ "oint",
+ "tino"
+ ],
+ "aeilm": [
+ "email",
+ "maile",
+ "malie",
+ "melia"
+ ],
+ "otw": [
+ "owt",
+ "tow",
+ "two",
+ "wot"
+ ],
+ "desu": [
+ "deus",
+ "dues",
+ "sude",
+ "sued",
+ "used"
+ ],
+ "alst": [
+ "alts",
+ "last",
+ "lats",
+ "salt",
+ "slat"
+ ],
+ "most": [
+ "most",
+ "mots",
+ "toms"
+ ],
+ "cimsu": [
+ "musci",
+ "music"
+ ],
+ "aadt": [
+ "adat",
+ "data"
+ ],
+ "aekm": [
+ "kame",
+ "make",
+ "meak"
+ ],
+ "ehmt": [
+ "meth",
+ "them"
+ ],
+ "emssty": [
+ "mystes",
+ "system"
+ ],
+ "opst": [
+ "opts",
+ "post",
+ "pots",
+ "spot",
+ "stop",
+ "tops"
+ ],
+ "ehr": [
+ "her",
+ "reh",
+ "rhe"
+ ],
+ "add": [
+ "add",
+ "dad"
+ ],
+ "chsu": [
+ "cush",
+ "such"
+ ],
+ "aeelps": [
+ "asleep",
+ "elapse",
+ "please",
+ "sapele"
+ ],
+ "aeegmss": [
+ "megasse",
+ "message"
+ ],
+ "aefrt": [
+ "afret",
+ "after",
+ "frate",
+ "trefa"
+ ],
+ "best": [
+ "best",
+ "bets"
+ ],
+ "aeforstw": [
+ "forwaste",
+ "software"
+ ],
+ "ehnt": [
+ "hent",
+ "neth",
+ "then"
+ ],
+ "ellw": [
+ "llew",
+ "well"
+ ],
+ "eehrw": [
+ "hewer",
+ "wheer",
+ "where"
+ ],
+ "fino": [
+ "fino",
+ "foin",
+ "info"
+ ],
+ "ghirst": [
+ "girths",
+ "griths",
+ "rights"
+ ],
+ "bkoos": [
+ "bokos",
+ "books"
+ ],
+ "chloos": [
+ "cholos",
+ "school"
+ ],
+ "aceh": [
+ "ache",
+ "each",
+ "haec"
+ ],
+ "iklns": [
+ "kilns",
+ "links",
+ "slink"
+ ],
+ "ehs": [
+ "hes",
+ "she"
+ ],
+ "eeirvw": [
+ "review",
+ "viewer"
+ ],
+ "aersy": [
+ "eyras",
+ "years",
+ "reasy",
+ "resay",
+ "sayer",
+ "seary"
+ ],
+ "bkoo": [
+ "boko",
+ "book"
+ ],
+ "eimst": [
+ "emits",
+ "items",
+ "metis",
+ "mites",
+ "smite",
+ "stime",
+ "times"
+ ],
+ "acmnopy": [
+ "company",
+ "copyman"
+ ],
+ "ader": [
+ "ared",
+ "daer",
+ "dare",
+ "dear",
+ "read"
+ ],
+ "deen": [
+ "dene",
+ "eden",
+ "ende",
+ "ened",
+ "need"
+ ],
+ "amny": [
+ "many",
+ "myna"
+ ],
+ "ersu": [
+ "rues",
+ "ruse",
+ "suer",
+ "sure",
+ "user"
+ ],
+ "adis": [
+ "aids",
+ "dais",
+ "dasi",
+ "dias",
+ "disa",
+ "sadi",
+ "said",
+ "sida"
+ ],
+ "deos": [
+ "does",
+ "dose",
+ "odes"
+ ],
+ "est": [
+ "est",
+ "set"
+ ],
+ "denru": [
+ "nuder",
+ "rendu",
+ "runed",
+ "under",
+ "unred"
+ ],
+ "aeeglnr": [
+ "enlarge",
+ "general",
+ "gleaner"
+ ],
+ "aceehrrs": [
+ "reachers",
+ "rechaser",
+ "research",
+ "searcher"
+ ],
+ "ailm": [
+ "amil",
+ "amli",
+ "lima",
+ "mail",
+ "mali",
+ "mila"
+ ],
+ "amp": [
+ "amp",
+ "map",
+ "pam"
+ ],
+ "eeirsvw": [
+ "reviews",
+ "viewers"
+ ],
+ "efil": [
+ "feil",
+ "fiel",
+ "file",
+ "leif",
+ "lief",
+ "life"
+ ],
+ "know": [
+ "know",
+ "wonk"
+ ],
+ "aegms": [
+ "games",
+ "mages"
+ ],
+ "awy": [
+ "yaw",
+ "way"
+ ],
+ "adsy": [
+ "days",
+ "dyas"
+ ],
+ "aprt": [
+ "part",
+ "prat",
+ "rapt",
+ "tarp",
+ "trap"
+ ],
+ "cdlou": [
+ "cloud",
+ "could"
+ ],
+ "aegrt": [
+ "gater",
+ "grate",
+ "great",
+ "greta",
+ "retag",
+ "targe",
+ "terga"
+ ],
+ "deintu": [
+ "dunite",
+ "united",
+ "untied"
+ ],
+ "ehlot": [
+ "helot",
+ "hotel",
+ "theol",
+ "thole"
+ ],
+ "aelr": [
+ "arle",
+ "earl",
+ "eral",
+ "lare",
+ "lear",
+ "rale",
+ "real"
+ ],
+ "ceenrt": [
+ "center",
+ "centre",
+ "entrec",
+ "recent",
+ "tenrec"
+ ],
+ "abey": [
+ "abey",
+ "abye"
+ ],
+ "mstu": [
+ "must",
+ "muts",
+ "smut",
+ "stum"
+ ],
+ "eorst": [
+ "roset",
+ "rotes",
+ "rotse",
+ "soter",
+ "stero",
+ "store",
+ "tores",
+ "torse"
+ ],
+ "aelrtv": [
+ "travel",
+ "varlet"
+ ],
+ "adem": [
+ "dame",
+ "edam",
+ "emda",
+ "made",
+ "maed",
+ "mead"
+ ],
+ "eoprrt": [
+ "porret",
+ "porter",
+ "pretor",
+ "report",
+ "troper"
+ ],
+ "adeilst": [
+ "details",
+ "dilates",
+ "distale",
+ "salited"
+ ],
+ "eiln": [
+ "lien",
+ "line",
+ "neil",
+ "nile"
+ ],
+ "emrst": [
+ "mster",
+ "terms"
+ ],
+ "ehlost": [
+ "helots",
+ "hostel",
+ "hostle",
+ "hotels",
+ "tholes"
+ ],
+ "dens": [
+ "dens",
+ "ends",
+ "send",
+ "sned"
+ ],
+ "ghirt": [
+ "girth",
+ "grith",
+ "right"
+ ],
+ "abceesu": [
+ "because",
+ "besauce"
+ ],
+ "acllo": [
+ "callo",
+ "colla",
+ "local"
+ ],
+ "ehost": [
+ "ethos",
+ "shote",
+ "theos",
+ "those"
+ ],
+ "ginsu": [
+ "suing",
+ "using"
+ ],
+ "elrsstu": [
+ "lusters",
+ "lustres",
+ "results",
+ "rustles",
+ "sutlers",
+ "tussler",
+ "ulsters"
+ ],
+ "ceffio": [
+ "coiffe",
+ "office"
+ ],
+ "acdeinotu": [
+ "auctioned",
+ "cautioned",
+ "coadunite",
+ "education",
+ "noctuidae"
+ ],
+ "aailnnot": [
+ "latonian",
+ "nataloin",
+ "national"
+ ],
+ "acr": [
+ "arc",
+ "car"
+ ],
+ "degins": [
+ "deigns",
+ "design",
+ "sdeign",
+ "signed",
+ "singed"
+ ],
+ "aekt": [
+ "kate",
+ "keat",
+ "keta",
+ "take",
+ "teak"
+ ],
+ "deopst": [
+ "depots",
+ "despot",
+ "posted",
+ "stoped"
+ ],
+ "eeinnrtt": [
+ "internet",
+ "renitent",
+ "trentine"
+ ],
+ "hiintw": [
+ "inwith",
+ "whitin",
+ "within"
+ ],
+ "aesstt": [
+ "estats",
+ "states",
+ "tasset",
+ "tastes"
+ ],
+ "antw": [
+ "nawt",
+ "tawn",
+ "want"
+ ],
+ "ehnop": [
+ "pheon",
+ "phone"
+ ],
+ "deeerrsv": [
+ "deserver",
+ "reserved",
+ "reversed"
+ ],
+ "abdes": [
+ "based",
+ "beads",
+ "sabed"
+ ],
+ "cdeo": [
+ "code",
+ "coed",
+ "deco",
+ "ecod"
+ ],
+ "hosw": [
+ "hows",
+ "show"
+ ],
+ "eenv": [
+ "even",
+ "neve",
+ "veen"
+ ],
+ "aceilps": [
+ "plaices",
+ "special"
+ ],
+ "ceiprs": [
+ "crepis",
+ "cripes",
+ "persic",
+ "precis",
+ "prices",
+ "spicer"
+ ],
+ "deinx": [
+ "index",
+ "nixed"
+ ],
+ "begin": [
+ "begin",
+ "being",
+ "binge"
+ ],
+ "emnow": [
+ "menow",
+ "women"
+ ],
+ "chmu": [
+ "chum",
+ "much"
+ ],
+ "gins": [
+ "gins",
+ "sign",
+ "sing",
+ "snig"
+ ],
+ "ikln": [
+ "kiln",
+ "link"
+ ],
+ "enop": [
+ "nope",
+ "open",
+ "peon",
+ "pone"
+ ],
+ "adoty": [
+ "doaty",
+ "toady",
+ "today"
+ ],
+ "hostu": [
+ "shout",
+ "south",
+ "thous"
+ ],
+ "aces": [
+ "aces",
+ "aesc",
+ "case",
+ "esca"
+ ],
+ "aems": [
+ "asem",
+ "maes",
+ "meas",
+ "mesa",
+ "same",
+ "seam"
+ ],
+ "aegps": [
+ "gapes",
+ "pages",
+ "peags"
+ ],
+ "einorsv": [
+ "renvois",
+ "version"
+ ],
+ "ceinost": [
+ "contise",
+ "noetics",
+ "notices",
+ "section"
+ ],
+ "dfnou": [
+ "fondu",
+ "found"
+ ],
+ "oprsst": [
+ "sports",
+ "strops"
+ ],
+ "adeelrt": [
+ "alerted",
+ "altered",
+ "delater",
+ "latrede",
+ "redealt",
+ "related",
+ "treadle"
+ ],
+ "bhot": [
+ "both",
+ "thob"
+ ],
+ "aaceimnr": [
+ "amacrine",
+ "american",
+ "camarine",
+ "camerina",
+ "cinerama"
+ ],
+ "aegm": [
+ "egma",
+ "game",
+ "mage"
+ ],
+ "acer": [
+ "acer",
+ "acre",
+ "care",
+ "cera",
+ "crea",
+ "race"
+ ],
+ "alott": [
+ "lotta",
+ "total"
+ ],
+ "acelp": [
+ "capel",
+ "clape",
+ "place"
+ ],
+ "den": [
+ "den",
+ "end",
+ "ned"
+ ],
+ "addlnoow": [
+ "download",
+ "woodland"
+ ],
+ "hiottuw": [
+ "outwith",
+ "without"
+ ],
+ "epr": [
+ "per",
+ "pre",
+ "rep"
+ ],
+ "hnort": [
+ "north",
+ "thorn"
+ ],
+ "ceeorrssu": [
+ "recourses",
+ "resources"
+ ],
+ "opsst": [
+ "posts",
+ "spots",
+ "stops"
+ ],
+ "bgi": [
+ "big",
+ "gib"
+ ],
+ "adeim": [
+ "aimed",
+ "amide",
+ "damie",
+ "media"
+ ],
+ "alw": [
+ "alw",
+ "awl",
+ "law"
+ ],
+ "aertw": [
+ "tawer",
+ "water",
+ "wreat"
+ ],
+ "hiorsty": [
+ "history",
+ "toryish"
+ ],
+ "ceiprstu": [
+ "crepitus",
+ "cuprites",
+ "pictures",
+ "piecrust"
+ ],
+ "art": [
+ "art",
+ "rat",
+ "tar",
+ "tra"
+ ],
+ "ceins": [
+ "cines",
+ "senci",
+ "since"
+ ],
+ "degiu": [
+ "digue",
+ "guide"
+ ],
+ "hops": [
+ "hops",
+ "hosp",
+ "phos",
+ "posh",
+ "shop",
+ "soph"
+ ],
+ "abdor": [
+ "abord",
+ "bardo",
+ "board",
+ "broad",
+ "dobra",
+ "dorab"
+ ],
+ "acilnoot": [
+ "colation",
+ "coontail",
+ "location"
+ ],
+ "ehitw": [
+ "white",
+ "withe"
+ ],
+ "allms": [
+ "malls",
+ "small"
+ ],
+ "aginrt": [
+ "gratin",
+ "rating",
+ "taring",
+ "tringa"
+ ],
+ "aert": [
+ "aret",
+ "arte",
+ "erat",
+ "rate",
+ "tare",
+ "tear",
+ "tera"
+ ],
+ "dginru": [
+ "during",
+ "ungird",
+ "ungrid"
+ ],
+ "asu": [
+ "aus",
+ "sau",
+ "usa"
+ ],
+ "enrrtu": [
+ "return",
+ "turner"
+ ],
+ "eisst": [
+ "sesti",
+ "siest",
+ "sites",
+ "sties"
+ ],
+ "eioprsuv": [
+ "pervious",
+ "previous",
+ "viperous"
+ ],
+ "eenstv": [
+ "events",
+ "steven"
+ ],
+ "elov": [
+ "levo",
+ "love",
+ "velo",
+ "vole"
+ ],
+ "dlo": [
+ "dol",
+ "lod",
+ "old"
+ ],
+ "aimn": [
+ "amin",
+ "anim",
+ "iman",
+ "main",
+ "mani",
+ "mian",
+ "mina",
+ "naim"
+ ],
+ "cdeiinoprst": [
+ "description",
+ "discerption",
+ "predictions"
+ ],
+ "aceinnrsu": [
+ "insurance",
+ "nuisancer"
+ ],
+ "aehnort": [
+ "another",
+ "athenor",
+ "rheotan"
+ ],
+ "hwy": [
+ "hwy",
+ "why"
+ ],
+ "ahlls": [
+ "halls",
+ "shall"
+ ],
+ "illst": [
+ "lilts",
+ "still",
+ "tills"
+ ],
+ "emnoy": [
+ "emony",
+ "moyen",
+ "money"
+ ],
+ "eervy": [
+ "every",
+ "veery",
+ "verey"
+ ],
+ "giilnst": [
+ "listing",
+ "silting",
+ "sliting",
+ "tilings"
+ ],
+ "eilltt": [
+ "little",
+ "tillet"
+ ],
+ "iistv": [
+ "visit",
+ "vitis"
+ ],
+ "aesv": [
+ "aves",
+ "save",
+ "vase"
+ ],
+ "loost": [
+ "loots",
+ "lotos",
+ "sloot",
+ "sotol",
+ "stool",
+ "tools"
+ ],
+ "low": [
+ "low",
+ "lwo",
+ "owl"
+ ],
+ "elpry": [
+ "lepry",
+ "plyer",
+ "reply"
+ ],
+ "cemorstu": [
+ "costumer",
+ "customer"
+ ],
+ "acemopr": [
+ "compare",
+ "compear"
+ ],
+ "cdeilnu": [
+ "include",
+ "nuclide"
+ ],
+ "aeluv": [
+ "uveal",
+ "value"
+ ],
+ "aceilrt": [
+ "article",
+ "recital"
+ ],
+ "kory": [
+ "york",
+ "kory",
+ "roky"
+ ],
+ "amn": [
+ "man",
+ "mna",
+ "nam"
+ ],
+ "deioprv": [
+ "dropvie",
+ "prevoid",
+ "provide"
+ ],
+ "ceorsu": [
+ "cerous",
+ "course",
+ "crouse",
+ "source"
+ ],
+ "aelnr": [
+ "learn",
+ "neral",
+ "renal"
+ ],
+ "aels": [
+ "ales",
+ "elsa",
+ "lase",
+ "leas",
+ "sale",
+ "seal",
+ "slae"
+ ],
+ "adnoru": [
+ "around",
+ "arundo"
+ ],
+ "bjo": [
+ "job",
+ "obj"
+ ],
+ "ceoprss": [
+ "corpses",
+ "process"
+ ],
+ "eent": [
+ "eten",
+ "neet",
+ "nete",
+ "teen"
+ ],
+ "moor": [
+ "moor",
+ "moro",
+ "room"
+ ],
+ "oot": [
+ "oot",
+ "oto",
+ "too"
+ ],
+ "cdeirt": [
+ "credit",
+ "direct",
+ "triced"
+ ],
+ "inopt": [
+ "pinot",
+ "pinto",
+ "piton",
+ "point"
+ ],
+ "ijno": [
+ "join",
+ "joni"
+ ],
+ "aceegiorst": [
+ "categories",
+ "categorise"
+ ],
+ "estw": [
+ "stew",
+ "tews",
+ "west",
+ "wets"
+ ],
+ "aelss": [
+ "lases",
+ "sales",
+ "salse",
+ "seals"
+ ],
+ "kloo": [
+ "kolo",
+ "look"
+ ],
+ "eghilns": [
+ "english",
+ "shingle"
+ ],
+ "eflt": [
+ "felt",
+ "flet",
+ "left"
+ ],
+ "aemt": [
+ "mate",
+ "meat",
+ "meta",
+ "tame",
+ "team",
+ "tema"
+ ],
+ "aeestt": [
+ "estate",
+ "testae"
+ ],
+ "ceelst": [
+ "elects",
+ "select"
+ ],
+ "hoopst": [
+ "photos",
+ "pothos"
+ ],
+ "agy": [
+ "agy",
+ "gay"
+ ],
+ "adehrt": [
+ "dearth",
+ "hatred",
+ "rathed",
+ "thread"
+ ],
+ "acegorty": [
+ "category",
+ "greycoat"
+ ],
+ "enot": [
+ "eton",
+ "note",
+ "tone"
+ ],
+ "eilv": [
+ "evil",
+ "levi",
+ "live",
+ "veil",
+ "vile",
+ "vlei"
+ ],
+ "aeglr": [
+ "argel",
+ "argle",
+ "ergal",
+ "garle",
+ "glare",
+ "lager",
+ "large",
+ "regal"
+ ],
+ "aegllry": [
+ "allergy",
+ "gallery",
+ "largely",
+ "regally"
+ ],
+ "abelt": [
+ "ablet",
+ "batel",
+ "belat",
+ "blate",
+ "bleat",
+ "tabel",
+ "table"
+ ],
+ "eehorvw": [
+ "everwho",
+ "however",
+ "whoever"
+ ],
+ "aellry": [
+ "rallye",
+ "really"
+ ],
+ "acinot": [
+ "action",
+ "atonic",
+ "cation"
+ ],
+ "arstt": [
+ "start",
+ "tarts"
+ ],
+ "eeirss": [
+ "seiser",
+ "series",
+ "sirees"
+ ],
+ "air": [
+ "air",
+ "ira",
+ "ria"
+ ],
+ "ahmnu": [
+ "human",
+ "nahum"
+ ],
+ "esy": [
+ "yes",
+ "sey",
+ "sye"
+ ],
+ "cdenos": [
+ "codens",
+ "second"
+ ],
+ "hot": [
+ "hot",
+ "tho"
+ ],
+ "cost": [
+ "cost",
+ "cots",
+ "scot"
+ ],
+ "achmr": [
+ "charm",
+ "march"
+ ],
+ "asy": [
+ "ays",
+ "yas",
+ "say"
+ ],
+ "acdeilm": [
+ "camelid",
+ "claimed",
+ "decimal",
+ "declaim",
+ "medical"
+ ],
+ "estt": [
+ "sett",
+ "stet",
+ "test"
+ ],
+ "definr": [
+ "finder",
+ "friend",
+ "redfin",
+ "refind"
+ ],
+ "eerrsv": [
+ "revers",
+ "server",
+ "verser"
+ ],
+ "dstuy": [
+ "dusty",
+ "study"
+ ],
+ "acrt": [
+ "cart",
+ "trac"
+ ],
+ "aceilrst": [
+ "altrices",
+ "articles",
+ "recitals",
+ "selictar",
+ "sterical"
+ ],
+ "ans": [
+ "ans",
+ "san"
+ ],
+ "aagin": [
+ "again",
+ "angia"
+ ],
+ "alpy": [
+ "paly",
+ "pyal",
+ "pyla",
+ "play"
+ ],
+ "eisssu": [
+ "issues",
+ "suisse"
+ ],
+ "ailpr": [
+ "april",
+ "parli",
+ "pilar",
+ "ripal"
+ ],
+ "eenrv": [
+ "nerve",
+ "never"
+ ],
+ "erssu": [
+ "ruses",
+ "russe",
+ "suers",
+ "sures",
+ "users"
+ ],
+ "eerstt": [
+ "retest",
+ "setter",
+ "street",
+ "tester"
+ ],
+ "ciopt": [
+ "optic",
+ "picot",
+ "topic"
+ ],
+ "ghinst": [
+ "nights",
+ "snight",
+ "things"
+ ],
+ "giknorw": [
+ "kingrow",
+ "working"
+ ],
+ "aaginst": [
+ "against",
+ "antisag"
+ ],
+ "atx": [
+ "tax",
+ "xat"
+ ],
+ "enoprs": [
+ "person",
+ "speron"
+ ],
+ "below": [
+ "below",
+ "bowel",
+ "bowle",
+ "elbow"
+ ],
+ "beilmo": [
+ "bemoil",
+ "emboil",
+ "emboli",
+ "mobile"
+ ],
+ "elss": [
+ "less",
+ "sels"
+ ],
+ "got": [
+ "got",
+ "tog"
+ ],
+ "aprty": [
+ "party",
+ "trypa"
+ ],
+ "gilno": [
+ "lingo",
+ "login"
+ ],
+ "densttu": [
+ "student",
+ "stunted"
+ ],
+ "elt": [
+ "elt",
+ "let",
+ "tel"
+ ],
+ "effors": [
+ "offers",
+ "reffos"
+ ],
+ "aegll": [
+ "egall",
+ "legal"
+ ],
+ "eorsst": [
+ "retoss",
+ "rosets",
+ "sorest",
+ "sortes",
+ "stores",
+ "torses",
+ "tosser"
+ ],
+ "deis": [
+ "deis",
+ "desi",
+ "dies",
+ "ides",
+ "ised",
+ "seid",
+ "side"
+ ],
+ "act": [
+ "act",
+ "cat"
+ ],
+ "der": [
+ "der",
+ "erd",
+ "red"
+ ],
+ "acilos": [
+ "colias",
+ "scolia",
+ "social"
+ ],
+ "eoqtu": [
+ "quote",
+ "toque"
+ ],
+ "aaegglnu": [
+ "ganguela",
+ "langauge",
+ "language"
+ ],
+ "orsty": [
+ "ryots",
+ "sorty",
+ "story",
+ "stroy",
+ "tyros",
+ "troys"
+ ],
+ "ells": [
+ "ells",
+ "sell"
+ ],
+ "inoopst": [
+ "options",
+ "potions"
+ ],
+ "aerst": [
+ "arest",
+ "aster",
+ "astre",
+ "rates",
+ "reast",
+ "resat",
+ "serta",
+ "stare",
+ "strae",
+ "tares",
+ "tarse",
+ "tears",
+ "teras",
+ "treas"
+ ],
+ "aceert": [
+ "cerate",
+ "cetera",
+ "create",
+ "ecarte"
+ ],
+ "eky": [
+ "key",
+ "kye"
+ ],
+ "bdoy": [
+ "body",
+ "boyd",
+ "doby"
+ ],
+ "defil": [
+ "felid",
+ "fidel",
+ "field",
+ "filed",
+ "flied"
+ ],
+ "efw": [
+ "few",
+ "wef"
+ ],
+ "aest": [
+ "ates",
+ "east",
+ "eats",
+ "etas",
+ "sate",
+ "seat",
+ "seta",
+ "teas"
+ ],
+ "aeppr": [
+ "paper",
+ "rappe"
+ ],
+ "egilns": [
+ "glinse",
+ "ingles",
+ "lignes",
+ "seling",
+ "single",
+ "slinge"
+ ],
+ "aeg": [
+ "age",
+ "gae"
+ ],
+ "aeelmpx": [
+ "example",
+ "exempla"
+ ],
+ "aelstt": [
+ "latest",
+ "sattle",
+ "taslet"
+ ],
+ "ador": [
+ "ador",
+ "dora",
+ "orad",
+ "road"
+ ],
+ "ghint": [
+ "night",
+ "thing"
+ ],
+ "aestx": [
+ "taxes",
+ "texas"
+ ],
+ "cot": [
+ "cot",
+ "cto",
+ "oct",
+ "otc"
+ ],
+ "apy": [
+ "yap",
+ "pay",
+ "pya"
+ ],
+ "ekopr": [
+ "poker",
+ "proke"
+ ],
+ "assttu": [
+ "status",
+ "suttas"
+ ],
+ "beorsw": [
+ "bowers",
+ "bowser",
+ "browse"
+ ],
+ "eissu": [
+ "issue",
+ "susie"
+ ],
+ "aegnr": [
+ "anger",
+ "areng",
+ "grane",
+ "range",
+ "regna",
+ "renga"
+ ],
+ "eellrs": [
+ "resell",
+ "seller"
+ ],
+ "cortu": [
+ "court",
+ "crout",
+ "turco"
+ ],
+ "elrstu": [
+ "luster",
+ "lustre",
+ "result",
+ "rustle",
+ "sutler",
+ "ulster"
+ ],
+ "eirtw": [
+ "twier",
+ "twire",
+ "write"
+ ],
+ "arw": [
+ "raw",
+ "war"
+ ],
+ "nov": [
+ "nov",
+ "von"
+ ],
+ "effor": [
+ "offer",
+ "reffo"
+ ],
+ "belu": [
+ "bleu",
+ "blue",
+ "lube"
+ ],
+ "aesy": [
+ "ayes",
+ "easy",
+ "eyas",
+ "yeas"
+ ],
+ "efils": [
+ "felis",
+ "files",
+ "flies"
+ ],
+ "eeqrstu": [
+ "quester",
+ "request"
+ ],
+ "achin": [
+ "chain",
+ "chian",
+ "china"
+ ],
+ "ceiprtu": [
+ "cuprite",
+ "picture"
+ ],
+ "deens": [
+ "denes",
+ "dense",
+ "needs"
+ ],
+ "ety": [
+ "ety",
+ "yet",
+ "tye"
+ ],
+ "ajmor": [
+ "jarmo",
+ "joram",
+ "major"
+ ],
+ "arst": [
+ "arts",
+ "astr",
+ "rats",
+ "sart",
+ "star",
+ "stra",
+ "tars",
+ "tsar"
+ ],
+ "aaers": [
+ "arase",
+ "areas"
+ ],
+ "aceps": [
+ "capes",
+ "paces",
+ "scape",
+ "space"
+ ],
+ "adhn": [
+ "dhan",
+ "hand"
+ ],
+ "nsu": [
+ "nus",
+ "sun",
+ "uns"
+ ],
+ "aghinnostw": [
+ "nowanights",
+ "washington"
+ ],
+ "eegimnt": [
+ "meeting",
+ "teeming",
+ "tegmine"
+ ],
+ "eeinrstt": [
+ "insetter",
+ "interest",
+ "interset",
+ "sternite",
+ "trientes"
+ ],
+ "eekp": [
+ "keep",
+ "peek",
+ "peke"
+ ],
+ "eenrt": [
+ "enter",
+ "entre",
+ "neter",
+ "renet",
+ "rente",
+ "terne",
+ "treen"
+ ],
+ "aehrs": [
+ "asher",
+ "earsh",
+ "hares",
+ "hears",
+ "rheas",
+ "share",
+ "shear"
+ ],
+ "adegnr": [
+ "danger",
+ "gander",
+ "garden",
+ "grande",
+ "ranged"
+ ],
+ "aceimnops": [
+ "campesino",
+ "companies"
+ ],
+ "deilst": [
+ "delist",
+ "desilt",
+ "idlest",
+ "listed",
+ "silted",
+ "tildes"
+ ],
+ "abby": [
+ "abby",
+ "baby"
+ ],
+ "eegnry": [
+ "energy",
+ "gyrene",
+ "greeny",
+ "ygerne"
+ ],
+ "nru": [
+ "run",
+ "urn"
+ ],
+ "ent": [
+ "net",
+ "ten"
+ ],
+ "eiorsst": [
+ "isoster",
+ "rosiest",
+ "rossite",
+ "sorites",
+ "sorties",
+ "stories",
+ "trioses"
+ ],
+ "ptu": [
+ "put",
+ "tup"
+ ],
+ "eoprrst": [
+ "porters",
+ "pretors",
+ "reports",
+ "sporter",
+ "strepor"
+ ],
+ "rty": [
+ "tyr",
+ "try"
+ ],
+ "aegims": [
+ "ageism",
+ "images"
+ ],
+ "deeinprst": [
+ "president",
+ "serpentid"
+ ],
+ "ceinot": [
+ "conite",
+ "eciton",
+ "noetic",
+ "notice",
+ "octine"
+ ],
+ "adeh": [
+ "hade",
+ "haed",
+ "head"
+ ],
+ "adior": [
+ "aroid",
+ "doria",
+ "radio"
+ ],
+ "ilntu": [
+ "unlit",
+ "until"
+ ],
+ "cloor": [
+ "color",
+ "corol",
+ "crool"
+ ],
+ "efls": [
+ "fels",
+ "self"
+ ],
+ "cdeilnsu": [
+ "includes",
+ "nuclides",
+ "unsliced"
+ ],
+ "ceno": [
+ "cone",
+ "econ",
+ "once"
+ ],
+ "ehorst": [
+ "horste",
+ "hoster",
+ "others",
+ "reshot",
+ "throes",
+ "tosher"
+ ],
+ "aelst": [
+ "astel",
+ "least",
+ "salet",
+ "setal",
+ "slate",
+ "stale",
+ "steal",
+ "stela",
+ "taels",
+ "tales",
+ "teals",
+ "tesla"
+ ],
+ "glo": [
+ "gol",
+ "log"
+ ],
+ "definrs": [
+ "finders",
+ "friends",
+ "redfins",
+ "refinds"
+ ],
+ "afq": [
+ "faq",
+ "qaf"
+ ],
+ "adert": [
+ "adret",
+ "dater",
+ "derat",
+ "detar",
+ "drate",
+ "rated",
+ "tarde",
+ "tared",
+ "trade",
+ "tread"
+ ],
+ "deiinot": [
+ "edition",
+ "odinite",
+ "otidine",
+ "tineoid"
+ ],
+ "acrs": [
+ "arcs",
+ "cars",
+ "scar",
+ "srac"
+ ],
+ "aeegmsss": [
+ "megasses",
+ "messages"
+ ],
+ "abel": [
+ "abel",
+ "able",
+ "albe",
+ "bael",
+ "bale",
+ "beal",
+ "bela",
+ "blae",
+ "blea"
+ ],
+ "deioprsv": [
+ "disprove",
+ "provides"
+ ],
+ "aadelry": [
+ "aleyard",
+ "already"
+ ],
+ "eegnr": [
+ "genre",
+ "green",
+ "grene",
+ "neger",
+ "reneg"
+ ],
+ "deisstu": [
+ "studies",
+ "tissued"
+ ],
+ "celos": [
+ "cloes",
+ "close",
+ "coles",
+ "socle"
+ ],
+ "deirv": [
+ "deriv",
+ "diver",
+ "drive",
+ "rived",
+ "verdi"
+ ],
+ "aeelrsv": [
+ "laveers",
+ "leavers",
+ "reveals",
+ "several",
+ "vealers"
+ ],
+ "dglo": [
+ "glod",
+ "gold"
+ ],
+ "eps": [
+ "esp",
+ "pes",
+ "sep"
+ ],
+ "horst": [
+ "horst",
+ "short"
+ ],
+ "lot": [
+ "lot",
+ "tlo",
+ "tol"
+ ],
+ "aks": [
+ "ask",
+ "kas",
+ "sak"
+ ],
+ "deiilmt": [
+ "delimit",
+ "limited"
+ ],
+ "aemns": [
+ "amens",
+ "manes",
+ "manse",
+ "means",
+ "mensa",
+ "names",
+ "nemas",
+ "samen",
+ "senam"
+ ],
+ "cdeiorrt": [
+ "creditor",
+ "director"
+ ],
+ "adily": [
+ "daily",
+ "lydia"
+ ],
+ "abceh": [
+ "bache",
+ "beach"
+ ],
+ "apst": [
+ "apts",
+ "past",
+ "pats",
+ "spat",
+ "stap",
+ "taps"
+ ],
+ "nopu": [
+ "noup",
+ "puno",
+ "upon"
+ ],
+ "deiopr": [
+ "dopier",
+ "period"
+ ],
+ "aeehrtw": [
+ "weather",
+ "whereat",
+ "wreathe"
+ ],
+ "amr": [
+ "arm",
+ "mar",
+ "ram"
+ ],
+ "deno": [
+ "done",
+ "node"
+ ],
+ "accehilnt": [
+ "catchline",
+ "technical"
+ ],
+ "opr": [
+ "por",
+ "pro"
+ ],
+ "eginor": [
+ "eringo",
+ "ignore",
+ "region"
+ ],
+ "cdeorr": [
+ "corder",
+ "record"
+ ],
+ "cdeorrs": [
+ "corders",
+ "records"
+ ],
+ "aacdelnr": [
+ "calander",
+ "calandre",
+ "calendar",
+ "landrace"
+ ],
+ "cosst": [
+ "costs",
+ "scots"
+ ],
+ "aeemnsttt": [
+ "statement",
+ "testament"
+ ],
+ "aprst": [
+ "parts",
+ "prats",
+ "spart",
+ "sprat",
+ "strap",
+ "tarps",
+ "traps"
+ ],
+ "agu": [
+ "aug",
+ "gau"
+ ],
+ "eerv": [
+ "ever",
+ "reve",
+ "veer"
+ ],
+ "addlnoosw": [
+ "downloads",
+ "woodlands"
+ ],
+ "aelry": [
+ "early",
+ "layer",
+ "leary",
+ "relay"
+ ],
+ "eilms": [
+ "limes",
+ "melis",
+ "miles",
+ "slime",
+ "smile"
+ ],
+ "dnosu": [
+ "nodus",
+ "ounds",
+ "sound"
+ ],
+ "ceeorrsu": [
+ "recourse",
+ "resource"
+ ],
+ "eenprst": [
+ "penster",
+ "present",
+ "repents",
+ "serpent",
+ "strepen"
+ ],
+ "ago": [
+ "ago",
+ "goa"
+ ],
+ "dorw": [
+ "drow",
+ "word"
+ ],
+ "apr": [
+ "apr",
+ "par",
+ "rap"
+ ],
+ "einrttw": [
+ "twinter",
+ "written"
+ ],
+ "ghinost": [
+ "hosting",
+ "onsight"
+ ],
+ "elrsu": [
+ "lures",
+ "luser",
+ "rules",
+ "sluer"
+ ],
+ "afiln": [
+ "alfin",
+ "final",
+ "flain"
+ ],
+ "adltu": [
+ "adult",
+ "dault",
+ "dulat"
+ ],
+ "ceikstt": [
+ "sticket",
+ "tickets"
+ ],
+ "aiv": [
+ "iva",
+ "vai",
+ "via"
+ ],
+ "acehp": [
+ "chape",
+ "cheap",
+ "peach"
+ ],
+ "diks": [
+ "disk",
+ "kids",
+ "skid"
+ ],
+ "eimnstu": [
+ "minuets",
+ "minutes",
+ "mistune",
+ "mutines"
+ ],
+ "eels": [
+ "eels",
+ "else",
+ "lees",
+ "lese",
+ "seel",
+ "sele",
+ "slee"
+ ],
+ "ckor": [
+ "cork",
+ "rock"
+ ],
+ "adeginr": [
+ "degrain",
+ "deraign",
+ "deringa",
+ "gradine",
+ "grained",
+ "reading"
+ ],
+ "ciopst": [
+ "copist",
+ "coptis",
+ "optics",
+ "picots",
+ "postic",
+ "topics"
+ ],
+ "abd": [
+ "abd",
+ "bad",
+ "dab"
+ ],
+ "ipst": [
+ "pist",
+ "pits",
+ "spit",
+ "tips"
+ ],
+ "lpsu": [
+ "plus",
+ "puls",
+ "slup"
+ ],
+ "ceorv": [
+ "corve",
+ "cover"
+ ],
+ "deit": [
+ "deti",
+ "diet",
+ "dite",
+ "edit",
+ "tide",
+ "tied"
+ ],
+ "ceenprt": [
+ "percent",
+ "precent"
+ ],
+ "afst": [
+ "fast",
+ "fats",
+ "saft"
+ ],
+ "ceht": [
+ "chet",
+ "echt",
+ "etch",
+ "tche",
+ "tech"
+ ],
+ "eemt": [
+ "meet",
+ "mete",
+ "teem"
+ ],
+ "afr": [
+ "arf",
+ "far",
+ "fra"
+ ],
+ "aelpry": [
+ "parley",
+ "pearly",
+ "player",
+ "rapely",
+ "replay"
+ ],
+ "aegmnry": [
+ "germany",
+ "mangery"
+ ],
+ "amnotu": [
+ "amount",
+ "moutan",
+ "outman"
+ ],
+ "eefl": [
+ "feel",
+ "fele",
+ "flee",
+ "leef"
+ ],
+ "abkn": [
+ "bank",
+ "knab",
+ "nabk"
+ ],
+ "ikrs": [
+ "irks",
+ "kris",
+ "risk"
+ ],
+ "adels": [
+ "dales",
+ "deals",
+ "lades",
+ "lased",
+ "leads",
+ "slade"
+ ],
+ "aiorsuv": [
+ "saviour",
+ "various"
+ ],
+ "dorsw": [
+ "sword",
+ "words"
+ ],
+ "notw": [
+ "nowt",
+ "town",
+ "wont"
+ ],
+ "aehrt": [
+ "earth",
+ "hater",
+ "heart",
+ "herat",
+ "rathe"
+ ],
+ "cdeeeirv": [
+ "deceiver",
+ "received"
+ ],
+ "inopst": [
+ "instop",
+ "pintos",
+ "piston",
+ "pitons",
+ "points",
+ "postin"
+ ],
+ "aacemr": [
+ "acream",
+ "camera",
+ "mareca"
+ ],
+ "osty": [
+ "toys",
+ "tosy"
+ ],
+ "deeegirrst": [
+ "deregister",
+ "registered"
+ ],
+ "acelr": [
+ "carle",
+ "ceral",
+ "clare",
+ "clear",
+ "lacer"
+ ],
+ "fglo": [
+ "flog",
+ "golf"
+ ],
+ "adimno": [
+ "amidon",
+ "daimon",
+ "domain",
+ "domina"
+ ],
+ "acehprt": [
+ "chapter",
+ "patcher",
+ "repatch"
+ ],
+ "aekms": [
+ "kames",
+ "makes",
+ "samek"
+ ],
+ "deiw": [
+ "wide",
+ "wied"
+ ],
+ "aaegmnr": [
+ "gearman",
+ "manager"
+ ],
+ "iinoopst": [
+ "position",
+ "sopition"
+ ],
+ "orst": [
+ "orts",
+ "rots",
+ "sort",
+ "stor",
+ "tors"
+ ],
+ "delmos": [
+ "models",
+ "seldom",
+ "somdel"
+ ],
+ "acehilm": [
+ "michael",
+ "micheal"
+ ],
+ "acess": [
+ "cases",
+ "casse",
+ "scase"
+ ],
+ "epst": [
+ "pest",
+ "pets",
+ "sept",
+ "spet",
+ "step"
+ ],
+ "eilmps": [
+ "impels",
+ "mespil",
+ "simple"
+ ],
+ "enno": [
+ "neon",
+ "none"
+ ],
+ "eeilrssw": [
+ "weirless",
+ "wireless"
+ ],
+ "ceeilns": [
+ "license",
+ "selenic",
+ "silence"
+ ],
+ "alpu": [
+ "paul",
+ "upla"
+ ],
+ "aekl": [
+ "kale",
+ "lake",
+ "leak"
+ ],
+ "ehlow": [
+ "howel",
+ "whole"
+ ],
+ "aelrt": [
+ "alert",
+ "alter",
+ "artel",
+ "later",
+ "ratel",
+ "retal",
+ "taler",
+ "telar"
+ ],
+ "abcis": [
+ "bacis",
+ "basic"
+ ],
+ "hossw": [
+ "shows",
+ "swosh"
+ ],
+ "dehmot": [
+ "method",
+ "mothed"
+ ],
+ "cemorsstu": [
+ "costumers",
+ "customers"
+ ],
+ "eenoprss": [
+ "pessoner",
+ "response"
+ ],
+ "acceiprt": [
+ "accipter",
+ "practice"
+ ],
+ "efir": [
+ "fire",
+ "reif",
+ "rife"
+ ],
+ "adhiloy": [
+ "hyaloid",
+ "hyoidal",
+ "holiday"
+ ],
+ "acht": [
+ "cath",
+ "chat",
+ "tach"
+ ],
+ "aglno": [
+ "along",
+ "anglo",
+ "gonal",
+ "lango",
+ "logan",
+ "longa",
+ "nogal"
+ ],
+ "agmno": [
+ "among",
+ "mango",
+ "ngoma"
+ ],
+ "adeht": [
+ "death",
+ "hated"
+ ],
+ "deeps": [
+ "deeps",
+ "pedes",
+ "speed"
+ ],
+ "ceinorstu": [
+ "countries",
+ "cretinous",
+ "neurotics"
+ ],
+ "loss": [
+ "loss",
+ "sols"
+ ],
+ "acef": [
+ "cafe",
+ "face"
+ ],
+ "cdinostu": [
+ "conduits",
+ "discount",
+ "noctuids"
+ ],
+ "acdeert": [
+ "catered",
+ "cedrate",
+ "cerated",
+ "created",
+ "reacted"
+ ],
+ "bit": [
+ "bit",
+ "tib"
+ ],
+ "aceeinrs": [
+ "cerasein",
+ "increase",
+ "resiance"
+ ],
+ "adeeirstv": [
+ "advertise",
+ "derivates"
+ ],
+ "abes": [
+ "base",
+ "besa",
+ "sabe",
+ "seba"
+ ],
+ "aenr": [
+ "anre",
+ "aren",
+ "arne",
+ "earn",
+ "nare",
+ "near",
+ "rane"
+ ],
+ "ffstu": [
+ "stuff",
+ "tuffs"
+ ],
+ "aegorst": [
+ "garotes",
+ "orgeats",
+ "storage",
+ "tagsore"
+ ],
+ "dgino": [
+ "dingo",
+ "doing",
+ "gondi",
+ "gonid"
+ ],
+ "alnos": [
+ "loans",
+ "salon",
+ "sloan",
+ "solan"
+ ],
+ "ehoss": [
+ "hoses",
+ "shoes"
+ ],
+ "aenrtu": [
+ "aunter",
+ "auntre",
+ "nature"
+ ],
+ "deorrs": [
+ "dorser",
+ "orders"
+ ],
+ "nrtu": [
+ "runt",
+ "trun",
+ "turn"
+ ],
+ "enost": [
+ "notes",
+ "onset",
+ "seton",
+ "steno",
+ "stone",
+ "tenso",
+ "tones"
+ ],
+ "gikn": [
+ "gink",
+ "king"
+ ],
+ "admnoy": [
+ "amydon",
+ "dynamo",
+ "monday"
+ ],
+ "cips": [
+ "pics",
+ "spic"
+ ],
+ "aellorv": [
+ "allover",
+ "overall"
+ ],
+ "aby": [
+ "aby",
+ "bay"
+ ],
+ "eens": [
+ "ense",
+ "esne",
+ "nese",
+ "seen",
+ "snee"
+ ],
+ "aelprsy": [
+ "asperly",
+ "parleys",
+ "parsley",
+ "pyrales",
+ "players",
+ "replays",
+ "sparely",
+ "splayer"
+ ],
+ "eeginn": [
+ "engine",
+ "ingene"
+ ],
+ "oprt": [
+ "port",
+ "trop"
+ ],
+ "aegilnor": [
+ "geraniol",
+ "regional"
+ ],
+ "aderstt": [
+ "started",
+ "tetrads"
+ ],
+ "abr": [
+ "abr",
+ "arb",
+ "bar",
+ "bra",
+ "rab"
+ ],
+ "eisvw": [
+ "swive",
+ "views",
+ "wives"
+ ],
+ "bdelou": [
+ "dobule",
+ "double"
+ ],
+ "dgo": [
+ "dog",
+ "god"
+ ],
+ "ceenrs": [
+ "censer",
+ "scerne",
+ "screen",
+ "secern"
+ ],
+ "noos": [
+ "oons",
+ "soon"
+ ],
+ "eilns": [
+ "elsin",
+ "lenis",
+ "liens",
+ "lines",
+ "niels",
+ "silen",
+ "sline"
+ ],
+ "ceinnotu": [
+ "contineu",
+ "continue"
+ ],
+ "acorss": [
+ "across",
+ "oscars"
+ ],
+ "einprrt": [
+ "printer",
+ "reprint"
+ ],
+ "eru": [
+ "rue",
+ "ure"
+ ],
+ "dimn": [
+ "midn",
+ "mind"
+ ],
+ "ceeilnost": [
+ "elections",
+ "selection"
+ ],
+ "acinos": [
+ "casino",
+ "sonica"
+ ],
+ "lost": [
+ "lost",
+ "lots",
+ "slot"
+ ],
+ "ortu": [
+ "outr",
+ "rout",
+ "toru",
+ "tour"
+ ],
+ "emnu": [
+ "menu",
+ "neum"
+ ],
+ "ehop": [
+ "hope",
+ "peho"
+ ],
+ "eilrsv": [
+ "ervils",
+ "livers",
+ "livres",
+ "silver",
+ "sliver"
+ ],
+ "deiins": [
+ "deisin",
+ "indies",
+ "inside"
+ ],
+ "aemrtu": [
+ "mature",
+ "tamure"
+ ],
+ "elor": [
+ "lore",
+ "orle",
+ "role"
+ ],
+ "acem": [
+ "acme",
+ "came",
+ "mace"
+ ],
+ "aceinrt": [
+ "centiar",
+ "ceratin",
+ "certain",
+ "citrean",
+ "creatin",
+ "crinate",
+ "nacrite",
+ "nectria"
+ ],
+ "rsu": [
+ "rus",
+ "sur",
+ "urs"
+ ],
+ "elorw": [
+ "lower",
+ "owler",
+ "rowel"
+ ],
+ "mno": [
+ "mon",
+ "nom"
+ ],
+ "cmo": [
+ "com",
+ "moc"
+ ],
+ "efin": [
+ "enif",
+ "fine",
+ "neif",
+ "nife"
+ ],
+ "ags": [
+ "asg",
+ "gas",
+ "sag"
+ ],
+ "isx": [
+ "six",
+ "xis"
+ ],
+ "bhsu": [
+ "bush",
+ "hubs"
+ ],
+ "acdeiv": [
+ "advice",
+ "vedaic"
+ ],
+ "aceerr": [
+ "career",
+ "carree"
+ ],
+ "aiilmrty": [
+ "limitary",
+ "military"
+ ],
+ "aelnrt": [
+ "altern",
+ "antler",
+ "learnt",
+ "rental",
+ "ternal"
+ ],
+ "eenst": [
+ "steen",
+ "teens",
+ "tense"
+ ],
+ "ast": [
+ "ast",
+ "sat",
+ "sta",
+ "tas"
+ ],
+ "bdi": [
+ "bid",
+ "dib"
+ ],
+ "dikn": [
+ "dink",
+ "kind"
+ ],
+ "eellrss": [
+ "resells",
+ "sellers"
+ ],
+ "abcel": [
+ "cable",
+ "caleb"
+ ],
+ "aelsuv": [
+ "alveus",
+ "avulse",
+ "values"
+ ],
+ "cgimno": [
+ "coming",
+ "gnomic"
+ ],
+ "abeilns": [
+ "albines",
+ "bensail",
+ "lesbian"
+ ],
+ "acehimn": [
+ "chimane",
+ "machine"
+ ],
+ "gloo": [
+ "golo",
+ "gool",
+ "logo"
+ ],
+ "cein": [
+ "cine",
+ "nice"
+ ],
+ "ceors": [
+ "ceros",
+ "cores",
+ "corse",
+ "crose",
+ "score"
+ ],
+ "ceilnt": [
+ "client",
+ "lentic"
+ ],
+ "enrrstu": [
+ "returns",
+ "turners"
+ ],
+ "aacilpt": [
+ "capital",
+ "palatic"
+ ],
+ "aelmps": [
+ "maples",
+ "sample"
+ ],
+ "enst": [
+ "nest",
+ "nets",
+ "sent",
+ "sten",
+ "tens"
+ ],
+ "adel": [
+ "dale",
+ "deal",
+ "lade",
+ "lead",
+ "leda"
+ ],
+ "ccehio": [
+ "choice",
+ "echoic"
+ ],
+ "entw": [
+ "newt",
+ "went"
+ ],
+ "ceorssu": [
+ "courses",
+ "rescous",
+ "secours",
+ "sources",
+ "sucrose"
+ ],
+ "cemnorsu": [
+ "consumer",
+ "cornmuse",
+ "mucrones"
+ ],
+ "aioprrt": [
+ "airport",
+ "paritor"
+ ],
+ "airstt": [
+ "artist",
+ "strait",
+ "strati",
+ "traist",
+ "traits"
+ ],
+ "deiostu": [
+ "outside",
+ "tedious"
+ ],
+ "demo": [
+ "demo",
+ "dome",
+ "mode",
+ "moed"
+ ],
+ "adeis": [
+ "aides",
+ "aside",
+ "ideas",
+ "sadie"
+ ],
+ "emmrsu": [
+ "rummes",
+ "summer"
+ ],
+ "dew": [
+ "dew",
+ "wed"
+ ],
+ "eprsu": [
+ "purse",
+ "resup",
+ "sprue",
+ "super"
+ ],
+ "aelm": [
+ "alem",
+ "alme",
+ "amel",
+ "lame",
+ "leam",
+ "male",
+ "meal",
+ "mela"
+ ],
+ "aemrtt": [
+ "matter",
+ "mettar"
+ ],
+ "cmostu": [
+ "custom",
+ "muscot"
+ ],
+ "almost": [
+ "almost",
+ "smalto",
+ "stomal"
+ ],
+ "koot": [
+ "koto",
+ "toko",
+ "took"
+ ],
+ "aains": [
+ "asian",
+ "naias",
+ "sanai"
+ ],
+ "deiort": [
+ "dotier",
+ "editor",
+ "rioted",
+ "triode"
+ ],
+ "acesu": [
+ "cause",
+ "sauce"
+ ],
+ "aeilnoptt": [
+ "peltation",
+ "potential"
+ ],
+ "gnos": [
+ "nogs",
+ "snog",
+ "song"
+ ],
+ "aelt": [
+ "atle",
+ "laet",
+ "late",
+ "leat",
+ "tael",
+ "tale",
+ "teal",
+ "tela"
+ ],
+ "adei": [
+ "aide",
+ "deia",
+ "eadi",
+ "idea"
+ ],
+ "moors": [
+ "moors",
+ "rooms"
+ ],
+ "accenr": [
+ "cancer",
+ "crance"
+ ],
+ "aenors": [
+ "arseno",
+ "reason",
+ "senora"
+ ],
+ "loot": [
+ "loot",
+ "loto",
+ "tool"
+ ],
+ "aenrsw": [
+ "answer",
+ "resawn"
+ ],
+ "eopprsu": [
+ "peropus",
+ "purpose"
+ ],
+ "bde": [
+ "bde",
+ "bed",
+ "deb"
+ ],
+ "aeginoprt": [
+ "operating",
+ "pignorate"
+ ],
+ "amps": [
+ "amps",
+ "maps",
+ "pams",
+ "samp"
+ ],
+ "aginrst": [
+ "gastrin",
+ "gratins",
+ "ratings",
+ "staring"
+ ],
+ "aglss": [
+ "glass",
+ "slags"
+ ],
+ "etu": [
+ "tue",
+ "ute"
+ ],
+ "himst": [
+ "isthm",
+ "smith"
+ ],
+ "ahknt": [
+ "hankt",
+ "thank"
+ ],
+ "eeehlnopt": [
+ "phenetole",
+ "telephone"
+ ],
+ "oprst": [
+ "ports",
+ "prost",
+ "sport",
+ "sprot",
+ "strop"
+ ],
+ "adery": [
+ "deary",
+ "deray",
+ "yeard",
+ "rayed",
+ "ready"
+ ],
+ "aailmn": [
+ "almain",
+ "animal",
+ "lamina",
+ "manila"
+ ],
+ "ceersu": [
+ "cereus",
+ "ceruse",
+ "cesure",
+ "recuse",
+ "rescue",
+ "secure"
+ ],
+ "aeinooprst": [
+ "anisotrope",
+ "operations"
+ ],
+ "ilmpsy": [
+ "limpsy",
+ "simply"
+ ],
+ "achiinrst": [
+ "christian",
+ "christina",
+ "trichinas"
+ ],
+ "addennrstu": [
+ "understand",
+ "unstranded"
+ ],
+ "inoopt": [
+ "option",
+ "potion"
+ ],
+ "aemrst": [
+ "armets",
+ "martes",
+ "master",
+ "maters",
+ "matres",
+ "ramets",
+ "remast",
+ "stream",
+ "tamers"
+ ],
+ "aelnrst": [
+ "antlers",
+ "rentals",
+ "saltern",
+ "slanter",
+ "starnel",
+ "sternal"
+ ],
+ "aes": [
+ "aes",
+ "ase",
+ "sae",
+ "sea"
+ ],
+ "bdloo": [
+ "blood",
+ "boldo"
+ ],
+ "behilprsu": [
+ "publisher",
+ "republish"
+ ],
+ "aint": [
+ "aint",
+ "anti",
+ "inta",
+ "tain",
+ "tina"
+ ],
+ "aenprst": [
+ "arpents",
+ "enrapts",
+ "entraps",
+ "parents",
+ "pastern",
+ "trepans"
+ ],
+ "aikno": [
+ "ikona",
+ "konia"
+ ],
+ "acimpt": [
+ "campit",
+ "impact"
+ ],
+ "cehiknt": [
+ "kitchen",
+ "thicken"
+ ],
+ "aacilnor": [
+ "carolina",
+ "colnaria",
+ "conarial"
+ ],
+ "eeiopprrst": [
+ "peripteros",
+ "properties"
+ ],
+ "hips": [
+ "hips",
+ "phis",
+ "pish",
+ "ship"
+ ],
+ "enorsw": [
+ "owners",
+ "resown",
+ "rowens",
+ "worsen"
+ ],
+ "adeeiss": [
+ "disease",
+ "seaside"
+ ],
+ "ailty": [
+ "ality",
+ "italy",
+ "laity",
+ "taily"
+ ],
+ "ceefprt": [
+ "perfect",
+ "prefect"
+ ],
+ "ahir": [
+ "ahir",
+ "hair"
+ ],
+ "abiss": [
+ "absis",
+ "basis",
+ "bassi",
+ "isbas"
+ ],
+ "ceiist": [
+ "cities",
+ "iciest"
+ ],
+ "acdeinst": [
+ "disenact",
+ "distance"
+ ],
+ "eert": [
+ "reet",
+ "rete",
+ "teer",
+ "tree"
+ ],
+ "eeprt": [
+ "erept",
+ "peert",
+ "peter",
+ "petre"
+ ],
+ "eenrsu": [
+ "ensuer",
+ "ensure",
+ "enures",
+ "unsere"
+ ],
+ "hstu": [
+ "hust",
+ "huts",
+ "shut",
+ "thus",
+ "tush"
+ ],
+ "aertx": [
+ "extra",
+ "retax",
+ "taxer"
+ ],
+ "degisu": [
+ "guides",
+ "guised"
+ ],
+ "eiqtu": [
+ "quiet",
+ "quite"
+ ],
+ "cdeeelst": [
+ "deselect",
+ "selected"
+ ],
+ "boy": [
+ "boy",
+ "yob"
+ ],
+ "ehors": [
+ "heros",
+ "hoers",
+ "horse",
+ "shoer",
+ "shore"
+ ],
+ "eotv": [
+ "veto",
+ "voet",
+ "vote"
+ ],
+ "adforrw": [
+ "forward",
+ "froward"
+ ],
+ "eflorsw": [
+ "flowers",
+ "fowlers",
+ "reflows",
+ "wolfers"
+ ],
+ "arsst": [
+ "stars",
+ "trass",
+ "tsars"
+ ],
+ "ilsst": [
+ "lists",
+ "silts",
+ "slits"
+ ],
+ "enorw": [
+ "owner",
+ "reown",
+ "rewon",
+ "rowen"
+ ],
+ "aeilrt": [
+ "aliter",
+ "lirate",
+ "retail",
+ "retial",
+ "tailer"
+ ],
+ "aailmns": [
+ "animals",
+ "laminas",
+ "manilas"
+ ],
+ "cdeilrty": [
+ "directly",
+ "tridecyl"
+ ],
+ "aswy": [
+ "yaws",
+ "sway",
+ "ways"
+ ],
+ "nos": [
+ "nos",
+ "ons",
+ "son"
+ ],
+ "elru": [
+ "lure",
+ "rule"
+ ],
+ "acm": [
+ "cam",
+ "mac"
+ ],
+ "ghinosu": [
+ "housing",
+ "hugonis"
+ ],
+ "aekst": [
+ "keats",
+ "skate",
+ "skeat",
+ "stake",
+ "steak",
+ "takes",
+ "teaks"
+ ],
+ "gmt": [
+ "mgt",
+ "mtg"
+ ],
+ "ginrty": [
+ "tyring",
+ "trigyn",
+ "trying"
+ ],
+ "ehmort": [
+ "mother",
+ "thermo"
+ ],
+ "cddeeinors": [
+ "considered",
+ "deconsider"
+ ],
+ "dlot": [
+ "dolt",
+ "told"
+ ],
+ "inptu": [
+ "input",
+ "punti"
+ ],
+ "eeft": [
+ "feet",
+ "fete"
+ ],
+ "aegnt": [
+ "agent",
+ "etang"
+ ],
+ "bin": [
+ "bin",
+ "nib"
+ ],
+ "demnor": [
+ "modern",
+ "morned",
+ "normed",
+ "rodmen"
+ ],
+ "einors": [
+ "irones",
+ "noires",
+ "nosier",
+ "rosine",
+ "senior",
+ "soneri"
+ ],
+ "adeilnr": [
+ "ireland",
+ "lindera"
+ ],
+ "aceghint": [
+ "cheating",
+ "teaching"
+ ],
+ "door": [
+ "door",
+ "odor",
+ "oord",
+ "ordo",
+ "rood"
+ ],
+ "adgnr": [
+ "drang",
+ "grand"
+ ],
+ "eginstt": [
+ "setting",
+ "testing"
+ ],
+ "ailrt": [
+ "litra",
+ "trail",
+ "trial"
+ ],
+ "aceghr": [
+ "charge",
+ "creagh"
+ ],
+ "instu": [
+ "inust",
+ "sintu",
+ "suint",
+ "tunis",
+ "unist",
+ "units"
+ ],
+ "adeinst": [
+ "destain",
+ "detains",
+ "instead",
+ "sainted",
+ "satined",
+ "stained"
+ ],
+ "cloo": [
+ "cool",
+ "loco"
+ ],
+ "eortw": [
+ "rowet",
+ "rowte",
+ "tower",
+ "wrote"
+ ],
+ "eeinrt": [
+ "entier",
+ "entire",
+ "nerite",
+ "triene"
+ ],
+ "adegiln": [
+ "adeling",
+ "aligned",
+ "dealing",
+ "leading"
+ ],
+ "aelmt": [
+ "amlet",
+ "metal"
+ ],
+ "efinsst": [
+ "fitness",
+ "infests"
+ ],
+ "aais": [
+ "aias",
+ "asia"
+ ],
+ "essu": [
+ "sues",
+ "uses"
+ ],
+ "opttuu": [
+ "output",
+ "putout"
+ ],
+ "aeegrrt": [
+ "greater",
+ "regrate",
+ "terrage"
+ ],
+ "airsstt": [
+ "artists",
+ "straits",
+ "tsarist"
+ ],
+ "eilnoorstu": [
+ "resolution",
+ "solutioner"
+ ],
+ "eemss": [
+ "messe",
+ "seems",
+ "semes"
+ ],
+ "apss": [
+ "asps",
+ "pass",
+ "saps",
+ "spas"
+ ],
+ "aeilnorst": [
+ "lairstone",
+ "orientals",
+ "orleanist",
+ "relations",
+ "serotinal",
+ "tensorial"
+ ],
+ "rsttu": [
+ "strut",
+ "sturt",
+ "trust"
+ ],
+ "anv": [
+ "avn",
+ "nav",
+ "van"
+ ],
+ "acinnost": [
+ "actinons",
+ "canonist",
+ "contains",
+ "sanction",
+ "santonic",
+ "sonantic"
+ ],
+ "einosss": [
+ "essoins",
+ "osseins",
+ "session",
+ "sissone"
+ ],
+ "ilmtu": [
+ "multi",
+ "tumli"
+ ],
+ "aacinotv": [
+ "octavian",
+ "octavina",
+ "vacation"
+ ],
+ "ikns": [
+ "inks",
+ "kins",
+ "sink",
+ "skin"
+ ],
+ "eprv": [
+ "perv",
+ "prev"
+ ],
+ "ads": [
+ "ads",
+ "das",
+ "sad"
+ ],
+ "amry": [
+ "army",
+ "yarm",
+ "mary",
+ "myra"
+ ],
+ "cdeeeptx": [
+ "excepted",
+ "expected"
+ ],
+ "ginr": [
+ "girn",
+ "grin",
+ "ring"
+ ],
+ "adegr": [
+ "edgar",
+ "gader",
+ "garde",
+ "grade",
+ "raged"
+ ],
+ "opp": [
+ "opp",
+ "pop"
+ ],
+ "efilrt": [
+ "fertil",
+ "filter",
+ "filtre",
+ "lifter",
+ "relift",
+ "trifle"
+ ],
+ "eglnor": [
+ "longer",
+ "relong"
+ ],
+ "int": [
+ "int",
+ "nit",
+ "tin"
+ ],
+ "aelnp": [
+ "alpen",
+ "nepal",
+ "panel",
+ "penal",
+ "plane",
+ "plena"
+ ],
+ "aegmnr": [
+ "engram",
+ "german",
+ "manger",
+ "ragmen"
+ ],
+ "adefltu": [
+ "default",
+ "faulted"
+ ],
+ "eeiqrru": [
+ "querier",
+ "require"
+ ],
+ "bosy": [
+ "boys",
+ "yobs",
+ "sybo"
+ ],
+ "deep": [
+ "deep",
+ "depe",
+ "peed"
+ ],
+ "allosw": [
+ "allows",
+ "sallow",
+ "swallo"
+ ],
+ "erst": [
+ "erst",
+ "rest",
+ "rets",
+ "sert",
+ "ster",
+ "stre",
+ "tres"
+ ],
+ "einoprt": [
+ "pointer",
+ "protein",
+ "pterion",
+ "repoint",
+ "tropein",
+ "tropine"
+ ],
+ "deeoprrt": [
+ "deporter",
+ "reported"
+ ],
+ "loop": [
+ "loop",
+ "polo",
+ "pool"
+ ],
+ "ciilopst": [
+ "colpitis",
+ "politics",
+ "psilotic"
+ ],
+ "abdors": [
+ "adsorb",
+ "boards",
+ "broads",
+ "dobras"
+ ],
+ "aeiprst": [
+ "parties",
+ "pastier",
+ "piaster",
+ "piastre",
+ "pirates",
+ "raspite",
+ "spirate",
+ "tapiser",
+ "traipse"
+ ],
+ "eey": [
+ "eye",
+ "yee"
+ ],
+ "adeeelrs": [
+ "released",
+ "resealed"
+ ],
+ "aegst": [
+ "gates",
+ "geast",
+ "getas",
+ "stage"
+ ],
+ "aegrtt": [
+ "gatter",
+ "target"
+ ],
+ "ceeptx": [
+ "except",
+ "expect"
+ ],
+ "bsu": [
+ "bus",
+ "sub"
+ ],
+ "abemy": [
+ "beamy",
+ "embay",
+ "maybe"
+ ],
+ "acelps": [
+ "places",
+ "scapel"
+ ],
+ "ainps": [
+ "nipas",
+ "pains",
+ "pians",
+ "pinas",
+ "pisan",
+ "sapin",
+ "spain",
+ "spina"
+ ],
+ "cet": [
+ "cte",
+ "etc",
+ "tec"
+ ],
+ "einrtw": [
+ "twiner",
+ "winter"
+ ],
+ "eeprrssu": [
+ "perusers",
+ "pressure"
+ ],
+ "ceor": [
+ "cero",
+ "core"
+ ],
+ "abekr": [
+ "baker",
+ "brake",
+ "break",
+ "kebar"
+ ],
+ "eopprssu": [
+ "purposes",
+ "supposer"
+ ],
+ "ghhoorttuu": [
+ "outthrough",
+ "throughout"
+ ],
+ "esst": [
+ "sets",
+ "tess"
+ ],
+ "acden": [
+ "acned",
+ "caned",
+ "dance",
+ "decan"
+ ],
+ "efilst": [
+ "filets",
+ "fistle",
+ "fliest",
+ "flites",
+ "itself",
+ "stifle"
+ ],
+ "aepprs": [
+ "papers",
+ "sapper"
+ ],
+ "agilnpy": [
+ "playing",
+ "plygain"
+ ],
+ "adeerr": [
+ "dearer",
+ "reader",
+ "reared",
+ "redare",
+ "redear",
+ "reread"
+ ],
+ "ailrtuv": [
+ "virtual",
+ "vitular"
+ ],
+ "aenrssw": [
+ "answers",
+ "rawness"
+ ],
+ "enrt": [
+ "entr",
+ "rent",
+ "tern"
+ ],
+ "als": [
+ "als",
+ "las",
+ "sal",
+ "sla"
+ ],
+ "eemort": [
+ "emoter",
+ "meteor",
+ "remote"
+ ],
+ "aelpp": [
+ "appel",
+ "apple",
+ "pepla"
+ ],
+ "adegginrr": [
+ "regarding",
+ "regrading"
+ ],
+ "imn": [
+ "min",
+ "nim"
+ ],
+ "eemorv": [
+ "evermo",
+ "remove"
+ ],
+ "adi": [
+ "aid",
+ "dia",
+ "ida"
+ ],
+ "host": [
+ "host",
+ "hots",
+ "shot",
+ "soth",
+ "thos",
+ "tosh"
+ ],
+ "aceehrst": [
+ "cheaters",
+ "hectares",
+ "recheats",
+ "teachers"
+ ],
+ "bins": [
+ "bins",
+ "nibs",
+ "snib"
+ ],
+ "aalmnu": [
+ "alumna",
+ "manual"
+ ],
+ "aegnst": [
+ "agents",
+ "estang",
+ "stagne"
+ ],
+ "acdeeinrs": [
+ "ardencies",
+ "ecardines",
+ "increased"
+ ],
+ "aeiprr": [
+ "pairer",
+ "rapier",
+ "repair"
+ ],
+ "afir": [
+ "fair",
+ "fiar",
+ "raif"
+ ],
+ "eelst": [
+ "leets",
+ "leste",
+ "sleet",
+ "slete",
+ "steel",
+ "stele",
+ "teles"
+ ],
+ "defix": [
+ "defix",
+ "fixed"
+ ],
+ "gnorw": [
+ "grown",
+ "wrong"
+ ],
+ "aiprs": [
+ "pairs",
+ "paris",
+ "parsi",
+ "sarip",
+ "spair",
+ "spira"
+ ],
+ "egst": [
+ "gest",
+ "gets",
+ "steg",
+ "stge",
+ "tegs"
+ ],
+ "ceorst": [
+ "corset",
+ "cortes",
+ "coster",
+ "croset",
+ "escort",
+ "recost",
+ "rectos",
+ "scoter",
+ "sector"
+ ],
+ "eeiqrrsu": [
+ "queriers",
+ "requires"
+ ],
+ "aft": [
+ "aft",
+ "fat"
+ ],
+ "aefhrt": [
+ "father",
+ "freath",
+ "hafter",
+ "trefah"
+ ],
+ "cceeilrt": [
+ "electric",
+ "lectrice"
+ ],
+ "eoqstu": [
+ "quotes",
+ "toques"
+ ],
+ "adde": [
+ "dade",
+ "dead",
+ "deda",
+ "edda"
+ ],
+ "ceeprst": [
+ "recepts",
+ "respect",
+ "scepter",
+ "sceptre",
+ "specter",
+ "spectre"
+ ],
+ "eikm": [
+ "miek",
+ "mike"
+ ],
+ "pst": [
+ "pst",
+ "pts",
+ "spt",
+ "tps",
+ "tsp"
+ ],
+ "hortw": [
+ "rowth",
+ "throw",
+ "whort",
+ "worth",
+ "wroth"
+ ],
+ "cdeeoprrsu": [
+ "procedures",
+ "reproduces"
+ ],
+ "oopr": [
+ "poor",
+ "proo",
+ "roop"
+ ],
+ "aceehrt": [
+ "cheater",
+ "hectare",
+ "rechate",
+ "recheat",
+ "reteach",
+ "teacher"
+ ],
+ "eesy": [
+ "eyes",
+ "yees",
+ "yese"
+ ],
+ "ekorrsw": [
+ "reworks",
+ "workers"
+ ],
+ "afmr": [
+ "farm",
+ "fram"
+ ],
+ "mot": [
+ "mot",
+ "tom"
+ ],
+ "aceeirtv": [
+ "creative",
+ "reactive"
+ ],
+ "acost": [
+ "acost",
+ "actos",
+ "ascot",
+ "catso",
+ "coast",
+ "coats",
+ "costa",
+ "tacos",
+ "tacso",
+ "tasco",
+ "tosca"
+ ],
+ "aeegr": [
+ "aeger",
+ "agree",
+ "eager",
+ "eagre",
+ "ragee"
+ ],
+ "aehr": [
+ "hare",
+ "hear",
+ "hera",
+ "rhea"
+ ],
+ "aceerrs": [
+ "careers",
+ "creaser",
+ "searcer"
+ ],
+ "egos": [
+ "egos",
+ "goes",
+ "sego"
+ ],
+ "del": [
+ "del",
+ "eld",
+ "led"
+ ],
+ "afn": [
+ "fan",
+ "naf"
+ ],
+ "efmorr": [
+ "former",
+ "reform"
+ ],
+ "aeegillrs": [
+ "allergies",
+ "galleries"
+ ],
+ "dei": [
+ "dei",
+ "die",
+ "ide"
+ ],
+ "deeenprst": [
+ "presented",
+ "pretensed",
+ "repetends"
+ ],
+ "aflt": [
+ "flat",
+ "laft"
+ ],
+ "flow": [
+ "flow",
+ "fowl",
+ "wolf"
+ ],
+ "aceegins": [
+ "agencies",
+ "agenesic",
+ "genesiac"
+ ],
+ "aenprt": [
+ "arpent",
+ "enrapt",
+ "entrap",
+ "panter",
+ "parent",
+ "parten",
+ "pretan",
+ "pterna",
+ "trepan"
+ ],
+ "acghiimn": [
+ "michigan",
+ "minhagic"
+ ],
+ "acels": [
+ "alces",
+ "alecs",
+ "casel",
+ "claes",
+ "laces",
+ "scale"
+ ],
+ "adnst": [
+ "dasnt",
+ "stand"
+ ],
+ "cemnooy": [
+ "economy",
+ "monoecy"
+ ],
+ "eghhist": [
+ "eighths",
+ "heights",
+ "highest"
+ ],
+ "aefmr": [
+ "frame",
+ "fream"
+ ],
+ "aeeglns": [
+ "angeles",
+ "senegal"
+ ],
+ "ahpt": [
+ "path",
+ "phat"
+ ],
+ "aaailnrstu": [
+ "australian",
+ "saturnalia"
+ ],
+ "cefhi": [
+ "chief",
+ "fiche"
+ ],
+ "adeilt": [
+ "detail",
+ "dietal",
+ "dilate",
+ "edital",
+ "tailed"
+ ],
+ "alsw": [
+ "awls",
+ "laws",
+ "slaw"
+ ],
+ "acdeghn": [
+ "changed",
+ "ganched"
+ ],
+ "ept": [
+ "pet",
+ "pte"
+ ],
+ "adehr": [
+ "derah",
+ "hared",
+ "heard",
+ "rheda"
+ ],
+ "aceln": [
+ "ancle",
+ "canel",
+ "clean",
+ "lance",
+ "lenca"
+ ],
+ "aacfinr": [
+ "african",
+ "francia"
+ ],
+ "guy": [
+ "guy",
+ "yug"
+ ],
+ "eilstt": [
+ "stilet",
+ "titles"
+ ],
+ "aeelnrtv": [
+ "levanter",
+ "relevant",
+ "revelant"
+ ],
+ "ccennot": [
+ "concent",
+ "connect"
+ ],
+ "bbeil": [
+ "bible",
+ "blibe"
+ ],
+ "cpu": [
+ "cpu",
+ "cup"
+ ],
+ "abekst": [
+ "basket",
+ "betask"
+ ],
+ "addemn": [
+ "damned",
+ "ddname",
+ "demand",
+ "madden"
+ ],
+ "eistu": [
+ "etuis",
+ "suite"
+ ],
+ "aeinnottt": [
+ "attention",
+ "tentation"
+ ],
+ "ikps": [
+ "kips",
+ "pisk",
+ "skip",
+ "spik"
+ ],
+ "acinotu": [
+ "auction",
+ "caution"
+ ],
+ "aegr": [
+ "ager",
+ "agre",
+ "areg",
+ "gare",
+ "gear",
+ "rage"
+ ],
+ "eel": [
+ "eel",
+ "lee"
+ ],
+ "acehlrs": [
+ "charles",
+ "clasher",
+ "larches"
+ ],
+ "ainnot": [
+ "anoint",
+ "nation"
+ ],
+ "fimr": [
+ "firm",
+ "frim"
+ ],
+ "eensv": [
+ "evens",
+ "neves",
+ "seven"
+ ],
+ "delor": [
+ "lored",
+ "older"
+ ],
+ "iiillnos": [
+ "illinois",
+ "illision"
+ ],
+ "eeelmnst": [
+ "elements",
+ "steelmen"
+ ],
+ "eorrst": [
+ "resort",
+ "retros",
+ "roster",
+ "sorter",
+ "storer"
+ ],
+ "admnor": [
+ "random",
+ "rodman"
+ ],
+ "eiimnrst": [
+ "interims",
+ "minister",
+ "misinter"
+ ],
+ "kloos": [
+ "kolos",
+ "looks"
+ ],
+ "cdeiinorst": [
+ "directions",
+ "discretion",
+ "soricident"
+ ],
+ "adginrt": [
+ "darting",
+ "trading"
+ ],
+ "eforst": [
+ "fetors",
+ "forest",
+ "forset",
+ "fortes",
+ "foster",
+ "fstore",
+ "softer"
+ ],
+ "aclls": [
+ "calls",
+ "scall"
+ ],
+ "ehosw": [
+ "howes",
+ "whose"
+ ],
+ "celopu": [
+ "couple",
+ "culpeo"
+ ],
+ "deginn": [
+ "ending",
+ "ginned"
+ ],
+ "ceilnst": [
+ "clients",
+ "lentisc",
+ "scintle",
+ "stencil"
+ ],
+ "acinost": [
+ "actions",
+ "atonics",
+ "cations"
+ ],
+ "eilnst": [
+ "enlist",
+ "inlets",
+ "listen",
+ "silent",
+ "slinte",
+ "tinsel"
+ ],
+ "adekn": [
+ "danke",
+ "kande",
+ "knead",
+ "naked"
+ ],
+ "aglo": [
+ "gaol",
+ "goal",
+ "gola",
+ "olga"
+ ],
+ "dlos": [
+ "dols",
+ "olds",
+ "slod",
+ "sold"
+ ],
+ "aekmrst": [
+ "estmark",
+ "markets"
+ ],
+ "elostw": [
+ "lowest",
+ "owlets",
+ "towels"
+ ],
+ "eilsv": [
+ "elvis",
+ "evils",
+ "levis",
+ "lives",
+ "slive",
+ "veils"
+ ],
+ "aeehlrt": [
+ "haltere",
+ "leather",
+ "tarheel"
+ ],
+ "deeeimnrt": [
+ "determine",
+ "intermede"
+ ],
+ "almp": [
+ "lamp",
+ "palm"
+ ],
+ "bbo": [
+ "bob",
+ "obb"
+ ],
+ "aehpprs": [
+ "perhaps",
+ "prehaps"
+ ],
+ "aeeillstt": [
+ "satellite",
+ "telestial"
+ ],
+ "esstt": [
+ "stets",
+ "tests"
+ ],
+ "emt": [
+ "met",
+ "tem"
+ ],
+ "ainp": [
+ "nipa",
+ "pain",
+ "pani",
+ "pian",
+ "pina"
+ ],
+ "eginsstt": [
+ "settings",
+ "testings"
+ ],
+ "beruy": [
+ "buyer",
+ "rebuy"
+ ],
+ "aeilsy": [
+ "easily",
+ "elysia",
+ "sailye"
+ ],
+ "alor": [
+ "lora",
+ "oral"
+ ],
+ "dfor": [
+ "drof",
+ "ford"
+ ],
+ "eoprst": [
+ "poster",
+ "presto",
+ "repost",
+ "respot",
+ "stoper",
+ "topers",
+ "tropes"
+ ],
+ "deeg": [
+ "edge",
+ "geed"
+ ],
+ "oort": [
+ "root",
+ "roto",
+ "toro"
+ ],
+ "adhilosy": [
+ "hyaloids",
+ "holidays"
+ ],
+ "cei": [
+ "cie",
+ "ice"
+ ],
+ "eeilprs": [
+ "replies",
+ "spieler"
+ ],
+ "abell": [
+ "bella",
+ "label"
+ ],
+ "ces": [
+ "esc",
+ "sec"
+ ],
+ "cdeemmnor": [
+ "commender",
+ "recommend"
+ ],
+ "acnno": [
+ "ancon",
+ "canon"
+ ],
+ "aestw": [
+ "awest",
+ "etwas",
+ "sweat",
+ "tawse",
+ "twaes",
+ "waste"
+ ],
+ "eimntu": [
+ "minuet",
+ "minute",
+ "munite",
+ "mutine",
+ "untime"
+ ],
+ "deioprrv": [
+ "overdrip",
+ "provider"
+ ],
+ "ailnoopt": [
+ "antipolo",
+ "antipool",
+ "optional"
+ ],
+ "acdiinorty": [
+ "dictionary",
+ "indicatory"
+ ],
+ "cdlo": [
+ "clod",
+ "cold"
+ ],
+ "achir": [
+ "chair",
+ "chria"
+ ],
+ "aehps": [
+ "ephas",
+ "heaps",
+ "pesah",
+ "phase",
+ "shape"
+ ],
+ "defils": [
+ "felids",
+ "fields"
+ ],
+ "abg": [
+ "bag",
+ "gab"
+ ],
+ "eelrstt": [
+ "letters",
+ "settler",
+ "sterlet",
+ "trestle"
+ ],
+ "hirst": [
+ "hirst",
+ "shirt"
+ ],
+ "cdeinnotu": [
+ "continued",
+ "unnoticed"
+ ],
+ "ceimr": [
+ "crime",
+ "merci"
+ ],
+ "aberst": [
+ "barest",
+ "baster",
+ "bestar",
+ "breast",
+ "restab",
+ "tabers",
+ "trabes"
+ ],
+ "bim": [
+ "bim",
+ "ibm",
+ "mib"
+ ],
+ "egiilnor": [
+ "ligroine",
+ "religion",
+ "reoiling"
+ ],
+ "acilm": [
+ "claim",
+ "clima",
+ "malic"
+ ],
+ "eiimnoprss": [
+ "impression",
+ "permission"
+ ],
+ "achpt": [
+ "chapt",
+ "pacht",
+ "patch"
+ ],
+ "aeht": [
+ "ahet",
+ "eath",
+ "haet",
+ "hate",
+ "heat",
+ "thae",
+ "thea"
+ ],
+ "aeemrssu": [
+ "measures",
+ "reassume"
+ ],
+ "aeeginnort": [
+ "generation",
+ "renegation"
+ ],
+ "imss": [
+ "isms",
+ "miss",
+ "sims"
+ ],
+ "accehilm": [
+ "alchemic",
+ "chemical"
+ ],
+ "akst": [
+ "kats",
+ "skat",
+ "task"
+ ],
+ "efhilms": [
+ "flemish",
+ "himself"
+ ],
+ "nor": [
+ "nor",
+ "ron"
+ ],
+ "abeeln": [
+ "baleen",
+ "enable"
+ ],
+ "aanst": [
+ "antas",
+ "nasat",
+ "santa",
+ "satan"
+ ],
+ "dim": [
+ "dim",
+ "mid"
+ ],
+ "adeelr": [
+ "dealer",
+ "leader",
+ "redeal",
+ "relade",
+ "relead"
+ ],
+ "aeilrs": [
+ "ariels",
+ "israel",
+ "laiser",
+ "relais",
+ "resail",
+ "sailer",
+ "serail",
+ "serial"
+ ],
+ "fost": [
+ "soft",
+ "stof"
+ ],
+ "eerrssv": [
+ "servers",
+ "versers"
+ ],
+ "aelno": [
+ "alone",
+ "anole",
+ "olena"
+ ],
+ "eegimnst": [
+ "gisement",
+ "meetings"
+ ],
+ "aainorz": [
+ "arizona",
+ "azorian",
+ "zonaria"
+ ],
+ "eeinrsstt": [
+ "insetters",
+ "interests",
+ "resistent",
+ "sternites",
+ "triteness"
+ ],
+ "eflu": [
+ "flue",
+ "fuel"
+ ],
+ "aklw": [
+ "lawk",
+ "walk"
+ ],
+ "aaiilnt": [
+ "antilia",
+ "italian"
+ ],
+ "ainst": [
+ "antis",
+ "saint",
+ "sanit",
+ "satin",
+ "stain",
+ "tains"
+ ],
+ "eors": [
+ "eros",
+ "ores",
+ "roes",
+ "rose",
+ "seor",
+ "sero",
+ "sore"
+ ],
+ "aegmnrtu": [
+ "argentum",
+ "argument"
+ ],
+ "aceginrt": [
+ "antergic",
+ "argentic",
+ "catering",
+ "citrange",
+ "creating",
+ "reacting"
+ ],
+ "deioprrsv": [
+ "disprover",
+ "providers"
+ ],
+ "adegpru": [
+ "guepard",
+ "upgrade"
+ ],
+ "acfort": [
+ "factor",
+ "forcat"
+ ],
+ "aeenrst": [
+ "earnest",
+ "eastern",
+ "nearest"
+ ],
+ "acinostu": [
+ "acontius",
+ "anticous",
+ "auctions",
+ "cautions"
+ ],
+ "eeinrst": [
+ "entires",
+ "entries",
+ "trienes"
+ ],
+ "adest": [
+ "dates",
+ "sated",
+ "sedat",
+ "stade",
+ "stead",
+ "tsade"
+ ],
+ "adeeegnrt": [
+ "generated",
+ "greatened",
+ "renegated"
+ ],
+ "eimpr": [
+ "imper",
+ "prime"
+ ],
+ "iilmt": [
+ "limit",
+ "milit"
+ ],
+ "abegn": [
+ "bagne",
+ "bange",
+ "began"
+ ],
+ "epsst": [
+ "pests",
+ "septs",
+ "steps"
+ ],
+ "hopss": [
+ "phoss",
+ "shops",
+ "sophs",
+ "sposh"
+ ],
+ "defimnor": [
+ "foremind",
+ "informed"
+ ],
+ "abnru": [
+ "buran",
+ "unbar",
+ "urban"
+ ],
+ "deorst": [
+ "doters",
+ "sorted",
+ "stored",
+ "strode"
+ ],
+ "orstu": [
+ "roust",
+ "routs",
+ "rusot",
+ "stour",
+ "sutor",
+ "torus",
+ "tours"
+ ],
+ "adlo": [
+ "alod",
+ "dola",
+ "load",
+ "odal"
+ ],
+ "ablor": [
+ "balor",
+ "bolar",
+ "boral",
+ "labor",
+ "lobar"
+ ],
+ "adimn": [
+ "admin",
+ "dimna",
+ "mandi",
+ "manid"
+ ],
+ "agst": [
+ "agst",
+ "gast",
+ "gats",
+ "stag",
+ "tags"
+ ],
+ "dopr": [
+ "dorp",
+ "drop",
+ "prod"
+ ],
+ "dilos": [
+ "dilos",
+ "diols",
+ "idols",
+ "lidos",
+ "sloid",
+ "soldi",
+ "solid"
+ ],
+ "aeeinnoprstt": [
+ "penetrations",
+ "presentation"
+ ],
+ "aaegglnsu": [
+ "languages",
+ "slanguage"
+ ],
+ "abceem": [
+ "became",
+ "embace"
+ ],
+ "aegnor": [
+ "onager",
+ "orange"
+ ],
+ "eehmt": [
+ "meeth",
+ "theme"
+ ],
+ "aacgimnp": [
+ "campaign",
+ "pangamic"
+ ],
+ "aeimnr": [
+ "airmen",
+ "armine",
+ "ermani",
+ "marine",
+ "remain"
+ ],
+ "iiprst": [
+ "pitris",
+ "spirit"
+ ],
+ "acilms": [
+ "claims",
+ "miscal"
+ ],
+ "eems": [
+ "emes",
+ "mese",
+ "seem",
+ "seme",
+ "smee"
+ ],
+ "aaffirs": [
+ "affairs",
+ "raffias"
+ ],
+ "chotu": [
+ "chout",
+ "couth",
+ "thuoc",
+ "touch"
+ ],
+ "ddeeinnt": [
+ "indented",
+ "intended"
+ ],
+ "aglos": [
+ "gaols",
+ "goals"
+ ],
+ "ehir": [
+ "heir",
+ "hire"
+ ],
+ "ceeilnot": [
+ "coteline",
+ "election"
+ ],
+ "eersv": [
+ "serve",
+ "sever",
+ "veers",
+ "verse"
+ ],
+ "aenorss": [
+ "reasons",
+ "senoras"
+ ],
+ "acgim": [
+ "gamic",
+ "magic"
+ ],
+ "mnotu": [
+ "montu",
+ "mount",
+ "notum"
+ ],
+ "amrst": [
+ "marts",
+ "smart",
+ "stram",
+ "trams"
+ ],
+ "aegv": [
+ "gave",
+ "vage",
+ "vega"
+ ],
+ "enos": [
+ "enos",
+ "eons",
+ "noes",
+ "nose",
+ "ones",
+ "sone"
+ ],
+ "ailnt": [
+ "altin",
+ "latin"
+ ],
+ "cdeefiirt": [
+ "certified",
+ "rectified"
+ ],
+ "aaegmn": [
+ "agname",
+ "manage"
+ ],
+ "aknr": [
+ "karn",
+ "knar",
+ "kran",
+ "krna",
+ "nark",
+ "rank"
+ ],
+ "egnoor": [
+ "oregon",
+ "orgone",
+ "orogen"
+ ],
+ "eeelmnt": [
+ "element",
+ "leetmen",
+ "telemen"
+ ],
+ "bhirt": [
+ "birth",
+ "brith"
+ ],
+ "abesu": [
+ "abuse",
+ "beaus"
+ ],
+ "eeqrsstu": [
+ "questers",
+ "requests"
+ ],
+ "aaeeprst": [
+ "asperate",
+ "separate"
+ ],
+ "cdeeoprru": [
+ "procedure",
+ "reproduce"
+ ],
+ "adeehilprs": [
+ "dealership",
+ "leadership"
+ ],
+ "abelst": [
+ "ablest",
+ "belast",
+ "bleats",
+ "stable",
+ "tables"
+ ],
+ "deefin": [
+ "define",
+ "infeed"
+ ],
+ "acginr": [
+ "arcing",
+ "caring",
+ "racing"
+ ],
+ "gkno": [
+ "gonk",
+ "kong"
+ ],
+ "deeeloprv": [
+ "developer",
+ "redevelop"
+ ],
+ "cdeimost": [
+ "comedist",
+ "demotics",
+ "docetism",
+ "domestic"
+ ],
+ "aeimpst": [
+ "impaste",
+ "pastime"
+ ],
+ "hnoostu": [
+ "hontous",
+ "houston",
+ "nothous"
+ ],
+ "acehr": [
+ "acher",
+ "arche",
+ "chare",
+ "chera",
+ "echar",
+ "rache",
+ "reach"
+ ],
+ "aelmnt": [
+ "lament",
+ "manlet",
+ "mantel",
+ "mantle",
+ "mental"
+ ],
+ "emmnot": [
+ "moment",
+ "montem"
+ ],
+ "chin": [
+ "chin",
+ "inch"
+ ],
+ "ceenrst": [
+ "centers",
+ "centres",
+ "scenter",
+ "tenrecs"
+ ],
+ "aadegm": [
+ "dagame",
+ "damage"
+ ],
+ "abl": [
+ "abl",
+ "alb",
+ "bal",
+ "lab"
+ ],
+ "eeerrsv": [
+ "reserve",
+ "resever",
+ "reveres",
+ "reverse",
+ "severer"
+ ],
+ "ceeiprs": [
+ "piecers",
+ "pierces",
+ "precise",
+ "recipes",
+ "respice",
+ "scripee"
+ ],
+ "aagmm": [
+ "gamma",
+ "magma"
+ ],
+ "nosw": [
+ "nows",
+ "owns",
+ "snow",
+ "sown",
+ "wons"
+ ],
+ "hrttu": [
+ "thurt",
+ "truth"
+ ],
+ "cenortu": [
+ "conteur",
+ "cornute",
+ "counter",
+ "recount",
+ "trounce"
+ ],
+ "ainoort": [
+ "ontario",
+ "oration"
+ ],
+ "des": [
+ "des",
+ "eds",
+ "esd",
+ "sed"
+ ],
+ "aeimnnost": [
+ "antimeson",
+ "mannitose",
+ "minnesota",
+ "nominates"
+ ],
+ "bdegir": [
+ "begird",
+ "bridge"
+ ],
+ "aeintv": [
+ "native",
+ "navite"
+ ],
+ "denow": [
+ "endow",
+ "nowed",
+ "owned",
+ "woden"
+ ],
+ "achrt": [
+ "archt",
+ "chart",
+ "ratch"
+ ],
+ "adeerrs": [
+ "readers",
+ "redears",
+ "redsear",
+ "rereads"
+ ],
+ "aelqu": [
+ "equal",
+ "quale",
+ "queal"
+ ],
+ "adeenrtuv": [
+ "adventure",
+ "unaverted"
+ ],
+ "fioprt": [
+ "forpit",
+ "profit"
+ ],
+ "adeelrs": [
+ "dealers",
+ "leaders"
+ ],
+ "eoprsst": [
+ "posters",
+ "prestos",
+ "stopers"
+ ],
+ "aainssstt": [
+ "assistant",
+ "satanists"
+ ],
+ "aev": [
+ "ave",
+ "eva"
+ ],
+ "acdemopr": [
+ "compadre",
+ "compared"
+ ],
+ "hkooprsw": [
+ "shopwork",
+ "workshop"
+ ],
+ "egno": [
+ "geon",
+ "goen",
+ "gone"
+ ],
+ "cdeos": [
+ "codes",
+ "coeds",
+ "cosed"
+ ],
+ "dikns": [
+ "dinks",
+ "kinds"
+ ],
+ "aeelstt": [
+ "atelets",
+ "seattle",
+ "tsatlee"
+ ],
+ "aeemnssttt": [
+ "statements",
+ "testaments"
+ ],
+ "deglno": [
+ "engold",
+ "golden",
+ "longed"
+ ],
+ "aemst": [
+ "mates",
+ "meats",
+ "metas",
+ "satem",
+ "steam",
+ "stema",
+ "tames",
+ "teams"
+ ],
+ "fort": [
+ "fort",
+ "frot"
+ ],
+ "aeenst": [
+ "enates",
+ "ensate",
+ "enseat",
+ "santee",
+ "sateen",
+ "senate"
+ ],
+ "cefors": [
+ "forces",
+ "fresco"
+ ],
+ "denrtu": [
+ "deturn",
+ "dunter",
+ "retund",
+ "runted",
+ "tunder",
+ "turned"
+ ],
+ "deirt": [
+ "diter",
+ "tired",
+ "tried"
+ ],
+ "deenrrtu": [
+ "returned",
+ "unterred"
+ ],
+ "aenprtt": [
+ "pattern",
+ "reptant"
+ ],
+ "abot": [
+ "boat",
+ "bota",
+ "toba"
+ ],
+ "ademn": [
+ "admen",
+ "amend",
+ "mande",
+ "maned",
+ "menad",
+ "named"
+ ],
+ "aeehrtt": [
+ "teather",
+ "theater",
+ "theatre",
+ "thereat"
+ ],
+ "aelrs": [
+ "arles",
+ "arsle",
+ "earls",
+ "lares",
+ "laser",
+ "lears",
+ "rales",
+ "reals",
+ "seral",
+ "slare"
+ ],
+ "aeeilrr": [
+ "earlier",
+ "learier"
+ ],
+ "cino": [
+ "cion",
+ "coin",
+ "coni",
+ "icon"
+ ],
+ "aadiinn": [
+ "anidian",
+ "indiana"
+ ],
+ "cdeiinort": [
+ "cretinoid",
+ "direction"
+ ],
+ "deeelt": [
+ "delete",
+ "teedle"
+ ],
+ "acelnru": [
+ "crenula",
+ "lucarne",
+ "nuclear",
+ "unclear"
+ ],
+ "emosu": [
+ "moues",
+ "mouse"
+ ],
+ "agilns": [
+ "algins",
+ "aligns",
+ "glanis",
+ "lasing",
+ "liangs",
+ "ligans",
+ "lingas",
+ "sangil",
+ "signal"
+ ],
+ "deissu": [
+ "dissue",
+ "disuse",
+ "issued"
+ ],
+ "abinr": [
+ "abrin",
+ "bairn",
+ "brain",
+ "brian",
+ "rabin"
+ ],
+ "eflopruw": [
+ "powerful",
+ "upflower"
+ ],
+ "ademr": [
+ "armed",
+ "derma",
+ "drame",
+ "dream",
+ "madre",
+ "ramed"
+ ],
+ "aefls": [
+ "alefs",
+ "false",
+ "fleas",
+ "leafs"
+ ],
+ "acst": [
+ "acts",
+ "cast",
+ "cats",
+ "scat"
+ ],
+ "eflorw": [
+ "flower",
+ "fowler",
+ "reflow",
+ "wolfer"
+ ],
+ "adepss": [
+ "depass",
+ "passed",
+ "spades"
+ ],
+ "cip": [
+ "cpi",
+ "pci",
+ "pic"
+ ],
+ "emooprt": [
+ "promote",
+ "protome"
+ ],
+ "adestt": [
+ "stated",
+ "tasted"
+ ],
+ "aaepprs": [
+ "appears",
+ "sappare"
+ ],
+ "ceorsv": [
+ "corves",
+ "covers"
+ ],
+ "aaiimnnt": [
+ "amanitin",
+ "maintain"
+ ],
+ "imorstu": [
+ "sumitro",
+ "tourism"
+ ],
+ "amot": [
+ "atmo",
+ "atom",
+ "moat",
+ "mota",
+ "toma"
+ ],
+ "adeeimstt": [
+ "estimated",
+ "meditates"
+ ],
+ "befir": [
+ "bifer",
+ "brief",
+ "fiber",
+ "fibre"
+ ],
+ "inor": [
+ "inro",
+ "iron",
+ "noir",
+ "nori",
+ "roin"
+ ],
+ "deersv": [
+ "served",
+ "versed"
+ ],
+ "anstw": [
+ "stawn",
+ "wants",
+ "wasnt"
+ ],
+ "adeepprr": [
+ "dapperer",
+ "prepared"
+ ],
+ "diov": [
+ "ovid",
+ "void"
+ ],
+ "dgiinn": [
+ "dining",
+ "indign",
+ "niding"
+ ],
+ "aegiinnortt": [
+ "integration",
+ "orientating"
+ ],
+ "agt": [
+ "agt",
+ "gat",
+ "tag"
+ ],
+ "adeillnst": [
+ "installed",
+ "landsleit"
+ ],
+ "cdeirst": [
+ "credits",
+ "directs"
+ ],
+ "adehln": [
+ "handel",
+ "handle"
+ ],
+ "eestw": [
+ "ewest",
+ "sweet",
+ "weest",
+ "weets",
+ "weste"
+ ],
+ "deks": [
+ "desk",
+ "sked"
+ ],
+ "aceiirrt": [
+ "criteria",
+ "triceria"
+ ],
+ "adev": [
+ "dave",
+ "deva",
+ "vade",
+ "veda"
+ ],
+ "degio": [
+ "diego",
+ "dogie",
+ "geoid"
+ ],
+ "ceiv": [
+ "cive",
+ "vice"
+ ],
+ "ary": [
+ "ary",
+ "yar",
+ "ray",
+ "rya"
+ ],
+ "eeenruv": [
+ "revenue",
+ "unreeve"
+ ],
+ "aeemrsu": [
+ "measure",
+ "reamuse"
+ ],
+ "acgghinn": [
+ "changing",
+ "ganching"
+ ],
+ "eostv": [
+ "ovest",
+ "stove",
+ "votes"
+ ],
+ "aber": [
+ "bare",
+ "bear",
+ "brae"
+ ],
+ "agin": [
+ "agin",
+ "gain",
+ "inga",
+ "naig",
+ "ngai"
+ ],
+ "aceno": [
+ "acone",
+ "canoe",
+ "ocean"
+ ],
+ "ginss": [
+ "signs",
+ "sings",
+ "snigs",
+ "ssing"
+ ],
+ "ackl": [
+ "calk",
+ "kcal",
+ "lack"
+ ],
+ "degglo": [
+ "doggle",
+ "dogleg",
+ "logged"
+ ],
+ "aloppt": [
+ "applot",
+ "laptop"
+ ],
+ "aegintv": [
+ "vagient",
+ "vintage"
+ ],
+ "ainrt": [
+ "intra",
+ "riant",
+ "tairn",
+ "tarin",
+ "train",
+ "trina"
+ ],
+ "aps": [
+ "asp",
+ "pas",
+ "sap",
+ "spa"
+ ],
+ "aelnry": [
+ "anerly",
+ "layner",
+ "nearly"
+ ],
+ "aeilrty": [
+ "irately",
+ "reality",
+ "tearily"
+ ],
+ "giinor": [
+ "nigori",
+ "origin"
+ ],
+ "aggimn": [
+ "gaming",
+ "gigman"
+ ],
+ "aefrst": [
+ "afters",
+ "farset",
+ "faster",
+ "strafe"
+ ],
+ "cno": [
+ "con",
+ "nco"
+ ],
+ "psu": [
+ "pus",
+ "sup",
+ "ups"
+ ],
+ "ainnost": [
+ "anoints",
+ "nations",
+ "onanist"
+ ],
+ "eortu": [
+ "outer",
+ "outre",
+ "route",
+ "troue",
+ "utero"
+ ],
+ "mooz": [
+ "mozo",
+ "zoom"
+ ],
+ "blow": [
+ "blow",
+ "bowl"
+ ],
+ "abeltt": [
+ "batlet",
+ "battel",
+ "battle",
+ "tablet"
+ ],
+ "aeimn": [
+ "amine",
+ "anime",
+ "enami",
+ "maine",
+ "manei",
+ "manie",
+ "minae"
+ ],
+ "aekps": [
+ "peaks",
+ "sapek",
+ "spake",
+ "speak"
+ ],
+ "deiinrsstu": [
+ "disuniters",
+ "industries"
+ ],
+ "adeiilort": [
+ "editorial",
+ "radiolite"
+ ],
+ "ceehps": [
+ "cheeps",
+ "speech"
+ ],
+ "eirw": [
+ "weir",
+ "weri",
+ "wire"
+ ],
+ "alrru": [
+ "rural",
+ "urlar"
+ ],
+ "adehrs": [
+ "dasher",
+ "rhedas",
+ "shader",
+ "shared",
+ "sheard"
+ ],
+ "aept": [
+ "pate",
+ "peat",
+ "tape",
+ "teap",
+ "tepa"
+ ],
+ "cceimnoos": [
+ "economics",
+ "neocosmic"
+ ],
+ "acdi": [
+ "acid",
+ "cadi",
+ "caid"
+ ],
+ "besty": [
+ "betsy",
+ "bytes"
+ ],
+ "eghhit": [
+ "eighth",
+ "height"
+ ],
+ "aeekprs": [
+ "respeak",
+ "speaker"
+ ],
+ "abinot": [
+ "batino",
+ "bonita",
+ "oatbin",
+ "obtain"
+ ],
+ "ceffios": [
+ "coiffes",
+ "offices"
+ ],
+ "deeginrs": [
+ "designer",
+ "energids",
+ "redesign",
+ "reedings",
+ "resigned"
+ ],
+ "aadegmn": [
+ "agnamed",
+ "managed"
+ ],
+ "adefil": [
+ "afield",
+ "defail",
+ "defial",
+ "failed"
+ ],
+ "ceerst": [
+ "certes",
+ "erects",
+ "resect",
+ "screet",
+ "secret",
+ "terces"
+ ],
+ "abht": [
+ "baht",
+ "bath",
+ "bhat"
+ ],
+ "aeegintv": [
+ "agentive",
+ "negative"
+ ],
+ "adenrw": [
+ "andrew",
+ "redawn",
+ "wander",
+ "warden",
+ "warned"
+ ],
+ "efmoprr": [
+ "perform",
+ "preform"
+ ],
+ "aeeimsstt": [
+ "estimates",
+ "semistate",
+ "steamiest"
+ ],
+ "aessst": [
+ "assets",
+ "stases",
+ "tasses"
+ ],
+ "iimnrsty": [
+ "ministry",
+ "myristin"
+ ],
+ "aelrwy": [
+ "yawler",
+ "lawyer",
+ "warely"
+ ],
+ "adeimrr": [
+ "admirer",
+ "madrier",
+ "married"
+ ],
+ "aghinrs": [
+ "garnish",
+ "rashing",
+ "sharing"
+ ],
+ "aloprt": [
+ "patrol",
+ "portal",
+ "tropal"
+ ],
+ "abet": [
+ "abet",
+ "bate",
+ "beat",
+ "beta"
+ ],
+ "afil": [
+ "alif",
+ "fail",
+ "fila"
+ ],
+ "agirst": [
+ "gratis",
+ "striga"
+ ],
+ "aissst": [
+ "assist",
+ "stasis"
+ ],
+ "eginrsv": [
+ "serving",
+ "versing"
+ ],
+ "abgs": [
+ "bags",
+ "gabs"
+ ],
+ "ccimos": [
+ "comics",
+ "cosmic"
+ ],
+ "aemrstt": [
+ "matster",
+ "matters",
+ "smatter"
+ ],
+ "ehossu": [
+ "houses",
+ "shouse"
+ ],
+ "cdo": [
+ "cod",
+ "doc"
+ ],
+ "aerw": [
+ "arew",
+ "waer",
+ "ware",
+ "wear"
+ ],
+ "abegiknr": [
+ "beraking",
+ "breaking",
+ "rebaking"
+ ],
+ "aeilmttu": [
+ "mutilate",
+ "ultimate"
+ ],
+ "aelsw": [
+ "swale",
+ "sweal",
+ "wales",
+ "wasel",
+ "weals"
+ ],
+ "imnor": [
+ "minor",
+ "morin"
+ ],
+ "deeinrsst": [
+ "dissenter",
+ "residents",
+ "tiredness",
+ "triedness"
+ ],
+ "denot": [
+ "donet",
+ "noted",
+ "tendo",
+ "toned"
+ ],
+ "cddeeru": [
+ "deducer",
+ "reduced"
+ ],
+ "aerr": [
+ "rare",
+ "rear"
+ ],
+ "deefmoprr": [
+ "performed",
+ "preformed"
+ ],
+ "adisv": [
+ "davis",
+ "divas",
+ "vadis"
+ ],
+ "adeiln": [
+ "aldine",
+ "alined",
+ "daniel",
+ "delian",
+ "denial",
+ "enalid",
+ "leadin",
+ "nailed"
+ ],
+ "abrs": [
+ "arbs",
+ "bars",
+ "bras"
+ ],
+ "orw": [
+ "row",
+ "wro"
+ ],
+ "aceforst": [
+ "cofaster",
+ "forecast"
+ ],
+ "ehlps": [
+ "helps",
+ "shlep"
+ ],
+ "egilnss": [
+ "essling",
+ "singles"
+ ],
+ "amnostu": [
+ "amounts",
+ "outmans",
+ "saumont"
+ ],
+ "acinnot": [
+ "actinon",
+ "cantino",
+ "cantion",
+ "contain"
+ ],
+ "adlu": [
+ "auld",
+ "dual",
+ "laud",
+ "udal"
+ ],
+ "eirs": [
+ "eris",
+ "ires",
+ "reis",
+ "ries",
+ "rise",
+ "seri",
+ "sier",
+ "sire"
+ ],
+ "dsu": [
+ "sud",
+ "uds"
+ ],
+ "eelps": [
+ "peels",
+ "peles",
+ "sleep",
+ "speel"
+ ],
+ "bdir": [
+ "bird",
+ "brid",
+ "drib"
+ ],
+ "aceinort": [
+ "actioner",
+ "anerotic",
+ "anoretic",
+ "canotier",
+ "ceration",
+ "cortinae",
+ "creation",
+ "reaction"
+ ],
+ "acistt": [
+ "attics",
+ "static",
+ "sticta"
+ ],
+ "ceens": [
+ "cense",
+ "scene",
+ "sence"
+ ],
+ "adly": [
+ "yald",
+ "lady"
+ ],
+ "aet": [
+ "aet",
+ "ate",
+ "eat",
+ "eta",
+ "tae",
+ "tea"
+ ],
+ "acegilnn": [
+ "cleaning",
+ "enlacing"
+ ],
+ "eilnt": [
+ "inlet",
+ "intel",
+ "linet"
+ ],
+ "aegilnortu": [
+ "regulation",
+ "urogenital"
+ ],
+ "cdeinortu": [
+ "introduce",
+ "reduction"
+ ],
+ "aim": [
+ "aim",
+ "ami",
+ "ima",
+ "mia"
+ ],
+ "bdis": [
+ "bids",
+ "dibs"
+ ],
+ "deeefrrr": [
+ "deferrer",
+ "referred"
+ ],
+ "eginors": [
+ "eringos",
+ "ignores",
+ "regions",
+ "signore"
+ ],
+ "els": [
+ "els",
+ "les",
+ "sel"
+ ],
+ "acep": [
+ "cape",
+ "cepa",
+ "pace"
+ ],
+ "ann": [
+ "ann",
+ "nan"
+ ],
+ "ginrs": [
+ "girns",
+ "grins",
+ "rings"
+ ],
+ "ipt": [
+ "pit",
+ "tip",
+ "tpi"
+ ],
+ "deflnoruw": [
+ "underflow",
+ "wonderful"
+ ],
+ "eimn": [
+ "mein",
+ "mien",
+ "mine"
+ ],
+ "adeils": [
+ "aisled",
+ "deasil",
+ "ideals",
+ "ladies",
+ "sailed"
+ ],
+ "adeegr": [
+ "agreed",
+ "dragee",
+ "geared"
+ ],
+ "eeinnoprtv": [
+ "prevention",
+ "provenient"
+ ],
+ "iks": [
+ "ksi",
+ "ski"
+ ],
+ "cceors": [
+ "scorce",
+ "soccer"
+ ],
+ "imoprt": [
+ "import",
+ "promit"
+ ],
+ "ginopst": [
+ "posting",
+ "stoping"
+ ],
+ "aadeiimnnt": [
+ "diamantine",
+ "inanimated",
+ "maintained"
+ ],
+ "ccdeennot": [
+ "condecent",
+ "connected"
+ ],
+ "chirst": [
+ "christ",
+ "strich"
+ ],
+ "dgos": [
+ "dogs",
+ "gods"
+ ],
+ "cdeiorrst": [
+ "creditors",
+ "directors",
+ "recordist"
+ ],
+ "aadeh": [
+ "aahed",
+ "ahead"
+ ],
+ "mnoo": [
+ "mono",
+ "moon"
+ ],
+ "ceehms": [
+ "scheme",
+ "smeech"
+ ],
+ "deelv": [
+ "delve",
+ "devel"
+ ],
+ "eeeinprrsst": [
+ "enterprises",
+ "intersperse"
+ ],
+ "adelt": [
+ "adlet",
+ "dealt",
+ "delta",
+ "lated",
+ "taled"
+ ],
+ "aefr": [
+ "afer",
+ "fare",
+ "fear",
+ "frae",
+ "rafe"
+ ],
+ "eegikns": [
+ "seeking",
+ "skeeing"
+ ],
+ "cehins": [
+ "chines",
+ "chinse",
+ "inches",
+ "niches"
+ ],
+ "aehrss": [
+ "rashes",
+ "shares",
+ "shears"
+ ],
+ "arsw": [
+ "raws",
+ "wars"
+ ],
+ "ekpt": [
+ "kept",
+ "tpke"
+ ],
+ "aaelpp": [
+ "appale",
+ "appeal"
+ ],
+ "ceirsu": [
+ "cruise",
+ "crusie",
+ "curies"
+ ],
+ "bnosu": [
+ "bonus",
+ "bosun"
+ ],
+ "accefiiinortt": [
+ "certification",
+ "cretification",
+ "rectification"
+ ],
+ "eiloprsuvy": [
+ "perviously",
+ "previously",
+ "viperously"
+ ],
+ "ehy": [
+ "hey",
+ "hye",
+ "yeh"
+ ],
+ "aceilpss": [
+ "slipcase",
+ "specials"
+ ],
+ "deinsy": [
+ "disney",
+ "sidney"
+ ],
+ "abdeo": [
+ "abode",
+ "adobe"
+ ],
+ "deirsv": [
+ "divers",
+ "drives"
+ ],
+ "amrs": [
+ "arms",
+ "mars",
+ "rams"
+ ],
+ "eerst": [
+ "ester",
+ "estre",
+ "reest",
+ "reset",
+ "steer",
+ "stere",
+ "stree",
+ "teres",
+ "terse",
+ "trees",
+ "tsere"
+ ],
+ "agv": [
+ "avg",
+ "vag"
+ ],
+ "ahtu": [
+ "auth",
+ "haut",
+ "utah"
+ ],
+ "abenry": [
+ "barney",
+ "nearby"
+ ],
+ "mor": [
+ "mor",
+ "rom"
+ ],
+ "acdeirr": [
+ "acrider",
+ "carried"
+ ],
+ "dehi": [
+ "hide",
+ "hied"
+ ],
+ "aeginrstu": [
+ "gauntries",
+ "signature"
+ ],
+ "eefrr": [
+ "freer",
+ "frere",
+ "refer",
+ "rfree"
+ ],
+ "eillmr": [
+ "miller",
+ "remill"
+ ],
+ "acdesu": [
+ "caused",
+ "sauced"
+ ],
+ "abbes": [
+ "abbes",
+ "babes"
+ ],
+ "ddeein": [
+ "denied",
+ "indeed"
+ ],
+ "oty": [
+ "yot",
+ "toy"
+ ],
+ "deinprt": [
+ "deprint",
+ "printed"
+ ],
+ "losw": [
+ "lows",
+ "owls",
+ "slow",
+ "sowl"
+ ],
+ "aelmorv": [
+ "removal",
+ "valorem"
+ ],
+ "aeeirs": [
+ "aeries",
+ "easier"
+ ],
+ "crs": [
+ "crs",
+ "scr"
+ ],
+ "abiiillty": [
+ "alibility",
+ "liability"
+ ],
+ "hip": [
+ "hip",
+ "ihp",
+ "iph",
+ "phi"
+ ],
+ "einprrst": [
+ "printers",
+ "reprints",
+ "sprinter"
+ ],
+ "einn": [
+ "inne",
+ "nein",
+ "nine"
+ ],
+ "addgin": [
+ "adding",
+ "dading"
+ ],
+ "ceir": [
+ "cire",
+ "eric",
+ "rice"
+ ],
+ "inprst": [
+ "prints",
+ "sprint"
+ ],
+ "denps": [
+ "pends",
+ "psend",
+ "spend"
+ ],
+ "deeirsv": [
+ "derives",
+ "deviser",
+ "diverse",
+ "revised"
+ ],
+ "acilopt": [
+ "capitol",
+ "coalpit",
+ "optical",
+ "topical"
+ ],
+ "aeeilrtv": [
+ "levirate",
+ "relative"
+ ],
+ "dot": [
+ "dot",
+ "tod"
+ ],
+ "eisstu": [
+ "suites",
+ "tissue"
+ ],
+ "eefgiln": [
+ "feeling",
+ "fleeing"
+ ],
+ "eefilr": [
+ "ferlie",
+ "liefer",
+ "refile",
+ "relief"
+ ],
+ "eiinorsv": [
+ "revision",
+ "visioner"
+ ],
+ "aiort": [
+ "ariot",
+ "ratio"
+ ],
+ "adp": [
+ "adp",
+ "dap",
+ "pad"
+ ],
+ "ainr": [
+ "airn",
+ "arni",
+ "iran",
+ "nair",
+ "rain",
+ "rani"
+ ],
+ "noot": [
+ "onto",
+ "oont",
+ "toon"
+ ],
+ "aelnpt": [
+ "pantle",
+ "planet",
+ "platen"
+ ],
+ "ceeipr": [
+ "piecer",
+ "pierce",
+ "recipe"
+ ],
+ "eimprt": [
+ "permit",
+ "premit"
+ ],
+ "eegins": [
+ "genies",
+ "seeing",
+ "signee"
+ ],
+ "einnst": [
+ "innest",
+ "intens",
+ "sennit",
+ "sinnet",
+ "tennis"
+ ],
+ "abss": [
+ "bass",
+ "sabs"
+ ],
+ "bdemoor": [
+ "bedroom",
+ "boerdom",
+ "boredom",
+ "broomed"
+ ],
+ "aceinnst": [
+ "ancients",
+ "canniest",
+ "insectan",
+ "instance"
+ ],
+ "deir": [
+ "dier",
+ "dire",
+ "drie",
+ "ired",
+ "reid",
+ "ride"
+ ],
+ "cdeeilns": [
+ "declines",
+ "licensed",
+ "silenced"
+ ],
+ "adlnoor": [
+ "lardoon",
+ "orlando",
+ "rolando"
+ ],
+ "imt": [
+ "mit",
+ "tim"
+ ],
+ "eeenprrst": [
+ "presenter",
+ "repenters",
+ "represent"
+ ],
+ "aceinnoorstv": [
+ "conservation",
+ "conversation"
+ ],
+ "aipr": [
+ "pair",
+ "pari",
+ "pria",
+ "ripa"
+ ],
+ "adeil": [
+ "adiel",
+ "ailed",
+ "delia",
+ "ideal"
+ ],
+ "dno": [
+ "don",
+ "nod"
+ ],
+ "ceeips": [
+ "pieces",
+ "specie"
+ ],
+ "defhiins": [
+ "definish",
+ "fiendish",
+ "finished"
+ ],
+ "akprs": [
+ "parks",
+ "spark"
+ ],
+ "deinnr": [
+ "dinner",
+ "endrin"
+ ],
+ "acemr": [
+ "cream",
+ "macer"
+ ],
+ "nrsu": [
+ "runs",
+ "snur",
+ "urns"
+ ],
+ "aehy": [
+ "ahey",
+ "eyah",
+ "haye",
+ "yeah"
+ ],
+ "cdeiorsv": [
+ "discover",
+ "divorces"
+ ],
+ "aenprstt": [
+ "patterns",
+ "prestant",
+ "transept",
+ "trapnest"
+ ],
+ "hills": [
+ "hills",
+ "shill"
+ ],
+ "ilnosw": [
+ "lowsin",
+ "wilson"
+ ],
+ "hiirs": [
+ "irish",
+ "rishi",
+ "sirih"
+ ],
+ "aeimnrs": [
+ "marines",
+ "remains",
+ "seminar"
+ ],
+ "aeegrstt": [
+ "greatest",
+ "stratege"
+ ],
+ "eoru": [
+ "euro",
+ "roue"
+ ],
+ "ceeginr": [
+ "energic",
+ "generic"
+ ],
+ "aegsu": [
+ "agues",
+ "usage"
+ ],
+ "acp": [
+ "cap",
+ "pac"
+ ],
+ "ikn": [
+ "ink",
+ "kin"
+ ],
+ "achrst": [
+ "charts",
+ "scarth",
+ "scrath",
+ "starch"
+ ],
+ "cgiinnnotu": [
+ "continuing",
+ "unnoticing"
+ ],
+ "aekp": [
+ "keap",
+ "peak"
+ ],
+ "eistx": [
+ "exist",
+ "exits",
+ "sixte"
+ ],
+ "eehlw": [
+ "hewel",
+ "wheel"
+ ],
+ "ainrstt": [
+ "straint",
+ "transit",
+ "tristan"
+ ],
+ "accmopt": [
+ "accompt",
+ "compact"
+ ],
+ "ghilst": [
+ "lights",
+ "slight"
+ ],
+ "aegln": [
+ "agnel",
+ "angel",
+ "angle",
+ "galen",
+ "genal",
+ "glean",
+ "lagen",
+ "nagel"
+ ],
+ "eegiknp": [
+ "keeping",
+ "peeking"
+ ],
+ "aaeinopprrt": [
+ "paraprotein",
+ "preparation"
+ ],
+ "einos": [
+ "eosin",
+ "noise"
+ ],
+ "eeginns": [
+ "engines",
+ "senegin"
+ ],
+ "aaccertu": [
+ "accurate",
+ "carucate"
+ ],
+ "inp": [
+ "nip",
+ "pin"
+ ],
+ "eirsst": [
+ "resist",
+ "restis",
+ "sister",
+ "tresis"
+ ],
+ "gnu": [
+ "gnu",
+ "gun",
+ "ung"
+ ],
+ "ahprs": [
+ "harps",
+ "sharp",
+ "shrap"
+ ],
+ "abeilnss": [
+ "albiness",
+ "lesbians"
+ ],
+ "ben": [
+ "ben",
+ "neb"
+ ],
+ "aeln": [
+ "alen",
+ "elan",
+ "laen",
+ "lane",
+ "lean",
+ "lena",
+ "nael",
+ "nale",
+ "neal"
+ ],
+ "alo": [
+ "alo",
+ "lao",
+ "loa",
+ "ola"
+ ],
+ "eoprtx": [
+ "export",
+ "torpex"
+ ],
+ "eelmopry": [
+ "employer",
+ "polymere",
+ "reemploy"
+ ],
+ "knosw": [
+ "knows",
+ "snowk",
+ "swonk"
+ ],
+ "bcdeeirs": [
+ "describe",
+ "escribed"
+ ],
+ "ceiinstz": [
+ "citizens",
+ "zincites"
+ ],
+ "aelnoprss": [
+ "apronless",
+ "personals",
+ "responsal"
+ ],
+ "belortu": [
+ "boulter",
+ "trouble"
+ ],
+ "adeprs": [
+ "drapes",
+ "padres",
+ "parsed",
+ "rasped",
+ "spader",
+ "spared",
+ "spread"
+ ],
+ "accho": [
+ "chaco",
+ "choca",
+ "coach"
+ ],
+ "eiknv": [
+ "kevin",
+ "knive"
+ ],
+ "adjnor": [
+ "jardon",
+ "jordan"
+ ],
+ "aegs": [
+ "ages",
+ "gaes",
+ "sage"
+ ],
+ "glpu": [
+ "gulp",
+ "plug"
+ ],
+ "aceiilpsst": [
+ "plasticise",
+ "specialist"
+ ],
+ "giinrv": [
+ "irving",
+ "riving",
+ "virgin"
+ ],
+ "aegiiinnosttv": [
+ "investigation",
+ "tenovaginitis"
+ ],
+ "adeirs": [
+ "aiders",
+ "arised",
+ "deairs",
+ "irades",
+ "raised",
+ "redias",
+ "resaid"
+ ],
+ "aht": [
+ "aht",
+ "hat",
+ "tha"
+ ],
+ "cddeeirt": [
+ "credited",
+ "directed"
+ ],
+ "elpr": [
+ "lerp",
+ "repl"
+ ],
+ "beik": [
+ "bike",
+ "kibe"
+ ],
+ "aelpt": [
+ "leapt",
+ "lepta",
+ "palet",
+ "patel",
+ "pelta",
+ "petal",
+ "plate",
+ "pleat",
+ "tepal"
+ ],
+ "acdeiint": [
+ "actinide",
+ "ctenidia",
+ "diacetin",
+ "diactine",
+ "indicate"
+ ],
+ "bdelno": [
+ "blonde",
+ "bolden",
+ "nobled"
+ ],
+ "elos": [
+ "leos",
+ "lose",
+ "oles",
+ "sloe",
+ "sole"
+ ],
+ "eeks": [
+ "ekes",
+ "kees",
+ "seek",
+ "skee"
+ ],
+ "ablmsu": [
+ "albums",
+ "sambul",
+ "sumbal"
+ ],
+ "acehst": [
+ "chaste",
+ "cheats",
+ "sachet",
+ "scathe",
+ "scheat",
+ "taches"
+ ],
+ "egsstu": [
+ "guests",
+ "gusset"
+ ],
+ "adeeisss": [
+ "diseases",
+ "seasides"
+ ],
+ "deeeloprsv": [
+ "developers",
+ "redevelops"
+ ],
+ "noty": [
+ "yont",
+ "tony"
+ ],
+ "aadenv": [
+ "advena",
+ "nevada",
+ "vedana",
+ "venada"
+ ],
+ "ikst": [
+ "kist",
+ "kits",
+ "skit"
+ ],
+ "aadegn": [
+ "agenda",
+ "gadean"
+ ],
+ "ceinnostu": [
+ "continues",
+ "neustonic"
+ ],
+ "ackrst": [
+ "strack",
+ "tracks"
+ ],
+ "aeelmptt": [
+ "palmette",
+ "template"
+ ],
+ "ceinpr": [
+ "pincer",
+ "prince"
+ ],
+ "cceilr": [
+ "circle",
+ "cleric"
+ ],
+ "ilos": [
+ "lois",
+ "oils",
+ "silo",
+ "siol",
+ "soil",
+ "soli"
+ ],
+ "agnrst": [
+ "grants",
+ "strang"
+ ],
+ "aacilntt": [
+ "atlantic",
+ "tantalic"
+ ],
+ "etw": [
+ "tew",
+ "wet"
+ ],
+ "adderw": [
+ "edward",
+ "wadder",
+ "warded"
+ ],
+ "aegilnv": [
+ "leaving",
+ "vangeli",
+ "vealing"
+ ],
+ "denoprs": [
+ "ponders",
+ "respond"
+ ],
+ "eissz": [
+ "sizes",
+ "zeiss"
+ ],
+ "ailnp": [
+ "lapin",
+ "lipan",
+ "pinal",
+ "plain"
+ ],
+ "eksy": [
+ "keys",
+ "syke",
+ "skey",
+ "skye"
+ ],
+ "achlnu": [
+ "chulan",
+ "launch",
+ "nuchal"
+ ],
+ "ehms": [
+ "hems",
+ "mesh",
+ "shem"
+ ],
+ "blmosy": [
+ "blosmy",
+ "symbol"
+ ],
+ "aden": [
+ "aden",
+ "ande",
+ "dane",
+ "dean",
+ "edna"
+ ],
+ "epstu": [
+ "setup",
+ "spute",
+ "stupe",
+ "upset"
+ ],
+ "acfils": [
+ "califs",
+ "fiscal"
+ ],
+ "elssty": [
+ "slyest",
+ "styles"
+ ],
+ "deenrv": [
+ "denver",
+ "nerved",
+ "revend",
+ "vender"
+ ],
+ "finoty": [
+ "notify",
+ "tonify"
+ ],
+ "belsu": [
+ "blues",
+ "bulse",
+ "lubes"
+ ],
+ "ceops": [
+ "copes",
+ "copse",
+ "pecos",
+ "scope"
+ ],
+ "eilpprsu": [
+ "periplus",
+ "supplier"
+ ],
+ "adelnt": [
+ "dental",
+ "tandle"
+ ],
+ "bdeorr": [
+ "border",
+ "roberd"
+ ],
+ "acessu": [
+ "causes",
+ "causse",
+ "sauces"
+ ],
+ "adeelnr": [
+ "laender",
+ "leander",
+ "learned",
+ "reladen"
+ ],
+ "chiiorst": [
+ "historic",
+ "orchitis"
+ ],
+ "deenop": [
+ "depone",
+ "opened"
+ ],
+ "ceorss": [
+ "cessor",
+ "corses",
+ "crosse",
+ "scores",
+ "scorse"
+ ],
+ "aeilnr": [
+ "aliner",
+ "arline",
+ "enrail",
+ "lainer",
+ "lanier",
+ "larine",
+ "linear",
+ "nailer",
+ "renail"
+ ],
+ "abers": [
+ "bares",
+ "barse",
+ "baser",
+ "bears",
+ "besra",
+ "braes",
+ "saber",
+ "sabre",
+ "serab"
+ ],
+ "aejn": [
+ "jane",
+ "jean"
+ ],
+ "hop": [
+ "hop",
+ "pho",
+ "poh"
+ ],
+ "ddeeit": [
+ "dieted",
+ "edited"
+ ],
+ "aisv": [
+ "avis",
+ "siva",
+ "vias",
+ "visa"
+ ],
+ "eemrt": [
+ "meter",
+ "metre",
+ "remet",
+ "retem"
+ ],
+ "deikln": [
+ "kilned",
+ "kindle",
+ "linked"
+ ],
+ "ccenopst": [
+ "concepts",
+ "conspect"
+ ],
+ "epru": [
+ "peru",
+ "prue",
+ "pure"
+ ],
+ "deeilrv": [
+ "deliver",
+ "deviler",
+ "livered",
+ "relived",
+ "reviled",
+ "riveled"
+ ],
+ "denorw": [
+ "downer",
+ "nowder",
+ "wonder",
+ "worden"
+ ],
+ "elnosss": [
+ "lessons",
+ "sonless"
+ ],
+ "begins": [
+ "begins",
+ "beings",
+ "besing",
+ "binges"
+ ],
+ "aelrst": [
+ "alerts",
+ "alters",
+ "artels",
+ "estral",
+ "laster",
+ "lastre",
+ "rastle",
+ "ratels",
+ "relast",
+ "resalt",
+ "salter",
+ "slater",
+ "staler",
+ "stelar",
+ "talers"
+ ],
+ "adrw": [
+ "draw",
+ "ward"
+ ],
+ "aegilnrt": [
+ "alerting",
+ "altering",
+ "integral",
+ "relating",
+ "tanglier",
+ "teraglin",
+ "triangle"
+ ],
+ "aemssu": [
+ "amuses",
+ "assume",
+ "seamus"
+ ],
+ "aaceilln": [
+ "alliance",
+ "ancillae",
+ "canaille"
+ ],
+ "eehinrt": [
+ "enherit",
+ "etherin",
+ "neither",
+ "therein"
+ ],
+ "eilsw": [
+ "lewis",
+ "swile",
+ "wiles"
+ ],
+ "aeelsv": [
+ "leaves",
+ "sleave"
+ ],
+ "aceelpr": [
+ "percale",
+ "replace"
+ ],
+ "ceenorrtv": [
+ "converter",
+ "reconvert"
+ ],
+ "abbe": [
+ "abbe",
+ "babe"
+ ],
+ "agrsu": [
+ "argus",
+ "gaurs",
+ "guars",
+ "sugar"
+ ],
+ "egls": [
+ "gels",
+ "legs"
+ ],
+ "ams": [
+ "mas",
+ "sam",
+ "sma"
+ ],
+ "cikst": [
+ "stick",
+ "ticks"
+ ],
+ "aelln": [
+ "allen",
+ "ellan"
+ ],
+ "dpt": [
+ "dpt",
+ "tpd"
+ ],
+ "aeilnort": [
+ "oriental",
+ "relation",
+ "tirolean"
+ ],
+ "abdeeln": [
+ "enabled",
+ "endable"
+ ],
+ "deils": [
+ "deils",
+ "delis",
+ "idles",
+ "isled",
+ "sidle",
+ "slide"
+ ],
+ "deestt": [
+ "detest",
+ "tested"
+ ],
+ "aadeprt": [
+ "adapter",
+ "predata",
+ "readapt"
+ ],
+ "cklo": [
+ "colk",
+ "lock"
+ ],
+ "cehkoy": [
+ "chokey",
+ "hockey"
+ ],
+ "morst": [
+ "morts",
+ "storm",
+ "strom"
+ ],
+ "cimor": [
+ "micro",
+ "moric",
+ "romic"
+ ],
+ "eilm": [
+ "emil",
+ "lime",
+ "mile"
+ ],
+ "deiorst": [
+ "editors",
+ "oestrid",
+ "sortied",
+ "steroid",
+ "storied",
+ "triodes"
+ ],
+ "adehrst": [
+ "dearths",
+ "hardest",
+ "hardset",
+ "hatreds",
+ "threads",
+ "trashed"
+ ],
+ "eemprsu": [
+ "presume",
+ "supreme"
+ ],
+ "eenprsst": [
+ "pensters",
+ "pertness",
+ "presents",
+ "serpents"
+ ],
+ "efr": [
+ "erf",
+ "fer",
+ "ref"
+ ],
+ "aknt": [
+ "kant",
+ "tank"
+ ],
+ "aeeimstt": [
+ "estimate",
+ "etatisme",
+ "meatiest",
+ "teatimes"
+ ],
+ "ceiinnopst": [
+ "cispontine",
+ "inceptions",
+ "inspection"
+ ],
+ "iilmst": [
+ "limits",
+ "mislit"
+ ],
+ "aceehmnrst": [
+ "manchester",
+ "searchment"
+ ],
+ "ainpt": [
+ "inapt",
+ "paint",
+ "patin",
+ "pinta"
+ ],
+ "adely": [
+ "delay",
+ "layed",
+ "leady"
+ ],
+ "ilopt": [
+ "pilot",
+ "polit"
+ ],
+ "elottu": [
+ "outlet",
+ "tutelo"
+ ],
+ "egilnrstu": [
+ "lustering",
+ "resulting",
+ "ulstering"
+ ],
+ "anp": [
+ "nap",
+ "pan"
+ ],
+ "alrtu": [
+ "lutra",
+ "ultra"
+ ],
+ "aaeiimnnotx": [
+ "examination",
+ "exanimation"
+ ],
+ "eoprtt": [
+ "porett",
+ "potter"
+ ],
+ "alpsy": [
+ "palsy",
+ "plays",
+ "splay"
+ ],
+ "beillntu": [
+ "bulletin",
+ "unbillet"
+ ],
+ "acdeiinst": [
+ "actinides",
+ "andesitic",
+ "dianetics",
+ "indicates"
+ ],
+ "dfimoy": [
+ "domify",
+ "modify"
+ ],
+ "aadm": [
+ "adam",
+ "dama",
+ "maad"
+ ],
+ "lrtuy": [
+ "rutyl",
+ "truly"
+ ],
+ "agiinnpt": [
+ "painting",
+ "patining"
+ ],
+ "aenptt": [
+ "patent",
+ "patten",
+ "tapnet"
+ ],
+ "pps": [
+ "pps",
+ "spp"
+ ],
+ "aegint": [
+ "eating",
+ "ingate",
+ "tangie",
+ "teaing",
+ "tinage"
+ ],
+ "ceeeipprstv": [
+ "perspective",
+ "prespective"
+ ],
+ "deglo": [
+ "lodge",
+ "ogled"
+ ],
+ "egilnrst": [
+ "lingster",
+ "ringlets",
+ "sterling",
+ "tinglers"
+ ],
+ "bersuy": [
+ "buyers",
+ "rebusy"
+ ],
+ "agry": [
+ "gary",
+ "gray"
+ ],
+ "aaceglotu": [
+ "catalogue",
+ "coagulate"
+ ],
+ "aaintw": [
+ "atwain",
+ "taiwan"
+ ],
+ "cehnos": [
+ "cheson",
+ "chosen",
+ "cohens",
+ "schone"
+ ],
+ "aahrs": [
+ "asarh",
+ "haars",
+ "haras",
+ "raash",
+ "sarah"
+ ],
+ "aeilmnrt": [
+ "terminal",
+ "tramline"
+ ],
+ "aelnors": [
+ "loaners",
+ "orleans",
+ "reloans"
+ ],
+ "eeimpr": [
+ "empire",
+ "epimer",
+ "premie"
+ ],
+ "aeirs": [
+ "aesir",
+ "aries",
+ "arise",
+ "raise",
+ "serai"
+ ],
+ "aeepprr": [
+ "paperer",
+ "perpera",
+ "prepare",
+ "repaper"
+ ],
+ "aabr": [
+ "arab",
+ "arba",
+ "baar",
+ "bara"
+ ],
+ "eeimprr": [
+ "premier",
+ "reprime"
+ ],
+ "mooorrtw": [
+ "moorwort",
+ "rootworm",
+ "tomorrow",
+ "wormroot"
+ ],
+ "cddeei": [
+ "decide",
+ "deiced"
+ ],
+ "aadmr": [
+ "damar",
+ "drama"
+ ],
+ "efgimnoprr": [
+ "performing",
+ "preforming"
+ ],
+ "abeilstu": [
+ "sabulite",
+ "suitable"
+ ],
+ "abcehmr": [
+ "becharm",
+ "brecham",
+ "chamber",
+ "chambre"
+ ],
+ "aeginu": [
+ "enigua",
+ "guinea",
+ "naigue"
+ ],
+ "celmsu": [
+ "clumse",
+ "muscle"
+ ],
+ "aefginrtu": [
+ "featuring",
+ "figurante"
+ ],
+ "ios": [
+ "ios",
+ "iso",
+ "osi"
+ ],
+ "orsuy": [
+ "yours",
+ "soury"
+ ],
+ "msu": [
+ "mus",
+ "sum"
+ ],
+ "adentt": [
+ "attend",
+ "detant"
+ ],
+ "ehorsw": [
+ "reshow",
+ "shower",
+ "whores"
+ ],
+ "aaln": [
+ "alan",
+ "anal",
+ "lana"
+ ],
+ "deginns": [
+ "endings",
+ "sending"
+ ],
+ "ajnos": [
+ "janos",
+ "jason",
+ "jonas",
+ "sonja"
+ ],
+ "ghinott": [
+ "hotting",
+ "tonight"
+ ],
+ "ehlls": [
+ "hells",
+ "shell"
+ ],
+ "ako": [
+ "ako",
+ "koa",
+ "oak",
+ "oka"
+ ],
+ "atv": [
+ "tav",
+ "vat"
+ ],
+ "beer": [
+ "beer",
+ "bere",
+ "bree"
+ ],
+ "deeems": [
+ "seemed",
+ "semeed"
+ ],
+ "alors": [
+ "orals",
+ "rosal",
+ "solar",
+ "soral"
+ ],
+ "ejos": [
+ "joes",
+ "jose"
+ ],
+ "irs": [
+ "irs",
+ "sir",
+ "sri"
+ ],
+ "abelnu": [
+ "nebula",
+ "unable",
+ "unbale"
+ ],
+ "aksst": [
+ "skats",
+ "tasks"
+ ],
+ "aceeinrsst": [
+ "ancestries",
+ "resistance",
+ "senatrices"
+ ],
+ "doors": [
+ "doors",
+ "odors",
+ "ordos",
+ "roods",
+ "soord",
+ "sordo"
+ ],
+ "eorrsst": [
+ "resorts",
+ "ressort",
+ "rosters",
+ "sorters"
+ ],
+ "iiorstv": [
+ "ivorist",
+ "visitor"
+ ],
+ "intw": [
+ "twin",
+ "wint"
+ ],
+ "fhort": [
+ "forth",
+ "froth"
+ ],
+ "einrst": [
+ "estrin",
+ "inerts",
+ "insert",
+ "inters",
+ "niters",
+ "nitres",
+ "sinter",
+ "sterin",
+ "triens",
+ "trines"
+ ],
+ "abeilmort": [
+ "artmobile",
+ "baltimore"
+ ],
+ "aaegtwy": [
+ "gateway",
+ "getaway",
+ "waygate"
+ ],
+ "ailmnu": [
+ "alumin",
+ "alumni",
+ "lumina",
+ "unmail"
+ ],
+ "adginrw": [
+ "drawing",
+ "ginward",
+ "warding"
+ ],
+ "acemnor": [
+ "cremona",
+ "romance"
+ ],
+ "eimnnrsttu": [
+ "instrument",
+ "nutriments"
+ ],
+ "bceru": [
+ "bruce",
+ "cebur",
+ "cuber"
+ ],
+ "ilpst": [
+ "slipt",
+ "spilt",
+ "split"
+ ],
+ "eehmst": [
+ "smeeth",
+ "smethe",
+ "themes"
+ ],
+ "bist": [
+ "bist",
+ "bits",
+ "stib"
+ ],
+ "cdefosu": [
+ "defocus",
+ "focused"
+ ],
+ "agikns": [
+ "asking",
+ "gaskin",
+ "kiangs",
+ "kisang"
+ ],
+ "abdeeist": [
+ "beadiest",
+ "diabetes"
+ ],
+ "istu": [
+ "situ",
+ "suit",
+ "tuis"
+ ],
+ "chip": [
+ "chip",
+ "pich"
+ ],
+ "ers": [
+ "ers",
+ "res",
+ "ser"
+ ],
+ "bdeios": [
+ "bodies",
+ "dobies",
+ "obside"
+ ],
+ "imnos": [
+ "minos",
+ "osmin",
+ "simon"
+ ],
+ "eirrstw": [
+ "wrister",
+ "writers"
+ ],
+ "delov": [
+ "loved",
+ "voled"
+ ],
+ "bdirs": [
+ "birds",
+ "dribs"
+ ],
+ "eeenprrsst": [
+ "presenters",
+ "represents"
+ ],
+ "achr": [
+ "arch",
+ "char",
+ "rach"
+ ],
+ "adesv": [
+ "devas",
+ "saved"
+ ],
+ "acnoort": [
+ "cartoon",
+ "coranto"
+ ],
+ "hosst": [
+ "hosts",
+ "shots",
+ "soths",
+ "stosh"
+ ],
+ "emoor": [
+ "moore",
+ "romeo"
+ ],
+ "adegnrt": [
+ "dragnet",
+ "granted"
+ ],
+ "ccehios": [
+ "choices",
+ "secchio"
+ ],
+ "abcnor": [
+ "bracon",
+ "carbon",
+ "corban"
+ ],
+ "egiilnnst": [
+ "enlisting",
+ "listening",
+ "tinseling"
+ ],
+ "kloootu": [
+ "lookout",
+ "outlook"
+ ],
+ "aeimssv": [
+ "massive",
+ "mavises"
+ ],
+ "aertt": [
+ "atter",
+ "tarte",
+ "tater",
+ "teart",
+ "tetra",
+ "treat"
+ ],
+ "adeehr": [
+ "adhere",
+ "header",
+ "hedera",
+ "rehead",
+ "rhedae"
+ ],
+ "defmor": [
+ "deform",
+ "formed"
+ ],
+ "dgir": [
+ "gird",
+ "grid"
+ ],
+ "eehsst": [
+ "sheets",
+ "theses"
+ ],
+ "acikprt": [
+ "patrick",
+ "tripack"
+ ],
+ "eoprtu": [
+ "pouter",
+ "puerto",
+ "roupet",
+ "troupe",
+ "uptore"
+ ],
+ "aalmps": [
+ "lampas",
+ "plasma"
+ ],
+ "aeginnrs": [
+ "aginners",
+ "earnings",
+ "engrains",
+ "grannies"
+ ],
+ "ikrss": [
+ "kriss",
+ "risks"
+ ],
+ "acehrrt": [
+ "charter",
+ "ratcher",
+ "rechart"
+ ],
+ "fgi": [
+ "fig",
+ "gif"
+ ],
+ "aaabbrr": [
+ "barabra",
+ "barbara"
+ ],
+ "ademrs": [
+ "dermas",
+ "dreams",
+ "madres"
+ ],
+ "begglor": [
+ "boggler",
+ "broggle"
+ ],
+ "cegiilnns": [
+ "licensing",
+ "silencing"
+ ],
+ "aceht": [
+ "cheat",
+ "tache",
+ "teach",
+ "theca"
+ ],
+ "adipr": [
+ "adrip",
+ "padri",
+ "pardi",
+ "rapid"
+ ],
+ "deiopst": [
+ "deposit",
+ "dopiest",
+ "podites",
+ "posited",
+ "sopited",
+ "topside"
+ ],
+ "aailnt": [
+ "antlia",
+ "latian",
+ "nalita"
+ ],
+ "aans": [
+ "anas",
+ "ansa",
+ "nasa",
+ "saan"
+ ],
+ "eehlsw": [
+ "shewel",
+ "wheels"
+ ],
+ "aeelmpstt": [
+ "palmettes",
+ "templates"
+ ],
+ "afmorst": [
+ "farmost",
+ "formats"
+ ],
+ "abt": [
+ "abt",
+ "bat",
+ "tab"
+ ],
+ "ddeenps": [
+ "depends",
+ "despend"
+ ],
+ "boost": [
+ "boost",
+ "boots"
+ ],
+ "eorrtu": [
+ "retour",
+ "roture",
+ "router",
+ "tourer"
+ ],
+ "degiint": [
+ "dieting",
+ "editing",
+ "ignited"
+ ],
+ "deflor": [
+ "folder",
+ "refold"
+ ],
+ "elpsu": [
+ "lepus",
+ "pules",
+ "pulse"
+ ],
+ "corstu": [
+ "courts",
+ "scrout",
+ "scruto"
+ ],
+ "deiortt": [
+ "detroit",
+ "dottier"
+ ],
+ "emort": [
+ "metro",
+ "moter"
+ ],
+ "iprst": [
+ "spirt",
+ "sprit",
+ "stirp",
+ "strip",
+ "trips"
+ ],
+ "aelpr": [
+ "lepra",
+ "paler",
+ "parel",
+ "parle",
+ "pearl",
+ "perla",
+ "prela",
+ "relap"
+ ],
+ "deeinrst": [
+ "disenter",
+ "indesert",
+ "inserted",
+ "resident",
+ "sentried",
+ "sintered"
+ ],
+ "lopt": [
+ "plot",
+ "polt"
+ ],
+ "adegrr": [
+ "darger",
+ "garred",
+ "gerard",
+ "grader",
+ "redrag",
+ "regard"
+ ],
+ "eisstx": [
+ "exists",
+ "sexist",
+ "sixtes"
+ ],
+ "eikrst": [
+ "kiters",
+ "skiter",
+ "strike"
+ ],
+ "aehrtt": [
+ "hatter",
+ "threat"
+ ],
+ "ehinoprsw": [
+ "ownership",
+ "shipowner"
+ ],
+ "aeilrrt": [
+ "retiral",
+ "retrial",
+ "trailer"
+ ],
+ "aenn": [
+ "anne",
+ "nane"
+ ],
+ "acelst": [
+ "castle",
+ "cleats",
+ "eclats",
+ "scalet",
+ "sclate"
+ ],
+ "adegnrs": [
+ "dangers",
+ "ganders",
+ "gardens"
+ ],
+ "deimss": [
+ "deisms",
+ "demiss",
+ "dismes",
+ "missed"
+ ],
+ "aeinqtu": [
+ "antique",
+ "quinate"
+ ],
+ "bio": [
+ "bio",
+ "ibo",
+ "obi"
+ ],
+ "acgint": [
+ "acting",
+ "cating"
+ ],
+ "adehs": [
+ "ashed",
+ "deash",
+ "hades",
+ "heads",
+ "sadhe",
+ "shade"
+ ],
+ "aemx": [
+ "amex",
+ "exam",
+ "xema"
+ ],
+ "gloos": [
+ "gools",
+ "logos"
+ ],
+ "aeinqstu": [
+ "antiques",
+ "quanties"
+ ],
+ "deinsty": [
+ "density",
+ "destiny"
+ ],
+ "anry": [
+ "yarn",
+ "nary"
+ ],
+ "aegnrst": [
+ "angster",
+ "argents",
+ "garnets",
+ "nagster",
+ "strange"
+ ],
+ "bdes": [
+ "beds",
+ "debs"
+ ],
+ "cps": [
+ "cps",
+ "csp"
+ ],
+ "eelmoprsy": [
+ "employers",
+ "reemploys"
+ ],
+ "egry": [
+ "gery",
+ "gyre",
+ "grey"
+ ],
+ "addeemn": [
+ "amended",
+ "deadmen"
+ ],
+ "bdlo": [
+ "bold",
+ "dobl"
+ ],
+ "elnoss": [
+ "lesson",
+ "nossel",
+ "onless"
+ ],
+ "aceimn": [
+ "anemic",
+ "cinema",
+ "iceman"
+ ],
+ "aesst": [
+ "asset",
+ "easts",
+ "sates",
+ "seats",
+ "tasse"
+ ],
+ "acns": [
+ "cans",
+ "scan"
+ ],
+ "eeersv": [
+ "everse",
+ "reeves",
+ "severe"
+ ],
+ "aeeegnrt": [
+ "generate",
+ "renegate",
+ "teenager"
+ ],
+ "aeilnssst": [
+ "saintless",
+ "saltiness",
+ "slatiness",
+ "stainless"
+ ],
+ "ahilopsst": [
+ "hospitals",
+ "thalposis"
+ ],
+ "hmoru": [
+ "humor",
+ "mohur"
+ ],
+ "adeg": [
+ "aged",
+ "egad",
+ "gade",
+ "gaed"
+ ],
+ "ceeinoptx": [
+ "exception",
+ "expection"
+ ],
+ "deilv": [
+ "devil",
+ "divel",
+ "lived"
+ ],
+ "adinortu": [
+ "duration",
+ "unadroit"
+ ],
+ "cis": [
+ "cis",
+ "csi",
+ "sci",
+ "sic"
+ ],
+ "det": [
+ "det",
+ "ted"
+ ],
+ "adimnos": [
+ "daimons",
+ "domains",
+ "madison"
+ ],
+ "fgilny": [
+ "flying",
+ "flingy"
+ ],
+ "ins": [
+ "ins",
+ "isn",
+ "nis",
+ "sin"
+ ],
+ "adeginorz": [
+ "dragonize",
+ "organized"
+ ],
+ "aapr": [
+ "apar",
+ "paar",
+ "para"
+ ],
+ "eeimnss": [
+ "nemesis",
+ "siemens"
+ ],
+ "aemnt": [
+ "ament",
+ "manet",
+ "meant",
+ "menat",
+ "menta",
+ "teman"
+ ],
+ "aceprtu": [
+ "capture",
+ "cuprate",
+ "uptrace"
+ ],
+ "dnopsu": [
+ "pondus",
+ "pounds"
+ ],
+ "dees": [
+ "dees",
+ "seed"
+ ],
+ "deeirs": [
+ "desire",
+ "eiders",
+ "reside"
+ ],
+ "eemst": [
+ "meets",
+ "metes",
+ "steem",
+ "teems",
+ "temse"
+ ],
+ "eepr": [
+ "peer",
+ "pere",
+ "pree"
+ ],
+ "adekmr": [
+ "demark",
+ "marked"
+ ],
+ "deinrv": [
+ "driven",
+ "nervid",
+ "verdin"
+ ],
+ "adeemrsu": [
+ "madurese",
+ "measured"
+ ],
+ "adhnostu": [
+ "handouts",
+ "thousand"
+ ],
+ "acegr": [
+ "cager",
+ "garce",
+ "grace"
+ ],
+ "anssu": [
+ "nasus",
+ "susan"
+ ],
+ "gin": [
+ "gin",
+ "ign",
+ "ing",
+ "nig"
+ ],
+ "aadms": [
+ "adams",
+ "damas"
+ ],
+ "hnopty": [
+ "phyton",
+ "python",
+ "typhon"
+ ],
+ "emnorst": [
+ "mentors",
+ "monster"
+ ],
+ "aelx": [
+ "alex",
+ "axel",
+ "axle",
+ "exla"
+ ],
+ "beno": [
+ "beno",
+ "bone",
+ "ebon"
+ ],
+ "bgsu": [
+ "bugs",
+ "subg"
+ ],
+ "einnr": [
+ "inner",
+ "renin"
+ ],
+ "ailorttu": [
+ "outtrail",
+ "tutorial"
+ ],
+ "dem": [
+ "dem",
+ "med"
+ ],
+ "eeeginnrs": [
+ "engineers",
+ "geneserin"
+ ],
+ "eintty": [
+ "entity",
+ "tinety"
+ ],
+ "ceirssu": [
+ "ciruses",
+ "cruises"
+ ],
+ "aegt": [
+ "aget",
+ "gaet",
+ "gate",
+ "geat",
+ "geta",
+ "tega"
+ ],
+ "amnor": [
+ "manor",
+ "moran",
+ "norma",
+ "ramon",
+ "roman"
+ ],
+ "deistu": [
+ "duties",
+ "eudist",
+ "setuid",
+ "suited"
+ ],
+ "cehist": [
+ "ethics",
+ "itches",
+ "sethic"
+ ],
+ "adgnor": [
+ "dragon",
+ "gardon",
+ "grando"
+ ],
+ "bsuy": [
+ "buys",
+ "busy"
+ ],
+ "aacinpt": [
+ "capitan",
+ "captain",
+ "panctia"
+ ],
+ "aeghint": [
+ "gahnite",
+ "heating"
+ ],
+ "egl": [
+ "gel",
+ "leg"
+ ],
+ "abc": [
+ "abc",
+ "bac",
+ "cab"
+ ],
+ "ailr": [
+ "aril",
+ "lair",
+ "lari",
+ "liar",
+ "lira",
+ "rail",
+ "rial"
+ ],
+ "abeillr": [
+ "braille",
+ "liberal"
+ ],
+ "betu": [
+ "bute",
+ "tebu",
+ "tube"
+ ],
+ "nrstu": [
+ "runts",
+ "snurt",
+ "turns"
+ ],
+ "acceh": [
+ "cache",
+ "chace"
+ ],
+ "belt": [
+ "belt",
+ "blet"
+ ],
+ "aaiimnnot": [
+ "amination",
+ "animation"
+ ],
+ "acelor": [
+ "carole",
+ "coaler",
+ "coelar",
+ "colera",
+ "oracle",
+ "recoal"
+ ],
+ "aeels": [
+ "easel",
+ "lease"
+ ],
+ "adeirsst": [
+ "diasters",
+ "disaster",
+ "disrates"
+ ],
+ "celnoos": [
+ "colones",
+ "console"
+ ],
+ "agint": [
+ "ating",
+ "giant",
+ "tangi",
+ "tiang"
+ ],
+ "aalmr": [
+ "alarm",
+ "malar",
+ "maral",
+ "marla",
+ "ramal"
+ ],
+ "alsuu": [
+ "luaus",
+ "usual"
+ ],
+ "adgilno": [
+ "angloid",
+ "digonal",
+ "loading"
+ ],
+ "bor": [
+ "bor",
+ "bro",
+ "orb",
+ "rob"
+ ],
+ "deeginrss": [
+ "designers",
+ "redesigns"
+ ],
+ "orstw": [
+ "strow",
+ "trows",
+ "worst",
+ "worts"
+ ],
+ "aaeginnrt": [
+ "argentina",
+ "tanagrine"
+ ],
+ "ceiimmnoorss": [
+ "commissioner",
+ "recommission"
+ ],
+ "agmnor": [
+ "gorman",
+ "morgan"
+ ],
+ "aeelprsu": [
+ "pleasure",
+ "serpulae"
+ ],
+ "deeinort": [
+ "enteroid",
+ "orendite",
+ "oriented"
+ ],
+ "aeegl": [
+ "aegle",
+ "aglee",
+ "eagle",
+ "galee"
+ ],
+ "enrsu": [
+ "nurse",
+ "resun",
+ "runes"
+ ],
+ "aeprry": [
+ "prayer",
+ "repray"
+ ],
+ "acehinrru": [
+ "hurricane",
+ "raunchier"
+ ],
+ "aegopst": [
+ "gestapo",
+ "postage",
+ "potages"
+ ],
+ "cdeoprru": [
+ "procured",
+ "producer"
+ ],
+ "adil": [
+ "dail",
+ "dali",
+ "dial",
+ "laid",
+ "lida"
+ ],
+ "aekmr": [
+ "maker",
+ "marek",
+ "merak"
+ ],
+ "cikps": [
+ "picks",
+ "spick"
+ ],
+ "efhist": [
+ "fetish",
+ "fishet"
+ ],
+ "acinoss": [
+ "caisson",
+ "casinos",
+ "cassino",
+ "cassoni"
+ ],
+ "ekmos": [
+ "mokes",
+ "smoke"
+ ],
+ "aacehp": [
+ "achape",
+ "apache"
+ ],
+ "efilrst": [
+ "filters",
+ "frislet",
+ "lifters",
+ "slifter",
+ "stifler",
+ "trifles"
+ ],
+ "acdeinooprrt": [
+ "adrenotropic",
+ "incorporated"
+ ],
+ "acfrt": [
+ "craft",
+ "fract"
+ ],
+ "aaprt": [
+ "apart",
+ "trapa"
+ ],
+ "eglnou": [
+ "longue",
+ "lounge"
+ ],
+ "adm": [
+ "adm",
+ "dam",
+ "mad"
+ ],
+ "aghilmort": [
+ "algorithm",
+ "logarithm"
+ ],
+ "eims": [
+ "mise",
+ "semi",
+ "sime"
+ ],
+ "cinos": [
+ "cions",
+ "coins",
+ "cosin",
+ "icons",
+ "oscin",
+ "scion",
+ "sonic"
+ ],
+ "glnorsty": [
+ "strongyl",
+ "strongly"
+ ],
+ "aeeilnntv": [
+ "levantine",
+ "valentine"
+ ],
+ "ekn": [
+ "ken",
+ "nek"
+ ],
+ "einoprst": [
+ "pointers",
+ "proteins",
+ "ripstone",
+ "tropines"
+ ],
+ "aabcelp": [
+ "capable",
+ "pacable"
+ ],
+ "illt": [
+ "itll",
+ "lilt",
+ "till"
+ ],
+ "enp": [
+ "nep",
+ "pen"
+ ],
+ "enops": [
+ "opens",
+ "peons",
+ "pones"
+ ],
+ "ehos": [
+ "hoes",
+ "hose",
+ "shoe"
+ ],
+ "adns": [
+ "ands",
+ "sand"
+ ],
+ "deiinost": [
+ "desition",
+ "editions",
+ "sedition"
+ ],
+ "ailmny": [
+ "amylin",
+ "mainly"
+ ],
+ "anr": [
+ "arn",
+ "nar",
+ "ran"
+ ],
+ "aaeilmnprt": [
+ "palermitan",
+ "parliament"
+ ],
+ "acort": [
+ "actor",
+ "carot",
+ "coart",
+ "corta",
+ "croat",
+ "rocta",
+ "taroc",
+ "troca"
+ ],
+ "aacdellot": [
+ "acetaldol",
+ "allocated"
+ ],
+ "ceiintz": [
+ "citizen",
+ "zincite"
+ ],
+ "ccorsu": [
+ "crocus",
+ "occurs",
+ "succor"
+ ],
+ "aeimnty": [
+ "amenity",
+ "anytime"
+ ],
+ "eils": [
+ "isle",
+ "leis",
+ "lies",
+ "lise",
+ "sile"
+ ],
+ "alotuy": [
+ "layout",
+ "lutayo",
+ "outlay"
+ ],
+ "bls": [
+ "bls",
+ "lbs"
+ ],
+ "aly": [
+ "aly",
+ "lay"
+ ],
+ "ehorss": [
+ "horses",
+ "shoers",
+ "shores"
+ ],
+ "aenwy": [
+ "wayne",
+ "waney"
+ ],
+ "adenot": [
+ "atoned",
+ "donate"
+ ],
+ "ekorrw": [
+ "rework",
+ "worker"
+ ],
+ "aeilv": [
+ "alive",
+ "avile"
+ ],
+ "eelmpt": [
+ "pelmet",
+ "temple"
+ ],
+ "ginsw": [
+ "swing",
+ "wings"
+ ],
+ "abekrs": [
+ "bakers",
+ "basker",
+ "brakes",
+ "breaks",
+ "kebars"
+ ],
+ "aerstw": [
+ "rawest",
+ "tawers",
+ "waster",
+ "waters"
+ ],
+ "eimoprs": [
+ "imposer",
+ "promise",
+ "semipro"
+ ],
+ "hint": [
+ "hint",
+ "thin"
+ ],
+ "degir": [
+ "dirge",
+ "egrid",
+ "gride",
+ "redig",
+ "ridge"
+ ],
+ "ahirrs": [
+ "arrish",
+ "harris",
+ "rarish",
+ "shirra",
+ "sirrah"
+ ],
+ "aciloprt": [
+ "plicator",
+ "tropical"
+ ],
+ "eersstt": [
+ "retests",
+ "setters",
+ "streets",
+ "tersest",
+ "testers"
+ ],
+ "ceortv": [
+ "corvet",
+ "covert",
+ "vector"
+ ],
+ "beffru": [
+ "buffer",
+ "rebuff"
+ ],
+ "elppru": [
+ "pulper",
+ "purple"
+ ],
+ "def": [
+ "def",
+ "fed"
+ ],
+ "adeiinnosstt": [
+ "destinations",
+ "dissentation"
+ ],
+ "elst": [
+ "lest",
+ "lets",
+ "selt"
+ ],
+ "almtuu": [
+ "mutual",
+ "umlaut"
+ ],
+ "inoprs": [
+ "orpins",
+ "prinos",
+ "prison",
+ "spinor"
+ ],
+ "iklls": [
+ "kills",
+ "skill"
+ ],
+ "achirs": [
+ "chairs",
+ "ischar",
+ "rachis"
+ ],
+ "denrt": [
+ "drent",
+ "trend"
+ ],
+ "aeirrs": [
+ "airers",
+ "ariser",
+ "raiser",
+ "serrai",
+ "sierra"
+ ],
+ "deerst": [
+ "desert",
+ "deters",
+ "rested"
+ ],
+ "delost": [
+ "oldest",
+ "sloted",
+ "stoled"
+ ],
+ "abn": [
+ "abn",
+ "ban",
+ "nab"
+ ],
+ "abdhknoo": [
+ "bandhook",
+ "handbook"
+ ],
+ "aaegintv": [
+ "navigate",
+ "vaginate"
+ ],
+ "eorsw": [
+ "owser",
+ "resow",
+ "serow",
+ "sower",
+ "swore",
+ "worse"
+ ],
+ "immstu": [
+ "mutism",
+ "summit"
+ ],
+ "aep": [
+ "ape",
+ "epa",
+ "pea"
+ ],
+ "acepss": [
+ "scapes",
+ "spaces"
+ ],
+ "aceeps": [
+ "escape",
+ "espace",
+ "peaces"
+ ],
+ "cnoopsu": [
+ "coupons",
+ "soupcon"
+ ],
+ "aciils": [
+ "sialic",
+ "silica"
+ ],
+ "abost": [
+ "basto",
+ "boast",
+ "boats",
+ "botas",
+ "sabot"
+ ],
+ "acegln": [
+ "cangle",
+ "glance"
+ ],
+ "ellst": [
+ "stell",
+ "tells"
+ ],
+ "bdemoors": [
+ "bedrooms",
+ "boredoms"
+ ],
+ "aklst": [
+ "stalk",
+ "talks"
+ ],
+ "ailrst": [
+ "latris",
+ "strail",
+ "strial",
+ "trails",
+ "trials"
+ ],
+ "aemrsst": [
+ "masters",
+ "streams"
+ ],
+ "aabelrt": [
+ "alberta",
+ "latebra",
+ "ratable"
+ ],
+ "gor": [
+ "gor",
+ "gro",
+ "org",
+ "rog"
+ ],
+ "cmmnoos": [
+ "commons",
+ "consomm"
+ ],
+ "adfru": [
+ "faurd",
+ "fraud"
+ ],
+ "cemprstu": [
+ "crumpets",
+ "spectrum"
+ ],
+ "akoy": [
+ "kayo",
+ "oaky",
+ "okay"
+ ],
+ "aehimpss": [
+ "emphasis",
+ "misshape"
+ ],
+ "egorr": [
+ "gorer",
+ "roger"
+ ],
+ "acepst": [
+ "aspect",
+ "epacts"
+ ],
+ "aeemosw": [
+ "awesome",
+ "waesome"
+ ],
+ "cnostu": [
+ "counts",
+ "tucson",
+ "uncost"
+ ],
+ "cdeipr": [
+ "percid",
+ "priced"
+ ],
+ "achrs": [
+ "chars",
+ "crash"
+ ],
+ "filt": [
+ "filt",
+ "flit",
+ "lift"
+ ],
+ "ddeeirs": [
+ "derides",
+ "desired",
+ "resided"
+ ],
+ "einrt": [
+ "inert",
+ "inter",
+ "niter",
+ "nitre",
+ "retin",
+ "trine"
+ ],
+ "celors": [
+ "ceorls",
+ "closer",
+ "cresol",
+ "escrol"
+ ],
+ "ails": [
+ "ails",
+ "lasi",
+ "lias",
+ "lisa",
+ "sail",
+ "sial"
+ ],
+ "ceinprss": [
+ "crispens",
+ "princess"
+ ],
+ "aprsy": [
+ "prays",
+ "raspy",
+ "spary",
+ "spray"
+ ],
+ "deentx": [
+ "dentex",
+ "extend"
+ ],
+ "adors": [
+ "dorsa",
+ "roads",
+ "sarod",
+ "sorda"
+ ],
+ "apt": [
+ "apt",
+ "pat",
+ "pta",
+ "tap"
+ ],
+ "adry": [
+ "adry",
+ "dray",
+ "yard"
+ ],
+ "eeimmors": [
+ "memories",
+ "memorise"
+ ],
+ "aceerst": [
+ "cerates",
+ "creates",
+ "ecartes",
+ "secreta"
+ ],
+ "acefs": [
+ "cafes",
+ "faces"
+ ],
+ "amory": [
+ "mayor",
+ "moray"
+ ],
+ "aens": [
+ "anes",
+ "sane",
+ "sean",
+ "sena"
+ ],
+ "aenorst": [
+ "atoners",
+ "noreast",
+ "orantes",
+ "rosetan",
+ "seatron",
+ "senator",
+ "treason"
+ ],
+ "adegrs": [
+ "degras",
+ "egards",
+ "grades"
+ ],
+ "acnoorst": [
+ "cartoons",
+ "corantos",
+ "ostracon",
+ "socotran"
+ ],
+ "opru": [
+ "pour",
+ "roup"
+ ],
+ "egr": [
+ "erg",
+ "ger",
+ "gre",
+ "reg"
+ ],
+ "dggilno": [
+ "godling",
+ "golding",
+ "lodging"
+ ],
+ "dstu": [
+ "dust",
+ "stud"
+ ],
+ "eeilnrty": [
+ "entirely",
+ "lientery"
+ ],
+ "acdeelpr": [
+ "parceled",
+ "replaced"
+ ],
+ "elosss": [
+ "losses",
+ "sossle"
+ ],
+ "abcmot": [
+ "combat",
+ "tombac"
+ ],
+ "aekls": [
+ "alkes",
+ "kales",
+ "lakes",
+ "leaks",
+ "sakel",
+ "slake"
+ ],
+ "adinnoost": [
+ "anisodont",
+ "donations",
+ "sondation"
+ ],
+ "adiry": [
+ "dairy",
+ "diary",
+ "yaird"
+ ],
+ "gikns": [
+ "ginks",
+ "kings"
+ ],
+ "ghinoost": [
+ "shooting",
+ "soothing"
+ ],
+ "eknt": [
+ "kent",
+ "knet"
+ ],
+ "adds": [
+ "adds",
+ "dads"
+ ],
+ "aceeinorstvv": [
+ "conservative",
+ "conversative"
+ ],
+ "chkos": [
+ "hocks",
+ "shock"
+ ],
+ "aabdor": [
+ "aboard",
+ "aborad",
+ "abroad"
+ ],
+ "benoy": [
+ "boney",
+ "ebony"
+ ],
+ "ain": [
+ "ain",
+ "ani",
+ "ian"
+ ],
+ "aeehmoprst": [
+ "atmosphere",
+ "shapometer"
+ ],
+ "ikss": [
+ "kiss",
+ "skis"
+ ],
+ "abest": [
+ "abets",
+ "baste",
+ "bates",
+ "beast",
+ "beats",
+ "betas",
+ "estab",
+ "sebat",
+ "tabes"
+ ],
+ "aegrstt": [
+ "tagster",
+ "targets"
+ ],
+ "celnosu": [
+ "counsel",
+ "unclose"
+ ],
+ "adrsy": [
+ "drays",
+ "dryas",
+ "yards"
+ ],
+ "dgnoor": [
+ "drongo",
+ "gordon"
+ ],
+ "dmo": [
+ "dom",
+ "mod"
+ ],
+ "aefmrrs": [
+ "farmers",
+ "framers"
+ ],
+ "eeiqrsu": [
+ "esquire",
+ "queries",
+ "risquee"
+ ],
+ "hrsu": [
+ "rhus",
+ "rush"
+ ],
+ "celrstu": [
+ "cluster",
+ "custrel",
+ "cutlers",
+ "relucts"
+ ],
+ "eerssv": [
+ "serves",
+ "severs",
+ "sevres",
+ "verses"
+ ],
+ "eiprrssu": [
+ "spurries",
+ "surprise",
+ "uprisers"
+ ],
+ "aailprt": [
+ "partial",
+ "patrial"
+ ],
+ "celopsu": [
+ "closeup",
+ "couples",
+ "culpose",
+ "opuscle",
+ "ploceus",
+ "upclose"
+ ],
+ "agiknnr": [
+ "narking",
+ "ranking"
+ ],
+ "cst": [
+ "cst",
+ "cts",
+ "sct"
+ ],
+ "ceo": [
+ "coe",
+ "eco"
+ ],
+ "aacelp": [
+ "aplace",
+ "palace"
+ ],
+ "beglo": [
+ "bogle",
+ "globe"
+ ],
+ "ackr": [
+ "cark",
+ "rack"
+ ],
+ "acdeiimnot": [
+ "decimation",
+ "medication"
+ ],
+ "aeehorsuw": [
+ "housewear",
+ "warehouse"
+ ],
+ "ceeiprt": [
+ "ereptic",
+ "precite",
+ "receipt"
+ ],
+ "ghost": [
+ "ghost",
+ "goths"
+ ],
+ "boss": [
+ "boss",
+ "sobs"
+ ],
+ "deipr": [
+ "pride",
+ "pried",
+ "redip",
+ "riped"
+ ],
+ "ehikt": [
+ "keith",
+ "kithe"
+ ],
+ "adiln": [
+ "danli",
+ "ladin",
+ "linda",
+ "nidal"
+ ],
+ "cehil": [
+ "chiel",
+ "chile"
+ ],
+ "aann": [
+ "anan",
+ "anna",
+ "nana"
+ ],
+ "elnpty": [
+ "pentyl",
+ "plenty"
+ ],
+ "loos": [
+ "loos",
+ "oslo",
+ "sloo",
+ "solo",
+ "sool"
+ ],
+ "ahortt": [
+ "athort",
+ "throat"
+ ],
+ "eirstw": [
+ "twiers",
+ "wister",
+ "wriest",
+ "writes"
+ ],
+ "adps": [
+ "daps",
+ "pads",
+ "spad"
+ ],
+ "eqstu": [
+ "quest",
+ "squet"
+ ],
+ "ceeginnrs": [
+ "screening",
+ "secerning"
+ ],
+ "anrst": [
+ "rants",
+ "starn",
+ "tarns",
+ "trans"
+ ],
+ "eeinopr": [
+ "pereion",
+ "peronei",
+ "pioneer"
+ ],
+ "aabcort": [
+ "abactor",
+ "acrobat"
+ ],
+ "aelpst": [
+ "palest",
+ "palets",
+ "pastel",
+ "petals",
+ "plates",
+ "pleats",
+ "septal",
+ "staple",
+ "tepals"
+ ],
+ "acers": [
+ "acres",
+ "arces",
+ "cares",
+ "carse",
+ "caser",
+ "ceras",
+ "cesar",
+ "escar",
+ "races",
+ "sacre",
+ "scare",
+ "scrae",
+ "serac"
+ ],
+ "acehiltt": [
+ "athletic",
+ "thetical"
+ ],
+ "egillnt": [
+ "gillnet",
+ "telling"
+ ],
+ "aaclost": [
+ "catalos",
+ "coastal",
+ "salacot"
+ ],
+ "demos": [
+ "demos",
+ "domes",
+ "modes"
+ ],
+ "aekw": [
+ "wake",
+ "weak",
+ "weka"
+ ],
+ "aghnruy": [
+ "ahungry",
+ "hungary"
+ ],
+ "aeelrrtv": [
+ "retravel",
+ "revertal",
+ "traveler"
+ ],
+ "aln": [
+ "aln",
+ "lan"
+ ],
+ "eemny": [
+ "enemy",
+ "yemen"
+ ],
+ "giinrs": [
+ "rising",
+ "siring"
+ ],
+ "ellsw": [
+ "swell",
+ "wells"
+ ],
+ "ghiinst": [
+ "histing",
+ "insight"
+ ],
+ "cdeeirrstt": [
+ "derestrict",
+ "restricted"
+ ],
+ "ceersst": [
+ "cresset",
+ "resects",
+ "secrets"
+ ],
+ "aelrtt": [
+ "artlet",
+ "latter",
+ "rattel",
+ "rattle",
+ "talter",
+ "tartle",
+ "tatler"
+ ],
+ "acehmnrst": [
+ "merchants",
+ "starchmen"
+ ],
+ "aeilrrst": [
+ "retrials",
+ "trailers"
+ ],
+ "aeeprt": [
+ "petrea",
+ "repeat",
+ "retape"
+ ],
+ "aelnpty": [
+ "aplenty",
+ "penalty"
+ ],
+ "aeglsss": [
+ "gasless",
+ "glasses",
+ "sagless"
+ ],
+ "abeelns": [
+ "baleens",
+ "enables"
+ ],
+ "cen": [
+ "cen",
+ "enc"
+ ],
+ "bdeilru": [
+ "builder",
+ "rebuild"
+ ],
+ "errty": [
+ "retry",
+ "terry"
+ ],
+ "aegmnrstu": [
+ "argentums",
+ "arguments",
+ "mustanger"
+ ],
+ "aaenr": [
+ "anear",
+ "arean",
+ "arena"
+ ],
+ "ilppsu": [
+ "pupils",
+ "slipup",
+ "upslip"
+ ],
+ "aersttw": [
+ "stewart",
+ "swatter"
+ ],
+ "abst": [
+ "bast",
+ "bats",
+ "stab",
+ "tabs"
+ ],
+ "aaclsu": [
+ "ascula",
+ "calusa",
+ "casual",
+ "casula",
+ "causal"
+ ],
+ "hilops": [
+ "philos",
+ "polish"
+ ],
+ "ellovy": [
+ "lovely",
+ "volley"
+ ],
+ "aerstx": [
+ "extras",
+ "sextar",
+ "taxers"
+ ],
+ "acelsu": [
+ "caelus",
+ "casule",
+ "caules",
+ "clause"
+ ],
+ "einp": [
+ "pein",
+ "pien",
+ "pine"
+ ],
+ "cgilnoo": [
+ "cooling",
+ "locoing"
+ ],
+ "dent": [
+ "dent",
+ "detn",
+ "tend"
+ ],
+ "ckrstu": [
+ "struck",
+ "trucks"
+ ],
+ "cdeiorv": [
+ "cervoid",
+ "divorce"
+ ],
+ "aalru": [
+ "aural",
+ "laura"
+ ],
+ "ehopprs": [
+ "hoppers",
+ "shopper"
+ ],
+ "kooty": [
+ "kyoto",
+ "tokyo"
+ ],
+ "alprty": [
+ "paltry",
+ "partly",
+ "raptly"
+ ],
+ "acdny": [
+ "candy",
+ "dancy"
+ ],
+ "illps": [
+ "pills",
+ "spill"
+ ],
+ "egirt": [
+ "greit",
+ "tiger",
+ "tigre"
+ ],
+ "enorss": [
+ "senors",
+ "sensor",
+ "snores"
+ ],
+ "aeglns": [
+ "angels",
+ "angles",
+ "gansel",
+ "gleans"
+ ],
+ "acdiinorst": [
+ "ancistroid",
+ "indicators"
+ ],
+ "adeels": [
+ "leased",
+ "sealed"
+ ],
+ "ahit": [
+ "aith",
+ "hait",
+ "hati",
+ "thai"
+ ],
+ "defr": [
+ "derf",
+ "ferd",
+ "fred"
+ ],
+ "acilmnopt": [
+ "complaint",
+ "compliant"
+ ],
+ "ceenss": [
+ "censes",
+ "scenes"
+ ],
+ "almor": [
+ "molar",
+ "moral",
+ "romal"
+ ],
+ "adu": [
+ "aud",
+ "dau"
+ ],
+ "efginr": [
+ "finger",
+ "fringe"
+ ],
+ "eekps": [
+ "keeps",
+ "peeks",
+ "pekes"
+ ],
+ "acelot": [
+ "acetol",
+ "colate",
+ "locate"
+ ],
+ "adeinrt": [
+ "andrite",
+ "antired",
+ "detrain",
+ "diantre",
+ "radient",
+ "randite",
+ "trained"
+ ],
+ "eorss": [
+ "roses",
+ "sores"
+ ],
+ "abls": [
+ "albs",
+ "bals",
+ "blas",
+ "labs",
+ "slab"
+ ],
+ "abder": [
+ "ardeb",
+ "barde",
+ "bared",
+ "beard",
+ "bread",
+ "debar"
+ ],
+ "denoow": [
+ "enwood",
+ "wooden"
+ ],
+ "ghotu": [
+ "ought",
+ "tough"
+ ],
+ "eil": [
+ "eli",
+ "ile",
+ "lei",
+ "lie"
+ ],
+ "cehst": [
+ "chest",
+ "stech"
+ ],
+ "einnops": [
+ "pension",
+ "pinones"
+ ],
+ "eeenrsuv": [
+ "revenues",
+ "unreeves",
+ "unsevere"
+ ],
+ "acgir": [
+ "agric",
+ "cigar",
+ "craig"
+ ],
+ "eefhlrs": [
+ "flesher",
+ "herself"
+ ],
+ "ceiinoprs": [
+ "coinspire",
+ "precision"
+ ],
+ "eeerrssv": [
+ "reserves",
+ "reverses",
+ "severers"
+ ],
+ "elosv": [
+ "loves",
+ "solve",
+ "voles"
+ ],
+ "horsst": [
+ "horsts",
+ "shorts"
+ ],
+ "cdeinooprrtu": [
+ "proreduction",
+ "reproduction"
+ ],
+ "deegiinnrst": [
+ "ingredients",
+ "tenderising"
+ ],
+ "cdeeorrr": [
+ "recorder",
+ "rerecord"
+ ],
+ "acnny": [
+ "canny",
+ "nancy"
+ ],
+ "acly": [
+ "acyl",
+ "clay",
+ "lacy"
+ ],
+ "acehpst": [
+ "hepcats",
+ "patches"
+ ],
+ "defnru": [
+ "funder",
+ "refund"
+ ],
+ "nostw": [
+ "nowts",
+ "towns",
+ "wonts"
+ ],
+ "ceeinoprt": [
+ "prenotice",
+ "reception"
+ ],
+ "aeilms": [
+ "amiles",
+ "asmile",
+ "mailes",
+ "mesail",
+ "mesial",
+ "samiel"
+ ],
+ "cprsuy": [
+ "cyprus",
+ "sprucy"
+ ],
+ "ddos": [
+ "dods",
+ "odds"
+ ],
+ "deiinrs": [
+ "insider",
+ "siderin"
+ ],
+ "aeimnrss": [
+ "arsenism",
+ "seminars"
+ ],
+ "aekmrs": [
+ "makers",
+ "masker",
+ "remask"
+ ],
+ "aehrst": [
+ "earths",
+ "haster",
+ "haters",
+ "hearst",
+ "hearts"
+ ],
+ "eev": [
+ "eve",
+ "vee"
+ ],
+ "acerrt": [
+ "arrect",
+ "carter",
+ "crater",
+ "recart",
+ "tracer"
+ ],
+ "acmr": [
+ "cram",
+ "marc"
+ ],
+ "adeelps": [
+ "delapse",
+ "elapsed",
+ "pleased",
+ "sepaled"
+ ],
+ "deilwy": [
+ "dewily",
+ "widely",
+ "wieldy"
+ ],
+ "aehprs": [
+ "phaser",
+ "phrase",
+ "raphes",
+ "seraph",
+ "shaper",
+ "sherpa",
+ "shrape"
+ ],
+ "eeginnu": [
+ "genuine",
+ "ingenue"
+ ],
+ "agiinrs": [
+ "airings",
+ "arising",
+ "raising"
+ ],
+ "aadeiprs": [
+ "paradise",
+ "sparidae"
+ ],
+ "aders": [
+ "dares",
+ "dears",
+ "rased",
+ "reads"
+ ],
+ "elors": [
+ "lores",
+ "loser",
+ "orles",
+ "orsel",
+ "roles",
+ "rosel",
+ "soler",
+ "sorel"
+ ],
+ "aefl": [
+ "alef",
+ "feal",
+ "flea",
+ "leaf"
+ ],
+ "deeils": [
+ "delies",
+ "diesel",
+ "ediles",
+ "elides",
+ "sedile",
+ "seidel"
+ ],
+ "erssuv": [
+ "servus",
+ "versus"
+ ],
+ "dor": [
+ "dor",
+ "ord",
+ "rod"
+ ],
+ "adisu": [
+ "saudi",
+ "udasi"
+ ],
+ "hrs": [
+ "hrs",
+ "shr"
+ ],
+ "ikls": [
+ "ilks",
+ "lisk",
+ "silk",
+ "skil",
+ "slik"
+ ],
+ "aeknr": [
+ "anker",
+ "karen",
+ "kearn",
+ "naker",
+ "nerka"
+ ],
+ "cdeilmop": [
+ "compiled",
+ "complied"
+ ],
+ "acimnort": [
+ "macrotin",
+ "romantic"
+ ],
+ "adeeelrv": [
+ "laveered",
+ "revealed"
+ ],
+ "abelrt": [
+ "albert",
+ "balter",
+ "batler",
+ "labret",
+ "tabler",
+ "tarble"
+ ],
+ "bilorst": [
+ "bristol",
+ "strobil"
+ ],
+ "acl": [
+ "alc",
+ "cal",
+ "lac",
+ "lca"
+ ],
+ "inooprst": [
+ "notropis",
+ "portions",
+ "positron",
+ "sorption"
+ ],
+ "ceorsst": [
+ "corsets",
+ "costers",
+ "escorts",
+ "scoters",
+ "sectors"
+ ],
+ "aelmsu": [
+ "amelus",
+ "samuel",
+ "ulemas"
+ ],
+ "fist": [
+ "fist",
+ "fits",
+ "sift"
+ ],
+ "adegrrs": [
+ "graders",
+ "regards"
+ ],
+ "hrtu": [
+ "hurt",
+ "ruth",
+ "thru"
+ ],
+ "acehimnry": [
+ "hemicrany",
+ "machinery"
+ ],
+ "gim": [
+ "gim",
+ "mig"
+ ],
+ "aenrrw": [
+ "rewarn",
+ "warner",
+ "warren"
+ ],
+ "ilps": [
+ "lips",
+ "lisp",
+ "slip"
+ ],
+ "ddeistu": [
+ "studdie",
+ "studied"
+ ],
+ "aeimr": [
+ "aimer",
+ "amire",
+ "maire",
+ "marie",
+ "ramie"
+ ],
+ "cstu": [
+ "cust",
+ "cuts",
+ "scut"
+ ],
+ "aeflnru": [
+ "earnful",
+ "flaneur",
+ "frenula",
+ "funeral",
+ "furlane"
+ ],
+ "aeginrrs": [
+ "earrings",
+ "grainers"
+ ],
+ "acehprst": [
+ "chapters",
+ "patchers"
+ ],
+ "deinns": [
+ "dennis",
+ "sinned"
+ ],
+ "aagmn": [
+ "amang",
+ "ganam",
+ "magna",
+ "manga"
+ ],
+ "cdeinot": [
+ "condite",
+ "ctenoid",
+ "deontic",
+ "noticed"
+ ],
+ "aeilrrty": [
+ "literary",
+ "trailery"
+ ],
+ "agilnss": [
+ "glassin",
+ "signals"
+ ],
+ "acps": [
+ "caps",
+ "pacs",
+ "scap"
+ ],
+ "alt": [
+ "alt",
+ "lat",
+ "tal"
+ ],
+ "aaglno": [
+ "agonal",
+ "analog",
+ "angola"
+ ],
+ "aacfil": [
+ "cafila",
+ "facial"
+ ],
+ "aelntt": [
+ "latent",
+ "latten",
+ "nattle",
+ "talent",
+ "tantle"
+ ],
+ "eeekrs": [
+ "kreese",
+ "reseek",
+ "seeker",
+ "sekere"
+ ],
+ "hoost": [
+ "hoots",
+ "shoot",
+ "sooth",
+ "sotho",
+ "toosh"
+ ],
+ "effost": [
+ "offset",
+ "setoff"
+ ],
+ "eeilt": [
+ "elite",
+ "telei"
+ ],
+ "inps": [
+ "insp",
+ "nips",
+ "pins",
+ "snip",
+ "spin"
+ ],
+ "dehissw": [
+ "swedish",
+ "swished"
+ ],
+ "emops": [
+ "epsom",
+ "mopes",
+ "poems",
+ "pomes"
+ ],
+ "boort": [
+ "boort",
+ "robot"
+ ],
+ "einsstw": [
+ "wisents",
+ "witness"
+ ],
+ "aegsst": [
+ "sagest",
+ "stages"
+ ],
+ "deoprw": [
+ "powder",
+ "prowed"
+ ],
+ "aessss": [
+ "assess",
+ "sasses"
+ ],
+ "ahsw": [
+ "haws",
+ "shaw",
+ "shwa",
+ "wash"
+ ],
+ "enosst": [
+ "onsets",
+ "seston",
+ "setons",
+ "stenos",
+ "stones"
+ ],
+ "aceennrt": [
+ "centenar",
+ "entrance"
+ ],
+ "egmno": [
+ "emong",
+ "genom",
+ "gnome"
+ ],
+ "oorst": [
+ "roost",
+ "roots",
+ "rotos",
+ "toros",
+ "torso"
+ ],
+ "aacdeilnort": [
+ "declaration",
+ "redactional"
+ ],
+ "gilnos": [
+ "logins",
+ "losing",
+ "soling"
+ ],
+ "adeggst": [
+ "gadgets",
+ "stagged"
+ ],
+ "belno": [
+ "nobel",
+ "noble"
+ ],
+ "erv": [
+ "rev",
+ "ver"
+ ],
+ "eglops": [
+ "gospel",
+ "spogel"
+ ],
+ "eloos": [
+ "loose",
+ "oleos"
+ ],
+ "aims": [
+ "aims",
+ "amis",
+ "mias",
+ "saim",
+ "siam",
+ "sima"
+ ],
+ "ceeiinprt": [
+ "princeite",
+ "recipient"
+ ],
+ "giiklnn": [
+ "inkling",
+ "kilning",
+ "linking"
+ ],
+ "adeenr": [
+ "deaner",
+ "earned",
+ "endear",
+ "neared"
+ ],
+ "aciilms": [
+ "islamic",
+ "laicism",
+ "silicam"
+ ],
+ "acehilstt": [
+ "athletics",
+ "statelich"
+ ],
+ "aekprr": [
+ "parker",
+ "repark"
+ ],
+ "copr": [
+ "copr",
+ "corp",
+ "crop",
+ "porc",
+ "proc"
+ ],
+ "aops": [
+ "asop",
+ "paso",
+ "sapo",
+ "soap"
+ ],
+ "eilprt": [
+ "pretil",
+ "tripel",
+ "triple"
+ ],
+ "cdeersu": [
+ "descure",
+ "recused",
+ "reduces",
+ "rescued",
+ "secured",
+ "seducer"
+ ],
+ "einortu": [
+ "routine",
+ "tueiron"
+ ],
+ "aabcillsy": [
+ "asyllabic",
+ "basically"
+ ],
+ "ckors": [
+ "corks",
+ "rocks"
+ ],
+ "ainstt": [
+ "astint",
+ "taints",
+ "tanist",
+ "titans"
+ ],
+ "ghostu": [
+ "oughts",
+ "sought",
+ "toughs"
+ ],
+ "demnotu": [
+ "demount",
+ "mounted"
+ ],
+ "aabhitt": [
+ "habitat",
+ "tabitha"
+ ],
+ "adeimn": [
+ "aidmen",
+ "daimen",
+ "damine",
+ "demain",
+ "dimane",
+ "maiden",
+ "median",
+ "medina"
+ ],
+ "gnsu": [
+ "gnus",
+ "guns",
+ "snug",
+ "sung"
+ ],
+ "acennrs": [
+ "canners",
+ "scanner"
+ ],
+ "eehinr": [
+ "herein",
+ "inhere"
+ ],
+ "aadeimnt": [
+ "aminated",
+ "animated",
+ "diamante",
+ "mandaite",
+ "mantidae"
+ ],
+ "ior": [
+ "rio",
+ "roi"
+ ],
+ "ehor": [
+ "hero",
+ "hoer",
+ "hore",
+ "rheo"
+ ],
+ "eeginrt": [
+ "giterne",
+ "integer",
+ "retinge",
+ "treeing"
+ ],
+ "abcehlor": [
+ "bachelor",
+ "crabhole",
+ "lochaber"
+ ],
+ "afgilln": [
+ "falling",
+ "fingall"
+ ],
+ "aceprt": [
+ "carpet",
+ "peract",
+ "preact"
+ ],
+ "eelnss": [
+ "lenses",
+ "lessen"
+ ],
+ "abinry": [
+ "binary",
+ "brainy"
+ ],
+ "addeentt": [
+ "attended",
+ "dentated"
+ ],
+ "aciilnoot": [
+ "coalition",
+ "coitional",
+ "lociation"
+ ],
+ "aelrtw": [
+ "lawter",
+ "walter"
+ ],
+ "aegw": [
+ "waeg",
+ "wage",
+ "wega"
+ ],
+ "aalst": [
+ "atlas",
+ "salat",
+ "salta",
+ "talas"
+ ],
+ "adnw": [
+ "dawn",
+ "wand"
+ ],
+ "eefls": [
+ "feels",
+ "flees"
+ ],
+ "eorrttu": [
+ "torture",
+ "trouter",
+ "tutorer"
+ ],
+ "aclr": [
+ "carl",
+ "clar"
+ ],
+ "acot": [
+ "coat",
+ "taco"
+ ],
+ "mrs": [
+ "mrs",
+ "rms"
+ ],
+ "aceinnort": [
+ "connarite",
+ "container",
+ "cotarnine",
+ "crenation",
+ "narcotine"
+ ],
+ "app": [
+ "app",
+ "pap",
+ "ppa"
+ ],
+ "eioprrssuv": [
+ "proviruses",
+ "supervisor"
+ ],
+ "coprs": [
+ "corps",
+ "crops"
+ ],
+ "acorst": [
+ "actors",
+ "arctos",
+ "castor",
+ "castro",
+ "costar",
+ "ostrca",
+ "scrota",
+ "tarocs"
+ ],
+ "eilrv": [
+ "ervil",
+ "levir",
+ "liver",
+ "livre",
+ "rivel",
+ "viler"
+ ],
+ "abeill": [
+ "alible",
+ "belial",
+ "labile",
+ "liable"
+ ],
+ "acellr": [
+ "caller",
+ "cellar",
+ "recall"
+ ],
+ "ademssu": [
+ "assumed",
+ "medusas"
+ ],
+ "adeeprrtu": [
+ "apertured",
+ "departure"
+ ],
+ "beefil": [
+ "befile",
+ "belief"
+ ],
+ "dehlorsu": [
+ "shoulder",
+ "shoulerd"
+ ],
+ "cdeor": [
+ "coder",
+ "cored",
+ "credo",
+ "decor"
+ ],
+ "kloopu": [
+ "lookup",
+ "uplook"
+ ],
+ "ory": [
+ "yor",
+ "ory",
+ "roy"
+ ],
+ "ino": [
+ "ino",
+ "ion",
+ "oni"
+ ],
+ "adeeimrt": [
+ "diameter",
+ "diatreme"
+ ],
+ "eefinr": [
+ "enfire",
+ "ferine",
+ "fineer",
+ "infree",
+ "refine"
+ ],
+ "bddeir": [
+ "bedrid",
+ "bidder",
+ "birded"
+ ],
+ "eginrs": [
+ "reigns",
+ "renigs",
+ "resign",
+ "resing",
+ "sering",
+ "signer",
+ "singer"
+ ],
+ "aensv": [
+ "avens",
+ "evans",
+ "naves",
+ "vanes"
+ ],
+ "adehlr": [
+ "hareld",
+ "harled",
+ "herald"
+ ],
+ "afils": [
+ "alifs",
+ "fails"
+ ],
+ "eikn": [
+ "enki",
+ "kine",
+ "nike"
+ ],
+ "eeiinnnorttv": [
+ "intervention",
+ "introvenient"
+ ],
+ "gilnpu": [
+ "gulpin",
+ "puling"
+ ],
+ "aacinorttt": [
+ "attraction",
+ "tractation"
+ ],
+ "acdfiiimnoot": [
+ "domification",
+ "modification"
+ ],
+ "aceil": [
+ "alice",
+ "celia",
+ "elaic",
+ "ileac"
+ ],
+ "aailnst": [
+ "lanista",
+ "saliant",
+ "santali"
+ ],
+ "deer": [
+ "deer",
+ "dere",
+ "dree",
+ "rede",
+ "reed"
+ ],
+ "ceim": [
+ "emic",
+ "mice"
+ ],
+ "adilpry": [
+ "pyralid",
+ "rapidly"
+ ],
+ "empt": [
+ "empt",
+ "temp"
+ ],
+ "inort": [
+ "intro",
+ "iortn",
+ "nitro",
+ "norit"
+ ],
+ "aacenrssu": [
+ "anacruses",
+ "assurance"
+ ],
+ "astv": [
+ "tavs",
+ "vast",
+ "vats"
+ ],
+ "eilnotu": [
+ "elution",
+ "outline"
+ ],
+ "aejns": [
+ "janes",
+ "jeans"
+ ],
+ "acefiiinortv": [
+ "revification",
+ "verification"
+ ],
+ "ddo": [
+ "dod",
+ "odd"
+ ],
+ "aprw": [
+ "warp",
+ "wrap"
+ ],
+ "eefrrs": [
+ "freers",
+ "freres",
+ "refers"
+ ],
+ "dmoo": [
+ "doom",
+ "modo",
+ "mood"
+ ],
+ "agims": [
+ "agism",
+ "sigma"
+ ],
+ "addemns": [
+ "demands",
+ "maddens"
+ ],
+ "eegilnps": [
+ "peelings",
+ "sleeping",
+ "speeling"
+ ],
+ "etx": [
+ "ext",
+ "tex"
+ ],
+ "abem": [
+ "ambe",
+ "beam",
+ "bema"
+ ],
+ "adegginnr": [
+ "dangering",
+ "deranging",
+ "gandering",
+ "gardening"
+ ],
+ "aeirrv": [
+ "arrive",
+ "varier"
+ ],
+ "acehorrst": [
+ "carthorse",
+ "horsecart",
+ "orchestra"
+ ],
+ "ensstu": [
+ "sunset",
+ "unsets"
+ ],
+ "eemoorrv": [
+ "moreover",
+ "overmore"
+ ],
+ "adefmr": [
+ "farmed",
+ "framed"
+ ],
+ "aacillnoot": [
+ "allocation",
+ "locational"
+ ],
+ "aessy": [
+ "eyass",
+ "essay"
+ ],
+ "acmps": [
+ "camps",
+ "scamp"
+ ],
+ "acert": [
+ "caret",
+ "carte",
+ "cater",
+ "cerat",
+ "crate",
+ "creat",
+ "creta",
+ "ecart",
+ "react",
+ "recta",
+ "trace"
+ ],
+ "ackps": [
+ "packs",
+ "spack"
+ ],
+ "aaimnor": [
+ "amanori",
+ "moarian"
+ ],
+ "hotu": [
+ "hout",
+ "thou"
+ ],
+ "aeglrty": [
+ "greatly",
+ "regalty"
+ ],
+ "akms": [
+ "kasm",
+ "mask"
+ ],
+ "aeghhoopprrt": [
+ "photographer",
+ "rephotograph"
+ ],
+ "fimnor": [
+ "formin",
+ "inform"
+ ],
+ "aclo": [
+ "alco",
+ "coal",
+ "cola",
+ "loca"
+ ],
+ "aeggimnss": [
+ "gigmaness",
+ "messaging"
+ ],
+ "einntt": [
+ "intent",
+ "nitent",
+ "tinnet"
+ ],
+ "aaelnpst": [
+ "platanes",
+ "pleasant"
+ ],
+ "ekops": [
+ "pokes",
+ "spoke"
+ ],
+ "agilmnps": [
+ "psalming",
+ "sampling"
+ ],
+ "deirw": [
+ "weird",
+ "wider",
+ "wierd",
+ "wired",
+ "wride",
+ "wried"
+ ],
+ "ilno": [
+ "lino",
+ "lion",
+ "loin",
+ "noil"
+ ],
+ "ehlos": [
+ "holes",
+ "hosel",
+ "sheol",
+ "shole"
+ ],
+ "abdel": [
+ "baled",
+ "blade"
+ ],
+ "aelms": [
+ "almes",
+ "amsel",
+ "lames",
+ "males",
+ "meals",
+ "melas",
+ "mesal",
+ "salem",
+ "samel"
+ ],
+ "acnnoy": [
+ "ancony",
+ "canyon"
+ ],
+ "goot": [
+ "goto",
+ "togo"
+ ],
+ "eemrst": [
+ "merest",
+ "mester",
+ "meters",
+ "metres",
+ "restem",
+ "retems",
+ "temser",
+ "termes"
+ ],
+ "eelmry": [
+ "yelmer",
+ "merely"
+ ],
+ "eimprst": [
+ "imprest",
+ "permits"
+ ],
+ "ilmmsu": [
+ "mulism",
+ "muslim"
+ ],
+ "eeelsv": [
+ "levees",
+ "sleeve"
+ ],
+ "aceelnr": [
+ "cleaner",
+ "enclear",
+ "reclean",
+ "relance"
+ ],
+ "beef": [
+ "beef",
+ "feeb"
+ ],
+ "deefgin": [
+ "feeding",
+ "feigned"
+ ],
+ "ekorst": [
+ "stoker",
+ "stroke",
+ "trokes"
+ ],
+ "aegimnrsu": [
+ "geraniums",
+ "measuring"
+ ],
+ "acd": [
+ "adc",
+ "cad",
+ "dca"
+ ],
+ "ahst": [
+ "hast",
+ "hats",
+ "shat",
+ "tash"
+ ],
+ "binor": [
+ "biron",
+ "inorb",
+ "robin"
+ ],
+ "ahnors": [
+ "rhason",
+ "sharon",
+ "shoran"
+ ],
+ "cpt": [
+ "cpt",
+ "pct"
+ ],
+ "frsu": [
+ "furs",
+ "surf"
+ ],
+ "adeeimnr": [
+ "adermine",
+ "remained"
+ ],
+ "dir": [
+ "dir",
+ "rid"
+ ],
+ "aeiilrs": [
+ "alisier",
+ "israeli",
+ "resilia"
+ ],
+ "cdor": [
+ "cord",
+ "dcor"
+ ],
+ "alv": [
+ "lav",
+ "val"
+ ],
+ "efhls": [
+ "flesh",
+ "shelf"
+ ],
+ "giimnt": [
+ "miting",
+ "timing"
+ ],
+ "aeginnprt": [
+ "enrapting",
+ "parenting"
+ ],
+ "foost": [
+ "foots",
+ "sfoot",
+ "stoof"
+ ],
+ "adehst": [
+ "deaths",
+ "hasted",
+ "sdeath"
+ ],
+ "aaiknrt": [
+ "katrina",
+ "tarkani"
+ ],
+ "ailms": [
+ "islam",
+ "ismal",
+ "limas",
+ "mails",
+ "salmi",
+ "simal"
+ ],
+ "denos": [
+ "doesn",
+ "nodes",
+ "nosed",
+ "sonde"
+ ],
+ "deess": [
+ "deess",
+ "essed",
+ "seeds"
+ ],
+ "cdeit": [
+ "cetid",
+ "cited",
+ "edict"
+ ],
+ "eilt": [
+ "itel",
+ "lite",
+ "teil",
+ "teli",
+ "tile"
+ ],
+ "defnoru": [
+ "founder",
+ "refound",
+ "underfo"
+ ],
+ "adeersv": [
+ "adverse",
+ "evaders"
+ ],
+ "egn": [
+ "eng",
+ "gen",
+ "neg"
+ ],
+ "acdeghirs": [
+ "discharge",
+ "scraighed"
+ ],
+ "nost": [
+ "nots",
+ "snot",
+ "tons"
+ ],
+ "aclor": [
+ "alcor",
+ "calor",
+ "carlo",
+ "carol",
+ "claro",
+ "coral"
+ ],
+ "ehnost": [
+ "ethnos",
+ "honest"
+ ],
+ "ackst": [
+ "stack",
+ "tacks"
+ ],
+ "aeehorssuw": [
+ "housewares",
+ "warehouses"
+ ],
+ "aeinrsstt": [
+ "resistant",
+ "straitens"
+ ],
+ "aghn": [
+ "ghan",
+ "hang"
+ ],
+ "aceorrt": [
+ "acroter",
+ "creator",
+ "reactor"
+ ],
+ "abemr": [
+ "amber",
+ "bearm",
+ "bemar",
+ "brame",
+ "bream",
+ "embar"
+ ],
+ "acekrrt": [
+ "retrack",
+ "tracker"
+ ],
+ "eeiprr": [
+ "perrie",
+ "pierre"
+ ],
+ "adeehst": [
+ "headset",
+ "sethead"
+ ],
+ "acelm": [
+ "camel",
+ "clame",
+ "cleam",
+ "macle"
+ ],
+ "almps": [
+ "lamps",
+ "palms",
+ "plasm",
+ "psalm",
+ "slamp"
+ ],
+ "degilnnruy": [
+ "enduringly",
+ "underlying"
+ ],
+ "chi": [
+ "chi",
+ "hic",
+ "ich"
+ ],
+ "acehs": [
+ "aches",
+ "chase"
+ ],
+ "ceorstuy": [
+ "cosurety",
+ "courtesy"
+ ],
+ "aehnst": [
+ "athens",
+ "hasten",
+ "snathe",
+ "sneath",
+ "thanes"
+ ],
+ "eos": [
+ "eos",
+ "oes",
+ "ose",
+ "soe"
+ ],
+ "deeirrt": [
+ "retired",
+ "retried",
+ "tireder"
+ ],
+ "ips": [
+ "ips",
+ "pis",
+ "psi",
+ "sip"
+ ],
+ "aekmrrs": [
+ "markers",
+ "remarks"
+ ],
+ "aceesstt": [
+ "casettes",
+ "cassette"
+ ],
+ "acginsu": [
+ "causing",
+ "saucing"
+ ],
+ "aeilmnr": [
+ "lairmen",
+ "manlier",
+ "marline",
+ "mineral",
+ "railmen",
+ "ramline"
+ ],
+ "bruy": [
+ "bury",
+ "ruby"
+ ],
+ "eeginrst": [
+ "energist",
+ "gentries",
+ "ingester",
+ "integers",
+ "reesting",
+ "steering"
+ ],
+ "ahiprs": [
+ "parish",
+ "raphis",
+ "rhapis"
+ ],
+ "ceenrss": [
+ "censers",
+ "screens",
+ "secerns"
+ ],
+ "flosw": [
+ "flows",
+ "fowls",
+ "wolfs"
+ ],
+ "adimstu": [
+ "dumaist",
+ "stadium"
+ ],
+ "imns": [
+ "mins",
+ "nims"
+ ],
+ "cnoopu": [
+ "coupon",
+ "uncoop"
+ ],
+ "emst": [
+ "mest",
+ "mets",
+ "stem"
+ ],
+ "addersw": [
+ "edwards",
+ "swadder",
+ "swarded",
+ "wadders"
+ ],
+ "aaelnrstt": [
+ "alterants",
+ "tarletans",
+ "translate"
+ ],
+ "adeggt": [
+ "gadget",
+ "tagged"
+ ],
+ "deotv": [
+ "devot",
+ "voted"
+ ],
+ "eikllr": [
+ "killer",
+ "rekill"
+ ],
+ "beiks": [
+ "bikes",
+ "kibes"
+ ],
+ "entu": [
+ "neut",
+ "tune"
+ ],
+ "adehps": [
+ "hasped",
+ "pashed",
+ "phased",
+ "shaped"
+ ],
+ "aefmrr": [
+ "farmer",
+ "framer"
+ ],
+ "cenorstu": [
+ "construe",
+ "counters",
+ "recounts",
+ "trounces"
+ ],
+ "pstu": [
+ "puts",
+ "sput",
+ "supt",
+ "tups"
+ ],
+ "ceeflprty": [
+ "perfectly",
+ "prefectly"
+ ],
+ "aelsv": [
+ "laves",
+ "salve",
+ "selva",
+ "slave",
+ "vales",
+ "valse",
+ "veals"
+ ],
+ "emo": [
+ "eom",
+ "meo",
+ "moe"
+ ],
+ "eehors": [
+ "heroes",
+ "reshoe"
+ ],
+ "adeinpt": [
+ "depaint",
+ "inadept",
+ "painted",
+ "patined"
+ ],
+ "ahilnoortz": [
+ "horizontal",
+ "notorhizal"
+ ],
+ "deelrstu": [
+ "deluster",
+ "lustered",
+ "resulted",
+ "ulstered"
+ ],
+ "acehilt": [
+ "alethic",
+ "ethical",
+ "thecial"
+ ],
+ "aceirrrs": [
+ "carriers",
+ "scarrier"
+ ],
+ "bdeilrsu": [
+ "builders",
+ "rebuilds"
+ ],
+ "egglrstu": [
+ "gurglets",
+ "struggle"
+ ],
+ "aelnrtu": [
+ "laurent",
+ "naturel",
+ "neutral",
+ "unalert"
+ ],
+ "efhirs": [
+ "fisher",
+ "sherif"
+ ],
+ "aeprss": [
+ "aspers",
+ "parses",
+ "passer",
+ "prases",
+ "repass",
+ "spares",
+ "sparse",
+ "spears"
+ ],
+ "abeginr": [
+ "bearing",
+ "begrain",
+ "brainge",
+ "gribane",
+ "rigbane"
+ ],
+ "abdr": [
+ "bard",
+ "brad",
+ "darb",
+ "drab"
+ ],
+ "bcmoo": [
+ "combo",
+ "coomb"
+ ],
+ "einorss": [
+ "seniors",
+ "sonsier"
+ ],
+ "aaciinottv": [
+ "activation",
+ "cavitation"
+ ],
+ "dos": [
+ "dos",
+ "ods",
+ "sod"
+ ],
+ "ailt": [
+ "alit",
+ "atli",
+ "ital",
+ "lait",
+ "lati",
+ "tail",
+ "tali"
+ ],
+ "eilnotv": [
+ "violent",
+ "volenti"
+ ],
+ "abins": [
+ "basin",
+ "nabis",
+ "sabin"
+ ],
+ "opsu": [
+ "opus",
+ "soup"
+ ],
+ "cginorss": [
+ "crossing",
+ "scorings"
+ ],
+ "ceimrs": [
+ "crimes",
+ "scrime"
+ ],
+ "enort": [
+ "noter",
+ "notre",
+ "tenor",
+ "toner",
+ "trone"
+ ],
+ "aeltx": [
+ "exalt",
+ "latex"
+ ],
+ "abcehnrs": [
+ "branches",
+ "brechans"
+ ],
+ "aemnory": [
+ "anymore",
+ "romneya"
+ ],
+ "dehil": [
+ "delhi",
+ "heild",
+ "hidel",
+ "hield"
+ ],
+ "aeiln": [
+ "alien",
+ "aline",
+ "anile",
+ "elain",
+ "elian",
+ "laine",
+ "liane",
+ "linea"
+ ],
+ "acloort": [
+ "carotol",
+ "crotalo",
+ "locator"
+ ],
+ "ajnu": [
+ "jaun",
+ "juan"
+ ],
+ "aeilmss": [
+ "aimless",
+ "melissa",
+ "samiels",
+ "seismal"
+ ],
+ "ehisst": [
+ "heists",
+ "shiest",
+ "sithes",
+ "thesis"
+ ],
+ "lnnoy": [
+ "nylon",
+ "nonyl",
+ "nonly"
+ ],
+ "ckory": [
+ "corky",
+ "rocky"
+ ],
+ "aabginrs": [
+ "abrasing",
+ "bargains"
+ ],
+ "aegiinr": [
+ "igraine",
+ "nigeria"
+ ],
+ "enps": [
+ "pens",
+ "sepn"
+ ],
+ "deilnttu": [
+ "dilutent",
+ "untilted",
+ "untitled"
+ ],
+ "ggiinns": [
+ "signing",
+ "singing"
+ ],
+ "ailmopt": [
+ "optimal",
+ "palmito"
+ ],
+ "cloooprst": [
+ "procotols",
+ "protocols"
+ ],
+ "glnu": [
+ "gunl",
+ "lung"
+ ],
+ "censt": [
+ "cents",
+ "csnet",
+ "scent"
+ ],
+ "eerrstu": [
+ "retruse",
+ "ureters"
+ ],
+ "aadeeltuv": [
+ "devaluate",
+ "evaluated"
+ ],
+ "adesty": [
+ "stayed",
+ "steady"
+ ],
+ "eess": [
+ "eses",
+ "esse",
+ "sees"
+ ],
+ "aersv": [
+ "avers",
+ "raves",
+ "saver",
+ "versa"
+ ],
+ "deeemr": [
+ "deemer",
+ "meered",
+ "redeem",
+ "remede"
+ ],
+ "egorrs": [
+ "groser",
+ "rogers"
+ ],
+ "aginr": [
+ "agrin",
+ "argin",
+ "garni",
+ "grain"
+ ],
+ "eegimr": [
+ "emigre",
+ "regime"
+ ],
+ "ehissw": [
+ "wishes",
+ "wisshe"
+ ],
+ "ddeenp": [
+ "depend",
+ "pended"
+ ],
+ "deffir": [
+ "differ",
+ "riffed"
+ ],
+ "achimnost": [
+ "macintosh",
+ "monachist"
+ ],
+ "acimno": [
+ "anomic",
+ "camino",
+ "camion",
+ "conima",
+ "manioc",
+ "monica"
+ ],
+ "aeiprrs": [
+ "aspirer",
+ "parries",
+ "praiser",
+ "rapiers",
+ "raspier",
+ "repairs",
+ "serpari"
+ ],
+ "abehrt": [
+ "bather",
+ "bertha",
+ "breath"
+ ],
+ "celo": [
+ "cole",
+ "ecol"
+ ],
+ "amrt": [
+ "mart",
+ "tram"
+ ],
+ "acdeln": [
+ "calden",
+ "candle",
+ "lanced"
+ ],
+ "cdeloor": [
+ "colored",
+ "croodle",
+ "decolor"
+ ],
+ "eekss": [
+ "kesse",
+ "seeks",
+ "skees"
+ ],
+ "gilnov": [
+ "loving",
+ "voling"
+ ],
+ "ginortu": [
+ "outgrin",
+ "outring",
+ "routing",
+ "touring"
+ ],
+ "cdos": [
+ "cods",
+ "docs"
+ ],
+ "aeeilrrt": [
+ "irrelate",
+ "retailer"
+ ],
+ "aiimnstv": [
+ "nativism",
+ "vitamins"
+ ],
+ "aeeglnt": [
+ "angelet",
+ "elegant"
+ ],
+ "agins": [
+ "gains",
+ "signa"
+ ],
+ "eirssst": [
+ "resists",
+ "sisters"
+ ],
+ "aghilmorst": [
+ "algorithms",
+ "logarithms"
+ ],
+ "addimr": [
+ "madrid",
+ "riddam"
+ ],
+ "agimnr": [
+ "arming",
+ "ingram",
+ "margin"
+ ],
+ "aefk": [
+ "fake",
+ "feak"
+ ],
+ "adf": [
+ "afd",
+ "fad"
+ ],
+ "eorstv": [
+ "stover",
+ "strove",
+ "troves",
+ "voters"
+ ],
+ "ceru": [
+ "cure",
+ "ecru",
+ "eruc"
+ ],
+ "acdemmnor": [
+ "commander",
+ "recommand"
+ ],
+ "deilors": [
+ "soldier",
+ "solider"
+ ],
+ "ains": [
+ "ains",
+ "anis",
+ "ansi",
+ "nais",
+ "nasi",
+ "nias",
+ "sain",
+ "sina"
+ ],
+ "ijnstu": [
+ "injust",
+ "justin"
+ ],
+ "ghilopstt": [
+ "spotlight",
+ "stoplight"
+ ],
+ "cikrst": [
+ "strick",
+ "tricks"
+ ],
+ "bhrsu": [
+ "brush",
+ "buhrs",
+ "shrub"
+ ],
+ "aelnps": [
+ "naples",
+ "panels",
+ "planes"
+ ],
+ "aeprs": [
+ "apers",
+ "apres",
+ "asper",
+ "pares",
+ "parse",
+ "pears",
+ "prase",
+ "presa",
+ "rapes",
+ "reaps",
+ "repas",
+ "spaer",
+ "spare",
+ "spear"
+ ],
+ "cgiilosst": [
+ "glossitic",
+ "logistics"
+ ],
+ "bgilnow": [
+ "blowing",
+ "bowling"
+ ],
+ "irt": [
+ "rit",
+ "rti",
+ "tri"
+ ],
+ "adhins": [
+ "danish",
+ "sandhi"
+ ],
+ "alp": [
+ "alp",
+ "apl",
+ "lap",
+ "pal"
+ ],
+ "ikrst": [
+ "skirt",
+ "stirk"
+ ],
+ "adginrsw": [
+ "drawings",
+ "swarding"
+ ],
+ "elorsv": [
+ "lovers",
+ "solver"
+ ],
+ "acimot": [
+ "atomic",
+ "matico"
+ ],
+ "aabcir": [
+ "arabic",
+ "cairba"
+ ],
+ "amt": [
+ "amt",
+ "atm",
+ "mat",
+ "tam"
+ ],
+ "acehlr": [
+ "rachel",
+ "rechal"
+ ],
+ "enov": [
+ "nevo",
+ "oven"
+ ],
+ "achins": [
+ "chains",
+ "chinas"
+ ],
+ "cghiinstw": [
+ "switching",
+ "witchings"
+ ],
+ "aadeprst": [
+ "adapters",
+ "readapts"
+ ],
+ "imoprst": [
+ "imports",
+ "primost",
+ "tropism"
+ ],
+ "benorz": [
+ "bonzer",
+ "bronze"
+ ],
+ "adnsy": [
+ "dansy",
+ "sandy"
+ ],
+ "aaeinoprst": [
+ "anisoptera",
+ "asperation",
+ "separation"
+ ],
+ "cepsstu": [
+ "suscept",
+ "suspect"
+ ],
+ "acmor": [
+ "carom",
+ "coram",
+ "macro",
+ "marco"
+ ],
+ "deenrs": [
+ "denser",
+ "enders",
+ "resend",
+ "sender"
+ ],
+ "aadmnorty": [
+ "damnatory",
+ "mandatory"
+ ],
+ "gmy": [
+ "gym",
+ "myg"
+ ],
+ "iinottu": [
+ "intuito",
+ "tuition"
+ ],
+ "eopssu": [
+ "esopus",
+ "opuses",
+ "pousse",
+ "spouse"
+ ],
+ "ceiotx": [
+ "coxite",
+ "exotic"
+ ],
+ "ginpsu": [
+ "pignus",
+ "spuing"
+ ],
+ "aehrstt": [
+ "hatters",
+ "rathest",
+ "shatter",
+ "threats"
+ ],
+ "acms": [
+ "cams",
+ "macs",
+ "masc",
+ "scam"
+ ],
+ "ejlo": [
+ "joel",
+ "jole"
+ ],
+ "deorsty": [
+ "destroy",
+ "stroyed"
+ ],
+ "aostu": [
+ "aotus",
+ "autos",
+ "outas"
+ ],
+ "eeimprss": [
+ "emprises",
+ "impreses",
+ "mesprise",
+ "premises",
+ "spiremes"
+ ],
+ "eprry": [
+ "perry",
+ "pryer",
+ "repry"
+ ],
+ "denoz": [
+ "dozen",
+ "zendo",
+ "zoned"
+ ],
+ "eehtt": [
+ "teeth",
+ "theet",
+ "thete"
+ ],
+ "ampst": [
+ "stamp",
+ "tamps"
+ ],
+ "lostu": [
+ "lotus",
+ "louts",
+ "tolus"
+ ],
+ "aadeeprst": [
+ "asperated",
+ "estrapade",
+ "paederast",
+ "separated"
+ ],
+ "ant": [
+ "ant",
+ "nat",
+ "tan"
+ ],
+ "cdeeiirtv": [
+ "creditive",
+ "directive"
+ ],
+ "aerrstt": [
+ "ratters",
+ "restart",
+ "starter"
+ ],
+ "bdenru": [
+ "bunder",
+ "burden",
+ "burned",
+ "unbred"
+ ],
+ "aepst": [
+ "paste",
+ "pates",
+ "peats",
+ "septa",
+ "spate",
+ "tapes",
+ "tepas"
+ ],
+ "ilms": [
+ "mils",
+ "slim"
+ ],
+ "aelmp": [
+ "ample",
+ "elamp",
+ "maple"
+ ],
+ "eklu": [
+ "leuk",
+ "luke"
+ ],
+ "aeeilrrst": [
+ "retailers",
+ "serratile"
+ ],
+ "deopt": [
+ "depot",
+ "opted",
+ "toped"
+ ],
+ "eip": [
+ "epi",
+ "pie"
+ ],
+ "eiimnoss": [
+ "emission",
+ "misiones",
+ "simonies"
+ ],
+ "eept": [
+ "pete",
+ "tepe"
+ ],
+ "ceps": [
+ "ceps",
+ "psec",
+ "spec"
+ ],
+ "efinst": [
+ "feints",
+ "festin",
+ "finest",
+ "infest"
+ ],
+ "aelrty": [
+ "elytra",
+ "lyrate",
+ "raylet",
+ "realty",
+ "telary"
+ ],
+ "bow": [
+ "bow",
+ "wob"
+ ],
+ "aaenpprt": [
+ "apparent",
+ "trappean"
+ ],
+ "aciilnnorsttu": [
+ "instructional",
+ "nonaltruistic"
+ ],
+ "beopr": [
+ "probe",
+ "rebop"
+ ],
+ "diim": [
+ "imid",
+ "midi"
+ ],
+ "eiimnoprsss": [
+ "impressions",
+ "permissions"
+ ],
+ "eilott": [
+ "lottie",
+ "toilet",
+ "tolite"
+ ],
+ "adeknr": [
+ "danker",
+ "darken",
+ "endark",
+ "kanred",
+ "narked",
+ "ranked"
+ ],
+ "eorstu": [
+ "ouster",
+ "outers",
+ "routes",
+ "souter",
+ "stoure",
+ "touser",
+ "trouse"
+ ],
+ "ceeorrv": [
+ "coverer",
+ "recover"
+ ],
+ "aceehinrt": [
+ "catherine",
+ "heritance"
+ ],
+ "bdegu": [
+ "budge",
+ "debug"
+ ],
+ "cddeeoprru": [
+ "procedured",
+ "reproduced"
+ ],
+ "hno": [
+ "hon",
+ "noh"
+ ],
+ "aillsv": [
+ "vallis",
+ "villas"
+ ],
+ "eeginp": [
+ "epigne",
+ "genepi",
+ "peeing"
+ ],
+ "bgino": [
+ "bingo",
+ "boing"
+ ],
+ "notu": [
+ "tuno",
+ "unto"
+ ],
+ "acceimr": [
+ "ceramic",
+ "racemic"
+ ],
+ "apsy": [
+ "aspy",
+ "yaps",
+ "pays",
+ "pyas",
+ "spay"
+ ],
+ "efginrs": [
+ "fingers",
+ "fringes"
+ ],
+ "deeilrsv": [
+ "delivers",
+ "desilver",
+ "silvered",
+ "slivered"
+ ],
+ "deels": [
+ "deles",
+ "leeds",
+ "lesed"
+ ],
+ "acder": [
+ "acred",
+ "arced",
+ "cader",
+ "cadre",
+ "cared",
+ "cedar",
+ "cread",
+ "creda",
+ "raced"
+ ],
+ "aeehrstt": [
+ "earthset",
+ "streahte",
+ "theaters",
+ "theatres"
+ ],
+ "dflo": [
+ "dolf",
+ "fold"
+ ],
+ "abilr": [
+ "blair",
+ "brail",
+ "libra"
+ ],
+ "ehops": [
+ "hopes",
+ "phose",
+ "shope"
+ ],
+ "amnos": [
+ "manos",
+ "manso",
+ "mason",
+ "moans",
+ "monas",
+ "mosan",
+ "nomas"
+ ],
+ "civ": [
+ "civ",
+ "vic"
+ ],
+ "aimor": [
+ "maori",
+ "mario",
+ "moira"
+ ],
+ "ops": [
+ "ops",
+ "pos",
+ "sop"
+ ],
+ "aachtt": [
+ "attach",
+ "chatta"
+ ],
+ "ceeilnss": [
+ "licenses",
+ "silences"
+ ],
+ "ilstu": [
+ "litus",
+ "sluit",
+ "tulsi"
+ ],
+ "deiprs": [
+ "prides",
+ "prised",
+ "redips",
+ "spider",
+ "spired",
+ "spried"
+ ],
+ "hpsy": [
+ "hyps",
+ "phys",
+ "syph"
+ ],
+ "aegnrs": [
+ "angers",
+ "ganser",
+ "granes",
+ "ranges",
+ "sanger",
+ "serang"
+ ],
+ "dhnosu": [
+ "hounds",
+ "hudson",
+ "unshod"
+ ],
+ "adeilost": [
+ "diastole",
+ "isolated",
+ "sodalite",
+ "solidate"
+ ],
+ "eiimnrt": [
+ "interim",
+ "mintier",
+ "termini"
+ ],
+ "adeissst": [
+ "assisted",
+ "disseats"
+ ],
+ "aegimnrst": [
+ "emigrants",
+ "germanist",
+ "mastering",
+ "streaming"
+ ],
+ "cehos": [
+ "choes",
+ "chose",
+ "echos"
+ ],
+ "acdeinsty": [
+ "asyndetic",
+ "cystidean",
+ "syndicate"
+ ],
+ "abinoort": [
+ "abortion",
+ "orbation",
+ "robotian"
+ ],
+ "adgilo": [
+ "algoid",
+ "dialog",
+ "goliad"
+ ],
+ "ablst": [
+ "blast",
+ "blats"
+ ],
+ "elop": [
+ "lope",
+ "olpe",
+ "pole"
+ ],
+ "cddeinostu": [
+ "deductions",
+ "discounted"
+ ],
+ "aehrstv": [
+ "harvest",
+ "thraves"
+ ],
+ "ehmorst": [
+ "mothers",
+ "smother",
+ "thermos"
+ ],
+ "acdeiln": [
+ "candiel",
+ "cladine",
+ "decalin",
+ "iceland",
+ "inlaced"
+ ],
+ "acdelns": [
+ "calends",
+ "candles"
+ ],
+ "aadginortu": [
+ "argonautid",
+ "graduation"
+ ],
+ "agiilns": [
+ "aisling",
+ "liasing",
+ "nilgais",
+ "sailing"
+ ],
+ "acders": [
+ "cadres",
+ "cedars",
+ "sacred",
+ "scared"
+ ],
+ "cehmor": [
+ "chomer",
+ "chrome"
+ ],
+ "eilorv": [
+ "lovier",
+ "oliver",
+ "violer",
+ "virole"
+ ],
+ "cgnoo": [
+ "cogon",
+ "congo"
+ ],
+ "egln": [
+ "engl",
+ "genl",
+ "glen",
+ "leng"
+ ],
+ "adelsy": [
+ "delays",
+ "slayed"
+ ],
+ "eilov": [
+ "olive",
+ "ovile",
+ "voile"
+ ],
+ "bcery": [
+ "becry",
+ "bryce"
+ ],
+ "cdeors": [
+ "coders",
+ "credos",
+ "decors",
+ "escrod",
+ "scored"
+ ],
+ "celno": [
+ "clone",
+ "colen"
+ ],
+ "aioss": [
+ "oasis",
+ "ossia",
+ "sosia"
+ ],
+ "abeeilns": [
+ "balinese",
+ "baseline"
+ ],
+ "agnry": [
+ "angry",
+ "rangy"
+ ],
+ "acdeiilnt": [
+ "ctenidial",
+ "identical"
+ ],
+ "abeelst": [
+ "beatles",
+ "besteal",
+ "estable"
+ ],
+ "eeinnortt": [
+ "intertone",
+ "retention"
+ ],
+ "aalmt": [
+ "malta",
+ "talma",
+ "tamal"
+ ],
+ "efrry": [
+ "ferry",
+ "freyr",
+ "fryer",
+ "refry"
+ ],
+ "aeginst": [
+ "easting",
+ "eatings",
+ "gainset",
+ "genista",
+ "ingates",
+ "ingesta",
+ "seating",
+ "signate",
+ "teasing"
+ ],
+ "aahmo": [
+ "haoma",
+ "omaha"
+ ],
+ "eirt": [
+ "iter",
+ "reit",
+ "rite",
+ "teri",
+ "tier",
+ "tire"
+ ],
+ "elmot": [
+ "metol",
+ "molet",
+ "motel"
+ ],
+ "innosu": [
+ "nonius",
+ "unions",
+ "unison"
+ ],
+ "ainrst": [
+ "instar",
+ "santir",
+ "strain",
+ "trains"
+ ],
+ "adgr": [
+ "darg",
+ "drag",
+ "gard",
+ "grad"
+ ],
+ "ehmoosw": [
+ "somehow",
+ "whosome"
+ ],
+ "adeerrst": [
+ "arrested",
+ "retreads",
+ "serrated",
+ "treaders"
+ ],
+ "eipr": [
+ "irpe",
+ "peri",
+ "pier",
+ "prie",
+ "ripe"
+ ],
+ "elry": [
+ "lyre",
+ "rely"
+ ],
+ "acdeiimnost": [
+ "daemonistic",
+ "medications"
+ ],
+ "ceehorrst": [
+ "orchester",
+ "orchestre",
+ "rochester",
+ "torcheres"
+ ],
+ "dginy": [
+ "dying",
+ "dingy"
+ ],
+ "ckstu": [
+ "stuck",
+ "tucks"
+ ],
+ "acgilnp": [
+ "capling",
+ "placing"
+ ],
+ "cefossu": [
+ "focuses",
+ "fucoses"
+ ],
+ "eiostv": [
+ "soviet",
+ "sovite"
+ ],
+ "aertty": [
+ "attery",
+ "yatter",
+ "treaty"
+ ],
+ "aeinrrt": [
+ "arterin",
+ "retrain",
+ "terrain",
+ "trainer"
+ ],
+ "agnor": [
+ "agron",
+ "angor",
+ "argon",
+ "garon",
+ "goran",
+ "grano",
+ "groan",
+ "nagor",
+ "orang",
+ "organ",
+ "rogan",
+ "ronga"
+ ],
+ "aacdensv": [
+ "advances",
+ "canvased"
+ ],
+ "elmno": [
+ "lemon",
+ "melon",
+ "monel"
+ ],
+ "pty": [
+ "pty",
+ "typ"
+ ],
+ "nstu": [
+ "nuts",
+ "stun",
+ "sunt",
+ "tsun",
+ "tuns"
+ ],
+ "ailn": [
+ "alin",
+ "anil",
+ "lain",
+ "lina",
+ "nail"
+ ],
+ "aeinnv": [
+ "avenin",
+ "vienna"
+ ],
+ "anps": [
+ "naps",
+ "pans",
+ "snap",
+ "span"
+ ],
+ "adfnorst": [
+ "forstand",
+ "stanford"
+ ],
+ "aestttu": [
+ "statute",
+ "tautest"
+ ],
+ "acehlp": [
+ "chapel",
+ "lepcha",
+ "pleach"
+ ],
+ "aelrsy": [
+ "layers",
+ "relays",
+ "reslay",
+ "slayer"
+ ],
+ "abceeelrt": [
+ "celebrate",
+ "erectable"
+ ],
+ "cdeemoprss": [
+ "compressed",
+ "decompress"
+ ],
+ "deirr": [
+ "derri",
+ "direr",
+ "drier",
+ "irred",
+ "rider"
+ ],
+ "adirsu": [
+ "darius",
+ "radius"
+ ],
+ "achiinrsst": [
+ "christians",
+ "sinarchist"
+ ],
+ "eeiimprssv": [
+ "impressive",
+ "permissive"
+ ],
+ "ceelrstu": [
+ "cruelest",
+ "lectures"
+ ],
+ "einsw": [
+ "sewin",
+ "sinew",
+ "swine",
+ "wines",
+ "wisen"
+ ],
+ "cpsu": [
+ "cpus",
+ "cups",
+ "cusp",
+ "scup"
+ ],
+ "accdeinst": [
+ "accidents",
+ "desiccant"
+ ],
+ "aceilnoort": [
+ "corelation",
+ "iconolater",
+ "relocation"
+ ],
+ "arsttu": [
+ "astrut",
+ "rattus",
+ "stuart"
+ ],
+ "ail": [
+ "ail",
+ "ila",
+ "lai"
+ ],
+ "emnoor": [
+ "monroe",
+ "mooner",
+ "morone"
+ ],
+ "deenrt": [
+ "denter",
+ "rented",
+ "tender",
+ "tendre",
+ "terned"
+ ],
+ "eeeprrsv": [
+ "perverse",
+ "preserve"
+ ],
+ "emop": [
+ "mope",
+ "poem",
+ "pome"
+ ],
+ "deginnsu": [
+ "undesign",
+ "unsigned",
+ "unsinged"
+ ],
+ "aginsty": [
+ "staying",
+ "stygian"
+ ],
+ "aeerst": [
+ "aretes",
+ "asteer",
+ "easter",
+ "eastre",
+ "eaters",
+ "reseat",
+ "saeter",
+ "seater",
+ "staree",
+ "teaser",
+ "teresa"
+ ],
+ "eehiorst": [
+ "isothere",
+ "theories",
+ "theorise"
+ ],
+ "aeiprs": [
+ "aspire",
+ "paries",
+ "persia",
+ "praise",
+ "sirpea",
+ "spirae",
+ "spirea"
+ ],
+ "ceeinv": [
+ "cevine",
+ "evince",
+ "venice"
+ ],
+ "aeinost": [
+ "aeonist",
+ "asiento",
+ "atonies",
+ "estonia",
+ "satieno"
+ ],
+ "aeenrtv": [
+ "aventre",
+ "nervate",
+ "veteran"
+ ],
+ "adgilnn": [
+ "danglin",
+ "landing"
+ ],
+ "aeikt": [
+ "katie",
+ "keita"
+ ],
+ "aceiilrst": [
+ "clarities",
+ "eristical",
+ "realistic"
+ ],
+ "aelrx": [
+ "laxer",
+ "relax"
+ ],
+ "aeegginnrt": [
+ "generating",
+ "greatening",
+ "renegating"
+ ],
+ "aben": [
+ "bane",
+ "bean",
+ "bena"
+ ],
+ "abenst": [
+ "absent",
+ "basnet",
+ "basten",
+ "besant"
+ ],
+ "acdeoru": [
+ "acuerdo",
+ "cordeau",
+ "ecuador"
+ ],
+ "iiprsst": [
+ "pristis",
+ "spirits",
+ "tripsis"
+ ],
+ "aflot": [
+ "aloft",
+ "float",
+ "flota"
+ ],
+ "cilno": [
+ "colin",
+ "conli",
+ "nicol"
+ ],
+ "abis": [
+ "absi",
+ "bais",
+ "bias",
+ "isba"
+ ],
+ "ahpst": [
+ "paths",
+ "spath",
+ "staph"
+ ],
+ "beinrtu": [
+ "tribune",
+ "tuberin",
+ "turbine"
+ ],
+ "eelssv": [
+ "selves",
+ "vessel"
+ ],
+ "acdis": [
+ "acids",
+ "asdic",
+ "cadis",
+ "caids",
+ "sadic"
+ ],
+ "eirssuv": [
+ "servius",
+ "survise",
+ "viruses"
+ ],
+ "aceehpr": [
+ "cheaper",
+ "peacher"
+ ],
+ "adimt": [
+ "admit",
+ "atmid"
+ ],
+ "emm": [
+ "emm",
+ "mem"
+ ],
+ "aamos": [
+ "omasa",
+ "samoa"
+ ],
+ "aceinorst": [
+ "atroscine",
+ "certosina",
+ "creations",
+ "narcotise",
+ "ostracine",
+ "reactions",
+ "secration",
+ "tinoceras",
+ "tricosane"
+ ],
+ "aegilns": [
+ "inglesa",
+ "leasing",
+ "linages",
+ "sealing"
+ ],
+ "aelnru": [
+ "alrune",
+ "lunare",
+ "neural",
+ "ulnare",
+ "unreal"
+ ],
+ "adqsu": [
+ "quads",
+ "squad"
+ ],
+ "aeelrt": [
+ "earlet",
+ "elater",
+ "relate"
+ ],
+ "aegsw": [
+ "swage",
+ "wages"
+ ],
+ "effrsu": [
+ "ruffes",
+ "suffer"
+ ],
+ "eforsst": [
+ "forests",
+ "fosters"
+ ],
+ "anno": [
+ "anno",
+ "anon",
+ "nona",
+ "onan"
+ ],
+ "aailmrt": [
+ "marital",
+ "martial"
+ ],
+ "aeinrt": [
+ "anteri",
+ "entria",
+ "nerita",
+ "ratine",
+ "retain",
+ "retina",
+ "tanier"
+ ],
+ "elnntu": [
+ "nunlet",
+ "tunnel",
+ "unlent"
+ ],
+ "eegnrs": [
+ "genres",
+ "greens"
+ ],
+ "aenpstt": [
+ "patents",
+ "pattens"
+ ],
+ "achos": [
+ "chaos",
+ "oshac"
+ ],
+ "aehtw": [
+ "awhet",
+ "wheat"
+ ],
+ "adeginrs": [
+ "deraigns",
+ "disrange",
+ "gradines",
+ "readings"
+ ],
+ "ceilmopr": [
+ "compiler",
+ "complier"
+ ],
+ "abess": [
+ "bases",
+ "sabes"
+ ],
+ "accdesu": [
+ "accused",
+ "succade"
+ ],
+ "dlou": [
+ "loud",
+ "ludo"
+ ],
+ "bdeir": [
+ "bider",
+ "birde",
+ "bredi",
+ "bride",
+ "rebid"
+ ],
+ "aceinnsst": [
+ "anticness",
+ "cantiness",
+ "incessant",
+ "instances"
+ ],
+ "achnor": [
+ "anchor",
+ "archon",
+ "charon",
+ "rancho"
+ ],
+ "astt": [
+ "stat",
+ "tats"
+ ],
+ "eessx": [
+ "essex",
+ "sexes"
+ ],
+ "abceehs": [
+ "beaches",
+ "bechase"
+ ],
+ "deflors": [
+ "folders",
+ "refolds"
+ ],
+ "eorrstu": [
+ "rouster",
+ "routers",
+ "tourers",
+ "trouser"
+ ],
+ "bios": [
+ "bios",
+ "bois",
+ "obis"
+ ],
+ "cmp": [
+ "cpm",
+ "pcm"
+ ],
+ "eeht": [
+ "hete",
+ "thee"
+ ],
+ "eopp": [
+ "epop",
+ "pepo",
+ "pope"
+ ],
+ "adlnor": [
+ "androl",
+ "arnold",
+ "ladron",
+ "lardon",
+ "lordan",
+ "roland",
+ "ronald"
+ ],
+ "cchiks": [
+ "chicks",
+ "schick"
+ ],
+ "aceltt": [
+ "cattle",
+ "tectal"
+ ],
+ "abm": [
+ "amb",
+ "bam",
+ "mab"
+ ],
+ "aacdilr": [
+ "cardial",
+ "radical"
+ ],
+ "aeerrstu": [
+ "austerer",
+ "treasure"
+ ],
+ "adelor": [
+ "loader",
+ "ordeal",
+ "reload"
+ ],
+ "aeflm": [
+ "flame",
+ "fleam"
+ ],
+ "aknst": [
+ "stank",
+ "tanks"
+ ],
+ "aemnorty": [
+ "myronate",
+ "monetary",
+ "naometry"
+ ],
+ "aceilprst": [
+ "palestric",
+ "particles"
+ ],
+ "acdeinoort": [
+ "aerodontic",
+ "carotenoid",
+ "coordinate",
+ "coronadite",
+ "decoration"
+ ],
+ "aiktuw": [
+ "kuwait",
+ "waukit"
+ ],
+ "eilmy": [
+ "elymi",
+ "emily",
+ "limey"
+ ],
+ "aiiilmnott": [
+ "limitation",
+ "militation"
+ ],
+ "ceilmop": [
+ "compile",
+ "polemic"
+ ],
+ "beerstw": [
+ "bestrew",
+ "webster"
+ ],
+ "abdilr": [
+ "bildar",
+ "bridal",
+ "labrid",
+ "libard",
+ "ribald"
+ ],
+ "agm": [
+ "gam",
+ "mag"
+ ],
+ "efghirt": [
+ "fighter",
+ "freight",
+ "refight"
+ ],
+ "abeert": [
+ "beater",
+ "berate",
+ "betear",
+ "rebate",
+ "rebeat"
+ ],
+ "adnsu": [
+ "sudan",
+ "unsad"
+ ],
+ "cer": [
+ "cre",
+ "rec"
+ ],
+ "aceforsst": [
+ "factoress",
+ "forecasts"
+ ],
+ "eekn": [
+ "keen",
+ "knee"
+ ],
+ "eppr": [
+ "perp",
+ "prep",
+ "repp"
+ ],
+ "cehm": [
+ "chem",
+ "mech"
+ ],
+ "aefsstt": [
+ "fastest",
+ "setfast"
+ ],
+ "belrtu": [
+ "bulter",
+ "burlet",
+ "butler",
+ "turble"
+ ],
+ "acdeginort": [
+ "centigrado",
+ "decorating"
+ ],
+ "allopry": [
+ "payroll",
+ "polarly"
+ ],
+ "hinst": [
+ "hints",
+ "thins",
+ "thisn"
+ ],
+ "acellops": [
+ "collapse",
+ "escallop"
+ ],
+ "aaceimrs": [
+ "americas",
+ "cramasie",
+ "mesaraic"
+ ],
+ "oprs": [
+ "pros",
+ "spor"
+ ],
+ "aailtv": [
+ "avital",
+ "latvia"
+ ],
+ "aelrry": [
+ "rarely",
+ "rearly"
+ ],
+ "aahmrt": [
+ "amarth",
+ "martha",
+ "matrah"
+ ],
+ "eeginss": [
+ "genesis",
+ "seeings"
+ ],
+ "aegru": [
+ "argue",
+ "auger",
+ "gaure",
+ "rugae"
+ ],
+ "aelmst": [
+ "lamest",
+ "metals",
+ "samlet"
+ ],
+ "egilntt": [
+ "ettling",
+ "letting"
+ ],
+ "cir": [
+ "cir",
+ "ric"
+ ],
+ "aeijm": [
+ "jaime",
+ "jamie"
+ ],
+ "aceilprt": [
+ "particle",
+ "plicater",
+ "prelatic"
+ ],
+ "ceeinopprt": [
+ "perception",
+ "preception"
+ ],
+ "aeilmnrs": [
+ "marlines",
+ "minerals",
+ "mislearn"
+ ],
+ "adeisv": [
+ "advise",
+ "davies",
+ "visaed"
+ ],
+ "belostt": [
+ "bottles",
+ "setbolt"
+ ],
+ "aaceeinnrss": [
+ "necessarian",
+ "renaissance"
+ ],
+ "aars": [
+ "rasa",
+ "sara"
+ ],
+ "acdeinnor": [
+ "cerdonian",
+ "encardion",
+ "ordinance"
+ ],
+ "eghhsu": [
+ "heughs",
+ "hughes",
+ "sheugh"
+ ],
+ "eeffjry": [
+ "jeffery",
+ "jeffrey"
+ ],
+ "aeeoprst": [
+ "asterope",
+ "operates",
+ "protease"
+ ],
+ "acors": [
+ "arcos",
+ "crosa",
+ "orcas",
+ "oscar",
+ "sacro"
+ ],
+ "emnsu": [
+ "menus",
+ "neums",
+ "sumen"
+ ],
+ "aeelrv": [
+ "laveer",
+ "leaver",
+ "reveal",
+ "vealer"
+ ],
+ "aimno": [
+ "amino",
+ "animo",
+ "inoma",
+ "naomi",
+ "omani",
+ "omina"
+ ],
+ "cciilns": [
+ "cinclis",
+ "clinics"
+ ],
+ "lms": [
+ "msl",
+ "sml"
+ ],
+ "cow": [
+ "cow",
+ "cwo"
+ ],
+ "gilny": [
+ "lying",
+ "lingy"
+ ],
+ "deiv": [
+ "devi",
+ "dive",
+ "vide",
+ "vied"
+ ],
+ "abnry": [
+ "barny",
+ "bryan"
+ ],
+ "eoprstt": [
+ "potters",
+ "protest",
+ "spotter"
+ ],
+ "eirst": [
+ "iters",
+ "reist",
+ "resit",
+ "rites",
+ "steri",
+ "stire",
+ "tiers",
+ "tires",
+ "tries"
+ ],
+ "aghinsw": [
+ "hawsing",
+ "shawing",
+ "washing"
+ ],
+ "celorsu": [
+ "closure",
+ "colures"
+ ],
+ "adir": [
+ "arid",
+ "dari",
+ "raid"
+ ],
+ "beimrt": [
+ "betrim",
+ "timber",
+ "timbre"
+ ],
+ "eeinnst": [
+ "ensient",
+ "intense",
+ "sennite",
+ "sentine"
+ ],
+ "ehorssw": [
+ "reshows",
+ "showers"
+ ],
+ "gilnru": [
+ "luring",
+ "ruling",
+ "urling"
+ ],
+ "dirt": [
+ "dirt",
+ "trid"
+ ],
+ "doprs": [
+ "dorps",
+ "drops",
+ "prods",
+ "sprod"
+ ],
+ "gilnpsu": [
+ "pulings",
+ "pulsing"
+ ],
+ "deellnor": [
+ "enrolled",
+ "rondelle"
+ ],
+ "cersw": [
+ "crews",
+ "screw"
+ ],
+ "eiimnrsst": [
+ "ministers",
+ "misinters"
+ ],
+ "abelm": [
+ "amble",
+ "belam",
+ "blame",
+ "mabel",
+ "melba"
+ ],
+ "aeegnv": [
+ "avenge",
+ "geneva",
+ "vangee"
+ ],
+ "dist": [
+ "dist",
+ "dits",
+ "stid"
+ ],
+ "addehn": [
+ "hadden",
+ "handed"
+ ],
+ "aeiknt": [
+ "intake",
+ "kentia",
+ "tankie"
+ ],
+ "afilmnor": [
+ "formalin",
+ "formnail",
+ "informal",
+ "laniform"
+ ],
+ "accehimns": [
+ "mechanics",
+ "mischance"
+ ],
+ "ffity": [
+ "fifty",
+ "tiffy"
+ ],
+ "adeehrs": [
+ "adheres",
+ "headers",
+ "hearsed",
+ "sheared"
+ ],
+ "aceilmnru": [
+ "ceruminal",
+ "melanuric",
+ "numerical"
+ ],
+ "aerssu": [
+ "assure",
+ "urases"
+ ],
+ "dimosu": [
+ "modius",
+ "odiums",
+ "sodium"
+ ],
+ "ehmnoor": [
+ "hormone",
+ "moorhen"
+ ],
+ "gipr": [
+ "grip",
+ "prig"
+ ],
+ "aalnv": [
+ "alvan",
+ "naval"
+ ],
+ "aceilnopr": [
+ "oliprance",
+ "porcelain"
+ ],
+ "bdegirs": [
+ "begirds",
+ "bridges"
+ ],
+ "attw": [
+ "twat",
+ "watt"
+ ],
+ "cdeent": [
+ "cedent",
+ "decent",
+ "decnet"
+ ],
+ "acginst": [
+ "actings",
+ "casting"
+ ],
+ "adnoty": [
+ "adyton",
+ "dayton"
+ ],
+ "aclors": [
+ "carlos",
+ "carols",
+ "claros",
+ "corals"
+ ],
+ "enor": [
+ "nore",
+ "oner",
+ "reno",
+ "rone"
+ ],
+ "adnno": [
+ "donna",
+ "nonda"
+ ],
+ "abcin": [
+ "bacin",
+ "cabin"
+ ],
+ "acginnns": [
+ "cannings",
+ "scanning"
+ ],
+ "ailmuv": [
+ "maulvi",
+ "valium"
+ ],
+ "cdelorss": [
+ "cordless",
+ "scolders"
+ ],
+ "defir": [
+ "fired",
+ "fried"
+ ],
+ "airsy": [
+ "sairy",
+ "syria"
+ ],
+ "eikln": [
+ "inkle",
+ "liken"
+ ],
+ "glos": [
+ "glos",
+ "logs",
+ "slog"
+ ],
+ "eorrt": [
+ "retro",
+ "roter"
+ ],
+ "elo": [
+ "leo",
+ "loe",
+ "ole"
+ ],
+ "accilrru": [
+ "circular",
+ "curricla"
+ ],
+ "isstu": [
+ "situs",
+ "suist",
+ "suits",
+ "tissu"
+ ],
+ "agr": [
+ "agr",
+ "arg",
+ "gar",
+ "gra",
+ "rag"
+ ],
+ "abeirrz": [
+ "bizarre",
+ "brazier"
+ ],
+ "ego": [
+ "ego",
+ "geo"
+ ],
+ "bbinor": [
+ "ribbon",
+ "robbin"
+ ],
+ "deo": [
+ "doe",
+ "edo",
+ "ode"
+ ],
+ "aprsttu": [
+ "startup",
+ "upstart"
+ ],
+ "ait": [
+ "ait",
+ "ati",
+ "ita",
+ "tai"
+ ],
+ "giiknss": [
+ "kissing",
+ "skiings"
+ ],
+ "adhny": [
+ "anhyd",
+ "haydn",
+ "handy"
+ ],
+ "apsw": [
+ "paws",
+ "swap",
+ "waps",
+ "wasp"
+ ],
+ "eegmorty": [
+ "geoemtry",
+ "geometry"
+ ],
+ "abs": [
+ "abs",
+ "asb",
+ "bas",
+ "sab"
+ ],
+ "ims": [
+ "ism",
+ "mis",
+ "sim"
+ ],
+ "dehiss": [
+ "dishes",
+ "hissed"
+ ],
+ "aceilpr": [
+ "caliper",
+ "earclip",
+ "picarel",
+ "replica"
+ ],
+ "beirt": [
+ "biter",
+ "brite",
+ "tiber",
+ "tribe"
+ ],
+ "aderst": [
+ "daters",
+ "derats",
+ "stader",
+ "stared",
+ "sterad",
+ "strade",
+ "trades",
+ "treads"
+ ],
+ "eknu": [
+ "neuk",
+ "nuke"
+ ],
+ "aclm": [
+ "calm",
+ "clam"
+ ],
+ "cdeiop": [
+ "copied",
+ "epodic"
+ ],
+ "aciost": [
+ "coatis",
+ "isotac",
+ "scotia"
+ ],
+ "afgimnr": [
+ "farming",
+ "fingram",
+ "framing"
+ ],
+ "bginos": [
+ "bingos",
+ "gibson",
+ "obsign"
+ ],
+ "orty": [
+ "ryot",
+ "royt",
+ "tyro",
+ "tory",
+ "troy"
+ ],
+ "ellorr": [
+ "reroll",
+ "roller"
+ ],
+ "aeginorz": [
+ "agonizer",
+ "orangize",
+ "organize"
+ ],
+ "aacdeeipprt": [
+ "appreciated",
+ "appredicate"
+ ],
+ "ceilno": [
+ "cineol",
+ "clione",
+ "cloine",
+ "coelin",
+ "encoil",
+ "enolic"
+ ],
+ "ailnot": [
+ "italon",
+ "latino",
+ "lation",
+ "talion"
+ ],
+ "aaghn": [
+ "aghan",
+ "ghana"
+ ],
+ "deegs": [
+ "edges",
+ "sedge"
+ ],
+ "adehlns": [
+ "handles",
+ "handsel"
+ ],
+ "deiklls": [
+ "deskill",
+ "dillesk",
+ "skilled"
+ ],
+ "aahmst": [
+ "amsath",
+ "asthma"
+ ],
+ "ipr": [
+ "ipr",
+ "pir",
+ "rip"
+ ],
+ "aderrw": [
+ "drawer",
+ "redraw",
+ "reward",
+ "warder",
+ "warred"
+ ],
+ "arty": [
+ "arty",
+ "atry",
+ "tray"
+ ],
+ "inpstu": [
+ "inputs",
+ "ptinus",
+ "unspit"
+ ],
+ "aaeinrrstw": [
+ "warranties",
+ "warrantise"
+ ],
+ "adelm": [
+ "demal",
+ "lamed",
+ "medal"
+ ],
+ "aklsw": [
+ "lawks",
+ "walks"
+ ],
+ "bhoot": [
+ "bhoot",
+ "booth"
+ ],
+ "cdeeeflrt": [
+ "redeflect",
+ "reflected"
+ ],
+ "benos": [
+ "bones",
+ "ebons"
+ ],
+ "bdeer": [
+ "brede",
+ "breed",
+ "rebed"
+ ],
+ "cdeeortt": [
+ "cottered",
+ "detector"
+ ],
+ "deginor": [
+ "eroding",
+ "gironde",
+ "groined",
+ "ignored",
+ "negroid",
+ "redoing"
+ ],
+ "alopr": [
+ "parol",
+ "polar",
+ "poral",
+ "proal"
+ ],
+ "aaegilntuv": [
+ "evaluating",
+ "vaginulate"
+ ],
+ "ilp": [
+ "ipl",
+ "lip",
+ "pil",
+ "pli"
+ ],
+ "aeghrt": [
+ "gareth",
+ "gather"
+ ],
+ "adeflr": [
+ "alfred",
+ "fardel",
+ "flared"
+ ],
+ "acery": [
+ "carey",
+ "craye"
+ ],
+ "elmost": [
+ "molest",
+ "motels"
+ ],
+ "cdeeoprs": [
+ "procedes",
+ "proceeds"
+ ],
+ "cdeiinrt": [
+ "indicter",
+ "indirect",
+ "reindict"
+ ],
+ "aerrst": [
+ "arrest",
+ "astrer",
+ "rarest",
+ "raster",
+ "raters",
+ "starer",
+ "tarres",
+ "terras",
+ "treasr"
+ ],
+ "deelpy": [
+ "deeply",
+ "yelped"
+ ],
+ "cit": [
+ "cit",
+ "tic"
+ ],
+ "aaimnr": [
+ "airman",
+ "amarin",
+ "marian",
+ "marina",
+ "mirana"
+ ],
+ "abinos": [
+ "basion",
+ "bonsai",
+ "sabino"
+ ],
+ "aiopt": [
+ "patio",
+ "taipo",
+ "topia"
+ ],
+ "aceelnort": [
+ "antrocele",
+ "coeternal",
+ "tolerance"
+ ],
+ "aceiirttvy": [
+ "creativity",
+ "reactivity"
+ ],
+ "dlloy": [
+ "dolly",
+ "lloyd"
+ ],
+ "deey": [
+ "eyed",
+ "yede"
+ ],
+ "abgr": [
+ "brag",
+ "garb",
+ "grab"
+ ],
+ "ceinoprst": [
+ "inceptors",
+ "inspector"
+ ],
+ "abens": [
+ "banes",
+ "beans",
+ "besan"
+ ],
+ "eills": [
+ "liles",
+ "lisle",
+ "selli"
+ ],
+ "aekns": [
+ "kanes",
+ "skean",
+ "snake",
+ "sneak"
+ ],
+ "adelnor": [
+ "endoral",
+ "ladrone",
+ "leonard"
+ ],
+ "ailnps": [
+ "lapins",
+ "plains",
+ "spinal"
+ ],
+ "admnory": [
+ "doryman",
+ "raymond"
+ ],
+ "adeiiintt": [
+ "dietitian",
+ "initiated"
+ ],
+ "floo": [
+ "fool",
+ "loof",
+ "olof"
+ ],
+ "aacelnrst": [
+ "ancestral",
+ "lancaster"
+ ],
+ "beeorsv": [
+ "observe",
+ "obverse",
+ "verbose"
+ ],
+ "aceinnorst": [
+ "containers",
+ "resanction",
+ "sanctioner"
+ ],
+ "aklr": [
+ "karl",
+ "kral",
+ "lark"
+ ],
+ "aacilr": [
+ "alaric",
+ "racial"
+ ],
+ "aeeginrtt": [
+ "argentite",
+ "grenatite",
+ "integrate"
+ ],
+ "abdemru": [
+ "bermuda",
+ "rumbaed"
+ ],
+ "aaadmn": [
+ "amadan",
+ "amanda",
+ "manada"
+ ],
+ "beilmos": [
+ "mobiles",
+ "obelism"
+ ],
+ "aceerrt": [
+ "caterer",
+ "recrate",
+ "retrace",
+ "terrace"
+ ],
+ "deeilpr": [
+ "periled",
+ "replied"
+ ],
+ "elnosv": [
+ "novels",
+ "sloven",
+ "volens"
+ ],
+ "aijl": [
+ "jail",
+ "lija"
+ ],
+ "aeflsy": [
+ "fayles",
+ "safely"
+ ],
+ "deikny": [
+ "dinkey",
+ "kidney"
+ ],
+ "denss": [
+ "sends",
+ "sneds"
+ ],
+ "abdelru": [
+ "delubra",
+ "durable"
+ ],
+ "horstw": [
+ "rowths",
+ "throws",
+ "whorts",
+ "worths"
+ ],
+ "eimorstu": [
+ "moisture",
+ "semitour"
+ ],
+ "eimrt": [
+ "ermit",
+ "merit",
+ "miter",
+ "mitre",
+ "mtier",
+ "remit",
+ "timer"
+ ],
+ "abelstt": [
+ "battels",
+ "battles",
+ "tablets"
+ ],
+ "acdeorstu": [
+ "aeroducts",
+ "ceratodus",
+ "croustade",
+ "educators"
+ ],
+ "aegilmnnt": [
+ "alignment",
+ "lamenting"
+ ],
+ "aey": [
+ "aye",
+ "yea"
+ ],
+ "eorstw": [
+ "restow",
+ "stower",
+ "towers",
+ "towser",
+ "worset"
+ ],
+ "ackrs": [
+ "carks",
+ "racks"
+ ],
+ "acel": [
+ "acle",
+ "alce",
+ "alec",
+ "lace"
+ ],
+ "ansty": [
+ "antsy",
+ "nasty",
+ "santy",
+ "styan",
+ "tansy"
+ ],
+ "adeilttu": [
+ "altitude",
+ "latitude"
+ ],
+ "gluy": [
+ "guly",
+ "ugly"
+ ],
+ "deiopsst": [
+ "deposits",
+ "topsides"
+ ],
+ "asttw": [
+ "twats",
+ "watts"
+ ],
+ "ahrt": [
+ "hart",
+ "rath",
+ "tahr",
+ "thar",
+ "trah"
+ ],
+ "abdenrr": [
+ "bernard",
+ "brander",
+ "rebrand"
+ ],
+ "bestu": [
+ "stube",
+ "subet",
+ "tubes"
+ ],
+ "clo": [
+ "clo",
+ "col",
+ "loc"
+ ],
+ "eiprst": [
+ "esprit",
+ "priest",
+ "pteris",
+ "ripest",
+ "sitrep",
+ "sprite",
+ "stripe",
+ "tripes"
+ ],
+ "dfloy": [
+ "floyd",
+ "foldy"
+ ],
+ "acenrt": [
+ "canter",
+ "carnet",
+ "centra",
+ "cranet",
+ "creant",
+ "cretan",
+ "nectar",
+ "recant",
+ "tanrec",
+ "trance"
+ ],
+ "achilnos": [
+ "lichanos",
+ "nicholas"
+ ],
+ "bilo": [
+ "bilo",
+ "biol",
+ "boil",
+ "lobi",
+ "obli"
+ ],
+ "bdelnu": [
+ "bundle",
+ "unbled"
+ ],
+ "iknss": [
+ "sinks",
+ "skins"
+ ],
+ "adeilm": [
+ "aldime",
+ "mailed",
+ "medial"
+ ],
+ "aderrsw": [
+ "drawers",
+ "redraws",
+ "resward",
+ "rewards",
+ "warders"
+ ],
+ "ddeefn": [
+ "defend",
+ "fended"
+ ],
+ "acddeiim": [
+ "mediacid",
+ "medicaid"
+ ],
+ "eort": [
+ "rote",
+ "tore"
+ ],
+ "ehlsw": [
+ "welsh",
+ "whsle"
+ ],
+ "elnost": [
+ "lentos",
+ "solent",
+ "stolen",
+ "telson"
+ ],
+ "aci": [
+ "cai",
+ "cia"
+ ],
+ "deeeimnrst": [
+ "densimeter",
+ "determines",
+ "misentered"
+ ],
+ "lopy": [
+ "ploy",
+ "poly"
+ ],
+ "aers": [
+ "ares",
+ "arse",
+ "ears",
+ "eras",
+ "rase",
+ "sare",
+ "sear",
+ "sera"
+ ],
+ "aalnrstu": [
+ "naturals",
+ "saturnal"
+ ],
+ "deelnrs": [
+ "lenders",
+ "relends",
+ "slender"
+ ],
+ "eemr": [
+ "emer",
+ "erme",
+ "meer",
+ "mere",
+ "reem"
+ ],
+ "aeegrs": [
+ "agrees",
+ "eagers",
+ "eagres",
+ "grease",
+ "ragees",
+ "sageer"
+ ],
+ "ceehrs": [
+ "cheers",
+ "creesh"
+ ],
+ "dgi": [
+ "dig",
+ "gid"
+ ],
+ "ehimnnpstu": [
+ "punishment",
+ "unshipment"
+ ],
+ "aceinooprrt": [
+ "incorporate",
+ "procreation"
+ ],
+ "aeerrrstu": [
+ "serrature",
+ "treasurer"
+ ],
+ "ceeenss": [
+ "essence",
+ "necesse",
+ "senesce"
+ ],
+ "ehlmos": [
+ "holmes",
+ "mohels"
+ ],
+ "gis": [
+ "gis",
+ "sig"
+ ],
+ "ceehrst": [
+ "chester",
+ "etchers",
+ "retches",
+ "tresche"
+ ],
+ "isttw": [
+ "twist",
+ "twits"
+ ],
+ "einstu": [
+ "intuse",
+ "tenuis",
+ "unites",
+ "unties"
+ ],
+ "bdeiru": [
+ "burdie",
+ "buried",
+ "rubied"
+ ],
+ "adinrw": [
+ "darwin",
+ "inward"
+ ],
+ "aknrs": [
+ "karns",
+ "knars",
+ "krans",
+ "narks",
+ "ranks",
+ "snark"
+ ],
+ "bdetu": [
+ "debut",
+ "tubed"
+ ],
+ "abdelry": [
+ "bradley",
+ "dryable"
+ ],
+ "deny": [
+ "deny",
+ "dyne"
+ ],
+ "abil": [
+ "albi",
+ "bail",
+ "bali"
+ ],
+ "iort": [
+ "riot",
+ "roit",
+ "roti",
+ "tiro",
+ "tori",
+ "trio"
+ ],
+ "aekmrr": [
+ "marker",
+ "remark"
+ ],
+ "grsu": [
+ "grus",
+ "rugs",
+ "surg"
+ ],
+ "aadnrs": [
+ "nasard",
+ "sandra"
+ ],
+ "acmnoo": [
+ "mocoan",
+ "monaco"
+ ],
+ "aeeimrst": [
+ "emirates",
+ "steamier"
+ ],
+ "aeft": [
+ "atef",
+ "fate",
+ "feat",
+ "feta"
+ ],
+ "borstu": [
+ "robust",
+ "turbos"
+ ],
+ "agrs": [
+ "gars",
+ "gras",
+ "rags"
+ ],
+ "ddeenoprs": [
+ "desponder",
+ "responded"
+ ],
+ "imr": [
+ "mir",
+ "rim"
+ ],
+ "aeilnp": [
+ "alpine",
+ "nepali",
+ "penial",
+ "pineal"
+ ],
+ "dis": [
+ "dis",
+ "ids",
+ "sid"
+ ],
+ "eimrx": [
+ "mirex",
+ "mixer",
+ "remix"
+ ],
+ "eenrw": [
+ "newer",
+ "renew",
+ "weren"
+ ],
+ "aky": [
+ "yak",
+ "kay"
+ ],
+ "ceips": [
+ "epics",
+ "sepic",
+ "spice"
+ ],
+ "amos": [
+ "amos",
+ "moas",
+ "soam",
+ "soma"
+ ],
+ "celoor": [
+ "cooler",
+ "recool"
+ ],
+ "aciis": [
+ "ascii",
+ "isiac"
+ ],
+ "bdeeginr": [
+ "beringed",
+ "breeding"
+ ],
+ "aciinostt": [
+ "actionist",
+ "citations"
+ ],
+ "dnoor": [
+ "donor",
+ "rondo"
+ ],
+ "einnost": [
+ "intones",
+ "stenion",
+ "tension"
+ ],
+ "ahrst": [
+ "harst",
+ "harts",
+ "tahrs",
+ "trash"
+ ],
+ "aehpss": [
+ "pashes",
+ "phases",
+ "shapes"
+ ],
+ "eeelnopv": [
+ "envelope",
+ "ovenpeel"
+ ],
+ "adein": [
+ "diane",
+ "endia",
+ "idean"
+ ],
+ "bdeers": [
+ "bredes",
+ "breeds"
+ ],
+ "adiprs": [
+ "dispar",
+ "rapids",
+ "sparid"
+ ],
+ "cdios": [
+ "disco",
+ "sodic"
+ ],
+ "defin": [
+ "fiend",
+ "fined",
+ "indef"
+ ],
+ "eimnoost": [
+ "emotions",
+ "mooniest"
+ ],
+ "aceelnrs": [
+ "cleaners",
+ "cleanser",
+ "recleans"
+ ],
+ "aabgilnru": [
+ "biangular",
+ "bulgarian"
+ ],
+ "aeelnrt": [
+ "alterne",
+ "enteral",
+ "eternal",
+ "teleran",
+ "teneral"
+ ],
+ "acehirss": [
+ "cashiers",
+ "rachises"
+ ],
+ "agmu": [
+ "gaum",
+ "guam",
+ "muga"
+ ],
+ "ceit": [
+ "ceti",
+ "cite",
+ "tice"
+ ],
+ "gip": [
+ "gip",
+ "pig"
+ ],
+ "imnsu": [
+ "minus",
+ "numis",
+ "unism"
+ ],
+ "aeeilnpst": [
+ "palestine",
+ "penalties",
+ "tapelines"
+ ],
+ "aaeimnr": [
+ "amarine",
+ "armenia"
+ ],
+ "celosst": [
+ "closest",
+ "closets"
+ ],
+ "aacdeittv": [
+ "activated",
+ "cavitated"
+ ],
+ "acersst": [
+ "actress",
+ "casters",
+ "recasts"
+ ],
+ "ilt": [
+ "lit",
+ "til"
+ ],
+ "deilss": [
+ "dessil",
+ "sidles",
+ "slides"
+ ],
+ "ailmn": [
+ "lamin",
+ "liman",
+ "milan"
+ ],
+ "deelnr": [
+ "eldern",
+ "lender",
+ "relend"
+ ],
+ "chorsu": [
+ "chorus",
+ "urochs"
+ ],
+ "cehiinrst": [
+ "christine",
+ "snitchier"
+ ],
+ "adegru": [
+ "argued",
+ "dargue"
+ ],
+ "hmnopsyy": [
+ "physnomy",
+ "symphony"
+ ],
+ "aceklr": [
+ "calker",
+ "clarke",
+ "lacker",
+ "rackle",
+ "recalk",
+ "reckla"
+ ],
+ "ilnos": [
+ "insol",
+ "isoln",
+ "linos",
+ "lions",
+ "loins",
+ "noils"
+ ],
+ "loops": [
+ "loops",
+ "polos",
+ "pools",
+ "sloop",
+ "spool"
+ ],
+ "cilry": [
+ "cyril",
+ "lyric"
+ ],
+ "aceilr": [
+ "acerli",
+ "carlie",
+ "claire",
+ "eclair",
+ "erical",
+ "lacier"
+ ],
+ "eopr": [
+ "pore",
+ "rope"
+ ],
+ "aailnort": [
+ "notarial",
+ "rational",
+ "rotalian"
+ ],
+ "efghirst": [
+ "fighters",
+ "freights",
+ "refights"
+ ],
+ "abcehmrs": [
+ "becharms",
+ "brechams",
+ "chambers"
+ ],
+ "ceeilmnopt": [
+ "emplection",
+ "incomplete"
+ ],
+ "benrru": [
+ "burner",
+ "reburn"
+ ],
+ "rsy": [
+ "yrs",
+ "syr"
+ ],
+ "foo": [
+ "foo",
+ "ofo",
+ "oof"
+ ],
+ "eeglnt": [
+ "gentle",
+ "telegn"
+ ],
+ "deeepr": [
+ "deeper",
+ "peered"
+ ],
+ "hortwy": [
+ "worthy",
+ "wrothy"
+ ],
+ "ainsst": [
+ "saints",
+ "satins",
+ "stains"
+ ],
+ "aceirrs": [
+ "carries",
+ "scarier"
+ ],
+ "dou": [
+ "duo",
+ "oud",
+ "udo"
+ ],
+ "denov": [
+ "devon",
+ "doven"
+ ],
+ "aeehln": [
+ "anhele",
+ "helena"
+ ],
+ "aessv": [
+ "saves",
+ "vases"
+ ],
+ "addeegrr": [
+ "degrader",
+ "regarded",
+ "regraded"
+ ],
+ "cdeeenptux": [
+ "unexcepted",
+ "unexpected"
+ ],
+ "aimnor": [
+ "mainor",
+ "manoir",
+ "marion",
+ "minora",
+ "morian",
+ "romain"
+ ],
+ "deilnotu": [
+ "outlined",
+ "untoiled"
+ ],
+ "aeginrtt": [
+ "gnattier",
+ "treating"
+ ],
+ "rst": [
+ "str",
+ "trs"
+ ],
+ "aaeinrrtv": [
+ "narrative",
+ "veratrina"
+ ],
+ "emnoorsu": [
+ "enormous",
+ "unmorose"
+ ],
+ "aakmr": [
+ "karma",
+ "krama",
+ "makar",
+ "marka"
+ ],
+ "cinosst": [
+ "consist",
+ "tocsins"
+ ],
+ "aclsu": [
+ "cauls",
+ "claus",
+ "scaul"
+ ],
+ "beirst": [
+ "bestir",
+ "bister",
+ "bistre",
+ "biters",
+ "bitser",
+ "tribes"
+ ],
+ "adimr": [
+ "mardi",
+ "marid"
+ ],
+ "abceinst": [
+ "bascinet",
+ "cabinets"
+ ],
+ "aehks": [
+ "hakes",
+ "shake"
+ ],
+ "aabeglr": [
+ "algebar",
+ "algebra"
+ ],
+ "illsy": [
+ "yills",
+ "silyl",
+ "silly",
+ "slily"
+ ],
+ "einrssu": [
+ "insures",
+ "rusines",
+ "russine",
+ "serinus",
+ "sunrise"
+ ],
+ "fru": [
+ "fur",
+ "urf"
+ ],
+ "eeiilmnt": [
+ "ilmenite",
+ "melinite",
+ "menilite"
+ ],
+ "adeilry": [
+ "arylide",
+ "readily"
+ ],
+ "cos": [
+ "cos",
+ "osc",
+ "soc"
+ ],
+ "dinstu": [
+ "dustin",
+ "nudist"
+ ],
+ "aadin": [
+ "andia",
+ "danai",
+ "diana",
+ "naiad"
+ ],
+ "eenrssu": [
+ "ensures",
+ "russene"
+ ],
+ "aeeilrstv": [
+ "levirates",
+ "relatives",
+ "versatile"
+ ],
+ "adilnsy": [
+ "islandy",
+ "lindsay"
+ ],
+ "aehms": [
+ "ahems",
+ "haems",
+ "hames",
+ "sahme",
+ "shame",
+ "shema"
+ ],
+ "eehlnopty": [
+ "polythene",
+ "telephony"
+ ],
+ "aaflt": [
+ "aflat",
+ "fatal"
+ ],
+ "aelorrst": [
+ "realtors",
+ "relators",
+ "restoral"
+ ],
+ "abeghinrt": [
+ "breathing",
+ "rebathing"
+ ],
+ "aacghilpr": [
+ "algraphic",
+ "graphical"
+ ],
+ "aeerrtt": [
+ "ettarre",
+ "retreat",
+ "treater"
+ ],
+ "abelry": [
+ "barely",
+ "barley",
+ "bleary",
+ "yerbal"
+ ],
+ "gru": [
+ "gur",
+ "rug"
+ ],
+ "aaiimnnst": [
+ "amanitins",
+ "maintains"
+ ],
+ "adeeinrt": [
+ "detainer",
+ "retained"
+ ],
+ "aaelmp": [
+ "palame",
+ "palmae",
+ "pamela"
+ ],
+ "adenrsw": [
+ "wanders",
+ "wardens"
+ ],
+ "abelmr": [
+ "ambler",
+ "blamer",
+ "lamber",
+ "marble",
+ "ramble"
+ ],
+ "cehimnoopr": [
+ "microphone",
+ "neomorphic"
+ ],
+ "aginst": [
+ "gainst",
+ "giants",
+ "gisant",
+ "sating"
+ ],
+ "dehs": [
+ "edhs",
+ "shed"
+ ],
+ "emmo": [
+ "memo",
+ "mome"
+ ],
+ "ahm": [
+ "ham",
+ "mah"
+ ],
+ "celnooss": [
+ "consoles",
+ "coolness"
+ ],
+ "bfi": [
+ "fbi",
+ "fib"
+ ],
+ "eelr": [
+ "leer",
+ "lere",
+ "reel"
+ ],
+ "eehrs": [
+ "heres",
+ "herse",
+ "sereh",
+ "sheer",
+ "shree"
+ ],
+ "ginops": [
+ "gipons",
+ "pingos",
+ "posing"
+ ],
+ "bdin": [
+ "bind",
+ "inbd"
+ ],
+ "adnr": [
+ "darn",
+ "nard",
+ "rand"
+ ],
+ "egnrtu": [
+ "gunter",
+ "gurnet",
+ "urgent"
+ ],
+ "chitw": [
+ "tchwi",
+ "wicht",
+ "witch"
+ ],
+ "cehno": [
+ "cohen",
+ "enoch"
+ ],
+ "eis": [
+ "ise",
+ "sei",
+ "sie"
+ ],
+ "eeiprsx": [
+ "expires",
+ "prexies"
+ ],
+ "ellms": [
+ "mells",
+ "smell"
+ ],
+ "acdeinoorst": [
+ "coordinates",
+ "decorations"
+ ],
+ "ceikrst": [
+ "rickets",
+ "sticker",
+ "tickers"
+ ],
+ "eimoprss": [
+ "imposers",
+ "promises",
+ "semipros"
+ ],
+ "bno": [
+ "bon",
+ "nob"
+ ],
+ "deeersv": [
+ "deserve",
+ "severed"
+ ],
+ "ailmot": [
+ "lomita",
+ "tomial"
+ ],
+ "achn": [
+ "chan",
+ "nach"
+ ],
+ "deiorrw": [
+ "rowdier",
+ "wordier",
+ "worried"
+ ],
+ "enstu": [
+ "suent",
+ "tunes",
+ "unset",
+ "usent"
+ ],
+ "cegimnopt": [
+ "coempting",
+ "competing"
+ ],
+ "beht": [
+ "beth",
+ "theb"
+ ],
+ "eln": [
+ "enl",
+ "len"
+ ],
+ "aehprss": [
+ "phasers",
+ "phrases",
+ "seraphs",
+ "shapers",
+ "sherpas"
+ ],
+ "aik": [
+ "aik",
+ "kai"
+ ],
+ "aceehls": [
+ "clashee",
+ "leaches"
+ ],
+ "bginor": [
+ "boring",
+ "orbing",
+ "robing"
+ ],
+ "aceehrs": [
+ "archsee",
+ "reaches",
+ "rechase"
+ ],
+ "acehms": [
+ "sachem",
+ "samech",
+ "schema"
+ ],
+ "afos": [
+ "oafs",
+ "sofa"
+ ],
+ "efiprx": [
+ "perfix",
+ "prefix"
+ ],
+ "acilu": [
+ "aulic",
+ "cauli",
+ "lucia"
+ ],
+ "aelnpst": [
+ "planets",
+ "platens"
+ ],
+ "bdeloru": [
+ "boulder",
+ "doubler"
+ ],
+ "adhlor": [
+ "harold",
+ "holard"
+ ],
+ "ajr": [
+ "jar",
+ "raj"
+ ],
+ "entt": [
+ "nett",
+ "tent"
+ ],
+ "deefiiinst": [
+ "definitise",
+ "identifies"
+ ],
+ "cklos": [
+ "locks",
+ "slock"
+ ],
+ "aelmny": [
+ "laymen",
+ "meanly",
+ "namely"
+ ],
+ "eorsu": [
+ "euros",
+ "roues",
+ "rouse"
+ ],
+ "aaeilr": [
+ "aerial",
+ "aralie",
+ "realia"
+ ],
+ "beelr": [
+ "blere",
+ "rebel"
+ ],
+ "giinors": [
+ "origins",
+ "signior",
+ "signori"
+ ],
+ "dehir": [
+ "dheri",
+ "hider",
+ "hired",
+ "rehid"
+ ],
+ "ablm": [
+ "balm",
+ "blam",
+ "lamb"
+ ],
+ "aahnnt": [
+ "nathan",
+ "thanan"
+ ],
+ "ceeinrstu": [
+ "ceintures",
+ "centuries"
+ ],
+ "dhinu": [
+ "hindu",
+ "hundi",
+ "unhid"
+ ],
+ "aaeehkqrtu": [
+ "earthquake",
+ "heartquake"
+ ],
+ "aeginssss": [
+ "assessing",
+ "gassiness"
+ ],
+ "agilnst": [
+ "anglist",
+ "lasting",
+ "salting",
+ "slating",
+ "staling"
+ ],
+ "cdeinorstu": [
+ "discounter",
+ "introduces",
+ "rediscount",
+ "reductions"
+ ],
+ "cluy": [
+ "cyul",
+ "lucy"
+ ],
+ "ahns": [
+ "hans",
+ "hasn",
+ "nash",
+ "shan"
+ ],
+ "elops": [
+ "elops",
+ "lopes",
+ "olpes",
+ "poles",
+ "slope",
+ "spole"
+ ],
+ "aeeggr": [
+ "agrege",
+ "raggee",
+ "reggae"
+ ],
+ "eopt": [
+ "peto",
+ "poet",
+ "pote",
+ "tope"
+ ],
+ "accinoprsy": [
+ "conspiracy",
+ "snipocracy"
+ ],
+ "aemnrsu": [
+ "manures",
+ "surname"
+ ],
+ "eghlooty": [
+ "ethology",
+ "theology"
+ ],
+ "ailns": [
+ "anils",
+ "nails",
+ "sinal",
+ "slain",
+ "snail"
+ ],
+ "ahstw": [
+ "swath",
+ "thaws",
+ "whats"
+ ],
+ "deirs": [
+ "dries",
+ "resid",
+ "rides",
+ "sider",
+ "sired"
+ ],
+ "ceip": [
+ "epic",
+ "pice"
+ ],
+ "anrstu": [
+ "saturn",
+ "unstar"
+ ],
+ "ntu": [
+ "nut",
+ "tun"
+ ],
+ "aeks": [
+ "kaes",
+ "keas",
+ "sake",
+ "seak"
+ ],
+ "dikss": [
+ "disks",
+ "skids"
+ ],
+ "cdnoo": [
+ "codon",
+ "condo"
+ ],
+ "abeimn": [
+ "benami",
+ "bimane",
+ "embain"
+ ],
+ "anss": [
+ "assn",
+ "sans"
+ ],
+ "bdilsu": [
+ "builds",
+ "sublid"
+ ],
+ "afhst": [
+ "hafts",
+ "shaft"
+ ],
+ "bey": [
+ "bey",
+ "bye"
+ ],
+ "cdeeorrrs": [
+ "recorders",
+ "rerecords"
+ ],
+ "eeills": [
+ "eisell",
+ "leslie",
+ "sellie"
+ ],
+ "aan": [
+ "ana",
+ "naa"
+ ],
+ "ginopsst": [
+ "postings",
+ "postsign",
+ "signpost"
+ ],
+ "adinr": [
+ "darin",
+ "dinar",
+ "drain",
+ "indra",
+ "nadir",
+ "ranid"
+ ],
+ "emnot": [
+ "entom",
+ "monte"
+ ],
+ "efirs": [
+ "fires",
+ "fries",
+ "frise",
+ "reifs",
+ "serif"
+ ],
+ "aaegilr": [
+ "algeria",
+ "argaile",
+ "lairage",
+ "railage",
+ "regalia"
+ ],
+ "bdeelss": [
+ "bedless",
+ "blessed"
+ ],
+ "aooptt": [
+ "pattoo",
+ "potato",
+ "topato"
+ ],
+ "efmorrs": [
+ "formers",
+ "reforms"
+ ],
+ "alot": [
+ "alto",
+ "lota",
+ "tola"
+ ],
+ "cceilrs": [
+ "circles",
+ "clerics"
+ ],
+ "aciilt": [
+ "clitia",
+ "italic"
+ ],
+ "ilm": [
+ "lim",
+ "mil"
+ ],
+ "abcsu": [
+ "cubas",
+ "scuba"
+ ],
+ "egor": [
+ "ergo",
+ "goer",
+ "gore",
+ "ogre",
+ "rego"
+ ],
+ "adhs": [
+ "dahs",
+ "dash",
+ "sadh",
+ "shad"
+ ],
+ "aeipssv": [
+ "passive",
+ "pavises",
+ "pavisse",
+ "spavies"
+ ],
+ "adeluv": [
+ "devaul",
+ "valued"
+ ],
+ "deerv": [
+ "derve",
+ "verde"
+ ],
+ "aceinorss": [
+ "sarcosine",
+ "scenarios"
+ ],
+ "aabmnt": [
+ "bantam",
+ "batman"
+ ],
+ "aeghinrs": [
+ "hearings",
+ "hearsing",
+ "shearing"
+ ],
+ "acelmno": [
+ "aclemon",
+ "cloamen"
+ ],
+ "aelv": [
+ "eval",
+ "lave",
+ "leva",
+ "vale",
+ "veal",
+ "vela"
+ ],
+ "aaehimn": [
+ "anaheim",
+ "anhimae"
+ ],
+ "ddeir": [
+ "dried",
+ "redid"
+ ],
+ "aeegiinnnrtt": [
+ "entertaining",
+ "intenerating"
+ ],
+ "ehlrtu": [
+ "hurtle",
+ "luther",
+ "thurle"
+ ],
+ "ginoppst": [
+ "stopping",
+ "toppings"
+ ],
+ "aelmpr": [
+ "ampler",
+ "emparl",
+ "lamper",
+ "palmer",
+ "relamp"
+ ],
+ "acinopt": [
+ "caption",
+ "paction",
+ "pontiac"
+ ],
+ "cdeinort": [
+ "centroid",
+ "doctrine"
+ ],
+ "aeinrrst": [
+ "restrain",
+ "retrains",
+ "strainer",
+ "terrains",
+ "trainers",
+ "transire"
+ ],
+ "eginsw": [
+ "sewing",
+ "swinge"
+ ],
+ "amno": [
+ "mano",
+ "moan",
+ "mona",
+ "noam",
+ "noma",
+ "oman"
+ ],
+ "cgm": [
+ "cgm",
+ "mcg"
+ ],
+ "eoopprs": [
+ "opposer",
+ "propose"
+ ],
+ "eghilrt": [
+ "lighter",
+ "relight",
+ "rightle"
+ ],
+ "adls": [
+ "lads",
+ "slad"
+ ],
+ "accistt": [
+ "tactics",
+ "tictacs"
+ ],
+ "rssttu": [
+ "struts",
+ "sturts",
+ "trusts"
+ ],
+ "aeinn": [
+ "annie",
+ "ennia",
+ "inane"
+ ],
+ "ehorrst": [
+ "rhetors",
+ "shorter"
+ ],
+ "adeginprs": [
+ "respading",
+ "spreading"
+ ],
+ "acelpr": [
+ "carpel",
+ "parcel",
+ "placer"
+ ],
+ "deefinr": [
+ "definer",
+ "refined"
+ ],
+ "aefrs": [
+ "fares",
+ "farse",
+ "fears",
+ "frase",
+ "safer"
+ ],
+ "enrtu": [
+ "enrut",
+ "tuner",
+ "urent"
+ ],
+ "arsy": [
+ "rays",
+ "ryas"
+ ],
+ "aeikl": [
+ "alike",
+ "kelia",
+ "lakie"
+ ],
+ "altw": [
+ "twal",
+ "walt"
+ ],
+ "acen": [
+ "acne",
+ "cane",
+ "nace"
+ ],
+ "bcdeklo": [
+ "blocked",
+ "deblock"
+ ],
+ "aailmw": [
+ "awalim",
+ "malawi",
+ "mawali"
+ ],
+ "aadn": [
+ "anda",
+ "dana",
+ "nada"
+ ],
+ "ahlo": [
+ "halo",
+ "hola"
+ ],
+ "cirstu": [
+ "citrus",
+ "curtis",
+ "rictus",
+ "rustic"
+ ],
+ "aaelnprt": [
+ "parental",
+ "parlante",
+ "paternal",
+ "prenatal"
+ ],
+ "agsy": [
+ "gays",
+ "sagy"
+ ],
+ "eginprss": [
+ "pressing",
+ "springes"
+ ],
+ "aaaginr": [
+ "agrania",
+ "angaria",
+ "niagara"
+ ],
+ "fin": [
+ "fin",
+ "inf"
+ ],
+ "achmrs": [
+ "charms",
+ "ramsch"
+ ],
+ "aderrt": [
+ "darter",
+ "dartre",
+ "dertra",
+ "redart",
+ "retard",
+ "retrad",
+ "tarred",
+ "trader"
+ ],
+ "aeirss": [
+ "arises",
+ "raises",
+ "serais"
+ ],
+ "egm": [
+ "gem",
+ "meg"
+ ],
+ "ceelort": [
+ "elector",
+ "electro"
+ ],
+ "ceiinorrt": [
+ "cirterion",
+ "criterion",
+ "tricerion"
+ ],
+ "abdeg": [
+ "badge",
+ "begad",
+ "debag"
+ ],
+ "irstw": [
+ "wrist",
+ "writs"
+ ],
+ "aehht": [
+ "heath",
+ "theah"
+ ],
+ "deeeimrs": [
+ "redemise",
+ "remedies"
+ ],
+ "eersttu": [
+ "surette",
+ "trustee"
+ ],
+ "efmoprrs": [
+ "performs",
+ "preforms"
+ ],
+ "aelmr": [
+ "lamer",
+ "realm"
+ ],
+ "aaeilrss": [
+ "assailer",
+ "reassail",
+ "salaries"
+ ],
+ "aimnstu": [
+ "manitus",
+ "tsunami"
+ ],
+ "achlors": [
+ "chorals",
+ "scholar"
+ ],
+ "ceikln": [
+ "nickel",
+ "nickle"
+ ],
+ "acginot": [
+ "coating",
+ "cognati",
+ "cotinga"
+ ],
+ "aelltw": [
+ "wallet",
+ "wellat"
+ ],
+ "acdeelr": [
+ "cedrela",
+ "cleared",
+ "creedal",
+ "declare",
+ "relaced"
+ ],
+ "eiilmss": [
+ "mislies",
+ "missile",
+ "similes"
+ ],
+ "aadeginr": [
+ "drainage",
+ "gardenia"
+ ],
+ "aahikrs": [
+ "kashira",
+ "shikara",
+ "sikhara"
+ ],
+ "cenorrs": [
+ "corners",
+ "scorner"
+ ],
+ "abdeorr": [
+ "arbored",
+ "boarder",
+ "broader",
+ "reboard"
+ ],
+ "aaeeginrtv": [
+ "renavigate",
+ "vegetarian"
+ ],
+ "egoru": [
+ "erugo",
+ "orgue",
+ "rogue",
+ "rouge"
+ ],
+ "aesty": [
+ "yeast",
+ "teasy"
+ ],
+ "acegilnr": [
+ "clearing",
+ "relacing"
+ ],
+ "acdeot": [
+ "coated",
+ "decoat"
+ ],
+ "deinnt": [
+ "dentin",
+ "indent",
+ "intend",
+ "tinned"
+ ],
+ "aeehinpst": [
+ "ephestian",
+ "stephanie"
+ ],
+ "eilosu": [
+ "louies",
+ "louise"
+ ],
+ "enow": [
+ "enow",
+ "owen",
+ "wone"
+ ],
+ "einorstu": [
+ "routines",
+ "rutinose",
+ "snoutier",
+ "tursenoi"
+ ],
+ "ghiintt": [
+ "hitting",
+ "tithing"
+ ],
+ "aceeilnr": [
+ "cerealin",
+ "cinereal",
+ "raceline",
+ "reliance"
+ ],
+ "abhist": [
+ "habits",
+ "tasbih"
+ ],
+ "giiknrst": [
+ "skirting",
+ "striking"
+ ],
+ "ghins": [
+ "nighs",
+ "singh"
+ ],
+ "opsttuu": [
+ "outputs",
+ "putouts"
+ ],
+ "iilnnsu": [
+ "insulin",
+ "inulins"
+ ],
+ "deew": [
+ "wede",
+ "weed"
+ ],
+ "eiiltuz": [
+ "tuilzie",
+ "utilize"
+ ],
+ "aaegln": [
+ "alange",
+ "alnage",
+ "angela",
+ "anlage",
+ "galena",
+ "lagena"
+ ],
+ "aeelrst": [
+ "elaters",
+ "laertes",
+ "realest",
+ "relates",
+ "reslate",
+ "resteal",
+ "seletar",
+ "stealer",
+ "teasler"
+ ],
+ "cdei": [
+ "cedi",
+ "dice",
+ "iced"
+ ],
+ "dmos": [
+ "doms",
+ "mods"
+ ],
+ "adeginors": [
+ "grandiose",
+ "organdies",
+ "organised",
+ "sargonide"
+ ],
+ "orsst": [
+ "sorts",
+ "ssort",
+ "sstor"
+ ],
+ "eiinorssv": [
+ "ivoriness",
+ "revisions"
+ ],
+ "deeorrst": [
+ "resorted",
+ "restored"
+ ],
+ "amorr": [
+ "armor",
+ "maror",
+ "morra"
+ ],
+ "deirrs": [
+ "derris",
+ "driers",
+ "riders"
+ ],
+ "denosz": [
+ "dozens",
+ "zendos"
+ ],
+ "aeirsv": [
+ "aivers",
+ "sairve",
+ "varies"
+ ],
+ "adgrsu": [
+ "gradus",
+ "guards"
+ ],
+ "acegilnpr": [
+ "parceling",
+ "replacing"
+ ],
+ "adeehrstw": [
+ "drawsheet",
+ "watershed"
+ ],
+ "ccilnosu": [
+ "councils",
+ "succinol"
+ ],
+ "ailrv": [
+ "rival",
+ "viral"
+ ],
+ "eipps": [
+ "pepsi",
+ "pipes"
+ ],
+ "adeln": [
+ "alden",
+ "eland",
+ "laden",
+ "lande",
+ "lenad",
+ "naled"
+ ],
+ "aelorrt": [
+ "realtor",
+ "relator"
+ ],
+ "aeiimnostt": [
+ "estimation",
+ "testimonia"
+ ],
+ "abnr": [
+ "barn",
+ "bran"
+ ],
+ "ghinpsu": [
+ "gunship",
+ "pushing"
+ ],
+ "acdeiiprt": [
+ "dipicrate",
+ "patricide",
+ "pediatric"
+ ],
+ "bco": [
+ "boc",
+ "cob"
+ ],
+ "emprs": [
+ "perms",
+ "sperm"
+ ],
+ "abdl": [
+ "bald",
+ "blad"
+ ],
+ "acprs": [
+ "carps",
+ "craps",
+ "scarp",
+ "scrap"
+ ],
+ "forst": [
+ "forst",
+ "forts",
+ "frost"
+ ],
+ "elno": [
+ "elon",
+ "enol",
+ "leno",
+ "leon",
+ "lone",
+ "noel"
+ ],
+ "achty": [
+ "cathy",
+ "cyath",
+ "yacht"
+ ],
+ "acrty": [
+ "carty",
+ "tracy"
+ ],
+ "mpt": [
+ "pmt",
+ "tpm"
+ ],
+ "abcehr": [
+ "barche",
+ "brache",
+ "breach",
+ "chaber"
+ ],
+ "aehlw": [
+ "halwe",
+ "whale",
+ "wheal"
+ ],
+ "deil": [
+ "deil",
+ "deli",
+ "diel",
+ "eild",
+ "idle",
+ "lide",
+ "lied"
+ ],
+ "agmnstu": [
+ "mustang",
+ "stagnum"
+ ],
+ "aoprst": [
+ "asport",
+ "pastor",
+ "portas",
+ "sproat"
+ ],
+ "dmu": [
+ "dum",
+ "mud"
+ ],
+ "ahkrs": [
+ "harks",
+ "shark"
+ ],
+ "abdeeilrs": [
+ "desirable",
+ "redisable"
+ ],
+ "abellt": [
+ "ballet",
+ "batell"
+ ],
+ "egiilnors": [
+ "ligroines",
+ "religions"
+ ],
+ "ehins": [
+ "eshin",
+ "hsien",
+ "shine"
+ ],
+ "befirs": [
+ "briefs",
+ "febris",
+ "fibers",
+ "fibres"
+ ],
+ "ceov": [
+ "cove",
+ "voce"
+ ],
+ "aceinnoorsstv": [
+ "conservations",
+ "conversations"
+ ],
+ "adiors": [
+ "aroids",
+ "radios"
+ ],
+ "adiinv": [
+ "avidin",
+ "vidian"
+ ],
+ "aapst": [
+ "apast",
+ "pasta",
+ "patas",
+ "tapas"
+ ],
+ "emrsu": [
+ "mures",
+ "muser",
+ "remus",
+ "serum"
+ ],
+ "eimnrtu": [
+ "minuter",
+ "runtime",
+ "unmiter",
+ "unmitre"
+ ],
+ "acflo": [
+ "falco",
+ "focal"
+ ],
+ "adinstt": [
+ "dantist",
+ "distant"
+ ],
+ "ciln": [
+ "clin",
+ "incl"
+ ],
+ "aal": [
+ "aal",
+ "ala"
+ ],
+ "aabms": [
+ "ambas",
+ "samba"
+ ],
+ "elmopy": [
+ "employ",
+ "pomely"
+ ],
+ "aacgilm": [
+ "camalig",
+ "magical"
+ ],
+ "aceilmr": [
+ "calmier",
+ "claimer",
+ "milacre",
+ "miracle",
+ "reclaim"
+ ],
+ "cdeeenrt": [
+ "centered",
+ "decenter",
+ "decentre",
+ "recedent"
+ ],
+ "aelryy": [
+ "yarely",
+ "yearly",
+ "layery"
+ ],
+ "aors": [
+ "asor",
+ "oars",
+ "oras",
+ "osar",
+ "rosa",
+ "soar",
+ "sora"
+ ],
+ "ahhs": [
+ "hahs",
+ "hash",
+ "sahh",
+ "shah"
+ ],
+ "gmp": [
+ "gpm",
+ "mpg"
+ ],
+ "aefhrst": [
+ "fathers",
+ "hafters",
+ "shafter"
+ ],
+ "deiln": [
+ "eldin",
+ "lined"
+ ],
+ "dow": [
+ "dow",
+ "owd",
+ "wod"
+ ],
+ "diu": [
+ "dui",
+ "iud",
+ "udi"
+ ],
+ "eny": [
+ "eyn",
+ "yen",
+ "nye"
+ ],
+ "iprsst": [
+ "spirts",
+ "sprits",
+ "stirps",
+ "strips"
+ ],
+ "aegnrrs": [
+ "garners",
+ "rangers"
+ ],
+ "morw": [
+ "morw",
+ "worm"
+ ],
+ "cdeeirst": [
+ "creedist",
+ "desertic",
+ "discreet",
+ "discrete"
+ ],
+ "dil": [
+ "dil",
+ "lid"
+ ],
+ "eeloprsty": [
+ "polyester",
+ "proselyte"
+ ],
+ "adef": [
+ "deaf",
+ "fade"
+ ],
+ "aehipprs": [
+ "papisher",
+ "sapphire"
+ ],
+ "aeikns": [
+ "kinase",
+ "sekani",
+ "skenai"
+ ],
+ "ikrsst": [
+ "skirts",
+ "stirks"
+ ],
+ "amst": [
+ "mast",
+ "mats",
+ "stam",
+ "tams"
+ ],
+ "abdeell": [
+ "beladle",
+ "labeled"
+ ],
+ "abeirs": [
+ "braies",
+ "braise",
+ "rabies",
+ "rebias",
+ "serbia"
+ ],
+ "ffgiinr": [
+ "griffin",
+ "riffing"
+ ],
+ "aagnuy": [
+ "guanay",
+ "guyana"
+ ],
+ "eipss": [
+ "sipes",
+ "spies",
+ "spise"
+ ],
+ "eimm": [
+ "emim",
+ "mime"
+ ],
+ "acceennortt": [
+ "concentrate",
+ "concertante"
+ ],
+ "eglnost": [
+ "longest",
+ "songlet"
+ ],
+ "inost": [
+ "nitos",
+ "sinto",
+ "stion"
+ ],
+ "ceeennsst": [
+ "senescent",
+ "sentences"
+ ],
+ "eflry": [
+ "ferly",
+ "flyer",
+ "refly"
+ ],
+ "aeps": [
+ "apes",
+ "apse",
+ "pase",
+ "peas",
+ "pesa",
+ "spae"
+ ],
+ "adegos": [
+ "dagoes",
+ "dosage",
+ "seadog"
+ ],
+ "ceeeirrsv": [
+ "receivers",
+ "reservice"
+ ],
+ "acemnoor": [
+ "cameroon",
+ "coenamor"
+ ],
+ "deeeln": [
+ "lendee",
+ "needle"
+ ],
+ "abhst": [
+ "bahts",
+ "baths"
+ ],
+ "aainnrv": [
+ "navarin",
+ "nirvana"
+ ],
+ "ademnss": [
+ "desmans",
+ "dsnames",
+ "madness"
+ ],
+ "acems": [
+ "acmes",
+ "cames",
+ "maces"
+ ],
+ "ahy": [
+ "hay",
+ "yah"
+ ],
+ "aaccdir": [
+ "arcadic",
+ "cardiac"
+ ],
+ "aailnostv": [
+ "lavations",
+ "salvation"
+ ],
+ "deorv": [
+ "dover",
+ "drove",
+ "roved",
+ "vedro",
+ "voder"
+ ],
+ "aadinr": [
+ "adrian",
+ "andira",
+ "andria",
+ "radian",
+ "randia"
+ ],
+ "aeelnrrs": [
+ "learners",
+ "relearns"
+ ],
+ "ceeeilstv": [
+ "cleveites",
+ "electives",
+ "selective"
+ ],
+ "adeiilorst": [
+ "editorials",
+ "idolatries",
+ "idolatrise",
+ "radiolites"
+ ],
+ "eeekrss": [
+ "reseeks",
+ "seekers"
+ ],
+ "ais": [
+ "ais",
+ "sai",
+ "sia"
+ ],
+ "abeelmorv": [
+ "overblame",
+ "removable"
+ ],
+ "ceimnru": [
+ "micerun",
+ "numeric",
+ "uncrime"
+ ],
+ "agiknst": [
+ "gitksan",
+ "skating",
+ "staking",
+ "takings",
+ "tasking"
+ ],
+ "belst": [
+ "belts",
+ "blest",
+ "blets"
+ ],
+ "abeerst": [
+ "beaters",
+ "berates",
+ "bestare",
+ "rebates"
+ ],
+ "eeoprrrst": [
+ "preresort",
+ "reporters"
+ ],
+ "bekru": [
+ "bruke",
+ "burke"
+ ],
+ "ceeinssty": [
+ "cysteines",
+ "necessity"
+ ],
+ "ekly": [
+ "yelk",
+ "kyle"
+ ],
+ "cersuv": [
+ "cervus",
+ "curves"
+ ],
+ "aaclr": [
+ "clara",
+ "craal"
+ ],
+ "aelrstv": [
+ "travels",
+ "varlets",
+ "vestral"
+ ],
+ "aeirvw": [
+ "waiver",
+ "wavier"
+ ],
+ "aelp": [
+ "leap",
+ "lepa",
+ "pale",
+ "peal",
+ "plea"
+ ],
+ "deghilt": [
+ "delight",
+ "lighted"
+ ],
+ "ceeimnoos": [
+ "economies",
+ "economise",
+ "monoecies"
+ ],
+ "aabceilrt": [
+ "bacterial",
+ "calibrate"
+ ],
+ "agps": [
+ "gaps",
+ "gasp",
+ "spag"
+ ],
+ "dnoors": [
+ "donors",
+ "rondos"
+ ],
+ "aat": [
+ "ata",
+ "taa"
+ ],
+ "aceehst": [
+ "escheat",
+ "teaches"
+ ],
+ "iln": [
+ "lin",
+ "nil"
+ ],
+ "aegnrrst": [
+ "granters",
+ "regrants",
+ "stranger"
+ ],
+ "adegrty": [
+ "gyrated",
+ "tragedy"
+ ],
+ "derry": [
+ "derry",
+ "dryer",
+ "redry",
+ "ryder"
+ ],
+ "abilnrtu": [
+ "tribunal",
+ "turbinal",
+ "untribal"
+ ],
+ "delru": [
+ "duler",
+ "lured",
+ "ruled",
+ "urled"
+ ],
+ "anot": [
+ "nato",
+ "nota",
+ "tano"
+ ],
+ "einnopss": [
+ "pensions",
+ "snipnose"
+ ],
+ "aeprrsy": [
+ "prayers",
+ "respray",
+ "sprayer"
+ ],
+ "eehnorw": [
+ "nowhere",
+ "whereon"
+ ],
+ "cop": [
+ "cop",
+ "cpo"
+ ],
+ "aegl": [
+ "egal",
+ "gael",
+ "gale",
+ "geal"
+ ],
+ "aellty": [
+ "lately",
+ "lealty"
+ ],
+ "acrsy": [
+ "ascry",
+ "sacry",
+ "scary",
+ "scray"
+ ],
+ "aemrsstt": [
+ "mattress",
+ "smartest",
+ "smatters"
+ ],
+ "beinru": [
+ "burnie",
+ "eburin",
+ "rubine"
+ ],
+ "eeiiklsw": [
+ "likewise",
+ "wiselike"
+ ],
+ "anst": [
+ "ants",
+ "nast",
+ "sant",
+ "stan",
+ "tans"
+ ],
+ "dilo": [
+ "dilo",
+ "diol",
+ "doli",
+ "idol",
+ "lido",
+ "olid"
+ ],
+ "deimnr": [
+ "minder",
+ "remind"
+ ],
+ "acghimnr": [
+ "charming",
+ "marching"
+ ],
+ "cdeeeprst": [
+ "respected",
+ "sceptered",
+ "spectered"
+ ],
+ "assty": [
+ "sayst",
+ "stays"
+ ],
+ "aaffir": [
+ "affair",
+ "raffia"
+ ],
+ "aehrsw": [
+ "hawser",
+ "rewash",
+ "washer"
+ ],
+ "ceirrstt": [
+ "critters",
+ "restrict",
+ "stricter"
+ ],
+ "eginprrs": [
+ "respring",
+ "springer"
+ ],
+ "eimns": [
+ "miens",
+ "mines"
+ ],
+ "bdenoru": [
+ "beround",
+ "bounder",
+ "rebound",
+ "unbored",
+ "unorbed",
+ "unrobed"
+ ],
+ "emnort": [
+ "mentor",
+ "merton",
+ "metron",
+ "montre",
+ "termon",
+ "tormen"
+ ],
+ "eefmoprrr": [
+ "performer",
+ "prereform",
+ "reperform"
+ ],
+ "deiltt": [
+ "tilted",
+ "titled"
+ ],
+ "eehprs": [
+ "herpes",
+ "hesper",
+ "sphere"
+ ],
+ "aiorst": [
+ "aorist",
+ "aristo",
+ "ratios",
+ "satori"
+ ],
+ "addelr": [
+ "ladder",
+ "larded",
+ "raddle"
+ ],
+ "aenorsst": [
+ "assentor",
+ "essorant",
+ "senators",
+ "starnose",
+ "treasons"
+ ],
+ "koortuw": [
+ "outwork",
+ "workout"
+ ],
+ "aelns": [
+ "ansel",
+ "elans",
+ "lanes",
+ "leans",
+ "senal",
+ "slane"
+ ],
+ "aginstt": [
+ "stating",
+ "tasting"
+ ],
+ "aceilnor": [
+ "acrolein",
+ "arecolin",
+ "caroline",
+ "colinear",
+ "cornelia",
+ "creolian",
+ "lonicera"
+ ],
+ "elu": [
+ "leu",
+ "lue",
+ "ule"
+ ],
+ "agiln": [
+ "algin",
+ "align",
+ "langi",
+ "liang",
+ "ligan",
+ "linga"
+ ],
+ "adeimnnot": [
+ "dentinoma",
+ "nominated"
+ ],
+ "aceellort": [
+ "electoral",
+ "recollate"
+ ],
+ "eehl": [
+ "heel",
+ "hele"
+ ],
+ "alloy": [
+ "alloy",
+ "loyal"
+ ],
+ "cdnoos": [
+ "codons",
+ "condos"
+ ],
+ "lopst": [
+ "plots",
+ "topsl"
+ ],
+ "dehilops": [
+ "depolish",
+ "polished"
+ ],
+ "alstu": [
+ "altus",
+ "latus",
+ "sault",
+ "talus",
+ "tulsa"
+ ],
+ "adrsw": [
+ "draws",
+ "sward",
+ "wards"
+ ],
+ "lou": [
+ "lou",
+ "luo"
+ ],
+ "cdeeeorrv": [
+ "overcreed",
+ "recovered"
+ ],
+ "aefrrs": [
+ "farers",
+ "fraser"
+ ],
+ "egrsu": [
+ "grues",
+ "guser",
+ "surge",
+ "urges"
+ ],
+ "aamrtu": [
+ "taruma",
+ "trauma"
+ ],
+ "addegimnn": [
+ "demanding",
+ "maddening"
+ ],
+ "lossu": [
+ "solus",
+ "souls"
+ ],
+ "aknps": [
+ "knaps",
+ "spank"
+ ],
+ "egoorv": [
+ "groove",
+ "overgo"
+ ],
+ "aeeilnortv": [
+ "relevation",
+ "revelation"
+ ],
+ "adeegilnot": [
+ "degelation",
+ "delegation"
+ ],
+ "eirsw": [
+ "swire",
+ "weirs",
+ "wires",
+ "wiser",
+ "wries"
+ ],
+ "eelpss": [
+ "sleeps",
+ "speels"
+ ],
+ "abekl": [
+ "blake",
+ "bleak",
+ "kabel"
+ ],
+ "eginr": [
+ "grein",
+ "inger",
+ "nigre",
+ "regin",
+ "reign",
+ "renig",
+ "ringe"
+ ],
+ "abcno": [
+ "bacon",
+ "banco"
+ ],
+ "aeehrt": [
+ "aether",
+ "heater",
+ "hereat",
+ "reheat"
+ ],
+ "ccirsu": [
+ "circus",
+ "crucis"
+ ],
+ "demooprt": [
+ "promoted",
+ "toperdom"
+ ],
+ "aem": [
+ "ame",
+ "eam",
+ "mae",
+ "mea"
+ ],
+ "elm": [
+ "elm",
+ "mel"
+ ],
+ "einps": [
+ "insep",
+ "peins",
+ "penis",
+ "pines",
+ "snipe",
+ "spine"
+ ],
+ "orttu": [
+ "tourt",
+ "trout",
+ "tutor"
+ ],
+ "aeilmoprrty": [
+ "polarimetry",
+ "premorality",
+ "temporarily"
+ ],
+ "ehillrrt": [
+ "rethrill",
+ "thriller"
+ ],
+ "aimnrstt": [
+ "tantrism",
+ "transmit"
+ ],
+ "adeglr": [
+ "argled",
+ "gerald",
+ "glared",
+ "regald"
+ ],
+ "deeprss": [
+ "depress",
+ "pressed"
+ ],
+ "eghnru": [
+ "hunger",
+ "rehung"
+ ],
+ "pssu": [
+ "puss",
+ "sups"
+ ],
+ "aeinnrtt": [
+ "antirent",
+ "internat",
+ "intranet"
+ ],
+ "celoss": [
+ "closes",
+ "socles"
+ ],
+ "eqs": [
+ "esq",
+ "seq"
+ ],
+ "eeinprsstt": [
+ "persistent",
+ "pinsetters",
+ "presentist",
+ "prettiness"
+ ],
+ "aeimmrssu": [
+ "summaries",
+ "summarise"
+ ],
+ "glow": [
+ "glow",
+ "gowl"
+ ],
+ "amw": [
+ "awm",
+ "maw",
+ "mwa"
+ ],
+ "deiox": [
+ "doxie",
+ "oxide"
+ ],
+ "akos": [
+ "asok",
+ "koas",
+ "oaks",
+ "okas",
+ "soak",
+ "soka"
+ ],
+ "eikr": [
+ "erik",
+ "keir",
+ "kier",
+ "reki"
+ ],
+ "ceelnorsu": [
+ "enclosure",
+ "recounsel"
+ ],
+ "aeknrw": [
+ "newark",
+ "wanker"
+ ],
+ "mnor": [
+ "morn",
+ "norm"
+ ],
+ "elrttu": [
+ "ruttle",
+ "turtle",
+ "tutler"
+ ],
+ "abinooprst": [
+ "absorption",
+ "probations",
+ "saprobiont"
+ ],
+ "abdly": [
+ "badly",
+ "baldy",
+ "blady"
+ ],
+ "alloop": [
+ "apollo",
+ "palolo"
+ ],
+ "anw": [
+ "awn",
+ "naw",
+ "wan"
+ ],
+ "aeinprs": [
+ "paniers",
+ "persian",
+ "prasine",
+ "rapines",
+ "saprine",
+ "spirane"
+ ],
+ "eeegnr": [
+ "neeger",
+ "reenge",
+ "renege"
+ ],
+ "boorst": [
+ "brosot",
+ "robots"
+ ],
+ "adej": [
+ "deja",
+ "jade"
+ ],
+ "coops": [
+ "coops",
+ "scoop"
+ ],
+ "aeginnr": [
+ "aginner",
+ "earning",
+ "engrain",
+ "geranin",
+ "grannie",
+ "nearing"
+ ],
+ "deenst": [
+ "dentes",
+ "nested",
+ "sedent",
+ "tensed"
+ ],
+ "emorsv": [
+ "movers",
+ "vomers"
+ ],
+ "abelrv": [
+ "barvel",
+ "blaver",
+ "verbal"
+ ],
+ "eelnprsty": [
+ "presently",
+ "serpently"
+ ],
+ "aess": [
+ "asse",
+ "seas"
+ ],
+ "eilst": [
+ "islet",
+ "istle",
+ "liest",
+ "lites",
+ "slite",
+ "stile",
+ "tiles"
+ ],
+ "eops": [
+ "epos",
+ "opes",
+ "peso",
+ "pose",
+ "sope"
+ ],
+ "ikloott": [
+ "kittool",
+ "toolkit"
+ ],
+ "agot": [
+ "goat",
+ "toag",
+ "toga"
+ ],
+ "deenrr": [
+ "derner",
+ "render"
+ ],
+ "ens": [
+ "ens",
+ "sen"
+ ],
+ "efgor": [
+ "forge",
+ "gofer"
+ ],
+ "ceiimmnoorsss": [
+ "commissioners",
+ "recommissions"
+ ],
+ "aberv": [
+ "brave",
+ "breva"
+ ],
+ "afluw": [
+ "awful",
+ "fulwa"
+ ],
+ "aaeilnpr": [
+ "airplane",
+ "perianal"
+ ],
+ "eenrst": [
+ "enters",
+ "ernest",
+ "nester",
+ "rentes",
+ "resent",
+ "streen",
+ "tenser",
+ "ternes"
+ ],
+ "dop": [
+ "dop",
+ "pod"
+ ],
+ "aaegsv": [
+ "agaves",
+ "savage"
+ ],
+ "blot": [
+ "blot",
+ "bolt"
+ ],
+ "ghinortw": [
+ "ingrowth",
+ "throwing",
+ "worthing"
+ ],
+ "agnow": [
+ "gowan",
+ "wagon",
+ "wonga"
+ ],
+ "adt": [
+ "dat",
+ "tad"
+ ],
+ "egru": [
+ "grue",
+ "urge"
+ ],
+ "aeeegnrst": [
+ "generates",
+ "teenagers"
+ ],
+ "krtu": [
+ "kurt",
+ "turk"
+ ],
+ "eeprs": [
+ "peers",
+ "peres",
+ "perse",
+ "prees",
+ "prese",
+ "speer",
+ "spere",
+ "spree"
+ ],
+ "orsu": [
+ "ours",
+ "rous",
+ "sour"
+ ],
+ "eefhrrs": [
+ "fresher",
+ "refresh"
+ ],
+ "belstu": [
+ "bluest",
+ "bluets",
+ "bustle",
+ "butles",
+ "sublet",
+ "subtle"
+ ],
+ "eiprsst": [
+ "esprits",
+ "persist",
+ "priests",
+ "spriest",
+ "sprites",
+ "stirpes",
+ "stripes"
+ ],
+ "ceop": [
+ "cope",
+ "opec"
+ ],
+ "acdelr": [
+ "cardel",
+ "cradle",
+ "credal",
+ "reclad"
+ ],
+ "ikkr": [
+ "kirk",
+ "rikk"
+ ],
+ "floru": [
+ "flour",
+ "fluor"
+ ],
+ "adeeglnry": [
+ "enragedly",
+ "legendary"
+ ],
+ "bloo": [
+ "bolo",
+ "bool",
+ "lobo",
+ "loob",
+ "obol"
+ ],
+ "ahmpstyy": [
+ "sympathy",
+ "symphyta"
+ ],
+ "chior": [
+ "chiro",
+ "choir",
+ "ichor"
+ ],
+ "ceepstx": [
+ "excepts",
+ "expects"
+ ],
+ "cho": [
+ "cho",
+ "hoc",
+ "och"
+ ],
+ "itw": [
+ "twi",
+ "wit"
+ ],
+ "brstu": [
+ "burst",
+ "strub"
+ ],
+ "din": [
+ "din",
+ "ind",
+ "nid"
+ ],
+ "coprsu": [
+ "corpus",
+ "croups"
+ ],
+ "adehss": [
+ "dashes",
+ "sadhes",
+ "sashed",
+ "shades"
+ ],
+ "ejst": [
+ "jest",
+ "jets"
+ ],
+ "cdeiins": [
+ "incised",
+ "indices"
+ ],
+ "ilnt": [
+ "intl",
+ "lint"
+ ],
+ "adisy": [
+ "daisy",
+ "sayid"
+ ],
+ "corrsu": [
+ "cruors",
+ "cursor"
+ ],
+ "aeeilrst": [
+ "ateliers",
+ "earliest",
+ "leariest",
+ "realties",
+ "tresaiel"
+ ],
+ "addenot": [
+ "donated",
+ "nodated"
+ ],
+ "deffstu": [
+ "destuff",
+ "stuffed"
+ ],
+ "ceinsst": [
+ "incests",
+ "insects",
+ "scenist"
+ ],
+ "aeilmnrst": [
+ "mislearnt",
+ "terminals",
+ "trailsmen",
+ "tramlines"
+ ],
+ "cderu": [
+ "crude",
+ "cured"
+ ],
+ "elmrty": [
+ "myrtle",
+ "termly"
+ ],
+ "bdeor": [
+ "boder",
+ "bored",
+ "orbed",
+ "robed"
+ ],
+ "acelnpu": [
+ "cleanup",
+ "unplace"
+ ],
+ "iknt": [
+ "knit",
+ "tink"
+ ],
+ "gmu": [
+ "gum",
+ "mug"
+ ],
+ "behort": [
+ "bother",
+ "brothe"
+ ],
+ "abhntu": [
+ "bhutan",
+ "thuban"
+ ],
+ "agimnt": [
+ "mating",
+ "taming"
+ ],
+ "addeehr": [
+ "adhered",
+ "redhead"
+ ],
+ "aeirrsv": [
+ "arrives",
+ "riserva",
+ "variers"
+ ],
+ "aahll": [
+ "allah",
+ "halal"
+ ],
+ "anpruw": [
+ "unwarp",
+ "unwrap"
+ ],
+ "dehop": [
+ "depoh",
+ "ephod",
+ "hoped"
+ ],
+ "eikp": [
+ "kepi",
+ "kipe",
+ "pike"
+ ],
+ "ghou": [
+ "hugo",
+ "ough"
+ ],
+ "aegnrw": [
+ "gnawer",
+ "wagner",
+ "wanger"
+ ],
+ "aegnrr": [
+ "garner",
+ "ranger"
+ ],
+ "ahmrs": [
+ "harms",
+ "marsh",
+ "shram"
+ ],
+ "aehtt": [
+ "hatte",
+ "theat",
+ "theta"
+ ]
+}
diff --git a/bot/resources/fun/hangman_words.txt b/bot/resources/fun/hangman_words.txt
new file mode 100644
index 00000000..5e20bfde
--- /dev/null
+++ b/bot/resources/fun/hangman_words.txt
@@ -0,0 +1,877 @@
+abandon
+ability
+able
+about
+above
+accept
+according
+account
+across
+action
+activity
+actually
+address
+administration
+admit
+adult
+affect
+after
+again
+against
+agency
+agent
+agree
+agreement
+ahead
+allow
+almost
+alone
+along
+already
+also
+although
+always
+among
+amount
+analysis
+animal
+another
+answer
+anyone
+anything
+appear
+apply
+approach
+area
+argue
+around
+arrive
+article
+artist
+assume
+attack
+attention
+attorney
+audience
+author
+authority
+available
+avoid
+away
+baby
+back
+ball
+bank
+base
+beat
+beautiful
+because
+become
+before
+begin
+behavior
+behind
+believe
+benefit
+best
+better
+between
+beyond
+bill
+billion
+black
+blood
+blue
+board
+body
+book
+born
+both
+break
+bring
+brother
+budget
+build
+building
+business
+bytecode
+call
+camera
+campaign
+cancer
+candidate
+capital
+card
+care
+career
+carry
+case
+catch
+cause
+cell
+center
+central
+century
+certain
+certainly
+chair
+challenge
+chance
+change
+character
+charge
+check
+child
+choice
+choose
+church
+citizen
+city
+civil
+claim
+class
+clear
+clearly
+close
+coach
+cold
+collection
+college
+color
+come
+commercial
+common
+community
+company
+compare
+computer
+concern
+condition
+conference
+consider
+consumer
+contain
+continue
+control
+cost
+could
+country
+couple
+course
+court
+cover
+create
+crime
+cultural
+culture
+current
+customer
+dark
+data
+daughter
+dead
+deal
+death
+debate
+decade
+decide
+decision
+deep
+defense
+degree
+describe
+design
+despite
+detail
+determine
+develop
+development
+dictionary
+difference
+different
+difficult
+dinner
+direction
+director
+discover
+discuss
+discussion
+disease
+doctor
+door
+down
+draw
+dream
+drive
+drop
+during
+each
+early
+east
+easy
+economic
+economy
+edge
+education
+effect
+effort
+eight
+either
+election
+else
+employee
+energy
+enjoy
+enough
+enter
+entire
+environment
+environmental
+especially
+establish
+even
+evening
+event
+ever
+every
+everybody
+everyone
+everything
+evidence
+exactly
+example
+executive
+exist
+expect
+experience
+expert
+explain
+face
+fact
+factor
+fall
+false
+family
+fast
+father
+fear
+federal
+feel
+feeling
+field
+fight
+figure
+fill
+film
+final
+finally
+financial
+find
+fine
+finger
+finish
+fire
+firm
+first
+fish
+five
+floor
+focus
+follow
+food
+foot
+force
+foreign
+forget
+form
+former
+forward
+four
+free
+friend
+from
+front
+full
+function
+fund
+future
+game
+garden
+general
+generation
+girl
+give
+glass
+goal
+good
+government
+great
+green
+ground
+group
+grow
+growth
+guess
+guido
+hair
+half
+hand
+hang
+happen
+happy
+hard
+have
+head
+health
+hear
+heart
+heat
+heavy
+help
+here
+herself
+high
+himself
+history
+hold
+home
+hope
+hospital
+hotel
+hour
+house
+however
+huge
+human
+hundred
+husband
+idea
+identify
+image
+imagine
+impact
+import
+important
+improve
+include
+including
+increase
+indeed
+indicate
+individual
+industry
+information
+inside
+instead
+institution
+interest
+interesting
+international
+interpreter
+interview
+into
+investment
+involve
+issue
+item
+itself
+join
+just
+keep
+kill
+kind
+kitchen
+know
+knowledge
+land
+lambda
+language
+large
+last
+late
+later
+laugh
+lawyer
+lead
+leader
+learn
+least
+leave
+left
+legal
+less
+letter
+level
+life
+light
+like
+likely
+line
+list
+listen
+little
+live
+local
+long
+look
+loop
+lose
+loss
+love
+machine
+magazine
+main
+maintain
+major
+majority
+make
+manage
+management
+manager
+many
+market
+marriage
+material
+matter
+maybe
+mean
+measure
+media
+medical
+meet
+meeting
+member
+memory
+mention
+message
+method
+middle
+might
+military
+million
+mind
+minute
+miss
+mission
+model
+modern
+moment
+money
+month
+more
+morning
+most
+mother
+mouth
+move
+movement
+movie
+much
+music
+must
+myself
+name
+nation
+national
+natural
+nature
+near
+nearly
+necessary
+need
+network
+never
+news
+newspaper
+next
+nice
+nightnone
+north
+note
+nothing
+notice
+number
+object
+occur
+offer
+office
+officer
+official
+often
+once
+only
+onto
+open
+operation
+opportunity
+option
+order
+organization
+other
+others
+outside
+over
+owner
+page
+pain
+painting
+paper
+parameters
+parent
+part
+participant
+particular
+particularly
+partner
+party
+pass
+past
+patient
+pattern
+peace
+people
+perform
+performance
+perhaps
+period
+person
+personal
+phone
+physical
+pick
+picture
+piece
+place
+plan
+plant
+play
+player
+point
+police
+policy
+political
+politics
+poor
+popular
+population
+position
+positive
+possible
+power
+practice
+prepare
+present
+president
+pressure
+pretty
+prevent
+price
+print
+private
+probably
+problem
+process
+produce
+product
+production
+professional
+professor
+program
+project
+property
+protect
+prove
+provide
+public
+pull
+purpose
+push
+pydis
+pygame
+python
+quality
+question
+quickly
+quite
+race
+radio
+raise
+range
+rate
+rather
+reach
+read
+ready
+real
+reality
+realize
+really
+reason
+receive
+recent
+recently
+recognize
+record
+reduce
+reflect
+region
+relate
+relationship
+remain
+remember
+remove
+report
+represent
+require
+research
+resource
+respond
+response
+responsibility
+rest
+result
+return
+reveal
+rich
+right
+rise
+risk
+road
+rock
+role
+room
+rule
+safe
+same
+save
+scene
+school
+science
+scientist
+score
+season
+seat
+second
+section
+security
+seek
+seem
+sell
+send
+senior
+sense
+series
+serious
+serve
+service
+seven
+several
+shake
+share
+shoot
+short
+shot
+should
+shoulder
+show
+side
+sign
+significant
+similar
+simple
+simply
+since
+sing
+single
+sister
+site
+situation
+size
+skill
+skin
+small
+smile
+social
+society
+soldier
+some
+somebody
+someone
+something
+sometimes
+song
+soon
+sort
+sound
+source
+south
+southern
+space
+speak
+special
+specific
+speech
+spend
+sport
+spring
+staff
+stage
+stand
+standard
+star
+start
+state
+statement
+station
+stay
+step
+still
+stock
+stop
+store
+story
+strategy
+street
+strong
+structure
+student
+study
+stuff
+style
+subject
+success
+successful
+such
+suddenly
+suffer
+suggest
+summer
+support
+sure
+surface
+system
+table
+take
+talk
+task
+teach
+teacher
+team
+technology
+television
+tell
+tend
+term
+test
+than
+thank
+that
+their
+them
+themselves
+then
+theory
+there
+these
+they
+thing
+think
+third
+this
+those
+though
+thought
+thousand
+threat
+three
+through
+throughout
+throw
+thus
+time
+today
+together
+tonight
+total
+tough
+toward
+town
+trade
+traditional
+training
+travel
+treat
+treatment
+tree
+trial
+trip
+trouble
+true
+truth
+turn
+type
+under
+understand
+unit
+until
+upon
+usually
+value
+variable
+various
+very
+victim
+view
+visit
+voice
+vote
+wait
+walk
+wall
+want
+watch
+water
+wear
+week
+weight
+well
+west
+western
+what
+whatever
+when
+where
+whether
+which
+while
+white
+whole
+whom
+whose
+wide
+wife
+will
+wind
+window
+wish
+with
+within
+without
+woman
+wonder
+word
+work
+worker
+world
+worry
+would
+write
+writer
+wrong
+yard
+yield
+yeah
+year
+young
+your
+yourself
diff --git a/bot/resources/fun/trivia_quiz.json b/bot/resources/fun/trivia_quiz.json
index 8008838c..99aa5f42 100644
--- a/bot/resources/fun/trivia_quiz.json
+++ b/bot/resources/fun/trivia_quiz.json
@@ -52,7 +52,7 @@
"They generally have handdrawn nature images on them."
],
"question": "What did Nintendo make before video games and toys?",
- "answer": "Hanafuda, Hanafuda cards"
+ "answer": ["Hanafuda", "Hanafuda cards"]
},
{
"id": 7,
@@ -292,22 +292,22 @@
{
"id": 201,
"question": "What is the highest power of a biquadratic polynomial?",
- "answer": "4, four"
+ "answer": ["4", "four"]
},
{
"id": 202,
"question": "What is the formula for surface area of a sphere?",
- "answer": "4pir^2, 4πr^2"
+ "answer": ["4pir^2", "4πr^2"]
},
{
"id": 203,
"question": "Which theorem states that hypotenuse^2 = base^2 + height^2?",
- "answer": "Pythagorean's, Pythagorean's theorem"
+ "answer": ["Pythagorean's", "Pythagorean's theorem"]
},
{
"id": 204,
"question": "Which trigonometric function is defined as hypotenuse/opposite?",
- "answer": "cosecant, cosec, csc"
+ "answer": ["cosecant", "cosec", "csc"]
},
{
"id": 205,
@@ -317,7 +317,7 @@
{
"id": 206,
"question": "How many quadrants are there in a cartesian plane?",
- "answer": "4, four"
+ "answer": ["4", "four"]
},
{
"id": 207,
@@ -328,7 +328,7 @@
"id": 208,
"question": "What's the following formula that finds the area of a triangle called?",
"img_url": "https://wikimedia.org/api/rest_v1/media/math/render/png/d22b8566e8187542966e8d166e72e93746a1a6fc",
- "answer": "Heron's formula, Heron"
+ "answer": ["Heron's formula", "Heron"]
},
{
"id": 209,
@@ -372,12 +372,12 @@
{
"id": 216,
"question": "In set builder notation, what does {p/q | q ≠ 0, p & q ∈ Z} represent?",
- "answer": "Rationals, Rational Numbers"
+ "answer": ["Rationals", "Rational Numbers"]
},
{
"id": 217,
"question": "What is the natural log of -1 (use i for imaginary number)?",
- "answer": "pi*i, pii, πi"
+ "answer": ["pi*i", "pii", "πi"]
},
{
"id": 218,
@@ -397,7 +397,7 @@
{
"id": 221,
"question": "Prime numbers only have __ factors.",
- "answer": "2, two"
+ "answer": ["2", "two"]
},
{
"id": 222,
@@ -408,7 +408,7 @@
"id": 223,
"question": "In statistics, what does this formula represent?",
"img_url": "https://www.statisticshowto.com/wp-content/uploads/2013/11/sample-standard-deviation.jpg",
- "answer": "sample standard deviation, standard deviation of a sample"
+ "answer": ["sample standard deviation", "standard deviation of a sample"]
},
{
"id": 224,
@@ -418,7 +418,7 @@
{
"id": 225,
"question": "A matrix multiplied by its inverse matrix equals...",
- "answer": "the identity matrix, identity matrix"
+ "answer": ["the identity matrix", "identity matrix"]
},
{
"id": 226,
@@ -429,19 +429,19 @@
{
"id": 227,
"question": "What is the only number in the entire number system which can be spelled with the same number of letters as itself?",
- "answer": "4, four"
+ "answer": ["4", "four"]
},
{
"id": 228,
"question": "1/100th of a second is also termed as what?",
- "answer": "a jiffy, jiffy, centisecond"
+ "answer": ["a jiffy", "jiffy", "centisecond"]
},
{
"id": 229,
"question": "What is this triangle called?",
- "img_url": "https://cdn.askpython.com/wp-content/uploads/2020/07/Pascals-triangle.png",
- "answer": "Pascal's triangle, Pascal"
+ "img_url": "https://wikimedia.org/api/rest_v1/media/math/render/png/23050fcb53d6083d9e42043bebf2863fa9746043",
+ "answer": ["Pascal's triangle", "Pascal"]
},
{
"id": 230,
@@ -468,17 +468,17 @@
{
"id": 304,
"question": "What do you call an organism composed of only one cell?",
- "answer": "unicellular, single-celled"
+ "answer": ["unicellular", "single-celled"]
},
{
"id": 305,
"question": "The Heisenberg's Uncertainty Principle states that the position and \\_\\_\\_\\_\\_\\_\\_\\_ of a quantum object can't be both exactly measured at the same time.",
- "answer": "velocity, momentum"
+ "answer": ["velocity", "momentum"]
},
{
"id": 306,
"question": "A \\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_ reaction is the one wherein an atom or a set of atoms is/are replaced by another atom or a set of atoms",
- "answer": "displacement, exchange"
+ "answer": ["displacement", "exchange"]
},
{
"id": 307,
@@ -512,7 +512,7 @@
{
"id": 312,
"question": "What is the intermolecular force caused by temporary and induced dipoles?",
- "answer": "LDF, London dispersion, London dispersion force"
+ "answer": ["LDF", "London dispersion", "London dispersion force"]
},
{
"id": 313,
@@ -522,7 +522,7 @@
{
"id": 314,
"question": "About how many neurons are in the human brain?\n(A. 1 billion, B. 10 billion, C. 100 billion, D. 300 billion)",
- "answer": "C, 100 billion, 100 bil"
+ "answer": ["C", "100 billion", "100 bil"]
},
{
"id": 315,
@@ -537,12 +537,12 @@
{
"id": 317,
"question": "Which vascular tissue transports water and minerals from the roots to the rest of a plant?",
- "answer": "the xylem, xylem"
+ "answer": ["the xylem", "xylem"]
},
{
"id": 318,
"question": "Who discovered the theories of relativity?",
- "answer": "Albert Einstein, Einstein"
+ "answer": ["Albert Einstein", "Einstein"]
},
{
"id": 319,
@@ -557,7 +557,7 @@
{
"id": 321,
"question": "What range of frequency are the average human ears capable of hearing?\n(A. 10Hz-10kHz, B. 20Hz-20kHz, C. 20Hz-2000Hz, D. 10kHz-20kHz)",
- "answer": "B, 20Hz-20kHz"
+ "answer": ["B", "20Hz-20kHz"]
},
{
"id": 322,
@@ -572,7 +572,7 @@
{
"id": 324,
"question": "The type of rock that is formed by the accumulation or deposition of mineral or organic particles at the Earth's surface, followed by cementation, is called...",
- "answer": "sedimentary, sedimentary rock"
+ "answer": ["sedimentary", "sedimentary rock"]
},
{
"id": 325,
@@ -582,7 +582,7 @@
{
"id": 326,
"question": "What type of image is formed by a convex mirror?",
- "answer": "virtual image, virtual"
+ "answer": ["virtual image", "virtual"]
},
{
"id": 327,
@@ -592,17 +592,17 @@
{
"id": 328,
"question": "Which law states that the global entropy in a closed system can only increase?",
- "answer": "second law, second law of thermodynamics"
+ "answer": ["second law", "second law of thermodynamics"]
},
{
"id": 329,
"question": "Which particle is emitted during the beta decay of a radioactive element?",
- "answer": "an electron, the electron, electron"
+ "answer": ["an electron", "the electron", "electron"]
},
{
"id": 330,
"question": "When DNA is unzipped, two strands are formed. What are they called (separate both answers by the word \"and\")?",
- "answer": "leading and lagging, leading strand and lagging strand"
+ "answer": ["leading and lagging", "leading strand and lagging strand"]
}
],
"cs": [
@@ -619,7 +619,7 @@
{
"id": 403,
"question": "What does SASS stand for?",
- "answer": "Syntactically Awesome Stylesheets, Syntactically Awesome Style Sheets"
+ "answer": ["Syntactically Awesome Stylesheets", "Syntactically Awesome Style Sheets"]
},
{
"id": 404,
@@ -629,7 +629,7 @@
{
"id": 405,
"question": "What is computing capable of performing exaFLOPS called?",
- "answer": "exascale computing, exascale"
+ "answer": ["exascale computing", "exascale"]
},
{
"id": 406,
@@ -654,7 +654,7 @@
{
"id": 410,
"question": "A hypothetical point in time at which technological growth becomes uncontrollable and irreversible, resulting in unforeseeable changes to human civilization is termed as...?",
- "answer": "technological singularity, singularity"
+ "answer": ["technological singularity", "singularity"]
},
{
"id": 411,
@@ -664,12 +664,12 @@
{
"id": 412,
"question": "How many bits are in a TCP checksum header?",
- "answer": "16, sixteen"
+ "answer": ["16", "sixteen"]
},
{
"id": 413,
"question": "What is the most popular protocol (as of 2021) that handles communication between email servers?",
- "answer": "SMTP, Simple Mail Transfer Protocol"
+ "answer": ["SMTP", "Simple Mail Transfer Protocol"]
},
{
"id": 414,
@@ -679,12 +679,12 @@
{
"id": 415,
"question": "Which DNS record contains mail servers of a given domain?",
- "answer": "MX, mail exchange"
+ "answer": ["MX", "mail exchange"]
},
{
"id": 416,
"question": "Which newline sequence does HTTP use?",
- "answer": "carriage return line feed, CRLF, \\r\\n"
+ "answer": ["carriage return line feed", "CRLF", "\\r\\n"]
},
{
"id": 417,
@@ -694,7 +694,7 @@
{
"id": 418,
"question": "Name a universal logic gate.",
- "answer": "NAND, NOR"
+ "answer": ["NAND", "NOR"]
},
{
"id": 419,
@@ -729,7 +729,7 @@
{
"id": 425,
"question": "What does the \"a\" represent in a HSLA color value?",
- "answer": "transparency, translucency, alpha value, alpha channel, alpha"
+ "answer": ["transparency", "translucency", "alpha value", "alpha channel", "alpha"]
},
{
"id": 426,
@@ -749,7 +749,7 @@
{
"id": 429,
"question": "Which of these sorting algorithms is not stable?\n(Counting sort, quick sort, insertion sort, tim sort, bubble sort)",
- "answer": "quick, quick sort"
+ "answer": ["quick", "quick sort"]
},
{
"id": 430,
@@ -761,7 +761,7 @@
{
"id": 501,
"question": "Is everything an instance of the `object` class (y/n)?",
- "answer": "y, yes"
+ "answer": ["y", "yes"]
},
{
"id": 502,
@@ -781,7 +781,7 @@
{
"id": 505,
"question": "Can you pickle a running `list_iterator` (y/n)?",
- "answer": "y, yes"
+ "answer": ["y", "yes"]
},
{
"id": 506,
@@ -821,12 +821,12 @@
{
"id": 513,
"question": "Where does the name Python come from?",
- "answer": "Monty Python, Monty Python's Flying Circus"
+ "answer": ["Monty Python", "Monty Python's Flying Circus"]
},
{
"id": 514,
"question": "How is infinity represented in Python?",
- "answer": "float(\"infinity\"), float('infinity'), float(\"inf\"), float('inf')"
+ "answer": ["float(\"infinity\")", "float('infinity')", "float(\"inf\")", "float('inf')"]
},
{
"id": 515,
@@ -846,12 +846,12 @@
{
"id": 518,
"question": "What decorator is used to allow a protocol to be checked at runtime?",
- "answer": "runtime_checkable, typing.runtime_checkable"
+ "answer": ["runtime_checkable", "typing.runtime_checkable"]
},
{
"id": 519,
"question": "Does `numbers.Rational` include the builtin object float (y/n)",
- "answer": "n, no"
+ "answer": ["n", "no"]
},
{
"id": 520,
@@ -866,7 +866,7 @@
{
"id": 522,
"question": "What is the garbage collection strategy used by cpython to collect everything but reference cycles?",
- "answer": "reference counting, refcounting"
+ "answer": ["reference counting", "refcounting"]
},
{
"id": 523,
@@ -891,12 +891,12 @@
{
"id": 527,
"question": "Is the `__aiter__` method async (y/n)?",
- "answer": "n, no"
+ "answer": ["n", "no"]
},
{
"id": 528,
"question": "How does one call a class who defines the behavior of their instance classes?",
- "answer": "a metaclass, metaclass"
+ "answer": ["a metaclass", "metaclass"]
},
{
"id": 529,
diff --git a/bot/resources/holidays/halloween/bat-clipart.png b/bot/resources/holidays/halloween/bat-clipart.png
index 7df26ba9..fc2f77b0 100644
--- a/bot/resources/holidays/halloween/bat-clipart.png
+++ b/bot/resources/holidays/halloween/bat-clipart.png
Binary files differ
diff --git a/bot/resources/utilities/py_topics.yaml b/bot/resources/utilities/py_topics.yaml
index a3fb2ccc..1cd2c325 100644
--- a/bot/resources/utilities/py_topics.yaml
+++ b/bot/resources/utilities/py_topics.yaml
@@ -33,7 +33,6 @@
- How often do you program in Python?
- How would you learn a new library if needed to do so?
- Have you ever worked with a microcontroller or anything physical with Python before?
- - How good would you say you are at Python so far? Beginner, intermediate, or advanced?
- Have you ever tried making your own programming language?
- Has a recently discovered Python module changed your general use of Python?
diff --git a/bot/resources/utilities/wtf_python_logo.jpg b/bot/resources/utilities/wtf_python_logo.jpg
new file mode 100644
index 00000000..851d7f9a
--- /dev/null
+++ b/bot/resources/utilities/wtf_python_logo.jpg
Binary files differ
diff --git a/bot/utils/checks.py b/bot/utils/checks.py
index 612d1ed6..8c426ed7 100644
--- a/bot/utils/checks.py
+++ b/bot/utils/checks.py
@@ -4,14 +4,7 @@ from collections.abc import Container, Iterable
from typing import Callable, Optional
from discord.ext.commands import (
- BucketType,
- CheckFailure,
- Cog,
- Command,
- CommandOnCooldown,
- Context,
- Cooldown,
- CooldownMapping,
+ BucketType, CheckFailure, Cog, Command, CommandOnCooldown, Context, Cooldown, CooldownMapping
)
from bot import constants
diff --git a/bot/utils/halloween/spookifications.py b/bot/utils/halloween/spookifications.py
index 93c5ddb9..c45ef8dc 100644
--- a/bot/utils/halloween/spookifications.py
+++ b/bot/utils/halloween/spookifications.py
@@ -1,8 +1,7 @@
import logging
from random import choice, randint
-from PIL import Image
-from PIL import ImageOps
+from PIL import Image, ImageOps
log = logging.getLogger()