@sdkgen/node-runtime 0.0.0-dev.20230110171718 → 0.0.0-dev.20230120141325

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.
@@ -1,28 +1,36 @@
1
- import { randomBytes } from "crypto";
2
- import { createReadStream, createWriteStream, unlink } from "fs";
3
- import { createServer } from "http";
4
- import { hostname } from "os";
5
- import { parse as parseQuerystring } from "querystring";
6
- import { parse as parseUrl } from "url";
7
- import { promisify } from "util";
8
- import { generateCSharpServerSource } from "@sdkgen/csharp-generator";
9
- import { generateDartClientSource } from "@sdkgen/dart-generator";
10
- import { generateFSharpServerSource } from "@sdkgen/fsharp-generator";
11
- import { generateAndroidClientSource } from "@sdkgen/kotlin-generator";
12
- import { DecimalPrimitiveType, Base64PrimitiveType, BigIntPrimitiveType, BoolPrimitiveType, BytesPrimitiveType, CnpjPrimitiveType, CpfPrimitiveType, DatePrimitiveType, DateTimePrimitiveType, FloatPrimitiveType, HexPrimitiveType, HtmlPrimitiveType, IntPrimitiveType, MoneyPrimitiveType, OptionalType, RestAnnotation, StringPrimitiveType, UIntPrimitiveType, UuidPrimitiveType, VoidPrimitiveType, XmlPrimitiveType, } from "@sdkgen/parser";
13
- // import { PLAYGROUND_PUBLIC_PATH } from "@sdkgen/playground";
14
- import { generateSwiftClientSource } from "@sdkgen/swift-generator";
15
- import { generateBrowserClientSource, generateNodeClientSource, generateNodeServerSource } from "@sdkgen/typescript-generator";
16
- import Busboy from "busboy";
17
- import { fileTypeFromBuffer } from "file-type";
18
- import { getClientIp } from "request-ip";
19
- import { decode, encode } from "./encode-decode.js";
20
- import { Fatal } from "./error.js";
21
- import { executeRequest } from "./execute.js";
22
- import { setupSwagger } from "./swagger.js";
23
- import { has } from "./utils.js";
24
- export class SdkgenHttpServer {
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.SdkgenHttpServer = void 0;
7
+ const crypto_1 = require("crypto");
8
+ const fs_1 = require("fs");
9
+ const http_1 = require("http");
10
+ const os_1 = require("os");
11
+ const querystring_1 = require("querystring");
12
+ const url_1 = require("url");
13
+ const util_1 = require("util");
14
+ const csharp_generator_1 = require("@sdkgen/csharp-generator");
15
+ const dart_generator_1 = require("@sdkgen/dart-generator");
16
+ const fsharp_generator_1 = require("@sdkgen/fsharp-generator");
17
+ const kotlin_generator_1 = require("@sdkgen/kotlin-generator");
18
+ const parser_1 = require("@sdkgen/parser");
19
+ const playground_1 = require("@sdkgen/playground");
20
+ const swift_generator_1 = require("@sdkgen/swift-generator");
21
+ const typescript_generator_1 = require("@sdkgen/typescript-generator");
22
+ const busboy_1 = __importDefault(require("busboy"));
23
+ const file_type_1 = __importDefault(require("file-type"));
24
+ const request_ip_1 = require("request-ip");
25
+ const serve_handler_1 = __importDefault(require("serve-handler"));
26
+ const encode_decode_1 = require("./encode-decode");
27
+ const error_1 = require("./error");
28
+ const execute_1 = require("./execute");
29
+ const swagger_1 = require("./swagger");
30
+ const utils_1 = require("./utils");
31
+ class SdkgenHttpServer {
25
32
  constructor(apiConfig, ...maybeExtraContext) {
33
+ var _a;
26
34
  this.apiConfig = apiConfig;
27
35
  this.headers = new Map();
28
36
  this.healthChecks = [];
@@ -63,7 +71,7 @@ export class SdkgenHttpServer {
63
71
  this.handleRequestWithBody(req, res, body, hrStart).catch((e) => this.writeReply(res, null, { error: e }, hrStart));
64
72
  };
65
73
  // Google Cloud Functions add a rawBody property to the request object
66
- if (has(req, "rawBody") && req.rawBody instanceof Buffer) {
74
+ if ((0, utils_1.has)(req, "rawBody") && req.rawBody instanceof Buffer) {
67
75
  handleBody(req.rawBody);
68
76
  }
69
77
  else {
@@ -75,21 +83,21 @@ export class SdkgenHttpServer {
75
83
  });
76
84
  }
77
85
  };
78
- this.extraContext = (maybeExtraContext[0] ?? {});
79
- this.httpServer = createServer(this.handleRequest.bind(this));
86
+ this.extraContext = ((_a = maybeExtraContext[0]) !== null && _a !== void 0 ? _a : {});
87
+ this.httpServer = (0, http_1.createServer)(this.handleRequest.bind(this));
80
88
  this.enableCors();
81
89
  this.attachRestHandlers();
82
90
  const targetTable = [
83
- ["/targets/android/client.kt", (ast) => generateAndroidClientSource(ast, true)],
84
- ["/targets/android/client_without_callbacks.kt", (ast) => generateAndroidClientSource(ast, false)],
85
- ["/targets/dotnet/api.cs", generateCSharpServerSource],
86
- ["/targets/dotnet/api.fs", generateFSharpServerSource],
87
- ["/targets/flutter/client.dart", generateDartClientSource],
88
- ["/targets/ios/client.swift", (ast) => generateSwiftClientSource(ast, false)],
89
- ["/targets/ios/client-rx.swift", (ast) => generateSwiftClientSource(ast, true)],
90
- ["/targets/node/api.ts", generateNodeServerSource],
91
- ["/targets/node/client.ts", generateNodeClientSource],
92
- ["/targets/web/client.ts", generateBrowserClientSource],
91
+ ["/targets/android/client.kt", (ast) => (0, kotlin_generator_1.generateAndroidClientSource)(ast, true)],
92
+ ["/targets/android/client_without_callbacks.kt", (ast) => (0, kotlin_generator_1.generateAndroidClientSource)(ast, false)],
93
+ ["/targets/dotnet/api.cs", csharp_generator_1.generateCSharpServerSource],
94
+ ["/targets/dotnet/api.fs", fsharp_generator_1.generateFSharpServerSource],
95
+ ["/targets/flutter/client.dart", dart_generator_1.generateDartClientSource],
96
+ ["/targets/ios/client.swift", (ast) => (0, swift_generator_1.generateSwiftClientSource)(ast, false)],
97
+ ["/targets/ios/client-rx.swift", (ast) => (0, swift_generator_1.generateSwiftClientSource)(ast, true)],
98
+ ["/targets/node/api.ts", typescript_generator_1.generateNodeServerSource],
99
+ ["/targets/node/client.ts", typescript_generator_1.generateNodeClientSource],
100
+ ["/targets/web/client.ts", typescript_generator_1.generateBrowserClientSource],
93
101
  ];
94
102
  for (const [path, generateFn] of targetTable) {
95
103
  this.addHttpHandler("GET", path, (_req, res) => {
@@ -120,27 +128,27 @@ export class SdkgenHttpServer {
120
128
  res.write(JSON.stringify(apiConfig.astJson));
121
129
  res.end();
122
130
  });
123
- // this.addHttpHandler("GET", /^\/playground.*/u, (req, res) => {
124
- // if (!this.introspection) {
125
- // res.statusCode = 404;
126
- // res.end();
127
- // return;
128
- // }
129
- // if (req.url) {
130
- // req.url = req.url.endsWith("/playground") ? req.url.replace(/\/playground/u, "/index.html") : req.url.replace(/\/playground/u, "");
131
- // }
132
- // staticFilesHandler(req, res, {
133
- // cleanUrls: false,
134
- // directoryListing: false,
135
- // etag: true,
136
- // public: PLAYGROUND_PUBLIC_PATH,
137
- // }).catch(e => {
138
- // console.error(e);
139
- // res.statusCode = 500;
140
- // res.write(`${e}`);
141
- // res.end();
142
- // });
143
- // });
131
+ this.addHttpHandler("GET", /^\/playground.*/u, (req, res) => {
132
+ if (!this.introspection) {
133
+ res.statusCode = 404;
134
+ res.end();
135
+ return;
136
+ }
137
+ if (req.url) {
138
+ req.url = req.url.endsWith("/playground") ? req.url.replace(/\/playground/u, "/index.html") : req.url.replace(/\/playground/u, "");
139
+ }
140
+ (0, serve_handler_1.default)(req, res, {
141
+ cleanUrls: false,
142
+ directoryListing: false,
143
+ etag: true,
144
+ public: playground_1.PLAYGROUND_PUBLIC_PATH,
145
+ }).catch(e => {
146
+ console.error(e);
147
+ res.statusCode = 500;
148
+ res.write(`${e}`);
149
+ res.end();
150
+ });
151
+ });
144
152
  }
145
153
  registerHealthCheck(healthCheck) {
146
154
  this.healthChecks.push(healthCheck);
@@ -168,9 +176,9 @@ export class SdkgenHttpServer {
168
176
  else {
169
177
  console.log(`\nListening on port ${addr.port} (${addr.address})`);
170
178
  }
171
- // if (this.introspection) {
172
- // console.log(`Playground: http://${urlHost}/playground`);
173
- // }
179
+ if (this.introspection) {
180
+ console.log(`Playground: http://${urlHost}/playground`);
181
+ }
174
182
  if (this.hasSwagger) {
175
183
  console.log(`Swagger UI: http://${urlHost}/swagger`);
176
184
  }
@@ -180,7 +188,7 @@ export class SdkgenHttpServer {
180
188
  });
181
189
  }
182
190
  async close() {
183
- return promisify(this.httpServer.close.bind(this.httpServer))();
191
+ return (0, util_1.promisify)(this.httpServer.close.bind(this.httpServer))();
184
192
  }
185
193
  enableCors() {
186
194
  this.addHeader("Access-Control-Allow-Methods", "DELETE, HEAD, PUT, POST, PATCH, GET, OPTIONS");
@@ -206,10 +214,11 @@ export class SdkgenHttpServer {
206
214
  const matchingHandlers = this.handlers
207
215
  .filter(({ method }) => method === req.method)
208
216
  .filter(({ matcher }) => {
217
+ var _a;
209
218
  if (typeof matcher === "string") {
210
219
  return matcher === path;
211
220
  }
212
- return matcher.exec(path)?.[0] === path;
221
+ return ((_a = matcher.exec(path)) === null || _a === void 0 ? void 0 : _a[0]) === path;
213
222
  })
214
223
  .sort(({ matcher: first }, { matcher: second }) => {
215
224
  // Prefer string matches instead of Regexp matches
@@ -244,11 +253,11 @@ export class SdkgenHttpServer {
244
253
  }
245
254
  for (const op of this.apiConfig.ast.operations) {
246
255
  for (const ann of op.annotations) {
247
- if (!(ann instanceof RestAnnotation)) {
256
+ if (!(ann instanceof parser_1.RestAnnotation)) {
248
257
  continue;
249
258
  }
250
259
  if (!this.hasSwagger) {
251
- setupSwagger(this);
260
+ (0, swagger_1.setupSwagger)(this);
252
261
  this.hasSwagger = true;
253
262
  }
254
263
  const pathFragments = ann.path.split(/\{\w+\}/u);
@@ -265,11 +274,12 @@ export class SdkgenHttpServer {
265
274
  }
266
275
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
267
276
  this.addHttpHandler(ann.method, new RegExp(pathRegex, "u"), async (req, res, body) => {
277
+ var _a, _b, _c, _d, _e, _f, _g;
268
278
  try {
269
279
  const args = {};
270
280
  const files = [];
271
- const { pathname, query } = parseUrl(req.url ?? "");
272
- const match = pathname?.match(pathRegex);
281
+ const { pathname, query } = (0, url_1.parse)((_a = req.url) !== null && _a !== void 0 ? _a : "");
282
+ const match = pathname === null || pathname === void 0 ? void 0 : pathname.match(pathRegex);
273
283
  if (!match) {
274
284
  res.statusCode = 404;
275
285
  return;
@@ -280,33 +290,33 @@ export class SdkgenHttpServer {
280
290
  const argValue = match[i + 1];
281
291
  simpleArgs.set(argName, argValue);
282
292
  }
283
- const parsedQuery = query ? parseQuerystring(query) : {};
293
+ const parsedQuery = query ? (0, querystring_1.parse)(query) : {};
284
294
  for (const argName of ann.queryVariables) {
285
- const argValue = parsedQuery[argName] ?? null;
295
+ const argValue = (_b = parsedQuery[argName]) !== null && _b !== void 0 ? _b : null;
286
296
  if (argValue === null) {
287
297
  continue;
288
298
  }
289
299
  simpleArgs.set(argName, Array.isArray(argValue) ? argValue.join("") : argValue);
290
300
  }
291
301
  for (const [headerName, argName] of ann.headers) {
292
- const argValue = req.headers[headerName.toLowerCase()] ?? null;
302
+ const argValue = (_c = req.headers[headerName.toLowerCase()]) !== null && _c !== void 0 ? _c : null;
293
303
  if (argValue === null) {
294
304
  continue;
295
305
  }
296
306
  simpleArgs.set(argName, Array.isArray(argValue) ? argValue.join("") : argValue);
297
307
  }
298
- if (!ann.bodyVariable && req.headers["content-type"]?.match(/^application\/x-www-form-urlencoded/iu)) {
299
- const parsedBody = parseQuerystring(body.toString());
308
+ if (!ann.bodyVariable && ((_d = req.headers["content-type"]) === null || _d === void 0 ? void 0 : _d.match(/^application\/x-www-form-urlencoded/iu))) {
309
+ const parsedBody = (0, querystring_1.parse)(body.toString());
300
310
  for (const argName of ann.queryVariables) {
301
- const argValue = parsedBody[argName] ?? null;
311
+ const argValue = (_e = parsedBody[argName]) !== null && _e !== void 0 ? _e : null;
302
312
  if (argValue === null) {
303
313
  continue;
304
314
  }
305
315
  simpleArgs.set(argName, Array.isArray(argValue) ? argValue.join("") : argValue);
306
316
  }
307
317
  }
308
- else if (!ann.bodyVariable && req.headers["content-type"]?.match(/^multipart\/form-data/iu)) {
309
- const busboy = Busboy({ headers: req.headers });
318
+ else if (!ann.bodyVariable && ((_f = req.headers["content-type"]) === null || _f === void 0 ? void 0 : _f.match(/^multipart\/form-data/iu))) {
319
+ const busboy = (0, busboy_1.default)({ headers: req.headers });
310
320
  const filePromises = [];
311
321
  busboy.on("field", (field, value) => {
312
322
  if (ann.queryVariables.includes(field)) {
@@ -314,15 +324,15 @@ export class SdkgenHttpServer {
314
324
  }
315
325
  });
316
326
  busboy.on("file", (_field, stream, info) => {
317
- const tempName = randomBytes(32).toString("hex");
318
- const writeStream = createWriteStream(tempName);
327
+ const tempName = (0, crypto_1.randomBytes)(32).toString("hex");
328
+ const writeStream = (0, fs_1.createWriteStream)(tempName);
319
329
  filePromises.push(new Promise((resolve, reject) => {
320
330
  writeStream.on("error", reject);
321
331
  writeStream.on("close", () => {
322
- const contents = createReadStream(tempName);
332
+ const contents = (0, fs_1.createReadStream)(tempName);
323
333
  files.push({ contents, name: info.filename });
324
334
  contents.on("open", () => {
325
- unlink(tempName, err => {
335
+ (0, fs_1.unlink)(tempName, err => {
326
336
  if (err) {
327
337
  reject(err);
328
338
  }
@@ -347,13 +357,13 @@ export class SdkgenHttpServer {
347
357
  else if (ann.bodyVariable) {
348
358
  const argName = ann.bodyVariable;
349
359
  const arg = op.args.find(x => x.name === argName);
350
- if (/application\/json/iu.test(req.headers["content-type"] ?? "")) {
360
+ if (/application\/json/iu.test((_g = req.headers["content-type"]) !== null && _g !== void 0 ? _g : "")) {
351
361
  args[argName] = JSON.parse(body.toString());
352
362
  }
353
363
  else if (arg) {
354
364
  let { type } = arg;
355
365
  let solved = false;
356
- if (type instanceof OptionalType) {
366
+ if (type instanceof parser_1.OptionalType) {
357
367
  if (body.length === 0) {
358
368
  args[argName] = null;
359
369
  solved = true;
@@ -363,24 +373,24 @@ export class SdkgenHttpServer {
363
373
  }
364
374
  }
365
375
  if (!solved) {
366
- if (type instanceof BoolPrimitiveType ||
367
- type instanceof IntPrimitiveType ||
368
- type instanceof UIntPrimitiveType ||
369
- type instanceof FloatPrimitiveType ||
370
- type instanceof StringPrimitiveType ||
371
- type instanceof DatePrimitiveType ||
372
- type instanceof DateTimePrimitiveType ||
373
- type instanceof MoneyPrimitiveType ||
374
- type instanceof DecimalPrimitiveType ||
375
- type instanceof BigIntPrimitiveType ||
376
- type instanceof CpfPrimitiveType ||
377
- type instanceof CnpjPrimitiveType ||
378
- type instanceof UuidPrimitiveType ||
379
- type instanceof HexPrimitiveType ||
380
- type instanceof Base64PrimitiveType) {
376
+ if (type instanceof parser_1.BoolPrimitiveType ||
377
+ type instanceof parser_1.IntPrimitiveType ||
378
+ type instanceof parser_1.UIntPrimitiveType ||
379
+ type instanceof parser_1.FloatPrimitiveType ||
380
+ type instanceof parser_1.StringPrimitiveType ||
381
+ type instanceof parser_1.DatePrimitiveType ||
382
+ type instanceof parser_1.DateTimePrimitiveType ||
383
+ type instanceof parser_1.MoneyPrimitiveType ||
384
+ type instanceof parser_1.DecimalPrimitiveType ||
385
+ type instanceof parser_1.BigIntPrimitiveType ||
386
+ type instanceof parser_1.CpfPrimitiveType ||
387
+ type instanceof parser_1.CnpjPrimitiveType ||
388
+ type instanceof parser_1.UuidPrimitiveType ||
389
+ type instanceof parser_1.HexPrimitiveType ||
390
+ type instanceof parser_1.Base64PrimitiveType) {
381
391
  simpleArgs.set(argName, body.toString());
382
392
  }
383
- else if (type instanceof BytesPrimitiveType) {
393
+ else if (type instanceof parser_1.BytesPrimitiveType) {
384
394
  args[argName] = body.toString("base64");
385
395
  }
386
396
  else {
@@ -395,7 +405,7 @@ export class SdkgenHttpServer {
395
405
  continue;
396
406
  }
397
407
  let { type } = arg;
398
- if (type instanceof OptionalType) {
408
+ if (type instanceof parser_1.OptionalType) {
399
409
  if (argValue === null) {
400
410
  args[argName] = null;
401
411
  continue;
@@ -408,7 +418,7 @@ export class SdkgenHttpServer {
408
418
  args[argName] = argValue;
409
419
  continue;
410
420
  }
411
- if (type instanceof BoolPrimitiveType) {
421
+ if (type instanceof parser_1.BoolPrimitiveType) {
412
422
  if (argValue === "true") {
413
423
  args[argName] = true;
414
424
  }
@@ -419,17 +429,17 @@ export class SdkgenHttpServer {
419
429
  args[argName] = argValue;
420
430
  }
421
431
  }
422
- else if (type instanceof UIntPrimitiveType || type instanceof IntPrimitiveType || type instanceof MoneyPrimitiveType) {
432
+ else if (type instanceof parser_1.UIntPrimitiveType || type instanceof parser_1.IntPrimitiveType || type instanceof parser_1.MoneyPrimitiveType) {
423
433
  args[argName] = parseInt(argValue, 10);
424
434
  }
425
- else if (type instanceof FloatPrimitiveType) {
435
+ else if (type instanceof parser_1.FloatPrimitiveType) {
426
436
  args[argName] = parseFloat(argValue);
427
437
  }
428
438
  else {
429
439
  args[argName] = argValue;
430
440
  }
431
441
  }
432
- const ip = getClientIp(req);
442
+ const ip = (0, request_ip_1.getClientIp)(req);
433
443
  if (!ip) {
434
444
  throw new Error("Couldn't determine client IP");
435
445
  }
@@ -437,7 +447,7 @@ export class SdkgenHttpServer {
437
447
  args,
438
448
  deviceInfo: {
439
449
  fingerprint: null,
440
- id: randomBytes(16).toString("hex"),
450
+ id: (0, crypto_1.randomBytes)(16).toString("hex"),
441
451
  language: null,
442
452
  platform: null,
443
453
  timezone: null,
@@ -447,7 +457,7 @@ export class SdkgenHttpServer {
447
457
  extra: {},
448
458
  files,
449
459
  headers: req.headers,
450
- id: randomBytes(16).toString("hex"),
460
+ id: (0, crypto_1.randomBytes)(16).toString("hex"),
451
461
  ip,
452
462
  name: op.name,
453
463
  version: 3,
@@ -459,13 +469,15 @@ export class SdkgenHttpServer {
459
469
  res.setHeader(headerKey, headerValue);
460
470
  }
461
471
  }
462
- if (ctx?.response.statusCode) {
472
+ if (ctx === null || ctx === void 0 ? void 0 : ctx.response.statusCode) {
463
473
  res.statusCode = ctx.response.statusCode;
464
474
  }
465
475
  if (reply.error) {
466
476
  const error = this.makeResponseError(reply.error);
467
- if (!ctx?.response.statusCode) {
468
- res.statusCode = error.type === "Fatal" ? 500 : 400;
477
+ if (!(ctx === null || ctx === void 0 ? void 0 : ctx.response.statusCode)) {
478
+ const errorNode = this.apiConfig.ast.errors.find(node => node.name === error.type);
479
+ const statusAnnotation = errorNode === null || errorNode === void 0 ? void 0 : errorNode.annotations.find(x => x instanceof parser_1.StatusCodeAnnotation);
480
+ res.statusCode = statusAnnotation ? statusAnnotation.statusCode : error.type === "Fatal" ? 500 : 400;
469
481
  }
470
482
  res.setHeader("content-type", "application/json");
471
483
  res.write(JSON.stringify(error));
@@ -479,9 +491,9 @@ export class SdkgenHttpServer {
479
491
  }
480
492
  else {
481
493
  let type = op.returnType;
482
- if (type instanceof OptionalType) {
494
+ if (type instanceof parser_1.OptionalType) {
483
495
  if (reply.result === null) {
484
- if (!ctx?.response.statusCode) {
496
+ if (!(ctx === null || ctx === void 0 ? void 0 : ctx.response.statusCode)) {
485
497
  res.statusCode = ann.method === "GET" ? 404 : 204;
486
498
  }
487
499
  res.end();
@@ -489,41 +501,42 @@ export class SdkgenHttpServer {
489
501
  }
490
502
  type = type.base;
491
503
  }
492
- if (type instanceof BoolPrimitiveType ||
493
- type instanceof IntPrimitiveType ||
494
- type instanceof UIntPrimitiveType ||
495
- type instanceof FloatPrimitiveType ||
496
- type instanceof StringPrimitiveType ||
497
- type instanceof DatePrimitiveType ||
498
- type instanceof DateTimePrimitiveType ||
499
- type instanceof MoneyPrimitiveType ||
500
- type instanceof DecimalPrimitiveType ||
501
- type instanceof BigIntPrimitiveType ||
502
- type instanceof CpfPrimitiveType ||
503
- type instanceof CnpjPrimitiveType ||
504
- type instanceof UuidPrimitiveType ||
505
- type instanceof HexPrimitiveType ||
506
- type instanceof Base64PrimitiveType) {
504
+ if (type instanceof parser_1.BoolPrimitiveType ||
505
+ type instanceof parser_1.IntPrimitiveType ||
506
+ type instanceof parser_1.UIntPrimitiveType ||
507
+ type instanceof parser_1.FloatPrimitiveType ||
508
+ type instanceof parser_1.StringPrimitiveType ||
509
+ type instanceof parser_1.DatePrimitiveType ||
510
+ type instanceof parser_1.DateTimePrimitiveType ||
511
+ type instanceof parser_1.MoneyPrimitiveType ||
512
+ type instanceof parser_1.DecimalPrimitiveType ||
513
+ type instanceof parser_1.BigIntPrimitiveType ||
514
+ type instanceof parser_1.CpfPrimitiveType ||
515
+ type instanceof parser_1.CnpjPrimitiveType ||
516
+ type instanceof parser_1.UuidPrimitiveType ||
517
+ type instanceof parser_1.HexPrimitiveType ||
518
+ type instanceof parser_1.Base64PrimitiveType) {
507
519
  res.setHeader("content-type", "text/plain");
508
520
  res.write(`${reply.result}`);
509
521
  res.end();
510
522
  }
511
- else if (type instanceof HtmlPrimitiveType) {
523
+ else if (type instanceof parser_1.HtmlPrimitiveType) {
512
524
  res.setHeader("content-type", "text/html");
513
525
  res.write(`${reply.result}`);
514
526
  res.end();
515
527
  }
516
- else if (type instanceof XmlPrimitiveType) {
528
+ else if (type instanceof parser_1.XmlPrimitiveType) {
517
529
  res.setHeader("content-type", "text/xml");
518
530
  res.write(`${reply.result}`);
519
531
  res.end();
520
532
  }
521
- else if (type instanceof BytesPrimitiveType) {
533
+ else if (type instanceof parser_1.BytesPrimitiveType) {
522
534
  const buffer = Buffer.from(reply.result, "base64");
523
535
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
524
- fileTypeFromBuffer(buffer)
536
+ file_type_1.default.fromBuffer(buffer)
525
537
  .then(fileType => {
526
- res.setHeader("content-type", fileType?.mime ?? "application/octet-stream");
538
+ var _a;
539
+ res.setHeader("content-type", (_a = fileType === null || fileType === void 0 ? void 0 : fileType.mime) !== null && _a !== void 0 ? _a : "application/octet-stream");
527
540
  })
528
541
  .catch(err => {
529
542
  console.error(err);
@@ -563,12 +576,13 @@ export class SdkgenHttpServer {
563
576
  }
564
577
  }
565
578
  async handleRequestWithBody(req, res, body, hrStart) {
566
- const { pathname, query } = parseUrl(req.url ?? "");
567
- let path = pathname ?? "";
579
+ var _a, _b;
580
+ const { pathname, query } = (0, url_1.parse)((_a = req.url) !== null && _a !== void 0 ? _a : "");
581
+ let path = pathname !== null && pathname !== void 0 ? pathname : "";
568
582
  if (path.startsWith(this.ignoredUrlPrefix)) {
569
583
  path = path.slice(this.ignoredUrlPrefix.length);
570
584
  }
571
- if (!req.headers["content-type"]?.match(/application\/sdkgen/iu)) {
585
+ if (!((_b = req.headers["content-type"]) === null || _b === void 0 ? void 0 : _b.match(/application\/sdkgen/iu))) {
572
586
  const externalHandler = this.findBestHandler(path, req);
573
587
  if (externalHandler) {
574
588
  this.log(`HTTP ${req.method} ${path}${query ? `?${query}` : ""}`);
@@ -610,31 +624,27 @@ export class SdkgenHttpServer {
610
624
  res.end();
611
625
  return;
612
626
  }
613
- const clientIp = getClientIp(req);
627
+ const clientIp = (0, request_ip_1.getClientIp)(req);
614
628
  if (!clientIp) {
615
629
  this.writeReply(res, null, {
616
- error: new Fatal("Couldn't determine client IP"),
630
+ error: new error_1.Fatal("Couldn't determine client IP"),
617
631
  }, hrStart);
618
632
  return;
619
633
  }
620
634
  const request = this.parseRequest(req, body.toString(), clientIp);
621
635
  if (!request) {
622
636
  this.writeReply(res, null, {
623
- error: new Fatal("Couldn't parse request"),
637
+ error: new error_1.Fatal("Couldn't parse request"),
624
638
  }, hrStart);
625
639
  return;
626
640
  }
627
641
  await this.executeRequest(request, (ctx, reply) => this.writeReply(res, ctx, reply, hrStart));
628
642
  }
629
643
  async executeRequest(request, writeReply) {
630
- const ctx = {
631
- ...this.extraContext,
632
- request,
633
- response: {
644
+ const ctx = Object.assign(Object.assign({}, this.extraContext), { request, response: {
634
645
  headers: new Map(),
635
- },
636
- };
637
- writeReply(ctx, await executeRequest(ctx, this.apiConfig));
646
+ } });
647
+ writeReply(ctx, await (0, execute_1.executeRequest)(ctx, this.apiConfig));
638
648
  }
639
649
  parseRequest(req, body, ip) {
640
650
  switch (this.identifyRequestVersion(req, body)) {
@@ -650,20 +660,21 @@ export class SdkgenHttpServer {
650
660
  }
651
661
  identifyRequestVersion(_req, body) {
652
662
  const parsed = JSON.parse(body);
653
- if (typeof parsed === "object" && parsed && has(parsed, "version") && typeof parsed.version === "number") {
663
+ if (typeof parsed === "object" && parsed && (0, utils_1.has)(parsed, "version") && typeof parsed.version === "number") {
654
664
  return parsed.version;
655
665
  }
656
- else if (typeof parsed === "object" && parsed && has(parsed, "requestId")) {
666
+ else if (typeof parsed === "object" && parsed && (0, utils_1.has)(parsed, "requestId")) {
657
667
  return 2;
658
668
  }
659
- else if (typeof parsed === "object" && parsed && has(parsed, "device")) {
669
+ else if (typeof parsed === "object" && parsed && (0, utils_1.has)(parsed, "device")) {
660
670
  return 1;
661
671
  }
662
672
  return 3;
663
673
  }
664
674
  // Old Sdkgen format
665
675
  parseRequestV1(req, body, ip) {
666
- const parsed = decode({
676
+ var _a, _b;
677
+ const parsed = (0, encode_decode_1.decode)({
667
678
  Request: {
668
679
  args: "json",
669
680
  device: "RequestDevice",
@@ -680,7 +691,7 @@ export class SdkgenHttpServer {
680
691
  version: "string?",
681
692
  },
682
693
  }, "root", "Request", JSON.parse(body));
683
- const deviceId = parsed.device.id ?? randomBytes(20).toString("hex");
694
+ const deviceId = (_a = parsed.device.id) !== null && _a !== void 0 ? _a : (0, crypto_1.randomBytes)(20).toString("hex");
684
695
  if (!parsed.args || Array.isArray(parsed.args) || typeof parsed.args !== "object") {
685
696
  throw new Error("Expected 'args' to be an object");
686
697
  }
@@ -692,7 +703,7 @@ export class SdkgenHttpServer {
692
703
  language: parsed.device.language,
693
704
  platform: parsed.device.platform,
694
705
  timezone: parsed.device.timezone,
695
- type: parsed.device.type ?? (typeof parsed.device.platform === "string" ? parsed.device.platform : ""),
706
+ type: (_b = parsed.device.type) !== null && _b !== void 0 ? _b : (typeof parsed.device.platform === "string" ? parsed.device.platform : ""),
696
707
  version: parsed.device.version,
697
708
  },
698
709
  extra: {},
@@ -706,7 +717,8 @@ export class SdkgenHttpServer {
706
717
  }
707
718
  // Maxima sdkgen format
708
719
  parseRequestV2(req, body, ip) {
709
- const parsed = decode({
720
+ var _a, _b;
721
+ const parsed = (0, encode_decode_1.decode)({
710
722
  Request: {
711
723
  args: "json",
712
724
  deviceFingerprint: "string?",
@@ -733,7 +745,7 @@ export class SdkgenHttpServer {
733
745
  id: parsed.deviceId,
734
746
  language: parsed.info.language,
735
747
  platform: {
736
- browserUserAgent: parsed.info.browserUserAgent ?? null,
748
+ browserUserAgent: (_a = parsed.info.browserUserAgent) !== null && _a !== void 0 ? _a : null,
737
749
  },
738
750
  timezone: null,
739
751
  type: parsed.info.type,
@@ -745,7 +757,7 @@ export class SdkgenHttpServer {
745
757
  },
746
758
  files: [],
747
759
  headers: req.headers,
748
- id: `${parsed.deviceId}-${parsed.requestId ?? randomBytes(16).toString("hex")}`,
760
+ id: `${parsed.deviceId}-${(_b = parsed.requestId) !== null && _b !== void 0 ? _b : (0, crypto_1.randomBytes)(16).toString("hex")}`,
749
761
  ip,
750
762
  name: parsed.name,
751
763
  version: 2,
@@ -753,7 +765,8 @@ export class SdkgenHttpServer {
753
765
  }
754
766
  // New sdkgen format
755
767
  parseRequestV3(req, body, ip) {
756
- const parsed = decode({
768
+ var _a, _b, _c, _d;
769
+ const parsed = (0, encode_decode_1.decode)({
757
770
  DeviceInfo: {
758
771
  fingerprint: "string?",
759
772
  id: "string?",
@@ -771,7 +784,7 @@ export class SdkgenHttpServer {
771
784
  requestId: "string?",
772
785
  },
773
786
  }, "root", "Request", JSON.parse(body));
774
- const deviceInfo = parsed.deviceInfo ?? {
787
+ const deviceInfo = (_a = parsed.deviceInfo) !== null && _a !== void 0 ? _a : {
775
788
  fingerprint: null,
776
789
  id: null,
777
790
  language: null,
@@ -780,7 +793,7 @@ export class SdkgenHttpServer {
780
793
  type: null,
781
794
  version: null,
782
795
  };
783
- const deviceId = deviceInfo.id ?? randomBytes(16).toString("hex");
796
+ const deviceId = (_b = deviceInfo.id) !== null && _b !== void 0 ? _b : (0, crypto_1.randomBytes)(16).toString("hex");
784
797
  if (!parsed.args || Array.isArray(parsed.args) || typeof parsed.args !== "object") {
785
798
  throw new Error("Expected 'args' to be an object");
786
799
  }
@@ -790,15 +803,15 @@ export class SdkgenHttpServer {
790
803
  fingerprint: deviceInfo.fingerprint,
791
804
  id: deviceId,
792
805
  language: deviceInfo.language,
793
- platform: typeof deviceInfo.platform === "object" ? { ...deviceInfo.platform } : {},
806
+ platform: typeof deviceInfo.platform === "object" ? Object.assign({}, deviceInfo.platform) : {},
794
807
  timezone: deviceInfo.timezone,
795
- type: deviceInfo.type ?? "api",
808
+ type: (_c = deviceInfo.type) !== null && _c !== void 0 ? _c : "api",
796
809
  version: deviceInfo.version,
797
810
  },
798
- extra: typeof parsed.extra === "object" ? { ...parsed.extra } : {},
811
+ extra: typeof parsed.extra === "object" ? Object.assign({}, parsed.extra) : {},
799
812
  files: [],
800
813
  headers: req.headers,
801
- id: `${deviceId}-${parsed.requestId ?? randomBytes(16).toString("hex")}`,
814
+ id: `${deviceId}-${(_d = parsed.requestId) !== null && _d !== void 0 ? _d : (0, crypto_1.randomBytes)(16).toString("hex")}`,
802
815
  ip,
803
816
  name: parsed.name,
804
817
  version: 3,
@@ -806,11 +819,11 @@ export class SdkgenHttpServer {
806
819
  }
807
820
  makeResponseError(err) {
808
821
  let type = "Fatal";
809
- if (typeof err === "object" && err !== null && has(err, "type") && typeof err.type === "string") {
822
+ if (typeof err === "object" && err !== null && (0, utils_1.has)(err, "type") && typeof err.type === "string") {
810
823
  ({ type } = err);
811
824
  }
812
825
  let message;
813
- if (typeof err === "object" && err !== null && has(err, "message") && typeof err.message === "string") {
826
+ if (typeof err === "object" && err !== null && (0, utils_1.has)(err, "message") && typeof err.message === "string") {
814
827
  ({ message } = err);
815
828
  }
816
829
  else if (err instanceof Error) {
@@ -823,14 +836,14 @@ export class SdkgenHttpServer {
823
836
  message = `${err}`;
824
837
  }
825
838
  let data;
826
- if (typeof err === "object" && err !== null && has(err, "data")) {
839
+ if (typeof err === "object" && err !== null && (0, utils_1.has)(err, "data")) {
827
840
  ({ data } = err);
828
841
  }
829
842
  const error = this.apiConfig.ast.errors.find(x => x.name === type);
830
843
  if (error) {
831
- if (!(error.dataType instanceof VoidPrimitiveType)) {
844
+ if (!(error.dataType instanceof parser_1.VoidPrimitiveType)) {
832
845
  try {
833
- data = encode(this.apiConfig.astJson.typeTable, `error.${type}`, error.dataType.name, data);
846
+ data = (0, encode_decode_1.encode)(this.apiConfig.astJson.typeTable, `error.${type}`, error.dataType.name, data);
834
847
  }
835
848
  catch (encodeError) {
836
849
  message = `Failed to encode error ${type} because: ${encodeError}. Original message: ${message}`;
@@ -844,10 +857,11 @@ export class SdkgenHttpServer {
844
857
  return { data, message, type };
845
858
  }
846
859
  writeReply(res, ctx, reply, hrStart) {
860
+ var _a, _b;
847
861
  if (!ctx) {
848
862
  res.statusCode = 500;
849
863
  res.write(JSON.stringify({
850
- error: this.makeResponseError(reply.error ?? new Fatal("Response without context")),
864
+ error: this.makeResponseError((_a = reply.error) !== null && _a !== void 0 ? _a : new error_1.Fatal("Response without context")),
851
865
  }));
852
866
  res.end();
853
867
  return;
@@ -870,7 +884,7 @@ export class SdkgenHttpServer {
870
884
  deviceId: ctx.request.deviceInfo.id,
871
885
  duration,
872
886
  error: reply.error ? this.makeResponseError(reply.error) : null,
873
- host: hostname(),
887
+ host: (0, os_1.hostname)(),
874
888
  id: ctx.request.id,
875
889
  ok: !reply.error,
876
890
  result: reply.error ? null : reply.result,
@@ -902,7 +916,7 @@ export class SdkgenHttpServer {
902
916
  const response = {
903
917
  duration,
904
918
  error: reply.error ? this.makeResponseError(reply.error) : null,
905
- host: hostname(),
919
+ host: (0, os_1.hostname)(),
906
920
  result: reply.error ? null : reply.result,
907
921
  };
908
922
  if (response.error && !ctx.response.statusCode) {
@@ -916,7 +930,7 @@ export class SdkgenHttpServer {
916
930
  default: {
917
931
  res.statusCode = 500;
918
932
  res.write(JSON.stringify({
919
- error: this.makeResponseError(reply.error ?? new Fatal("Unknown request version")),
933
+ error: this.makeResponseError((_b = reply.error) !== null && _b !== void 0 ? _b : new error_1.Fatal("Unknown request version")),
920
934
  }));
921
935
  res.end();
922
936
  return;
@@ -924,4 +938,4 @@ export class SdkgenHttpServer {
924
938
  }
925
939
  }
926
940
  }
927
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaHR0cC1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRWpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQztBQUM5QixPQUFPLEVBQUUsS0FBSyxJQUFJLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLElBQUksUUFBUSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFakMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdkUsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsWUFBWSxFQUNaLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsZ0JB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RUFBRTtvQkFDaEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU07aUJBQzFDLENBQUM7Z0JBRUYsSUFBSSxRQUFRLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUU7b0JBQzlDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztpQkFDdEY7Z0JBRUQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDOUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDVixNQUFNO2FBQ1A7WUFFRCxPQUFPLENBQUMsQ0FBQztnQkFDUCxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztnQkFDckIsR0FBRyxDQUFDLEtBQUssQ0FDUCxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNiLEtBQUssRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2lCQUNuRixDQUFDLENBQ0gsQ0FBQztnQkFDRixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1YsT0FBTzthQUNSO1NBQ0Y7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIGNyZWF0ZVdyaXRlU3RyZWFtLCB1bmxpbmsgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB0eXBlIHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXIsIFNlcnZlclJlc3BvbnNlIH0gZnJvbSBcImh0dHBcIjtcbmltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgdHlwZSB7IEFkZHJlc3NJbmZvIH0gZnJvbSBcIm5ldFwiO1xuaW1wb3J0IHsgaG9zdG5hbWUgfSBmcm9tIFwib3NcIjtcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlUXVlcnlzdHJpbmcgfSBmcm9tIFwicXVlcnlzdHJpbmdcIjtcbmltcG9ydCB7IHBhcnNlIGFzIHBhcnNlVXJsIH0gZnJvbSBcInVybFwiO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSBcInV0aWxcIjtcblxuaW1wb3J0IHsgZ2VuZXJhdGVDU2hhcnBTZXJ2ZXJTb3VyY2UgfSBmcm9tIFwiQHNka2dlbi9jc2hhcnAtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZURhcnRDbGllbnRTb3VyY2UgfSBmcm9tIFwiQHNka2dlbi9kYXJ0LWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVGU2hhcnBTZXJ2ZXJTb3VyY2UgfSBmcm9tIFwiQHNka2dlbi9mc2hhcnAtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUFuZHJvaWRDbGllbnRTb3VyY2UgfSBmcm9tIFwiQHNka2dlbi9rb3RsaW4tZ2VuZXJhdG9yXCI7XG5pbXBvcnQgdHlwZSB7IEFzdFJvb3QgfSBmcm9tIFwiQHNka2dlbi9wYXJzZXJcIjtcbmltcG9ydCB7XG4gIERlY2ltYWxQcmltaXRpdmVUeXBlLFxuICBCYXNlNjRQcmltaXRpdmVUeXBlLFxuICBCaWdJbnRQcmltaXRpdmVUeXBlLFxuICBCb29sUHJpbWl0aXZlVHlwZSxcbiAgQnl0ZXNQcmltaXRpdmVUeXBlLFxuICBDbnBqUHJpbWl0aXZlVHlwZSxcbiAgQ3BmUHJpbWl0aXZlVHlwZSxcbiAgRGF0ZVByaW1pdGl2ZVR5cGUsXG4gIERhdGVUaW1lUHJpbWl0aXZlVHlwZSxcbiAgRmxvYXRQcmltaXRpdmVUeXBlLFxuICBIZXhQcmltaXRpdmVUeXBlLFxuICBIdG1sUHJpbWl0aXZlVHlwZSxcbiAgSW50UHJpbWl0aXZlVHlwZSxcbiAgTW9uZXlQcmltaXRpdmVUeXBlLFxuICBPcHRpb25hbFR5cGUsXG4gIFJlc3RBbm5vdGF0aW9uLFxuICBTdHJpbmdQcmltaXRpdmVUeXBlLFxuICBVSW50UHJpbWl0aXZlVHlwZSxcbiAgVXVpZFByaW1pdGl2ZVR5cGUsXG4gIFZvaWRQcmltaXRpdmVUeXBlLFxuICBYbWxQcmltaXRpdmVUeXBlLFxufSBmcm9tIFwiQHNka2dlbi9wYXJzZXJcIjtcbi8vIGltcG9ydCB7IFBMQVlHUk9VTkRfUFVCTElDX1BBVEggfSBmcm9tIFwiQHNka2dlbi9wbGF5Z3JvdW5kXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVN3aWZ0Q2xpZW50U291cmNlIH0gZnJvbSBcIkBzZGtnZW4vc3dpZnQtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUJyb3dzZXJDbGllbnRTb3VyY2UsIGdlbmVyYXRlTm9kZUNsaWVudFNvdXJjZSwgZ2VuZXJhdGVOb2RlU2VydmVyU291cmNlIH0gZnJvbSBcIkBzZGtnZW4vdHlwZXNjcmlwdC1nZW5lcmF0b3JcIjtcbmltcG9ydCBCdXNib3kgZnJvbSBcImJ1c2JveVwiO1xuaW1wb3J0IHsgZmlsZVR5cGVGcm9tQnVmZmVyIH0gZnJvbSBcImZpbGUtdHlwZVwiO1xuaW1wb3J0IHsgZ2V0Q2xpZW50SXAgfSBmcm9tIFwicmVxdWVzdC1pcFwiO1xuaW1wb3J0IHN0YXRpY0ZpbGVzSGFuZGxlciBmcm9tIFwic2VydmUtaGFuZGxlclwiO1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VBcGlDb25maWcgfSBmcm9tIFwiLi9hcGktY29uZmlnLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQsIENvbnRleHRSZXBseSwgQ29udGV4dFJlcXVlc3QgfSBmcm9tIFwiLi9jb250ZXh0LmpzXCI7XG5pbXBvcnQgeyBkZWNvZGUsIGVuY29kZSB9IGZyb20gXCIuL2VuY29kZS1kZWNvZGUuanNcIjtcbmltcG9ydCB7IEZhdGFsIH0gZnJvbSBcIi4vZXJyb3IuanNcIjtcbmltcG9ydCB7IGV4ZWN1dGVSZXF1ZXN0IH0gZnJvbSBcIi4vZXhlY3V0ZS5qc1wiO1xuaW1wb3J0IHsgc2V0dXBTd2FnZ2VyIH0gZnJvbSBcIi4vc3dhZ2dlci5qc1wiO1xuaW1wb3J0IHsgaGFzIH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcblxuZXhwb3J0IGNsYXNzIFNka2dlbkh0dHBTZXJ2ZXI8RXh0cmFDb250ZXh0VCA9IHVua25vd24+IHtcbiAgcHVibGljIGh0dHBTZXJ2ZXI6IFNlcnZlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhlYWRlcnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGVhbHRoQ2hlY2tzOiBBcnJheTwoKSA9PiBQcm9taXNlPGJvb2xlYW4+PiA9IFtdO1xuXG4gIHByaXZhdGUgaGFuZGxlcnM6IEFycmF5PHtcbiAgICBtZXRob2Q6IHN0cmluZztcbiAgICBtYXRjaGVyOiBzdHJpbmcgfCBSZWdFeHA7XG4gICAgaGFuZGxlcihyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgYm9keTogQnVmZmVyKTogdm9pZDtcbiAgfT4gPSBbXTtcblxuICBwdWJsaWMgZHluYW1pY0NvcnNPcmlnaW4gPSB0cnVlO1xuXG4gIHB1YmxpYyBpbnRyb3NwZWN0aW9uID0gdHJ1ZTtcblxuICBwdWJsaWMgbG9nID0gKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgIGNvbnNvbGUubG9nKGAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX0gJHttZXNzYWdlfWApO1xuICB9O1xuXG4gIHByaXZhdGUgaGFzU3dhZ2dlciA9IGZhbHNlO1xuXG4gIHByaXZhdGUgaWdub3JlZFVybFByZWZpeCA9IFwiXCI7XG5cbiAgcHJpdmF0ZSBleHRyYUNvbnRleHQ6IEV4dHJhQ29udGV4dFQ7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGFwaUNvbmZpZzogQmFzZUFwaUNvbmZpZzxFeHRyYUNvbnRleHRUPiwgLi4ubWF5YmVFeHRyYUNvbnRleHQ6IHt9IGV4dGVuZHMgRXh0cmFDb250ZXh0VCA/IFt7fT9dIDogW0V4dHJhQ29udGV4dFRdKSB7XG4gICAgdGhpcy5leHRyYUNvbnRleHQgPSAobWF5YmVFeHRyYUNvbnRleHRbMF0gPz8ge30pIGFzIEV4dHJhQ29udGV4dFQ7XG4gICAgdGhpcy5odHRwU2VydmVyID0gY3JlYXRlU2VydmVyKHRoaXMuaGFuZGxlUmVxdWVzdC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmVuYWJsZUNvcnMoKTtcbiAgICB0aGlzLmF0dGFjaFJlc3RIYW5kbGVycygpO1xuXG4gICAgY29uc3QgdGFyZ2V0VGFibGUgPSBbXG4gICAgICBbXCIvdGFyZ2V0cy9hbmRyb2lkL2NsaWVudC5rdFwiLCAoYXN0OiBBc3RSb290KSA9PiBnZW5lcmF0ZUFuZHJvaWRDbGllbnRTb3VyY2UoYXN0LCB0cnVlKV0sXG4gICAgICBbXCIvdGFyZ2V0cy9hbmRyb2lkL2NsaWVudF93aXRob3V0X2NhbGxiYWNrcy5rdFwiLCAoYXN0OiBBc3RSb290KSA9PiBnZW5lcmF0ZUFuZHJvaWRDbGllbnRTb3VyY2UoYXN0LCBmYWxzZSldLFxuICAgICAgW1wiL3RhcmdldHMvZG90bmV0L2FwaS5jc1wiLCBnZW5lcmF0ZUNTaGFycFNlcnZlclNvdXJjZV0sXG4gICAgICBbXCIvdGFyZ2V0cy9kb3RuZXQvYXBpLmZzXCIsIGdlbmVyYXRlRlNoYXJwU2VydmVyU291cmNlXSxcbiAgICAgIFtcIi90YXJnZXRzL2ZsdXR0ZXIvY2xpZW50LmRhcnRcIiwgZ2VuZXJhdGVEYXJ0Q2xpZW50U291cmNlXSxcbiAgICAgIFtcIi90YXJnZXRzL2lvcy9jbGllbnQuc3dpZnRcIiwgKGFzdDogQXN0Um9vdCkgPT4gZ2VuZXJhdGVTd2lmdENsaWVudFNvdXJjZShhc3QsIGZhbHNlKV0sXG4gICAgICBbXCIvdGFyZ2V0cy9pb3MvY2xpZW50LXJ4LnN3aWZ0XCIsIChhc3Q6IEFzdFJvb3QpID0+IGdlbmVyYXRlU3dpZnRDbGllbnRTb3VyY2UoYXN0LCB0cnVlKV0sXG4gICAgICBbXCIvdGFyZ2V0cy9ub2RlL2FwaS50c1wiLCBnZW5lcmF0ZU5vZGVTZXJ2ZXJTb3VyY2VdLFxuICAgICAgW1wiL3RhcmdldHMvbm9kZS9jbGllbnQudHNcIiwgZ2VuZXJhdGVOb2RlQ2xpZW50U291cmNlXSxcbiAgICAgIFtcIi90YXJnZXRzL3dlYi9jbGllbnQudHNcIiwgZ2VuZXJhdGVCcm93c2VyQ2xpZW50U291cmNlXSxcbiAgICBdIGFzIGNvbnN0O1xuXG4gICAgZm9yIChjb25zdCBbcGF0aCwgZ2VuZXJhdGVGbl0gb2YgdGFyZ2V0VGFibGUpIHtcbiAgICAgIHRoaXMuYWRkSHR0cEhhbmRsZXIoXCJHRVRcIiwgcGF0aCwgKF9yZXEsIHJlcykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaW50cm9zcGVjdGlvbikge1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIik7XG4gICAgICAgICAgcmVzLndyaXRlKGdlbmVyYXRlRm4odGhpcy5hcGlDb25maWcuYXN0KSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgICAgICAgIHJlcy53cml0ZShgJHtlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRIdHRwSGFuZGxlcihcIkdFVFwiLCBcIi9hc3QuanNvblwiLCAoX3JlcSwgcmVzKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaW50cm9zcGVjdGlvbikge1xuICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlcy5zZXRIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgcmVzLndyaXRlKEpTT04uc3RyaW5naWZ5KGFwaUNvbmZpZy5hc3RKc29uKSk7XG4gICAgICByZXMuZW5kKCk7XG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLmFkZEh0dHBIYW5kbGVyKFwiR0VUXCIsIC9eXFwvcGxheWdyb3VuZC4qL3UsIChyZXEsIHJlcykgPT4ge1xuICAgIC8vICAgaWYgKCF0aGlzLmludHJvc3BlY3Rpb24pIHtcbiAgICAvLyAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgLy8gICAgIHJlcy5lbmQoKTtcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgfVxuXG4gICAgLy8gICBpZiAocmVxLnVybCkge1xuICAgIC8vICAgICByZXEudXJsID0gcmVxLnVybC5lbmRzV2l0aChcIi9wbGF5Z3JvdW5kXCIpID8gcmVxLnVybC5yZXBsYWNlKC9cXC9wbGF5Z3JvdW5kL3UsIFwiL2luZGV4Lmh0bWxcIikgOiByZXEudXJsLnJlcGxhY2UoL1xcL3BsYXlncm91bmQvdSwgXCJcIik7XG4gICAgLy8gICB9XG5cbiAgICAvLyAgIHN0YXRpY0ZpbGVzSGFuZGxlcihyZXEsIHJlcywge1xuICAgIC8vICAgICBjbGVhblVybHM6IGZhbHNlLFxuICAgIC8vICAgICBkaXJlY3RvcnlMaXN0aW5nOiBmYWxzZSxcbiAgICAvLyAgICAgZXRhZzogdHJ1ZSxcbiAgICAvLyAgICAgcHVibGljOiBQTEFZR1JPVU5EX1BVQkxJQ19QQVRILFxuICAgIC8vICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgLy8gICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgLy8gICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgIC8vICAgICByZXMud3JpdGUoYCR7ZX1gKTtcbiAgICAvLyAgICAgcmVzLmVuZCgpO1xuICAgIC8vICAgfSk7XG4gICAgLy8gfSk7XG4gIH1cblxuICByZWdpc3RlckhlYWx0aENoZWNrKGhlYWx0aENoZWNrOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+KTogdm9pZCB7XG4gICAgdGhpcy5oZWFsdGhDaGVja3MucHVzaChoZWFsdGhDaGVjayk7XG4gIH1cblxuICBpZ25vcmVVcmxQcmVmaXgodXJsUHJlZml4OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmlnbm9yZWRVcmxQcmVmaXggPSB1cmxQcmVmaXg7XG4gIH1cblxuICBhc3luYyBsaXN0ZW4ocG9ydCA9IDgwMDApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aGlzLmh0dHBTZXJ2ZXIubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICAgICAgY29uc3QgYWRkciA9IHRoaXMuaHR0cFNlcnZlci5hZGRyZXNzKCkgYXMgQWRkcmVzc0luZm87XG4gICAgICAgIGxldCB1cmxIb3N0OiBzdHJpbmc7XG5cbiAgICAgICAgaWYgKGFkZHIuYWRkcmVzcyA9PT0gXCI6OlwiKSB7XG4gICAgICAgICAgdXJsSG9zdCA9IGBsb2NhbGhvc3Q6JHthZGRyLnBvcnR9YDtcbiAgICAgICAgfSBlbHNlIGlmIChhZGRyLmZhbWlseSA9PT0gXCJpcHY2XCIpIHtcbiAgICAgICAgICB1cmxIb3N0ID0gYFske2FkZHIuYWRkcmVzc31dOiR7YWRkci5wb3J0fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXJsSG9zdCA9IGAke2FkZHIuYWRkcmVzc306JHthZGRyLnBvcnR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZGRyLmFkZHJlc3MgPT09IFwiOjpcIiB8fCBhZGRyLmFkZHJlc3MgPT09IFwiMC4wLjAuMFwiKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFxcbkxpc3RlbmluZyBvbiBwb3J0ICR7YWRkci5wb3J0fWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBcXG5MaXN0ZW5pbmcgb24gcG9ydCAke2FkZHIucG9ydH0gKCR7YWRkci5hZGRyZXNzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmICh0aGlzLmludHJvc3BlY3Rpb24pIHtcbiAgICAgICAgLy8gICBjb25zb2xlLmxvZyhgUGxheWdyb3VuZDogaHR0cDovLyR7dXJsSG9zdH0vcGxheWdyb3VuZGApO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzU3dhZ2dlcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBTd2FnZ2VyIFVJOiBodHRwOi8vJHt1cmxIb3N0fS9zd2FnZ2VyYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhcIlwiKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBwcm9taXNpZnkodGhpcy5odHRwU2VydmVyLmNsb3NlLmJpbmQodGhpcy5odHRwU2VydmVyKSkoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlQ29ycygpIHtcbiAgICB0aGlzLmFkZEhlYWRlcihcIkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHNcIiwgXCJERUxFVEUsIEhFQUQsIFBVVCwgUE9TVCwgUEFUQ0gsIEdFVCwgT1BUSU9OU1wiKTtcbiAgICB0aGlzLmFkZEhlYWRlcihcIkFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnNcIiwgXCJDb250ZW50LVR5cGVcIik7XG4gICAgdGhpcy5hZGRIZWFkZXIoXCJBY2Nlc3MtQ29udHJvbC1NYXgtQWdlXCIsIFwiODY0MDBcIik7XG4gIH1cblxuICBhZGRIZWFkZXIoaGVhZGVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjbGVhbkhlYWRlciA9IGhlYWRlci50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuaGVhZGVycy5nZXQoY2xlYW5IZWFkZXIpO1xuXG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBpZiAoIWV4aXN0aW5nLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KGNsZWFuSGVhZGVyLCBgJHtleGlzdGluZ30sICR7dmFsdWV9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZGVycy5zZXQoY2xlYW5IZWFkZXIsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBhZGRIdHRwSGFuZGxlcihtZXRob2Q6IHN0cmluZywgbWF0Y2hlcjogc3RyaW5nIHwgUmVnRXhwLCBoYW5kbGVyOiAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGJvZHk6IEJ1ZmZlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlcnMucHVzaCh7IGhhbmRsZXIsIG1hdGNoZXIsIG1ldGhvZCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZEJlc3RIYW5kbGVyKHBhdGg6IHN0cmluZywgcmVxOiBJbmNvbWluZ01lc3NhZ2UpIHtcbiAgICBjb25zdCBtYXRjaGluZ0hhbmRsZXJzID0gdGhpcy5oYW5kbGVyc1xuICAgICAgLmZpbHRlcigoeyBtZXRob2QgfSkgPT4gbWV0aG9kID09PSByZXEubWV0aG9kKVxuICAgICAgLmZpbHRlcigoeyBtYXRjaGVyIH0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtYXRjaGVyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIG1hdGNoZXIgPT09IHBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWF0Y2hlci5leGVjKHBhdGgpPy5bMF0gPT09IHBhdGg7XG4gICAgICB9KVxuICAgICAgLnNvcnQoKHsgbWF0Y2hlcjogZmlyc3QgfSwgeyBtYXRjaGVyOiBzZWNvbmQgfSkgPT4ge1xuICAgICAgICAvLyBQcmVmZXIgc3RyaW5nIG1hdGNoZXMgaW5zdGVhZCBvZiBSZWdleHAgbWF0Y2hlc1xuICAgICAgICBpZiAodHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBzZWNvbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmlyc3QgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlY29uZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RNYXRjaCA9IGZpcnN0LmV4ZWMocGF0aCk7XG4gICAgICAgIGNvbnN0IHNlY29uZE1hdGNoID0gc2Vjb25kLmV4ZWMocGF0aCk7XG5cbiAgICAgICAgaWYgKCFmaXJzdE1hdGNoKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZWNvbmRNYXRjaCkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBob3cgbWFueSBjaGFyYWN0ZXJzIHdlcmUgTk9UIHBhcnQgb2YgYSBjYXB0dXJlIGdyb3VwXG4gICAgICAgIGNvbnN0IGZpcnN0TGVuZ3RoID0gZmlyc3RNYXRjaFswXS5sZW5ndGggLSBmaXJzdE1hdGNoLnNsaWNlKDEpLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArIGN1ci5sZW5ndGgsIDApO1xuICAgICAgICBjb25zdCBzZWNvbmRMZW5ndGggPSBzZWNvbmRNYXRjaFswXS5sZW5ndGggLSBzZWNvbmRNYXRjaC5zbGljZSgxKS5yZWR1Y2UoKGFjYywgY3VyKSA9PiBhY2MgKyBjdXIubGVuZ3RoLCAwKTtcblxuICAgICAgICAvLyBQcmVmZXIgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vbi1jYXB0dXJlZCBjaGFyYWN0ZXJzXG4gICAgICAgIHJldHVybiBzZWNvbmRMZW5ndGggLSBmaXJzdExlbmd0aDtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hdGNoaW5nSGFuZGxlcnMubGVuZ3RoID8gbWF0Y2hpbmdIYW5kbGVyc1swXSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFJlc3RIYW5kbGVycygpIHtcbiAgICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2d1LCBcIlxcXFwkJlwiKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IG9wIG9mIHRoaXMuYXBpQ29uZmlnLmFzdC5vcGVyYXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGFubiBvZiBvcC5hbm5vdGF0aW9ucykge1xuICAgICAgICBpZiAoIShhbm4gaW5zdGFuY2VvZiBSZXN0QW5ub3RhdGlvbikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5oYXNTd2FnZ2VyKSB7XG4gICAgICAgICAgc2V0dXBTd2FnZ2VyKHRoaXMpO1xuICAgICAgICAgIHRoaXMuaGFzU3dhZ2dlciA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXRoRnJhZ21lbnRzID0gYW5uLnBhdGguc3BsaXQoL1xce1xcdytcXH0vdSk7XG5cbiAgICAgICAgbGV0IHBhdGhSZWdleCA9IFwiXlwiO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aEZyYWdtZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgICAgcGF0aFJlZ2V4ICs9IFwiKFteL10rPylcIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXRoUmVnZXggKz0gZXNjYXBlUmVnRXhwKHBhdGhGcmFnbWVudHNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF0aFJlZ2V4ICs9IFwiLz8kXCI7XG5cbiAgICAgICAgZm9yIChjb25zdCBoZWFkZXIgb2YgYW5uLmhlYWRlcnMua2V5cygpKSB7XG4gICAgICAgICAgdGhpcy5hZGRIZWFkZXIoXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXCIsIGhlYWRlci50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbWlzdXNlZC1wcm9taXNlc1xuICAgICAgICB0aGlzLmFkZEh0dHBIYW5kbGVyKGFubi5tZXRob2QsIG5ldyBSZWdFeHAocGF0aFJlZ2V4LCBcInVcIiksIGFzeW5jIChyZXEsIHJlcywgYm9keSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgICAgICAgY29uc3QgZmlsZXM6IENvbnRleHRSZXF1ZXN0W1wiZmlsZXNcIl0gPSBbXTtcblxuICAgICAgICAgICAgY29uc3QgeyBwYXRobmFtZSwgcXVlcnkgfSA9IHBhcnNlVXJsKHJlcS51cmwgPz8gXCJcIik7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHBhdGhuYW1lPy5tYXRjaChwYXRoUmVnZXgpO1xuXG4gICAgICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNDA0O1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNpbXBsZUFyZ3MgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbm4ucGF0aFZhcmlhYmxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICBjb25zdCBhcmdOYW1lID0gYW5uLnBhdGhWYXJpYWJsZXNbaV07XG4gICAgICAgICAgICAgIGNvbnN0IGFyZ1ZhbHVlID0gbWF0Y2hbaSArIDFdO1xuXG4gICAgICAgICAgICAgIHNpbXBsZUFyZ3Muc2V0KGFyZ05hbWUsIGFyZ1ZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkUXVlcnkgPSBxdWVyeSA/IHBhcnNlUXVlcnlzdHJpbmcocXVlcnkpIDoge307XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYXJnTmFtZSBvZiBhbm4ucXVlcnlWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgYXJnVmFsdWUgPSBwYXJzZWRRdWVyeVthcmdOYW1lXSA/PyBudWxsO1xuXG4gICAgICAgICAgICAgIGlmIChhcmdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc2ltcGxlQXJncy5zZXQoYXJnTmFtZSwgQXJyYXkuaXNBcnJheShhcmdWYWx1ZSkgPyBhcmdWYWx1ZS5qb2luKFwiXCIpIDogYXJnVmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtoZWFkZXJOYW1lLCBhcmdOYW1lXSBvZiBhbm4uaGVhZGVycykge1xuICAgICAgICAgICAgICBjb25zdCBhcmdWYWx1ZSA9IHJlcS5oZWFkZXJzW2hlYWRlck5hbWUudG9Mb3dlckNhc2UoKV0gPz8gbnVsbDtcblxuICAgICAgICAgICAgICBpZiAoYXJnVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNpbXBsZUFyZ3Muc2V0KGFyZ05hbWUsIEFycmF5LmlzQXJyYXkoYXJnVmFsdWUpID8gYXJnVmFsdWUuam9pbihcIlwiKSA6IGFyZ1ZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFhbm4uYm9keVZhcmlhYmxlICYmIHJlcS5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdPy5tYXRjaCgvXmFwcGxpY2F0aW9uXFwveC13d3ctZm9ybS11cmxlbmNvZGVkL2l1KSkge1xuICAgICAgICAgICAgICBjb25zdCBwYXJzZWRCb2R5ID0gcGFyc2VRdWVyeXN0cmluZyhib2R5LnRvU3RyaW5nKCkpO1xuXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgYXJnTmFtZSBvZiBhbm4ucXVlcnlWYXJpYWJsZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhcmdWYWx1ZSA9IHBhcnNlZEJvZHlbYXJnTmFtZV0gPz8gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChhcmdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2ltcGxlQXJncy5zZXQoYXJnTmFtZSwgQXJyYXkuaXNBcnJheShhcmdWYWx1ZSkgPyBhcmdWYWx1ZS5qb2luKFwiXCIpIDogYXJnVmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFhbm4uYm9keVZhcmlhYmxlICYmIHJlcS5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdPy5tYXRjaCgvXm11bHRpcGFydFxcL2Zvcm0tZGF0YS9pdSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYnVzYm95ID0gQnVzYm95KHsgaGVhZGVyczogcmVxLmhlYWRlcnMgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbGVQcm9taXNlczogQXJyYXk8UHJvbWlzZTx2b2lkPj4gPSBbXTtcblxuICAgICAgICAgICAgICBidXNib3kub24oXCJmaWVsZFwiLCAoZmllbGQsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFubi5xdWVyeVZhcmlhYmxlcy5pbmNsdWRlcyhmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICAgIHNpbXBsZUFyZ3Muc2V0KGZpZWxkLCBgJHt2YWx1ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGJ1c2JveS5vbihcImZpbGVcIiwgKF9maWVsZCwgc3RyZWFtLCBpbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcE5hbWUgPSByYW5kb21CeXRlcygzMikudG9TdHJpbmcoXCJoZXhcIik7XG4gICAgICAgICAgICAgICAgY29uc3Qgd3JpdGVTdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbSh0ZW1wTmFtZSk7XG5cbiAgICAgICAgICAgICAgICBmaWxlUHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW0ub24oXCJlcnJvclwiLCByZWplY3QpO1xuXG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtLm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gY3JlYXRlUmVhZFN0cmVhbSh0ZW1wTmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKHsgY29udGVudHMsIG5hbWU6IGluZm8uZmlsZW5hbWUgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cy5vbihcIm9wZW5cIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKHRlbXBOYW1lLCBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgd3JpdGVTdHJlYW0ub24oXCJvcGVuXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGJ1c2JveS5vbihcImZpbmlzaFwiLCByZXNvbHZlKTtcbiAgICAgICAgICAgICAgICBidXNib3kub24oXCJlcnJvclwiLCByZWplY3QpO1xuICAgICAgICAgICAgICAgIGJ1c2JveS53cml0ZShib2R5KTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZmlsZVByb21pc2VzKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5uLmJvZHlWYXJpYWJsZSkge1xuICAgICAgICAgICAgICBjb25zdCBhcmdOYW1lID0gYW5uLmJvZHlWYXJpYWJsZTtcbiAgICAgICAgICAgICAgY29uc3QgYXJnID0gb3AuYXJncy5maW5kKHggPT4geC5uYW1lID09PSBhcmdOYW1lKTtcblxuICAgICAgICAgICAgICBpZiAoL2FwcGxpY2F0aW9uXFwvanNvbi9pdS50ZXN0KHJlcS5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdID8/IFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgYXJnc1thcmdOYW1lXSA9IEpTT04ucGFyc2UoYm9keS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcpIHtcbiAgICAgICAgICAgICAgICBsZXQgeyB0eXBlIH0gPSBhcmc7XG4gICAgICAgICAgICAgICAgbGV0IHNvbHZlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBPcHRpb25hbFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChib2R5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzW2FyZ05hbWVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLmJhc2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFzb2x2ZWQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnN0YW5jZW9mIEJvb2xQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBJbnRQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBVSW50UHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICB0eXBlIGluc3RhbmNlb2YgRmxvYXRQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBTdHJpbmdQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBEYXRlUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICB0eXBlIGluc3RhbmNlb2YgRGF0ZVRpbWVQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBNb25leVByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnN0YW5jZW9mIERlY2ltYWxQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBCaWdJbnRQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBDcGZQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBDbnBqUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICB0eXBlIGluc3RhbmNlb2YgVXVpZFByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnN0YW5jZW9mIEhleFByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnN0YW5jZW9mIEJhc2U2NFByaW1pdGl2ZVR5cGVcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBzaW1wbGVBcmdzLnNldChhcmdOYW1lLCBib2R5LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgQnl0ZXNQcmltaXRpdmVUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJnTmFtZV0gPSBib2R5LnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnc1thcmdOYW1lXSA9IEpTT04ucGFyc2UoYm9keS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBbYXJnTmFtZSwgYXJnVmFsdWVdIG9mIHNpbXBsZUFyZ3MpIHtcbiAgICAgICAgICAgICAgY29uc3QgYXJnID0gb3AuYXJncy5maW5kKHggPT4geC5uYW1lID09PSBhcmdOYW1lKTtcblxuICAgICAgICAgICAgICBpZiAoIWFyZykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbGV0IHsgdHlwZSB9ID0gYXJnO1xuXG4gICAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgT3B0aW9uYWxUeXBlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ1ZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBhcmdzW2FyZ05hbWVdID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0eXBlID0gdHlwZS5iYXNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGFyZ3NbYXJnTmFtZV0gPSBhcmdWYWx1ZTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQm9vbFByaW1pdGl2ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJnVmFsdWUgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgICBhcmdzW2FyZ05hbWVdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ1ZhbHVlID09PSBcImZhbHNlXCIpIHtcbiAgICAgICAgICAgICAgICAgIGFyZ3NbYXJnTmFtZV0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgYXJnc1thcmdOYW1lXSA9IGFyZ1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgVUludFByaW1pdGl2ZVR5cGUgfHwgdHlwZSBpbnN0YW5jZW9mIEludFByaW1pdGl2ZVR5cGUgfHwgdHlwZSBpbnN0YW5jZW9mIE1vbmV5UHJpbWl0aXZlVHlwZSkge1xuICAgICAgICAgICAgICAgIGFyZ3NbYXJnTmFtZV0gPSBwYXJzZUludChhcmdWYWx1ZSwgMTApO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBGbG9hdFByaW1pdGl2ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBhcmdzW2FyZ05hbWVdID0gcGFyc2VGbG9hdChhcmdWYWx1ZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXJnc1thcmdOYW1lXSA9IGFyZ1ZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlwID0gZ2V0Q2xpZW50SXAocmVxKTtcblxuICAgICAgICAgICAgaWYgKCFpcCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBkZXRlcm1pbmUgY2xpZW50IElQXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0OiBDb250ZXh0UmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgZGV2aWNlSW5mbzoge1xuICAgICAgICAgICAgICAgIGZpbmdlcnByaW50OiBudWxsLFxuICAgICAgICAgICAgICAgIGlkOiByYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJoZXhcIiksXG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IG51bGwsXG4gICAgICAgICAgICAgICAgcGxhdGZvcm06IG51bGwsXG4gICAgICAgICAgICAgICAgdGltZXpvbmU6IG51bGwsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJyZXN0XCIsXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogbnVsbCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZXh0cmE6IHt9LFxuICAgICAgICAgICAgICBmaWxlcyxcbiAgICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsXG4gICAgICAgICAgICAgIGlkOiByYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJoZXhcIiksXG4gICAgICAgICAgICAgIGlwLFxuICAgICAgICAgICAgICBuYW1lOiBvcC5uYW1lLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiAzLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdChyZXF1ZXN0LCAoY3R4LCByZXBseSkgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChjdHgpIHtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2hlYWRlcktleSwgaGVhZGVyVmFsdWVdIG9mIGN0eC5yZXNwb25zZS5oZWFkZXJzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKGhlYWRlcktleSwgaGVhZGVyVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjdHg/LnJlc3BvbnNlLnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gY3R4LnJlc3BvbnNlLnN0YXR1c0NvZGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlcGx5LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMubWFrZVJlc3BvbnNlRXJyb3IocmVwbHkuZXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoIWN0eD8ucmVzcG9uc2Uuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IGVycm9yLnR5cGUgPT09IFwiRmF0YWxcIiA/IDUwMCA6IDQwMDtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgICByZXMud3JpdGUoSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcbiAgICAgICAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmVxLmhlYWRlcnMuYWNjZXB0ID09PSBcImFwcGxpY2F0aW9uL2pzb25cIikge1xuICAgICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb25cIik7XG4gICAgICAgICAgICAgICAgICByZXMud3JpdGUoSlNPTi5zdHJpbmdpZnkocmVwbHkucmVzdWx0KSk7XG4gICAgICAgICAgICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gb3AucmV0dXJuVHlwZTtcblxuICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBPcHRpb25hbFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGx5LnJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghY3R4Py5yZXNwb25zZS5zdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IGFubi5tZXRob2QgPT09IFwiR0VUXCIgPyA0MDQgOiAyMDQ7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLmJhc2U7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnN0YW5jZW9mIEJvb2xQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBJbnRQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBVSW50UHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICB0eXBlIGluc3RhbmNlb2YgRmxvYXRQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBTdHJpbmdQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBEYXRlUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICB0eXBlIGluc3RhbmNlb2YgRGF0ZVRpbWVQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBNb25leVByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnN0YW5jZW9mIERlY2ltYWxQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBCaWdJbnRQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBDcGZQcmltaXRpdmVUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgaW5zdGFuY2VvZiBDbnBqUHJpbWl0aXZlVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICB0eXBlIGluc3RhbmNlb2YgVXVpZFByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnN0YW5jZW9mIEhleFByaW1pdGl2ZVR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZSBpbnN0YW5jZW9mIEJhc2U2NFByaW1pdGl2ZVR5cGVcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKFwiY29udGVudC10eXBlXCIsIFwidGV4dC9wbGFpblwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlKGAke3JlcGx5LnJlc3VsdH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSHRtbFByaW1pdGl2ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiLCBcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlKGAke3JlcGx5LnJlc3VsdH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWG1sUHJpbWl0aXZlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKFwiY29udGVudC10eXBlXCIsIFwidGV4dC94bWxcIik7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZShgJHtyZXBseS5yZXN1bHR9YCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIEJ5dGVzUHJpbWl0aXZlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShyZXBseS5yZXN1bHQgYXMgc3RyaW5nLCBcImJhc2U2NFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlRnJvbUJ1ZmZlcihidWZmZXIpXG4gICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZmlsZVR5cGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiLCBmaWxlVHlwZT8ubWltZSA/PyBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihcImNvbnRlbnQtdHlwZVwiLCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZShidWZmZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoXCJjb250ZW50LXR5cGVcIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGUoSlNPTi5zdHJpbmdpZnkocmVwbHkucmVzdWx0KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVSZXF1ZXN0ID0gKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgY29uc3QgaHJTdGFydCA9IHByb2Nlc3MuaHJ0aW1lKCk7XG5cbiAgICByZXEub24oXCJlcnJvclwiLCBlcnIgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgcmVzLmVuZCgpO1xuICAgIH0pO1xuXG4gICAgcmVzLm9uKFwiZXJyb3JcIiwgZXJyID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmR5bmFtaWNDb3JzT3JpZ2luICYmIHJlcS5oZWFkZXJzLm9yaWdpbikge1xuICAgICAgcmVzLnNldEhlYWRlcihcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiLCByZXEuaGVhZGVycy5vcmlnaW4pO1xuICAgICAgcmVzLnNldEhlYWRlcihcIlZhcnlcIiwgXCJPcmlnaW5cIik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbaGVhZGVyLCB2YWx1ZV0gb2YgdGhpcy5oZWFkZXJzKSB7XG4gICAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJPUFRJT05TXCIgJiYgIWhlYWRlci5zdGFydHNXaXRoKFwiYWNjZXNzLWNvbnRyb2wtXCIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXMuc2V0SGVhZGVyKGhlYWRlciwgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChyZXEubWV0aG9kID09PSBcIk9QVElPTlNcIikge1xuICAgICAgcmVzLndyaXRlSGVhZCgyMDApO1xuICAgICAgcmVzLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUJvZHkgPSAoYm9keTogQnVmZmVyKSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZVJlcXVlc3RXaXRoQm9keShyZXEsIHJlcywgYm9keSwgaHJTdGFydCkuY2F0Y2goKGU6IHVua25vd24pID0+IHRoaXMud3JpdGVSZXBseShyZXMsIG51bGwsIHsgZXJyb3I6IGUgfSwgaHJTdGFydCkpO1xuICAgIH07XG5cbiAgICAvLyBHb29nbGUgQ2xvdWQgRnVuY3Rpb25zIGFkZCBhIHJhd0JvZHkgcHJvcGVydHkgdG8gdGhlIHJlcXVlc3Qgb2JqZWN0XG4gICAgaWYgKGhhcyhyZXEsIFwicmF3Qm9keVwiKSAmJiByZXEucmF3Qm9keSBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgaGFuZGxlQm9keShyZXEucmF3Qm9keSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJvZHk6IEJ1ZmZlcltdID0gW107XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50XG4gICAgICByZXEub24oXCJkYXRhXCIsIGNodW5rID0+IGJvZHkucHVzaChjaHVuaykpO1xuXG4gICAgICByZXEub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgICBoYW5kbGVCb2R5KEJ1ZmZlci5jb25jYXQoYm9keSkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUmVxdWVzdFdpdGhCb2R5KHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBib2R5OiBCdWZmZXIsIGhyU3RhcnQ6IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgICBjb25zdCB7IHBhdGhuYW1lLCBxdWVyeSB9ID0gcGFyc2VVcmwocmVxLnVybCA/PyBcIlwiKTtcbiAgICBsZXQgcGF0aCA9IHBhdGhuYW1lID8/IFwiXCI7XG5cbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKHRoaXMuaWdub3JlZFVybFByZWZpeCkpIHtcbiAgICAgIHBhdGggPSBwYXRoLnNsaWNlKHRoaXMuaWdub3JlZFVybFByZWZpeC5sZW5ndGgpO1xuICAgIH1cblxuICAgIGlmICghcmVxLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0/Lm1hdGNoKC9hcHBsaWNhdGlvblxcL3Nka2dlbi9pdSkpIHtcbiAgICAgIGNvbnN0IGV4dGVybmFsSGFuZGxlciA9IHRoaXMuZmluZEJlc3RIYW5kbGVyKHBhdGgsIHJlcSk7XG5cbiAgICAgIGlmIChleHRlcm5hbEhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5sb2coYEhUVFAgJHtyZXEubWV0aG9kfSAke3BhdGh9JHtxdWVyeSA/IGA/JHtxdWVyeX1gIDogXCJcIn1gKTtcbiAgICAgICAgZXh0ZXJuYWxIYW5kbGVyLmhhbmRsZXIocmVxLCByZXMsIGJvZHkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIik7XG5cbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJIRUFEXCIpIHtcbiAgICAgIHJlcy53cml0ZUhlYWQoMjAwKTtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgaWYgKHBhdGggIT09IFwiL1wiKSB7XG4gICAgICAgIHJlcy53cml0ZUhlYWQoNDA0KTtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBvayA9IHRydWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgaGVhbHRoQ2hlY2sgb2YgdGhpcy5oZWFsdGhDaGVja3MpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvayA9IGF3YWl0IGhlYWx0aENoZWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb2sgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmVzLnN0YXR1c0NvZGUgPSBvayA/IDIwMCA6IDUwMDtcbiAgICAgIHJlcy53cml0ZShKU09OLnN0cmluZ2lmeSh7IG9rIH0pKTtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocmVxLm1ldGhvZCAhPT0gXCJQT1NUXCIpIHtcbiAgICAgIHJlcy53cml0ZUhlYWQoNDAwKTtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjbGllbnRJcCA9IGdldENsaWVudElwKHJlcSk7XG5cbiAgICBpZiAoIWNsaWVudElwKSB7XG4gICAgICB0aGlzLndyaXRlUmVwbHkoXG4gICAgICAgIHJlcyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgIGVycm9yOiBuZXcgRmF0YWwoXCJDb3VsZG4ndCBkZXRlcm1pbmUgY2xpZW50IElQXCIpLFxuICAgICAgICB9LFxuICAgICAgICBoclN0YXJ0LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wYXJzZVJlcXVlc3QocmVxLCBib2R5LnRvU3RyaW5nKCksIGNsaWVudElwKTtcblxuICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgdGhpcy53cml0ZVJlcGx5KFxuICAgICAgICByZXMsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHtcbiAgICAgICAgICBlcnJvcjogbmV3IEZhdGFsKFwiQ291bGRuJ3QgcGFyc2UgcmVxdWVzdFwiKSxcbiAgICAgICAgfSxcbiAgICAgICAgaHJTdGFydCxcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdChyZXF1ZXN0LCAoY3R4LCByZXBseSkgPT4gdGhpcy53cml0ZVJlcGx5KHJlcywgY3R4LCByZXBseSwgaHJTdGFydCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlUmVxdWVzdChyZXF1ZXN0OiBDb250ZXh0UmVxdWVzdCwgd3JpdGVSZXBseTogKGN0eDogQ29udGV4dCB8IG51bGwsIHJlcGx5OiBDb250ZXh0UmVwbHkpID0+IHZvaWQpIHtcbiAgICBjb25zdCBjdHg6IENvbnRleHQgJiBFeHRyYUNvbnRleHRUID0ge1xuICAgICAgLi4udGhpcy5leHRyYUNvbnRleHQsXG4gICAgICByZXF1ZXN0LFxuICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgaGVhZGVyczogbmV3IE1hcCgpLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgd3JpdGVSZXBseShjdHgsIGF3YWl0IGV4ZWN1dGVSZXF1ZXN0KGN0eCwgdGhpcy5hcGlDb25maWcpKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VSZXF1ZXN0KHJlcTogSW5jb21pbmdNZXNzYWdlLCBib2R5OiBzdHJpbmcsIGlwOiBzdHJpbmcpOiBDb250ZXh0UmVxdWVzdCB8IG51bGwge1xuICAgIHN3aXRjaCAodGhpcy5pZGVudGlmeVJlcXVlc3RWZXJzaW9uKHJlcSwgYm9keSkpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VSZXF1ZXN0VjEocmVxLCBib2R5LCBpcCk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlUmVxdWVzdFYyKHJlcSwgYm9keSwgaXApO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVJlcXVlc3RWMyhyZXEsIGJvZHksIGlwKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byB1bmRlcnN0YW5kIHJlcXVlc3RcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpZGVudGlmeVJlcXVlc3RWZXJzaW9uKF9yZXE6IEluY29taW5nTWVzc2FnZSwgYm9keTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGJvZHkpIGFzIHVua25vd247XG5cbiAgICBpZiAodHlwZW9mIHBhcnNlZCA9PT0gXCJvYmplY3RcIiAmJiBwYXJzZWQgJiYgaGFzKHBhcnNlZCwgXCJ2ZXJzaW9uXCIpICYmIHR5cGVvZiBwYXJzZWQudmVyc2lvbiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHBhcnNlZC52ZXJzaW9uO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcnNlZCA9PT0gXCJvYmplY3RcIiAmJiBwYXJzZWQgJiYgaGFzKHBhcnNlZCwgXCJyZXF1ZXN0SWRcIikpIHtcbiAgICAgIHJldHVybiAyO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcnNlZCA9PT0gXCJvYmplY3RcIiAmJiBwYXJzZWQgJiYgaGFzKHBhcnNlZCwgXCJkZXZpY2VcIikpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIHJldHVybiAzO1xuICB9XG5cbiAgLy8gT2xkIFNka2dlbiBmb3JtYXRcbiAgcHJpdmF0ZSBwYXJzZVJlcXVlc3RWMShyZXE6IEluY29taW5nTWVzc2FnZSwgYm9keTogc3RyaW5nLCBpcDogc3RyaW5nKTogQ29udGV4dFJlcXVlc3Qge1xuICAgIGNvbnN0IHBhcnNlZCA9IGRlY29kZShcbiAgICAgIHtcbiAgICAgICAgUmVxdWVzdDoge1xuICAgICAgICAgIGFyZ3M6IFwianNvblwiLFxuICAgICAgICAgIGRldmljZTogXCJSZXF1ZXN0RGV2aWNlXCIsXG4gICAgICAgICAgaWQ6IFwic3RyaW5nXCIsXG4gICAgICAgICAgbmFtZTogXCJzdHJpbmdcIixcbiAgICAgICAgfSxcbiAgICAgICAgUmVxdWVzdERldmljZToge1xuICAgICAgICAgIGZpbmdlcnByaW50OiBcInN0cmluZz9cIixcbiAgICAgICAgICBpZDogXCJzdHJpbmc/XCIsXG4gICAgICAgICAgbGFuZ3VhZ2U6IFwic3RyaW5nP1wiLFxuICAgICAgICAgIHBsYXRmb3JtOiBcImpzb24/XCIsXG4gICAgICAgICAgdGltZXpvbmU6IFwic3RyaW5nP1wiLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nP1wiLFxuICAgICAgICAgIHZlcnNpb246IFwic3RyaW5nP1wiLFxuICAgICAgICB9LFxuICAgICAgfSBhcyBjb25zdCxcbiAgICAgIFwicm9vdFwiLFxuICAgICAgXCJSZXF1ZXN0XCIsXG4gICAgICBKU09OLnBhcnNlKGJvZHkpLFxuICAgICk7XG5cbiAgICBjb25zdCBkZXZpY2VJZCA9IHBhcnNlZC5kZXZpY2UuaWQgPz8gcmFuZG9tQnl0ZXMoMjApLnRvU3RyaW5nKFwiaGV4XCIpO1xuXG4gICAgaWYgKCFwYXJzZWQuYXJncyB8fCBBcnJheS5pc0FycmF5KHBhcnNlZC5hcmdzKSB8fCB0eXBlb2YgcGFyc2VkLmFyZ3MgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkICdhcmdzJyB0byBiZSBhbiBvYmplY3RcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFyZ3M6IHBhcnNlZC5hcmdzLFxuICAgICAgZGV2aWNlSW5mbzoge1xuICAgICAgICBmaW5nZXJwcmludDogcGFyc2VkLmRldmljZS5maW5nZXJwcmludCxcbiAgICAgICAgaWQ6IGRldmljZUlkLFxuICAgICAgICBsYW5ndWFnZTogcGFyc2VkLmRldmljZS5sYW5ndWFnZSxcbiAgICAgICAgcGxhdGZvcm06IHBhcnNlZC5kZXZpY2UucGxhdGZvcm0sXG4gICAgICAgIHRpbWV6b25lOiBwYXJzZWQuZGV2aWNlLnRpbWV6b25lLFxuICAgICAgICB0eXBlOiBwYXJzZWQuZGV2aWNlLnR5cGUgPz8gKHR5cGVvZiBwYXJzZWQuZGV2aWNlLnBsYXRmb3JtID09PSBcInN0cmluZ1wiID8gcGFyc2VkLmRldmljZS5wbGF0Zm9ybSA6IFwiXCIpLFxuICAgICAgICB2ZXJzaW9uOiBwYXJzZWQuZGV2aWNlLnZlcnNpb24sXG4gICAgICB9LFxuICAgICAgZXh0cmE6IHt9LFxuICAgICAgZmlsZXM6IFtdLFxuICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsXG4gICAgICBpZDogYCR7ZGV2aWNlSWR9LSR7cGFyc2VkLmlkfWAsXG4gICAgICBpcCxcbiAgICAgIG5hbWU6IHBhcnNlZC5uYW1lLFxuICAgICAgdmVyc2lvbjogMSxcbiAgICB9O1xuICB9XG5cbiAgLy8gTWF4aW1hIHNka2dlbiBmb3JtYXRcbiAgcHJpdmF0ZSBwYXJzZVJlcXVlc3RWMihyZXE6IEluY29taW5nTWVzc2FnZSwgYm9keTogc3RyaW5nLCBpcDogc3RyaW5nKTogQ29udGV4dFJlcXVlc3Qge1xuICAgIGNvbnN0IHBhcnNlZCA9IGRlY29kZShcbiAgICAgIHtcbiAgICAgICAgUmVxdWVzdDoge1xuICAgICAgICAgIGFyZ3M6IFwianNvblwiLFxuICAgICAgICAgIGRldmljZUZpbmdlcnByaW50OiBcInN0cmluZz9cIixcbiAgICAgICAgICBkZXZpY2VJZDogXCJzdHJpbmdcIixcbiAgICAgICAgICBpbmZvOiBcIlJlcXVlc3RJbmZvXCIsXG4gICAgICAgICAgbmFtZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBwYXJ0bmVySWQ6IFwic3RyaW5nP1wiLFxuICAgICAgICAgIHJlcXVlc3RJZDogXCJzdHJpbmc/XCIsXG4gICAgICAgICAgc2Vzc2lvbklkOiBcInN0cmluZz9cIixcbiAgICAgICAgfSxcbiAgICAgICAgUmVxdWVzdEluZm86IHtcbiAgICAgICAgICBicm93c2VyVXNlckFnZW50OiBcInN0cmluZz9cIixcbiAgICAgICAgICBsYW5ndWFnZTogXCJzdHJpbmdcIixcbiAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9LFxuICAgICAgfSBhcyBjb25zdCxcbiAgICAgIFwicm9vdFwiLFxuICAgICAgXCJSZXF1ZXN0XCIsXG4gICAgICBKU09OLnBhcnNlKGJvZHkpLFxuICAgICk7XG5cbiAgICBpZiAoIXBhcnNlZC5hcmdzIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkLmFyZ3MpIHx8IHR5cGVvZiBwYXJzZWQuYXJncyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgJ2FyZ3MnIHRvIGJlIGFuIG9iamVjdFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXJnczogcGFyc2VkLmFyZ3MsXG4gICAgICBkZXZpY2VJbmZvOiB7XG4gICAgICAgIGZpbmdlcnByaW50OiBwYXJzZWQuZGV2aWNlRmluZ2VycHJpbnQsXG4gICAgICAgIGlkOiBwYXJzZWQuZGV2aWNlSWQsXG4gICAgICAgIGxhbmd1YWdlOiBwYXJzZWQuaW5mby5sYW5ndWFnZSxcbiAgICAgICAgcGxhdGZvcm06IHtcbiAgICAgICAgICBicm93c2VyVXNlckFnZW50OiBwYXJzZWQuaW5mby5icm93c2VyVXNlckFnZW50ID8/IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHRpbWV6b25lOiBudWxsLFxuICAgICAgICB0eXBlOiBwYXJzZWQuaW5mby50eXBlLFxuICAgICAgICB2ZXJzaW9uOiBcIlwiLFxuICAgICAgfSxcbiAgICAgIGV4dHJhOiB7XG4gICAgICAgIHBhcnRuZXJJZDogcGFyc2VkLnBhcnRuZXJJZCxcbiAgICAgICAgc2Vzc2lvbklkOiBwYXJzZWQuc2Vzc2lvbklkLFxuICAgICAgfSxcbiAgICAgIGZpbGVzOiBbXSxcbiAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgaWQ6IGAke3BhcnNlZC5kZXZpY2VJZH0tJHtwYXJzZWQucmVxdWVzdElkID8/IHJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZyhcImhleFwiKX1gLFxuICAgICAgaXAsXG4gICAgICBuYW1lOiBwYXJzZWQubmFtZSxcbiAgICAgIHZlcnNpb246IDIsXG4gICAgfTtcbiAgfVxuXG4gIC8vIE5ldyBzZGtnZW4gZm9ybWF0XG4gIHByaXZhdGUgcGFyc2VSZXF1ZXN0VjMocmVxOiBJbmNvbWluZ01lc3NhZ2UsIGJvZHk6IHN0cmluZywgaXA6IHN0cmluZyk6IENvbnRleHRSZXF1ZXN0IHtcbiAgICBjb25zdCBwYXJzZWQgPSBkZWNvZGUoXG4gICAgICB7XG4gICAgICAgIERldmljZUluZm86IHtcbiAgICAgICAgICBmaW5nZXJwcmludDogXCJzdHJpbmc/XCIsXG4gICAgICAgICAgaWQ6IFwic3RyaW5nP1wiLFxuICAgICAgICAgIGxhbmd1YWdlOiBcInN0cmluZz9cIixcbiAgICAgICAgICBwbGF0Zm9ybTogXCJqc29uP1wiLFxuICAgICAgICAgIHRpbWV6b25lOiBcInN0cmluZz9cIixcbiAgICAgICAgICB0eXBlOiBcInN0cmluZz9cIixcbiAgICAgICAgICB2ZXJzaW9uOiBcInN0cmluZz9cIixcbiAgICAgICAgfSxcbiAgICAgICAgUmVxdWVzdDoge1xuICAgICAgICAgIGFyZ3M6IFwianNvblwiLFxuICAgICAgICAgIGRldmljZUluZm86IFwiRGV2aWNlSW5mbz9cIixcbiAgICAgICAgICBleHRyYTogXCJqc29uP1wiLFxuICAgICAgICAgIG5hbWU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgcmVxdWVzdElkOiBcInN0cmluZz9cIixcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgY29uc3QsXG4gICAgICBcInJvb3RcIixcbiAgICAgIFwiUmVxdWVzdFwiLFxuICAgICAgSlNPTi5wYXJzZShib2R5KSxcbiAgICApO1xuXG4gICAgY29uc3QgZGV2aWNlSW5mbyA9IHBhcnNlZC5kZXZpY2VJbmZvID8/IHtcbiAgICAgIGZpbmdlcnByaW50OiBudWxsLFxuICAgICAgaWQ6IG51bGwsXG4gICAgICBsYW5ndWFnZTogbnVsbCxcbiAgICAgIHBsYXRmb3JtOiBudWxsLFxuICAgICAgdGltZXpvbmU6IG51bGwsXG4gICAgICB0eXBlOiBudWxsLFxuICAgICAgdmVyc2lvbjogbnVsbCxcbiAgICB9O1xuICAgIGNvbnN0IGRldmljZUlkID0gZGV2aWNlSW5mby5pZCA/PyByYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJoZXhcIik7XG5cbiAgICBpZiAoIXBhcnNlZC5hcmdzIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkLmFyZ3MpIHx8IHR5cGVvZiBwYXJzZWQuYXJncyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgJ2FyZ3MnIHRvIGJlIGFuIG9iamVjdFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYXJnczogcGFyc2VkLmFyZ3MsXG4gICAgICBkZXZpY2VJbmZvOiB7XG4gICAgICAgIGZpbmdlcnByaW50OiBkZXZpY2VJbmZvLmZpbmdlcnByaW50LFxuICAgICAgICBpZDogZGV2aWNlSWQsXG4gICAgICAgIGxhbmd1YWdlOiBkZXZpY2VJbmZvLmxhbmd1YWdlLFxuICAgICAgICBwbGF0Zm9ybTogdHlwZW9mIGRldmljZUluZm8ucGxhdGZvcm0gPT09IFwib2JqZWN0XCIgPyB7IC4uLmRldmljZUluZm8ucGxhdGZvcm0gfSA6IHt9LFxuICAgICAgICB0aW1lem9uZTogZGV2aWNlSW5mby50aW1lem9uZSxcbiAgICAgICAgdHlwZTogZGV2aWNlSW5mby50eXBlID8/IFwiYXBpXCIsXG4gICAgICAgIHZlcnNpb246IGRldmljZUluZm8udmVyc2lvbixcbiAgICAgIH0sXG4gICAgICBleHRyYTogdHlwZW9mIHBhcnNlZC5leHRyYSA9PT0gXCJvYmplY3RcIiA/IHsgLi4ucGFyc2VkLmV4dHJhIH0gOiB7fSxcbiAgICAgIGZpbGVzOiBbXSxcbiAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgaWQ6IGAke2RldmljZUlkfS0ke3BhcnNlZC5yZXF1ZXN0SWQgPz8gcmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKFwiaGV4XCIpfWAsXG4gICAgICBpcCxcbiAgICAgIG5hbWU6IHBhcnNlZC5uYW1lLFxuICAgICAgdmVyc2lvbjogMyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlUmVzcG9uc2VFcnJvcihlcnI6IHVua25vd24pOiB7IG1lc3NhZ2U6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBkYXRhOiB1bmtub3duIH0ge1xuICAgIGxldCB0eXBlID0gXCJGYXRhbFwiO1xuXG4gICAgaWYgKHR5cGVvZiBlcnIgPT09IFwib2JqZWN0XCIgJiYgZXJyICE9PSBudWxsICYmIGhhcyhlcnIsIFwidHlwZVwiKSAmJiB0eXBlb2YgZXJyLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICh7IHR5cGUgfSA9IGVycik7XG4gICAgfVxuXG4gICAgbGV0IG1lc3NhZ2U6IHN0cmluZztcblxuICAgIGlmICh0eXBlb2YgZXJyID09PSBcIm9iamVjdFwiICYmIGVyciAhPT0gbnVsbCAmJiBoYXMoZXJyLCBcIm1lc3NhZ2VcIikgJiYgdHlwZW9mIGVyci5tZXNzYWdlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAoeyBtZXNzYWdlIH0gPSBlcnIpO1xuICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIG1lc3NhZ2UgPSBlcnIudG9TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlcnIgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeShlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXNzYWdlID0gYCR7ZXJyfWA7XG4gICAgfVxuXG4gICAgbGV0IGRhdGE6IHVua25vd247XG5cbiAgICBpZiAodHlwZW9mIGVyciA9PT0gXCJvYmplY3RcIiAmJiBlcnIgIT09IG51bGwgJiYgaGFzKGVyciwgXCJkYXRhXCIpKSB7XG4gICAgICAoeyBkYXRhIH0gPSBlcnIpO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gdGhpcy5hcGlDb25maWcuYXN0LmVycm9ycy5maW5kKHggPT4geC5uYW1lID09PSB0eXBlKTtcblxuICAgIGlmIChlcnJvcikge1xuICAgICAgaWYgKCEoZXJyb3IuZGF0YVR5cGUgaW5zdGFuY2VvZiBWb2lkUHJpbWl0aXZlVHlwZSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkYXRhID0gZW5jb2RlKHRoaXMuYXBpQ29uZmlnLmFzdEpzb24udHlwZVRhYmxlLCBgZXJyb3IuJHt0eXBlfWAsIGVycm9yLmRhdGFUeXBlLm5hbWUsIGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlbmNvZGVFcnJvcikge1xuICAgICAgICAgIG1lc3NhZ2UgPSBgRmFpbGVkIHRvIGVuY29kZSBlcnJvciAke3R5cGV9IGJlY2F1c2U6ICR7ZW5jb2RlRXJyb3J9LiBPcmlnaW5hbCBtZXNzYWdlOiAke21lc3NhZ2V9YDtcbiAgICAgICAgICB0eXBlID0gXCJGYXRhbFwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGUgPSBcIkZhdGFsXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZGF0YSwgbWVzc2FnZSwgdHlwZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSB3cml0ZVJlcGx5KHJlczogU2VydmVyUmVzcG9uc2UsIGN0eDogQ29udGV4dCB8IG51bGwsIHJlcGx5OiBDb250ZXh0UmVwbHksIGhyU3RhcnQ6IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgICBpZiAoIWN0eCkge1xuICAgICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgICByZXMud3JpdGUoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBlcnJvcjogdGhpcy5tYWtlUmVzcG9uc2VFcnJvcihyZXBseS5lcnJvciA/PyBuZXcgRmF0YWwoXCJSZXNwb25zZSB3aXRob3V0IGNvbnRleHRcIikpLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICByZXMuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVsdGFUaW1lID0gcHJvY2Vzcy5ocnRpbWUoaHJTdGFydCk7XG4gICAgY29uc3QgZHVyYXRpb24gPSBkZWx0YVRpbWVbMF0gKyBkZWx0YVRpbWVbMV0gKiAxZS05O1xuXG4gICAgaWYgKHJlcGx5LmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKHJlcGx5LmVycm9yKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgJHtjdHgucmVxdWVzdC5pZH0gWyR7ZHVyYXRpb24udG9GaXhlZCg2KX1zXSAke2N0eC5yZXF1ZXN0Lm5hbWV9KCkgLT4gJHtyZXBseS5lcnJvciA/IHRoaXMubWFrZVJlc3BvbnNlRXJyb3IocmVwbHkuZXJyb3IpLnR5cGUgOiBcIk9LXCJ9YCk7XG5cbiAgICBpZiAoY3R4LnJlc3BvbnNlLnN0YXR1c0NvZGUpIHtcbiAgICAgIHJlcy5zdGF0dXNDb2RlID0gY3R4LnJlc3BvbnNlLnN0YXR1c0NvZGU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbaGVhZGVyS2V5LCBoZWFkZXJWYWx1ZV0gb2YgY3R4LnJlc3BvbnNlLmhlYWRlcnMuZW50cmllcygpKSB7XG4gICAgICByZXMuc2V0SGVhZGVyKGhlYWRlcktleSwgaGVhZGVyVmFsdWUpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoY3R4LnJlcXVlc3QudmVyc2lvbikge1xuICAgICAgY2FzZSAxOiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgICAgIGRldmljZUlkOiBjdHgucmVxdWVzdC5kZXZpY2VJbmZvLmlkLFxuICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgIGVycm9yOiByZXBseS5lcnJvciA/IHRoaXMubWFrZVJlc3BvbnNlRXJyb3IocmVwbHkuZXJyb3IpIDogbnVsbCxcbiAgICAgICAgICBob3N0OiBob3N0bmFtZSgpLFxuICAgICAgICAgIGlkOiBjdHgucmVxdWVzdC5pZCxcbiAgICAgICAgICBvazogIXJlcGx5LmVycm9yLFxuICAgICAgICAgIHJlc3VsdDogcmVwbHkuZXJyb3IgPyBudWxsIDogcmVwbHkucmVzdWx0LFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvciAmJiAhY3R4LnJlc3BvbnNlLnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IHRoaXMubWFrZVJlc3BvbnNlRXJyb3IocmVzcG9uc2UuZXJyb3IpLnR5cGUgPT09IFwiRmF0YWxcIiA/IDUwMCA6IDQwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy53cml0ZShKU09OLnN0cmluZ2lmeShyZXNwb25zZSkpO1xuICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIDI6IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgICAgZGV2aWNlSWQ6IGN0eC5yZXF1ZXN0LmRldmljZUluZm8uaWQsXG4gICAgICAgICAgZXJyb3I6IHJlcGx5LmVycm9yID8gdGhpcy5tYWtlUmVzcG9uc2VFcnJvcihyZXBseS5lcnJvcikgOiBudWxsLFxuICAgICAgICAgIG9rOiAhcmVwbHkuZXJyb3IsXG4gICAgICAgICAgcmVxdWVzdElkOiBjdHgucmVxdWVzdC5pZCxcbiAgICAgICAgICByZXN1bHQ6IHJlcGx5LmVycm9yID8gbnVsbCA6IHJlcGx5LnJlc3VsdCxcbiAgICAgICAgICBzZXNzaW9uSWQ6IGN0eC5yZXF1ZXN0LmV4dHJhLnNlc3Npb25JZCxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IgJiYgIWN0eC5yZXNwb25zZS5zdGF0dXNDb2RlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSB0aGlzLm1ha2VSZXNwb25zZUVycm9yKHJlc3BvbnNlLmVycm9yKS50eXBlID09PSBcIkZhdGFsXCIgPyA1MDAgOiA0MDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXMud3JpdGUoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSAzOiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgIGVycm9yOiByZXBseS5lcnJvciA/IHRoaXMubWFrZVJlc3BvbnNlRXJyb3IocmVwbHkuZXJyb3IpIDogbnVsbCxcbiAgICAgICAgICBob3N0OiBob3N0bmFtZSgpLFxuICAgICAgICAgIHJlc3VsdDogcmVwbHkuZXJyb3IgPyBudWxsIDogcmVwbHkucmVzdWx0LFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvciAmJiAhY3R4LnJlc3BvbnNlLnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IHRoaXMubWFrZVJlc3BvbnNlRXJyb3IocmVzcG9uc2UuZXJyb3IpLnR5cGUgPT09IFwiRmF0YWxcIiA/IDUwMCA6IDQwMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5zZXRIZWFkZXIoXCJ4LXJlcXVlc3QtaWRcIiwgY3R4LnJlcXVlc3QuaWQpO1xuICAgICAgICByZXMud3JpdGUoSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICAgICAgcmVzLndyaXRlKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGVycm9yOiB0aGlzLm1ha2VSZXNwb25zZUVycm9yKHJlcGx5LmVycm9yID8/IG5ldyBGYXRhbChcIlVua25vd24gcmVxdWVzdCB2ZXJzaW9uXCIpKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
941
+ exports.SdkgenHttpServer = SdkgenHttpServer;