shipitron 1.2.0 → 1.4.0
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.
- checksums.yaml +4 -4
- data/.buildkite/pipeline.yml +94 -0
- data/.dockerignore +1 -0
- data/.gitattributes +1 -0
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/Deskfile +15 -0
- data/Dockerfile +40 -15
- data/Dockerfile.release +29 -6
- data/Dockerfile.staging +70 -0
- data/Gemfile +2 -0
- data/README.md +53 -15
- data/docker-compose.yml +54 -0
- data/lib/shipitron.rb +19 -2
- data/lib/shipitron/cli.rb +42 -42
- data/lib/shipitron/client.rb +9 -0
- data/lib/shipitron/client/bootstrap_application.rb +1 -0
- data/lib/shipitron/client/create_ecs_services.rb +7 -7
- data/lib/shipitron/client/deploy_application.rb +2 -0
- data/lib/shipitron/client/ensure_deploy_not_running.rb +2 -1
- data/lib/shipitron/client/fetch_clusters.rb +1 -0
- data/lib/shipitron/client/force_deploy.rb +1 -0
- data/lib/shipitron/client/generate_deploy.rb +41 -0
- data/lib/shipitron/client/load_application_config.rb +17 -0
- data/lib/shipitron/client/load_templates.rb +1 -0
- data/lib/shipitron/client/register_ecs_task_definitions.rb +5 -5
- data/lib/shipitron/client/run_ecs_tasks.rb +101 -72
- data/lib/shipitron/docker_image.rb +4 -1
- data/lib/shipitron/find_docker_volume_name.rb +68 -0
- data/lib/shipitron/git_info.rb +57 -0
- data/lib/shipitron/mustache_yaml_parser.rb +12 -8
- data/lib/shipitron/s3_copy.rb +46 -0
- data/lib/shipitron/server/deploy_application.rb +2 -0
- data/lib/shipitron/server/docker/build_image.rb +4 -1
- data/lib/shipitron/server/docker/configure.rb +46 -10
- data/lib/shipitron/server/docker/push_image.rb +3 -0
- data/lib/shipitron/server/docker/run_build_script.rb +17 -10
- data/lib/shipitron/server/download_build_cache.rb +11 -3
- data/lib/shipitron/server/fetch_deploy.rb +50 -0
- data/lib/shipitron/server/git/clone_local_copy.rb +4 -5
- data/lib/shipitron/server/git/update_cache.rb +2 -1
- data/lib/shipitron/server/run_post_build.rb +40 -1
- data/lib/shipitron/server/transform_cli_args.rb +4 -0
- data/lib/shipitron/server/update_ecs_task_definitions.rb +2 -1
- data/lib/shipitron/server/upload_build_cache.rb +10 -9
- data/lib/shipitron/version.rb +1 -1
- data/scripts/docker-entrypoint.sh +37 -3
- data/scripts/release-entrypoint.sh +20 -0
- data/shipitron.gemspec +11 -8
- data/test.yml +5 -0
- metadata +78 -25
- data/build_dev.sh +0 -27
data/lib/shipitron/version.rb
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
#!/bin/sh
|
2
|
-
|
2
|
+
|
3
|
+
set -euo pipefail
|
4
|
+
|
5
|
+
su-exec ${FIXUID:?Missing FIXUID var}:${FIXGID:?Missing FIXGID var} fixuid
|
6
|
+
|
7
|
+
chown_dir() {
|
8
|
+
dir=$1
|
9
|
+
if [[ -d ${dir} ]] && [[ "$(stat -c %u:%g ${dir})" != "${FIXUID}:${FIXGID}" ]]; then
|
10
|
+
echo chown $dir
|
11
|
+
chown shipitron:shipitron $dir
|
12
|
+
fi
|
13
|
+
}
|
14
|
+
|
15
|
+
chown_dir /home/shipitron
|
16
|
+
chown_dir /usr/local/bundle
|
17
|
+
|
18
|
+
if [ "$1" = 'bundle' ]; then
|
19
|
+
set -- su-exec shipitron "$@"
|
20
|
+
exec "$@"
|
21
|
+
elif [ "$1" = 'rake' ] && [ "$2" = 'release' ]; then
|
22
|
+
exec "$@"
|
23
|
+
fi
|
3
24
|
|
4
25
|
if [ -n "$USE_BUNDLE_EXEC" ]; then
|
5
26
|
BINARY="bundle exec shipitron"
|
@@ -7,10 +28,23 @@ else
|
|
7
28
|
BINARY=shipitron
|
8
29
|
fi
|
9
30
|
|
10
|
-
if
|
31
|
+
if [ "$(ls -A /usr/local/bundle/bin)" = '' ]; then
|
32
|
+
echo 'command not in path and bundler not initialized'
|
33
|
+
echo 'running bundle install'
|
34
|
+
su-exec shipitron bundle install
|
35
|
+
else
|
36
|
+
su-exec shipitron bash -c 'bundle check || bundle install'
|
37
|
+
fi
|
38
|
+
|
39
|
+
# ${BINARY} help "$1"
|
40
|
+
|
41
|
+
if ls /usr/local/bundle/bin | grep -q "\b$1\b"; then
|
42
|
+
set -- su-exec shipitron bundle exec "$@"
|
43
|
+
|
44
|
+
elif ${BINARY} help "$1" 2>&1 | grep -q "shipitron $1"; then
|
11
45
|
set -- su-exec shipitron ${BINARY} "$@"
|
12
46
|
|
13
|
-
if [ -n "$FOG_LOCAL" ]; then
|
47
|
+
if [ -n "${FOG_LOCAL:-}" ]; then
|
14
48
|
chown -R shipitron:shipitron /fog
|
15
49
|
fi
|
16
50
|
fi
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
set -euo pipefail
|
4
|
+
|
5
|
+
if [ -n "$USE_BUNDLE_EXEC" ]; then
|
6
|
+
BINARY="bundle exec shipitron"
|
7
|
+
else
|
8
|
+
BINARY=shipitron
|
9
|
+
fi
|
10
|
+
|
11
|
+
# ${BINARY} help "$1"
|
12
|
+
|
13
|
+
if ls /usr/local/bundle/bin | grep -q "\b$1\b"; then
|
14
|
+
set -- su-exec shipitron bundle exec "$@"
|
15
|
+
|
16
|
+
elif ${BINARY} help "$1" 2>&1 | grep -q "shipitron $1"; then
|
17
|
+
set -- su-exec shipitron ${BINARY} "$@"
|
18
|
+
fi
|
19
|
+
|
20
|
+
exec "$@"
|
data/shipitron.gemspec
CHANGED
@@ -17,23 +17,26 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
-
spec.add_runtime_dependency 'thor', '~> 0
|
20
|
+
spec.add_runtime_dependency 'thor', '~> 1.0'
|
21
21
|
spec.add_runtime_dependency 'aws-sdk-ecs', '~> 1.8'
|
22
|
-
spec.add_runtime_dependency '
|
23
|
-
spec.add_runtime_dependency '
|
22
|
+
spec.add_runtime_dependency 'aws-sdk-s3', '~> 1.96'
|
23
|
+
spec.add_runtime_dependency 'hashie', '~> 4.1'
|
24
|
+
spec.add_runtime_dependency 'metaractor', '~> 3.1'
|
24
25
|
spec.add_runtime_dependency 'diplomat', '~> 2.0'
|
25
|
-
spec.add_runtime_dependency 'fog-aws', '~>
|
26
|
+
spec.add_runtime_dependency 'fog-aws', '~> 3.6'
|
26
27
|
spec.add_runtime_dependency 'mime-types', '~> 3.1'
|
27
28
|
spec.add_runtime_dependency 'minitar', '~> 0.6'
|
28
29
|
spec.add_runtime_dependency 'mustache', '~> 1.0'
|
29
30
|
spec.add_runtime_dependency 'tty-command', '~> 0.7'
|
30
31
|
spec.add_runtime_dependency 'tty-table', '~> 0.9'
|
31
32
|
spec.add_runtime_dependency 'pastel', '~> 0.7'
|
33
|
+
spec.add_runtime_dependency 'excon', '~> 0.82'
|
34
|
+
spec.add_runtime_dependency 'rugged', '~> 1.0'
|
32
35
|
|
33
|
-
spec.add_development_dependency "bundler", "~> 1
|
34
|
-
spec.add_development_dependency "rake", "~>
|
35
|
-
spec.add_development_dependency "pry-byebug", "~> 3.
|
36
|
-
spec.add_development_dependency "rspec", "~> 3.
|
36
|
+
spec.add_development_dependency "bundler", "~> 2.1"
|
37
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
38
|
+
spec.add_development_dependency "pry-byebug", "~> 3.9"
|
39
|
+
spec.add_development_dependency "rspec", "~> 3.10"
|
37
40
|
spec.add_development_dependency "fivemat", "~> 1.3"
|
38
41
|
spec.add_development_dependency "fog-local", "~> 0.4"
|
39
42
|
end
|
data/test.yml
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shipitron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Schlesinger
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0
|
19
|
+
version: '1.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0
|
26
|
+
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: aws-sdk-ecs
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,34 +38,48 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1.8'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: aws-sdk-s3
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.96'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.96'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: hashie
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
61
|
+
version: '4.1'
|
48
62
|
type: :runtime
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
68
|
+
version: '4.1'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: metaractor
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
75
|
+
version: '3.1'
|
62
76
|
type: :runtime
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
80
|
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
82
|
+
version: '3.1'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: diplomat
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +100,14 @@ dependencies:
|
|
86
100
|
requirements:
|
87
101
|
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
103
|
+
version: '3.6'
|
90
104
|
type: :runtime
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
110
|
+
version: '3.6'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: mime-types
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -178,62 +192,90 @@ dependencies:
|
|
178
192
|
- - "~>"
|
179
193
|
- !ruby/object:Gem::Version
|
180
194
|
version: '0.7'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: excon
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0.82'
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0.82'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: rugged
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - "~>"
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '1.0'
|
216
|
+
type: :runtime
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - "~>"
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '1.0'
|
181
223
|
- !ruby/object:Gem::Dependency
|
182
224
|
name: bundler
|
183
225
|
requirement: !ruby/object:Gem::Requirement
|
184
226
|
requirements:
|
185
227
|
- - "~>"
|
186
228
|
- !ruby/object:Gem::Version
|
187
|
-
version: '1
|
229
|
+
version: '2.1'
|
188
230
|
type: :development
|
189
231
|
prerelease: false
|
190
232
|
version_requirements: !ruby/object:Gem::Requirement
|
191
233
|
requirements:
|
192
234
|
- - "~>"
|
193
235
|
- !ruby/object:Gem::Version
|
194
|
-
version: '1
|
236
|
+
version: '2.1'
|
195
237
|
- !ruby/object:Gem::Dependency
|
196
238
|
name: rake
|
197
239
|
requirement: !ruby/object:Gem::Requirement
|
198
240
|
requirements:
|
199
241
|
- - "~>"
|
200
242
|
- !ruby/object:Gem::Version
|
201
|
-
version: '
|
243
|
+
version: '13.0'
|
202
244
|
type: :development
|
203
245
|
prerelease: false
|
204
246
|
version_requirements: !ruby/object:Gem::Requirement
|
205
247
|
requirements:
|
206
248
|
- - "~>"
|
207
249
|
- !ruby/object:Gem::Version
|
208
|
-
version: '
|
250
|
+
version: '13.0'
|
209
251
|
- !ruby/object:Gem::Dependency
|
210
252
|
name: pry-byebug
|
211
253
|
requirement: !ruby/object:Gem::Requirement
|
212
254
|
requirements:
|
213
255
|
- - "~>"
|
214
256
|
- !ruby/object:Gem::Version
|
215
|
-
version: '3.
|
257
|
+
version: '3.9'
|
216
258
|
type: :development
|
217
259
|
prerelease: false
|
218
260
|
version_requirements: !ruby/object:Gem::Requirement
|
219
261
|
requirements:
|
220
262
|
- - "~>"
|
221
263
|
- !ruby/object:Gem::Version
|
222
|
-
version: '3.
|
264
|
+
version: '3.9'
|
223
265
|
- !ruby/object:Gem::Dependency
|
224
266
|
name: rspec
|
225
267
|
requirement: !ruby/object:Gem::Requirement
|
226
268
|
requirements:
|
227
269
|
- - "~>"
|
228
270
|
- !ruby/object:Gem::Version
|
229
|
-
version: '3.
|
271
|
+
version: '3.10'
|
230
272
|
type: :development
|
231
273
|
prerelease: false
|
232
274
|
version_requirements: !ruby/object:Gem::Requirement
|
233
275
|
requirements:
|
234
276
|
- - "~>"
|
235
277
|
- !ruby/object:Gem::Version
|
236
|
-
version: '3.
|
278
|
+
version: '3.10'
|
237
279
|
- !ruby/object:Gem::Dependency
|
238
280
|
name: fivemat
|
239
281
|
requirement: !ruby/object:Gem::Requirement
|
@@ -262,7 +304,7 @@ dependencies:
|
|
262
304
|
- - "~>"
|
263
305
|
- !ruby/object:Gem::Version
|
264
306
|
version: '0.4'
|
265
|
-
description:
|
307
|
+
description:
|
266
308
|
email:
|
267
309
|
- ryan@outstand.com
|
268
310
|
executables:
|
@@ -270,25 +312,31 @@ executables:
|
|
270
312
|
extensions: []
|
271
313
|
extra_rdoc_files: []
|
272
314
|
files:
|
315
|
+
- ".buildkite/pipeline.yml"
|
273
316
|
- ".dockerignore"
|
317
|
+
- ".gitattributes"
|
274
318
|
- ".gitignore"
|
275
319
|
- ".rspec"
|
320
|
+
- Deskfile
|
276
321
|
- Dockerfile
|
277
322
|
- Dockerfile.release
|
323
|
+
- Dockerfile.staging
|
278
324
|
- Gemfile
|
279
325
|
- LICENSE
|
280
326
|
- README.md
|
281
327
|
- Rakefile
|
282
|
-
-
|
328
|
+
- docker-compose.yml
|
283
329
|
- exe/shipitron
|
284
330
|
- lib/shipitron.rb
|
285
331
|
- lib/shipitron/cli.rb
|
332
|
+
- lib/shipitron/client.rb
|
286
333
|
- lib/shipitron/client/bootstrap_application.rb
|
287
334
|
- lib/shipitron/client/create_ecs_services.rb
|
288
335
|
- lib/shipitron/client/deploy_application.rb
|
289
336
|
- lib/shipitron/client/ensure_deploy_not_running.rb
|
290
337
|
- lib/shipitron/client/fetch_clusters.rb
|
291
338
|
- lib/shipitron/client/force_deploy.rb
|
339
|
+
- lib/shipitron/client/generate_deploy.rb
|
292
340
|
- lib/shipitron/client/load_application_config.rb
|
293
341
|
- lib/shipitron/client/load_templates.rb
|
294
342
|
- lib/shipitron/client/register_ecs_task_definitions.rb
|
@@ -299,10 +347,13 @@ files:
|
|
299
347
|
- lib/shipitron/ecs_client.rb
|
300
348
|
- lib/shipitron/ecs_task_def.rb
|
301
349
|
- lib/shipitron/fetch_bucket.rb
|
350
|
+
- lib/shipitron/find_docker_volume_name.rb
|
351
|
+
- lib/shipitron/git_info.rb
|
302
352
|
- lib/shipitron/logger.rb
|
303
353
|
- lib/shipitron/mustache_yaml_parser.rb
|
304
354
|
- lib/shipitron/parse_templates.rb
|
305
355
|
- lib/shipitron/post_build.rb
|
356
|
+
- lib/shipitron/s3_copy.rb
|
306
357
|
- lib/shipitron/server/deploy_application.rb
|
307
358
|
- lib/shipitron/server/docker/build_image.rb
|
308
359
|
- lib/shipitron/server/docker/configure.rb
|
@@ -312,6 +363,7 @@ files:
|
|
312
363
|
- lib/shipitron/server/ecs_task_defs/map_parsed_templates.rb
|
313
364
|
- lib/shipitron/server/ecs_task_defs/update_from_params.rb
|
314
365
|
- lib/shipitron/server/ecs_task_defs/update_in_place.rb
|
366
|
+
- lib/shipitron/server/fetch_deploy.rb
|
315
367
|
- lib/shipitron/server/git/clone_local_copy.rb
|
316
368
|
- lib/shipitron/server/git/configure.rb
|
317
369
|
- lib/shipitron/server/git/download_cache.rb
|
@@ -327,11 +379,13 @@ files:
|
|
327
379
|
- lib/shipitron/smash.rb
|
328
380
|
- lib/shipitron/version.rb
|
329
381
|
- scripts/docker-entrypoint.sh
|
382
|
+
- scripts/release-entrypoint.sh
|
330
383
|
- shipitron.gemspec
|
384
|
+
- test.yml
|
331
385
|
homepage: https://github.com/outstand/shipitron
|
332
386
|
licenses: []
|
333
387
|
metadata: {}
|
334
|
-
post_install_message:
|
388
|
+
post_install_message:
|
335
389
|
rdoc_options: []
|
336
390
|
require_paths:
|
337
391
|
- lib
|
@@ -346,9 +400,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
346
400
|
- !ruby/object:Gem::Version
|
347
401
|
version: '0'
|
348
402
|
requirements: []
|
349
|
-
|
350
|
-
|
351
|
-
signing_key:
|
403
|
+
rubygems_version: 3.1.6
|
404
|
+
signing_key:
|
352
405
|
specification_version: 4
|
353
406
|
summary: A deployment tool for use with Docker and ECS.
|
354
407
|
test_files: []
|
data/build_dev.sh
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
set -e -x
|
3
|
-
|
4
|
-
build_image=outstand/shipitron:dev
|
5
|
-
dockerfile=Dockerfile
|
6
|
-
bundler_data_dir=cache
|
7
|
-
|
8
|
-
tar_container=''
|
9
|
-
|
10
|
-
function cleanup {
|
11
|
-
if [ -n "$tar_container" ]; then
|
12
|
-
docker rm -fv ${tar_container}
|
13
|
-
fi
|
14
|
-
|
15
|
-
rm -f ${bundler_data_dir}/cidfile
|
16
|
-
}
|
17
|
-
|
18
|
-
trap cleanup EXIT
|
19
|
-
|
20
|
-
build_args=''
|
21
|
-
mkdir -p ${bundler_data_dir}
|
22
|
-
|
23
|
-
docker build -t ${build_image} -f ${dockerfile} ${build_args} .
|
24
|
-
|
25
|
-
docker run -t --cidfile=${bundler_data_dir}/cidfile -w /usr/local/bundle ${build_image} tar -zcf /tmp/bundler-data.tar.gz .
|
26
|
-
tar_container=$(cat ${bundler_data_dir}/cidfile)
|
27
|
-
docker cp ${tar_container}:/tmp/bundler-data.tar.gz ${bundler_data_dir}/bundler-data.tar.gz
|