flatulent 0.0.1 → 0.0.2

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.
Files changed (69) hide show
  1. data/README +60 -16
  2. data/flatulent-0.0.2.gem +0 -0
  3. data/lib/flatulent/crypt/blowfish-tables.rb +190 -0
  4. data/lib/flatulent/crypt/blowfish.rb +109 -0
  5. data/lib/flatulent/crypt/cbc.rb +123 -0
  6. data/lib/flatulent/crypt/gost.rb +140 -0
  7. data/lib/flatulent/crypt/idea.rb +193 -0
  8. data/lib/flatulent/crypt/noise.rb +94 -0
  9. data/lib/flatulent/crypt/purerubystringio.rb +378 -0
  10. data/lib/flatulent/crypt/rijndael-tables.rb +117 -0
  11. data/lib/flatulent/crypt/rijndael.rb +269 -0
  12. data/lib/flatulent/crypt/stringxor.rb +27 -0
  13. data/lib/flatulent.rb +332 -121
  14. data/lib/flatulent.rb.bak +337 -0
  15. data/rails/app/controllers/flatulent_controller.rb +61 -6
  16. data/rails/lib/flatulent/attributes.rb +79 -0
  17. data/rails/lib/flatulent/crypt/blowfish-tables.rb +190 -0
  18. data/rails/lib/flatulent/crypt/blowfish.rb +109 -0
  19. data/rails/lib/flatulent/crypt/cbc.rb +123 -0
  20. data/rails/lib/flatulent/crypt/gost.rb +140 -0
  21. data/rails/lib/flatulent/crypt/idea.rb +193 -0
  22. data/rails/lib/flatulent/crypt/noise.rb +94 -0
  23. data/rails/lib/flatulent/crypt/purerubystringio.rb +378 -0
  24. data/rails/lib/flatulent/crypt/rijndael-tables.rb +117 -0
  25. data/rails/lib/flatulent/crypt/rijndael.rb +269 -0
  26. data/rails/lib/flatulent/fontfiles/banner.flf +2494 -0
  27. data/rails/lib/flatulent/fontfiles/big.flf +2204 -0
  28. data/rails/lib/flatulent/fontfiles/block.flf +1691 -0
  29. data/rails/lib/flatulent/fontfiles/bubble.flf +1630 -0
  30. data/rails/lib/flatulent/fontfiles/digital.flf +1286 -0
  31. data/rails/lib/flatulent/fontfiles/ivrit.flf +900 -0
  32. data/rails/lib/flatulent/fontfiles/lean.flf +1691 -0
  33. data/rails/lib/flatulent/fontfiles/mini.flf +899 -0
  34. data/rails/lib/flatulent/fontfiles/mnemonic.flf +3702 -0
  35. data/rails/lib/flatulent/fontfiles/script.flf +1493 -0
  36. data/rails/lib/flatulent/fontfiles/shadow.flf +1097 -0
  37. data/rails/lib/flatulent/fontfiles/slant.flf +1295 -0
  38. data/rails/lib/flatulent/fontfiles/small.flf +1097 -0
  39. data/rails/lib/flatulent/fontfiles/smscript.flf +1097 -0
  40. data/rails/lib/flatulent/fontfiles/smshadow.flf +899 -0
  41. data/rails/lib/flatulent/fontfiles/smslant.flf +1097 -0
  42. data/rails/lib/flatulent/fontfiles/standard.flf +2227 -0
  43. data/rails/lib/flatulent/fontfiles/term.flf +600 -0
  44. data/rails/lib/flatulent/pervasives.rb +32 -0
  45. data/rails/lib/flatulent/stringxor.rb +27 -0
  46. data/rails/lib/flatulent/text/double_metaphone.rb +356 -0
  47. data/rails/lib/flatulent/text/figlet/font.rb +117 -0
  48. data/rails/lib/flatulent/text/figlet/smusher.rb +64 -0
  49. data/rails/lib/flatulent/text/figlet/typesetter.rb +68 -0
  50. data/rails/lib/flatulent/text/figlet.rb +17 -0
  51. data/rails/lib/flatulent/text/levenshtein.rb +65 -0
  52. data/rails/lib/flatulent/text/metaphone.rb +97 -0
  53. data/rails/lib/flatulent/text/porter_stemming.rb +171 -0
  54. data/rails/lib/flatulent/text/soundex.rb +61 -0
  55. data/rails/lib/flatulent/text.rb +6 -0
  56. data/rails/lib/flatulent.rb +450 -0
  57. data/rails/log/development.log +14297 -0
  58. data/rails/log/fastcgi.crash.log +111 -0
  59. data/rails/log/lighttpd.access.log +3993 -0
  60. data/rails/log/lighttpd.error.log +111 -0
  61. data/rails/tmp/cache/javascripts/prototype.js-gzip-3275912-71260-1183440172 +0 -0
  62. data/rails/tmp/sessions/ruby_sess.32d68bc997054475 +0 -0
  63. data/rails/tmp/sessions/ruby_sess.4694a4b9bdf9bcf4 +0 -0
  64. data/rails/tmp/sessions/ruby_sess.99469fde69043a05 +0 -0
  65. data/rails/tmp/sessions/ruby_sess.a588c0a457345912 +0 -0
  66. data/rails/tmp/sessions/ruby_sess.b3344125a84a3efa +0 -0
  67. data/samples.rb +10 -0
  68. metadata +69 -3
  69. data/flatulent-0.0.0.gem +0 -0
@@ -0,0 +1,337 @@
1
+ # TODO - encrypt time
2
+ # TODO - noise is image chars
3
+ # TODO - newline in value??
4
+ # TODO - vertical offset in chars
5
+
6
+ class Flatulent
7
+ Flatulent::VERSION = '0.0.2' unless defined? Flatulent::VERSION
8
+ def self.flatulent() Flatulent::VERSION end
9
+ def self.libdir() File.expand_path(__FILE__).gsub(%r/\.rb$/, '') end
10
+
11
+ require 'cgi'
12
+ require 'base64'
13
+ require 'digest/md5'
14
+
15
+ begin
16
+ require 'rubygems'
17
+ rescue LoadError
18
+ end
19
+
20
+ begin
21
+ $:.unshift libdir
22
+ require 'text/figlet'
23
+ require 'crypt/blowfish'
24
+ require 'pervasives'
25
+ require 'attributes'
26
+ ensure
27
+ $:.shift
28
+ end
29
+
30
+ class Error < ::StandardError; end
31
+ class EncryptionError < Error; end
32
+ class TimeBombError < Error; end
33
+
34
+
35
+ singleton_class =
36
+ class << self
37
+ self
38
+ end
39
+
40
+ singleton_class.module_eval do
41
+
42
+ attribute('fontdir'){ File.join libdir, 'fontfiles' }
43
+
44
+ attribute('style'){ Hash[
45
+ 'white-space' => 'pre,nowrap',
46
+ 'font-family' => 'monospace',
47
+ 'font-weight' => 'bold',
48
+ 'display' => 'table',
49
+ 'padding' => '11px',
50
+ 'background' => '#ffc',
51
+ 'color' => '#00f',
52
+ ] }
53
+
54
+ attribute('noise_style'){ Hash[
55
+ 'color' => '#ccc',
56
+ ] }
57
+
58
+ attribute('key'){ default_key }
59
+
60
+ def valid? keywords = {}
61
+ begin
62
+ validate! keywords
63
+ true
64
+ rescue EncryptionError, TimeBombError
65
+ false
66
+ end
67
+ end
68
+
69
+ # TODO - time should be encrypted too
70
+
71
+ def validate! keywords = {}
72
+ keywords = keywords['flatulent'] if keywords.has_key?('flatulent')
73
+ keywords = keywords[:flatulent] if keywords.has_key?(:flatulent)
74
+
75
+ opts = getopts keywords
76
+
77
+ captcha = opts['c'] or raise 'no captcha'
78
+ string = opts['s'] or raise 'no string'
79
+ time = opts['t'] or raise 'no time'
80
+
81
+ expected = zeroh(decrypt(string))
82
+ actual = zeroh(captcha)
83
+ raise EncryptionError, "expected #{ expected } got #{ actual }" unless
84
+ expected == actual
85
+
86
+ timebomb = Time.at(Integer(decrypt(time))).utc rescue(raise("bad time #{ time }"))
87
+ raise TimeBombError unless Time.now.utc <= timebomb
88
+
89
+ return actual
90
+ end
91
+
92
+ def zeroh string
93
+ string.gsub(%r/[0Oo]/, '0') # ignore diffs between 0/o/O
94
+ end
95
+
96
+ def blowfish
97
+ @blowfish ||= Hash.new{|h,k| h[k] = Crypt::Blowfish.new(key)}
98
+ end
99
+
100
+ def munge string
101
+ string.strip.downcase
102
+ end
103
+
104
+ def encrypt string
105
+ Base64.encode64(blowfish[key].encrypt_string(string.to_s)).chop # kill "\n"
106
+ end
107
+
108
+ def decrypt string
109
+ munge(blowfish[key].decrypt_string(Base64.decode64("#{ string }\n")))
110
+ end
111
+
112
+ def getopts options
113
+ lambda do |key, *default|
114
+ default = default.first
115
+ break options[key] if options.has_key?(key)
116
+ key = key.to_s
117
+ break options[key] if options.has_key?(key)
118
+ key = key.to_sym
119
+ break options[key] if options.has_key?(key)
120
+ break default
121
+ end
122
+ end
123
+
124
+ def default_key
125
+ #attribute('default_key') do
126
+ return @default_key if defined? @default_key
127
+ require 'socket'
128
+ hostname = Socket.gethostname
129
+ maddr = mac_address rescue nil
130
+ warn "could not determine mac addresss!" unless maddr
131
+ #puts(( Digest::MD5.hexdigest "--#{ hostname }--#{ maddr }--" ))
132
+ #Digest::MD5.hexdigest "--#{ hostname }--#{ maddr }--"
133
+ #@default_key = "--#{ hostname }--#{ maddr }--"
134
+ @default_key = "--#{ hostname }--#{ maddr }--"
135
+ end
136
+
137
+ def mac_address
138
+ return @mac_address if defined? @mac_address
139
+ re = %r/[^:\-](?:[0-9A-F][0-9A-F][:\-]){5}[0-9A-F][0-9A-F][^:\-]/io
140
+ cmds = '/sbin/ifconfig', '/bin/ifconfig', 'ifconfig', 'ipconfig /all'
141
+
142
+ null = test(?e, '/dev/null') ? '/dev/null' : 'NUL'
143
+
144
+ lines = nil
145
+ cmds.each do |cmd|
146
+ stdout = IO.popen("#{ cmd } 2> #{ null }"){|fd| fd.readlines} rescue next
147
+ next unless stdout and stdout.size > 0
148
+ lines = stdout and break
149
+ end
150
+ raise "all of #{ cmds.join ' ' } failed" unless lines
151
+
152
+ candidates = lines.select{|line| line =~ re}
153
+ raise 'no mac address candidates' unless candidates.first
154
+ candidates.map!{|c| c[re]}
155
+
156
+ maddr = candidates.first
157
+ raise 'no mac address found' unless maddr
158
+
159
+ maddr.strip!
160
+ maddr.instance_eval{ @list = candidates; def list() @list end }
161
+
162
+ @mac_address = maddr
163
+ end
164
+
165
+ def figlet options = {}
166
+ new(options).figlet
167
+ end
168
+ def element options = {}
169
+ new(options).element
170
+ end
171
+ def form_tags options = {}
172
+ new(options).form_tags
173
+ end
174
+ def form options = {}
175
+ new(options).form
176
+ end
177
+ end
178
+
179
+ singleton_class.attributes.each{|a| attribute(a){ self.class.send a}}
180
+
181
+ attribute 'string'
182
+ attribute 'size'
183
+ attribute 'font'
184
+ attribute 'noise'
185
+ attribute 'id'
186
+ attribute 'action'
187
+ attribute 'ttl'
188
+
189
+ attribute 'figlet'
190
+ attribute 'element'
191
+ attribute 'form_tags'
192
+ attribute 'form'
193
+
194
+ def initialize arg = {}
195
+ if Hash === arg
196
+ opt = getopts arg
197
+ @size = Integer opt[ 'size', 4 ]
198
+ @string = String opt[ 'string', generate_random_string ]
199
+ else
200
+ opt = getopts Hash.new
201
+ @string = String arg
202
+ @size = @string.size
203
+ end
204
+
205
+ @font = String opt[ 'font', 'big' ]
206
+ @noise = Float opt[ 'noise', 0.05 ]
207
+ @id = String opt[ 'id', 'flatulent' ]
208
+ @action = String opt[ 'action' ]
209
+ @ttl = Integer opt[ 'ttl', 5 * 60 ]
210
+
211
+ figlet!
212
+ element!
213
+ form_tags!
214
+ form!
215
+ end
216
+
217
+ def generate_random_string
218
+ chars = ('A' .. 'Z').to_a + ('1' .. '9').to_a ### zero is too much like o/O
219
+ Array.new(@size).map{ chars[rand(chars.size - 1)]}.join
220
+ end
221
+
222
+ def figlet!
223
+ spaced = @string.split(%r//).join(' ')
224
+ fontfile = File.join fontdir, "#{ @font }.flf"
225
+ font = Text::Figlet::Font.new fontfile
226
+ typesetter = Text::Figlet::Typesetter.new font
227
+ @figlet = typesetter[spaced]
228
+ end
229
+
230
+ def element!
231
+ rows = []
232
+ rows << (row = [])
233
+ chars = @figlet.split %r//
234
+ size = chars.size
235
+ last = size - 1
236
+ drawn = chars.select{|char| char !~ %r/\s/}
237
+
238
+ chars.each_with_index do |char, idx|
239
+ content =
240
+ case char
241
+ when %r/\n/o
242
+ "<br>"
243
+ when %r/\s/o
244
+ rand > 0.42 ? "&nbsp;" : " "
245
+ when %r/([^\s])/o
246
+ $1
247
+ end
248
+ row << content
249
+ rows << (row = []) unless idx == last
250
+ end
251
+
252
+ (@noise * chars.size).ceil.times do
253
+ y = rand(rows.size - 1)
254
+ x = rand(rows.first.size - 1)
255
+ next if rows[y][x] == '<br>'
256
+ char = drawn[ rand(drawn.size) ]
257
+ rows[y][x] = "<span 'style=#{ noise_css }'>#{ char }</span>"
258
+ end
259
+
260
+ content = rows.join
261
+ @element = "<pre id='#{ @id }_element' style='#{ css }'>#{ content }</pre>"
262
+ end
263
+
264
+ def css
265
+ css_for style
266
+ end
267
+ def noise_css
268
+ css_for noise_style
269
+ end
270
+
271
+ def css_for hash
272
+ hash.map{|kv| kv.join ':'}.join ';'
273
+ end
274
+
275
+ def form_tags!
276
+ n = @string.scan(%r/\w/).size
277
+ string = @string
278
+ timebomb = Time.now.utc.to_i + @ttl
279
+ @form_tags = <<-html
280
+ #{ element }
281
+ <p id='#{ @id }_instructions'>
282
+ Please enter the #{ n } large characters (A-Z, 1-9) shown.
283
+ </p>
284
+ <input type='textarea' name='#{ @id }[c]' id='#{ @id }_textarea' />
285
+ <input type='hidden' name='#{ @id }[s]' id='#{ @id }_e' value='#{ encrypt string }' />
286
+ <input type='hidden' name='#{ @id }[t]' id='#{ @id }_v' value='#{ encrypt timebomb }' />
287
+ html
288
+ end
289
+ alias_method 'to_html', 'form_tags'
290
+
291
+ def encrypt string
292
+ self.class.encrypt string.to_s
293
+ end
294
+
295
+ def encrypted
296
+ self.class.encrypt @string
297
+ end
298
+
299
+ def munge string
300
+ self.class.munge string
301
+ end
302
+
303
+ def form!
304
+ action = "action='#{ @action }'"
305
+ @form = <<-html
306
+ <form method='post' #{ action }>
307
+ #{ form_tags }
308
+ <input type='submit' name='#{ @id }[submit]' id='#{ @id }_submit' value='Submit' />
309
+ </form>
310
+ html
311
+ end
312
+
313
+ def to_html
314
+ element
315
+ end
316
+
317
+ def to_s
318
+ form
319
+ end
320
+
321
+ def getopts options
322
+ self.class.getopts options
323
+ end
324
+ end
325
+
326
+ def Flatulent(*a, &b) Flatulent.new(*a, &b) end
327
+
328
+ if $0 == __FILE__
329
+ #string = rand.to_s
330
+ #puts Flatulent(string)
331
+ #Flatulent.validate! :t => string, :e => Flatulent.encrypt(string), :v => (Time.now.utc.to_i + 60)
332
+ e = Flatulent.encrypt('foobar')
333
+ p e
334
+ p Flatulent.decrypt(e)
335
+
336
+ #puts Flatulent.element('foobar')
337
+ end
@@ -1,20 +1,75 @@
1
1
  class FlatulentController < ApplicationController
2
2
  $:.unshift '../../lib'
3
- require 'flatulent'
3
+ load 'flatulent.rb'
4
+ #require 'flatulent.rb'
4
5
 
5
- def index
6
+ def figlet
7
+ render :text => Flatulent.figlet(params), :content_type => 'text/plain'
8
+ end
9
+
10
+ def element
11
+ render :text => Flatulent.element(params)
12
+ end
13
+
14
+ def form_tags
15
+ render :text => Flatulent.form_tags(params)
16
+ end
17
+ alias_method 'captcha', 'form_tags'
18
+
19
+ def form
6
20
  if params.has_key? 'flatulent'
7
- valid = Flatulent.validate! params
21
+ valid =
22
+ begin
23
+ Flatulent.validate! params
24
+ true
25
+ rescue Flatulent::Error
26
+ false
27
+ end
8
28
  end
9
29
 
10
30
  render :inline => <<-html
11
31
  <html><body>
12
- <hr> valid : #{ valid } <hr>
13
-
32
+ valid? : #{ valid.inspect } <hr> <hr>
14
33
  #{ Flatulent.form }
15
-
34
+ <hr> <hr> <a href="./">new</a>
16
35
  </body></html>
17
36
  html
37
+ end
38
+ alias_method 'index', 'form'
39
+ alias_method 'test', 'form'
18
40
 
41
+
42
+
43
+ def ajax
44
+ if params.has_key? 'flatulent'
45
+ valid =
46
+ begin
47
+ Flatulent.validate! params
48
+ true
49
+ rescue Flatulent::Error
50
+ false
51
+ end
52
+ end
53
+
54
+ render :inline => <<-html
55
+ <html>
56
+ <title>Stank Thang</title>
57
+ <head>
58
+ <%= javascript_include_tag 'prototype' %>
59
+ </head>
60
+ <body>
61
+ captcha'd? : #{ valid } <hr> <hr>
62
+
63
+ <form action='./' method='post'>
64
+ <%= Flatulent.ajax %>
65
+
66
+ <hr>
67
+ <input type='submit' name='submit' value='submit' />
68
+ </form>
69
+
70
+ <hr> <a href="./">new</a>
71
+ </body>
72
+ </html>
73
+ html
19
74
  end
20
75
  end
@@ -0,0 +1,79 @@
1
+ require 'pervasives'
2
+
3
+ module Attributes
4
+ VERSION = '3.5.0'
5
+ def self.version() VERSION end
6
+
7
+ def attributes *a, &b
8
+ unless a.empty?
9
+ hashes, names = a.partition{|x| Hash === x}
10
+
11
+ names_and_defaults = {}
12
+ hashes.each{|h| names_and_defaults.update h}
13
+ names.flatten.compact.each{|name| names_and_defaults.update name => nil}
14
+
15
+ names_and_defaults.each do |name, default|
16
+ init = b || lambda { default }
17
+ ivar, getter, setter, query, banger =
18
+ "@#{ name }", "#{ name }", "#{ name }=", "#{ name }?", "#{ name }!"
19
+
20
+ define_method(setter) do |value|
21
+ __pervasive__('instance_variable_set', ivar, value)
22
+ end
23
+
24
+ define_method(getter) do |*value|
25
+ unless value.empty?
26
+ __pervasive__('send', setter, value.shift)
27
+ else
28
+ defined = __pervasive__('instance_eval', "defined? #{ ivar }")
29
+ __pervasive__('send', setter, __pervasive__('instance_eval', &init)) unless defined
30
+ __pervasive__('instance_variable_get', ivar)
31
+ end
32
+ end
33
+
34
+ define_method(banger) do
35
+ __pervasive__('send', setter, __pervasive__('instance_eval', &init))
36
+ __pervasive__('instance_variable_get', ivar)
37
+ end
38
+
39
+ alias_method query, getter
40
+
41
+ (attributes << name.to_s).uniq!
42
+ attributes
43
+ end
44
+ else
45
+ begin
46
+ __attribute_list__
47
+ rescue NameError
48
+ singleton_class =
49
+ class << self
50
+ self
51
+ end
52
+ klass = self
53
+ singleton_class.module_eval do
54
+ attribute_list = []
55
+ define_method('attribute_list'){ klass == self ? attribute_list : raise(NameError) }
56
+ alias_method '__attribute_list__', 'attribute_list'
57
+ end
58
+ __attribute_list__
59
+ end
60
+ end
61
+ end
62
+
63
+ %w( __attributes__ __attribute__ attribute ).each{|dst| alias_method dst, 'attributes'}
64
+ end
65
+
66
+ class Object
67
+ def attributes *a, &b
68
+ sc =
69
+ class << self
70
+ self
71
+ end
72
+ sc.attributes *a, &b
73
+ end
74
+ %w( __attributes__ __attribute__ attribute ).each{|dst| alias_method dst, 'attributes'}
75
+ end
76
+
77
+ class Module
78
+ include Attributes
79
+ end
@@ -0,0 +1,190 @@
1
+ # blowfish-tables.rb Richard Kernahan <kernighan_rich@rubyforge.org>
2
+
3
+ module Crypt
4
+ module BlowfishTables
5
+
6
+ INITIALPARRAY = [
7
+ 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0,
8
+ 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
9
+ 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b
10
+ ]
11
+
12
+ INITIALSBOXES = [[
13
+ 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96,
14
+ 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
15
+ 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0x0d95748f, 0x728eb658,
16
+ 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
17
+ 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e,
18
+ 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
19
+ 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6,
20
+ 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
21
+ 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c,
22
+ 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
23
+ 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1,
24
+ 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
25
+ 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a,
26
+ 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
27
+ 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176,
28
+ 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
29
+ 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706,
30
+ 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
31
+ 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b,
32
+ 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
33
+ 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c,
34
+ 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
35
+ 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a,
36
+ 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
37
+ 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760,
38
+ 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
39
+ 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8,
40
+ 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
41
+ 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33,
42
+ 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
43
+ 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0,
44
+ 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
45
+ 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777,
46
+ 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
47
+ 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705,
48
+ 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
49
+ 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e,
50
+ 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
51
+ 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, 0x83260376, 0x6295cfa9,
52
+ 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
53
+ 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f,
54
+ 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
55
+ 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a], [
56
+ 0x4b7a70e9, 0xb5b32944,
57
+ 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
58
+ 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29,
59
+ 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
60
+ 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26,
61
+ 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
62
+ 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c,
63
+ 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
64
+ 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6,
65
+ 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
66
+ 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f,
67
+ 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
68
+ 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810,
69
+ 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
70
+ 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa,
71
+ 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
72
+ 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55,
73
+ 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
74
+ 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1,
75
+ 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
76
+ 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78,
77
+ 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
78
+ 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883,
79
+ 0xb17f37d1, 0x018cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
80
+ 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170,
81
+ 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
82
+ 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7,
83
+ 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
84
+ 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099,
85
+ 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
86
+ 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263,
87
+ 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
88
+ 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3,
89
+ 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
90
+ 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7,
91
+ 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
92
+ 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x095bbf00, 0xad19489d,
93
+ 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
94
+ 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460,
95
+ 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
96
+ 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484,
97
+ 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
98
+ 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a,
99
+ 0xe6e39f2b, 0xdb83adf7], [
100
+ 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
101
+ 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a,
102
+ 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
103
+ 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785,
104
+ 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
105
+ 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900,
106
+ 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
107
+ 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9,
108
+ 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
109
+ 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397,
110
+ 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
111
+ 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9,
112
+ 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
113
+ 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x07f9c9ee, 0x41041f0f,
114
+ 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
115
+ 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e,
116
+ 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
117
+ 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd,
118
+ 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
119
+ 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8,
120
+ 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
121
+ 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c,
122
+ 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
123
+ 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b,
124
+ 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
125
+ 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0x0a121386,
126
+ 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
127
+ 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0,
128
+ 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
129
+ 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2,
130
+ 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
131
+ 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770,
132
+ 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
133
+ 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x09f0be8c,
134
+ 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
135
+ 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa,
136
+ 0xa002b5c4, 0x0de6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
137
+ 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63,
138
+ 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
139
+ 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9,
140
+ 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
141
+ 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4,
142
+ 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0], [
143
+ 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742,
144
+ 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
145
+ 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79,
146
+ 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
147
+ 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a,
148
+ 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
149
+ 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1,
150
+ 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
151
+ 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797,
152
+ 0x2cf0b7d9, 0x022b8b51, 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
153
+ 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6,
154
+ 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
155
+ 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba,
156
+ 0x03a16125, 0x0564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
157
+ 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5,
158
+ 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
159
+ 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce,
160
+ 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
161
+ 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, 0xb39a460a, 0x6445c0dd,
162
+ 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
163
+ 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb,
164
+ 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
165
+ 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc,
166
+ 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
167
+ 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc,
168
+ 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
169
+ 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a,
170
+ 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
171
+ 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a,
172
+ 0x0f91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
173
+ 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b,
174
+ 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
175
+ 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e,
176
+ 0xe60b6f47, 0x0fe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
177
+ 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623,
178
+ 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
179
+ 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a,
180
+ 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
181
+ 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3,
182
+ 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
183
+ 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c,
184
+ 0x01c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
185
+ 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6]
186
+ ]
187
+
188
+
189
+ end
190
+ end