tg-redbird 0.12.0 → 1.2.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 (50) hide show
  1. package/README.md +23 -16
  2. package/lib/docker.js +22 -18
  3. package/lib/etcd-backend.js +32 -35
  4. package/lib/letsencrypt.js +41 -38
  5. package/lib/proxy.js +197 -238
  6. package/lib/redis-backend.js +84 -79
  7. package/package.json +17 -4
  8. package/.dockerignore +0 -1
  9. package/.eslintrc +0 -22
  10. package/.travis.yml +0 -21
  11. package/.vscode/launch.json +0 -30
  12. package/Dockerfile +0 -6
  13. package/gulpfile.js +0 -36
  14. package/hl-tests/64/proxy.js +0 -52
  15. package/hl-tests/letsencrypt/a.js +0 -36
  16. package/hl-tests/letsencrypt/certs/accounts/acme-staging.api.letsencrypt.org/directory/367e0270a5d31ab031561f9f284ca350/meta.json +0 -1
  17. package/hl-tests/letsencrypt/certs/accounts/acme-staging.api.letsencrypt.org/directory/367e0270a5d31ab031561f9f284ca350/private_key.json +0 -1
  18. package/hl-tests/letsencrypt/certs/accounts/acme-staging.api.letsencrypt.org/directory/367e0270a5d31ab031561f9f284ca350/regr.json +0 -1
  19. package/hl-tests/letsencrypt/certs/accounts/acme-v01.api.letsencrypt.org/directory/49881ab35d6ac7bb51f05ca3a220fbac/meta.json +0 -1
  20. package/hl-tests/letsencrypt/certs/accounts/acme-v01.api.letsencrypt.org/directory/49881ab35d6ac7bb51f05ca3a220fbac/private_key.json +0 -1
  21. package/hl-tests/letsencrypt/certs/accounts/acme-v01.api.letsencrypt.org/directory/49881ab35d6ac7bb51f05ca3a220fbac/regr.json +0 -1
  22. package/hl-tests/letsencrypt/certs/api/privkey.pem +0 -27
  23. package/hl-tests/letsencrypt/certs/api.com/privkey.pem +0 -27
  24. package/hl-tests/letsencrypt/certs/archive/caturra.exactbytes.com/cert0.pem +0 -29
  25. package/hl-tests/letsencrypt/certs/archive/caturra.exactbytes.com/chain0.pem +0 -27
  26. package/hl-tests/letsencrypt/certs/archive/caturra.exactbytes.com/fullchain0.pem +0 -56
  27. package/hl-tests/letsencrypt/certs/archive/caturra.exactbytes.com/privkey0.pem +0 -27
  28. package/hl-tests/letsencrypt/certs/caturra.exactbytes.com/cert.pem +0 -29
  29. package/hl-tests/letsencrypt/certs/caturra.exactbytes.com/chain.pem +0 -27
  30. package/hl-tests/letsencrypt/certs/caturra.exactbytes.com/fullchain.pem +0 -56
  31. package/hl-tests/letsencrypt/certs/caturra.exactbytes.com/privkey.pem +0 -27
  32. package/hl-tests/letsencrypt/certs/caturra.exactbytes.com/privkey.pem.bak +0 -27
  33. package/hl-tests/letsencrypt/certs/dash/.well-known/acme-challenge/abc +0 -1
  34. package/hl-tests/letsencrypt/certs/dash/privkey.pem +0 -27
  35. package/hl-tests/letsencrypt/certs/dash.com/privkey.pem +0 -27
  36. package/hl-tests/letsencrypt/certs/dash_/privkey.pem +0 -27
  37. package/hl-tests/letsencrypt/certs/dev-cert.pem +0 -17
  38. package/hl-tests/letsencrypt/certs/dev-csr.pem +0 -13
  39. package/hl-tests/letsencrypt/certs/dev-key.pem +0 -15
  40. package/hl-tests/letsencrypt/certs/example.com/privkey.pem +0 -27
  41. package/hl-tests/letsencrypt/certs/localhost/privkey.pem +0 -27
  42. package/hl-tests/letsencrypt/certs/renewal/caturra.exactbytes.com.conf +0 -67
  43. package/hl-tests/letsencrypt/certs/renewal/caturra.exactbytes.com.conf.bak +0 -68
  44. package/hl-tests/letsencrypt/proxy.js +0 -73
  45. package/hl-tests/paths.js +0 -19
  46. package/package-lock.json +0 -3269
  47. package/test/test_custom_resolver.js +0 -276
  48. package/test/test_hostheader.js +0 -141
  49. package/test/test_pathnames.js +0 -75
  50. package/test/test_register.js +0 -493
@@ -1,4 +1,4 @@
1
- "use strict";
1
+ 'use strict';
2
2
 
3
3
  var redis = require('redis');
4
4
  var Promise = require('bluebird');
@@ -16,94 +16,99 @@ Promise.promisifyAll(redis);
16
16
  opts: {}
17
17
  }
18
18
  */
19
- function RedisBackend(port, hostname, opts)
20
- {
21
- if(!(this instanceof RedisBackend)){
22
- return new RedisBackend(port, hostname, opts);
23
- }
19
+ function RedisBackend(port, hostname, opts) {
20
+ if (!(this instanceof RedisBackend)) {
21
+ return new RedisBackend(port, hostname, opts);
22
+ }
24
23
 
25
- opts = opts || {};
26
- port = port || 6379;
27
- hostname = hostname || 'localhost';
24
+ opts = opts || {};
25
+ port = port || 6379;
26
+ hostname = hostname || 'localhost';
28
27
 
29
- this.redis = redis.createClient(port, hostname, opts);
30
- this.publish = redis.createClient(port, hostname, opts);
28
+ this.redis = redis.createClient(port, hostname, opts);
29
+ this.publish = redis.createClient(port, hostname, opts);
31
30
 
32
- this.prefix = opts.prefix + '';
31
+ this.prefix = opts.prefix + '';
33
32
 
34
- this.baseKey = baseKey(this.prefix);
33
+ this.baseKey = baseKey(this.prefix);
35
34
  }
36
35
 
37
36
  /**
38
37
  Returns a Promise that resolves to an array with all the
39
38
  registered services and removes the expired ones.
40
39
  */
41
- RedisBackend.prototype.getServices = function(){
42
- var _this = this;
43
- var redis = this.redis;
44
- var baseKey = this.baseKey;
45
-
46
- //
47
- // Get all members in the service set.
48
- //
49
- return redis.smembersAsync(baseKey + 'ids').then(function(serviceIds){
50
- return Promise.all(_.map(serviceIds, function(id){
51
- return _this.getService(id);
52
- }));
53
- }).then(function(services){
54
- // Clean expired services
55
- return _.compact(services);
56
- });
57
- }
58
-
59
- RedisBackend.prototype.getService = function(id){
60
- var redis = this.redis;
61
- //
62
- // Get service hash
63
- //
64
- return redis.hgetallAsync(this.baseKey + id).then(function(service){
65
- if(service){
66
- return service;
67
- }else{
68
- //
69
- // Service has expired, we must delete it from the service set.
70
- //
71
- return redis.sremAsync(id);
72
- }
73
- });
74
- }
75
-
76
- RedisBackend.prototype.register = function(service){
77
- var redis = this.redis;
78
- var publish = this.publish;
79
- var baseKey = this.baseKey;
80
-
81
- //
82
- // Get unique service ID.
83
- //
84
- return redis.incrAsync(baseKey + 'counter').then(function(id){
85
- // Store it
86
- redis.hset(baseKey + id, service).then(function(){
87
- return id;
88
- })
89
- }).then(function(id){
90
- //
91
- // // Publish a meesage so that the proxy can react faster to a new registration.
92
- //
93
- return publish.publishAsync(baseKey + 'registered', id).then(function(){
94
- return id;
95
- })
96
- });
97
- }
98
-
99
- RedisBackend.prototype.ping = function(id){
100
- return this.redis.pexpireAsync(id, 5000);
101
- }
102
-
103
- function baseKey(prefix){
104
- return 'redbird-' + prefix + '-services-';
40
+ RedisBackend.prototype.getServices = function () {
41
+ var _this = this;
42
+ var redis = this.redis;
43
+ var baseKey = this.baseKey;
44
+
45
+ //
46
+ // Get all members in the service set.
47
+ //
48
+ return redis
49
+ .smembersAsync(baseKey + 'ids')
50
+ .then(function (serviceIds) {
51
+ return Promise.all(
52
+ _.map(serviceIds, function (id) {
53
+ return _this.getService(id);
54
+ })
55
+ );
56
+ })
57
+ .then(function (services) {
58
+ // Clean expired services
59
+ return _.compact(services);
60
+ });
61
+ };
62
+
63
+ RedisBackend.prototype.getService = function (id) {
64
+ var redis = this.redis;
65
+ //
66
+ // Get service hash
67
+ //
68
+ return redis.hgetallAsync(this.baseKey + id).then(function (service) {
69
+ if (service) {
70
+ return service;
71
+ } else {
72
+ //
73
+ // Service has expired, we must delete it from the service set.
74
+ //
75
+ return redis.sremAsync(id);
76
+ }
77
+ });
78
+ };
79
+
80
+ RedisBackend.prototype.register = function (service) {
81
+ var redis = this.redis;
82
+ var publish = this.publish;
83
+ var baseKey = this.baseKey;
84
+
85
+ //
86
+ // Get unique service ID.
87
+ //
88
+ return redis
89
+ .incrAsync(baseKey + 'counter')
90
+ .then(function (id) {
91
+ // Store it
92
+ redis.hset(baseKey + id, service).then(function () {
93
+ return id;
94
+ });
95
+ })
96
+ .then(function (id) {
97
+ //
98
+ // // Publish a meesage so that the proxy can react faster to a new registration.
99
+ //
100
+ return publish.publishAsync(baseKey + 'registered', id).then(function () {
101
+ return id;
102
+ });
103
+ });
104
+ };
105
+
106
+ RedisBackend.prototype.ping = function (id) {
107
+ return this.redis.pexpireAsync(id, 5000);
108
+ };
109
+
110
+ function baseKey(prefix) {
111
+ return 'redbird-' + prefix + '-services-';
105
112
  }
106
113
 
107
114
  module.exports = RedisBackend;
108
-
109
-
package/package.json CHANGED
@@ -1,15 +1,20 @@
1
1
  {
2
2
  "name": "tg-redbird",
3
- "version": "0.12.0",
3
+ "version": "1.2.0",
4
4
  "description": "A reverse proxy with support for dynamic tables",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
- "test": "mocha test/* --reporter spec"
7
+ "test": "mocha test/* --reporter spec",
8
+ "format": "prettier --write *.js \"{samples,lib,test,hl-tests}/**/*.js\""
8
9
  },
9
10
  "repository": {
10
11
  "type": "git",
11
12
  "url": "git://github.com/TeselaGen/redbird.git"
12
13
  },
14
+ "files": [
15
+ "index.js",
16
+ "lib"
17
+ ],
13
18
  "keywords": [
14
19
  "proxy",
15
20
  "reverse",
@@ -23,7 +28,7 @@
23
28
  },
24
29
  "homepage": "https://github.com/TeselaGen/redbird",
25
30
  "dependencies": {
26
- "bluebird": "^3.7.2",
31
+ "bluebird": "^2.11.0 || ^3.7.2",
27
32
  "dolphin": "*",
28
33
  "greenlock": "^2.8.8",
29
34
  "http-proxy": "^1.18.0",
@@ -40,8 +45,16 @@
40
45
  },
41
46
  "devDependencies": {
42
47
  "chai": "^1.9.1",
48
+ "electrode-server": "^2.2.2",
43
49
  "gulp": "^3.8.11",
44
50
  "gulp-eslint": "^0.9.0",
45
- "mocha": "^2.5.3"
51
+ "mocha": "^2.5.3",
52
+ "needle": "^2.2.4",
53
+ "prettier": "^2.0.1",
54
+ "run-verify": "^1.2.2"
55
+ },
56
+ "prettier": {
57
+ "printWidth": 100,
58
+ "singleQuote": true
46
59
  }
47
60
  }
package/.dockerignore DELETED
@@ -1 +0,0 @@
1
- node_modules
package/.eslintrc DELETED
@@ -1,22 +0,0 @@
1
- rules:
2
- space-before-blocks: [2, "never"]
3
- space-after-keywords: [2, "never"]
4
- new-cap: 0
5
- no-underscore-dangle: 0
6
- indent: [2, 2]
7
- brace-style: [2, "1tbs"]
8
- comma-style: [2, "last"]
9
- default-case: 2
10
- func-style: [2, "declaration"]
11
- guard-for-in: 2
12
- no-floating-decimal: 2
13
- no-nested-ternary: 2
14
- no-undefined: 2
15
- radix: 2
16
- space-after-function-name: [2, "never"]
17
- space-after-keywords: [2, "always"]
18
- space-before-blocks: [2, "never"]
19
- spaced-line-comment: [2, "always", { exceptions: ["-"]}]
20
- valid-jsdoc: [2, { prefer: { "return": "returns"}}]
21
- wrap-iife: 2
22
- quotes: [2, "single"]
package/.travis.yml DELETED
@@ -1,21 +0,0 @@
1
- language: node_js
2
-
3
- node_js:
4
- - 'node'
5
- - '10'
6
- - '9'
7
- - '8'
8
- - '7'
9
- - '6'
10
-
11
- before_install:
12
- - npm cache clean --force
13
-
14
- install:
15
- - npm install --update-binary --no-shrinkwrap
16
-
17
- script:
18
- - npm test
19
-
20
- cache:
21
- npm: false
@@ -1,30 +0,0 @@
1
- {
2
- "version": "0.2.0",
3
- "configurations": [
4
- {
5
- "name": "Launch",
6
- "type": "node",
7
- "request": "launch",
8
- "program": "hl-tests/paths.js",
9
- "stopOnEntry": false,
10
- "args": [],
11
- "cwd": ".",
12
- "runtimeExecutable": null,
13
- "runtimeArgs": [
14
- "--nolazy"
15
- ],
16
- "env": {
17
- "NODE_ENV": "development"
18
- },
19
- "externalConsole": false,
20
- "sourceMaps": false,
21
- "outDir": null
22
- },
23
- {
24
- "name": "Attach",
25
- "type": "node",
26
- "request": "attach",
27
- "port": 5858
28
- }
29
- ]
30
- }
package/Dockerfile DELETED
@@ -1,6 +0,0 @@
1
- FROM node:4.5
2
-
3
- ADD . /proxy
4
- RUN cd /proxy; npm install --production
5
- EXPOSE 8080
6
-
package/gulpfile.js DELETED
@@ -1,36 +0,0 @@
1
- /*eslint-env node */
2
- 'use strict';
3
-
4
- var gulp = require('gulp');
5
- var eslint = require('gulp-eslint');
6
-
7
- gulp.task('lint', function (){
8
- // Note: To have the process exit with an error code (1) on
9
- // lint error, return the stream and pipe to failOnError last.
10
- return gulp.src([
11
- './**/*.js',
12
- '!./test/**',
13
- '!./node_modules/**'
14
- ])
15
- .pipe(eslint({
16
- rules: {
17
- 'space-after-keywords': [2, 'never'],
18
- indent: [2, 2],
19
- 'valid-jsdoc': 0,
20
- 'func-style': 0,
21
- 'no-use-before-define': 0,
22
- camelcase: 1,
23
- 'no-unused-vars': 1,
24
- 'no-alert': 1,
25
- 'no-console': 1,
26
- 'no-unused-expressions': 0,
27
- 'consistent-return': 0
28
- },
29
- globals: {
30
- 'define': true
31
- }
32
- }))
33
- .pipe(eslint.format())
34
- .pipe(eslint.failAfterError());
35
- });
36
-
@@ -1,52 +0,0 @@
1
- 'use strict';
2
-
3
-
4
- // If URL has/.well-known/, send request to upstream API service
5
- var customResolver1 = function (host, url) {
6
- if (/^\/.well-known\//.test(url)) {
7
- return 'http://localhost:3000';
8
- }
9
- };
10
-
11
- // assign high priority
12
- customResolver1.priority = 100;
13
-
14
- var proxy = new require('../../index.js')({
15
- port: 8080,
16
- resolvers: [
17
- customResolver1
18
- ],
19
- secure: true,
20
- ssl: { port: 443 },
21
- })
22
-
23
- proxy.register("www", "http://www.planetex.press:3000", {/*
24
- ssl: {
25
- key: "/home/planetex/ssl.key",
26
- cert: "/home/planetex/ssl.cert",
27
- }
28
- */});
29
- proxy.register("api", "http://api.planetex.press:3002", {/*
30
- ssl: {
31
- key: "/home/planetex/domains/api.planetex.press/ssl.key",
32
- cert: "/home/planetex/domains/api.planetex.press/ssl.cert",
33
- }
34
- */});
35
- proxy.register("dash", "http://dash.planetex.press:3001", {/*
36
- ssl: {
37
- key: "/home/planetex/domains/dash.planetex.press/ssl.key",
38
- cert: "/home/planetex/domains/dash.planetex.press/ssl.cert",
39
- }
40
- */});
41
-
42
- var http = require('http');
43
-
44
- http.createServer(function(req, res){
45
-
46
- res.writeHead(200);
47
- res.write(req.url);
48
- res.end();
49
-
50
- console.log(req.host);
51
-
52
- }).listen(3000);
@@ -1,36 +0,0 @@
1
- var spdy = require('spdy'),
2
- fs = require('fs'),
3
- path = require('path');
4
-
5
- var options = {
6
- // Private key
7
- //key: fs.readFileSync(path.join(__dirname, "certs/dev-key.pem")),
8
- //cert: fs.readFileSync(path.join(__dirname, "certs/dev-cert.pem")),
9
-
10
- // **optional** SPDY-specific options
11
- spdy: {
12
- protocols: [ 'h2', 'spdy/3.1', 'http/1.1' ],
13
- plain: false,
14
-
15
- // **optional**
16
- // Parse first incoming X_FORWARDED_FOR frame and put it to the
17
- // headers of every request.
18
- // NOTE: Use with care! This should not be used without some proxy that
19
- // will *always* send X_FORWARDED_FOR
20
- 'x-forwarded-for': true,
21
-
22
- connection: {
23
- windowSize: 1024 * 1024, // Server's window size
24
-
25
- // **optional** if true - server will send 3.1 frames on 3.0 *plain* spdy
26
- autoSpdy31: false
27
- }
28
- }
29
- };
30
-
31
- var server = spdy.createServer(options, function(req, res) {
32
- res.writeHead(200);
33
- res.end('hello world!');
34
- });
35
-
36
- server.listen(3000);
@@ -1 +0,0 @@
1
- {"creation_host":"Manuels-MacBook-Pro.local","creation_dt":"2016-08-30T15:22:20.371Z"}
@@ -1 +0,0 @@
1
- {"kty":"RSA","n":"v7Q7VtM_s1obhDJrSef8oSZtT9-v91cHnqzeTyMf0-Sz3CjYXamzEz_v7ASMS4JsGoG1SeaDlk_GYMO4OyAUNTB5nUJSR5ImNPwNz0m6dmr42tqOQalGG20lbm0-ZA7UYrJes1WylLyeNE_sgMVkpI50f8GHfAbZlEsJz54Vt8jqv-DSbXXoK-PyuhvP0y-uMujJQs6cWvztgun_8xvAeR9EykxAhw-7n9h84P0j3zprARVI0JTMjKeZyJ14aupWLEZ350Hd_ryWz36D6dDQJgjWqHh6lvv36Md90KcR-CDB3I2qVHQT5kFJhUNVGK7-eJQs8C0APZvyHS9jynuX4Q","e":"AQAB","d":"iNfhG-OEL0T9K2rKR2GAZpCFq2Sjuc24NL51mswZ5in1cgz-Fi4TFISpgTLl6ujYvjsk6_HOsLeVhnFvy1Tk1-sYhPdYwJpFB8F9IiEhJ3LI3YDx11E8KEvLUn5M8SPc2-8zxpQ__AiAbhs3WdyOMSE3bBL74b8KBd9iy3-vRRa8SySu--eeR73LcAjWt6c-Mpt6mHBMT83sGQW-OXPAIDQK--vWXwEgZCgq-r6IwAyGcgV3IdTDu-XZwXyXviZ_D7c457YPN9bK4rZKlcW_FFoTEFN1Roq0UFmeIdOcYR6FeieEhICx3W09AvoLtvauPa8CPIzmH1kWLDNPViVigQ","p":"6ECuYDDcc2Z534pqB0tS8Pc89yE0jH1txMFEw-CpbUi8rykKGiEhqZq7xism0nBym2Zr3i6IhhEKRszQkNNR2fXA20L3OjRgDijRemzfO1-MU1m_PSlIQq9O85zB2F0GIvjLMXgvR_vgHNUOyutV0fWM2p8W1IHmPDds4OCGoyk","q":"004r_QTpQCdxWLS4zjVJgVikiUZkVPe8pQOFQmFjdv0C4V1_S23pQhdzrrdGB7gZ00-xeepK2MMHZiPPp-noMouRs7fmC3_-jOlBTe8R4mGjd5hHJZ_fAphyUiBy2uk971aPjiAQAoFlIk_VjLi-p464p14xFx-ls5eWQT1ZXfk","dp":"4xFp6u2aetDz0pP2-c6w9poiZtN2Fu0Cht0WKBPcUdZNc0tCby15ReLcNvE1cYUy57AJQh5op_q8-19_gji4y8ozlasxHxzZ1L4fn_wVfGz8OvmBuYBE_716CT93XdwFBegMcP856rzc7hN39PiE3VOfNJdZsMaXnMPrlSivOZE","dq":"NfoBCJgJkUbCEHvRvXMlPLJNDXf6xy2lda2Ji-ReyRVmd_UvQDBqZmShO187t1sS1cTEvDTaO7bOHAxHzkfU9ZxrcrImRIfEmXA4K1VHh0GTxUgT3IuTJxGUGmCJllwAYzQEZbTRAiLVl8c28MR8h0bQ6ogIGDUQWej-C9pFCtk","qi":"3eTbAKe0oiRQSs456A58jKac4UYS-VN6oGKHkROBq8w8YAYkhQI9jeTQbUm7N7g8bwEIruGUdyq-SXAb8WOS166GdEqB_5bhP9xJw1MLFVaerXVOrDYMCBB-hTKw3kY7SIDoCgVBP3-1GL-fhXbvz3-CdOprwDCf8JMExXcop8k"}
@@ -1 +0,0 @@
1
- {"body":{"id":304846,"key":{"kty":"RSA","n":"v7Q7VtM_s1obhDJrSef8oSZtT9-v91cHnqzeTyMf0-Sz3CjYXamzEz_v7ASMS4JsGoG1SeaDlk_GYMO4OyAUNTB5nUJSR5ImNPwNz0m6dmr42tqOQalGG20lbm0-ZA7UYrJes1WylLyeNE_sgMVkpI50f8GHfAbZlEsJz54Vt8jqv-DSbXXoK-PyuhvP0y-uMujJQs6cWvztgun_8xvAeR9EykxAhw-7n9h84P0j3zprARVI0JTMjKeZyJ14aupWLEZ350Hd_ryWz36D6dDQJgjWqHh6lvv36Md90KcR-CDB3I2qVHQT5kFJhUNVGK7-eJQs8C0APZvyHS9jynuX4Q","e":"AQAB"},"contact":["mailto:manuel@optimalbits.com"],"agreement":"https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf","initialIp":"85.235.1.31","createdAt":"2016-08-30T15:22:19Z"}}
@@ -1 +0,0 @@
1
- {"creation_host":"Manuels-MBP","creation_dt":"2016-09-18T14:25:30.785Z"}
@@ -1 +0,0 @@
1
- {"kty":"RSA","n":"1sfAvmeOBdJelhXoG0HUrSiiY2PORPkEz9cDnfEVW8-G0w_584kpJHsKm2ixhtmZnjR0lismnaaE9wsqGXCZQ0Gn5dTUkcVKqRyntLKUh1emMY2SjEfTorEZqh6mq-7fUr6NtJU24QEJHWkDFxPp6PsQA8FREcrDIr5gt50xgaK65FxJ4YWCHH8kfCBY9XG5lD8NKya6S9upJFWJtldj7Qplx4JTf-se2YXCqvhVNXGkU_f23ZO9zOt9aPWtEekcZLTHjwTMUhq64vOFV7YlIuUPvQJhLG9AXVszYKjrWak-B_Eq6E74onOyI7W3aT7YjRIZl1RmBnnKmBYgysr2ww","e":"AQAB","d":"0mEDOP4yLR2srJJ0sg4_hgVhWr1uVD0fK35O-qwk4bNbOu5RRO07MZKcBzH7gj0urbpv4JAP2Sg84cc7y4NxfGGZVhSsysRXp2J8GxE5T4DZN3yW6XWJpbiXjP1NAOiQM3qXTyVBhg__n6E296n32s_hFeyLvkO_9A5Kqk_9KB40AtLBmgD99apZo43cvjQWoQTha28vx6MdKSG7cMGbKEoAulCufjYFoUvV8CUETo_vg5Vjzj4rZ0HpyOIfOxjzfLlEBoEPWWSc5NWV4toFU7uimlFW1eTKduyhRwnj9PiJ9aOtmNvvDH20X6BTunCLXM6OKp51jd7M207O8VNg0Q","p":"85Sc7ZWMD5mgx7ggzEPtehpsV1q1M0iVVOZi0955IsU7Fpe4avq4-kBg-9PPJCFrMnNpZOmr9Xc0e84SuShkT_5hmTZH-d8f8aHRknbJHNKerzABfHYgUhza0bpYR0u5Lf77fiRTIFnsyFykotMCP3E10B4HM7bPxN-j9KumDm8","q":"4bs3-irM80lGIW8Q0OkOkcADJUh4HlnK-tL08wIEJ-2rXb_PfPZ3aeMMvZrDoDL2YZerlKRe3vj1ceCkuZaNsnawNUM480y8V6AE4cjhEWo7fSLmvnqmkU2HlTLgUkJKAJXKTCLl3zBNKi9fKpK57EiGgtjjqOT4W6TDU0pXBu0","dp":"8Km1I0jOydsQcEQMo8W5rRrOUMDep3zfjrLSkmMNbL1SVFAzdf-jJB7Xs_jigOBD-eTuDTaTIERXJrvE5Ax0kFTWOXrYQpmiBivL1NpoeoHfJ1hXH5HW_UplKTLkZgz7OebktQ1O1HgE6zIduIKjhetlL-t7Ui0du3b7l5LAzyE","dq":"EPW8EvO8SlsrBcAOh2O7UIAYvGhhfgZJFedbuBZisY1N3tFWiZELD82bW3ORVyv9DwASSCzBZAdYiaHTPo5tPwdj3dybHsyZKgw_0acCIgjVR2Wj6JPWh_xHP5J_AC8y2DBo7qeAlfBPG-hLQiucBIC-en5JPJtXfas3cb6YI1E","qi":"1GV96yL6GV5S7B3rj5TWJUuKpkgTyKe4Q4sOTWh1pTsQ2PVL1Vr--FKM2CT_PvuAf4jWcaZgZoEZiaBGoLAPWBXYjuvaqXZ1dtdNqb-tLhOVSZJ3vAzA-jPJ-OUwQ_-BXl2FGD66plaPK0EvbaufK5a0h8D_9oK8E2TXtdSMtJ0"}
@@ -1 +0,0 @@
1
- {"body":{"id":4407503,"key":{"kty":"RSA","n":"1sfAvmeOBdJelhXoG0HUrSiiY2PORPkEz9cDnfEVW8-G0w_584kpJHsKm2ixhtmZnjR0lismnaaE9wsqGXCZQ0Gn5dTUkcVKqRyntLKUh1emMY2SjEfTorEZqh6mq-7fUr6NtJU24QEJHWkDFxPp6PsQA8FREcrDIr5gt50xgaK65FxJ4YWCHH8kfCBY9XG5lD8NKya6S9upJFWJtldj7Qplx4JTf-se2YXCqvhVNXGkU_f23ZO9zOt9aPWtEekcZLTHjwTMUhq64vOFV7YlIuUPvQJhLG9AXVszYKjrWak-B_Eq6E74onOyI7W3aT7YjRIZl1RmBnnKmBYgysr2ww","e":"AQAB"},"contact":["mailto:manuel@optimalbits.com"],"agreement":"https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf","initialIp":"217.72.54.127","createdAt":"2016-09-18T14:25:30Z"}}
@@ -1,27 +0,0 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIIEowIBAAKCAQEA2xcbvINnnA0EuQo3vt6VZYl7Bcy078pybFnDe2Wo2BJTtoJp
3
- n2k4xUUHibMuwxLCZC4iCcQY/4RzMLp3ZDcYvrlB9+THrx6xKusdOgdhktTuDTbA
4
- F6f0W4EthfNpJPBGkwaI9JU8UvHcd9kukiLj9Kv7AbhTsQjGBHT+6PVqp8Gzkf75
5
- lVV4iQyzi1zexw2GMe1XQboykgPU7B1x8YIdV5J7vO7/TsLu/fRvCOy33g1kZ62m
6
- ksMvp+L1WtYwLCVCGgwmMbLndNcGfpHHM82aZL1yJxBcrNgH2m7S3mgfaHlZxe5O
7
- 8WlwxGbVAPZiDaCFDF+4JXaLCvfG41ERRj0bTQIDAQABAoIBAF6tWMYZPw/3rD/O
8
- g5KPG556T9iMwvAQ22upSsmrf9CH8vce2kgSL39IOl6uORoBpFGogfsYa/kXorO/
9
- ENMU4DOjWTen/QbXS5aRbdriz66lJ448R7yxTu6wHx0QuDJHRyhIHa0cRKpPbIe6
10
- Kd7rBvl3zIvMvRX3BaNtb676RzHgvSrkp4f8c5kCFZ8YHPKsEJml0mIRKW4py7R7
11
- ZwCNOX1Lnbb5z2ZeqCM2RkFgf+UeL40TpFTizYzCETXEWBUn1F37t2i4XM0rwQt1
12
- KCfyhKb7ylsvp6W5wlnZ5cBl80LLnllcpa+GA+u5/5+QCZ1I1jr3SbsBhmEoyco7
13
- DUywyp0CgYEA+L7GXjrDfFzvuPX8v8khEswpSAriE0LCcUCnQMQ3qup/zxzNjodU
14
- Nr4VNGos3Y7+ZF/EoVluhY+cVAl8iTo5i06nWhkWYe7DCUzF4dk1qgXPCPSLyk/W
15
- KN9PZI7xaCSuaWWC5CMqoflDNqQc7ocgCX7QhKztpJmW4gYEMyRhvlMCgYEA4Xrr
16
- Iwbd/Zr7cle2VjuI73j6vMlY3REy9sM74CryldZJ4sYwqMHhxDWnaFNa/Zem46eF
17
- 8A7vflJiLpfnyUxwvVmB+ztVSalA9Q6rD1TEIqbKBmPFw5+oriVAm8QZf1UV+zlQ
18
- 4KqmzNNGcY8n4hAu72IoSHwA5se6jfhdeh2SS98CgYEAxOBCI0zBcsogFrXjgWxQ
19
- mA8tUU8D1pjNS1QPzOxA3y9RT30NmRS1a8qQ//ZVYlsOMCW4fLhLCL08zyre/cIu
20
- z3rGbEJU+9g9WDwClxoTJmoIjp73kX4VFC6DKSUWHwaBYPwuWCEZWi/uqe3E1Gnw
21
- ynMr2QcB5HiH+ocmhc/y6O8CgYAi+CFHiWUcU9DzZs8MiKcwHJ8mcEOr5WL2Ckla
22
- 9s4wls9WsE4Tnh4ZhAi2kVbnRYHIhM6s8GQMP1Kiz0RPX9+MPjl+cTFE/07nsqKs
23
- +gSBK0ThwM+HC1fpyjU+8ybRLK0ADV+RuGWuFoYyTnVtBf2BesOsmi65m/g+1GoK
24
- 6lMqGQKBgAD2RyL/KrbxKGMmqrkthYo4iw2/zAJ7XQ8yaP6OIuzW4pC/OeL52VZP
25
- LjDsegmQeHD4VcCRB/jdtGFZFmGlhtkzQ2iX5+Vbrt6udP80X5CrrK51k0d6LSdg
26
- nsDKs0appoZbfE/oaO2WpSPytyvlBQgoquq/kagYnOc+G2di5VBS
27
- -----END RSA PRIVATE KEY-----
@@ -1,27 +0,0 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIIEpAIBAAKCAQEAwx0q3noqTM8+/XURJxJ02oHxf8MdqY0M46VsCw7u6dXqeVF/
3
- K/piezQZ2ZKMmdyzHBnrifbkN6oaLsNuW1xEO12wKl3W6j4VlE9NR3CL7ZfmKrTA
4
- EVR/ynW7KOlXvNnN5p6vkuPM4xCu7YgtxpDVzkebE33FuhcgzQdElKuUqdQm7BDB
5
- FWV+S3W9UQyG01APIZ9MjM39NroYdz31U/tRTKwlffLpVGjphIhCivPUP++E/7LL
6
- vB5JAYjJaoZy98JsQ/tvzQ1EsPCkWQaKhtfuPFOaUviLGp7F2NV+wHrzA+b88v8z
7
- BNd2HunVSNp7GpFmBj+gv6syB2O5oBoxGBibgQIDAQABAoIBAFYK9c24qBDJUCjr
8
- yE2nuPpnVX2XKOyNdEKrv5K82iUqncU0aFWXjHhyiHfHRdPQXPgmghWMWCYoEHXQ
9
- 30jQzpIzha2ZRl50VIXb1uOLQVnco7bvkMfTsKsy8f9fr75ren6aOikX5lG4GLxN
10
- Uop/cpoOP9f/ngOrkV55NwgtBllBnOu1P9VoUR6gSdZ8i9b8UZT1FjzKpudYMWmT
11
- pOR8k62OKeze7jnxrqAhL/WzpsNM+rwE2pTvjo+lP3zu4sJqdhNzOK2irkDYHqrf
12
- rvdnkXlnMNCVhtD9qiU6cVijPwTU24hw7R1aY2qpwWdSm2tkw2oNnBD911X3H32E
13
- 26tGeHECgYEA8Cct9KSLUZeE+bllwI/uhIWRYpyH6Rn0FlAHIo/+Dfgl/QX9yTNk
14
- GI8/pUJ+tYClfWPQq+hmUx28zsyUFhqoCEFJDRbORFphGkJsod4RMBNAZokr2kuv
15
- J3qKt3DaX1QQXA+NI6gfg92sJYDv0gAJWrc5QhIVGbRuUypgMUcrjrUCgYEAz/0o
16
- fvtwwMMOoyp3bS8oPnccffi74+0FI+mSccn5GS734SLe2yd6G0SiOmv9W7LGfZ8q
17
- EjSfOZ1uknBBN8OyZ4BVZR9b1aOF5caTlfP3NsKOuQVUekHcrexyNWCuoyblw2VZ
18
- r+ztp0FT+OtWyA2JDkBJBh7+ba4Flpr2No5pTR0CgYEAqwCa/pq0AZNMwq07QRS8
19
- GG0rivY+6MLsRX8StY+mrbfHBRZhEgWf/sTx4vEoXIGQVWrfyakgQ4rnSLHvuJWe
20
- lNI3/DQDCDT688HcrJ39yyfKMbj3GufNfuUJJXocZMjtJUCFlaA/YJxV2hanrfcM
21
- siXJhbxuffE2pc2E1VICOAkCgYBUmIOAIoUZ4jxx4TPyFNwpjAjqs+C4NA+DK92E
22
- qsHGnHP1/ljmiof/z0qsuH+0bGKPdc2G2iBpLr9qkH32UIKf1nLlTnvryTcM3lfp
23
- BfHnM/sZBjH2CBPaKfHKBCkD8y5A61gvVg7TmJ6vAAmsFNVKFpudAb46ni1ntF+w
24
- kPwDgQKBgQDgR0Y4zWHD5HbmhRFs6SZl8WUF3UA4XXdsuyi3CoUDmxw3d7fTmqKb
25
- twyFuVrlm6I5ArTx6IGyYwidFaZglKDeQnLCToarM8GcMipquJzd4tmlkZJb9pOi
26
- cxJjNA6+D1uSGC2LW7gsXsAf/wJ6J7GPH2SzEiezhhgvALfujlX1Vw==
27
- -----END RSA PRIVATE KEY-----
@@ -1,29 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIE8TCCA9mgAwIBAgITAPoaP9spbg6rEZeE9ftc0nGrejANBgkqhkiG9w0BAQsF
3
- ADAiMSAwHgYDVQQDDBdGYWtlIExFIEludGVybWVkaWF0ZSBYMTAeFw0xNjA5MTgx
4
- MzI4MDBaFw0xNjEyMTcxMzI4MDBaMCExHzAdBgNVBAMTFmNhdHVycmEuZXhhY3Ri
5
- eXRlcy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6IzRaeBrY
6
- QCA6iaoKAG2aODktRuw9ZEKZluXVNQosnlhUzkcClyj/O6mM4RUqXZw4SzdDPYLL
7
- f8qRxBvvGtOX/WfsMxkJk6ZwrFHp8GwYchgKehVhuuvPmzXx4sTZCyFOs2sK5PNg
8
- g17lI8Qdzw1cyI2zT+WVK9BMWRWw4UM+TEHLeb8LWn0Ljw5sk5krgffx8HCmC8Ho
9
- JruFOXUiRAl2+sWq02JM83FfB6lRXtp1yt+U/XdCpsbcDQyUjLfzcN0Wu/zXLPFN
10
- AaVDKTzdhSU/q9ze+RkT4DSJHXD272ekvIdgbDoOpXbChZqvqoIqQOI6EkFGTHE8
11
- sAsnJBm9sRcLAgMBAAGjggIfMIICGzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw
12
- FAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFBdA
13
- wGk8f15CB4YLr6G1JhTTrxUJMB8GA1UdIwQYMBaAFMDMA0a5WCDMXHJw8+EuyyCm
14
- 9Wg6MHgGCCsGAQUFBwEBBGwwajAzBggrBgEFBQcwAYYnaHR0cDovL29jc3Auc3Rn
15
- LWludC14MS5sZXRzZW5jcnlwdC5vcmcvMDMGCCsGAQUFBzAChidodHRwOi8vY2Vy
16
- dC5zdGctaW50LXgxLmxldHNlbmNyeXB0Lm9yZy8wIQYDVR0RBBowGIIWY2F0dXJy
17
- YS5leGFjdGJ5dGVzLmNvbTCB/gYDVR0gBIH2MIHzMAgGBmeBDAECATCB5gYLKwYB
18
- BAGC3xMBAQEwgdYwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQu
19
- b3JnMIGrBggrBgEFBQcCAjCBngyBm1RoaXMgQ2VydGlmaWNhdGUgbWF5IG9ubHkg
20
- YmUgcmVsaWVkIHVwb24gYnkgUmVseWluZyBQYXJ0aWVzIGFuZCBvbmx5IGluIGFj
21
- Y29yZGFuY2Ugd2l0aCB0aGUgQ2VydGlmaWNhdGUgUG9saWN5IGZvdW5kIGF0IGh0
22
- dHBzOi8vbGV0c2VuY3J5cHQub3JnL3JlcG9zaXRvcnkvMA0GCSqGSIb3DQEBCwUA
23
- A4IBAQCugwNrp0wmMHoU33jzeOlCWaHLnYplYxGp2zL0uU0/DxWLyVn5u6dj7hcq
24
- UggYh+8PL0iVLPSfLId4t1aI7gor1qmF6L9yzAQq0vderwXMXvLurOsVfEaGJjrA
25
- mpmTews20NdDFJaYly/4GrDfb07D8NTBlzu9sUkRUznBdJ/8u/SjBkFAK5ICxkJ7
26
- /6KiKwk7g0k9vyMMfAsLCNEPueY17mCnlzj7A2N90np4QXjgcFdFqibAQ6J/+La0
27
- flU1PWfms+UwRjt4vBebAmInd50lofObm6OPnB9X9IH0vVvnZBUIhk8BE+wxnlw9
28
- piOf4l9a4N8YiiR+VTUGSOOO7jsN
29
- -----END CERTIFICATE-----
@@ -1,27 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIEqzCCApOgAwIBAgIRAIvhKg5ZRO08VGQx8JdhT+UwDQYJKoZIhvcNAQELBQAw
3
- GjEYMBYGA1UEAwwPRmFrZSBMRSBSb290IFgxMB4XDTE2MDUyMzIyMDc1OVoXDTM2
4
- MDUyMzIyMDc1OVowIjEgMB4GA1UEAwwXRmFrZSBMRSBJbnRlcm1lZGlhdGUgWDEw
5
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtWKySDn7rWZc5ggjz3ZB0
6
- 8jO4xti3uzINfD5sQ7Lj7hzetUT+wQob+iXSZkhnvx+IvdbXF5/yt8aWPpUKnPym
7
- oLxsYiI5gQBLxNDzIec0OIaflWqAr29m7J8+NNtApEN8nZFnf3bhehZW7AxmS1m0
8
- ZnSsdHw0Fw+bgixPg2MQ9k9oefFeqa+7Kqdlz5bbrUYV2volxhDFtnI4Mh8BiWCN
9
- xDH1Hizq+GKCcHsinDZWurCqder/afJBnQs+SBSL6MVApHt+d35zjBD92fO2Je56
10
- dhMfzCgOKXeJ340WhW3TjD1zqLZXeaCyUNRnfOmWZV8nEhtHOFbUCU7r/KkjMZO9
11
- AgMBAAGjgeMwgeAwDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAw
12
- HQYDVR0OBBYEFMDMA0a5WCDMXHJw8+EuyyCm9Wg6MHoGCCsGAQUFBwEBBG4wbDA0
13
- BggrBgEFBQcwAYYoaHR0cDovL29jc3Auc3RnLXJvb3QteDEubGV0c2VuY3J5cHQu
14
- b3JnLzA0BggrBgEFBQcwAoYoaHR0cDovL2NlcnQuc3RnLXJvb3QteDEubGV0c2Vu
15
- Y3J5cHQub3JnLzAfBgNVHSMEGDAWgBTBJnSkikSg5vogKNhcI5pFiBh54DANBgkq
16
- hkiG9w0BAQsFAAOCAgEABYSu4Il+fI0MYU42OTmEj+1HqQ5DvyAeyCA6sGuZdwjF
17
- UGeVOv3NnLyfofuUOjEbY5irFCDtnv+0ckukUZN9lz4Q2YjWGUpW4TTu3ieTsaC9
18
- AFvCSgNHJyWSVtWvB5XDxsqawl1KzHzzwr132bF2rtGtazSqVqK9E07sGHMCf+zp
19
- DQVDVVGtqZPHwX3KqUtefE621b8RI6VCl4oD30Olf8pjuzG4JKBFRFclzLRjo/h7
20
- IkkfjZ8wDa7faOjVXx6n+eUQ29cIMCzr8/rNWHS9pYGGQKJiY2xmVC9h12H99Xyf
21
- zWE9vb5zKP3MVG6neX1hSdo7PEAb9fqRhHkqVsqUvJlIRmvXvVKTwNCP3eCjRCCI
22
- PTAvjV+4ni786iXwwFYNz8l3PmPLCyQXWGohnJ8iBm+5nk7O2ynaPVW0U2W+pt2w
23
- SVuvdDM5zGv2f9ltNWUiYZHJ1mmO97jSY/6YfdOUH66iRtQtDkHBRdkNBsMbD+Em
24
- 2TgBldtHNSJBfB3pm9FblgOcJ0FSWcUDWJ7vO0+NTXlgrRofRT6pVywzxVo6dND0
25
- WzYlTWeUVsO40xJqhgUQRER9YLOLxJ0O6C8i0xFxAMKOtSdodMB3RIwt7RFQ0uyt
26
- n5Z5MqkYhlMI3J1tPRTp1nEt9fyGspBOO05gi148Qasp+3N+svqKomoQglNoAxU=
27
- -----END CERTIFICATE-----
@@ -1,56 +0,0 @@
1
- -----BEGIN CERTIFICATE-----
2
- MIIE8TCCA9mgAwIBAgITAPoaP9spbg6rEZeE9ftc0nGrejANBgkqhkiG9w0BAQsF
3
- ADAiMSAwHgYDVQQDDBdGYWtlIExFIEludGVybWVkaWF0ZSBYMTAeFw0xNjA5MTgx
4
- MzI4MDBaFw0xNjEyMTcxMzI4MDBaMCExHzAdBgNVBAMTFmNhdHVycmEuZXhhY3Ri
5
- eXRlcy5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6IzRaeBrY
6
- QCA6iaoKAG2aODktRuw9ZEKZluXVNQosnlhUzkcClyj/O6mM4RUqXZw4SzdDPYLL
7
- f8qRxBvvGtOX/WfsMxkJk6ZwrFHp8GwYchgKehVhuuvPmzXx4sTZCyFOs2sK5PNg
8
- g17lI8Qdzw1cyI2zT+WVK9BMWRWw4UM+TEHLeb8LWn0Ljw5sk5krgffx8HCmC8Ho
9
- JruFOXUiRAl2+sWq02JM83FfB6lRXtp1yt+U/XdCpsbcDQyUjLfzcN0Wu/zXLPFN
10
- AaVDKTzdhSU/q9ze+RkT4DSJHXD272ekvIdgbDoOpXbChZqvqoIqQOI6EkFGTHE8
11
- sAsnJBm9sRcLAgMBAAGjggIfMIICGzAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYw
12
- FAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFBdA
13
- wGk8f15CB4YLr6G1JhTTrxUJMB8GA1UdIwQYMBaAFMDMA0a5WCDMXHJw8+EuyyCm
14
- 9Wg6MHgGCCsGAQUFBwEBBGwwajAzBggrBgEFBQcwAYYnaHR0cDovL29jc3Auc3Rn
15
- LWludC14MS5sZXRzZW5jcnlwdC5vcmcvMDMGCCsGAQUFBzAChidodHRwOi8vY2Vy
16
- dC5zdGctaW50LXgxLmxldHNlbmNyeXB0Lm9yZy8wIQYDVR0RBBowGIIWY2F0dXJy
17
- YS5leGFjdGJ5dGVzLmNvbTCB/gYDVR0gBIH2MIHzMAgGBmeBDAECATCB5gYLKwYB
18
- BAGC3xMBAQEwgdYwJgYIKwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQu
19
- b3JnMIGrBggrBgEFBQcCAjCBngyBm1RoaXMgQ2VydGlmaWNhdGUgbWF5IG9ubHkg
20
- YmUgcmVsaWVkIHVwb24gYnkgUmVseWluZyBQYXJ0aWVzIGFuZCBvbmx5IGluIGFj
21
- Y29yZGFuY2Ugd2l0aCB0aGUgQ2VydGlmaWNhdGUgUG9saWN5IGZvdW5kIGF0IGh0
22
- dHBzOi8vbGV0c2VuY3J5cHQub3JnL3JlcG9zaXRvcnkvMA0GCSqGSIb3DQEBCwUA
23
- A4IBAQCugwNrp0wmMHoU33jzeOlCWaHLnYplYxGp2zL0uU0/DxWLyVn5u6dj7hcq
24
- UggYh+8PL0iVLPSfLId4t1aI7gor1qmF6L9yzAQq0vderwXMXvLurOsVfEaGJjrA
25
- mpmTews20NdDFJaYly/4GrDfb07D8NTBlzu9sUkRUznBdJ/8u/SjBkFAK5ICxkJ7
26
- /6KiKwk7g0k9vyMMfAsLCNEPueY17mCnlzj7A2N90np4QXjgcFdFqibAQ6J/+La0
27
- flU1PWfms+UwRjt4vBebAmInd50lofObm6OPnB9X9IH0vVvnZBUIhk8BE+wxnlw9
28
- piOf4l9a4N8YiiR+VTUGSOOO7jsN
29
- -----END CERTIFICATE-----
30
- -----BEGIN CERTIFICATE-----
31
- MIIEqzCCApOgAwIBAgIRAIvhKg5ZRO08VGQx8JdhT+UwDQYJKoZIhvcNAQELBQAw
32
- GjEYMBYGA1UEAwwPRmFrZSBMRSBSb290IFgxMB4XDTE2MDUyMzIyMDc1OVoXDTM2
33
- MDUyMzIyMDc1OVowIjEgMB4GA1UEAwwXRmFrZSBMRSBJbnRlcm1lZGlhdGUgWDEw
34
- ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtWKySDn7rWZc5ggjz3ZB0
35
- 8jO4xti3uzINfD5sQ7Lj7hzetUT+wQob+iXSZkhnvx+IvdbXF5/yt8aWPpUKnPym
36
- oLxsYiI5gQBLxNDzIec0OIaflWqAr29m7J8+NNtApEN8nZFnf3bhehZW7AxmS1m0
37
- ZnSsdHw0Fw+bgixPg2MQ9k9oefFeqa+7Kqdlz5bbrUYV2volxhDFtnI4Mh8BiWCN
38
- xDH1Hizq+GKCcHsinDZWurCqder/afJBnQs+SBSL6MVApHt+d35zjBD92fO2Je56
39
- dhMfzCgOKXeJ340WhW3TjD1zqLZXeaCyUNRnfOmWZV8nEhtHOFbUCU7r/KkjMZO9
40
- AgMBAAGjgeMwgeAwDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAw
41
- HQYDVR0OBBYEFMDMA0a5WCDMXHJw8+EuyyCm9Wg6MHoGCCsGAQUFBwEBBG4wbDA0
42
- BggrBgEFBQcwAYYoaHR0cDovL29jc3Auc3RnLXJvb3QteDEubGV0c2VuY3J5cHQu
43
- b3JnLzA0BggrBgEFBQcwAoYoaHR0cDovL2NlcnQuc3RnLXJvb3QteDEubGV0c2Vu
44
- Y3J5cHQub3JnLzAfBgNVHSMEGDAWgBTBJnSkikSg5vogKNhcI5pFiBh54DANBgkq
45
- hkiG9w0BAQsFAAOCAgEABYSu4Il+fI0MYU42OTmEj+1HqQ5DvyAeyCA6sGuZdwjF
46
- UGeVOv3NnLyfofuUOjEbY5irFCDtnv+0ckukUZN9lz4Q2YjWGUpW4TTu3ieTsaC9
47
- AFvCSgNHJyWSVtWvB5XDxsqawl1KzHzzwr132bF2rtGtazSqVqK9E07sGHMCf+zp
48
- DQVDVVGtqZPHwX3KqUtefE621b8RI6VCl4oD30Olf8pjuzG4JKBFRFclzLRjo/h7
49
- IkkfjZ8wDa7faOjVXx6n+eUQ29cIMCzr8/rNWHS9pYGGQKJiY2xmVC9h12H99Xyf
50
- zWE9vb5zKP3MVG6neX1hSdo7PEAb9fqRhHkqVsqUvJlIRmvXvVKTwNCP3eCjRCCI
51
- PTAvjV+4ni786iXwwFYNz8l3PmPLCyQXWGohnJ8iBm+5nk7O2ynaPVW0U2W+pt2w
52
- SVuvdDM5zGv2f9ltNWUiYZHJ1mmO97jSY/6YfdOUH66iRtQtDkHBRdkNBsMbD+Em
53
- 2TgBldtHNSJBfB3pm9FblgOcJ0FSWcUDWJ7vO0+NTXlgrRofRT6pVywzxVo6dND0
54
- WzYlTWeUVsO40xJqhgUQRER9YLOLxJ0O6C8i0xFxAMKOtSdodMB3RIwt7RFQ0uyt
55
- n5Z5MqkYhlMI3J1tPRTp1nEt9fyGspBOO05gi148Qasp+3N+svqKomoQglNoAxU=
56
- -----END CERTIFICATE-----