story_key 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +5 -2
- data/.rubocop.yml +5 -1
- data/.ruby-version +1 -1
- data/.travis.yml +1 -1
- data/Gemfile +1 -2
- data/Gemfile.lock +109 -62
- data/README.md +43 -34
- data/Rakefile +0 -1
- data/assets/BarlowSemiCondensed-Regular.ttf +0 -0
- data/assets/error.png +0 -0
- data/bin/console +0 -1
- data/examples/card.png +0 -0
- data/examples/cli.png +0 -0
- data/lexicons/adjectives/misc.txt +1 -4
- data/lexicons/adjectives/personable.txt +7 -4
- data/lexicons/verbs/entries.txt +1037 -0
- data/lib/story_key/base.rb +0 -1
- data/lib/story_key/class_methods.rb +3 -4
- data/lib/story_key/coercer.rb +2 -3
- data/lib/story_key/console/recover.rb +17 -18
- data/lib/story_key/console.rb +45 -32
- data/lib/story_key/data.rb +11 -14
- data/lib/story_key/decoder.rb +5 -6
- data/lib/story_key/encoder.rb +32 -20
- data/lib/story_key/image_generator.rb +191 -0
- data/lib/story_key/key_generator.rb +25 -0
- data/lib/story_key/lexicon.rb +2 -3
- data/lib/story_key/tokenizer.rb +3 -4
- data/lib/story_key/version.rb +3 -4
- data/lib/story_key.rb +18 -18
- data/rakelib/lexicon.rake +32 -22
- data/story_key.gemspec +29 -27
- data/tmp/.keep +0 -0
- metadata +82 -35
- data/.DS_Store +0 -0
- data/lexicons/verbs/misc.txt +0 -1039
- data/lib/story_key/generator.rb +0 -22
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: be2facdf65cadfc79be9b3277589e6ee1b39eccb900e69f6f68925f773007422
|
|
4
|
+
data.tar.gz: 86611058f31408ed45947210e5d694fbb08a9323edbe4290b4d30fdbed0f662d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a66c4b2d31b047c2de09900525c11dfbb66d186c11ad35bcdccff88b156ec07bec7afeb33789aeac394ed74fc309f143d0aac2d67c3a053f597b5e5cf1386860
|
|
7
|
+
data.tar.gz: 68e554476c0586267972deadaa8833d999747f4821604f9f95dc5aa18285d19a5e38b3090b008f50c601569975feb69a47ab5cfd9235183bdf2ee4ef08b445e4
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
inherit_gem:
|
|
2
|
+
rubocop-rails-omakase: rubocop.yml
|
|
3
|
+
|
|
1
4
|
require:
|
|
2
5
|
- rubocop-performance
|
|
6
|
+
- rubocop-rake
|
|
3
7
|
- rubocop-rspec
|
|
4
8
|
|
|
5
9
|
AllCops:
|
|
@@ -8,7 +12,7 @@ AllCops:
|
|
|
8
12
|
- vendor/**/*
|
|
9
13
|
- lib/story_key/data.rb
|
|
10
14
|
NewCops: enable
|
|
11
|
-
TargetRubyVersion: 3.
|
|
15
|
+
TargetRubyVersion: 3.2.0
|
|
12
16
|
Gemspec/RequireMFA:
|
|
13
17
|
Enabled: false
|
|
14
18
|
Layout/EmptyLineAfterGuardClause:
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.
|
|
1
|
+
3.3.0
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,100 +1,147 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
story_key (0.
|
|
5
|
-
activesupport (~>
|
|
4
|
+
story_key (0.5.0)
|
|
5
|
+
activesupport (~> 8.0.1)
|
|
6
6
|
awesome_print (~> 1.9.2)
|
|
7
7
|
base58 (~> 0.2.3)
|
|
8
|
+
dotenv (~> 3.1.6)
|
|
8
9
|
dry-initializer (~> 3.1.1)
|
|
9
|
-
indefinite_article (~> 0.2.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
thor (~> 1.2
|
|
13
|
-
|
|
10
|
+
indefinite_article (~> 0.2.5)
|
|
11
|
+
remedy (~> 0.4.0)
|
|
12
|
+
rmagick (~> 6.0.1)
|
|
13
|
+
thor (~> 1.3.2)
|
|
14
|
+
typhoeus (~> 1.4.1)
|
|
15
|
+
zeitwerk (~> 2.7.1)
|
|
14
16
|
|
|
15
17
|
GEM
|
|
16
18
|
remote: https://rubygems.org/
|
|
17
19
|
specs:
|
|
18
|
-
activesupport (
|
|
19
|
-
|
|
20
|
+
activesupport (8.0.1)
|
|
21
|
+
base64
|
|
22
|
+
benchmark (>= 0.3)
|
|
23
|
+
bigdecimal
|
|
24
|
+
concurrent-ruby (~> 1.0, >= 1.3.1)
|
|
25
|
+
connection_pool (>= 2.2.5)
|
|
26
|
+
drb
|
|
20
27
|
i18n (>= 1.6, < 2)
|
|
28
|
+
logger (>= 1.4.2)
|
|
21
29
|
minitest (>= 5.1)
|
|
22
|
-
|
|
30
|
+
securerandom (>= 0.3)
|
|
31
|
+
tzinfo (~> 2.0, >= 2.0.5)
|
|
32
|
+
uri (>= 0.13.1)
|
|
23
33
|
ast (2.4.2)
|
|
24
34
|
awesome_print (1.9.2)
|
|
25
35
|
base58 (0.2.3)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
36
|
+
base64 (0.2.0)
|
|
37
|
+
benchmark (0.4.0)
|
|
38
|
+
bigdecimal (3.1.8)
|
|
39
|
+
concurrent-ruby (1.3.4)
|
|
40
|
+
connection_pool (2.4.1)
|
|
41
|
+
diff-lcs (1.5.1)
|
|
42
|
+
dotenv (3.1.6)
|
|
43
|
+
drb (2.2.1)
|
|
29
44
|
dry-initializer (3.1.1)
|
|
30
|
-
|
|
45
|
+
ethon (0.16.0)
|
|
46
|
+
ffi (>= 1.15.0)
|
|
47
|
+
ffi (1.17.0-arm64-darwin)
|
|
48
|
+
i18n (1.12.0)
|
|
31
49
|
concurrent-ruby (~> 1.0)
|
|
32
|
-
indefinite_article (0.2.
|
|
50
|
+
indefinite_article (0.2.5)
|
|
33
51
|
activesupport
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
52
|
+
json (2.9.0)
|
|
53
|
+
language_server-protocol (3.17.0.3)
|
|
54
|
+
logger (1.6.3)
|
|
55
|
+
minitest (5.16.3)
|
|
56
|
+
observer (0.1.2)
|
|
57
|
+
parallel (1.26.3)
|
|
58
|
+
parser (3.3.6.0)
|
|
38
59
|
ast (~> 2.4.1)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
60
|
+
racc
|
|
61
|
+
pkg-config (1.5.1)
|
|
62
|
+
racc (1.8.1)
|
|
63
|
+
rack (3.1.8)
|
|
42
64
|
rainbow (3.1.1)
|
|
43
|
-
rake (13.
|
|
44
|
-
regexp_parser (2.
|
|
45
|
-
remedy (0.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
rspec-
|
|
51
|
-
|
|
52
|
-
rspec-
|
|
53
|
-
rspec-
|
|
65
|
+
rake (13.2.1)
|
|
66
|
+
regexp_parser (2.9.3)
|
|
67
|
+
remedy (0.4.0)
|
|
68
|
+
rmagick (6.0.1)
|
|
69
|
+
observer (~> 0.1)
|
|
70
|
+
pkg-config (~> 1.4)
|
|
71
|
+
rspec (3.13.0)
|
|
72
|
+
rspec-core (~> 3.13.0)
|
|
73
|
+
rspec-expectations (~> 3.13.0)
|
|
74
|
+
rspec-mocks (~> 3.13.0)
|
|
75
|
+
rspec-core (3.13.2)
|
|
76
|
+
rspec-support (~> 3.13.0)
|
|
77
|
+
rspec-expectations (3.13.3)
|
|
54
78
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
55
|
-
rspec-support (~> 3.
|
|
56
|
-
rspec-mocks (3.
|
|
79
|
+
rspec-support (~> 3.13.0)
|
|
80
|
+
rspec-mocks (3.13.2)
|
|
57
81
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
58
|
-
rspec-support (~> 3.
|
|
59
|
-
rspec-support (3.
|
|
60
|
-
rubocop (1.
|
|
82
|
+
rspec-support (~> 3.13.0)
|
|
83
|
+
rspec-support (3.13.2)
|
|
84
|
+
rubocop (1.69.2)
|
|
85
|
+
json (~> 2.3)
|
|
86
|
+
language_server-protocol (>= 3.17.0)
|
|
61
87
|
parallel (~> 1.10)
|
|
62
|
-
parser (>= 3.
|
|
88
|
+
parser (>= 3.3.0.2)
|
|
63
89
|
rainbow (>= 2.2.2, < 4.0)
|
|
64
|
-
regexp_parser (>=
|
|
65
|
-
|
|
66
|
-
rubocop-ast (>= 1.16.0, < 2.0)
|
|
90
|
+
regexp_parser (>= 2.9.3, < 3.0)
|
|
91
|
+
rubocop-ast (>= 1.36.2, < 2.0)
|
|
67
92
|
ruby-progressbar (~> 1.7)
|
|
68
|
-
unicode-display_width (>=
|
|
69
|
-
rubocop-ast (1.
|
|
70
|
-
parser (>= 3.
|
|
71
|
-
rubocop-
|
|
72
|
-
rubocop (>= 1.
|
|
73
|
-
rubocop-ast (>=
|
|
93
|
+
unicode-display_width (>= 2.4.0, < 4.0)
|
|
94
|
+
rubocop-ast (1.37.0)
|
|
95
|
+
parser (>= 3.3.1.0)
|
|
96
|
+
rubocop-minitest (0.34.5)
|
|
97
|
+
rubocop (>= 1.39, < 2.0)
|
|
98
|
+
rubocop-ast (>= 1.30.0, < 2.0)
|
|
99
|
+
rubocop-performance (1.23.0)
|
|
100
|
+
rubocop (>= 1.48.1, < 2.0)
|
|
101
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
|
102
|
+
rubocop-rails (2.25.1)
|
|
103
|
+
activesupport (>= 4.2.0)
|
|
104
|
+
rack (>= 1.1)
|
|
105
|
+
rubocop (>= 1.33.0, < 2.0)
|
|
106
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
|
107
|
+
rubocop-rails-omakase (1.0.0)
|
|
108
|
+
rubocop
|
|
109
|
+
rubocop-minitest
|
|
110
|
+
rubocop-performance
|
|
111
|
+
rubocop-rails
|
|
74
112
|
rubocop-rake (0.6.0)
|
|
75
113
|
rubocop (~> 1.0)
|
|
76
|
-
rubocop-rspec (
|
|
77
|
-
rubocop (~> 1.
|
|
78
|
-
ruby-progressbar (1.
|
|
79
|
-
|
|
80
|
-
|
|
114
|
+
rubocop-rspec (3.3.0)
|
|
115
|
+
rubocop (~> 1.61)
|
|
116
|
+
ruby-progressbar (1.13.0)
|
|
117
|
+
securerandom (0.4.0)
|
|
118
|
+
thor (1.3.2)
|
|
119
|
+
typhoeus (1.4.1)
|
|
120
|
+
ethon (>= 0.9.0)
|
|
121
|
+
tzinfo (2.0.5)
|
|
81
122
|
concurrent-ruby (~> 1.0)
|
|
82
|
-
unicode-display_width (
|
|
83
|
-
|
|
123
|
+
unicode-display_width (3.1.2)
|
|
124
|
+
unicode-emoji (~> 4.0, >= 4.0.4)
|
|
125
|
+
unicode-emoji (4.0.4)
|
|
126
|
+
uri (1.0.2)
|
|
127
|
+
zeitwerk (2.7.1)
|
|
84
128
|
|
|
85
129
|
PLATFORMS
|
|
86
130
|
arm64-darwin-21
|
|
131
|
+
arm64-darwin-22
|
|
132
|
+
arm64-darwin-23
|
|
87
133
|
x86_64-linux
|
|
88
134
|
|
|
89
135
|
DEPENDENCIES
|
|
90
|
-
bundler (~> 2.
|
|
91
|
-
rake (~> 13.
|
|
92
|
-
rspec (~> 3.
|
|
93
|
-
rubocop (~> 1.
|
|
94
|
-
rubocop-performance (~> 1.
|
|
136
|
+
bundler (~> 2.5.23)
|
|
137
|
+
rake (~> 13.2.1)
|
|
138
|
+
rspec (~> 3.13.0)
|
|
139
|
+
rubocop (~> 1.69.2)
|
|
140
|
+
rubocop-performance (~> 1.23.0)
|
|
141
|
+
rubocop-rails-omakase (~> 1.0.0)
|
|
95
142
|
rubocop-rake (~> 0.6.0)
|
|
96
|
-
rubocop-rspec (~>
|
|
143
|
+
rubocop-rspec (~> 3.3.0)
|
|
97
144
|
story_key!
|
|
98
145
|
|
|
99
146
|
BUNDLED WITH
|
|
100
|
-
2.
|
|
147
|
+
2.5.23
|
data/README.md
CHANGED
|
@@ -1,30 +1,31 @@
|
|
|
1
1
|
[](https://badge.fury.io/rb/story_key)
|
|
2
|
-

|
|
3
|
-
[](https://travis-ci.org/jcraigk/story_key)
|
|
4
|
-
[](https://codeclimate.com/github/jcraigk/story_key/maintainability)
|
|
5
2
|
|
|
6
3
|
|
|
7
|
-

|
|
8
|
-
|
|
9
4
|
| Gem Version | Locale | Lexicon SHA |
|
|
10
5
|
|-------------|--------|-------------|
|
|
11
|
-
| 0.
|
|
6
|
+
| 0.5.0 | Miami | 3bfbbf9 |
|
|
7
|
+
|
|
8
|
+
Locale will not change until v1.0 release
|
|
12
9
|
|
|
13
10
|
|
|
14
11
|
# StoryKey
|
|
15
12
|
|
|
16
|
-
StoryKey is a [Brainwallet](https://en.bitcoin.it/wiki/Brainwallet) inspired by [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) written in
|
|
13
|
+
StoryKey is a proof of concept [Brainwallet](https://en.bitcoin.it/wiki/Brainwallet) inspired by [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) written in Ruby. It converts an arbitrary string of data, such as a [cryptocurrency private key](https://en.bitcoin.it/wiki/Private_key), into an English paragraph intended for longterm human memory. It also assists in decoding the story back into its original form. Optionally, a visual representation of the paragraph is also provided using [OpenAI DALL-E](https://openai.com/dall-e-3).
|
|
17
14
|
|
|
18
|
-
Each story is provided in
|
|
19
|
-
* Humanized
|
|
15
|
+
Each story is provided in multiple formats:
|
|
16
|
+
* Humanized Text
|
|
20
17
|
* Version locale header ("In Miami I saw...")
|
|
21
18
|
* Enumerated phrases
|
|
22
19
|
* Colorized parts of speech (adjectives, verbs, nouns)
|
|
23
20
|
* Grammatical filler (articles, prepositions, conjunctions, punctuation)
|
|
24
|
-
* Tokenized
|
|
21
|
+
* Tokenized Text
|
|
25
22
|
* Ordered list of unique tokens
|
|
26
23
|
* Space-delimited lowercase alphanumeric/dash
|
|
27
24
|
* Useful as a seed phrase for generating derivative keys
|
|
25
|
+
* Graphical
|
|
26
|
+
* AI-generated images via [DALL-E](https://openai.com/dall-e-3)
|
|
27
|
+
* Requires OpenAI key
|
|
28
|
+
|
|
28
29
|
|
|
29
30
|
## Features
|
|
30
31
|
|
|
@@ -33,7 +34,7 @@ Each story is provided in two formats:
|
|
|
33
34
|
* Includes version slug to ensure accurate decoding
|
|
34
35
|
* Uses a repeating English grammar to aid in mnemonics
|
|
35
36
|
* Uses a lexicon curated for mental visualization
|
|
36
|
-
* Avoids
|
|
37
|
+
* Avoids word repetition
|
|
37
38
|
* Provides interactive command-line recovery
|
|
38
39
|
|
|
39
40
|
Each token of the story, which may be a single word or short compound phrase, encodes 10 bits. The checksum length is variable based on the input size and space available in the last two tokens after accounting for a 4-bit footer. Here are a few example key sizes along with their respective story and checksum sizes.
|
|
@@ -47,24 +48,26 @@ Each token of the story, which may be a single word or short compound phrase, en
|
|
|
47
48
|
| 384 | 40 | 12 |
|
|
48
49
|
| 512 | 53 | 14 |
|
|
49
50
|
|
|
50
|
-
An example key
|
|
51
|
+
An example key with its associated story, seed phrase, and image are shown below.
|
|
52
|
+
|
|
53
|
+

|
|
51
54
|
|
|
52
|
-

|
|
53
56
|
|
|
54
57
|
```
|
|
55
58
|
Key:
|
|
56
|
-
|
|
59
|
+
CgCLLXvoch7sLaQWe5Y3Evtzety2Vr9XJGRmAq9YZUXY
|
|
57
60
|
Story:
|
|
58
61
|
In Miami I saw
|
|
59
|
-
1. a
|
|
60
|
-
2.
|
|
61
|
-
3.
|
|
62
|
-
4. a
|
|
63
|
-
5. a
|
|
64
|
-
6. a
|
|
65
|
-
7. and a
|
|
62
|
+
1. a practical theorist eating toast with a shopkeeper,
|
|
63
|
+
2. a jobless macaw disowning a scientist,
|
|
64
|
+
3. a toothsome brother eating dumplings with Paul Cezanne,
|
|
65
|
+
4. a rabid outsider leveling a vulture,
|
|
66
|
+
5. a hysterical Marge Simpson threatening Moe Szyslak,
|
|
67
|
+
6. a rancid cyborg demanding a jeweler,
|
|
68
|
+
7. and a wife paging Jimi Hendrix.
|
|
66
69
|
Seed Phrase:
|
|
67
|
-
|
|
70
|
+
miami practical theorist eating-toast shopkeeper jobless macaw disowning scientist toothsome brother eating-dumplings paul-cezanne rabid outsider leveling vulture hysterical marge-simpson threatening moe-szyslak rancid cyborg demanding jeweler wife paging jimi-hendrix
|
|
68
71
|
````
|
|
69
72
|
|
|
70
73
|
This paragraph or seed phrase can be deterministically decoded back into its original form using the same version of StoryKey. The locale of the story (e.g. `Miami`) identifies that version. During key recovery, an exception will be raised if:
|
|
@@ -86,11 +89,6 @@ The lexicon was selected using the following criteria:
|
|
|
86
89
|
* Balance brevity with clarity.
|
|
87
90
|
|
|
88
91
|
|
|
89
|
-
### Graphical Visualization
|
|
90
|
-
|
|
91
|
-
When AI becomes more common, StoryKey stories may be converted to graphical panels similar to the [DALL-E Project](https://openai.com/blog/dall-e/). This will likely aid in mnemonics process for many users.
|
|
92
|
-
|
|
93
|
-
|
|
94
92
|
## Installation
|
|
95
93
|
|
|
96
94
|
Add this line to your application's Gemfile:
|
|
@@ -113,7 +111,16 @@ $ gem install story_key
|
|
|
113
111
|
|
|
114
112
|
## Usage
|
|
115
113
|
|
|
116
|
-
This library may be used
|
|
114
|
+
This library may be used directly from the command line or by calling Ruby methods.
|
|
115
|
+
|
|
116
|
+
If you want to generate images of the story along with the text, create a file named `.env` in the project directory and add your [OpenAI key](https://beta.openai.com/account/api-keys) as an environment variable:
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
# .env
|
|
120
|
+
OPENAI_KEY=<your-api-key>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
You must have [ImageMagick](https://imagemagick.org/index.php) installed locally.
|
|
117
124
|
|
|
118
125
|
|
|
119
126
|
### Command Line Usage
|
|
@@ -129,6 +136,8 @@ StoryKey commands:
|
|
|
129
136
|
storykey recover # Decode a story interactively
|
|
130
137
|
```
|
|
131
138
|
|
|
139
|
+
To see help on a specific command, run `bin/storyke --help [command]`.
|
|
140
|
+
|
|
132
141
|
The command line also features an interactive recovery tool to aid in converting a story back into its source key. Run `bin/storykey recover` to initiate the process:
|
|
133
142
|
|
|
134
143
|

|
|
@@ -141,10 +150,10 @@ After installing the gem, you may run `bin/console` or `require` the gem in your
|
|
|
141
150
|
|
|
142
151
|
### Generate new key/story
|
|
143
152
|
|
|
144
|
-
Generate a new random key
|
|
153
|
+
Generate a new random key and associated story.
|
|
145
154
|
|
|
146
155
|
```
|
|
147
|
-
|
|
156
|
+
# StoryKey.generate
|
|
148
157
|
=>
|
|
149
158
|
["4eqfoXzMDyqQW6p8zAQj7c8KkynK5K2BW6D5Vfp7xCaQ",
|
|
150
159
|
#<struct StoryKey::Story
|
|
@@ -157,12 +166,12 @@ Generate a new random key/story pair.
|
|
|
157
166
|
```
|
|
158
167
|
|
|
159
168
|
|
|
160
|
-
### Encode
|
|
169
|
+
### Encode an existing key
|
|
161
170
|
|
|
162
171
|
Produce an English paragraph given input data (e.g. a cryptocurrency private key):
|
|
163
172
|
|
|
164
173
|
```
|
|
165
|
-
|
|
174
|
+
# StoryKey.encode(key: '4eqfoXzMDyqQW6p8zAQj7c8KkynK5K2BW6D5Vfp7xCaQ')
|
|
166
175
|
=>
|
|
167
176
|
#<struct StoryKey::Story
|
|
168
177
|
text=
|
|
@@ -176,12 +185,12 @@ Produce an English paragraph given input data (e.g. a cryptocurrency private key
|
|
|
176
185
|
`key` may be in the form of a hexidecimal (`ab29f3`), a binary string (`1001101`), a decimal (`230938`), or a base58 string (`uMBca`). If not in the default base58, `format` must be provided.
|
|
177
186
|
|
|
178
187
|
|
|
179
|
-
### Decode
|
|
188
|
+
### Decode an existing story
|
|
180
189
|
|
|
181
190
|
Recover source data (e.g. a cryptocurrency private key) based on the English paragraph:
|
|
182
191
|
|
|
183
192
|
```
|
|
184
|
-
|
|
193
|
+
# StoryKey.decode(story: 'In Miami I saw an official Benjamin Franklin transport Matt Damon')
|
|
185
194
|
=> "4NTM"
|
|
186
195
|
```
|
|
187
196
|
|
data/Rakefile
CHANGED
|
Binary file
|
data/assets/error.png
ADDED
|
Binary file
|
data/bin/console
CHANGED
data/examples/card.png
ADDED
|
Binary file
|
data/examples/cli.png
ADDED
|
Binary file
|
|
@@ -46,13 +46,11 @@ clear
|
|
|
46
46
|
cold
|
|
47
47
|
colorful
|
|
48
48
|
comical
|
|
49
|
-
complex
|
|
50
49
|
cosmic
|
|
51
50
|
coy
|
|
52
51
|
cynical
|
|
53
52
|
dangerous
|
|
54
53
|
dark
|
|
55
|
-
dead
|
|
56
54
|
decayed
|
|
57
55
|
deficient
|
|
58
56
|
delicate
|
|
@@ -152,7 +150,6 @@ late
|
|
|
152
150
|
lewd
|
|
153
151
|
liberal
|
|
154
152
|
limpid
|
|
155
|
-
limping
|
|
156
153
|
little
|
|
157
154
|
lively
|
|
158
155
|
lofty
|
|
@@ -307,11 +304,11 @@ volatile
|
|
|
307
304
|
wasteful
|
|
308
305
|
wholesome
|
|
309
306
|
wide
|
|
307
|
+
wide-eyed
|
|
310
308
|
wild
|
|
311
309
|
winged
|
|
312
310
|
wintery
|
|
313
311
|
wobbly
|
|
314
|
-
wonderful
|
|
315
312
|
woozy
|
|
316
313
|
worried
|
|
317
314
|
wrinkled
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
adamant
|
|
2
|
-
|
|
2
|
+
adament
|
|
3
3
|
affable
|
|
4
4
|
affluent
|
|
5
|
-
|
|
5
|
+
aging
|
|
6
6
|
albino
|
|
7
7
|
alcoholic
|
|
8
8
|
alluring
|
|
@@ -50,8 +50,8 @@ chaste
|
|
|
50
50
|
cheap
|
|
51
51
|
childish
|
|
52
52
|
childlike
|
|
53
|
-
choking
|
|
54
53
|
chubby
|
|
54
|
+
churlish
|
|
55
55
|
civilized
|
|
56
56
|
clairvoyant
|
|
57
57
|
clammy
|
|
@@ -91,6 +91,7 @@ dapper
|
|
|
91
91
|
dashing
|
|
92
92
|
dastardly
|
|
93
93
|
dazed
|
|
94
|
+
dead
|
|
94
95
|
deaf
|
|
95
96
|
decadent
|
|
96
97
|
decisive
|
|
@@ -107,6 +108,7 @@ difficult
|
|
|
107
108
|
dignified
|
|
108
109
|
diligent
|
|
109
110
|
dim
|
|
111
|
+
disabled
|
|
110
112
|
discreet
|
|
111
113
|
diseased
|
|
112
114
|
disguised
|
|
@@ -126,7 +128,6 @@ drunk
|
|
|
126
128
|
dull
|
|
127
129
|
dumb
|
|
128
130
|
dutiful
|
|
129
|
-
dying
|
|
130
131
|
eager
|
|
131
132
|
earnest
|
|
132
133
|
elderly
|
|
@@ -358,6 +359,7 @@ purring
|
|
|
358
359
|
pushy
|
|
359
360
|
queasy
|
|
360
361
|
quirky
|
|
362
|
+
quivering
|
|
361
363
|
rambling
|
|
362
364
|
rash
|
|
363
365
|
reckless
|
|
@@ -465,6 +467,7 @@ trashy
|
|
|
465
467
|
trembling
|
|
466
468
|
trendy
|
|
467
469
|
truthful
|
|
470
|
+
twitching
|
|
468
471
|
unconscious
|
|
469
472
|
undead
|
|
470
473
|
unkempt
|