comicvine-mongo 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/bin/console +1 -1
- data/bin/make_schema.rb +132 -0
- data/certs/homans.pem +15 -15
- data/checksum/comicvine-mongo-0.1.2.gem.sha256 +1 -1
- data/checksum/comicvine-mongo-0.1.3.gem.sha256 +1 -0
- data/lib/comicvine/mongo.rb +16 -0
- data/lib/comicvine/mongo/version.rb +1 -1
- metadata +20 -18
- metadata.gz.sig +2 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 792f63c9886ed101f9894cc492e670e412d6a5bc
|
4
|
+
data.tar.gz: 4987b288253c6e4ebb2bc249188cf98d40e603f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4dfa12ffb3aa55146886341997a9c069a9b5fa8045a31ebccda16729d0bb2c0401d25078eb8fee2be2a5e3cb42c1ec9e7d0967792a81433e612508e3ffb7d931
|
7
|
+
data.tar.gz: bbbfa3cd2a8cdd1a51f768fa3e8d89c014d3141a23b2361d3caa253ce37d208a522c9472c007a21ec22622714372b61f09ccc731c11749841ea97653e3a92033
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/bin/console
CHANGED
data/bin/make_schema.rb
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require 'yaml'
|
5
|
+
require 'comicvine/mongo'
|
6
|
+
|
7
|
+
objects = {}
|
8
|
+
cur_obj = nil
|
9
|
+
File.readlines('/Users/homans/code/comicvine-mongo/lib/comicvine/mongo.rb').each do |line|
|
10
|
+
if line =~ /class\s+(\w+)\s+\<\s+ComicVine\:\:Resource/
|
11
|
+
cur_obj = $1.to_s.downcase
|
12
|
+
objects[cur_obj] = []
|
13
|
+
elsif !cur_obj.nil? && line =~ /field|belongs_to|has_and_belongs_to_many|has_many|has_one/
|
14
|
+
array = line.split(',').map { |a| a.split(' ') }
|
15
|
+
objects[cur_obj].push array
|
16
|
+
else
|
17
|
+
#line unless line =~ /^\s+$|^\s+#|\s+(def|self|end|if|els|super|\!)/
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Gather a count of each property
|
22
|
+
data = {
|
23
|
+
props: {},
|
24
|
+
prop_groups: {},
|
25
|
+
class_map: {}
|
26
|
+
}
|
27
|
+
|
28
|
+
objects.each do |k, v|
|
29
|
+
v.each do |prop|
|
30
|
+
field = prop.first.last
|
31
|
+
data[:props][field] = {type: nil, count: 0} unless data[:props].has_key? field
|
32
|
+
data[:props][field][:count] += 1
|
33
|
+
|
34
|
+
# Store in class map
|
35
|
+
data[:class_map][k] = {} unless data[:class_map].has_key? k
|
36
|
+
|
37
|
+
# gather type
|
38
|
+
prop.each do |a|
|
39
|
+
if a[0] =~ /type|class_name/
|
40
|
+
data[:props][field][:type] = a[1]
|
41
|
+
data[:class_map][k][field] = {type: a[1], data: prop}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
# Group the most used properties for separate types
|
49
|
+
5.times do |n|
|
50
|
+
count = objects.count - n
|
51
|
+
data[:prop_groups][count] = []
|
52
|
+
|
53
|
+
data[:props].each do |k, v|
|
54
|
+
if v[:count].eql? count
|
55
|
+
data[:prop_groups][count].push k.to_s
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Create RAML Types
|
61
|
+
dir = '/Users/homans/code/comicvine_api/schemas/'
|
62
|
+
|
63
|
+
data[:class_map].keys.sort.each do |klass|
|
64
|
+
raml_schema = {
|
65
|
+
klass => {
|
66
|
+
'id' => 'integer',
|
67
|
+
'comic_vine' => 'CVResource',
|
68
|
+
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
data[:class_map][klass].keys.sort.each do |prop|
|
73
|
+
name = prop.delete(':')
|
74
|
+
|
75
|
+
# Skip comicvine comon values
|
76
|
+
if %w(site_detail_url api_detail_url id date_added has_staff_review image).include? name
|
77
|
+
next
|
78
|
+
end
|
79
|
+
raml_schema[klass][name] = {}
|
80
|
+
|
81
|
+
if data[:class_map][klass][prop][:type] =~ /Integer|String|Array/
|
82
|
+
raml_schema[klass][name] = data[:class_map][klass][prop][:type].downcase
|
83
|
+
elsif data[:class_map][klass][prop][:type] =~ /ComicVine::Resource::(\w+)/
|
84
|
+
relation = data[:class_map][klass][prop][:data].first.first
|
85
|
+
|
86
|
+
if relation =~ /has_and_belongs_to_many|has_many/
|
87
|
+
raml_schema[klass][name] = 'ApiResource'
|
88
|
+
elsif relation =~ /belongs_to|has_one/
|
89
|
+
raml_schema[klass][name] = 'ApiResources'
|
90
|
+
end
|
91
|
+
|
92
|
+
elsif data[:class_map][klass][prop][:type] == 'DateTime'
|
93
|
+
raml_schema[klass][name] = 'datetime-only'
|
94
|
+
elsif data[:class_map][klass][prop][:type] == 'Date'
|
95
|
+
raml_schema[klass][name] = 'date-only'
|
96
|
+
elsif data[:class_map][klass][prop][:type] == 'Hash' && name == 'image'
|
97
|
+
raml_schema[klass][name] = 'Image'
|
98
|
+
else
|
99
|
+
#puts "#{klass} : #{prop} => #{data[:class_map][klass][prop][:type]}"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
yaml = {
|
104
|
+
# klass.to_s.capitalize => {
|
105
|
+
'type' => 'object',
|
106
|
+
'properties' => raml_schema[klass]
|
107
|
+
# }
|
108
|
+
}.to_yaml
|
109
|
+
#puts yaml
|
110
|
+
File.write("#{dir}#{klass}.yml", yaml)
|
111
|
+
puts " #{klass.to_s.capitalize}: !include schemas/#{klass}.yml"
|
112
|
+
end
|
113
|
+
|
114
|
+
#ComicVine::API.get_details(:issue, 6).save!
|
115
|
+
#ComicVine::API.get_details(:volume, 1487).save!
|
116
|
+
#ComicVine::API.get_details(:character, 1253).save!
|
117
|
+
#ComicVine::API.get_details(:concept, 35070).save!
|
118
|
+
#ComicVine::API.get_details(:location, 21766).save!
|
119
|
+
#ComicVine::API.get_details(:movie, 1).save!
|
120
|
+
#ComicVine::API.get_details(:object, 15073).save!
|
121
|
+
#ComicVine::API.get_details(:origin, 3).save!
|
122
|
+
#ComicVine::API.get_details(:person, 1251).save!
|
123
|
+
#ComicVine::API.get_details(:power, 1).save!
|
124
|
+
#ComicVine::API.get_details(:promo, 1637).save!
|
125
|
+
#ComicVine::API.get_details(:publisher, 4).save!
|
126
|
+
#ComicVine::API.get_details(:series, 1).save!
|
127
|
+
#ComicVine::API.get_details(:story_arc, 27758).save!
|
128
|
+
#ComicVine::API.get_details(:team, 40426).save!
|
129
|
+
|
130
|
+
|
131
|
+
#puts data.to_json
|
132
|
+
|
data/certs/homans.pem
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
-----BEGIN CERTIFICATE-----
|
2
2
|
MIIDgDCCAmigAwIBAgIBATANBgkqhkiG9w0BAQUFADBDMRUwEwYDVQQDDAxob2xk
|
3
3
|
ZW4ub21hbnMxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
|
4
|
-
|
4
|
+
A2NvbTAeFw0xNzA0MDkyMTAwMTJaFw0xODA0MDkyMTAwMTJaMEMxFTATBgNVBAMM
|
5
5
|
DGhvbGRlbi5vbWFuczEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
LGQBGRYDY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyNPYv6sC
|
7
|
+
h/gLJ4XG0QdPJUEtvg8AwPLHz/BHLHKJPvq6Nyh2UDiWy+ZyP+uioBAxieHrMA4m
|
8
|
+
2v60BLIYWQyl2jPK2Rc2kchrciskFNy7wQMvi59a6+FFBMwdrl55stgJQOGorKSA
|
9
|
+
B/w/WYOnTWLzA6NuoRoA0JU1mWzKPCYn8HZLX88y5LzKZ6011K2zeh19MJDngaGU
|
10
|
+
EjOavcgNsNVGdlTToyz4P0v8kyXbRdKsBM4On7bN59ujHSOVdUr//Ze1IJj3dtew
|
11
|
+
bcefgVhmX+TtxjtKo1+V5Nt1YzQ3omiEbVt6I8yIuY87CDk8KJiXjzCR1iiNu8YF
|
12
|
+
zBm0vYm6tuRCKQIDAQABo38wfTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNV
|
13
|
+
HQ4EFgQUKuIxpvKKtDKrTwoV2OTimRBnu1YwIQYDVR0RBBowGIEWaG9sZGVuLm9t
|
14
14
|
YW5zQGdtYWlsLmNvbTAhBgNVHRIEGjAYgRZob2xkZW4ub21hbnNAZ21haWwuY29t
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
MA0GCSqGSIb3DQEBBQUAA4IBAQADMSGgLnyWg3FkyFsf0p5Y/yeN3giPIMjc4pK8
|
16
|
+
im1nsfZRotJvkWgobP17tkSK4YPYSlIqf9O5hCZlHHG8aGfy+L4ax9w23QOa9oJm
|
17
|
+
90OnzyR7G7CCXBOhjYXX5YsQbxBSbNwQQxLjjuOXe1HvgAKNCwMEI2Gj+5ByMMn3
|
18
|
+
uq/WPwQKccVm0Ado75I+1IiIpdJjWfOMt5KBxS/JCpE8hRxc3viXdTvN3vSUZ7q7
|
19
|
+
yFGnn1/BkVPEZOvDj9bIANBVtWP0hebPDM/v7B7Lz+SSfqSaWGAwi+XoDe2kN0Ii
|
20
|
+
LHXORkT9cmA6WykguTkGcDw9YiV/I7VMHzYyurD2x+nOXmla
|
21
21
|
-----END CERTIFICATE-----
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
f4f9335530d4eb01e71cf1a3a2a98a52899a874e7527dfbdde4c1413ce08ead0
|
@@ -0,0 +1 @@
|
|
1
|
+
5e34b7dfba5214288dacf94458f799f07f7e9a419e51d9a5e6d0fbefe486285e
|
data/lib/comicvine/mongo.rb
CHANGED
@@ -134,6 +134,7 @@ module ComicVine
|
|
134
134
|
class Issue < ComicVine::Resource
|
135
135
|
include Mongoid::Document
|
136
136
|
include ComicVine::Mongo
|
137
|
+
include Mongoid::Attributes::Dynamic
|
137
138
|
|
138
139
|
field :aliases, type: String
|
139
140
|
field :api_detail_url, type: String
|
@@ -200,6 +201,7 @@ module ComicVine
|
|
200
201
|
class Volume < ComicVine::Resource
|
201
202
|
include Mongoid::Document
|
202
203
|
include ComicVine::Mongo
|
204
|
+
include Mongoid::Attributes::Dynamic
|
203
205
|
|
204
206
|
field :aliases, type: String
|
205
207
|
field :api_detail_url, type: String
|
@@ -236,6 +238,7 @@ module ComicVine
|
|
236
238
|
class Character < ComicVine::Resource
|
237
239
|
include Mongoid::Document
|
238
240
|
include ComicVine::Mongo
|
241
|
+
include Mongoid::Attributes::Dynamic
|
239
242
|
|
240
243
|
field :aliases, type: String
|
241
244
|
field :api_detail_url, type: String
|
@@ -284,6 +287,7 @@ module ComicVine
|
|
284
287
|
class Concept < ComicVine::Resource
|
285
288
|
include Mongoid::Document
|
286
289
|
include ComicVine::Mongo
|
290
|
+
include Mongoid::Attributes::Dynamic
|
287
291
|
|
288
292
|
field :aliases, type: String
|
289
293
|
field :api_detail_url, type: String
|
@@ -327,6 +331,7 @@ module ComicVine
|
|
327
331
|
class Episode < ComicVine::Resource
|
328
332
|
include Mongoid::Document
|
329
333
|
include ComicVine::Mongo
|
334
|
+
include Mongoid::Attributes::Dynamic
|
330
335
|
|
331
336
|
field :aliases, type: String
|
332
337
|
field :api_detail_url, type: String
|
@@ -388,6 +393,7 @@ module ComicVine
|
|
388
393
|
class Location < ComicVine::Resource
|
389
394
|
include Mongoid::Document
|
390
395
|
include ComicVine::Mongo
|
396
|
+
include Mongoid::Attributes::Dynamic
|
391
397
|
|
392
398
|
field :aliases, type: String
|
393
399
|
field :api_detail_url, type: String
|
@@ -416,6 +422,7 @@ module ComicVine
|
|
416
422
|
class Movie < ComicVine::Resource
|
417
423
|
include Mongoid::Document
|
418
424
|
include ComicVine::Mongo
|
425
|
+
include Mongoid::Attributes::Dynamic
|
419
426
|
|
420
427
|
field :api_detail_url, type: String
|
421
428
|
field :box_office_revenue, type: Integer
|
@@ -471,6 +478,7 @@ module ComicVine
|
|
471
478
|
class Object < ComicVine::Resource
|
472
479
|
include Mongoid::Document
|
473
480
|
include ComicVine::Mongo
|
481
|
+
include Mongoid::Attributes::Dynamic
|
474
482
|
|
475
483
|
field :aliases, type: String
|
476
484
|
field :api_detail_url, type: String
|
@@ -498,6 +506,7 @@ module ComicVine
|
|
498
506
|
class Origin < ComicVine::Resource
|
499
507
|
include Mongoid::Document
|
500
508
|
include ComicVine::Mongo
|
509
|
+
include Mongoid::Attributes::Dynamic
|
501
510
|
|
502
511
|
field :api_detail_url, type: String
|
503
512
|
field :character_set, type: String
|
@@ -515,6 +524,7 @@ module ComicVine
|
|
515
524
|
class Person < ComicVine::Resource
|
516
525
|
include Mongoid::Document
|
517
526
|
include ComicVine::Mongo
|
527
|
+
include Mongoid::Attributes::Dynamic
|
518
528
|
|
519
529
|
field :aliases, type: String
|
520
530
|
field :api_detail_url, type: String
|
@@ -581,6 +591,7 @@ module ComicVine
|
|
581
591
|
class Power < ComicVine::Resource
|
582
592
|
include Mongoid::Document
|
583
593
|
include ComicVine::Mongo
|
594
|
+
include Mongoid::Attributes::Dynamic
|
584
595
|
|
585
596
|
field :aliases, type: String
|
586
597
|
field :api_detail_url, type: String
|
@@ -599,6 +610,7 @@ module ComicVine
|
|
599
610
|
class Promo < ComicVine::Resource
|
600
611
|
include Mongoid::Document
|
601
612
|
include ComicVine::Mongo
|
613
|
+
include Mongoid::Attributes::Dynamic
|
602
614
|
|
603
615
|
field :api_detail_url, type: String
|
604
616
|
field :date_added, type: DateTime
|
@@ -617,6 +629,7 @@ module ComicVine
|
|
617
629
|
class Publisher < ComicVine::Resource
|
618
630
|
include Mongoid::Document
|
619
631
|
include ComicVine::Mongo
|
632
|
+
include Mongoid::Attributes::Dynamic
|
620
633
|
|
621
634
|
field :aliases, type: String
|
622
635
|
field :api_detail_url, type: String
|
@@ -645,6 +658,7 @@ module ComicVine
|
|
645
658
|
class Series < ComicVine::Resource
|
646
659
|
include Mongoid::Document
|
647
660
|
include ComicVine::Mongo
|
661
|
+
include Mongoid::Attributes::Dynamic
|
648
662
|
|
649
663
|
field :aliases, type: String
|
650
664
|
field :api_detail_url, type: String
|
@@ -676,6 +690,7 @@ module ComicVine
|
|
676
690
|
class StoryArc < ComicVine::Resource
|
677
691
|
include Mongoid::Document
|
678
692
|
include ComicVine::Mongo
|
693
|
+
include Mongoid::Attributes::Dynamic
|
679
694
|
|
680
695
|
field :aliases, type: String
|
681
696
|
field :api_detail_url, type: String
|
@@ -718,6 +733,7 @@ module ComicVine
|
|
718
733
|
class Team < ComicVine::Resource
|
719
734
|
include Mongoid::Document
|
720
735
|
include ComicVine::Mongo
|
736
|
+
include Mongoid::Attributes::Dynamic
|
721
737
|
|
722
738
|
field :aliases, type: String
|
723
739
|
field :api_detail_url, type: String
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: comicvine-mongo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Holden Omans
|
@@ -12,25 +12,25 @@ cert_chain:
|
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
13
|
MIIDgDCCAmigAwIBAgIBATANBgkqhkiG9w0BAQUFADBDMRUwEwYDVQQDDAxob2xk
|
14
14
|
ZW4ub21hbnMxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
|
15
|
-
|
15
|
+
A2NvbTAeFw0xNzA0MDkyMTAwMTJaFw0xODA0MDkyMTAwMTJaMEMxFTATBgNVBAMM
|
16
16
|
DGhvbGRlbi5vbWFuczEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
17
|
+
LGQBGRYDY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyNPYv6sC
|
18
|
+
h/gLJ4XG0QdPJUEtvg8AwPLHz/BHLHKJPvq6Nyh2UDiWy+ZyP+uioBAxieHrMA4m
|
19
|
+
2v60BLIYWQyl2jPK2Rc2kchrciskFNy7wQMvi59a6+FFBMwdrl55stgJQOGorKSA
|
20
|
+
B/w/WYOnTWLzA6NuoRoA0JU1mWzKPCYn8HZLX88y5LzKZ6011K2zeh19MJDngaGU
|
21
|
+
EjOavcgNsNVGdlTToyz4P0v8kyXbRdKsBM4On7bN59ujHSOVdUr//Ze1IJj3dtew
|
22
|
+
bcefgVhmX+TtxjtKo1+V5Nt1YzQ3omiEbVt6I8yIuY87CDk8KJiXjzCR1iiNu8YF
|
23
|
+
zBm0vYm6tuRCKQIDAQABo38wfTAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNV
|
24
|
+
HQ4EFgQUKuIxpvKKtDKrTwoV2OTimRBnu1YwIQYDVR0RBBowGIEWaG9sZGVuLm9t
|
25
25
|
YW5zQGdtYWlsLmNvbTAhBgNVHRIEGjAYgRZob2xkZW4ub21hbnNAZ21haWwuY29t
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
MA0GCSqGSIb3DQEBBQUAA4IBAQADMSGgLnyWg3FkyFsf0p5Y/yeN3giPIMjc4pK8
|
27
|
+
im1nsfZRotJvkWgobP17tkSK4YPYSlIqf9O5hCZlHHG8aGfy+L4ax9w23QOa9oJm
|
28
|
+
90OnzyR7G7CCXBOhjYXX5YsQbxBSbNwQQxLjjuOXe1HvgAKNCwMEI2Gj+5ByMMn3
|
29
|
+
uq/WPwQKccVm0Ado75I+1IiIpdJjWfOMt5KBxS/JCpE8hRxc3viXdTvN3vSUZ7q7
|
30
|
+
yFGnn1/BkVPEZOvDj9bIANBVtWP0hebPDM/v7B7Lz+SSfqSaWGAwi+XoDe2kN0Ii
|
31
|
+
LHXORkT9cmA6WykguTkGcDw9YiV/I7VMHzYyurD2x+nOXmla
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date:
|
33
|
+
date: 2017-04-09 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: bundler
|
@@ -195,11 +195,13 @@ files:
|
|
195
195
|
- README.md
|
196
196
|
- Rakefile
|
197
197
|
- bin/console
|
198
|
+
- bin/make_schema.rb
|
198
199
|
- bin/setup
|
199
200
|
- certs/homans.pem
|
200
201
|
- checksum/comicvine-mongo-0.1.0.gem.sha256
|
201
202
|
- checksum/comicvine-mongo-0.1.1.gem.sha256
|
202
203
|
- checksum/comicvine-mongo-0.1.2.gem.sha256
|
204
|
+
- checksum/comicvine-mongo-0.1.3.gem.sha256
|
203
205
|
- comicvine-mongo.gemspec
|
204
206
|
- lib/comicvine/mongo.rb
|
205
207
|
- lib/comicvine/mongo/version.rb
|
@@ -223,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
223
225
|
version: '0'
|
224
226
|
requirements: []
|
225
227
|
rubyforge_project:
|
226
|
-
rubygems_version: 2.
|
228
|
+
rubygems_version: 2.6.10
|
227
229
|
signing_key:
|
228
230
|
specification_version: 4
|
229
231
|
summary: Mongo extension to the comicvine gem
|
metadata.gz.sig
CHANGED
@@ -1,3 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
�M�0�YP�W}7���2�� �� �V����
|
1
|
+
'��j��7�#���3\xg�O5���Y��߅�dv��3ra����KdqW�66Z���v؝ή[Mn4�o��J�G�=)�%^��&⧹;\����vK�y�nV=��!�5�@���:�M��h_���z@�s��D��
|
2
|
+
>�Tn��p,��B������`��c�o�����D<�8��a<\
|