@sdkgen/node-runtime 0.0.0-dev.20230106165109 → 0.0.0-dev.20230109111624

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 (41) hide show
  1. package/dist/spec/error.spec.js +3 -4
  2. package/dist/spec/rest/rest.spec.js +24 -24
  3. package/dist/spec/runtime/errors.spec.js +15 -14
  4. package/dist/spec/runtime/middleware.spec.js +15 -14
  5. package/dist/spec/simple/legacyNodeClient.js +6 -32
  6. package/dist/spec/simple/simple.spec.js +27 -28
  7. package/dist/spec/types.js +27 -28
  8. package/dist/spec/types.spec.js +54 -55
  9. package/dist/src/api-config.js +4 -8
  10. package/dist/src/context.js +2 -2
  11. package/dist/src/encode-decode.js +12 -50
  12. package/dist/src/error.js +4 -9
  13. package/dist/src/execute.js +12 -14
  14. package/dist/src/http-client.js +25 -27
  15. package/dist/src/http-server.js +160 -170
  16. package/dist/src/index.js +8 -18
  17. package/dist/src/new-interface.js +200 -0
  18. package/dist/src/swagger.js +126 -115
  19. package/dist/src/test-wrapper.js +25 -23
  20. package/dist/src/utils.js +2 -5
  21. package/package.json +26 -22
  22. package/dist/spec/error.spec.d.ts +0 -1
  23. package/dist/spec/rest/rest.spec.d.ts +0 -1
  24. package/dist/spec/runtime/errors.spec.d.ts +0 -1
  25. package/dist/spec/runtime/middleware.spec.d.ts +0 -1
  26. package/dist/spec/simple/legacyNodeClient.d.ts +0 -17
  27. package/dist/spec/simple/simple.spec.d.ts +0 -1
  28. package/dist/spec/types.d.ts +0 -1
  29. package/dist/spec/types.spec.d.ts +0 -1
  30. package/dist/src/api-config.d.ts +0 -15
  31. package/dist/src/context.d.ts +0 -38
  32. package/dist/src/encode-decode.d.ts +0 -32
  33. package/dist/src/error.d.ts +0 -18
  34. package/dist/src/execute.d.ts +0 -3
  35. package/dist/src/http-client.d.ts +0 -17
  36. package/dist/src/http-server.d.ts +0 -37
  37. package/dist/src/index.d.ts +0 -7
  38. package/dist/src/swagger.d.ts +0 -2
  39. package/dist/src/test-wrapper.d.ts +0 -3
  40. package/dist/src/utils.d.ts +0 -6
  41. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,138 +1,135 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.setupSwagger = void 0;
7
- const parser_1 = require("@sdkgen/parser");
8
- const serve_handler_1 = __importDefault(require("serve-handler"));
9
- const swagger_ui_dist_1 = require("swagger-ui-dist");
10
- const swaggerUiAssetPath = (0, swagger_ui_dist_1.getAbsoluteFSPath)();
1
+ import { DecimalPrimitiveType, JsonPrimitiveType, ArrayType, Base64PrimitiveType, BigIntPrimitiveType, BoolPrimitiveType, BytesPrimitiveType, CnpjPrimitiveType, CpfPrimitiveType, DatePrimitiveType, DateTimePrimitiveType, DescriptionAnnotation, EmailPrimitiveType, EnumType, FloatPrimitiveType, HexPrimitiveType, HtmlPrimitiveType, IntPrimitiveType, MoneyPrimitiveType, OptionalType, RestAnnotation, StringPrimitiveType, StructType, TypeReference, UIntPrimitiveType, UrlPrimitiveType, UuidPrimitiveType, VoidPrimitiveType, } from "@sdkgen/parser";
2
+ import staticFilesHandler from "serve-handler";
3
+ import { getAbsoluteFSPath as getSwaggerUiAssetPath } from "swagger-ui-dist";
4
+ const swaggerUiAssetPath = getSwaggerUiAssetPath();
11
5
  function objectFromEntries(entries) {
12
6
  return Object.assign({}, ...Array.from(entries, ([k, v]) => ({ [k]: v })));
13
7
  }
14
8
  function typeToSchema(definitions, type) {
15
- if (type instanceof parser_1.EnumType) {
9
+ if (type instanceof EnumType) {
16
10
  return {
17
11
  enum: type.values.map(x => x.value),
18
12
  type: "string",
19
13
  };
20
14
  }
21
- else if (type instanceof parser_1.StructType) {
15
+ else if (type instanceof StructType) {
22
16
  return {
23
17
  properties: objectFromEntries(type.fields.map(field => [
24
18
  field.name,
25
- Object.assign({ description: field.annotations
26
- .filter(x => x instanceof parser_1.DescriptionAnnotation)
19
+ {
20
+ description: field.annotations
21
+ .filter(x => x instanceof DescriptionAnnotation)
27
22
  .map(x => x.text)
28
- .join(" ") || undefined }, typeToSchema(definitions, field.type)),
23
+ .join(" ") || undefined,
24
+ ...typeToSchema(definitions, field.type),
25
+ },
29
26
  ])),
30
- required: type.fields.filter(f => !(f.type instanceof parser_1.OptionalType)).map(f => f.name),
27
+ required: type.fields.filter(f => !(f.type instanceof OptionalType)).map(f => f.name),
31
28
  type: "object",
32
29
  };
33
30
  }
34
- else if (type instanceof parser_1.StringPrimitiveType ||
35
- type instanceof parser_1.UuidPrimitiveType ||
36
- type instanceof parser_1.HexPrimitiveType ||
37
- type instanceof parser_1.HtmlPrimitiveType ||
38
- type instanceof parser_1.Base64PrimitiveType) {
31
+ else if (type instanceof StringPrimitiveType ||
32
+ type instanceof UuidPrimitiveType ||
33
+ type instanceof HexPrimitiveType ||
34
+ type instanceof HtmlPrimitiveType ||
35
+ type instanceof Base64PrimitiveType) {
39
36
  return {
40
37
  type: "string",
41
38
  };
42
39
  }
43
- else if (type instanceof parser_1.UrlPrimitiveType) {
40
+ else if (type instanceof UrlPrimitiveType) {
44
41
  return {
45
42
  format: "uri",
46
43
  type: "string",
47
44
  };
48
45
  }
49
- else if (type instanceof parser_1.DatePrimitiveType) {
46
+ else if (type instanceof DatePrimitiveType) {
50
47
  return {
51
48
  format: "date",
52
49
  type: "string",
53
50
  };
54
51
  }
55
- else if (type instanceof parser_1.DateTimePrimitiveType) {
52
+ else if (type instanceof DateTimePrimitiveType) {
56
53
  return {
57
54
  format: "date-time",
58
55
  type: "string",
59
56
  };
60
57
  }
61
- else if (type instanceof parser_1.CpfPrimitiveType) {
58
+ else if (type instanceof CpfPrimitiveType) {
62
59
  return {
63
60
  type: "string",
64
61
  };
65
62
  }
66
- else if (type instanceof parser_1.CnpjPrimitiveType) {
63
+ else if (type instanceof CnpjPrimitiveType) {
67
64
  return {
68
65
  type: "string",
69
66
  };
70
67
  }
71
- else if (type instanceof parser_1.BoolPrimitiveType) {
68
+ else if (type instanceof BoolPrimitiveType) {
72
69
  return {
73
70
  type: "boolean",
74
71
  };
75
72
  }
76
- else if (type instanceof parser_1.BytesPrimitiveType) {
73
+ else if (type instanceof BytesPrimitiveType) {
77
74
  return {
78
75
  format: "byte",
79
76
  type: "string",
80
77
  };
81
78
  }
82
- else if (type instanceof parser_1.IntPrimitiveType) {
79
+ else if (type instanceof IntPrimitiveType) {
83
80
  return {
84
81
  format: "int32",
85
82
  type: "integer",
86
83
  };
87
84
  }
88
- else if (type instanceof parser_1.UIntPrimitiveType) {
85
+ else if (type instanceof UIntPrimitiveType) {
89
86
  return {
90
87
  format: "int32",
91
88
  minimum: 0,
92
89
  type: "integer",
93
90
  };
94
91
  }
95
- else if (type instanceof parser_1.MoneyPrimitiveType) {
92
+ else if (type instanceof MoneyPrimitiveType) {
96
93
  return {
97
94
  format: "int64",
98
95
  type: "integer",
99
96
  };
100
97
  }
101
- else if (type instanceof parser_1.FloatPrimitiveType) {
98
+ else if (type instanceof FloatPrimitiveType) {
102
99
  return {
103
100
  type: "number",
104
101
  };
105
102
  }
106
- else if (type instanceof parser_1.EmailPrimitiveType) {
103
+ else if (type instanceof EmailPrimitiveType) {
107
104
  return {
108
105
  type: "string",
109
106
  };
110
107
  }
111
- else if (type instanceof parser_1.BigIntPrimitiveType) {
108
+ else if (type instanceof BigIntPrimitiveType) {
112
109
  return {
113
110
  type: "string",
114
111
  };
115
112
  }
116
- else if (type instanceof parser_1.DecimalPrimitiveType) {
113
+ else if (type instanceof DecimalPrimitiveType) {
117
114
  return {
118
115
  type: "string",
119
116
  };
120
117
  }
121
- else if (type instanceof parser_1.JsonPrimitiveType) {
118
+ else if (type instanceof JsonPrimitiveType) {
122
119
  return {};
123
120
  }
124
- else if (type instanceof parser_1.OptionalType) {
121
+ else if (type instanceof OptionalType) {
125
122
  return {
126
123
  oneOf: [typeToSchema(definitions, type.base), { type: "null" }],
127
124
  };
128
125
  }
129
- else if (type instanceof parser_1.ArrayType) {
126
+ else if (type instanceof ArrayType) {
130
127
  return {
131
128
  items: typeToSchema(definitions, type.base),
132
129
  type: "array",
133
130
  };
134
131
  }
135
- else if (type instanceof parser_1.TypeReference) {
132
+ else if (type instanceof TypeReference) {
136
133
  if (!definitions[type.name]) {
137
134
  definitions[type.name] = typeToSchema(definitions, type.type);
138
135
  }
@@ -140,7 +137,7 @@ function typeToSchema(definitions, type) {
140
137
  }
141
138
  throw new Error(`Unhandled type ${type.constructor.name}`);
142
139
  }
143
- function setupSwagger(server) {
140
+ export function setupSwagger(server) {
144
141
  server.addHttpHandler("GET", "/swagger", (req, res) => {
145
142
  if (!server.introspection) {
146
143
  res.statusCode = 404;
@@ -214,7 +211,7 @@ function setupSwagger(server) {
214
211
  req.url = req.url.replace(/\/swagger/u, "");
215
212
  }
216
213
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
217
- (0, serve_handler_1.default)(req, res, {
214
+ staticFilesHandler(req, res, {
218
215
  cleanUrls: false,
219
216
  directoryListing: false,
220
217
  etag: true,
@@ -238,7 +235,7 @@ function setupSwagger(server) {
238
235
  const paths = {};
239
236
  for (const op of server.apiConfig.ast.operations) {
240
237
  for (const ann of op.annotations) {
241
- if (ann instanceof parser_1.RestAnnotation) {
238
+ if (ann instanceof RestAnnotation) {
242
239
  if (!paths[ann.path]) {
243
240
  paths[ann.path] = {};
244
241
  }
@@ -266,97 +263,109 @@ function setupSwagger(server) {
266
263
  })),
267
264
  ].map(({ name, location, arg }) => ({
268
265
  description: arg.annotations
269
- .filter(x => x instanceof parser_1.DescriptionAnnotation)
266
+ .filter(x => x instanceof DescriptionAnnotation)
270
267
  .map(x => x.text)
271
268
  .join(" ") || undefined,
272
269
  in: location,
273
270
  name,
274
- required: !(arg.type instanceof parser_1.OptionalType),
271
+ required: !(arg.type instanceof OptionalType),
275
272
  schema: typeToSchema(definitions, arg.type),
276
273
  })),
277
274
  requestBody: ann.bodyVariable
278
275
  ? {
279
- content: Object.assign(Object.assign({}, (() => {
280
- var _a;
281
- const bodyType = (_a = op.args.find(arg => arg.name === ann.bodyVariable)) === null || _a === void 0 ? void 0 : _a.type;
282
- return bodyType instanceof parser_1.BoolPrimitiveType ||
283
- bodyType instanceof parser_1.IntPrimitiveType ||
284
- bodyType instanceof parser_1.UIntPrimitiveType ||
285
- bodyType instanceof parser_1.FloatPrimitiveType ||
286
- bodyType instanceof parser_1.StringPrimitiveType ||
287
- bodyType instanceof parser_1.DatePrimitiveType ||
288
- bodyType instanceof parser_1.DateTimePrimitiveType ||
289
- bodyType instanceof parser_1.MoneyPrimitiveType ||
290
- bodyType instanceof parser_1.CpfPrimitiveType ||
291
- bodyType instanceof parser_1.CnpjPrimitiveType ||
292
- bodyType instanceof parser_1.EmailPrimitiveType ||
293
- bodyType instanceof parser_1.HtmlPrimitiveType ||
294
- bodyType instanceof parser_1.UuidPrimitiveType ||
295
- bodyType instanceof parser_1.HexPrimitiveType ||
296
- bodyType instanceof parser_1.BytesPrimitiveType ||
297
- bodyType instanceof parser_1.Base64PrimitiveType
298
- ? {
299
- [bodyType instanceof parser_1.HtmlPrimitiveType ? "text/html" : "text/plain"]: {
300
- schema: typeToSchema(definitions, bodyType),
301
- },
302
- }
303
- : {};
304
- })()), { "application/json": {
305
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
306
- schema: typeToSchema(definitions, op.args.find(arg => arg.name === ann.bodyVariable).type),
307
- } }),
308
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
309
- required: !(op.args.find(arg => arg.name === ann.bodyVariable).type instanceof parser_1.OptionalType),
310
- }
311
- : undefined,
312
- responses: Object.assign(Object.assign(Object.assign({}, (op.returnType instanceof parser_1.OptionalType || op.returnType instanceof parser_1.VoidPrimitiveType
313
- ? { [ann.method === "GET" ? "404" : "204"]: {} }
314
- : {})), (op.returnType instanceof parser_1.VoidPrimitiveType
315
- ? {}
316
- : {
317
- 200: {
318
- content: Object.assign(Object.assign({}, (() => {
319
- return op.returnType instanceof parser_1.BoolPrimitiveType ||
320
- op.returnType instanceof parser_1.IntPrimitiveType ||
321
- op.returnType instanceof parser_1.UIntPrimitiveType ||
322
- op.returnType instanceof parser_1.FloatPrimitiveType ||
323
- op.returnType instanceof parser_1.StringPrimitiveType ||
324
- op.returnType instanceof parser_1.DatePrimitiveType ||
325
- op.returnType instanceof parser_1.DateTimePrimitiveType ||
326
- op.returnType instanceof parser_1.MoneyPrimitiveType ||
327
- op.returnType instanceof parser_1.CpfPrimitiveType ||
328
- op.returnType instanceof parser_1.CnpjPrimitiveType ||
329
- op.returnType instanceof parser_1.EmailPrimitiveType ||
330
- op.returnType instanceof parser_1.UuidPrimitiveType ||
331
- op.returnType instanceof parser_1.HexPrimitiveType ||
332
- op.returnType instanceof parser_1.BytesPrimitiveType ||
333
- op.returnType instanceof parser_1.Base64PrimitiveType
276
+ content: {
277
+ ...(() => {
278
+ const bodyType = op.args.find(arg => arg.name === ann.bodyVariable)?.type;
279
+ return bodyType instanceof BoolPrimitiveType ||
280
+ bodyType instanceof IntPrimitiveType ||
281
+ bodyType instanceof UIntPrimitiveType ||
282
+ bodyType instanceof FloatPrimitiveType ||
283
+ bodyType instanceof StringPrimitiveType ||
284
+ bodyType instanceof DatePrimitiveType ||
285
+ bodyType instanceof DateTimePrimitiveType ||
286
+ bodyType instanceof MoneyPrimitiveType ||
287
+ bodyType instanceof CpfPrimitiveType ||
288
+ bodyType instanceof CnpjPrimitiveType ||
289
+ bodyType instanceof EmailPrimitiveType ||
290
+ bodyType instanceof HtmlPrimitiveType ||
291
+ bodyType instanceof UuidPrimitiveType ||
292
+ bodyType instanceof HexPrimitiveType ||
293
+ bodyType instanceof BytesPrimitiveType ||
294
+ bodyType instanceof Base64PrimitiveType
334
295
  ? {
335
- "text/plain": {
336
- schema: typeToSchema(definitions, op.returnType),
296
+ [bodyType instanceof HtmlPrimitiveType ? "text/html" : "text/plain"]: {
297
+ schema: typeToSchema(definitions, bodyType),
337
298
  },
338
299
  }
339
300
  : {};
340
- })()), { "application/json": {
341
- schema: typeToSchema(definitions, op.returnType),
342
- } }),
301
+ })(),
302
+ "application/json": {
303
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
304
+ schema: typeToSchema(definitions, op.args.find(arg => arg.name === ann.bodyVariable).type),
305
+ },
343
306
  },
344
- })), { 400: {
307
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
308
+ required: !(op.args.find(arg => arg.name === ann.bodyVariable).type instanceof OptionalType),
309
+ }
310
+ : undefined,
311
+ responses: {
312
+ ...(op.returnType instanceof OptionalType || op.returnType instanceof VoidPrimitiveType
313
+ ? { [ann.method === "GET" ? "404" : "204"]: {} }
314
+ : {}),
315
+ ...(op.returnType instanceof VoidPrimitiveType
316
+ ? {}
317
+ : {
318
+ 200: {
319
+ content: {
320
+ ...(() => {
321
+ return op.returnType instanceof BoolPrimitiveType ||
322
+ op.returnType instanceof IntPrimitiveType ||
323
+ op.returnType instanceof UIntPrimitiveType ||
324
+ op.returnType instanceof FloatPrimitiveType ||
325
+ op.returnType instanceof StringPrimitiveType ||
326
+ op.returnType instanceof DatePrimitiveType ||
327
+ op.returnType instanceof DateTimePrimitiveType ||
328
+ op.returnType instanceof MoneyPrimitiveType ||
329
+ op.returnType instanceof CpfPrimitiveType ||
330
+ op.returnType instanceof CnpjPrimitiveType ||
331
+ op.returnType instanceof EmailPrimitiveType ||
332
+ op.returnType instanceof UuidPrimitiveType ||
333
+ op.returnType instanceof HexPrimitiveType ||
334
+ op.returnType instanceof BytesPrimitiveType ||
335
+ op.returnType instanceof Base64PrimitiveType
336
+ ? {
337
+ "text/plain": {
338
+ schema: typeToSchema(definitions, op.returnType),
339
+ },
340
+ }
341
+ : {};
342
+ })(),
343
+ "application/json": {
344
+ schema: typeToSchema(definitions, op.returnType),
345
+ },
346
+ },
347
+ },
348
+ }),
349
+ 400: {
345
350
  content: {
346
351
  "application/json": {
347
352
  schema: {
348
353
  anyOf: [
349
354
  server.apiConfig.ast.errors.map(error => ({
350
- properties: Object.assign({ message: {
355
+ properties: {
356
+ message: {
351
357
  type: "string",
352
- }, type: {
358
+ },
359
+ type: {
353
360
  enum: [error.name],
354
361
  type: "string",
355
- } }, (error.dataType instanceof parser_1.VoidPrimitiveType
356
- ? {}
357
- : {
358
- data: typeToSchema(definitions, error.dataType),
359
- })),
362
+ },
363
+ ...(error.dataType instanceof VoidPrimitiveType
364
+ ? {}
365
+ : {
366
+ data: typeToSchema(definitions, error.dataType),
367
+ }),
368
+ },
360
369
  required: ["type", "message"],
361
370
  type: "object",
362
371
  })),
@@ -364,9 +373,11 @@ function setupSwagger(server) {
364
373
  },
365
374
  },
366
375
  },
367
- }, 500: {} }),
376
+ },
377
+ 500: {},
378
+ },
368
379
  summary: op.annotations
369
- .filter(x => x instanceof parser_1.DescriptionAnnotation)
380
+ .filter(x => x instanceof DescriptionAnnotation)
370
381
  .map(x => x.text)
371
382
  .join(" ") || undefined,
372
383
  tags: ["REST Endpoints"],
@@ -391,4 +402,4 @@ function setupSwagger(server) {
391
402
  res.end();
392
403
  });
393
404
  }
394
- exports.setupSwagger = setupSwagger;
405
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zd2FnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsUUFBUSxFQUNSLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsWUFBWSxFQUNaLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixpQkFBaUIsR0FDbEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLGtCQUFrQixNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLElBQUkscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUk3RSxNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixFQUFFLENBQUM7QUFFbkQsU0FBUyxpQkFBaUIsQ0FBSSxPQUEyQjtJQUN2RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUF5QixDQUFDO0FBQ3JHLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxXQUFtRCxFQUFFLElBQVU7SUFDbkYsSUFBSSxJQUFJLFlBQVksUUFBUSxFQUFFO1FBQzVCLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ25DLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksVUFBVSxFQUFFO1FBQ3JDLE9BQU87WUFDTCxVQUFVLEVBQUUsaUJBQWlCLENBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxJQUFJO2dCQUNWO29CQUNFLFdBQVcsRUFDVCxLQUFLLENBQUMsV0FBVzt5QkFDZCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVkscUJBQXFCLENBQUM7eUJBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFFLENBQTJCLENBQUMsSUFBSSxDQUFDO3lCQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUztvQkFDM0IsR0FBRyxZQUFZLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUM7aUJBQ3pDO2FBQ0YsQ0FBQyxDQUNIO1lBQ0QsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3JGLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIO1NBQU0sSUFDTCxJQUFJLFlBQVksbUJBQW1CO1FBQ25DLElBQUksWUFBWSxpQkFBaUI7UUFDakMsSUFBSSxZQUFZLGdCQUFnQjtRQUNoQyxJQUFJLFlBQVksaUJBQWlCO1FBQ2pDLElBQUksWUFBWSxtQkFBbUIsRUFDbkM7UUFDQSxPQUFPO1lBQ0wsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO0tBQ0g7U0FBTSxJQUFJLElBQUksWUFBWSxnQkFBZ0IsRUFBRTtRQUMzQyxPQUFPO1lBQ0wsTUFBTSxFQUFFLEtBQUs7WUFDYixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7S0FDSDtTQUFNLElBQUksSUFBSSxZQUFZLGlCQUFpQixFQUFFO1FBQzVDLE9BQU87WUFDTCxNQUFNLEVBQUUsTUFBTTtZQUNkLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVkscUJBQXFCLEVBQUU7UUFDaEQsT0FBTztZQUNMLE1BQU0sRUFBRSxXQUFXO1lBQ25CLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksZ0JBQWdCLEVBQUU7UUFDM0MsT0FBTztZQUNMLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksaUJBQWlCLEVBQUU7UUFDNUMsT0FBTztZQUNMLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksaUJBQWlCLEVBQUU7UUFDNUMsT0FBTztZQUNMLElBQUksRUFBRSxTQUFTO1NBQ2hCLENBQUM7S0FDSDtTQUFNLElBQUksSUFBSSxZQUFZLGtCQUFrQixFQUFFO1FBQzdDLE9BQU87WUFDTCxNQUFNLEVBQUUsTUFBZTtZQUN2QixJQUFJLEVBQUUsUUFBUTtTQUNmLENBQUM7S0FDSDtTQUFNLElBQUksSUFBSSxZQUFZLGdCQUFnQixFQUFFO1FBQzNDLE9BQU87WUFDTCxNQUFNLEVBQUUsT0FBZ0I7WUFDeEIsSUFBSSxFQUFFLFNBQVM7U0FDaEIsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksaUJBQWlCLEVBQUU7UUFDNUMsT0FBTztZQUNMLE1BQU0sRUFBRSxPQUFnQjtZQUN4QixPQUFPLEVBQUUsQ0FBQztZQUNWLElBQUksRUFBRSxTQUFTO1NBQ2hCLENBQUM7S0FDSDtTQUFNLElBQUksSUFBSSxZQUFZLGtCQUFrQixFQUFFO1FBQzdDLE9BQU87WUFDTCxNQUFNLEVBQUUsT0FBZ0I7WUFDeEIsSUFBSSxFQUFFLFNBQVM7U0FDaEIsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksa0JBQWtCLEVBQUU7UUFDN0MsT0FBTztZQUNMLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksa0JBQWtCLEVBQUU7UUFDN0MsT0FBTztZQUNMLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksbUJBQW1CLEVBQUU7UUFDOUMsT0FBTztZQUNMLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksb0JBQW9CLEVBQUU7UUFDL0MsT0FBTztZQUNMLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksaUJBQWlCLEVBQUU7UUFDNUMsT0FBTyxFQUFFLENBQUM7S0FDWDtTQUFNLElBQUksSUFBSSxZQUFZLFlBQVksRUFBRTtRQUN2QyxPQUFPO1lBQ0wsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7U0FDaEUsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksU0FBUyxFQUFFO1FBQ3BDLE9BQU87WUFDTCxLQUFLLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzNDLElBQUksRUFBRSxPQUFPO1NBQ2QsQ0FBQztLQUNIO1NBQU0sSUFBSSxJQUFJLFlBQVksYUFBYSxFQUFFO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzNCLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0Q7UUFFRCxPQUFPLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztLQUMvQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBZ0IsTUFBdUM7SUFDakYsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3BELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFO1lBQ3pCLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1lBQ3JCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNWLE9BQU87U0FDUjtRQUVELEdBQUcsQ0FBQyxLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQXNETCxDQUFDLENBQUM7UUFDUCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWixDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtZQUN6QixHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztZQUNyQixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVixPQUFPO1NBQ1I7UUFFRCxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDWCxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM3QztRQUVELHlHQUF5RztRQUN6RyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO1lBQzNCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLGdCQUFnQixFQUFFLEtBQUs7WUFDdkIsSUFBSSxFQUFFLElBQUk7WUFDVixNQUFNLEVBQUUsa0JBQWtCO1NBQzNCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1lBQ3JCLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7WUFDekIsR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7WUFDckIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1YsT0FBTztTQUNSO1FBRUQsSUFBSTtZQUNGLE1BQU0sV0FBVyxHQUEyQyxFQUFFLENBQUM7WUFDL0QsOERBQThEO1lBQzlELE1BQU0sS0FBSyxHQUF3QixFQUFFLENBQUM7WUFFdEMsS0FBSyxNQUFNLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7Z0JBQ2hELEtBQUssTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtvQkFDaEMsSUFBSSxHQUFHLFlBQVksY0FBYyxFQUFFO3dCQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDcEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7eUJBQ3RCO3dCQUVELHNFQUFzRTt3QkFDdEUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUc7NEJBQzFDLFdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSTs0QkFDcEIsVUFBVSxFQUFFO2dDQUNWLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29DQUNoQyxvRUFBb0U7b0NBQ3BFLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFFO29DQUM1QyxRQUFRLEVBQUUsTUFBTTtvQ0FDaEIsSUFBSTtpQ0FDTCxDQUFDLENBQUM7Z0NBQ0gsR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0NBQ2pDLG9FQUFvRTtvQ0FDcEUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUU7b0NBQzVDLFFBQVEsRUFBRSxPQUFPO29DQUNqQixJQUFJO2lDQUNMLENBQUMsQ0FBQztnQ0FDSCxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7b0NBQ3JELG9FQUFvRTtvQ0FDcEUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUU7b0NBQzVDLFFBQVEsRUFBRSxRQUFRO29DQUNsQixJQUFJLEVBQUUsTUFBTTtpQ0FDYixDQUFDLENBQUM7NkJBQ0osQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0NBQ2xDLFdBQVcsRUFDVCxHQUFHLENBQUMsV0FBVztxQ0FDWixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVkscUJBQXFCLENBQUM7cUNBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFFLENBQTJCLENBQUMsSUFBSSxDQUFDO3FDQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUztnQ0FDM0IsRUFBRSxFQUFFLFFBQVE7Z0NBQ1osSUFBSTtnQ0FDSixRQUFRLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFlBQVksWUFBWSxDQUFDO2dDQUM3QyxNQUFNLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDOzZCQUM1QyxDQUFDLENBQUM7NEJBQ0gsV0FBVyxFQUFFLEdBQUcsQ0FBQyxZQUFZO2dDQUMzQixDQUFDLENBQUM7b0NBQ0UsT0FBTyxFQUFFO3dDQUNQLEdBQUcsQ0FBQyxHQUFHLEVBQUU7NENBQ1AsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLENBQUM7NENBRTFFLE9BQU8sUUFBUSxZQUFZLGlCQUFpQjtnREFDMUMsUUFBUSxZQUFZLGdCQUFnQjtnREFDcEMsUUFBUSxZQUFZLGlCQUFpQjtnREFDckMsUUFBUSxZQUFZLGtCQUFrQjtnREFDdEMsUUFBUSxZQUFZLG1CQUFtQjtnREFDdkMsUUFBUSxZQUFZLGlCQUFpQjtnREFDckMsUUFBUSxZQUFZLHFCQUFxQjtnREFDekMsUUFBUSxZQUFZLGtCQUFrQjtnREFDdEMsUUFBUSxZQUFZLGdCQUFnQjtnREFDcEMsUUFBUSxZQUFZLGlCQUFpQjtnREFDckMsUUFBUSxZQUFZLGtCQUFrQjtnREFDdEMsUUFBUSxZQUFZLGlCQUFpQjtnREFDckMsUUFBUSxZQUFZLGlCQUFpQjtnREFDckMsUUFBUSxZQUFZLGdCQUFnQjtnREFDcEMsUUFBUSxZQUFZLGtCQUFrQjtnREFDdEMsUUFBUSxZQUFZLG1CQUFtQjtnREFDdkMsQ0FBQyxDQUFDO29EQUNFLENBQUMsUUFBUSxZQUFZLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFO3dEQUNwRSxNQUFNLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUM7cURBQzVDO2lEQUNGO2dEQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7d0NBQ1QsQ0FBQyxDQUFDLEVBQUU7d0NBQ0osa0JBQWtCLEVBQUU7NENBQ2xCLG9FQUFvRTs0Q0FDcEUsTUFBTSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxZQUFZLENBQUUsQ0FBQyxJQUFJLENBQUM7eUNBQzVGO3FDQUNGO29DQUNELG9FQUFvRTtvQ0FDcEUsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLFlBQVksQ0FBRSxDQUFDLElBQUksWUFBWSxZQUFZLENBQUM7aUNBQzlGO2dDQUNILENBQUMsQ0FBQyxTQUFTOzRCQUNiLFNBQVMsRUFBRTtnQ0FDVCxHQUFHLENBQUMsRUFBRSxDQUFDLFVBQVUsWUFBWSxZQUFZLElBQUksRUFBRSxDQUFDLFVBQVUsWUFBWSxpQkFBaUI7b0NBQ3JGLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFO29DQUNoRCxDQUFDLENBQUMsRUFBRSxDQUFDO2dDQUNQLEdBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxZQUFZLGlCQUFpQjtvQ0FDNUMsQ0FBQyxDQUFDLEVBQUU7b0NBQ0osQ0FBQyxDQUFDO3dDQUNFLEdBQUcsRUFBRTs0Q0FDSCxPQUFPLEVBQUU7Z0RBQ1AsR0FBRyxDQUFDLEdBQUcsRUFBRTtvREFDUCxPQUFPLEVBQUUsQ0FBQyxVQUFVLFlBQVksaUJBQWlCO3dEQUMvQyxFQUFFLENBQUMsVUFBVSxZQUFZLGdCQUFnQjt3REFDekMsRUFBRSxDQUFDLFVBQVUsWUFBWSxpQkFBaUI7d0RBQzFDLEVBQUUsQ0FBQyxVQUFVLFlBQVksa0JBQWtCO3dEQUMzQyxFQUFFLENBQUMsVUFBVSxZQUFZLG1CQUFtQjt3REFDNUMsRUFBRSxDQUFDLFVBQVUsWUFBWSxpQkFBaUI7d0RBQzFDLEVBQUUsQ0FBQyxVQUFVLFlBQVkscUJBQXFCO3dEQUM5QyxFQUFFLENBQUMsVUFBVSxZQUFZLGtCQUFrQjt3REFDM0MsRUFBRSxDQUFDLFVBQVUsWUFBWSxnQkFBZ0I7d0RBQ3pDLEVBQUUsQ0FBQyxVQUFVLFlBQVksaUJBQWlCO3dEQUMxQyxFQUFFLENBQUMsVUFBVSxZQUFZLGtCQUFrQjt3REFDM0MsRUFBRSxDQUFDLFVBQVUsWUFBWSxpQkFBaUI7d0RBQzFDLEVBQUUsQ0FBQyxVQUFVLFlBQVksZ0JBQWdCO3dEQUN6QyxFQUFFLENBQUMsVUFBVSxZQUFZLGtCQUFrQjt3REFDM0MsRUFBRSxDQUFDLFVBQVUsWUFBWSxtQkFBbUI7d0RBQzVDLENBQUMsQ0FBQzs0REFDRSxZQUFZLEVBQUU7Z0VBQ1osTUFBTSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQzs2REFDakQ7eURBQ0Y7d0RBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnREFDVCxDQUFDLENBQUMsRUFBRTtnREFDSixrQkFBa0IsRUFBRTtvREFDbEIsTUFBTSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQztpREFDakQ7NkNBQ0Y7eUNBQ0Y7cUNBQ0YsQ0FBQztnQ0FDTixHQUFHLEVBQUU7b0NBQ0gsT0FBTyxFQUFFO3dDQUNQLGtCQUFrQixFQUFFOzRDQUNsQixNQUFNLEVBQUU7Z0RBQ04sS0FBSyxFQUFFO29EQUNMLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dEQUN4QyxVQUFVLEVBQUU7NERBQ1YsT0FBTyxFQUFFO2dFQUNQLElBQUksRUFBRSxRQUFROzZEQUNmOzREQUNELElBQUksRUFBRTtnRUFDSixJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO2dFQUNsQixJQUFJLEVBQUUsUUFBUTs2REFDZjs0REFDRCxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsWUFBWSxpQkFBaUI7Z0VBQzdDLENBQUMsQ0FBQyxFQUFFO2dFQUNKLENBQUMsQ0FBQztvRUFDRSxJQUFJLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDO2lFQUNoRCxDQUFDO3lEQUNQO3dEQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7d0RBQzdCLElBQUksRUFBRSxRQUFRO3FEQUNmLENBQUMsQ0FBQztpREFDSjs2Q0FDRjt5Q0FDRjtxQ0FDRjtpQ0FDRjtnQ0FDRCxHQUFHLEVBQUUsRUFBRTs2QkFDUjs0QkFDRCxPQUFPLEVBQ0wsRUFBRSxDQUFDLFdBQVc7aUNBQ1gsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLHFCQUFxQixDQUFDO2lDQUMvQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUEyQixDQUFDLElBQUksQ0FBQztpQ0FDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVM7NEJBQzNCLElBQUksRUFBRSxDQUFDLGdCQUFnQixDQUFDO3lCQUN6QixDQUFDO3FCQUNIO2lCQUNGO2FBQ0Y7WUFFRCxHQUFHLENBQUMsS0FBSyxDQUNQLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2IsUUFBUSxFQUFFLENBQUMsa0JBQWtCLENBQUM7Z0JBQzlCLFdBQVc7Z0JBQ1gsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLEtBQUs7Z0JBQ0wsUUFBUSxFQUFFLENBQUMsa0JBQWtCLENBQUM7Z0JBQzlCLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQzthQUNuQixDQUFDLENBQ0gsQ0FBQztTQUNIO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1NBQ3RCO1FBRUQsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSBcIkBzZGtnZW4vcGFyc2VyXCI7XG5pbXBvcnQge1xuICBEZWNpbWFsUHJpbWl0aXZlVHlwZSxcbiAgSnNvblByaW1pdGl2ZVR5cGUsXG4gIEFycmF5VHlwZSxcbiAgQmFzZTY0UHJpbWl0aXZlVHlwZSxcbiAgQmlnSW50UHJpbWl0aXZlVHlwZSxcbiAgQm9vbFByaW1pdGl2ZVR5cGUsXG4gIEJ5dGVzUHJpbWl0aXZlVHlwZSxcbiAgQ25walByaW1pdGl2ZVR5cGUsXG4gIENwZlByaW1pdGl2ZVR5cGUsXG4gIERhdGVQcmltaXRpdmVUeXBlLFxuICBEYXRlVGltZVByaW1pdGl2ZVR5cGUsXG4gIERlc2NyaXB0aW9uQW5ub3RhdGlvbixcbiAgRW1haWxQcmltaXRpdmVUeXBlLFxuICBFbnVtVHlwZSxcbiAgRmxvYXRQcmltaXRpdmVUeXBlLFxuICBIZXhQcmltaXRpdmVUeXBlLFxuICBIdG1sUHJpbWl0aXZlVHlwZSxcbiAgSW50UHJpbWl0aXZlVHlwZSxcbiAgTW9uZXlQcmltaXRpdmVUeXBlLFxuICBPcHRpb25hbFR5cGUsXG4gIFJlc3RBbm5vdGF0aW9uLFxuICBTdHJpbmdQcmltaXRpdmVUeXBlLFxuICBTdHJ1Y3RUeXBlLFxuICBUeXBlUmVmZXJlbmNlLFxuICBVSW50UHJpbWl0aXZlVHlwZSxcbiAgVXJsUHJpbWl0aXZlVHlwZSxcbiAgVXVpZFByaW1pdGl2ZVR5cGUsXG4gIFZvaWRQcmltaXRpdmVUeXBlLFxufSBmcm9tIFwiQHNka2dlbi9wYXJzZXJcIjtcbmltcG9ydCB0eXBlIHsgSlNPTlNjaGVtYSB9IGZyb20gXCJqc29uLXNjaGVtYS10eXBlZFwiO1xuaW1wb3J0IHN0YXRpY0ZpbGVzSGFuZGxlciBmcm9tIFwic2VydmUtaGFuZGxlclwiO1xuaW1wb3J0IHsgZ2V0QWJzb2x1dGVGU1BhdGggYXMgZ2V0U3dhZ2dlclVpQXNzZXRQYXRoIH0gZnJvbSBcInN3YWdnZXItdWktZGlzdFwiO1xuXG5pbXBvcnQgdHlwZSB7IFNka2dlbkh0dHBTZXJ2ZXIgfSBmcm9tIFwiLi9odHRwLXNlcnZlci5qc1wiO1xuXG5jb25zdCBzd2FnZ2VyVWlBc3NldFBhdGggPSBnZXRTd2FnZ2VyVWlBc3NldFBhdGgoKTtcblxuZnVuY3Rpb24gb2JqZWN0RnJvbUVudHJpZXM8VD4oZW50cmllczogQXJyYXk8W3N0cmluZywgVF0+KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCAuLi5BcnJheS5mcm9tKGVudHJpZXMsIChbaywgdl0pID0+ICh7IFtrXTogdiB9KSkpIGFzIHsgW2tleTogc3RyaW5nXTogVCB9O1xufVxuXG5mdW5jdGlvbiB0eXBlVG9TY2hlbWEoZGVmaW5pdGlvbnM6IFJlY29yZDxzdHJpbmcsIEpTT05TY2hlbWEgfCB1bmRlZmluZWQ+LCB0eXBlOiBUeXBlKTogSlNPTlNjaGVtYSAmIG9iamVjdCB7XG4gIGlmICh0eXBlIGluc3RhbmNlb2YgRW51bVR5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW51bTogdHlwZS52YWx1ZXMubWFwKHggPT4geC52YWx1ZSksXG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFN0cnVjdFR5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvcGVydGllczogb2JqZWN0RnJvbUVudHJpZXMoXG4gICAgICAgIHR5cGUuZmllbGRzLm1hcChmaWVsZCA9PiBbXG4gICAgICAgICAgZmllbGQubmFtZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgZmllbGQuYW5ub3RhdGlvbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHggPT4geCBpbnN0YW5jZW9mIERlc2NyaXB0aW9uQW5ub3RhdGlvbilcbiAgICAgICAgICAgICAgICAubWFwKHggPT4gKHggYXMgRGVzY3JpcHRpb25Bbm5vdGF0aW9uKS50ZXh0KVxuICAgICAgICAgICAgICAgIC5qb2luKFwiIFwiKSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAuLi50eXBlVG9TY2hlbWEoZGVmaW5pdGlvbnMsIGZpZWxkLnR5cGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICAgIHJlcXVpcmVkOiB0eXBlLmZpZWxkcy5maWx0ZXIoZiA9PiAhKGYudHlwZSBpbnN0YW5jZW9mIE9wdGlvbmFsVHlwZSkpLm1hcChmID0+IGYubmFtZSksXG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoXG4gICAgdHlwZSBpbnN0YW5jZW9mIFN0cmluZ1ByaW1pdGl2ZVR5cGUgfHxcbiAgICB0eXBlIGluc3RhbmNlb2YgVXVpZFByaW1pdGl2ZVR5cGUgfHxcbiAgICB0eXBlIGluc3RhbmNlb2YgSGV4UHJpbWl0aXZlVHlwZSB8fFxuICAgIHR5cGUgaW5zdGFuY2VvZiBIdG1sUHJpbWl0aXZlVHlwZSB8fFxuICAgIHR5cGUgaW5zdGFuY2VvZiBCYXNlNjRQcmltaXRpdmVUeXBlXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFVybFByaW1pdGl2ZVR5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9ybWF0OiBcInVyaVwiLFxuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBEYXRlUHJpbWl0aXZlVHlwZSkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6IFwiZGF0ZVwiLFxuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBEYXRlVGltZVByaW1pdGl2ZVR5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9ybWF0OiBcImRhdGUtdGltZVwiLFxuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBDcGZQcmltaXRpdmVUeXBlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgQ25walByaW1pdGl2ZVR5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBCb29sUHJpbWl0aXZlVHlwZSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBCeXRlc1ByaW1pdGl2ZVR5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9ybWF0OiBcImJ5dGVcIiBhcyBuZXZlcixcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSW50UHJpbWl0aXZlVHlwZSkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6IFwiaW50MzJcIiBhcyBuZXZlcixcbiAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFVJbnRQcmltaXRpdmVUeXBlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1hdDogXCJpbnQzMlwiIGFzIG5ldmVyLFxuICAgICAgbWluaW11bTogMCxcbiAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIE1vbmV5UHJpbWl0aXZlVHlwZSkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6IFwiaW50NjRcIiBhcyBuZXZlcixcbiAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIEZsb2F0UHJpbWl0aXZlVHlwZSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIEVtYWlsUHJpbWl0aXZlVHlwZSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIEJpZ0ludFByaW1pdGl2ZVR5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBEZWNpbWFsUHJpbWl0aXZlVHlwZSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIEpzb25QcmltaXRpdmVUeXBlKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBPcHRpb25hbFR5cGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb25lT2Y6IFt0eXBlVG9TY2hlbWEoZGVmaW5pdGlvbnMsIHR5cGUuYmFzZSksIHsgdHlwZTogXCJudWxsXCIgfV0sXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgQXJyYXlUeXBlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiB0eXBlVG9TY2hlbWEoZGVmaW5pdGlvbnMsIHR5cGUuYmFzZSksXG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgVHlwZVJlZmVyZW5jZSkge1xuICAgIGlmICghZGVmaW5pdGlvbnNbdHlwZS5uYW1lXSkge1xuICAgICAgZGVmaW5pdGlvbnNbdHlwZS5uYW1lXSA9IHR5cGVUb1NjaGVtYShkZWZpbml0aW9ucywgdHlwZS50eXBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyAkcmVmOiBgIy9kZWZpbml0aW9ucy8ke3R5cGUubmFtZX1gIH07XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCB0eXBlICR7dHlwZS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBTd2FnZ2VyPEV4dHJhQ29udGV4dFQ+KHNlcnZlcjogU2RrZ2VuSHR0cFNlcnZlcjxFeHRyYUNvbnRleHRUPik6IHZvaWQge1xuICBzZXJ2ZXIuYWRkSHR0cEhhbmRsZXIoXCJHRVRcIiwgXCIvc3dhZ2dlclwiLCAocmVxLCByZXMpID0+IHtcbiAgICBpZiAoIXNlcnZlci5pbnRyb3NwZWN0aW9uKSB7XG4gICAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXMud3JpdGUoYFxuICAgICAgICAgICAgPCFET0NUWVBFIGh0bWw+XG4gICAgICAgICAgICA8aHRtbCBsYW5nPVwiZW5cIj5cbiAgICAgICAgICAgIDxoZWFkPlxuICAgICAgICAgICAgICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiPlxuICAgICAgICAgICAgICAgIDx0aXRsZT5Td2FnZ2VyIFVJPC90aXRsZT5cbiAgICAgICAgICAgICAgICA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIgaHJlZj1cIi9zd2FnZ2VyL3N3YWdnZXItdWkuY3NzXCIgPlxuICAgICAgICAgICAgICAgIDxsaW5rIHJlbD1cImljb25cIiB0eXBlPVwiaW1hZ2UvcG5nXCIgaHJlZj1cIi9zd2FnZ2VyL2Zhdmljb24tMzJ4MzIucG5nXCIgc2l6ZXM9XCIzMngzMlwiIC8+XG4gICAgICAgICAgICAgICAgPGxpbmsgcmVsPVwiaWNvblwiIHR5cGU9XCJpbWFnZS9wbmdcIiBocmVmPVwiL3N3YWdnZXIvZmF2aWNvbi0xNngxNi5wbmdcIiBzaXplcz1cIjE2eDE2XCIgLz5cbiAgICAgICAgICAgICAgICA8c3R5bGU+XG4gICAgICAgICAgICAgICAgICAgIGh0bWwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiAtbW96LXNjcm9sbGJhcnMtdmVydGljYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAqLCAqOmJlZm9yZSwgKjphZnRlciB7XG4gICAgICAgICAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBpbmhlcml0O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYm9keSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLnN3YWdnZXItdWkgLnNjaGVtZS1jb250YWluZXIsIC5zd2FnZ2VyLXVpIC50b3BiYXIge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9zdHlsZT5cbiAgICAgICAgICAgIDwvaGVhZD5cblxuICAgICAgICAgICAgPGJvZHk+XG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInN3YWdnZXItdWlcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8c2NyaXB0IHNyYz1cIi9zd2FnZ2VyL3N3YWdnZXItdWktYnVuZGxlLmpzXCI+IDwvc2NyaXB0PlxuICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPVwiL3N3YWdnZXIvc3dhZ2dlci11aS1zdGFuZGFsb25lLXByZXNldC5qc1wiPiA8L3NjcmlwdD5cbiAgICAgICAgICAgICAgICA8c2NyaXB0PlxuICAgICAgICAgICAgICAgIHdpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnVpID0gU3dhZ2dlclVJQnVuZGxlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbG9jYXRpb24ub3JpZ2luICsgXCIvc3dhZ2dlci5qc29uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb21faWQ6ICcjc3dhZ2dlci11aScsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWVwTGlua2luZzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2FnZ2VyVUlCdW5kbGUucHJlc2V0cy5hcGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3YWdnZXJVSVN0YW5kYWxvbmVQcmVzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3YWdnZXJVSUJ1bmRsZS5wbHVnaW5zLkRvd25sb2FkVXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dDogXCJTdGFuZGFsb25lTGF5b3V0XCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9zY3JpcHQ+XG4gICAgICAgICAgICA8L2JvZHk+XG4gICAgICAgICAgICA8L2h0bWw+XG4gICAgICAgIGApO1xuICAgIHJlcy5lbmQoKTtcbiAgfSk7XG5cbiAgc2VydmVyLmFkZEh0dHBIYW5kbGVyKFwiR0VUXCIsIC9eXFwvc3dhZ2dlci4qL3UsIChyZXEsIHJlcykgPT4ge1xuICAgIGlmICghc2VydmVyLmludHJvc3BlY3Rpb24pIHtcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgcmVzLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChyZXEudXJsKSB7XG4gICAgICByZXEudXJsID0gcmVxLnVybC5yZXBsYWNlKC9cXC9zd2FnZ2VyL3UsIFwiXCIpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbFxuICAgIHN0YXRpY0ZpbGVzSGFuZGxlcihyZXEsIHJlcywge1xuICAgICAgY2xlYW5VcmxzOiBmYWxzZSxcbiAgICAgIGRpcmVjdG9yeUxpc3Rpbmc6IGZhbHNlLFxuICAgICAgZXRhZzogdHJ1ZSxcbiAgICAgIHB1YmxpYzogc3dhZ2dlclVpQXNzZXRQYXRoLFxuICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgICAgcmVzLndyaXRlKGAke2V9YCk7XG4gICAgICByZXMuZW5kKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHNlcnZlci5hZGRIdHRwSGFuZGxlcihcIkdFVFwiLCBcIi9zd2FnZ2VyLmpzb25cIiwgKHJlcSwgcmVzKSA9PiB7XG4gICAgaWYgKCFzZXJ2ZXIuaW50cm9zcGVjdGlvbikge1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgICByZXMuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlZmluaXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBKU09OU2NoZW1hIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGNvbnN0IHBhdGhzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgICAgIGZvciAoY29uc3Qgb3Agb2Ygc2VydmVyLmFwaUNvbmZpZy5hc3Qub3BlcmF0aW9ucykge1xuICAgICAgICBmb3IgKGNvbnN0IGFubiBvZiBvcC5hbm5vdGF0aW9ucykge1xuICAgICAgICAgIGlmIChhbm4gaW5zdGFuY2VvZiBSZXN0QW5ub3RhdGlvbikge1xuICAgICAgICAgICAgaWYgKCFwYXRoc1thbm4ucGF0aF0pIHtcbiAgICAgICAgICAgICAgcGF0aHNbYW5uLnBhdGhdID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgICAgIHBhdGhzW2Fubi5wYXRoXVthbm4ubWV0aG9kLnRvTG93ZXJDYXNlKCldID0ge1xuICAgICAgICAgICAgICBvcGVyYXRpb25JZDogb3AubmFtZSxcbiAgICAgICAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgICAgICAgIC4uLmFubi5wYXRoVmFyaWFibGVzLm1hcChuYW1lID0+ICh7XG4gICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgICAgICAgYXJnOiBvcC5hcmdzLmZpbmQoYXJnID0+IGFyZy5uYW1lID09PSBuYW1lKSEsXG4gICAgICAgICAgICAgICAgICBsb2NhdGlvbjogXCJwYXRoXCIsXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAuLi5hbm4ucXVlcnlWYXJpYWJsZXMubWFwKG5hbWUgPT4gKHtcbiAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgICAgICBhcmc6IG9wLmFyZ3MuZmluZChhcmcgPT4gYXJnLm5hbWUgPT09IG5hbWUpISxcbiAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBcInF1ZXJ5XCIsXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAuLi5bLi4uYW5uLmhlYWRlcnMuZW50cmllcygpXS5tYXAoKFtoZWFkZXIsIG5hbWVdKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICAgIGFyZzogb3AuYXJncy5maW5kKGFyZyA9PiBhcmcubmFtZSA9PT0gbmFtZSkhLFxuICAgICAgICAgICAgICAgICAgbG9jYXRpb246IFwiaGVhZGVyXCIsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICBdLm1hcCgoeyBuYW1lLCBsb2NhdGlvbiwgYXJnIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgICBhcmcuYW5ub3RhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih4ID0+IHggaW5zdGFuY2VvZiBEZXNjcmlwdGlvbkFubm90YXRpb24pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoeCA9PiAoeCBhcyBEZXNjcmlwdGlvbkFubm90YXRpb24pLnRleHQpXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiIFwiKSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgaW46IGxvY2F0aW9uLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICEoYXJnLnR5cGUgaW5zdGFuY2VvZiBPcHRpb25hbFR5cGUpLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogdHlwZVRvU2NoZW1hKGRlZmluaXRpb25zLCBhcmcudHlwZSksXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgcmVxdWVzdEJvZHk6IGFubi5ib2R5VmFyaWFibGVcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5VHlwZSA9IG9wLmFyZ3MuZmluZChhcmcgPT4gYXJnLm5hbWUgPT09IGFubi5ib2R5VmFyaWFibGUpPy50eXBlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9keVR5cGUgaW5zdGFuY2VvZiBCb29sUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5VHlwZSBpbnN0YW5jZW9mIEludFByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keVR5cGUgaW5zdGFuY2VvZiBVSW50UHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5VHlwZSBpbnN0YW5jZW9mIEZsb2F0UHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5VHlwZSBpbnN0YW5jZW9mIFN0cmluZ1ByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keVR5cGUgaW5zdGFuY2VvZiBEYXRlUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5VHlwZSBpbnN0YW5jZW9mIERhdGVUaW1lUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5VHlwZSBpbnN0YW5jZW9mIE1vbmV5UHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5VHlwZSBpbnN0YW5jZW9mIENwZlByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keVR5cGUgaW5zdGFuY2VvZiBDbnBqUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5VHlwZSBpbnN0YW5jZW9mIEVtYWlsUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5VHlwZSBpbnN0YW5jZW9mIEh0bWxQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlUeXBlIGluc3RhbmNlb2YgVXVpZFByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keVR5cGUgaW5zdGFuY2VvZiBIZXhQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlUeXBlIGluc3RhbmNlb2YgQnl0ZXNQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlUeXBlIGluc3RhbmNlb2YgQmFzZTY0UHJpbWl0aXZlVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtib2R5VHlwZSBpbnN0YW5jZW9mIEh0bWxQcmltaXRpdmVUeXBlID8gXCJ0ZXh0L2h0bWxcIiA6IFwidGV4dC9wbGFpblwiXToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHR5cGVUb1NjaGVtYShkZWZpbml0aW9ucywgYm9keVR5cGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDoge307XG4gICAgICAgICAgICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgICAgICAgICAgICBcImFwcGxpY2F0aW9uL2pzb25cIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYTogdHlwZVRvU2NoZW1hKGRlZmluaXRpb25zLCBvcC5hcmdzLmZpbmQoYXJnID0+IGFyZy5uYW1lID09PSBhbm4uYm9keVZhcmlhYmxlKSEudHlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICEob3AuYXJncy5maW5kKGFyZyA9PiBhcmcubmFtZSA9PT0gYW5uLmJvZHlWYXJpYWJsZSkhLnR5cGUgaW5zdGFuY2VvZiBPcHRpb25hbFR5cGUpLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICByZXNwb25zZXM6IHtcbiAgICAgICAgICAgICAgICAuLi4ob3AucmV0dXJuVHlwZSBpbnN0YW5jZW9mIE9wdGlvbmFsVHlwZSB8fCBvcC5yZXR1cm5UeXBlIGluc3RhbmNlb2YgVm9pZFByaW1pdGl2ZVR5cGVcbiAgICAgICAgICAgICAgICAgID8geyBbYW5uLm1ldGhvZCA9PT0gXCJHRVRcIiA/IFwiNDA0XCIgOiBcIjIwNFwiXToge30gfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgLi4uKG9wLnJldHVyblR5cGUgaW5zdGFuY2VvZiBWb2lkUHJpbWl0aXZlVHlwZVxuICAgICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wLnJldHVyblR5cGUgaW5zdGFuY2VvZiBCb29sUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmV0dXJuVHlwZSBpbnN0YW5jZW9mIEludFByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLnJldHVyblR5cGUgaW5zdGFuY2VvZiBVSW50UHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmV0dXJuVHlwZSBpbnN0YW5jZW9mIEZsb2F0UHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmV0dXJuVHlwZSBpbnN0YW5jZW9mIFN0cmluZ1ByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLnJldHVyblR5cGUgaW5zdGFuY2VvZiBEYXRlUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmV0dXJuVHlwZSBpbnN0YW5jZW9mIERhdGVUaW1lUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmV0dXJuVHlwZSBpbnN0YW5jZW9mIE1vbmV5UHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmV0dXJuVHlwZSBpbnN0YW5jZW9mIENwZlByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLnJldHVyblR5cGUgaW5zdGFuY2VvZiBDbnBqUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmV0dXJuVHlwZSBpbnN0YW5jZW9mIEVtYWlsUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmV0dXJuVHlwZSBpbnN0YW5jZW9mIFV1aWRQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC5yZXR1cm5UeXBlIGluc3RhbmNlb2YgSGV4UHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmV0dXJuVHlwZSBpbnN0YW5jZW9mIEJ5dGVzUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AucmV0dXJuVHlwZSBpbnN0YW5jZW9mIEJhc2U2NFByaW1pdGl2ZVR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGV4dC9wbGFpblwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHR5cGVUb1NjaGVtYShkZWZpbml0aW9ucywgb3AucmV0dXJuVHlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhcHBsaWNhdGlvbi9qc29uXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHR5cGVUb1NjaGVtYShkZWZpbml0aW9ucywgb3AucmV0dXJuVHlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIDQwMDoge1xuICAgICAgICAgICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgICAgICAgICBcImFwcGxpY2F0aW9uL2pzb25cIjoge1xuICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW55T2Y6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmFwaUNvbmZpZy5hc3QuZXJyb3JzLm1hcChlcnJvciA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW06IFtlcnJvci5uYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oZXJyb3IuZGF0YVR5cGUgaW5zdGFuY2VvZiBWb2lkUHJpbWl0aXZlVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdHlwZVRvU2NoZW1hKGRlZmluaXRpb25zLCBlcnJvci5kYXRhVHlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogW1widHlwZVwiLCBcIm1lc3NhZ2VcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIDUwMDoge30sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHN1bW1hcnk6XG4gICAgICAgICAgICAgICAgb3AuYW5ub3RhdGlvbnNcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoeCA9PiB4IGluc3RhbmNlb2YgRGVzY3JpcHRpb25Bbm5vdGF0aW9uKVxuICAgICAgICAgICAgICAgICAgLm1hcCh4ID0+ICh4IGFzIERlc2NyaXB0aW9uQW5ub3RhdGlvbikudGV4dClcbiAgICAgICAgICAgICAgICAgIC5qb2luKFwiIFwiKSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHRhZ3M6IFtcIlJFU1QgRW5kcG9pbnRzXCJdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVzLndyaXRlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY29uc3VtZXM6IFtcImFwcGxpY2F0aW9uL2pzb25cIl0sXG4gICAgICAgICAgZGVmaW5pdGlvbnMsXG4gICAgICAgICAgaW5mbzoge30sXG4gICAgICAgICAgb3BlbmFwaTogXCIzLjAuM1wiLFxuICAgICAgICAgIHBhdGhzLFxuICAgICAgICAgIHByb2R1Y2VzOiBbXCJhcHBsaWNhdGlvbi9qc29uXCJdLFxuICAgICAgICAgIHNjaGVtZXM6IFtcImh0dHBzXCJdLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgfVxuXG4gICAgcmVzLmVuZCgpO1xuICB9KTtcbn1cbiJdfQ==
@@ -1,52 +1,54 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.apiTestWrapper = void 0;
4
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
5
2
  /* eslint-disable @typescript-eslint/no-unused-vars */
6
3
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
7
4
  /* eslint-disable @typescript-eslint/no-unsafe-call */
8
5
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
9
6
  /* eslint-disable @typescript-eslint/no-unsafe-return */
10
- const crypto_1 = require("crypto");
11
- const encode_decode_1 = require("./encode-decode");
12
- const execute_1 = require("./execute");
13
- function apiTestWrapper(api) {
14
- const wrappedApi = new api.constructor();
7
+ import { randomBytes } from "crypto";
8
+ import { BaseApiConfig } from "./api-config.js";
9
+ import { decode, encode } from "./encode-decode.js";
10
+ import { executeRequest } from "./execute.js";
11
+ export function apiTestWrapper(api, extraContext) {
12
+ const wrappedApi = new BaseApiConfig();
15
13
  for (const functionName of Object.keys(api.astJson.functionTable)) {
16
14
  wrappedApi.fn[functionName] = async (partialCtx, args) => {
17
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
18
- const encodedArgs = (0, encode_decode_1.encode)(api.astJson.typeTable, `fn.${functionName}.args`, api.astJson.functionTable[functionName].args, args);
19
- const ctx = Object.assign(Object.assign({}, partialCtx), { request: {
15
+ const encodedArgs = encode(api.astJson.typeTable, `fn.${functionName}.args`, api.astJson.functionTable[functionName].args, args);
16
+ const ctx = {
17
+ ...extraContext,
18
+ ...partialCtx,
19
+ request: {
20
20
  args: encodedArgs,
21
- deviceInfo: (_b = (_a = partialCtx.request) === null || _a === void 0 ? void 0 : _a.deviceInfo) !== null && _b !== void 0 ? _b : {
21
+ deviceInfo: partialCtx.request?.deviceInfo ?? {
22
22
  fingerprint: null,
23
- id: (0, crypto_1.randomBytes)(16).toString("hex"),
23
+ id: randomBytes(16).toString("hex"),
24
24
  language: null,
25
25
  platform: null,
26
26
  timezone: null,
27
27
  type: "test",
28
28
  version: null,
29
29
  },
30
- extra: (_d = (_c = partialCtx.request) === null || _c === void 0 ? void 0 : _c.extra) !== null && _d !== void 0 ? _d : {},
31
- files: (_f = (_e = partialCtx.request) === null || _e === void 0 ? void 0 : _e.files) !== null && _f !== void 0 ? _f : [],
32
- headers: (_h = (_g = partialCtx.request) === null || _g === void 0 ? void 0 : _g.headers) !== null && _h !== void 0 ? _h : {},
33
- id: (_k = (_j = partialCtx.request) === null || _j === void 0 ? void 0 : _j.id) !== null && _k !== void 0 ? _k : (0, crypto_1.randomBytes)(16).toString("hex"),
34
- ip: (_m = (_l = partialCtx.request) === null || _l === void 0 ? void 0 : _l.ip) !== null && _m !== void 0 ? _m : "0.0.0.0",
30
+ extra: partialCtx.request?.extra ?? {},
31
+ files: partialCtx.request?.files ?? [],
32
+ headers: partialCtx.request?.headers ?? {},
33
+ id: partialCtx.request?.id ?? randomBytes(16).toString("hex"),
34
+ ip: partialCtx.request?.ip ?? "0.0.0.0",
35
35
  name: functionName,
36
36
  version: 3,
37
- }, response: {
37
+ },
38
+ response: {
38
39
  headers: new Map(),
39
- } });
40
- const reply = await (0, execute_1.executeRequest)(ctx, api);
40
+ },
41
+ };
42
+ const reply = await executeRequest(ctx, api);
41
43
  if (reply.error) {
42
44
  throw reply.error;
43
45
  }
44
46
  else {
45
- const decodedRet = (0, encode_decode_1.decode)(api.astJson.typeTable, `fn.${functionName}.ret`, api.astJson.functionTable[functionName].ret, JSON.parse(JSON.stringify(reply.result)));
47
+ const decodedRet = decode(api.astJson.typeTable, `fn.${functionName}.ret`, api.astJson.functionTable[functionName].ret, JSON.parse(JSON.stringify(reply.result)));
46
48
  return decodedRet;
47
49
  }
48
50
  };
49
51
  }
50
52
  return wrappedApi;
51
53
  }
52
- exports.apiTestWrapper = apiTestWrapper;
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC13cmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3Qtd3JhcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsc0RBQXNEO0FBQ3RELDREQUE0RDtBQUM1RCxzREFBc0Q7QUFDdEQsK0RBQStEO0FBQy9ELHdEQUF3RDtBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXJDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUMsTUFBTSxVQUFVLGNBQWMsQ0FBMkQsR0FBUyxFQUFFLFlBQW9DO0lBQ3RJLE1BQU0sVUFBVSxHQUFHLElBQUksYUFBYSxFQUFpQixDQUFDO0lBRXRELEtBQUssTUFBTSxZQUFZLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQ2pFLFVBQVUsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsS0FBSyxFQUFFLFVBQTRCLEVBQUUsSUFBUyxFQUFFLEVBQUU7WUFDOUUsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sWUFBWSxPQUFPLEVBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUUxSSxNQUFNLEdBQUcsR0FBWTtnQkFDbkIsR0FBRyxZQUFZO2dCQUNmLEdBQUcsVUFBVTtnQkFDYixPQUFPLEVBQUU7b0JBQ1AsSUFBSSxFQUFFLFdBQXNDO29CQUM1QyxVQUFVLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUk7d0JBQzVDLFdBQVcsRUFBRSxJQUFJO3dCQUNqQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7d0JBQ25DLFFBQVEsRUFBRSxJQUFJO3dCQUNkLFFBQVEsRUFBRSxJQUFJO3dCQUNkLFFBQVEsRUFBRSxJQUFJO3dCQUNkLElBQUksRUFBRSxNQUFNO3dCQUNaLE9BQU8sRUFBRSxJQUFJO3FCQUNkO29CQUNELEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUN0QyxLQUFLLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDdEMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxJQUFJLEVBQUU7b0JBQzFDLEVBQUUsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDN0QsRUFBRSxFQUFFLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLFNBQVM7b0JBQ3ZDLElBQUksRUFBRSxZQUFZO29CQUNsQixPQUFPLEVBQUUsQ0FBQztpQkFDWDtnQkFDRCxRQUFRLEVBQUU7b0JBQ1IsT0FBTyxFQUFFLElBQUksR0FBRyxFQUFFO2lCQUNuQjthQUNGLENBQUM7WUFFRixNQUFNLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQyxHQUE4QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRXhFLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRTtnQkFDZixNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUM7YUFDbkI7aUJBQU07Z0JBQ0wsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUN2QixHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFDckIsTUFBTSxZQUFZLE1BQU0sRUFDdkIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsRUFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUN6QyxDQUFDO2dCQUVGLE9BQU8sVUFBVSxDQUFDO2FBQ25CO1FBQ0gsQ0FBQyxDQUFDO0tBQ0g7SUFFRCxPQUFPLFVBQWtCLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWNhbGwgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm4gKi9cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSBcImNyeXB0b1wiO1xuXG5pbXBvcnQgeyBCYXNlQXBpQ29uZmlnIH0gZnJvbSBcIi4vYXBpLWNvbmZpZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dC5qc1wiO1xuaW1wb3J0IHsgZGVjb2RlLCBlbmNvZGUgfSBmcm9tIFwiLi9lbmNvZGUtZGVjb2RlLmpzXCI7XG5pbXBvcnQgeyBleGVjdXRlUmVxdWVzdCB9IGZyb20gXCIuL2V4ZWN1dGUuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwaVRlc3RXcmFwcGVyPEV4dHJhQ29udGV4dFQsIEFwaVQgZXh0ZW5kcyBCYXNlQXBpQ29uZmlnPEV4dHJhQ29udGV4dFQ+PihhcGk6IEFwaVQsIGV4dHJhQ29udGV4dDogUGFydGlhbDxFeHRyYUNvbnRleHRUPik6IEFwaVQge1xuICBjb25zdCB3cmFwcGVkQXBpID0gbmV3IEJhc2VBcGlDb25maWc8RXh0cmFDb250ZXh0VD4oKTtcblxuICBmb3IgKGNvbnN0IGZ1bmN0aW9uTmFtZSBvZiBPYmplY3Qua2V5cyhhcGkuYXN0SnNvbi5mdW5jdGlvblRhYmxlKSkge1xuICAgIHdyYXBwZWRBcGkuZm5bZnVuY3Rpb25OYW1lXSA9IGFzeW5jIChwYXJ0aWFsQ3R4OiBQYXJ0aWFsPENvbnRleHQ+LCBhcmdzOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGVuY29kZWRBcmdzID0gZW5jb2RlKGFwaS5hc3RKc29uLnR5cGVUYWJsZSwgYGZuLiR7ZnVuY3Rpb25OYW1lfS5hcmdzYCwgKGFwaS5hc3RKc29uLmZ1bmN0aW9uVGFibGUgYXMgYW55KVtmdW5jdGlvbk5hbWVdLmFyZ3MsIGFyZ3MpO1xuXG4gICAgICBjb25zdCBjdHg6IENvbnRleHQgPSB7XG4gICAgICAgIC4uLmV4dHJhQ29udGV4dCxcbiAgICAgICAgLi4ucGFydGlhbEN0eCxcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIGFyZ3M6IGVuY29kZWRBcmdzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIGRldmljZUluZm86IHBhcnRpYWxDdHgucmVxdWVzdD8uZGV2aWNlSW5mbyA/PyB7XG4gICAgICAgICAgICBmaW5nZXJwcmludDogbnVsbCxcbiAgICAgICAgICAgIGlkOiByYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJoZXhcIiksXG4gICAgICAgICAgICBsYW5ndWFnZTogbnVsbCxcbiAgICAgICAgICAgIHBsYXRmb3JtOiBudWxsLFxuICAgICAgICAgICAgdGltZXpvbmU6IG51bGwsXG4gICAgICAgICAgICB0eXBlOiBcInRlc3RcIixcbiAgICAgICAgICAgIHZlcnNpb246IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBleHRyYTogcGFydGlhbEN0eC5yZXF1ZXN0Py5leHRyYSA/PyB7fSxcbiAgICAgICAgICBmaWxlczogcGFydGlhbEN0eC5yZXF1ZXN0Py5maWxlcyA/PyBbXSxcbiAgICAgICAgICBoZWFkZXJzOiBwYXJ0aWFsQ3R4LnJlcXVlc3Q/LmhlYWRlcnMgPz8ge30sXG4gICAgICAgICAgaWQ6IHBhcnRpYWxDdHgucmVxdWVzdD8uaWQgPz8gcmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKFwiaGV4XCIpLFxuICAgICAgICAgIGlwOiBwYXJ0aWFsQ3R4LnJlcXVlc3Q/LmlwID8/IFwiMC4wLjAuMFwiLFxuICAgICAgICAgIG5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiAzLFxuICAgICAgICB9LFxuICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgIGhlYWRlcnM6IG5ldyBNYXAoKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlcGx5ID0gYXdhaXQgZXhlY3V0ZVJlcXVlc3QoY3R4IGFzIENvbnRleHQgJiBFeHRyYUNvbnRleHRULCBhcGkpO1xuXG4gICAgICBpZiAocmVwbHkuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgcmVwbHkuZXJyb3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZWNvZGVkUmV0ID0gZGVjb2RlKFxuICAgICAgICAgIGFwaS5hc3RKc29uLnR5cGVUYWJsZSxcbiAgICAgICAgICBgZm4uJHtmdW5jdGlvbk5hbWV9LnJldGAsXG4gICAgICAgICAgKGFwaS5hc3RKc29uLmZ1bmN0aW9uVGFibGUgYXMgYW55KVtmdW5jdGlvbk5hbWVdLnJldCxcbiAgICAgICAgICBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcGx5LnJlc3VsdCkpLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBkZWNvZGVkUmV0O1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gd3JhcHBlZEFwaSBhcyBBcGlUO1xufVxuIl19
package/dist/src/utils.js CHANGED
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.has = void 0;
4
- function has(target, property) {
1
+ export function has(target, property) {
5
2
  return property in target;
6
3
  }
7
- exports.has = has;
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBY0EsTUFBTSxVQUFVLEdBQUcsQ0FBd0IsTUFBYyxFQUFFLFFBQVc7SUFDcEUsT0FBTyxRQUFRLElBQUksTUFBTSxDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBEZWVwUmVhZG9ubHk8VD4gPSBUIGV4dGVuZHMgdW5kZWZpbmVkIHwgbnVsbCB8IGJvb2xlYW4gfCBzdHJpbmcgfCBudW1iZXIgfCBGdW5jdGlvblxuICA/IFRcbiAgOiBUIGV4dGVuZHMgW11cbiAgPyByZWFkb25seSBbXVxuICA6IFQgZXh0ZW5kcyBbaW5mZXIgVSwgLi4uaW5mZXIgUmVzdF1cbiAgPyByZWFkb25seSBbRGVlcFJlYWRvbmx5PFU+LCAuLi5EZWVwUmVhZG9ubHk8UmVzdD5dXG4gIDogVCBleHRlbmRzIEFycmF5PGluZmVyIFU+XG4gID8gUmVhZG9ubHlBcnJheTxEZWVwUmVhZG9ubHk8VT4+XG4gIDogVCBleHRlbmRzIE1hcDxpbmZlciBLLCBpbmZlciBWPlxuICA/IFJlYWRvbmx5TWFwPERlZXBSZWFkb25seTxLPiwgRGVlcFJlYWRvbmx5PFY+PlxuICA6IFQgZXh0ZW5kcyBTZXQ8aW5mZXIgVT5cbiAgPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VT4+XG4gIDogeyByZWFkb25seSBbSyBpbiBrZXlvZiBUXTogRGVlcFJlYWRvbmx5PFRbS10+IH07XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXM8UCBleHRlbmRzIFByb3BlcnR5S2V5Pih0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHk6IFApOiB0YXJnZXQgaXMgeyBbSyBpbiBQXTogdW5rbm93biB9IHtcbiAgcmV0dXJuIHByb3BlcnR5IGluIHRhcmdldDtcbn1cbiJdfQ==