aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt6
-rw-r--r--src/crypto/electrum-words.cpp138
-rw-r--r--src/crypto/electrum-words.h3308
-rw-r--r--src/mnemonics/electrum-words.cpp375
-rw-r--r--src/mnemonics/electrum-words.h98
-rw-r--r--src/mnemonics/english.h1692
-rw-r--r--src/mnemonics/japanese.h1692
-rw-r--r--src/mnemonics/language_base.h131
-rw-r--r--src/mnemonics/old_english.h1692
-rw-r--r--src/mnemonics/portuguese.h1690
-rw-r--r--src/mnemonics/singleton.h62
-rw-r--r--src/mnemonics/spanish.h1692
-rw-r--r--src/simplewallet/simplewallet.cpp86
-rw-r--r--src/simplewallet/simplewallet.h28
-rw-r--r--src/wallet/wallet2.cpp11
-rw-r--r--src/wallet/wallet2.h6
16 files changed, 9243 insertions, 3464 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5f6d7551e..2393213cb 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -41,6 +41,7 @@ file(GLOB_RECURSE SIMPLEWALLET simplewallet/*)
file(GLOB_RECURSE CONN_TOOL connectivity_tool/*)
file(GLOB_RECURSE WALLET wallet/*)
file(GLOB_RECURSE MINER miner/*)
+file(GLOB MNEMONICS mnemonics/*)
source_group(common FILES ${COMMON})
source_group(crypto FILES ${CRYPTO})
@@ -53,10 +54,12 @@ source_group(simplewallet FILES ${SIMPLEWALLET})
source_group(connectivity-tool FILES ${CONN_TOOL})
source_group(wallet FILES ${WALLET})
source_group(simpleminer FILES ${MINER})
+source_group(mnemonics FILES ${MNEMONICS})
add_library(common ${COMMON})
add_library(crypto ${CRYPTO})
add_library(cryptonote_core ${CRYPTONOTE_CORE})
+add_library(mnemonics ${MNEMONICS})
add_executable(daemon ${DAEMON} ${P2P} ${CRYPTONOTE_PROTOCOL})
add_executable(connectivity_tool ${CONN_TOOL})
add_executable(simpleminer ${MINER})
@@ -65,8 +68,9 @@ target_link_libraries(connectivity_tool cryptonote_core crypto common ${UNBOUND_
target_link_libraries(simpleminer cryptonote_core crypto common ${UNBOUND_LIBRARIES} ${Boost_LIBRARIES})
add_library(rpc ${RPC})
add_library(wallet ${WALLET})
+target_link_libraries(wallet mnemonics)
add_executable(simplewallet ${SIMPLEWALLET} )
-target_link_libraries(simplewallet wallet rpc cryptonote_core crypto common ${UNBOUND_LIBRARIES} ${UPNP_LIBRARIES} ${Boost_LIBRARIES})
+target_link_libraries(simplewallet wallet rpc cryptonote_core crypto common mnemonics ${UNBOUND_LIBRARIES} ${UPNP_LIBRARIES} ${Boost_LIBRARIES})
add_dependencies(daemon version)
add_dependencies(rpc version)
add_dependencies(simplewallet version)
diff --git a/src/crypto/electrum-words.cpp b/src/crypto/electrum-words.cpp
deleted file mode 100644
index add71808a..000000000
--- a/src/crypto/electrum-words.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (c) 2014, The Monero Project
-//
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification, are
-// permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this list of
-// conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice, this list
-// of conditions and the following disclaimer in the documentation and/or other
-// materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its contributors may be
-// used to endorse or promote products derived from this software without specific
-// prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
-// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
-// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
-// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-/*
- * This file and its header file are for translating Electrum-style word lists
- * into their equivalent byte representations for cross-compatibility with
- * that method of "backing up" one's wallet keys.
- */
-
-#include <string>
-#include <cassert>
-#include <map>
-#include <cstdint>
-#include <vector>
-#include <boost/algorithm/string.hpp>
-#include "crypto/crypto.h" // for declaration of crypto::secret_key
-
-#include "crypto/electrum-words.h"
-
-namespace crypto
-{
- namespace ElectrumWords
- {
-
- /* convert words to bytes, 3 words -> 4 bytes
- * returns:
- * false if not a multiple of 3 words, or if a words is not in the
- * words list
- *
- * true otherwise
- */
- bool words_to_bytes(const std::string& words, crypto::secret_key& dst)
- {
- int n = NUMWORDS; // hardcoded because this is what electrum uses
-
- std::vector<std::string> wlist;
-
- boost::split(wlist, words, boost::is_any_of(" "));
-
- // error on non-compliant word list
- if (wlist.size() != 12 && wlist.size() != 24) return false;
-
- for (unsigned int i=0; i < wlist.size() / 3; i++)
- {
- uint32_t val;
- uint32_t w1, w2, w3;
-
- // verify all three words exist in the word list
- if (wordsMap.count(wlist[i*3]) == 0 ||
- wordsMap.count(wlist[i*3 + 1]) == 0 ||
- wordsMap.count(wlist[i*3 + 2]) == 0)
- {
- return false;
- }
-
- w1 = wordsMap.at(wlist[i*3]);
- w2 = wordsMap.at(wlist[i*3 + 1]);
- w3 = wordsMap.at(wlist[i*3 + 2]);
-
- val = w1 + n * (((n - w1) + w2) % n) + n * n * (((n - w2) + w3) % n);
-
- if (!(val % n == w1)) return false;
-
- memcpy(dst.data + i * 4, &val, 4); // copy 4 bytes to position
- }
-
- std::string wlist_copy = words;
- if (wlist.size() == 12)
- {
- memcpy(dst.data, dst.data + 16, 16); // if electrum 12-word seed, duplicate
- wlist_copy += ' ';
- wlist_copy += words;
- }
-
- return true;
- }
-
- /* convert bytes to words, 4 bytes-> 3 words
- * returns:
- * false if wrong number of bytes (shouldn't be possible)
- * true otherwise
- */
- bool bytes_to_words(const crypto::secret_key& src, std::string& words)
- {
- int n = NUMWORDS; // hardcoded because this is what electrum uses
-
- if (sizeof(src.data) % 4 != 0) return false;
-
- // 8 bytes -> 3 words. 8 digits base 16 -> 3 digits base 1626
- for (unsigned int i=0; i < sizeof(src.data)/4; i++, words += ' ')
- {
- uint32_t w1, w2, w3;
-
- uint32_t val;
-
- memcpy(&val, (src.data) + (i * 4), 4);
-
- w1 = val % n;
- w2 = ((val / n) + w1) % n;
- w3 = (((val / n) / n) + w2) % n;
-
- words += wordsArray[w1];
- words += ' ';
- words += wordsArray[w2];
- words += ' ';
- words += wordsArray[w3];
- }
- return false;
- }
-
- } // namespace ElectrumWords
-
-} // namespace crypto
diff --git a/src/crypto/electrum-words.h b/src/crypto/electrum-words.h
deleted file mode 100644
index d9e28ada1..000000000
--- a/src/crypto/electrum-words.h
+++ /dev/null
@@ -1,3308 +0,0 @@
-// Copyright (c) 2014, The Monero Project
-//
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification, are
-// permitted provided that the following conditions are met:
-//
-// 1. Redistributions of source code must retain the above copyright notice, this list of
-// conditions and the following disclaimer.
-//
-// 2. Redistributions in binary form must reproduce the above copyright notice, this list
-// of conditions and the following disclaimer in the documentation and/or other
-// materials provided with the distribution.
-//
-// 3. Neither the name of the copyright holder nor the names of its contributors may be
-// used to endorse or promote products derived from this software without specific
-// prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
-// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
-// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
-// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-/*
- * This file and its cpp file are for translating Electrum-style word lists
- * into their equivalent byte representations for cross-compatibility with
- * that method of "backing up" one's wallet keys.
- */
-
-#include <string>
-#include <cstdint>
-#include <map>
-#include "crypto/crypto.h" // for declaration of crypto::secret_key
-
-namespace crypto
-{
- namespace ElectrumWords
- {
-
- const int NUMWORDS = 1626;
-
- bool words_to_bytes(const std::string& words, crypto::secret_key& dst);
- bool bytes_to_words(const crypto::secret_key& src, std::string& words);
-
- const std::map<std::string,uint32_t> wordsMap = {
- {"like", 0},
- {"just", 1},
- {"love", 2},
- {"know", 3},
- {"never", 4},
- {"want", 5},
- {"time", 6},
- {"out", 7},
- {"there", 8},
- {"make", 9},
- {"look", 10},
- {"eye", 11},
- {"down", 12},
- {"only", 13},
- {"think", 14},
- {"heart", 15},
- {"back", 16},
- {"then", 17},
- {"into", 18},
- {"about", 19},
- {"more", 20},
- {"away", 21},
- {"still", 22},
- {"them", 23},
- {"take", 24},
- {"thing", 25},
- {"even", 26},
- {"through", 27},
- {"long", 28},
- {"always", 29},
- {"world", 30},
- {"too", 31},
- {"friend", 32},
- {"tell", 33},
- {"try", 34},
- {"hand", 35},
- {"thought", 36},
- {"over", 37},
- {"here", 38},
- {"other", 39},
- {"need", 40},
- {"smile", 41},
- {"again", 42},
- {"much", 43},
- {"cry", 44},
- {"been", 45},
- {"night", 46},
- {"ever", 47},
- {"little", 48},
- {"said", 49},
- {"end", 50},
- {"some", 51},
- {"those", 52},
- {"around", 53},
- {"mind", 54},
- {"people", 55},
- {"girl", 56},
- {"leave", 57},
- {"dream", 58},
- {"left", 59},
- {"turn", 60},
- {"myself", 61},
- {"give", 62},
- {"nothing", 63},
- {"really", 64},
- {"off", 65},
- {"before", 66},
- {"something", 67},
- {"find", 68},
- {"walk", 69},
- {"wish", 70},
- {"good", 71},
- {"once", 72},
- {"place", 73},
- {"ask", 74},
- {"stop", 75},
- {"keep", 76},
- {"watch", 77},
- {"seem", 78},
- {"everything", 79},
- {"wait", 80},
- {"got", 81},
- {"yet", 82},
- {"made", 83},
- {"remember", 84},
- {"start", 85},
- {"alone", 86},
- {"run", 87},
- {"hope", 88},
- {"maybe", 89},
- {"believe", 90},
- {"body", 91},
- {"hate", 92},
- {"after", 93},
- {"close", 94},
- {"talk", 95},
- {"stand", 96},
- {"own", 97},
- {"each", 98},
- {"hurt", 99},
- {"help", 100},
- {"home", 101},
- {"god", 102},
- {"soul", 103},
- {"new", 104},
- {"many", 105},
- {"two", 106},
- {"inside", 107},
- {"should", 108},
- {"true", 109},
- {"first", 110},
- {"fear", 111},
- {"mean", 112},
- {"better", 113},
- {"play", 114},
- {"another", 115},
- {"gone", 116},
- {"change", 117},
- {"use", 118},
- {"wonder", 119},
- {"someone", 120},
- {"hair", 121},
- {"cold", 122},
- {"open", 123},
- {"best", 124},
- {"any", 125},
- {"behind", 126},
- {"happen", 127},
- {"water", 128},
- {"dark", 129},
- {"laugh", 130},
- {"stay", 131},
- {"forever", 132},
- {"name", 133},
- {"work", 134},
- {"show", 135},
- {"sky", 136},
- {"break", 137},
- {"came", 138},
- {"deep", 139},
- {"door", 140},
- {"put", 141},
- {"black", 142},
- {"together", 143},
- {"upon", 144},
- {"happy", 145},
- {"such", 146},
- {"great", 147},
- {"white", 148},
- {"matter", 149},
- {"fill", 150},
- {"past", 151},
- {"please", 152},
- {"burn", 153},
- {"cause", 154},
- {"enough", 155},
- {"touch", 156},
- {"moment", 157},
- {"soon", 158},
- {"voice", 159},
- {"scream", 160},
- {"anything", 161},
- {"stare", 162},
- {"sound", 163},
- {"red", 164},
- {"everyone", 165},
- {"hide", 166},
- {"kiss", 167},
- {"truth", 168},
- {"death", 169},
- {"beautiful", 170},
- {"mine", 171},
- {"blood", 172},
- {"broken", 173},
- {"very", 174},
- {"pass", 175},
- {"next", 176},
- {"forget", 177},
- {"tree", 178},
- {"wrong", 179},
- {"air", 180},
- {"mother", 181},
- {"understand", 182},
- {"lip", 183},
- {"hit", 184},
- {"wall", 185},
- {"memory", 186},
- {"sleep", 187},
- {"free", 188},
- {"high", 189},
- {"realize", 190},
- {"school", 191},
- {"might", 192},
- {"skin", 193},
- {"sweet", 194},
- {"perfect", 195},
- {"blue", 196},
- {"kill", 197},
- {"breath", 198},
- {"dance", 199},
- {"against", 200},
- {"fly", 201},
- {"between", 202},
- {"grow", 203},
- {"strong", 204},
- {"under", 205},
- {"listen", 206},
- {"bring", 207},
- {"sometimes", 208},
- {"speak", 209},
- {"pull", 210},
- {"person", 211},
- {"become", 212},
- {"family", 213},
- {"begin", 214},
- {"ground", 215},
- {"real", 216},
- {"small", 217},
- {"father", 218},
- {"sure", 219},
- {"feet", 220},
- {"rest", 221},
- {"young", 222},
- {"finally", 223},
- {"land", 224},
- {"across", 225},
- {"today", 226},
- {"different", 227},
- {"guy", 228},
- {"line", 229},
- {"fire", 230},
- {"reason", 231},
- {"reach", 232},
- {"second", 233},
- {"slowly", 234},
- {"write", 235},
- {"eat", 236},
- {"smell", 237},
- {"mouth", 238},
- {"step", 239},
- {"learn", 240},
- {"three", 241},
- {"floor", 242},
- {"promise", 243},
- {"breathe", 244},
- {"darkness", 245},
- {"push", 246},
- {"earth", 247},
- {"guess", 248},
- {"save", 249},
- {"song", 250},
- {"above", 251},
- {"along", 252},
- {"both", 253},
- {"color", 254},
- {"house", 255},
- {"almost", 256},
- {"sorry", 257},
- {"anymore", 258},
- {"brother", 259},
- {"okay", 260},
- {"dear", 261},
- {"game", 262},
- {"fade", 263},
- {"already", 264},
- {"apart", 265},
- {"warm", 266},
- {"beauty", 267},
- {"heard", 268},
- {"notice", 269},
- {"question", 270},
- {"shine", 271},
- {"began", 272},
- {"piece", 273},
- {"whole", 274},
- {"shadow", 275},
- {"secret", 276},
- {"street", 277},
- {"within", 278},
- {"finger", 279},
- {"point", 280},
- {"morning", 281},
- {"whisper", 282},
- {"child", 283},
- {"moon", 284},
- {"green", 285},
- {"story", 286},
- {"glass", 287},
- {"kid", 288},
- {"silence", 289},
- {"since", 290},
- {"soft", 291},
- {"yourself", 292},
- {"empty", 293},
- {"shall", 294},
- {"angel", 295},
- {"answer", 296},
- {"baby", 297},
- {"bright", 298},
- {"dad", 299},
- {"path", 300},
- {"worry", 301},
- {"hour", 302},
- {"drop", 303},
- {"follow", 304},
- {"power", 305},
- {"war", 306},
- {"half", 307},
- {"flow", 308},
- {"heaven", 309},
- {"act", 310},
- {"chance", 311},
- {"fact", 312},
- {"least", 313},
- {"tired", 314},
- {"children", 315},
- {"near", 316},
- {"quite", 317},
- {"afraid", 318},
- {"rise", 319},
- {"sea", 320},
- {"taste", 321},
- {"window", 322},
- {"cover", 323},
- {"nice", 324},
- {"trust", 325},
- {"lot", 326},
- {"sad", 327},
- {"cool", 328},
- {"force", 329},
- {"peace", 330},
- {"return", 331},
- {"blind", 332},
- {"easy", 333},
- {"ready", 334},
- {"roll", 335},
- {"rose", 336},
- {"drive", 337},
- {"held", 338},
- {"music", 339},
- {"beneath", 340},
- {"hang", 341},
- {"mom", 342},
- {"paint", 343},
- {"emotion", 344},
- {"quiet", 345},
- {"clear", 346},
- {"cloud", 347},
- {"few", 348},
- {"pretty", 349},
- {"bird", 350},
- {"outside", 351},
- {"paper", 352},
- {"picture", 353},
- {"front", 354},
- {"rock", 355},
- {"simple", 356},
- {"anyone", 357},
- {"meant", 358},
- {"reality", 359},
- {"road", 360},
- {"sense", 361},
- {"waste", 362},
- {"bit", 363},
- {"leaf", 364},
- {"thank", 365},
- {"happiness", 366},
- {"meet", 367},
- {"men", 368},
- {"smoke", 369},
- {"truly", 370},
- {"decide", 371},
- {"self", 372},
- {"age", 373},
- {"book", 374},
- {"form", 375},
- {"alive", 376},
- {"carry", 377},
- {"escape", 378},
- {"damn", 379},
- {"instead", 380},
- {"able", 381},
- {"ice", 382},
- {"minute", 383},
- {"throw", 384},
- {"catch", 385},
- {"leg", 386},
- {"ring", 387},
- {"course", 388},
- {"goodbye", 389},
- {"lead", 390},
- {"poem", 391},
- {"sick", 392},
- {"corner", 393},
- {"desire", 394},
- {"known", 395},
- {"problem", 396},
- {"remind", 397},
- {"shoulder", 398},
- {"suppose", 399},
- {"toward", 400},
- {"wave", 401},
- {"drink", 402},
- {"jump", 403},
- {"woman", 404},
- {"pretend", 405},
- {"sister", 406},
- {"week", 407},
- {"human", 408},
- {"joy", 409},
- {"crack", 410},
- {"grey", 411},
- {"pray", 412},
- {"surprise", 413},
- {"dry", 414},
- {"knee", 415},
- {"less", 416},
- {"search", 417},
- {"bleed", 418},
- {"caught", 419},
- {"clean", 420},
- {"embrace", 421},
- {"future", 422},
- {"king", 423},
- {"son", 424},
- {"sorrow", 425},
- {"chest", 426},
- {"hug", 427},
- {"remain", 428},
- {"sat", 429},
- {"worth", 430},
- {"blow", 431},
- {"daddy", 432},
- {"final", 433},
- {"parent", 434},
- {"tight", 435},
- {"also", 436},
- {"create", 437},
- {"lonely", 438},
- {"safe", 439},
- {"cross", 440},
- {"dress", 441},
- {"evil", 442},
- {"silent", 443},
- {"bone", 444},
- {"fate", 445},
- {"perhaps", 446},
- {"anger", 447},
- {"class", 448},
- {"scar", 449},
- {"snow", 450},
- {"tiny", 451},
- {"tonight", 452},
- {"continue", 453},
- {"control", 454},
- {"dog", 455},
- {"edge", 456},
- {"mirror", 457},
- {"month", 458},
- {"suddenly", 459},
- {"comfort", 460},
- {"given", 461},
- {"loud", 462},
- {"quickly", 463},
- {"gaze", 464},
- {"plan", 465},
- {"rush", 466},
- {"stone", 467},
- {"town", 468},
- {"battle", 469},
- {"ignore", 470},
- {"spirit", 471},
- {"stood", 472},
- {"stupid", 473},
- {"yours", 474},
- {"brown", 475},
- {"build", 476},
- {"dust", 477},
- {"hey", 478},
- {"kept", 479},
- {"pay", 480},
- {"phone", 481},
- {"twist", 482},
- {"although", 483},
- {"ball", 484},
- {"beyond", 485},
- {"hidden", 486},
- {"nose", 487},
- {"taken", 488},
- {"fail", 489},
- {"float", 490},
- {"pure", 491},
- {"somehow", 492},
- {"wash", 493},
- {"wrap", 494},
- {"angry", 495},
- {"cheek", 496},
- {"creature", 497},
- {"forgotten", 498},
- {"heat", 499},
- {"rip", 500},
- {"single", 501},
- {"space", 502},
- {"special", 503},
- {"weak", 504},
- {"whatever", 505},
- {"yell", 506},
- {"anyway", 507},
- {"blame", 508},
- {"job", 509},
- {"choose", 510},
- {"country", 511},
- {"curse", 512},
- {"drift", 513},
- {"echo", 514},
- {"figure", 515},
- {"grew", 516},
- {"laughter", 517},
- {"neck", 518},
- {"suffer", 519},
- {"worse", 520},
- {"yeah", 521},
- {"disappear", 522},
- {"foot", 523},
- {"forward", 524},
- {"knife", 525},
- {"mess", 526},
- {"somewhere", 527},
- {"stomach", 528},
- {"storm", 529},
- {"beg", 530},
- {"idea", 531},
- {"lift", 532},
- {"offer", 533},
- {"breeze", 534},
- {"field", 535},
- {"five", 536},
- {"often", 537},
- {"simply", 538},
- {"stuck", 539},
- {"win", 540},
- {"allow", 541},
- {"confuse", 542},
- {"enjoy", 543},
- {"except", 544},
- {"flower", 545},
- {"seek", 546},
- {"strength", 547},
- {"calm", 548},
- {"grin", 549},
- {"gun", 550},
- {"heavy", 551},
- {"hill", 552},
- {"large", 553},
- {"ocean", 554},
- {"shoe", 555},
- {"sigh", 556},
- {"straight", 557},
- {"summer", 558},
- {"tongue", 559},
- {"accept", 560},
- {"crazy", 561},
- {"everyday", 562},
- {"exist", 563},
- {"grass", 564},
- {"mistake", 565},
- {"sent", 566},
- {"shut", 567},
- {"surround", 568},
- {"table", 569},
- {"ache", 570},
- {"brain", 571},
- {"destroy", 572},
- {"heal", 573},
- {"nature", 574},
- {"shout", 575},
- {"sign", 576},
- {"stain", 577},
- {"choice", 578},
- {"doubt", 579},
- {"glance", 580},
- {"glow", 581},
- {"mountain", 582},
- {"queen", 583},
- {"stranger", 584},
- {"throat", 585},
- {"tomorrow", 586},
- {"city", 587},
- {"either", 588},
- {"fish", 589},
- {"flame", 590},
- {"rather", 591},
- {"shape", 592},
- {"spin", 593},
- {"spread", 594},
- {"ash", 595},
- {"distance", 596},
- {"finish", 597},
- {"image", 598},
- {"imagine", 599},
- {"important", 600},
- {"nobody", 601},
- {"shatter", 602},
- {"warmth", 603},
- {"became", 604},
- {"feed", 605},
- {"flesh", 606},
- {"funny", 607},
- {"lust", 608},
- {"shirt", 609},
- {"trouble", 610},
- {"yellow", 611},
- {"attention", 612},
- {"bare", 613},
- {"bite", 614},
- {"money", 615},
- {"protect", 616},
- {"amaze", 617},
- {"appear", 618},
- {"born", 619},
- {"choke", 620},
- {"completely", 621},
- {"daughter", 622},
- {"fresh", 623},
- {"friendship", 624},
- {"gentle", 625},
- {"probably", 626},
- {"six", 627},
- {"deserve", 628},
- {"expect", 629},
- {"grab", 630},
- {"middle", 631},
- {"nightmare", 632},
- {"river", 633},
- {"thousand", 634},
- {"weight", 635},
- {"worst", 636},
- {"wound", 637},
- {"barely", 638},
- {"bottle", 639},
- {"cream", 640},
- {"regret", 641},
- {"relationship", 642},
- {"stick", 643},
- {"test", 644},
- {"crush", 645},
- {"endless", 646},
- {"fault", 647},
- {"itself", 648},
- {"rule", 649},
- {"spill", 650},
- {"art", 651},
- {"circle", 652},
- {"join", 653},
- {"kick", 654},
- {"mask", 655},
- {"master", 656},
- {"passion", 657},
- {"quick", 658},
- {"raise", 659},
- {"smooth", 660},
- {"unless", 661},
- {"wander", 662},
- {"actually", 663},
- {"broke", 664},
- {"chair", 665},
- {"deal", 666},
- {"favorite", 667},
- {"gift", 668},
- {"note", 669},
- {"number", 670},
- {"sweat", 671},
- {"box", 672},
- {"chill", 673},
- {"clothes", 674},
- {"lady", 675},
- {"mark", 676},
- {"park", 677},
- {"poor", 678},
- {"sadness", 679},
- {"tie", 680},
- {"animal", 681},
- {"belong", 682},
- {"brush", 683},
- {"consume", 684},
- {"dawn", 685},
- {"forest", 686},
- {"innocent", 687},
- {"pen", 688},
- {"pride", 689},
- {"stream", 690},
- {"thick", 691},
- {"clay", 692},
- {"complete", 693},
- {"count", 694},
- {"draw", 695},
- {"faith", 696},
- {"press", 697},
- {"silver", 698},
- {"struggle", 699},
- {"surface", 700},
- {"taught", 701},
- {"teach", 702},
- {"wet", 703},
- {"bless", 704},
- {"chase", 705},
- {"climb", 706},
- {"enter", 707},
- {"letter", 708},
- {"melt", 709},
- {"metal", 710},
- {"movie", 711},
- {"stretch", 712},
- {"swing", 713},
- {"vision", 714},
- {"wife", 715},
- {"beside", 716},
- {"crash", 717},
- {"forgot", 718},
- {"guide", 719},
- {"haunt", 720},
- {"joke", 721},
- {"knock", 722},
- {"plant", 723},
- {"pour", 724},
- {"prove", 725},
- {"reveal", 726},
- {"steal", 727},
- {"stuff", 728},
- {"trip", 729},
- {"wood", 730},
- {"wrist", 731},
- {"bother", 732},
- {"bottom", 733},
- {"crawl", 734},
- {"crowd", 735},
- {"fix", 736},
- {"forgive", 737},
- {"frown", 738},
- {"grace", 739},
- {"loose", 740},
- {"lucky", 741},
- {"party", 742},
- {"release", 743},
- {"surely", 744},
- {"survive", 745},
- {"teacher", 746},
- {"gently", 747},
- {"grip", 748},
- {"speed", 749},
- {"suicide", 750},
- {"travel", 751},
- {"treat", 752},
- {"vein", 753},
- {"written", 754},
- {"cage", 755},
- {"chain", 756},
- {"conversation", 757},
- {"date", 758},
- {"enemy", 759},
- {"however", 760},
- {"interest", 761},
- {"million", 762},
- {"page", 763},
- {"pink", 764},
- {"proud", 765},
- {"sway", 766},
- {"themselves", 767},
- {"winter", 768},
- {"church", 769},
- {"cruel", 770},
- {"cup", 771},
- {"demon", 772},
- {"experience", 773},
- {"freedom", 774},
- {"pair", 775},
- {"pop", 776},
- {"purpose", 777},
- {"respect", 778},
- {"shoot", 779},
- {"softly", 780},
- {"state", 781},
- {"strange", 782},
- {"bar", 783},
- {"birth", 784},
- {"curl", 785},
- {"dirt", 786},
- {"excuse", 787},
- {"lord", 788},
- {"lovely", 789},
- {"monster", 790},
- {"order", 791},
- {"pack", 792},
- {"pants", 793},
- {"pool", 794},
- {"scene", 795},
- {"seven", 796},
- {"shame", 797},
- {"slide", 798},
- {"ugly", 799},
- {"among", 800},
- {"blade", 801},
- {"blonde", 802},
- {"closet", 803},
- {"creek", 804},
- {"deny", 805},
- {"drug", 806},
- {"eternity", 807},
- {"gain", 808},
- {"grade", 809},
- {"handle", 810},
- {"key", 811},
- {"linger", 812},
- {"pale", 813},
- {"prepare", 814},
- {"swallow", 815},
- {"swim", 816},
- {"tremble", 817},
- {"wheel", 818},
- {"won", 819},
- {"cast", 820},
- {"cigarette", 821},
- {"claim", 822},
- {"college", 823},
- {"direction", 824},
- {"dirty", 825},
- {"gather", 826},
- {"ghost", 827},
- {"hundred", 828},
- {"loss", 829},
- {"lung", 830},
- {"orange", 831},
- {"present", 832},
- {"swear", 833},
- {"swirl", 834},
- {"twice", 835},
- {"wild", 836},
- {"bitter", 837},
- {"blanket", 838},
- {"doctor", 839},
- {"everywhere", 840},
- {"flash", 841},
- {"grown", 842},
- {"knowledge", 843},
- {"numb", 844},
- {"pressure", 845},
- {"radio", 846},
- {"repeat", 847},
- {"ruin", 848},
- {"spend", 849},
- {"unknown", 850},
- {"buy", 851},
- {"clock", 852},
- {"devil", 853},
- {"early", 854},
- {"false", 855},
- {"fantasy", 856},
- {"pound", 857},
- {"precious", 858},
- {"refuse", 859},
- {"sheet", 860},
- {"teeth", 861},
- {"welcome", 862},
- {"add", 863},
- {"ahead", 864},
- {"block", 865},
- {"bury", 866},
- {"caress", 867},
- {"content", 868},
- {"depth", 869},
- {"despite", 870},
- {"distant", 871},
- {"marry", 872},
- {"purple", 873},
- {"threw", 874},
- {"whenever", 875},
- {"bomb", 876},
- {"dull", 877},
- {"easily", 878},
- {"grasp", 879},
- {"hospital", 880},
- {"innocence", 881},
- {"normal", 882},
- {"receive", 883},
- {"reply", 884},
- {"rhyme", 885},
- {"shade", 886},
- {"someday", 887},
- {"sword", 888},
- {"toe", 889},
- {"visit", 890},
- {"asleep", 891},
- {"bought", 892},
- {"center", 893},
- {"consider", 894},
- {"flat", 895},
- {"hero", 896},
- {"history", 897},
- {"ink", 898},
- {"insane", 899},
- {"muscle", 900},
- {"mystery", 901},
- {"pocket", 902},
- {"reflection", 903},
- {"shove", 904},
- {"silently", 905},
- {"smart", 906},
- {"soldier", 907},
- {"spot", 908},
- {"stress", 909},
- {"train", 910},
- {"type", 911},
- {"view", 912},
- {"whether", 913},
- {"bus", 914},
- {"energy", 915},
- {"explain", 916},
- {"holy", 917},
- {"hunger", 918},
- {"inch", 919},
- {"magic", 920},
- {"mix", 921},
- {"noise", 922},
- {"nowhere", 923},
- {"prayer", 924},
- {"presence", 925},
- {"shock", 926},
- {"snap", 927},
- {"spider", 928},
- {"study", 929},
- {"thunder", 930},
- {"trail", 931},
- {"admit", 932},
- {"agree", 933},
- {"bag", 934},
- {"bang", 935},
- {"bound", 936},
- {"butterfly", 937},
- {"cute", 938},
- {"exactly", 939},
- {"explode", 940},
- {"familiar", 941},
- {"fold", 942},
- {"further", 943},
- {"pierce", 944},
- {"reflect", 945},
- {"scent", 946},
- {"selfish", 947},
- {"sharp", 948},
- {"sink", 949},
- {"spring", 950},
- {"stumble", 951},
- {"universe", 952},
- {"weep", 953},
- {"women", 954},
- {"wonderful", 955},
- {"action", 956},
- {"ancient", 957},
- {"attempt", 958},
- {"avoid", 959},
- {"birthday", 960},
- {"branch", 961},
- {"chocolate", 962},
- {"core", 963},
- {"depress", 964},
- {"drunk", 965},
- {"especially", 966},
- {"focus", 967},
- {"fruit", 968},
- {"honest", 969},
- {"match", 970},
- {"palm", 971},
- {"perfectly", 972},
- {"pillow", 973},
- {"pity", 974},
- {"poison", 975},
- {"roar", 976},
- {"shift", 977},
- {"slightly", 978},
- {"thump", 979},
- {"truck", 980},
- {"tune", 981},
- {"twenty", 982},
- {"unable", 983},
- {"wipe", 984},
- {"wrote", 985},
- {"coat", 986},
- {"constant", 987},
- {"dinner", 988},
- {"drove", 989},
- {"egg", 990},
- {"eternal", 991},
- {"flight", 992},
- {"flood", 993},
- {"frame", 994},
- {"freak", 995},
- {"gasp", 996},
- {"glad", 997},
- {"hollow", 998},
- {"motion", 999},
- {"peer", 1000},
- {"plastic", 1001},
- {"root", 1002},
- {"screen", 1003},
- {"season", 1004},
- {"sting", 1005},
- {"strike", 1006},
- {"team", 1007},
- {"unlike", 1008},
- {"victim", 1009},
- {"volume", 1010},
- {"warn", 1011},
- {"weird", 1012},
- {"attack", 1013},
- {"await", 1014},
- {"awake", 1015},
- {"built", 1016},
- {"charm", 1017},
- {"crave", 1018},
- {"despair", 1019},
- {"fought", 1020},
- {"grant", 1021},
- {"grief", 1022},
- {"horse", 1023},
- {"limit", 1024},
- {"message", 1025},
- {"ripple", 1026},
- {"sanity", 1027},
- {"scatter", 1028},
- {"serve", 1029},
- {"split", 1030},
- {"string", 1031},
- {"trick", 1032},
- {"annoy", 1033},
- {"blur", 1034},
- {"boat", 1035},
- {"brave", 1036},
- {"clearly", 1037},
- {"cling", 1038},
- {"connect", 1039},
- {"fist", 1040},
- {"forth", 1041},
- {"imagination", 1042},
- {"iron", 1043},
- {"jock", 1044},
- {"judge", 1045},
- {"lesson", 1046},
- {"milk", 1047},
- {"misery", 1048},
- {"nail", 1049},
- {"naked", 1050},
- {"ourselves", 1051},
- {"poet", 1052},
- {"possible", 1053},
- {"princess", 1054},
- {"sail", 1055},
- {"size", 1056},
- {"snake", 1057},
- {"society", 1058},
- {"stroke", 1059},
- {"torture", 1060},
- {"toss", 1061},
- {"trace", 1062},
- {"wise", 1063},
- {"bloom", 1064},
- {"bullet", 1065},
- {"cell", 1066},
- {"check", 1067},
- {"cost", 1068},
- {"darling", 1069},
- {"during", 1070},
- {"footstep", 1071},
- {"fragile", 1072},
- {"hallway", 1073},
- {"hardly", 1074},
- {"horizon", 1075},
- {"invisible", 1076},
- {"journey", 1077},
- {"midnight", 1078},
- {"mud", 1079},
- {"nod", 1080},
- {"pause", 1081},
- {"relax", 1082},
- {"shiver", 1083},
- {"sudden", 1084},
- {"value", 1085},
- {"youth", 1086},
- {"abuse", 1087},
- {"admire", 1088},
- {"blink", 1089},
- {"breast", 1090},
- {"bruise", 1091},
- {"constantly", 1092},
- {"couple", 1093},
- {"creep", 1094},
- {"curve", 1095},
- {"difference", 1096},
- {"dumb", 1097},
- {"emptiness", 1098},
- {"gotta", 1099},
- {"honor", 1100},
- {"plain", 1101},
- {"planet", 1102},
- {"recall", 1103},
- {"rub", 1104},
- {"ship", 1105},
- {"slam", 1106},
- {"soar", 1107},
- {"somebody", 1108},
- {"tightly", 1109},
- {"weather", 1110},
- {"adore", 1111},
- {"approach", 1112},
- {"bond", 1113},
- {"bread", 1114},
- {"burst", 1115},
- {"candle", 1116},
- {"coffee", 1117},
- {"cousin", 1118},
- {"crime", 1119},
- {"desert", 1120},
- {"flutter", 1121},
- {"frozen", 1122},
- {"grand", 1123},
- {"heel", 1124},
- {"hello", 1125},
- {"language", 1126},
- {"level", 1127},
- {"movement", 1128},
- {"pleasure", 1129},
- {"powerful", 1130},
- {"random", 1131},
- {"rhythm", 1132},
- {"settle", 1133},
- {"silly", 1134},
- {"slap", 1135},
- {"sort", 1136},
- {"spoken", 1137},
- {"steel", 1138},
- {"threaten", 1139},
- {"tumble", 1140},
- {"upset", 1141},
- {"aside", 1142},
- {"awkward", 1143},
- {"bee", 1144},
- {"blank", 1145},
- {"board", 1146},
- {"button", 1147},
- {"card", 1148},
- {"carefully", 1149},
- {"complain", 1150},
- {"crap", 1151},
- {"deeply", 1152},
- {"discover", 1153},
- {"drag", 1154},
- {"dread", 1155},
- {"effort", 1156},
- {"entire", 1157},
- {"fairy", 1158},
- {"giant", 1159},
- {"gotten", 1160},
- {"greet", 1161},
- {"illusion", 1162},
- {"jeans", 1163},
- {"leap", 1164},
- {"liquid", 1165},
- {"march", 1166},
- {"mend", 1167},
- {"nervous", 1168},
- {"nine", 1169},
- {"replace", 1170},
- {"rope", 1171},
- {"spine", 1172},
- {"stole", 1173},
- {"terror", 1174},
- {"accident", 1175},
- {"apple", 1176},
- {"balance", 1177},
- {"boom", 1178},
- {"childhood", 1179},
- {"collect", 1180},
- {"demand", 1181},
- {"depression", 1182},
- {"eventually", 1183},
- {"faint", 1184},
- {"glare", 1185},
- {"goal", 1186},
- {"group", 1187},
- {"honey", 1188},
- {"kitchen", 1189},
- {"laid", 1190},
- {"limb", 1191},
- {"machine", 1192},
- {"mere", 1193},
- {"mold", 1194},
- {"murder", 1195},
- {"nerve", 1196},
- {"painful", 1197},
- {"poetry", 1198},
- {"prince", 1199},
- {"rabbit", 1200},
- {"shelter", 1201},
- {"shore", 1202},
- {"shower", 1203},
- {"soothe", 1204},
- {"stair", 1205},
- {"steady", 1206},
- {"sunlight", 1207},
- {"tangle", 1208},
- {"tease", 1209},
- {"treasure", 1210},
- {"uncle", 1211},
- {"begun", 1212},
- {"bliss", 1213},
- {"canvas", 1214},
- {"cheer", 1215},
- {"claw", 1216},
- {"clutch", 1217},
- {"commit", 1218},
- {"crimson", 1219},
- {"crystal", 1220},
- {"delight", 1221},
- {"doll", 1222},
- {"existence", 1223},
- {"express", 1224},
- {"fog", 1225},
- {"football", 1226},
- {"gay", 1227},
- {"goose", 1228},
- {"guard", 1229},
- {"hatred", 1230},
- {"illuminate", 1231},
- {"mass", 1232},
- {"math", 1233},
- {"mourn", 1234},
- {"rich", 1235},
- {"rough", 1236},
- {"skip", 1237},
- {"stir", 1238},
- {"student", 1239},
- {"style", 1240},
- {"support", 1241},
- {"thorn", 1242},
- {"tough", 1243},
- {"yard", 1244},
- {"yearn", 1245},
- {"yesterday", 1246},
- {"advice", 1247},
- {"appreciate", 1248},
- {"autumn", 1249},
- {"bank", 1250},
- {"beam", 1251},
- {"bowl", 1252},
- {"capture", 1253},
- {"carve", 1254},
- {"collapse", 1255},
- {"confusion", 1256},
- {"creation", 1257},
- {"dove", 1258},
- {"feather", 1259},
- {"girlfriend", 1260},
- {"glory", 1261},
- {"government", 1262},
- {"harsh", 1263},
- {"hop", 1264},
- {"inner", 1265},
- {"loser", 1266},
- {"moonlight", 1267},
- {"neighbor", 1268},
- {"neither", 1269},
- {"peach", 1270},
- {"pig", 1271},
- {"praise", 1272},
- {"screw", 1273},
- {"shield", 1274},
- {"shimmer", 1275},
- {"sneak", 1276},
- {"stab", 1277},
- {"subject", 1278},
- {"throughout", 1279},
- {"thrown", 1280},
- {"tower", 1281},
- {"twirl", 1282},
- {"wow", 1283},
- {"army", 1284},
- {"arrive", 1285},
- {"bathroom", 1286},
- {"bump", 1287},
- {"cease", 1288},
- {"cookie", 1289},
- {"couch", 1290},
- {"courage", 1291},
- {"dim", 1292},
- {"guilt", 1293},
- {"howl", 1294},
- {"hum", 1295},
- {"husband", 1296},
- {"insult", 1297},
- {"led", 1298},
- {"lunch", 1299},
- {"mock", 1300},
- {"mostly", 1301},
- {"natural", 1302},
- {"nearly", 1303},
- {"needle", 1304},
- {"nerd", 1305},
- {"peaceful", 1306},
- {"perfection", 1307},
- {"pile", 1308},
- {"price", 1309},
- {"remove", 1310},
- {"roam", 1311},
- {"sanctuary", 1312},
- {"serious", 1313},
- {"shiny", 1314},
- {"shook", 1315},
- {"sob", 1316},
- {"stolen", 1317},
- {"tap", 1318},
- {"vain", 1319},
- {"void", 1320},
- {"warrior", 1321},
- {"wrinkle", 1322},
- {"affection", 1323},
- {"apologize", 1324},
- {"blossom", 1325},
- {"bounce", 1326},
- {"bridge", 1327},
- {"cheap", 1328},
- {"crumble", 1329},
- {"decision", 1330},
- {"descend", 1331},
- {"desperately", 1332},
- {"dig", 1333},
- {"dot", 1334},
- {"flip", 1335},
- {"frighten", 1336},
- {"heartbeat", 1337},
- {"huge", 1338},
- {"lazy", 1339},
- {"lick", 1340},
- {"odd", 1341},
- {"opinion", 1342},
- {"process", 1343},
- {"puzzle", 1344},
- {"quietly", 1345},
- {"retreat", 1346},
- {"score", 1347},
- {"sentence", 1348},
- {"separate", 1349},
- {"situation", 1350},
- {"skill", 1351},
- {"soak", 1352},
- {"square", 1353},
- {"stray", 1354},
- {"taint", 1355},
- {"task", 1356},
- {"tide", 1357},
- {"underneath", 1358},
- {"veil", 1359},
- {"whistle", 1360},
- {"anywhere", 1361},
- {"bedroom", 1362},
- {"bid", 1363},
- {"bloody", 1364},
- {"burden", 1365},
- {"careful", 1366},
- {"compare", 1367},
- {"concern", 1368},
- {"curtain", 1369},
- {"decay", 1370},
- {"defeat", 1371},
- {"describe", 1372},
- {"double", 1373},
- {"dreamer", 1374},
- {"driver", 1375},
- {"dwell", 1376},
- {"evening", 1377},
- {"flare", 1378},
- {"flicker", 1379},
- {"grandma", 1380},
- {"guitar", 1381},
- {"harm", 1382},
- {"horrible", 1383},
- {"hungry", 1384},
- {"indeed", 1385},
- {"lace", 1386},
- {"melody", 1387},
- {"monkey", 1388},
- {"nation", 1389},
- {"object", 1390},
- {"obviously", 1391},
- {"rainbow", 1392},
- {"salt", 1393},
- {"scratch", 1394},
- {"shown", 1395},
- {"shy", 1396},
- {"stage", 1397},
- {"stun", 1398},
- {"third", 1399},
- {"tickle", 1400},
- {"useless", 1401},
- {"weakness", 1402},
- {"worship", 1403},
- {"worthless", 1404},
- {"afternoon", 1405},
- {"beard", 1406},
- {"boyfriend", 1407},
- {"bubble", 1408},
- {"busy", 1409},
- {"certain", 1410},
- {"chin", 1411},
- {"concrete", 1412},
- {"desk", 1413},
- {"diamond", 1414},
- {"doom", 1415},
- {"drawn", 1416},
- {"due", 1417},
- {"felicity", 1418},
- {"freeze", 1419},
- {"frost", 1420},
- {"garden", 1421},
- {"glide", 1422},
- {"harmony", 1423},
- {"hopefully", 1424},
- {"hunt", 1425},
- {"jealous", 1426},
- {"lightning", 1427},
- {"mama", 1428},
- {"mercy", 1429},
- {"peel", 1430},
- {"physical", 1431},
- {"position", 1432},
- {"pulse", 1433},
- {"punch", 1434},
- {"quit", 1435},
- {"rant", 1436},
- {"respond", 1437},
- {"salty", 1438},
- {"sane", 1439},
- {"satisfy", 1440},
- {"savior", 1441},
- {"sheep", 1442},
- {"slept", 1443},
- {"social", 1444},
- {"sport", 1445},
- {"tuck", 1446},
- {"utter", 1447},
- {"valley", 1448},
- {"wolf", 1449},
- {"aim", 1450},
- {"alas", 1451},
- {"alter", 1452},
- {"arrow", 1453},
- {"awaken", 1454},
- {"beaten", 1455},
- {"belief", 1456},
- {"brand", 1457},
- {"ceiling", 1458},
- {"cheese", 1459},
- {"clue", 1460},
- {"confidence", 1461},
- {"connection", 1462},
- {"daily", 1463},
- {"disguise", 1464},
- {"eager", 1465},
- {"erase", 1466},
- {"essence", 1467},
- {"everytime", 1468},
- {"expression", 1469},
- {"fan", 1470},
- {"flag", 1471},
- {"flirt", 1472},
- {"foul", 1473},
- {"fur", 1474},
- {"giggle", 1475},
- {"glorious", 1476},
- {"ignorance", 1477},
- {"law", 1478},
- {"lifeless", 1479},
- {"measure", 1480},
- {"mighty", 1481},
- {"muse", 1482},
- {"north", 1483},
- {"opposite", 1484},
- {"paradise", 1485},
- {"patience", 1486},
- {"patient", 1487},
- {"pencil", 1488},
- {"petal", 1489},
- {"plate", 1490},
- {"ponder", 1491},
- {"possibly", 1492},
- {"practice", 1493},
- {"slice", 1494},
- {"spell", 1495},
- {"stock", 1496},
- {"strife", 1497},
- {"strip", 1498},
- {"suffocate", 1499},
- {"suit", 1500},
- {"tender", 1501},
- {"tool", 1502},
- {"trade", 1503},
- {"velvet", 1504},
- {"verse", 1505},
- {"waist", 1506},
- {"witch", 1507},
- {"aunt", 1508},
- {"bench", 1509},
- {"bold", 1510},
- {"cap", 1511},
- {"certainly", 1512},
- {"click", 1513},
- {"companion", 1514},
- {"creator", 1515},
- {"dart", 1516},
- {"delicate", 1517},
- {"determine", 1518},
- {"dish", 1519},
- {"dragon", 1520},
- {"drama", 1521},
- {"drum", 1522},
- {"dude", 1523},
- {"everybody", 1524},
- {"feast", 1525},
- {"forehead", 1526},
- {"former", 1527},
- {"fright", 1528},
- {"fully", 1529},
- {"gas", 1530},
- {"hook", 1531},
- {"hurl", 1532},
- {"invite", 1533},
- {"juice", 1534},
- {"manage", 1535},
- {"moral", 1536},
- {"possess", 1537},
- {"raw", 1538},
- {"rebel", 1539},
- {"royal", 1540},
- {"scale", 1541},
- {"scary", 1542},
- {"several", 1543},
- {"slight", 1544},
- {"stubborn", 1545},
- {"swell", 1546},
- {"talent", 1547},
- {"tea", 1548},
- {"terrible", 1549},
- {"thread", 1550},
- {"torment", 1551},
- {"trickle", 1552},
- {"usually", 1553},
- {"vast", 1554},
- {"violence", 1555},
- {"weave", 1556},
- {"acid", 1557},
- {"agony", 1558},
- {"ashamed", 1559},
- {"awe", 1560},
- {"belly", 1561},
- {"blend", 1562},
- {"blush", 1563},
- {"character", 1564},
- {"cheat", 1565},
- {"common", 1566},
- {"company", 1567},
- {"coward", 1568},
- {"creak", 1569},
- {"danger", 1570},
- {"deadly", 1571},
- {"defense", 1572},
- {"define", 1573},
- {"depend", 1574},
- {"desperate", 1575},
- {"destination", 1576},
- {"dew", 1577},
- {"duck", 1578},
- {"dusty", 1579},
- {"embarrass", 1580},
- {"engine", 1581},
- {"example", 1582},
- {"explore", 1583},
- {"foe", 1584},
- {"freely", 1585},
- {"frustrate", 1586},
- {"generation", 1587},
- {"glove", 1588},
- {"guilty", 1589},
- {"health", 1590},
- {"hurry", 1591},
- {"idiot", 1592},
- {"impossible", 1593},
- {"inhale", 1594},
- {"jaw", 1595},
- {"kingdom", 1596},
- {"mention", 1597},
- {"mist", 1598},
- {"moan", 1599},
- {"mumble", 1600},
- {"mutter", 1601},
- {"observe", 1602},
- {"ode", 1603},
- {"pathetic", 1604},
- {"pattern", 1605},
- {"pie", 1606},
- {"prefer", 1607},
- {"puff", 1608},
- {"rape", 1609},
- {"rare", 1610},
- {"revenge", 1611},
- {"rude", 1612},
- {"scrape", 1613},
- {"spiral", 1614},
- {"squeeze", 1615},
- {"strain", 1616},
- {"sunset", 1617},
- {"suspend", 1618},
- {"sympathy", 1619},
- {"thigh", 1620},
- {"throne", 1621},
- {"total", 1622},
- {"unseen", 1623},
- {"weapon", 1624},
- {"weary", 1625}
- };
-
- const std::string wordsArray[] = {
- "like",
- "just",
- "love",
- "know",
- "never",
- "want",
- "time",
- "out",
- "there",
- "make",
- "look",
- "eye",
- "down",
- "only",
- "think",
- "heart",
- "back",
- "then",
- "into",
- "about",
- "more",
- "away",
- "still",
- "them",
- "take",
- "thing",
- "even",
- "through",
- "long",
- "always",
- "world",
- "too",
- "friend",
- "tell",
- "try",
- "hand",
- "thought",
- "over",
- "here",
- "other",
- "need",
- "smile",
- "again",
- "much",
- "cry",
- "been",
- "night",
- "ever",
- "little",
- "said",
- "end",
- "some",
- "those",
- "around",
- "mind",
- "people",
- "girl",
- "leave",
- "dream",
- "left",
- "turn",
- "myself",
- "give",
- "nothing",
- "really",
- "off",
- "before",
- "something",
- "find",
- "walk",
- "wish",
- "good",
- "once",
- "place",
- "ask",
- "stop",
- "keep",
- "watch",
- "seem",
- "everything",
- "wait",
- "got",
- "yet",
- "made",
- "remember",
- "start",
- "alone",
- "run",
- "hope",
- "maybe",
- "believe",
- "body",
- "hate",
- "after",
- "close",
- "talk",
- "stand",
- "own",
- "each",
- "hurt",
- "help",
- "home",
- "god",
- "soul",
- "new",
- "many",
- "two",
- "inside",
- "should",
- "true",
- "first",
- "fear",
- "mean",
- "better",
- "play",
- "another",
- "gone",
- "change",
- "use",
- "wonder",
- "someone",
- "hair",
- "cold",
- "open",
- "best",
- "any",
- "behind",
- "happen",
- "water",
- "dark",
- "laugh",
- "stay",
- "forever",
- "name",
- "work",
- "show",
- "sky",
- "break",
- "came",
- "deep",
- "door",
- "put",
- "black",
- "together",
- "upon",
- "happy",
- "such",
- "great",
- "white",
- "matter",
- "fill",
- "past",
- "please",
- "burn",
- "cause",
- "enough",
- "touch",
- "moment",
- "soon",
- "voice",
- "scream",
- "anything",
- "stare",
- "sound",
- "red",
- "everyone",
- "hide",
- "kiss",
- "truth",
- "death",
- "beautiful",
- "mine",
- "blood",
- "broken",
- "very",
- "pass",
- "next",
- "forget",
- "tree",
- "wrong",
- "air",
- "mother",
- "understand",
- "lip",
- "hit",
- "wall",
- "memory",
- "sleep",
- "free",
- "high",
- "realize",
- "school",
- "might",
- "skin",
- "sweet",
- "perfect",
- "blue",
- "kill",
- "breath",
- "dance",
- "against",
- "fly",
- "between",
- "grow",
- "strong",
- "under",
- "listen",
- "bring",
- "sometimes",
- "speak",
- "pull",
- "person",
- "become",
- "family",
- "begin",
- "ground",
- "real",
- "small",
- "father",
- "sure",
- "feet",
- "rest",
- "young",
- "finally",
- "land",
- "across",
- "today",
- "different",
- "guy",
- "line",
- "fire",
- "reason",
- "reach",
- "second",
- "slowly",
- "write",
- "eat",
- "smell",
- "mouth",
- "step",
- "learn",
- "three",
- "floor",
- "promise",
- "breathe",
- "darkness",
- "push",
- "earth",
- "guess",
- "save",
- "song",
- "above",
- "along",
- "both",
- "color",
- "house",
- "almost",
- "sorry",
- "anymore",
- "brother",
- "okay",
- "dear",
- "game",
- "fade",
- "already",
- "apart",
- "warm",
- "beauty",
- "heard",
- "notice",
- "question",
- "shine",
- "began",
- "piece",
- "whole",
- "shadow",
- "secret",
- "street",
- "within",
- "finger",
- "point",
- "morning",
- "whisper",
- "child",
- "moon",
- "green",
- "story",
- "glass",
- "kid",
- "silence",
- "since",
- "soft",
- "yourself",
- "empty",
- "shall",
- "angel",
- "answer",
- "baby",
- "bright",
- "dad",
- "path",
- "worry",
- "hour",
- "drop",
- "follow",
- "power",
- "war",
- "half",
- "flow",
- "heaven",
- "act",
- "chance",
- "fact",
- "least",
- "tired",
- "children",
- "near",
- "quite",
- "afraid",
- "rise",
- "sea",
- "taste",
- "window",
- "cover",
- "nice",
- "trust",
- "lot",
- "sad",
- "cool",
- "force",
- "peace",
- "return",
- "blind",
- "easy",
- "ready",
- "roll",
- "rose",
- "drive",
- "held",
- "music",
- "beneath",
- "hang",
- "mom",
- "paint",
- "emotion",
- "quiet",
- "clear",
- "cloud",
- "few",
- "pretty",
- "bird",
- "outside",
- "paper",
- "picture",
- "front",
- "rock",
- "simple",
- "anyone",
- "meant",
- "reality",
- "road",
- "sense",
- "waste",
- "bit",
- "leaf",
- "thank",
- "happiness",
- "meet",
- "men",
- "smoke",
- "truly",
- "decide",
- "self",
- "age",
- "book",
- "form",
- "alive",
- "carry",
- "escape",
- "damn",
- "instead",
- "able",
- "ice",
- "minute",
- "throw",
- "catch",
- "leg",
- "ring",
- "course",
- "goodbye",
- "lead",
- "poem",
- "sick",
- "corner",
- "desire",
- "known",
- "problem",
- "remind",
- "shoulder",
- "suppose",
- "toward",
- "wave",
- "drink",
- "jump",
- "woman",
- "pretend",
- "sister",
- "week",
- "human",
- "joy",
- "crack",
- "grey",
- "pray",
- "surprise",
- "dry",
- "knee",
- "less",
- "search",
- "bleed",
- "caught",
- "clean",
- "embrace",
- "future",
- "king",
- "son",
- "sorrow",
- "chest",
- "hug",
- "remain",
- "sat",
- "worth",
- "blow",
- "daddy",
- "final",
- "parent",
- "tight",
- "also",
- "create",
- "lonely",
- "safe",
- "cross",
- "dress",
- "evil",
- "silent",
- "bone",
- "fate",
- "perhaps",
- "anger",
- "class",
- "scar",
- "snow",
- "tiny",
- "tonight",
- "continue",
- "control",
- "dog",
- "edge",
- "mirror",
- "month",
- "suddenly",
- "comfort",
- "given",
- "loud",
- "quickly",
- "gaze",
- "plan",
- "rush",
- "stone",
- "town",
- "battle",
- "ignore",
- "spirit",
- "stood",
- "stupid",
- "yours",
- "brown",
- "build",
- "dust",
- "hey",
- "kept",
- "pay",
- "phone",
- "twist",
- "although",
- "ball",
- "beyond",
- "hidden",
- "nose",
- "taken",
- "fail",
- "float",
- "pure",
- "somehow",
- "wash",
- "wrap",
- "angry",
- "cheek",
- "creature",
- "forgotten",
- "heat",
- "rip",
- "single",
- "space",
- "special",
- "weak",
- "whatever",
- "yell",
- "anyway",
- "blame",
- "job",
- "choose",
- "country",
- "curse",
- "drift",
- "echo",
- "figure",
- "grew",
- "laughter",
- "neck",
- "suffer",
- "worse",
- "yeah",
- "disappear",
- "foot",
- "forward",
- "knife",
- "mess",
- "somewhere",
- "stomach",
- "storm",
- "beg",
- "idea",
- "lift",
- "offer",
- "breeze",
- "field",
- "five",
- "often",
- "simply",
- "stuck",
- "win",
- "allow",
- "confuse",
- "enjoy",
- "except",
- "flower",
- "seek",
- "strength",
- "calm",
- "grin",
- "gun",
- "heavy",
- "hill",
- "large",
- "ocean",
- "shoe",
- "sigh",
- "straight",
- "summer",
- "tongue",
- "accept",
- "crazy",
- "everyday",
- "exist",
- "grass",
- "mistake",
- "sent",
- "shut",
- "surround",
- "table",
- "ache",
- "brain",
- "destroy",
- "heal",
- "nature",
- "shout",
- "sign",
- "stain",
- "choice",
- "doubt",
- "glance",
- "glow",
- "mountain",
- "queen",
- "stranger",
- "throat",
- "tomorrow",
- "city",
- "either",
- "fish",
- "flame",
- "rather",
- "shape",
- "spin",
- "spread",
- "ash",
- "distance",
- "finish",
- "image",
- "imagine",
- "important",
- "nobody",
- "shatter",
- "warmth",
- "became",
- "feed",
- "flesh",
- "funny",
- "lust",
- "shirt",
- "trouble",
- "yellow",
- "attention",
- "bare",
- "bite",
- "money",
- "protect",
- "amaze",
- "appear",
- "born",
- "choke",
- "completely",
- "daughter",
- "fresh",
- "friendship",
- "gentle",
- "probably",
- "six",
- "deserve",
- "expect",
- "grab",
- "middle",
- "nightmare",
- "river",
- "thousand",
- "weight",
- "worst",
- "wound",
- "barely",
- "bottle",
- "cream",
- "regret",
- "relationship",
- "stick",
- "test",
- "crush",
- "endless",
- "fault",
- "itself",
- "rule",
- "spill",
- "art",
- "circle",
- "join",
- "kick",
- "mask",
- "master",
- "passion",
- "quick",
- "raise",
- "smooth",
- "unless",
- "wander",
- "actually",
- "broke",
- "chair",
- "deal",
- "favorite",
- "gift",
- "note",
- "number",
- "sweat",
- "box",
- "chill",
- "clothes",
- "lady",
- "mark",
- "park",
- "poor",
- "sadness",
- "tie",
- "animal",
- "belong",
- "brush",
- "consume",
- "dawn",
- "forest",
- "innocent",
- "pen",
- "pride",
- "stream",
- "thick",
- "clay",
- "complete",
- "count",
- "draw",
- "faith",
- "press",
- "silver",
- "struggle",
- "surface",
- "taught",
- "teach",
- "wet",
- "bless",
- "chase",
- "climb",
- "enter",
- "letter",
- "melt",
- "metal",
- "movie",
- "stretch",
- "swing",
- "vision",
- "wife",
- "beside",
- "crash",
- "forgot",
- "guide",
- "haunt",
- "joke",
- "knock",
- "plant",
- "pour",
- "prove",
- "reveal",
- "steal",
- "stuff",
- "trip",
- "wood",
- "wrist",
- "bother",
- "bottom",
- "crawl",
- "crowd",
- "fix",
- "forgive",
- "frown",
- "grace",
- "loose",
- "lucky",
- "party",
- "release",
- "surely",
- "survive",
- "teacher",
- "gently",
- "grip",
- "speed",
- "suicide",
- "travel",
- "treat",
- "vein",
- "written",
- "cage",
- "chain",
- "conversation",
- "date",
- "enemy",
- "however",
- "interest",
- "million",
- "page",
- "pink",
- "proud",
- "sway",
- "themselves",
- "winter",
- "church",
- "cruel",
- "cup",
- "demon",
- "experience",
- "freedom",
- "pair",
- "pop",
- "purpose",
- "respect",
- "shoot",
- "softly",
- "state",
- "strange",
- "bar",
- "birth",
- "curl",
- "dirt",
- "excuse",
- "lord",
- "lovely",
- "monster",
- "order",
- "pack",
- "pants",
- "pool",
- "scene",
- "seven",
- "shame",
- "slide",
- "ugly",
- "among",
- "blade",
- "blonde",
- "closet",
- "creek",
- "deny",
- "drug",
- "eternity",
- "gain",
- "grade",
- "handle",
- "key",
- "linger",
- "pale",
- "prepare",
- "swallow",
- "swim",
- "tremble",
- "wheel",
- "won",
- "cast",
- "cigarette",
- "claim",
- "college",
- "direction",
- "dirty",
- "gather",
- "ghost",
- "hundred",
- "loss",
- "lung",
- "orange",
- "present",
- "swear",
- "swirl",
- "twice",
- "wild",
- "bitter",
- "blanket",
- "doctor",
- "everywhere",
- "flash",
- "grown",
- "knowledge",
- "numb",
- "pressure",
- "radio",
- "repeat",
- "ruin",
- "spend",
- "unknown",
- "buy",
- "clock",
- "devil",
- "early",
- "false",
- "fantasy",
- "pound",
- "precious",
- "refuse",
- "sheet",
- "teeth",
- "welcome",
- "add",
- "ahead",
- "block",
- "bury",
- "caress",
- "content",
- "depth",
- "despite",
- "distant",
- "marry",
- "purple",
- "threw",
- "whenever",
- "bomb",
- "dull",
- "easily",
- "grasp",
- "hospital",
- "innocence",
- "normal",
- "receive",
- "reply",
- "rhyme",
- "shade",
- "someday",
- "sword",
- "toe",
- "visit",
- "asleep",
- "bought",
- "center",
- "consider",
- "flat",
- "hero",
- "history",
- "ink",
- "insane",
- "muscle",
- "mystery",
- "pocket",
- "reflection",
- "shove",
- "silently",
- "smart",
- "soldier",
- "spot",
- "stress",
- "train",
- "type",
- "view",
- "whether",
- "bus",
- "energy",
- "explain",
- "holy",
- "hunger",
- "inch",
- "magic",
- "mix",
- "noise",
- "nowhere",
- "prayer",
- "presence",
- "shock",
- "snap",
- "spider",
- "study",
- "thunder",
- "trail",
- "admit",
- "agree",
- "bag",
- "bang",
- "bound",
- "butterfly",
- "cute",
- "exactly",
- "explode",
- "familiar",
- "fold",
- "further",
- "pierce",
- "reflect",
- "scent",
- "selfish",
- "sharp",
- "sink",
- "spring",
- "stumble",
- "universe",
- "weep",
- "women",
- "wonderful",
- "action",
- "ancient",
- "attempt",
- "avoid",
- "birthday",
- "branch",
- "chocolate",
- "core",
- "depress",
- "drunk",
- "especially",
- "focus",
- "fruit",
- "honest",
- "match",
- "palm",
- "perfectly",
- "pillow",
- "pity",
- "poison",
- "roar",
- "shift",
- "slightly",
- "thump",
- "truck",
- "tune",
- "twenty",
- "unable",
- "wipe",
- "wrote",
- "coat",
- "constant",
- "dinner",
- "drove",
- "egg",
- "eternal",
- "flight",
- "flood",
- "frame",
- "freak",
- "gasp",
- "glad",
- "hollow",
- "motion",
- "peer",
- "plastic",
- "root",
- "screen",
- "season",
- "sting",
- "strike",
- "team",
- "unlike",
- "victim",
- "volume",
- "warn",
- "weird",
- "attack",
- "await",
- "awake",
- "built",
- "charm",
- "crave",
- "despair",
- "fought",
- "grant",
- "grief",
- "horse",
- "limit",
- "message",
- "ripple",
- "sanity",
- "scatter",
- "serve",
- "split",
- "string",
- "trick",
- "annoy",
- "blur",
- "boat",
- "brave",
- "clearly",
- "cling",
- "connect",
- "fist",
- "forth",
- "imagination",
- "iron",
- "jock",
- "judge",
- "lesson",
- "milk",
- "misery",
- "nail",
- "naked",
- "ourselves",
- "poet",
- "possible",
- "princess",
- "sail",
- "size",
- "snake",
- "society",
- "stroke",
- "torture",
- "toss",
- "trace",
- "wise",
- "bloom",
- "bullet",
- "cell",
- "check",
- "cost",
- "darling",
- "during",
- "footstep",
- "fragile",
- "hallway",
- "hardly",
- "horizon",
- "invisible",
- "journey",
- "midnight",
- "mud",
- "nod",
- "pause",
- "relax",
- "shiver",
- "sudden",
- "value",
- "youth",
- "abuse",
- "admire",
- "blink",
- "breast",
- "bruise",
- "constantly",
- "couple",
- "creep",
- "curve",
- "difference",
- "dumb",
- "emptiness",
- "gotta",
- "honor",
- "plain",
- "planet",
- "recall",
- "rub",
- "ship",
- "slam",
- "soar",
- "somebody",
- "tightly",
- "weather",
- "adore",
- "approach",
- "bond",
- "bread",
- "burst",
- "candle",
- "coffee",
- "cousin",
- "crime",
- "desert",
- "flutter",
- "frozen",
- "grand",
- "heel",
- "hello",
- "language",
- "level",
- "movement",
- "pleasure",
- "powerful",
- "random",
- "rhythm",
- "settle",
- "silly",
- "slap",
- "sort",
- "spoken",
- "steel",
- "threaten",
- "tumble",
- "upset",
- "aside",
- "awkward",
- "bee",
- "blank",
- "board",
- "button",
- "card",
- "carefully",
- "complain",
- "crap",
- "deeply",
- "discover",
- "drag",
- "dread",
- "effort",
- "entire",
- "fairy",
- "giant",
- "gotten",
- "greet",
- "illusion",
- "jeans",
- "leap",
- "liquid",
- "march",
- "mend",
- "nervous",
- "nine",
- "replace",
- "rope",
- "spine",
- "stole",
- "terror",
- "accident",
- "apple",
- "balance",
- "boom",
- "childhood",
- "collect",
- "demand",
- "depression",
- "eventually",
- "faint",
- "glare",
- "goal",
- "group",
- "honey",
- "kitchen",
- "laid",
- "limb",
- "machine",
- "mere",
- "mold",
- "murder",
- "nerve",
- "painful",
- "poetry",
- "prince",
- "rabbit",
- "shelter",
- "shore",
- "shower",
- "soothe",
- "stair",
- "steady",
- "sunlight",
- "tangle",
- "tease",
- "treasure",
- "uncle",
- "begun",
- "bliss",
- "canvas",
- "cheer",
- "claw",
- "clutch",
- "commit",
- "crimson",
- "crystal",
- "delight",
- "doll",
- "existence",
- "express",
- "fog",
- "football",
- "gay",
- "goose",
- "guard",
- "hatred",
- "illuminate",
- "mass",
- "math",
- "mourn",
- "rich",
- "rough",
- "skip",
- "stir",
- "student",
- "style",
- "support",
- "thorn",
- "tough",
- "yard",
- "yearn",
- "yesterday",
- "advice",
- "appreciate",
- "autumn",
- "bank",
- "beam",
- "bowl",
- "capture",
- "carve",
- "collapse",
- "confusion",
- "creation",
- "dove",
- "feather",
- "girlfriend",
- "glory",
- "government",
- "harsh",
- "hop",
- "inner",
- "loser",
- "moonlight",
- "neighbor",
- "neither",
- "peach",
- "pig",
- "praise",
- "screw",
- "shield",
- "shimmer",
- "sneak",
- "stab",
- "subject",
- "throughout",
- "thrown",
- "tower",
- "twirl",
- "wow",
- "army",
- "arrive",
- "bathroom",
- "bump",
- "cease",
- "cookie",
- "couch",
- "courage",
- "dim",
- "guilt",
- "howl",
- "hum",
- "husband",
- "insult",
- "led",
- "lunch",
- "mock",
- "mostly",
- "natural",
- "nearly",
- "needle",
- "nerd",
- "peaceful",
- "perfection",
- "pile",
- "price",
- "remove",
- "roam",
- "sanctuary",
- "serious",
- "shiny",
- "shook",
- "sob",
- "stolen",
- "tap",
- "vain",
- "void",
- "warrior",
- "wrinkle",
- "affection",
- "apologize",
- "blossom",
- "bounce",
- "bridge",
- "cheap",
- "crumble",
- "decision",
- "descend",
- "desperately",
- "dig",
- "dot",
- "flip",
- "frighten",
- "heartbeat",
- "huge",
- "lazy",
- "lick",
- "odd",
- "opinion",
- "process",
- "puzzle",
- "quietly",
- "retreat",
- "score",
- "sentence",
- "separate",
- "situation",
- "skill",
- "soak",
- "square",
- "stray",
- "taint",
- "task",
- "tide",
- "underneath",
- "veil",
- "whistle",
- "anywhere",
- "bedroom",
- "bid",
- "bloody",
- "burden",
- "careful",
- "compare",
- "concern",
- "curtain",
- "decay",
- "defeat",
- "describe",
- "double",
- "dreamer",
- "driver",
- "dwell",
- "evening",
- "flare",
- "flicker",
- "grandma",
- "guitar",
- "harm",
- "horrible",
- "hungry",
- "indeed",
- "lace",
- "melody",
- "monkey",
- "nation",
- "object",
- "obviously",
- "rainbow",
- "salt",
- "scratch",
- "shown",
- "shy",
- "stage",
- "stun",
- "third",
- "tickle",
- "useless",
- "weakness",
- "worship",
- "worthless",
- "afternoon",
- "beard",
- "boyfriend",
- "bubble",
- "busy",
- "certain",
- "chin",
- "concrete",
- "desk",
- "diamond",
- "doom",
- "drawn",
- "due",
- "felicity",
- "freeze",
- "frost",
- "garden",
- "glide",
- "harmony",
- "hopefully",
- "hunt",
- "jealous",
- "lightning",
- "mama",
- "mercy",
- "peel",
- "physical",
- "position",
- "pulse",
- "punch",
- "quit",
- "rant",
- "respond",
- "salty",
- "sane",
- "satisfy",
- "savior",
- "sheep",
- "slept",
- "social",
- "sport",
- "tuck",
- "utter",
- "valley",
- "wolf",
- "aim",
- "alas",
- "alter",
- "arrow",
- "awaken",
- "beaten",
- "belief",
- "brand",
- "ceiling",
- "cheese",
- "clue",
- "confidence",
- "connection",
- "daily",
- "disguise",
- "eager",
- "erase",
- "essence",
- "everytime",
- "expression",
- "fan",
- "flag",
- "flirt",
- "foul",
- "fur",
- "giggle",
- "glorious",
- "ignorance",
- "law",
- "lifeless",
- "measure",
- "mighty",
- "muse",
- "north",
- "opposite",
- "paradise",
- "patience",
- "patient",
- "pencil",
- "petal",
- "plate",
- "ponder",
- "possibly",
- "practice",
- "slice",
- "spell",
- "stock",
- "strife",
- "strip",
- "suffocate",
- "suit",
- "tender",
- "tool",
- "trade",
- "velvet",
- "verse",
- "waist",
- "witch",
- "aunt",
- "bench",
- "bold",
- "cap",
- "certainly",
- "click",
- "companion",
- "creator",
- "dart",
- "delicate",
- "determine",
- "dish",
- "dragon",
- "drama",
- "drum",
- "dude",
- "everybody",
- "feast",
- "forehead",
- "former",
- "fright",
- "fully",
- "gas",
- "hook",
- "hurl",
- "invite",
- "juice",
- "manage",
- "moral",
- "possess",
- "raw",
- "rebel",
- "royal",
- "scale",
- "scary",
- "several",
- "slight",
- "stubborn",
- "swell",
- "talent",
- "tea",
- "terrible",
- "thread",
- "torment",
- "trickle",
- "usually",
- "vast",
- "violence",
- "weave",
- "acid",
- "agony",
- "ashamed",
- "awe",
- "belly",
- "blend",
- "blush",
- "character",
- "cheat",
- "common",
- "company",
- "coward",
- "creak",
- "danger",
- "deadly",
- "defense",
- "define",
- "depend",
- "desperate",
- "destination",
- "dew",
- "duck",
- "dusty",
- "embarrass",
- "engine",
- "example",
- "explore",
- "foe",
- "freely",
- "frustrate",
- "generation",
- "glove",
- "guilty",
- "health",
- "hurry",
- "idiot",
- "impossible",
- "inhale",
- "jaw",
- "kingdom",
- "mention",
- "mist",
- "moan",
- "mumble",
- "mutter",
- "observe",
- "ode",
- "pathetic",
- "pattern",
- "pie",
- "prefer",
- "puff",
- "rape",
- "rare",
- "revenge",
- "rude",
- "scrape",
- "spiral",
- "squeeze",
- "strain",
- "sunset",
- "suspend",
- "sympathy",
- "thigh",
- "throne",
- "total",
- "unseen",
- "weapon",
- "weary"
- };
- }
-}
diff --git a/src/mnemonics/electrum-words.cpp b/src/mnemonics/electrum-words.cpp
new file mode 100644
index 000000000..b204e81cf
--- /dev/null
+++ b/src/mnemonics/electrum-words.cpp
@@ -0,0 +1,375 @@
+// Copyright (c) 2014, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*!
+ * \file electrum-words.cpp
+ *
+ * \brief Mnemonic seed generation and wallet restoration from them.
+ *
+ * This file and its header file are for translating Electrum-style word lists
+ * into their equivalent byte representations for cross-compatibility with
+ * that method of "backing up" one's wallet keys.
+ */
+
+#include <string>
+#include <cassert>
+#include <map>
+#include <cstdint>
+#include <vector>
+#include <unordered_map>
+#include <boost/algorithm/string.hpp>
+#include "crypto/crypto.h" // for declaration of crypto::secret_key
+#include <fstream>
+#include "mnemonics/electrum-words.h"
+#include <stdexcept>
+#include <boost/filesystem.hpp>
+#include <boost/crc.hpp>
+#include <boost/algorithm/string/join.hpp>
+
+#include "english.h"
+#include "spanish.h"
+#include "portuguese.h"
+#include "japanese.h"
+#include "old_english.h"
+#include "language_base.h"
+#include "singleton.h"
+
+namespace
+{
+ const int seed_length = 24;
+
+ /*!
+ * \brief Finds the word list that contains the seed words and puts the indices
+ * where matches occured in matched_indices.
+ * \param seed List of words to match.
+ * \param has_checksum If word list passed checksum test, we need to only do a prefix check.
+ * \param matched_indices The indices where the seed words were found are added to this.
+ * \return true if all the words were present in some language false if not.
+ */
+ bool find_seed_language(const std::vector<std::string> &seed,
+ bool has_checksum, std::vector<uint32_t> &matched_indices, uint32_t &word_list_length,
+ std::string &language_name)
+ {
+ // If there's a new language added, add an instance of it here.
+ std::vector<Language::Base*> language_instances({
+ Language::Singleton<Language::English>::instance(),
+ Language::Singleton<Language::Spanish>::instance(),
+ Language::Singleton<Language::Portuguese>::instance(),
+ Language::Singleton<Language::Japanese>::instance(),
+ Language::Singleton<Language::OldEnglish>::instance()
+ });
+ // To hold trimmed seed words in case of a checksum being present.
+ std::vector<std::string> trimmed_seed;
+ if (has_checksum)
+ {
+ // If it had a checksum, we'll just compare the unique prefix
+ // So we create a list of trimmed seed words
+ for (std::vector<std::string>::const_iterator it = seed.begin(); it != seed.end(); it++)
+ {
+ trimmed_seed.push_back(it->length() > Language::unique_prefix_length ?
+ it->substr(0, Language::unique_prefix_length) : *it);
+ }
+ }
+
+ // Iterate through all the languages and find a match
+ for (std::vector<Language::Base*>::iterator it1 = language_instances.begin();
+ it1 != language_instances.end(); it1++)
+ {
+ const std::unordered_map<std::string, uint32_t> &word_map = (*it1)->get_word_map();
+ const std::unordered_map<std::string, uint32_t> &trimmed_word_map = (*it1)->get_trimmed_word_map();
+ // To iterate through seed words
+ std::vector<std::string>::const_iterator it2;
+ // To iterate through trimmed seed words
+ std::vector<std::string>::iterator it3;
+ bool full_match = true;
+
+ // Iterate through all the words and see if they're all present
+ for (it2 = seed.begin(), it3 = trimmed_seed.begin();
+ it2 != seed.end(); it2++, it3++)
+ {
+ if (has_checksum)
+ {
+ // Use the trimmed words and map
+ if (trimmed_word_map.count(*it3) == 0)
+ {
+ full_match = false;
+ break;
+ }
+ matched_indices.push_back(trimmed_word_map.at(*it3));
+ }
+ else
+ {
+ if (word_map.count(*it2) == 0)
+ {
+ full_match = false;
+ break;
+ }
+ matched_indices.push_back(word_map.at(*it2));
+ }
+ }
+ if (full_match)
+ {
+ word_list_length = (*it1)->get_word_list().size();
+ language_name = (*it1)->get_language_name();
+ return true;
+ }
+ // Some didn't match. Clear the index array.
+ matched_indices.clear();
+ }
+ return false;
+ }
+
+ /*!
+ * \brief Creates a checksum index in the word list array on the list of words.
+ * \param word_list Vector of words
+ * \return Checksum index
+ */
+ uint32_t create_checksum_index(const std::vector<std::string> &word_list)
+ {
+ std::string trimmed_words = "";
+
+ for (std::vector<std::string>::const_iterator it = word_list.begin(); it != word_list.end(); it++)
+ {
+ if (it->length() > 4)
+ {
+ trimmed_words += it->substr(0, Language::unique_prefix_length);
+ }
+ else
+ {
+ trimmed_words += *it;
+ }
+ }
+ boost::crc_32_type result;
+ result.process_bytes(trimmed_words.data(), trimmed_words.length());
+ return result.checksum() % seed_length;
+ }
+
+ /*!
+ * \brief Does the checksum test on the seed passed.
+ * \param seed Vector of seed words
+ * \return True if the test passed false if not.
+ */
+ bool checksum_test(std::vector<std::string> seed)
+ {
+ // The last word is the checksum.
+ std::string last_word = seed.back();
+ seed.pop_back();
+
+ std::string checksum = seed[create_checksum_index(seed)];
+
+ std::string trimmed_checksum = checksum.length() > 4 ? checksum.substr(0, Language::unique_prefix_length) :
+ checksum;
+ std::string trimmed_last_word = checksum.length() > 4 ? last_word.substr(0, Language::unique_prefix_length) :
+ last_word;
+ return trimmed_checksum == trimmed_last_word;
+ }
+}
+
+/*!
+ * \namespace crypto
+ *
+ * \brief crypto namespace.
+ */
+namespace crypto
+{
+ /*!
+ * \namespace crypto::ElectrumWords
+ *
+ * \brief Mnemonic seed word generation and wallet restoration helper functions.
+ */
+ namespace ElectrumWords
+ {
+ /*!
+ * \brief Converts seed words to bytes (secret key).
+ * \param words String containing the words separated by spaces.
+ * \param dst To put the secret key restored from the words.
+ * \param language_name Language of the seed as found gets written here.
+ * \return false if not a multiple of 3 words, or if word is not in the words list
+ */
+ bool words_to_bytes(const std::string& words, crypto::secret_key& dst,
+ std::string &language_name)
+ {
+ std::vector<std::string> seed;
+
+ boost::split(seed, words, boost::is_any_of(" "));
+
+ // error on non-compliant word list
+ if (seed.size() != seed_length/2 && seed.size() != seed_length &&
+ seed.size() != seed_length + 1)
+ {
+ return false;
+ }
+
+ // If it is seed with a checksum.
+ bool has_checksum = seed.size() == (seed_length + 1);
+ if (has_checksum)
+ {
+ if (!checksum_test(seed))
+ {
+ // Checksum fail
+ return false;
+ }
+ seed.pop_back();
+ }
+
+ std::vector<uint32_t> matched_indices;
+ uint32_t word_list_length = 0;
+ if (!find_seed_language(seed, has_checksum, matched_indices, word_list_length, language_name))
+ {
+ return false;
+ }
+
+ for (unsigned int i=0; i < seed.size() / 3; i++)
+ {
+ uint32_t val;
+ uint32_t w1, w2, w3;
+ w1 = matched_indices[i*3];
+ w2 = matched_indices[i*3 + 1];
+ w3 = matched_indices[i*3 + 2];
+
+ val = w1 + word_list_length * (((word_list_length - w1) + w2) % word_list_length) +
+ word_list_length * word_list_length * (((word_list_length - w2) + w3) % word_list_length);
+
+ if (!(val % word_list_length == w1)) return false;
+
+ memcpy(dst.data + i * 4, &val, 4); // copy 4 bytes to position
+ }
+
+ std::string wlist_copy = words;
+ if (seed.size() == seed_length/2)
+ {
+ memcpy(dst.data, dst.data + 16, 16); // if electrum 12-word seed, duplicate
+ wlist_copy += ' ';
+ wlist_copy += words;
+ }
+
+ return true;
+ }
+
+ /*!
+ * \brief Converts bytes (secret key) to seed words.
+ * \param src Secret key
+ * \param words Space delimited concatenated words get written here.
+ * \param language_name Seed language name
+ * \return true if successful false if not. Unsuccessful if wrong key size.
+ */
+ bool bytes_to_words(const crypto::secret_key& src, std::string& words,
+ const std::string &language_name)
+ {
+
+ if (sizeof(src.data) % 4 != 0 || sizeof(src.data) == 0) return false;
+
+ Language::Base *language;
+ if (language_name == "English")
+ {
+ language = Language::Singleton<Language::English>::instance();
+ }
+ else if (language_name == "Spanish")
+ {
+ language = Language::Singleton<Language::Spanish>::instance();
+ }
+ else if (language_name == "Portuguese")
+ {
+ language = Language::Singleton<Language::Portuguese>::instance();
+ }
+ else if (language_name == "Japanese")
+ {
+ language = Language::Singleton<Language::Japanese>::instance();
+ }
+ else
+ {
+ return false;
+ }
+ const std::vector<std::string> &word_list = language->get_word_list();
+ // To store the words for random access to add the checksum word later.
+ std::vector<std::string> words_store;
+
+ uint32_t word_list_length = word_list.size();
+ // 8 bytes -> 3 words. 8 digits base 16 -> 3 digits base 1626
+ for (unsigned int i=0; i < sizeof(src.data)/4; i++, words += ' ')
+ {
+ uint32_t w1, w2, w3;
+
+ uint32_t val;
+
+ memcpy(&val, (src.data) + (i * 4), 4);
+
+ w1 = val % word_list_length;
+ w2 = ((val / word_list_length) + w1) % word_list_length;
+ w3 = (((val / word_list_length) / word_list_length) + w2) % word_list_length;
+
+ words += word_list[w1];
+ words += ' ';
+ words += word_list[w2];
+ words += ' ';
+ words += word_list[w3];
+
+ words_store.push_back(word_list[w1]);
+ words_store.push_back(word_list[w2]);
+ words_store.push_back(word_list[w3]);
+ }
+
+ words.pop_back();
+ words += (' ' + words_store[create_checksum_index(words_store)]);
+ return false;
+ }
+
+ /*!
+ * \brief Gets a list of seed languages that are supported.
+ * \param languages The vector is set to the list of languages.
+ */
+ void get_language_list(std::vector<std::string> &languages)
+ {
+ std::vector<Language::Base*> language_instances({
+ Language::Singleton<Language::English>::instance(),
+ Language::Singleton<Language::Spanish>::instance(),
+ Language::Singleton<Language::Portuguese>::instance(),
+ Language::Singleton<Language::Japanese>::instance()
+ });
+ for (std::vector<Language::Base*>::iterator it = language_instances.begin();
+ it != language_instances.end(); it++)
+ {
+ languages.push_back((*it)->get_language_name());
+ }
+ }
+
+ /*!
+ * \brief Tells if the seed passed is an old style seed or not.
+ * \param seed The seed to check (a space delimited concatenated word list)
+ * \return true if the seed passed is a old style seed false if not.
+ */
+ bool get_is_old_style_seed(const std::string &seed)
+ {
+ std::vector<std::string> word_list;
+ boost::split(word_list, seed, boost::is_any_of(" "));
+ return word_list.size() != (seed_length + 1);
+ }
+
+ }
+
+}
diff --git a/src/mnemonics/electrum-words.h b/src/mnemonics/electrum-words.h
new file mode 100644
index 000000000..b822e7740
--- /dev/null
+++ b/src/mnemonics/electrum-words.h
@@ -0,0 +1,98 @@
+// Copyright (c) 2014, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*!
+ * \file electrum-words.h
+ *
+ * \brief Mnemonic seed generation and wallet restoration from them.
+ *
+ * This file and its cpp file are for translating Electrum-style word lists
+ * into their equivalent byte representations for cross-compatibility with
+ * that method of "backing up" one's wallet keys.
+ */
+
+#ifndef ELECTRUM_WORDS_H
+#define ELECTRUM_WORDS_H
+
+#include <string>
+#include <cstdint>
+#include <map>
+#include "crypto/crypto.h" // for declaration of crypto::secret_key
+
+/*!
+ * \namespace crypto
+ *
+ * \brief crypto namespace.
+ */
+namespace crypto
+{
+ /*!
+ * \namespace crypto::ElectrumWords
+ *
+ * \brief Mnemonic seed word generation and wallet restoration helper functions.
+ */
+ namespace ElectrumWords
+ {
+
+ const std::string old_language_name = "OldEnglish";
+ /*!
+ * \brief Converts seed words to bytes (secret key).
+ * \param words String containing the words separated by spaces.
+ * \param dst To put the secret key restored from the words.
+ * \param language_name Language of the seed as found gets written here.
+ * \return false if not a multiple of 3 words, or if word is not in the words list
+ */
+ bool words_to_bytes(const std::string& words, crypto::secret_key& dst,
+ std::string &language_name);
+
+ /*!
+ * \brief Converts bytes (secret key) to seed words.
+ * \param src Secret key
+ * \param words Space delimited concatenated words get written here.
+ * \param language_name Seed language name
+ * \return true if successful false if not. Unsuccessful if wrong key size.
+ */
+ bool bytes_to_words(const crypto::secret_key& src, std::string& words,
+ const std::string &language_name);
+
+ /*!
+ * \brief Gets a list of seed languages that are supported.
+ * \param languages A vector is set to the list of languages.
+ */
+ void get_language_list(std::vector<std::string> &languages);
+
+ /*!
+ * \brief Tells if the seed passed is an old style seed or not.
+ * \param seed The seed to check (a space delimited concatenated word list)
+ * \return true if the seed passed is a old style seed false if not.
+ */
+ bool get_is_old_style_seed(const std::string &seed);
+ }
+}
+
+#endif
diff --git a/src/mnemonics/english.h b/src/mnemonics/english.h
new file mode 100644
index 000000000..604228a8f
--- /dev/null
+++ b/src/mnemonics/english.h
@@ -0,0 +1,1692 @@
+// Word list originally created as part of the Electrum project, Copyright (C) 2014 Thomas Voegtlin
+//
+// Copyright (c) 2014, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*!
+ * \file english.h
+ *
+ * \brief New English word list and map.
+ */
+
+#ifndef ENGLISH_H
+#define ENGLISH_H
+
+#include <vector>
+#include <unordered_map>
+#include "language_base.h"
+#include <string>
+
+/*!
+ * \namespace Language
+ * \brief Mnemonic language related namespace.
+ */
+namespace Language
+{
+ class English: public Base
+ {
+ public:
+ English()
+ {
+ word_list = new std::vector<std::string>({
+ "abbey",
+ "abducts",
+ "ability",
+ "ablaze",
+ "abnormal",
+ "abort",
+ "abrasive",
+ "absorb",
+ "abyss",
+ "academy",
+ "aces",
+ "aching",
+ "acidic",
+ "acoustic",
+ "acquire",
+ "across",
+ "actress",
+ "acumen",
+ "adapt",
+ "addicted",
+ "adept",
+ "adhesive",
+ "adjust",
+ "adopt",
+ "adrenalin",
+ "adult",
+ "adventure",
+ "aerial",
+ "afar",
+ "affair",
+ "afield",
+ "afloat",
+ "afoot",
+ "afraid",
+ "after",
+ "against",
+ "agenda",
+ "aggravate",
+ "agile",
+ "aglow",
+ "agnostic",
+ "agony",
+ "agreed",
+ "ahead",
+ "aided",
+ "ailments",
+ "aimless",
+ "airdry",
+ "aisle",
+ "ajar",
+ "akin",
+ "alarms",
+ "album",
+ "alchemy",
+ "alerts",
+ "algebra",
+ "alkaline",
+ "alley",
+ "almost",
+ "aloof",
+ "alpine",
+ "alright",
+ "also",
+ "altitude",
+ "alumni",
+ "always",
+ "amaze",
+ "ambush",
+ "amended",
+ "amidst",
+ "ammo",
+ "amnesty",
+ "among",
+ "amply",
+ "amused",
+ "anchor",
+ "android",
+ "anecdote",
+ "angled",
+ "ankle",
+ "annoyed",
+ "answers",
+ "antics",
+ "anvil",
+ "anxiety",
+ "anybody",
+ "apart",
+ "apex",
+ "aphid",
+ "aplomb",
+ "apology",
+ "apply",
+ "apricot",
+ "aptitude",
+ "aquarium",
+ "arbitrary",
+ "archer",
+ "ardent",
+ "arena",
+ "argue",
+ "arises",
+ "army",
+ "around",
+ "arrow",
+ "arsenic",
+ "artistic",
+ "ascend",
+ "ashtray",
+ "aside",
+ "asked",
+ "asleep",
+ "aspire",
+ "assorted",
+ "asylum",
+ "athlete",
+ "atlas",
+ "atom",
+ "atriums",
+ "attire",
+ "auburn",
+ "auctions",
+ "audio",
+ "august",
+ "aunt",
+ "austere",
+ "autumn",
+ "avatar",
+ "avidly",
+ "avoid",
+ "awakened",
+ "awesome",
+ "awful",
+ "awkward",
+ "awning",
+ "awoken",
+ "axes",
+ "axis",
+ "axle",
+ "aztec",
+ "azure",
+ "baby",
+ "bacon",
+ "badge",
+ "baffles",
+ "bagpipe",
+ "bailed",
+ "bakery",
+ "balding",
+ "bamboo",
+ "banjo",
+ "baptism",
+ "basin",
+ "batch",
+ "bawled",
+ "bays",
+ "because",
+ "beer",
+ "befit",
+ "begun",
+ "behind",
+ "being",
+ "below",
+ "bemused",
+ "benches",
+ "berries",
+ "bested",
+ "betting",
+ "bevel",
+ "beware",
+ "beyond",
+ "bias",
+ "bicycle",
+ "bids",
+ "bifocals",
+ "biggest",
+ "bikini",
+ "bimonthly",
+ "binocular",
+ "biology",
+ "biplane",
+ "birth",
+ "biscuit",
+ "bite",
+ "biweekly",
+ "blender",
+ "blip",
+ "bluntly",
+ "boat",
+ "bobsled",
+ "bodies",
+ "bogeys",
+ "boil",
+ "boldly",
+ "bomb",
+ "border",
+ "boss",
+ "both",
+ "bounced",
+ "bovine",
+ "bowling",
+ "boxes",
+ "boyfriend",
+ "broken",
+ "brunt",
+ "bubble",
+ "buckets",
+ "budget",
+ "buffet",
+ "bugs",
+ "building",
+ "bulb",
+ "bumper",
+ "bunch",
+ "business",
+ "butter",
+ "buying",
+ "buzzer",
+ "bygones",
+ "byline",
+ "bypass",
+ "cabin",
+ "cactus",
+ "cadets",
+ "cafe",
+ "cage",
+ "cajun",
+ "cake",
+ "calamity",
+ "camp",
+ "candy",
+ "casket",
+ "catch",
+ "cause",
+ "cavernous",
+ "cease",
+ "cedar",
+ "ceiling",
+ "cell",
+ "cement",
+ "cent",
+ "certain",
+ "chlorine",
+ "chrome",
+ "cider",
+ "cigar",
+ "cinema",
+ "circle",
+ "cistern",
+ "citadel",
+ "civilian",
+ "claim",
+ "click",
+ "clue",
+ "coal",
+ "cobra",
+ "cocoa",
+ "code",
+ "coexist",
+ "coffee",
+ "cogs",
+ "cohesive",
+ "coils",
+ "colony",
+ "comb",
+ "cool",
+ "copy",
+ "costume",
+ "cottage",
+ "cousin",
+ "cowl",
+ "cozy",
+ "criminal",
+ "cube",
+ "cucumber",
+ "cuddled",
+ "cuffs",
+ "cuisine",
+ "cunning",
+ "cupcake",
+ "custom",
+ "cycling",
+ "cylinder",
+ "cynical",
+ "dabbing",
+ "dads",
+ "daft",
+ "dagger",
+ "daily",
+ "damp",
+ "dangerous",
+ "dapper",
+ "darted",
+ "dash",
+ "dating",
+ "dauntless",
+ "dawn",
+ "daytime",
+ "dazed",
+ "debut",
+ "decay",
+ "dedicated",
+ "deepest",
+ "deftly",
+ "degrees",
+ "dehydrate",
+ "deity",
+ "dejected",
+ "delayed",
+ "demonstrate",
+ "dented",
+ "deodorant",
+ "depth",
+ "desk",
+ "devoid",
+ "dewdrop",
+ "dexterity",
+ "dialect",
+ "dice",
+ "diet",
+ "different",
+ "digit",
+ "dilute",
+ "dime",
+ "dinner",
+ "diode",
+ "diplomat",
+ "directed",
+ "distance",
+ "ditch",
+ "divers",
+ "dizzy",
+ "doctor",
+ "dodge",
+ "does",
+ "dogs",
+ "doing",
+ "dolphin",
+ "domestic",
+ "donuts",
+ "doorway",
+ "dormant",
+ "dosage",
+ "dotted",
+ "double",
+ "dove",
+ "down",
+ "dozen",
+ "dreams",
+ "drinks",
+ "drowning",
+ "drunk",
+ "drying",
+ "dual",
+ "dubbed",
+ "duckling",
+ "dude",
+ "duets",
+ "duke",
+ "dullness",
+ "dummy",
+ "dunes",
+ "duplex",
+ "duration",
+ "dusted",
+ "duties",
+ "dwarf",
+ "dwelt",
+ "dwindling",
+ "dying",
+ "dynamite",
+ "dyslexic",
+ "each",
+ "eagle",
+ "earth",
+ "easy",
+ "eating",
+ "eavesdrop",
+ "eccentric",
+ "echo",
+ "eclipse",
+ "economics",
+ "ecstatic",
+ "eden",
+ "edgy",
+ "edited",
+ "educated",
+ "eels",
+ "efficient",
+ "eggs",
+ "egotistic",
+ "eight",
+ "either",
+ "eject",
+ "elapse",
+ "elbow",
+ "eldest",
+ "eleven",
+ "elite",
+ "elope",
+ "else",
+ "eluded",
+ "emails",
+ "ember",
+ "emerge",
+ "emit",
+ "emotion",
+ "empty",
+ "emulate",
+ "energy",
+ "enforce",
+ "enhanced",
+ "enigma",
+ "enjoy",
+ "enlist",
+ "enmity",
+ "enough",
+ "enquiry",
+ "enraged",
+ "entrance",
+ "envy",
+ "epoxy",
+ "equip",
+ "erase",
+ "erected",
+ "erosion",
+ "error",
+ "eskimos",
+ "espionage",
+ "essential",
+ "estate",
+ "etched",
+ "eternal",
+ "ethics",
+ "etiquette",
+ "evaluate",
+ "evenings",
+ "evicted",
+ "evolved",
+ "examine",
+ "excess",
+ "exhale",
+ "exit",
+ "exotic",
+ "exquisite",
+ "extra",
+ "exult",
+ "fabrics",
+ "factual",
+ "fading",
+ "fainted",
+ "faked",
+ "fall",
+ "family",
+ "fancy",
+ "farming",
+ "fatal",
+ "faulty",
+ "fawns",
+ "faxed",
+ "fazed",
+ "feast",
+ "february",
+ "federal",
+ "feel",
+ "feline",
+ "females",
+ "fences",
+ "ferry",
+ "festival",
+ "fetches",
+ "fever",
+ "fewest",
+ "fiat",
+ "fibers",
+ "fictional",
+ "fidget",
+ "fierce",
+ "fifteen",
+ "fight",
+ "films",
+ "firm",
+ "fishing",
+ "fitting",
+ "five",
+ "fixate",
+ "fizzle",
+ "fleet",
+ "flippant",
+ "flying",
+ "foamy",
+ "focus",
+ "foes",
+ "foggy",
+ "foiled",
+ "folding",
+ "fonts",
+ "foolish",
+ "fossil",
+ "fountain",
+ "fowls",
+ "foxes",
+ "foyer",
+ "framed",
+ "friendly",
+ "frown",
+ "fruit",
+ "frying",
+ "fudge",
+ "fuel",
+ "fugitive",
+ "fully",
+ "fuming",
+ "fungal",
+ "furnished",
+ "fuselage",
+ "future",
+ "fuzzy",
+ "gables",
+ "gadget",
+ "gags",
+ "gained",
+ "galaxy",
+ "gambit",
+ "gang",
+ "gasp",
+ "gather",
+ "gauze",
+ "gave",
+ "gawk",
+ "gaze",
+ "gearbox",
+ "gecko",
+ "geek",
+ "gels",
+ "gemstone",
+ "general",
+ "geometry",
+ "germs",
+ "gesture",
+ "getting",
+ "geyser",
+ "ghetto",
+ "ghost",
+ "giant",
+ "giddy",
+ "gifts",
+ "gigantic",
+ "gills",
+ "gimmick",
+ "ginger",
+ "girth",
+ "giving",
+ "glass",
+ "gleeful",
+ "glide",
+ "gnaw",
+ "gnome",
+ "goat",
+ "goblet",
+ "godfather",
+ "goes",
+ "goggles",
+ "going",
+ "goldfish",
+ "gone",
+ "goodbye",
+ "gopher",
+ "gorilla",
+ "gossip",
+ "gotten",
+ "gourmet",
+ "governing",
+ "gown",
+ "greater",
+ "grunt",
+ "guarded",
+ "guest",
+ "guide",
+ "gulp",
+ "gumball",
+ "guru",
+ "gusts",
+ "gutter",
+ "guys",
+ "gymnast",
+ "gypsy",
+ "gyrate",
+ "habitat",
+ "hacksaw",
+ "haggled",
+ "hairy",
+ "hamburger",
+ "happens",
+ "hashing",
+ "hatchet",
+ "haunted",
+ "having",
+ "hawk",
+ "haystack",
+ "hazard",
+ "hectare",
+ "hedgehog",
+ "heels",
+ "hefty",
+ "height",
+ "hemlock",
+ "hence",
+ "heron",
+ "hesitate",
+ "hexagon",
+ "hiccups",
+ "hiding",
+ "highway",
+ "hijack",
+ "hiker",
+ "hills",
+ "himself",
+ "hinder",
+ "hippo",
+ "hire",
+ "history",
+ "hitched",
+ "hive",
+ "hoax",
+ "hobby",
+ "hockey",
+ "hoisting",
+ "hold",
+ "honked",
+ "hookup",
+ "hope",
+ "hornet",
+ "hospital",
+ "hotel",
+ "hounded",
+ "hover",
+ "howls",
+ "hubcaps",
+ "huddle",
+ "huge",
+ "hull",
+ "humid",
+ "hunter",
+ "hurried",
+ "husband",
+ "huts",
+ "hybrid",
+ "hydrogen",
+ "hyper",
+ "iceberg",
+ "icing",
+ "icon",
+ "identity",
+ "idiom",
+ "idled",
+ "idols",
+ "igloo",
+ "ignore",
+ "iguana",
+ "illness",
+ "imagine",
+ "imbalance",
+ "imitate",
+ "impel",
+ "inactive",
+ "inbound",
+ "incur",
+ "industrial",
+ "inexact",
+ "inflamed",
+ "ingested",
+ "initiate",
+ "injury",
+ "inkling",
+ "inline",
+ "inmate",
+ "innocent",
+ "inorganic",
+ "input",
+ "inquest",
+ "inroads",
+ "insult",
+ "intended",
+ "inundate",
+ "invoke",
+ "inwardly",
+ "ionic",
+ "irate",
+ "iris",
+ "irony",
+ "irritate",
+ "island",
+ "isolated",
+ "issued",
+ "italics",
+ "itches",
+ "items",
+ "itinerary",
+ "itself",
+ "ivory",
+ "jabbed",
+ "jackets",
+ "jaded",
+ "jagged",
+ "jailer",
+ "jamming",
+ "january",
+ "jargon",
+ "jaunt",
+ "javelin",
+ "jaws",
+ "jazz",
+ "jeans",
+ "jeers",
+ "jellyfish",
+ "jeopardy",
+ "jerseys",
+ "jester",
+ "jetting",
+ "jewels",
+ "jigsaw",
+ "jingle",
+ "jittery",
+ "jive",
+ "jobs",
+ "jockey",
+ "jogger",
+ "joining",
+ "joking",
+ "jolted",
+ "jostle",
+ "journal",
+ "joyous",
+ "jubilee",
+ "judge",
+ "juggled",
+ "juicy",
+ "jukebox",
+ "july",
+ "jump",
+ "junk",
+ "jury",
+ "justice",
+ "juvenile",
+ "kangaroo",
+ "karate",
+ "keep",
+ "kennel",
+ "kept",
+ "kernels",
+ "kettle",
+ "keyboard",
+ "kickoff",
+ "kidneys",
+ "king",
+ "kiosk",
+ "kisses",
+ "kitchens",
+ "kiwi",
+ "knapsack",
+ "knee",
+ "knife",
+ "knowledge",
+ "knuckle",
+ "koala",
+ "laboratory",
+ "ladder",
+ "lagoon",
+ "lair",
+ "lakes",
+ "lamb",
+ "language",
+ "laptop",
+ "large",
+ "last",
+ "later",
+ "launchpad",
+ "lava",
+ "lawsuit",
+ "layout",
+ "lazy",
+ "lectures",
+ "ledge",
+ "leech",
+ "left",
+ "legion",
+ "leisure",
+ "lemon",
+ "lending",
+ "leopard",
+ "lesson",
+ "lettuce",
+ "lexicon",
+ "liar",
+ "library",
+ "license",
+ "lids",
+ "lied",
+ "lifestyle",
+ "light",
+ "likewise",
+ "lilac",
+ "limits",
+ "linen",
+ "lion",
+ "lipstick",
+ "liquid",
+ "listen",
+ "lively",
+ "loaded",
+ "lobster",
+ "locker",
+ "lodge",
+ "lofty",
+ "logic",
+ "loincloth",
+ "long",
+ "looking",
+ "lopped",
+ "lordship",
+ "losing",
+ "lottery",
+ "loudly",
+ "love",
+ "lower",
+ "loyal",
+ "lucky",
+ "luggage",
+ "lukewarm",
+ "lullaby",
+ "lumber",
+ "lunar",
+ "lurk",
+ "lush",
+ "luxury",
+ "lymph",
+ "lynx",
+ "lyrics",
+ "macro",
+ "madness",
+ "magically",
+ "mailed",
+ "major",
+ "makeup",
+ "malady",
+ "mammal",
+ "maps",
+ "masterful",
+ "match",
+ "maul",
+ "maverick",
+ "maximum",
+ "mayor",
+ "maze",
+ "meant",
+ "mechanic",
+ "medicate",
+ "meeting",
+ "megabyte",
+ "melting",
+ "memoir",
+ "menu",
+ "merger",
+ "mesh",
+ "metro",
+ "mews",
+ "mice",
+ "midst",
+ "mighty",
+ "mime",
+ "mirror",
+ "misery",
+ "mittens",
+ "mixture",
+ "moat",
+ "mobile",
+ "mocked",
+ "mohawk",
+ "moisture",
+ "molten",
+ "moment",
+ "money",
+ "moon",
+ "mops",
+ "morsel",
+ "mostly",
+ "motherly",
+ "mouth",
+ "movement",
+ "mowing",
+ "much",
+ "muddy",
+ "muffin",
+ "mugged",
+ "mullet",
+ "mumble",
+ "mundane",
+ "muppet",
+ "mural",
+ "musical",
+ "muzzle",
+ "myriad",
+ "mystery",
+ "myth",
+ "nabbing",
+ "nagged",
+ "nail",
+ "names",
+ "nanny",
+ "napkin",
+ "narrate",
+ "nasty",
+ "natural",
+ "nautical",
+ "navy",
+ "nearby",
+ "necklace",
+ "needed",
+ "negative",
+ "neither",
+ "neon",
+ "nephew",
+ "nerves",
+ "nestle",
+ "network",
+ "neutral",
+ "never",
+ "newt",
+ "nexus",
+ "nibs",
+ "niche",
+ "niece",
+ "nifty",
+ "nightly",
+ "nimbly",
+ "nineteen",
+ "nirvana",
+ "nitrogen",
+ "nobody",
+ "nocturnal",
+ "nodes",
+ "noises",
+ "nomad",
+ "noodles",
+ "northern",
+ "nostril",
+ "noted",
+ "nouns",
+ "novelty",
+ "nowhere",
+ "nozzle",
+ "nuance",
+ "nucleus",
+ "nudged",
+ "nugget",
+ "nuisance",
+ "null",
+ "number",
+ "nuns",
+ "nurse",
+ "nutshell",
+ "nylon",
+ "oaks",
+ "oars",
+ "oasis",
+ "oatmeal",
+ "obedient",
+ "object",
+ "obliged",
+ "obnoxious",
+ "observant",
+ "obtains",
+ "obvious",
+ "occur",
+ "ocean",
+ "october",
+ "odds",
+ "odometer",
+ "offend",
+ "often",
+ "oilfield",
+ "ointment",
+ "okay",
+ "older",
+ "olive",
+ "olympics",
+ "omega",
+ "omission",
+ "omnibus",
+ "onboard",
+ "oncoming",
+ "oneself",
+ "ongoing",
+ "onion",
+ "online",
+ "onslaught",
+ "onto",
+ "onward",
+ "oozed",
+ "opacity",
+ "opened",
+ "opposite",
+ "optical",
+ "opus",
+ "orange",
+ "orbit",
+ "orchid",
+ "orders",
+ "organs",
+ "origin",
+ "ornament",
+ "orphans",
+ "oscar",
+ "ostrich",
+ "otherwise",
+ "otter",
+ "ouch",
+ "ought",
+ "ounce",
+ "ourself",
+ "oust",
+ "outbreak",
+ "oval",
+ "oven",
+ "owed",
+ "owls",
+ "owner",
+ "oxidant",
+ "oxygen",
+ "oyster",
+ "ozone",
+ "pact",
+ "paddles",
+ "pager",
+ "pairing",
+ "palace",
+ "pamphlet",
+ "pancakes",
+ "paper",
+ "paradise",
+ "pastry",
+ "patio",
+ "pause",
+ "pavements",
+ "pawnshop",
+ "payment",
+ "peaches",
+ "pebbles",
+ "peckish",
+ "pedantic",
+ "peeled",
+ "pegs",
+ "pelican",
+ "pencil",
+ "people",
+ "pepper",
+ "perfect",
+ "pests",
+ "petals",
+ "phase",
+ "pheasants",
+ "phone",
+ "phrases",
+ "physics",
+ "piano",
+ "picked",
+ "pierce",
+ "pigment",
+ "piloted",
+ "pimple",
+ "pinched",
+ "pioneer",
+ "pipeline",
+ "pirate",
+ "pistons",
+ "pitched",
+ "pivot",
+ "pixels",
+ "pizza",
+ "playful",
+ "pledge",
+ "pliers",
+ "plowing",
+ "plus",
+ "plywood",
+ "poaching",
+ "pockets",
+ "podcast",
+ "poetry",
+ "point",
+ "poker",
+ "polar",
+ "ponies",
+ "pool",
+ "popular",
+ "portents",
+ "possible",
+ "potato",
+ "pouch",
+ "poverty",
+ "powder",
+ "pram",
+ "present",
+ "pride",
+ "problems",
+ "pruned",
+ "prying",
+ "psychic",
+ "public",
+ "puck",
+ "puddle",
+ "puffin",
+ "pulp",
+ "pumpkins",
+ "punch",
+ "puppy",
+ "purged",
+ "push",
+ "putty",
+ "puzzled",
+ "pylons",
+ "pyramid",
+ "python",
+ "queen",
+ "quick",
+ "quote",
+ "rabbits",
+ "racecar",
+ "radar",
+ "rafts",
+ "rage",
+ "railway",
+ "raking",
+ "rally",
+ "ramped",
+ "randomly",
+ "rapid",
+ "rarest",
+ "rash",
+ "rated",
+ "ravine",
+ "rays",
+ "razor",
+ "react",
+ "rebel",
+ "recipe",
+ "reduce",
+ "reef",
+ "refer",
+ "regular",
+ "reheat",
+ "reignite",
+ "rejoices",
+ "rekindle",
+ "relic",
+ "remedy",
+ "renting",
+ "reorder",
+ "repent",
+ "request",
+ "reruns",
+ "rest",
+ "return",
+ "reunion",
+ "revamp",
+ "rewind",
+ "rhino",
+ "rhythm",
+ "ribbon",
+ "richly",
+ "ridges",
+ "rift",
+ "rigid",
+ "rims",
+ "ringing",
+ "riots",
+ "ripped",
+ "rising",
+ "ritual",
+ "river",
+ "roared",
+ "robot",
+ "rockets",
+ "rodent",
+ "rogue",
+ "roles",
+ "romance",
+ "roomy",
+ "roped",
+ "roster",
+ "rotate",
+ "rounded",
+ "rover",
+ "rowboat",
+ "royal",
+ "ruby",
+ "rudely",
+ "ruffled",
+ "rugged",
+ "ruined",
+ "ruling",
+ "rumble",
+ "runway",
+ "rural",
+ "rustled",
+ "ruthless",
+ "sabotage",
+ "sack",
+ "sadness",
+ "safety",
+ "saga",
+ "sailor",
+ "sake",
+ "salads",
+ "sample",
+ "sanity",
+ "sapling",
+ "sarcasm",
+ "sash",
+ "satin",
+ "saucepan",
+ "saved",
+ "sawmill",
+ "saxophone",
+ "sayings",
+ "scamper",
+ "scenic",
+ "school",
+ "science",
+ "scoop",
+ "scrub",
+ "scuba",
+ "seasons",
+ "second",
+ "sedan",
+ "seeded",
+ "segments",
+ "seismic",
+ "selfish",
+ "semifinal",
+ "sensible",
+ "september",
+ "sequence",
+ "serving",
+ "session",
+ "setup",
+ "seventh",
+ "sewage",
+ "shackles",
+ "shelter",
+ "shipped",
+ "shocking",
+ "shrugged",
+ "shuffled",
+ "shyness",
+ "siblings",
+ "sickness",
+ "sidekick",
+ "sieve",
+ "sifting",
+ "sighting",
+ "silk",
+ "simplest",
+ "sincerely",
+ "siphon",
+ "siren",
+ "situated",
+ "sixteen",
+ "sizes",
+ "skater",
+ "skew",
+ "skirting",
+ "skulls",
+ "skydive",
+ "slackens",
+ "sleepless",
+ "slid",
+ "slower",
+ "slug",
+ "smash",
+ "smelting",
+ "smidgen",
+ "smog",
+ "smuggled",
+ "snake",
+ "sneeze",
+ "sniff",
+ "snout",
+ "snug",
+ "soapy",
+ "sober",
+ "soccer",
+ "soda",
+ "software",
+ "soggy",
+ "soil",
+ "solved",
+ "somewhere",
+ "sonic",
+ "soothe",
+ "soprano",
+ "sorry",
+ "southern",
+ "sovereign",
+ "sowed",
+ "soya",
+ "space",
+ "speedy",
+ "sphere",
+ "spiders",
+ "splendid",
+ "spout",
+ "sprig",
+ "spud",
+ "spying",
+ "square",
+ "stacking",
+ "stellar",
+ "stick",
+ "stockpile",
+ "strained",
+ "stunning",
+ "stylishly",
+ "subtly",
+ "succeed",
+ "suddenly",
+ "suffice",
+ "sugar",
+ "suitcase",
+ "sulking",
+ "summon",
+ "sunken",
+ "superior",
+ "surfer",
+ "sushi",
+ "suture",
+ "swagger",
+ "swept",
+ "swiftly",
+ "sword",
+ "swung",
+ "syllabus",
+ "symptoms",
+ "syndrome",
+ "syphon",
+ "syringe",
+ "system",
+ "taboo",
+ "tacit",
+ "tadpoles",
+ "tagged",
+ "tail",
+ "taken",
+ "talent",
+ "tamper",
+ "tanks",
+ "tapestry",
+ "tarnished",
+ "tasked",
+ "tattoo",
+ "taunts",
+ "tavern",
+ "tawny",
+ "taxi",
+ "teardrop",
+ "technical",
+ "tedious",
+ "teeming",
+ "tell",
+ "template",
+ "tender",
+ "tepid",
+ "tequila",
+ "terminal",
+ "testing",
+ "tether",
+ "textbook",
+ "thaw",
+ "theatrics",
+ "thirsty",
+ "thorn",
+ "threaten",
+ "thumbs",
+ "thwart",
+ "ticket",
+ "tidy",
+ "tiers",
+ "tiger",
+ "tilt",
+ "timber",
+ "tinted",
+ "tipsy",
+ "tirade",
+ "tissue",
+ "titans",
+ "toaster",
+ "tobacco",
+ "today",
+ "toenail",
+ "toffee",
+ "together",
+ "toilet",
+ "token",
+ "tolerant",
+ "tomorrow",
+ "tonic",
+ "toolbox",
+ "topic",
+ "torch",
+ "tossed",
+ "total",
+ "touchy",
+ "towel",
+ "toxic",
+ "toystore",
+ "trash",
+ "trendy",
+ "tribal",
+ "trolling",
+ "truth",
+ "trying",
+ "tsunami",
+ "tubes",
+ "tucks",
+ "tudor",
+ "tuesday",
+ "tufts",
+ "tugs",
+ "tuition",
+ "tulips",
+ "tumbling",
+ "tunnel",
+ "turnip",
+ "tusks",
+ "tutor",
+ "tuxedo",
+ "twang",
+ "tweezer",
+ "twice",
+ "twofold",
+ "tycoon",
+ "typist",
+ "tyrant",
+ "ugly",
+ "ulcers",
+ "ultimate",
+ "umbrella",
+ "umpire",
+ "unafraid",
+ "unbending",
+ "uncle",
+ "under",
+ "uneven",
+ "unfit",
+ "ungainly",
+ "unhappy",
+ "union",
+ "unjustly",
+ "unknown",
+ "unlikely",
+ "unmask",
+ "unnoticed",
+ "unopened",
+ "unplugs",
+ "unquoted",
+ "unrest",
+ "unsafe",
+ "until",
+ "unusual",
+ "unveil",
+ "unwind",
+ "unzip",
+ "upbeat",
+ "upcoming",
+ "update",
+ "upgrade",
+ "uphill",
+ "upkeep",
+ "upload",
+ "upon",
+ "upper",
+ "upright",
+ "upstairs",
+ "uptight",
+ "upwards",
+ "urban",
+ "urchins",
+ "urgent",
+ "usage",
+ "useful",
+ "usher",
+ "using",
+ "usual",
+ "utensils",
+ "utility",
+ "utmost",
+ "utopia",
+ "uttered",
+ "vacation",
+ "vague",
+ "vain",
+ "value",
+ "vampire",
+ "vane",
+ "vapors",
+ "vary",
+ "vastness",
+ "vats",
+ "vaults",
+ "vector",
+ "veered",
+ "vegan",
+ "vehicle",
+ "vein",
+ "velvet",
+ "venomous",
+ "verification",
+ "vessel",
+ "veteran",
+ "vexed",
+ "vials",
+ "vibrate",
+ "victim",
+ "video",
+ "viewpoint",
+ "vigilant",
+ "viking",
+ "village",
+ "vinegar",
+ "violin",
+ "vipers",
+ "virtual",
+ "visited",
+ "vitals",
+ "vivid",
+ "vixen",
+ "vocal",
+ "vogue",
+ "voice",
+ "volcano",
+ "vortex",
+ "voted",
+ "voucher",
+ "vowels",
+ "voyage",
+ "vulture",
+ "wade",
+ "waffle",
+ "wagon",
+ "waist",
+ "waking",
+ "wallets",
+ "wanted",
+ "warped",
+ "washing",
+ "water",
+ "waveform",
+ "waxing",
+ "wayside",
+ "weavers",
+ "website",
+ "wedge",
+ "weekday",
+ "weird",
+ "welders",
+ "went",
+ "wept",
+ "were",
+ "western",
+ "wetsuit",
+ "whale",
+ "when",
+ "whipped",
+ "whole",
+ "wickets",
+ "width",
+ "wield",
+ "wife",
+ "wiggle",
+ "wilfully",
+ "winter",
+ "wipeout",
+ "wiring",
+ "wise",
+ "withdrawn",
+ "wives",
+ "wizard",
+ "wobbly",
+ "woes",
+ "woken",
+ "wolf",
+ "womanly",
+ "wonders",
+ "woozy",
+ "worry",
+ "wounded",
+ "woven",
+ "wrap",
+ "wrist",
+ "wrong",
+ "yacht",
+ "yahoo",
+ "yanks",
+ "yard",
+ "yawning",
+ "yearbook",
+ "yellow",
+ "yesterday",
+ "yeti",
+ "yields",
+ "yodel",
+ "yoga",
+ "younger",
+ "yoyo",
+ "zapped",
+ "zeal",
+ "zebra",
+ "zero",
+ "zesty",
+ "zigzags",
+ "zinger",
+ "zippers",
+ "zodiac",
+ "zombie",
+ "zones",
+ "zoom"
+ });
+ word_map = new std::unordered_map<std::string, uint32_t>;
+ trimmed_word_map = new std::unordered_map<std::string, uint32_t>;
+ language_name = "English";
+ populate_maps();
+ }
+ };
+}
+
+#endif
diff --git a/src/mnemonics/japanese.h b/src/mnemonics/japanese.h
new file mode 100644
index 000000000..22c7a53ba
--- /dev/null
+++ b/src/mnemonics/japanese.h
@@ -0,0 +1,1692 @@
+// Word list originally created by dabura667
+//
+// Copyright (c) 2014, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*!
+ * \file japanese.h
+ *
+ * \brief Japanese word list and map.
+ */
+
+#ifndef JAPANESE_H
+#define JAPANESE_H
+
+#include <vector>
+#include <unordered_map>
+#include "language_base.h"
+#include <string>
+
+/*!
+ * \namespace Language
+ * \brief Mnemonic language related namespace.
+ */
+namespace Language
+{
+ class Japanese: public Base
+ {
+ public:
+ Japanese()
+ {
+ word_list = new std::vector<std::string>({
+ "あいこくしん",
+ "あいさつ",
+ "あいだ",
+ "あおぞら",
+ "あかちゃん",
+ "あきる",
+ "あけがた",
+ "あける",
+ "あこがれる",
+ "あさい",
+ "あさひ",
+ "あしあと",
+ "あじわう",
+ "あずかる",
+ "あずき",
+ "あそぶ",
+ "あたえる",
+ "あたためる",
+ "あたりまえ",
+ "あたる",
+ "あつい",
+ "あつかう",
+ "あっしゅく",
+ "あつまり",
+ "あつめる",
+ "あてな",
+ "あてはまる",
+ "あひる",
+ "あぶら",
+ "あぶる",
+ "あふれる",
+ "あまい",
+ "あまど",
+ "あまやかす",
+ "あまり",
+ "あみもの",
+ "あめりか",
+ "あやまる",
+ "あゆむ",
+ "あらいぐま",
+ "あらし",
+ "あらすじ",
+ "あらためる",
+ "あらゆる",
+ "あらわす",
+ "ありがとう",
+ "あわせる",
+ "あわてる",
+ "あんい",
+ "あんがい",
+ "あんこ",
+ "あんぜん",
+ "あんてい",
+ "あんない",
+ "あんまり",
+ "いいだす",
+ "いおん",
+ "いがい",
+ "いがく",
+ "いきおい",
+ "いきなり",
+ "いきもの",
+ "いきる",
+ "いくじ",
+ "いくぶん",
+ "いけばな",
+ "いけん",
+ "いこう",
+ "いこく",
+ "いこつ",
+ "いさましい",
+ "いさん",
+ "いしき",
+ "いじゅう",
+ "いじょう",
+ "いじわる",
+ "いずみ",
+ "いずれ",
+ "いせい",
+ "いせえび",
+ "いせかい",
+ "いせき",
+ "いぜん",
+ "いそうろう",
+ "いそがしい",
+ "いだい",
+ "いだく",
+ "いたずら",
+ "いたみ",
+ "いたりあ",
+ "いちおう",
+ "いちじ",
+ "いちど",
+ "いちば",
+ "いちぶ",
+ "いちりゅう",
+ "いつか",
+ "いっしゅん",
+ "いっせい",
+ "いっそう",
+ "いったん",
+ "いっち",
+ "いってい",
+ "いっぽう",
+ "いてざ",
+ "いてん",
+ "いどう",
+ "いとこ",
+ "いない",
+ "いなか",
+ "いねむり",
+ "いのち",
+ "いのる",
+ "いはつ",
+ "いばる",
+ "いはん",
+ "いびき",
+ "いひん",
+ "いふく",
+ "いへん",
+ "いほう",
+ "いみん",
+ "いもうと",
+ "いもたれ",
+ "いもり",
+ "いやがる",
+ "いやす",
+ "いよかん",
+ "いよく",
+ "いらい",
+ "いらすと",
+ "いりぐち",
+ "いりょう",
+ "いれい",
+ "いれもの",
+ "いれる",
+ "いろえんぴつ",
+ "いわい",
+ "いわう",
+ "いわかん",
+ "いわば",
+ "いわゆる",
+ "いんげんまめ",
+ "いんさつ",
+ "いんしょう",
+ "いんよう",
+ "うえき",
+ "うえる",
+ "うおざ",
+ "うがい",
+ "うかぶ",
+ "うかべる",
+ "うきわ",
+ "うくらいな",
+ "うくれれ",
+ "うけたまわる",
+ "うけつけ",
+ "うけとる",
+ "うけもつ",
+ "うける",
+ "うごかす",
+ "うごく",
+ "うこん",
+ "うさぎ",
+ "うしなう",
+ "うしろがみ",
+ "うすい",
+ "うすぎ",
+ "うすぐらい",
+ "うすめる",
+ "うせつ",
+ "うちあわせ",
+ "うちがわ",
+ "うちき",
+ "うちゅう",
+ "うっかり",
+ "うつくしい",
+ "うったえる",
+ "うつる",
+ "うどん",
+ "うなぎ",
+ "うなじ",
+ "うなずく",
+ "うなる",
+ "うねる",
+ "うのう",
+ "うぶげ",
+ "うぶごえ",
+ "うまれる",
+ "うめる",
+ "うもう",
+ "うやまう",
+ "うよく",
+ "うらがえす",
+ "うらぐち",
+ "うらない",
+ "うりあげ",
+ "うりきれ",
+ "うるさい",
+ "うれしい",
+ "うれゆき",
+ "うれる",
+ "うろこ",
+ "うわき",
+ "うわさ",
+ "うんこう",
+ "うんちん",
+ "うんてん",
+ "うんどう",
+ "えいえん",
+ "えいが",
+ "えいきょう",
+ "えいご",
+ "えいせい",
+ "えいぶん",
+ "えいよう",
+ "えいわ",
+ "えおり",
+ "えがお",
+ "えがく",
+ "えきたい",
+ "えくせる",
+ "えしゃく",
+ "えすて",
+ "えつらん",
+ "えのぐ",
+ "えほうまき",
+ "えほん",
+ "えまき",
+ "えもじ",
+ "えもの",
+ "えらい",
+ "えらぶ",
+ "えりあ",
+ "えんえん",
+ "えんかい",
+ "えんぎ",
+ "えんげき",
+ "えんしゅう",
+ "えんぜつ",
+ "えんそく",
+ "えんちょう",
+ "えんとつ",
+ "おいかける",
+ "おいこす",
+ "おいしい",
+ "おいつく",
+ "おうえん",
+ "おうさま",
+ "おうじ",
+ "おうせつ",
+ "おうたい",
+ "おうふく",
+ "おうべい",
+ "おうよう",
+ "おえる",
+ "おおい",
+ "おおう",
+ "おおどおり",
+ "おおや",
+ "おおよそ",
+ "おかえり",
+ "おかず",
+ "おがむ",
+ "おかわり",
+ "おぎなう",
+ "おきる",
+ "おくさま",
+ "おくじょう",
+ "おくりがな",
+ "おくる",
+ "おくれる",
+ "おこす",
+ "おこなう",
+ "おこる",
+ "おさえる",
+ "おさない",
+ "おさめる",
+ "おしいれ",
+ "おしえる",
+ "おじぎ",
+ "おじさん",
+ "おしゃれ",
+ "おそらく",
+ "おそわる",
+ "おたがい",
+ "おたく",
+ "おだやか",
+ "おちつく",
+ "おっと",
+ "おつり",
+ "おでかけ",
+ "おとしもの",
+ "おとなしい",
+ "おどり",
+ "おどろかす",
+ "おばさん",
+ "おまいり",
+ "おめでとう",
+ "おもいで",
+ "おもう",
+ "おもたい",
+ "おもちゃ",
+ "おやつ",
+ "おやゆび",
+ "およぼす",
+ "おらんだ",
+ "おろす",
+ "おんがく",
+ "おんけい",
+ "おんしゃ",
+ "おんせん",
+ "おんだん",
+ "おんちゅう",
+ "おんどけい",
+ "かあつ",
+ "かいが",
+ "がいき",
+ "がいけん",
+ "がいこう",
+ "かいさつ",
+ "かいしゃ",
+ "かいすいよく",
+ "かいぜん",
+ "かいぞうど",
+ "かいつう",
+ "かいてん",
+ "かいとう",
+ "かいふく",
+ "がいへき",
+ "かいほう",
+ "かいよう",
+ "がいらい",
+ "かいわ",
+ "かえる",
+ "かおり",
+ "かかえる",
+ "かがく",
+ "かがし",
+ "かがみ",
+ "かくご",
+ "かくとく",
+ "かざる",
+ "がぞう",
+ "かたい",
+ "かたち",
+ "がちょう",
+ "がっきゅう",
+ "がっこう",
+ "がっさん",
+ "がっしょう",
+ "かなざわし",
+ "かのう",
+ "がはく",
+ "かぶか",
+ "かほう",
+ "かほご",
+ "かまう",
+ "かまぼこ",
+ "かめれおん",
+ "かゆい",
+ "かようび",
+ "からい",
+ "かるい",
+ "かろう",
+ "かわく",
+ "かわら",
+ "がんか",
+ "かんけい",
+ "かんこう",
+ "かんしゃ",
+ "かんそう",
+ "かんたん",
+ "かんち",
+ "がんばる",
+ "きあい",
+ "きあつ",
+ "きいろ",
+ "ぎいん",
+ "きうい",
+ "きうん",
+ "きえる",
+ "きおう",
+ "きおく",
+ "きおち",
+ "きおん",
+ "きかい",
+ "きかく",
+ "きかんしゃ",
+ "ききて",
+ "きくばり",
+ "きくらげ",
+ "きけんせい",
+ "きこう",
+ "きこえる",
+ "きこく",
+ "きさい",
+ "きさく",
+ "きさま",
+ "きさらぎ",
+ "ぎじかがく",
+ "ぎしき",
+ "ぎじたいけん",
+ "ぎじにってい",
+ "ぎじゅつしゃ",
+ "きすう",
+ "きせい",
+ "きせき",
+ "きせつ",
+ "きそう",
+ "きぞく",
+ "きぞん",
+ "きたえる",
+ "きちょう",
+ "きつえん",
+ "ぎっちり",
+ "きつつき",
+ "きつね",
+ "きてい",
+ "きどう",
+ "きどく",
+ "きない",
+ "きなが",
+ "きなこ",
+ "きぬごし",
+ "きねん",
+ "きのう",
+ "きのした",
+ "きはく",
+ "きびしい",
+ "きひん",
+ "きふく",
+ "きぶん",
+ "きぼう",
+ "きほん",
+ "きまる",
+ "きみつ",
+ "きむずかしい",
+ "きめる",
+ "きもだめし",
+ "きもち",
+ "きもの",
+ "きゃく",
+ "きやく",
+ "ぎゅうにく",
+ "きよう",
+ "きょうりゅう",
+ "きらい",
+ "きらく",
+ "きりん",
+ "きれい",
+ "きれつ",
+ "きろく",
+ "ぎろん",
+ "きわめる",
+ "ぎんいろ",
+ "きんかくじ",
+ "きんじょ",
+ "きんようび",
+ "ぐあい",
+ "くいず",
+ "くうかん",
+ "くうき",
+ "くうぐん",
+ "くうこう",
+ "ぐうせい",
+ "くうそう",
+ "ぐうたら",
+ "くうふく",
+ "くうぼ",
+ "くかん",
+ "くきょう",
+ "くげん",
+ "ぐこう",
+ "くさい",
+ "くさき",
+ "くさばな",
+ "くさる",
+ "くしゃみ",
+ "くしょう",
+ "くすのき",
+ "くすりゆび",
+ "くせげ",
+ "くせん",
+ "ぐたいてき",
+ "くださる",
+ "くたびれる",
+ "くちこみ",
+ "くちさき",
+ "くつした",
+ "ぐっすり",
+ "くつろぐ",
+ "くとうてん",
+ "くどく",
+ "くなん",
+ "くねくね",
+ "くのう",
+ "くふう",
+ "くみあわせ",
+ "くみたてる",
+ "くめる",
+ "くやくしょ",
+ "くらす",
+ "くらべる",
+ "くるま",
+ "くれる",
+ "くろう",
+ "くわしい",
+ "ぐんかん",
+ "ぐんしょく",
+ "ぐんたい",
+ "ぐんて",
+ "けあな",
+ "けいかく",
+ "けいけん",
+ "けいこ",
+ "けいさつ",
+ "げいじゅつ",
+ "けいたい",
+ "げいのうじん",
+ "けいれき",
+ "けいろ",
+ "けおとす",
+ "けおりもの",
+ "げきか",
+ "げきげん",
+ "げきだん",
+ "げきちん",
+ "げきとつ",
+ "げきは",
+ "げきやく",
+ "げこう",
+ "げこくじょう",
+ "げざい",
+ "けさき",
+ "げざん",
+ "けしき",
+ "けしごむ",
+ "けしょう",
+ "げすと",
+ "けたば",
+ "けちゃっぷ",
+ "けちらす",
+ "けつあつ",
+ "けつい",
+ "けつえき",
+ "けっこん",
+ "けつじょ",
+ "けっせき",
+ "けってい",
+ "けつまつ",
+ "げつようび",
+ "げつれい",
+ "けつろん",
+ "げどく",
+ "けとばす",
+ "けとる",
+ "けなげ",
+ "けなす",
+ "けなみ",
+ "けぬき",
+ "げねつ",
+ "けねん",
+ "けはい",
+ "げひん",
+ "けぶかい",
+ "げぼく",
+ "けまり",
+ "けみかる",
+ "けむし",
+ "けむり",
+ "けもの",
+ "けらい",
+ "けろけろ",
+ "けわしい",
+ "けんい",
+ "けんえつ",
+ "けんお",
+ "けんか",
+ "げんき",
+ "けんげん",
+ "けんこう",
+ "けんさく",
+ "けんしゅう",
+ "けんすう",
+ "げんそう",
+ "けんちく",
+ "けんてい",
+ "けんとう",
+ "けんない",
+ "けんにん",
+ "げんぶつ",
+ "けんま",
+ "けんみん",
+ "けんめい",
+ "けんらん",
+ "けんり",
+ "こあくま",
+ "こいぬ",
+ "こいびと",
+ "ごうい",
+ "こうえん",
+ "こうおん",
+ "こうかん",
+ "ごうきゅう",
+ "ごうけい",
+ "こうこう",
+ "こうさい",
+ "こうじ",
+ "こうすい",
+ "ごうせい",
+ "こうそく",
+ "こうたい",
+ "こうちゃ",
+ "こうつう",
+ "こうてい",
+ "こうどう",
+ "こうない",
+ "こうはい",
+ "ごうほう",
+ "ごうまん",
+ "こうもく",
+ "こうりつ",
+ "こえる",
+ "こおり",
+ "ごかい",
+ "ごがつ",
+ "ごかん",
+ "こくご",
+ "こくさい",
+ "こくとう",
+ "こくない",
+ "こくはく",
+ "こぐま",
+ "こけい",
+ "こける",
+ "ここのか",
+ "こころ",
+ "こさめ",
+ "こしつ",
+ "こすう",
+ "こせい",
+ "こせき",
+ "こぜん",
+ "こそだて",
+ "こたい",
+ "こたえる",
+ "こたつ",
+ "こちょう",
+ "こっか",
+ "こつこつ",
+ "こつばん",
+ "こつぶ",
+ "こてい",
+ "こてん",
+ "ことがら",
+ "ことし",
+ "ことば",
+ "ことり",
+ "こなごな",
+ "こねこね",
+ "このまま",
+ "このみ",
+ "このよ",
+ "ごはん",
+ "こひつじ",
+ "こふう",
+ "こふん",
+ "こぼれる",
+ "ごまあぶら",
+ "こまかい",
+ "ごますり",
+ "こまつな",
+ "こまる",
+ "こむぎこ",
+ "こもじ",
+ "こもち",
+ "こもの",
+ "こもん",
+ "こやく",
+ "こやま",
+ "こゆう",
+ "こゆび",
+ "こよい",
+ "こよう",
+ "こりる",
+ "これくしょん",
+ "ころっけ",
+ "こわもて",
+ "こわれる",
+ "こんいん",
+ "こんかい",
+ "こんき",
+ "こんしゅう",
+ "こんすい",
+ "こんだて",
+ "こんとん",
+ "こんなん",
+ "こんびに",
+ "こんぽん",
+ "こんまけ",
+ "こんや",
+ "こんれい",
+ "こんわく",
+ "ざいえき",
+ "さいかい",
+ "さいきん",
+ "ざいげん",
+ "ざいこ",
+ "さいしょ",
+ "さいせい",
+ "ざいたく",
+ "ざいちゅう",
+ "さいてき",
+ "ざいりょう",
+ "さうな",
+ "さかいし",
+ "さがす",
+ "さかな",
+ "さかみち",
+ "さがる",
+ "さぎょう",
+ "さくし",
+ "さくひん",
+ "さくら",
+ "さこく",
+ "さこつ",
+ "さずかる",
+ "ざせき",
+ "さたん",
+ "さつえい",
+ "ざつおん",
+ "ざっか",
+ "ざつがく",
+ "さっきょく",
+ "ざっし",
+ "さつじん",
+ "ざっそう",
+ "さつたば",
+ "さつまいも",
+ "さてい",
+ "さといも",
+ "さとう",
+ "さとおや",
+ "さとし",
+ "さとる",
+ "さのう",
+ "さばく",
+ "さびしい",
+ "さべつ",
+ "さほう",
+ "さほど",
+ "さます",
+ "さみしい",
+ "さみだれ",
+ "さむけ",
+ "さめる",
+ "さやえんどう",
+ "さゆう",
+ "さよう",
+ "さよく",
+ "さらだ",
+ "ざるそば",
+ "さわやか",
+ "さわる",
+ "さんいん",
+ "さんか",
+ "さんきゃく",
+ "さんこう",
+ "さんさい",
+ "ざんしょ",
+ "さんすう",
+ "さんせい",
+ "さんそ",
+ "さんち",
+ "さんま",
+ "さんみ",
+ "さんらん",
+ "しあい",
+ "しあげ",
+ "しあさって",
+ "しあわせ",
+ "しいく",
+ "しいん",
+ "しうち",
+ "しえい",
+ "しおけ",
+ "しかい",
+ "しかく",
+ "じかん",
+ "しごと",
+ "しすう",
+ "じだい",
+ "したうけ",
+ "したぎ",
+ "したて",
+ "したみ",
+ "しちょう",
+ "しちりん",
+ "しっかり",
+ "しつじ",
+ "しつもん",
+ "してい",
+ "してき",
+ "してつ",
+ "じてん",
+ "じどう",
+ "しなぎれ",
+ "しなもの",
+ "しなん",
+ "しねま",
+ "しねん",
+ "しのぐ",
+ "しのぶ",
+ "しはい",
+ "しばかり",
+ "しはつ",
+ "しはらい",
+ "しはん",
+ "しひょう",
+ "しふく",
+ "じぶん",
+ "しへい",
+ "しほう",
+ "しほん",
+ "しまう",
+ "しまる",
+ "しみん",
+ "しむける",
+ "じむしょ",
+ "しめい",
+ "しめる",
+ "しもん",
+ "しゃいん",
+ "しゃうん",
+ "しゃおん",
+ "じゃがいも",
+ "しやくしょ",
+ "しゃくほう",
+ "しゃけん",
+ "しゃこ",
+ "しゃざい",
+ "しゃしん",
+ "しゃせん",
+ "しゃそう",
+ "しゃたい",
+ "しゃちょう",
+ "しゃっきん",
+ "じゃま",
+ "しゃりん",
+ "しゃれい",
+ "じゆう",
+ "じゅうしょ",
+ "しゅくはく",
+ "じゅしん",
+ "しゅっせき",
+ "しゅみ",
+ "しゅらば",
+ "じゅんばん",
+ "しょうかい",
+ "しょくたく",
+ "しょっけん",
+ "しょどう",
+ "しょもつ",
+ "しらせる",
+ "しらべる",
+ "しんか",
+ "しんこう",
+ "じんじゃ",
+ "しんせいじ",
+ "しんちく",
+ "しんりん",
+ "すあげ",
+ "すあし",
+ "すあな",
+ "ずあん",
+ "すいえい",
+ "すいか",
+ "すいとう",
+ "ずいぶん",
+ "すいようび",
+ "すうがく",
+ "すうじつ",
+ "すうせん",
+ "すおどり",
+ "すきま",
+ "すくう",
+ "すくない",
+ "すける",
+ "すごい",
+ "すこし",
+ "ずさん",
+ "すずしい",
+ "すすむ",
+ "すすめる",
+ "すっかり",
+ "ずっしり",
+ "ずっと",
+ "すてき",
+ "すてる",
+ "すねる",
+ "すのこ",
+ "すはだ",
+ "すばらしい",
+ "ずひょう",
+ "ずぶぬれ",
+ "すぶり",
+ "すふれ",
+ "すべて",
+ "すべる",
+ "ずほう",
+ "すぼん",
+ "すまい",
+ "すめし",
+ "すもう",
+ "すやき",
+ "すらすら",
+ "するめ",
+ "すれちがう",
+ "すろっと",
+ "すわる",
+ "すんぜん",
+ "すんぽう",
+ "せあぶら",
+ "せいかつ",
+ "せいげん",
+ "せいじ",
+ "せいよう",
+ "せおう",
+ "せかいかん",
+ "せきにん",
+ "せきむ",
+ "せきゆ",
+ "せきらんうん",
+ "せけん",
+ "せこう",
+ "せすじ",
+ "せたい",
+ "せたけ",
+ "せっかく",
+ "せっきゃく",
+ "ぜっく",
+ "せっけん",
+ "せっこつ",
+ "せっさたくま",
+ "せつぞく",
+ "せつだん",
+ "せつでん",
+ "せっぱん",
+ "せつび",
+ "せつぶん",
+ "せつめい",
+ "せつりつ",
+ "せなか",
+ "せのび",
+ "せはば",
+ "せびろ",
+ "せぼね",
+ "せまい",
+ "せまる",
+ "せめる",
+ "せもたれ",
+ "せりふ",
+ "ぜんあく",
+ "せんい",
+ "せんえい",
+ "せんか",
+ "せんきょ",
+ "せんく",
+ "せんげん",
+ "ぜんご",
+ "せんさい",
+ "せんしゅ",
+ "せんすい",
+ "せんせい",
+ "せんぞ",
+ "せんたく",
+ "せんちょう",
+ "せんてい",
+ "せんとう",
+ "せんぬき",
+ "せんねん",
+ "せんぱい",
+ "ぜんぶ",
+ "ぜんぽう",
+ "せんむ",
+ "せんめんじょ",
+ "せんもん",
+ "せんやく",
+ "せんゆう",
+ "せんよう",
+ "ぜんら",
+ "ぜんりゃく",
+ "せんれい",
+ "せんろ",
+ "そあく",
+ "そいとげる",
+ "そいね",
+ "そうがんきょう",
+ "そうき",
+ "そうご",
+ "そうしん",
+ "そうだん",
+ "そうなん",
+ "そうび",
+ "そうめん",
+ "そうり",
+ "そえもの",
+ "そえん",
+ "そがい",
+ "そげき",
+ "そこう",
+ "そこそこ",
+ "そざい",
+ "そしな",
+ "そせい",
+ "そせん",
+ "そそぐ",
+ "そだてる",
+ "そつう",
+ "そつえん",
+ "そっかん",
+ "そつぎょう",
+ "そっけつ",
+ "そっこう",
+ "そっせん",
+ "そっと",
+ "そとがわ",
+ "そとづら",
+ "そなえる",
+ "そなた",
+ "そふぼ",
+ "そぼく",
+ "そぼろ",
+ "そまつ",
+ "そまる",
+ "そむく",
+ "そむりえ",
+ "そめる",
+ "そもそも",
+ "そよかぜ",
+ "そらまめ",
+ "そろう",
+ "そんかい",
+ "そんけい",
+ "そんざい",
+ "そんしつ",
+ "そんぞく",
+ "そんちょう",
+ "ぞんび",
+ "ぞんぶん",
+ "そんみん",
+ "たあい",
+ "たいいん",
+ "たいうん",
+ "たいえき",
+ "たいおう",
+ "だいがく",
+ "たいき",
+ "たいぐう",
+ "たいけん",
+ "たいこ",
+ "たいざい",
+ "だいじょうぶ",
+ "だいすき",
+ "たいせつ",
+ "たいそう",
+ "だいたい",
+ "たいちょう",
+ "たいてい",
+ "だいどころ",
+ "たいない",
+ "たいねつ",
+ "たいのう",
+ "たいはん",
+ "だいひょう",
+ "たいふう",
+ "たいへん",
+ "たいほ",
+ "たいまつばな",
+ "たいみんぐ",
+ "たいむ",
+ "たいめん",
+ "たいやき",
+ "たいよう",
+ "たいら",
+ "たいりょく",
+ "たいる",
+ "たいわん",
+ "たうえ",
+ "たえる",
+ "たおす",
+ "たおる",
+ "たおれる",
+ "たかい",
+ "たかね",
+ "たきび",
+ "たくさん",
+ "たこく",
+ "たこやき",
+ "たさい",
+ "たしざん",
+ "だじゃれ",
+ "たすける",
+ "たずさわる",
+ "たそがれ",
+ "たたかう",
+ "たたく",
+ "ただしい",
+ "たたみ",
+ "たちばな",
+ "だっかい",
+ "だっきゃく",
+ "だっこ",
+ "だっしゅつ",
+ "だったい",
+ "たてる",
+ "たとえる",
+ "たなばた",
+ "たにん",
+ "たぬき",
+ "たのしみ",
+ "たはつ",
+ "たぶん",
+ "たべる",
+ "たぼう",
+ "たまご",
+ "たまる",
+ "だむる",
+ "ためいき",
+ "ためす",
+ "ためる",
+ "たもつ",
+ "たやすい",
+ "たよる",
+ "たらす",
+ "たりきほんがん",
+ "たりょう",
+ "たりる",
+ "たると",
+ "たれる",
+ "たれんと",
+ "たろっと",
+ "たわむれる",
+ "だんあつ",
+ "たんい",
+ "たんおん",
+ "たんか",
+ "たんき",
+ "たんけん",
+ "たんご",
+ "たんさん",
+ "たんじょうび",
+ "だんせい",
+ "たんそく",
+ "たんたい",
+ "だんち",
+ "たんてい",
+ "たんとう",
+ "だんな",
+ "たんにん",
+ "だんねつ",
+ "たんのう",
+ "たんぴん",
+ "だんぼう",
+ "たんまつ",
+ "たんめい",
+ "だんれつ",
+ "だんろ",
+ "だんわ",
+ "ちあい",
+ "ちあん",
+ "ちいき",
+ "ちいさい",
+ "ちえん",
+ "ちかい",
+ "ちから",
+ "ちきゅう",
+ "ちきん",
+ "ちけいず",
+ "ちけん",
+ "ちこく",
+ "ちさい",
+ "ちしき",
+ "ちしりょう",
+ "ちせい",
+ "ちそう",
+ "ちたい",
+ "ちたん",
+ "ちちおや",
+ "ちつじょ",
+ "ちてき",
+ "ちてん",
+ "ちぬき",
+ "ちぬり",
+ "ちのう",
+ "ちひょう",
+ "ちへいせん",
+ "ちほう",
+ "ちまた",
+ "ちみつ",
+ "ちみどろ",
+ "ちめいど",
+ "ちゃんこなべ",
+ "ちゅうい",
+ "ちゆりょく",
+ "ちょうし",
+ "ちょさくけん",
+ "ちらし",
+ "ちらみ",
+ "ちりがみ",
+ "ちりょう",
+ "ちるど",
+ "ちわわ",
+ "ちんたい",
+ "ちんもく",
+ "ついか",
+ "ついたち",
+ "つうか",
+ "つうじょう",
+ "つうはん",
+ "つうわ",
+ "つかう",
+ "つかれる",
+ "つくね",
+ "つくる",
+ "つけね",
+ "つける",
+ "つごう",
+ "つたえる",
+ "つづく",
+ "つつじ",
+ "つつむ",
+ "つとめる",
+ "つながる",
+ "つなみ",
+ "つねづね",
+ "つのる",
+ "つぶす",
+ "つまらない",
+ "つまる",
+ "つみき",
+ "つめたい",
+ "つもり",
+ "つもる",
+ "つよい",
+ "つるぼ",
+ "つるみく",
+ "つわもの",
+ "つわり",
+ "てあし",
+ "てあて",
+ "てあみ",
+ "ていおん",
+ "ていか",
+ "ていき",
+ "ていけい",
+ "ていこく",
+ "ていさつ",
+ "ていし",
+ "ていせい",
+ "ていたい",
+ "ていど",
+ "ていねい",
+ "ていひょう",
+ "ていへん",
+ "ていぼう",
+ "てうち",
+ "ておくれ",
+ "てきとう",
+ "てくび",
+ "でこぼこ",
+ "てさぎょう",
+ "てさげ",
+ "てすり",
+ "てそう",
+ "てちがい",
+ "てちょう",
+ "てつがく",
+ "てつづき",
+ "でっぱ",
+ "てつぼう",
+ "てつや",
+ "でぬかえ",
+ "てぬき",
+ "てぬぐい",
+ "てのひら",
+ "てはい",
+ "てぶくろ",
+ "てふだ",
+ "てほどき",
+ "てほん",
+ "てまえ",
+ "てまきずし",
+ "てみじか",
+ "てみやげ",
+ "てらす",
+ "てれび",
+ "てわけ",
+ "てわたし",
+ "でんあつ",
+ "てんいん",
+ "てんかい",
+ "てんき",
+ "てんぐ",
+ "てんけん",
+ "てんごく",
+ "てんさい",
+ "てんし",
+ "てんすう",
+ "でんち",
+ "てんてき",
+ "てんとう",
+ "てんない",
+ "てんぷら",
+ "てんぼうだい",
+ "てんめつ",
+ "てんらんかい",
+ "でんりょく",
+ "でんわ",
+ "どあい",
+ "といれ",
+ "どうかん",
+ "とうきゅう",
+ "どうぐ",
+ "とうし",
+ "とうむぎ",
+ "とおい",
+ "とおか",
+ "とおく",
+ "とおす",
+ "とおる",
+ "とかい",
+ "とかす",
+ "ときおり",
+ "ときどき",
+ "とくい",
+ "とくしゅう",
+ "とくてん",
+ "とくに",
+ "とくべつ",
+ "とけい",
+ "とける",
+ "とこや",
+ "とさか",
+ "としょかん",
+ "とそう",
+ "とたん",
+ "とちゅう",
+ "とっきゅう",
+ "とっくん",
+ "とつぜん",
+ "とつにゅう",
+ "とどける",
+ "ととのえる",
+ "とない",
+ "となえる",
+ "となり",
+ "とのさま",
+ "とばす",
+ "どぶがわ",
+ "とほう",
+ "とまる",
+ "とめる",
+ "ともだち",
+ "ともる",
+ "どようび",
+ "とらえる",
+ "とんかつ",
+ "どんぶり",
+ "ないかく",
+ "ないこう",
+ "ないしょ",
+ "ないす",
+ "ないせん",
+ "ないそう",
+ "なおす",
+ "ながい",
+ "なくす",
+ "なげる",
+ "なこうど",
+ "なさけ",
+ "なたでここ",
+ "なっとう",
+ "なつやすみ",
+ "ななおし",
+ "なにごと",
+ "なにもの",
+ "なにわ",
+ "なのか",
+ "なふだ",
+ "なまいき",
+ "なまえ",
+ "なまみ",
+ "なみだ",
+ "なめらか",
+ "なめる",
+ "なやむ",
+ "ならう",
+ "ならび",
+ "ならぶ",
+ "なれる",
+ "なわとび",
+ "なわばり",
+ "にあう",
+ "にいがた",
+ "にうけ",
+ "におい",
+ "にかい",
+ "にがて",
+ "にきび",
+ "にくしみ",
+ "にくまん",
+ "にげる",
+ "にさんかたんそ",
+ "にしき",
+ "にせもの",
+ "にちじょう",
+ "にちようび",
+ "にっか",
+ "にっき",
+ "にっけい",
+ "にっこう",
+ "にっさん",
+ "にっしょく",
+ "にっすう",
+ "にっせき",
+ "にってい",
+ "になう",
+ "にほん",
+ "にまめ",
+ "にもつ",
+ "にやり",
+ "にゅういん",
+ "にりんしゃ",
+ "にわとり",
+ "にんい",
+ "にんか",
+ "にんき",
+ "にんげん",
+ "にんしき",
+ "にんずう",
+ "にんそう",
+ "にんたい",
+ "にんち",
+ "にんてい",
+ "にんにく",
+ "にんぷ",
+ "にんまり",
+ "にんむ",
+ "にんめい",
+ "にんよう",
+ "ぬいくぎ",
+ "ぬかす",
+ "ぬぐいとる",
+ "ぬぐう",
+ "ぬくもり",
+ "ぬすむ",
+ "ぬまえび",
+ "ぬめり",
+ "ぬらす",
+ "ぬんちゃく",
+ "ねあげ",
+ "ねいき",
+ "ねいる",
+ "ねいろ",
+ "ねぐせ",
+ "ねくたい",
+ "ねくら",
+ "ねこぜ",
+ "ねこむ",
+ "ねさげ",
+ "ねすごす",
+ "ねそべる",
+ "ねだん",
+ "ねつい",
+ "ねっしん",
+ "ねつぞう",
+ "ねったいぎょ",
+ "ねぶそく",
+ "ねふだ",
+ "ねぼう",
+ "ねほりはほり",
+ "ねまき",
+ "ねまわし",
+ "ねみみ",
+ "ねむい",
+ "ねむたい",
+ "ねもと",
+ "ねらう",
+ "ねわざ",
+ "ねんいり",
+ "ねんおし",
+ "ねんかん",
+ "ねんきん",
+ "ねんぐ",
+ "ねんざ",
+ "ねんし",
+ "ねんちゃく",
+ "ねんど",
+ "ねんぴ",
+ "ねんぶつ",
+ "ねんまつ",
+ "ねんりょう",
+ "ねんれい",
+ "のいず",
+ "のおづま",
+ "のがす",
+ "のきなみ",
+ "のこぎり",
+ "のこす",
+ "のこる",
+ "のせる",
+ "のぞく",
+ "のぞむ",
+ "のたまう",
+ "のちほど",
+ "のっく",
+ "のばす",
+ "のはら",
+ "のべる",
+ "のぼる",
+ "のみもの",
+ "のやま",
+ "のらいぬ",
+ "のらねこ",
+ "のりもの",
+ "のりゆき",
+ "のれん",
+ "のんき",
+ "ばあい",
+ "はあく",
+ "ばあさん",
+ "ばいか",
+ "ばいく",
+ "はいけん",
+ "はいご",
+ "はいしん",
+ "はいすい",
+ "はいせん",
+ "はいそう",
+ "はいち",
+ "ばいばい",
+ "はいれつ",
+ "はえる",
+ "はおる",
+ "はかい",
+ "ばかり",
+ "はかる",
+ "はくしゅ",
+ "はけん",
+ "はこぶ",
+ "はさみ",
+ "はさん",
+ "はしご",
+ "ばしょ",
+ "はしる",
+ "はせる",
+ "ぱそこん",
+ "はそん",
+ "はたん",
+ "はちみつ",
+ "はつおん",
+ "はっかく",
+ "はづき",
+ "はっきり",
+ "はっくつ",
+ "はっけん",
+ "はっこう",
+ "はっさん",
+ "はっしん",
+ "はったつ",
+ "はっちゅう",
+ "はってん",
+ "はっぴょう",
+ "はっぽう",
+ "はなす",
+ "はなび",
+ "はにかむ",
+ "はぶらし",
+ "はみがき",
+ "はむかう",
+ "はめつ",
+ "はやい",
+ "はやし",
+ "はらう",
+ "はろうぃん",
+ "はわい",
+ "はんい",
+ "はんえい",
+ "はんおん",
+ "はんかく",
+ "はんきょう",
+ "ばんぐみ",
+ "はんこ",
+ "はんしゃ",
+ "はんすう",
+ "はんだん",
+ "ぱんち",
+ "ぱんつ",
+ "はんてい",
+ "はんとし",
+ "はんのう",
+ "はんぱ",
+ "はんぶん",
+ "はんぺん",
+ "はんぼうき",
+ "はんめい",
+ "はんらん",
+ "はんろん",
+ "ひいき",
+ "ひうん",
+ "ひえる",
+ "ひかく",
+ "ひかり",
+ "ひかる",
+ "ひかん",
+ "ひくい",
+ "ひけつ",
+ "ひこうき",
+ "ひこく",
+ "ひさい",
+ "ひさしぶり",
+ "ひさん",
+ "びじゅつかん",
+ "ひしょ"
+ });
+ word_map = new std::unordered_map<std::string, uint32_t>;
+ trimmed_word_map = new std::unordered_map<std::string, uint32_t>;
+ language_name = "Japanese";
+ populate_maps();
+ }
+ };
+}
+
+#endif
diff --git a/src/mnemonics/language_base.h b/src/mnemonics/language_base.h
new file mode 100644
index 000000000..3a56a530c
--- /dev/null
+++ b/src/mnemonics/language_base.h
@@ -0,0 +1,131 @@
+// Copyright (c) 2014, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*!
+ * \file language_base.h
+ *
+ * \brief Language Base class for Polymorphism.
+ */
+
+#ifndef LANGUAGE_BASE_H
+#define LANGUAGE_BASE_H
+
+#include <vector>
+#include <unordered_map>
+#include <string>
+
+/*!
+ * \namespace Language
+ * \brief Mnemonic language related namespace.
+ */
+namespace Language
+{
+ const int unique_prefix_length = 4; /*!< Length of the prefix of all words guaranteed to be unique */
+ /*!
+ * \class Base
+ * \brief A base language class which all languages have to inherit from for
+ * Polymorphism.
+ */
+ class Base
+ {
+ protected:
+ std::vector<std::string> *word_list; /*!< A pointer to the array of words */
+ std::unordered_map<std::string, uint32_t> *word_map; /*!< hash table to find word's index */
+ std::unordered_map<std::string, uint32_t> *trimmed_word_map; /*!< hash table to find word's trimmed index */
+ std::string language_name; /*!< Name of language */
+ /*!
+ * \brief Populates the word maps after the list is ready.
+ */
+ void populate_maps()
+ {
+ int ii;
+ std::vector<std::string>::iterator it;
+ for (it = word_list->begin(), ii = 0; it != word_list->end(); it++, ii++)
+ {
+ (*word_map)[*it] = ii;
+ if (it->length() > unique_prefix_length)
+ {
+ (*trimmed_word_map)[it->substr(0, unique_prefix_length)] = ii;
+ }
+ else
+ {
+ (*trimmed_word_map)[*it] = ii;
+ }
+ }
+ }
+ public:
+ Base()
+ {
+ word_list = new std::vector<std::string>;
+ word_map = new std::unordered_map<std::string, uint32_t>;
+ trimmed_word_map = new std::unordered_map<std::string, uint32_t>;
+ }
+ /*!
+ * \brief Returns a pointer to the word list.
+ * \return A pointer to the word list.
+ */
+ const std::vector<std::string>& get_word_list() const
+ {
+ return *word_list;
+ }
+ /*!
+ * \brief Returns a pointer to the word map.
+ * \return A pointer to the word map.
+ */
+ const std::unordered_map<std::string, uint32_t>& get_word_map() const
+ {
+ return *word_map;
+ }
+ /*!
+ * \brief Returns a pointer to the trimmed word map.
+ * \return A pointer to the trimmed word map.
+ */
+ const std::unordered_map<std::string, uint32_t>& get_trimmed_word_map() const
+ {
+ return *trimmed_word_map;
+ }
+ /*!
+ * \brief Returns the name of the language.
+ * \return Name of the language.
+ */
+ std::string get_language_name() const
+ {
+ return language_name;
+ }
+ /*!
+ * \brief Returns the number of unique starting characters to be used for matching.
+ * \return Number of unique starting characters.
+ */
+ std::string get_trim_length() const
+ {
+ return trim_length;
+ }
+ };
+}
+
+#endif
diff --git a/src/mnemonics/old_english.h b/src/mnemonics/old_english.h
new file mode 100644
index 000000000..09ac37e66
--- /dev/null
+++ b/src/mnemonics/old_english.h
@@ -0,0 +1,1692 @@
+// Word list originally created as part of the Electrum project, Copyright (C) 2014 Thomas Voegtlin
+//
+// Copyright (c) 2014, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*!
+ * \file old_english.h
+ *
+ * \brief Old English word list and map.
+ */
+
+#ifndef OLD_ENGLISH_H
+#define OLD_ENGLISH_H
+
+#include <vector>
+#include <unordered_map>
+#include "language_base.h"
+#include <string>
+
+/*!
+ * \namespace Language
+ * \brief Mnemonic language related namespace.
+ */
+namespace Language
+{
+ class OldEnglish: public Base
+ {
+ public:
+ OldEnglish()
+ {
+ word_list = new std::vector<std::string>({
+ "like",
+ "just",
+ "love",
+ "know",
+ "never",
+ "want",
+ "time",
+ "out",
+ "there",
+ "make",
+ "look",
+ "eye",
+ "down",
+ "only",
+ "think",
+ "heart",
+ "back",
+ "then",
+ "into",
+ "about",
+ "more",
+ "away",
+ "still",
+ "them",
+ "take",
+ "thing",
+ "even",
+ "through",
+ "long",
+ "always",
+ "world",
+ "too",
+ "friend",
+ "tell",
+ "try",
+ "hand",
+ "thought",
+ "over",
+ "here",
+ "other",
+ "need",
+ "smile",
+ "again",
+ "much",
+ "cry",
+ "been",
+ "night",
+ "ever",
+ "little",
+ "said",
+ "end",
+ "some",
+ "those",
+ "around",
+ "mind",
+ "people",
+ "girl",
+ "leave",
+ "dream",
+ "left",
+ "turn",
+ "myself",
+ "give",
+ "nothing",
+ "really",
+ "off",
+ "before",
+ "something",
+ "find",
+ "walk",
+ "wish",
+ "good",
+ "once",
+ "place",
+ "ask",
+ "stop",
+ "keep",
+ "watch",
+ "seem",
+ "everything",
+ "wait",
+ "got",
+ "yet",
+ "made",
+ "remember",
+ "start",
+ "alone",
+ "run",
+ "hope",
+ "maybe",
+ "believe",
+ "body",
+ "hate",
+ "after",
+ "close",
+ "talk",
+ "stand",
+ "own",
+ "each",
+ "hurt",
+ "help",
+ "home",
+ "god",
+ "soul",
+ "new",
+ "many",
+ "two",
+ "inside",
+ "should",
+ "true",
+ "first",
+ "fear",
+ "mean",
+ "better",
+ "play",
+ "another",
+ "gone",
+ "change",
+ "use",
+ "wonder",
+ "someone",
+ "hair",
+ "cold",
+ "open",
+ "best",
+ "any",
+ "behind",
+ "happen",
+ "water",
+ "dark",
+ "laugh",
+ "stay",
+ "forever",
+ "name",
+ "work",
+ "show",
+ "sky",
+ "break",
+ "came",
+ "deep",
+ "door",
+ "put",
+ "black",
+ "together",
+ "upon",
+ "happy",
+ "such",
+ "great",
+ "white",
+ "matter",
+ "fill",
+ "past",
+ "please",
+ "burn",
+ "cause",
+ "enough",
+ "touch",
+ "moment",
+ "soon",
+ "voice",
+ "scream",
+ "anything",
+ "stare",
+ "sound",
+ "red",
+ "everyone",
+ "hide",
+ "kiss",
+ "truth",
+ "death",
+ "beautiful",
+ "mine",
+ "blood",
+ "broken",
+ "very",
+ "pass",
+ "next",
+ "forget",
+ "tree",
+ "wrong",
+ "air",
+ "mother",
+ "understand",
+ "lip",
+ "hit",
+ "wall",
+ "memory",
+ "sleep",
+ "free",
+ "high",
+ "realize",
+ "school",
+ "might",
+ "skin",
+ "sweet",
+ "perfect",
+ "blue",
+ "kill",
+ "breath",
+ "dance",
+ "against",
+ "fly",
+ "between",
+ "grow",
+ "strong",
+ "under",
+ "listen",
+ "bring",
+ "sometimes",
+ "speak",
+ "pull",
+ "person",
+ "become",
+ "family",
+ "begin",
+ "ground",
+ "real",
+ "small",
+ "father",
+ "sure",
+ "feet",
+ "rest",
+ "young",
+ "finally",
+ "land",
+ "across",
+ "today",
+ "different",
+ "guy",
+ "line",
+ "fire",
+ "reason",
+ "reach",
+ "second",
+ "slowly",
+ "write",
+ "eat",
+ "smell",
+ "mouth",
+ "step",
+ "learn",
+ "three",
+ "floor",
+ "promise",
+ "breathe",
+ "darkness",
+ "push",
+ "earth",
+ "guess",
+ "save",
+ "song",
+ "above",
+ "along",
+ "both",
+ "color",
+ "house",
+ "almost",
+ "sorry",
+ "anymore",
+ "brother",
+ "okay",
+ "dear",
+ "game",
+ "fade",
+ "already",
+ "apart",
+ "warm",
+ "beauty",
+ "heard",
+ "notice",
+ "question",
+ "shine",
+ "began",
+ "piece",
+ "whole",
+ "shadow",
+ "secret",
+ "street",
+ "within",
+ "finger",
+ "point",
+ "morning",
+ "whisper",
+ "child",
+ "moon",
+ "green",
+ "story",
+ "glass",
+ "kid",
+ "silence",
+ "since",
+ "soft",
+ "yourself",
+ "empty",
+ "shall",
+ "angel",
+ "answer",
+ "baby",
+ "bright",
+ "dad",
+ "path",
+ "worry",
+ "hour",
+ "drop",
+ "follow",
+ "power",
+ "war",
+ "half",
+ "flow",
+ "heaven",
+ "act",
+ "chance",
+ "fact",
+ "least",
+ "tired",
+ "children",
+ "near",
+ "quite",
+ "afraid",
+ "rise",
+ "sea",
+ "taste",
+ "window",
+ "cover",
+ "nice",
+ "trust",
+ "lot",
+ "sad",
+ "cool",
+ "force",
+ "peace",
+ "return",
+ "blind",
+ "easy",
+ "ready",
+ "roll",
+ "rose",
+ "drive",
+ "held",
+ "music",
+ "beneath",
+ "hang",
+ "mom",
+ "paint",
+ "emotion",
+ "quiet",
+ "clear",
+ "cloud",
+ "few",
+ "pretty",
+ "bird",
+ "outside",
+ "paper",
+ "picture",
+ "front",
+ "rock",
+ "simple",
+ "anyone",
+ "meant",
+ "reality",
+ "road",
+ "sense",
+ "waste",
+ "bit",
+ "leaf",
+ "thank",
+ "happiness",
+ "meet",
+ "men",
+ "smoke",
+ "truly",
+ "decide",
+ "self",
+ "age",
+ "book",
+ "form",
+ "alive",
+ "carry",
+ "escape",
+ "damn",
+ "instead",
+ "able",
+ "ice",
+ "minute",
+ "throw",
+ "catch",
+ "leg",
+ "ring",
+ "course",
+ "goodbye",
+ "lead",
+ "poem",
+ "sick",
+ "corner",
+ "desire",
+ "known",
+ "problem",
+ "remind",
+ "shoulder",
+ "suppose",
+ "toward",
+ "wave",
+ "drink",
+ "jump",
+ "woman",
+ "pretend",
+ "sister",
+ "week",
+ "human",
+ "joy",
+ "crack",
+ "grey",
+ "pray",
+ "surprise",
+ "dry",
+ "knee",
+ "less",
+ "search",
+ "bleed",
+ "caught",
+ "clean",
+ "embrace",
+ "future",
+ "king",
+ "son",
+ "sorrow",
+ "chest",
+ "hug",
+ "remain",
+ "sat",
+ "worth",
+ "blow",
+ "daddy",
+ "final",
+ "parent",
+ "tight",
+ "also",
+ "create",
+ "lonely",
+ "safe",
+ "cross",
+ "dress",
+ "evil",
+ "silent",
+ "bone",
+ "fate",
+ "perhaps",
+ "anger",
+ "class",
+ "scar",
+ "snow",
+ "tiny",
+ "tonight",
+ "continue",
+ "control",
+ "dog",
+ "edge",
+ "mirror",
+ "month",
+ "suddenly",
+ "comfort",
+ "given",
+ "loud",
+ "quickly",
+ "gaze",
+ "plan",
+ "rush",
+ "stone",
+ "town",
+ "battle",
+ "ignore",
+ "spirit",
+ "stood",
+ "stupid",
+ "yours",
+ "brown",
+ "build",
+ "dust",
+ "hey",
+ "kept",
+ "pay",
+ "phone",
+ "twist",
+ "although",
+ "ball",
+ "beyond",
+ "hidden",
+ "nose",
+ "taken",
+ "fail",
+ "float",
+ "pure",
+ "somehow",
+ "wash",
+ "wrap",
+ "angry",
+ "cheek",
+ "creature",
+ "forgotten",
+ "heat",
+ "rip",
+ "single",
+ "space",
+ "special",
+ "weak",
+ "whatever",
+ "yell",
+ "anyway",
+ "blame",
+ "job",
+ "choose",
+ "country",
+ "curse",
+ "drift",
+ "echo",
+ "figure",
+ "grew",
+ "laughter",
+ "neck",
+ "suffer",
+ "worse",
+ "yeah",
+ "disappear",
+ "foot",
+ "forward",
+ "knife",
+ "mess",
+ "somewhere",
+ "stomach",
+ "storm",
+ "beg",
+ "idea",
+ "lift",
+ "offer",
+ "breeze",
+ "field",
+ "five",
+ "often",
+ "simply",
+ "stuck",
+ "win",
+ "allow",
+ "confuse",
+ "enjoy",
+ "except",
+ "flower",
+ "seek",
+ "strength",
+ "calm",
+ "grin",
+ "gun",
+ "heavy",
+ "hill",
+ "large",
+ "ocean",
+ "shoe",
+ "sigh",
+ "straight",
+ "summer",
+ "tongue",
+ "accept",
+ "crazy",
+ "everyday",
+ "exist",
+ "grass",
+ "mistake",
+ "sent",
+ "shut",
+ "surround",
+ "table",
+ "ache",
+ "brain",
+ "destroy",
+ "heal",
+ "nature",
+ "shout",
+ "sign",
+ "stain",
+ "choice",
+ "doubt",
+ "glance",
+ "glow",
+ "mountain",
+ "queen",
+ "stranger",
+ "throat",
+ "tomorrow",
+ "city",
+ "either",
+ "fish",
+ "flame",
+ "rather",
+ "shape",
+ "spin",
+ "spread",
+ "ash",
+ "distance",
+ "finish",
+ "image",
+ "imagine",
+ "important",
+ "nobody",
+ "shatter",
+ "warmth",
+ "became",
+ "feed",
+ "flesh",
+ "funny",
+ "lust",
+ "shirt",
+ "trouble",
+ "yellow",
+ "attention",
+ "bare",
+ "bite",
+ "money",
+ "protect",
+ "amaze",
+ "appear",
+ "born",
+ "choke",
+ "completely",
+ "daughter",
+ "fresh",
+ "friendship",
+ "gentle",
+ "probably",
+ "six",
+ "deserve",
+ "expect",
+ "grab",
+ "middle",
+ "nightmare",
+ "river",
+ "thousand",
+ "weight",
+ "worst",
+ "wound",
+ "barely",
+ "bottle",
+ "cream",
+ "regret",
+ "relationship",
+ "stick",
+ "test",
+ "crush",
+ "endless",
+ "fault",
+ "itself",
+ "rule",
+ "spill",
+ "art",
+ "circle",
+ "join",
+ "kick",
+ "mask",
+ "master",
+ "passion",
+ "quick",
+ "raise",
+ "smooth",
+ "unless",
+ "wander",
+ "actually",
+ "broke",
+ "chair",
+ "deal",
+ "favorite",
+ "gift",
+ "note",
+ "number",
+ "sweat",
+ "box",
+ "chill",
+ "clothes",
+ "lady",
+ "mark",
+ "park",
+ "poor",
+ "sadness",
+ "tie",
+ "animal",
+ "belong",
+ "brush",
+ "consume",
+ "dawn",
+ "forest",
+ "innocent",
+ "pen",
+ "pride",
+ "stream",
+ "thick",
+ "clay",
+ "complete",
+ "count",
+ "draw",
+ "faith",
+ "press",
+ "silver",
+ "struggle",
+ "surface",
+ "taught",
+ "teach",
+ "wet",
+ "bless",
+ "chase",
+ "climb",
+ "enter",
+ "letter",
+ "melt",
+ "metal",
+ "movie",
+ "stretch",
+ "swing",
+ "vision",
+ "wife",
+ "beside",
+ "crash",
+ "forgot",
+ "guide",
+ "haunt",
+ "joke",
+ "knock",
+ "plant",
+ "pour",
+ "prove",
+ "reveal",
+ "steal",
+ "stuff",
+ "trip",
+ "wood",
+ "wrist",
+ "bother",
+ "bottom",
+ "crawl",
+ "crowd",
+ "fix",
+ "forgive",
+ "frown",
+ "grace",
+ "loose",
+ "lucky",
+ "party",
+ "release",
+ "surely",
+ "survive",
+ "teacher",
+ "gently",
+ "grip",
+ "speed",
+ "suicide",
+ "travel",
+ "treat",
+ "vein",
+ "written",
+ "cage",
+ "chain",
+ "conversation",
+ "date",
+ "enemy",
+ "however",
+ "interest",
+ "million",
+ "page",
+ "pink",
+ "proud",
+ "sway",
+ "themselves",
+ "winter",
+ "church",
+ "cruel",
+ "cup",
+ "demon",
+ "experience",
+ "freedom",
+ "pair",
+ "pop",
+ "purpose",
+ "respect",
+ "shoot",
+ "softly",
+ "state",
+ "strange",
+ "bar",
+ "birth",
+ "curl",
+ "dirt",
+ "excuse",
+ "lord",
+ "lovely",
+ "monster",
+ "order",
+ "pack",
+ "pants",
+ "pool",
+ "scene",
+ "seven",
+ "shame",
+ "slide",
+ "ugly",
+ "among",
+ "blade",
+ "blonde",
+ "closet",
+ "creek",
+ "deny",
+ "drug",
+ "eternity",
+ "gain",
+ "grade",
+ "handle",
+ "key",
+ "linger",
+ "pale",
+ "prepare",
+ "swallow",
+ "swim",
+ "tremble",
+ "wheel",
+ "won",
+ "cast",
+ "cigarette",
+ "claim",
+ "college",
+ "direction",
+ "dirty",
+ "gather",
+ "ghost",
+ "hundred",
+ "loss",
+ "lung",
+ "orange",
+ "present",
+ "swear",
+ "swirl",
+ "twice",
+ "wild",
+ "bitter",
+ "blanket",
+ "doctor",
+ "everywhere",
+ "flash",
+ "grown",
+ "knowledge",
+ "numb",
+ "pressure",
+ "radio",
+ "repeat",
+ "ruin",
+ "spend",
+ "unknown",
+ "buy",
+ "clock",
+ "devil",
+ "early",
+ "false",
+ "fantasy",
+ "pound",
+ "precious",
+ "refuse",
+ "sheet",
+ "teeth",
+ "welcome",
+ "add",
+ "ahead",
+ "block",
+ "bury",
+ "caress",
+ "content",
+ "depth",
+ "despite",
+ "distant",
+ "marry",
+ "purple",
+ "threw",
+ "whenever",
+ "bomb",
+ "dull",
+ "easily",
+ "grasp",
+ "hospital",
+ "innocence",
+ "normal",
+ "receive",
+ "reply",
+ "rhyme",
+ "shade",
+ "someday",
+ "sword",
+ "toe",
+ "visit",
+ "asleep",
+ "bought",
+ "center",
+ "consider",
+ "flat",
+ "hero",
+ "history",
+ "ink",
+ "insane",
+ "muscle",
+ "mystery",
+ "pocket",
+ "reflection",
+ "shove",
+ "silently",
+ "smart",
+ "soldier",
+ "spot",
+ "stress",
+ "train",
+ "type",
+ "view",
+ "whether",
+ "bus",
+ "energy",
+ "explain",
+ "holy",
+ "hunger",
+ "inch",
+ "magic",
+ "mix",
+ "noise",
+ "nowhere",
+ "prayer",
+ "presence",
+ "shock",
+ "snap",
+ "spider",
+ "study",
+ "thunder",
+ "trail",
+ "admit",
+ "agree",
+ "bag",
+ "bang",
+ "bound",
+ "butterfly",
+ "cute",
+ "exactly",
+ "explode",
+ "familiar",
+ "fold",
+ "further",
+ "pierce",
+ "reflect",
+ "scent",
+ "selfish",
+ "sharp",
+ "sink",
+ "spring",
+ "stumble",
+ "universe",
+ "weep",
+ "women",
+ "wonderful",
+ "action",
+ "ancient",
+ "attempt",
+ "avoid",
+ "birthday",
+ "branch",
+ "chocolate",
+ "core",
+ "depress",
+ "drunk",
+ "especially",
+ "focus",
+ "fruit",
+ "honest",
+ "match",
+ "palm",
+ "perfectly",
+ "pillow",
+ "pity",
+ "poison",
+ "roar",
+ "shift",
+ "slightly",
+ "thump",
+ "truck",
+ "tune",
+ "twenty",
+ "unable",
+ "wipe",
+ "wrote",
+ "coat",
+ "constant",
+ "dinner",
+ "drove",
+ "egg",
+ "eternal",
+ "flight",
+ "flood",
+ "frame",
+ "freak",
+ "gasp",
+ "glad",
+ "hollow",
+ "motion",
+ "peer",
+ "plastic",
+ "root",
+ "screen",
+ "season",
+ "sting",
+ "strike",
+ "team",
+ "unlike",
+ "victim",
+ "volume",
+ "warn",
+ "weird",
+ "attack",
+ "await",
+ "awake",
+ "built",
+ "charm",
+ "crave",
+ "despair",
+ "fought",
+ "grant",
+ "grief",
+ "horse",
+ "limit",
+ "message",
+ "ripple",
+ "sanity",
+ "scatter",
+ "serve",
+ "split",
+ "string",
+ "trick",
+ "annoy",
+ "blur",
+ "boat",
+ "brave",
+ "clearly",
+ "cling",
+ "connect",
+ "fist",
+ "forth",
+ "imagination",
+ "iron",
+ "jock",
+ "judge",
+ "lesson",
+ "milk",
+ "misery",
+ "nail",
+ "naked",
+ "ourselves",
+ "poet",
+ "possible",
+ "princess",
+ "sail",
+ "size",
+ "snake",
+ "society",
+ "stroke",
+ "torture",
+ "toss",
+ "trace",
+ "wise",
+ "bloom",
+ "bullet",
+ "cell",
+ "check",
+ "cost",
+ "darling",
+ "during",
+ "footstep",
+ "fragile",
+ "hallway",
+ "hardly",
+ "horizon",
+ "invisible",
+ "journey",
+ "midnight",
+ "mud",
+ "nod",
+ "pause",
+ "relax",
+ "shiver",
+ "sudden",
+ "value",
+ "youth",
+ "abuse",
+ "admire",
+ "blink",
+ "breast",
+ "bruise",
+ "constantly",
+ "couple",
+ "creep",
+ "curve",
+ "difference",
+ "dumb",
+ "emptiness",
+ "gotta",
+ "honor",
+ "plain",
+ "planet",
+ "recall",
+ "rub",
+ "ship",
+ "slam",
+ "soar",
+ "somebody",
+ "tightly",
+ "weather",
+ "adore",
+ "approach",
+ "bond",
+ "bread",
+ "burst",
+ "candle",
+ "coffee",
+ "cousin",
+ "crime",
+ "desert",
+ "flutter",
+ "frozen",
+ "grand",
+ "heel",
+ "hello",
+ "language",
+ "level",
+ "movement",
+ "pleasure",
+ "powerful",
+ "random",
+ "rhythm",
+ "settle",
+ "silly",
+ "slap",
+ "sort",
+ "spoken",
+ "steel",
+ "threaten",
+ "tumble",
+ "upset",
+ "aside",
+ "awkward",
+ "bee",
+ "blank",
+ "board",
+ "button",
+ "card",
+ "carefully",
+ "complain",
+ "crap",
+ "deeply",
+ "discover",
+ "drag",
+ "dread",
+ "effort",
+ "entire",
+ "fairy",
+ "giant",
+ "gotten",
+ "greet",
+ "illusion",
+ "jeans",
+ "leap",
+ "liquid",
+ "march",
+ "mend",
+ "nervous",
+ "nine",
+ "replace",
+ "rope",
+ "spine",
+ "stole",
+ "terror",
+ "accident",
+ "apple",
+ "balance",
+ "boom",
+ "childhood",
+ "collect",
+ "demand",
+ "depression",
+ "eventually",
+ "faint",
+ "glare",
+ "goal",
+ "group",
+ "honey",
+ "kitchen",
+ "laid",
+ "limb",
+ "machine",
+ "mere",
+ "mold",
+ "murder",
+ "nerve",
+ "painful",
+ "poetry",
+ "prince",
+ "rabbit",
+ "shelter",
+ "shore",
+ "shower",
+ "soothe",
+ "stair",
+ "steady",
+ "sunlight",
+ "tangle",
+ "tease",
+ "treasure",
+ "uncle",
+ "begun",
+ "bliss",
+ "canvas",
+ "cheer",
+ "claw",
+ "clutch",
+ "commit",
+ "crimson",
+ "crystal",
+ "delight",
+ "doll",
+ "existence",
+ "express",
+ "fog",
+ "football",
+ "gay",
+ "goose",
+ "guard",
+ "hatred",
+ "illuminate",
+ "mass",
+ "math",
+ "mourn",
+ "rich",
+ "rough",
+ "skip",
+ "stir",
+ "student",
+ "style",
+ "support",
+ "thorn",
+ "tough",
+ "yard",
+ "yearn",
+ "yesterday",
+ "advice",
+ "appreciate",
+ "autumn",
+ "bank",
+ "beam",
+ "bowl",
+ "capture",
+ "carve",
+ "collapse",
+ "confusion",
+ "creation",
+ "dove",
+ "feather",
+ "girlfriend",
+ "glory",
+ "government",
+ "harsh",
+ "hop",
+ "inner",
+ "loser",
+ "moonlight",
+ "neighbor",
+ "neither",
+ "peach",
+ "pig",
+ "praise",
+ "screw",
+ "shield",
+ "shimmer",
+ "sneak",
+ "stab",
+ "subject",
+ "throughout",
+ "thrown",
+ "tower",
+ "twirl",
+ "wow",
+ "army",
+ "arrive",
+ "bathroom",
+ "bump",
+ "cease",
+ "cookie",
+ "couch",
+ "courage",
+ "dim",
+ "guilt",
+ "howl",
+ "hum",
+ "husband",
+ "insult",
+ "led",
+ "lunch",
+ "mock",
+ "mostly",
+ "natural",
+ "nearly",
+ "needle",
+ "nerd",
+ "peaceful",
+ "perfection",
+ "pile",
+ "price",
+ "remove",
+ "roam",
+ "sanctuary",
+ "serious",
+ "shiny",
+ "shook",
+ "sob",
+ "stolen",
+ "tap",
+ "vain",
+ "void",
+ "warrior",
+ "wrinkle",
+ "affection",
+ "apologize",
+ "blossom",
+ "bounce",
+ "bridge",
+ "cheap",
+ "crumble",
+ "decision",
+ "descend",
+ "desperately",
+ "dig",
+ "dot",
+ "flip",
+ "frighten",
+ "heartbeat",
+ "huge",
+ "lazy",
+ "lick",
+ "odd",
+ "opinion",
+ "process",
+ "puzzle",
+ "quietly",
+ "retreat",
+ "score",
+ "sentence",
+ "separate",
+ "situation",
+ "skill",
+ "soak",
+ "square",
+ "stray",
+ "taint",
+ "task",
+ "tide",
+ "underneath",
+ "veil",
+ "whistle",
+ "anywhere",
+ "bedroom",
+ "bid",
+ "bloody",
+ "burden",
+ "careful",
+ "compare",
+ "concern",
+ "curtain",
+ "decay",
+ "defeat",
+ "describe",
+ "double",
+ "dreamer",
+ "driver",
+ "dwell",
+ "evening",
+ "flare",
+ "flicker",
+ "grandma",
+ "guitar",
+ "harm",
+ "horrible",
+ "hungry",
+ "indeed",
+ "lace",
+ "melody",
+ "monkey",
+ "nation",
+ "object",
+ "obviously",
+ "rainbow",
+ "salt",
+ "scratch",
+ "shown",
+ "shy",
+ "stage",
+ "stun",
+ "third",
+ "tickle",
+ "useless",
+ "weakness",
+ "worship",
+ "worthless",
+ "afternoon",
+ "beard",
+ "boyfriend",
+ "bubble",
+ "busy",
+ "certain",
+ "chin",
+ "concrete",
+ "desk",
+ "diamond",
+ "doom",
+ "drawn",
+ "due",
+ "felicity",
+ "freeze",
+ "frost",
+ "garden",
+ "glide",
+ "harmony",
+ "hopefully",
+ "hunt",
+ "jealous",
+ "lightning",
+ "mama",
+ "mercy",
+ "peel",
+ "physical",
+ "position",
+ "pulse",
+ "punch",
+ "quit",
+ "rant",
+ "respond",
+ "salty",
+ "sane",
+ "satisfy",
+ "savior",
+ "sheep",
+ "slept",
+ "social",
+ "sport",
+ "tuck",
+ "utter",
+ "valley",
+ "wolf",
+ "aim",
+ "alas",
+ "alter",
+ "arrow",
+ "awaken",
+ "beaten",
+ "belief",
+ "brand",
+ "ceiling",
+ "cheese",
+ "clue",
+ "confidence",
+ "connection",
+ "daily",
+ "disguise",
+ "eager",
+ "erase",
+ "essence",
+ "everytime",
+ "expression",
+ "fan",
+ "flag",
+ "flirt",
+ "foul",
+ "fur",
+ "giggle",
+ "glorious",
+ "ignorance",
+ "law",
+ "lifeless",
+ "measure",
+ "mighty",
+ "muse",
+ "north",
+ "opposite",
+ "paradise",
+ "patience",
+ "patient",
+ "pencil",
+ "petal",
+ "plate",
+ "ponder",
+ "possibly",
+ "practice",
+ "slice",
+ "spell",
+ "stock",
+ "strife",
+ "strip",
+ "suffocate",
+ "suit",
+ "tender",
+ "tool",
+ "trade",
+ "velvet",
+ "verse",
+ "waist",
+ "witch",
+ "aunt",
+ "bench",
+ "bold",
+ "cap",
+ "certainly",
+ "click",
+ "companion",
+ "creator",
+ "dart",
+ "delicate",
+ "determine",
+ "dish",
+ "dragon",
+ "drama",
+ "drum",
+ "dude",
+ "everybody",
+ "feast",
+ "forehead",
+ "former",
+ "fright",
+ "fully",
+ "gas",
+ "hook",
+ "hurl",
+ "invite",
+ "juice",
+ "manage",
+ "moral",
+ "possess",
+ "raw",
+ "rebel",
+ "royal",
+ "scale",
+ "scary",
+ "several",
+ "slight",
+ "stubborn",
+ "swell",
+ "talent",
+ "tea",
+ "terrible",
+ "thread",
+ "torment",
+ "trickle",
+ "usually",
+ "vast",
+ "violence",
+ "weave",
+ "acid",
+ "agony",
+ "ashamed",
+ "awe",
+ "belly",
+ "blend",
+ "blush",
+ "character",
+ "cheat",
+ "common",
+ "company",
+ "coward",
+ "creak",
+ "danger",
+ "deadly",
+ "defense",
+ "define",
+ "depend",
+ "desperate",
+ "destination",
+ "dew",
+ "duck",
+ "dusty",
+ "embarrass",
+ "engine",
+ "example",
+ "explore",
+ "foe",
+ "freely",
+ "frustrate",
+ "generation",
+ "glove",
+ "guilty",
+ "health",
+ "hurry",
+ "idiot",
+ "impossible",
+ "inhale",
+ "jaw",
+ "kingdom",
+ "mention",
+ "mist",
+ "moan",
+ "mumble",
+ "mutter",
+ "observe",
+ "ode",
+ "pathetic",
+ "pattern",
+ "pie",
+ "prefer",
+ "puff",
+ "rape",
+ "rare",
+ "revenge",
+ "rude",
+ "scrape",
+ "spiral",
+ "squeeze",
+ "strain",
+ "sunset",
+ "suspend",
+ "sympathy",
+ "thigh",
+ "throne",
+ "total",
+ "unseen",
+ "weapon",
+ "weary"
+ });
+ word_map = new std::unordered_map<std::string, uint32_t>;
+ trimmed_word_map = new std::unordered_map<std::string, uint32_t>;
+ language_name = "OldEnglish";
+ populate_maps();
+ }
+ };
+}
+
+#endif
diff --git a/src/mnemonics/portuguese.h b/src/mnemonics/portuguese.h
new file mode 100644
index 000000000..c040a0415
--- /dev/null
+++ b/src/mnemonics/portuguese.h
@@ -0,0 +1,1690 @@
+// Copyright (c) 2014, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*!
+ * \file portuguese.h
+ *
+ * \brief Portuguese word list and map.
+ */
+
+#ifndef PORTUGUESE_H
+#define PORTUGUESE_H
+
+#include <vector>
+#include <unordered_map>
+#include "language_base.h"
+#include <string>
+
+/*!
+ * \namespace Language
+ * \brief Mnemonic language related namespace.
+ */
+namespace Language
+{
+ class Portuguese: public Base
+ {
+ public:
+ Portuguese()
+ {
+ word_list = new std::vector<std::string>({
+ "abaular",
+ "abdominal",
+ "abeto",
+ "abissinio",
+ "abjeto",
+ "ablucao",
+ "abnegar",
+ "abotoar",
+ "abrutalhar",
+ "absurdo",
+ "abutre",
+ "acautelar",
+ "accessorios",
+ "acetona",
+ "achocolatado",
+ "acirrar",
+ "acne",
+ "acovardar",
+ "acrostico",
+ "actinomicete",
+ "acustico",
+ "adaptavel",
+ "adeus",
+ "adivinho",
+ "adjunto",
+ "admoestar",
+ "adnominal",
+ "adotivo",
+ "adquirir",
+ "adriatico",
+ "adsorcao",
+ "adutora",
+ "advogar",
+ "aerossol",
+ "afazeres",
+ "afetuoso",
+ "afixo",
+ "afluir",
+ "afortunar",
+ "afrouxar",
+ "aftosa",
+ "afunilar",
+ "agentes",
+ "agito",
+ "aglutinar",
+ "aiatola",
+ "aimore",
+ "aino",
+ "aipo",
+ "airoso",
+ "ajeitar",
+ "ajoelhar",
+ "ajudante",
+ "ajuste",
+ "alazao",
+ "albumina",
+ "alcunha",
+ "alegria",
+ "alexandre",
+ "alforriar",
+ "alguns",
+ "alhures",
+ "alivio",
+ "almoxarife",
+ "alotropico",
+ "alpiste",
+ "alquimista",
+ "alsaciano",
+ "altura",
+ "aluviao",
+ "alvura",
+ "amazonico",
+ "ambulatorio",
+ "ametodico",
+ "amizades",
+ "amniotico",
+ "amovivel",
+ "amurada",
+ "anatomico",
+ "ancorar",
+ "anexo",
+ "anfora",
+ "aniversario",
+ "anjo",
+ "anotar",
+ "ansioso",
+ "anturio",
+ "anuviar",
+ "anverso",
+ "anzol",
+ "aonde",
+ "apaziguar",
+ "apito",
+ "aplicavel",
+ "apoteotico",
+ "aprimorar",
+ "aprumo",
+ "apto",
+ "apuros",
+ "aquoso",
+ "arauto",
+ "arbusto",
+ "arduo",
+ "aresta",
+ "arfar",
+ "arguto",
+ "aritmetico",
+ "arlequim",
+ "armisticio",
+ "aromatizar",
+ "arpoar",
+ "arquivo",
+ "arrumar",
+ "arsenio",
+ "arturiano",
+ "aruaque",
+ "arvores",
+ "asbesto",
+ "ascorbico",
+ "aspirina",
+ "asqueroso",
+ "assustar",
+ "astuto",
+ "atazanar",
+ "ativo",
+ "atletismo",
+ "atmosferico",
+ "atormentar",
+ "atroz",
+ "aturdir",
+ "audivel",
+ "auferir",
+ "augusto",
+ "aula",
+ "aumento",
+ "aurora",
+ "autuar",
+ "avatar",
+ "avexar",
+ "avizinhar",
+ "avolumar",
+ "avulso",
+ "axiomatico",
+ "azerbaijano",
+ "azimute",
+ "azoto",
+ "azulejo",
+ "bacteriologista",
+ "badulaque",
+ "baforada",
+ "baixote",
+ "bajular",
+ "balzaquiana",
+ "bambuzal",
+ "banzo",
+ "baoba",
+ "baqueta",
+ "barulho",
+ "bastonete",
+ "batuta",
+ "bauxita",
+ "bavaro",
+ "bazuca",
+ "bcrepuscular",
+ "beato",
+ "beduino",
+ "begonia",
+ "behaviorista",
+ "beisebol",
+ "belzebu",
+ "bemol",
+ "benzido",
+ "beocio",
+ "bequer",
+ "berro",
+ "besuntar",
+ "betume",
+ "bexiga",
+ "bezerro",
+ "biatlon",
+ "biboca",
+ "bicuspide",
+ "bidirecional",
+ "bienio",
+ "bifurcar",
+ "bigorna",
+ "bijuteria",
+ "bimotor",
+ "binormal",
+ "bioxido",
+ "bipolarizacao",
+ "biquini",
+ "birutice",
+ "bisturi",
+ "bituca",
+ "biunivoco",
+ "bivalve",
+ "bizarro",
+ "blasfemo",
+ "blenorreia",
+ "blindar",
+ "bloqueio",
+ "blusao",
+ "boazuda",
+ "bofete",
+ "bojudo",
+ "bolso",
+ "bombordo",
+ "bonzo",
+ "botina",
+ "boquiaberto",
+ "bostoniano",
+ "botulismo",
+ "bourbon",
+ "bovino",
+ "boximane",
+ "bravura",
+ "brevidade",
+ "britar",
+ "broxar",
+ "bruno",
+ "bruxuleio",
+ "bubonico",
+ "bucolico",
+ "buda",
+ "budista",
+ "bueiro",
+ "buffer",
+ "bugre",
+ "bujao",
+ "bumerangue",
+ "burundines",
+ "busto",
+ "butique",
+ "buzios",
+ "caatinga",
+ "cabuqui",
+ "cacunda",
+ "cafuzo",
+ "cajueiro",
+ "camurca",
+ "canudo",
+ "caquizeiro",
+ "carvoeiro",
+ "casulo",
+ "catuaba",
+ "cauterizar",
+ "cebolinha",
+ "cedula",
+ "ceifeiro",
+ "celulose",
+ "cerzir",
+ "cesto",
+ "cetro",
+ "ceus",
+ "cevar",
+ "chavena",
+ "cheroqui",
+ "chita",
+ "chovido",
+ "chuvoso",
+ "ciatico",
+ "cibernetico",
+ "cicuta",
+ "cidreira",
+ "cientistas",
+ "cifrar",
+ "cigarro",
+ "cilio",
+ "cimo",
+ "cinzento",
+ "cioso",
+ "cipriota",
+ "cirurgico",
+ "cisto",
+ "citrico",
+ "ciumento",
+ "civismo",
+ "clavicula",
+ "clero",
+ "clitoris",
+ "cluster",
+ "coaxial",
+ "cobrir",
+ "cocota",
+ "codorniz",
+ "coexistir",
+ "cogumelo",
+ "coito",
+ "colusao",
+ "compaixao",
+ "comutativo",
+ "contentamento",
+ "convulsivo",
+ "coordenativa",
+ "coquetel",
+ "correto",
+ "corvo",
+ "costureiro",
+ "cotovia",
+ "covil",
+ "cozinheiro",
+ "cretino",
+ "cristo",
+ "crivo",
+ "crotalo",
+ "cruzes",
+ "cubo",
+ "cucuia",
+ "cueiro",
+ "cuidar",
+ "cujo",
+ "cultural",
+ "cunilingua",
+ "cupula",
+ "curvo",
+ "custoso",
+ "cutucar",
+ "czarismo",
+ "dablio",
+ "dacota",
+ "dados",
+ "daguerreotipo",
+ "daiquiri",
+ "daltonismo",
+ "damista",
+ "dantesco",
+ "daquilo",
+ "darwinista",
+ "dasein",
+ "dativo",
+ "deao",
+ "debutantes",
+ "decurso",
+ "deduzir",
+ "defunto",
+ "degustar",
+ "dejeto",
+ "deltoide",
+ "demover",
+ "denunciar",
+ "deputado",
+ "deque",
+ "dervixe",
+ "desvirtuar",
+ "deturpar",
+ "deuteronomio",
+ "devoto",
+ "dextrose",
+ "dezoito",
+ "diatribe",
+ "dicotomico",
+ "didatico",
+ "dietista",
+ "difuso",
+ "digressao",
+ "diluvio",
+ "diminuto",
+ "dinheiro",
+ "dinossauro",
+ "dioxido",
+ "diplomatico",
+ "dique",
+ "dirimivel",
+ "disturbio",
+ "diurno",
+ "divulgar",
+ "dizivel",
+ "doar",
+ "dobro",
+ "docura",
+ "dodoi",
+ "doer",
+ "dogue",
+ "doloso",
+ "domo",
+ "donzela",
+ "doping",
+ "dorsal",
+ "dossie",
+ "dote",
+ "doutro",
+ "doze",
+ "dravidico",
+ "dreno",
+ "driver",
+ "dropes",
+ "druso",
+ "dubnio",
+ "ducto",
+ "dueto",
+ "dulija",
+ "dundum",
+ "duodeno",
+ "duquesa",
+ "durou",
+ "duvidoso",
+ "duzia",
+ "ebano",
+ "ebrio",
+ "eburneo",
+ "echarpe",
+ "eclusa",
+ "ecossistema",
+ "ectoplasma",
+ "ecumenismo",
+ "eczema",
+ "eden",
+ "editorial",
+ "edredom",
+ "edulcorar",
+ "efetuar",
+ "efigie",
+ "efluvio",
+ "egiptologo",
+ "egresso",
+ "egua",
+ "einsteiniano",
+ "eira",
+ "eivar",
+ "eixos",
+ "ejetar",
+ "elastomero",
+ "eldorado",
+ "elixir",
+ "elmo",
+ "eloquente",
+ "elucidativo",
+ "emaranhar",
+ "embutir",
+ "emerito",
+ "emfa",
+ "emitir",
+ "emotivo",
+ "empuxo",
+ "emulsao",
+ "enamorar",
+ "encurvar",
+ "enduro",
+ "enevoar",
+ "enfurnar",
+ "enguico",
+ "enho",
+ "enigmista",
+ "enlutar",
+ "enormidade",
+ "enpreendimento",
+ "enquanto",
+ "enriquecer",
+ "enrugar",
+ "entusiastico",
+ "enunciar",
+ "envolvimento",
+ "enxuto",
+ "enzimatico",
+ "eolico",
+ "epiteto",
+ "epoxi",
+ "epura",
+ "equivoco",
+ "erario",
+ "erbio",
+ "ereto",
+ "erguido",
+ "erisipela",
+ "ermo",
+ "erotizar",
+ "erros",
+ "erupcao",
+ "ervilha",
+ "esburacar",
+ "escutar",
+ "esfuziante",
+ "esguio",
+ "esloveno",
+ "esmurrar",
+ "esoterismo",
+ "esperanca",
+ "espirito",
+ "espurio",
+ "essencialmente",
+ "esturricar",
+ "esvoacar",
+ "etario",
+ "eterno",
+ "etiquetar",
+ "etnologo",
+ "etos",
+ "etrusco",
+ "euclidiano",
+ "euforico",
+ "eugenico",
+ "eunuco",
+ "europio",
+ "eustaquio",
+ "eutanasia",
+ "evasivo",
+ "eventualidade",
+ "evitavel",
+ "evoluir",
+ "exaustor",
+ "excursionista",
+ "exercito",
+ "exfoliado",
+ "exito",
+ "exotico",
+ "expurgo",
+ "exsudar",
+ "extrusora",
+ "exumar",
+ "fabuloso",
+ "facultativo",
+ "fado",
+ "fagulha",
+ "faixas",
+ "fajuto",
+ "faltoso",
+ "famoso",
+ "fanzine",
+ "fapesp",
+ "faquir",
+ "fartura",
+ "fastio",
+ "faturista",
+ "fausto",
+ "favorito",
+ "faxineira",
+ "fazer",
+ "fealdade",
+ "febril",
+ "fecundo",
+ "fedorento",
+ "feerico",
+ "feixe",
+ "felicidade",
+ "felipe",
+ "feltro",
+ "femur",
+ "fenotipo",
+ "fervura",
+ "festivo",
+ "feto",
+ "feudo",
+ "fevereiro",
+ "fezinha",
+ "fiasco",
+ "fibra",
+ "ficticio",
+ "fiduciario",
+ "fiesp",
+ "fifa",
+ "figurino",
+ "fijiano",
+ "filtro",
+ "finura",
+ "fiorde",
+ "fiquei",
+ "firula",
+ "fissurar",
+ "fitoteca",
+ "fivela",
+ "fixo",
+ "flavio",
+ "flexor",
+ "flibusteiro",
+ "flotilha",
+ "fluxograma",
+ "fobos",
+ "foco",
+ "fofura",
+ "foguista",
+ "foie",
+ "foliculo",
+ "fominha",
+ "fonte",
+ "forum",
+ "fosso",
+ "fotossintese",
+ "foxtrote",
+ "fraudulento",
+ "frevo",
+ "frivolo",
+ "frouxo",
+ "frutose",
+ "fuba",
+ "fucsia",
+ "fugitivo",
+ "fuinha",
+ "fujao",
+ "fulustreco",
+ "fumo",
+ "funileiro",
+ "furunculo",
+ "fustigar",
+ "futurologo",
+ "fuxico",
+ "fuzue",
+ "gabriel",
+ "gado",
+ "gaelico",
+ "gafieira",
+ "gaguejo",
+ "gaivota",
+ "gajo",
+ "galvanoplastico",
+ "gamo",
+ "ganso",
+ "garrucha",
+ "gastronomo",
+ "gatuno",
+ "gaussiano",
+ "gaviao",
+ "gaxeta",
+ "gazeteiro",
+ "gear",
+ "geiser",
+ "geminiano",
+ "generoso",
+ "genuino",
+ "geossinclinal",
+ "gerundio",
+ "gestual",
+ "getulista",
+ "gibi",
+ "gigolo",
+ "gilete",
+ "ginseng",
+ "giroscopio",
+ "glaucio",
+ "glacial",
+ "gleba",
+ "glifo",
+ "glote",
+ "glutonia",
+ "gnostico",
+ "goela",
+ "gogo",
+ "goitaca",
+ "golpista",
+ "gomo",
+ "gonzo",
+ "gorro",
+ "gostou",
+ "goticula",
+ "gourmet",
+ "governo",
+ "gozo",
+ "graxo",
+ "grevista",
+ "grito",
+ "grotesco",
+ "gruta",
+ "guaxinim",
+ "gude",
+ "gueto",
+ "guizo",
+ "guloso",
+ "gume",
+ "guru",
+ "gustativo",
+ "gustavo",
+ "gutural",
+ "habitue",
+ "haitiano",
+ "halterofilista",
+ "hamburguer",
+ "hanseniase",
+ "happening",
+ "harpista",
+ "hastear",
+ "haveres",
+ "hebreu",
+ "hectometro",
+ "hedonista",
+ "hegira",
+ "helena",
+ "helminto",
+ "hemorroidas",
+ "henrique",
+ "heptassilabo",
+ "hertziano",
+ "hesitar",
+ "heterossexual",
+ "heuristico",
+ "hexagono",
+ "hiato",
+ "hibrido",
+ "hidrostatico",
+ "hieroglifo",
+ "hifenizar",
+ "higienizar",
+ "hilario",
+ "himen",
+ "hino",
+ "hippie",
+ "hirsuto",
+ "historiografia",
+ "hitlerista",
+ "hodometro",
+ "hoje",
+ "holograma",
+ "homus",
+ "honroso",
+ "hoquei",
+ "horto",
+ "hostilizar",
+ "hotentote",
+ "huguenote",
+ "humilde",
+ "huno",
+ "hurra",
+ "hutu",
+ "iaia",
+ "ialorixa",
+ "iambico",
+ "iansa",
+ "iaque",
+ "iara",
+ "iatista",
+ "iberico",
+ "ibis",
+ "icar",
+ "iceberg",
+ "icosagono",
+ "idade",
+ "ideologo",
+ "idiotice",
+ "idoso",
+ "iemenita",
+ "iene",
+ "igarape",
+ "iglu",
+ "ignorar",
+ "igreja",
+ "iguaria",
+ "iidiche",
+ "ilativo",
+ "iletrado",
+ "ilharga",
+ "ilimitado",
+ "ilogismo",
+ "ilustrissimo",
+ "imaturo",
+ "imbuzeiro",
+ "imerso",
+ "imitavel",
+ "imovel",
+ "imputar",
+ "imutavel",
+ "inaveriguavel",
+ "incutir",
+ "induzir",
+ "inextricavel",
+ "infusao",
+ "ingua",
+ "inhame",
+ "iniquo",
+ "injusto",
+ "inning",
+ "inoxidavel",
+ "inquisitorial",
+ "insustentavel",
+ "intumescimento",
+ "inutilizavel",
+ "invulneravel",
+ "inzoneiro",
+ "iodo",
+ "iogurte",
+ "ioio",
+ "ionosfera",
+ "ioruba",
+ "iota",
+ "ipsilon",
+ "irascivel",
+ "iris",
+ "irlandes",
+ "irmaos",
+ "iroques",
+ "irrupcao",
+ "isca",
+ "isento",
+ "islandes",
+ "isotopo",
+ "isqueiro",
+ "israelita",
+ "isso",
+ "isto",
+ "iterbio",
+ "itinerario",
+ "itrio",
+ "iuane",
+ "iugoslavo",
+ "jabuticabeira",
+ "jacutinga",
+ "jade",
+ "jagunco",
+ "jainista",
+ "jaleco",
+ "jambo",
+ "jantarada",
+ "japones",
+ "jaqueta",
+ "jarro",
+ "jasmim",
+ "jato",
+ "jaula",
+ "javel",
+ "jazz",
+ "jegue",
+ "jeitoso",
+ "jejum",
+ "jenipapo",
+ "jeova",
+ "jequitiba",
+ "jersei",
+ "jesus",
+ "jetom",
+ "jiboia",
+ "jihad",
+ "jilo",
+ "jingle",
+ "jipe",
+ "jocoso",
+ "joelho",
+ "joguete",
+ "joio",
+ "jojoba",
+ "jorro",
+ "jota",
+ "joule",
+ "joviano",
+ "jubiloso",
+ "judoca",
+ "jugular",
+ "juizo",
+ "jujuba",
+ "juliano",
+ "jumento",
+ "junto",
+ "jururu",
+ "justo",
+ "juta",
+ "juventude",
+ "labutar",
+ "laguna",
+ "laico",
+ "lajota",
+ "lanterninha",
+ "lapso",
+ "laquear",
+ "lastro",
+ "lauto",
+ "lavrar",
+ "laxativo",
+ "lazer",
+ "leasing",
+ "lebre",
+ "lecionar",
+ "ledo",
+ "leguminoso",
+ "leitura",
+ "lele",
+ "lemure",
+ "lento",
+ "leonardo",
+ "leopardo",
+ "lepton",
+ "leque",
+ "leste",
+ "letreiro",
+ "leucocito",
+ "levitico",
+ "lexicologo",
+ "lhama",
+ "lhufas",
+ "liame",
+ "licoroso",
+ "lidocaina",
+ "liliputiano",
+ "limusine",
+ "linotipo",
+ "lipoproteina",
+ "liquidos",
+ "lirismo",
+ "lisura",
+ "liturgico",
+ "livros",
+ "lixo",
+ "lobulo",
+ "locutor",
+ "lodo",
+ "logro",
+ "lojista",
+ "lombriga",
+ "lontra",
+ "loop",
+ "loquaz",
+ "lorota",
+ "losango",
+ "lotus",
+ "louvor",
+ "luar",
+ "lubrificavel",
+ "lucros",
+ "lugubre",
+ "luis",
+ "luminoso",
+ "luneta",
+ "lustroso",
+ "luto",
+ "luvas",
+ "luxuriante",
+ "luzeiro",
+ "maduro",
+ "maestro",
+ "mafioso",
+ "magro",
+ "maiuscula",
+ "majoritario",
+ "malvisto",
+ "mamute",
+ "manutencao",
+ "mapoteca",
+ "maquinista",
+ "marzipa",
+ "masturbar",
+ "matuto",
+ "mausoleu",
+ "mavioso",
+ "maxixe",
+ "mazurca",
+ "meandro",
+ "mecha",
+ "medusa",
+ "mefistofelico",
+ "megera",
+ "meirinho",
+ "melro",
+ "memorizar",
+ "menu",
+ "mequetrefe",
+ "mertiolate",
+ "mestria",
+ "metroviario",
+ "mexilhao",
+ "mezanino",
+ "miau",
+ "microssegundo",
+ "midia",
+ "migratorio",
+ "mimosa",
+ "minuto",
+ "miosotis",
+ "mirtilo",
+ "misturar",
+ "mitzvah",
+ "miudos",
+ "mixuruca",
+ "mnemonico",
+ "moagem",
+ "mobilizar",
+ "modulo",
+ "moer",
+ "mofo",
+ "mogno",
+ "moita",
+ "molusco",
+ "monumento",
+ "moqueca",
+ "morubixaba",
+ "mostruario",
+ "motriz",
+ "mouse",
+ "movivel",
+ "mozarela",
+ "muarra",
+ "muculmano",
+ "mudo",
+ "mugir",
+ "muitos",
+ "mumunha",
+ "munir",
+ "muon",
+ "muquira",
+ "murros",
+ "musselina",
+ "nacoes",
+ "nado",
+ "naftalina",
+ "nago",
+ "naipe",
+ "naja",
+ "nalgum",
+ "namoro",
+ "nanquim",
+ "napolitano",
+ "naquilo",
+ "nascimento",
+ "nautilo",
+ "navios",
+ "nazista",
+ "nebuloso",
+ "nectarina",
+ "nefrologo",
+ "negus",
+ "nelore",
+ "nenufar",
+ "nepotismo",
+ "nervura",
+ "neste",
+ "netuno",
+ "neutron",
+ "nevoeiro",
+ "newtoniano",
+ "nexo",
+ "nhenhenhem",
+ "nhoque",
+ "nigeriano",
+ "niilista",
+ "ninho",
+ "niobio",
+ "niponico",
+ "niquelar",
+ "nirvana",
+ "nisto",
+ "nitroglicerina",
+ "nivoso",
+ "nobreza",
+ "nocivo",
+ "noel",
+ "nogueira",
+ "noivo",
+ "nojo",
+ "nominativo",
+ "nonuplo",
+ "noruegues",
+ "nostalgico",
+ "noturno",
+ "nouveau",
+ "nuanca",
+ "nublar",
+ "nucleotideo",
+ "nudista",
+ "nulo",
+ "numismatico",
+ "nunquinha",
+ "nupcias",
+ "nutritivo",
+ "nuvens",
+ "oasis",
+ "obcecar",
+ "obeso",
+ "obituario",
+ "objetos",
+ "oblongo",
+ "obnoxio",
+ "obrigatorio",
+ "obstruir",
+ "obtuso",
+ "obus",
+ "obvio",
+ "ocaso",
+ "occipital",
+ "oceanografo",
+ "ocioso",
+ "oclusivo",
+ "ocorrer",
+ "ocre",
+ "octogono",
+ "odalisca",
+ "odisseia",
+ "odorifico",
+ "oersted",
+ "oeste",
+ "ofertar",
+ "ofidio",
+ "oftalmologo",
+ "ogiva",
+ "ogum",
+ "oigale",
+ "oitavo",
+ "oitocentos",
+ "ojeriza",
+ "olaria",
+ "oleoso",
+ "olfato",
+ "olhos",
+ "oliveira",
+ "olmo",
+ "olor",
+ "olvidavel",
+ "ombudsman",
+ "omeleteira",
+ "omitir",
+ "omoplata",
+ "onanismo",
+ "ondular",
+ "oneroso",
+ "onomatopeico",
+ "ontologico",
+ "onus",
+ "onze",
+ "opalescente",
+ "opcional",
+ "operistico",
+ "opio",
+ "oposto",
+ "oprobrio",
+ "optometrista",
+ "opusculo",
+ "oratorio",
+ "orbital",
+ "orcar",
+ "orfao",
+ "orixa",
+ "orla",
+ "ornitologo",
+ "orquidea",
+ "ortorrombico",
+ "orvalho",
+ "osculo",
+ "osmotico",
+ "ossudo",
+ "ostrogodo",
+ "otario",
+ "otite",
+ "ouro",
+ "ousar",
+ "outubro",
+ "ouvir",
+ "ovario",
+ "overnight",
+ "oviparo",
+ "ovni",
+ "ovoviviparo",
+ "ovulo",
+ "oxala",
+ "oxente",
+ "oxiuro",
+ "oxossi",
+ "ozonizar",
+ "paciente",
+ "pactuar",
+ "padronizar",
+ "paete",
+ "pagodeiro",
+ "paixao",
+ "pajem",
+ "paludismo",
+ "pampas",
+ "panturrilha",
+ "papudo",
+ "paquistanes",
+ "pastoso",
+ "patua",
+ "paulo",
+ "pauzinhos",
+ "pavoroso",
+ "paxa",
+ "pazes",
+ "peao",
+ "pecuniario",
+ "pedunculo",
+ "pegaso",
+ "peixinho",
+ "pejorativo",
+ "pelvis",
+ "penuria",
+ "pequno",
+ "petunia",
+ "pezada",
+ "piauiense",
+ "pictorico",
+ "pierro",
+ "pigmeu",
+ "pijama",
+ "pilulas",
+ "pimpolho",
+ "pintura",
+ "piorar",
+ "pipocar",
+ "piqueteiro",
+ "pirulito",
+ "pistoleiro",
+ "pituitaria",
+ "pivotar",
+ "pixote",
+ "pizzaria",
+ "plistoceno",
+ "plotar",
+ "pluviometrico",
+ "pneumonico",
+ "poco",
+ "podridao",
+ "poetisa",
+ "pogrom",
+ "pois",
+ "polvorosa",
+ "pomposo",
+ "ponderado",
+ "pontudo",
+ "populoso",
+ "poquer",
+ "porvir",
+ "posudo",
+ "potro",
+ "pouso",
+ "povoar",
+ "prazo",
+ "prezar",
+ "privilegios",
+ "proximo",
+ "prussiano",
+ "pseudopode",
+ "psoriase",
+ "pterossauros",
+ "ptialina",
+ "ptolemaico",
+ "pudor",
+ "pueril",
+ "pufe",
+ "pugilista",
+ "puir",
+ "pujante",
+ "pulverizar",
+ "pumba",
+ "punk",
+ "purulento",
+ "pustula",
+ "putsch",
+ "puxe",
+ "quatrocentos",
+ "quetzal",
+ "quixotesco",
+ "quotizavel",
+ "rabujice",
+ "racista",
+ "radonio",
+ "rafia",
+ "ragu",
+ "rajado",
+ "ralo",
+ "rampeiro",
+ "ranzinza",
+ "raptor",
+ "raquitismo",
+ "raro",
+ "rasurar",
+ "ratoeira",
+ "ravioli",
+ "razoavel",
+ "reavivar",
+ "rebuscar",
+ "recusavel",
+ "reduzivel",
+ "reexposicao",
+ "refutavel",
+ "regurgitar",
+ "reivindicavel",
+ "rejuvenescimento",
+ "relva",
+ "remuneravel",
+ "renunciar",
+ "reorientar",
+ "repuxo",
+ "requisito",
+ "resumo",
+ "returno",
+ "reutilizar",
+ "revolvido",
+ "rezonear",
+ "riacho",
+ "ribossomo",
+ "ricota",
+ "ridiculo",
+ "rifle",
+ "rigoroso",
+ "rijo",
+ "rimel",
+ "rins",
+ "rios",
+ "riqueza",
+ "riquixa",
+ "rissole",
+ "ritualistico",
+ "rivalizar",
+ "rixa",
+ "robusto",
+ "rococo",
+ "rodoviario",
+ "roer",
+ "rogo",
+ "rojao",
+ "rolo",
+ "rompimento",
+ "ronronar",
+ "roqueiro",
+ "rorqual",
+ "rosto",
+ "rotundo",
+ "rouxinol",
+ "roxo",
+ "royal",
+ "ruas",
+ "rucula",
+ "rudimentos",
+ "ruela",
+ "rufo",
+ "rugoso",
+ "ruivo",
+ "rule",
+ "rumoroso",
+ "runico",
+ "ruptura",
+ "rural",
+ "rustico",
+ "rutilar",
+ "saariano",
+ "sabujo",
+ "sacudir",
+ "sadomasoquista",
+ "safra",
+ "sagui",
+ "sais",
+ "samurai",
+ "santuario",
+ "sapo",
+ "saquear",
+ "sartriano",
+ "saturno",
+ "saude",
+ "sauva",
+ "saveiro",
+ "saxofonista",
+ "sazonal",
+ "scherzo",
+ "script",
+ "seara",
+ "seborreia",
+ "secura",
+ "seduzir",
+ "sefardim",
+ "seguro",
+ "seja",
+ "selvas",
+ "sempre",
+ "senzala",
+ "sepultura",
+ "sequoia",
+ "sestercio",
+ "setuplo",
+ "seus",
+ "seviciar",
+ "sezonismo",
+ "shalom",
+ "siames",
+ "sibilante",
+ "sicrano",
+ "sidra",
+ "sifilitico",
+ "signos",
+ "silvo",
+ "simultaneo",
+ "sinusite",
+ "sionista",
+ "sirio",
+ "sisudo",
+ "situar",
+ "sivan",
+ "slide",
+ "slogan",
+ "soar",
+ "sobrio",
+ "socratico",
+ "sodomizar",
+ "soerguer",
+ "software",
+ "sogro",
+ "soja",
+ "solver",
+ "somente",
+ "sonso",
+ "sopro",
+ "soquete",
+ "sorveteiro",
+ "sossego",
+ "soturno",
+ "sousafone",
+ "sovinice",
+ "sozinho",
+ "suavizar",
+ "subverter",
+ "sucursal",
+ "sudoriparo",
+ "sufragio",
+ "sugestoes",
+ "suite",
+ "sujo",
+ "sultao",
+ "sumula",
+ "suntuoso",
+ "suor",
+ "supurar",
+ "suruba",
+ "susto",
+ "suturar",
+ "suvenir",
+ "tabuleta",
+ "taco",
+ "tadjique",
+ "tafeta",
+ "tagarelice",
+ "taitiano",
+ "talvez",
+ "tampouco",
+ "tanzaniano",
+ "taoista",
+ "tapume",
+ "taquion",
+ "tarugo",
+ "tascar",
+ "tatuar",
+ "tautologico",
+ "tavola",
+ "taxionomista",
+ "tchecoslovaco",
+ "teatrologo",
+ "tectonismo",
+ "tedioso",
+ "teflon",
+ "tegumento",
+ "teixo",
+ "telurio",
+ "temporas",
+ "tenue",
+ "teosofico",
+ "tepido",
+ "tequila",
+ "terrorista",
+ "testosterona",
+ "tetrico",
+ "teutonico",
+ "teve",
+ "texugo",
+ "tiara",
+ "tibia",
+ "tiete",
+ "tifoide",
+ "tigresa",
+ "tijolo",
+ "tilintar",
+ "timpano",
+ "tintureiro",
+ "tiquete",
+ "tiroteio",
+ "tisico",
+ "titulos",
+ "tive",
+ "toar",
+ "toboga",
+ "tofu",
+ "togoles",
+ "toicinho",
+ "tolueno",
+ "tomografo",
+ "tontura",
+ "toponimo",
+ "toquio",
+ "torvelinho",
+ "tostar",
+ "toto",
+ "touro",
+ "toxina",
+ "trazer",
+ "trezentos",
+ "trivialidade",
+ "trovoar",
+ "truta",
+ "tuaregue",
+ "tubular",
+ "tucano",
+ "tudo",
+ "tufo",
+ "tuiste",
+ "tulipa",
+ "tumultuoso",
+ "tunisino",
+ "tupiniquim",
+ "turvo",
+ "tutu",
+ "ucraniano",
+ "udenista",
+ "ufanista",
+ "ufologo",
+ "ugaritico",
+ "uiste",
+ "uivo",
+ "ulceroso",
+ "ulema",
+ "ultravioleta",
+ "umbilical",
+ "umero",
+ "umido",
+ "umlaut",
+ "unanimidade",
+ "unesco",
+ "ungulado",
+ "unheiro",
+ "univoco",
+ "untuoso",
+ "urano",
+ "urbano",
+ "urdir",
+ "uretra",
+ "urgente",
+ "urinol",
+ "urna",
+ "urologo",
+ "urro",
+ "ursulina",
+ "urtiga",
+ "urupe",
+ "usavel",
+ "usbeque",
+ "usei",
+ "usineiro",
+ "usurpar",
+ "utero",
+ "utilizar",
+ "utopico",
+ "uvular",
+ "uxoricidio",
+ "vacuo",
+ "vadio",
+ "vaguear",
+ "vaivem",
+ "valvula",
+ "vampiro",
+ "vantajoso",
+ "vaporoso",
+ "vaquinha",
+ "varziano",
+ "vasto",
+ "vaticinio",
+ "vaudeville",
+ "vazio",
+ "veado",
+ "vedico",
+ "veemente",
+ "vegetativo",
+ "veio",
+ "veja",
+ "veludo",
+ "venusiano",
+ "verdade",
+ "verve",
+ "vestuario",
+ "vetusto",
+ "vexatorio",
+ "vezes",
+ "viavel",
+ "vibratorio",
+ "victor",
+ "vicunha",
+ "vidros",
+ "vietnamita",
+ "vigoroso",
+ "vilipendiar",
+ "vime",
+ "vintem",
+ "violoncelo",
+ "viquingue",
+ "virus",
+ "visualizar",
+ "vituperio",
+ "viuvo",
+ "vivo",
+ "vizir",
+ "voar",
+ "vociferar",
+ "vodu",
+ "vogar",
+ "voile",
+ "volver",
+ "vomito",
+ "vontade",
+ "vortice",
+ "vosso",
+ "voto",
+ "vovozinha",
+ "voyeuse",
+ "vozes",
+ "vulva",
+ "vupt",
+ "western",
+ "xadrez",
+ "xale",
+ "xampu",
+ "xango",
+ "xarope",
+ "xaual",
+ "xavante",
+ "xaxim",
+ "xenonio",
+ "xepa",
+ "xerox",
+ "xicara",
+ "xifopago",
+ "xiita",
+ "xilogravura",
+ "xinxim",
+ "xistoso",
+ "xixi",
+ "xodo",
+ "xogum",
+ "xucro",
+ "zabumba",
+ "zagueiro",
+ "zambiano",
+ "zanzar",
+ "zarpar",
+ "zebu",
+ "zefiro",
+ "zeloso",
+ "zenite",
+ "zumbi"
+ });
+ word_map = new std::unordered_map<std::string, uint32_t>;
+ trimmed_word_map = new std::unordered_map<std::string, uint32_t>;
+ language_name = "Portuguese";
+ populate_maps();
+ }
+ };
+}
+
+#endif
diff --git a/src/mnemonics/singleton.h b/src/mnemonics/singleton.h
new file mode 100644
index 000000000..74e121e4e
--- /dev/null
+++ b/src/mnemonics/singleton.h
@@ -0,0 +1,62 @@
+// Copyright (c) 2014, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*!
+ * \file singleton.h
+ *
+ * \brief A singleton helper class based on template.
+ */
+
+/*!
+ * \namespace Language
+ * \brief Mnemonic language related namespace.
+ */
+namespace Language
+{
+ /*!
+ * \class Singleton
+ *
+ * \brief Single helper class.
+ *
+ * Do Language::Singleton<YourClass>::instance() to create a singleton instance
+ * of `YourClass`.
+ */
+ template <class T>
+ class Singleton
+ {
+ Singleton() {}
+ Singleton(Singleton &s) {}
+ Singleton& operator=(const Singleton&) {}
+ public:
+ static T* instance()
+ {
+ static T* obj = new T;
+ return obj;
+ }
+ };
+}
diff --git a/src/mnemonics/spanish.h b/src/mnemonics/spanish.h
new file mode 100644
index 000000000..8d695a4b1
--- /dev/null
+++ b/src/mnemonics/spanish.h
@@ -0,0 +1,1692 @@
+// Word list originally created as part of the Electrum project, Copyright (C) 2014 Thomas Voegtlin
+//
+// Copyright (c) 2014, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*!
+ * \file spanish.h
+ *
+ * \brief Spanish word list and map.
+ */
+
+#ifndef SPANISH_H
+#define SPANISH_H
+
+#include <vector>
+#include <unordered_map>
+#include "language_base.h"
+#include <string>
+
+/*!
+ * \namespace Language
+ * \brief Mnemonic language related namespace.
+ */
+namespace Language
+{
+ class Spanish: public Base
+ {
+ public:
+ Spanish()
+ {
+ word_list = new std::vector<std::string>({
+ "ábaco",
+ "abdomen",
+ "abeja",
+ "abierto",
+ "abogado",
+ "abono",
+ "aborto",
+ "abrazo",
+ "abrir",
+ "abuelo",
+ "abuso",
+ "acabar",
+ "academia",
+ "acceso",
+ "acción",
+ "aceite",
+ "acelga",
+ "acento",
+ "aceptar",
+ "ácido",
+ "aclarar",
+ "acné",
+ "acoger",
+ "acoso",
+ "activo",
+ "acto",
+ "actriz",
+ "actuar",
+ "acudir",
+ "acuerdo",
+ "acusar",
+ "adicto",
+ "admitir",
+ "adoptar",
+ "adorno",
+ "aduana",
+ "adulto",
+ "aéreo",
+ "afectar",
+ "afición",
+ "afinar",
+ "afirmar",
+ "ágil",
+ "agitar",
+ "agonía",
+ "agosto",
+ "agotar",
+ "agregar",
+ "agrio",
+ "agua",
+ "agudo",
+ "águila",
+ "aguja",
+ "ahogo",
+ "ahorro",
+ "aire",
+ "aislar",
+ "ajedrez",
+ "ajeno",
+ "ajuste",
+ "alacrán",
+ "alambre",
+ "alarma",
+ "alba",
+ "álbum",
+ "alcalde",
+ "aldea",
+ "alegre",
+ "alejar",
+ "alerta",
+ "aleta",
+ "alfiler",
+ "alga",
+ "algodón",
+ "aliado",
+ "aliento",
+ "alivio",
+ "alma",
+ "almeja",
+ "almíbar",
+ "altar",
+ "alteza",
+ "altivo",
+ "alto",
+ "altura",
+ "alumno",
+ "alzar",
+ "amable",
+ "amante",
+ "amapola",
+ "amargo",
+ "amasar",
+ "ámbar",
+ "ámbito",
+ "ameno",
+ "amigo",
+ "amistad",
+ "amor",
+ "amparo",
+ "amplio",
+ "ancho",
+ "anciano",
+ "ancla",
+ "andar",
+ "andén",
+ "anemia",
+ "ángulo",
+ "anillo",
+ "ánimo",
+ "anís",
+ "anotar",
+ "antena",
+ "antiguo",
+ "antojo",
+ "anual",
+ "anular",
+ "anuncio",
+ "añadir",
+ "añejo",
+ "año",
+ "apagar",
+ "aparato",
+ "apetito",
+ "apio",
+ "aplicar",
+ "apodo",
+ "aporte",
+ "apoyo",
+ "aprender",
+ "aprobar",
+ "apuesta",
+ "apuro",
+ "arado",
+ "araña",
+ "arar",
+ "árbitro",
+ "árbol",
+ "arbusto",
+ "archivo",
+ "arco",
+ "arder",
+ "ardilla",
+ "arduo",
+ "área",
+ "árido",
+ "aries",
+ "armonía",
+ "arnés",
+ "aroma",
+ "arpa",
+ "arpón",
+ "arreglo",
+ "arroz",
+ "arruga",
+ "arte",
+ "artista",
+ "asa",
+ "asado",
+ "asalto",
+ "ascenso",
+ "asegurar",
+ "aseo",
+ "asesor",
+ "asiento",
+ "asilo",
+ "asistir",
+ "asno",
+ "asombro",
+ "áspero",
+ "astilla",
+ "astro",
+ "astuto",
+ "asumir",
+ "asunto",
+ "atajo",
+ "ataque",
+ "atar",
+ "atento",
+ "ateo",
+ "ático",
+ "atleta",
+ "átomo",
+ "atraer",
+ "atroz",
+ "atún",
+ "audaz",
+ "audio",
+ "auge",
+ "aula",
+ "aumento",
+ "ausente",
+ "autor",
+ "aval",
+ "avance",
+ "avaro",
+ "ave",
+ "avellana",
+ "avena",
+ "avestruz",
+ "avión",
+ "aviso",
+ "ayer",
+ "ayuda",
+ "ayuno",
+ "azafrán",
+ "azar",
+ "azote",
+ "azúcar",
+ "azufre",
+ "azul",
+ "baba",
+ "babor",
+ "bache",
+ "bahía",
+ "baile",
+ "bajar",
+ "balanza",
+ "balcón",
+ "balde",
+ "bambú",
+ "banco",
+ "banda",
+ "baño",
+ "barba",
+ "barco",
+ "barniz",
+ "barro",
+ "báscula",
+ "bastón",
+ "basura",
+ "batalla",
+ "batería",
+ "batir",
+ "batuta",
+ "baúl",
+ "bazar",
+ "bebé",
+ "bebida",
+ "bello",
+ "besar",
+ "beso",
+ "bestia",
+ "bicho",
+ "bien",
+ "bingo",
+ "blanco",
+ "bloque",
+ "blusa",
+ "boa",
+ "bobina",
+ "bobo",
+ "boca",
+ "bocina",
+ "boda",
+ "bodega",
+ "boina",
+ "bola",
+ "bolero",
+ "bolsa",
+ "bomba",
+ "bondad",
+ "bonito",
+ "bono",
+ "bonsái",
+ "borde",
+ "borrar",
+ "bosque",
+ "bote",
+ "botín",
+ "bóveda",
+ "bozal",
+ "bravo",
+ "brazo",
+ "brecha",
+ "breve",
+ "brillo",
+ "brinco",
+ "brisa",
+ "broca",
+ "broma",
+ "bronce",
+ "brote",
+ "bruja",
+ "brusco",
+ "bruto",
+ "buceo",
+ "bucle",
+ "bueno",
+ "buey",
+ "bufanda",
+ "bufón",
+ "búho",
+ "buitre",
+ "bulto",
+ "burbuja",
+ "burla",
+ "burro",
+ "buscar",
+ "butaca",
+ "buzón",
+ "caballo",
+ "cabeza",
+ "cabina",
+ "cabra",
+ "cacao",
+ "cadáver",
+ "cadena",
+ "caer",
+ "café",
+ "caída",
+ "caimán",
+ "caja",
+ "cajón",
+ "cal",
+ "calamar",
+ "calcio",
+ "caldo",
+ "calidad",
+ "calle",
+ "calma",
+ "calor",
+ "calvo",
+ "cama",
+ "cambio",
+ "camello",
+ "camino",
+ "campo",
+ "cáncer",
+ "candil",
+ "canela",
+ "canguro",
+ "canica",
+ "canto",
+ "caña",
+ "cañón",
+ "caoba",
+ "caos",
+ "capaz",
+ "capitán",
+ "capote",
+ "captar",
+ "capucha",
+ "cara",
+ "carbón",
+ "cárcel",
+ "careta",
+ "carga",
+ "cariño",
+ "carne",
+ "carpeta",
+ "carro",
+ "carta",
+ "casa",
+ "casco",
+ "casero",
+ "caspa",
+ "castor",
+ "catorce",
+ "catre",
+ "caudal",
+ "causa",
+ "cazo",
+ "cebolla",
+ "ceder",
+ "cedro",
+ "celda",
+ "célebre",
+ "celoso",
+ "célula",
+ "cemento",
+ "ceniza",
+ "centro",
+ "cerca",
+ "cerdo",
+ "cereza",
+ "cero",
+ "cerrar",
+ "certeza",
+ "césped",
+ "cetro",
+ "chacal",
+ "chaleco",
+ "champú",
+ "chancla",
+ "chapa",
+ "charla",
+ "chico",
+ "chiste",
+ "chivo",
+ "choque",
+ "choza",
+ "chuleta",
+ "chupar",
+ "ciclón",
+ "ciego",
+ "cielo",
+ "cien",
+ "cierto",
+ "cifra",
+ "cigarro",
+ "cima",
+ "cinco",
+ "cine",
+ "cinta",
+ "ciprés",
+ "circo",
+ "ciruela",
+ "cisne",
+ "cita",
+ "ciudad",
+ "clamor",
+ "clan",
+ "claro",
+ "clase",
+ "clave",
+ "cliente",
+ "clima",
+ "clínica",
+ "cobre",
+ "cocción",
+ "cochino",
+ "cocina",
+ "coco",
+ "código",
+ "codo",
+ "cofre",
+ "coger",
+ "cohete",
+ "cojín",
+ "cojo",
+ "cola",
+ "colcha",
+ "colegio",
+ "colgar",
+ "colina",
+ "collar",
+ "colmo",
+ "columna",
+ "combate",
+ "comer",
+ "comida",
+ "cómodo",
+ "compra",
+ "conde",
+ "conejo",
+ "conga",
+ "conocer",
+ "consejo",
+ "contar",
+ "copa",
+ "copia",
+ "corazón",
+ "corbata",
+ "corcho",
+ "cordón",
+ "corona",
+ "correr",
+ "coser",
+ "cosmos",
+ "costa",
+ "cráneo",
+ "cráter",
+ "crear",
+ "crecer",
+ "creído",
+ "crema",
+ "cría",
+ "crimen",
+ "cripta",
+ "crisis",
+ "cromo",
+ "crónica",
+ "croqueta",
+ "crudo",
+ "cruz",
+ "cuadro",
+ "cuarto",
+ "cuatro",
+ "cubo",
+ "cubrir",
+ "cuchara",
+ "cuello",
+ "cuento",
+ "cuerda",
+ "cuesta",
+ "cueva",
+ "cuidar",
+ "culebra",
+ "culpa",
+ "culto",
+ "cumbre",
+ "cumplir",
+ "cuna",
+ "cuneta",
+ "cuota",
+ "cupón",
+ "cúpula",
+ "curar",
+ "curioso",
+ "curso",
+ "curva",
+ "cutis",
+ "dama",
+ "danza",
+ "dar",
+ "dardo",
+ "dátil",
+ "deber",
+ "débil",
+ "década",
+ "decir",
+ "dedo",
+ "defensa",
+ "definir",
+ "dejar",
+ "delfín",
+ "delgado",
+ "delito",
+ "demora",
+ "denso",
+ "dental",
+ "deporte",
+ "derecho",
+ "derrota",
+ "desayuno",
+ "deseo",
+ "desfile",
+ "desnudo",
+ "destino",
+ "desvío",
+ "detalle",
+ "detener",
+ "deuda",
+ "día",
+ "diablo",
+ "diadema",
+ "diamante",
+ "diana",
+ "diario",
+ "dibujo",
+ "dictar",
+ "diente",
+ "dieta",
+ "diez",
+ "difícil",
+ "digno",
+ "dilema",
+ "diluir",
+ "dinero",
+ "directo",
+ "dirigir",
+ "disco",
+ "diseño",
+ "disfraz",
+ "diva",
+ "divino",
+ "doble",
+ "doce",
+ "dolor",
+ "domingo",
+ "don",
+ "donar",
+ "dorado",
+ "dormir",
+ "dorso",
+ "dos",
+ "dosis",
+ "dragón",
+ "droga",
+ "ducha",
+ "duda",
+ "duelo",
+ "dueño",
+ "dulce",
+ "dúo",
+ "duque",
+ "durar",
+ "dureza",
+ "duro",
+ "ébano",
+ "ebrio",
+ "echar",
+ "eco",
+ "ecuador",
+ "edad",
+ "edición",
+ "edificio",
+ "editor",
+ "educar",
+ "efecto",
+ "eficaz",
+ "eje",
+ "ejemplo",
+ "elefante",
+ "elegir",
+ "elemento",
+ "elevar",
+ "elipse",
+ "élite",
+ "elixir",
+ "elogio",
+ "eludir",
+ "embudo",
+ "emitir",
+ "emoción",
+ "empate",
+ "empeño",
+ "empleo",
+ "empresa",
+ "enano",
+ "encargo",
+ "enchufe",
+ "encía",
+ "enemigo",
+ "enero",
+ "enfado",
+ "enfermo",
+ "engaño",
+ "enigma",
+ "enlace",
+ "enorme",
+ "enredo",
+ "ensayo",
+ "enseñar",
+ "entero",
+ "entrar",
+ "envase",
+ "envío",
+ "época",
+ "equipo",
+ "erizo",
+ "escala",
+ "escena",
+ "escolar",
+ "escribir",
+ "escudo",
+ "esencia",
+ "esfera",
+ "esfuerzo",
+ "espada",
+ "espejo",
+ "espía",
+ "esposa",
+ "espuma",
+ "esquí",
+ "estar",
+ "este",
+ "estilo",
+ "estufa",
+ "etapa",
+ "eterno",
+ "ética",
+ "etnia",
+ "evadir",
+ "evaluar",
+ "evento",
+ "evitar",
+ "exacto",
+ "examen",
+ "exceso",
+ "excusa",
+ "exento",
+ "exigir",
+ "exilio",
+ "existir",
+ "éxito",
+ "experto",
+ "explicar",
+ "exponer",
+ "extremo",
+ "fábrica",
+ "fábula",
+ "fachada",
+ "fácil",
+ "factor",
+ "faena",
+ "faja",
+ "falda",
+ "fallo",
+ "falso",
+ "faltar",
+ "fama",
+ "familia",
+ "famoso",
+ "faraón",
+ "farmacia",
+ "farol",
+ "farsa",
+ "fase",
+ "fatiga",
+ "fauna",
+ "favor",
+ "fax",
+ "febrero",
+ "fecha",
+ "feliz",
+ "feo",
+ "feria",
+ "feroz",
+ "fértil",
+ "fervor",
+ "festín",
+ "fiable",
+ "fianza",
+ "fiar",
+ "fibra",
+ "ficción",
+ "ficha",
+ "fideo",
+ "fiebre",
+ "fiel",
+ "fiera",
+ "fiesta",
+ "figura",
+ "fijar",
+ "fijo",
+ "fila",
+ "filete",
+ "filial",
+ "filtro",
+ "fin",
+ "finca",
+ "fingir",
+ "finito",
+ "firma",
+ "flaco",
+ "flauta",
+ "flecha",
+ "flor",
+ "flota",
+ "fluir",
+ "flujo",
+ "flúor",
+ "fobia",
+ "foca",
+ "fogata",
+ "fogón",
+ "folio",
+ "folleto",
+ "fondo",
+ "forma",
+ "forro",
+ "fortuna",
+ "forzar",
+ "fosa",
+ "foto",
+ "fracaso",
+ "frágil",
+ "franja",
+ "frase",
+ "fraude",
+ "freír",
+ "freno",
+ "fresa",
+ "frío",
+ "frito",
+ "fruta",
+ "fuego",
+ "fuente",
+ "fuerza",
+ "fuga",
+ "fumar",
+ "función",
+ "funda",
+ "furgón",
+ "furia",
+ "fusil",
+ "fútbol",
+ "futuro",
+ "gacela",
+ "gafas",
+ "gaita",
+ "gajo",
+ "gala",
+ "galería",
+ "gallo",
+ "gamba",
+ "ganar",
+ "gancho",
+ "ganga",
+ "ganso",
+ "garaje",
+ "garza",
+ "gasolina",
+ "gastar",
+ "gato",
+ "gavilán",
+ "gemelo",
+ "gemir",
+ "gen",
+ "género",
+ "genio",
+ "gente",
+ "geranio",
+ "gerente",
+ "germen",
+ "gesto",
+ "gigante",
+ "gimnasio",
+ "girar",
+ "giro",
+ "glaciar",
+ "globo",
+ "gloria",
+ "gol",
+ "golfo",
+ "goloso",
+ "golpe",
+ "goma",
+ "gordo",
+ "gorila",
+ "gorra",
+ "gota",
+ "goteo",
+ "gozar",
+ "grada",
+ "gráfico",
+ "grano",
+ "grasa",
+ "gratis",
+ "grave",
+ "grieta",
+ "grillo",
+ "gripe",
+ "gris",
+ "grito",
+ "grosor",
+ "grúa",
+ "grueso",
+ "grumo",
+ "grupo",
+ "guante",
+ "guapo",
+ "guardia",
+ "guerra",
+ "guía",
+ "guiño",
+ "guion",
+ "guiso",
+ "guitarra",
+ "gusano",
+ "gustar",
+ "haber",
+ "hábil",
+ "hablar",
+ "hacer",
+ "hacha",
+ "hada",
+ "hallar",
+ "hamaca",
+ "harina",
+ "haz",
+ "hazaña",
+ "hebilla",
+ "hebra",
+ "hecho",
+ "helado",
+ "helio",
+ "hembra",
+ "herir",
+ "hermano",
+ "héroe",
+ "hervir",
+ "hielo",
+ "hierro",
+ "hígado",
+ "higiene",
+ "hijo",
+ "himno",
+ "historia",
+ "hocico",
+ "hogar",
+ "hoguera",
+ "hoja",
+ "hombre",
+ "hongo",
+ "honor",
+ "honra",
+ "hora",
+ "hormiga",
+ "horno",
+ "hostil",
+ "hoyo",
+ "hueco",
+ "huelga",
+ "huerta",
+ "hueso",
+ "huevo",
+ "huida",
+ "huir",
+ "humano",
+ "húmedo",
+ "humilde",
+ "humo",
+ "hundir",
+ "huracán",
+ "hurto",
+ "icono",
+ "ideal",
+ "idioma",
+ "ídolo",
+ "iglesia",
+ "iglú",
+ "igual",
+ "ilegal",
+ "ilusión",
+ "imagen",
+ "imán",
+ "imitar",
+ "impar",
+ "imperio",
+ "imponer",
+ "impulso",
+ "incapaz",
+ "índice",
+ "inerte",
+ "infiel",
+ "informe",
+ "ingenio",
+ "inicio",
+ "inmenso",
+ "inmune",
+ "innato",
+ "insecto",
+ "instante",
+ "interés",
+ "íntimo",
+ "intuir",
+ "inútil",
+ "invierno",
+ "ira",
+ "iris",
+ "ironía",
+ "isla",
+ "islote",
+ "jabalí",
+ "jabón",
+ "jamón",
+ "jarabe",
+ "jardín",
+ "jarra",
+ "jaula",
+ "jazmín",
+ "jefe",
+ "jeringa",
+ "jinete",
+ "jornada",
+ "joroba",
+ "joven",
+ "joya",
+ "juerga",
+ "jueves",
+ "juez",
+ "jugador",
+ "jugo",
+ "juguete",
+ "juicio",
+ "junco",
+ "jungla",
+ "junio",
+ "juntar",
+ "júpiter",
+ "jurar",
+ "justo",
+ "juvenil",
+ "juzgar",
+ "kilo",
+ "koala",
+ "labio",
+ "lacio",
+ "lacra",
+ "lado",
+ "ladrón",
+ "lagarto",
+ "lágrima",
+ "laguna",
+ "laico",
+ "lamer",
+ "lámina",
+ "lámpara",
+ "lana",
+ "lancha",
+ "langosta",
+ "lanza",
+ "lápiz",
+ "largo",
+ "larva",
+ "lástima",
+ "lata",
+ "látex",
+ "latir",
+ "laurel",
+ "lavar",
+ "lazo",
+ "leal",
+ "lección",
+ "leche",
+ "lector",
+ "leer",
+ "legión",
+ "legumbre",
+ "lejano",
+ "lengua",
+ "lento",
+ "leña",
+ "león",
+ "leopardo",
+ "lesión",
+ "letal",
+ "letra",
+ "leve",
+ "leyenda",
+ "libertad",
+ "libro",
+ "licor",
+ "líder",
+ "lidiar",
+ "lienzo",
+ "liga",
+ "ligero",
+ "lima",
+ "límite",
+ "limón",
+ "limpio",
+ "lince",
+ "lindo",
+ "línea",
+ "lingote",
+ "lino",
+ "linterna",
+ "líquido",
+ "liso",
+ "lista",
+ "litera",
+ "litio",
+ "litro",
+ "llaga",
+ "llama",
+ "llanto",
+ "llave",
+ "llegar",
+ "llenar",
+ "llevar",
+ "llorar",
+ "llover",
+ "lluvia",
+ "lobo",
+ "loción",
+ "loco",
+ "locura",
+ "lógica",
+ "logro",
+ "lombriz",
+ "lomo",
+ "lonja",
+ "lote",
+ "lucha",
+ "lucir",
+ "lugar",
+ "lujo",
+ "luna",
+ "lunes",
+ "lupa",
+ "lustro",
+ "luto",
+ "luz",
+ "maceta",
+ "macho",
+ "madera",
+ "madre",
+ "maduro",
+ "maestro",
+ "mafia",
+ "magia",
+ "mago",
+ "maíz",
+ "maldad",
+ "maleta",
+ "malla",
+ "malo",
+ "mamá",
+ "mambo",
+ "mamut",
+ "manco",
+ "mando",
+ "manejar",
+ "manga",
+ "maniquí",
+ "manjar",
+ "mano",
+ "manso",
+ "manta",
+ "mañana",
+ "mapa",
+ "máquina",
+ "mar",
+ "marco",
+ "marea",
+ "marfil",
+ "margen",
+ "marido",
+ "mármol",
+ "marrón",
+ "martes",
+ "marzo",
+ "masa",
+ "máscara",
+ "masivo",
+ "matar",
+ "materia",
+ "matiz",
+ "matriz",
+ "máximo",
+ "mayor",
+ "mazorca",
+ "mecha",
+ "medalla",
+ "medio",
+ "médula",
+ "mejilla",
+ "mejor",
+ "melena",
+ "melón",
+ "memoria",
+ "menor",
+ "mensaje",
+ "mente",
+ "menú",
+ "mercado",
+ "merengue",
+ "mérito",
+ "mes",
+ "mesón",
+ "meta",
+ "meter",
+ "método",
+ "metro",
+ "mezcla",
+ "miedo",
+ "miel",
+ "miembro",
+ "miga",
+ "mil",
+ "milagro",
+ "militar",
+ "millón",
+ "mimo",
+ "mina",
+ "minero",
+ "mínimo",
+ "minuto",
+ "miope",
+ "mirar",
+ "misa",
+ "miseria",
+ "misil",
+ "mismo",
+ "mitad",
+ "mito",
+ "mochila",
+ "moción",
+ "moda",
+ "modelo",
+ "moho",
+ "mojar",
+ "molde",
+ "moler",
+ "molino",
+ "momento",
+ "momia",
+ "monarca",
+ "moneda",
+ "monja",
+ "monto",
+ "moño",
+ "morada",
+ "morder",
+ "moreno",
+ "morir",
+ "morro",
+ "morsa",
+ "mortal",
+ "mosca",
+ "mostrar",
+ "motivo",
+ "mover",
+ "móvil",
+ "mozo",
+ "mucho",
+ "mudar",
+ "mueble",
+ "muela",
+ "muerte",
+ "muestra",
+ "mugre",
+ "mujer",
+ "mula",
+ "muleta",
+ "multa",
+ "mundo",
+ "muñeca",
+ "mural",
+ "muro",
+ "músculo",
+ "museo",
+ "musgo",
+ "música",
+ "muslo",
+ "nácar",
+ "nación",
+ "nadar",
+ "naipe",
+ "naranja",
+ "nariz",
+ "narrar",
+ "nasal",
+ "natal",
+ "nativo",
+ "natural",
+ "náusea",
+ "naval",
+ "nave",
+ "navidad",
+ "necio",
+ "néctar",
+ "negar",
+ "negocio",
+ "negro",
+ "neón",
+ "nervio",
+ "neto",
+ "neutro",
+ "nevar",
+ "nevera",
+ "nicho",
+ "nido",
+ "niebla",
+ "nieto",
+ "niñez",
+ "niño",
+ "nítido",
+ "nivel",
+ "nobleza",
+ "noche",
+ "nómina",
+ "noria",
+ "norma",
+ "norte",
+ "nota",
+ "noticia",
+ "novato",
+ "novela",
+ "novio",
+ "nube",
+ "nuca",
+ "núcleo",
+ "nudillo",
+ "nudo",
+ "nuera",
+ "nueve",
+ "nuez",
+ "nulo",
+ "número",
+ "nutria",
+ "oasis",
+ "obeso",
+ "obispo",
+ "objeto",
+ "obra",
+ "obrero",
+ "observar",
+ "obtener",
+ "obvio",
+ "oca",
+ "ocaso",
+ "océano",
+ "ochenta",
+ "ocho",
+ "ocio",
+ "ocre",
+ "octavo",
+ "octubre",
+ "oculto",
+ "ocupar",
+ "ocurrir",
+ "odiar",
+ "odio",
+ "odisea",
+ "oeste",
+ "ofensa",
+ "oferta",
+ "oficio",
+ "ofrecer",
+ "ogro",
+ "oído",
+ "oír",
+ "ojo",
+ "ola",
+ "oleada",
+ "olfato",
+ "olivo",
+ "olla",
+ "olmo",
+ "olor",
+ "olvido",
+ "ombligo",
+ "onda",
+ "onza",
+ "opaco",
+ "opción",
+ "ópera",
+ "opinar",
+ "oponer",
+ "optar",
+ "óptica",
+ "opuesto",
+ "oración",
+ "orador",
+ "oral",
+ "órbita",
+ "orca",
+ "orden",
+ "oreja",
+ "órgano",
+ "orgía",
+ "orgullo",
+ "oriente",
+ "origen",
+ "orilla",
+ "oro",
+ "orquesta",
+ "oruga",
+ "osadía",
+ "oscuro",
+ "osezno",
+ "oso",
+ "ostra",
+ "otoño",
+ "otro",
+ "oveja",
+ "óvulo",
+ "óxido",
+ "oxígeno",
+ "oyente",
+ "ozono",
+ "pacto",
+ "padre",
+ "paella",
+ "página",
+ "pago",
+ "país",
+ "pájaro",
+ "palabra",
+ "palco",
+ "paleta",
+ "pálido",
+ "palma",
+ "paloma",
+ "palpar",
+ "pan",
+ "panal",
+ "pánico",
+ "pantera",
+ "pañuelo",
+ "papá",
+ "papel",
+ "papilla",
+ "paquete",
+ "parar",
+ "parcela",
+ "pared",
+ "parir",
+ "paro",
+ "párpado",
+ "parque",
+ "párrafo",
+ "parte",
+ "pasar",
+ "paseo",
+ "pasión",
+ "paso",
+ "pasta",
+ "pata",
+ "patio",
+ "patria",
+ "pausa",
+ "pauta",
+ "pavo",
+ "payaso",
+ "peatón",
+ "pecado",
+ "pecera",
+ "pecho",
+ "pedal",
+ "pedir",
+ "pegar",
+ "peine",
+ "pelar",
+ "peldaño",
+ "pelea",
+ "peligro",
+ "pellejo",
+ "pelo",
+ "peluca",
+ "pena",
+ "pensar",
+ "peñón",
+ "peón",
+ "peor",
+ "pepino",
+ "pequeño",
+ "pera",
+ "percha",
+ "perder",
+ "pereza",
+ "perfil",
+ "perico",
+ "perla",
+ "permiso",
+ "perro",
+ "persona",
+ "pesa",
+ "pesca",
+ "pésimo",
+ "pestaña",
+ "pétalo",
+ "petróleo",
+ "pez",
+ "pezuña",
+ "picar",
+ "pichón",
+ "pie",
+ "piedra",
+ "pierna",
+ "pieza",
+ "pijama",
+ "pilar",
+ "piloto",
+ "pimienta",
+ "pino",
+ "pintor",
+ "pinza",
+ "piña",
+ "piojo",
+ "pipa",
+ "pirata",
+ "pisar",
+ "piscina",
+ "piso",
+ "pista",
+ "pitón",
+ "pizca",
+ "placa",
+ "plan",
+ "plata",
+ "playa",
+ "plaza",
+ "pleito",
+ "pleno",
+ "plomo",
+ "pluma",
+ "plural",
+ "pobre",
+ "poco",
+ "poder",
+ "podio",
+ "poema",
+ "poesía",
+ "poeta",
+ "polen",
+ "policía",
+ "pollo",
+ "polvo",
+ "pomada",
+ "pomelo",
+ "pomo",
+ "pompa",
+ "poner",
+ "porción",
+ "portal",
+ "posada",
+ "poseer",
+ "posible",
+ "poste",
+ "potencia",
+ "potro",
+ "pozo",
+ "prado",
+ "precoz",
+ "pregunta",
+ "premio",
+ "prensa",
+ "preso",
+ "previo",
+ "primo",
+ "príncipe",
+ "prisión",
+ "privar",
+ "proa",
+ "probar",
+ "proceso",
+ "producto",
+ "proeza",
+ "profesor",
+ "programa",
+ "prole",
+ "promesa",
+ "pronto",
+ "propio",
+ "próximo",
+ "prueba",
+ "público",
+ "puchero",
+ "pudor",
+ "pueblo",
+ "puerta",
+ "puesto",
+ "pulga",
+ "pulir",
+ "pulmón",
+ "pulpo",
+ "pulso",
+ "puma",
+ "punto",
+ "puñal",
+ "puño",
+ "pupa",
+ "pupila",
+ "puré",
+ "quedar",
+ "queja",
+ "quemar",
+ "querer",
+ "queso",
+ "quieto",
+ "química",
+ "quince",
+ "quitar",
+ "rábano",
+ "rabia",
+ "rabo",
+ "ración",
+ "radical",
+ "raíz",
+ "rama",
+ "rampa",
+ "rancho",
+ "rango",
+ "rapaz",
+ "rápido",
+ "rapto",
+ "rasgo",
+ "raspa",
+ "rato",
+ "rayo",
+ "raza",
+ "razón",
+ "reacción",
+ "realidad",
+ "rebaño",
+ "rebote",
+ "recaer",
+ "receta",
+ "rechazo",
+ "recoger",
+ "recreo",
+ "recto",
+ "recurso",
+ "red",
+ "redondo",
+ "reducir",
+ "reflejo",
+ "reforma",
+ "refrán",
+ "refugio",
+ "regalo",
+ "regir",
+ "regla",
+ "regreso",
+ "rehén",
+ "reino",
+ "reír",
+ "reja",
+ "relato",
+ "relevo",
+ "relieve",
+ "relleno",
+ "reloj",
+ "remar",
+ "remedio",
+ "remo",
+ "rencor",
+ "rendir",
+ "renta",
+ "reparto",
+ "repetir",
+ "reposo",
+ "reptil",
+ "res",
+ "rescate",
+ "resina",
+ "respeto",
+ "resto",
+ "resumen",
+ "retiro",
+ "retorno",
+ "retrato",
+ "reunir",
+ "revés",
+ "revista",
+ "rey",
+ "rezar",
+ "rico",
+ "riego",
+ "rienda",
+ "riesgo",
+ "rifa",
+ "rígido",
+ "rigor",
+ "rincón",
+ "riñón",
+ "río",
+ "riqueza",
+ "risa",
+ "ritmo",
+ "rito"
+ });
+ word_map = new std::unordered_map<std::string, uint32_t>;
+ trimmed_word_map = new std::unordered_map<std::string, uint32_t>;
+ language_name = "Spanish";
+ populate_maps();
+ }
+ };
+}
+
+#endif \ No newline at end of file
diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp
index 25a11d310..98515a945 100644
--- a/src/simplewallet/simplewallet.cpp
+++ b/src/simplewallet/simplewallet.cpp
@@ -28,6 +28,12 @@
//
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+/*!
+ * \file simplewallet.cpp
+ *
+ * \brief Source file that defines simple_wallet class.
+ */
+
#include <thread>
#include <iostream>
#include <sstream>
@@ -46,7 +52,8 @@
#include "wallet/wallet_rpc_server.h"
#include "version.h"
#include "crypto/crypto.h" // for crypto::secret_key definition
-#include "crypto/electrum-words.h"
+#include "mnemonics/electrum-words.h"
+#include <stdexcept>
#if defined(WIN32)
#include <crtdbg.h>
@@ -204,7 +211,7 @@ bool simple_wallet::seed(const std::vector<std::string> &args/* = std::vector<st
if (success)
{
- success_msg_writer(true) << "\nPLEASE NOTE: the following 24 words can be used to recover access to your wallet. Please write them down and store them somewhere safe and secure. Please do not store them in your email or on file storage services outside of your immediate control.\n";
+ success_msg_writer(true) << "\nPLEASE NOTE: the following 25 words can be used to recover access to your wallet. Please write them down and store them somewhere safe and secure. Please do not store them in your email or on file storage services outside of your immediate control.\n";
std::cout << electrum_words << std::endl;
}
else
@@ -361,6 +368,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
{
if (m_wallet_file.empty()) m_wallet_file = m_generate_new; // alias for simplicity later
+ std::string old_language;
// check for recover flag. if present, require electrum word list (only recovery option for now).
if (m_restore_deterministic_wallet)
{
@@ -380,13 +388,14 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
}
}
- if (!crypto::ElectrumWords::words_to_bytes(m_electrum_seed, m_recovery_key))
+ if (!crypto::ElectrumWords::words_to_bytes(m_electrum_seed, m_recovery_key, old_language))
{
- fail_msg_writer() << "electrum-style word list failed verification";
- return false;
+ fail_msg_writer() << "electrum-style word list failed verification";
+ return false;
}
}
- bool r = new_wallet(m_wallet_file, pwd_container.password(), m_recovery_key, m_restore_deterministic_wallet, m_non_deterministic, testnet);
+ bool r = new_wallet(m_wallet_file, pwd_container.password(), m_recovery_key, m_restore_deterministic_wallet,
+ m_non_deterministic, testnet, old_language);
CHECK_AND_ASSERT_MES(r, false, "account creation failed");
}
else
@@ -430,8 +439,49 @@ bool simple_wallet::try_connect_to_daemon()
return true;
}
+/*!
+ * \brief Gets the word seed language from the user.
+ *
+ * User is asked to choose from a list of supported languages.
+ *
+ * \return The chosen language.
+ */
+std::string simple_wallet::get_mnemonic_language()
+{
+ std::vector<std::string> language_list;
+ std::string language_choice;
+ int language_number = -1;
+ crypto::ElectrumWords::get_language_list(language_list);
+ std::cout << "List of available languages for your wallet's seed:" << std::endl;
+ int ii;
+ std::vector<std::string>::iterator it;
+ for (it = language_list.begin(), ii = 0; it != language_list.end(); it++, ii++)
+ {
+ std::cout << ii << " : " << *it << std::endl;
+ }
+ while (language_number < 0)
+ {
+ language_choice = command_line::input_line("Enter the number corresponding to the language of your choice: ");
+ try
+ {
+ language_number = std::stoi(language_choice);
+ if (!((language_number >= 0) && (static_cast<unsigned int>(language_number) < language_list.size())))
+ {
+ language_number = -1;
+ fail_msg_writer() << "Invalid language choice passed. Please try again.\n";
+ }
+ }
+ catch (std::exception &e)
+ {
+ fail_msg_writer() << "Invalid language choice passed. Please try again.\n";
+ }
+ }
+ return language_list[language_number];
+}
+
//----------------------------------------------------------------------------------------------------
-bool simple_wallet::new_wallet(const string &wallet_file, const std::string& password, const crypto::secret_key& recovery_key, bool recover, bool two_random, bool testnet)
+bool simple_wallet::new_wallet(const std::string &wallet_file, const std::string& password, const crypto::secret_key& recovery_key,
+ bool recover, bool two_random, bool testnet, const std::string &old_language)
{
m_wallet_file = wallet_file;
@@ -456,7 +506,25 @@ bool simple_wallet::new_wallet(const string &wallet_file, const std::string& pas
// convert rng value to electrum-style word list
std::string electrum_words;
- crypto::ElectrumWords::bytes_to_words(recovery_val, electrum_words);
+
+ bool was_deprecated_wallet = (old_language == crypto::ElectrumWords::old_language_name) ||
+ crypto::ElectrumWords::get_is_old_style_seed(m_electrum_seed);
+
+ std::string mnemonic_language = old_language;
+ // Ask for seed language if it is not a wallet restore or if it was a deprecated wallet
+ // that was earlier used before this restore.
+ if (!m_restore_deterministic_wallet || was_deprecated_wallet)
+ {
+ if (was_deprecated_wallet)
+ {
+ // The user had used an older version of the wallet with old style mnemonics.
+ message_writer(epee::log_space::console_color_green, false) << "\nYou had been using " <<
+ "a deprecated version of the wallet. Please use the new seed that we provide.\n";
+ }
+ mnemonic_language = get_mnemonic_language();
+ }
+ crypto::ElectrumWords::bytes_to_words(recovery_val, electrum_words, mnemonic_language);
+ m_wallet->set_seed_language(mnemonic_language);
std::string print_electrum = "";
@@ -473,7 +541,7 @@ bool simple_wallet::new_wallet(const string &wallet_file, const std::string& pas
if (!two_random)
{
- success_msg_writer(true) << "\nPLEASE NOTE: the following 24 words can be used to recover access to your wallet. Please write them down and store them somewhere safe and secure. Please do not store them in your email or on file storage services outside of your immediate control.\n";
+ success_msg_writer(true) << "\nPLEASE NOTE: the following 25 words can be used to recover access to your wallet. Please write them down and store them somewhere safe and secure. Please do not store them in your email or on file storage services outside of your immediate control.\n";
std::cout << electrum_words << std::endl;
}
success_msg_writer() << "**********************************************************************";
diff --git a/src/simplewallet/simplewallet.h b/src/simplewallet/simplewallet.h
index 17affd564..af6d4172a 100644
--- a/src/simplewallet/simplewallet.h
+++ b/src/simplewallet/simplewallet.h
@@ -28,6 +28,11 @@
//
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+/*!
+ * \file simplewallet.h
+ *
+ * \brief Header file that declares simple_wallet class.
+ */
#pragma once
#include <memory>
@@ -41,12 +46,15 @@
#include "password_container.h"
#include "crypto/crypto.h" // for definition of crypto::secret_key
-
+/*!
+ * \namespace cryptonote
+ * \brief Holds cryptonote related classes and helpers.
+ */
namespace cryptonote
{
- /************************************************************************/
- /* */
- /************************************************************************/
+ /*!
+ * \brief Manages wallet operations. This is the most abstracted wallet class.
+ */
class simple_wallet : public tools::i_wallet2_callback
{
public:
@@ -66,7 +74,8 @@ namespace cryptonote
bool run_console_handler();
- bool new_wallet(const std::string &wallet_file, const std::string& password, const crypto::secret_key& recovery_key = crypto::secret_key(), bool recover = false, bool two_random = false, bool testnet = false);
+ bool new_wallet(const std::string &wallet_file, const std::string& password, const crypto::secret_key& recovery_key,
+ bool recover, bool two_random, bool testnet, const std::string &old_language);
bool open_wallet(const std::string &wallet_file, const std::string& password, bool testnet);
bool close_wallet();
@@ -93,6 +102,15 @@ namespace cryptonote
bool try_connect_to_daemon();
bool ask_wallet_create_if_needed();
+ /*!
+ * \brief Gets the word seed language from the user.
+ *
+ * User is asked to choose from a list of supported languages.
+ *
+ * \return The chosen language.
+ */
+ std::string get_mnemonic_language();
+
//----------------- i_wallet2_callback ---------------------
virtual void on_new_block(uint64_t height, const cryptonote::block& block);
virtual void on_money_received(uint64_t height, const cryptonote::transaction& tx, size_t out_index);
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 6fb672798..5af9a71bd 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -46,7 +46,7 @@ using namespace epee;
#include "crypto/crypto.h"
#include "serialization/binary_utils.h"
#include "cryptonote_protocol/blobdatatype.h"
-#include "crypto/electrum-words.h"
+#include "mnemonics/electrum-words.h"
#include "common/dns_utils.h"
extern "C"
@@ -88,7 +88,7 @@ void wallet2::init(const std::string& daemon_address, uint64_t upper_transaction
//----------------------------------------------------------------------------------------------------
bool wallet2::get_seed(std::string& electrum_words)
{
- crypto::ElectrumWords::bytes_to_words(get_account().get_keys().m_spend_secret_key, electrum_words);
+ crypto::ElectrumWords::bytes_to_words(get_account().get_keys().m_spend_secret_key, electrum_words, seed_language);
crypto::secret_key second;
keccak((uint8_t *)&get_account().get_keys().m_spend_secret_key, sizeof(crypto::secret_key), (uint8_t *)&second, sizeof(crypto::secret_key));
@@ -97,6 +97,13 @@ bool wallet2::get_seed(std::string& electrum_words)
return memcmp(second.data,get_account().get_keys().m_view_secret_key.data, sizeof(crypto::secret_key)) == 0;
}
+/*!
+ * \brief Sets the seed language
+ */
+void wallet2::set_seed_language(const std::string &language)
+{
+ seed_language = language;
+}
//----------------------------------------------------------------------------------------------------
void wallet2::process_new_transaction(const cryptonote::transaction& tx, uint64_t height)
{
diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h
index 90918677e..afa42c2d3 100644
--- a/src/wallet/wallet2.h
+++ b/src/wallet/wallet2.h
@@ -152,7 +152,10 @@ namespace tools
void callback(i_wallet2_callback* callback) { m_callback = callback; }
bool get_seed(std::string& electrum_words);
-
+ /*!
+ * \brief Sets the seed language
+ */
+ void set_seed_language(const std::string &language);
void refresh();
void refresh(uint64_t start_height, size_t & blocks_fetched);
void refresh(uint64_t start_height, size_t & blocks_fetched, bool& received_money);
@@ -236,6 +239,7 @@ namespace tools
i_wallet2_callback* m_callback;
bool m_testnet;
+ std::string seed_language;
};
}
BOOST_CLASS_VERSION(tools::wallet2, 7)