ruby_rabbitmq_janus 2.5.1 → 2.6.0.pre.226
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/bin/ruby_rabbitmq_janus +67 -0
- data/config/default.md +3 -0
- data/config/default.yml +6 -0
- data/lib/rrj/binary.rb +56 -0
- data/lib/rrj/errors/rabbit/base_event.rb +21 -0
- data/lib/rrj/errors/rabbit/listener/base.rb +29 -0
- data/lib/rrj/errors/rabbit/listener/from.rb +17 -0
- data/lib/rrj/errors/rabbit/listener/from_admin.rb +17 -0
- data/lib/rrj/errors/rabbit/listener/janus_instance.rb +17 -0
- data/lib/rrj/errors/rabbit/publisher/admin.rb +32 -0
- data/lib/rrj/errors/rabbit/publisher/base.rb +31 -0
- data/lib/rrj/errors/rabbit/publisher/exclusive.rb +33 -0
- data/lib/rrj/errors/rabbit/publisher/janus_instance.rb +23 -0
- data/lib/rrj/errors/rabbit/publisher/keepalive.rb +17 -0
- data/lib/rrj/errors/rabbit/publisher/non_exclusive.rb +33 -0
- data/lib/rrj/errors/rabbit/rabbit.rb +12 -6
- data/lib/rrj/info.rb +6 -5
- data/lib/rrj/init.rb +2 -2
- data/lib/rrj/janus/messages/message.rb +1 -1
- data/lib/rrj/janus/processus/event.rb +1 -1
- data/lib/rrj/janus/processus/keepalive/keepalive_thread.rb +3 -2
- data/lib/rrj/janus/responses/janus_instance.rb +28 -0
- data/lib/rrj/janus/responses/response.rb +1 -1
- data/lib/rrj/janus/transactions/admin.rb +1 -1
- data/lib/rrj/janus/transactions/handle.rb +1 -1
- data/lib/rrj/janus/transactions/transaction.rb +2 -2
- data/lib/rrj/models/concerns/janus_instance_callbacks.rb +9 -5
- data/lib/rrj/models/concerns/janus_instance_methods.rb +12 -0
- data/lib/rrj/rabbit/base_event.rb +47 -0
- data/lib/rrj/rabbit/connect.rb +12 -12
- data/lib/rrj/rabbit/{publish/listener.rb → listener/base.rb} +16 -18
- data/lib/rrj/rabbit/listener/from.rb +30 -0
- data/lib/rrj/rabbit/{publish/listener_admin.rb → listener/from_admin.rb} +6 -4
- data/lib/rrj/rabbit/listener/janus_instance.rb +36 -0
- data/lib/rrj/rabbit/{publish/publisher_admin.rb → publisher/admin.rb} +5 -10
- data/lib/rrj/rabbit/{publish/publisher.rb → publisher/base.rb} +10 -8
- data/lib/rrj/rabbit/{publish → publisher}/exclusive.rb +3 -3
- data/lib/rrj/rabbit/publisher/janus_instance.rb +27 -0
- data/lib/rrj/rabbit/{publish → publisher}/keepalive.rb +4 -2
- data/lib/rrj/rabbit/{publish → publisher}/non_exclusive.rb +3 -7
- data/lib/rrj/rabbit/rabbit.rb +1 -1
- data/lib/rrj/tools/gem/cluster.rb +0 -17
- data/lib/rrj/tools/gem/config.rb +9 -0
- data/lib/rrj/tools/gem/log.rb +3 -4
- data/lib/rrj/tools/gem/option.rb +2 -12
- data/lib/rrj/tools/replaces/admin.rb +4 -4
- data/lib/rrj/tools/replaces/handle.rb +6 -6
- data/lib/rrj/tools/replaces/replace.rb +6 -6
- data/lib/rrj/tools/replaces/session.rb +4 -4
- data/spec/factories/janus_instance.rb +1 -1
- data/spec/request/admin/request_allow_token_spec.rb +1 -0
- data/spec/request/admin/request_disallow_token_spec.rb +1 -0
- data/spec/request/admin/request_handle_info_spec.rb +1 -0
- data/spec/request/admin/request_list_handles_spec.rb +1 -0
- data/spec/request/admin/request_list_sessions_spec.rb +1 -0
- data/spec/request/admin/request_start_pcap_spec.rb +1 -0
- data/spec/request/admin/request_start_text2pcap_spec.rb +1 -0
- data/spec/request/admin/request_stop_pcap_spec.rb +1 -0
- data/spec/request/admin/request_stop_text2pcap_spec.rb +1 -0
- data/spec/request/base/request_attach_spec.rb +1 -1
- data/spec/request/base/request_create_spec.rb +2 -2
- data/spec/request/base/request_destroy_spec.rb +1 -1
- data/spec/request/base/request_detach_spec.rb +1 -1
- data/spec/request/base/request_info_spec.rb +2 -2
- data/spec/request/base/request_keepalive_spec.rb +1 -1
- data/spec/request/peer/request_offer_spec.rb +1 -1
- data/spec/request/peer/request_trickle_spec.rb +1 -1
- data/spec/request/peer/request_trickles_spec.rb +1 -1
- data/spec/rrj/{rrj_spec.rb → ruby_rabbitmq_janus_spec.rb} +21 -11
- data/spec/{thread/concurencies_spec.rb → ruby_rabbitmq_janus/janus/concurrencies/concurrency_spec.rb} +1 -1
- data/spec/{thread → ruby_rabbitmq_janus/janus/concurrencies}/keepalive_initializer_spec.rb +3 -2
- data/spec/{thread → ruby_rabbitmq_janus/janus/concurrencies}/keepalive_thread_spec.rb +3 -3
- data/spec/{thread → ruby_rabbitmq_janus/janus/concurrencies}/keepalive_timer_spec.rb +1 -1
- data/spec/{rrj/messages/messages_admin_spec.rb → ruby_rabbitmq_janus/janus/messages/admin_spec.rb} +1 -1
- data/spec/{rrj/messages/messages_message_spec.rb → ruby_rabbitmq_janus/janus/messages/message_spec.rb} +2 -1
- data/spec/{rrj/messages/messages_standard_spec.rb → ruby_rabbitmq_janus/janus/messages/standard_spec.rb} +1 -1
- data/spec/{rrj/responses/responses_admin_spec.rb → ruby_rabbitmq_janus/janus/responses/admin_spec.rb} +1 -1
- data/spec/{rrj/responses/responses_event_spec.rb → ruby_rabbitmq_janus/janus/responses/event_spec.rb} +3 -2
- data/spec/{rrj/responses/responses_response_spec.rb → ruby_rabbitmq_janus/janus/responses/response_spec.rb} +3 -3
- data/spec/{rrj/responses/responses_standard_spec.rb → ruby_rabbitmq_janus/janus/responses/standard_spec.rb} +4 -3
- data/spec/{rrj → ruby_rabbitmq_janus}/models/janus_instance_definition_spec.rb +2 -2
- data/spec/{rrj/models/janus_instance_transaction_spec.rb → ruby_rabbitmq_janus/models/janus_instance_spec.rb} +10 -9
- data/spec/{rrj → ruby_rabbitmq_janus}/rabbit/connect_spec.rb +1 -1
- data/spec/ruby_rabbitmq_janus/rabbit/listener/from_spec.rb +15 -0
- data/spec/{rrj → ruby_rabbitmq_janus}/rabbit/propertie_2_spec.rb +3 -3
- data/spec/{rrj → ruby_rabbitmq_janus}/rabbit/propertie_spec.rb +3 -3
- data/spec/ruby_rabbitmq_janus/rabbit/publisher/admin_spec.rb +12 -0
- data/spec/{rrj/rabbit/publish/base_publisher_spec.rb → ruby_rabbitmq_janus/rabbit/publisher/base_spec.rb} +3 -3
- data/spec/{rrj/rabbit/publish → ruby_rabbitmq_janus/rabbit/publisher}/exclusive_spec.rb +0 -0
- data/spec/{rrj/rabbit/publish → ruby_rabbitmq_janus/rabbit/publisher}/non_exclusive_spec.rb +0 -0
- data/spec/{rrj/tools/gem/rrj_cluster_spec.rb → ruby_rabbitmq_janus/tools/cluster_spec.rb} +1 -21
- data/spec/{rrj/tools/gem/rrj_config_spec.rb → ruby_rabbitmq_janus/tools/config_spec.rb} +26 -14
- data/spec/{rrj/tools/gem/rrj_log_spec.rb → ruby_rabbitmq_janus/tools/log_spec.rb} +10 -10
- data/spec/{rrj/tools/replace/replace_admin_spec.rb → ruby_rabbitmq_janus/tools/replaces/admin_spec.rb} +15 -15
- data/spec/{rrj/tools/replace/replace_handle_spec.rb → ruby_rabbitmq_janus/tools/replaces/handle_spec.rb} +14 -14
- data/spec/{rrj/tools/replace → ruby_rabbitmq_janus/tools/replaces}/replace_spec.rb +16 -17
- data/spec/{rrj/tools/replace/replace_session_spec.rb → ruby_rabbitmq_janus/tools/replaces/session_spec.rb} +14 -14
- data/spec/{rrj/tools/replace → ruby_rabbitmq_janus/tools}/type_spec.rb +19 -19
- data/spec/spec_helper.rb +1 -1
- data/spec/support/examples_request.rb +1 -1
- data/spec/support/type.rb +3 -3
- metadata +83 -59
- data/lib/rrj/errors/rabbit/publish/admin.rb +0 -30
- data/lib/rrj/errors/rabbit/publish/base_publisher.rb +0 -23
- data/lib/rrj/errors/rabbit/publish/exclusive.rb +0 -31
- data/lib/rrj/errors/rabbit/publish/listener.rb +0 -30
- data/lib/rrj/errors/rabbit/publish/non_exclusive.rb +0 -31
- data/lib/rrj/errors/rabbit/publish/publisher.rb +0 -38
- data/lib/rrj/rabbit/publish/base_publisher.rb +0 -50
- data/spec/rrj/rabbit/publish/admin_spec.rb +0 -12
- data/spec/rrj/rabbit/publish/listener_spec.rb +0 -15
- data/spec/rrj/rabbit/publish/publisher_spec.rb +0 -13
@@ -2,50 +2,60 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe
|
6
|
-
context '
|
5
|
+
describe RubyRabbitmqJanus, type: :config, name: :describe do
|
6
|
+
context 'with a version number' do
|
7
7
|
let(:data) { RubyRabbitmqJanus::VERSION }
|
8
|
+
|
8
9
|
it_behaves_like 'constant is', String
|
9
10
|
end
|
10
11
|
|
11
|
-
context '
|
12
|
+
context 'with a name' do
|
12
13
|
let(:data) { RubyRabbitmqJanus::GEM_NAME }
|
14
|
+
|
13
15
|
it_behaves_like 'constant is', String
|
14
16
|
end
|
15
17
|
|
16
|
-
context '
|
18
|
+
context 'with a author' do
|
17
19
|
let(:data) { RubyRabbitmqJanus::AUTHORS }
|
20
|
+
|
18
21
|
it_behaves_like 'constant is', Array
|
19
22
|
end
|
20
23
|
|
21
|
-
context '
|
24
|
+
context 'with a email' do
|
22
25
|
let(:data) { RubyRabbitmqJanus::EMAILS }
|
26
|
+
|
23
27
|
it_behaves_like 'constant is', Array
|
24
28
|
end
|
25
29
|
|
26
|
-
context '
|
30
|
+
context 'with a license' do
|
27
31
|
let(:data) { RubyRabbitmqJanus::LICENSE }
|
32
|
+
let(:licence) { '../../LICENSE' }
|
33
|
+
|
28
34
|
it_behaves_like 'constant is', String
|
29
|
-
it { expect(
|
35
|
+
it { expect(licence).to be_an_existing_file }
|
30
36
|
end
|
31
37
|
|
32
|
-
context '
|
38
|
+
context 'with a description' do
|
33
39
|
let(:data) { RubyRabbitmqJanus::DESCRIPTION }
|
40
|
+
|
34
41
|
it_behaves_like 'constant is', String
|
35
42
|
end
|
36
43
|
|
37
|
-
context '
|
44
|
+
context 'with a summary description' do
|
38
45
|
let(:data) { RubyRabbitmqJanus::SUMMARY }
|
46
|
+
|
39
47
|
it_behaves_like 'constant is', String
|
40
48
|
end
|
41
49
|
|
42
|
-
context '
|
50
|
+
context 'with a homepage' do
|
43
51
|
let(:data) { RubyRabbitmqJanus::HOMEPAGE }
|
52
|
+
|
44
53
|
it_behaves_like 'constant is', String
|
45
54
|
end
|
46
55
|
|
47
|
-
context '
|
56
|
+
context 'with a post install message' do
|
48
57
|
let(:data) { RubyRabbitmqJanus::POST_INSTALL }
|
58
|
+
|
49
59
|
it_behaves_like 'constant is', String
|
50
60
|
end
|
51
61
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe RubyRabbitmqJanus::Janus::Concurrencies::Concurrency, type: :thread, name: :concurrency do
|
6
|
-
let(:concurrency) {
|
6
|
+
let(:concurrency) { described_class.new }
|
7
7
|
|
8
8
|
it { expect(concurrency.send(:rabbit)).to be_a(RubyRabbitmqJanus::Rabbit::Connect) }
|
9
9
|
it { expect(concurrency.send(:lock)).to be_a(Mutex) }
|
@@ -2,9 +2,10 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe RubyRabbitmqJanus::Janus::Concurrencies::
|
5
|
+
describe RubyRabbitmqJanus::Janus::Concurrencies::KeepaliveInitializer, type: :thread, name: :keepalive_initializer do
|
6
6
|
let(:instance) { RubyRabbitmqJanus::Models::JanusInstance.find((ENV['MONGO'].match?('true') ? %w[1 2] : [1, 2]).sample) }
|
7
|
-
let(:concurrency) {
|
7
|
+
let(:concurrency) { described_class.new(instance) }
|
8
|
+
|
8
9
|
it { expect(concurrency.send(:rabbit)).to be_a(RubyRabbitmqJanus::Rabbit::Connect) }
|
9
10
|
it { expect(concurrency.send(:lock)).to be_a(Mutex) }
|
10
11
|
it { expect(concurrency.send(:condition)).to be_a(ConditionVariable) }
|
@@ -5,10 +5,10 @@ require 'spec_helper'
|
|
5
5
|
describe RubyRabbitmqJanus::Janus::Concurrencies::KeepaliveThread, type: :thread, name: :keepalive_thread do
|
6
6
|
let(:instance) { RubyRabbitmqJanus::Models::JanusInstance.find((ENV['MONGO'].match?('true') ? %w[1 2] : [1, 2]).sample) }
|
7
7
|
let(:rabbit) { RubyRabbitmqJanus::Janus::Concurrencies::Concurrency.new.send(:rabbit) }
|
8
|
-
let(:concurrency) {
|
8
|
+
let(:concurrency) { described_class.new(instance, rabbit) { nil } }
|
9
9
|
|
10
|
-
it { expect(concurrency.instance_variable_get(:@session)).to
|
11
|
-
it { expect(concurrency.instance_variable_get(:@publisher)).to
|
10
|
+
it { expect(concurrency.instance_variable_get(:@session)).to be(nil) }
|
11
|
+
it { expect(concurrency.instance_variable_get(:@publisher)).to be(nil) }
|
12
12
|
it { expect(concurrency.instance_variable_get(:@rabbit)).to be_a(RubyRabbitmqJanus::Rabbit::Connect) }
|
13
13
|
it { expect(concurrency.instance_variable_get(:@timer)).to be_a(RubyRabbitmqJanus::Janus::Concurrencies::KeepaliveTimer) }
|
14
14
|
it { expect(concurrency.instance_variable_get(:@message)).to be_a(RubyRabbitmqJanus::Janus::Concurrencies::KeepaliveMessage) }
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe RubyRabbitmqJanus::Janus::Concurrencies::KeepaliveTimer, type: :thread, name: :keepalive_timer do
|
6
|
-
let(:concurrency) {
|
6
|
+
let(:concurrency) { described_class.new }
|
7
7
|
|
8
8
|
it { expect(concurrency.send(:time_to_live)).to be_a(Integer) }
|
9
9
|
it { expect(concurrency.send(:time_to_die)).to be_a(Integer) }
|
data/spec/{rrj/messages/messages_admin_spec.rb → ruby_rabbitmq_janus/janus/messages/admin_spec.rb}
RENAMED
@@ -6,7 +6,7 @@ describe RubyRabbitmqJanus::Janus::Messages::Admin, type: :messages,
|
|
6
6
|
level: :admin,
|
7
7
|
name: :admin do
|
8
8
|
let(:template) { 'base::info' }
|
9
|
-
let(:msg_new) {
|
9
|
+
let(:msg_new) { described_class.new(template) }
|
10
10
|
|
11
11
|
describe '#options' do
|
12
12
|
let(:message) { msg_new.options }
|
@@ -5,8 +5,9 @@ require 'spec_helper'
|
|
5
5
|
describe RubyRabbitmqJanus::Janus::Messages::Message, type: :messages,
|
6
6
|
name: :message do
|
7
7
|
before { @gateway }
|
8
|
+
|
8
9
|
let(:template) { 'base::info' }
|
9
|
-
let(:msg_new) {
|
10
|
+
let(:msg_new) { described_class.new(template) }
|
10
11
|
|
11
12
|
describe '#to_json' do
|
12
13
|
let(:message) { msg_new.to_json }
|
@@ -5,7 +5,7 @@ require 'spec_helper'
|
|
5
5
|
describe RubyRabbitmqJanus::Janus::Messages::Standard, type: :messages,
|
6
6
|
name: :standard do
|
7
7
|
let(:template) { 'base::info' }
|
8
|
-
let(:msg_new) {
|
8
|
+
let(:msg_new) { described_class.new(template) }
|
9
9
|
|
10
10
|
describe '#options' do
|
11
11
|
let(:message) { msg_new.options }
|
@@ -13,11 +13,12 @@ describe RubyRabbitmqJanus::Janus::Responses::Event, type: :responses,
|
|
13
13
|
end
|
14
14
|
|
15
15
|
describe '#event' do
|
16
|
+
subject(:thread) { @event.join }
|
17
|
+
|
16
18
|
let(:type) { 'base::info' }
|
17
19
|
let(:response) { @response }
|
18
|
-
subject(:thread) { @event.join }
|
19
20
|
|
20
|
-
it '
|
21
|
+
it 'eqls {}' do
|
21
22
|
message
|
22
23
|
expect(@response.to_hash).to eql({})
|
23
24
|
end
|
@@ -11,19 +11,19 @@ describe RubyRabbitmqJanus::Janus::Responses::Response, type: :responses,
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
describe '#to_json' do
|
14
|
+
describe '#to_json', broken: true do
|
15
15
|
let(:response) { @response.to_json }
|
16
16
|
|
17
17
|
include_examples 'response is', String
|
18
18
|
end
|
19
19
|
|
20
|
-
describe '#to_hash' do
|
20
|
+
describe '#to_hash', broken: true do
|
21
21
|
let(:response) { @response.to_hash }
|
22
22
|
|
23
23
|
include_examples 'response is', Hash
|
24
24
|
end
|
25
25
|
|
26
|
-
describe '#to_nice_json' do
|
26
|
+
describe '#to_nice_json', broken: true do
|
27
27
|
let(:response) { @response.to_nice_json }
|
28
28
|
|
29
29
|
include_examples 'response is', String
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe RubyRabbitmqJanus::Janus::Responses::Standard, type: :responses,
|
6
|
+
broken: true,
|
6
7
|
name: :standard do
|
7
8
|
let(:message) do
|
8
9
|
@gateway.start_transaction do |transaction|
|
@@ -10,7 +11,7 @@ describe RubyRabbitmqJanus::Janus::Responses::Standard, type: :responses,
|
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
13
|
-
context 'just session' do
|
14
|
+
context 'when just session' do
|
14
15
|
describe '#session' do
|
15
16
|
let(:type) { 'base::create' }
|
16
17
|
let(:response) { @response.session }
|
@@ -26,8 +27,8 @@ describe RubyRabbitmqJanus::Janus::Responses::Standard, type: :responses,
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
29
|
-
context 'session and sender' do
|
30
|
-
before
|
30
|
+
context 'when session and sender' do
|
31
|
+
before do
|
31
32
|
@gateway.start_transaction do |transaction|
|
32
33
|
@response = transaction.publish_message('base::create')
|
33
34
|
end
|
@@ -4,7 +4,7 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe RubyRabbitmqJanus::Models::JanusInstance, type: :model,
|
6
6
|
name: :janus_instance do
|
7
|
-
let(:model) {
|
7
|
+
let(:model) { described_class }
|
8
8
|
let(:parameter_mongo) do
|
9
9
|
{
|
10
10
|
'id' => '_id',
|
@@ -23,7 +23,7 @@ describe RubyRabbitmqJanus::Models::JanusInstance, type: :model,
|
|
23
23
|
}
|
24
24
|
end
|
25
25
|
|
26
|
-
context 'Janus Instance model definition' do
|
26
|
+
context 'when Janus Instance model definition' do
|
27
27
|
if ENV['MONGO'].match?('true')
|
28
28
|
it { expect(model.attribute_names).to include('_id') }
|
29
29
|
it do
|
@@ -4,9 +4,10 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
describe RubyRabbitmqJanus::Models::JanusInstance, type: :model,
|
6
6
|
name: :janus_instance do
|
7
|
-
before {
|
7
|
+
before { described_class.delete_all }
|
8
|
+
|
8
9
|
after do
|
9
|
-
|
10
|
+
described_class.delete_all
|
10
11
|
create_janus_instances
|
11
12
|
end
|
12
13
|
|
@@ -19,13 +20,13 @@ describe RubyRabbitmqJanus::Models::JanusInstance, type: :model,
|
|
19
20
|
{ id: random_instance }
|
20
21
|
end
|
21
22
|
end
|
22
|
-
let(:model) {
|
23
|
+
let(:model) { described_class }
|
23
24
|
|
24
|
-
context 'Janus Instance simple transaction' do
|
25
|
+
context 'when Janus Instance simple transaction' do
|
25
26
|
it { expect(model.count).to eq(0) }
|
26
27
|
end
|
27
28
|
|
28
|
-
context 'many janus instances' do
|
29
|
+
context 'when many janus instances' do
|
29
30
|
before do
|
30
31
|
FactoryGirl.create_list(:janus_instance, 5, enable: false)
|
31
32
|
FactoryGirl.create(:janus_instance, janus_id)
|
@@ -39,17 +40,17 @@ describe RubyRabbitmqJanus::Models::JanusInstance, type: :model,
|
|
39
40
|
it { expect(model.find_by_instance(one.instance).session).to eq(one.session) }
|
40
41
|
end
|
41
42
|
|
42
|
-
context 'Janus Instance enable' do
|
43
|
+
context 'when Janus Instance enable' do
|
43
44
|
let(:janus) { FactoryGirl.create(:janus_instance, janus_id) }
|
44
45
|
|
45
46
|
it { expect(janus.valid?).to be_a(TrueClass) }
|
46
|
-
it { expect(janus.session).to
|
47
|
+
it { expect(janus.session).to be_nil }
|
47
48
|
it { expect(janus.enable).to be_a(TrueClass) }
|
48
49
|
it { expect(janus.enable).to eq(true) }
|
49
|
-
it { expect(janus.thread).to
|
50
|
+
it { expect(janus.thread).to be_nil }
|
50
51
|
end
|
51
52
|
|
52
|
-
context 'Janus Instance disable' do
|
53
|
+
context 'when Janus Instance disable' do
|
53
54
|
let(:janus) { FactoryGirl.create(:janus_instance, enable: false) }
|
54
55
|
|
55
56
|
it { expect(janus.valid?).to be_a(TrueClass) }
|