mongo 2.0.0.rc → 2.0.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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -1
  4. data/README.md +1 -4
  5. data/lib/mongo/client.rb +1 -1
  6. data/lib/mongo/collection.rb +1 -1
  7. data/lib/mongo/collection/view.rb +1 -1
  8. data/lib/mongo/collection/view/writable.rb +26 -10
  9. data/lib/mongo/database.rb +1 -1
  10. data/lib/mongo/grid/file.rb +12 -0
  11. data/lib/mongo/grid/file/chunk.rb +1 -1
  12. data/lib/mongo/grid/file/metadata.rb +13 -0
  13. data/lib/mongo/operation/aggregate.rb +1 -1
  14. data/lib/mongo/operation/write.rb +1 -5
  15. data/lib/mongo/operation/write/bulk.rb +17 -0
  16. data/lib/mongo/operation/write/{bulk_delete.rb → bulk/bulk_delete.rb} +1 -1
  17. data/lib/mongo/operation/{bulk_delete → write/bulk/bulk_delete}/result.rb +3 -0
  18. data/lib/mongo/operation/write/{bulk_insert.rb → bulk/bulk_insert.rb} +1 -1
  19. data/lib/mongo/operation/{bulk_insert → write/bulk/bulk_insert}/result.rb +3 -0
  20. data/lib/mongo/operation/write/{bulk_mergable.rb → bulk/bulk_mergable.rb} +0 -0
  21. data/lib/mongo/operation/write/{bulk_update.rb → bulk/bulk_update.rb} +1 -1
  22. data/lib/mongo/operation/{bulk_update → write/bulk/bulk_update}/result.rb +8 -1
  23. data/lib/mongo/operation/write/{legacy_bulk_mergable.rb → bulk/legacy_bulk_mergable.rb} +0 -0
  24. data/lib/mongo/operation/write/delete.rb +2 -0
  25. data/lib/mongo/operation/write/delete/result.rb +40 -0
  26. data/lib/mongo/operation/write/insert.rb +2 -0
  27. data/lib/mongo/operation/write/insert/result.rb +32 -0
  28. data/lib/mongo/operation/write/update.rb +9 -4
  29. data/lib/mongo/operation/write/update/result.rb +160 -0
  30. data/lib/mongo/server/connectable.rb +11 -0
  31. data/lib/mongo/server/connection.rb +1 -0
  32. data/lib/mongo/server/connection_pool.rb +1 -1
  33. data/lib/mongo/server/connection_pool/queue.rb +1 -1
  34. data/lib/mongo/server/monitor.rb +16 -0
  35. data/lib/mongo/server/monitor/connection.rb +1 -0
  36. data/lib/mongo/socket/ssl.rb +30 -8
  37. data/lib/mongo/version.rb +1 -1
  38. data/lib/mongo/write_concern/acknowledged.rb +1 -1
  39. data/lib/mongo/write_concern/unacknowledged.rb +1 -1
  40. data/spec/certificates/ca.pem +17 -0
  41. data/spec/certificates/client.pem +101 -0
  42. data/spec/certificates/crl.pem +10 -0
  43. data/spec/certificates/crl_client_revoked.pem +12 -0
  44. data/spec/certificates/password_protected.pem +51 -0
  45. data/spec/certificates/server.pem +34 -0
  46. data/spec/mongo/collection/view/writable_spec.rb +175 -0
  47. data/spec/mongo/crud_spec.rb +42 -0
  48. data/spec/mongo/grid/file/metadata_spec.rb +23 -0
  49. data/spec/mongo/grid/file_spec.rb +34 -0
  50. data/spec/mongo/operation/write/delete_spec.rb +8 -0
  51. data/spec/mongo/operation/write/insert_spec.rb +21 -8
  52. data/spec/mongo/operation/write/update_spec.rb +52 -1
  53. data/spec/mongo/server/connection_spec.rb +33 -10
  54. data/spec/mongo/server/monitor_spec.rb +14 -0
  55. data/spec/spec_helper.rb +2 -17
  56. data/spec/support/crud.rb +203 -0
  57. data/spec/support/crud/read.rb +144 -0
  58. data/spec/support/crud/write.rb +214 -0
  59. data/spec/support/crud_tests/read/aggregate.yml +43 -0
  60. data/spec/support/crud_tests/read/count.yml +37 -0
  61. data/spec/support/crud_tests/read/distinct.yml +33 -0
  62. data/spec/support/crud_tests/read/find.yml +50 -0
  63. data/spec/support/crud_tests/write/deleteMany.yml +36 -0
  64. data/spec/support/crud_tests/write/deleteOne.yml +49 -0
  65. data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
  66. data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
  67. data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
  68. data/spec/support/crud_tests/write/insertMany.yml +24 -0
  69. data/spec/support/crud_tests/write/insertOne.yml +19 -0
  70. data/spec/support/crud_tests/write/replaceOne.yml +96 -0
  71. data/spec/support/crud_tests/write/updateMany.yml +83 -0
  72. data/spec/support/crud_tests/write/updateOne.yml +80 -0
  73. metadata +64 -20
  74. metadata.gz.sig +0 -0
  75. data/spec/mongo_orchestration_spec.rb +0 -70
  76. data/spec/support/mongo_orchestration.rb +0 -61
  77. data/spec/support/mongo_orchestration/requestable.rb +0 -109
  78. data/spec/support/mongo_orchestration/standalone.rb +0 -57
@@ -0,0 +1,160 @@
1
+ # Copyright (C) 2014-2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ module Operation
17
+ module Write
18
+ class Update
19
+
20
+ # Defines custom behaviour of results for an update.
21
+ #
22
+ # @since 2.0.0
23
+ class Result < Operation::Result
24
+
25
+ # The number of modified docs field in the result.
26
+ #
27
+ # @since 2.0.0
28
+ MODIFIED = 'nModified'.freeze
29
+
30
+ # The upserted docs field in the result.
31
+ #
32
+ # @since 2.0.0
33
+ UPSERTED = 'upserted'.freeze
34
+
35
+ # Get the number of documents matched.
36
+ #
37
+ # @example Get the matched count.
38
+ # result.matched_count
39
+ #
40
+ # @return [ Integer ] The matched count.
41
+ #
42
+ # @since 2.0.0
43
+ def matched_count
44
+ return 0 unless acknowledged?
45
+ if upsert?
46
+ 0
47
+ else
48
+ n
49
+ end
50
+ end
51
+
52
+ # Get the number of documents modified.
53
+ #
54
+ # @example Get the modified count.
55
+ # result.modified_count
56
+ #
57
+ # @return [ Integer ] The modified count.
58
+ #
59
+ # @since 2.0.0
60
+ def modified_count
61
+ return 0 unless acknowledged?
62
+ first[MODIFIED]
63
+ end
64
+
65
+ # The identifier of the inserted document if an upsert
66
+ # took place.
67
+ #
68
+ # @example Get the upserted document's identifier.
69
+ # result.upserted_id
70
+ #
71
+ # @return [ Object ] The upserted id.
72
+ #
73
+ # @since 2.0.0
74
+ def upserted_id
75
+ return nil unless upsert?
76
+ upsert?.first['_id']
77
+ end
78
+
79
+ private
80
+
81
+ def upsert?
82
+ first[UPSERTED]
83
+ end
84
+ end
85
+
86
+ # Defines custom behaviour of results for an update on server
87
+ # version <= 2.4.
88
+ #
89
+ # @since 2.0.0
90
+ class LegacyResult < Operation::Result
91
+
92
+ # Whether an existing document was updated.
93
+ #
94
+ # @since 2.0.0
95
+ UPDATED_EXISTING = 'updatedExisting'.freeze
96
+
97
+ # The upserted docs field in the result.
98
+ #
99
+ # @since 2.0.0
100
+ UPSERTED = 'upserted'.freeze
101
+
102
+ # Get the number of documents matched.
103
+ #
104
+ # @example Get the matched count.
105
+ # result.matched_count
106
+ #
107
+ # @return [ Integer ] The matched count.
108
+ #
109
+ # @since 2.0.0
110
+ def matched_count
111
+ return 0 unless acknowledged?
112
+ if upsert?
113
+ 0
114
+ else
115
+ n
116
+ end
117
+ end
118
+
119
+ # Get the number of documents modified.
120
+ #
121
+ # @example Get the modified count.
122
+ # result.modified_count
123
+ #
124
+ # @return [ Integer ] The modified count.
125
+ #
126
+ # @since 2.0.0
127
+ def modified_count
128
+ return 0 unless acknowledged?
129
+ return n if updated_existing?
130
+ return 0 if upsert?
131
+ n
132
+ end
133
+
134
+ # The identifier of the inserted document if an upsert
135
+ # took place.
136
+ #
137
+ # @example Get the upserted document's identifier.
138
+ # result.upserted_id
139
+ #
140
+ # @return [ Object ] The upserted id.
141
+ #
142
+ # @since 2.0.0
143
+ def upserted_id
144
+ first[UPSERTED] if upsert?
145
+ end
146
+
147
+ private
148
+
149
+ def upsert?
150
+ !updated_existing? && n == 1
151
+ end
152
+
153
+ def updated_existing?
154
+ first[UPDATED_EXISTING]
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
@@ -32,6 +32,9 @@ module Mongo
32
32
  # @return [ Hash ] options The passed in options.
33
33
  attr_reader :options
34
34
 
35
+ # @return [ Integer ] pid The process id when the connection was created.
36
+ attr_reader :pid
37
+
35
38
  # Determine if the connection is currently connected.
36
39
  #
37
40
  # @example Is the connection connected?
@@ -82,6 +85,7 @@ module Mongo
82
85
  attr_reader :socket, :ssl_options
83
86
 
84
87
  def ensure_connected
88
+ ensure_same_process!
85
89
  connect! if socket.nil? || !socket.alive?
86
90
  begin
87
91
  yield socket
@@ -91,6 +95,13 @@ module Mongo
91
95
  end
92
96
  end
93
97
 
98
+ def ensure_same_process!
99
+ if pid != Process.pid
100
+ disconnect!
101
+ @pid = Process.pid
102
+ end
103
+ end
104
+
94
105
  def read
95
106
  ensure_connected{ |socket| Protocol::Reply.deserialize(socket) }
96
107
  end
@@ -103,6 +103,7 @@ module Mongo
103
103
  @server = server
104
104
  @ssl_options = options.reject { |k, v| !k.to_s.start_with?('ssl') }
105
105
  @socket = nil
106
+ @pid = Process.pid
106
107
  setup_authentication!
107
108
  end
108
109
 
@@ -80,7 +80,7 @@ module Mongo
80
80
  #
81
81
  # @since 2.0.0
82
82
  def inspect
83
- "<Mongo::Server::ConnectionPool:0x#{object_id} queue=#{queue.inspect}>"
83
+ "#<Mongo::Server::ConnectionPool:0x#{object_id} queue=#{queue.inspect}>"
84
84
  end
85
85
 
86
86
  # Yield the block to a connection, while handling checkin/checkout logic.
@@ -110,7 +110,7 @@ module Mongo
110
110
  #
111
111
  # @since 2.0.0
112
112
  def inspect
113
- "<Mongo::Pool::Queue:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
113
+ "#<Mongo::Pool::Queue:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
114
114
  "wait_timeout=#{wait_timeout} current_size=#{queue.size}>"
115
115
  end
116
116
 
@@ -29,6 +29,12 @@ module Mongo
29
29
  # @since 2.0.0
30
30
  HEARTBEAT_FREQUENCY = 10.freeze
31
31
 
32
+ # The minimum time between forced server scans. Is
33
+ # minHeartbeatFrequencyMS in the SDAM spec.
34
+ #
35
+ # @since 2.0.0
36
+ MIN_SCAN_FREQUENCY = 0.5.freeze
37
+
32
38
  # The command used for determining server status.
33
39
  #
34
40
  # @since 2.0.0
@@ -66,6 +72,7 @@ module Mongo
66
72
  #
67
73
  # @since 2.0.0
68
74
  def scan!
75
+ throttle_scan_frequency!
69
76
  @description = inspector.run(description, *ismaster)
70
77
  end
71
78
 
@@ -155,6 +162,15 @@ module Mongo
155
162
  end
156
163
  end
157
164
  end
165
+
166
+ def throttle_scan_frequency!
167
+ if @last_scan
168
+ difference = (Time.now - @last_scan)
169
+ throttle_time = (MIN_SCAN_FREQUENCY - difference)
170
+ sleep(throttle_time) if throttle_time > 0
171
+ end
172
+ @last_scan = Time.now
173
+ end
158
174
  end
159
175
  end
160
176
  end
@@ -74,6 +74,7 @@ module Mongo
74
74
  @options = options.freeze
75
75
  @ssl_options = options.reject { |k, v| !k.to_s.start_with?('ssl') }
76
76
  @socket = nil
77
+ @pid = Process.pid
77
78
  end
78
79
 
79
80
  private
@@ -51,12 +51,11 @@ module Mongo
51
51
  # @since 2.0.0
52
52
  def connect!
53
53
  Timeout.timeout(timeout, Error::SocketTimeoutError) do
54
- socket.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
55
- socket.connect(::Socket.pack_sockaddr_in(port, host))
56
- ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, context)
57
- ssl_socket.sync_close = true
58
- ssl_socket.connect
59
- verify_certificate!(ssl_socket)
54
+ @tcp_socket.connect(::Socket.pack_sockaddr_in(port, host))
55
+ @socket = OpenSSL::SSL::SSLSocket.new(@tcp_socket, context)
56
+ @socket.sync_close = true
57
+ @socket.connect
58
+ verify_certificate!(@socket)
60
59
  self
61
60
  end
62
61
  end
@@ -76,7 +75,25 @@ module Mongo
76
75
  def initialize(host, port, timeout, family, options = {})
77
76
  @host, @port, @timeout, @options = host, port, timeout, options
78
77
  @context = create_context(options)
79
- super(family)
78
+ @family = family
79
+ @tcp_socket = ::Socket.new(family, SOCK_STREAM, 0)
80
+ @tcp_socket.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
81
+ encoded_timeout = [ timeout, 0 ].pack(TIMEOUT_PACK)
82
+ @tcp_socket.set_encoding(BSON::BINARY)
83
+ @tcp_socket.setsockopt(SOL_SOCKET, SO_RCVTIMEO, encoded_timeout)
84
+ @tcp_socket.setsockopt(SOL_SOCKET, SO_SNDTIMEO, encoded_timeout)
85
+ end
86
+
87
+ # Read a single byte from the socket.
88
+ #
89
+ # @example Read a single byte.
90
+ # socket.readbyte
91
+ #
92
+ # @return [ Object ] The read byte.
93
+ #
94
+ # @since 2.0.0
95
+ def readbyte
96
+ handle_errors { socket.read(1) }
80
97
  end
81
98
 
82
99
  private
@@ -87,7 +104,12 @@ module Mongo
87
104
  context.cert = OpenSSL::X509::Certificate.new(File.open(options[:ssl_cert]))
88
105
  end
89
106
  if options[:ssl_key]
90
- context.key = OpenSSL::PKey::RSA.new(File.open(options[:ssl_key]))
107
+ if options[:ssl_key_pass_phrase]
108
+ context.key = OpenSSL::PKey::RSA.new(File.open(options[:ssl_key]),
109
+ options[:ssl_key_pass_phrase])
110
+ else
111
+ context.key = OpenSSL::PKey::RSA.new(File.open(options[:ssl_key]))
112
+ end
91
113
  end
92
114
  if options[:ssl_verify] || options[:ssl_ca_cert]
93
115
  context.ca_file = options[:ssl_ca_cert]
@@ -17,5 +17,5 @@ module Mongo
17
17
  # The current version of the driver.
18
18
  #
19
19
  # @since 2.0.0
20
- VERSION = '2.0.0.rc'.freeze
20
+ VERSION = '2.0.0'.freeze
21
21
  end
@@ -45,7 +45,7 @@ module Mongo
45
45
  #
46
46
  # @since 2.0.0
47
47
  def inspect
48
- "<Mongo::WriteConcern::Acknowledged:0x#{object_id} options=#{options}>"
48
+ "#<Mongo::WriteConcern::Acknowledged:0x#{object_id} options=#{options}>"
49
49
  end
50
50
  end
51
51
  end
@@ -48,7 +48,7 @@ module Mongo
48
48
  #
49
49
  # @since 2.0.0
50
50
  def inspect
51
- "<Mongo::WriteConcern::Unacknowledged:0x#{object_id} options=#{options}>"
51
+ "#<Mongo::WriteConcern::Unacknowledged:0x#{object_id} options=#{options}>"
52
52
  end
53
53
  end
54
54
  end
@@ -0,0 +1,17 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIICnTCCAgYCCQD4+RCKzwZr/zANBgkqhkiG9w0BAQUFADCBkjELMAkGA1UEBhMC
3
+ VVMxETAPBgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4w
4
+ DAYDVQQKDAUxMEdlbjEPMA0GA1UECwwGS2VybmVsMRowGAYDVQQDDBFNeSBDZXJ0
5
+ IEF1dGhvcml0eTEbMBkGCSqGSIb3DQEJARYMcm9vdEBsYXphcnVzMB4XDTEzMTEz
6
+ MDAyMzU0OVoXDTIzMTEyODAyMzU0OVowgZIxCzAJBgNVBAYTAlVTMREwDwYDVQQI
7
+ DAhOZXcgWW9yazEWMBQGA1UEBwwNTmV3IFlvcmsgQ2l0eTEOMAwGA1UECgwFMTBH
8
+ ZW4xDzANBgNVBAsMBktlcm5lbDEaMBgGA1UEAwwRTXkgQ2VydCBBdXRob3JpdHkx
9
+ GzAZBgkqhkiG9w0BCQEWDHJvb3RAbGF6YXJ1czCBnzANBgkqhkiG9w0BAQEFAAOB
10
+ jQAwgYkCgYEA1xymeY+U/evUuQvxpun9moe4GopN80c1ptmaAHM/1Onwaq54Wt27
11
+ nl1wUVme3dh4DdWviYY7mJ333HVEnp/QhVcT4kQhICZqdgPKPdCseQW3H+8x6Gwz
12
+ hrNRBdz0NkSoFxDlIymfy2Q2xoQpbCGAg+EnRYUTKlHMXNpUDLFhGjcCAwEAATAN
13
+ BgkqhkiG9w0BAQUFAAOBgQDRQB3c/9osTexEzMPHyMGTzG5nGwy8Wv77GgW3BETM
14
+ hECoGqueXLa5ZgvealJrnMHNKdj6vrCGgBDzE0K0VdXc4dLtLmx3DRntDOAWKJdB
15
+ 2XPMvdC7Ec//Fwep/9emz0gDiJrTiEpL4p74+h+sp4Xy8cBokQ3Ss5S9NmnPXT7E
16
+ qQ==
17
+ -----END CERTIFICATE-----
@@ -0,0 +1,101 @@
1
+ Certificate:
2
+ Data:
3
+ Version: 3 (0x2)
4
+ Serial Number: 7 (0x7)
5
+ Signature Algorithm: sha1WithRSAEncryption
6
+ Issuer: C=US, ST=New York, L=New York City, O=10Gen, OU=Kernel, CN=My Cert Authority/emailAddress=root@lazarus
7
+ Validity
8
+ Not Before: Aug 23 14:55:32 2013 GMT
9
+ Not After : Jan 7 14:55:32 2041 GMT
10
+ Subject: C=US, ST=New York, L=New York City, O=10Gen, OU=kerneluser, CN=client
11
+ Subject Public Key Info:
12
+ Public Key Algorithm: rsaEncryption
13
+ Public-Key: (2048 bit)
14
+ Modulus:
15
+ 00:ba:16:42:d4:8b:3d:5e:8a:67:9e:a7:c0:cd:4a:
16
+ 9c:9c:fd:95:b9:83:bf:f4:cf:03:8c:2e:db:a9:c1:
17
+ 35:58:80:f6:e2:e9:87:28:84:e3:d0:9b:68:60:51:
18
+ 0e:42:84:d8:6f:e8:34:cc:18:97:79:d3:8d:d8:2f:
19
+ 23:11:25:6f:69:7a:38:bb:8c:b2:29:e9:91:be:79:
20
+ 8c:cc:1b:56:98:98:d3:83:2a:c5:f9:9c:86:0c:2c:
21
+ 24:0e:5c:46:3b:a9:95:44:6c:c5:e0:7c:9d:03:ae:
22
+ 0d:23:99:49:a4:48:dd:0e:35:a2:e5:b4:8b:86:bd:
23
+ c0:c8:ce:d5:ac:c4:36:f3:9e:5f:17:00:23:8d:53:
24
+ a1:43:1b:a3:61:96:36:80:4d:35:50:b5:8b:69:31:
25
+ 39:b4:63:8b:96:59:5c:d1:ea:92:eb:eb:fa:1b:35:
26
+ 64:44:b3:f6:f3:a6:9d:49:3a:59:e5:e1:c2:cb:98:
27
+ be:29:b3:22:dd:33:97:d7:50:4f:db:c2:58:64:18:
28
+ b5:8c:3c:6b:2d:21:f6:bd:8d:e5:d2:da:8d:79:fe:
29
+ a7:80:75:a8:15:b9:ee:79:7f:01:31:1d:e5:e7:15:
30
+ 76:53:65:f6:fe:f0:93:7d:20:3d:cc:ff:9b:ca:b2:
31
+ 50:2c:1b:3a:69:d5:e6:70:cf:ac:be:7e:5c:33:c4:
32
+ 6e:a7
33
+ Exponent: 65537 (0x10001)
34
+ X509v3 extensions:
35
+ X509v3 Basic Constraints:
36
+ CA:FALSE
37
+ Netscape Comment:
38
+ OpenSSL Generated Certificate
39
+ X509v3 Subject Key Identifier:
40
+ 4A:8B:EE:22:42:E6:F8:62:4C:86:38:8D:C5:78:95:98:C1:10:05:7C
41
+ X509v3 Authority Key Identifier:
42
+ keyid:07:41:19:3A:9F:7E:C5:B7:22:4E:B7:BC:D5:DF:E4:FC:09:B8:64:16
43
+
44
+ Signature Algorithm: sha1WithRSAEncryption
45
+ 13:13:a8:f0:de:78:c6:b1:e0:85:cc:27:e6:04:28:44:93:1d:
46
+ f1:ff:5e:81:69:33:1f:f3:76:e0:49:ca:d9:ad:aa:db:f5:a5:
47
+ f8:a6:50:bb:a1:a7:40:14:e4:2f:8d:b8:21:7f:35:04:60:db:
48
+ af:f0:9e:dd:a1:ca:0b:7f:03:2e:2f:19:1e:32:6e:1e:2d:87:
49
+ 68:e3:37:47:a8:5b:93:d1:88:41:73:da:88:21:59:27:d4:35:
50
+ 1c:6a:27:b5:c0:c6:17:ba:f3:87:c8:e1:f4:8f:43:12:bc:fa:
51
+ 8d:90:d5:86:83:df:51:a5:c9:e0:92:f0:66:d0:37:61:6f:85:
52
+ 24:18
53
+ -----BEGIN CERTIFICATE-----
54
+ MIIDdjCCAt+gAwIBAgIBBzANBgkqhkiG9w0BAQUFADCBkjELMAkGA1UEBhMCVVMx
55
+ ETAPBgNVBAgMCE5ldyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4wDAYD
56
+ VQQKDAUxMEdlbjEPMA0GA1UECwwGS2VybmVsMRowGAYDVQQDDBFNeSBDZXJ0IEF1
57
+ dGhvcml0eTEbMBkGCSqGSIb3DQEJARYMcm9vdEBsYXphcnVzMB4XDTEzMDgyMzE0
58
+ NTUzMloXDTQxMDEwNzE0NTUzMlowbjELMAkGA1UEBhMCVVMxETAPBgNVBAgMCE5l
59
+ dyBZb3JrMRYwFAYDVQQHDA1OZXcgWW9yayBDaXR5MQ4wDAYDVQQKDAUxMEdlbjET
60
+ MBEGA1UECwwKa2VybmVsdXNlcjEPMA0GA1UEAwwGY2xpZW50MIIBIjANBgkqhkiG
61
+ 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuhZC1Is9XopnnqfAzUqcnP2VuYO/9M8DjC7b
62
+ qcE1WID24umHKITj0JtoYFEOQoTYb+g0zBiXedON2C8jESVvaXo4u4yyKemRvnmM
63
+ zBtWmJjTgyrF+ZyGDCwkDlxGO6mVRGzF4HydA64NI5lJpEjdDjWi5bSLhr3AyM7V
64
+ rMQ2855fFwAjjVOhQxujYZY2gE01ULWLaTE5tGOLlllc0eqS6+v6GzVkRLP286ad
65
+ STpZ5eHCy5i+KbMi3TOX11BP28JYZBi1jDxrLSH2vY3l0tqNef6ngHWoFbnueX8B
66
+ MR3l5xV2U2X2/vCTfSA9zP+byrJQLBs6adXmcM+svn5cM8RupwIDAQABo3sweTAJ
67
+ BgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0
68
+ aWZpY2F0ZTAdBgNVHQ4EFgQUSovuIkLm+GJMhjiNxXiVmMEQBXwwHwYDVR0jBBgw
69
+ FoAUB0EZOp9+xbciTre81d/k/Am4ZBYwDQYJKoZIhvcNAQEFBQADgYEAExOo8N54
70
+ xrHghcwn5gQoRJMd8f9egWkzH/N24EnK2a2q2/Wl+KZQu6GnQBTkL424IX81BGDb
71
+ r/Ce3aHKC38DLi8ZHjJuHi2HaOM3R6hbk9GIQXPaiCFZJ9Q1HGontcDGF7rzh8jh
72
+ 9I9DErz6jZDVhoPfUaXJ4JLwZtA3YW+FJBg=
73
+ -----END CERTIFICATE-----
74
+ -----BEGIN PRIVATE KEY-----
75
+ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC6FkLUiz1eimee
76
+ p8DNSpyc/ZW5g7/0zwOMLtupwTVYgPbi6YcohOPQm2hgUQ5ChNhv6DTMGJd5043Y
77
+ LyMRJW9peji7jLIp6ZG+eYzMG1aYmNODKsX5nIYMLCQOXEY7qZVEbMXgfJ0Drg0j
78
+ mUmkSN0ONaLltIuGvcDIztWsxDbznl8XACONU6FDG6NhljaATTVQtYtpMTm0Y4uW
79
+ WVzR6pLr6/obNWREs/bzpp1JOlnl4cLLmL4psyLdM5fXUE/bwlhkGLWMPGstIfa9
80
+ jeXS2o15/qeAdagVue55fwExHeXnFXZTZfb+8JN9ID3M/5vKslAsGzpp1eZwz6y+
81
+ flwzxG6nAgMBAAECggEBALYw92urjAFVFxCiA8W7aEzYhtAkaztft4R3mD/C19z4
82
+ H0CZDeig+3+RuIactY5xDIu8WHz/EseHVlg0BmxSL5ugu4z8uq8IbNaFoVFw7r7m
83
+ 2ieRKFY0ZpXiXcbllynw5iEhMjeRKhWhQmH5Qb2kTTINV5j4xKa+f9Lblx7Y2Uh4
84
+ tsaOtlMwb98D2/KYJdTv5Nj1nyuSqRVhECsd00Cb6JUBGQBx8Ja0wFy9gEygq6kU
85
+ w3s1XNOSnYNEo4FaVZwp5KZyCyBENcKpNUq4nXt/7ncEfVYdJck0Li3wN4Jr2J9S
86
+ eHqRzh8QkHxc1Ro8ktcXaUSs9kFuwvVvb4rcGUpOMWkCgYEA9xxp8yDtFVgzMtc/
87
+ vS8xgM1Wj4SrgKKYhE2wS05BJh/41oFMzfH1FpZ1GCM983r4QgYWoT71XsBgiOMC
88
+ yN2p2IbV4V44bMGKJqaVMkB91CVCUWI6piaCQb/1CJTwaXE7zPim6dlUSxxBBnRn
89
+ LP50NTscRLFcCZELD3Yl7jR8XFUCgYEAwMfkNFmGtBKAwlHZ3Y3XOwPWg+jCll7s
90
+ 9nhv8TU2IB9pcCRGqyOT7k1YymvYkDT2Je4JUPWEBs4cW7yD61LrQ8w8+DrE9dGo
91
+ czzGPyjOAANSX0asG74UjkNIQThmyEOltVHIxYMaSqowjHRSPdA+R4Od9EdcDdfS
92
+ q5SfSVFxmwsCgYBtl1thqUOcCL7EGHQ7KdfxgJ+YDMWmyfWMD4xVCYKZLurD7xop
93
+ 59nDR7zslIygE/RQC7Uzk+FsQTNO4ibVAIGX9syaI5gwm3DyjURzwehMEq4ju8W4
94
+ 9DEmicRZJvysNrzHvasA4RKiMQihnTQ43yyYgvuZd3MTBxF5rPNLfll89QKBgQC9
95
+ SsmiOZIR+OUjaTmS2bbQBNm7Fm8TNcxZyzKn1wb5jb57VbNqUfnskVgxEqpIFyjn
96
+ X48YRqtH/1RLI5UpGXdXUBFB8Hr7oM1VsgQ7ejakPp7AXOWcLA2FDz3AhMAvvnTU
97
+ 0KRihHPpgqk/EOy8M2Ej2XHcrcEO+q+quLmbRXRWtwKBgHacQiwci/2J+v0e9i52
98
+ re/2AJHKP5MwNHFe1e01iNc5EEN0G+/Ut8XW19DWf6bsxqie0ChC+xN8TUst8alT
99
+ F+tXTsHHmt/lRcjTROjT5XVuoqjtU2Q0QeVeGLgvObso+fZy3ZNeQuSJjWukdMZ3
100
+ 57rGT6p0OuM8qbrTzpv3JMrm
101
+ -----END PRIVATE KEY-----