From 2e878e146c10474bc1ac8c3f718f3aea76b1330a Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Wed, 14 Aug 2024 22:13:23 -0400 Subject: [PATCH 01/53] Start of Wordle --- movement/make/Makefile | 1 + movement/movement_faces.h | 1 + .../watch_faces/complication/wordle_face.c | 753 ++++++++++++++++++ .../watch_faces/complication/wordle_face.h | 86 ++ 4 files changed, 841 insertions(+) create mode 100644 movement/watch_faces/complication/wordle_face.c create mode 100644 movement/watch_faces/complication/wordle_face.h diff --git a/movement/make/Makefile b/movement/make/Makefile index da5486b0..f2b20eba 100644 --- a/movement/make/Makefile +++ b/movement/make/Makefile @@ -129,6 +129,7 @@ SRCS += \ ../watch_faces/clock/minute_repeater_decimal_face.c \ ../watch_faces/complication/tuning_tones_face.c \ ../watch_faces/complication/kitchen_conversions_face.c \ + ../watch_faces/complication/wordle_face.c \ # New watch faces go above this line. # Leave this line at the bottom of the file; it has all the targets for making your project. diff --git a/movement/movement_faces.h b/movement/movement_faces.h index 35571109..f697e724 100644 --- a/movement/movement_faces.h +++ b/movement/movement_faces.h @@ -104,6 +104,7 @@ #include "minute_repeater_decimal_face.h" #include "tuning_tones_face.h" #include "kitchen_conversions_face.h" +#include "wordle_face.h" // New includes go above this line. #endif // MOVEMENT_FACES_H_ diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c new file mode 100644 index 00000000..8cd993ee --- /dev/null +++ b/movement/watch_faces/complication/wordle_face.c @@ -0,0 +1,753 @@ +/* + * MIT License + * + * Copyright (c) 2024 <#author_name#> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include +#include +#include "wordle_face.h" + +/* +TODO: +* Add quick iteration (8x freq to get to the letter we want) +* Fix the word matching (if answer is AAAAA and we put in AACAA, the C blinks) +* Verify pressing back always work when the board is G_G_G +* Add daily streak and wait for next day +*/ + + +/* +Letter | Usage in Text +E | 12.7% +T | 9.1% But looks bad across all positions +A | 8.2% +O | 7.5% +I | 7.0% +N | 6.7% Few uses in 5 letter words than C +S | 6.3% +H | 6.1% +R | 6.0% +D | 4.3% +L | 4.0% +C | 2.8% +*/ +static const char _valid_letters[] = {'A', 'C', 'd', 'E', 'H', 'I', 'L', 'O', 'R', 'S'}; + +// From: https://github.com/charlesreid1/five-letter-words/blob/master/sgb-words.txt +static const char _legal_words[][WORDLE_LENGTH + 1] = { +"AAAAA", "SHALL", "HEARd", "ORdER", "CLOSE", "CLASS", "HORSE", "AddEd", "COLOR", "IdEAS", +"HEARd", "ORdER", "CLOSE", "CLASS", "HORSE", "AddEd", "COLOR", "IdEAS", "CRIEd", +"ORdER", "CLOSE", "CLASS", "HORSE", "AddEd", "COLOR", "IdEAS", "CRIEd", "CLEAR", +"CLOSE", "CLASS", "HORSE", "AddEd", "COLOR", "IdEAS", "CRIEd", "CLEAR", "CHILd", +"CLASS", "HORSE", "AddEd", "COLOR", "IdEAS", "CRIEd", "CLEAR", "CHILd", "SIdES", +"HORSE", "AddEd", "COLOR", "IdEAS", "CRIEd", "CLEAR", "CHILd", "SIdES", "AREAS", +"AddEd", "COLOR", "IdEAS", "CRIEd", "CLEAR", "CHILd", "SIdES", "AREAS", "SCALE", +"COLOR", "IdEAS", "CRIEd", "CLEAR", "CHILd", "SIdES", "AREAS", "SCALE", "CELLS", +"IdEAS", "CRIEd", "CLEAR", "CHILd", "SIdES", "AREAS", "SCALE", "CELLS", "AHEAd", +"CRIEd", "CLEAR", "CHILd", "SIdES", "AREAS", "SCALE", "CELLS", "AHEAd", "REACH", +"CLEAR", "CHILd", "SIdES", "AREAS", "SCALE", "CELLS", "AHEAd", "REACH", "RAdIO", +"CHILd", "SIdES", "AREAS", "SCALE", "CELLS", "AHEAd", "REACH", "RAdIO", "LOCAL", +"SIdES", "AREAS", "SCALE", "CELLS", "AHEAd", "REACH", "RAdIO", "LOCAL", "SEEdS", +"AREAS", "SCALE", "CELLS", "AHEAd", "REACH", "RAdIO", "LOCAL", "SEEdS", "CROSS", +"SCALE", "CELLS", "AHEAd", "REACH", "RAdIO", "LOCAL", "SEEdS", "CROSS", "CASES", +"CELLS", "AHEAd", "REACH", "RAdIO", "LOCAL", "SEEdS", "CROSS", "CASES", "OLdER", +"AHEAd", "REACH", "RAdIO", "LOCAL", "SEEdS", "CROSS", "CASES", "OLdER", "SHOES", +"REACH", "RAdIO", "LOCAL", "SEEdS", "CROSS", "CASES", "OLdER", "SHOES", "CHAIR", +"RAdIO", "LOCAL", "SEEdS", "CROSS", "CASES", "OLdER", "SHOES", "CHAIR", "SCORE", +"LOCAL", "SEEdS", "CROSS", "CASES", "OLdER", "SHOES", "CHAIR", "SCORE", "SHORE", +"SEEdS", "CROSS", "CASES", "OLdER", "SHOES", "CHAIR", "SCORE", "SHORE", "HEAdS", +"CROSS", "CASES", "OLdER", "SHOES", "CHAIR", "SCORE", "SHORE", "HEAdS", "dRESS", +"CASES", "OLdER", "SHOES", "CHAIR", "SCORE", "SHORE", "HEAdS", "dRESS", "SHARE", +"OLdER", "SHOES", "CHAIR", "SCORE", "SHORE", "HEAdS", "dRESS", "SHARE", "SOLId", +"SHOES", "CHAIR", "SCORE", "SHORE", "HEAdS", "dRESS", "SHARE", "SOLId", "HILLS", +"CHAIR", "SCORE", "SHORE", "HEAdS", "dRESS", "SHARE", "SOLId", "HILLS", "RAISE", +"SCORE", "SHORE", "HEAdS", "dRESS", "SHARE", "SOLId", "HILLS", "RAISE", "ROAdS", +"SHORE", "HEAdS", "dRESS", "SHARE", "SOLId", "HILLS", "RAISE", "ROAdS", "CHORd", +"HEAdS", "dRESS", "SHARE", "SOLId", "HILLS", "RAISE", "ROAdS", "CHORd", "HOLES", +"dRESS", "SHARE", "SOLId", "HILLS", "RAISE", "ROAdS", "CHORd", "HOLES", "HOLdS", +"SHARE", "SOLId", "HILLS", "RAISE", "ROAdS", "CHORd", "HOLES", "HOLdS", "CALLS", +"SOLId", "HILLS", "RAISE", "ROAdS", "CHORd", "HOLES", "HOLdS", "CALLS", "dOORS", +"HILLS", "RAISE", "ROAdS", "CHORd", "HOLES", "HOLdS", "CALLS", "dOORS", "LOOSE", +"RAISE", "ROAdS", "CHORd", "HOLES", "HOLdS", "CALLS", "dOORS", "LOOSE", "ASIdE", +"ROAdS", "CHORd", "HOLES", "HOLdS", "CALLS", "dOORS", "LOOSE", "ASIdE", "SHELL", +"CHORd", "HOLES", "HOLdS", "CALLS", "dOORS", "LOOSE", "ASIdE", "SHELL", "dRIEd", +"HOLES", "HOLdS", "CALLS", "dOORS", "LOOSE", "ASIdE", "SHELL", "dRIEd", "SHAdE", +"HOLdS", "CALLS", "dOORS", "LOOSE", "ASIdE", "SHELL", "dRIEd", "SHAdE", "CARdS", +"CALLS", "dOORS", "LOOSE", "ASIdE", "SHELL", "dRIEd", "SHAdE", "CARdS", "CHOSE", +"dOORS", "LOOSE", "ASIdE", "SHELL", "dRIEd", "SHAdE", "CARdS", "CHOSE", "SOLAR", +"LOOSE", "ASIdE", "SHELL", "dRIEd", "SHAdE", "CARdS", "CHOSE", "SOLAR", "RISES", +"ASIdE", "SHELL", "dRIEd", "SHAdE", "CARdS", "CHOSE", "SOLAR", "RISES", "SALES", +"SHELL", "dRIEd", "SHAdE", "CARdS", "CHOSE", "SOLAR", "RISES", "SALES", "ACRES", +"dRIEd", "SHAdE", "CARdS", "CHOSE", "SOLAR", "RISES", "SALES", "ACRES", "SLIdE", +"SHAdE", "CARdS", "CHOSE", "SOLAR", "RISES", "SALES", "ACRES", "SLIdE", "ERROR", +"CARdS", "CHOSE", "SOLAR", "RISES", "SALES", "ACRES", "SLIdE", "ERROR", "RACEd", +"CHOSE", "SOLAR", "RISES", "SALES", "ACRES", "SLIdE", "ERROR", "RACEd", "dRILL", +"SOLAR", "RISES", "SALES", "ACRES", "SLIdE", "ERROR", "RACEd", "dRILL", "HELLO", +"RISES", "SALES", "ACRES", "SLIdE", "ERROR", "RACEd", "dRILL", "HELLO", "LEAdS", +"SALES", "ACRES", "SLIdE", "ERROR", "RACEd", "dRILL", "HELLO", "LEAdS", "COACH", +"ACRES", "SLIdE", "ERROR", "RACEd", "dRILL", "HELLO", "LEAdS", "COACH", "REAdS", +"SLIdE", "ERROR", "RACEd", "dRILL", "HELLO", "LEAdS", "COACH", "REAdS", "HERdS", +"ERROR", "RACEd", "dRILL", "HELLO", "LEAdS", "COACH", "REAdS", "HERdS", "AROSE", +"RACEd", "dRILL", "HELLO", "LEAdS", "COACH", "REAdS", "HERdS", "AROSE", "RACES", +"dRILL", "HELLO", "LEAdS", "COACH", "REAdS", "HERdS", "AROSE", "RACES", "HEELS", +"HELLO", "LEAdS", "COACH", "REAdS", "HERdS", "AROSE", "RACES", "HEELS", "RIdER", +"LEAdS", "COACH", "REAdS", "HERdS", "AROSE", "RACES", "HEELS", "RIdER", "ROLLS", +"COACH", "REAdS", "HERdS", "AROSE", "RACES", "HEELS", "RIdER", "ROLLS", "CRASH", +"REAdS", "HERdS", "AROSE", "RACES", "HEELS", "RIdER", "ROLLS", "CRASH", "SAILS", +"HERdS", "AROSE", "RACES", "HEELS", "RIdER", "ROLLS", "CRASH", "SAILS", "ARISE", +"AROSE", "RACES", "HEELS", "RIdER", "ROLLS", "CRASH", "SAILS", "ARISE", "IdEAL", +"RACES", "HEELS", "RIdER", "ROLLS", "CRASH", "SAILS", "ARISE", "IdEAL", "CRIES", +"HEELS", "RIdER", "ROLLS", "CRASH", "SAILS", "ARISE", "IdEAL", "CRIES", "ASHES", +"RIdER", "ROLLS", "CRASH", "SAILS", "ARISE", "IdEAL", "CRIES", "ASHES", "CHASE", +"ROLLS", "CRASH", "SAILS", "ARISE", "IdEAL", "CRIES", "ASHES", "CHASE", "SLICE", +"CRASH", "SAILS", "ARISE", "IdEAL", "CRIES", "ASHES", "CHASE", "SLICE", "CHEER", +"SAILS", "ARISE", "IdEAL", "CRIES", "ASHES", "CHASE", "SLICE", "CHEER", "HIdES", +"ARISE", "IdEAL", "CRIES", "ASHES", "CHASE", "SLICE", "CHEER", "HIdES", "dEEdS", +"IdEAL", "CRIES", "ASHES", "CHASE", "SLICE", "CHEER", "HIdES", "dEEdS", "RIdES", +"CRIES", "ASHES", "CHASE", "SLICE", "CHEER", "HIdES", "dEEdS", "RIdES", "ROSES", +"ASHES", "CHASE", "SLICE", "CHEER", "HIdES", "dEEdS", "RIdES", "ROSES", "HIREd", +"CHASE", "SLICE", "CHEER", "HIdES", "dEEdS", "RIdES", "ROSES", "HIREd", "SALAd", +"SLICE", "CHEER", "HIdES", "dEEdS", "RIdES", "ROSES", "HIREd", "SALAd", "LOAdS", +"CHEER", "HIdES", "dEEdS", "RIdES", "ROSES", "HIREd", "SALAd", "LOAdS", "HEARS", +"HIdES", "dEEdS", "RIdES", "ROSES", "HIREd", "SALAd", "LOAdS", "HEARS", "LOSES", +"dEEdS", "RIdES", "ROSES", "HIREd", "SALAd", "LOAdS", "HEARS", "LOSES", "CORAL", +"RIdES", "ROSES", "HIREd", "SALAd", "LOAdS", "HEARS", "LOSES", "CORAL", "dAREd", +"ROSES", "HIREd", "SALAd", "LOAdS", "HEARS", "LOSES", "CORAL", "dAREd", "RAdAR", +"HIREd", "SALAd", "LOAdS", "HEARS", "LOSES", "CORAL", "dAREd", "RAdAR", "HAIRS", +"SALAd", "LOAdS", "HEARS", "LOSES", "CORAL", "dAREd", "RAdAR", "HAIRS", "dOLLS", +"LOAdS", "HEARS", "LOSES", "CORAL", "dAREd", "RAdAR", "HAIRS", "dOLLS", "CAREd", +"HEARS", "LOSES", "CORAL", "dAREd", "RAdAR", "HAIRS", "dOLLS", "CAREd", "SELLS", +"LOSES", "CORAL", "dAREd", "RAdAR", "HAIRS", "dOLLS", "CAREd", "SELLS", "COOLS", +"CORAL", "dAREd", "RAdAR", "HAIRS", "dOLLS", "CAREd", "SELLS", "COOLS", "HARSH", +"dAREd", "RAdAR", "HAIRS", "dOLLS", "CAREd", "SELLS", "COOLS", "HARSH", "SOILS", +"RAdAR", "HAIRS", "dOLLS", "CAREd", "SELLS", "COOLS", "HARSH", "SOILS", "REEdS", +"HAIRS", "dOLLS", "CAREd", "SELLS", "COOLS", "HARSH", "SOILS", "REEdS", "SHEER", +"dOLLS", "CAREd", "SELLS", "COOLS", "HARSH", "SOILS", "REEdS", "SHEER", "CHILL", +"CAREd", "SELLS", "COOLS", "HARSH", "SOILS", "REEdS", "SHEER", "CHILL", "CORdS", +"SELLS", "COOLS", "HARSH", "SOILS", "REEdS", "SHEER", "CHILL", "CORdS", "RAILS", +"COOLS", "HARSH", "SOILS", "REEdS", "SHEER", "CHILL", "CORdS", "RAILS", "dEALS", +"HARSH", "SOILS", "REEdS", "SHEER", "CHILL", "CORdS", "RAILS", "dEALS", "ACIdS", +"SOILS", "REEdS", "SHEER", "CHILL", "CORdS", "RAILS", "dEALS", "ACIdS", "COCOA", +"REEdS", "SHEER", "CHILL", "CORdS", "RAILS", "dEALS", "ACIdS", "COCOA", "SCARE", +"SHEER", "CHILL", "CORdS", "RAILS", "dEALS", "ACIdS", "COCOA", "SCARE", "CEASE", +"CHILL", "CORdS", "RAILS", "dEALS", "ACIdS", "COCOA", "SCARE", "CEASE", "SEALS", +"CORdS", "RAILS", "dEALS", "ACIdS", "COCOA", "SCARE", "CEASE", "SEALS", "LORdS", +"RAILS", "dEALS", "ACIdS", "COCOA", "SCARE", "CEASE", "SEALS", "LORdS", "HALLS", +"dEALS", "ACIdS", "COCOA", "SCARE", "CEASE", "SEALS", "LORdS", "HALLS", "COALS", +"ACIdS", "COCOA", "SCARE", "CEASE", "SEALS", "LORdS", "HALLS", "COALS", "ROdEO", +"COCOA", "SCARE", "CEASE", "SEALS", "LORdS", "HALLS", "COALS", "ROdEO", "COdES", +"SCARE", "CEASE", "SEALS", "LORdS", "HALLS", "COALS", "ROdEO", "COdES", "ELdER", +"CEASE", "SEALS", "LORdS", "HALLS", "COALS", "ROdEO", "COdES", "ELdER", "ROLES", +"SEALS", "LORdS", "HALLS", "COALS", "ROdEO", "COdES", "ELdER", "ROLES", "dREAd", +"LORdS", "HALLS", "COALS", "ROdEO", "COdES", "ELdER", "ROLES", "dREAd", "CEdAR", +"HALLS", "COALS", "ROdEO", "COdES", "ELdER", "ROLES", "dREAd", "CEdAR", "SLASH", +"COALS", "ROdEO", "COdES", "ELdER", "ROLES", "dREAd", "CEdAR", "SLASH", "CARES", +"ROdEO", "COdES", "ELdER", "ROLES", "dREAd", "CEdAR", "SLASH", "CARES", "IdOLS", +"COdES", "ELdER", "ROLES", "dREAd", "CEdAR", "SLASH", "CARES", "IdOLS", "OdORS", +"ELdER", "ROLES", "dREAd", "CEdAR", "SLASH", "CARES", "IdOLS", "OdORS", "EASEd", +"ROLES", "dREAd", "CEdAR", "SLASH", "CARES", "IdOLS", "OdORS", "EASEd", "CHOIR", +"dREAd", "CEdAR", "SLASH", "CARES", "IdOLS", "OdORS", "EASEd", "CHOIR", "AIdEd", +"CEdAR", "SLASH", "CARES", "IdOLS", "OdORS", "EASEd", "CHOIR", "AIdEd", "CHAOS", +"SLASH", "CARES", "IdOLS", "OdORS", "EASEd", "CHOIR", "AIdEd", "CHAOS", "LEASE", +"CARES", "IdOLS", "OdORS", "EASEd", "CHOIR", "AIdEd", "CHAOS", "LEASE", "SHEAR", +"IdOLS", "OdORS", "EASEd", "CHOIR", "AIdEd", "CHAOS", "LEASE", "SHEAR", "SLEdS", +"OdORS", "EASEd", "CHOIR", "AIdEd", "CHAOS", "LEASE", "SHEAR", "SLEdS", "COILS", +"EASEd", "CHOIR", "AIdEd", "CHAOS", "LEASE", "SHEAR", "SLEdS", "COILS", "ACHEd", +"CHOIR", "AIdEd", "CHAOS", "LEASE", "SHEAR", "SLEdS", "COILS", "ACHEd", "CELLO", +"AIdEd", "CHAOS", "LEASE", "SHEAR", "SLEdS", "COILS", "ACHEd", "CELLO", "dRIES", +"CHAOS", "LEASE", "SHEAR", "SLEdS", "COILS", "ACHEd", "CELLO", "dRIES", "OASIS", +"LEASE", "SHEAR", "SLEdS", "COILS", "ACHEd", "CELLO", "dRIES", "OASIS", "dRIER", +"SHEAR", "SLEdS", "COILS", "ACHEd", "CELLO", "dRIES", "OASIS", "dRIER", "CACAO", +"SLEdS", "COILS", "ACHEd", "CELLO", "dRIES", "OASIS", "dRIER", "CACAO", "EERIE", +"COILS", "ACHEd", "CELLO", "dRIES", "OASIS", "dRIER", "CACAO", "EERIE", "SCARS", +"ACHEd", "CELLO", "dRIES", "OASIS", "dRIER", "CACAO", "EERIE", "SCARS", "RAIdS", +"CELLO", "dRIES", "OASIS", "dRIER", "CACAO", "EERIE", "SCARS", "RAIdS", "SOLES", +"dRIES", "OASIS", "dRIER", "CACAO", "EERIE", "SCARS", "RAIdS", "SOLES", "CAROL", +"OASIS", "dRIER", "CACAO", "EERIE", "SCARS", "RAIdS", "SOLES", "CAROL", "CHESS", +"dRIER", "CACAO", "EERIE", "SCARS", "RAIdS", "SOLES", "CAROL", "CHESS", "OASES", +"CACAO", "EERIE", "SCARS", "RAIdS", "SOLES", "CAROL", "CHESS", "OASES", "ASSES", +"EERIE", "SCARS", "RAIdS", "SOLES", "CAROL", "CHESS", "OASES", "ASSES", "SHEdS", +"SCARS", "RAIdS", "SOLES", "CAROL", "CHESS", "OASES", "ASSES", "SHEdS", "CLASH", +"RAIdS", "SOLES", "CAROL", "CHESS", "OASES", "ASSES", "SHEdS", "CLASH", "dISCS", +"SOLES", "CAROL", "CHESS", "OASES", "ASSES", "SHEdS", "CLASH", "dISCS", "ERASE", +"CAROL", "CHESS", "OASES", "ASSES", "SHEdS", "CLASH", "dISCS", "ERASE", "CIdER", +"CHESS", "OASES", "ASSES", "SHEdS", "CLASH", "dISCS", "ERASE", "CIdER", "SHALE", +"OASES", "ASSES", "SHEdS", "CLASH", "dISCS", "ERASE", "CIdER", "SHALE", "AISLE", +"ASSES", "SHEdS", "CLASH", "dISCS", "ERASE", "CIdER", "SHALE", "AISLE", "HEIRS", +"SHEdS", "CLASH", "dISCS", "ERASE", "CIdER", "SHALE", "AISLE", "HEIRS", "ROARS", +"CLASH", "dISCS", "ERASE", "CIdER", "SHALE", "AISLE", "HEIRS", "ROARS", "SCOLd", +"dISCS", "ERASE", "CIdER", "SHALE", "AISLE", "HEIRS", "ROARS", "SCOLd", "LEASH", +"ERASE", "CIdER", "SHALE", "AISLE", "HEIRS", "ROARS", "SCOLd", "LEASH", "LASSO", +"CIdER", "SHALE", "AISLE", "HEIRS", "ROARS", "SCOLd", "LEASH", "LASSO", "CHORE", +"SHALE", "AISLE", "HEIRS", "ROARS", "SCOLd", "LEASH", "LASSO", "CHORE", "LACEd", +"AISLE", "HEIRS", "ROARS", "SCOLd", "LEASH", "LASSO", "CHORE", "LACEd", "dOSES", +"HEIRS", "ROARS", "SCOLd", "LEASH", "LASSO", "CHORE", "LACEd", "dOSES", "COLdS", +"ROARS", "SCOLd", "LEASH", "LASSO", "CHORE", "LACEd", "dOSES", "COLdS", "CORES", +"SCOLd", "LEASH", "LASSO", "CHORE", "LACEd", "dOSES", "COLdS", "CORES", "CHILI", +"LEASH", "LASSO", "CHORE", "LACEd", "dOSES", "COLdS", "CORES", "CHILI", "EASEL", +"LASSO", "CHORE", "LACEd", "dOSES", "COLdS", "CORES", "CHILI", "EASEL", "LACES", +"CHORE", "LACEd", "dOSES", "COLdS", "CORES", "CHILI", "EASEL", "LACES", "HORdE", +"LACEd", "dOSES", "COLdS", "CORES", "CHILI", "EASEL", "LACES", "HORdE", "LASER", +"dOSES", "COLdS", "CORES", "CHILI", "EASEL", "LACES", "HORdE", "LASER", "HARES", +"COLdS", "CORES", "CHILI", "EASEL", "LACES", "HORdE", "LASER", "HARES", "CREEd", +"CORES", "CHILI", "EASEL", "LACES", "HORdE", "LASER", "HARES", "CREEd", "LILAC", +"CHILI", "EASEL", "LACES", "HORdE", "LASER", "HARES", "CREEd", "LILAC", "HOOdS", +"EASEL", "LACES", "HORdE", "LASER", "HARES", "CREEd", "LILAC", "HOOdS", "ROACH", +"LACES", "HORdE", "LASER", "HARES", "CREEd", "LILAC", "HOOdS", "ROACH", "dIALS", +"HORdE", "LASER", "HARES", "CREEd", "LILAC", "HOOdS", "ROACH", "dIALS", "SOLOS", +"LASER", "HARES", "CREEd", "LILAC", "HOOdS", "ROACH", "dIALS", "SOLOS", "SISAL", +"HARES", "CREEd", "LILAC", "HOOdS", "ROACH", "dIALS", "SOLOS", "SISAL", "HOSES", +"CREEd", "LILAC", "HOOdS", "ROACH", "dIALS", "SOLOS", "SISAL", "HOSES", "dARES", +"LILAC", "HOOdS", "ROACH", "dIALS", "SOLOS", "SISAL", "HOSES", "dARES", "ACHES", +"HOOdS", "ROACH", "dIALS", "SOLOS", "SISAL", "HOSES", "dARES", "ACHES", "LOSER", +"ROACH", "dIALS", "SOLOS", "SISAL", "HOSES", "dARES", "ACHES", "LOSER", "LAdLE", +"dIALS", "SOLOS", "SISAL", "HOSES", "dARES", "ACHES", "LOSER", "LAdLE", "RAdII", +"SOLOS", "SISAL", "HOSES", "dARES", "ACHES", "LOSER", "LAdLE", "RAdII", "SORES", +"SISAL", "HOSES", "dARES", "ACHES", "LOSER", "LAdLE", "RAdII", "SORES", "RELIC", +"HOSES", "dARES", "ACHES", "LOSER", "LAdLE", "RAdII", "SORES", "RELIC", "AIdES", +"dARES", "ACHES", "LOSER", "LAdLE", "RAdII", "SORES", "RELIC", "AIdES", "ALdER", +"ACHES", "LOSER", "LAdLE", "RAdII", "SORES", "RELIC", "AIdES", "ALdER", "COdEd", +"LOSER", "LAdLE", "RAdII", "SORES", "RELIC", "AIdES", "ALdER", "COdEd", "ISLES", +"LAdLE", "RAdII", "SORES", "RELIC", "AIdES", "ALdER", "COdEd", "ISLES", "CLOdS", +"RAdII", "SORES", "RELIC", "AIdES", "ALdER", "COdEd", "ISLES", "CLOdS", "AdORE", +"SORES", "RELIC", "AIdES", "ALdER", "COdEd", "ISLES", "CLOdS", "AdORE", "RARER", +"RELIC", "AIdES", "ALdER", "COdEd", "ISLES", "CLOdS", "AdORE", "RARER", "SILLS", +"AIdES", "ALdER", "COdEd", "ISLES", "CLOdS", "AdORE", "RARER", "SILLS", "SHOAL", +"ALdER", "COdEd", "ISLES", "CLOdS", "AdORE", "RARER", "SILLS", "SHOAL", "CACHE", +"COdEd", "ISLES", "CLOdS", "AdORE", "RARER", "SILLS", "SHOAL", "CACHE", "REELS", +"ISLES", "CLOdS", "AdORE", "RARER", "SILLS", "SHOAL", "CACHE", "REELS", "LIARS", +"CLOdS", "AdORE", "RARER", "SILLS", "SHOAL", "CACHE", "REELS", "LIARS", "SOARS", +"AdORE", "RARER", "SILLS", "SHOAL", "CACHE", "REELS", "LIARS", "SOARS", "SIdEd", +"RARER", "SILLS", "SHOAL", "CACHE", "REELS", "LIARS", "SOARS", "SIdEd", "HEALS", +"SILLS", "SHOAL", "CACHE", "REELS", "LIARS", "SOARS", "SIdEd", "HEALS", "SOdAS", +"SHOAL", "CACHE", "REELS", "LIARS", "SOARS", "SIdEd", "HEALS", "SOdAS", "ERREd", +"CACHE", "REELS", "LIARS", "SOARS", "SIdEd", "HEALS", "SOdAS", "ERREd", "ARdOR", +"REELS", "LIARS", "SOARS", "SIdEd", "HEALS", "SOdAS", "ERREd", "ARdOR", "HIRES", +"LIARS", "SOARS", "SIdEd", "HEALS", "SOdAS", "ERREd", "ARdOR", "HIRES", "LEECH", +"SOARS", "SIdEd", "HEALS", "SOdAS", "ERREd", "ARdOR", "HIRES", "LEECH", "EROdE", +"SIdEd", "HEALS", "SOdAS", "ERREd", "ARdOR", "HIRES", "LEECH", "EROdE", "HOARd", +"HEALS", "SOdAS", "ERREd", "ARdOR", "HIRES", "LEECH", "EROdE", "HOARd", "COOEd", +"SOdAS", "ERREd", "ARdOR", "HIRES", "LEECH", "EROdE", "HOARd", "COOEd", "SHREd", +"ERREd", "ARdOR", "HIRES", "LEECH", "EROdE", "HOARd", "COOEd", "SHREd", "SLOSH", +"ARdOR", "HIRES", "LEECH", "EROdE", "HOARd", "COOEd", "SHREd", "SLOSH", "CHIdE", +"HIRES", "LEECH", "EROdE", "HOARd", "COOEd", "SHREd", "SLOSH", "CHIdE", "EASES", +"LEECH", "EROdE", "HOARd", "COOEd", "SHREd", "SLOSH", "CHIdE", "EASES", "HALOS", +"EROdE", "HOARd", "COOEd", "SHREd", "SLOSH", "CHIdE", "EASES", "HALOS", "ACRId", +"HOARd", "COOEd", "SHREd", "SLOSH", "CHIdE", "EASES", "HALOS", "ACRId", "EIdER", +"COOEd", "SHREd", "SLOSH", "CHIdE", "EASES", "HALOS", "ACRId", "EIdER", "AddER", +"SHREd", "SLOSH", "CHIdE", "EASES", "HALOS", "ACRId", "EIdER", "AddER", "dEARS", +"SLOSH", "CHIdE", "EASES", "HALOS", "ACRId", "EIdER", "AddER", "dEARS", "SEERS", +"CHIdE", "EASES", "HALOS", "ACRId", "EIdER", "AddER", "dEARS", "SEERS", "OddER", +"EASES", "HALOS", "ACRId", "EIdER", "AddER", "dEARS", "SEERS", "OddER", "SIdLE", +"HALOS", "ACRId", "EIdER", "AddER", "dEARS", "SEERS", "OddER", "SIdLE", "dOLEd", +"ACRId", "EIdER", "AddER", "dEARS", "SEERS", "OddER", "SIdLE", "dOLEd", "HAILS", +"EIdER", "AddER", "dEARS", "SEERS", "OddER", "SIdLE", "dOLEd", "HAILS", "AIREd", +"AddER", "dEARS", "SEERS", "OddER", "SIdLE", "dOLEd", "HAILS", "AIREd", "COCCI", +"dEARS", "SEERS", "OddER", "SIdLE", "dOLEd", "HAILS", "AIREd", "COCCI", "SILOS", +"SEERS", "OddER", "SIdLE", "dOLEd", "HAILS", "AIREd", "COCCI", "SILOS", "dOSEd", +"OddER", "SIdLE", "dOLEd", "HAILS", "AIREd", "COCCI", "SILOS", "dOSEd", "RILLS", +"SIdLE", "dOLEd", "HAILS", "AIREd", "COCCI", "SILOS", "dOSEd", "RILLS", "EARLS", +"dOLEd", "HAILS", "AIREd", "COCCI", "SILOS", "dOSEd", "RILLS", "EARLS", "LAIRS", +"HAILS", "AIREd", "COCCI", "SILOS", "dOSEd", "RILLS", "EARLS", "LAIRS", "IdLER", +"AIREd", "COCCI", "SILOS", "dOSEd", "RILLS", "EARLS", "LAIRS", "IdLER", "SCALd", +"COCCI", "SILOS", "dOSEd", "RILLS", "EARLS", "LAIRS", "IdLER", "SCALd", "AdIOS", +"SILOS", "dOSEd", "RILLS", "EARLS", "LAIRS", "IdLER", "SCALd", "AdIOS", "dALES", +"dOSEd", "RILLS", "EARLS", "LAIRS", "IdLER", "SCALd", "AdIOS", "dALES", "HEEdS", +"RILLS", "EARLS", "LAIRS", "IdLER", "SCALd", "AdIOS", "dALES", "HEEdS", "CEdEd", +"EARLS", "LAIRS", "IdLER", "SCALd", "AdIOS", "dALES", "HEEdS", "CEdEd", "LARCH", +"LAIRS", "IdLER", "SCALd", "AdIOS", "dALES", "HEEdS", "CEdEd", "LARCH", "dOLES", +"IdLER", "SCALd", "AdIOS", "dALES", "HEEdS", "CEdEd", "LARCH", "dOLES", "dROOL", +"SCALd", "AdIOS", "dALES", "HEEdS", "CEdEd", "LARCH", "dOLES", "dROOL", "dELLS", +"AdIOS", "dALES", "HEEdS", "CEdEd", "LARCH", "dOLES", "dROOL", "dELLS", "COCOS", +"dALES", "HEEdS", "CEdEd", "LARCH", "dOLES", "dROOL", "dELLS", "COCOS", "LEERS", +"HEEdS", "CEdEd", "LARCH", "dOLES", "dROOL", "dELLS", "COCOS", "LEERS", "ALIAS", +"CEdEd", "LARCH", "dOLES", "dROOL", "dELLS", "COCOS", "LEERS", "ALIAS", "dICEd", +"LARCH", "dOLES", "dROOL", "dELLS", "COCOS", "LEERS", "ALIAS", "dICEd", "LOdES", +"dOLES", "dROOL", "dELLS", "COCOS", "LEERS", "ALIAS", "dICEd", "LOdES", "IdLEd", +"dROOL", "dELLS", "COCOS", "LEERS", "ALIAS", "dICEd", "LOdES", "IdLEd", "RACER", +"dELLS", "COCOS", "LEERS", "ALIAS", "dICEd", "LOdES", "IdLEd", "RACER", "AILEd", +"COCOS", "LEERS", "ALIAS", "dICEd", "LOdES", "IdLEd", "RACER", "AILEd", "HERES", +"LEERS", "ALIAS", "dICEd", "LOdES", "IdLEd", "RACER", "AILEd", "HERES", "IdLES", +"ALIAS", "dICEd", "LOdES", "IdLEd", "RACER", "AILEd", "HERES", "IdLES", "dOdOS", +"dICEd", "LOdES", "IdLEd", "RACER", "AILEd", "HERES", "IdLES", "dOdOS", "HELLS", +"LOdES", "IdLEd", "RACER", "AILEd", "HERES", "IdLES", "dOdOS", "HELLS", "SOLEd", +"IdLEd", "RACER", "AILEd", "HERES", "IdLES", "dOdOS", "HELLS", "SOLEd", "CASEd", +"RACER", "AILEd", "HERES", "IdLES", "dOdOS", "HELLS", "SOLEd", "CASEd", "COEdS", +"AILEd", "HERES", "IdLES", "dOdOS", "HELLS", "SOLEd", "CASEd", "COEdS", "LORES", +"HERES", "IdLES", "dOdOS", "HELLS", "SOLEd", "CASEd", "COEdS", "LORES", "REARS", +"IdLES", "dOdOS", "HELLS", "SOLEd", "CASEd", "COEdS", "LORES", "REARS", "COLIC", +"dOdOS", "HELLS", "SOLEd", "CASEd", "COEdS", "LORES", "REARS", "COLIC", "SIRES", +"HELLS", "SOLEd", "CASEd", "COEdS", "LORES", "REARS", "COLIC", "SIRES", "SORER", +"SOLEd", "CASEd", "COEdS", "LORES", "REARS", "COLIC", "SIRES", "SORER", "LOLLS", +"CASEd", "COEdS", "LORES", "REARS", "COLIC", "SIRES", "SORER", "LOLLS", "SCAdS", +"COEdS", "LORES", "REARS", "COLIC", "SIRES", "SORER", "LOLLS", "SCAdS", "LEACH", +"LORES", "REARS", "COLIC", "SIRES", "SORER", "LOLLS", "SCAdS", "LEACH", "ARCEd", +"REARS", "COLIC", "SIRES", "SORER", "LOLLS", "SCAdS", "LEACH", "ARCEd", "COREd", +"COLIC", "SIRES", "SORER", "LOLLS", "SCAdS", "LEACH", "ARCEd", "COREd", "dEAdS", +"SIRES", "SORER", "LOLLS", "SCAdS", "LEACH", "ARCEd", "COREd", "dEAdS", "dROLL", +"SORER", "LOLLS", "SCAdS", "LEACH", "ARCEd", "COREd", "dEAdS", "dROLL", "dICES", +"LOLLS", "SCAdS", "LEACH", "ARCEd", "COREd", "dEAdS", "dROLL", "dICES", "CEdES", +"SCAdS", "LEACH", "ARCEd", "COREd", "dEAdS", "dROLL", "dICES", "CEdES", "HOSEd", +"LEACH", "ARCEd", "COREd", "dEAdS", "dROLL", "dICES", "CEdES", "HOSEd", "CRESS", +"ARCEd", "COREd", "dEAdS", "dROLL", "dICES", "CEdES", "HOSEd", "CRESS", "ICIER", +"COREd", "dEAdS", "dROLL", "dICES", "CEdES", "HOSEd", "CRESS", "ICIER", "LARdS", +"dEAdS", "dROLL", "dICES", "CEdES", "HOSEd", "CRESS", "ICIER", "LARdS", "HEROS", +"dROLL", "dICES", "CEdES", "HOSEd", "CRESS", "ICIER", "LARdS", "HEROS", "SHOOS", +"dICES", "CEdES", "HOSEd", "CRESS", "ICIER", "LARdS", "HEROS", "SHOOS", "dECAL", +"CEdES", "HOSEd", "CRESS", "ICIER", "LARdS", "HEROS", "SHOOS", "dECAL", "CILIA", +"HOSEd", "CRESS", "ICIER", "LARdS", "HEROS", "SHOOS", "dECAL", "CILIA", "SEARS", +"CRESS", "ICIER", "LARdS", "HEROS", "SHOOS", "dECAL", "CILIA", "SEARS", "SARIS", +"ICIER", "LARdS", "HEROS", "SHOOS", "dECAL", "CILIA", "SEARS", "SARIS", "dILLS", +"LARdS", "HEROS", "SHOOS", "dECAL", "CILIA", "SEARS", "SARIS", "dILLS", "OILEd", +"HEROS", "SHOOS", "dECAL", "CILIA", "SEARS", "SARIS", "dILLS", "OILEd", "dOERS", +"SHOOS", "dECAL", "CILIA", "SEARS", "SARIS", "dILLS", "OILEd", "dOERS", "ALOHA", +"dECAL", "CILIA", "SEARS", "SARIS", "dILLS", "OILEd", "dOERS", "ALOHA", "RISER", +"CILIA", "SEARS", "SARIS", "dILLS", "OILEd", "dOERS", "ALOHA", "RISER", "CRIER", +"SEARS", "SARIS", "dILLS", "OILEd", "dOERS", "ALOHA", "RISER", "CRIER", "LOESS", +"SARIS", "dILLS", "OILEd", "dOERS", "ALOHA", "RISER", "CRIER", "LOESS", "dECOR", +"dILLS", "OILEd", "dOERS", "ALOHA", "RISER", "CRIER", "LOESS", "dECOR", "SHIEd", +"OILEd", "dOERS", "ALOHA", "RISER", "CRIER", "LOESS", "dECOR", "SHIEd", "dROSS", +"dOERS", "ALOHA", "RISER", "CRIER", "LOESS", "dECOR", "SHIEd", "dROSS", "CREdO", +"ALOHA", "RISER", "CRIER", "LOESS", "dECOR", "SHIEd", "dROSS", "CREdO", "ALOES", +"RISER", "CRIER", "LOESS", "dECOR", "SHIEd", "dROSS", "CREdO", "ALOES", "dIOdE", +"CRIER", "LOESS", "dECOR", "SHIEd", "dROSS", "CREdO", "ALOES", "dIOdE", "COHOS", +"LOESS", "dECOR", "SHIEd", "dROSS", "CREdO", "ALOES", "dIOdE", "COHOS", "SIREE", +"dECOR", "SHIEd", "dROSS", "CREdO", "ALOES", "dIOdE", "COHOS", "SIREE", "OCHRE", +"SHIEd", "dROSS", "CREdO", "ALOES", "dIOdE", "COHOS", "SIREE", "OCHRE", "SIREd", +"dROSS", "CREdO", "ALOES", "dIOdE", "COHOS", "SIREE", "OCHRE", "SIREd", "CAdRE", +"CREdO", "ALOES", "dIOdE", "COHOS", "SIREE", "OCHRE", "SIREd", "CAdRE", "ECHOS", +"ALOES", "dIOdE", "COHOS", "SIREE", "OCHRE", "SIREd", "CAdRE", "ECHOS", "RILEd", +"dIOdE", "COHOS", "SIREE", "OCHRE", "SIREd", "CAdRE", "ECHOS", "RILEd", "CIRCA", +"COHOS", "SIREE", "OCHRE", "SIREd", "CAdRE", "ECHOS", "RILEd", "CIRCA", "HALLO", +"SIREE", "OCHRE", "SIREd", "CAdRE", "ECHOS", "RILEd", "CIRCA", "HALLO", "SHIES", +"OCHRE", "SIREd", "CAdRE", "ECHOS", "RILEd", "CIRCA", "HALLO", "SHIES", "HOLEd", +"SIREd", "CAdRE", "ECHOS", "RILEd", "CIRCA", "HALLO", "SHIES", "HOLEd", "SEdER", +"CAdRE", "ECHOS", "RILEd", "CIRCA", "HALLO", "SHIES", "HOLEd", "SEdER", "REALS", +"ECHOS", "RILEd", "CIRCA", "HALLO", "SHIES", "HOLEd", "SEdER", "REALS", "AERIE", +"RILEd", "CIRCA", "HALLO", "SHIES", "HOLEd", "SEdER", "REALS", "AERIE", "CRASS", +"CIRCA", "HALLO", "SHIES", "HOLEd", "SEdER", "REALS", "AERIE", "CRASS", "dACHA", +"HALLO", "SHIES", "HOLEd", "SEdER", "REALS", "AERIE", "CRASS", "dACHA", "ACHOO", +"SHIES", "HOLEd", "SEdER", "REALS", "AERIE", "CRASS", "dACHA", "ACHOO", "dREAR", +"HOLEd", "SEdER", "REALS", "AERIE", "CRASS", "dACHA", "ACHOO", "dREAR", "ARIAS", +"SEdER", "REALS", "AERIE", "CRASS", "dACHA", "ACHOO", "dREAR", "ARIAS", "HOOCH", +"REALS", "AERIE", "CRASS", "dACHA", "ACHOO", "dREAR", "ARIAS", "HOOCH", "SHILL", +"AERIE", "CRASS", "dACHA", "ACHOO", "dREAR", "ARIAS", "HOOCH", "SHILL", "AHHHH", +"CRASS", "dACHA", "ACHOO", "dREAR", "ARIAS", "HOOCH", "SHILL", "AHHHH", "SHISH", +"dACHA", "ACHOO", "dREAR", "ARIAS", "HOOCH", "SHILL", "AHHHH", "SHISH", "RILES", +"ACHOO", "dREAR", "ARIAS", "HOOCH", "SHILL", "AHHHH", "SHISH", "RILES", "HEERd", +"dREAR", "ARIAS", "HOOCH", "SHILL", "AHHHH", "SHISH", "RILES", "HEERd", "CREEL", +"ARIAS", "HOOCH", "SHILL", "AHHHH", "SHISH", "RILES", "HEERd", "CREEL", "RHEAS", +"HOOCH", "SHILL", "AHHHH", "SHISH", "RILES", "HEERd", "CREEL", "RHEAS", "COdER", +"SHILL", "AHHHH", "SHISH", "RILES", "HEERd", "CREEL", "RHEAS", "COdER", "HALEd", +"AHHHH", "SHISH", "RILES", "HEERd", "CREEL", "RHEAS", "COdER", "HALEd", "CHARd", +"SHISH", "RILES", "HEERd", "CREEL", "RHEAS", "COdER", "HALEd", "CHARd", "SHOEd", +"RILES", "HEERd", "CREEL", "RHEAS", "COdER", "HALEd", "CHARd", "SHOEd", "ESSES", +"HEERd", "CREEL", "RHEAS", "COdER", "HALEd", "CHARd", "SHOEd", "ESSES", "EAREd", +"CREEL", "RHEAS", "COdER", "HALEd", "CHARd", "SHOEd", "ESSES", "EAREd", "ELIdE", +"RHEAS", "COdER", "HALEd", "CHARd", "SHOEd", "ESSES", "EAREd", "ELIdE", "SALSA", +"COdER", "HALEd", "CHARd", "SHOEd", "ESSES", "EAREd", "ELIdE", "SALSA", "AHOLd", +"HALEd", "CHARd", "SHOEd", "ESSES", "EAREd", "ELIdE", "SALSA", "AHOLd", "SHAHS", +"CHARd", "SHOEd", "ESSES", "EAREd", "ELIdE", "SALSA", "AHOLd", "SHAHS", "dISCO", +"SHOEd", "ESSES", "EAREd", "ELIdE", "SALSA", "AHOLd", "SHAHS", "dISCO", "SHARd", +"ESSES", "EAREd", "ELIdE", "SALSA", "AHOLd", "SHAHS", "dISCO", "SHARd", "CORER", +"EAREd", "ELIdE", "SALSA", "AHOLd", "SHAHS", "dISCO", "SHARd", "CORER", "COLAS", +"ELIdE", "SALSA", "AHOLd", "SHAHS", "dISCO", "SHARd", "CORER", "COLAS", "dROId", +"SALSA", "AHOLd", "SHAHS", "dISCO", "SHARd", "CORER", "COLAS", "dROId", "OLdIE", +"AHOLd", "SHAHS", "dISCO", "SHARd", "CORER", "COLAS", "dROId", "OLdIE", "COdAS", +"SHAHS", "dISCO", "SHARd", "CORER", "COLAS", "dROId", "OLdIE", "COdAS", "ORCAS", +"dISCO", "SHARd", "CORER", "COLAS", "dROId", "OLdIE", "COdAS", "ORCAS", "HALES", +"SHARd", "CORER", "COLAS", "dROId", "OLdIE", "COdAS", "ORCAS", "HALES", "REdId", +"CORER", "COLAS", "dROId", "OLdIE", "COdAS", "ORCAS", "HALES", "REdId", "dAdOS", +"COLAS", "dROId", "OLdIE", "COdAS", "ORCAS", "HALES", "REdId", "dAdOS", "CLAdS", +"dROId", "OLdIE", "COdAS", "ORCAS", "HALES", "REdId", "dAdOS", "CLAdS", "OOdLE", +"OLdIE", "COdAS", "ORCAS", "HALES", "REdId", "dAdOS", "CLAdS", "OOdLE", "HIdER", +"COdAS", "ORCAS", "HALES", "REdId", "dAdOS", "CLAdS", "OOdLE", "HIdER", "dELIS", +"ORCAS", "HALES", "REdId", "dAdOS", "CLAdS", "OOdLE", "HIdER", "dELIS", "SCROd", +"HALES", "REdId", "dAdOS", "CLAdS", "OOdLE", "HIdER", "dELIS", "SCROd", "SHIRE", +"REdId", "dAdOS", "CLAdS", "OOdLE", "HIdER", "dELIS", "SCROd", "SHIRE", "AddLE", +"dAdOS", "CLAdS", "OOdLE", "HIdER", "dELIS", "SCROd", "SHIRE", "AddLE", "dEICE", +"CLAdS", "OOdLE", "HIdER", "dELIS", "SCROd", "SHIRE", "AddLE", "dEICE", "ORALS", +"OOdLE", "HIdER", "dELIS", "SCROd", "SHIRE", "AddLE", "dEICE", "ORALS", "HIRER", +"HIdER", "dELIS", "SCROd", "SHIRE", "AddLE", "dEICE", "ORALS", "HIRER", "ROILS", +"dELIS", "SCROd", "SHIRE", "AddLE", "dEICE", "ORALS", "HIRER", "ROILS", "dOLOR", +"SCROd", "SHIRE", "AddLE", "dEICE", "ORALS", "HIRER", "ROILS", "dOLOR", "ILIAC", +"SHIRE", "AddLE", "dEICE", "ORALS", "HIRER", "ROILS", "dOLOR", "ILIAC", "CILLS", +"AddLE", "dEICE", "ORALS", "HIRER", "ROILS", "dOLOR", "ILIAC", "CILLS", "LOCOS", +"dEICE", "ORALS", "HIRER", "ROILS", "dOLOR", "ILIAC", "CILLS", "LOCOS", "HILAR", +"ORALS", "HIRER", "ROILS", "dOLOR", "ILIAC", "CILLS", "LOCOS", "HILAR", "CROCS", +"HIRER", "ROILS", "dOLOR", "ILIAC", "CILLS", "LOCOS", "HILAR", "CROCS", "OHHHH", +"ROILS", "dOLOR", "ILIAC", "CILLS", "LOCOS", "HILAR", "CROCS", "OHHHH", "SECCO", +"dOLOR", "ILIAC", "CILLS", "LOCOS", "HILAR", "CROCS", "OHHHH", "SECCO", "SHAdS", +"ILIAC", "CILLS", "LOCOS", "HILAR", "CROCS", "OHHHH", "SECCO", "SHAdS", "CHOOS", +"CILLS", "LOCOS", "HILAR", "CROCS", "OHHHH", "SECCO", "SHAdS", "CHOOS", "AREAL", +"LOCOS", "HILAR", "CROCS", "OHHHH", "SECCO", "SHAdS", "CHOOS", "AREAL", "dIdOS", +"HILAR", "CROCS", "OHHHH", "SECCO", "SHAdS", "CHOOS", "AREAL", "dIdOS", "COOCH", +"CROCS", "OHHHH", "SECCO", "SHAdS", "CHOOS", "AREAL", "dIdOS", "COOCH", "CHILE", +"OHHHH", "SECCO", "SHAdS", "CHOOS", "AREAL", "dIdOS", "COOCH", "CHILE", "OCHER", +"SECCO", "SHAdS", "CHOOS", "AREAL", "dIdOS", "COOCH", "CHILE", "OCHER", "dOLCE", +"SHAdS", "CHOOS", "AREAL", "dIdOS", "COOCH", "CHILE", "OCHER", "dOLCE", "SLOES", +"CHOOS", "AREAL", "dIdOS", "COOCH", "CHILE", "OCHER", "dOLCE", "SLOES", "LAIRd", +"AREAL", "dIdOS", "COOCH", "CHILE", "OCHER", "dOLCE", "SLOES", "LAIRd", "SHERd", +"dIdOS", "COOCH", "CHILE", "OCHER", "dOLCE", "SLOES", "LAIRd", "SHERd", "CHARS", +"COOCH", "CHILE", "OCHER", "dOLCE", "SLOES", "LAIRd", "SHERd", "CHARS", "HAdES", +"CHILE", "OCHER", "dOLCE", "SLOES", "LAIRd", "SHERd", "CHARS", "HAdES", "HOARS", +"OCHER", "dOLCE", "SLOES", "LAIRd", "SHERd", "CHARS", "HAdES", "HOARS", "dARER", +"dOLCE", "SLOES", "LAIRd", "SHERd", "CHARS", "HAdES", "HOARS", "dARER", "ROIdS", +"SLOES", "LAIRd", "SHERd", "CHARS", "HAdES", "HOARS", "dARER", "ROIdS", "ARRAS", +"LAIRd", "SHERd", "CHARS", "HAdES", "HOARS", "dARER", "ROIdS", "ARRAS", "HALER", +"SHERd", "CHARS", "HAdES", "HOARS", "dARER", "ROIdS", "ARRAS", "HALER", "AIRER", +"CHARS", "HAdES", "HOARS", "dARER", "ROIdS", "ARRAS", "HALER", "AIRER", "CASAS", +"HAdES", "HOARS", "dARER", "ROIdS", "ARRAS", "HALER", "AIRER", "CASAS", "CARER", +"HOARS", "dARER", "ROIdS", "ARRAS", "HALER", "AIRER", "CASAS", "CARER", "OAREd", +"dARER", "ROIdS", "ARRAS", "HALER", "AIRER", "CASAS", "CARER", "OAREd", "RILLE", +"ROIdS", "ARRAS", "HALER", "AIRER", "CASAS", "CARER", "OAREd", "RILLE", "RICEd", +"ARRAS", "HALER", "AIRER", "CASAS", "CARER", "OAREd", "RILLE", "RICEd", "LIRAS", +"HALER", "AIRER", "CASAS", "CARER", "OAREd", "RILLE", "RICEd", "LIRAS", "AIdER", +"AIRER", "CASAS", "CARER", "OAREd", "RILLE", "RICEd", "LIRAS", "AIdER", "ICHOR", +"CASAS", "CARER", "OAREd", "RILLE", "RICEd", "LIRAS", "AIdER", "ICHOR", "LOCHS", +"CARER", "OAREd", "RILLE", "RICEd", "LIRAS", "AIdER", "ICHOR", "LOCHS", "CALLA", +"OAREd", "RILLE", "RICEd", "LIRAS", "AIdER", "ICHOR", "LOCHS", "CALLA", "COCAS", +"RILLE", "RICEd", "LIRAS", "AIdER", "ICHOR", "LOCHS", "CALLA", "COCAS", "OILER", +"RICEd", "LIRAS", "AIdER", "ICHOR", "LOCHS", "CALLA", "COCAS", "OILER", "ASSAI", +"LIRAS", "AIdER", "ICHOR", "LOCHS", "CALLA", "COCAS", "OILER", "ASSAI", "LAdES", +"AIdER", "ICHOR", "LOCHS", "CALLA", "COCAS", "OILER", "ASSAI", "LAdES", "SHIER", +"ICHOR", "LOCHS", "CALLA", "COCAS", "OILER", "ASSAI", "LAdES", "SHIER", "dICER", +"LOCHS", "CALLA", "COCAS", "OILER", "ASSAI", "LAdES", "SHIER", "dICER", "OLEOS", +"CALLA", "COCAS", "OILER", "ASSAI", "LAdES", "SHIER", "dICER", "OLEOS", "SHOER", +"COCAS", "OILER", "ASSAI", "LAdES", "SHIER", "dICER", "OLEOS", "SHOER", "HOdAd", +"OILER", "ASSAI", "LAdES", "SHIER", "dICER", "OLEOS", "SHOER", "HOdAd", "IOdIC", +"ASSAI", "LAdES", "SHIER", "dICER", "OLEOS", "SHOER", "HOdAd", "IOdIC", "LIERS", +"LAdES", "SHIER", "dICER", "OLEOS", "SHOER", "HOdAd", "IOdIC", "LIERS", "AIOLI", +"SHIER", "dICER", "OLEOS", "SHOER", "HOdAd", "IOdIC", "LIERS", "AIOLI", "HOERS", +"dICER", "OLEOS", "SHOER", "HOdAd", "IOdIC", "LIERS", "AIOLI", "HOERS", "SLIER", +"OLEOS", "SHOER", "HOdAd", "IOdIC", "LIERS", "AIOLI", "HOERS", "SLIER", "LASES", +"SHOER", "HOdAd", "IOdIC", "LIERS", "AIOLI", "HOERS", "SLIER", "LASES", "RASAE", +"HOdAd", "IOdIC", "LIERS", "AIOLI", "HOERS", "SLIER", "LASES", "RASAE", "SOCLE", +"IOdIC", "LIERS", "AIOLI", "HOERS", "SLIER", "LASES", "RASAE", "SOCLE", "RICER", +"LIERS", "AIOLI", "HOERS", "SLIER", "LASES", "RASAE", "SOCLE", "RICER", "HAddA", +"AIOLI", "HOERS", "SLIER", "LASES", "RASAE", "SOCLE", "RICER", "HAddA", "RICES", +"HOERS", "SLIER", "LASES", "RASAE", "SOCLE", "RICER", "HAddA", "RICES", "ROOdS", +"SLIER", "LASES", "RASAE", "SOCLE", "RICER", "HAddA", "RICES", "ROOdS", "CEdER", +"LASES", "RASAE", "SOCLE", "RICER", "HAddA", "RICES", "ROOdS", "CEdER", "CEILS", +"RASAE", "SOCLE", "RICER", "HAddA", "RICES", "ROOdS", "CEdER", "CEILS", "LISLE", +"SOCLE", "RICER", "HAddA", "RICES", "ROOdS", "CEdER", "CEILS", "LISLE", "OLIOS", +"RICER", "HAddA", "RICES", "ROOdS", "CEdER", "CEILS", "LISLE", "OLIOS", "dOSER", +"HAddA", "RICES", "ROOdS", "CEdER", "CEILS", "LISLE", "OLIOS", "dOSER", "dILdO", +"RICES", "ROOdS", "CEdER", "CEILS", "LISLE", "OLIOS", "dOSER", "dILdO", "SELAH", +"ROOdS", "CEdER", "CEILS", "LISLE", "OLIOS", "dOSER", "dILdO", "SELAH", "RIALS", +"CEdER", "CEILS", "LISLE", "OLIOS", "dOSER", "dILdO", "SELAH", "RIALS", "ICERS", +"CEILS", "LISLE", "OLIOS", "dOSER", "dILdO", "SELAH", "RIALS", "ICERS", "SHIRR", +"LISLE", "OLIOS", "dOSER", "dILdO", "SELAH", "RIALS", "ICERS", "SHIRR", "LAdEd", +"OLIOS", "dOSER", "dILdO", "SELAH", "RIALS", "ICERS", "SHIRR", "LAdEd", "LASEd", +"dOSER", "dILdO", "SELAH", "RIALS", "ICERS", "SHIRR", "LAdEd", "LASEd", "HOLER", +"SELAH", "RIALS", "ICERS", "SHIRR", "LAdEd", "LASEd", "HOLER", "LACER", "ARSES", +"dILdO", "SELAH", "RIALS", "ICERS", "SHIRR", "LAdEd", "LASEd", "HOLER", "LACER", +"RIALS", "ICERS", "SHIRR", "LAdEd", "LASEd", "HOLER", "LACER", "ARSES", "CIRRI", +"ICERS", "SHIRR", "LAdEd", "LASEd", "HOLER", "LACER", "ARSES", "CIRRI", "dIRER", +"SHIRR", "LAdEd", "LASEd", "HOLER", "LACER", "ARSES", "CIRRI", "dIRER", "ASSEd", +"LAdEd", "LASEd", "HOLER", "LACER", "ARSES", "CIRRI", "dIRER", "ASSEd", "OSIER", +}; + +static const uint32_t _num_words = (sizeof(_legal_words) / sizeof(_legal_words[0])); +static const uint8_t _num_valid_letters = (sizeof(_valid_letters) / sizeof(_valid_letters[0])); + +static uint32_t get_random(uint32_t max) { + #if __EMSCRIPTEN__ + return rand() % max; + #else + return arc4random_uniform(max); + #endif +} + +static void display_letter(wordle_state_t *state) { + char buf[1 + 1]; + if (state->word_elements[state->position] >= _num_valid_letters) { + watch_display_string("-", state->position + 5); + return; + } + sprintf(buf, "%c", _valid_letters[state->word_elements[state->position]]); + watch_display_string(buf, state->position + 5); +} + +static void display_all_letters(wordle_state_t *state) { + uint8_t prev_pos = state->position; + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + state->position = i; + display_letter(state); + } + state->position = prev_pos; +} + +static bool check_word(wordle_state_t *state) { + + // Exact + bool is_exact_match = true; + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][i]) + state->word_elements_result[i] = WORDLE_LETTER_CORRECT; + else { + state->word_elements_result[i] = WORDLE_LETTER_WRONG; + is_exact_match = false; + } + } + + // Wrong Location + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements_result[i] != WORDLE_LETTER_WRONG) continue; + for (size_t j = 0; j < WORDLE_LENGTH; j++) { + if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][j]) { + printf("me: %c them: %c\r\n", _valid_letters[state->word_elements[i]], _legal_words[state->curr_answer][j]); + state->word_elements_result[j] = WORDLE_LETTER_WRONG_LOC; + break; + } + } + } + + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + printf("%d : %d\r\n", i, state->word_elements_result[i]); + } + + + + return is_exact_match; +} + +static void display_attempt(uint8_t attempt) { + char buf[2]; + sprintf(buf, "%d", attempt); + watch_display_string(buf, 3); +} + +static void reset_board(wordle_state_t *state) { + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + state->word_elements[i] = _num_valid_letters; + state->word_elements_result[i] = WORDLE_LETTER_WRONG; + } + state->curr_answer = get_random(_num_words); + state->position = 0; + state->attempt = 1; + state->curr_screen = SCREEN_PLAYING; + watch_clear_colon(); + watch_display_string(" ", 4); + display_attempt(state->attempt); + display_all_letters(state); + printf("rand: %s\r\n", _legal_words[state->curr_answer]); +} + +static void display_title(wordle_state_t *state) { + char buf[11]; + state->curr_screen = SCREEN_TITLE; + printf("streak %d \r\n", state->streak); + sprintf(buf, "WO St%2ddy", state->streak); + watch_display_string(buf, 0); + watch_set_colon(); +} + +static void display_lose(wordle_state_t *state, uint8_t subsecond) { + char buf[WORDLE_LENGTH + 5]; + sprintf(buf," L %s", subsecond % 2 ? _legal_words[state->curr_answer] : " "); + watch_display_string(buf, 0); +} + +static void display_win(wordle_state_t *state, uint8_t subsecond) { + char buf[11]; + sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOb "); + watch_display_string(buf, 0); +} + +static uint8_t get_first_pos(WordleLetterResult *word_elements_result) { + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (word_elements_result[i] != WORDLE_LETTER_CORRECT) + return i; + } + return 0; +} + +static uint8_t get_next_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { + uint8_t pos = curr_pos; + do { + pos++; + if (pos > WORDLE_LENGTH) return WORDLE_LENGTH + 1; + } while (word_elements_result[pos] == WORDLE_LETTER_CORRECT); + return pos; +} + +static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { + int8_t pos = curr_pos; + do { + pos--; + if (pos < 0) return curr_pos; + } while (word_elements_result[pos] == WORDLE_LETTER_CORRECT); + return pos; +} + +static void display_result(wordle_state_t *state, uint8_t subsecond) { + char buf[WORDLE_LENGTH + 1]; + for (size_t i = 0; i < WORDLE_LENGTH; i++) + { + switch (state->word_elements_result[i]) + { + case WORDLE_LETTER_WRONG: + buf[i] = '-'; + break; + case WORDLE_LETTER_CORRECT: + buf[i] = _valid_letters[state->word_elements[i]]; + break; + case WORDLE_LETTER_WRONG_LOC: + if (subsecond % 2) + buf[i] = ' '; + else + buf[i] = _valid_letters[state->word_elements[i]]; + default: + break; + } + } + watch_display_string(buf, 5); +} + +static bool act_on_btn(wordle_state_t *state) { + if (state->curr_screen == SCREEN_RESULT) { + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements_result[i] != WORDLE_LETTER_CORRECT) + state->word_elements[i] = _num_valid_letters; + } + display_attempt(state->attempt); + display_all_letters(state); + state->position = get_first_pos(state->word_elements_result); + state->curr_screen = SCREEN_PLAYING; + return true; + } + if (state->curr_screen == SCREEN_TITLE) { + reset_board(state); + return true; + } + if (state->curr_screen >= SCREEN_WIN) { + display_title(state); + return true; + } + return false; +} + +void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr) { + (void) settings; + (void) watch_face_index; + if (*context_ptr == NULL) { + *context_ptr = malloc(sizeof(wordle_state_t)); + memset(*context_ptr, 0, sizeof(wordle_state_t)); + wordle_state_t *state = (wordle_state_t *)*context_ptr; + state->curr_screen = SCREEN_TITLE; + + } + // Do any pin or peripheral setup here; this will be called whenever the watch wakes from deep sleep. +} + +void wordle_face_activate(movement_settings_t *settings, void *context) { + (void) settings; + wordle_state_t *state = (wordle_state_t *)context; + movement_request_tick_frequency(2); + if (state->curr_screen == SCREEN_TITLE) + display_title(state); +} + +bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, void *context) { + wordle_state_t *state = (wordle_state_t *)context; + + switch (event.event_type) { + case EVENT_ACTIVATE: + if (state->curr_screen == SCREEN_PLAYING) + display_all_letters(state); + break; + case EVENT_TICK: + switch (state->curr_screen) + { + case SCREEN_PLAYING: + if (event.subsecond % 2) { + display_letter(state); + } else { + watch_display_string(" ", state->position + 5); + } + break; + case SCREEN_RESULT: + display_result(state, event.subsecond); + break; + case SCREEN_LOSE: + display_lose(state, event.subsecond); + break; + case SCREEN_WIN: + display_win(state, event.subsecond); + break; + default: + break; + } + break; + case EVENT_LIGHT_BUTTON_UP: + if (act_on_btn(state)) break; + if (state->word_elements[state->position] >= _num_valid_letters) state->word_elements[state->position] = 0; + else state->word_elements[state->position] = (state->word_elements[state->position] + 1) % _num_valid_letters; + display_letter(state); + break; + case EVENT_LIGHT_LONG_PRESS: + if (state->word_elements[state->position] >= _num_valid_letters) state->word_elements[state->position] = _num_valid_letters - 1; + else state->word_elements[state->position] = (state->word_elements[state->position] + _num_valid_letters - 1) % _num_valid_letters; + display_letter(state); + break; + case EVENT_ALARM_BUTTON_UP: + if (act_on_btn(state)) break; + display_letter(state); + if (state->word_elements[state->position] == _num_valid_letters) break; + state->position = get_next_pos(state->position, state->word_elements_result); + if(WORDLE_LENGTH == (state->position)) { + bool exact_match = check_word(state); + if (exact_match) { + state->curr_screen = SCREEN_WIN; + state->streak++; + break; + } + if (state->attempt++ > WORDLE_MAX_ATTEMPTS) { + state->curr_screen = SCREEN_LOSE; + state->streak = 0; + break; + } + state->curr_screen = SCREEN_RESULT; + break; + } + break; + case EVENT_ALARM_LONG_PRESS: + display_letter(state); + state->position = get_prev_pos(state->position, state->word_elements_result); + break; + case EVENT_LIGHT_BUTTON_DOWN: + break; + case EVENT_TIMEOUT: + case EVENT_LOW_ENERGY_UPDATE: + break; + default: + return movement_default_loop_handler(event, settings); + } + return true; +} + +void wordle_face_resign(movement_settings_t *settings, void *context) { + (void) settings; + (void) context; +} + diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h new file mode 100644 index 00000000..542a01b4 --- /dev/null +++ b/movement/watch_faces/complication/wordle_face.h @@ -0,0 +1,86 @@ +/* + * MIT License + * + * Copyright (c) 2024 <#author_name#> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#ifndef WORDLE_FACE_H_ +#define WORDLE_FACE_H_ + +#include "movement.h" + +/* + * A DESCRIPTION OF YOUR WATCH FACE + * + * and a description of how use it + * + */ + +#define WORDLE_LENGTH 5 +#define WORDLE_MAX_ATTEMPTS 5 +#define USE_DAILY_STREAK true + +typedef enum { + WORDLE_LETTER_WRONG = 0, + WORDLE_LETTER_WRONG_LOC, + WORDLE_LETTER_CORRECT, + WORDLE_LETTER_COUNT +} WordleLetterResult; + +typedef enum { + SCREEN_PLAYING = 0, + SCREEN_RESULT, + SCREEN_TITLE, + SCREEN_WIN, + SCREEN_LOSE, + SCREEN_COUNT +} WordleScreen; + +typedef struct { + // Anything you need to keep track of, put it here! + uint8_t word_elements[WORDLE_LENGTH]; + WordleLetterResult word_elements_result[WORDLE_LENGTH]; + uint8_t attempt : 3; + uint8_t position : 3; + uint8_t unused : 2; + uint16_t curr_answer; + uint8_t streak; + WordleScreen curr_screen; +#if USE_DAILY_STREAK + // For the day info +#endif +} wordle_state_t; + +void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr); +void wordle_face_activate(movement_settings_t *settings, void *context); +bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, void *context); +void wordle_face_resign(movement_settings_t *settings, void *context); + +#define wordle_face ((const watch_face_t){ \ + wordle_face_setup, \ + wordle_face_activate, \ + wordle_face_loop, \ + wordle_face_resign, \ + NULL, \ +}) + +#endif // WORDLE_FACE_H_ + From 6bf22edbdcc87e8ca9fc484c55bafe94ff16f414 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Wed, 14 Aug 2024 23:13:34 -0400 Subject: [PATCH 02/53] Continued Wordle dev --- .../watch_faces/complication/wordle_face.c | 552 +++----------- .../watch_faces/complication/wordle_face.h | 1 + utils/wordle_list.py | 697 ++++++++++++++++++ 3 files changed, 803 insertions(+), 447 deletions(-) create mode 100644 utils/wordle_list.py diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 8cd993ee..f6f63fd8 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -32,439 +32,81 @@ TODO: * Fix the word matching (if answer is AAAAA and we put in AACAA, the C blinks) * Verify pressing back always work when the board is G_G_G * Add daily streak and wait for next day +* Add a way tpo recount previous attempts */ -/* -Letter | Usage in Text -E | 12.7% -T | 9.1% But looks bad across all positions -A | 8.2% -O | 7.5% -I | 7.0% -N | 6.7% Few uses in 5 letter words than C -S | 6.3% -H | 6.1% -R | 6.0% -D | 4.3% -L | 4.0% -C | 2.8% -*/ -static const char _valid_letters[] = {'A', 'C', 'd', 'E', 'H', 'I', 'L', 'O', 'R', 'S'}; - // From: https://github.com/charlesreid1/five-letter-words/blob/master/sgb-words.txt + +/* +Letter | Usage in sgb-words.txt +S | 2674 +E | 2658 +A | 2181 +R | 1799 +O | 1683 +I | 1539 +T | 1462 But looks bad across all positions +L | 1434 +N | 1219 +D | 1100 lowercase d looks like a in certain positions +U | 1068 C has more words with the other letters here (457 total vs 390) +C | 920 +P | 895 +*/ +static const char _valid_letters[] = {'A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R', 'S'}; + static const char _legal_words[][WORDLE_LENGTH + 1] = { -"AAAAA", "SHALL", "HEARd", "ORdER", "CLOSE", "CLASS", "HORSE", "AddEd", "COLOR", "IdEAS", -"HEARd", "ORdER", "CLOSE", "CLASS", "HORSE", "AddEd", "COLOR", "IdEAS", "CRIEd", -"ORdER", "CLOSE", "CLASS", "HORSE", "AddEd", "COLOR", "IdEAS", "CRIEd", "CLEAR", -"CLOSE", "CLASS", "HORSE", "AddEd", "COLOR", "IdEAS", "CRIEd", "CLEAR", "CHILd", -"CLASS", "HORSE", "AddEd", "COLOR", "IdEAS", "CRIEd", "CLEAR", "CHILd", "SIdES", -"HORSE", "AddEd", "COLOR", "IdEAS", "CRIEd", "CLEAR", "CHILd", "SIdES", "AREAS", -"AddEd", "COLOR", "IdEAS", "CRIEd", "CLEAR", "CHILd", "SIdES", "AREAS", "SCALE", -"COLOR", "IdEAS", "CRIEd", "CLEAR", "CHILd", "SIdES", "AREAS", "SCALE", "CELLS", -"IdEAS", "CRIEd", "CLEAR", "CHILd", "SIdES", "AREAS", "SCALE", "CELLS", "AHEAd", -"CRIEd", "CLEAR", "CHILd", "SIdES", "AREAS", "SCALE", "CELLS", "AHEAd", "REACH", -"CLEAR", "CHILd", "SIdES", "AREAS", "SCALE", "CELLS", "AHEAd", "REACH", "RAdIO", -"CHILd", "SIdES", "AREAS", "SCALE", "CELLS", "AHEAd", "REACH", "RAdIO", "LOCAL", -"SIdES", "AREAS", "SCALE", "CELLS", "AHEAd", "REACH", "RAdIO", "LOCAL", "SEEdS", -"AREAS", "SCALE", "CELLS", "AHEAd", "REACH", "RAdIO", "LOCAL", "SEEdS", "CROSS", -"SCALE", "CELLS", "AHEAd", "REACH", "RAdIO", "LOCAL", "SEEdS", "CROSS", "CASES", -"CELLS", "AHEAd", "REACH", "RAdIO", "LOCAL", "SEEdS", "CROSS", "CASES", "OLdER", -"AHEAd", "REACH", "RAdIO", "LOCAL", "SEEdS", "CROSS", "CASES", "OLdER", "SHOES", -"REACH", "RAdIO", "LOCAL", "SEEdS", "CROSS", "CASES", "OLdER", "SHOES", "CHAIR", -"RAdIO", "LOCAL", "SEEdS", "CROSS", "CASES", "OLdER", "SHOES", "CHAIR", "SCORE", -"LOCAL", "SEEdS", "CROSS", "CASES", "OLdER", "SHOES", "CHAIR", "SCORE", "SHORE", -"SEEdS", "CROSS", "CASES", "OLdER", "SHOES", "CHAIR", "SCORE", "SHORE", "HEAdS", -"CROSS", "CASES", "OLdER", "SHOES", "CHAIR", "SCORE", "SHORE", "HEAdS", "dRESS", -"CASES", "OLdER", "SHOES", "CHAIR", "SCORE", "SHORE", "HEAdS", "dRESS", "SHARE", -"OLdER", "SHOES", "CHAIR", "SCORE", "SHORE", "HEAdS", "dRESS", "SHARE", "SOLId", -"SHOES", "CHAIR", "SCORE", "SHORE", "HEAdS", "dRESS", "SHARE", "SOLId", "HILLS", -"CHAIR", "SCORE", "SHORE", "HEAdS", "dRESS", "SHARE", "SOLId", "HILLS", "RAISE", -"SCORE", "SHORE", "HEAdS", "dRESS", "SHARE", "SOLId", "HILLS", "RAISE", "ROAdS", -"SHORE", "HEAdS", "dRESS", "SHARE", "SOLId", "HILLS", "RAISE", "ROAdS", "CHORd", -"HEAdS", "dRESS", "SHARE", "SOLId", "HILLS", "RAISE", "ROAdS", "CHORd", "HOLES", -"dRESS", "SHARE", "SOLId", "HILLS", "RAISE", "ROAdS", "CHORd", "HOLES", "HOLdS", -"SHARE", "SOLId", "HILLS", "RAISE", "ROAdS", "CHORd", "HOLES", "HOLdS", "CALLS", -"SOLId", "HILLS", "RAISE", "ROAdS", "CHORd", "HOLES", "HOLdS", "CALLS", "dOORS", -"HILLS", "RAISE", "ROAdS", "CHORd", "HOLES", "HOLdS", "CALLS", "dOORS", "LOOSE", -"RAISE", "ROAdS", "CHORd", "HOLES", "HOLdS", "CALLS", "dOORS", "LOOSE", "ASIdE", -"ROAdS", "CHORd", "HOLES", "HOLdS", "CALLS", "dOORS", "LOOSE", "ASIdE", "SHELL", -"CHORd", "HOLES", "HOLdS", "CALLS", "dOORS", "LOOSE", "ASIdE", "SHELL", "dRIEd", -"HOLES", "HOLdS", "CALLS", "dOORS", "LOOSE", "ASIdE", "SHELL", "dRIEd", "SHAdE", -"HOLdS", "CALLS", "dOORS", "LOOSE", "ASIdE", "SHELL", "dRIEd", "SHAdE", "CARdS", -"CALLS", "dOORS", "LOOSE", "ASIdE", "SHELL", "dRIEd", "SHAdE", "CARdS", "CHOSE", -"dOORS", "LOOSE", "ASIdE", "SHELL", "dRIEd", "SHAdE", "CARdS", "CHOSE", "SOLAR", -"LOOSE", "ASIdE", "SHELL", "dRIEd", "SHAdE", "CARdS", "CHOSE", "SOLAR", "RISES", -"ASIdE", "SHELL", "dRIEd", "SHAdE", "CARdS", "CHOSE", "SOLAR", "RISES", "SALES", -"SHELL", "dRIEd", "SHAdE", "CARdS", "CHOSE", "SOLAR", "RISES", "SALES", "ACRES", -"dRIEd", "SHAdE", "CARdS", "CHOSE", "SOLAR", "RISES", "SALES", "ACRES", "SLIdE", -"SHAdE", "CARdS", "CHOSE", "SOLAR", "RISES", "SALES", "ACRES", "SLIdE", "ERROR", -"CARdS", "CHOSE", "SOLAR", "RISES", "SALES", "ACRES", "SLIdE", "ERROR", "RACEd", -"CHOSE", "SOLAR", "RISES", "SALES", "ACRES", "SLIdE", "ERROR", "RACEd", "dRILL", -"SOLAR", "RISES", "SALES", "ACRES", "SLIdE", "ERROR", "RACEd", "dRILL", "HELLO", -"RISES", "SALES", "ACRES", "SLIdE", "ERROR", "RACEd", "dRILL", "HELLO", "LEAdS", -"SALES", "ACRES", "SLIdE", "ERROR", "RACEd", "dRILL", "HELLO", "LEAdS", "COACH", -"ACRES", "SLIdE", "ERROR", "RACEd", "dRILL", "HELLO", "LEAdS", "COACH", "REAdS", -"SLIdE", "ERROR", "RACEd", "dRILL", "HELLO", "LEAdS", "COACH", "REAdS", "HERdS", -"ERROR", "RACEd", "dRILL", "HELLO", "LEAdS", "COACH", "REAdS", "HERdS", "AROSE", -"RACEd", "dRILL", "HELLO", "LEAdS", "COACH", "REAdS", "HERdS", "AROSE", "RACES", -"dRILL", "HELLO", "LEAdS", "COACH", "REAdS", "HERdS", "AROSE", "RACES", "HEELS", -"HELLO", "LEAdS", "COACH", "REAdS", "HERdS", "AROSE", "RACES", "HEELS", "RIdER", -"LEAdS", "COACH", "REAdS", "HERdS", "AROSE", "RACES", "HEELS", "RIdER", "ROLLS", -"COACH", "REAdS", "HERdS", "AROSE", "RACES", "HEELS", "RIdER", "ROLLS", "CRASH", -"REAdS", "HERdS", "AROSE", "RACES", "HEELS", "RIdER", "ROLLS", "CRASH", "SAILS", -"HERdS", "AROSE", "RACES", "HEELS", "RIdER", "ROLLS", "CRASH", "SAILS", "ARISE", -"AROSE", "RACES", "HEELS", "RIdER", "ROLLS", "CRASH", "SAILS", "ARISE", "IdEAL", -"RACES", "HEELS", "RIdER", "ROLLS", "CRASH", "SAILS", "ARISE", "IdEAL", "CRIES", -"HEELS", "RIdER", "ROLLS", "CRASH", "SAILS", "ARISE", "IdEAL", "CRIES", "ASHES", -"RIdER", "ROLLS", "CRASH", "SAILS", "ARISE", "IdEAL", "CRIES", "ASHES", "CHASE", -"ROLLS", "CRASH", "SAILS", "ARISE", "IdEAL", "CRIES", "ASHES", "CHASE", "SLICE", -"CRASH", "SAILS", "ARISE", "IdEAL", "CRIES", "ASHES", "CHASE", "SLICE", "CHEER", -"SAILS", "ARISE", "IdEAL", "CRIES", "ASHES", "CHASE", "SLICE", "CHEER", "HIdES", -"ARISE", "IdEAL", "CRIES", "ASHES", "CHASE", "SLICE", "CHEER", "HIdES", "dEEdS", -"IdEAL", "CRIES", "ASHES", "CHASE", "SLICE", "CHEER", "HIdES", "dEEdS", "RIdES", -"CRIES", "ASHES", "CHASE", "SLICE", "CHEER", "HIdES", "dEEdS", "RIdES", "ROSES", -"ASHES", "CHASE", "SLICE", "CHEER", "HIdES", "dEEdS", "RIdES", "ROSES", "HIREd", -"CHASE", "SLICE", "CHEER", "HIdES", "dEEdS", "RIdES", "ROSES", "HIREd", "SALAd", -"SLICE", "CHEER", "HIdES", "dEEdS", "RIdES", "ROSES", "HIREd", "SALAd", "LOAdS", -"CHEER", "HIdES", "dEEdS", "RIdES", "ROSES", "HIREd", "SALAd", "LOAdS", "HEARS", -"HIdES", "dEEdS", "RIdES", "ROSES", "HIREd", "SALAd", "LOAdS", "HEARS", "LOSES", -"dEEdS", "RIdES", "ROSES", "HIREd", "SALAd", "LOAdS", "HEARS", "LOSES", "CORAL", -"RIdES", "ROSES", "HIREd", "SALAd", "LOAdS", "HEARS", "LOSES", "CORAL", "dAREd", -"ROSES", "HIREd", "SALAd", "LOAdS", "HEARS", "LOSES", "CORAL", "dAREd", "RAdAR", -"HIREd", "SALAd", "LOAdS", "HEARS", "LOSES", "CORAL", "dAREd", "RAdAR", "HAIRS", -"SALAd", "LOAdS", "HEARS", "LOSES", "CORAL", "dAREd", "RAdAR", "HAIRS", "dOLLS", -"LOAdS", "HEARS", "LOSES", "CORAL", "dAREd", "RAdAR", "HAIRS", "dOLLS", "CAREd", -"HEARS", "LOSES", "CORAL", "dAREd", "RAdAR", "HAIRS", "dOLLS", "CAREd", "SELLS", -"LOSES", "CORAL", "dAREd", "RAdAR", "HAIRS", "dOLLS", "CAREd", "SELLS", "COOLS", -"CORAL", "dAREd", "RAdAR", "HAIRS", "dOLLS", "CAREd", "SELLS", "COOLS", "HARSH", -"dAREd", "RAdAR", "HAIRS", "dOLLS", "CAREd", "SELLS", "COOLS", "HARSH", "SOILS", -"RAdAR", "HAIRS", "dOLLS", "CAREd", "SELLS", "COOLS", "HARSH", "SOILS", "REEdS", -"HAIRS", "dOLLS", "CAREd", "SELLS", "COOLS", "HARSH", "SOILS", "REEdS", "SHEER", -"dOLLS", "CAREd", "SELLS", "COOLS", "HARSH", "SOILS", "REEdS", "SHEER", "CHILL", -"CAREd", "SELLS", "COOLS", "HARSH", "SOILS", "REEdS", "SHEER", "CHILL", "CORdS", -"SELLS", "COOLS", "HARSH", "SOILS", "REEdS", "SHEER", "CHILL", "CORdS", "RAILS", -"COOLS", "HARSH", "SOILS", "REEdS", "SHEER", "CHILL", "CORdS", "RAILS", "dEALS", -"HARSH", "SOILS", "REEdS", "SHEER", "CHILL", "CORdS", "RAILS", "dEALS", "ACIdS", -"SOILS", "REEdS", "SHEER", "CHILL", "CORdS", "RAILS", "dEALS", "ACIdS", "COCOA", -"REEdS", "SHEER", "CHILL", "CORdS", "RAILS", "dEALS", "ACIdS", "COCOA", "SCARE", -"SHEER", "CHILL", "CORdS", "RAILS", "dEALS", "ACIdS", "COCOA", "SCARE", "CEASE", -"CHILL", "CORdS", "RAILS", "dEALS", "ACIdS", "COCOA", "SCARE", "CEASE", "SEALS", -"CORdS", "RAILS", "dEALS", "ACIdS", "COCOA", "SCARE", "CEASE", "SEALS", "LORdS", -"RAILS", "dEALS", "ACIdS", "COCOA", "SCARE", "CEASE", "SEALS", "LORdS", "HALLS", -"dEALS", "ACIdS", "COCOA", "SCARE", "CEASE", "SEALS", "LORdS", "HALLS", "COALS", -"ACIdS", "COCOA", "SCARE", "CEASE", "SEALS", "LORdS", "HALLS", "COALS", "ROdEO", -"COCOA", "SCARE", "CEASE", "SEALS", "LORdS", "HALLS", "COALS", "ROdEO", "COdES", -"SCARE", "CEASE", "SEALS", "LORdS", "HALLS", "COALS", "ROdEO", "COdES", "ELdER", -"CEASE", "SEALS", "LORdS", "HALLS", "COALS", "ROdEO", "COdES", "ELdER", "ROLES", -"SEALS", "LORdS", "HALLS", "COALS", "ROdEO", "COdES", "ELdER", "ROLES", "dREAd", -"LORdS", "HALLS", "COALS", "ROdEO", "COdES", "ELdER", "ROLES", "dREAd", "CEdAR", -"HALLS", "COALS", "ROdEO", "COdES", "ELdER", "ROLES", "dREAd", "CEdAR", "SLASH", -"COALS", "ROdEO", "COdES", "ELdER", "ROLES", "dREAd", "CEdAR", "SLASH", "CARES", -"ROdEO", "COdES", "ELdER", "ROLES", "dREAd", "CEdAR", "SLASH", "CARES", "IdOLS", -"COdES", "ELdER", "ROLES", "dREAd", "CEdAR", "SLASH", "CARES", "IdOLS", "OdORS", -"ELdER", "ROLES", "dREAd", "CEdAR", "SLASH", "CARES", "IdOLS", "OdORS", "EASEd", -"ROLES", "dREAd", "CEdAR", "SLASH", "CARES", "IdOLS", "OdORS", "EASEd", "CHOIR", -"dREAd", "CEdAR", "SLASH", "CARES", "IdOLS", "OdORS", "EASEd", "CHOIR", "AIdEd", -"CEdAR", "SLASH", "CARES", "IdOLS", "OdORS", "EASEd", "CHOIR", "AIdEd", "CHAOS", -"SLASH", "CARES", "IdOLS", "OdORS", "EASEd", "CHOIR", "AIdEd", "CHAOS", "LEASE", -"CARES", "IdOLS", "OdORS", "EASEd", "CHOIR", "AIdEd", "CHAOS", "LEASE", "SHEAR", -"IdOLS", "OdORS", "EASEd", "CHOIR", "AIdEd", "CHAOS", "LEASE", "SHEAR", "SLEdS", -"OdORS", "EASEd", "CHOIR", "AIdEd", "CHAOS", "LEASE", "SHEAR", "SLEdS", "COILS", -"EASEd", "CHOIR", "AIdEd", "CHAOS", "LEASE", "SHEAR", "SLEdS", "COILS", "ACHEd", -"CHOIR", "AIdEd", "CHAOS", "LEASE", "SHEAR", "SLEdS", "COILS", "ACHEd", "CELLO", -"AIdEd", "CHAOS", "LEASE", "SHEAR", "SLEdS", "COILS", "ACHEd", "CELLO", "dRIES", -"CHAOS", "LEASE", "SHEAR", "SLEdS", "COILS", "ACHEd", "CELLO", "dRIES", "OASIS", -"LEASE", "SHEAR", "SLEdS", "COILS", "ACHEd", "CELLO", "dRIES", "OASIS", "dRIER", -"SHEAR", "SLEdS", "COILS", "ACHEd", "CELLO", "dRIES", "OASIS", "dRIER", "CACAO", -"SLEdS", "COILS", "ACHEd", "CELLO", "dRIES", "OASIS", "dRIER", "CACAO", "EERIE", -"COILS", "ACHEd", "CELLO", "dRIES", "OASIS", "dRIER", "CACAO", "EERIE", "SCARS", -"ACHEd", "CELLO", "dRIES", "OASIS", "dRIER", "CACAO", "EERIE", "SCARS", "RAIdS", -"CELLO", "dRIES", "OASIS", "dRIER", "CACAO", "EERIE", "SCARS", "RAIdS", "SOLES", -"dRIES", "OASIS", "dRIER", "CACAO", "EERIE", "SCARS", "RAIdS", "SOLES", "CAROL", -"OASIS", "dRIER", "CACAO", "EERIE", "SCARS", "RAIdS", "SOLES", "CAROL", "CHESS", -"dRIER", "CACAO", "EERIE", "SCARS", "RAIdS", "SOLES", "CAROL", "CHESS", "OASES", -"CACAO", "EERIE", "SCARS", "RAIdS", "SOLES", "CAROL", "CHESS", "OASES", "ASSES", -"EERIE", "SCARS", "RAIdS", "SOLES", "CAROL", "CHESS", "OASES", "ASSES", "SHEdS", -"SCARS", "RAIdS", "SOLES", "CAROL", "CHESS", "OASES", "ASSES", "SHEdS", "CLASH", -"RAIdS", "SOLES", "CAROL", "CHESS", "OASES", "ASSES", "SHEdS", "CLASH", "dISCS", -"SOLES", "CAROL", "CHESS", "OASES", "ASSES", "SHEdS", "CLASH", "dISCS", "ERASE", -"CAROL", "CHESS", "OASES", "ASSES", "SHEdS", "CLASH", "dISCS", "ERASE", "CIdER", -"CHESS", "OASES", "ASSES", "SHEdS", "CLASH", "dISCS", "ERASE", "CIdER", "SHALE", -"OASES", "ASSES", "SHEdS", "CLASH", "dISCS", "ERASE", "CIdER", "SHALE", "AISLE", -"ASSES", "SHEdS", "CLASH", "dISCS", "ERASE", "CIdER", "SHALE", "AISLE", "HEIRS", -"SHEdS", "CLASH", "dISCS", "ERASE", "CIdER", "SHALE", "AISLE", "HEIRS", "ROARS", -"CLASH", "dISCS", "ERASE", "CIdER", "SHALE", "AISLE", "HEIRS", "ROARS", "SCOLd", -"dISCS", "ERASE", "CIdER", "SHALE", "AISLE", "HEIRS", "ROARS", "SCOLd", "LEASH", -"ERASE", "CIdER", "SHALE", "AISLE", "HEIRS", "ROARS", "SCOLd", "LEASH", "LASSO", -"CIdER", "SHALE", "AISLE", "HEIRS", "ROARS", "SCOLd", "LEASH", "LASSO", "CHORE", -"SHALE", "AISLE", "HEIRS", "ROARS", "SCOLd", "LEASH", "LASSO", "CHORE", "LACEd", -"AISLE", "HEIRS", "ROARS", "SCOLd", "LEASH", "LASSO", "CHORE", "LACEd", "dOSES", -"HEIRS", "ROARS", "SCOLd", "LEASH", "LASSO", "CHORE", "LACEd", "dOSES", "COLdS", -"ROARS", "SCOLd", "LEASH", "LASSO", "CHORE", "LACEd", "dOSES", "COLdS", "CORES", -"SCOLd", "LEASH", "LASSO", "CHORE", "LACEd", "dOSES", "COLdS", "CORES", "CHILI", -"LEASH", "LASSO", "CHORE", "LACEd", "dOSES", "COLdS", "CORES", "CHILI", "EASEL", -"LASSO", "CHORE", "LACEd", "dOSES", "COLdS", "CORES", "CHILI", "EASEL", "LACES", -"CHORE", "LACEd", "dOSES", "COLdS", "CORES", "CHILI", "EASEL", "LACES", "HORdE", -"LACEd", "dOSES", "COLdS", "CORES", "CHILI", "EASEL", "LACES", "HORdE", "LASER", -"dOSES", "COLdS", "CORES", "CHILI", "EASEL", "LACES", "HORdE", "LASER", "HARES", -"COLdS", "CORES", "CHILI", "EASEL", "LACES", "HORdE", "LASER", "HARES", "CREEd", -"CORES", "CHILI", "EASEL", "LACES", "HORdE", "LASER", "HARES", "CREEd", "LILAC", -"CHILI", "EASEL", "LACES", "HORdE", "LASER", "HARES", "CREEd", "LILAC", "HOOdS", -"EASEL", "LACES", "HORdE", "LASER", "HARES", "CREEd", "LILAC", "HOOdS", "ROACH", -"LACES", "HORdE", "LASER", "HARES", "CREEd", "LILAC", "HOOdS", "ROACH", "dIALS", -"HORdE", "LASER", "HARES", "CREEd", "LILAC", "HOOdS", "ROACH", "dIALS", "SOLOS", -"LASER", "HARES", "CREEd", "LILAC", "HOOdS", "ROACH", "dIALS", "SOLOS", "SISAL", -"HARES", "CREEd", "LILAC", "HOOdS", "ROACH", "dIALS", "SOLOS", "SISAL", "HOSES", -"CREEd", "LILAC", "HOOdS", "ROACH", "dIALS", "SOLOS", "SISAL", "HOSES", "dARES", -"LILAC", "HOOdS", "ROACH", "dIALS", "SOLOS", "SISAL", "HOSES", "dARES", "ACHES", -"HOOdS", "ROACH", "dIALS", "SOLOS", "SISAL", "HOSES", "dARES", "ACHES", "LOSER", -"ROACH", "dIALS", "SOLOS", "SISAL", "HOSES", "dARES", "ACHES", "LOSER", "LAdLE", -"dIALS", "SOLOS", "SISAL", "HOSES", "dARES", "ACHES", "LOSER", "LAdLE", "RAdII", -"SOLOS", "SISAL", "HOSES", "dARES", "ACHES", "LOSER", "LAdLE", "RAdII", "SORES", -"SISAL", "HOSES", "dARES", "ACHES", "LOSER", "LAdLE", "RAdII", "SORES", "RELIC", -"HOSES", "dARES", "ACHES", "LOSER", "LAdLE", "RAdII", "SORES", "RELIC", "AIdES", -"dARES", "ACHES", "LOSER", "LAdLE", "RAdII", "SORES", "RELIC", "AIdES", "ALdER", -"ACHES", "LOSER", "LAdLE", "RAdII", "SORES", "RELIC", "AIdES", "ALdER", "COdEd", -"LOSER", "LAdLE", "RAdII", "SORES", "RELIC", "AIdES", "ALdER", "COdEd", "ISLES", -"LAdLE", "RAdII", "SORES", "RELIC", "AIdES", "ALdER", "COdEd", "ISLES", "CLOdS", -"RAdII", "SORES", "RELIC", "AIdES", "ALdER", "COdEd", "ISLES", "CLOdS", "AdORE", -"SORES", "RELIC", "AIdES", "ALdER", "COdEd", "ISLES", "CLOdS", "AdORE", "RARER", -"RELIC", "AIdES", "ALdER", "COdEd", "ISLES", "CLOdS", "AdORE", "RARER", "SILLS", -"AIdES", "ALdER", "COdEd", "ISLES", "CLOdS", "AdORE", "RARER", "SILLS", "SHOAL", -"ALdER", "COdEd", "ISLES", "CLOdS", "AdORE", "RARER", "SILLS", "SHOAL", "CACHE", -"COdEd", "ISLES", "CLOdS", "AdORE", "RARER", "SILLS", "SHOAL", "CACHE", "REELS", -"ISLES", "CLOdS", "AdORE", "RARER", "SILLS", "SHOAL", "CACHE", "REELS", "LIARS", -"CLOdS", "AdORE", "RARER", "SILLS", "SHOAL", "CACHE", "REELS", "LIARS", "SOARS", -"AdORE", "RARER", "SILLS", "SHOAL", "CACHE", "REELS", "LIARS", "SOARS", "SIdEd", -"RARER", "SILLS", "SHOAL", "CACHE", "REELS", "LIARS", "SOARS", "SIdEd", "HEALS", -"SILLS", "SHOAL", "CACHE", "REELS", "LIARS", "SOARS", "SIdEd", "HEALS", "SOdAS", -"SHOAL", "CACHE", "REELS", "LIARS", "SOARS", "SIdEd", "HEALS", "SOdAS", "ERREd", -"CACHE", "REELS", "LIARS", "SOARS", "SIdEd", "HEALS", "SOdAS", "ERREd", "ARdOR", -"REELS", "LIARS", "SOARS", "SIdEd", "HEALS", "SOdAS", "ERREd", "ARdOR", "HIRES", -"LIARS", "SOARS", "SIdEd", "HEALS", "SOdAS", "ERREd", "ARdOR", "HIRES", "LEECH", -"SOARS", "SIdEd", "HEALS", "SOdAS", "ERREd", "ARdOR", "HIRES", "LEECH", "EROdE", -"SIdEd", "HEALS", "SOdAS", "ERREd", "ARdOR", "HIRES", "LEECH", "EROdE", "HOARd", -"HEALS", "SOdAS", "ERREd", "ARdOR", "HIRES", "LEECH", "EROdE", "HOARd", "COOEd", -"SOdAS", "ERREd", "ARdOR", "HIRES", "LEECH", "EROdE", "HOARd", "COOEd", "SHREd", -"ERREd", "ARdOR", "HIRES", "LEECH", "EROdE", "HOARd", "COOEd", "SHREd", "SLOSH", -"ARdOR", "HIRES", "LEECH", "EROdE", "HOARd", "COOEd", "SHREd", "SLOSH", "CHIdE", -"HIRES", "LEECH", "EROdE", "HOARd", "COOEd", "SHREd", "SLOSH", "CHIdE", "EASES", -"LEECH", "EROdE", "HOARd", "COOEd", "SHREd", "SLOSH", "CHIdE", "EASES", "HALOS", -"EROdE", "HOARd", "COOEd", "SHREd", "SLOSH", "CHIdE", "EASES", "HALOS", "ACRId", -"HOARd", "COOEd", "SHREd", "SLOSH", "CHIdE", "EASES", "HALOS", "ACRId", "EIdER", -"COOEd", "SHREd", "SLOSH", "CHIdE", "EASES", "HALOS", "ACRId", "EIdER", "AddER", -"SHREd", "SLOSH", "CHIdE", "EASES", "HALOS", "ACRId", "EIdER", "AddER", "dEARS", -"SLOSH", "CHIdE", "EASES", "HALOS", "ACRId", "EIdER", "AddER", "dEARS", "SEERS", -"CHIdE", "EASES", "HALOS", "ACRId", "EIdER", "AddER", "dEARS", "SEERS", "OddER", -"EASES", "HALOS", "ACRId", "EIdER", "AddER", "dEARS", "SEERS", "OddER", "SIdLE", -"HALOS", "ACRId", "EIdER", "AddER", "dEARS", "SEERS", "OddER", "SIdLE", "dOLEd", -"ACRId", "EIdER", "AddER", "dEARS", "SEERS", "OddER", "SIdLE", "dOLEd", "HAILS", -"EIdER", "AddER", "dEARS", "SEERS", "OddER", "SIdLE", "dOLEd", "HAILS", "AIREd", -"AddER", "dEARS", "SEERS", "OddER", "SIdLE", "dOLEd", "HAILS", "AIREd", "COCCI", -"dEARS", "SEERS", "OddER", "SIdLE", "dOLEd", "HAILS", "AIREd", "COCCI", "SILOS", -"SEERS", "OddER", "SIdLE", "dOLEd", "HAILS", "AIREd", "COCCI", "SILOS", "dOSEd", -"OddER", "SIdLE", "dOLEd", "HAILS", "AIREd", "COCCI", "SILOS", "dOSEd", "RILLS", -"SIdLE", "dOLEd", "HAILS", "AIREd", "COCCI", "SILOS", "dOSEd", "RILLS", "EARLS", -"dOLEd", "HAILS", "AIREd", "COCCI", "SILOS", "dOSEd", "RILLS", "EARLS", "LAIRS", -"HAILS", "AIREd", "COCCI", "SILOS", "dOSEd", "RILLS", "EARLS", "LAIRS", "IdLER", -"AIREd", "COCCI", "SILOS", "dOSEd", "RILLS", "EARLS", "LAIRS", "IdLER", "SCALd", -"COCCI", "SILOS", "dOSEd", "RILLS", "EARLS", "LAIRS", "IdLER", "SCALd", "AdIOS", -"SILOS", "dOSEd", "RILLS", "EARLS", "LAIRS", "IdLER", "SCALd", "AdIOS", "dALES", -"dOSEd", "RILLS", "EARLS", "LAIRS", "IdLER", "SCALd", "AdIOS", "dALES", "HEEdS", -"RILLS", "EARLS", "LAIRS", "IdLER", "SCALd", "AdIOS", "dALES", "HEEdS", "CEdEd", -"EARLS", "LAIRS", "IdLER", "SCALd", "AdIOS", "dALES", "HEEdS", "CEdEd", "LARCH", -"LAIRS", "IdLER", "SCALd", "AdIOS", "dALES", "HEEdS", "CEdEd", "LARCH", "dOLES", -"IdLER", "SCALd", "AdIOS", "dALES", "HEEdS", "CEdEd", "LARCH", "dOLES", "dROOL", -"SCALd", "AdIOS", "dALES", "HEEdS", "CEdEd", "LARCH", "dOLES", "dROOL", "dELLS", -"AdIOS", "dALES", "HEEdS", "CEdEd", "LARCH", "dOLES", "dROOL", "dELLS", "COCOS", -"dALES", "HEEdS", "CEdEd", "LARCH", "dOLES", "dROOL", "dELLS", "COCOS", "LEERS", -"HEEdS", "CEdEd", "LARCH", "dOLES", "dROOL", "dELLS", "COCOS", "LEERS", "ALIAS", -"CEdEd", "LARCH", "dOLES", "dROOL", "dELLS", "COCOS", "LEERS", "ALIAS", "dICEd", -"LARCH", "dOLES", "dROOL", "dELLS", "COCOS", "LEERS", "ALIAS", "dICEd", "LOdES", -"dOLES", "dROOL", "dELLS", "COCOS", "LEERS", "ALIAS", "dICEd", "LOdES", "IdLEd", -"dROOL", "dELLS", "COCOS", "LEERS", "ALIAS", "dICEd", "LOdES", "IdLEd", "RACER", -"dELLS", "COCOS", "LEERS", "ALIAS", "dICEd", "LOdES", "IdLEd", "RACER", "AILEd", -"COCOS", "LEERS", "ALIAS", "dICEd", "LOdES", "IdLEd", "RACER", "AILEd", "HERES", -"LEERS", "ALIAS", "dICEd", "LOdES", "IdLEd", "RACER", "AILEd", "HERES", "IdLES", -"ALIAS", "dICEd", "LOdES", "IdLEd", "RACER", "AILEd", "HERES", "IdLES", "dOdOS", -"dICEd", "LOdES", "IdLEd", "RACER", "AILEd", "HERES", "IdLES", "dOdOS", "HELLS", -"LOdES", "IdLEd", "RACER", "AILEd", "HERES", "IdLES", "dOdOS", "HELLS", "SOLEd", -"IdLEd", "RACER", "AILEd", "HERES", "IdLES", "dOdOS", "HELLS", "SOLEd", "CASEd", -"RACER", "AILEd", "HERES", "IdLES", "dOdOS", "HELLS", "SOLEd", "CASEd", "COEdS", -"AILEd", "HERES", "IdLES", "dOdOS", "HELLS", "SOLEd", "CASEd", "COEdS", "LORES", -"HERES", "IdLES", "dOdOS", "HELLS", "SOLEd", "CASEd", "COEdS", "LORES", "REARS", -"IdLES", "dOdOS", "HELLS", "SOLEd", "CASEd", "COEdS", "LORES", "REARS", "COLIC", -"dOdOS", "HELLS", "SOLEd", "CASEd", "COEdS", "LORES", "REARS", "COLIC", "SIRES", -"HELLS", "SOLEd", "CASEd", "COEdS", "LORES", "REARS", "COLIC", "SIRES", "SORER", -"SOLEd", "CASEd", "COEdS", "LORES", "REARS", "COLIC", "SIRES", "SORER", "LOLLS", -"CASEd", "COEdS", "LORES", "REARS", "COLIC", "SIRES", "SORER", "LOLLS", "SCAdS", -"COEdS", "LORES", "REARS", "COLIC", "SIRES", "SORER", "LOLLS", "SCAdS", "LEACH", -"LORES", "REARS", "COLIC", "SIRES", "SORER", "LOLLS", "SCAdS", "LEACH", "ARCEd", -"REARS", "COLIC", "SIRES", "SORER", "LOLLS", "SCAdS", "LEACH", "ARCEd", "COREd", -"COLIC", "SIRES", "SORER", "LOLLS", "SCAdS", "LEACH", "ARCEd", "COREd", "dEAdS", -"SIRES", "SORER", "LOLLS", "SCAdS", "LEACH", "ARCEd", "COREd", "dEAdS", "dROLL", -"SORER", "LOLLS", "SCAdS", "LEACH", "ARCEd", "COREd", "dEAdS", "dROLL", "dICES", -"LOLLS", "SCAdS", "LEACH", "ARCEd", "COREd", "dEAdS", "dROLL", "dICES", "CEdES", -"SCAdS", "LEACH", "ARCEd", "COREd", "dEAdS", "dROLL", "dICES", "CEdES", "HOSEd", -"LEACH", "ARCEd", "COREd", "dEAdS", "dROLL", "dICES", "CEdES", "HOSEd", "CRESS", -"ARCEd", "COREd", "dEAdS", "dROLL", "dICES", "CEdES", "HOSEd", "CRESS", "ICIER", -"COREd", "dEAdS", "dROLL", "dICES", "CEdES", "HOSEd", "CRESS", "ICIER", "LARdS", -"dEAdS", "dROLL", "dICES", "CEdES", "HOSEd", "CRESS", "ICIER", "LARdS", "HEROS", -"dROLL", "dICES", "CEdES", "HOSEd", "CRESS", "ICIER", "LARdS", "HEROS", "SHOOS", -"dICES", "CEdES", "HOSEd", "CRESS", "ICIER", "LARdS", "HEROS", "SHOOS", "dECAL", -"CEdES", "HOSEd", "CRESS", "ICIER", "LARdS", "HEROS", "SHOOS", "dECAL", "CILIA", -"HOSEd", "CRESS", "ICIER", "LARdS", "HEROS", "SHOOS", "dECAL", "CILIA", "SEARS", -"CRESS", "ICIER", "LARdS", "HEROS", "SHOOS", "dECAL", "CILIA", "SEARS", "SARIS", -"ICIER", "LARdS", "HEROS", "SHOOS", "dECAL", "CILIA", "SEARS", "SARIS", "dILLS", -"LARdS", "HEROS", "SHOOS", "dECAL", "CILIA", "SEARS", "SARIS", "dILLS", "OILEd", -"HEROS", "SHOOS", "dECAL", "CILIA", "SEARS", "SARIS", "dILLS", "OILEd", "dOERS", -"SHOOS", "dECAL", "CILIA", "SEARS", "SARIS", "dILLS", "OILEd", "dOERS", "ALOHA", -"dECAL", "CILIA", "SEARS", "SARIS", "dILLS", "OILEd", "dOERS", "ALOHA", "RISER", -"CILIA", "SEARS", "SARIS", "dILLS", "OILEd", "dOERS", "ALOHA", "RISER", "CRIER", -"SEARS", "SARIS", "dILLS", "OILEd", "dOERS", "ALOHA", "RISER", "CRIER", "LOESS", -"SARIS", "dILLS", "OILEd", "dOERS", "ALOHA", "RISER", "CRIER", "LOESS", "dECOR", -"dILLS", "OILEd", "dOERS", "ALOHA", "RISER", "CRIER", "LOESS", "dECOR", "SHIEd", -"OILEd", "dOERS", "ALOHA", "RISER", "CRIER", "LOESS", "dECOR", "SHIEd", "dROSS", -"dOERS", "ALOHA", "RISER", "CRIER", "LOESS", "dECOR", "SHIEd", "dROSS", "CREdO", -"ALOHA", "RISER", "CRIER", "LOESS", "dECOR", "SHIEd", "dROSS", "CREdO", "ALOES", -"RISER", "CRIER", "LOESS", "dECOR", "SHIEd", "dROSS", "CREdO", "ALOES", "dIOdE", -"CRIER", "LOESS", "dECOR", "SHIEd", "dROSS", "CREdO", "ALOES", "dIOdE", "COHOS", -"LOESS", "dECOR", "SHIEd", "dROSS", "CREdO", "ALOES", "dIOdE", "COHOS", "SIREE", -"dECOR", "SHIEd", "dROSS", "CREdO", "ALOES", "dIOdE", "COHOS", "SIREE", "OCHRE", -"SHIEd", "dROSS", "CREdO", "ALOES", "dIOdE", "COHOS", "SIREE", "OCHRE", "SIREd", -"dROSS", "CREdO", "ALOES", "dIOdE", "COHOS", "SIREE", "OCHRE", "SIREd", "CAdRE", -"CREdO", "ALOES", "dIOdE", "COHOS", "SIREE", "OCHRE", "SIREd", "CAdRE", "ECHOS", -"ALOES", "dIOdE", "COHOS", "SIREE", "OCHRE", "SIREd", "CAdRE", "ECHOS", "RILEd", -"dIOdE", "COHOS", "SIREE", "OCHRE", "SIREd", "CAdRE", "ECHOS", "RILEd", "CIRCA", -"COHOS", "SIREE", "OCHRE", "SIREd", "CAdRE", "ECHOS", "RILEd", "CIRCA", "HALLO", -"SIREE", "OCHRE", "SIREd", "CAdRE", "ECHOS", "RILEd", "CIRCA", "HALLO", "SHIES", -"OCHRE", "SIREd", "CAdRE", "ECHOS", "RILEd", "CIRCA", "HALLO", "SHIES", "HOLEd", -"SIREd", "CAdRE", "ECHOS", "RILEd", "CIRCA", "HALLO", "SHIES", "HOLEd", "SEdER", -"CAdRE", "ECHOS", "RILEd", "CIRCA", "HALLO", "SHIES", "HOLEd", "SEdER", "REALS", -"ECHOS", "RILEd", "CIRCA", "HALLO", "SHIES", "HOLEd", "SEdER", "REALS", "AERIE", -"RILEd", "CIRCA", "HALLO", "SHIES", "HOLEd", "SEdER", "REALS", "AERIE", "CRASS", -"CIRCA", "HALLO", "SHIES", "HOLEd", "SEdER", "REALS", "AERIE", "CRASS", "dACHA", -"HALLO", "SHIES", "HOLEd", "SEdER", "REALS", "AERIE", "CRASS", "dACHA", "ACHOO", -"SHIES", "HOLEd", "SEdER", "REALS", "AERIE", "CRASS", "dACHA", "ACHOO", "dREAR", -"HOLEd", "SEdER", "REALS", "AERIE", "CRASS", "dACHA", "ACHOO", "dREAR", "ARIAS", -"SEdER", "REALS", "AERIE", "CRASS", "dACHA", "ACHOO", "dREAR", "ARIAS", "HOOCH", -"REALS", "AERIE", "CRASS", "dACHA", "ACHOO", "dREAR", "ARIAS", "HOOCH", "SHILL", -"AERIE", "CRASS", "dACHA", "ACHOO", "dREAR", "ARIAS", "HOOCH", "SHILL", "AHHHH", -"CRASS", "dACHA", "ACHOO", "dREAR", "ARIAS", "HOOCH", "SHILL", "AHHHH", "SHISH", -"dACHA", "ACHOO", "dREAR", "ARIAS", "HOOCH", "SHILL", "AHHHH", "SHISH", "RILES", -"ACHOO", "dREAR", "ARIAS", "HOOCH", "SHILL", "AHHHH", "SHISH", "RILES", "HEERd", -"dREAR", "ARIAS", "HOOCH", "SHILL", "AHHHH", "SHISH", "RILES", "HEERd", "CREEL", -"ARIAS", "HOOCH", "SHILL", "AHHHH", "SHISH", "RILES", "HEERd", "CREEL", "RHEAS", -"HOOCH", "SHILL", "AHHHH", "SHISH", "RILES", "HEERd", "CREEL", "RHEAS", "COdER", -"SHILL", "AHHHH", "SHISH", "RILES", "HEERd", "CREEL", "RHEAS", "COdER", "HALEd", -"AHHHH", "SHISH", "RILES", "HEERd", "CREEL", "RHEAS", "COdER", "HALEd", "CHARd", -"SHISH", "RILES", "HEERd", "CREEL", "RHEAS", "COdER", "HALEd", "CHARd", "SHOEd", -"RILES", "HEERd", "CREEL", "RHEAS", "COdER", "HALEd", "CHARd", "SHOEd", "ESSES", -"HEERd", "CREEL", "RHEAS", "COdER", "HALEd", "CHARd", "SHOEd", "ESSES", "EAREd", -"CREEL", "RHEAS", "COdER", "HALEd", "CHARd", "SHOEd", "ESSES", "EAREd", "ELIdE", -"RHEAS", "COdER", "HALEd", "CHARd", "SHOEd", "ESSES", "EAREd", "ELIdE", "SALSA", -"COdER", "HALEd", "CHARd", "SHOEd", "ESSES", "EAREd", "ELIdE", "SALSA", "AHOLd", -"HALEd", "CHARd", "SHOEd", "ESSES", "EAREd", "ELIdE", "SALSA", "AHOLd", "SHAHS", -"CHARd", "SHOEd", "ESSES", "EAREd", "ELIdE", "SALSA", "AHOLd", "SHAHS", "dISCO", -"SHOEd", "ESSES", "EAREd", "ELIdE", "SALSA", "AHOLd", "SHAHS", "dISCO", "SHARd", -"ESSES", "EAREd", "ELIdE", "SALSA", "AHOLd", "SHAHS", "dISCO", "SHARd", "CORER", -"EAREd", "ELIdE", "SALSA", "AHOLd", "SHAHS", "dISCO", "SHARd", "CORER", "COLAS", -"ELIdE", "SALSA", "AHOLd", "SHAHS", "dISCO", "SHARd", "CORER", "COLAS", "dROId", -"SALSA", "AHOLd", "SHAHS", "dISCO", "SHARd", "CORER", "COLAS", "dROId", "OLdIE", -"AHOLd", "SHAHS", "dISCO", "SHARd", "CORER", "COLAS", "dROId", "OLdIE", "COdAS", -"SHAHS", "dISCO", "SHARd", "CORER", "COLAS", "dROId", "OLdIE", "COdAS", "ORCAS", -"dISCO", "SHARd", "CORER", "COLAS", "dROId", "OLdIE", "COdAS", "ORCAS", "HALES", -"SHARd", "CORER", "COLAS", "dROId", "OLdIE", "COdAS", "ORCAS", "HALES", "REdId", -"CORER", "COLAS", "dROId", "OLdIE", "COdAS", "ORCAS", "HALES", "REdId", "dAdOS", -"COLAS", "dROId", "OLdIE", "COdAS", "ORCAS", "HALES", "REdId", "dAdOS", "CLAdS", -"dROId", "OLdIE", "COdAS", "ORCAS", "HALES", "REdId", "dAdOS", "CLAdS", "OOdLE", -"OLdIE", "COdAS", "ORCAS", "HALES", "REdId", "dAdOS", "CLAdS", "OOdLE", "HIdER", -"COdAS", "ORCAS", "HALES", "REdId", "dAdOS", "CLAdS", "OOdLE", "HIdER", "dELIS", -"ORCAS", "HALES", "REdId", "dAdOS", "CLAdS", "OOdLE", "HIdER", "dELIS", "SCROd", -"HALES", "REdId", "dAdOS", "CLAdS", "OOdLE", "HIdER", "dELIS", "SCROd", "SHIRE", -"REdId", "dAdOS", "CLAdS", "OOdLE", "HIdER", "dELIS", "SCROd", "SHIRE", "AddLE", -"dAdOS", "CLAdS", "OOdLE", "HIdER", "dELIS", "SCROd", "SHIRE", "AddLE", "dEICE", -"CLAdS", "OOdLE", "HIdER", "dELIS", "SCROd", "SHIRE", "AddLE", "dEICE", "ORALS", -"OOdLE", "HIdER", "dELIS", "SCROd", "SHIRE", "AddLE", "dEICE", "ORALS", "HIRER", -"HIdER", "dELIS", "SCROd", "SHIRE", "AddLE", "dEICE", "ORALS", "HIRER", "ROILS", -"dELIS", "SCROd", "SHIRE", "AddLE", "dEICE", "ORALS", "HIRER", "ROILS", "dOLOR", -"SCROd", "SHIRE", "AddLE", "dEICE", "ORALS", "HIRER", "ROILS", "dOLOR", "ILIAC", -"SHIRE", "AddLE", "dEICE", "ORALS", "HIRER", "ROILS", "dOLOR", "ILIAC", "CILLS", -"AddLE", "dEICE", "ORALS", "HIRER", "ROILS", "dOLOR", "ILIAC", "CILLS", "LOCOS", -"dEICE", "ORALS", "HIRER", "ROILS", "dOLOR", "ILIAC", "CILLS", "LOCOS", "HILAR", -"ORALS", "HIRER", "ROILS", "dOLOR", "ILIAC", "CILLS", "LOCOS", "HILAR", "CROCS", -"HIRER", "ROILS", "dOLOR", "ILIAC", "CILLS", "LOCOS", "HILAR", "CROCS", "OHHHH", -"ROILS", "dOLOR", "ILIAC", "CILLS", "LOCOS", "HILAR", "CROCS", "OHHHH", "SECCO", -"dOLOR", "ILIAC", "CILLS", "LOCOS", "HILAR", "CROCS", "OHHHH", "SECCO", "SHAdS", -"ILIAC", "CILLS", "LOCOS", "HILAR", "CROCS", "OHHHH", "SECCO", "SHAdS", "CHOOS", -"CILLS", "LOCOS", "HILAR", "CROCS", "OHHHH", "SECCO", "SHAdS", "CHOOS", "AREAL", -"LOCOS", "HILAR", "CROCS", "OHHHH", "SECCO", "SHAdS", "CHOOS", "AREAL", "dIdOS", -"HILAR", "CROCS", "OHHHH", "SECCO", "SHAdS", "CHOOS", "AREAL", "dIdOS", "COOCH", -"CROCS", "OHHHH", "SECCO", "SHAdS", "CHOOS", "AREAL", "dIdOS", "COOCH", "CHILE", -"OHHHH", "SECCO", "SHAdS", "CHOOS", "AREAL", "dIdOS", "COOCH", "CHILE", "OCHER", -"SECCO", "SHAdS", "CHOOS", "AREAL", "dIdOS", "COOCH", "CHILE", "OCHER", "dOLCE", -"SHAdS", "CHOOS", "AREAL", "dIdOS", "COOCH", "CHILE", "OCHER", "dOLCE", "SLOES", -"CHOOS", "AREAL", "dIdOS", "COOCH", "CHILE", "OCHER", "dOLCE", "SLOES", "LAIRd", -"AREAL", "dIdOS", "COOCH", "CHILE", "OCHER", "dOLCE", "SLOES", "LAIRd", "SHERd", -"dIdOS", "COOCH", "CHILE", "OCHER", "dOLCE", "SLOES", "LAIRd", "SHERd", "CHARS", -"COOCH", "CHILE", "OCHER", "dOLCE", "SLOES", "LAIRd", "SHERd", "CHARS", "HAdES", -"CHILE", "OCHER", "dOLCE", "SLOES", "LAIRd", "SHERd", "CHARS", "HAdES", "HOARS", -"OCHER", "dOLCE", "SLOES", "LAIRd", "SHERd", "CHARS", "HAdES", "HOARS", "dARER", -"dOLCE", "SLOES", "LAIRd", "SHERd", "CHARS", "HAdES", "HOARS", "dARER", "ROIdS", -"SLOES", "LAIRd", "SHERd", "CHARS", "HAdES", "HOARS", "dARER", "ROIdS", "ARRAS", -"LAIRd", "SHERd", "CHARS", "HAdES", "HOARS", "dARER", "ROIdS", "ARRAS", "HALER", -"SHERd", "CHARS", "HAdES", "HOARS", "dARER", "ROIdS", "ARRAS", "HALER", "AIRER", -"CHARS", "HAdES", "HOARS", "dARER", "ROIdS", "ARRAS", "HALER", "AIRER", "CASAS", -"HAdES", "HOARS", "dARER", "ROIdS", "ARRAS", "HALER", "AIRER", "CASAS", "CARER", -"HOARS", "dARER", "ROIdS", "ARRAS", "HALER", "AIRER", "CASAS", "CARER", "OAREd", -"dARER", "ROIdS", "ARRAS", "HALER", "AIRER", "CASAS", "CARER", "OAREd", "RILLE", -"ROIdS", "ARRAS", "HALER", "AIRER", "CASAS", "CARER", "OAREd", "RILLE", "RICEd", -"ARRAS", "HALER", "AIRER", "CASAS", "CARER", "OAREd", "RILLE", "RICEd", "LIRAS", -"HALER", "AIRER", "CASAS", "CARER", "OAREd", "RILLE", "RICEd", "LIRAS", "AIdER", -"AIRER", "CASAS", "CARER", "OAREd", "RILLE", "RICEd", "LIRAS", "AIdER", "ICHOR", -"CASAS", "CARER", "OAREd", "RILLE", "RICEd", "LIRAS", "AIdER", "ICHOR", "LOCHS", -"CARER", "OAREd", "RILLE", "RICEd", "LIRAS", "AIdER", "ICHOR", "LOCHS", "CALLA", -"OAREd", "RILLE", "RICEd", "LIRAS", "AIdER", "ICHOR", "LOCHS", "CALLA", "COCAS", -"RILLE", "RICEd", "LIRAS", "AIdER", "ICHOR", "LOCHS", "CALLA", "COCAS", "OILER", -"RICEd", "LIRAS", "AIdER", "ICHOR", "LOCHS", "CALLA", "COCAS", "OILER", "ASSAI", -"LIRAS", "AIdER", "ICHOR", "LOCHS", "CALLA", "COCAS", "OILER", "ASSAI", "LAdES", -"AIdER", "ICHOR", "LOCHS", "CALLA", "COCAS", "OILER", "ASSAI", "LAdES", "SHIER", -"ICHOR", "LOCHS", "CALLA", "COCAS", "OILER", "ASSAI", "LAdES", "SHIER", "dICER", -"LOCHS", "CALLA", "COCAS", "OILER", "ASSAI", "LAdES", "SHIER", "dICER", "OLEOS", -"CALLA", "COCAS", "OILER", "ASSAI", "LAdES", "SHIER", "dICER", "OLEOS", "SHOER", -"COCAS", "OILER", "ASSAI", "LAdES", "SHIER", "dICER", "OLEOS", "SHOER", "HOdAd", -"OILER", "ASSAI", "LAdES", "SHIER", "dICER", "OLEOS", "SHOER", "HOdAd", "IOdIC", -"ASSAI", "LAdES", "SHIER", "dICER", "OLEOS", "SHOER", "HOdAd", "IOdIC", "LIERS", -"LAdES", "SHIER", "dICER", "OLEOS", "SHOER", "HOdAd", "IOdIC", "LIERS", "AIOLI", -"SHIER", "dICER", "OLEOS", "SHOER", "HOdAd", "IOdIC", "LIERS", "AIOLI", "HOERS", -"dICER", "OLEOS", "SHOER", "HOdAd", "IOdIC", "LIERS", "AIOLI", "HOERS", "SLIER", -"OLEOS", "SHOER", "HOdAd", "IOdIC", "LIERS", "AIOLI", "HOERS", "SLIER", "LASES", -"SHOER", "HOdAd", "IOdIC", "LIERS", "AIOLI", "HOERS", "SLIER", "LASES", "RASAE", -"HOdAd", "IOdIC", "LIERS", "AIOLI", "HOERS", "SLIER", "LASES", "RASAE", "SOCLE", -"IOdIC", "LIERS", "AIOLI", "HOERS", "SLIER", "LASES", "RASAE", "SOCLE", "RICER", -"LIERS", "AIOLI", "HOERS", "SLIER", "LASES", "RASAE", "SOCLE", "RICER", "HAddA", -"AIOLI", "HOERS", "SLIER", "LASES", "RASAE", "SOCLE", "RICER", "HAddA", "RICES", -"HOERS", "SLIER", "LASES", "RASAE", "SOCLE", "RICER", "HAddA", "RICES", "ROOdS", -"SLIER", "LASES", "RASAE", "SOCLE", "RICER", "HAddA", "RICES", "ROOdS", "CEdER", -"LASES", "RASAE", "SOCLE", "RICER", "HAddA", "RICES", "ROOdS", "CEdER", "CEILS", -"RASAE", "SOCLE", "RICER", "HAddA", "RICES", "ROOdS", "CEdER", "CEILS", "LISLE", -"SOCLE", "RICER", "HAddA", "RICES", "ROOdS", "CEdER", "CEILS", "LISLE", "OLIOS", -"RICER", "HAddA", "RICES", "ROOdS", "CEdER", "CEILS", "LISLE", "OLIOS", "dOSER", -"HAddA", "RICES", "ROOdS", "CEdER", "CEILS", "LISLE", "OLIOS", "dOSER", "dILdO", -"RICES", "ROOdS", "CEdER", "CEILS", "LISLE", "OLIOS", "dOSER", "dILdO", "SELAH", -"ROOdS", "CEdER", "CEILS", "LISLE", "OLIOS", "dOSER", "dILdO", "SELAH", "RIALS", -"CEdER", "CEILS", "LISLE", "OLIOS", "dOSER", "dILdO", "SELAH", "RIALS", "ICERS", -"CEILS", "LISLE", "OLIOS", "dOSER", "dILdO", "SELAH", "RIALS", "ICERS", "SHIRR", -"LISLE", "OLIOS", "dOSER", "dILdO", "SELAH", "RIALS", "ICERS", "SHIRR", "LAdEd", -"OLIOS", "dOSER", "dILdO", "SELAH", "RIALS", "ICERS", "SHIRR", "LAdEd", "LASEd", -"dOSER", "dILdO", "SELAH", "RIALS", "ICERS", "SHIRR", "LAdEd", "LASEd", "HOLER", -"SELAH", "RIALS", "ICERS", "SHIRR", "LAdEd", "LASEd", "HOLER", "LACER", "ARSES", -"dILdO", "SELAH", "RIALS", "ICERS", "SHIRR", "LAdEd", "LASEd", "HOLER", "LACER", -"RIALS", "ICERS", "SHIRR", "LAdEd", "LASEd", "HOLER", "LACER", "ARSES", "CIRRI", -"ICERS", "SHIRR", "LAdEd", "LASEd", "HOLER", "LACER", "ARSES", "CIRRI", "dIRER", -"SHIRR", "LAdEd", "LASEd", "HOLER", "LACER", "ARSES", "CIRRI", "dIRER", "ASSEd", -"LAdEd", "LASEd", "HOLER", "LACER", "ARSES", "CIRRI", "dIRER", "ASSEd", "OSIER", + "PLACE", "SINCE", "PAPER", "LINES", "LEARN", "SPACE", "CLOSE", "CLASS", "PIECE", + "COLOR", "ALONE", "PLANE", "SPELL", "CLEAR", "AREAS", "SENSE", "OCEAN", "SCALE", + "CELLS", "SLEEP", "LOCAL", "CLEAN", "PEACE", "CROSS", "CASES", "CROPS", "PLAIN", + "PAIRS", "SCORE", "NOISE", "PIANO", "PLANS", "PRICE", "RAISE", "SCENE", "PRESS", + "APPLE", "CALLS", "POLES", "LOOSE", "OPERA", "INNER", "SOLAR", "RISES", "SALES", + "ACRES", "ERROR", "NAILS", "COINS", "SLOPE", "CANOE", "CANAL", "LIONS", "AROSE", + "RACES", "SPARE", "PIPES", "RAINS", "ROLLS", "SAILS", "ARISE", "ROPES", "CRIES", + "OPENS", "APRON", "SPEAR", "SLICE", "SPOON", "ROSES", "LINEN", "POLAR", "PEARL", + "LOSES", "CORAL", "SPOIL", "PANEL", "SELLS", "COOLS", "SOILS", "POOLS", "RISEN", + "PILES", "SLAIN", "PANIC", "CRISP", "RAILS", "SCOPE", "CONES", "COCOA", "REINS", + "NOSES", "SCARE", "CEASE", "PRIOR", "POLIO", "SEALS", "COALS", "LOANS", "SPINS", + "PAINS", "ONION", "SCRAP", "ROLES", "SNAIL", "LOOPS", "CREEP", "CARES", "ALIEN", + "CRANE", "SLIPS", "SPINE", "LEAPS", "PROSE", "SNARE", "PINES", "SCALP", "LEASE", + "COILS", "ARENA", "PEARS", "CLIPS", "LANES", "RESIN", "SONAR", "CORPS", "NIECE", + "CELLO", "REPEL", "SPICE", "OASIS", "PACES", "COLON", "CACAO", "RINSE", "SPOOL", + "SPILL", "SNAPS", "EERIE", "EARNS", "PERIL", "LINER", "SCARS", "SOLES", "PAILS", + "CAROL", "CANON", "POLLS", "NASAL", "SCORN", "OASES", "ASSES", "PILLS", "SPORE", + "SPIES", "ERASE", "AISLE", "LOINS", "LEANS", "LANCE", "PANES", "PORES", "POISE", + "IRONS", "ROARS", "SCOOP", "LASSO", "PRONE", "NICER", "SNARL", "CORES", "RIPEN", + "PEERS", "EASEL", "LACES", "SOAPS", "SNIPS", "PIERS", "LASER", "LILAC", "SIREN", + "CLASP", "POSSE", "POSES", "SLOOP", "SLAPS", "SOLOS", "SISAL", "SEEPS", "SPANS", + "CLAPS", "ACORN", "LOSER", "LAPSE", "ASPEN", "SNORE", "PROPS", "PESOS", "SONIC", + "SPARS", "SORES", "RELIC", "NOOSE", "NEARS", "CAPES", "CANES", "SPIRE", "ISLES", + "SNEER", "RARER", "NINES", "PECAN", "PENCE", "SILLS", "COPRA", "POPES", "SPREE", + "SCANS", "REELS", "LIARS", "LEPER", "SOARS", "PLEAS", "PALER", "EPICS", "CAPER", + "CONIC", "OPALS", "EASES", "ARSON", "CLANS", "PLIES", "CROON", "PREEN", "SEERS", + "COCCI", "SILOS", "SNIPE", "SANER", "RILLS", "CORNS", "PRIES", "LOONS", "EARLS", + "PEONS", "PALES", "LAIRS", "PEELS", "PEALS", "CRONE", "ENROL", "COOPS", "LAPEL", + "RASPS", "ASPIC", "PENIS", "INANE", "SLOPS", "COCOS", "LEERS", "LOPES", "ALIAS", + "RACER", "COPSE", "PALLS", "COPES", "ICONS", "REAPS", "SNOOP", "LORES", "REARS", + "COLIC", "PLOPS", "SIRES", "CARPS", "LISPS", "PEEPS", "SORER", "LOLLS", "PARES", + "ACNES", "NEONS", "NOONS", "PAPAS", "RIPER", "ELOPE", "CRESS", "NAPES", "ICIER", + "CILIA", "SEARS", "SARIS", "PAPAL", "ROSIN", "CREPE", "RISER", "PACER", "SALON", + "CRIER", "LOESS", "PIPER", "COONS", "SEINE", "IONIC", "SCRIP", "PENAL", "ALOES", + "APACE", "SIREE", "ROPER", "ANION", "LONER", "CIRCA", "CARNE", "ANISE", "SPECS", + "ANNAS", "PICAS", "REALS", "AERIE", "ORLON", "CRASS", "SPIEL", "LAPIS", "ARIAS", + "PAEAN", "SINES", "SCION", "RAPES", "SCARP", "SEPIA", "POSER", "LIENS", "RILES", + "APSES", "NONCE", "ANOLE", "RECAP", "CARON", "PORNO", "CREEL", "CAPOS", "OPINE", + "NISEI", "RERAN", "NARCO", "CLOPS", "ESSES", "SCONE", "SALSA", "ROANS", "RAPER", + "CORER", "COLAS", "CAIRN", "CRAPS", "CLONE", "NOELS", "ORCAS", "PARSE", "EPEES", + "LANAI", "SEPAL", "CAPON", "PREPS", "NARCS", "REPRO", "ORALS", "ROILS", "ILIAC", + "CILLS", "LOCOS", "RENAL", "CROCS", "PARAS", "SECCO", "PIONS", "PARER", "PLEIN", + "AREAL", "SOLON", "PSOAS", "SCOPS", "SLOES", "NOIRE", "POLIS", "PASSE", "NONES", + "SARAN", "POLOS", "APERS", "ARRAS", "PRISE", "SPIER", "AIRER", "APIAN", "CASAS", + "CARER", "POOPS", "SPINA", "PENES", "RILLE", "CANER", "LIRAS", "PRIER", "LOPER", + "CALLA", "PONES", "COCAS", "OILER", "ASSAI", "LAPIN", "ASANA", "OLEOS", "LIERS", + "ANILE", "PLENA", "AIOLI", "SLIER", "CANNA", "PEASE", "LASES", "RASAE", "PAREN", + "SOCLE", "RICER", "RICES", "ELANS", "CEILS", "LISLE", "OLIOS", "APSOS", "RIALS", + "ICERS", "COPER", "PEENS", "POLER", "LACER", "ARSES", "SPOOR", "CIRRI", "APNEA", + "NARES", "OSIER", }; static const uint32_t _num_words = (sizeof(_legal_words) / sizeof(_legal_words[0])); @@ -478,10 +120,13 @@ static uint32_t get_random(uint32_t max) { #endif } -static void display_letter(wordle_state_t *state) { +static void display_letter(wordle_state_t *state, bool display_dash) { char buf[1 + 1]; if (state->word_elements[state->position] >= _num_valid_letters) { - watch_display_string("-", state->position + 5); + if (display_dash) + watch_display_string("-", state->position + 5); + else + watch_display_string(" ", state->position + 5); return; } sprintf(buf, "%c", _valid_letters[state->word_elements[state->position]]); @@ -492,7 +137,7 @@ static void display_all_letters(wordle_state_t *state) { uint8_t prev_pos = state->position; for (size_t i = 0; i < WORDLE_LENGTH; i++) { state->position = i; - display_letter(state); + display_letter(state, false); } state->position = prev_pos; } @@ -512,8 +157,8 @@ static bool check_word(wordle_state_t *state) { // Wrong Location for (size_t i = 0; i < WORDLE_LENGTH; i++) { - if (state->word_elements_result[i] != WORDLE_LETTER_WRONG) continue; for (size_t j = 0; j < WORDLE_LENGTH; j++) { + if (state->word_elements_result[j] != WORDLE_LETTER_WRONG) continue; if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][j]) { printf("me: %c them: %c\r\n", _valid_letters[state->word_elements[i]], _legal_words[state->curr_answer][j]); state->word_elements_result[j] = WORDLE_LETTER_WRONG_LOC; @@ -550,12 +195,18 @@ static void reset_board(wordle_state_t *state) { watch_display_string(" ", 4); display_attempt(state->attempt); display_all_letters(state); + watch_display_string("-", 5); printf("rand: %s\r\n", _legal_words[state->curr_answer]); } static void display_title(wordle_state_t *state) { - char buf[11]; state->curr_screen = SCREEN_TITLE; + watch_display_string("WO WORDLE", 0); +} + +static void display_streak(wordle_state_t *state) { + char buf[12]; + state->curr_screen = SCREEN_STREAK; printf("streak %d \r\n", state->streak); sprintf(buf, "WO St%2ddy", state->streak); watch_display_string(buf, 0); @@ -563,13 +214,14 @@ static void display_title(wordle_state_t *state) { } static void display_lose(wordle_state_t *state, uint8_t subsecond) { - char buf[WORDLE_LENGTH + 5]; + char buf[WORDLE_LENGTH + 6]; sprintf(buf," L %s", subsecond % 2 ? _legal_words[state->curr_answer] : " "); watch_display_string(buf, 0); } static void display_win(wordle_state_t *state, uint8_t subsecond) { - char buf[11]; + (void) state; + char buf[13]; sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOb "); watch_display_string(buf, 0); } @@ -625,7 +277,9 @@ static void display_result(wordle_state_t *state, uint8_t subsecond) { } static bool act_on_btn(wordle_state_t *state) { - if (state->curr_screen == SCREEN_RESULT) { + switch (state->curr_screen) + { + case SCREEN_RESULT: for (size_t i = 0; i < WORDLE_LENGTH; i++) { if (state->word_elements_result[i] != WORDLE_LETTER_CORRECT) state->word_elements[i] = _num_valid_letters; @@ -635,14 +289,18 @@ static bool act_on_btn(wordle_state_t *state) { state->position = get_first_pos(state->word_elements_result); state->curr_screen = SCREEN_PLAYING; return true; - } - if (state->curr_screen == SCREEN_TITLE) { + case SCREEN_TITLE: + display_streak(state); + return true; + case SCREEN_STREAK: reset_board(state); return true; - } - if (state->curr_screen >= SCREEN_WIN) { + case SCREEN_WIN: + case SCREEN_LOSE: display_title(state); - return true; + return true; + default: + return false; } return false; } @@ -681,7 +339,7 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi { case SCREEN_PLAYING: if (event.subsecond % 2) { - display_letter(state); + display_letter(state, true); } else { watch_display_string(" ", state->position + 5); } @@ -703,16 +361,16 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi if (act_on_btn(state)) break; if (state->word_elements[state->position] >= _num_valid_letters) state->word_elements[state->position] = 0; else state->word_elements[state->position] = (state->word_elements[state->position] + 1) % _num_valid_letters; - display_letter(state); + display_letter(state, true); break; case EVENT_LIGHT_LONG_PRESS: if (state->word_elements[state->position] >= _num_valid_letters) state->word_elements[state->position] = _num_valid_letters - 1; else state->word_elements[state->position] = (state->word_elements[state->position] + _num_valid_letters - 1) % _num_valid_letters; - display_letter(state); + display_letter(state, true); break; case EVENT_ALARM_BUTTON_UP: if (act_on_btn(state)) break; - display_letter(state); + display_letter(state, true); if (state->word_elements[state->position] == _num_valid_letters) break; state->position = get_next_pos(state->position, state->word_elements_result); if(WORDLE_LENGTH == (state->position)) { @@ -722,7 +380,7 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi state->streak++; break; } - if (state->attempt++ > WORDLE_MAX_ATTEMPTS) { + if (state->attempt++ >= WORDLE_MAX_ATTEMPTS) { state->curr_screen = SCREEN_LOSE; state->streak = 0; break; @@ -732,7 +390,7 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi } break; case EVENT_ALARM_LONG_PRESS: - display_letter(state); + display_letter(state, true); state->position = get_prev_pos(state->position, state->word_elements_result); break; case EVENT_LIGHT_BUTTON_DOWN: diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 542a01b4..b8e5d0f5 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -49,6 +49,7 @@ typedef enum { SCREEN_PLAYING = 0, SCREEN_RESULT, SCREEN_TITLE, + SCREEN_STREAK, SCREEN_WIN, SCREEN_LOSE, SCREEN_COUNT diff --git a/utils/wordle_list.py b/utils/wordle_list.py new file mode 100644 index 00000000..30da4bd3 --- /dev/null +++ b/utils/wordle_list.py @@ -0,0 +1,697 @@ +# From: https://github.com/charlesreid1/five-letter-words/blob/master/sgb-words.txt +words = [ + "WHICH", "THERE", "THEIR", "ABOUT", "WOULD", "THESE", "OTHER", "WORDS", "COULD", + "WRITE", "FIRST", "WATER", "AFTER", "WHERE", "RIGHT", "THINK", "THREE", "YEARS", + "PLACE", "SOUND", "GREAT", "AGAIN", "STILL", "EVERY", "SMALL", "FOUND", "THOSE", + "NEVER", "UNDER", "MIGHT", "WHILE", "HOUSE", "WORLD", "BELOW", "ASKED", "GOING", + "LARGE", "UNTIL", "ALONG", "SHALL", "BEING", "OFTEN", "EARTH", "BEGAN", "SINCE", + "STUDY", "NIGHT", "LIGHT", "ABOVE", "PAPER", "PARTS", "YOUNG", "STORY", "POINT", + "TIMES", "HEARD", "WHOLE", "WHITE", "GIVEN", "MEANS", "MUSIC", "MILES", "THING", + "TODAY", "LATER", "USING", "MONEY", "LINES", "ORDER", "GROUP", "AMONG", "LEARN", + "KNOWN", "SPACE", "TABLE", "EARLY", "TREES", "SHORT", "HANDS", "STATE", "BLACK", + "SHOWN", "STOOD", "FRONT", "VOICE", "KINDS", "MAKES", "COMES", "CLOSE", "POWER", + "LIVED", "VOWEL", "TAKEN", "BUILT", "HEART", "READY", "QUITE", "CLASS", "BRING", + "ROUND", "HORSE", "SHOWS", "PIECE", "GREEN", "STAND", "BIRDS", "START", "RIVER", + "TRIED", "LEAST", "FIELD", "WHOSE", "GIRLS", "LEAVE", "ADDED", "COLOR", "THIRD", + "HOURS", "MOVED", "PLANT", "DOING", "NAMES", "FORMS", "HEAVY", "IDEAS", "CRIED", + "CHECK", "FLOOR", "BEGIN", "WOMAN", "ALONE", "PLANE", "SPELL", "WATCH", "CARRY", + "WROTE", "CLEAR", "NAMED", "BOOKS", "CHILD", "GLASS", "HUMAN", "TAKES", "PARTY", + "BUILD", "SEEMS", "BLOOD", "SIDES", "SEVEN", "MOUTH", "SOLVE", "NORTH", "VALUE", + "DEATH", "MAYBE", "HAPPY", "TELLS", "GIVES", "LOOKS", "SHAPE", "LIVES", "STEPS", + "AREAS", "SENSE", "SPEAK", "FORCE", "OCEAN", "SPEED", "WOMEN", "METAL", "SOUTH", + "GRASS", "SCALE", "CELLS", "LOWER", "SLEEP", "WRONG", "PAGES", "SHIPS", "NEEDS", + "ROCKS", "EIGHT", "MAJOR", "LEVEL", "TOTAL", "AHEAD", "REACH", "STARS", "STORE", + "SIGHT", "TERMS", "CATCH", "WORKS", "BOARD", "COVER", "SONGS", "EQUAL", "STONE", + "WAVES", "GUESS", "DANCE", "SPOKE", "BREAK", "CAUSE", "RADIO", "WEEKS", "LANDS", + "BASIC", "LIKED", "TRADE", "FRESH", "FINAL", "FIGHT", "MEANT", "DRIVE", "SPENT", + "LOCAL", "WAXES", "KNOWS", "TRAIN", "BREAD", "HOMES", "TEETH", "COAST", "THICK", + "BROWN", "CLEAN", "QUIET", "SUGAR", "FACTS", "STEEL", "FORTH", "RULES", "NOTES", + "UNITS", "PEACE", "MONTH", "VERBS", "SEEDS", "HELPS", "SHARP", "VISIT", "WOODS", + "CHIEF", "WALLS", "CROSS", "WINGS", "GROWN", "CASES", "FOODS", "CROPS", "FRUIT", + "STICK", "WANTS", "STAGE", "SHEEP", "NOUNS", "PLAIN", "DRINK", "BONES", "APART", + "TURNS", "MOVES", "TOUCH", "ANGLE", "BASED", "RANGE", "MARKS", "TIRED", "OLDER", + "FARMS", "SPEND", "SHOES", "GOODS", "CHAIR", "TWICE", "CENTS", "EMPTY", "ALIKE", + "STYLE", "BROKE", "PAIRS", "COUNT", "ENJOY", "SCORE", "SHORE", "ROOTS", "PAINT", + "HEADS", "SHOOK", "SERVE", "ANGRY", "CROWD", "WHEEL", "QUICK", "DRESS", "SHARE", + "ALIVE", "NOISE", "SOLID", "CLOTH", "SIGNS", "HILLS", "TYPES", "DRAWN", "WORTH", + "TRUCK", "PIANO", "UPPER", "LOVED", "USUAL", "FACES", "DROVE", "CABIN", "BOATS", + "TOWNS", "PROUD", "COURT", "MODEL", "PRIME", "FIFTY", "PLANS", "YARDS", "PROVE", + "TOOLS", "PRICE", "SHEET", "SMELL", "BOXES", "RAISE", "MATCH", "TRUTH", "ROADS", + "THREW", "ENEMY", "LUNCH", "CHART", "SCENE", "GRAPH", "DOUBT", "GUIDE", "WINDS", + "BLOCK", "GRAIN", "SMOKE", "MIXED", "GAMES", "WAGON", "SWEET", "TOPIC", "EXTRA", + "PLATE", "TITLE", "KNIFE", "FENCE", "FALLS", "CLOUD", "WHEAT", "PLAYS", "ENTER", + "BROAD", "STEAM", "ATOMS", "PRESS", "LYING", "BASIS", "CLOCK", "TASTE", "GROWS", + "THANK", "STORM", "AGREE", "BRAIN", "TRACK", "SMILE", "FUNNY", "BEACH", "STOCK", + "HURRY", "SAVED", "SORRY", "GIANT", "TRAIL", "OFFER", "OUGHT", "ROUGH", "DAILY", + "AVOID", "KEEPS", "THROW", "ALLOW", "CREAM", "LAUGH", "EDGES", "TEACH", "FRAME", + "BELLS", "DREAM", "MAGIC", "OCCUR", "ENDED", "CHORD", "FALSE", "SKILL", "HOLES", + "DOZEN", "BRAVE", "APPLE", "CLIMB", "OUTER", "PITCH", "RULER", "HOLDS", "FIXED", + "COSTS", "CALLS", "BLANK", "STAFF", "LABOR", "EATEN", "YOUTH", "TONES", "HONOR", + "GLOBE", "GASES", "DOORS", "POLES", "LOOSE", "APPLY", "TEARS", "EXACT", "BRUSH", + "CHEST", "LAYER", "WHALE", "MINOR", "FAITH", "TESTS", "JUDGE", "ITEMS", "WORRY", + "WASTE", "HOPED", "STRIP", "BEGUN", "ASIDE", "LAKES", "BOUND", "DEPTH", "CANDY", + "EVENT", "WORSE", "AWARE", "SHELL", "ROOMS", "RANCH", "IMAGE", "SNAKE", "ALOUD", + "DRIED", "LIKES", "MOTOR", "POUND", "KNEES", "REFER", "FULLY", "CHAIN", "SHIRT", + "FLOUR", "DROPS", "SPITE", "ORBIT", "BANKS", "SHOOT", "CURVE", "TRIBE", "TIGHT", + "BLIND", "SLEPT", "SHADE", "CLAIM", "FLIES", "THEME", "QUEEN", "FIFTH", "UNION", + "HENCE", "STRAW", "ENTRY", "ISSUE", "BIRTH", "FEELS", "ANGER", "BRIEF", "RHYME", + "GLORY", "GUARD", "FLOWS", "FLESH", "OWNED", "TRICK", "YOURS", "SIZES", "NOTED", + "WIDTH", "BURST", "ROUTE", "LUNGS", "UNCLE", "BEARS", "ROYAL", "KINGS", "FORTY", + "TRIAL", "CARDS", "BRASS", "OPERA", "CHOSE", "OWNER", "VAPOR", "BEATS", "MOUSE", + "TOUGH", "WIRES", "METER", "TOWER", "FINDS", "INNER", "STUCK", "ARROW", "POEMS", + "LABEL", "SWING", "SOLAR", "TRULY", "TENSE", "BEANS", "SPLIT", "RISES", "WEIGH", + "HOTEL", "STEMS", "PRIDE", "SWUNG", "GRADE", "DIGIT", "BADLY", "BOOTS", "PILOT", + "SALES", "SWEPT", "LUCKY", "PRIZE", "STOVE", "TUBES", "ACRES", "WOUND", "STEEP", + "SLIDE", "TRUNK", "ERROR", "PORCH", "SLAVE", "EXIST", "FACED", "MINES", "MARRY", + "JUICE", "RACED", "WAVED", "GOOSE", "TRUST", "FEWER", "FAVOR", "MILLS", "VIEWS", + "JOINT", "EAGER", "SPOTS", "BLEND", "RINGS", "ADULT", "INDEX", "NAILS", "HORNS", + "BALLS", "FLAME", "RATES", "DRILL", "TRACE", "SKINS", "WAXED", "SEATS", "STUFF", + "RATIO", "MINDS", "DIRTY", "SILLY", "COINS", "HELLO", "TRIPS", "LEADS", "RIFLE", + "HOPES", "BASES", "SHINE", "BENCH", "MORAL", "FIRES", "MEALS", "SHAKE", "SHOPS", + "CYCLE", "MOVIE", "SLOPE", "CANOE", "TEAMS", "FOLKS", "FIRED", "BANDS", "THUMB", + "SHOUT", "CANAL", "HABIT", "REPLY", "RULED", "FEVER", "CRUST", "SHELF", "WALKS", + "MIDST", "CRACK", "PRINT", "TALES", "COACH", "STIFF", "FLOOD", "VERSE", "AWAKE", + "ROCKY", "MARCH", "FAULT", "SWIFT", "FAINT", "CIVIL", "GHOST", "FEAST", "BLADE", + "LIMIT", "GERMS", "READS", "DUCKS", "DAIRY", "WORST", "GIFTS", "LISTS", "STOPS", + "RAPID", "BRICK", "CLAWS", "BEADS", "BEAST", "SKIRT", "CAKES", "LIONS", "FROGS", + "TRIES", "NERVE", "GRAND", "ARMED", "TREAT", "HONEY", "MOIST", "LEGAL", "PENNY", + "CROWN", "SHOCK", "TAXES", "SIXTY", "ALTAR", "PULLS", "SPORT", "DRUMS", "TALKS", + "DYING", "DATES", "DRANK", "BLOWS", "LEVER", "WAGES", "PROOF", "DRUGS", "TANKS", + "SINGS", "TAILS", "PAUSE", "HERDS", "AROSE", "HATED", "CLUES", "NOVEL", "SHAME", + "BURNT", "RACES", "FLASH", "WEARY", "HEELS", "TOKEN", "COATS", "SPARE", "SHINY", + "ALARM", "DIMES", "SIXTH", "CLERK", "MERCY", "SUNNY", "GUEST", "FLOAT", "SHONE", + "PIPES", "WORMS", "BILLS", "SWEAT", "SUITS", "SMART", "UPSET", "RAINS", "SANDY", + "RAINY", "PARKS", "SADLY", "FANCY", "RIDER", "UNITY", "BUNCH", "ROLLS", "CRASH", + "CRAFT", "NEWLY", "GATES", "HATCH", "PATHS", "FUNDS", "WIDER", "GRACE", "GRAVE", + "TIDES", "ADMIT", "SHIFT", "SAILS", "PUPIL", "TIGER", "ANGEL", "CRUEL", "AGENT", + "DRAMA", "URGED", "PATCH", "NESTS", "VITAL", "SWORD", "BLAME", "WEEDS", "SCREW", + "VOCAL", "BACON", "CHALK", "CARGO", "CRAZY", "ACTED", "GOATS", "ARISE", "WITCH", + "LOVES", "QUEER", "DWELL", "BACKS", "ROPES", "SHOTS", "MERRY", "PHONE", "CHEEK", + "PEAKS", "IDEAL", "BEARD", "EAGLE", "CREEK", "CRIES", "ASHES", "STALL", "YIELD", + "MAYOR", "OPENS", "INPUT", "FLEET", "TOOTH", "CUBIC", "WIVES", "BURNS", "POETS", + "APRON", "SPEAR", "ORGAN", "CLIFF", "STAMP", "PASTE", "RURAL", "BAKED", "CHASE", + "SLICE", "SLANT", "KNOCK", "NOISY", "SORTS", "STAYS", "WIPED", "BLOWN", "PILED", + "CLUBS", "CHEER", "WIDOW", "TWIST", "TENTH", "HIDES", "COMMA", "SWEEP", "SPOON", + "STERN", "CREPT", "MAPLE", "DEEDS", "RIDES", "MUDDY", "CRIME", "JELLY", "RIDGE", + "DRIFT", "DUSTY", "DEVIL", "TEMPO", "HUMOR", "SENDS", "STEAL", "TENTS", "WAIST", + "ROSES", "REIGN", "NOBLE", "CHEAP", "DENSE", "LINEN", "GEESE", "WOVEN", "POSTS", + "HIRED", "WRATH", "SALAD", "BOWED", "TIRES", "SHARK", "BELTS", "GRASP", "BLAST", + "POLAR", "FUNGI", "TENDS", "PEARL", "LOADS", "JOKES", "VEINS", "FROST", "HEARS", + "LOSES", "HOSTS", "DIVER", "PHASE", "TOADS", "ALERT", "TASKS", "SEAMS", "CORAL", + "FOCUS", "NAKED", "PUPPY", "JUMPS", "SPOIL", "QUART", "MACRO", "FEARS", "FLUNG", + "SPARK", "VIVID", "BROOK", "STEER", "SPRAY", "DECAY", "PORTS", "SOCKS", "URBAN", + "GOALS", "GRANT", "MINUS", "FILMS", "TUNES", "SHAFT", "FIRMS", "SKIES", "BRIDE", + "WRECK", "FLOCK", "STARE", "HOBBY", "BONDS", "DARED", "FADED", "THIEF", "CRUDE", + "PANTS", "FLUTE", "VOTES", "TONAL", "RADAR", "WELLS", "SKULL", "HAIRS", "ARGUE", + "WEARS", "DOLLS", "VOTED", "CAVES", "CARED", "BROOM", "SCENT", "PANEL", "FAIRY", + "OLIVE", "BENDS", "PRISM", "LAMPS", "CABLE", "PEACH", "RUINS", "RALLY", "SCHWA", + "LAMBS", "SELLS", "COOLS", "DRAFT", "CHARM", "LIMBS", "BRAKE", "GAZED", "CUBES", + "DELAY", "BEAMS", "FETCH", "RANKS", "ARRAY", "HARSH", "CAMEL", "VINES", "PICKS", + "NAVAL", "PURSE", "RIGID", "CRAWL", "TOAST", "SOILS", "SAUCE", "BASIN", "PONDS", + "TWINS", "WRIST", "FLUID", "POOLS", "BRAND", "STALK", "ROBOT", "REEDS", "HOOFS", + "BUSES", "SHEER", "GRIEF", "BLOOM", "DWELT", "MELTS", "RISEN", "FLAGS", "KNELT", + "FIBER", "ROOFS", "FREED", "ARMOR", "PILES", "AIMED", "ALGAE", "TWIGS", "LEMON", + "DITCH", "DRUNK", "RESTS", "CHILL", "SLAIN", "PANIC", "CORDS", "TUNED", "CRISP", + "LEDGE", "DIVED", "SWAMP", "CLUNG", "STOLE", "MOLDS", "YARNS", "LIVER", "GAUGE", + "BREED", "STOOL", "GULLS", "AWOKE", "GROSS", "DIARY", "RAILS", "BELLY", "TREND", + "FLASK", "STAKE", "FRIED", "DRAWS", "ACTOR", "HANDY", "BOWLS", "HASTE", "SCOPE", + "DEALS", "KNOTS", "MOONS", "ESSAY", "THUMP", "HANGS", "BLISS", "DEALT", "GAINS", + "BOMBS", "CLOWN", "PALMS", "CONES", "ROAST", "TIDAL", "BORED", "CHANT", "ACIDS", + "DOUGH", "CAMPS", "SWORE", "LOVER", "HOOKS", "MALES", "COCOA", "PUNCH", "AWARD", + "REINS", "NINTH", "NOSES", "LINKS", "DRAIN", "FILLS", "NYLON", "LUNAR", "PULSE", + "FLOWN", "ELBOW", "FATAL", "SITES", "MOTHS", "MEATS", "FOXES", "MINED", "ATTIC", + "FIERY", "MOUNT", "USAGE", "SWEAR", "SNOWY", "RUSTY", "SCARE", "TRAPS", "RELAX", + "REACT", "VALID", "ROBIN", "CEASE", "GILLS", "PRIOR", "SAFER", "POLIO", "LOYAL", + "SWELL", "SALTY", "MARSH", "VAGUE", "WEAVE", "MOUND", "SEALS", "MULES", "VIRUS", + "SCOUT", "ACUTE", "WINDY", "STOUT", "FOLDS", "SEIZE", "HILLY", "JOINS", "PLUCK", + "STACK", "LORDS", "DUNES", "BURRO", "HAWKS", "TROUT", "FEEDS", "SCARF", "HALLS", + "COALS", "TOWEL", "SOULS", "ELECT", "BUGGY", "PUMPS", "LOANS", "SPINS", "FILES", + "OXIDE", "PAINS", "PHOTO", "RIVAL", "FLATS", "SYRUP", "RODEO", "SANDS", "MOOSE", + "PINTS", "CURLY", "COMIC", "CLOAK", "ONION", "CLAMS", "SCRAP", "DIDST", "COUCH", + "CODES", "FAILS", "OUNCE", "LODGE", "GREET", "GYPSY", "UTTER", "PAVED", "ZONES", + "FOURS", "ALLEY", "TILES", "BLESS", "CREST", "ELDER", "KILLS", "YEAST", "ERECT", + "BUGLE", "MEDAL", "ROLES", "HOUND", "SNAIL", "ALTER", "ANKLE", "RELAY", "LOOPS", + "ZEROS", "BITES", "MODES", "DEBTS", "REALM", "GLOVE", "RAYON", "SWIMS", "POKED", + "STRAY", "LIFTS", "MAKER", "LUMPS", "GRAZE", "DREAD", "BARNS", "DOCKS", "MASTS", + "POURS", "WHARF", "CURSE", "PLUMP", "ROBES", "SEEKS", "CEDAR", "CURLS", "JOLLY", + "MYTHS", "CAGES", "GLOOM", "LOCKS", "PEDAL", "BEETS", "CROWS", "ANODE", "SLASH", + "CREEP", "ROWED", "CHIPS", "FISTS", "WINES", "CARES", "VALVE", "NEWER", "MOTEL", + "IVORY", "NECKS", "CLAMP", "BARGE", "BLUES", "ALIEN", "FROWN", "STRAP", "CREWS", + "SHACK", "GONNA", "SAVES", "STUMP", "FERRY", "IDOLS", "COOKS", "JUICY", "GLARE", + "CARTS", "ALLOY", "BULBS", "LAWNS", "LASTS", "FUELS", "ODDLY", "CRANE", "FILED", + "WEIRD", "SHAWL", "SLIPS", "TROOP", "BOLTS", "SUITE", "SLEEK", "QUILT", "TRAMP", + "BLAZE", "ATLAS", "ODORS", "SCRUB", "CRABS", "PROBE", "LOGIC", "ADOBE", "EXILE", + "REBEL", "GRIND", "STING", "SPINE", "CLING", "DESKS", "GROVE", "LEAPS", "PROSE", + "LOFTY", "AGONY", "SNARE", "TUSKS", "BULLS", "MOODS", "HUMID", "FINER", "DIMLY", + "PLANK", "CHINA", "PINES", "GUILT", "SACKS", "BRACE", "QUOTE", "LATHE", "GAILY", + "FONTS", "SCALP", "ADOPT", "FOGGY", "FERNS", "GRAMS", "CLUMP", "PERCH", "TUMOR", + "TEENS", "CRANK", "FABLE", "HEDGE", "GENES", "SOBER", "BOAST", "TRACT", "CIGAR", + "UNITE", "OWING", "THIGH", "HAIKU", "SWISH", "DIKES", "WEDGE", "BOOTH", "EASED", + "FRAIL", "COUGH", "TOMBS", "DARTS", "FORTS", "CHOIR", "POUCH", "PINCH", "HAIRY", + "BUYER", "TORCH", "VIGOR", "WALTZ", "HEATS", "HERBS", "USERS", "FLINT", "CLICK", + "MADAM", "BLEAK", "BLUNT", "AIDED", "LACKS", "MASKS", "WADED", "RISKS", "NURSE", + "CHAOS", "SEWED", "CURED", "AMPLE", "LEASE", "STEAK", "SINKS", "MERIT", "BLUFF", + "BATHE", "GLEAM", "BONUS", "COLTS", "SHEAR", "GLAND", "SILKY", "SKATE", "BIRCH", + "ANVIL", "SLEDS", "GROAN", "MAIDS", "MEETS", "SPECK", "HYMNS", "HINTS", "DROWN", + "BOSOM", "SLICK", "QUEST", "COILS", "SPIED", "SNOWS", "STEAD", "SNACK", "PLOWS", + "BLOND", "TAMED", "THORN", "WAITS", "GLUED", "BANJO", "TEASE", "ARENA", "BULKY", + "CARVE", "STUNT", "WARMS", "SHADY", "RAZOR", "FOLLY", "LEAFY", "NOTCH", "FOOLS", + "OTTER", "PEARS", "FLUSH", "GENUS", "ACHED", "FIVES", "FLAPS", "SPOUT", "SMOTE", + "FUMES", "ADAPT", "CUFFS", "TASTY", "STOOP", "CLIPS", "DISKS", "SNIFF", "LANES", + "BRISK", "IMPLY", "DEMON", "SUPER", "FURRY", "RAGED", "GROWL", "TEXTS", "HARDY", + "STUNG", "TYPED", "HATES", "WISER", "TIMID", "SERUM", "BEAKS", "ROTOR", "CASTS", + "BATHS", "GLIDE", "PLOTS", "TRAIT", "RESIN", "SLUMS", "LYRIC", "PUFFS", "DECKS", + "BROOD", "MOURN", "ALOFT", "ABUSE", "WHIRL", "EDGED", "OVARY", "QUACK", "HEAPS", + "SLANG", "AWAIT", "CIVIC", "SAINT", "BEVEL", "SONAR", "AUNTS", "PACKS", "FROZE", + "TONIC", "CORPS", "SWARM", "FRANK", "REPAY", "GAUNT", "WIRED", "NIECE", "CELLO", + "NEEDY", "CHUCK", "STONY", "MEDIA", "SURGE", "HURTS", "REPEL", "HUSKY", "DATED", + "HUNTS", "MISTS", "EXERT", "DRIES", "MATES", "SWORN", "BAKER", "SPICE", "OASIS", + "BOILS", "SPURS", "DOVES", "SNEAK", "PACES", "COLON", "SIEGE", "STRUM", "DRIER", + "CACAO", "HUMUS", "BALES", "PIPED", "NASTY", "RINSE", "BOXER", "SHRUB", "AMUSE", + "TACKS", "CITED", "SLUNG", "DELTA", "LADEN", "LARVA", "RENTS", "YELLS", "SPOOL", + "SPILL", "CRUSH", "JEWEL", "SNAPS", "STAIN", "KICKS", "TYING", "SLITS", "RATED", + "EERIE", "SMASH", "PLUMS", "ZEBRA", "EARNS", "BUSHY", "SCARY", "SQUAD", "TUTOR", + "SILKS", "SLABS", "BUMPS", "EVILS", "FANGS", "SNOUT", "PERIL", "PIVOT", "YACHT", + "LOBBY", "JEANS", "GRINS", "VIOLA", "LINER", "COMET", "SCARS", "CHOPS", "RAIDS", + "EATER", "SLATE", "SKIPS", "SOLES", "MISTY", "URINE", "KNOBS", "SLEET", "HOLLY", + "PESTS", "FORKS", "GRILL", "TRAYS", "PAILS", "BORNE", "TENOR", "WARES", "CAROL", + "WOODY", "CANON", "WAKES", "KITTY", "MINER", "POLLS", "SHAKY", "NASAL", "SCORN", + "CHESS", "TAXIS", "CRATE", "SHYLY", "TULIP", "FORGE", "NYMPH", "BUDGE", "LOWLY", + "ABIDE", "DEPOT", "OASES", "ASSES", "SHEDS", "FUDGE", "PILLS", "RIVET", "THINE", + "GROOM", "LANKY", "BOOST", "BROTH", "HEAVE", "GRAVY", "BEECH", "TIMED", "QUAIL", + "INERT", "GEARS", "CHICK", "HINGE", "TRASH", "CLASH", "SIGHS", "RENEW", "BOUGH", + "DWARF", "SLOWS", "QUILL", "SHAVE", "SPORE", "SIXES", "CHUNK", "MADLY", "PACED", + "BRAID", "FUZZY", "MOTTO", "SPIES", "SLACK", "MUCUS", "MAGMA", "AWFUL", "DISCS", + "ERASE", "POSED", "ASSET", "CIDER", "TAPER", "THEFT", "CHURN", "SATIN", "SLOTS", + "TAXED", "BULLY", "SLOTH", "SHALE", "TREAD", "RAKED", "CURDS", "MANOR", "AISLE", + "BULGE", "LOINS", "STAIR", "TAPES", "LEANS", "BUNKS", "SQUAT", "TOWED", "LANCE", + "PANES", "SAKES", "HEIRS", "CASTE", "DUMMY", "PORES", "FAUNA", "CROOK", "POISE", + "EPOCH", "RISKY", "WARNS", "FLING", "BERRY", "GRAPE", "FLANK", "DRAGS", "SQUID", + "PELTS", "ICING", "IRONY", "IRONS", "BARKS", "WHOOP", "CHOKE", "DIETS", "WHIPS", + "TALLY", "DOZED", "TWINE", "KITES", "BIKES", "TICKS", "RIOTS", "ROARS", "VAULT", + "LOOMS", "SCOLD", "BLINK", "DANDY", "PUPAE", "SIEVE", "SPIKE", "DUCTS", "LENDS", + "PIZZA", "BRINK", "WIDEN", "PLUMB", "PAGAN", "FEATS", "BISON", "SOGGY", "SCOOP", + "ARGON", "NUDGE", "SKIFF", "AMBER", "SEXES", "ROUSE", "SALTS", "HITCH", "EXALT", + "LEASH", "DINED", "CHUTE", "SNORT", "GUSTS", "MELON", "CHEAT", "REEFS", "LLAMA", + "LASSO", "DEBUT", "QUOTA", "OATHS", "PRONE", "MIXES", "RAFTS", "DIVES", "STALE", + "INLET", "FLICK", "PINTO", "BROWS", "UNTIE", "BATCH", "GREED", "CHORE", "STIRS", + "BLUSH", "ONSET", "BARBS", "VOLTS", "BEIGE", "SWOOP", "PADDY", "LACED", "SHOVE", + "JERKY", "POPPY", "LEAKS", "FARES", "DODGE", "GODLY", "SQUAW", "AFFIX", "BRUTE", + "NICER", "UNDUE", "SNARL", "MERGE", "DOSES", "SHOWY", "DADDY", "ROOST", "VASES", + "SWIRL", "PETTY", "COLDS", "CURRY", "COBRA", "GENIE", "FLARE", "MESSY", "CORES", + "SOAKS", "RIPEN", "WHINE", "AMINO", "PLAID", "SPINY", "MOWED", "BATON", "PEERS", + "VOWED", "PIOUS", "SWANS", "EXITS", "AFOOT", "PLUGS", "IDIOM", "CHILI", "RITES", + "SERFS", "CLEFT", "BERTH", "GRUBS", "ANNEX", "DIZZY", "HASTY", "LATCH", "WASPS", + "MIRTH", "BARON", "PLEAD", "ALOOF", "AGING", "PIXEL", "BARED", "MUMMY", "HOTLY", + "AUGER", "BUDDY", "CHAPS", "BADGE", "STARK", "FAIRS", "GULLY", "MUMPS", "EMERY", + "FILLY", "OVENS", "DRONE", "GAUZE", "IDIOT", "FUSSY", "ANNOY", "SHANK", "GOUGE", + "BLEED", "ELVES", "ROPED", "UNFIT", "BAGGY", "MOWER", "SCANT", "GRABS", "FLEAS", + "LOUSY", "ALBUM", "SAWED", "COOKY", "MURKY", "INFER", "BURLY", "WAGED", "DINGY", + "BRINE", "KNEEL", "CREAK", "VANES", "SMOKY", "SPURT", "COMBS", "EASEL", "LACES", + "HUMPS", "RUMOR", "AROMA", "HORDE", "SWISS", "LEAPT", "OPIUM", "SLIME", "AFIRE", + "PANSY", "MARES", "SOAPS", "HUSKS", "SNIPS", "HAZEL", "LINED", "CAFES", "NAIVE", + "WRAPS", "SIZED", "PIERS", "BESET", "AGILE", "TONGS", "STEED", "FRAUD", "BOOTY", + "VALOR", "DOWNY", "WITTY", "MOSSY", "PSALM", "SCUBA", "TOURS", "POLKA", "MILKY", + "GAUDY", "SHRUG", "TUFTS", "WILDS", "LASER", "TRUSS", "HARES", "CREED", "LILAC", + "SIREN", "TARRY", "BRIBE", "SWINE", "MUTED", "FLIPS", "CURES", "SINEW", "BOXED", + "HOOPS", "GASPS", "HOODS", "NICHE", "YUCCA", "GLOWS", "SEWER", "WHACK", "FUSES", + "GOWNS", "DROOP", "BUCKS", "PANGS", "MAILS", "WHISK", "HAVEN", "CLASP", "SLING", + "STINT", "URGES", "CHAMP", "PIETY", "CHIRP", "PLEAT", "POSSE", "SUNUP", "MENUS", + "HOWLS", "QUAKE", "KNACK", "PLAZA", "FIEND", "CAKED", "BANGS", "ERUPT", "POKER", + "OLDEN", "CRAMP", "VOTER", "POSES", "MANLY", "SLUMP", "FINED", "GRIPS", "GAPED", + "PURGE", "HIKED", "MAIZE", "FLUFF", "STRUT", "SLOOP", "PROWL", "ROACH", "COCKS", + "BLAND", "DIALS", "PLUME", "SLAPS", "SOUPS", "DULLY", "WILLS", "FOAMS", "SOLOS", + "SKIER", "EAVES", "TOTEM", "FUSED", "LATEX", "VEILS", "MUSED", "MAINS", "MYRRH", + "RACKS", "GALLS", "GNATS", "BOUTS", "SISAL", "SHUTS", "HOSES", "DRYLY", "HOVER", + "GLOSS", "SEEPS", "DENIM", "PUTTY", "GUPPY", "LEAKY", "DUSKY", "FILTH", "OBOES", + "SPANS", "FOWLS", "ADORN", "GLAZE", "HAUNT", "DARES", "OBEYS", "BAKES", "ABYSS", + "SMELT", "GANGS", "ACHES", "TRAWL", "CLAPS", "UNDID", "SPICY", "HOIST", "FADES", + "VICAR", "ACORN", "PUSSY", "GRUFF", "MUSTY", "TARTS", "SNUFF", "HUNCH", "TRUCE", + "TWEED", "DRYER", "LOSER", "SHEAF", "MOLES", "LAPSE", "TAWNY", "VEXED", "AUTOS", + "WAGER", "DOMES", "SHEEN", "CLANG", "SPADE", "SOWED", "BROIL", "SLYLY", "STUDS", + "GRUNT", "DONOR", "SLUGS", "ASPEN", "HOMER", "CROAK", "TITHE", "HALTS", "AVERT", + "HAVOC", "HOGAN", "GLINT", "RUDDY", "JEEPS", "FLAKY", "LADLE", "TAUNT", "SNORE", + "FINES", "PROPS", "PRUNE", "PESOS", "RADII", "POKES", "TILED", "DAISY", "HERON", + "VILLA", "FARCE", "BINDS", "CITES", "FIXES", "JERKS", "LIVID", "WAKED", "INKED", + "BOOMS", "CHEWS", "LICKS", "HYENA", "SCOFF", "LUSTY", "SONIC", "SMITH", "USHER", + "TUCKS", "VIGIL", "MOLTS", "SECTS", "SPARS", "DUMPS", "SCALY", "WISPS", "SORES", + "MINCE", "PANDA", "FLIER", "AXLES", "PLIED", "BOOBY", "PATIO", "RABBI", "PETAL", + "POLYP", "TINTS", "GRATE", "TROLL", "TOLLS", "RELIC", "PHONY", "BLEAT", "FLAWS", + "FLAKE", "SNAGS", "APTLY", "DRAWL", "ULCER", "SOAPY", "BOSSY", "MONKS", "CRAGS", + "CAGED", "TWANG", "DINER", "TAPED", "CADET", "GRIDS", "SPAWN", "GUILE", "NOOSE", + "MORES", "GIRTH", "SLIMY", "AIDES", "SPASM", "BURRS", "ALIBI", "LYMPH", "SAUCY", + "MUGGY", "LITER", "JOKED", "GOOFY", "EXAMS", "ENACT", "STORK", "LURED", "TOXIC", + "OMENS", "NEARS", "COVET", "WRUNG", "FORUM", "VENOM", "MOODY", "ALDER", "SASSY", + "FLAIR", "GUILD", "PRAYS", "WRENS", "HAULS", "STAVE", "TILTS", "PECKS", "STOMP", + "GALES", "TEMPT", "CAPES", "MESAS", "OMITS", "TEPEE", "HARRY", "WRING", "EVOKE", + "LIMES", "CLUCK", "LUNGE", "HIGHS", "CANES", "GIDDY", "LITHE", "VERGE", "KHAKI", + "QUEUE", "LOATH", "FOYER", "OUTDO", "FARED", "DETER", "CRUMB", "ASTIR", "SPIRE", + "JUMPY", "EXTOL", "BUOYS", "STUBS", "LUCID", "THONG", "AFORE", "WHIFF", "MAXIM", + "HULLS", "CLOGS", "SLATS", "JIFFY", "ARBOR", "CINCH", "IGLOO", "GOODY", "GAZES", + "DOWEL", "CALMS", "BITCH", "SCOWL", "GULPS", "CODED", "WAVER", "MASON", "LOBES", + "EBONY", "FLAIL", "ISLES", "CLODS", "DAZED", "ADEPT", "OOZED", "SEDAN", "CLAYS", + "WARTS", "KETCH", "SKUNK", "MANES", "ADORE", "SNEER", "MANGO", "FIORD", "FLORA", + "ROOMY", "MINKS", "THAWS", "WATTS", "FREER", "EXULT", "PLUSH", "PALED", "TWAIN", + "CLINK", "SCAMP", "PAWED", "GROPE", "BRAVO", "GABLE", "STINK", "SEVER", "WANED", + "RARER", "REGAL", "WARDS", "FAWNS", "BABES", "UNIFY", "AMEND", "OAKEN", "GLADE", + "VISOR", "HEFTY", "NINES", "THROB", "PECAN", "BUTTS", "PENCE", "SILLS", "JAILS", + "FLYER", "SABER", "NOMAD", "MITER", "BEEPS", "DOMED", "GULFS", "CURBS", "HEATH", + "MOORS", "AORTA", "LARKS", "TANGY", "WRYLY", "CHEEP", "RAGES", "EVADE", "LURES", + "FREAK", "VOGUE", "TUNIC", "SLAMS", "KNITS", "DUMPY", "MANIA", "SPITS", "FIRTH", + "HIKES", "TROTS", "NOSED", "CLANK", "DOGMA", "BLOAT", "BALSA", "GRAFT", "MIDDY", + "STILE", "KEYED", "FINCH", "SPERM", "CHAFF", "WILES", "AMIGO", "COPRA", "AMISS", + "EYING", "TWIRL", "LURCH", "POPES", "CHINS", "SMOCK", "TINES", "GUISE", "GRITS", + "JUNKS", "SHOAL", "CACHE", "TAPIR", "ATOLL", "DEITY", "TOILS", "SPREE", "MOCKS", + "SCANS", "SHORN", "REVEL", "RAVEN", "HOARY", "REELS", "SCUFF", "MIMIC", "WEEDY", + "CORNY", "TRUER", "ROUGE", "EMBER", "FLOES", "TORSO", "WIPES", "EDICT", "SULKY", + "RECUR", "GROIN", "BASTE", "KINKS", "SURER", "PIGGY", "MOLDY", "FRANC", "LIARS", + "INEPT", "GUSTY", "FACET", "JETTY", "EQUIP", "LEPER", "SLINK", "SOARS", "CATER", + "DOWRY", "SIDED", "YEARN", "DECOY", "TABOO", "OVALS", "HEALS", "PLEAS", "BERET", + "SPILT", "GAYLY", "ROVER", "ENDOW", "PYGMY", "CARAT", "ABBEY", "VENTS", "WAKEN", + "CHIMP", "FUMED", "SODAS", "VINYL", "CLOUT", "WADES", "MITES", "SMIRK", "BORES", + "BUNNY", "SURLY", "FROCK", "FORAY", "PURER", "MILKS", "QUERY", "MIRED", "BLARE", + "FROTH", "GRUEL", "NAVEL", "PALER", "PUFFY", "CASKS", "GRIME", "DERBY", "MAMMA", + "GAVEL", "TEDDY", "VOMIT", "MOANS", "ALLOT", "DEFER", "WIELD", "VIPER", "LOUSE", + "ERRED", "HEWED", "ABHOR", "WREST", "WAXEN", "ADAGE", "ARDOR", "STABS", "PORED", + "RONDO", "LOPED", "FISHY", "BIBLE", "HIRES", "FOALS", "FEUDS", "JAMBS", "THUDS", + "JEERS", "KNEAD", "QUIRK", "RUGBY", "EXPEL", "GREYS", "RIGOR", "ESTER", "LYRES", + "ABACK", "GLUES", "LOTUS", "LURID", "RUNGS", "HUTCH", "THYME", "VALET", "TOMMY", + "YOKES", "EPICS", "TRILL", "PIKES", "OZONE", "CAPER", "CHIME", "FREES", "FAMED", + "LEECH", "SMITE", "NEIGH", "ERODE", "ROBED", "HOARD", "SALVE", "CONIC", "GAWKY", + "CRAZE", "JACKS", "GLOAT", "MUSHY", "RUMPS", "FETUS", "WINCE", "PINKS", "SHALT", + "TOOTS", "GLENS", "COOED", "RUSTS", "STEWS", "SHRED", "PARKA", "CHUGS", "WINKS", + "CLOTS", "SHREW", "BOOED", "FILMY", "JUROR", "DENTS", "GUMMY", "GRAYS", "HOOKY", + "BUTTE", "DOGIE", "POLED", "REAMS", "FIFES", "SPANK", "GAYER", "TEPID", "SPOOK", + "TAINT", "FLIRT", "ROGUE", "SPIKY", "OPALS", "MISER", "COCKY", "COYLY", "BALMY", + "SLOSH", "BRAWL", "APHID", "FAKED", "HYDRA", "BRAGS", "CHIDE", "YANKS", "ALLAY", + "VIDEO", "ALTOS", "EASES", "METED", "CHASM", "LONGS", "EXCEL", "TAFFY", "IMPEL", + "SAVOR", "KOALA", "QUAYS", "DAWNS", "PROXY", "CLOVE", "DUETS", "DREGS", "TARDY", + "BRIAR", "GRIMY", "ULTRA", "MEATY", "HALVE", "WAILS", "SUEDE", "MAUVE", "ENVOY", + "ARSON", "COVES", "GOOEY", "BREWS", "SOFAS", "CHUMS", "AMAZE", "ZOOMS", "ABBOT", + "HALOS", "SCOUR", "SUING", "CRIBS", "SAGAS", "ENEMA", "WORDY", "HARPS", "COUPE", + "MOLAR", "FLOPS", "WEEPS", "MINTS", "ASHEN", "FELTS", "ASKEW", "MUNCH", "MEWED", + "DIVAN", "VICES", "JUMBO", "BLOBS", "BLOTS", "SPUNK", "ACRID", "TOPAZ", "CUBED", + "CLANS", "FLEES", "SLURS", "GNAWS", "WELDS", "FORDS", "EMITS", "AGATE", "PUMAS", + "MENDS", "DARKS", "DUKES", "PLIES", "CANNY", "HOOTS", "OOZES", "LAMED", "FOULS", + "CLEFS", "NICKS", "MATED", "SKIMS", "BRUNT", "TUBER", "TINGE", "FATES", "DITTY", + "THINS", "FRETS", "EIDER", "BAYOU", "MULCH", "FASTS", "AMASS", "DAMPS", "MORNS", + "FRIAR", "PALSY", "VISTA", "CROON", "CONCH", "UDDER", "TACOS", "SKITS", "MIKES", + "QUITS", "PREEN", "ASTER", "ADDER", "ELEGY", "PULPY", "SCOWS", "BALED", "HOVEL", + "LAVAS", "CRAVE", "OPTIC", "WELTS", "BUSTS", "KNAVE", "RAZED", "SHINS", "TOTES", + "SCOOT", "DEARS", "CROCK", "MUTES", "TRIMS", "SKEIN", "DOTED", "SHUNS", "VEERS", + "FAKES", "YOKED", "WOOED", "HACKS", "SPRIG", "WANDS", "LULLS", "SEERS", "SNOBS", + "NOOKS", "PINED", "PERKY", "MOOED", "FRILL", "DINES", "BOOZE", "TRIPE", "PRONG", + "DRIPS", "ODDER", "LEVEE", "ANTIC", "SIDLE", "PITHY", "CORKS", "YELPS", "JOKER", + "FLECK", "BUFFS", "SCRAM", "TIERS", "BOGEY", "DOLED", "IRATE", "VALES", "COPED", + "HAILS", "ELUDE", "BULKS", "AIRED", "VYING", "STAGS", "STREW", "COCCI", "PACTS", + "SCABS", "SILOS", "DUSTS", "YODEL", "TERSE", "JADED", "BASER", "JIBES", "FOILS", + "SWAYS", "FORGO", "SLAYS", "PREYS", "TREKS", "QUELL", "PEEKS", "ASSAY", "LURKS", + "EJECT", "BOARS", "TRITE", "BELCH", "GNASH", "WANES", "LUTES", "WHIMS", "DOSED", + "CHEWY", "SNIPE", "UMBRA", "TEEMS", "DOZES", "KELPS", "UPPED", "BRAWN", "DOPED", + "SHUSH", "RINDS", "SLUSH", "MORON", "VOILE", "WOKEN", "FJORD", "SHEIK", "JESTS", + "KAYAK", "SLEWS", "TOTED", "SANER", "DRAPE", "PATTY", "RAVES", "SULFA", "GRIST", + "SKIED", "VIXEN", "CIVET", "VOUCH", "TIARA", "HOMEY", "MOPED", "RUNTS", "SERGE", + "KINKY", "RILLS", "CORNS", "BRATS", "PRIES", "AMBLE", "FRIES", "LOONS", "TSARS", + "DATUM", "MUSKY", "PIGMY", "GNOME", "RAVEL", "OVULE", "ICILY", "LIKEN", "LEMUR", + "FRAYS", "SILTS", "SIFTS", "PLODS", "RAMPS", "TRESS", "EARLS", "DUDES", "WAIVE", + "KARAT", "JOLTS", "PEONS", "BEERS", "HORNY", "PALES", "WREAK", "LAIRS", "LYNCH", + "STANK", "SWOON", "IDLER", "ABORT", "BLITZ", "ENSUE", "ATONE", "BINGO", "ROVES", + "KILTS", "SCALD", "ADIOS", "CYNIC", "DULLS", "MEMOS", "ELFIN", "DALES", "PEELS", + "PEALS", "BARES", "SINUS", "CRONE", "SABLE", "HINDS", "SHIRK", "ENROL", "WILTS", + "ROAMS", "DUPED", "CYSTS", "MITTS", "SAFES", "SPATS", "COOPS", "FILET", "KNELL", + "REFIT", "COVEY", "PUNKS", "KILNS", "FITLY", "ABATE", "TALCS", "HEEDS", "DUELS", + "WANLY", "RUFFS", "GAUSS", "LAPEL", "JAUNT", "WHELP", "CLEAT", "GAUZY", "DIRGE", + "EDITS", "WORMY", "MOATS", "SMEAR", "PRODS", "BOWEL", "FRISK", "VESTS", "BAYED", + "RASPS", "TAMES", "DELVE", "EMBED", "BEFIT", "WAFER", "CEDED", "NOVAS", "FEIGN", + "SPEWS", "LARCH", "HUFFS", "DOLES", "MAMAS", "HULKS", "PRIED", "BRIMS", "IRKED", + "ASPIC", "SWIPE", "MEALY", "SKIMP", "BLUER", "SLAKE", "DOWDY", "PENIS", "BRAYS", + "PUPAS", "EGRET", "FLUNK", "PHLOX", "GRIPE", "PEONY", "DOUSE", "BLURS", "DARNS", + "SLUNK", "LEFTS", "CHATS", "INANE", "VIALS", "STILT", "RINKS", "WOOFS", "WOWED", + "BONGS", "FROND", "INGOT", "EVICT", "SINGE", "SHYER", "FLIED", "SLOPS", "DOLTS", + "DROOL", "DELLS", "WHELK", "HIPPY", "FETED", "ETHER", "COCOS", "HIVES", "JIBED", + "MAZES", "TRIOS", "SIRUP", "SQUAB", "LATHS", "LEERS", "PASTA", "RIFTS", "LOPES", + "ALIAS", "WHIRS", "DICED", "SLAGS", "LODES", "FOXED", "IDLED", "PROWS", "PLAIT", + "MALTS", "CHAFE", "COWER", "TOYED", "CHEFS", "KEELS", "STIES", "RACER", "ETUDE", + "SUCKS", "SULKS", "MICAS", "CZARS", "COPSE", "AILED", "ABLER", "RABID", "GOLDS", + "CROUP", "SNAKY", "VISAS", "PALLS", "MOPES", "BONED", "WISPY", "RAVED", "SWAPS", + "JUNKY", "DOILY", "PAWNS", "TAMER", "POACH", "BAITS", "DAMNS", "GUMBO", "DAUNT", + "PRANK", "HUNKS", "BUXOM", "HERES", "HONKS", "STOWS", "UNBAR", "IDLES", "ROUTS", + "SAGES", "GOADS", "REMIT", "COPES", "DEIGN", "CULLS", "GIRDS", "HAVES", "LUCKS", + "STUNK", "DODOS", "SHAMS", "SNUBS", "ICONS", "USURP", "DOOMS", "HELLS", "SOLED", + "COMAS", "PAVES", "MATHS", "PERKS", "LIMPS", "WOMBS", "BLURB", "DAUBS", "COKES", + "SOURS", "STUNS", "CASED", "MUSTS", "COEDS", "COWED", "APING", "ZONED", "RUMMY", + "FETES", "SKULK", "QUAFF", "RAJAH", "DEANS", "REAPS", "GALAS", "TILLS", "ROVED", + "KUDOS", "TONED", "PARED", "SCULL", "VEXES", "PUNTS", "SNOOP", "BAILS", "DAMES", + "HAZES", "LORES", "MARTS", "VOIDS", "AMEBA", "RAKES", "ADZES", "HARMS", "REARS", + "SATYR", "SWILL", "HEXES", "COLIC", "LEEKS", "HURLS", "YOWLS", "IVIES", "PLOPS", + "MUSKS", "PAPAW", "JELLS", "BUSED", "CRUET", "BIDED", "FILCH", "ZESTS", "ROOKS", + "LAXLY", "RENDS", "LOAMS", "BASKS", "SIRES", "CARPS", "POKEY", "FLITS", "MUSES", + "BAWLS", "SHUCK", "VILER", "LISPS", "PEEPS", "SORER", "LOLLS", "PRUDE", "DIKED", + "FLOSS", "FLOGS", "SCUMS", "DOPES", "BOGIE", "PINKY", "LEAFS", "TUBAS", "SCADS", + "LOWED", "YESES", "BIKED", "QUALM", "EVENS", "CANED", "GAWKS", "WHITS", "WOOLY", + "GLUTS", "ROMPS", "BESTS", "DUNCE", "CRONY", "JOIST", "TUNAS", "BONER", "MALLS", + "PARCH", "AVERS", "CRAMS", "PARES", "DALLY", "BIGOT", "KALES", "FLAYS", "LEACH", + "GUSHY", "POOCH", "HUGER", "SLYER", "GOLFS", "MIRES", "FLUES", "LOAFS", "ARCED", + "ACNES", "NEONS", "FIEFS", "DINTS", "DAZES", "POUTS", "CORED", "YULES", "LILTS", + "BEEFS", "MUTTS", "FELLS", "COWLS", "SPUDS", "LAMES", "JAWED", "DUPES", "DEADS", + "BYLAW", "NOONS", "NIFTY", "CLUED", "VIREO", "GAPES", "METES", "CUTER", "MAIMS", + "DROLL", "CUPID", "MAULS", "SEDGE", "PAPAS", "WHEYS", "EKING", "LOOTS", "HILTS", + "MEOWS", "BEAUS", "DICES", "PEPPY", "RIPER", "FOGEY", "GISTS", "YOGAS", "GILTS", + "SKEWS", "CEDES", "ZEALS", "ALUMS", "OKAYS", "ELOPE", "GRUMP", "WAFTS", "SOOTS", + "BLIMP", "HEFTS", "MULLS", "HOSED", "CRESS", "DOFFS", "RUDER", "PIXIE", "WAIFS", + "OUSTS", "PUCKS", "BIERS", "GULCH", "SUETS", "HOBOS", "LINTS", "BRANS", "TEALS", + "GARBS", "PEWEE", "HELMS", "TURFS", "QUIPS", "WENDS", "BANES", "NAPES", "ICIER", + "SWATS", "BAGEL", "HEXED", "OGRES", "GONER", "GILDS", "PYRES", "LARDS", "BIDES", + "PAGED", "TALON", "FLOUT", "MEDIC", "VEALS", "PUTTS", "DIRKS", "DOTES", "TIPPY", + "BLURT", "PITHS", "ACING", "BARER", "WHETS", "GAITS", "WOOLS", "DUNKS", "HEROS", + "SWABS", "DIRTS", "JUTES", "HEMPS", "SURFS", "OKAPI", "CHOWS", "SHOOS", "DUSKS", + "PARRY", "DECAL", "FURLS", "CILIA", "SEARS", "NOVAE", "MURKS", "WARPS", "SLUES", + "LAMER", "SARIS", "WEANS", "PURRS", "DILLS", "TOGAS", "NEWTS", "MEANY", "BUNTS", + "RAZES", "GOONS", "WICKS", "RUSES", "VENDS", "GEODE", "DRAKE", "JUDOS", "LOFTS", + "PULPS", "LAUDS", "MUCKS", "VISES", "MOCHA", "OILED", "ROMAN", "ETHYL", "GOTTA", + "FUGUE", "SMACK", "GOURD", "BUMPY", "RADIX", "FATTY", "BORAX", "CUBIT", "CACTI", + "GAMMA", "FOCAL", "AVAIL", "PAPAL", "GOLLY", "ELITE", "VERSA", "BILLY", "ADIEU", + "ANNUM", "HOWDY", "RHINO", "NORMS", "BOBBY", "AXIOM", "SETUP", "YOLKS", "TERNS", + "MIXER", "GENRE", "KNOLL", "ABODE", "JUNTA", "GORGE", "COMBO", "ALPHA", "OVERT", + "KINDA", "SPELT", "PRICK", "NOBLY", "EPHOD", "AUDIO", "MODAL", "VELDT", "WARTY", + "FLUKE", "BONNY", "BREAM", "ROSIN", "BOLLS", "DOERS", "DOWNS", "BEADY", "MOTIF", + "HUMPH", "FELLA", "MOULD", "CREPE", "KERNS", "ALOHA", "GLYPH", "AZURE", "RISER", + "BLEST", "LOCUS", "LUMPY", "BERYL", "WANNA", "BRIER", "TUNER", "ROWDY", "MURAL", + "TIMER", "CANST", "KRILL", "QUOTH", "LEMME", "TRIAD", "TENON", "AMPLY", "DEEPS", + "PADRE", "LEANT", "PACER", "OCTAL", "DOLLY", "TRANS", "SUMAC", "FOAMY", "LOLLY", + "GIVER", "QUIPU", "CODEX", "MANNA", "UNWED", "VODKA", "FERNY", "SALON", "DUPLE", + "BORON", "REVUE", "CRIER", "ALACK", "INTER", "DILLY", "WHIST", "CULTS", "SPAKE", + "RESET", "LOESS", "DECOR", "MOVER", "VERVE", "ETHIC", "GAMUT", "LINGO", "DUNNO", + "ALIGN", "SISSY", "INCUR", "REEDY", "AVANT", "PIPER", "WAXER", "CALYX", "BASIL", + "COONS", "SEINE", "PINEY", "LEMMA", "TRAMS", "WINCH", "WHIRR", "SAITH", "IONIC", + "HEADY", "HAREM", "TUMMY", "SALLY", "SHIED", "DROSS", "FARAD", "SAVER", "TILDE", + "JINGO", "BOWER", "SERIF", "FACTO", "BELLE", "INSET", "BOGUS", "CAVED", "FORTE", + "SOOTY", "BONGO", "TOVES", "CREDO", "BASAL", "YELLA", "AGLOW", "GLEAN", "GUSTO", + "HYMEN", "ETHOS", "TERRA", "BRASH", "SCRIP", "SWASH", "ALEPH", "TINNY", "ITCHY", + "WANTA", "TRICE", "JOWLS", "GONGS", "GARDE", "BORIC", "TWILL", "SOWER", "HENRY", + "AWASH", "LIBEL", "SPURN", "SABRE", "REBUT", "PENAL", "OBESE", "SONNY", "QUIRT", + "MEBBE", "TACIT", "GREEK", "XENON", "HULLO", "PIQUE", "ROGER", "NEGRO", "HADST", + "GECKO", "BEGET", "UNCUT", "ALOES", "LOUIS", "QUINT", "CLUNK", "RAPED", "SALVO", + "DIODE", "MATEY", "HERTZ", "XYLEM", "KIOSK", "APACE", "CAWED", "PETER", "WENCH", + "COHOS", "SORTA", "GAMBA", "BYTES", "TANGO", "NUTTY", "AXIAL", "ALECK", "NATAL", + "CLOMP", "GORED", "SIREE", "BANDY", "GUNNY", "RUNIC", "WHIZZ", "RUPEE", "FATED", + "WIPER", "BARDS", "BRINY", "STAID", "HOCKS", "OCHRE", "YUMMY", "GENTS", "SOUPY", + "ROPER", "SWATH", "CAMEO", "EDGER", "SPATE", "GIMME", "EBBED", "BREVE", "THETA", + "DEEMS", "DYKES", "SERVO", "TELLY", "TABBY", "TARES", "BLOCS", "WELCH", "GHOUL", + "VITAE", "CUMIN", "DINKY", "BRONC", "TABOR", "TEENY", "COMER", "BORER", "SIRED", + "PRIVY", "MAMMY", "DEARY", "GYROS", "SPRIT", "CONGA", "QUIRE", "THUGS", "FUROR", + "BLOKE", "RUNES", "BAWDY", "CADRE", "TOXIN", "ANNUL", "EGGED", "ANION", "NODES", + "PICKY", "STEIN", "JELLO", "AUDIT", "ECHOS", "FAGOT", "LETUP", "EYRIE", "FOUNT", + "CAPED", "AXONS", "AMUCK", "BANAL", "RILED", "PETIT", "UMBER", "MILER", "FIBRE", + "AGAVE", "BATED", "BILGE", "VITRO", "FEINT", "PUDGY", "MATER", "MANIC", "UMPED", + "PESKY", "STREP", "SLURP", "PYLON", "PUREE", "CARET", "TEMPS", "NEWEL", "YAWNS", + "SEEDY", "TREED", "COUPS", "RANGY", "BRADS", "MANGY", "LONER", "CIRCA", "TIBIA", + "AFOUL", "MOMMY", "TITER", "CARNE", "KOOKY", "MOTES", "AMITY", "SUAVE", "HIPPO", + "CURVY", "SAMBA", "NEWSY", "ANISE", "IMAMS", "TULLE", "AWAYS", "LIVEN", "HALLO", + "WALES", "OPTED", "CANTO", "IDYLL", "BODES", "CURIO", "WRACK", "HIKER", "CHIVE", + "YOKEL", "DOTTY", "DEMUR", "CUSPS", "SPECS", "QUADS", "LAITY", "TONER", "DECRY", + "WRITS", "SAUTE", "CLACK", "AUGHT", "LOGOS", "TIPSY", "NATTY", "DUCAL", "BIDET", + "BULGY", "METRE", "LUSTS", "UNARY", "GOETH", "BALER", "SITED", "SHIES", "HASPS", + "BRUNG", "HOLED", "SWANK", "LOOKY", "MELEE", "HUFFY", "LOAMY", "PIMPS", "TITAN", + "BINGE", "SHUNT", "FEMUR", "LIBRA", "SEDER", "HONED", "ANNAS", "COYPU", "SHIMS", + "ZOWIE", "JIHAD", "SAVVY", "NADIR", "BASSO", "MONIC", "MANED", "MOUSY", "OMEGA", + "LAVER", "PRIMA", "PICAS", "FOLIO", "MECCA", "REALS", "TROTH", "TESTY", "BALKY", + "CRIMP", "CHINK", "ABETS", "SPLAT", "ABACI", "VAUNT", "CUTIE", "PASTY", "MORAY", + "LEVIS", "RATTY", "ISLET", "JOUST", "MOTET", "VIRAL", "NUKES", "GRADS", "COMFY", + "VOILA", "WOOZY", "BLUED", "WHOMP", "SWARD", "METRO", "SKEET", "CHINE", "AERIE", + "BOWIE", "TUBBY", "EMIRS", "COATI", "UNZIP", "SLOBS", "TRIKE", "FUNKY", "DUCAT", + "DEWEY", "SKOAL", "WADIS", "OOMPH", "TAKER", "MINIM", "GETUP", "STOIC", "SYNOD", + "RUNTY", "FLYBY", "BRAZE", "INLAY", "VENUE", "LOUTS", "PEATY", "ORLON", "HUMPY", + "RADON", "BEAUT", "RASPY", "UNFED", "CRICK", "NAPPY", "VIZOR", "YIPES", "REBUS", + "DIVOT", "KIWIS", "VETCH", "SQUIB", "SITAR", "KIDDO", "DYERS", "COTTA", "MATZO", + "LAGER", "ZEBUS", "CRASS", "DACHA", "KNEED", "DICTA", "FAKIR", "KNURL", "RUNNY", + "UNPIN", "JULEP", "GLOBS", "NUDES", "SUSHI", "TACKY", "STOKE", "KAPUT", "BUTCH", + "HULAS", "CROFT", "ACHOO", "GENII", "NODAL", "OUTGO", "SPIEL", "VIOLS", "FETID", + "CAGEY", "FUDGY", "EPOXY", "LEGGY", "HANKY", "LAPIS", "FELON", "BEEFY", "COOTS", + "MELBA", "CADDY", "SEGUE", "BETEL", "FRIZZ", "DREAR", "KOOKS", "TURBO", "HOAGY", + "MOULT", "HELIX", "ZONAL", "ARIAS", "NOSEY", "PAEAN", "LACEY", "BANNS", "SWAIN", + "FRYER", "RETCH", "TENET", "GIGAS", "WHINY", "OGLED", "RUMEN", "BEGOT", "CRUSE", + "ABUTS", "RIVEN", "BALKS", "SINES", "SIGMA", "ABASE", "ENNUI", "GORES", "UNSET", + "AUGUR", "SATED", "ODIUM", "LATIN", "DINGS", "MOIRE", "SCION", "HENNA", "KRAUT", + "DICKS", "LIFER", "PRIGS", "BEBOP", "GAGES", "GAZER", "FANNY", "GIBES", "AURAL", + "TEMPI", "HOOCH", "RAPES", "SNUCK", "HARTS", "TECHS", "EMEND", "NINNY", "GUAVA", + "SCARP", "LIEGE", "TUFTY", "SEPIA", "TOMES", "CAROB", "EMCEE", "PRAMS", "POSER", + "VERSO", "HUBBA", "JOULE", "BAIZE", "BLIPS", "SCRIM", "CUBBY", "CLAVE", "WINOS", + "REARM", "LIENS", "LUMEN", "CHUMP", "NANNY", "TRUMP", "FICHU", "CHOMP", "HOMOS", + "PURTY", "MASER", "WOOSH", "PATSY", "SHILL", "RUSKS", "AVAST", "SWAMI", "BODED", + "AHHHH", "LOBED", "NATCH", "SHISH", "TANSY", "SNOOT", "PAYER", "ALTHO", "SAPPY", + "LAXER", "HUBBY", "AEGIS", "RILES", "DITTO", "JAZZY", "DINGO", "QUASI", "SEPTA", + "PEAKY", "LORRY", "HEERD", "BITTY", "PAYEE", "SEAMY", "APSES", "IMBUE", "BELIE", + "CHARY", "SPOOF", "PHYLA", "CLIME", "BABEL", "WACKY", "SUMPS", "SKIDS", "KHANS", + "CRYPT", "INURE", "NONCE", "OUTEN", "FAIRE", "HOOEY", "ANOLE", "KAZOO", "CALVE", + "LIMBO", "ARGOT", "DUCKY", "FAKER", "VIBES", "GASSY", "UNLIT", "NERVY", "FEMME", + "BITER", "FICHE", "BOORS", "GAFFE", "SAXES", "RECAP", "SYNCH", "FACIE", "DICEY", + "OUIJA", "HEWER", "LEGIT", "GURUS", "EDIFY", "TWEAK", "CARON", "TYPOS", "RERUN", + "POLLY", "SURDS", "HAMZA", "NULLS", "HATER", "LEFTY", "MOGUL", "MAFIA", "DEBUG", + "PATES", "BLABS", "SPLAY", "TALUS", "PORNO", "MOOLA", "NIXED", "KILOS", "SNIDE", + "HORSY", "GESSO", "JAGGY", "TROVE", "NIXES", "CREEL", "PATER", "IOTAS", "CADGE", + "SKYED", "HOKUM", "FURZE", "ANKHS", "CURIE", "NUTSY", "HILUM", "REMIX", "ANGST", + "BURLS", "JIMMY", "VEINY", "TRYST", "CODON", "BEFOG", "GAMED", "FLUME", "AXMAN", + "DOOZY", "LUBES", "RHEAS", "BOZOS", "BUTYL", "KELLY", "MYNAH", "JOCKS", "DONUT", + "AVIAN", "WURST", "CHOCK", "QUASH", "QUALS", "HAYED", "BOMBE", "CUSHY", "SPACY", + "PUKED", "LEERY", "THEWS", "PRINK", "AMENS", "TESLA", "INTRO", "FIVER", "FRUMP", + "CAPOS", "OPINE", "CODER", "NAMER", "JOWLY", "PUKES", "HALED", "CHARD", "DUFFS", + "BRUIN", "REUSE", "WHANG", "TOONS", "FRATS", "SILTY", "TELEX", "CUTUP", "NISEI", + "NEATO", "DECAF", "SOFTY", "BIMBO", "ADLIB", "LOONY", "SHOED", "AGUES", "PEEVE", + "NOWAY", "GAMEY", "SARGE", "RERAN", "EPACT", "POTTY", "CONED", "UPEND", "NARCO", + "IKATS", "WHORL", "JINKS", "TIZZY", "WEEPY", "POSIT", "MARGE", "VEGAN", "CLOPS", + "NUMBS", "REEKS", "RUBES", "ROWER", "BIPED", "TIFFS", "HOCUS", "HAMMY", "BUNCO", + "FIXIT", "TYKES", "CHAWS", "YUCKY", "HOKEY", "RESEW", "MAVEN", "ADMAN", "SCUZZ", + "SLOGS", "SOUSE", "NACHO", "MIMED", "MELDS", "BOFFO", "DEBIT", "PINUP", "VAGUS", + "GULAG", "RANDY", "BOSUN", "EDUCE", "FAXES", "AURAS", "PESTO", "ANTSY", "BETAS", + "FIZZY", "DORKY", "SNITS", "MOXIE", "THANE", "MYLAR", "NOBBY", "GAMIN", "GOUTY", + "ESSES", "GOYIM", "PANED", "DRUID", "JADES", "REHAB", "GOFER", "TZARS", "OCTET", + "HOMED", "SOCKO", "DORKS", "EARED", "ANTED", "ELIDE", "FAZES", "OXBOW", "DOWSE", + "SITUS", "MACAW", "SCONE", "DRILY", "HYPER", "SALSA", "MOOCH", "GATED", "UNJAM", + "LIPID", "MITRE", "VENAL", "KNISH", "RITZY", "DIVAS", "TORUS", "MANGE", "DIMER", + "RECUT", "MESON", "WINED", "FENDS", "PHAGE", "FIATS", "CAULK", "CAVIL", "PANTY", + "ROANS", "BILKS", "HONES", "BOTCH", "ESTOP", "SULLY", "SOOTH", "GELDS", "AHOLD", + "RAPER", "PAGER", "FIXER", "INFIX", "HICKS", "TUXES", "PLEBE", "TWITS", "ABASH", + "TWIXT", "WACKO", "PRIMP", "NABLA", "GIRTS", "MIFFS", "EMOTE", "XEROX", "REBID", + "SHAHS", "RUTTY", "GROUT", "GRIFT", "DEIFY", "BIDDY", "KOPEK", "SEMIS", "BRIES", + "ACMES", "PITON", "HUSSY", "TORTS", "DISCO", "WHORE", "BOOZY", "GIBED", "VAMPS", + "AMOUR", "SOPPY", "GONZO", "DURST", "WADER", "TUTUS", "PERMS", "CATTY", "GLITZ", + "BRIGS", "NERDS", "BARMY", "GIZMO", "OWLET", "SAYER", "MOLLS", "SHARD", "WHOPS", + "COMPS", "CORER", "COLAS", "MATTE", "DROID", "PLOYS", "VAPID", "CAIRN", "DEISM", + "MIXUP", "YIKES", "PROSY", "RAKER", "FLUBS", "WHISH", "REIFY", "CRAPS", "SHAGS", + "CLONE", "HAZED", "MACHO", "RECTO", "REFIX", "DRAMS", "BIKER", "AQUAS", "PORKY", + "DOYEN", "EXUDE", "GOOFS", "DIVVY", "NOELS", "JIVED", "HULKY", "CAGER", "HARPY", + "OLDIE", "VIVAS", "ADMIX", "CODAS", "ZILCH", "DEIST", "ORCAS", "RETRO", "PILAF", + "PARSE", "RANTS", "ZINGY", "TODDY", "CHIFF", "MICRO", "VEEPS", "GIRLY", "NEXUS", + "DEMOS", "BIBBS", "ANTES", "LULUS", "GNARL", "ZIPPY", "IVIED", "EPEES", "WIMPS", + "TROMP", "GRAIL", "YOYOS", "POUFS", "HALES", "ROUST", "CABAL", "RAWER", "PAMPA", + "MOSEY", "KEFIR", "BURGS", "UNMET", "CUSPY", "BOOBS", "BOONS", "HYPES", "DYNES", + "NARDS", "LANAI", "YOGIS", "SEPAL", "QUARK", "TOKED", "PRATE", "AYINS", "HAWED", + "SWIGS", "VITAS", "TOKER", "DOPER", "BOSSA", "LINTY", "FOIST", "MONDO", "STASH", + "KAYOS", "TWERP", "ZESTY", "CAPON", "WIMPY", "REWED", "FUNGO", "TAROT", "FROSH", + "KABOB", "PINKO", "REDID", "MIMEO", "HEIST", "TARPS", "LAMAS", "SUTRA", "DINAR", + "WHAMS", "BUSTY", "SPAYS", "MAMBO", "NABOB", "PREPS", "ODOUR", "CABBY", "CONKS", + "SLUFF", "DADOS", "HOURI", "SWART", "BALMS", "GUTSY", "FAXED", "EGADS", "PUSHY", + "RETRY", "AGORA", "DRUBS", "DAFFY", "CHITS", "MUFTI", "KARMA", "LOTTO", "TOFFS", + "BURPS", "DEUCE", "ZINGS", "KAPPA", "CLADS", "DOGGY", "DUPER", "SCAMS", "OGLER", + "MIMES", "THROE", "ZETAS", "WALED", "PROMO", "BLATS", "MUFFS", "OINKS", "VIAND", + "COSET", "FINKS", "FADDY", "MINIS", "SNAFU", "SAUNA", "USURY", "MUXES", "CRAWS", + "STATS", "CONDO", "COXES", "LOOPY", "DORMS", "ASCOT", "DIPPY", "EXECS", "DOPEY", + "ENVOI", "UMPTY", "GISMO", "FAZED", "STROP", "JIVES", "SLIMS", "BATIK", "PINGS", + "SONLY", "LEGGO", "PEKOE", "PRAWN", "LUAUS", "CAMPY", "OODLE", "PREXY", "PROMS", + "TOUTS", "OGLES", "TWEET", "TOADY", "NAIAD", "HIDER", "NUKED", "FATSO", "SLUTS", + "OBITS", "NARCS", "TYROS", "DELIS", "WOOER", "HYPED", "POSET", "BYWAY", "TEXAS", + "SCROD", "AVOWS", "FUTON", "TORTE", "TUPLE", "CAROM", "KEBAB", "TAMPS", "JILTS", + "DUALS", "ARTSY", "REPRO", "MODEM", "TOPED", "PSYCH", "SICKO", "KLUTZ", "TARNS", + "COXED", "DRAYS", "CLOYS", "ANDED", "PIKER", "AIMER", "SURAS", "LIMOS", "FLACK", + "HAPAX", "DUTCH", "MUCKY", "SHIRE", "KLIEG", "STAPH", "LAYUP", "TOKES", "AXING", + "TOPER", "DUVET", "COWRY", "PROFS", "BLAHS", "ADDLE", "SUDSY", "BATTY", "COIFS", + "SUETY", "GABBY", "HAFTA", "PITAS", "GOUDA", "DEICE", "TAUPE", "TOPES", "DUCHY", + "NITRO", "CARNY", "LIMEY", "ORALS", "HIRER", "TAXER", "ROILS", "RUBLE", "ELATE", + "DOLOR", "WRYER", "SNOTS", "QUAIS", "COKED", "GIMEL", "GORSE", "MINAS", "GOEST", + "AGAPE", "MANTA", "JINGS", "ILIAC", "ADMEN", "OFFEN", "CILLS", "OFFAL", "LOTTA", + "BOLAS", "THWAP", "ALWAY", "BOGGY", "DONNA", "LOCOS", "BELAY", "GLUEY", "BITSY", + "MIMSY", "HILAR", "OUTTA", "VROOM", "FETAL", "RATHS", "RENAL", "DYADS", "CROCS", + "VIRES", "CULPA", "KIVAS", "FEIST", "TEATS", "THATS", "YAWLS", "WHENS", "ABACA", + "OHHHH", "APHIS", "FUSTY", "ECLAT", "PERDU", "MAYST", "EXEAT", "MOLLY", "SUPRA", + "WETLY", "PLASM", "BUFFA", "SEMEN", "PUKKA", "TAGUA", "PARAS", "STOAT", "SECCO", + "CARTE", "HAUTE", "MOLAL", "SHADS", "FORMA", "OVOID", "PIONS", "MODUS", "BUENO", + "RHEUM", "SCURF", "PARER", "EPHAH", "DOEST", "SPRUE", "FLAMS", "MOLTO", "DIETH", + "CHOOS", "MIKED", "BRONX", "GOOPY", "BALLY", "PLUMY", "MOONY", "MORTS", "YOURN", + "BIPOD", "SPUME", "ALGAL", "AMBIT", "MUCHO", "SPUED", "DOZER", "HARUM", "GROAT", + "SKINT", "LAUDE", "THRUM", "PAPPY", "ONCET", "RIMED", "GIGUE", "LIMED", "PLEIN", + "REDLY", "HUMPF", "LITES", "SEEST", "GREBE", "ABSIT", "THANX", "PSHAW", "YAWPS", + "PLATS", "PAYED", "AREAL", "TILTH", "YOUSE", "GWINE", "THEES", "WATSA", "LENTO", + "SPITZ", "YAWED", "GIPSY", "SPRAT", "CORNU", "AMAHS", "BLOWY", "WAHOO", "LUBRA", + "MECUM", "WHOOO", "COQUI", "SABRA", "EDEMA", "MRADS", "DICOT", "ASTRO", "KITED", + "OUZEL", "DIDOS", "GRATA", "BONNE", "AXMEN", "KLUNK", "SUMMA", "LAVES", "PURLS", + "YAWNY", "TEARY", "MASSE", "LARGO", "BAZAR", "PSSST", "SYLPH", "LULAB", "TOQUE", + "FUGIT", "PLUNK", "ORTHO", "LUCRE", "COOCH", "WHIPT", "FOLKY", "TYRES", "WHEEE", + "CORKY", "INJUN", "SOLON", "DIDOT", "KERFS", "RAYED", "WASSA", "CHILE", "BEGAT", + "NIPPY", "LITRE", "MAGNA", "REBOX", "HYDRO", "MILCH", "BRENT", "GYVES", "LAZED", + "FEUED", "MAVIS", "INAPT", "BAULK", "CASUS", "SCRUM", "WISED", "FOSSA", "DOWER", + "KYRIE", "BHOYS", "SCUSE", "FEUAR", "OHMIC", "JUSTE", "UKASE", "BEAUX", "TUSKY", + "ORATE", "MUSTA", "LARDY", "INTRA", "QUIFF", "EPSOM", "NEATH", "OCHER", "TARED", + "HOMME", "MEZZO", "CORMS", "PSOAS", "BEAKY", "TERRY", "INFRA", "SPIVS", "TUANS", + "BELLI", "BERGS", "ANIMA", "WEIRS", "MAHUA", "SCOPS", "MANSE", "TITRE", "CURIA", + "KEBOB", "CYCAD", "TALKY", "FUCKS", "TAPIS", "AMIDE", "DOLCE", "SLOES", "JAKES", + "RUSSE", "BLASH", "TUTTI", "PRUTA", "PANGA", "BLEBS", "TENCH", "SWARF", "HEREM", + "MISSY", "MERSE", "PAWKY", "LIMEN", "VIVRE", "CHERT", "UNSEE", "TIROS", "BRACK", + "FOOTS", "WELSH", "FOSSE", "KNOPS", "ILEUM", "NOIRE", "FIRMA", "PODGY", "LAIRD", + "THUNK", "SHUTE", "ROWAN", "SHOJI", "POESY", "UNCAP", "FAMES", "GLEES", "COSTA", + "TURPS", "FORES", "SOLUM", "IMAGO", "BYRES", "FONDU", "CONEY", "POLIS", "DICTU", + "KRAAL", "SHERD", "MUMBO", "WROTH", "CHARS", "UNBOX", "VACUO", "SLUED", "WEEST", + "HADES", "WILED", "SYNCS", "MUSER", "EXCON", "HOARS", "SIBYL", "PASSE", "JOEYS", + "LOTSA", "LEPTA", "SHAYS", "BOCKS", "ENDUE", "DARER", "NONES", "ILEUS", "PLASH", + "BUSBY", "WHEAL", "BUFFO", "YOBBO", "BILES", "POXES", "ROOTY", "LICIT", "TERCE", + "BROMO", "HAYEY", "DWEEB", "IMBED", "SARAN", "BRUIT", "PUNKY", "SOFTS", "BIFFS", + "LOPPY", "AGARS", "AQUAE", "LIVRE", "BIOME", "BUNDS", "SHEWS", "DIEMS", "GINNY", + "DEGUM", "POLOS", "DESEX", "UNMAN", "DUNGY", "VITAM", "WEDGY", "GLEBE", "APERS", + "RIDGY", "ROIDS", "WIFEY", "VAPES", "WHOAS", "BUNKO", "YOLKY", "ULNAS", "REEKY", + "BODGE", "BRANT", "DAVIT", "DEQUE", "LIKER", "JENNY", "TACTS", "FULLS", "TREAP", + "LIGNE", "ACKED", "REFRY", "VOWER", "AARGH", "CHURL", "MOMMA", "GAOLS", "WHUMP", + "ARRAS", "MARLS", "TILER", "GROGS", "MEMES", "MIDIS", "TIDED", "HALER", "DUCES", + "TWINY", "POSTE", "UNRIG", "PRISE", "DRABS", "QUIDS", "FACER", "SPIER", "BARIC", + "GEOID", "REMAP", "TRIER", "GUNKS", "STENO", "STOMA", "AIRER", "OVATE", "TORAH", + "APIAN", "SMUTS", "POCKS", "YURTS", "EXURB", "DEFOG", "NUDER", "BOSKY", "NIMBI", + "MOTHY", "JOYED", "LABIA", "PARDS", "JAMMY", "BIGLY", "FAXER", "HOPPY", "NURBS", + "COTES", "DISHY", "VISED", "CELEB", "PISMO", "CASAS", "WITHS", "DODGY", "SCUDI", + "MUNGS", "MUONS", "UREAS", "IOCTL", "UNHIP", "KRONE", "SAGER", "VERST", "EXPAT", + "GRONK", "UVULA", "SHAWM", "BILGY", "BRAES", "CENTO", "WEBBY", "LIPPY", "GAMIC", + "LORDY", "MAZED", "TINGS", "SHOAT", "FAERY", "WIRER", "DIAZO", "CARER", "RATER", + "GREPS", "RENTE", "ZLOTY", "VIERS", "UNAPT", "POOPS", "FECAL", "KEPIS", "TAXON", + "EYERS", "WONTS", "SPINA", "STOAE", "YENTA", "POOEY", "BURET", "JAPAN", "BEDEW", + "HAFTS", "SELFS", "OARED", "HERBY", "PRYER", "OAKUM", "DINKS", "TITTY", "SEPOY", + "PENES", "FUSEE", "WINEY", "GIMPS", "NIHIL", "RILLE", "GIBER", "OUSEL", "UMIAK", + "CUPPY", "HAMES", "SHITS", "AZINE", "GLADS", "TACET", "BUMPH", "COYER", "HONKY", + "GAMER", "GOOKY", "WASPY", "SEDGY", "BENTS", "VARIA", "DJINN", "JUNCO", "PUBIC", + "WILCO", "LAZES", "IDYLS", "LUPUS", "RIVES", "SNOOD", "SCHMO", "SPAZZ", "FINIS", + "NOTER", "PAVAN", "ORBED", "BATES", "PIPET", "BADDY", "GOERS", "SHAKO", "STETS", + "SEBUM", "SEETH", "LOBAR", "RAVER", "AJUGA", "RICED", "VELDS", "DRIBS", "VILLE", + "DHOWS", "UNSEW", "HALMA", "KRONA", "LIMBY", "JIFFS", "TREYS", "BAUDS", "PFFFT", + "MIMER", "PLEBS", "CANER", "JIBER", "CUPPA", "WASHY", "CHUFF", "UNARM", "YUKKY", + "STYES", "WAKER", "FLAKS", "MACES", "RIMES", "GIMPY", "GUANO", "LIRAS", "KAPOK", + "SCUDS", "BWANA", "ORING", "AIDER", "PRIER", "KLUGY", "MONTE", "GOLEM", "VELAR", + "FIRER", "PIETA", "UMBEL", "CAMPO", "UNPEG", "FOVEA", "ABEAM", "BOSON", "ASKER", + "GOTHS", "VOCAB", "VINED", "TROWS", "TIKIS", "LOPER", "INDIE", "BOFFS", "SPANG", + "GRAPY", "TATER", "ICHOR", "KILTY", "LOCHS", "SUPES", "DEGAS", "FLICS", "TORSI", + "BETHS", "WEBER", "RESAW", "LAWNY", "COVEN", "MUJIK", "RELET", "THERM", "HEIGH", + "SHNOR", "TRUED", "ZAYIN", "LIEST", "BARFS", "BASSI", "QOPHS", "ROILY", "FLABS", + "PUNNY", "OKRAS", "HANKS", "DIPSO", "NERFS", "FAUNS", "CALLA", "PSEUD", "LURER", + "MAGUS", "OBEAH", "ATRIA", "TWINK", "PALMY", "POCKY", "PENDS", "RECTA", "PLONK", + "SLAWS", "KEENS", "NICAD", "PONES", "INKER", "WHEWS", "GROKS", "MOSTS", "TREWS", + "ULNAR", "GYPPY", "COCAS", "EXPOS", "ERUCT", "OILER", "VACUA", "DRECK", "DATER", + "ARUMS", "TUBAL", "VOXEL", "DIXIT", "BEERY", "ASSAI", "LADES", "ACTIN", "GHOTI", + "BUZZY", "MEADS", "GRODY", "RIBBY", "CLEWS", "CREME", "EMAIL", "PYXIE", "KULAK", + "BOCCI", "RIVED", "DUDDY", "HOPER", "LAPIN", "WONKS", "PETRI", "PHIAL", "FUGAL", + "HOLON", "BOOMY", "DUOMO", "MUSOS", "SHIER", "HAYER", "PORGY", "HIVED", "LITHO", + "FISTY", "STAGY", "LUVYA", "MARIA", "SMOGS", "ASANA", "YOGIC", "SLOMO", "FAWNY", + "AMINE", "WEFTS", "GONAD", "TWIRP", "BRAVA", "PLYER", "FERMI", "LOGES", "NITER", + "REVET", "UNATE", "GYVED", "TOTTY", "ZAPPY", "HONER", "GIROS", "DICER", "CALKS", + "LUXES", "MONAD", "CRUFT", "QUOIN", "FUMER", "AMPED", "SHLEP", "VINCA", "YAHOO", + "VULVA", "ZOOEY", "DRYAD", "NIXIE", "MOPER", "IAMBS", "LUNES", "NUDIE", "LIMNS", + "WEALS", "NOHOW", "MIAOW", "GOUTS", "MYNAS", "MAZER", "KIKES", "OXEYE", "STOUP", + "JUJUS", "DEBAR", "PUBES", "TAELS", "DEFUN", "RANDS", "BLEAR", "PAVER", "GOOSY", + "SPROG", "OLEOS", "TOFFY", "PAWER", "MACED", "CRITS", "KLUGE", "TUBED", "SAHIB", + "GANEF", "SCATS", "SPUTA", "VANED", "ACNED", "TAXOL", "PLINK", "OWETH", "TRIBS", + "RESAY", "BOULE", "THOUS", "HAPLY", "GLANS", "MAXIS", "BEZEL", "ANTIS", "PORKS", + "QUOIT", "ALKYD", "GLARY", "BEAMY", "HEXAD", "BONKS", "TECUM", "KERBS", "FILAR", + "FRIER", "REDUX", "ABUZZ", "FADER", "SHOER", "COUTH", "TRUES", "GUYED", "GOONY", + "BOOKY", "FUZES", "HURLY", "GENET", "HODAD", "CALIX", "FILER", "PAWLS", "IODIC", + "UTERO", "HENGE", "UNSAY", "LIERS", "PIING", "WEALD", "SEXED", "FOLIC", "POXED", + "CUNTS", "ANILE", "KITHS", "BECKS", "TATTY", "PLENA", "REBAR", "ABLED", "TOYER", + "ATTAR", "TEAKS", "AIOLI", "AWING", "ANENT", "FECES", "REDIP", "WISTS", "PRATS", + "MESNE", "MUTER", "SMURF", "OWEST", "BAHTS", "LOSSY", "FTPED", "HUNKY", "HOERS", + "SLIER", "SICKS", "FATLY", "DELFT", "HIVER", "HIMBO", "PENGO", "BUSKS", "LOXES", + "ZONKS", "ILIUM", "APORT", "IKONS", "MULCT", "REEVE", "CIVVY", "CANNA", "BARFY", + "KAIAK", "SCUDO", "KNOUT", "GAPER", "BHANG", "PEASE", "UTERI", "LASES", "PATEN", + "RASAE", "AXELS", "STOAS", "OMBRE", "STYLI", "GUNKY", "HAZER", "KENAF", "AHOYS", + "AMMOS", "WEENY", "URGER", "KUDZU", "PAREN", "BOLOS", "FETOR", "NITTY", "TECHY", + "LIETH", "SOMAS", "DARKY", "VILLI", "GLUON", "JANES", "CANTS", "FARTS", "SOCLE", + "JINNS", "RUING", "SLILY", "RICER", "HADDA", "WOWEE", "RICES", "NERTS", "CAULS", + "SWIVE", "LILTY", "MICKS", "ARITY", "PASHA", "FINIF", "OINKY", "GUTTY", "TETRA", + "WISES", "WOLDS", "BALDS", "PICOT", "WHATS", "SHIKI", "BUNGS", "SNARF", "LEGOS", + "DUNGS", "STOGY", "BERMS", "TANGS", "VAILS", "ROODS", "MOREL", "SWARE", "ELANS", + "LATUS", "GULES", "RAZER", "DOXIE", "BUENA", "OVERS", "GUTTA", "ZINCS", "NATES", + "KIRKS", "TIKES", "DONEE", "JERRY", "MOHEL", "CEDER", "DOGES", "UNMAP", "FOLIA", + "RAWLY", "SNARK", "TOPOI", "CEILS", "IMMIX", "YORES", "DIEST", "BUBBA", "POMPS", + "FORKY", "TURDY", "LAWZY", "POOHS", "WORTS", "GLOMS", "BEANO", "MULEY", "BARKY", + "TUNNY", "AURIC", "FUNKS", "GAFFS", "CORDY", "CURDY", "LISLE", "TORIC", "SOYAS", + "REMAN", "MUNGY", "CARPY", "APISH", "OATEN", "GAPPY", "AURAE", "BRACT", "ROOKY", + "AXLED", "BURRY", "SIZER", "PROEM", "TURFY", "IMPRO", "MASHY", "MIENS", "NONNY", + "OLIOS", "GROOK", "SATES", "AGLEY", "CORGI", "DASHY", "DOSER", "DILDO", "APSOS", + "XORED", "LAKER", "PLAYA", "SELAH", "MALTY", "DULSE", "FRIGS", "DEMIT", "WHOSO", + "RIALS", "SAWER", "BEDIM", "SNUGS", "FANIN", "AZOIC", "ICERS", "SUERS", "WIZEN", + "KOINE", "TOPOS", "SHIRR", "RIFER", "FERAL", "LADED", "LASED", "TURDS", "SWEDE", + "EASTS", "COZEN", "UNHIT", "PALLY", "AITCH", "SEDUM", "COPER", "RUCHE", "GEEKS", + "SWAGS", "ETEXT", "ALGIN", "OFFED", "NINJA", "HOLER", "DOTER", "TOTER", "BESOT", + "DICUT", "MACER", "PEENS", "PEWIT", "REDOX", "POLER", "YECCH", "FLUKY", "DOETH", + "TWATS", "CRUDS", "BEBUG", "BIDER", "STELE", "HEXER", "WESTS", "GLUER", "PILAU", + "ABAFT", "WHELM", "LACER", "INODE", "TABUS", "GATOR", "CUING", "REFLY", "LUTED", + "CUKES", "BAIRN", "BIGHT", "ARSES", "CRUMP", "LOGGY", "BLINI", "SPOOR", "TOYON", + "HARKS", "WAZOO", "FENNY", "NAVES", "KEYER", "TUFAS", "MORPH", "RAJAS", "TYPAL", + "SPIFF", "OXLIP", "UNBAN", "MUSSY", "FINNY", "RIMER", "LOGIN", "MOLAS", "CIRRI", + "HUZZA", "AGONE", "UNSEX", "UNWON", "PEATS", "TOILE", "ZOMBI", "DEWED", "NOOKY", + "ALKYL", "IXNAY", "DOVEY", "HOLEY", "CUBER", "AMYLS", "PODIA", "CHINO", "APNEA", + "PRIMS", "LYCRA", "JOHNS", "PRIMO", "FATWA", "EGGER", "HEMPY", "SNOOK", "HYING", + "FUZED", "BARMS", "CRINK", "MOOTS", "YERBA", "RHUMB", "UNARC", "DIRER", "MUNGE", + "ELAND", "NARES", "WRIER", "NODDY", "ATILT", "JUKES", "ENDER", "THENS", "UNFIX", + "DOGGO", "ZOOKS", "DIDDY", "SHMOO", "BRUSK", "PREST", "CURER", "PASTS", "KELPY", + "BOCCE", "KICKY", "TAROS", "LINGS", "DICKY", "NERDY", "ABEND", "STELA", "BIGGY", + "LAVED", "BALDY", "PUBIS", "GOOKS", "WONKY", "STIED", "HYPOS", "ASSED", "SPUMY", + "OSIER", "ROBLE", "RUMBA", "BIFFY", "PUPAL" +] + +alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] + +def most_used_letters(): + dicto = {} + for i in alphabet: + count = 0 + for word in words: + for letter in word: + if i.upper() == letter.upper(): + count+=1 + break + dicto[i] = count + dicto = dict(sorted(dicto.items(), key=lambda item: item[1], reverse=True)) + print("Letter | Usage") + print("--------------") + for k in dicto: + print(f"{k.upper()} | {dicto[k]}") + + +def list_of_valid_words(): + letters = ['s', 'e', 'a', 'r', 'o', 'i', 'L', 'n', 'p', 'c'] + for i, letter in enumerate(letters): # Force all letters to be capitalized + letters[i] = letter.upper() + + legal_words = [] + for word in words: + valid_word = True + for letter in word: + if letter.upper() not in letters: + valid_word = False + break + if valid_word and word not in legal_words: + legal_words.append(word) + + for i,word in enumerate(legal_words): + legal_words[i] = word.upper().replace("D","d") + + print(f"Number of words found: {len(legal_words)}") + items_per_row = 9 + i = 0 + print("static const char _legal_words[][WORDLE_LENGTH + 1] = {") + while i < len(legal_words): + print(" ", end='') + for j in range(min(items_per_row, len(legal_words)-i)): + print(f'"{legal_words[i]}", ', end='') + i+=1 + print('') + print("};") + +if __name__ == "__main__": + #most_used_letters() + list_of_valid_words() + From ee53e83ae7d9d920add1af6d0faad01ce1b017ef Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Wed, 14 Aug 2024 23:31:00 -0400 Subject: [PATCH 03/53] Changed dict to a smaller and simpler one --- .../watch_faces/complication/wordle_face.c | 115 +-- utils/wordle_list.py | 969 ++++++------------ 2 files changed, 374 insertions(+), 710 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index f6f63fd8..4052ef7c 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -36,77 +36,60 @@ TODO: */ -// From: https://github.com/charlesreid1/five-letter-words/blob/master/sgb-words.txt +// From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff /* -Letter | Usage in sgb-words.txt -S | 2674 -E | 2658 -A | 2181 -R | 1799 -O | 1683 -I | 1539 -T | 1462 But looks bad across all positions -L | 1434 -N | 1219 -D | 1100 lowercase d looks like a in certain positions -U | 1068 C has more words with the other letters here (457 total vs 390) -C | 920 -P | 895 +Letter | Usage +E | 1519 +S | 1490 +A | 1213 +R | 1026 +O | 852 +L | 850 +I | 843 +T | 819 But looks bad across all positions +N | 681 +D | 619 lowercase d looks like a in certain positions +C | 525 +U | 514 P has more words with the other letters here (281 vs 198) +P | 448 */ -static const char _valid_letters[] = {'A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R', 'S'}; +static const char _valid_letters[] = {'E', 'S', 'A', 'R', 'O', 'L', 'I', 'N', 'C', 'P'}; +// Number of words found: 281 static const char _legal_words[][WORDLE_LENGTH + 1] = { - "PLACE", "SINCE", "PAPER", "LINES", "LEARN", "SPACE", "CLOSE", "CLASS", "PIECE", - "COLOR", "ALONE", "PLANE", "SPELL", "CLEAR", "AREAS", "SENSE", "OCEAN", "SCALE", - "CELLS", "SLEEP", "LOCAL", "CLEAN", "PEACE", "CROSS", "CASES", "CROPS", "PLAIN", - "PAIRS", "SCORE", "NOISE", "PIANO", "PLANS", "PRICE", "RAISE", "SCENE", "PRESS", - "APPLE", "CALLS", "POLES", "LOOSE", "OPERA", "INNER", "SOLAR", "RISES", "SALES", - "ACRES", "ERROR", "NAILS", "COINS", "SLOPE", "CANOE", "CANAL", "LIONS", "AROSE", - "RACES", "SPARE", "PIPES", "RAINS", "ROLLS", "SAILS", "ARISE", "ROPES", "CRIES", - "OPENS", "APRON", "SPEAR", "SLICE", "SPOON", "ROSES", "LINEN", "POLAR", "PEARL", - "LOSES", "CORAL", "SPOIL", "PANEL", "SELLS", "COOLS", "SOILS", "POOLS", "RISEN", - "PILES", "SLAIN", "PANIC", "CRISP", "RAILS", "SCOPE", "CONES", "COCOA", "REINS", - "NOSES", "SCARE", "CEASE", "PRIOR", "POLIO", "SEALS", "COALS", "LOANS", "SPINS", - "PAINS", "ONION", "SCRAP", "ROLES", "SNAIL", "LOOPS", "CREEP", "CARES", "ALIEN", - "CRANE", "SLIPS", "SPINE", "LEAPS", "PROSE", "SNARE", "PINES", "SCALP", "LEASE", - "COILS", "ARENA", "PEARS", "CLIPS", "LANES", "RESIN", "SONAR", "CORPS", "NIECE", - "CELLO", "REPEL", "SPICE", "OASIS", "PACES", "COLON", "CACAO", "RINSE", "SPOOL", - "SPILL", "SNAPS", "EERIE", "EARNS", "PERIL", "LINER", "SCARS", "SOLES", "PAILS", - "CAROL", "CANON", "POLLS", "NASAL", "SCORN", "OASES", "ASSES", "PILLS", "SPORE", - "SPIES", "ERASE", "AISLE", "LOINS", "LEANS", "LANCE", "PANES", "PORES", "POISE", - "IRONS", "ROARS", "SCOOP", "LASSO", "PRONE", "NICER", "SNARL", "CORES", "RIPEN", - "PEERS", "EASEL", "LACES", "SOAPS", "SNIPS", "PIERS", "LASER", "LILAC", "SIREN", - "CLASP", "POSSE", "POSES", "SLOOP", "SLAPS", "SOLOS", "SISAL", "SEEPS", "SPANS", - "CLAPS", "ACORN", "LOSER", "LAPSE", "ASPEN", "SNORE", "PROPS", "PESOS", "SONIC", - "SPARS", "SORES", "RELIC", "NOOSE", "NEARS", "CAPES", "CANES", "SPIRE", "ISLES", - "SNEER", "RARER", "NINES", "PECAN", "PENCE", "SILLS", "COPRA", "POPES", "SPREE", - "SCANS", "REELS", "LIARS", "LEPER", "SOARS", "PLEAS", "PALER", "EPICS", "CAPER", - "CONIC", "OPALS", "EASES", "ARSON", "CLANS", "PLIES", "CROON", "PREEN", "SEERS", - "COCCI", "SILOS", "SNIPE", "SANER", "RILLS", "CORNS", "PRIES", "LOONS", "EARLS", - "PEONS", "PALES", "LAIRS", "PEELS", "PEALS", "CRONE", "ENROL", "COOPS", "LAPEL", - "RASPS", "ASPIC", "PENIS", "INANE", "SLOPS", "COCOS", "LEERS", "LOPES", "ALIAS", - "RACER", "COPSE", "PALLS", "COPES", "ICONS", "REAPS", "SNOOP", "LORES", "REARS", - "COLIC", "PLOPS", "SIRES", "CARPS", "LISPS", "PEEPS", "SORER", "LOLLS", "PARES", - "ACNES", "NEONS", "NOONS", "PAPAS", "RIPER", "ELOPE", "CRESS", "NAPES", "ICIER", - "CILIA", "SEARS", "SARIS", "PAPAL", "ROSIN", "CREPE", "RISER", "PACER", "SALON", - "CRIER", "LOESS", "PIPER", "COONS", "SEINE", "IONIC", "SCRIP", "PENAL", "ALOES", - "APACE", "SIREE", "ROPER", "ANION", "LONER", "CIRCA", "CARNE", "ANISE", "SPECS", - "ANNAS", "PICAS", "REALS", "AERIE", "ORLON", "CRASS", "SPIEL", "LAPIS", "ARIAS", - "PAEAN", "SINES", "SCION", "RAPES", "SCARP", "SEPIA", "POSER", "LIENS", "RILES", - "APSES", "NONCE", "ANOLE", "RECAP", "CARON", "PORNO", "CREEL", "CAPOS", "OPINE", - "NISEI", "RERAN", "NARCO", "CLOPS", "ESSES", "SCONE", "SALSA", "ROANS", "RAPER", - "CORER", "COLAS", "CAIRN", "CRAPS", "CLONE", "NOELS", "ORCAS", "PARSE", "EPEES", - "LANAI", "SEPAL", "CAPON", "PREPS", "NARCS", "REPRO", "ORALS", "ROILS", "ILIAC", - "CILLS", "LOCOS", "RENAL", "CROCS", "PARAS", "SECCO", "PIONS", "PARER", "PLEIN", - "AREAL", "SOLON", "PSOAS", "SCOPS", "SLOES", "NOIRE", "POLIS", "PASSE", "NONES", - "SARAN", "POLOS", "APERS", "ARRAS", "PRISE", "SPIER", "AIRER", "APIAN", "CASAS", - "CARER", "POOPS", "SPINA", "PENES", "RILLE", "CANER", "LIRAS", "PRIER", "LOPER", - "CALLA", "PONES", "COCAS", "OILER", "ASSAI", "LAPIN", "ASANA", "OLEOS", "LIERS", - "ANILE", "PLENA", "AIOLI", "SLIER", "CANNA", "PEASE", "LASES", "RASAE", "PAREN", - "SOCLE", "RICER", "RICES", "ELANS", "CEILS", "LISLE", "OLIOS", "APSOS", "RIALS", - "ICERS", "COPER", "PEENS", "POLER", "LACER", "ARSES", "SPOOR", "CIRRI", "APNEA", - "NARES", "OSIER", + "SPIES", "SOLAR", "RAISE", "RARES", "PAEAN", "PLIES", "CRASS", "PEARS", "SNORE", + "POLES", "ROLLS", "ALOES", "LOSES", "SLICE", "PEACE", "POLLS", "POSES", "LANES", + "COPRA", "SPANS", "CANAL", "LOSER", "PAPER", "PILES", "CLASS", "RACER", "POOLS", + "PLAIN", "SPEAR", "SPARE", "INNER", "ALIEN", "NOSES", "EARLS", "SEALS", "LEARN", + "COLIC", "OPERA", "LOOSE", "SPOOR", "SCALE", "SOARS", "PAILS", "PRONE", "OPALS", + "PIPER", "RILLS", "CAIRN", "POISE", "LEAPS", "ELOPE", "NICER", "SLOOP", "PANES", + "SOLES", "CROSS", "NIECE", "LAIRS", "LEASE", "SALES", "SCENE", "SORES", "SNARL", + "SPIRE", "LASSO", "CLOSE", "OSIER", "SPOOL", "PRICE", "LOANS", "POSSE", "PENAL", + "SLAPS", "RELIC", "SINCE", "CIRCA", "LIARS", "RISES", "OPENS", "ROARS", "PACES", + "ARISE", "RISEN", "PENIS", "LAPEL", "CROPS", "CANON", "LAPSE", "SCION", "ARSON", + "AREAS", "SLAIN", "CANOE", "EERIE", "NOOSE", "PIANO", "PLANE", "CLASP", "SCARE", + "COCOA", "CRESS", "NASAL", "LOCAL", "RINSE", "SCARS", "PROPS", "OASES", "SLEEP", + "SNAPS", "SIRES", "CANES", "RAILS", "RESIN", "COLON", "PEASE", "POPES", "PENCE", + "AROSE", "REELS", "SALSA", "OCEAN", "PESOS", "OPINE", "RACES", "RAINS", "PRIES", + "CRIES", "CALLS", "PIERS", "CELLS", "SCRAP", "EARNS", "IRONS", "SPACE", "LOONS", + "SILLS", "COALS", "PIECE", "PALER", "REINS", "APACE", "SLOPE", "CREPE", "CONES", + "CAPER", "SEERS", "CAPES", "OASIS", "REAPS", "PALES", "CLAPS", "PLEAS", "INANE", + "COINS", "SNAIL", "CLEAR", "ROSIN", "LILAC", "SPARS", "SPINE", "NONCE", "CRISP", + "CRAPE", "AISLE", "CRONE", "SPOIL", "SPOON", "ARENA", "PARSE", "CASES", "SPICE", + "RIPER", "PILLS", "SOLOS", "SPINS", "PEERS", "RARER", "CONIC", "REARS", "CACAO", + "PAPAS", "ACRES", "ROPES", "CORAL", "CLEAN", "EASES", "SPILL", "SENSE", "PIPES", + "CLANS", "PRESS", "LOINS", "PAPAL", "APPLE", "PAIRS", "SCORN", "ALONE", "PEEPS", + "SPREE", "SNARE", "CLIPS", "EASEL", "CAROL", "ASPEN", "SALON", "LOOPS", "PEALS", + "SNEER", "PLACE", "SELLS", "LINEN", "CRIER", "ACORN", "SLIPS", "ERASE", "LIONS", + "NAILS", "REPEL", "CORES", "LEPER", "APPAL", "ROSES", "SCORE", "RISER", "CREEP", + "CAPON", "ERROR", "NOISE", "CARES", "APRON", "SOILS", "SLOPS", "PAINS", "EPICS", + "SANER", "SAILS", "PRIOR", "ASSES", "COILS", "SCOOP", "LACES", "SCALP", "CRANE", + "PLANS", "ISLES", "SPORE", "PANIC", "COOLS", "SPELL", "ALIAS", "PORES", "SCRIP", + "PEARL", "PANEL", "ENROL", "LANCE", "CORPS", "LINES", "COPSE", "ONION", "NEARS", + "RIPEN", "LINER", "SCOPE", "SCANS", "SNIPE", "CEASE", "LEANS", "AEONS", "PINES", + "POPPA", "ROLES", "REALS", "PERIL", "POSER", "PROSE", "POLAR", "CORNS", "LIENS", + "SIREN", "PEONS", }; static const uint32_t _num_words = (sizeof(_legal_words) / sizeof(_legal_words[0])); diff --git a/utils/wordle_list.py b/utils/wordle_list.py index 30da4bd3..87e60660 100644 --- a/utils/wordle_list.py +++ b/utils/wordle_list.py @@ -1,645 +1,318 @@ -# From: https://github.com/charlesreid1/five-letter-words/blob/master/sgb-words.txt +import random + +# From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff words = [ - "WHICH", "THERE", "THEIR", "ABOUT", "WOULD", "THESE", "OTHER", "WORDS", "COULD", - "WRITE", "FIRST", "WATER", "AFTER", "WHERE", "RIGHT", "THINK", "THREE", "YEARS", - "PLACE", "SOUND", "GREAT", "AGAIN", "STILL", "EVERY", "SMALL", "FOUND", "THOSE", - "NEVER", "UNDER", "MIGHT", "WHILE", "HOUSE", "WORLD", "BELOW", "ASKED", "GOING", - "LARGE", "UNTIL", "ALONG", "SHALL", "BEING", "OFTEN", "EARTH", "BEGAN", "SINCE", - "STUDY", "NIGHT", "LIGHT", "ABOVE", "PAPER", "PARTS", "YOUNG", "STORY", "POINT", - "TIMES", "HEARD", "WHOLE", "WHITE", "GIVEN", "MEANS", "MUSIC", "MILES", "THING", - "TODAY", "LATER", "USING", "MONEY", "LINES", "ORDER", "GROUP", "AMONG", "LEARN", - "KNOWN", "SPACE", "TABLE", "EARLY", "TREES", "SHORT", "HANDS", "STATE", "BLACK", - "SHOWN", "STOOD", "FRONT", "VOICE", "KINDS", "MAKES", "COMES", "CLOSE", "POWER", - "LIVED", "VOWEL", "TAKEN", "BUILT", "HEART", "READY", "QUITE", "CLASS", "BRING", - "ROUND", "HORSE", "SHOWS", "PIECE", "GREEN", "STAND", "BIRDS", "START", "RIVER", - "TRIED", "LEAST", "FIELD", "WHOSE", "GIRLS", "LEAVE", "ADDED", "COLOR", "THIRD", - "HOURS", "MOVED", "PLANT", "DOING", "NAMES", "FORMS", "HEAVY", "IDEAS", "CRIED", - "CHECK", "FLOOR", "BEGIN", "WOMAN", "ALONE", "PLANE", "SPELL", "WATCH", "CARRY", - "WROTE", "CLEAR", "NAMED", "BOOKS", "CHILD", "GLASS", "HUMAN", "TAKES", "PARTY", - "BUILD", "SEEMS", "BLOOD", "SIDES", "SEVEN", "MOUTH", "SOLVE", "NORTH", "VALUE", - "DEATH", "MAYBE", "HAPPY", "TELLS", "GIVES", "LOOKS", "SHAPE", "LIVES", "STEPS", - "AREAS", "SENSE", "SPEAK", "FORCE", "OCEAN", "SPEED", "WOMEN", "METAL", "SOUTH", - "GRASS", "SCALE", "CELLS", "LOWER", "SLEEP", "WRONG", "PAGES", "SHIPS", "NEEDS", - "ROCKS", "EIGHT", "MAJOR", "LEVEL", "TOTAL", "AHEAD", "REACH", "STARS", "STORE", - "SIGHT", "TERMS", "CATCH", "WORKS", "BOARD", "COVER", "SONGS", "EQUAL", "STONE", - "WAVES", "GUESS", "DANCE", "SPOKE", "BREAK", "CAUSE", "RADIO", "WEEKS", "LANDS", - "BASIC", "LIKED", "TRADE", "FRESH", "FINAL", "FIGHT", "MEANT", "DRIVE", "SPENT", - "LOCAL", "WAXES", "KNOWS", "TRAIN", "BREAD", "HOMES", "TEETH", "COAST", "THICK", - "BROWN", "CLEAN", "QUIET", "SUGAR", "FACTS", "STEEL", "FORTH", "RULES", "NOTES", - "UNITS", "PEACE", "MONTH", "VERBS", "SEEDS", "HELPS", "SHARP", "VISIT", "WOODS", - "CHIEF", "WALLS", "CROSS", "WINGS", "GROWN", "CASES", "FOODS", "CROPS", "FRUIT", - "STICK", "WANTS", "STAGE", "SHEEP", "NOUNS", "PLAIN", "DRINK", "BONES", "APART", - "TURNS", "MOVES", "TOUCH", "ANGLE", "BASED", "RANGE", "MARKS", "TIRED", "OLDER", - "FARMS", "SPEND", "SHOES", "GOODS", "CHAIR", "TWICE", "CENTS", "EMPTY", "ALIKE", - "STYLE", "BROKE", "PAIRS", "COUNT", "ENJOY", "SCORE", "SHORE", "ROOTS", "PAINT", - "HEADS", "SHOOK", "SERVE", "ANGRY", "CROWD", "WHEEL", "QUICK", "DRESS", "SHARE", - "ALIVE", "NOISE", "SOLID", "CLOTH", "SIGNS", "HILLS", "TYPES", "DRAWN", "WORTH", - "TRUCK", "PIANO", "UPPER", "LOVED", "USUAL", "FACES", "DROVE", "CABIN", "BOATS", - "TOWNS", "PROUD", "COURT", "MODEL", "PRIME", "FIFTY", "PLANS", "YARDS", "PROVE", - "TOOLS", "PRICE", "SHEET", "SMELL", "BOXES", "RAISE", "MATCH", "TRUTH", "ROADS", - "THREW", "ENEMY", "LUNCH", "CHART", "SCENE", "GRAPH", "DOUBT", "GUIDE", "WINDS", - "BLOCK", "GRAIN", "SMOKE", "MIXED", "GAMES", "WAGON", "SWEET", "TOPIC", "EXTRA", - "PLATE", "TITLE", "KNIFE", "FENCE", "FALLS", "CLOUD", "WHEAT", "PLAYS", "ENTER", - "BROAD", "STEAM", "ATOMS", "PRESS", "LYING", "BASIS", "CLOCK", "TASTE", "GROWS", - "THANK", "STORM", "AGREE", "BRAIN", "TRACK", "SMILE", "FUNNY", "BEACH", "STOCK", - "HURRY", "SAVED", "SORRY", "GIANT", "TRAIL", "OFFER", "OUGHT", "ROUGH", "DAILY", - "AVOID", "KEEPS", "THROW", "ALLOW", "CREAM", "LAUGH", "EDGES", "TEACH", "FRAME", - "BELLS", "DREAM", "MAGIC", "OCCUR", "ENDED", "CHORD", "FALSE", "SKILL", "HOLES", - "DOZEN", "BRAVE", "APPLE", "CLIMB", "OUTER", "PITCH", "RULER", "HOLDS", "FIXED", - "COSTS", "CALLS", "BLANK", "STAFF", "LABOR", "EATEN", "YOUTH", "TONES", "HONOR", - "GLOBE", "GASES", "DOORS", "POLES", "LOOSE", "APPLY", "TEARS", "EXACT", "BRUSH", - "CHEST", "LAYER", "WHALE", "MINOR", "FAITH", "TESTS", "JUDGE", "ITEMS", "WORRY", - "WASTE", "HOPED", "STRIP", "BEGUN", "ASIDE", "LAKES", "BOUND", "DEPTH", "CANDY", - "EVENT", "WORSE", "AWARE", "SHELL", "ROOMS", "RANCH", "IMAGE", "SNAKE", "ALOUD", - "DRIED", "LIKES", "MOTOR", "POUND", "KNEES", "REFER", "FULLY", "CHAIN", "SHIRT", - "FLOUR", "DROPS", "SPITE", "ORBIT", "BANKS", "SHOOT", "CURVE", "TRIBE", "TIGHT", - "BLIND", "SLEPT", "SHADE", "CLAIM", "FLIES", "THEME", "QUEEN", "FIFTH", "UNION", - "HENCE", "STRAW", "ENTRY", "ISSUE", "BIRTH", "FEELS", "ANGER", "BRIEF", "RHYME", - "GLORY", "GUARD", "FLOWS", "FLESH", "OWNED", "TRICK", "YOURS", "SIZES", "NOTED", - "WIDTH", "BURST", "ROUTE", "LUNGS", "UNCLE", "BEARS", "ROYAL", "KINGS", "FORTY", - "TRIAL", "CARDS", "BRASS", "OPERA", "CHOSE", "OWNER", "VAPOR", "BEATS", "MOUSE", - "TOUGH", "WIRES", "METER", "TOWER", "FINDS", "INNER", "STUCK", "ARROW", "POEMS", - "LABEL", "SWING", "SOLAR", "TRULY", "TENSE", "BEANS", "SPLIT", "RISES", "WEIGH", - "HOTEL", "STEMS", "PRIDE", "SWUNG", "GRADE", "DIGIT", "BADLY", "BOOTS", "PILOT", - "SALES", "SWEPT", "LUCKY", "PRIZE", "STOVE", "TUBES", "ACRES", "WOUND", "STEEP", - "SLIDE", "TRUNK", "ERROR", "PORCH", "SLAVE", "EXIST", "FACED", "MINES", "MARRY", - "JUICE", "RACED", "WAVED", "GOOSE", "TRUST", "FEWER", "FAVOR", "MILLS", "VIEWS", - "JOINT", "EAGER", "SPOTS", "BLEND", "RINGS", "ADULT", "INDEX", "NAILS", "HORNS", - "BALLS", "FLAME", "RATES", "DRILL", "TRACE", "SKINS", "WAXED", "SEATS", "STUFF", - "RATIO", "MINDS", "DIRTY", "SILLY", "COINS", "HELLO", "TRIPS", "LEADS", "RIFLE", - "HOPES", "BASES", "SHINE", "BENCH", "MORAL", "FIRES", "MEALS", "SHAKE", "SHOPS", - "CYCLE", "MOVIE", "SLOPE", "CANOE", "TEAMS", "FOLKS", "FIRED", "BANDS", "THUMB", - "SHOUT", "CANAL", "HABIT", "REPLY", "RULED", "FEVER", "CRUST", "SHELF", "WALKS", - "MIDST", "CRACK", "PRINT", "TALES", "COACH", "STIFF", "FLOOD", "VERSE", "AWAKE", - "ROCKY", "MARCH", "FAULT", "SWIFT", "FAINT", "CIVIL", "GHOST", "FEAST", "BLADE", - "LIMIT", "GERMS", "READS", "DUCKS", "DAIRY", "WORST", "GIFTS", "LISTS", "STOPS", - "RAPID", "BRICK", "CLAWS", "BEADS", "BEAST", "SKIRT", "CAKES", "LIONS", "FROGS", - "TRIES", "NERVE", "GRAND", "ARMED", "TREAT", "HONEY", "MOIST", "LEGAL", "PENNY", - "CROWN", "SHOCK", "TAXES", "SIXTY", "ALTAR", "PULLS", "SPORT", "DRUMS", "TALKS", - "DYING", "DATES", "DRANK", "BLOWS", "LEVER", "WAGES", "PROOF", "DRUGS", "TANKS", - "SINGS", "TAILS", "PAUSE", "HERDS", "AROSE", "HATED", "CLUES", "NOVEL", "SHAME", - "BURNT", "RACES", "FLASH", "WEARY", "HEELS", "TOKEN", "COATS", "SPARE", "SHINY", - "ALARM", "DIMES", "SIXTH", "CLERK", "MERCY", "SUNNY", "GUEST", "FLOAT", "SHONE", - "PIPES", "WORMS", "BILLS", "SWEAT", "SUITS", "SMART", "UPSET", "RAINS", "SANDY", - "RAINY", "PARKS", "SADLY", "FANCY", "RIDER", "UNITY", "BUNCH", "ROLLS", "CRASH", - "CRAFT", "NEWLY", "GATES", "HATCH", "PATHS", "FUNDS", "WIDER", "GRACE", "GRAVE", - "TIDES", "ADMIT", "SHIFT", "SAILS", "PUPIL", "TIGER", "ANGEL", "CRUEL", "AGENT", - "DRAMA", "URGED", "PATCH", "NESTS", "VITAL", "SWORD", "BLAME", "WEEDS", "SCREW", - "VOCAL", "BACON", "CHALK", "CARGO", "CRAZY", "ACTED", "GOATS", "ARISE", "WITCH", - "LOVES", "QUEER", "DWELL", "BACKS", "ROPES", "SHOTS", "MERRY", "PHONE", "CHEEK", - "PEAKS", "IDEAL", "BEARD", "EAGLE", "CREEK", "CRIES", "ASHES", "STALL", "YIELD", - "MAYOR", "OPENS", "INPUT", "FLEET", "TOOTH", "CUBIC", "WIVES", "BURNS", "POETS", - "APRON", "SPEAR", "ORGAN", "CLIFF", "STAMP", "PASTE", "RURAL", "BAKED", "CHASE", - "SLICE", "SLANT", "KNOCK", "NOISY", "SORTS", "STAYS", "WIPED", "BLOWN", "PILED", - "CLUBS", "CHEER", "WIDOW", "TWIST", "TENTH", "HIDES", "COMMA", "SWEEP", "SPOON", - "STERN", "CREPT", "MAPLE", "DEEDS", "RIDES", "MUDDY", "CRIME", "JELLY", "RIDGE", - "DRIFT", "DUSTY", "DEVIL", "TEMPO", "HUMOR", "SENDS", "STEAL", "TENTS", "WAIST", - "ROSES", "REIGN", "NOBLE", "CHEAP", "DENSE", "LINEN", "GEESE", "WOVEN", "POSTS", - "HIRED", "WRATH", "SALAD", "BOWED", "TIRES", "SHARK", "BELTS", "GRASP", "BLAST", - "POLAR", "FUNGI", "TENDS", "PEARL", "LOADS", "JOKES", "VEINS", "FROST", "HEARS", - "LOSES", "HOSTS", "DIVER", "PHASE", "TOADS", "ALERT", "TASKS", "SEAMS", "CORAL", - "FOCUS", "NAKED", "PUPPY", "JUMPS", "SPOIL", "QUART", "MACRO", "FEARS", "FLUNG", - "SPARK", "VIVID", "BROOK", "STEER", "SPRAY", "DECAY", "PORTS", "SOCKS", "URBAN", - "GOALS", "GRANT", "MINUS", "FILMS", "TUNES", "SHAFT", "FIRMS", "SKIES", "BRIDE", - "WRECK", "FLOCK", "STARE", "HOBBY", "BONDS", "DARED", "FADED", "THIEF", "CRUDE", - "PANTS", "FLUTE", "VOTES", "TONAL", "RADAR", "WELLS", "SKULL", "HAIRS", "ARGUE", - "WEARS", "DOLLS", "VOTED", "CAVES", "CARED", "BROOM", "SCENT", "PANEL", "FAIRY", - "OLIVE", "BENDS", "PRISM", "LAMPS", "CABLE", "PEACH", "RUINS", "RALLY", "SCHWA", - "LAMBS", "SELLS", "COOLS", "DRAFT", "CHARM", "LIMBS", "BRAKE", "GAZED", "CUBES", - "DELAY", "BEAMS", "FETCH", "RANKS", "ARRAY", "HARSH", "CAMEL", "VINES", "PICKS", - "NAVAL", "PURSE", "RIGID", "CRAWL", "TOAST", "SOILS", "SAUCE", "BASIN", "PONDS", - "TWINS", "WRIST", "FLUID", "POOLS", "BRAND", "STALK", "ROBOT", "REEDS", "HOOFS", - "BUSES", "SHEER", "GRIEF", "BLOOM", "DWELT", "MELTS", "RISEN", "FLAGS", "KNELT", - "FIBER", "ROOFS", "FREED", "ARMOR", "PILES", "AIMED", "ALGAE", "TWIGS", "LEMON", - "DITCH", "DRUNK", "RESTS", "CHILL", "SLAIN", "PANIC", "CORDS", "TUNED", "CRISP", - "LEDGE", "DIVED", "SWAMP", "CLUNG", "STOLE", "MOLDS", "YARNS", "LIVER", "GAUGE", - "BREED", "STOOL", "GULLS", "AWOKE", "GROSS", "DIARY", "RAILS", "BELLY", "TREND", - "FLASK", "STAKE", "FRIED", "DRAWS", "ACTOR", "HANDY", "BOWLS", "HASTE", "SCOPE", - "DEALS", "KNOTS", "MOONS", "ESSAY", "THUMP", "HANGS", "BLISS", "DEALT", "GAINS", - "BOMBS", "CLOWN", "PALMS", "CONES", "ROAST", "TIDAL", "BORED", "CHANT", "ACIDS", - "DOUGH", "CAMPS", "SWORE", "LOVER", "HOOKS", "MALES", "COCOA", "PUNCH", "AWARD", - "REINS", "NINTH", "NOSES", "LINKS", "DRAIN", "FILLS", "NYLON", "LUNAR", "PULSE", - "FLOWN", "ELBOW", "FATAL", "SITES", "MOTHS", "MEATS", "FOXES", "MINED", "ATTIC", - "FIERY", "MOUNT", "USAGE", "SWEAR", "SNOWY", "RUSTY", "SCARE", "TRAPS", "RELAX", - "REACT", "VALID", "ROBIN", "CEASE", "GILLS", "PRIOR", "SAFER", "POLIO", "LOYAL", - "SWELL", "SALTY", "MARSH", "VAGUE", "WEAVE", "MOUND", "SEALS", "MULES", "VIRUS", - "SCOUT", "ACUTE", "WINDY", "STOUT", "FOLDS", "SEIZE", "HILLY", "JOINS", "PLUCK", - "STACK", "LORDS", "DUNES", "BURRO", "HAWKS", "TROUT", "FEEDS", "SCARF", "HALLS", - "COALS", "TOWEL", "SOULS", "ELECT", "BUGGY", "PUMPS", "LOANS", "SPINS", "FILES", - "OXIDE", "PAINS", "PHOTO", "RIVAL", "FLATS", "SYRUP", "RODEO", "SANDS", "MOOSE", - "PINTS", "CURLY", "COMIC", "CLOAK", "ONION", "CLAMS", "SCRAP", "DIDST", "COUCH", - "CODES", "FAILS", "OUNCE", "LODGE", "GREET", "GYPSY", "UTTER", "PAVED", "ZONES", - "FOURS", "ALLEY", "TILES", "BLESS", "CREST", "ELDER", "KILLS", "YEAST", "ERECT", - "BUGLE", "MEDAL", "ROLES", "HOUND", "SNAIL", "ALTER", "ANKLE", "RELAY", "LOOPS", - "ZEROS", "BITES", "MODES", "DEBTS", "REALM", "GLOVE", "RAYON", "SWIMS", "POKED", - "STRAY", "LIFTS", "MAKER", "LUMPS", "GRAZE", "DREAD", "BARNS", "DOCKS", "MASTS", - "POURS", "WHARF", "CURSE", "PLUMP", "ROBES", "SEEKS", "CEDAR", "CURLS", "JOLLY", - "MYTHS", "CAGES", "GLOOM", "LOCKS", "PEDAL", "BEETS", "CROWS", "ANODE", "SLASH", - "CREEP", "ROWED", "CHIPS", "FISTS", "WINES", "CARES", "VALVE", "NEWER", "MOTEL", - "IVORY", "NECKS", "CLAMP", "BARGE", "BLUES", "ALIEN", "FROWN", "STRAP", "CREWS", - "SHACK", "GONNA", "SAVES", "STUMP", "FERRY", "IDOLS", "COOKS", "JUICY", "GLARE", - "CARTS", "ALLOY", "BULBS", "LAWNS", "LASTS", "FUELS", "ODDLY", "CRANE", "FILED", - "WEIRD", "SHAWL", "SLIPS", "TROOP", "BOLTS", "SUITE", "SLEEK", "QUILT", "TRAMP", - "BLAZE", "ATLAS", "ODORS", "SCRUB", "CRABS", "PROBE", "LOGIC", "ADOBE", "EXILE", - "REBEL", "GRIND", "STING", "SPINE", "CLING", "DESKS", "GROVE", "LEAPS", "PROSE", - "LOFTY", "AGONY", "SNARE", "TUSKS", "BULLS", "MOODS", "HUMID", "FINER", "DIMLY", - "PLANK", "CHINA", "PINES", "GUILT", "SACKS", "BRACE", "QUOTE", "LATHE", "GAILY", - "FONTS", "SCALP", "ADOPT", "FOGGY", "FERNS", "GRAMS", "CLUMP", "PERCH", "TUMOR", - "TEENS", "CRANK", "FABLE", "HEDGE", "GENES", "SOBER", "BOAST", "TRACT", "CIGAR", - "UNITE", "OWING", "THIGH", "HAIKU", "SWISH", "DIKES", "WEDGE", "BOOTH", "EASED", - "FRAIL", "COUGH", "TOMBS", "DARTS", "FORTS", "CHOIR", "POUCH", "PINCH", "HAIRY", - "BUYER", "TORCH", "VIGOR", "WALTZ", "HEATS", "HERBS", "USERS", "FLINT", "CLICK", - "MADAM", "BLEAK", "BLUNT", "AIDED", "LACKS", "MASKS", "WADED", "RISKS", "NURSE", - "CHAOS", "SEWED", "CURED", "AMPLE", "LEASE", "STEAK", "SINKS", "MERIT", "BLUFF", - "BATHE", "GLEAM", "BONUS", "COLTS", "SHEAR", "GLAND", "SILKY", "SKATE", "BIRCH", - "ANVIL", "SLEDS", "GROAN", "MAIDS", "MEETS", "SPECK", "HYMNS", "HINTS", "DROWN", - "BOSOM", "SLICK", "QUEST", "COILS", "SPIED", "SNOWS", "STEAD", "SNACK", "PLOWS", - "BLOND", "TAMED", "THORN", "WAITS", "GLUED", "BANJO", "TEASE", "ARENA", "BULKY", - "CARVE", "STUNT", "WARMS", "SHADY", "RAZOR", "FOLLY", "LEAFY", "NOTCH", "FOOLS", - "OTTER", "PEARS", "FLUSH", "GENUS", "ACHED", "FIVES", "FLAPS", "SPOUT", "SMOTE", - "FUMES", "ADAPT", "CUFFS", "TASTY", "STOOP", "CLIPS", "DISKS", "SNIFF", "LANES", - "BRISK", "IMPLY", "DEMON", "SUPER", "FURRY", "RAGED", "GROWL", "TEXTS", "HARDY", - "STUNG", "TYPED", "HATES", "WISER", "TIMID", "SERUM", "BEAKS", "ROTOR", "CASTS", - "BATHS", "GLIDE", "PLOTS", "TRAIT", "RESIN", "SLUMS", "LYRIC", "PUFFS", "DECKS", - "BROOD", "MOURN", "ALOFT", "ABUSE", "WHIRL", "EDGED", "OVARY", "QUACK", "HEAPS", - "SLANG", "AWAIT", "CIVIC", "SAINT", "BEVEL", "SONAR", "AUNTS", "PACKS", "FROZE", - "TONIC", "CORPS", "SWARM", "FRANK", "REPAY", "GAUNT", "WIRED", "NIECE", "CELLO", - "NEEDY", "CHUCK", "STONY", "MEDIA", "SURGE", "HURTS", "REPEL", "HUSKY", "DATED", - "HUNTS", "MISTS", "EXERT", "DRIES", "MATES", "SWORN", "BAKER", "SPICE", "OASIS", - "BOILS", "SPURS", "DOVES", "SNEAK", "PACES", "COLON", "SIEGE", "STRUM", "DRIER", - "CACAO", "HUMUS", "BALES", "PIPED", "NASTY", "RINSE", "BOXER", "SHRUB", "AMUSE", - "TACKS", "CITED", "SLUNG", "DELTA", "LADEN", "LARVA", "RENTS", "YELLS", "SPOOL", - "SPILL", "CRUSH", "JEWEL", "SNAPS", "STAIN", "KICKS", "TYING", "SLITS", "RATED", - "EERIE", "SMASH", "PLUMS", "ZEBRA", "EARNS", "BUSHY", "SCARY", "SQUAD", "TUTOR", - "SILKS", "SLABS", "BUMPS", "EVILS", "FANGS", "SNOUT", "PERIL", "PIVOT", "YACHT", - "LOBBY", "JEANS", "GRINS", "VIOLA", "LINER", "COMET", "SCARS", "CHOPS", "RAIDS", - "EATER", "SLATE", "SKIPS", "SOLES", "MISTY", "URINE", "KNOBS", "SLEET", "HOLLY", - "PESTS", "FORKS", "GRILL", "TRAYS", "PAILS", "BORNE", "TENOR", "WARES", "CAROL", - "WOODY", "CANON", "WAKES", "KITTY", "MINER", "POLLS", "SHAKY", "NASAL", "SCORN", - "CHESS", "TAXIS", "CRATE", "SHYLY", "TULIP", "FORGE", "NYMPH", "BUDGE", "LOWLY", - "ABIDE", "DEPOT", "OASES", "ASSES", "SHEDS", "FUDGE", "PILLS", "RIVET", "THINE", - "GROOM", "LANKY", "BOOST", "BROTH", "HEAVE", "GRAVY", "BEECH", "TIMED", "QUAIL", - "INERT", "GEARS", "CHICK", "HINGE", "TRASH", "CLASH", "SIGHS", "RENEW", "BOUGH", - "DWARF", "SLOWS", "QUILL", "SHAVE", "SPORE", "SIXES", "CHUNK", "MADLY", "PACED", - "BRAID", "FUZZY", "MOTTO", "SPIES", "SLACK", "MUCUS", "MAGMA", "AWFUL", "DISCS", - "ERASE", "POSED", "ASSET", "CIDER", "TAPER", "THEFT", "CHURN", "SATIN", "SLOTS", - "TAXED", "BULLY", "SLOTH", "SHALE", "TREAD", "RAKED", "CURDS", "MANOR", "AISLE", - "BULGE", "LOINS", "STAIR", "TAPES", "LEANS", "BUNKS", "SQUAT", "TOWED", "LANCE", - "PANES", "SAKES", "HEIRS", "CASTE", "DUMMY", "PORES", "FAUNA", "CROOK", "POISE", - "EPOCH", "RISKY", "WARNS", "FLING", "BERRY", "GRAPE", "FLANK", "DRAGS", "SQUID", - "PELTS", "ICING", "IRONY", "IRONS", "BARKS", "WHOOP", "CHOKE", "DIETS", "WHIPS", - "TALLY", "DOZED", "TWINE", "KITES", "BIKES", "TICKS", "RIOTS", "ROARS", "VAULT", - "LOOMS", "SCOLD", "BLINK", "DANDY", "PUPAE", "SIEVE", "SPIKE", "DUCTS", "LENDS", - "PIZZA", "BRINK", "WIDEN", "PLUMB", "PAGAN", "FEATS", "BISON", "SOGGY", "SCOOP", - "ARGON", "NUDGE", "SKIFF", "AMBER", "SEXES", "ROUSE", "SALTS", "HITCH", "EXALT", - "LEASH", "DINED", "CHUTE", "SNORT", "GUSTS", "MELON", "CHEAT", "REEFS", "LLAMA", - "LASSO", "DEBUT", "QUOTA", "OATHS", "PRONE", "MIXES", "RAFTS", "DIVES", "STALE", - "INLET", "FLICK", "PINTO", "BROWS", "UNTIE", "BATCH", "GREED", "CHORE", "STIRS", - "BLUSH", "ONSET", "BARBS", "VOLTS", "BEIGE", "SWOOP", "PADDY", "LACED", "SHOVE", - "JERKY", "POPPY", "LEAKS", "FARES", "DODGE", "GODLY", "SQUAW", "AFFIX", "BRUTE", - "NICER", "UNDUE", "SNARL", "MERGE", "DOSES", "SHOWY", "DADDY", "ROOST", "VASES", - "SWIRL", "PETTY", "COLDS", "CURRY", "COBRA", "GENIE", "FLARE", "MESSY", "CORES", - "SOAKS", "RIPEN", "WHINE", "AMINO", "PLAID", "SPINY", "MOWED", "BATON", "PEERS", - "VOWED", "PIOUS", "SWANS", "EXITS", "AFOOT", "PLUGS", "IDIOM", "CHILI", "RITES", - "SERFS", "CLEFT", "BERTH", "GRUBS", "ANNEX", "DIZZY", "HASTY", "LATCH", "WASPS", - "MIRTH", "BARON", "PLEAD", "ALOOF", "AGING", "PIXEL", "BARED", "MUMMY", "HOTLY", - "AUGER", "BUDDY", "CHAPS", "BADGE", "STARK", "FAIRS", "GULLY", "MUMPS", "EMERY", - "FILLY", "OVENS", "DRONE", "GAUZE", "IDIOT", "FUSSY", "ANNOY", "SHANK", "GOUGE", - "BLEED", "ELVES", "ROPED", "UNFIT", "BAGGY", "MOWER", "SCANT", "GRABS", "FLEAS", - "LOUSY", "ALBUM", "SAWED", "COOKY", "MURKY", "INFER", "BURLY", "WAGED", "DINGY", - "BRINE", "KNEEL", "CREAK", "VANES", "SMOKY", "SPURT", "COMBS", "EASEL", "LACES", - "HUMPS", "RUMOR", "AROMA", "HORDE", "SWISS", "LEAPT", "OPIUM", "SLIME", "AFIRE", - "PANSY", "MARES", "SOAPS", "HUSKS", "SNIPS", "HAZEL", "LINED", "CAFES", "NAIVE", - "WRAPS", "SIZED", "PIERS", "BESET", "AGILE", "TONGS", "STEED", "FRAUD", "BOOTY", - "VALOR", "DOWNY", "WITTY", "MOSSY", "PSALM", "SCUBA", "TOURS", "POLKA", "MILKY", - "GAUDY", "SHRUG", "TUFTS", "WILDS", "LASER", "TRUSS", "HARES", "CREED", "LILAC", - "SIREN", "TARRY", "BRIBE", "SWINE", "MUTED", "FLIPS", "CURES", "SINEW", "BOXED", - "HOOPS", "GASPS", "HOODS", "NICHE", "YUCCA", "GLOWS", "SEWER", "WHACK", "FUSES", - "GOWNS", "DROOP", "BUCKS", "PANGS", "MAILS", "WHISK", "HAVEN", "CLASP", "SLING", - "STINT", "URGES", "CHAMP", "PIETY", "CHIRP", "PLEAT", "POSSE", "SUNUP", "MENUS", - "HOWLS", "QUAKE", "KNACK", "PLAZA", "FIEND", "CAKED", "BANGS", "ERUPT", "POKER", - "OLDEN", "CRAMP", "VOTER", "POSES", "MANLY", "SLUMP", "FINED", "GRIPS", "GAPED", - "PURGE", "HIKED", "MAIZE", "FLUFF", "STRUT", "SLOOP", "PROWL", "ROACH", "COCKS", - "BLAND", "DIALS", "PLUME", "SLAPS", "SOUPS", "DULLY", "WILLS", "FOAMS", "SOLOS", - "SKIER", "EAVES", "TOTEM", "FUSED", "LATEX", "VEILS", "MUSED", "MAINS", "MYRRH", - "RACKS", "GALLS", "GNATS", "BOUTS", "SISAL", "SHUTS", "HOSES", "DRYLY", "HOVER", - "GLOSS", "SEEPS", "DENIM", "PUTTY", "GUPPY", "LEAKY", "DUSKY", "FILTH", "OBOES", - "SPANS", "FOWLS", "ADORN", "GLAZE", "HAUNT", "DARES", "OBEYS", "BAKES", "ABYSS", - "SMELT", "GANGS", "ACHES", "TRAWL", "CLAPS", "UNDID", "SPICY", "HOIST", "FADES", - "VICAR", "ACORN", "PUSSY", "GRUFF", "MUSTY", "TARTS", "SNUFF", "HUNCH", "TRUCE", - "TWEED", "DRYER", "LOSER", "SHEAF", "MOLES", "LAPSE", "TAWNY", "VEXED", "AUTOS", - "WAGER", "DOMES", "SHEEN", "CLANG", "SPADE", "SOWED", "BROIL", "SLYLY", "STUDS", - "GRUNT", "DONOR", "SLUGS", "ASPEN", "HOMER", "CROAK", "TITHE", "HALTS", "AVERT", - "HAVOC", "HOGAN", "GLINT", "RUDDY", "JEEPS", "FLAKY", "LADLE", "TAUNT", "SNORE", - "FINES", "PROPS", "PRUNE", "PESOS", "RADII", "POKES", "TILED", "DAISY", "HERON", - "VILLA", "FARCE", "BINDS", "CITES", "FIXES", "JERKS", "LIVID", "WAKED", "INKED", - "BOOMS", "CHEWS", "LICKS", "HYENA", "SCOFF", "LUSTY", "SONIC", "SMITH", "USHER", - "TUCKS", "VIGIL", "MOLTS", "SECTS", "SPARS", "DUMPS", "SCALY", "WISPS", "SORES", - "MINCE", "PANDA", "FLIER", "AXLES", "PLIED", "BOOBY", "PATIO", "RABBI", "PETAL", - "POLYP", "TINTS", "GRATE", "TROLL", "TOLLS", "RELIC", "PHONY", "BLEAT", "FLAWS", - "FLAKE", "SNAGS", "APTLY", "DRAWL", "ULCER", "SOAPY", "BOSSY", "MONKS", "CRAGS", - "CAGED", "TWANG", "DINER", "TAPED", "CADET", "GRIDS", "SPAWN", "GUILE", "NOOSE", - "MORES", "GIRTH", "SLIMY", "AIDES", "SPASM", "BURRS", "ALIBI", "LYMPH", "SAUCY", - "MUGGY", "LITER", "JOKED", "GOOFY", "EXAMS", "ENACT", "STORK", "LURED", "TOXIC", - "OMENS", "NEARS", "COVET", "WRUNG", "FORUM", "VENOM", "MOODY", "ALDER", "SASSY", - "FLAIR", "GUILD", "PRAYS", "WRENS", "HAULS", "STAVE", "TILTS", "PECKS", "STOMP", - "GALES", "TEMPT", "CAPES", "MESAS", "OMITS", "TEPEE", "HARRY", "WRING", "EVOKE", - "LIMES", "CLUCK", "LUNGE", "HIGHS", "CANES", "GIDDY", "LITHE", "VERGE", "KHAKI", - "QUEUE", "LOATH", "FOYER", "OUTDO", "FARED", "DETER", "CRUMB", "ASTIR", "SPIRE", - "JUMPY", "EXTOL", "BUOYS", "STUBS", "LUCID", "THONG", "AFORE", "WHIFF", "MAXIM", - "HULLS", "CLOGS", "SLATS", "JIFFY", "ARBOR", "CINCH", "IGLOO", "GOODY", "GAZES", - "DOWEL", "CALMS", "BITCH", "SCOWL", "GULPS", "CODED", "WAVER", "MASON", "LOBES", - "EBONY", "FLAIL", "ISLES", "CLODS", "DAZED", "ADEPT", "OOZED", "SEDAN", "CLAYS", - "WARTS", "KETCH", "SKUNK", "MANES", "ADORE", "SNEER", "MANGO", "FIORD", "FLORA", - "ROOMY", "MINKS", "THAWS", "WATTS", "FREER", "EXULT", "PLUSH", "PALED", "TWAIN", - "CLINK", "SCAMP", "PAWED", "GROPE", "BRAVO", "GABLE", "STINK", "SEVER", "WANED", - "RARER", "REGAL", "WARDS", "FAWNS", "BABES", "UNIFY", "AMEND", "OAKEN", "GLADE", - "VISOR", "HEFTY", "NINES", "THROB", "PECAN", "BUTTS", "PENCE", "SILLS", "JAILS", - "FLYER", "SABER", "NOMAD", "MITER", "BEEPS", "DOMED", "GULFS", "CURBS", "HEATH", - "MOORS", "AORTA", "LARKS", "TANGY", "WRYLY", "CHEEP", "RAGES", "EVADE", "LURES", - "FREAK", "VOGUE", "TUNIC", "SLAMS", "KNITS", "DUMPY", "MANIA", "SPITS", "FIRTH", - "HIKES", "TROTS", "NOSED", "CLANK", "DOGMA", "BLOAT", "BALSA", "GRAFT", "MIDDY", - "STILE", "KEYED", "FINCH", "SPERM", "CHAFF", "WILES", "AMIGO", "COPRA", "AMISS", - "EYING", "TWIRL", "LURCH", "POPES", "CHINS", "SMOCK", "TINES", "GUISE", "GRITS", - "JUNKS", "SHOAL", "CACHE", "TAPIR", "ATOLL", "DEITY", "TOILS", "SPREE", "MOCKS", - "SCANS", "SHORN", "REVEL", "RAVEN", "HOARY", "REELS", "SCUFF", "MIMIC", "WEEDY", - "CORNY", "TRUER", "ROUGE", "EMBER", "FLOES", "TORSO", "WIPES", "EDICT", "SULKY", - "RECUR", "GROIN", "BASTE", "KINKS", "SURER", "PIGGY", "MOLDY", "FRANC", "LIARS", - "INEPT", "GUSTY", "FACET", "JETTY", "EQUIP", "LEPER", "SLINK", "SOARS", "CATER", - "DOWRY", "SIDED", "YEARN", "DECOY", "TABOO", "OVALS", "HEALS", "PLEAS", "BERET", - "SPILT", "GAYLY", "ROVER", "ENDOW", "PYGMY", "CARAT", "ABBEY", "VENTS", "WAKEN", - "CHIMP", "FUMED", "SODAS", "VINYL", "CLOUT", "WADES", "MITES", "SMIRK", "BORES", - "BUNNY", "SURLY", "FROCK", "FORAY", "PURER", "MILKS", "QUERY", "MIRED", "BLARE", - "FROTH", "GRUEL", "NAVEL", "PALER", "PUFFY", "CASKS", "GRIME", "DERBY", "MAMMA", - "GAVEL", "TEDDY", "VOMIT", "MOANS", "ALLOT", "DEFER", "WIELD", "VIPER", "LOUSE", - "ERRED", "HEWED", "ABHOR", "WREST", "WAXEN", "ADAGE", "ARDOR", "STABS", "PORED", - "RONDO", "LOPED", "FISHY", "BIBLE", "HIRES", "FOALS", "FEUDS", "JAMBS", "THUDS", - "JEERS", "KNEAD", "QUIRK", "RUGBY", "EXPEL", "GREYS", "RIGOR", "ESTER", "LYRES", - "ABACK", "GLUES", "LOTUS", "LURID", "RUNGS", "HUTCH", "THYME", "VALET", "TOMMY", - "YOKES", "EPICS", "TRILL", "PIKES", "OZONE", "CAPER", "CHIME", "FREES", "FAMED", - "LEECH", "SMITE", "NEIGH", "ERODE", "ROBED", "HOARD", "SALVE", "CONIC", "GAWKY", - "CRAZE", "JACKS", "GLOAT", "MUSHY", "RUMPS", "FETUS", "WINCE", "PINKS", "SHALT", - "TOOTS", "GLENS", "COOED", "RUSTS", "STEWS", "SHRED", "PARKA", "CHUGS", "WINKS", - "CLOTS", "SHREW", "BOOED", "FILMY", "JUROR", "DENTS", "GUMMY", "GRAYS", "HOOKY", - "BUTTE", "DOGIE", "POLED", "REAMS", "FIFES", "SPANK", "GAYER", "TEPID", "SPOOK", - "TAINT", "FLIRT", "ROGUE", "SPIKY", "OPALS", "MISER", "COCKY", "COYLY", "BALMY", - "SLOSH", "BRAWL", "APHID", "FAKED", "HYDRA", "BRAGS", "CHIDE", "YANKS", "ALLAY", - "VIDEO", "ALTOS", "EASES", "METED", "CHASM", "LONGS", "EXCEL", "TAFFY", "IMPEL", - "SAVOR", "KOALA", "QUAYS", "DAWNS", "PROXY", "CLOVE", "DUETS", "DREGS", "TARDY", - "BRIAR", "GRIMY", "ULTRA", "MEATY", "HALVE", "WAILS", "SUEDE", "MAUVE", "ENVOY", - "ARSON", "COVES", "GOOEY", "BREWS", "SOFAS", "CHUMS", "AMAZE", "ZOOMS", "ABBOT", - "HALOS", "SCOUR", "SUING", "CRIBS", "SAGAS", "ENEMA", "WORDY", "HARPS", "COUPE", - "MOLAR", "FLOPS", "WEEPS", "MINTS", "ASHEN", "FELTS", "ASKEW", "MUNCH", "MEWED", - "DIVAN", "VICES", "JUMBO", "BLOBS", "BLOTS", "SPUNK", "ACRID", "TOPAZ", "CUBED", - "CLANS", "FLEES", "SLURS", "GNAWS", "WELDS", "FORDS", "EMITS", "AGATE", "PUMAS", - "MENDS", "DARKS", "DUKES", "PLIES", "CANNY", "HOOTS", "OOZES", "LAMED", "FOULS", - "CLEFS", "NICKS", "MATED", "SKIMS", "BRUNT", "TUBER", "TINGE", "FATES", "DITTY", - "THINS", "FRETS", "EIDER", "BAYOU", "MULCH", "FASTS", "AMASS", "DAMPS", "MORNS", - "FRIAR", "PALSY", "VISTA", "CROON", "CONCH", "UDDER", "TACOS", "SKITS", "MIKES", - "QUITS", "PREEN", "ASTER", "ADDER", "ELEGY", "PULPY", "SCOWS", "BALED", "HOVEL", - "LAVAS", "CRAVE", "OPTIC", "WELTS", "BUSTS", "KNAVE", "RAZED", "SHINS", "TOTES", - "SCOOT", "DEARS", "CROCK", "MUTES", "TRIMS", "SKEIN", "DOTED", "SHUNS", "VEERS", - "FAKES", "YOKED", "WOOED", "HACKS", "SPRIG", "WANDS", "LULLS", "SEERS", "SNOBS", - "NOOKS", "PINED", "PERKY", "MOOED", "FRILL", "DINES", "BOOZE", "TRIPE", "PRONG", - "DRIPS", "ODDER", "LEVEE", "ANTIC", "SIDLE", "PITHY", "CORKS", "YELPS", "JOKER", - "FLECK", "BUFFS", "SCRAM", "TIERS", "BOGEY", "DOLED", "IRATE", "VALES", "COPED", - "HAILS", "ELUDE", "BULKS", "AIRED", "VYING", "STAGS", "STREW", "COCCI", "PACTS", - "SCABS", "SILOS", "DUSTS", "YODEL", "TERSE", "JADED", "BASER", "JIBES", "FOILS", - "SWAYS", "FORGO", "SLAYS", "PREYS", "TREKS", "QUELL", "PEEKS", "ASSAY", "LURKS", - "EJECT", "BOARS", "TRITE", "BELCH", "GNASH", "WANES", "LUTES", "WHIMS", "DOSED", - "CHEWY", "SNIPE", "UMBRA", "TEEMS", "DOZES", "KELPS", "UPPED", "BRAWN", "DOPED", - "SHUSH", "RINDS", "SLUSH", "MORON", "VOILE", "WOKEN", "FJORD", "SHEIK", "JESTS", - "KAYAK", "SLEWS", "TOTED", "SANER", "DRAPE", "PATTY", "RAVES", "SULFA", "GRIST", - "SKIED", "VIXEN", "CIVET", "VOUCH", "TIARA", "HOMEY", "MOPED", "RUNTS", "SERGE", - "KINKY", "RILLS", "CORNS", "BRATS", "PRIES", "AMBLE", "FRIES", "LOONS", "TSARS", - "DATUM", "MUSKY", "PIGMY", "GNOME", "RAVEL", "OVULE", "ICILY", "LIKEN", "LEMUR", - "FRAYS", "SILTS", "SIFTS", "PLODS", "RAMPS", "TRESS", "EARLS", "DUDES", "WAIVE", - "KARAT", "JOLTS", "PEONS", "BEERS", "HORNY", "PALES", "WREAK", "LAIRS", "LYNCH", - "STANK", "SWOON", "IDLER", "ABORT", "BLITZ", "ENSUE", "ATONE", "BINGO", "ROVES", - "KILTS", "SCALD", "ADIOS", "CYNIC", "DULLS", "MEMOS", "ELFIN", "DALES", "PEELS", - "PEALS", "BARES", "SINUS", "CRONE", "SABLE", "HINDS", "SHIRK", "ENROL", "WILTS", - "ROAMS", "DUPED", "CYSTS", "MITTS", "SAFES", "SPATS", "COOPS", "FILET", "KNELL", - "REFIT", "COVEY", "PUNKS", "KILNS", "FITLY", "ABATE", "TALCS", "HEEDS", "DUELS", - "WANLY", "RUFFS", "GAUSS", "LAPEL", "JAUNT", "WHELP", "CLEAT", "GAUZY", "DIRGE", - "EDITS", "WORMY", "MOATS", "SMEAR", "PRODS", "BOWEL", "FRISK", "VESTS", "BAYED", - "RASPS", "TAMES", "DELVE", "EMBED", "BEFIT", "WAFER", "CEDED", "NOVAS", "FEIGN", - "SPEWS", "LARCH", "HUFFS", "DOLES", "MAMAS", "HULKS", "PRIED", "BRIMS", "IRKED", - "ASPIC", "SWIPE", "MEALY", "SKIMP", "BLUER", "SLAKE", "DOWDY", "PENIS", "BRAYS", - "PUPAS", "EGRET", "FLUNK", "PHLOX", "GRIPE", "PEONY", "DOUSE", "BLURS", "DARNS", - "SLUNK", "LEFTS", "CHATS", "INANE", "VIALS", "STILT", "RINKS", "WOOFS", "WOWED", - "BONGS", "FROND", "INGOT", "EVICT", "SINGE", "SHYER", "FLIED", "SLOPS", "DOLTS", - "DROOL", "DELLS", "WHELK", "HIPPY", "FETED", "ETHER", "COCOS", "HIVES", "JIBED", - "MAZES", "TRIOS", "SIRUP", "SQUAB", "LATHS", "LEERS", "PASTA", "RIFTS", "LOPES", - "ALIAS", "WHIRS", "DICED", "SLAGS", "LODES", "FOXED", "IDLED", "PROWS", "PLAIT", - "MALTS", "CHAFE", "COWER", "TOYED", "CHEFS", "KEELS", "STIES", "RACER", "ETUDE", - "SUCKS", "SULKS", "MICAS", "CZARS", "COPSE", "AILED", "ABLER", "RABID", "GOLDS", - "CROUP", "SNAKY", "VISAS", "PALLS", "MOPES", "BONED", "WISPY", "RAVED", "SWAPS", - "JUNKY", "DOILY", "PAWNS", "TAMER", "POACH", "BAITS", "DAMNS", "GUMBO", "DAUNT", - "PRANK", "HUNKS", "BUXOM", "HERES", "HONKS", "STOWS", "UNBAR", "IDLES", "ROUTS", - "SAGES", "GOADS", "REMIT", "COPES", "DEIGN", "CULLS", "GIRDS", "HAVES", "LUCKS", - "STUNK", "DODOS", "SHAMS", "SNUBS", "ICONS", "USURP", "DOOMS", "HELLS", "SOLED", - "COMAS", "PAVES", "MATHS", "PERKS", "LIMPS", "WOMBS", "BLURB", "DAUBS", "COKES", - "SOURS", "STUNS", "CASED", "MUSTS", "COEDS", "COWED", "APING", "ZONED", "RUMMY", - "FETES", "SKULK", "QUAFF", "RAJAH", "DEANS", "REAPS", "GALAS", "TILLS", "ROVED", - "KUDOS", "TONED", "PARED", "SCULL", "VEXES", "PUNTS", "SNOOP", "BAILS", "DAMES", - "HAZES", "LORES", "MARTS", "VOIDS", "AMEBA", "RAKES", "ADZES", "HARMS", "REARS", - "SATYR", "SWILL", "HEXES", "COLIC", "LEEKS", "HURLS", "YOWLS", "IVIES", "PLOPS", - "MUSKS", "PAPAW", "JELLS", "BUSED", "CRUET", "BIDED", "FILCH", "ZESTS", "ROOKS", - "LAXLY", "RENDS", "LOAMS", "BASKS", "SIRES", "CARPS", "POKEY", "FLITS", "MUSES", - "BAWLS", "SHUCK", "VILER", "LISPS", "PEEPS", "SORER", "LOLLS", "PRUDE", "DIKED", - "FLOSS", "FLOGS", "SCUMS", "DOPES", "BOGIE", "PINKY", "LEAFS", "TUBAS", "SCADS", - "LOWED", "YESES", "BIKED", "QUALM", "EVENS", "CANED", "GAWKS", "WHITS", "WOOLY", - "GLUTS", "ROMPS", "BESTS", "DUNCE", "CRONY", "JOIST", "TUNAS", "BONER", "MALLS", - "PARCH", "AVERS", "CRAMS", "PARES", "DALLY", "BIGOT", "KALES", "FLAYS", "LEACH", - "GUSHY", "POOCH", "HUGER", "SLYER", "GOLFS", "MIRES", "FLUES", "LOAFS", "ARCED", - "ACNES", "NEONS", "FIEFS", "DINTS", "DAZES", "POUTS", "CORED", "YULES", "LILTS", - "BEEFS", "MUTTS", "FELLS", "COWLS", "SPUDS", "LAMES", "JAWED", "DUPES", "DEADS", - "BYLAW", "NOONS", "NIFTY", "CLUED", "VIREO", "GAPES", "METES", "CUTER", "MAIMS", - "DROLL", "CUPID", "MAULS", "SEDGE", "PAPAS", "WHEYS", "EKING", "LOOTS", "HILTS", - "MEOWS", "BEAUS", "DICES", "PEPPY", "RIPER", "FOGEY", "GISTS", "YOGAS", "GILTS", - "SKEWS", "CEDES", "ZEALS", "ALUMS", "OKAYS", "ELOPE", "GRUMP", "WAFTS", "SOOTS", - "BLIMP", "HEFTS", "MULLS", "HOSED", "CRESS", "DOFFS", "RUDER", "PIXIE", "WAIFS", - "OUSTS", "PUCKS", "BIERS", "GULCH", "SUETS", "HOBOS", "LINTS", "BRANS", "TEALS", - "GARBS", "PEWEE", "HELMS", "TURFS", "QUIPS", "WENDS", "BANES", "NAPES", "ICIER", - "SWATS", "BAGEL", "HEXED", "OGRES", "GONER", "GILDS", "PYRES", "LARDS", "BIDES", - "PAGED", "TALON", "FLOUT", "MEDIC", "VEALS", "PUTTS", "DIRKS", "DOTES", "TIPPY", - "BLURT", "PITHS", "ACING", "BARER", "WHETS", "GAITS", "WOOLS", "DUNKS", "HEROS", - "SWABS", "DIRTS", "JUTES", "HEMPS", "SURFS", "OKAPI", "CHOWS", "SHOOS", "DUSKS", - "PARRY", "DECAL", "FURLS", "CILIA", "SEARS", "NOVAE", "MURKS", "WARPS", "SLUES", - "LAMER", "SARIS", "WEANS", "PURRS", "DILLS", "TOGAS", "NEWTS", "MEANY", "BUNTS", - "RAZES", "GOONS", "WICKS", "RUSES", "VENDS", "GEODE", "DRAKE", "JUDOS", "LOFTS", - "PULPS", "LAUDS", "MUCKS", "VISES", "MOCHA", "OILED", "ROMAN", "ETHYL", "GOTTA", - "FUGUE", "SMACK", "GOURD", "BUMPY", "RADIX", "FATTY", "BORAX", "CUBIT", "CACTI", - "GAMMA", "FOCAL", "AVAIL", "PAPAL", "GOLLY", "ELITE", "VERSA", "BILLY", "ADIEU", - "ANNUM", "HOWDY", "RHINO", "NORMS", "BOBBY", "AXIOM", "SETUP", "YOLKS", "TERNS", - "MIXER", "GENRE", "KNOLL", "ABODE", "JUNTA", "GORGE", "COMBO", "ALPHA", "OVERT", - "KINDA", "SPELT", "PRICK", "NOBLY", "EPHOD", "AUDIO", "MODAL", "VELDT", "WARTY", - "FLUKE", "BONNY", "BREAM", "ROSIN", "BOLLS", "DOERS", "DOWNS", "BEADY", "MOTIF", - "HUMPH", "FELLA", "MOULD", "CREPE", "KERNS", "ALOHA", "GLYPH", "AZURE", "RISER", - "BLEST", "LOCUS", "LUMPY", "BERYL", "WANNA", "BRIER", "TUNER", "ROWDY", "MURAL", - "TIMER", "CANST", "KRILL", "QUOTH", "LEMME", "TRIAD", "TENON", "AMPLY", "DEEPS", - "PADRE", "LEANT", "PACER", "OCTAL", "DOLLY", "TRANS", "SUMAC", "FOAMY", "LOLLY", - "GIVER", "QUIPU", "CODEX", "MANNA", "UNWED", "VODKA", "FERNY", "SALON", "DUPLE", - "BORON", "REVUE", "CRIER", "ALACK", "INTER", "DILLY", "WHIST", "CULTS", "SPAKE", - "RESET", "LOESS", "DECOR", "MOVER", "VERVE", "ETHIC", "GAMUT", "LINGO", "DUNNO", - "ALIGN", "SISSY", "INCUR", "REEDY", "AVANT", "PIPER", "WAXER", "CALYX", "BASIL", - "COONS", "SEINE", "PINEY", "LEMMA", "TRAMS", "WINCH", "WHIRR", "SAITH", "IONIC", - "HEADY", "HAREM", "TUMMY", "SALLY", "SHIED", "DROSS", "FARAD", "SAVER", "TILDE", - "JINGO", "BOWER", "SERIF", "FACTO", "BELLE", "INSET", "BOGUS", "CAVED", "FORTE", - "SOOTY", "BONGO", "TOVES", "CREDO", "BASAL", "YELLA", "AGLOW", "GLEAN", "GUSTO", - "HYMEN", "ETHOS", "TERRA", "BRASH", "SCRIP", "SWASH", "ALEPH", "TINNY", "ITCHY", - "WANTA", "TRICE", "JOWLS", "GONGS", "GARDE", "BORIC", "TWILL", "SOWER", "HENRY", - "AWASH", "LIBEL", "SPURN", "SABRE", "REBUT", "PENAL", "OBESE", "SONNY", "QUIRT", - "MEBBE", "TACIT", "GREEK", "XENON", "HULLO", "PIQUE", "ROGER", "NEGRO", "HADST", - "GECKO", "BEGET", "UNCUT", "ALOES", "LOUIS", "QUINT", "CLUNK", "RAPED", "SALVO", - "DIODE", "MATEY", "HERTZ", "XYLEM", "KIOSK", "APACE", "CAWED", "PETER", "WENCH", - "COHOS", "SORTA", "GAMBA", "BYTES", "TANGO", "NUTTY", "AXIAL", "ALECK", "NATAL", - "CLOMP", "GORED", "SIREE", "BANDY", "GUNNY", "RUNIC", "WHIZZ", "RUPEE", "FATED", - "WIPER", "BARDS", "BRINY", "STAID", "HOCKS", "OCHRE", "YUMMY", "GENTS", "SOUPY", - "ROPER", "SWATH", "CAMEO", "EDGER", "SPATE", "GIMME", "EBBED", "BREVE", "THETA", - "DEEMS", "DYKES", "SERVO", "TELLY", "TABBY", "TARES", "BLOCS", "WELCH", "GHOUL", - "VITAE", "CUMIN", "DINKY", "BRONC", "TABOR", "TEENY", "COMER", "BORER", "SIRED", - "PRIVY", "MAMMY", "DEARY", "GYROS", "SPRIT", "CONGA", "QUIRE", "THUGS", "FUROR", - "BLOKE", "RUNES", "BAWDY", "CADRE", "TOXIN", "ANNUL", "EGGED", "ANION", "NODES", - "PICKY", "STEIN", "JELLO", "AUDIT", "ECHOS", "FAGOT", "LETUP", "EYRIE", "FOUNT", - "CAPED", "AXONS", "AMUCK", "BANAL", "RILED", "PETIT", "UMBER", "MILER", "FIBRE", - "AGAVE", "BATED", "BILGE", "VITRO", "FEINT", "PUDGY", "MATER", "MANIC", "UMPED", - "PESKY", "STREP", "SLURP", "PYLON", "PUREE", "CARET", "TEMPS", "NEWEL", "YAWNS", - "SEEDY", "TREED", "COUPS", "RANGY", "BRADS", "MANGY", "LONER", "CIRCA", "TIBIA", - "AFOUL", "MOMMY", "TITER", "CARNE", "KOOKY", "MOTES", "AMITY", "SUAVE", "HIPPO", - "CURVY", "SAMBA", "NEWSY", "ANISE", "IMAMS", "TULLE", "AWAYS", "LIVEN", "HALLO", - "WALES", "OPTED", "CANTO", "IDYLL", "BODES", "CURIO", "WRACK", "HIKER", "CHIVE", - "YOKEL", "DOTTY", "DEMUR", "CUSPS", "SPECS", "QUADS", "LAITY", "TONER", "DECRY", - "WRITS", "SAUTE", "CLACK", "AUGHT", "LOGOS", "TIPSY", "NATTY", "DUCAL", "BIDET", - "BULGY", "METRE", "LUSTS", "UNARY", "GOETH", "BALER", "SITED", "SHIES", "HASPS", - "BRUNG", "HOLED", "SWANK", "LOOKY", "MELEE", "HUFFY", "LOAMY", "PIMPS", "TITAN", - "BINGE", "SHUNT", "FEMUR", "LIBRA", "SEDER", "HONED", "ANNAS", "COYPU", "SHIMS", - "ZOWIE", "JIHAD", "SAVVY", "NADIR", "BASSO", "MONIC", "MANED", "MOUSY", "OMEGA", - "LAVER", "PRIMA", "PICAS", "FOLIO", "MECCA", "REALS", "TROTH", "TESTY", "BALKY", - "CRIMP", "CHINK", "ABETS", "SPLAT", "ABACI", "VAUNT", "CUTIE", "PASTY", "MORAY", - "LEVIS", "RATTY", "ISLET", "JOUST", "MOTET", "VIRAL", "NUKES", "GRADS", "COMFY", - "VOILA", "WOOZY", "BLUED", "WHOMP", "SWARD", "METRO", "SKEET", "CHINE", "AERIE", - "BOWIE", "TUBBY", "EMIRS", "COATI", "UNZIP", "SLOBS", "TRIKE", "FUNKY", "DUCAT", - "DEWEY", "SKOAL", "WADIS", "OOMPH", "TAKER", "MINIM", "GETUP", "STOIC", "SYNOD", - "RUNTY", "FLYBY", "BRAZE", "INLAY", "VENUE", "LOUTS", "PEATY", "ORLON", "HUMPY", - "RADON", "BEAUT", "RASPY", "UNFED", "CRICK", "NAPPY", "VIZOR", "YIPES", "REBUS", - "DIVOT", "KIWIS", "VETCH", "SQUIB", "SITAR", "KIDDO", "DYERS", "COTTA", "MATZO", - "LAGER", "ZEBUS", "CRASS", "DACHA", "KNEED", "DICTA", "FAKIR", "KNURL", "RUNNY", - "UNPIN", "JULEP", "GLOBS", "NUDES", "SUSHI", "TACKY", "STOKE", "KAPUT", "BUTCH", - "HULAS", "CROFT", "ACHOO", "GENII", "NODAL", "OUTGO", "SPIEL", "VIOLS", "FETID", - "CAGEY", "FUDGY", "EPOXY", "LEGGY", "HANKY", "LAPIS", "FELON", "BEEFY", "COOTS", - "MELBA", "CADDY", "SEGUE", "BETEL", "FRIZZ", "DREAR", "KOOKS", "TURBO", "HOAGY", - "MOULT", "HELIX", "ZONAL", "ARIAS", "NOSEY", "PAEAN", "LACEY", "BANNS", "SWAIN", - "FRYER", "RETCH", "TENET", "GIGAS", "WHINY", "OGLED", "RUMEN", "BEGOT", "CRUSE", - "ABUTS", "RIVEN", "BALKS", "SINES", "SIGMA", "ABASE", "ENNUI", "GORES", "UNSET", - "AUGUR", "SATED", "ODIUM", "LATIN", "DINGS", "MOIRE", "SCION", "HENNA", "KRAUT", - "DICKS", "LIFER", "PRIGS", "BEBOP", "GAGES", "GAZER", "FANNY", "GIBES", "AURAL", - "TEMPI", "HOOCH", "RAPES", "SNUCK", "HARTS", "TECHS", "EMEND", "NINNY", "GUAVA", - "SCARP", "LIEGE", "TUFTY", "SEPIA", "TOMES", "CAROB", "EMCEE", "PRAMS", "POSER", - "VERSO", "HUBBA", "JOULE", "BAIZE", "BLIPS", "SCRIM", "CUBBY", "CLAVE", "WINOS", - "REARM", "LIENS", "LUMEN", "CHUMP", "NANNY", "TRUMP", "FICHU", "CHOMP", "HOMOS", - "PURTY", "MASER", "WOOSH", "PATSY", "SHILL", "RUSKS", "AVAST", "SWAMI", "BODED", - "AHHHH", "LOBED", "NATCH", "SHISH", "TANSY", "SNOOT", "PAYER", "ALTHO", "SAPPY", - "LAXER", "HUBBY", "AEGIS", "RILES", "DITTO", "JAZZY", "DINGO", "QUASI", "SEPTA", - "PEAKY", "LORRY", "HEERD", "BITTY", "PAYEE", "SEAMY", "APSES", "IMBUE", "BELIE", - "CHARY", "SPOOF", "PHYLA", "CLIME", "BABEL", "WACKY", "SUMPS", "SKIDS", "KHANS", - "CRYPT", "INURE", "NONCE", "OUTEN", "FAIRE", "HOOEY", "ANOLE", "KAZOO", "CALVE", - "LIMBO", "ARGOT", "DUCKY", "FAKER", "VIBES", "GASSY", "UNLIT", "NERVY", "FEMME", - "BITER", "FICHE", "BOORS", "GAFFE", "SAXES", "RECAP", "SYNCH", "FACIE", "DICEY", - "OUIJA", "HEWER", "LEGIT", "GURUS", "EDIFY", "TWEAK", "CARON", "TYPOS", "RERUN", - "POLLY", "SURDS", "HAMZA", "NULLS", "HATER", "LEFTY", "MOGUL", "MAFIA", "DEBUG", - "PATES", "BLABS", "SPLAY", "TALUS", "PORNO", "MOOLA", "NIXED", "KILOS", "SNIDE", - "HORSY", "GESSO", "JAGGY", "TROVE", "NIXES", "CREEL", "PATER", "IOTAS", "CADGE", - "SKYED", "HOKUM", "FURZE", "ANKHS", "CURIE", "NUTSY", "HILUM", "REMIX", "ANGST", - "BURLS", "JIMMY", "VEINY", "TRYST", "CODON", "BEFOG", "GAMED", "FLUME", "AXMAN", - "DOOZY", "LUBES", "RHEAS", "BOZOS", "BUTYL", "KELLY", "MYNAH", "JOCKS", "DONUT", - "AVIAN", "WURST", "CHOCK", "QUASH", "QUALS", "HAYED", "BOMBE", "CUSHY", "SPACY", - "PUKED", "LEERY", "THEWS", "PRINK", "AMENS", "TESLA", "INTRO", "FIVER", "FRUMP", - "CAPOS", "OPINE", "CODER", "NAMER", "JOWLY", "PUKES", "HALED", "CHARD", "DUFFS", - "BRUIN", "REUSE", "WHANG", "TOONS", "FRATS", "SILTY", "TELEX", "CUTUP", "NISEI", - "NEATO", "DECAF", "SOFTY", "BIMBO", "ADLIB", "LOONY", "SHOED", "AGUES", "PEEVE", - "NOWAY", "GAMEY", "SARGE", "RERAN", "EPACT", "POTTY", "CONED", "UPEND", "NARCO", - "IKATS", "WHORL", "JINKS", "TIZZY", "WEEPY", "POSIT", "MARGE", "VEGAN", "CLOPS", - "NUMBS", "REEKS", "RUBES", "ROWER", "BIPED", "TIFFS", "HOCUS", "HAMMY", "BUNCO", - "FIXIT", "TYKES", "CHAWS", "YUCKY", "HOKEY", "RESEW", "MAVEN", "ADMAN", "SCUZZ", - "SLOGS", "SOUSE", "NACHO", "MIMED", "MELDS", "BOFFO", "DEBIT", "PINUP", "VAGUS", - "GULAG", "RANDY", "BOSUN", "EDUCE", "FAXES", "AURAS", "PESTO", "ANTSY", "BETAS", - "FIZZY", "DORKY", "SNITS", "MOXIE", "THANE", "MYLAR", "NOBBY", "GAMIN", "GOUTY", - "ESSES", "GOYIM", "PANED", "DRUID", "JADES", "REHAB", "GOFER", "TZARS", "OCTET", - "HOMED", "SOCKO", "DORKS", "EARED", "ANTED", "ELIDE", "FAZES", "OXBOW", "DOWSE", - "SITUS", "MACAW", "SCONE", "DRILY", "HYPER", "SALSA", "MOOCH", "GATED", "UNJAM", - "LIPID", "MITRE", "VENAL", "KNISH", "RITZY", "DIVAS", "TORUS", "MANGE", "DIMER", - "RECUT", "MESON", "WINED", "FENDS", "PHAGE", "FIATS", "CAULK", "CAVIL", "PANTY", - "ROANS", "BILKS", "HONES", "BOTCH", "ESTOP", "SULLY", "SOOTH", "GELDS", "AHOLD", - "RAPER", "PAGER", "FIXER", "INFIX", "HICKS", "TUXES", "PLEBE", "TWITS", "ABASH", - "TWIXT", "WACKO", "PRIMP", "NABLA", "GIRTS", "MIFFS", "EMOTE", "XEROX", "REBID", - "SHAHS", "RUTTY", "GROUT", "GRIFT", "DEIFY", "BIDDY", "KOPEK", "SEMIS", "BRIES", - "ACMES", "PITON", "HUSSY", "TORTS", "DISCO", "WHORE", "BOOZY", "GIBED", "VAMPS", - "AMOUR", "SOPPY", "GONZO", "DURST", "WADER", "TUTUS", "PERMS", "CATTY", "GLITZ", - "BRIGS", "NERDS", "BARMY", "GIZMO", "OWLET", "SAYER", "MOLLS", "SHARD", "WHOPS", - "COMPS", "CORER", "COLAS", "MATTE", "DROID", "PLOYS", "VAPID", "CAIRN", "DEISM", - "MIXUP", "YIKES", "PROSY", "RAKER", "FLUBS", "WHISH", "REIFY", "CRAPS", "SHAGS", - "CLONE", "HAZED", "MACHO", "RECTO", "REFIX", "DRAMS", "BIKER", "AQUAS", "PORKY", - "DOYEN", "EXUDE", "GOOFS", "DIVVY", "NOELS", "JIVED", "HULKY", "CAGER", "HARPY", - "OLDIE", "VIVAS", "ADMIX", "CODAS", "ZILCH", "DEIST", "ORCAS", "RETRO", "PILAF", - "PARSE", "RANTS", "ZINGY", "TODDY", "CHIFF", "MICRO", "VEEPS", "GIRLY", "NEXUS", - "DEMOS", "BIBBS", "ANTES", "LULUS", "GNARL", "ZIPPY", "IVIED", "EPEES", "WIMPS", - "TROMP", "GRAIL", "YOYOS", "POUFS", "HALES", "ROUST", "CABAL", "RAWER", "PAMPA", - "MOSEY", "KEFIR", "BURGS", "UNMET", "CUSPY", "BOOBS", "BOONS", "HYPES", "DYNES", - "NARDS", "LANAI", "YOGIS", "SEPAL", "QUARK", "TOKED", "PRATE", "AYINS", "HAWED", - "SWIGS", "VITAS", "TOKER", "DOPER", "BOSSA", "LINTY", "FOIST", "MONDO", "STASH", - "KAYOS", "TWERP", "ZESTY", "CAPON", "WIMPY", "REWED", "FUNGO", "TAROT", "FROSH", - "KABOB", "PINKO", "REDID", "MIMEO", "HEIST", "TARPS", "LAMAS", "SUTRA", "DINAR", - "WHAMS", "BUSTY", "SPAYS", "MAMBO", "NABOB", "PREPS", "ODOUR", "CABBY", "CONKS", - "SLUFF", "DADOS", "HOURI", "SWART", "BALMS", "GUTSY", "FAXED", "EGADS", "PUSHY", - "RETRY", "AGORA", "DRUBS", "DAFFY", "CHITS", "MUFTI", "KARMA", "LOTTO", "TOFFS", - "BURPS", "DEUCE", "ZINGS", "KAPPA", "CLADS", "DOGGY", "DUPER", "SCAMS", "OGLER", - "MIMES", "THROE", "ZETAS", "WALED", "PROMO", "BLATS", "MUFFS", "OINKS", "VIAND", - "COSET", "FINKS", "FADDY", "MINIS", "SNAFU", "SAUNA", "USURY", "MUXES", "CRAWS", - "STATS", "CONDO", "COXES", "LOOPY", "DORMS", "ASCOT", "DIPPY", "EXECS", "DOPEY", - "ENVOI", "UMPTY", "GISMO", "FAZED", "STROP", "JIVES", "SLIMS", "BATIK", "PINGS", - "SONLY", "LEGGO", "PEKOE", "PRAWN", "LUAUS", "CAMPY", "OODLE", "PREXY", "PROMS", - "TOUTS", "OGLES", "TWEET", "TOADY", "NAIAD", "HIDER", "NUKED", "FATSO", "SLUTS", - "OBITS", "NARCS", "TYROS", "DELIS", "WOOER", "HYPED", "POSET", "BYWAY", "TEXAS", - "SCROD", "AVOWS", "FUTON", "TORTE", "TUPLE", "CAROM", "KEBAB", "TAMPS", "JILTS", - "DUALS", "ARTSY", "REPRO", "MODEM", "TOPED", "PSYCH", "SICKO", "KLUTZ", "TARNS", - "COXED", "DRAYS", "CLOYS", "ANDED", "PIKER", "AIMER", "SURAS", "LIMOS", "FLACK", - "HAPAX", "DUTCH", "MUCKY", "SHIRE", "KLIEG", "STAPH", "LAYUP", "TOKES", "AXING", - "TOPER", "DUVET", "COWRY", "PROFS", "BLAHS", "ADDLE", "SUDSY", "BATTY", "COIFS", - "SUETY", "GABBY", "HAFTA", "PITAS", "GOUDA", "DEICE", "TAUPE", "TOPES", "DUCHY", - "NITRO", "CARNY", "LIMEY", "ORALS", "HIRER", "TAXER", "ROILS", "RUBLE", "ELATE", - "DOLOR", "WRYER", "SNOTS", "QUAIS", "COKED", "GIMEL", "GORSE", "MINAS", "GOEST", - "AGAPE", "MANTA", "JINGS", "ILIAC", "ADMEN", "OFFEN", "CILLS", "OFFAL", "LOTTA", - "BOLAS", "THWAP", "ALWAY", "BOGGY", "DONNA", "LOCOS", "BELAY", "GLUEY", "BITSY", - "MIMSY", "HILAR", "OUTTA", "VROOM", "FETAL", "RATHS", "RENAL", "DYADS", "CROCS", - "VIRES", "CULPA", "KIVAS", "FEIST", "TEATS", "THATS", "YAWLS", "WHENS", "ABACA", - "OHHHH", "APHIS", "FUSTY", "ECLAT", "PERDU", "MAYST", "EXEAT", "MOLLY", "SUPRA", - "WETLY", "PLASM", "BUFFA", "SEMEN", "PUKKA", "TAGUA", "PARAS", "STOAT", "SECCO", - "CARTE", "HAUTE", "MOLAL", "SHADS", "FORMA", "OVOID", "PIONS", "MODUS", "BUENO", - "RHEUM", "SCURF", "PARER", "EPHAH", "DOEST", "SPRUE", "FLAMS", "MOLTO", "DIETH", - "CHOOS", "MIKED", "BRONX", "GOOPY", "BALLY", "PLUMY", "MOONY", "MORTS", "YOURN", - "BIPOD", "SPUME", "ALGAL", "AMBIT", "MUCHO", "SPUED", "DOZER", "HARUM", "GROAT", - "SKINT", "LAUDE", "THRUM", "PAPPY", "ONCET", "RIMED", "GIGUE", "LIMED", "PLEIN", - "REDLY", "HUMPF", "LITES", "SEEST", "GREBE", "ABSIT", "THANX", "PSHAW", "YAWPS", - "PLATS", "PAYED", "AREAL", "TILTH", "YOUSE", "GWINE", "THEES", "WATSA", "LENTO", - "SPITZ", "YAWED", "GIPSY", "SPRAT", "CORNU", "AMAHS", "BLOWY", "WAHOO", "LUBRA", - "MECUM", "WHOOO", "COQUI", "SABRA", "EDEMA", "MRADS", "DICOT", "ASTRO", "KITED", - "OUZEL", "DIDOS", "GRATA", "BONNE", "AXMEN", "KLUNK", "SUMMA", "LAVES", "PURLS", - "YAWNY", "TEARY", "MASSE", "LARGO", "BAZAR", "PSSST", "SYLPH", "LULAB", "TOQUE", - "FUGIT", "PLUNK", "ORTHO", "LUCRE", "COOCH", "WHIPT", "FOLKY", "TYRES", "WHEEE", - "CORKY", "INJUN", "SOLON", "DIDOT", "KERFS", "RAYED", "WASSA", "CHILE", "BEGAT", - "NIPPY", "LITRE", "MAGNA", "REBOX", "HYDRO", "MILCH", "BRENT", "GYVES", "LAZED", - "FEUED", "MAVIS", "INAPT", "BAULK", "CASUS", "SCRUM", "WISED", "FOSSA", "DOWER", - "KYRIE", "BHOYS", "SCUSE", "FEUAR", "OHMIC", "JUSTE", "UKASE", "BEAUX", "TUSKY", - "ORATE", "MUSTA", "LARDY", "INTRA", "QUIFF", "EPSOM", "NEATH", "OCHER", "TARED", - "HOMME", "MEZZO", "CORMS", "PSOAS", "BEAKY", "TERRY", "INFRA", "SPIVS", "TUANS", - "BELLI", "BERGS", "ANIMA", "WEIRS", "MAHUA", "SCOPS", "MANSE", "TITRE", "CURIA", - "KEBOB", "CYCAD", "TALKY", "FUCKS", "TAPIS", "AMIDE", "DOLCE", "SLOES", "JAKES", - "RUSSE", "BLASH", "TUTTI", "PRUTA", "PANGA", "BLEBS", "TENCH", "SWARF", "HEREM", - "MISSY", "MERSE", "PAWKY", "LIMEN", "VIVRE", "CHERT", "UNSEE", "TIROS", "BRACK", - "FOOTS", "WELSH", "FOSSE", "KNOPS", "ILEUM", "NOIRE", "FIRMA", "PODGY", "LAIRD", - "THUNK", "SHUTE", "ROWAN", "SHOJI", "POESY", "UNCAP", "FAMES", "GLEES", "COSTA", - "TURPS", "FORES", "SOLUM", "IMAGO", "BYRES", "FONDU", "CONEY", "POLIS", "DICTU", - "KRAAL", "SHERD", "MUMBO", "WROTH", "CHARS", "UNBOX", "VACUO", "SLUED", "WEEST", - "HADES", "WILED", "SYNCS", "MUSER", "EXCON", "HOARS", "SIBYL", "PASSE", "JOEYS", - "LOTSA", "LEPTA", "SHAYS", "BOCKS", "ENDUE", "DARER", "NONES", "ILEUS", "PLASH", - "BUSBY", "WHEAL", "BUFFO", "YOBBO", "BILES", "POXES", "ROOTY", "LICIT", "TERCE", - "BROMO", "HAYEY", "DWEEB", "IMBED", "SARAN", "BRUIT", "PUNKY", "SOFTS", "BIFFS", - "LOPPY", "AGARS", "AQUAE", "LIVRE", "BIOME", "BUNDS", "SHEWS", "DIEMS", "GINNY", - "DEGUM", "POLOS", "DESEX", "UNMAN", "DUNGY", "VITAM", "WEDGY", "GLEBE", "APERS", - "RIDGY", "ROIDS", "WIFEY", "VAPES", "WHOAS", "BUNKO", "YOLKY", "ULNAS", "REEKY", - "BODGE", "BRANT", "DAVIT", "DEQUE", "LIKER", "JENNY", "TACTS", "FULLS", "TREAP", - "LIGNE", "ACKED", "REFRY", "VOWER", "AARGH", "CHURL", "MOMMA", "GAOLS", "WHUMP", - "ARRAS", "MARLS", "TILER", "GROGS", "MEMES", "MIDIS", "TIDED", "HALER", "DUCES", - "TWINY", "POSTE", "UNRIG", "PRISE", "DRABS", "QUIDS", "FACER", "SPIER", "BARIC", - "GEOID", "REMAP", "TRIER", "GUNKS", "STENO", "STOMA", "AIRER", "OVATE", "TORAH", - "APIAN", "SMUTS", "POCKS", "YURTS", "EXURB", "DEFOG", "NUDER", "BOSKY", "NIMBI", - "MOTHY", "JOYED", "LABIA", "PARDS", "JAMMY", "BIGLY", "FAXER", "HOPPY", "NURBS", - "COTES", "DISHY", "VISED", "CELEB", "PISMO", "CASAS", "WITHS", "DODGY", "SCUDI", - "MUNGS", "MUONS", "UREAS", "IOCTL", "UNHIP", "KRONE", "SAGER", "VERST", "EXPAT", - "GRONK", "UVULA", "SHAWM", "BILGY", "BRAES", "CENTO", "WEBBY", "LIPPY", "GAMIC", - "LORDY", "MAZED", "TINGS", "SHOAT", "FAERY", "WIRER", "DIAZO", "CARER", "RATER", - "GREPS", "RENTE", "ZLOTY", "VIERS", "UNAPT", "POOPS", "FECAL", "KEPIS", "TAXON", - "EYERS", "WONTS", "SPINA", "STOAE", "YENTA", "POOEY", "BURET", "JAPAN", "BEDEW", - "HAFTS", "SELFS", "OARED", "HERBY", "PRYER", "OAKUM", "DINKS", "TITTY", "SEPOY", - "PENES", "FUSEE", "WINEY", "GIMPS", "NIHIL", "RILLE", "GIBER", "OUSEL", "UMIAK", - "CUPPY", "HAMES", "SHITS", "AZINE", "GLADS", "TACET", "BUMPH", "COYER", "HONKY", - "GAMER", "GOOKY", "WASPY", "SEDGY", "BENTS", "VARIA", "DJINN", "JUNCO", "PUBIC", - "WILCO", "LAZES", "IDYLS", "LUPUS", "RIVES", "SNOOD", "SCHMO", "SPAZZ", "FINIS", - "NOTER", "PAVAN", "ORBED", "BATES", "PIPET", "BADDY", "GOERS", "SHAKO", "STETS", - "SEBUM", "SEETH", "LOBAR", "RAVER", "AJUGA", "RICED", "VELDS", "DRIBS", "VILLE", - "DHOWS", "UNSEW", "HALMA", "KRONA", "LIMBY", "JIFFS", "TREYS", "BAUDS", "PFFFT", - "MIMER", "PLEBS", "CANER", "JIBER", "CUPPA", "WASHY", "CHUFF", "UNARM", "YUKKY", - "STYES", "WAKER", "FLAKS", "MACES", "RIMES", "GIMPY", "GUANO", "LIRAS", "KAPOK", - "SCUDS", "BWANA", "ORING", "AIDER", "PRIER", "KLUGY", "MONTE", "GOLEM", "VELAR", - "FIRER", "PIETA", "UMBEL", "CAMPO", "UNPEG", "FOVEA", "ABEAM", "BOSON", "ASKER", - "GOTHS", "VOCAB", "VINED", "TROWS", "TIKIS", "LOPER", "INDIE", "BOFFS", "SPANG", - "GRAPY", "TATER", "ICHOR", "KILTY", "LOCHS", "SUPES", "DEGAS", "FLICS", "TORSI", - "BETHS", "WEBER", "RESAW", "LAWNY", "COVEN", "MUJIK", "RELET", "THERM", "HEIGH", - "SHNOR", "TRUED", "ZAYIN", "LIEST", "BARFS", "BASSI", "QOPHS", "ROILY", "FLABS", - "PUNNY", "OKRAS", "HANKS", "DIPSO", "NERFS", "FAUNS", "CALLA", "PSEUD", "LURER", - "MAGUS", "OBEAH", "ATRIA", "TWINK", "PALMY", "POCKY", "PENDS", "RECTA", "PLONK", - "SLAWS", "KEENS", "NICAD", "PONES", "INKER", "WHEWS", "GROKS", "MOSTS", "TREWS", - "ULNAR", "GYPPY", "COCAS", "EXPOS", "ERUCT", "OILER", "VACUA", "DRECK", "DATER", - "ARUMS", "TUBAL", "VOXEL", "DIXIT", "BEERY", "ASSAI", "LADES", "ACTIN", "GHOTI", - "BUZZY", "MEADS", "GRODY", "RIBBY", "CLEWS", "CREME", "EMAIL", "PYXIE", "KULAK", - "BOCCI", "RIVED", "DUDDY", "HOPER", "LAPIN", "WONKS", "PETRI", "PHIAL", "FUGAL", - "HOLON", "BOOMY", "DUOMO", "MUSOS", "SHIER", "HAYER", "PORGY", "HIVED", "LITHO", - "FISTY", "STAGY", "LUVYA", "MARIA", "SMOGS", "ASANA", "YOGIC", "SLOMO", "FAWNY", - "AMINE", "WEFTS", "GONAD", "TWIRP", "BRAVA", "PLYER", "FERMI", "LOGES", "NITER", - "REVET", "UNATE", "GYVED", "TOTTY", "ZAPPY", "HONER", "GIROS", "DICER", "CALKS", - "LUXES", "MONAD", "CRUFT", "QUOIN", "FUMER", "AMPED", "SHLEP", "VINCA", "YAHOO", - "VULVA", "ZOOEY", "DRYAD", "NIXIE", "MOPER", "IAMBS", "LUNES", "NUDIE", "LIMNS", - "WEALS", "NOHOW", "MIAOW", "GOUTS", "MYNAS", "MAZER", "KIKES", "OXEYE", "STOUP", - "JUJUS", "DEBAR", "PUBES", "TAELS", "DEFUN", "RANDS", "BLEAR", "PAVER", "GOOSY", - "SPROG", "OLEOS", "TOFFY", "PAWER", "MACED", "CRITS", "KLUGE", "TUBED", "SAHIB", - "GANEF", "SCATS", "SPUTA", "VANED", "ACNED", "TAXOL", "PLINK", "OWETH", "TRIBS", - "RESAY", "BOULE", "THOUS", "HAPLY", "GLANS", "MAXIS", "BEZEL", "ANTIS", "PORKS", - "QUOIT", "ALKYD", "GLARY", "BEAMY", "HEXAD", "BONKS", "TECUM", "KERBS", "FILAR", - "FRIER", "REDUX", "ABUZZ", "FADER", "SHOER", "COUTH", "TRUES", "GUYED", "GOONY", - "BOOKY", "FUZES", "HURLY", "GENET", "HODAD", "CALIX", "FILER", "PAWLS", "IODIC", - "UTERO", "HENGE", "UNSAY", "LIERS", "PIING", "WEALD", "SEXED", "FOLIC", "POXED", - "CUNTS", "ANILE", "KITHS", "BECKS", "TATTY", "PLENA", "REBAR", "ABLED", "TOYER", - "ATTAR", "TEAKS", "AIOLI", "AWING", "ANENT", "FECES", "REDIP", "WISTS", "PRATS", - "MESNE", "MUTER", "SMURF", "OWEST", "BAHTS", "LOSSY", "FTPED", "HUNKY", "HOERS", - "SLIER", "SICKS", "FATLY", "DELFT", "HIVER", "HIMBO", "PENGO", "BUSKS", "LOXES", - "ZONKS", "ILIUM", "APORT", "IKONS", "MULCT", "REEVE", "CIVVY", "CANNA", "BARFY", - "KAIAK", "SCUDO", "KNOUT", "GAPER", "BHANG", "PEASE", "UTERI", "LASES", "PATEN", - "RASAE", "AXELS", "STOAS", "OMBRE", "STYLI", "GUNKY", "HAZER", "KENAF", "AHOYS", - "AMMOS", "WEENY", "URGER", "KUDZU", "PAREN", "BOLOS", "FETOR", "NITTY", "TECHY", - "LIETH", "SOMAS", "DARKY", "VILLI", "GLUON", "JANES", "CANTS", "FARTS", "SOCLE", - "JINNS", "RUING", "SLILY", "RICER", "HADDA", "WOWEE", "RICES", "NERTS", "CAULS", - "SWIVE", "LILTY", "MICKS", "ARITY", "PASHA", "FINIF", "OINKY", "GUTTY", "TETRA", - "WISES", "WOLDS", "BALDS", "PICOT", "WHATS", "SHIKI", "BUNGS", "SNARF", "LEGOS", - "DUNGS", "STOGY", "BERMS", "TANGS", "VAILS", "ROODS", "MOREL", "SWARE", "ELANS", - "LATUS", "GULES", "RAZER", "DOXIE", "BUENA", "OVERS", "GUTTA", "ZINCS", "NATES", - "KIRKS", "TIKES", "DONEE", "JERRY", "MOHEL", "CEDER", "DOGES", "UNMAP", "FOLIA", - "RAWLY", "SNARK", "TOPOI", "CEILS", "IMMIX", "YORES", "DIEST", "BUBBA", "POMPS", - "FORKY", "TURDY", "LAWZY", "POOHS", "WORTS", "GLOMS", "BEANO", "MULEY", "BARKY", - "TUNNY", "AURIC", "FUNKS", "GAFFS", "CORDY", "CURDY", "LISLE", "TORIC", "SOYAS", - "REMAN", "MUNGY", "CARPY", "APISH", "OATEN", "GAPPY", "AURAE", "BRACT", "ROOKY", - "AXLED", "BURRY", "SIZER", "PROEM", "TURFY", "IMPRO", "MASHY", "MIENS", "NONNY", - "OLIOS", "GROOK", "SATES", "AGLEY", "CORGI", "DASHY", "DOSER", "DILDO", "APSOS", - "XORED", "LAKER", "PLAYA", "SELAH", "MALTY", "DULSE", "FRIGS", "DEMIT", "WHOSO", - "RIALS", "SAWER", "BEDIM", "SNUGS", "FANIN", "AZOIC", "ICERS", "SUERS", "WIZEN", - "KOINE", "TOPOS", "SHIRR", "RIFER", "FERAL", "LADED", "LASED", "TURDS", "SWEDE", - "EASTS", "COZEN", "UNHIT", "PALLY", "AITCH", "SEDUM", "COPER", "RUCHE", "GEEKS", - "SWAGS", "ETEXT", "ALGIN", "OFFED", "NINJA", "HOLER", "DOTER", "TOTER", "BESOT", - "DICUT", "MACER", "PEENS", "PEWIT", "REDOX", "POLER", "YECCH", "FLUKY", "DOETH", - "TWATS", "CRUDS", "BEBUG", "BIDER", "STELE", "HEXER", "WESTS", "GLUER", "PILAU", - "ABAFT", "WHELM", "LACER", "INODE", "TABUS", "GATOR", "CUING", "REFLY", "LUTED", - "CUKES", "BAIRN", "BIGHT", "ARSES", "CRUMP", "LOGGY", "BLINI", "SPOOR", "TOYON", - "HARKS", "WAZOO", "FENNY", "NAVES", "KEYER", "TUFAS", "MORPH", "RAJAS", "TYPAL", - "SPIFF", "OXLIP", "UNBAN", "MUSSY", "FINNY", "RIMER", "LOGIN", "MOLAS", "CIRRI", - "HUZZA", "AGONE", "UNSEX", "UNWON", "PEATS", "TOILE", "ZOMBI", "DEWED", "NOOKY", - "ALKYL", "IXNAY", "DOVEY", "HOLEY", "CUBER", "AMYLS", "PODIA", "CHINO", "APNEA", - "PRIMS", "LYCRA", "JOHNS", "PRIMO", "FATWA", "EGGER", "HEMPY", "SNOOK", "HYING", - "FUZED", "BARMS", "CRINK", "MOOTS", "YERBA", "RHUMB", "UNARC", "DIRER", "MUNGE", - "ELAND", "NARES", "WRIER", "NODDY", "ATILT", "JUKES", "ENDER", "THENS", "UNFIX", - "DOGGO", "ZOOKS", "DIDDY", "SHMOO", "BRUSK", "PREST", "CURER", "PASTS", "KELPY", - "BOCCE", "KICKY", "TAROS", "LINGS", "DICKY", "NERDY", "ABEND", "STELA", "BIGGY", - "LAVED", "BALDY", "PUBIS", "GOOKS", "WONKY", "STIED", "HYPOS", "ASSED", "SPUMY", - "OSIER", "ROBLE", "RUMBA", "BIFFY", "PUPAL" + "ABACK", "ABAFT", "ABASE", "ABATE", "ABBEY", "ABBOT", "ABHOR", "ABIDE", "ABLER", "ABODE", + "ABOUT", "ABOVE", "ABUSE", "ABYSS", "ACHED", "ACHES", "ACIDS", "ACORN", "ACRES", "ACRID", + "ACTED", "ACTOR", "ACUTE", "ADAGE", "ADAPT", "ADDED", "ADDER", "ADEPT", "ADIEU", "ADMIT", + "ADOBE", "ADOPT", "ADORE", "ADORN", "ADULT", "AEGIS", "AEONS", "AFFIX", "AFIRE", "AFOOT", + "AFTER", "AGAIN", "AGAPE", "AGATE", "AGENT", "AGILE", "AGING", "AGLOW", "AGONY", "AGREE", + "AHEAD", "AIDED", "AIDES", "AILED", "AIMED", "AIRED", "AISLE", "ALARM", "ALBUM", "ALDER", + "ALERT", "ALIAS", "ALIBI", "ALIEN", "ALIKE", "ALIVE", "ALLAY", "ALLEY", "ALLOT", "ALLOW", + "ALLOY", "ALOES", "ALOFT", "ALONE", "ALONG", "ALOOF", "ALOUD", "ALPHA", "ALTAR", "ALTER", + "ALTOS", "AMASS", "AMAZE", "AMBER", "AMBLE", "AMEND", "AMIGO", "AMISS", "AMITY", "AMONG", + "AMOUR", "AMPLE", "AMPLY", "AMUSE", "ANGEL", "ANGER", "ANGLE", "ANGRY", "ANGST", "ANIME", + "ANKLE", "ANNEX", "ANNOY", "ANNUL", "ANTES", "ANTIC", "ANVIL", "APACE", "APART", "APING", + "APPAL", "APPLE", "APPLY", "APRON", "APTLY", "AREAS", "ARENA", "ARGUE", "ARISE", "ARMED", + "AROMA", "AROSE", "ARRAY", "ARROW", "ARSON", "ASHEN", "ASHES", "ASIDE", "ASKED", "ASKEW", + "ASPEN", "ASSAY", "ASSES", "ASSET", "ASTER", "ASTIR", "ATLAS", "ATOLL", "ATOMS", "ATONE", + "ATTAR", "ATTIC", "AUDIO", "AUDIT", "AUGER", "AUGHT", "AUGUR", "AUNTS", "AURAS", "AUTOS", + "AVAIL", "AVERS", "AVERT", "AVOID", "AVOWS", "AWAIT", "AWAKE", "AWARD", "AWARE", "AWFUL", + "AWOKE", "AXIOM", "AXLES", "AZURE", "BABEL", "BABES", "BACKS", "BACON", "BADGE", "BADLY", + "BAGGY", "BAITS", "BAIZE", "BAKED", "BAKER", "BALES", "BALLS", "BALMY", "BANAL", "BANDS", + "BANDY", "BANGS", "BANJO", "BANKS", "BANNS", "BARBS", "BARDS", "BARED", "BARGE", "BARKS", + "BARNS", "BARON", "BASAL", "BASED", "BASER", "BASES", "BASIC", "BASIL", "BASIN", "BASIS", + "BASSO", "BASTE", "BATCH", "BATED", "BATHE", "BATHS", "BATON", "BAYOU", "BEACH", "BEADS", + "BEADY", "BEAKS", "BEAMS", "BEANS", "BEARD", "BEARS", "BEAST", "BEAUX", "BEECH", "BEETS", + "BEFIT", "BEGAN", "BEGAT", "BEGET", "BEGIN", "BEGOT", "BEGUN", "BEING", "BELIE", "BELLE", + "BELLS", "BELLY", "BELOW", "BELTS", "BENCH", "BENDS", "BERGS", "BERRY", "BERTH", "BERYL", + "BESET", "BESOM", "BEVEL", "BIBLE", "BIDED", "BIDES", "BIGHT", "BIGOT", "BILGE", "BILLS", + "BILLY", "BINDS", "BIPED", "BIRCH", "BIRDS", "BIRTH", "BISON", "BITCH", "BITES", "BLACK", + "BLADE", "BLAME", "BLAND", "BLANK", "BLARE", "BLAST", "BLAZE", "BLEAK", "BLEAT", "BLEED", + "BLEND", "BLENT", "BLESS", "BLEST", "BLIND", "BLINK", "BLISS", "BLOCK", "BLOCS", "BLOND", + "BLOOD", "BLOOM", "BLOTS", "BLOWN", "BLOWS", "BLUER", "BLUES", "BLUFF", "BLUNT", "BLURT", + "BLUSH", "BOARD", "BOARS", "BOAST", "BOATS", "BODED", "BODES", "BOGGY", "BOGUS", "BOILS", + "BOLES", "BOLTS", "BOMBS", "BONDS", "BONED", "BONES", "BONNY", "BONUS", "BOOBY", "BOOKS", + "BOOMS", "BOONS", "BOORS", "BOOST", "BOOTH", "BOOTS", "BOOTY", "BOOZE", "BORAX", "BORED", + "BORES", "BORNE", "BOSOM", "BOUGH", "BOUND", "BOUTS", "BOWED", "BOWEL", "BOWER", "BOWLS", + "BOXED", "BOXER", "BOXES", "BRACE", "BRAGS", "BRAID", "BRAIN", "BRAKE", "BRAND", "BRASS", + "BRATS", "BRAVE", "BRAVO", "BRAWL", "BRAWN", "BREAD", "BREAK", "BREED", "BRIAR", "BRIBE", + "BRICK", "BRIDE", "BRIEF", "BRIER", "BRIGS", "BRIMS", "BRINE", "BRING", "BRINK", "BRINY", + "BRISK", "BROAD", "BROIL", "BROKE", "BROOD", "BROOK", "BROOM", "BROTH", "BROWN", "BROWS", + "BRUIN", "BRUNT", "BRUSH", "BRUTE", "BUCKS", "BUDGE", "BUGGY", "BUGLE", "BUILD", "BUILT", + "BULBS", "BULGE", "BULKS", "BULKY", "BULLS", "BULLY", "BUMPS", "BUNCH", "BUNKS", "BUOYS", + "BURLY", "BURNS", "BURNT", "BURRO", "BURRS", "BURST", "BUSHY", "BUSTS", "BUTTE", "BUTTS", + "BUXOM", "BUYER", "CABAL", "CABBY", "CABIN", "CABLE", "CACAO", "CACHE", "CADET", "CADRE", + "CAGED", "CAGES", "CAIRN", "CAKED", "CAKES", "CALLS", "CALMS", "CALYX", "CAMEL", "CAMEO", + "CAMPS", "CANAL", "CANDY", "CANES", "CANNY", "CANOE", "CANON", "CANTO", "CAPER", "CAPES", + "CAPON", "CARDS", "CARED", "CARES", "CARGO", "CAROL", "CARRY", "CARTS", "CARVE", "CASED", + "CASES", "CASKS", "CASTE", "CASTS", "CATCH", "CATER", "CAUSE", "CAVED", "CAVES", "CAVIL", + "CEASE", "CEDAR", "CEDED", "CELLS", "CENTS", "CHAFE", "CHAFF", "CHAIN", "CHAIR", "CHALK", + "CHAMP", "CHANT", "CHAOS", "CHAPS", "CHARM", "CHART", "CHARY", "CHASE", "CHASM", "CHATS", + "CHEAP", "CHEAT", "CHECK", "CHEEK", "CHEER", "CHEFS", "CHESS", "CHEST", "CHICK", "CHIDE", + "CHIEF", "CHILD", "CHILL", "CHIME", "CHINA", "CHINK", "CHINS", "CHIPS", "CHIRP", "CHOIR", + "CHOKE", "CHOPS", "CHORD", "CHOSE", "CHUCK", "CHUMP", "CHUMS", "CHUNK", "CHURL", "CHURN", + "CHUTE", "CIDER", "CIGAR", "CINCH", "CIRCA", "CITED", "CITES", "CIVET", "CIVIC", "CIVIL", + "CLACK", "CLAIM", "CLAMP", "CLAMS", "CLANG", "CLANK", "CLANS", "CLAPS", "CLASH", "CLASP", + "CLASS", "CLAWS", "CLEAN", "CLEAR", "CLEFS", "CLEFT", "CLERK", "CLEWS", "CLICK", "CLIFF", + "CLIMB", "CLIME", "CLING", "CLINK", "CLIPS", "CLOAK", "CLOCK", "CLODS", "CLOGS", "CLOSE", + "CLOTH", "CLOUD", "CLOUT", "CLOVE", "CLOWN", "CLUBS", "CLUCK", "CLUES", "CLUMP", "CLUNG", + "COACH", "COALS", "COAST", "COATS", "COBRA", "COCKS", "COCOA", "CODES", "COILS", "COINS", + "COLDS", "COLIC", "COLON", "COLTS", "COMBS", "COMER", "COMES", "COMET", "COMIC", "COMMA", + "CONCH", "CONES", "CONIC", "COOED", "COOKS", "COOLS", "COPRA", "COPSE", "CORAL", "CORDS", + "CORES", "CORKS", "CORNS", "CORPS", "COSTS", "COTES", "COUCH", "COUGH", "COULD", "COUNT", + "COUPE", "COUPS", "COURT", "COVER", "COVES", "COVET", "COVEY", "COWED", "COWER", "COYLY", + "COZEN", "CRABS", "CRACK", "CRAFT", "CRAGS", "CRAMP", "CRANE", "CRANK", "CRAPE", "CRASH", + "CRASS", "CRATE", "CRAVE", "CRAWL", "CRAZE", "CRAZY", "CREAK", "CREAM", "CREDO", "CREED", + "CREEK", "CREEP", "CREPE", "CREPT", "CRESS", "CREST", "CREWS", "CRIBS", "CRICK", "CRIED", + "CRIER", "CRIES", "CRIME", "CRIMP", "CRISP", "CROAK", "CROCK", "CRONE", "CRONY", "CROOK", + "CROPS", "CROSS", "CROUP", "CROWD", "CROWN", "CROWS", "CRUDE", "CRUEL", "CRUMB", "CRUSH", + "CRUST", "CRYPT", "CUBES", "CUBIC", "CUBIT", "CUFFS", "CULTS", "CURDS", "CURED", "CURES", + "CURLS", "CURLY", "CURRY", "CURSE", "CURST", "CURVE", "CYCLE", "CYNIC", "DADDY", "DAILY", + "DAIRY", "DAISY", "DALES", "DALLY", "DAMES", "DAMPS", "DANCE", "DANDY", "DARED", "DARES", + "DARTS", "DATED", "DATES", "DATUM", "DAUBS", "DAUNT", "DAWNS", "DAZED", "DEALS", "DEALT", + "DEANS", "DEARS", "DEATH", "DEBAR", "DEBIT", "DEBTS", "DEBUT", "DECAY", "DECKS", "DECOY", + "DECRY", "DEEDS", "DEEMS", "DEEPS", "DEFER", "DEIGN", "DEITY", "DELAY", "DELLS", "DELTA", + "DELVE", "DEMON", "DEMUR", "DENSE", "DENTS", "DEPOT", "DEPTH", "DERBY", "DESKS", "DETER", + "DEUCE", "DEVIL", "DIARY", "DICED", "DICES", "DICTA", "DIETS", "DIGIT", "DIKES", "DIMES", + "DIMLY", "DINED", "DINER", "DINES", "DINGY", "DIRGE", "DIRTY", "DISCS", "DISKS", "DITCH", + "DITTO", "DITTY", "DIVAN", "DIVED", "DIVER", "DIVES", "DIZZY", "DOCKS", "DODGE", "DOERS", + "DOGMA", "DOING", "DOLED", "DOLLS", "DOMED", "DOMES", "DONOR", "DOOMS", "DOORS", "DOSED", + "DOSES", "DOTED", "DOTES", "DOUBT", "DOUGH", "DOVES", "DOWDY", "DOWNS", "DOWNY", "DOWRY", + "DOZED", "DOZEN", "DRAFT", "DRAGS", "DRAIN", "DRAKE", "DRAMA", "DRAMS", "DRANK", "DRAPE", + "DRAWL", "DRAWN", "DRAWS", "DRAYS", "DREAD", "DREAM", "DREGS", "DRESS", "DRIED", "DRIER", + "DRIES", "DRIFT", "DRILL", "DRILY", "DRINK", "DRIPS", "DRIVE", "DROLL", "DRONE", "DROOP", + "DROPS", "DROSS", "DROVE", "DROWN", "DRUGS", "DRUMS", "DRUNK", "DRYLY", "DUCAL", "DUCAT", + "DUCHY", "DUCKS", "DUCTS", "DUELS", "DUETS", "DUKES", "DULLY", "DUMMY", "DUMPS", "DUMPY", + "DUNCE", "DUNES", "DUNNO", "DUPED", "DUPES", "DUSKY", "DUSTY", "DWARF", "DWELL", "DWELT", + "DYING", "DYKES", "EAGER", "EAGLE", "EARLS", "EARLY", "EARNS", "EARTH", "EASED", "EASEL", + "EASES", "EATEN", "EATER", "EAVES", "EBBED", "EBONY", "EDGED", "EDGES", "EDICT", "EDIFY", + "EERIE", "EGGED", "EIGHT", "EJECT", "ELATE", "ELBOW", "ELDER", "ELECT", "ELEGY", "ELFIN", + "ELITE", "ELOPE", "ELUDE", "ELVES", "EMAIL", "EMITS", "EMPTY", "ENACT", "ENDED", "ENDOW", + "ENEMY", "ENJOY", "ENNUI", "ENROL", "ENSUE", "ENTER", "ENTRY", "ENVOY", "EPICS", "EPOCH", + "EQUAL", "EQUIP", "ERASE", "ERECT", "ERRED", "ERROR", "ESSAY", "ETHER", "ETHIC", "EVADE", + "EVENT", "EVERY", "EVILS", "EVOKE", "EXACT", "EXALT", "EXCEL", "EXERT", "EXILE", "EXIST", + "EXITS", "EXPEL", "EXTOL", "EXTRA", "EXULT", "EYING", "EYRIE", "FABLE", "FACED", "FACES", + "FACTS", "FADED", "FADES", "FAILS", "FAINT", "FAIRS", "FAIRY", "FAITH", "FAKIR", "FALLS", + "FALSE", "FAMED", "FANCY", "FANGS", "FARCE", "FARED", "FARES", "FARMS", "FASTS", "FATAL", + "FATED", "FATES", "FATTY", "FAULT", "FAUNA", "FAUNS", "FAWNS", "FEARS", "FEAST", "FEATS", + "FEEDS", "FEELS", "FEIGN", "FEINT", "FELLS", "FELON", "FENCE", "FERAL", "FERNS", "FERRY", + "FETCH", "FETED", "FETID", "FETUS", "FEUDS", "FEVER", "FEWER", "FICHE", "FIEFS", "FIELD", + "FIEND", "FIERY", "FIFES", "FIFTH", "FIFTY", "FIGHT", "FILCH", "FILED", "FILES", "FILET", + "FILLS", "FILLY", "FILMS", "FILMY", "FILTH", "FINAL", "FINCH", "FINDS", "FINED", "FINER", + "FINES", "FINIS", "FINNY", "FIORD", "FIRED", "FIRES", "FIRMS", "FIRST", "FISHY", "FISTS", + "FITLY", "FIVES", "FIXED", "FIXER", "FIXES", "FJORD", "FLAGS", "FLAIL", "FLAIR", "FLAKE", + "FLAKY", "FLAME", "FLANK", "FLAPS", "FLARE", "FLASH", "FLASK", "FLATS", "FLAWS", "FLEAS", + "FLECK", "FLEES", "FLEET", "FLESH", "FLICK", "FLIER", "FLIES", "FLING", "FLINT", "FLIRT", + "FLITS", "FLOAT", "FLOCK", "FLOES", "FLOOD", "FLOOR", "FLORA", "FLOSS", "FLOUR", "FLOUT", + "FLOWN", "FLOWS", "FLUES", "FLUFF", "FLUID", "FLUKE", "FLUME", "FLUNG", "FLUSH", "FLUTE", + "FLYER", "FOAMS", "FOAMY", "FOCAL", "FOCUS", "FOGGY", "FOILS", "FOIST", "FOLDS", "FOLIO", + "FOLKS", "FOLLY", "FOODS", "FOOLS", "FORAY", "FORCE", "FORDS", "FORGE", "FORGO", "FORKS", + "FORMS", "FORTE", "FORTH", "FORTS", "FORTY", "FORUM", "FOUND", "FOUNT", "FOURS", "FOWLS", + "FOXES", "FOYER", "FRAIL", "FRAME", "FRANC", "FRANK", "FRAUD", "FREAK", "FREED", "FREER", + "FREES", "FRESH", "FRETS", "FRIAR", "FRIED", "FRILL", "FRISK", "FROCK", "FROGS", "FROND", + "FRONT", "FROST", "FROTH", "FROWN", "FROZE", "FRUIT", "FUDGE", "FUELS", "FUGUE", "FULLY", + "FUMED", "FUMES", "FUNDS", "FUNGI", "FUNNY", "FURRY", "FURZE", "FUSED", "FUSES", "FUSSY", + "FUZZY", "GABLE", "GAILY", "GAINS", "GALES", "GALLS", "GAMES", "GAMIN", "GAMMA", "GAMUT", + "GANGS", "GAPED", "GAPES", "GASES", "GASPS", "GATES", "GAUDY", "GAUGE", "GAUNT", "GAUZE", + "GAUZY", "GAVEL", "GAWKY", "GAYER", "GAYLY", "GAZED", "GAZER", "GAZES", "GEARS", "GEESE", + "GENIE", "GENII", "GENRE", "GENTS", "GENUS", "GERMS", "GHOST", "GIANT", "GIBES", "GIDDY", + "GIFTS", "GILDS", "GILLS", "GIMME", "GIPSY", "GIRDS", "GIRLS", "GIRTH", "GIVEN", "GIVES", + "GLADE", "GLAND", "GLARE", "GLASS", "GLAZE", "GLEAM", "GLEAN", "GLENS", "GLIDE", "GLINT", + "GLOAT", "GLOBE", "GLOOM", "GLORY", "GLOSS", "GLOVE", "GLOWS", "GLUED", "GNASH", "GNATS", + "GNAWS", "GNOME", "GOADS", "GOALS", "GOATS", "GODLY", "GOING", "GOLLY", "GONGS", "GONNA", + "GOODS", "GOODY", "GOOSE", "GORED", "GORGE", "GORSE", "GOTTA", "GOUGE", "GOURD", "GOUTY", + "GOWNS", "GRABS", "GRACE", "GRADE", "GRAFT", "GRAIN", "GRAMS", "GRAND", "GRANT", "GRAPE", + "GRAPH", "GRASP", "GRASS", "GRATE", "GRAVE", "GRAVY", "GRAZE", "GREAT", "GREED", "GREEN", + "GREET", "GREYS", "GRIEF", "GRILL", "GRIME", "GRIMY", "GRIND", "GRINS", "GRIPE", "GRIPS", + "GRIST", "GROAN", "GROIN", "GROOM", "GROPE", "GROSS", "GROUP", "GROVE", "GROWL", "GROWN", + "GROWS", "GRUBS", "GRUEL", "GRUFF", "GRUNT", "GUANO", "GUARD", "GUESS", "GUEST", "GUIDE", + "GUILD", "GUILE", "GUILT", "GUISE", "GULCH", "GULFS", "GULLS", "GULLY", "GUMMY", "GUSTO", + "GUSTS", "GUSTY", "GYPSY", "HABIT", "HACKS", "HAILS", "HAIRS", "HAIRY", "HALED", "HALLS", + "HALTS", "HALVE", "HANDS", "HANDY", "HANGS", "HAPPY", "HARDY", "HAREM", "HARES", "HARMS", + "HARPS", "HARPY", "HARRY", "HARSH", "HARTS", "HASTE", "HASTY", "HATCH", "HATED", "HATER", + "HAULS", "HAVEN", "HAVOC", "HAWKS", "HAZEL", "HEADS", "HEADY", "HEALS", "HEAPS", "HEARD", + "HEARS", "HEART", "HEATH", "HEATS", "HEAVE", "HEAVY", "HEDGE", "HEEDS", "HEELS", "HEIRS", + "HELIX", "HELLO", "HELMS", "HELPS", "HENCE", "HERBS", "HERDS", "HERON", "HEROS", "HEWED", + "HIDES", "HILLS", "HILLY", "HILTS", "HINDS", "HINGE", "HINTS", "HIRED", "HIRES", "HITCH", + "HIVES", "HOARD", "HOARY", "HOBBY", "HOIST", "HOLDS", "HOLES", "HOLLY", "HOMES", "HONEY", + "HOODS", "HOOFS", "HOOKS", "HOOPS", "HOOTS", "HOPED", "HOPES", "HORDE", "HORNS", "HORNY", + "HORSE", "HOSTS", "HOTEL", "HOTLY", "HOUND", "HOURS", "HOUSE", "HOVEL", "HOVER", "HOWLS", + "HULKS", "HULLS", "HUMAN", "HUMID", "HUMPS", "HUMUS", "HUNCH", "HUNTS", "HURLS", "HURRY", + "HURTS", "HUSKS", "HUSKY", "HUSSY", "HYDRA", "HYENA", "HYMNS", "ICILY", "ICING", "IDEAL", + "IDEAS", "IDIOM", "IDIOT", "IDLED", "IDLER", "IDOLS", "IDYLL", "IGLOO", "IMAGE", "IMBUE", + "IMPEL", "IMPLY", "INANE", "INCUR", "INDEX", "INEPT", "INERT", "INFER", "INGOT", "INLET", + "INNER", "INTER", "INURE", "IRATE", "IRKED", "IRONS", "IRONY", "ISLES", "ISLET", "ISSUE", + "ITEMS", "IVORY", "JACKS", "JADED", "JAILS", "JAUNT", "JEANS", "JEERS", "JELLY", "JERKS", + "JERKY", "JESTS", "JETTY", "JEWEL", "JIFFY", "JOINS", "JOINT", "JOKED", "JOKER", "JOKES", + "JOLLY", "JOUST", "JOYED", "JUDGE", "JUICE", "JUICY", "JUMPS", "JUNKS", "JUNTA", "JUROR", + "KARMA", "KEELS", "KEEPS", "KETCH", "KEYED", "KHAKI", "KICKS", "KILLS", "KINDA", "KINDS", + "KINGS", "KIOSK", "KITES", "KNACK", "KNAVE", "KNEAD", "KNEEL", "KNEES", "KNELL", "KNELT", + "KNIFE", "KNITS", "KNOBS", "KNOCK", "KNOLL", "KNOTS", "KNOWN", "KNOWS", "LABEL", "LACED", + "LACES", "LACKS", "LADEN", "LADLE", "LAGER", "LAIRS", "LAITY", "LAKES", "LAMBS", "LAMED", + "LAMES", "LAMPS", "LANCE", "LANDS", "LANES", "LANKY", "LAPEL", "LAPSE", "LARCH", "LARGE", + "LARGO", "LARKS", "LARVA", "LASSO", "LASTS", "LATCH", "LATER", "LATHE", "LATHS", "LAUGH", + "LAWNS", "LAYER", "LEADS", "LEAFY", "LEAKS", "LEAKY", "LEANS", "LEAPS", "LEAPT", "LEARN", + "LEASE", "LEASH", "LEAST", "LEAVE", "LEDGE", "LEECH", "LEEKS", "LEGAL", "LEMME", "LEMON", + "LENDS", "LEPER", "LEVEE", "LEVEL", "LEVER", "LIARS", "LIBEL", "LICKS", "LIEGE", "LIENS", + "LIFTS", "LIGHT", "LIKED", "LIKEN", "LIKER", "LIKES", "LILAC", "LIMBO", "LIMBS", "LIMES", + "LIMIT", "LINED", "LINEN", "LINER", "LINES", "LINGO", "LINKS", "LIONS", "LISTS", "LITHE", + "LIVED", "LIVER", "LIVES", "LIVID", "LLAMA", "LOADS", "LOAMY", "LOANS", "LOATH", "LOBBY", + "LOBES", "LOCAL", "LOCKS", "LOCUS", "LODGE", "LOFTY", "LOGES", "LOGIC", "LOGIN", "LOINS", + "LONGS", "LOOKS", "LOOMS", "LOONS", "LOOPS", "LOOSE", "LORDS", "LOSER", "LOSES", "LOTUS", + "LOUSE", "LOUSY", "LOVED", "LOVER", "LOVES", "LOWED", "LOWER", "LOWLY", "LOYAL", "LUCID", + "LUCKY", "LULLS", "LUMPS", "LUMPY", "LUNAR", "LUNCH", "LUNGE", "LUNGS", "LURCH", "LURED", + "LURES", "LURID", "LURKS", "LUSTS", "LUSTY", "LUTES", "LYING", "LYMPH", "LYNCH", "LYRIC", + "MACES", "MADAM", "MADLY", "MAGIC", "MAIDS", "MAILS", "MAINS", "MAIZE", "MAJOR", "MAKER", + "MAKES", "MALES", "MAMMA", "MANES", "MANGA", "MANGE", "MANGO", "MANGY", "MANIA", "MANLY", + "MANNA", "MANOR", "MANSE", "MAPLE", "MARCH", "MARES", "MARKS", "MARRY", "MARSH", "MARTS", + "MASKS", "MASON", "MASTS", "MATCH", "MATED", "MATES", "MAUVE", "MAXIM", "MAYBE", "MAYOR", + "MAZES", "MEALS", "MEALY", "MEANS", "MEANT", "MEATS", "MEDAL", "MEDIA", "MEETS", "MELON", + "MELTS", "MEMES", "MENDS", "MENUS", "MERCY", "MERES", "MERGE", "MERIT", "MERRY", "MESAS", + "METAL", "METED", "METER", "MEWED", "MIDST", "MIENS", "MIGHT", "MILCH", "MILES", "MILKY", + "MILLS", "MIMES", "MIMIC", "MINCE", "MINDS", "MINED", "MINER", "MINES", "MINOR", "MINTS", + "MINUS", "MIRTH", "MISER", "MISTS", "MITES", "MIXED", "MIXES", "MOANS", "MOATS", "MOCKS", + "MODEL", "MODEM", "MODES", "MOIST", "MOLAR", "MOLES", "MOMMA", "MONEY", "MONKS", "MONTH", + "MOODS", "MOODY", "MOONS", "MOORS", "MOOSE", "MOPED", "MORAL", "MORES", "MOSSY", "MOTES", + "MOTHS", "MOTIF", "MOTOR", "MOTTO", "MOUND", "MOUNT", "MOURN", "MOUSE", "MOUTH", "MOVED", + "MOVER", "MOVES", "MOVIE", "MOWED", "MOWER", "MUCUS", "MUDDY", "MULES", "MULTI", "MUMMY", + "MUMPS", "MUNCH", "MURAL", "MURKY", "MUSED", "MUSES", "MUSIC", "MUSKY", "MUSTY", "MUTED", + "MUTES", "MYRRH", "MYTHS", "NABOB", "NAILS", "NAIVE", "NAKED", "NAMED", "NAMES", "NASAL", + "NASTY", "NATAL", "NATTY", "NAVAL", "NAVEL", "NAVES", "NEARS", "NECKS", "NEEDS", "NEEDY", + "NEIGH", "NERVE", "NESTS", "NEVER", "NEWER", "NEWLY", "NICER", "NICHE", "NIECE", "NIGHT", + "NINNY", "NOBLE", "NOBLY", "NOISE", "NOISY", "NOMAD", "NONCE", "NOOKS", "NOOSE", "NORTH", + "NOSED", "NOSES", "NOTCH", "NOTED", "NOTES", "NOUNS", "NOVEL", "NUDGE", "NURSE", "NYMPH", + "OAKEN", "OAKUM", "OASES", "OASIS", "OATEN", "OATHS", "OBESE", "OBEYS", "OCCUR", "OCEAN", + "OCHRE", "ODDER", "ODDLY", "ODIUM", "OFFAL", "OFFER", "OFTEN", "OILED", "OLDEN", "OLDER", + "OMENS", "OMITS", "ONION", "ONSET", "OOZED", "OOZES", "OPALS", "OPENS", "OPERA", "OPINE", + "OPIUM", "OPTIC", "ORBIT", "ORDER", "ORGAN", "OSIER", "OTHER", "OTTER", "OUGHT", "OUNCE", + "OUTDO", "OUTER", "OVALS", "OVARY", "OVENS", "OVERT", "OWING", "OWNED", "OWNER", "OXIDE", + "OZONE", "PACES", "PACKS", "PADDY", "PADRE", "PAEAN", "PAGAN", "PAGES", "PAILS", "PAINS", + "PAINT", "PAIRS", "PALED", "PALER", "PALES", "PALMS", "PALMY", "PALSY", "PANEL", "PANES", + "PANGS", "PANIC", "PANSY", "PANTS", "PAPAL", "PAPAS", "PAPER", "PARED", "PARKA", "PARKS", + "PARRY", "PARSE", "PARTS", "PARTY", "PASHA", "PASTE", "PASTY", "PATCH", "PATES", "PATHS", + "PATIO", "PAUSE", "PAVED", "PAWED", "PAWNS", "PAYED", "PAYER", "PEACE", "PEACH", "PEAKS", + "PEALS", "PEARL", "PEARS", "PEASE", "PECKS", "PEDAL", "PEEPS", "PEERS", "PELTS", "PENAL", + "PENCE", "PENIS", "PENNY", "PEONS", "PERCH", "PERIL", "PESKY", "PESOS", "PESTS", "PETAL", + "PETTY", "PHASE", "PHIAL", "PHONE", "PHOTO", "PIANO", "PICKS", "PIECE", "PIERS", "PIETY", + "PIGMY", "PIKES", "PILED", "PILES", "PILLS", "PILOT", "PINCH", "PINED", "PINES", "PINKS", + "PINTO", "PINTS", "PIOUS", "PIPED", "PIPER", "PIPES", "PIQUE", "PITCH", "PITHY", "PIVOT", + "PLACE", "PLAID", "PLAIN", "PLAIT", "PLANE", "PLANK", "PLANS", "PLANT", "PLATE", "PLAYS", + "PLAZA", "PLEAD", "PLEAS", "PLIED", "PLIES", "PLOTS", "PLUCK", "PLUGS", "PLUMB", "PLUME", + "PLUMS", "PLUSH", "PODIA", "POEMS", "POESY", "POETS", "POINT", "POISE", "POKED", "POKER", + "POKES", "POLAR", "POLES", "POLKA", "POLLS", "PONDS", "POOLS", "POPES", "POPPA", "POPPY", + "PORCH", "PORED", "PORES", "PORTS", "POSED", "POSER", "POSES", "POSSE", "POSTS", "POUCH", + "POUND", "POURS", "POWER", "PRANK", "PRATE", "PRAYS", "PRESS", "PREYS", "PRICE", "PRICK", + "PRIDE", "PRIED", "PRIES", "PRIME", "PRINT", "PRIOR", "PRISM", "PRIVY", "PRIZE", "PROBE", + "PRONE", "PROOF", "PROPS", "PROSE", "PROSY", "PROUD", "PROVE", "PROWL", "PROWS", "PROXY", + "PRUDE", "PRUNE", "PSALM", "PSHAW", "PUDGY", "PUFFS", "PUFFY", "PULLS", "PULPY", "PULSE", + "PUMPS", "PUNCH", "PUPIL", "PUPPY", "PUREE", "PURER", "PURGE", "PURSE", "PUSSY", "PUTTY", + "QUACK", "QUAFF", "QUAIL", "QUAKE", "QUALM", "QUART", "QUASI", "QUAYS", "QUEEN", "QUEER", + "QUELL", "QUERY", "QUEST", "QUEUE", "QUICK", "QUIET", "QUILL", "QUILT", "QUIPS", "QUIRE", + "QUITE", "QUITS", "QUOTA", "QUOTE", "QUOTH", "RABBI", "RABID", "RACED", "RACER", "RACES", + "RACKS", "RADII", "RADIO", "RAFTS", "RAGED", "RAGES", "RAIDS", "RAILS", "RAINS", "RAINY", + "RAISE", "RAJAH", "RAKED", "RAKES", "RALLY", "RANCH", "RANGE", "RANKS", "RAPID", "RARER", + "RARES", "RATED", "RATES", "RATIO", "RAVED", "RAVEN", "RAVES", "RAYON", "RAZED", "RAZOR", + "REACH", "REACT", "READS", "READY", "REALM", "REALS", "REAMS", "REAPS", "REARS", "REBEL", + "REBUS", "REBUT", "RECUR", "REEDS", "REEDY", "REEFS", "REEKS", "REELS", "REEVE", "REFER", + "REFIT", "REGAL", "REIGN", "REINS", "RELAX", "RELAY", "RELIC", "REMIT", "RENDS", "RENEW", + "RENTS", "REPAY", "REPEL", "REPLY", "RESET", "RESIN", "RESTS", "REVEL", "REVUE", "RHEUM", + "RHYME", "RICKS", "RIDER", "RIDES", "RIDGE", "RIFLE", "RIFTS", "RIGHT", "RIGID", "RILED", + "RILLS", "RIMES", "RINGS", "RINSE", "RIOTS", "RIPEN", "RIPER", "RISEN", "RISER", "RISES", + "RISKS", "RISKY", "RITES", "RIVAL", "RIVEN", "RIVER", "RIVET", "ROADS", "ROAMS", "ROARS", + "ROAST", "ROBED", "ROBES", "ROBIN", "ROCKS", "ROCKY", "ROGUE", "ROLES", "ROLLS", "ROMAN", + "ROOFS", "ROOKS", "ROOMS", "ROOMY", "ROOST", "ROOTS", "ROPED", "ROPES", "ROSES", "ROSIN", + "ROUGE", "ROUGH", "ROUND", "ROUSE", "ROUTE", "ROUTS", "ROVED", "ROVER", "ROWDY", "ROWED", + "ROYAL", "RUDER", "RUFFS", "RUINS", "RULED", "RULER", "RULES", "RUNES", "RUNGS", "RUPEE", + "RURAL", "RUSES", "SABLE", "SABRE", "SACKS", "SADLY", "SAFER", "SAGAS", "SAGES", "SAHIB", + "SAILS", "SAINT", "SAITH", "SALAD", "SALES", "SALLY", "SALON", "SALSA", "SALTS", "SALTY", + "SALVE", "SALVO", "SANDS", "SANDY", "SANER", "SATED", "SATIN", "SATYR", "SAUCE", "SAUCY", + "SAVED", "SAVES", "SAWED", "SCALD", "SCALE", "SCALP", "SCALY", "SCAMP", "SCANS", "SCANT", + "SCARE", "SCARF", "SCARS", "SCENE", "SCENT", "SCION", "SCOFF", "SCOLD", "SCOOP", "SCOPE", + "SCORE", "SCORN", "SCOUR", "SCOUT", "SCOWL", "SCRAP", "SCREW", "SCRIP", "SCRUB", "SCULL", + "SEALS", "SEAMS", "SEAMY", "SEATS", "SECTS", "SEDAN", "SEDGE", "SEEDS", "SEEDY", "SEEKS", + "SEEMS", "SEERS", "SEIZE", "SELLS", "SEMEN", "SENDS", "SENSE", "SERFS", "SERGE", "SERUM", + "SERVE", "SEVEN", "SEVER", "SEWED", "SEWER", "SEXES", "SHACK", "SHADE", "SHADY", "SHAFT", + "SHAKE", "SHAKY", "SHALE", "SHALL", "SHALT", "SHAME", "SHAMS", "SHANK", "SHAPE", "SHARE", + "SHARK", "SHARP", "SHAVE", "SHAWL", "SHEAF", "SHEAR", "SHEDS", "SHEEN", "SHEEP", "SHEER", + "SHEET", "SHEIK", "SHELF", "SHELL", "SHIED", "SHIFT", "SHINE", "SHINS", "SHINY", "SHIPS", + "SHIRE", "SHIRK", "SHIRT", "SHOAL", "SHOCK", "SHOES", "SHONE", "SHOOK", "SHOON", "SHOOT", + "SHOPS", "SHORE", "SHORN", "SHORT", "SHOTS", "SHOUT", "SHOVE", "SHOWN", "SHOWS", "SHOWY", + "SHRED", "SHREW", "SHRUB", "SHRUG", "SHUNS", "SHUTS", "SHYLY", "SIBYL", "SIDED", "SIDES", + "SIEGE", "SIEVE", "SIGHS", "SIGHT", "SIGMA", "SIGNS", "SILKS", "SILKY", "SILLS", "SILLY", + "SINCE", "SINEW", "SINGE", "SINGS", "SINKS", "SIREN", "SIRES", "SITES", "SIXES", "SIXTH", + "SIXTY", "SIZED", "SIZES", "SKATE", "SKEIN", "SKIES", "SKIFF", "SKILL", "SKIMS", "SKINS", + "SKIPS", "SKIRT", "SKULK", "SKULL", "SKUNK", "SLABS", "SLACK", "SLAGS", "SLAIN", "SLAKE", + "SLANG", "SLANT", "SLAPS", "SLASH", "SLATE", "SLATS", "SLAVE", "SLAYS", "SLEDS", "SLEEK", + "SLEEP", "SLEET", "SLEPT", "SLICE", "SLICK", "SLIDE", "SLILY", "SLIME", "SLIMY", "SLING", + "SLINK", "SLIPS", "SLITS", "SLOOP", "SLOPE", "SLOPS", "SLOTH", "SLUGS", "SLUMP", "SLUMS", + "SLUNG", "SLUNK", "SLUSH", "SLYLY", "SMACK", "SMALL", "SMART", "SMASH", "SMEAR", "SMELL", + "SMELT", "SMILE", "SMIRK", "SMITE", "SMITH", "SMOCK", "SMOKE", "SMOKY", "SMOTE", "SNACK", + "SNAGS", "SNAIL", "SNAKE", "SNAKY", "SNAPS", "SNARE", "SNARL", "SNEAK", "SNEER", "SNIFF", + "SNIPE", "SNOBS", "SNORE", "SNORT", "SNOUT", "SNOWS", "SNOWY", "SNUFF", "SOAPY", "SOARS", + "SOBER", "SOCKS", "SOFAS", "SOGGY", "SOILS", "SOLAR", "SOLES", "SOLID", "SOLOS", "SOLVE", + "SONGS", "SONNY", "SOOTH", "SOOTY", "SORES", "SORRY", "SORTS", "SOUGH", "SOULS", "SOUND", + "SOUPS", "SOUSE", "SOUTH", "SOWED", "SOWER", "SPACE", "SPADE", "SPAKE", "SPANK", "SPANS", + "SPARE", "SPARK", "SPARS", "SPASM", "SPAWN", "SPEAK", "SPEAR", "SPECK", "SPEED", "SPELL", + "SPELT", "SPEND", "SPENT", "SPERM", "SPICE", "SPICY", "SPIED", "SPIES", "SPIKE", "SPILL", + "SPILT", "SPINE", "SPINS", "SPINY", "SPIRE", "SPITE", "SPITS", "SPLIT", "SPOIL", "SPOKE", + "SPOOK", "SPOOL", "SPOON", "SPOOR", "SPORE", "SPORT", "SPOTS", "SPOUT", "SPRAY", "SPREE", + "SPRIG", "SPUNK", "SPURN", "SPURS", "SPURT", "SQUAD", "SQUAT", "SQUAW", "STABS", "STACK", + "STAFF", "STAGE", "STAGS", "STAID", "STAIN", "STAIR", "STAKE", "STALE", "STALK", "STALL", + "STAMP", "STAND", "STANK", "STARE", "STARK", "STARS", "START", "STATE", "STAVE", "STAYS", + "STEAD", "STEAK", "STEAL", "STEAM", "STEED", "STEEL", "STEEP", "STEER", "STEMS", "STEPS", + "STERN", "STEWS", "STICK", "STIFF", "STILE", "STILL", "STING", "STINK", "STINT", "STIRS", + "STOCK", "STOIC", "STOLE", "STONE", "STONY", "STOOD", "STOOL", "STOOP", "STOPS", "STORE", + "STORK", "STORM", "STORY", "STOUT", "STOVE", "STRAP", "STRAW", "STRAY", "STREW", "STRIP", + "STRUT", "STUCK", "STUDS", "STUDY", "STUFF", "STUMP", "STUNG", "STUNT", "STYLE", "SUAVE", + "SUCKS", "SUGAR", "SUING", "SUITE", "SUITS", "SULKS", "SULKY", "SULLY", "SUNNY", "SUPER", + "SURER", "SURGE", "SURLY", "SWAIN", "SWAMP", "SWANS", "SWARD", "SWARM", "SWAYS", "SWEAR", + "SWEAT", "SWEEP", "SWEET", "SWELL", "SWEPT", "SWIFT", "SWILL", "SWIMS", "SWINE", "SWING", + "SWIRL", "SWISH", "SWOON", "SWOOP", "SWORD", "SWORE", "SWORN", "SWUNG", "SYNOD", "SYRUP", + "TABBY", "TABLE", "TABOO", "TACIT", "TACKS", "TAILS", "TAINT", "TAKEN", "TAKES", "TALES", + "TALKS", "TALLY", "TALON", "TAMED", "TAMER", "TANKS", "TAPER", "TAPES", "TARDY", "TARES", + "TARRY", "TARTS", "TASKS", "TASTE", "TASTY", "TAUNT", "TAWNY", "TAXED", "TAXES", "TEACH", + "TEAMS", "TEARS", "TEASE", "TEEMS", "TEENS", "TEETH", "TELLS", "TEMPI", "TEMPO", "TEMPS", + "TENDS", "TENET", "TENOR", "TENSE", "TENTH", "TENTS", "TEPEE", "TEPID", "TERMS", "TERSE", + "TESTS", "TESTY", "TEXTS", "THANK", "THEFT", "THEIR", "THEME", "THERE", "THESE", "THICK", + "THIEF", "THIGH", "THINE", "THING", "THINK", "THIRD", "THONG", "THORN", "THOSE", "THREE", + "THREW", "THROB", "THROE", "THROW", "THUMB", "THUMP", "THYME", "TIARA", "TIBIA", "TICKS", + "TIDAL", "TIDES", "TIERS", "TIGER", "TIGHT", "TILDE", "TILED", "TILES", "TILLS", "TILTS", + "TIMED", "TIMES", "TIMID", "TINGE", "TINTS", "TIPSY", "TIRED", "TIRES", "TITHE", "TITLE", + "TOADS", "TOAST", "TODAY", "TODDY", "TOILS", "TOKEN", "TOLLS", "TOMBS", "TOMES", "TONED", + "TONES", "TONGS", "TONIC", "TOOLS", "TOOTH", "TOPAZ", "TOPIC", "TOQUE", "TORCH", "TORSO", + "TORTS", "TOTAL", "TOTEM", "TOUCH", "TOUGH", "TOURS", "TOWED", "TOWEL", "TOWER", "TOWNS", + "TOXIC", "TOYED", "TRACE", "TRACK", "TRACT", "TRADE", "TRAIL", "TRAIN", "TRAIT", "TRAMP", + "TRAMS", "TRAPS", "TRASH", "TRAYS", "TREAD", "TREAT", "TREED", "TREES", "TREND", "TRESS", + "TRIAD", "TRIAL", "TRIBE", "TRICE", "TRICK", "TRIED", "TRIES", "TRILL", "TRIPE", "TRIPS", + "TRITE", "TROLL", "TROOP", "TROTH", "TROTS", "TROUT", "TRUCE", "TRUCK", "TRUER", "TRULY", + "TRUMP", "TRUNK", "TRUSS", "TRUST", "TRUTH", "TRYST", "TUBES", "TUFTS", "TULIP", "TULLE", + "TUNED", "TUNES", "TUNIC", "TURNS", "TUSKS", "TUTOR", "TWAIN", "TWANG", "TWEED", "TWICE", + "TWIGS", "TWINE", "TWINS", "TWIRL", "TWIST", "TYING", "TYPED", "TYPES", "UDDER", "ULCER", + "ULTRA", "UNCLE", "UNCUT", "UNDER", "UNDID", "UNDUE", "UNFIT", "UNION", "UNITE", "UNITS", + "UNITY", "UNSAY", "UNTIE", "UNTIL", "UPPER", "UPSET", "URBAN", "URGED", "URGES", "URINE", + "USAGE", "USERS", "USHER", "USING", "USUAL", "USURP", "USURY", "UTTER", "VAGUE", "VALES", + "VALET", "VALID", "VALUE", "VALVE", "VANES", "VAPID", "VASES", "VAULT", "VAUNT", "VEILS", + "VEINS", "VELDT", "VENAL", "VENOM", "VENTS", "VENUE", "VERBS", "VERGE", "VERSE", "VERVE", + "VESTS", "VEXED", "VEXES", "VIALS", "VICAR", "VICES", "VIDEO", "VIEWS", "VIGIL", "VILER", + "VILLA", "VINES", "VIOLA", "VIPER", "VIRUS", "VISIT", "VISOR", "VISTA", "VITAL", "VIVID", + "VIXEN", "VIZOR", "VOCAL", "VODKA", "VOGUE", "VOICE", "VOILE", "VOLTS", "VOMIT", "VOTED", + "VOTER", "VOTES", "VOUCH", "VOWED", "VOWEL", "VYING", "WADED", "WAFER", "WAFTS", "WAGED", + "WAGER", "WAGES", "WAGON", "WAIFS", "WAILS", "WAIST", "WAITS", "WAIVE", "WAKED", "WAKEN", + "WAKES", "WALKS", "WALLS", "WALTZ", "WANDS", "WANED", "WANES", "WANTS", "WARDS", "WARES", + "WARMS", "WARNS", "WARTS", "WASPS", "WASTE", "WATCH", "WATER", "WAVED", "WAVER", "WAVES", + "WAXED", "WAXEN", "WAXES", "WEARS", "WEARY", "WEAVE", "WEDGE", "WEEDS", "WEEDY", "WEEKS", + "WEEPS", "WEIGH", "WEIRD", "WELCH", "WELLS", "WENCH", "WHACK", "WHALE", "WHARF", "WHEAT", + "WHEEL", "WHELP", "WHERE", "WHICH", "WHIFF", "WHILE", "WHIMS", "WHINE", "WHIPS", "WHIRL", + "WHIRR", "WHISK", "WHIST", "WHITE", "WHOLE", "WHOOP", "WHORE", "WHOSE", "WICKS", "WIDEN", + "WIDER", "WIDOW", "WIDTH", "WIELD", "WIGHT", "WILDS", "WILES", "WILLS", "WINCE", "WINCH", + "WINDS", "WINDY", "WINES", "WINGS", "WINKS", "WIPED", "WIPES", "WIRED", "WIRES", "WISER", + "WISPS", "WITCH", "WITTY", "WIVES", "WOMAN", "WOMEN", "WOODS", "WOODY", "WOOED", "WOOER", + "WORDS", "WORDY", "WORKS", "WORLD", "WORMS", "WORRY", "WORSE", "WORST", "WORTH", "WOULD", + "WOUND", "WRACK", "WRAPS", "WRAPT", "WRATH", "WREAK", "WRECK", "WREST", "WRING", "WRIST", + "WRITE", "WRITS", "WRONG", "WROTE", "WROTH", "YACHT", "YARDS", "YARNS", "YAWNS", "YEARN", + "YEARS", "YEAST", "YELLS", "YELPS", "YIELD", "YOKED", "YOKES", "YOLKS", "YOUNG", "YOURS", + "YOUTH", "ZEBRA", "ZONES", ] alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] @@ -662,7 +335,7 @@ def most_used_letters(): def list_of_valid_words(): - letters = ['s', 'e', 'a', 'r', 'o', 'i', 'L', 'n', 'p', 'c'] + letters = ['e', 's', 'a', 'r', 'o', 'l', 'i', 'n', 'c', 'p'] for i, letter in enumerate(letters): # Force all letters to be capitalized letters[i] = letter.upper() @@ -678,8 +351,16 @@ def list_of_valid_words(): for i,word in enumerate(legal_words): legal_words[i] = word.upper().replace("D","d") + random.shuffle(legal_words) + # Just in case the watch's random function is too pseudo, better to shuffle th elist so it's less likely to always have the same starting letter - print(f"Number of words found: {len(legal_words)}") + print("static const char _valid_letters[] = {", end='') + for letter in letters[:-1]: + print(f"'{letter}', ", end='') + print(f"'{letters[-1]}'" + "};") + print("") + + print(f"// Number of words found: {len(legal_words)}") items_per_row = 9 i = 0 print("static const char _legal_words[][WORDLE_LENGTH + 1] = {") @@ -692,6 +373,6 @@ def list_of_valid_words(): print("};") if __name__ == "__main__": - #most_used_letters() + most_used_letters() list_of_valid_words() From 3a24ede3de5467f3418704a88b7a32ef2c64b2e1 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 15 Aug 2024 08:17:10 -0400 Subject: [PATCH 04/53] day streak and further wordle dev --- .../watch_faces/complication/wordle_face.c | 92 ++++++++++++++----- .../watch_faces/complication/wordle_face.h | 5 +- utils/wordle_list.py | 1 + 3 files changed, 72 insertions(+), 26 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 4052ef7c..62141cba 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -25,14 +25,15 @@ #include #include #include "wordle_face.h" +#if USE_DAILY_STREAK +#include "watch_utility.h" +#endif /* TODO: * Add quick iteration (8x freq to get to the letter we want) * Fix the word matching (if answer is AAAAA and we put in AACAA, the C blinks) -* Verify pressing back always work when the board is G_G_G -* Add daily streak and wait for next day -* Add a way tpo recount previous attempts +* Add a way to recount previous attempts */ @@ -54,7 +55,7 @@ C | 525 U | 514 P has more words with the other letters here (281 vs 198) P | 448 */ -static const char _valid_letters[] = {'E', 'S', 'A', 'R', 'O', 'L', 'I', 'N', 'C', 'P'}; +static const char _valid_letters[] = {'A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R', 'S'}; // Number of words found: 281 static const char _legal_words[][WORDLE_LENGTH + 1] = { @@ -126,12 +127,13 @@ static void display_all_letters(wordle_state_t *state) { } static bool check_word(wordle_state_t *state) { - + WordleLetterResult checked_letter_in_answer[WORDLE_LENGTH] = {WORDLE_LETTER_WRONG}; // Exact bool is_exact_match = true; for (size_t i = 0; i < WORDLE_LENGTH; i++) { - if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][i]) - state->word_elements_result[i] = WORDLE_LETTER_CORRECT; + if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][i]) { + state->word_elements_result[i] = checked_letter_in_answer[i] = WORDLE_LETTER_CORRECT; + } else { state->word_elements_result[i] = WORDLE_LETTER_WRONG; is_exact_match = false; @@ -141,10 +143,10 @@ static bool check_word(wordle_state_t *state) { // Wrong Location for (size_t i = 0; i < WORDLE_LENGTH; i++) { for (size_t j = 0; j < WORDLE_LENGTH; j++) { - if (state->word_elements_result[j] != WORDLE_LETTER_WRONG) continue; + if (checked_letter_in_answer[j] != WORDLE_LETTER_WRONG) continue; if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][j]) { printf("me: %c them: %c\r\n", _valid_letters[state->word_elements[i]], _legal_words[state->curr_answer][j]); - state->word_elements_result[j] = WORDLE_LETTER_WRONG_LOC; + state->word_elements_result[i] = checked_letter_in_answer[j] = WORDLE_LETTER_WRONG_LOC; break; } } @@ -190,12 +192,29 @@ static void display_title(wordle_state_t *state) { static void display_streak(wordle_state_t *state) { char buf[12]; state->curr_screen = SCREEN_STREAK; - printf("streak %d \r\n", state->streak); +#if USE_DAILY_STREAK sprintf(buf, "WO St%2ddy", state->streak); +#else + sprintf(buf, "WO St%4d", state->streak); +#endif watch_display_string(buf, 0); watch_set_colon(); } +#if USE_DAILY_STREAK +static void display_wait(wordle_state_t *state) { + state->curr_screen = SCREEN_WAIT; + if (state->streak < 40) { + char buf[13]; + sprintf(buf,"WO%2d WaIt ", state->streak); + watch_display_string(buf, 0); + } + else { // Streak too long to display in top-right + watch_display_string("WO WaIt ", 0); + } +} +#endif + static void display_lose(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 6]; sprintf(buf," L %s", subsecond % 2 ? _legal_words[state->curr_answer] : " "); @@ -218,23 +237,30 @@ static uint8_t get_first_pos(WordleLetterResult *word_elements_result) { } static uint8_t get_next_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { - uint8_t pos = curr_pos; - do { - pos++; - if (pos > WORDLE_LENGTH) return WORDLE_LENGTH + 1; - } while (word_elements_result[pos] == WORDLE_LETTER_CORRECT); - return pos; + for (size_t pos = curr_pos+1; pos < WORDLE_LENGTH; pos++) { + if (word_elements_result[pos] != WORDLE_LETTER_CORRECT) + return pos; + } + return WORDLE_LENGTH; } static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { - int8_t pos = curr_pos; - do { - pos--; - if (pos < 0) return curr_pos; - } while (word_elements_result[pos] == WORDLE_LETTER_CORRECT); - return pos; + if (curr_pos == 0) return 0; + for (int8_t pos = curr_pos-1; pos >= 0; pos--) { + if (word_elements_result[pos] != WORDLE_LETTER_CORRECT) + return pos; + } + return curr_pos; } +#if USE_DAILY_STREAK +static uint32_t get_day_unix_time(void) { + watch_date_time now = watch_rtc_get_date_time(); + now.unit.hour = now.unit.minute = now.unit.second = 0; + return watch_utility_date_time_to_unix_time(now, 0); +} +#endif + static void display_result(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 1]; for (size_t i = 0; i < WORDLE_LENGTH; i++) @@ -273,6 +299,12 @@ static bool act_on_btn(wordle_state_t *state) { state->curr_screen = SCREEN_PLAYING; return true; case SCREEN_TITLE: +#if USE_DAILY_STREAK + if (state->prev_day == get_day_unix_time()) { + display_wait(state); + return true; + } +#endif display_streak(state); return true; case SCREEN_STREAK: @@ -281,7 +313,12 @@ static bool act_on_btn(wordle_state_t *state) { case SCREEN_WIN: case SCREEN_LOSE: display_title(state); - return true; + return true; +#if USE_DAILY_STREAK + case SCREEN_WAIT: + display_title(state); + return true; +#endif default: return false; } @@ -296,7 +333,6 @@ void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, memset(*context_ptr, 0, sizeof(wordle_state_t)); wordle_state_t *state = (wordle_state_t *)*context_ptr; state->curr_screen = SCREEN_TITLE; - } // Do any pin or peripheral setup here; this will be called whenever the watch wakes from deep sleep. } @@ -305,6 +341,9 @@ void wordle_face_activate(movement_settings_t *settings, void *context) { (void) settings; wordle_state_t *state = (wordle_state_t *)context; movement_request_tick_frequency(2); +#if USE_DAILY_STREAK + if (state->prev_day <= (get_day_unix_time() + (60 *60 * 24))) state->streak = 0; +#endif if (state->curr_screen == SCREEN_TITLE) display_title(state); } @@ -356,11 +395,14 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi display_letter(state, true); if (state->word_elements[state->position] == _num_valid_letters) break; state->position = get_next_pos(state->position, state->word_elements_result); - if(WORDLE_LENGTH == (state->position)) { + if (state->position >= WORDLE_LENGTH) { bool exact_match = check_word(state); if (exact_match) { state->curr_screen = SCREEN_WIN; state->streak++; +#if USE_DAILY_STREAK + state->prev_day = get_day_unix_time(); +#endif break; } if (state->attempt++ >= WORDLE_MAX_ATTEMPTS) { diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index b8e5d0f5..15b2a94d 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -50,6 +50,9 @@ typedef enum { SCREEN_RESULT, SCREEN_TITLE, SCREEN_STREAK, +#if USE_DAILY_STREAK + SCREEN_WAIT, +#endif SCREEN_WIN, SCREEN_LOSE, SCREEN_COUNT @@ -66,7 +69,7 @@ typedef struct { uint8_t streak; WordleScreen curr_screen; #if USE_DAILY_STREAK - // For the day info + uint32_t prev_day; #endif } wordle_state_t; diff --git a/utils/wordle_list.py b/utils/wordle_list.py index 87e60660..1b5baf00 100644 --- a/utils/wordle_list.py +++ b/utils/wordle_list.py @@ -336,6 +336,7 @@ def most_used_letters(): def list_of_valid_words(): letters = ['e', 's', 'a', 'r', 'o', 'l', 'i', 'n', 'c', 'p'] + letters = sorted(letters) for i, letter in enumerate(letters): # Force all letters to be capitalized letters[i] = letter.upper() From 676f50d1943f15fbb0c7b2544a32a21492d32fd5 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 15 Aug 2024 08:56:49 -0400 Subject: [PATCH 05/53] Added fast cycle --- .../watch_faces/complication/wordle_face.c | 77 +++++++++++++------ 1 file changed, 55 insertions(+), 22 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 62141cba..4fa6720b 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -29,6 +29,9 @@ #include "watch_utility.h" #endif +#define FREQ_FAST 4 +#define FREQ 2 + /* TODO: * Add quick iteration (8x freq to get to the letter we want) @@ -104,6 +107,17 @@ static uint32_t get_random(uint32_t max) { #endif } +static bool _quick_ticks_running; +static void start_quick_cyc(void){ + _quick_ticks_running = true; + movement_request_tick_frequency(FREQ_FAST); +} + +static void stop_quick_cyc(void){ + _quick_ticks_running = false; + movement_request_tick_frequency(FREQ); +} + static void display_letter(wordle_state_t *state, bool display_dash) { char buf[1 + 1]; if (state->word_elements[state->position] >= _num_valid_letters) { @@ -145,19 +159,11 @@ static bool check_word(wordle_state_t *state) { for (size_t j = 0; j < WORDLE_LENGTH; j++) { if (checked_letter_in_answer[j] != WORDLE_LETTER_WRONG) continue; if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][j]) { - printf("me: %c them: %c\r\n", _valid_letters[state->word_elements[i]], _legal_words[state->curr_answer][j]); state->word_elements_result[i] = checked_letter_in_answer[j] = WORDLE_LETTER_WRONG_LOC; break; } } } - - for (size_t i = 0; i < WORDLE_LENGTH; i++) { - printf("%d : %d\r\n", i, state->word_elements_result[i]); - } - - - return is_exact_match; } @@ -181,7 +187,9 @@ static void reset_board(wordle_state_t *state) { display_attempt(state->attempt); display_all_letters(state); watch_display_string("-", 5); - printf("rand: %s\r\n", _legal_words[state->curr_answer]); +#if __EMSCRIPTEN__ + printf("ANSWER: %s\r\n", _legal_words[state->curr_answer]); +#endif } static void display_title(wordle_state_t *state) { @@ -253,6 +261,16 @@ static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_ return curr_pos; } +static void get_next_letter(uint8_t curr_pos, uint8_t *word_elements) { + if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = 0; + else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % _num_valid_letters; +} + +static void get_prev_letter(uint8_t curr_pos, uint8_t *word_elements) { + if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = _num_valid_letters - 1; + else word_elements[curr_pos] = (word_elements[curr_pos] + _num_valid_letters - 1) % _num_valid_letters; +} + #if USE_DAILY_STREAK static uint32_t get_day_unix_time(void) { watch_date_time now = watch_rtc_get_date_time(); @@ -340,7 +358,7 @@ void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void wordle_face_activate(movement_settings_t *settings, void *context) { (void) settings; wordle_state_t *state = (wordle_state_t *)context; - movement_request_tick_frequency(2); + movement_request_tick_frequency(FREQ); #if USE_DAILY_STREAK if (state->prev_day <= (get_day_unix_time() + (60 *60 * 24))) state->streak = 0; #endif @@ -360,10 +378,19 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi switch (state->curr_screen) { case SCREEN_PLAYING: - if (event.subsecond % 2) { - display_letter(state, true); - } else { - watch_display_string(" ", state->position + 5); + if (_quick_ticks_running) { + if (watch_get_pin_level(BTN_ALARM)){ + get_next_letter(state->position, state->word_elements); + display_letter(state, true); + } + else stop_quick_cyc(); + } + else { + if (event.subsecond % 2) { + display_letter(state, true); + } else { + watch_display_string(" ", state->position + 5); + } } break; case SCREEN_RESULT: @@ -379,18 +406,23 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi break; } break; - case EVENT_LIGHT_BUTTON_UP: + case EVENT_ALARM_BUTTON_UP: if (act_on_btn(state)) break; - if (state->word_elements[state->position] >= _num_valid_letters) state->word_elements[state->position] = 0; - else state->word_elements[state->position] = (state->word_elements[state->position] + 1) % _num_valid_letters; + get_next_letter(state->position, state->word_elements); display_letter(state, true); break; - case EVENT_LIGHT_LONG_PRESS: - if (state->word_elements[state->position] >= _num_valid_letters) state->word_elements[state->position] = _num_valid_letters - 1; - else state->word_elements[state->position] = (state->word_elements[state->position] + _num_valid_letters - 1) % _num_valid_letters; + case EVENT_ALARM_LONG_PRESS: + if (state->curr_screen != SCREEN_PLAYING) break; + get_prev_letter(state->position, state->word_elements); display_letter(state, true); + break; + case EVENT_ALARM_LONGER_PRESS: + if (state->curr_screen != SCREEN_PLAYING) break; + get_next_letter(state->position, state->word_elements); + display_letter(state, true); + start_quick_cyc(); break; - case EVENT_ALARM_BUTTON_UP: + case EVENT_LIGHT_BUTTON_UP: if (act_on_btn(state)) break; display_letter(state, true); if (state->word_elements[state->position] == _num_valid_letters) break; @@ -414,7 +446,8 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi break; } break; - case EVENT_ALARM_LONG_PRESS: + case EVENT_LIGHT_LONG_PRESS: + if (state->curr_screen != SCREEN_PLAYING) break; display_letter(state, true); state->position = get_prev_pos(state->position, state->word_elements_result); break; From 0c86be4a40ef338ee7641dc4e405af9525ae54b1 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 15 Aug 2024 08:59:22 -0400 Subject: [PATCH 06/53] Swapped button mapping and removed fast iteration --- .../watch_faces/complication/wordle_face.c | 43 ++++--------------- 1 file changed, 8 insertions(+), 35 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 4fa6720b..f701fc4e 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -29,7 +29,6 @@ #include "watch_utility.h" #endif -#define FREQ_FAST 4 #define FREQ 2 /* @@ -107,17 +106,6 @@ static uint32_t get_random(uint32_t max) { #endif } -static bool _quick_ticks_running; -static void start_quick_cyc(void){ - _quick_ticks_running = true; - movement_request_tick_frequency(FREQ_FAST); -} - -static void stop_quick_cyc(void){ - _quick_ticks_running = false; - movement_request_tick_frequency(FREQ); -} - static void display_letter(wordle_state_t *state, bool display_dash) { char buf[1 + 1]; if (state->word_elements[state->position] >= _num_valid_letters) { @@ -378,19 +366,10 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi switch (state->curr_screen) { case SCREEN_PLAYING: - if (_quick_ticks_running) { - if (watch_get_pin_level(BTN_ALARM)){ - get_next_letter(state->position, state->word_elements); - display_letter(state, true); - } - else stop_quick_cyc(); - } - else { - if (event.subsecond % 2) { - display_letter(state, true); - } else { - watch_display_string(" ", state->position + 5); - } + if (event.subsecond % 2) { + display_letter(state, true); + } else { + watch_display_string(" ", state->position + 5); } break; case SCREEN_RESULT: @@ -406,23 +385,17 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi break; } break; - case EVENT_ALARM_BUTTON_UP: + case EVENT_LIGHT_BUTTON_UP: if (act_on_btn(state)) break; get_next_letter(state->position, state->word_elements); display_letter(state, true); break; - case EVENT_ALARM_LONG_PRESS: + case EVENT_LIGHT_LONG_PRESS: if (state->curr_screen != SCREEN_PLAYING) break; get_prev_letter(state->position, state->word_elements); display_letter(state, true); - break; - case EVENT_ALARM_LONGER_PRESS: - if (state->curr_screen != SCREEN_PLAYING) break; - get_next_letter(state->position, state->word_elements); - display_letter(state, true); - start_quick_cyc(); break; - case EVENT_LIGHT_BUTTON_UP: + case EVENT_ALARM_BUTTON_UP: if (act_on_btn(state)) break; display_letter(state, true); if (state->word_elements[state->position] == _num_valid_letters) break; @@ -446,7 +419,7 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi break; } break; - case EVENT_LIGHT_LONG_PRESS: + case EVENT_ALARM_LONG_PRESS: if (state->curr_screen != SCREEN_PLAYING) break; display_letter(state, true); state->position = get_prev_pos(state->position, state->word_elements_result); From 8ea779874f0405fbe5dd99e13208833ecae4eb42 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 15 Aug 2024 17:02:14 -0400 Subject: [PATCH 07/53] Face compares the values correctly now and does a dict lookup first --- .../watch_faces/complication/wordle_face.c | 177 +++++++++++------- .../watch_faces/complication/wordle_face.h | 7 +- 2 files changed, 113 insertions(+), 71 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index f701fc4e..13b4b6fb 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -33,9 +33,8 @@ /* TODO: -* Add quick iteration (8x freq to get to the letter we want) -* Fix the word matching (if answer is AAAAA and we put in AACAA, the C blinks) * Add a way to recount previous attempts +* Only allow dictionary attempts - Show "nodict" otherwise */ @@ -106,6 +105,41 @@ static uint32_t get_random(uint32_t max) { #endif } +static uint8_t get_first_pos(WordleLetterResult *word_elements_result) { + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (word_elements_result[i] != WORDLE_LETTER_CORRECT) + return i; + } + return 0; +} + +static uint8_t get_next_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { + for (size_t pos = curr_pos+1; pos < WORDLE_LENGTH; pos++) { + if (word_elements_result[pos] != WORDLE_LETTER_CORRECT) + return pos; + } + return WORDLE_LENGTH; +} + +static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { + if (curr_pos == 0) return 0; + for (size_t pos = curr_pos-1; pos > 0; pos--) { + if (word_elements_result[pos] != WORDLE_LETTER_CORRECT) + return pos; + } + return curr_pos; +} + +static void get_next_letter(uint8_t curr_pos, uint8_t *word_elements) { + if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = 0; + else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % _num_valid_letters; +} + +static void get_prev_letter(uint8_t curr_pos, uint8_t *word_elements) { + if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = _num_valid_letters - 1; + else word_elements[curr_pos] = (word_elements[curr_pos] + _num_valid_letters - 1) % _num_valid_letters; +} + static void display_letter(wordle_state_t *state, bool display_dash) { char buf[1 + 1]; if (state->word_elements[state->position] >= _num_valid_letters) { @@ -121,6 +155,7 @@ static void display_letter(wordle_state_t *state, bool display_dash) { static void display_all_letters(wordle_state_t *state) { uint8_t prev_pos = state->position; + watch_display_string(" ", 4); for (size_t i = 0; i < WORDLE_LENGTH; i++) { state->position = i; display_letter(state, false); @@ -128,31 +163,47 @@ static void display_all_letters(wordle_state_t *state) { state->position = prev_pos; } +static bool check_word_in_dict(uint8_t *word_elements) { + bool is_exact_match; + for (uint16_t i = 0; i < _num_words; i++) { + is_exact_match = true; + for (size_t j = 0; j < WORDLE_LENGTH; j++) { + if (_valid_letters[word_elements[j]] != _legal_words[i][j]) { + is_exact_match = false; + break; + } + } + if (is_exact_match) return true; + } + return false; +} + static bool check_word(wordle_state_t *state) { - WordleLetterResult checked_letter_in_answer[WORDLE_LENGTH] = {WORDLE_LETTER_WRONG}; // Exact bool is_exact_match = true; for (size_t i = 0; i < WORDLE_LENGTH; i++) { - if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][i]) { - state->word_elements_result[i] = checked_letter_in_answer[i] = WORDLE_LETTER_CORRECT; - } + if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][i]) + state->word_elements_result[i] = WORDLE_LETTER_CORRECT; else { state->word_elements_result[i] = WORDLE_LETTER_WRONG; is_exact_match = false; } } - + if (is_exact_match) return true; // Wrong Location - for (size_t i = 0; i < WORDLE_LENGTH; i++) { + bool answer_found_wrong_loc[WORDLE_LENGTH] = { false }; + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements_result[i] != WORDLE_LETTER_WRONG) continue; for (size_t j = 0; j < WORDLE_LENGTH; j++) { - if (checked_letter_in_answer[j] != WORDLE_LETTER_WRONG) continue; + if (answer_found_wrong_loc[j]) continue; if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][j]) { - state->word_elements_result[i] = checked_letter_in_answer[j] = WORDLE_LETTER_WRONG_LOC; + state->word_elements_result[i] = WORDLE_LETTER_WRONG_LOC; + answer_found_wrong_loc[j] = true; break; } } } - return is_exact_match; + return false; } static void display_attempt(uint8_t attempt) { @@ -161,19 +212,27 @@ static void display_attempt(uint8_t attempt) { watch_display_string(buf, 3); } +static void show_start_of_attempt(wordle_state_t *state) { + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements_result[i] != WORDLE_LETTER_CORRECT) + state->word_elements[i] = _num_valid_letters; + } + display_attempt(state->attempt); + display_all_letters(state); + state->position = get_first_pos(state->word_elements_result); + state->curr_screen = SCREEN_PLAYING; +} + static void reset_board(wordle_state_t *state) { for (size_t i = 0; i < WORDLE_LENGTH; i++) { state->word_elements[i] = _num_valid_letters; state->word_elements_result[i] = WORDLE_LETTER_WRONG; } state->curr_answer = get_random(_num_words); - state->position = 0; state->attempt = 1; - state->curr_screen = SCREEN_PLAYING; watch_clear_colon(); watch_display_string(" ", 4); - display_attempt(state->attempt); - display_all_letters(state); + show_start_of_attempt(state); watch_display_string("-", 5); #if __EMSCRIPTEN__ printf("ANSWER: %s\r\n", _legal_words[state->curr_answer]); @@ -182,7 +241,7 @@ static void reset_board(wordle_state_t *state) { static void display_title(wordle_state_t *state) { state->curr_screen = SCREEN_TITLE; - watch_display_string("WO WORDLE", 0); + watch_display_string("WO WordLE", 0); } static void display_streak(wordle_state_t *state) { @@ -211,6 +270,11 @@ static void display_wait(wordle_state_t *state) { } #endif +static void display_not_in_dict(wordle_state_t *state) { + state->curr_screen = SCREEN_NO_DICT; + watch_display_string("WO nodict", 0); +} + static void display_lose(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 6]; sprintf(buf," L %s", subsecond % 2 ? _legal_words[state->curr_answer] : " "); @@ -224,41 +288,6 @@ static void display_win(wordle_state_t *state, uint8_t subsecond) { watch_display_string(buf, 0); } -static uint8_t get_first_pos(WordleLetterResult *word_elements_result) { - for (size_t i = 0; i < WORDLE_LENGTH; i++) { - if (word_elements_result[i] != WORDLE_LETTER_CORRECT) - return i; - } - return 0; -} - -static uint8_t get_next_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { - for (size_t pos = curr_pos+1; pos < WORDLE_LENGTH; pos++) { - if (word_elements_result[pos] != WORDLE_LETTER_CORRECT) - return pos; - } - return WORDLE_LENGTH; -} - -static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { - if (curr_pos == 0) return 0; - for (int8_t pos = curr_pos-1; pos >= 0; pos--) { - if (word_elements_result[pos] != WORDLE_LETTER_CORRECT) - return pos; - } - return curr_pos; -} - -static void get_next_letter(uint8_t curr_pos, uint8_t *word_elements) { - if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = 0; - else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % _num_valid_letters; -} - -static void get_prev_letter(uint8_t curr_pos, uint8_t *word_elements) { - if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = _num_valid_letters - 1; - else word_elements[curr_pos] = (word_elements[curr_pos] + _num_valid_letters - 1) % _num_valid_letters; -} - #if USE_DAILY_STREAK static uint32_t get_day_unix_time(void) { watch_date_time now = watch_rtc_get_date_time(); @@ -295,14 +324,7 @@ static bool act_on_btn(wordle_state_t *state) { switch (state->curr_screen) { case SCREEN_RESULT: - for (size_t i = 0; i < WORDLE_LENGTH; i++) { - if (state->word_elements_result[i] != WORDLE_LETTER_CORRECT) - state->word_elements[i] = _num_valid_letters; - } - display_attempt(state->attempt); - display_all_letters(state); - state->position = get_first_pos(state->word_elements_result); - state->curr_screen = SCREEN_PLAYING; + show_start_of_attempt(state); return true; case SCREEN_TITLE: #if USE_DAILY_STREAK @@ -311,15 +333,24 @@ static bool act_on_btn(wordle_state_t *state) { return true; } #endif - display_streak(state); + if (state->playing) + show_start_of_attempt(state); + else + display_streak(state); return true; case SCREEN_STREAK: +#if USE_DAILY_STREAK + state->curr_day = get_day_unix_time(); +#endif reset_board(state); return true; case SCREEN_WIN: case SCREEN_LOSE: display_title(state); return true; + case SCREEN_NO_DICT: + show_start_of_attempt(state); + return true; #if USE_DAILY_STREAK case SCREEN_WAIT: display_title(state); @@ -346,22 +377,19 @@ void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void wordle_face_activate(movement_settings_t *settings, void *context) { (void) settings; wordle_state_t *state = (wordle_state_t *)context; - movement_request_tick_frequency(FREQ); #if USE_DAILY_STREAK - if (state->prev_day <= (get_day_unix_time() + (60 *60 * 24))) state->streak = 0; + uint32_t now = get_day_unix_time() ; + if (state->prev_day <= (now + (60 *60 * 24))) state->streak = 0; + if (state->curr_day != now) state->playing = false; #endif - if (state->curr_screen == SCREEN_TITLE) - display_title(state); + movement_request_tick_frequency(FREQ); + display_title(state); } bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, void *context) { wordle_state_t *state = (wordle_state_t *)context; switch (event.event_type) { - case EVENT_ACTIVATE: - if (state->curr_screen == SCREEN_PLAYING) - display_all_letters(state); - break; case EVENT_TICK: switch (state->curr_screen) { @@ -399,10 +427,17 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi if (act_on_btn(state)) break; display_letter(state, true); if (state->word_elements[state->position] == _num_valid_letters) break; + state->playing = true; state->position = get_next_pos(state->position, state->word_elements_result); if (state->position >= WORDLE_LENGTH) { + bool in_dict = check_word_in_dict(state->word_elements); + if (!in_dict) { + display_not_in_dict(state); + break; + } bool exact_match = check_word(state); if (exact_match) { + state->playing = false; state->curr_screen = SCREEN_WIN; state->streak++; #if USE_DAILY_STREAK @@ -411,6 +446,7 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi break; } if (state->attempt++ >= WORDLE_MAX_ATTEMPTS) { + state->playing = false; state->curr_screen = SCREEN_LOSE; state->streak = 0; break; @@ -425,9 +461,12 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi state->position = get_prev_pos(state->position, state->word_elements_result); break; case EVENT_LIGHT_BUTTON_DOWN: - break; + case EVENT_ACTIVATE: case EVENT_TIMEOUT: + break; case EVENT_LOW_ENERGY_UPDATE: + if (state->curr_screen == SCREEN_TITLE) + display_title(state); break; default: return movement_default_loop_handler(event, settings); diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 15b2a94d..633d3a29 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -35,7 +35,7 @@ */ #define WORDLE_LENGTH 5 -#define WORDLE_MAX_ATTEMPTS 5 +#define WORDLE_MAX_ATTEMPTS 6 #define USE_DAILY_STREAK true typedef enum { @@ -55,6 +55,7 @@ typedef enum { #endif SCREEN_WIN, SCREEN_LOSE, + SCREEN_NO_DICT, SCREEN_COUNT } WordleScreen; @@ -64,12 +65,14 @@ typedef struct { WordleLetterResult word_elements_result[WORDLE_LENGTH]; uint8_t attempt : 3; uint8_t position : 3; - uint8_t unused : 2; + bool playing : 1; + bool unused : 1; uint16_t curr_answer; uint8_t streak; WordleScreen curr_screen; #if USE_DAILY_STREAK uint32_t prev_day; + uint32_t curr_day; #endif } wordle_state_t; From cef0d8836a9f4b2e3907b0e243c7dcfa8037c960 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 15 Aug 2024 17:40:04 -0400 Subject: [PATCH 08/53] Don't allow readding already guessed items --- .../watch_faces/complication/wordle_face.c | 108 +++++++++++------- .../watch_faces/complication/wordle_face.h | 2 + 2 files changed, 67 insertions(+), 43 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 13b4b6fb..08ad4789 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -1,7 +1,7 @@ /* * MIT License * - * Copyright (c) 2024 <#author_name#> + * Copyright (c) 2024 * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -34,7 +34,6 @@ /* TODO: * Add a way to recount previous attempts -* Only allow dictionary attempts - Show "nodict" otherwise */ @@ -42,6 +41,7 @@ TODO: /* Letter | Usage +_______|______ E | 1519 S | 1490 A | 1213 @@ -60,7 +60,7 @@ static const char _valid_letters[] = {'A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R // Number of words found: 281 static const char _legal_words[][WORDLE_LENGTH + 1] = { - "SPIES", "SOLAR", "RAISE", "RARES", "PAEAN", "PLIES", "CRASS", "PEARS", "SNORE", + "AAAAA","SPIES", "SOLAR", "RAISE", "RARES", "PAEAN", "PLIES", "CRASS", "PEARS", "SNORE", "POLES", "ROLLS", "ALOES", "LOSES", "SLICE", "PEACE", "POLLS", "POSES", "LANES", "COPRA", "SPANS", "CANAL", "LOSER", "PAPER", "PILES", "CLASS", "RACER", "POOLS", "PLAIN", "SPEAR", "SPARE", "INNER", "ALIEN", "NOSES", "EARLS", "SEALS", "LEARN", @@ -94,7 +94,7 @@ static const char _legal_words[][WORDLE_LENGTH + 1] = { "SIREN", "PEONS", }; -static const uint32_t _num_words = (sizeof(_legal_words) / sizeof(_legal_words[0])); +static const uint16_t _num_words = (sizeof(_legal_words) / sizeof(_legal_words[0])); static const uint8_t _num_valid_letters = (sizeof(_valid_letters) / sizeof(_valid_letters[0])); static uint32_t get_random(uint32_t max) { @@ -163,7 +163,7 @@ static void display_all_letters(wordle_state_t *state) { state->position = prev_pos; } -static bool check_word_in_dict(uint8_t *word_elements) { +static uint32_t check_word_in_dict(uint8_t *word_elements) { bool is_exact_match; for (uint16_t i = 0; i < _num_words; i++) { is_exact_match = true; @@ -173,9 +173,9 @@ static bool check_word_in_dict(uint8_t *word_elements) { break; } } - if (is_exact_match) return true; + if (is_exact_match) return i; } - return false; + return _num_words; } static bool check_word(wordle_state_t *state) { @@ -208,7 +208,7 @@ static bool check_word(wordle_state_t *state) { static void display_attempt(uint8_t attempt) { char buf[2]; - sprintf(buf, "%d", attempt); + sprintf(buf, "%d", attempt+1); watch_display_string(buf, 3); } @@ -228,8 +228,11 @@ static void reset_board(wordle_state_t *state) { state->word_elements[i] = _num_valid_letters; state->word_elements_result[i] = WORDLE_LETTER_WRONG; } + for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) { + state->guessed_words[i] = _num_words; + } state->curr_answer = get_random(_num_words); - state->attempt = 1; + state->attempt = 0; watch_clear_colon(); watch_display_string(" ", 4); show_start_of_attempt(state); @@ -268,11 +271,22 @@ static void display_wait(wordle_state_t *state) { watch_display_string("WO WaIt ", 0); } } + +static uint32_t get_day_unix_time(void) { + watch_date_time now = watch_rtc_get_date_time(); + now.unit.hour = now.unit.minute = now.unit.second = 0; + return watch_utility_date_time_to_unix_time(now, 0); +} #endif static void display_not_in_dict(wordle_state_t *state) { state->curr_screen = SCREEN_NO_DICT; - watch_display_string("WO nodict", 0); + watch_display_string("nodict", 4); +} + +static void display_already_guessed(wordle_state_t *state) { + state->curr_screen = SCREEN_ALREADY_GUESSED; + watch_display_string("GUESSD", 4); } static void display_lose(wordle_state_t *state, uint8_t subsecond) { @@ -288,14 +302,6 @@ static void display_win(wordle_state_t *state, uint8_t subsecond) { watch_display_string(buf, 0); } -#if USE_DAILY_STREAK -static uint32_t get_day_unix_time(void) { - watch_date_time now = watch_rtc_get_date_time(); - now.unit.hour = now.unit.minute = now.unit.second = 0; - return watch_utility_date_time_to_unix_time(now, 0); -} -#endif - static void display_result(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 1]; for (size_t i = 0; i < WORDLE_LENGTH; i++) @@ -349,6 +355,7 @@ static bool act_on_btn(wordle_state_t *state) { display_title(state); return true; case SCREEN_NO_DICT: + case SCREEN_ALREADY_GUESSED: show_start_of_attempt(state); return true; #if USE_DAILY_STREAK @@ -362,6 +369,44 @@ static bool act_on_btn(wordle_state_t *state) { return false; } +static void get_result(wordle_state_t *state) { + // Check if it's in the dict + uint16_t in_dict = check_word_in_dict(state->word_elements); + if (in_dict == _num_words) { + display_not_in_dict(state); + return; + } + + // Check if already guessed + for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) { + printf("%d %d \r\n",state->guessed_words[state->attempt], state->guessed_words[i]); + if(in_dict == state->guessed_words[i]) { + display_already_guessed(state); + return; + } + } + + state->guessed_words[state->attempt] = in_dict; + bool exact_match = check_word(state); + if (exact_match) { + state->playing = false; + state->curr_screen = SCREEN_WIN; + state->streak++; +#if USE_DAILY_STREAK + state->prev_day = get_day_unix_time(); +#endif + return; + } + if (state->attempt++ > WORDLE_MAX_ATTEMPTS) { + state->playing = false; + state->curr_screen = SCREEN_LOSE; + state->streak = 0; + return; + } + state->curr_screen = SCREEN_RESULT; + return; +} + void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr) { (void) settings; (void) watch_face_index; @@ -429,31 +474,8 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi if (state->word_elements[state->position] == _num_valid_letters) break; state->playing = true; state->position = get_next_pos(state->position, state->word_elements_result); - if (state->position >= WORDLE_LENGTH) { - bool in_dict = check_word_in_dict(state->word_elements); - if (!in_dict) { - display_not_in_dict(state); - break; - } - bool exact_match = check_word(state); - if (exact_match) { - state->playing = false; - state->curr_screen = SCREEN_WIN; - state->streak++; -#if USE_DAILY_STREAK - state->prev_day = get_day_unix_time(); -#endif - break; - } - if (state->attempt++ >= WORDLE_MAX_ATTEMPTS) { - state->playing = false; - state->curr_screen = SCREEN_LOSE; - state->streak = 0; - break; - } - state->curr_screen = SCREEN_RESULT; - break; - } + if (state->position >= WORDLE_LENGTH) + get_result(state); break; case EVENT_ALARM_LONG_PRESS: if (state->curr_screen != SCREEN_PLAYING) break; diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 633d3a29..91173341 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -56,6 +56,7 @@ typedef enum { SCREEN_WIN, SCREEN_LOSE, SCREEN_NO_DICT, + SCREEN_ALREADY_GUESSED, SCREEN_COUNT } WordleScreen; @@ -63,6 +64,7 @@ typedef struct { // Anything you need to keep track of, put it here! uint8_t word_elements[WORDLE_LENGTH]; WordleLetterResult word_elements_result[WORDLE_LENGTH]; + uint16_t guessed_words[WORDLE_MAX_ATTEMPTS]; uint8_t attempt : 3; uint8_t position : 3; bool playing : 1; From 3e327eb7fdc7afef9f3c9afd7d20f44d43625c40 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Thu, 15 Aug 2024 18:12:54 -0400 Subject: [PATCH 09/53] Another fix on the word_check --- movement/watch_faces/complication/wordle_face.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 08ad4789..3cf47226 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -60,7 +60,7 @@ static const char _valid_letters[] = {'A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R // Number of words found: 281 static const char _legal_words[][WORDLE_LENGTH + 1] = { - "AAAAA","SPIES", "SOLAR", "RAISE", "RARES", "PAEAN", "PLIES", "CRASS", "PEARS", "SNORE", + "SPIES", "SOLAR", "RAISE", "RARES", "PAEAN", "PLIES", "CRASS", "PEARS", "SNORE", "POLES", "ROLLS", "ALOES", "LOSES", "SLICE", "PEACE", "POLLS", "POSES", "LANES", "COPRA", "SPANS", "CANAL", "LOSER", "PAPER", "PILES", "CLASS", "RACER", "POOLS", "PLAIN", "SPEAR", "SPARE", "INNER", "ALIEN", "NOSES", "EARLS", "SEALS", "LEARN", @@ -181,9 +181,12 @@ static uint32_t check_word_in_dict(uint8_t *word_elements) { static bool check_word(wordle_state_t *state) { // Exact bool is_exact_match = true; + bool answer_already_accounted[WORDLE_LENGTH] = { false }; for (size_t i = 0; i < WORDLE_LENGTH; i++) { - if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][i]) + if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][i]) { state->word_elements_result[i] = WORDLE_LETTER_CORRECT; + answer_already_accounted[i] = true; + } else { state->word_elements_result[i] = WORDLE_LETTER_WRONG; is_exact_match = false; @@ -191,14 +194,13 @@ static bool check_word(wordle_state_t *state) { } if (is_exact_match) return true; // Wrong Location - bool answer_found_wrong_loc[WORDLE_LENGTH] = { false }; for (size_t i = 0; i < WORDLE_LENGTH; i++) { if (state->word_elements_result[i] != WORDLE_LETTER_WRONG) continue; for (size_t j = 0; j < WORDLE_LENGTH; j++) { - if (answer_found_wrong_loc[j]) continue; + if (answer_already_accounted[j]) continue; if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][j]) { state->word_elements_result[i] = WORDLE_LETTER_WRONG_LOC; - answer_found_wrong_loc[j] = true; + answer_already_accounted[j] = true; break; } } @@ -379,7 +381,6 @@ static void get_result(wordle_state_t *state) { // Check if already guessed for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) { - printf("%d %d \r\n",state->guessed_words[state->attempt], state->guessed_words[i]); if(in_dict == state->guessed_words[i]) { display_already_guessed(state); return; From 02f6a3256cf0a243bf54c0b365e5894feef5af25 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 17 Aug 2024 02:13:26 -0400 Subject: [PATCH 10/53] Added documentation for Wordle face --- .../watch_faces/complication/wordle_face.c | 38 +++----- .../watch_faces/complication/wordle_face.h | 32 +++++-- utils/{ => wordle_face}/wordle_list.py | 89 +++++++++++++++++-- 3 files changed, 119 insertions(+), 40 deletions(-) rename utils/{ => wordle_face}/wordle_list.py (88%) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 3cf47226..1d40252c 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -29,33 +29,8 @@ #include "watch_utility.h" #endif -#define FREQ 2 - -/* -TODO: -* Add a way to recount previous attempts -*/ - // From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff - -/* -Letter | Usage -_______|______ -E | 1519 -S | 1490 -A | 1213 -R | 1026 -O | 852 -L | 850 -I | 843 -T | 819 But looks bad across all positions -N | 681 -D | 619 lowercase d looks like a in certain positions -C | 525 -U | 514 P has more words with the other letters here (281 vs 198) -P | 448 -*/ static const char _valid_letters[] = {'A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R', 'S'}; // Number of words found: 281 @@ -253,7 +228,10 @@ static void display_streak(wordle_state_t *state) { char buf[12]; state->curr_screen = SCREEN_STREAK; #if USE_DAILY_STREAK - sprintf(buf, "WO St%2ddy", state->streak); + if (state->streak > 99) + sprintf(buf, "WO St--dy"); + else + sprintf(buf, "WO St%2ddy", state->streak); #else sprintf(buf, "WO St%4d", state->streak); #endif @@ -392,7 +370,8 @@ static void get_result(wordle_state_t *state) { if (exact_match) { state->playing = false; state->curr_screen = SCREEN_WIN; - state->streak++; + if (state->streak < 0x7F) + state->streak++; #if USE_DAILY_STREAK state->prev_day = get_day_unix_time(); #endif @@ -428,7 +407,7 @@ void wordle_face_activate(movement_settings_t *settings, void *context) { if (state->prev_day <= (now + (60 *60 * 24))) state->streak = 0; if (state->curr_day != now) state->playing = false; #endif - movement_request_tick_frequency(FREQ); + movement_request_tick_frequency(2); display_title(state); } @@ -485,7 +464,10 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi break; case EVENT_LIGHT_BUTTON_DOWN: case EVENT_ACTIVATE: + break; case EVENT_TIMEOUT: + if (state->curr_screen >= SCREEN_WIN) + display_title(state); break; case EVENT_LOW_ENERGY_UPDATE: if (state->curr_screen == SCREEN_TITLE) diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 91173341..b1375126 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -1,7 +1,7 @@ /* * MIT License * - * Copyright (c) 2024 <#author_name#> + * Copyright (c) 2024 * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -28,15 +28,37 @@ #include "movement.h" /* - * A DESCRIPTION OF YOUR WATCH FACE - * - * and a description of how use it + * Wordle Face + * A port of NY Times' Wordle game (https://www.nytimes.com/games/wordle/index.html) + * A random 5 letter word is chosen and you have WORDLE_MAX_ATTEMPTS attempts to guess it. + * Each guess must be a valid 5-letter word found in _legal_words in the C file. + * The only letters used are _valid_letters, also found in the C file. + * After a guess, the letters in the correct spot will remain, + * and the letters found in the word, but in the incorrect spot will blink. + * The screen after the title screen if a new game is started shows the streak of games won in a row. + * + * If USE_DAILY_STREAK is set to True, then the game can only be played once per day, + * and the streak resets to 0 if a day goes by without playing the game. + * + * Controls: + * Light Press + * If Playing: Next letter + * Else: Next screen + * Light Hold + * If Playing: Previous letter + * Else: None * + * Alarm Press + * If Playing: Next position + * Else: Next screen + * Alarm Hold + * If Playing: Previous position + * Else: None */ #define WORDLE_LENGTH 5 #define WORDLE_MAX_ATTEMPTS 6 -#define USE_DAILY_STREAK true +#define USE_DAILY_STREAK false typedef enum { WORDLE_LETTER_WRONG = 0, diff --git a/utils/wordle_list.py b/utils/wordle_face/wordle_list.py similarity index 88% rename from utils/wordle_list.py rename to utils/wordle_face/wordle_list.py index 1b5baf00..f0c894bd 100644 --- a/utils/wordle_list.py +++ b/utils/wordle_face/wordle_list.py @@ -1,4 +1,4 @@ -import random +import random, itertools, time, ast # From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff words = [ @@ -315,9 +315,12 @@ words = [ "YOUTH", "ZEBRA", "ZONES", ] -alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] +alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] def most_used_letters(): + ''' + Outputs how many times each letter is used in the words array. + ''' dicto = {} for i in alphabet: count = 0 @@ -334,12 +337,13 @@ def most_used_letters(): print(f"{k.upper()} | {dicto[k]}") -def list_of_valid_words(): - letters = ['e', 's', 'a', 'r', 'o', 'l', 'i', 'n', 'c', 'p'] +def list_of_valid_words(letters): + ''' + Outputs the array of valid words that can be made with the combination of letters. + ''' letters = sorted(letters) for i, letter in enumerate(letters): # Force all letters to be capitalized letters[i] = letter.upper() - legal_words = [] for word in words: valid_word = True @@ -349,7 +353,14 @@ def list_of_valid_words(): break if valid_word and word not in legal_words: legal_words.append(word) + return legal_words + +def print_valid_words(letters): + ''' + Prints the array of valid words that the wordle_face.c can use + ''' + legal_words = list_of_valid_words(letters) for i,word in enumerate(legal_words): legal_words[i] = word.upper().replace("D","d") random.shuffle(legal_words) @@ -373,7 +384,71 @@ def list_of_valid_words(): print('') print("};") + +def get_sec_val_and_units(seconds): + if seconds < 1: + return f"{round(seconds * 1000)} ms" + hours = int(seconds // 3600) + minutes = int((seconds % 3600) // 60) + secs = int(seconds % 60) + if hours > 0: + return f"{hours} hr {minutes} min {secs} sec" + elif minutes > 0: + return f"{minutes} min {secs} sec" + else: + return f"{secs} sec" + + +def txt_of_all_letter_combos(num_letters_in_set): + ''' + Creates a txt file that shows every combination of letters and how many words + their combo can make. + num_letters_in_set - How many letters should be in each combination + ''' + num_status_prints = 100 + dict_combos_counts = {} + print_iter = 0 + prev = time.time() + start = prev + letters_to_ignore = ['D','T'] # Don't diplay well on the watch + legal_letters = [item for item in alphabet if item not in letters_to_ignore] + print(f"Finding all {num_letters_in_set} letter combinations with the following letters: {legal_letters}") + all_combos = list(itertools.combinations(legal_letters, num_letters_in_set)) + len_all_combos = len(all_combos) + to_print = max(1, int(len_all_combos/ num_status_prints)) + print(f"Amount of Combos: {len_all_combos}") + estimated_prints = round(len_all_combos / to_print) + for i, letters in enumerate(all_combos): + letters = sorted(letters) + dict_combos_counts[repr(letters)] = len(list_of_valid_words(letters)) + print_iter+=1 + if print_iter >= to_print: + curr = time.time() + delta = curr - prev + time_passed = curr - start + total_time_estimate = delta * estimated_prints + time_left_estimate = (delta * estimated_prints) - time_passed + output = f"Time Passed: {get_sec_val_and_units(time_passed)} | " + output+= f"Amount of time for {to_print} items: {get_sec_val_and_units(delta)} | " + output+= f"Estimate for total: {get_sec_val_and_units(total_time_estimate)} | " + output+= f"items Left {len_all_combos - i} | " + output+= f"Percent Complete {round((100 * i) / len_all_combos)}% | " + output+= f"Estimated Time Left : {get_sec_val_and_units(time_left_estimate)}" + print(output) + prev = curr + print_iter = 0 + dict_combos_counts = dict(sorted(dict_combos_counts.items(), key=lambda item: item[1], reverse=True)) + + most_common_key = next(iter(dict_combos_counts)) + print(f"The Most Common Combo is: {most_common_key}") + print_valid_words(ast.literal_eval(most_common_key)) + + with open('output.txt', 'w') as file: + for key, value in dict_combos_counts.items(): + file.write(f'{key}: {value}\n') + + if __name__ == "__main__": most_used_letters() - list_of_valid_words() - + print_valid_words(['A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R', 'S']) + #txt_of_all_letter_combos(10) \ No newline at end of file From 580f8bf8eece137f2262686df60f482f037f4dd0 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 17 Aug 2024 06:33:14 -0400 Subject: [PATCH 11/53] bugfix on iterating to previous position --- movement/watch_faces/complication/wordle_face.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 1d40252c..98da99cf 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -98,7 +98,7 @@ static uint8_t get_next_pos(uint8_t curr_pos, WordleLetterResult *word_elements_ static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { if (curr_pos == 0) return 0; - for (size_t pos = curr_pos-1; pos > 0; pos--) { + for (int8_t pos = curr_pos-1; pos >= 0; pos--) { if (word_elements_result[pos] != WORDLE_LETTER_CORRECT) return pos; } From 10eda8b2080d3a353a9d1a0d99c3d313a421dd61 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 17 Aug 2024 06:19:31 -0400 Subject: [PATCH 12/53] Added expanded dictionary to check against --- .../watch_faces/complication/wordle_face.c | 144 +- utils/wordle_face/wordle_list.py | 1306 +++++++++++++---- 2 files changed, 1090 insertions(+), 360 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 98da99cf..9b1db1b8 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -30,46 +30,106 @@ #endif -// From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff static const char _valid_letters[] = {'A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R', 'S'}; -// Number of words found: 281 +// From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff +// Number of words found: 283 static const char _legal_words[][WORDLE_LENGTH + 1] = { - "SPIES", "SOLAR", "RAISE", "RARES", "PAEAN", "PLIES", "CRASS", "PEARS", "SNORE", - "POLES", "ROLLS", "ALOES", "LOSES", "SLICE", "PEACE", "POLLS", "POSES", "LANES", - "COPRA", "SPANS", "CANAL", "LOSER", "PAPER", "PILES", "CLASS", "RACER", "POOLS", - "PLAIN", "SPEAR", "SPARE", "INNER", "ALIEN", "NOSES", "EARLS", "SEALS", "LEARN", - "COLIC", "OPERA", "LOOSE", "SPOOR", "SCALE", "SOARS", "PAILS", "PRONE", "OPALS", - "PIPER", "RILLS", "CAIRN", "POISE", "LEAPS", "ELOPE", "NICER", "SLOOP", "PANES", - "SOLES", "CROSS", "NIECE", "LAIRS", "LEASE", "SALES", "SCENE", "SORES", "SNARL", - "SPIRE", "LASSO", "CLOSE", "OSIER", "SPOOL", "PRICE", "LOANS", "POSSE", "PENAL", - "SLAPS", "RELIC", "SINCE", "CIRCA", "LIARS", "RISES", "OPENS", "ROARS", "PACES", - "ARISE", "RISEN", "PENIS", "LAPEL", "CROPS", "CANON", "LAPSE", "SCION", "ARSON", - "AREAS", "SLAIN", "CANOE", "EERIE", "NOOSE", "PIANO", "PLANE", "CLASP", "SCARE", - "COCOA", "CRESS", "NASAL", "LOCAL", "RINSE", "SCARS", "PROPS", "OASES", "SLEEP", - "SNAPS", "SIRES", "CANES", "RAILS", "RESIN", "COLON", "PEASE", "POPES", "PENCE", - "AROSE", "REELS", "SALSA", "OCEAN", "PESOS", "OPINE", "RACES", "RAINS", "PRIES", - "CRIES", "CALLS", "PIERS", "CELLS", "SCRAP", "EARNS", "IRONS", "SPACE", "LOONS", - "SILLS", "COALS", "PIECE", "PALER", "REINS", "APACE", "SLOPE", "CREPE", "CONES", - "CAPER", "SEERS", "CAPES", "OASIS", "REAPS", "PALES", "CLAPS", "PLEAS", "INANE", - "COINS", "SNAIL", "CLEAR", "ROSIN", "LILAC", "SPARS", "SPINE", "NONCE", "CRISP", - "CRAPE", "AISLE", "CRONE", "SPOIL", "SPOON", "ARENA", "PARSE", "CASES", "SPICE", - "RIPER", "PILLS", "SOLOS", "SPINS", "PEERS", "RARER", "CONIC", "REARS", "CACAO", - "PAPAS", "ACRES", "ROPES", "CORAL", "CLEAN", "EASES", "SPILL", "SENSE", "PIPES", - "CLANS", "PRESS", "LOINS", "PAPAL", "APPLE", "PAIRS", "SCORN", "ALONE", "PEEPS", - "SPREE", "SNARE", "CLIPS", "EASEL", "CAROL", "ASPEN", "SALON", "LOOPS", "PEALS", - "SNEER", "PLACE", "SELLS", "LINEN", "CRIER", "ACORN", "SLIPS", "ERASE", "LIONS", - "NAILS", "REPEL", "CORES", "LEPER", "APPAL", "ROSES", "SCORE", "RISER", "CREEP", - "CAPON", "ERROR", "NOISE", "CARES", "APRON", "SOILS", "SLOPS", "PAINS", "EPICS", - "SANER", "SAILS", "PRIOR", "ASSES", "COILS", "SCOOP", "LACES", "SCALP", "CRANE", - "PLANS", "ISLES", "SPORE", "PANIC", "COOLS", "SPELL", "ALIAS", "PORES", "SCRIP", - "PEARL", "PANEL", "ENROL", "LANCE", "CORPS", "LINES", "COPSE", "ONION", "NEARS", - "RIPEN", "LINER", "SCOPE", "SCANS", "SNIPE", "CEASE", "LEANS", "AEONS", "PINES", - "POPPA", "ROLES", "REALS", "PERIL", "POSER", "PROSE", "POLAR", "CORNS", "LIENS", - "SIREN", "PEONS", + "PROSE", "SLOPE", "CLAPS", "CAIRN", "PLANE", "SPACE", "ARISE", "NEARS", "OPERA", + "EPICS", "LAIRS", "AISLE", "APRON", "SCRIP", "CARES", "PERIL", "PILES", "CLEAN", + "CLANS", "CANOE", "COALS", "RELIC", "CRANE", "SLICE", "RESIN", "NAILS", "LIARS", + "RISEN", "COILS", "RINSE", "PRIES", "PLEAS", "CAPON", "PARSE", "ROLES", "SPICE", + "CORAL", "LEARN", "SNIPE", "CAPER", "SIREN", "CORES", "CRAPE", "SPOIL", "EARNS", + "LANES", "PEALS", "RAINS", "ACRES", "SINCE", "LACES", "ROPES", "CLEAR", "PANIC", + "SCALE", "SANER", "CLOSE", "LINER", "CORNS", "SPINE", "SCARE", "ACORN", "PLANS", + "POSER", "SCORN", "AROSE", "LINES", "LIONS", "OCEAN", "SNAIL", "OSIER", "SCOPE", + "OPINE", "REINS", "COINS", "LOSER", "PANES", "RAISE", "RAILS", "ALIEN", "PLAIN", + "SNARE", "LOANS", "IRONS", "COPRA", "PLIES", "COPSE", "PEARS", "PALER", "SLAIN", + "LAPSE", "CONES", "ARSON", "POISE", "OPENS", "SPORE", "CAROL", "PACES", "LEAPS", + "ALONE", "ASPEN", "SNORE", "CRIES", "OPALS", "PENAL", "PAINS", "ENROL", "POLAR", + "SPEAR", "SCION", "POLES", "SCORE", "LEANS", "PEONS", "ROSIN", "REAPS", "SOLAR", + "EARLS", "PENIS", "PRICE", "REALS", "SCALP", "CLASP", "NOISE", "PANEL", "NICER", + "CRISP", "SPARE", "PEARL", "CORPS", "SALON", "RACES", "LOINS", "RIPEN", "PLACE", + "CRONE", "CANES", "LANCE", "LIENS", "ALOES", "PIANO", "PRONE", "PIERS", "SNARL", + "AEONS", "PINES", "SPIRE", "PAILS", "CAPES", "CLIPS", "PALES", "CROPS", "PAIRS", + "SCRAP", "PORES", "SALES", "COOLS", "SLOPS", "APACE", "CRIER", "ROLLS", "PIPES", + "SLIPS", "EASES", "PEACE", "CELLS", "POLLS", "POPPA", "SPREE", "RILLS", "SPILL", + "RIPER", "ONION", "ISLES", "CROSS", "PAPAS", "NOSES", "PAPAL", "SLEEP", "EERIE", + "SEALS", "PAPER", "COLOR", "SORES", "SPELL", "SNAPS", "SEERS", "SPARS", "PIPER", + "POSES", "LOOPS", "APPAL", "LOSES", "LINEN", "ROARS", "RARER", "NIECE", "LOCAL", + "NONCE", "CREEP", "SCARS", "SPOOR", "PEASE", "SIRES", "PRESS", "CLASS", "PAEAN", + "SPOOL", "LOOSE", "CRASS", "LILAC", "COLIC", "RACER", "CREPE", "NASAL", "SOLOS", + "ROSES", "COLON", "REPEL", "ASSES", "INANE", "SCENE", "SLAPS", "PEEPS", "LAPEL", + "PIECE", "LEPER", "REELS", "INNER", "PROPS", "SILLS", "LEASE", "SOLES", "CIRCA", + "CRESS", "SCANS", "SPOON", "REARS", "CACAO", "ERASE", "CANON", "SOARS", "SLOOP", + "AREAS", "SPINS", "OASIS", "OASES", "POPES", "ELOPE", "CEASE", "CINCO", "APPLE", + "NOOSE", "PEERS", "SENSE", "POOLS", "RISER", "PENCE", "POSSE", "ALIAS", "PESOS", + "SCOOP", "EASEL", "LOONS", "CONIC", "SPANS", "SPIES", "PRIOR", "SALSA", "SELLS", + "PILLS", "RISES", "RARES", "SNEER", "SOILS", "ARENA", "CASES", "CANAL", "SAILS", + "LASSO", "COCOA", "ERROR", "CALLS", +}; +// These are words that'll never be used, but still need to be in the dictionary for guesses. +// Top 100K most common words from Wiktionary https://gist.github.com/h3xx/1976236 +// Number of words found: 469 +static const char _expanded_words[][WORDLE_LENGTH + 1] = { + "PARIS", "APRIL", "SPAIN", "EINEN", "ASCII", "EINER", "SEINE", "AINSI", "ALICE", + "ALLES", "ALORS", "EINES", "ALLER", "PEINE", "PARCE", "CELLE", "CLARA", "ELLES", + "ELLEN", "OLISI", "ALLEN", "ISAAC", "APRES", "CROIS", "SANOI", "PASSE", "ELSIE", + "REINE", "ELLER", "AARON", "CLARE", "IRENE", "ANNIE", "ELLOS", "PARLE", "ALLAN", + "PELLE", "CAIRO", "SENOR", "PENSE", "CECIL", "SEELE", "ORION", "SELON", "COSAS", + "PASSA", "ELLIS", "CARLO", "ENNEN", "SILAS", "EENEN", "OSCAR", "ONCLE", "CESSE", + "SONNE", "ASSIS", "PRISE", "SERAI", "CELIA", "NOIRE", "NORSE", "SINNE", "LIESS", + "ELIAS", "REPOS", "COLIN", "NOIRS", "CLAIR", "CIELO", "PARLA", "SOINS", "LASSE", + "NELLA", "PAOLO", "SOLON", "REPAS", "NANCE", "PAINE", "SAISI", "ELISE", "CESAR", + "CANNA", "SALLE", "SINON", "SINAI", "LOIRE", "PENSA", "LEILA", "REISE", "ELLAS", + "POORE", "EARLE", "CERCA", "LEISE", "POOLE", "AILES", "SANOA", "LEONE", "LILLE", + "PROIE", "CARNE", "SPIEL", "CERES", "ENSIN", "ROLLO", "ARRAS", "SEIEN", "PRIER", + "ANNAN", "CALLE", "LIISA", "SALIR", "LESSE", "LESEN", "LIIAN", "NEERE", "ARIEL", + "PIENI", "PIERO", "ERANO", "ELENA", "SILLE", "NEALE", "SEENE", "ROLLE", "NELLE", + "SOLLE", "ESSER", "PASAR", "PREIS", "ASIAN", "SENCE", "ANSON", "SERRA", "CONAN", + "SERAS", "SIENA", "SOPRA", "RENEE", "ALINE", "CORSE", "ASSAI", "INSEL", "ROSIE", + "SONIA", "APPEL", "CRISE", "CIRCE", "LINIE", "RENAN", "CAIRE", "COLLA", "SANOO", + "EENER", "ANCOR", "NEPAL", "REINO", "LAINE", "SOONE", "ALAIN", "LAPSI", "INCAS", + "INNES", "CARON", "ROSEN", "CASAS", "NOLAN", "SERRE", "PESAR", "SEARS", "LEPIC", + "LISLE", "LOSSE", "CINNA", "SERIE", "RIRES", "CORSO", "SOIRS", "CREER", "POCOS", + "SIENS", "ARLES", "CROCE", "IONIC", "PONER", "ESSEN", "SANON", "CESSA", "SERIA", + "ALPES", "NINON", "LILLA", "AINOA", "CORPO", "LESER", "ILLIS", "ROPER", "ANNEE", + "PAIRE", "PEPIN", "ORIEL", "CANNE", "AIRES", "ARCIS", "EASIE", "ANNOS", "COLLE", + "SELLE", "EILEN", "CAPRI", "ERICA", "ROCCO", "ARIAN", "CLEON", "ALLIE", "PONCE", + "COPIE", "INNAN", "NOCES", "NAPPE", "CORNE", "ESIIN", "ENCOR", "LORNA", "SACRE", + "PAPEL", "SAILE", "SAEPE", "CREON", "LLENO", "ELISA", "PASSO", "ASILE", "LORCS", + "ASIAA", "SANIN", "ONNEN", "SONNA", "AILIE", "ALIIS", "ECOLE", "CREES", "PRESO", + "CLARO", "EARES", "ROSSI", "COREA", "SANAN", "AESOP", "SAPOR", "EISEN", "ACASO", + "PARAS", "NANON", "LAPIS", "ARRAN", "CLLIA", "SACRA", "PRINS", "CENCI", "CLAES", + "SLAAP", "ROLLA", "COLES", "LORNE", "OLELO", "CASSE", "NILES", "PASOS", "ESSAI", + "ROSAS", "LLENA", "LEERE", "CLASE", "CALOR", "ROSSE", "ALLEE", "SOREL", "SANAA", + "SLONE", "OLSEN", "OOREN", "PARER", "PASSI", "POSSA", "PLAIE", "OPERE", "SCAPE", + "POLEN", "RIPON", "SCALA", "AILLE", "PALOS", "CLAPP", "ESCAP", "ELLEI", "IONIA", + "NICOL", "PAESE", "PERON", "ORSON", "INNEN", "AISNE", "RANCE", "SLAAN", "PAOLI", + "COLLO", "ANNAS", "ERROL", "CLERC", "SAINE", "RAINA", "PRESE", "PARIA", "PERLE", + "RECAL", "SINAE", "PESER", "OISIN", "PLENA", "CARLE", "PERES", "SACAR", "ALPEN", + "CORRE", "ACCES", "RILLA", "ANNAL", "PERSE", "SAALE", "PERRO", "AILSA", "POCAS", + "SOLEN", "PLASE", "SOLIS", "PAPPI", "COPIA", "ARIES", "ROCCA", "ALIOS", "ROCAS", + "PELOS", "NEPOS", "COLPA", "ISORA", "LECON", "SOANE", "SNELL", "ILLOS", "PILAR", + "ECLAC", "PRESA", "SILLA", "NIELS", "LIPPO", "CROLL", "PONEN", "POSEE", "PIPPA", + "ILLAN", "CENIS", "SANNA", "RASSI", "CERRO", "SCENA", "CASOS", "COLPO", "POSSO", + "POSEN", "EINAR", "ISLAS", "IPSIS", "SALEN", "ASIEN", "CREAN", "LENIN", "LOCIS", + "NENNE", "ILION", "NARES", "ONNEA", "PALAA", "PIPPO", "POLIS", "RICOS", "ELSON", + "SNOOP", "ANNIS", "PROPE", "ELLIE", "ERNIE", "PLIER", "SERES", "REINA", "LIPPE", + "OLINE", "PARIE", "ARLEE", "NIAIS", "LEONI", "RAINE", "LARES", "SEINS", "CARRE", + "POILS", "ALENE", "LINEA", "NEARE", "PENSO", "PRISA", "CAPEL", "PAREA", "PEECE", + "SALIO", "COELO", "SCIRE", "NELLO", "LIENE", "ORICE", "EPAIS", "PERCE", "ALLIS", + "PEPLE", "LARNE", "NEILL", "OLLEN", "CASCA", "LAPIN", "OLLIE", "SALIC", "LIANE", + "REESE", "ELSLI", "SPION", "RIENS", "LILAS", "PAPPA", "ERRER", "SPISE", "CELIE", + "OLSON", "IRREN", "ARIAS", "ARION", "PASEO", "CAERE", "PISAN", "CARRO", "PAROI", + "NOONE", "SEPPI", "OPPIA", "SEALE", "LIPPI", "PELAS", "COCOS", "PLACA", "CONOR", + "LANCA", "OSASI", "ALOIS", "NAIRN", "PIENO", "SPASS", "SAONE", "ALNAR", "CARIA", + "PIENA", }; +static const uint16_t _num_unique_words = 155; // The _legal_words array begins with this many words where each letter is different. static const uint16_t _num_words = (sizeof(_legal_words) / sizeof(_legal_words[0])); +static const uint16_t _num_expanded_words = (sizeof(_expanded_words) / sizeof(_expanded_words[0])); static const uint8_t _num_valid_letters = (sizeof(_valid_letters) / sizeof(_valid_letters[0])); static uint32_t get_random(uint32_t max) { @@ -150,7 +210,17 @@ static uint32_t check_word_in_dict(uint8_t *word_elements) { } if (is_exact_match) return i; } - return _num_words; + for (uint16_t i = 0; i < _num_expanded_words; i++) { + is_exact_match = true; + for (size_t j = 0; j < WORDLE_LENGTH; j++) { + if (_valid_letters[word_elements[j]] != _expanded_words[i][j]) { + is_exact_match = false; + break; + } + } + if (is_exact_match) return _num_words + i; + } + return _num_words + _num_expanded_words; } static bool check_word(wordle_state_t *state) { @@ -206,7 +276,7 @@ static void reset_board(wordle_state_t *state) { state->word_elements_result[i] = WORDLE_LETTER_WRONG; } for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) { - state->guessed_words[i] = _num_words; + state->guessed_words[i] = _num_words + _num_expanded_words; } state->curr_answer = get_random(_num_words); state->attempt = 0; @@ -352,7 +422,7 @@ static bool act_on_btn(wordle_state_t *state) { static void get_result(wordle_state_t *state) { // Check if it's in the dict uint16_t in_dict = check_word_in_dict(state->word_elements); - if (in_dict == _num_words) { + if (in_dict == _num_words + _num_expanded_words) { display_not_in_dict(state); return; } diff --git a/utils/wordle_face/wordle_list.py b/utils/wordle_face/wordle_list.py index f0c894bd..d508a8be 100644 --- a/utils/wordle_face/wordle_list.py +++ b/utils/wordle_face/wordle_list.py @@ -1,323 +1,949 @@ import random, itertools, time, ast # From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff -words = [ - "ABACK", "ABAFT", "ABASE", "ABATE", "ABBEY", "ABBOT", "ABHOR", "ABIDE", "ABLER", "ABODE", - "ABOUT", "ABOVE", "ABUSE", "ABYSS", "ACHED", "ACHES", "ACIDS", "ACORN", "ACRES", "ACRID", - "ACTED", "ACTOR", "ACUTE", "ADAGE", "ADAPT", "ADDED", "ADDER", "ADEPT", "ADIEU", "ADMIT", - "ADOBE", "ADOPT", "ADORE", "ADORN", "ADULT", "AEGIS", "AEONS", "AFFIX", "AFIRE", "AFOOT", - "AFTER", "AGAIN", "AGAPE", "AGATE", "AGENT", "AGILE", "AGING", "AGLOW", "AGONY", "AGREE", - "AHEAD", "AIDED", "AIDES", "AILED", "AIMED", "AIRED", "AISLE", "ALARM", "ALBUM", "ALDER", - "ALERT", "ALIAS", "ALIBI", "ALIEN", "ALIKE", "ALIVE", "ALLAY", "ALLEY", "ALLOT", "ALLOW", - "ALLOY", "ALOES", "ALOFT", "ALONE", "ALONG", "ALOOF", "ALOUD", "ALPHA", "ALTAR", "ALTER", - "ALTOS", "AMASS", "AMAZE", "AMBER", "AMBLE", "AMEND", "AMIGO", "AMISS", "AMITY", "AMONG", - "AMOUR", "AMPLE", "AMPLY", "AMUSE", "ANGEL", "ANGER", "ANGLE", "ANGRY", "ANGST", "ANIME", - "ANKLE", "ANNEX", "ANNOY", "ANNUL", "ANTES", "ANTIC", "ANVIL", "APACE", "APART", "APING", - "APPAL", "APPLE", "APPLY", "APRON", "APTLY", "AREAS", "ARENA", "ARGUE", "ARISE", "ARMED", - "AROMA", "AROSE", "ARRAY", "ARROW", "ARSON", "ASHEN", "ASHES", "ASIDE", "ASKED", "ASKEW", - "ASPEN", "ASSAY", "ASSES", "ASSET", "ASTER", "ASTIR", "ATLAS", "ATOLL", "ATOMS", "ATONE", - "ATTAR", "ATTIC", "AUDIO", "AUDIT", "AUGER", "AUGHT", "AUGUR", "AUNTS", "AURAS", "AUTOS", - "AVAIL", "AVERS", "AVERT", "AVOID", "AVOWS", "AWAIT", "AWAKE", "AWARD", "AWARE", "AWFUL", - "AWOKE", "AXIOM", "AXLES", "AZURE", "BABEL", "BABES", "BACKS", "BACON", "BADGE", "BADLY", - "BAGGY", "BAITS", "BAIZE", "BAKED", "BAKER", "BALES", "BALLS", "BALMY", "BANAL", "BANDS", - "BANDY", "BANGS", "BANJO", "BANKS", "BANNS", "BARBS", "BARDS", "BARED", "BARGE", "BARKS", - "BARNS", "BARON", "BASAL", "BASED", "BASER", "BASES", "BASIC", "BASIL", "BASIN", "BASIS", - "BASSO", "BASTE", "BATCH", "BATED", "BATHE", "BATHS", "BATON", "BAYOU", "BEACH", "BEADS", - "BEADY", "BEAKS", "BEAMS", "BEANS", "BEARD", "BEARS", "BEAST", "BEAUX", "BEECH", "BEETS", - "BEFIT", "BEGAN", "BEGAT", "BEGET", "BEGIN", "BEGOT", "BEGUN", "BEING", "BELIE", "BELLE", - "BELLS", "BELLY", "BELOW", "BELTS", "BENCH", "BENDS", "BERGS", "BERRY", "BERTH", "BERYL", - "BESET", "BESOM", "BEVEL", "BIBLE", "BIDED", "BIDES", "BIGHT", "BIGOT", "BILGE", "BILLS", - "BILLY", "BINDS", "BIPED", "BIRCH", "BIRDS", "BIRTH", "BISON", "BITCH", "BITES", "BLACK", - "BLADE", "BLAME", "BLAND", "BLANK", "BLARE", "BLAST", "BLAZE", "BLEAK", "BLEAT", "BLEED", - "BLEND", "BLENT", "BLESS", "BLEST", "BLIND", "BLINK", "BLISS", "BLOCK", "BLOCS", "BLOND", - "BLOOD", "BLOOM", "BLOTS", "BLOWN", "BLOWS", "BLUER", "BLUES", "BLUFF", "BLUNT", "BLURT", - "BLUSH", "BOARD", "BOARS", "BOAST", "BOATS", "BODED", "BODES", "BOGGY", "BOGUS", "BOILS", - "BOLES", "BOLTS", "BOMBS", "BONDS", "BONED", "BONES", "BONNY", "BONUS", "BOOBY", "BOOKS", - "BOOMS", "BOONS", "BOORS", "BOOST", "BOOTH", "BOOTS", "BOOTY", "BOOZE", "BORAX", "BORED", - "BORES", "BORNE", "BOSOM", "BOUGH", "BOUND", "BOUTS", "BOWED", "BOWEL", "BOWER", "BOWLS", - "BOXED", "BOXER", "BOXES", "BRACE", "BRAGS", "BRAID", "BRAIN", "BRAKE", "BRAND", "BRASS", - "BRATS", "BRAVE", "BRAVO", "BRAWL", "BRAWN", "BREAD", "BREAK", "BREED", "BRIAR", "BRIBE", - "BRICK", "BRIDE", "BRIEF", "BRIER", "BRIGS", "BRIMS", "BRINE", "BRING", "BRINK", "BRINY", - "BRISK", "BROAD", "BROIL", "BROKE", "BROOD", "BROOK", "BROOM", "BROTH", "BROWN", "BROWS", - "BRUIN", "BRUNT", "BRUSH", "BRUTE", "BUCKS", "BUDGE", "BUGGY", "BUGLE", "BUILD", "BUILT", - "BULBS", "BULGE", "BULKS", "BULKY", "BULLS", "BULLY", "BUMPS", "BUNCH", "BUNKS", "BUOYS", - "BURLY", "BURNS", "BURNT", "BURRO", "BURRS", "BURST", "BUSHY", "BUSTS", "BUTTE", "BUTTS", - "BUXOM", "BUYER", "CABAL", "CABBY", "CABIN", "CABLE", "CACAO", "CACHE", "CADET", "CADRE", - "CAGED", "CAGES", "CAIRN", "CAKED", "CAKES", "CALLS", "CALMS", "CALYX", "CAMEL", "CAMEO", - "CAMPS", "CANAL", "CANDY", "CANES", "CANNY", "CANOE", "CANON", "CANTO", "CAPER", "CAPES", - "CAPON", "CARDS", "CARED", "CARES", "CARGO", "CAROL", "CARRY", "CARTS", "CARVE", "CASED", - "CASES", "CASKS", "CASTE", "CASTS", "CATCH", "CATER", "CAUSE", "CAVED", "CAVES", "CAVIL", - "CEASE", "CEDAR", "CEDED", "CELLS", "CENTS", "CHAFE", "CHAFF", "CHAIN", "CHAIR", "CHALK", - "CHAMP", "CHANT", "CHAOS", "CHAPS", "CHARM", "CHART", "CHARY", "CHASE", "CHASM", "CHATS", - "CHEAP", "CHEAT", "CHECK", "CHEEK", "CHEER", "CHEFS", "CHESS", "CHEST", "CHICK", "CHIDE", - "CHIEF", "CHILD", "CHILL", "CHIME", "CHINA", "CHINK", "CHINS", "CHIPS", "CHIRP", "CHOIR", - "CHOKE", "CHOPS", "CHORD", "CHOSE", "CHUCK", "CHUMP", "CHUMS", "CHUNK", "CHURL", "CHURN", - "CHUTE", "CIDER", "CIGAR", "CINCH", "CIRCA", "CITED", "CITES", "CIVET", "CIVIC", "CIVIL", - "CLACK", "CLAIM", "CLAMP", "CLAMS", "CLANG", "CLANK", "CLANS", "CLAPS", "CLASH", "CLASP", - "CLASS", "CLAWS", "CLEAN", "CLEAR", "CLEFS", "CLEFT", "CLERK", "CLEWS", "CLICK", "CLIFF", - "CLIMB", "CLIME", "CLING", "CLINK", "CLIPS", "CLOAK", "CLOCK", "CLODS", "CLOGS", "CLOSE", - "CLOTH", "CLOUD", "CLOUT", "CLOVE", "CLOWN", "CLUBS", "CLUCK", "CLUES", "CLUMP", "CLUNG", - "COACH", "COALS", "COAST", "COATS", "COBRA", "COCKS", "COCOA", "CODES", "COILS", "COINS", - "COLDS", "COLIC", "COLON", "COLTS", "COMBS", "COMER", "COMES", "COMET", "COMIC", "COMMA", - "CONCH", "CONES", "CONIC", "COOED", "COOKS", "COOLS", "COPRA", "COPSE", "CORAL", "CORDS", - "CORES", "CORKS", "CORNS", "CORPS", "COSTS", "COTES", "COUCH", "COUGH", "COULD", "COUNT", - "COUPE", "COUPS", "COURT", "COVER", "COVES", "COVET", "COVEY", "COWED", "COWER", "COYLY", - "COZEN", "CRABS", "CRACK", "CRAFT", "CRAGS", "CRAMP", "CRANE", "CRANK", "CRAPE", "CRASH", - "CRASS", "CRATE", "CRAVE", "CRAWL", "CRAZE", "CRAZY", "CREAK", "CREAM", "CREDO", "CREED", - "CREEK", "CREEP", "CREPE", "CREPT", "CRESS", "CREST", "CREWS", "CRIBS", "CRICK", "CRIED", - "CRIER", "CRIES", "CRIME", "CRIMP", "CRISP", "CROAK", "CROCK", "CRONE", "CRONY", "CROOK", - "CROPS", "CROSS", "CROUP", "CROWD", "CROWN", "CROWS", "CRUDE", "CRUEL", "CRUMB", "CRUSH", - "CRUST", "CRYPT", "CUBES", "CUBIC", "CUBIT", "CUFFS", "CULTS", "CURDS", "CURED", "CURES", - "CURLS", "CURLY", "CURRY", "CURSE", "CURST", "CURVE", "CYCLE", "CYNIC", "DADDY", "DAILY", - "DAIRY", "DAISY", "DALES", "DALLY", "DAMES", "DAMPS", "DANCE", "DANDY", "DARED", "DARES", - "DARTS", "DATED", "DATES", "DATUM", "DAUBS", "DAUNT", "DAWNS", "DAZED", "DEALS", "DEALT", - "DEANS", "DEARS", "DEATH", "DEBAR", "DEBIT", "DEBTS", "DEBUT", "DECAY", "DECKS", "DECOY", - "DECRY", "DEEDS", "DEEMS", "DEEPS", "DEFER", "DEIGN", "DEITY", "DELAY", "DELLS", "DELTA", - "DELVE", "DEMON", "DEMUR", "DENSE", "DENTS", "DEPOT", "DEPTH", "DERBY", "DESKS", "DETER", - "DEUCE", "DEVIL", "DIARY", "DICED", "DICES", "DICTA", "DIETS", "DIGIT", "DIKES", "DIMES", - "DIMLY", "DINED", "DINER", "DINES", "DINGY", "DIRGE", "DIRTY", "DISCS", "DISKS", "DITCH", - "DITTO", "DITTY", "DIVAN", "DIVED", "DIVER", "DIVES", "DIZZY", "DOCKS", "DODGE", "DOERS", - "DOGMA", "DOING", "DOLED", "DOLLS", "DOMED", "DOMES", "DONOR", "DOOMS", "DOORS", "DOSED", - "DOSES", "DOTED", "DOTES", "DOUBT", "DOUGH", "DOVES", "DOWDY", "DOWNS", "DOWNY", "DOWRY", - "DOZED", "DOZEN", "DRAFT", "DRAGS", "DRAIN", "DRAKE", "DRAMA", "DRAMS", "DRANK", "DRAPE", - "DRAWL", "DRAWN", "DRAWS", "DRAYS", "DREAD", "DREAM", "DREGS", "DRESS", "DRIED", "DRIER", - "DRIES", "DRIFT", "DRILL", "DRILY", "DRINK", "DRIPS", "DRIVE", "DROLL", "DRONE", "DROOP", - "DROPS", "DROSS", "DROVE", "DROWN", "DRUGS", "DRUMS", "DRUNK", "DRYLY", "DUCAL", "DUCAT", - "DUCHY", "DUCKS", "DUCTS", "DUELS", "DUETS", "DUKES", "DULLY", "DUMMY", "DUMPS", "DUMPY", - "DUNCE", "DUNES", "DUNNO", "DUPED", "DUPES", "DUSKY", "DUSTY", "DWARF", "DWELL", "DWELT", - "DYING", "DYKES", "EAGER", "EAGLE", "EARLS", "EARLY", "EARNS", "EARTH", "EASED", "EASEL", - "EASES", "EATEN", "EATER", "EAVES", "EBBED", "EBONY", "EDGED", "EDGES", "EDICT", "EDIFY", - "EERIE", "EGGED", "EIGHT", "EJECT", "ELATE", "ELBOW", "ELDER", "ELECT", "ELEGY", "ELFIN", - "ELITE", "ELOPE", "ELUDE", "ELVES", "EMAIL", "EMITS", "EMPTY", "ENACT", "ENDED", "ENDOW", - "ENEMY", "ENJOY", "ENNUI", "ENROL", "ENSUE", "ENTER", "ENTRY", "ENVOY", "EPICS", "EPOCH", - "EQUAL", "EQUIP", "ERASE", "ERECT", "ERRED", "ERROR", "ESSAY", "ETHER", "ETHIC", "EVADE", - "EVENT", "EVERY", "EVILS", "EVOKE", "EXACT", "EXALT", "EXCEL", "EXERT", "EXILE", "EXIST", - "EXITS", "EXPEL", "EXTOL", "EXTRA", "EXULT", "EYING", "EYRIE", "FABLE", "FACED", "FACES", - "FACTS", "FADED", "FADES", "FAILS", "FAINT", "FAIRS", "FAIRY", "FAITH", "FAKIR", "FALLS", - "FALSE", "FAMED", "FANCY", "FANGS", "FARCE", "FARED", "FARES", "FARMS", "FASTS", "FATAL", - "FATED", "FATES", "FATTY", "FAULT", "FAUNA", "FAUNS", "FAWNS", "FEARS", "FEAST", "FEATS", - "FEEDS", "FEELS", "FEIGN", "FEINT", "FELLS", "FELON", "FENCE", "FERAL", "FERNS", "FERRY", - "FETCH", "FETED", "FETID", "FETUS", "FEUDS", "FEVER", "FEWER", "FICHE", "FIEFS", "FIELD", - "FIEND", "FIERY", "FIFES", "FIFTH", "FIFTY", "FIGHT", "FILCH", "FILED", "FILES", "FILET", - "FILLS", "FILLY", "FILMS", "FILMY", "FILTH", "FINAL", "FINCH", "FINDS", "FINED", "FINER", - "FINES", "FINIS", "FINNY", "FIORD", "FIRED", "FIRES", "FIRMS", "FIRST", "FISHY", "FISTS", - "FITLY", "FIVES", "FIXED", "FIXER", "FIXES", "FJORD", "FLAGS", "FLAIL", "FLAIR", "FLAKE", - "FLAKY", "FLAME", "FLANK", "FLAPS", "FLARE", "FLASH", "FLASK", "FLATS", "FLAWS", "FLEAS", - "FLECK", "FLEES", "FLEET", "FLESH", "FLICK", "FLIER", "FLIES", "FLING", "FLINT", "FLIRT", - "FLITS", "FLOAT", "FLOCK", "FLOES", "FLOOD", "FLOOR", "FLORA", "FLOSS", "FLOUR", "FLOUT", - "FLOWN", "FLOWS", "FLUES", "FLUFF", "FLUID", "FLUKE", "FLUME", "FLUNG", "FLUSH", "FLUTE", - "FLYER", "FOAMS", "FOAMY", "FOCAL", "FOCUS", "FOGGY", "FOILS", "FOIST", "FOLDS", "FOLIO", - "FOLKS", "FOLLY", "FOODS", "FOOLS", "FORAY", "FORCE", "FORDS", "FORGE", "FORGO", "FORKS", - "FORMS", "FORTE", "FORTH", "FORTS", "FORTY", "FORUM", "FOUND", "FOUNT", "FOURS", "FOWLS", - "FOXES", "FOYER", "FRAIL", "FRAME", "FRANC", "FRANK", "FRAUD", "FREAK", "FREED", "FREER", - "FREES", "FRESH", "FRETS", "FRIAR", "FRIED", "FRILL", "FRISK", "FROCK", "FROGS", "FROND", - "FRONT", "FROST", "FROTH", "FROWN", "FROZE", "FRUIT", "FUDGE", "FUELS", "FUGUE", "FULLY", - "FUMED", "FUMES", "FUNDS", "FUNGI", "FUNNY", "FURRY", "FURZE", "FUSED", "FUSES", "FUSSY", - "FUZZY", "GABLE", "GAILY", "GAINS", "GALES", "GALLS", "GAMES", "GAMIN", "GAMMA", "GAMUT", - "GANGS", "GAPED", "GAPES", "GASES", "GASPS", "GATES", "GAUDY", "GAUGE", "GAUNT", "GAUZE", - "GAUZY", "GAVEL", "GAWKY", "GAYER", "GAYLY", "GAZED", "GAZER", "GAZES", "GEARS", "GEESE", - "GENIE", "GENII", "GENRE", "GENTS", "GENUS", "GERMS", "GHOST", "GIANT", "GIBES", "GIDDY", - "GIFTS", "GILDS", "GILLS", "GIMME", "GIPSY", "GIRDS", "GIRLS", "GIRTH", "GIVEN", "GIVES", - "GLADE", "GLAND", "GLARE", "GLASS", "GLAZE", "GLEAM", "GLEAN", "GLENS", "GLIDE", "GLINT", - "GLOAT", "GLOBE", "GLOOM", "GLORY", "GLOSS", "GLOVE", "GLOWS", "GLUED", "GNASH", "GNATS", - "GNAWS", "GNOME", "GOADS", "GOALS", "GOATS", "GODLY", "GOING", "GOLLY", "GONGS", "GONNA", - "GOODS", "GOODY", "GOOSE", "GORED", "GORGE", "GORSE", "GOTTA", "GOUGE", "GOURD", "GOUTY", - "GOWNS", "GRABS", "GRACE", "GRADE", "GRAFT", "GRAIN", "GRAMS", "GRAND", "GRANT", "GRAPE", - "GRAPH", "GRASP", "GRASS", "GRATE", "GRAVE", "GRAVY", "GRAZE", "GREAT", "GREED", "GREEN", - "GREET", "GREYS", "GRIEF", "GRILL", "GRIME", "GRIMY", "GRIND", "GRINS", "GRIPE", "GRIPS", - "GRIST", "GROAN", "GROIN", "GROOM", "GROPE", "GROSS", "GROUP", "GROVE", "GROWL", "GROWN", - "GROWS", "GRUBS", "GRUEL", "GRUFF", "GRUNT", "GUANO", "GUARD", "GUESS", "GUEST", "GUIDE", - "GUILD", "GUILE", "GUILT", "GUISE", "GULCH", "GULFS", "GULLS", "GULLY", "GUMMY", "GUSTO", - "GUSTS", "GUSTY", "GYPSY", "HABIT", "HACKS", "HAILS", "HAIRS", "HAIRY", "HALED", "HALLS", - "HALTS", "HALVE", "HANDS", "HANDY", "HANGS", "HAPPY", "HARDY", "HAREM", "HARES", "HARMS", - "HARPS", "HARPY", "HARRY", "HARSH", "HARTS", "HASTE", "HASTY", "HATCH", "HATED", "HATER", - "HAULS", "HAVEN", "HAVOC", "HAWKS", "HAZEL", "HEADS", "HEADY", "HEALS", "HEAPS", "HEARD", - "HEARS", "HEART", "HEATH", "HEATS", "HEAVE", "HEAVY", "HEDGE", "HEEDS", "HEELS", "HEIRS", - "HELIX", "HELLO", "HELMS", "HELPS", "HENCE", "HERBS", "HERDS", "HERON", "HEROS", "HEWED", - "HIDES", "HILLS", "HILLY", "HILTS", "HINDS", "HINGE", "HINTS", "HIRED", "HIRES", "HITCH", - "HIVES", "HOARD", "HOARY", "HOBBY", "HOIST", "HOLDS", "HOLES", "HOLLY", "HOMES", "HONEY", - "HOODS", "HOOFS", "HOOKS", "HOOPS", "HOOTS", "HOPED", "HOPES", "HORDE", "HORNS", "HORNY", - "HORSE", "HOSTS", "HOTEL", "HOTLY", "HOUND", "HOURS", "HOUSE", "HOVEL", "HOVER", "HOWLS", - "HULKS", "HULLS", "HUMAN", "HUMID", "HUMPS", "HUMUS", "HUNCH", "HUNTS", "HURLS", "HURRY", - "HURTS", "HUSKS", "HUSKY", "HUSSY", "HYDRA", "HYENA", "HYMNS", "ICILY", "ICING", "IDEAL", - "IDEAS", "IDIOM", "IDIOT", "IDLED", "IDLER", "IDOLS", "IDYLL", "IGLOO", "IMAGE", "IMBUE", - "IMPEL", "IMPLY", "INANE", "INCUR", "INDEX", "INEPT", "INERT", "INFER", "INGOT", "INLET", - "INNER", "INTER", "INURE", "IRATE", "IRKED", "IRONS", "IRONY", "ISLES", "ISLET", "ISSUE", - "ITEMS", "IVORY", "JACKS", "JADED", "JAILS", "JAUNT", "JEANS", "JEERS", "JELLY", "JERKS", - "JERKY", "JESTS", "JETTY", "JEWEL", "JIFFY", "JOINS", "JOINT", "JOKED", "JOKER", "JOKES", - "JOLLY", "JOUST", "JOYED", "JUDGE", "JUICE", "JUICY", "JUMPS", "JUNKS", "JUNTA", "JUROR", - "KARMA", "KEELS", "KEEPS", "KETCH", "KEYED", "KHAKI", "KICKS", "KILLS", "KINDA", "KINDS", - "KINGS", "KIOSK", "KITES", "KNACK", "KNAVE", "KNEAD", "KNEEL", "KNEES", "KNELL", "KNELT", - "KNIFE", "KNITS", "KNOBS", "KNOCK", "KNOLL", "KNOTS", "KNOWN", "KNOWS", "LABEL", "LACED", - "LACES", "LACKS", "LADEN", "LADLE", "LAGER", "LAIRS", "LAITY", "LAKES", "LAMBS", "LAMED", - "LAMES", "LAMPS", "LANCE", "LANDS", "LANES", "LANKY", "LAPEL", "LAPSE", "LARCH", "LARGE", - "LARGO", "LARKS", "LARVA", "LASSO", "LASTS", "LATCH", "LATER", "LATHE", "LATHS", "LAUGH", - "LAWNS", "LAYER", "LEADS", "LEAFY", "LEAKS", "LEAKY", "LEANS", "LEAPS", "LEAPT", "LEARN", - "LEASE", "LEASH", "LEAST", "LEAVE", "LEDGE", "LEECH", "LEEKS", "LEGAL", "LEMME", "LEMON", - "LENDS", "LEPER", "LEVEE", "LEVEL", "LEVER", "LIARS", "LIBEL", "LICKS", "LIEGE", "LIENS", - "LIFTS", "LIGHT", "LIKED", "LIKEN", "LIKER", "LIKES", "LILAC", "LIMBO", "LIMBS", "LIMES", - "LIMIT", "LINED", "LINEN", "LINER", "LINES", "LINGO", "LINKS", "LIONS", "LISTS", "LITHE", - "LIVED", "LIVER", "LIVES", "LIVID", "LLAMA", "LOADS", "LOAMY", "LOANS", "LOATH", "LOBBY", - "LOBES", "LOCAL", "LOCKS", "LOCUS", "LODGE", "LOFTY", "LOGES", "LOGIC", "LOGIN", "LOINS", - "LONGS", "LOOKS", "LOOMS", "LOONS", "LOOPS", "LOOSE", "LORDS", "LOSER", "LOSES", "LOTUS", - "LOUSE", "LOUSY", "LOVED", "LOVER", "LOVES", "LOWED", "LOWER", "LOWLY", "LOYAL", "LUCID", - "LUCKY", "LULLS", "LUMPS", "LUMPY", "LUNAR", "LUNCH", "LUNGE", "LUNGS", "LURCH", "LURED", - "LURES", "LURID", "LURKS", "LUSTS", "LUSTY", "LUTES", "LYING", "LYMPH", "LYNCH", "LYRIC", - "MACES", "MADAM", "MADLY", "MAGIC", "MAIDS", "MAILS", "MAINS", "MAIZE", "MAJOR", "MAKER", - "MAKES", "MALES", "MAMMA", "MANES", "MANGA", "MANGE", "MANGO", "MANGY", "MANIA", "MANLY", - "MANNA", "MANOR", "MANSE", "MAPLE", "MARCH", "MARES", "MARKS", "MARRY", "MARSH", "MARTS", - "MASKS", "MASON", "MASTS", "MATCH", "MATED", "MATES", "MAUVE", "MAXIM", "MAYBE", "MAYOR", - "MAZES", "MEALS", "MEALY", "MEANS", "MEANT", "MEATS", "MEDAL", "MEDIA", "MEETS", "MELON", - "MELTS", "MEMES", "MENDS", "MENUS", "MERCY", "MERES", "MERGE", "MERIT", "MERRY", "MESAS", - "METAL", "METED", "METER", "MEWED", "MIDST", "MIENS", "MIGHT", "MILCH", "MILES", "MILKY", - "MILLS", "MIMES", "MIMIC", "MINCE", "MINDS", "MINED", "MINER", "MINES", "MINOR", "MINTS", - "MINUS", "MIRTH", "MISER", "MISTS", "MITES", "MIXED", "MIXES", "MOANS", "MOATS", "MOCKS", - "MODEL", "MODEM", "MODES", "MOIST", "MOLAR", "MOLES", "MOMMA", "MONEY", "MONKS", "MONTH", - "MOODS", "MOODY", "MOONS", "MOORS", "MOOSE", "MOPED", "MORAL", "MORES", "MOSSY", "MOTES", - "MOTHS", "MOTIF", "MOTOR", "MOTTO", "MOUND", "MOUNT", "MOURN", "MOUSE", "MOUTH", "MOVED", - "MOVER", "MOVES", "MOVIE", "MOWED", "MOWER", "MUCUS", "MUDDY", "MULES", "MULTI", "MUMMY", - "MUMPS", "MUNCH", "MURAL", "MURKY", "MUSED", "MUSES", "MUSIC", "MUSKY", "MUSTY", "MUTED", - "MUTES", "MYRRH", "MYTHS", "NABOB", "NAILS", "NAIVE", "NAKED", "NAMED", "NAMES", "NASAL", - "NASTY", "NATAL", "NATTY", "NAVAL", "NAVEL", "NAVES", "NEARS", "NECKS", "NEEDS", "NEEDY", - "NEIGH", "NERVE", "NESTS", "NEVER", "NEWER", "NEWLY", "NICER", "NICHE", "NIECE", "NIGHT", - "NINNY", "NOBLE", "NOBLY", "NOISE", "NOISY", "NOMAD", "NONCE", "NOOKS", "NOOSE", "NORTH", - "NOSED", "NOSES", "NOTCH", "NOTED", "NOTES", "NOUNS", "NOVEL", "NUDGE", "NURSE", "NYMPH", - "OAKEN", "OAKUM", "OASES", "OASIS", "OATEN", "OATHS", "OBESE", "OBEYS", "OCCUR", "OCEAN", - "OCHRE", "ODDER", "ODDLY", "ODIUM", "OFFAL", "OFFER", "OFTEN", "OILED", "OLDEN", "OLDER", - "OMENS", "OMITS", "ONION", "ONSET", "OOZED", "OOZES", "OPALS", "OPENS", "OPERA", "OPINE", - "OPIUM", "OPTIC", "ORBIT", "ORDER", "ORGAN", "OSIER", "OTHER", "OTTER", "OUGHT", "OUNCE", - "OUTDO", "OUTER", "OVALS", "OVARY", "OVENS", "OVERT", "OWING", "OWNED", "OWNER", "OXIDE", - "OZONE", "PACES", "PACKS", "PADDY", "PADRE", "PAEAN", "PAGAN", "PAGES", "PAILS", "PAINS", - "PAINT", "PAIRS", "PALED", "PALER", "PALES", "PALMS", "PALMY", "PALSY", "PANEL", "PANES", - "PANGS", "PANIC", "PANSY", "PANTS", "PAPAL", "PAPAS", "PAPER", "PARED", "PARKA", "PARKS", - "PARRY", "PARSE", "PARTS", "PARTY", "PASHA", "PASTE", "PASTY", "PATCH", "PATES", "PATHS", - "PATIO", "PAUSE", "PAVED", "PAWED", "PAWNS", "PAYED", "PAYER", "PEACE", "PEACH", "PEAKS", - "PEALS", "PEARL", "PEARS", "PEASE", "PECKS", "PEDAL", "PEEPS", "PEERS", "PELTS", "PENAL", - "PENCE", "PENIS", "PENNY", "PEONS", "PERCH", "PERIL", "PESKY", "PESOS", "PESTS", "PETAL", - "PETTY", "PHASE", "PHIAL", "PHONE", "PHOTO", "PIANO", "PICKS", "PIECE", "PIERS", "PIETY", - "PIGMY", "PIKES", "PILED", "PILES", "PILLS", "PILOT", "PINCH", "PINED", "PINES", "PINKS", - "PINTO", "PINTS", "PIOUS", "PIPED", "PIPER", "PIPES", "PIQUE", "PITCH", "PITHY", "PIVOT", - "PLACE", "PLAID", "PLAIN", "PLAIT", "PLANE", "PLANK", "PLANS", "PLANT", "PLATE", "PLAYS", - "PLAZA", "PLEAD", "PLEAS", "PLIED", "PLIES", "PLOTS", "PLUCK", "PLUGS", "PLUMB", "PLUME", - "PLUMS", "PLUSH", "PODIA", "POEMS", "POESY", "POETS", "POINT", "POISE", "POKED", "POKER", - "POKES", "POLAR", "POLES", "POLKA", "POLLS", "PONDS", "POOLS", "POPES", "POPPA", "POPPY", - "PORCH", "PORED", "PORES", "PORTS", "POSED", "POSER", "POSES", "POSSE", "POSTS", "POUCH", - "POUND", "POURS", "POWER", "PRANK", "PRATE", "PRAYS", "PRESS", "PREYS", "PRICE", "PRICK", - "PRIDE", "PRIED", "PRIES", "PRIME", "PRINT", "PRIOR", "PRISM", "PRIVY", "PRIZE", "PROBE", - "PRONE", "PROOF", "PROPS", "PROSE", "PROSY", "PROUD", "PROVE", "PROWL", "PROWS", "PROXY", - "PRUDE", "PRUNE", "PSALM", "PSHAW", "PUDGY", "PUFFS", "PUFFY", "PULLS", "PULPY", "PULSE", - "PUMPS", "PUNCH", "PUPIL", "PUPPY", "PUREE", "PURER", "PURGE", "PURSE", "PUSSY", "PUTTY", - "QUACK", "QUAFF", "QUAIL", "QUAKE", "QUALM", "QUART", "QUASI", "QUAYS", "QUEEN", "QUEER", - "QUELL", "QUERY", "QUEST", "QUEUE", "QUICK", "QUIET", "QUILL", "QUILT", "QUIPS", "QUIRE", - "QUITE", "QUITS", "QUOTA", "QUOTE", "QUOTH", "RABBI", "RABID", "RACED", "RACER", "RACES", - "RACKS", "RADII", "RADIO", "RAFTS", "RAGED", "RAGES", "RAIDS", "RAILS", "RAINS", "RAINY", - "RAISE", "RAJAH", "RAKED", "RAKES", "RALLY", "RANCH", "RANGE", "RANKS", "RAPID", "RARER", - "RARES", "RATED", "RATES", "RATIO", "RAVED", "RAVEN", "RAVES", "RAYON", "RAZED", "RAZOR", - "REACH", "REACT", "READS", "READY", "REALM", "REALS", "REAMS", "REAPS", "REARS", "REBEL", - "REBUS", "REBUT", "RECUR", "REEDS", "REEDY", "REEFS", "REEKS", "REELS", "REEVE", "REFER", - "REFIT", "REGAL", "REIGN", "REINS", "RELAX", "RELAY", "RELIC", "REMIT", "RENDS", "RENEW", - "RENTS", "REPAY", "REPEL", "REPLY", "RESET", "RESIN", "RESTS", "REVEL", "REVUE", "RHEUM", - "RHYME", "RICKS", "RIDER", "RIDES", "RIDGE", "RIFLE", "RIFTS", "RIGHT", "RIGID", "RILED", - "RILLS", "RIMES", "RINGS", "RINSE", "RIOTS", "RIPEN", "RIPER", "RISEN", "RISER", "RISES", - "RISKS", "RISKY", "RITES", "RIVAL", "RIVEN", "RIVER", "RIVET", "ROADS", "ROAMS", "ROARS", - "ROAST", "ROBED", "ROBES", "ROBIN", "ROCKS", "ROCKY", "ROGUE", "ROLES", "ROLLS", "ROMAN", - "ROOFS", "ROOKS", "ROOMS", "ROOMY", "ROOST", "ROOTS", "ROPED", "ROPES", "ROSES", "ROSIN", - "ROUGE", "ROUGH", "ROUND", "ROUSE", "ROUTE", "ROUTS", "ROVED", "ROVER", "ROWDY", "ROWED", - "ROYAL", "RUDER", "RUFFS", "RUINS", "RULED", "RULER", "RULES", "RUNES", "RUNGS", "RUPEE", - "RURAL", "RUSES", "SABLE", "SABRE", "SACKS", "SADLY", "SAFER", "SAGAS", "SAGES", "SAHIB", - "SAILS", "SAINT", "SAITH", "SALAD", "SALES", "SALLY", "SALON", "SALSA", "SALTS", "SALTY", - "SALVE", "SALVO", "SANDS", "SANDY", "SANER", "SATED", "SATIN", "SATYR", "SAUCE", "SAUCY", - "SAVED", "SAVES", "SAWED", "SCALD", "SCALE", "SCALP", "SCALY", "SCAMP", "SCANS", "SCANT", - "SCARE", "SCARF", "SCARS", "SCENE", "SCENT", "SCION", "SCOFF", "SCOLD", "SCOOP", "SCOPE", - "SCORE", "SCORN", "SCOUR", "SCOUT", "SCOWL", "SCRAP", "SCREW", "SCRIP", "SCRUB", "SCULL", - "SEALS", "SEAMS", "SEAMY", "SEATS", "SECTS", "SEDAN", "SEDGE", "SEEDS", "SEEDY", "SEEKS", - "SEEMS", "SEERS", "SEIZE", "SELLS", "SEMEN", "SENDS", "SENSE", "SERFS", "SERGE", "SERUM", - "SERVE", "SEVEN", "SEVER", "SEWED", "SEWER", "SEXES", "SHACK", "SHADE", "SHADY", "SHAFT", - "SHAKE", "SHAKY", "SHALE", "SHALL", "SHALT", "SHAME", "SHAMS", "SHANK", "SHAPE", "SHARE", - "SHARK", "SHARP", "SHAVE", "SHAWL", "SHEAF", "SHEAR", "SHEDS", "SHEEN", "SHEEP", "SHEER", - "SHEET", "SHEIK", "SHELF", "SHELL", "SHIED", "SHIFT", "SHINE", "SHINS", "SHINY", "SHIPS", - "SHIRE", "SHIRK", "SHIRT", "SHOAL", "SHOCK", "SHOES", "SHONE", "SHOOK", "SHOON", "SHOOT", - "SHOPS", "SHORE", "SHORN", "SHORT", "SHOTS", "SHOUT", "SHOVE", "SHOWN", "SHOWS", "SHOWY", - "SHRED", "SHREW", "SHRUB", "SHRUG", "SHUNS", "SHUTS", "SHYLY", "SIBYL", "SIDED", "SIDES", - "SIEGE", "SIEVE", "SIGHS", "SIGHT", "SIGMA", "SIGNS", "SILKS", "SILKY", "SILLS", "SILLY", - "SINCE", "SINEW", "SINGE", "SINGS", "SINKS", "SIREN", "SIRES", "SITES", "SIXES", "SIXTH", - "SIXTY", "SIZED", "SIZES", "SKATE", "SKEIN", "SKIES", "SKIFF", "SKILL", "SKIMS", "SKINS", - "SKIPS", "SKIRT", "SKULK", "SKULL", "SKUNK", "SLABS", "SLACK", "SLAGS", "SLAIN", "SLAKE", - "SLANG", "SLANT", "SLAPS", "SLASH", "SLATE", "SLATS", "SLAVE", "SLAYS", "SLEDS", "SLEEK", - "SLEEP", "SLEET", "SLEPT", "SLICE", "SLICK", "SLIDE", "SLILY", "SLIME", "SLIMY", "SLING", - "SLINK", "SLIPS", "SLITS", "SLOOP", "SLOPE", "SLOPS", "SLOTH", "SLUGS", "SLUMP", "SLUMS", - "SLUNG", "SLUNK", "SLUSH", "SLYLY", "SMACK", "SMALL", "SMART", "SMASH", "SMEAR", "SMELL", - "SMELT", "SMILE", "SMIRK", "SMITE", "SMITH", "SMOCK", "SMOKE", "SMOKY", "SMOTE", "SNACK", - "SNAGS", "SNAIL", "SNAKE", "SNAKY", "SNAPS", "SNARE", "SNARL", "SNEAK", "SNEER", "SNIFF", - "SNIPE", "SNOBS", "SNORE", "SNORT", "SNOUT", "SNOWS", "SNOWY", "SNUFF", "SOAPY", "SOARS", - "SOBER", "SOCKS", "SOFAS", "SOGGY", "SOILS", "SOLAR", "SOLES", "SOLID", "SOLOS", "SOLVE", - "SONGS", "SONNY", "SOOTH", "SOOTY", "SORES", "SORRY", "SORTS", "SOUGH", "SOULS", "SOUND", - "SOUPS", "SOUSE", "SOUTH", "SOWED", "SOWER", "SPACE", "SPADE", "SPAKE", "SPANK", "SPANS", - "SPARE", "SPARK", "SPARS", "SPASM", "SPAWN", "SPEAK", "SPEAR", "SPECK", "SPEED", "SPELL", - "SPELT", "SPEND", "SPENT", "SPERM", "SPICE", "SPICY", "SPIED", "SPIES", "SPIKE", "SPILL", - "SPILT", "SPINE", "SPINS", "SPINY", "SPIRE", "SPITE", "SPITS", "SPLIT", "SPOIL", "SPOKE", - "SPOOK", "SPOOL", "SPOON", "SPOOR", "SPORE", "SPORT", "SPOTS", "SPOUT", "SPRAY", "SPREE", - "SPRIG", "SPUNK", "SPURN", "SPURS", "SPURT", "SQUAD", "SQUAT", "SQUAW", "STABS", "STACK", - "STAFF", "STAGE", "STAGS", "STAID", "STAIN", "STAIR", "STAKE", "STALE", "STALK", "STALL", - "STAMP", "STAND", "STANK", "STARE", "STARK", "STARS", "START", "STATE", "STAVE", "STAYS", - "STEAD", "STEAK", "STEAL", "STEAM", "STEED", "STEEL", "STEEP", "STEER", "STEMS", "STEPS", - "STERN", "STEWS", "STICK", "STIFF", "STILE", "STILL", "STING", "STINK", "STINT", "STIRS", - "STOCK", "STOIC", "STOLE", "STONE", "STONY", "STOOD", "STOOL", "STOOP", "STOPS", "STORE", - "STORK", "STORM", "STORY", "STOUT", "STOVE", "STRAP", "STRAW", "STRAY", "STREW", "STRIP", - "STRUT", "STUCK", "STUDS", "STUDY", "STUFF", "STUMP", "STUNG", "STUNT", "STYLE", "SUAVE", - "SUCKS", "SUGAR", "SUING", "SUITE", "SUITS", "SULKS", "SULKY", "SULLY", "SUNNY", "SUPER", - "SURER", "SURGE", "SURLY", "SWAIN", "SWAMP", "SWANS", "SWARD", "SWARM", "SWAYS", "SWEAR", - "SWEAT", "SWEEP", "SWEET", "SWELL", "SWEPT", "SWIFT", "SWILL", "SWIMS", "SWINE", "SWING", - "SWIRL", "SWISH", "SWOON", "SWOOP", "SWORD", "SWORE", "SWORN", "SWUNG", "SYNOD", "SYRUP", - "TABBY", "TABLE", "TABOO", "TACIT", "TACKS", "TAILS", "TAINT", "TAKEN", "TAKES", "TALES", - "TALKS", "TALLY", "TALON", "TAMED", "TAMER", "TANKS", "TAPER", "TAPES", "TARDY", "TARES", - "TARRY", "TARTS", "TASKS", "TASTE", "TASTY", "TAUNT", "TAWNY", "TAXED", "TAXES", "TEACH", - "TEAMS", "TEARS", "TEASE", "TEEMS", "TEENS", "TEETH", "TELLS", "TEMPI", "TEMPO", "TEMPS", - "TENDS", "TENET", "TENOR", "TENSE", "TENTH", "TENTS", "TEPEE", "TEPID", "TERMS", "TERSE", - "TESTS", "TESTY", "TEXTS", "THANK", "THEFT", "THEIR", "THEME", "THERE", "THESE", "THICK", - "THIEF", "THIGH", "THINE", "THING", "THINK", "THIRD", "THONG", "THORN", "THOSE", "THREE", - "THREW", "THROB", "THROE", "THROW", "THUMB", "THUMP", "THYME", "TIARA", "TIBIA", "TICKS", - "TIDAL", "TIDES", "TIERS", "TIGER", "TIGHT", "TILDE", "TILED", "TILES", "TILLS", "TILTS", - "TIMED", "TIMES", "TIMID", "TINGE", "TINTS", "TIPSY", "TIRED", "TIRES", "TITHE", "TITLE", - "TOADS", "TOAST", "TODAY", "TODDY", "TOILS", "TOKEN", "TOLLS", "TOMBS", "TOMES", "TONED", - "TONES", "TONGS", "TONIC", "TOOLS", "TOOTH", "TOPAZ", "TOPIC", "TOQUE", "TORCH", "TORSO", - "TORTS", "TOTAL", "TOTEM", "TOUCH", "TOUGH", "TOURS", "TOWED", "TOWEL", "TOWER", "TOWNS", - "TOXIC", "TOYED", "TRACE", "TRACK", "TRACT", "TRADE", "TRAIL", "TRAIN", "TRAIT", "TRAMP", - "TRAMS", "TRAPS", "TRASH", "TRAYS", "TREAD", "TREAT", "TREED", "TREES", "TREND", "TRESS", - "TRIAD", "TRIAL", "TRIBE", "TRICE", "TRICK", "TRIED", "TRIES", "TRILL", "TRIPE", "TRIPS", - "TRITE", "TROLL", "TROOP", "TROTH", "TROTS", "TROUT", "TRUCE", "TRUCK", "TRUER", "TRULY", - "TRUMP", "TRUNK", "TRUSS", "TRUST", "TRUTH", "TRYST", "TUBES", "TUFTS", "TULIP", "TULLE", - "TUNED", "TUNES", "TUNIC", "TURNS", "TUSKS", "TUTOR", "TWAIN", "TWANG", "TWEED", "TWICE", - "TWIGS", "TWINE", "TWINS", "TWIRL", "TWIST", "TYING", "TYPED", "TYPES", "UDDER", "ULCER", - "ULTRA", "UNCLE", "UNCUT", "UNDER", "UNDID", "UNDUE", "UNFIT", "UNION", "UNITE", "UNITS", - "UNITY", "UNSAY", "UNTIE", "UNTIL", "UPPER", "UPSET", "URBAN", "URGED", "URGES", "URINE", - "USAGE", "USERS", "USHER", "USING", "USUAL", "USURP", "USURY", "UTTER", "VAGUE", "VALES", - "VALET", "VALID", "VALUE", "VALVE", "VANES", "VAPID", "VASES", "VAULT", "VAUNT", "VEILS", - "VEINS", "VELDT", "VENAL", "VENOM", "VENTS", "VENUE", "VERBS", "VERGE", "VERSE", "VERVE", - "VESTS", "VEXED", "VEXES", "VIALS", "VICAR", "VICES", "VIDEO", "VIEWS", "VIGIL", "VILER", - "VILLA", "VINES", "VIOLA", "VIPER", "VIRUS", "VISIT", "VISOR", "VISTA", "VITAL", "VIVID", - "VIXEN", "VIZOR", "VOCAL", "VODKA", "VOGUE", "VOICE", "VOILE", "VOLTS", "VOMIT", "VOTED", - "VOTER", "VOTES", "VOUCH", "VOWED", "VOWEL", "VYING", "WADED", "WAFER", "WAFTS", "WAGED", - "WAGER", "WAGES", "WAGON", "WAIFS", "WAILS", "WAIST", "WAITS", "WAIVE", "WAKED", "WAKEN", - "WAKES", "WALKS", "WALLS", "WALTZ", "WANDS", "WANED", "WANES", "WANTS", "WARDS", "WARES", - "WARMS", "WARNS", "WARTS", "WASPS", "WASTE", "WATCH", "WATER", "WAVED", "WAVER", "WAVES", - "WAXED", "WAXEN", "WAXES", "WEARS", "WEARY", "WEAVE", "WEDGE", "WEEDS", "WEEDY", "WEEKS", - "WEEPS", "WEIGH", "WEIRD", "WELCH", "WELLS", "WENCH", "WHACK", "WHALE", "WHARF", "WHEAT", - "WHEEL", "WHELP", "WHERE", "WHICH", "WHIFF", "WHILE", "WHIMS", "WHINE", "WHIPS", "WHIRL", - "WHIRR", "WHISK", "WHIST", "WHITE", "WHOLE", "WHOOP", "WHORE", "WHOSE", "WICKS", "WIDEN", - "WIDER", "WIDOW", "WIDTH", "WIELD", "WIGHT", "WILDS", "WILES", "WILLS", "WINCE", "WINCH", - "WINDS", "WINDY", "WINES", "WINGS", "WINKS", "WIPED", "WIPES", "WIRED", "WIRES", "WISER", - "WISPS", "WITCH", "WITTY", "WIVES", "WOMAN", "WOMEN", "WOODS", "WOODY", "WOOED", "WOOER", - "WORDS", "WORDY", "WORKS", "WORLD", "WORMS", "WORRY", "WORSE", "WORST", "WORTH", "WOULD", - "WOUND", "WRACK", "WRAPS", "WRAPT", "WRATH", "WREAK", "WRECK", "WREST", "WRING", "WRIST", - "WRITE", "WRITS", "WRONG", "WROTE", "WROTH", "YACHT", "YARDS", "YARNS", "YAWNS", "YEARN", - "YEARS", "YEAST", "YELLS", "YELPS", "YIELD", "YOKED", "YOKES", "YOLKS", "YOUNG", "YOURS", - "YOUTH", "ZEBRA", "ZONES", +legal_list = [ + "ABACK", "ABAFT", "ABASE", "ABATE", "ABBEY", "ABBOT", "ABHOR", "ABIDE", "ABLER", "ABODE", "ABOUT", "ABOVE", + "ABUSE", "ABYSS", "ACHED", "ACHES", "ACIDS", "ACORN", "ACRES", "ACRID", "ACTED", "ACTOR", "ACUTE", "ADAGE", + "ADAPT", "ADDED", "ADDER", "ADEPT", "ADIEU", "ADMIT", "ADOBE", "ADOPT", "ADORE", "ADORN", "ADULT", "AEGIS", + "AEONS", "AFFIX", "AFIRE", "AFOOT", "AFTER", "AGAIN", "AGAPE", "AGATE", "AGENT", "AGILE", "AGING", "AGLOW", + "AGONY", "AGREE", "AHEAD", "AIDED", "AIDES", "AILED", "AIMED", "AIRED", "AISLE", "ALARM", "ALBUM", "ALDER", + "ALERT", "ALIAS", "ALIBI", "ALIEN", "ALIKE", "ALIVE", "ALLAY", "ALLEY", "ALLOT", "ALLOW", "ALLOY", "ALOES", + "ALOFT", "ALONE", "ALONG", "ALOOF", "ALOUD", "ALPHA", "ALTAR", "ALTER", "ALTOS", "AMASS", "AMAZE", "AMBER", + "AMBLE", "AMEND", "AMIGO", "AMISS", "AMITY", "AMONG", "AMOUR", "AMPLE", "AMPLY", "AMUSE", "ANGEL", "ANGER", + "ANGLE", "ANGRY", "ANGST", "ANIME", "ANKLE", "ANNEX", "ANNOY", "ANNUL", "ANTES", "ANTIC", "ANVIL", "APACE", + "APART", "APING", "APPAL", "APPLE", "APPLY", "APRON", "APTLY", "AREAS", "ARENA", "ARGUE", "ARISE", "ARMED", + "AROMA", "AROSE", "ARRAY", "ARROW", "ARSON", "ASHEN", "ASHES", "ASIDE", "ASKED", "ASKEW", "ASPEN", "ASSAY", + "ASSES", "ASSET", "ASTER", "ASTIR", "ATLAS", "ATOLL", "ATOMS", "ATONE", "ATTAR", "ATTIC", "AUDIO", "AUDIT", + "AUGER", "AUGHT", "AUGUR", "AUNTS", "AURAS", "AUTOS", "AVAIL", "AVERS", "AVERT", "AVOID", "AVOWS", "AWAIT", + "AWAKE", "AWARD", "AWARE", "AWFUL", "AWOKE", "AXIOM", "AXLES", "AZURE", "BABEL", "BABES", "BACKS", "BACON", + "BADGE", "BADLY", "BAGGY", "BAITS", "BAIZE", "BAKED", "BAKER", "BALES", "BALLS", "BALMY", "BANAL", "BANDS", + "BANDY", "BANGS", "BANJO", "BANKS", "BANNS", "BARBS", "BARDS", "BARED", "BARGE", "BARKS", "BARNS", "BARON", + "BASAL", "BASED", "BASER", "BASES", "BASIC", "BASIL", "BASIN", "BASIS", "BASSO", "BASTE", "BATCH", "BATED", + "BATHE", "BATHS", "BATON", "BAYOU", "BEACH", "BEADS", "BEADY", "BEAKS", "BEAMS", "BEANS", "BEARD", "BEARS", + "BEAST", "BEAUX", "BEECH", "BEETS", "BEFIT", "BEGAN", "BEGAT", "BEGET", "BEGIN", "BEGOT", "BEGUN", "BEING", + "BELIE", "BELLE", "BELLS", "BELLY", "BELOW", "BELTS", "BENCH", "BENDS", "BERGS", "BERRY", "BERTH", "BERYL", + "BESET", "BESOM", "BEVEL", "BIBLE", "BIDED", "BIDES", "BIGHT", "BIGOT", "BILGE", "BILLS", "BILLY", "BINDS", + "BIPED", "BIRCH", "BIRDS", "BIRTH", "BISON", "BITCH", "BITES", "BLACK", "BLADE", "BLAME", "BLAND", "BLANK", + "BLARE", "BLAST", "BLAZE", "BLEAK", "BLEAT", "BLEED", "BLEND", "BLENT", "BLESS", "BLEST", "BLIND", "BLINK", + "BLISS", "BLOCK", "BLOCS", "BLOND", "BLOOD", "BLOOM", "BLOTS", "BLOWN", "BLOWS", "BLUER", "BLUES", "BLUFF", + "BLUNT", "BLURT", "BLUSH", "BOARD", "BOARS", "BOAST", "BOATS", "BODED", "BODES", "BOGGY", "BOGUS", "BOILS", + "BOLES", "BOLTS", "BOMBS", "BONDS", "BONED", "BONES", "BONNY", "BONUS", "BOOBY", "BOOKS", "BOOMS", "BOONS", + "BOORS", "BOOST", "BOOTH", "BOOTS", "BOOTY", "BOOZE", "BORAX", "BORED", "BORES", "BORNE", "BOSOM", "BOUGH", + "BOUND", "BOUTS", "BOWED", "BOWEL", "BOWER", "BOWLS", "BOXED", "BOXER", "BOXES", "BRACE", "BRAGS", "BRAID", + "BRAIN", "BRAKE", "BRAND", "BRASS", "BRATS", "BRAVE", "BRAVO", "BRAWL", "BRAWN", "BREAD", "BREAK", "BREED", + "BRIAR", "BRIBE", "BRICK", "BRIDE", "BRIEF", "BRIER", "BRIGS", "BRIMS", "BRINE", "BRING", "BRINK", "BRINY", + "BRISK", "BROAD", "BROIL", "BROKE", "BROOD", "BROOK", "BROOM", "BROTH", "BROWN", "BROWS", "BRUIN", "BRUNT", + "BRUSH", "BRUTE", "BUCKS", "BUDGE", "BUGGY", "BUGLE", "BUILD", "BUILT", "BULBS", "BULGE", "BULKS", "BULKY", + "BULLS", "BULLY", "BUMPS", "BUNCH", "BUNKS", "BUOYS", "BURLY", "BURNS", "BURNT", "BURRO", "BURRS", "BURST", + "BUSHY", "BUSTS", "BUTTE", "BUTTS", "BUXOM", "BUYER", "CABAL", "CABBY", "CABIN", "CABLE", "CACAO", "CACHE", + "CADET", "CADRE", "CAGED", "CAGES", "CAIRN", "CAKED", "CAKES", "CALLS", "CALMS", "CALYX", "CAMEL", "CAMEO", + "CAMPS", "CANAL", "CANDY", "CANES", "CANNY", "CANOE", "CANON", "CANTO", "CAPER", "CAPES", "CAPON", "CARDS", + "CARED", "CARES", "CARGO", "CAROL", "CARRY", "CARTS", "CARVE", "CASED", "CASES", "CASKS", "CASTE", "CASTS", + "CATCH", "CATER", "CAUSE", "CAVED", "CAVES", "CAVIL", "CEASE", "CEDAR", "CEDED", "CELLS", "CENTS", "CHAFE", + "CHAFF", "CHAIN", "CHAIR", "CHALK", "CHAMP", "CHANT", "CHAOS", "CHAPS", "CHARM", "CHART", "CHARY", "CHASE", + "CHASM", "CHATS", "CHEAP", "CHEAT", "CHECK", "CHEEK", "CHEER", "CHEFS", "CHESS", "CHEST", "CHICK", "CHIDE", + "CHIEF", "CHILD", "CHILL", "CHIME", "CHINA", "CHINK", "CHINS", "CHIPS", "CHIRP", "CHOIR", "CHOKE", "CHOPS", + "CHORD", "CHOSE", "CHUCK", "CHUMP", "CHUMS", "CHUNK", "CHURL", "CHURN", "CHUTE", "CIDER", "CIGAR", "CINCH", + "CIRCA", "CITED", "CITES", "CIVET", "CIVIC", "CIVIL", "CLACK", "CLAIM", "CLAMP", "CLAMS", "CLANG", "CLANK", + "CLANS", "CLAPS", "CLASH", "CLASP", "CLASS", "CLAWS", "CLEAN", "CLEAR", "CLEFS", "CLEFT", "CLERK", "CLEWS", + "CLICK", "CLIFF", "CLIMB", "CLIME", "CLING", "CLINK", "CLIPS", "CLOAK", "CLOCK", "CLODS", "CLOGS", "CLOSE", + "CLOTH", "CLOUD", "CLOUT", "CLOVE", "CLOWN", "CLUBS", "CLUCK", "CLUES", "CLUMP", "CLUNG", "COACH", "COALS", + "COAST", "COATS", "COBRA", "COCKS", "COCOA", "CODES", "COILS", "COINS", "COLDS", "COLIC", "COLON", "COLTS", + "COMBS", "COMER", "COMES", "COMET", "COMIC", "COMMA", "CONCH", "CONES", "CONIC", "COOED", "COOKS", "COOLS", + "COPRA", "COPSE", "CORAL", "CORDS", "CORES", "CORKS", "CORNS", "CORPS", "COSTS", "COTES", "COUCH", "COUGH", + "COULD", "COUNT", "COUPE", "COUPS", "COURT", "COVER", "COVES", "COVET", "COVEY", "COWED", "COWER", "COYLY", + "COZEN", "CRABS", "CRACK", "CRAFT", "CRAGS", "CRAMP", "CRANE", "CRANK", "CRAPE", "CRASH", "CRASS", "CRATE", + "CRAVE", "CRAWL", "CRAZE", "CRAZY", "CREAK", "CREAM", "CREDO", "CREED", "CREEK", "CREEP", "CREPE", "CREPT", + "CRESS", "CREST", "CREWS", "CRIBS", "CRICK", "CRIED", "CRIER", "CRIES", "CRIME", "CRIMP", "CRISP", "CROAK", + "CROCK", "CRONE", "CRONY", "CROOK", "CROPS", "CROSS", "CROUP", "CROWD", "CROWN", "CROWS", "CRUDE", "CRUEL", + "CRUMB", "CRUSH", "CRUST", "CRYPT", "CUBES", "CUBIC", "CUBIT", "CUFFS", "CULTS", "CURDS", "CURED", "CURES", + "CURLS", "CURLY", "CURRY", "CURSE", "CURST", "CURVE", "CYCLE", "CYNIC", "DADDY", "DAILY", "DAIRY", "DAISY", + "DALES", "DALLY", "DAMES", "DAMPS", "DANCE", "DANDY", "DARED", "DARES", "DARTS", "DATED", "DATES", "DATUM", + "DAUBS", "DAUNT", "DAWNS", "DAZED", "DEALS", "DEALT", "DEANS", "DEARS", "DEATH", "DEBAR", "DEBIT", "DEBTS", + "DEBUT", "DECAY", "DECKS", "DECOY", "DECRY", "DEEDS", "DEEMS", "DEEPS", "DEFER", "DEIGN", "DEITY", "DELAY", + "DELLS", "DELTA", "DELVE", "DEMON", "DEMUR", "DENSE", "DENTS", "DEPOT", "DEPTH", "DERBY", "DESKS", "DETER", + "DEUCE", "DEVIL", "DIARY", "DICED", "DICES", "DICTA", "DIETS", "DIGIT", "DIKES", "DIMES", "DIMLY", "DINED", + "DINER", "DINES", "DINGY", "DIRGE", "DIRTY", "DISCS", "DISKS", "DITCH", "DITTO", "DITTY", "DIVAN", "DIVED", + "DIVER", "DIVES", "DIZZY", "DOCKS", "DODGE", "DOERS", "DOGMA", "DOING", "DOLED", "DOLLS", "DOMED", "DOMES", + "DONOR", "DOOMS", "DOORS", "DOSED", "DOSES", "DOTED", "DOTES", "DOUBT", "DOUGH", "DOVES", "DOWDY", "DOWNS", + "DOWNY", "DOWRY", "DOZED", "DOZEN", "DRAFT", "DRAGS", "DRAIN", "DRAKE", "DRAMA", "DRAMS", "DRANK", "DRAPE", + "DRAWL", "DRAWN", "DRAWS", "DRAYS", "DREAD", "DREAM", "DREGS", "DRESS", "DRIED", "DRIER", "DRIES", "DRIFT", + "DRILL", "DRILY", "DRINK", "DRIPS", "DRIVE", "DROLL", "DRONE", "DROOP", "DROPS", "DROSS", "DROVE", "DROWN", + "DRUGS", "DRUMS", "DRUNK", "DRYLY", "DUCAL", "DUCAT", "DUCHY", "DUCKS", "DUCTS", "DUELS", "DUETS", "DUKES", + "DULLY", "DUMMY", "DUMPS", "DUMPY", "DUNCE", "DUNES", "DUNNO", "DUPED", "DUPES", "DUSKY", "DUSTY", "DWARF", + "DWELL", "DWELT", "DYING", "DYKES", "EAGER", "EAGLE", "EARLS", "EARLY", "EARNS", "EARTH", "EASED", "EASEL", + "EASES", "EATEN", "EATER", "EAVES", "EBBED", "EBONY", "EDGED", "EDGES", "EDICT", "EDIFY", "EERIE", "EGGED", + "EIGHT", "EJECT", "ELATE", "ELBOW", "ELDER", "ELECT", "ELEGY", "ELFIN", "ELITE", "ELOPE", "ELUDE", "ELVES", + "EMAIL", "EMITS", "EMPTY", "ENACT", "ENDED", "ENDOW", "ENEMY", "ENJOY", "ENNUI", "ENROL", "ENSUE", "ENTER", + "ENTRY", "ENVOY", "EPICS", "EPOCH", "EQUAL", "EQUIP", "ERASE", "ERECT", "ERRED", "ERROR", "ESSAY", "ETHER", + "ETHIC", "EVADE", "EVENT", "EVERY", "EVILS", "EVOKE", "EXACT", "EXALT", "EXCEL", "EXERT", "EXILE", "EXIST", + "EXITS", "EXPEL", "EXTOL", "EXTRA", "EXULT", "EYING", "EYRIE", "FABLE", "FACED", "FACES", "FACTS", "FADED", + "FADES", "FAILS", "FAINT", "FAIRS", "FAIRY", "FAITH", "FAKIR", "FALLS", "FALSE", "FAMED", "FANCY", "FANGS", + "FARCE", "FARED", "FARES", "FARMS", "FASTS", "FATAL", "FATED", "FATES", "FATTY", "FAULT", "FAUNA", "FAUNS", + "FAWNS", "FEARS", "FEAST", "FEATS", "FEEDS", "FEELS", "FEIGN", "FEINT", "FELLS", "FELON", "FENCE", "FERAL", + "FERNS", "FERRY", "FETCH", "FETED", "FETID", "FETUS", "FEUDS", "FEVER", "FEWER", "FICHE", "FIEFS", "FIELD", + "FIEND", "FIERY", "FIFES", "FIFTH", "FIFTY", "FIGHT", "FILCH", "FILED", "FILES", "FILET", "FILLS", "FILLY", + "FILMS", "FILMY", "FILTH", "FINAL", "FINCH", "FINDS", "FINED", "FINER", "FINES", "FINIS", "FINNY", "FIORD", + "FIRED", "FIRES", "FIRMS", "FIRST", "FISHY", "FISTS", "FITLY", "FIVES", "FIXED", "FIXER", "FIXES", "FJORD", + "FLAGS", "FLAIL", "FLAIR", "FLAKE", "FLAKY", "FLAME", "FLANK", "FLAPS", "FLARE", "FLASH", "FLASK", "FLATS", + "FLAWS", "FLEAS", "FLECK", "FLEES", "FLEET", "FLESH", "FLICK", "FLIER", "FLIES", "FLING", "FLINT", "FLIRT", + "FLITS", "FLOAT", "FLOCK", "FLOES", "FLOOD", "FLOOR", "FLORA", "FLOSS", "FLOUR", "FLOUT", "FLOWN", "FLOWS", + "FLUES", "FLUFF", "FLUID", "FLUKE", "FLUME", "FLUNG", "FLUSH", "FLUTE", "FLYER", "FOAMS", "FOAMY", "FOCAL", + "FOCUS", "FOGGY", "FOILS", "FOIST", "FOLDS", "FOLIO", "FOLKS", "FOLLY", "FOODS", "FOOLS", "FORAY", "FORCE", + "FORDS", "FORGE", "FORGO", "FORKS", "FORMS", "FORTE", "FORTH", "FORTS", "FORTY", "FORUM", "FOUND", "FOUNT", + "FOURS", "FOWLS", "FOXES", "FOYER", "FRAIL", "FRAME", "FRANC", "FRANK", "FRAUD", "FREAK", "FREED", "FREER", + "FREES", "FRESH", "FRETS", "FRIAR", "FRIED", "FRILL", "FRISK", "FROCK", "FROGS", "FROND", "FRONT", "FROST", + "FROTH", "FROWN", "FROZE", "FRUIT", "FUDGE", "FUELS", "FUGUE", "FULLY", "FUMED", "FUMES", "FUNDS", "FUNGI", + "FUNNY", "FURRY", "FURZE", "FUSED", "FUSES", "FUSSY", "FUZZY", "GABLE", "GAILY", "GAINS", "GALES", "GALLS", + "GAMES", "GAMIN", "GAMMA", "GAMUT", "GANGS", "GAPED", "GAPES", "GASES", "GASPS", "GATES", "GAUDY", "GAUGE", + "GAUNT", "GAUZE", "GAUZY", "GAVEL", "GAWKY", "GAYER", "GAYLY", "GAZED", "GAZER", "GAZES", "GEARS", "GEESE", + "GENIE", "GENII", "GENRE", "GENTS", "GENUS", "GERMS", "GHOST", "GIANT", "GIBES", "GIDDY", "GIFTS", "GILDS", + "GILLS", "GIMME", "GIPSY", "GIRDS", "GIRLS", "GIRTH", "GIVEN", "GIVES", "GLADE", "GLAND", "GLARE", "GLASS", + "GLAZE", "GLEAM", "GLEAN", "GLENS", "GLIDE", "GLINT", "GLOAT", "GLOBE", "GLOOM", "GLORY", "GLOSS", "GLOVE", + "GLOWS", "GLUED", "GNASH", "GNATS", "GNAWS", "GNOME", "GOADS", "GOALS", "GOATS", "GODLY", "GOING", "GOLLY", + "GONGS", "GONNA", "GOODS", "GOODY", "GOOSE", "GORED", "GORGE", "GORSE", "GOTTA", "GOUGE", "GOURD", "GOUTY", + "GOWNS", "GRABS", "GRACE", "GRADE", "GRAFT", "GRAIN", "GRAMS", "GRAND", "GRANT", "GRAPE", "GRAPH", "GRASP", + "GRASS", "GRATE", "GRAVE", "GRAVY", "GRAZE", "GREAT", "GREED", "GREEN", "GREET", "GREYS", "GRIEF", "GRILL", + "GRIME", "GRIMY", "GRIND", "GRINS", "GRIPE", "GRIPS", "GRIST", "GROAN", "GROIN", "GROOM", "GROPE", "GROSS", + "GROUP", "GROVE", "GROWL", "GROWN", "GROWS", "GRUBS", "GRUEL", "GRUFF", "GRUNT", "GUANO", "GUARD", "GUESS", + "GUEST", "GUIDE", "GUILD", "GUILE", "GUILT", "GUISE", "GULCH", "GULFS", "GULLS", "GULLY", "GUMMY", "GUSTO", + "GUSTS", "GUSTY", "GYPSY", "HABIT", "HACKS", "HAILS", "HAIRS", "HAIRY", "HALED", "HALLS", "HALTS", "HALVE", + "HANDS", "HANDY", "HANGS", "HAPPY", "HARDY", "HAREM", "HARES", "HARMS", "HARPS", "HARPY", "HARRY", "HARSH", + "HARTS", "HASTE", "HASTY", "HATCH", "HATED", "HATER", "HAULS", "HAVEN", "HAVOC", "HAWKS", "HAZEL", "HEADS", + "HEADY", "HEALS", "HEAPS", "HEARD", "HEARS", "HEART", "HEATH", "HEATS", "HEAVE", "HEAVY", "HEDGE", "HEEDS", + "HEELS", "HEIRS", "HELIX", "HELLO", "HELMS", "HELPS", "HENCE", "HERBS", "HERDS", "HERON", "HEROS", "HEWED", + "HIDES", "HILLS", "HILLY", "HILTS", "HINDS", "HINGE", "HINTS", "HIRED", "HIRES", "HITCH", "HIVES", "HOARD", + "HOARY", "HOBBY", "HOIST", "HOLDS", "HOLES", "HOLLY", "HOMES", "HONEY", "HOODS", "HOOFS", "HOOKS", "HOOPS", + "HOOTS", "HOPED", "HOPES", "HORDE", "HORNS", "HORNY", "HORSE", "HOSTS", "HOTEL", "HOTLY", "HOUND", "HOURS", + "HOUSE", "HOVEL", "HOVER", "HOWLS", "HULKS", "HULLS", "HUMAN", "HUMID", "HUMPS", "HUMUS", "HUNCH", "HUNTS", + "HURLS", "HURRY", "HURTS", "HUSKS", "HUSKY", "HUSSY", "HYDRA", "HYENA", "HYMNS", "ICILY", "ICING", "IDEAL", + "IDEAS", "IDIOM", "IDIOT", "IDLED", "IDLER", "IDOLS", "IDYLL", "IGLOO", "IMAGE", "IMBUE", "IMPEL", "IMPLY", + "INANE", "INCUR", "INDEX", "INEPT", "INERT", "INFER", "INGOT", "INLET", "INNER", "INTER", "INURE", "IRATE", + "IRKED", "IRONS", "IRONY", "ISLES", "ISLET", "ISSUE", "ITEMS", "IVORY", "JACKS", "JADED", "JAILS", "JAUNT", + "JEANS", "JEERS", "JELLY", "JERKS", "JERKY", "JESTS", "JETTY", "JEWEL", "JIFFY", "JOINS", "JOINT", "JOKED", + "JOKER", "JOKES", "JOLLY", "JOUST", "JOYED", "JUDGE", "JUICE", "JUICY", "JUMPS", "JUNKS", "JUNTA", "JUROR", + "KARMA", "KEELS", "KEEPS", "KETCH", "KEYED", "KHAKI", "KICKS", "KILLS", "KINDA", "KINDS", "KINGS", "KIOSK", + "KITES", "KNACK", "KNAVE", "KNEAD", "KNEEL", "KNEES", "KNELL", "KNELT", "KNIFE", "KNITS", "KNOBS", "KNOCK", + "KNOLL", "KNOTS", "KNOWN", "KNOWS", "LABEL", "LACED", "LACES", "LACKS", "LADEN", "LADLE", "LAGER", "LAIRS", + "LAITY", "LAKES", "LAMBS", "LAMED", "LAMES", "LAMPS", "LANCE", "LANDS", "LANES", "LANKY", "LAPEL", "LAPSE", + "LARCH", "LARGE", "LARGO", "LARKS", "LARVA", "LASSO", "LASTS", "LATCH", "LATER", "LATHE", "LATHS", "LAUGH", + "LAWNS", "LAYER", "LEADS", "LEAFY", "LEAKS", "LEAKY", "LEANS", "LEAPS", "LEAPT", "LEARN", "LEASE", "LEASH", + "LEAST", "LEAVE", "LEDGE", "LEECH", "LEEKS", "LEGAL", "LEMME", "LEMON", "LENDS", "LEPER", "LEVEE", "LEVEL", + "LEVER", "LIARS", "LIBEL", "LICKS", "LIEGE", "LIENS", "LIFTS", "LIGHT", "LIKED", "LIKEN", "LIKER", "LIKES", + "LILAC", "LIMBO", "LIMBS", "LIMES", "LIMIT", "LINED", "LINEN", "LINER", "LINES", "LINGO", "LINKS", "LIONS", + "LISTS", "LITHE", "LIVED", "LIVER", "LIVES", "LIVID", "LLAMA", "LOADS", "LOAMY", "LOANS", "LOATH", "LOBBY", + "LOBES", "LOCAL", "LOCKS", "LOCUS", "LODGE", "LOFTY", "LOGES", "LOGIC", "LOGIN", "LOINS", "LONGS", "LOOKS", + "LOOMS", "LOONS", "LOOPS", "LOOSE", "LORDS", "LOSER", "LOSES", "LOTUS", "LOUSE", "LOUSY", "LOVED", "LOVER", + "LOVES", "LOWED", "LOWER", "LOWLY", "LOYAL", "LUCID", "LUCKY", "LULLS", "LUMPS", "LUMPY", "LUNAR", "LUNCH", + "LUNGE", "LUNGS", "LURCH", "LURED", "LURES", "LURID", "LURKS", "LUSTS", "LUSTY", "LUTES", "LYING", "LYMPH", + "LYNCH", "LYRIC", "MACES", "MADAM", "MADLY", "MAGIC", "MAIDS", "MAILS", "MAINS", "MAIZE", "MAJOR", "MAKER", + "MAKES", "MALES", "MAMMA", "MANES", "MANGA", "MANGE", "MANGO", "MANGY", "MANIA", "MANLY", "MANNA", "MANOR", + "MANSE", "MAPLE", "MARCH", "MARES", "MARKS", "MARRY", "MARSH", "MARTS", "MASKS", "MASON", "MASTS", "MATCH", + "MATED", "MATES", "MAUVE", "MAXIM", "MAYBE", "MAYOR", "MAZES", "MEALS", "MEALY", "MEANS", "MEANT", "MEATS", + "MEDAL", "MEDIA", "MEETS", "MELON", "MELTS", "MEMES", "MENDS", "MENUS", "MERCY", "MERES", "MERGE", "MERIT", + "MERRY", "MESAS", "METAL", "METED", "METER", "MEWED", "MIDST", "MIENS", "MIGHT", "MILCH", "MILES", "MILKY", + "MILLS", "MIMES", "MIMIC", "MINCE", "MINDS", "MINED", "MINER", "MINES", "MINOR", "MINTS", "MINUS", "MIRTH", + "MISER", "MISTS", "MITES", "MIXED", "MIXES", "MOANS", "MOATS", "MOCKS", "MODEL", "MODEM", "MODES", "MOIST", + "MOLAR", "MOLES", "MOMMA", "MONEY", "MONKS", "MONTH", "MOODS", "MOODY", "MOONS", "MOORS", "MOOSE", "MOPED", + "MORAL", "MORES", "MOSSY", "MOTES", "MOTHS", "MOTIF", "MOTOR", "MOTTO", "MOUND", "MOUNT", "MOURN", "MOUSE", + "MOUTH", "MOVED", "MOVER", "MOVES", "MOVIE", "MOWED", "MOWER", "MUCUS", "MUDDY", "MULES", "MULTI", "MUMMY", + "MUMPS", "MUNCH", "MURAL", "MURKY", "MUSED", "MUSES", "MUSIC", "MUSKY", "MUSTY", "MUTED", "MUTES", "MYRRH", + "MYTHS", "NABOB", "NAILS", "NAIVE", "NAKED", "NAMED", "NAMES", "NASAL", "NASTY", "NATAL", "NATTY", "NAVAL", + "NAVEL", "NAVES", "NEARS", "NECKS", "NEEDS", "NEEDY", "NEIGH", "NERVE", "NESTS", "NEVER", "NEWER", "NEWLY", + "NICER", "NICHE", "NIECE", "NIGHT", "NINNY", "NOBLE", "NOBLY", "NOISE", "NOISY", "NOMAD", "NONCE", "NOOKS", + "NOOSE", "NORTH", "NOSED", "NOSES", "NOTCH", "NOTED", "NOTES", "NOUNS", "NOVEL", "NUDGE", "NURSE", "NYMPH", + "OAKEN", "OAKUM", "OASES", "OASIS", "OATEN", "OATHS", "OBESE", "OBEYS", "OCCUR", "OCEAN", "OCHRE", "ODDER", + "ODDLY", "ODIUM", "OFFAL", "OFFER", "OFTEN", "OILED", "OLDEN", "OLDER", "OMENS", "OMITS", "ONION", "ONSET", + "OOZED", "OOZES", "OPALS", "OPENS", "OPERA", "OPINE", "OPIUM", "OPTIC", "ORBIT", "ORDER", "ORGAN", "OSIER", + "OTHER", "OTTER", "OUGHT", "OUNCE", "OUTDO", "OUTER", "OVALS", "OVARY", "OVENS", "OVERT", "OWING", "OWNED", + "OWNER", "OXIDE", "OZONE", "PACES", "PACKS", "PADDY", "PADRE", "PAEAN", "PAGAN", "PAGES", "PAILS", "PAINS", + "PAINT", "PAIRS", "PALED", "PALER", "PALES", "PALMS", "PALMY", "PALSY", "PANEL", "PANES", "PANGS", "PANIC", + "PANSY", "PANTS", "PAPAL", "PAPAS", "PAPER", "PARED", "PARKA", "PARKS", "PARRY", "PARSE", "PARTS", "PARTY", + "PASHA", "PASTE", "PASTY", "PATCH", "PATES", "PATHS", "PATIO", "PAUSE", "PAVED", "PAWED", "PAWNS", "PAYED", + "PAYER", "PEACE", "PEACH", "PEAKS", "PEALS", "PEARL", "PEARS", "PEASE", "PECKS", "PEDAL", "PEEPS", "PEERS", + "PELTS", "PENAL", "PENCE", "PENIS", "PENNY", "PEONS", "PERCH", "PERIL", "PESKY", "PESOS", "PESTS", "PETAL", + "PETTY", "PHASE", "PHIAL", "PHONE", "PHOTO", "PIANO", "PICKS", "PIECE", "PIERS", "PIETY", "PIGMY", "PIKES", + "PILED", "PILES", "PILLS", "PILOT", "PINCH", "PINED", "PINES", "PINKS", "PINTO", "PINTS", "PIOUS", "PIPED", + "PIPER", "PIPES", "PIQUE", "PITCH", "PITHY", "PIVOT", "PLACE", "PLAID", "PLAIN", "PLAIT", "PLANE", "PLANK", + "PLANS", "PLANT", "PLATE", "PLAYS", "PLAZA", "PLEAD", "PLEAS", "PLIED", "PLIES", "PLOTS", "PLUCK", "PLUGS", + "PLUMB", "PLUME", "PLUMS", "PLUSH", "PODIA", "POEMS", "POESY", "POETS", "POINT", "POISE", "POKED", "POKER", + "POKES", "POLAR", "POLES", "POLKA", "POLLS", "PONDS", "POOLS", "POPES", "POPPA", "POPPY", "PORCH", "PORED", + "PORES", "PORTS", "POSED", "POSER", "POSES", "POSSE", "POSTS", "POUCH", "POUND", "POURS", "POWER", "PRANK", + "PRATE", "PRAYS", "PRESS", "PREYS", "PRICE", "PRICK", "PRIDE", "PRIED", "PRIES", "PRIME", "PRINT", "PRIOR", + "PRISM", "PRIVY", "PRIZE", "PROBE", "PRONE", "PROOF", "PROPS", "PROSE", "PROSY", "PROUD", "PROVE", "PROWL", + "PROWS", "PROXY", "PRUDE", "PRUNE", "PSALM", "PSHAW", "PUDGY", "PUFFS", "PUFFY", "PULLS", "PULPY", "PULSE", + "PUMPS", "PUNCH", "PUPIL", "PUPPY", "PUREE", "PURER", "PURGE", "PURSE", "PUSSY", "PUTTY", "QUACK", "QUAFF", + "QUAIL", "QUAKE", "QUALM", "QUART", "QUASI", "QUAYS", "QUEEN", "QUEER", "QUELL", "QUERY", "QUEST", "QUEUE", + "QUICK", "QUIET", "QUILL", "QUILT", "QUIPS", "QUIRE", "QUITE", "QUITS", "QUOTA", "QUOTE", "QUOTH", "RABBI", + "RABID", "RACED", "RACER", "RACES", "RACKS", "RADII", "RADIO", "RAFTS", "RAGED", "RAGES", "RAIDS", "RAILS", + "RAINS", "RAINY", "RAISE", "RAJAH", "RAKED", "RAKES", "RALLY", "RANCH", "RANGE", "RANKS", "RAPID", "RARER", + "RARES", "RATED", "RATES", "RATIO", "RAVED", "RAVEN", "RAVES", "RAYON", "RAZED", "RAZOR", "REACH", "REACT", + "READS", "READY", "REALM", "REALS", "REAMS", "REAPS", "REARS", "REBEL", "REBUS", "REBUT", "RECUR", "REEDS", + "REEDY", "REEFS", "REEKS", "REELS", "REEVE", "REFER", "REFIT", "REGAL", "REIGN", "REINS", "RELAX", "RELAY", + "RELIC", "REMIT", "RENDS", "RENEW", "RENTS", "REPAY", "REPEL", "REPLY", "RESET", "RESIN", "RESTS", "REVEL", + "REVUE", "RHEUM", "RHYME", "RICKS", "RIDER", "RIDES", "RIDGE", "RIFLE", "RIFTS", "RIGHT", "RIGID", "RILED", + "RILLS", "RIMES", "RINGS", "RINSE", "RIOTS", "RIPEN", "RIPER", "RISEN", "RISER", "RISES", "RISKS", "RISKY", + "RITES", "RIVAL", "RIVEN", "RIVER", "RIVET", "ROADS", "ROAMS", "ROARS", "ROAST", "ROBED", "ROBES", "ROBIN", + "ROCKS", "ROCKY", "ROGUE", "ROLES", "ROLLS", "ROMAN", "ROOFS", "ROOKS", "ROOMS", "ROOMY", "ROOST", "ROOTS", + "ROPED", "ROPES", "ROSES", "ROSIN", "ROUGE", "ROUGH", "ROUND", "ROUSE", "ROUTE", "ROUTS", "ROVED", "ROVER", + "ROWDY", "ROWED", "ROYAL", "RUDER", "RUFFS", "RUINS", "RULED", "RULER", "RULES", "RUNES", "RUNGS", "RUPEE", + "RURAL", "RUSES", "SABLE", "SABRE", "SACKS", "SADLY", "SAFER", "SAGAS", "SAGES", "SAHIB", "SAILS", "SAINT", + "SAITH", "SALAD", "SALES", "SALLY", "SALON", "SALSA", "SALTS", "SALTY", "SALVE", "SALVO", "SANDS", "SANDY", + "SANER", "SATED", "SATIN", "SATYR", "SAUCE", "SAUCY", "SAVED", "SAVES", "SAWED", "SCALD", "SCALE", "SCALP", + "SCALY", "SCAMP", "SCANS", "SCANT", "SCARE", "SCARF", "SCARS", "SCENE", "SCENT", "SCION", "SCOFF", "SCOLD", + "SCOOP", "SCOPE", "SCORE", "SCORN", "SCOUR", "SCOUT", "SCOWL", "SCRAP", "SCREW", "SCRIP", "SCRUB", "SCULL", + "SEALS", "SEAMS", "SEAMY", "SEATS", "SECTS", "SEDAN", "SEDGE", "SEEDS", "SEEDY", "SEEKS", "SEEMS", "SEERS", + "SEIZE", "SELLS", "SEMEN", "SENDS", "SENSE", "SERFS", "SERGE", "SERUM", "SERVE", "SEVEN", "SEVER", "SEWED", + "SEWER", "SEXES", "SHACK", "SHADE", "SHADY", "SHAFT", "SHAKE", "SHAKY", "SHALE", "SHALL", "SHALT", "SHAME", + "SHAMS", "SHANK", "SHAPE", "SHARE", "SHARK", "SHARP", "SHAVE", "SHAWL", "SHEAF", "SHEAR", "SHEDS", "SHEEN", + "SHEEP", "SHEER", "SHEET", "SHEIK", "SHELF", "SHELL", "SHIED", "SHIFT", "SHINE", "SHINS", "SHINY", "SHIPS", + "SHIRE", "SHIRK", "SHIRT", "SHOAL", "SHOCK", "SHOES", "SHONE", "SHOOK", "SHOON", "SHOOT", "SHOPS", "SHORE", + "SHORN", "SHORT", "SHOTS", "SHOUT", "SHOVE", "SHOWN", "SHOWS", "SHOWY", "SHRED", "SHREW", "SHRUB", "SHRUG", + "SHUNS", "SHUTS", "SHYLY", "SIBYL", "SIDED", "SIDES", "SIEGE", "SIEVE", "SIGHS", "SIGHT", "SIGMA", "SIGNS", + "SILKS", "SILKY", "SILLS", "SILLY", "SINCE", "SINEW", "SINGE", "SINGS", "SINKS", "SIREN", "SIRES", "SITES", + "SIXES", "SIXTH", "SIXTY", "SIZED", "SIZES", "SKATE", "SKEIN", "SKIES", "SKIFF", "SKILL", "SKIMS", "SKINS", + "SKIPS", "SKIRT", "SKULK", "SKULL", "SKUNK", "SLABS", "SLACK", "SLAGS", "SLAIN", "SLAKE", "SLANG", "SLANT", + "SLAPS", "SLASH", "SLATE", "SLATS", "SLAVE", "SLAYS", "SLEDS", "SLEEK", "SLEEP", "SLEET", "SLEPT", "SLICE", + "SLICK", "SLIDE", "SLILY", "SLIME", "SLIMY", "SLING", "SLINK", "SLIPS", "SLITS", "SLOOP", "SLOPE", "SLOPS", + "SLOTH", "SLUGS", "SLUMP", "SLUMS", "SLUNG", "SLUNK", "SLUSH", "SLYLY", "SMACK", "SMALL", "SMART", "SMASH", + "SMEAR", "SMELL", "SMELT", "SMILE", "SMIRK", "SMITE", "SMITH", "SMOCK", "SMOKE", "SMOKY", "SMOTE", "SNACK", + "SNAGS", "SNAIL", "SNAKE", "SNAKY", "SNAPS", "SNARE", "SNARL", "SNEAK", "SNEER", "SNIFF", "SNIPE", "SNOBS", + "SNORE", "SNORT", "SNOUT", "SNOWS", "SNOWY", "SNUFF", "SOAPY", "SOARS", "SOBER", "SOCKS", "SOFAS", "SOGGY", + "SOILS", "SOLAR", "SOLES", "SOLID", "SOLOS", "SOLVE", "SONGS", "SONNY", "SOOTH", "SOOTY", "SORES", "SORRY", + "SORTS", "SOUGH", "SOULS", "SOUND", "SOUPS", "SOUSE", "SOUTH", "SOWED", "SOWER", "SPACE", "SPADE", "SPAKE", + "SPANK", "SPANS", "SPARE", "SPARK", "SPARS", "SPASM", "SPAWN", "SPEAK", "SPEAR", "SPECK", "SPEED", "SPELL", + "SPELT", "SPEND", "SPENT", "SPERM", "SPICE", "SPICY", "SPIED", "SPIES", "SPIKE", "SPILL", "SPILT", "SPINE", + "SPINS", "SPINY", "SPIRE", "SPITE", "SPITS", "SPLIT", "SPOIL", "SPOKE", "SPOOK", "SPOOL", "SPOON", "SPOOR", + "SPORE", "SPORT", "SPOTS", "SPOUT", "SPRAY", "SPREE", "SPRIG", "SPUNK", "SPURN", "SPURS", "SPURT", "SQUAD", + "SQUAT", "SQUAW", "STABS", "STACK", "STAFF", "STAGE", "STAGS", "STAID", "STAIN", "STAIR", "STAKE", "STALE", + "STALK", "STALL", "STAMP", "STAND", "STANK", "STARE", "STARK", "STARS", "START", "STATE", "STAVE", "STAYS", + "STEAD", "STEAK", "STEAL", "STEAM", "STEED", "STEEL", "STEEP", "STEER", "STEMS", "STEPS", "STERN", "STEWS", + "STICK", "STIFF", "STILE", "STILL", "STING", "STINK", "STINT", "STIRS", "STOCK", "STOIC", "STOLE", "STONE", + "STONY", "STOOD", "STOOL", "STOOP", "STOPS", "STORE", "STORK", "STORM", "STORY", "STOUT", "STOVE", "STRAP", + "STRAW", "STRAY", "STREW", "STRIP", "STRUT", "STUCK", "STUDS", "STUDY", "STUFF", "STUMP", "STUNG", "STUNT", + "STYLE", "SUAVE", "SUCKS", "SUGAR", "SUING", "SUITE", "SUITS", "SULKS", "SULKY", "SULLY", "SUNNY", "SUPER", + "SURER", "SURGE", "SURLY", "SWAIN", "SWAMP", "SWANS", "SWARD", "SWARM", "SWAYS", "SWEAR", "SWEAT", "SWEEP", + "SWEET", "SWELL", "SWEPT", "SWIFT", "SWILL", "SWIMS", "SWINE", "SWING", "SWIRL", "SWISH", "SWOON", "SWOOP", + "SWORD", "SWORE", "SWORN", "SWUNG", "SYNOD", "SYRUP", "TABBY", "TABLE", "TABOO", "TACIT", "TACKS", "TAILS", + "TAINT", "TAKEN", "TAKES", "TALES", "TALKS", "TALLY", "TALON", "TAMED", "TAMER", "TANKS", "TAPER", "TAPES", + "TARDY", "TARES", "TARRY", "TARTS", "TASKS", "TASTE", "TASTY", "TAUNT", "TAWNY", "TAXED", "TAXES", "TEACH", + "TEAMS", "TEARS", "TEASE", "TEEMS", "TEENS", "TEETH", "TELLS", "TEMPI", "TEMPO", "TEMPS", "TENDS", "TENET", + "TENOR", "TENSE", "TENTH", "TENTS", "TEPEE", "TEPID", "TERMS", "TERSE", "TESTS", "TESTY", "TEXTS", "THANK", + "THEFT", "THEIR", "THEME", "THERE", "THESE", "THICK", "THIEF", "THIGH", "THINE", "THING", "THINK", "THIRD", + "THONG", "THORN", "THOSE", "THREE", "THREW", "THROB", "THROE", "THROW", "THUMB", "THUMP", "THYME", "TIARA", + "TIBIA", "TICKS", "TIDAL", "TIDES", "TIERS", "TIGER", "TIGHT", "TILDE", "TILED", "TILES", "TILLS", "TILTS", + "TIMED", "TIMES", "TIMID", "TINGE", "TINTS", "TIPSY", "TIRED", "TIRES", "TITHE", "TITLE", "TOADS", "TOAST", + "TODAY", "TODDY", "TOILS", "TOKEN", "TOLLS", "TOMBS", "TOMES", "TONED", "TONES", "TONGS", "TONIC", "TOOLS", + "TOOTH", "TOPAZ", "TOPIC", "TOQUE", "TORCH", "TORSO", "TORTS", "TOTAL", "TOTEM", "TOUCH", "TOUGH", "TOURS", + "TOWED", "TOWEL", "TOWER", "TOWNS", "TOXIC", "TOYED", "TRACE", "TRACK", "TRACT", "TRADE", "TRAIL", "TRAIN", + "TRAIT", "TRAMP", "TRAMS", "TRAPS", "TRASH", "TRAYS", "TREAD", "TREAT", "TREED", "TREES", "TREND", "TRESS", + "TRIAD", "TRIAL", "TRIBE", "TRICE", "TRICK", "TRIED", "TRIES", "TRILL", "TRIPE", "TRIPS", "TRITE", "TROLL", + "TROOP", "TROTH", "TROTS", "TROUT", "TRUCE", "TRUCK", "TRUER", "TRULY", "TRUMP", "TRUNK", "TRUSS", "TRUST", + "TRUTH", "TRYST", "TUBES", "TUFTS", "TULIP", "TULLE", "TUNED", "TUNES", "TUNIC", "TURNS", "TUSKS", "TUTOR", + "TWAIN", "TWANG", "TWEED", "TWICE", "TWIGS", "TWINE", "TWINS", "TWIRL", "TWIST", "TYING", "TYPED", "TYPES", + "UDDER", "ULCER", "ULTRA", "UNCLE", "UNCUT", "UNDER", "UNDID", "UNDUE", "UNFIT", "UNION", "UNITE", "UNITS", + "UNITY", "UNSAY", "UNTIE", "UNTIL", "UPPER", "UPSET", "URBAN", "URGED", "URGES", "URINE", "USAGE", "USERS", + "USHER", "USING", "USUAL", "USURP", "USURY", "UTTER", "VAGUE", "VALES", "VALET", "VALID", "VALUE", "VALVE", + "VANES", "VAPID", "VASES", "VAULT", "VAUNT", "VEILS", "VEINS", "VELDT", "VENAL", "VENOM", "VENTS", "VENUE", + "VERBS", "VERGE", "VERSE", "VERVE", "VESTS", "VEXED", "VEXES", "VIALS", "VICAR", "VICES", "VIDEO", "VIEWS", + "VIGIL", "VILER", "VILLA", "VINES", "VIOLA", "VIPER", "VIRUS", "VISIT", "VISOR", "VISTA", "VITAL", "VIVID", + "VIXEN", "VIZOR", "VOCAL", "VODKA", "VOGUE", "VOICE", "VOILE", "VOLTS", "VOMIT", "VOTED", "VOTER", "VOTES", + "VOUCH", "VOWED", "VOWEL", "VYING", "WADED", "WAFER", "WAFTS", "WAGED", "WAGER", "WAGES", "WAGON", "WAIFS", + "WAILS", "WAIST", "WAITS", "WAIVE", "WAKED", "WAKEN", "WAKES", "WALKS", "WALLS", "WALTZ", "WANDS", "WANED", + "WANES", "WANTS", "WARDS", "WARES", "WARMS", "WARNS", "WARTS", "WASPS", "WASTE", "WATCH", "WATER", "WAVED", + "WAVER", "WAVES", "WAXED", "WAXEN", "WAXES", "WEARS", "WEARY", "WEAVE", "WEDGE", "WEEDS", "WEEDY", "WEEKS", + "WEEPS", "WEIGH", "WEIRD", "WELCH", "WELLS", "WENCH", "WHACK", "WHALE", "WHARF", "WHEAT", "WHEEL", "WHELP", + "WHERE", "WHICH", "WHIFF", "WHILE", "WHIMS", "WHINE", "WHIPS", "WHIRL", "WHIRR", "WHISK", "WHIST", "WHITE", + "WHOLE", "WHOOP", "WHORE", "WHOSE", "WICKS", "WIDEN", "WIDER", "WIDOW", "WIDTH", "WIELD", "WIGHT", "WILDS", + "WILES", "WILLS", "WINCE", "WINCH", "WINDS", "WINDY", "WINES", "WINGS", "WINKS", "WIPED", "WIPES", "WIRED", + "WIRES", "WISER", "WISPS", "WITCH", "WITTY", "WIVES", "WOMAN", "WOMEN", "WOODS", "WOODY", "WOOED", "WOOER", + "WORDS", "WORDY", "WORKS", "WORLD", "WORMS", "WORRY", "WORSE", "WORST", "WORTH", "WOULD", "WOUND", "WRACK", + "WRAPS", "WRAPT", "WRATH", "WREAK", "WRECK", "WREST", "WRING", "WRIST", "WRITE", "WRITS", "WRONG", "WROTE", + "WROTH", "YACHT", "YARDS", "YARNS", "YAWNS", "YEARN", "YEARS", "YEAST", "YELLS", "YELPS", "YIELD", "YOKED", + "YOKES", "YOLKS", "YOUNG", "YOURS", "YOUTH", "ZEBRA", "ZONES", "COLOR", "CINCO", +] + +expanded_list = [ + "WHICH", "THEIR", "WOULD", "THERE", "COULD", "OTHER", "ABOUT", "GREAT", "THESE", "AFTER", "FIRST", "NEVER", + "WHERE", "THOSE", "SHALL", "BEING", "MIGHT", "EVERY", "THINK", "UNDER", "FOUND", "STILL", "WHILE", "AGAIN", + "PLACE", "YOUNG", "YEARS", "THREE", "RIGHT", "HOUSE", "WHOLE", "WORLD", "THING", "NIGHT", "GOING", "HEARD", + "HEART", "AMONG", "ASKED", "SMALL", "WOMAN", "WHOSE", "QUITE", "WORDS", "GIVEN", "TAKEN", "HANDS", "UNTIL", + "SINCE", "LIGHT", "BEGAN", "LARGE", "WATER", "WORKS", "OFTEN", "STOOD", "POWER", "MONEY", "ORDER", "MEANS", + "ROUND", "VOICE", "WHITE", "POINT", "STATE", "ABOVE", "DEATH", "LEAST", "KNOWN", "ALONG", "LEAVE", "ALONE", + "WOMEN", "TIMES", "SPEAK", "FORTH", "TERMS", "CRIED", "CHILD", "HUMAN", "SHORT", "CAUSE", "SEEMS", "BRING", + "DOUBT", "BLACK", "SENSE", "CLOSE", "TRUTH", "OUGHT", "PARTY", "READY", "FORCE", "EARLY", "EARTH", "EBOOK", + "SIGHT", "SPOKE", "STORY", "LATER", "ADDED", "STAND", "NICHT", "MILES", "COMES", "TABLE", "HOURS", "RIVER", + "HAPPY", "CLEAR", "SOUND", "MAKES", "BLOOD", "COMME", "DOING", "AVAIT", "TRIED", "FRONT", "QUILL", "PEACE", + "LIVED", "HORSE", "WROTE", "PAPER", "CETTE", "CHIEF", "PARIS", "BOOKS", "VISIT", "HEAVY", "KNOWS", "LOVED", + "CARRY", "PLAIN", "SWEET", "WRITE", "TREES", "BELOW", "WRONG", "REACH", "NOBLE", "PARTS", "AGREE", "MOVED", + "ENEMY", "WORTH", "GREEN", "THIRD", "MOUTH", "SLEEP", "FRESH", "FAITH", "SMILE", "USUAL", "BOUND", "QUIET", + "ETEXT", "COURT", "YOUTH", "PIECE", "SOUTH", "MEANT", "SEVEN", "TEARS", "VALUE", "BROKE", "FIGHT", "STONE", + "BEGIN", "HENRY", "LEARN", "LINES", "GRAND", "TAKES", "MONTH", "GIRLS", "GIVES", "EIGHT", "SCENE", "LIVES", + "DRAWN", "FIFTY", "FIELD", "CHAIR", "NAMED", "ALLOW", "MUSIC", "FIXED", "STUDY", "SPENT", "ROMAN", "TRUST", + "BREAK", "EQUAL", "NORTH", "THREW", "WATCH", "LOOKS", "BUILT", "USING", "SPITE", "MORAL", "WALLS", "TOUCH", + "JAMES", "STEPS", "OFFER", "DRESS", "LYING", "GRAVE", "LEGAL", "QUEEN", "LOWER", "CASES", "SHOWN", "NAMES", + "GREEK", "BOARD", "FAIRE", "GLASS", "SHARE", "FORMS", "CLASS", "START", "SHOOK", "TRAIN", "ENTER", "PROVE", + "FLOOR", "XPAGE", "WORSE", "SORRY", "PRIDE", "MARCH", "MARRY", "CROWD", "SHORE", "DRINK", "JUDGE", "SERVE", + "LAUGH", "TRADE", "BROAD", "GRACE", "PETER", "JESUS", "ROYAL", "LOUIS", "HEADS", "PROUD", "SPACE", "FULLY", + "QUICK", "IDEAS", "FANCY", "TASTE", "SWORD", "SHIPS", "DAILY", "GLORY", "BRAVE", "HONOR", "DREAM", "WEEKS", + "THICK", "CLAIM", "CHECK", "ASIDE", "REPLY", "FALSE", "SIDES", "CROSS", "SHARP", "FACTS", "HILLS", "BREAD", + "COAST", "DAVID", "AWARE", "GROUP", "FACES", "GROWN", "BIRDS", "MIDST", "TELLS", "LIKED", "THROW", "HABIT", + "STAGE", "ANGRY", "BROWN", "OWNER", "TIRED", "TRULY", "RULES", "TOTAL", "GRASS", "STYLE", "SAVED", "DRIVE", + "TWICE", "GUARD", "BURST", "PRICE", "WANTS", "THANK", "BASED", "APRIL", "GUESS", "CHOSE", "HOPES", "UNCLE", + "WOODS", "FINAL", "FORTY", "DROVE", "SPAIN", "TITLE", "UPPER", "MINDS", "NOISE", "HOPED", "BEGUN", "ALIVE", + "ITALY", "CRUEL", "SHAPE", "SLAVE", "BIRTH", "YOURS", "STORM", "CATCH", "LOOSE", "EMPTY", "CIVIL", "DOZEN", + "SHOWS", "ADMIT", "SMOKE", "DYING", "BRIEF", "APPLY", "PROOF", "FLESH", "FRUIT", "ENJOY", "WORST", "SHAME", + "ROUGH", "COVER", "ROCKS", "COUNT", "CRIME", "GRIEF", "IRISH", "NOTES", "NEEDS", "LANDS", "BLIND", "BRAIN", + "PRINT", "CLEAN", "DURCH", "ETAIT", "LEVEL", "RAISE", "EAGER", "STARS", "FAINT", "TEETH", "LABOR", "ROOMS", + "OLDER", "EINEN", "KNEES", "MERCY", "AWFUL", "AVOID", "DOORS", "INDIA", "ENDED", "DEVIL", "WEARY", "AROSE", + "FAULT", "CROWN", "COLOR", "AUSSI", "EVENT", "GOODS", "QUAND", "YARDS", "UNION", "ASCII", "TEMPS", "FAVOR", + "VOTRE", "SOULS", "CALLS", "AHEAD", "HARRY", "SMITH", "ANGER", "PLANS", "LOCAL", "LOVER", "PAGES", "LEURS", + "VIEWS", "SIGNS", "TEACH", "STOCK", "KINDS", "APART", "GUIDE", "ARMED", "EXACT", "HOMME", "TOUTE", "LATIN", + "TRIAL", "HOTEL", "SPEND", "SKILL", "KINGS", "SHALT", "LINKS", "DANCE", "SWEPT", "FATAL", "EINER", "WOUND", + "STORE", "SLEPT", "RANGE", "HATTE", "HENCE", "IMAGE", "ARISE", "FILES", "EINEM", "BANKS", "RAPID", "WASTE", + "ENTRE", "DARED", "PLANT", "SHADE", "ACTED", "CLOUD", "PRESS", "LOVES", "UTTER", "WINGS", "FLUNG", "BOWED", + "EGYPT", "GAZED", "THINE", "STICK", "FRANK", "REIGN", "MAJOR", "URGED", "FLEET", "TURNS", "SUGAR", "SPARE", + "SOLID", "BLAME", "BORNE", "WAVES", "TOWNS", "BOSOM", "CORPS", "SPEED", "GRANT", "FINDS", "MOINS", "BUILD", + "COSTS", "ERROR", "CEASE", "BOATS", "MIXED", "DELAY", "AGENT", "CLOTH", "ISSUE", "CHARM", "TREAT", "EMAIL", + "FRAME", "SHEEP", "ALIKE", "DUTCH", "PAUSE", "SEINE", "MERRY", "FEMME", "CRIES", "VAGUE", "TRACE", "VERSE", + "NOTRE", "FLAME", "HELEN", "IDEAL", "AVOIR", "HASTE", "ROUTE", "DREAD", "BIBLE", "EXIST", "OWING", "STERN", + "SAINT", "SORTS", "FALLS", "YIELD", "OCCUR", "GATES", "BONES", "OCEAN", "JEUNE", "SHAKE", "CARED", "STAFF", + "HURRY", "BEAST", "LOFTY", "BLESS", "TROIS", "INNER", "SHONE", "DRANK", "NOTED", "WINDS", "CHEEK", "CHAIN", + "KNIFE", "FEARS", "SWIFT", "WIVES", "WIDOW", "HATED", "HOLDS", "SIXTY", "MERIT", "GROSS", "DIESE", "ANGEL", + "MARIE", "FEVER", "FIRED", "AINSI", "ROADS", "CHINA", "QUEER", "GIFTS", "SWEAR", "NURSE", "CABIN", "MARKS", + "TRIBE", "ALOUD", "PAINS", "ALARM", "SCOTT", "OUTER", "WALKS", "NAKED", "FOLKS", "ELDER", "POETS", "MATCH", + "FOLLY", "WRATH", "DWELL", "SHOES", "SLAIN", "WAREN", "COACH", "ALICE", "TOWER", "DEEDS", "HABEN", "STEEL", + "TRAIL", "DEPTH", "BEARS", "PORTE", "SHOCK", "MOSES", "GUEST", "SCHON", "PLATE", "SAITH", "FEELS", "CLERK", + "STUFF", "TRACK", "POEMS", "PLAYS", "MAGIC", "KEEPS", "MONDE", "SONGS", "LEADS", "DRUNK", "AWAKE", "COEUR", + "SHOOT", "SMELL", "PETIT", "ALTAR", "AUTRE", "LIMBS", "EATEN", "TONES", "BASIS", "STEEP", "FEAST", "NOVEL", + "SILLY", "GROWS", "BADLY", "STOUT", "ALLES", "MARIA", "RISEN", "CREPT", "SCALE", "RANKS", "FLASH", "BURNT", + "RIVAL", "BRIDE", "TALES", "BOOTS", "CHEST", "SEATS", "GRAIN", "PRIZE", "FETCH", "DIRTY", "MOUNT", "CURSE", + "STIFF", "BEARD", "BARON", "NEGRO", "ASSEZ", "UNTER", "MODEL", "GRASP", "FIRES", "FLOOD", "ALORS", "JOURS", + "FLOUR", "STOLE", "POUND", "SWUNG", "ALTER", "SHEET", "CENTS", "DWELT", "CLOAK", "ROSES", "ROOTS", "CLOCK", + "SCORE", "GLOOM", "AGONY", "SEIZE", "PIOUS", "WAGES", "BLOWS", "WHEEL", "SAGTE", "CARES", "VITAL", "RISES", + "BILLY", "AVANT", "OWNED", "SCORN", "METAL", "ABIDE", "IMMER", "JONES", "STUCK", "SHOUT", "PAINT", "DRIED", + "AMPLE", "RUINS", "MAYBE", "FILLE", "SIEGE", "STEAM", "BETTY", "MILLE", "TRICK", "TYPES", "SHELL", "REFER", + "GIANT", "LORDS", "ROGER", "FIFTH", "FACED", "DATES", "MEINE", "HOMES", "LINEN", "VIVID", "STRAW", "BRASS", + "NAVAL", "MADAM", "BONNE", "FADED", "SPORT", "DROPS", "DINED", "BEACH", "LOYAL", "CELUI", "LIKES", "CARDS", + "RACES", "CHEAP", "TRUNK", "RALPH", "CHEER", "JOINT", "EINES", "SPELL", "ABODE", "WAVED", "DRAMA", "ARRAY", + "CRAFT", "CANOE", "GEGEN", "RIFLE", "CODES", "FIERY", "MIEUX", "TAXES", "AWOKE", "LIMIT", "ASHES", "JACOB", + "GHOST", "BELLS", "STEAL", "ALLER", "CLIMB", "HEELS", "TEXAS", "TERRE", "MUTTA", "SOBER", "HARSH", "SHINE", + "KNOCK", "PEINE", "SPAKE", "VIRUS", "DEALT", "MINOR", "LAURA", "SLOPE", "HUMOR", "BENCH", "WHEAT", "MAMMA", + "PIANO", "FUNNY", "SIMON", "ROCKY", "SWEEP", "SADLY", "ERECT", "BELLE", "PURSE", "PARCE", "CLUNG", "SWORE", + "FENCE", "WORRY", "SUITE", "JAPAN", "WAGON", "POLLY", "EVILS", "CELLE", "HENRI", "JETZT", "PETTY", "BANDS", + "CHASE", "GLEAM", "UNITY", "HASTY", "ACRES", "MAINS", "LUCKY", "PERIL", "ADAMS", "HIRED", "FILED", "EXTRA", + "FLIES", "DOUTE", "TIGHT", "BLANK", "JULIA", "ENFIN", "SEEDS", "IHRER", "FAIRY", "SITES", "SMART", "ETWAS", + "WURDE", "SHIRT", "ELECT", "SPOIL", "GUILT", "ADOPT", "BILLS", "CLARA", "HOLES", "ELLES", "SAILS", "RINGS", + "EDITH", "FANNY", "BLOWN", "RIDGE", "DENSE", "TODAY", "SHEER", "ABUSE", "RESTE", "QUOTH", "LUNCH", "NIECE", + "TIMID", "MANLY", "SWORN", "PRIME", "PROSE", "BOXES", "VILLE", "LEWIS", "CREEK", "ORGAN", "BRUSH", "OPERA", + "FLOCK", "SUSAN", "BOAST", "PITCH", "ANGLE", "ELLEN", "SUNNY", "AUGHT", "FOOLS", "SWAMP", "VEINS", "NEWLY", + "COUCH", "VIEUX", "JOLLY", "OPENS", "SPEAR", "BRICK", "CREAM", "THIEF", "WAIST", "RULED", "KNELT", "SARAH", + "BRUTE", "SENDS", "MINES", "DATED", "PATHS", "MOVES", "SHOPS", "PORCH", "IHREN", "TENTS", "BACKS", "KITTY", + "SANDY", "PUPIL", "LODGE", "BLOOM", "BONDS", "BLOCK", "SATAN", "SWELL", "RIGID", "OLLUT", "GAMES", "SANTA", + "DEBTS", "FELIX", "SPOTS", "SCENT", "HEEFT", "CIGAR", "ALLAH", "ENTRY", "SAXON", "AVAIL", "MAINE", "EFFET", + "TREAD", "WIDER", "OLISI", "CHILL", "BROOK", "AMUSE", "ALLEN", "COMTE", "ROBIN", "SKALL", "VEXED", "BALLS", + "KEINE", "CROPS", "UEBER", "REALM", "EMILY", "MONKS", "REBEL", "WALES", "LAMPS", "EXILE", "HEARS", "UNITE", + "ROBES", "SKIES", "SIXTH", "SEULE", "CRAZY", "ISAAC", "IHNEN", "RULER", "WRECK", "DRAWS", "DIDST", "ARROW", + "STARE", "DROIT", "BLUSH", "DONNE", "SOBRE", "PRIOR", "VOTES", "MATIN", "THEME", "FINER", "PSEUD", "NERVE", + "APPLE", "RESTS", "PENNY", "STAKE", "BROWS", "READS", "BUNCH", "TWAIN", "TOKEN", "TALKS", "WISER", "HORNS", + "APRES", "BLAZE", "SORTE", "CLIFF", "STRIP", "TEXTS", "AWAIT", "ELBOW", "GLOBE", "FLUSH", "UPSET", "AVONS", + "TURKS", "JANET", "GENUS", "LOCKS", "HONEY", "CARGO", "LEBEN", "STOVE", "CANAL", "JERRY", "CRACK", "POSTS", + "PIETY", "LADEN", "BLADE", "LINED", "HONOM", "NOISY", "DRIFT", "DECAY", "FUNDS", "MIRTH", "TOOLS", "ACUTE", + "AUGEN", "PACES", "SPLIT", "BREED", "VENUS", "JUICE", "PLATO", "FREED", "FAILS", "PORTS", "BLISS", "USAGE", + "HEURE", "PILED", "RATES", "AIDED", "BYRON", "WIPED", "HOMER", "STAMP", "VICES", "VATER", "TOMMY", "PIEDS", + "TROOP", "SAGDE", "BLAST", "MOTOR", "RURAL", "WEARS", "CREED", "VOTED", "DELLA", "GLARE", "SKINS", "TODOS", + "SHAFT", "VENIR", "NANCY", "CROIS", "DAVIS", "QUOTE", "PLEAD", "ITEMS", "SWING", "SEEKS", "CREST", "BASIN", + "LAKES", "SNAKE", "SALES", "DUSTY", "CRUSH", "MEETS", "TENTH", "SALLY", "MEALS", "GROVE", "SUITS", "SMOTE", + "LANGE", "ACTOR", "ARGUE", "FLOWS", "DIMLY", "REEDS", "PLANE", "GREET", "SWEAT", "DIANA", "BRUIT", "ROOFS", + "SANOI", "BEAMS", "JIMMY", "PILOT", "ARABS", "FROST", "CELLS", "MOORE", "AYANT", "PERCY", "EDGAR", "PIPES", + "MOLLY", "QUEST", "FOLDS", "CURED", "PASSE", "RHINE", "MAIDS", "MULES", "REINS", "SALON", "CANST", "AUCUN", + "ALERT", "RENEW", "EDGES", "IHREM", "SWISS", "PATCH", "ALOFT", "CRUDE", "AIMED", "NAILS", "RECHT", "SAGEN", + "VIGOR", "TRIES", "FLANK", "TRACT", "VERGE", "ELSIE", "TRAMP", "IVORY", "CRASH", "CURVE", "CAKES", "EAGLE", + "HEDGE", "VOULU", "RITES", "LOGIC", "CLARK", "SPARK", "SINGS", "EPOCH", "MAYOR", "WEIGH", "ONDER", "ABBEY", + "KEITH", "AGNES", "ESSAY", "VALET", "HOSTS", "HANGS", "COMIC", "PANIC", "PEDRO", "COATS", "SCOPE", "FRAIL", + "BURKE", "GOALS", "MODES", "SKULL", "FLOAT", "RHODE", "PULSE", "LOSES", "DANTE", "TOPIC", "TIGER", "FEWER", + "PINES", "SHIFT", "HEAPS", "VIENT", "FILLS", "REINE", "FORTS", "LIONS", "MILAN", "ZIJNE", "LUNGS", "SANDS", + "PHASE", "HALLS", "ROUSE", "DAISY", "PARTE", "FARMS", "SKIRT", "SATIN", "RAINS", "HINTS", "CABLE", "GARDE", + "THUMB", "QUART", "HARDY", "ELLER", "POLES", "AARON", "SYRIA", "GROAN", "ROPES", "MOULD", "JENNY", "ROLLS", + "BACON", "MOIST", "FLING", "LANCE", "PARTI", "SHELF", "ETHEL", "MALES", "PLUCK", "SHOTS", "STOPS", "ALIEN", + "FRAUD", "CLUBS", "NEWBY", "CREEP", "TILDE", "SHAWL", "FORME", "AFORE", "RAOUL", "FROWN", "SNOWY", "LISTS", + "STONY", "FLAGS", "BORED", "MELAN", "PGLAF", "CURLS", "EFTER", "STAID", "TOUGH", "CHOIR", "HASTA", "DITCH", + "CLARE", "WITCH", "RIDER", "SEHEN", "MASON", "WEEDS", "TENDS", "PALMS", "FLUID", "VILLA", "STADT", "IRENE", + "SAUCE", "PAVED", "ANNIE", "MUDDY", "SEXES", "USERS", "STRAY", "DAMIT", "OATHS", "WIDTH", "STAIN", "STEED", + "UNFIT", "BEADS", "HERDS", "INDEM", "WENIG", "VINES", "BLAKE", "GORGE", "DEMON", "CANON", "BRISK", "GANZE", + "TUTOR", "SIGHS", "RAINY", "TANTO", "MOYEN", "HELPS", "GRADE", "PEAKS", "ELLOS", "PARMI", "PARLE", "ALLAN", + "FLORA", "PELLE", "APRON", "COINS", "CITED", "LIEBE", "DEREN", "WELSH", "HOOFS", "PAIRS", "DONNA", "VOWED", + "WEIRD", "IRONY", "BRUCE", "BEANS", "DOLLY", "CLING", "LAPSE", "GAILY", "DUSKY", "TEGEN", "WITTY", "WRIST", + "TORCH", "MONTE", "SHADY", "AMOUR", "BESET", "ATHOS", "COUPS", "TRUCE", "GOATS", "VAULT", "SPURS", "GAINS", + "TELLE", "TOAST", "VINGT", "LAYER", "ARMOR", "JUDAH", "KOMMT", "MOODS", "IMPLY", "LEVER", "JOTKA", "EXERT", + "FOULE", "SPIES", "YACHT", "ALTEN", "PAGAN", "TENSE", "ALOOF", "VALOR", "HYMNS", "ENVOY", "PINCH", "PRONE", + "HELLO", "BROOD", "MABEL", "FOWLS", "HERRN", "DROWN", "ROUGE", "BURNS", "MISMO", "CALME", "LIVRE", "SLIDE", + "LYONS", "CAIRO", "PATTY", "CASTE", "STOOP", "BAKER", "MILLS", "BLEST", "TAILS", "VOICI", "LOGIN", "FARED", + "CHANT", "SEITE", "FABLE", "MISTS", "DIEGO", "ROWED", "WORDT", "DUCKS", "MAXIM", "BOERS", "LEVEN", "SWARM", + "QUANT", "MUSED", "WAITS", "CHALK", "BEIDE", "FORTE", "CAVES", "JEDER", "SENOR", "INFER", "TRAIT", "TASKS", + "DIARY", "HOUND", "SAVEZ", "BLUFF", "PENSE", "CECIL", "JUDAS", "OUNCE", "STARK", "DRAIN", "LEAPT", "WEISE", + "CLAWS", "TWINS", "IDOLS", "SUJET", "ALTSP", "WILLS", "RAGED", "HAVDE", "BEAUX", "FRITZ", "DARES", "DEPOT", + "DAZED", "RODIN", "LOWLY", "STUNG", "NASTY", "DEITY", "BOBBY", "ELIZA", "SIZES", "GAUNT", "LYDIA", "KNEEL", + "RISKS", "DURST", "TENOR", "STEMS", "FAITE", "LIVER", "STEAD", "EVANS", "TESTS", "GILES", "HUNNE", "SEALS", + "PLANK", "SINKS", "WHIRL", "SCREW", "SPOON", "GEHEN", "HABIA", "JAHRE", "BARRY", "AMPLY", "FRANZ", "TENIR", + "SLICE", "CARTS", "EDWIN", "DEALS", "JUSTE", "WHALE", "VIVRE", "PARUT", "HAUSE", "WESEN", "GEESE", "NAMEN", + "PASTE", "NIETS", "SCRAP", "LIBRE", "ADORN", "NOSES", "MADLY", "USTED", "WELKE", "ARDOR", "TROUT", "WELLS", + "ZEIDE", "DINGY", "SOEUR", "KNAVE", "KNOTS", "TIENE", "SEELE", "ESSEX", "CRAWL", "THEFT", "WEDER", "AREAS", + "STAIR", "ORION", "HEUTE", "DADDY", "COUGH", "GUISE", "PARMA", "FISTS", "GENUG", "FAUST", "AQUEL", "SNEER", + "PLOTS", "DAVON", "JENER", "PLUME", "GEBEN", "HAUTE", "PADRE", "ABBOT", "VOILA", "SELON", "ODOUR", "MEDAL", + "OPIUM", "DRAKE", "AMISS", "ETTEI", "GLOVE", "BLEAK", "SACHE", "GENRE", "RATIO", "DRUGS", "WINES", "HINDU", + "POOLS", "VISTA", "SCANT", "CORDS", "RAILS", "STAYS", "GENOA", "WHARF", "COSAS", "STEHT", "PRIMA", "DEUCE", + "KILLS", "MADGE", "BLUNT", "PASSA", "WAKED", "PUNCH", "SABLE", "FLOWN", "DRILL", "LIFTS", "ILLUS", "CRISP", + "WORMS", "FLINT", "HANDY", "ALLEY", "MASTS", "FIEND", "STUMP", "ADULT", "LEUTE", "SCRUB", "DECKS", "PANGS", + "CAMEL", "DEINE", "TITUS", "INDEX", "HAVEN", "HILDA", "GEIST", "ORDRE", "THORN", "TOILS", "CEDAR", "LOADS", + "WAXED", "SOPHY", "DAHER", "GAUGE", "WAGER", "JULIE", "WILDE", "PEERS", "AISLE", "BLANC", "LONGS", "ELLIS", + "MINUA", "CARLO", "SCARE", "LEVIN", "KUNDE", "DINGE", "SNARE", "WEISS", "STALE", "FAITS", "AVERT", "HADST", + "BATHS", "XVIII", "TIDES", "TINTS", "BULLY", "AZURE", "WHIGS", "VIELE", "ATOMS", "PERRY", "BLICK", "GIDDY", + "SOLAR", "FARCE", "BOWER", "WARES", "FROID", "SLIPS", "RENTS", "FEATS", "LEASE", "BLAIR", "BLAND", "CONDE", + "MARSH", "RUMOR", "BERTH", "BATHE", "BOOTY", "GLIDE", "ENNEN", "BERRY", "PAULA", "AIVAN", "FRIED", "DANES", + "WORTE", "BOOTH", "OTROS", "TAXED", "TWIGS", "ERSTE", "UNDUE", "CLUMP", "RICHE", "LIEGT", "LYRIC", "IHRES", + "LASTS", "ANNOY", "WEGEN", "OOGEN", "SELFE", "DABEI", "CASTS", "BOUGH", "ROUEN", "DIGNE", "SILAS", "LOCKE", + "CHART", "MAKER", "PEGGY", "SNOWS", "DETTA", "CHRIS", "ARENA", "QUIEN", "RELIC", "SECTS", "DOUCE", "BRIBE", + "FRIAR", "TINGE", "COURS", "VIENS", "HACER", "PEPYS", "LANES", "ETHER", "VICAR", "STEVE", "JASON", "VOCAL", + "JOINS", "BASES", "UNSER", "LIGNE", "DINAH", "VASES", "TEDDY", "NEUEN", "CURLY", "VALID", "CLEFT", "CHAPS", + "BARGE", "HAGUE", "BOLTS", "DARIN", "SMELT", "TULEE", "VOYEZ", "PURER", "ENTRA", "ODDLY", "VAPOR", "EENEN", + "SPIED", "SLATE", "CREWE", "BRACE", "CYRIL", "OSCAR", "IRONS", "DESDE", "LAMBS", "VROEG", "VROUW", "DICKY", + "KRAFT", "RALLY", "RESTA", "CRAVE", "GAYLY", "LEAPS", "FLUTE", "ONCLE", "SCOUT", "GOWNS", "SWINE", "GREED", + "ONION", "SAGES", "AMBER", "TARRY", "GRATE", "GESTE", "ANDRE", "MOEST", "JUURI", "CESSE", "SHEWN", "THIGH", + "LEAFY", "BENDS", "FERME", "BRAKE", "HURTS", "GRIND", "SILKS", "CLASH", "JELLY", "SOOTH", "DIZZY", "NEBEN", + "INCUR", "DOVER", "VERRE", "HAIRY", "STALK", "TOMBE", "HEAVE", "MUCHO", "INTER", "SPADE", "CREWS", "DENIS", + "HIELT", "FOSSE", "BULLS", "ALLEZ", "SOMME", "SNUFF", "BLIEB", "HAVOC", "ALLEM", "SMITE", "LACKS", "THROB", + "GUTEN", "PUEDE", "CLICK", "TIRER", "KORAN", "FLASK", "GRUND", "TERRA", "CAUSA", "GAUDY", "HIRAM", "JETER", + "FIBRE", "VERBS", "FORGE", "WAERE", "SPECK", "OLDEN", "SHRUB", "FLEDA", "GODLY", "HOOFD", "SONNE", "EDICT", + "DAGEN", "ISLES", "CHASM", "EDGED", "TRAPS", "BIRCH", "TRUER", "PAPAL", "ASSIS", "MASSE", "MORTE", "HETTY", + "REPEL", "INGEN", "SHRUG", "KOMEN", "PRISE", "HENNE", "LIVID", "BRIAN", "SALAD", "MATES", "BOVEN", "DOUZE", + "MEATS", "FEEDS", "TANTE", "WENCH", "DARTS", "FLATS", "TUBES", "UNITS", "HECHO", "PERCH", "POURS", "TRIPS", + "CIVIC", "MUNDO", "SPRAK", "ANTES", "SCARF", "DELLE", "HYVIN", "VASTE", "FOLIO", "NEEDY", "YELLS", "FAUTE", + "REGAL", "HOOKS", "ELIOT", "PALER", "TRENT", "MALTA", "MAKEN", "LUCAS", "NOUNS", "ATTIC", "WINDY", "SPIRE", + "SIEHT", "DERBY", "SAVOY", "MAUDE", "ILIAD", "DITTO", "PLINY", "FERNS", "BASIC", "GRAPE", "SOGAR", "TYING", + "DOUGH", "DERAS", "LEANT", "BELLA", "LICHT", "FILTH", "PEARL", "LUSTY", "OLIVE", "DROLL", "BADGE", "WAGED", + "SEEST", "ANKLE", "FERRY", "PENAL", "NEUER", "ESTOS", "FUMES", "SHEDS", "SHOWY", "SALEM", "REDEN", "STALL", + "JOYCE", "SANTO", "ZELFS", "HOTLY", "SCOLD", "CANDY", "LUCIA", "WEAVE", "MONTA", "SLACK", "VOGUE", "RHODA", + "SLANG", "FOODS", "PRIVY", "SERAI", "RENDU", "VALVE", "KUNST", "CYCLE", "EXCEL", "QUASI", "CRAIG", "VERTU", + "AVEVA", "MAYST", "HEATH", "MEDIO", "CELIA", "DEEZE", "BATES", "ATONE", "VENUE", "LURID", "SKOLA", "MDLLE", + "CHOKE", "PREND", "DARAN", "SAVES", "MANOR", "FORKS", "GENTE", "DITES", "TEAMS", "GOETH", "STOND", "COOKS", + "CHIEN", "PANEL", "GROWL", "MURAT", "BODEN", "DERES", "CAIUS", "FRERE", "HEIDI", "BROTH", "TEMPO", "JONAS", + "BROOM", "RACED", "SACKS", "TERRY", "NOOIT", "GENOM", "RAVEN", "FROGS", "ANNUM", "ACHED", "HEROD", "NOIRE", + "SURLY", "EIGEN", "EVADE", "BUGGY", "CONNU", "ATQUE", "WAKES", "REMIT", "REEFS", "ASSES", "MORSE", "RUFUS", + "ROMEO", "CHORD", "SLOOP", "LOANS", "TAWNY", "ETIAM", "NOCHE", "CONGO", "GHENT", "BINDS", "SLUNG", "CUBIC", + "GROOT", "DARUM", "MUSES", "GERMS", "NYMPH", "CUPID", "LUTTE", "FINES", "LUEGO", "PSALM", "HOARY", "XXIII", + "MUJER", "CROWS", "DECIR", "SULLA", "TITRE", "MAPLE", "SALTS", "POSTE", "DODGE", "ARMEN", "DISSE", "MACHT", + "FOCUS", "LITHE", "PASHA", "HIJOS", "BUSSY", "FLEUR", "JOLIE", "SMASH", "NORAH", "DOGMA", "TUTTO", "BOWLS", + "JEDEN", "LOATH", "JESTS", "MALAY", "DIGIT", "PENCE", "JOUER", "NORSE", "SLEEK", "DOWRY", "DEFER", "SELLS", + "CALEB", "BLEED", "DOWNS", "BABES", "DENTS", "ALKOI", "JEDEM", "PANES", "SINNE", "LEIGH", "MENOS", "WILDS", + "WOLFE", "ANDRA", "IDAHO", "DOWNE", "BETSY", "ADAPT", "MIJNE", "LIESS", "DICHO", "NELLY", "TUDOR", "BLOND", + "GRAVY", "FRAGE", "AELIG", "TIENT", "STEIN", "PLIED", "SABRE", "SQUAD", "STAAT", "REVEL", "YOLKS", "SEWED", + "CRANE", "SYRUP", "GIVER", "SEULS", "HAINE", "CASEY", "HICKS", "KATIE", "LOINS", "ABEND", "EXALT", "DENNA", + "STIRS", "SMOKY", "EUERY", "NICHE", "ONELY", "SINUN", "RABBI", "BRUST", "ELIAS", "JOSSA", "PAYER", "VEILS", + "CHAFF", "SULKY", "JUNGE", "PEACH", "MAMAN", "TUNES", "KAMEN", "DIANE", "LUMPS", "SHAVE", "CLOWN", "SHINY", + "LATEN", "HUSKY", "TOWEL", "REPOS", "GLADE", "GEORG", "NUEVA", "MANIA", "SAKES", "KEATS", "PULLS", "SIOUX", + "TAINT", "SUIVI", "CROIT", "MUUTA", "TILES", "BUSHY", "BLEND", "HAPLY", "ANJOU", "TRITT", "TURIN", "PLATZ", + "FAMED", "BARNS", "VECES", "DAMON", "LANGS", "HUMPH", "RELAX", "AUNTS", "SALUT", "CRAGS", "SHOAL", "COLIN", + "MOSSY", "GAULS", "CASKS", "WRING", "AHORA", "SPICE", "BONNY", "CURES", "BRUNO", "BRAVO", "ANDER", "CHESS", + "ALIAS", "SAUCY", "NOIRS", "TUNIC", "TOMBA", "LURED", "POKER", "RADIO", "CHAMP", "FINDE", "HULLO", "MECCA", + "SCALP", "FORMA", "SCARS", "MORTS", "BASSE", "SPINE", "PEREZ", "DIVAN", "HONTE", "LINDA", "ENVIE", "TEASE", + "BARED", "MADRE", "TUTTI", "OUTRE", "OMDAT", "LUCID", "SURGE", "CLAIR", "ONSET", "PONDS", "AUTEM", "MOODY", + "BALES", "SEDAN", "GALES", "LATCH", "LENDS", "LUIGI", "CAREY", "HOIST", "OTRAS", "GWINE", "WARUM", "DIVED", + "STRAP", "KELLY", "BEECH", "TROTH", "CHLOE", "PUNTO", "CIELO", "FROZE", "BUGLE", "POISE", "SIEUR", "TRUCK", + "ZEKER", "FOXES", "BALMY", "PICKS", "ISLAM", "AMEND", "DROOP", "LOPEZ", "DAIRY", "WALTZ", "BLOSS", "KYSYI", + "NAIVE", "SHORN", "URGES", "MAIZE", "WIELD", "HOLLY", "ARTER", "YORKE", "FRAIS", "NIGEL", "PAYNE", "COMET", + "SHUTS", "SOCKS", "HORDE", "SKIFF", "HACIA", "BESTE", "PARKS", "INERT", "PARLA", "INLET", "ODORS", "PRICK", + "KOREA", "FORUM", "LIEGE", "JEDES", "LIETH", "GASES", "SENZA", "TISCH", "PRATT", "ABNER", "BURLY", "BRAND", + "MINER", "TRACY", "LUGAR", "LAWNS", "GOTHS", "TARDY", "WIGHT", "DRURY", "VADER", "COOKE", "LAIRD", "TUFTS", + "FIXES", "SOLES", "VOWEL", "CLIVE", "KOSKA", "TAPER", "GUSTS", "RIANT", "FERAI", "COILS", "GROND", "SOINS", + "ABATE", "AFOOT", "EMILE", "POCHE", "LASSE", "ADELA", "PORTA", "BULKY", "MASKS", "DORIS", "KOMMA", "TAMEN", + "CRIER", "LOBBY", "ERNST", "EXPEL", "MANGE", "PACKS", "FATED", "DOVES", "DOLLS", "METRE", "AVAIS", "NEWER", + "LOGAN", "FREER", "DENNE", "MILLY", "GENIE", "STILE", "WARDS", "GEVEN", "WROTH", "BOONE", "COMER", "ANGUS", + "USHER", "CEDED", "PUFFS", "EBONY", "MIMIC", "SIEVE", "MEDIA", "ATLAS", "DESSA", "DUKES", "TERUG", "GRIMM", + "HAYES", "INDRA", "SHEWS", "DUMAS", "MYTHS", "FACON", "LILAC", "MISER", "TACIT", "SABER", "TUNIS", "NELLA", + "PORTO", "EERST", "ENNUI", "CIDER", "POUCH", "JUIST", "SHYLY", "NEVIL", "FROTH", "GIPSY", "EINST", "HERRA", + "ALLAY", "DANDY", "TOWNE", "HARTE", "HOHEN", "PLUIE", "NEIGE", "FASSE", "WAKEN", "YEAST", "CADIZ", "MINCE", + "WOODY", "AVOIT", "BOIRE", "PIERS", "FANGS", "KRIEG", "SAHIB", "DRYLY", "BELTS", "LACED", "WAYNE", "KOMME", + "AWARD", "FRANC", "FUERA", "IDEES", "COUPE", "VIOLA", "QUERY", "VENOM", "WAZIR", "SLABS", "FATES", "DIXON", + "POKED", "TOURS", "CHEFS", "ABACK", "PAOLO", "BECKY", "OAKEN", "KLEIN", "MOONS", "POLAR", "PRAYS", "DEIGN", + "CROOK", "SOLON", "LEANS", "PUPPY", "FINIT", "XXVII", "FOLIE", "POTTS", "LABEL", "SUSIE", "STACK", "POIDS", + "JESSE", "BLEEF", "HILLY", "BITTE", "WADED", "AIKAA", "EAVES", "MINUS", "REPAS", "NANCE", "DELHI", "HAZEL", + "ORBIT", "SURER", "TYLER", "DELIA", "RAJAH", "JUDEA", "STATT", "MENGE", "WHIMS", "BOYNE", "WHIPS", "PAINE", + "LIBEL", "MANOS", "TAMED", "CHIPS", "REIHE", "SWANN", "QUALE", "SPASM", "VRAIE", "TWINE", "CLIME", "ABHOR", + "DOMES", "KNOLL", "VISTO", "WEDGE", "GRIMY", "ROVER", "WRAPS", "LEVEE", "LEGTE", "AMITY", "NIHIL", "HALLO", + "CARVE", "TREND", "DAYES", "HEARE", "DEZEN", "SAISI", "COCOA", "QUEUE", "SWOON", "WAGEN", "PUMPS", "TRASH", + "SHARK", "MEADE", "RECUR", "DREGS", "VOILE", "CANTO", "HAVRE", "FATTO", "SNEAK", "MISMA", "SHOVE", "SOYEZ", + "CRANK", "FINED", "JUMPS", "BRYAN", "VENEZ", "ENSUE", "WILES", "ROARS", "FREAK", "POSSE", "SINUA", "FUSIL", + "DAHIN", "BEGAT", "ELUDE", "CROIX", "CLANG", "HOARD", "HATCH", "SOILS", "SAMMY", "STARR", "POIKA", "ELISE", + "LISZT", "JENES", "WIRST", "RUHIG", "MEDEA", "RAIDS", "NOOSE", "LETTY", "CHERE", "EASED", "SERVI", "MEJOR", + "FEARE", "SMACK", "ALTRI", "HITCH", "GETAN", "MITEN", "MAVIS", "ACIDS", "BEGET", "GARTH", "TIERS", "ANTON", + "NICER", "TANKS", "CESAR", "CANES", "PLUMB", "VANCE", "BEGOT", "DETER", "FLARE", "BOMBS", "FITLY", "JENEN", + "FLIRT", "HABER", "JOITA", "CHUTE", "READE", "STETS", "STEAK", "GAUZE", "SPARS", "PEARS", "PIQUE", "GLACE", + "PATSY", "HOVER", "RIPEN", "SWANS", "VARRO", "MARSE", "SONGE", "GUILE", "CANNA", "NACHT", "SALLE", "CARTE", + "AMMON", "TASSO", "RAZOR", "WHIST", "OMENS", "NIMMT", "GOEDE", "GRUNT", "DIRAI", "SPIKE", "COCKS", "DIEUX", + "SUURI", "UTILE", "SEREZ", "SOTTO", "STAAN", "DACHT", "LUNAR", "WHOSO", "DINNA", "CRETE", "PADUA", "SERGE", + "CACHE", "CHILI", "TIBER", "TAGEN", "RIGOR", "BIDDY", "AIMER", "MOUSE", "OXIDE", "PESOS", "SLING", "SPILT", + "BOWEN", "SINON", "SINAI", "TULLA", "TONIC", "LOIRE", "JUGER", "HAUPT", "CADET", "COSMO", "OCCHI", "CLANS", + "MUSTY", "MUMMY", "NIGER", "GOULD", "SQUAW", "UNTEN", "PENSA", "BIJNA", "CONTI", "NASAL", "TAUNT", "SILKY", + "NUNCA", "KAKSI", "DUCHY", "MELTS", "VASTA", "DAVIE", "QUELS", "ANCHE", "LIEUT", "BARDS", "BUNNY", "RILEY", + "TIENS", "MOTHS", "OMNES", "TANTA", "WOOED", "BRENT", "RASCH", "JADED", "ERRED", "BRAGG", "GUIDO", "HURON", + "LEILA", "VEDAS", "DEEPS", "RHONE", "SOWED", "BADEN", "NOMME", "SLUNK", "DEARS", "GUTER", "HIELD", "FEUER", + "LUPIN", "HAGEN", "JAMIE", "PLUMS", "GUSTO", "WETEN", "TENER", "HAWKS", "FOLLE", "CHILE", "SAADA", "SQUAT", + "KNACK", "MOORS", "SCOWL", "JENEM", "PLAZA", "SHEEN", "UNSRE", "DETTE", "WEBER", "BITES", "MASSA", "TUOTA", + "WOORD", "DOCKS", "AGILE", "SERFS", "OASIS", "BEGON", "LACES", "CORDE", "MEYER", "REISE", "FOGGY", "DINER", + "HUMID", "QUAIL", "LILLY", "FADES", "WRAPT", "GRUFF", "WEEPS", "ETTAE", "MARAT", "REICH", "LUSTS", "DICHT", + "APACE", "BUENA", "SLIMY", "TRUMP", "JOUES", "DUCAL", "COVET", "GIEBT", "AMANT", "FEIGN", "MEIST", "RATED", + "DOIGT", "ELLAS", "CHOIX", "GLOWS", "PALED", "MOOSE", "SHEAF", "SWARD", "HAREM", "DORIA", "PIKES", "WREST", + "MITTE", "TOOKE", "CHUMS", "TENGO", "LOTUS", "CUFFS", "KIRBY", "BARKS", "GYPSY", "BLOIS", "URBAN", "SIBYL", + "TIRES", "JOSTA", "TEILS", "ODIUM", "PURGE", "DOSES", "WEZEN", "NEPHI", "LIBRO", "SLYLY", "VIGIL", "HADES", + "THUMP", "BUYER", "RYDER", "ARYAN", "SNARL", "CHIME", "ROBED", "AUREZ", "DESTO", "SLEET", "CUBAN", "RARER", + "SEVER", "WOLLE", "FOYER", "SHAKY", "CAGES", "VANHA", "BETER", "TARDE", "VNDER", "FOURS", "KARNA", "POORE", + "OMNIA", "ACTES", "GOWER", "NINTH", "GENAU", "CLAUS", "BIENS", "KOHTA", "NUITS", "BRAID", "FEUDS", "GANGS", + "ILMAN", "LEECH", "NEQUE", "ANTAA", "BARBE", "MAGNA", "PILLS", "PANTS", "EARLE", "MERCI", "PERTE", "BABEL", + "LUCHT", "TENIA", "SEUIL", "DEGLI", "HARES", "VILDE", "RIOTS", "GJORT", "PIPER", "ZEIGT", "TIBET", "KICKS", + "JADIS", "SPELT", "PLAID", "CERCA", "FALLU", "MURKY", "HEINE", "REVUE", "CAMPO", "AMAZE", "LOOMS", "COSTA", + "STYPE", "JONAH", "CHUCK", "RELAY", "FIBER", "GLINT", "SLOTH", "MUSIK", "MOTIF", "BATCH", "SOWIE", "PATER", + "DEANE", "DOETH", "OBJET", "GAIUS", "LAMPE", "DOZED", "GULLY", "SEAMS", "BOYCE", "MAILS", "USEIN", "HENDE", + "PSHAW", "WHINE", "PRINZ", "WILLY", "HALFE", "MILKY", "ANVIL", "SHRED", "CHIDE", "EFFIE", "MOANS", "LEITH", + "COPSE", "DRAGS", "FARRE", "BANDE", "BHIMA", "YATES", "NIVER", "DEVEZ", "LAGEN", "OMBRE", "JONGE", "WATTS", + "ISTUI", "TUSKS", "AMACR", "JAREN", "VARIT", "REDDY", "PRIAM", "PRIMO", "COWED", "TOWED", "AVERY", "AXIOM", + "HOVEL", "BRICE", "CONES", "KUNNA", "LEISE", "HOBBY", "MINUT", "POOLE", "SINGH", "BOILS", "SATTE", "CRABS", + "MERLE", "WARNS", "FOURE", "ACHES", "YEARN", "SAHEN", "AILES", "LORRY", "LOVEL", "LUEUR", "SLANT", "METER", + "PHONE", "TAGES", "SUPER", "FUSED", "GLOSS", "NULLA", "ADEPT", "COREY", "LEGER", "SUAVE", "GAZES", "NEMEN", + "NOGET", "PANDU", "CAREW", "XXXII", "SCAMP", "HEATS", "TIPSY", "HOWLS", "MEMES", "ROOMY", "SANOA", "HAYDN", + "JETTE", "AMORY", "CONTE", "VERRA", "TILLY", "WELCH", "PEALS", "SULLY", "BRINE", "MOINE", "FACTO", "BORDS", + "FIRMS", "FARES", "TUNSI", "WAXEN", "BULBS", "BLIVA", "MESSE", "BRISE", "BORIS", "KAUAN", "RAKED", "IBSEN", + "PINTS", "DENKT", "POPES", "WHIFF", "SYBIL", "QUITS", "ARGOS", "AGGIE", "ANDES", "DALLA", "ABOOT", "EINDE", + "GERNE", "TYROL", "FADER", "SORTI", "MEDES", "AMIGO", "CELTS", "LEONE", "LILLE", "AGLOW", "INJUN", "KEEPE", + "RUINE", "LIEUX", "GEENE", "AUDIO", "SEETH", "STREW", "GRAZE", "KHAKI", "ABRAM", "APTLY", "HEERE", "ETANT", + "GOOSE", "POSED", "CHOPS", "ALTRO", "TITHE", "ANGST", "WORIN", "HIGHT", "CREAK", "NULLE", "DOWER", "SENTI", + "QUELL", "CHINK", "DESIR", "SETZT", "JAUNE", "LYNCH", "SPOUT", "PORES", "GOMEZ", "GABLE", "ACRID", "COZEN", + "BROCK", "DOYLE", "ZWECK", "ACTON", "RARES", "PIPED", "ZONES", "LIARS", "BOYLE", "KAMPF", "ALBUM", "SNIFF", + "MARES", "SHACK", "OMITS", "CITES", "AROMA", "WITTE", "HILFE", "HEERD", "ARGUS", "PINED", "USURY", "EARLS", + "YKSIN", "CULTE", "NOBIS", "SPILL", "FLOTS", "PROIE", "LURCH", "ADOLF", "ARDEN", "CARNE", "INTET", "WREAK", + "VOLLE", "SLIME", "TONGS", "GUERE", "VALES", "MANNA", "ISLET", "MANER", "DUNNO", "EASEL", "ECRIT", "NOOKS", + "GLENN", "HOSEA", "BUSTS", "ENACT", "FETES", "CHAUD", "GUILD", "SIZED", "ENOCH", "SPIEL", "OILED", "NATAL", + "ROCHE", "BASER", "PODER", "QUOTA", "FINIR", "SELMA", "NADIE", "DRAME", "LARKS", "DOWNY", "GULLS", "ARBOR", + "CERES", "LANDE", "WYATT", "IDIOM", "QUILT", "TUTTA", "HEINZ", "MAMMY", "MONDO", "TACHE", "QUACK", "TALON", + "ENSIN", "VEUVE", "SODOM", "DUELS", "RANCH", "MINNA", "CRAPE", "WAVER", "HOOPS", "MEBBE", "VERSA", "KUTEN", + "AVIEZ", "WIJZE", "PLAIT", "BIGOT", "URSUS", "VOLTA", "DRONA", "PADDY", "AHMED", "GIBBS", "OGSAA", "PABLO", + "TOILE", "TERME", "GRAIL", "JUICY", "CINCO", "VOORT", "RERUM", "MUNRO", "SAMMA", "REMIS", "AVOND", "ALLOY", + "RIZAL", "SITTE", "NEWES", "ONZEN", "OFFEN", "SCOFF", "XXXIV", "NOUSI", "GLUED", "BEARE", "STARB", "FUITE", + "BRETT", "NOTCH", "AARDE", "BRUNT", "DEWEY", "GAMLE", "POBRE", "LAITY", "RAVED", "TROTZ", "SPRIG", "JEMMY", + "MEUSE", "FUEGO", "BUELL", "WARMS", "BIXBY", "TWIST", "ROLLO", "RISKY", "GROPE", "MEGET", "DANNY", "LONGE", + "LOOKE", "AYRES", "SUPRA", "CHANG", "FOLGE", "SWAIN", "ARRAS", "CHRON", "SEIEN", "OTTAA", "OBEYS", "HALTE", + "MOLTO", "HORUS", "HALLE", "DEVON", "HARPS", "PHIAL", "SELIM", "TIDAL", "TAPIS", "PRIER", "DENKE", "FONDO", + "OGDEN", "ENDOW", "ASTIR", "FAIRS", "BAKED", "ENGEL", "HANNA", "SZENE", "PIVOT", "WIRED", "RAFTS", "COTES", + "PLATS", "TIMON", "ANNAN", "MENTE", "RONDE", "STINT", "RAGES", "KENNY", "SADIE", "ZIJDE", "CALLE", "DIVIN", + "DUPED", "VOUCH", "FOOTE", "LEWES", "LIISA", "DARCY", "SIGER", "LUCAN", "IEDER", "ARMAS", "DONAL", "BRADY", + "WERKE", "ANNEX", "STATO", "HUNTS", "KAMER", "ALWAY", "PHILO", "SYNOD", "PROBE", "HORNY", "LEEDS", "FOUNT", + "NABOB", "ESTAR", "AVRIL", "DEFOE", "CAGED", "LOOPS", "NEVEU", "CLYDE", "GOEST", "MANES", "LEAUE", "TUNED", + "RISHI", "POSER", "STOIC", "NUEVO", "SAMOA", "SALIR", "SNORT", "ADIEU", "BOCHE", "LOGIS", "JAKOB", "LESSE", + "FILMY", "FEINT", "HOOGE", "LESEN", "TUTTE", "VEDIC", "BATON", "SCION", "SUBIR", "MASSY", "CLOVE", "WHOOP", + "TEILE", "DEBUT", "STOWE", "HELPE", "PAILS", "ADELE", "HERUM", "DESKS", "LIIAN", "HINZU", "SIDED", "TRITE", + "HORAS", "JINNY", "POPPY", "EQUIP", "NEERE", "URINE", "VIENE", "BERNE", "DUROC", "PERTH", "ARIEL", "GREGG", + "WOLLT", "MOREL", "DEEMS", "VIEIL", "MEZZO", "POETE", "HERON", "SHIRK", "SIETE", "HEMOS", "SORES", "EATON", + "ASHEN", "VERSO", "ALTON", "STORA", "SWOOP", "CZECH", "JOVEN", "SOFAS", "TIMED", "XXXVI", "KREIS", "WEILE", + "SCOUR", "JACKY", "ROLFE", "PIENI", "STIRN", "DREAR", "PIERO", "TRAYS", "SYLLA", "ERANO", "LURKS", "GOURD", + "MAAKT", "WANED", "LIBYA", "ALSOF", "FELON", "BREST", "ELENA", "WERDE", "JUNTO", "TENTE", "VERTE", "SILLE", + "VOLER", "ALBAN", "GALEN", "REDAN", "WALSH", "ARBRE", "ASTOR", "RAYON", "REEVE", "MUCHA", "NUORI", "LABAN", + "SIKSI", "LUCCA", "ALLUS", "PURTY", "BUDGE", "USURP", "MONTY", "YEMEN", "JOKED", "QUAYS", "LECOQ", "WYLIE", + "MACON", "UPTON", "NEALE", "SEENE", "OFFRE", "OTTER", "POING", "LEHRE", "ADOBE", "ABYSS", "SPURN", "PLATT", + "HUUSI", "PLUTO", "REMUS", "MOGUL", "DULLY", "BLOED", "SPICY", "GEEST", "FEIND", "KETCH", "LASSO", "ESTIS", + "BRYCE", "MENER", "PACHA", "ANTOI", "LEPER", "BAUER", "JOHNS", "FEREZ", "SWEDE", "HERAB", "VOTER", "SIREN", + "ELDON", "ROOKS", "EBERS", "NESTA", "YEERE", "ROLLE", "SLADE", "GLAND", "JOSEF", "BORES", "GALOP", "NELLE", + "HEGEL", "MEANE", "WIDEN", "DAWES", "PLUSH", "ERHOB", "FORSE", "SOLLE", "ZIEHT", "SUCHE", "BERGE", "HASAN", + "MANDY", "OEVER", "BAIRN", "ELGIN", "ZULKE", "AKBAR", "BUREN", "CRUMB", "BACKE", "LINGE", "WOHIN", "HACEN", + "BEENE", "LARVA", "REGEL", "BEVEL", "DUVAL", "KNAPP", "GEEFT", "REELS", "JUANA", "ESSER", "PLATA", "STIEG", + "RACEY", "KNELL", "LLAMA", "VOISI", "HINDI", "PASAR", "VENTS", "HOLDE", "PITIE", "PAGET", "SLUMS", "GIRTH", + "DROSS", "MAIRE", "LAGER", "FEHLT", "MAZES", "UNDID", "THYME", "WHORE", "WOGAN", "BLUES", "RIAIT", "PANZA", + "SALVE", "ZOUDE", "HERRE", "MIDAS", "PREIS", "SIRES", "GLUCK", "ROAST", "FABER", "ASIAN", "DEREK", "DIGBY", + "YARNS", "NUAGE", "SENCE", "HEWER", "SAWED", "SAVOR", "SWIMS", "CABOT", "TAFEL", "ANSON", "CAROL", "SNART", + "HUSKS", "SERRA", "LYMAN", "MARNE", "EDDIE", "GENII", "DAMEN", "RAMON", "FAUNA", "ARMEE", "CHUSE", "DEMIE", + "COMBS", "VENAL", "BLINK", "CYNIC", "JOLLA", "FUESE", "DUPES", "LOSER", "TERSE", "DUNES", "KENNE", "WINDE", + "GAYER", "CONAN", "MISSY", "BALLE", "RANGS", "REBUS", "FUSSY", "DRILY", "JUGES", "HABET", "IMACR", "CUZCO", + "FELLA", "HEWED", "AIENT", "SOULE", "CAPUA", "ULTRA", "EBBED", "VIPER", "CAFES", "KENNT", "CRAZE", "ELMER", + "DRONE", "SERAS", "SIENA", "WOLFF", "GILLS", "CRYPT", "GRAFT", "SANTE", "HALTS", "GAPED", "GELUK", "YOKED", + "FONDS", "FERNE", "NAOMI", "SECHS", "BUXOM", "TENEZ", "QUAKE", "TENUE", "ROUVA", "LOURD", "LYNDE", "REACT", + "SOUPS", "ODEUR", "KAZAN", "BOXED", "GRUEL", "ECLAT", "GLENS", "JOHON", "SOPRA", "COCKE", "RENEE", "SWISH", + "PFERD", "SCHIP", "KERRY", "ALDEN", "DANSE", "DELTA", "UNIDO", "SOORT", "EXULT", "ANDEN", "BLIVE", "HORNE", + "AMORE", "EORUM", "KINDE", "JEERS", "NAMUR", "ULICK", "SNAIL", "ALECK", "MEEST", "SUEUR", "DUMMY", "MARSA", + "CURRY", "ELTON", "NEDDA", "DOLOR", "GEVAL", "DEUIL", "THONG", "MULTA", "RESIN", "DIRGE", "LARGO", "INDUS", + "LEMMY", "BONUS", "PLEAS", "ALINE", "ABOUE", "CRAMP", "CORSE", "VERTY", "FALTA", "WOMIT", "EARNS", "PRATE", + "WEARE", "PHEBE", "OVERT", "BRACH", "CAMPS", "TRAUM", "TALTE", "MERGE", "SAUVE", "RIUER", "COALS", "FLOYD", + "ASSAI", "EMPOR", "NOTTE", "VINDT", "ENKEL", "SUCHT", "ZAGEN", "EPIST", "LYELL", "RILLS", "WOFUL", "MEKKA", + "ZULUS", "HUSSY", "GASPS", "JOTTA", "SOOTY", "ANNUL", "CAPES", "SHERE", "NENNT", "SORGE", "DUANE", "CALMS", + "DARBY", "TAHOE", "LIEST", "SAUTA", "SPURT", "VINCI", "ANNAT", "BOORD", "DROPT", "ZELVE", "DWARF", "ATTER", + "BLEUS", "DEANS", "JEWEL", "HEMEL", "AFIRE", "FLEAS", "ADAIR", "INSEL", "MUITA", "TALLY", "CABAL", "SAMME", + "MELON", "TEPID", "MIELI", "FOLGT", "POLLS", "ROSIE", "WALDO", "LEBTE", "HINGE", "SNOUT", "STURM", "BEALE", + "HAGAR", "SEWER", "SONIA", "TEXAN", "BEETS", "CHERS", "BURMA", "HOWEL", "EYING", "SAIDE", "PUNIC", "ANTIQ", + "UNTIE", "DILKE", "SOUPE", "WYNNE", "SKATE", "AMYAS", "AGUAS", "HESSE", "ADAGE", "ROOST", "WOLDE", "LEIPZ", + "TILED", "EAMES", "ASTUI", "SCOOP", "KNABE", "CLINK", "ELEVE", "RAZON", "VIEJO", "REYES", "ENDNU", "RIVEN", + "ORDEN", "PARRY", "GULFS", "EXTOL", "AUNTY", "TWEED", "RENDS", "STERK", "SIDON", "XXXIX", "SUDAN", "THANS", + "COMYN", "MATTI", "MONCK", "OHREN", "HADDE", "VREDE", "WAIVE", "LEJOS", "MITRE", "BEFEL", "PASTY", "WORKE", + "BLOTT", "LIEBT", "BARRE", "SOARS", "FISKE", "CERTO", "WRITS", "LENTE", "VAINE", "FALLE", "VERDE", "MOGEN", + "GRETA", "MOCKS", "TRANS", "CROAK", "DITTY", "VRAIS", "MINOS", "SALUA", "CHAOS", "PEKIN", "APPEL", "MAGIS", + "FINCH", "ELVES", "ISANG", "KOLME", "POESY", "DECOY", "STOPT", "LUCIE", "NETTA", "SOULT", "ALGUN", "IDIOT", + "DISKS", "CRISE", "EVOKE", "LIEVE", "KLEUR", "FERMA", "EENIG", "CIRCE", "SUELO", "MATER", "BATTU", "LINIE", + "MORNE", "SEGUN", "LARRY", "TOMAR", "GAGNE", "SCALY", "STAVE", "GLEAN", "KOVIN", "DORIC", "GORSE", "INDES", + "BEPPO", "GLANZ", "KUNTI", "OPFER", "DRIES", "TOTTA", "SHIRE", "SILVA", "OBRAS", "NAAST", "DETTO", "OMAHA", + "SHEBA", "TITAN", "BEAKS", "COWAN", "MARKT", "ADOWN", "GOUTY", "HAREN", "TOADS", "QUALI", "RENAN", "MANNE", + "SNORE", "COMMA", "ZYNDE", "LYGIA", "RUDER", "SCRIP", "WIERD", "ELEGY", "TWANG", "ANTTI", "SNIPE", "TABOO", + "MOHUN", "BRANT", "CAIRE", "DEMAS", "ARDAN", "ALTID", "COLLA", "BRAWL", "LEASH", "CHAFE", "PARED", "VOMIT", + "MYERS", "SOURD", "SANOO", "TAIRE", "ABDUL", "GNADE", "PALSY", "MIKSI", "JOHAN", "MELEE", "DRAWL", "HULOT", + "SOUCI", "WILLE", "AGATE", "NOMEN", "SEEKE", "GRIPS", "LEGEN", "SINEW", "JAMBE", "VRAAG", "EMACR", "FETID", + "LEWIN", "EDERS", "VIVES", "KALLE", "FILMS", "GUTES", "MARYA", "MYSIE", "JERKS", "PAARD", "NANNY", "EENER", + "ROVED", "CHICK", "BITCH", "HINAB", "IDEEN", "ESSET", "HOURE", "RHYME", "JULIO", "BELLO", "HAVIA", "DEARE", + "IDLER", "WOBEI", "JABEZ", "MIAMI", "ESTOY", "AULUS", "ANCOR", "MOVER", "WARRE", "IMPEL", "KRONE", "RACHE", + "FASTS", "NEPAL", "BANJO", "REINO", "DAWNS", "HETTA", "STAEL", "CHIRP", "PENTE", "SOLLT", "VOCES", "DEZER", + "LAINE", "MINDE", "ANENT", "ASSET", "PUITS", "SWAYS", "MOCHT", "WAHRE", "DEMUR", "BETTE", "LUZON", "TIESI", + "TONED", "FREDA", "TAINE", "DALLE", "SPITS", "DYKES", "TOLLS", "SOONE", "EURER", "ANDAR", "KITES", "KENBY", + "PROPS", "PUNKT", "TIEFE", "FLAPS", "NIMES", "ROHAN", "GUIDA", "GOODY", "LEROY", "BUCKS", "ONKEL", "ADLER", + "ALAIN", "SWIRL", "ZOORT", "GARRY", "AMAIN", "TEINT", "EERIE", "GUSTY", "AIDES", "ANIMO", "DOEST", "DREST", + "LAPSI", "FARBE", "RACKS", "VOEUX", "BELIE", "LEMON", "INCAS", "NECKS", "LOGIK", "RIVET", "DOTTY", "EWING", + "LENOX", "ZORZI", "TUNNE", "COLDS", "INNES", "CARON", "TULLY", "KULKI", "NIEUW", "RIPER", "HATER", "ROSEN", + "WAIFE", "FATTY", "VOGEL", "YPRES", "CASAS", "SINUT", "WINKS", "NOLAN", "BOARS", "BIRON", "MINAE", "KRAAL", + "STUHL", "PODIA", "MARLY", "MOROK", "DINES", "VENTE", "WHACK", "AMINE", "PALMA", "DANDO", "TAVIA", "QUILS", + "PATIO", "TRICE", "MARIN", "FOUET", "WAILS", "HAKON", "WALLY", "WINCE", "VOLGA", "TEKEE", "TURNE", "REFUS", + "SERRE", "LEAKY", "PROXY", "CAPPY", "BLARE", "BUSEN", "MAORI", "ALOES", "SLAVS", "BANCS", "VESTA", "METED", + "NEUES", "ALWYN", "GURTH", "JOSUE", "STOLZ", "JOZEF", "JOSIE", "MAYER", "STUBE", "ZADIG", "SLOEG", "STRUT", + "REARS", "MARTA", "BROIL", "CARTA", "DEGEN", "HURST", "MUNDE", "EPICS", "VILJA", "PESAR", "SPAWN", "MINUN", + "TALKE", "CROFT", "TESTA", "SEARS", "MYRRH", "CASED", "LISTE", "CHURL", "DICEN", "KURUS", "CORAL", "LIVIA", + "COLTS", "DRAYS", "ESTAN", "POETA", "CABUL", "JUDEN", "LATHE", "LITLE", "LEPIC", "EATER", "DIJON", "PAVIA", + "CLODS", "BYRNE", "JULEY", "GENTS", "VERNE", "ASSAY", "CHINS", "LIZZY", "PUHUI", "CANBY", "KNOBS", "KRING", + "BEZIG", "STINK", "STUND", "BUTTS", "DONOR", "SLICK", "WASPS", "HAMAN", "LIMES", "MEURT", "HAMEL", "CITIE", + "DIVIL", "SLAYS", "CHUMP", "DIKES", "PEEPS", "LISLE", "MOTTE", "FORET", "MACHE", "BREVE", "STROM", "BUENO", + "JEHAN", "BONTE", "GETAL", "HOBBS", "TAHDO", "VOLTE", "GIUEN", "TEXTE", "CLANK", "VITAE", "MAUVE", "LIDIA", + "SMEAR", "CIRCA", "JOUIR", "PRETE", "ARTEN", "PARKE", "CAVIL", "XLIII", "STUDS", "VALLE", "BOUTS", "KOMMO", + "NEITI", "GRIPE", "JOKES", "SOFIA", "ASPEN", "HEROS", "LOSSE", "BRAUT", "HOODS", "KRANK", "LINER", "TIDEN", + "FLAWS", "HAUTS", "UMHER", "MAATA", "HELAS", "SULLE", "JERKY", "OUTDO", "RABID", "CINNA", "MANIE", "TUSEN", + "BATED", "BELLY", "BORST", "MOLES", "YUKON", "STORK", "RAZED", "OMACR", "SLITS", "SERIE", "HAITI", "MORAN", + "RESTO", "WOVON", "BISON", "TULIP", "DARYA", "REEDY", "AILED", "DIESS", "RIRES", "SELBY", "ELITE", "FIXER", + "MIHIN", "NORMA", "MEADS", "TIERE", "OOZED", "POSES", "MIENE", "GEHAD", "DIENT", "RECIT", "AZTEC", "EILTE", + "GNATS", "JETTY", "JOIES", "KOHTI", "BARTO", "MCKEE", "SAUDI", "STAGS", "PARME", "SINGE", "ALVAN", "CLAMS", + "CRONE", "CORSO", "PUHUA", "SATIS", "DENRY", "FURRY", "FURZE", "PUEDO", "COUDE", "DIDNA", "SOIRS", "ACORN", + "KNOWE", "KREEG", "TOOTH", "SERBS", "DUNCE", "THEIL", "SANFT", "ASHER", "NOGEN", "TETES", "AFFIX", "CREER", + "PITHY", "MARIO", "WORDY", "SIMLA", "ROTEN", "VISOR", "ZAKEN", "BOGEN", "HERAN", "ILLUD", "JAHRH", "CUBIT", + "PRISM", "BAIRD", "DUPRE", "TORRE", "REGNE", "SUCRE", "WERRY", "MORIR", "SLASH", "MENEE", "SERUE", "WIENS", + "BUNKS", "SEERS", "ZOGEN", "CORKS", "HOGAN", "GARDA", "TARTS", "FROME", "POCOS", "SPRAY", "CAIRN", "BAITH", + "DAGAR", "DEJAH", "ICFTU", "ZUNGE", "CHARY", "CHURN", "FLOES", "SIENS", "VAPID", "GAVIN", "GRIER", "BLOTS", + "GRAPH", "CUBES", "BIGHT", "ARLES", "MICAH", "NEBEL", "DIVER", "STABS", "BESSY", "KUULI", "SITZT", "SENAT", + "PINKS", "SPANS", "VINER", "ALKAA", "HAELT", "BAYLE", "CREUX", "ABBAS", "CROCE", "JAFFA", "ABLER", "GULCH", + "KANSA", "LIENS", "TITEL", "MATED", "MEGAN", "ALACK", "COHEN", "HELGI", "SAMOS", "ALDER", "FORAN", "LANKY", + "GRISE", "OATES", "LAVER", "IONIC", "ALIBI", "OUVRE", "GERTY", "PONER", "KEENE", "FESTE", "SANAT", "ESSEN", + "ADDER", "KURZE", "REALS", "CRAYE", "SANON", "TULEN", "VIDES", "POATE", "WIPES", "ANITA", "GAMLA", "DELFT", + "CESSA", "FORDS", "SERIA", "ASAPH", "BUDDY", "GRAAF", "BENNY", "KREBS", "CLAPS", "AMIES", "DUPIN", "VEXES", + "COMUS", "ROUES", "IRATE", "MANSE", "TACKS", "BRACY", "TABOR", "STORT", "JINKS", "SHEIK", "PARVA", "SKUNK", + "ALPES", "VERUS", "BOGUS", "RIVES", "NINON", "FILLY", "JENKS", "DOLCE", "ZETTE", "EPSOM", "DENYS", "LOBES", + "SLUSH", "BONUM", "CANOT", "MYLES", "OTWAY", "TREUE", "DANKE", "FREIE", "FITCH", "SUMME", "CAPER", "BETTS", + "SPREE", "TEENS", "IRWIN", "STAHL", "MIXES", "TIARA", "MOTTO", "NOGHT", "STURT", "BLEUE", "DALES", "STING", + "SMOCK", "BLOCH", "FUROR", "SATED", "VENNE", "JAPON", "RIGBY", "DULCE", "HEIRS", "WISPS", "PROWL", "REGEN", + "PENIS", "SICUT", "TOSTO", "HULDA", "HOFFE", "SEEDY", "DRIER", "LILLA", "ZEVEN", "LADLE", "SAURA", "VESTE", + "AINOA", "ALICK", "RUGBY", "CORPO", "BLYTH", "JANUS", "DICTA", "VAUNT", "LAVAL", "DIGHT", "PHOTO", "ZUVOR", + "ELSJE", "LUNGE", "TOMBS", "STOFF", "SURAT", "BEVOR", "OUDEN", "TRESS", "WIRES", "TIMOR", "RUSSE", "TABAC", + "WIRFT", "BERYL", "CACAO", "HEALS", "ROODE", "SWARE", "LESER", "LIDDY", "ANIMA", "ILLIS", "LUONA", "PECHE", + "ROPER", "TORAH", "GOTTA", "SOMIT", "KOMIK", "ANNEE", "ERDEN", "BANGS", "PREST", "HOUDT", "ONZER", "RAKES", + "PAIRE", "SOLVE", "TYSON", "UTICA", "TROUS", "GAMUT", "PEPIN", "CHUNK", "MAMIE", "GUYON", "ORIEL", "MIEDO", + "BUTTE", "OMNIS", "QUISO", "GERDA", "DIETH", "SIRUP", "WHISK", "FAERY", "REGIS", "INANE", "MULLE", "SHINS", + "TAMAR", "ETTEN", "CIBOT", "BOGGY", "CAPUT", "ETEEN", "GRETE", "WADNA", "CRUST", "IPSUM", "BLIGH", "LOUER", + "ONKIN", "BOGGS", "HOLDT", "MEINT", "SKEIN", "TOCHT", "VIALS", "AIDER", "RECUT", "GRECS", "LOUGH", "SPOOR", + "SEEME", "KNOPF", "STACY", "FIEFS", "WEEDY", "BENIN", "CHINE", "BREDA", "BEKAM", "SPINS", "WARST", "BOXER", + "TROST", "STUNT", "ANIMI", "AURAS", "SUMMA", "YHDEN", "YOUSE", "GROOM", "PETTO", "POMPS", "MIRZA", "HALLA", + "DENNY", "JAILS", "PUFFY", "DELLS", "MUREN", "UNCUT", "LEACH", "LIKEN", "MURAL", "OSMAN", "TARDA", "DESEO", + "MODER", "MODUS", "MANON", "COLIC", "PRUNE", "VIVIR", "CLINT", "RIGGS", "CANNE", "SALVO", "AIRES", "PIKKU", + "SAMEN", "BASTE", "ARCIS", "EASIE", "SHAMS", "MATTY", "CANNY", "NEIGH", "HYMEN", "DAUNT", "BRUNE", "FORZA", + "YAZOO", "VENDU", "NICKY", "WINNA", "PESTS", "WARME", "BENET", "TOSIN", "VASCO", "BETES", "LIEUE", "PETAL", + "ANNOS", "COLLE", "TRIEB", "KLAUS", "PUNIR", "VODKA", "THRON", "DECIA", "BRAUN", "SHUNS", "UUDEN", "ALPHA", + "FLOUT", "SELLE", "STOOL", "NEUEM", "BASLE", "HERNE", "INFRA", "ERASE", "NESTS", "BERGS", "MEDAN", "NOITA", + "SUCKS", "IESUS", "CITER", "FRAGT", "VEDER", "DRUID", "SCALD", "ALIDA", "QUITO", "HOERT", "JUNOT", "PERDU", + "GEARY", "BOOKE", "KENDE", "CHICO", "MEATH", "ROGUE", "SMYTH", "DIVES", "FILET", "FLAKE", "PUTTY", "SIDAN", + "DANAE", "ILAND", "BORDE", "HERBS", "LIMBO", "PEINT", "ROLES", "BRINY", "ETRES", "FLANC", "BLATT", "DERRY", + "MUEHE", "RODDY", "DAMES", "INGER", "XLVII", "AIRED", "CHATS", "PAULO", "EJECT", "FUNGI", "SIKES", "CADRE", + "COOLS", "SNAPS", "BLENT", "BOOBY", "VIIME", "DALLY", "HIVES", "LEDDY", "BALDY", "PRANK", "NONCE", "OVENS", + "SCHAL", "AUGUR", "CALYX", "MOWED", "TOITS", "CIMON", "SWEYN", "EDLEN", "PALES", "SPERM", "THANE", "BEZIT", + "EILEN", "UUTTA", "NAMAN", "MACKO", "SHANG", "LITEN", "BAZIN", "THORD", "ARMES", "YEARE", "CALLY", "TRYST", + "CAPRI", "ETHAN", "HOEHE", "AOUDA", "HALEY", "BERTA", "KAREL", "CLUES", "CURST", "FORAY", "ITHER", "LASST", + "RICHT", "YAWNS", "WILKS", "GRIFF", "JOKER", "MOCHE", "ATLEE", "BAIZE", "SITAE", "TEMOR", "TENET", "HAYTI", + "MANGY", "LEVIS", "SHAKS", "CURIO", "ERICA", "FRETS", "TAKAA", "KLAAS", "FROCK", "SHIED", "TRUSS", "WACHT", + "LAMME", "SAMAA", "ARMER", "SLINK", "BLEEK", "BIBBS", "ARMIE", "BANDY", "HARDI", "MINNE", "MORIN", "COURU", + "CLUNY", "MOLTI", "PLOMB", "AHMAD", "ROCCO", "SLAKE", "HAARE", "ARIAN", "WOCHE", "ZILAH", "LURES", "KLEID", + "NUOVO", "TUMOR", "CLEON", "CORTE", "SUNNE", "ELFIN", "GLAZE", "HEDEN", "VREES", "BODED", "HVIDE", "TRIBU", + "ZACHT", "YUSUF", "FRUEH", "LEDEN", "SITIO", "LITET", "MAURY", "PRYOR", "ROBUR", "GRIST", "RUFEN", "VAERE", + "VILKA", "JORAM", "FONTE", "NOGLE", "BASEL", "FIRMA", "HUNCH", "STAVA", "ALLIE", "FIERI", "HOLEN", "TROTS", + "KNEAD", "MANGO", "OEUFS", "PONCE", "QUEED", "KLANG", "AMENI", "PONTE", "EIGNE", "BRILL", "LOCUM", "NERFS", + "CLEVE", "COPIE", "EHREN", "BOTHE", "SIKHS", "SHREW", "HODGE", "WILEY", "ALTRE", "SIGLO", "CORFU", "HAIRS", + "MALER", "OZONE", "IGUAL", "VORST", "ANGES", "INNAN", "NOMAD", "DOMIN", "FUTUR", "ROPED", "HALED", "NAVEL", + "PEASE", "SAMBO", "HABLA", "ALTYD", "BREIT", "RENTE", "BAGGY", "LANGT", "NOCES", "SHEAR", "BULGE", "SLEDS", + "TRURO", "ZWARE", "BANNS", "NAPPE", "PLASH", "TARES", "WHIRR", "SCOTS", "WANDA", "CREDO", "FUMED", "GABEN", + "POJAT", "SISTA", "VIVIE", "HALVE", "SICKE", "SIMUL", "WHELP", "BREEN", "EBENE", "HAWKE", "STAUB", "MOVIE", + "PECHO", "BUONA", "CULPA", "GAGNA", "HEELE", "FLITS", "HIESS", "SOLUM", "STEHN", "FIRME", "ESTER", "MACAO", + "LIBER", "MCKAY", "PETRA", "TOKYO", "SOLCH", "BAYOU", "HELGA", "LOCUS", "ZWART", "FABIO", "ROSNY", "CORNE", + "MESMO", "BASTA", "DISCS", "GRINS", "FLEES", "PIGMY", "MAUER", "FRISK", "HUNDE", "LOGOS", "TROMP", "HOHER", + "SOGEN", "BOEUF", "CUORE", "FACIE", "RANDY", "ALTRA", "ANKER", "DROLE", "LARGA", "POJAN", "ORTON", "DEJAR", + "GIBES", "MARIS", "SETTE", "SUBIT", "VARMA", "WISHT", "GUPPY", "THOTH", "MANUS", "TRILL", "FIRTH", "BANAL", + "METTE", "SNAKY", "ESIIN", "LUNGA", "BOOMS", "GRUBS", "NEEMT", "TASSE", "OHEIM", "ENCOR", "FELLS", "VERTS", + "GUNST", "SYKES", "VESTS", "COLON", "AGONE", "AIMEZ", "BAHIA", "LEDGE", "LICET", "BEGAB", "FOAMY", "HULKS", + "NEGER", "KEYED", "MAIST", "FABEL", "LORNA", "DICHA", "SACRE", "SITEN", "GODEN", "DARKY", "DRAVE", "NIXON", + "LAULU", "FIGUR", "GANGE", "KLAMM", "LACEY", "KORTE", "RUDES", "TUERE", "LUNGO", "VERRY", "VAURA", "CUANT", + "DRAUF", "OFFAL", "GORGO", "MENUS", "MINED", "OPTIC", "DRANG", "GRIME", "CORNY", "KETTE", "HEADY", "IRAIT", + "PAPEL", "BLITZ", "HUGHS", "DROEG", "TENDU", "WIERP", "DOANE", "ELATE", "LACHE", "PIEUX", "TULLE", "TONGA", + "NAEHE", "CLASP", "FANNS", "WAFER", "DRUCK", "SAUTE", "NEVIS", "PITTI", "FALDT", "USQUE", "EWELL", "GUNGA", + "MORAY", "FISHY", "FLAIL", "MEBBY", "DAGNY", "CLOGS", "ELEND", "MEAUX", "GOLFE", "HACHE", "SAILE", "GIRTY", + "NADIA", "PAVEL", "PAHAA", "SAEPE", "KIRKE", "WALDE", "EXITS", "DOBBS", "HAMAR", "MARCO", "NOYES", "HAILS", + "MALEN", "SHALE", "TAGER", "VELDT", "GREIF", "MASHA", "LOUIE", "DEDEN", "LEZEN", "NETTE", "CROWE", "MOYNE", + "GILDS", "CREON", "GOTHA", "KAREN", "BRUME", "VERIE", "BOSCH", "MEURS", "HYENA", "LLENO", "HOCHE", "CONDY", + "PYOTR", "CALMA", "SAMAN", "STEHE", "BERIC", "LIBBY", "MONTS", "TRONE", "JUSSI", "ALCUN", "BEGGE", "COVES", + "NYODA", "ALLZU", "DAIES", "MULTE", "JUNKS", "MUSST", "DRAPS", "HAAST", "JACKS", "FAYRE", "RUNDT", "FREUD", + "COBRA", "FUMEE", "SAGST", "PURDY", "BEELD", "TORTS", "VERVE", "BRAZO", "JOYED", "WAGTE", "JOURN", "MUNGO", + "PAPUA", "FUELS", "HALBE", "PALMY", "REGLE", "ELISA", "JUSTO", "TWIRL", "CONST", "PASSO", "AMANG", "LICKS", + "NEDER", "DEGRE", "DIREZ", "FRILL", "KORAK", "KREUZ", "TYCHO", "POVAS", "ASTON", "GOSSE", "ASILE", "BOOZE", + "BUMPS", "SOMOS", "WASNA", "LORCS", "CRATE", "GROEN", "WOOER", "HEBER", "JUNTA", "TURCS", "VOLTO", "WHILK", + "DEEPE", "NEBST", "CODEX", "JUIFS", "ASIAA", "FULCO", "DOMED", "OUTEN", "STEPT", "GALBA", "CHEAT", "COULE", + "MEETE", "PAWED", "BUNCE", "SANIN", "JOLIS", "PORED", "PYYSI", "HOWAT", "LAURE", "ONNEN", "PRIED", "SCHAR", + "BAZAR", "MITAD", "MOUND", "FUERE", "TRYON", "BAISA", "CROUP", "KUNNE", "DOONE", "FOLEY", "NEHME", "DUOMO", + "SONNA", "FACIT", "KENYA", "GIVIT", "BLEAT", "HURLS", "EIFER", "AILIE", "BASIL", "HARMS", "SUTRA", "LARME", + "BRITT", "GRADY", "MOROS", "TRIPE", "ADMIS", "HERTE", "VOIES", "LANKA", "FUSSE", "GLOAT", "GROAT", "CLEEK", + "MESES", "MOOIE", "HAMIL", "FORDI", "MENOR", "SATYR", "TODDY", "TANNO", "GAMIN", "SOLOS", "YOURN", "AHMET", + "FATTA", "ERWIN", "POWIS", "SEGEN", "AMENE", "BASAL", "MOSTE", "TOYED", "MAGDA", "DIEPE", "GENOU", "OCHRE", + "WEITE", "VOLKE", "POORT", "AIKEN", "JOPPA", "SLUYS", "FIERE", "JOUST", "LACHT", "SAYDE", "DELOS", "LETHE", + "TAGUS", "ALIIS", "HIVER", "TENGA", "ECOLE", "FUENF", "ROTHA", "VETCH", "GLANS", "LAIDE", "FLYNN", "KHASI", + "KELLS", "BOONS", "SLUGS", "ULCER", "VENTO", "BRAWN", "ENTRO", "VAIMO", "AGNEW", "CREES", "MEIGS", "GOUGH", + "PUSSY", "VERBA", "RICKS", "ROWAN", "FERRO", "LAGDE", "PRESO", "RUPEE", "FRANS", "ALDUS", "CLARO", "HANNO", + "VIEJA", "MARFA", "OSTEN", "GAUZY", "BOULE", "DRAFT", "GREVE", "SETON", "HEEDS", "SONNY", "HANSE", "LUISE", + "ALIUD", "AMASS", "EARES", "ROWDY", "STEWS", "KLARA", "ROSSI", "HENKI", "NOSTI", "ZOUDT", "GROTE", "DEALE", + "FREMD", "KLONK", "LIBRI", "CAPET", "FLOSI", "SONST", "CULTS", "DIKKE", "ALGER", "DIXIE", "NUNEZ", "QUAFF", + "QUALM", "TAFFY", "QUEDA", "SEDGE", "GUERT", "ETIEZ", "ICING", "PHIPS", "PICTS", "ABBIA", "THEER", "COREA", + "KABUL", "COMEN", "GOLDE", "VIXEN", "ZWAAR", "EADEM", "FREES", "MARGE", "MEREN", "SANAN", "EDLER", "LUOGO", + "PEDAL", "VAMOS", "OSTIA", "ALTES", "COUTE", "MANDO", "AESOP", "SAPOR", "PIEDI", "GIRLE", "EMORY", "MADDY", + "HULLS", "REVES", "BAITS", "MARTS", "PROUE", "RIFTS", "IFRCS", "SANER", "EISEN", "MORGA", "WISSE", "DANCY", + "HAZEN", "LASKI", "ESTAS", "AVOUE", "CACHA", "EWIGE", "LOOPT", "WAMBA", "ACASO", "MOLLE", "JUXON", "BOCCA", + "COLUI", "TRONC", "DAUER", "PARET", "CIEUX", "DOERS", "MICHT", "NADAT", "ROULE", "DURER", "GRADO", "SUFFI", + "WAYES", "HAWES", "VOREN", "MILCH", "HVERT", "COTTA", "ZAIRE", "ALLOT", "PANSY", "FOILS", "LEAKS", "SEKIN", + "SEUEN", "WHOME", "BERRI", "BIGGS", "PARAS", "PROSY", "RACER", "BOHUN", "OOTAH", "NIOBE", "COPRA", "PLAGE", + "SPEKE", "AUDIT", "FINIS", "ROMPU", "BANDA", "DAMPS", "QUARE", "TOQUE", "BRIER", "DOREN", "NANON", "BELLI", + "TYRAN", "HILFT", "PUEDA", "MOLDS", "OELIG", "ATHEN", "LARCH", "PUNTA", "CAMEO", "MALIN", "SONYA", "JAUNT", + "LAPIS", "FINIE", "POMPE", "SIMMS", "BEADY", "GUANO", "KEHRT", "RUIDO", "WRANG", "FAHRT", "URIAH", "BLEVO", + "DUQUE", "HACKS", "TASTY", "MAINZ", "COWER", "FUORI", "TEHTY", "ARRAN", "TOOTS", "UTHER", "CROCK", "HELLE", + "QUUNE", "LINGO", "CLLIA", "ELIHU", "APPUI", "BLUER", "DIRIS", "BYLES", "FEDER", "INJIN", "STENO", "AGORA", + "COMUN", "GILET", "GRAUE", "MISES", "WOHER", "MENKO", "AMBOS", "MUTES", "MOREA", "YONGE", "LAKOU", "TECLE", + "BRATS", "LAMED", "PENDU", "TOPAZ", "DRUSE", "LAPEL", "WANDS", "AINDA", "FOOLE", "FUSES", "DEBBY", "EUGEN", + "FABRE", "MALTE", "FEINE", "GANTS", "HETKI", "SENTE", "AMICI", "LOUPS", "OPDAT", "LAUNE", "TOULD", "DURAS", + "VERDI", "STUMM", "CHENG", "FLUSS", "SACRA", "SPADA", "CRONY", "LEGDE", "OIKEA", "ALVAR", "ABAJO", "CURDS", + "PRINS", "THEYR", "BOWIE", "REDET", "WRACK", "FLORE", "ABAFT", "ANDET", "CENCI", "CLAES", "GONGS", "OWENS", + "CUIUS", "EXIGE", "IGNIS", "SLAAP", "OWAIN", "MALLE", "SACHS", "SIGNE", "BOESE", "MUSTA", "TORNO", "GORKA", + "ERANT", "REGNO", "SWART", "DORMI", "MASAI", "FIDES", "KARMA", "RAIDE", "ILIUM", "MARTY", "ROLLA", "DEERE", + "TOMES", "KNOOP", "DOLCH", "PAIGE", "ISTUU", "WAIFS", "COLES", "ASKEW", "EUREN", "HELST", "CLAUD", "QUENU", + "ROJAS", "VYASA", "KULTA", "LEYES", "BOYER", "FUCHS", "NAWAB", "BIDED", "BUSCA", "LORNE", "AIKOI", "BEFAL", + "DUCAT", "ELOPE", "FERAS", "LLEVA", "BEINE", "EMERY", "BRIAR", "DIXIT", "MURAD", "TODES", "OLELO", "SALUE", + "TOTEM", "DILLY", "HAFEN", "NOEMI", "UNCAS", "JUGEA", "QUIVI", "ALIXE", "CASSE", "GAVEN", "GRAMS", "TORSO", + "DAMIS", "NILES", "NORTE", "OXLEY", "PASOS", "AGIAS", "ESSAI", "REFIT", "FAGIN", "HARUN", "AENNU", "DECRY", + "HOOSE", "PONTS", "RENDE", "UARDA", "DRUMS", "PLIES", "PRIUS", "USKOA", "GAHAN", "MIRAR", "MELAS", "ECHTE", + "DARIO", "RHEIN", "ROSAS", "FRUTO", "SLAPS", "BRAHE", "OGIER", "ROQUE", "BEFIT", "VIAJE", "ETATS", "FINOT", + "LINDE", "ZISKA", "LAHAT", "MITAE", "AUTOR", "FERRE", "LAMES", "LLENA", "HOLME", "MAHON", "MUDGE", "SAVVA", + "SEDER", "THUGS", "CERTE", "EILIG", "RAMPE", "GHANA", "TALER", "LEERE", "BURGH", "CLASE", "DIRAS", "MITES", + "PULPY", "CUFFE", "PLADS", "HALEN", "PAWNS", "FAKIR", "MANET", "BRUNG", "TEPEE", "CERTA", "LULLS", "BUTCH", + "ARSON", "DUMPS", "EMITS", "FORTO", "PESTE", "SHANK", "HARPE", "KAMES", "MEERE", "ENGEN", "SUING", "VITAM", + "LLOYD", "THEOL", "WITWE", "DOTED", "DUETS", "MONET", "AVERS", "CADDY", "SINFI", "CALOR", "CORNS", "GEBET", + "HAYNE", "TOTEN", "GUTEM", "TILLS", "JULES", "ROSSE", "LECKY", "STAMM", "WAUGH", "ALLEE", "COMED", "COVEY", + "LONGA", "ZATEN", "BEVIS", "MATTH", "AVERE", "VERUM", "MIRAH", "SOREL", "BOURG", "CREPE", "PRUDE", "MAGUS", + "TAPIO", "ZOCHT", "TOMAS", "TURAN", "BLOUD", "BOORS", "DRAGA", "HELLS", "DECKE", "GEMMA", "CONGE", "ETAIS", + "SANAA", "SLONE", "AXLES", "FAVRE", "ORTEN", "CAPON", "STODO", "POSTO", "DANBY", "SLIGO", "VACHE", "BOTHA", + "CANTY", "CONEY", "LAVES", "NEUVE", "TALAR", "CAKED", "POCHI", "CAULD", "DAAGS", "GNRAL", "RAVES", "OLSEN", + "AMICO", "CINCH", "TIGRE", "MIKKO", "SABIN", "FECIT", "GARNI", "ILLUM", "OOREN", "RUBAN", "BEGAF", "QUIRE", + "TALUS", "FINNA", "HARER", "MORTO", "BHAER", "KOPFE", "LEMME", "BOITE", "UUSIA", "VENIA", "ASAKO", "BOTTE", + "CLEFS", "FAWNS", "MUNDI", "NUBES", "SEGUR", "ANTIC", "JURER", "CRAIK", "BANGE", "KOUDE", "PARER", "VOBIS", + "YOKES", "SAKRA", "SAULT", "BODEM", "PASSI", "SMIRK", "WHAUR", "GYGES", "MONNY", "REIMS", "KOPJE", "POSSA", + "CHIOS", "VARUS", "CLOUT", "LOUSE", "PLAIE", "PROWS", "HOLTE", "DANEY", "WONNE", "FESTA", "SPOOL", "TOREN", + "MATEO", "NINNY", "JUPES", "PLEBE", "TRAHI", "DACRE", "LEIBE", "LUBIN", "AGAPE", "HIDES", "OPERE", "LAWES", + "GALLS", "ASHBY", "ASSAM", "SHIEL", "FREYA", "RODEN", "TYLOR", "CUIRE", "RAKAS", "SPAET", "THUIS", "MINGO", + "NILUS", "FIERS", "MOLTE", "SCAPE", "SKIPS", "ZAMEN", "FINNS", "JUMBO", "PAPST", "ZIELE", "ABASE", "GREEP", + "HONRA", "TESTY", "ZYNEN", "BRUIN", "FLUCH", "PRUDY", "DEPIT", "LUNDI", "TUULI", "UEBEL", "DAGON", "COUPA", + "LUULI", "MORES", "STATA", "KEBLE", "PEKKA", "KLAAR", "MOURN", "DRAXY", "CLAVE", "JOLLE", "VENGA", "OSAGE", + "POLEN", "DIGNO", "HELFT", "GABON", "KHOJA", "SIDEN", "DARKE", "LUMPY", "POPPA", "HECLA", "AGING", "FREUT", + "HALES", "TANIS", "DRAMS", "NEGEN", "STEER", "EULER", "ETOIT", "MAAND", "PHAON", "CREME", "FULLE", "SALUD", + "CHUNG", "FELDE", "RUBEN", "FALLA", "PELEG", "CUYAS", "FACTA", "KNITS", "NOEMT", "TUPIA", "URREA", "SYNES", + "TROUW", "JEWRY", "KAMAR", "PETRI", "STEEN", "HECHA", "WEAKE", "AVILA", "HAFIZ", "HARDE", "MOQUE", "THEIM", + "FARIA", "GRYCE", "PASSY", "OPHIR", "ROSEY", "WEIBE", "GANGA", "PALUS", "AGENS", "COOED", "TRINA", "BETEL", + "UNDAN", "BALLY", "DELLO", "HAIRE", "PEONS", "RAVIN", "WAXES", "VIDAL", "ELKEN", "MAGNO", "RINSE", "VERBO", + "RIPON", "ADORE", "FAGOT", "ROAMS", "BOTEN", "NOBLY", "ROULA", "THAIS", "LOGER", "VOLGT", "MOSCA", "SABES", + "DAMER", "SCALA", "BASSO", "GORED", "NOEUD", "PISTI", "SLATS", "SIXTE", "BUOYS", "PAYED", "REAPS", "RUSES", + "HEALY", "AILLE", "BLASE", "BRULE", "OASES", "PLUGS", "HEARN", "IYONG", "PRIMI", "GRAYS", "PALOS", "TICKS", + "ESTRE", "POUCE", "DAMME", "FLECK", "GENET", "HOUGH", "JEBEL", "CLAPP", "HYDRA", "TAMER", "BLUME", "AVIDE", + "DOWDY", "GIMME", "ESCAP", "POSEY", "CRASS", "EGARD", "NUDGE", "TURBA", "WARTS", "KLAGE", "LENNY", "ELLEI", + "GONNA", "LETTO", "IONIA", "SCHAM", "EPHOD", "MIENS", "TAGIT", "DOUAY", "NICOL", "STOKE", "FLICK", "HUOLI", + "REEKS", "FAROE", "FRUEN", "FICHU", "KERTA", "JARED", "WUNDE", "AYONS", "PAESE", "PATTE", "SINGT", "SCAND", + "ADHUC", "LYMPH", "PARVE", "SCHOB", "STRAX", "PERON", "BUSTE", "DARLE", "EODEM", "MOTES", "ORSON", "RAUME", + "BRINK", "GNOME", "LASTA", "CRUMP", "SKENE", "GRILL", "NIEVE", "BUBEN", "JOSUA", "CEDER", "INNEN", "MANGA", + "OLEVA", "SIXES", "ERICK", "GERRY", "STUFE", "CLAYS", "FACHE", "GELYK", "SALTY", "TEEMS", "AISNE", "RANCE", + "KAUAS", "VYING", "DOUAI", "CASUS", "CORES", "GENIO", "JEUDI", "RADIC", "RUNES", "CLARY", "BRISA", "MUCUS", + "NATUR", "COGIA", "MOXON", "LUTES", "MARKE", "POOTY", "SLAAN", "HAVAS", "MALOS", "SOWER", "DOMUS", "SEGNO", + "DONDE", "ETHIE", "CONCH", "MERES", "CHING", "KITTS", "MARCY", "REPAY", "COMBE", "PAOLI", "ARDEA", "ENCYC", + "KONGE", "MCCOY", "VESEY", "BURRO", "FURIE", "GEZAG", "JIFFY", "QUIPS", "COLLO", "MAGIE", "MYNEN", "COWES", + "OMEGA", "SKEAT", "BELGE", "PAEAN", "EMLYN", "CALDO", "KINDA", "AFTRE", "CITTA", "FETUS", "ONHAN", "TULTA", + "WINCH", "ADIGE", "EMMET", "EUREM", "NATTY", "TALMA", "WILNA", "FORBI", "BARTH", "MONRO", "ZADOK", "BARBA", + "BARCO", "GAZON", "VAART", "ANNAS", "MAHDI", "WERTH", "RAHAA", "SMAAK", "WIRKT", "YEELD", "YERBA", "FINGO", + "HEBEN", "VEINE", "LLEGA", "USKON", "SEMEN", "STOEL", "ZZZZZ", "HOWDY", "REGAN", "CLACK", "SELVE", "GLEGG", + "RAUCH", "DESTA", "FUMER", "KOMST", "BLOCS", "TRIAD", "VENIT", "BALIN", "UPANI", "VISST", "LOMAX", "RYMER", + "SOTTE", "ZOETE", "FOKER", "MILDE", "TATEN", "AKING", "DAVOR", "NITRE", "ERROL", "CLERC", "CONTA", "DEBAR", + "KREET", "MODEM", "CULCH", "FLERE", "OLIKO", "PREYS", "SLOPS", "WHIPT", "ADDIE", "BEULE", "BIJOU", "ECHAR", + "FUOCO", "HATHE", "QUAIS", "SOLDE", "FUZZY", "PISTE", "SAINE", "WEREN", "ZEBRA", "MASKE", "ANIME", "SAYST", + "LVIII", "MOIRA", "RAINA", "WOTAN", "ARMIS", "ASIAT", "BAGUE", "PRESE", "VOLSE", "NUOVA", "PARIA", "ALTOS", + "ENSAM", "TROLL", "ABBIE", "WILTS", "CESTE", "CUYOS", "VIGNE", "BEEBE", "GLIED", "RASHI", "DEVRA", "HOERE", + "LEZER", "NAHEN", "BERUF", "HIGGS", "LEEKS", "POLKA", "UMACR", "DOOMS", "FASTE", "GLEBE", "NOSED", "LOWTH", + "DOORE", "HIRES", "SKULK", "BILDE", "CHEBE", "WAITE", "ACEST", "DAMAS", "HOJAS", "MOMMA", "PERLE", "BALAK", + "LADIE", "MARCK", "YAQUI", "YEATS", "RECAL", "SINAE", "RUDRA", "AMENA", "CUJUS", "SIGNA", "SOLUS", "KISSE", + "NULLO", "PALJO", "SIEHE", "TOLDE", "VISCH", "HOVEY", "ROOME", "ETZEL", "SHURE", "FIFES", "BALTY", "FRITH", + "MICHU", "MOCHA", "TURKE", "FATTI", "GULES", "GALLO", "HANNE", "IZAAK", "MINTO", "ROYCE", "SARUM", "DEBIT", + "TENNE", "MANDI", "WELNU", "GOLLY", "JEUGD", "KELLO", "FULKE", "GUEUX", "VALSE", "WOEDE", "BORGO", "GALLE", + "HEMAN", "LODER", "SHANE", "FUGUE", "PESER", "CYRUS", "HOVED", "MACES", "NADER", "BUCKY", "HOFER", "KARIN", + "MELUN", "WAITZ", "ACTIF", "THEWS", "BOSIO", "MARYS", "CEOUS", "WOHNT", "OISIN", "ARTES", "ILLAM", "MASTE", + "LAMAR", "MULTO", "SABIA", "SAGAS", "SCANS", "VITRE", "ZUMAL", "KRIPA", "MORUS", "PINTO", "COCHE", "DEDIT", + "TALAT", "LEBEL", "SLOOT", "WUCHS", "BABET", "BEUTE", "FESCH", "NUBIA", "DELVE", "DEVAS", "NOHOW", "BAKOM", + "CIOUS", "MANDA", "OVALS", "PURES", "DYAKS", "ECTOR", "HERBE", "HUVUD", "LAIRS", "LIUES", "PLENA", "DOLED", + "MINST", "VELEN", "COROT", "OLNEY", "TELLO", "CARLE", "GNAWS", "HAAND", "ISSUS", "VINCY", "ARAGO", "BORAX", + "CENTO", "NAGOT", "SAUVA", "SOUSE", "VOUTE", "GRECE", "HEYST", "MILNE", "NANDA", "PRETS", "SLIPT", "STATU", + "WEICH", "ACTUS", "LOTYS", "HOORT", "PERES", "SOGGY", "BUSCH", "PUSEY", "MENEN", "SACAR", "GESTO", "TOTUM", + "AUBRY", "BEARN", "KAUAI", "BRAHM", "LAING", "BODIE", "LACKE", "OVARY", "SAYES", "SNAGS", "THATS", "ALPEN", + "MAYNE", "SELAH", "AUGER", "BETEN", "CORRE", "RUNNE", "TRANK", "TYPED", "MULEY", "SPOTT", "IGLOO", "KEELS", + "CASSY", "FAGON", "ACCES", "CXIUJ", "INTRA", "PITTY", "AHURA", "BAMBI", "BAYNE", "HIERO", "MAGOG", "MOONE", + "TODAS", "WENNA", "CAPAZ", "FONDE", "NAGON", "SLAGS", "RILLA", "GIVET", "POMME", "ANNAL", "BARTY", "CURIA", + "LEGGE", "PERSE", "SAALE", "THORA", "EDELE", "PERDS", "POULE", "BOGAN", "KAABA", "EGALE", "VEDEN", "PINKY", + "GERME", "MOULT", "VARIE", "DEWAN", "TEKLA", "FUDGE", "OPINE", "OSIER", "LAUFE", "LERAT", "PINUS", "THULE", + "EUERN", "PERRO", "SENDE", "WRENN", "DATUM", "AILSA", "GHITA", "WACHE", "ATOLL", "PELTS", "PLOWS", "POCAS", + "SHOON", "BEBER", "KATSO", "SOLEN", "HORRY", "PLASE", "EDIFY", "LADER", "TENUS", "JIMSY", "MAIJA", "SOLIS", + "AIMEE", "KUOLI", "ORTER", "OLAVI", "ORMUZ", "COSEY", "JAMAS", "PUOLI", "HEDDA", "TAMPA", "GRABS", "GRATA", + "LOUSY", "TRATO", "UDDER", "BEZUG", "BINET", "AMBLE", "HELMS", "LEVAI", "PAPPI", "COPIA", "SIRVE", "LIGUE", + "ORMUS", "GOUTS", "SINKT", "VRIJE", "LOTTA", "GENOT", "GRUPO", "MOEGE", "SLILY", "ARIES", "FRIST", "KYNGE", + "LLEGO", "MESSO", "NUEVE", "ALAMO", "OJEDA", "ROCCA", "THIER", "ALIOS", "BIDES", "DIEDE", "RUHEN", "TESTE", + "OZIAS", "QATAR", "PILES", "ALMAS", "BARBS", "BODDE", "BRIGS", "GWYNE", "SUELE", "GEOFF", "OAKUM", "ROCAS", + "GESTA", "HUBER", "VILNA", "CLAMP", "KUKIN", "NUQUE", "PELOS", "VIDEO", "WEKEN", "CRECY", "GRABE", "WESEL", + "ABORD", "AIMES", "HOHEM", "TULIN", "AUTUN", "BASHA", "JADIN", "CORAM", "LOOKT", "NEARS", "CLYST", "INIGO", + "NEPOS", "THERM", "FLUES", "FOCAL", "MUETS", "NOYER", "OCKSA", "SHOLD", "FRITS", "HITZE", "LAMAS", "MAHAL", + "MOMUS", "POWYS", "MAGST", "MENNE", "GOLPE", "WAFTS", "DORFE", "IRVIN", "RYDAL", "WYMAN", "CAVED", "CUEUR", + "FLIER", "SIGUE", "STRAF", "TRAJE", "DIRCK", "KANAG", "WESER", "WHYTE", "NKARA", "PECKS", "SAFER", "TRONO", + "ASURA", "MENTZ", "SASHA", "APPAL", "ETAGE", "LASTE", "USETH", "VOIMA", "VORAN", "LEMAN", "SHOOP", "AGITE", + "DABAN", "OMAAN", "BEATS", "TUBBS", "COLPA", "MATAR", "JORGE", "MCGEE", "AVOWS", "HUSET", "JOASH", "KARTE", + "AVISO", "MEATE", "MKHYA", "MUCHE", "ASCOT", "GALLA", "ISORA", "ROMER", "EPOUX", "FALSO", "BALBI", "SUNDA", + "LECON", "SPIJT", "SPUNK", "TRAMS", "VARAS", "LOTTE", "MAZDA", "MOXOS", "AMADO", "BEURT", "BOOST", "CATER", + "NEBER", "NEGRA", "BREDE", "MYRON", "ARTIG", "CIEGO", "FILER", "GAYON", "HABLO", "HINDS", "KUULU", "LIGGA", + "MARDI", "PRIVE", "VLOOG", "CRABB", "SOANE", "DALEN", "DIGNA", "IDLED", "INNIG", "LATHS", "SANZA", "TRAGE", + "WELKS", "BERKS", "BRECK", "ELIAB", "HAUCH", "HERAT", "AVARE", "HAFVA", "PRIJS", "GROIN", "NUIRE", "OBESE", + "OLTRE", "RIJKE", "WEEPE", "SNELL", "SYRIE", "CONTO", "FURIA", "ILLOS", "MEALY", "QUEDO", "ROSIN", "SNOBS", + "JUNIA", "LUKIN", "MESTY", "HELIX", "WALKE", "BUSSI", "TIBBY", "KURTZ", "DOTES", "FAUVE", "GAINE", "LEEFT", + "TAELS", "ACHAB", "EMIRS", "JEPPE", "KNIPP", "PILAR", "REUSS", "WEGES", "DROOM", "EYRIE", "JAGEN", "SLUMP", + "MAREN", "MODUM", "TREIN", "BEBEL", "KRUPP", "LAURI", "LYNNE", "VINET", "FANNO", "HADNA", "MENDS", "TIOUS", + "AMREI", "ARNOT", "FLOSS", "HYLDA", "DEBEN", "OUBLI", "TYLKO", "AVUTO", "BOATE", "LUKEA", "TRATA", "ECLAC", + "WIESE", "ZWEIG", "LINKE", "PRESA", "VIRTU", "BINES", "HERSE", "LUPUS", "MATTA", "FIVES", "INSTR", "KLEED", + "POLVO", "GWILT", "UNHCR", "DOSED", "JUROR", "RUNGS", "SILKE", "ISHAM", "KURDS", "SILLA", "SPINK", "ACTOS", + "DORST", "RIMES", "VIISI", "ZUCHT", "ATTEN", "BUCHE", "BYERS", "CISSY", "FIONN", "KATRI", "ASSIM", "HUIUS", + "MENTI", "PARSE", "VIDER", "KAYAN", "KRANZ", "NIELS", "FOIRE", "KIOSK", "OBERN", "RECTE", "LIPPO", "CABBY", + "IMBUE", "DOLPH", "RADHA", "FELIZ", "HOMEM", "TONTY", "YAKOV", "AEGIS", "PEDIR", "ROUTS", "UNICO", "VELUT", + "CROLL", "ALZOO", "FALSA", "KLARE", "PONEN", "AMEER", "BOSSU", "ORAGE", "POSEE", "PUTEA", "SELIG", "CHAKA", + "DISKO", "FALCO", "TEXEL", "ASCHE", "DONAU", "DUFFY", "LERMA", "QUINN", "SISSY", "TORCY", "ALTAS", "BEEST", + "BOUGE", "MONEN", "REGNA", "SNACK", "LADKO", "PIPPA", "WEALD", "ILLAN", "KALLA", "KOTIA", "BARCA", "CENIS", + "KATZE", "KORAH", "PRADO", "SANNA", "BURNE", "IDYLL", "SITTA", "VIRUM", "BEATA", "GUION", "RASSI", "SHAND", + "GAGES", "PUHUU", "RAHAT", "CERRO", "FARAO", "PAZZI", "RIZZO", "SCENA", "KALTE", "PATES", "TEUER", "CASOS", + "COLPO", "FLUME", "MAIOR", "SABIO", "VULGO", "ARIUS", "FLAMM", "MARET", "COTON", "DUCTS", "FORGO", "GRITO", + "POSSO", "ZULKS", "ETAIN", "POSEN", "TAMIL", "ZUEGE", "BIPED", "BLURT", "THEOS", "FLUKE", "MUNCH", "YOURE", + "BANTU", "BAREE", "BEGUM", "CHILO", "DINKS", "FADEN", "MAHAN", "PEAUX", "REGNI", "EINAR", "ISLAS", "RAYNE", + "TAAVI", "ARABE", "SCEAU", "DUCIE", "LORDY", "CHOUX", "GAMMA", "HAIES", "HORTE", "REMUE", "SCULL", "ANTAR", + "ENGLE", "NOVUM", "TONYA", "BAUEN", "IPSIS", "LOIKE", "LOUES", "SINGW", "STRID", "VILER", "SHAWN", "AURAI", + "GUISA", "KUULE", "SALEN", "WONEN", "CARBO", "MELKY", "DUMPY", "SPICK", "SPORE", "BARAK", "ONGAR", "VOLKS", + "DIETS", "LAVAS", "MUUAN", "ANMUT", "BEMIS", "BOLES", "GOOCH", "KAFIR", "LAGOS", "LUNDY", "BESOM", "JURIS", + "MESAS", "TYMES", "WORAN", "FOUAN", "HOOKE", "PUGET", "SIGEL", "DEARY", "LUMEN", "MEURE", "SERUM", "GREIS", + "PFEIL", "BONIS", "EIKAE", "ZWANG", "ASIEN", "CREAN", "LENIN", "CYTEE", "HALVT", "LOCIS", "NENNE", "SPINY", + "TOXIC", "FERDY", "MAROT", "WOVEN", "AEONS", "DEBIA", "DRAPE", "REAMS", "RISER", "RONDS", "TAGET", "AMASA", + "JANIE", "NIZZA", "ICILY", "TENTA", "FUNDY", "FANES", "GOERA", "VALDE", "PINTA", "PITTS", "SEIDE", "BILGE", + "DOMUM", "GEHST", "GNASH", "HETTE", "DORAN", "FABRY", "HEIGH", "SARTO", "SCHAU", "DIENS", "DOGME", "FAUNS", + "FROMM", "TAPES", "DREUX", "FAGAN", "HELLA", "SKYLD", "ARMUT", "JUBAL", "LUISA", "NOYON", "PIOTR", "PYLOS", + "BRAGT", "MEENT", "VAREN", "ILION", "NARES", "STUBB", "ASTER", "DANNO", "MOPED", "ONNEA", "PALAA", "WORDE", + "DONAT", "MACAN", "POVEY", "BODES", "DRIPS", "EGGED", "FEELE", "KLUGE", "MUROS", "ORBIS", "TABBY", "WICKS", + "JUMNA", "SYLVI", "SUNNI", "SUYOS", "JINGO", "MONAT", "PIPPO", "APING", "CHACE", "FLUFF", "POLIS", "AUBER", + "RAMEE", "SEOUL", "LYDER", "RICOS", "UNSAY", "ELSON", "SNOOP", "ANNIS", "FANGE", "FIJNE", "HUMUS", "LENTS", + "PUREE", "STOUP", "YERES", "JONDO", "LIGNY", "BLOKE", "PROPE", "ELLIE", "ERNIE", "OAKES", "DURES", "NEEDE", + "PLIER", "GONDI", "HAMET", "DUNKT", "FOAMS", "LOGES", "SERES", "STELT", "ARRAH", "GRATZ", "VEDIA", "DICIT", + "HARTS", "REINA", "SIELU", "KAPPA", "LIPPE", "OLINE", "PROUT", "INGOT", "LENTO", "NEGLI", "PARIE", "VEZES", + "RUSTY", "SUKEY", "SURRY", "ANIGH", "CIMES", "CLOUS", "FARSI", "GRAAG", "TINHA", "ARLEE", "DONGO", "HAGAN", + "LXIII", "RAMAH", "CLEPT", "MULTI", "NIAIS", "VAINS", "LEONI", "LECHE", "RAINE", "HYDER", "LARES", "HAVET", + "MINHA", "BATTY", "ERICH", "KUGEL", "BRAGS", "CRIBS", "FAINE", "IHANA", "KAHTA", "SAATU", "SAYLE", "SEINS", + "SLATY", "SQUIB", "VIZIR", "YELPS", "ENDEN", "HINDE", "CORTA", "CRICK", "FLERA", "SVARA", "HIPPO", "DRONG", + "FETED", "LEHRT", "TULIT", "ADERN", "DIDON", "QUILP", "TREAS", "CARRE", "MALUM", "SULKS", "LEARY", "LYDDY", + "PETYA", "SALIM", "TOPSY", "BOWEL", "CRESS", "DESTE", "ENROL", "FLAKY", "BARBY", "BEERS", "SOMAL", "TIMMY", + "YEGOR", "JONNE", "POILS", "SOLDI", "ZARTE", "KROOL", "MARKO", "DERER", "TIETO", "VOSSA", "BULOW", "ALENE", + "DIMES", "DOIVE", "HOPEN", "MOLDY", "TOIVO", "AVICE", "HERMY", "BAINS", "DAGUE", "FLINK", "FRASE", "HANGT", + "LEGUA", "TEMPI", "VAITI", "CUTTS", "VANEL", "ALTHO", "EINIG", "FIORD", "HARME", "MOWER", "PAGAR", "ROEPT", + "FULDA", "MOSUL", "VIRGO", "DINAR", "KATSE", "KURJA", "LINEA", "NEARE", "RUINA", "TUVAN", "ASSUR", "LANDA", + "EVERE", "LIVRA", "PENSO", "TILTS", "VSQUE", "MILER", "NERVA", "SHINT", "STICH", "BEDST", "BLAUW", "COLDE", + "GLAUB", "MOATS", "PRISA", "SIGMA", "MAHEU", "CHENE", "MUITO", "POEME", "PUDGY", "RILED", "SILLS", "VERTA", + "AMRAM", "BONAR", "SVAVA", "CURSO", "FIDEM", "CAPEL", "JAINS", "PRAED", "GAVEL", "KIVEN", "PEDIS", "WAARD", + "FIUME", "GLYNN", "PIGOT", "BICHE", "DOOTY", "LADYE", "VENGE", "JUKES", "PETRO", "BONIE", "FOWLE", "INURE", + "KONDE", "POKES", "SIMBA", "LITRE", "PAREA", "HOREB", "TIMUR", "HEATE", "NAGRA", "NOYSE", "PAURA", "PEECE", + "AGNUS", "HYNDS", "MOSER", "GAWKY", "HYDRO", "ISTUA", "JACHT", "SCUDO", "UUREN", "MOSCO", "BLAUE", "LIVET", + "SECHE", "MAYDE", "PIEDE", "RUFFS", "KAPOR", "MARTE", "QUADE", "GLATT", "INDIO", "OMNEM", "SALIO", "SADOC", + "VOBAN", "ZICCI", "BRAES", "COELO", "CORTO", "IRKED", "SABEN", "DWYER", "JOUIT", "OFFRA", "SCIRE", "SELVA", + "TULET", "FLAGG", "ETUDE", "GOUGE", "HUJUS", "OLHOS", "ASOKA", "HURRA", "KEVIN", "NELLO", "FICHE", "JETAI", + "LECHO", "LIENE", "MUMPS", "ORICE", "VIZOR", "HARAN", "LUCRE", "MAGEN", "MOORD", "WEEKE", "GOREE", "KIMON", + "AVASI", "FINNY", "POSTA", "REGTE", "REMET", "SILEX", "TELCO", "TERVE", "SOHNE", "TOBIN", "GEZET", "GRIDO", + "IVIED", "ODDER", "FLACK", "JESSY", "DIECI", "EPAIS", "THRUE", "DICES", "GREYS", "MORTI", "PERCE", "BASSA", + "FASTI", "MCTEE", "SOUSA", "VIGNY", "WOLKE", "DUROS", "GRAVI", "PROVA", "SWILL", "VEELE", "WANES", "BASAN", + "CUFFY", "XVIIE", "HUZZA", "VIDAS", "ALLIS", "BEUST", "BRESL", "SWASH", "PEPLE", "GOWDY", "HADJI", "NAHUM", + "THESS", "FROND", "HAINT", "AMOOR", "LARNE", "NADAB", "NEILL", "SAGET", "CREDE", "HUMPS", "MOSSE", "MUTED", + "OLLEN", "VERBE", "ALVIN", "CLERY", "JOVIS", "SEYNS", "SONEY", "SYLPH", "VITRY", "WIGAN", "HILTS", "LINTU", + "SINDS", "UMBRA", "VISER", "CASCA", "MERAN", "MONNA", "PINEY", "BRAUE", "LAPIN", "MUEDE", "POWRE", "STAAR", + "BONEY", "MAGUA", "MAULE", "COYLY", "GUMMY", "HAULS", "RUEGO", "ARCHY", "BAUME", "BEVAN", "DEGAS", "KAISA", + "LESTE", "MOULE", "REDLY", "VETUS", "AFRIC", "BINGO", "LXVII", "OLLIE", "SURYA", "ABRIR", "DEDOS", "EXCES", + "LAITA", "MINTS", "POTER", "VARDA", "BACHE", "SALIC", "HURLA", "MEWED", "NECKE", "NEITO", "PARKA", "VAPAA", + "WAPEN", "BIJAH", "GUETE", "ZANTE", "SCUDI", "IDUNA", "KONTO", "LUXOR", "DIEST", "REGEM", "SPANK", "TIEDE", + "URSEL", "GENTI", "NAVES", "ONDAS", "PRZED", "FOLCO", "NABAL", "NOSEY", "PAULI", "TOKIO", "ATING", "DICTE", + "GUDAR", "RHEUM", "CUTTY", "OSMIA", "MAGER", "SANOT", "TIBIA", "TRAER", "LIANE", "MATHO", "MUNDY", "PATTI", + "REESE", "SEELY", "HARPY", "HUTTE", "LEGES", "LIETO", "LOBEN", "RAVIE", "SOAPY", "SOUGH", "VUOLE", "BOGES", + "LUTHA", "MAPPO", "BONED", "FLYER", "VISTE", "ENDOR", "FAYAL", "HALSE", "KEANE", "SIHON", "ANCHO", "ATTAR", + "AVETE", "KROPP", "MIMES", "OPALS", "PLUMA", "UNLIT", "AKLIS", "ELSLI", "HERDE", "SKALE", "ANDAN", "JEANS", + "PREVU", "BAIAE", "GOETZ", "HYLAS", "JANIN", "CHYLE", "DAUBS", "HANDE", "KNAAP", "NATUS", "ZONEN", "MONTI", + "SUDRA", "LIKER", "LYCKA", "UKASE", "VIMOS", "VOYCE", "AMIEL", "PANGO", "RANDE", "SHIVA", "SPION", "TIECK", + "DECEM", "MOLAR", "WENTE", "IMLAC", "PONTO", "WASTL", "BORTA", "FANDT", "JOKIN", "LYFTE", "RESET", "RIENS", + "SEMEL", "TWIXT", "WISST", "BEORN", "CEUTA", "NABAB", "EVIGT", "LEGNO", "LERNT", "LILAS", "MYLEN", "PAPPA", + "PREUX", "SPOOK", "FOGER", "TILDA", "CIVET", "ERRER", "GEARS", "JUGEZ", "MAGNI", "SEZEE", "SPISE", "AYEAR", + "BYEAR", "DUNNE", "JEZUS", "LUCIO", "MATEY", "SKALA", "TIBUR", "BAADE", "HOOTS", "LOONS", "TUNGA", "BIORN", + "DAGLI", "OUTRO", "GAETA", "JANEY", "MENIN", "SITKA", "FOIST", "JEHER", "LAVED", "LINUS", "PAWLE", "VICKY", + "RIDES", "TREED", "ARIST", "AWEEL", "CELIE", "BURRS", "CLIPS", "DICEA", "MOLTA", "NAVVY", "OLIKA", "RAYOS", + "SEYDE", "VANES", "ALLYN", "GEBOT", "GROSE", "BAHAY", "DUREE", "FAZER", "GOADS", "GULPH", "HAVER", "NIGRA", + "NOCTE", "PARUM", "SAATA", "SKIMS", "WAART", "WRAAK", "MUZIO", "OLSON", "RABAT", "REGIN", "RUNIC", "MANDE", + "RAUHA", "AYMER", "NAURU", "DREEF", "GAAET", "IRREN", "LESKI", "MECUM", "SAVON", "ARIAS", "HANKS", "ROZEL", + "ZEUGE", "DEUGD", "ETHIC", "GOODE", "TROVA", "AETNA", "BENJY", "ORMES", "TUBAL", "BRIMS", "BULKS", "FILCH", + "MONAD", "OOZES", "REGIA", "SARVE", "VENTI", "VOERT", "ARION", "COOTE", "SNECK", "TESSA", "BASON", "GIENG", + "INTIL", "NABIJ", "PRZEZ", "RAMAS", "SITUE", "CATHY", "GREER", "LINUX", "TOBIT", "DIDNT", "DROGO", "NEHMT", + "TIGES", "EDRIC", "TROUP", "AYUDA", "BEVAT", "DAPAT", "OVATE", "BALCH", "COGAN", "AIRTH", "GOWNE", "JUEGO", + "REBUT", "SALSA", "WIJDE", "JUBEL", "NEDDY", "RONNY", "FLAIR", "PASEO", "BRONX", "EWALD", "STURZ", "WODEN", + "KUMMA", "LETTE", "VANTE", "CAERE", "MISHA", "AMBAS", "FAAET", "RUNDE", "EYLAU", "MENGS", "FEEST", "LOWED", + "VENDE", "CUMAE", "GASSE", "HILMA", "IZUMO", "PISAN", "SOFIE", "CARRO", "CONIC", "CRIMP", "MUSKY", "SAYTH", + "STANK", "BOWES", "FAHNE", "THOME", "VIION", "ASTUU", "DICKE", "FASST", "PAROI", "LAWRY", "PRATO", "TENCH", + "CERTI", "ISCHT", "NOONE", "SENTO", "TAULD", "VLOOT", "VOIRE", "VOLTS", "BELUS", "CAVOR", "JORIS", "SEPPI", + "ERGAB", "BABIE", "CATON", "ABAHT", "BEDRE", "OPPIA", "POUCO", "SCHEU", "SEALE", "SUMUS", "VASTY", "FRIDA", + "LIPPI", "LOUVE", "BANCO", "BUONO", "CLOMB", "EDELN", "HOULD", "PELAS", "BODIN", "FAUGH", "JUDAR", "SEITZ", + "TOTTY", "WERTE", "STANE", "WINNE", "COCOS", "RIATT", "WERFF", "FIERA", "HINAN", "MATKA", "OATEN", "PLACA", + "CONOR", "DARRY", "HERTZ", "LAMON", "BEYNG", "CONTR", "INEPT", "SAKEN", "SIAMO", "STEDE", "MORNA", "AGERE", + "LANCA", "OSASI", "SADAN", "WOONT", "EVERS", "TROVE", "FACIL", "GRENE", "KUUSI", "PAPAS", "RECUS", "UUDET", + "VENTA", "ALOIS", "GILLY", "GONDY", "NAIRN", "BAILE", "CLAPT", "CLUCK", "CULTO", "EETEN", "GAPES", "NIVEL", + "TREKT", "WARLD", "ABIES", "AUTOS", "BARKE", "BRDER", "EASES", "GIRDS", "HAILL", "HIJAS", "RETRO", "SOMMA", + "STEEG", "BAYER", "CAMUS", "DEVIN", "HAMID", "HUANG", "IMOLA", "DICED", "HOCHA", "KASTA", "MULGA", "MYNDE", + "PIENO", "YAONG", "FURST", "GATTE", "SPASS", "SVEIN", "THEMA", "ANSAH", "CHAUX", "HEVIG", "PRIES", "ZOMER", + "BAGGS", "DOURO", "HIPPY", "SAONE", "VAVEL", "WETTE", "ALNAR", "EUILL", "PEATY", "VENIS", "CRITO", "LYNDA", + "OGRAM", "TEMPE", "ABOON", "FACEA", "FINEM", "KNOUT", "LLAMO", "LOAMY", "MENAR", "TISSU", "VERAS", "VIRES", + "COLBY", "JAINA", "TEUSE", "TYNAN", "YANKS", "BEZAT", "KLOOF", "SEAMY", "SIDDE", "STEIL", "TYYNI", "CARIA", + "HENTY", "LOWRY", "SOUZA", "ALIUS", "FEETE", "GRANO", "HALKI", "KELPO", "PESKY", "PLEBS", "POVIS", "TOPER", + "VLOER", "VOULD", "EDMEE", "GAZEN", "GITON", "HOLLO", "KAROL", "REIZE", "ROACH", "ULLOA", "VERBY", "CLEWS", + "EVANG", "FERAL", "GLICH", "THROE", "ZIJNS", "EURIE", "FERIA", "JEEMS", "PAAVO", "SAUTI", "DOODE", "PIENA", + "RADII", "UNICA", "CROLY", "HADAD", "KEYES", "NIKKY", "SANDE", "SEGEL", "SOFYA", "TEXAR", "GAZER", "LEDIG", + "NOTAR", "OBEIR", "VIMES", "GENUA", "KANAL", "LIMON", "RAHAB", "SUOMI", "VEJEN", "BATEN", "FJORD", "LEVES", + "PHARE", "RECTO", "AAGOT", "GIZUR", "NADJA", "RUGGE", "SNEYD", "DECKT", "FAILE", "GAOLS", "MELER", "PACTO", + "PAHAN", "CALIF", "MENON", "SEPOY", "WADDY", "ZELLE", "AENDA", "ASTUA", "KROON", "LETRA", "MINIT", "NEEWA", + "PATNA", "URIEL", "HITTE", "HOMOJ", "JOUET", "KOSKI", "LYSTE", "MINAS", "RUHTE", "SETZE", ] alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] -def most_used_letters(): +def most_used_letters(words=legal_list): ''' Outputs how many times each letter is used in the words array. ''' @@ -337,7 +963,7 @@ def most_used_letters(): print(f"{k.upper()} | {dicto[k]}") -def list_of_valid_words(letters): +def list_of_valid_words(letters, words=legal_list): ''' Outputs the array of valid words that can be made with the combination of letters. ''' @@ -356,33 +982,67 @@ def list_of_valid_words(letters): return legal_words -def print_valid_words(letters): +def rearrange_words_by_uniqueness(words): + unique = [word for word in words if len(word) == len(set(word))] + duplicates = [word for word in words if len(word) != len(set(word))] + return unique + duplicates, len(unique) + +def capitalize_all_and_remove_duplicates(arr): + for i,word in enumerate(arr): + arr[i] = word.upper() + result = [] + for word in arr: + if word not in result: + result.append(word) + return arr + + +def print_valid_words(letters=alphabet): ''' Prints the array of valid words that the wordle_face.c can use ''' - legal_words = list_of_valid_words(letters) - for i,word in enumerate(legal_words): - legal_words[i] = word.upper().replace("D","d") + items_per_row = 9 + legal_words = list_of_valid_words(letters, legal_list) + legal_words = capitalize_all_and_remove_duplicates(legal_words) random.shuffle(legal_words) # Just in case the watch's random function is too pseudo, better to shuffle th elist so it's less likely to always have the same starting letter - + legal_words, num_uniq = rearrange_words_by_uniqueness(legal_words) + print("static const char _valid_letters[] = {", end='') for letter in letters[:-1]: print(f"'{letter}', ", end='') print(f"'{letters[-1]}'" + "};") print("") - + print("// From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff") print(f"// Number of words found: {len(legal_words)}") - items_per_row = 9 i = 0 print("static const char _legal_words[][WORDLE_LENGTH + 1] = {") while i < len(legal_words): print(" ", end='') - for j in range(min(items_per_row, len(legal_words)-i)): + for _ in range(min(items_per_row, len(legal_words)-i)): print(f'"{legal_words[i]}", ', end='') i+=1 print('') + print("};\n") + + expanded_words = list_of_valid_words(letters, expanded_list) + expanded_words = [word for word in expanded_words if word not in legal_list] + expanded_words = capitalize_all_and_remove_duplicates(expanded_words) + + print("// These are words that'll never be used, but still need to be in the dictionary for guesses.") + print("// Top 100K most common words from Wiktionary https://gist.github.com/h3xx/1976236") + print(f"// Number of words found: {len(expanded_words)}") + i = 0 + print("static const char _expanded_words[][WORDLE_LENGTH + 1] = {") + while i < len(expanded_words): + print(" ", end='') + for j in range(min(items_per_row, len(expanded_words)-i)): + print(f'"{expanded_words[i]}", ', end='') + i+=1 + print('') print("};") + + print(f"\nstatic const uint16_t _num_unique_words = {num_uniq}; // The _legal_words array begins with this many words where each letter is different.") def get_sec_val_and_units(seconds): @@ -449,6 +1109,6 @@ def txt_of_all_letter_combos(num_letters_in_set): if __name__ == "__main__": - most_used_letters() + #most_used_letters() print_valid_words(['A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R', 'S']) #txt_of_all_letter_combos(10) \ No newline at end of file From 6dd46b46b1037cbfcd64b8594acb39dc5eeb85c0 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 17 Aug 2024 06:22:24 -0400 Subject: [PATCH 13/53] Able to turn the expanded dict on and off with a variable --- movement/watch_faces/complication/wordle_face.c | 8 ++++++++ movement/watch_faces/complication/wordle_face.h | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 9b1db1b8..2b991e37 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -67,11 +67,14 @@ static const char _legal_words[][WORDLE_LENGTH + 1] = { "SCOOP", "EASEL", "LOONS", "CONIC", "SPANS", "SPIES", "PRIOR", "SALSA", "SELLS", "PILLS", "RISES", "RARES", "SNEER", "SOILS", "ARENA", "CASES", "CANAL", "SAILS", "LASSO", "COCOA", "ERROR", "CALLS", +#if (USE_EXPANDED_DICT != 1) }; // These are words that'll never be used, but still need to be in the dictionary for guesses. // Top 100K most common words from Wiktionary https://gist.github.com/h3xx/1976236 // Number of words found: 469 static const char _expanded_words[][WORDLE_LENGTH + 1] = { +#endif +#if (USE_EXPANDED_DICT != 0) "PARIS", "APRIL", "SPAIN", "EINEN", "ASCII", "EINER", "SEINE", "AINSI", "ALICE", "ALLES", "ALORS", "EINES", "ALLER", "PEINE", "PARCE", "CELLE", "CLARA", "ELLES", "ELLEN", "OLISI", "ALLEN", "ISAAC", "APRES", "CROIS", "SANOI", "PASSE", "ELSIE", @@ -125,8 +128,13 @@ static const char _expanded_words[][WORDLE_LENGTH + 1] = { "NOONE", "SEPPI", "OPPIA", "SEALE", "LIPPI", "PELAS", "COCOS", "PLACA", "CONOR", "LANCA", "OSASI", "ALOIS", "NAIRN", "PIENO", "SPASS", "SAONE", "ALNAR", "CARIA", "PIENA", +#endif }; +#if (USE_EXPANDED_DICT == 1) +static const char _expanded_words[][WORDLE_LENGTH + 1] = {}; +#endif + static const uint16_t _num_unique_words = 155; // The _legal_words array begins with this many words where each letter is different. static const uint16_t _num_words = (sizeof(_legal_words) / sizeof(_legal_words[0])); static const uint16_t _num_expanded_words = (sizeof(_expanded_words) / sizeof(_expanded_words[0])); diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index b1375126..1860984f 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -60,6 +60,13 @@ #define WORDLE_MAX_ATTEMPTS 6 #define USE_DAILY_STREAK false +/* USE_EXPANDED_DICT + * 0 = don't use it at all (saves 2.8KB of ROM) + * 1 = Include the expanded dict in answers + * 2 = Only include it in the dict for guessing, but it's never an answer +*/ +#define USE_EXPANDED_DICT 2 + typedef enum { WORDLE_LETTER_WRONG = 0, WORDLE_LETTER_WRONG_LOC, From 1675af64496535b76d5c4e7e46a3e1453159e353 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 17 Aug 2024 09:49:48 -0400 Subject: [PATCH 14/53] bug fix on max score --- .../watch_faces/complication/wordle_face.c | 165 +++++++++--------- .../watch_faces/complication/wordle_face.h | 3 +- utils/wordle_face/wordle_list.py | 10 +- 3 files changed, 84 insertions(+), 94 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 2b991e37..c6f28bb4 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -33,45 +33,45 @@ static const char _valid_letters[] = {'A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R', 'S'}; // From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff -// Number of words found: 283 +// Number of words found: 282 static const char _legal_words[][WORDLE_LENGTH + 1] = { - "PROSE", "SLOPE", "CLAPS", "CAIRN", "PLANE", "SPACE", "ARISE", "NEARS", "OPERA", - "EPICS", "LAIRS", "AISLE", "APRON", "SCRIP", "CARES", "PERIL", "PILES", "CLEAN", - "CLANS", "CANOE", "COALS", "RELIC", "CRANE", "SLICE", "RESIN", "NAILS", "LIARS", - "RISEN", "COILS", "RINSE", "PRIES", "PLEAS", "CAPON", "PARSE", "ROLES", "SPICE", - "CORAL", "LEARN", "SNIPE", "CAPER", "SIREN", "CORES", "CRAPE", "SPOIL", "EARNS", - "LANES", "PEALS", "RAINS", "ACRES", "SINCE", "LACES", "ROPES", "CLEAR", "PANIC", - "SCALE", "SANER", "CLOSE", "LINER", "CORNS", "SPINE", "SCARE", "ACORN", "PLANS", - "POSER", "SCORN", "AROSE", "LINES", "LIONS", "OCEAN", "SNAIL", "OSIER", "SCOPE", - "OPINE", "REINS", "COINS", "LOSER", "PANES", "RAISE", "RAILS", "ALIEN", "PLAIN", - "SNARE", "LOANS", "IRONS", "COPRA", "PLIES", "COPSE", "PEARS", "PALER", "SLAIN", - "LAPSE", "CONES", "ARSON", "POISE", "OPENS", "SPORE", "CAROL", "PACES", "LEAPS", - "ALONE", "ASPEN", "SNORE", "CRIES", "OPALS", "PENAL", "PAINS", "ENROL", "POLAR", - "SPEAR", "SCION", "POLES", "SCORE", "LEANS", "PEONS", "ROSIN", "REAPS", "SOLAR", - "EARLS", "PENIS", "PRICE", "REALS", "SCALP", "CLASP", "NOISE", "PANEL", "NICER", - "CRISP", "SPARE", "PEARL", "CORPS", "SALON", "RACES", "LOINS", "RIPEN", "PLACE", - "CRONE", "CANES", "LANCE", "LIENS", "ALOES", "PIANO", "PRONE", "PIERS", "SNARL", - "AEONS", "PINES", "SPIRE", "PAILS", "CAPES", "CLIPS", "PALES", "CROPS", "PAIRS", - "SCRAP", "PORES", "SALES", "COOLS", "SLOPS", "APACE", "CRIER", "ROLLS", "PIPES", - "SLIPS", "EASES", "PEACE", "CELLS", "POLLS", "POPPA", "SPREE", "RILLS", "SPILL", - "RIPER", "ONION", "ISLES", "CROSS", "PAPAS", "NOSES", "PAPAL", "SLEEP", "EERIE", - "SEALS", "PAPER", "COLOR", "SORES", "SPELL", "SNAPS", "SEERS", "SPARS", "PIPER", - "POSES", "LOOPS", "APPAL", "LOSES", "LINEN", "ROARS", "RARER", "NIECE", "LOCAL", - "NONCE", "CREEP", "SCARS", "SPOOR", "PEASE", "SIRES", "PRESS", "CLASS", "PAEAN", - "SPOOL", "LOOSE", "CRASS", "LILAC", "COLIC", "RACER", "CREPE", "NASAL", "SOLOS", - "ROSES", "COLON", "REPEL", "ASSES", "INANE", "SCENE", "SLAPS", "PEEPS", "LAPEL", - "PIECE", "LEPER", "REELS", "INNER", "PROPS", "SILLS", "LEASE", "SOLES", "CIRCA", - "CRESS", "SCANS", "SPOON", "REARS", "CACAO", "ERASE", "CANON", "SOARS", "SLOOP", - "AREAS", "SPINS", "OASIS", "OASES", "POPES", "ELOPE", "CEASE", "CINCO", "APPLE", - "NOOSE", "PEERS", "SENSE", "POOLS", "RISER", "PENCE", "POSSE", "ALIAS", "PESOS", - "SCOOP", "EASEL", "LOONS", "CONIC", "SPANS", "SPIES", "PRIOR", "SALSA", "SELLS", - "PILLS", "RISES", "RARES", "SNEER", "SOILS", "ARENA", "CASES", "CANAL", "SAILS", - "LASSO", "COCOA", "ERROR", "CALLS", + "CRISP", "SALSA", "PRESS", "LIONS", "SPIRE", "CAPES", "ROLLS", "LOOSE", "ALOES", + "COPSE", "ENROL", "SLOPE", "CAPER", "SCORE", "SLAPS", "PLEAS", "CANOE", "REAPS", + "PEASE", "SLEEP", "LEAPS", "CORAL", "PILLS", "LOCAL", "ARENA", "PROSE", "SALES", + "OPENS", "REPEL", "REALS", "COLIC", "APRON", "LOINS", "COINS", "LASSO", "SIREN", + "SCARS", "RISER", "CRIES", "CRESS", "POSES", "NEARS", "CAIRN", "PARSE", "SCENE", + "SCOOP", "SPINS", "CORNS", "NOSES", "CLEAR", "LANES", "LOSES", "PIERS", "SLAIN", + "ROPES", "ALIEN", "LINER", "PRIES", "PROPS", "CRANE", "SCARE", "PEONS", "POLLS", + "LINEN", "SLIPS", "CAROL", "PEEPS", "SPANS", "ARISE", "POLES", "SCRAP", "OASIS", + "PAPAS", "PAINS", "SPOOL", "RELIC", "ALONE", "SLOPS", "PIANO", "PERIL", "SPICE", + "SPIES", "SPORE", "CLEAN", "SOLOS", "CREEP", "NONCE", "POISE", "COALS", "LEASE", + "SEALS", "COILS", "PILES", "RARES", "APPAL", "OASES", "RINSE", "POPES", "CONIC", + "SLICE", "SPACE", "ACRES", "ACORN", "ROLES", "CASES", "RESIN", "CREPE", "SOILS", + "PANEL", "SNEER", "INANE", "SCANS", "APACE", "EASEL", "CORES", "SOLAR", "PALES", + "SCOPE", "SCRIP", "LOANS", "ASSES", "EARNS", "CANON", "PLAIN", "POPPA", "SPOIL", + "APPLE", "ROSIN", "PANIC", "RISES", "AISLE", "CAPON", "COLON", "CLANS", "IRONS", + "RISEN", "PAILS", "LEANS", "PRICE", "AREAS", "SPARE", "LEARN", "PANES", "PRIOR", + "CRAPE", "LINES", "LEPER", "SNAPS", "POOLS", "SIRES", "SNARE", "COCOA", "PALER", + "CLOSE", "CRIER", "SANER", "PEARL", "CIRCA", "PAEAN", "RAISE", "SELLS", "OPINE", + "CEASE", "CANES", "ONION", "REELS", "RIPER", "SPARS", "RIPEN", "EPICS", "PLIES", + "CELLS", "SCALP", "ELOPE", "CANAL", "ROARS", "EASES", "OPERA", "SLOOP", "RARER", + "LIENS", "CROPS", "LACES", "LAIRS", "AEONS", "SOLES", "SNIPE", "PIECE", "NOOSE", + "NICER", "PENAL", "SILLS", "LANCE", "LOOPS", "SNORE", "PACES", "PLACE", "SPILL", + "PAIRS", "ARSON", "LAPSE", "CLASS", "EERIE", "PEERS", "PLANS", "LOONS", "SPOON", + "POSER", "SEERS", "REARS", "ROSES", "INNER", "NASAL", "OCEAN", "OPALS", "ALIAS", + "RACES", "ERASE", "SPINE", "SAILS", "CACAO", "CLASP", "REINS", "PAPER", "PIPER", + "EARLS", "PINES", "POLAR", "SNARL", "SCALE", "SPEAR", "SCION", "CRONE", "PRONE", + "SCORN", "RACER", "LILAC", "AROSE", "ISLES", "LAPEL", "PLANE", "PEARS", "POSSE", + "SORES", "PENCE", "CLAPS", "PESOS", "PENIS", "CALLS", "ASPEN", "COOLS", "CRASS", + "OSIER", "CARES", "PAPAL", "SOARS", "RILLS", "ERROR", "NAILS", "COPRA", "LOSER", + "SPELL", "CONES", "PORES", "SNAIL", "CROSS", "NIECE", "COLOR", "SALON", "SINCE", + "CORPS", "LIARS", "PIPES", "RAINS", "SPREE", "CLIPS", "NOISE", "PEALS", "SPOOR", + "SENSE", "PEACE", "RAILS", #if (USE_EXPANDED_DICT != 1) }; // These are words that'll never be used, but still need to be in the dictionary for guesses. // Top 100K most common words from Wiktionary https://gist.github.com/h3xx/1976236 -// Number of words found: 469 +// Number of words found: 470 static const char _expanded_words[][WORDLE_LENGTH + 1] = { #endif #if (USE_EXPANDED_DICT != 0) @@ -86,48 +86,48 @@ static const char _expanded_words[][WORDLE_LENGTH + 1] = { "NELLA", "PAOLO", "SOLON", "REPAS", "NANCE", "PAINE", "SAISI", "ELISE", "CESAR", "CANNA", "SALLE", "SINON", "SINAI", "LOIRE", "PENSA", "LEILA", "REISE", "ELLAS", "POORE", "EARLE", "CERCA", "LEISE", "POOLE", "AILES", "SANOA", "LEONE", "LILLE", - "PROIE", "CARNE", "SPIEL", "CERES", "ENSIN", "ROLLO", "ARRAS", "SEIEN", "PRIER", - "ANNAN", "CALLE", "LIISA", "SALIR", "LESSE", "LESEN", "LIIAN", "NEERE", "ARIEL", - "PIENI", "PIERO", "ERANO", "ELENA", "SILLE", "NEALE", "SEENE", "ROLLE", "NELLE", - "SOLLE", "ESSER", "PASAR", "PREIS", "ASIAN", "SENCE", "ANSON", "SERRA", "CONAN", - "SERAS", "SIENA", "SOPRA", "RENEE", "ALINE", "CORSE", "ASSAI", "INSEL", "ROSIE", - "SONIA", "APPEL", "CRISE", "CIRCE", "LINIE", "RENAN", "CAIRE", "COLLA", "SANOO", - "EENER", "ANCOR", "NEPAL", "REINO", "LAINE", "SOONE", "ALAIN", "LAPSI", "INCAS", - "INNES", "CARON", "ROSEN", "CASAS", "NOLAN", "SERRE", "PESAR", "SEARS", "LEPIC", - "LISLE", "LOSSE", "CINNA", "SERIE", "RIRES", "CORSO", "SOIRS", "CREER", "POCOS", - "SIENS", "ARLES", "CROCE", "IONIC", "PONER", "ESSEN", "SANON", "CESSA", "SERIA", - "ALPES", "NINON", "LILLA", "AINOA", "CORPO", "LESER", "ILLIS", "ROPER", "ANNEE", - "PAIRE", "PEPIN", "ORIEL", "CANNE", "AIRES", "ARCIS", "EASIE", "ANNOS", "COLLE", - "SELLE", "EILEN", "CAPRI", "ERICA", "ROCCO", "ARIAN", "CLEON", "ALLIE", "PONCE", - "COPIE", "INNAN", "NOCES", "NAPPE", "CORNE", "ESIIN", "ENCOR", "LORNA", "SACRE", - "PAPEL", "SAILE", "SAEPE", "CREON", "LLENO", "ELISA", "PASSO", "ASILE", "LORCS", - "ASIAA", "SANIN", "ONNEN", "SONNA", "AILIE", "ALIIS", "ECOLE", "CREES", "PRESO", - "CLARO", "EARES", "ROSSI", "COREA", "SANAN", "AESOP", "SAPOR", "EISEN", "ACASO", - "PARAS", "NANON", "LAPIS", "ARRAN", "CLLIA", "SACRA", "PRINS", "CENCI", "CLAES", - "SLAAP", "ROLLA", "COLES", "LORNE", "OLELO", "CASSE", "NILES", "PASOS", "ESSAI", - "ROSAS", "LLENA", "LEERE", "CLASE", "CALOR", "ROSSE", "ALLEE", "SOREL", "SANAA", - "SLONE", "OLSEN", "OOREN", "PARER", "PASSI", "POSSA", "PLAIE", "OPERE", "SCAPE", - "POLEN", "RIPON", "SCALA", "AILLE", "PALOS", "CLAPP", "ESCAP", "ELLEI", "IONIA", - "NICOL", "PAESE", "PERON", "ORSON", "INNEN", "AISNE", "RANCE", "SLAAN", "PAOLI", - "COLLO", "ANNAS", "ERROL", "CLERC", "SAINE", "RAINA", "PRESE", "PARIA", "PERLE", - "RECAL", "SINAE", "PESER", "OISIN", "PLENA", "CARLE", "PERES", "SACAR", "ALPEN", - "CORRE", "ACCES", "RILLA", "ANNAL", "PERSE", "SAALE", "PERRO", "AILSA", "POCAS", - "SOLEN", "PLASE", "SOLIS", "PAPPI", "COPIA", "ARIES", "ROCCA", "ALIOS", "ROCAS", - "PELOS", "NEPOS", "COLPA", "ISORA", "LECON", "SOANE", "SNELL", "ILLOS", "PILAR", - "ECLAC", "PRESA", "SILLA", "NIELS", "LIPPO", "CROLL", "PONEN", "POSEE", "PIPPA", - "ILLAN", "CENIS", "SANNA", "RASSI", "CERRO", "SCENA", "CASOS", "COLPO", "POSSO", - "POSEN", "EINAR", "ISLAS", "IPSIS", "SALEN", "ASIEN", "CREAN", "LENIN", "LOCIS", - "NENNE", "ILION", "NARES", "ONNEA", "PALAA", "PIPPO", "POLIS", "RICOS", "ELSON", - "SNOOP", "ANNIS", "PROPE", "ELLIE", "ERNIE", "PLIER", "SERES", "REINA", "LIPPE", - "OLINE", "PARIE", "ARLEE", "NIAIS", "LEONI", "RAINE", "LARES", "SEINS", "CARRE", - "POILS", "ALENE", "LINEA", "NEARE", "PENSO", "PRISA", "CAPEL", "PAREA", "PEECE", - "SALIO", "COELO", "SCIRE", "NELLO", "LIENE", "ORICE", "EPAIS", "PERCE", "ALLIS", - "PEPLE", "LARNE", "NEILL", "OLLEN", "CASCA", "LAPIN", "OLLIE", "SALIC", "LIANE", - "REESE", "ELSLI", "SPION", "RIENS", "LILAS", "PAPPA", "ERRER", "SPISE", "CELIE", - "OLSON", "IRREN", "ARIAS", "ARION", "PASEO", "CAERE", "PISAN", "CARRO", "PAROI", - "NOONE", "SEPPI", "OPPIA", "SEALE", "LIPPI", "PELAS", "COCOS", "PLACA", "CONOR", - "LANCA", "OSASI", "ALOIS", "NAIRN", "PIENO", "SPASS", "SAONE", "ALNAR", "CARIA", - "PIENA", + "PROIE", "CARNE", "SPIEL", "CERES", "ENSIN", "CINCO", "ROLLO", "ARRAS", "SEIEN", + "PRIER", "ANNAN", "CALLE", "LIISA", "SALIR", "LESSE", "LESEN", "LIIAN", "NEERE", + "ARIEL", "PIENI", "PIERO", "ERANO", "ELENA", "SILLE", "NEALE", "SEENE", "ROLLE", + "NELLE", "SOLLE", "ESSER", "PASAR", "PREIS", "ASIAN", "SENCE", "ANSON", "SERRA", + "CONAN", "SERAS", "SIENA", "SOPRA", "RENEE", "ALINE", "CORSE", "ASSAI", "INSEL", + "ROSIE", "SONIA", "APPEL", "CRISE", "CIRCE", "LINIE", "RENAN", "CAIRE", "COLLA", + "SANOO", "EENER", "ANCOR", "NEPAL", "REINO", "LAINE", "SOONE", "ALAIN", "LAPSI", + "INCAS", "INNES", "CARON", "ROSEN", "CASAS", "NOLAN", "SERRE", "PESAR", "SEARS", + "LEPIC", "LISLE", "LOSSE", "CINNA", "SERIE", "RIRES", "CORSO", "SOIRS", "CREER", + "POCOS", "SIENS", "ARLES", "CROCE", "IONIC", "PONER", "ESSEN", "SANON", "CESSA", + "SERIA", "ALPES", "NINON", "LILLA", "AINOA", "CORPO", "LESER", "ILLIS", "ROPER", + "ANNEE", "PAIRE", "PEPIN", "ORIEL", "CANNE", "AIRES", "ARCIS", "EASIE", "ANNOS", + "COLLE", "SELLE", "EILEN", "CAPRI", "ERICA", "ROCCO", "ARIAN", "CLEON", "ALLIE", + "PONCE", "COPIE", "INNAN", "NOCES", "NAPPE", "CORNE", "ESIIN", "ENCOR", "LORNA", + "SACRE", "PAPEL", "SAILE", "SAEPE", "CREON", "LLENO", "ELISA", "PASSO", "ASILE", + "LORCS", "ASIAA", "SANIN", "ONNEN", "SONNA", "AILIE", "ALIIS", "ECOLE", "CREES", + "PRESO", "CLARO", "EARES", "ROSSI", "COREA", "SANAN", "AESOP", "SAPOR", "EISEN", + "ACASO", "PARAS", "NANON", "LAPIS", "ARRAN", "CLLIA", "SACRA", "PRINS", "CENCI", + "CLAES", "SLAAP", "ROLLA", "COLES", "LORNE", "OLELO", "CASSE", "NILES", "PASOS", + "ESSAI", "ROSAS", "LLENA", "LEERE", "CLASE", "CALOR", "ROSSE", "ALLEE", "SOREL", + "SANAA", "SLONE", "OLSEN", "OOREN", "PARER", "PASSI", "POSSA", "PLAIE", "OPERE", + "SCAPE", "POLEN", "RIPON", "SCALA", "AILLE", "PALOS", "CLAPP", "ESCAP", "ELLEI", + "IONIA", "NICOL", "PAESE", "PERON", "ORSON", "INNEN", "AISNE", "RANCE", "SLAAN", + "PAOLI", "COLLO", "ANNAS", "ERROL", "CLERC", "SAINE", "RAINA", "PRESE", "PARIA", + "PERLE", "RECAL", "SINAE", "PESER", "OISIN", "PLENA", "CARLE", "PERES", "SACAR", + "ALPEN", "CORRE", "ACCES", "RILLA", "ANNAL", "PERSE", "SAALE", "PERRO", "AILSA", + "POCAS", "SOLEN", "PLASE", "SOLIS", "PAPPI", "COPIA", "ARIES", "ROCCA", "ALIOS", + "ROCAS", "PELOS", "NEPOS", "COLPA", "ISORA", "LECON", "SOANE", "SNELL", "ILLOS", + "PILAR", "ECLAC", "PRESA", "SILLA", "NIELS", "LIPPO", "CROLL", "PONEN", "POSEE", + "PIPPA", "ILLAN", "CENIS", "SANNA", "RASSI", "CERRO", "SCENA", "CASOS", "COLPO", + "POSSO", "POSEN", "EINAR", "ISLAS", "IPSIS", "SALEN", "ASIEN", "CREAN", "LENIN", + "LOCIS", "NENNE", "ILION", "NARES", "ONNEA", "PALAA", "PIPPO", "POLIS", "RICOS", + "ELSON", "SNOOP", "ANNIS", "PROPE", "ELLIE", "ERNIE", "PLIER", "SERES", "REINA", + "LIPPE", "OLINE", "PARIE", "ARLEE", "NIAIS", "LEONI", "RAINE", "LARES", "SEINS", + "CARRE", "POILS", "ALENE", "LINEA", "NEARE", "PENSO", "PRISA", "CAPEL", "PAREA", + "PEECE", "SALIO", "COELO", "SCIRE", "NELLO", "LIENE", "ORICE", "EPAIS", "PERCE", + "ALLIS", "PEPLE", "LARNE", "NEILL", "OLLEN", "CASCA", "LAPIN", "OLLIE", "SALIC", + "LIANE", "REESE", "ELSLI", "SPION", "RIENS", "LILAS", "PAPPA", "ERRER", "SPISE", + "CELIE", "OLSON", "IRREN", "ARIAS", "ARION", "PASEO", "CAERE", "PISAN", "CARRO", + "PAROI", "NOONE", "SEPPI", "OPPIA", "SEALE", "LIPPI", "PELAS", "COCOS", "PLACA", + "CONOR", "LANCA", "OSASI", "ALOIS", "NAIRN", "PIENO", "SPASS", "SAONE", "ALNAR", + "CARIA", "PIENA", #endif }; @@ -135,7 +135,6 @@ static const char _expanded_words[][WORDLE_LENGTH + 1] = { static const char _expanded_words[][WORDLE_LENGTH + 1] = {}; #endif -static const uint16_t _num_unique_words = 155; // The _legal_words array begins with this many words where each letter is different. static const uint16_t _num_words = (sizeof(_legal_words) / sizeof(_legal_words[0])); static const uint16_t _num_expanded_words = (sizeof(_expanded_words) / sizeof(_expanded_words[0])); static const uint8_t _num_valid_letters = (sizeof(_valid_letters) / sizeof(_valid_letters[0])); @@ -157,8 +156,8 @@ static uint8_t get_first_pos(WordleLetterResult *word_elements_result) { } static uint8_t get_next_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { - for (size_t pos = curr_pos+1; pos < WORDLE_LENGTH; pos++) { - if (word_elements_result[pos] != WORDLE_LETTER_CORRECT) + for (size_t pos = curr_pos; pos < WORDLE_LENGTH;) { + if (word_elements_result[++pos] != WORDLE_LETTER_CORRECT) return pos; } return WORDLE_LENGTH; @@ -166,8 +165,8 @@ static uint8_t get_next_pos(uint8_t curr_pos, WordleLetterResult *word_elements_ static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_result) { if (curr_pos == 0) return 0; - for (int8_t pos = curr_pos-1; pos >= 0; pos--) { - if (word_elements_result[pos] != WORDLE_LETTER_CORRECT) + for (int8_t pos = curr_pos; pos >= 0;) { + if (word_elements_result[--pos] != WORDLE_LETTER_CORRECT) return pos; } return curr_pos; @@ -262,7 +261,7 @@ static bool check_word(wordle_state_t *state) { } static void display_attempt(uint8_t attempt) { - char buf[2]; + char buf[3]; sprintf(buf, "%d", attempt+1); watch_display_string(buf, 3); } @@ -455,7 +454,7 @@ static void get_result(wordle_state_t *state) { #endif return; } - if (state->attempt++ > WORDLE_MAX_ATTEMPTS) { + if (++state->attempt >= WORDLE_MAX_ATTEMPTS) { state->playing = false; state->curr_screen = SCREEN_LOSE; state->streak = 0; diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 1860984f..aee40f4a 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -94,10 +94,9 @@ typedef struct { uint8_t word_elements[WORDLE_LENGTH]; WordleLetterResult word_elements_result[WORDLE_LENGTH]; uint16_t guessed_words[WORDLE_MAX_ATTEMPTS]; - uint8_t attempt : 3; + uint8_t attempt : 4; uint8_t position : 3; bool playing : 1; - bool unused : 1; uint16_t curr_answer; uint8_t streak; WordleScreen curr_screen; diff --git a/utils/wordle_face/wordle_list.py b/utils/wordle_face/wordle_list.py index d508a8be..87f2f821 100644 --- a/utils/wordle_face/wordle_list.py +++ b/utils/wordle_face/wordle_list.py @@ -260,7 +260,7 @@ legal_list = [ "WORDS", "WORDY", "WORKS", "WORLD", "WORMS", "WORRY", "WORSE", "WORST", "WORTH", "WOULD", "WOUND", "WRACK", "WRAPS", "WRAPT", "WRATH", "WREAK", "WRECK", "WREST", "WRING", "WRIST", "WRITE", "WRITS", "WRONG", "WROTE", "WROTH", "YACHT", "YARDS", "YARNS", "YAWNS", "YEARN", "YEARS", "YEAST", "YELLS", "YELPS", "YIELD", "YOKED", - "YOKES", "YOLKS", "YOUNG", "YOURS", "YOUTH", "ZEBRA", "ZONES", "COLOR", "CINCO", + "YOKES", "YOLKS", "YOUNG", "YOURS", "YOUTH", "ZEBRA", "ZONES", "COLOR", ] expanded_list = [ @@ -982,11 +982,6 @@ def list_of_valid_words(letters, words=legal_list): return legal_words -def rearrange_words_by_uniqueness(words): - unique = [word for word in words if len(word) == len(set(word))] - duplicates = [word for word in words if len(word) != len(set(word))] - return unique + duplicates, len(unique) - def capitalize_all_and_remove_duplicates(arr): for i,word in enumerate(arr): arr[i] = word.upper() @@ -1006,7 +1001,6 @@ def print_valid_words(letters=alphabet): legal_words = capitalize_all_and_remove_duplicates(legal_words) random.shuffle(legal_words) # Just in case the watch's random function is too pseudo, better to shuffle th elist so it's less likely to always have the same starting letter - legal_words, num_uniq = rearrange_words_by_uniqueness(legal_words) print("static const char _valid_letters[] = {", end='') for letter in letters[:-1]: @@ -1041,8 +1035,6 @@ def print_valid_words(letters=alphabet): i+=1 print('') print("};") - - print(f"\nstatic const uint16_t _num_unique_words = {num_uniq}; // The _legal_words array begins with this many words where each letter is different.") def get_sec_val_and_units(seconds): From 1e76022146fa7f8e40e308c1e4395c1b064d2a9a Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 17 Aug 2024 11:36:35 -0400 Subject: [PATCH 15/53] Gave the wordle face the ability to give random guesses on the first word --- movement/movement_config.h | 1 + .../watch_faces/complication/wordle_face.c | 98 ++++++++++++------- .../watch_faces/complication/wordle_face.h | 9 +- utils/wordle_face/wordle_list.py | 8 ++ 4 files changed, 80 insertions(+), 36 deletions(-) diff --git a/movement/movement_config.h b/movement/movement_config.h index abceacf1..f8a1958f 100644 --- a/movement/movement_config.h +++ b/movement/movement_config.h @@ -29,6 +29,7 @@ const watch_face_t watch_faces[] = { simple_clock_face, + wordle_face, world_clock_face, sunrise_sunset_face, moon_phase_face, diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index c6f28bb4..32c396be 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -35,38 +35,38 @@ static const char _valid_letters[] = {'A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R // From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff // Number of words found: 282 static const char _legal_words[][WORDLE_LENGTH + 1] = { - "CRISP", "SALSA", "PRESS", "LIONS", "SPIRE", "CAPES", "ROLLS", "LOOSE", "ALOES", - "COPSE", "ENROL", "SLOPE", "CAPER", "SCORE", "SLAPS", "PLEAS", "CANOE", "REAPS", - "PEASE", "SLEEP", "LEAPS", "CORAL", "PILLS", "LOCAL", "ARENA", "PROSE", "SALES", - "OPENS", "REPEL", "REALS", "COLIC", "APRON", "LOINS", "COINS", "LASSO", "SIREN", - "SCARS", "RISER", "CRIES", "CRESS", "POSES", "NEARS", "CAIRN", "PARSE", "SCENE", - "SCOOP", "SPINS", "CORNS", "NOSES", "CLEAR", "LANES", "LOSES", "PIERS", "SLAIN", - "ROPES", "ALIEN", "LINER", "PRIES", "PROPS", "CRANE", "SCARE", "PEONS", "POLLS", - "LINEN", "SLIPS", "CAROL", "PEEPS", "SPANS", "ARISE", "POLES", "SCRAP", "OASIS", - "PAPAS", "PAINS", "SPOOL", "RELIC", "ALONE", "SLOPS", "PIANO", "PERIL", "SPICE", - "SPIES", "SPORE", "CLEAN", "SOLOS", "CREEP", "NONCE", "POISE", "COALS", "LEASE", - "SEALS", "COILS", "PILES", "RARES", "APPAL", "OASES", "RINSE", "POPES", "CONIC", - "SLICE", "SPACE", "ACRES", "ACORN", "ROLES", "CASES", "RESIN", "CREPE", "SOILS", - "PANEL", "SNEER", "INANE", "SCANS", "APACE", "EASEL", "CORES", "SOLAR", "PALES", - "SCOPE", "SCRIP", "LOANS", "ASSES", "EARNS", "CANON", "PLAIN", "POPPA", "SPOIL", - "APPLE", "ROSIN", "PANIC", "RISES", "AISLE", "CAPON", "COLON", "CLANS", "IRONS", - "RISEN", "PAILS", "LEANS", "PRICE", "AREAS", "SPARE", "LEARN", "PANES", "PRIOR", - "CRAPE", "LINES", "LEPER", "SNAPS", "POOLS", "SIRES", "SNARE", "COCOA", "PALER", - "CLOSE", "CRIER", "SANER", "PEARL", "CIRCA", "PAEAN", "RAISE", "SELLS", "OPINE", - "CEASE", "CANES", "ONION", "REELS", "RIPER", "SPARS", "RIPEN", "EPICS", "PLIES", - "CELLS", "SCALP", "ELOPE", "CANAL", "ROARS", "EASES", "OPERA", "SLOOP", "RARER", - "LIENS", "CROPS", "LACES", "LAIRS", "AEONS", "SOLES", "SNIPE", "PIECE", "NOOSE", - "NICER", "PENAL", "SILLS", "LANCE", "LOOPS", "SNORE", "PACES", "PLACE", "SPILL", - "PAIRS", "ARSON", "LAPSE", "CLASS", "EERIE", "PEERS", "PLANS", "LOONS", "SPOON", - "POSER", "SEERS", "REARS", "ROSES", "INNER", "NASAL", "OCEAN", "OPALS", "ALIAS", - "RACES", "ERASE", "SPINE", "SAILS", "CACAO", "CLASP", "REINS", "PAPER", "PIPER", - "EARLS", "PINES", "POLAR", "SNARL", "SCALE", "SPEAR", "SCION", "CRONE", "PRONE", - "SCORN", "RACER", "LILAC", "AROSE", "ISLES", "LAPEL", "PLANE", "PEARS", "POSSE", - "SORES", "PENCE", "CLAPS", "PESOS", "PENIS", "CALLS", "ASPEN", "COOLS", "CRASS", - "OSIER", "CARES", "PAPAL", "SOARS", "RILLS", "ERROR", "NAILS", "COPRA", "LOSER", - "SPELL", "CONES", "PORES", "SNAIL", "CROSS", "NIECE", "COLOR", "SALON", "SINCE", - "CORPS", "LIARS", "PIPES", "RAINS", "SPREE", "CLIPS", "NOISE", "PEALS", "SPOOR", - "SENSE", "PEACE", "RAILS", + "ROPES", "RESIN", "PACES", "RIPEN", "ALIEN", "SPINE", "ROSIN", "PIERS", "CAPER", + "SNORE", "SANER", "RAILS", "SCORN", "PENIS", "NEARS", "ENROL", "PROSE", "CANES", + "POSER", "ACORN", "PAILS", "SLAIN", "REALS", "CLAPS", "PLIES", "PALES", "LIENS", + "PLAIN", "SLOPE", "REAPS", "CRAPE", "ASPEN", "COINS", "ARISE", "ALOES", "PANES", + "SCION", "SNARL", "COPRA", "PALER", "CLIPS", "PANIC", "PARSE", "PENAL", "SPARE", + "LIONS", "LINES", "SNARE", "PEONS", "CLEAN", "SPACE", "SCALE", "COILS", "SCRAP", + "OPINE", "NICER", "LOANS", "RACES", "RELIC", "NOISE", "PIANO", "CRANE", "SNAIL", + "SCORE", "CLEAR", "CROPS", "CORES", "COPSE", "PINES", "PANEL", "RINSE", "LOINS", + "PRONE", "ALONE", "RAISE", "OSIER", "LEARN", "SPICE", "SPOIL", "EARLS", "NAILS", + "PLANE", "CARES", "CRIES", "CORNS", "CORPS", "CLASP", "LACES", "ARSON", "LANES", + "OPENS", "SALON", "SINCE", "PLANS", "SCARE", "SPORE", "OCEAN", "AEONS", "PRICE", + "IRONS", "SCALP", "EPICS", "LIARS", "SPIRE", "LINER", "PILES", "SLICE", "LEANS", + "RAINS", "PLEAS", "SOLAR", "CAPES", "APRON", "RISEN", "POISE", "CONES", "PEARS", + "PERIL", "COALS", "OPALS", "ROLES", "CLOSE", "CAPON", "POLES", "EARNS", "CRISP", + "AROSE", "SCOPE", "AISLE", "CLANS", "CORAL", "SCRIP", "PAINS", "OPERA", "PAIRS", + "PEARL", "SIREN", "ACRES", "CAROL", "LAIRS", "PORES", "PRIES", "CRONE", "CANOE", + "LAPSE", "LEAPS", "SNIPE", "REINS", "PEALS", "SPEAR", "LOSER", "POLAR", "LANCE", + "CAIRN", "PLACE", "SILLS", "CELLS", "EERIE", "PIECE", "ISLES", "NOOSE", "SNEER", + "SOLOS", "ELOPE", "INNER", "SLOOP", "SOARS", "SPREE", "SPANS", "PAPAL", "RIPER", + "COLON", "SCANS", "RARES", "PILLS", "CANON", "POLLS", "POPPA", "ERROR", "REARS", + "PESOS", "CRESS", "PENCE", "SPOOL", "COLOR", "NONCE", "CLASS", "SELLS", "NASAL", + "ERASE", "RILLS", "LAPEL", "COOLS", "EASEL", "COLIC", "SPELL", "SPOOR", "LASSO", + "APPAL", "PEACE", "SALSA", "SCENE", "NIECE", "CONIC", "APPLE", "SNAPS", "PEERS", + "ROARS", "SPARS", "SAILS", "SLOPS", "APACE", "POSES", "SENSE", "PEEPS", "CASES", + "CANAL", "CIRCA", "SLAPS", "SCOOP", "ROLLS", "PIPES", "SCARS", "LOOSE", "ROSES", + "LILAC", "OASES", "SOLES", "PAEAN", "PAPAS", "CRASS", "PROPS", "SEALS", "CACAO", + "LINEN", "SORES", "EASES", "POPES", "OASIS", "LOSES", "NOSES", "SIRES", "SPILL", + "CREPE", "ALIAS", "CROSS", "ARENA", "SPINS", "REPEL", "SPIES", "PRIOR", "POOLS", + "PRESS", "RISER", "AREAS", "SPOON", "SALES", "CREEP", "CEASE", "LOOPS", "ASSES", + "CALLS", "CRIER", "COCOA", "SEERS", "LOONS", "SLIPS", "PAPER", "REELS", "RISES", + "POSSE", "RARER", "SOILS", "PIPER", "INANE", "LOCAL", "PEASE", "ONION", "SLEEP", + "LEASE", "RACER", "LEPER", #if (USE_EXPANDED_DICT != 1) }; // These are words that'll never be used, but still need to be in the dictionary for guesses. @@ -127,7 +127,7 @@ static const char _expanded_words[][WORDLE_LENGTH + 1] = { "CELIE", "OLSON", "IRREN", "ARIAS", "ARION", "PASEO", "CAERE", "PISAN", "CARRO", "PAROI", "NOONE", "SEPPI", "OPPIA", "SEALE", "LIPPI", "PELAS", "COCOS", "PLACA", "CONOR", "LANCA", "OSASI", "ALOIS", "NAIRN", "PIENO", "SPASS", "SAONE", "ALNAR", - "CARIA", "PIENA", + "CARIA", "PIENA", #endif }; @@ -135,6 +135,9 @@ static const char _expanded_words[][WORDLE_LENGTH + 1] = { static const char _expanded_words[][WORDLE_LENGTH + 1] = {}; #endif +static const uint16_t _num_unique_words = 155; // The _legal_words array begins with this many words where each letter is different. + + static const uint16_t _num_words = (sizeof(_legal_words) / sizeof(_legal_words[0])); static const uint16_t _num_expanded_words = (sizeof(_expanded_words) / sizeof(_expanded_words[0])); static const uint8_t _num_valid_letters = (sizeof(_valid_letters) / sizeof(_valid_letters[0])); @@ -286,6 +289,7 @@ static void reset_board(wordle_state_t *state) { state->guessed_words[i] = _num_words + _num_expanded_words; } state->curr_answer = get_random(_num_words); + state->using_random_guess = false; state->attempt = 0; watch_clear_colon(); watch_display_string(" ", 4); @@ -464,6 +468,23 @@ static void get_result(wordle_state_t *state) { return; } +static void insert_random_guess(wordle_state_t *state) { + uint16_t random_guess; + do { // Don't allow the guess to be the same as the answer + random_guess = get_random(_num_unique_words); + } while (random_guess == state->curr_answer); + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + for (size_t j = 0; j < _num_valid_letters; j++) + { + if (_legal_words[random_guess][i] == _valid_letters[j]) + state->word_elements[i] = j; + } + } + state->position = WORDLE_LENGTH - 1; + display_all_letters(state); + state->using_random_guess = true; +} + void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr) { (void) settings; (void) watch_face_index; @@ -484,6 +505,7 @@ void wordle_face_activate(movement_settings_t *settings, void *context) { if (state->prev_day <= (now + (60 *60 * 24))) state->streak = 0; if (state->curr_day != now) state->playing = false; #endif + state->using_random_guess = false; movement_request_tick_frequency(2); display_title(state); } @@ -530,9 +552,17 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi display_letter(state, true); if (state->word_elements[state->position] == _num_valid_letters) break; state->playing = true; + + if (watch_get_pin_level(BTN_LIGHT) && + (state->using_random_guess || (state->attempt == 0 && state->position == 0))) { + insert_random_guess(state); + break; + } state->position = get_next_pos(state->position, state->word_elements_result); - if (state->position >= WORDLE_LENGTH) + if (state->position >= WORDLE_LENGTH) { get_result(state); + state->using_random_guess = false; + } break; case EVENT_ALARM_LONG_PRESS: if (state->curr_screen != SCREEN_PLAYING) break; diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index aee40f4a..64a1665c 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -49,7 +49,11 @@ * Else: None * * Alarm Press - * If Playing: Next position + * If Playing: If Light btn held and + * (on first letter or already used a random guess) + * and first attempt: Use a random 5 letter word with all letters that are different. + * Else: Next position + * Next position * Else: Next screen * Alarm Hold * If Playing: Previous position @@ -97,7 +101,8 @@ typedef struct { uint8_t attempt : 4; uint8_t position : 3; bool playing : 1; - uint16_t curr_answer; + uint16_t curr_answer : 15; + bool using_random_guess : 1; uint8_t streak; WordleScreen curr_screen; #if USE_DAILY_STREAK diff --git a/utils/wordle_face/wordle_list.py b/utils/wordle_face/wordle_list.py index 87f2f821..38e95104 100644 --- a/utils/wordle_face/wordle_list.py +++ b/utils/wordle_face/wordle_list.py @@ -982,6 +982,11 @@ def list_of_valid_words(letters, words=legal_list): return legal_words +def rearrange_words_by_uniqueness(words): + unique = [word for word in words if len(word) == len(set(word))] + duplicates = [word for word in words if len(word) != len(set(word))] + return unique + duplicates, len(unique) + def capitalize_all_and_remove_duplicates(arr): for i,word in enumerate(arr): arr[i] = word.upper() @@ -1001,6 +1006,7 @@ def print_valid_words(letters=alphabet): legal_words = capitalize_all_and_remove_duplicates(legal_words) random.shuffle(legal_words) # Just in case the watch's random function is too pseudo, better to shuffle th elist so it's less likely to always have the same starting letter + legal_words, num_uniq = rearrange_words_by_uniqueness(legal_words) print("static const char _valid_letters[] = {", end='') for letter in letters[:-1]: @@ -1035,6 +1041,8 @@ def print_valid_words(letters=alphabet): i+=1 print('') print("};") + + print(f"\nstatic const uint16_t _num_unique_words = {num_uniq}; // The _legal_words array begins with this many words where each letter is different.") def get_sec_val_and_units(seconds): From 4bb4bc85faca225e11910c2c4b7cadfb7e1d164b Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 17 Aug 2024 11:50:07 -0400 Subject: [PATCH 16/53] USE_RANDOM_GUESS variable added --- movement/watch_faces/complication/wordle_face.c | 10 ++++++---- movement/watch_faces/complication/wordle_face.h | 9 ++++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 32c396be..be466cda 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -135,8 +135,6 @@ static const char _expanded_words[][WORDLE_LENGTH + 1] = { static const char _expanded_words[][WORDLE_LENGTH + 1] = {}; #endif -static const uint16_t _num_unique_words = 155; // The _legal_words array begins with this many words where each letter is different. - static const uint16_t _num_words = (sizeof(_legal_words) / sizeof(_legal_words[0])); static const uint16_t _num_expanded_words = (sizeof(_expanded_words) / sizeof(_expanded_words[0])); @@ -468,10 +466,12 @@ static void get_result(wordle_state_t *state) { return; } +#if (USE_RANDOM_GUESS != 0) +static const uint16_t _num_unique_words = 155; // The _legal_words array begins with this many words where each letter is different. static void insert_random_guess(wordle_state_t *state) { uint16_t random_guess; do { // Don't allow the guess to be the same as the answer - random_guess = get_random(_num_unique_words); + random_guess = get_random(USE_RANDOM_GUESS == 2 ? _num_unique_words : _num_words); } while (random_guess == state->curr_answer); for (size_t i = 0; i < WORDLE_LENGTH; i++) { for (size_t j = 0; j < _num_valid_letters; j++) @@ -484,6 +484,7 @@ static void insert_random_guess(wordle_state_t *state) { display_all_letters(state); state->using_random_guess = true; } +#endif void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr) { (void) settings; @@ -552,12 +553,13 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi display_letter(state, true); if (state->word_elements[state->position] == _num_valid_letters) break; state->playing = true; - +#if (USE_RANDOM_GUESS != 0) if (watch_get_pin_level(BTN_LIGHT) && (state->using_random_guess || (state->attempt == 0 && state->position == 0))) { insert_random_guess(state); break; } +#endif state->position = get_next_pos(state->position, state->word_elements_result); if (state->position >= WORDLE_LENGTH) { get_result(state); diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 64a1665c..97c32616 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -49,7 +49,7 @@ * Else: None * * Alarm Press - * If Playing: If Light btn held and + * If Playing: If USE_RANDOM_GUESS is set and Light btn held and * (on first letter or already used a random guess) * and first attempt: Use a random 5 letter word with all letters that are different. * Else: Next position @@ -64,6 +64,13 @@ #define WORDLE_MAX_ATTEMPTS 6 #define USE_DAILY_STREAK false +/* USE_RANDOM_GUESS + * 0 = Don't allow quickly choosing a random quess + * 1 = Allow using a random guess of any value that can be an answer + * 2 = Allow using a random guess of any value that can be an answer where all of its letters are unique +*/ +#define USE_RANDOM_GUESS 2 + /* USE_EXPANDED_DICT * 0 = don't use it at all (saves 2.8KB of ROM) * 1 = Include the expanded dict in answers From 2a10402d19166b81e0294fd96144bb8daf06b896 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 17 Aug 2024 11:52:42 -0400 Subject: [PATCH 17/53] Removed wordle from movmeent face after testing --- movement/movement_config.h | 1 - 1 file changed, 1 deletion(-) diff --git a/movement/movement_config.h b/movement/movement_config.h index f8a1958f..abceacf1 100644 --- a/movement/movement_config.h +++ b/movement/movement_config.h @@ -29,7 +29,6 @@ const watch_face_t watch_faces[] = { simple_clock_face, - wordle_face, world_clock_face, sunrise_sunset_face, moon_phase_face, From a0111fbe24fdf0085ca9ee89d9f56e1d1603af63 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 17 Aug 2024 12:35:48 -0400 Subject: [PATCH 18/53] Swapped the Nice and Job so the Nice text is more likely to appear first. --- movement/watch_faces/complication/wordle_face.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index be466cda..2838b7f2 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -357,7 +357,7 @@ static void display_lose(wordle_state_t *state, uint8_t subsecond) { static void display_win(wordle_state_t *state, uint8_t subsecond) { (void) state; char buf[13]; - sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOb "); + sprintf(buf," W %s ", subsecond % 2 ? "JOb " : "NICE"); watch_display_string(buf, 0); } From 67c1089fb2c2b7133f3e93803b4f911c8ba87379 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 17 Aug 2024 13:22:03 -0400 Subject: [PATCH 19/53] Don't delete the submitted characters if already guessed or not in dict --- movement/watch_faces/complication/wordle_face.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 2838b7f2..94b28e50 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -415,7 +415,9 @@ static bool act_on_btn(wordle_state_t *state) { return true; case SCREEN_NO_DICT: case SCREEN_ALREADY_GUESSED: - show_start_of_attempt(state); + state->position= state->position = get_first_pos(state->word_elements_result); + display_all_letters(state); + state->curr_screen = SCREEN_PLAYING; return true; #if USE_DAILY_STREAK case SCREEN_WAIT: From 4257b71562084fbe0e81ccd915a9557ef5e45ba4 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 17 Aug 2024 19:36:19 -0400 Subject: [PATCH 20/53] combined two areas of code into one function --- .../watch_faces/complication/wordle_face.c | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 94b28e50..6802a22a 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -267,10 +267,12 @@ static void display_attempt(uint8_t attempt) { watch_display_string(buf, 3); } -static void show_start_of_attempt(wordle_state_t *state) { - for (size_t i = 0; i < WORDLE_LENGTH; i++) { - if (state->word_elements_result[i] != WORDLE_LETTER_CORRECT) - state->word_elements[i] = _num_valid_letters; +static void show_start_of_attempt(wordle_state_t *state, bool reset_all_letters) { + if (reset_all_letters) { + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements_result[i] != WORDLE_LETTER_CORRECT) + state->word_elements[i] = _num_valid_letters; + } } display_attempt(state->attempt); display_all_letters(state); @@ -291,7 +293,7 @@ static void reset_board(wordle_state_t *state) { state->attempt = 0; watch_clear_colon(); watch_display_string(" ", 4); - show_start_of_attempt(state); + show_start_of_attempt(state, true); watch_display_string("-", 5); #if __EMSCRIPTEN__ printf("ANSWER: %s\r\n", _legal_words[state->curr_answer]); @@ -389,7 +391,7 @@ static bool act_on_btn(wordle_state_t *state) { switch (state->curr_screen) { case SCREEN_RESULT: - show_start_of_attempt(state); + show_start_of_attempt(state, true); return true; case SCREEN_TITLE: #if USE_DAILY_STREAK @@ -399,7 +401,7 @@ static bool act_on_btn(wordle_state_t *state) { } #endif if (state->playing) - show_start_of_attempt(state); + show_start_of_attempt(state, true); else display_streak(state); return true; @@ -415,9 +417,7 @@ static bool act_on_btn(wordle_state_t *state) { return true; case SCREEN_NO_DICT: case SCREEN_ALREADY_GUESSED: - state->position= state->position = get_first_pos(state->word_elements_result); - display_all_letters(state); - state->curr_screen = SCREEN_PLAYING; + show_start_of_attempt(state, false); return true; #if USE_DAILY_STREAK case SCREEN_WAIT: From 935ede9fda862b94ba5ec300232bca8d1f92ad63 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 18 Aug 2024 10:35:36 -0400 Subject: [PATCH 21/53] Fixed leaving the screen and coming back --- .../watch_faces/complication/wordle_face.c | 35 ++++++++++++------- .../watch_faces/complication/wordle_face.h | 2 +- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 6802a22a..361faf57 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -267,19 +267,19 @@ static void display_attempt(uint8_t attempt) { watch_display_string(buf, 3); } -static void show_start_of_attempt(wordle_state_t *state, bool reset_all_letters) { - if (reset_all_letters) { - for (size_t i = 0; i < WORDLE_LENGTH; i++) { - if (state->word_elements_result[i] != WORDLE_LETTER_CORRECT) - state->word_elements[i] = _num_valid_letters; - } - } +static void display_playing(wordle_state_t *state) { display_attempt(state->attempt); display_all_letters(state); - state->position = get_first_pos(state->word_elements_result); state->curr_screen = SCREEN_PLAYING; } +static void reset_incorrect_elements(wordle_state_t *state) { + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements_result[i] != WORDLE_LETTER_CORRECT) + state->word_elements[i] = _num_valid_letters; + } +} + static void reset_board(wordle_state_t *state) { for (size_t i = 0; i < WORDLE_LENGTH; i++) { state->word_elements[i] = _num_valid_letters; @@ -293,7 +293,9 @@ static void reset_board(wordle_state_t *state) { state->attempt = 0; watch_clear_colon(); watch_display_string(" ", 4); - show_start_of_attempt(state, true); + reset_incorrect_elements(state); + state->position = get_first_pos(state->word_elements_result); + display_playing(state); watch_display_string("-", 5); #if __EMSCRIPTEN__ printf("ANSWER: %s\r\n", _legal_words[state->curr_answer]); @@ -391,7 +393,9 @@ static bool act_on_btn(wordle_state_t *state) { switch (state->curr_screen) { case SCREEN_RESULT: - show_start_of_attempt(state, true); + reset_incorrect_elements(state); + state->position = get_first_pos(state->word_elements_result); + display_playing(state); return true; case SCREEN_TITLE: #if USE_DAILY_STREAK @@ -401,7 +405,7 @@ static bool act_on_btn(wordle_state_t *state) { } #endif if (state->playing) - show_start_of_attempt(state, true); + display_playing(state); else display_streak(state); return true; @@ -417,7 +421,8 @@ static bool act_on_btn(wordle_state_t *state) { return true; case SCREEN_NO_DICT: case SCREEN_ALREADY_GUESSED: - show_start_of_attempt(state, false); + state->position = get_first_pos(state->word_elements_result); + display_playing(state); return true; #if USE_DAILY_STREAK case SCREEN_WAIT: @@ -509,6 +514,10 @@ void wordle_face_activate(movement_settings_t *settings, void *context) { if (state->curr_day != now) state->playing = false; #endif state->using_random_guess = false; + if (state->playing && state->curr_screen >= SCREEN_WIN) { + reset_incorrect_elements(state); + state->position = get_first_pos(state->word_elements_result); + } movement_request_tick_frequency(2); display_title(state); } @@ -581,7 +590,7 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi display_title(state); break; case EVENT_LOW_ENERGY_UPDATE: - if (state->curr_screen == SCREEN_TITLE) + if (state->curr_screen != SCREEN_TITLE) display_title(state); break; default: diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 97c32616..8ad9155c 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -87,7 +87,6 @@ typedef enum { typedef enum { SCREEN_PLAYING = 0, - SCREEN_RESULT, SCREEN_TITLE, SCREEN_STREAK, #if USE_DAILY_STREAK @@ -95,6 +94,7 @@ typedef enum { #endif SCREEN_WIN, SCREEN_LOSE, + SCREEN_RESULT, SCREEN_NO_DICT, SCREEN_ALREADY_GUESSED, SCREEN_COUNT From 57ca74b25338c10a8d6cb58410b69d6bf79ba010 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 18 Aug 2024 10:46:33 -0400 Subject: [PATCH 22/53] Added SONIC and LASER to the allowed words --- movement/watch_faces/complication/wordle_face.c | 8 ++++---- utils/wordle_face/wordle_list.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 361faf57..58ad55a0 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -33,7 +33,7 @@ static const char _valid_letters[] = {'A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R', 'S'}; // From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff -// Number of words found: 282 +// Number of words found: 284 static const char _legal_words[][WORDLE_LENGTH + 1] = { "ROPES", "RESIN", "PACES", "RIPEN", "ALIEN", "SPINE", "ROSIN", "PIERS", "CAPER", "SNORE", "SANER", "RAILS", "SCORN", "PENIS", "NEARS", "ENROL", "PROSE", "CANES", @@ -52,7 +52,7 @@ static const char _legal_words[][WORDLE_LENGTH + 1] = { "AROSE", "SCOPE", "AISLE", "CLANS", "CORAL", "SCRIP", "PAINS", "OPERA", "PAIRS", "PEARL", "SIREN", "ACRES", "CAROL", "LAIRS", "PORES", "PRIES", "CRONE", "CANOE", "LAPSE", "LEAPS", "SNIPE", "REINS", "PEALS", "SPEAR", "LOSER", "POLAR", "LANCE", - "CAIRN", "PLACE", "SILLS", "CELLS", "EERIE", "PIECE", "ISLES", "NOOSE", "SNEER", + "CAIRN", "PLACE", "LASER", "SONIC", "EERIE", "PIECE", "ISLES", "NOOSE", "SNEER", "SOLOS", "ELOPE", "INNER", "SLOOP", "SOARS", "SPREE", "SPANS", "PAPAL", "RIPER", "COLON", "SCANS", "RARES", "PILLS", "CANON", "POLLS", "POPPA", "ERROR", "REARS", "PESOS", "CRESS", "PENCE", "SPOOL", "COLOR", "NONCE", "CLASS", "SELLS", "NASAL", @@ -66,7 +66,7 @@ static const char _legal_words[][WORDLE_LENGTH + 1] = { "PRESS", "RISER", "AREAS", "SPOON", "SALES", "CREEP", "CEASE", "LOOPS", "ASSES", "CALLS", "CRIER", "COCOA", "SEERS", "LOONS", "SLIPS", "PAPER", "REELS", "RISES", "POSSE", "RARER", "SOILS", "PIPER", "INANE", "LOCAL", "PEASE", "ONION", "SLEEP", - "LEASE", "RACER", "LEPER", + "LEASE", "RACER", "LEPER", "SILLS", "CELLS", #if (USE_EXPANDED_DICT != 1) }; // These are words that'll never be used, but still need to be in the dictionary for guesses. @@ -474,7 +474,7 @@ static void get_result(wordle_state_t *state) { } #if (USE_RANDOM_GUESS != 0) -static const uint16_t _num_unique_words = 155; // The _legal_words array begins with this many words where each letter is different. +static const uint16_t _num_unique_words = 157; // The _legal_words array begins with this many words where each letter is different. static void insert_random_guess(wordle_state_t *state) { uint16_t random_guess; do { // Don't allow the guess to be the same as the answer diff --git a/utils/wordle_face/wordle_list.py b/utils/wordle_face/wordle_list.py index 38e95104..da370b7a 100644 --- a/utils/wordle_face/wordle_list.py +++ b/utils/wordle_face/wordle_list.py @@ -260,7 +260,7 @@ legal_list = [ "WORDS", "WORDY", "WORKS", "WORLD", "WORMS", "WORRY", "WORSE", "WORST", "WORTH", "WOULD", "WOUND", "WRACK", "WRAPS", "WRAPT", "WRATH", "WREAK", "WRECK", "WREST", "WRING", "WRIST", "WRITE", "WRITS", "WRONG", "WROTE", "WROTH", "YACHT", "YARDS", "YARNS", "YAWNS", "YEARN", "YEARS", "YEAST", "YELLS", "YELPS", "YIELD", "YOKED", - "YOKES", "YOLKS", "YOUNG", "YOURS", "YOUTH", "ZEBRA", "ZONES", "COLOR", + "YOKES", "YOLKS", "YOUNG", "YOURS", "YOUTH", "ZEBRA", "ZONES", "COLOR", "LASER", "SONIC", ] expanded_list = [ @@ -938,7 +938,7 @@ expanded_list = [ "NOTAR", "OBEIR", "VIMES", "GENUA", "KANAL", "LIMON", "RAHAB", "SUOMI", "VEJEN", "BATEN", "FJORD", "LEVES", "PHARE", "RECTO", "AAGOT", "GIZUR", "NADJA", "RUGGE", "SNEYD", "DECKT", "FAILE", "GAOLS", "MELER", "PACTO", "PAHAN", "CALIF", "MENON", "SEPOY", "WADDY", "ZELLE", "AENDA", "ASTUA", "KROON", "LETRA", "MINIT", "NEEWA", - "PATNA", "URIEL", "HITTE", "HOMOJ", "JOUET", "KOSKI", "LYSTE", "MINAS", "RUHTE", "SETZE", + "PATNA", "URIEL", "HITTE", "HOMOJ", "JOUET", "KOSKI", "LYSTE", "MINAS", "RUHTE", "SETZE", "LASER", "SONIC", ] alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] From 1868f8446ae6f2a99fc36d2a0f5574e606ae10a9 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 18 Aug 2024 18:33:38 -0400 Subject: [PATCH 23/53] Added continue screen --- .../watch_faces/complication/wordle_face.c | 44 +++++++++++++++---- .../watch_faces/complication/wordle_face.h | 6 ++- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 58ad55a0..36382552 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -307,6 +307,13 @@ static void display_title(wordle_state_t *state) { watch_display_string("WO WordLE", 0); } +static void display_continue(wordle_state_t *state) { + char buf[7]; + state->curr_screen = SCREEN_CONTINUE; + sprintf(buf, "Cont %c", state->continuing ? 'y' : 'n'); + watch_display_string(buf, 4); +} + static void display_streak(wordle_state_t *state) { char buf[12]; state->curr_screen = SCREEN_STREAK; @@ -389,7 +396,7 @@ static void display_result(wordle_state_t *state, uint8_t subsecond) { watch_display_string(buf, 5); } -static bool act_on_btn(wordle_state_t *state) { +static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { switch (state->curr_screen) { case SCREEN_RESULT: @@ -401,13 +408,15 @@ static bool act_on_btn(wordle_state_t *state) { #if USE_DAILY_STREAK if (state->prev_day == get_day_unix_time()) { display_wait(state); - return true; } -#endif - if (state->playing) - display_playing(state); +#else + if (state->playing) { + state->continuing = true; + display_continue(state); + } else display_streak(state); +#endif return true; case SCREEN_STREAK: #if USE_DAILY_STREAK @@ -424,6 +433,23 @@ static bool act_on_btn(wordle_state_t *state) { state->position = get_first_pos(state->word_elements_result); display_playing(state); return true; + case SCREEN_CONTINUE: + switch (pin) + { + case BTN_ALARM: + if (state->continuing) + display_playing(state); + else { + reset_board(state); + display_streak(state); + } + break; + case BTN_LIGHT: + state->continuing = !state->continuing; + display_continue(state); + break; + } + return true; #if USE_DAILY_STREAK case SCREEN_WAIT: display_title(state); @@ -514,7 +540,7 @@ void wordle_face_activate(movement_settings_t *settings, void *context) { if (state->curr_day != now) state->playing = false; #endif state->using_random_guess = false; - if (state->playing && state->curr_screen >= SCREEN_WIN) { + if (state->playing && state->curr_screen >= SCREEN_RESULT) { reset_incorrect_elements(state); state->position = get_first_pos(state->word_elements_result); } @@ -550,7 +576,7 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi } break; case EVENT_LIGHT_BUTTON_UP: - if (act_on_btn(state)) break; + if (act_on_btn(state, BTN_LIGHT)) break; get_next_letter(state->position, state->word_elements); display_letter(state, true); break; @@ -560,7 +586,7 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi display_letter(state, true); break; case EVENT_ALARM_BUTTON_UP: - if (act_on_btn(state)) break; + if (act_on_btn(state, BTN_ALARM)) break; display_letter(state, true); if (state->word_elements[state->position] == _num_valid_letters) break; state->playing = true; @@ -586,7 +612,7 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi case EVENT_ACTIVATE: break; case EVENT_TIMEOUT: - if (state->curr_screen >= SCREEN_WIN) + if (state->curr_screen >= SCREEN_RESULT) display_title(state); break; case EVENT_LOW_ENERGY_UPDATE: diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 8ad9155c..fe924926 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -89,12 +89,13 @@ typedef enum { SCREEN_PLAYING = 0, SCREEN_TITLE, SCREEN_STREAK, + SCREEN_CONTINUE, #if USE_DAILY_STREAK SCREEN_WAIT, #endif + SCREEN_RESULT, SCREEN_WIN, SCREEN_LOSE, - SCREEN_RESULT, SCREEN_NO_DICT, SCREEN_ALREADY_GUESSED, SCREEN_COUNT @@ -108,8 +109,9 @@ typedef struct { uint8_t attempt : 4; uint8_t position : 3; bool playing : 1; - uint16_t curr_answer : 15; + uint16_t curr_answer : 14; bool using_random_guess : 1; + bool continuing : 1; uint8_t streak; WordleScreen curr_screen; #if USE_DAILY_STREAK From ce31db3712faf22957cabf26d5c4a4217cd8056b Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 18 Aug 2024 22:30:41 -0400 Subject: [PATCH 24/53] Continue test now blinks --- movement/watch_faces/complication/wordle_face.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 36382552..1a3c2f80 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -307,11 +307,17 @@ static void display_title(wordle_state_t *state) { watch_display_string("WO WordLE", 0); } +static void display_continue_result(bool continuing, uint8_t subsecond) { + char buf[2]; + char result = subsecond % 2 ? ' ' : (continuing ? 'y' : 'n'); + sprintf(buf,"%c", result); + watch_display_string(buf, 9); +} + static void display_continue(wordle_state_t *state) { - char buf[7]; state->curr_screen = SCREEN_CONTINUE; - sprintf(buf, "Cont %c", state->continuing ? 'y' : 'n'); - watch_display_string(buf, 4); + watch_display_string("Cont ", 4); + display_continue_result(state->continuing, 0); } static void display_streak(wordle_state_t *state) { @@ -446,7 +452,7 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { break; case BTN_LIGHT: state->continuing = !state->continuing; - display_continue(state); + display_continue_result(state->continuing, 0); break; } return true; @@ -571,6 +577,9 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi case SCREEN_WIN: display_win(state, event.subsecond); break; + case SCREEN_CONTINUE: + display_continue_result(state->continuing, event.subsecond); + break; default: break; } From cb57ef237d9b9518b3b9d804affe9b52f7cf9226 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 18 Aug 2024 22:33:03 -0400 Subject: [PATCH 25/53] Got rid of continue's blinking --- movement/watch_faces/complication/wordle_face.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 1a3c2f80..f2327865 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -307,17 +307,14 @@ static void display_title(wordle_state_t *state) { watch_display_string("WO WordLE", 0); } -static void display_continue_result(bool continuing, uint8_t subsecond) { - char buf[2]; - char result = subsecond % 2 ? ' ' : (continuing ? 'y' : 'n'); - sprintf(buf,"%c", result); - watch_display_string(buf, 9); +static void display_continue_result(bool continuing) { + watch_display_string(continuing ? "y" : "n", 9); } static void display_continue(wordle_state_t *state) { state->curr_screen = SCREEN_CONTINUE; watch_display_string("Cont ", 4); - display_continue_result(state->continuing, 0); + display_continue_result(state->continuing); } static void display_streak(wordle_state_t *state) { @@ -452,7 +449,7 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { break; case BTN_LIGHT: state->continuing = !state->continuing; - display_continue_result(state->continuing, 0); + display_continue_result(state->continuing); break; } return true; @@ -577,9 +574,6 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi case SCREEN_WIN: display_win(state, event.subsecond); break; - case SCREEN_CONTINUE: - display_continue_result(state->continuing, event.subsecond); - break; default: break; } From 7ceb68267538e0565fc8b73e010e8d201caa5b2f Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 18 Aug 2024 22:52:10 -0400 Subject: [PATCH 26/53] Better handling of seeing if currently playing --- .../watch_faces/complication/wordle_face.c | 49 ++++++++++++------- .../watch_faces/complication/wordle_face.h | 3 +- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index f2327865..bd82fbad 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -273,6 +273,18 @@ static void display_playing(wordle_state_t *state) { state->curr_screen = SCREEN_PLAYING; } +static void reset_all_elements(wordle_state_t *state) { + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + state->word_elements[i] = _num_valid_letters; + state->word_elements_result[i] = WORDLE_LETTER_WRONG; + } + for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) { + state->guessed_words[i] = _num_words + _num_expanded_words; + } + state->using_random_guess = false; + state->attempt = 0; +} + static void reset_incorrect_elements(wordle_state_t *state) { for (size_t i = 0; i < WORDLE_LENGTH; i++) { if (state->word_elements_result[i] != WORDLE_LETTER_CORRECT) @@ -281,22 +293,12 @@ static void reset_incorrect_elements(wordle_state_t *state) { } static void reset_board(wordle_state_t *state) { - for (size_t i = 0; i < WORDLE_LENGTH; i++) { - state->word_elements[i] = _num_valid_letters; - state->word_elements_result[i] = WORDLE_LETTER_WRONG; - } - for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) { - state->guessed_words[i] = _num_words + _num_expanded_words; - } + reset_all_elements(state); state->curr_answer = get_random(_num_words); - state->using_random_guess = false; - state->attempt = 0; watch_clear_colon(); - watch_display_string(" ", 4); - reset_incorrect_elements(state); state->position = get_first_pos(state->word_elements_result); display_playing(state); - watch_display_string("-", 5); + watch_display_string(" -", 4); #if __EMSCRIPTEN__ printf("ANSWER: %s\r\n", _legal_words[state->curr_answer]); #endif @@ -371,10 +373,19 @@ static void display_lose(wordle_state_t *state, uint8_t subsecond) { static void display_win(wordle_state_t *state, uint8_t subsecond) { (void) state; char buf[13]; - sprintf(buf," W %s ", subsecond % 2 ? "JOb " : "NICE"); + sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOB "); watch_display_string(buf, 0); } +static bool is_playing(const wordle_state_t *state) { + if (state->attempt > 0) return true; + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements[i] != _num_valid_letters) + return true; + } + return false; +} + static void display_result(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 1]; for (size_t i = 0; i < WORDLE_LENGTH; i++) @@ -413,7 +424,7 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { display_wait(state); } #else - if (state->playing) { + if (is_playing(state)) { state->continuing = true; display_continue(state); } @@ -483,7 +494,7 @@ static void get_result(wordle_state_t *state) { state->guessed_words[state->attempt] = in_dict; bool exact_match = check_word(state); if (exact_match) { - state->playing = false; + state->attempt = 0; state->curr_screen = SCREEN_WIN; if (state->streak < 0x7F) state->streak++; @@ -493,7 +504,7 @@ static void get_result(wordle_state_t *state) { return; } if (++state->attempt >= WORDLE_MAX_ATTEMPTS) { - state->playing = false; + state->attempt = 0; state->curr_screen = SCREEN_LOSE; state->streak = 0; return; @@ -530,6 +541,7 @@ void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, memset(*context_ptr, 0, sizeof(wordle_state_t)); wordle_state_t *state = (wordle_state_t *)*context_ptr; state->curr_screen = SCREEN_TITLE; + reset_all_elements(state); } // Do any pin or peripheral setup here; this will be called whenever the watch wakes from deep sleep. } @@ -540,10 +552,10 @@ void wordle_face_activate(movement_settings_t *settings, void *context) { #if USE_DAILY_STREAK uint32_t now = get_day_unix_time() ; if (state->prev_day <= (now + (60 *60 * 24))) state->streak = 0; - if (state->curr_day != now) state->playing = false; + if (state->curr_day != now) state->attempt = 0; #endif state->using_random_guess = false; - if (state->playing && state->curr_screen >= SCREEN_RESULT) { + if (is_playing(state) && state->curr_screen >= SCREEN_RESULT) { reset_incorrect_elements(state); state->position = get_first_pos(state->word_elements_result); } @@ -592,7 +604,6 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi if (act_on_btn(state, BTN_ALARM)) break; display_letter(state, true); if (state->word_elements[state->position] == _num_valid_letters) break; - state->playing = true; #if (USE_RANDOM_GUESS != 0) if (watch_get_pin_level(BTN_LIGHT) && (state->using_random_guess || (state->attempt == 0 && state->position == 0))) { diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index fe924926..00c97b39 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -108,9 +108,8 @@ typedef struct { uint16_t guessed_words[WORDLE_MAX_ATTEMPTS]; uint8_t attempt : 4; uint8_t position : 3; - bool playing : 1; - uint16_t curr_answer : 14; bool using_random_guess : 1; + uint16_t curr_answer : 15; bool continuing : 1; uint8_t streak; WordleScreen curr_screen; From a0ffd0ca7f78a628439738d63cbdd67d04bea121 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 18 Aug 2024 23:10:17 -0400 Subject: [PATCH 27/53] Fix on playing with daily streak --- movement/watch_faces/complication/wordle_face.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index bd82fbad..59edb9d3 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -309,6 +309,7 @@ static void display_title(wordle_state_t *state) { watch_display_string("WO WordLE", 0); } +#if !USE_DAILY_STREAK static void display_continue_result(bool continuing) { watch_display_string(continuing ? "y" : "n", 9); } @@ -318,6 +319,7 @@ static void display_continue(wordle_state_t *state) { watch_display_string("Cont ", 4); display_continue_result(state->continuing); } +#endif static void display_streak(wordle_state_t *state) { char buf[12]; @@ -423,6 +425,10 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { if (state->prev_day == get_day_unix_time()) { display_wait(state); } + else if (is_playing(state)) + display_playing(state); + else + display_streak(state); #else if (is_playing(state)) { state->continuing = true; @@ -447,6 +453,12 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { state->position = get_first_pos(state->word_elements_result); display_playing(state); return true; +#if USE_DAILY_STREAK + case SCREEN_WAIT: + (void) pin; + display_title(state); + return true; +#else case SCREEN_CONTINUE: switch (pin) { @@ -464,10 +476,6 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { break; } return true; -#if USE_DAILY_STREAK - case SCREEN_WAIT: - display_title(state); - return true; #endif default: return false; From af6f6002ba2f490bc061f8d4b15d9ec5015f23e6 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 18 Aug 2024 23:55:54 -0400 Subject: [PATCH 28/53] Fixed the bug of the text not resetting after a timeout --- movement/watch_faces/complication/wordle_face.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 59edb9d3..90cec69e 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -634,8 +634,11 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi case EVENT_ACTIVATE: break; case EVENT_TIMEOUT: - if (state->curr_screen >= SCREEN_RESULT) + if (state->curr_screen >= SCREEN_RESULT) { + reset_incorrect_elements(state); + state->position = get_first_pos(state->word_elements_result); display_title(state); + } break; case EVENT_LOW_ENERGY_UPDATE: if (state->curr_screen != SCREEN_TITLE) From 0d58f0d77dd79596201b647be87654ebbbf3ce9d Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 18 Aug 2024 23:58:39 -0400 Subject: [PATCH 29/53] JOB to JOb --- movement/watch_faces/complication/wordle_face.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 90cec69e..f5b69a6d 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -375,7 +375,7 @@ static void display_lose(wordle_state_t *state, uint8_t subsecond) { static void display_win(wordle_state_t *state, uint8_t subsecond) { (void) state; char buf[13]; - sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOB "); + sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOb "); watch_display_string(buf, 0); } From 1a1560b59d614db26847ce464b113276946d1e76 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Mon, 19 Aug 2024 00:13:18 -0400 Subject: [PATCH 30/53] Bugfix on elements not resetting when winning or losing --- movement/watch_faces/complication/wordle_face.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index f5b69a6d..35953bb5 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -502,7 +502,7 @@ static void get_result(wordle_state_t *state) { state->guessed_words[state->attempt] = in_dict; bool exact_match = check_word(state); if (exact_match) { - state->attempt = 0; + reset_all_elements(state); state->curr_screen = SCREEN_WIN; if (state->streak < 0x7F) state->streak++; @@ -512,7 +512,7 @@ static void get_result(wordle_state_t *state) { return; } if (++state->attempt >= WORDLE_MAX_ATTEMPTS) { - state->attempt = 0; + reset_all_elements(state); state->curr_screen = SCREEN_LOSE; state->streak = 0; return; @@ -560,7 +560,7 @@ void wordle_face_activate(movement_settings_t *settings, void *context) { #if USE_DAILY_STREAK uint32_t now = get_day_unix_time() ; if (state->prev_day <= (now + (60 *60 * 24))) state->streak = 0; - if (state->curr_day != now) state->attempt = 0; + if (state->curr_day != now) reset_all_elements(state); #endif state->using_random_guess = false; if (is_playing(state) && state->curr_screen >= SCREEN_RESULT) { From 7f38f8e4169194ac3241eadbc30f2da902b31d7c Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Fri, 23 Aug 2024 16:39:53 -0400 Subject: [PATCH 31/53] modified Wordle list to use Wordle's own list and add 2 more letters --- .../watch_faces/complication/wordle_face.c | 336 ++- .../watch_faces/complication/wordle_face.h | 7 - utils/wordle_face/wordle_list.py | 2174 +++++++++-------- 3 files changed, 1406 insertions(+), 1111 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 35953bb5..f27ae4a0 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -30,114 +30,220 @@ #endif -static const char _valid_letters[] = {'A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R', 'S'}; +static const char _valid_letters[] = {'A', 'C', 'E', 'G', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'S'}; -// From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff -// Number of words found: 284 -static const char _legal_words[][WORDLE_LENGTH + 1] = { - "ROPES", "RESIN", "PACES", "RIPEN", "ALIEN", "SPINE", "ROSIN", "PIERS", "CAPER", - "SNORE", "SANER", "RAILS", "SCORN", "PENIS", "NEARS", "ENROL", "PROSE", "CANES", - "POSER", "ACORN", "PAILS", "SLAIN", "REALS", "CLAPS", "PLIES", "PALES", "LIENS", - "PLAIN", "SLOPE", "REAPS", "CRAPE", "ASPEN", "COINS", "ARISE", "ALOES", "PANES", - "SCION", "SNARL", "COPRA", "PALER", "CLIPS", "PANIC", "PARSE", "PENAL", "SPARE", - "LIONS", "LINES", "SNARE", "PEONS", "CLEAN", "SPACE", "SCALE", "COILS", "SCRAP", - "OPINE", "NICER", "LOANS", "RACES", "RELIC", "NOISE", "PIANO", "CRANE", "SNAIL", - "SCORE", "CLEAR", "CROPS", "CORES", "COPSE", "PINES", "PANEL", "RINSE", "LOINS", - "PRONE", "ALONE", "RAISE", "OSIER", "LEARN", "SPICE", "SPOIL", "EARLS", "NAILS", - "PLANE", "CARES", "CRIES", "CORNS", "CORPS", "CLASP", "LACES", "ARSON", "LANES", - "OPENS", "SALON", "SINCE", "PLANS", "SCARE", "SPORE", "OCEAN", "AEONS", "PRICE", - "IRONS", "SCALP", "EPICS", "LIARS", "SPIRE", "LINER", "PILES", "SLICE", "LEANS", - "RAINS", "PLEAS", "SOLAR", "CAPES", "APRON", "RISEN", "POISE", "CONES", "PEARS", - "PERIL", "COALS", "OPALS", "ROLES", "CLOSE", "CAPON", "POLES", "EARNS", "CRISP", - "AROSE", "SCOPE", "AISLE", "CLANS", "CORAL", "SCRIP", "PAINS", "OPERA", "PAIRS", - "PEARL", "SIREN", "ACRES", "CAROL", "LAIRS", "PORES", "PRIES", "CRONE", "CANOE", - "LAPSE", "LEAPS", "SNIPE", "REINS", "PEALS", "SPEAR", "LOSER", "POLAR", "LANCE", - "CAIRN", "PLACE", "LASER", "SONIC", "EERIE", "PIECE", "ISLES", "NOOSE", "SNEER", - "SOLOS", "ELOPE", "INNER", "SLOOP", "SOARS", "SPREE", "SPANS", "PAPAL", "RIPER", - "COLON", "SCANS", "RARES", "PILLS", "CANON", "POLLS", "POPPA", "ERROR", "REARS", - "PESOS", "CRESS", "PENCE", "SPOOL", "COLOR", "NONCE", "CLASS", "SELLS", "NASAL", - "ERASE", "RILLS", "LAPEL", "COOLS", "EASEL", "COLIC", "SPELL", "SPOOR", "LASSO", - "APPAL", "PEACE", "SALSA", "SCENE", "NIECE", "CONIC", "APPLE", "SNAPS", "PEERS", - "ROARS", "SPARS", "SAILS", "SLOPS", "APACE", "POSES", "SENSE", "PEEPS", "CASES", - "CANAL", "CIRCA", "SLAPS", "SCOOP", "ROLLS", "PIPES", "SCARS", "LOOSE", "ROSES", - "LILAC", "OASES", "SOLES", "PAEAN", "PAPAS", "CRASS", "PROPS", "SEALS", "CACAO", - "LINEN", "SORES", "EASES", "POPES", "OASIS", "LOSES", "NOSES", "SIRES", "SPILL", - "CREPE", "ALIAS", "CROSS", "ARENA", "SPINS", "REPEL", "SPIES", "PRIOR", "POOLS", - "PRESS", "RISER", "AREAS", "SPOON", "SALES", "CREEP", "CEASE", "LOOPS", "ASSES", - "CALLS", "CRIER", "COCOA", "SEERS", "LOONS", "SLIPS", "PAPER", "REELS", "RISES", - "POSSE", "RARER", "SOILS", "PIPER", "INANE", "LOCAL", "PEASE", "ONION", "SLEEP", - "LEASE", "RACER", "LEPER", "SILLS", "CELLS", -#if (USE_EXPANDED_DICT != 1) +// From: https://matthewminer.name/projects/calculators/wordle-words-left/ +// Number of words found: 298 +static const char _valid_words[][WORDLE_LENGTH + 1] = { + "PLACE", "SHONE", "POSER", "CHAIN", "CAPER", "POLAR", "LEARN", "SHORN", "PORCH", + "GRAPE", "GNASH", "CHAIR", "SCORE", "CIGAR", "GRASP", "SINCE", "SPIRE", "NEIGH", + "SHORE", "CHASE", "RAISE", "CAIRN", "PLIER", "LOSER", "GRACE", "LEASH", "PENAL", + "SLING", "RISEN", "LOGIC", "PRICE", "POISE", "SCALE", "SINGE", "SNARL", "LINER", + "ANGEL", "SNAIL", "PALER", "SCION", "ALONE", "AGILE", "APRON", "PERIL", "GRIPE", + "SPICE", "LOGIN", "REGAL", "CAROL", "SLICE", "CRONE", "LEACH", "COPSE", "SHEAR", + "ALIGN", "LARGE", "LAPSE", "AISLE", "NICER", "OCEAN", "OPERA", "ALIEN", "ACORN", + "ASHEN", "SHINE", "PANEL", "SPORE", "SCOPE", "SPACE", "PHASE", "AROSE", "CHOIR", + "SNIPE", "CHAOS", "RALPH", "EPOCH", "GRAIN", "SANER", "GROIN", "SLANG", "SLAIN", + "CRASH", "CLASP", "SHIRE", "SCONE", "ALONG", "APING", "NICHE", "CHEAP", "CHIRP", + "LAGER", "CHORE", "SNORE", "SHAPE", "RESIN", "PERCH", "PECAN", "GLARE", "GROAN", + "RHINO", "RENAL", "SALON", "GRAIL", "SEPIA", "LANCE", "PRONG", "RECAP", "CLONE", + "CLASH", "HORSE", "SOLAR", "HERON", "PEACH", "ARSON", "HINGE", "CLEAN", "CLING", + "PHONE", "CRANE", "CLANG", "SCORN", "SPEAR", "PLAIN", "PROSE", "SPOIL", "GONER", + "SHOAL", "REIGN", "CLEAR", "ANGER", "CHINA", "GRAPH", "PEARL", "CARGO", "CHOSE", + "SCALP", "CANOE", "RINSE", "RANGE", "LINGO", "RANCH", "PLANE", "SPINE", "REACH", + "CRISP", "PARSE", "RIPEN", "SNARE", "CLOSE", "SHARE", "CORAL", "NOISE", "SHARP", + "SPARE", "SONIC", "SCRAP", "SPIEL", "RELIC", "OPINE", "SCARE", "SPRIG", "SHALE", + "PANIC", "SONAR", "GROPE", "SLOPE", "ANGLE", "ORGAN", "PIANO", "PINCH", "GLEAN", + "PRONE", "ARISE", "ROACH", "SIREN", "CLASS", "POSSE", "INANE", "HENCE", "SNEER", + "PAGAN", "PREEN", "ROGER", "SPELL", "SHEEP", "SENSE", "INNER", "ALPHA", "SHEEN", + "SCREE", "CIRCA", "PRIOR", "RARER", "PEACE", "GENRE", "HELLO", "CACAO", "GORGE", + "GLOSS", "CRIER", "CROSS", "CREPE", "COLON", "CHILL", "ONION", "LINEN", "PIPER", + "SLOOP", "LEGAL", "SNOOP", "PAPER", "ALGAE", "LAPEL", "CHEER", "HIPPO", "PIECE", + "LILAC", "HONOR", "PAPAL", "ARENA", "APNEA", "RIPER", "SCENE", "SHALL", "NASAL", + "SPREE", "RIGOR", "EAGER", "LIEGE", "LEPER", "LEASE", "CORER", "SPOON", "GROSS", + "COACH", "CEASE", "GENIE", "HARSH", "PENCE", "CHILI", "SHELL", "CREEP", "RISER", + "ERASE", "CINCH", "SIEGE", "GOING", "SCOOP", "SPILL", "NOOSE", "EAGLE", "AGING", + "NIECE", "SPOOL", "APPLE", "SALSA", "LEECH", "GREEN", "IONIC", "LASSO", "CONCH", + "PENNE", "SLASH", "CANAL", "CRASS", "REPEL", "COCOA", "CRESS", "AGAPE", "EASEL", + "CELLO", "CONIC", "IGLOO", "RACER", "GOOSE", "ICING", "POOCH", "ILIAC", "GRASS", + "SHEER", "CANON", "ELOPE", "LOCAL", "EERIE", "COLOR", "AGREE", "PRESS", "GEESE", + "SLOSH", "SLEEP", "GRILL", "AGAIN", "GLASS", "PARER", "CHESS", "CACHE", "ERROR", + "LOOSE", }; + // These are words that'll never be used, but still need to be in the dictionary for guesses. -// Top 100K most common words from Wiktionary https://gist.github.com/h3xx/1976236 -// Number of words found: 470 -static const char _expanded_words[][WORDLE_LENGTH + 1] = { -#endif -#if (USE_EXPANDED_DICT != 0) - "PARIS", "APRIL", "SPAIN", "EINEN", "ASCII", "EINER", "SEINE", "AINSI", "ALICE", - "ALLES", "ALORS", "EINES", "ALLER", "PEINE", "PARCE", "CELLE", "CLARA", "ELLES", - "ELLEN", "OLISI", "ALLEN", "ISAAC", "APRES", "CROIS", "SANOI", "PASSE", "ELSIE", - "REINE", "ELLER", "AARON", "CLARE", "IRENE", "ANNIE", "ELLOS", "PARLE", "ALLAN", - "PELLE", "CAIRO", "SENOR", "PENSE", "CECIL", "SEELE", "ORION", "SELON", "COSAS", - "PASSA", "ELLIS", "CARLO", "ENNEN", "SILAS", "EENEN", "OSCAR", "ONCLE", "CESSE", - "SONNE", "ASSIS", "PRISE", "SERAI", "CELIA", "NOIRE", "NORSE", "SINNE", "LIESS", - "ELIAS", "REPOS", "COLIN", "NOIRS", "CLAIR", "CIELO", "PARLA", "SOINS", "LASSE", - "NELLA", "PAOLO", "SOLON", "REPAS", "NANCE", "PAINE", "SAISI", "ELISE", "CESAR", - "CANNA", "SALLE", "SINON", "SINAI", "LOIRE", "PENSA", "LEILA", "REISE", "ELLAS", - "POORE", "EARLE", "CERCA", "LEISE", "POOLE", "AILES", "SANOA", "LEONE", "LILLE", - "PROIE", "CARNE", "SPIEL", "CERES", "ENSIN", "CINCO", "ROLLO", "ARRAS", "SEIEN", - "PRIER", "ANNAN", "CALLE", "LIISA", "SALIR", "LESSE", "LESEN", "LIIAN", "NEERE", - "ARIEL", "PIENI", "PIERO", "ERANO", "ELENA", "SILLE", "NEALE", "SEENE", "ROLLE", - "NELLE", "SOLLE", "ESSER", "PASAR", "PREIS", "ASIAN", "SENCE", "ANSON", "SERRA", - "CONAN", "SERAS", "SIENA", "SOPRA", "RENEE", "ALINE", "CORSE", "ASSAI", "INSEL", - "ROSIE", "SONIA", "APPEL", "CRISE", "CIRCE", "LINIE", "RENAN", "CAIRE", "COLLA", - "SANOO", "EENER", "ANCOR", "NEPAL", "REINO", "LAINE", "SOONE", "ALAIN", "LAPSI", - "INCAS", "INNES", "CARON", "ROSEN", "CASAS", "NOLAN", "SERRE", "PESAR", "SEARS", - "LEPIC", "LISLE", "LOSSE", "CINNA", "SERIE", "RIRES", "CORSO", "SOIRS", "CREER", - "POCOS", "SIENS", "ARLES", "CROCE", "IONIC", "PONER", "ESSEN", "SANON", "CESSA", - "SERIA", "ALPES", "NINON", "LILLA", "AINOA", "CORPO", "LESER", "ILLIS", "ROPER", - "ANNEE", "PAIRE", "PEPIN", "ORIEL", "CANNE", "AIRES", "ARCIS", "EASIE", "ANNOS", - "COLLE", "SELLE", "EILEN", "CAPRI", "ERICA", "ROCCO", "ARIAN", "CLEON", "ALLIE", - "PONCE", "COPIE", "INNAN", "NOCES", "NAPPE", "CORNE", "ESIIN", "ENCOR", "LORNA", - "SACRE", "PAPEL", "SAILE", "SAEPE", "CREON", "LLENO", "ELISA", "PASSO", "ASILE", - "LORCS", "ASIAA", "SANIN", "ONNEN", "SONNA", "AILIE", "ALIIS", "ECOLE", "CREES", - "PRESO", "CLARO", "EARES", "ROSSI", "COREA", "SANAN", "AESOP", "SAPOR", "EISEN", - "ACASO", "PARAS", "NANON", "LAPIS", "ARRAN", "CLLIA", "SACRA", "PRINS", "CENCI", - "CLAES", "SLAAP", "ROLLA", "COLES", "LORNE", "OLELO", "CASSE", "NILES", "PASOS", - "ESSAI", "ROSAS", "LLENA", "LEERE", "CLASE", "CALOR", "ROSSE", "ALLEE", "SOREL", - "SANAA", "SLONE", "OLSEN", "OOREN", "PARER", "PASSI", "POSSA", "PLAIE", "OPERE", - "SCAPE", "POLEN", "RIPON", "SCALA", "AILLE", "PALOS", "CLAPP", "ESCAP", "ELLEI", - "IONIA", "NICOL", "PAESE", "PERON", "ORSON", "INNEN", "AISNE", "RANCE", "SLAAN", - "PAOLI", "COLLO", "ANNAS", "ERROL", "CLERC", "SAINE", "RAINA", "PRESE", "PARIA", - "PERLE", "RECAL", "SINAE", "PESER", "OISIN", "PLENA", "CARLE", "PERES", "SACAR", - "ALPEN", "CORRE", "ACCES", "RILLA", "ANNAL", "PERSE", "SAALE", "PERRO", "AILSA", - "POCAS", "SOLEN", "PLASE", "SOLIS", "PAPPI", "COPIA", "ARIES", "ROCCA", "ALIOS", - "ROCAS", "PELOS", "NEPOS", "COLPA", "ISORA", "LECON", "SOANE", "SNELL", "ILLOS", - "PILAR", "ECLAC", "PRESA", "SILLA", "NIELS", "LIPPO", "CROLL", "PONEN", "POSEE", - "PIPPA", "ILLAN", "CENIS", "SANNA", "RASSI", "CERRO", "SCENA", "CASOS", "COLPO", - "POSSO", "POSEN", "EINAR", "ISLAS", "IPSIS", "SALEN", "ASIEN", "CREAN", "LENIN", - "LOCIS", "NENNE", "ILION", "NARES", "ONNEA", "PALAA", "PIPPO", "POLIS", "RICOS", - "ELSON", "SNOOP", "ANNIS", "PROPE", "ELLIE", "ERNIE", "PLIER", "SERES", "REINA", - "LIPPE", "OLINE", "PARIE", "ARLEE", "NIAIS", "LEONI", "RAINE", "LARES", "SEINS", - "CARRE", "POILS", "ALENE", "LINEA", "NEARE", "PENSO", "PRISA", "CAPEL", "PAREA", - "PEECE", "SALIO", "COELO", "SCIRE", "NELLO", "LIENE", "ORICE", "EPAIS", "PERCE", - "ALLIS", "PEPLE", "LARNE", "NEILL", "OLLEN", "CASCA", "LAPIN", "OLLIE", "SALIC", - "LIANE", "REESE", "ELSLI", "SPION", "RIENS", "LILAS", "PAPPA", "ERRER", "SPISE", - "CELIE", "OLSON", "IRREN", "ARIAS", "ARION", "PASEO", "CAERE", "PISAN", "CARRO", - "PAROI", "NOONE", "SEPPI", "OPPIA", "SEALE", "LIPPI", "PELAS", "COCOS", "PLACA", - "CONOR", "LANCA", "OSASI", "ALOIS", "NAIRN", "PIENO", "SPASS", "SAONE", "ALNAR", - "CARIA", "PIENA", -#endif +static const char _possible_words[][WORDLE_LENGTH + 1] = { + "AALII", "AARGH", "ACAIS", "ACARI", "ACCAS", "ACERS", "ACHAR", "ACHES", "ACHOO", + "ACING", "ACINI", "ACNES", "ACRES", "ACROS", "AECIA", "AEGIS", "AEONS", "AERIE", + "AEROS", "AESIR", "AGARS", "AGENE", "AGERS", "AGGER", "AGGIE", "AGGRI", "AGGRO", + "AGHAS", "AGILA", "AGIOS", "AGLEE", "AGLOO", "AGOGE", "AGONE", "AGONS", "AGORA", + "AGRIA", "AGRIN", "AGROS", "AHEAP", "AHIGH", "AHING", "AIGAS", "AINEE", "AINGA", + "AIOLI", "AIRER", "AIRNS", "ALAAP", "ALANE", "ALANG", "ALANS", "ALAPA", "ALAPS", + "ALCOS", "ALECS", "ALEPH", "ALGAL", "ALGAS", "ALGIN", "ALGOR", "ALIAS", "ALINE", + "ALLEE", "ALLEL", "ALLIS", "ALOES", "ALOHA", "ALOIN", "ALOOS", "ANANA", "ANCHO", + "ANCLE", "ANCON", "ANEAR", "ANELE", "ANGAS", "ANGLO", "ANIGH", "ANILE", "ANILS", + "ANION", "ANISE", "ANLAS", "ANNAL", "ANNAS", "ANOAS", "ANOLE", "ANSAE", "APACE", + "APAGE", "APERS", "APGAR", "APHIS", "APIAN", "APIOL", "APISH", "APOOP", "APPAL", + "APPEL", "APPRO", "APRES", "APSES", "APSIS", "APSOS", "ARARS", "ARCHI", "ARCOS", + "AREAE", "AREAL", "AREAR", "AREAS", "ARECA", "AREIC", "ARENE", "AREPA", "ARERE", + "ARGAL", "ARGAN", "ARGIL", "ARGLE", "ARGOL", "ARGON", "ARIAS", "ARIEL", "ARILS", + "ARISH", "ARLES", "ARNAS", "AROHA", "ARPAS", "ARPEN", "ARRAH", "ARRAS", "ARRIS", + "ARSES", "ARSIS", "ASANA", "ASCON", "ASHES", "ASPEN", "ASPER", "ASPIC", "ASPIE", + "ASPIS", "ASPRO", "ASSAI", "ASSES", "CACAS", "CAECA", "CAESE", "CAGER", "CAGES", + "CAINS", "CALLA", "CALLS", "CALOS", "CALPA", "CALPS", "CANEH", "CANER", "CANES", + "CANGS", "CANNA", "CANNS", "CANSO", "CAPAS", "CAPES", "CAPHS", "CAPLE", "CAPON", + "CAPOS", "CAPRI", "CARAP", "CARER", "CARES", "CARLE", "CARLS", "CARNS", "CARON", + "CARPI", "CARPS", "CARRS", "CARSE", "CASAS", "CASCO", "CASES", "CECAL", "CEILI", + "CEILS", "CELLA", "CELLI", "CELLS", "CENSE", "CEORL", "CEPES", "CERCI", "CERES", + "CERGE", "CERIA", "CERIC", "CERNE", "CEROC", "CEROS", "CESSE", "CHACE", "CHACO", + "CHAIS", "CHALS", "CHANA", "CHANG", "CHAPE", "CHAPS", "CHARA", "CHARE", "CHARR", + "CHARS", "CHEEP", "CHELA", "CHELP", "CHERE", "CHIAO", "CHIAS", "CHICA", "CHICH", + "CHICO", "CHICS", "CHIEL", "CHILE", "CHINE", "CHING", "CHINO", "CHINS", "CHIPS", + "CHIRL", "CHIRO", "CHIRR", "CHOCO", "CHOCS", "CHOGS", "CHOIL", "CHOLA", "CHOLI", + "CHOLO", "CHONS", "CHOON", "CHOPS", "CIELS", "CILIA", "CILLS", "CINES", "CIONS", + "CIPPI", "CIRCS", "CIRES", "CIRLS", "CIRRI", "CISCO", "CLACH", "CLAES", "CLAGS", + "CLANS", "CLAPS", "CLARO", "CLEEP", "CLEGS", "CLEPE", "CLIES", "CLINE", "CLIPE", + "CLIPS", "CLOGS", "CLONS", "CLOOP", "CLOPS", "COALA", "COALS", "COCAS", "COCCI", + "COCCO", "COCOS", "COGIE", "COGON", "COHEN", "COHOE", "COHOG", "COHOS", "COIGN", + "COILS", "COINS", "COIRS", "COLAS", "COLES", "COLIC", "COLIN", "COLLS", "COLOG", + "CONES", "CONGA", "CONGE", "CONGO", "CONIA", "CONIN", "CONNE", "CONNS", "COOCH", + "COOEE", "COOER", "COOLS", "COONS", "COOPS", "COPAL", "COPEN", "COPER", "COPES", + "COPRA", "CORES", "CORGI", "CORIA", "CORNI", "CORNO", "CORNS", "CORPS", "CORSE", + "CORSO", "COSEC", "COSES", "COSIE", "CRAAL", "CRAGS", "CRAIC", "CRAIG", "CRANS", + "CRAPE", "CRAPS", "CRARE", "CREEL", "CREES", "CRENA", "CREPS", "CRIAS", "CRIES", + "CRINE", "CRIOS", "CRIPE", "CRIPS", "CRISE", "CROCI", "CROCS", "CROGS", "CRONS", + "CROOL", "CROON", "CROPS", "CRORE", "EAGRE", "EALES", "EARLS", "EARNS", "EASER", + "EASES", "EASLE", "ECHES", "ECHOS", "EGERS", "EGGAR", "EGGER", "EHING", "EIGNE", + "EISEL", "ELAIN", "ELANS", "ELCHI", "ELOGE", "ELOIN", "ELOPS", "ELPEE", "ELSIN", + "ENIAC", "ENNOG", "ENOLS", "ENROL", "EORLS", "EOSIN", "EPEES", "EPHAH", "EPHAS", + "EPHOR", "EPICS", "EPRIS", "ERGON", "ERGOS", "ERICA", "ERICS", "ERING", "ERNES", + "EROSE", "ERSES", "ESCAR", "ESILE", "ESNES", "ESSES", "GAGER", "GAGES", "GAINS", + "GAIRS", "GALAH", "GALAS", "GALEA", "GALES", "GALLS", "GALOP", "GANCH", "GANGS", + "GAOLS", "GAPER", "GAPES", "GAPOS", "GARES", "GARIS", "GARNI", "GARRE", "GASES", + "GASPS", "GEALS", "GEANS", "GEARE", "GEARS", "GEEPS", "GELEE", "GENAL", "GENAS", + "GENES", "GENIC", "GENII", "GENIP", "GENOA", "GENRO", "GERAH", "GERES", "GERLE", + "GERNE", "GESSE", "GESSO", "GHEES", "GIGAS", "GIGHE", "GILAS", "GILLS", "GINCH", + "GINGE", "GINGS", "GIPON", "GIPPO", "GIRLS", "GIRNS", "GIRON", "GIROS", "GIRRS", + "GIRSH", "GLACE", "GLAIR", "GLANS", "GLEES", "GLEIS", "GLENS", "GLIAL", "GLIAS", + "GLOGG", "GLOOP", "GLOPS", "GNARL", "GNARR", "GNARS", "GOALS", "GOELS", "GOERS", + "GOGGA", "GOGOS", "GOIER", "GOLES", "GOLPE", "GOLPS", "GONCH", "GONGS", "GONIA", + "GONNA", "GOOGS", "GOOLS", "GOONS", "GOOPS", "GOORS", "GORAL", "GORAS", "GORES", + "GORIS", "GORPS", "GORSE", "GOSSE", "GRAAL", "GRAIP", "GRANA", "GRANS", "GRECE", + "GREES", "GREGE", "GREGO", "GREIN", "GRENS", "GRESE", "GRICE", "GRIGS", "GRINS", + "GRIPS", "GRISE", "GROGS", "GRONE", "GRRLS", "GRRRL", "HAARS", "HAGGS", "HAHAS", + "HAILS", "HAINS", "HAIRS", "HALAL", "HALER", "HALES", "HALLO", "HALLS", "HALON", + "HALOS", "HALSE", "HANAP", "HANCE", "HANCH", "HANGI", "HANGS", "HANSA", "HANSE", + "HAOLE", "HAPPI", "HARES", "HARLS", "HARNS", "HAROS", "HARPS", "HASPS", "HEALS", + "HEAPS", "HEARE", "HEARS", "HEELS", "HEIGH", "HEILS", "HEIRS", "HELES", "HELIO", + "HELLS", "HELOS", "HELPS", "HENCH", "HENGE", "HENNA", "HEPAR", "HERES", "HERLS", + "HERNS", "HEROS", "HERSE", "HESPS", "HIGHS", "HILAR", "HILCH", "HILLO", "HILLS", + "HINGS", "HIOIS", "HIREE", "HIRER", "HIRES", "HOARS", "HOERS", "HOGAN", "HOGEN", + "HOGGS", "HOGHS", "HOING", "HOISE", "HOLES", "HOLLA", "HOLLO", "HOLON", "HOLOS", + "HONAN", "HONER", "HONES", "HONGI", "HONGS", "HOOCH", "HOONS", "HOOPS", "HOORS", + "HOOSH", "HOPER", "HOPES", "HORAH", "HORAL", "HORAS", "HORIS", "HORNS", "HOSEL", + "HOSEN", "HOSER", "HOSES", "ICERS", "ICHES", "ICHOR", "ICIER", "ICONS", "IGAPO", + "ILEAC", "ILEAL", "ILIAL", "ILLER", "INCEL", "INCLE", "INCOG", "INGAN", "INGLE", + "INION", "INSPO", "IPPON", "IRING", "IRONE", "IRONS", "ISHES", "ISLES", "ISNAE", + "ISSEI", "LAARI", "LACER", "LACES", "LAERS", "LAGAN", "LAHAL", "LAHAR", "LAICH", + "LAICS", "LAIGH", "LAIRS", "LALLS", "LANAI", "LANAS", "LANCH", "LANES", "LAPIN", + "LAPIS", "LARCH", "LAREE", "LARES", "LARGO", "LARIS", "LARNS", "LASER", "LASES", + "LASSI", "LEANS", "LEAPS", "LEARE", "LEARS", "LEEAR", "LEEPS", "LEERS", "LEESE", + "LEGER", "LEGES", "LEGGE", "LEGGO", "LEHRS", "LEIRS", "LEISH", "LENES", "LENGS", + "LENIS", "LENOS", "LENSE", "LEONE", "LEPRA", "LERES", "LERPS", "LESES", "LIANA", + "LIANE", "LIANG", "LIARS", "LICHI", "LIENS", "LIERS", "LIGAN", "LIGER", "LIGGE", + "LIGNE", "LILLS", "LILOS", "LINAC", "LINCH", "LINES", "LINGA", "LINGS", "LININ", + "LINNS", "LINOS", "LIONS", "LIPAS", "LIPES", "LIPIN", "LIPOS", "LIRAS", "LISLE", + "LISPS", "LLANO", "LOACH", "LOANS", "LOCHE", "LOCHS", "LOCIE", "LOCIS", "LOCOS", + "LOESS", "LOGAN", "LOGES", "LOGIA", "LOGIE", "LOGOI", "LOGON", "LOGOS", "LOHAN", + "LOINS", "LOIPE", "LOIRS", "LOLLS", "LOLOG", "LONER", "LONGA", "LONGE", "LONGS", + "LOOIE", "LOONS", "LOOPS", "LOPER", "LOPES", "LORAL", "LORAN", "LOREL", "LORES", + "LORIC", "LORIS", "LOSEL", "LOSEN", "LOSES", "NAANS", "NACHE", "NACHO", "NACRE", + "NAGAS", "NAGOR", "NAHAL", "NAILS", "NAIRA", "NALAS", "NALLA", "NANAS", "NANCE", + "NANNA", "NANOS", "NAPAS", "NAPES", "NAPOO", "NAPPA", "NAPPE", "NARAS", "NARCO", + "NARCS", "NARES", "NARIC", "NARIS", "NARRE", "NASHI", "NEALS", "NEAPS", "NEARS", + "NEELE", "NEEPS", "NEESE", "NEGRO", "NELIS", "NENES", "NEONS", "NEPER", "NERAL", + "NEROL", "NGAIO", "NGANA", "NICOL", "NIGER", "NIGHS", "NIHIL", "NILLS", "NINER", + "NINES", "NINON", "NIPAS", "NIRLS", "NISEI", "NISSE", "NOAHS", "NOELS", "NOGGS", + "NOILS", "NOIRS", "NOLES", "NOLLS", "NOLOS", "NONAS", "NONCE", "NONES", "NONGS", + "NONIS", "NOONS", "NOOPS", "NOPAL", "NORIA", "NORIS", "NOSER", "NOSES", "OASES", + "OASIS", "OCHER", "OCHES", "OCHRE", "OCREA", "OGEES", "OGGIN", "OGLER", "OGLES", + "OGRES", "OHIAS", "OHING", "OHONE", "OILER", "OLEIC", "OLEIN", "OLEOS", "OLIOS", + "OLLAS", "OLLER", "OLLIE", "OLPAE", "OLPES", "ONCER", "ONCES", "ONERS", "OORIE", + "OOSES", "OPAHS", "OPALS", "OPENS", "OPEPE", "OPING", "OPPOS", "OPSIN", "ORACH", + "ORALS", "ORANG", "ORCAS", "ORCIN", "ORGIA", "ORGIC", "ORIEL", "ORLES", "ORLON", + "ORLOP", "ORNIS", "ORPIN", "ORRIS", "OSCAR", "OSHAC", "OSIER", "OSSIA", "PAALS", + "PAANS", "PACAS", "PACER", "PACES", "PACHA", "PACOS", "PAEAN", "PAEON", "PAGER", + "PAGES", "PAGLE", "PAGRI", "PAILS", "PAINS", "PAIRE", "PAIRS", "PAISA", "PAISE", + "PALAS", "PALEA", "PALES", "PALIS", "PALLA", "PALLS", "PALPI", "PALPS", "PALSA", + "PANCE", "PANES", "PANGA", "PANGS", "PANNE", "PANNI", "PAOLI", "PAOLO", "PAPAS", + "PAPES", "PAPPI", "PARAE", "PARAS", "PARCH", "PAREN", "PAREO", "PARES", "PARGE", + "PARGO", "PARIS", "PARLE", "PAROL", "PARPS", "PARRA", "PARRS", "PASEO", "PASES", + "PASHA", "PASSE", "PEAGE", "PEAGS", "PEALS", "PEANS", "PEARE", "PEARS", "PEASE", + "PECHS", "PEECE", "PEELS", "PEENS", "PEEPE", "PEEPS", "PEERS", "PEGHS", "PEINS", + "PEISE", "PELAS", "PELES", "PELLS", "PELON", "PENES", "PENGO", "PENIE", "PENIS", + "PENNA", "PENNI", "PEONS", "PEPLA", "PEPOS", "PEPSI", "PERAI", "PERCE", "PERCS", + "PEREA", "PERES", "PERIS", "PERNS", "PEROG", "PERPS", "PERSE", "PESOS", "PHAGE", + "PHANG", "PHARE", "PHEER", "PHENE", "PHEON", "PHESE", "PHIAL", "PHISH", "PHOCA", + "PHONO", "PHONS", "PIANI", "PIANS", "PICAL", "PICAS", "PICRA", "PIERS", "PIING", + "PILAE", "PILAO", "PILAR", "PILCH", "PILEA", "PILEI", "PILER", "PILES", "PILIS", + "PILLS", "PINAS", "PINES", "PINGO", "PINGS", "PINNA", "PINON", "PIONS", "PIPAL", + "PIPAS", "PIPES", "PIPIS", "PIRAI", "PIRLS", "PIRNS", "PIROG", "PISCO", "PISES", + "PISOS", "PLAAS", "PLAGE", "PLANS", "PLAPS", "PLASH", "PLEAS", "PLENA", "PLEON", + "PLESH", "PLICA", "PLIES", "PLING", "PLONG", "PLOPS", "POACH", "POEPS", "POGGE", + "POGOS", "POLER", "POLES", "POLIO", "POLIS", "POLLS", "POLOS", "PONCE", "PONES", + "PONGA", "PONGO", "PONGS", "POOHS", "POOLS", "POONS", "POOPS", "POORI", "POPES", + "POPPA", "PORAE", "PORAL", "PORER", "PORES", "PORGE", "PORIN", "PORNO", "PORNS", + "POSES", "POSHO", "PRANA", "PRANG", "PRAOS", "PRASE", "PREES", "PREON", "PREOP", + "PREPS", "PRESA", "PRESE", "PRIAL", "PRIER", "PRIES", "PRIGS", "PRILL", "PRION", + "PRISE", "PRISS", "PROAS", "PROGS", "PROIN", "PROLE", "PROLL", "PROPS", "PRORE", + "PROSO", "PROSS", "PSION", "PSOAE", "PSOAI", "PSOAS", "PSORA", "RACES", "RACHE", + "RACON", "RAGAS", "RAGEE", "RAGER", "RAGES", "RAGGA", "RAGGS", "RAGIS", "RAIAS", + "RAILE", "RAILS", "RAINE", "RAINS", "RALES", "RANAS", "RANCE", "RANEE", "RANGA", + "RANGI", "RANGS", "RANIS", "RAPER", "RAPES", "RAPHE", "RAPPE", "RAREE", "RARES", + "RASER", "RASES", "RASPS", "RASSE", "REAIS", "REALO", "REALS", "REANS", "REAPS", + "REARS", "RECAL", "RECCE", "RECCO", "RECON", "REECH", "REELS", "REENS", "REGAR", + "REGES", "REGGO", "REGIE", "REGNA", "REGOS", "REINS", "RELIE", "RELLO", "RENGA", + "RENIG", "RENIN", "RENNE", "RENOS", "REOIL", "REORG", "REPEG", "REPIN", "REPLA", + "REPOS", "REPPS", "REPRO", "RERAN", "RERIG", "RESEE", "RESES", "RHEAS", "RHIES", + "RHINE", "RHONE", "RIALS", "RICER", "RICES", "RICIN", "RIELS", "RIGGS", "RIGOL", + "RILES", "RILLE", "RILLS", "RINES", "RINGS", "RIPES", "RIPPS", "RISES", "RISHI", + "RISPS", "ROANS", "ROARS", "ROHES", "ROILS", "ROINS", "ROLAG", "ROLES", "ROLLS", + "RONEO", "RONES", "RONIN", "RONNE", "ROONS", "ROOPS", "ROOSA", "ROOSE", "ROPER", + "ROPES", "RORAL", "RORES", "RORIC", "RORIE", "ROSES", "ROSHI", "ROSIN", "SAAGS", + "SACRA", "SAGAS", "SAGER", "SAGES", "SAGOS", "SAICE", "SAICS", "SAIGA", "SAILS", + "SAINE", "SAINS", "SAIRS", "SALAL", "SALEP", "SALES", "SALIC", "SALLE", "SALOL", + "SALOP", "SALPA", "SALPS", "SALSE", "SANES", "SANGA", "SANGH", "SANGO", "SANGS", + "SANSA", "SAOLA", "SAPAN", "SAPOR", "SARAN", "SAREE", "SARGE", "SARGO", "SARIN", + "SARIS", "SAROS", "SASER", "SASIN", "SASSE", "SCAGS", "SCAIL", "SCALA", "SCALL", + "SCANS", "SCAPA", "SCAPE", "SCAPI", "SCARP", "SCARS", "SCENA", "SCOGS", "SCOOG", + "SCOPA", "SCOPS", "SCRAE", "SCRAG", "SCRAN", "SCRIP", "SCROG", "SEALS", "SEANS", + "SEARE", "SEARS", "SEASE", "SECCO", "SECHS", "SEELS", "SEEPS", "SEERS", "SEGAR", + "SEGNI", "SEGNO", "SEGOL", "SEGOS", "SEHRI", "SEILS", "SEINE", "SEIRS", "SEISE", + "SELAH", "SELES", "SELLA", "SELLE", "SELLS", "SENAS", "SENES", "SENGI", "SENNA", + "SENOR", "SENSA", "SENSI", "SEPAL", "SEPIC", "SERAC", "SERAI", "SERAL", "SERER", + "SERES", "SERGE", "SERIC", "SERIN", "SERON", "SERRA", "SERRE", "SERRS", "SESSA", + "SHAGS", "SHAHS", "SHANS", "SHAPS", "SHARN", "SHASH", "SHCHI", "SHEAL", "SHEAS", + "SHEEL", "SHEOL", "SHERE", "SHERO", "SHIAI", "SHIEL", "SHIER", "SHIES", "SHILL", + "SHINS", "SHIPS", "SHIRR", "SHIRS", "SHISH", "SHISO", "SHLEP", "SHOER", "SHOES", + "SHOGI", "SHOGS", "SHOLA", "SHOOL", "SHOON", "SHOOS", "SHOPE", "SHOPS", "SHORL", + "SHRIS", "SIALS", "SICES", "SIENS", "SIGHS", "SIGIL", "SIGLA", "SIGNA", "SIGNS", + "SILEN", "SILER", "SILES", "SILLS", "SILOS", "SINES", "SINGS", "SINHS", "SIPES", + "SIREE", "SIRES", "SIRIH", "SIRIS", "SIROC", "SIRRA", "SISAL", "SISES", "SLAES", + "SLAGS", "SLANE", "SLAPS", "SLEER", "SLIER", "SLIPE", "SLIPS", "SLISH", "SLOAN", + "SLOES", "SLOGS", "SLOPS", "SNAGS", "SNAPS", "SNARS", "SNASH", "SNEAP", "SNEES", + "SNELL", "SNIES", "SNIGS", "SNIPS", "SNOEP", "SNOGS", "SNOOL", "SOAPS", "SOARE", + "SOARS", "SOCAS", "SOCES", "SOCLE", "SOGER", "SOILS", "SOLAH", "SOLAN", "SOLAS", + "SOLEI", "SOLER", "SOLES", "SOLON", "SOLOS", "SONCE", "SONES", "SONGS", "SONNE", + "SONSE", "SOOLE", "SOOLS", "SOOPS", "SOPHS", "SOPOR", "SOPRA", "SORAL", "SORAS", + "SOREE", "SOREL", "SORER", "SORES", "SORGO", "SORNS", "SORRA", "SPAER", "SPAES", + "SPAGS", "SPAHI", "SPAIL", "SPAIN", "SPALE", "SPALL", "SPANE", "SPANG", "SPANS", + "SPARS", "SPEAL", "SPEAN", "SPECS", "SPEEL", "SPEER", "SPEIL", "SPEIR", "SPEOS", + "SPIAL", "SPICA", "SPICS", "SPIER", "SPIES", "SPILE", "SPINA", "SPINS", "SPLOG", + "SPOOR", "SPOSH", "SPRAG", "SPROG", }; -#if (USE_EXPANDED_DICT == 1) -static const char _expanded_words[][WORDLE_LENGTH + 1] = {}; -#endif - - -static const uint16_t _num_words = (sizeof(_legal_words) / sizeof(_legal_words[0])); -static const uint16_t _num_expanded_words = (sizeof(_expanded_words) / sizeof(_expanded_words[0])); +static const uint16_t _num_words = (sizeof(_valid_words) / sizeof(_valid_words[0])); +static const uint16_t _num_possible_words = (sizeof(_possible_words) / sizeof(_possible_words[0])); static const uint8_t _num_valid_letters = (sizeof(_valid_letters) / sizeof(_valid_letters[0])); static uint32_t get_random(uint32_t max) { @@ -211,24 +317,24 @@ static uint32_t check_word_in_dict(uint8_t *word_elements) { for (uint16_t i = 0; i < _num_words; i++) { is_exact_match = true; for (size_t j = 0; j < WORDLE_LENGTH; j++) { - if (_valid_letters[word_elements[j]] != _legal_words[i][j]) { + if (_valid_letters[word_elements[j]] != _valid_words[i][j]) { is_exact_match = false; break; } } if (is_exact_match) return i; } - for (uint16_t i = 0; i < _num_expanded_words; i++) { + for (uint16_t i = 0; i < _num_possible_words; i++) { is_exact_match = true; for (size_t j = 0; j < WORDLE_LENGTH; j++) { - if (_valid_letters[word_elements[j]] != _expanded_words[i][j]) { + if (_valid_letters[word_elements[j]] != _possible_words[i][j]) { is_exact_match = false; break; } } if (is_exact_match) return _num_words + i; } - return _num_words + _num_expanded_words; + return _num_words + _num_possible_words; } static bool check_word(wordle_state_t *state) { @@ -236,7 +342,7 @@ static bool check_word(wordle_state_t *state) { bool is_exact_match = true; bool answer_already_accounted[WORDLE_LENGTH] = { false }; for (size_t i = 0; i < WORDLE_LENGTH; i++) { - if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][i]) { + if (_valid_letters[state->word_elements[i]] == _valid_words[state->curr_answer][i]) { state->word_elements_result[i] = WORDLE_LETTER_CORRECT; answer_already_accounted[i] = true; } @@ -251,7 +357,7 @@ static bool check_word(wordle_state_t *state) { if (state->word_elements_result[i] != WORDLE_LETTER_WRONG) continue; for (size_t j = 0; j < WORDLE_LENGTH; j++) { if (answer_already_accounted[j]) continue; - if (_valid_letters[state->word_elements[i]] == _legal_words[state->curr_answer][j]) { + if (_valid_letters[state->word_elements[i]] == _valid_words[state->curr_answer][j]) { state->word_elements_result[i] = WORDLE_LETTER_WRONG_LOC; answer_already_accounted[j] = true; break; @@ -279,7 +385,7 @@ static void reset_all_elements(wordle_state_t *state) { state->word_elements_result[i] = WORDLE_LETTER_WRONG; } for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) { - state->guessed_words[i] = _num_words + _num_expanded_words; + state->guessed_words[i] = _num_words + _num_possible_words; } state->using_random_guess = false; state->attempt = 0; @@ -300,7 +406,7 @@ static void reset_board(wordle_state_t *state) { display_playing(state); watch_display_string(" -", 4); #if __EMSCRIPTEN__ - printf("ANSWER: %s\r\n", _legal_words[state->curr_answer]); + printf("ANSWER: %s\r\n", _valid_words[state->curr_answer]); #endif } @@ -368,7 +474,7 @@ static void display_already_guessed(wordle_state_t *state) { static void display_lose(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 6]; - sprintf(buf," L %s", subsecond % 2 ? _legal_words[state->curr_answer] : " "); + sprintf(buf," L %s", subsecond % 2 ? _valid_words[state->curr_answer] : " "); watch_display_string(buf, 0); } @@ -486,7 +592,7 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { static void get_result(wordle_state_t *state) { // Check if it's in the dict uint16_t in_dict = check_word_in_dict(state->word_elements); - if (in_dict == _num_words + _num_expanded_words) { + if (in_dict == _num_words + _num_possible_words) { display_not_in_dict(state); return; } @@ -522,7 +628,7 @@ static void get_result(wordle_state_t *state) { } #if (USE_RANDOM_GUESS != 0) -static const uint16_t _num_unique_words = 157; // The _legal_words array begins with this many words where each letter is different. +static const uint16_t _num_unique_words = 157; // The _valid_words array begins with this many words where each letter is different. static void insert_random_guess(wordle_state_t *state) { uint16_t random_guess; do { // Don't allow the guess to be the same as the answer @@ -531,7 +637,7 @@ static void insert_random_guess(wordle_state_t *state) { for (size_t i = 0; i < WORDLE_LENGTH; i++) { for (size_t j = 0; j < _num_valid_letters; j++) { - if (_legal_words[random_guess][i] == _valid_letters[j]) + if (_valid_words[random_guess][i] == _valid_letters[j]) state->word_elements[i] = j; } } diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 00c97b39..62a4571d 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -71,13 +71,6 @@ */ #define USE_RANDOM_GUESS 2 -/* USE_EXPANDED_DICT - * 0 = don't use it at all (saves 2.8KB of ROM) - * 1 = Include the expanded dict in answers - * 2 = Only include it in the dict for guessing, but it's never an answer -*/ -#define USE_EXPANDED_DICT 2 - typedef enum { WORDLE_LETTER_WRONG = 0, WORDLE_LETTER_WRONG_LOC, diff --git a/utils/wordle_face/wordle_list.py b/utils/wordle_face/wordle_list.py index da370b7a..ed909887 100644 --- a/utils/wordle_face/wordle_list.py +++ b/utils/wordle_face/wordle_list.py @@ -1,953 +1,1101 @@ import random, itertools, time, ast -# From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff -legal_list = [ - "ABACK", "ABAFT", "ABASE", "ABATE", "ABBEY", "ABBOT", "ABHOR", "ABIDE", "ABLER", "ABODE", "ABOUT", "ABOVE", - "ABUSE", "ABYSS", "ACHED", "ACHES", "ACIDS", "ACORN", "ACRES", "ACRID", "ACTED", "ACTOR", "ACUTE", "ADAGE", - "ADAPT", "ADDED", "ADDER", "ADEPT", "ADIEU", "ADMIT", "ADOBE", "ADOPT", "ADORE", "ADORN", "ADULT", "AEGIS", - "AEONS", "AFFIX", "AFIRE", "AFOOT", "AFTER", "AGAIN", "AGAPE", "AGATE", "AGENT", "AGILE", "AGING", "AGLOW", - "AGONY", "AGREE", "AHEAD", "AIDED", "AIDES", "AILED", "AIMED", "AIRED", "AISLE", "ALARM", "ALBUM", "ALDER", - "ALERT", "ALIAS", "ALIBI", "ALIEN", "ALIKE", "ALIVE", "ALLAY", "ALLEY", "ALLOT", "ALLOW", "ALLOY", "ALOES", - "ALOFT", "ALONE", "ALONG", "ALOOF", "ALOUD", "ALPHA", "ALTAR", "ALTER", "ALTOS", "AMASS", "AMAZE", "AMBER", - "AMBLE", "AMEND", "AMIGO", "AMISS", "AMITY", "AMONG", "AMOUR", "AMPLE", "AMPLY", "AMUSE", "ANGEL", "ANGER", - "ANGLE", "ANGRY", "ANGST", "ANIME", "ANKLE", "ANNEX", "ANNOY", "ANNUL", "ANTES", "ANTIC", "ANVIL", "APACE", - "APART", "APING", "APPAL", "APPLE", "APPLY", "APRON", "APTLY", "AREAS", "ARENA", "ARGUE", "ARISE", "ARMED", - "AROMA", "AROSE", "ARRAY", "ARROW", "ARSON", "ASHEN", "ASHES", "ASIDE", "ASKED", "ASKEW", "ASPEN", "ASSAY", - "ASSES", "ASSET", "ASTER", "ASTIR", "ATLAS", "ATOLL", "ATOMS", "ATONE", "ATTAR", "ATTIC", "AUDIO", "AUDIT", - "AUGER", "AUGHT", "AUGUR", "AUNTS", "AURAS", "AUTOS", "AVAIL", "AVERS", "AVERT", "AVOID", "AVOWS", "AWAIT", - "AWAKE", "AWARD", "AWARE", "AWFUL", "AWOKE", "AXIOM", "AXLES", "AZURE", "BABEL", "BABES", "BACKS", "BACON", - "BADGE", "BADLY", "BAGGY", "BAITS", "BAIZE", "BAKED", "BAKER", "BALES", "BALLS", "BALMY", "BANAL", "BANDS", - "BANDY", "BANGS", "BANJO", "BANKS", "BANNS", "BARBS", "BARDS", "BARED", "BARGE", "BARKS", "BARNS", "BARON", - "BASAL", "BASED", "BASER", "BASES", "BASIC", "BASIL", "BASIN", "BASIS", "BASSO", "BASTE", "BATCH", "BATED", - "BATHE", "BATHS", "BATON", "BAYOU", "BEACH", "BEADS", "BEADY", "BEAKS", "BEAMS", "BEANS", "BEARD", "BEARS", - "BEAST", "BEAUX", "BEECH", "BEETS", "BEFIT", "BEGAN", "BEGAT", "BEGET", "BEGIN", "BEGOT", "BEGUN", "BEING", - "BELIE", "BELLE", "BELLS", "BELLY", "BELOW", "BELTS", "BENCH", "BENDS", "BERGS", "BERRY", "BERTH", "BERYL", - "BESET", "BESOM", "BEVEL", "BIBLE", "BIDED", "BIDES", "BIGHT", "BIGOT", "BILGE", "BILLS", "BILLY", "BINDS", - "BIPED", "BIRCH", "BIRDS", "BIRTH", "BISON", "BITCH", "BITES", "BLACK", "BLADE", "BLAME", "BLAND", "BLANK", - "BLARE", "BLAST", "BLAZE", "BLEAK", "BLEAT", "BLEED", "BLEND", "BLENT", "BLESS", "BLEST", "BLIND", "BLINK", - "BLISS", "BLOCK", "BLOCS", "BLOND", "BLOOD", "BLOOM", "BLOTS", "BLOWN", "BLOWS", "BLUER", "BLUES", "BLUFF", - "BLUNT", "BLURT", "BLUSH", "BOARD", "BOARS", "BOAST", "BOATS", "BODED", "BODES", "BOGGY", "BOGUS", "BOILS", - "BOLES", "BOLTS", "BOMBS", "BONDS", "BONED", "BONES", "BONNY", "BONUS", "BOOBY", "BOOKS", "BOOMS", "BOONS", - "BOORS", "BOOST", "BOOTH", "BOOTS", "BOOTY", "BOOZE", "BORAX", "BORED", "BORES", "BORNE", "BOSOM", "BOUGH", - "BOUND", "BOUTS", "BOWED", "BOWEL", "BOWER", "BOWLS", "BOXED", "BOXER", "BOXES", "BRACE", "BRAGS", "BRAID", - "BRAIN", "BRAKE", "BRAND", "BRASS", "BRATS", "BRAVE", "BRAVO", "BRAWL", "BRAWN", "BREAD", "BREAK", "BREED", - "BRIAR", "BRIBE", "BRICK", "BRIDE", "BRIEF", "BRIER", "BRIGS", "BRIMS", "BRINE", "BRING", "BRINK", "BRINY", - "BRISK", "BROAD", "BROIL", "BROKE", "BROOD", "BROOK", "BROOM", "BROTH", "BROWN", "BROWS", "BRUIN", "BRUNT", - "BRUSH", "BRUTE", "BUCKS", "BUDGE", "BUGGY", "BUGLE", "BUILD", "BUILT", "BULBS", "BULGE", "BULKS", "BULKY", - "BULLS", "BULLY", "BUMPS", "BUNCH", "BUNKS", "BUOYS", "BURLY", "BURNS", "BURNT", "BURRO", "BURRS", "BURST", - "BUSHY", "BUSTS", "BUTTE", "BUTTS", "BUXOM", "BUYER", "CABAL", "CABBY", "CABIN", "CABLE", "CACAO", "CACHE", - "CADET", "CADRE", "CAGED", "CAGES", "CAIRN", "CAKED", "CAKES", "CALLS", "CALMS", "CALYX", "CAMEL", "CAMEO", - "CAMPS", "CANAL", "CANDY", "CANES", "CANNY", "CANOE", "CANON", "CANTO", "CAPER", "CAPES", "CAPON", "CARDS", - "CARED", "CARES", "CARGO", "CAROL", "CARRY", "CARTS", "CARVE", "CASED", "CASES", "CASKS", "CASTE", "CASTS", - "CATCH", "CATER", "CAUSE", "CAVED", "CAVES", "CAVIL", "CEASE", "CEDAR", "CEDED", "CELLS", "CENTS", "CHAFE", - "CHAFF", "CHAIN", "CHAIR", "CHALK", "CHAMP", "CHANT", "CHAOS", "CHAPS", "CHARM", "CHART", "CHARY", "CHASE", - "CHASM", "CHATS", "CHEAP", "CHEAT", "CHECK", "CHEEK", "CHEER", "CHEFS", "CHESS", "CHEST", "CHICK", "CHIDE", - "CHIEF", "CHILD", "CHILL", "CHIME", "CHINA", "CHINK", "CHINS", "CHIPS", "CHIRP", "CHOIR", "CHOKE", "CHOPS", - "CHORD", "CHOSE", "CHUCK", "CHUMP", "CHUMS", "CHUNK", "CHURL", "CHURN", "CHUTE", "CIDER", "CIGAR", "CINCH", - "CIRCA", "CITED", "CITES", "CIVET", "CIVIC", "CIVIL", "CLACK", "CLAIM", "CLAMP", "CLAMS", "CLANG", "CLANK", - "CLANS", "CLAPS", "CLASH", "CLASP", "CLASS", "CLAWS", "CLEAN", "CLEAR", "CLEFS", "CLEFT", "CLERK", "CLEWS", - "CLICK", "CLIFF", "CLIMB", "CLIME", "CLING", "CLINK", "CLIPS", "CLOAK", "CLOCK", "CLODS", "CLOGS", "CLOSE", - "CLOTH", "CLOUD", "CLOUT", "CLOVE", "CLOWN", "CLUBS", "CLUCK", "CLUES", "CLUMP", "CLUNG", "COACH", "COALS", - "COAST", "COATS", "COBRA", "COCKS", "COCOA", "CODES", "COILS", "COINS", "COLDS", "COLIC", "COLON", "COLTS", - "COMBS", "COMER", "COMES", "COMET", "COMIC", "COMMA", "CONCH", "CONES", "CONIC", "COOED", "COOKS", "COOLS", - "COPRA", "COPSE", "CORAL", "CORDS", "CORES", "CORKS", "CORNS", "CORPS", "COSTS", "COTES", "COUCH", "COUGH", - "COULD", "COUNT", "COUPE", "COUPS", "COURT", "COVER", "COVES", "COVET", "COVEY", "COWED", "COWER", "COYLY", - "COZEN", "CRABS", "CRACK", "CRAFT", "CRAGS", "CRAMP", "CRANE", "CRANK", "CRAPE", "CRASH", "CRASS", "CRATE", - "CRAVE", "CRAWL", "CRAZE", "CRAZY", "CREAK", "CREAM", "CREDO", "CREED", "CREEK", "CREEP", "CREPE", "CREPT", - "CRESS", "CREST", "CREWS", "CRIBS", "CRICK", "CRIED", "CRIER", "CRIES", "CRIME", "CRIMP", "CRISP", "CROAK", - "CROCK", "CRONE", "CRONY", "CROOK", "CROPS", "CROSS", "CROUP", "CROWD", "CROWN", "CROWS", "CRUDE", "CRUEL", - "CRUMB", "CRUSH", "CRUST", "CRYPT", "CUBES", "CUBIC", "CUBIT", "CUFFS", "CULTS", "CURDS", "CURED", "CURES", - "CURLS", "CURLY", "CURRY", "CURSE", "CURST", "CURVE", "CYCLE", "CYNIC", "DADDY", "DAILY", "DAIRY", "DAISY", - "DALES", "DALLY", "DAMES", "DAMPS", "DANCE", "DANDY", "DARED", "DARES", "DARTS", "DATED", "DATES", "DATUM", - "DAUBS", "DAUNT", "DAWNS", "DAZED", "DEALS", "DEALT", "DEANS", "DEARS", "DEATH", "DEBAR", "DEBIT", "DEBTS", - "DEBUT", "DECAY", "DECKS", "DECOY", "DECRY", "DEEDS", "DEEMS", "DEEPS", "DEFER", "DEIGN", "DEITY", "DELAY", - "DELLS", "DELTA", "DELVE", "DEMON", "DEMUR", "DENSE", "DENTS", "DEPOT", "DEPTH", "DERBY", "DESKS", "DETER", - "DEUCE", "DEVIL", "DIARY", "DICED", "DICES", "DICTA", "DIETS", "DIGIT", "DIKES", "DIMES", "DIMLY", "DINED", - "DINER", "DINES", "DINGY", "DIRGE", "DIRTY", "DISCS", "DISKS", "DITCH", "DITTO", "DITTY", "DIVAN", "DIVED", - "DIVER", "DIVES", "DIZZY", "DOCKS", "DODGE", "DOERS", "DOGMA", "DOING", "DOLED", "DOLLS", "DOMED", "DOMES", - "DONOR", "DOOMS", "DOORS", "DOSED", "DOSES", "DOTED", "DOTES", "DOUBT", "DOUGH", "DOVES", "DOWDY", "DOWNS", - "DOWNY", "DOWRY", "DOZED", "DOZEN", "DRAFT", "DRAGS", "DRAIN", "DRAKE", "DRAMA", "DRAMS", "DRANK", "DRAPE", - "DRAWL", "DRAWN", "DRAWS", "DRAYS", "DREAD", "DREAM", "DREGS", "DRESS", "DRIED", "DRIER", "DRIES", "DRIFT", - "DRILL", "DRILY", "DRINK", "DRIPS", "DRIVE", "DROLL", "DRONE", "DROOP", "DROPS", "DROSS", "DROVE", "DROWN", - "DRUGS", "DRUMS", "DRUNK", "DRYLY", "DUCAL", "DUCAT", "DUCHY", "DUCKS", "DUCTS", "DUELS", "DUETS", "DUKES", - "DULLY", "DUMMY", "DUMPS", "DUMPY", "DUNCE", "DUNES", "DUNNO", "DUPED", "DUPES", "DUSKY", "DUSTY", "DWARF", - "DWELL", "DWELT", "DYING", "DYKES", "EAGER", "EAGLE", "EARLS", "EARLY", "EARNS", "EARTH", "EASED", "EASEL", - "EASES", "EATEN", "EATER", "EAVES", "EBBED", "EBONY", "EDGED", "EDGES", "EDICT", "EDIFY", "EERIE", "EGGED", - "EIGHT", "EJECT", "ELATE", "ELBOW", "ELDER", "ELECT", "ELEGY", "ELFIN", "ELITE", "ELOPE", "ELUDE", "ELVES", - "EMAIL", "EMITS", "EMPTY", "ENACT", "ENDED", "ENDOW", "ENEMY", "ENJOY", "ENNUI", "ENROL", "ENSUE", "ENTER", - "ENTRY", "ENVOY", "EPICS", "EPOCH", "EQUAL", "EQUIP", "ERASE", "ERECT", "ERRED", "ERROR", "ESSAY", "ETHER", - "ETHIC", "EVADE", "EVENT", "EVERY", "EVILS", "EVOKE", "EXACT", "EXALT", "EXCEL", "EXERT", "EXILE", "EXIST", - "EXITS", "EXPEL", "EXTOL", "EXTRA", "EXULT", "EYING", "EYRIE", "FABLE", "FACED", "FACES", "FACTS", "FADED", - "FADES", "FAILS", "FAINT", "FAIRS", "FAIRY", "FAITH", "FAKIR", "FALLS", "FALSE", "FAMED", "FANCY", "FANGS", - "FARCE", "FARED", "FARES", "FARMS", "FASTS", "FATAL", "FATED", "FATES", "FATTY", "FAULT", "FAUNA", "FAUNS", - "FAWNS", "FEARS", "FEAST", "FEATS", "FEEDS", "FEELS", "FEIGN", "FEINT", "FELLS", "FELON", "FENCE", "FERAL", - "FERNS", "FERRY", "FETCH", "FETED", "FETID", "FETUS", "FEUDS", "FEVER", "FEWER", "FICHE", "FIEFS", "FIELD", - "FIEND", "FIERY", "FIFES", "FIFTH", "FIFTY", "FIGHT", "FILCH", "FILED", "FILES", "FILET", "FILLS", "FILLY", - "FILMS", "FILMY", "FILTH", "FINAL", "FINCH", "FINDS", "FINED", "FINER", "FINES", "FINIS", "FINNY", "FIORD", - "FIRED", "FIRES", "FIRMS", "FIRST", "FISHY", "FISTS", "FITLY", "FIVES", "FIXED", "FIXER", "FIXES", "FJORD", - "FLAGS", "FLAIL", "FLAIR", "FLAKE", "FLAKY", "FLAME", "FLANK", "FLAPS", "FLARE", "FLASH", "FLASK", "FLATS", - "FLAWS", "FLEAS", "FLECK", "FLEES", "FLEET", "FLESH", "FLICK", "FLIER", "FLIES", "FLING", "FLINT", "FLIRT", - "FLITS", "FLOAT", "FLOCK", "FLOES", "FLOOD", "FLOOR", "FLORA", "FLOSS", "FLOUR", "FLOUT", "FLOWN", "FLOWS", - "FLUES", "FLUFF", "FLUID", "FLUKE", "FLUME", "FLUNG", "FLUSH", "FLUTE", "FLYER", "FOAMS", "FOAMY", "FOCAL", - "FOCUS", "FOGGY", "FOILS", "FOIST", "FOLDS", "FOLIO", "FOLKS", "FOLLY", "FOODS", "FOOLS", "FORAY", "FORCE", - "FORDS", "FORGE", "FORGO", "FORKS", "FORMS", "FORTE", "FORTH", "FORTS", "FORTY", "FORUM", "FOUND", "FOUNT", - "FOURS", "FOWLS", "FOXES", "FOYER", "FRAIL", "FRAME", "FRANC", "FRANK", "FRAUD", "FREAK", "FREED", "FREER", - "FREES", "FRESH", "FRETS", "FRIAR", "FRIED", "FRILL", "FRISK", "FROCK", "FROGS", "FROND", "FRONT", "FROST", - "FROTH", "FROWN", "FROZE", "FRUIT", "FUDGE", "FUELS", "FUGUE", "FULLY", "FUMED", "FUMES", "FUNDS", "FUNGI", - "FUNNY", "FURRY", "FURZE", "FUSED", "FUSES", "FUSSY", "FUZZY", "GABLE", "GAILY", "GAINS", "GALES", "GALLS", - "GAMES", "GAMIN", "GAMMA", "GAMUT", "GANGS", "GAPED", "GAPES", "GASES", "GASPS", "GATES", "GAUDY", "GAUGE", - "GAUNT", "GAUZE", "GAUZY", "GAVEL", "GAWKY", "GAYER", "GAYLY", "GAZED", "GAZER", "GAZES", "GEARS", "GEESE", - "GENIE", "GENII", "GENRE", "GENTS", "GENUS", "GERMS", "GHOST", "GIANT", "GIBES", "GIDDY", "GIFTS", "GILDS", - "GILLS", "GIMME", "GIPSY", "GIRDS", "GIRLS", "GIRTH", "GIVEN", "GIVES", "GLADE", "GLAND", "GLARE", "GLASS", - "GLAZE", "GLEAM", "GLEAN", "GLENS", "GLIDE", "GLINT", "GLOAT", "GLOBE", "GLOOM", "GLORY", "GLOSS", "GLOVE", - "GLOWS", "GLUED", "GNASH", "GNATS", "GNAWS", "GNOME", "GOADS", "GOALS", "GOATS", "GODLY", "GOING", "GOLLY", - "GONGS", "GONNA", "GOODS", "GOODY", "GOOSE", "GORED", "GORGE", "GORSE", "GOTTA", "GOUGE", "GOURD", "GOUTY", - "GOWNS", "GRABS", "GRACE", "GRADE", "GRAFT", "GRAIN", "GRAMS", "GRAND", "GRANT", "GRAPE", "GRAPH", "GRASP", - "GRASS", "GRATE", "GRAVE", "GRAVY", "GRAZE", "GREAT", "GREED", "GREEN", "GREET", "GREYS", "GRIEF", "GRILL", - "GRIME", "GRIMY", "GRIND", "GRINS", "GRIPE", "GRIPS", "GRIST", "GROAN", "GROIN", "GROOM", "GROPE", "GROSS", - "GROUP", "GROVE", "GROWL", "GROWN", "GROWS", "GRUBS", "GRUEL", "GRUFF", "GRUNT", "GUANO", "GUARD", "GUESS", - "GUEST", "GUIDE", "GUILD", "GUILE", "GUILT", "GUISE", "GULCH", "GULFS", "GULLS", "GULLY", "GUMMY", "GUSTO", - "GUSTS", "GUSTY", "GYPSY", "HABIT", "HACKS", "HAILS", "HAIRS", "HAIRY", "HALED", "HALLS", "HALTS", "HALVE", - "HANDS", "HANDY", "HANGS", "HAPPY", "HARDY", "HAREM", "HARES", "HARMS", "HARPS", "HARPY", "HARRY", "HARSH", - "HARTS", "HASTE", "HASTY", "HATCH", "HATED", "HATER", "HAULS", "HAVEN", "HAVOC", "HAWKS", "HAZEL", "HEADS", - "HEADY", "HEALS", "HEAPS", "HEARD", "HEARS", "HEART", "HEATH", "HEATS", "HEAVE", "HEAVY", "HEDGE", "HEEDS", - "HEELS", "HEIRS", "HELIX", "HELLO", "HELMS", "HELPS", "HENCE", "HERBS", "HERDS", "HERON", "HEROS", "HEWED", - "HIDES", "HILLS", "HILLY", "HILTS", "HINDS", "HINGE", "HINTS", "HIRED", "HIRES", "HITCH", "HIVES", "HOARD", - "HOARY", "HOBBY", "HOIST", "HOLDS", "HOLES", "HOLLY", "HOMES", "HONEY", "HOODS", "HOOFS", "HOOKS", "HOOPS", - "HOOTS", "HOPED", "HOPES", "HORDE", "HORNS", "HORNY", "HORSE", "HOSTS", "HOTEL", "HOTLY", "HOUND", "HOURS", - "HOUSE", "HOVEL", "HOVER", "HOWLS", "HULKS", "HULLS", "HUMAN", "HUMID", "HUMPS", "HUMUS", "HUNCH", "HUNTS", - "HURLS", "HURRY", "HURTS", "HUSKS", "HUSKY", "HUSSY", "HYDRA", "HYENA", "HYMNS", "ICILY", "ICING", "IDEAL", - "IDEAS", "IDIOM", "IDIOT", "IDLED", "IDLER", "IDOLS", "IDYLL", "IGLOO", "IMAGE", "IMBUE", "IMPEL", "IMPLY", - "INANE", "INCUR", "INDEX", "INEPT", "INERT", "INFER", "INGOT", "INLET", "INNER", "INTER", "INURE", "IRATE", - "IRKED", "IRONS", "IRONY", "ISLES", "ISLET", "ISSUE", "ITEMS", "IVORY", "JACKS", "JADED", "JAILS", "JAUNT", - "JEANS", "JEERS", "JELLY", "JERKS", "JERKY", "JESTS", "JETTY", "JEWEL", "JIFFY", "JOINS", "JOINT", "JOKED", - "JOKER", "JOKES", "JOLLY", "JOUST", "JOYED", "JUDGE", "JUICE", "JUICY", "JUMPS", "JUNKS", "JUNTA", "JUROR", - "KARMA", "KEELS", "KEEPS", "KETCH", "KEYED", "KHAKI", "KICKS", "KILLS", "KINDA", "KINDS", "KINGS", "KIOSK", - "KITES", "KNACK", "KNAVE", "KNEAD", "KNEEL", "KNEES", "KNELL", "KNELT", "KNIFE", "KNITS", "KNOBS", "KNOCK", - "KNOLL", "KNOTS", "KNOWN", "KNOWS", "LABEL", "LACED", "LACES", "LACKS", "LADEN", "LADLE", "LAGER", "LAIRS", - "LAITY", "LAKES", "LAMBS", "LAMED", "LAMES", "LAMPS", "LANCE", "LANDS", "LANES", "LANKY", "LAPEL", "LAPSE", - "LARCH", "LARGE", "LARGO", "LARKS", "LARVA", "LASSO", "LASTS", "LATCH", "LATER", "LATHE", "LATHS", "LAUGH", - "LAWNS", "LAYER", "LEADS", "LEAFY", "LEAKS", "LEAKY", "LEANS", "LEAPS", "LEAPT", "LEARN", "LEASE", "LEASH", - "LEAST", "LEAVE", "LEDGE", "LEECH", "LEEKS", "LEGAL", "LEMME", "LEMON", "LENDS", "LEPER", "LEVEE", "LEVEL", - "LEVER", "LIARS", "LIBEL", "LICKS", "LIEGE", "LIENS", "LIFTS", "LIGHT", "LIKED", "LIKEN", "LIKER", "LIKES", - "LILAC", "LIMBO", "LIMBS", "LIMES", "LIMIT", "LINED", "LINEN", "LINER", "LINES", "LINGO", "LINKS", "LIONS", - "LISTS", "LITHE", "LIVED", "LIVER", "LIVES", "LIVID", "LLAMA", "LOADS", "LOAMY", "LOANS", "LOATH", "LOBBY", - "LOBES", "LOCAL", "LOCKS", "LOCUS", "LODGE", "LOFTY", "LOGES", "LOGIC", "LOGIN", "LOINS", "LONGS", "LOOKS", - "LOOMS", "LOONS", "LOOPS", "LOOSE", "LORDS", "LOSER", "LOSES", "LOTUS", "LOUSE", "LOUSY", "LOVED", "LOVER", - "LOVES", "LOWED", "LOWER", "LOWLY", "LOYAL", "LUCID", "LUCKY", "LULLS", "LUMPS", "LUMPY", "LUNAR", "LUNCH", - "LUNGE", "LUNGS", "LURCH", "LURED", "LURES", "LURID", "LURKS", "LUSTS", "LUSTY", "LUTES", "LYING", "LYMPH", - "LYNCH", "LYRIC", "MACES", "MADAM", "MADLY", "MAGIC", "MAIDS", "MAILS", "MAINS", "MAIZE", "MAJOR", "MAKER", - "MAKES", "MALES", "MAMMA", "MANES", "MANGA", "MANGE", "MANGO", "MANGY", "MANIA", "MANLY", "MANNA", "MANOR", - "MANSE", "MAPLE", "MARCH", "MARES", "MARKS", "MARRY", "MARSH", "MARTS", "MASKS", "MASON", "MASTS", "MATCH", - "MATED", "MATES", "MAUVE", "MAXIM", "MAYBE", "MAYOR", "MAZES", "MEALS", "MEALY", "MEANS", "MEANT", "MEATS", - "MEDAL", "MEDIA", "MEETS", "MELON", "MELTS", "MEMES", "MENDS", "MENUS", "MERCY", "MERES", "MERGE", "MERIT", - "MERRY", "MESAS", "METAL", "METED", "METER", "MEWED", "MIDST", "MIENS", "MIGHT", "MILCH", "MILES", "MILKY", - "MILLS", "MIMES", "MIMIC", "MINCE", "MINDS", "MINED", "MINER", "MINES", "MINOR", "MINTS", "MINUS", "MIRTH", - "MISER", "MISTS", "MITES", "MIXED", "MIXES", "MOANS", "MOATS", "MOCKS", "MODEL", "MODEM", "MODES", "MOIST", - "MOLAR", "MOLES", "MOMMA", "MONEY", "MONKS", "MONTH", "MOODS", "MOODY", "MOONS", "MOORS", "MOOSE", "MOPED", - "MORAL", "MORES", "MOSSY", "MOTES", "MOTHS", "MOTIF", "MOTOR", "MOTTO", "MOUND", "MOUNT", "MOURN", "MOUSE", - "MOUTH", "MOVED", "MOVER", "MOVES", "MOVIE", "MOWED", "MOWER", "MUCUS", "MUDDY", "MULES", "MULTI", "MUMMY", - "MUMPS", "MUNCH", "MURAL", "MURKY", "MUSED", "MUSES", "MUSIC", "MUSKY", "MUSTY", "MUTED", "MUTES", "MYRRH", - "MYTHS", "NABOB", "NAILS", "NAIVE", "NAKED", "NAMED", "NAMES", "NASAL", "NASTY", "NATAL", "NATTY", "NAVAL", - "NAVEL", "NAVES", "NEARS", "NECKS", "NEEDS", "NEEDY", "NEIGH", "NERVE", "NESTS", "NEVER", "NEWER", "NEWLY", - "NICER", "NICHE", "NIECE", "NIGHT", "NINNY", "NOBLE", "NOBLY", "NOISE", "NOISY", "NOMAD", "NONCE", "NOOKS", - "NOOSE", "NORTH", "NOSED", "NOSES", "NOTCH", "NOTED", "NOTES", "NOUNS", "NOVEL", "NUDGE", "NURSE", "NYMPH", - "OAKEN", "OAKUM", "OASES", "OASIS", "OATEN", "OATHS", "OBESE", "OBEYS", "OCCUR", "OCEAN", "OCHRE", "ODDER", - "ODDLY", "ODIUM", "OFFAL", "OFFER", "OFTEN", "OILED", "OLDEN", "OLDER", "OMENS", "OMITS", "ONION", "ONSET", - "OOZED", "OOZES", "OPALS", "OPENS", "OPERA", "OPINE", "OPIUM", "OPTIC", "ORBIT", "ORDER", "ORGAN", "OSIER", - "OTHER", "OTTER", "OUGHT", "OUNCE", "OUTDO", "OUTER", "OVALS", "OVARY", "OVENS", "OVERT", "OWING", "OWNED", - "OWNER", "OXIDE", "OZONE", "PACES", "PACKS", "PADDY", "PADRE", "PAEAN", "PAGAN", "PAGES", "PAILS", "PAINS", - "PAINT", "PAIRS", "PALED", "PALER", "PALES", "PALMS", "PALMY", "PALSY", "PANEL", "PANES", "PANGS", "PANIC", - "PANSY", "PANTS", "PAPAL", "PAPAS", "PAPER", "PARED", "PARKA", "PARKS", "PARRY", "PARSE", "PARTS", "PARTY", - "PASHA", "PASTE", "PASTY", "PATCH", "PATES", "PATHS", "PATIO", "PAUSE", "PAVED", "PAWED", "PAWNS", "PAYED", - "PAYER", "PEACE", "PEACH", "PEAKS", "PEALS", "PEARL", "PEARS", "PEASE", "PECKS", "PEDAL", "PEEPS", "PEERS", - "PELTS", "PENAL", "PENCE", "PENIS", "PENNY", "PEONS", "PERCH", "PERIL", "PESKY", "PESOS", "PESTS", "PETAL", - "PETTY", "PHASE", "PHIAL", "PHONE", "PHOTO", "PIANO", "PICKS", "PIECE", "PIERS", "PIETY", "PIGMY", "PIKES", - "PILED", "PILES", "PILLS", "PILOT", "PINCH", "PINED", "PINES", "PINKS", "PINTO", "PINTS", "PIOUS", "PIPED", - "PIPER", "PIPES", "PIQUE", "PITCH", "PITHY", "PIVOT", "PLACE", "PLAID", "PLAIN", "PLAIT", "PLANE", "PLANK", - "PLANS", "PLANT", "PLATE", "PLAYS", "PLAZA", "PLEAD", "PLEAS", "PLIED", "PLIES", "PLOTS", "PLUCK", "PLUGS", - "PLUMB", "PLUME", "PLUMS", "PLUSH", "PODIA", "POEMS", "POESY", "POETS", "POINT", "POISE", "POKED", "POKER", - "POKES", "POLAR", "POLES", "POLKA", "POLLS", "PONDS", "POOLS", "POPES", "POPPA", "POPPY", "PORCH", "PORED", - "PORES", "PORTS", "POSED", "POSER", "POSES", "POSSE", "POSTS", "POUCH", "POUND", "POURS", "POWER", "PRANK", - "PRATE", "PRAYS", "PRESS", "PREYS", "PRICE", "PRICK", "PRIDE", "PRIED", "PRIES", "PRIME", "PRINT", "PRIOR", - "PRISM", "PRIVY", "PRIZE", "PROBE", "PRONE", "PROOF", "PROPS", "PROSE", "PROSY", "PROUD", "PROVE", "PROWL", - "PROWS", "PROXY", "PRUDE", "PRUNE", "PSALM", "PSHAW", "PUDGY", "PUFFS", "PUFFY", "PULLS", "PULPY", "PULSE", - "PUMPS", "PUNCH", "PUPIL", "PUPPY", "PUREE", "PURER", "PURGE", "PURSE", "PUSSY", "PUTTY", "QUACK", "QUAFF", - "QUAIL", "QUAKE", "QUALM", "QUART", "QUASI", "QUAYS", "QUEEN", "QUEER", "QUELL", "QUERY", "QUEST", "QUEUE", - "QUICK", "QUIET", "QUILL", "QUILT", "QUIPS", "QUIRE", "QUITE", "QUITS", "QUOTA", "QUOTE", "QUOTH", "RABBI", - "RABID", "RACED", "RACER", "RACES", "RACKS", "RADII", "RADIO", "RAFTS", "RAGED", "RAGES", "RAIDS", "RAILS", - "RAINS", "RAINY", "RAISE", "RAJAH", "RAKED", "RAKES", "RALLY", "RANCH", "RANGE", "RANKS", "RAPID", "RARER", - "RARES", "RATED", "RATES", "RATIO", "RAVED", "RAVEN", "RAVES", "RAYON", "RAZED", "RAZOR", "REACH", "REACT", - "READS", "READY", "REALM", "REALS", "REAMS", "REAPS", "REARS", "REBEL", "REBUS", "REBUT", "RECUR", "REEDS", - "REEDY", "REEFS", "REEKS", "REELS", "REEVE", "REFER", "REFIT", "REGAL", "REIGN", "REINS", "RELAX", "RELAY", - "RELIC", "REMIT", "RENDS", "RENEW", "RENTS", "REPAY", "REPEL", "REPLY", "RESET", "RESIN", "RESTS", "REVEL", - "REVUE", "RHEUM", "RHYME", "RICKS", "RIDER", "RIDES", "RIDGE", "RIFLE", "RIFTS", "RIGHT", "RIGID", "RILED", - "RILLS", "RIMES", "RINGS", "RINSE", "RIOTS", "RIPEN", "RIPER", "RISEN", "RISER", "RISES", "RISKS", "RISKY", - "RITES", "RIVAL", "RIVEN", "RIVER", "RIVET", "ROADS", "ROAMS", "ROARS", "ROAST", "ROBED", "ROBES", "ROBIN", - "ROCKS", "ROCKY", "ROGUE", "ROLES", "ROLLS", "ROMAN", "ROOFS", "ROOKS", "ROOMS", "ROOMY", "ROOST", "ROOTS", - "ROPED", "ROPES", "ROSES", "ROSIN", "ROUGE", "ROUGH", "ROUND", "ROUSE", "ROUTE", "ROUTS", "ROVED", "ROVER", - "ROWDY", "ROWED", "ROYAL", "RUDER", "RUFFS", "RUINS", "RULED", "RULER", "RULES", "RUNES", "RUNGS", "RUPEE", - "RURAL", "RUSES", "SABLE", "SABRE", "SACKS", "SADLY", "SAFER", "SAGAS", "SAGES", "SAHIB", "SAILS", "SAINT", - "SAITH", "SALAD", "SALES", "SALLY", "SALON", "SALSA", "SALTS", "SALTY", "SALVE", "SALVO", "SANDS", "SANDY", - "SANER", "SATED", "SATIN", "SATYR", "SAUCE", "SAUCY", "SAVED", "SAVES", "SAWED", "SCALD", "SCALE", "SCALP", - "SCALY", "SCAMP", "SCANS", "SCANT", "SCARE", "SCARF", "SCARS", "SCENE", "SCENT", "SCION", "SCOFF", "SCOLD", - "SCOOP", "SCOPE", "SCORE", "SCORN", "SCOUR", "SCOUT", "SCOWL", "SCRAP", "SCREW", "SCRIP", "SCRUB", "SCULL", - "SEALS", "SEAMS", "SEAMY", "SEATS", "SECTS", "SEDAN", "SEDGE", "SEEDS", "SEEDY", "SEEKS", "SEEMS", "SEERS", - "SEIZE", "SELLS", "SEMEN", "SENDS", "SENSE", "SERFS", "SERGE", "SERUM", "SERVE", "SEVEN", "SEVER", "SEWED", - "SEWER", "SEXES", "SHACK", "SHADE", "SHADY", "SHAFT", "SHAKE", "SHAKY", "SHALE", "SHALL", "SHALT", "SHAME", - "SHAMS", "SHANK", "SHAPE", "SHARE", "SHARK", "SHARP", "SHAVE", "SHAWL", "SHEAF", "SHEAR", "SHEDS", "SHEEN", - "SHEEP", "SHEER", "SHEET", "SHEIK", "SHELF", "SHELL", "SHIED", "SHIFT", "SHINE", "SHINS", "SHINY", "SHIPS", - "SHIRE", "SHIRK", "SHIRT", "SHOAL", "SHOCK", "SHOES", "SHONE", "SHOOK", "SHOON", "SHOOT", "SHOPS", "SHORE", - "SHORN", "SHORT", "SHOTS", "SHOUT", "SHOVE", "SHOWN", "SHOWS", "SHOWY", "SHRED", "SHREW", "SHRUB", "SHRUG", - "SHUNS", "SHUTS", "SHYLY", "SIBYL", "SIDED", "SIDES", "SIEGE", "SIEVE", "SIGHS", "SIGHT", "SIGMA", "SIGNS", - "SILKS", "SILKY", "SILLS", "SILLY", "SINCE", "SINEW", "SINGE", "SINGS", "SINKS", "SIREN", "SIRES", "SITES", - "SIXES", "SIXTH", "SIXTY", "SIZED", "SIZES", "SKATE", "SKEIN", "SKIES", "SKIFF", "SKILL", "SKIMS", "SKINS", - "SKIPS", "SKIRT", "SKULK", "SKULL", "SKUNK", "SLABS", "SLACK", "SLAGS", "SLAIN", "SLAKE", "SLANG", "SLANT", - "SLAPS", "SLASH", "SLATE", "SLATS", "SLAVE", "SLAYS", "SLEDS", "SLEEK", "SLEEP", "SLEET", "SLEPT", "SLICE", - "SLICK", "SLIDE", "SLILY", "SLIME", "SLIMY", "SLING", "SLINK", "SLIPS", "SLITS", "SLOOP", "SLOPE", "SLOPS", - "SLOTH", "SLUGS", "SLUMP", "SLUMS", "SLUNG", "SLUNK", "SLUSH", "SLYLY", "SMACK", "SMALL", "SMART", "SMASH", - "SMEAR", "SMELL", "SMELT", "SMILE", "SMIRK", "SMITE", "SMITH", "SMOCK", "SMOKE", "SMOKY", "SMOTE", "SNACK", - "SNAGS", "SNAIL", "SNAKE", "SNAKY", "SNAPS", "SNARE", "SNARL", "SNEAK", "SNEER", "SNIFF", "SNIPE", "SNOBS", - "SNORE", "SNORT", "SNOUT", "SNOWS", "SNOWY", "SNUFF", "SOAPY", "SOARS", "SOBER", "SOCKS", "SOFAS", "SOGGY", - "SOILS", "SOLAR", "SOLES", "SOLID", "SOLOS", "SOLVE", "SONGS", "SONNY", "SOOTH", "SOOTY", "SORES", "SORRY", - "SORTS", "SOUGH", "SOULS", "SOUND", "SOUPS", "SOUSE", "SOUTH", "SOWED", "SOWER", "SPACE", "SPADE", "SPAKE", - "SPANK", "SPANS", "SPARE", "SPARK", "SPARS", "SPASM", "SPAWN", "SPEAK", "SPEAR", "SPECK", "SPEED", "SPELL", - "SPELT", "SPEND", "SPENT", "SPERM", "SPICE", "SPICY", "SPIED", "SPIES", "SPIKE", "SPILL", "SPILT", "SPINE", - "SPINS", "SPINY", "SPIRE", "SPITE", "SPITS", "SPLIT", "SPOIL", "SPOKE", "SPOOK", "SPOOL", "SPOON", "SPOOR", - "SPORE", "SPORT", "SPOTS", "SPOUT", "SPRAY", "SPREE", "SPRIG", "SPUNK", "SPURN", "SPURS", "SPURT", "SQUAD", - "SQUAT", "SQUAW", "STABS", "STACK", "STAFF", "STAGE", "STAGS", "STAID", "STAIN", "STAIR", "STAKE", "STALE", - "STALK", "STALL", "STAMP", "STAND", "STANK", "STARE", "STARK", "STARS", "START", "STATE", "STAVE", "STAYS", - "STEAD", "STEAK", "STEAL", "STEAM", "STEED", "STEEL", "STEEP", "STEER", "STEMS", "STEPS", "STERN", "STEWS", - "STICK", "STIFF", "STILE", "STILL", "STING", "STINK", "STINT", "STIRS", "STOCK", "STOIC", "STOLE", "STONE", - "STONY", "STOOD", "STOOL", "STOOP", "STOPS", "STORE", "STORK", "STORM", "STORY", "STOUT", "STOVE", "STRAP", - "STRAW", "STRAY", "STREW", "STRIP", "STRUT", "STUCK", "STUDS", "STUDY", "STUFF", "STUMP", "STUNG", "STUNT", - "STYLE", "SUAVE", "SUCKS", "SUGAR", "SUING", "SUITE", "SUITS", "SULKS", "SULKY", "SULLY", "SUNNY", "SUPER", - "SURER", "SURGE", "SURLY", "SWAIN", "SWAMP", "SWANS", "SWARD", "SWARM", "SWAYS", "SWEAR", "SWEAT", "SWEEP", - "SWEET", "SWELL", "SWEPT", "SWIFT", "SWILL", "SWIMS", "SWINE", "SWING", "SWIRL", "SWISH", "SWOON", "SWOOP", - "SWORD", "SWORE", "SWORN", "SWUNG", "SYNOD", "SYRUP", "TABBY", "TABLE", "TABOO", "TACIT", "TACKS", "TAILS", - "TAINT", "TAKEN", "TAKES", "TALES", "TALKS", "TALLY", "TALON", "TAMED", "TAMER", "TANKS", "TAPER", "TAPES", - "TARDY", "TARES", "TARRY", "TARTS", "TASKS", "TASTE", "TASTY", "TAUNT", "TAWNY", "TAXED", "TAXES", "TEACH", - "TEAMS", "TEARS", "TEASE", "TEEMS", "TEENS", "TEETH", "TELLS", "TEMPI", "TEMPO", "TEMPS", "TENDS", "TENET", - "TENOR", "TENSE", "TENTH", "TENTS", "TEPEE", "TEPID", "TERMS", "TERSE", "TESTS", "TESTY", "TEXTS", "THANK", - "THEFT", "THEIR", "THEME", "THERE", "THESE", "THICK", "THIEF", "THIGH", "THINE", "THING", "THINK", "THIRD", - "THONG", "THORN", "THOSE", "THREE", "THREW", "THROB", "THROE", "THROW", "THUMB", "THUMP", "THYME", "TIARA", - "TIBIA", "TICKS", "TIDAL", "TIDES", "TIERS", "TIGER", "TIGHT", "TILDE", "TILED", "TILES", "TILLS", "TILTS", - "TIMED", "TIMES", "TIMID", "TINGE", "TINTS", "TIPSY", "TIRED", "TIRES", "TITHE", "TITLE", "TOADS", "TOAST", - "TODAY", "TODDY", "TOILS", "TOKEN", "TOLLS", "TOMBS", "TOMES", "TONED", "TONES", "TONGS", "TONIC", "TOOLS", - "TOOTH", "TOPAZ", "TOPIC", "TOQUE", "TORCH", "TORSO", "TORTS", "TOTAL", "TOTEM", "TOUCH", "TOUGH", "TOURS", - "TOWED", "TOWEL", "TOWER", "TOWNS", "TOXIC", "TOYED", "TRACE", "TRACK", "TRACT", "TRADE", "TRAIL", "TRAIN", - "TRAIT", "TRAMP", "TRAMS", "TRAPS", "TRASH", "TRAYS", "TREAD", "TREAT", "TREED", "TREES", "TREND", "TRESS", - "TRIAD", "TRIAL", "TRIBE", "TRICE", "TRICK", "TRIED", "TRIES", "TRILL", "TRIPE", "TRIPS", "TRITE", "TROLL", - "TROOP", "TROTH", "TROTS", "TROUT", "TRUCE", "TRUCK", "TRUER", "TRULY", "TRUMP", "TRUNK", "TRUSS", "TRUST", - "TRUTH", "TRYST", "TUBES", "TUFTS", "TULIP", "TULLE", "TUNED", "TUNES", "TUNIC", "TURNS", "TUSKS", "TUTOR", - "TWAIN", "TWANG", "TWEED", "TWICE", "TWIGS", "TWINE", "TWINS", "TWIRL", "TWIST", "TYING", "TYPED", "TYPES", - "UDDER", "ULCER", "ULTRA", "UNCLE", "UNCUT", "UNDER", "UNDID", "UNDUE", "UNFIT", "UNION", "UNITE", "UNITS", - "UNITY", "UNSAY", "UNTIE", "UNTIL", "UPPER", "UPSET", "URBAN", "URGED", "URGES", "URINE", "USAGE", "USERS", - "USHER", "USING", "USUAL", "USURP", "USURY", "UTTER", "VAGUE", "VALES", "VALET", "VALID", "VALUE", "VALVE", - "VANES", "VAPID", "VASES", "VAULT", "VAUNT", "VEILS", "VEINS", "VELDT", "VENAL", "VENOM", "VENTS", "VENUE", - "VERBS", "VERGE", "VERSE", "VERVE", "VESTS", "VEXED", "VEXES", "VIALS", "VICAR", "VICES", "VIDEO", "VIEWS", - "VIGIL", "VILER", "VILLA", "VINES", "VIOLA", "VIPER", "VIRUS", "VISIT", "VISOR", "VISTA", "VITAL", "VIVID", - "VIXEN", "VIZOR", "VOCAL", "VODKA", "VOGUE", "VOICE", "VOILE", "VOLTS", "VOMIT", "VOTED", "VOTER", "VOTES", - "VOUCH", "VOWED", "VOWEL", "VYING", "WADED", "WAFER", "WAFTS", "WAGED", "WAGER", "WAGES", "WAGON", "WAIFS", - "WAILS", "WAIST", "WAITS", "WAIVE", "WAKED", "WAKEN", "WAKES", "WALKS", "WALLS", "WALTZ", "WANDS", "WANED", - "WANES", "WANTS", "WARDS", "WARES", "WARMS", "WARNS", "WARTS", "WASPS", "WASTE", "WATCH", "WATER", "WAVED", - "WAVER", "WAVES", "WAXED", "WAXEN", "WAXES", "WEARS", "WEARY", "WEAVE", "WEDGE", "WEEDS", "WEEDY", "WEEKS", - "WEEPS", "WEIGH", "WEIRD", "WELCH", "WELLS", "WENCH", "WHACK", "WHALE", "WHARF", "WHEAT", "WHEEL", "WHELP", - "WHERE", "WHICH", "WHIFF", "WHILE", "WHIMS", "WHINE", "WHIPS", "WHIRL", "WHIRR", "WHISK", "WHIST", "WHITE", - "WHOLE", "WHOOP", "WHORE", "WHOSE", "WICKS", "WIDEN", "WIDER", "WIDOW", "WIDTH", "WIELD", "WIGHT", "WILDS", - "WILES", "WILLS", "WINCE", "WINCH", "WINDS", "WINDY", "WINES", "WINGS", "WINKS", "WIPED", "WIPES", "WIRED", - "WIRES", "WISER", "WISPS", "WITCH", "WITTY", "WIVES", "WOMAN", "WOMEN", "WOODS", "WOODY", "WOOED", "WOOER", - "WORDS", "WORDY", "WORKS", "WORLD", "WORMS", "WORRY", "WORSE", "WORST", "WORTH", "WOULD", "WOUND", "WRACK", - "WRAPS", "WRAPT", "WRATH", "WREAK", "WRECK", "WREST", "WRING", "WRIST", "WRITE", "WRITS", "WRONG", "WROTE", - "WROTH", "YACHT", "YARDS", "YARNS", "YAWNS", "YEARN", "YEARS", "YEAST", "YELLS", "YELPS", "YIELD", "YOKED", - "YOKES", "YOLKS", "YOUNG", "YOURS", "YOUTH", "ZEBRA", "ZONES", "COLOR", "LASER", "SONIC", +source_link = "https://matthewminer.name/projects/calculators/wordle-words-left/" +valid_list = [ + "CIGAR", "REBUT", "SISSY", "HUMPH", "AWAKE", "BLUSH", "FOCAL", "EVADE", "NAVAL", "SERVE", "HEATH", "DWARF", + "MODEL", "KARMA", "STINK", "GRADE", "QUIET", "BENCH", "ABATE", "FEIGN", "MAJOR", "DEATH", "FRESH", "CRUST", + "STOOL", "COLON", "ABASE", "MARRY", "REACT", "BATTY", "PRIDE", "FLOSS", "HELIX", "CROAK", "STAFF", "PAPER", + "UNFED", "WHELP", "TRAWL", "OUTDO", "ADOBE", "CRAZY", "SOWER", "REPAY", "DIGIT", "CRATE", "CLUCK", "SPIKE", + "MIMIC", "POUND", "MAXIM", "LINEN", "UNMET", "FLESH", "BOOBY", "FORTH", "FIRST", "STAND", "BELLY", "IVORY", + "SEEDY", "PRINT", "YEARN", "DRAIN", "BRIBE", "STOUT", "PANEL", "CRASS", "FLUME", "OFFAL", "AGREE", "ERROR", + "SWIRL", "ARGUE", "BLEED", "DELTA", "FLICK", "TOTEM", "WOOER", "FRONT", "SHRUB", "PARRY", "BIOME", "LAPEL", + "START", "GREET", "GONER", "GOLEM", "LUSTY", "LOOPY", "ROUND", "AUDIT", "LYING", "GAMMA", "LABOR", "ISLET", + "CIVIC", "FORGE", "CORNY", "MOULT", "BASIC", "SALAD", "AGATE", "SPICY", "SPRAY", "ESSAY", "FJORD", "SPEND", + "KEBAB", "GUILD", "ABACK", "MOTOR", "ALONE", "HATCH", "HYPER", "THUMB", "DOWRY", "OUGHT", "BELCH", "DUTCH", + "PILOT", "TWEED", "COMET", "JAUNT", "ENEMA", "STEED", "ABYSS", "GROWL", "FLING", "DOZEN", "BOOZY", "ERODE", + "WORLD", "GOUGE", "CLICK", "BRIAR", "GREAT", "ALTAR", "PULPY", "BLURT", "COAST", "DUCHY", "GROIN", "FIXER", + "GROUP", "ROGUE", "BADLY", "SMART", "PITHY", "GAUDY", "CHILL", "HERON", "VODKA", "FINER", "SURER", "RADIO", + "ROUGE", "PERCH", "RETCH", "WROTE", "CLOCK", "TILDE", "STORE", "PROVE", "BRING", "SOLVE", "CHEAT", "GRIME", + "EXULT", "USHER", "EPOCH", "TRIAD", "BREAK", "RHINO", "VIRAL", "CONIC", "MASSE", "SONIC", "VITAL", "TRACE", + "USING", "PEACH", "CHAMP", "BATON", "BRAKE", "PLUCK", "CRAZE", "GRIPE", "WEARY", "PICKY", "ACUTE", "FERRY", + "ASIDE", "TAPIR", "TROLL", "UNIFY", "REBUS", "BOOST", "TRUSS", "SIEGE", "TIGER", "BANAL", "SLUMP", "CRANK", + "GORGE", "QUERY", "DRINK", "FAVOR", "ABBEY", "TANGY", "PANIC", "SOLAR", "SHIRE", "PROXY", "POINT", "ROBOT", + "PRICK", "WINCE", "CRIMP", "KNOLL", "SUGAR", "WHACK", "MOUNT", "PERKY", "COULD", "WRUNG", "LIGHT", "THOSE", + "MOIST", "SHARD", "PLEAT", "ALOFT", "SKILL", "ELDER", "FRAME", "HUMOR", "PAUSE", "ULCER", "ULTRA", "ROBIN", + "CYNIC", "AROMA", "CAULK", "SHAKE", "DODGE", "SWILL", "TACIT", "OTHER", "THORN", "TROVE", "BLOKE", "VIVID", + "SPILL", "CHANT", "CHOKE", "RUPEE", "NASTY", "MOURN", "AHEAD", "BRINE", "CLOTH", "HOARD", "SWEET", "MONTH", + "LAPSE", "WATCH", "TODAY", "FOCUS", "SMELT", "TEASE", "CATER", "MOVIE", "SAUTE", "ALLOW", "RENEW", "THEIR", + "SLOSH", "PURGE", "CHEST", "DEPOT", "EPOXY", "NYMPH", "FOUND", "SHALL", "STOVE", "LOWLY", "SNOUT", "TROPE", + "FEWER", "SHAWL", "NATAL", "COMMA", "FORAY", "SCARE", "STAIR", "BLACK", "SQUAD", "ROYAL", "CHUNK", "MINCE", + "SHAME", "CHEEK", "AMPLE", "FLAIR", "FOYER", "CARGO", "OXIDE", "PLANT", "OLIVE", "INERT", "ASKEW", "HEIST", + "SHOWN", "ZESTY", "TRASH", "LARVA", "FORGO", "STORY", "HAIRY", "TRAIN", "HOMER", "BADGE", "MIDST", "CANNY", + "SHINE", "GECKO", "FARCE", "SLUNG", "TIPSY", "METAL", "YIELD", "DELVE", "BEING", "SCOUR", "GLASS", "GAMER", + "SCRAP", "MONEY", "HINGE", "ALBUM", "VOUCH", "ASSET", "TIARA", "CREPT", "BAYOU", "ATOLL", "MANOR", "CREAK", + "SHOWY", "PHASE", "FROTH", "DEPTH", "GLOOM", "FLOOD", "TRAIT", "GIRTH", "PIETY", "GOOSE", "FLOAT", "DONOR", + "ATONE", "PRIMO", "APRON", "BLOWN", "CACAO", "LOSER", "INPUT", "GLOAT", "AWFUL", "BRINK", "SMITE", "BEADY", + "RUSTY", "RETRO", "DROLL", "GAWKY", "HUTCH", "PINTO", "EGRET", "LILAC", "SEVER", "FIELD", "FLUFF", "AGAPE", + "VOICE", "STEAD", "BERTH", "MADAM", "NIGHT", "BLAND", "LIVER", "WEDGE", "ROOMY", "WACKY", "FLOCK", "ANGRY", + "TRITE", "APHID", "TRYST", "MIDGE", "POWER", "ELOPE", "CINCH", "MOTTO", "STOMP", "UPSET", "BLUFF", "CRAMP", + "QUART", "COYLY", "YOUTH", "RHYME", "BUGGY", "ALIEN", "SMEAR", "UNFIT", "PATTY", "CLING", "GLEAN", "LABEL", + "HUNKY", "KHAKI", "POKER", "GRUEL", "TWICE", "TWANG", "SHRUG", "TREAT", "WASTE", "MERIT", "WOVEN", "NEEDY", + "CLOWN", "IRONY", "RUDER", "GAUZE", "CHIEF", "ONSET", "PRIZE", "FUNGI", "CHARM", "GULLY", "INTER", "WHOOP", + "TAUNT", "LEERY", "CLASS", "THEME", "LOFTY", "TIBIA", "BOOZE", "ALPHA", "THYME", "DOUBT", "PARER", "CHUTE", + "STICK", "TRICE", "ALIKE", "RECAP", "SAINT", "GLORY", "GRATE", "ADMIT", "BRISK", "SOGGY", "USURP", "SCALD", + "SCORN", "LEAVE", "TWINE", "STING", "BOUGH", "MARSH", "SLOTH", "DANDY", "VIGOR", "HOWDY", "ENJOY", "VALID", + "IONIC", "EQUAL", "FLOOR", "CATCH", "SPADE", "STEIN", "EXIST", "QUIRK", "DENIM", "GROVE", "SPIEL", "MUMMY", + "FAULT", "FOGGY", "FLOUT", "CARRY", "SNEAK", "LIBEL", "WALTZ", "APTLY", "PINEY", "INEPT", "ALOUD", "PHOTO", + "DREAM", "STALE", "UNITE", "SNARL", "BAKER", "THERE", "GLYPH", "POOCH", "HIPPY", "SPELL", "FOLLY", "LOUSE", + "GULCH", "VAULT", "GODLY", "THREW", "FLEET", "GRAVE", "INANE", "SHOCK", "CRAVE", "SPITE", "VALVE", "SKIMP", + "CLAIM", "RAINY", "MUSTY", "PIQUE", "DADDY", "QUASI", "ARISE", "AGING", "VALET", "OPIUM", "AVERT", "STUCK", + "RECUT", "MULCH", "GENRE", "PLUME", "RIFLE", "COUNT", "INCUR", "TOTAL", "WREST", "MOCHA", "DETER", "STUDY", + "LOVER", "SAFER", "RIVET", "FUNNY", "SMOKE", "MOUND", "UNDUE", "SEDAN", "PAGAN", "SWINE", "GUILE", "GUSTY", + "EQUIP", "TOUGH", "CANOE", "CHAOS", "COVET", "HUMAN", "UDDER", "LUNCH", "BLAST", "STRAY", "MANGA", "MELEE", + "LEFTY", "QUICK", "PASTE", "GIVEN", "OCTET", "RISEN", "GROAN", "LEAKY", "GRIND", "CARVE", "LOOSE", "SADLY", + "SPILT", "APPLE", "SLACK", "HONEY", "FINAL", "SHEEN", "EERIE", "MINTY", "SLICK", "DERBY", "WHARF", "SPELT", + "COACH", "ERUPT", "SINGE", "PRICE", "SPAWN", "FAIRY", "JIFFY", "FILMY", "STACK", "CHOSE", "SLEEP", "ARDOR", + "NANNY", "NIECE", "WOOZY", "HANDY", "GRACE", "DITTO", "STANK", "CREAM", "USUAL", "DIODE", "VALOR", "ANGLE", + "NINJA", "MUDDY", "CHASE", "REPLY", "PRONE", "SPOIL", "HEART", "SHADE", "DINER", "ARSON", "ONION", "SLEET", + "DOWEL", "COUCH", "PALSY", "BOWEL", "SMILE", "EVOKE", "CREEK", "LANCE", "EAGLE", "IDIOT", "SIREN", "BUILT", + "EMBED", "AWARD", "DROSS", "ANNUL", "GOODY", "FROWN", "PATIO", "LADEN", "HUMID", "ELITE", "LYMPH", "EDIFY", + "MIGHT", "RESET", "VISIT", "GUSTO", "PURSE", "VAPOR", "CROCK", "WRITE", "SUNNY", "LOATH", "CHAFF", "SLIDE", + "QUEER", "VENOM", "STAMP", "SORRY", "STILL", "ACORN", "APING", "PUSHY", "TAMER", "HATER", "MANIA", "AWOKE", + "BRAWN", "SWIFT", "EXILE", "BIRCH", "LUCKY", "FREER", "RISKY", "GHOST", "PLIER", "LUNAR", "WINCH", "SNARE", + "NURSE", "HOUSE", "BORAX", "NICER", "LURCH", "EXALT", "ABOUT", "SAVVY", "TOXIN", "TUNIC", "PRIED", "INLAY", + "CHUMP", "LANKY", "CRESS", "EATER", "ELUDE", "CYCLE", "KITTY", "BOULE", "MORON", "TENET", "PLACE", "LOBBY", + "PLUSH", "VIGIL", "INDEX", "BLINK", "CLUNG", "QUALM", "CROUP", "CLINK", "JUICY", "STAGE", "DECAY", "NERVE", + "FLIER", "SHAFT", "CROOK", "CLEAN", "CHINA", "RIDGE", "VOWEL", "GNOME", "SNUCK", "ICING", "SPINY", "RIGOR", + "SNAIL", "FLOWN", "RABID", "PROSE", "THANK", "POPPY", "BUDGE", "FIBER", "MOLDY", "DOWDY", "KNEEL", "TRACK", + "CADDY", "QUELL", "DUMPY", "PALER", "SWORE", "REBAR", "SCUBA", "SPLAT", "FLYER", "HORNY", "MASON", "DOING", + "OZONE", "AMPLY", "MOLAR", "OVARY", "BESET", "QUEUE", "CLIFF", "MAGIC", "TRUCE", "SPORT", "FRITZ", "EDICT", + "TWIRL", "VERSE", "LLAMA", "EATEN", "RANGE", "WHISK", "HOVEL", "REHAB", "MACAW", "SIGMA", "SPOUT", "VERVE", + "SUSHI", "DYING", "FETID", "BRAIN", "BUDDY", "THUMP", "SCION", "CANDY", "CHORD", "BASIN", "MARCH", "CROWD", + "ARBOR", "GAYLY", "MUSKY", "STAIN", "DALLY", "BLESS", "BRAVO", "STUNG", "TITLE", "RULER", "KIOSK", "BLOND", + "ENNUI", "LAYER", "FLUID", "TATTY", "SCORE", "CUTIE", "ZEBRA", "BARGE", "MATEY", "BLUER", "AIDER", "SHOOK", + "RIVER", "PRIVY", "BETEL", "FRISK", "BONGO", "BEGUN", "AZURE", "WEAVE", "GENIE", "SOUND", "GLOVE", "BRAID", + "SCOPE", "WRYLY", "ROVER", "ASSAY", "OCEAN", "BLOOM", "IRATE", "LATER", "WOKEN", "SILKY", "WRECK", "DWELT", + "SLATE", "SMACK", "SOLID", "AMAZE", "HAZEL", "WRIST", "JOLLY", "GLOBE", "FLINT", "ROUSE", "CIVIL", "VISTA", + "RELAX", "COVER", "ALIVE", "BEECH", "JETTY", "BLISS", "VOCAL", "OFTEN", "DOLLY", "EIGHT", "JOKER", "SINCE", + "EVENT", "ENSUE", "SHUNT", "DIVER", "POSER", "WORST", "SWEEP", "ALLEY", "CREED", "ANIME", "LEAFY", "BOSOM", + "DUNCE", "STARE", "PUDGY", "WAIVE", "CHOIR", "STOOD", "SPOKE", "OUTGO", "DELAY", "BILGE", "IDEAL", "CLASP", + "SEIZE", "HOTLY", "LAUGH", "SIEVE", "BLOCK", "MEANT", "GRAPE", "NOOSE", "HARDY", "SHIED", "DRAWL", "DAISY", + "PUTTY", "STRUT", "BURNT", "TULIP", "CRICK", "IDYLL", "VIXEN", "FUROR", "GEEKY", "COUGH", "NAIVE", "SHOAL", + "STORK", "BATHE", "AUNTY", "CHECK", "PRIME", "BRASS", "OUTER", "FURRY", "RAZOR", "ELECT", "EVICT", "IMPLY", + "DEMUR", "QUOTA", "HAVEN", "CAVIL", "SWEAR", "CRUMP", "DOUGH", "GAVEL", "WAGON", "SALON", "NUDGE", "HAREM", + "PITCH", "SWORN", "PUPIL", "EXCEL", "STONY", "CABIN", "UNZIP", "QUEEN", "TROUT", "POLYP", "EARTH", "STORM", + "UNTIL", "TAPER", "ENTER", "CHILD", "ADOPT", "MINOR", "FATTY", "HUSKY", "BRAVE", "FILET", "SLIME", "GLINT", + "TREAD", "STEAL", "REGAL", "GUEST", "EVERY", "MURKY", "SHARE", "SPORE", "HOIST", "BUXOM", "INNER", "OTTER", + "DIMLY", "LEVEL", "SUMAC", "DONUT", "STILT", "ARENA", "SHEET", "SCRUB", "FANCY", "SLIMY", "PEARL", "SILLY", + "PORCH", "DINGO", "SEPIA", "AMBLE", "SHADY", "BREAD", "FRIAR", "REIGN", "DAIRY", "QUILL", "CROSS", "BROOD", + "TUBER", "SHEAR", "POSIT", "BLANK", "VILLA", "SHANK", "PIGGY", "FREAK", "WHICH", "AMONG", "FECAL", "SHELL", + "WOULD", "ALGAE", "LARGE", "RABBI", "AGONY", "AMUSE", "BUSHY", "COPSE", "SWOON", "KNIFE", "POUCH", "ASCOT", + "PLANE", "CROWN", "URBAN", "SNIDE", "RELAY", "ABIDE", "VIOLA", "RAJAH", "STRAW", "DILLY", "CRASH", "AMASS", + "THIRD", "TRICK", "TUTOR", "WOODY", "BLURB", "GRIEF", "DISCO", "WHERE", "SASSY", "BEACH", "SAUNA", "COMIC", + "CLUED", "CREEP", "CASTE", "GRAZE", "SNUFF", "FROCK", "GONAD", "DRUNK", "PRONG", "LURID", "STEEL", "HALVE", + "BUYER", "VINYL", "UTILE", "SMELL", "ADAGE", "WORRY", "TASTY", "LOCAL", "TRADE", "FINCH", "ASHEN", "MODAL", + "GAUNT", "CLOVE", "ENACT", "ADORN", "ROAST", "SPECK", "SHEIK", "MISSY", "GRUNT", "SNOOP", "PARTY", "TOUCH", + "MAFIA", "EMCEE", "ARRAY", "SOUTH", "VAPID", "JELLY", "SKULK", "ANGST", "TUBAL", "LOWER", "CREST", "SWEAT", + "CYBER", "ADORE", "TARDY", "SWAMI", "NOTCH", "GROOM", "ROACH", "HITCH", "YOUNG", "ALIGN", "READY", "FROND", + "STRAP", "PUREE", "REALM", "VENUE", "SWARM", "OFFER", "SEVEN", "DRYER", "DIARY", "DRYLY", "DRANK", "ACRID", + "HEADY", "THETA", "JUNTO", "PIXIE", "QUOTH", "BONUS", "SHALT", "PENNE", "AMEND", "DATUM", "BUILD", "PIANO", + "SHELF", "LODGE", "SUING", "REARM", "CORAL", "RAMEN", "WORTH", "PSALM", "INFER", "OVERT", "MAYOR", "OVOID", + "GLIDE", "USAGE", "POISE", "RANDY", "CHUCK", "PRANK", "FISHY", "TOOTH", "ETHER", "DROVE", "IDLER", "SWATH", + "STINT", "WHILE", "BEGAT", "APPLY", "SLANG", "TAROT", "RADAR", "CREDO", "AWARE", "CANON", "SHIFT", "TIMER", + "BYLAW", "SERUM", "THREE", "STEAK", "ILIAC", "SHIRK", "BLUNT", "PUPPY", "PENAL", "JOIST", "BUNNY", "SHAPE", + "BEGET", "WHEEL", "ADEPT", "STUNT", "STOLE", "TOPAZ", "CHORE", "FLUKE", "AFOOT", "BLOAT", "BULLY", "DENSE", + "CAPER", "SNEER", "BOXER", "JUMBO", "LUNGE", "SPACE", "AVAIL", "SHORT", "SLURP", "LOYAL", "FLIRT", "PIZZA", + "CONCH", "TEMPO", "DROOP", "PLATE", "BIBLE", "PLUNK", "AFOUL", "SAVOY", "STEEP", "AGILE", "STAKE", "DWELL", + "KNAVE", "BEARD", "AROSE", "MOTIF", "SMASH", "BROIL", "GLARE", "SHOVE", "BAGGY", "MAMMY", "SWAMP", "ALONG", + "RUGBY", "WAGER", "QUACK", "SQUAT", "SNAKY", "DEBIT", "MANGE", "SKATE", "NINTH", "JOUST", "TRAMP", "SPURN", + "MEDAL", "MICRO", "REBEL", "FLANK", "LEARN", "NADIR", "MAPLE", "COMFY", "REMIT", "GRUFF", "ESTER", "LEAST", + "MOGUL", "FETCH", "CAUSE", "OAKEN", "AGLOW", "MEATY", "GAFFE", "SHYLY", "RACER", "PROWL", "THIEF", "STERN", + "POESY", "ROCKY", "TWEET", "WAIST", "SPIRE", "GROPE", "HAVOC", "PATSY", "TRULY", "FORTY", "DEITY", "UNCLE", + "SWISH", "GIVER", "PREEN", "BEVEL", "LEMUR", "DRAFT", "SLOPE", "ANNOY", "LINGO", "BLEAK", "DITTY", "CURLY", + "CEDAR", "DIRGE", "GROWN", "HORDE", "DROOL", "SHUCK", "CRYPT", "CUMIN", "STOCK", "GRAVY", "LOCUS", "WIDER", + "BREED", "QUITE", "CHAFE", "CACHE", "BLIMP", "DEIGN", "FIEND", "LOGIC", "CHEAP", "ELIDE", "RIGID", "FALSE", + "RENAL", "PENCE", "ROWDY", "SHOOT", "BLAZE", "ENVOY", "POSSE", "BRIEF", "NEVER", "ABORT", "MOUSE", "MUCKY", + "SULKY", "FIERY", "MEDIA", "TRUNK", "YEAST", "CLEAR", "SKUNK", "SCALP", "BITTY", "CIDER", "KOALA", "DUVET", + "SEGUE", "CREME", "SUPER", "GRILL", "AFTER", "OWNER", "EMBER", "REACH", "NOBLY", "EMPTY", "SPEED", "GIPSY", + "RECUR", "SMOCK", "DREAD", "MERGE", "BURST", "KAPPA", "AMITY", "SHAKY", "HOVER", "CAROL", "SNORT", "SYNOD", + "FAINT", "HAUNT", "FLOUR", "CHAIR", "DETOX", "SHREW", "TENSE", "PLIED", "QUARK", "BURLY", "NOVEL", "WAXEN", + "STOIC", "JERKY", "BLITZ", "BEEFY", "LYRIC", "HUSSY", "TOWEL", "QUILT", "BELOW", "BINGO", "WISPY", "BRASH", + "SCONE", "TOAST", "EASEL", "SAUCY", "VALUE", "SPICE", "HONOR", "ROUTE", "SHARP", "BAWDY", "RADII", "SKULL", + "PHONY", "ISSUE", "LAGER", "SWELL", "URINE", "GASSY", "TRIAL", "FLORA", "UPPER", "LATCH", "WIGHT", "BRICK", + "RETRY", "HOLLY", "DECAL", "GRASS", "SHACK", "DOGMA", "MOVER", "DEFER", "SOBER", "OPTIC", "CRIER", "VYING", + "NOMAD", "FLUTE", "HIPPO", "SHARK", "DRIER", "OBESE", "BUGLE", "TAWNY", "CHALK", "FEAST", "RUDDY", "PEDAL", + "SCARF", "CRUEL", "BLEAT", "TIDAL", "SLUSH", "SEMEN", "WINDY", "DUSTY", "SALLY", "IGLOO", "NERDY", "JEWEL", + "SHONE", "WHALE", "HYMEN", "ABUSE", "FUGUE", "ELBOW", "CRUMB", "PANSY", "WELSH", "SYRUP", "TERSE", "SUAVE", + "GAMUT", "SWUNG", "DRAKE", "FREED", "AFIRE", "SHIRT", "GROUT", "ODDLY", "TITHE", "PLAID", "DUMMY", "BROOM", + "BLIND", "TORCH", "ENEMY", "AGAIN", "TYING", "PESKY", "ALTER", "GAZER", "NOBLE", "ETHOS", "BRIDE", "EXTOL", + "DECOR", "HOBBY", "BEAST", "IDIOM", "UTTER", "THESE", "SIXTH", "ALARM", "ERASE", "ELEGY", "SPUNK", "PIPER", + "SCALY", "SCOLD", "HEFTY", "CHICK", "SOOTY", "CANAL", "WHINY", "SLASH", "QUAKE", "JOINT", "SWEPT", "PRUDE", + "HEAVY", "WIELD", "FEMME", "LASSO", "MAIZE", "SHALE", "SCREW", "SPREE", "SMOKY", "WHIFF", "SCENT", "GLADE", + "SPENT", "PRISM", "STOKE", "RIPER", "ORBIT", "COCOA", "GUILT", "HUMUS", "SHUSH", "TABLE", "SMIRK", "WRONG", + "NOISY", "ALERT", "SHINY", "ELATE", "RESIN", "WHOLE", "HUNCH", "PIXEL", "POLAR", "HOTEL", "SWORD", "CLEAT", + "MANGO", "RUMBA", "PUFFY", "FILLY", "BILLY", "LEASH", "CLOUT", "DANCE", "OVATE", "FACET", "CHILI", "PAINT", + "LINER", "CURIO", "SALTY", "AUDIO", "SNAKE", "FABLE", "CLOAK", "NAVEL", "SPURT", "PESTO", "BALMY", "FLASH", + "UNWED", "EARLY", "CHURN", "WEEDY", "STUMP", "LEASE", "WITTY", "WIMPY", "SPOOF", "SANER", "BLEND", "SALSA", + "THICK", "WARTY", "MANIC", "BLARE", "SQUIB", "SPOON", "PROBE", "CREPE", "KNACK", "FORCE", "DEBUT", "ORDER", + "HASTE", "TEETH", "AGENT", "WIDEN", "ICILY", "SLICE", "INGOT", "CLASH", "JUROR", "BLOOD", "ABODE", "THROW", + "UNITY", "PIVOT", "SLEPT", "TROOP", "SPARE", "SEWER", "PARSE", "MORPH", "CACTI", "TACKY", "SPOOL", "DEMON", + "MOODY", "ANNEX", "BEGIN", "FUZZY", "PATCH", "WATER", "LUMPY", "ADMIN", "OMEGA", "LIMIT", "TABBY", "MACHO", + "AISLE", "SKIFF", "BASIS", "PLANK", "VERGE", "BOTCH", "CRAWL", "LOUSY", "SLAIN", "CUBIC", "RAISE", "WRACK", + "GUIDE", "FOIST", "CAMEO", "UNDER", "ACTOR", "REVUE", "FRAUD", "HARPY", "SCOOP", "CLIMB", "REFER", "OLDEN", + "CLERK", "DEBAR", "TALLY", "ETHIC", "CAIRN", "TULLE", "GHOUL", "HILLY", "CRUDE", "APART", "SCALE", "OLDER", + "PLAIN", "SPERM", "BRINY", "ABBOT", "RERUN", "QUEST", "CRISP", "BOUND", "BEFIT", "DRAWN", "SUITE", "ITCHY", + "CHEER", "BAGEL", "GUESS", "BROAD", "AXIOM", "CHARD", "CAPUT", "LEANT", "HARSH", "CURSE", "PROUD", "SWING", + "OPINE", "TASTE", "LUPUS", "GUMBO", "MINER", "GREEN", "CHASM", "LIPID", "TOPIC", "ARMOR", "BRUSH", "CRANE", + "MURAL", "ABLED", "HABIT", "BOSSY", "MAKER", "DUSKY", "DIZZY", "LITHE", "BROOK", "JAZZY", "FIFTY", "SENSE", + "GIANT", "SURLY", "LEGAL", "FATAL", "FLUNK", "BEGAN", "PRUNE", "SMALL", "SLANT", "SCOFF", "TORUS", "NINNY", + "COVEY", "VIPER", "TAKEN", "MORAL", "VOGUE", "OWING", "TOKEN", "ENTRY", "BOOTH", "VOTER", "CHIDE", "ELFIN", + "EBONY", "NEIGH", "MINIM", "MELON", "KNEED", "DECOY", "VOILA", "ANKLE", "ARROW", "MUSHY", "TRIBE", "CEASE", + "EAGER", "BIRTH", "GRAPH", "ODDER", "TERRA", "WEIRD", "TRIED", "CLACK", "COLOR", "ROUGH", "WEIGH", "UNCUT", + "LADLE", "STRIP", "CRAFT", "MINUS", "DICEY", "TITAN", "LUCID", "VICAR", "DRESS", "DITCH", "GYPSY", "PASTA", + "TAFFY", "FLAME", "SWOOP", "ALOOF", "SIGHT", "BROKE", "TEARY", "CHART", "SIXTY", "WORDY", "SHEER", "LEPER", + "NOSEY", "BULGE", "SAVOR", "CLAMP", "FUNKY", "FOAMY", "TOXIC", "BRAND", "PLUMB", "DINGY", "BUTTE", "DRILL", + "TRIPE", "BICEP", "TENOR", "KRILL", "WORSE", "DRAMA", "HYENA", "THINK", "RATIO", "COBRA", "BASIL", "SCRUM", + "BUSED", "PHONE", "COURT", "CAMEL", "PROOF", "HEARD", "ANGEL", "PETAL", "POUTY", "THROB", "MAYBE", "FETAL", + "SPRIG", "SPINE", "SHOUT", "CADET", "MACRO", "DODGY", "SATYR", "RARER", "BINGE", "TREND", "NUTTY", "LEAPT", + "AMISS", "SPLIT", "MYRRH", "WIDTH", "SONAR", "TOWER", "BARON", "FEVER", "WAVER", "SPARK", "BELIE", "SLOOP", + "EXPEL", "SMOTE", "BALER", "ABOVE", "NORTH", "WAFER", "SCANT", "FRILL", "AWASH", "SNACK", "SCOWL", "FRAIL", + "DRIFT", "LIMBO", "FENCE", "MOTEL", "OUNCE", "WREAK", "REVEL", "TALON", "PRIOR", "KNELT", "CELLO", "FLAKE", + "DEBUG", "ANODE", "CRIME", "SALVE", "SCOUT", "IMBUE", "PINKY", "STAVE", "VAGUE", "CHOCK", "FIGHT", "VIDEO", + "STONE", "TEACH", "CLEFT", "FROST", "PRAWN", "BOOTY", "TWIST", "APNEA", "STIFF", "PLAZA", "LEDGE", "TWEAK", + "BOARD", "GRANT", "MEDIC", "BACON", "CABLE", "BRAWL", "SLUNK", "RASPY", "FORUM", "DRONE", "WOMEN", "MUCUS", + "BOAST", "TODDY", "COVEN", "TUMOR", "TRUER", "WRATH", "STALL", "STEAM", "AXIAL", "PURER", "DAILY", "TRAIL", + "NICHE", "MEALY", "JUICE", "NYLON", "PLUMP", "MERRY", "FLAIL", "PAPAL", "WHEAT", "BERRY", "COWER", "ERECT", + "BRUTE", "LEGGY", "SNIPE", "SINEW", "SKIER", "PENNY", "JUMPY", "RALLY", "UMBRA", "SCARY", "MODEM", "GROSS", + "AVIAN", "GREED", "SATIN", "TONIC", "PARKA", "SNIFF", "LIVID", "STARK", "TRUMP", "GIDDY", "REUSE", "TABOO", + "AVOID", "QUOTE", "DEVIL", "LIKEN", "GLOSS", "GAYER", "BERET", "NOISE", "GLAND", "DEALT", "SLING", "RUMOR", + "OPERA", "THIGH", "TONGA", "FLARE", "WOUND", "WHITE", "BULKY", "ETUDE", "HORSE", "CIRCA", "PADDY", "INBOX", + "FIZZY", "GRAIN", "EXERT", "SURGE", "GLEAM", "BELLE", "SALVO", "CRUSH", "FRUIT", "SAPPY", "TAKER", "TRACT", + "OVINE", "SPIKY", "FRANK", "REEDY", "FILTH", "SPASM", "HEAVE", "MAMBO", "RIGHT", "CLANK", "TRUST", "LUMEN", + "BORNE", "SPOOK", "SAUCE", "AMBER", "LATHE", "CARAT", "CORER", "DIRTY", "SLYLY", "AFFIX", "ALLOY", "TAINT", + "SHEEP", "KINKY", "WOOLY", "MAUVE", "FLUNG", "YACHT", "FRIED", "QUAIL", "BRUNT", "GRIMY", "CURVY", "CAGEY", + "RINSE", "DEUCE", "STATE", "GRASP", "MILKY", "BISON", "GRAFT", "SANDY", "BASTE", "FLASK", "HEDGE", "GIRLY", + "SWASH", "BONEY", "COUPE", "ENDOW", "ABHOR", "WELCH", "BLADE", "TIGHT", "GEESE", "MISER", "MIRTH", "CLOUD", + "CABAL", "LEECH", "CLOSE", "TENTH", "PECAN", "DROIT", "GRAIL", "CLONE", "GUISE", "RALPH", "TANGO", "BIDDY", + "SMITH", "MOWER", "PAYEE", "SERIF", "DRAPE", "FIFTH", "SPANK", "GLAZE", "ALLOT", "TRUCK", "KAYAK", "VIRUS", + "TESTY", "TEPEE", "FULLY", "ZONAL", "METRO", "CURRY", "GRAND", "BANJO", "AXION", "BEZEL", "OCCUR", "CHAIN", + "NASAL", "GOOEY", "FILER", "BRACE", "ALLAY", "PUBIC", "RAVEN", "PLEAD", "GNASH", "FLAKY", "MUNCH", "DULLY", + "EKING", "THING", "SLINK", "HURRY", "THEFT", "SHORN", "PYGMY", "RANCH", "WRING", "LEMON", "SHORE", "MAMMA", + "FROZE", "NEWER", "STYLE", "MOOSE", "ANTIC", "DROWN", "VEGAN", "CHESS", "GUPPY", "UNION", "LEVER", "LORRY", + "IMAGE", "CABBY", "DRUID", "EXACT", "TRUTH", "DOPEY", "SPEAR", "CRIED", "CHIME", "CRONY", "STUNK", "TIMID", + "BATCH", "GAUGE", "ROTOR", "CRACK", "CURVE", "LATTE", "WITCH", "BUNCH", "REPEL", "ANVIL", "SOAPY", "METER", + "BROTH", "MADLY", "DRIED", "SCENE", "KNOWN", "MAGMA", "ROOST", "WOMAN", "THONG", "PUNCH", "PASTY", "DOWNY", + "KNEAD", "WHIRL", "RAPID", "CLANG", "ANGER", "DRIVE", "GOOFY", "EMAIL", "MUSIC", "STUFF", "BLEEP", "RIDER", + "MECCA", "FOLIO", "SETUP", "VERSO", "QUASH", "FAUNA", "GUMMY", "HAPPY", "NEWLY", "FUSSY", "RELIC", "GUAVA", + "RATTY", "FUDGE", "FEMUR", "CHIRP", "FORTE", "ALIBI", "WHINE", "PETTY", "GOLLY", "PLAIT", "FLECK", "FELON", + "GOURD", "BROWN", "THRUM", "FICUS", "STASH", "DECRY", "WISER", "JUNTA", "VISOR", "DAUNT", "SCREE", "IMPEL", + "AWAIT", "PRESS", "WHOSE", "TURBO", "STOOP", "SPEAK", "MANGY", "EYING", "INLET", "CRONE", "PULSE", "MOSSY", + "STAID", "HENCE", "PINCH", "TEDDY", "SULLY", "SNORE", "RIPEN", "SNOWY", "ATTIC", "GOING", "LEACH", "MOUTH", + "HOUND", "CLUMP", "TONAL", "BIGOT", "PERIL", "PIECE", "BLAME", "HAUTE", "SPIED", "UNDID", "INTRO", "BASAL", + "RODEO", "GUARD", "STEER", "LOAMY", "SCAMP", "SCRAM", "MANLY", "HELLO", "VAUNT", "ORGAN", "FERAL", "KNOCK", + "EXTRA", "CONDO", "ADAPT", "WILLY", "POLKA", "RAYON", "SKIRT", "FAITH", "TORSO", "MATCH", "MERCY", "TEPID", + "SLEEK", "RISER", "TWIXT", "PEACE", "FLUSH", "CATTY", "LOGIN", "EJECT", "ROGER", "RIVAL", "UNTIE", "REFIT", + "AORTA", "ADULT", "JUDGE", "ROWER", "ARTSY", "RURAL", "SHAVE", "BOBBY", "ECLAT", "FELLA", "GAILY", "HARRY", + "HASTY", "HYDRO", "LIEGE", "OCTAL", "OMBRE", "PAYER", "SOOTH", "UNSET", "UNLIT", "VOMIT", "FANNY", "FETUS", + "BUTCH", "STALK", "FLACK", "WIDOW", "AUGUR", "LITER", ] -expanded_list = [ - "WHICH", "THEIR", "WOULD", "THERE", "COULD", "OTHER", "ABOUT", "GREAT", "THESE", "AFTER", "FIRST", "NEVER", - "WHERE", "THOSE", "SHALL", "BEING", "MIGHT", "EVERY", "THINK", "UNDER", "FOUND", "STILL", "WHILE", "AGAIN", - "PLACE", "YOUNG", "YEARS", "THREE", "RIGHT", "HOUSE", "WHOLE", "WORLD", "THING", "NIGHT", "GOING", "HEARD", - "HEART", "AMONG", "ASKED", "SMALL", "WOMAN", "WHOSE", "QUITE", "WORDS", "GIVEN", "TAKEN", "HANDS", "UNTIL", - "SINCE", "LIGHT", "BEGAN", "LARGE", "WATER", "WORKS", "OFTEN", "STOOD", "POWER", "MONEY", "ORDER", "MEANS", - "ROUND", "VOICE", "WHITE", "POINT", "STATE", "ABOVE", "DEATH", "LEAST", "KNOWN", "ALONG", "LEAVE", "ALONE", - "WOMEN", "TIMES", "SPEAK", "FORTH", "TERMS", "CRIED", "CHILD", "HUMAN", "SHORT", "CAUSE", "SEEMS", "BRING", - "DOUBT", "BLACK", "SENSE", "CLOSE", "TRUTH", "OUGHT", "PARTY", "READY", "FORCE", "EARLY", "EARTH", "EBOOK", - "SIGHT", "SPOKE", "STORY", "LATER", "ADDED", "STAND", "NICHT", "MILES", "COMES", "TABLE", "HOURS", "RIVER", - "HAPPY", "CLEAR", "SOUND", "MAKES", "BLOOD", "COMME", "DOING", "AVAIT", "TRIED", "FRONT", "QUILL", "PEACE", - "LIVED", "HORSE", "WROTE", "PAPER", "CETTE", "CHIEF", "PARIS", "BOOKS", "VISIT", "HEAVY", "KNOWS", "LOVED", - "CARRY", "PLAIN", "SWEET", "WRITE", "TREES", "BELOW", "WRONG", "REACH", "NOBLE", "PARTS", "AGREE", "MOVED", - "ENEMY", "WORTH", "GREEN", "THIRD", "MOUTH", "SLEEP", "FRESH", "FAITH", "SMILE", "USUAL", "BOUND", "QUIET", - "ETEXT", "COURT", "YOUTH", "PIECE", "SOUTH", "MEANT", "SEVEN", "TEARS", "VALUE", "BROKE", "FIGHT", "STONE", - "BEGIN", "HENRY", "LEARN", "LINES", "GRAND", "TAKES", "MONTH", "GIRLS", "GIVES", "EIGHT", "SCENE", "LIVES", - "DRAWN", "FIFTY", "FIELD", "CHAIR", "NAMED", "ALLOW", "MUSIC", "FIXED", "STUDY", "SPENT", "ROMAN", "TRUST", - "BREAK", "EQUAL", "NORTH", "THREW", "WATCH", "LOOKS", "BUILT", "USING", "SPITE", "MORAL", "WALLS", "TOUCH", - "JAMES", "STEPS", "OFFER", "DRESS", "LYING", "GRAVE", "LEGAL", "QUEEN", "LOWER", "CASES", "SHOWN", "NAMES", - "GREEK", "BOARD", "FAIRE", "GLASS", "SHARE", "FORMS", "CLASS", "START", "SHOOK", "TRAIN", "ENTER", "PROVE", - "FLOOR", "XPAGE", "WORSE", "SORRY", "PRIDE", "MARCH", "MARRY", "CROWD", "SHORE", "DRINK", "JUDGE", "SERVE", - "LAUGH", "TRADE", "BROAD", "GRACE", "PETER", "JESUS", "ROYAL", "LOUIS", "HEADS", "PROUD", "SPACE", "FULLY", - "QUICK", "IDEAS", "FANCY", "TASTE", "SWORD", "SHIPS", "DAILY", "GLORY", "BRAVE", "HONOR", "DREAM", "WEEKS", - "THICK", "CLAIM", "CHECK", "ASIDE", "REPLY", "FALSE", "SIDES", "CROSS", "SHARP", "FACTS", "HILLS", "BREAD", - "COAST", "DAVID", "AWARE", "GROUP", "FACES", "GROWN", "BIRDS", "MIDST", "TELLS", "LIKED", "THROW", "HABIT", - "STAGE", "ANGRY", "BROWN", "OWNER", "TIRED", "TRULY", "RULES", "TOTAL", "GRASS", "STYLE", "SAVED", "DRIVE", - "TWICE", "GUARD", "BURST", "PRICE", "WANTS", "THANK", "BASED", "APRIL", "GUESS", "CHOSE", "HOPES", "UNCLE", - "WOODS", "FINAL", "FORTY", "DROVE", "SPAIN", "TITLE", "UPPER", "MINDS", "NOISE", "HOPED", "BEGUN", "ALIVE", - "ITALY", "CRUEL", "SHAPE", "SLAVE", "BIRTH", "YOURS", "STORM", "CATCH", "LOOSE", "EMPTY", "CIVIL", "DOZEN", - "SHOWS", "ADMIT", "SMOKE", "DYING", "BRIEF", "APPLY", "PROOF", "FLESH", "FRUIT", "ENJOY", "WORST", "SHAME", - "ROUGH", "COVER", "ROCKS", "COUNT", "CRIME", "GRIEF", "IRISH", "NOTES", "NEEDS", "LANDS", "BLIND", "BRAIN", - "PRINT", "CLEAN", "DURCH", "ETAIT", "LEVEL", "RAISE", "EAGER", "STARS", "FAINT", "TEETH", "LABOR", "ROOMS", - "OLDER", "EINEN", "KNEES", "MERCY", "AWFUL", "AVOID", "DOORS", "INDIA", "ENDED", "DEVIL", "WEARY", "AROSE", - "FAULT", "CROWN", "COLOR", "AUSSI", "EVENT", "GOODS", "QUAND", "YARDS", "UNION", "ASCII", "TEMPS", "FAVOR", - "VOTRE", "SOULS", "CALLS", "AHEAD", "HARRY", "SMITH", "ANGER", "PLANS", "LOCAL", "LOVER", "PAGES", "LEURS", - "VIEWS", "SIGNS", "TEACH", "STOCK", "KINDS", "APART", "GUIDE", "ARMED", "EXACT", "HOMME", "TOUTE", "LATIN", - "TRIAL", "HOTEL", "SPEND", "SKILL", "KINGS", "SHALT", "LINKS", "DANCE", "SWEPT", "FATAL", "EINER", "WOUND", - "STORE", "SLEPT", "RANGE", "HATTE", "HENCE", "IMAGE", "ARISE", "FILES", "EINEM", "BANKS", "RAPID", "WASTE", - "ENTRE", "DARED", "PLANT", "SHADE", "ACTED", "CLOUD", "PRESS", "LOVES", "UTTER", "WINGS", "FLUNG", "BOWED", - "EGYPT", "GAZED", "THINE", "STICK", "FRANK", "REIGN", "MAJOR", "URGED", "FLEET", "TURNS", "SUGAR", "SPARE", - "SOLID", "BLAME", "BORNE", "WAVES", "TOWNS", "BOSOM", "CORPS", "SPEED", "GRANT", "FINDS", "MOINS", "BUILD", - "COSTS", "ERROR", "CEASE", "BOATS", "MIXED", "DELAY", "AGENT", "CLOTH", "ISSUE", "CHARM", "TREAT", "EMAIL", - "FRAME", "SHEEP", "ALIKE", "DUTCH", "PAUSE", "SEINE", "MERRY", "FEMME", "CRIES", "VAGUE", "TRACE", "VERSE", - "NOTRE", "FLAME", "HELEN", "IDEAL", "AVOIR", "HASTE", "ROUTE", "DREAD", "BIBLE", "EXIST", "OWING", "STERN", - "SAINT", "SORTS", "FALLS", "YIELD", "OCCUR", "GATES", "BONES", "OCEAN", "JEUNE", "SHAKE", "CARED", "STAFF", - "HURRY", "BEAST", "LOFTY", "BLESS", "TROIS", "INNER", "SHONE", "DRANK", "NOTED", "WINDS", "CHEEK", "CHAIN", - "KNIFE", "FEARS", "SWIFT", "WIVES", "WIDOW", "HATED", "HOLDS", "SIXTY", "MERIT", "GROSS", "DIESE", "ANGEL", - "MARIE", "FEVER", "FIRED", "AINSI", "ROADS", "CHINA", "QUEER", "GIFTS", "SWEAR", "NURSE", "CABIN", "MARKS", - "TRIBE", "ALOUD", "PAINS", "ALARM", "SCOTT", "OUTER", "WALKS", "NAKED", "FOLKS", "ELDER", "POETS", "MATCH", - "FOLLY", "WRATH", "DWELL", "SHOES", "SLAIN", "WAREN", "COACH", "ALICE", "TOWER", "DEEDS", "HABEN", "STEEL", - "TRAIL", "DEPTH", "BEARS", "PORTE", "SHOCK", "MOSES", "GUEST", "SCHON", "PLATE", "SAITH", "FEELS", "CLERK", - "STUFF", "TRACK", "POEMS", "PLAYS", "MAGIC", "KEEPS", "MONDE", "SONGS", "LEADS", "DRUNK", "AWAKE", "COEUR", - "SHOOT", "SMELL", "PETIT", "ALTAR", "AUTRE", "LIMBS", "EATEN", "TONES", "BASIS", "STEEP", "FEAST", "NOVEL", - "SILLY", "GROWS", "BADLY", "STOUT", "ALLES", "MARIA", "RISEN", "CREPT", "SCALE", "RANKS", "FLASH", "BURNT", - "RIVAL", "BRIDE", "TALES", "BOOTS", "CHEST", "SEATS", "GRAIN", "PRIZE", "FETCH", "DIRTY", "MOUNT", "CURSE", - "STIFF", "BEARD", "BARON", "NEGRO", "ASSEZ", "UNTER", "MODEL", "GRASP", "FIRES", "FLOOD", "ALORS", "JOURS", - "FLOUR", "STOLE", "POUND", "SWUNG", "ALTER", "SHEET", "CENTS", "DWELT", "CLOAK", "ROSES", "ROOTS", "CLOCK", - "SCORE", "GLOOM", "AGONY", "SEIZE", "PIOUS", "WAGES", "BLOWS", "WHEEL", "SAGTE", "CARES", "VITAL", "RISES", - "BILLY", "AVANT", "OWNED", "SCORN", "METAL", "ABIDE", "IMMER", "JONES", "STUCK", "SHOUT", "PAINT", "DRIED", - "AMPLE", "RUINS", "MAYBE", "FILLE", "SIEGE", "STEAM", "BETTY", "MILLE", "TRICK", "TYPES", "SHELL", "REFER", - "GIANT", "LORDS", "ROGER", "FIFTH", "FACED", "DATES", "MEINE", "HOMES", "LINEN", "VIVID", "STRAW", "BRASS", - "NAVAL", "MADAM", "BONNE", "FADED", "SPORT", "DROPS", "DINED", "BEACH", "LOYAL", "CELUI", "LIKES", "CARDS", - "RACES", "CHEAP", "TRUNK", "RALPH", "CHEER", "JOINT", "EINES", "SPELL", "ABODE", "WAVED", "DRAMA", "ARRAY", - "CRAFT", "CANOE", "GEGEN", "RIFLE", "CODES", "FIERY", "MIEUX", "TAXES", "AWOKE", "LIMIT", "ASHES", "JACOB", - "GHOST", "BELLS", "STEAL", "ALLER", "CLIMB", "HEELS", "TEXAS", "TERRE", "MUTTA", "SOBER", "HARSH", "SHINE", - "KNOCK", "PEINE", "SPAKE", "VIRUS", "DEALT", "MINOR", "LAURA", "SLOPE", "HUMOR", "BENCH", "WHEAT", "MAMMA", - "PIANO", "FUNNY", "SIMON", "ROCKY", "SWEEP", "SADLY", "ERECT", "BELLE", "PURSE", "PARCE", "CLUNG", "SWORE", - "FENCE", "WORRY", "SUITE", "JAPAN", "WAGON", "POLLY", "EVILS", "CELLE", "HENRI", "JETZT", "PETTY", "BANDS", - "CHASE", "GLEAM", "UNITY", "HASTY", "ACRES", "MAINS", "LUCKY", "PERIL", "ADAMS", "HIRED", "FILED", "EXTRA", - "FLIES", "DOUTE", "TIGHT", "BLANK", "JULIA", "ENFIN", "SEEDS", "IHRER", "FAIRY", "SITES", "SMART", "ETWAS", - "WURDE", "SHIRT", "ELECT", "SPOIL", "GUILT", "ADOPT", "BILLS", "CLARA", "HOLES", "ELLES", "SAILS", "RINGS", - "EDITH", "FANNY", "BLOWN", "RIDGE", "DENSE", "TODAY", "SHEER", "ABUSE", "RESTE", "QUOTH", "LUNCH", "NIECE", - "TIMID", "MANLY", "SWORN", "PRIME", "PROSE", "BOXES", "VILLE", "LEWIS", "CREEK", "ORGAN", "BRUSH", "OPERA", - "FLOCK", "SUSAN", "BOAST", "PITCH", "ANGLE", "ELLEN", "SUNNY", "AUGHT", "FOOLS", "SWAMP", "VEINS", "NEWLY", - "COUCH", "VIEUX", "JOLLY", "OPENS", "SPEAR", "BRICK", "CREAM", "THIEF", "WAIST", "RULED", "KNELT", "SARAH", - "BRUTE", "SENDS", "MINES", "DATED", "PATHS", "MOVES", "SHOPS", "PORCH", "IHREN", "TENTS", "BACKS", "KITTY", - "SANDY", "PUPIL", "LODGE", "BLOOM", "BONDS", "BLOCK", "SATAN", "SWELL", "RIGID", "OLLUT", "GAMES", "SANTA", - "DEBTS", "FELIX", "SPOTS", "SCENT", "HEEFT", "CIGAR", "ALLAH", "ENTRY", "SAXON", "AVAIL", "MAINE", "EFFET", - "TREAD", "WIDER", "OLISI", "CHILL", "BROOK", "AMUSE", "ALLEN", "COMTE", "ROBIN", "SKALL", "VEXED", "BALLS", - "KEINE", "CROPS", "UEBER", "REALM", "EMILY", "MONKS", "REBEL", "WALES", "LAMPS", "EXILE", "HEARS", "UNITE", - "ROBES", "SKIES", "SIXTH", "SEULE", "CRAZY", "ISAAC", "IHNEN", "RULER", "WRECK", "DRAWS", "DIDST", "ARROW", - "STARE", "DROIT", "BLUSH", "DONNE", "SOBRE", "PRIOR", "VOTES", "MATIN", "THEME", "FINER", "PSEUD", "NERVE", - "APPLE", "RESTS", "PENNY", "STAKE", "BROWS", "READS", "BUNCH", "TWAIN", "TOKEN", "TALKS", "WISER", "HORNS", - "APRES", "BLAZE", "SORTE", "CLIFF", "STRIP", "TEXTS", "AWAIT", "ELBOW", "GLOBE", "FLUSH", "UPSET", "AVONS", - "TURKS", "JANET", "GENUS", "LOCKS", "HONEY", "CARGO", "LEBEN", "STOVE", "CANAL", "JERRY", "CRACK", "POSTS", - "PIETY", "LADEN", "BLADE", "LINED", "HONOM", "NOISY", "DRIFT", "DECAY", "FUNDS", "MIRTH", "TOOLS", "ACUTE", - "AUGEN", "PACES", "SPLIT", "BREED", "VENUS", "JUICE", "PLATO", "FREED", "FAILS", "PORTS", "BLISS", "USAGE", - "HEURE", "PILED", "RATES", "AIDED", "BYRON", "WIPED", "HOMER", "STAMP", "VICES", "VATER", "TOMMY", "PIEDS", - "TROOP", "SAGDE", "BLAST", "MOTOR", "RURAL", "WEARS", "CREED", "VOTED", "DELLA", "GLARE", "SKINS", "TODOS", - "SHAFT", "VENIR", "NANCY", "CROIS", "DAVIS", "QUOTE", "PLEAD", "ITEMS", "SWING", "SEEKS", "CREST", "BASIN", - "LAKES", "SNAKE", "SALES", "DUSTY", "CRUSH", "MEETS", "TENTH", "SALLY", "MEALS", "GROVE", "SUITS", "SMOTE", - "LANGE", "ACTOR", "ARGUE", "FLOWS", "DIMLY", "REEDS", "PLANE", "GREET", "SWEAT", "DIANA", "BRUIT", "ROOFS", - "SANOI", "BEAMS", "JIMMY", "PILOT", "ARABS", "FROST", "CELLS", "MOORE", "AYANT", "PERCY", "EDGAR", "PIPES", - "MOLLY", "QUEST", "FOLDS", "CURED", "PASSE", "RHINE", "MAIDS", "MULES", "REINS", "SALON", "CANST", "AUCUN", - "ALERT", "RENEW", "EDGES", "IHREM", "SWISS", "PATCH", "ALOFT", "CRUDE", "AIMED", "NAILS", "RECHT", "SAGEN", - "VIGOR", "TRIES", "FLANK", "TRACT", "VERGE", "ELSIE", "TRAMP", "IVORY", "CRASH", "CURVE", "CAKES", "EAGLE", - "HEDGE", "VOULU", "RITES", "LOGIC", "CLARK", "SPARK", "SINGS", "EPOCH", "MAYOR", "WEIGH", "ONDER", "ABBEY", - "KEITH", "AGNES", "ESSAY", "VALET", "HOSTS", "HANGS", "COMIC", "PANIC", "PEDRO", "COATS", "SCOPE", "FRAIL", - "BURKE", "GOALS", "MODES", "SKULL", "FLOAT", "RHODE", "PULSE", "LOSES", "DANTE", "TOPIC", "TIGER", "FEWER", - "PINES", "SHIFT", "HEAPS", "VIENT", "FILLS", "REINE", "FORTS", "LIONS", "MILAN", "ZIJNE", "LUNGS", "SANDS", - "PHASE", "HALLS", "ROUSE", "DAISY", "PARTE", "FARMS", "SKIRT", "SATIN", "RAINS", "HINTS", "CABLE", "GARDE", - "THUMB", "QUART", "HARDY", "ELLER", "POLES", "AARON", "SYRIA", "GROAN", "ROPES", "MOULD", "JENNY", "ROLLS", - "BACON", "MOIST", "FLING", "LANCE", "PARTI", "SHELF", "ETHEL", "MALES", "PLUCK", "SHOTS", "STOPS", "ALIEN", - "FRAUD", "CLUBS", "NEWBY", "CREEP", "TILDE", "SHAWL", "FORME", "AFORE", "RAOUL", "FROWN", "SNOWY", "LISTS", - "STONY", "FLAGS", "BORED", "MELAN", "PGLAF", "CURLS", "EFTER", "STAID", "TOUGH", "CHOIR", "HASTA", "DITCH", - "CLARE", "WITCH", "RIDER", "SEHEN", "MASON", "WEEDS", "TENDS", "PALMS", "FLUID", "VILLA", "STADT", "IRENE", - "SAUCE", "PAVED", "ANNIE", "MUDDY", "SEXES", "USERS", "STRAY", "DAMIT", "OATHS", "WIDTH", "STAIN", "STEED", - "UNFIT", "BEADS", "HERDS", "INDEM", "WENIG", "VINES", "BLAKE", "GORGE", "DEMON", "CANON", "BRISK", "GANZE", - "TUTOR", "SIGHS", "RAINY", "TANTO", "MOYEN", "HELPS", "GRADE", "PEAKS", "ELLOS", "PARMI", "PARLE", "ALLAN", - "FLORA", "PELLE", "APRON", "COINS", "CITED", "LIEBE", "DEREN", "WELSH", "HOOFS", "PAIRS", "DONNA", "VOWED", - "WEIRD", "IRONY", "BRUCE", "BEANS", "DOLLY", "CLING", "LAPSE", "GAILY", "DUSKY", "TEGEN", "WITTY", "WRIST", - "TORCH", "MONTE", "SHADY", "AMOUR", "BESET", "ATHOS", "COUPS", "TRUCE", "GOATS", "VAULT", "SPURS", "GAINS", - "TELLE", "TOAST", "VINGT", "LAYER", "ARMOR", "JUDAH", "KOMMT", "MOODS", "IMPLY", "LEVER", "JOTKA", "EXERT", - "FOULE", "SPIES", "YACHT", "ALTEN", "PAGAN", "TENSE", "ALOOF", "VALOR", "HYMNS", "ENVOY", "PINCH", "PRONE", - "HELLO", "BROOD", "MABEL", "FOWLS", "HERRN", "DROWN", "ROUGE", "BURNS", "MISMO", "CALME", "LIVRE", "SLIDE", - "LYONS", "CAIRO", "PATTY", "CASTE", "STOOP", "BAKER", "MILLS", "BLEST", "TAILS", "VOICI", "LOGIN", "FARED", - "CHANT", "SEITE", "FABLE", "MISTS", "DIEGO", "ROWED", "WORDT", "DUCKS", "MAXIM", "BOERS", "LEVEN", "SWARM", - "QUANT", "MUSED", "WAITS", "CHALK", "BEIDE", "FORTE", "CAVES", "JEDER", "SENOR", "INFER", "TRAIT", "TASKS", - "DIARY", "HOUND", "SAVEZ", "BLUFF", "PENSE", "CECIL", "JUDAS", "OUNCE", "STARK", "DRAIN", "LEAPT", "WEISE", - "CLAWS", "TWINS", "IDOLS", "SUJET", "ALTSP", "WILLS", "RAGED", "HAVDE", "BEAUX", "FRITZ", "DARES", "DEPOT", - "DAZED", "RODIN", "LOWLY", "STUNG", "NASTY", "DEITY", "BOBBY", "ELIZA", "SIZES", "GAUNT", "LYDIA", "KNEEL", - "RISKS", "DURST", "TENOR", "STEMS", "FAITE", "LIVER", "STEAD", "EVANS", "TESTS", "GILES", "HUNNE", "SEALS", - "PLANK", "SINKS", "WHIRL", "SCREW", "SPOON", "GEHEN", "HABIA", "JAHRE", "BARRY", "AMPLY", "FRANZ", "TENIR", - "SLICE", "CARTS", "EDWIN", "DEALS", "JUSTE", "WHALE", "VIVRE", "PARUT", "HAUSE", "WESEN", "GEESE", "NAMEN", - "PASTE", "NIETS", "SCRAP", "LIBRE", "ADORN", "NOSES", "MADLY", "USTED", "WELKE", "ARDOR", "TROUT", "WELLS", - "ZEIDE", "DINGY", "SOEUR", "KNAVE", "KNOTS", "TIENE", "SEELE", "ESSEX", "CRAWL", "THEFT", "WEDER", "AREAS", - "STAIR", "ORION", "HEUTE", "DADDY", "COUGH", "GUISE", "PARMA", "FISTS", "GENUG", "FAUST", "AQUEL", "SNEER", - "PLOTS", "DAVON", "JENER", "PLUME", "GEBEN", "HAUTE", "PADRE", "ABBOT", "VOILA", "SELON", "ODOUR", "MEDAL", - "OPIUM", "DRAKE", "AMISS", "ETTEI", "GLOVE", "BLEAK", "SACHE", "GENRE", "RATIO", "DRUGS", "WINES", "HINDU", - "POOLS", "VISTA", "SCANT", "CORDS", "RAILS", "STAYS", "GENOA", "WHARF", "COSAS", "STEHT", "PRIMA", "DEUCE", - "KILLS", "MADGE", "BLUNT", "PASSA", "WAKED", "PUNCH", "SABLE", "FLOWN", "DRILL", "LIFTS", "ILLUS", "CRISP", - "WORMS", "FLINT", "HANDY", "ALLEY", "MASTS", "FIEND", "STUMP", "ADULT", "LEUTE", "SCRUB", "DECKS", "PANGS", - "CAMEL", "DEINE", "TITUS", "INDEX", "HAVEN", "HILDA", "GEIST", "ORDRE", "THORN", "TOILS", "CEDAR", "LOADS", - "WAXED", "SOPHY", "DAHER", "GAUGE", "WAGER", "JULIE", "WILDE", "PEERS", "AISLE", "BLANC", "LONGS", "ELLIS", - "MINUA", "CARLO", "SCARE", "LEVIN", "KUNDE", "DINGE", "SNARE", "WEISS", "STALE", "FAITS", "AVERT", "HADST", - "BATHS", "XVIII", "TIDES", "TINTS", "BULLY", "AZURE", "WHIGS", "VIELE", "ATOMS", "PERRY", "BLICK", "GIDDY", - "SOLAR", "FARCE", "BOWER", "WARES", "FROID", "SLIPS", "RENTS", "FEATS", "LEASE", "BLAIR", "BLAND", "CONDE", - "MARSH", "RUMOR", "BERTH", "BATHE", "BOOTY", "GLIDE", "ENNEN", "BERRY", "PAULA", "AIVAN", "FRIED", "DANES", - "WORTE", "BOOTH", "OTROS", "TAXED", "TWIGS", "ERSTE", "UNDUE", "CLUMP", "RICHE", "LIEGT", "LYRIC", "IHRES", - "LASTS", "ANNOY", "WEGEN", "OOGEN", "SELFE", "DABEI", "CASTS", "BOUGH", "ROUEN", "DIGNE", "SILAS", "LOCKE", - "CHART", "MAKER", "PEGGY", "SNOWS", "DETTA", "CHRIS", "ARENA", "QUIEN", "RELIC", "SECTS", "DOUCE", "BRIBE", - "FRIAR", "TINGE", "COURS", "VIENS", "HACER", "PEPYS", "LANES", "ETHER", "VICAR", "STEVE", "JASON", "VOCAL", - "JOINS", "BASES", "UNSER", "LIGNE", "DINAH", "VASES", "TEDDY", "NEUEN", "CURLY", "VALID", "CLEFT", "CHAPS", - "BARGE", "HAGUE", "BOLTS", "DARIN", "SMELT", "TULEE", "VOYEZ", "PURER", "ENTRA", "ODDLY", "VAPOR", "EENEN", - "SPIED", "SLATE", "CREWE", "BRACE", "CYRIL", "OSCAR", "IRONS", "DESDE", "LAMBS", "VROEG", "VROUW", "DICKY", - "KRAFT", "RALLY", "RESTA", "CRAVE", "GAYLY", "LEAPS", "FLUTE", "ONCLE", "SCOUT", "GOWNS", "SWINE", "GREED", - "ONION", "SAGES", "AMBER", "TARRY", "GRATE", "GESTE", "ANDRE", "MOEST", "JUURI", "CESSE", "SHEWN", "THIGH", - "LEAFY", "BENDS", "FERME", "BRAKE", "HURTS", "GRIND", "SILKS", "CLASH", "JELLY", "SOOTH", "DIZZY", "NEBEN", - "INCUR", "DOVER", "VERRE", "HAIRY", "STALK", "TOMBE", "HEAVE", "MUCHO", "INTER", "SPADE", "CREWS", "DENIS", - "HIELT", "FOSSE", "BULLS", "ALLEZ", "SOMME", "SNUFF", "BLIEB", "HAVOC", "ALLEM", "SMITE", "LACKS", "THROB", - "GUTEN", "PUEDE", "CLICK", "TIRER", "KORAN", "FLASK", "GRUND", "TERRA", "CAUSA", "GAUDY", "HIRAM", "JETER", - "FIBRE", "VERBS", "FORGE", "WAERE", "SPECK", "OLDEN", "SHRUB", "FLEDA", "GODLY", "HOOFD", "SONNE", "EDICT", - "DAGEN", "ISLES", "CHASM", "EDGED", "TRAPS", "BIRCH", "TRUER", "PAPAL", "ASSIS", "MASSE", "MORTE", "HETTY", - "REPEL", "INGEN", "SHRUG", "KOMEN", "PRISE", "HENNE", "LIVID", "BRIAN", "SALAD", "MATES", "BOVEN", "DOUZE", - "MEATS", "FEEDS", "TANTE", "WENCH", "DARTS", "FLATS", "TUBES", "UNITS", "HECHO", "PERCH", "POURS", "TRIPS", - "CIVIC", "MUNDO", "SPRAK", "ANTES", "SCARF", "DELLE", "HYVIN", "VASTE", "FOLIO", "NEEDY", "YELLS", "FAUTE", - "REGAL", "HOOKS", "ELIOT", "PALER", "TRENT", "MALTA", "MAKEN", "LUCAS", "NOUNS", "ATTIC", "WINDY", "SPIRE", - "SIEHT", "DERBY", "SAVOY", "MAUDE", "ILIAD", "DITTO", "PLINY", "FERNS", "BASIC", "GRAPE", "SOGAR", "TYING", - "DOUGH", "DERAS", "LEANT", "BELLA", "LICHT", "FILTH", "PEARL", "LUSTY", "OLIVE", "DROLL", "BADGE", "WAGED", - "SEEST", "ANKLE", "FERRY", "PENAL", "NEUER", "ESTOS", "FUMES", "SHEDS", "SHOWY", "SALEM", "REDEN", "STALL", - "JOYCE", "SANTO", "ZELFS", "HOTLY", "SCOLD", "CANDY", "LUCIA", "WEAVE", "MONTA", "SLACK", "VOGUE", "RHODA", - "SLANG", "FOODS", "PRIVY", "SERAI", "RENDU", "VALVE", "KUNST", "CYCLE", "EXCEL", "QUASI", "CRAIG", "VERTU", - "AVEVA", "MAYST", "HEATH", "MEDIO", "CELIA", "DEEZE", "BATES", "ATONE", "VENUE", "LURID", "SKOLA", "MDLLE", - "CHOKE", "PREND", "DARAN", "SAVES", "MANOR", "FORKS", "GENTE", "DITES", "TEAMS", "GOETH", "STOND", "COOKS", - "CHIEN", "PANEL", "GROWL", "MURAT", "BODEN", "DERES", "CAIUS", "FRERE", "HEIDI", "BROTH", "TEMPO", "JONAS", - "BROOM", "RACED", "SACKS", "TERRY", "NOOIT", "GENOM", "RAVEN", "FROGS", "ANNUM", "ACHED", "HEROD", "NOIRE", - "SURLY", "EIGEN", "EVADE", "BUGGY", "CONNU", "ATQUE", "WAKES", "REMIT", "REEFS", "ASSES", "MORSE", "RUFUS", - "ROMEO", "CHORD", "SLOOP", "LOANS", "TAWNY", "ETIAM", "NOCHE", "CONGO", "GHENT", "BINDS", "SLUNG", "CUBIC", - "GROOT", "DARUM", "MUSES", "GERMS", "NYMPH", "CUPID", "LUTTE", "FINES", "LUEGO", "PSALM", "HOARY", "XXIII", - "MUJER", "CROWS", "DECIR", "SULLA", "TITRE", "MAPLE", "SALTS", "POSTE", "DODGE", "ARMEN", "DISSE", "MACHT", - "FOCUS", "LITHE", "PASHA", "HIJOS", "BUSSY", "FLEUR", "JOLIE", "SMASH", "NORAH", "DOGMA", "TUTTO", "BOWLS", - "JEDEN", "LOATH", "JESTS", "MALAY", "DIGIT", "PENCE", "JOUER", "NORSE", "SLEEK", "DOWRY", "DEFER", "SELLS", - "CALEB", "BLEED", "DOWNS", "BABES", "DENTS", "ALKOI", "JEDEM", "PANES", "SINNE", "LEIGH", "MENOS", "WILDS", - "WOLFE", "ANDRA", "IDAHO", "DOWNE", "BETSY", "ADAPT", "MIJNE", "LIESS", "DICHO", "NELLY", "TUDOR", "BLOND", - "GRAVY", "FRAGE", "AELIG", "TIENT", "STEIN", "PLIED", "SABRE", "SQUAD", "STAAT", "REVEL", "YOLKS", "SEWED", - "CRANE", "SYRUP", "GIVER", "SEULS", "HAINE", "CASEY", "HICKS", "KATIE", "LOINS", "ABEND", "EXALT", "DENNA", - "STIRS", "SMOKY", "EUERY", "NICHE", "ONELY", "SINUN", "RABBI", "BRUST", "ELIAS", "JOSSA", "PAYER", "VEILS", - "CHAFF", "SULKY", "JUNGE", "PEACH", "MAMAN", "TUNES", "KAMEN", "DIANE", "LUMPS", "SHAVE", "CLOWN", "SHINY", - "LATEN", "HUSKY", "TOWEL", "REPOS", "GLADE", "GEORG", "NUEVA", "MANIA", "SAKES", "KEATS", "PULLS", "SIOUX", - "TAINT", "SUIVI", "CROIT", "MUUTA", "TILES", "BUSHY", "BLEND", "HAPLY", "ANJOU", "TRITT", "TURIN", "PLATZ", - "FAMED", "BARNS", "VECES", "DAMON", "LANGS", "HUMPH", "RELAX", "AUNTS", "SALUT", "CRAGS", "SHOAL", "COLIN", - "MOSSY", "GAULS", "CASKS", "WRING", "AHORA", "SPICE", "BONNY", "CURES", "BRUNO", "BRAVO", "ANDER", "CHESS", - "ALIAS", "SAUCY", "NOIRS", "TUNIC", "TOMBA", "LURED", "POKER", "RADIO", "CHAMP", "FINDE", "HULLO", "MECCA", - "SCALP", "FORMA", "SCARS", "MORTS", "BASSE", "SPINE", "PEREZ", "DIVAN", "HONTE", "LINDA", "ENVIE", "TEASE", - "BARED", "MADRE", "TUTTI", "OUTRE", "OMDAT", "LUCID", "SURGE", "CLAIR", "ONSET", "PONDS", "AUTEM", "MOODY", - "BALES", "SEDAN", "GALES", "LATCH", "LENDS", "LUIGI", "CAREY", "HOIST", "OTRAS", "GWINE", "WARUM", "DIVED", - "STRAP", "KELLY", "BEECH", "TROTH", "CHLOE", "PUNTO", "CIELO", "FROZE", "BUGLE", "POISE", "SIEUR", "TRUCK", - "ZEKER", "FOXES", "BALMY", "PICKS", "ISLAM", "AMEND", "DROOP", "LOPEZ", "DAIRY", "WALTZ", "BLOSS", "KYSYI", - "NAIVE", "SHORN", "URGES", "MAIZE", "WIELD", "HOLLY", "ARTER", "YORKE", "FRAIS", "NIGEL", "PAYNE", "COMET", - "SHUTS", "SOCKS", "HORDE", "SKIFF", "HACIA", "BESTE", "PARKS", "INERT", "PARLA", "INLET", "ODORS", "PRICK", - "KOREA", "FORUM", "LIEGE", "JEDES", "LIETH", "GASES", "SENZA", "TISCH", "PRATT", "ABNER", "BURLY", "BRAND", - "MINER", "TRACY", "LUGAR", "LAWNS", "GOTHS", "TARDY", "WIGHT", "DRURY", "VADER", "COOKE", "LAIRD", "TUFTS", - "FIXES", "SOLES", "VOWEL", "CLIVE", "KOSKA", "TAPER", "GUSTS", "RIANT", "FERAI", "COILS", "GROND", "SOINS", - "ABATE", "AFOOT", "EMILE", "POCHE", "LASSE", "ADELA", "PORTA", "BULKY", "MASKS", "DORIS", "KOMMA", "TAMEN", - "CRIER", "LOBBY", "ERNST", "EXPEL", "MANGE", "PACKS", "FATED", "DOVES", "DOLLS", "METRE", "AVAIS", "NEWER", - "LOGAN", "FREER", "DENNE", "MILLY", "GENIE", "STILE", "WARDS", "GEVEN", "WROTH", "BOONE", "COMER", "ANGUS", - "USHER", "CEDED", "PUFFS", "EBONY", "MIMIC", "SIEVE", "MEDIA", "ATLAS", "DESSA", "DUKES", "TERUG", "GRIMM", - "HAYES", "INDRA", "SHEWS", "DUMAS", "MYTHS", "FACON", "LILAC", "MISER", "TACIT", "SABER", "TUNIS", "NELLA", - "PORTO", "EERST", "ENNUI", "CIDER", "POUCH", "JUIST", "SHYLY", "NEVIL", "FROTH", "GIPSY", "EINST", "HERRA", - "ALLAY", "DANDY", "TOWNE", "HARTE", "HOHEN", "PLUIE", "NEIGE", "FASSE", "WAKEN", "YEAST", "CADIZ", "MINCE", - "WOODY", "AVOIT", "BOIRE", "PIERS", "FANGS", "KRIEG", "SAHIB", "DRYLY", "BELTS", "LACED", "WAYNE", "KOMME", - "AWARD", "FRANC", "FUERA", "IDEES", "COUPE", "VIOLA", "QUERY", "VENOM", "WAZIR", "SLABS", "FATES", "DIXON", - "POKED", "TOURS", "CHEFS", "ABACK", "PAOLO", "BECKY", "OAKEN", "KLEIN", "MOONS", "POLAR", "PRAYS", "DEIGN", - "CROOK", "SOLON", "LEANS", "PUPPY", "FINIT", "XXVII", "FOLIE", "POTTS", "LABEL", "SUSIE", "STACK", "POIDS", - "JESSE", "BLEEF", "HILLY", "BITTE", "WADED", "AIKAA", "EAVES", "MINUS", "REPAS", "NANCE", "DELHI", "HAZEL", - "ORBIT", "SURER", "TYLER", "DELIA", "RAJAH", "JUDEA", "STATT", "MENGE", "WHIMS", "BOYNE", "WHIPS", "PAINE", - "LIBEL", "MANOS", "TAMED", "CHIPS", "REIHE", "SWANN", "QUALE", "SPASM", "VRAIE", "TWINE", "CLIME", "ABHOR", - "DOMES", "KNOLL", "VISTO", "WEDGE", "GRIMY", "ROVER", "WRAPS", "LEVEE", "LEGTE", "AMITY", "NIHIL", "HALLO", - "CARVE", "TREND", "DAYES", "HEARE", "DEZEN", "SAISI", "COCOA", "QUEUE", "SWOON", "WAGEN", "PUMPS", "TRASH", - "SHARK", "MEADE", "RECUR", "DREGS", "VOILE", "CANTO", "HAVRE", "FATTO", "SNEAK", "MISMA", "SHOVE", "SOYEZ", - "CRANK", "FINED", "JUMPS", "BRYAN", "VENEZ", "ENSUE", "WILES", "ROARS", "FREAK", "POSSE", "SINUA", "FUSIL", - "DAHIN", "BEGAT", "ELUDE", "CROIX", "CLANG", "HOARD", "HATCH", "SOILS", "SAMMY", "STARR", "POIKA", "ELISE", - "LISZT", "JENES", "WIRST", "RUHIG", "MEDEA", "RAIDS", "NOOSE", "LETTY", "CHERE", "EASED", "SERVI", "MEJOR", - "FEARE", "SMACK", "ALTRI", "HITCH", "GETAN", "MITEN", "MAVIS", "ACIDS", "BEGET", "GARTH", "TIERS", "ANTON", - "NICER", "TANKS", "CESAR", "CANES", "PLUMB", "VANCE", "BEGOT", "DETER", "FLARE", "BOMBS", "FITLY", "JENEN", - "FLIRT", "HABER", "JOITA", "CHUTE", "READE", "STETS", "STEAK", "GAUZE", "SPARS", "PEARS", "PIQUE", "GLACE", - "PATSY", "HOVER", "RIPEN", "SWANS", "VARRO", "MARSE", "SONGE", "GUILE", "CANNA", "NACHT", "SALLE", "CARTE", - "AMMON", "TASSO", "RAZOR", "WHIST", "OMENS", "NIMMT", "GOEDE", "GRUNT", "DIRAI", "SPIKE", "COCKS", "DIEUX", - "SUURI", "UTILE", "SEREZ", "SOTTO", "STAAN", "DACHT", "LUNAR", "WHOSO", "DINNA", "CRETE", "PADUA", "SERGE", - "CACHE", "CHILI", "TIBER", "TAGEN", "RIGOR", "BIDDY", "AIMER", "MOUSE", "OXIDE", "PESOS", "SLING", "SPILT", - "BOWEN", "SINON", "SINAI", "TULLA", "TONIC", "LOIRE", "JUGER", "HAUPT", "CADET", "COSMO", "OCCHI", "CLANS", - "MUSTY", "MUMMY", "NIGER", "GOULD", "SQUAW", "UNTEN", "PENSA", "BIJNA", "CONTI", "NASAL", "TAUNT", "SILKY", - "NUNCA", "KAKSI", "DUCHY", "MELTS", "VASTA", "DAVIE", "QUELS", "ANCHE", "LIEUT", "BARDS", "BUNNY", "RILEY", - "TIENS", "MOTHS", "OMNES", "TANTA", "WOOED", "BRENT", "RASCH", "JADED", "ERRED", "BRAGG", "GUIDO", "HURON", - "LEILA", "VEDAS", "DEEPS", "RHONE", "SOWED", "BADEN", "NOMME", "SLUNK", "DEARS", "GUTER", "HIELD", "FEUER", - "LUPIN", "HAGEN", "JAMIE", "PLUMS", "GUSTO", "WETEN", "TENER", "HAWKS", "FOLLE", "CHILE", "SAADA", "SQUAT", - "KNACK", "MOORS", "SCOWL", "JENEM", "PLAZA", "SHEEN", "UNSRE", "DETTE", "WEBER", "BITES", "MASSA", "TUOTA", - "WOORD", "DOCKS", "AGILE", "SERFS", "OASIS", "BEGON", "LACES", "CORDE", "MEYER", "REISE", "FOGGY", "DINER", - "HUMID", "QUAIL", "LILLY", "FADES", "WRAPT", "GRUFF", "WEEPS", "ETTAE", "MARAT", "REICH", "LUSTS", "DICHT", - "APACE", "BUENA", "SLIMY", "TRUMP", "JOUES", "DUCAL", "COVET", "GIEBT", "AMANT", "FEIGN", "MEIST", "RATED", - "DOIGT", "ELLAS", "CHOIX", "GLOWS", "PALED", "MOOSE", "SHEAF", "SWARD", "HAREM", "DORIA", "PIKES", "WREST", - "MITTE", "TOOKE", "CHUMS", "TENGO", "LOTUS", "CUFFS", "KIRBY", "BARKS", "GYPSY", "BLOIS", "URBAN", "SIBYL", - "TIRES", "JOSTA", "TEILS", "ODIUM", "PURGE", "DOSES", "WEZEN", "NEPHI", "LIBRO", "SLYLY", "VIGIL", "HADES", - "THUMP", "BUYER", "RYDER", "ARYAN", "SNARL", "CHIME", "ROBED", "AUREZ", "DESTO", "SLEET", "CUBAN", "RARER", - "SEVER", "WOLLE", "FOYER", "SHAKY", "CAGES", "VANHA", "BETER", "TARDE", "VNDER", "FOURS", "KARNA", "POORE", - "OMNIA", "ACTES", "GOWER", "NINTH", "GENAU", "CLAUS", "BIENS", "KOHTA", "NUITS", "BRAID", "FEUDS", "GANGS", - "ILMAN", "LEECH", "NEQUE", "ANTAA", "BARBE", "MAGNA", "PILLS", "PANTS", "EARLE", "MERCI", "PERTE", "BABEL", - "LUCHT", "TENIA", "SEUIL", "DEGLI", "HARES", "VILDE", "RIOTS", "GJORT", "PIPER", "ZEIGT", "TIBET", "KICKS", - "JADIS", "SPELT", "PLAID", "CERCA", "FALLU", "MURKY", "HEINE", "REVUE", "CAMPO", "AMAZE", "LOOMS", "COSTA", - "STYPE", "JONAH", "CHUCK", "RELAY", "FIBER", "GLINT", "SLOTH", "MUSIK", "MOTIF", "BATCH", "SOWIE", "PATER", - "DEANE", "DOETH", "OBJET", "GAIUS", "LAMPE", "DOZED", "GULLY", "SEAMS", "BOYCE", "MAILS", "USEIN", "HENDE", - "PSHAW", "WHINE", "PRINZ", "WILLY", "HALFE", "MILKY", "ANVIL", "SHRED", "CHIDE", "EFFIE", "MOANS", "LEITH", - "COPSE", "DRAGS", "FARRE", "BANDE", "BHIMA", "YATES", "NIVER", "DEVEZ", "LAGEN", "OMBRE", "JONGE", "WATTS", - "ISTUI", "TUSKS", "AMACR", "JAREN", "VARIT", "REDDY", "PRIAM", "PRIMO", "COWED", "TOWED", "AVERY", "AXIOM", - "HOVEL", "BRICE", "CONES", "KUNNA", "LEISE", "HOBBY", "MINUT", "POOLE", "SINGH", "BOILS", "SATTE", "CRABS", - "MERLE", "WARNS", "FOURE", "ACHES", "YEARN", "SAHEN", "AILES", "LORRY", "LOVEL", "LUEUR", "SLANT", "METER", - "PHONE", "TAGES", "SUPER", "FUSED", "GLOSS", "NULLA", "ADEPT", "COREY", "LEGER", "SUAVE", "GAZES", "NEMEN", - "NOGET", "PANDU", "CAREW", "XXXII", "SCAMP", "HEATS", "TIPSY", "HOWLS", "MEMES", "ROOMY", "SANOA", "HAYDN", - "JETTE", "AMORY", "CONTE", "VERRA", "TILLY", "WELCH", "PEALS", "SULLY", "BRINE", "MOINE", "FACTO", "BORDS", - "FIRMS", "FARES", "TUNSI", "WAXEN", "BULBS", "BLIVA", "MESSE", "BRISE", "BORIS", "KAUAN", "RAKED", "IBSEN", - "PINTS", "DENKT", "POPES", "WHIFF", "SYBIL", "QUITS", "ARGOS", "AGGIE", "ANDES", "DALLA", "ABOOT", "EINDE", - "GERNE", "TYROL", "FADER", "SORTI", "MEDES", "AMIGO", "CELTS", "LEONE", "LILLE", "AGLOW", "INJUN", "KEEPE", - "RUINE", "LIEUX", "GEENE", "AUDIO", "SEETH", "STREW", "GRAZE", "KHAKI", "ABRAM", "APTLY", "HEERE", "ETANT", - "GOOSE", "POSED", "CHOPS", "ALTRO", "TITHE", "ANGST", "WORIN", "HIGHT", "CREAK", "NULLE", "DOWER", "SENTI", - "QUELL", "CHINK", "DESIR", "SETZT", "JAUNE", "LYNCH", "SPOUT", "PORES", "GOMEZ", "GABLE", "ACRID", "COZEN", - "BROCK", "DOYLE", "ZWECK", "ACTON", "RARES", "PIPED", "ZONES", "LIARS", "BOYLE", "KAMPF", "ALBUM", "SNIFF", - "MARES", "SHACK", "OMITS", "CITES", "AROMA", "WITTE", "HILFE", "HEERD", "ARGUS", "PINED", "USURY", "EARLS", - "YKSIN", "CULTE", "NOBIS", "SPILL", "FLOTS", "PROIE", "LURCH", "ADOLF", "ARDEN", "CARNE", "INTET", "WREAK", - "VOLLE", "SLIME", "TONGS", "GUERE", "VALES", "MANNA", "ISLET", "MANER", "DUNNO", "EASEL", "ECRIT", "NOOKS", - "GLENN", "HOSEA", "BUSTS", "ENACT", "FETES", "CHAUD", "GUILD", "SIZED", "ENOCH", "SPIEL", "OILED", "NATAL", - "ROCHE", "BASER", "PODER", "QUOTA", "FINIR", "SELMA", "NADIE", "DRAME", "LARKS", "DOWNY", "GULLS", "ARBOR", - "CERES", "LANDE", "WYATT", "IDIOM", "QUILT", "TUTTA", "HEINZ", "MAMMY", "MONDO", "TACHE", "QUACK", "TALON", - "ENSIN", "VEUVE", "SODOM", "DUELS", "RANCH", "MINNA", "CRAPE", "WAVER", "HOOPS", "MEBBE", "VERSA", "KUTEN", - "AVIEZ", "WIJZE", "PLAIT", "BIGOT", "URSUS", "VOLTA", "DRONA", "PADDY", "AHMED", "GIBBS", "OGSAA", "PABLO", - "TOILE", "TERME", "GRAIL", "JUICY", "CINCO", "VOORT", "RERUM", "MUNRO", "SAMMA", "REMIS", "AVOND", "ALLOY", - "RIZAL", "SITTE", "NEWES", "ONZEN", "OFFEN", "SCOFF", "XXXIV", "NOUSI", "GLUED", "BEARE", "STARB", "FUITE", - "BRETT", "NOTCH", "AARDE", "BRUNT", "DEWEY", "GAMLE", "POBRE", "LAITY", "RAVED", "TROTZ", "SPRIG", "JEMMY", - "MEUSE", "FUEGO", "BUELL", "WARMS", "BIXBY", "TWIST", "ROLLO", "RISKY", "GROPE", "MEGET", "DANNY", "LONGE", - "LOOKE", "AYRES", "SUPRA", "CHANG", "FOLGE", "SWAIN", "ARRAS", "CHRON", "SEIEN", "OTTAA", "OBEYS", "HALTE", - "MOLTO", "HORUS", "HALLE", "DEVON", "HARPS", "PHIAL", "SELIM", "TIDAL", "TAPIS", "PRIER", "DENKE", "FONDO", - "OGDEN", "ENDOW", "ASTIR", "FAIRS", "BAKED", "ENGEL", "HANNA", "SZENE", "PIVOT", "WIRED", "RAFTS", "COTES", - "PLATS", "TIMON", "ANNAN", "MENTE", "RONDE", "STINT", "RAGES", "KENNY", "SADIE", "ZIJDE", "CALLE", "DIVIN", - "DUPED", "VOUCH", "FOOTE", "LEWES", "LIISA", "DARCY", "SIGER", "LUCAN", "IEDER", "ARMAS", "DONAL", "BRADY", - "WERKE", "ANNEX", "STATO", "HUNTS", "KAMER", "ALWAY", "PHILO", "SYNOD", "PROBE", "HORNY", "LEEDS", "FOUNT", - "NABOB", "ESTAR", "AVRIL", "DEFOE", "CAGED", "LOOPS", "NEVEU", "CLYDE", "GOEST", "MANES", "LEAUE", "TUNED", - "RISHI", "POSER", "STOIC", "NUEVO", "SAMOA", "SALIR", "SNORT", "ADIEU", "BOCHE", "LOGIS", "JAKOB", "LESSE", - "FILMY", "FEINT", "HOOGE", "LESEN", "TUTTE", "VEDIC", "BATON", "SCION", "SUBIR", "MASSY", "CLOVE", "WHOOP", - "TEILE", "DEBUT", "STOWE", "HELPE", "PAILS", "ADELE", "HERUM", "DESKS", "LIIAN", "HINZU", "SIDED", "TRITE", - "HORAS", "JINNY", "POPPY", "EQUIP", "NEERE", "URINE", "VIENE", "BERNE", "DUROC", "PERTH", "ARIEL", "GREGG", - "WOLLT", "MOREL", "DEEMS", "VIEIL", "MEZZO", "POETE", "HERON", "SHIRK", "SIETE", "HEMOS", "SORES", "EATON", - "ASHEN", "VERSO", "ALTON", "STORA", "SWOOP", "CZECH", "JOVEN", "SOFAS", "TIMED", "XXXVI", "KREIS", "WEILE", - "SCOUR", "JACKY", "ROLFE", "PIENI", "STIRN", "DREAR", "PIERO", "TRAYS", "SYLLA", "ERANO", "LURKS", "GOURD", - "MAAKT", "WANED", "LIBYA", "ALSOF", "FELON", "BREST", "ELENA", "WERDE", "JUNTO", "TENTE", "VERTE", "SILLE", - "VOLER", "ALBAN", "GALEN", "REDAN", "WALSH", "ARBRE", "ASTOR", "RAYON", "REEVE", "MUCHA", "NUORI", "LABAN", - "SIKSI", "LUCCA", "ALLUS", "PURTY", "BUDGE", "USURP", "MONTY", "YEMEN", "JOKED", "QUAYS", "LECOQ", "WYLIE", - "MACON", "UPTON", "NEALE", "SEENE", "OFFRE", "OTTER", "POING", "LEHRE", "ADOBE", "ABYSS", "SPURN", "PLATT", - "HUUSI", "PLUTO", "REMUS", "MOGUL", "DULLY", "BLOED", "SPICY", "GEEST", "FEIND", "KETCH", "LASSO", "ESTIS", - "BRYCE", "MENER", "PACHA", "ANTOI", "LEPER", "BAUER", "JOHNS", "FEREZ", "SWEDE", "HERAB", "VOTER", "SIREN", - "ELDON", "ROOKS", "EBERS", "NESTA", "YEERE", "ROLLE", "SLADE", "GLAND", "JOSEF", "BORES", "GALOP", "NELLE", - "HEGEL", "MEANE", "WIDEN", "DAWES", "PLUSH", "ERHOB", "FORSE", "SOLLE", "ZIEHT", "SUCHE", "BERGE", "HASAN", - "MANDY", "OEVER", "BAIRN", "ELGIN", "ZULKE", "AKBAR", "BUREN", "CRUMB", "BACKE", "LINGE", "WOHIN", "HACEN", - "BEENE", "LARVA", "REGEL", "BEVEL", "DUVAL", "KNAPP", "GEEFT", "REELS", "JUANA", "ESSER", "PLATA", "STIEG", - "RACEY", "KNELL", "LLAMA", "VOISI", "HINDI", "PASAR", "VENTS", "HOLDE", "PITIE", "PAGET", "SLUMS", "GIRTH", - "DROSS", "MAIRE", "LAGER", "FEHLT", "MAZES", "UNDID", "THYME", "WHORE", "WOGAN", "BLUES", "RIAIT", "PANZA", - "SALVE", "ZOUDE", "HERRE", "MIDAS", "PREIS", "SIRES", "GLUCK", "ROAST", "FABER", "ASIAN", "DEREK", "DIGBY", - "YARNS", "NUAGE", "SENCE", "HEWER", "SAWED", "SAVOR", "SWIMS", "CABOT", "TAFEL", "ANSON", "CAROL", "SNART", - "HUSKS", "SERRA", "LYMAN", "MARNE", "EDDIE", "GENII", "DAMEN", "RAMON", "FAUNA", "ARMEE", "CHUSE", "DEMIE", - "COMBS", "VENAL", "BLINK", "CYNIC", "JOLLA", "FUESE", "DUPES", "LOSER", "TERSE", "DUNES", "KENNE", "WINDE", - "GAYER", "CONAN", "MISSY", "BALLE", "RANGS", "REBUS", "FUSSY", "DRILY", "JUGES", "HABET", "IMACR", "CUZCO", - "FELLA", "HEWED", "AIENT", "SOULE", "CAPUA", "ULTRA", "EBBED", "VIPER", "CAFES", "KENNT", "CRAZE", "ELMER", - "DRONE", "SERAS", "SIENA", "WOLFF", "GILLS", "CRYPT", "GRAFT", "SANTE", "HALTS", "GAPED", "GELUK", "YOKED", - "FONDS", "FERNE", "NAOMI", "SECHS", "BUXOM", "TENEZ", "QUAKE", "TENUE", "ROUVA", "LOURD", "LYNDE", "REACT", - "SOUPS", "ODEUR", "KAZAN", "BOXED", "GRUEL", "ECLAT", "GLENS", "JOHON", "SOPRA", "COCKE", "RENEE", "SWISH", - "PFERD", "SCHIP", "KERRY", "ALDEN", "DANSE", "DELTA", "UNIDO", "SOORT", "EXULT", "ANDEN", "BLIVE", "HORNE", - "AMORE", "EORUM", "KINDE", "JEERS", "NAMUR", "ULICK", "SNAIL", "ALECK", "MEEST", "SUEUR", "DUMMY", "MARSA", - "CURRY", "ELTON", "NEDDA", "DOLOR", "GEVAL", "DEUIL", "THONG", "MULTA", "RESIN", "DIRGE", "LARGO", "INDUS", - "LEMMY", "BONUS", "PLEAS", "ALINE", "ABOUE", "CRAMP", "CORSE", "VERTY", "FALTA", "WOMIT", "EARNS", "PRATE", - "WEARE", "PHEBE", "OVERT", "BRACH", "CAMPS", "TRAUM", "TALTE", "MERGE", "SAUVE", "RIUER", "COALS", "FLOYD", - "ASSAI", "EMPOR", "NOTTE", "VINDT", "ENKEL", "SUCHT", "ZAGEN", "EPIST", "LYELL", "RILLS", "WOFUL", "MEKKA", - "ZULUS", "HUSSY", "GASPS", "JOTTA", "SOOTY", "ANNUL", "CAPES", "SHERE", "NENNT", "SORGE", "DUANE", "CALMS", - "DARBY", "TAHOE", "LIEST", "SAUTA", "SPURT", "VINCI", "ANNAT", "BOORD", "DROPT", "ZELVE", "DWARF", "ATTER", - "BLEUS", "DEANS", "JEWEL", "HEMEL", "AFIRE", "FLEAS", "ADAIR", "INSEL", "MUITA", "TALLY", "CABAL", "SAMME", - "MELON", "TEPID", "MIELI", "FOLGT", "POLLS", "ROSIE", "WALDO", "LEBTE", "HINGE", "SNOUT", "STURM", "BEALE", - "HAGAR", "SEWER", "SONIA", "TEXAN", "BEETS", "CHERS", "BURMA", "HOWEL", "EYING", "SAIDE", "PUNIC", "ANTIQ", - "UNTIE", "DILKE", "SOUPE", "WYNNE", "SKATE", "AMYAS", "AGUAS", "HESSE", "ADAGE", "ROOST", "WOLDE", "LEIPZ", - "TILED", "EAMES", "ASTUI", "SCOOP", "KNABE", "CLINK", "ELEVE", "RAZON", "VIEJO", "REYES", "ENDNU", "RIVEN", - "ORDEN", "PARRY", "GULFS", "EXTOL", "AUNTY", "TWEED", "RENDS", "STERK", "SIDON", "XXXIX", "SUDAN", "THANS", - "COMYN", "MATTI", "MONCK", "OHREN", "HADDE", "VREDE", "WAIVE", "LEJOS", "MITRE", "BEFEL", "PASTY", "WORKE", - "BLOTT", "LIEBT", "BARRE", "SOARS", "FISKE", "CERTO", "WRITS", "LENTE", "VAINE", "FALLE", "VERDE", "MOGEN", - "GRETA", "MOCKS", "TRANS", "CROAK", "DITTY", "VRAIS", "MINOS", "SALUA", "CHAOS", "PEKIN", "APPEL", "MAGIS", - "FINCH", "ELVES", "ISANG", "KOLME", "POESY", "DECOY", "STOPT", "LUCIE", "NETTA", "SOULT", "ALGUN", "IDIOT", - "DISKS", "CRISE", "EVOKE", "LIEVE", "KLEUR", "FERMA", "EENIG", "CIRCE", "SUELO", "MATER", "BATTU", "LINIE", - "MORNE", "SEGUN", "LARRY", "TOMAR", "GAGNE", "SCALY", "STAVE", "GLEAN", "KOVIN", "DORIC", "GORSE", "INDES", - "BEPPO", "GLANZ", "KUNTI", "OPFER", "DRIES", "TOTTA", "SHIRE", "SILVA", "OBRAS", "NAAST", "DETTO", "OMAHA", - "SHEBA", "TITAN", "BEAKS", "COWAN", "MARKT", "ADOWN", "GOUTY", "HAREN", "TOADS", "QUALI", "RENAN", "MANNE", - "SNORE", "COMMA", "ZYNDE", "LYGIA", "RUDER", "SCRIP", "WIERD", "ELEGY", "TWANG", "ANTTI", "SNIPE", "TABOO", - "MOHUN", "BRANT", "CAIRE", "DEMAS", "ARDAN", "ALTID", "COLLA", "BRAWL", "LEASH", "CHAFE", "PARED", "VOMIT", - "MYERS", "SOURD", "SANOO", "TAIRE", "ABDUL", "GNADE", "PALSY", "MIKSI", "JOHAN", "MELEE", "DRAWL", "HULOT", - "SOUCI", "WILLE", "AGATE", "NOMEN", "SEEKE", "GRIPS", "LEGEN", "SINEW", "JAMBE", "VRAAG", "EMACR", "FETID", - "LEWIN", "EDERS", "VIVES", "KALLE", "FILMS", "GUTES", "MARYA", "MYSIE", "JERKS", "PAARD", "NANNY", "EENER", - "ROVED", "CHICK", "BITCH", "HINAB", "IDEEN", "ESSET", "HOURE", "RHYME", "JULIO", "BELLO", "HAVIA", "DEARE", - "IDLER", "WOBEI", "JABEZ", "MIAMI", "ESTOY", "AULUS", "ANCOR", "MOVER", "WARRE", "IMPEL", "KRONE", "RACHE", - "FASTS", "NEPAL", "BANJO", "REINO", "DAWNS", "HETTA", "STAEL", "CHIRP", "PENTE", "SOLLT", "VOCES", "DEZER", - "LAINE", "MINDE", "ANENT", "ASSET", "PUITS", "SWAYS", "MOCHT", "WAHRE", "DEMUR", "BETTE", "LUZON", "TIESI", - "TONED", "FREDA", "TAINE", "DALLE", "SPITS", "DYKES", "TOLLS", "SOONE", "EURER", "ANDAR", "KITES", "KENBY", - "PROPS", "PUNKT", "TIEFE", "FLAPS", "NIMES", "ROHAN", "GUIDA", "GOODY", "LEROY", "BUCKS", "ONKEL", "ADLER", - "ALAIN", "SWIRL", "ZOORT", "GARRY", "AMAIN", "TEINT", "EERIE", "GUSTY", "AIDES", "ANIMO", "DOEST", "DREST", - "LAPSI", "FARBE", "RACKS", "VOEUX", "BELIE", "LEMON", "INCAS", "NECKS", "LOGIK", "RIVET", "DOTTY", "EWING", - "LENOX", "ZORZI", "TUNNE", "COLDS", "INNES", "CARON", "TULLY", "KULKI", "NIEUW", "RIPER", "HATER", "ROSEN", - "WAIFE", "FATTY", "VOGEL", "YPRES", "CASAS", "SINUT", "WINKS", "NOLAN", "BOARS", "BIRON", "MINAE", "KRAAL", - "STUHL", "PODIA", "MARLY", "MOROK", "DINES", "VENTE", "WHACK", "AMINE", "PALMA", "DANDO", "TAVIA", "QUILS", - "PATIO", "TRICE", "MARIN", "FOUET", "WAILS", "HAKON", "WALLY", "WINCE", "VOLGA", "TEKEE", "TURNE", "REFUS", - "SERRE", "LEAKY", "PROXY", "CAPPY", "BLARE", "BUSEN", "MAORI", "ALOES", "SLAVS", "BANCS", "VESTA", "METED", - "NEUES", "ALWYN", "GURTH", "JOSUE", "STOLZ", "JOZEF", "JOSIE", "MAYER", "STUBE", "ZADIG", "SLOEG", "STRUT", - "REARS", "MARTA", "BROIL", "CARTA", "DEGEN", "HURST", "MUNDE", "EPICS", "VILJA", "PESAR", "SPAWN", "MINUN", - "TALKE", "CROFT", "TESTA", "SEARS", "MYRRH", "CASED", "LISTE", "CHURL", "DICEN", "KURUS", "CORAL", "LIVIA", - "COLTS", "DRAYS", "ESTAN", "POETA", "CABUL", "JUDEN", "LATHE", "LITLE", "LEPIC", "EATER", "DIJON", "PAVIA", - "CLODS", "BYRNE", "JULEY", "GENTS", "VERNE", "ASSAY", "CHINS", "LIZZY", "PUHUI", "CANBY", "KNOBS", "KRING", - "BEZIG", "STINK", "STUND", "BUTTS", "DONOR", "SLICK", "WASPS", "HAMAN", "LIMES", "MEURT", "HAMEL", "CITIE", - "DIVIL", "SLAYS", "CHUMP", "DIKES", "PEEPS", "LISLE", "MOTTE", "FORET", "MACHE", "BREVE", "STROM", "BUENO", - "JEHAN", "BONTE", "GETAL", "HOBBS", "TAHDO", "VOLTE", "GIUEN", "TEXTE", "CLANK", "VITAE", "MAUVE", "LIDIA", - "SMEAR", "CIRCA", "JOUIR", "PRETE", "ARTEN", "PARKE", "CAVIL", "XLIII", "STUDS", "VALLE", "BOUTS", "KOMMO", - "NEITI", "GRIPE", "JOKES", "SOFIA", "ASPEN", "HEROS", "LOSSE", "BRAUT", "HOODS", "KRANK", "LINER", "TIDEN", - "FLAWS", "HAUTS", "UMHER", "MAATA", "HELAS", "SULLE", "JERKY", "OUTDO", "RABID", "CINNA", "MANIE", "TUSEN", - "BATED", "BELLY", "BORST", "MOLES", "YUKON", "STORK", "RAZED", "OMACR", "SLITS", "SERIE", "HAITI", "MORAN", - "RESTO", "WOVON", "BISON", "TULIP", "DARYA", "REEDY", "AILED", "DIESS", "RIRES", "SELBY", "ELITE", "FIXER", - "MIHIN", "NORMA", "MEADS", "TIERE", "OOZED", "POSES", "MIENE", "GEHAD", "DIENT", "RECIT", "AZTEC", "EILTE", - "GNATS", "JETTY", "JOIES", "KOHTI", "BARTO", "MCKEE", "SAUDI", "STAGS", "PARME", "SINGE", "ALVAN", "CLAMS", - "CRONE", "CORSO", "PUHUA", "SATIS", "DENRY", "FURRY", "FURZE", "PUEDO", "COUDE", "DIDNA", "SOIRS", "ACORN", - "KNOWE", "KREEG", "TOOTH", "SERBS", "DUNCE", "THEIL", "SANFT", "ASHER", "NOGEN", "TETES", "AFFIX", "CREER", - "PITHY", "MARIO", "WORDY", "SIMLA", "ROTEN", "VISOR", "ZAKEN", "BOGEN", "HERAN", "ILLUD", "JAHRH", "CUBIT", - "PRISM", "BAIRD", "DUPRE", "TORRE", "REGNE", "SUCRE", "WERRY", "MORIR", "SLASH", "MENEE", "SERUE", "WIENS", - "BUNKS", "SEERS", "ZOGEN", "CORKS", "HOGAN", "GARDA", "TARTS", "FROME", "POCOS", "SPRAY", "CAIRN", "BAITH", - "DAGAR", "DEJAH", "ICFTU", "ZUNGE", "CHARY", "CHURN", "FLOES", "SIENS", "VAPID", "GAVIN", "GRIER", "BLOTS", - "GRAPH", "CUBES", "BIGHT", "ARLES", "MICAH", "NEBEL", "DIVER", "STABS", "BESSY", "KUULI", "SITZT", "SENAT", - "PINKS", "SPANS", "VINER", "ALKAA", "HAELT", "BAYLE", "CREUX", "ABBAS", "CROCE", "JAFFA", "ABLER", "GULCH", - "KANSA", "LIENS", "TITEL", "MATED", "MEGAN", "ALACK", "COHEN", "HELGI", "SAMOS", "ALDER", "FORAN", "LANKY", - "GRISE", "OATES", "LAVER", "IONIC", "ALIBI", "OUVRE", "GERTY", "PONER", "KEENE", "FESTE", "SANAT", "ESSEN", - "ADDER", "KURZE", "REALS", "CRAYE", "SANON", "TULEN", "VIDES", "POATE", "WIPES", "ANITA", "GAMLA", "DELFT", - "CESSA", "FORDS", "SERIA", "ASAPH", "BUDDY", "GRAAF", "BENNY", "KREBS", "CLAPS", "AMIES", "DUPIN", "VEXES", - "COMUS", "ROUES", "IRATE", "MANSE", "TACKS", "BRACY", "TABOR", "STORT", "JINKS", "SHEIK", "PARVA", "SKUNK", - "ALPES", "VERUS", "BOGUS", "RIVES", "NINON", "FILLY", "JENKS", "DOLCE", "ZETTE", "EPSOM", "DENYS", "LOBES", - "SLUSH", "BONUM", "CANOT", "MYLES", "OTWAY", "TREUE", "DANKE", "FREIE", "FITCH", "SUMME", "CAPER", "BETTS", - "SPREE", "TEENS", "IRWIN", "STAHL", "MIXES", "TIARA", "MOTTO", "NOGHT", "STURT", "BLEUE", "DALES", "STING", - "SMOCK", "BLOCH", "FUROR", "SATED", "VENNE", "JAPON", "RIGBY", "DULCE", "HEIRS", "WISPS", "PROWL", "REGEN", - "PENIS", "SICUT", "TOSTO", "HULDA", "HOFFE", "SEEDY", "DRIER", "LILLA", "ZEVEN", "LADLE", "SAURA", "VESTE", - "AINOA", "ALICK", "RUGBY", "CORPO", "BLYTH", "JANUS", "DICTA", "VAUNT", "LAVAL", "DIGHT", "PHOTO", "ZUVOR", - "ELSJE", "LUNGE", "TOMBS", "STOFF", "SURAT", "BEVOR", "OUDEN", "TRESS", "WIRES", "TIMOR", "RUSSE", "TABAC", - "WIRFT", "BERYL", "CACAO", "HEALS", "ROODE", "SWARE", "LESER", "LIDDY", "ANIMA", "ILLIS", "LUONA", "PECHE", - "ROPER", "TORAH", "GOTTA", "SOMIT", "KOMIK", "ANNEE", "ERDEN", "BANGS", "PREST", "HOUDT", "ONZER", "RAKES", - "PAIRE", "SOLVE", "TYSON", "UTICA", "TROUS", "GAMUT", "PEPIN", "CHUNK", "MAMIE", "GUYON", "ORIEL", "MIEDO", - "BUTTE", "OMNIS", "QUISO", "GERDA", "DIETH", "SIRUP", "WHISK", "FAERY", "REGIS", "INANE", "MULLE", "SHINS", - "TAMAR", "ETTEN", "CIBOT", "BOGGY", "CAPUT", "ETEEN", "GRETE", "WADNA", "CRUST", "IPSUM", "BLIGH", "LOUER", - "ONKIN", "BOGGS", "HOLDT", "MEINT", "SKEIN", "TOCHT", "VIALS", "AIDER", "RECUT", "GRECS", "LOUGH", "SPOOR", - "SEEME", "KNOPF", "STACY", "FIEFS", "WEEDY", "BENIN", "CHINE", "BREDA", "BEKAM", "SPINS", "WARST", "BOXER", - "TROST", "STUNT", "ANIMI", "AURAS", "SUMMA", "YHDEN", "YOUSE", "GROOM", "PETTO", "POMPS", "MIRZA", "HALLA", - "DENNY", "JAILS", "PUFFY", "DELLS", "MUREN", "UNCUT", "LEACH", "LIKEN", "MURAL", "OSMAN", "TARDA", "DESEO", - "MODER", "MODUS", "MANON", "COLIC", "PRUNE", "VIVIR", "CLINT", "RIGGS", "CANNE", "SALVO", "AIRES", "PIKKU", - "SAMEN", "BASTE", "ARCIS", "EASIE", "SHAMS", "MATTY", "CANNY", "NEIGH", "HYMEN", "DAUNT", "BRUNE", "FORZA", - "YAZOO", "VENDU", "NICKY", "WINNA", "PESTS", "WARME", "BENET", "TOSIN", "VASCO", "BETES", "LIEUE", "PETAL", - "ANNOS", "COLLE", "TRIEB", "KLAUS", "PUNIR", "VODKA", "THRON", "DECIA", "BRAUN", "SHUNS", "UUDEN", "ALPHA", - "FLOUT", "SELLE", "STOOL", "NEUEM", "BASLE", "HERNE", "INFRA", "ERASE", "NESTS", "BERGS", "MEDAN", "NOITA", - "SUCKS", "IESUS", "CITER", "FRAGT", "VEDER", "DRUID", "SCALD", "ALIDA", "QUITO", "HOERT", "JUNOT", "PERDU", - "GEARY", "BOOKE", "KENDE", "CHICO", "MEATH", "ROGUE", "SMYTH", "DIVES", "FILET", "FLAKE", "PUTTY", "SIDAN", - "DANAE", "ILAND", "BORDE", "HERBS", "LIMBO", "PEINT", "ROLES", "BRINY", "ETRES", "FLANC", "BLATT", "DERRY", - "MUEHE", "RODDY", "DAMES", "INGER", "XLVII", "AIRED", "CHATS", "PAULO", "EJECT", "FUNGI", "SIKES", "CADRE", - "COOLS", "SNAPS", "BLENT", "BOOBY", "VIIME", "DALLY", "HIVES", "LEDDY", "BALDY", "PRANK", "NONCE", "OVENS", - "SCHAL", "AUGUR", "CALYX", "MOWED", "TOITS", "CIMON", "SWEYN", "EDLEN", "PALES", "SPERM", "THANE", "BEZIT", - "EILEN", "UUTTA", "NAMAN", "MACKO", "SHANG", "LITEN", "BAZIN", "THORD", "ARMES", "YEARE", "CALLY", "TRYST", - "CAPRI", "ETHAN", "HOEHE", "AOUDA", "HALEY", "BERTA", "KAREL", "CLUES", "CURST", "FORAY", "ITHER", "LASST", - "RICHT", "YAWNS", "WILKS", "GRIFF", "JOKER", "MOCHE", "ATLEE", "BAIZE", "SITAE", "TEMOR", "TENET", "HAYTI", - "MANGY", "LEVIS", "SHAKS", "CURIO", "ERICA", "FRETS", "TAKAA", "KLAAS", "FROCK", "SHIED", "TRUSS", "WACHT", - "LAMME", "SAMAA", "ARMER", "SLINK", "BLEEK", "BIBBS", "ARMIE", "BANDY", "HARDI", "MINNE", "MORIN", "COURU", - "CLUNY", "MOLTI", "PLOMB", "AHMAD", "ROCCO", "SLAKE", "HAARE", "ARIAN", "WOCHE", "ZILAH", "LURES", "KLEID", - "NUOVO", "TUMOR", "CLEON", "CORTE", "SUNNE", "ELFIN", "GLAZE", "HEDEN", "VREES", "BODED", "HVIDE", "TRIBU", - "ZACHT", "YUSUF", "FRUEH", "LEDEN", "SITIO", "LITET", "MAURY", "PRYOR", "ROBUR", "GRIST", "RUFEN", "VAERE", - "VILKA", "JORAM", "FONTE", "NOGLE", "BASEL", "FIRMA", "HUNCH", "STAVA", "ALLIE", "FIERI", "HOLEN", "TROTS", - "KNEAD", "MANGO", "OEUFS", "PONCE", "QUEED", "KLANG", "AMENI", "PONTE", "EIGNE", "BRILL", "LOCUM", "NERFS", - "CLEVE", "COPIE", "EHREN", "BOTHE", "SIKHS", "SHREW", "HODGE", "WILEY", "ALTRE", "SIGLO", "CORFU", "HAIRS", - "MALER", "OZONE", "IGUAL", "VORST", "ANGES", "INNAN", "NOMAD", "DOMIN", "FUTUR", "ROPED", "HALED", "NAVEL", - "PEASE", "SAMBO", "HABLA", "ALTYD", "BREIT", "RENTE", "BAGGY", "LANGT", "NOCES", "SHEAR", "BULGE", "SLEDS", - "TRURO", "ZWARE", "BANNS", "NAPPE", "PLASH", "TARES", "WHIRR", "SCOTS", "WANDA", "CREDO", "FUMED", "GABEN", - "POJAT", "SISTA", "VIVIE", "HALVE", "SICKE", "SIMUL", "WHELP", "BREEN", "EBENE", "HAWKE", "STAUB", "MOVIE", - "PECHO", "BUONA", "CULPA", "GAGNA", "HEELE", "FLITS", "HIESS", "SOLUM", "STEHN", "FIRME", "ESTER", "MACAO", - "LIBER", "MCKAY", "PETRA", "TOKYO", "SOLCH", "BAYOU", "HELGA", "LOCUS", "ZWART", "FABIO", "ROSNY", "CORNE", - "MESMO", "BASTA", "DISCS", "GRINS", "FLEES", "PIGMY", "MAUER", "FRISK", "HUNDE", "LOGOS", "TROMP", "HOHER", - "SOGEN", "BOEUF", "CUORE", "FACIE", "RANDY", "ALTRA", "ANKER", "DROLE", "LARGA", "POJAN", "ORTON", "DEJAR", - "GIBES", "MARIS", "SETTE", "SUBIT", "VARMA", "WISHT", "GUPPY", "THOTH", "MANUS", "TRILL", "FIRTH", "BANAL", - "METTE", "SNAKY", "ESIIN", "LUNGA", "BOOMS", "GRUBS", "NEEMT", "TASSE", "OHEIM", "ENCOR", "FELLS", "VERTS", - "GUNST", "SYKES", "VESTS", "COLON", "AGONE", "AIMEZ", "BAHIA", "LEDGE", "LICET", "BEGAB", "FOAMY", "HULKS", - "NEGER", "KEYED", "MAIST", "FABEL", "LORNA", "DICHA", "SACRE", "SITEN", "GODEN", "DARKY", "DRAVE", "NIXON", - "LAULU", "FIGUR", "GANGE", "KLAMM", "LACEY", "KORTE", "RUDES", "TUERE", "LUNGO", "VERRY", "VAURA", "CUANT", - "DRAUF", "OFFAL", "GORGO", "MENUS", "MINED", "OPTIC", "DRANG", "GRIME", "CORNY", "KETTE", "HEADY", "IRAIT", - "PAPEL", "BLITZ", "HUGHS", "DROEG", "TENDU", "WIERP", "DOANE", "ELATE", "LACHE", "PIEUX", "TULLE", "TONGA", - "NAEHE", "CLASP", "FANNS", "WAFER", "DRUCK", "SAUTE", "NEVIS", "PITTI", "FALDT", "USQUE", "EWELL", "GUNGA", - "MORAY", "FISHY", "FLAIL", "MEBBY", "DAGNY", "CLOGS", "ELEND", "MEAUX", "GOLFE", "HACHE", "SAILE", "GIRTY", - "NADIA", "PAVEL", "PAHAA", "SAEPE", "KIRKE", "WALDE", "EXITS", "DOBBS", "HAMAR", "MARCO", "NOYES", "HAILS", - "MALEN", "SHALE", "TAGER", "VELDT", "GREIF", "MASHA", "LOUIE", "DEDEN", "LEZEN", "NETTE", "CROWE", "MOYNE", - "GILDS", "CREON", "GOTHA", "KAREN", "BRUME", "VERIE", "BOSCH", "MEURS", "HYENA", "LLENO", "HOCHE", "CONDY", - "PYOTR", "CALMA", "SAMAN", "STEHE", "BERIC", "LIBBY", "MONTS", "TRONE", "JUSSI", "ALCUN", "BEGGE", "COVES", - "NYODA", "ALLZU", "DAIES", "MULTE", "JUNKS", "MUSST", "DRAPS", "HAAST", "JACKS", "FAYRE", "RUNDT", "FREUD", - "COBRA", "FUMEE", "SAGST", "PURDY", "BEELD", "TORTS", "VERVE", "BRAZO", "JOYED", "WAGTE", "JOURN", "MUNGO", - "PAPUA", "FUELS", "HALBE", "PALMY", "REGLE", "ELISA", "JUSTO", "TWIRL", "CONST", "PASSO", "AMANG", "LICKS", - "NEDER", "DEGRE", "DIREZ", "FRILL", "KORAK", "KREUZ", "TYCHO", "POVAS", "ASTON", "GOSSE", "ASILE", "BOOZE", - "BUMPS", "SOMOS", "WASNA", "LORCS", "CRATE", "GROEN", "WOOER", "HEBER", "JUNTA", "TURCS", "VOLTO", "WHILK", - "DEEPE", "NEBST", "CODEX", "JUIFS", "ASIAA", "FULCO", "DOMED", "OUTEN", "STEPT", "GALBA", "CHEAT", "COULE", - "MEETE", "PAWED", "BUNCE", "SANIN", "JOLIS", "PORED", "PYYSI", "HOWAT", "LAURE", "ONNEN", "PRIED", "SCHAR", - "BAZAR", "MITAD", "MOUND", "FUERE", "TRYON", "BAISA", "CROUP", "KUNNE", "DOONE", "FOLEY", "NEHME", "DUOMO", - "SONNA", "FACIT", "KENYA", "GIVIT", "BLEAT", "HURLS", "EIFER", "AILIE", "BASIL", "HARMS", "SUTRA", "LARME", - "BRITT", "GRADY", "MOROS", "TRIPE", "ADMIS", "HERTE", "VOIES", "LANKA", "FUSSE", "GLOAT", "GROAT", "CLEEK", - "MESES", "MOOIE", "HAMIL", "FORDI", "MENOR", "SATYR", "TODDY", "TANNO", "GAMIN", "SOLOS", "YOURN", "AHMET", - "FATTA", "ERWIN", "POWIS", "SEGEN", "AMENE", "BASAL", "MOSTE", "TOYED", "MAGDA", "DIEPE", "GENOU", "OCHRE", - "WEITE", "VOLKE", "POORT", "AIKEN", "JOPPA", "SLUYS", "FIERE", "JOUST", "LACHT", "SAYDE", "DELOS", "LETHE", - "TAGUS", "ALIIS", "HIVER", "TENGA", "ECOLE", "FUENF", "ROTHA", "VETCH", "GLANS", "LAIDE", "FLYNN", "KHASI", - "KELLS", "BOONS", "SLUGS", "ULCER", "VENTO", "BRAWN", "ENTRO", "VAIMO", "AGNEW", "CREES", "MEIGS", "GOUGH", - "PUSSY", "VERBA", "RICKS", "ROWAN", "FERRO", "LAGDE", "PRESO", "RUPEE", "FRANS", "ALDUS", "CLARO", "HANNO", - "VIEJA", "MARFA", "OSTEN", "GAUZY", "BOULE", "DRAFT", "GREVE", "SETON", "HEEDS", "SONNY", "HANSE", "LUISE", - "ALIUD", "AMASS", "EARES", "ROWDY", "STEWS", "KLARA", "ROSSI", "HENKI", "NOSTI", "ZOUDT", "GROTE", "DEALE", - "FREMD", "KLONK", "LIBRI", "CAPET", "FLOSI", "SONST", "CULTS", "DIKKE", "ALGER", "DIXIE", "NUNEZ", "QUAFF", - "QUALM", "TAFFY", "QUEDA", "SEDGE", "GUERT", "ETIEZ", "ICING", "PHIPS", "PICTS", "ABBIA", "THEER", "COREA", - "KABUL", "COMEN", "GOLDE", "VIXEN", "ZWAAR", "EADEM", "FREES", "MARGE", "MEREN", "SANAN", "EDLER", "LUOGO", - "PEDAL", "VAMOS", "OSTIA", "ALTES", "COUTE", "MANDO", "AESOP", "SAPOR", "PIEDI", "GIRLE", "EMORY", "MADDY", - "HULLS", "REVES", "BAITS", "MARTS", "PROUE", "RIFTS", "IFRCS", "SANER", "EISEN", "MORGA", "WISSE", "DANCY", - "HAZEN", "LASKI", "ESTAS", "AVOUE", "CACHA", "EWIGE", "LOOPT", "WAMBA", "ACASO", "MOLLE", "JUXON", "BOCCA", - "COLUI", "TRONC", "DAUER", "PARET", "CIEUX", "DOERS", "MICHT", "NADAT", "ROULE", "DURER", "GRADO", "SUFFI", - "WAYES", "HAWES", "VOREN", "MILCH", "HVERT", "COTTA", "ZAIRE", "ALLOT", "PANSY", "FOILS", "LEAKS", "SEKIN", - "SEUEN", "WHOME", "BERRI", "BIGGS", "PARAS", "PROSY", "RACER", "BOHUN", "OOTAH", "NIOBE", "COPRA", "PLAGE", - "SPEKE", "AUDIT", "FINIS", "ROMPU", "BANDA", "DAMPS", "QUARE", "TOQUE", "BRIER", "DOREN", "NANON", "BELLI", - "TYRAN", "HILFT", "PUEDA", "MOLDS", "OELIG", "ATHEN", "LARCH", "PUNTA", "CAMEO", "MALIN", "SONYA", "JAUNT", - "LAPIS", "FINIE", "POMPE", "SIMMS", "BEADY", "GUANO", "KEHRT", "RUIDO", "WRANG", "FAHRT", "URIAH", "BLEVO", - "DUQUE", "HACKS", "TASTY", "MAINZ", "COWER", "FUORI", "TEHTY", "ARRAN", "TOOTS", "UTHER", "CROCK", "HELLE", - "QUUNE", "LINGO", "CLLIA", "ELIHU", "APPUI", "BLUER", "DIRIS", "BYLES", "FEDER", "INJIN", "STENO", "AGORA", - "COMUN", "GILET", "GRAUE", "MISES", "WOHER", "MENKO", "AMBOS", "MUTES", "MOREA", "YONGE", "LAKOU", "TECLE", - "BRATS", "LAMED", "PENDU", "TOPAZ", "DRUSE", "LAPEL", "WANDS", "AINDA", "FOOLE", "FUSES", "DEBBY", "EUGEN", - "FABRE", "MALTE", "FEINE", "GANTS", "HETKI", "SENTE", "AMICI", "LOUPS", "OPDAT", "LAUNE", "TOULD", "DURAS", - "VERDI", "STUMM", "CHENG", "FLUSS", "SACRA", "SPADA", "CRONY", "LEGDE", "OIKEA", "ALVAR", "ABAJO", "CURDS", - "PRINS", "THEYR", "BOWIE", "REDET", "WRACK", "FLORE", "ABAFT", "ANDET", "CENCI", "CLAES", "GONGS", "OWENS", - "CUIUS", "EXIGE", "IGNIS", "SLAAP", "OWAIN", "MALLE", "SACHS", "SIGNE", "BOESE", "MUSTA", "TORNO", "GORKA", - "ERANT", "REGNO", "SWART", "DORMI", "MASAI", "FIDES", "KARMA", "RAIDE", "ILIUM", "MARTY", "ROLLA", "DEERE", - "TOMES", "KNOOP", "DOLCH", "PAIGE", "ISTUU", "WAIFS", "COLES", "ASKEW", "EUREN", "HELST", "CLAUD", "QUENU", - "ROJAS", "VYASA", "KULTA", "LEYES", "BOYER", "FUCHS", "NAWAB", "BIDED", "BUSCA", "LORNE", "AIKOI", "BEFAL", - "DUCAT", "ELOPE", "FERAS", "LLEVA", "BEINE", "EMERY", "BRIAR", "DIXIT", "MURAD", "TODES", "OLELO", "SALUE", - "TOTEM", "DILLY", "HAFEN", "NOEMI", "UNCAS", "JUGEA", "QUIVI", "ALIXE", "CASSE", "GAVEN", "GRAMS", "TORSO", - "DAMIS", "NILES", "NORTE", "OXLEY", "PASOS", "AGIAS", "ESSAI", "REFIT", "FAGIN", "HARUN", "AENNU", "DECRY", - "HOOSE", "PONTS", "RENDE", "UARDA", "DRUMS", "PLIES", "PRIUS", "USKOA", "GAHAN", "MIRAR", "MELAS", "ECHTE", - "DARIO", "RHEIN", "ROSAS", "FRUTO", "SLAPS", "BRAHE", "OGIER", "ROQUE", "BEFIT", "VIAJE", "ETATS", "FINOT", - "LINDE", "ZISKA", "LAHAT", "MITAE", "AUTOR", "FERRE", "LAMES", "LLENA", "HOLME", "MAHON", "MUDGE", "SAVVA", - "SEDER", "THUGS", "CERTE", "EILIG", "RAMPE", "GHANA", "TALER", "LEERE", "BURGH", "CLASE", "DIRAS", "MITES", - "PULPY", "CUFFE", "PLADS", "HALEN", "PAWNS", "FAKIR", "MANET", "BRUNG", "TEPEE", "CERTA", "LULLS", "BUTCH", - "ARSON", "DUMPS", "EMITS", "FORTO", "PESTE", "SHANK", "HARPE", "KAMES", "MEERE", "ENGEN", "SUING", "VITAM", - "LLOYD", "THEOL", "WITWE", "DOTED", "DUETS", "MONET", "AVERS", "CADDY", "SINFI", "CALOR", "CORNS", "GEBET", - "HAYNE", "TOTEN", "GUTEM", "TILLS", "JULES", "ROSSE", "LECKY", "STAMM", "WAUGH", "ALLEE", "COMED", "COVEY", - "LONGA", "ZATEN", "BEVIS", "MATTH", "AVERE", "VERUM", "MIRAH", "SOREL", "BOURG", "CREPE", "PRUDE", "MAGUS", - "TAPIO", "ZOCHT", "TOMAS", "TURAN", "BLOUD", "BOORS", "DRAGA", "HELLS", "DECKE", "GEMMA", "CONGE", "ETAIS", - "SANAA", "SLONE", "AXLES", "FAVRE", "ORTEN", "CAPON", "STODO", "POSTO", "DANBY", "SLIGO", "VACHE", "BOTHA", - "CANTY", "CONEY", "LAVES", "NEUVE", "TALAR", "CAKED", "POCHI", "CAULD", "DAAGS", "GNRAL", "RAVES", "OLSEN", - "AMICO", "CINCH", "TIGRE", "MIKKO", "SABIN", "FECIT", "GARNI", "ILLUM", "OOREN", "RUBAN", "BEGAF", "QUIRE", - "TALUS", "FINNA", "HARER", "MORTO", "BHAER", "KOPFE", "LEMME", "BOITE", "UUSIA", "VENIA", "ASAKO", "BOTTE", - "CLEFS", "FAWNS", "MUNDI", "NUBES", "SEGUR", "ANTIC", "JURER", "CRAIK", "BANGE", "KOUDE", "PARER", "VOBIS", - "YOKES", "SAKRA", "SAULT", "BODEM", "PASSI", "SMIRK", "WHAUR", "GYGES", "MONNY", "REIMS", "KOPJE", "POSSA", - "CHIOS", "VARUS", "CLOUT", "LOUSE", "PLAIE", "PROWS", "HOLTE", "DANEY", "WONNE", "FESTA", "SPOOL", "TOREN", - "MATEO", "NINNY", "JUPES", "PLEBE", "TRAHI", "DACRE", "LEIBE", "LUBIN", "AGAPE", "HIDES", "OPERE", "LAWES", - "GALLS", "ASHBY", "ASSAM", "SHIEL", "FREYA", "RODEN", "TYLOR", "CUIRE", "RAKAS", "SPAET", "THUIS", "MINGO", - "NILUS", "FIERS", "MOLTE", "SCAPE", "SKIPS", "ZAMEN", "FINNS", "JUMBO", "PAPST", "ZIELE", "ABASE", "GREEP", - "HONRA", "TESTY", "ZYNEN", "BRUIN", "FLUCH", "PRUDY", "DEPIT", "LUNDI", "TUULI", "UEBEL", "DAGON", "COUPA", - "LUULI", "MORES", "STATA", "KEBLE", "PEKKA", "KLAAR", "MOURN", "DRAXY", "CLAVE", "JOLLE", "VENGA", "OSAGE", - "POLEN", "DIGNO", "HELFT", "GABON", "KHOJA", "SIDEN", "DARKE", "LUMPY", "POPPA", "HECLA", "AGING", "FREUT", - "HALES", "TANIS", "DRAMS", "NEGEN", "STEER", "EULER", "ETOIT", "MAAND", "PHAON", "CREME", "FULLE", "SALUD", - "CHUNG", "FELDE", "RUBEN", "FALLA", "PELEG", "CUYAS", "FACTA", "KNITS", "NOEMT", "TUPIA", "URREA", "SYNES", - "TROUW", "JEWRY", "KAMAR", "PETRI", "STEEN", "HECHA", "WEAKE", "AVILA", "HAFIZ", "HARDE", "MOQUE", "THEIM", - "FARIA", "GRYCE", "PASSY", "OPHIR", "ROSEY", "WEIBE", "GANGA", "PALUS", "AGENS", "COOED", "TRINA", "BETEL", - "UNDAN", "BALLY", "DELLO", "HAIRE", "PEONS", "RAVIN", "WAXES", "VIDAL", "ELKEN", "MAGNO", "RINSE", "VERBO", - "RIPON", "ADORE", "FAGOT", "ROAMS", "BOTEN", "NOBLY", "ROULA", "THAIS", "LOGER", "VOLGT", "MOSCA", "SABES", - "DAMER", "SCALA", "BASSO", "GORED", "NOEUD", "PISTI", "SLATS", "SIXTE", "BUOYS", "PAYED", "REAPS", "RUSES", - "HEALY", "AILLE", "BLASE", "BRULE", "OASES", "PLUGS", "HEARN", "IYONG", "PRIMI", "GRAYS", "PALOS", "TICKS", - "ESTRE", "POUCE", "DAMME", "FLECK", "GENET", "HOUGH", "JEBEL", "CLAPP", "HYDRA", "TAMER", "BLUME", "AVIDE", - "DOWDY", "GIMME", "ESCAP", "POSEY", "CRASS", "EGARD", "NUDGE", "TURBA", "WARTS", "KLAGE", "LENNY", "ELLEI", - "GONNA", "LETTO", "IONIA", "SCHAM", "EPHOD", "MIENS", "TAGIT", "DOUAY", "NICOL", "STOKE", "FLICK", "HUOLI", - "REEKS", "FAROE", "FRUEN", "FICHU", "KERTA", "JARED", "WUNDE", "AYONS", "PAESE", "PATTE", "SINGT", "SCAND", - "ADHUC", "LYMPH", "PARVE", "SCHOB", "STRAX", "PERON", "BUSTE", "DARLE", "EODEM", "MOTES", "ORSON", "RAUME", - "BRINK", "GNOME", "LASTA", "CRUMP", "SKENE", "GRILL", "NIEVE", "BUBEN", "JOSUA", "CEDER", "INNEN", "MANGA", - "OLEVA", "SIXES", "ERICK", "GERRY", "STUFE", "CLAYS", "FACHE", "GELYK", "SALTY", "TEEMS", "AISNE", "RANCE", - "KAUAS", "VYING", "DOUAI", "CASUS", "CORES", "GENIO", "JEUDI", "RADIC", "RUNES", "CLARY", "BRISA", "MUCUS", - "NATUR", "COGIA", "MOXON", "LUTES", "MARKE", "POOTY", "SLAAN", "HAVAS", "MALOS", "SOWER", "DOMUS", "SEGNO", - "DONDE", "ETHIE", "CONCH", "MERES", "CHING", "KITTS", "MARCY", "REPAY", "COMBE", "PAOLI", "ARDEA", "ENCYC", - "KONGE", "MCCOY", "VESEY", "BURRO", "FURIE", "GEZAG", "JIFFY", "QUIPS", "COLLO", "MAGIE", "MYNEN", "COWES", - "OMEGA", "SKEAT", "BELGE", "PAEAN", "EMLYN", "CALDO", "KINDA", "AFTRE", "CITTA", "FETUS", "ONHAN", "TULTA", - "WINCH", "ADIGE", "EMMET", "EUREM", "NATTY", "TALMA", "WILNA", "FORBI", "BARTH", "MONRO", "ZADOK", "BARBA", - "BARCO", "GAZON", "VAART", "ANNAS", "MAHDI", "WERTH", "RAHAA", "SMAAK", "WIRKT", "YEELD", "YERBA", "FINGO", - "HEBEN", "VEINE", "LLEGA", "USKON", "SEMEN", "STOEL", "ZZZZZ", "HOWDY", "REGAN", "CLACK", "SELVE", "GLEGG", - "RAUCH", "DESTA", "FUMER", "KOMST", "BLOCS", "TRIAD", "VENIT", "BALIN", "UPANI", "VISST", "LOMAX", "RYMER", - "SOTTE", "ZOETE", "FOKER", "MILDE", "TATEN", "AKING", "DAVOR", "NITRE", "ERROL", "CLERC", "CONTA", "DEBAR", - "KREET", "MODEM", "CULCH", "FLERE", "OLIKO", "PREYS", "SLOPS", "WHIPT", "ADDIE", "BEULE", "BIJOU", "ECHAR", - "FUOCO", "HATHE", "QUAIS", "SOLDE", "FUZZY", "PISTE", "SAINE", "WEREN", "ZEBRA", "MASKE", "ANIME", "SAYST", - "LVIII", "MOIRA", "RAINA", "WOTAN", "ARMIS", "ASIAT", "BAGUE", "PRESE", "VOLSE", "NUOVA", "PARIA", "ALTOS", - "ENSAM", "TROLL", "ABBIE", "WILTS", "CESTE", "CUYOS", "VIGNE", "BEEBE", "GLIED", "RASHI", "DEVRA", "HOERE", - "LEZER", "NAHEN", "BERUF", "HIGGS", "LEEKS", "POLKA", "UMACR", "DOOMS", "FASTE", "GLEBE", "NOSED", "LOWTH", - "DOORE", "HIRES", "SKULK", "BILDE", "CHEBE", "WAITE", "ACEST", "DAMAS", "HOJAS", "MOMMA", "PERLE", "BALAK", - "LADIE", "MARCK", "YAQUI", "YEATS", "RECAL", "SINAE", "RUDRA", "AMENA", "CUJUS", "SIGNA", "SOLUS", "KISSE", - "NULLO", "PALJO", "SIEHE", "TOLDE", "VISCH", "HOVEY", "ROOME", "ETZEL", "SHURE", "FIFES", "BALTY", "FRITH", - "MICHU", "MOCHA", "TURKE", "FATTI", "GULES", "GALLO", "HANNE", "IZAAK", "MINTO", "ROYCE", "SARUM", "DEBIT", - "TENNE", "MANDI", "WELNU", "GOLLY", "JEUGD", "KELLO", "FULKE", "GUEUX", "VALSE", "WOEDE", "BORGO", "GALLE", - "HEMAN", "LODER", "SHANE", "FUGUE", "PESER", "CYRUS", "HOVED", "MACES", "NADER", "BUCKY", "HOFER", "KARIN", - "MELUN", "WAITZ", "ACTIF", "THEWS", "BOSIO", "MARYS", "CEOUS", "WOHNT", "OISIN", "ARTES", "ILLAM", "MASTE", - "LAMAR", "MULTO", "SABIA", "SAGAS", "SCANS", "VITRE", "ZUMAL", "KRIPA", "MORUS", "PINTO", "COCHE", "DEDIT", - "TALAT", "LEBEL", "SLOOT", "WUCHS", "BABET", "BEUTE", "FESCH", "NUBIA", "DELVE", "DEVAS", "NOHOW", "BAKOM", - "CIOUS", "MANDA", "OVALS", "PURES", "DYAKS", "ECTOR", "HERBE", "HUVUD", "LAIRS", "LIUES", "PLENA", "DOLED", - "MINST", "VELEN", "COROT", "OLNEY", "TELLO", "CARLE", "GNAWS", "HAAND", "ISSUS", "VINCY", "ARAGO", "BORAX", - "CENTO", "NAGOT", "SAUVA", "SOUSE", "VOUTE", "GRECE", "HEYST", "MILNE", "NANDA", "PRETS", "SLIPT", "STATU", - "WEICH", "ACTUS", "LOTYS", "HOORT", "PERES", "SOGGY", "BUSCH", "PUSEY", "MENEN", "SACAR", "GESTO", "TOTUM", - "AUBRY", "BEARN", "KAUAI", "BRAHM", "LAING", "BODIE", "LACKE", "OVARY", "SAYES", "SNAGS", "THATS", "ALPEN", - "MAYNE", "SELAH", "AUGER", "BETEN", "CORRE", "RUNNE", "TRANK", "TYPED", "MULEY", "SPOTT", "IGLOO", "KEELS", - "CASSY", "FAGON", "ACCES", "CXIUJ", "INTRA", "PITTY", "AHURA", "BAMBI", "BAYNE", "HIERO", "MAGOG", "MOONE", - "TODAS", "WENNA", "CAPAZ", "FONDE", "NAGON", "SLAGS", "RILLA", "GIVET", "POMME", "ANNAL", "BARTY", "CURIA", - "LEGGE", "PERSE", "SAALE", "THORA", "EDELE", "PERDS", "POULE", "BOGAN", "KAABA", "EGALE", "VEDEN", "PINKY", - "GERME", "MOULT", "VARIE", "DEWAN", "TEKLA", "FUDGE", "OPINE", "OSIER", "LAUFE", "LERAT", "PINUS", "THULE", - "EUERN", "PERRO", "SENDE", "WRENN", "DATUM", "AILSA", "GHITA", "WACHE", "ATOLL", "PELTS", "PLOWS", "POCAS", - "SHOON", "BEBER", "KATSO", "SOLEN", "HORRY", "PLASE", "EDIFY", "LADER", "TENUS", "JIMSY", "MAIJA", "SOLIS", - "AIMEE", "KUOLI", "ORTER", "OLAVI", "ORMUZ", "COSEY", "JAMAS", "PUOLI", "HEDDA", "TAMPA", "GRABS", "GRATA", - "LOUSY", "TRATO", "UDDER", "BEZUG", "BINET", "AMBLE", "HELMS", "LEVAI", "PAPPI", "COPIA", "SIRVE", "LIGUE", - "ORMUS", "GOUTS", "SINKT", "VRIJE", "LOTTA", "GENOT", "GRUPO", "MOEGE", "SLILY", "ARIES", "FRIST", "KYNGE", - "LLEGO", "MESSO", "NUEVE", "ALAMO", "OJEDA", "ROCCA", "THIER", "ALIOS", "BIDES", "DIEDE", "RUHEN", "TESTE", - "OZIAS", "QATAR", "PILES", "ALMAS", "BARBS", "BODDE", "BRIGS", "GWYNE", "SUELE", "GEOFF", "OAKUM", "ROCAS", - "GESTA", "HUBER", "VILNA", "CLAMP", "KUKIN", "NUQUE", "PELOS", "VIDEO", "WEKEN", "CRECY", "GRABE", "WESEL", - "ABORD", "AIMES", "HOHEM", "TULIN", "AUTUN", "BASHA", "JADIN", "CORAM", "LOOKT", "NEARS", "CLYST", "INIGO", - "NEPOS", "THERM", "FLUES", "FOCAL", "MUETS", "NOYER", "OCKSA", "SHOLD", "FRITS", "HITZE", "LAMAS", "MAHAL", - "MOMUS", "POWYS", "MAGST", "MENNE", "GOLPE", "WAFTS", "DORFE", "IRVIN", "RYDAL", "WYMAN", "CAVED", "CUEUR", - "FLIER", "SIGUE", "STRAF", "TRAJE", "DIRCK", "KANAG", "WESER", "WHYTE", "NKARA", "PECKS", "SAFER", "TRONO", - "ASURA", "MENTZ", "SASHA", "APPAL", "ETAGE", "LASTE", "USETH", "VOIMA", "VORAN", "LEMAN", "SHOOP", "AGITE", - "DABAN", "OMAAN", "BEATS", "TUBBS", "COLPA", "MATAR", "JORGE", "MCGEE", "AVOWS", "HUSET", "JOASH", "KARTE", - "AVISO", "MEATE", "MKHYA", "MUCHE", "ASCOT", "GALLA", "ISORA", "ROMER", "EPOUX", "FALSO", "BALBI", "SUNDA", - "LECON", "SPIJT", "SPUNK", "TRAMS", "VARAS", "LOTTE", "MAZDA", "MOXOS", "AMADO", "BEURT", "BOOST", "CATER", - "NEBER", "NEGRA", "BREDE", "MYRON", "ARTIG", "CIEGO", "FILER", "GAYON", "HABLO", "HINDS", "KUULU", "LIGGA", - "MARDI", "PRIVE", "VLOOG", "CRABB", "SOANE", "DALEN", "DIGNA", "IDLED", "INNIG", "LATHS", "SANZA", "TRAGE", - "WELKS", "BERKS", "BRECK", "ELIAB", "HAUCH", "HERAT", "AVARE", "HAFVA", "PRIJS", "GROIN", "NUIRE", "OBESE", - "OLTRE", "RIJKE", "WEEPE", "SNELL", "SYRIE", "CONTO", "FURIA", "ILLOS", "MEALY", "QUEDO", "ROSIN", "SNOBS", - "JUNIA", "LUKIN", "MESTY", "HELIX", "WALKE", "BUSSI", "TIBBY", "KURTZ", "DOTES", "FAUVE", "GAINE", "LEEFT", - "TAELS", "ACHAB", "EMIRS", "JEPPE", "KNIPP", "PILAR", "REUSS", "WEGES", "DROOM", "EYRIE", "JAGEN", "SLUMP", - "MAREN", "MODUM", "TREIN", "BEBEL", "KRUPP", "LAURI", "LYNNE", "VINET", "FANNO", "HADNA", "MENDS", "TIOUS", - "AMREI", "ARNOT", "FLOSS", "HYLDA", "DEBEN", "OUBLI", "TYLKO", "AVUTO", "BOATE", "LUKEA", "TRATA", "ECLAC", - "WIESE", "ZWEIG", "LINKE", "PRESA", "VIRTU", "BINES", "HERSE", "LUPUS", "MATTA", "FIVES", "INSTR", "KLEED", - "POLVO", "GWILT", "UNHCR", "DOSED", "JUROR", "RUNGS", "SILKE", "ISHAM", "KURDS", "SILLA", "SPINK", "ACTOS", - "DORST", "RIMES", "VIISI", "ZUCHT", "ATTEN", "BUCHE", "BYERS", "CISSY", "FIONN", "KATRI", "ASSIM", "HUIUS", - "MENTI", "PARSE", "VIDER", "KAYAN", "KRANZ", "NIELS", "FOIRE", "KIOSK", "OBERN", "RECTE", "LIPPO", "CABBY", - "IMBUE", "DOLPH", "RADHA", "FELIZ", "HOMEM", "TONTY", "YAKOV", "AEGIS", "PEDIR", "ROUTS", "UNICO", "VELUT", - "CROLL", "ALZOO", "FALSA", "KLARE", "PONEN", "AMEER", "BOSSU", "ORAGE", "POSEE", "PUTEA", "SELIG", "CHAKA", - "DISKO", "FALCO", "TEXEL", "ASCHE", "DONAU", "DUFFY", "LERMA", "QUINN", "SISSY", "TORCY", "ALTAS", "BEEST", - "BOUGE", "MONEN", "REGNA", "SNACK", "LADKO", "PIPPA", "WEALD", "ILLAN", "KALLA", "KOTIA", "BARCA", "CENIS", - "KATZE", "KORAH", "PRADO", "SANNA", "BURNE", "IDYLL", "SITTA", "VIRUM", "BEATA", "GUION", "RASSI", "SHAND", - "GAGES", "PUHUU", "RAHAT", "CERRO", "FARAO", "PAZZI", "RIZZO", "SCENA", "KALTE", "PATES", "TEUER", "CASOS", - "COLPO", "FLUME", "MAIOR", "SABIO", "VULGO", "ARIUS", "FLAMM", "MARET", "COTON", "DUCTS", "FORGO", "GRITO", - "POSSO", "ZULKS", "ETAIN", "POSEN", "TAMIL", "ZUEGE", "BIPED", "BLURT", "THEOS", "FLUKE", "MUNCH", "YOURE", - "BANTU", "BAREE", "BEGUM", "CHILO", "DINKS", "FADEN", "MAHAN", "PEAUX", "REGNI", "EINAR", "ISLAS", "RAYNE", - "TAAVI", "ARABE", "SCEAU", "DUCIE", "LORDY", "CHOUX", "GAMMA", "HAIES", "HORTE", "REMUE", "SCULL", "ANTAR", - "ENGLE", "NOVUM", "TONYA", "BAUEN", "IPSIS", "LOIKE", "LOUES", "SINGW", "STRID", "VILER", "SHAWN", "AURAI", - "GUISA", "KUULE", "SALEN", "WONEN", "CARBO", "MELKY", "DUMPY", "SPICK", "SPORE", "BARAK", "ONGAR", "VOLKS", - "DIETS", "LAVAS", "MUUAN", "ANMUT", "BEMIS", "BOLES", "GOOCH", "KAFIR", "LAGOS", "LUNDY", "BESOM", "JURIS", - "MESAS", "TYMES", "WORAN", "FOUAN", "HOOKE", "PUGET", "SIGEL", "DEARY", "LUMEN", "MEURE", "SERUM", "GREIS", - "PFEIL", "BONIS", "EIKAE", "ZWANG", "ASIEN", "CREAN", "LENIN", "CYTEE", "HALVT", "LOCIS", "NENNE", "SPINY", - "TOXIC", "FERDY", "MAROT", "WOVEN", "AEONS", "DEBIA", "DRAPE", "REAMS", "RISER", "RONDS", "TAGET", "AMASA", - "JANIE", "NIZZA", "ICILY", "TENTA", "FUNDY", "FANES", "GOERA", "VALDE", "PINTA", "PITTS", "SEIDE", "BILGE", - "DOMUM", "GEHST", "GNASH", "HETTE", "DORAN", "FABRY", "HEIGH", "SARTO", "SCHAU", "DIENS", "DOGME", "FAUNS", - "FROMM", "TAPES", "DREUX", "FAGAN", "HELLA", "SKYLD", "ARMUT", "JUBAL", "LUISA", "NOYON", "PIOTR", "PYLOS", - "BRAGT", "MEENT", "VAREN", "ILION", "NARES", "STUBB", "ASTER", "DANNO", "MOPED", "ONNEA", "PALAA", "WORDE", - "DONAT", "MACAN", "POVEY", "BODES", "DRIPS", "EGGED", "FEELE", "KLUGE", "MUROS", "ORBIS", "TABBY", "WICKS", - "JUMNA", "SYLVI", "SUNNI", "SUYOS", "JINGO", "MONAT", "PIPPO", "APING", "CHACE", "FLUFF", "POLIS", "AUBER", - "RAMEE", "SEOUL", "LYDER", "RICOS", "UNSAY", "ELSON", "SNOOP", "ANNIS", "FANGE", "FIJNE", "HUMUS", "LENTS", - "PUREE", "STOUP", "YERES", "JONDO", "LIGNY", "BLOKE", "PROPE", "ELLIE", "ERNIE", "OAKES", "DURES", "NEEDE", - "PLIER", "GONDI", "HAMET", "DUNKT", "FOAMS", "LOGES", "SERES", "STELT", "ARRAH", "GRATZ", "VEDIA", "DICIT", - "HARTS", "REINA", "SIELU", "KAPPA", "LIPPE", "OLINE", "PROUT", "INGOT", "LENTO", "NEGLI", "PARIE", "VEZES", - "RUSTY", "SUKEY", "SURRY", "ANIGH", "CIMES", "CLOUS", "FARSI", "GRAAG", "TINHA", "ARLEE", "DONGO", "HAGAN", - "LXIII", "RAMAH", "CLEPT", "MULTI", "NIAIS", "VAINS", "LEONI", "LECHE", "RAINE", "HYDER", "LARES", "HAVET", - "MINHA", "BATTY", "ERICH", "KUGEL", "BRAGS", "CRIBS", "FAINE", "IHANA", "KAHTA", "SAATU", "SAYLE", "SEINS", - "SLATY", "SQUIB", "VIZIR", "YELPS", "ENDEN", "HINDE", "CORTA", "CRICK", "FLERA", "SVARA", "HIPPO", "DRONG", - "FETED", "LEHRT", "TULIT", "ADERN", "DIDON", "QUILP", "TREAS", "CARRE", "MALUM", "SULKS", "LEARY", "LYDDY", - "PETYA", "SALIM", "TOPSY", "BOWEL", "CRESS", "DESTE", "ENROL", "FLAKY", "BARBY", "BEERS", "SOMAL", "TIMMY", - "YEGOR", "JONNE", "POILS", "SOLDI", "ZARTE", "KROOL", "MARKO", "DERER", "TIETO", "VOSSA", "BULOW", "ALENE", - "DIMES", "DOIVE", "HOPEN", "MOLDY", "TOIVO", "AVICE", "HERMY", "BAINS", "DAGUE", "FLINK", "FRASE", "HANGT", - "LEGUA", "TEMPI", "VAITI", "CUTTS", "VANEL", "ALTHO", "EINIG", "FIORD", "HARME", "MOWER", "PAGAR", "ROEPT", - "FULDA", "MOSUL", "VIRGO", "DINAR", "KATSE", "KURJA", "LINEA", "NEARE", "RUINA", "TUVAN", "ASSUR", "LANDA", - "EVERE", "LIVRA", "PENSO", "TILTS", "VSQUE", "MILER", "NERVA", "SHINT", "STICH", "BEDST", "BLAUW", "COLDE", - "GLAUB", "MOATS", "PRISA", "SIGMA", "MAHEU", "CHENE", "MUITO", "POEME", "PUDGY", "RILED", "SILLS", "VERTA", - "AMRAM", "BONAR", "SVAVA", "CURSO", "FIDEM", "CAPEL", "JAINS", "PRAED", "GAVEL", "KIVEN", "PEDIS", "WAARD", - "FIUME", "GLYNN", "PIGOT", "BICHE", "DOOTY", "LADYE", "VENGE", "JUKES", "PETRO", "BONIE", "FOWLE", "INURE", - "KONDE", "POKES", "SIMBA", "LITRE", "PAREA", "HOREB", "TIMUR", "HEATE", "NAGRA", "NOYSE", "PAURA", "PEECE", - "AGNUS", "HYNDS", "MOSER", "GAWKY", "HYDRO", "ISTUA", "JACHT", "SCUDO", "UUREN", "MOSCO", "BLAUE", "LIVET", - "SECHE", "MAYDE", "PIEDE", "RUFFS", "KAPOR", "MARTE", "QUADE", "GLATT", "INDIO", "OMNEM", "SALIO", "SADOC", - "VOBAN", "ZICCI", "BRAES", "COELO", "CORTO", "IRKED", "SABEN", "DWYER", "JOUIT", "OFFRA", "SCIRE", "SELVA", - "TULET", "FLAGG", "ETUDE", "GOUGE", "HUJUS", "OLHOS", "ASOKA", "HURRA", "KEVIN", "NELLO", "FICHE", "JETAI", - "LECHO", "LIENE", "MUMPS", "ORICE", "VIZOR", "HARAN", "LUCRE", "MAGEN", "MOORD", "WEEKE", "GOREE", "KIMON", - "AVASI", "FINNY", "POSTA", "REGTE", "REMET", "SILEX", "TELCO", "TERVE", "SOHNE", "TOBIN", "GEZET", "GRIDO", - "IVIED", "ODDER", "FLACK", "JESSY", "DIECI", "EPAIS", "THRUE", "DICES", "GREYS", "MORTI", "PERCE", "BASSA", - "FASTI", "MCTEE", "SOUSA", "VIGNY", "WOLKE", "DUROS", "GRAVI", "PROVA", "SWILL", "VEELE", "WANES", "BASAN", - "CUFFY", "XVIIE", "HUZZA", "VIDAS", "ALLIS", "BEUST", "BRESL", "SWASH", "PEPLE", "GOWDY", "HADJI", "NAHUM", - "THESS", "FROND", "HAINT", "AMOOR", "LARNE", "NADAB", "NEILL", "SAGET", "CREDE", "HUMPS", "MOSSE", "MUTED", - "OLLEN", "VERBE", "ALVIN", "CLERY", "JOVIS", "SEYNS", "SONEY", "SYLPH", "VITRY", "WIGAN", "HILTS", "LINTU", - "SINDS", "UMBRA", "VISER", "CASCA", "MERAN", "MONNA", "PINEY", "BRAUE", "LAPIN", "MUEDE", "POWRE", "STAAR", - "BONEY", "MAGUA", "MAULE", "COYLY", "GUMMY", "HAULS", "RUEGO", "ARCHY", "BAUME", "BEVAN", "DEGAS", "KAISA", - "LESTE", "MOULE", "REDLY", "VETUS", "AFRIC", "BINGO", "LXVII", "OLLIE", "SURYA", "ABRIR", "DEDOS", "EXCES", - "LAITA", "MINTS", "POTER", "VARDA", "BACHE", "SALIC", "HURLA", "MEWED", "NECKE", "NEITO", "PARKA", "VAPAA", - "WAPEN", "BIJAH", "GUETE", "ZANTE", "SCUDI", "IDUNA", "KONTO", "LUXOR", "DIEST", "REGEM", "SPANK", "TIEDE", - "URSEL", "GENTI", "NAVES", "ONDAS", "PRZED", "FOLCO", "NABAL", "NOSEY", "PAULI", "TOKIO", "ATING", "DICTE", - "GUDAR", "RHEUM", "CUTTY", "OSMIA", "MAGER", "SANOT", "TIBIA", "TRAER", "LIANE", "MATHO", "MUNDY", "PATTI", - "REESE", "SEELY", "HARPY", "HUTTE", "LEGES", "LIETO", "LOBEN", "RAVIE", "SOAPY", "SOUGH", "VUOLE", "BOGES", - "LUTHA", "MAPPO", "BONED", "FLYER", "VISTE", "ENDOR", "FAYAL", "HALSE", "KEANE", "SIHON", "ANCHO", "ATTAR", - "AVETE", "KROPP", "MIMES", "OPALS", "PLUMA", "UNLIT", "AKLIS", "ELSLI", "HERDE", "SKALE", "ANDAN", "JEANS", - "PREVU", "BAIAE", "GOETZ", "HYLAS", "JANIN", "CHYLE", "DAUBS", "HANDE", "KNAAP", "NATUS", "ZONEN", "MONTI", - "SUDRA", "LIKER", "LYCKA", "UKASE", "VIMOS", "VOYCE", "AMIEL", "PANGO", "RANDE", "SHIVA", "SPION", "TIECK", - "DECEM", "MOLAR", "WENTE", "IMLAC", "PONTO", "WASTL", "BORTA", "FANDT", "JOKIN", "LYFTE", "RESET", "RIENS", - "SEMEL", "TWIXT", "WISST", "BEORN", "CEUTA", "NABAB", "EVIGT", "LEGNO", "LERNT", "LILAS", "MYLEN", "PAPPA", - "PREUX", "SPOOK", "FOGER", "TILDA", "CIVET", "ERRER", "GEARS", "JUGEZ", "MAGNI", "SEZEE", "SPISE", "AYEAR", - "BYEAR", "DUNNE", "JEZUS", "LUCIO", "MATEY", "SKALA", "TIBUR", "BAADE", "HOOTS", "LOONS", "TUNGA", "BIORN", - "DAGLI", "OUTRO", "GAETA", "JANEY", "MENIN", "SITKA", "FOIST", "JEHER", "LAVED", "LINUS", "PAWLE", "VICKY", - "RIDES", "TREED", "ARIST", "AWEEL", "CELIE", "BURRS", "CLIPS", "DICEA", "MOLTA", "NAVVY", "OLIKA", "RAYOS", - "SEYDE", "VANES", "ALLYN", "GEBOT", "GROSE", "BAHAY", "DUREE", "FAZER", "GOADS", "GULPH", "HAVER", "NIGRA", - "NOCTE", "PARUM", "SAATA", "SKIMS", "WAART", "WRAAK", "MUZIO", "OLSON", "RABAT", "REGIN", "RUNIC", "MANDE", - "RAUHA", "AYMER", "NAURU", "DREEF", "GAAET", "IRREN", "LESKI", "MECUM", "SAVON", "ARIAS", "HANKS", "ROZEL", - "ZEUGE", "DEUGD", "ETHIC", "GOODE", "TROVA", "AETNA", "BENJY", "ORMES", "TUBAL", "BRIMS", "BULKS", "FILCH", - "MONAD", "OOZES", "REGIA", "SARVE", "VENTI", "VOERT", "ARION", "COOTE", "SNECK", "TESSA", "BASON", "GIENG", - "INTIL", "NABIJ", "PRZEZ", "RAMAS", "SITUE", "CATHY", "GREER", "LINUX", "TOBIT", "DIDNT", "DROGO", "NEHMT", - "TIGES", "EDRIC", "TROUP", "AYUDA", "BEVAT", "DAPAT", "OVATE", "BALCH", "COGAN", "AIRTH", "GOWNE", "JUEGO", - "REBUT", "SALSA", "WIJDE", "JUBEL", "NEDDY", "RONNY", "FLAIR", "PASEO", "BRONX", "EWALD", "STURZ", "WODEN", - "KUMMA", "LETTE", "VANTE", "CAERE", "MISHA", "AMBAS", "FAAET", "RUNDE", "EYLAU", "MENGS", "FEEST", "LOWED", - "VENDE", "CUMAE", "GASSE", "HILMA", "IZUMO", "PISAN", "SOFIE", "CARRO", "CONIC", "CRIMP", "MUSKY", "SAYTH", - "STANK", "BOWES", "FAHNE", "THOME", "VIION", "ASTUU", "DICKE", "FASST", "PAROI", "LAWRY", "PRATO", "TENCH", - "CERTI", "ISCHT", "NOONE", "SENTO", "TAULD", "VLOOT", "VOIRE", "VOLTS", "BELUS", "CAVOR", "JORIS", "SEPPI", - "ERGAB", "BABIE", "CATON", "ABAHT", "BEDRE", "OPPIA", "POUCO", "SCHEU", "SEALE", "SUMUS", "VASTY", "FRIDA", - "LIPPI", "LOUVE", "BANCO", "BUONO", "CLOMB", "EDELN", "HOULD", "PELAS", "BODIN", "FAUGH", "JUDAR", "SEITZ", - "TOTTY", "WERTE", "STANE", "WINNE", "COCOS", "RIATT", "WERFF", "FIERA", "HINAN", "MATKA", "OATEN", "PLACA", - "CONOR", "DARRY", "HERTZ", "LAMON", "BEYNG", "CONTR", "INEPT", "SAKEN", "SIAMO", "STEDE", "MORNA", "AGERE", - "LANCA", "OSASI", "SADAN", "WOONT", "EVERS", "TROVE", "FACIL", "GRENE", "KUUSI", "PAPAS", "RECUS", "UUDET", - "VENTA", "ALOIS", "GILLY", "GONDY", "NAIRN", "BAILE", "CLAPT", "CLUCK", "CULTO", "EETEN", "GAPES", "NIVEL", - "TREKT", "WARLD", "ABIES", "AUTOS", "BARKE", "BRDER", "EASES", "GIRDS", "HAILL", "HIJAS", "RETRO", "SOMMA", - "STEEG", "BAYER", "CAMUS", "DEVIN", "HAMID", "HUANG", "IMOLA", "DICED", "HOCHA", "KASTA", "MULGA", "MYNDE", - "PIENO", "YAONG", "FURST", "GATTE", "SPASS", "SVEIN", "THEMA", "ANSAH", "CHAUX", "HEVIG", "PRIES", "ZOMER", - "BAGGS", "DOURO", "HIPPY", "SAONE", "VAVEL", "WETTE", "ALNAR", "EUILL", "PEATY", "VENIS", "CRITO", "LYNDA", - "OGRAM", "TEMPE", "ABOON", "FACEA", "FINEM", "KNOUT", "LLAMO", "LOAMY", "MENAR", "TISSU", "VERAS", "VIRES", - "COLBY", "JAINA", "TEUSE", "TYNAN", "YANKS", "BEZAT", "KLOOF", "SEAMY", "SIDDE", "STEIL", "TYYNI", "CARIA", - "HENTY", "LOWRY", "SOUZA", "ALIUS", "FEETE", "GRANO", "HALKI", "KELPO", "PESKY", "PLEBS", "POVIS", "TOPER", - "VLOER", "VOULD", "EDMEE", "GAZEN", "GITON", "HOLLO", "KAROL", "REIZE", "ROACH", "ULLOA", "VERBY", "CLEWS", - "EVANG", "FERAL", "GLICH", "THROE", "ZIJNS", "EURIE", "FERIA", "JEEMS", "PAAVO", "SAUTI", "DOODE", "PIENA", - "RADII", "UNICA", "CROLY", "HADAD", "KEYES", "NIKKY", "SANDE", "SEGEL", "SOFYA", "TEXAR", "GAZER", "LEDIG", - "NOTAR", "OBEIR", "VIMES", "GENUA", "KANAL", "LIMON", "RAHAB", "SUOMI", "VEJEN", "BATEN", "FJORD", "LEVES", - "PHARE", "RECTO", "AAGOT", "GIZUR", "NADJA", "RUGGE", "SNEYD", "DECKT", "FAILE", "GAOLS", "MELER", "PACTO", - "PAHAN", "CALIF", "MENON", "SEPOY", "WADDY", "ZELLE", "AENDA", "ASTUA", "KROON", "LETRA", "MINIT", "NEEWA", - "PATNA", "URIEL", "HITTE", "HOMOJ", "JOUET", "KOSKI", "LYSTE", "MINAS", "RUHTE", "SETZE", "LASER", "SONIC", +possible_list = [ + "AAHED", "AALII", "AARGH", "AARTI", "ABACA", "ABACI", "ABACS", "ABAFT", "ABAKA", "ABAMP", "ABAND", "ABASH", + "ABASK", "ABAYA", "ABBAS", "ABBED", "ABBES", "ABCEE", "ABEAM", "ABEAR", "ABELE", "ABERS", "ABETS", "ABIES", + "ABLER", "ABLES", "ABLET", "ABLOW", "ABMHO", "ABOHM", "ABOIL", "ABOMA", "ABOON", "ABORD", "ABORE", "ABRAM", + "ABRAY", "ABRIM", "ABRIN", "ABRIS", "ABSEY", "ABSIT", "ABUNA", "ABUNE", "ABUTS", "ABUZZ", "ABYES", "ABYSM", + "ACAIS", "ACARI", "ACCAS", "ACCOY", "ACERB", "ACERS", "ACETA", "ACHAR", "ACHED", "ACHES", "ACHOO", "ACIDS", + "ACIDY", "ACING", "ACINI", "ACKEE", "ACKER", "ACMES", "ACMIC", "ACNED", "ACNES", "ACOCK", "ACOLD", "ACRED", + "ACRES", "ACROS", "ACTED", "ACTIN", "ACTON", "ACYLS", "ADAWS", "ADAYS", "ADBOT", "ADDAX", "ADDED", "ADDER", + "ADDIO", "ADDLE", "ADEEM", "ADHAN", "ADIEU", "ADIOS", "ADITS", "ADMAN", "ADMEN", "ADMIX", "ADOBO", "ADOWN", + "ADOZE", "ADRAD", "ADRED", "ADSUM", "ADUKI", "ADUNC", "ADUST", "ADVEW", "ADYTA", "ADZED", "ADZES", "AECIA", + "AEDES", "AEGIS", "AEONS", "AERIE", "AEROS", "AESIR", "AFALD", "AFARA", "AFARS", "AFEAR", "AFLAJ", "AFORE", + "AFRIT", "AFROS", "AGAMA", "AGAMI", "AGARS", "AGAST", "AGAVE", "AGAZE", "AGENE", "AGERS", "AGGER", "AGGIE", + "AGGRI", "AGGRO", "AGGRY", "AGHAS", "AGILA", "AGIOS", "AGISM", "AGIST", "AGITA", "AGLEE", "AGLET", "AGLEY", + "AGLOO", "AGLUS", "AGMAS", "AGOGE", "AGONE", "AGONS", "AGOOD", "AGORA", "AGRIA", "AGRIN", "AGROS", "AGUED", + "AGUES", "AGUNA", "AGUTI", "AHEAP", "AHENT", "AHIGH", "AHIND", "AHING", "AHINT", "AHOLD", "AHULL", "AHURU", + "AIDAS", "AIDED", "AIDES", "AIDOI", "AIDOS", "AIERY", "AIGAS", "AIGHT", "AILED", "AIMED", "AIMER", "AINEE", + "AINGA", "AIOLI", "AIRED", "AIRER", "AIRNS", "AIRTH", "AIRTS", "AITCH", "AITUS", "AIVER", "AIYEE", "AIZLE", + "AJIES", "AJIVA", "AJUGA", "AJWAN", "AKEES", "AKELA", "AKENE", "AKING", "AKITA", "AKKAS", "ALAAP", "ALACK", + "ALAMO", "ALAND", "ALANE", "ALANG", "ALANS", "ALANT", "ALAPA", "ALAPS", "ALARY", "ALATE", "ALAYS", "ALBAS", + "ALBEE", "ALCID", "ALCOS", "ALDEA", "ALDER", "ALDOL", "ALECK", "ALECS", "ALEFS", "ALEFT", "ALEPH", "ALEWS", + "ALEYE", "ALFAS", "ALGAL", "ALGAS", "ALGID", "ALGIN", "ALGOR", "ALGUM", "ALIAS", "ALIFS", "ALINE", "ALIST", + "ALIYA", "ALKIE", "ALKOS", "ALKYD", "ALKYL", "ALLEE", "ALLEL", "ALLIS", "ALLOD", "ALLYL", "ALMAH", "ALMAS", + "ALMEH", "ALMES", "ALMUD", "ALMUG", "ALODS", "ALOED", "ALOES", "ALOHA", "ALOIN", "ALOOS", "ALOWE", "ALTHO", + "ALTOS", "ALULA", "ALUMS", "ALURE", "ALVAR", "ALWAY", "AMAHS", "AMAIN", "AMATE", "AMAUT", "AMBAN", "AMBIT", + "AMBOS", "AMBRY", "AMEBA", "AMEER", "AMENE", "AMENS", "AMENT", "AMIAS", "AMICE", "AMICI", "AMIDE", "AMIDO", + "AMIDS", "AMIES", "AMIGA", "AMIGO", "AMINE", "AMINO", "AMINS", "AMIRS", "AMLAS", "AMMAN", "AMMON", "AMMOS", + "AMNIA", "AMNIC", "AMNIO", "AMOKS", "AMOLE", "AMORT", "AMOUR", "AMOVE", "AMOWT", "AMPED", "AMPUL", "AMRIT", + "AMUCK", "AMYLS", "ANANA", "ANATA", "ANCHO", "ANCLE", "ANCON", "ANDRO", "ANEAR", "ANELE", "ANENT", "ANGAS", + "ANGLO", "ANIGH", "ANILE", "ANILS", "ANIMA", "ANIMI", "ANION", "ANISE", "ANKER", "ANKHS", "ANKUS", "ANLAS", + "ANNAL", "ANNAS", "ANNAT", "ANOAS", "ANOLE", "ANOMY", "ANSAE", "ANTAE", "ANTAR", "ANTAS", "ANTED", "ANTES", + "ANTIS", "ANTRA", "ANTRE", "ANTSY", "ANURA", "ANYON", "APACE", "APAGE", "APAID", "APAYD", "APAYS", "APEAK", + "APEEK", "APERS", "APERT", "APERY", "APGAR", "APHIS", "APIAN", "APIOL", "APISH", "APISM", "APODE", "APODS", + "APOOP", "APORT", "APPAL", "APPAY", "APPEL", "APPRO", "APPUI", "APPUY", "APRES", "APSES", "APSIS", "APSOS", + "APTED", "APTER", "AQUAE", "AQUAS", "ARABA", "ARAKS", "ARAME", "ARARS", "ARBAS", "ARCED", "ARCHI", "ARCOS", + "ARCUS", "ARDEB", "ARDRI", "AREAD", "AREAE", "AREAL", "AREAR", "AREAS", "ARECA", "AREDD", "AREDE", "AREFY", + "AREIC", "ARENE", "AREPA", "ARERE", "ARETE", "ARETS", "ARETT", "ARGAL", "ARGAN", "ARGIL", "ARGLE", "ARGOL", + "ARGON", "ARGOT", "ARGUS", "ARHAT", "ARIAS", "ARIEL", "ARIKI", "ARILS", "ARIOT", "ARISH", "ARKED", "ARLED", + "ARLES", "ARMED", "ARMER", "ARMET", "ARMIL", "ARNAS", "ARNUT", "AROBA", "AROHA", "AROID", "ARPAS", "ARPEN", + "ARRAH", "ARRAS", "ARRET", "ARRIS", "ARROZ", "ARSED", "ARSES", "ARSEY", "ARSIS", "ARTAL", "ARTEL", "ARTIC", + "ARTIS", "ARUHE", "ARUMS", "ARVAL", "ARVEE", "ARVOS", "ARYLS", "ASANA", "ASCON", "ASCUS", "ASDIC", "ASHED", + "ASHES", "ASHET", "ASKED", "ASKER", "ASKOI", "ASKOS", "ASPEN", "ASPER", "ASPIC", "ASPIE", "ASPIS", "ASPRO", + "ASSAI", "ASSAM", "ASSES", "ASSEZ", "ASSOT", "ASTER", "ASTIR", "ASTUN", "ASURA", "ASWAY", "ASWIM", "ASYLA", + "ATAPS", "ATAXY", "ATIGI", "ATILT", "ATIMY", "ATLAS", "ATMAN", "ATMAS", "ATMOS", "ATOCS", "ATOKE", "ATOKS", + "ATOMS", "ATOMY", "ATONY", "ATOPY", "ATRIA", "ATRIP", "ATTAP", "ATTAR", "ATUAS", "AUDAD", "AUGER", "AUGHT", + "AULAS", "AULIC", "AULOI", "AULOS", "AUMIL", "AUNES", "AUNTS", "AURAE", "AURAL", "AURAR", "AURAS", "AUREI", + "AURES", "AURIC", "AURIS", "AURUM", "AUTOS", "AUXIN", "AVALE", "AVANT", "AVAST", "AVELS", "AVENS", "AVERS", + "AVGAS", "AVINE", "AVION", "AVISE", "AVISO", "AVIZE", "AVOWS", "AVYZE", "AWARN", "AWATO", "AWAVE", "AWAYS", + "AWDLS", "AWEEL", "AWETO", "AWING", "AWMRY", "AWNED", "AWNER", "AWOLS", "AWORK", "AXELS", "AXILE", "AXILS", + "AXING", "AXITE", "AXLED", "AXLES", "AXMAN", "AXMEN", "AXOID", "AXONE", "AXONS", "AYAHS", "AYAYA", "AYELP", + "AYGRE", "AYINS", "AYONT", "AYRES", "AYRIE", "AZANS", "AZIDE", "AZIDO", "AZINE", "AZLON", "AZOIC", "AZOLE", + "AZONS", "AZOTE", "AZOTH", "AZUKI", "AZURN", "AZURY", "AZYGY", "AZYME", "AZYMS", "BAAED", "BAALS", "BABAS", + "BABEL", "BABES", "BABKA", "BABOO", "BABUL", "BABUS", "BACCA", "BACCO", "BACCY", "BACHA", "BACHS", "BACKS", + "BADDY", "BAELS", "BAFFS", "BAFFY", "BAFTS", "BAGHS", "BAGIE", "BAHTS", "BAHUS", "BAHUT", "BAILS", "BAIRN", + "BAISA", "BAITH", "BAITS", "BAIZA", "BAIZE", "BAJAN", "BAJRA", "BAJRI", "BAJUS", "BAKED", "BAKEN", "BAKES", + "BAKRA", "BALAS", "BALDS", "BALDY", "BALED", "BALES", "BALKS", "BALKY", "BALLS", "BALLY", "BALMS", "BALOO", + "BALSA", "BALTI", "BALUN", "BALUS", "BAMBI", "BANAK", "BANCO", "BANCS", "BANDA", "BANDH", "BANDS", "BANDY", + "BANED", "BANES", "BANGS", "BANIA", "BANKS", "BANNS", "BANTS", "BANTU", "BANTY", "BANYA", "BAPUS", "BARBE", + "BARBS", "BARBY", "BARCA", "BARDE", "BARDO", "BARDS", "BARDY", "BARED", "BARER", "BARES", "BARFI", "BARFS", + "BARIC", "BARKS", "BARKY", "BARMS", "BARMY", "BARNS", "BARNY", "BARPS", "BARRA", "BARRE", "BARRO", "BARRY", + "BARYE", "BASAN", "BASED", "BASEN", "BASER", "BASES", "BASHO", "BASIJ", "BASKS", "BASON", "BASSE", "BASSI", + "BASSO", "BASSY", "BASTA", "BASTI", "BASTO", "BASTS", "BATED", "BATES", "BATHS", "BATIK", "BATTA", "BATTS", + "BATTU", "BAUDS", "BAUKS", "BAULK", "BAURS", "BAVIN", "BAWDS", "BAWKS", "BAWLS", "BAWNS", "BAWRS", "BAWTY", + "BAYED", "BAYER", "BAYES", "BAYLE", "BAYTS", "BAZAR", "BAZOO", "BEADS", "BEAKS", "BEAKY", "BEALS", "BEAMS", + "BEAMY", "BEANO", "BEANS", "BEANY", "BEARE", "BEARS", "BEATH", "BEATS", "BEATY", "BEAUS", "BEAUT", "BEAUX", + "BEBOP", "BECAP", "BECKE", "BECKS", "BEDAD", "BEDEL", "BEDES", "BEDEW", "BEDIM", "BEDYE", "BEEDI", "BEEFS", + "BEEPS", "BEERS", "BEERY", "BEETS", "BEFOG", "BEGAD", "BEGAR", "BEGEM", "BEGOT", "BEGUM", "BEIGE", "BEIGY", + "BEINS", "BEKAH", "BELAH", "BELAR", "BELAY", "BELEE", "BELGA", "BELLS", "BELON", "BELTS", "BEMAD", "BEMAS", + "BEMIX", "BEMUD", "BENDS", "BENDY", "BENES", "BENET", "BENGA", "BENIS", "BENNE", "BENNI", "BENNY", "BENTO", + "BENTS", "BENTY", "BEPAT", "BERAY", "BERES", "BERGS", "BERKO", "BERKS", "BERME", "BERMS", "BEROB", "BERYL", + "BESAT", "BESAW", "BESEE", "BESES", "BESIT", "BESOM", "BESOT", "BESTI", "BESTS", "BETAS", "BETED", "BETES", + "BETHS", "BETID", "BETON", "BETTA", "BETTY", "BEVER", "BEVOR", "BEVUE", "BEVVY", "BEWET", "BEWIG", "BEZES", + "BEZIL", "BEZZY", "BHAIS", "BHAJI", "BHANG", "BHATS", "BHELS", "BHOOT", "BHUNA", "BHUTS", "BIACH", "BIALI", + "BIALY", "BIBBS", "BIBES", "BICCY", "BICES", "BIDED", "BIDER", "BIDES", "BIDET", "BIDIS", "BIDON", "BIELD", + "BIERS", "BIFFO", "BIFFS", "BIFFY", "BIFID", "BIGAE", "BIGGS", "BIGGY", "BIGHA", "BIGHT", "BIGLY", "BIGOS", + "BIJOU", "BIKED", "BIKER", "BIKES", "BIKIE", "BILBO", "BILBY", "BILED", "BILES", "BILGY", "BILKS", "BILLS", + "BIMAH", "BIMAS", "BIMBO", "BINAL", "BINDI", "BINDS", "BINER", "BINES", "BINGS", "BINGY", "BINIT", "BINKS", + "BINTS", "BIOGS", "BIONT", "BIOTA", "BIPED", "BIPOD", "BIRDS", "BIRKS", "BIRLE", "BIRLS", "BIROS", "BIRRS", + "BIRSE", "BIRSY", "BISES", "BISKS", "BISOM", "BITCH", "BITER", "BITES", "BITOS", "BITOU", "BITSY", "BITTE", + "BITTS", "BIVIA", "BIVVY", "BIZES", "BIZZO", "BIZZY", "BLABS", "BLADS", "BLADY", "BLAER", "BLAES", "BLAFF", + "BLAGS", "BLAHS", "BLAIN", "BLAMS", "BLART", "BLASE", "BLASH", "BLATE", "BLATS", "BLATT", "BLAUD", "BLAWN", + "BLAWS", "BLAYS", "BLEAR", "BLEBS", "BLECH", "BLEES", "BLENT", "BLERT", "BLEST", "BLETS", "BLEYS", "BLIMY", + "BLING", "BLINI", "BLINS", "BLINY", "BLIPS", "BLIST", "BLITE", "BLITS", "BLIVE", "BLOBS", "BLOCS", "BLOGS", + "BLOOK", "BLOOP", "BLORE", "BLOTS", "BLOWS", "BLOWY", "BLUBS", "BLUDE", "BLUDS", "BLUDY", "BLUED", "BLUES", + "BLUET", "BLUEY", "BLUID", "BLUME", "BLUNK", "BLURS", "BLYPE", "BOABS", "BOAKS", "BOARS", "BOART", "BOATS", + "BOBAC", "BOBAK", "BOBAS", "BOBOL", "BOBOS", "BOCCA", "BOCCE", "BOCCI", "BOCHE", "BOCKS", "BODED", "BODES", + "BODGE", "BODHI", "BODLE", "BOEPS", "BOETS", "BOEUF", "BOFFO", "BOFFS", "BOGAN", "BOGEY", "BOGGY", "BOGIE", + "BOGLE", "BOGUE", "BOGUS", "BOHEA", "BOHOS", "BOILS", "BOING", "BOINK", "BOITE", "BOKED", "BOKEH", "BOKES", + "BOKOS", "BOLAR", "BOLAS", "BOLDS", "BOLES", "BOLIX", "BOLLS", "BOLOS", "BOLTS", "BOLUS", "BOMAS", "BOMBE", + "BOMBO", "BOMBS", "BONCE", "BONDS", "BONED", "BONER", "BONES", "BONGS", "BONIE", "BONKS", "BONNE", "BONNY", + "BONZA", "BONZE", "BOOAI", "BOOAY", "BOOBS", "BOODY", "BOOED", "BOOFY", "BOOGY", "BOOHS", "BOOKS", "BOOKY", + "BOOLS", "BOOMS", "BOOMY", "BOONG", "BOONS", "BOORD", "BOORS", "BOOSE", "BOOTS", "BOPPY", "BORAK", "BORAL", + "BORAS", "BORDE", "BORDS", "BORED", "BOREE", "BOREL", "BORER", "BORES", "BORGO", "BORIC", "BORKS", "BORMS", + "BORNA", "BORON", "BORTS", "BORTY", "BORTZ", "BOSIE", "BOSKS", "BOSKY", "BOSON", "BOSUN", "BOTAS", "BOTEL", + "BOTES", "BOTHY", "BOTTE", "BOTTS", "BOTTY", "BOUGE", "BOUKS", "BOULT", "BOUNS", "BOURD", "BOURG", "BOURN", + "BOUSE", "BOUSY", "BOUTS", "BOVID", "BOWAT", "BOWED", "BOWER", "BOWES", "BOWET", "BOWIE", "BOWLS", "BOWNE", + "BOWRS", "BOWSE", "BOXED", "BOXEN", "BOXES", "BOXLA", "BOXTY", "BOYAR", "BOYAU", "BOYED", "BOYFS", "BOYGS", + "BOYLA", "BOYOS", "BOYSY", "BOZOS", "BRAAI", "BRACH", "BRACK", "BRACT", "BRADS", "BRAES", "BRAGS", "BRAIL", + "BRAKS", "BRAKY", "BRAME", "BRANE", "BRANK", "BRANS", "BRANT", "BRAST", "BRATS", "BRAVA", "BRAVI", "BRAWS", + "BRAXY", "BRAYS", "BRAZA", "BRAZE", "BREAM", "BREDE", "BREDS", "BREEM", "BREER", "BREES", "BREID", "BREIS", + "BREME", "BRENS", "BRENT", "BRERE", "BRERS", "BREVE", "BREWS", "BREYS", "BRIER", "BRIES", "BRIGS", "BRIKI", + "BRIKS", "BRILL", "BRIMS", "BRINS", "BRIOS", "BRISE", "BRISS", "BRITH", "BRITS", "BRITT", "BRIZE", "BROCH", + "BROCK", "BRODS", "BROGH", "BROGS", "BROME", "BROMO", "BRONC", "BROND", "BROOL", "BROOS", "BROSE", "BROSY", + "BROWS", "BRUGH", "BRUIN", "BRUIT", "BRULE", "BRUME", "BRUNG", "BRUSK", "BRUST", "BRUTS", "BUATS", "BUAZE", + "BUBAL", "BUBAS", "BUBBA", "BUBBE", "BUBBY", "BUBUS", "BUCHU", "BUCKO", "BUCKS", "BUCKU", "BUDAS", "BUDIS", + "BUDOS", "BUFFA", "BUFFE", "BUFFI", "BUFFO", "BUFFS", "BUFFY", "BUFOS", "BUFTY", "BUHLS", "BUHRS", "BUIKS", + "BUIST", "BUKES", "BULBS", "BULGY", "BULKS", "BULLA", "BULLS", "BULSE", "BUMBO", "BUMFS", "BUMPH", "BUMPS", + "BUMPY", "BUNAS", "BUNCE", "BUNCO", "BUNDE", "BUNDH", "BUNDS", "BUNDT", "BUNDU", "BUNDY", "BUNGS", "BUNGY", + "BUNIA", "BUNJE", "BUNJY", "BUNKO", "BUNKS", "BUNNS", "BUNTS", "BUNTY", "BUNYA", "BUOYS", "BUPPY", "BURAN", + "BURAS", "BURBS", "BURDS", "BURET", "BURFI", "BURGH", "BURGS", "BURIN", "BURKA", "BURKE", "BURKS", "BURLS", + "BURNS", "BUROO", "BURPS", "BURQA", "BURRO", "BURRS", "BURRY", "BURSA", "BURSE", "BUSBY", "BUSES", "BUSKS", + "BUSKY", "BUSSU", "BUSTI", "BUSTS", "BUSTY", "BUTEO", "BUTES", "BUTLE", "BUTOH", "BUTTS", "BUTTY", "BUTUT", + "BUTYL", "BUZZY", "BWANA", "BWAZI", "BYDED", "BYDES", "BYKED", "BYKES", "BYRES", "BYRLS", "BYSSI", "BYTES", + "BYWAY", "CAAED", "CABAS", "CABER", "CABOB", "CABOC", "CABRE", "CACAS", "CACKS", "CACKY", "CADEE", "CADES", + "CADGE", "CADGY", "CADIE", "CADIS", "CADRE", "CAECA", "CAESE", "CAFES", "CAFFS", "CAGED", "CAGER", "CAGES", + "CAGOT", "CAHOW", "CAIDS", "CAINS", "CAIRD", "CAJON", "CAJUN", "CAKED", "CAKES", "CAKEY", "CALFS", "CALID", + "CALIF", "CALIX", "CALKS", "CALLA", "CALLS", "CALMS", "CALMY", "CALOS", "CALPA", "CALPS", "CALVE", "CALYX", + "CAMAN", "CAMAS", "CAMES", "CAMIS", "CAMOS", "CAMPI", "CAMPO", "CAMPS", "CAMPY", "CAMUS", "CANED", "CANEH", + "CANER", "CANES", "CANGS", "CANID", "CANNA", "CANNS", "CANSO", "CANST", "CANTO", "CANTS", "CANTY", "CAPAS", + "CAPED", "CAPES", "CAPEX", "CAPHS", "CAPIZ", "CAPLE", "CAPON", "CAPOS", "CAPOT", "CAPRI", "CAPUL", "CARAP", + "CARBO", "CARBS", "CARBY", "CARDI", "CARDS", "CARDY", "CARED", "CARER", "CARES", "CARET", "CAREX", "CARKS", + "CARLE", "CARLS", "CARNS", "CARNY", "CAROB", "CAROM", "CARON", "CARPI", "CARPS", "CARRS", "CARSE", "CARTA", + "CARTE", "CARTS", "CARVY", "CASAS", "CASCO", "CASED", "CASES", "CASKS", "CASKY", "CASTS", "CASUS", "CATES", + "CAUDA", "CAUKS", "CAULD", "CAULS", "CAUMS", "CAUPS", "CAURI", "CAUSA", "CAVAS", "CAVED", "CAVEL", "CAVER", + "CAVES", "CAVIE", "CAWED", "CAWKS", "CAXON", "CEAZE", "CEBID", "CECAL", "CECUM", "CEDED", "CEDER", "CEDES", + "CEDIS", "CEIBA", "CEILI", "CEILS", "CELEB", "CELLA", "CELLI", "CELLS", "CELOM", "CELTS", "CENSE", "CENTO", + "CENTS", "CENTU", "CEORL", "CEPES", "CERCI", "CERED", "CERES", "CERGE", "CERIA", "CERIC", "CERNE", "CEROC", + "CEROS", "CERTS", "CERTY", "CESSE", "CESTA", "CESTI", "CETES", "CETYL", "CEZVE", "CHACE", "CHACK", "CHACO", + "CHADO", "CHADS", "CHAFT", "CHAIS", "CHALS", "CHAMS", "CHANA", "CHANG", "CHANK", "CHAPE", "CHAPS", "CHAPT", + "CHARA", "CHARE", "CHARK", "CHARR", "CHARS", "CHARY", "CHATS", "CHAVE", "CHAVS", "CHAWK", "CHAWS", "CHAYA", + "CHAYS", "CHEEP", "CHEFS", "CHEKA", "CHELA", "CHELP", "CHEMO", "CHEMS", "CHERE", "CHERT", "CHETH", "CHEVY", + "CHEWS", "CHEWY", "CHIAO", "CHIAS", "CHIBS", "CHICA", "CHICH", "CHICO", "CHICS", "CHIEL", "CHIKS", "CHILE", + "CHIMB", "CHIMO", "CHIMP", "CHINE", "CHING", "CHINK", "CHINO", "CHINS", "CHIPS", "CHIRK", "CHIRL", "CHIRM", + "CHIRO", "CHIRR", "CHIRT", "CHIRU", "CHITS", "CHIVE", "CHIVS", "CHIVY", "CHIZZ", "CHOCO", "CHOCS", "CHODE", + "CHOGS", "CHOIL", "CHOKO", "CHOKY", "CHOLA", "CHOLI", "CHOLO", "CHOMP", "CHONS", "CHOOF", "CHOOK", "CHOOM", + "CHOON", "CHOPS", "CHOTA", "CHOTT", "CHOUT", "CHOUX", "CHOWK", "CHOWS", "CHUBS", "CHUFA", "CHUFF", "CHUGS", + "CHUMS", "CHURL", "CHURR", "CHUSE", "CHUTS", "CHYLE", "CHYME", "CHYND", "CIBOL", "CIDED", "CIDES", "CIELS", + "CIGGY", "CILIA", "CILLS", "CIMAR", "CIMEX", "CINCT", "CINES", "CINQS", "CIONS", "CIPPI", "CIRCS", "CIRES", + "CIRLS", "CIRRI", "CISCO", "CISSY", "CISTS", "CITAL", "CITED", "CITER", "CITES", "CIVES", "CIVET", "CIVIE", + "CIVVY", "CLACH", "CLADE", "CLADS", "CLAES", "CLAGS", "CLAME", "CLAMS", "CLANS", "CLAPS", "CLAPT", "CLARO", + "CLART", "CLARY", "CLAST", "CLATS", "CLAUT", "CLAVE", "CLAVI", "CLAWS", "CLAYS", "CLECK", "CLEEK", "CLEEP", + "CLEFS", "CLEGS", "CLEIK", "CLEMS", "CLEPE", "CLEPT", "CLEVE", "CLEWS", "CLIED", "CLIES", "CLIFT", "CLIME", + "CLINE", "CLINT", "CLIPE", "CLIPS", "CLIPT", "CLITS", "CLOAM", "CLODS", "CLOFF", "CLOGS", "CLOKE", "CLOMB", + "CLOMP", "CLONK", "CLONS", "CLOOP", "CLOOT", "CLOPS", "CLOTE", "CLOTS", "CLOUR", "CLOUS", "CLOWS", "CLOYE", + "CLOYS", "CLOZE", "CLUBS", "CLUES", "CLUEY", "CLUNK", "CLYPE", "CNIDA", "COACT", "COADY", "COALA", "COALS", + "COALY", "COAPT", "COARB", "COATE", "COATI", "COATS", "COBBS", "COBBY", "COBIA", "COBLE", "COBZA", "COCAS", + "COCCI", "COCCO", "COCKS", "COCKY", "COCOS", "CODAS", "CODEC", "CODED", "CODEN", "CODER", "CODES", "CODEX", + "CODON", "COEDS", "COFFS", "COGIE", "COGON", "COGUE", "COHAB", "COHEN", "COHOE", "COHOG", "COHOS", "COIFS", + "COIGN", "COILS", "COINS", "COIRS", "COITS", "COKED", "COKES", "COLAS", "COLBY", "COLDS", "COLED", "COLES", + "COLEY", "COLIC", "COLIN", "COLLS", "COLLY", "COLOG", "COLTS", "COLZA", "COMAE", "COMAL", "COMAS", "COMBE", + "COMBI", "COMBO", "COMBS", "COMBY", "COMER", "COMES", "COMIX", "COMMO", "COMMS", "COMMY", "COMPO", "COMPS", + "COMPT", "COMTE", "COMUS", "CONED", "CONES", "CONEY", "CONFS", "CONGA", "CONGE", "CONGO", "CONIA", "CONIN", + "CONKS", "CONKY", "CONNE", "CONNS", "CONTE", "CONTO", "CONUS", "CONVO", "COOCH", "COOED", "COOEE", "COOER", + "COOEY", "COOFS", "COOKS", "COOKY", "COOLS", "COOLY", "COOMB", "COOMS", "COOMY", "COONS", "COOPS", "COOPT", + "COOST", "COOTS", "COOZE", "COPAL", "COPAY", "COPED", "COPEN", "COPER", "COPES", "COPPY", "COPRA", "COPSY", + "COQUI", "CORAM", "CORBE", "CORBY", "CORDS", "CORED", "CORES", "COREY", "CORGI", "CORIA", "CORKS", "CORKY", + "CORMS", "CORNI", "CORNO", "CORNS", "CORNU", "CORPS", "CORSE", "CORSO", "COSEC", "COSED", "COSES", "COSET", + "COSEY", "COSIE", "COSTA", "COSTE", "COSTS", "COTAN", "COTED", "COTES", "COTHS", "COTTA", "COTTS", "COUDE", + "COUPS", "COURB", "COURD", "COURE", "COURS", "COUTA", "COUTH", "COVED", "COVES", "COVIN", "COWAL", "COWAN", + "COWED", "COWKS", "COWLS", "COWPS", "COWRY", "COXAE", "COXAL", "COXED", "COXES", "COXIB", "COYAU", "COYED", + "COYER", "COYPU", "COZED", "COZEN", "COZES", "COZEY", "COZIE", "CRAAL", "CRABS", "CRAGS", "CRAIC", "CRAIG", + "CRAKE", "CRAME", "CRAMS", "CRANS", "CRAPE", "CRAPS", "CRAPY", "CRARE", "CRAWS", "CRAYS", "CREDS", "CREEL", + "CREES", "CREMS", "CRENA", "CREPS", "CREPY", "CREWE", "CREWS", "CRIAS", "CRIBS", "CRIES", "CRIMS", "CRINE", + "CRIOS", "CRIPE", "CRIPS", "CRISE", "CRITH", "CRITS", "CROCI", "CROCS", "CROFT", "CROGS", "CROMB", "CROME", + "CRONK", "CRONS", "CROOL", "CROON", "CROPS", "CRORE", "CROST", "CROUT", "CROWS", "CROZE", "CRUCK", "CRUDO", + "CRUDS", "CRUDY", "CRUES", "CRUET", "CRUFT", "CRUNK", "CRUOR", "CRURA", "CRUSE", "CRUSY", "CRUVE", "CRWTH", + "CRYER", "CTENE", "CUBBY", "CUBEB", "CUBED", "CUBER", "CUBES", "CUBIT", "CUDDY", "CUFFO", "CUFFS", "CUIFS", + "CUING", "CUISH", "CUITS", "CUKES", "CULCH", "CULET", "CULEX", "CULLS", "CULLY", "CULMS", "CULPA", "CULTI", + "CULTS", "CULTY", "CUMEC", "CUNDY", "CUNEI", "CUNIT", "CUNTS", "CUPEL", "CUPID", "CUPPA", "CUPPY", "CURAT", + "CURBS", "CURCH", "CURDS", "CURDY", "CURED", "CURER", "CURES", "CURET", "CURFS", "CURIA", "CURIE", "CURLI", + "CURLS", "CURNS", "CURNY", "CURRS", "CURSI", "CURST", "CUSEC", "CUSHY", "CUSKS", "CUSPS", "CUSPY", "CUSSO", + "CUSUM", "CUTCH", "CUTER", "CUTES", "CUTEY", "CUTIN", "CUTIS", "CUTTO", "CUTTY", "CUTUP", "CUVEE", "CUZES", + "CWTCH", "CYANO", "CYANS", "CYCAD", "CYCAS", "CYCLO", "CYDER", "CYLIX", "CYMAE", "CYMAR", "CYMAS", "CYMES", + "CYMOL", "CYSTS", "CYTES", "CYTON", "CZARS", "DAALS", "DABBA", "DACES", "DACHA", "DACKS", "DADAH", "DADAS", + "DADOS", "DAFFS", "DAFFY", "DAGGA", "DAGGY", "DAGOS", "DAHLS", "DAIKO", "DAINE", "DAINT", "DAKER", "DALED", + "DALES", "DALIS", "DALLE", "DALTS", "DAMAN", "DAMAR", "DAMES", "DAMME", "DAMNS", "DAMPS", "DAMPY", "DANCY", + "DANGS", "DANIO", "DANKS", "DANNY", "DANTS", "DARAF", "DARBS", "DARCY", "DARED", "DARER", "DARES", "DARGA", + "DARGS", "DARIC", "DARIS", "DARKS", "DARKY", "DARNS", "DARRE", "DARTS", "DARZI", "DASHI", "DASHY", "DATAL", + "DATED", "DATER", "DATES", "DATOS", "DATTO", "DAUBE", "DAUBS", "DAUBY", "DAUDS", "DAULT", "DAURS", "DAUTS", + "DAVEN", "DAVIT", "DAWAH", "DAWDS", "DAWED", "DAWEN", "DAWKS", "DAWNS", "DAWTS", "DAYAN", "DAYCH", "DAYNT", + "DAZED", "DAZER", "DAZES", "DEADS", "DEAIR", "DEALS", "DEANS", "DEARE", "DEARN", "DEARS", "DEARY", "DEASH", + "DEAVE", "DEAWS", "DEAWY", "DEBAG", "DEBBY", "DEBEL", "DEBES", "DEBTS", "DEBUD", "DEBUR", "DEBUS", "DEBYE", + "DECAD", "DECAF", "DECAN", "DECKO", "DECKS", "DECOS", "DEDAL", "DEEDS", "DEEDY", "DEELY", "DEEMS", "DEENS", + "DEEPS", "DEERE", "DEERS", "DEETS", "DEEVE", "DEEVS", "DEFAT", "DEFFO", "DEFIS", "DEFOG", "DEGAS", "DEGUM", + "DEGUS", "DEICE", "DEIDS", "DEIFY", "DEILS", "DEISM", "DEIST", "DEKED", "DEKES", "DEKKO", "DELED", "DELES", + "DELFS", "DELFT", "DELIS", "DELLS", "DELLY", "DELOS", "DELPH", "DELTS", "DEMAN", "DEMES", "DEMIC", "DEMIT", + "DEMOB", "DEMOI", "DEMOS", "DEMPT", "DENAR", "DENAY", "DENCH", "DENES", "DENET", "DENIS", "DENTS", "DEOXY", + "DERAT", "DERAY", "DERED", "DERES", "DERIG", "DERMA", "DERMS", "DERNS", "DERNY", "DEROS", "DERRO", "DERRY", + "DERTH", "DERVS", "DESEX", "DESHI", "DESIS", "DESKS", "DESSE", "DEVAS", "DEVEL", "DEVIS", "DEVON", "DEVOS", + "DEVOT", "DEWAN", "DEWAR", "DEWAX", "DEWED", "DEXES", "DEXIE", "DHABA", "DHAKS", "DHALS", "DHIKR", "DHOBI", + "DHOLE", "DHOLL", "DHOLS", "DHOTI", "DHOWS", "DHUTI", "DIACT", "DIALS", "DIANE", "DIAZO", "DIBBS", "DICED", + "DICER", "DICES", "DICHT", "DICKS", "DICKY", "DICOT", "DICTA", "DICTS", "DICTY", "DIDDY", "DIDIE", "DIDOS", + "DIDST", "DIEBS", "DIELS", "DIENE", "DIETS", "DIFFS", "DIGHT", "DIKAS", "DIKED", "DIKER", "DIKES", "DIKEY", + "DILDO", "DILLI", "DILLS", "DIMBO", "DIMER", "DIMES", "DIMPS", "DINAR", "DINED", "DINES", "DINGE", "DINGS", + "DINIC", "DINKS", "DINKY", "DINNA", "DINOS", "DINTS", "DIOLS", "DIOTA", "DIPPY", "DIPSO", "DIRAM", "DIRER", + "DIRKE", "DIRKS", "DIRLS", "DIRTS", "DISAS", "DISCI", "DISCS", "DISHY", "DISKS", "DISME", "DITAL", "DITAS", + "DITED", "DITES", "DITSY", "DITTS", "DITZY", "DIVAN", "DIVAS", "DIVED", "DIVES", "DIVIS", "DIVNA", "DIVOS", + "DIVOT", "DIVVY", "DIWAN", "DIXIE", "DIXIT", "DIYAS", "DIZEN", "DJINN", "DJINS", "DOABS", "DOATS", "DOBBY", + "DOBES", "DOBIE", "DOBLA", "DOBRA", "DOBRO", "DOCHT", "DOCKS", "DOCOS", "DOCUS", "DODDY", "DODOS", "DOEKS", + "DOERS", "DOEST", "DOETH", "DOFFS", "DOGAN", "DOGES", "DOGEY", "DOGGO", "DOGGY", "DOGIE", "DOHYO", "DOILT", + "DOILY", "DOITS", "DOJOS", "DOLCE", "DOLCI", "DOLED", "DOLES", "DOLIA", "DOLLS", "DOLMA", "DOLOR", "DOLOS", + "DOLTS", "DOMAL", "DOMED", "DOMES", "DOMIC", "DONAH", "DONAS", "DONEE", "DONER", "DONGA", "DONGS", "DONKO", + "DONNA", "DONNE", "DONNY", "DONSY", "DOOBS", "DOOCE", "DOODY", "DOOKS", "DOOLE", "DOOLS", "DOOLY", "DOOMS", + "DOOMY", "DOONA", "DOORN", "DOORS", "DOOZY", "DOPAS", "DOPED", "DOPER", "DOPES", "DORAD", "DORBA", "DORBS", + "DOREE", "DORES", "DORIC", "DORIS", "DORKS", "DORKY", "DORMS", "DORMY", "DORPS", "DORRS", "DORSA", "DORSE", + "DORTS", "DORTY", "DOSAI", "DOSAS", "DOSED", "DOSEH", "DOSER", "DOSES", "DOSHA", "DOTAL", "DOTED", "DOTER", + "DOTES", "DOTTY", "DOUAR", "DOUCE", "DOUCS", "DOUKS", "DOULA", "DOUMA", "DOUMS", "DOUPS", "DOURA", "DOUSE", + "DOUTS", "DOVED", "DOVEN", "DOVER", "DOVES", "DOVIE", "DOWAR", "DOWDS", "DOWED", "DOWER", "DOWIE", "DOWLE", + "DOWLS", "DOWLY", "DOWNA", "DOWNS", "DOWPS", "DOWSE", "DOWTS", "DOXED", "DOXES", "DOXIE", "DOYEN", "DOYLY", + "DOZED", "DOZER", "DOZES", "DRABS", "DRACK", "DRACO", "DRAFF", "DRAGS", "DRAIL", "DRAMS", "DRANT", "DRAPS", + "DRATS", "DRAVE", "DRAWS", "DRAYS", "DREAR", "DRECK", "DREED", "DREER", "DREES", "DREGS", "DREKS", "DRENT", + "DRERE", "DREST", "DREYS", "DRIBS", "DRICE", "DRIES", "DRILY", "DRIPS", "DRIPT", "DROID", "DROIL", "DROKE", + "DROLE", "DROME", "DRONY", "DROOB", "DROOG", "DROOK", "DROPS", "DROPT", "DROUK", "DROWS", "DRUBS", "DRUGS", + "DRUMS", "DRUPE", "DRUSE", "DRUSY", "DRUXY", "DRYAD", "DRYAS", "DSOBO", "DSOMO", "DUADS", "DUALS", "DUANS", + "DUARS", "DUBBO", "DUCAL", "DUCAT", "DUCES", "DUCKS", "DUCKY", "DUCTS", "DUDDY", "DUDED", "DUDES", "DUELS", + "DUETS", "DUETT", "DUFFS", "DUFUS", "DUING", "DUITS", "DUKAS", "DUKED", "DUKES", "DUKKA", "DULCE", "DULES", + "DULIA", "DULLS", "DULSE", "DUMAS", "DUMBO", "DUMBS", "DUMKA", "DUMKY", "DUMPS", "DUNAM", "DUNCH", "DUNES", + "DUNGS", "DUNGY", "DUNKS", "DUNNO", "DUNNY", "DUNSH", "DUNTS", "DUOMI", "DUOMO", "DUPED", "DUPER", "DUPES", + "DUPLE", "DUPLY", "DUPPY", "DURAL", "DURAS", "DURED", "DURES", "DURGY", "DURNS", "DUROC", "DUROS", "DUROY", + "DURRA", "DURRS", "DURRY", "DURST", "DURUM", "DURZI", "DUSKS", "DUSTS", "DUXES", "DWAAL", "DWALE", "DWALM", + "DWAMS", "DWANG", "DWAUM", "DWEEB", "DWILE", "DWINE", "DYADS", "DYERS", "DYKED", "DYKES", "DYKEY", "DYKON", + "DYNEL", "DYNES", "DZHOS", "EAGRE", "EALED", "EALES", "EANED", "EARDS", "EARED", "EARLS", "EARNS", "EARNT", + "EARST", "EASED", "EASER", "EASES", "EASLE", "EASTS", "EATHE", "EAVED", "EAVES", "EBBED", "EBBET", "EBONS", + "EBOOK", "ECADS", "ECHED", "ECHES", "ECHOS", "ECRUS", "EDEMA", "EDGED", "EDGER", "EDGES", "EDILE", "EDITS", + "EDUCE", "EDUCT", "EEJIT", "EENSY", "EEVEN", "EEVNS", "EFFED", "EGADS", "EGERS", "EGEST", "EGGAR", "EGGED", + "EGGER", "EGMAS", "EHING", "EIDER", "EIDOS", "EIGNE", "EIKED", "EIKON", "EILDS", "EISEL", "EJIDO", "EKKAS", + "ELAIN", "ELAND", "ELANS", "ELCHI", "ELDIN", "ELEMI", "ELFED", "ELIAD", "ELINT", "ELMEN", "ELOGE", "ELOGY", + "ELOIN", "ELOPS", "ELPEE", "ELSIN", "ELUTE", "ELVAN", "ELVEN", "ELVER", "ELVES", "EMACS", "EMBAR", "EMBAY", + "EMBOG", "EMBOW", "EMBOX", "EMBUS", "EMEER", "EMEND", "EMERG", "EMERY", "EMEUS", "EMICS", "EMIRS", "EMITS", + "EMMAS", "EMMER", "EMMET", "EMMEW", "EMMYS", "EMOJI", "EMONG", "EMOTE", "EMOVE", "EMPTS", "EMULE", "EMURE", + "EMYDE", "EMYDS", "ENARM", "ENATE", "ENDED", "ENDER", "ENDEW", "ENDUE", "ENEWS", "ENFIX", "ENIAC", "ENLIT", + "ENMEW", "ENNOG", "ENOKI", "ENOLS", "ENORM", "ENOWS", "ENROL", "ENSEW", "ENSKY", "ENTIA", "ENURE", "ENURN", + "ENVOI", "ENZYM", "EORLS", "EOSIN", "EPACT", "EPEES", "EPHAH", "EPHAS", "EPHOD", "EPHOR", "EPICS", "EPODE", + "EPOPT", "EPRIS", "EQUES", "EQUID", "ERBIA", "EREVS", "ERGON", "ERGOS", "ERGOT", "ERHUS", "ERICA", "ERICK", + "ERICS", "ERING", "ERNED", "ERNES", "EROSE", "ERRED", "ERSES", "ERUCT", "ERUGO", "ERUVS", "ERVEN", "ERVIL", + "ESCAR", "ESCOT", "ESILE", "ESKAR", "ESKER", "ESNES", "ESSES", "ESTOC", "ESTOP", "ESTRO", "ETAGE", "ETAPE", + "ETATS", "ETENS", "ETHAL", "ETHNE", "ETHYL", "ETICS", "ETNAS", "ETTIN", "ETTLE", "ETUIS", "ETWEE", "ETYMA", + "EUGHS", "EUKED", "EUPAD", "EUROS", "EUSOL", "EVENS", "EVERT", "EVETS", "EVHOE", "EVILS", "EVITE", "EVOHE", + "EWERS", "EWEST", "EWHOW", "EWKED", "EXAMS", "EXEAT", "EXECS", "EXEEM", "EXEME", "EXFIL", "EXIES", "EXINE", + "EXING", "EXITS", "EXODE", "EXOME", "EXONS", "EXPAT", "EXPOS", "EXUDE", "EXULS", "EXURB", "EYASS", "EYERS", + "EYOTS", "EYRAS", "EYRES", "EYRIE", "EYRIR", "EZINE", "FABBY", "FACED", "FACER", "FACES", "FACIA", "FACTA", + "FACTS", "FADDY", "FADED", "FADER", "FADES", "FADGE", "FADOS", "FAENA", "FAERY", "FAFFS", "FAFFY", "FAGGY", + "FAGIN", "FAGOT", "FAIKS", "FAILS", "FAINE", "FAINS", "FAIRS", "FAKED", "FAKER", "FAKES", "FAKEY", "FAKIE", + "FAKIR", "FALAJ", "FALLS", "FAMED", "FAMES", "FANAL", "FANDS", "FANES", "FANGA", "FANGO", "FANGS", "FANKS", + "FANON", "FANOS", "FANUM", "FAQIR", "FARAD", "FARCI", "FARCY", "FARDS", "FARED", "FARER", "FARES", "FARLE", + "FARLS", "FARMS", "FAROS", "FARRO", "FARSE", "FARTS", "FASCI", "FASTI", "FASTS", "FATED", "FATES", "FATLY", + "FATSO", "FATWA", "FAUGH", "FAULD", "FAUNS", "FAURD", "FAUTS", "FAUVE", "FAVAS", "FAVEL", "FAVER", "FAVES", + "FAVUS", "FAWNS", "FAWNY", "FAXED", "FAXES", "FAYED", "FAYER", "FAYNE", "FAYRE", "FAZED", "FAZES", "FEALS", + "FEARE", "FEARS", "FEART", "FEASE", "FEATS", "FEAZE", "FECES", "FECHT", "FECIT", "FECKS", "FEDEX", "FEEBS", + "FEEDS", "FEELS", "FEENS", "FEERS", "FEESE", "FEEZE", "FEHME", "FEINT", "FEIST", "FELCH", "FELID", "FELLS", + "FELLY", "FELTS", "FELTY", "FEMAL", "FEMES", "FEMMY", "FENDS", "FENDY", "FENIS", "FENKS", "FENNY", "FENTS", + "FEODS", "FEOFF", "FERER", "FERES", "FERIA", "FERLY", "FERMI", "FERMS", "FERNS", "FERNY", "FESSE", "FESTA", + "FESTS", "FESTY", "FETAS", "FETED", "FETES", "FETOR", "FETTA", "FETTS", "FETWA", "FEUAR", "FEUDS", "FEUED", + "FEYED", "FEYER", "FEYLY", "FEZES", "FEZZY", "FIARS", "FIATS", "FIBRE", "FIBRO", "FICES", "FICHE", "FICHU", + "FICIN", "FICOS", "FIDES", "FIDGE", "FIDOS", "FIEFS", "FIENT", "FIERE", "FIERS", "FIEST", "FIFED", "FIFER", + "FIFES", "FIFIS", "FIGGY", "FIGOS", "FIKED", "FIKES", "FILAR", "FILCH", "FILED", "FILES", "FILII", "FILKS", + "FILLE", "FILLO", "FILLS", "FILMI", "FILMS", "FILOS", "FILUM", "FINCA", "FINDS", "FINED", "FINES", "FINIS", + "FINKS", "FINNY", "FINOS", "FIORD", "FIQHS", "FIQUE", "FIRED", "FIRER", "FIRES", "FIRIE", "FIRKS", "FIRMS", + "FIRNS", "FIRRY", "FIRTH", "FISCS", "FISKS", "FISTS", "FISTY", "FITCH", "FITLY", "FITNA", "FITTE", "FITTS", + "FIVER", "FIVES", "FIXED", "FIXES", "FIXIT", "FJELD", "FLABS", "FLAFF", "FLAGS", "FLAKS", "FLAMM", "FLAMS", + "FLAMY", "FLANE", "FLANS", "FLAPS", "FLARY", "FLATS", "FLAVA", "FLAWN", "FLAWS", "FLAWY", "FLAXY", "FLAYS", + "FLEAM", "FLEAS", "FLEEK", "FLEER", "FLEES", "FLEGS", "FLEME", "FLEUR", "FLEWS", "FLEXI", "FLEXO", "FLEYS", + "FLICS", "FLIED", "FLIES", "FLIMP", "FLIMS", "FLIPS", "FLIRS", "FLISK", "FLITE", "FLITS", "FLITT", "FLOBS", + "FLOCS", "FLOES", "FLOGS", "FLONG", "FLOPS", "FLORS", "FLORY", "FLOSH", "FLOTA", "FLOTE", "FLOWS", "FLUBS", + "FLUED", "FLUES", "FLUEY", "FLUKY", "FLUMP", "FLUOR", "FLURR", "FLUTY", "FLUYT", "FLYBY", "FLYPE", "FLYTE", + "FOALS", "FOAMS", "FOEHN", "FOGEY", "FOGIE", "FOGLE", "FOGOU", "FOHNS", "FOIDS", "FOILS", "FOINS", "FOLDS", + "FOLEY", "FOLIA", "FOLIC", "FOLIE", "FOLKS", "FOLKY", "FOMES", "FONDA", "FONDS", "FONDU", "FONES", "FONLY", + "FONTS", "FOODS", "FOODY", "FOOLS", "FOOTS", "FOOTY", "FORAM", "FORBS", "FORBY", "FORDO", "FORDS", "FOREL", + "FORES", "FOREX", "FORKS", "FORKY", "FORME", "FORMS", "FORTS", "FORZA", "FORZE", "FOSSA", "FOSSE", "FOUAT", + "FOUDS", "FOUER", "FOUET", "FOULE", "FOULS", "FOUNT", "FOURS", "FOUTH", "FOVEA", "FOWLS", "FOWTH", "FOXED", + "FOXES", "FOXIE", "FOYLE", "FOYNE", "FRABS", "FRACK", "FRACT", "FRAGS", "FRAIM", "FRANC", "FRAPE", "FRAPS", + "FRASS", "FRATE", "FRATI", "FRATS", "FRAUS", "FRAYS", "FREES", "FREET", "FREIT", "FREMD", "FRENA", "FREON", + "FRERE", "FRETS", "FRIBS", "FRIER", "FRIES", "FRIGS", "FRISE", "FRIST", "FRITH", "FRITS", "FRITT", "FRIZE", + "FRIZZ", "FROES", "FROGS", "FRONS", "FRORE", "FRORN", "FRORY", "FROSH", "FROWS", "FROWY", "FRUGS", "FRUMP", + "FRUSH", "FRUST", "FRYER", "FUBAR", "FUBBY", "FUBSY", "FUCKS", "FUCUS", "FUDDY", "FUDGY", "FUELS", "FUERO", + "FUFFS", "FUFFY", "FUGAL", "FUGGY", "FUGIE", "FUGIO", "FUGLE", "FUGLY", "FUGUS", "FUJIS", "FULLS", "FUMED", + "FUMER", "FUMES", "FUMET", "FUNDI", "FUNDS", "FUNDY", "FUNGO", "FUNGS", "FUNKS", "FURAL", "FURAN", "FURCA", + "FURLS", "FUROL", "FURRS", "FURTH", "FURZE", "FURZY", "FUSED", "FUSEE", "FUSEL", "FUSES", "FUSIL", "FUSKS", + "FUSTS", "FUSTY", "FUTON", "FUZED", "FUZEE", "FUZES", "FUZIL", "FYCES", "FYKED", "FYKES", "FYLES", "FYRDS", + "FYTTE", "GABBA", "GABBY", "GABLE", "GADDI", "GADES", "GADGE", "GADID", "GADIS", "GADJE", "GADJO", "GADSO", + "GAFFS", "GAGED", "GAGER", "GAGES", "GAIDS", "GAINS", "GAIRS", "GAITA", "GAITS", "GAITT", "GAJOS", "GALAH", + "GALAS", "GALAX", "GALEA", "GALED", "GALES", "GALLS", "GALLY", "GALOP", "GALUT", "GALVO", "GAMAS", "GAMAY", + "GAMBA", "GAMBE", "GAMBO", "GAMBS", "GAMED", "GAMES", "GAMEY", "GAMIC", "GAMIN", "GAMME", "GAMMY", "GAMPS", + "GANCH", "GANDY", "GANEF", "GANEV", "GANGS", "GANJA", "GANOF", "GANTS", "GAOLS", "GAPED", "GAPER", "GAPES", + "GAPOS", "GAPPY", "GARBE", "GARBO", "GARBS", "GARDA", "GARES", "GARIS", "GARMS", "GARNI", "GARRE", "GARTH", + "GARUM", "GASES", "GASPS", "GASPY", "GASTS", "GATCH", "GATED", "GATER", "GATES", "GATHS", "GATOR", "GAUCH", + "GAUCY", "GAUDS", "GAUJE", "GAULT", "GAUMS", "GAUMY", "GAUPS", "GAURS", "GAUSS", "GAUZY", "GAVOT", "GAWCY", + "GAWDS", "GAWKS", "GAWPS", "GAWSY", "GAYAL", "GAZAL", "GAZAR", "GAZED", "GAZES", "GAZON", "GAZOO", "GEALS", + "GEANS", "GEARE", "GEARS", "GEATS", "GEBUR", "GECKS", "GEEKS", "GEEPS", "GEEST", "GEIST", "GEITS", "GELDS", + "GELEE", "GELID", "GELLY", "GELTS", "GEMEL", "GEMMA", "GEMMY", "GEMOT", "GENAL", "GENAS", "GENES", "GENET", + "GENIC", "GENII", "GENIP", "GENNY", "GENOA", "GENOM", "GENRO", "GENTS", "GENTY", "GENUA", "GENUS", "GEODE", + "GEOID", "GERAH", "GERBE", "GERES", "GERLE", "GERMS", "GERMY", "GERNE", "GESSE", "GESSO", "GESTE", "GESTS", + "GETAS", "GETUP", "GEUMS", "GEYAN", "GEYER", "GHAST", "GHATS", "GHAUT", "GHAZI", "GHEES", "GHEST", "GHYLL", + "GIBED", "GIBEL", "GIBER", "GIBES", "GIBLI", "GIBUS", "GIFTS", "GIGAS", "GIGHE", "GIGOT", "GIGUE", "GILAS", + "GILDS", "GILET", "GILLS", "GILLY", "GILPY", "GILTS", "GIMEL", "GIMME", "GIMPS", "GIMPY", "GINCH", "GINGE", + "GINGS", "GINKS", "GINNY", "GINZO", "GIPON", "GIPPO", "GIPPY", "GIRDS", "GIRLS", "GIRNS", "GIRON", "GIROS", + "GIRRS", "GIRSH", "GIRTS", "GISMO", "GISMS", "GISTS", "GITCH", "GITES", "GIUST", "GIVED", "GIVES", "GIZMO", + "GLACE", "GLADS", "GLADY", "GLAIK", "GLAIR", "GLAMS", "GLANS", "GLARY", "GLAUM", "GLAUR", "GLAZY", "GLEBA", + "GLEBE", "GLEBY", "GLEDE", "GLEDS", "GLEED", "GLEEK", "GLEES", "GLEET", "GLEIS", "GLENS", "GLENT", "GLEYS", + "GLIAL", "GLIAS", "GLIBS", "GLIFF", "GLIFT", "GLIKE", "GLIME", "GLIMS", "GLISK", "GLITS", "GLITZ", "GLOAM", + "GLOBI", "GLOBS", "GLOBY", "GLODE", "GLOGG", "GLOMS", "GLOOP", "GLOPS", "GLOST", "GLOUT", "GLOWS", "GLOZE", + "GLUED", "GLUER", "GLUES", "GLUEY", "GLUGS", "GLUME", "GLUMS", "GLUON", "GLUTE", "GLUTS", "GNARL", "GNARR", + "GNARS", "GNATS", "GNAWN", "GNAWS", "GNOWS", "GOADS", "GOAFS", "GOALS", "GOARY", "GOATS", "GOATY", "GOBAN", + "GOBAR", "GOBBI", "GOBBO", "GOBBY", "GOBIS", "GOBOS", "GODET", "GODSO", "GOELS", "GOERS", "GOEST", "GOETH", + "GOETY", "GOFER", "GOFFS", "GOGGA", "GOGOS", "GOIER", "GOJIS", "GOLDS", "GOLDY", "GOLES", "GOLFS", "GOLPE", + "GOLPS", "GOMBO", "GOMER", "GOMPA", "GONCH", "GONEF", "GONGS", "GONIA", "GONIF", "GONKS", "GONNA", "GONOF", + "GONYS", "GONZO", "GOOBY", "GOODS", "GOOFS", "GOOGS", "GOOKS", "GOOKY", "GOOLD", "GOOLS", "GOOLY", "GOONS", + "GOONY", "GOOPS", "GOOPY", "GOORS", "GOORY", "GOOSY", "GOPAK", "GOPIK", "GORAL", "GORAS", "GORED", "GORES", + "GORIS", "GORMS", "GORMY", "GORPS", "GORSE", "GORSY", "GOSHT", "GOSSE", "GOTCH", "GOTHS", "GOTHY", "GOTTA", + "GOUCH", "GOUKS", "GOURA", "GOUTS", "GOUTY", "GOWAN", "GOWDS", "GOWFS", "GOWKS", "GOWLS", "GOWNS", "GOXES", + "GOYIM", "GOYLE", "GRAAL", "GRABS", "GRADS", "GRAFF", "GRAIP", "GRAMA", "GRAME", "GRAMP", "GRAMS", "GRANA", + "GRANS", "GRAPY", "GRAVS", "GRAYS", "GREBE", "GREBO", "GRECE", "GREEK", "GREES", "GREGE", "GREGO", "GREIN", + "GRENS", "GRESE", "GREVE", "GREWS", "GREYS", "GRICE", "GRIDE", "GRIDS", "GRIFF", "GRIFT", "GRIGS", "GRIKE", + "GRINS", "GRIOT", "GRIPS", "GRIPT", "GRIPY", "GRISE", "GRIST", "GRISY", "GRITH", "GRITS", "GRIZE", "GROAT", + "GRODY", "GROGS", "GROKS", "GROMA", "GRONE", "GROOF", "GROSZ", "GROTS", "GROUF", "GROVY", "GROWS", "GRRLS", + "GRRRL", "GRUBS", "GRUED", "GRUES", "GRUFE", "GRUME", "GRUMP", "GRUND", "GRYCE", "GRYDE", "GRYKE", "GRYPE", + "GRYPT", "GUACO", "GUANA", "GUANO", "GUANS", "GUARS", "GUCKS", "GUCKY", "GUDES", "GUFFS", "GUGAS", "GUIDS", + "GUIMP", "GUIRO", "GULAG", "GULAR", "GULAS", "GULES", "GULET", "GULFS", "GULFY", "GULLS", "GULPH", "GULPS", + "GULPY", "GUMMA", "GUMMI", "GUMPS", "GUNDY", "GUNGE", "GUNGY", "GUNKS", "GUNKY", "GUNNY", "GUQIN", "GURDY", + "GURGE", "GURLS", "GURLY", "GURNS", "GURRY", "GURSH", "GURUS", "GUSHY", "GUSLA", "GUSLE", "GUSLI", "GUSSY", + "GUSTS", "GUTSY", "GUTTA", "GUTTY", "GUYED", "GUYLE", "GUYOT", "GUYSE", "GWINE", "GYALS", "GYANS", "GYBED", + "GYBES", "GYELD", "GYMPS", "GYNAE", "GYNIE", "GYNNY", "GYNOS", "GYOZA", "GYPOS", "GYPPO", "GYPPY", "GYRAL", + "GYRED", "GYRES", "GYRON", "GYROS", "GYRUS", "GYTES", "GYVED", "GYVES", "HAAFS", "HAARS", "HABLE", "HABUS", + "HACEK", "HACKS", "HADAL", "HADED", "HADES", "HADJI", "HADST", "HAEMS", "HAETS", "HAFFS", "HAFIZ", "HAFTS", + "HAGGS", "HAHAS", "HAICK", "HAIKA", "HAIKS", "HAIKU", "HAILS", "HAILY", "HAINS", "HAINT", "HAIRS", "HAITH", + "HAJES", "HAJIS", "HAJJI", "HAKAM", "HAKAS", "HAKEA", "HAKES", "HAKIM", "HAKUS", "HALAL", "HALED", "HALER", + "HALES", "HALFA", "HALFS", "HALID", "HALLO", "HALLS", "HALMA", "HALMS", "HALON", "HALOS", "HALSE", "HALTS", + "HALVA", "HALWA", "HAMAL", "HAMBA", "HAMED", "HAMES", "HAMMY", "HAMZA", "HANAP", "HANCE", "HANCH", "HANDS", + "HANGI", "HANGS", "HANKS", "HANKY", "HANSA", "HANSE", "HANTS", "HAOLE", "HAOMA", "HAPAX", "HAPLY", "HAPPI", + "HAPUS", "HARAM", "HARDS", "HARED", "HARES", "HARIM", "HARKS", "HARLS", "HARMS", "HARNS", "HAROS", "HARPS", + "HARTS", "HASHY", "HASKS", "HASPS", "HASTA", "HATED", "HATES", "HATHA", "HAUDS", "HAUFS", "HAUGH", "HAULD", + "HAULM", "HAULS", "HAULT", "HAUNS", "HAUSE", "HAVER", "HAVES", "HAWED", "HAWKS", "HAWMS", "HAWSE", "HAYED", + "HAYER", "HAYEY", "HAYLE", "HAZAN", "HAZED", "HAZER", "HAZES", "HEADS", "HEALD", "HEALS", "HEAME", "HEAPS", + "HEAPY", "HEARE", "HEARS", "HEAST", "HEATS", "HEBEN", "HEBES", "HECHT", "HECKS", "HEDER", "HEDGY", "HEEDS", + "HEEDY", "HEELS", "HEEZE", "HEFTE", "HEFTS", "HEIDS", "HEIGH", "HEILS", "HEIRS", "HEJAB", "HEJRA", "HELED", + "HELES", "HELIO", "HELLS", "HELMS", "HELOS", "HELOT", "HELPS", "HELVE", "HEMAL", "HEMES", "HEMIC", "HEMIN", + "HEMPS", "HEMPY", "HENCH", "HENDS", "HENGE", "HENNA", "HENNY", "HENRY", "HENTS", "HEPAR", "HERBS", "HERBY", + "HERDS", "HERES", "HERLS", "HERMA", "HERMS", "HERNS", "HEROS", "HERRY", "HERSE", "HERTZ", "HERYE", "HESPS", + "HESTS", "HETES", "HETHS", "HEUCH", "HEUGH", "HEVEA", "HEWED", "HEWER", "HEWGH", "HEXAD", "HEXED", "HEXER", + "HEXES", "HEXYL", "HEYED", "HIANT", "HICKS", "HIDED", "HIDER", "HIDES", "HIEMS", "HIGHS", "HIGHT", "HIJAB", + "HIJRA", "HIKED", "HIKER", "HIKES", "HIKOI", "HILAR", "HILCH", "HILLO", "HILLS", "HILTS", "HILUM", "HILUS", + "HIMBO", "HINAU", "HINDS", "HINGS", "HINKY", "HINNY", "HINTS", "HIOIS", "HIPLY", "HIRED", "HIREE", "HIRER", + "HIRES", "HISSY", "HISTS", "HITHE", "HIVED", "HIVER", "HIVES", "HIZEN", "HOAED", "HOAGY", "HOARS", "HOARY", + "HOAST", "HOBOS", "HOCKS", "HOCUS", "HODAD", "HODJA", "HOERS", "HOGAN", "HOGEN", "HOGGS", "HOGHS", "HOHED", + "HOICK", "HOIED", "HOIKS", "HOING", "HOISE", "HOKAS", "HOKED", "HOKES", "HOKEY", "HOKIS", "HOKKU", "HOKUM", + "HOLDS", "HOLED", "HOLES", "HOLEY", "HOLKS", "HOLLA", "HOLLO", "HOLME", "HOLMS", "HOLON", "HOLOS", "HOLTS", + "HOMAS", "HOMED", "HOMES", "HOMEY", "HOMIE", "HOMME", "HOMOS", "HONAN", "HONDA", "HONDS", "HONED", "HONER", + "HONES", "HONGI", "HONGS", "HONKS", "HONKY", "HOOCH", "HOODS", "HOODY", "HOOEY", "HOOFS", "HOOKA", "HOOKS", + "HOOKY", "HOOLY", "HOONS", "HOOPS", "HOORD", "HOORS", "HOOSH", "HOOTS", "HOOTY", "HOOVE", "HOPAK", "HOPED", + "HOPER", "HOPES", "HOPPY", "HORAH", "HORAL", "HORAS", "HORIS", "HORKS", "HORME", "HORNS", "HORST", "HORSY", + "HOSED", "HOSEL", "HOSEN", "HOSER", "HOSES", "HOSEY", "HOSTA", "HOSTS", "HOTCH", "HOTEN", "HOTTY", "HOUFF", + "HOUFS", "HOUGH", "HOURI", "HOURS", "HOUTS", "HOVEA", "HOVED", "HOVEN", "HOVES", "HOWBE", "HOWES", "HOWFF", + "HOWFS", "HOWKS", "HOWLS", "HOWRE", "HOWSO", "HOXED", "HOXES", "HOYAS", "HOYED", "HOYLE", "HUBBY", "HUCKS", + "HUDNA", "HUDUD", "HUERS", "HUFFS", "HUFFY", "HUGER", "HUGGY", "HUHUS", "HUIAS", "HULAS", "HULES", "HULKS", + "HULKY", "HULLO", "HULLS", "HULLY", "HUMAS", "HUMFS", "HUMIC", "HUMPS", "HUMPY", "HUNKS", "HUNTS", "HURDS", + "HURLS", "HURLY", "HURRA", "HURST", "HURTS", "HUSHY", "HUSKS", "HUSOS", "HUTIA", "HUZZA", "HUZZY", "HWYLS", + "HYDRA", "HYENS", "HYGGE", "HYING", "HYKES", "HYLAS", "HYLEG", "HYLES", "HYLIC", "HYMNS", "HYNDE", "HYOID", + "HYPED", "HYPES", "HYPHA", "HYPHY", "HYPOS", "HYRAX", "HYSON", "HYTHE", "IAMBI", "IAMBS", "IBRIK", "ICERS", + "ICHED", "ICHES", "ICHOR", "ICIER", "ICKER", "ICKLE", "ICONS", "ICTAL", "ICTIC", "ICTUS", "IDANT", "IDEAS", + "IDEES", "IDENT", "IDLED", "IDLES", "IDOLA", "IDOLS", "IDYLS", "IFTAR", "IGAPO", "IGGED", "IGLUS", "IHRAM", + "IKANS", "IKATS", "IKONS", "ILEAC", "ILEAL", "ILEUM", "ILEUS", "ILIAD", "ILIAL", "ILIUM", "ILLER", "ILLTH", + "IMAGO", "IMAMS", "IMARI", "IMAUM", "IMBAR", "IMBED", "IMIDE", "IMIDO", "IMIDS", "IMINE", "IMINO", "IMMEW", + "IMMIT", "IMMIX", "IMPED", "IMPIS", "IMPOT", "IMPRO", "IMSHI", "IMSHY", "INAPT", "INARM", "INBYE", "INCEL", + "INCLE", "INCOG", "INCUS", "INCUT", "INDEW", "INDIA", "INDIE", "INDOL", "INDOW", "INDRI", "INDUE", "INERM", + "INFIX", "INFOS", "INFRA", "INGAN", "INGLE", "INION", "INKED", "INKER", "INKLE", "INNED", "INNIT", "INORB", + "INRUN", "INSET", "INSPO", "INTEL", "INTIL", "INTIS", "INTRA", "INULA", "INURE", "INURN", "INUST", "INVAR", + "INWIT", "IODIC", "IODID", "IODIN", "IOTAS", "IPPON", "IRADE", "IRIDS", "IRING", "IRKED", "IROKO", "IRONE", + "IRONS", "ISBAS", "ISHES", "ISLED", "ISLES", "ISNAE", "ISSEI", "ISTLE", "ITEMS", "ITHER", "IVIED", "IVIES", + "IXIAS", "IXNAY", "IXORA", "IXTLE", "IZARD", "IZARS", "IZZAT", "JAAPS", "JABOT", "JACAL", "JACKS", "JACKY", + "JADED", "JADES", "JAFAS", "JAFFA", "JAGAS", "JAGER", "JAGGS", "JAGGY", "JAGIR", "JAGRA", "JAILS", "JAKER", + "JAKES", "JAKEY", "JALAP", "JALOP", "JAMBE", "JAMBO", "JAMBS", "JAMBU", "JAMES", "JAMMY", "JAMON", "JANES", + "JANNS", "JANNY", "JANTY", "JAPAN", "JAPED", "JAPER", "JAPES", "JARKS", "JARLS", "JARPS", "JARTA", "JARUL", + "JASEY", "JASPE", "JASPS", "JATOS", "JAUKS", "JAUPS", "JAVAS", "JAVEL", "JAWAN", "JAWED", "JAXIE", "JEANS", + "JEATS", "JEBEL", "JEDIS", "JEELS", "JEELY", "JEEPS", "JEERS", "JEEZE", "JEFES", "JEFFS", "JEHAD", "JEHUS", + "JELAB", "JELLO", "JELLS", "JEMBE", "JEMMY", "JENNY", "JEONS", "JERID", "JERKS", "JERRY", "JESSE", "JESTS", + "JESUS", "JETES", "JETON", "JEUNE", "JEWED", "JEWIE", "JHALA", "JIAOS", "JIBBA", "JIBBS", "JIBED", "JIBER", + "JIBES", "JIFFS", "JIGGY", "JIGOT", "JIHAD", "JILLS", "JILTS", "JIMMY", "JIMPY", "JINGO", "JINKS", "JINNE", + "JINNI", "JINNS", "JIRDS", "JIRGA", "JIRRE", "JISMS", "JIVED", "JIVER", "JIVES", "JIVEY", "JNANA", "JOBED", + "JOBES", "JOCKO", "JOCKS", "JOCKY", "JOCOS", "JODEL", "JOEYS", "JOHNS", "JOINS", "JOKED", "JOKES", "JOKEY", + "JOKOL", "JOLED", "JOLES", "JOLLS", "JOLTS", "JOLTY", "JOMON", "JOMOS", "JONES", "JONGS", "JONTY", "JOOKS", + "JORAM", "JORUM", "JOTAS", "JOTTY", "JOTUN", "JOUAL", "JOUGS", "JOUKS", "JOULE", "JOURS", "JOWAR", "JOWED", + "JOWLS", "JOWLY", "JOYED", "JUBAS", "JUBES", "JUCOS", "JUDAS", "JUDGY", "JUDOS", "JUGAL", "JUGUM", "JUJUS", + "JUKED", "JUKES", "JUKUS", "JULEP", "JUMAR", "JUMBY", "JUMPS", "JUNCO", "JUNKS", "JUNKY", "JUPES", "JUPON", + "JURAL", "JURAT", "JUREL", "JURES", "JUSTS", "JUTES", "JUTTY", "JUVES", "JUVIE", "KAAMA", "KABAB", "KABAR", + "KABOB", "KACHA", "KACKS", "KADAI", "KADES", "KADIS", "KAFIR", "KAGOS", "KAGUS", "KAHAL", "KAIAK", "KAIDS", + "KAIES", "KAIFS", "KAIKA", "KAIKS", "KAILS", "KAIMS", "KAING", "KAINS", "KAKAS", "KAKIS", "KALAM", "KALES", + "KALIF", "KALIS", "KALPA", "KAMAS", "KAMES", "KAMIK", "KAMIS", "KAMME", "KANAE", "KANAS", "KANDY", "KANEH", + "KANES", "KANGA", "KANGS", "KANJI", "KANTS", "KANZU", "KAONS", "KAPAS", "KAPHS", "KAPOK", "KAPOW", "KAPUS", + "KAPUT", "KARAS", "KARAT", "KARKS", "KARNS", "KAROO", "KAROS", "KARRI", "KARST", "KARSY", "KARTS", "KARZY", + "KASHA", "KASME", "KATAL", "KATAS", "KATIS", "KATTI", "KAUGH", "KAURI", "KAURU", "KAURY", "KAVAL", "KAVAS", + "KAWAS", "KAWAU", "KAWED", "KAYLE", "KAYOS", "KAZIS", "KAZOO", "KBARS", "KEBAR", "KEBOB", "KECKS", "KEDGE", + "KEDGY", "KEECH", "KEEFS", "KEEKS", "KEELS", "KEEMA", "KEENO", "KEENS", "KEEPS", "KEETS", "KEEVE", "KEFIR", + "KEHUA", "KEIRS", "KELEP", "KELIM", "KELLS", "KELLY", "KELPS", "KELPY", "KELTS", "KELTY", "KEMBO", "KEMBS", + "KEMPS", "KEMPT", "KEMPY", "KENAF", "KENCH", "KENDO", "KENOS", "KENTE", "KENTS", "KEPIS", "KERBS", "KEREL", + "KERFS", "KERKY", "KERMA", "KERNE", "KERNS", "KEROS", "KERRY", "KERVE", "KESAR", "KESTS", "KETAS", "KETCH", + "KETES", "KETOL", "KEVEL", "KEVIL", "KEXES", "KEYED", "KEYER", "KHADI", "KHAFS", "KHANS", "KHAPH", "KHATS", + "KHAYA", "KHAZI", "KHEDA", "KHETH", "KHETS", "KHOJA", "KHORS", "KHOUM", "KHUDS", "KIAAT", "KIACK", "KIANG", + "KIBBE", "KIBBI", "KIBEI", "KIBES", "KIBLA", "KICKS", "KICKY", "KIDDO", "KIDDY", "KIDEL", "KIDGE", "KIEFS", + "KIERS", "KIEVE", "KIEVS", "KIGHT", "KIKES", "KIKOI", "KILEY", "KILIM", "KILLS", "KILNS", "KILOS", "KILPS", + "KILTS", "KILTY", "KIMBO", "KINAS", "KINDA", "KINDS", "KINDY", "KINES", "KINGS", "KININ", "KINKS", "KINOS", + "KIORE", "KIPES", "KIPPA", "KIPPS", "KIRBY", "KIRKS", "KIRNS", "KIRRI", "KISAN", "KISSY", "KISTS", "KITED", + "KITER", "KITES", "KITHE", "KITHS", "KITUL", "KIVAS", "KIWIS", "KLANG", "KLAPS", "KLETT", "KLICK", "KLIEG", + "KLIKS", "KLONG", "KLOOF", "KLUGE", "KLUTZ", "KNAGS", "KNAPS", "KNARL", "KNARS", "KNAUR", "KNAWE", "KNEES", + "KNELL", "KNISH", "KNITS", "KNIVE", "KNOBS", "KNOPS", "KNOSP", "KNOTS", "KNOUT", "KNOWE", "KNOWS", "KNUBS", + "KNURL", "KNURR", "KNURS", "KNUTS", "KOANS", "KOAPS", "KOBAN", "KOBOS", "KOELS", "KOFFS", "KOFTA", "KOGAL", + "KOHAS", "KOHEN", "KOHLS", "KOINE", "KOJIS", "KOKAM", "KOKAS", "KOKER", "KOKRA", "KOKUM", "KOLAS", "KOLOS", + "KOMBU", "KONBU", "KONDO", "KONKS", "KOOKS", "KOOKY", "KOORI", "KOPEK", "KOPHS", "KOPJE", "KOPPA", "KORAI", + "KORAN", "KORAS", "KORAT", "KORES", "KORMA", "KOROS", "KORUN", "KORUS", "KOSES", "KOTCH", "KOTOS", "KOTOW", + "KOURA", "KRAAL", "KRABS", "KRAFT", "KRAIS", "KRAIT", "KRANG", "KRANS", "KRANZ", "KRAUT", "KRAYS", "KREEP", + "KRENG", "KREWE", "KRONA", "KRONE", "KROON", "KRUBI", "KRUNK", "KSARS", "KUBIE", "KUDOS", "KUDUS", "KUDZU", + "KUFIS", "KUGEL", "KUIAS", "KUKRI", "KUKUS", "KULAK", "KULAN", "KULAS", "KULFI", "KUMIS", "KUMYS", "KURIS", + "KURRE", "KURTA", "KURUS", "KUSSO", "KUTAS", "KUTCH", "KUTIS", "KUTUS", "KUZUS", "KVASS", "KVELL", "KWELA", + "KYACK", "KYAKS", "KYANG", "KYARS", "KYATS", "KYBOS", "KYDST", "KYLES", "KYLIE", "KYLIN", "KYLIX", "KYLOE", + "KYNDE", "KYNDS", "KYPES", "KYRIE", "KYTES", "KYTHE", "LAARI", "LABDA", "LABIA", "LABIS", "LABRA", "LACED", + "LACER", "LACES", "LACET", "LACEY", "LACKS", "LADDY", "LADED", "LADER", "LADES", "LAERS", "LAEVO", "LAGAN", + "LAHAL", "LAHAR", "LAICH", "LAICS", "LAIDS", "LAIGH", "LAIKA", "LAIKS", "LAIRD", "LAIRS", "LAIRY", "LAITH", + "LAITY", "LAKED", "LAKER", "LAKES", "LAKHS", "LAKIN", "LAKSA", "LALDY", "LALLS", "LAMAS", "LAMBS", "LAMBY", + "LAMED", "LAMER", "LAMES", "LAMIA", "LAMMY", "LAMPS", "LANAI", "LANAS", "LANCH", "LANDE", "LANDS", "LANES", + "LANKS", "LANTS", "LAPIN", "LAPIS", "LAPJE", "LARCH", "LARDS", "LARDY", "LAREE", "LARES", "LARGO", "LARIS", + "LARKS", "LARKY", "LARNS", "LARNT", "LARUM", "LASED", "LASER", "LASES", "LASSI", "LASSU", "LASSY", "LASTS", + "LATAH", "LATED", "LATEN", "LATEX", "LATHI", "LATHS", "LATHY", "LATKE", "LATUS", "LAUAN", "LAUCH", "LAUDS", + "LAUFS", "LAUND", "LAURA", "LAVAL", "LAVAS", "LAVED", "LAVER", "LAVES", "LAVRA", "LAVVY", "LAWED", "LAWER", + "LAWIN", "LAWKS", "LAWNS", "LAWNY", "LAXED", "LAXER", "LAXES", "LAXLY", "LAYED", "LAYIN", "LAYUP", "LAZAR", + "LAZED", "LAZES", "LAZOS", "LAZZI", "LAZZO", "LEADS", "LEADY", "LEAFS", "LEAKS", "LEAMS", "LEANS", "LEANY", + "LEAPS", "LEARE", "LEARS", "LEARY", "LEATS", "LEAVY", "LEAZE", "LEBEN", "LECCY", "LEDES", "LEDGY", "LEDUM", + "LEEAR", "LEEKS", "LEEPS", "LEERS", "LEESE", "LEETS", "LEEZE", "LEFTE", "LEFTS", "LEGER", "LEGES", "LEGGE", + "LEGGO", "LEGIT", "LEHRS", "LEHUA", "LEIRS", "LEISH", "LEMAN", "LEMED", "LEMEL", "LEMES", "LEMMA", "LEMME", + "LENDS", "LENES", "LENGS", "LENIS", "LENOS", "LENSE", "LENTI", "LENTO", "LEONE", "LEPID", "LEPRA", "LEPTA", + "LERED", "LERES", "LERPS", "LESBO", "LESES", "LESTS", "LETCH", "LETHE", "LETUP", "LEUCH", "LEUCO", "LEUDS", + "LEUGH", "LEVAS", "LEVEE", "LEVES", "LEVIN", "LEVIS", "LEWIS", "LEXES", "LEXIS", "LEZES", "LEZZA", "LEZZY", + "LIANA", "LIANE", "LIANG", "LIARD", "LIARS", "LIART", "LIBER", "LIBRA", "LIBRI", "LICHI", "LICHT", "LICIT", + "LICKS", "LIDAR", "LIDOS", "LIEFS", "LIENS", "LIERS", "LIEUS", "LIEVE", "LIFER", "LIFES", "LIFTS", "LIGAN", + "LIGER", "LIGGE", "LIGNE", "LIKED", "LIKER", "LIKES", "LIKIN", "LILLS", "LILOS", "LILTS", "LIMAN", "LIMAS", + "LIMAX", "LIMBA", "LIMBI", "LIMBS", "LIMBY", "LIMED", "LIMEN", "LIMES", "LIMEY", "LIMMA", "LIMNS", "LIMOS", + "LIMPA", "LIMPS", "LINAC", "LINCH", "LINDS", "LINDY", "LINED", "LINES", "LINEY", "LINGA", "LINGS", "LINGY", + "LININ", "LINKS", "LINKY", "LINNS", "LINNY", "LINOS", "LINTS", "LINTY", "LINUM", "LINUX", "LIONS", "LIPAS", + "LIPES", "LIPIN", "LIPOS", "LIPPY", "LIRAS", "LIRKS", "LIROT", "LISKS", "LISLE", "LISPS", "LISTS", "LITAI", + "LITAS", "LITED", "LITER", "LITES", "LITHO", "LITHS", "LITRE", "LIVED", "LIVEN", "LIVES", "LIVOR", "LIVRE", + "LLANO", "LOACH", "LOADS", "LOAFS", "LOAMS", "LOANS", "LOAST", "LOAVE", "LOBAR", "LOBED", "LOBES", "LOBOS", + "LOBUS", "LOCHE", "LOCHS", "LOCIE", "LOCIS", "LOCKS", "LOCOS", "LOCUM", "LODEN", "LODES", "LOESS", "LOFTS", + "LOGAN", "LOGES", "LOGGY", "LOGIA", "LOGIE", "LOGOI", "LOGON", "LOGOS", "LOHAN", "LOIDS", "LOINS", "LOIPE", + "LOIRS", "LOKES", "LOLLS", "LOLLY", "LOLOG", "LOMAS", "LOMED", "LOMES", "LONER", "LONGA", "LONGE", "LONGS", + "LOOBY", "LOOED", "LOOEY", "LOOFA", "LOOFS", "LOOIE", "LOOKS", "LOOKY", "LOOMS", "LOONS", "LOONY", "LOOPS", + "LOORD", "LOOTS", "LOPED", "LOPER", "LOPES", "LOPPY", "LORAL", "LORAN", "LORDS", "LORDY", "LOREL", "LORES", + "LORIC", "LORIS", "LOSED", "LOSEL", "LOSEN", "LOSES", "LOSSY", "LOTAH", "LOTAS", "LOTES", "LOTIC", "LOTOS", + "LOTSA", "LOTTA", "LOTTE", "LOTTO", "LOTUS", "LOUED", "LOUGH", "LOUIE", "LOUIS", "LOUMA", "LOUND", "LOUNS", + "LOUPE", "LOUPS", "LOURE", "LOURS", "LOURY", "LOUTS", "LOVAT", "LOVED", "LOVES", "LOVEY", "LOVIE", "LOWAN", + "LOWED", "LOWES", "LOWND", "LOWNE", "LOWNS", "LOWPS", "LOWRY", "LOWSE", "LOWTS", "LOXED", "LOXES", "LOZEN", + "LUACH", "LUAUS", "LUBED", "LUBES", "LUBRA", "LUCES", "LUCKS", "LUCRE", "LUDES", "LUDIC", "LUDOS", "LUFFA", + "LUFFS", "LUGED", "LUGER", "LUGES", "LULLS", "LULUS", "LUMAS", "LUMBI", "LUMME", "LUMMY", "LUMPS", "LUNAS", + "LUNES", "LUNET", "LUNGI", "LUNGS", "LUNKS", "LUNTS", "LUPIN", "LURED", "LURER", "LURES", "LUREX", "LURGI", + "LURGY", "LURKS", "LURRY", "LURVE", "LUSER", "LUSHY", "LUSKS", "LUSTS", "LUSUS", "LUTEA", "LUTED", "LUTER", + "LUTES", "LUVVY", "LUXED", "LUXER", "LUXES", "LWEIS", "LYAMS", "LYARD", "LYART", "LYASE", "LYCEA", "LYCEE", + "LYCRA", "LYMES", "LYNCH", "LYNES", "LYRES", "LYSED", "LYSES", "LYSIN", "LYSIS", "LYSOL", "LYSSA", "LYTED", + "LYTES", "LYTHE", "LYTIC", "LYTTA", "MAAED", "MAARE", "MAARS", "MABES", "MACAS", "MACED", "MACER", "MACES", + "MACHE", "MACHI", "MACHS", "MACKS", "MACLE", "MACON", "MADGE", "MADID", "MADRE", "MAERL", "MAFIC", "MAGES", + "MAGGS", "MAGOT", "MAGUS", "MAHOE", "MAHUA", "MAHWA", "MAIDS", "MAIKO", "MAIKS", "MAILE", "MAILL", "MAILS", + "MAIMS", "MAINS", "MAIRE", "MAIRS", "MAISE", "MAIST", "MAKAR", "MAKES", "MAKIS", "MAKOS", "MALAM", "MALAR", + "MALAS", "MALAX", "MALES", "MALIC", "MALIK", "MALIS", "MALLS", "MALMS", "MALMY", "MALTS", "MALTY", "MALUS", + "MALVA", "MALWA", "MAMAS", "MAMBA", "MAMEE", "MAMEY", "MAMIE", "MANAS", "MANAT", "MANDI", "MANEB", "MANED", + "MANEH", "MANES", "MANET", "MANGS", "MANIS", "MANKY", "MANNA", "MANOS", "MANSE", "MANTA", "MANTO", "MANTY", + "MANUL", "MANUS", "MAPAU", "MAQUI", "MARAE", "MARAH", "MARAS", "MARCS", "MARDY", "MARES", "MARGE", "MARGS", + "MARIA", "MARID", "MARKA", "MARKS", "MARLE", "MARLS", "MARLY", "MARMS", "MARON", "MAROR", "MARRA", "MARRI", + "MARSE", "MARTS", "MARVY", "MASAS", "MASED", "MASER", "MASES", "MASHY", "MASKS", "MASSA", "MASSY", "MASTS", + "MASTY", "MASUS", "MATAI", "MATED", "MATER", "MATES", "MATHS", "MATIN", "MATLO", "MATTE", "MATTS", "MATZA", + "MATZO", "MAUBY", "MAUDS", "MAULS", "MAUND", "MAURI", "MAUSY", "MAUTS", "MAUZY", "MAVEN", "MAVIE", "MAVIN", + "MAVIS", "MAWED", "MAWKS", "MAWKY", "MAWNS", "MAWRS", "MAXED", "MAXES", "MAXIS", "MAYAN", "MAYAS", "MAYED", + "MAYOS", "MAYST", "MAZED", "MAZER", "MAZES", "MAZEY", "MAZUT", "MBIRA", "MEADS", "MEALS", "MEANE", "MEANS", + "MEANY", "MEARE", "MEASE", "MEATH", "MEATS", "MEBOS", "MECHS", "MECKS", "MEDII", "MEDLE", "MEEDS", "MEERS", + "MEETS", "MEFFS", "MEINS", "MEINT", "MEINY", "MEITH", "MEKKA", "MELAS", "MELBA", "MELDS", "MELIC", "MELIK", + "MELLS", "MELTS", "MELTY", "MEMES", "MEMOS", "MENAD", "MENDS", "MENED", "MENES", "MENGE", "MENGS", "MENSA", + "MENSE", "MENSH", "MENTA", "MENTO", "MENUS", "MEOUS", "MEOWS", "MERCH", "MERCS", "MERDE", "MERED", "MEREL", + "MERER", "MERES", "MERIL", "MERIS", "MERKS", "MERLE", "MERLS", "MERSE", "MESAL", "MESAS", "MESEL", "MESES", + "MESHY", "MESIC", "MESNE", "MESON", "MESSY", "MESTO", "METED", "METES", "METHO", "METHS", "METIC", "METIF", + "METIS", "METOL", "METRE", "MEUSE", "MEVED", "MEVES", "MEWED", "MEWLS", "MEYNT", "MEZES", "MEZZE", "MEZZO", + "MHORR", "MIAOU", "MIAOW", "MIASM", "MIAUL", "MICAS", "MICHE", "MICHT", "MICKS", "MICKY", "MICOS", "MICRA", + "MIDDY", "MIDGY", "MIDIS", "MIENS", "MIEVE", "MIFFS", "MIFFY", "MIFTY", "MIGGS", "MIHAS", "MIHIS", "MIKED", + "MIKES", "MIKRA", "MIKVA", "MILCH", "MILDS", "MILER", "MILES", "MILFS", "MILIA", "MILKO", "MILKS", "MILLE", + "MILLS", "MILOR", "MILOS", "MILPA", "MILTS", "MILTY", "MILTZ", "MIMED", "MIMEO", "MIMER", "MIMES", "MIMSY", + "MINAE", "MINAR", "MINAS", "MINCY", "MINDS", "MINED", "MINES", "MINGE", "MINGS", "MINGY", "MINIS", "MINKE", + "MINKS", "MINNY", "MINOS", "MINTS", "MIRED", "MIRES", "MIREX", "MIRID", "MIRIN", "MIRKS", "MIRKY", "MIRLY", + "MIROS", "MIRVS", "MIRZA", "MISCH", "MISDO", "MISES", "MISGO", "MISOS", "MISSA", "MISTS", "MISTY", "MITCH", + "MITER", "MITES", "MITIS", "MITRE", "MITTS", "MIXED", "MIXEN", "MIXER", "MIXES", "MIXTE", "MIXUP", "MIZEN", + "MIZZY", "MNEME", "MOANS", "MOATS", "MOBBY", "MOBES", "MOBEY", "MOBIE", "MOBLE", "MOCHI", "MOCHS", "MOCHY", + "MOCKS", "MODER", "MODES", "MODGE", "MODII", "MODUS", "MOERS", "MOFOS", "MOGGY", "MOHEL", "MOHOS", "MOHRS", + "MOHUA", "MOHUR", "MOILE", "MOILS", "MOIRA", "MOIRE", "MOITS", "MOJOS", "MOKES", "MOKIS", "MOKOS", "MOLAL", + "MOLAS", "MOLDS", "MOLED", "MOLES", "MOLLA", "MOLLS", "MOLLY", "MOLTO", "MOLTS", "MOLYS", "MOMES", "MOMMA", + "MOMMY", "MOMUS", "MONAD", "MONAL", "MONAS", "MONDE", "MONDO", "MONER", "MONGO", "MONGS", "MONIC", "MONIE", + "MONKS", "MONOS", "MONTE", "MONTY", "MOOBS", "MOOCH", "MOODS", "MOOED", "MOOKS", "MOOLA", "MOOLI", "MOOLS", + "MOOLY", "MOONG", "MOONS", "MOONY", "MOOPS", "MOORS", "MOORY", "MOOTS", "MOOVE", "MOPED", "MOPER", "MOPES", + "MOPEY", "MOPPY", "MOPSY", "MOPUS", "MORAE", "MORAS", "MORAT", "MORAY", "MOREL", "MORES", "MORIA", "MORNE", + "MORNS", "MORRA", "MORRO", "MORSE", "MORTS", "MOSED", "MOSES", "MOSEY", "MOSKS", "MOSSO", "MOSTE", "MOSTS", + "MOTED", "MOTEN", "MOTES", "MOTET", "MOTEY", "MOTHS", "MOTHY", "MOTIS", "MOTTE", "MOTTS", "MOTTY", "MOTUS", + "MOTZA", "MOUCH", "MOUES", "MOULD", "MOULS", "MOUPS", "MOUST", "MOUSY", "MOVED", "MOVES", "MOWAS", "MOWED", + "MOWRA", "MOXAS", "MOXIE", "MOYAS", "MOYLE", "MOYLS", "MOZED", "MOZES", "MOZOS", "MPRET", "MUCHO", "MUCIC", + "MUCID", "MUCIN", "MUCKS", "MUCOR", "MUCRO", "MUDGE", "MUDIR", "MUDRA", "MUFFS", "MUFTI", "MUGGA", "MUGGS", + "MUGGY", "MUHLY", "MUIDS", "MUILS", "MUIRS", "MUIST", "MUJIK", "MULCT", "MULED", "MULES", "MULEY", "MULGA", + "MULIE", "MULLA", "MULLS", "MULSE", "MULSH", "MUMMS", "MUMPS", "MUMSY", "MUMUS", "MUNGA", "MUNGE", "MUNGO", + "MUNGS", "MUNIS", "MUNTS", "MUNTU", "MUONS", "MURAS", "MURED", "MURES", "MUREX", "MURID", "MURKS", "MURLS", + "MURLY", "MURRA", "MURRE", "MURRI", "MURRS", "MURRY", "MURTI", "MURVA", "MUSAR", "MUSCA", "MUSED", "MUSER", + "MUSES", "MUSET", "MUSHA", "MUSIT", "MUSKS", "MUSOS", "MUSSE", "MUSSY", "MUSTH", "MUSTS", "MUTCH", "MUTED", + "MUTER", "MUTES", "MUTHA", "MUTIS", "MUTON", "MUTTS", "MUXED", "MUXES", "MUZAK", "MUZZY", "MVULE", "MYALL", + "MYLAR", "MYNAH", "MYNAS", "MYOID", "MYOMA", "MYOPE", "MYOPS", "MYOPY", "MYSID", "MYTHI", "MYTHS", "MYTHY", + "MYXOS", "MZEES", "NAAMS", "NAANS", "NABES", "NABIS", "NABKS", "NABLA", "NABOB", "NACHE", "NACHO", "NACRE", + "NADAS", "NAEVE", "NAEVI", "NAFFS", "NAGAS", "NAGGY", "NAGOR", "NAHAL", "NAIAD", "NAIFS", "NAIKS", "NAILS", + "NAIRA", "NAIRU", "NAKED", "NAKER", "NAKFA", "NALAS", "NALED", "NALLA", "NAMED", "NAMER", "NAMES", "NAMMA", + "NAMUS", "NANAS", "NANCE", "NANCY", "NANDU", "NANNA", "NANOS", "NANUA", "NAPAS", "NAPED", "NAPES", "NAPOO", + "NAPPA", "NAPPE", "NAPPY", "NARAS", "NARCO", "NARCS", "NARDS", "NARES", "NARIC", "NARIS", "NARKS", "NARKY", + "NARRE", "NASHI", "NATCH", "NATES", "NATIS", "NATTY", "NAUCH", "NAUNT", "NAVAR", "NAVES", "NAVEW", "NAVVY", + "NAWAB", "NAZES", "NAZIR", "NAZIS", "NDUJA", "NEAFE", "NEALS", "NEAPS", "NEARS", "NEATH", "NEATS", "NEBEK", + "NEBEL", "NECKS", "NEDDY", "NEEDS", "NEELD", "NEELE", "NEEMB", "NEEMS", "NEEPS", "NEESE", "NEEZE", "NEGRO", + "NEGUS", "NEIFS", "NEIST", "NEIVE", "NELIS", "NELLY", "NEMAS", "NEMNS", "NEMPT", "NENES", "NEONS", "NEPER", + "NEPIT", "NERAL", "NERDS", "NERKA", "NERKS", "NEROL", "NERTS", "NERTZ", "NERVY", "NESTS", "NETES", "NETOP", + "NETTS", "NETTY", "NEUKS", "NEUME", "NEUMS", "NEVEL", "NEVES", "NEVUS", "NEWBS", "NEWED", "NEWEL", "NEWIE", + "NEWSY", "NEWTS", "NEXTS", "NEXUS", "NGAIO", "NGANA", "NGATI", "NGOMA", "NGWEE", "NICAD", "NICHT", "NICKS", + "NICOL", "NIDAL", "NIDED", "NIDES", "NIDOR", "NIDUS", "NIEFS", "NIEVE", "NIFES", "NIFFS", "NIFFY", "NIFTY", + "NIGER", "NIGHS", "NIHIL", "NIKAB", "NIKAH", "NIKAU", "NILLS", "NIMBI", "NIMBS", "NIMPS", "NINER", "NINES", + "NINON", "NIPAS", "NIPPY", "NIQAB", "NIRLS", "NIRLY", "NISEI", "NISSE", "NISUS", "NITER", "NITES", "NITID", + "NITON", "NITRE", "NITRO", "NITRY", "NITTY", "NIVAL", "NIXED", "NIXER", "NIXES", "NIXIE", "NIZAM", "NKOSI", + "NOAHS", "NOBBY", "NOCKS", "NODAL", "NODDY", "NODES", "NODUS", "NOELS", "NOGGS", "NOHOW", "NOILS", "NOILY", + "NOINT", "NOIRS", "NOLES", "NOLLS", "NOLOS", "NOMAS", "NOMEN", "NOMES", "NOMIC", "NOMOI", "NOMOS", "NONAS", + "NONCE", "NONES", "NONET", "NONGS", "NONIS", "NONNY", "NONYL", "NOOBS", "NOOIT", "NOOKS", "NOOKY", "NOONS", + "NOOPS", "NOPAL", "NORIA", "NORIS", "NORKS", "NORMA", "NORMS", "NOSED", "NOSER", "NOSES", "NOTAL", "NOTED", + "NOTER", "NOTES", "NOTUM", "NOULD", "NOULE", "NOULS", "NOUNS", "NOUNY", "NOUPS", "NOVAE", "NOVAS", "NOVUM", + "NOWAY", "NOWED", "NOWLS", "NOWTS", "NOWTY", "NOXAL", "NOXES", "NOYAU", "NOYED", "NOYES", "NUBBY", "NUBIA", + "NUCHA", "NUDDY", "NUDER", "NUDES", "NUDIE", "NUDZH", "NUFFS", "NUGAE", "NUKED", "NUKES", "NULLA", "NULLS", + "NUMBS", "NUMEN", "NUMMY", "NUNNY", "NURDS", "NURDY", "NURLS", "NURRS", "NUTSO", "NUTSY", "NYAFF", "NYALA", + "NYING", "NYSSA", "OAKED", "OAKER", "OAKUM", "OARED", "OASES", "OASIS", "OASTS", "OATEN", "OATER", "OATHS", + "OAVES", "OBANG", "OBEAH", "OBELI", "OBEYS", "OBIAS", "OBIED", "OBIIT", "OBITS", "OBJET", "OBOES", "OBOLE", + "OBOLI", "OBOLS", "OCCAM", "OCHER", "OCHES", "OCHRE", "OCHRY", "OCKER", "OCREA", "OCTAD", "OCTAN", "OCTAS", + "OCTYL", "OCULI", "ODAHS", "ODALS", "ODEON", "ODEUM", "ODISM", "ODIST", "ODIUM", "ODORS", "ODOUR", "ODYLE", + "ODYLS", "OFAYS", "OFFED", "OFFIE", "OFLAG", "OFTER", "OGAMS", "OGEED", "OGEES", "OGGIN", "OGHAM", "OGIVE", + "OGLED", "OGLER", "OGLES", "OGMIC", "OGRES", "OHIAS", "OHING", "OHMIC", "OHONE", "OIDIA", "OILED", "OILER", + "OINKS", "OINTS", "OJIME", "OKAPI", "OKAYS", "OKEHS", "OKRAS", "OKTAS", "OLDIE", "OLEIC", "OLEIN", "OLENT", + "OLEOS", "OLEUM", "OLIOS", "OLLAS", "OLLAV", "OLLER", "OLLIE", "OLOGY", "OLPAE", "OLPES", "OMASA", "OMBER", + "OMBUS", "OMENS", "OMERS", "OMITS", "OMLAH", "OMOVS", "OMRAH", "ONCER", "ONCES", "ONCET", "ONCUS", "ONELY", + "ONERS", "ONERY", "ONIUM", "ONKUS", "ONLAY", "ONNED", "ONTIC", "OOBIT", "OOHED", "OOMPH", "OONTS", "OOPED", + "OORIE", "OOSES", "OOTID", "OOZED", "OOZES", "OPAHS", "OPALS", "OPENS", "OPEPE", "OPING", "OPPOS", "OPSIN", + "OPTED", "OPTER", "ORACH", "ORACY", "ORALS", "ORANG", "ORANT", "ORATE", "ORBED", "ORCAS", "ORCIN", "ORDOS", + "OREAD", "ORFES", "ORGIA", "ORGIC", "ORGUE", "ORIBI", "ORIEL", "ORIXA", "ORLES", "ORLON", "ORLOP", "ORMER", + "ORNIS", "ORPIN", "ORRIS", "ORTHO", "ORVAL", "ORZOS", "OSCAR", "OSHAC", "OSIER", "OSMIC", "OSMOL", "OSSIA", + "OSTIA", "OTAKU", "OTARY", "OTTAR", "OTTOS", "OUBIT", "OUCHT", "OUENS", "OUIJA", "OULKS", "OUMAS", "OUNDY", + "OUPAS", "OUPED", "OUPHE", "OUPHS", "OURIE", "OUSEL", "OUSTS", "OUTBY", "OUTED", "OUTRE", "OUTRO", "OUTTA", + "OUZEL", "OUZOS", "OVALS", "OVELS", "OVENS", "OVERS", "OVIST", "OVOLI", "OVOLO", "OVULE", "OWCHE", "OWIES", + "OWLED", "OWLER", "OWLET", "OWNED", "OWRES", "OWRIE", "OWSEN", "OXBOW", "OXERS", "OXEYE", "OXIDS", "OXIES", + "OXIME", "OXIMS", "OXLIP", "OXTER", "OYERS", "OZEKI", "OZZIE", "PAALS", "PAANS", "PACAS", "PACED", "PACER", + "PACES", "PACEY", "PACHA", "PACKS", "PACOS", "PACTA", "PACTS", "PADIS", "PADLE", "PADMA", "PADRE", "PADRI", + "PAEAN", "PAEDO", "PAEON", "PAGED", "PAGER", "PAGES", "PAGLE", "PAGOD", "PAGRI", "PAIKS", "PAILS", "PAINS", + "PAIRE", "PAIRS", "PAISA", "PAISE", "PAKKA", "PALAS", "PALAY", "PALEA", "PALED", "PALES", "PALET", "PALIS", + "PALKI", "PALLA", "PALLS", "PALLY", "PALMS", "PALMY", "PALPI", "PALPS", "PALSA", "PAMPA", "PANAX", "PANCE", + "PANDA", "PANDS", "PANDY", "PANED", "PANES", "PANGA", "PANGS", "PANIM", "PANKO", "PANNE", "PANNI", "PANTO", + "PANTS", "PANTY", "PAOLI", "PAOLO", "PAPAS", "PAPAW", "PAPES", "PAPPI", "PAPPY", "PARAE", "PARAS", "PARCH", + "PARDI", "PARDS", "PARDY", "PARED", "PAREN", "PAREO", "PARES", "PAREU", "PAREV", "PARGE", "PARGO", "PARIS", + "PARKI", "PARKS", "PARKY", "PARLE", "PARLY", "PARMA", "PAROL", "PARPS", "PARRA", "PARRS", "PARTI", "PARTS", + "PARVE", "PARVO", "PASEO", "PASES", "PASHA", "PASHM", "PASKA", "PASPY", "PASSE", "PASTS", "PATED", "PATEN", + "PATER", "PATES", "PATHS", "PATIN", "PATKA", "PATLY", "PATTE", "PATUS", "PAUAS", "PAULS", "PAVAN", "PAVED", + "PAVEN", "PAVER", "PAVES", "PAVID", "PAVIN", "PAVIS", "PAWAS", "PAWAW", "PAWED", "PAWER", "PAWKS", "PAWKY", + "PAWLS", "PAWNS", "PAXES", "PAYED", "PAYOR", "PAYSD", "PEAGE", "PEAGS", "PEAKS", "PEAKY", "PEALS", "PEANS", + "PEARE", "PEARS", "PEART", "PEASE", "PEATS", "PEATY", "PEAVY", "PEAZE", "PEBAS", "PECHS", "PECKE", "PECKS", + "PECKY", "PEDES", "PEDIS", "PEDRO", "PEECE", "PEEKS", "PEELS", "PEENS", "PEEOY", "PEEPE", "PEEPS", "PEERS", + "PEERY", "PEEVE", "PEGGY", "PEGHS", "PEINS", "PEISE", "PEIZE", "PEKAN", "PEKES", "PEKIN", "PEKOE", "PELAS", + "PELAU", "PELES", "PELFS", "PELLS", "PELMA", "PELON", "PELTA", "PELTS", "PENDS", "PENDU", "PENED", "PENES", + "PENGO", "PENIE", "PENIS", "PENKS", "PENNA", "PENNI", "PENTS", "PEONS", "PEONY", "PEPLA", "PEPOS", "PEPPY", + "PEPSI", "PERAI", "PERCE", "PERCS", "PERDU", "PERDY", "PEREA", "PERES", "PERIS", "PERKS", "PERMS", "PERNS", + "PEROG", "PERPS", "PERRY", "PERSE", "PERST", "PERTS", "PERVE", "PERVO", "PERVS", "PERVY", "PESOS", "PESTS", + "PESTY", "PETAR", "PETER", "PETIT", "PETRE", "PETRI", "PETTI", "PETTO", "PEWEE", "PEWIT", "PEYSE", "PHAGE", + "PHANG", "PHARE", "PHARM", "PHEER", "PHENE", "PHEON", "PHESE", "PHIAL", "PHISH", "PHIZZ", "PHLOX", "PHOCA", + "PHONO", "PHONS", "PHOTS", "PHPHT", "PHUTS", "PHYLA", "PHYLE", "PIANI", "PIANS", "PIBAL", "PICAL", "PICAS", + "PICCY", "PICKS", "PICOT", "PICRA", "PICUL", "PIEND", "PIERS", "PIERT", "PIETA", "PIETS", "PIEZO", "PIGHT", + "PIGMY", "PIING", "PIKAS", "PIKAU", "PIKED", "PIKER", "PIKES", "PIKEY", "PIKIS", "PIKUL", "PILAE", "PILAF", + "PILAO", "PILAR", "PILAU", "PILAW", "PILCH", "PILEA", "PILED", "PILEI", "PILER", "PILES", "PILIS", "PILLS", + "PILOW", "PILUM", "PILUS", "PIMAS", "PIMPS", "PINAS", "PINED", "PINES", "PINGO", "PINGS", "PINKO", "PINKS", + "PINNA", "PINNY", "PINON", "PINOT", "PINTA", "PINTS", "PINUP", "PIONS", "PIONY", "PIOUS", "PIOYE", "PIOYS", + "PIPAL", "PIPAS", "PIPED", "PIPES", "PIPET", "PIPIS", "PIPIT", "PIPPY", "PIPUL", "PIRAI", "PIRLS", "PIRNS", + "PIROG", "PISCO", "PISES", "PISKY", "PISOS", "PISSY", "PISTE", "PITAS", "PITHS", "PITON", "PITOT", "PITTA", + "PIUMS", "PIXES", "PIZED", "PIZES", "PLAAS", "PLACK", "PLAGE", "PLANS", "PLAPS", "PLASH", "PLASM", "PLAST", + "PLATS", "PLATT", "PLATY", "PLAYA", "PLAYS", "PLEAS", "PLEBE", "PLEBS", "PLENA", "PLEON", "PLESH", "PLEWS", + "PLICA", "PLIES", "PLIMS", "PLING", "PLINK", "PLOAT", "PLODS", "PLONG", "PLONK", "PLOOK", "PLOPS", "PLOTS", + "PLOTZ", "PLOUK", "PLOWS", "PLOYE", "PLOYS", "PLUES", "PLUFF", "PLUGS", "PLUMS", "PLUMY", "PLUOT", "PLUTO", + "PLYER", "POACH", "POAKA", "POAKE", "POBOY", "POCKS", "POCKY", "PODAL", "PODDY", "PODEX", "PODGE", "PODGY", + "PODIA", "POEMS", "POEPS", "POETS", "POGEY", "POGGE", "POGOS", "POHED", "POILU", "POIND", "POKAL", "POKED", + "POKES", "POKEY", "POKIE", "POLED", "POLER", "POLES", "POLEY", "POLIO", "POLIS", "POLJE", "POLKS", "POLLS", + "POLLY", "POLOS", "POLTS", "POLYS", "POMBE", "POMES", "POMMY", "POMOS", "POMPS", "PONCE", "PONCY", "PONDS", + "PONES", "PONEY", "PONGA", "PONGO", "PONGS", "PONGY", "PONKS", "PONTS", "PONTY", "PONZU", "POODS", "POOED", + "POOFS", "POOFY", "POOHS", "POOJA", "POOKA", "POOKS", "POOLS", "POONS", "POOPS", "POOPY", "POORI", "POORT", + "POOTS", "POOVE", "POOVY", "POPES", "POPPA", "POPSY", "PORAE", "PORAL", "PORED", "PORER", "PORES", "PORGE", + "PORGY", "PORIN", "PORKS", "PORKY", "PORNO", "PORNS", "PORNY", "PORTA", "PORTS", "PORTY", "POSED", "POSES", + "POSEY", "POSHO", "POSTS", "POTAE", "POTCH", "POTED", "POTES", "POTIN", "POTOO", "POTSY", "POTTO", "POTTS", + "POTTY", "POUFF", "POUFS", "POUKE", "POUKS", "POULE", "POULP", "POULT", "POUPE", "POUPT", "POURS", "POUTS", + "POWAN", "POWIN", "POWND", "POWNS", "POWNY", "POWRE", "POXED", "POXES", "POYNT", "POYOU", "POYSE", "POZZY", + "PRAAM", "PRADS", "PRAHU", "PRAMS", "PRANA", "PRANG", "PRAOS", "PRASE", "PRATE", "PRATS", "PRATT", "PRATY", + "PRAUS", "PRAYS", "PREDY", "PREED", "PREES", "PREIF", "PREMS", "PREMY", "PRENT", "PREON", "PREOP", "PREPS", + "PRESA", "PRESE", "PREST", "PREVE", "PREXY", "PREYS", "PRIAL", "PRICY", "PRIEF", "PRIER", "PRIES", "PRIGS", + "PRILL", "PRIMA", "PRIMI", "PRIMP", "PRIMS", "PRIMY", "PRINK", "PRION", "PRISE", "PRISS", "PROAS", "PROBS", + "PRODS", "PROEM", "PROFS", "PROGS", "PROIN", "PROKE", "PROLE", "PROLL", "PROMO", "PROMS", "PRONK", "PROPS", + "PRORE", "PROSO", "PROSS", "PROST", "PROSY", "PROTO", "PROUL", "PROWS", "PROYN", "PRUNT", "PRUTA", "PRYER", + "PRYSE", "PSEUD", "PSHAW", "PSION", "PSOAE", "PSOAI", "PSOAS", "PSORA", "PSYCH", "PSYOP", "PUBCO", "PUBES", + "PUBIS", "PUCAN", "PUCER", "PUCES", "PUCKA", "PUCKS", "PUDDY", "PUDGE", "PUDIC", "PUDOR", "PUDSY", "PUDUS", + "PUERS", "PUFFA", "PUFFS", "PUGGY", "PUGIL", "PUHAS", "PUJAH", "PUJAS", "PUKAS", "PUKED", "PUKER", "PUKES", + "PUKEY", "PUKKA", "PUKUS", "PULAO", "PULAS", "PULED", "PULER", "PULES", "PULIK", "PULIS", "PULKA", "PULKS", + "PULLI", "PULLS", "PULLY", "PULMO", "PULPS", "PULUS", "PUMAS", "PUMIE", "PUMPS", "PUNAS", "PUNCE", "PUNGA", + "PUNGS", "PUNJI", "PUNKA", "PUNKS", "PUNKY", "PUNNY", "PUNTO", "PUNTS", "PUNTY", "PUPAE", "PUPAL", "PUPAS", + "PUPUS", "PURDA", "PURED", "PURES", "PURIN", "PURIS", "PURLS", "PURPY", "PURRS", "PURSY", "PURTY", "PUSES", + "PUSLE", "PUSSY", "PUTID", "PUTON", "PUTTI", "PUTTO", "PUTTS", "PUZEL", "PWNED", "PYATS", "PYETS", "PYGAL", + "PYINS", "PYLON", "PYNED", "PYNES", "PYOID", "PYOTS", "PYRAL", "PYRAN", "PYRES", "PYREX", "PYRIC", "PYROS", + "PYXED", "PYXES", "PYXIE", "PYXIS", "PZAZZ", "QADIS", "QAIDS", "QAJAQ", "QANAT", "QAPIK", "QIBLA", "QOPHS", + "QORMA", "QUADS", "QUAFF", "QUAGS", "QUAIR", "QUAIS", "QUAKY", "QUALE", "QUANT", "QUARE", "QUASS", "QUATE", + "QUATS", "QUAYD", "QUAYS", "QUBIT", "QUEAN", "QUEME", "QUENA", "QUERN", "QUEYN", "QUEYS", "QUICH", "QUIDS", + "QUIFF", "QUIMS", "QUINA", "QUINE", "QUINO", "QUINS", "QUINT", "QUIPO", "QUIPS", "QUIPU", "QUIRE", "QUIRT", + "QUIST", "QUITS", "QUOAD", "QUODS", "QUOIF", "QUOIN", "QUOIT", "QUOLL", "QUONK", "QUOPS", "QURAN", "QURSH", + "QUYTE", "RABAT", "RABIC", "RABIS", "RACED", "RACES", "RACHE", "RACKS", "RACON", "RADGE", "RADIX", "RADON", + "RAFFS", "RAFTS", "RAGAS", "RAGDE", "RAGED", "RAGEE", "RAGER", "RAGES", "RAGGA", "RAGGS", "RAGGY", "RAGIS", + "RAGUS", "RAHED", "RAHUI", "RAIAS", "RAIDS", "RAIKS", "RAILE", "RAILS", "RAINE", "RAINS", "RAIRD", "RAITA", + "RAITS", "RAJAS", "RAJES", "RAKED", "RAKEE", "RAKER", "RAKES", "RAKIA", "RAKIS", "RAKUS", "RALES", "RAMAL", + "RAMEE", "RAMET", "RAMIE", "RAMIN", "RAMIS", "RAMMY", "RAMPS", "RAMUS", "RANAS", "RANCE", "RANDS", "RANEE", + "RANGA", "RANGI", "RANGS", "RANGY", "RANID", "RANIS", "RANKE", "RANKS", "RANTS", "RAPED", "RAPER", "RAPES", + "RAPHE", "RAPPE", "RARED", "RAREE", "RARES", "RARKS", "RASED", "RASER", "RASES", "RASPS", "RASSE", "RASTA", + "RATAL", "RATAN", "RATAS", "RATCH", "RATED", "RATEL", "RATER", "RATES", "RATHA", "RATHE", "RATHS", "RATOO", + "RATOS", "RATUS", "RAUNS", "RAUPO", "RAVED", "RAVEL", "RAVER", "RAVES", "RAVEY", "RAVIN", "RAWER", "RAWIN", + "RAWLY", "RAWNS", "RAXED", "RAXES", "RAYAH", "RAYAS", "RAYED", "RAYLE", "RAYNE", "RAZED", "RAZEE", "RAZER", + "RAZES", "RAZOO", "READD", "READS", "REAIS", "REAKS", "REALO", "REALS", "REAME", "REAMS", "REAMY", "REANS", + "REAPS", "REARS", "REAST", "REATA", "REATE", "REAVE", "REBBE", "REBEC", "REBID", "REBIT", "REBOP", "REBUY", + "RECAL", "RECCE", "RECCO", "RECCY", "RECIT", "RECKS", "RECON", "RECTA", "RECTI", "RECTO", "REDAN", "REDDS", + "REDDY", "REDED", "REDES", "REDIA", "REDID", "REDIP", "REDLY", "REDON", "REDOS", "REDOX", "REDRY", "REDUB", + "REDUX", "REDYE", "REECH", "REEDE", "REEDS", "REEFS", "REEFY", "REEKS", "REEKY", "REELS", "REENS", "REEST", + "REEVE", "REFED", "REFEL", "REFFO", "REFIS", "REFIX", "REFLY", "REFRY", "REGAR", "REGES", "REGGO", "REGIE", + "REGMA", "REGNA", "REGOS", "REGUR", "REHEM", "REIFS", "REIFY", "REIKI", "REIKS", "REINK", "REINS", "REIRD", + "REIST", "REIVE", "REJIG", "REJON", "REKED", "REKES", "REKEY", "RELET", "RELIE", "RELIT", "RELLO", "REMAN", + "REMAP", "REMEN", "REMET", "REMEX", "REMIX", "RENAY", "RENDS", "RENEY", "RENGA", "RENIG", "RENIN", "RENNE", + "RENOS", "RENTE", "RENTS", "REOIL", "REORG", "REPEG", "REPIN", "REPLA", "REPOS", "REPOT", "REPPS", "REPRO", + "RERAN", "RERIG", "RESAT", "RESAW", "RESAY", "RESEE", "RESES", "RESEW", "RESID", "RESIT", "RESOD", "RESOW", + "RESTO", "RESTS", "RESTY", "RESUS", "RETAG", "RETAX", "RETEM", "RETIA", "RETIE", "RETOX", "REVET", "REVIE", + "REWAN", "REWAX", "REWED", "REWET", "REWIN", "REWON", "REWTH", "REXES", "REZES", "RHEAS", "RHEME", "RHEUM", + "RHIES", "RHIME", "RHINE", "RHODY", "RHOMB", "RHONE", "RHUMB", "RHYNE", "RHYTA", "RIADS", "RIALS", "RIANT", + "RIATA", "RIBAS", "RIBBY", "RIBES", "RICED", "RICER", "RICES", "RICEY", "RICHT", "RICIN", "RICKS", "RIDES", + "RIDGY", "RIDIC", "RIELS", "RIEMS", "RIEVE", "RIFER", "RIFFS", "RIFTE", "RIFTS", "RIFTY", "RIGGS", "RIGOL", + "RILED", "RILES", "RILEY", "RILLE", "RILLS", "RIMAE", "RIMED", "RIMER", "RIMES", "RIMUS", "RINDS", "RINDY", + "RINES", "RINGS", "RINKS", "RIOJA", "RIOTS", "RIPED", "RIPES", "RIPPS", "RISES", "RISHI", "RISKS", "RISPS", + "RISUS", "RITES", "RITTS", "RITZY", "RIVAS", "RIVED", "RIVEL", "RIVEN", "RIVES", "RIYAL", "RIZAS", "ROADS", + "ROAMS", "ROANS", "ROARS", "ROARY", "ROATE", "ROBED", "ROBES", "ROBLE", "ROCKS", "RODED", "RODES", "ROGUY", + "ROHES", "ROIDS", "ROILS", "ROILY", "ROINS", "ROIST", "ROJAK", "ROJIS", "ROKED", "ROKER", "ROKES", "ROLAG", + "ROLES", "ROLFS", "ROLLS", "ROMAL", "ROMAN", "ROMEO", "ROMPS", "RONDE", "RONDO", "RONEO", "RONES", "RONIN", + "RONNE", "RONTE", "RONTS", "ROODS", "ROOFS", "ROOFY", "ROOKS", "ROOKY", "ROOMS", "ROONS", "ROOPS", "ROOPY", + "ROOSA", "ROOSE", "ROOTS", "ROOTY", "ROPED", "ROPER", "ROPES", "ROPEY", "ROQUE", "RORAL", "RORES", "RORIC", + "RORID", "RORIE", "RORTS", "RORTY", "ROSED", "ROSES", "ROSET", "ROSHI", "ROSIN", "ROSIT", "ROSTI", "ROSTS", + "ROTAL", "ROTAN", "ROTAS", "ROTCH", "ROTED", "ROTES", "ROTIS", "ROTLS", "ROTON", "ROTOS", "ROTTE", "ROUEN", + "ROUES", "ROULE", "ROULS", "ROUMS", "ROUPS", "ROUPY", "ROUST", "ROUTH", "ROUTS", "ROVED", "ROVEN", "ROVES", + "ROWAN", "ROWED", "ROWEL", "ROWEN", "ROWIE", "ROWME", "ROWND", "ROWTH", "ROWTS", "ROYNE", "ROYST", "ROZET", + "ROZIT", "RUANA", "RUBAI", "RUBBY", "RUBEL", "RUBES", "RUBIN", "RUBLE", "RUBLI", "RUBUS", "RUCHE", "RUCKS", + "RUDAS", "RUDDS", "RUDES", "RUDIE", "RUDIS", "RUEDA", "RUERS", "RUFFE", "RUFFS", "RUGAE", "RUGAL", "RUGGY", + "RUING", "RUINS", "RUKHS", "RULED", "RULES", "RUMAL", "RUMBO", "RUMEN", "RUMES", "RUMLY", "RUMMY", "RUMPO", + "RUMPS", "RUMPY", "RUNCH", "RUNDS", "RUNED", "RUNES", "RUNGS", "RUNIC", "RUNNY", "RUNTS", "RUNTY", "RUPIA", + "RURPS", "RURUS", "RUSAS", "RUSES", "RUSHY", "RUSKS", "RUSMA", "RUSSE", "RUSTS", "RUTHS", "RUTIN", "RUTTY", + "RYALS", "RYBAT", "RYKED", "RYKES", "RYMME", "RYNDS", "RYOTS", "RYPER", "SAAGS", "SABAL", "SABED", "SABER", + "SABES", "SABHA", "SABIN", "SABIR", "SABLE", "SABOT", "SABRA", "SABRE", "SACKS", "SACRA", "SADDO", "SADES", + "SADHE", "SADHU", "SADIS", "SADOS", "SADZA", "SAFED", "SAFES", "SAGAS", "SAGER", "SAGES", "SAGGY", "SAGOS", + "SAGUM", "SAHEB", "SAHIB", "SAICE", "SAICK", "SAICS", "SAIDS", "SAIGA", "SAILS", "SAIMS", "SAINE", "SAINS", + "SAIRS", "SAIST", "SAITH", "SAJOU", "SAKAI", "SAKER", "SAKES", "SAKIA", "SAKIS", "SAKTI", "SALAL", "SALAT", + "SALEP", "SALES", "SALET", "SALIC", "SALIX", "SALLE", "SALMI", "SALOL", "SALOP", "SALPA", "SALPS", "SALSE", + "SALTO", "SALTS", "SALUE", "SALUT", "SAMAN", "SAMAS", "SAMBA", "SAMBO", "SAMEK", "SAMEL", "SAMEN", "SAMES", + "SAMEY", "SAMFU", "SAMMY", "SAMPI", "SAMPS", "SANDS", "SANED", "SANES", "SANGA", "SANGH", "SANGO", "SANGS", + "SANKO", "SANSA", "SANTO", "SANTS", "SAOLA", "SAPAN", "SAPID", "SAPOR", "SARAN", "SARDS", "SARED", "SAREE", + "SARGE", "SARGO", "SARIN", "SARIS", "SARKS", "SARKY", "SAROD", "SAROS", "SARUS", "SASER", "SASIN", "SASSE", + "SATAI", "SATAY", "SATED", "SATEM", "SATES", "SATIS", "SAUBA", "SAUCH", "SAUGH", "SAULS", "SAULT", "SAUNT", + "SAURY", "SAUTS", "SAVED", "SAVER", "SAVES", "SAVEY", "SAVIN", "SAWAH", "SAWED", "SAWER", "SAXES", "SAYED", + "SAYER", "SAYID", "SAYNE", "SAYON", "SAYST", "SAZES", "SCABS", "SCADS", "SCAFF", "SCAGS", "SCAIL", "SCALA", + "SCALL", "SCAMS", "SCAND", "SCANS", "SCAPA", "SCAPE", "SCAPI", "SCARP", "SCARS", "SCART", "SCATH", "SCATS", + "SCATT", "SCAUD", "SCAUP", "SCAUR", "SCAWS", "SCEAT", "SCENA", "SCEND", "SCHAV", "SCHMO", "SCHUL", "SCHWA", + "SCLIM", "SCODY", "SCOGS", "SCOOG", "SCOOT", "SCOPA", "SCOPS", "SCOTS", "SCOUG", "SCOUP", "SCOWP", "SCOWS", + "SCRAB", "SCRAE", "SCRAG", "SCRAN", "SCRAT", "SCRAW", "SCRAY", "SCRIM", "SCRIP", "SCROB", "SCROD", "SCROG", + "SCROW", "SCUDI", "SCUDO", "SCUDS", "SCUFF", "SCUFT", "SCUGS", "SCULK", "SCULL", "SCULP", "SCULS", "SCUMS", + "SCUPS", "SCURF", "SCURS", "SCUSE", "SCUTA", "SCUTE", "SCUTS", "SCUZZ", "SCYES", "SDAYN", "SDEIN", "SEALS", + "SEAME", "SEAMS", "SEAMY", "SEANS", "SEARE", "SEARS", "SEASE", "SEATS", "SEAZE", "SEBUM", "SECCO", "SECHS", + "SECTS", "SEDER", "SEDES", "SEDGE", "SEDGY", "SEDUM", "SEEDS", "SEEKS", "SEELD", "SEELS", "SEELY", "SEEMS", + "SEEPS", "SEEPY", "SEERS", "SEFER", "SEGAR", "SEGNI", "SEGNO", "SEGOL", "SEGOS", "SEHRI", "SEIFS", "SEILS", + "SEINE", "SEIRS", "SEISE", "SEISM", "SEITY", "SEIZA", "SEKOS", "SEKTS", "SELAH", "SELES", "SELFS", "SELLA", + "SELLE", "SELLS", "SELVA", "SEMEE", "SEMES", "SEMIE", "SEMIS", "SENAS", "SENDS", "SENES", "SENGI", "SENNA", + "SENOR", "SENSA", "SENSI", "SENTE", "SENTI", "SENTS", "SENVY", "SENZA", "SEPAD", "SEPAL", "SEPIC", "SEPOY", + "SEPTA", "SEPTS", "SERAC", "SERAI", "SERAL", "SERED", "SERER", "SERES", "SERFS", "SERGE", "SERIC", "SERIN", + "SERKS", "SERON", "SEROW", "SERRA", "SERRE", "SERRS", "SERRY", "SERVO", "SESEY", "SESSA", "SETAE", "SETAL", + "SETON", "SETTS", "SEWAN", "SEWAR", "SEWED", "SEWEL", "SEWEN", "SEWIN", "SEXED", "SEXER", "SEXES", "SEXTO", + "SEXTS", "SEYEN", "SHADS", "SHAGS", "SHAHS", "SHAKO", "SHAKT", "SHALM", "SHALY", "SHAMA", "SHAMS", "SHAND", + "SHANS", "SHAPS", "SHARN", "SHASH", "SHAUL", "SHAWM", "SHAWN", "SHAWS", "SHAYA", "SHAYS", "SHCHI", "SHEAF", + "SHEAL", "SHEAS", "SHEDS", "SHEEL", "SHEND", "SHENT", "SHEOL", "SHERD", "SHERE", "SHERO", "SHETS", "SHEVA", + "SHEWN", "SHEWS", "SHIAI", "SHIEL", "SHIER", "SHIES", "SHILL", "SHILY", "SHIMS", "SHINS", "SHIPS", "SHIRR", + "SHIRS", "SHISH", "SHISO", "SHIST", "SHITE", "SHITS", "SHIUR", "SHIVA", "SHIVE", "SHIVS", "SHLEP", "SHLUB", + "SHMEK", "SHMOE", "SHOAT", "SHOED", "SHOER", "SHOES", "SHOGI", "SHOGS", "SHOJI", "SHOJO", "SHOLA", "SHOOL", + "SHOON", "SHOOS", "SHOPE", "SHOPS", "SHORL", "SHOTE", "SHOTS", "SHOTT", "SHOWD", "SHOWS", "SHOYU", "SHRED", + "SHRIS", "SHROW", "SHTIK", "SHTUM", "SHTUP", "SHULE", "SHULN", "SHULS", "SHUNS", "SHURA", "SHUTE", "SHUTS", + "SHWAS", "SHYER", "SIALS", "SIBBS", "SIBYL", "SICES", "SICHT", "SICKO", "SICKS", "SICKY", "SIDAS", "SIDED", + "SIDER", "SIDES", "SIDHA", "SIDHE", "SIDLE", "SIELD", "SIENS", "SIENT", "SIETH", "SIEUR", "SIFTS", "SIGHS", + "SIGIL", "SIGLA", "SIGNA", "SIGNS", "SIJOS", "SIKAS", "SIKER", "SIKES", "SILDS", "SILED", "SILEN", "SILER", + "SILES", "SILEX", "SILKS", "SILLS", "SILOS", "SILTS", "SILTY", "SILVA", "SIMAR", "SIMAS", "SIMBA", "SIMIS", + "SIMPS", "SIMUL", "SINDS", "SINED", "SINES", "SINGS", "SINHS", "SINKS", "SINKY", "SINUS", "SIPED", "SIPES", + "SIPPY", "SIRED", "SIREE", "SIRES", "SIRIH", "SIRIS", "SIROC", "SIRRA", "SIRUP", "SISAL", "SISES", "SISTA", + "SISTS", "SITAR", "SITED", "SITES", "SITHE", "SITKA", "SITUP", "SITUS", "SIVER", "SIXER", "SIXES", "SIXMO", + "SIXTE", "SIZAR", "SIZED", "SIZEL", "SIZER", "SIZES", "SKAGS", "SKAIL", "SKALD", "SKANK", "SKART", "SKATS", + "SKATT", "SKAWS", "SKEAN", "SKEAR", "SKEDS", "SKEED", "SKEEF", "SKEEN", "SKEER", "SKEES", "SKEET", "SKEGG", + "SKEGS", "SKEIN", "SKELF", "SKELL", "SKELM", "SKELP", "SKENE", "SKENS", "SKEOS", "SKEPS", "SKERS", "SKETS", + "SKEWS", "SKIDS", "SKIED", "SKIES", "SKIEY", "SKIMO", "SKIMS", "SKINK", "SKINS", "SKINT", "SKIOS", "SKIPS", + "SKIRL", "SKIRR", "SKITE", "SKITS", "SKIVE", "SKIVY", "SKLIM", "SKOAL", "SKODY", "SKOFF", "SKOGS", "SKOLS", + "SKOOL", "SKORT", "SKOSH", "SKRAN", "SKRIK", "SKUAS", "SKUGS", "SKYED", "SKYER", "SKYEY", "SKYFS", "SKYRE", + "SKYRS", "SKYTE", "SLABS", "SLADE", "SLAES", "SLAGS", "SLAID", "SLAKE", "SLAMS", "SLANE", "SLANK", "SLAPS", + "SLART", "SLATS", "SLATY", "SLAVE", "SLAWS", "SLAYS", "SLEBS", "SLEDS", "SLEER", "SLEWS", "SLEYS", "SLIER", + "SLILY", "SLIMS", "SLIPE", "SLIPS", "SLIPT", "SLISH", "SLITS", "SLIVE", "SLOAN", "SLOBS", "SLOES", "SLOGS", + "SLOID", "SLOJD", "SLOMO", "SLOOM", "SLOOT", "SLOPS", "SLOPY", "SLORM", "SLOTS", "SLOVE", "SLOWS", "SLOYD", + "SLUBB", "SLUBS", "SLUED", "SLUES", "SLUFF", "SLUGS", "SLUIT", "SLUMS", "SLURB", "SLURS", "SLUSE", "SLUTS", + "SLYER", "SLYPE", "SMAAK", "SMAIK", "SMALM", "SMALT", "SMARM", "SMAZE", "SMEEK", "SMEES", "SMEIK", "SMEKE", + "SMERK", "SMEWS", "SMIRR", "SMIRS", "SMITS", "SMOGS", "SMOKO", "SMOLT", "SMOOR", "SMOOT", "SMORE", "SMORG", + "SMOUT", "SMOWT", "SMUGS", "SMURS", "SMUSH", "SMUTS", "SNABS", "SNAFU", "SNAGS", "SNAPS", "SNARF", "SNARK", + "SNARS", "SNARY", "SNASH", "SNATH", "SNAWS", "SNEAD", "SNEAP", "SNEBS", "SNECK", "SNEDS", "SNEED", "SNEES", + "SNELL", "SNIBS", "SNICK", "SNIES", "SNIFT", "SNIGS", "SNIPS", "SNIPY", "SNIRT", "SNITS", "SNOBS", "SNODS", + "SNOEK", "SNOEP", "SNOGS", "SNOKE", "SNOOD", "SNOOK", "SNOOL", "SNOOT", "SNOTS", "SNOWK", "SNOWS", "SNUBS", + "SNUGS", "SNUSH", "SNYES", "SOAKS", "SOAPS", "SOARE", "SOARS", "SOAVE", "SOBAS", "SOCAS", "SOCES", "SOCKO", + "SOCKS", "SOCLE", "SODAS", "SODDY", "SODIC", "SODOM", "SOFAR", "SOFAS", "SOFTA", "SOFTS", "SOFTY", "SOGER", + "SOHUR", "SOILS", "SOILY", "SOJAS", "SOJUS", "SOKAH", "SOKEN", "SOKES", "SOKOL", "SOLAH", "SOLAN", "SOLAS", + "SOLDE", "SOLDI", "SOLDO", "SOLDS", "SOLED", "SOLEI", "SOLER", "SOLES", "SOLON", "SOLOS", "SOLUM", "SOLUS", + "SOMAN", "SOMAS", "SONCE", "SONDE", "SONES", "SONGS", "SONLY", "SONNE", "SONNY", "SONSE", "SONSY", "SOOEY", + "SOOKS", "SOOKY", "SOOLE", "SOOLS", "SOOMS", "SOOPS", "SOOTE", "SOOTS", "SOPHS", "SOPHY", "SOPOR", "SOPPY", + "SOPRA", "SORAL", "SORAS", "SORBO", "SORBS", "SORDA", "SORDO", "SORDS", "SORED", "SOREE", "SOREL", "SORER", + "SORES", "SOREX", "SORGO", "SORNS", "SORRA", "SORTA", "SORTS", "SORUS", "SOTHS", "SOTOL", "SOUCE", "SOUCT", + "SOUGH", "SOUKS", "SOULS", "SOUMS", "SOUPS", "SOUPY", "SOURS", "SOUSE", "SOUTS", "SOWAR", "SOWCE", "SOWED", + "SOWFF", "SOWFS", "SOWLE", "SOWLS", "SOWMS", "SOWND", "SOWNE", "SOWPS", "SOWSE", "SOWTH", "SOYAS", "SOYLE", + "SOYUZ", "SOZIN", "SPACY", "SPADO", "SPAED", "SPAER", "SPAES", "SPAGS", "SPAHI", "SPAIL", "SPAIN", "SPAIT", + "SPAKE", "SPALD", "SPALE", "SPALL", "SPALT", "SPAMS", "SPANE", "SPANG", "SPANS", "SPARD", "SPARS", "SPART", + "SPATE", "SPATS", "SPAUL", "SPAWL", "SPAWS", "SPAYD", "SPAYS", "SPAZA", "SPAZZ", "SPEAL", "SPEAN", "SPEAT", + "SPECS", "SPECT", "SPEEL", "SPEER", "SPEIL", "SPEIR", "SPEKS", "SPELD", "SPELK", "SPEOS", "SPETS", "SPEUG", + "SPEWS", "SPEWY", "SPIAL", "SPICA", "SPICK", "SPICS", "SPIDE", "SPIER", "SPIES", "SPIFF", "SPIFS", "SPIKS", + "SPILE", "SPIMS", "SPINA", "SPINK", "SPINS", "SPIRT", "SPIRY", "SPITS", "SPITZ", "SPIVS", "SPLAY", "SPLOG", + "SPODE", "SPODS", "SPOOM", "SPOOR", "SPOOT", "SPORK", "SPOSH", "SPOTS", "SPRAD", "SPRAG", "SPRAT", "SPRED", + "SPREW", "SPRIT", "SPROD", "SPROG", "SPRUE", "SPRUG", "SPUDS", "SPUED", "SPUER", "SPUES", "SPUGS", "SPULE", + "SPUME", "SPUMY", "SPURS", "SPUTA", "SPYAL", "SPYRE", "SQUAB", "SQUAW", "SQUEG", "SQUID", "SQUIT", "SQUIZ", + "STABS", "STADE", "STAGS", "STAGY", "STAIG", "STANE", "STANG", "STAPH", "STAPS", "STARN", "STARR", "STARS", + "STATS", "STAUN", "STAWS", "STAYS", "STEAN", "STEAR", "STEDD", "STEDE", "STEDS", "STEEK", "STEEM", "STEEN", + "STEIL", "STELA", "STELE", "STELL", "STEME", "STEMS", "STEND", "STENO", "STENS", "STENT", "STEPS", "STEPT", + "STERE", "STETS", "STEWS", "STEWY", "STEYS", "STICH", "STIED", "STIES", "STILB", "STILE", "STIME", "STIMS", + "STIMY", "STIPA", "STIPE", "STIRE", "STIRK", "STIRP", "STIRS", "STIVE", "STIVY", "STOAE", "STOAI", "STOAS", + "STOAT", "STOBS", "STOEP", "STOGY", "STOIT", "STOLN", "STOMA", "STOND", "STONG", "STONK", "STONN", "STOOK", + "STOOR", "STOPE", "STOPS", "STOPT", "STOSS", "STOTS", "STOTT", "STOUN", "STOUP", "STOUR", "STOWN", "STOWP", + "STOWS", "STRAD", "STRAE", "STRAG", "STRAK", "STREP", "STREW", "STRIA", "STRIG", "STRIM", "STROP", "STROW", + "STROY", "STRUM", "STUBS", "STUDE", "STUDS", "STULL", "STULM", "STUMM", "STUMS", "STUNS", "STUPA", "STUPE", + "STURE", "STURT", "STYED", "STYES", "STYLI", "STYLO", "STYME", "STYMY", "STYRE", "STYTE", "SUBAH", "SUBAS", + "SUBBY", "SUBER", "SUBHA", "SUCCI", "SUCKS", "SUCKY", "SUCRE", "SUDDS", "SUDOR", "SUDSY", "SUEDE", "SUENT", + "SUERS", "SUETE", "SUETS", "SUETY", "SUGAN", "SUGHS", "SUGOS", "SUHUR", "SUIDS", "SUINT", "SUITS", "SUJEE", + "SUKHS", "SUKUK", "SULCI", "SULFA", "SULFO", "SULKS", "SULPH", "SULUS", "SUMIS", "SUMMA", "SUMOS", "SUMPH", + "SUMPS", "SUNIS", "SUNKS", "SUNNA", "SUNNS", "SUNUP", "SUPES", "SUPRA", "SURAH", "SURAL", "SURAS", "SURAT", + "SURDS", "SURED", "SURES", "SURFS", "SURFY", "SURGY", "SURRA", "SUSED", "SUSES", "SUSUS", "SUTOR", "SUTRA", + "SUTTA", "SWABS", "SWACK", "SWADS", "SWAGE", "SWAGS", "SWAIL", "SWAIN", "SWALE", "SWALY", "SWAMY", "SWANG", + "SWANK", "SWANS", "SWAPS", "SWAPT", "SWARD", "SWARE", "SWARF", "SWART", "SWATS", "SWAYL", "SWAYS", "SWEAL", + "SWEDE", "SWEED", "SWEEL", "SWEER", "SWEES", "SWEIR", "SWELT", "SWERF", "SWEYS", "SWIES", "SWIGS", "SWILE", + "SWIMS", "SWINK", "SWIPE", "SWIRE", "SWISS", "SWITH", "SWITS", "SWIVE", "SWIZZ", "SWOBS", "SWOLE", "SWOLN", + "SWOPS", "SWOPT", "SWOTS", "SWOUN", "SYBBE", "SYBIL", "SYBOE", "SYBOW", "SYCEE", "SYCES", "SYCON", "SYENS", + "SYKER", "SYKES", "SYLIS", "SYLPH", "SYLVA", "SYMAR", "SYNCH", "SYNCS", "SYNDS", "SYNED", "SYNES", "SYNTH", + "SYPED", "SYPES", "SYPHS", "SYRAH", "SYREN", "SYSOP", "SYTHE", "SYVER", "TAALS", "TAATA", "TABER", "TABES", + "TABID", "TABIS", "TABLA", "TABOR", "TABUN", "TABUS", "TACAN", "TACES", "TACET", "TACHE", "TACHO", "TACHS", + "TACKS", "TACOS", "TACTS", "TAELS", "TAFIA", "TAGGY", "TAGMA", "TAHAS", "TAHRS", "TAIGA", "TAIGS", "TAIKO", + "TAILS", "TAINS", "TAIRA", "TAISH", "TAITS", "TAJES", "TAKAS", "TAKES", "TAKHI", "TAKIN", "TAKIS", "TAKKY", + "TALAK", "TALAQ", "TALAR", "TALAS", "TALCS", "TALCY", "TALEA", "TALER", "TALES", "TALKS", "TALKY", "TALLS", + "TALMA", "TALPA", "TALUK", "TALUS", "TAMAL", "TAMED", "TAMES", "TAMIN", "TAMIS", "TAMMY", "TAMPS", "TANAS", + "TANGA", "TANGI", "TANGS", "TANHS", "TANKA", "TANKS", "TANKY", "TANNA", "TANSY", "TANTI", "TANTO", "TANTY", + "TAPAS", "TAPED", "TAPEN", "TAPES", "TAPET", "TAPIS", "TAPPA", "TAPUS", "TARAS", "TARDO", "TARED", "TARES", + "TARGA", "TARGE", "TARNS", "TAROC", "TAROK", "TAROS", "TARPS", "TARRE", "TARRY", "TARSI", "TARTS", "TARTY", + "TASAR", "TASED", "TASER", "TASES", "TASKS", "TASSA", "TASSE", "TASSO", "TATAR", "TATER", "TATES", "TATHS", + "TATIE", "TATOU", "TATTS", "TATUS", "TAUBE", "TAULD", "TAUON", "TAUPE", "TAUTS", "TAVAH", "TAVAS", "TAVER", + "TAWAI", "TAWAS", "TAWED", "TAWER", "TAWIE", "TAWSE", "TAWTS", "TAXED", "TAXER", "TAXES", "TAXIS", "TAXOL", + "TAXON", "TAXOR", "TAXUS", "TAYRA", "TAZZA", "TAZZE", "TEADE", "TEADS", "TEAED", "TEAKS", "TEALS", "TEAMS", + "TEARS", "TEATS", "TEAZE", "TECHS", "TECHY", "TECTA", "TEELS", "TEEMS", "TEEND", "TEENE", "TEENS", "TEENY", + "TEERS", "TEFFS", "TEGGS", "TEGUA", "TEGUS", "TEHRS", "TEIID", "TEILS", "TEIND", "TEINS", "TELAE", "TELCO", + "TELES", "TELEX", "TELIA", "TELIC", "TELLS", "TELLY", "TELOI", "TELOS", "TEMED", "TEMES", "TEMPI", "TEMPS", + "TEMPT", "TEMSE", "TENCH", "TENDS", "TENDU", "TENES", "TENGE", "TENIA", "TENNE", "TENNO", "TENNY", "TENON", + "TENTS", "TENTY", "TENUE", "TEPAL", "TEPAS", "TEPOY", "TERAI", "TERAS", "TERCE", "TEREK", "TERES", "TERFE", + "TERFS", "TERGA", "TERMS", "TERNE", "TERNS", "TERRY", "TERTS", "TESLA", "TESTA", "TESTE", "TESTS", "TETES", + "TETHS", "TETRA", "TETRI", "TEUCH", "TEUGH", "TEWED", "TEWEL", "TEWIT", "TEXAS", "TEXES", "TEXTS", "THACK", + "THAGI", "THAIM", "THALE", "THALI", "THANA", "THANE", "THANG", "THANS", "THANX", "THARM", "THARS", "THAWS", + "THAWY", "THEBE", "THECA", "THEED", "THEEK", "THEES", "THEGN", "THEIC", "THEIN", "THELF", "THEMA", "THENS", + "THEOW", "THERM", "THESP", "THETE", "THEWS", "THEWY", "THIGS", "THILK", "THILL", "THINE", "THINS", "THIOL", + "THIRL", "THOFT", "THOLE", "THOLI", "THORO", "THORP", "THOUS", "THOWL", "THRAE", "THRAW", "THRID", "THRIP", + "THROE", "THUDS", "THUGS", "THUJA", "THUNK", "THURL", "THUYA", "THYMI", "THYMY", "TIANS", "TIARS", "TICAL", + "TICCA", "TICED", "TICES", "TICHY", "TICKS", "TICKY", "TIDDY", "TIDED", "TIDES", "TIERS", "TIFFS", "TIFOS", + "TIFTS", "TIGES", "TIGON", "TIKAS", "TIKES", "TIKIS", "TIKKA", "TILAK", "TILED", "TILER", "TILES", "TILLS", + "TILLY", "TILTH", "TILTS", "TIMBO", "TIMED", "TIMES", "TIMON", "TIMPS", "TINAS", "TINCT", "TINDS", "TINEA", + "TINED", "TINES", "TINGE", "TINGS", "TINKS", "TINNY", "TINTS", "TINTY", "TIPIS", "TIPPY", "TIRED", "TIRES", + "TIRLS", "TIROS", "TIRRS", "TITCH", "TITER", "TITIS", "TITRE", "TITTY", "TITUP", "TIYIN", "TIYNS", "TIZES", + "TIZZY", "TOADS", "TOADY", "TOAZE", "TOCKS", "TOCKY", "TOCOS", "TODDE", "TOEAS", "TOFFS", "TOFFY", "TOFTS", + "TOFUS", "TOGAE", "TOGAS", "TOGED", "TOGES", "TOGUE", "TOHOS", "TOILE", "TOILS", "TOING", "TOISE", "TOITS", + "TOKAY", "TOKED", "TOKER", "TOKES", "TOKOS", "TOLAN", "TOLAR", "TOLAS", "TOLED", "TOLES", "TOLLS", "TOLLY", + "TOLTS", "TOLUS", "TOLYL", "TOMAN", "TOMBS", "TOMES", "TOMIA", "TOMMY", "TOMOS", "TONDI", "TONDO", "TONED", + "TONER", "TONES", "TONEY", "TONGS", "TONKA", "TONKS", "TONNE", "TONUS", "TOOLS", "TOOMS", "TOONS", "TOOTS", + "TOPED", "TOPEE", "TOPEK", "TOPER", "TOPES", "TOPHE", "TOPHI", "TOPHS", "TOPIS", "TOPOI", "TOPOS", "TOPPY", + "TOQUE", "TORAH", "TORAN", "TORAS", "TORCS", "TORES", "TORIC", "TORII", "TOROS", "TOROT", "TORRS", "TORSE", + "TORSI", "TORSK", "TORTA", "TORTE", "TORTS", "TOSAS", "TOSED", "TOSES", "TOSHY", "TOSSY", "TOTED", "TOTER", + "TOTES", "TOTTY", "TOUKS", "TOUNS", "TOURS", "TOUSE", "TOUSY", "TOUTS", "TOUZE", "TOUZY", "TOWED", "TOWIE", + "TOWNS", "TOWNY", "TOWSE", "TOWSY", "TOWTS", "TOWZE", "TOWZY", "TOYED", "TOYER", "TOYON", "TOYOS", "TOZED", + "TOZES", "TOZIE", "TRABS", "TRADS", "TRAGI", "TRAIK", "TRAMS", "TRANK", "TRANQ", "TRANS", "TRANT", "TRAPE", + "TRAPS", "TRAPT", "TRASS", "TRATS", "TRATT", "TRAVE", "TRAYF", "TRAYS", "TRECK", "TREED", "TREEN", "TREES", + "TREFA", "TREIF", "TREKS", "TREMA", "TREMS", "TRESS", "TREST", "TRETS", "TREWS", "TREYF", "TREYS", "TRIAC", + "TRIDE", "TRIER", "TRIES", "TRIFF", "TRIGO", "TRIGS", "TRIKE", "TRILD", "TRILL", "TRIMS", "TRINE", "TRINS", + "TRIOL", "TRIOR", "TRIOS", "TRIPS", "TRIPY", "TRIST", "TROAD", "TROAK", "TROAT", "TROCK", "TRODE", "TRODS", + "TROGS", "TROIS", "TROKE", "TROMP", "TRONA", "TRONC", "TRONE", "TRONK", "TRONS", "TROOZ", "TROTH", "TROTS", + "TROWS", "TROYS", "TRUED", "TRUES", "TRUGO", "TRUGS", "TRULL", "TRYER", "TRYKE", "TRYMA", "TRYPS", "TSADE", + "TSADI", "TSARS", "TSKED", "TSUBA", "TSUBO", "TUANS", "TUART", "TUATH", "TUBAE", "TUBAR", "TUBAS", "TUBBY", + "TUBED", "TUBES", "TUCKS", "TUFAS", "TUFFE", "TUFFS", "TUFTS", "TUFTY", "TUGRA", "TUILE", "TUINA", "TUISM", + "TUKTU", "TULES", "TULPA", "TULSI", "TUMID", "TUMMY", "TUMPS", "TUMPY", "TUNAS", "TUNDS", "TUNED", "TUNER", + "TUNES", "TUNGS", "TUNNY", "TUPEK", "TUPIK", "TUPLE", "TUQUE", "TURDS", "TURFS", "TURFY", "TURKS", "TURME", + "TURMS", "TURNS", "TURNT", "TURPS", "TURRS", "TUSHY", "TUSKS", "TUSKY", "TUTEE", "TUTTI", "TUTTY", "TUTUS", + "TUXES", "TUYER", "TWAES", "TWAIN", "TWALS", "TWANK", "TWATS", "TWAYS", "TWEEL", "TWEEN", "TWEEP", "TWEER", + "TWERK", "TWERP", "TWIER", "TWIGS", "TWILL", "TWILT", "TWINK", "TWINS", "TWINY", "TWIRE", "TWIRP", "TWITE", + "TWITS", "TWOER", "TWYER", "TYEES", "TYERS", "TYIYN", "TYKES", "TYLER", "TYMPS", "TYNDE", "TYNED", "TYNES", + "TYPAL", "TYPED", "TYPES", "TYPEY", "TYPIC", "TYPOS", "TYPPS", "TYPTO", "TYRAN", "TYRED", "TYRES", "TYROS", + "TYTHE", "TZARS", "UDALS", "UDONS", "UGALI", "UGGED", "UHLAN", "UHURU", "UKASE", "ULAMA", "ULANS", "ULEMA", + "ULMIN", "ULNAD", "ULNAE", "ULNAR", "ULNAS", "ULPAN", "ULVAS", "ULYIE", "ULZIE", "UMAMI", "UMBEL", "UMBER", + "UMBLE", "UMBOS", "UMBRE", "UMIAC", "UMIAK", "UMIAQ", "UMMAH", "UMMAS", "UMMED", "UMPED", "UMPHS", "UMPIE", + "UMPTY", "UMRAH", "UMRAS", "UNAIS", "UNAPT", "UNARM", "UNARY", "UNAUS", "UNBAG", "UNBAN", "UNBAR", "UNBED", + "UNBID", "UNBOX", "UNCAP", "UNCES", "UNCIA", "UNCOS", "UNCOY", "UNCUS", "UNDAM", "UNDEE", "UNDOS", "UNDUG", + "UNETH", "UNFIX", "UNGAG", "UNGET", "UNGOD", "UNGOT", "UNGUM", "UNHAT", "UNHIP", "UNICA", "UNITS", "UNJAM", + "UNKED", "UNKET", "UNKID", "UNLAW", "UNLAY", "UNLED", "UNLET", "UNLID", "UNMAN", "UNMEW", "UNMIX", "UNPAY", + "UNPEG", "UNPEN", "UNPIN", "UNRED", "UNRID", "UNRIG", "UNRIP", "UNSAW", "UNSAY", "UNSEE", "UNSEW", "UNSEX", + "UNSOD", "UNTAX", "UNTIN", "UNWET", "UNWIT", "UNWON", "UPBOW", "UPBYE", "UPDOS", "UPDRY", "UPEND", "UPJET", + "UPLAY", "UPLED", "UPLIT", "UPPED", "UPRAN", "UPRUN", "UPSEE", "UPSEY", "UPTAK", "UPTER", "UPTIE", "URAEI", + "URALI", "URAOS", "URARE", "URARI", "URASE", "URATE", "URBEX", "URBIA", "URDEE", "UREAL", "UREAS", "UREDO", + "UREIC", "URENA", "URENT", "URGED", "URGER", "URGES", "URIAL", "URITE", "URMAN", "URNAL", "URNED", "URPED", + "URSAE", "URSID", "URSON", "URUBU", "URVAS", "USERS", "USNEA", "USQUE", "USURE", "USURY", "UTERI", "UVEAL", + "UVEAS", "UVULA", "VACUA", "VADED", "VADES", "VAGAL", "VAGUS", "VAILS", "VAIRE", "VAIRS", "VAIRY", "VAKAS", + "VAKIL", "VALES", "VALIS", "VALSE", "VAMPS", "VAMPY", "VANDA", "VANED", "VANES", "VANGS", "VANTS", "VAPED", + "VAPER", "VAPES", "VARAN", "VARAS", "VARDY", "VAREC", "VARES", "VARIA", "VARIX", "VARNA", "VARUS", "VARVE", + "VASAL", "VASES", "VASTS", "VASTY", "VATIC", "VATUS", "VAUCH", "VAUTE", "VAUTS", "VAWTE", "VAXES", "VEALE", + "VEALS", "VEALY", "VEENA", "VEEPS", "VEERS", "VEERY", "VEGAS", "VEGES", "VEGIE", "VEGOS", "VEHME", "VEILS", + "VEILY", "VEINS", "VEINY", "VELAR", "VELDS", "VELDT", "VELES", "VELLS", "VELUM", "VENAE", "VENAL", "VENDS", + "VENDU", "VENEY", "VENGE", "VENIN", "VENTS", "VENUS", "VERBS", "VERRA", "VERRY", "VERST", "VERTS", "VERTU", + "VESPA", "VESTA", "VESTS", "VETCH", "VEXED", "VEXER", "VEXES", "VEXIL", "VEZIR", "VIALS", "VIAND", "VIBES", + "VIBEX", "VIBEY", "VICED", "VICES", "VICHY", "VIERS", "VIEWS", "VIEWY", "VIFDA", "VIFFS", "VIGAS", "VIGIA", + "VILDE", "VILER", "VILLI", "VILLS", "VIMEN", "VINAL", "VINAS", "VINCA", "VINED", "VINER", "VINES", "VINEW", + "VINIC", "VINOS", "VINTS", "VIOLD", "VIOLS", "VIRED", "VIREO", "VIRES", "VIRGA", "VIRGE", "VIRID", "VIRLS", + "VIRTU", "VISAS", "VISED", "VISES", "VISIE", "VISNE", "VISON", "VISTO", "VITAE", "VITAS", "VITEX", "VITRO", + "VITTA", "VIVAS", "VIVAT", "VIVDA", "VIVER", "VIVES", "VIZIR", "VIZOR", "VLEIS", "VLIES", "VLOGS", "VOARS", + "VOCAB", "VOCES", "VODDY", "VODOU", "VODUN", "VOEMA", "VOGIE", "VOIDS", "VOILE", "VOIPS", "VOLAE", "VOLAR", + "VOLED", "VOLES", "VOLET", "VOLKS", "VOLTA", "VOLTE", "VOLTI", "VOLTS", "VOLVA", "VOLVE", "VOMER", "VOTED", + "VOTES", "VOUGE", "VOULU", "VOWED", "VOWER", "VOXEL", "VOZHD", "VRAIC", "VRILS", "VROOM", "VROUS", "VROUW", + "VROWS", "VUGGS", "VUGGY", "VUGHS", "VUGHY", "VULGO", "VULNS", "VULVA", "VUTTY", "WAACS", "WACKE", "WACKO", + "WACKS", "WADDS", "WADDY", "WADED", "WADER", "WADES", "WADGE", "WADIS", "WADTS", "WAFFS", "WAFTS", "WAGED", + "WAGES", "WAGGA", "WAGYU", "WAHOO", "WAIDE", "WAIFS", "WAIFT", "WAILS", "WAINS", "WAIRS", "WAITE", "WAITS", + "WAKAS", "WAKED", "WAKEN", "WAKER", "WAKES", "WAKFS", "WALDO", "WALDS", "WALED", "WALER", "WALES", "WALIE", + "WALIS", "WALKS", "WALLA", "WALLS", "WALLY", "WALTY", "WAMED", "WAMES", "WAMUS", "WANDS", "WANED", "WANES", + "WANEY", "WANGS", "WANKS", "WANKY", "WANLE", "WANLY", "WANNA", "WANTS", "WANTY", "WANZE", "WAQFS", "WARBS", + "WARBY", "WARDS", "WARED", "WARES", "WAREZ", "WARKS", "WARMS", "WARNS", "WARPS", "WARRE", "WARST", "WARTS", + "WASES", "WASHY", "WASMS", "WASPS", "WASPY", "WASTS", "WATAP", "WATTS", "WAUFF", "WAUGH", "WAUKS", "WAULK", + "WAULS", "WAURS", "WAVED", "WAVES", "WAVEY", "WAWAS", "WAWES", "WAWLS", "WAXED", "WAXER", "WAXES", "WAYED", + "WAZIR", "WAZOO", "WEALD", "WEALS", "WEAMB", "WEANS", "WEARS", "WEBBY", "WEBER", "WECHT", "WEDEL", "WEDGY", + "WEEDS", "WEEKE", "WEEKS", "WEELS", "WEEMS", "WEENS", "WEENY", "WEEPS", "WEEPY", "WEEST", "WEETE", "WEETS", + "WEFTE", "WEFTS", "WEIDS", "WEILS", "WEIRS", "WEISE", "WEIZE", "WEKAS", "WELDS", "WELKE", "WELKS", "WELKT", + "WELLS", "WELLY", "WELTS", "WEMBS", "WENCH", "WENDS", "WENGE", "WENNY", "WENTS", "WEROS", "WERSH", "WESTS", + "WETAS", "WETLY", "WEXED", "WEXES", "WHAMO", "WHAMS", "WHANG", "WHAPS", "WHARE", "WHATA", "WHATS", "WHAUP", + "WHAUR", "WHEAL", "WHEAR", "WHEEN", "WHEEP", "WHEFT", "WHELK", "WHELM", "WHENS", "WHETS", "WHEWS", "WHEYS", + "WHIDS", "WHIFT", "WHIGS", "WHILK", "WHIMS", "WHINS", "WHIOS", "WHIPS", "WHIPT", "WHIRR", "WHIRS", "WHISH", + "WHISS", "WHIST", "WHITS", "WHITY", "WHIZZ", "WHOMP", "WHOOF", "WHOOT", "WHOPS", "WHORE", "WHORL", "WHORT", + "WHOSO", "WHOWS", "WHUMP", "WHUPS", "WHYDA", "WICCA", "WICKS", "WICKY", "WIDDY", "WIDES", "WIELS", "WIFED", + "WIFES", "WIFEY", "WIFIE", "WIFTY", "WIGAN", "WIGGA", "WIGGY", "WIKIS", "WILCO", "WILDS", "WILED", "WILES", + "WILGA", "WILIS", "WILJA", "WILLS", "WILTS", "WIMPS", "WINDS", "WINED", "WINES", "WINEY", "WINGE", "WINGS", + "WINGY", "WINKS", "WINNA", "WINNS", "WINOS", "WINZE", "WIPED", "WIPER", "WIPES", "WIRED", "WIRER", "WIRES", + "WIRRA", "WISED", "WISES", "WISHA", "WISHT", "WISPS", "WISTS", "WITAN", "WITED", "WITES", "WITHE", "WITHS", + "WITHY", "WIVED", "WIVER", "WIVES", "WIZEN", "WIZES", "WOADS", "WOALD", "WOCKS", "WODGE", "WOFUL", "WOJUS", + "WOKER", "WOKKA", "WOLDS", "WOLFS", "WOLLY", "WOLVE", "WOMBS", "WOMBY", "WOMYN", "WONGA", "WONGI", "WONKS", + "WONKY", "WONTS", "WOODS", "WOOED", "WOOFS", "WOOFY", "WOOLD", "WOOLS", "WOONS", "WOOPS", "WOOPY", "WOOSE", + "WOOSH", "WOOTZ", "WORDS", "WORKS", "WORMS", "WORMY", "WORTS", "WOWED", "WOWEE", "WOXEN", "WRANG", "WRAPS", + "WRAPT", "WRAST", "WRATE", "WRAWL", "WRENS", "WRICK", "WRIED", "WRIER", "WRIES", "WRITS", "WROKE", "WROOT", + "WROTH", "WRYER", "WUDDY", "WUDUS", "WULLS", "WURST", "WUSES", "WUSHU", "WUSSY", "WUXIA", "WYLED", "WYLES", + "WYNDS", "WYNNS", "WYTED", "WYTES", "XEBEC", "XENIA", "XENIC", "XENON", "XERIC", "XEROX", "XERUS", "XOANA", + "XRAYS", "XYLAN", "XYLEM", "XYLIC", "XYLOL", "XYLYL", "XYSTI", "XYSTS", "YAARS", "YABAS", "YABBA", "YABBY", + "YACCA", "YACKA", "YACKS", "YAFFS", "YAGER", "YAGES", "YAGIS", "YAHOO", "YAIRD", "YAKKA", "YAKOW", "YALES", + "YAMEN", "YAMPY", "YAMUN", "YANGS", "YANKS", "YAPOK", "YAPON", "YAPPS", "YAPPY", "YARAK", "YARCO", "YARDS", + "YARER", "YARFA", "YARKS", "YARNS", "YARRS", "YARTA", "YARTO", "YATES", "YAUDS", "YAULD", "YAUPS", "YAWED", + "YAWEY", "YAWLS", "YAWNS", "YAWNY", "YAWPS", "YBORE", "YCLAD", "YCLED", "YCOND", "YDRAD", "YDRED", "YEADS", + "YEAHS", "YEALM", "YEANS", "YEARD", "YEARS", "YECCH", "YECHS", "YECHY", "YEDES", "YEEDS", "YEESH", "YEGGS", + "YELKS", "YELLS", "YELMS", "YELPS", "YELTS", "YENTA", "YENTE", "YERBA", "YERDS", "YERKS", "YESES", "YESKS", + "YESTS", "YESTY", "YETIS", "YETTS", "YEUKS", "YEUKY", "YEVEN", "YEVES", "YEWEN", "YEXED", "YEXES", "YFERE", + "YIKED", "YIKES", "YILLS", "YINCE", "YIPES", "YIPPY", "YIRDS", "YIRKS", "YIRRS", "YIRTH", "YITES", "YITIE", + "YLEMS", "YLIKE", "YLKES", "YMOLT", "YMPES", "YOBBO", "YOBBY", "YOCKS", "YODEL", "YODHS", "YODLE", "YOGAS", + "YOGEE", "YOGHS", "YOGIC", "YOGIN", "YOGIS", "YOICK", "YOJAN", "YOKED", "YOKEL", "YOKER", "YOKES", "YOKUL", + "YOLKS", "YOLKY", "YOMIM", "YOMPS", "YONIC", "YONIS", "YONKS", "YOOFS", "YOOPS", "YORES", "YORKS", "YORPS", + "YOUKS", "YOURN", "YOURS", "YOURT", "YOUSE", "YOWED", "YOWES", "YOWIE", "YOWLS", "YOWZA", "YRAPT", "YRENT", + "YRIVD", "YRNEH", "YSAME", "YTOST", "YUANS", "YUCAS", "YUCCA", "YUCCH", "YUCKO", "YUCKS", "YUCKY", "YUFTS", + "YUGAS", "YUKED", "YUKES", "YUKKY", "YUKOS", "YULAN", "YULES", "YUMMO", "YUMMY", "YUMPS", "YUPON", "YUPPY", + "YURTA", "YURTS", "YUZUS", "ZABRA", "ZACKS", "ZAIDA", "ZAIDY", "ZAIRE", "ZAKAT", "ZAMAN", "ZAMBO", "ZAMIA", + "ZANJA", "ZANTE", "ZANZA", "ZANZE", "ZAPPY", "ZARFS", "ZARIS", "ZATIS", "ZAXES", "ZAYIN", "ZAZEN", "ZEALS", + "ZEBEC", "ZEBUB", "ZEBUS", "ZEDAS", "ZEINS", "ZENDO", "ZERDA", "ZERKS", "ZEROS", "ZESTS", "ZETAS", "ZEXES", + "ZEZES", "ZHOMO", "ZIBET", "ZIFFS", "ZIGAN", "ZILAS", "ZILCH", "ZILLA", "ZILLS", "ZIMBI", "ZIMBS", "ZINCO", + "ZINCS", "ZINCY", "ZINEB", "ZINES", "ZINGS", "ZINGY", "ZINKE", "ZINKY", "ZIPPO", "ZIPPY", "ZIRAM", "ZITIS", + "ZIZEL", "ZIZIT", "ZLOTE", "ZLOTY", "ZOAEA", "ZOBOS", "ZOBUS", "ZOCCO", "ZOEAE", "ZOEAL", "ZOEAS", "ZOISM", + "ZOIST", "ZOMBI", "ZONAE", "ZONDA", "ZONED", "ZONER", "ZONES", "ZONKS", "ZOOEA", "ZOOEY", "ZOOID", "ZOOKS", + "ZOOMS", "ZOONS", "ZOOTY", "ZOPPA", "ZOPPO", "ZORIL", "ZORIS", "ZORRO", "ZOUKS", "ZOWEE", "ZOWIE", "ZULUS", + "ZUPAN", "ZUPAS", "ZUPPA", "ZURFS", "ZUZIM", "ZYGAL", "ZYGON", "ZYMES", "ZYMIC", ] alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] -def most_used_letters(words=legal_list): +def most_used_letters(words=valid_list): ''' Outputs how many times each letter is used in the words array. ''' - dicto = {} + use_each_letter = {} for i in alphabet: count = 0 for word in words: @@ -955,31 +1103,32 @@ def most_used_letters(words=legal_list): if i.upper() == letter.upper(): count+=1 break - dicto[i] = count - dicto = dict(sorted(dicto.items(), key=lambda item: item[1], reverse=True)) - print("Letter | Usage") - print("--------------") - for k in dicto: - print(f"{k.upper()} | {dicto[k]}") + use_each_letter[i] = count + use_each_letter = dict(sorted(use_each_letter.items(), key=lambda item: item[1], reverse=True)) + print("Letter | Usage | Percent") + print("----------------------------") + for k in use_each_letter: + print(f"{k.upper()} | {use_each_letter[k]:5} | {round((100 * use_each_letter[k]) / len(words)):2}%") + return use_each_letter -def list_of_valid_words(letters, words=legal_list): +def list_of_valid_words(letters, words=valid_list): ''' Outputs the array of valid words that can be made with the combination of letters. ''' letters = sorted(letters) for i, letter in enumerate(letters): # Force all letters to be capitalized letters[i] = letter.upper() - legal_words = [] + valid_words = [] for word in words: valid_word = True for letter in word: if letter.upper() not in letters: valid_word = False break - if valid_word and word not in legal_words: - legal_words.append(word) - return legal_words + if valid_word and word not in valid_words: + valid_words.append(word) + return valid_words def rearrange_words_by_uniqueness(words): @@ -997,52 +1146,56 @@ def capitalize_all_and_remove_duplicates(arr): return arr +def clean_chars(string): + # D looks bad on the watch when d does not. + string = string.replace('D', 'd') + return string + + def print_valid_words(letters=alphabet): ''' Prints the array of valid words that the wordle_face.c can use ''' items_per_row = 9 - legal_words = list_of_valid_words(letters, legal_list) - legal_words = capitalize_all_and_remove_duplicates(legal_words) - random.shuffle(legal_words) + valid_words = list_of_valid_words(letters, valid_list) + valid_words = capitalize_all_and_remove_duplicates(valid_words) + random.shuffle(valid_words) # Just in case the watch's random function is too pseudo, better to shuffle th elist so it's less likely to always have the same starting letter - legal_words, num_uniq = rearrange_words_by_uniqueness(legal_words) + valid_words, num_uniq = rearrange_words_by_uniqueness(valid_words) print("static const char _valid_letters[] = {", end='') + letters = sorted(letters) for letter in letters[:-1]: - print(f"'{letter}', ", end='') + print(f"'{clean_chars(letter)}', ", end='') print(f"'{letters[-1]}'" + "};") print("") - print("// From: https://gist.github.com/shmookey/b28e342e1b1756c4700f42f17102c2ff") - print(f"// Number of words found: {len(legal_words)}") + print(f"// From: {source_link}") + print(f"// Number of words found: {len(valid_words)}") i = 0 - print("static const char _legal_words[][WORDLE_LENGTH + 1] = {") - while i < len(legal_words): + print("static const char _valid_words[][WORDLE_LENGTH + 1] = {") + while i < len(valid_words): print(" ", end='') - for _ in range(min(items_per_row, len(legal_words)-i)): - print(f'"{legal_words[i]}", ', end='') + for _ in range(min(items_per_row, len(valid_words)-i)): + print(f'"{clean_chars(valid_words[i])}", ', end='') i+=1 print('') - print("};\n") - - expanded_words = list_of_valid_words(letters, expanded_list) - expanded_words = [word for word in expanded_words if word not in legal_list] - expanded_words = capitalize_all_and_remove_duplicates(expanded_words) - - print("// These are words that'll never be used, but still need to be in the dictionary for guesses.") - print("// Top 100K most common words from Wiktionary https://gist.github.com/h3xx/1976236") - print(f"// Number of words found: {len(expanded_words)}") + possible_words = list_of_valid_words(letters, possible_list) + possible_words = [word for word in possible_words if word not in valid_list] + possible_words = capitalize_all_and_remove_duplicates(possible_words) + print("};") + print("\n// These are words that'll never be used, but still need to be in the dictionary for guesses.") + print("static const char _possible_words[][WORDLE_LENGTH + 1] = {") i = 0 - print("static const char _expanded_words[][WORDLE_LENGTH + 1] = {") - while i < len(expanded_words): + while i < len(possible_words): print(" ", end='') - for j in range(min(items_per_row, len(expanded_words)-i)): - print(f'"{expanded_words[i]}", ', end='') + for j in range(min(items_per_row, len(possible_words)-i)): + print(f'"{clean_chars(possible_words[i])}", ', end='') i+=1 print('') print("};") + print('') - print(f"\nstatic const uint16_t _num_unique_words = {num_uniq}; // The _legal_words array begins with this many words where each letter is different.") + print(f"\nstatic const uint16_t _num_unique_words = {num_uniq}; // The _valid_words array begins with this many words where each letter is different.") def get_sec_val_and_units(seconds): @@ -1059,28 +1212,33 @@ def get_sec_val_and_units(seconds): return f"{secs} sec" -def txt_of_all_letter_combos(num_letters_in_set): +def txt_of_all_letter_combos(num_letters_in_set, words=valid_list, min_letter_occ_percent_to_consider=10, txt_out=True): ''' Creates a txt file that shows every combination of letters and how many words their combo can make. num_letters_in_set - How many letters should be in each combination - ''' + ''' num_status_prints = 100 dict_combos_counts = {} print_iter = 0 prev = time.time() start = prev - letters_to_ignore = ['D','T'] # Don't diplay well on the watch - legal_letters = [item for item in alphabet if item not in letters_to_ignore] - print(f"Finding all {num_letters_in_set} letter combinations with the following letters: {legal_letters}") - all_combos = list(itertools.combinations(legal_letters, num_letters_in_set)) + letters_to_ignore = ['D','M','T','Y'] # Don't diplay well on the watch + letter_usage = most_used_letters(words=words) + for letter in letter_usage: + if (100 * letter_usage[letter])/len(words) < min_letter_occ_percent_to_consider: + letters_to_ignore.append(letter) + valid_letters = [item for item in alphabet if item not in letters_to_ignore] + num_letters_in_set = min(num_letters_in_set, len(valid_letters)) + print(f"Finding all {num_letters_in_set} letter combinations with the following letters: {valid_letters}") + all_combos = list(itertools.combinations(valid_letters, num_letters_in_set)) len_all_combos = len(all_combos) to_print = max(1, int(len_all_combos/ num_status_prints)) print(f"Amount of Combos: {len_all_combos}") estimated_prints = round(len_all_combos / to_print) for i, letters in enumerate(all_combos): letters = sorted(letters) - dict_combos_counts[repr(letters)] = len(list_of_valid_words(letters)) + dict_combos_counts[repr(letters)] = len(list_of_valid_words(letters, words=words)) print_iter+=1 if print_iter >= to_print: curr = time.time() @@ -1100,15 +1258,53 @@ def txt_of_all_letter_combos(num_letters_in_set): dict_combos_counts = dict(sorted(dict_combos_counts.items(), key=lambda item: item[1], reverse=True)) most_common_key = next(iter(dict_combos_counts)) - print(f"The Most Common Combo is: {most_common_key}") - print_valid_words(ast.literal_eval(most_common_key)) + print(f"The Most Common Combo is: {most_common_key} with {dict_combos_counts[most_common_key]} words.") + # print_valid_words(ast.literal_eval(most_common_key)) # Uncomment to display the text it creates - with open('output.txt', 'w') as file: - for key, value in dict_combos_counts.items(): - file.write(f'{key}: {value}\n') + if txt_out: + with open('output.txt', 'w') as file: + for key, value in dict_combos_counts.items(): + file.write(f'{key}: {value}\n') + return dict_combos_counts + + +def txt_of_all_letter_combos_differing_sizes(min=9, max=15, num_combos_print=20, words=valid_list): + max_each_count = {} + with open('output.txt', 'w') as file: + for x in range(max, min-1, -1): + dict_combos_counts = txt_of_all_letter_combos(x, words=words, min_letter_occ_percent_to_consider=10, txt_out=False) + file.write(f'{x} Letter Options\n') + for i, key in enumerate(dict_combos_counts): + file.write(f'{key}: {dict_combos_counts[key]}\n') + if i == 0: + max_each_count[x] = dict_combos_counts[key] + if i >= num_combos_print-1: + break + file.write('\n') + print("num_letters, count of words") + for key, item in max_each_count.items(): + print(f"{key}, {item}") + + +def location_of_letters(letters=alphabet, list=valid_list): + print(" 1 2 3 4 5 ") + print("-----------------------------------------") + letters = sorted(letters) + for letter in letters: + location = [0, 0, 0, 0, 0] + for word in list: + for i, char in enumerate(word): + if char.upper() == letter.upper(): + location[i]+=1 + location = [f"{round((100 * x) / sum(location)):2}%" for x in location] + print(f"{letter} : {location}") if __name__ == "__main__": + my_letters = ['A', 'C', 'E', 'G', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'S'] + #print(f"{len(list_of_valid_words(my_letters, valid_list))} Words can be made with {my_letters}") #most_used_letters() - print_valid_words(['A', 'C', 'E', 'I', 'L', 'N', 'O', 'P', 'R', 'S']) - #txt_of_all_letter_combos(10) \ No newline at end of file + #location_of_letters(my_letters) + print_valid_words(my_letters) + #txt_of_all_letter_combos_differing_sizes(max = 16, min=10) + #txt_of_all_letter_combos(14) \ No newline at end of file From 099f78443e2397db4b5ec39d7dbd27c910eee2aa Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Fri, 23 Aug 2024 16:48:09 -0400 Subject: [PATCH 32/53] Added ability to use T in Wordle --- .../watch_faces/complication/wordle_face.c | 462 ++++++++++-------- utils/wordle_face/wordle_list.py | 4 +- 2 files changed, 262 insertions(+), 204 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index f27ae4a0..260860b6 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -30,216 +30,274 @@ #endif -static const char _valid_letters[] = {'A', 'C', 'E', 'G', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'S'}; +static const char _valid_letters[] = {'A', 'C', 'E', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'S', 'T'}; // From: https://matthewminer.name/projects/calculators/wordle-words-left/ -// Number of words found: 298 +// Number of words found: 432 static const char _valid_words[][WORDLE_LENGTH + 1] = { - "PLACE", "SHONE", "POSER", "CHAIN", "CAPER", "POLAR", "LEARN", "SHORN", "PORCH", - "GRAPE", "GNASH", "CHAIR", "SCORE", "CIGAR", "GRASP", "SINCE", "SPIRE", "NEIGH", - "SHORE", "CHASE", "RAISE", "CAIRN", "PLIER", "LOSER", "GRACE", "LEASH", "PENAL", - "SLING", "RISEN", "LOGIC", "PRICE", "POISE", "SCALE", "SINGE", "SNARL", "LINER", - "ANGEL", "SNAIL", "PALER", "SCION", "ALONE", "AGILE", "APRON", "PERIL", "GRIPE", - "SPICE", "LOGIN", "REGAL", "CAROL", "SLICE", "CRONE", "LEACH", "COPSE", "SHEAR", - "ALIGN", "LARGE", "LAPSE", "AISLE", "NICER", "OCEAN", "OPERA", "ALIEN", "ACORN", - "ASHEN", "SHINE", "PANEL", "SPORE", "SCOPE", "SPACE", "PHASE", "AROSE", "CHOIR", - "SNIPE", "CHAOS", "RALPH", "EPOCH", "GRAIN", "SANER", "GROIN", "SLANG", "SLAIN", - "CRASH", "CLASP", "SHIRE", "SCONE", "ALONG", "APING", "NICHE", "CHEAP", "CHIRP", - "LAGER", "CHORE", "SNORE", "SHAPE", "RESIN", "PERCH", "PECAN", "GLARE", "GROAN", - "RHINO", "RENAL", "SALON", "GRAIL", "SEPIA", "LANCE", "PRONG", "RECAP", "CLONE", - "CLASH", "HORSE", "SOLAR", "HERON", "PEACH", "ARSON", "HINGE", "CLEAN", "CLING", - "PHONE", "CRANE", "CLANG", "SCORN", "SPEAR", "PLAIN", "PROSE", "SPOIL", "GONER", - "SHOAL", "REIGN", "CLEAR", "ANGER", "CHINA", "GRAPH", "PEARL", "CARGO", "CHOSE", - "SCALP", "CANOE", "RINSE", "RANGE", "LINGO", "RANCH", "PLANE", "SPINE", "REACH", - "CRISP", "PARSE", "RIPEN", "SNARE", "CLOSE", "SHARE", "CORAL", "NOISE", "SHARP", - "SPARE", "SONIC", "SCRAP", "SPIEL", "RELIC", "OPINE", "SCARE", "SPRIG", "SHALE", - "PANIC", "SONAR", "GROPE", "SLOPE", "ANGLE", "ORGAN", "PIANO", "PINCH", "GLEAN", - "PRONE", "ARISE", "ROACH", "SIREN", "CLASS", "POSSE", "INANE", "HENCE", "SNEER", - "PAGAN", "PREEN", "ROGER", "SPELL", "SHEEP", "SENSE", "INNER", "ALPHA", "SHEEN", - "SCREE", "CIRCA", "PRIOR", "RARER", "PEACE", "GENRE", "HELLO", "CACAO", "GORGE", - "GLOSS", "CRIER", "CROSS", "CREPE", "COLON", "CHILL", "ONION", "LINEN", "PIPER", - "SLOOP", "LEGAL", "SNOOP", "PAPER", "ALGAE", "LAPEL", "CHEER", "HIPPO", "PIECE", - "LILAC", "HONOR", "PAPAL", "ARENA", "APNEA", "RIPER", "SCENE", "SHALL", "NASAL", - "SPREE", "RIGOR", "EAGER", "LIEGE", "LEPER", "LEASE", "CORER", "SPOON", "GROSS", - "COACH", "CEASE", "GENIE", "HARSH", "PENCE", "CHILI", "SHELL", "CREEP", "RISER", - "ERASE", "CINCH", "SIEGE", "GOING", "SCOOP", "SPILL", "NOOSE", "EAGLE", "AGING", - "NIECE", "SPOOL", "APPLE", "SALSA", "LEECH", "GREEN", "IONIC", "LASSO", "CONCH", - "PENNE", "SLASH", "CANAL", "CRASS", "REPEL", "COCOA", "CRESS", "AGAPE", "EASEL", - "CELLO", "CONIC", "IGLOO", "RACER", "GOOSE", "ICING", "POOCH", "ILIAC", "GRASS", - "SHEER", "CANON", "ELOPE", "LOCAL", "EERIE", "COLOR", "AGREE", "PRESS", "GEESE", - "SLOSH", "SLEEP", "GRILL", "AGAIN", "GLASS", "PARER", "CHESS", "CACHE", "ERROR", - "LOOSE", + "STALE", "TRACE", "CLOSE", "ARISE", "SNIPE", "SHIRE", "LEASH", "SAINT", "CLEAN", + "RELIC", "CHORE", "CRONE", "REACH", "CHAOS", "TAPIR", "CAIRN", "TENOR", "STARE", + "HEART", "SCOPE", "SNARL", "SLEPT", "SINCE", "EPOCH", "SPACE", "SHARE", "SPOIL", + "LITER", "LEAPT", "LANCE", "RANCH", "HORSE", "LEACH", "LATER", "STEAL", "CHEAP", + "SHORT", "ETHIC", "CHANT", "ACTOR", "SPARE", "SEPIA", "ONSET", "SPLAT", "LEANT", + "REACT", "OCTAL", "SPORE", "IRATE", "CORAL", "NICER", "SPILT", "SCENT", "PANIC", + "SHIRT", "PECAN", "SLAIN", "SPLIT", "ROACH", "ASCOT", "PHONE", "LITHE", "STOIC", + "STRIP", "RENAL", "POISE", "ENACT", "CHEAT", "PITCH", "NOISE", "INLET", "PEARL", + "POLAR", "PEACH", "STOLE", "CASTE", "CREST", "SCARE", "ETHOS", "THEIR", "STONE", + "SLATE", "LATCH", "HASTE", "SNARE", "SPINE", "SLANT", "SPEAR", "SCALE", "CAPER", + "RETCH", "PESTO", "CHIRP", "SPORT", "OPTIC", "SNAIL", "PRICE", "PLANE", "TORCH", + "PASTE", "RECAP", "SOLAR", "CRASH", "LINER", "OPINE", "ASHEN", "PALER", "ECLAT", + "SPELT", "TRIAL", "PERIL", "SLICE", "SCANT", "RAISE", "POSIT", "ATONE", "SPIRE", + "COAST", "INEPT", "SHOAL", "CLASH", "THORN", "PHASE", "SCORE", "TRICE", "PERCH", + "PORCH", "SHEAR", "CHOIR", "RHINO", "PLANT", "SHONE", "SANER", "LEARN", "ALTER", + "CHAIN", "PANEL", "PLIER", "STEIN", "COPSE", "SONIC", "ALIEN", "CHOSE", "ACORN", + "ANTIC", "CHEST", "OTHER", "CHINA", "TALON", "SCORN", "PLAIN", "PILOT", "RIPEN", + "PATCH", "SPICE", "CLONE", "SCION", "SCONE", "STRAP", "PARSE", "SHALE", "RISEN", + "CANOE", "INTER", "CRATE", "ISLET", "PRINT", "SHINE", "NORTH", "CLEAT", "PLAIT", + "SCRAP", "CLEAR", "SLOTH", "LAPSE", "CHAIR", "SNORT", "SHARP", "OPERA", "STAIN", + "TEACH", "TRAIL", "TRAIN", "LATHE", "PIANO", "PINCH", "PETAL", "STERN", "PRONE", + "PROSE", "PLEAT", "TROPE", "PLACE", "POSER", "INERT", "CHASE", "CAROL", "STAIR", + "SATIN", "SPITE", "LOATH", "ROAST", "ARSON", "SHAPE", "CLASP", "LOSER", "SALON", + "CATER", "SHALT", "INTRO", "ALERT", "PENAL", "SHORE", "RINSE", "CREPT", "APRON", + "SONAR", "AISLE", "AROSE", "HATER", "NICHE", "POINT", "EARTH", "PINTO", "THOSE", + "CLOTH", "NOTCH", "TOPIC", "RESIN", "SCALP", "HEIST", "HERON", "TRIPE", "TONAL", + "TAPER", "SHORN", "TONIC", "HOIST", "SNORE", "STORE", "SLOPE", "OCEAN", "CHART", + "PAINT", "SPENT", "CRANE", "CRISP", "TRASH", "PATIO", "PLATE", "HOTEL", "LEAST", + "ALONE", "RALPH", "SPIEL", "SIREN", "RATIO", "STOOP", "TROLL", "ATOLL", "SLASH", + "RETRO", "CREEP", "STILT", "SPREE", "TASTE", "CACHE", "CANON", "EATEN", "TEPEE", + "SHEET", "SNEER", "ERROR", "NATAL", "SLEEP", "STINT", "TROOP", "SHALL", "STALL", + "PIPER", "TOAST", "NASAL", "CORER", "THERE", "POOCH", "SCREE", "ELITE", "ALTAR", + "PENCE", "EATER", "ALPHA", "TENTH", "LINEN", "SHEER", "TAINT", "HEATH", "CRIER", + "TENSE", "CARAT", "CANAL", "APNEA", "THESE", "HATCH", "SHELL", "CIRCA", "APART", + "SPILL", "STEEL", "LOCAL", "STOOL", "SHEEN", "RESET", "STEEP", "ELATE", "PRESS", + "SLEET", "CROSS", "TOTAL", "TREAT", "ONION", "STATE", "CINCH", "ASSET", "THREE", + "TORSO", "SNOOP", "PENNE", "SPOON", "SHEEP", "PAPAL", "STILL", "CHILL", "THETA", + "LEECH", "INNER", "HONOR", "LOOSE", "CONIC", "SCENE", "COACH", "CONCH", "LATTE", + "ERASE", "ESTER", "PEACE", "PASTA", "INANE", "SPOOL", "TEASE", "HARSH", "PIECE", + "STEER", "SCOOP", "NINTH", "OTTER", "OCTET", "EERIE", "RISER", "LAPEL", "HIPPO", + "PREEN", "ETHER", "AORTA", "SENSE", "TRACT", "SHOOT", "SLOOP", "REPEL", "TITHE", + "IONIC", "CELLO", "CHESS", "SOOTH", "COCOA", "TITAN", "TOOTH", "TIARA", "CRESS", + "SLOSH", "RARER", "TERSE", "ERECT", "HELLO", "PARER", "RIPER", "NOOSE", "CREPE", + "CACAO", "ILIAC", "POSSE", "CACTI", "EASEL", "LASSO", "ROOST", "ALLOT", "COLON", + "LEPER", "TEETH", "TITLE", "HENCE", "NIECE", "PAPER", "TRITE", "SPELL", "RACER", + "ATTIC", "CRASS", "HITCH", "LEASE", "CEASE", "ROTOR", "ELOPE", "APPLE", "CHILI", + "START", "PHOTO", "SALSA", "STASH", "PRIOR", "TAROT", "COLOR", "CHEER", "CLASS", + "ARENA", "ELECT", "ENTER", "CATCH", "TENET", "TACIT", "TRAIT", "TERRA", "LILAC", }; // These are words that'll never be used, but still need to be in the dictionary for guesses. static const char _possible_words[][WORDLE_LENGTH + 1] = { - "AALII", "AARGH", "ACAIS", "ACARI", "ACCAS", "ACERS", "ACHAR", "ACHES", "ACHOO", - "ACING", "ACINI", "ACNES", "ACRES", "ACROS", "AECIA", "AEGIS", "AEONS", "AERIE", - "AEROS", "AESIR", "AGARS", "AGENE", "AGERS", "AGGER", "AGGIE", "AGGRI", "AGGRO", - "AGHAS", "AGILA", "AGIOS", "AGLEE", "AGLOO", "AGOGE", "AGONE", "AGONS", "AGORA", - "AGRIA", "AGRIN", "AGROS", "AHEAP", "AHIGH", "AHING", "AIGAS", "AINEE", "AINGA", - "AIOLI", "AIRER", "AIRNS", "ALAAP", "ALANE", "ALANG", "ALANS", "ALAPA", "ALAPS", - "ALCOS", "ALECS", "ALEPH", "ALGAL", "ALGAS", "ALGIN", "ALGOR", "ALIAS", "ALINE", - "ALLEE", "ALLEL", "ALLIS", "ALOES", "ALOHA", "ALOIN", "ALOOS", "ANANA", "ANCHO", - "ANCLE", "ANCON", "ANEAR", "ANELE", "ANGAS", "ANGLO", "ANIGH", "ANILE", "ANILS", - "ANION", "ANISE", "ANLAS", "ANNAL", "ANNAS", "ANOAS", "ANOLE", "ANSAE", "APACE", - "APAGE", "APERS", "APGAR", "APHIS", "APIAN", "APIOL", "APISH", "APOOP", "APPAL", - "APPEL", "APPRO", "APRES", "APSES", "APSIS", "APSOS", "ARARS", "ARCHI", "ARCOS", + "AALII", "AARTI", "ACAIS", "ACARI", "ACCAS", "ACERS", "ACETA", "ACHAR", "ACHES", + "ACHOO", "ACINI", "ACNES", "ACRES", "ACROS", "ACTIN", "ACTON", "AECIA", "AEONS", + "AERIE", "AEROS", "AESIR", "AHEAP", "AHENT", "AHINT", "AINEE", "AIOLI", "AIRER", + "AIRNS", "AIRTH", "AIRTS", "AITCH", "ALAAP", "ALANE", "ALANS", "ALANT", "ALAPA", + "ALAPS", "ALATE", "ALCOS", "ALECS", "ALEPH", "ALIAS", "ALINE", "ALIST", "ALLEE", + "ALLEL", "ALLIS", "ALOES", "ALOHA", "ALOIN", "ALOOS", "ALTHO", "ALTOS", "ANANA", + "ANATA", "ANCHO", "ANCLE", "ANCON", "ANEAR", "ANELE", "ANENT", "ANILE", "ANILS", + "ANION", "ANISE", "ANLAS", "ANNAL", "ANNAS", "ANNAT", "ANOAS", "ANOLE", "ANSAE", + "ANTAE", "ANTAR", "ANTAS", "ANTES", "ANTIS", "ANTRA", "ANTRE", "APACE", "APERS", + "APERT", "APHIS", "APIAN", "APIOL", "APISH", "APOOP", "APORT", "APPAL", "APPEL", + "APPRO", "APRES", "APSES", "APSIS", "APSOS", "APTER", "ARARS", "ARCHI", "ARCOS", "AREAE", "AREAL", "AREAR", "AREAS", "ARECA", "AREIC", "ARENE", "AREPA", "ARERE", - "ARGAL", "ARGAN", "ARGIL", "ARGLE", "ARGOL", "ARGON", "ARIAS", "ARIEL", "ARILS", - "ARISH", "ARLES", "ARNAS", "AROHA", "ARPAS", "ARPEN", "ARRAH", "ARRAS", "ARRIS", - "ARSES", "ARSIS", "ASANA", "ASCON", "ASHES", "ASPEN", "ASPER", "ASPIC", "ASPIE", - "ASPIS", "ASPRO", "ASSAI", "ASSES", "CACAS", "CAECA", "CAESE", "CAGER", "CAGES", - "CAINS", "CALLA", "CALLS", "CALOS", "CALPA", "CALPS", "CANEH", "CANER", "CANES", - "CANGS", "CANNA", "CANNS", "CANSO", "CAPAS", "CAPES", "CAPHS", "CAPLE", "CAPON", - "CAPOS", "CAPRI", "CARAP", "CARER", "CARES", "CARLE", "CARLS", "CARNS", "CARON", - "CARPI", "CARPS", "CARRS", "CARSE", "CASAS", "CASCO", "CASES", "CECAL", "CEILI", - "CEILS", "CELLA", "CELLI", "CELLS", "CENSE", "CEORL", "CEPES", "CERCI", "CERES", - "CERGE", "CERIA", "CERIC", "CERNE", "CEROC", "CEROS", "CESSE", "CHACE", "CHACO", - "CHAIS", "CHALS", "CHANA", "CHANG", "CHAPE", "CHAPS", "CHARA", "CHARE", "CHARR", - "CHARS", "CHEEP", "CHELA", "CHELP", "CHERE", "CHIAO", "CHIAS", "CHICA", "CHICH", - "CHICO", "CHICS", "CHIEL", "CHILE", "CHINE", "CHING", "CHINO", "CHINS", "CHIPS", - "CHIRL", "CHIRO", "CHIRR", "CHOCO", "CHOCS", "CHOGS", "CHOIL", "CHOLA", "CHOLI", - "CHOLO", "CHONS", "CHOON", "CHOPS", "CIELS", "CILIA", "CILLS", "CINES", "CIONS", - "CIPPI", "CIRCS", "CIRES", "CIRLS", "CIRRI", "CISCO", "CLACH", "CLAES", "CLAGS", - "CLANS", "CLAPS", "CLARO", "CLEEP", "CLEGS", "CLEPE", "CLIES", "CLINE", "CLIPE", - "CLIPS", "CLOGS", "CLONS", "CLOOP", "CLOPS", "COALA", "COALS", "COCAS", "COCCI", - "COCCO", "COCOS", "COGIE", "COGON", "COHEN", "COHOE", "COHOG", "COHOS", "COIGN", - "COILS", "COINS", "COIRS", "COLAS", "COLES", "COLIC", "COLIN", "COLLS", "COLOG", - "CONES", "CONGA", "CONGE", "CONGO", "CONIA", "CONIN", "CONNE", "CONNS", "COOCH", - "COOEE", "COOER", "COOLS", "COONS", "COOPS", "COPAL", "COPEN", "COPER", "COPES", - "COPRA", "CORES", "CORGI", "CORIA", "CORNI", "CORNO", "CORNS", "CORPS", "CORSE", - "CORSO", "COSEC", "COSES", "COSIE", "CRAAL", "CRAGS", "CRAIC", "CRAIG", "CRANS", - "CRAPE", "CRAPS", "CRARE", "CREEL", "CREES", "CRENA", "CREPS", "CRIAS", "CRIES", - "CRINE", "CRIOS", "CRIPE", "CRIPS", "CRISE", "CROCI", "CROCS", "CROGS", "CRONS", - "CROOL", "CROON", "CROPS", "CRORE", "EAGRE", "EALES", "EARLS", "EARNS", "EASER", - "EASES", "EASLE", "ECHES", "ECHOS", "EGERS", "EGGAR", "EGGER", "EHING", "EIGNE", - "EISEL", "ELAIN", "ELANS", "ELCHI", "ELOGE", "ELOIN", "ELOPS", "ELPEE", "ELSIN", - "ENIAC", "ENNOG", "ENOLS", "ENROL", "EORLS", "EOSIN", "EPEES", "EPHAH", "EPHAS", - "EPHOR", "EPICS", "EPRIS", "ERGON", "ERGOS", "ERICA", "ERICS", "ERING", "ERNES", - "EROSE", "ERSES", "ESCAR", "ESILE", "ESNES", "ESSES", "GAGER", "GAGES", "GAINS", - "GAIRS", "GALAH", "GALAS", "GALEA", "GALES", "GALLS", "GALOP", "GANCH", "GANGS", - "GAOLS", "GAPER", "GAPES", "GAPOS", "GARES", "GARIS", "GARNI", "GARRE", "GASES", - "GASPS", "GEALS", "GEANS", "GEARE", "GEARS", "GEEPS", "GELEE", "GENAL", "GENAS", - "GENES", "GENIC", "GENII", "GENIP", "GENOA", "GENRO", "GERAH", "GERES", "GERLE", - "GERNE", "GESSE", "GESSO", "GHEES", "GIGAS", "GIGHE", "GILAS", "GILLS", "GINCH", - "GINGE", "GINGS", "GIPON", "GIPPO", "GIRLS", "GIRNS", "GIRON", "GIROS", "GIRRS", - "GIRSH", "GLACE", "GLAIR", "GLANS", "GLEES", "GLEIS", "GLENS", "GLIAL", "GLIAS", - "GLOGG", "GLOOP", "GLOPS", "GNARL", "GNARR", "GNARS", "GOALS", "GOELS", "GOERS", - "GOGGA", "GOGOS", "GOIER", "GOLES", "GOLPE", "GOLPS", "GONCH", "GONGS", "GONIA", - "GONNA", "GOOGS", "GOOLS", "GOONS", "GOOPS", "GOORS", "GORAL", "GORAS", "GORES", - "GORIS", "GORPS", "GORSE", "GOSSE", "GRAAL", "GRAIP", "GRANA", "GRANS", "GRECE", - "GREES", "GREGE", "GREGO", "GREIN", "GRENS", "GRESE", "GRICE", "GRIGS", "GRINS", - "GRIPS", "GRISE", "GROGS", "GRONE", "GRRLS", "GRRRL", "HAARS", "HAGGS", "HAHAS", - "HAILS", "HAINS", "HAIRS", "HALAL", "HALER", "HALES", "HALLO", "HALLS", "HALON", - "HALOS", "HALSE", "HANAP", "HANCE", "HANCH", "HANGI", "HANGS", "HANSA", "HANSE", - "HAOLE", "HAPPI", "HARES", "HARLS", "HARNS", "HAROS", "HARPS", "HASPS", "HEALS", - "HEAPS", "HEARE", "HEARS", "HEELS", "HEIGH", "HEILS", "HEIRS", "HELES", "HELIO", - "HELLS", "HELOS", "HELPS", "HENCH", "HENGE", "HENNA", "HEPAR", "HERES", "HERLS", - "HERNS", "HEROS", "HERSE", "HESPS", "HIGHS", "HILAR", "HILCH", "HILLO", "HILLS", - "HINGS", "HIOIS", "HIREE", "HIRER", "HIRES", "HOARS", "HOERS", "HOGAN", "HOGEN", - "HOGGS", "HOGHS", "HOING", "HOISE", "HOLES", "HOLLA", "HOLLO", "HOLON", "HOLOS", - "HONAN", "HONER", "HONES", "HONGI", "HONGS", "HOOCH", "HOONS", "HOOPS", "HOORS", - "HOOSH", "HOPER", "HOPES", "HORAH", "HORAL", "HORAS", "HORIS", "HORNS", "HOSEL", - "HOSEN", "HOSER", "HOSES", "ICERS", "ICHES", "ICHOR", "ICIER", "ICONS", "IGAPO", - "ILEAC", "ILEAL", "ILIAL", "ILLER", "INCEL", "INCLE", "INCOG", "INGAN", "INGLE", - "INION", "INSPO", "IPPON", "IRING", "IRONE", "IRONS", "ISHES", "ISLES", "ISNAE", - "ISSEI", "LAARI", "LACER", "LACES", "LAERS", "LAGAN", "LAHAL", "LAHAR", "LAICH", - "LAICS", "LAIGH", "LAIRS", "LALLS", "LANAI", "LANAS", "LANCH", "LANES", "LAPIN", - "LAPIS", "LARCH", "LAREE", "LARES", "LARGO", "LARIS", "LARNS", "LASER", "LASES", - "LASSI", "LEANS", "LEAPS", "LEARE", "LEARS", "LEEAR", "LEEPS", "LEERS", "LEESE", - "LEGER", "LEGES", "LEGGE", "LEGGO", "LEHRS", "LEIRS", "LEISH", "LENES", "LENGS", - "LENIS", "LENOS", "LENSE", "LEONE", "LEPRA", "LERES", "LERPS", "LESES", "LIANA", - "LIANE", "LIANG", "LIARS", "LICHI", "LIENS", "LIERS", "LIGAN", "LIGER", "LIGGE", - "LIGNE", "LILLS", "LILOS", "LINAC", "LINCH", "LINES", "LINGA", "LINGS", "LININ", - "LINNS", "LINOS", "LIONS", "LIPAS", "LIPES", "LIPIN", "LIPOS", "LIRAS", "LISLE", - "LISPS", "LLANO", "LOACH", "LOANS", "LOCHE", "LOCHS", "LOCIE", "LOCIS", "LOCOS", - "LOESS", "LOGAN", "LOGES", "LOGIA", "LOGIE", "LOGOI", "LOGON", "LOGOS", "LOHAN", - "LOINS", "LOIPE", "LOIRS", "LOLLS", "LOLOG", "LONER", "LONGA", "LONGE", "LONGS", - "LOOIE", "LOONS", "LOOPS", "LOPER", "LOPES", "LORAL", "LORAN", "LOREL", "LORES", - "LORIC", "LORIS", "LOSEL", "LOSEN", "LOSES", "NAANS", "NACHE", "NACHO", "NACRE", - "NAGAS", "NAGOR", "NAHAL", "NAILS", "NAIRA", "NALAS", "NALLA", "NANAS", "NANCE", - "NANNA", "NANOS", "NAPAS", "NAPES", "NAPOO", "NAPPA", "NAPPE", "NARAS", "NARCO", - "NARCS", "NARES", "NARIC", "NARIS", "NARRE", "NASHI", "NEALS", "NEAPS", "NEARS", - "NEELE", "NEEPS", "NEESE", "NEGRO", "NELIS", "NENES", "NEONS", "NEPER", "NERAL", - "NEROL", "NGAIO", "NGANA", "NICOL", "NIGER", "NIGHS", "NIHIL", "NILLS", "NINER", - "NINES", "NINON", "NIPAS", "NIRLS", "NISEI", "NISSE", "NOAHS", "NOELS", "NOGGS", - "NOILS", "NOIRS", "NOLES", "NOLLS", "NOLOS", "NONAS", "NONCE", "NONES", "NONGS", - "NONIS", "NOONS", "NOOPS", "NOPAL", "NORIA", "NORIS", "NOSER", "NOSES", "OASES", - "OASIS", "OCHER", "OCHES", "OCHRE", "OCREA", "OGEES", "OGGIN", "OGLER", "OGLES", - "OGRES", "OHIAS", "OHING", "OHONE", "OILER", "OLEIC", "OLEIN", "OLEOS", "OLIOS", - "OLLAS", "OLLER", "OLLIE", "OLPAE", "OLPES", "ONCER", "ONCES", "ONERS", "OORIE", - "OOSES", "OPAHS", "OPALS", "OPENS", "OPEPE", "OPING", "OPPOS", "OPSIN", "ORACH", - "ORALS", "ORANG", "ORCAS", "ORCIN", "ORGIA", "ORGIC", "ORIEL", "ORLES", "ORLON", - "ORLOP", "ORNIS", "ORPIN", "ORRIS", "OSCAR", "OSHAC", "OSIER", "OSSIA", "PAALS", - "PAANS", "PACAS", "PACER", "PACES", "PACHA", "PACOS", "PAEAN", "PAEON", "PAGER", - "PAGES", "PAGLE", "PAGRI", "PAILS", "PAINS", "PAIRE", "PAIRS", "PAISA", "PAISE", - "PALAS", "PALEA", "PALES", "PALIS", "PALLA", "PALLS", "PALPI", "PALPS", "PALSA", - "PANCE", "PANES", "PANGA", "PANGS", "PANNE", "PANNI", "PAOLI", "PAOLO", "PAPAS", - "PAPES", "PAPPI", "PARAE", "PARAS", "PARCH", "PAREN", "PAREO", "PARES", "PARGE", - "PARGO", "PARIS", "PARLE", "PAROL", "PARPS", "PARRA", "PARRS", "PASEO", "PASES", - "PASHA", "PASSE", "PEAGE", "PEAGS", "PEALS", "PEANS", "PEARE", "PEARS", "PEASE", - "PECHS", "PEECE", "PEELS", "PEENS", "PEEPE", "PEEPS", "PEERS", "PEGHS", "PEINS", - "PEISE", "PELAS", "PELES", "PELLS", "PELON", "PENES", "PENGO", "PENIE", "PENIS", - "PENNA", "PENNI", "PEONS", "PEPLA", "PEPOS", "PEPSI", "PERAI", "PERCE", "PERCS", - "PEREA", "PERES", "PERIS", "PERNS", "PEROG", "PERPS", "PERSE", "PESOS", "PHAGE", - "PHANG", "PHARE", "PHEER", "PHENE", "PHEON", "PHESE", "PHIAL", "PHISH", "PHOCA", - "PHONO", "PHONS", "PIANI", "PIANS", "PICAL", "PICAS", "PICRA", "PIERS", "PIING", + "ARETE", "ARETS", "ARETT", "ARHAT", "ARIAS", "ARIEL", "ARILS", "ARIOT", "ARISH", + "ARLES", "ARNAS", "AROHA", "ARPAS", "ARPEN", "ARRAH", "ARRAS", "ARRET", "ARRIS", + "ARSES", "ARSIS", "ARTAL", "ARTEL", "ARTIC", "ARTIS", "ASANA", "ASCON", "ASHES", + "ASHET", "ASPEN", "ASPER", "ASPIC", "ASPIE", "ASPIS", "ASPRO", "ASSAI", "ASSES", + "ASSOT", "ASTER", "ASTIR", "ATAPS", "ATILT", "ATLAS", "ATOCS", "ATRIA", "ATRIP", + "ATTAP", "ATTAR", "CACAS", "CAECA", "CAESE", "CAINS", "CALLA", "CALLS", "CALOS", + "CALPA", "CALPS", "CANEH", "CANER", "CANES", "CANNA", "CANNS", "CANSO", "CANST", + "CANTO", "CANTS", "CAPAS", "CAPES", "CAPHS", "CAPLE", "CAPON", "CAPOS", "CAPOT", + "CAPRI", "CARAP", "CARER", "CARES", "CARET", "CARLE", "CARLS", "CARNS", "CARON", + "CARPI", "CARPS", "CARRS", "CARSE", "CARTA", "CARTE", "CARTS", "CASAS", "CASCO", + "CASES", "CASTS", "CATES", "CECAL", "CEILI", "CEILS", "CELLA", "CELLI", "CELLS", + "CELTS", "CENSE", "CENTO", "CENTS", "CEORL", "CEPES", "CERCI", "CERES", "CERIA", + "CERIC", "CERNE", "CEROC", "CEROS", "CERTS", "CESSE", "CESTA", "CESTI", "CETES", + "CHACE", "CHACO", "CHAIS", "CHALS", "CHANA", "CHAPE", "CHAPS", "CHAPT", "CHARA", + "CHARE", "CHARR", "CHARS", "CHATS", "CHEEP", "CHELA", "CHELP", "CHERE", "CHERT", + "CHETH", "CHIAO", "CHIAS", "CHICA", "CHICH", "CHICO", "CHICS", "CHIEL", "CHILE", + "CHINE", "CHINO", "CHINS", "CHIPS", "CHIRL", "CHIRO", "CHIRR", "CHIRT", "CHITS", + "CHOCO", "CHOCS", "CHOIL", "CHOLA", "CHOLI", "CHOLO", "CHONS", "CHOON", "CHOPS", + "CHOTA", "CHOTT", "CIELS", "CILIA", "CILLS", "CINCT", "CINES", "CIONS", "CIPPI", + "CIRCS", "CIRES", "CIRLS", "CIRRI", "CISCO", "CISTS", "CITAL", "CITER", "CITES", + "CLACH", "CLAES", "CLANS", "CLAPS", "CLAPT", "CLARO", "CLART", "CLAST", "CLATS", + "CLEEP", "CLEPE", "CLEPT", "CLIES", "CLINE", "CLINT", "CLIPE", "CLIPS", "CLIPT", + "CLITS", "CLONS", "CLOOP", "CLOOT", "CLOPS", "CLOTE", "CLOTS", "COACT", "COALA", + "COALS", "COAPT", "COATE", "COATI", "COATS", "COCAS", "COCCI", "COCCO", "COCOS", + "COHEN", "COHOE", "COHOS", "COILS", "COINS", "COIRS", "COITS", "COLAS", "COLES", + "COLIC", "COLIN", "COLLS", "COLTS", "CONES", "CONIA", "CONIN", "CONNE", "CONNS", + "CONTE", "CONTO", "COOCH", "COOEE", "COOER", "COOLS", "COONS", "COOPS", "COOPT", + "COOST", "COOTS", "COPAL", "COPEN", "COPER", "COPES", "COPRA", "CORES", "CORIA", + "CORNI", "CORNO", "CORNS", "CORPS", "CORSE", "CORSO", "COSEC", "COSES", "COSET", + "COSIE", "COSTA", "COSTE", "COSTS", "COTAN", "COTES", "COTHS", "COTTA", "COTTS", + "CRAAL", "CRAIC", "CRANS", "CRAPE", "CRAPS", "CRARE", "CREEL", "CREES", "CRENA", + "CREPS", "CRIAS", "CRIES", "CRINE", "CRIOS", "CRIPE", "CRIPS", "CRISE", "CRITH", + "CRITS", "CROCI", "CROCS", "CRONS", "CROOL", "CROON", "CROPS", "CRORE", "CROST", + "CTENE", "EALES", "EARLS", "EARNS", "EARNT", "EARST", "EASER", "EASES", "EASLE", + "EASTS", "EATHE", "ECHES", "ECHOS", "EISEL", "ELAIN", "ELANS", "ELCHI", "ELINT", + "ELOIN", "ELOPS", "ELPEE", "ELSIN", "ENATE", "ENIAC", "ENLIT", "ENOLS", "ENROL", + "ENTIA", "EORLS", "EOSIN", "EPACT", "EPEES", "EPHAH", "EPHAS", "EPHOR", "EPICS", + "EPOPT", "EPRIS", "ERICA", "ERICS", "ERNES", "EROSE", "ERSES", "ESCAR", "ESCOT", + "ESILE", "ESNES", "ESSES", "ESTOC", "ESTOP", "ESTRO", "ETAPE", "ETATS", "ETENS", + "ETHAL", "ETHNE", "ETICS", "ETNAS", "ETTIN", "ETTLE", "HAARS", "HAETS", "HAHAS", + "HAILS", "HAINS", "HAINT", "HAIRS", "HAITH", "HALAL", "HALER", "HALES", "HALLO", + "HALLS", "HALON", "HALOS", "HALSE", "HALTS", "HANAP", "HANCE", "HANCH", "HANSA", + "HANSE", "HANTS", "HAOLE", "HAPPI", "HARES", "HARLS", "HARNS", "HAROS", "HARPS", + "HARTS", "HASPS", "HASTA", "HATES", "HATHA", "HEALS", "HEAPS", "HEARE", "HEARS", + "HEAST", "HEATS", "HECHT", "HEELS", "HEILS", "HEIRS", "HELES", "HELIO", "HELLS", + "HELOS", "HELOT", "HELPS", "HENCH", "HENNA", "HENTS", "HEPAR", "HERES", "HERLS", + "HERNS", "HEROS", "HERSE", "HESPS", "HESTS", "HETES", "HETHS", "HIANT", "HILAR", + "HILCH", "HILLO", "HILLS", "HILTS", "HINTS", "HIOIS", "HIREE", "HIRER", "HIRES", + "HISTS", "HITHE", "HOARS", "HOAST", "HOERS", "HOISE", "HOLES", "HOLLA", "HOLLO", + "HOLON", "HOLOS", "HOLTS", "HONAN", "HONER", "HONES", "HOOCH", "HOONS", "HOOPS", + "HOORS", "HOOSH", "HOOTS", "HOPER", "HOPES", "HORAH", "HORAL", "HORAS", "HORIS", + "HORNS", "HORST", "HOSEL", "HOSEN", "HOSER", "HOSES", "HOSTA", "HOSTS", "HOTCH", + "HOTEN", "ICERS", "ICHES", "ICHOR", "ICIER", "ICONS", "ICTAL", "ICTIC", "ILEAC", + "ILEAL", "ILIAL", "ILLER", "ILLTH", "INAPT", "INCEL", "INCLE", "INION", "INNIT", + "INSET", "INSPO", "INTEL", "INTIL", "INTIS", "INTRA", "IOTAS", "IPPON", "IRONE", + "IRONS", "ISHES", "ISLES", "ISNAE", "ISSEI", "ISTLE", "ITHER", "LAARI", "LACER", + "LACES", "LACET", "LAERS", "LAHAL", "LAHAR", "LAICH", "LAICS", "LAIRS", "LAITH", + "LALLS", "LANAI", "LANAS", "LANCH", "LANES", "LANTS", "LAPIN", "LAPIS", "LARCH", + "LAREE", "LARES", "LARIS", "LARNS", "LARNT", "LASER", "LASES", "LASSI", "LASTS", + "LATAH", "LATEN", "LATHI", "LATHS", "LEANS", "LEAPS", "LEARE", "LEARS", "LEATS", + "LEEAR", "LEEPS", "LEERS", "LEESE", "LEETS", "LEHRS", "LEIRS", "LEISH", "LENES", + "LENIS", "LENOS", "LENSE", "LENTI", "LENTO", "LEONE", "LEPRA", "LEPTA", "LERES", + "LERPS", "LESES", "LESTS", "LETCH", "LETHE", "LIANA", "LIANE", "LIARS", "LIART", + "LICHI", "LICHT", "LICIT", "LIENS", "LIERS", "LILLS", "LILOS", "LILTS", "LINAC", + "LINCH", "LINES", "LININ", "LINNS", "LINOS", "LINTS", "LIONS", "LIPAS", "LIPES", + "LIPIN", "LIPOS", "LIRAS", "LIROT", "LISLE", "LISPS", "LISTS", "LITAI", "LITAS", + "LITES", "LITHO", "LITHS", "LITRE", "LLANO", "LOACH", "LOANS", "LOAST", "LOCHE", + "LOCHS", "LOCIE", "LOCIS", "LOCOS", "LOESS", "LOHAN", "LOINS", "LOIPE", "LOIRS", + "LOLLS", "LONER", "LOOIE", "LOONS", "LOOPS", "LOOTS", "LOPER", "LOPES", "LORAL", + "LORAN", "LOREL", "LORES", "LORIC", "LORIS", "LOSEL", "LOSEN", "LOSES", "LOTAH", + "LOTAS", "LOTES", "LOTIC", "LOTOS", "LOTSA", "LOTTA", "LOTTE", "LOTTO", "NAANS", + "NACHE", "NACHO", "NACRE", "NAHAL", "NAILS", "NAIRA", "NALAS", "NALLA", "NANAS", + "NANCE", "NANNA", "NANOS", "NAPAS", "NAPES", "NAPOO", "NAPPA", "NAPPE", "NARAS", + "NARCO", "NARCS", "NARES", "NARIC", "NARIS", "NARRE", "NASHI", "NATCH", "NATES", + "NATIS", "NEALS", "NEAPS", "NEARS", "NEATH", "NEATS", "NEELE", "NEEPS", "NEESE", + "NEIST", "NELIS", "NENES", "NEONS", "NEPER", "NEPIT", "NERAL", "NEROL", "NERTS", + "NESTS", "NETES", "NETOP", "NETTS", "NICHT", "NICOL", "NIHIL", "NILLS", "NINER", + "NINES", "NINON", "NIPAS", "NIRLS", "NISEI", "NISSE", "NITER", "NITES", "NITON", + "NITRE", "NITRO", "NOAHS", "NOELS", "NOILS", "NOINT", "NOIRS", "NOLES", "NOLLS", + "NOLOS", "NONAS", "NONCE", "NONES", "NONET", "NONIS", "NOOIT", "NOONS", "NOOPS", + "NOPAL", "NORIA", "NORIS", "NOSER", "NOSES", "NOTAL", "NOTER", "NOTES", "OASES", + "OASIS", "OASTS", "OATEN", "OATER", "OATHS", "OCHER", "OCHES", "OCHRE", "OCREA", + "OCTAN", "OCTAS", "OHIAS", "OHONE", "OILER", "OINTS", "OLEIC", "OLEIN", "OLENT", + "OLEOS", "OLIOS", "OLLAS", "OLLER", "OLLIE", "OLPAE", "OLPES", "ONCER", "ONCES", + "ONCET", "ONERS", "ONTIC", "OONTS", "OORIE", "OOSES", "OPAHS", "OPALS", "OPENS", + "OPEPE", "OPPOS", "OPSIN", "OPTER", "ORACH", "ORALS", "ORANT", "ORATE", "ORCAS", + "ORCIN", "ORIEL", "ORLES", "ORLON", "ORLOP", "ORNIS", "ORPIN", "ORRIS", "ORTHO", + "OSCAR", "OSHAC", "OSIER", "OSSIA", "OSTIA", "OTTAR", "OTTOS", "PAALS", "PAANS", + "PACAS", "PACER", "PACES", "PACHA", "PACOS", "PACTA", "PACTS", "PAEAN", "PAEON", + "PAILS", "PAINS", "PAIRE", "PAIRS", "PAISA", "PAISE", "PALAS", "PALEA", "PALES", + "PALET", "PALIS", "PALLA", "PALLS", "PALPI", "PALPS", "PALSA", "PANCE", "PANES", + "PANNE", "PANNI", "PANTO", "PANTS", "PAOLI", "PAOLO", "PAPAS", "PAPES", "PAPPI", + "PARAE", "PARAS", "PARCH", "PAREN", "PAREO", "PARES", "PARIS", "PARLE", "PAROL", + "PARPS", "PARRA", "PARRS", "PARTI", "PARTS", "PASEO", "PASES", "PASHA", "PASSE", + "PASTS", "PATEN", "PATER", "PATES", "PATHS", "PATIN", "PATTE", "PEALS", "PEANS", + "PEARE", "PEARS", "PEART", "PEASE", "PEATS", "PECHS", "PEECE", "PEELS", "PEENS", + "PEEPE", "PEEPS", "PEERS", "PEINS", "PEISE", "PELAS", "PELES", "PELLS", "PELON", + "PELTA", "PELTS", "PENES", "PENIE", "PENIS", "PENNA", "PENNI", "PENTS", "PEONS", + "PEPLA", "PEPOS", "PEPSI", "PERAI", "PERCE", "PERCS", "PEREA", "PERES", "PERIS", + "PERNS", "PERPS", "PERSE", "PERST", "PERTS", "PESOS", "PESTS", "PETAR", "PETER", + "PETIT", "PETRE", "PETRI", "PETTI", "PETTO", "PHARE", "PHEER", "PHENE", "PHEON", + "PHESE", "PHIAL", "PHISH", "PHOCA", "PHONO", "PHONS", "PHOTS", "PHPHT", "PIANI", + "PIANS", "PICAL", "PICAS", "PICOT", "PICRA", "PIERS", "PIERT", "PIETA", "PIETS", "PILAE", "PILAO", "PILAR", "PILCH", "PILEA", "PILEI", "PILER", "PILES", "PILIS", - "PILLS", "PINAS", "PINES", "PINGO", "PINGS", "PINNA", "PINON", "PIONS", "PIPAL", - "PIPAS", "PIPES", "PIPIS", "PIRAI", "PIRLS", "PIRNS", "PIROG", "PISCO", "PISES", - "PISOS", "PLAAS", "PLAGE", "PLANS", "PLAPS", "PLASH", "PLEAS", "PLENA", "PLEON", - "PLESH", "PLICA", "PLIES", "PLING", "PLONG", "PLOPS", "POACH", "POEPS", "POGGE", - "POGOS", "POLER", "POLES", "POLIO", "POLIS", "POLLS", "POLOS", "PONCE", "PONES", - "PONGA", "PONGO", "PONGS", "POOHS", "POOLS", "POONS", "POOPS", "POORI", "POPES", - "POPPA", "PORAE", "PORAL", "PORER", "PORES", "PORGE", "PORIN", "PORNO", "PORNS", - "POSES", "POSHO", "PRANA", "PRANG", "PRAOS", "PRASE", "PREES", "PREON", "PREOP", - "PREPS", "PRESA", "PRESE", "PRIAL", "PRIER", "PRIES", "PRIGS", "PRILL", "PRION", - "PRISE", "PRISS", "PROAS", "PROGS", "PROIN", "PROLE", "PROLL", "PROPS", "PRORE", - "PROSO", "PROSS", "PSION", "PSOAE", "PSOAI", "PSOAS", "PSORA", "RACES", "RACHE", - "RACON", "RAGAS", "RAGEE", "RAGER", "RAGES", "RAGGA", "RAGGS", "RAGIS", "RAIAS", - "RAILE", "RAILS", "RAINE", "RAINS", "RALES", "RANAS", "RANCE", "RANEE", "RANGA", - "RANGI", "RANGS", "RANIS", "RAPER", "RAPES", "RAPHE", "RAPPE", "RAREE", "RARES", - "RASER", "RASES", "RASPS", "RASSE", "REAIS", "REALO", "REALS", "REANS", "REAPS", - "REARS", "RECAL", "RECCE", "RECCO", "RECON", "REECH", "REELS", "REENS", "REGAR", - "REGES", "REGGO", "REGIE", "REGNA", "REGOS", "REINS", "RELIE", "RELLO", "RENGA", - "RENIG", "RENIN", "RENNE", "RENOS", "REOIL", "REORG", "REPEG", "REPIN", "REPLA", - "REPOS", "REPPS", "REPRO", "RERAN", "RERIG", "RESEE", "RESES", "RHEAS", "RHIES", - "RHINE", "RHONE", "RIALS", "RICER", "RICES", "RICIN", "RIELS", "RIGGS", "RIGOL", - "RILES", "RILLE", "RILLS", "RINES", "RINGS", "RIPES", "RIPPS", "RISES", "RISHI", - "RISPS", "ROANS", "ROARS", "ROHES", "ROILS", "ROINS", "ROLAG", "ROLES", "ROLLS", - "RONEO", "RONES", "RONIN", "RONNE", "ROONS", "ROOPS", "ROOSA", "ROOSE", "ROPER", - "ROPES", "RORAL", "RORES", "RORIC", "RORIE", "ROSES", "ROSHI", "ROSIN", "SAAGS", - "SACRA", "SAGAS", "SAGER", "SAGES", "SAGOS", "SAICE", "SAICS", "SAIGA", "SAILS", - "SAINE", "SAINS", "SAIRS", "SALAL", "SALEP", "SALES", "SALIC", "SALLE", "SALOL", - "SALOP", "SALPA", "SALPS", "SALSE", "SANES", "SANGA", "SANGH", "SANGO", "SANGS", - "SANSA", "SAOLA", "SAPAN", "SAPOR", "SARAN", "SAREE", "SARGE", "SARGO", "SARIN", - "SARIS", "SAROS", "SASER", "SASIN", "SASSE", "SCAGS", "SCAIL", "SCALA", "SCALL", - "SCANS", "SCAPA", "SCAPE", "SCAPI", "SCARP", "SCARS", "SCENA", "SCOGS", "SCOOG", - "SCOPA", "SCOPS", "SCRAE", "SCRAG", "SCRAN", "SCRIP", "SCROG", "SEALS", "SEANS", - "SEARE", "SEARS", "SEASE", "SECCO", "SECHS", "SEELS", "SEEPS", "SEERS", "SEGAR", - "SEGNI", "SEGNO", "SEGOL", "SEGOS", "SEHRI", "SEILS", "SEINE", "SEIRS", "SEISE", - "SELAH", "SELES", "SELLA", "SELLE", "SELLS", "SENAS", "SENES", "SENGI", "SENNA", - "SENOR", "SENSA", "SENSI", "SEPAL", "SEPIC", "SERAC", "SERAI", "SERAL", "SERER", - "SERES", "SERGE", "SERIC", "SERIN", "SERON", "SERRA", "SERRE", "SERRS", "SESSA", - "SHAGS", "SHAHS", "SHANS", "SHAPS", "SHARN", "SHASH", "SHCHI", "SHEAL", "SHEAS", - "SHEEL", "SHEOL", "SHERE", "SHERO", "SHIAI", "SHIEL", "SHIER", "SHIES", "SHILL", - "SHINS", "SHIPS", "SHIRR", "SHIRS", "SHISH", "SHISO", "SHLEP", "SHOER", "SHOES", - "SHOGI", "SHOGS", "SHOLA", "SHOOL", "SHOON", "SHOOS", "SHOPE", "SHOPS", "SHORL", - "SHRIS", "SIALS", "SICES", "SIENS", "SIGHS", "SIGIL", "SIGLA", "SIGNA", "SIGNS", - "SILEN", "SILER", "SILES", "SILLS", "SILOS", "SINES", "SINGS", "SINHS", "SIPES", - "SIREE", "SIRES", "SIRIH", "SIRIS", "SIROC", "SIRRA", "SISAL", "SISES", "SLAES", - "SLAGS", "SLANE", "SLAPS", "SLEER", "SLIER", "SLIPE", "SLIPS", "SLISH", "SLOAN", - "SLOES", "SLOGS", "SLOPS", "SNAGS", "SNAPS", "SNARS", "SNASH", "SNEAP", "SNEES", - "SNELL", "SNIES", "SNIGS", "SNIPS", "SNOEP", "SNOGS", "SNOOL", "SOAPS", "SOARE", - "SOARS", "SOCAS", "SOCES", "SOCLE", "SOGER", "SOILS", "SOLAH", "SOLAN", "SOLAS", - "SOLEI", "SOLER", "SOLES", "SOLON", "SOLOS", "SONCE", "SONES", "SONGS", "SONNE", - "SONSE", "SOOLE", "SOOLS", "SOOPS", "SOPHS", "SOPOR", "SOPRA", "SORAL", "SORAS", - "SOREE", "SOREL", "SORER", "SORES", "SORGO", "SORNS", "SORRA", "SPAER", "SPAES", - "SPAGS", "SPAHI", "SPAIL", "SPAIN", "SPALE", "SPALL", "SPANE", "SPANG", "SPANS", - "SPARS", "SPEAL", "SPEAN", "SPECS", "SPEEL", "SPEER", "SPEIL", "SPEIR", "SPEOS", - "SPIAL", "SPICA", "SPICS", "SPIER", "SPIES", "SPILE", "SPINA", "SPINS", "SPLOG", - "SPOOR", "SPOSH", "SPRAG", "SPROG", + "PILLS", "PINAS", "PINES", "PINNA", "PINON", "PINOT", "PINTA", "PINTS", "PIONS", + "PIPAL", "PIPAS", "PIPES", "PIPET", "PIPIS", "PIPIT", "PIRAI", "PIRLS", "PIRNS", + "PISCO", "PISES", "PISOS", "PISTE", "PITAS", "PITHS", "PITON", "PITOT", "PITTA", + "PLAAS", "PLANS", "PLAPS", "PLASH", "PLAST", "PLATS", "PLATT", "PLEAS", "PLENA", + "PLEON", "PLESH", "PLICA", "PLIES", "PLOAT", "PLOPS", "PLOTS", "POACH", "POEPS", + "POETS", "POLER", "POLES", "POLIO", "POLIS", "POLLS", "POLOS", "POLTS", "PONCE", + "PONES", "PONTS", "POOHS", "POOLS", "POONS", "POOPS", "POORI", "POORT", "POOTS", + "POPES", "POPPA", "PORAE", "PORAL", "PORER", "PORES", "PORIN", "PORNO", "PORNS", + "PORTA", "PORTS", "POSES", "POSHO", "POSTS", "POTAE", "POTCH", "POTES", "POTIN", + "POTOO", "POTTO", "POTTS", "PRANA", "PRAOS", "PRASE", "PRATE", "PRATS", "PRATT", + "PREES", "PRENT", "PREON", "PREOP", "PREPS", "PRESA", "PRESE", "PREST", "PRIAL", + "PRIER", "PRIES", "PRILL", "PRION", "PRISE", "PRISS", "PROAS", "PROIN", "PROLE", + "PROLL", "PROPS", "PRORE", "PROSO", "PROSS", "PROST", "PROTO", "PSION", "PSOAE", + "PSOAI", "PSOAS", "PSORA", "RACES", "RACHE", "RACON", "RAIAS", "RAILE", "RAILS", + "RAINE", "RAINS", "RAITA", "RAITS", "RALES", "RANAS", "RANCE", "RANEE", "RANIS", + "RANTS", "RAPER", "RAPES", "RAPHE", "RAPPE", "RAREE", "RARES", "RASER", "RASES", + "RASPS", "RASSE", "RASTA", "RATAL", "RATAN", "RATAS", "RATCH", "RATEL", "RATER", + "RATES", "RATHA", "RATHE", "RATHS", "RATOO", "RATOS", "REAIS", "REALO", "REALS", + "REANS", "REAPS", "REARS", "REAST", "REATA", "REATE", "RECAL", "RECCE", "RECCO", + "RECIT", "RECON", "RECTA", "RECTI", "RECTO", "REECH", "REELS", "REENS", "REEST", + "REINS", "REIST", "RELET", "RELIE", "RELIT", "RELLO", "RENIN", "RENNE", "RENOS", + "RENTE", "RENTS", "REOIL", "REPIN", "REPLA", "REPOS", "REPOT", "REPPS", "REPRO", + "RERAN", "RESAT", "RESEE", "RESES", "RESIT", "RESTO", "RESTS", "RETIA", "RETIE", + "RHEAS", "RHIES", "RHINE", "RHONE", "RIALS", "RIANT", "RIATA", "RICER", "RICES", + "RICHT", "RICIN", "RIELS", "RILES", "RILLE", "RILLS", "RINES", "RIOTS", "RIPES", + "RIPPS", "RISES", "RISHI", "RISPS", "RITES", "RITTS", "ROANS", "ROARS", "ROATE", + "ROHES", "ROILS", "ROINS", "ROIST", "ROLES", "ROLLS", "RONEO", "RONES", "RONIN", + "RONNE", "RONTE", "RONTS", "ROONS", "ROOPS", "ROOSA", "ROOSE", "ROOTS", "ROPER", + "ROPES", "RORAL", "RORES", "RORIC", "RORIE", "RORTS", "ROSES", "ROSET", "ROSHI", + "ROSIN", "ROSIT", "ROSTI", "ROSTS", "ROTAL", "ROTAN", "ROTAS", "ROTCH", "ROTES", + "ROTIS", "ROTLS", "ROTON", "ROTOS", "ROTTE", "SACRA", "SAICE", "SAICS", "SAILS", + "SAINE", "SAINS", "SAIRS", "SAIST", "SAITH", "SALAL", "SALAT", "SALEP", "SALES", + "SALET", "SALIC", "SALLE", "SALOL", "SALOP", "SALPA", "SALPS", "SALSE", "SALTO", + "SALTS", "SANES", "SANSA", "SANTO", "SANTS", "SAOLA", "SAPAN", "SAPOR", "SARAN", + "SAREE", "SARIN", "SARIS", "SAROS", "SASER", "SASIN", "SASSE", "SATAI", "SATES", + "SATIS", "SCAIL", "SCALA", "SCALL", "SCANS", "SCAPA", "SCAPE", "SCAPI", "SCARP", + "SCARS", "SCART", "SCATH", "SCATS", "SCATT", "SCEAT", "SCENA", "SCOOT", "SCOPA", + "SCOPS", "SCOTS", "SCRAE", "SCRAN", "SCRAT", "SCRIP", "SEALS", "SEANS", "SEARE", + "SEARS", "SEASE", "SEATS", "SECCO", "SECHS", "SECTS", "SEELS", "SEEPS", "SEERS", + "SEHRI", "SEILS", "SEINE", "SEIRS", "SEISE", "SELAH", "SELES", "SELLA", "SELLE", + "SELLS", "SENAS", "SENES", "SENNA", "SENOR", "SENSA", "SENSI", "SENTE", "SENTI", + "SENTS", "SEPAL", "SEPIC", "SEPTA", "SEPTS", "SERAC", "SERAI", "SERAL", "SERER", + "SERES", "SERIC", "SERIN", "SERON", "SERRA", "SERRE", "SERRS", "SESSA", "SETAE", + "SETAL", "SETON", "SETTS", "SHAHS", "SHANS", "SHAPS", "SHARN", "SHASH", "SHCHI", + "SHEAL", "SHEAS", "SHEEL", "SHENT", "SHEOL", "SHERE", "SHERO", "SHETS", "SHIAI", + "SHIEL", "SHIER", "SHIES", "SHILL", "SHINS", "SHIPS", "SHIRR", "SHIRS", "SHISH", + "SHISO", "SHIST", "SHITE", "SHITS", "SHLEP", "SHOAT", "SHOER", "SHOES", "SHOLA", + "SHOOL", "SHOON", "SHOOS", "SHOPE", "SHOPS", "SHORL", "SHOTE", "SHOTS", "SHOTT", + "SHRIS", "SIALS", "SICES", "SICHT", "SIENS", "SIENT", "SIETH", "SILEN", "SILER", + "SILES", "SILLS", "SILOS", "SILTS", "SINES", "SINHS", "SIPES", "SIREE", "SIRES", + "SIRIH", "SIRIS", "SIROC", "SIRRA", "SISAL", "SISES", "SISTA", "SISTS", "SITAR", + "SITES", "SITHE", "SLAES", "SLANE", "SLAPS", "SLART", "SLATS", "SLEER", "SLIER", + "SLIPE", "SLIPS", "SLIPT", "SLISH", "SLITS", "SLOAN", "SLOES", "SLOOT", "SLOPS", + "SLOTS", "SNAPS", "SNARS", "SNASH", "SNATH", "SNEAP", "SNEES", "SNELL", "SNIES", + "SNIPS", "SNIRT", "SNITS", "SNOEP", "SNOOL", "SNOOT", "SNOTS", "SOAPS", "SOARE", + "SOARS", "SOCAS", "SOCES", "SOCLE", "SOILS", "SOLAH", "SOLAN", "SOLAS", "SOLEI", + "SOLER", "SOLES", "SOLON", "SOLOS", "SONCE", "SONES", "SONNE", "SONSE", "SOOLE", + "SOOLS", "SOOPS", "SOOTE", "SOOTS", "SOPHS", "SOPOR", "SOPRA", "SORAL", "SORAS", + "SOREE", "SOREL", "SORER", "SORES", "SORNS", "SORRA", "SORTA", "SORTS", "SOTHS", + "SOTOL", "SPAER", "SPAES", "SPAHI", "SPAIL", "SPAIN", "SPAIT", "SPALE", "SPALL", + "SPALT", "SPANE", "SPANS", "SPARS", "SPART", "SPATE", "SPATS", "SPEAL", "SPEAN", + "SPEAT", "SPECS", "SPECT", "SPEEL", "SPEER", "SPEIL", "SPEIR", "SPEOS", "SPETS", + "SPIAL", "SPICA", "SPICS", "SPIER", "SPIES", "SPILE", "SPINA", "SPINS", "SPIRT", + "SPITS", "SPOOR", "SPOOT", "SPOSH", "SPOTS", "SPRAT", "SPRIT", "STANE", "STAPH", + "STAPS", "STARN", "STARR", "STARS", "STATS", "STEAN", "STEAR", "STEEN", "STEIL", + "STELA", "STELE", "STELL", "STENO", "STENS", "STENT", "STEPS", "STEPT", "STERE", + "STETS", "STICH", "STIES", "STILE", "STIPA", "STIPE", "STIRE", "STIRP", "STIRS", + "STOAE", "STOAI", "STOAS", "STOAT", "STOEP", "STOIT", "STOLN", "STONN", "STOOR", + "STOPE", "STOPS", "STOPT", "STOSS", "STOTS", "STOTT", "STRAE", "STREP", "STRIA", + "STROP", "TAALS", "TAATA", "TACAN", "TACES", "TACET", "TACHE", "TACHO", "TACHS", + "TACOS", "TACTS", "TAELS", "TAHAS", "TAHRS", "TAILS", "TAINS", "TAIRA", "TAISH", + "TAITS", "TALAR", "TALAS", "TALCS", "TALEA", "TALER", "TALES", "TALLS", "TALPA", + "TANAS", "TANHS", "TANNA", "TANTI", "TANTO", "TAPAS", "TAPEN", "TAPES", "TAPET", + "TAPIS", "TAPPA", "TARAS", "TARES", "TARNS", "TAROC", "TAROS", "TARPS", "TARRE", + "TARSI", "TARTS", "TASAR", "TASER", "TASES", "TASSA", "TASSE", "TASSO", "TATAR", + "TATER", "TATES", "TATHS", "TATIE", "TATTS", "TEALS", "TEARS", "TEATS", "TECHS", + "TECTA", "TEELS", "TEENE", "TEENS", "TEERS", "TEHRS", "TEILS", "TEINS", "TELAE", + "TELCO", "TELES", "TELIA", "TELIC", "TELLS", "TELOI", "TELOS", "TENCH", "TENES", + "TENIA", "TENNE", "TENNO", "TENON", "TENTS", "TEPAL", "TEPAS", "TERAI", "TERAS", + "TERCE", "TERES", "TERNE", "TERNS", "TERTS", "TESLA", "TESTA", "TESTE", "TESTS", + "TETES", "TETHS", "TETRA", "TETRI", "THALE", "THALI", "THANA", "THANE", "THANS", + "THARS", "THECA", "THEES", "THEIC", "THEIN", "THENS", "THESP", "THETE", "THILL", + "THINE", "THINS", "THIOL", "THIRL", "THOLE", "THOLI", "THORO", "THORP", "THRAE", + "THRIP", "THROE", "TIANS", "TIARS", "TICAL", "TICCA", "TICES", "TIERS", "TILER", + "TILES", "TILLS", "TILTH", "TILTS", "TINAS", "TINCT", "TINEA", "TINES", "TINTS", + "TIPIS", "TIRES", "TIRLS", "TIROS", "TIRRS", "TITCH", "TITER", "TITIS", "TITRE", + "TOCOS", "TOEAS", "TOHOS", "TOILE", "TOILS", "TOISE", "TOITS", "TOLAN", "TOLAR", + "TOLAS", "TOLES", "TOLLS", "TOLTS", "TONER", "TONES", "TONNE", "TOOLS", "TOONS", + "TOOTS", "TOPEE", "TOPER", "TOPES", "TOPHE", "TOPHI", "TOPHS", "TOPIS", "TOPOI", + "TOPOS", "TORAH", "TORAN", "TORAS", "TORCS", "TORES", "TORIC", "TORII", "TOROS", + "TOROT", "TORRS", "TORSE", "TORSI", "TORTA", "TORTE", "TORTS", "TOSAS", "TOSES", + "TOTER", "TOTES", "TRANS", "TRANT", "TRAPE", "TRAPS", "TRAPT", "TRASS", "TRATS", + "TRATT", "TREEN", "TREES", "TRESS", "TREST", "TRETS", "TRIAC", "TRIER", "TRIES", + "TRILL", "TRINE", "TRINS", "TRIOL", "TRIOR", "TRIOS", "TRIPS", "TRIST", "TROAT", + "TROIS", "TRONA", "TRONC", "TRONE", "TRONS", "TROTH", "TROTS", "TSARS", }; static const uint16_t _num_words = (sizeof(_valid_words) / sizeof(_valid_words[0])); @@ -628,7 +686,7 @@ static void get_result(wordle_state_t *state) { } #if (USE_RANDOM_GUESS != 0) -static const uint16_t _num_unique_words = 157; // The _valid_words array begins with this many words where each letter is different. +static const uint16_t _num_unique_words = 257; // The _valid_words array begins with this many words where each letter is different. static void insert_random_guess(wordle_state_t *state) { uint16_t random_guess; do { // Don't allow the guess to be the same as the answer diff --git a/utils/wordle_face/wordle_list.py b/utils/wordle_face/wordle_list.py index ed909887..fec404b3 100644 --- a/utils/wordle_face/wordle_list.py +++ b/utils/wordle_face/wordle_list.py @@ -1223,7 +1223,7 @@ def txt_of_all_letter_combos(num_letters_in_set, words=valid_list, min_letter_oc print_iter = 0 prev = time.time() start = prev - letters_to_ignore = ['D','M','T','Y'] # Don't diplay well on the watch + letters_to_ignore = ['D','M'] # Don't diplay well on the watch letter_usage = most_used_letters(words=words) for letter in letter_usage: if (100 * letter_usage[letter])/len(words) < min_letter_occ_percent_to_consider: @@ -1301,7 +1301,7 @@ def location_of_letters(letters=alphabet, list=valid_list): if __name__ == "__main__": - my_letters = ['A', 'C', 'E', 'G', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'S'] + my_letters = ['A', 'C', 'E', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'S', 'T'] #print(f"{len(list_of_valid_words(my_letters, valid_list))} Words can be made with {my_letters}") #most_used_letters() #location_of_letters(my_letters) From 1d2fb20e994d297aa77c12aa29f333343a7ed262 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sat, 24 Aug 2024 10:36:38 -0400 Subject: [PATCH 33/53] Readding comment showing count of possible words. --- movement/watch_faces/complication/wordle_face.c | 1 + utils/wordle_face/wordle_list.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 260860b6..7396a174 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -86,6 +86,7 @@ static const char _valid_words[][WORDLE_LENGTH + 1] = { }; // These are words that'll never be used, but still need to be in the dictionary for guesses. +// Number of words found: 1898 static const char _possible_words[][WORDLE_LENGTH + 1] = { "AALII", "AARTI", "ACAIS", "ACARI", "ACCAS", "ACERS", "ACETA", "ACHAR", "ACHES", "ACHOO", "ACINI", "ACNES", "ACRES", "ACROS", "ACTIN", "ACTON", "AECIA", "AEONS", diff --git a/utils/wordle_face/wordle_list.py b/utils/wordle_face/wordle_list.py index fec404b3..d951bac9 100644 --- a/utils/wordle_face/wordle_list.py +++ b/utils/wordle_face/wordle_list.py @@ -1171,8 +1171,8 @@ def print_valid_words(letters=alphabet): print("") print(f"// From: {source_link}") print(f"// Number of words found: {len(valid_words)}") - i = 0 print("static const char _valid_words[][WORDLE_LENGTH + 1] = {") + i = 0 while i < len(valid_words): print(" ", end='') for _ in range(min(items_per_row, len(valid_words)-i)): @@ -1184,6 +1184,7 @@ def print_valid_words(letters=alphabet): possible_words = capitalize_all_and_remove_duplicates(possible_words) print("};") print("\n// These are words that'll never be used, but still need to be in the dictionary for guesses.") + print(f"// Number of words found: {len(possible_words)}") print("static const char _possible_words[][WORDLE_LENGTH + 1] = {") i = 0 while i < len(possible_words): From 5149e7e1dd2941b7f9adc740280eb0f3fb4a3c62 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 25 Aug 2024 06:50:00 -0400 Subject: [PATCH 34/53] the dict of words to its own header --- .../watch_faces/complication/wordle_face.c | 279 +---------------- .../watch_faces/complication/wordle_face.h | 5 + .../complication/wordle_face_dict.h | 289 ++++++++++++++++++ 3 files changed, 295 insertions(+), 278 deletions(-) create mode 100644 movement/watch_faces/complication/wordle_face_dict.h diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 7396a174..9ce29bdf 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -29,282 +29,6 @@ #include "watch_utility.h" #endif - -static const char _valid_letters[] = {'A', 'C', 'E', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'S', 'T'}; - -// From: https://matthewminer.name/projects/calculators/wordle-words-left/ -// Number of words found: 432 -static const char _valid_words[][WORDLE_LENGTH + 1] = { - "STALE", "TRACE", "CLOSE", "ARISE", "SNIPE", "SHIRE", "LEASH", "SAINT", "CLEAN", - "RELIC", "CHORE", "CRONE", "REACH", "CHAOS", "TAPIR", "CAIRN", "TENOR", "STARE", - "HEART", "SCOPE", "SNARL", "SLEPT", "SINCE", "EPOCH", "SPACE", "SHARE", "SPOIL", - "LITER", "LEAPT", "LANCE", "RANCH", "HORSE", "LEACH", "LATER", "STEAL", "CHEAP", - "SHORT", "ETHIC", "CHANT", "ACTOR", "SPARE", "SEPIA", "ONSET", "SPLAT", "LEANT", - "REACT", "OCTAL", "SPORE", "IRATE", "CORAL", "NICER", "SPILT", "SCENT", "PANIC", - "SHIRT", "PECAN", "SLAIN", "SPLIT", "ROACH", "ASCOT", "PHONE", "LITHE", "STOIC", - "STRIP", "RENAL", "POISE", "ENACT", "CHEAT", "PITCH", "NOISE", "INLET", "PEARL", - "POLAR", "PEACH", "STOLE", "CASTE", "CREST", "SCARE", "ETHOS", "THEIR", "STONE", - "SLATE", "LATCH", "HASTE", "SNARE", "SPINE", "SLANT", "SPEAR", "SCALE", "CAPER", - "RETCH", "PESTO", "CHIRP", "SPORT", "OPTIC", "SNAIL", "PRICE", "PLANE", "TORCH", - "PASTE", "RECAP", "SOLAR", "CRASH", "LINER", "OPINE", "ASHEN", "PALER", "ECLAT", - "SPELT", "TRIAL", "PERIL", "SLICE", "SCANT", "RAISE", "POSIT", "ATONE", "SPIRE", - "COAST", "INEPT", "SHOAL", "CLASH", "THORN", "PHASE", "SCORE", "TRICE", "PERCH", - "PORCH", "SHEAR", "CHOIR", "RHINO", "PLANT", "SHONE", "SANER", "LEARN", "ALTER", - "CHAIN", "PANEL", "PLIER", "STEIN", "COPSE", "SONIC", "ALIEN", "CHOSE", "ACORN", - "ANTIC", "CHEST", "OTHER", "CHINA", "TALON", "SCORN", "PLAIN", "PILOT", "RIPEN", - "PATCH", "SPICE", "CLONE", "SCION", "SCONE", "STRAP", "PARSE", "SHALE", "RISEN", - "CANOE", "INTER", "CRATE", "ISLET", "PRINT", "SHINE", "NORTH", "CLEAT", "PLAIT", - "SCRAP", "CLEAR", "SLOTH", "LAPSE", "CHAIR", "SNORT", "SHARP", "OPERA", "STAIN", - "TEACH", "TRAIL", "TRAIN", "LATHE", "PIANO", "PINCH", "PETAL", "STERN", "PRONE", - "PROSE", "PLEAT", "TROPE", "PLACE", "POSER", "INERT", "CHASE", "CAROL", "STAIR", - "SATIN", "SPITE", "LOATH", "ROAST", "ARSON", "SHAPE", "CLASP", "LOSER", "SALON", - "CATER", "SHALT", "INTRO", "ALERT", "PENAL", "SHORE", "RINSE", "CREPT", "APRON", - "SONAR", "AISLE", "AROSE", "HATER", "NICHE", "POINT", "EARTH", "PINTO", "THOSE", - "CLOTH", "NOTCH", "TOPIC", "RESIN", "SCALP", "HEIST", "HERON", "TRIPE", "TONAL", - "TAPER", "SHORN", "TONIC", "HOIST", "SNORE", "STORE", "SLOPE", "OCEAN", "CHART", - "PAINT", "SPENT", "CRANE", "CRISP", "TRASH", "PATIO", "PLATE", "HOTEL", "LEAST", - "ALONE", "RALPH", "SPIEL", "SIREN", "RATIO", "STOOP", "TROLL", "ATOLL", "SLASH", - "RETRO", "CREEP", "STILT", "SPREE", "TASTE", "CACHE", "CANON", "EATEN", "TEPEE", - "SHEET", "SNEER", "ERROR", "NATAL", "SLEEP", "STINT", "TROOP", "SHALL", "STALL", - "PIPER", "TOAST", "NASAL", "CORER", "THERE", "POOCH", "SCREE", "ELITE", "ALTAR", - "PENCE", "EATER", "ALPHA", "TENTH", "LINEN", "SHEER", "TAINT", "HEATH", "CRIER", - "TENSE", "CARAT", "CANAL", "APNEA", "THESE", "HATCH", "SHELL", "CIRCA", "APART", - "SPILL", "STEEL", "LOCAL", "STOOL", "SHEEN", "RESET", "STEEP", "ELATE", "PRESS", - "SLEET", "CROSS", "TOTAL", "TREAT", "ONION", "STATE", "CINCH", "ASSET", "THREE", - "TORSO", "SNOOP", "PENNE", "SPOON", "SHEEP", "PAPAL", "STILL", "CHILL", "THETA", - "LEECH", "INNER", "HONOR", "LOOSE", "CONIC", "SCENE", "COACH", "CONCH", "LATTE", - "ERASE", "ESTER", "PEACE", "PASTA", "INANE", "SPOOL", "TEASE", "HARSH", "PIECE", - "STEER", "SCOOP", "NINTH", "OTTER", "OCTET", "EERIE", "RISER", "LAPEL", "HIPPO", - "PREEN", "ETHER", "AORTA", "SENSE", "TRACT", "SHOOT", "SLOOP", "REPEL", "TITHE", - "IONIC", "CELLO", "CHESS", "SOOTH", "COCOA", "TITAN", "TOOTH", "TIARA", "CRESS", - "SLOSH", "RARER", "TERSE", "ERECT", "HELLO", "PARER", "RIPER", "NOOSE", "CREPE", - "CACAO", "ILIAC", "POSSE", "CACTI", "EASEL", "LASSO", "ROOST", "ALLOT", "COLON", - "LEPER", "TEETH", "TITLE", "HENCE", "NIECE", "PAPER", "TRITE", "SPELL", "RACER", - "ATTIC", "CRASS", "HITCH", "LEASE", "CEASE", "ROTOR", "ELOPE", "APPLE", "CHILI", - "START", "PHOTO", "SALSA", "STASH", "PRIOR", "TAROT", "COLOR", "CHEER", "CLASS", - "ARENA", "ELECT", "ENTER", "CATCH", "TENET", "TACIT", "TRAIT", "TERRA", "LILAC", -}; - -// These are words that'll never be used, but still need to be in the dictionary for guesses. -// Number of words found: 1898 -static const char _possible_words[][WORDLE_LENGTH + 1] = { - "AALII", "AARTI", "ACAIS", "ACARI", "ACCAS", "ACERS", "ACETA", "ACHAR", "ACHES", - "ACHOO", "ACINI", "ACNES", "ACRES", "ACROS", "ACTIN", "ACTON", "AECIA", "AEONS", - "AERIE", "AEROS", "AESIR", "AHEAP", "AHENT", "AHINT", "AINEE", "AIOLI", "AIRER", - "AIRNS", "AIRTH", "AIRTS", "AITCH", "ALAAP", "ALANE", "ALANS", "ALANT", "ALAPA", - "ALAPS", "ALATE", "ALCOS", "ALECS", "ALEPH", "ALIAS", "ALINE", "ALIST", "ALLEE", - "ALLEL", "ALLIS", "ALOES", "ALOHA", "ALOIN", "ALOOS", "ALTHO", "ALTOS", "ANANA", - "ANATA", "ANCHO", "ANCLE", "ANCON", "ANEAR", "ANELE", "ANENT", "ANILE", "ANILS", - "ANION", "ANISE", "ANLAS", "ANNAL", "ANNAS", "ANNAT", "ANOAS", "ANOLE", "ANSAE", - "ANTAE", "ANTAR", "ANTAS", "ANTES", "ANTIS", "ANTRA", "ANTRE", "APACE", "APERS", - "APERT", "APHIS", "APIAN", "APIOL", "APISH", "APOOP", "APORT", "APPAL", "APPEL", - "APPRO", "APRES", "APSES", "APSIS", "APSOS", "APTER", "ARARS", "ARCHI", "ARCOS", - "AREAE", "AREAL", "AREAR", "AREAS", "ARECA", "AREIC", "ARENE", "AREPA", "ARERE", - "ARETE", "ARETS", "ARETT", "ARHAT", "ARIAS", "ARIEL", "ARILS", "ARIOT", "ARISH", - "ARLES", "ARNAS", "AROHA", "ARPAS", "ARPEN", "ARRAH", "ARRAS", "ARRET", "ARRIS", - "ARSES", "ARSIS", "ARTAL", "ARTEL", "ARTIC", "ARTIS", "ASANA", "ASCON", "ASHES", - "ASHET", "ASPEN", "ASPER", "ASPIC", "ASPIE", "ASPIS", "ASPRO", "ASSAI", "ASSES", - "ASSOT", "ASTER", "ASTIR", "ATAPS", "ATILT", "ATLAS", "ATOCS", "ATRIA", "ATRIP", - "ATTAP", "ATTAR", "CACAS", "CAECA", "CAESE", "CAINS", "CALLA", "CALLS", "CALOS", - "CALPA", "CALPS", "CANEH", "CANER", "CANES", "CANNA", "CANNS", "CANSO", "CANST", - "CANTO", "CANTS", "CAPAS", "CAPES", "CAPHS", "CAPLE", "CAPON", "CAPOS", "CAPOT", - "CAPRI", "CARAP", "CARER", "CARES", "CARET", "CARLE", "CARLS", "CARNS", "CARON", - "CARPI", "CARPS", "CARRS", "CARSE", "CARTA", "CARTE", "CARTS", "CASAS", "CASCO", - "CASES", "CASTS", "CATES", "CECAL", "CEILI", "CEILS", "CELLA", "CELLI", "CELLS", - "CELTS", "CENSE", "CENTO", "CENTS", "CEORL", "CEPES", "CERCI", "CERES", "CERIA", - "CERIC", "CERNE", "CEROC", "CEROS", "CERTS", "CESSE", "CESTA", "CESTI", "CETES", - "CHACE", "CHACO", "CHAIS", "CHALS", "CHANA", "CHAPE", "CHAPS", "CHAPT", "CHARA", - "CHARE", "CHARR", "CHARS", "CHATS", "CHEEP", "CHELA", "CHELP", "CHERE", "CHERT", - "CHETH", "CHIAO", "CHIAS", "CHICA", "CHICH", "CHICO", "CHICS", "CHIEL", "CHILE", - "CHINE", "CHINO", "CHINS", "CHIPS", "CHIRL", "CHIRO", "CHIRR", "CHIRT", "CHITS", - "CHOCO", "CHOCS", "CHOIL", "CHOLA", "CHOLI", "CHOLO", "CHONS", "CHOON", "CHOPS", - "CHOTA", "CHOTT", "CIELS", "CILIA", "CILLS", "CINCT", "CINES", "CIONS", "CIPPI", - "CIRCS", "CIRES", "CIRLS", "CIRRI", "CISCO", "CISTS", "CITAL", "CITER", "CITES", - "CLACH", "CLAES", "CLANS", "CLAPS", "CLAPT", "CLARO", "CLART", "CLAST", "CLATS", - "CLEEP", "CLEPE", "CLEPT", "CLIES", "CLINE", "CLINT", "CLIPE", "CLIPS", "CLIPT", - "CLITS", "CLONS", "CLOOP", "CLOOT", "CLOPS", "CLOTE", "CLOTS", "COACT", "COALA", - "COALS", "COAPT", "COATE", "COATI", "COATS", "COCAS", "COCCI", "COCCO", "COCOS", - "COHEN", "COHOE", "COHOS", "COILS", "COINS", "COIRS", "COITS", "COLAS", "COLES", - "COLIC", "COLIN", "COLLS", "COLTS", "CONES", "CONIA", "CONIN", "CONNE", "CONNS", - "CONTE", "CONTO", "COOCH", "COOEE", "COOER", "COOLS", "COONS", "COOPS", "COOPT", - "COOST", "COOTS", "COPAL", "COPEN", "COPER", "COPES", "COPRA", "CORES", "CORIA", - "CORNI", "CORNO", "CORNS", "CORPS", "CORSE", "CORSO", "COSEC", "COSES", "COSET", - "COSIE", "COSTA", "COSTE", "COSTS", "COTAN", "COTES", "COTHS", "COTTA", "COTTS", - "CRAAL", "CRAIC", "CRANS", "CRAPE", "CRAPS", "CRARE", "CREEL", "CREES", "CRENA", - "CREPS", "CRIAS", "CRIES", "CRINE", "CRIOS", "CRIPE", "CRIPS", "CRISE", "CRITH", - "CRITS", "CROCI", "CROCS", "CRONS", "CROOL", "CROON", "CROPS", "CRORE", "CROST", - "CTENE", "EALES", "EARLS", "EARNS", "EARNT", "EARST", "EASER", "EASES", "EASLE", - "EASTS", "EATHE", "ECHES", "ECHOS", "EISEL", "ELAIN", "ELANS", "ELCHI", "ELINT", - "ELOIN", "ELOPS", "ELPEE", "ELSIN", "ENATE", "ENIAC", "ENLIT", "ENOLS", "ENROL", - "ENTIA", "EORLS", "EOSIN", "EPACT", "EPEES", "EPHAH", "EPHAS", "EPHOR", "EPICS", - "EPOPT", "EPRIS", "ERICA", "ERICS", "ERNES", "EROSE", "ERSES", "ESCAR", "ESCOT", - "ESILE", "ESNES", "ESSES", "ESTOC", "ESTOP", "ESTRO", "ETAPE", "ETATS", "ETENS", - "ETHAL", "ETHNE", "ETICS", "ETNAS", "ETTIN", "ETTLE", "HAARS", "HAETS", "HAHAS", - "HAILS", "HAINS", "HAINT", "HAIRS", "HAITH", "HALAL", "HALER", "HALES", "HALLO", - "HALLS", "HALON", "HALOS", "HALSE", "HALTS", "HANAP", "HANCE", "HANCH", "HANSA", - "HANSE", "HANTS", "HAOLE", "HAPPI", "HARES", "HARLS", "HARNS", "HAROS", "HARPS", - "HARTS", "HASPS", "HASTA", "HATES", "HATHA", "HEALS", "HEAPS", "HEARE", "HEARS", - "HEAST", "HEATS", "HECHT", "HEELS", "HEILS", "HEIRS", "HELES", "HELIO", "HELLS", - "HELOS", "HELOT", "HELPS", "HENCH", "HENNA", "HENTS", "HEPAR", "HERES", "HERLS", - "HERNS", "HEROS", "HERSE", "HESPS", "HESTS", "HETES", "HETHS", "HIANT", "HILAR", - "HILCH", "HILLO", "HILLS", "HILTS", "HINTS", "HIOIS", "HIREE", "HIRER", "HIRES", - "HISTS", "HITHE", "HOARS", "HOAST", "HOERS", "HOISE", "HOLES", "HOLLA", "HOLLO", - "HOLON", "HOLOS", "HOLTS", "HONAN", "HONER", "HONES", "HOOCH", "HOONS", "HOOPS", - "HOORS", "HOOSH", "HOOTS", "HOPER", "HOPES", "HORAH", "HORAL", "HORAS", "HORIS", - "HORNS", "HORST", "HOSEL", "HOSEN", "HOSER", "HOSES", "HOSTA", "HOSTS", "HOTCH", - "HOTEN", "ICERS", "ICHES", "ICHOR", "ICIER", "ICONS", "ICTAL", "ICTIC", "ILEAC", - "ILEAL", "ILIAL", "ILLER", "ILLTH", "INAPT", "INCEL", "INCLE", "INION", "INNIT", - "INSET", "INSPO", "INTEL", "INTIL", "INTIS", "INTRA", "IOTAS", "IPPON", "IRONE", - "IRONS", "ISHES", "ISLES", "ISNAE", "ISSEI", "ISTLE", "ITHER", "LAARI", "LACER", - "LACES", "LACET", "LAERS", "LAHAL", "LAHAR", "LAICH", "LAICS", "LAIRS", "LAITH", - "LALLS", "LANAI", "LANAS", "LANCH", "LANES", "LANTS", "LAPIN", "LAPIS", "LARCH", - "LAREE", "LARES", "LARIS", "LARNS", "LARNT", "LASER", "LASES", "LASSI", "LASTS", - "LATAH", "LATEN", "LATHI", "LATHS", "LEANS", "LEAPS", "LEARE", "LEARS", "LEATS", - "LEEAR", "LEEPS", "LEERS", "LEESE", "LEETS", "LEHRS", "LEIRS", "LEISH", "LENES", - "LENIS", "LENOS", "LENSE", "LENTI", "LENTO", "LEONE", "LEPRA", "LEPTA", "LERES", - "LERPS", "LESES", "LESTS", "LETCH", "LETHE", "LIANA", "LIANE", "LIARS", "LIART", - "LICHI", "LICHT", "LICIT", "LIENS", "LIERS", "LILLS", "LILOS", "LILTS", "LINAC", - "LINCH", "LINES", "LININ", "LINNS", "LINOS", "LINTS", "LIONS", "LIPAS", "LIPES", - "LIPIN", "LIPOS", "LIRAS", "LIROT", "LISLE", "LISPS", "LISTS", "LITAI", "LITAS", - "LITES", "LITHO", "LITHS", "LITRE", "LLANO", "LOACH", "LOANS", "LOAST", "LOCHE", - "LOCHS", "LOCIE", "LOCIS", "LOCOS", "LOESS", "LOHAN", "LOINS", "LOIPE", "LOIRS", - "LOLLS", "LONER", "LOOIE", "LOONS", "LOOPS", "LOOTS", "LOPER", "LOPES", "LORAL", - "LORAN", "LOREL", "LORES", "LORIC", "LORIS", "LOSEL", "LOSEN", "LOSES", "LOTAH", - "LOTAS", "LOTES", "LOTIC", "LOTOS", "LOTSA", "LOTTA", "LOTTE", "LOTTO", "NAANS", - "NACHE", "NACHO", "NACRE", "NAHAL", "NAILS", "NAIRA", "NALAS", "NALLA", "NANAS", - "NANCE", "NANNA", "NANOS", "NAPAS", "NAPES", "NAPOO", "NAPPA", "NAPPE", "NARAS", - "NARCO", "NARCS", "NARES", "NARIC", "NARIS", "NARRE", "NASHI", "NATCH", "NATES", - "NATIS", "NEALS", "NEAPS", "NEARS", "NEATH", "NEATS", "NEELE", "NEEPS", "NEESE", - "NEIST", "NELIS", "NENES", "NEONS", "NEPER", "NEPIT", "NERAL", "NEROL", "NERTS", - "NESTS", "NETES", "NETOP", "NETTS", "NICHT", "NICOL", "NIHIL", "NILLS", "NINER", - "NINES", "NINON", "NIPAS", "NIRLS", "NISEI", "NISSE", "NITER", "NITES", "NITON", - "NITRE", "NITRO", "NOAHS", "NOELS", "NOILS", "NOINT", "NOIRS", "NOLES", "NOLLS", - "NOLOS", "NONAS", "NONCE", "NONES", "NONET", "NONIS", "NOOIT", "NOONS", "NOOPS", - "NOPAL", "NORIA", "NORIS", "NOSER", "NOSES", "NOTAL", "NOTER", "NOTES", "OASES", - "OASIS", "OASTS", "OATEN", "OATER", "OATHS", "OCHER", "OCHES", "OCHRE", "OCREA", - "OCTAN", "OCTAS", "OHIAS", "OHONE", "OILER", "OINTS", "OLEIC", "OLEIN", "OLENT", - "OLEOS", "OLIOS", "OLLAS", "OLLER", "OLLIE", "OLPAE", "OLPES", "ONCER", "ONCES", - "ONCET", "ONERS", "ONTIC", "OONTS", "OORIE", "OOSES", "OPAHS", "OPALS", "OPENS", - "OPEPE", "OPPOS", "OPSIN", "OPTER", "ORACH", "ORALS", "ORANT", "ORATE", "ORCAS", - "ORCIN", "ORIEL", "ORLES", "ORLON", "ORLOP", "ORNIS", "ORPIN", "ORRIS", "ORTHO", - "OSCAR", "OSHAC", "OSIER", "OSSIA", "OSTIA", "OTTAR", "OTTOS", "PAALS", "PAANS", - "PACAS", "PACER", "PACES", "PACHA", "PACOS", "PACTA", "PACTS", "PAEAN", "PAEON", - "PAILS", "PAINS", "PAIRE", "PAIRS", "PAISA", "PAISE", "PALAS", "PALEA", "PALES", - "PALET", "PALIS", "PALLA", "PALLS", "PALPI", "PALPS", "PALSA", "PANCE", "PANES", - "PANNE", "PANNI", "PANTO", "PANTS", "PAOLI", "PAOLO", "PAPAS", "PAPES", "PAPPI", - "PARAE", "PARAS", "PARCH", "PAREN", "PAREO", "PARES", "PARIS", "PARLE", "PAROL", - "PARPS", "PARRA", "PARRS", "PARTI", "PARTS", "PASEO", "PASES", "PASHA", "PASSE", - "PASTS", "PATEN", "PATER", "PATES", "PATHS", "PATIN", "PATTE", "PEALS", "PEANS", - "PEARE", "PEARS", "PEART", "PEASE", "PEATS", "PECHS", "PEECE", "PEELS", "PEENS", - "PEEPE", "PEEPS", "PEERS", "PEINS", "PEISE", "PELAS", "PELES", "PELLS", "PELON", - "PELTA", "PELTS", "PENES", "PENIE", "PENIS", "PENNA", "PENNI", "PENTS", "PEONS", - "PEPLA", "PEPOS", "PEPSI", "PERAI", "PERCE", "PERCS", "PEREA", "PERES", "PERIS", - "PERNS", "PERPS", "PERSE", "PERST", "PERTS", "PESOS", "PESTS", "PETAR", "PETER", - "PETIT", "PETRE", "PETRI", "PETTI", "PETTO", "PHARE", "PHEER", "PHENE", "PHEON", - "PHESE", "PHIAL", "PHISH", "PHOCA", "PHONO", "PHONS", "PHOTS", "PHPHT", "PIANI", - "PIANS", "PICAL", "PICAS", "PICOT", "PICRA", "PIERS", "PIERT", "PIETA", "PIETS", - "PILAE", "PILAO", "PILAR", "PILCH", "PILEA", "PILEI", "PILER", "PILES", "PILIS", - "PILLS", "PINAS", "PINES", "PINNA", "PINON", "PINOT", "PINTA", "PINTS", "PIONS", - "PIPAL", "PIPAS", "PIPES", "PIPET", "PIPIS", "PIPIT", "PIRAI", "PIRLS", "PIRNS", - "PISCO", "PISES", "PISOS", "PISTE", "PITAS", "PITHS", "PITON", "PITOT", "PITTA", - "PLAAS", "PLANS", "PLAPS", "PLASH", "PLAST", "PLATS", "PLATT", "PLEAS", "PLENA", - "PLEON", "PLESH", "PLICA", "PLIES", "PLOAT", "PLOPS", "PLOTS", "POACH", "POEPS", - "POETS", "POLER", "POLES", "POLIO", "POLIS", "POLLS", "POLOS", "POLTS", "PONCE", - "PONES", "PONTS", "POOHS", "POOLS", "POONS", "POOPS", "POORI", "POORT", "POOTS", - "POPES", "POPPA", "PORAE", "PORAL", "PORER", "PORES", "PORIN", "PORNO", "PORNS", - "PORTA", "PORTS", "POSES", "POSHO", "POSTS", "POTAE", "POTCH", "POTES", "POTIN", - "POTOO", "POTTO", "POTTS", "PRANA", "PRAOS", "PRASE", "PRATE", "PRATS", "PRATT", - "PREES", "PRENT", "PREON", "PREOP", "PREPS", "PRESA", "PRESE", "PREST", "PRIAL", - "PRIER", "PRIES", "PRILL", "PRION", "PRISE", "PRISS", "PROAS", "PROIN", "PROLE", - "PROLL", "PROPS", "PRORE", "PROSO", "PROSS", "PROST", "PROTO", "PSION", "PSOAE", - "PSOAI", "PSOAS", "PSORA", "RACES", "RACHE", "RACON", "RAIAS", "RAILE", "RAILS", - "RAINE", "RAINS", "RAITA", "RAITS", "RALES", "RANAS", "RANCE", "RANEE", "RANIS", - "RANTS", "RAPER", "RAPES", "RAPHE", "RAPPE", "RAREE", "RARES", "RASER", "RASES", - "RASPS", "RASSE", "RASTA", "RATAL", "RATAN", "RATAS", "RATCH", "RATEL", "RATER", - "RATES", "RATHA", "RATHE", "RATHS", "RATOO", "RATOS", "REAIS", "REALO", "REALS", - "REANS", "REAPS", "REARS", "REAST", "REATA", "REATE", "RECAL", "RECCE", "RECCO", - "RECIT", "RECON", "RECTA", "RECTI", "RECTO", "REECH", "REELS", "REENS", "REEST", - "REINS", "REIST", "RELET", "RELIE", "RELIT", "RELLO", "RENIN", "RENNE", "RENOS", - "RENTE", "RENTS", "REOIL", "REPIN", "REPLA", "REPOS", "REPOT", "REPPS", "REPRO", - "RERAN", "RESAT", "RESEE", "RESES", "RESIT", "RESTO", "RESTS", "RETIA", "RETIE", - "RHEAS", "RHIES", "RHINE", "RHONE", "RIALS", "RIANT", "RIATA", "RICER", "RICES", - "RICHT", "RICIN", "RIELS", "RILES", "RILLE", "RILLS", "RINES", "RIOTS", "RIPES", - "RIPPS", "RISES", "RISHI", "RISPS", "RITES", "RITTS", "ROANS", "ROARS", "ROATE", - "ROHES", "ROILS", "ROINS", "ROIST", "ROLES", "ROLLS", "RONEO", "RONES", "RONIN", - "RONNE", "RONTE", "RONTS", "ROONS", "ROOPS", "ROOSA", "ROOSE", "ROOTS", "ROPER", - "ROPES", "RORAL", "RORES", "RORIC", "RORIE", "RORTS", "ROSES", "ROSET", "ROSHI", - "ROSIN", "ROSIT", "ROSTI", "ROSTS", "ROTAL", "ROTAN", "ROTAS", "ROTCH", "ROTES", - "ROTIS", "ROTLS", "ROTON", "ROTOS", "ROTTE", "SACRA", "SAICE", "SAICS", "SAILS", - "SAINE", "SAINS", "SAIRS", "SAIST", "SAITH", "SALAL", "SALAT", "SALEP", "SALES", - "SALET", "SALIC", "SALLE", "SALOL", "SALOP", "SALPA", "SALPS", "SALSE", "SALTO", - "SALTS", "SANES", "SANSA", "SANTO", "SANTS", "SAOLA", "SAPAN", "SAPOR", "SARAN", - "SAREE", "SARIN", "SARIS", "SAROS", "SASER", "SASIN", "SASSE", "SATAI", "SATES", - "SATIS", "SCAIL", "SCALA", "SCALL", "SCANS", "SCAPA", "SCAPE", "SCAPI", "SCARP", - "SCARS", "SCART", "SCATH", "SCATS", "SCATT", "SCEAT", "SCENA", "SCOOT", "SCOPA", - "SCOPS", "SCOTS", "SCRAE", "SCRAN", "SCRAT", "SCRIP", "SEALS", "SEANS", "SEARE", - "SEARS", "SEASE", "SEATS", "SECCO", "SECHS", "SECTS", "SEELS", "SEEPS", "SEERS", - "SEHRI", "SEILS", "SEINE", "SEIRS", "SEISE", "SELAH", "SELES", "SELLA", "SELLE", - "SELLS", "SENAS", "SENES", "SENNA", "SENOR", "SENSA", "SENSI", "SENTE", "SENTI", - "SENTS", "SEPAL", "SEPIC", "SEPTA", "SEPTS", "SERAC", "SERAI", "SERAL", "SERER", - "SERES", "SERIC", "SERIN", "SERON", "SERRA", "SERRE", "SERRS", "SESSA", "SETAE", - "SETAL", "SETON", "SETTS", "SHAHS", "SHANS", "SHAPS", "SHARN", "SHASH", "SHCHI", - "SHEAL", "SHEAS", "SHEEL", "SHENT", "SHEOL", "SHERE", "SHERO", "SHETS", "SHIAI", - "SHIEL", "SHIER", "SHIES", "SHILL", "SHINS", "SHIPS", "SHIRR", "SHIRS", "SHISH", - "SHISO", "SHIST", "SHITE", "SHITS", "SHLEP", "SHOAT", "SHOER", "SHOES", "SHOLA", - "SHOOL", "SHOON", "SHOOS", "SHOPE", "SHOPS", "SHORL", "SHOTE", "SHOTS", "SHOTT", - "SHRIS", "SIALS", "SICES", "SICHT", "SIENS", "SIENT", "SIETH", "SILEN", "SILER", - "SILES", "SILLS", "SILOS", "SILTS", "SINES", "SINHS", "SIPES", "SIREE", "SIRES", - "SIRIH", "SIRIS", "SIROC", "SIRRA", "SISAL", "SISES", "SISTA", "SISTS", "SITAR", - "SITES", "SITHE", "SLAES", "SLANE", "SLAPS", "SLART", "SLATS", "SLEER", "SLIER", - "SLIPE", "SLIPS", "SLIPT", "SLISH", "SLITS", "SLOAN", "SLOES", "SLOOT", "SLOPS", - "SLOTS", "SNAPS", "SNARS", "SNASH", "SNATH", "SNEAP", "SNEES", "SNELL", "SNIES", - "SNIPS", "SNIRT", "SNITS", "SNOEP", "SNOOL", "SNOOT", "SNOTS", "SOAPS", "SOARE", - "SOARS", "SOCAS", "SOCES", "SOCLE", "SOILS", "SOLAH", "SOLAN", "SOLAS", "SOLEI", - "SOLER", "SOLES", "SOLON", "SOLOS", "SONCE", "SONES", "SONNE", "SONSE", "SOOLE", - "SOOLS", "SOOPS", "SOOTE", "SOOTS", "SOPHS", "SOPOR", "SOPRA", "SORAL", "SORAS", - "SOREE", "SOREL", "SORER", "SORES", "SORNS", "SORRA", "SORTA", "SORTS", "SOTHS", - "SOTOL", "SPAER", "SPAES", "SPAHI", "SPAIL", "SPAIN", "SPAIT", "SPALE", "SPALL", - "SPALT", "SPANE", "SPANS", "SPARS", "SPART", "SPATE", "SPATS", "SPEAL", "SPEAN", - "SPEAT", "SPECS", "SPECT", "SPEEL", "SPEER", "SPEIL", "SPEIR", "SPEOS", "SPETS", - "SPIAL", "SPICA", "SPICS", "SPIER", "SPIES", "SPILE", "SPINA", "SPINS", "SPIRT", - "SPITS", "SPOOR", "SPOOT", "SPOSH", "SPOTS", "SPRAT", "SPRIT", "STANE", "STAPH", - "STAPS", "STARN", "STARR", "STARS", "STATS", "STEAN", "STEAR", "STEEN", "STEIL", - "STELA", "STELE", "STELL", "STENO", "STENS", "STENT", "STEPS", "STEPT", "STERE", - "STETS", "STICH", "STIES", "STILE", "STIPA", "STIPE", "STIRE", "STIRP", "STIRS", - "STOAE", "STOAI", "STOAS", "STOAT", "STOEP", "STOIT", "STOLN", "STONN", "STOOR", - "STOPE", "STOPS", "STOPT", "STOSS", "STOTS", "STOTT", "STRAE", "STREP", "STRIA", - "STROP", "TAALS", "TAATA", "TACAN", "TACES", "TACET", "TACHE", "TACHO", "TACHS", - "TACOS", "TACTS", "TAELS", "TAHAS", "TAHRS", "TAILS", "TAINS", "TAIRA", "TAISH", - "TAITS", "TALAR", "TALAS", "TALCS", "TALEA", "TALER", "TALES", "TALLS", "TALPA", - "TANAS", "TANHS", "TANNA", "TANTI", "TANTO", "TAPAS", "TAPEN", "TAPES", "TAPET", - "TAPIS", "TAPPA", "TARAS", "TARES", "TARNS", "TAROC", "TAROS", "TARPS", "TARRE", - "TARSI", "TARTS", "TASAR", "TASER", "TASES", "TASSA", "TASSE", "TASSO", "TATAR", - "TATER", "TATES", "TATHS", "TATIE", "TATTS", "TEALS", "TEARS", "TEATS", "TECHS", - "TECTA", "TEELS", "TEENE", "TEENS", "TEERS", "TEHRS", "TEILS", "TEINS", "TELAE", - "TELCO", "TELES", "TELIA", "TELIC", "TELLS", "TELOI", "TELOS", "TENCH", "TENES", - "TENIA", "TENNE", "TENNO", "TENON", "TENTS", "TEPAL", "TEPAS", "TERAI", "TERAS", - "TERCE", "TERES", "TERNE", "TERNS", "TERTS", "TESLA", "TESTA", "TESTE", "TESTS", - "TETES", "TETHS", "TETRA", "TETRI", "THALE", "THALI", "THANA", "THANE", "THANS", - "THARS", "THECA", "THEES", "THEIC", "THEIN", "THENS", "THESP", "THETE", "THILL", - "THINE", "THINS", "THIOL", "THIRL", "THOLE", "THOLI", "THORO", "THORP", "THRAE", - "THRIP", "THROE", "TIANS", "TIARS", "TICAL", "TICCA", "TICES", "TIERS", "TILER", - "TILES", "TILLS", "TILTH", "TILTS", "TINAS", "TINCT", "TINEA", "TINES", "TINTS", - "TIPIS", "TIRES", "TIRLS", "TIROS", "TIRRS", "TITCH", "TITER", "TITIS", "TITRE", - "TOCOS", "TOEAS", "TOHOS", "TOILE", "TOILS", "TOISE", "TOITS", "TOLAN", "TOLAR", - "TOLAS", "TOLES", "TOLLS", "TOLTS", "TONER", "TONES", "TONNE", "TOOLS", "TOONS", - "TOOTS", "TOPEE", "TOPER", "TOPES", "TOPHE", "TOPHI", "TOPHS", "TOPIS", "TOPOI", - "TOPOS", "TORAH", "TORAN", "TORAS", "TORCS", "TORES", "TORIC", "TORII", "TOROS", - "TOROT", "TORRS", "TORSE", "TORSI", "TORTA", "TORTE", "TORTS", "TOSAS", "TOSES", - "TOTER", "TOTES", "TRANS", "TRANT", "TRAPE", "TRAPS", "TRAPT", "TRASS", "TRATS", - "TRATT", "TREEN", "TREES", "TRESS", "TREST", "TRETS", "TRIAC", "TRIER", "TRIES", - "TRILL", "TRINE", "TRINS", "TRIOL", "TRIOR", "TRIOS", "TRIPS", "TRIST", "TROAT", - "TROIS", "TRONA", "TRONC", "TRONE", "TRONS", "TROTH", "TROTS", "TSARS", -}; - -static const uint16_t _num_words = (sizeof(_valid_words) / sizeof(_valid_words[0])); -static const uint16_t _num_possible_words = (sizeof(_possible_words) / sizeof(_possible_words[0])); -static const uint8_t _num_valid_letters = (sizeof(_valid_letters) / sizeof(_valid_letters[0])); - static uint32_t get_random(uint32_t max) { #if __EMSCRIPTEN__ return rand() % max; @@ -687,11 +411,10 @@ static void get_result(wordle_state_t *state) { } #if (USE_RANDOM_GUESS != 0) -static const uint16_t _num_unique_words = 257; // The _valid_words array begins with this many words where each letter is different. static void insert_random_guess(wordle_state_t *state) { uint16_t random_guess; do { // Don't allow the guess to be the same as the answer - random_guess = get_random(USE_RANDOM_GUESS == 2 ? _num_unique_words : _num_words); + random_guess = get_random(_num_random_guess_words); } while (random_guess == state->curr_answer); for (size_t i = 0; i < WORDLE_LENGTH; i++) { for (size_t j = 0; j < _num_valid_letters; j++) diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 62a4571d..6ae1fbd8 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -70,6 +70,11 @@ * 2 = Allow using a random guess of any value that can be an answer where all of its letters are unique */ #define USE_RANDOM_GUESS 2 +#include "wordle_face_dict.h" + +static const uint16_t _num_words = (sizeof(_valid_words) / sizeof(_valid_words[0])); +static const uint16_t _num_possible_words = (sizeof(_possible_words) / sizeof(_possible_words[0])); +static const uint8_t _num_valid_letters = (sizeof(_valid_letters) / sizeof(_valid_letters[0])); typedef enum { WORDLE_LETTER_WRONG = 0, diff --git a/movement/watch_faces/complication/wordle_face_dict.h b/movement/watch_faces/complication/wordle_face_dict.h new file mode 100644 index 00000000..1942b16e --- /dev/null +++ b/movement/watch_faces/complication/wordle_face_dict.h @@ -0,0 +1,289 @@ +#ifndef WORDLE_FACE_DICT_H_ +#define WORDLE_FACE_DICT_H_ + +#ifndef WORDLE_LENGTH +#define WORDLE_LENGTH 5 +#endif + +#ifndef USE_RANDOM_GUESS +#define USE_RANDOM_GUESS 2 +#endif + +static const char _valid_letters[] = {'A', 'C', 'E', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'S', 'T'}; + +// From: https://matthewminer.name/projects/calculators/wordle-words-left/ +// Number of words found: 432 +static const char _valid_words[][WORDLE_LENGTH + 1] = { + "STALE", "TRACE", "CLOSE", "ARISE", "SNIPE", "SHIRE", "LEASH", "SAINT", "CLEAN", + "RELIC", "CHORE", "CRONE", "REACH", "CHAOS", "TAPIR", "CAIRN", "TENOR", "STARE", + "HEART", "SCOPE", "SNARL", "SLEPT", "SINCE", "EPOCH", "SPACE", "SHARE", "SPOIL", + "LITER", "LEAPT", "LANCE", "RANCH", "HORSE", "LEACH", "LATER", "STEAL", "CHEAP", + "SHORT", "ETHIC", "CHANT", "ACTOR", "SPARE", "SEPIA", "ONSET", "SPLAT", "LEANT", + "REACT", "OCTAL", "SPORE", "IRATE", "CORAL", "NICER", "SPILT", "SCENT", "PANIC", + "SHIRT", "PECAN", "SLAIN", "SPLIT", "ROACH", "ASCOT", "PHONE", "LITHE", "STOIC", + "STRIP", "RENAL", "POISE", "ENACT", "CHEAT", "PITCH", "NOISE", "INLET", "PEARL", + "POLAR", "PEACH", "STOLE", "CASTE", "CREST", "SCARE", "ETHOS", "THEIR", "STONE", + "SLATE", "LATCH", "HASTE", "SNARE", "SPINE", "SLANT", "SPEAR", "SCALE", "CAPER", + "RETCH", "PESTO", "CHIRP", "SPORT", "OPTIC", "SNAIL", "PRICE", "PLANE", "TORCH", + "PASTE", "RECAP", "SOLAR", "CRASH", "LINER", "OPINE", "ASHEN", "PALER", "ECLAT", + "SPELT", "TRIAL", "PERIL", "SLICE", "SCANT", "RAISE", "POSIT", "ATONE", "SPIRE", + "COAST", "INEPT", "SHOAL", "CLASH", "THORN", "PHASE", "SCORE", "TRICE", "PERCH", + "PORCH", "SHEAR", "CHOIR", "RHINO", "PLANT", "SHONE", "SANER", "LEARN", "ALTER", + "CHAIN", "PANEL", "PLIER", "STEIN", "COPSE", "SONIC", "ALIEN", "CHOSE", "ACORN", + "ANTIC", "CHEST", "OTHER", "CHINA", "TALON", "SCORN", "PLAIN", "PILOT", "RIPEN", + "PATCH", "SPICE", "CLONE", "SCION", "SCONE", "STRAP", "PARSE", "SHALE", "RISEN", + "CANOE", "INTER", "CRATE", "ISLET", "PRINT", "SHINE", "NORTH", "CLEAT", "PLAIT", + "SCRAP", "CLEAR", "SLOTH", "LAPSE", "CHAIR", "SNORT", "SHARP", "OPERA", "STAIN", + "TEACH", "TRAIL", "TRAIN", "LATHE", "PIANO", "PINCH", "PETAL", "STERN", "PRONE", + "PROSE", "PLEAT", "TROPE", "PLACE", "POSER", "INERT", "CHASE", "CAROL", "STAIR", + "SATIN", "SPITE", "LOATH", "ROAST", "ARSON", "SHAPE", "CLASP", "LOSER", "SALON", + "CATER", "SHALT", "INTRO", "ALERT", "PENAL", "SHORE", "RINSE", "CREPT", "APRON", + "SONAR", "AISLE", "AROSE", "HATER", "NICHE", "POINT", "EARTH", "PINTO", "THOSE", + "CLOTH", "NOTCH", "TOPIC", "RESIN", "SCALP", "HEIST", "HERON", "TRIPE", "TONAL", + "TAPER", "SHORN", "TONIC", "HOIST", "SNORE", "STORE", "SLOPE", "OCEAN", "CHART", + "PAINT", "SPENT", "CRANE", "CRISP", "TRASH", "PATIO", "PLATE", "HOTEL", "LEAST", + "ALONE", "RALPH", "SPIEL", "SIREN", "RATIO", "STOOP", "TROLL", "ATOLL", "SLASH", + "RETRO", "CREEP", "STILT", "SPREE", "TASTE", "CACHE", "CANON", "EATEN", "TEPEE", + "SHEET", "SNEER", "ERROR", "NATAL", "SLEEP", "STINT", "TROOP", "SHALL", "STALL", + "PIPER", "TOAST", "NASAL", "CORER", "THERE", "POOCH", "SCREE", "ELITE", "ALTAR", + "PENCE", "EATER", "ALPHA", "TENTH", "LINEN", "SHEER", "TAINT", "HEATH", "CRIER", + "TENSE", "CARAT", "CANAL", "APNEA", "THESE", "HATCH", "SHELL", "CIRCA", "APART", + "SPILL", "STEEL", "LOCAL", "STOOL", "SHEEN", "RESET", "STEEP", "ELATE", "PRESS", + "SLEET", "CROSS", "TOTAL", "TREAT", "ONION", "STATE", "CINCH", "ASSET", "THREE", + "TORSO", "SNOOP", "PENNE", "SPOON", "SHEEP", "PAPAL", "STILL", "CHILL", "THETA", + "LEECH", "INNER", "HONOR", "LOOSE", "CONIC", "SCENE", "COACH", "CONCH", "LATTE", + "ERASE", "ESTER", "PEACE", "PASTA", "INANE", "SPOOL", "TEASE", "HARSH", "PIECE", + "STEER", "SCOOP", "NINTH", "OTTER", "OCTET", "EERIE", "RISER", "LAPEL", "HIPPO", + "PREEN", "ETHER", "AORTA", "SENSE", "TRACT", "SHOOT", "SLOOP", "REPEL", "TITHE", + "IONIC", "CELLO", "CHESS", "SOOTH", "COCOA", "TITAN", "TOOTH", "TIARA", "CRESS", + "SLOSH", "RARER", "TERSE", "ERECT", "HELLO", "PARER", "RIPER", "NOOSE", "CREPE", + "CACAO", "ILIAC", "POSSE", "CACTI", "EASEL", "LASSO", "ROOST", "ALLOT", "COLON", + "LEPER", "TEETH", "TITLE", "HENCE", "NIECE", "PAPER", "TRITE", "SPELL", "RACER", + "ATTIC", "CRASS", "HITCH", "LEASE", "CEASE", "ROTOR", "ELOPE", "APPLE", "CHILI", + "START", "PHOTO", "SALSA", "STASH", "PRIOR", "TAROT", "COLOR", "CHEER", "CLASS", + "ARENA", "ELECT", "ENTER", "CATCH", "TENET", "TACIT", "TRAIT", "TERRA", "LILAC", +}; + +// These are words that'll never be used, but still need to be in the dictionary for guesses. +// Number of words found: 1898 +static const char _possible_words[][WORDLE_LENGTH + 1] = { + "AALII", "AARTI", "ACAIS", "ACARI", "ACCAS", "ACERS", "ACETA", "ACHAR", "ACHES", + "ACHOO", "ACINI", "ACNES", "ACRES", "ACROS", "ACTIN", "ACTON", "AECIA", "AEONS", + "AERIE", "AEROS", "AESIR", "AHEAP", "AHENT", "AHINT", "AINEE", "AIOLI", "AIRER", + "AIRNS", "AIRTH", "AIRTS", "AITCH", "ALAAP", "ALANE", "ALANS", "ALANT", "ALAPA", + "ALAPS", "ALATE", "ALCOS", "ALECS", "ALEPH", "ALIAS", "ALINE", "ALIST", "ALLEE", + "ALLEL", "ALLIS", "ALOES", "ALOHA", "ALOIN", "ALOOS", "ALTHO", "ALTOS", "ANANA", + "ANATA", "ANCHO", "ANCLE", "ANCON", "ANEAR", "ANELE", "ANENT", "ANILE", "ANILS", + "ANION", "ANISE", "ANLAS", "ANNAL", "ANNAS", "ANNAT", "ANOAS", "ANOLE", "ANSAE", + "ANTAE", "ANTAR", "ANTAS", "ANTES", "ANTIS", "ANTRA", "ANTRE", "APACE", "APERS", + "APERT", "APHIS", "APIAN", "APIOL", "APISH", "APOOP", "APORT", "APPAL", "APPEL", + "APPRO", "APRES", "APSES", "APSIS", "APSOS", "APTER", "ARARS", "ARCHI", "ARCOS", + "AREAE", "AREAL", "AREAR", "AREAS", "ARECA", "AREIC", "ARENE", "AREPA", "ARERE", + "ARETE", "ARETS", "ARETT", "ARHAT", "ARIAS", "ARIEL", "ARILS", "ARIOT", "ARISH", + "ARLES", "ARNAS", "AROHA", "ARPAS", "ARPEN", "ARRAH", "ARRAS", "ARRET", "ARRIS", + "ARSES", "ARSIS", "ARTAL", "ARTEL", "ARTIC", "ARTIS", "ASANA", "ASCON", "ASHES", + "ASHET", "ASPEN", "ASPER", "ASPIC", "ASPIE", "ASPIS", "ASPRO", "ASSAI", "ASSES", + "ASSOT", "ASTER", "ASTIR", "ATAPS", "ATILT", "ATLAS", "ATOCS", "ATRIA", "ATRIP", + "ATTAP", "ATTAR", "CACAS", "CAECA", "CAESE", "CAINS", "CALLA", "CALLS", "CALOS", + "CALPA", "CALPS", "CANEH", "CANER", "CANES", "CANNA", "CANNS", "CANSO", "CANST", + "CANTO", "CANTS", "CAPAS", "CAPES", "CAPHS", "CAPLE", "CAPON", "CAPOS", "CAPOT", + "CAPRI", "CARAP", "CARER", "CARES", "CARET", "CARLE", "CARLS", "CARNS", "CARON", + "CARPI", "CARPS", "CARRS", "CARSE", "CARTA", "CARTE", "CARTS", "CASAS", "CASCO", + "CASES", "CASTS", "CATES", "CECAL", "CEILI", "CEILS", "CELLA", "CELLI", "CELLS", + "CELTS", "CENSE", "CENTO", "CENTS", "CEORL", "CEPES", "CERCI", "CERES", "CERIA", + "CERIC", "CERNE", "CEROC", "CEROS", "CERTS", "CESSE", "CESTA", "CESTI", "CETES", + "CHACE", "CHACO", "CHAIS", "CHALS", "CHANA", "CHAPE", "CHAPS", "CHAPT", "CHARA", + "CHARE", "CHARR", "CHARS", "CHATS", "CHEEP", "CHELA", "CHELP", "CHERE", "CHERT", + "CHETH", "CHIAO", "CHIAS", "CHICA", "CHICH", "CHICO", "CHICS", "CHIEL", "CHILE", + "CHINE", "CHINO", "CHINS", "CHIPS", "CHIRL", "CHIRO", "CHIRR", "CHIRT", "CHITS", + "CHOCO", "CHOCS", "CHOIL", "CHOLA", "CHOLI", "CHOLO", "CHONS", "CHOON", "CHOPS", + "CHOTA", "CHOTT", "CIELS", "CILIA", "CILLS", "CINCT", "CINES", "CIONS", "CIPPI", + "CIRCS", "CIRES", "CIRLS", "CIRRI", "CISCO", "CISTS", "CITAL", "CITER", "CITES", + "CLACH", "CLAES", "CLANS", "CLAPS", "CLAPT", "CLARO", "CLART", "CLAST", "CLATS", + "CLEEP", "CLEPE", "CLEPT", "CLIES", "CLINE", "CLINT", "CLIPE", "CLIPS", "CLIPT", + "CLITS", "CLONS", "CLOOP", "CLOOT", "CLOPS", "CLOTE", "CLOTS", "COACT", "COALA", + "COALS", "COAPT", "COATE", "COATI", "COATS", "COCAS", "COCCI", "COCCO", "COCOS", + "COHEN", "COHOE", "COHOS", "COILS", "COINS", "COIRS", "COITS", "COLAS", "COLES", + "COLIC", "COLIN", "COLLS", "COLTS", "CONES", "CONIA", "CONIN", "CONNE", "CONNS", + "CONTE", "CONTO", "COOCH", "COOEE", "COOER", "COOLS", "COONS", "COOPS", "COOPT", + "COOST", "COOTS", "COPAL", "COPEN", "COPER", "COPES", "COPRA", "CORES", "CORIA", + "CORNI", "CORNO", "CORNS", "CORPS", "CORSE", "CORSO", "COSEC", "COSES", "COSET", + "COSIE", "COSTA", "COSTE", "COSTS", "COTAN", "COTES", "COTHS", "COTTA", "COTTS", + "CRAAL", "CRAIC", "CRANS", "CRAPE", "CRAPS", "CRARE", "CREEL", "CREES", "CRENA", + "CREPS", "CRIAS", "CRIES", "CRINE", "CRIOS", "CRIPE", "CRIPS", "CRISE", "CRITH", + "CRITS", "CROCI", "CROCS", "CRONS", "CROOL", "CROON", "CROPS", "CRORE", "CROST", + "CTENE", "EALES", "EARLS", "EARNS", "EARNT", "EARST", "EASER", "EASES", "EASLE", + "EASTS", "EATHE", "ECHES", "ECHOS", "EISEL", "ELAIN", "ELANS", "ELCHI", "ELINT", + "ELOIN", "ELOPS", "ELPEE", "ELSIN", "ENATE", "ENIAC", "ENLIT", "ENOLS", "ENROL", + "ENTIA", "EORLS", "EOSIN", "EPACT", "EPEES", "EPHAH", "EPHAS", "EPHOR", "EPICS", + "EPOPT", "EPRIS", "ERICA", "ERICS", "ERNES", "EROSE", "ERSES", "ESCAR", "ESCOT", + "ESILE", "ESNES", "ESSES", "ESTOC", "ESTOP", "ESTRO", "ETAPE", "ETATS", "ETENS", + "ETHAL", "ETHNE", "ETICS", "ETNAS", "ETTIN", "ETTLE", "HAARS", "HAETS", "HAHAS", + "HAILS", "HAINS", "HAINT", "HAIRS", "HAITH", "HALAL", "HALER", "HALES", "HALLO", + "HALLS", "HALON", "HALOS", "HALSE", "HALTS", "HANAP", "HANCE", "HANCH", "HANSA", + "HANSE", "HANTS", "HAOLE", "HAPPI", "HARES", "HARLS", "HARNS", "HAROS", "HARPS", + "HARTS", "HASPS", "HASTA", "HATES", "HATHA", "HEALS", "HEAPS", "HEARE", "HEARS", + "HEAST", "HEATS", "HECHT", "HEELS", "HEILS", "HEIRS", "HELES", "HELIO", "HELLS", + "HELOS", "HELOT", "HELPS", "HENCH", "HENNA", "HENTS", "HEPAR", "HERES", "HERLS", + "HERNS", "HEROS", "HERSE", "HESPS", "HESTS", "HETES", "HETHS", "HIANT", "HILAR", + "HILCH", "HILLO", "HILLS", "HILTS", "HINTS", "HIOIS", "HIREE", "HIRER", "HIRES", + "HISTS", "HITHE", "HOARS", "HOAST", "HOERS", "HOISE", "HOLES", "HOLLA", "HOLLO", + "HOLON", "HOLOS", "HOLTS", "HONAN", "HONER", "HONES", "HOOCH", "HOONS", "HOOPS", + "HOORS", "HOOSH", "HOOTS", "HOPER", "HOPES", "HORAH", "HORAL", "HORAS", "HORIS", + "HORNS", "HORST", "HOSEL", "HOSEN", "HOSER", "HOSES", "HOSTA", "HOSTS", "HOTCH", + "HOTEN", "ICERS", "ICHES", "ICHOR", "ICIER", "ICONS", "ICTAL", "ICTIC", "ILEAC", + "ILEAL", "ILIAL", "ILLER", "ILLTH", "INAPT", "INCEL", "INCLE", "INION", "INNIT", + "INSET", "INSPO", "INTEL", "INTIL", "INTIS", "INTRA", "IOTAS", "IPPON", "IRONE", + "IRONS", "ISHES", "ISLES", "ISNAE", "ISSEI", "ISTLE", "ITHER", "LAARI", "LACER", + "LACES", "LACET", "LAERS", "LAHAL", "LAHAR", "LAICH", "LAICS", "LAIRS", "LAITH", + "LALLS", "LANAI", "LANAS", "LANCH", "LANES", "LANTS", "LAPIN", "LAPIS", "LARCH", + "LAREE", "LARES", "LARIS", "LARNS", "LARNT", "LASER", "LASES", "LASSI", "LASTS", + "LATAH", "LATEN", "LATHI", "LATHS", "LEANS", "LEAPS", "LEARE", "LEARS", "LEATS", + "LEEAR", "LEEPS", "LEERS", "LEESE", "LEETS", "LEHRS", "LEIRS", "LEISH", "LENES", + "LENIS", "LENOS", "LENSE", "LENTI", "LENTO", "LEONE", "LEPRA", "LEPTA", "LERES", + "LERPS", "LESES", "LESTS", "LETCH", "LETHE", "LIANA", "LIANE", "LIARS", "LIART", + "LICHI", "LICHT", "LICIT", "LIENS", "LIERS", "LILLS", "LILOS", "LILTS", "LINAC", + "LINCH", "LINES", "LININ", "LINNS", "LINOS", "LINTS", "LIONS", "LIPAS", "LIPES", + "LIPIN", "LIPOS", "LIRAS", "LIROT", "LISLE", "LISPS", "LISTS", "LITAI", "LITAS", + "LITES", "LITHO", "LITHS", "LITRE", "LLANO", "LOACH", "LOANS", "LOAST", "LOCHE", + "LOCHS", "LOCIE", "LOCIS", "LOCOS", "LOESS", "LOHAN", "LOINS", "LOIPE", "LOIRS", + "LOLLS", "LONER", "LOOIE", "LOONS", "LOOPS", "LOOTS", "LOPER", "LOPES", "LORAL", + "LORAN", "LOREL", "LORES", "LORIC", "LORIS", "LOSEL", "LOSEN", "LOSES", "LOTAH", + "LOTAS", "LOTES", "LOTIC", "LOTOS", "LOTSA", "LOTTA", "LOTTE", "LOTTO", "NAANS", + "NACHE", "NACHO", "NACRE", "NAHAL", "NAILS", "NAIRA", "NALAS", "NALLA", "NANAS", + "NANCE", "NANNA", "NANOS", "NAPAS", "NAPES", "NAPOO", "NAPPA", "NAPPE", "NARAS", + "NARCO", "NARCS", "NARES", "NARIC", "NARIS", "NARRE", "NASHI", "NATCH", "NATES", + "NATIS", "NEALS", "NEAPS", "NEARS", "NEATH", "NEATS", "NEELE", "NEEPS", "NEESE", + "NEIST", "NELIS", "NENES", "NEONS", "NEPER", "NEPIT", "NERAL", "NEROL", "NERTS", + "NESTS", "NETES", "NETOP", "NETTS", "NICHT", "NICOL", "NIHIL", "NILLS", "NINER", + "NINES", "NINON", "NIPAS", "NIRLS", "NISEI", "NISSE", "NITER", "NITES", "NITON", + "NITRE", "NITRO", "NOAHS", "NOELS", "NOILS", "NOINT", "NOIRS", "NOLES", "NOLLS", + "NOLOS", "NONAS", "NONCE", "NONES", "NONET", "NONIS", "NOOIT", "NOONS", "NOOPS", + "NOPAL", "NORIA", "NORIS", "NOSER", "NOSES", "NOTAL", "NOTER", "NOTES", "OASES", + "OASIS", "OASTS", "OATEN", "OATER", "OATHS", "OCHER", "OCHES", "OCHRE", "OCREA", + "OCTAN", "OCTAS", "OHIAS", "OHONE", "OILER", "OINTS", "OLEIC", "OLEIN", "OLENT", + "OLEOS", "OLIOS", "OLLAS", "OLLER", "OLLIE", "OLPAE", "OLPES", "ONCER", "ONCES", + "ONCET", "ONERS", "ONTIC", "OONTS", "OORIE", "OOSES", "OPAHS", "OPALS", "OPENS", + "OPEPE", "OPPOS", "OPSIN", "OPTER", "ORACH", "ORALS", "ORANT", "ORATE", "ORCAS", + "ORCIN", "ORIEL", "ORLES", "ORLON", "ORLOP", "ORNIS", "ORPIN", "ORRIS", "ORTHO", + "OSCAR", "OSHAC", "OSIER", "OSSIA", "OSTIA", "OTTAR", "OTTOS", "PAALS", "PAANS", + "PACAS", "PACER", "PACES", "PACHA", "PACOS", "PACTA", "PACTS", "PAEAN", "PAEON", + "PAILS", "PAINS", "PAIRE", "PAIRS", "PAISA", "PAISE", "PALAS", "PALEA", "PALES", + "PALET", "PALIS", "PALLA", "PALLS", "PALPI", "PALPS", "PALSA", "PANCE", "PANES", + "PANNE", "PANNI", "PANTO", "PANTS", "PAOLI", "PAOLO", "PAPAS", "PAPES", "PAPPI", + "PARAE", "PARAS", "PARCH", "PAREN", "PAREO", "PARES", "PARIS", "PARLE", "PAROL", + "PARPS", "PARRA", "PARRS", "PARTI", "PARTS", "PASEO", "PASES", "PASHA", "PASSE", + "PASTS", "PATEN", "PATER", "PATES", "PATHS", "PATIN", "PATTE", "PEALS", "PEANS", + "PEARE", "PEARS", "PEART", "PEASE", "PEATS", "PECHS", "PEECE", "PEELS", "PEENS", + "PEEPE", "PEEPS", "PEERS", "PEINS", "PEISE", "PELAS", "PELES", "PELLS", "PELON", + "PELTA", "PELTS", "PENES", "PENIE", "PENIS", "PENNA", "PENNI", "PENTS", "PEONS", + "PEPLA", "PEPOS", "PEPSI", "PERAI", "PERCE", "PERCS", "PEREA", "PERES", "PERIS", + "PERNS", "PERPS", "PERSE", "PERST", "PERTS", "PESOS", "PESTS", "PETAR", "PETER", + "PETIT", "PETRE", "PETRI", "PETTI", "PETTO", "PHARE", "PHEER", "PHENE", "PHEON", + "PHESE", "PHIAL", "PHISH", "PHOCA", "PHONO", "PHONS", "PHOTS", "PHPHT", "PIANI", + "PIANS", "PICAL", "PICAS", "PICOT", "PICRA", "PIERS", "PIERT", "PIETA", "PIETS", + "PILAE", "PILAO", "PILAR", "PILCH", "PILEA", "PILEI", "PILER", "PILES", "PILIS", + "PILLS", "PINAS", "PINES", "PINNA", "PINON", "PINOT", "PINTA", "PINTS", "PIONS", + "PIPAL", "PIPAS", "PIPES", "PIPET", "PIPIS", "PIPIT", "PIRAI", "PIRLS", "PIRNS", + "PISCO", "PISES", "PISOS", "PISTE", "PITAS", "PITHS", "PITON", "PITOT", "PITTA", + "PLAAS", "PLANS", "PLAPS", "PLASH", "PLAST", "PLATS", "PLATT", "PLEAS", "PLENA", + "PLEON", "PLESH", "PLICA", "PLIES", "PLOAT", "PLOPS", "PLOTS", "POACH", "POEPS", + "POETS", "POLER", "POLES", "POLIO", "POLIS", "POLLS", "POLOS", "POLTS", "PONCE", + "PONES", "PONTS", "POOHS", "POOLS", "POONS", "POOPS", "POORI", "POORT", "POOTS", + "POPES", "POPPA", "PORAE", "PORAL", "PORER", "PORES", "PORIN", "PORNO", "PORNS", + "PORTA", "PORTS", "POSES", "POSHO", "POSTS", "POTAE", "POTCH", "POTES", "POTIN", + "POTOO", "POTTO", "POTTS", "PRANA", "PRAOS", "PRASE", "PRATE", "PRATS", "PRATT", + "PREES", "PRENT", "PREON", "PREOP", "PREPS", "PRESA", "PRESE", "PREST", "PRIAL", + "PRIER", "PRIES", "PRILL", "PRION", "PRISE", "PRISS", "PROAS", "PROIN", "PROLE", + "PROLL", "PROPS", "PRORE", "PROSO", "PROSS", "PROST", "PROTO", "PSION", "PSOAE", + "PSOAI", "PSOAS", "PSORA", "RACES", "RACHE", "RACON", "RAIAS", "RAILE", "RAILS", + "RAINE", "RAINS", "RAITA", "RAITS", "RALES", "RANAS", "RANCE", "RANEE", "RANIS", + "RANTS", "RAPER", "RAPES", "RAPHE", "RAPPE", "RAREE", "RARES", "RASER", "RASES", + "RASPS", "RASSE", "RASTA", "RATAL", "RATAN", "RATAS", "RATCH", "RATEL", "RATER", + "RATES", "RATHA", "RATHE", "RATHS", "RATOO", "RATOS", "REAIS", "REALO", "REALS", + "REANS", "REAPS", "REARS", "REAST", "REATA", "REATE", "RECAL", "RECCE", "RECCO", + "RECIT", "RECON", "RECTA", "RECTI", "RECTO", "REECH", "REELS", "REENS", "REEST", + "REINS", "REIST", "RELET", "RELIE", "RELIT", "RELLO", "RENIN", "RENNE", "RENOS", + "RENTE", "RENTS", "REOIL", "REPIN", "REPLA", "REPOS", "REPOT", "REPPS", "REPRO", + "RERAN", "RESAT", "RESEE", "RESES", "RESIT", "RESTO", "RESTS", "RETIA", "RETIE", + "RHEAS", "RHIES", "RHINE", "RHONE", "RIALS", "RIANT", "RIATA", "RICER", "RICES", + "RICHT", "RICIN", "RIELS", "RILES", "RILLE", "RILLS", "RINES", "RIOTS", "RIPES", + "RIPPS", "RISES", "RISHI", "RISPS", "RITES", "RITTS", "ROANS", "ROARS", "ROATE", + "ROHES", "ROILS", "ROINS", "ROIST", "ROLES", "ROLLS", "RONEO", "RONES", "RONIN", + "RONNE", "RONTE", "RONTS", "ROONS", "ROOPS", "ROOSA", "ROOSE", "ROOTS", "ROPER", + "ROPES", "RORAL", "RORES", "RORIC", "RORIE", "RORTS", "ROSES", "ROSET", "ROSHI", + "ROSIN", "ROSIT", "ROSTI", "ROSTS", "ROTAL", "ROTAN", "ROTAS", "ROTCH", "ROTES", + "ROTIS", "ROTLS", "ROTON", "ROTOS", "ROTTE", "SACRA", "SAICE", "SAICS", "SAILS", + "SAINE", "SAINS", "SAIRS", "SAIST", "SAITH", "SALAL", "SALAT", "SALEP", "SALES", + "SALET", "SALIC", "SALLE", "SALOL", "SALOP", "SALPA", "SALPS", "SALSE", "SALTO", + "SALTS", "SANES", "SANSA", "SANTO", "SANTS", "SAOLA", "SAPAN", "SAPOR", "SARAN", + "SAREE", "SARIN", "SARIS", "SAROS", "SASER", "SASIN", "SASSE", "SATAI", "SATES", + "SATIS", "SCAIL", "SCALA", "SCALL", "SCANS", "SCAPA", "SCAPE", "SCAPI", "SCARP", + "SCARS", "SCART", "SCATH", "SCATS", "SCATT", "SCEAT", "SCENA", "SCOOT", "SCOPA", + "SCOPS", "SCOTS", "SCRAE", "SCRAN", "SCRAT", "SCRIP", "SEALS", "SEANS", "SEARE", + "SEARS", "SEASE", "SEATS", "SECCO", "SECHS", "SECTS", "SEELS", "SEEPS", "SEERS", + "SEHRI", "SEILS", "SEINE", "SEIRS", "SEISE", "SELAH", "SELES", "SELLA", "SELLE", + "SELLS", "SENAS", "SENES", "SENNA", "SENOR", "SENSA", "SENSI", "SENTE", "SENTI", + "SENTS", "SEPAL", "SEPIC", "SEPTA", "SEPTS", "SERAC", "SERAI", "SERAL", "SERER", + "SERES", "SERIC", "SERIN", "SERON", "SERRA", "SERRE", "SERRS", "SESSA", "SETAE", + "SETAL", "SETON", "SETTS", "SHAHS", "SHANS", "SHAPS", "SHARN", "SHASH", "SHCHI", + "SHEAL", "SHEAS", "SHEEL", "SHENT", "SHEOL", "SHERE", "SHERO", "SHETS", "SHIAI", + "SHIEL", "SHIER", "SHIES", "SHILL", "SHINS", "SHIPS", "SHIRR", "SHIRS", "SHISH", + "SHISO", "SHIST", "SHITE", "SHITS", "SHLEP", "SHOAT", "SHOER", "SHOES", "SHOLA", + "SHOOL", "SHOON", "SHOOS", "SHOPE", "SHOPS", "SHORL", "SHOTE", "SHOTS", "SHOTT", + "SHRIS", "SIALS", "SICES", "SICHT", "SIENS", "SIENT", "SIETH", "SILEN", "SILER", + "SILES", "SILLS", "SILOS", "SILTS", "SINES", "SINHS", "SIPES", "SIREE", "SIRES", + "SIRIH", "SIRIS", "SIROC", "SIRRA", "SISAL", "SISES", "SISTA", "SISTS", "SITAR", + "SITES", "SITHE", "SLAES", "SLANE", "SLAPS", "SLART", "SLATS", "SLEER", "SLIER", + "SLIPE", "SLIPS", "SLIPT", "SLISH", "SLITS", "SLOAN", "SLOES", "SLOOT", "SLOPS", + "SLOTS", "SNAPS", "SNARS", "SNASH", "SNATH", "SNEAP", "SNEES", "SNELL", "SNIES", + "SNIPS", "SNIRT", "SNITS", "SNOEP", "SNOOL", "SNOOT", "SNOTS", "SOAPS", "SOARE", + "SOARS", "SOCAS", "SOCES", "SOCLE", "SOILS", "SOLAH", "SOLAN", "SOLAS", "SOLEI", + "SOLER", "SOLES", "SOLON", "SOLOS", "SONCE", "SONES", "SONNE", "SONSE", "SOOLE", + "SOOLS", "SOOPS", "SOOTE", "SOOTS", "SOPHS", "SOPOR", "SOPRA", "SORAL", "SORAS", + "SOREE", "SOREL", "SORER", "SORES", "SORNS", "SORRA", "SORTA", "SORTS", "SOTHS", + "SOTOL", "SPAER", "SPAES", "SPAHI", "SPAIL", "SPAIN", "SPAIT", "SPALE", "SPALL", + "SPALT", "SPANE", "SPANS", "SPARS", "SPART", "SPATE", "SPATS", "SPEAL", "SPEAN", + "SPEAT", "SPECS", "SPECT", "SPEEL", "SPEER", "SPEIL", "SPEIR", "SPEOS", "SPETS", + "SPIAL", "SPICA", "SPICS", "SPIER", "SPIES", "SPILE", "SPINA", "SPINS", "SPIRT", + "SPITS", "SPOOR", "SPOOT", "SPOSH", "SPOTS", "SPRAT", "SPRIT", "STANE", "STAPH", + "STAPS", "STARN", "STARR", "STARS", "STATS", "STEAN", "STEAR", "STEEN", "STEIL", + "STELA", "STELE", "STELL", "STENO", "STENS", "STENT", "STEPS", "STEPT", "STERE", + "STETS", "STICH", "STIES", "STILE", "STIPA", "STIPE", "STIRE", "STIRP", "STIRS", + "STOAE", "STOAI", "STOAS", "STOAT", "STOEP", "STOIT", "STOLN", "STONN", "STOOR", + "STOPE", "STOPS", "STOPT", "STOSS", "STOTS", "STOTT", "STRAE", "STREP", "STRIA", + "STROP", "TAALS", "TAATA", "TACAN", "TACES", "TACET", "TACHE", "TACHO", "TACHS", + "TACOS", "TACTS", "TAELS", "TAHAS", "TAHRS", "TAILS", "TAINS", "TAIRA", "TAISH", + "TAITS", "TALAR", "TALAS", "TALCS", "TALEA", "TALER", "TALES", "TALLS", "TALPA", + "TANAS", "TANHS", "TANNA", "TANTI", "TANTO", "TAPAS", "TAPEN", "TAPES", "TAPET", + "TAPIS", "TAPPA", "TARAS", "TARES", "TARNS", "TAROC", "TAROS", "TARPS", "TARRE", + "TARSI", "TARTS", "TASAR", "TASER", "TASES", "TASSA", "TASSE", "TASSO", "TATAR", + "TATER", "TATES", "TATHS", "TATIE", "TATTS", "TEALS", "TEARS", "TEATS", "TECHS", + "TECTA", "TEELS", "TEENE", "TEENS", "TEERS", "TEHRS", "TEILS", "TEINS", "TELAE", + "TELCO", "TELES", "TELIA", "TELIC", "TELLS", "TELOI", "TELOS", "TENCH", "TENES", + "TENIA", "TENNE", "TENNO", "TENON", "TENTS", "TEPAL", "TEPAS", "TERAI", "TERAS", + "TERCE", "TERES", "TERNE", "TERNS", "TERTS", "TESLA", "TESTA", "TESTE", "TESTS", + "TETES", "TETHS", "TETRA", "TETRI", "THALE", "THALI", "THANA", "THANE", "THANS", + "THARS", "THECA", "THEES", "THEIC", "THEIN", "THENS", "THESP", "THETE", "THILL", + "THINE", "THINS", "THIOL", "THIRL", "THOLE", "THOLI", "THORO", "THORP", "THRAE", + "THRIP", "THROE", "TIANS", "TIARS", "TICAL", "TICCA", "TICES", "TIERS", "TILER", + "TILES", "TILLS", "TILTH", "TILTS", "TINAS", "TINCT", "TINEA", "TINES", "TINTS", + "TIPIS", "TIRES", "TIRLS", "TIROS", "TIRRS", "TITCH", "TITER", "TITIS", "TITRE", + "TOCOS", "TOEAS", "TOHOS", "TOILE", "TOILS", "TOISE", "TOITS", "TOLAN", "TOLAR", + "TOLAS", "TOLES", "TOLLS", "TOLTS", "TONER", "TONES", "TONNE", "TOOLS", "TOONS", + "TOOTS", "TOPEE", "TOPER", "TOPES", "TOPHE", "TOPHI", "TOPHS", "TOPIS", "TOPOI", + "TOPOS", "TORAH", "TORAN", "TORAS", "TORCS", "TORES", "TORIC", "TORII", "TOROS", + "TOROT", "TORRS", "TORSE", "TORSI", "TORTA", "TORTE", "TORTS", "TOSAS", "TOSES", + "TOTER", "TOTES", "TRANS", "TRANT", "TRAPE", "TRAPS", "TRAPT", "TRASS", "TRATS", + "TRATT", "TREEN", "TREES", "TRESS", "TREST", "TRETS", "TRIAC", "TRIER", "TRIES", + "TRILL", "TRINE", "TRINS", "TRIOL", "TRIOR", "TRIOS", "TRIPS", "TRIST", "TROAT", + "TROIS", "TRONA", "TRONC", "TRONE", "TRONS", "TROTH", "TROTS", "TSARS", +}; + +#if (USE_RANDOM_GUESS == 2) +static const uint16_t _num_random_guess_words = 257; // The _valid_words array begins with this many words where each letter is different. +#elif (USE_RANDOM_GUESS == 1) +static const uint16_t _num_random_guess_words = _num_words; +#endif + +#endif // WORDLE_FACE_DICT_H_ \ No newline at end of file From 0d16d126cd2017382a1f260fbf3b63f717f4b4d6 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 25 Aug 2024 07:15:08 -0400 Subject: [PATCH 35/53] Added ability to guess non-dict words and repeats as that can save 11.5KB of watch memory --- .../watch_faces/complication/wordle_face.c | 28 ++++++++++++------- .../watch_faces/complication/wordle_face.h | 3 ++ .../complication/wordle_face_dict.h | 2 ++ utils/wordle_face/wordle_list.py | 23 +++++++++++++-- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 9ce29bdf..f44e4a66 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -95,6 +95,17 @@ static void display_all_letters(wordle_state_t *state) { state->position = prev_pos; } +#if !ALLOW_NON_WORD_AND_REPEAT_GUESSES +static void display_not_in_dict(wordle_state_t *state) { + state->curr_screen = SCREEN_NO_DICT; + watch_display_string("nodict", 4); +} + +static void display_already_guessed(wordle_state_t *state) { + state->curr_screen = SCREEN_ALREADY_GUESSED; + watch_display_string("GUESSD", 4); +} + static uint32_t check_word_in_dict(uint8_t *word_elements) { bool is_exact_match; for (uint16_t i = 0; i < _num_words; i++) { @@ -120,6 +131,9 @@ static uint32_t check_word_in_dict(uint8_t *word_elements) { return _num_words + _num_possible_words; } + +#endif + static bool check_word(wordle_state_t *state) { // Exact bool is_exact_match = true; @@ -167,9 +181,11 @@ static void reset_all_elements(wordle_state_t *state) { state->word_elements[i] = _num_valid_letters; state->word_elements_result[i] = WORDLE_LETTER_WRONG; } +#if !ALLOW_NON_WORD_AND_REPEAT_GUESSES for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) { state->guessed_words[i] = _num_words + _num_possible_words; } +#endif state->using_random_guess = false; state->attempt = 0; } @@ -245,16 +261,6 @@ static uint32_t get_day_unix_time(void) { } #endif -static void display_not_in_dict(wordle_state_t *state) { - state->curr_screen = SCREEN_NO_DICT; - watch_display_string("nodict", 4); -} - -static void display_already_guessed(wordle_state_t *state) { - state->curr_screen = SCREEN_ALREADY_GUESSED; - watch_display_string("GUESSD", 4); -} - static void display_lose(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 6]; sprintf(buf," L %s", subsecond % 2 ? _valid_words[state->curr_answer] : " "); @@ -373,6 +379,7 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { } static void get_result(wordle_state_t *state) { +#if !ALLOW_NON_WORD_AND_REPEAT_GUESSES // Check if it's in the dict uint16_t in_dict = check_word_in_dict(state->word_elements); if (in_dict == _num_words + _num_possible_words) { @@ -389,6 +396,7 @@ static void get_result(wordle_state_t *state) { } state->guessed_words[state->attempt] = in_dict; +#endif bool exact_match = check_word(state); if (exact_match) { reset_all_elements(state); diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 6ae1fbd8..52fd71f6 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -63,6 +63,7 @@ #define WORDLE_LENGTH 5 #define WORDLE_MAX_ATTEMPTS 6 #define USE_DAILY_STREAK false +#define ALLOW_NON_WORD_AND_REPEAT_GUESSES false // This allows non-words to be entered and repeat guesses to be made. It saves ~11.5KB of ROM. /* USE_RANDOM_GUESS * 0 = Don't allow quickly choosing a random quess @@ -103,7 +104,9 @@ typedef struct { // Anything you need to keep track of, put it here! uint8_t word_elements[WORDLE_LENGTH]; WordleLetterResult word_elements_result[WORDLE_LENGTH]; +#if !ALLOW_NON_WORD_AND_REPEAT_GUESSES uint16_t guessed_words[WORDLE_MAX_ATTEMPTS]; +#endif uint8_t attempt : 4; uint8_t position : 3; bool using_random_guess : 1; diff --git a/movement/watch_faces/complication/wordle_face_dict.h b/movement/watch_faces/complication/wordle_face_dict.h index 1942b16e..00ae3ac3 100644 --- a/movement/watch_faces/complication/wordle_face_dict.h +++ b/movement/watch_faces/complication/wordle_face_dict.h @@ -67,6 +67,7 @@ static const char _valid_words[][WORDLE_LENGTH + 1] = { // These are words that'll never be used, but still need to be in the dictionary for guesses. // Number of words found: 1898 static const char _possible_words[][WORDLE_LENGTH + 1] = { +#if !ALLOW_NON_WORD_AND_REPEAT_GUESSES "AALII", "AARTI", "ACAIS", "ACARI", "ACCAS", "ACERS", "ACETA", "ACHAR", "ACHES", "ACHOO", "ACINI", "ACNES", "ACRES", "ACROS", "ACTIN", "ACTON", "AECIA", "AEONS", "AERIE", "AEROS", "AESIR", "AHEAP", "AHENT", "AHINT", "AINEE", "AIOLI", "AIRER", @@ -278,6 +279,7 @@ static const char _possible_words[][WORDLE_LENGTH + 1] = { "TRATT", "TREEN", "TREES", "TRESS", "TREST", "TRETS", "TRIAC", "TRIER", "TRIES", "TRILL", "TRINE", "TRINS", "TRIOL", "TRIOR", "TRIOS", "TRIPS", "TRIST", "TROAT", "TROIS", "TRONA", "TRONC", "TRONE", "TRONS", "TROTH", "TROTS", "TSARS", +#endif }; #if (USE_RANDOM_GUESS == 2) diff --git a/utils/wordle_face/wordle_list.py b/utils/wordle_face/wordle_list.py index d951bac9..68481e02 100644 --- a/utils/wordle_face/wordle_list.py +++ b/utils/wordle_face/wordle_list.py @@ -1156,6 +1156,17 @@ def print_valid_words(letters=alphabet): ''' Prints the array of valid words that the wordle_face.c can use ''' + print("#ifndef WORDLE_FACE_DICT_H_") + print("#define WORDLE_FACE_DICT_H_") + + print("\n#ifndef WORDLE_LENGTH") + print("#define WORDLE_LENGTH 5") + print("#endif") + + print("\n#ifndef USE_RANDOM_GUESS") + print("#define USE_RANDOM_GUESS 2") + print("#endif\n") + items_per_row = 9 valid_words = list_of_valid_words(letters, valid_list) valid_words = capitalize_all_and_remove_duplicates(valid_words) @@ -1186,6 +1197,7 @@ def print_valid_words(letters=alphabet): print("\n// These are words that'll never be used, but still need to be in the dictionary for guesses.") print(f"// Number of words found: {len(possible_words)}") print("static const char _possible_words[][WORDLE_LENGTH + 1] = {") + print("#if !ALLOW_NON_WORD_AND_REPEAT_GUESSES") i = 0 while i < len(possible_words): print(" ", end='') @@ -1193,10 +1205,15 @@ def print_valid_words(letters=alphabet): print(f'"{clean_chars(possible_words[i])}", ', end='') i+=1 print('') - print("};") - print('') + print("#endif") + print("};\n") - print(f"\nstatic const uint16_t _num_unique_words = {num_uniq}; // The _valid_words array begins with this many words where each letter is different.") + print("#if (USE_RANDOM_GUESS == 2)") + print(f"static const uint16_t _num_random_guess_words = {num_uniq}; // The _valid_words array begins with this many words where each letter is different.") + print("#elif (USE_RANDOM_GUESS == 1)") + print("static const uint16_t _num_random_guess_words = _num_words;") + print("#endif") + print("\n#endif // WORDLE_FACE_DICT_H_") def get_sec_val_and_units(seconds): From 8342fef84fb4873aa4d258cf1046245ddbae51a1 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 25 Aug 2024 09:51:08 -0400 Subject: [PATCH 36/53] Added ability to skip already guessed letters that are wrong --- .../watch_faces/complication/wordle_face.c | 38 ++++++++++++++----- .../watch_faces/complication/wordle_face.h | 1 + 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index f44e4a66..77cd23d3 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -62,14 +62,18 @@ static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_ return curr_pos; } -static void get_next_letter(uint8_t curr_pos, uint8_t *word_elements) { - if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = 0; - else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % _num_valid_letters; +static void get_next_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters) { + do { + if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = 0; + else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % _num_valid_letters; + } while (known_wrong_letters[word_elements[curr_pos]]); } -static void get_prev_letter(uint8_t curr_pos, uint8_t *word_elements) { - if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = _num_valid_letters - 1; - else word_elements[curr_pos] = (word_elements[curr_pos] + _num_valid_letters - 1) % _num_valid_letters; +static void get_prev_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters) { + do { + if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = _num_valid_letters - 1; + else word_elements[curr_pos] = (word_elements[curr_pos] + _num_valid_letters - 1) % _num_valid_letters; + } while (known_wrong_letters[word_elements[curr_pos]]); } static void display_letter(wordle_state_t *state, bool display_dash) { @@ -130,8 +134,6 @@ static uint32_t check_word_in_dict(uint8_t *word_elements) { } return _num_words + _num_possible_words; } - - #endif static bool check_word(wordle_state_t *state) { @@ -164,6 +166,18 @@ static bool check_word(wordle_state_t *state) { return false; } +static void update_known_wrong_letters(wordle_state_t *state) { + + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements_result[i] == WORDLE_LETTER_WRONG) { + for (size_t j = 0; j < _num_valid_letters; j++) { + if (state->word_elements[i] == j) + state->known_wrong_letters[j] = true; + } + } + } +} + static void display_attempt(uint8_t attempt) { char buf[3]; sprintf(buf, "%d", attempt+1); @@ -181,6 +195,9 @@ static void reset_all_elements(wordle_state_t *state) { state->word_elements[i] = _num_valid_letters; state->word_elements_result[i] = WORDLE_LETTER_WRONG; } + for (size_t i = 0; i < _num_valid_letters; i++){ + state->known_wrong_letters[i] = false; + } #if !ALLOW_NON_WORD_AND_REPEAT_GUESSES for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) { state->guessed_words[i] = _num_words + _num_possible_words; @@ -414,6 +431,7 @@ static void get_result(wordle_state_t *state) { state->streak = 0; return; } + update_known_wrong_letters(state); state->curr_screen = SCREEN_RESULT; return; } @@ -496,12 +514,12 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi break; case EVENT_LIGHT_BUTTON_UP: if (act_on_btn(state, BTN_LIGHT)) break; - get_next_letter(state->position, state->word_elements); + get_next_letter(state->position, state->word_elements, state->known_wrong_letters); display_letter(state, true); break; case EVENT_LIGHT_LONG_PRESS: if (state->curr_screen != SCREEN_PLAYING) break; - get_prev_letter(state->position, state->word_elements); + get_prev_letter(state->position, state->word_elements, state->known_wrong_letters); display_letter(state, true); break; case EVENT_ALARM_BUTTON_UP: diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 52fd71f6..a7b34dc0 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -114,6 +114,7 @@ typedef struct { bool continuing : 1; uint8_t streak; WordleScreen curr_screen; + bool known_wrong_letters[_num_valid_letters]; #if USE_DAILY_STREAK uint32_t prev_day; uint32_t curr_day; From b58d6c0a2e7c77f360df748c407b9b5be53baab8 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 25 Aug 2024 09:59:04 -0400 Subject: [PATCH 37/53] Changed size of word lists from const int to #define to avoid folding constant array error --- .../watch_faces/complication/wordle_face.c | 66 +++++++++---------- .../watch_faces/complication/wordle_face.h | 26 ++++---- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 77cd23d3..6957d5bf 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -25,7 +25,7 @@ #include #include #include "wordle_face.h" -#if USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK #include "watch_utility.h" #endif @@ -64,21 +64,21 @@ static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_ static void get_next_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters) { do { - if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = 0; - else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % _num_valid_letters; + if (word_elements[curr_pos] >= WORDLE_NUM_VALID_LETTERS) word_elements[curr_pos] = 0; + else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % WORDLE_NUM_VALID_LETTERS; } while (known_wrong_letters[word_elements[curr_pos]]); } static void get_prev_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters) { do { - if (word_elements[curr_pos] >= _num_valid_letters) word_elements[curr_pos] = _num_valid_letters - 1; - else word_elements[curr_pos] = (word_elements[curr_pos] + _num_valid_letters - 1) % _num_valid_letters; + if (word_elements[curr_pos] >= WORDLE_NUM_VALID_LETTERS) word_elements[curr_pos] = WORDLE_NUM_VALID_LETTERS - 1; + else word_elements[curr_pos] = (word_elements[curr_pos] + WORDLE_NUM_VALID_LETTERS - 1) % WORDLE_NUM_VALID_LETTERS; } while (known_wrong_letters[word_elements[curr_pos]]); } static void display_letter(wordle_state_t *state, bool display_dash) { char buf[1 + 1]; - if (state->word_elements[state->position] >= _num_valid_letters) { + if (state->word_elements[state->position] >= WORDLE_NUM_VALID_LETTERS) { if (display_dash) watch_display_string("-", state->position + 5); else @@ -99,7 +99,7 @@ static void display_all_letters(wordle_state_t *state) { state->position = prev_pos; } -#if !ALLOW_NON_WORD_AND_REPEAT_GUESSES +#if !WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES static void display_not_in_dict(wordle_state_t *state) { state->curr_screen = SCREEN_NO_DICT; watch_display_string("nodict", 4); @@ -112,7 +112,7 @@ static void display_already_guessed(wordle_state_t *state) { static uint32_t check_word_in_dict(uint8_t *word_elements) { bool is_exact_match; - for (uint16_t i = 0; i < _num_words; i++) { + for (uint16_t i = 0; i < WORDLE_NUM_WORDS; i++) { is_exact_match = true; for (size_t j = 0; j < WORDLE_LENGTH; j++) { if (_valid_letters[word_elements[j]] != _valid_words[i][j]) { @@ -122,7 +122,7 @@ static uint32_t check_word_in_dict(uint8_t *word_elements) { } if (is_exact_match) return i; } - for (uint16_t i = 0; i < _num_possible_words; i++) { + for (uint16_t i = 0; i < WORDLE_NUM_POSSIBLE_WORDS; i++) { is_exact_match = true; for (size_t j = 0; j < WORDLE_LENGTH; j++) { if (_valid_letters[word_elements[j]] != _possible_words[i][j]) { @@ -130,9 +130,9 @@ static uint32_t check_word_in_dict(uint8_t *word_elements) { break; } } - if (is_exact_match) return _num_words + i; + if (is_exact_match) return WORDLE_NUM_WORDS + i; } - return _num_words + _num_possible_words; + return WORDLE_NUM_WORDS + WORDLE_NUM_POSSIBLE_WORDS; } #endif @@ -170,7 +170,7 @@ static void update_known_wrong_letters(wordle_state_t *state) { for (size_t i = 0; i < WORDLE_LENGTH; i++) { if (state->word_elements_result[i] == WORDLE_LETTER_WRONG) { - for (size_t j = 0; j < _num_valid_letters; j++) { + for (size_t j = 0; j < WORDLE_NUM_VALID_LETTERS; j++) { if (state->word_elements[i] == j) state->known_wrong_letters[j] = true; } @@ -192,15 +192,15 @@ static void display_playing(wordle_state_t *state) { static void reset_all_elements(wordle_state_t *state) { for (size_t i = 0; i < WORDLE_LENGTH; i++) { - state->word_elements[i] = _num_valid_letters; + state->word_elements[i] = WORDLE_NUM_VALID_LETTERS; state->word_elements_result[i] = WORDLE_LETTER_WRONG; } - for (size_t i = 0; i < _num_valid_letters; i++){ + for (size_t i = 0; i < WORDLE_NUM_VALID_LETTERS; i++){ state->known_wrong_letters[i] = false; } -#if !ALLOW_NON_WORD_AND_REPEAT_GUESSES +#if !WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES for (size_t i = 0; i < WORDLE_MAX_ATTEMPTS; i++) { - state->guessed_words[i] = _num_words + _num_possible_words; + state->guessed_words[i] = WORDLE_NUM_WORDS + WORDLE_NUM_POSSIBLE_WORDS; } #endif state->using_random_guess = false; @@ -210,13 +210,13 @@ static void reset_all_elements(wordle_state_t *state) { static void reset_incorrect_elements(wordle_state_t *state) { for (size_t i = 0; i < WORDLE_LENGTH; i++) { if (state->word_elements_result[i] != WORDLE_LETTER_CORRECT) - state->word_elements[i] = _num_valid_letters; + state->word_elements[i] = WORDLE_NUM_VALID_LETTERS; } } static void reset_board(wordle_state_t *state) { reset_all_elements(state); - state->curr_answer = get_random(_num_words); + state->curr_answer = get_random(WORDLE_NUM_WORDS); watch_clear_colon(); state->position = get_first_pos(state->word_elements_result); display_playing(state); @@ -231,7 +231,7 @@ static void display_title(wordle_state_t *state) { watch_display_string("WO WordLE", 0); } -#if !USE_DAILY_STREAK +#if !WORDLE_USE_DAILY_STREAK static void display_continue_result(bool continuing) { watch_display_string(continuing ? "y" : "n", 9); } @@ -246,7 +246,7 @@ static void display_continue(wordle_state_t *state) { static void display_streak(wordle_state_t *state) { char buf[12]; state->curr_screen = SCREEN_STREAK; -#if USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK if (state->streak > 99) sprintf(buf, "WO St--dy"); else @@ -258,7 +258,7 @@ static void display_streak(wordle_state_t *state) { watch_set_colon(); } -#if USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK static void display_wait(wordle_state_t *state) { state->curr_screen = SCREEN_WAIT; if (state->streak < 40) { @@ -294,7 +294,7 @@ static void display_win(wordle_state_t *state, uint8_t subsecond) { static bool is_playing(const wordle_state_t *state) { if (state->attempt > 0) return true; for (size_t i = 0; i < WORDLE_LENGTH; i++) { - if (state->word_elements[i] != _num_valid_letters) + if (state->word_elements[i] != WORDLE_NUM_VALID_LETTERS) return true; } return false; @@ -333,7 +333,7 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { display_playing(state); return true; case SCREEN_TITLE: -#if USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK if (state->prev_day == get_day_unix_time()) { display_wait(state); } @@ -351,7 +351,7 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { #endif return true; case SCREEN_STREAK: -#if USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK state->curr_day = get_day_unix_time(); #endif reset_board(state); @@ -365,7 +365,7 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { state->position = get_first_pos(state->word_elements_result); display_playing(state); return true; -#if USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK case SCREEN_WAIT: (void) pin; display_title(state); @@ -396,10 +396,10 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { } static void get_result(wordle_state_t *state) { -#if !ALLOW_NON_WORD_AND_REPEAT_GUESSES +#if !WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES // Check if it's in the dict uint16_t in_dict = check_word_in_dict(state->word_elements); - if (in_dict == _num_words + _num_possible_words) { + if (in_dict == WORDLE_NUM_WORDS + WORDLE_NUM_POSSIBLE_WORDS) { display_not_in_dict(state); return; } @@ -420,7 +420,7 @@ static void get_result(wordle_state_t *state) { state->curr_screen = SCREEN_WIN; if (state->streak < 0x7F) state->streak++; -#if USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK state->prev_day = get_day_unix_time(); #endif return; @@ -436,14 +436,14 @@ static void get_result(wordle_state_t *state) { return; } -#if (USE_RANDOM_GUESS != 0) +#if (WORDLE_USE_RANDOM_GUESS != 0) static void insert_random_guess(wordle_state_t *state) { uint16_t random_guess; do { // Don't allow the guess to be the same as the answer random_guess = get_random(_num_random_guess_words); } while (random_guess == state->curr_answer); for (size_t i = 0; i < WORDLE_LENGTH; i++) { - for (size_t j = 0; j < _num_valid_letters; j++) + for (size_t j = 0; j < WORDLE_NUM_VALID_LETTERS; j++) { if (_valid_words[random_guess][i] == _valid_letters[j]) state->word_elements[i] = j; @@ -471,7 +471,7 @@ void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void wordle_face_activate(movement_settings_t *settings, void *context) { (void) settings; wordle_state_t *state = (wordle_state_t *)context; -#if USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK uint32_t now = get_day_unix_time() ; if (state->prev_day <= (now + (60 *60 * 24))) state->streak = 0; if (state->curr_day != now) reset_all_elements(state); @@ -525,8 +525,8 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi case EVENT_ALARM_BUTTON_UP: if (act_on_btn(state, BTN_ALARM)) break; display_letter(state, true); - if (state->word_elements[state->position] == _num_valid_letters) break; -#if (USE_RANDOM_GUESS != 0) + if (state->word_elements[state->position] == WORDLE_NUM_VALID_LETTERS) break; +#if (WORDLE_USE_RANDOM_GUESS != 0) if (watch_get_pin_level(BTN_LIGHT) && (state->using_random_guess || (state->attempt == 0 && state->position == 0))) { insert_random_guess(state); diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index a7b34dc0..a29301e7 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -37,7 +37,7 @@ * and the letters found in the word, but in the incorrect spot will blink. * The screen after the title screen if a new game is started shows the streak of games won in a row. * - * If USE_DAILY_STREAK is set to True, then the game can only be played once per day, + * If WORDLE_USE_DAILY_STREAK is set to True, then the game can only be played once per day, * and the streak resets to 0 if a day goes by without playing the game. * * Controls: @@ -49,7 +49,7 @@ * Else: None * * Alarm Press - * If Playing: If USE_RANDOM_GUESS is set and Light btn held and + * If Playing: If WORDLE_USE_RANDOM_GUESS is set and Light btn held and * (on first letter or already used a random guess) * and first attempt: Use a random 5 letter word with all letters that are different. * Else: Next position @@ -62,20 +62,20 @@ #define WORDLE_LENGTH 5 #define WORDLE_MAX_ATTEMPTS 6 -#define USE_DAILY_STREAK false -#define ALLOW_NON_WORD_AND_REPEAT_GUESSES false // This allows non-words to be entered and repeat guesses to be made. It saves ~11.5KB of ROM. +#define WORDLE_USE_DAILY_STREAK false +#define WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES false // This allows non-words to be entered and repeat guesses to be made. It saves ~11.5KB of ROM. -/* USE_RANDOM_GUESS +/* WORDLE_USE_RANDOM_GUESS * 0 = Don't allow quickly choosing a random quess * 1 = Allow using a random guess of any value that can be an answer * 2 = Allow using a random guess of any value that can be an answer where all of its letters are unique */ -#define USE_RANDOM_GUESS 2 +#define WORDLE_USE_RANDOM_GUESS 2 #include "wordle_face_dict.h" -static const uint16_t _num_words = (sizeof(_valid_words) / sizeof(_valid_words[0])); -static const uint16_t _num_possible_words = (sizeof(_possible_words) / sizeof(_possible_words[0])); -static const uint8_t _num_valid_letters = (sizeof(_valid_letters) / sizeof(_valid_letters[0])); +#define WORDLE_NUM_WORDS (sizeof(_valid_words) / sizeof(_valid_words[0])) +#define WORDLE_NUM_POSSIBLE_WORDS (sizeof(_possible_words) / sizeof(_possible_words[0])) +#define WORDLE_NUM_VALID_LETTERS (sizeof(_valid_letters) / sizeof(_valid_letters[0])) typedef enum { WORDLE_LETTER_WRONG = 0, @@ -89,7 +89,7 @@ typedef enum { SCREEN_TITLE, SCREEN_STREAK, SCREEN_CONTINUE, -#if USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK SCREEN_WAIT, #endif SCREEN_RESULT, @@ -104,7 +104,7 @@ typedef struct { // Anything you need to keep track of, put it here! uint8_t word_elements[WORDLE_LENGTH]; WordleLetterResult word_elements_result[WORDLE_LENGTH]; -#if !ALLOW_NON_WORD_AND_REPEAT_GUESSES +#if !WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES uint16_t guessed_words[WORDLE_MAX_ATTEMPTS]; #endif uint8_t attempt : 4; @@ -114,8 +114,8 @@ typedef struct { bool continuing : 1; uint8_t streak; WordleScreen curr_screen; - bool known_wrong_letters[_num_valid_letters]; -#if USE_DAILY_STREAK + bool known_wrong_letters[WORDLE_NUM_VALID_LETTERS]; +#if WORDLE_USE_DAILY_STREAK uint32_t prev_day; uint32_t curr_day; #endif From 1b887aea2bc5b85be0184144a7eb89870ab06f92 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 25 Aug 2024 10:03:38 -0400 Subject: [PATCH 38/53] Made skipping a wrong letters a #define --- movement/watch_faces/complication/wordle_face.c | 3 ++- movement/watch_faces/complication/wordle_face.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 6957d5bf..945bb76f 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -167,7 +167,7 @@ static bool check_word(wordle_state_t *state) { } static void update_known_wrong_letters(wordle_state_t *state) { - +#if WORDLE_SKIP_WRONG_LETTERS for (size_t i = 0; i < WORDLE_LENGTH; i++) { if (state->word_elements_result[i] == WORDLE_LETTER_WRONG) { for (size_t j = 0; j < WORDLE_NUM_VALID_LETTERS; j++) { @@ -176,6 +176,7 @@ static void update_known_wrong_letters(wordle_state_t *state) { } } } +#endif } static void display_attempt(uint8_t attempt) { diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index a29301e7..7071c79b 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -64,7 +64,7 @@ #define WORDLE_MAX_ATTEMPTS 6 #define WORDLE_USE_DAILY_STREAK false #define WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES false // This allows non-words to be entered and repeat guesses to be made. It saves ~11.5KB of ROM. - +#define WORDLE_SKIP_WRONG_LETTERS true // If true, already guessed letters that are known to be wrong will be skipped when cycling /* WORDLE_USE_RANDOM_GUESS * 0 = Don't allow quickly choosing a random quess * 1 = Allow using a random guess of any value that can be an answer From fdff6f581a58af966b70acb260883547681a4dfe Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 25 Aug 2024 10:12:08 -0400 Subject: [PATCH 39/53] Name change in python script --- utils/wordle_face/wordle_list.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/utils/wordle_face/wordle_list.py b/utils/wordle_face/wordle_list.py index 68481e02..ea2154c1 100644 --- a/utils/wordle_face/wordle_list.py +++ b/utils/wordle_face/wordle_list.py @@ -1163,8 +1163,8 @@ def print_valid_words(letters=alphabet): print("#define WORDLE_LENGTH 5") print("#endif") - print("\n#ifndef USE_RANDOM_GUESS") - print("#define USE_RANDOM_GUESS 2") + print("\n#ifndef WORDLE_USE_RANDOM_GUESS") + print("#define WORDLE_USE_RANDOM_GUESS 2") print("#endif\n") items_per_row = 9 @@ -1197,7 +1197,7 @@ def print_valid_words(letters=alphabet): print("\n// These are words that'll never be used, but still need to be in the dictionary for guesses.") print(f"// Number of words found: {len(possible_words)}") print("static const char _possible_words[][WORDLE_LENGTH + 1] = {") - print("#if !ALLOW_NON_WORD_AND_REPEAT_GUESSES") + print("#if !WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES") i = 0 while i < len(possible_words): print(" ", end='') @@ -1208,9 +1208,9 @@ def print_valid_words(letters=alphabet): print("#endif") print("};\n") - print("#if (USE_RANDOM_GUESS == 2)") + print("#if (WORDLE_USE_RANDOM_GUESS == 2)") print(f"static const uint16_t _num_random_guess_words = {num_uniq}; // The _valid_words array begins with this many words where each letter is different.") - print("#elif (USE_RANDOM_GUESS == 1)") + print("#elif (WORDLE_USE_RANDOM_GUESS == 1)") print("static const uint16_t _num_random_guess_words = _num_words;") print("#endif") print("\n#endif // WORDLE_FACE_DICT_H_") From d98f749f3b583b42659ebd294024daf27f61a376 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 25 Aug 2024 10:35:58 -0400 Subject: [PATCH 40/53] Changed variable names for dictionary header --- movement/watch_faces/complication/wordle_face_dict.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face_dict.h b/movement/watch_faces/complication/wordle_face_dict.h index 00ae3ac3..11a89f75 100644 --- a/movement/watch_faces/complication/wordle_face_dict.h +++ b/movement/watch_faces/complication/wordle_face_dict.h @@ -5,8 +5,8 @@ #define WORDLE_LENGTH 5 #endif -#ifndef USE_RANDOM_GUESS -#define USE_RANDOM_GUESS 2 +#ifndef WORDLE_USE_RANDOM_GUESS +#define WORDLE_USE_RANDOM_GUESS 2 #endif static const char _valid_letters[] = {'A', 'C', 'E', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'S', 'T'}; @@ -67,7 +67,7 @@ static const char _valid_words[][WORDLE_LENGTH + 1] = { // These are words that'll never be used, but still need to be in the dictionary for guesses. // Number of words found: 1898 static const char _possible_words[][WORDLE_LENGTH + 1] = { -#if !ALLOW_NON_WORD_AND_REPEAT_GUESSES +#if !WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES "AALII", "AARTI", "ACAIS", "ACARI", "ACCAS", "ACERS", "ACETA", "ACHAR", "ACHES", "ACHOO", "ACINI", "ACNES", "ACRES", "ACROS", "ACTIN", "ACTON", "AECIA", "AEONS", "AERIE", "AEROS", "AESIR", "AHEAP", "AHENT", "AHINT", "AINEE", "AIOLI", "AIRER", @@ -282,9 +282,9 @@ static const char _possible_words[][WORDLE_LENGTH + 1] = { #endif }; -#if (USE_RANDOM_GUESS == 2) +#if (WORDLE_USE_RANDOM_GUESS == 2) static const uint16_t _num_random_guess_words = 257; // The _valid_words array begins with this many words where each letter is different. -#elif (USE_RANDOM_GUESS == 1) +#elif (WORDLE_USE_RANDOM_GUESS == 1) static const uint16_t _num_random_guess_words = _num_words; #endif From 733318c036147c989737dc489e1e0ad34a8d5f9b Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 25 Aug 2024 12:18:27 -0400 Subject: [PATCH 41/53] skip_wrong_letter is now a toggle --- .../watch_faces/complication/wordle_face.c | 36 ++++++++++++++----- .../watch_faces/complication/wordle_face.h | 8 ++--- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 945bb76f..608fbe56 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -62,18 +62,18 @@ static uint8_t get_prev_pos(uint8_t curr_pos, WordleLetterResult *word_elements_ return curr_pos; } -static void get_next_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters) { +static void get_next_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters, const bool skip_wrong_letter) { do { if (word_elements[curr_pos] >= WORDLE_NUM_VALID_LETTERS) word_elements[curr_pos] = 0; else word_elements[curr_pos] = (word_elements[curr_pos] + 1) % WORDLE_NUM_VALID_LETTERS; - } while (known_wrong_letters[word_elements[curr_pos]]); + } while (skip_wrong_letter && known_wrong_letters[word_elements[curr_pos]]); } -static void get_prev_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters) { +static void get_prev_letter(const uint8_t curr_pos, uint8_t *word_elements, const bool *known_wrong_letters, const bool skip_wrong_letter) { do { if (word_elements[curr_pos] >= WORDLE_NUM_VALID_LETTERS) word_elements[curr_pos] = WORDLE_NUM_VALID_LETTERS - 1; else word_elements[curr_pos] = (word_elements[curr_pos] + WORDLE_NUM_VALID_LETTERS - 1) % WORDLE_NUM_VALID_LETTERS; - } while (known_wrong_letters[word_elements[curr_pos]]); + } while (skip_wrong_letter && known_wrong_letters[word_elements[curr_pos]]); } static void display_letter(wordle_state_t *state, bool display_dash) { @@ -166,8 +166,14 @@ static bool check_word(wordle_state_t *state) { return false; } +static void show_skip_wrong_letter_indicator(bool skipping, WordleScreen curr_screen) { + if (skipping && curr_screen <= SCREEN_CONTINUE) + watch_set_indicator(WATCH_INDICATOR_LAP); + else + watch_clear_indicator(WATCH_INDICATOR_LAP); +} + static void update_known_wrong_letters(wordle_state_t *state) { -#if WORDLE_SKIP_WRONG_LETTERS for (size_t i = 0; i < WORDLE_LENGTH; i++) { if (state->word_elements_result[i] == WORDLE_LETTER_WRONG) { for (size_t j = 0; j < WORDLE_NUM_VALID_LETTERS; j++) { @@ -176,7 +182,6 @@ static void update_known_wrong_letters(wordle_state_t *state) { } } } -#endif } static void display_attempt(uint8_t attempt) { @@ -186,9 +191,10 @@ static void display_attempt(uint8_t attempt) { } static void display_playing(wordle_state_t *state) { + state->curr_screen = SCREEN_PLAYING; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); display_attempt(state->attempt); display_all_letters(state); - state->curr_screen = SCREEN_PLAYING; } static void reset_all_elements(wordle_state_t *state) { @@ -229,6 +235,7 @@ static void reset_board(wordle_state_t *state) { static void display_title(wordle_state_t *state) { state->curr_screen = SCREEN_TITLE; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string("WO WordLE", 0); } @@ -239,6 +246,7 @@ static void display_continue_result(bool continuing) { static void display_continue(wordle_state_t *state) { state->curr_screen = SCREEN_CONTINUE; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string("Cont ", 4); display_continue_result(state->continuing); } @@ -247,6 +255,7 @@ static void display_continue(wordle_state_t *state) { static void display_streak(wordle_state_t *state) { char buf[12]; state->curr_screen = SCREEN_STREAK; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); #if WORDLE_USE_DAILY_STREAK if (state->streak > 99) sprintf(buf, "WO St--dy"); @@ -262,6 +271,7 @@ static void display_streak(wordle_state_t *state) { #if WORDLE_USE_DAILY_STREAK static void display_wait(wordle_state_t *state) { state->curr_screen = SCREEN_WAIT; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); if (state->streak < 40) { char buf[13]; sprintf(buf,"WO%2d WaIt ", state->streak); @@ -281,6 +291,7 @@ static uint32_t get_day_unix_time(void) { static void display_lose(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 6]; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); sprintf(buf," L %s", subsecond % 2 ? _valid_words[state->curr_answer] : " "); watch_display_string(buf, 0); } @@ -288,6 +299,7 @@ static void display_lose(wordle_state_t *state, uint8_t subsecond) { static void display_win(wordle_state_t *state, uint8_t subsecond) { (void) state; char buf[13]; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOb "); watch_display_string(buf, 0); } @@ -322,6 +334,7 @@ static void display_result(wordle_state_t *state, uint8_t subsecond) { break; } } + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string(buf, 5); } @@ -464,6 +477,7 @@ void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, memset(*context_ptr, 0, sizeof(wordle_state_t)); wordle_state_t *state = (wordle_state_t *)*context_ptr; state->curr_screen = SCREEN_TITLE; + state->skip_wrong_letter = false; reset_all_elements(state); } // Do any pin or peripheral setup here; this will be called whenever the watch wakes from deep sleep. @@ -515,12 +529,16 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi break; case EVENT_LIGHT_BUTTON_UP: if (act_on_btn(state, BTN_LIGHT)) break; - get_next_letter(state->position, state->word_elements, state->known_wrong_letters); + get_next_letter(state->position, state->word_elements, state->known_wrong_letters, state->skip_wrong_letter); display_letter(state, true); break; case EVENT_LIGHT_LONG_PRESS: + if (state->curr_screen <= SCREEN_CONTINUE) { + state->skip_wrong_letter = !state->skip_wrong_letter; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); + } if (state->curr_screen != SCREEN_PLAYING) break; - get_prev_letter(state->position, state->word_elements, state->known_wrong_letters); + get_prev_letter(state->position, state->word_elements, state->known_wrong_letters, state->skip_wrong_letter); display_letter(state, true); break; case EVENT_ALARM_BUTTON_UP: diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 7071c79b..d1c1a54c 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -64,7 +64,6 @@ #define WORDLE_MAX_ATTEMPTS 6 #define WORDLE_USE_DAILY_STREAK false #define WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES false // This allows non-words to be entered and repeat guesses to be made. It saves ~11.5KB of ROM. -#define WORDLE_SKIP_WRONG_LETTERS true // If true, already guessed letters that are known to be wrong will be skipped when cycling /* WORDLE_USE_RANDOM_GUESS * 0 = Don't allow quickly choosing a random quess * 1 = Allow using a random guess of any value that can be an answer @@ -85,13 +84,13 @@ typedef enum { } WordleLetterResult; typedef enum { - SCREEN_PLAYING = 0, - SCREEN_TITLE, + SCREEN_TITLE = 0, SCREEN_STREAK, SCREEN_CONTINUE, #if WORDLE_USE_DAILY_STREAK SCREEN_WAIT, #endif + SCREEN_PLAYING, SCREEN_RESULT, SCREEN_WIN, SCREEN_LOSE, @@ -110,8 +109,9 @@ typedef struct { uint8_t attempt : 4; uint8_t position : 3; bool using_random_guess : 1; - uint16_t curr_answer : 15; + uint16_t curr_answer : 14; bool continuing : 1; + bool skip_wrong_letter : 1; uint8_t streak; WordleScreen curr_screen; bool known_wrong_letters[WORDLE_NUM_VALID_LETTERS]; From c87e814140fd27bf2743d6f1116bdd5b311f8758 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 25 Aug 2024 12:23:35 -0400 Subject: [PATCH 42/53] LAP indicator now dispalys on all screens --- movement/watch_faces/complication/wordle_face.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 608fbe56..ef002aee 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -166,8 +166,8 @@ static bool check_word(wordle_state_t *state) { return false; } -static void show_skip_wrong_letter_indicator(bool skipping, WordleScreen curr_screen) { - if (skipping && curr_screen <= SCREEN_CONTINUE) +static void show_skip_wrong_letter_indicator(bool skipping) { + if (skipping) watch_set_indicator(WATCH_INDICATOR_LAP); else watch_clear_indicator(WATCH_INDICATOR_LAP); @@ -192,7 +192,6 @@ static void display_attempt(uint8_t attempt) { static void display_playing(wordle_state_t *state) { state->curr_screen = SCREEN_PLAYING; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); display_attempt(state->attempt); display_all_letters(state); } @@ -235,7 +234,6 @@ static void reset_board(wordle_state_t *state) { static void display_title(wordle_state_t *state) { state->curr_screen = SCREEN_TITLE; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string("WO WordLE", 0); } @@ -246,7 +244,6 @@ static void display_continue_result(bool continuing) { static void display_continue(wordle_state_t *state) { state->curr_screen = SCREEN_CONTINUE; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string("Cont ", 4); display_continue_result(state->continuing); } @@ -255,7 +252,6 @@ static void display_continue(wordle_state_t *state) { static void display_streak(wordle_state_t *state) { char buf[12]; state->curr_screen = SCREEN_STREAK; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); #if WORDLE_USE_DAILY_STREAK if (state->streak > 99) sprintf(buf, "WO St--dy"); @@ -271,7 +267,6 @@ static void display_streak(wordle_state_t *state) { #if WORDLE_USE_DAILY_STREAK static void display_wait(wordle_state_t *state) { state->curr_screen = SCREEN_WAIT; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); if (state->streak < 40) { char buf[13]; sprintf(buf,"WO%2d WaIt ", state->streak); @@ -291,7 +286,6 @@ static uint32_t get_day_unix_time(void) { static void display_lose(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 6]; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); sprintf(buf," L %s", subsecond % 2 ? _valid_words[state->curr_answer] : " "); watch_display_string(buf, 0); } @@ -299,7 +293,6 @@ static void display_lose(wordle_state_t *state, uint8_t subsecond) { static void display_win(wordle_state_t *state, uint8_t subsecond) { (void) state; char buf[13]; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOb "); watch_display_string(buf, 0); } @@ -334,7 +327,6 @@ static void display_result(wordle_state_t *state, uint8_t subsecond) { break; } } - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string(buf, 5); } @@ -497,6 +489,7 @@ void wordle_face_activate(movement_settings_t *settings, void *context) { state->position = get_first_pos(state->word_elements_result); } movement_request_tick_frequency(2); + show_skip_wrong_letter_indicator(state->skip_wrong_letter); display_title(state); } @@ -535,7 +528,7 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi case EVENT_LIGHT_LONG_PRESS: if (state->curr_screen <= SCREEN_CONTINUE) { state->skip_wrong_letter = !state->skip_wrong_letter; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); + show_skip_wrong_letter_indicator(state->skip_wrong_letter); } if (state->curr_screen != SCREEN_PLAYING) break; get_prev_letter(state->position, state->word_elements, state->known_wrong_letters, state->skip_wrong_letter); From 4b8bd61408d3afb0d0b7e12fc81f1af40af8092b Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 25 Aug 2024 12:36:04 -0400 Subject: [PATCH 43/53] Added explanation on LAP icon --- movement/watch_faces/complication/wordle_face.c | 2 +- movement/watch_faces/complication/wordle_face.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index ef002aee..6de8cee7 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -526,7 +526,7 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi display_letter(state, true); break; case EVENT_LIGHT_LONG_PRESS: - if (state->curr_screen <= SCREEN_CONTINUE) { + if (state->curr_screen < SCREEN_PLAYING) { state->skip_wrong_letter = !state->skip_wrong_letter; show_skip_wrong_letter_indicator(state->skip_wrong_letter); } diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index d1c1a54c..a03f9eea 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -57,7 +57,7 @@ * Else: Next screen * Alarm Hold * If Playing: Previous position - * Else: None + * Else: Toggle skipping over letters that have been confirmed to not be in the word (indicated via the LAP icon) */ #define WORDLE_LENGTH 5 From 255ea97cc403aa70caa17619fee2927d201f6545 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Sun, 25 Aug 2024 12:38:08 -0400 Subject: [PATCH 44/53] Documentation fix --- movement/watch_faces/complication/wordle_face.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index a03f9eea..0d73a9b8 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -46,7 +46,7 @@ * Else: Next screen * Light Hold * If Playing: Previous letter - * Else: None + * Else: Toggle skipping over letters that have been confirmed to not be in the word (indicated via the LAP icon) * * Alarm Press * If Playing: If WORDLE_USE_RANDOM_GUESS is set and Light btn held and @@ -57,7 +57,7 @@ * Else: Next screen * Alarm Hold * If Playing: Previous position - * Else: Toggle skipping over letters that have been confirmed to not be in the word (indicated via the LAP icon) + * Else: None */ #define WORDLE_LENGTH 5 From 8205abe5be65b15b60bb36ac32c59156f3133cd7 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Mon, 26 Aug 2024 19:52:15 -0400 Subject: [PATCH 45/53] Revert "LAP indicator now dispalys on all screens" This reverts commit 3bfa336b4d609668f6d8c71164f8f579f41240a5. --- movement/watch_faces/complication/wordle_face.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 6de8cee7..ca62f30e 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -166,8 +166,8 @@ static bool check_word(wordle_state_t *state) { return false; } -static void show_skip_wrong_letter_indicator(bool skipping) { - if (skipping) +static void show_skip_wrong_letter_indicator(bool skipping, WordleScreen curr_screen) { + if (skipping && curr_screen <= SCREEN_CONTINUE) watch_set_indicator(WATCH_INDICATOR_LAP); else watch_clear_indicator(WATCH_INDICATOR_LAP); @@ -192,6 +192,7 @@ static void display_attempt(uint8_t attempt) { static void display_playing(wordle_state_t *state) { state->curr_screen = SCREEN_PLAYING; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); display_attempt(state->attempt); display_all_letters(state); } @@ -234,6 +235,7 @@ static void reset_board(wordle_state_t *state) { static void display_title(wordle_state_t *state) { state->curr_screen = SCREEN_TITLE; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string("WO WordLE", 0); } @@ -244,6 +246,7 @@ static void display_continue_result(bool continuing) { static void display_continue(wordle_state_t *state) { state->curr_screen = SCREEN_CONTINUE; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string("Cont ", 4); display_continue_result(state->continuing); } @@ -252,6 +255,7 @@ static void display_continue(wordle_state_t *state) { static void display_streak(wordle_state_t *state) { char buf[12]; state->curr_screen = SCREEN_STREAK; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); #if WORDLE_USE_DAILY_STREAK if (state->streak > 99) sprintf(buf, "WO St--dy"); @@ -267,6 +271,7 @@ static void display_streak(wordle_state_t *state) { #if WORDLE_USE_DAILY_STREAK static void display_wait(wordle_state_t *state) { state->curr_screen = SCREEN_WAIT; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); if (state->streak < 40) { char buf[13]; sprintf(buf,"WO%2d WaIt ", state->streak); @@ -286,6 +291,7 @@ static uint32_t get_day_unix_time(void) { static void display_lose(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 6]; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); sprintf(buf," L %s", subsecond % 2 ? _valid_words[state->curr_answer] : " "); watch_display_string(buf, 0); } @@ -293,6 +299,7 @@ static void display_lose(wordle_state_t *state, uint8_t subsecond) { static void display_win(wordle_state_t *state, uint8_t subsecond) { (void) state; char buf[13]; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOb "); watch_display_string(buf, 0); } @@ -327,6 +334,7 @@ static void display_result(wordle_state_t *state, uint8_t subsecond) { break; } } + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string(buf, 5); } @@ -489,7 +497,6 @@ void wordle_face_activate(movement_settings_t *settings, void *context) { state->position = get_first_pos(state->word_elements_result); } movement_request_tick_frequency(2); - show_skip_wrong_letter_indicator(state->skip_wrong_letter); display_title(state); } @@ -528,7 +535,7 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi case EVENT_LIGHT_LONG_PRESS: if (state->curr_screen < SCREEN_PLAYING) { state->skip_wrong_letter = !state->skip_wrong_letter; - show_skip_wrong_letter_indicator(state->skip_wrong_letter); + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); } if (state->curr_screen != SCREEN_PLAYING) break; get_prev_letter(state->position, state->word_elements, state->known_wrong_letters, state->skip_wrong_letter); From b364a6cfabc78dd9469286c6ff87cfd04a9ce571 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Mon, 26 Aug 2024 21:10:00 -0400 Subject: [PATCH 46/53] Changed the lap to hard mode; fixed the ignore used letters --- .../watch_faces/complication/wordle_face.c | 41 +++++++++++-------- .../watch_faces/complication/wordle_face.h | 10 +++-- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index ca62f30e..164c7844 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -167,17 +167,29 @@ static bool check_word(wordle_state_t *state) { } static void show_skip_wrong_letter_indicator(bool skipping, WordleScreen curr_screen) { - if (skipping && curr_screen <= SCREEN_CONTINUE) - watch_set_indicator(WATCH_INDICATOR_LAP); + if (curr_screen >= SCREEN_PLAYING) return; + if (skipping) + watch_display_string("H", 3); else - watch_clear_indicator(WATCH_INDICATOR_LAP); + watch_display_string(" ", 3); } static void update_known_wrong_letters(wordle_state_t *state) { + bool wrong_loc[WORDLE_NUM_VALID_LETTERS] = {false}; + // To ignore letters that appear, but are in the wrong location, as letters that are guessed + // more often than they appear in the word will display as WORDLE_LETTER_WRONG + for (size_t i = 0; i < WORDLE_LENGTH; i++) { + if (state->word_elements_result[i] == WORDLE_LETTER_WRONG_LOC) { + for (size_t j = 0; j < WORDLE_NUM_VALID_LETTERS; j++) { + if (state->word_elements[i] == j) + wrong_loc[j] = true; + } + } + } for (size_t i = 0; i < WORDLE_LENGTH; i++) { if (state->word_elements_result[i] == WORDLE_LETTER_WRONG) { for (size_t j = 0; j < WORDLE_NUM_VALID_LETTERS; j++) { - if (state->word_elements[i] == j) + if (state->word_elements[i] == j && !wrong_loc[j]) state->known_wrong_letters[j] = true; } } @@ -192,7 +204,6 @@ static void display_attempt(uint8_t attempt) { static void display_playing(wordle_state_t *state) { state->curr_screen = SCREEN_PLAYING; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); display_attempt(state->attempt); display_all_letters(state); } @@ -235,8 +246,8 @@ static void reset_board(wordle_state_t *state) { static void display_title(wordle_state_t *state) { state->curr_screen = SCREEN_TITLE; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string("WO WordLE", 0); + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); } #if !WORDLE_USE_DAILY_STREAK @@ -246,8 +257,8 @@ static void display_continue_result(bool continuing) { static void display_continue(wordle_state_t *state) { state->curr_screen = SCREEN_CONTINUE; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string("Cont ", 4); + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); display_continue_result(state->continuing); } #endif @@ -255,7 +266,6 @@ static void display_continue(wordle_state_t *state) { static void display_streak(wordle_state_t *state) { char buf[12]; state->curr_screen = SCREEN_STREAK; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); #if WORDLE_USE_DAILY_STREAK if (state->streak > 99) sprintf(buf, "WO St--dy"); @@ -266,12 +276,12 @@ static void display_streak(wordle_state_t *state) { #endif watch_display_string(buf, 0); watch_set_colon(); + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); } #if WORDLE_USE_DAILY_STREAK static void display_wait(wordle_state_t *state) { state->curr_screen = SCREEN_WAIT; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); if (state->streak < 40) { char buf[13]; sprintf(buf,"WO%2d WaIt ", state->streak); @@ -280,6 +290,7 @@ static void display_wait(wordle_state_t *state) { else { // Streak too long to display in top-right watch_display_string("WO WaIt ", 0); } + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); } static uint32_t get_day_unix_time(void) { @@ -291,7 +302,6 @@ static uint32_t get_day_unix_time(void) { static void display_lose(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 6]; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); sprintf(buf," L %s", subsecond % 2 ? _valid_words[state->curr_answer] : " "); watch_display_string(buf, 0); } @@ -299,7 +309,6 @@ static void display_lose(wordle_state_t *state, uint8_t subsecond) { static void display_win(wordle_state_t *state, uint8_t subsecond) { (void) state; char buf[13]; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); sprintf(buf," W %s ", subsecond % 2 ? "NICE" : "JOb "); watch_display_string(buf, 0); } @@ -334,7 +343,6 @@ static void display_result(wordle_state_t *state, uint8_t subsecond) { break; } } - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); watch_display_string(buf, 5); } @@ -533,10 +541,6 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi display_letter(state, true); break; case EVENT_LIGHT_LONG_PRESS: - if (state->curr_screen < SCREEN_PLAYING) { - state->skip_wrong_letter = !state->skip_wrong_letter; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); - } if (state->curr_screen != SCREEN_PLAYING) break; get_prev_letter(state->position, state->word_elements, state->known_wrong_letters, state->skip_wrong_letter); display_letter(state, true); @@ -559,6 +563,11 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi } break; case EVENT_ALARM_LONG_PRESS: + if (state->curr_screen < SCREEN_PLAYING) { + state->skip_wrong_letter = !state->skip_wrong_letter; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); + break; + } if (state->curr_screen != SCREEN_PLAYING) break; display_letter(state, true); state->position = get_prev_pos(state->position, state->word_elements_result); diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 0d73a9b8..2a3cc1dc 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -46,18 +46,22 @@ * Else: Next screen * Light Hold * If Playing: Previous letter - * Else: Toggle skipping over letters that have been confirmed to not be in the word (indicated via the LAP icon) + * Else: None * * Alarm Press * If Playing: If WORDLE_USE_RANDOM_GUESS is set and Light btn held and * (on first letter or already used a random guess) * and first attempt: Use a random 5 letter word with all letters that are different. * Else: Next position - * Next position * Else: Next screen * Alarm Hold * If Playing: Previous position - * Else: None + * Else: Toggle Hard-Mode. This is skipping over letters that have been confirmed + * to not be in the word (indicated via 'H' in the top-right) + * + * Note: Actual Hard Mode in Wordle game is "Any revealed hints must be used in subsequent guesses" + * But that came off as clunky UX on the Casio. So instead it only removes unused letters from the keyboard + * as that also simplifies the keyboard. */ #define WORDLE_LENGTH 5 From 41df6c113f86fc6a5477f56f274ed1419e216d3e Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Mon, 26 Aug 2024 22:24:33 -0400 Subject: [PATCH 47/53] Reset streak if don't continue --- movement/watch_faces/complication/wordle_face.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 164c7844..09b5dc2f 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -401,6 +401,7 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { display_playing(state); else { reset_board(state); + state->streak = 0; display_streak(state); } break; @@ -496,7 +497,7 @@ void wordle_face_activate(movement_settings_t *settings, void *context) { wordle_state_t *state = (wordle_state_t *)context; #if WORDLE_USE_DAILY_STREAK uint32_t now = get_day_unix_time() ; - if (state->prev_day <= (now + (60 *60 * 24))) state->streak = 0; + if (now >= (state->prev_day + (60 *60 * 24))) state->streak = 0; if (state->curr_day != now) reset_all_elements(state); #endif state->using_random_guess = false; From c43820e75d225d56093f132295dbfef45b77e1d9 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Tue, 27 Aug 2024 12:08:24 -0400 Subject: [PATCH 48/53] Wordle game resets after 24hrs of not playing when not using daily streak --- .../watch_faces/complication/wordle_face.c | 18 ++++++++++++------ .../watch_faces/complication/wordle_face.h | 5 +++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 09b5dc2f..1cf931b4 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -25,9 +25,7 @@ #include #include #include "wordle_face.h" -#if WORDLE_USE_DAILY_STREAK #include "watch_utility.h" -#endif static uint32_t get_random(uint32_t max) { #if __EMSCRIPTEN__ @@ -298,6 +296,11 @@ static uint32_t get_day_unix_time(void) { now.unit.hour = now.unit.minute = now.unit.second = 0; return watch_utility_date_time_to_unix_time(now, 0); } +#else +static uint32_t get_day_unix_time(void) { + watch_date_time now = watch_rtc_get_date_time(); + return watch_utility_date_time_to_unix_time(now, 0); +} #endif static void display_lose(wordle_state_t *state, uint8_t subsecond) { @@ -373,9 +376,7 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { #endif return true; case SCREEN_STREAK: -#if WORDLE_USE_DAILY_STREAK state->curr_day = get_day_unix_time(); -#endif reset_board(state); return true; case SCREEN_WIN: @@ -495,10 +496,15 @@ void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void wordle_face_activate(movement_settings_t *settings, void *context) { (void) settings; wordle_state_t *state = (wordle_state_t *)context; + uint32_t now = get_day_unix_time(); #if WORDLE_USE_DAILY_STREAK - uint32_t now = get_day_unix_time() ; - if (now >= (state->prev_day + (60 *60 * 24))) state->streak = 0; if (state->curr_day != now) reset_all_elements(state); + if (now >= (state->prev_day + (60 *60 * 24))) state->streak = 0; +#else + if (is_playing(state) && now >= (state->curr_day + (60 *60 * 24))) { + state->streak = 0; + reset_board(state); + } #endif state->using_random_guess = false; if (is_playing(state) && state->curr_screen >= SCREEN_RESULT) { diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 2a3cc1dc..ffb3782d 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -66,7 +66,8 @@ #define WORDLE_LENGTH 5 #define WORDLE_MAX_ATTEMPTS 6 -#define WORDLE_USE_DAILY_STREAK false +#define WORDLE_USE_DAILY_STREAK false // If true, the board will reset daily and the streak will go to zero if the game isn't played for a day + // If false, then the streak will still reset if the game is not completed within 24 hours #define WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES false // This allows non-words to be entered and repeat guesses to be made. It saves ~11.5KB of ROM. /* WORDLE_USE_RANDOM_GUESS * 0 = Don't allow quickly choosing a random quess @@ -119,9 +120,9 @@ typedef struct { uint8_t streak; WordleScreen curr_screen; bool known_wrong_letters[WORDLE_NUM_VALID_LETTERS]; + uint32_t curr_day; #if WORDLE_USE_DAILY_STREAK uint32_t prev_day; - uint32_t curr_day; #endif } wordle_state_t; From d1c19166a11d90cf9a08d8772ca6aebe28d4e958 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Tue, 27 Aug 2024 12:31:22 -0400 Subject: [PATCH 49/53] WORDLE_USE_DAILY_STREAK logic changed --- .../watch_faces/complication/wordle_face.c | 37 ++++++++----------- .../watch_faces/complication/wordle_face.h | 17 ++++++--- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index 1cf931b4..bcab8f07 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -248,7 +248,7 @@ static void display_title(wordle_state_t *state) { show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); } -#if !WORDLE_USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK != 2 static void display_continue_result(bool continuing) { watch_display_string(continuing ? "y" : "n", 9); } @@ -264,7 +264,7 @@ static void display_continue(wordle_state_t *state) { static void display_streak(wordle_state_t *state) { char buf[12]; state->curr_screen = SCREEN_STREAK; -#if WORDLE_USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK != 2 if (state->streak > 99) sprintf(buf, "WO St--dy"); else @@ -277,7 +277,7 @@ static void display_streak(wordle_state_t *state) { show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); } -#if WORDLE_USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK == 2 static void display_wait(wordle_state_t *state) { state->curr_screen = SCREEN_WAIT; if (state->streak < 40) { @@ -290,18 +290,15 @@ static void display_wait(wordle_state_t *state) { } show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); } +#endif static uint32_t get_day_unix_time(void) { watch_date_time now = watch_rtc_get_date_time(); +#if WORDLE_USE_DAILY_STREAK == 2 now.unit.hour = now.unit.minute = now.unit.second = 0; - return watch_utility_date_time_to_unix_time(now, 0); -} -#else -static uint32_t get_day_unix_time(void) { - watch_date_time now = watch_rtc_get_date_time(); - return watch_utility_date_time_to_unix_time(now, 0); -} #endif + return watch_utility_date_time_to_unix_time(now, 0); +} static void display_lose(wordle_state_t *state, uint8_t subsecond) { char buf[WORDLE_LENGTH + 6]; @@ -358,8 +355,8 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { display_playing(state); return true; case SCREEN_TITLE: -#if WORDLE_USE_DAILY_STREAK - if (state->prev_day == get_day_unix_time()) { +#if WORDLE_USE_DAILY_STREAK == 2 + if (state->day_last_game_started == get_day_unix_time()) { display_wait(state); } else if (is_playing(state)) @@ -376,7 +373,7 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { #endif return true; case SCREEN_STREAK: - state->curr_day = get_day_unix_time(); + state->day_last_game_started = get_day_unix_time(); reset_board(state); return true; case SCREEN_WIN: @@ -388,7 +385,7 @@ static bool act_on_btn(wordle_state_t *state, const uint8_t pin) { state->position = get_first_pos(state->word_elements_result); display_playing(state); return true; -#if WORDLE_USE_DAILY_STREAK +#if WORDLE_USE_DAILY_STREAK == 2 case SCREEN_WAIT: (void) pin; display_title(state); @@ -444,8 +441,8 @@ static void get_result(wordle_state_t *state) { state->curr_screen = SCREEN_WIN; if (state->streak < 0x7F) state->streak++; -#if WORDLE_USE_DAILY_STREAK - state->prev_day = get_day_unix_time(); +#if WORDLE_USE_DAILY_STREAK == 2 + state->day_last_game_started = get_day_unix_time(); // On the edge-case where we solve the puzzle at midnight #endif return; } @@ -496,12 +493,10 @@ void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void wordle_face_activate(movement_settings_t *settings, void *context) { (void) settings; wordle_state_t *state = (wordle_state_t *)context; +#if WORDLE_USE_DAILY_STREAK != 0 uint32_t now = get_day_unix_time(); -#if WORDLE_USE_DAILY_STREAK - if (state->curr_day != now) reset_all_elements(state); - if (now >= (state->prev_day + (60 *60 * 24))) state->streak = 0; -#else - if (is_playing(state) && now >= (state->curr_day + (60 *60 * 24))) { + if (now >= (state->day_last_game_started + (60 *60 * 24)) && + (is_playing(state) || WORDLE_USE_DAILY_STREAK == 2)) { state->streak = 0; reset_board(state); } diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index ffb3782d..b035f140 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -66,8 +66,16 @@ #define WORDLE_LENGTH 5 #define WORDLE_MAX_ATTEMPTS 6 -#define WORDLE_USE_DAILY_STREAK false // If true, the board will reset daily and the streak will go to zero if the game isn't played for a day - // If false, then the streak will still reset if the game is not completed within 24 hours +/* WORDLE_USE_DAILY_STREAK + * 0 = Don't ever reset the streak or the puzzle. + * 1 = Reset the streak and puzzle 24hrs after starting a puzzle and not finishing it. + * If the last puzzle was started at 8AM, it'll be considered failed at 8AM the next day. + * 2 = Reset the streak and puzzle if a puzzle goes unsolved or not started a day after the previous one. + * If the last puzzle was started at 8AM, it'll be considered failed at midnight the next day. + * This will not be the case if the puzzle is started at 8AM, continued at 11:59PM and solved at 12:01AM, the game will let that slide. + * Starting a new game instead of continuing is not allowed in this state. +*/ +#define WORDLE_USE_DAILY_STREAK 1 #define WORDLE_ALLOW_NON_WORD_AND_REPEAT_GUESSES false // This allows non-words to be entered and repeat guesses to be made. It saves ~11.5KB of ROM. /* WORDLE_USE_RANDOM_GUESS * 0 = Don't allow quickly choosing a random quess @@ -120,10 +128,7 @@ typedef struct { uint8_t streak; WordleScreen curr_screen; bool known_wrong_letters[WORDLE_NUM_VALID_LETTERS]; - uint32_t curr_day; -#if WORDLE_USE_DAILY_STREAK - uint32_t prev_day; -#endif + uint32_t day_last_game_started; } wordle_state_t; void wordle_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr); From 5435bc7f34350337fde476cbda2bba067ab29611 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Tue, 27 Aug 2024 13:08:13 -0400 Subject: [PATCH 50/53] Streak face fix --- movement/watch_faces/complication/wordle_face.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index bcab8f07..daaac209 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -264,7 +264,7 @@ static void display_continue(wordle_state_t *state) { static void display_streak(wordle_state_t *state) { char buf[12]; state->curr_screen = SCREEN_STREAK; -#if WORDLE_USE_DAILY_STREAK != 2 +#if WORDLE_USE_DAILY_STREAK == 2 if (state->streak > 99) sprintf(buf, "WO St--dy"); else From dd719183cf9af58e3edbf487575c7ee2b6649ac8 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Wed, 28 Aug 2024 21:38:09 -0400 Subject: [PATCH 51/53] hard mode btn changed; logic changed on daily streak so if puzzle wasn't started and completed the previous day, then drop the streak --- movement/watch_faces/complication/wordle_face.c | 15 ++++++++------- movement/watch_faces/complication/wordle_face.h | 6 +++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.c b/movement/watch_faces/complication/wordle_face.c index daaac209..8381cec4 100644 --- a/movement/watch_faces/complication/wordle_face.c +++ b/movement/watch_faces/complication/wordle_face.c @@ -495,8 +495,9 @@ void wordle_face_activate(movement_settings_t *settings, void *context) { wordle_state_t *state = (wordle_state_t *)context; #if WORDLE_USE_DAILY_STREAK != 0 uint32_t now = get_day_unix_time(); - if (now >= (state->day_last_game_started + (60 *60 * 24)) && - (is_playing(state) || WORDLE_USE_DAILY_STREAK == 2)) { + uint32_t one_day = 60 *60 * 24; + if ((WORDLE_USE_DAILY_STREAK == 2 && now >= (state->day_last_game_started + (2*one_day))) + || (now >= (state->day_last_game_started + one_day) && is_playing(state))) { state->streak = 0; reset_board(state); } @@ -543,6 +544,11 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi display_letter(state, true); break; case EVENT_LIGHT_LONG_PRESS: + if (state->curr_screen < SCREEN_PLAYING) { + state->skip_wrong_letter = !state->skip_wrong_letter; + show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); + break; + } if (state->curr_screen != SCREEN_PLAYING) break; get_prev_letter(state->position, state->word_elements, state->known_wrong_letters, state->skip_wrong_letter); display_letter(state, true); @@ -565,11 +571,6 @@ bool wordle_face_loop(movement_event_t event, movement_settings_t *settings, voi } break; case EVENT_ALARM_LONG_PRESS: - if (state->curr_screen < SCREEN_PLAYING) { - state->skip_wrong_letter = !state->skip_wrong_letter; - show_skip_wrong_letter_indicator(state->skip_wrong_letter, state->curr_screen); - break; - } if (state->curr_screen != SCREEN_PLAYING) break; display_letter(state, true); state->position = get_prev_pos(state->position, state->word_elements_result); diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index b035f140..1b9a7fb7 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -46,7 +46,8 @@ * Else: Next screen * Light Hold * If Playing: Previous letter - * Else: None + * Else: Toggle Hard-Mode. This is skipping over letters that have been confirmed + * to not be in the word (indicated via 'H' in the top-right) * * Alarm Press * If Playing: If WORDLE_USE_RANDOM_GUESS is set and Light btn held and @@ -56,8 +57,7 @@ * Else: Next screen * Alarm Hold * If Playing: Previous position - * Else: Toggle Hard-Mode. This is skipping over letters that have been confirmed - * to not be in the word (indicated via 'H' in the top-right) + * Else: None * * Note: Actual Hard Mode in Wordle game is "Any revealed hints must be used in subsequent guesses" * But that came off as clunky UX on the Casio. So instead it only removes unused letters from the keyboard From 4dedcb3a6d6914e7e9d5d20eb534b73df58c15b1 Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Tue, 3 Sep 2024 10:15:48 -0400 Subject: [PATCH 52/53] Added ability to find best starting word --- utils/wordle_face/wordle_list.py | 84 +++++++++++++++++++++++++------- 1 file changed, 67 insertions(+), 17 deletions(-) diff --git a/utils/wordle_face/wordle_list.py b/utils/wordle_face/wordle_list.py index ea2154c1..39e310c1 100644 --- a/utils/wordle_face/wordle_list.py +++ b/utils/wordle_face/wordle_list.py @@ -1,4 +1,4 @@ -import random, itertools, time, ast +import random, itertools, time, numpy source_link = "https://matthewminer.name/projects/calculators/wordle-words-left/" valid_list = [ @@ -1091,12 +1091,12 @@ possible_list = [ alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] -def most_used_letters(words=valid_list): +def most_used_letters(words=valid_list, letters=alphabet, print_result=True): ''' Outputs how many times each letter is used in the words array. ''' use_each_letter = {} - for i in alphabet: + for i in letters: count = 0 for word in words: for letter in word: @@ -1105,10 +1105,11 @@ def most_used_letters(words=valid_list): break use_each_letter[i] = count use_each_letter = dict(sorted(use_each_letter.items(), key=lambda item: item[1], reverse=True)) - print("Letter | Usage | Percent") - print("----------------------------") - for k in use_each_letter: - print(f"{k.upper()} | {use_each_letter[k]:5} | {round((100 * use_each_letter[k]) / len(words)):2}%") + if print_result: + print("Letter | Usage | Percent") + print("----------------------------") + for k in use_each_letter: + print(f"{k.upper()} | {use_each_letter[k]:5} | {round((100 * use_each_letter[k]) / len(words)):2}%") return use_each_letter @@ -1242,7 +1243,7 @@ def txt_of_all_letter_combos(num_letters_in_set, words=valid_list, min_letter_oc prev = time.time() start = prev letters_to_ignore = ['D','M'] # Don't diplay well on the watch - letter_usage = most_used_letters(words=words) + letter_usage = most_used_letters(words=words, print_result=False) for letter in letter_usage: if (100 * letter_usage[letter])/len(words) < min_letter_occ_percent_to_consider: letters_to_ignore.append(letter) @@ -1276,7 +1277,7 @@ def txt_of_all_letter_combos(num_letters_in_set, words=valid_list, min_letter_oc dict_combos_counts = dict(sorted(dict_combos_counts.items(), key=lambda item: item[1], reverse=True)) most_common_key = next(iter(dict_combos_counts)) - print(f"The Most Common Combo is: {most_common_key} with {dict_combos_counts[most_common_key]} words.") + print(f"The Most Common Combo for {num_letters_in_set} letters is: {most_common_key} with {dict_combos_counts[most_common_key]} words.") # print_valid_words(ast.literal_eval(most_common_key)) # Uncomment to display the text it creates if txt_out: @@ -1304,9 +1305,11 @@ def txt_of_all_letter_combos_differing_sizes(min=9, max=15, num_combos_print=20, print(f"{key}, {item}") -def location_of_letters(letters=alphabet, list=valid_list): - print(" 1 2 3 4 5 ") - print("-----------------------------------------") +def location_of_letters(letters=alphabet, list=valid_list, print_result=True): + letter_location_percentages = {} + if print_result: + print(" 1 2 3 4 5 ") + print("-----------------------------------------") letters = sorted(letters) for letter in letters: location = [0, 0, 0, 0, 0] @@ -1314,15 +1317,62 @@ def location_of_letters(letters=alphabet, list=valid_list): for i, char in enumerate(word): if char.upper() == letter.upper(): location[i]+=1 - location = [f"{round((100 * x) / sum(location)):2}%" for x in location] - print(f"{letter} : {location}") + location = [((100 * x) / sum(location)) for x in location] + letter_location_percentages[letter] = location + location_txt = [f"{round(x):2}%" for x in location] + if print_result: + print(f"{letter} : {location_txt}") + return letter_location_percentages + + +def best_first_word(letters=alphabet, list=valid_list, print_result=True, words_to_print=None): + ''' + Word_good has every word with only unique letters as keys and that values are: + 1. Take the usage of every letter, normalize the max to 100 and the min to 0. + 2. Go through each letter in the word and see how often that letter appears in that exact location. + 3. Multiply that occurrance in location with the normalized total usage. + 4. Do this for each letter and add it all together. + + Ex: SLATE + Normalized usage: S=38, L=42, A=79, T=46, E=100 + S in position 1: 55% + L in position 2: 27% + A in position 3: 31% + T in position 4: 19% + E in position 5: 34% + Total = (38*55) + (42*27) + (79*31) + (46*19) + (100*35) = 10047 + ''' + valid_words = list_of_valid_words(letters, list) + letter_usage = most_used_letters(words=list, letters=letters, print_result=False) + a=[[max(letter_usage.values()),1],[min(letter_usage.values()),1]] + b=[100,0] + m,b = numpy.linalg.solve(a,b).tolist() + letter_usage_normalized = {key: ((m * value) + b) for key, value in letter_usage.items()} + loc_letters = location_of_letters(letters=letters, list=list, print_result=False) + word_good = {} + valid_words_unique = [word for word in valid_words if len(word) == len(set(word))] + for word in valid_words_unique: + usage = 0 + for i, char in enumerate(word): + usage += loc_letters[char][i] * letter_usage_normalized[char] + word_good[word] = round(usage) + word_good = {k: v for k, v in sorted(word_good.items(), key=lambda item: item[1], reverse=True)} + if print_result: + print("Word, Usage Value") + print("------------------") + for i,[k,v] in enumerate(word_good.items()): + if words_to_print is not None and i+1 > words_to_print: + break + print(f"{k}, {v}") + return word_good if __name__ == "__main__": my_letters = ['A', 'C', 'E', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'S', 'T'] #print(f"{len(list_of_valid_words(my_letters, valid_list))} Words can be made with {my_letters}") - #most_used_letters() - #location_of_letters(my_letters) + #most_used_letters(letters=my_letters) + #location_of_letters(letters=my_letters) print_valid_words(my_letters) #txt_of_all_letter_combos_differing_sizes(max = 16, min=10) - #txt_of_all_letter_combos(14) \ No newline at end of file + #txt_of_all_letter_combos(14) + #best_first_word(letters=my_letters, print_result=True, words_to_print=10) \ No newline at end of file From faec45ce245fa45a24a6ef3c67b6e8b1d089583b Mon Sep 17 00:00:00 2001 From: David Volovskiy Date: Tue, 3 Sep 2024 17:09:52 -0400 Subject: [PATCH 53/53] Include ability to select only the best words as the first choice --- .../watch_faces/complication/wordle_face.h | 1 + .../complication/wordle_face_dict.h | 26 ++++++++++--------- utils/wordle_face/wordle_list.py | 11 ++++++-- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/movement/watch_faces/complication/wordle_face.h b/movement/watch_faces/complication/wordle_face.h index 1b9a7fb7..f390e736 100644 --- a/movement/watch_faces/complication/wordle_face.h +++ b/movement/watch_faces/complication/wordle_face.h @@ -81,6 +81,7 @@ * 0 = Don't allow quickly choosing a random quess * 1 = Allow using a random guess of any value that can be an answer * 2 = Allow using a random guess of any value that can be an answer where all of its letters are unique + * 3 = Allow using a random guess of any value that can be an answer, and it's considered one of the best initial choices. */ #define WORDLE_USE_RANDOM_GUESS 2 #include "wordle_face_dict.h" diff --git a/movement/watch_faces/complication/wordle_face_dict.h b/movement/watch_faces/complication/wordle_face_dict.h index 11a89f75..6b82976c 100644 --- a/movement/watch_faces/complication/wordle_face_dict.h +++ b/movement/watch_faces/complication/wordle_face_dict.h @@ -14,25 +14,25 @@ static const char _valid_letters[] = {'A', 'C', 'E', 'H', 'I', 'L', 'N', 'O', 'P // From: https://matthewminer.name/projects/calculators/wordle-words-left/ // Number of words found: 432 static const char _valid_words[][WORDLE_LENGTH + 1] = { - "STALE", "TRACE", "CLOSE", "ARISE", "SNIPE", "SHIRE", "LEASH", "SAINT", "CLEAN", - "RELIC", "CHORE", "CRONE", "REACH", "CHAOS", "TAPIR", "CAIRN", "TENOR", "STARE", - "HEART", "SCOPE", "SNARL", "SLEPT", "SINCE", "EPOCH", "SPACE", "SHARE", "SPOIL", + "SLATE", "STARE", "SNARE", "SANER", "CRANE", "STALE", "CRATE", "RAISE", "TRACE", + "SHARE", "ARISE", "SCARE", "SPARE", "CHAOS", "TAPIR", "CAIRN", "TENOR", "CLEAN", + "HEART", "SCOPE", "SNARL", "SLEPT", "SINCE", "EPOCH", "SPACE", "RELIC", "SPOIL", "LITER", "LEAPT", "LANCE", "RANCH", "HORSE", "LEACH", "LATER", "STEAL", "CHEAP", - "SHORT", "ETHIC", "CHANT", "ACTOR", "SPARE", "SEPIA", "ONSET", "SPLAT", "LEANT", + "SHORT", "ETHIC", "CHANT", "ACTOR", "REACH", "SEPIA", "ONSET", "SPLAT", "LEANT", "REACT", "OCTAL", "SPORE", "IRATE", "CORAL", "NICER", "SPILT", "SCENT", "PANIC", "SHIRT", "PECAN", "SLAIN", "SPLIT", "ROACH", "ASCOT", "PHONE", "LITHE", "STOIC", "STRIP", "RENAL", "POISE", "ENACT", "CHEAT", "PITCH", "NOISE", "INLET", "PEARL", - "POLAR", "PEACH", "STOLE", "CASTE", "CREST", "SCARE", "ETHOS", "THEIR", "STONE", - "SLATE", "LATCH", "HASTE", "SNARE", "SPINE", "SLANT", "SPEAR", "SCALE", "CAPER", + "POLAR", "PEACH", "STOLE", "CASTE", "CREST", "CRONE", "ETHOS", "THEIR", "STONE", + "SHIRE", "LATCH", "HASTE", "CLOSE", "SPINE", "SLANT", "SPEAR", "SCALE", "CAPER", "RETCH", "PESTO", "CHIRP", "SPORT", "OPTIC", "SNAIL", "PRICE", "PLANE", "TORCH", "PASTE", "RECAP", "SOLAR", "CRASH", "LINER", "OPINE", "ASHEN", "PALER", "ECLAT", - "SPELT", "TRIAL", "PERIL", "SLICE", "SCANT", "RAISE", "POSIT", "ATONE", "SPIRE", + "SPELT", "TRIAL", "PERIL", "SLICE", "SCANT", "SAINT", "POSIT", "ATONE", "SPIRE", "COAST", "INEPT", "SHOAL", "CLASH", "THORN", "PHASE", "SCORE", "TRICE", "PERCH", - "PORCH", "SHEAR", "CHOIR", "RHINO", "PLANT", "SHONE", "SANER", "LEARN", "ALTER", + "PORCH", "SHEAR", "CHOIR", "RHINO", "PLANT", "SHONE", "CHORE", "LEARN", "ALTER", "CHAIN", "PANEL", "PLIER", "STEIN", "COPSE", "SONIC", "ALIEN", "CHOSE", "ACORN", "ANTIC", "CHEST", "OTHER", "CHINA", "TALON", "SCORN", "PLAIN", "PILOT", "RIPEN", "PATCH", "SPICE", "CLONE", "SCION", "SCONE", "STRAP", "PARSE", "SHALE", "RISEN", - "CANOE", "INTER", "CRATE", "ISLET", "PRINT", "SHINE", "NORTH", "CLEAT", "PLAIT", + "CANOE", "INTER", "LEASH", "ISLET", "PRINT", "SHINE", "NORTH", "CLEAT", "PLAIT", "SCRAP", "CLEAR", "SLOTH", "LAPSE", "CHAIR", "SNORT", "SHARP", "OPERA", "STAIN", "TEACH", "TRAIL", "TRAIN", "LATHE", "PIANO", "PINCH", "PETAL", "STERN", "PRONE", "PROSE", "PLEAT", "TROPE", "PLACE", "POSER", "INERT", "CHASE", "CAROL", "STAIR", @@ -41,7 +41,7 @@ static const char _valid_words[][WORDLE_LENGTH + 1] = { "SONAR", "AISLE", "AROSE", "HATER", "NICHE", "POINT", "EARTH", "PINTO", "THOSE", "CLOTH", "NOTCH", "TOPIC", "RESIN", "SCALP", "HEIST", "HERON", "TRIPE", "TONAL", "TAPER", "SHORN", "TONIC", "HOIST", "SNORE", "STORE", "SLOPE", "OCEAN", "CHART", - "PAINT", "SPENT", "CRANE", "CRISP", "TRASH", "PATIO", "PLATE", "HOTEL", "LEAST", + "PAINT", "SPENT", "SNIPE", "CRISP", "TRASH", "PATIO", "PLATE", "HOTEL", "LEAST", "ALONE", "RALPH", "SPIEL", "SIREN", "RATIO", "STOOP", "TROLL", "ATOLL", "SLASH", "RETRO", "CREEP", "STILT", "SPREE", "TASTE", "CACHE", "CANON", "EATEN", "TEPEE", "SHEET", "SNEER", "ERROR", "NATAL", "SLEEP", "STINT", "TROOP", "SHALL", "STALL", @@ -282,8 +282,10 @@ static const char _possible_words[][WORDLE_LENGTH + 1] = { #endif }; -#if (WORDLE_USE_RANDOM_GUESS == 2) -static const uint16_t _num_random_guess_words = 257; // The _valid_words array begins with this many words where each letter is different. +#if (WORDLE_USE_RANDOM_GUESS == 3) +static const uint16_t _num_random_guess_words = 13; // The valid_words array begins with this many words that are considered the top 3% best options. +#elif (WORDLE_USE_RANDOM_GUESS == 2) +static const uint16_t _num_random_guess_words = 257; // The valid_words array begins with this many words where each letter is different. #elif (WORDLE_USE_RANDOM_GUESS == 1) static const uint16_t _num_random_guess_words = _num_words; #endif diff --git a/utils/wordle_face/wordle_list.py b/utils/wordle_face/wordle_list.py index 39e310c1..dac5ad65 100644 --- a/utils/wordle_face/wordle_list.py +++ b/utils/wordle_face/wordle_list.py @@ -1169,11 +1169,16 @@ def print_valid_words(letters=alphabet): print("#endif\n") items_per_row = 9 + top_words_percent = 3 valid_words = list_of_valid_words(letters, valid_list) valid_words = capitalize_all_and_remove_duplicates(valid_words) random.shuffle(valid_words) # Just in case the watch's random function is too pseudo, better to shuffle th elist so it's less likely to always have the same starting letter valid_words, num_uniq = rearrange_words_by_uniqueness(valid_words) + best_words = list(best_first_word(letters=letters, print_result=False).keys()) + num_best_words = round(len(valid_words) * top_words_percent / 100) + for i in range(num_best_words, 0, -1): + valid_words.insert(0, valid_words.pop(valid_words.index(best_words[i-1]))) print("static const char _valid_letters[] = {", end='') letters = sorted(letters) @@ -1209,8 +1214,10 @@ def print_valid_words(letters=alphabet): print("#endif") print("};\n") - print("#if (WORDLE_USE_RANDOM_GUESS == 2)") - print(f"static const uint16_t _num_random_guess_words = {num_uniq}; // The _valid_words array begins with this many words where each letter is different.") + print("#if (WORDLE_USE_RANDOM_GUESS == 3)") + print(f"static const uint16_t _num_random_guess_words = {num_best_words}; // The valid_words array begins with this many words that are considered the top {top_words_percent}% best options.") + print("#elif (WORDLE_USE_RANDOM_GUESS == 2)") + print(f"static const uint16_t _num_random_guess_words = {num_uniq}; // The valid_words array begins with this many words where each letter is different.") print("#elif (WORDLE_USE_RANDOM_GUESS == 1)") print("static const uint16_t _num_random_guess_words = _num_words;") print("#endif")