rqrcode 0.10.1 → 1.0.0.pre

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 (44) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +13 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +108 -136
  6. data/Rakefile +10 -0
  7. data/_config.yml +1 -0
  8. data/bin/console +14 -0
  9. data/bin/setup +8 -0
  10. data/images/ansi-screen-shot.png +0 -0
  11. data/images/github-qrcode.png +0 -0
  12. data/images/github-qrcode.svg +32 -0
  13. data/lib/rqrcode.rb +8 -19
  14. data/lib/rqrcode/export.rb +6 -0
  15. data/lib/rqrcode/export/ansi.rb +14 -15
  16. data/lib/rqrcode/export/html.rb +6 -8
  17. data/lib/rqrcode/export/png.rb +18 -19
  18. data/lib/rqrcode/export/svg.rb +7 -6
  19. data/lib/rqrcode/qrcode.rb +3 -4
  20. data/lib/rqrcode/qrcode/qrcode.rb +17 -0
  21. data/lib/rqrcode/version.rb +3 -1
  22. data/rqrcode.gemspec +36 -0
  23. metadata +67 -56
  24. data/CHANGELOG +0 -97
  25. data/LICENSE +0 -19
  26. data/lib/rqrcode/core_ext.rb +0 -5
  27. data/lib/rqrcode/core_ext/array.rb +0 -5
  28. data/lib/rqrcode/core_ext/array/behavior.rb +0 -12
  29. data/lib/rqrcode/core_ext/integer.rb +0 -5
  30. data/lib/rqrcode/core_ext/integer/bitwise.rb +0 -13
  31. data/lib/rqrcode/qrcode/qr_8bit_byte.rb +0 -36
  32. data/lib/rqrcode/qrcode/qr_alphanumeric.rb +0 -47
  33. data/lib/rqrcode/qrcode/qr_bit_buffer.rb +0 -99
  34. data/lib/rqrcode/qrcode/qr_code.rb +0 -585
  35. data/lib/rqrcode/qrcode/qr_math.rb +0 -63
  36. data/lib/rqrcode/qrcode/qr_numeric.rb +0 -57
  37. data/lib/rqrcode/qrcode/qr_polynomial.rb +0 -78
  38. data/lib/rqrcode/qrcode/qr_rs_block.rb +0 -314
  39. data/lib/rqrcode/qrcode/qr_util.rb +0 -272
  40. data/test/data.rb +0 -25
  41. data/test/test_helper.rb +0 -5
  42. data/test/test_regresions.rb +0 -10
  43. data/test/test_rqrcode.rb +0 -155
  44. data/test/test_rqrcode_export.rb +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 26f31be7d65a2c99f43c5f32b04624dd6ccf214e
4
- data.tar.gz: 4e102fa21c4509cd243bc175cb0d4f0093e4a009
2
+ SHA256:
3
+ metadata.gz: a25f372a618c9ff9906fd306ab72592c31213be1aa71aa93cc1949a1ba8fc2d3
4
+ data.tar.gz: 2a140b6b425052375e5b0121f8910e1d16acc10f55c1e4d0cba047f1011e45d1
5
5
  SHA512:
6
- metadata.gz: dd864e4980b78fcfcc4b3c142fea0ee5205599eabfc74f3c9b16023b9c3d7505131dcfe78c4067e59672ffd0bfadd53db1a29a0b57eab6bd953e0c7f309a1cb3
7
- data.tar.gz: 10404efce4d90af63ab2f302f65243ceca285e736350d032acd5d48cf9b9fb768b67d5bf574e31a267f3b214cf0419cbfde6987fc12505282970628bf23da0cc
6
+ metadata.gz: 101c49983286d0f9f956eb4a47c4439dd3a48886c58fa1b25759085fdf529283abf19bc183c93655e0e41b1de14c6ee3f4ee7db998c7410d296fb859be5bb21c
7
+ data.tar.gz: 1321c977a150e091de1ef25260b35232f588d9045f6ac036e8378f11b62bbf5fd39b62c5fab4ba66a4984105b706e516cb7af0ead4b9baa764cc43d6a0746d99
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ /.devcontainer/
10
+ .rvmrc
11
+ *.sublime-project
12
+ *.sublime-workspace
13
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in rqrcode-base.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2008 Duncan Robertson
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md CHANGED
@@ -1,190 +1,182 @@
1
- # rQRCode, Encode QRCodes
1
+ __UPDATE:__ A new pre-release has been made [v1.0.0.pre](https://github.com/whomwah/rqrcode/releases/tag/v1.0.0.pre). A fresh start after a _long_ pause. There is actually no new functionality in the release but there are some dependency changes. Minimum Ruby version is now `~> 2.3`. This release also cleans up the internals a bit. The core `QR Code` generation has been extracted into a new [rqrcode_core](https://github.com/whomwah/rqrcode_core) gem. This enables `qrqcode` to concentrate on rendering. Once `v1.0.0.pre` has had time for people to try I'll release `v1.0.0` of `rqrcode` and then concentrate on working through issues and PRs although I appreciate many of these may be old and out of date now! You can install this pre-release with `gem install rqrcode --pre` or `gem 'rqrcode', '>= 1.0.0.pre'` in your `Gemfile`.
2
2
 
3
- [![Build Status](https://travis-ci.org/whomwah/rqrcode.svg?branch=master)](https://travis-ci.org/whomwah/rqrcode)
4
3
 
5
- **All users of rqrcode are highly recomended to upgrade to version 0.5.5 ore later!**
4
+ # RQRCode
6
5
 
7
- ## Short changelog
6
+ [![Codeship Status for whomwah/rqrcode](https://app.codeship.com/projects/66910bf0-809b-0137-b2d8-06fb89da20d2/status?branch=master)](https://app.codeship.com/projects/352496)
8
7
 
9
- *0.10.1* (Feb 11, 2016)
8
+ [RQRCode](https://github.com/whomwah/rqrcode) is a library for creating and rendering QR codes into various formats. It has a simple interface with all the standard QR code options. It was adapted from the Javascript library by Kazuhiko Arase.
10
9
 
11
- - Changed so that gem wont include images and tests.
12
-
13
- *0.10.0* (Feb 11, 2016)
10
+ * QR code is trademarked by Denso Wave inc
11
+ * For `rqrcode` releases `< 1.0.0` please use [this README](https://github.com/whomwah/rqrcode/blob/cd2732a68434e6197c219e6c8cbdadfce0c4c4f3/README.md)
14
12
 
15
- - Merged as_ansi by [Andy Brody](https://github.com/ab)
13
+ ## Installing
16
14
 
17
- *0.9.0* (Jan 3, 2016)
15
+ Add this line to your application's `Gemfile`:
18
16
 
19
- - Added support for auto selecting qrcode size up to level 40. (only worked up to level 10 before)
20
- - Added numeric support during auto selection of qrcode mode.
17
+ ```ruby
18
+ gem 'rqrcode'
19
+ ```
21
20
 
22
- *0.8.1* (Jan 3, 2016)
21
+ or install manually:
23
22
 
24
- - Remove active support specific `present?`.
25
- - Fix so that all tests are run.
23
+ ```ruby
24
+ gem install rqrcode
25
+ ```
26
26
 
27
- *0.8.0* (Dec 18, 2015)
27
+ ## Basic usage example
28
28
 
29
- - Added numeric QR code support
30
- - Dropped Ruby v1.8 support
29
+ ```ruby
30
+ require 'rqrcode'
31
31
 
32
- ## Overview
32
+ qr = RQRCode::QRCode.new('http://github.com')
33
+ result = ''
33
34
 
34
- rQRCode is a library for encoding QR Codes in Ruby. It has a simple interface with all the standard qrcode options. It was adapted from the Javascript library by Kazuhiko Arase.
35
+ qr.qrcode.modules.each do |row|
36
+ row.each do |col|
37
+ result << (col ? 'X' : 'O')
38
+ end
35
39
 
36
- Let's clear up some rQRCode stuff.
40
+ result << "\n"
41
+ end
37
42
 
38
- * rQRCode is a __ruby only library__ It requires no native libraries. Just Ruby!
39
- * It is an encoding library. You can't decode QR codes with it.
40
- * The interface is simple and assumes you just want to encode a string into a QR code
41
- * QR code is trademarked by Denso Wave inc
43
+ puts result
44
+ ```
42
45
 
43
- ## Installing
46
+ ### Advanced Options
44
47
 
45
- You may get the latest stable version from Rubygems.
48
+ These are the various QR Code generation options provided by [rqrqcode_core](https://github.com/whomwah/rqrcode_core).
46
49
 
47
- ```ruby
48
- gem install rqrcode
49
50
  ```
51
+ string - the string you wish to encode
50
52
 
51
- ## Using rQRCode
53
+ size - the size of the qrcode (default 4)
52
54
 
53
- ```ruby
54
- require 'rqrcode'
55
+ level - the error correction level, can be:
56
+ * Level :l 7% of code can be restored
57
+ * Level :m 15% of code can be restored
58
+ * Level :q 25% of code can be restored
59
+ * Level :h 30% of code can be restored (default :h)
55
60
 
56
- qrcode = RQRCode::QRCode.new("http://github.com/")
57
- image = qrcode.as_png
58
- svg = qrcode.as_svg
59
- html = qrcode.as_html
60
- string = qrcode.as_ansi
61
- string = qrcode.to_s
61
+ mode - the mode of the qrcode (defaults to alphanumeric or byte_8bit, depending on the input data):
62
+ * :number
63
+ * :alphanumeric
64
+ * :byte_8bit
65
+ * :kanji
62
66
  ```
63
67
 
64
- ## Image Rendering
65
- ### SVG
68
+ Example
69
+
70
+ ```
71
+ qrcode = RQRCodeCore::QRCode.new('hello world', size: 1, level: :m, mode: :alphanumeric)
72
+ ```
73
+
74
+ ## Render types
75
+
76
+ You can output your QR code in various forms. These are detailed below:
77
+
78
+ ### as SVG
66
79
 
67
80
  The SVG renderer will produce a stand-alone SVG as a `String`
68
81
 
69
82
  ```ruby
83
+ require 'rqrcode'
84
+
70
85
  qrcode = RQRCode::QRCode.new("http://github.com/")
71
- # With default options specified explicitly
72
- svg = qrcode.as_svg(offset: 0, color: '000',
73
- shape_rendering: 'crispEdges',
74
- module_size: 11)
86
+
87
+ # NOTE: showing with default options specified explicitly
88
+ svg = qrcode.as_svg(
89
+ offset: 0,
90
+ color: '000',
91
+ shape_rendering: 'crispEdges',
92
+ module_size: 6
93
+ )
75
94
  ```
76
95
 
77
96
  ![QR code with github url](./images/github-qrcode.svg)
78
97
 
79
- ### ANSI
98
+ ### as ANSI
80
99
 
81
100
  The ANSI renderer will produce as a string with ANSI color codes.
82
101
 
83
102
  ```ruby
103
+ require 'rqrcode'
104
+
84
105
  qrcode = RQRCode::QRCode.new("http://github.com/")
85
- # With default options specified explicitly
86
- svg = qrcode.as_ansi_(light: "\033[47m", dark: "\033[40m",
87
- fill_character: ' ',
88
- quiet_zone_size: 4)
106
+
107
+ # NOTE: showing with default options specified explicitly
108
+ svg = qrcode.as_ansi(
109
+ light: "\033[47m", dark: "\033[40m",
110
+ fill_character: ' ',
111
+ quiet_zone_size: 4
112
+ )
89
113
  ```
90
114
 
91
115
  ![QR code with github url](./images/ansi-screen-shot.png)
92
116
 
93
- ### PNG
117
+ ### as PNG
94
118
 
95
119
  The library can produce a PNG. Result will be a `ChunkyPNG::Image` instance.
96
120
 
97
121
  ```ruby
122
+ require 'rqrcode'
123
+
98
124
  qrcode = RQRCode::QRCode.new("http://github.com/")
99
- # With default options specified explicitly
125
+
126
+ # NOTE: showing with default options specified explicitly
100
127
  png = qrcode.as_png(
101
- resize_gte_to: false,
102
- resize_exactly_to: false,
103
- fill: 'white',
104
- color: 'black',
105
- size: 120,
106
- border_modules: 4,
107
- module_px_size: 6,
108
- file: nil # path to write
109
- )
128
+ resize_gte_to: false,
129
+ resize_exactly_to: false,
130
+ fill: 'white',
131
+ color: 'black',
132
+ size: 120,
133
+ border_modules: 4,
134
+ module_px_size: 6,
135
+ file: nil # path to write
136
+ )
137
+
110
138
  IO.write("/tmp/github-qrcode.png", png.to_s)
111
139
  ```
112
140
 
113
141
  ![QR code with github url](./images/github-qrcode.png)
114
142
 
115
- ## HTML Rendering
116
- ### In your controller
117
- ```ruby
118
- @qr = RQRCode::QRCode.new( 'https://github.com/whomwah/rqrcode', :size => 4, :level => :h )
119
- ```
143
+ ### On the console ( just because you can )
120
144
 
121
- ### In your view
122
- ```html
123
- <%= raw @qr.as_html %>
124
- ```
145
+ ```ruby
146
+ require 'rqrcode'
125
147
 
126
- ### CSS
127
- ```css
128
- table {
129
- border-width: 0;
130
- border-style: none;
131
- border-color: #0000ff;
132
- border-collapse: collapse;
133
- }
134
-
135
- td {
136
- border-left: solid 10px #000;
137
- padding: 0;
138
- margin: 0;
139
- width: 0px;
140
- height: 10px;
141
- }
142
-
143
- td.black { border-color: #000; }
144
- td.white { border-color: #fff; }
145
- ```
146
-
147
- ## On the console
148
+ qr = RQRCode::QRCode.new('http://kyan.com', size: 4, level: :h)
148
149
 
149
- ```ruby
150
- qr = RQRCode::QRCode.new( 'my string to generate', :size => 4, :level => :h )
151
150
  puts qr.to_s
152
151
  ```
153
152
 
154
153
  Output:
155
154
 
156
155
  ```
157
- xxxxxxx x x x x x xx xxxxxxx
158
- x x xxx xxxxxx xxx x x
159
- x xxx x xxxxx x xx x xxx x
160
- ... etc
156
+ xxxxxxx x x xxx xxxxxxx
157
+ x x xxxxx x x x x
158
+ x xxx x x x x x xxx x
159
+ x xxx x xxx x xxx x xxx x
160
+ x xxx x xxx x x x x xxx x
161
+ ... etc
161
162
  ```
162
163
 
163
- ## Doing your own rendering
164
- ```ruby
165
- qr = RQRCode::QRCode.new( 'my string to generate', :size => 4, :level => :h )
166
- qr.modules.each do |row|
167
- row.each do |col|
168
- print col ? "X" : " "
169
- end
170
- print "\n"
171
- end
172
- ```
173
-
174
- ## Specifying QR code mode
164
+ ## API Documentation
175
165
 
176
- Sometimes you may want to specify the QR code mode explicitly.
166
+ [http://www.rubydoc.info/gems/rqrcode](http://www.rubydoc.info/gems/rqrcode)
177
167
 
178
- It is done via the `mode` option. Allowed values are: `number`, `alphanumeric` and `byte_8bit`.
168
+ ## Contributing
169
+ * Fork the project
170
+ * Send a pull request
171
+ * Don't touch the .gemspec, I'll do that when I release a new version
179
172
 
180
- ```ruby
181
- qr = RQRCode::QRCode.new( '1234567890', :size => 2, :level => :m, :mode => :number )
182
- ```
173
+ ## Authors
183
174
 
175
+ Original RQRCode author: Duncan Robertson
184
176
 
185
- ## API Documentation
177
+ A massive thanks to [all the contributors of the library over the years](https://github.com/whomwah/rqrcode/graphs/contributors). It wouldn't exist if it wasn't for you all.
186
178
 
187
- [http://www.rubydoc.info/gems/rqrcode](http://www.rubydoc.info/gems/rqrcode)
179
+ Oh, and thanks to my bosses at https://kyan.com for giving me time to maintain this project.
188
180
 
189
181
  ## Resources
190
182
 
@@ -192,26 +184,6 @@ qr = RQRCode::QRCode.new( '1234567890', :size => 2, :level => :m, :mode => :numb
192
184
  * Denso-Wave website:: http://www.denso-wave.com/qrcode/index-e.html
193
185
  * kaywa:: http://qrcode.kaywa.com
194
186
 
195
- ## Authors
196
-
197
- Original author: Duncan Robertson
198
-
199
- Special thanks to the following people for submitting patches:
200
-
201
- * [Andy Brody](https://github.com/ab)
202
- * [Chris Mowforth](http://blog.99th.st)
203
- * [Daniel Schierbeck](https://github.com/dasch)
204
- * [Gioele Barabucci](https://github.com/gioele)
205
- * [Ken Collins](https://github.com/metaskills)
206
- * [Rob la Lau](https://github.com/ohreally)
207
- * [Tore Darell](http://tore.darell.no)
208
- * Vladislav Gorodetskiy
209
-
210
- ## Contributing
211
- * Fork the project
212
- * Send a pull request
213
- * Don't touch the .gemspec, I'll do that when I release a new version
214
-
215
187
  ## Copyright
216
188
 
217
189
  MIT License (http://www.opensource.org/licenses/mit-license.html)
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
@@ -0,0 +1 @@
1
+ theme: jekyll-theme-slate
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "rqrcode"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
Binary file
@@ -0,0 +1,32 @@
1
+ <?xml version="1.0" standalone="yes"?>
2
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" width="174" height="174" shape-rendering="crispEdges">
3
+ <rect width="6" height="6" x="0" y="0" style="fill:#000"/><rect width="6" height="6" x="6" y="0" style="fill:#000"/><rect width="6" height="6" x="12" y="0" style="fill:#000"/><rect width="6" height="6" x="18" y="0" style="fill:#000"/><rect width="6" height="6" x="24" y="0" style="fill:#000"/><rect width="6" height="6" x="30" y="0" style="fill:#000"/><rect width="6" height="6" x="36" y="0" style="fill:#000"/><rect width="6" height="6" x="54" y="0" style="fill:#000"/><rect width="6" height="6" x="60" y="0" style="fill:#000"/><rect width="6" height="6" x="66" y="0" style="fill:#000"/><rect width="6" height="6" x="78" y="0" style="fill:#000"/><rect width="6" height="6" x="108" y="0" style="fill:#000"/><rect width="6" height="6" x="114" y="0" style="fill:#000"/><rect width="6" height="6" x="132" y="0" style="fill:#000"/><rect width="6" height="6" x="138" y="0" style="fill:#000"/><rect width="6" height="6" x="144" y="0" style="fill:#000"/><rect width="6" height="6" x="150" y="0" style="fill:#000"/><rect width="6" height="6" x="156" y="0" style="fill:#000"/><rect width="6" height="6" x="162" y="0" style="fill:#000"/><rect width="6" height="6" x="168" y="0" style="fill:#000"/>
4
+ <rect width="6" height="6" x="0" y="6" style="fill:#000"/><rect width="6" height="6" x="36" y="6" style="fill:#000"/><rect width="6" height="6" x="60" y="6" style="fill:#000"/><rect width="6" height="6" x="66" y="6" style="fill:#000"/><rect width="6" height="6" x="78" y="6" style="fill:#000"/><rect width="6" height="6" x="84" y="6" style="fill:#000"/><rect width="6" height="6" x="90" y="6" style="fill:#000"/><rect width="6" height="6" x="96" y="6" style="fill:#000"/><rect width="6" height="6" x="108" y="6" style="fill:#000"/><rect width="6" height="6" x="120" y="6" style="fill:#000"/><rect width="6" height="6" x="132" y="6" style="fill:#000"/><rect width="6" height="6" x="168" y="6" style="fill:#000"/>
5
+ <rect width="6" height="6" x="0" y="12" style="fill:#000"/><rect width="6" height="6" x="12" y="12" style="fill:#000"/><rect width="6" height="6" x="18" y="12" style="fill:#000"/><rect width="6" height="6" x="24" y="12" style="fill:#000"/><rect width="6" height="6" x="36" y="12" style="fill:#000"/><rect width="6" height="6" x="48" y="12" style="fill:#000"/><rect width="6" height="6" x="54" y="12" style="fill:#000"/><rect width="6" height="6" x="72" y="12" style="fill:#000"/><rect width="6" height="6" x="90" y="12" style="fill:#000"/><rect width="6" height="6" x="108" y="12" style="fill:#000"/><rect width="6" height="6" x="120" y="12" style="fill:#000"/><rect width="6" height="6" x="132" y="12" style="fill:#000"/><rect width="6" height="6" x="144" y="12" style="fill:#000"/><rect width="6" height="6" x="150" y="12" style="fill:#000"/><rect width="6" height="6" x="156" y="12" style="fill:#000"/><rect width="6" height="6" x="168" y="12" style="fill:#000"/>
6
+ <rect width="6" height="6" x="0" y="18" style="fill:#000"/><rect width="6" height="6" x="12" y="18" style="fill:#000"/><rect width="6" height="6" x="18" y="18" style="fill:#000"/><rect width="6" height="6" x="24" y="18" style="fill:#000"/><rect width="6" height="6" x="36" y="18" style="fill:#000"/><rect width="6" height="6" x="48" y="18" style="fill:#000"/><rect width="6" height="6" x="54" y="18" style="fill:#000"/><rect width="6" height="6" x="60" y="18" style="fill:#000"/><rect width="6" height="6" x="78" y="18" style="fill:#000"/><rect width="6" height="6" x="90" y="18" style="fill:#000"/><rect width="6" height="6" x="102" y="18" style="fill:#000"/><rect width="6" height="6" x="114" y="18" style="fill:#000"/><rect width="6" height="6" x="120" y="18" style="fill:#000"/><rect width="6" height="6" x="132" y="18" style="fill:#000"/><rect width="6" height="6" x="144" y="18" style="fill:#000"/><rect width="6" height="6" x="150" y="18" style="fill:#000"/><rect width="6" height="6" x="156" y="18" style="fill:#000"/><rect width="6" height="6" x="168" y="18" style="fill:#000"/>
7
+ <rect width="6" height="6" x="0" y="24" style="fill:#000"/><rect width="6" height="6" x="12" y="24" style="fill:#000"/><rect width="6" height="6" x="18" y="24" style="fill:#000"/><rect width="6" height="6" x="24" y="24" style="fill:#000"/><rect width="6" height="6" x="36" y="24" style="fill:#000"/><rect width="6" height="6" x="60" y="24" style="fill:#000"/><rect width="6" height="6" x="66" y="24" style="fill:#000"/><rect width="6" height="6" x="72" y="24" style="fill:#000"/><rect width="6" height="6" x="78" y="24" style="fill:#000"/><rect width="6" height="6" x="84" y="24" style="fill:#000"/><rect width="6" height="6" x="90" y="24" style="fill:#000"/><rect width="6" height="6" x="96" y="24" style="fill:#000"/><rect width="6" height="6" x="102" y="24" style="fill:#000"/><rect width="6" height="6" x="114" y="24" style="fill:#000"/><rect width="6" height="6" x="132" y="24" style="fill:#000"/><rect width="6" height="6" x="144" y="24" style="fill:#000"/><rect width="6" height="6" x="150" y="24" style="fill:#000"/><rect width="6" height="6" x="156" y="24" style="fill:#000"/><rect width="6" height="6" x="168" y="24" style="fill:#000"/>
8
+ <rect width="6" height="6" x="0" y="30" style="fill:#000"/><rect width="6" height="6" x="36" y="30" style="fill:#000"/><rect width="6" height="6" x="60" y="30" style="fill:#000"/><rect width="6" height="6" x="66" y="30" style="fill:#000"/><rect width="6" height="6" x="90" y="30" style="fill:#000"/><rect width="6" height="6" x="102" y="30" style="fill:#000"/><rect width="6" height="6" x="108" y="30" style="fill:#000"/><rect width="6" height="6" x="132" y="30" style="fill:#000"/><rect width="6" height="6" x="168" y="30" style="fill:#000"/>
9
+ <rect width="6" height="6" x="0" y="36" style="fill:#000"/><rect width="6" height="6" x="6" y="36" style="fill:#000"/><rect width="6" height="6" x="12" y="36" style="fill:#000"/><rect width="6" height="6" x="18" y="36" style="fill:#000"/><rect width="6" height="6" x="24" y="36" style="fill:#000"/><rect width="6" height="6" x="30" y="36" style="fill:#000"/><rect width="6" height="6" x="36" y="36" style="fill:#000"/><rect width="6" height="6" x="48" y="36" style="fill:#000"/><rect width="6" height="6" x="60" y="36" style="fill:#000"/><rect width="6" height="6" x="72" y="36" style="fill:#000"/><rect width="6" height="6" x="84" y="36" style="fill:#000"/><rect width="6" height="6" x="96" y="36" style="fill:#000"/><rect width="6" height="6" x="108" y="36" style="fill:#000"/><rect width="6" height="6" x="120" y="36" style="fill:#000"/><rect width="6" height="6" x="132" y="36" style="fill:#000"/><rect width="6" height="6" x="138" y="36" style="fill:#000"/><rect width="6" height="6" x="144" y="36" style="fill:#000"/><rect width="6" height="6" x="150" y="36" style="fill:#000"/><rect width="6" height="6" x="156" y="36" style="fill:#000"/><rect width="6" height="6" x="162" y="36" style="fill:#000"/><rect width="6" height="6" x="168" y="36" style="fill:#000"/>
10
+ <rect width="6" height="6" x="54" y="42" style="fill:#000"/><rect width="6" height="6" x="72" y="42" style="fill:#000"/><rect width="6" height="6" x="78" y="42" style="fill:#000"/><rect width="6" height="6" x="84" y="42" style="fill:#000"/><rect width="6" height="6" x="114" y="42" style="fill:#000"/>
11
+ <rect width="6" height="6" x="18" y="48" style="fill:#000"/><rect width="6" height="6" x="24" y="48" style="fill:#000"/><rect width="6" height="6" x="36" y="48" style="fill:#000"/><rect width="6" height="6" x="42" y="48" style="fill:#000"/><rect width="6" height="6" x="54" y="48" style="fill:#000"/><rect width="6" height="6" x="72" y="48" style="fill:#000"/><rect width="6" height="6" x="90" y="48" style="fill:#000"/><rect width="6" height="6" x="96" y="48" style="fill:#000"/><rect width="6" height="6" x="108" y="48" style="fill:#000"/><rect width="6" height="6" x="114" y="48" style="fill:#000"/><rect width="6" height="6" x="120" y="48" style="fill:#000"/><rect width="6" height="6" x="150" y="48" style="fill:#000"/><rect width="6" height="6" x="156" y="48" style="fill:#000"/>
12
+ <rect width="6" height="6" x="12" y="54" style="fill:#000"/><rect width="6" height="6" x="18" y="54" style="fill:#000"/><rect width="6" height="6" x="24" y="54" style="fill:#000"/><rect width="6" height="6" x="30" y="54" style="fill:#000"/><rect width="6" height="6" x="54" y="54" style="fill:#000"/><rect width="6" height="6" x="72" y="54" style="fill:#000"/><rect width="6" height="6" x="78" y="54" style="fill:#000"/><rect width="6" height="6" x="84" y="54" style="fill:#000"/><rect width="6" height="6" x="96" y="54" style="fill:#000"/><rect width="6" height="6" x="120" y="54" style="fill:#000"/><rect width="6" height="6" x="132" y="54" style="fill:#000"/><rect width="6" height="6" x="144" y="54" style="fill:#000"/><rect width="6" height="6" x="150" y="54" style="fill:#000"/><rect width="6" height="6" x="162" y="54" style="fill:#000"/>
13
+ <rect width="6" height="6" x="6" y="60" style="fill:#000"/><rect width="6" height="6" x="18" y="60" style="fill:#000"/><rect width="6" height="6" x="36" y="60" style="fill:#000"/><rect width="6" height="6" x="48" y="60" style="fill:#000"/><rect width="6" height="6" x="78" y="60" style="fill:#000"/><rect width="6" height="6" x="108" y="60" style="fill:#000"/><rect width="6" height="6" x="132" y="60" style="fill:#000"/>
14
+ <rect width="6" height="6" x="6" y="66" style="fill:#000"/><rect width="6" height="6" x="12" y="66" style="fill:#000"/><rect width="6" height="6" x="18" y="66" style="fill:#000"/><rect width="6" height="6" x="30" y="66" style="fill:#000"/><rect width="6" height="6" x="42" y="66" style="fill:#000"/><rect width="6" height="6" x="48" y="66" style="fill:#000"/><rect width="6" height="6" x="54" y="66" style="fill:#000"/><rect width="6" height="6" x="72" y="66" style="fill:#000"/><rect width="6" height="6" x="78" y="66" style="fill:#000"/><rect width="6" height="6" x="84" y="66" style="fill:#000"/><rect width="6" height="6" x="96" y="66" style="fill:#000"/><rect width="6" height="6" x="108" y="66" style="fill:#000"/><rect width="6" height="6" x="126" y="66" style="fill:#000"/><rect width="6" height="6" x="150" y="66" style="fill:#000"/><rect width="6" height="6" x="168" y="66" style="fill:#000"/>
15
+ <rect width="6" height="6" x="24" y="72" style="fill:#000"/><rect width="6" height="6" x="36" y="72" style="fill:#000"/><rect width="6" height="6" x="42" y="72" style="fill:#000"/><rect width="6" height="6" x="48" y="72" style="fill:#000"/><rect width="6" height="6" x="54" y="72" style="fill:#000"/><rect width="6" height="6" x="60" y="72" style="fill:#000"/><rect width="6" height="6" x="78" y="72" style="fill:#000"/><rect width="6" height="6" x="90" y="72" style="fill:#000"/><rect width="6" height="6" x="102" y="72" style="fill:#000"/><rect width="6" height="6" x="114" y="72" style="fill:#000"/><rect width="6" height="6" x="126" y="72" style="fill:#000"/><rect width="6" height="6" x="132" y="72" style="fill:#000"/><rect width="6" height="6" x="138" y="72" style="fill:#000"/><rect width="6" height="6" x="150" y="72" style="fill:#000"/><rect width="6" height="6" x="162" y="72" style="fill:#000"/>
16
+ <rect width="6" height="6" x="6" y="78" style="fill:#000"/><rect width="6" height="6" x="12" y="78" style="fill:#000"/><rect width="6" height="6" x="24" y="78" style="fill:#000"/><rect width="6" height="6" x="30" y="78" style="fill:#000"/><rect width="6" height="6" x="78" y="78" style="fill:#000"/><rect width="6" height="6" x="84" y="78" style="fill:#000"/><rect width="6" height="6" x="102" y="78" style="fill:#000"/><rect width="6" height="6" x="132" y="78" style="fill:#000"/><rect width="6" height="6" x="144" y="78" style="fill:#000"/><rect width="6" height="6" x="156" y="78" style="fill:#000"/><rect width="6" height="6" x="168" y="78" style="fill:#000"/>
17
+ <rect width="6" height="6" x="0" y="84" style="fill:#000"/><rect width="6" height="6" x="12" y="84" style="fill:#000"/><rect width="6" height="6" x="18" y="84" style="fill:#000"/><rect width="6" height="6" x="30" y="84" style="fill:#000"/><rect width="6" height="6" x="36" y="84" style="fill:#000"/><rect width="6" height="6" x="42" y="84" style="fill:#000"/><rect width="6" height="6" x="48" y="84" style="fill:#000"/><rect width="6" height="6" x="72" y="84" style="fill:#000"/><rect width="6" height="6" x="78" y="84" style="fill:#000"/><rect width="6" height="6" x="108" y="84" style="fill:#000"/><rect width="6" height="6" x="114" y="84" style="fill:#000"/><rect width="6" height="6" x="120" y="84" style="fill:#000"/><rect width="6" height="6" x="150" y="84" style="fill:#000"/><rect width="6" height="6" x="162" y="84" style="fill:#000"/><rect width="6" height="6" x="168" y="84" style="fill:#000"/>
18
+ <rect width="6" height="6" x="0" y="90" style="fill:#000"/><rect width="6" height="6" x="12" y="90" style="fill:#000"/><rect width="6" height="6" x="30" y="90" style="fill:#000"/><rect width="6" height="6" x="60" y="90" style="fill:#000"/><rect width="6" height="6" x="78" y="90" style="fill:#000"/><rect width="6" height="6" x="102" y="90" style="fill:#000"/><rect width="6" height="6" x="108" y="90" style="fill:#000"/><rect width="6" height="6" x="120" y="90" style="fill:#000"/><rect width="6" height="6" x="150" y="90" style="fill:#000"/><rect width="6" height="6" x="156" y="90" style="fill:#000"/>
19
+ <rect width="6" height="6" x="18" y="96" style="fill:#000"/><rect width="6" height="6" x="24" y="96" style="fill:#000"/><rect width="6" height="6" x="30" y="96" style="fill:#000"/><rect width="6" height="6" x="36" y="96" style="fill:#000"/><rect width="6" height="6" x="48" y="96" style="fill:#000"/><rect width="6" height="6" x="60" y="96" style="fill:#000"/><rect width="6" height="6" x="72" y="96" style="fill:#000"/><rect width="6" height="6" x="78" y="96" style="fill:#000"/><rect width="6" height="6" x="84" y="96" style="fill:#000"/><rect width="6" height="6" x="108" y="96" style="fill:#000"/><rect width="6" height="6" x="114" y="96" style="fill:#000"/><rect width="6" height="6" x="120" y="96" style="fill:#000"/><rect width="6" height="6" x="132" y="96" style="fill:#000"/><rect width="6" height="6" x="138" y="96" style="fill:#000"/><rect width="6" height="6" x="150" y="96" style="fill:#000"/><rect width="6" height="6" x="162" y="96" style="fill:#000"/>
20
+ <rect width="6" height="6" x="0" y="102" style="fill:#000"/><rect width="6" height="6" x="6" y="102" style="fill:#000"/><rect width="6" height="6" x="12" y="102" style="fill:#000"/><rect width="6" height="6" x="18" y="102" style="fill:#000"/><rect width="6" height="6" x="54" y="102" style="fill:#000"/><rect width="6" height="6" x="66" y="102" style="fill:#000"/><rect width="6" height="6" x="96" y="102" style="fill:#000"/><rect width="6" height="6" x="102" y="102" style="fill:#000"/><rect width="6" height="6" x="108" y="102" style="fill:#000"/><rect width="6" height="6" x="120" y="102" style="fill:#000"/><rect width="6" height="6" x="132" y="102" style="fill:#000"/><rect width="6" height="6" x="138" y="102" style="fill:#000"/><rect width="6" height="6" x="144" y="102" style="fill:#000"/>
21
+ <rect width="6" height="6" x="0" y="108" style="fill:#000"/><rect width="6" height="6" x="6" y="108" style="fill:#000"/><rect width="6" height="6" x="18" y="108" style="fill:#000"/><rect width="6" height="6" x="24" y="108" style="fill:#000"/><rect width="6" height="6" x="36" y="108" style="fill:#000"/><rect width="6" height="6" x="60" y="108" style="fill:#000"/><rect width="6" height="6" x="72" y="108" style="fill:#000"/><rect width="6" height="6" x="90" y="108" style="fill:#000"/><rect width="6" height="6" x="120" y="108" style="fill:#000"/><rect width="6" height="6" x="144" y="108" style="fill:#000"/><rect width="6" height="6" x="168" y="108" style="fill:#000"/>
22
+ <rect width="6" height="6" x="0" y="114" style="fill:#000"/><rect width="6" height="6" x="6" y="114" style="fill:#000"/><rect width="6" height="6" x="12" y="114" style="fill:#000"/><rect width="6" height="6" x="18" y="114" style="fill:#000"/><rect width="6" height="6" x="24" y="114" style="fill:#000"/><rect width="6" height="6" x="30" y="114" style="fill:#000"/><rect width="6" height="6" x="42" y="114" style="fill:#000"/><rect width="6" height="6" x="48" y="114" style="fill:#000"/><rect width="6" height="6" x="60" y="114" style="fill:#000"/><rect width="6" height="6" x="72" y="114" style="fill:#000"/><rect width="6" height="6" x="78" y="114" style="fill:#000"/><rect width="6" height="6" x="90" y="114" style="fill:#000"/><rect width="6" height="6" x="126" y="114" style="fill:#000"/><rect width="6" height="6" x="132" y="114" style="fill:#000"/><rect width="6" height="6" x="138" y="114" style="fill:#000"/><rect width="6" height="6" x="156" y="114" style="fill:#000"/><rect width="6" height="6" x="168" y="114" style="fill:#000"/>
23
+ <rect width="6" height="6" x="0" y="120" style="fill:#000"/><rect width="6" height="6" x="6" y="120" style="fill:#000"/><rect width="6" height="6" x="12" y="120" style="fill:#000"/><rect width="6" height="6" x="30" y="120" style="fill:#000"/><rect width="6" height="6" x="36" y="120" style="fill:#000"/><rect width="6" height="6" x="60" y="120" style="fill:#000"/><rect width="6" height="6" x="66" y="120" style="fill:#000"/><rect width="6" height="6" x="72" y="120" style="fill:#000"/><rect width="6" height="6" x="108" y="120" style="fill:#000"/><rect width="6" height="6" x="120" y="120" style="fill:#000"/><rect width="6" height="6" x="126" y="120" style="fill:#000"/><rect width="6" height="6" x="132" y="120" style="fill:#000"/><rect width="6" height="6" x="138" y="120" style="fill:#000"/><rect width="6" height="6" x="144" y="120" style="fill:#000"/><rect width="6" height="6" x="150" y="120" style="fill:#000"/><rect width="6" height="6" x="156" y="120" style="fill:#000"/><rect width="6" height="6" x="162" y="120" style="fill:#000"/><rect width="6" height="6" x="168" y="120" style="fill:#000"/>
24
+ <rect width="6" height="6" x="48" y="126" style="fill:#000"/><rect width="6" height="6" x="60" y="126" style="fill:#000"/><rect width="6" height="6" x="78" y="126" style="fill:#000"/><rect width="6" height="6" x="84" y="126" style="fill:#000"/><rect width="6" height="6" x="120" y="126" style="fill:#000"/><rect width="6" height="6" x="144" y="126" style="fill:#000"/><rect width="6" height="6" x="150" y="126" style="fill:#000"/><rect width="6" height="6" x="156" y="126" style="fill:#000"/>
25
+ <rect width="6" height="6" x="0" y="132" style="fill:#000"/><rect width="6" height="6" x="6" y="132" style="fill:#000"/><rect width="6" height="6" x="12" y="132" style="fill:#000"/><rect width="6" height="6" x="18" y="132" style="fill:#000"/><rect width="6" height="6" x="24" y="132" style="fill:#000"/><rect width="6" height="6" x="30" y="132" style="fill:#000"/><rect width="6" height="6" x="36" y="132" style="fill:#000"/><rect width="6" height="6" x="48" y="132" style="fill:#000"/><rect width="6" height="6" x="66" y="132" style="fill:#000"/><rect width="6" height="6" x="72" y="132" style="fill:#000"/><rect width="6" height="6" x="114" y="132" style="fill:#000"/><rect width="6" height="6" x="120" y="132" style="fill:#000"/><rect width="6" height="6" x="132" y="132" style="fill:#000"/><rect width="6" height="6" x="144" y="132" style="fill:#000"/><rect width="6" height="6" x="156" y="132" style="fill:#000"/>
26
+ <rect width="6" height="6" x="0" y="138" style="fill:#000"/><rect width="6" height="6" x="36" y="138" style="fill:#000"/><rect width="6" height="6" x="60" y="138" style="fill:#000"/><rect width="6" height="6" x="66" y="138" style="fill:#000"/><rect width="6" height="6" x="72" y="138" style="fill:#000"/><rect width="6" height="6" x="78" y="138" style="fill:#000"/><rect width="6" height="6" x="96" y="138" style="fill:#000"/><rect width="6" height="6" x="108" y="138" style="fill:#000"/><rect width="6" height="6" x="114" y="138" style="fill:#000"/><rect width="6" height="6" x="120" y="138" style="fill:#000"/><rect width="6" height="6" x="144" y="138" style="fill:#000"/><rect width="6" height="6" x="150" y="138" style="fill:#000"/><rect width="6" height="6" x="162" y="138" style="fill:#000"/><rect width="6" height="6" x="168" y="138" style="fill:#000"/>
27
+ <rect width="6" height="6" x="0" y="144" style="fill:#000"/><rect width="6" height="6" x="12" y="144" style="fill:#000"/><rect width="6" height="6" x="18" y="144" style="fill:#000"/><rect width="6" height="6" x="24" y="144" style="fill:#000"/><rect width="6" height="6" x="36" y="144" style="fill:#000"/><rect width="6" height="6" x="48" y="144" style="fill:#000"/><rect width="6" height="6" x="54" y="144" style="fill:#000"/><rect width="6" height="6" x="72" y="144" style="fill:#000"/><rect width="6" height="6" x="102" y="144" style="fill:#000"/><rect width="6" height="6" x="108" y="144" style="fill:#000"/><rect width="6" height="6" x="114" y="144" style="fill:#000"/><rect width="6" height="6" x="120" y="144" style="fill:#000"/><rect width="6" height="6" x="126" y="144" style="fill:#000"/><rect width="6" height="6" x="132" y="144" style="fill:#000"/><rect width="6" height="6" x="138" y="144" style="fill:#000"/><rect width="6" height="6" x="144" y="144" style="fill:#000"/><rect width="6" height="6" x="168" y="144" style="fill:#000"/>
28
+ <rect width="6" height="6" x="0" y="150" style="fill:#000"/><rect width="6" height="6" x="12" y="150" style="fill:#000"/><rect width="6" height="6" x="18" y="150" style="fill:#000"/><rect width="6" height="6" x="24" y="150" style="fill:#000"/><rect width="6" height="6" x="36" y="150" style="fill:#000"/><rect width="6" height="6" x="48" y="150" style="fill:#000"/><rect width="6" height="6" x="60" y="150" style="fill:#000"/><rect width="6" height="6" x="66" y="150" style="fill:#000"/><rect width="6" height="6" x="72" y="150" style="fill:#000"/><rect width="6" height="6" x="78" y="150" style="fill:#000"/><rect width="6" height="6" x="84" y="150" style="fill:#000"/><rect width="6" height="6" x="96" y="150" style="fill:#000"/><rect width="6" height="6" x="126" y="150" style="fill:#000"/><rect width="6" height="6" x="138" y="150" style="fill:#000"/><rect width="6" height="6" x="162" y="150" style="fill:#000"/>
29
+ <rect width="6" height="6" x="0" y="156" style="fill:#000"/><rect width="6" height="6" x="12" y="156" style="fill:#000"/><rect width="6" height="6" x="18" y="156" style="fill:#000"/><rect width="6" height="6" x="24" y="156" style="fill:#000"/><rect width="6" height="6" x="36" y="156" style="fill:#000"/><rect width="6" height="6" x="60" y="156" style="fill:#000"/><rect width="6" height="6" x="66" y="156" style="fill:#000"/><rect width="6" height="6" x="72" y="156" style="fill:#000"/><rect width="6" height="6" x="90" y="156" style="fill:#000"/><rect width="6" height="6" x="126" y="156" style="fill:#000"/><rect width="6" height="6" x="144" y="156" style="fill:#000"/><rect width="6" height="6" x="156" y="156" style="fill:#000"/><rect width="6" height="6" x="162" y="156" style="fill:#000"/><rect width="6" height="6" x="168" y="156" style="fill:#000"/>
30
+ <rect width="6" height="6" x="0" y="162" style="fill:#000"/><rect width="6" height="6" x="36" y="162" style="fill:#000"/><rect width="6" height="6" x="54" y="162" style="fill:#000"/><rect width="6" height="6" x="72" y="162" style="fill:#000"/><rect width="6" height="6" x="84" y="162" style="fill:#000"/><rect width="6" height="6" x="114" y="162" style="fill:#000"/><rect width="6" height="6" x="120" y="162" style="fill:#000"/><rect width="6" height="6" x="132" y="162" style="fill:#000"/><rect width="6" height="6" x="144" y="162" style="fill:#000"/><rect width="6" height="6" x="150" y="162" style="fill:#000"/><rect width="6" height="6" x="156" y="162" style="fill:#000"/><rect width="6" height="6" x="168" y="162" style="fill:#000"/>
31
+ <rect width="6" height="6" x="0" y="168" style="fill:#000"/><rect width="6" height="6" x="6" y="168" style="fill:#000"/><rect width="6" height="6" x="12" y="168" style="fill:#000"/><rect width="6" height="6" x="18" y="168" style="fill:#000"/><rect width="6" height="6" x="24" y="168" style="fill:#000"/><rect width="6" height="6" x="30" y="168" style="fill:#000"/><rect width="6" height="6" x="36" y="168" style="fill:#000"/><rect width="6" height="6" x="54" y="168" style="fill:#000"/><rect width="6" height="6" x="84" y="168" style="fill:#000"/><rect width="6" height="6" x="96" y="168" style="fill:#000"/><rect width="6" height="6" x="108" y="168" style="fill:#000"/><rect width="6" height="6" x="120" y="168" style="fill:#000"/><rect width="6" height="6" x="138" y="168" style="fill:#000"/><rect width="6" height="6" x="144" y="168" style="fill:#000"/>
32
+ </svg>