@midwayjs/mock 3.3.5 → 3.4.0-beta.11

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.
@@ -3,7 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createHttpRequest = void 0;
4
4
  const request = require("supertest");
5
5
  function createHttpRequest(app) {
6
- if (app.callback) {
6
+ if (app.callback2) {
7
+ return request(app.callback2());
8
+ }
9
+ else if (app.callback) {
7
10
  return request(app.callback());
8
11
  }
9
12
  else {
@@ -2,4 +2,5 @@ export * from './http';
2
2
  export * from './rabbitMQ';
3
3
  export * from './socketio';
4
4
  export * from './ws.client';
5
+ export * from './kafka';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -18,4 +18,5 @@ __exportStar(require("./http"), exports);
18
18
  __exportStar(require("./rabbitMQ"), exports);
19
19
  __exportStar(require("./socketio"), exports);
20
20
  __exportStar(require("./ws.client"), exports);
21
+ __exportStar(require("./kafka"), exports);
21
22
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ import { KafkaConfig, Producer, ProducerConfig } from 'kafkajs';
2
+ export declare function createKafkaProducer(options: {
3
+ kafkaConfig: KafkaConfig;
4
+ producerConfig?: ProducerConfig;
5
+ mock?: boolean;
6
+ }): Promise<Producer>;
7
+ //# sourceMappingURL=kafka.d.ts.map
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createKafkaProducer = void 0;
4
+ const connect = async () => ({
5
+ producer: () => {
6
+ // connect: () => {},
7
+ // disconnect: () =>{}
8
+ },
9
+ cousumer: () => { },
10
+ });
11
+ async function createKafkaProducer(options = {
12
+ mock: true,
13
+ }) {
14
+ let { Kafka } = require('kafkajs');
15
+ if (options.mock) {
16
+ Kafka = connect;
17
+ }
18
+ const kafka = new Kafka(options.kafkaConfig);
19
+ return kafka.producer(options.producerConfig);
20
+ }
21
+ exports.createKafkaProducer = createKafkaProducer;
22
+ //# sourceMappingURL=kafka.js.map
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="bluebird" />
3
- import { Channel, Options } from 'amqplib';
3
+ import type { Channel, Options } from 'amqplib';
4
4
  declare class ChannelManager {
5
5
  private connection;
6
6
  private channel;
package/dist/creator.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { IMidwayApplication, IMidwayFramework } from '@midwayjs/core';
1
+ import { IMidwayApplication, IMidwayFramework, MidwayFrameworkType } from '@midwayjs/core';
2
2
  import { ComponentModule, MockAppConfigurationOptions } from './interface';
3
3
  export declare function create<T extends IMidwayFramework<any, any, any, any, any>>(appDir?: string, options?: MockAppConfigurationOptions, customFramework?: {
4
4
  new (...args: any[]): T;
@@ -14,10 +14,18 @@ export declare function close<T extends IMidwayApplication<any>>(app: T, options
14
14
  export declare function createFunctionApp<T extends IMidwayFramework<any, any, any, any, any>, Y = ReturnType<T['getApplication']>>(baseDir?: string, options?: MockAppConfigurationOptions, customFrameworkModule?: {
15
15
  new (...args: any[]): T;
16
16
  } | ComponentModule): Promise<Y>;
17
+ declare class BootstrapAppStarter {
18
+ getApp(type: MidwayFrameworkType | string): IMidwayApplication<any>;
19
+ close(options?: {
20
+ sleep?: number;
21
+ }): Promise<void>;
22
+ }
17
23
  /**
18
24
  * Create a real project but not ready or a virtual project
19
25
  * @param baseDir
20
26
  * @param options
21
27
  */
22
28
  export declare function createLightApp(baseDir?: string, options?: MockAppConfigurationOptions): Promise<IMidwayApplication>;
29
+ export declare function createBootstrap(entryFile: string): Promise<BootstrapAppStarter>;
30
+ export {};
23
31
  //# sourceMappingURL=creator.d.ts.map
package/dist/creator.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createLightApp = exports.createFunctionApp = exports.close = exports.createApp = exports.create = void 0;
3
+ exports.createBootstrap = exports.createLightApp = exports.createFunctionApp = exports.close = exports.createApp = exports.create = void 0;
4
4
  const core_1 = require("@midwayjs/core");
5
5
  const path_1 = require("path");
6
6
  const fs_extra_1 = require("fs-extra");
@@ -9,8 +9,19 @@ const logger_1 = require("@midwayjs/logger");
9
9
  const utils_1 = require("./utils");
10
10
  const util_1 = require("util");
11
11
  const fs_1 = require("fs");
12
+ const yaml = require("js-yaml");
13
+ const getRawBody = require("raw-body");
14
+ const async_hooks_context_manager_1 = require("@midwayjs/async-hooks-context-manager");
12
15
  const debug = (0, util_1.debuglog)('midway:debug');
13
16
  process.setMaxListeners(0);
17
+ function formatPath(baseDir, p) {
18
+ if ((0, path_1.isAbsolute)(p)) {
19
+ return p;
20
+ }
21
+ else {
22
+ return (0, path_1.resolve)(baseDir, p);
23
+ }
24
+ }
14
25
  async function create(appDir = process.cwd(), options, customFramework) {
15
26
  debug(`[mock]: Create app, appDir="${appDir}"`);
16
27
  process.env.MIDWAY_TS_MODE = 'true';
@@ -32,6 +43,30 @@ async function create(appDir = process.cwd(), options, customFramework) {
32
43
  options.baseDir = `${appDir}/src`;
33
44
  (0, core_1.safeRequire)((0, path_1.join)(`${options.baseDir}`, 'interface'));
34
45
  }
46
+ if (options.entryFile) {
47
+ // start from entry file, like bootstrap.js
48
+ options.entryFile = formatPath(appDir, options.entryFile);
49
+ global['MIDWAY_BOOTSTRAP_APP_READY'] = false;
50
+ // set app in @midwayjs/bootstrap
51
+ require(options.entryFile);
52
+ await new Promise((resolve, reject) => {
53
+ const timeoutHandler = setTimeout(() => {
54
+ clearInterval(internalHandler);
55
+ reject(new Error('[midway]: bootstrap timeout'));
56
+ }, options.bootstrapTimeout || 30 * 1000);
57
+ const internalHandler = setInterval(() => {
58
+ if (global['MIDWAY_BOOTSTRAP_APP_READY'] === true) {
59
+ clearInterval(internalHandler);
60
+ clearTimeout(timeoutHandler);
61
+ resolve();
62
+ }
63
+ else {
64
+ debug('[mock]: bootstrap not ready and wait next check');
65
+ }
66
+ }, 200);
67
+ });
68
+ return;
69
+ }
35
70
  if (!options.imports && customFramework) {
36
71
  options.imports = (0, utils_1.transformFrameworkToConfiguration)(customFramework);
37
72
  }
@@ -66,6 +101,7 @@ async function create(appDir = process.cwd(), options, customFramework) {
66
101
  await (0, core_1.initializeGlobalApplicationContext)({
67
102
  ...options,
68
103
  appDir,
104
+ asyncContextManager: (0, async_hooks_context_manager_1.createContextManager)(),
69
105
  imports: []
70
106
  .concat(options.imports)
71
107
  .concat(options.baseDir
@@ -112,25 +148,133 @@ async function close(app, options) {
112
148
  }
113
149
  exports.close = close;
114
150
  async function createFunctionApp(baseDir = process.cwd(), options, customFrameworkModule) {
115
- const customFramework = customFrameworkModule !== null && customFrameworkModule !== void 0 ? customFrameworkModule : (0, utils_1.findFirstExistModule)([
116
- process.env.MIDWAY_SERVERLESS_APP_NAME,
117
- '@ali/serverless-app',
118
- '@midwayjs/serverless-app',
119
- ]);
120
- const serverlessModule = (0, utils_1.transformFrameworkToConfiguration)(customFramework);
121
- if (serverlessModule) {
122
- if (options && options.imports) {
123
- options.imports.unshift(serverlessModule);
151
+ var _a, _b, _c;
152
+ let starterName;
153
+ if (!options.starter) {
154
+ // load yaml
155
+ try {
156
+ const doc = yaml.load((0, fs_1.readFileSync)((0, path_1.join)(baseDir, 'f.yml'), 'utf8'));
157
+ starterName = (_a = doc === null || doc === void 0 ? void 0 : doc['provider']) === null || _a === void 0 ? void 0 : _a['starter'];
158
+ if (starterName) {
159
+ const m = (0, core_1.safeRequire)(starterName);
160
+ if (m && m['BootstrapStarter']) {
161
+ options.starter = new m['BootstrapStarter']();
162
+ }
163
+ }
124
164
  }
125
- else {
126
- options = options || {};
127
- options.imports = [serverlessModule];
165
+ catch (e) {
166
+ // ignore
167
+ console.error('[mock]: get f.yml information fail, err = ' + e.stack);
168
+ }
169
+ }
170
+ if (options.starter) {
171
+ options.appDir = baseDir;
172
+ debug(`[mock]: Create app, appDir="${options.appDir}"`);
173
+ process.env.MIDWAY_TS_MODE = 'true';
174
+ // 处理测试的 fixtures
175
+ if (!(0, path_1.isAbsolute)(options.appDir)) {
176
+ options.appDir = (0, path_1.join)(process.cwd(), 'test', 'fixtures', options.appDir);
177
+ }
178
+ if (!(0, fs_1.existsSync)(options.appDir)) {
179
+ throw new core_1.MidwayCommonError(`Path "${options.appDir}" not exists, please check it.`);
180
+ }
181
+ (0, logger_1.clearAllLoggers)();
182
+ options = options || {};
183
+ if (options.baseDir) {
184
+ (0, core_1.safeRequire)((0, path_1.join)(`${options.baseDir}`, 'interface'));
185
+ }
186
+ else if (options.appDir) {
187
+ options.baseDir = `${options.appDir}/src`;
188
+ (0, core_1.safeRequire)((0, path_1.join)(`${options.baseDir}`, 'interface'));
189
+ }
190
+ // new mode
191
+ const exports = options.starter.start(options);
192
+ await exports[options.initializeMethodName || 'initializer']();
193
+ const appCtx = options.starter.getApplicationContext();
194
+ const configService = appCtx.get(core_1.MidwayConfigService);
195
+ const frameworkService = appCtx.get(core_1.MidwayFrameworkService);
196
+ const framework = frameworkService.getMainFramework();
197
+ const appManager = appCtx.get(core_1.MidwayApplicationManager);
198
+ const app = appManager.getApplication(core_1.MidwayFrameworkType.FAAS);
199
+ const faasConfig = (_b = configService.getConfiguration('faas')) !== null && _b !== void 0 ? _b : {};
200
+ const customPort = (_c = process.env.MIDWAY_HTTP_PORT) !== null && _c !== void 0 ? _c : faasConfig['port'];
201
+ app.callback2 = () => {
202
+ // mock a real http server response for local dev
203
+ return async (req, res) => {
204
+ const url = new URL(req.url, `http://${req.headers.host}`);
205
+ req.query = Object.fromEntries(url.searchParams);
206
+ req.path = url.pathname;
207
+ // 如果需要解析body并且body是个stream,函数网关不会接受比 10m 更大的文件了
208
+ if (['post', 'put', 'delete'].indexOf(req.method.toLowerCase()) !== -1 &&
209
+ !req.body &&
210
+ typeof req.on === 'function') {
211
+ req.body = await getRawBody(req, {
212
+ limit: '10mb',
213
+ });
214
+ }
215
+ const ctx = await framework.wrapHttpRequest(req);
216
+ // create event and invoke
217
+ const func = framework.getTriggerFunction(url.pathname);
218
+ const result = await func(ctx, {
219
+ isHttpFunction: true,
220
+ originEvent: req,
221
+ originContext: {},
222
+ });
223
+ const { statusCode, headers, body } = result;
224
+ if (res.headersSent) {
225
+ return;
226
+ }
227
+ for (const key in headers) {
228
+ res.setHeader(key, headers[key]);
229
+ }
230
+ if (res.statusCode !== statusCode) {
231
+ res.statusCode = statusCode;
232
+ }
233
+ // http trigger only support `Buffer` or a `string` or a `stream.Readable`
234
+ res.end(body);
235
+ };
236
+ };
237
+ if (customPort) {
238
+ await new Promise(resolve => {
239
+ let server;
240
+ if (options.ssl) {
241
+ server = require('https').createServer({
242
+ key: (0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../ssl/ssl.key'), 'utf8'),
243
+ cert: (0, fs_1.readFileSync)((0, path_1.join)(__dirname, '../ssl/ssl.pem'), 'utf8'),
244
+ }, app.callback2());
245
+ }
246
+ else {
247
+ server = require('http').createServer(app.callback2());
248
+ }
249
+ server.listen(customPort);
250
+ process.env.MIDWAY_HTTP_PORT = String(customPort);
251
+ app.server = server;
252
+ resolve();
253
+ });
254
+ }
255
+ return app;
256
+ }
257
+ else {
258
+ const customFramework = customFrameworkModule !== null && customFrameworkModule !== void 0 ? customFrameworkModule : (0, utils_1.findFirstExistModule)([
259
+ process.env.MIDWAY_SERVERLESS_APP_NAME,
260
+ '@ali/serverless-app',
261
+ '@midwayjs/serverless-app',
262
+ ]);
263
+ const serverlessModule = (0, utils_1.transformFrameworkToConfiguration)(customFramework);
264
+ if (serverlessModule) {
265
+ if (options && options.imports) {
266
+ options.imports.unshift(serverlessModule);
267
+ }
268
+ else {
269
+ options = options || {};
270
+ options.imports = [serverlessModule];
271
+ }
128
272
  }
273
+ const framework = await createApp(baseDir, options);
274
+ const appCtx = framework.getApplicationContext();
275
+ const appManager = appCtx.get(core_1.MidwayApplicationManager);
276
+ return appManager.getApplication(core_1.MidwayFrameworkType.SERVERLESS_APP);
129
277
  }
130
- const framework = await createApp(baseDir, options);
131
- const appCtx = framework.getApplicationContext();
132
- const appManager = appCtx.get(core_1.MidwayApplicationManager);
133
- return appManager.getApplication(core_1.MidwayFrameworkType.SERVERLESS_APP);
134
278
  }
135
279
  exports.createFunctionApp = createFunctionApp;
136
280
  /**
@@ -152,6 +296,26 @@ class LightFramework extends core_1.BaseFramework {
152
296
  return 'lightFramework';
153
297
  }
154
298
  }
299
+ class BootstrapAppStarter {
300
+ getApp(type) {
301
+ const applicationContext = (0, core_1.getCurrentApplicationContext)();
302
+ const applicationManager = applicationContext.get(core_1.MidwayApplicationManager);
303
+ return applicationManager.getApplication(type);
304
+ }
305
+ async close(options = {}) {
306
+ // eslint-disable-next-line node/no-extraneous-require
307
+ const BootstrapModule = (0, core_1.safeRequire)('@midwayjs/bootstrap');
308
+ if (BootstrapModule === null || BootstrapModule === void 0 ? void 0 : BootstrapModule.Bootstrap) {
309
+ await BootstrapModule.Bootstrap.stop();
310
+ }
311
+ if (options.sleep > 0) {
312
+ await (0, decorator_1.sleep)(options.sleep);
313
+ }
314
+ else {
315
+ await (0, decorator_1.sleep)(50);
316
+ }
317
+ }
318
+ }
155
319
  /**
156
320
  * Create a real project but not ready or a virtual project
157
321
  * @param baseDir
@@ -174,4 +338,11 @@ async function createLightApp(baseDir = '', options = {}) {
174
338
  });
175
339
  }
176
340
  exports.createLightApp = createLightApp;
341
+ async function createBootstrap(entryFile) {
342
+ await create(undefined, {
343
+ entryFile,
344
+ });
345
+ return new BootstrapAppStarter();
346
+ }
347
+ exports.createBootstrap = createBootstrap;
177
348
  //# sourceMappingURL=creator.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midwayjs/mock",
3
- "version": "3.3.5",
3
+ "version": "3.4.0-beta.11",
4
4
  "description": "create your test app from midway framework",
5
5
  "main": "dist/index",
6
6
  "typings": "dist/index.d.ts",
@@ -19,31 +19,36 @@
19
19
  ],
20
20
  "files": [
21
21
  "dist/**/*.js",
22
- "dist/**/*.d.ts"
22
+ "dist/**/*.d.ts",
23
+ "ssl"
23
24
  ],
24
25
  "engines": {
25
26
  "node": ">=12"
26
27
  },
27
28
  "license": "MIT",
28
29
  "devDependencies": {
29
- "@midwayjs/core": "^3.3.5",
30
- "@midwayjs/decorator": "^3.3.4",
30
+ "@midwayjs/core": "^3.4.0-beta.11",
31
+ "@midwayjs/decorator": "^3.4.0-beta.11",
31
32
  "@midwayjs/logger": "^2.15.0",
32
33
  "@types/amqplib": "0.8.2",
33
- "amqplib": "0.8.0",
34
+ "amqplib": "0.10.0",
35
+ "kafkajs": "1.16.0",
34
36
  "socket.io": "4.4.1",
35
37
  "socket.io-client": "4.4.1",
36
- "ws": "8.5.0"
38
+ "ws": "8.8.1"
37
39
  },
38
40
  "dependencies": {
39
- "@types/supertest": "2.0.11",
41
+ "@midwayjs/async-hooks-context-manager": "^3.4.0-beta.11",
42
+ "@types/supertest": "2.0.12",
40
43
  "fs-extra": "10.0.1",
41
- "supertest": "6.2.2"
44
+ "js-yaml": "4.1.0",
45
+ "raw-body": "2.5.1",
46
+ "supertest": "6.2.4"
42
47
  },
43
48
  "author": "Harry Chen <czy88840616@gmail.com>",
44
49
  "repository": {
45
50
  "type": "git",
46
51
  "url": "http://github.com/midwayjs/midway.git"
47
52
  },
48
- "gitHead": "5a835008aaa26e1b3c7d99c525f4a9fdaa3e41d1"
53
+ "gitHead": "b1c7a439b0df37d3e381cd182ea3b9e74323107b"
49
54
  }
package/ssl/ssl.key ADDED
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEpAIBAAKCAQEAwYgqylPquhc3d5E75sLxUs7jhxuIfMztx3H449KC7kT9+ukS
3
+ bdB/IqwRcLgB/n2V4+pkEjOHG2K/ErHkaOdw7L4tf8wNLMSUbCNlppYcZ6EGuSWN
4
+ V80GZREFifKu+Q3jMEX3K96lS5pmBoYQHr2iqejtb1bmN9yeeI4FuOlm+hHc6zBD
5
+ 87rABjxgITybxDt+wffbfqSkjBrQCDjqeNn6m5n5OmO1lBdn6fAOJe7krp9bG4Mq
6
+ Z32Zo/anqEq60KjfuCFvp03CU8MOBbEYGxMtfUMooEQatEuiTTx03vkYbmg6ymGq
7
+ 9g8YQCHcL0nel/+aCx0CU7ALo4OCX8k+Wxk76QIDAQABAoIBAAKy9XXQ6csim8Ft
8
+ Ixq6yUbQX9f4iFTFPuOzMTdsLitIhwpCyeECMWO4Zp3d0xlLgxWkpTSjx1SYcfW+
9
+ yWK1J5wFovjPTbe8Hh3L+JT0Lv06/68BWRFKaLZsIFmmKs6KZQq9Tw8rkb6WLqoU
10
+ oJDtMCGSgA03dwp8ZzFjOa00hB0ksF8LFJtf1kDAbUu9NF6hI738pKhZ/nmdglpy
11
+ 9csHopZRqmfisGAukQcTbppJ+m4+QZh7nq8tWGnkvBxfABJy9oAm18SZgDU6yUGA
12
+ Mxx4tuUDmdmKZxtKuktvJoX0sYwid2DoKPwDNr8N+CRR3zm9p1SFt031LT2GJOfx
13
+ qlns7QECgYEA/bGOOYyLGvBSGQOnq4YzQjb+4mw6DWbMfssFg9k3udzGZPQYD1fD
14
+ bL71/Xym7zct1x/ECGVejyPSrCG8mF5zmiIEK5uLmYQzBZeEcoQTQMG7nR7+pIaL
15
+ l915wct0HMY8lfXGXQ845rpRRQIvMV88KYD8SjGJselCVgZ8ZwQbeTECgYEAw0qX
16
+ fsrF4EyfM3aCbBZlroDIDqPhHbJ5damBwe9WvI6UovcBEqprK3FuHIDJKGFnekDe
17
+ LP0SRYg4tTGoVrJWncgnXxcqr5u/gwdBM6+yPOninIz22xiCiY0LiMDVOiogk6QA
18
+ Ko/0OvhzRDB2HM4VfEEDFBfujr938y+v6NHfQDkCgYEA9BnrIn6TvmjsZbs5kvX+
19
+ zkCCgbTnKsv2Ci4o8VOJpiHDF5IysFie5jzcDnrpWRU721lqUzXOhWZPqGaRw/5l
20
+ tzHx10/ERAOK4F+JBnME33NJpYYUOJRpLsfhBtJPt/wagaRJqHMkKgWuevr+E8Bx
21
+ 7/F3T6BYwEIUHRgCjVDLapECgYEAkkXJaNd6FIFvcL1f/JNd/7FHpueKUpL+NGoM
22
+ 3XRl0/87R0CY1iE8+iIQplqz0IH8Xm49uxamW9wnFVgnTSBwjed/zdJtT3DppbuG
23
+ U69SYhuQd0+CCiK2i05QiFJeox0wn0TkNvzxokW7GCTwIq0dHJ8ZLjCqptK0hjp+
24
+ mHSxsckCgYBm/UjNqszQhFr84T3KHZqHr/A/057NlzEILek4Z8QRnlsO26RYVnUI
25
+ u/a1E0ZLltD31J9gtR3TuBvbRdphHsHMDf0Jz5wh0h2WCeJ0UcjrspWS6oD0eNI3
26
+ dRHiMGdYq3Toz8cmi1AQl63P2f3ICFSVW6d4cA6rOIwBGAB3fX8xKw==
27
+ -----END RSA PRIVATE KEY-----
package/ssl/ssl.pem ADDED
@@ -0,0 +1,23 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDzDCCArSgAwIBAgIQLIM+LwmyRiGVIJqA5gR0/TANBgkqhkiG9w0BAQsFADBe
3
+ MQswCQYDVQQGEwJDTjEOMAwGA1UEChMFTXlTU0wxKzApBgNVBAsTIk15U1NMIFRl
4
+ c3QgUlNBIC0gRm9yIHRlc3QgdXNlIG9ubHkxEjAQBgNVBAMTCU15U1NMLmNvbTAe
5
+ Fw0yMTA3MTUxMDAyNDhaFw0yNjA3MTQxMDAyNDhaMBsxCzAJBgNVBAYTAkNOMQww
6
+ CgYDVQQDDAMqLiowggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBiCrK
7
+ U+q6Fzd3kTvmwvFSzuOHG4h8zO3Hcfjj0oLuRP366RJt0H8irBFwuAH+fZXj6mQS
8
+ M4cbYr8SseRo53Dsvi1/zA0sxJRsI2WmlhxnoQa5JY1XzQZlEQWJ8q75DeMwRfcr
9
+ 3qVLmmYGhhAevaKp6O1vVuY33J54jgW46Wb6EdzrMEPzusAGPGAhPJvEO37B99t+
10
+ pKSMGtAIOOp42fqbmfk6Y7WUF2fp8A4l7uSun1sbgypnfZmj9qeoSrrQqN+4IW+n
11
+ TcJTww4FsRgbEy19QyigRBq0S6JNPHTe+RhuaDrKYar2DxhAIdwvSd6X/5oLHQJT
12
+ sAujg4JfyT5bGTvpAgMBAAGjgcgwgcUwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQW
13
+ MBQGCCsGAQUFBwMBBggrBgEFBQcDAjAfBgNVHSMEGDAWgBQogSYF0TQaP8FzD7uT
14
+ zxUcPwO/fzBjBggrBgEFBQcBAQRXMFUwIQYIKwYBBQUHMAGGFWh0dHA6Ly9vY3Nw
15
+ Lm15c3NsLmNvbTAwBggrBgEFBQcwAoYkaHR0cDovL2NhLm15c3NsLmNvbS9teXNz
16
+ bHRlc3Ryc2EuY3J0MA4GA1UdEQQHMAWCAyouKjANBgkqhkiG9w0BAQsFAAOCAQEA
17
+ czI451YuJJFtHZOsZxQieC8ptBVTPrZA8Heg/eDc8yN3wwSt3+Y7/WKoUtteh1r6
18
+ Z+LK75+OYu4zsocyS5eXRIan9BZryuz6CW7aq/2CnsQbmISR5LsBw1pMqFXnM6Im
19
+ CJCTOB3a4rhp7BiJ7WO0dfBCugJe92dhMnXd4GW8lwwaUmz0ULLIqdcNR4gT0FRl
20
+ c9yUSkksPJLP2bSRvKDZhn+CVUnQWmWf91EqMGPlnCYsQ/0NYtKUrhH5O2TrNeLu
21
+ eBpVEQxzMkrxvDFkDQVLi3/lvfLFJzDws3wRMNT+llCQ9VpEJJ2G8halGL1nJlZN
22
+ mGVxt9xF9c18LZTCNamHGA==
23
+ -----END CERTIFICATE-----