dev
dart 2,188 lines 26.8 KB
Raw
1 import 'dart:convert';
2 import 'dart:math';
3 import 'dart:typed_data';
4
5 import 'package:crypto/crypto.dart';
6 import 'package:cryptography/cryptography.dart' as cryptography;
7 import 'package:cw_core/sec_random_native.dart';
8 import 'package:cw_core/utils/text_normalizer.dart';
9
10 const segwit = '100';
11 const mweb = 'eb';
12 final wordlist = englishWordlist;
13
14 double logBase(num x, num base) => log(x) / log(base);
15
16 String mnemonicEncode(int i) {
17 var _i = i;
18 final n = wordlist.length;
19 final words = <String>[];
20
21 while (_i > 0) {
22 final x = i % n;
23 _i = (i / n).floor();
24 words.add(wordlist[x]);
25 }
26
27 return words.join(' ');
28 }
29
30 int mnemonicDecode(String seed) {
31 var i = 0;
32 final n = wordlist.length;
33 final words = seed.split(' ');
34
35 while (words.length > 0) {
36 final word = words.removeLast();
37 final k = wordlist.indexOf(word);
38 i = i * n + k;
39 }
40
41 return i;
42 }
43
44 bool isNewSeed(String seed, {String prefix = segwit}) {
45 final hmacSha512 = Hmac(sha512, utf8.encode('Seed version'));
46 final digest = hmacSha512.convert(utf8.encode(normalizeText(seed)));
47 final hx = digest.toString();
48 return hx.startsWith(prefix.toLowerCase());
49 }
50
51 void maskBytes(Uint8List bytes, int bits) {
52 final skipCount = (bits / 8).floor();
53 var lastByte = (1 << bits % 8) - 1;
54
55 for (var i = bytes.length - 1 - skipCount; i >= 0; i--) {
56 bytes[i] &= lastByte;
57
58 if (lastByte > 0) {
59 lastByte = 0;
60 }
61 }
62 }
63
64 String bufferToBin(Uint8List data) => data.map((e) => e.toRadixString(2).padLeft(8, '0')).join('');
65
66 String encode(Uint8List data) {
67 final dataBitLen = data.length * 8;
68 final wordBitLen = logBase(wordlist.length, 2).ceil();
69 final wordCount = (dataBitLen / wordBitLen).floor();
70 maskBytes(data, wordCount * wordBitLen);
71 final bin = bufferToBin(data);
72 final binStr = bin.substring(bin.length - (wordCount * wordBitLen));
73 final result = <Object>[];
74
75 for (var i = 0; i < wordCount; i++) {
76 final wordBin = binStr.substring(i * wordBitLen, (i + 1) * wordBitLen);
77 result.add(wordlist[int.parse(wordBin, radix: 2)]);
78 }
79
80 return result.join(' ');
81 }
82
83 List<bool> prefixMatches(String source, List<String> prefixes) {
84 final hmacSha512 = Hmac(sha512, utf8.encode('Seed version'));
85 final digest = hmacSha512.convert(utf8.encode(normalizeText(source)));
86 final hx = digest.toString();
87
88 return prefixes.map((prefix) => hx.startsWith(prefix.toLowerCase())).toList();
89 }
90
91 Future<String> generateElectrumMnemonic({int strength = 264, String prefix = segwit}) async {
92 final wordBitlen = logBase(wordlist.length, 2).ceil();
93 final wordCount = strength / wordBitlen;
94 final byteCount = ((wordCount * wordBitlen).ceil() / 8).ceil();
95 var result = '';
96
97 do {
98 final bytes = await secRandom(byteCount);
99 maskBytes(bytes, strength);
100 result = encode(bytes);
101 } while (!prefixMatches(result, [prefix]).first);
102
103 return result;
104 }
105
106 Future<bool> checkIfMnemonicIsElectrum2(String mnemonic) async {
107 return prefixMatches(mnemonic, [segwit]).first;
108 }
109
110 Future<String> getMnemonicHash(String mnemonic) async {
111 final hmacSha512 = Hmac(sha512, utf8.encode('Seed version'));
112 final digest = hmacSha512.convert(utf8.encode(normalizeText(mnemonic)));
113 return digest.toString();
114 }
115
116 Future<Uint8List> mnemonicToSeedBytes(String mnemonic,
117 {String prefix = segwit, String passphrase = ''}) async {
118 final pbkdf2 =
119 cryptography.Pbkdf2(macAlgorithm: cryptography.Hmac.sha512(), iterations: 2048, bits: 512);
120 final text = normalizeText(mnemonic);
121 final passphraseBytes = utf8.encode(normalizeText(passphrase));
122 final key = await pbkdf2.deriveKey(
123 secretKey: cryptography.SecretKey(text.codeUnits),
124 nonce: [...'electrum'.codeUnits, ...passphraseBytes]);
125 final bytes = await key.extractBytes();
126 return Uint8List.fromList(bytes);
127 }
128
129 bool matchesAnyPrefix(String mnemonic) => prefixMatches(mnemonic, [segwit, mweb]).any((el) => el);
130
131 bool validateMnemonic(String mnemonic, {String prefix = segwit}) {
132 try {
133 return matchesAnyPrefix(mnemonic);
134 } catch (e) {
135 return false;
136 }
137 }
138
139 final englishWordlist = <String>[
140 'abandon',
141 'ability',
142 'able',
143 'about',
144 'above',
145 'absent',
146 'absorb',
147 'abstract',
148 'absurd',
149 'abuse',
150 'access',
151 'accident',
152 'account',
153 'accuse',
154 'achieve',
155 'acid',
156 'acoustic',
157 'acquire',
158 'across',
159 'act',
160 'action',
161 'actor',
162 'actress',
163 'actual',
164 'adapt',
165 'add',
166 'addict',
167 'address',
168 'adjust',
169 'admit',
170 'adult',
171 'advance',
172 'advice',
173 'aerobic',
174 'affair',
175 'afford',
176 'afraid',
177 'again',
178 'age',
179 'agent',
180 'agree',
181 'ahead',
182 'aim',
183 'air',
184 'airport',
185 'aisle',
186 'alarm',
187 'album',
188 'alcohol',
189 'alert',
190 'alien',
191 'all',
192 'alley',
193 'allow',
194 'almost',
195 'alone',
196 'alpha',
197 'already',
198 'also',
199 'alter',
200 'always',
201 'amateur',
202 'amazing',
203 'among',
204 'amount',
205 'amused',
206 'analyst',
207 'anchor',
208 'ancient',
209 'anger',
210 'angle',
211 'angry',
212 'animal',
213 'ankle',
214 'announce',
215 'annual',
216 'another',
217 'answer',
218 'antenna',
219 'antique',
220 'anxiety',
221 'any',
222 'apart',
223 'apology',
224 'appear',
225 'apple',
226 'approve',
227 'april',
228 'arch',
229 'arctic',
230 'area',
231 'arena',
232 'argue',
233 'arm',
234 'armed',
235 'armor',
236 'army',
237 'around',
238 'arrange',
239 'arrest',
240 'arrive',
241 'arrow',
242 'art',
243 'artefact',
244 'artist',
245 'artwork',
246 'ask',
247 'aspect',
248 'assault',
249 'asset',
250 'assist',
251 'assume',
252 'asthma',
253 'athlete',
254 'atom',
255 'attack',
256 'attend',
257 'attitude',
258 'attract',
259 'auction',
260 'audit',
261 'august',
262 'aunt',
263 'author',
264 'auto',
265 'autumn',
266 'average',
267 'avocado',
268 'avoid',
269 'awake',
270 'aware',
271 'away',
272 'awesome',
273 'awful',
274 'awkward',
275 'axis',
276 'baby',
277 'bachelor',
278 'bacon',
279 'badge',
280 'bag',
281 'balance',
282 'balcony',
283 'ball',
284 'bamboo',
285 'banana',
286 'banner',
287 'bar',
288 'barely',
289 'bargain',
290 'barrel',
291 'base',
292 'basic',
293 'basket',
294 'battle',
295 'beach',
296 'bean',
297 'beauty',
298 'because',
299 'become',
300 'beef',
301 'before',
302 'begin',
303 'behave',
304 'behind',
305 'believe',
306 'below',
307 'belt',
308 'bench',
309 'benefit',
310 'best',
311 'betray',
312 'better',
313 'between',
314 'beyond',
315 'bicycle',
316 'bid',
317 'bike',
318 'bind',
319 'biology',
320 'bird',
321 'birth',
322 'bitter',
323 'black',
324 'blade',
325 'blame',
326 'blanket',
327 'blast',
328 'bleak',
329 'bless',
330 'blind',
331 'blood',
332 'blossom',
333 'blouse',
334 'blue',
335 'blur',
336 'blush',
337 'board',
338 'boat',
339 'body',
340 'boil',
341 'bomb',
342 'bone',
343 'bonus',
344 'book',
345 'boost',
346 'border',
347 'boring',
348 'borrow',
349 'boss',
350 'bottom',
351 'bounce',
352 'box',
353 'boy',
354 'bracket',
355 'brain',
356 'brand',
357 'brass',
358 'brave',
359 'bread',
360 'breeze',
361 'brick',
362 'bridge',
363 'brief',
364 'bright',
365 'bring',
366 'brisk',
367 'broccoli',
368 'broken',
369 'bronze',
370 'broom',
371 'brother',
372 'brown',
373 'brush',
374 'bubble',
375 'buddy',
376 'budget',
377 'buffalo',
378 'build',
379 'bulb',
380 'bulk',
381 'bullet',
382 'bundle',
383 'bunker',
384 'burden',
385 'burger',
386 'burst',
387 'bus',
388 'business',
389 'busy',
390 'butter',
391 'buyer',
392 'buzz',
393 'cabbage',
394 'cabin',
395 'cable',
396 'cactus',
397 'cage',
398 'cake',
399 'call',
400 'calm',
401 'camera',
402 'camp',
403 'can',
404 'canal',
405 'cancel',
406 'candy',
407 'cannon',
408 'canoe',
409 'canvas',
410 'canyon',
411 'capable',
412 'capital',
413 'captain',
414 'car',
415 'carbon',
416 'card',
417 'cargo',
418 'carpet',
419 'carry',
420 'cart',
421 'case',
422 'cash',
423 'casino',
424 'castle',
425 'casual',
426 'cat',
427 'catalog',
428 'catch',
429 'category',
430 'cattle',
431 'caught',
432 'cause',
433 'caution',
434 'cave',
435 'ceiling',
436 'celery',
437 'cement',
438 'census',
439 'century',
440 'cereal',
441 'certain',
442 'chair',
443 'chalk',
444 'champion',
445 'change',
446 'chaos',
447 'chapter',
448 'charge',
449 'chase',
450 'chat',
451 'cheap',
452 'check',
453 'cheese',
454 'chef',
455 'cherry',
456 'chest',
457 'chicken',
458 'chief',
459 'child',
460 'chimney',
461 'choice',
462 'choose',
463 'chronic',
464 'chuckle',
465 'chunk',
466 'churn',
467 'cigar',
468 'cinnamon',
469 'circle',
470 'citizen',
471 'city',
472 'civil',
473 'claim',
474 'clap',
475 'clarify',
476 'claw',
477 'clay',
478 'clean',
479 'clerk',
480 'clever',
481 'click',
482 'client',
483 'cliff',
484 'climb',
485 'clinic',
486 'clip',
487 'clock',
488 'clog',
489 'close',
490 'cloth',
491 'cloud',
492 'clown',
493 'club',
494 'clump',
495 'cluster',
496 'clutch',
497 'coach',
498 'coast',
499 'coconut',
500 'code',
501 'coffee',
502 'coil',
503 'coin',
504 'collect',
505 'color',
506 'column',
507 'combine',
508 'come',
509 'comfort',
510 'comic',
511 'common',
512 'company',
513 'concert',
514 'conduct',
515 'confirm',
516 'congress',
517 'connect',
518 'consider',
519 'control',
520 'convince',
521 'cook',
522 'cool',
523 'copper',
524 'copy',
525 'coral',
526 'core',
527 'corn',
528 'correct',
529 'cost',
530 'cotton',
531 'couch',
532 'country',
533 'couple',
534 'course',
535 'cousin',
536 'cover',
537 'coyote',
538 'crack',
539 'cradle',
540 'craft',
541 'cram',
542 'crane',
543 'crash',
544 'crater',
545 'crawl',
546 'crazy',
547 'cream',
548 'credit',
549 'creek',
550 'crew',
551 'cricket',
552 'crime',
553 'crisp',
554 'critic',
555 'crop',
556 'cross',
557 'crouch',
558 'crowd',
559 'crucial',
560 'cruel',
561 'cruise',
562 'crumble',
563 'crunch',
564 'crush',
565 'cry',
566 'crystal',
567 'cube',
568 'culture',
569 'cup',
570 'cupboard',
571 'curious',
572 'current',
573 'curtain',
574 'curve',
575 'cushion',
576 'custom',
577 'cute',
578 'cycle',
579 'dad',
580 'damage',
581 'damp',
582 'dance',
583 'danger',
584 'daring',
585 'dash',
586 'daughter',
587 'dawn',
588 'day',
589 'deal',
590 'debate',
591 'debris',
592 'decade',
593 'december',
594 'decide',
595 'decline',
596 'decorate',
597 'decrease',
598 'deer',
599 'defense',
600 'define',
601 'defy',
602 'degree',
603 'delay',
604 'deliver',
605 'demand',
606 'demise',
607 'denial',
608 'dentist',
609 'deny',
610 'depart',
611 'depend',
612 'deposit',
613 'depth',
614 'deputy',
615 'derive',
616 'describe',
617 'desert',
618 'design',
619 'desk',
620 'despair',
621 'destroy',
622 'detail',
623 'detect',
624 'develop',
625 'device',
626 'devote',
627 'diagram',
628 'dial',
629 'diamond',
630 'diary',
631 'dice',
632 'diesel',
633 'diet',
634 'differ',
635 'digital',
636 'dignity',
637 'dilemma',
638 'dinner',
639 'dinosaur',
640 'direct',
641 'dirt',
642 'disagree',
643 'discover',
644 'disease',
645 'dish',
646 'dismiss',
647 'disorder',
648 'display',
649 'distance',
650 'divert',
651 'divide',
652 'divorce',
653 'dizzy',
654 'doctor',
655 'document',
656 'dog',
657 'doll',
658 'dolphin',
659 'domain',
660 'donate',
661 'donkey',
662 'donor',
663 'door',
664 'dose',
665 'double',
666 'dove',
667 'draft',
668 'dragon',
669 'drama',
670 'drastic',
671 'draw',
672 'dream',
673 'dress',
674 'drift',
675 'drill',
676 'drink',
677 'drip',
678 'drive',
679 'drop',
680 'drum',
681 'dry',
682 'duck',
683 'dumb',
684 'dune',
685 'during',
686 'dust',
687 'dutch',
688 'duty',
689 'dwarf',
690 'dynamic',
691 'eager',
692 'eagle',
693 'early',
694 'earn',
695 'earth',
696 'easily',
697 'east',
698 'easy',
699 'echo',
700 'ecology',
701 'economy',
702 'edge',
703 'edit',
704 'educate',
705 'effort',
706 'egg',
707 'eight',
708 'either',
709 'elbow',
710 'elder',
711 'electric',
712 'elegant',
713 'element',
714 'elephant',
715 'elevator',
716 'elite',
717 'else',
718 'embark',
719 'embody',
720 'embrace',
721 'emerge',
722 'emotion',
723 'employ',
724 'empower',
725 'empty',
726 'enable',
727 'enact',
728 'end',
729 'endless',
730 'endorse',
731 'enemy',
732 'energy',
733 'enforce',
734 'engage',
735 'engine',
736 'enhance',
737 'enjoy',
738 'enlist',
739 'enough',
740 'enrich',
741 'enroll',
742 'ensure',
743 'enter',
744 'entire',
745 'entry',
746 'envelope',
747 'episode',
748 'equal',
749 'equip',
750 'era',
751 'erase',
752 'erode',
753 'erosion',
754 'error',
755 'erupt',
756 'escape',
757 'essay',
758 'essence',
759 'estate',
760 'eternal',
761 'ethics',
762 'evidence',
763 'evil',
764 'evoke',
765 'evolve',
766 'exact',
767 'example',
768 'excess',
769 'exchange',
770 'excite',
771 'exclude',
772 'excuse',
773 'execute',
774 'exercise',
775 'exhaust',
776 'exhibit',
777 'exile',
778 'exist',
779 'exit',
780 'exotic',
781 'expand',
782 'expect',
783 'expire',
784 'explain',
785 'expose',
786 'express',
787 'extend',
788 'extra',
789 'eye',
790 'eyebrow',
791 'fabric',
792 'face',
793 'faculty',
794 'fade',
795 'faint',
796 'faith',
797 'fall',
798 'false',
799 'fame',
800 'family',
801 'famous',
802 'fan',
803 'fancy',
804 'fantasy',
805 'farm',
806 'fashion',
807 'fat',
808 'fatal',
809 'father',
810 'fatigue',
811 'fault',
812 'favorite',
813 'feature',
814 'february',
815 'federal',
816 'fee',
817 'feed',
818 'feel',
819 'female',
820 'fence',
821 'festival',
822 'fetch',
823 'fever',
824 'few',
825 'fiber',
826 'fiction',
827 'field',
828 'figure',
829 'file',
830 'film',
831 'filter',
832 'final',
833 'find',
834 'fine',
835 'finger',
836 'finish',
837 'fire',
838 'firm',
839 'first',
840 'fiscal',
841 'fish',
842 'fit',
843 'fitness',
844 'fix',
845 'flag',
846 'flame',
847 'flash',
848 'flat',
849 'flavor',
850 'flee',
851 'flight',
852 'flip',
853 'float',
854 'flock',
855 'floor',
856 'flower',
857 'fluid',
858 'flush',
859 'fly',
860 'foam',
861 'focus',
862 'fog',
863 'foil',
864 'fold',
865 'follow',
866 'food',
867 'foot',
868 'force',
869 'forest',
870 'forget',
871 'fork',
872 'fortune',
873 'forum',
874 'forward',
875 'fossil',
876 'foster',
877 'found',
878 'fox',
879 'fragile',
880 'frame',
881 'frequent',
882 'fresh',
883 'friend',
884 'fringe',
885 'frog',
886 'front',
887 'frost',
888 'frown',
889 'frozen',
890 'fruit',
891 'fuel',
892 'fun',
893 'funny',
894 'furnace',
895 'fury',
896 'future',
897 'gadget',
898 'gain',
899 'galaxy',
900 'gallery',
901 'game',
902 'gap',
903 'garage',
904 'garbage',
905 'garden',
906 'garlic',
907 'garment',
908 'gas',
909 'gasp',
910 'gate',
911 'gather',
912 'gauge',
913 'gaze',
914 'general',
915 'genius',
916 'genre',
917 'gentle',
918 'genuine',
919 'gesture',
920 'ghost',
921 'giant',
922 'gift',
923 'giggle',
924 'ginger',
925 'giraffe',
926 'girl',
927 'give',
928 'glad',
929 'glance',
930 'glare',
931 'glass',
932 'glide',
933 'glimpse',
934 'globe',
935 'gloom',
936 'glory',
937 'glove',
938 'glow',
939 'glue',
940 'goat',
941 'goddess',
942 'gold',
943 'good',
944 'goose',
945 'gorilla',
946 'gospel',
947 'gossip',
948 'govern',
949 'gown',
950 'grab',
951 'grace',
952 'grain',
953 'grant',
954 'grape',
955 'grass',
956 'gravity',
957 'great',
958 'green',
959 'grid',
960 'grief',
961 'grit',
962 'grocery',
963 'group',
964 'grow',
965 'grunt',
966 'guard',
967 'guess',
968 'guide',
969 'guilt',
970 'guitar',
971 'gun',
972 'gym',
973 'habit',
974 'hair',
975 'half',
976 'hammer',
977 'hamster',
978 'hand',
979 'happy',
980 'harbor',
981 'hard',
982 'harsh',
983 'harvest',
984 'hat',
985 'have',
986 'hawk',
987 'hazard',
988 'head',
989 'health',
990 'heart',
991 'heavy',
992 'hedgehog',
993 'height',
994 'hello',
995 'helmet',
996 'help',
997 'hen',
998 'hero',
999 'hidden',
1000 'high',
1001 'hill',
1002 'hint',
1003 'hip',
1004 'hire',
1005 'history',
1006 'hobby',
1007 'hockey',
1008 'hold',
1009 'hole',
1010 'holiday',
1011 'hollow',
1012 'home',
1013 'honey',
1014 'hood',
1015 'hope',
1016 'horn',
1017 'horror',
1018 'horse',
1019 'hospital',
1020 'host',
1021 'hotel',
1022 'hour',
1023 'hover',
1024 'hub',
1025 'huge',
1026 'human',
1027 'humble',
1028 'humor',
1029 'hundred',
1030 'hungry',
1031 'hunt',
1032 'hurdle',
1033 'hurry',
1034 'hurt',
1035 'husband',
1036 'hybrid',
1037 'ice',
1038 'icon',
1039 'idea',
1040 'identify',
1041 'idle',
1042 'ignore',
1043 'ill',
1044 'illegal',
1045 'illness',
1046 'image',
1047 'imitate',
1048 'immense',
1049 'immune',
1050 'impact',
1051 'impose',
1052 'improve',
1053 'impulse',
1054 'inch',
1055 'include',
1056 'income',
1057 'increase',
1058 'index',
1059 'indicate',
1060 'indoor',
1061 'industry',
1062 'infant',
1063 'inflict',
1064 'inform',
1065 'inhale',
1066 'inherit',
1067 'initial',
1068 'inject',
1069 'injury',
1070 'inmate',
1071 'inner',
1072 'innocent',
1073 'input',
1074 'inquiry',
1075 'insane',
1076 'insect',
1077 'inside',
1078 'inspire',
1079 'install',
1080 'intact',
1081 'interest',
1082 'into',
1083 'invest',
1084 'invite',
1085 'involve',
1086 'iron',
1087 'island',
1088 'isolate',
1089 'issue',
1090 'item',
1091 'ivory',
1092 'jacket',
1093 'jaguar',
1094 'jar',
1095 'jazz',
1096 'jealous',
1097 'jeans',
1098 'jelly',
1099 'jewel',
1100 'job',
1101 'join',
1102 'joke',
1103 'journey',
1104 'joy',
1105 'judge',
1106 'juice',
1107 'jump',
1108 'jungle',
1109 'junior',
1110 'junk',
1111 'just',
1112 'kangaroo',
1113 'keen',
1114 'keep',
1115 'ketchup',
1116 'key',
1117 'kick',
1118 'kid',
1119 'kidney',
1120 'kind',
1121 'kingdom',
1122 'kiss',
1123 'kit',
1124 'kitchen',
1125 'kite',
1126 'kitten',
1127 'kiwi',
1128 'knee',
1129 'knife',
1130 'knock',
1131 'know',
1132 'lab',
1133 'label',
1134 'labor',
1135 'ladder',
1136 'lady',
1137 'lake',
1138 'lamp',
1139 'language',
1140 'laptop',
1141 'large',
1142 'later',
1143 'latin',
1144 'laugh',
1145 'laundry',
1146 'lava',
1147 'law',
1148 'lawn',
1149 'lawsuit',
1150 'layer',
1151 'lazy',
1152 'leader',
1153 'leaf',
1154 'learn',
1155 'leave',
1156 'lecture',
1157 'left',
1158 'leg',
1159 'legal',
1160 'legend',
1161 'leisure',
1162 'lemon',
1163 'lend',
1164 'length',
1165 'lens',
1166 'leopard',
1167 'lesson',
1168 'letter',
1169 'level',
1170 'liar',
1171 'liberty',
1172 'library',
1173 'license',
1174 'life',
1175 'lift',
1176 'light',
1177 'like',
1178 'limb',
1179 'limit',
1180 'link',
1181 'lion',
1182 'liquid',
1183 'list',
1184 'little',
1185 'live',
1186 'lizard',
1187 'load',
1188 'loan',
1189 'lobster',
1190 'local',
1191 'lock',
1192 'logic',
1193 'lonely',
1194 'long',
1195 'loop',
1196 'lottery',
1197 'loud',
1198 'lounge',
1199 'love',
1200 'loyal',
1201 'lucky',
1202 'luggage',
1203 'lumber',
1204 'lunar',
1205 'lunch',
1206 'luxury',
1207 'lyrics',
1208 'machine',
1209 'mad',
1210 'magic',
1211 'magnet',
1212 'maid',
1213 'mail',
1214 'main',
1215 'major',
1216 'make',
1217 'mammal',
1218 'man',
1219 'manage',
1220 'mandate',
1221 'mango',
1222 'mansion',
1223 'manual',
1224 'maple',
1225 'marble',
1226 'march',
1227 'margin',
1228 'marine',
1229 'market',
1230 'marriage',
1231 'mask',
1232 'mass',
1233 'master',
1234 'match',
1235 'material',
1236 'math',
1237 'matrix',
1238 'matter',
1239 'maximum',
1240 'maze',
1241 'meadow',
1242 'mean',
1243 'measure',
1244 'meat',
1245 'mechanic',
1246 'medal',
1247 'media',
1248 'melody',
1249 'melt',
1250 'member',
1251 'memory',
1252 'mention',
1253 'menu',
1254 'mercy',
1255 'merge',
1256 'merit',
1257 'merry',
1258 'mesh',
1259 'message',
1260 'metal',
1261 'method',
1262 'middle',
1263 'midnight',
1264 'milk',
1265 'million',
1266 'mimic',
1267 'mind',
1268 'minimum',
1269 'minor',
1270 'minute',
1271 'miracle',
1272 'mirror',
1273 'misery',
1274 'miss',
1275 'mistake',
1276 'mix',
1277 'mixed',
1278 'mixture',
1279 'mobile',
1280 'model',
1281 'modify',
1282 'mom',
1283 'moment',
1284 'monitor',
1285 'monkey',
1286 'monster',
1287 'month',
1288 'moon',
1289 'moral',
1290 'more',
1291 'morning',
1292 'mosquito',
1293 'mother',
1294 'motion',
1295 'motor',
1296 'mountain',
1297 'mouse',
1298 'move',
1299 'movie',
1300 'much',
1301 'muffin',
1302 'mule',
1303 'multiply',
1304 'muscle',
1305 'museum',
1306 'mushroom',
1307 'music',
1308 'must',
1309 'mutual',
1310 'myself',
1311 'mystery',
1312 'myth',
1313 'naive',
1314 'name',
1315 'napkin',
1316 'narrow',
1317 'nasty',
1318 'nation',
1319 'nature',
1320 'near',
1321 'neck',
1322 'need',
1323 'negative',
1324 'neglect',
1325 'neither',
1326 'nephew',
1327 'nerve',
1328 'nest',
1329 'net',
1330 'network',
1331 'neutral',
1332 'never',
1333 'news',
1334 'next',
1335 'nice',
1336 'night',
1337 'noble',
1338 'noise',
1339 'nominee',
1340 'noodle',
1341 'normal',
1342 'north',
1343 'nose',
1344 'notable',
1345 'note',
1346 'nothing',
1347 'notice',
1348 'novel',
1349 'now',
1350 'nuclear',
1351 'number',
1352 'nurse',
1353 'nut',
1354 'oak',
1355 'obey',
1356 'object',
1357 'oblige',
1358 'obscure',
1359 'observe',
1360 'obtain',
1361 'obvious',
1362 'occur',
1363 'ocean',
1364 'october',
1365 'odor',
1366 'off',
1367 'offer',
1368 'office',
1369 'often',
1370 'oil',
1371 'okay',
1372 'old',
1373 'olive',
1374 'olympic',
1375 'omit',
1376 'once',
1377 'one',
1378 'onion',
1379 'online',
1380 'only',
1381 'open',
1382 'opera',
1383 'opinion',
1384 'oppose',
1385 'option',
1386 'orange',
1387 'orbit',
1388 'orchard',
1389 'order',
1390 'ordinary',
1391 'organ',
1392 'orient',
1393 'original',
1394 'orphan',
1395 'ostrich',
1396 'other',
1397 'outdoor',
1398 'outer',
1399 'output',
1400 'outside',
1401 'oval',
1402 'oven',
1403 'over',
1404 'own',
1405 'owner',
1406 'oxygen',
1407 'oyster',
1408 'ozone',
1409 'pact',
1410 'paddle',
1411 'page',
1412 'pair',
1413 'palace',
1414 'palm',
1415 'panda',
1416 'panel',
1417 'panic',
1418 'panther',
1419 'paper',
1420 'parade',
1421 'parent',
1422 'park',
1423 'parrot',
1424 'party',
1425 'pass',
1426 'patch',
1427 'path',
1428 'patient',
1429 'patrol',
1430 'pattern',
1431 'pause',
1432 'pave',
1433 'payment',
1434 'peace',
1435 'peanut',
1436 'pear',
1437 'peasant',
1438 'pelican',
1439 'pen',
1440 'penalty',
1441 'pencil',
1442 'people',
1443 'pepper',
1444 'perfect',
1445 'permit',
1446 'person',
1447 'pet',
1448 'phone',
1449 'photo',
1450 'phrase',
1451 'physical',
1452 'piano',
1453 'picnic',
1454 'picture',
1455 'piece',
1456 'pig',
1457 'pigeon',
1458 'pill',
1459 'pilot',
1460 'pink',
1461 'pioneer',
1462 'pipe',
1463 'pistol',
1464 'pitch',
1465 'pizza',
1466 'place',
1467 'planet',
1468 'plastic',
1469 'plate',
1470 'play',
1471 'please',
1472 'pledge',
1473 'pluck',
1474 'plug',
1475 'plunge',
1476 'poem',
1477 'poet',
1478 'point',
1479 'polar',
1480 'pole',
1481 'police',
1482 'pond',
1483 'pony',
1484 'pool',
1485 'popular',
1486 'portion',
1487 'position',
1488 'possible',
1489 'post',
1490 'potato',
1491 'pottery',
1492 'poverty',
1493 'powder',
1494 'power',
1495 'practice',
1496 'praise',
1497 'predict',
1498 'prefer',
1499 'prepare',
1500 'present',
1501 'pretty',
1502 'prevent',
1503 'price',
1504 'pride',
1505 'primary',
1506 'print',
1507 'priority',
1508 'prison',
1509 'private',
1510 'prize',
1511 'problem',
1512 'process',
1513 'produce',
1514 'profit',
1515 'program',
1516 'project',
1517 'promote',
1518 'proof',
1519 'property',
1520 'prosper',
1521 'protect',
1522 'proud',
1523 'provide',
1524 'public',
1525 'pudding',
1526 'pull',
1527 'pulp',
1528 'pulse',
1529 'pumpkin',
1530 'punch',
1531 'pupil',
1532 'puppy',
1533 'purchase',
1534 'purity',
1535 'purpose',
1536 'purse',
1537 'push',
1538 'put',
1539 'puzzle',
1540 'pyramid',
1541 'quality',
1542 'quantum',
1543 'quarter',
1544 'question',
1545 'quick',
1546 'quit',
1547 'quiz',
1548 'quote',
1549 'rabbit',
1550 'raccoon',
1551 'race',
1552 'rack',
1553 'radar',
1554 'radio',
1555 'rail',
1556 'rain',
1557 'raise',
1558 'rally',
1559 'ramp',
1560 'ranch',
1561 'random',
1562 'range',
1563 'rapid',
1564 'rare',
1565 'rate',
1566 'rather',
1567 'raven',
1568 'raw',
1569 'razor',
1570 'ready',
1571 'real',
1572 'reason',
1573 'rebel',
1574 'rebuild',
1575 'recall',
1576 'receive',
1577 'recipe',
1578 'record',
1579 'recycle',
1580 'reduce',
1581 'reflect',
1582 'reform',
1583 'refuse',
1584 'region',
1585 'regret',
1586 'regular',
1587 'reject',
1588 'relax',
1589 'release',
1590 'relief',
1591 'rely',
1592 'remain',
1593 'remember',
1594 'remind',
1595 'remove',
1596 'render',
1597 'renew',
1598 'rent',
1599 'reopen',
1600 'repair',
1601 'repeat',
1602 'replace',
1603 'report',
1604 'require',
1605 'rescue',
1606 'resemble',
1607 'resist',
1608 'resource',
1609 'response',
1610 'result',
1611 'retire',
1612 'retreat',
1613 'return',
1614 'reunion',
1615 'reveal',
1616 'review',
1617 'reward',
1618 'rhythm',
1619 'rib',
1620 'ribbon',
1621 'rice',
1622 'rich',
1623 'ride',
1624 'ridge',
1625 'rifle',
1626 'right',
1627 'rigid',
1628 'ring',
1629 'riot',
1630 'ripple',
1631 'risk',
1632 'ritual',
1633 'rival',
1634 'river',
1635 'road',
1636 'roast',
1637 'robot',
1638 'robust',
1639 'rocket',
1640 'romance',
1641 'roof',
1642 'rookie',
1643 'room',
1644 'rose',
1645 'rotate',
1646 'rough',
1647 'round',
1648 'route',
1649 'royal',
1650 'rubber',
1651 'rude',
1652 'rug',
1653 'rule',
1654 'run',
1655 'runway',
1656 'rural',
1657 'sad',
1658 'saddle',
1659 'sadness',
1660 'safe',
1661 'sail',
1662 'salad',
1663 'salmon',
1664 'salon',
1665 'salt',
1666 'salute',
1667 'same',
1668 'sample',
1669 'sand',
1670 'satisfy',
1671 'satoshi',
1672 'sauce',
1673 'sausage',
1674 'save',
1675 'say',
1676 'scale',
1677 'scan',
1678 'scare',
1679 'scatter',
1680 'scene',
1681 'scheme',
1682 'school',
1683 'science',
1684 'scissors',
1685 'scorpion',
1686 'scout',
1687 'scrap',
1688 'screen',
1689 'script',
1690 'scrub',
1691 'sea',
1692 'search',
1693 'season',
1694 'seat',
1695 'second',
1696 'secret',
1697 'section',
1698 'security',
1699 'seed',
1700 'seek',
1701 'segment',
1702 'select',
1703 'sell',
1704 'seminar',
1705 'senior',
1706 'sense',
1707 'sentence',
1708 'series',
1709 'service',
1710 'session',
1711 'settle',
1712 'setup',
1713 'seven',
1714 'shadow',
1715 'shaft',
1716 'shallow',
1717 'share',
1718 'shed',
1719 'shell',
1720 'sheriff',
1721 'shield',
1722 'shift',
1723 'shine',
1724 'ship',
1725 'shiver',
1726 'shock',
1727 'shoe',
1728 'shoot',
1729 'shop',
1730 'short',
1731 'shoulder',
1732 'shove',
1733 'shrimp',
1734 'shrug',
1735 'shuffle',
1736 'shy',
1737 'sibling',
1738 'sick',
1739 'side',
1740 'siege',
1741 'sight',
1742 'sign',
1743 'silent',
1744 'silk',
1745 'silly',
1746 'silver',
1747 'similar',
1748 'simple',
1749 'since',
1750 'sing',
1751 'siren',
1752 'sister',
1753 'situate',
1754 'six',
1755 'size',
1756 'skate',
1757 'sketch',
1758 'ski',
1759 'skill',
1760 'skin',
1761 'skirt',
1762 'skull',
1763 'slab',
1764 'slam',
1765 'sleep',
1766 'slender',
1767 'slice',
1768 'slide',
1769 'slight',
1770 'slim',
1771 'slogan',
1772 'slot',
1773 'slow',
1774 'slush',
1775 'small',
1776 'smart',
1777 'smile',
1778 'smoke',
1779 'smooth',
1780 'snack',
1781 'snake',
1782 'snap',
1783 'sniff',
1784 'snow',
1785 'soap',
1786 'soccer',
1787 'social',
1788 'sock',
1789 'soda',
1790 'soft',
1791 'solar',
1792 'soldier',
1793 'solid',
1794 'solution',
1795 'solve',
1796 'someone',
1797 'song',
1798 'soon',
1799 'sorry',
1800 'sort',
1801 'soul',
1802 'sound',
1803 'soup',
1804 'source',
1805 'south',
1806 'space',
1807 'spare',
1808 'spatial',
1809 'spawn',
1810 'speak',
1811 'special',
1812 'speed',
1813 'spell',
1814 'spend',
1815 'sphere',
1816 'spice',
1817 'spider',
1818 'spike',
1819 'spin',
1820 'spirit',
1821 'split',
1822 'spoil',
1823 'sponsor',
1824 'spoon',
1825 'sport',
1826 'spot',
1827 'spray',
1828 'spread',
1829 'spring',
1830 'spy',
1831 'square',
1832 'squeeze',
1833 'squirrel',
1834 'stable',
1835 'stadium',
1836 'staff',
1837 'stage',
1838 'stairs',
1839 'stamp',
1840 'stand',
1841 'start',
1842 'state',
1843 'stay',
1844 'steak',
1845 'steel',
1846 'stem',
1847 'step',
1848 'stereo',
1849 'stick',
1850 'still',
1851 'sting',
1852 'stock',
1853 'stomach',
1854 'stone',
1855 'stool',
1856 'story',
1857 'stove',
1858 'strategy',
1859 'street',
1860 'strike',
1861 'strong',
1862 'struggle',
1863 'student',
1864 'stuff',
1865 'stumble',
1866 'style',
1867 'subject',
1868 'submit',
1869 'subway',
1870 'success',
1871 'such',
1872 'sudden',
1873 'suffer',
1874 'sugar',
1875 'suggest',
1876 'suit',
1877 'summer',
1878 'sun',
1879 'sunny',
1880 'sunset',
1881 'super',
1882 'supply',
1883 'supreme',
1884 'sure',
1885 'surface',
1886 'surge',
1887 'surprise',
1888 'surround',
1889 'survey',
1890 'suspect',
1891 'sustain',
1892 'swallow',
1893 'swamp',
1894 'swap',
1895 'swarm',
1896 'swear',
1897 'sweet',
1898 'swift',
1899 'swim',
1900 'swing',
1901 'switch',
1902 'sword',
1903 'symbol',
1904 'symptom',
1905 'syrup',
1906 'system',
1907 'table',
1908 'tackle',
1909 'tag',
1910 'tail',
1911 'talent',
1912 'talk',
1913 'tank',
1914 'tape',
1915 'target',
1916 'task',
1917 'taste',
1918 'tattoo',
1919 'taxi',
1920 'teach',
1921 'team',
1922 'tell',
1923 'ten',
1924 'tenant',
1925 'tennis',
1926 'tent',
1927 'term',
1928 'test',
1929 'text',
1930 'thank',
1931 'that',
1932 'theme',
1933 'then',
1934 'theory',
1935 'there',
1936 'they',
1937 'thing',
1938 'this',
1939 'thought',
1940 'three',
1941 'thrive',
1942 'throw',
1943 'thumb',
1944 'thunder',
1945 'ticket',
1946 'tide',
1947 'tiger',
1948 'tilt',
1949 'timber',
1950 'time',
1951 'tiny',
1952 'tip',
1953 'tired',
1954 'tissue',
1955 'title',
1956 'toast',
1957 'tobacco',
1958 'today',
1959 'toddler',
1960 'toe',
1961 'together',
1962 'toilet',
1963 'token',
1964 'tomato',
1965 'tomorrow',
1966 'tone',
1967 'tongue',
1968 'tonight',
1969 'tool',
1970 'tooth',
1971 'top',
1972 'topic',
1973 'topple',
1974 'torch',
1975 'tornado',
1976 'tortoise',
1977 'toss',
1978 'total',
1979 'tourist',
1980 'toward',
1981 'tower',
1982 'town',
1983 'toy',
1984 'track',
1985 'trade',
1986 'traffic',
1987 'tragic',
1988 'train',
1989 'transfer',
1990 'trap',
1991 'trash',
1992 'travel',
1993 'tray',
1994 'treat',
1995 'tree',
1996 'trend',
1997 'trial',
1998 'tribe',
1999 'trick',
2000 'trigger',
2001 'trim',
2002 'trip',
2003 'trophy',
2004 'trouble',
2005 'truck',
2006 'true',
2007 'truly',
2008 'trumpet',
2009 'trust',
2010 'truth',
2011 'try',
2012 'tube',
2013 'tuition',
2014 'tumble',
2015 'tuna',
2016 'tunnel',
2017 'turkey',
2018 'turn',
2019 'turtle',
2020 'twelve',
2021 'twenty',
2022 'twice',
2023 'twin',
2024 'twist',
2025 'two',
2026 'type',
2027 'typical',
2028 'ugly',
2029 'umbrella',
2030 'unable',
2031 'unaware',
2032 'uncle',
2033 'uncover',
2034 'under',
2035 'undo',
2036 'unfair',
2037 'unfold',
2038 'unhappy',
2039 'uniform',
2040 'unique',
2041 'unit',
2042 'universe',
2043 'unknown',
2044 'unlock',
2045 'until',
2046 'unusual',
2047 'unveil',
2048 'update',
2049 'upgrade',
2050 'uphold',
2051 'upon',
2052 'upper',
2053 'upset',
2054 'urban',
2055 'urge',
2056 'usage',
2057 'use',
2058 'used',
2059 'useful',
2060 'useless',
2061 'usual',
2062 'utility',
2063 'vacant',
2064 'vacuum',
2065 'vague',
2066 'valid',
2067 'valley',
2068 'valve',
2069 'van',
2070 'vanish',
2071 'vapor',
2072 'various',
2073 'vast',
2074 'vault',
2075 'vehicle',
2076 'velvet',
2077 'vendor',
2078 'venture',
2079 'venue',
2080 'verb',
2081 'verify',
2082 'version',
2083 'very',
2084 'vessel',
2085 'veteran',
2086 'viable',
2087 'vibrant',
2088 'vicious',
2089 'victory',
2090 'video',
2091 'view',
2092 'village',
2093 'vintage',
2094 'violin',
2095 'virtual',
2096 'virus',
2097 'visa',
2098 'visit',
2099 'visual',
2100 'vital',
2101 'vivid',
2102 'vocal',
2103 'voice',
2104 'void',
2105 'volcano',
2106 'volume',
2107 'vote',
2108 'voyage',
2109 'wage',
2110 'wagon',
2111 'wait',
2112 'walk',
2113 'wall',
2114 'walnut',
2115 'want',
2116 'warfare',
2117 'warm',
2118 'warrior',
2119 'wash',
2120 'wasp',
2121 'waste',
2122 'water',
2123 'wave',
2124 'way',
2125 'wealth',
2126 'weapon',
2127 'wear',
2128 'weasel',
2129 'weather',
2130 'web',
2131 'wedding',
2132 'weekend',
2133 'weird',
2134 'welcome',
2135 'west',
2136 'wet',
2137 'whale',
2138 'what',
2139 'wheat',
2140 'wheel',
2141 'when',
2142 'where',
2143 'whip',
2144 'whisper',
2145 'wide',
2146 'width',
2147 'wife',
2148 'wild',
2149 'will',
2150 'win',
2151 'window',
2152 'wine',
2153 'wing',
2154 'wink',
2155 'winner',
2156 'winter',
2157 'wire',
2158 'wisdom',
2159 'wise',
2160 'wish',
2161 'witness',
2162 'wolf',
2163 'woman',
2164 'wonder',
2165 'wood',
2166 'wool',
2167 'word',
2168 'work',
2169 'world',
2170 'worry',
2171 'worth',
2172 'wrap',
2173 'wreck',
2174 'wrestle',
2175 'wrist',
2176 'write',
2177 'wrong',
2178 'yard',
2179 'year',
2180 'yellow',
2181 'you',
2182 'young',
2183 'youth',
2184 'zebra',
2185 'zero',
2186 'zone',
2187 'zoo'
2188 ];