logstash-input-elasticsearch 4.10.0 → 4.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 84fb0092d51b303586c275c6cfaef3222391d7aabe910450a989291b691930c0
4
- data.tar.gz: 955e27896dff25ec6568685f91cc7e34252bc54fbb5182133db1e4dd273efffe
3
+ metadata.gz: 5e0b94cdf348e1d25d3007f0d98637e11fea82606ac8116962f999d8743cd0f3
4
+ data.tar.gz: 82f489d3d852073644e488e0ced799d676f33e2c496d2353cbad911e87311b21
5
5
  SHA512:
6
- metadata.gz: 2be653a935384617b32905f441060326f2b45eadcaacbf727d1ebe5c82711e3e9f0f3a038b9ca39aad6377e67bb5caf78c8b83a625d82aa8fca267b738dc9cab
7
- data.tar.gz: a19916b987c434dfeb396379fa9f552fd001901bc5b37ce60407e4b7df69f5bd3ff76d4122b2f71d27c5d37d983a1dd283dcdf3aa1693730e93c2875f2459a1a
6
+ metadata.gz: 9be021ff84622606a6e3959055e4180cad9976dece9a690d732c289186243de051c5493d2c513e665c4dbdc5cdfbd68a42dcea80b4bb2f182d44b9b807fd5a7d
7
+ data.tar.gz: 5344d73f5b88542f03d045f45a630eb36d031f09fa2a79cfd50db4b2703350f91191c500e4c86adc26cb04d5c4ec4594c13eb2e7581edbe41d8e94866e077026
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 4.11.0
2
+ - Feat: add user-agent header passed to the Elasticsearch HTTP connection [#158](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/158)
3
+
1
4
  ## 4.10.0
2
5
  - Feat: added ecs_compatibility + event_factory support [#149](https://github.com/logstash-plugins/logstash-input-elasticsearch/pull/149)
3
6
 
@@ -20,7 +20,17 @@ if es_client_version >= Gem::Version.new('7.2') && es_client_version < Gem::Vers
20
20
  def apply_headers(request_options, options)
21
21
  headers = (options && options[:headers]) || {}
22
22
  headers[CONTENT_TYPE_STR] = find_value(headers, CONTENT_TYPE_REGEX) || DEFAULT_CONTENT_TYPE
23
- headers[USER_AGENT_STR] = find_value(headers, USER_AGENT_REGEX) || user_agent_header
23
+
24
+ # this code is necessary to grab the correct user-agent header
25
+ # when this method is invoked with apply_headers(@request_options, options)
26
+ # from https://github.com/elastic/elasticsearch-ruby/blob/v7.14.0/elasticsearch-transport/lib/elasticsearch/transport/transport/http/manticore.rb#L113-L114
27
+ transport_user_agent = nil
28
+ if (options && options[:transport_options] && options[:transport_options][:headers])
29
+ transport_headers = options[:transport_options][:headers]
30
+ transport_user_agent = find_value(transport_headers, USER_AGENT_REGEX)
31
+ end
32
+
33
+ headers[USER_AGENT_STR] = transport_user_agent || find_value(headers, USER_AGENT_REGEX) || user_agent_header
24
34
  headers[ACCEPT_ENCODING] = GZIP if use_compression?
25
35
  (request_options[:headers] ||= {}).merge!(headers) # this line was changed
26
36
  end
@@ -222,6 +222,7 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
222
222
  transport_options = {:headers => {}}
223
223
  transport_options[:headers].merge!(setup_basic_auth(user, password))
224
224
  transport_options[:headers].merge!(setup_api_key(api_key))
225
+ transport_options[:headers].merge!({'user-agent' => prepare_user_agent()})
225
226
  transport_options[:request_timeout] = @request_timeout_seconds unless @request_timeout_seconds.nil?
226
227
  transport_options[:connect_timeout] = @connect_timeout_seconds unless @connect_timeout_seconds.nil?
227
228
  transport_options[:socket_timeout] = @socket_timeout_seconds unless @socket_timeout_seconds.nil?
@@ -407,6 +408,18 @@ class LogStash::Inputs::Elasticsearch < LogStash::Inputs::Base
407
408
  { 'Authorization' => "ApiKey #{token}" }
408
409
  end
409
410
 
411
+ def prepare_user_agent
412
+ os_name = java.lang.System.getProperty('os.name')
413
+ os_version = java.lang.System.getProperty('os.version')
414
+ os_arch = java.lang.System.getProperty('os.arch')
415
+ jvm_vendor = java.lang.System.getProperty('java.vendor')
416
+ jvm_version = java.lang.System.getProperty('java.version')
417
+
418
+ plugin_version = Gem.loaded_specs["logstash-input-elasticsearch"].version
419
+ # example: logstash/7.14.1 (OS=Linux-5.4.0-84-generic-amd64; JVM=AdoptOpenJDK-11.0.11) logstash-input-elasticsearch/4.10.0
420
+ "logstash/#{LOGSTASH_VERSION} (OS=#{os_name}-#{os_version}-#{os_arch}; JVM=#{jvm_vendor}-#{jvm_version}) logstash-#{@plugin_type}-#{config_name}/#{plugin_version}"
421
+ end
422
+
410
423
  def fill_user_password_from_cloud_auth
411
424
  return unless @cloud_auth
412
425
 
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-input-elasticsearch'
4
- s.version = '4.10.0'
4
+ s.version = '4.11.0'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Reads query results from an Elasticsearch cluster"
7
7
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -36,4 +36,6 @@ Gem::Specification.new do |s|
36
36
  s.add_development_dependency 'faraday', "~> 0.15.4"
37
37
  s.add_development_dependency 'logstash-devutils'
38
38
  s.add_development_dependency 'timecop'
39
+ s.add_development_dependency 'cabin', ['~> 0.6']
40
+ s.add_development_dependency 'webrick'
39
41
  end
@@ -7,6 +7,9 @@ require "timecop"
7
7
  require "stud/temporary"
8
8
  require "time"
9
9
  require "date"
10
+ require "cabin"
11
+ require "webrick"
12
+ require "uri"
10
13
 
11
14
  require 'logstash/plugin_mixins/ecs_compatibility_support/spec_helper'
12
15
 
@@ -690,6 +693,156 @@ describe LogStash::Inputs::Elasticsearch, :ecs_compatibility_support do
690
693
  end
691
694
  end
692
695
 
696
+ class StoppableServer
697
+
698
+ attr_reader :port
699
+
700
+ def initialize()
701
+ queue = Queue.new
702
+ @first_req_waiter = java.util.concurrent.CountDownLatch.new(1)
703
+ @first_request = nil
704
+
705
+ @t = java.lang.Thread.new(
706
+ proc do
707
+ begin
708
+ @server = WEBrick::HTTPServer.new :Port => 0, :DocumentRoot => ".",
709
+ :Logger => Cabin::Channel.get, # silence WEBrick logging
710
+ :StartCallback => Proc.new {
711
+ queue.push("started")
712
+ }
713
+ @port = @server.config[:Port]
714
+ @server.mount_proc '/' do |req, res|
715
+ res.body = '''
716
+ {
717
+ "name": "ce7ccfb438e8",
718
+ "cluster_name": "docker-cluster",
719
+ "cluster_uuid": "DyR1hN03QvuCWXRy3jtb0g",
720
+ "version": {
721
+ "number": "7.13.1",
722
+ "build_flavor": "default",
723
+ "build_type": "docker",
724
+ "build_hash": "9a7758028e4ea59bcab41c12004603c5a7dd84a9",
725
+ "build_date": "2021-05-28T17:40:59.346932922Z",
726
+ "build_snapshot": false,
727
+ "lucene_version": "8.8.2",
728
+ "minimum_wire_compatibility_version": "6.8.0",
729
+ "minimum_index_compatibility_version": "6.0.0-beta1"
730
+ },
731
+ "tagline": "You Know, for Search"
732
+ }
733
+ '''
734
+ res.status = 200
735
+ res['Content-Type'] = 'application/json'
736
+ @first_request = req
737
+ @first_req_waiter.countDown()
738
+ end
739
+
740
+ @server.mount_proc '/logstash_unit_test/_search' do |req, res|
741
+ res.body = '''
742
+ {
743
+ "took" : 1,
744
+ "timed_out" : false,
745
+ "_shards" : {
746
+ "total" : 1,
747
+ "successful" : 1,
748
+ "skipped" : 0,
749
+ "failed" : 0
750
+ },
751
+ "hits" : {
752
+ "total" : {
753
+ "value" : 10000,
754
+ "relation" : "gte"
755
+ },
756
+ "max_score" : 1.0,
757
+ "hits" : [
758
+ {
759
+ "_index" : "test_bulk_index_2",
760
+ "_type" : "_doc",
761
+ "_id" : "sHe6A3wBesqF7ydicQvG",
762
+ "_score" : 1.0,
763
+ "_source" : {
764
+ "@timestamp" : "2021-09-20T15:02:02.557Z",
765
+ "message" : "{\"name\": \"Andrea\"}",
766
+ "@version" : "1",
767
+ "host" : "kalispera",
768
+ "sequence" : 5
769
+ }
770
+ }
771
+ ]
772
+ }
773
+ }
774
+ '''
775
+ res.status = 200
776
+ res['Content-Type'] = 'application/json'
777
+ @first_request = req
778
+ @first_req_waiter.countDown()
779
+ end
780
+
781
+
782
+
783
+ @server.start
784
+ rescue => e
785
+ puts "Error in webserver thread #{e}"
786
+ # ignore
787
+ end
788
+ end
789
+ )
790
+ @t.daemon = true
791
+ @t.start
792
+ queue.pop # blocks until the server is up
793
+ end
794
+
795
+ def stop
796
+ @server.shutdown
797
+ end
798
+
799
+ def wait_receive_request
800
+ @first_req_waiter.await(2, java.util.concurrent.TimeUnit::SECONDS)
801
+ @first_request
802
+ end
803
+ end
804
+
805
+ describe "'user-agent' header" do
806
+ let!(:webserver) { StoppableServer.new } # webserver must be started before the call, so no lazy "let"
807
+
808
+ after :each do
809
+ webserver.stop
810
+ end
811
+
812
+ it "server should be started" do
813
+ require 'net/http'
814
+ response = nil
815
+ Net::HTTP.start('localhost', webserver.port) {|http|
816
+ response = http.request_get('/')
817
+ }
818
+ expect(response.code.to_i).to eq(200)
819
+ end
820
+
821
+ context "used by plugin" do
822
+ let(:config) do
823
+ {
824
+ "hosts" => ["localhost:#{webserver.port}"],
825
+ "query" => '{ "query": { "match": { "statuscode": 200 } }, "sort": [ "_doc" ] }',
826
+ "index" => "logstash_unit_test"
827
+ }
828
+ end
829
+ let(:plugin) { described_class.new(config) }
830
+ let(:event) { LogStash::Event.new({}) }
831
+
832
+ it "client should sent the expect user-agent" do
833
+ plugin.register
834
+
835
+ queue = []
836
+ plugin.run(queue)
837
+
838
+ request = webserver.wait_receive_request
839
+
840
+ expect(request.header['user-agent'].size).to eq(1)
841
+ expect(request.header['user-agent'][0]).to match(/logstash\/\d*\.\d*\.\d* \(OS=.*; JVM=.*\) logstash-input-elasticsearch\/\d*\.\d*\.\d*/)
842
+ end
843
+ end
844
+ end
845
+
693
846
  shared_examples'configurable timeout' do |config_name, manticore_transport_option|
694
847
  let(:config_value) { fail NotImplementedError }
695
848
  let(:config) { super().merge(config_name => config_value) }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-elasticsearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.10.0
4
+ version: 4.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-23 00:00:00.000000000 Z
11
+ date: 2021-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -20,8 +20,8 @@ dependencies:
20
20
  - !ruby/object:Gem::Version
21
21
  version: '2.99'
22
22
  name: logstash-core-plugin-api
23
- type: :runtime
24
23
  prerelease: false
24
+ type: :runtime
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - ">="
@@ -37,8 +37,8 @@ dependencies:
37
37
  - !ruby/object:Gem::Version
38
38
  version: '1.3'
39
39
  name: logstash-mixin-ecs_compatibility_support
40
- type: :runtime
41
40
  prerelease: false
41
+ type: :runtime
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
@@ -51,8 +51,8 @@ dependencies:
51
51
  - !ruby/object:Gem::Version
52
52
  version: '1.0'
53
53
  name: logstash-mixin-event_support
54
- type: :runtime
55
54
  prerelease: false
55
+ type: :runtime
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
@@ -65,8 +65,8 @@ dependencies:
65
65
  - !ruby/object:Gem::Version
66
66
  version: '1.0'
67
67
  name: logstash-mixin-validator_support
68
- type: :runtime
69
68
  prerelease: false
69
+ type: :runtime
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
@@ -79,8 +79,8 @@ dependencies:
79
79
  - !ruby/object:Gem::Version
80
80
  version: 5.0.5
81
81
  name: elasticsearch
82
- type: :runtime
83
82
  prerelease: false
83
+ type: :runtime
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - ">="
@@ -93,8 +93,8 @@ dependencies:
93
93
  - !ruby/object:Gem::Version
94
94
  version: '0'
95
95
  name: tzinfo
96
- type: :runtime
97
96
  prerelease: false
97
+ type: :runtime
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - ">="
@@ -107,8 +107,8 @@ dependencies:
107
107
  - !ruby/object:Gem::Version
108
108
  version: '0'
109
109
  name: tzinfo-data
110
- type: :runtime
111
110
  prerelease: false
111
+ type: :runtime
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - ">="
@@ -121,8 +121,8 @@ dependencies:
121
121
  - !ruby/object:Gem::Version
122
122
  version: '0'
123
123
  name: rufus-scheduler
124
- type: :runtime
125
124
  prerelease: false
125
+ type: :runtime
126
126
  version_requirements: !ruby/object:Gem::Requirement
127
127
  requirements:
128
128
  - - ">="
@@ -135,8 +135,8 @@ dependencies:
135
135
  - !ruby/object:Gem::Version
136
136
  version: 0.7.1
137
137
  name: manticore
138
- type: :runtime
139
138
  prerelease: false
139
+ type: :runtime
140
140
  version_requirements: !ruby/object:Gem::Requirement
141
141
  requirements:
142
142
  - - ">="
@@ -149,8 +149,8 @@ dependencies:
149
149
  - !ruby/object:Gem::Version
150
150
  version: '0'
151
151
  name: logstash-codec-plain
152
- type: :development
153
152
  prerelease: false
153
+ type: :development
154
154
  version_requirements: !ruby/object:Gem::Requirement
155
155
  requirements:
156
156
  - - ">="
@@ -163,8 +163,8 @@ dependencies:
163
163
  - !ruby/object:Gem::Version
164
164
  version: 0.15.4
165
165
  name: faraday
166
- type: :development
167
166
  prerelease: false
167
+ type: :development
168
168
  version_requirements: !ruby/object:Gem::Requirement
169
169
  requirements:
170
170
  - - "~>"
@@ -177,8 +177,8 @@ dependencies:
177
177
  - !ruby/object:Gem::Version
178
178
  version: '0'
179
179
  name: logstash-devutils
180
- type: :development
181
180
  prerelease: false
181
+ type: :development
182
182
  version_requirements: !ruby/object:Gem::Requirement
183
183
  requirements:
184
184
  - - ">="
@@ -191,8 +191,36 @@ dependencies:
191
191
  - !ruby/object:Gem::Version
192
192
  version: '0'
193
193
  name: timecop
194
+ prerelease: false
195
+ type: :development
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ - !ruby/object:Gem::Dependency
202
+ requirement: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - "~>"
205
+ - !ruby/object:Gem::Version
206
+ version: '0.6'
207
+ name: cabin
208
+ prerelease: false
194
209
  type: :development
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '0.6'
215
+ - !ruby/object:Gem::Dependency
216
+ requirement: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - ">="
219
+ - !ruby/object:Gem::Version
220
+ version: '0'
221
+ name: webrick
195
222
  prerelease: false
223
+ type: :development
196
224
  version_requirements: !ruby/object:Gem::Requirement
197
225
  requirements:
198
226
  - - ">="
@@ -220,8 +248,6 @@ files:
220
248
  - spec/es_helper.rb
221
249
  - spec/fixtures/test_certs/ca.crt
222
250
  - spec/fixtures/test_certs/ca.key
223
- - spec/fixtures/test_certs/client/ls.crt
224
- - spec/fixtures/test_certs/client/ls.key
225
251
  - spec/fixtures/test_certs/es.crt
226
252
  - spec/fixtures/test_certs/es.key
227
253
  - spec/inputs/elasticsearch_spec.rb
@@ -247,7 +273,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
247
273
  - !ruby/object:Gem::Version
248
274
  version: '0'
249
275
  requirements: []
250
- rubygems_version: 3.0.6
276
+ rubygems_version: 3.1.6
251
277
  signing_key:
252
278
  specification_version: 4
253
279
  summary: Reads query results from an Elasticsearch cluster
@@ -255,8 +281,6 @@ test_files:
255
281
  - spec/es_helper.rb
256
282
  - spec/fixtures/test_certs/ca.crt
257
283
  - spec/fixtures/test_certs/ca.key
258
- - spec/fixtures/test_certs/client/ls.crt
259
- - spec/fixtures/test_certs/client/ls.key
260
284
  - spec/fixtures/test_certs/es.crt
261
285
  - spec/fixtures/test_certs/es.key
262
286
  - spec/inputs/elasticsearch_spec.rb
@@ -1,20 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIDMTCCAhmgAwIBAgIUCJ5+zdYJIlL04EOwC0tqVbZYKQUwDQYJKoZIhvcNAQEL
3
- BQAwNDEyMDAGA1UEAxMpRWxhc3RpYyBDZXJ0aWZpY2F0ZSBUb29sIEF1dG9nZW5l
4
- cmF0ZWQgQ0EwHhcNMjEwODEyMDUxNTI3WhcNMjQwODExMDUxNTI3WjANMQswCQYD
5
- VQQDEwJsczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMFY71j9Proa
6
- x95bWoBQOcc0ncqVvQO+Tk/Do4ynoe64pOJEf3txh1viHbnzFUGf+NF5WW6trlZ2
7
- ErP81vy7Ds5J5ngXjjdzOOGsTs9+l7KkqPfUwXqGoldWFtr//9mkLvWpd8uPvVtO
8
- dRnpcjQSlHHEB/HaqxkyBAvHLv1Fi1jTgIgn32NEM2mlCJ3M8OVfO9pqlO/6gjjs
9
- Miow8zZqtczeuv0JPu7V5xPDrcX0xh0kZdpH4gSh9r314TwZXFCofNUbkZrPV+Q9
10
- XJs64NlBjJZkd5qwKeXujZRV4eVvAOTlp+4Nh4eDqXE323s5yiPuov0StvNrbh3d
11
- rcg+IM+RTdMCAwEAAaNiMGAwHQYDVR0OBBYEFGnXHJEJ+LGmQTqDNr50C8FE8pcF
12
- MB8GA1UdIwQYMBaAFMgkye5+2l+TE0I6RsXRHjGBwpBGMBMGA1UdEQQMMAqCCGxv
13
- Z3N0YXNoMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAI08C6IeweN3LrEq
14
- ZauDVoiE2IdA1/nN3sxl+wL2xfauv1nctxej9TYR3mNoWiacgbbfJkPMCSIYk2Vc
15
- G396yLiGC1V96FfonnKfr3tKd0BiijTu3u5pOTgNNf5n4TZaTHTYmuKPtWoXyuLR
16
- QbH3jdgq9aq/9bwK0E5FOmuv6LGatnKzLf56aHjzerSZCnRw7V/1J/Yj3cy6TB1l
17
- 9Lc7IAk4dGyrgwfKCuZOSzAtCWpOA/FfqCqMSuW6lrZ1zAXnk6VI3RkmBCuLE6kj
18
- aAjwORJHyiwBsMQbaYcQaXXjhguS+iHrnWdR0DFs9gHJSTuf6EoOeygdtMDutb2O
19
- 4xfHWG8=
20
- -----END CERTIFICATE-----
@@ -1,27 +0,0 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIIEpAIBAAKCAQEAwVjvWP0+uhrH3ltagFA5xzSdypW9A75OT8OjjKeh7rik4kR/
3
- e3GHW+IdufMVQZ/40XlZbq2uVnYSs/zW/LsOzknmeBeON3M44axOz36XsqSo99TB
4
- eoaiV1YW2v//2aQu9al3y4+9W051GelyNBKUccQH8dqrGTIEC8cu/UWLWNOAiCff
5
- Y0QzaaUInczw5V872mqU7/qCOOwyKjDzNmq1zN66/Qk+7tXnE8OtxfTGHSRl2kfi
6
- BKH2vfXhPBlcUKh81RuRms9X5D1cmzrg2UGMlmR3mrAp5e6NlFXh5W8A5OWn7g2H
7
- h4OpcTfbeznKI+6i/RK282tuHd2tyD4gz5FN0wIDAQABAoIBAGLHVvC14PgfeoEl
8
- VuU7F2moffzj5z8kWMnzf3j6o4ZcmxBmQmMEq0zMBrfbcr6mRe5u+rvKy8isZf3C
9
- bOuNfZDyvGYaUrQNj7/r0g+78zB3Y0PKVFaOth28g8y7ATFl6f/j5qn+85TUTotA
10
- cvIbk+9TYWO0fblPjjWeO2l1wC1ObV0pFrXVzthFTQk0oxl3Gyq54P5rPp7QPOdM
11
- jB0lSAhvkEEA7nIZ0dF1zm3RuByahSQC45kYEp5TCC8SDwO3WCJ32Q/dhPw0y9Go
12
- gbIEY9QBFc8Rn3HDYGTSRPVVDM3HctDqzCihWOgFQlv718yCAZYq43fdOcy+6BY/
13
- UT3xRhECgYEA5wWcYD8bY5x0fk2ubxKJTE4Fm2HvUrexvLX00yF3sX9XqrsiBBC4
14
- 14mB2yFEKQL+M/ZqLNV9IfJhfRmBffoRvf9lAuHhUrw4wGijERoO9xkmS3lGvzw+
15
- hqLIMnd986wyWC8FdU+dStDg8PC97xK4bg0tKYo9jmKf3kb0Ov2UWQ0CgYEA1kCK
16
- w30P3ZgYakXUjbwv3KoRXIVm6cIqgvm8iPh7B0GeTUCIgGBSNzJ8LVts/m6V7xtU
17
- RJ8RKw2gqqUTiFqrRKefr0APFv0YeVgZ7zK2EGLrL2rFWNZZQqA97Mh/5CwFh+zs
18
- 1/IYuqRUVDaLq0sAPcZA5KEoO91eChBVK/RAyl8CgYAqgVPGOZY2e6DLZEuF0ClG
19
- yswpTJmV5IplKC1Fc1DsbXuZxBh8Gv+HWJt1z+cUjKJsuRfL6/O7/TaGp9y1av88
20
- r/LL1vd4G31tmVL3YI4EVLJBDK1Bnjn615RyBJ496R7SLsSYUu+jxk68xe6MQCuC
21
- xBXdILw2qFq1sORavjE/OQKBgQCJlwNGDX9t2Cn9vYCF0Q+Pjyv9FbKEdevlFsor
22
- 0B76BvrJM6M1hiXmSqaSXj89mfjxh8RzGQ/mbSb7z20eyNNqEJes7N+D7N+Vta1Z
23
- /mALX+sXFWNM7MJ/1fZOpGf1OQwIQW/MMi4NVlDNkAXb6BtskG/GI3R6FWw53ElG
24
- I+Kj0wKBgQDUCfiYYSA9wYug53uvE0LirZwMQjWTbqxMO/S3H0Be8rf+BLo+YY5X
25
- fF6L/NaKxNZzs2Uu6+xYLXhSMimiv8412t7qnjK5DLwTZfnj7EuNxd44cZ4cXDPx
26
- JtD9GgPJ5V3js1gA2usPnKLYPw5Pp3ayZn1q4Tg9A5cextKnyOV/Fg==
27
- -----END RSA PRIVATE KEY-----