mtncd 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Gemfile.lock +11 -1
- data/bin/mtncd +58 -20
- data/lib/mtncd/version.rb +1 -1
- data/mtncd.gemspec +1 -0
- metadata +44 -5
- checksums.yaml +0 -15
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
stackato-report
|
data/Gemfile.lock
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mtncd (0.
|
4
|
+
mtncd (0.1.1)
|
5
5
|
awesome_print (= 1.2.0)
|
6
6
|
gli (= 2.12.2)
|
7
|
+
highline (= 1.6.21)
|
7
8
|
msgpack (= 0.5.9)
|
8
9
|
redis (= 3.1.0)
|
9
10
|
resque (= 1.25.2)
|
10
11
|
serfx (= 0.0.8)
|
12
|
+
stackadmin (= 1.0.0)
|
11
13
|
|
12
14
|
GEM
|
13
15
|
remote: https://rubygems.org/
|
@@ -31,12 +33,16 @@ GEM
|
|
31
33
|
gherkin (2.12.2)
|
32
34
|
multi_json (~> 1.3)
|
33
35
|
gli (2.12.2)
|
36
|
+
highline (1.6.21)
|
34
37
|
json (1.8.1)
|
35
38
|
mixlib-log (1.6.0)
|
36
39
|
mono_logger (1.1.0)
|
37
40
|
msgpack (0.5.9)
|
38
41
|
multi_json (1.10.1)
|
39
42
|
multi_test (0.1.1)
|
43
|
+
net-scp (1.2.1)
|
44
|
+
net-ssh (>= 2.6.5)
|
45
|
+
net-ssh (2.9.2)
|
40
46
|
rack (1.6.0)
|
41
47
|
rack-protection (1.5.3)
|
42
48
|
rack
|
@@ -63,6 +69,10 @@ GEM
|
|
63
69
|
rack (~> 1.4)
|
64
70
|
rack-protection (~> 1.4)
|
65
71
|
tilt (~> 1.3, >= 1.3.4)
|
72
|
+
stackadmin (1.0.0)
|
73
|
+
json
|
74
|
+
net-scp
|
75
|
+
net-ssh
|
66
76
|
tilt (1.4.1)
|
67
77
|
vegas (0.1.11)
|
68
78
|
rack (>= 1.0.0)
|
data/bin/mtncd
CHANGED
@@ -12,6 +12,7 @@ require 'redis'
|
|
12
12
|
require 'open3'
|
13
13
|
require 'resque'
|
14
14
|
require 'highline/import'
|
15
|
+
require 'stackadmin'
|
15
16
|
|
16
17
|
include GLI::App
|
17
18
|
|
@@ -37,7 +38,7 @@ command :deploy do |deploy|
|
|
37
38
|
|
38
39
|
start.desc 'local or global cluster command'
|
39
40
|
start.default_value 'global'
|
40
|
-
start.flag :cluster, :must_match => {
|
41
|
+
start.flag :cluster, :must_match => {
|
41
42
|
'global' => 'global',
|
42
43
|
'local' => 'local'
|
43
44
|
}
|
@@ -53,8 +54,8 @@ command :deploy do |deploy|
|
|
53
54
|
start.switch :single
|
54
55
|
|
55
56
|
start.action do |global_options,options,args|
|
56
|
-
event_options_hash = {
|
57
|
-
'id' => "#{options[:id]}",
|
57
|
+
event_options_hash = {
|
58
|
+
'id' => "#{options[:id]}",
|
58
59
|
'single' => options[:single],
|
59
60
|
}
|
60
61
|
event_options_hash['exclusion'] = options[:exclude].nil? ? $config['default_exclude'] : options[:exclude]
|
@@ -97,14 +98,14 @@ command :deploy do |deploy|
|
|
97
98
|
|
98
99
|
stop.desc 'local or global cluster command'
|
99
100
|
stop.default_value 'global'
|
100
|
-
stop.flag :cluster, :must_match => {
|
101
|
+
stop.flag :cluster, :must_match => {
|
101
102
|
'global' => 'global',
|
102
103
|
'local' => 'local'
|
103
104
|
}
|
104
105
|
|
105
106
|
stop.action do |global_options,options,args|
|
106
107
|
|
107
|
-
event_options_hash = {
|
108
|
+
event_options_hash = {
|
108
109
|
'id' => "#{options[:id]}"
|
109
110
|
}
|
110
111
|
|
@@ -133,7 +134,7 @@ command :deploy do |deploy|
|
|
133
134
|
success.flag :id, :required => true
|
134
135
|
|
135
136
|
success.action do |global_options,options,args|
|
136
|
-
event_options_hash = {
|
137
|
+
event_options_hash = {
|
137
138
|
'id' => "#{options[:id]}",
|
138
139
|
'env' => $config['ship']['environment'],
|
139
140
|
'shipcodes' => [ $config['ship']['shipcode'] ]
|
@@ -170,19 +171,19 @@ command :deploy do |deploy|
|
|
170
171
|
raise "Error running 'deploy success' : #{e.message}"
|
171
172
|
end
|
172
173
|
end
|
173
|
-
end
|
174
|
+
end
|
174
175
|
end
|
175
176
|
|
176
177
|
desc 'cluster status'
|
177
178
|
command :status do |status|
|
178
179
|
status.desc 'local or global cluster'
|
179
180
|
status.default_value 'global'
|
180
|
-
status.flag :cluster, :must_match => {
|
181
|
+
status.flag :cluster, :must_match => {
|
181
182
|
'global' => 'global',
|
182
183
|
'local' => 'local'
|
183
184
|
}
|
184
185
|
|
185
|
-
status.action do |global_options,options,args|
|
186
|
+
status.action do |global_options,options,args|
|
186
187
|
|
187
188
|
serf_options_hash = {
|
188
189
|
'ip' => $config['serf'][options[:cluster]]['rpc_ip'],
|
@@ -221,7 +222,7 @@ command :system do |system|
|
|
221
222
|
Resque.redis = "#{$config['resque']['redis_ip']}:#{$config['resque']['redis_port']}/#{$config['resque']['redis_db']}"
|
222
223
|
|
223
224
|
# clean up any workers that didn't exit gracefuly.
|
224
|
-
Resque.workers.each { |worker|
|
225
|
+
Resque.workers.each { |worker|
|
225
226
|
worker.prune_dead_workers
|
226
227
|
}
|
227
228
|
|
@@ -233,7 +234,7 @@ command :system do |system|
|
|
233
234
|
success = false
|
234
235
|
puts "Resque - failed to get worker count - [#{result}]"
|
235
236
|
end
|
236
|
-
|
237
|
+
|
237
238
|
# check serf
|
238
239
|
if $config['role'] == 'ship' || $config['role'] == 'sled'
|
239
240
|
begin
|
@@ -275,7 +276,7 @@ command :ping do |ping|
|
|
275
276
|
|
276
277
|
ping.desc 'local or global cluster command'
|
277
278
|
ping.default_value 'global'
|
278
|
-
ping.flag :cluster, :must_match => {
|
279
|
+
ping.flag :cluster, :must_match => {
|
279
280
|
'global' => 'global',
|
280
281
|
'local' => 'local'
|
281
282
|
}
|
@@ -284,7 +285,7 @@ command :ping do |ping|
|
|
284
285
|
ping.default_value 60
|
285
286
|
ping.flag :timeout
|
286
287
|
|
287
|
-
ping.action do |global_options,options,args|
|
288
|
+
ping.action do |global_options,options,args|
|
288
289
|
begin
|
289
290
|
puts "This might take up to #{options[:timeout]} seconds" unless options[:json]
|
290
291
|
|
@@ -302,7 +303,7 @@ command :ping do |ping|
|
|
302
303
|
end
|
303
304
|
command_string += " -rpc-addr=#{$config['serf'][options[:cluster]]['rpc_ip']}:#{$config['serf'][options[:cluster]]['rpc_port']}"
|
304
305
|
command_string += " -rpc-auth=#{$config['serf'][options[:cluster]]['rpc_auth']}" unless $config['serf'][options[:cluster]]['rpc_auth'].nil?
|
305
|
-
|
306
|
+
|
306
307
|
start_time = Time.now.to_i
|
307
308
|
command_string += " ping #{start_time}"
|
308
309
|
|
@@ -322,7 +323,7 @@ command :ping do |ping|
|
|
322
323
|
end
|
323
324
|
|
324
325
|
if options[:json]
|
325
|
-
puts JSON.pretty_generate(serf_output)
|
326
|
+
puts JSON.pretty_generate(serf_output)
|
326
327
|
else
|
327
328
|
puts "\033[31mFailure: #{serf_output['Error']}\033[0m" unless serf_output['Error'].nil?
|
328
329
|
|
@@ -367,7 +368,7 @@ command :resque do |resque|
|
|
367
368
|
puts "Worker #{worker.to_s} processing job #{worker.job}"
|
368
369
|
}
|
369
370
|
end
|
370
|
-
end
|
371
|
+
end
|
371
372
|
|
372
373
|
resque.desc 'resque errors'
|
373
374
|
resque.command :errors do |errors|
|
@@ -380,13 +381,13 @@ command :resque do |resque|
|
|
380
381
|
puts '--------------------'
|
381
382
|
}
|
382
383
|
end
|
383
|
-
end
|
384
|
+
end
|
384
385
|
|
385
386
|
resque.desc 'flush redis (destructive)'
|
386
387
|
resque.command :flush do |flush|
|
387
388
|
flush.action do |global_options,options,args|
|
388
389
|
redis = Redis.new(:host => $config['resque']['redis_ip'], :port => $config['resque']['redis_port'], :db => $config['resque']['redis_db'])
|
389
|
-
|
390
|
+
|
390
391
|
res = ask("Enter 'flush' to continue or anything else to cancel.")
|
391
392
|
if res == 'flush'
|
392
393
|
redis.flushall
|
@@ -397,12 +398,49 @@ command :resque do |resque|
|
|
397
398
|
end
|
398
399
|
end
|
399
400
|
|
401
|
+
desc 'Stackato administration'
|
402
|
+
skips_pre
|
403
|
+
skips_post
|
404
|
+
command :stk do |stk|
|
405
|
+
stk.arg 'TARGET_STACKATO'
|
406
|
+
|
407
|
+
stk.desc 'Get a report'
|
408
|
+
stk.command :report do |report|
|
409
|
+
report.desc 'destination for stackato-report'
|
410
|
+
report.default_value '.'
|
411
|
+
report.flag [:d, :destination]
|
412
|
+
|
413
|
+
report.desc 'download report as a tarball'
|
414
|
+
report.default_value false
|
415
|
+
report.switch [:t, :tgz, :tarball]
|
416
|
+
|
417
|
+
report.desc 'get a full cluster report'
|
418
|
+
report.default_value false
|
419
|
+
report.switch [:c, :cluster]
|
420
|
+
|
421
|
+
report.action do |global_options, options, args|
|
422
|
+
report_opts = []
|
423
|
+
[:tarball, :cluster].each do
|
424
|
+
|opt| report_opts << opt if options[opt]
|
425
|
+
end
|
426
|
+
|
427
|
+
puts "Connecting to: #{args[0]}..."
|
428
|
+
target = Stackadmin.new args[0]
|
429
|
+
|
430
|
+
puts "Generating report..."
|
431
|
+
output = target.report(*report_opts, destination: options[:destination])
|
432
|
+
|
433
|
+
puts "Done! Report at: #{output}"
|
434
|
+
end
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
400
438
|
|
401
439
|
pre do |global,command,options,args|
|
402
440
|
|
403
|
-
config_path = File.exists?(File.join('/', 'opt', 'mtn_cicd', '.cicdconfig')) ?
|
441
|
+
config_path = File.exists?(File.join('/', 'opt', 'mtn_cicd', '.cicdconfig')) ?
|
404
442
|
File.join('/', 'opt', 'mtn_cicd', '.cicdconfig') : File.join(Dir.home, '.cicdconfig')
|
405
|
-
|
443
|
+
|
406
444
|
$config = JSON.parse(File.read(config_path))
|
407
445
|
|
408
446
|
if $config['role'] == 'sled' && options[:cluster] == 'global'
|
data/lib/mtncd/version.rb
CHANGED
data/mtncd.gemspec
CHANGED
@@ -22,6 +22,7 @@ spec = Gem::Specification.new do |s|
|
|
22
22
|
s.add_dependency('awesome_print', '1.2.0')
|
23
23
|
s.add_dependency('redis', '3.1.0')
|
24
24
|
s.add_dependency('highline', '1.6.21')
|
25
|
+
s.add_dependency('stackadmin', '1.0.0')
|
25
26
|
s.add_development_dependency('rake')
|
26
27
|
s.add_development_dependency('rdoc')
|
27
28
|
s.add_development_dependency('aruba')
|
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mtncd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- MTN Satellite Communications
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2015-
|
12
|
+
date: 2015-04-07 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: resque
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - '='
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -20,6 +22,7 @@ dependencies:
|
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
27
|
- - '='
|
25
28
|
- !ruby/object:Gem::Version
|
@@ -27,6 +30,7 @@ dependencies:
|
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: serfx
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - '='
|
32
36
|
- !ruby/object:Gem::Version
|
@@ -34,6 +38,7 @@ dependencies:
|
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - '='
|
39
44
|
- !ruby/object:Gem::Version
|
@@ -41,6 +46,7 @@ dependencies:
|
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: msgpack
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
51
|
- - '='
|
46
52
|
- !ruby/object:Gem::Version
|
@@ -48,6 +54,7 @@ dependencies:
|
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
59
|
- - '='
|
53
60
|
- !ruby/object:Gem::Version
|
@@ -55,6 +62,7 @@ dependencies:
|
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: awesome_print
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
67
|
- - '='
|
60
68
|
- !ruby/object:Gem::Version
|
@@ -62,6 +70,7 @@ dependencies:
|
|
62
70
|
type: :runtime
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
75
|
- - '='
|
67
76
|
- !ruby/object:Gem::Version
|
@@ -69,6 +78,7 @@ dependencies:
|
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: redis
|
71
80
|
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
72
82
|
requirements:
|
73
83
|
- - '='
|
74
84
|
- !ruby/object:Gem::Version
|
@@ -76,6 +86,7 @@ dependencies:
|
|
76
86
|
type: :runtime
|
77
87
|
prerelease: false
|
78
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
79
90
|
requirements:
|
80
91
|
- - '='
|
81
92
|
- !ruby/object:Gem::Version
|
@@ -83,6 +94,7 @@ dependencies:
|
|
83
94
|
- !ruby/object:Gem::Dependency
|
84
95
|
name: highline
|
85
96
|
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
86
98
|
requirements:
|
87
99
|
- - '='
|
88
100
|
- !ruby/object:Gem::Version
|
@@ -90,13 +102,31 @@ dependencies:
|
|
90
102
|
type: :runtime
|
91
103
|
prerelease: false
|
92
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
93
106
|
requirements:
|
94
107
|
- - '='
|
95
108
|
- !ruby/object:Gem::Version
|
96
109
|
version: 1.6.21
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: stackadmin
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.0.0
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - '='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.0.0
|
97
126
|
- !ruby/object:Gem::Dependency
|
98
127
|
name: rake
|
99
128
|
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
100
130
|
requirements:
|
101
131
|
- - ! '>='
|
102
132
|
- !ruby/object:Gem::Version
|
@@ -104,6 +134,7 @@ dependencies:
|
|
104
134
|
type: :development
|
105
135
|
prerelease: false
|
106
136
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
107
138
|
requirements:
|
108
139
|
- - ! '>='
|
109
140
|
- !ruby/object:Gem::Version
|
@@ -111,6 +142,7 @@ dependencies:
|
|
111
142
|
- !ruby/object:Gem::Dependency
|
112
143
|
name: rdoc
|
113
144
|
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
114
146
|
requirements:
|
115
147
|
- - ! '>='
|
116
148
|
- !ruby/object:Gem::Version
|
@@ -118,6 +150,7 @@ dependencies:
|
|
118
150
|
type: :development
|
119
151
|
prerelease: false
|
120
152
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
121
154
|
requirements:
|
122
155
|
- - ! '>='
|
123
156
|
- !ruby/object:Gem::Version
|
@@ -125,6 +158,7 @@ dependencies:
|
|
125
158
|
- !ruby/object:Gem::Dependency
|
126
159
|
name: aruba
|
127
160
|
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
128
162
|
requirements:
|
129
163
|
- - ! '>='
|
130
164
|
- !ruby/object:Gem::Version
|
@@ -132,6 +166,7 @@ dependencies:
|
|
132
166
|
type: :development
|
133
167
|
prerelease: false
|
134
168
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
135
170
|
requirements:
|
136
171
|
- - ! '>='
|
137
172
|
- !ruby/object:Gem::Version
|
@@ -139,6 +174,7 @@ dependencies:
|
|
139
174
|
- !ruby/object:Gem::Dependency
|
140
175
|
name: gli
|
141
176
|
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
142
178
|
requirements:
|
143
179
|
- - '='
|
144
180
|
- !ruby/object:Gem::Version
|
@@ -146,6 +182,7 @@ dependencies:
|
|
146
182
|
type: :runtime
|
147
183
|
prerelease: false
|
148
184
|
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
149
186
|
requirements:
|
150
187
|
- - '='
|
151
188
|
- !ruby/object:Gem::Version
|
@@ -159,6 +196,7 @@ extra_rdoc_files:
|
|
159
196
|
- README.rdoc
|
160
197
|
- mtncd.rdoc
|
161
198
|
files:
|
199
|
+
- .gitignore
|
162
200
|
- Gemfile
|
163
201
|
- Gemfile.lock
|
164
202
|
- README.md
|
@@ -176,7 +214,6 @@ files:
|
|
176
214
|
- test/test_helper.rb
|
177
215
|
homepage: https://github.com/mtnsat
|
178
216
|
licenses: []
|
179
|
-
metadata: {}
|
180
217
|
post_install_message:
|
181
218
|
rdoc_options:
|
182
219
|
- --title
|
@@ -188,19 +225,21 @@ require_paths:
|
|
188
225
|
- lib
|
189
226
|
- lib
|
190
227
|
required_ruby_version: !ruby/object:Gem::Requirement
|
228
|
+
none: false
|
191
229
|
requirements:
|
192
230
|
- - ! '>='
|
193
231
|
- !ruby/object:Gem::Version
|
194
232
|
version: '0'
|
195
233
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
234
|
+
none: false
|
196
235
|
requirements:
|
197
236
|
- - ! '>='
|
198
237
|
- !ruby/object:Gem::Version
|
199
238
|
version: '0'
|
200
239
|
requirements: []
|
201
240
|
rubyforge_project:
|
202
|
-
rubygems_version:
|
241
|
+
rubygems_version: 1.8.23.2
|
203
242
|
signing_key:
|
204
|
-
specification_version:
|
243
|
+
specification_version: 3
|
205
244
|
summary: A helper tool for MTN CICD pipeline
|
206
245
|
test_files: []
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
!binary "U0hBMQ==":
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
NGExNjBkNGVjMWM1ZjlkM2M5YjhlNjliMDY2ZGY1YjI0ZGY2ZWNiNg==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
OTYwYjMxMzIxZTJmOWZkNjg5NmM2OWFiNjA1NGVjYzZmNDVlNDg2ZQ==
|
7
|
-
SHA512:
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
MDI5ZmRmY2Q4NzVkMjQ0OWY3OThjZjM2MTU3MTAwOGI5ZGRlNWJjNzYxYjc5
|
10
|
-
ZmU5M2YyNDgxZDUxODVhNGU4ZThkNjg3YWM3NjFhYWI2YThmOTY5YTMzMjFl
|
11
|
-
NmJhMmYzOWJkZjA2YTdhNDQ2NWUzNjE3ODhjNDUyZWQwZWRkMzI=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NTg4OWM3MjAyMjc2NTY0MTcyOWYwNWMyMjllOTg4ZjdhN2RiMWMwOWY4M2Iw
|
14
|
-
MzRiNGZmNzI0NTYwMjg0NzhkMWU0OGRhY2JlNmI3OWRmZjcwMDFhNWViYTY1
|
15
|
-
NjZjYTAzM2UyYWEzZTNhNWQ3YTY4OWZmODUwZjVjNTFjMzNkNDg=
|