api_struct 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.rspec +3 -0
- data/.rubocop.yml +14 -0
- data/.ruby-version +1 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +105 -0
- data/LICENSE.txt +21 -0
- data/README.md +203 -0
- data/Rakefile +6 -0
- data/api_struct.gemspec +34 -0
- data/api_struct.svg +1 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/circle.yml +3 -0
- data/lib/api_struct.rb +19 -0
- data/lib/api_struct/client.rb +86 -0
- data/lib/api_struct/collection.rb +19 -0
- data/lib/api_struct/concerns/underscore.rb +11 -0
- data/lib/api_struct/entity.rb +84 -0
- data/lib/api_struct/errors/client.rb +41 -0
- data/lib/api_struct/errors/entity.rb +7 -0
- data/lib/api_struct/extensions/api_client.rb +43 -0
- data/lib/api_struct/extensions/dry_monads.rb +18 -0
- data/lib/api_struct/settings.rb +7 -0
- data/lib/api_struct/version.rb +3 -0
- data/spec/api_struct/client_spec.rb +118 -0
- data/spec/api_struct/entity_spec.rb +185 -0
- data/spec/fixtures/cassettes/posts/1.yml +73 -0
- data/spec/fixtures/cassettes/posts/index_success.yml +1335 -0
- data/spec/fixtures/cassettes/posts/show_failure.yml +67 -0
- data/spec/fixtures/cassettes/posts/show_success.yml +73 -0
- data/spec/fixtures/cassettes/posts/suffix.yml +73 -0
- data/spec/fixtures/cassettes/posts/update_success.yml +71 -0
- data/spec/fixtures/cassettes/todos.yml +143 -0
- data/spec/fixtures/cassettes/users/1/posts.yml +1049 -0
- data/spec/fixtures/cassettes/users/1/posts/1.yml +797 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/support/stub.rb +9 -0
- metadata +272 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6d1040aa384318bbffeb1b90f19db3f980aa4469
|
4
|
+
data.tar.gz: 0d77437b31acf598ead5c8bc7a756c55ea4b837a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3d9aeaace35a53c521bd81cde6addf3f3c2f1439887165523ba026db7f92434e07c4b8526c99d89dfad738b14fc2f184064e52f2588f8a951a676882c94a5f48
|
7
|
+
data.tar.gz: c00a0bdcacbda8c59b95795a67304a8b9697ce6bd31dfaba9628f6aec32f8a979e7a981d926f8e5333ae5438745e9f00f2ec28ffb79b8879cfeb1a3eb4b09449
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.4.1
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
api_struct (0.1.0)
|
5
|
+
dry-configurable (~> 0.7.0)
|
6
|
+
dry-monads (~> 0.3.1)
|
7
|
+
hashie (~> 3.5, >= 3.5.6)
|
8
|
+
http (>= 2.0.3)
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: https://rubygems.org/
|
12
|
+
specs:
|
13
|
+
addressable (2.5.2)
|
14
|
+
public_suffix (>= 2.0.2, < 4.0)
|
15
|
+
ast (2.3.0)
|
16
|
+
byebug (9.1.0)
|
17
|
+
coderay (1.1.2)
|
18
|
+
concurrent-ruby (1.0.5)
|
19
|
+
crack (0.4.3)
|
20
|
+
safe_yaml (~> 1.0.0)
|
21
|
+
diff-lcs (1.3)
|
22
|
+
domain_name (0.5.20170404)
|
23
|
+
unf (>= 0.0.5, < 1.0.0)
|
24
|
+
dry-configurable (0.7.0)
|
25
|
+
concurrent-ruby (~> 1.0)
|
26
|
+
dry-core (0.4.1)
|
27
|
+
concurrent-ruby (~> 1.0)
|
28
|
+
dry-equalizer (0.2.0)
|
29
|
+
dry-monads (0.3.1)
|
30
|
+
dry-core
|
31
|
+
dry-equalizer
|
32
|
+
ffaker (2.8.0)
|
33
|
+
hashdiff (0.3.7)
|
34
|
+
hashie (3.5.6)
|
35
|
+
http (3.0.0)
|
36
|
+
addressable (~> 2.3)
|
37
|
+
http-cookie (~> 1.0)
|
38
|
+
http-form_data (>= 2.0.0.pre.pre2, < 3)
|
39
|
+
http_parser.rb (~> 0.6.0)
|
40
|
+
http-cookie (1.0.3)
|
41
|
+
domain_name (~> 0.5)
|
42
|
+
http-form_data (2.0.0)
|
43
|
+
http_parser.rb (0.6.0)
|
44
|
+
method_source (0.9.0)
|
45
|
+
parallel (1.12.0)
|
46
|
+
parser (2.4.0.2)
|
47
|
+
ast (~> 2.3)
|
48
|
+
powerpack (0.1.1)
|
49
|
+
pry (0.11.3)
|
50
|
+
coderay (~> 1.1.0)
|
51
|
+
method_source (~> 0.9.0)
|
52
|
+
pry-byebug (3.5.1)
|
53
|
+
byebug (~> 9.1)
|
54
|
+
pry (~> 0.10)
|
55
|
+
public_suffix (3.0.1)
|
56
|
+
rainbow (3.0.0)
|
57
|
+
rake (12.3.0)
|
58
|
+
rspec (3.7.0)
|
59
|
+
rspec-core (~> 3.7.0)
|
60
|
+
rspec-expectations (~> 3.7.0)
|
61
|
+
rspec-mocks (~> 3.7.0)
|
62
|
+
rspec-core (3.7.0)
|
63
|
+
rspec-support (~> 3.7.0)
|
64
|
+
rspec-expectations (3.7.0)
|
65
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
66
|
+
rspec-support (~> 3.7.0)
|
67
|
+
rspec-mocks (3.7.0)
|
68
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
69
|
+
rspec-support (~> 3.7.0)
|
70
|
+
rspec-support (3.7.0)
|
71
|
+
rubocop (0.52.0)
|
72
|
+
parallel (~> 1.10)
|
73
|
+
parser (>= 2.4.0.2, < 3.0)
|
74
|
+
powerpack (~> 0.1)
|
75
|
+
rainbow (>= 2.2.2, < 4.0)
|
76
|
+
ruby-progressbar (~> 1.7)
|
77
|
+
unicode-display_width (~> 1.0, >= 1.0.1)
|
78
|
+
ruby-progressbar (1.9.0)
|
79
|
+
safe_yaml (1.0.4)
|
80
|
+
unf (0.1.4)
|
81
|
+
unf_ext
|
82
|
+
unf_ext (0.0.7.4)
|
83
|
+
unicode-display_width (1.3.0)
|
84
|
+
vcr (3.0.3)
|
85
|
+
webmock (3.2.1)
|
86
|
+
addressable (>= 2.3.6)
|
87
|
+
crack (>= 0.3.2)
|
88
|
+
hashdiff
|
89
|
+
|
90
|
+
PLATFORMS
|
91
|
+
ruby
|
92
|
+
|
93
|
+
DEPENDENCIES
|
94
|
+
api_struct!
|
95
|
+
bundler (~> 1.14)
|
96
|
+
ffaker (~> 2.7)
|
97
|
+
pry-byebug (~> 3.5, >= 3.5.1)
|
98
|
+
rake (~> 12.3)
|
99
|
+
rspec (~> 3.7)
|
100
|
+
rubocop (~> 0.52.0)
|
101
|
+
vcr (~> 3.0.3)
|
102
|
+
webmock (~> 3.2, >= 3.2.1)
|
103
|
+
|
104
|
+
BUNDLED WITH
|
105
|
+
1.16.0
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2017 bezrukavyi
|
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
ADDED
@@ -0,0 +1,203 @@
|
|
1
|
+
# <img src='https://github.com/rubygarage/api_struct/blob/master/api_struct.svg' height='60' alt='ApiStruct' />
|
2
|
+
|
3
|
+
**ApiStruct** consists of two main interfaces: `ApiStruct::Client` and `ApiStruct::Entity`. The `ApiStruct::Client` class is aimed at using the same interface for describing requests to different APIs. The `ApiStruct::Entity` enables you to use *ApiStruct* clients in ORM-like style.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'api_struct'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install api_struct
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
Initialize APIs routes:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
ApiStruct::Settings.configure do |config|
|
27
|
+
config.endpoints = {
|
28
|
+
first_api: {
|
29
|
+
root: 'http://localhost:3000/api/v1',
|
30
|
+
headers: {
|
31
|
+
'content-type': 'application/json',
|
32
|
+
'Authorization': 'Bearer TOKEN'
|
33
|
+
}
|
34
|
+
},
|
35
|
+
second_api: {
|
36
|
+
root: 'http://localhost:3001/api/v1',
|
37
|
+
# etc...
|
38
|
+
}
|
39
|
+
}
|
40
|
+
end
|
41
|
+
```
|
42
|
+
|
43
|
+
# Client
|
44
|
+
Endpoint wrapper
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
class PostsClient < ApiStruct::Client
|
48
|
+
first_api :posts
|
49
|
+
|
50
|
+
def show(id)
|
51
|
+
get(id)
|
52
|
+
end
|
53
|
+
|
54
|
+
def index
|
55
|
+
get
|
56
|
+
end
|
57
|
+
|
58
|
+
def user_posts(user_id, post_id = nil)
|
59
|
+
get(post_id, prefix: [:users, user_id])
|
60
|
+
# alias:
|
61
|
+
# get(post_id, prefix: '/users/:id', id: user_id)
|
62
|
+
end
|
63
|
+
|
64
|
+
def custom_path(user_id)
|
65
|
+
get(path: 'users_posts/:user_id', user_id: user_id)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
Usage:
|
71
|
+
```ruby
|
72
|
+
PostsClient.new.get(1) # -> /posts/1
|
73
|
+
```
|
74
|
+
Returns `Either` [monad](https://github.com/dry-rb/dry-monads)
|
75
|
+
```ruby
|
76
|
+
# => Right({:id=>1, :title=>"Post"})
|
77
|
+
```
|
78
|
+
|
79
|
+
Other methods from sample:
|
80
|
+
```ruby
|
81
|
+
post_client = PostsClient.new
|
82
|
+
|
83
|
+
post_client.index # -> /posts
|
84
|
+
post_client.user_posts(1) # -> /users/1/posts
|
85
|
+
post_client.user_posts(1, 2) # -> /users/1/posts/2
|
86
|
+
post_client.custom_path(1) # -> /users_posts/1/
|
87
|
+
```
|
88
|
+
|
89
|
+
|
90
|
+
# Entity
|
91
|
+
Response serializer
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
class User < ApiStruct::Entity
|
95
|
+
client_service UsersClient
|
96
|
+
|
97
|
+
client_service AuthorsClient, prefix: true, only: :index
|
98
|
+
# alias:
|
99
|
+
# client_service AuthorsClient, prefix: :prefix, except: :index
|
100
|
+
|
101
|
+
attr_entity :name, :id
|
102
|
+
end
|
103
|
+
```
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
class UsersClient < ApiStruct::Client
|
107
|
+
first_api :users
|
108
|
+
|
109
|
+
def show(id)
|
110
|
+
get(id)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
```
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
class AuthorsClient < ApiStruct::Client
|
117
|
+
first_api :authors
|
118
|
+
|
119
|
+
def index
|
120
|
+
get
|
121
|
+
end
|
122
|
+
end
|
123
|
+
```
|
124
|
+
|
125
|
+
Usage:
|
126
|
+
```ruby
|
127
|
+
user = User.show(1)
|
128
|
+
# => {"id"=>1, "name"=>"John"}
|
129
|
+
```
|
130
|
+
|
131
|
+
Call methods from prefixed clients:
|
132
|
+
```ruby
|
133
|
+
users = User.authors_client_index
|
134
|
+
# or
|
135
|
+
# users = User.prefix_index
|
136
|
+
```
|
137
|
+
|
138
|
+
Response serializers with related entities:
|
139
|
+
```ruby
|
140
|
+
class Network < ApiStruct::Entity
|
141
|
+
client_service NetworkClient
|
142
|
+
|
143
|
+
attr_entity :name, :id
|
144
|
+
attr_entity :state, &:to_sym
|
145
|
+
|
146
|
+
has_entity :super_admin, as: User
|
147
|
+
end
|
148
|
+
```
|
149
|
+
|
150
|
+
```ruby
|
151
|
+
class NetworkClient < ApiStruct::Client
|
152
|
+
first_api :networks
|
153
|
+
|
154
|
+
def show(id)
|
155
|
+
get(id)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
```
|
159
|
+
|
160
|
+
Usage:
|
161
|
+
```ruby
|
162
|
+
network = Network.show(1)
|
163
|
+
# => {"id"=>1, "name"=>"Main network", "state"=>"active", "super_admin"=>{"id"=>1, "name"=>"John"}}
|
164
|
+
|
165
|
+
network.state
|
166
|
+
# => :active
|
167
|
+
```
|
168
|
+
|
169
|
+
## Dynamic headers:
|
170
|
+
|
171
|
+
```ruby
|
172
|
+
class Auth
|
173
|
+
def self.call
|
174
|
+
# Get a token..
|
175
|
+
end
|
176
|
+
end
|
177
|
+
```
|
178
|
+
|
179
|
+
```ruby
|
180
|
+
class AuthHeaderValue
|
181
|
+
def self.call
|
182
|
+
{ "Authorization": "Bearer #{Auth.call}" }
|
183
|
+
end
|
184
|
+
end
|
185
|
+
```
|
186
|
+
|
187
|
+
```ruby
|
188
|
+
class PostClient < ApiStruct::Client
|
189
|
+
first_api :posts
|
190
|
+
|
191
|
+
def update(id, post_data)
|
192
|
+
put(id, json: post_data, headers: AuthHeaderValue.call)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
```
|
196
|
+
|
197
|
+
## Contributing
|
198
|
+
|
199
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/rubygarage/api_struct.
|
200
|
+
|
201
|
+
## License
|
202
|
+
|
203
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
data/api_struct.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'api_struct/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'api_struct'
|
7
|
+
spec.version = ApiStruct::VERSION
|
8
|
+
spec.authors = %w[bezrukavyi andy1341 kirillshevch]
|
9
|
+
spec.email = ['yaroslav.bezrukavyi@gmail.com', 'andrii.novikov1341@gmail.com', 'kirills167@gmail.com']
|
10
|
+
|
11
|
+
spec.summary = 'API wrapper builder with response serialization'
|
12
|
+
spec.description = spec.description
|
13
|
+
spec.homepage = 'https://github.com/rubygarage/api_struct'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.bindir = 'exe'
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_dependency 'dry-monads', '~> 0.3.1'
|
22
|
+
spec.add_dependency 'dry-configurable', '~> 0.7.0'
|
23
|
+
spec.add_dependency 'http', '>= 2.0.3'
|
24
|
+
spec.add_dependency 'hashie', '~> 3.5', '>= 3.5.6'
|
25
|
+
|
26
|
+
spec.add_development_dependency 'bundler', '~> 1.14'
|
27
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.5', '>= 3.5.1'
|
28
|
+
spec.add_development_dependency 'rake', '~> 12.3'
|
29
|
+
spec.add_development_dependency 'rspec', '~> 3.7'
|
30
|
+
spec.add_development_dependency 'rubocop', '~> 0.52.0'
|
31
|
+
spec.add_development_dependency 'vcr', '~> 3.0.3'
|
32
|
+
spec.add_development_dependency 'webmock', '~> 3.2', '>= 3.2.1'
|
33
|
+
spec.add_development_dependency 'ffaker', '~> 2.7'
|
34
|
+
end
|
data/api_struct.svg
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 569.14 106.18"><defs><style>.cls-1{fill:#ef43cf;}.cls-2{fill:#ee43cf;}.cls-3{fill:#ed43d0;}.cls-4{fill:#ec43d0;}.cls-5{fill:#eb44d0;}.cls-6{fill:#ea44d0;}.cls-7{fill:#e944d1;}.cls-8{fill:#e844d1;}.cls-9{fill:#e744d1;}.cls-10{fill:#e644d1;}.cls-11{fill:#e544d2;}.cls-12{fill:#e445d2;}.cls-13{fill:#e345d2;}.cls-14{fill:#e245d3;}.cls-15{fill:#e145d3;}.cls-16{fill:#e045d3;}.cls-17{fill:#df45d3;}.cls-18{fill:#de45d4;}.cls-19{fill:#dd46d4;}.cls-20{fill:#dc46d4;}.cls-21{fill:#db46d4;}.cls-22{fill:#da46d5;}.cls-23{fill:#d946d5;}.cls-24{fill:#d846d5;}.cls-25{fill:#d746d6;}.cls-26{fill:#d647d6;}.cls-27{fill:#d547d6;}.cls-28{fill:#d447d6;}.cls-29{fill:#d347d7;}.cls-30{fill:#d247d7;}.cls-31{fill:#d147d7;}.cls-32{fill:#d047d7;}.cls-33{fill:#cf48d8;}.cls-34{fill:#ce48d8;}.cls-35{fill:#cd48d8;}.cls-36{fill:#cc48d8;}.cls-37{fill:#cb48d9;}.cls-38{fill:#ca48d9;}.cls-39{fill:#c948d9;}.cls-40{fill:#c849da;}.cls-41{fill:#c749da;}.cls-42{fill:#c649da;}.cls-43{fill:#c549da;}.cls-44{fill:#c449db;}.cls-45{fill:#c349db;}.cls-46{fill:#c249db;}.cls-47{fill:#c14adb;}.cls-48{fill:#c04adc;}.cls-49{fill:#bf4adc;}.cls-50{fill:#be4adc;}.cls-51{fill:#bd4add;}.cls-52{fill:#bc4add;}.cls-53{fill:#bb4add;}.cls-54{fill:#ba4bdd;}.cls-55{fill:#b94bde;}.cls-56{fill:#b84bde;}.cls-57{fill:#b74bde;}.cls-58{fill:#b64bde;}.cls-59{fill:#b54bdf;}.cls-60{fill:#b44cdf;}.cls-61{fill:#b34ce0;}.cls-62{fill:#b24ce0;}.cls-63{fill:#b14ce0;}.cls-64{fill:#b04ce0;}.cls-65{fill:#af4ce1;}.cls-66{fill:#ae4de1;}.cls-67{fill:#ad4de1;}.cls-68{fill:#ac4de1;}.cls-69{fill:#ab4de2;}.cls-70{fill:#aa4de2;}.cls-71{fill:#a94de2;}.cls-72{fill:#a84de3;}.cls-73{fill:#a74ee3;}.cls-74{fill:#a64ee3;}.cls-75{fill:#a54ee3;}.cls-76{fill:#a44ee4;}.cls-77{fill:#a34ee4;}.cls-78{fill:#a24ee4;}.cls-79{fill:#a14ee4;}.cls-80{fill:#a04fe5;}.cls-81{fill:#9f4fe5;}.cls-82{fill:#9e4fe5;}.cls-83{fill:#9d4fe6;}.cls-84{fill:#9c4fe6;}.cls-85{fill:#9b4fe6;}.cls-86{fill:#9a4fe6;}.cls-87{fill:#9950e7;}.cls-88{fill:#9850e7;}.cls-89{fill:#9750e7;}.cls-90{fill:#9650e7;}.cls-91{fill:#9550e8;}.cls-92{fill:#9450e8;}.cls-93{fill:#9350e8;}.cls-94{fill:#9251e8;}.cls-95{fill:#9151e9;}.cls-96{fill:#9051e9;}.cls-97{fill:#8f51e9;}.cls-98{fill:#8e51ea;}.cls-99{fill:#8d51ea;}.cls-100{fill:#8c51ea;}.cls-101{fill:#8b52ea;}.cls-102{fill:#8a52eb;}.cls-103{fill:#8952eb;}.cls-104{fill:#8852eb;}.cls-105{fill:#8752eb;}.cls-106{fill:#8652ec;}.cls-107{fill:#8552ec;}.cls-108{fill:#8453ec;}.cls-109{fill:#8353ed;}.cls-110{fill:#8253ed;}.cls-111{fill:#8153ed;}.cls-112{fill:#8053ed;}.cls-113{fill:#7f53ee;}.cls-114{fill:#7e53ee;}.cls-115{fill:#7d54ee;}.cls-116{fill:#7c54ee;}.cls-117{fill:#7b54ef;}.cls-118{fill:#7a54ef;}.cls-119{fill:#7a55ef;}.cls-120{fill:#7956ef;}.cls-121{fill:#7957ef;}.cls-122{fill:#7958ef;}.cls-123{fill:#7859f0;}.cls-124{fill:#785af0;}.cls-125{fill:#785bf0;}.cls-126{fill:#775cf0;}.cls-127{fill:#775df0;}.cls-128{fill:#775ef0;}.cls-129{fill:#765ff0;}.cls-130{fill:#7660f0;}.cls-131{fill:#7661f0;}.cls-132{fill:#7562f0;}.cls-133{fill:#7563f1;}.cls-134{fill:#7564f1;}.cls-135{fill:#7465f1;}.cls-136{fill:#7466f1;}.cls-137{fill:#7467f1;}.cls-138{fill:#7368f1;}.cls-139{fill:#7369f1;}.cls-140{fill:#736af1;}.cls-141{fill:#726bf1;}.cls-142{fill:#726cf1;}.cls-143{fill:#726df2;}.cls-144{fill:#716ef2;}.cls-145{fill:#716ff2;}.cls-146{fill:#7170f2;}.cls-147{fill:#7071f2;}.cls-148{fill:#7072f2;}.cls-149{fill:#7073f2;}.cls-150{fill:#6f74f2;}.cls-151{fill:#6f75f2;}.cls-152{fill:#6f76f2;}.cls-153{fill:#6e77f3;}.cls-154{fill:#6e78f3;}.cls-155{fill:#6e79f3;}.cls-156{fill:#6d7af3;}.cls-157{fill:#6d7bf3;}.cls-158{fill:#6d7cf3;}.cls-159{fill:#6c7df3;}.cls-160{fill:#6c7ef3;}.cls-161{fill:#6c7ff3;}.cls-162{fill:#6b80f3;}.cls-163{fill:#6b81f4;}.cls-164{fill:#6b82f4;}.cls-165{fill:#6a83f4;}.cls-166{fill:#6a84f4;}.cls-167{fill:#6a85f4;}.cls-168{fill:#6986f4;}.cls-169{fill:#6987f4;}.cls-170{fill:#6988f4;}.cls-171{fill:#6889f4;}.cls-172{fill:#688af4;}.cls-173{fill:#688bf5;}.cls-174{fill:#678cf5;}.cls-175{fill:#678df5;}.cls-176{fill:#678ef5;}.cls-177{fill:#668ff5;}.cls-178{fill:#6690f5;}.cls-179{fill:#6691f5;}.cls-180{fill:#6592f5;}.cls-181{fill:#6593f5;}.cls-182{fill:#6594f5;}.cls-183{fill:#6495f6;}.cls-184{fill:#6496f6;}.cls-185{fill:#6497f6;}.cls-186{fill:#6398f6;}.cls-187{fill:#6399f6;}.cls-188{fill:#639af6;}.cls-189{fill:#629bf6;}.cls-190{fill:#629cf6;}.cls-191{fill:#629df6;}.cls-192{fill:#619ef6;}.cls-193{fill:#619ff7;}.cls-194{fill:#61a0f7;}.cls-195{fill:#60a1f7;}.cls-196{fill:#60a2f7;}.cls-197{fill:#60a3f7;}.cls-198{fill:#5fa4f7;}.cls-199{fill:#5fa5f7;}.cls-200{fill:#5ea6f7;}.cls-201{fill:#5ea7f7;}.cls-202{fill:#5ea8f8;}.cls-203{fill:#5da9f8;}.cls-204{fill:#5daaf8;}.cls-205{fill:#5dabf8;}.cls-206{fill:#5cacf8;}.cls-207{fill:#5cadf8;}.cls-208{fill:#5caef8;}.cls-209{fill:#5baff8;}.cls-210{fill:#5bb0f8;}.cls-211{fill:#5bb1f8;}.cls-212{fill:#5ab2f9;}.cls-213{fill:#5ab3f9;}.cls-214{fill:#5ab4f9;}.cls-215{fill:#59b5f9;}.cls-216{fill:#59b6f9;}.cls-217{fill:#59b7f9;}.cls-218{fill:#58b8f9;}.cls-219{fill:#58b9f9;}.cls-220{fill:#58baf9;}.cls-221{fill:#57bbf9;}.cls-222{fill:#57bcfa;}.cls-223{fill:#57bdfa;}.cls-224{fill:#56befa;}.cls-225{fill:#56bffa;}.cls-226{fill:#56c0fa;}.cls-227{fill:#55c1fa;}.cls-228{fill:#55c2fa;}.cls-229{fill:#55c3fa;}.cls-230{fill:#54c4fa;}.cls-231{fill:#54c5fa;}.cls-232{fill:#54c6fb;}.cls-233{fill:#53c7fb;}.cls-234{fill:#53c8fb;}.cls-235{fill:#53c9fb;}.cls-236{fill:#52cafb;}.cls-237{fill:#52cbfb;}.cls-238{fill:#52ccfb;}.cls-239{fill:#51cdfb;}.cls-240{fill:#51cefb;}.cls-241{fill:#51cffb;}.cls-242{fill:#50d0fc;}.cls-243{fill:#50d1fc;}.cls-244{fill:#50d2fc;}.cls-245{fill:#4fd3fc;}.cls-246{fill:#4fd4fc;}.cls-247{fill:#4fd5fc;}.cls-248{fill:#4ed6fc;}.cls-249{fill:#4ed7fc;}.cls-250{fill:#4ed8fc;}.cls-251{fill:#4dd9fc;}.cls-252{fill:#4ddafd;}.cls-253{fill:#4ddbfd;}.cls-254{fill:#4cdcfd;}.cls-255{fill:#4cddfd;}.cls-256{fill:#4cdefd;}.cls-257{fill:#4bdffd;}.cls-258{fill:#4be0fd;}.cls-259{fill:#4be1fd;}.cls-260{fill:#4ae2fd;}.cls-261{fill:#4ae3fd;}.cls-262{fill:#4ae4fe;}.cls-263{fill:#49e5fe;}.cls-264{fill:#49e6fe;}.cls-265{fill:#49e7fe;}.cls-266{fill:#48e8fe;}.cls-267{fill:#48e9fe;}.cls-268{fill:#48eafe;}.cls-269{fill:#47ebfe;}.cls-270{fill:#47ecfe;}.cls-271{fill:#47edfe;}.cls-272{fill:#46eeff;}.cls-273{fill:#46efff;}.cls-274{fill:#46f0ff;}.cls-275{fill:#45f1ff;}.cls-276{fill:#45f2ff;}.cls-277{fill:#1b1466;}.cls-278{opacity:0.32;}.cls-279{fill:url(#linear-gradient);}</style><linearGradient id="linear-gradient" x1="10.31" y1="61.29" x2="67.08" y2="61.29" gradientUnits="userSpaceOnUse"><stop offset="0.01" stop-color="#fff" stop-opacity="0"/><stop offset="1" stop-color="#45f2ff"/></linearGradient></defs><title>Artboard 3</title><rect class="cls-1" x="0.99" y="52.16" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-2" x="1.26" y="51.73" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-3" x="1.53" y="51.3" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-4" x="1.8" y="50.87" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-5" x="2.07" y="50.43" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-6" x="2.34" y="50" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-7" x="2.61" y="49.57" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-8" x="2.88" y="49.14" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-9" x="3.15" y="48.7" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-10" x="3.42" y="48.27" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-11" x="3.69" y="47.84" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-12" x="3.96" y="47.41" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-13" x="4.23" y="46.98" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-14" x="4.5" y="46.54" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-15" x="4.77" y="46.11" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-16" x="5.04" y="45.68" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-17" x="5.31" y="45.25" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-18" x="5.58" y="44.82" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-19" x="5.85" y="44.38" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-20" x="6.12" y="43.95" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-21" x="6.39" y="43.52" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-22" x="6.66" y="43.09" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-23" x="6.93" y="42.66" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-24" x="7.2" y="42.22" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-25" x="7.47" y="41.79" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-26" x="7.74" y="41.36" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-27" x="8.01" y="40.93" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-28" x="8.28" y="40.5" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-29" x="8.55" y="40.06" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-30" x="8.82" y="39.63" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-31" x="9.09" y="39.2" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-32" x="9.36" y="38.77" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-33" x="9.63" y="38.33" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-34" x="9.9" y="37.9" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-35" x="10.17" y="37.47" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-36" x="10.44" y="37.04" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-37" x="10.71" y="36.61" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-38" x="10.98" y="36.17" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-39" x="11.25" y="35.74" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-40" x="11.52" y="35.31" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-41" x="11.79" y="34.88" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-42" x="12.06" y="34.45" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-43" x="12.33" y="34.01" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-44" x="12.6" y="33.58" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-45" x="12.87" y="33.15" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-46" x="13.14" y="32.72" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-47" x="13.41" y="32.29" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-48" x="13.68" y="31.85" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-49" x="13.95" y="31.42" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-50" x="14.22" y="30.99" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-51" x="14.49" y="30.56" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-52" x="14.76" y="30.13" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-53" x="15.03" y="29.69" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-54" x="15.31" y="29.26" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-55" x="15.58" y="28.83" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-56" x="15.85" y="28.4" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-57" x="16.12" y="27.97" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-58" x="16.39" y="27.53" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-59" x="16.66" y="27.1" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-59" x="16.93" y="26.67" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-60" x="17.2" y="26.24" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-61" x="17.47" y="25.8" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-62" x="17.74" y="25.37" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-63" x="18.01" y="24.94" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-64" x="18.28" y="24.51" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-65" x="18.55" y="24.08" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-66" x="18.82" y="23.64" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-67" x="19.09" y="23.21" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-68" x="19.36" y="22.78" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-69" x="19.63" y="22.35" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-70" x="19.9" y="21.92" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-71" x="20.17" y="21.48" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-72" x="20.44" y="21.05" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-73" x="20.71" y="20.62" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-74" x="20.98" y="20.19" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-75" x="21.25" y="19.76" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-76" x="21.52" y="19.32" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-77" x="21.79" y="18.89" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-78" x="22.06" y="18.46" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-79" x="22.33" y="18.03" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-80" x="22.6" y="17.6" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-81" x="22.87" y="17.16" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-82" x="23.14" y="16.73" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-83" x="23.41" y="16.3" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-84" x="23.68" y="15.87" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-85" x="23.95" y="15.43" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-86" x="24.22" y="15" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-87" x="24.49" y="14.57" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-88" x="24.76" y="14.14" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-89" x="25.03" y="13.71" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-90" x="25.3" y="13.27" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-91" x="25.57" y="12.84" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-92" x="25.84" y="12.41" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-93" x="26.11" y="11.98" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-94" x="26.38" y="11.55" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-95" x="26.65" y="11.11" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-96" x="26.92" y="10.68" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-97" x="27.19" y="10.25" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-98" x="27.46" y="9.82" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-99" x="27.73" y="9.39" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-100" x="28" y="8.95" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-101" x="28.27" y="8.52" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-102" x="28.54" y="8.09" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-103" x="28.81" y="7.66" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-104" x="29.08" y="7.23" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-105" x="29.35" y="6.79" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-106" x="29.62" y="6.36" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-107" x="29.89" y="5.93" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-108" x="30.16" y="5.5" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-109" x="30.43" y="5.06" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-110" x="30.7" y="4.63" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-111" x="30.97" y="4.2" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-112" x="31.25" y="3.77" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-113" x="31.52" y="3.34" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-114" x="31.79" y="2.9" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-115" x="32.06" y="2.47" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-116" x="32.33" y="2.04" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-117" x="32.6" y="1.61" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-118" x="32.87" y="1.18" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-119" x="33.07" y="1.5" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-120" x="33.27" y="1.82" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-121" x="33.47" y="2.14" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-122" x="33.67" y="2.47" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-123" x="33.87" y="2.79" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-124" x="34.08" y="3.11" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-125" x="34.28" y="3.43" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-126" x="34.48" y="3.76" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-127" x="34.68" y="4.08" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-128" x="34.88" y="4.4" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-129" x="35.09" y="4.73" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-130" x="35.29" y="5.05" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-131" x="35.49" y="5.37" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-132" x="35.69" y="5.69" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-133" x="35.89" y="6.02" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-134" x="36.09" y="6.34" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-135" x="36.3" y="6.66" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-136" x="36.5" y="6.98" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-137" x="36.7" y="7.31" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-138" x="36.9" y="7.63" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-139" x="37.1" y="7.95" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-140" x="37.31" y="8.28" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-141" x="37.51" y="8.6" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-142" x="37.71" y="8.92" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-143" x="37.91" y="9.24" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-144" x="38.11" y="9.57" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-145" x="38.31" y="9.89" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-146" x="38.52" y="10.21" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-147" x="38.72" y="10.53" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-148" x="38.92" y="10.86" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-149" x="39.12" y="11.18" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-150" x="39.32" y="11.5" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-151" x="39.52" y="11.82" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-152" x="39.73" y="12.15" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-153" x="39.93" y="12.47" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-154" x="40.13" y="12.79" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-155" x="40.33" y="13.12" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-156" x="40.53" y="13.44" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-157" x="40.74" y="13.76" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-158" x="40.94" y="14.08" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-159" x="41.14" y="14.41" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-160" x="41.34" y="14.73" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-161" x="41.54" y="15.05" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-162" x="41.74" y="15.37" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-163" x="41.95" y="15.7" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-164" x="42.15" y="16.02" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-165" x="42.35" y="16.34" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-166" x="42.55" y="16.67" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-167" x="42.75" y="16.99" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-168" x="42.95" y="17.31" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-169" x="43.16" y="17.63" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-170" x="43.36" y="17.96" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-171" x="43.56" y="18.28" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-172" x="43.76" y="18.6" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-173" x="43.96" y="18.92" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-174" x="44.17" y="19.25" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-175" x="44.37" y="19.57" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-176" x="44.57" y="19.89" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-177" x="44.77" y="20.21" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-178" x="44.97" y="20.54" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-179" x="45.17" y="20.86" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-180" x="45.38" y="21.18" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-181" x="45.58" y="21.51" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-182" x="45.78" y="21.83" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-183" x="45.98" y="22.15" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-184" x="46.18" y="22.47" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-185" x="46.38" y="22.8" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-186" x="46.59" y="23.12" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-187" x="46.79" y="23.44" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-188" x="46.99" y="23.76" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-189" x="47.19" y="24.09" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-190" x="47.39" y="24.41" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-191" x="47.6" y="24.73" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-192" x="47.8" y="25.06" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-193" x="48" y="25.38" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-194" x="48.2" y="25.7" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-195" x="48.4" y="26.02" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-196" x="48.6" y="26.35" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-197" x="48.81" y="26.67" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-198" x="49.01" y="26.99" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-199" x="49.21" y="27.31" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-200" x="49.41" y="27.64" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-201" x="49.61" y="27.96" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-202" x="49.81" y="28.28" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-203" x="50.02" y="28.6" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-204" x="50.22" y="28.93" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-205" x="50.42" y="29.25" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-206" x="50.62" y="29.57" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-207" x="50.82" y="29.9" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-208" x="51.03" y="30.22" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-209" x="51.23" y="30.54" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-210" x="51.43" y="30.86" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-211" x="51.63" y="31.19" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-212" x="51.83" y="31.51" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-213" x="52.03" y="31.83" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-214" x="52.24" y="32.15" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-215" x="52.44" y="32.48" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-216" x="52.64" y="32.8" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-217" x="52.84" y="33.12" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-218" x="53.04" y="33.45" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-219" x="53.24" y="33.77" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-220" x="53.45" y="34.09" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-221" x="53.65" y="34.41" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-222" x="53.85" y="34.74" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-223" x="54.05" y="35.06" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-224" x="54.25" y="35.38" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-225" x="54.46" y="35.7" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-226" x="54.66" y="36.03" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-227" x="54.86" y="36.35" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-228" x="55.06" y="36.67" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-229" x="55.26" y="36.99" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-230" x="55.46" y="37.32" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-231" x="55.67" y="37.64" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-232" x="55.87" y="37.96" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-233" x="56.07" y="38.29" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-234" x="56.27" y="38.61" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-235" x="56.47" y="38.93" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-236" x="56.68" y="39.25" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-237" x="56.88" y="39.58" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-238" x="57.08" y="39.9" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-239" x="57.28" y="40.22" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-240" x="57.48" y="40.54" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-241" x="57.68" y="40.87" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-242" x="57.89" y="41.19" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-243" x="58.09" y="41.51" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-244" x="58.29" y="41.84" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-245" x="58.49" y="42.16" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-246" x="58.69" y="42.48" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-247" x="58.89" y="42.8" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-248" x="59.1" y="43.13" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-249" x="59.3" y="43.45" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-250" x="59.5" y="43.77" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-251" x="59.7" y="44.09" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-252" x="59.9" y="44.42" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-253" x="60.11" y="44.74" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-254" x="60.31" y="45.06" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-255" x="60.51" y="45.38" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-256" x="60.71" y="45.71" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-257" x="60.91" y="46.03" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-258" x="61.11" y="46.35" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-259" x="61.32" y="46.68" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-260" x="61.52" y="47" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-261" x="61.72" y="47.32" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-262" x="61.92" y="47.64" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-263" x="62.12" y="47.97" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-264" x="62.32" y="48.29" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-265" x="62.53" y="48.61" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-266" x="62.73" y="48.93" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-267" x="62.93" y="49.26" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-268" x="63.13" y="49.58" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-269" x="63.33" y="49.9" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-270" x="63.54" y="50.23" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-271" x="63.74" y="50.55" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-272" x="63.94" y="50.87" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-273" x="64.14" y="51.19" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-274" x="64.34" y="51.52" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-275" x="64.54" y="51.84" width="53.24" height="53.01" rx="26.51" ry="26.51"/><rect class="cls-276" x="64.75" y="52.16" width="53.24" height="53.01" rx="26.51" ry="26.51"/><path class="cls-277" d="M196.43,78.27l-3.31-10H171.75l-3.31,10H153l20.69-59.7h17.63l20.61,59.7Zm-21-21h14.08l-7-21.21Z"/><path class="cls-277" d="M233.56,37.14q4.84-6.7,13.87-6.7a20,20,0,0,1,15.31,6.82Q269,44.1,269,54.69t-6.27,17.38a19.93,19.93,0,0,1-15.19,6.79,16.07,16.07,0,0,1-14-7.46v29.42h-14.5V31h14.5ZM251.12,63.3q3.13-3,3.13-8.61T251.12,46a10.09,10.09,0,0,0-14.42,0c-2.09,2-3.14,4.87-3.14,8.61s1.05,6.61,3.14,8.64a10,10,0,0,0,7.21,3.06A10.13,10.13,0,0,0,251.12,63.3Z"/><path class="cls-277" d="M291.49,25.6A8.48,8.48,0,0,1,277,19.54a8.48,8.48,0,1,1,16.95,0A8.21,8.21,0,0,1,291.49,25.6ZM278.26,78.27V31h14.5V78.27Z"/><path class="cls-277" d="M325.66,29.33a6.75,6.75,0,0,0-4.45,1.45,5.07,5.07,0,0,0-1.73,4.15,6,6,0,0,0,1.61,4.37,10.41,10.41,0,0,0,4.19,2.54c1.73.6,3.65,1.16,5.77,1.7a65.53,65.53,0,0,1,6.31,2,27.58,27.58,0,0,1,5.73,2.84,12.47,12.47,0,0,1,4.2,4.79,16,16,0,0,1,1.61,7.42,16.6,16.6,0,0,1-6.15,12.93c-4.09,3.59-9.5,5.39-16.19,5.39s-12.1-1.61-16.2-4.83-6.15-7.81-6.15-13.74h15.43q.6,7.13,7.29,7.12a6.94,6.94,0,0,0,4.92-1.65,5.49,5.49,0,0,0,1.79-4.2A5.66,5.66,0,0,0,332,57.4a11.2,11.2,0,0,0-4.19-2.54q-2.59-.93-5.77-1.74a59.91,59.91,0,0,1-6.32-2A30.81,30.81,0,0,1,310,48.29a12.05,12.05,0,0,1-4.2-4.75,15.74,15.74,0,0,1-1.61-7.34,16.25,16.25,0,0,1,6.19-13.31q6.19-5,15.81-5t15.57,4.37Q347.71,26.63,348,36H332.2a7.94,7.94,0,0,0-2.09-5A6,6,0,0,0,325.66,29.33Z"/><path class="cls-277" d="M380.44,66h5.18v12.3h-7.38q-8,0-12.34-3.52t-4.37-12.09V43h-4.41V31h4.41V19.41H376V31h9.5V43H376V62.66Q376,66,380.44,66Z"/><path class="cls-277" d="M410,31v8.82q5.08-9.33,13.57-9.33V45.19H420c-3.33,0-5.83.8-7.5,2.38s-2.5,4.35-2.5,8.31V78.27h-14.5V31Z"/><path class="cls-277" d="M463.63,31h14.5V78.27h-14.5v-7q-4.49,7.47-14.33,7.47a17.21,17.21,0,0,1-13.19-5.43q-5-5.43-5-14.76V31h14.42V56.64c0,3,.8,5.42,2.41,7.08a10.11,10.11,0,0,0,13.31,0c1.62-1.66,2.42-4,2.42-7.08Z"/><path class="cls-277" d="M494,72.24q-6.57-6.6-6.58-17.63T494,37q6.57-6.57,17-6.57a24.67,24.67,0,0,1,14.67,4.28,20.35,20.35,0,0,1,8,12.25H517.9a6.88,6.88,0,0,0-6.65-4.23c-3.09,0-5.38,1.08-6.87,3.26a14.89,14.89,0,0,0-2.25,8.61,14.91,14.91,0,0,0,2.25,8.61A7.47,7.47,0,0,0,511,66.48a8.16,8.16,0,0,0,4.24-.93,7.89,7.89,0,0,0,2.71-3.31h15.69a21,21,0,0,1-8.05,12.13A24,24,0,0,1,511,78.86Q500.53,78.86,494,72.24Z"/><path class="cls-277" d="M561.83,66H567v12.3h-7.37q-8,0-12.35-3.52t-4.36-12.09V43h-4.41V31h4.41V19.41h14.5V31h9.5V43h-9.5V62.66Q557.42,66,561.83,66Z"/><g class="cls-278"><path class="cls-279" d="M65.62,88.35,34.74,39.06A6.62,6.62,0,0,0,29.1,36h0a6.61,6.61,0,0,0-5.64,3.14L11.77,57.81l-1.46-.91L22,38.17a8.38,8.38,0,0,1,7.11-4h0a8.34,8.34,0,0,1,7.1,3.93L67.08,87.44Z"/></g></svg>
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'api_struct'
|
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__)
|