@mecanizou/telemetry-hub 1.0.0 → 1.0.2
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.
- package/.github/workflows/pull_request.yml +32 -32
- package/.github/workflows/release.yml +129 -129
- package/.prettierignore +4 -4
- package/CHANGELOG.md +14 -0
- package/DOCS_GUIDE.md +151 -0
- package/README.md +248 -0
- package/dist/core/__tests__/logger-types.test.d.ts +1 -0
- package/dist/core/__tests__/logger-types.test.js +325 -0
- package/dist/core/__tests__/logger.test.d.ts +1 -0
- package/dist/core/__tests__/logger.test.js +337 -0
- package/dist/core/__tests__/tracer.test.d.ts +1 -0
- package/dist/core/__tests__/tracer.test.js +330 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +8 -0
- package/dist/core/logger-types.d.ts +43 -0
- package/dist/core/logger-types.js +3 -0
- package/dist/core/logger.d.ts +13 -0
- package/dist/core/logger.js +123 -0
- package/dist/core/tracer-types.d.ts +50 -0
- package/dist/core/tracer-types.js +3 -0
- package/dist/core/tracer.d.ts +10 -0
- package/dist/core/tracer.js +114 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +4 -2
- package/dist/sst/__tests__/telemetry.test.d.ts +1 -0
- package/dist/sst/__tests__/telemetry.test.js +138 -0
- package/dist/sst/index.d.ts +1 -0
- package/dist/sst/index.js +18 -0
- package/dist/sst/middy/index.d.ts +1 -0
- package/dist/sst/middy/index.js +18 -0
- package/dist/sst/middy/middleware.d.ts +5 -0
- package/dist/sst/middy/middleware.js +157 -0
- package/dist/sst/telemetry.d.ts +4 -0
- package/dist/sst/telemetry.js +121 -0
- package/dist/telemetry/core/__tests__/logger-types.test.d.ts +1 -0
- package/dist/telemetry/core/__tests__/logger-types.test.js +325 -0
- package/dist/telemetry/core/__tests__/logger.test.d.ts +1 -0
- package/dist/telemetry/core/__tests__/logger.test.js +337 -0
- package/dist/telemetry/core/__tests__/tracer.test.d.ts +1 -0
- package/dist/telemetry/core/__tests__/tracer.test.js +330 -0
- package/dist/telemetry/core/index.d.ts +4 -0
- package/dist/telemetry/core/index.js +8 -0
- package/dist/telemetry/core/logger-types.d.ts +43 -0
- package/dist/telemetry/core/logger-types.js +3 -0
- package/dist/telemetry/core/logger.d.ts +13 -0
- package/dist/telemetry/core/logger.js +123 -0
- package/dist/telemetry/core/tracer-types.d.ts +50 -0
- package/dist/telemetry/core/tracer-types.js +3 -0
- package/dist/telemetry/core/tracer.d.ts +10 -0
- package/dist/telemetry/core/tracer.js +114 -0
- package/dist/telemetry/index.d.ts +3 -0
- package/dist/telemetry/index.js +20 -0
- package/dist/telemetry/sst/__tests__/telemetry.test.d.ts +1 -0
- package/dist/telemetry/sst/__tests__/telemetry.test.js +138 -0
- package/dist/telemetry/sst/index.d.ts +1 -0
- package/dist/telemetry/sst/index.js +18 -0
- package/dist/telemetry/sst/middy/index.d.ts +1 -0
- package/dist/telemetry/sst/middy/index.js +18 -0
- package/dist/telemetry/sst/middy/middleware.d.ts +5 -0
- package/dist/telemetry/sst/middy/middleware.js +157 -0
- package/dist/telemetry/sst/telemetry.d.ts +4 -0
- package/dist/telemetry/sst/telemetry.js +121 -0
- package/dist/telemetry/tsed/__tests__/config.test.d.ts +1 -0
- package/dist/telemetry/tsed/__tests__/config.test.js +146 -0
- package/dist/telemetry/tsed/__tests__/service.test.d.ts +1 -0
- package/dist/telemetry/tsed/__tests__/service.test.js +63 -0
- package/dist/telemetry/tsed/config.d.ts +26 -0
- package/dist/telemetry/tsed/config.js +166 -0
- package/dist/telemetry/tsed/index.d.ts +4 -0
- package/dist/telemetry/tsed/index.js +21 -0
- package/dist/telemetry/tsed/log-telemetry.d.ts +1 -0
- package/dist/telemetry/tsed/log-telemetry.js +196 -0
- package/dist/telemetry/tsed/service.d.ts +26 -0
- package/dist/telemetry/tsed/service.js +150 -0
- package/dist/telemetry/tsed/sync-log-record-processor.d.ts +11 -0
- package/dist/telemetry/tsed/sync-log-record-processor.js +74 -0
- package/dist/tsed/__tests__/config.test.d.ts +1 -0
- package/dist/tsed/__tests__/config.test.js +146 -0
- package/dist/tsed/__tests__/service.test.d.ts +1 -0
- package/dist/tsed/__tests__/service.test.js +63 -0
- package/dist/tsed/config.d.ts +26 -0
- package/dist/tsed/config.js +166 -0
- package/dist/tsed/index.d.ts +4 -0
- package/dist/tsed/index.js +21 -0
- package/dist/tsed/log-telemetry.d.ts +1 -0
- package/dist/tsed/log-telemetry.js +196 -0
- package/dist/tsed/service.d.ts +26 -0
- package/dist/tsed/service.js +150 -0
- package/dist/tsed/sync-log-record-processor.d.ts +11 -0
- package/dist/tsed/sync-log-record-processor.js +74 -0
- package/package.json +72 -56
- package/release.config.js +23 -23
- package/vitest.config.ts +22 -0
- package/dist/check-if-is-working.d.ts +0 -1
- package/dist/check-if-is-working.js +0 -8
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const vitest_1 = require("vitest");
|
|
13
|
+
const logger_1 = require("../logger");
|
|
14
|
+
const api_logs_1 = require("@opentelemetry/api-logs");
|
|
15
|
+
(0, vitest_1.describe)('StandardLogger', () => {
|
|
16
|
+
let mockLogger;
|
|
17
|
+
let standardLogger;
|
|
18
|
+
(0, vitest_1.beforeEach)(() => {
|
|
19
|
+
mockLogger = {
|
|
20
|
+
emit: vitest_1.vi.fn(),
|
|
21
|
+
};
|
|
22
|
+
standardLogger = new logger_1.StandardLogger(mockLogger, 'test-service');
|
|
23
|
+
});
|
|
24
|
+
(0, vitest_1.describe)('logError', () => {
|
|
25
|
+
(0, vitest_1.it)('deve emitir log com severity ERROR', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
26
|
+
const errorData = {
|
|
27
|
+
message: 'Test error message',
|
|
28
|
+
serviceName: 'test-service',
|
|
29
|
+
environment: 'test',
|
|
30
|
+
};
|
|
31
|
+
yield standardLogger.logError(errorData);
|
|
32
|
+
(0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
|
|
33
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
34
|
+
(0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.ERROR);
|
|
35
|
+
(0, vitest_1.expect)(emittedLog.severityText).toBe('ERROR');
|
|
36
|
+
(0, vitest_1.expect)(emittedLog.body).toBe('Test error message');
|
|
37
|
+
}));
|
|
38
|
+
(0, vitest_1.it)('deve incluir informações do erro quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
39
|
+
const error = new Error('Custom error');
|
|
40
|
+
const errorData = {
|
|
41
|
+
message: 'Error occurred',
|
|
42
|
+
error,
|
|
43
|
+
serviceName: 'test-service',
|
|
44
|
+
environment: 'production',
|
|
45
|
+
};
|
|
46
|
+
yield standardLogger.logError(errorData);
|
|
47
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
48
|
+
(0, vitest_1.expect)(emittedLog.attributes['error.type']).toBe('Error');
|
|
49
|
+
(0, vitest_1.expect)(emittedLog.attributes['error.message']).toBe('Custom error');
|
|
50
|
+
(0, vitest_1.expect)(emittedLog.attributes['error.stack']).toBeDefined();
|
|
51
|
+
}));
|
|
52
|
+
(0, vitest_1.it)('deve incluir contexto HTTP quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
53
|
+
const errorData = {
|
|
54
|
+
message: 'HTTP error',
|
|
55
|
+
serviceName: 'test-service',
|
|
56
|
+
environment: 'production',
|
|
57
|
+
http: {
|
|
58
|
+
method: 'POST',
|
|
59
|
+
url: '/api/test',
|
|
60
|
+
endpoint: '/api/test',
|
|
61
|
+
statusCode: 500,
|
|
62
|
+
headers: { 'content-type': 'application/json' },
|
|
63
|
+
body: { test: 'data' },
|
|
64
|
+
params: { id: '123' },
|
|
65
|
+
query: { filter: 'active' },
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
yield standardLogger.logError(errorData);
|
|
69
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
70
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.method']).toBe('POST');
|
|
71
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.url']).toBe('/api/test');
|
|
72
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.endpoint']).toBe('/api/test');
|
|
73
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.status_code']).toBe(500);
|
|
74
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.headers']).toBe(JSON.stringify({ 'content-type': 'application/json' }));
|
|
75
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.body']).toBe(JSON.stringify({ test: 'data' }));
|
|
76
|
+
}));
|
|
77
|
+
(0, vitest_1.it)('deve incluir informações de usuário quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
78
|
+
const errorData = {
|
|
79
|
+
message: 'User error',
|
|
80
|
+
serviceName: 'test-service',
|
|
81
|
+
environment: 'production',
|
|
82
|
+
user: {
|
|
83
|
+
accountUserUid: 'user-123',
|
|
84
|
+
accountUid: 'account-456',
|
|
85
|
+
applicationUid: 'app-789',
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
yield standardLogger.logError(errorData);
|
|
89
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
90
|
+
(0, vitest_1.expect)(emittedLog.attributes['accountUser.uid']).toBe('user-123');
|
|
91
|
+
(0, vitest_1.expect)(emittedLog.attributes['account.uid']).toBe('account-456');
|
|
92
|
+
(0, vitest_1.expect)(emittedLog.attributes['application.uid']).toBe('app-789');
|
|
93
|
+
}));
|
|
94
|
+
(0, vitest_1.it)('deve incluir informações de execução quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
95
|
+
const errorData = {
|
|
96
|
+
message: 'Execution error',
|
|
97
|
+
serviceName: 'test-service',
|
|
98
|
+
environment: 'production',
|
|
99
|
+
execution: {
|
|
100
|
+
requestId: 'req-123',
|
|
101
|
+
awsRequestId: 'aws-456',
|
|
102
|
+
functionName: 'testFunction',
|
|
103
|
+
invocationId: 'inv-789',
|
|
104
|
+
controller: 'TestController',
|
|
105
|
+
controllerMethod: 'testMethod',
|
|
106
|
+
origin: 'mobile',
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
yield standardLogger.logError(errorData);
|
|
110
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
111
|
+
(0, vitest_1.expect)(emittedLog.attributes['request.id']).toBe('req-123');
|
|
112
|
+
(0, vitest_1.expect)(emittedLog.attributes['aws.request.id']).toBe('aws-456');
|
|
113
|
+
(0, vitest_1.expect)(emittedLog.attributes['faas.name']).toBe('testFunction');
|
|
114
|
+
(0, vitest_1.expect)(emittedLog.attributes['faas.invocation_id']).toBe('inv-789');
|
|
115
|
+
(0, vitest_1.expect)(emittedLog.attributes['controller.name']).toBe('TestController');
|
|
116
|
+
(0, vitest_1.expect)(emittedLog.attributes['controller.method']).toBe('testMethod');
|
|
117
|
+
(0, vitest_1.expect)(emittedLog.attributes['origin']).toBe('mobile');
|
|
118
|
+
}));
|
|
119
|
+
(0, vitest_1.it)('deve incluir métricas de performance quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
120
|
+
const errorData = {
|
|
121
|
+
message: 'Performance error',
|
|
122
|
+
serviceName: 'test-service',
|
|
123
|
+
environment: 'production',
|
|
124
|
+
performance: {
|
|
125
|
+
durationMs: 1500,
|
|
126
|
+
success: false,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
yield standardLogger.logError(errorData);
|
|
130
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
131
|
+
(0, vitest_1.expect)(emittedLog.attributes['duration.ms']).toBe(1500);
|
|
132
|
+
(0, vitest_1.expect)(emittedLog.attributes['execution.success']).toBe(false);
|
|
133
|
+
}));
|
|
134
|
+
(0, vitest_1.it)('deve incluir contexto adicional quando fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
135
|
+
const errorData = {
|
|
136
|
+
message: 'Context error',
|
|
137
|
+
serviceName: 'test-service',
|
|
138
|
+
environment: 'production',
|
|
139
|
+
context: {
|
|
140
|
+
additionalInfo: 'some data',
|
|
141
|
+
nested: { value: 123 },
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
yield standardLogger.logError(errorData);
|
|
145
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
146
|
+
(0, vitest_1.expect)(emittedLog.attributes['context']).toBe(JSON.stringify({ additionalInfo: 'some data', nested: { value: 123 } }));
|
|
147
|
+
}));
|
|
148
|
+
(0, vitest_1.it)('deve usar serviceName padrão quando não fornecido', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
149
|
+
const errorData = {
|
|
150
|
+
message: 'Default service error',
|
|
151
|
+
serviceName: '',
|
|
152
|
+
environment: 'production',
|
|
153
|
+
};
|
|
154
|
+
yield standardLogger.logError(errorData);
|
|
155
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
156
|
+
(0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('test-service');
|
|
157
|
+
}));
|
|
158
|
+
(0, vitest_1.it)('deve adicionar timestamp automaticamente', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
159
|
+
const errorData = {
|
|
160
|
+
message: 'Timestamp test',
|
|
161
|
+
serviceName: 'test-service',
|
|
162
|
+
environment: 'production',
|
|
163
|
+
};
|
|
164
|
+
yield standardLogger.logError(errorData);
|
|
165
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
166
|
+
(0, vitest_1.expect)(emittedLog.attributes['timestamp']).toBeDefined();
|
|
167
|
+
(0, vitest_1.expect)(emittedLog.attributes['timestamp']).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/);
|
|
168
|
+
}));
|
|
169
|
+
(0, vitest_1.it)('deve filtrar valores undefined e null dos atributos', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
170
|
+
const errorData = {
|
|
171
|
+
message: 'Filter test',
|
|
172
|
+
serviceName: 'test-service',
|
|
173
|
+
environment: 'production',
|
|
174
|
+
user: {
|
|
175
|
+
accountUserUid: 'user-123',
|
|
176
|
+
accountUid: undefined,
|
|
177
|
+
applicationUid: undefined,
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
yield standardLogger.logError(errorData);
|
|
181
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
182
|
+
(0, vitest_1.expect)(emittedLog.attributes['accountUser.uid']).toBe('user-123');
|
|
183
|
+
(0, vitest_1.expect)(emittedLog.attributes['account.uid']).toBeUndefined();
|
|
184
|
+
(0, vitest_1.expect)(emittedLog.attributes['application.uid']).toBeUndefined();
|
|
185
|
+
}));
|
|
186
|
+
});
|
|
187
|
+
(0, vitest_1.describe)('logInfo', () => {
|
|
188
|
+
(0, vitest_1.it)('deve emitir log com severity INFO', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
189
|
+
const infoData = {
|
|
190
|
+
message: 'Info message',
|
|
191
|
+
serviceName: 'test-service',
|
|
192
|
+
environment: 'production',
|
|
193
|
+
};
|
|
194
|
+
yield standardLogger.logInfo(infoData);
|
|
195
|
+
(0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
|
|
196
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
197
|
+
(0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.INFO);
|
|
198
|
+
(0, vitest_1.expect)(emittedLog.severityText).toBe('INFO');
|
|
199
|
+
(0, vitest_1.expect)(emittedLog.body).toBe('Info message');
|
|
200
|
+
}));
|
|
201
|
+
(0, vitest_1.it)('deve incluir dados de performance em log de sucesso', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
202
|
+
const infoData = {
|
|
203
|
+
message: 'Request completed',
|
|
204
|
+
serviceName: 'test-service',
|
|
205
|
+
environment: 'production',
|
|
206
|
+
performance: {
|
|
207
|
+
durationMs: 250,
|
|
208
|
+
success: true,
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
yield standardLogger.logInfo(infoData);
|
|
212
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
213
|
+
(0, vitest_1.expect)(emittedLog.attributes['duration.ms']).toBe(250);
|
|
214
|
+
(0, vitest_1.expect)(emittedLog.attributes['execution.success']).toBe(true);
|
|
215
|
+
}));
|
|
216
|
+
});
|
|
217
|
+
(0, vitest_1.describe)('logWarn', () => {
|
|
218
|
+
(0, vitest_1.it)('deve emitir log com severity WARN', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
219
|
+
const warnData = {
|
|
220
|
+
message: 'Warning message',
|
|
221
|
+
serviceName: 'test-service',
|
|
222
|
+
environment: 'production',
|
|
223
|
+
};
|
|
224
|
+
yield standardLogger.logWarn(warnData);
|
|
225
|
+
(0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
|
|
226
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
227
|
+
(0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.WARN);
|
|
228
|
+
(0, vitest_1.expect)(emittedLog.severityText).toBe('WARN');
|
|
229
|
+
(0, vitest_1.expect)(emittedLog.body).toBe('Warning message');
|
|
230
|
+
}));
|
|
231
|
+
});
|
|
232
|
+
(0, vitest_1.describe)('logDebug', () => {
|
|
233
|
+
(0, vitest_1.it)('deve emitir log com severity DEBUG', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
234
|
+
const debugData = {
|
|
235
|
+
message: 'Debug message',
|
|
236
|
+
serviceName: 'test-service',
|
|
237
|
+
environment: 'development',
|
|
238
|
+
};
|
|
239
|
+
yield standardLogger.logDebug(debugData);
|
|
240
|
+
(0, vitest_1.expect)(mockLogger.emit).toHaveBeenCalledTimes(1);
|
|
241
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
242
|
+
(0, vitest_1.expect)(emittedLog.severityNumber).toBe(api_logs_1.SeverityNumber.DEBUG);
|
|
243
|
+
(0, vitest_1.expect)(emittedLog.severityText).toBe('DEBUG');
|
|
244
|
+
(0, vitest_1.expect)(emittedLog.body).toBe('Debug message');
|
|
245
|
+
}));
|
|
246
|
+
});
|
|
247
|
+
(0, vitest_1.describe)('buildAttributes', () => {
|
|
248
|
+
(0, vitest_1.it)('deve construir atributos completos com todos os campos', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
249
|
+
const fullData = {
|
|
250
|
+
message: 'Complete log',
|
|
251
|
+
serviceName: 'complete-service',
|
|
252
|
+
environment: 'production',
|
|
253
|
+
error: new Error('Test error'),
|
|
254
|
+
http: {
|
|
255
|
+
method: 'GET',
|
|
256
|
+
url: '/api/users',
|
|
257
|
+
endpoint: '/api/users',
|
|
258
|
+
statusCode: 200,
|
|
259
|
+
},
|
|
260
|
+
user: {
|
|
261
|
+
accountUserUid: 'user-abc',
|
|
262
|
+
accountUid: 'account-xyz',
|
|
263
|
+
applicationUid: 'app-123',
|
|
264
|
+
},
|
|
265
|
+
execution: {
|
|
266
|
+
requestId: 'req-001',
|
|
267
|
+
awsRequestId: 'aws-002',
|
|
268
|
+
functionName: 'getUsers',
|
|
269
|
+
invocationId: 'inv-003',
|
|
270
|
+
controller: 'UserController',
|
|
271
|
+
controllerMethod: 'getAll',
|
|
272
|
+
origin: 'web',
|
|
273
|
+
},
|
|
274
|
+
performance: {
|
|
275
|
+
durationMs: 300,
|
|
276
|
+
success: true,
|
|
277
|
+
},
|
|
278
|
+
context: {
|
|
279
|
+
custom: 'data',
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
yield standardLogger.logInfo(fullData);
|
|
283
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
284
|
+
const attrs = emittedLog.attributes;
|
|
285
|
+
(0, vitest_1.expect)(attrs['service.name']).toBe('complete-service');
|
|
286
|
+
(0, vitest_1.expect)(attrs['deployment.environment.name']).toBe('production');
|
|
287
|
+
(0, vitest_1.expect)(attrs['error.type']).toBe('Error');
|
|
288
|
+
(0, vitest_1.expect)(attrs['http.method']).toBe('GET');
|
|
289
|
+
(0, vitest_1.expect)(attrs['accountUser.uid']).toBe('user-abc');
|
|
290
|
+
(0, vitest_1.expect)(attrs['request.id']).toBe('req-001');
|
|
291
|
+
(0, vitest_1.expect)(attrs['duration.ms']).toBe(300);
|
|
292
|
+
(0, vitest_1.expect)(attrs['context']).toBe(JSON.stringify({ custom: 'data' }));
|
|
293
|
+
}));
|
|
294
|
+
(0, vitest_1.it)('deve lidar com campos HTTP parciais', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
295
|
+
const partialHttpData = {
|
|
296
|
+
message: 'Partial HTTP',
|
|
297
|
+
serviceName: 'test-service',
|
|
298
|
+
environment: 'production',
|
|
299
|
+
http: {
|
|
300
|
+
method: 'POST',
|
|
301
|
+
endpoint: '/api/test',
|
|
302
|
+
},
|
|
303
|
+
};
|
|
304
|
+
yield standardLogger.logInfo(partialHttpData);
|
|
305
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
306
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.method']).toBe('POST');
|
|
307
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.endpoint']).toBe('/api/test');
|
|
308
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.url']).toBeUndefined();
|
|
309
|
+
(0, vitest_1.expect)(emittedLog.attributes['http.status_code']).toBeUndefined();
|
|
310
|
+
}));
|
|
311
|
+
});
|
|
312
|
+
(0, vitest_1.describe)('construtor', () => {
|
|
313
|
+
(0, vitest_1.it)('deve aceitar serviceName padrão personalizado', () => {
|
|
314
|
+
const customLogger = new logger_1.StandardLogger(mockLogger, 'custom-service');
|
|
315
|
+
const logData = {
|
|
316
|
+
message: 'Test',
|
|
317
|
+
serviceName: '',
|
|
318
|
+
environment: 'test',
|
|
319
|
+
};
|
|
320
|
+
customLogger.logInfo(logData);
|
|
321
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
322
|
+
(0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('custom-service');
|
|
323
|
+
});
|
|
324
|
+
(0, vitest_1.it)('deve usar "unknown-service" como padrão quando não especificado', () => {
|
|
325
|
+
const defaultLogger = new logger_1.StandardLogger(mockLogger);
|
|
326
|
+
const logData = {
|
|
327
|
+
message: 'Test',
|
|
328
|
+
serviceName: '',
|
|
329
|
+
environment: 'test',
|
|
330
|
+
};
|
|
331
|
+
defaultLogger.logInfo(logData);
|
|
332
|
+
const emittedLog = mockLogger.emit.mock.calls[0][0];
|
|
333
|
+
(0, vitest_1.expect)(emittedLog.attributes['service.name']).toBe('unknown-service');
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVsZW1ldHJ5L2NvcmUvX190ZXN0c19fL2xvZ2dlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsbUNBQThEO0FBQzlELHNDQUEyQztBQUMzQyxzREFBeUQ7QUFFekQsSUFBQSxpQkFBUSxFQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixJQUFJLFVBQWUsQ0FBQztJQUNwQixJQUFJLGNBQThCLENBQUM7SUFFbkMsSUFBQSxtQkFBVSxFQUFDLEdBQUcsRUFBRTtRQUNkLFVBQVUsR0FBRztZQUNYLElBQUksRUFBRSxXQUFFLENBQUMsRUFBRSxFQUFFO1NBQ2QsQ0FBQztRQUNGLGNBQWMsR0FBRyxJQUFJLHVCQUFjLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxpQkFBUSxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7UUFDeEIsSUFBQSxXQUFFLEVBQUMsb0NBQW9DLEVBQUUsR0FBUyxFQUFFO1lBQ2xELE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsb0JBQW9CO2dCQUM3QixXQUFXLEVBQUUsY0FBYztnQkFDM0IsV0FBVyxFQUFFLE1BQU07YUFDcEIsQ0FBQztZQUVGLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV6QyxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUEsQ0FBQyxDQUFDO1FBRUgsSUFBQSxXQUFFLEVBQUMsbURBQW1ELEVBQUUsR0FBUyxFQUFFO1lBQ2pFLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsZ0JBQWdCO2dCQUN6QixLQUFLO2dCQUNMLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsWUFBWTthQUMxQixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDcEUsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdELENBQUMsQ0FBQSxDQUFDLENBQUM7UUFFSCxJQUFBLFdBQUUsRUFBQyw2Q0FBNkMsRUFBRSxHQUFTLEVBQUU7WUFDM0QsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLE9BQU8sRUFBRSxZQUFZO2dCQUNyQixXQUFXLEVBQUUsY0FBYztnQkFDM0IsV0FBVyxFQUFFLFlBQVk7Z0JBQ3pCLElBQUksRUFBRTtvQkFDSixNQUFNLEVBQUUsTUFBTTtvQkFDZCxHQUFHLEVBQUUsV0FBVztvQkFDaEIsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLFVBQVUsRUFBRSxHQUFHO29CQUNmLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtvQkFDL0MsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtvQkFDdEIsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRTtvQkFDckIsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtpQkFDNUI7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRSxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQ3ZELENBQUM7WUFDRixJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQ2pDLENBQUM7UUFDSixDQUFDLENBQUEsQ0FBQyxDQUFDO1FBRUgsSUFBQSxXQUFFLEVBQUMsc0RBQXNELEVBQUUsR0FBUyxFQUFFO1lBQ3BFLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsWUFBWTtnQkFDckIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2dCQUN6QixJQUFJLEVBQUU7b0JBQ0osY0FBYyxFQUFFLFVBQVU7b0JBQzFCLFVBQVUsRUFBRSxhQUFhO29CQUN6QixjQUFjLEVBQUUsU0FBUztpQkFDMUI7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEUsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNqRSxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUEsV0FBRSxFQUFDLHVEQUF1RCxFQUFFLEdBQVMsRUFBRTtZQUNyRSxNQUFNLFNBQVMsR0FBRztnQkFDaEIsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2dCQUN6QixTQUFTLEVBQUU7b0JBQ1QsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLFlBQVksRUFBRSxTQUFTO29CQUN2QixZQUFZLEVBQUUsY0FBYztvQkFDNUIsWUFBWSxFQUFFLFNBQVM7b0JBQ3ZCLFVBQVUsRUFBRSxnQkFBZ0I7b0JBQzVCLGdCQUFnQixFQUFFLFlBQVk7b0JBQzlCLE1BQU0sRUFBRSxRQUFRO2lCQUNqQjthQUNGLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFekMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hFLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEUsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BFLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3hFLElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN0RSxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQSxDQUFDLENBQUM7UUFFSCxJQUFBLFdBQUUsRUFBQyx1REFBdUQsRUFBRSxHQUFTLEVBQUU7WUFDckUsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLE9BQU8sRUFBRSxtQkFBbUI7Z0JBQzVCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsV0FBVyxFQUFFO29CQUNYLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsS0FBSztpQkFDZjthQUNGLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFekMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQSxDQUFDLENBQUM7UUFFSCxJQUFBLFdBQUUsRUFBQyxrREFBa0QsRUFBRSxHQUFTLEVBQUU7WUFDaEUsTUFBTSxTQUFTLEdBQUc7Z0JBQ2hCLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixXQUFXLEVBQUUsY0FBYztnQkFDM0IsV0FBVyxFQUFFLFlBQVk7Z0JBQ3pCLE9BQU8sRUFBRTtvQkFDUCxjQUFjLEVBQUUsV0FBVztvQkFDM0IsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtpQkFDdkI7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUN4RSxDQUFDO1FBQ0osQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUEsV0FBRSxFQUFDLG1EQUFtRCxFQUFFLEdBQVMsRUFBRTtZQUNqRSxNQUFNLFNBQVMsR0FBRztnQkFDaEIsT0FBTyxFQUFFLHVCQUF1QjtnQkFDaEMsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsV0FBVyxFQUFFLFlBQVk7YUFDMUIsQ0FBQztZQUVGLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV6QyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUEsQ0FBQyxDQUFDO1FBRUgsSUFBQSxXQUFFLEVBQUMsMENBQTBDLEVBQUUsR0FBUyxFQUFFO1lBQ3hELE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsZ0JBQWdCO2dCQUN6QixXQUFXLEVBQUUsY0FBYztnQkFDM0IsV0FBVyxFQUFFLFlBQVk7YUFDMUIsQ0FBQztZQUVGLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUV6QyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQ2hELCtDQUErQyxDQUNoRCxDQUFDO1FBQ0osQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUEsV0FBRSxFQUFDLHFEQUFxRCxFQUFFLEdBQVMsRUFBRTtZQUNuRSxNQUFNLFNBQVMsR0FBRztnQkFDaEIsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsSUFBSSxFQUFFO29CQUNKLGNBQWMsRUFBRSxVQUFVO29CQUMxQixVQUFVLEVBQUUsU0FBZ0I7b0JBQzVCLGNBQWMsRUFBRSxTQUFnQjtpQkFDakM7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEUsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25FLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsaUJBQVEsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1FBQ3ZCLElBQUEsV0FBRSxFQUFDLG1DQUFtQyxFQUFFLEdBQVMsRUFBRTtZQUNqRCxNQUFNLFFBQVEsR0FBRztnQkFDZixPQUFPLEVBQUUsY0FBYztnQkFDdkIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2FBQzFCLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdkMsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQSxDQUFDLENBQUM7UUFFSCxJQUFBLFdBQUUsRUFBQyxxREFBcUQsRUFBRSxHQUFTLEVBQUU7WUFDbkUsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsT0FBTyxFQUFFLG1CQUFtQjtnQkFDNUIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2dCQUN6QixXQUFXLEVBQUU7b0JBQ1gsVUFBVSxFQUFFLEdBQUc7b0JBQ2YsT0FBTyxFQUFFLElBQUk7aUJBQ2Q7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXZDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUEsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGlCQUFRLEVBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtRQUN2QixJQUFBLFdBQUUsRUFBQyxtQ0FBbUMsRUFBRSxHQUFTLEVBQUU7WUFDakQsTUFBTSxRQUFRLEdBQUc7Z0JBQ2YsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxZQUFZO2FBQzFCLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFdkMsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxpQkFBUSxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7UUFDeEIsSUFBQSxXQUFFLEVBQUMsb0NBQW9DLEVBQUUsR0FBUyxFQUFFO1lBQ2xELE1BQU0sU0FBUyxHQUFHO2dCQUNoQixPQUFPLEVBQUUsZUFBZTtnQkFDeEIsV0FBVyxFQUFFLGNBQWM7Z0JBQzNCLFdBQVcsRUFBRSxhQUFhO2FBQzNCLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFekMsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLHlCQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0QsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QyxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsaUJBQVEsRUFBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsSUFBQSxXQUFFLEVBQUMsd0RBQXdELEVBQUUsR0FBUyxFQUFFO1lBQ3RFLE1BQU0sUUFBUSxHQUFHO2dCQUNmLE9BQU8sRUFBRSxjQUFjO2dCQUN2QixXQUFXLEVBQUUsa0JBQWtCO2dCQUMvQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQztnQkFDOUIsSUFBSSxFQUFFO29CQUNKLE1BQU0sRUFBRSxLQUFLO29CQUNiLEdBQUcsRUFBRSxZQUFZO29CQUNqQixRQUFRLEVBQUUsWUFBWTtvQkFDdEIsVUFBVSxFQUFFLEdBQUc7aUJBQ2hCO2dCQUNELElBQUksRUFBRTtvQkFDSixjQUFjLEVBQUUsVUFBVTtvQkFDMUIsVUFBVSxFQUFFLGFBQWE7b0JBQ3pCLGNBQWMsRUFBRSxTQUFTO2lCQUMxQjtnQkFDRCxTQUFTLEVBQUU7b0JBQ1QsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLFlBQVksRUFBRSxTQUFTO29CQUN2QixZQUFZLEVBQUUsVUFBVTtvQkFDeEIsWUFBWSxFQUFFLFNBQVM7b0JBQ3ZCLFVBQVUsRUFBRSxnQkFBZ0I7b0JBQzVCLGdCQUFnQixFQUFFLFFBQVE7b0JBQzFCLE1BQU0sRUFBRSxLQUFLO2lCQUNkO2dCQUNELFdBQVcsRUFBRTtvQkFDWCxVQUFVLEVBQUUsR0FBRztvQkFDZixPQUFPLEVBQUUsSUFBSTtpQkFDZDtnQkFDRCxPQUFPLEVBQUU7b0JBQ1AsTUFBTSxFQUFFLE1BQU07aUJBQ2Y7YUFDRixDQUFDO1lBRUYsTUFBTSxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXZDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1lBR3BDLElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZELElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hFLElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxJQUFBLGVBQU0sRUFBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBQSxlQUFNLEVBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEQsSUFBQSxlQUFNLEVBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVDLElBQUEsZUFBTSxFQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxJQUFBLGVBQU0sRUFBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFBLENBQUMsQ0FBQztRQUVILElBQUEsV0FBRSxFQUFDLHFDQUFxQyxFQUFFLEdBQVMsRUFBRTtZQUNuRCxNQUFNLGVBQWUsR0FBRztnQkFDdEIsT0FBTyxFQUFFLGNBQWM7Z0JBQ3ZCLFdBQVcsRUFBRSxjQUFjO2dCQUMzQixXQUFXLEVBQUUsWUFBWTtnQkFDekIsSUFBSSxFQUFFO29CQUNKLE1BQU0sRUFBRSxNQUFNO29CQUNkLFFBQVEsRUFBRSxXQUFXO2lCQUV0QjthQUNGLENBQUM7WUFFRixNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFOUMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZUFBTSxFQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRSxJQUFBLGVBQU0sRUFBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDMUQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDcEUsQ0FBQyxDQUFBLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxpQkFBUSxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUU7UUFDMUIsSUFBQSxXQUFFLEVBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUksdUJBQWMsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUN0RSxNQUFNLE9BQU8sR0FBRztnQkFDZCxPQUFPLEVBQUUsTUFBTTtnQkFDZixXQUFXLEVBQUUsRUFBRTtnQkFDZixXQUFXLEVBQUUsTUFBTTthQUNwQixDQUFDO1lBRUYsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU5QixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxXQUFFLEVBQUMsaUVBQWlFLEVBQUUsR0FBRyxFQUFFO1lBQ3pFLE1BQU0sYUFBYSxHQUFHLElBQUksdUJBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRCxNQUFNLE9BQU8sR0FBRztnQkFDZCxPQUFPLEVBQUUsTUFBTTtnQkFDZixXQUFXLEVBQUUsRUFBRTtnQkFDZixXQUFXLEVBQUUsTUFBTTthQUNwQixDQUFDO1lBRUYsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUUvQixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSxlQUFNLEVBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCwgZXhwZWN0LCB2aSwgYmVmb3JlRWFjaCB9IGZyb20gJ3ZpdGVzdCc7XHJcbmltcG9ydCB7IFN0YW5kYXJkTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyJztcclxuaW1wb3J0IHsgU2V2ZXJpdHlOdW1iZXIgfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGktbG9ncyc7XHJcblxyXG5kZXNjcmliZSgnU3RhbmRhcmRMb2dnZXInLCAoKSA9PiB7XHJcbiAgbGV0IG1vY2tMb2dnZXI6IGFueTtcclxuICBsZXQgc3RhbmRhcmRMb2dnZXI6IFN0YW5kYXJkTG9nZ2VyO1xyXG5cclxuICBiZWZvcmVFYWNoKCgpID0+IHtcclxuICAgIG1vY2tMb2dnZXIgPSB7XHJcbiAgICAgIGVtaXQ6IHZpLmZuKCksXHJcbiAgICB9O1xyXG4gICAgc3RhbmRhcmRMb2dnZXIgPSBuZXcgU3RhbmRhcmRMb2dnZXIobW9ja0xvZ2dlciwgJ3Rlc3Qtc2VydmljZScpO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnbG9nRXJyb3InLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBlbWl0aXIgbG9nIGNvbSBzZXZlcml0eSBFUlJPUicsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdUZXN0IGVycm9yIG1lc3NhZ2UnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Rlc3QnLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGV4cGVjdChtb2NrTG9nZ2VyLmVtaXQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5zZXZlcml0eU51bWJlcikudG9CZShTZXZlcml0eU51bWJlci5FUlJPUik7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5VGV4dCkudG9CZSgnRVJST1InKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYm9keSkudG9CZSgnVGVzdCBlcnJvciBtZXNzYWdlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIGluZm9ybWHDp8O1ZXMgZG8gZXJybyBxdWFuZG8gZm9ybmVjaWRvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignQ3VzdG9tIGVycm9yJyk7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnRXJyb3Igb2NjdXJyZWQnLFxyXG4gICAgICAgIGVycm9yLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snZXJyb3IudHlwZSddKS50b0JlKCdFcnJvcicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydlcnJvci5tZXNzYWdlJ10pLnRvQmUoJ0N1c3RvbSBlcnJvcicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydlcnJvci5zdGFjayddKS50b0JlRGVmaW5lZCgpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBjb250ZXh0byBIVFRQIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnSFRUUCBlcnJvcicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICB1cmw6ICcvYXBpL3Rlc3QnLFxyXG4gICAgICAgICAgZW5kcG9pbnQ6ICcvYXBpL3Rlc3QnLFxyXG4gICAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxyXG4gICAgICAgICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcbiAgICAgICAgICBib2R5OiB7IHRlc3Q6ICdkYXRhJyB9LFxyXG4gICAgICAgICAgcGFyYW1zOiB7IGlkOiAnMTIzJyB9LFxyXG4gICAgICAgICAgcXVlcnk6IHsgZmlsdGVyOiAnYWN0aXZlJyB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLm1ldGhvZCddKS50b0JlKCdQT1NUJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAudXJsJ10pLnRvQmUoJy9hcGkvdGVzdCcpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLmVuZHBvaW50J10pLnRvQmUoJy9hcGkvdGVzdCcpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLnN0YXR1c19jb2RlJ10pLnRvQmUoNTAwKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC5oZWFkZXJzJ10pLnRvQmUoXHJcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pXHJcbiAgICAgICk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAuYm9keSddKS50b0JlKFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHsgdGVzdDogJ2RhdGEnIH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIGluZm9ybWHDp8O1ZXMgZGUgdXN1w6FyaW8gcXVhbmRvIGZvcm5lY2lkbycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZXJyb3JEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdVc2VyIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICB1c2VyOiB7XHJcbiAgICAgICAgICBhY2NvdW50VXNlclVpZDogJ3VzZXItMTIzJyxcclxuICAgICAgICAgIGFjY291bnRVaWQ6ICdhY2NvdW50LTQ1NicsXHJcbiAgICAgICAgICBhcHBsaWNhdGlvblVpZDogJ2FwcC03ODknLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhY2NvdW50VXNlci51aWQnXSkudG9CZSgndXNlci0xMjMnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snYWNjb3VudC51aWQnXSkudG9CZSgnYWNjb3VudC00NTYnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snYXBwbGljYXRpb24udWlkJ10pLnRvQmUoJ2FwcC03ODknKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgaW5mb3JtYcOnw7VlcyBkZSBleGVjdcOnw6NvIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnRXhlY3V0aW9uIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIHJlcXVlc3RJZDogJ3JlcS0xMjMnLFxyXG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAnYXdzLTQ1NicsXHJcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICd0ZXN0RnVuY3Rpb24nLFxyXG4gICAgICAgICAgaW52b2NhdGlvbklkOiAnaW52LTc4OScsXHJcbiAgICAgICAgICBjb250cm9sbGVyOiAnVGVzdENvbnRyb2xsZXInLFxyXG4gICAgICAgICAgY29udHJvbGxlck1ldGhvZDogJ3Rlc3RNZXRob2QnLFxyXG4gICAgICAgICAgb3JpZ2luOiAnbW9iaWxlJyxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1sncmVxdWVzdC5pZCddKS50b0JlKCdyZXEtMTIzJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2F3cy5yZXF1ZXN0LmlkJ10pLnRvQmUoJ2F3cy00NTYnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snZmFhcy5uYW1lJ10pLnRvQmUoJ3Rlc3RGdW5jdGlvbicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydmYWFzLmludm9jYXRpb25faWQnXSkudG9CZSgnaW52LTc4OScpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydjb250cm9sbGVyLm5hbWUnXSkudG9CZSgnVGVzdENvbnRyb2xsZXInKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snY29udHJvbGxlci5tZXRob2QnXSkudG9CZSgndGVzdE1ldGhvZCcpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydvcmlnaW4nXSkudG9CZSgnbW9iaWxlJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSBpbmNsdWlyIG3DqXRyaWNhcyBkZSBwZXJmb3JtYW5jZSBxdWFuZG8gZm9ybmVjaWRvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvckRhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1BlcmZvcm1hbmNlIGVycm9yJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBwZXJmb3JtYW5jZToge1xyXG4gICAgICAgICAgZHVyYXRpb25NczogMTUwMCxcclxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydkdXJhdGlvbi5tcyddKS50b0JlKDE1MDApO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydleGVjdXRpb24uc3VjY2VzcyddKS50b0JlKGZhbHNlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGluY2x1aXIgY29udGV4dG8gYWRpY2lvbmFsIHF1YW5kbyBmb3JuZWNpZG8nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnQ29udGV4dCBlcnJvcicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgYWRkaXRpb25hbEluZm86ICdzb21lIGRhdGEnLFxyXG4gICAgICAgICAgbmVzdGVkOiB7IHZhbHVlOiAxMjMgfSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snY29udGV4dCddKS50b0JlKFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHsgYWRkaXRpb25hbEluZm86ICdzb21lIGRhdGEnLCBuZXN0ZWQ6IHsgdmFsdWU6IDEyMyB9IH0pXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGV2ZSB1c2FyIHNlcnZpY2VOYW1lIHBhZHLDo28gcXVhbmRvIG7Do28gZm9ybmVjaWRvJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBlcnJvckRhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ0RlZmF1bHQgc2VydmljZSBlcnJvcicsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICcnLCAvLyBFbXB0eSBzdHJpbmcgcGFyYSB0ZXN0YXIgZmFsbGJhY2tcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snc2VydmljZS5uYW1lJ10pLnRvQmUoJ3Rlc3Qtc2VydmljZScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgYWRpY2lvbmFyIHRpbWVzdGFtcCBhdXRvbWF0aWNhbWVudGUnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnVGltZXN0YW1wIHRlc3QnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nRXJyb3IoZXJyb3JEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1sndGltZXN0YW1wJ10pLnRvQmVEZWZpbmVkKCk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ3RpbWVzdGFtcCddKS50b01hdGNoKFxyXG4gICAgICAgIC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXC5cXGR7M31aJC9cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIGZpbHRyYXIgdmFsb3JlcyB1bmRlZmluZWQgZSBudWxsIGRvcyBhdHJpYnV0b3MnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9yRGF0YSA9IHtcclxuICAgICAgICBtZXNzYWdlOiAnRmlsdGVyIHRlc3QnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiAndXNlci0xMjMnLFxyXG4gICAgICAgICAgYWNjb3VudFVpZDogdW5kZWZpbmVkIGFzIGFueSxcclxuICAgICAgICAgIGFwcGxpY2F0aW9uVWlkOiB1bmRlZmluZWQgYXMgYW55LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dFcnJvcihlcnJvckRhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhY2NvdW50VXNlci51aWQnXSkudG9CZSgndXNlci0xMjMnKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snYWNjb3VudC51aWQnXSkudG9CZVVuZGVmaW5lZCgpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydhcHBsaWNhdGlvbi51aWQnXSkudG9CZVVuZGVmaW5lZCgpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIGRlc2NyaWJlKCdsb2dJbmZvJywgKCkgPT4ge1xyXG4gICAgaXQoJ2RldmUgZW1pdGlyIGxvZyBjb20gc2V2ZXJpdHkgSU5GTycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgaW5mb0RhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ0luZm8gbWVzc2FnZScsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dJbmZvKGluZm9EYXRhKTtcclxuXHJcbiAgICAgIGV4cGVjdChtb2NrTG9nZ2VyLmVtaXQpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5zZXZlcml0eU51bWJlcikudG9CZShTZXZlcml0eU51bWJlci5JTkZPKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlUZXh0KS50b0JlKCdJTkZPJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmJvZHkpLnRvQmUoJ0luZm8gbWVzc2FnZScpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgaW5jbHVpciBkYWRvcyBkZSBwZXJmb3JtYW5jZSBlbSBsb2cgZGUgc3VjZXNzbycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgaW5mb0RhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1JlcXVlc3QgY29tcGxldGVkJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBwZXJmb3JtYW5jZToge1xyXG4gICAgICAgICAgZHVyYXRpb25NczogMjUwLFxyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nSW5mbyhpbmZvRGF0YSk7XHJcblxyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2R1cmF0aW9uLm1zJ10pLnRvQmUoMjUwKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snZXhlY3V0aW9uLnN1Y2Nlc3MnXSkudG9CZSh0cnVlKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnbG9nV2FybicsICgpID0+IHtcclxuICAgIGl0KCdkZXZlIGVtaXRpciBsb2cgY29tIHNldmVyaXR5IFdBUk4nLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHdhcm5EYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdXYXJuaW5nIG1lc3NhZ2UnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAndGVzdC1zZXJ2aWNlJyxcclxuICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nV2Fybih3YXJuRGF0YSk7XHJcblxyXG4gICAgICBleHBlY3QobW9ja0xvZ2dlci5lbWl0KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlOdW1iZXIpLnRvQmUoU2V2ZXJpdHlOdW1iZXIuV0FSTik7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5VGV4dCkudG9CZSgnV0FSTicpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5ib2R5KS50b0JlKCdXYXJuaW5nIG1lc3NhZ2UnKTtcclxuICAgIH0pO1xyXG4gIH0pO1xyXG5cclxuICBkZXNjcmliZSgnbG9nRGVidWcnLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBlbWl0aXIgbG9nIGNvbSBzZXZlcml0eSBERUJVRycsIGFzeW5jICgpID0+IHtcclxuICAgICAgY29uc3QgZGVidWdEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdEZWJ1ZyBtZXNzYWdlJyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJ3Rlc3Qtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdkZXZlbG9wbWVudCcsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dEZWJ1ZyhkZWJ1Z0RhdGEpO1xyXG5cclxuICAgICAgZXhwZWN0KG1vY2tMb2dnZXIuZW1pdCkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xyXG4gICAgICBjb25zdCBlbWl0dGVkTG9nID0gbW9ja0xvZ2dlci5lbWl0Lm1vY2suY2FsbHNbMF1bMF07XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLnNldmVyaXR5TnVtYmVyKS50b0JlKFNldmVyaXR5TnVtYmVyLkRFQlVHKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuc2V2ZXJpdHlUZXh0KS50b0JlKCdERUJVRycpO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5ib2R5KS50b0JlKCdEZWJ1ZyBtZXNzYWdlJyk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgZGVzY3JpYmUoJ2J1aWxkQXR0cmlidXRlcycsICgpID0+IHtcclxuICAgIGl0KCdkZXZlIGNvbnN0cnVpciBhdHJpYnV0b3MgY29tcGxldG9zIGNvbSB0b2RvcyBvcyBjYW1wb3MnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZ1bGxEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdDb21wbGV0ZSBsb2cnLFxyXG4gICAgICAgIHNlcnZpY2VOYW1lOiAnY29tcGxldGUtc2VydmljZScsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdwcm9kdWN0aW9uJyxcclxuICAgICAgICBlcnJvcjogbmV3IEVycm9yKCdUZXN0IGVycm9yJyksXHJcbiAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICAgIHVybDogJy9hcGkvdXNlcnMnLFxyXG4gICAgICAgICAgZW5kcG9pbnQ6ICcvYXBpL3VzZXJzJyxcclxuICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVzZXI6IHtcclxuICAgICAgICAgIGFjY291bnRVc2VyVWlkOiAndXNlci1hYmMnLFxyXG4gICAgICAgICAgYWNjb3VudFVpZDogJ2FjY291bnQteHl6JyxcclxuICAgICAgICAgIGFwcGxpY2F0aW9uVWlkOiAnYXBwLTEyMycsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBleGVjdXRpb246IHtcclxuICAgICAgICAgIHJlcXVlc3RJZDogJ3JlcS0wMDEnLFxyXG4gICAgICAgICAgYXdzUmVxdWVzdElkOiAnYXdzLTAwMicsXHJcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6ICdnZXRVc2VycycsXHJcbiAgICAgICAgICBpbnZvY2F0aW9uSWQ6ICdpbnYtMDAzJyxcclxuICAgICAgICAgIGNvbnRyb2xsZXI6ICdVc2VyQ29udHJvbGxlcicsXHJcbiAgICAgICAgICBjb250cm9sbGVyTWV0aG9kOiAnZ2V0QWxsJyxcclxuICAgICAgICAgIG9yaWdpbjogJ3dlYicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwZXJmb3JtYW5jZToge1xyXG4gICAgICAgICAgZHVyYXRpb25NczogMzAwLFxyXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgIGN1c3RvbTogJ2RhdGEnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBzdGFuZGFyZExvZ2dlci5sb2dJbmZvKGZ1bGxEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgY29uc3QgYXR0cnMgPSBlbWl0dGVkTG9nLmF0dHJpYnV0ZXM7XHJcblxyXG4gICAgICAvLyBWZXJpZmljYXIgdG9kb3Mgb3MgY2FtcG9zXHJcbiAgICAgIGV4cGVjdChhdHRyc1snc2VydmljZS5uYW1lJ10pLnRvQmUoJ2NvbXBsZXRlLXNlcnZpY2UnKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydkZXBsb3ltZW50LmVudmlyb25tZW50Lm5hbWUnXSkudG9CZSgncHJvZHVjdGlvbicpO1xyXG4gICAgICBleHBlY3QoYXR0cnNbJ2Vycm9yLnR5cGUnXSkudG9CZSgnRXJyb3InKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydodHRwLm1ldGhvZCddKS50b0JlKCdHRVQnKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydhY2NvdW50VXNlci51aWQnXSkudG9CZSgndXNlci1hYmMnKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydyZXF1ZXN0LmlkJ10pLnRvQmUoJ3JlcS0wMDEnKTtcclxuICAgICAgZXhwZWN0KGF0dHJzWydkdXJhdGlvbi5tcyddKS50b0JlKDMwMCk7XHJcbiAgICAgIGV4cGVjdChhdHRyc1snY29udGV4dCddKS50b0JlKEpTT04uc3RyaW5naWZ5KHsgY3VzdG9tOiAnZGF0YScgfSkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2RldmUgbGlkYXIgY29tIGNhbXBvcyBIVFRQIHBhcmNpYWlzJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBwYXJ0aWFsSHR0cERhdGEgPSB7XHJcbiAgICAgICAgbWVzc2FnZTogJ1BhcnRpYWwgSFRUUCcsXHJcbiAgICAgICAgc2VydmljZU5hbWU6ICd0ZXN0LXNlcnZpY2UnLFxyXG4gICAgICAgIGVudmlyb25tZW50OiAncHJvZHVjdGlvbicsXHJcbiAgICAgICAgaHR0cDoge1xyXG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICBlbmRwb2ludDogJy9hcGkvdGVzdCcsXHJcbiAgICAgICAgICAvLyB1cmwsIHN0YXR1c0NvZGUsIGhlYWRlcnMsIGV0YyBuw6NvIGZvcm5lY2lkb3NcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgYXdhaXQgc3RhbmRhcmRMb2dnZXIubG9nSW5mbyhwYXJ0aWFsSHR0cERhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydodHRwLm1ldGhvZCddKS50b0JlKCdQT1NUJyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAuZW5kcG9pbnQnXSkudG9CZSgnL2FwaS90ZXN0Jyk7XHJcbiAgICAgIGV4cGVjdChlbWl0dGVkTG9nLmF0dHJpYnV0ZXNbJ2h0dHAudXJsJ10pLnRvQmVVbmRlZmluZWQoKTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snaHR0cC5zdGF0dXNfY29kZSddKS50b0JlVW5kZWZpbmVkKCk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgZGVzY3JpYmUoJ2NvbnN0cnV0b3InLCAoKSA9PiB7XHJcbiAgICBpdCgnZGV2ZSBhY2VpdGFyIHNlcnZpY2VOYW1lIHBhZHLDo28gcGVyc29uYWxpemFkbycsICgpID0+IHtcclxuICAgICAgY29uc3QgY3VzdG9tTG9nZ2VyID0gbmV3IFN0YW5kYXJkTG9nZ2VyKG1vY2tMb2dnZXIsICdjdXN0b20tc2VydmljZScpO1xyXG4gICAgICBjb25zdCBsb2dEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdUZXN0JyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJycsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICd0ZXN0JyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGN1c3RvbUxvZ2dlci5sb2dJbmZvKGxvZ0RhdGEpO1xyXG5cclxuICAgICAgY29uc3QgZW1pdHRlZExvZyA9IG1vY2tMb2dnZXIuZW1pdC5tb2NrLmNhbGxzWzBdWzBdO1xyXG4gICAgICBleHBlY3QoZW1pdHRlZExvZy5hdHRyaWJ1dGVzWydzZXJ2aWNlLm5hbWUnXSkudG9CZSgnY3VzdG9tLXNlcnZpY2UnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZXZlIHVzYXIgXCJ1bmtub3duLXNlcnZpY2VcIiBjb21vIHBhZHLDo28gcXVhbmRvIG7Do28gZXNwZWNpZmljYWRvJywgKCkgPT4ge1xyXG4gICAgICBjb25zdCBkZWZhdWx0TG9nZ2VyID0gbmV3IFN0YW5kYXJkTG9nZ2VyKG1vY2tMb2dnZXIpO1xyXG4gICAgICBjb25zdCBsb2dEYXRhID0ge1xyXG4gICAgICAgIG1lc3NhZ2U6ICdUZXN0JyxcclxuICAgICAgICBzZXJ2aWNlTmFtZTogJycsXHJcbiAgICAgICAgZW52aXJvbm1lbnQ6ICd0ZXN0JyxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGRlZmF1bHRMb2dnZXIubG9nSW5mbyhsb2dEYXRhKTtcclxuXHJcbiAgICAgIGNvbnN0IGVtaXR0ZWRMb2cgPSBtb2NrTG9nZ2VyLmVtaXQubW9jay5jYWxsc1swXVswXTtcclxuICAgICAgZXhwZWN0KGVtaXR0ZWRMb2cuYXR0cmlidXRlc1snc2VydmljZS5uYW1lJ10pLnRvQmUoJ3Vua25vd24tc2VydmljZScpO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcbn0pO1xyXG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|