nextlove 2.20.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,3 +1,8 @@
1
+ import {
2
+ getEffectsSchema,
3
+ getInnerType,
4
+ getTypeName
5
+ } from "./chunk-YXLCP6YR.mjs";
1
6
  import {
2
7
  AuthMethodDoesNotApplyException,
3
8
  BadRequestException,
@@ -47,52 +52,57 @@ var with_methods_default = withMethods;
47
52
 
48
53
  // src/with-route-spec/middlewares/with-validation.ts
49
54
  init_esm_shims();
50
- import { z, ZodFirstPartyTypeKind } from "zod";
51
55
  import _ from "lodash";
52
56
  var getZodObjectSchemaFromZodEffectSchema = (isZodEffect, schema) => {
53
57
  if (!isZodEffect) {
54
58
  return schema;
55
59
  }
56
60
  let currentSchema = schema;
57
- while (currentSchema instanceof z.ZodEffects) {
58
- currentSchema = currentSchema._def.schema;
61
+ while (getTypeName(currentSchema) === "ZodEffects") {
62
+ const innerSchema = getEffectsSchema(currentSchema);
63
+ if (!innerSchema)
64
+ break;
65
+ currentSchema = innerSchema;
59
66
  }
60
67
  return currentSchema;
61
68
  };
62
- var getZodDefFromZodSchemaHelpers = (schema) => {
63
- const special_zod_types = [
64
- ZodFirstPartyTypeKind.ZodOptional,
65
- ZodFirstPartyTypeKind.ZodDefault,
66
- ZodFirstPartyTypeKind.ZodEffects
67
- ];
68
- while (special_zod_types.includes(schema._def.typeName)) {
69
- if (schema._def.typeName === ZodFirstPartyTypeKind.ZodOptional || schema._def.typeName === ZodFirstPartyTypeKind.ZodDefault) {
70
- schema = schema._def.innerType;
71
- continue;
72
- }
73
- if (schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects) {
74
- schema = schema._def.schema;
75
- continue;
76
- }
77
- }
78
- return schema._def;
79
- };
80
69
  var tryGetZodSchemaAsObject = (schema) => {
81
- const isZodEffect = schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects;
70
+ const isZodEffect = getTypeName(schema) === "ZodEffects";
82
71
  const safe_schema = getZodObjectSchemaFromZodEffectSchema(isZodEffect, schema);
83
- const isZodObject = safe_schema._def.typeName === ZodFirstPartyTypeKind.ZodObject;
72
+ const isZodObject = getTypeName(safe_schema) === "ZodObject";
84
73
  if (!isZodObject) {
85
74
  return void 0;
86
75
  }
87
76
  return safe_schema;
88
77
  };
78
+ var unwrapZodSchema = (schema) => {
79
+ const special_zod_types = ["ZodOptional", "ZodDefault", "ZodEffects"];
80
+ while (special_zod_types.includes(getTypeName(schema))) {
81
+ const typeName = getTypeName(schema);
82
+ if (typeName === "ZodOptional" || typeName === "ZodDefault") {
83
+ const inner = getInnerType(schema);
84
+ if (!inner)
85
+ break;
86
+ schema = inner;
87
+ continue;
88
+ }
89
+ if (typeName === "ZodEffects") {
90
+ const inner = getEffectsSchema(schema);
91
+ if (!inner)
92
+ break;
93
+ schema = inner;
94
+ continue;
95
+ }
96
+ }
97
+ return schema;
98
+ };
89
99
  var isZodSchemaArray = (schema) => {
90
- const def = getZodDefFromZodSchemaHelpers(schema);
91
- return def.typeName === ZodFirstPartyTypeKind.ZodArray;
100
+ const unwrapped = unwrapZodSchema(schema);
101
+ return getTypeName(unwrapped) === "ZodArray";
92
102
  };
93
103
  var isZodSchemaBoolean = (schema) => {
94
- const def = getZodDefFromZodSchemaHelpers(schema);
95
- return def.typeName === ZodFirstPartyTypeKind.ZodBoolean;
104
+ const unwrapped = unwrapZodSchema(schema);
105
+ return getTypeName(unwrapped) === "ZodBoolean";
96
106
  };
97
107
  var parseQueryParams = (schema, input, supportedArrayFormats) => {
98
108
  const parsed_input = Object.assign({}, input);
@@ -272,7 +282,7 @@ var withValidation = (input) => (next) => async (req, res) => {
272
282
  var with_validation_default = withValidation;
273
283
 
274
284
  // src/with-route-spec/index.ts
275
- import { z as z2 } from "zod";
285
+ import { z } from "zod";
276
286
  var checkRouteSpec = (spec) => spec;
277
287
  var DEFAULT_ARRAY_FORMATS = [
278
288
  "brackets",
@@ -298,7 +308,7 @@ var createWithRouteSpec = (setupParams) => {
298
308
  }
299
309
  }),
300
310
  globalSchemas = setupParams.addOkStatus ? {
301
- ok: z2.boolean()
311
+ ok: z.boolean()
302
312
  } : {},
303
313
  supportedArrayFormats = DEFAULT_ARRAY_FORMATS,
304
314
  onMultipleAuthMiddlewareFailures,
@@ -389,4 +399,4 @@ export {
389
399
  withExceptionHandling,
390
400
  wrappers
391
401
  };
392
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvaW5kZXgudHMiLCAiLi4vc3JjL3dyYXBwZXJzL2luZGV4LnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvbWlkZGxld2FyZXMvd2l0aC1tZXRob2RzLnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvbWlkZGxld2FyZXMvd2l0aC12YWxpZGF0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vd2l0aC1yb3V0ZS1zcGVjXCJcbmV4cG9ydCB7IHdyYXBwZXJzIH0gZnJvbSBcIi4vd3JhcHBlcnNcIlxuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIlxuIiwgImltcG9ydCB7IE5leHRBcGlSZXNwb25zZSwgTmV4dEFwaVJlcXVlc3QgfSBmcm9tIFwibmV4dFwiXG5pbXBvcnQgeyB3aXRoRXhjZXB0aW9uSGFuZGxpbmcgfSBmcm9tIFwiLi4vbmV4dGpzLWV4Y2VwdGlvbi1taWRkbGV3YXJlXCJcbmltcG9ydCB3cmFwcGVycywgeyBNaWRkbGV3YXJlIH0gZnJvbSBcIi4uL3dyYXBwZXJzXCJcbmltcG9ydCB7XG4gIENyZWF0ZVdpdGhSb3V0ZVNwZWNGdW5jdGlvbixcbiAgUXVlcnlBcnJheUZvcm1hdHMsXG4gIFJvdXRlU3BlYyxcbn0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCB3aXRoTWV0aG9kcywgeyBIVFRQTWV0aG9kcyB9IGZyb20gXCIuL21pZGRsZXdhcmVzL3dpdGgtbWV0aG9kc1wiXG5pbXBvcnQgd2l0aFZhbGlkYXRpb24gZnJvbSBcIi4vbWlkZGxld2FyZXMvd2l0aC12YWxpZGF0aW9uXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7XG4gIEF1dGhNZXRob2REb2VzTm90QXBwbHlFeGNlcHRpb24sXG4gIFVuYXV0aG9yaXplZEV4Y2VwdGlvbixcbn0gZnJvbSBcIi4uL25leHRqcy1leGNlcHRpb24tbWlkZGxld2FyZVwiXG5cbnR5cGUgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnkgfCB6LlpvZEVmZmVjdHM8ei5ab2RUeXBlQW55PlxuXG5leHBvcnQgY29uc3QgY2hlY2tSb3V0ZVNwZWMgPSA8XG4gIEF1dGhUeXBlIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nLFxuICBNZXRob2RzIGV4dGVuZHMgSFRUUE1ldGhvZHNbXSA9IEhUVFBNZXRob2RzW10sXG4gIEpzb25Cb2R5IGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnksXG4gIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnksXG4gIENvbW1vblBhcmFtcyBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RUeXBlQW55LFxuICBNaWRkbGV3YXJlcyBleHRlbmRzIHJlYWRvbmx5IE1pZGRsZXdhcmU8YW55LCBhbnk+W10gPSByZWFkb25seSBNaWRkbGV3YXJlPFxuICAgIGFueSxcbiAgICBhbnlcbiAgPltdLFxuICBGb3JtRGF0YSBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RUeXBlQW55LFxuICBTcGVjIGV4dGVuZHMgUm91dGVTcGVjPFxuICAgIEF1dGhUeXBlLFxuICAgIE1ldGhvZHMsXG4gICAgSnNvbkJvZHksXG4gICAgUXVlcnlQYXJhbXMsXG4gICAgQ29tbW9uUGFyYW1zLFxuICAgIE1pZGRsZXdhcmVzLFxuICAgIEZvcm1EYXRhXG4gID4gPSBSb3V0ZVNwZWM8XG4gICAgQXV0aFR5cGUsXG4gICAgTWV0aG9kcyxcbiAgICBKc29uQm9keSxcbiAgICBRdWVyeVBhcmFtcyxcbiAgICBDb21tb25QYXJhbXMsXG4gICAgTWlkZGxld2FyZXMsXG4gICAgRm9ybURhdGFcbiAgPlxuPihcbiAgc3BlYzogU3BlY1xuKTogc3RyaW5nIGV4dGVuZHMgU3BlY1tcImF1dGhcIl1cbiAgPyBgeW91ciByb3V0ZSBzcGVjIGlzIHVuZGVyc3BlY2lmaWVkLCBhZGQgXCJhcyBjb25zdFwiYFxuICA6IFNwZWMgPT4gc3BlYyBhcyBhbnlcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQVJSQVlfRk9STUFUUzogUXVlcnlBcnJheUZvcm1hdHMgPSBbXG4gIFwiYnJhY2tldHNcIixcbiAgXCJjb21tYVwiLFxuICBcInJlcGVhdFwiLFxuXVxuXG5leHBvcnQgY29uc3QgY3JlYXRlV2l0aFJvdXRlU3BlYzogQ3JlYXRlV2l0aFJvdXRlU3BlY0Z1bmN0aW9uID0gKChcbiAgc2V0dXBQYXJhbXNcbikgPT4ge1xuICBjb25zdCB7XG4gICAgYXV0aE1pZGRsZXdhcmVNYXAgPSB7fSxcbiAgICBnbG9iYWxNaWRkbGV3YXJlcyA9IFtdLFxuICAgIGdsb2JhbE1pZGRsZXdhcmVzQWZ0ZXJBdXRoID0gW10sXG4gICAgc2hvdWxkVmFsaWRhdGVSZXNwb25zZXMsXG4gICAgc2hvdWxkVmFsaWRhdGVHZXRSZXF1ZXN0Qm9keSA9IHRydWUsXG4gICAgZXhjZXB0aW9uSGFuZGxpbmdNaWRkbGV3YXJlID0gd2l0aEV4Y2VwdGlvbkhhbmRsaW5nKHtcbiAgICAgIGFkZE9rU3RhdHVzOiBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1cyxcbiAgICAgIGV4Y2VwdGlvbkhhbmRsaW5nT3B0aW9uczoge1xuICAgICAgICBnZXRFcnJvckNvbnRleHQ6IChyZXEsIGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGVycm9yXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pIGFzIGFueSxcbiAgICBnbG9iYWxTY2hlbWFzID0gc2V0dXBQYXJhbXMuYWRkT2tTdGF0dXNcbiAgICAgID8ge1xuICAgICAgICAgIG9rOiB6LmJvb2xlYW4oKSxcbiAgICAgICAgfVxuICAgICAgOiB7fSxcbiAgICBzdXBwb3J0ZWRBcnJheUZvcm1hdHMgPSBERUZBVUxUX0FSUkFZX0ZPUk1BVFMsXG4gICAgb25NdWx0aXBsZUF1dGhNaWRkbGV3YXJlRmFpbHVyZXMsXG4gICAgbWF4RHVyYXRpb246IGdsb2JhbE1heER1cmF0aW9uLFxuICB9ID0gc2V0dXBQYXJhbXNcblxuICBjb25zdCB3aXRoUm91dGVTcGVjID0gKHNwZWM6IFJvdXRlU3BlYykgPT4ge1xuICAgIGNvbnN0IGNyZWF0ZVJvdXRlRXhwb3J0ID0gKHVzZXJEZWZpbmVkUm91dGVGbikgPT4ge1xuICAgICAgY29uc3Qgcm9vdFJlcXVlc3RIYW5kbGVyID0gYXN5bmMgKFxuICAgICAgICByZXE6IE5leHRBcGlSZXF1ZXN0LFxuICAgICAgICByZXM6IE5leHRBcGlSZXNwb25zZVxuICAgICAgKSA9PiB7XG4gICAgICAgIGF1dGhNaWRkbGV3YXJlTWFwW1wibm9uZVwiXSA9IChuZXh0KSA9PiBuZXh0XG5cbiAgICAgICAgY29uc3QgYXV0aE1pZGRsZXdhcmVzID0gKFxuICAgICAgICAgIEFycmF5LmlzQXJyYXkoc3BlYy5hdXRoKSA/IHNwZWMuYXV0aCA6IFtzcGVjLmF1dGhdXG4gICAgICAgICkubWFwKChhdXRoVHlwZSkgPT4gW2F1dGhUeXBlLCBhdXRoTWlkZGxld2FyZU1hcFthdXRoVHlwZV1dIGFzIGNvbnN0KVxuICAgICAgICBjb25zdCB1bmRlZmluZWRBdXRoVHlwZSA9IGF1dGhNaWRkbGV3YXJlcy5maW5kKChbLCBtd10pID0+ICFtdylcbiAgICAgICAgaWYgKHVuZGVmaW5lZEF1dGhUeXBlKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhdXRoIHR5cGU6ICR7dW5kZWZpbmVkQXV0aFR5cGV9YClcblxuICAgICAgICBjb25zdCBmaXJzdEF1dGhNaWRkbGV3YXJlVGhhdFN1Y2NlZWRzID0gKG5leHQpID0+IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZU11bHRpcGxlQXV0aE1pZGRsZXdhcmVGYWlsdXJlcyA9XG4gICAgICAgICAgICBzcGVjLm9uTXVsdGlwbGVBdXRoTWlkZGxld2FyZUZhaWx1cmVzID8/XG4gICAgICAgICAgICBvbk11bHRpcGxlQXV0aE1pZGRsZXdhcmVGYWlsdXJlc1xuXG4gICAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgbWlkZGxld2FyZV0gb2YgYXV0aE1pZGRsZXdhcmVzKSB7XG4gICAgICAgICAgICBsZXQgZGlkQXV0aE1pZGRsZXdhcmVUaHJvdyA9IHRydWVcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiBhd2FpdCBtaWRkbGV3YXJlKCguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGVycm9ycyB1bnJlbGF0ZWQgdG8gYXV0aCB0aHJvd24gYnkgYnVpbHQtaW4gbWlkZGxld2FyZSAod2l0aE1ldGhvZHMsIHdpdGhWYWxpZGF0aW9uKSB3aWxsIGJlIGNhdWdodCBoZXJlXG4gICAgICAgICAgICAgICAgZGlkQXV0aE1pZGRsZXdhcmVUaHJvdyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQoLi4uYXJncylcbiAgICAgICAgICAgICAgfSkocmVxLCByZXMpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEF1dGhNZXRob2REb2VzTm90QXBwbHlFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVycm9yLnNvdXJjZV9taWRkbGV3YXJlID0gbmFtZVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaGFuZGxlTXVsdGlwbGVBdXRoTWlkZGxld2FyZUZhaWx1cmVzICYmXG4gICAgICAgICAgICAgICAgZGlkQXV0aE1pZGRsZXdhcmVUaHJvd1xuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVNdWx0aXBsZUF1dGhNaWRkbGV3YXJlRmFpbHVyZXMoW2Vycm9yXSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVW5hdXRob3JpemVkRXhjZXB0aW9uKHtcbiAgICAgICAgICAgIHR5cGU6IFwidW5hdXRob3JpemVkXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBcIk5vIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgc3VjY2VlZGVkXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3cmFwcGVycyhcbiAgICAgICAgICAuLi4oKGV4Y2VwdGlvbkhhbmRsaW5nTWlkZGxld2FyZVxuICAgICAgICAgICAgPyBbZXhjZXB0aW9uSGFuZGxpbmdNaWRkbGV3YXJlXVxuICAgICAgICAgICAgOiBbXSkgYXMgW2FueV0pLFxuICAgICAgICAgIC4uLigoZ2xvYmFsTWlkZGxld2FyZXMgfHwgW10pIGFzIFtdKSxcbiAgICAgICAgICBmaXJzdEF1dGhNaWRkbGV3YXJlVGhhdFN1Y2NlZWRzLFxuICAgICAgICAgIC4uLigoZ2xvYmFsTWlkZGxld2FyZXNBZnRlckF1dGggfHwgW10pIGFzIFtdKSxcbiAgICAgICAgICAuLi4oKHNwZWMubWlkZGxld2FyZXMgfHwgW10pIGFzIFtdKSxcbiAgICAgICAgICB3aXRoTWV0aG9kcyhzcGVjLm1ldGhvZHMpLFxuICAgICAgICAgIHdpdGhWYWxpZGF0aW9uKHtcbiAgICAgICAgICAgIGpzb25Cb2R5OiBzcGVjLmpzb25Cb2R5LFxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHNwZWMucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICBjb21tb25QYXJhbXM6IHNwZWMuY29tbW9uUGFyYW1zLFxuICAgICAgICAgICAgZm9ybURhdGE6IHNwZWMuZm9ybURhdGEsXG4gICAgICAgICAgICBqc29uUmVzcG9uc2U6IHNwZWMuanNvblJlc3BvbnNlLFxuICAgICAgICAgICAgc2hvdWxkVmFsaWRhdGVSZXNwb25zZXMsXG4gICAgICAgICAgICBzaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5LFxuICAgICAgICAgICAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHVzZXJEZWZpbmVkUm91dGVGblxuICAgICAgICApKHJlcSBhcyBhbnksIHJlcylcbiAgICAgIH1cblxuICAgICAgcm9vdFJlcXVlc3RIYW5kbGVyLl9zZXR1cFBhcmFtcyA9IHNldHVwUGFyYW1zXG4gICAgICByb290UmVxdWVzdEhhbmRsZXIuX3JvdXRlU3BlYyA9IHNwZWNcblxuICAgICAgLy8gRXhwb3J0IG1heER1cmF0aW9uIGFzIGEgTmV4dC5qcyByb3V0ZSBzZWdtZW50IGNvbmZpZ1xuICAgICAgY29uc3QgbWF4RHVyYXRpb24gPSBzcGVjLm1heER1cmF0aW9uID8/IGdsb2JhbE1heER1cmF0aW9uXG4gICAgICBpZiAobWF4RHVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByb290UmVxdWVzdEhhbmRsZXIubWF4RHVyYXRpb24gPSBtYXhEdXJhdGlvblxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcm9vdFJlcXVlc3RIYW5kbGVyXG4gICAgfVxuXG4gICAgY3JlYXRlUm91dGVFeHBvcnQuX3NldHVwUGFyYW1zID0gc2V0dXBQYXJhbXNcbiAgICBjcmVhdGVSb3V0ZUV4cG9ydC5fcm91dGVTcGVjID0gc3BlY1xuXG4gICAgcmV0dXJuIGNyZWF0ZVJvdXRlRXhwb3J0XG4gIH1cblxuICB3aXRoUm91dGVTcGVjLl9zZXR1cFBhcmFtcyA9IHNldHVwUGFyYW1zXG5cbiAgcmV0dXJuIHdpdGhSb3V0ZVNwZWNcbn0pIGFzIGFueVxuIiwgImltcG9ydCB0eXBlIHsgTmV4dEFwaVJlcXVlc3QgYXMgUmVxLCBOZXh0QXBpUmVzcG9uc2UgYXMgUmVzIH0gZnJvbSBcIm5leHRcIlxuLypcblxuV3JhcHMgYSBmdW5jdGlvbiBpbiBsYXllcnMgb2Ygb3RoZXIgZnVuY3Rpb25zLCB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBpbnB1dC9vdXRwdXRcbnR5cGUuIFRoZSBvdXRwdXQgb2Ygd3JhcHBlcnMgd2lsbCBhbHdheXMgaGF2ZSB0aGUgdHlwZSBvZiBpdCdzIGxhc3QgcGFyYW1ldGVyXG4odGhlIHdyYXBwZWQgZnVuY3Rpb24pXG5cblRoaXMgZnVuY3Rpb24gdHVybnMgdGhpcyB0eXBlIG9mIGNvbXBvc2l0aW9uLi4uXG5cbmxvZ2dlci53aXRoQ29udGV4dChcInNvbWVjb250ZXh0XCIpKFxuICBhc3luYyAoYSwgYikgPT4ge1xuICAgIHJldHVybiBhXG4gIH1cbilcblxuSW50by4uLlxuXG53cmFwcGVycyhcbiAgbG9nZ2VyLndpdGhDb250ZXh0KFwic29tZWNvbnRleHRcIiksXG4gIGFzeW5jIChhLCBiKSA9PiB7XG4gICAgcmV0dXJuIGFcbiAgfVxuKVxuXG5IYXZpbmcgdGhpcyBhcyBhIHV0aWxpdHkgbWV0aG9kIGhlbHBzIHByZXNlcnZlIHR5cGVzLCB3aGljaCBvdGhlcndpc2UgY2FuIGdldFxubWVzc2VkIHVwIGJ5IHRoZSBtaWRkbGV3YXJlcy4gSXQgYWxzbyBjYW4gbWFrZSB0aGUgY29kZSBjbGVhbmVyIHdoZXJlIHRoZXJlIGFyZVxubXVsdGlwbGUgd3JhcHBlcnMuXG5cbiMjIEVYQU1QTEVTXG5cbkluIHRoZSBjb250ZXh0IG9mIHJlcXVlc3QgbWlkZGxld2FyZSB5b3UgbWlnaHQgd3JpdGUgc29tZXRoaW5nIGxpa2UgdGhpcy4uLlxuXG5jb25zdCB3aXRoUmVxdWVzdExvZ2dpbmdNaWRkbGV3YXJlID0gKG5leHQpID0+IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICBjb25zb2xlLmxvZyhgR09UIFJFUVVFU1QgJHtyZXEubWV0aG9kfSAke3JlcS5wYXRofWApXG4gIHJldHVybiBuZXh0KHJlcSwgcmVzKVxufVxuXG5IZXJlJ3MgYW4gZXhhbXBsZSBvZiBhIHdyYXBwZXIgdGhhdCB0YWtlcyBzb21lIHBhcmFtZXRlcnMuLi5cblxuY29uc3Qgd2l0aExvZ2dlZEFyZ3VtZW50cyA9XG4gICAgKGxvZ1ByZWZpeDogc3RyaW5nKSA9PlxuICAgIChuZXh0KSA9PlxuICAgIGFzeW5jICguLi5mdW5jQXJncykgPT4ge1xuICAgICAgY29uc29sZS5sb2cobG9nUHJlZml4LCAuLi5mdW5jQXJncylcbiAgICAgIHJldHVybiBuZXh0KC4uLmZ1bmNBcmdzKVxuICAgIH1cblxuKi9cblxuZXhwb3J0IHR5cGUgTWlkZGxld2FyZTxULCBEZXAgPSB7fT4gPSAoXG4gIG5leHQ6IChyZXE6IFJlcSAmIERlcCAmIFQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxICYgRGVwICYgVCwgcmVzOiBSZXMpID0+IGFueVxuXG4vLyBTYWZlciBNaWRkbGV3YXJlIHJlcXVpcmVzIHRoZSB1c2Ugb2YgZXh0ZW5kUmVxdWVzdCB0byBlbnN1cmUgdGhhdCB0aGVcbi8vIG5ldyBjb250ZXh0IChUKSB3YXMgYWN0dWFsbHkgYWRkZWQgdG8gdGhlIHJlcXVlc3QuIEl0J3Mga2luZCBvZiBhbm5veWluZ1xuLy8gdG8gdXNlIGluIHByYWN0aWNlLCBzbyB3ZSBkb24ndCB1c2UgaXQgZm9yIG91ciBXcmFwcGVycyAoeWV0KVxuZXhwb3J0IHR5cGUgU2FmZXJNaWRkbGV3YXJlPFQsIERlcCA9IHt9PiA9IChcbiAgbmV4dDogKHJlcTogUmVxICYgRGVwICYgVCwgcmVzOiBSZXMpID0+IGFueVxuKSA9PiAocmVxOiBSZXEgJiBEZXAsIHJlczogUmVzKSA9PiBhbnlcblxuZXhwb3J0IGNvbnN0IGV4dGVuZFJlcXVlc3QgPSA8VCBleHRlbmRzIFJlcSwgSyBleHRlbmRzIHt9PihcbiAgcmVxOiBULFxuICBtZXJnZTogS1xuKTogVCAmIEsgPT4ge1xuICBmb3IgKGNvbnN0IFtrZXksIHZdIG9mIE9iamVjdC5lbnRyaWVzKG1lcmdlKSkge1xuICAgIDsocmVxIGFzIGFueSlba2V5XSA9IHZcbiAgfVxuICByZXR1cm4gcmVxIGFzIGFueVxufVxuXG50eXBlIFdyYXBwZXJzMSA9IDxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBlbmRwb2ludDogKHJlcTogUmVxICYgTXcxUmVxdWVzdENvbnRleHQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxLCByZXM6IFJlcykgPT4gYW55XG5cbnR5cGUgV3JhcHBlcnMyID0gPFxuICBNdzFSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13MkRlcCxcbiAgTXcxRGVwLFxuICBNdzJSZXF1ZXN0Q29udGV4dCxcbiAgTXcyRGVwXG4+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIG13MjogTWlkZGxld2FyZTxNdzJSZXF1ZXN0Q29udGV4dCwgTXcyRGVwPixcbiAgZW5kcG9pbnQ6IChyZXE6IFJlcSAmIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQsIHJlczogUmVzKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxLCByZXM6IFJlcykgPT4gYW55XG5cbi8vIFRPRE8gZmlndXJlIG91dCBob3cgdG8gZG8gYSByZWN1cnNpdmUgZGVmaW5pdGlvbiwgb3Igb25lIHRoYXQgc2ltcGxpZmllc1xuLy8gdGhlc2UgcmVkdW5kYW50IHdyYXBwZXJzXG5cbnR5cGUgV3JhcHBlcnMzID0gPFxuICBNdzFSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13MkRlcCxcbiAgTXcxRGVwLFxuICBNdzJSZXF1ZXN0Q29udGV4dCxcbiAgTXcyRGVwLFxuICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgTXczRGVwXG4+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIG13MjogTWlkZGxld2FyZTxNdzJSZXF1ZXN0Q29udGV4dCwgTXcyRGVwPixcbiAgbXczOiBNaWRkbGV3YXJlPFxuICAgIE13M1JlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzNEZXAgPyBNdzNEZXAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICYgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCAmIE13M1JlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzNCA9IDxcbiAgTXcxUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzJEZXAsXG4gIE13MURlcCxcbiAgTXcyUmVxdWVzdENvbnRleHQsXG4gIE13MkRlcCxcbiAgTXczUmVxdWVzdENvbnRleHQsXG4gIE13M0RlcCxcbiAgTXc0UmVxdWVzdENvbnRleHQsXG4gIE13NERlcFxuPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBtdzI6IE1pZGRsZXdhcmU8TXcyUmVxdWVzdENvbnRleHQsIE13MkRlcD4sXG4gIG13MzogTWlkZGxld2FyZTxcbiAgICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXczRGVwID8gTXczRGVwIDogbmV2ZXJcbiAgPixcbiAgbXc0OiBNaWRkbGV3YXJlPFxuICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgJiBNdzNSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NERlcFxuICAgICAgPyBNdzREZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVyczUgPSA8XG4gIE13MVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXcyRGVwLFxuICBNdzFEZXAsXG4gIE13MlJlcXVlc3RDb250ZXh0LFxuICBNdzJEZXAsXG4gIE13M1JlcXVlc3RDb250ZXh0LFxuICBNdzNEZXAsXG4gIE13NFJlcXVlc3RDb250ZXh0LFxuICBNdzREZXAsXG4gIE13NVJlcXVlc3RDb250ZXh0LFxuICBNdzVEZXBcbj4oXG4gIG13MTogTWlkZGxld2FyZTxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPixcbiAgbXcyOiBNaWRkbGV3YXJlPE13MlJlcXVlc3RDb250ZXh0LCBNdzJEZXA+LFxuICBtdzM6IE1pZGRsZXdhcmU8XG4gICAgTXczUmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13M0RlcCA/IE13M0RlcCA6IG5ldmVyXG4gID4sXG4gIG13NDogTWlkZGxld2FyZTxcbiAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0ICYgTXczUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzREZXBcbiAgICAgID8gTXc0RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NTogTWlkZGxld2FyZTxcbiAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NURlcFxuICAgICAgPyBNdzVEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVyczYgPSA8XG4gIE13MVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXcyRGVwLFxuICBNdzFEZXAsXG4gIE13MlJlcXVlc3RDb250ZXh0LFxuICBNdzJEZXAsXG4gIE13M1JlcXVlc3RDb250ZXh0LFxuICBNdzNEZXAsXG4gIE13NFJlcXVlc3RDb250ZXh0LFxuICBNdzREZXAsXG4gIE13NVJlcXVlc3RDb250ZXh0LFxuICBNdzVEZXAsXG4gIE13NlJlcXVlc3RDb250ZXh0LFxuICBNdzZEZXBcbj4oXG4gIG13MTogTWlkZGxld2FyZTxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPixcbiAgbXcyOiBNaWRkbGV3YXJlPE13MlJlcXVlc3RDb250ZXh0LCBNdzJEZXA+LFxuICBtdzM6IE1pZGRsZXdhcmU8XG4gICAgTXczUmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13M0RlcCA/IE13M0RlcCA6IG5ldmVyXG4gID4sXG4gIG13NDogTWlkZGxld2FyZTxcbiAgICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0ICYgTXczUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzREZXBcbiAgICAgID8gTXc0RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NTogTWlkZGxld2FyZTxcbiAgICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NURlcFxuICAgICAgPyBNdzVEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc2OiBNaWRkbGV3YXJlPFxuICAgIE13NlJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc2RGVwXG4gICAgICA/IE13NkRlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICZcbiAgICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NlJlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzNyA9IDxcbiAgTXcxUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzJEZXAsXG4gIE13MURlcCxcbiAgTXcyUmVxdWVzdENvbnRleHQsXG4gIE13MkRlcCxcbiAgTXczUmVxdWVzdENvbnRleHQsXG4gIE13M0RlcCxcbiAgTXc0UmVxdWVzdENvbnRleHQsXG4gIE13NERlcCxcbiAgTXc1UmVxdWVzdENvbnRleHQsXG4gIE13NURlcCxcbiAgTXc2UmVxdWVzdENvbnRleHQsXG4gIE13NkRlcCxcbiAgTXc3UmVxdWVzdENvbnRleHQsXG4gIE13N0RlcFxuPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBtdzI6IE1pZGRsZXdhcmU8TXcyUmVxdWVzdENvbnRleHQsIE13MkRlcD4sXG4gIG13MzogTWlkZGxld2FyZTxcbiAgICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXczRGVwID8gTXczRGVwIDogbmV2ZXJcbiAgPixcbiAgbXc0OiBNaWRkbGV3YXJlPFxuICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgJiBNdzNSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NERlcFxuICAgICAgPyBNdzREZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc1OiBNaWRkbGV3YXJlPFxuICAgIE13NVJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc1RGVwXG4gICAgICA/IE13NURlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBtdzY6IE1pZGRsZXdhcmU8XG4gICAgTXc2UmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXcyUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXczUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc0UmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc1UmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzZEZXBcbiAgICAgID8gTXc2RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NzogTWlkZGxld2FyZTxcbiAgICBNdzdSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzZSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13N0RlcFxuICAgICAgPyBNdzdEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgZW5kcG9pbnQ6IChcbiAgICByZXE6IFJlcSAmXG4gICAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzZSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzdSZXF1ZXN0Q29udGV4dCxcbiAgICByZXM6IFJlc1xuICApID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVycyA9IFdyYXBwZXJzMSAmXG4gIFdyYXBwZXJzMiAmXG4gIFdyYXBwZXJzMyAmXG4gIFdyYXBwZXJzNCAmXG4gIFdyYXBwZXJzNSAmXG4gIFdyYXBwZXJzNiAmXG4gIFdyYXBwZXJzN1xuXG5leHBvcnQgY29uc3Qgd3JhcHBlcnM6IFdyYXBwZXJzID0gKC4uLndyYXBwZXJzQXJnczogYW55W10pID0+IHtcbiAgY29uc3Qgd3JhcHBlZEZ1bmN0aW9uID0gd3JhcHBlcnNBcmdzW3dyYXBwZXJzQXJncy5sZW5ndGggLSAxXVxuICBjb25zdCBtd3MgPSB3cmFwcGVyc0FyZ3Muc2xpY2UoMCwgLTEpXG5cbiAgbGV0IGxhc3RXcmFwcGVkRnVuY3Rpb24gPSB3cmFwcGVkRnVuY3Rpb25cbiAgZm9yIChsZXQgaSA9IG13cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGxhc3RXcmFwcGVkRnVuY3Rpb24gPSAobXdzW2ldIGFzIGFueSkobGFzdFdyYXBwZWRGdW5jdGlvbilcbiAgfVxuXG4gIHJldHVybiBsYXN0V3JhcHBlZEZ1bmN0aW9uXG59XG5cbmV4cG9ydCBkZWZhdWx0IHdyYXBwZXJzXG4iLCAiaW1wb3J0IHsgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiB9IGZyb20gXCIuLi8uLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuXG5leHBvcnQgdHlwZSBIVFRQTWV0aG9kcyA9XG4gIHwgXCJHRVRcIlxuICB8IFwiUE9TVFwiXG4gIHwgXCJERUxFVEVcIlxuICB8IFwiUFVUXCJcbiAgfCBcIlBBVENIXCJcbiAgfCBcIkhFQURcIlxuICB8IFwiT1BUSU9OU1wiXG5cbmV4cG9ydCBjb25zdCB3aXRoTWV0aG9kcyA9IChtZXRob2RzOiBIVFRQTWV0aG9kc1tdKSA9PiAobmV4dCkgPT4gKHJlcSwgcmVzKSA9PiB7XG4gIGlmICghbWV0aG9kcy5pbmNsdWRlcyhyZXEubWV0aG9kKSkge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKHtcbiAgICAgIHR5cGU6IFwibWV0aG9kX25vdF9hbGxvd2VkXCIsXG4gICAgICBtZXNzYWdlOiBgb25seSAke21ldGhvZHMuam9pbihcIixcIil9IGFjY2VwdGVkYCxcbiAgICB9KVxuICB9XG4gIHJldHVybiBuZXh0KHJlcSwgcmVzKVxufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoTWV0aG9kc1xuIiwgImltcG9ydCB0eXBlIHsgTmV4dEFwaVJlcXVlc3QsIE5leHRBcGlSZXNwb25zZSB9IGZyb20gXCJuZXh0XCJcbmltcG9ydCB7IHosIFpvZEZpcnN0UGFydHlUeXBlS2luZCB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiXG5cbmltcG9ydCB7XG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCIuLi8uLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuaW1wb3J0IHsgUXVlcnlBcnJheUZvcm1hdHMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IHsgREVGQVVMVF9BUlJBWV9GT1JNQVRTIH0gZnJvbSBcIi4uXCJcblxuY29uc3QgZ2V0Wm9kT2JqZWN0U2NoZW1hRnJvbVpvZEVmZmVjdFNjaGVtYSA9IChcbiAgaXNab2RFZmZlY3Q6IGJvb2xlYW4sXG4gIHNjaGVtYTogei5ab2RUeXBlQW55XG4pOiB6LlpvZFR5cGVBbnkgfCB6LlpvZE9iamVjdDxhbnk+ID0+IHtcbiAgaWYgKCFpc1pvZEVmZmVjdCkge1xuICAgIHJldHVybiBzY2hlbWEgYXMgei5ab2RPYmplY3Q8YW55PlxuICB9XG5cbiAgbGV0IGN1cnJlbnRTY2hlbWEgPSBzY2hlbWFcblxuICB3aGlsZSAoY3VycmVudFNjaGVtYSBpbnN0YW5jZW9mIHouWm9kRWZmZWN0cykge1xuICAgIGN1cnJlbnRTY2hlbWEgPSBjdXJyZW50U2NoZW1hLl9kZWYuc2NoZW1hXG4gIH1cblxuICByZXR1cm4gY3VycmVudFNjaGVtYSBhcyB6LlpvZE9iamVjdDxhbnk+XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgY29ycmVjdCBzY2hlbWEgZnJvbSBhIFpvZEVmZmVjdCB8IFpvZERlZmF1bHQgfCBab2RPcHRpb25hbCBzY2hlbWEuXG4gKiBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBoYW5kbGUgYWxsIHNwZWNpYWwgY2FzZXMgb2YgWm9kU2NoZW1hIGFuZCBub3QganVzdCBab2RFZmZlY3QgfCBab2REZWZhdWx0IHwgWm9kT3B0aW9uYWxcbiAqL1xuY29uc3QgZ2V0Wm9kRGVmRnJvbVpvZFNjaGVtYUhlbHBlcnMgPSAoc2NoZW1hOiB6LlpvZFR5cGVBbnkpID0+IHtcbiAgY29uc3Qgc3BlY2lhbF96b2RfdHlwZXMgPSBbXG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9wdGlvbmFsLFxuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICBdXG5cbiAgd2hpbGUgKHNwZWNpYWxfem9kX3R5cGVzLmluY2x1ZGVzKHNjaGVtYS5fZGVmLnR5cGVOYW1lKSkge1xuICAgIGlmIChcbiAgICAgIHNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT3B0aW9uYWwgfHxcbiAgICAgIHNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdFxuICAgICkge1xuICAgICAgc2NoZW1hID0gc2NoZW1hLl9kZWYuaW5uZXJUeXBlXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChzY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMpIHtcbiAgICAgIHNjaGVtYSA9IHNjaGVtYS5fZGVmLnNjaGVtYVxuICAgICAgY29udGludWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNjaGVtYS5fZGVmXG59XG5cbmNvbnN0IHRyeUdldFpvZFNjaGVtYUFzT2JqZWN0ID0gKFxuICBzY2hlbWE6IHouWm9kVHlwZUFueVxuKTogei5ab2RPYmplY3Q8YW55PiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGlzWm9kRWZmZWN0ID0gc2NoZW1hLl9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzXG4gIGNvbnN0IHNhZmVfc2NoZW1hID0gZ2V0Wm9kT2JqZWN0U2NoZW1hRnJvbVpvZEVmZmVjdFNjaGVtYShpc1pvZEVmZmVjdCwgc2NoZW1hKVxuICBjb25zdCBpc1pvZE9iamVjdCA9XG4gICAgc2FmZV9zY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdFxuXG4gIGlmICghaXNab2RPYmplY3QpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICByZXR1cm4gc2FmZV9zY2hlbWEgYXMgei5ab2RPYmplY3Q8YW55PlxufVxuXG5jb25zdCBpc1pvZFNjaGVtYUFycmF5ID0gKHNjaGVtYTogei5ab2RUeXBlQW55KSA9PiB7XG4gIGNvbnN0IGRlZiA9IGdldFpvZERlZkZyb21ab2RTY2hlbWFIZWxwZXJzKHNjaGVtYSlcbiAgcmV0dXJuIGRlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEFycmF5XG59XG5cbmNvbnN0IGlzWm9kU2NoZW1hQm9vbGVhbiA9IChzY2hlbWE6IHouWm9kVHlwZUFueSkgPT4ge1xuICBjb25zdCBkZWYgPSBnZXRab2REZWZGcm9tWm9kU2NoZW1hSGVscGVycyhzY2hlbWEpXG4gIHJldHVybiBkZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCb29sZWFuXG59XG5cbmNvbnN0IHBhcnNlUXVlcnlQYXJhbXMgPSAoXG4gIHNjaGVtYTogei5ab2RUeXBlQW55LFxuICBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHN1cHBvcnRlZEFycmF5Rm9ybWF0czogUXVlcnlBcnJheUZvcm1hdHNcbikgPT4ge1xuICBjb25zdCBwYXJzZWRfaW5wdXQgPSBPYmplY3QuYXNzaWduKHt9LCBpbnB1dClcbiAgY29uc3Qgb2JqX3NjaGVtYSA9IHRyeUdldFpvZFNjaGVtYUFzT2JqZWN0KHNjaGVtYSlcblxuICBpZiAob2JqX3NjaGVtYSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9ial9zY2hlbWEuc2hhcGUpKSB7XG4gICAgICBpZiAoaXNab2RTY2hlbWFBcnJheSh2YWx1ZSBhcyB6LlpvZFR5cGVBbnkpKSB7XG4gICAgICAgIGNvbnN0IGFycmF5X2lucHV0ID0gaW5wdXRba2V5XVxuXG4gICAgICAgIGlmICh0eXBlb2YgYXJyYXlfaW5wdXQgPT09IFwic3RyaW5nXCIgJiYgYXJyYXlfaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcGFyc2VkX2lucHV0W2tleV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiBhcnJheV9pbnB1dCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgIGFycmF5X2lucHV0Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBzdXBwb3J0ZWRBcnJheUZvcm1hdHMuaW5jbHVkZXMoXCJjb21tYVwiKVxuICAgICAgICApIHtcbiAgICAgICAgICBwYXJzZWRfaW5wdXRba2V5XSA9IGFycmF5X2lucHV0LnNwbGl0KFwiLFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXQgPSBpbnB1dFtgJHtrZXl9W11gXVxuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIGJyYWNrZXRfc3ludGF4X2FycmF5X2lucHV0ID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzLmluY2x1ZGVzKFwiYnJhY2tldHNcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcHJlX3NwbGl0X2FycmF5ID0gYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXRcbiAgICAgICAgICBwYXJzZWRfaW5wdXRba2V5XSA9IHByZV9zcGxpdF9hcnJheS5zcGxpdChcIixcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGJyYWNrZXRfc3ludGF4X2FycmF5X2lucHV0KSAmJlxuICAgICAgICAgIHN1cHBvcnRlZEFycmF5Rm9ybWF0cy5pbmNsdWRlcyhcImJyYWNrZXRzXCIpXG4gICAgICAgICkge1xuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1pvZFNjaGVtYUJvb2xlYW4odmFsdWUgYXMgei5ab2RUeXBlQW55KSkge1xuICAgICAgICBjb25zdCBib29sZWFuX2lucHV0ID0gaW5wdXRba2V5XVxuXG4gICAgICAgIGlmICh0eXBlb2YgYm9vbGVhbl9pbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gYm9vbGVhbl9pbnB1dCA9PT0gXCJ0cnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzY2hlbWEucGFyc2UocGFyc2VkX2lucHV0KVxufVxuXG5jb25zdCB2YWxpZGF0ZVF1ZXJ5UGFyYW1zID0gKFxuICBpbnB1dFVybDogc3RyaW5nLFxuICBzY2hlbWE6IHouWm9kVHlwZUFueSxcbiAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzOiBRdWVyeUFycmF5Rm9ybWF0c1xuKSA9PiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoaW5wdXRVcmwsIFwiaHR0cDovL2R1bW15LmNvbVwiKVxuXG4gIGNvbnN0IHNlZW5LZXlzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICBjb25zdCBvYmpfc2NoZW1hID0gdHJ5R2V0Wm9kU2NoZW1hQXNPYmplY3Qoc2NoZW1hKVxuICBpZiAoIW9ial9zY2hlbWEpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIHVybC5zZWFyY2hQYXJhbXMua2V5cygpKSB7XG4gICAgZm9yIChjb25zdCBbc2NoZW1hS2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqX3NjaGVtYS5zaGFwZSkpIHtcbiAgICAgIGlmIChpc1pvZFNjaGVtYUFycmF5KHZhbHVlIGFzIHouWm9kVHlwZUFueSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleSA9PT0gYCR7c2NoZW1hS2V5fVtdYCAmJlxuICAgICAgICAgICFzdXBwb3J0ZWRBcnJheUZvcm1hdHMuaW5jbHVkZXMoXCJicmFja2V0c1wiKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgICAgICB0eXBlOiBcImludmFsaWRfcXVlcnlfcGFyYW1zXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBgQnJhY2tldCBzeW50YXggbm90IHN1cHBvcnRlZCBmb3IgcXVlcnkgcGFyYW0gXCIke3NjaGVtYUtleX1cImAsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGtleV9zY2hlbWEgPSBvYmpfc2NoZW1hLnNoYXBlW2tleV1cblxuICAgIGlmIChrZXlfc2NoZW1hKSB7XG4gICAgICBpZiAoaXNab2RTY2hlbWFBcnJheShrZXlfc2NoZW1hKSkge1xuICAgICAgICBpZiAoc2VlbktleXMuaGFzKGtleSkgJiYgIXN1cHBvcnRlZEFycmF5Rm9ybWF0cy5pbmNsdWRlcyhcInJlcGVhdFwiKSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW52YWxpZF9xdWVyeV9wYXJhbXNcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBSZXBlYXRlZCBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWQgZm9yIGR1cGxpY2F0ZSBxdWVyeSBwYXJhbSBcIiR7a2V5fVwiYCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2VlbktleXMuYWRkKGtleSlcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RJbnB1dDxcbiAgSnNvbkJvZHkgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICBDb21tb25QYXJhbXMgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gIEZvcm1EYXRhIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICBKc29uUmVzcG9uc2UgZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbj4ge1xuICBqc29uQm9keT86IEpzb25Cb2R5XG4gIHF1ZXJ5UGFyYW1zPzogUXVlcnlQYXJhbXNcbiAgY29tbW9uUGFyYW1zPzogQ29tbW9uUGFyYW1zXG4gIGZvcm1EYXRhPzogRm9ybURhdGFcbiAganNvblJlc3BvbnNlPzogSnNvblJlc3BvbnNlXG4gIHNob3VsZFZhbGlkYXRlUmVzcG9uc2VzPzogYm9vbGVhblxuICBzaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5PzogYm9vbGVhblxuICBzdXBwb3J0ZWRBcnJheUZvcm1hdHM/OiBRdWVyeUFycmF5Rm9ybWF0c1xufVxuXG5jb25zdCB6b2RJc3N1ZVRvU3RyaW5nID0gKGlzc3VlOiB6LlpvZElzc3VlKSA9PiB7XG4gIGlmIChpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGlzc3VlLm1lc3NhZ2VcbiAgfVxuICBpZiAoaXNzdWUubWVzc2FnZSA9PT0gXCJSZXF1aXJlZFwiKSB7XG4gICAgcmV0dXJuIGAke2lzc3VlLnBhdGguam9pbihcIi5cIil9IGlzIHJlcXVpcmVkYFxuICB9XG4gIHJldHVybiBgJHtpc3N1ZS5tZXNzYWdlfSBmb3IgXCIke2lzc3VlLnBhdGguam9pbihcIi5cIil9XCJgXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSnNvblJlc3BvbnNlPEpzb25SZXNwb25zZSBleHRlbmRzIHouWm9kVHlwZUFueT4oXG4gIGpzb25SZXNwb25zZTogSnNvblJlc3BvbnNlIHwgdW5kZWZpbmVkLFxuICByZXM6IE5leHRBcGlSZXNwb25zZVxuKSB7XG4gIGNvbnN0IG9yaWdpbmFsX3Jlc19qc29uID0gcmVzLmpzb25cbiAgY29uc3Qgb3ZlcnJpZGVfcmVzX2pzb24gPSAoanNvbjogYW55KSA9PiB7XG4gICAgY29uc3QgaXNfc3VjY2VzcyA9IHJlcy5zdGF0dXNDb2RlID49IDIwMCAmJiByZXMuc3RhdHVzQ29kZSA8IDMwMFxuICAgIGlmICghaXNfc3VjY2Vzcykge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsX3Jlc19qc29uKGpzb24pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGpzb25SZXNwb25zZT8ucGFyc2UoanNvbilcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnZhbGlkX3Jlc3BvbnNlXCIsXG4gICAgICAgIG1lc3NhZ2U6IFwidGhlIHJlc3BvbnNlIGRvZXMgbm90IG1hdGNoIHdpdGgganNvblJlc3BvbnNlXCIsXG4gICAgICAgIHpvZEVycm9yOiBlcnIsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBvcmlnaW5hbF9yZXNfanNvbihqc29uKVxuICB9XG4gIHJlcy5qc29uID0gb3ZlcnJpZGVfcmVzX2pzb25cbn1cblxuZXhwb3J0IGNvbnN0IHdpdGhWYWxpZGF0aW9uID1cbiAgPFxuICAgIEpzb25Cb2R5IGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICAgIFF1ZXJ5UGFyYW1zIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICAgIENvbW1vblBhcmFtcyBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgICBGb3JtRGF0YSBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgICBKc29uUmVzcG9uc2UgZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbiAgPihcbiAgICBpbnB1dDogUmVxdWVzdElucHV0PFxuICAgICAgSnNvbkJvZHksXG4gICAgICBRdWVyeVBhcmFtcyxcbiAgICAgIENvbW1vblBhcmFtcyxcbiAgICAgIEZvcm1EYXRhLFxuICAgICAgSnNvblJlc3BvbnNlXG4gICAgPlxuICApID0+XG4gIChuZXh0KSA9PlxuICBhc3luYyAocmVxOiBOZXh0QXBpUmVxdWVzdCwgcmVzOiBOZXh0QXBpUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCB7IHN1cHBvcnRlZEFycmF5Rm9ybWF0cyA9IERFRkFVTFRfQVJSQVlfRk9STUFUUyB9ID0gaW5wdXRcblxuICAgIGlmIChcbiAgICAgIChpbnB1dC5mb3JtRGF0YSAmJiBpbnB1dC5qc29uQm9keSkgfHxcbiAgICAgIChpbnB1dC5mb3JtRGF0YSAmJiBpbnB1dC5jb21tb25QYXJhbXMpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdXNlIGZvcm1EYXRhIHdpdGgganNvbkJvZHkgb3IgY29tbW9uUGFyYW1zXCIpXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgKHJlcS5tZXRob2QgPT09IFwiUE9TVFwiIHx8IHJlcS5tZXRob2QgPT09IFwiUEFUQ0hcIikgJiZcbiAgICAgIChpbnB1dC5qc29uQm9keSB8fCBpbnB1dC5jb21tb25QYXJhbXMpICYmXG4gICAgICAhcmVxLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0/LmluY2x1ZGVzKFwiYXBwbGljYXRpb24vanNvblwiKSAmJlxuICAgICAgIV8uaXNFbXB0eShyZXEuYm9keSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnZhbGlkX2NvbnRlbnRfdHlwZVwiLFxuICAgICAgICBtZXNzYWdlOiBgJHtyZXEubWV0aG9kfSByZXF1ZXN0cyBtdXN0IGhhdmUgQ29udGVudC1UeXBlIGhlYWRlciB3aXRoIFwiYXBwbGljYXRpb24vanNvblwiYCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgaW5wdXQuZm9ybURhdGEgJiZcbiAgICAgIHJlcS5tZXRob2QgIT09IFwiR0VUXCIgJiZcbiAgICAgICFyZXEuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXT8uaW5jbHVkZXMoXG4gICAgICAgIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJcbiAgICAgIClcbiAgICAgIC8vIFRPRE8gZXZlbnR1YWxseSB3ZSBzaG91bGQgc3VwcG9ydCBtdWx0aXBhcnQvZm9ybS1kYXRhXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgIHR5cGU6IFwiaW52YWxpZF9jb250ZW50X3R5cGVcIixcbiAgICAgICAgbWVzc2FnZTogYE11c3QgaGF2ZSBDb250ZW50LVR5cGUgaGVhZGVyIHdpdGggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcImAsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcmlnaW5hbF9jb21iaW5lZF9wYXJhbXMgPSB7IC4uLnJlcS5xdWVyeSwgLi4ucmVxLmJvZHkgfVxuXG4gICAgICBjb25zdCB3aWxsVmFsaWRhdGVSZXF1ZXN0Qm9keSA9IGlucHV0LnNob3VsZFZhbGlkYXRlR2V0UmVxdWVzdEJvZHlcbiAgICAgICAgPyB0cnVlXG4gICAgICAgIDogcmVxLm1ldGhvZCAhPT0gXCJHRVRcIiAmJiByZXEubWV0aG9kICE9PSBcIkRFTEVURVwiXG5cbiAgICAgIGNvbnN0IGlzRm9ybURhdGEgPSBCb29sZWFuKGlucHV0LmZvcm1EYXRhKVxuXG4gICAgICBpZiAoaXNGb3JtRGF0YSAmJiB3aWxsVmFsaWRhdGVSZXF1ZXN0Qm9keSkge1xuICAgICAgICByZXEuYm9keSA9IGlucHV0LmZvcm1EYXRhPy5wYXJzZShyZXEuYm9keSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0Zvcm1EYXRhICYmIHdpbGxWYWxpZGF0ZVJlcXVlc3RCb2R5KSB7XG4gICAgICAgIHJlcS5ib2R5ID0gaW5wdXQuanNvbkJvZHk/LnBhcnNlKHJlcS5ib2R5KVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5wdXQucXVlcnlQYXJhbXMpIHtcbiAgICAgICAgaWYgKCFyZXEudXJsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVxLnVybCBpcyB1bmRlZmluZWRcIilcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbGlkYXRlUXVlcnlQYXJhbXMocmVxLnVybCwgaW5wdXQucXVlcnlQYXJhbXMsIHN1cHBvcnRlZEFycmF5Rm9ybWF0cylcblxuICAgICAgICByZXEucXVlcnkgPSBwYXJzZVF1ZXJ5UGFyYW1zKFxuICAgICAgICAgIGlucHV0LnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgIHJlcS5xdWVyeSxcbiAgICAgICAgICBzdXBwb3J0ZWRBcnJheUZvcm1hdHNcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAoaW5wdXQuY29tbW9uUGFyYW1zKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhcyBjb21tb25QYXJhbXMgaW5jbHVkZXMgcXVlcnkgcGFyYW1zLCB3ZSBjYW4gdXNlIHRoZSBwYXJzZVF1ZXJ5UGFyYW1zIGZ1bmN0aW9uXG4gICAgICAgICAqL1xuICAgICAgICA7KHJlcSBhcyBhbnkpLmNvbW1vblBhcmFtcyA9IHBhcnNlUXVlcnlQYXJhbXMoXG4gICAgICAgICAgaW5wdXQuY29tbW9uUGFyYW1zLFxuICAgICAgICAgIG9yaWdpbmFsX2NvbWJpbmVkX3BhcmFtcyxcbiAgICAgICAgICBzdXBwb3J0ZWRBcnJheUZvcm1hdHNcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEJhZFJlcXVlc3RFeGNlcHRpb24pIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9yLm5hbWUgPT09IFwiWm9kRXJyb3JcIikge1xuICAgICAgICBsZXQgbWVzc2FnZVxuICAgICAgICBpZiAoZXJyb3IuaXNzdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IGlzc3VlID0gZXJyb3IuaXNzdWVzWzBdXG4gICAgICAgICAgbWVzc2FnZSA9IHpvZElzc3VlVG9TdHJpbmcoaXNzdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZV9jb21wb25lbnRzOiBzdHJpbmdbXSA9IFtdXG4gICAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBlcnJvci5pc3N1ZXMpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VfY29tcG9uZW50cy5wdXNoKHpvZElzc3VlVG9TdHJpbmcoaXNzdWUpKVxuICAgICAgICAgIH1cbiAgICAgICAgICBtZXNzYWdlID1cbiAgICAgICAgICAgIGAke2Vycm9yLmlzc3Vlcy5sZW5ndGh9IElucHV0IEVycm9yczogYCArXG4gICAgICAgICAgICBtZXNzYWdlX2NvbXBvbmVudHMuam9pbihcIiwgXCIpXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgICAgdHlwZTogXCJpbnZhbGlkX2lucHV0XCIsXG4gICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICB2YWxpZGF0aW9uX2Vycm9yczogZXJyb3IuZm9ybWF0KCksXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnZhbGlkX2lucHV0XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiRXJyb3Igd2hpbGUgcGFyc2luZyBpbnB1dFwiLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIHdpbGwgb3ZlcnJpZGUgdGhlIHJlcy5qc29uIG1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgcmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZiAoaW5wdXQuc2hvdWxkVmFsaWRhdGVSZXNwb25zZXMpIHtcbiAgICAgIHZhbGlkYXRlSnNvblJlc3BvbnNlKGlucHV0Lmpzb25SZXNwb25zZSwgcmVzKVxuICAgIH1cblxuICAgIHJldHVybiBuZXh0KHJlcSwgcmVzKVxuICB9XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhWYWxpZGF0aW9uXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7OztBQ0FBOzs7QUNBQTtBQWlVTyxJQUFNLFdBQXFCLElBQUksaUJBQXdCO0FBQzVELFFBQU0sa0JBQWtCLGFBQWEsYUFBYSxTQUFTO0FBQzNELFFBQU0sTUFBTSxhQUFhLE1BQU0sR0FBRyxFQUFFO0FBRXBDLE1BQUksc0JBQXNCO0FBQzFCLFdBQVMsSUFBSSxJQUFJLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUN4QywwQkFBdUIsSUFBSSxHQUFXLG1CQUFtQjtBQUFBLEVBQzNEO0FBRUEsU0FBTztBQUNUO0FBRUEsSUFBTyxtQkFBUTs7O0FDN1VmO0FBV08sSUFBTSxjQUFjLENBQUMsWUFBMkIsQ0FBQyxTQUFTLENBQUMs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
402
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvaW5kZXgudHMiLCAiLi4vc3JjL3dyYXBwZXJzL2luZGV4LnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvbWlkZGxld2FyZXMvd2l0aC1tZXRob2RzLnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvbWlkZGxld2FyZXMvd2l0aC12YWxpZGF0aW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vd2l0aC1yb3V0ZS1zcGVjXCJcbmV4cG9ydCB7IHdyYXBwZXJzIH0gZnJvbSBcIi4vd3JhcHBlcnNcIlxuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIlxuIiwgImltcG9ydCB7IE5leHRBcGlSZXNwb25zZSwgTmV4dEFwaVJlcXVlc3QgfSBmcm9tIFwibmV4dFwiXG5pbXBvcnQgeyB3aXRoRXhjZXB0aW9uSGFuZGxpbmcgfSBmcm9tIFwiLi4vbmV4dGpzLWV4Y2VwdGlvbi1taWRkbGV3YXJlXCJcbmltcG9ydCB3cmFwcGVycywgeyBNaWRkbGV3YXJlIH0gZnJvbSBcIi4uL3dyYXBwZXJzXCJcbmltcG9ydCB7XG4gIENyZWF0ZVdpdGhSb3V0ZVNwZWNGdW5jdGlvbixcbiAgUXVlcnlBcnJheUZvcm1hdHMsXG4gIFJvdXRlU3BlYyxcbn0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCB3aXRoTWV0aG9kcywgeyBIVFRQTWV0aG9kcyB9IGZyb20gXCIuL21pZGRsZXdhcmVzL3dpdGgtbWV0aG9kc1wiXG5pbXBvcnQgd2l0aFZhbGlkYXRpb24gZnJvbSBcIi4vbWlkZGxld2FyZXMvd2l0aC12YWxpZGF0aW9uXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7XG4gIEF1dGhNZXRob2REb2VzTm90QXBwbHlFeGNlcHRpb24sXG4gIFVuYXV0aG9yaXplZEV4Y2VwdGlvbixcbn0gZnJvbSBcIi4uL25leHRqcy1leGNlcHRpb24tbWlkZGxld2FyZVwiXG5cbi8vIFBhcmFtRGVmIHR5cGUgY29tcGF0aWJsZSB3aXRoIGJvdGggWm9kIDMgYW5kIFpvZCA0XG50eXBlIFBhcmFtRGVmID0gei5ab2RUeXBlQW55XG5cbmV4cG9ydCBjb25zdCBjaGVja1JvdXRlU3BlYyA9IDxcbiAgQXV0aFR5cGUgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIE1ldGhvZHMgZXh0ZW5kcyBIVFRQTWV0aG9kc1tdID0gSFRUUE1ldGhvZHNbXSxcbiAgSnNvbkJvZHkgZXh0ZW5kcyBQYXJhbURlZiA9IHouWm9kVHlwZUFueSxcbiAgUXVlcnlQYXJhbXMgZXh0ZW5kcyBQYXJhbURlZiA9IHouWm9kVHlwZUFueSxcbiAgQ29tbW9uUGFyYW1zIGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnksXG4gIE1pZGRsZXdhcmVzIGV4dGVuZHMgcmVhZG9ubHkgTWlkZGxld2FyZTxhbnksIGFueT5bXSA9IHJlYWRvbmx5IE1pZGRsZXdhcmU8XG4gICAgYW55LFxuICAgIGFueVxuICA+W10sXG4gIEZvcm1EYXRhIGV4dGVuZHMgUGFyYW1EZWYgPSB6LlpvZFR5cGVBbnksXG4gIFNwZWMgZXh0ZW5kcyBSb3V0ZVNwZWM8XG4gICAgQXV0aFR5cGUsXG4gICAgTWV0aG9kcyxcbiAgICBKc29uQm9keSxcbiAgICBRdWVyeVBhcmFtcyxcbiAgICBDb21tb25QYXJhbXMsXG4gICAgTWlkZGxld2FyZXMsXG4gICAgRm9ybURhdGFcbiAgPiA9IFJvdXRlU3BlYzxcbiAgICBBdXRoVHlwZSxcbiAgICBNZXRob2RzLFxuICAgIEpzb25Cb2R5LFxuICAgIFF1ZXJ5UGFyYW1zLFxuICAgIENvbW1vblBhcmFtcyxcbiAgICBNaWRkbGV3YXJlcyxcbiAgICBGb3JtRGF0YVxuICA+XG4+KFxuICBzcGVjOiBTcGVjXG4pOiBzdHJpbmcgZXh0ZW5kcyBTcGVjW1wiYXV0aFwiXVxuICA/IGB5b3VyIHJvdXRlIHNwZWMgaXMgdW5kZXJzcGVjaWZpZWQsIGFkZCBcImFzIGNvbnN0XCJgXG4gIDogU3BlYyA9PiBzcGVjIGFzIGFueVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BUlJBWV9GT1JNQVRTOiBRdWVyeUFycmF5Rm9ybWF0cyA9IFtcbiAgXCJicmFja2V0c1wiLFxuICBcImNvbW1hXCIsXG4gIFwicmVwZWF0XCIsXG5dXG5cbmV4cG9ydCBjb25zdCBjcmVhdGVXaXRoUm91dGVTcGVjOiBDcmVhdGVXaXRoUm91dGVTcGVjRnVuY3Rpb24gPSAoKFxuICBzZXR1cFBhcmFtc1xuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhdXRoTWlkZGxld2FyZU1hcCA9IHt9LFxuICAgIGdsb2JhbE1pZGRsZXdhcmVzID0gW10sXG4gICAgZ2xvYmFsTWlkZGxld2FyZXNBZnRlckF1dGggPSBbXSxcbiAgICBzaG91bGRWYWxpZGF0ZVJlc3BvbnNlcyxcbiAgICBzaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5ID0gdHJ1ZSxcbiAgICBleGNlcHRpb25IYW5kbGluZ01pZGRsZXdhcmUgPSB3aXRoRXhjZXB0aW9uSGFuZGxpbmcoe1xuICAgICAgYWRkT2tTdGF0dXM6IHNldHVwUGFyYW1zLmFkZE9rU3RhdHVzLFxuICAgICAgZXhjZXB0aW9uSGFuZGxpbmdPcHRpb25zOiB7XG4gICAgICAgIGdldEVycm9yQ29udGV4dDogKHJlcSwgZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4ge31cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZXJyb3JcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSkgYXMgYW55LFxuICAgIGdsb2JhbFNjaGVtYXMgPSBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1c1xuICAgICAgPyB7XG4gICAgICAgICAgb2s6IHouYm9vbGVhbigpLFxuICAgICAgICB9XG4gICAgICA6IHt9LFxuICAgIHN1cHBvcnRlZEFycmF5Rm9ybWF0cyA9IERFRkFVTFRfQVJSQVlfRk9STUFUUyxcbiAgICBvbk11bHRpcGxlQXV0aE1pZGRsZXdhcmVGYWlsdXJlcyxcbiAgICBtYXhEdXJhdGlvbjogZ2xvYmFsTWF4RHVyYXRpb24sXG4gIH0gPSBzZXR1cFBhcmFtc1xuXG4gIGNvbnN0IHdpdGhSb3V0ZVNwZWMgPSAoc3BlYzogUm91dGVTcGVjKSA9PiB7XG4gICAgY29uc3QgY3JlYXRlUm91dGVFeHBvcnQgPSAodXNlckRlZmluZWRSb3V0ZUZuKSA9PiB7XG4gICAgICBjb25zdCByb290UmVxdWVzdEhhbmRsZXIgPSBhc3luYyAoXG4gICAgICAgIHJlcTogTmV4dEFwaVJlcXVlc3QsXG4gICAgICAgIHJlczogTmV4dEFwaVJlc3BvbnNlXG4gICAgICApID0+IHtcbiAgICAgICAgYXV0aE1pZGRsZXdhcmVNYXBbXCJub25lXCJdID0gKG5leHQpID0+IG5leHRcblxuICAgICAgICBjb25zdCBhdXRoTWlkZGxld2FyZXMgPSAoXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShzcGVjLmF1dGgpID8gc3BlYy5hdXRoIDogW3NwZWMuYXV0aF1cbiAgICAgICAgKS5tYXAoKGF1dGhUeXBlKSA9PiBbYXV0aFR5cGUsIGF1dGhNaWRkbGV3YXJlTWFwW2F1dGhUeXBlXV0gYXMgY29uc3QpXG4gICAgICAgIGNvbnN0IHVuZGVmaW5lZEF1dGhUeXBlID0gYXV0aE1pZGRsZXdhcmVzLmZpbmQoKFssIG13XSkgPT4gIW13KVxuICAgICAgICBpZiAodW5kZWZpbmVkQXV0aFR5cGUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGF1dGggdHlwZTogJHt1bmRlZmluZWRBdXRoVHlwZX1gKVxuXG4gICAgICAgIGNvbnN0IGZpcnN0QXV0aE1pZGRsZXdhcmVUaGF0U3VjY2VlZHMgPSAobmV4dCkgPT4gYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlTXVsdGlwbGVBdXRoTWlkZGxld2FyZUZhaWx1cmVzID1cbiAgICAgICAgICAgIHNwZWMub25NdWx0aXBsZUF1dGhNaWRkbGV3YXJlRmFpbHVyZXMgPz9cbiAgICAgICAgICAgIG9uTXVsdGlwbGVBdXRoTWlkZGxld2FyZUZhaWx1cmVzXG5cbiAgICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBtaWRkbGV3YXJlXSBvZiBhdXRoTWlkZGxld2FyZXMpIHtcbiAgICAgICAgICAgIGxldCBkaWRBdXRoTWlkZGxld2FyZVRocm93ID0gdHJ1ZVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IG1pZGRsZXdhcmUoKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgZXJyb3JzIHVucmVsYXRlZCB0byBhdXRoIHRocm93biBieSBidWlsdC1pbiBtaWRkbGV3YXJlICh3aXRoTWV0aG9kcywgd2l0aFZhbGlkYXRpb24pIHdpbGwgYmUgY2F1Z2h0IGhlcmVcbiAgICAgICAgICAgICAgICBkaWRBdXRoTWlkZGxld2FyZVRocm93ID0gZmFsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCguLi5hcmdzKVxuICAgICAgICAgICAgICB9KShyZXEsIHJlcylcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXV0aE1ldGhvZERvZXNOb3RBcHBseUV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZXJyb3Iuc291cmNlX21pZGRsZXdhcmUgPSBuYW1lXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBoYW5kbGVNdWx0aXBsZUF1dGhNaWRkbGV3YXJlRmFpbHVyZXMgJiZcbiAgICAgICAgICAgICAgICBkaWRBdXRoTWlkZGxld2FyZVRocm93XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGhhbmRsZU11bHRpcGxlQXV0aE1pZGRsZXdhcmVGYWlsdXJlcyhbZXJyb3JdKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBVbmF1dGhvcml6ZWRFeGNlcHRpb24oe1xuICAgICAgICAgICAgdHlwZTogXCJ1bmF1dGhvcml6ZWRcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IFwiTm8gYXV0aGVudGljYXRpb24gbWV0aG9kcyBzdWNjZWVkZWRcIixcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdyYXBwZXJzKFxuICAgICAgICAgIC4uLigoZXhjZXB0aW9uSGFuZGxpbmdNaWRkbGV3YXJlXG4gICAgICAgICAgICA/IFtleGNlcHRpb25IYW5kbGluZ01pZGRsZXdhcmVdXG4gICAgICAgICAgICA6IFtdKSBhcyBbYW55XSksXG4gICAgICAgICAgLi4uKChnbG9iYWxNaWRkbGV3YXJlcyB8fCBbXSkgYXMgW10pLFxuICAgICAgICAgIGZpcnN0QXV0aE1pZGRsZXdhcmVUaGF0U3VjY2VlZHMsXG4gICAgICAgICAgLi4uKChnbG9iYWxNaWRkbGV3YXJlc0FmdGVyQXV0aCB8fCBbXSkgYXMgW10pLFxuICAgICAgICAgIC4uLigoc3BlYy5taWRkbGV3YXJlcyB8fCBbXSkgYXMgW10pLFxuICAgICAgICAgIHdpdGhNZXRob2RzKHNwZWMubWV0aG9kcyksXG4gICAgICAgICAgd2l0aFZhbGlkYXRpb24oe1xuICAgICAgICAgICAganNvbkJvZHk6IHNwZWMuanNvbkJvZHksXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogc3BlYy5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIGNvbW1vblBhcmFtczogc3BlYy5jb21tb25QYXJhbXMsXG4gICAgICAgICAgICBmb3JtRGF0YTogc3BlYy5mb3JtRGF0YSxcbiAgICAgICAgICAgIGpzb25SZXNwb25zZTogc3BlYy5qc29uUmVzcG9uc2UsXG4gICAgICAgICAgICBzaG91bGRWYWxpZGF0ZVJlc3BvbnNlcyxcbiAgICAgICAgICAgIHNob3VsZFZhbGlkYXRlR2V0UmVxdWVzdEJvZHksXG4gICAgICAgICAgICBzdXBwb3J0ZWRBcnJheUZvcm1hdHMsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdXNlckRlZmluZWRSb3V0ZUZuXG4gICAgICAgICkocmVxIGFzIGFueSwgcmVzKVxuICAgICAgfVxuXG4gICAgICByb290UmVxdWVzdEhhbmRsZXIuX3NldHVwUGFyYW1zID0gc2V0dXBQYXJhbXNcbiAgICAgIHJvb3RSZXF1ZXN0SGFuZGxlci5fcm91dGVTcGVjID0gc3BlY1xuXG4gICAgICAvLyBFeHBvcnQgbWF4RHVyYXRpb24gYXMgYSBOZXh0LmpzIHJvdXRlIHNlZ21lbnQgY29uZmlnXG4gICAgICBjb25zdCBtYXhEdXJhdGlvbiA9IHNwZWMubWF4RHVyYXRpb24gPz8gZ2xvYmFsTWF4RHVyYXRpb25cbiAgICAgIGlmIChtYXhEdXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJvb3RSZXF1ZXN0SGFuZGxlci5tYXhEdXJhdGlvbiA9IG1heER1cmF0aW9uXG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb290UmVxdWVzdEhhbmRsZXJcbiAgICB9XG5cbiAgICBjcmVhdGVSb3V0ZUV4cG9ydC5fc2V0dXBQYXJhbXMgPSBzZXR1cFBhcmFtc1xuICAgIGNyZWF0ZVJvdXRlRXhwb3J0Ll9yb3V0ZVNwZWMgPSBzcGVjXG5cbiAgICByZXR1cm4gY3JlYXRlUm91dGVFeHBvcnRcbiAgfVxuXG4gIHdpdGhSb3V0ZVNwZWMuX3NldHVwUGFyYW1zID0gc2V0dXBQYXJhbXNcblxuICByZXR1cm4gd2l0aFJvdXRlU3BlY1xufSkgYXMgYW55XG4iLCAiaW1wb3J0IHR5cGUgeyBOZXh0QXBpUmVxdWVzdCBhcyBSZXEsIE5leHRBcGlSZXNwb25zZSBhcyBSZXMgfSBmcm9tIFwibmV4dFwiXG4vKlxuXG5XcmFwcyBhIGZ1bmN0aW9uIGluIGxheWVycyBvZiBvdGhlciBmdW5jdGlvbnMsIHdoaWxlIHByZXNlcnZpbmcgdGhlIGlucHV0L291dHB1dFxudHlwZS4gVGhlIG91dHB1dCBvZiB3cmFwcGVycyB3aWxsIGFsd2F5cyBoYXZlIHRoZSB0eXBlIG9mIGl0J3MgbGFzdCBwYXJhbWV0ZXJcbih0aGUgd3JhcHBlZCBmdW5jdGlvbilcblxuVGhpcyBmdW5jdGlvbiB0dXJucyB0aGlzIHR5cGUgb2YgY29tcG9zaXRpb24uLi5cblxubG9nZ2VyLndpdGhDb250ZXh0KFwic29tZWNvbnRleHRcIikoXG4gIGFzeW5jIChhLCBiKSA9PiB7XG4gICAgcmV0dXJuIGFcbiAgfVxuKVxuXG5JbnRvLi4uXG5cbndyYXBwZXJzKFxuICBsb2dnZXIud2l0aENvbnRleHQoXCJzb21lY29udGV4dFwiKSxcbiAgYXN5bmMgKGEsIGIpID0+IHtcbiAgICByZXR1cm4gYVxuICB9XG4pXG5cbkhhdmluZyB0aGlzIGFzIGEgdXRpbGl0eSBtZXRob2QgaGVscHMgcHJlc2VydmUgdHlwZXMsIHdoaWNoIG90aGVyd2lzZSBjYW4gZ2V0XG5tZXNzZWQgdXAgYnkgdGhlIG1pZGRsZXdhcmVzLiBJdCBhbHNvIGNhbiBtYWtlIHRoZSBjb2RlIGNsZWFuZXIgd2hlcmUgdGhlcmUgYXJlXG5tdWx0aXBsZSB3cmFwcGVycy5cblxuIyMgRVhBTVBMRVNcblxuSW4gdGhlIGNvbnRleHQgb2YgcmVxdWVzdCBtaWRkbGV3YXJlIHlvdSBtaWdodCB3cml0ZSBzb21ldGhpbmcgbGlrZSB0aGlzLi4uXG5cbmNvbnN0IHdpdGhSZXF1ZXN0TG9nZ2luZ01pZGRsZXdhcmUgPSAobmV4dCkgPT4gYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gIGNvbnNvbGUubG9nKGBHT1QgUkVRVUVTVCAke3JlcS5tZXRob2R9ICR7cmVxLnBhdGh9YClcbiAgcmV0dXJuIG5leHQocmVxLCByZXMpXG59XG5cbkhlcmUncyBhbiBleGFtcGxlIG9mIGEgd3JhcHBlciB0aGF0IHRha2VzIHNvbWUgcGFyYW1ldGVycy4uLlxuXG5jb25zdCB3aXRoTG9nZ2VkQXJndW1lbnRzID1cbiAgICAobG9nUHJlZml4OiBzdHJpbmcpID0+XG4gICAgKG5leHQpID0+XG4gICAgYXN5bmMgKC4uLmZ1bmNBcmdzKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhsb2dQcmVmaXgsIC4uLmZ1bmNBcmdzKVxuICAgICAgcmV0dXJuIG5leHQoLi4uZnVuY0FyZ3MpXG4gICAgfVxuXG4qL1xuXG5leHBvcnQgdHlwZSBNaWRkbGV3YXJlPFQsIERlcCA9IHt9PiA9IChcbiAgbmV4dDogKHJlcTogUmVxICYgRGVwICYgVCwgcmVzOiBSZXMpID0+IGFueVxuKSA9PiAocmVxOiBSZXEgJiBEZXAgJiBULCByZXM6IFJlcykgPT4gYW55XG5cbi8vIFNhZmVyIE1pZGRsZXdhcmUgcmVxdWlyZXMgdGhlIHVzZSBvZiBleHRlbmRSZXF1ZXN0IHRvIGVuc3VyZSB0aGF0IHRoZVxuLy8gbmV3IGNvbnRleHQgKFQpIHdhcyBhY3R1YWxseSBhZGRlZCB0byB0aGUgcmVxdWVzdC4gSXQncyBraW5kIG9mIGFubm95aW5nXG4vLyB0byB1c2UgaW4gcHJhY3RpY2UsIHNvIHdlIGRvbid0IHVzZSBpdCBmb3Igb3VyIFdyYXBwZXJzICh5ZXQpXG5leHBvcnQgdHlwZSBTYWZlck1pZGRsZXdhcmU8VCwgRGVwID0ge30+ID0gKFxuICBuZXh0OiAocmVxOiBSZXEgJiBEZXAgJiBULCByZXM6IFJlcykgPT4gYW55XG4pID0+IChyZXE6IFJlcSAmIERlcCwgcmVzOiBSZXMpID0+IGFueVxuXG5leHBvcnQgY29uc3QgZXh0ZW5kUmVxdWVzdCA9IDxUIGV4dGVuZHMgUmVxLCBLIGV4dGVuZHMge30+KFxuICByZXE6IFQsXG4gIG1lcmdlOiBLXG4pOiBUICYgSyA9PiB7XG4gIGZvciAoY29uc3QgW2tleSwgdl0gb2YgT2JqZWN0LmVudHJpZXMobWVyZ2UpKSB7XG4gICAgOyhyZXEgYXMgYW55KVtrZXldID0gdlxuICB9XG4gIHJldHVybiByZXEgYXMgYW55XG59XG5cbnR5cGUgV3JhcHBlcnMxID0gPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIGVuZHBvaW50OiAocmVxOiBSZXEgJiBNdzFSZXF1ZXN0Q29udGV4dCwgcmVzOiBSZXMpID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxudHlwZSBXcmFwcGVyczIgPSA8XG4gIE13MVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXcyRGVwLFxuICBNdzFEZXAsXG4gIE13MlJlcXVlc3RDb250ZXh0LFxuICBNdzJEZXBcbj4oXG4gIG13MTogTWlkZGxld2FyZTxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPixcbiAgbXcyOiBNaWRkbGV3YXJlPE13MlJlcXVlc3RDb250ZXh0LCBNdzJEZXA+LFxuICBlbmRwb2ludDogKHJlcTogUmVxICYgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCwgcmVzOiBSZXMpID0+IGFueVxuKSA9PiAocmVxOiBSZXEsIHJlczogUmVzKSA9PiBhbnlcblxuLy8gVE9ETyBmaWd1cmUgb3V0IGhvdyB0byBkbyBhIHJlY3Vyc2l2ZSBkZWZpbml0aW9uLCBvciBvbmUgdGhhdCBzaW1wbGlmaWVzXG4vLyB0aGVzZSByZWR1bmRhbnQgd3JhcHBlcnNcblxudHlwZSBXcmFwcGVyczMgPSA8XG4gIE13MVJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXcyRGVwLFxuICBNdzFEZXAsXG4gIE13MlJlcXVlc3RDb250ZXh0LFxuICBNdzJEZXAsXG4gIE13M1JlcXVlc3RDb250ZXh0LFxuICBNdzNEZXBcbj4oXG4gIG13MTogTWlkZGxld2FyZTxNdzFSZXF1ZXN0Q29udGV4dCwgTXcxRGVwPixcbiAgbXcyOiBNaWRkbGV3YXJlPE13MlJlcXVlc3RDb250ZXh0LCBNdzJEZXA+LFxuICBtdzM6IE1pZGRsZXdhcmU8XG4gICAgTXczUmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13M0RlcCA/IE13M0RlcCA6IG5ldmVyXG4gID4sXG4gIGVuZHBvaW50OiAoXG4gICAgcmVxOiBSZXEgJiBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0ICYgTXczUmVxdWVzdENvbnRleHQsXG4gICAgcmVzOiBSZXNcbiAgKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxLCByZXM6IFJlcykgPT4gYW55XG5cbnR5cGUgV3JhcHBlcnM0ID0gPFxuICBNdzFSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13MkRlcCxcbiAgTXcxRGVwLFxuICBNdzJSZXF1ZXN0Q29udGV4dCxcbiAgTXcyRGVwLFxuICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgTXczRGVwLFxuICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgTXc0RGVwXG4+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIG13MjogTWlkZGxld2FyZTxNdzJSZXF1ZXN0Q29udGV4dCwgTXcyRGVwPixcbiAgbXczOiBNaWRkbGV3YXJlPFxuICAgIE13M1JlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzNEZXAgPyBNdzNEZXAgOiBuZXZlclxuICA+LFxuICBtdzQ6IE1pZGRsZXdhcmU8XG4gICAgTXc0UmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCAmIE13M1JlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc0RGVwXG4gICAgICA/IE13NERlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICZcbiAgICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzNSA9IDxcbiAgTXcxUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzJEZXAsXG4gIE13MURlcCxcbiAgTXcyUmVxdWVzdENvbnRleHQsXG4gIE13MkRlcCxcbiAgTXczUmVxdWVzdENvbnRleHQsXG4gIE13M0RlcCxcbiAgTXc0UmVxdWVzdENvbnRleHQsXG4gIE13NERlcCxcbiAgTXc1UmVxdWVzdENvbnRleHQsXG4gIE13NURlcFxuPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBtdzI6IE1pZGRsZXdhcmU8TXcyUmVxdWVzdENvbnRleHQsIE13MkRlcD4sXG4gIG13MzogTWlkZGxld2FyZTxcbiAgICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXczRGVwID8gTXczRGVwIDogbmV2ZXJcbiAgPixcbiAgbXc0OiBNaWRkbGV3YXJlPFxuICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgJiBNdzNSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NERlcFxuICAgICAgPyBNdzREZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc1OiBNaWRkbGV3YXJlPFxuICAgIE13NVJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc1RGVwXG4gICAgICA/IE13NURlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICZcbiAgICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzNiA9IDxcbiAgTXcxUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzJEZXAsXG4gIE13MURlcCxcbiAgTXcyUmVxdWVzdENvbnRleHQsXG4gIE13MkRlcCxcbiAgTXczUmVxdWVzdENvbnRleHQsXG4gIE13M0RlcCxcbiAgTXc0UmVxdWVzdENvbnRleHQsXG4gIE13NERlcCxcbiAgTXc1UmVxdWVzdENvbnRleHQsXG4gIE13NURlcCxcbiAgTXc2UmVxdWVzdENvbnRleHQsXG4gIE13NkRlcFxuPihcbiAgbXcxOiBNaWRkbGV3YXJlPE13MVJlcXVlc3RDb250ZXh0LCBNdzFEZXA+LFxuICBtdzI6IE1pZGRsZXdhcmU8TXcyUmVxdWVzdENvbnRleHQsIE13MkRlcD4sXG4gIG13MzogTWlkZGxld2FyZTxcbiAgICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmIE13MlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXczRGVwID8gTXczRGVwIDogbmV2ZXJcbiAgPixcbiAgbXc0OiBNaWRkbGV3YXJlPFxuICAgIE13NFJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgJiBNdzNSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NERlcFxuICAgICAgPyBNdzREZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc1OiBNaWRkbGV3YXJlPFxuICAgIE13NVJlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc1RGVwXG4gICAgICA/IE13NURlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBtdzY6IE1pZGRsZXdhcmU8XG4gICAgTXc2UmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXcyUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXczUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc0UmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc1UmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzZEZXBcbiAgICAgID8gTXc2RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIGVuZHBvaW50OiAoXG4gICAgcmVxOiBSZXEgJlxuICAgICAgTXcxUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXcyUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXczUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc0UmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc1UmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc2UmVxdWVzdENvbnRleHQsXG4gICAgcmVzOiBSZXNcbiAgKSA9PiBhbnlcbikgPT4gKHJlcTogUmVxLCByZXM6IFJlcykgPT4gYW55XG5cbnR5cGUgV3JhcHBlcnM3ID0gPFxuICBNdzFSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13MkRlcCxcbiAgTXcxRGVwLFxuICBNdzJSZXF1ZXN0Q29udGV4dCxcbiAgTXcyRGVwLFxuICBNdzNSZXF1ZXN0Q29udGV4dCxcbiAgTXczRGVwLFxuICBNdzRSZXF1ZXN0Q29udGV4dCxcbiAgTXc0RGVwLFxuICBNdzVSZXF1ZXN0Q29udGV4dCxcbiAgTXc1RGVwLFxuICBNdzZSZXF1ZXN0Q29udGV4dCxcbiAgTXc2RGVwLFxuICBNdzdSZXF1ZXN0Q29udGV4dCxcbiAgTXc3RGVwXG4+KFxuICBtdzE6IE1pZGRsZXdhcmU8TXcxUmVxdWVzdENvbnRleHQsIE13MURlcD4sXG4gIG13MjogTWlkZGxld2FyZTxNdzJSZXF1ZXN0Q29udGV4dCwgTXcyRGVwPixcbiAgbXczOiBNaWRkbGV3YXJlPFxuICAgIE13M1JlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICYgTXcyUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzNEZXAgPyBNdzNEZXAgOiBuZXZlclxuICA+LFxuICBtdzQ6IE1pZGRsZXdhcmU8XG4gICAgTXc0UmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJiBNdzJSZXF1ZXN0Q29udGV4dCAmIE13M1JlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc0RGVwXG4gICAgICA/IE13NERlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBtdzU6IE1pZGRsZXdhcmU8XG4gICAgTXc1UmVxdWVzdENvbnRleHQsXG4gICAgTXcxUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXcyUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXczUmVxdWVzdENvbnRleHQgJlxuICAgICAgTXc0UmVxdWVzdENvbnRleHQgZXh0ZW5kcyBNdzVEZXBcbiAgICAgID8gTXc1RGVwXG4gICAgICA6IG5ldmVyXG4gID4sXG4gIG13NjogTWlkZGxld2FyZTxcbiAgICBNdzZSZXF1ZXN0Q29udGV4dCxcbiAgICBNdzFSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzJSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzNSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzRSZXF1ZXN0Q29udGV4dCAmXG4gICAgICBNdzVSZXF1ZXN0Q29udGV4dCBleHRlbmRzIE13NkRlcFxuICAgICAgPyBNdzZEZXBcbiAgICAgIDogbmV2ZXJcbiAgPixcbiAgbXc3OiBNaWRkbGV3YXJlPFxuICAgIE13N1JlcXVlc3RDb250ZXh0LFxuICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NlJlcXVlc3RDb250ZXh0IGV4dGVuZHMgTXc3RGVwXG4gICAgICA/IE13N0RlcFxuICAgICAgOiBuZXZlclxuICA+LFxuICBlbmRwb2ludDogKFxuICAgIHJlcTogUmVxICZcbiAgICAgIE13MVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13MlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13M1JlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NFJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NVJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13NlJlcXVlc3RDb250ZXh0ICZcbiAgICAgIE13N1JlcXVlc3RDb250ZXh0LFxuICAgIHJlczogUmVzXG4gICkgPT4gYW55XG4pID0+IChyZXE6IFJlcSwgcmVzOiBSZXMpID0+IGFueVxuXG50eXBlIFdyYXBwZXJzID0gV3JhcHBlcnMxICZcbiAgV3JhcHBlcnMyICZcbiAgV3JhcHBlcnMzICZcbiAgV3JhcHBlcnM0ICZcbiAgV3JhcHBlcnM1ICZcbiAgV3JhcHBlcnM2ICZcbiAgV3JhcHBlcnM3XG5cbmV4cG9ydCBjb25zdCB3cmFwcGVyczogV3JhcHBlcnMgPSAoLi4ud3JhcHBlcnNBcmdzOiBhbnlbXSkgPT4ge1xuICBjb25zdCB3cmFwcGVkRnVuY3Rpb24gPSB3cmFwcGVyc0FyZ3Nbd3JhcHBlcnNBcmdzLmxlbmd0aCAtIDFdXG4gIGNvbnN0IG13cyA9IHdyYXBwZXJzQXJncy5zbGljZSgwLCAtMSlcblxuICBsZXQgbGFzdFdyYXBwZWRGdW5jdGlvbiA9IHdyYXBwZWRGdW5jdGlvblxuICBmb3IgKGxldCBpID0gbXdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGFzdFdyYXBwZWRGdW5jdGlvbiA9IChtd3NbaV0gYXMgYW55KShsYXN0V3JhcHBlZEZ1bmN0aW9uKVxuICB9XG5cbiAgcmV0dXJuIGxhc3RXcmFwcGVkRnVuY3Rpb25cbn1cblxuZXhwb3J0IGRlZmF1bHQgd3JhcHBlcnNcbiIsICJpbXBvcnQgeyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uIH0gZnJvbSBcIi4uLy4uL25leHRqcy1leGNlcHRpb24tbWlkZGxld2FyZVwiXG5cbmV4cG9ydCB0eXBlIEhUVFBNZXRob2RzID1cbiAgfCBcIkdFVFwiXG4gIHwgXCJQT1NUXCJcbiAgfCBcIkRFTEVURVwiXG4gIHwgXCJQVVRcIlxuICB8IFwiUEFUQ0hcIlxuICB8IFwiSEVBRFwiXG4gIHwgXCJPUFRJT05TXCJcblxuZXhwb3J0IGNvbnN0IHdpdGhNZXRob2RzID0gKG1ldGhvZHM6IEhUVFBNZXRob2RzW10pID0+IChuZXh0KSA9PiAocmVxLCByZXMpID0+IHtcbiAgaWYgKCFtZXRob2RzLmluY2x1ZGVzKHJlcS5tZXRob2QpKSB7XG4gICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oe1xuICAgICAgdHlwZTogXCJtZXRob2Rfbm90X2FsbG93ZWRcIixcbiAgICAgIG1lc3NhZ2U6IGBvbmx5ICR7bWV0aG9kcy5qb2luKFwiLFwiKX0gYWNjZXB0ZWRgLFxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIG5leHQocmVxLCByZXMpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhNZXRob2RzXG4iLCAiaW1wb3J0IHR5cGUgeyBOZXh0QXBpUmVxdWVzdCwgTmV4dEFwaVJlc3BvbnNlIH0gZnJvbSBcIm5leHRcIlxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiXG5cbmltcG9ydCB7XG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCIuLi8uLi9uZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuaW1wb3J0IHsgUXVlcnlBcnJheUZvcm1hdHMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIlxuaW1wb3J0IHsgREVGQVVMVF9BUlJBWV9GT1JNQVRTIH0gZnJvbSBcIi4uXCJcbmltcG9ydCB7XG4gIGdldFR5cGVOYW1lLFxuICBnZXRFZmZlY3RzU2NoZW1hLFxuICBnZXRJbm5lclR5cGUsXG59IGZyb20gXCIuLi8uLi9saWIvem9kLWNvbXBhdFwiXG5cbmNvbnN0IGdldFpvZE9iamVjdFNjaGVtYUZyb21ab2RFZmZlY3RTY2hlbWEgPSAoXG4gIGlzWm9kRWZmZWN0OiBib29sZWFuLFxuICBzY2hlbWE6IHouWm9kVHlwZUFueVxuKTogei5ab2RUeXBlQW55IHwgei5ab2RPYmplY3Q8YW55PiA9PiB7XG4gIGlmICghaXNab2RFZmZlY3QpIHtcbiAgICByZXR1cm4gc2NoZW1hIGFzIHouWm9kT2JqZWN0PGFueT5cbiAgfVxuXG4gIGxldCBjdXJyZW50U2NoZW1hID0gc2NoZW1hXG5cbiAgd2hpbGUgKGdldFR5cGVOYW1lKGN1cnJlbnRTY2hlbWEpID09PSBcIlpvZEVmZmVjdHNcIikge1xuICAgIGNvbnN0IGlubmVyU2NoZW1hID0gZ2V0RWZmZWN0c1NjaGVtYShjdXJyZW50U2NoZW1hKVxuICAgIGlmICghaW5uZXJTY2hlbWEpIGJyZWFrXG4gICAgY3VycmVudFNjaGVtYSA9IGlubmVyU2NoZW1hXG4gIH1cblxuICByZXR1cm4gY3VycmVudFNjaGVtYSBhcyB6LlpvZE9iamVjdDxhbnk+XG59XG5cbmNvbnN0IHRyeUdldFpvZFNjaGVtYUFzT2JqZWN0ID0gKFxuICBzY2hlbWE6IHouWm9kVHlwZUFueVxuKTogei5ab2RPYmplY3Q8YW55PiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGlzWm9kRWZmZWN0ID0gZ2V0VHlwZU5hbWUoc2NoZW1hKSA9PT0gXCJab2RFZmZlY3RzXCJcbiAgY29uc3Qgc2FmZV9zY2hlbWEgPSBnZXRab2RPYmplY3RTY2hlbWFGcm9tWm9kRWZmZWN0U2NoZW1hKGlzWm9kRWZmZWN0LCBzY2hlbWEpXG4gIGNvbnN0IGlzWm9kT2JqZWN0ID0gZ2V0VHlwZU5hbWUoc2FmZV9zY2hlbWEpID09PSBcIlpvZE9iamVjdFwiXG5cbiAgaWYgKCFpc1pvZE9iamVjdCkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHJldHVybiBzYWZlX3NjaGVtYSBhcyB6LlpvZE9iamVjdDxhbnk+XG59XG5cbmNvbnN0IHVud3JhcFpvZFNjaGVtYSA9IChzY2hlbWE6IHouWm9kVHlwZUFueSk6IHouWm9kVHlwZUFueSA9PiB7XG4gIGNvbnN0IHNwZWNpYWxfem9kX3R5cGVzID0gW1wiWm9kT3B0aW9uYWxcIiwgXCJab2REZWZhdWx0XCIsIFwiWm9kRWZmZWN0c1wiXVxuXG4gIHdoaWxlIChzcGVjaWFsX3pvZF90eXBlcy5pbmNsdWRlcyhnZXRUeXBlTmFtZShzY2hlbWEpKSkge1xuICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0VHlwZU5hbWUoc2NoZW1hKVxuICAgIGlmICh0eXBlTmFtZSA9PT0gXCJab2RPcHRpb25hbFwiIHx8IHR5cGVOYW1lID09PSBcIlpvZERlZmF1bHRcIikge1xuICAgICAgY29uc3QgaW5uZXIgPSBnZXRJbm5lclR5cGUoc2NoZW1hKVxuICAgICAgaWYgKCFpbm5lcikgYnJlYWtcbiAgICAgIHNjaGVtYSA9IGlubmVyXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmICh0eXBlTmFtZSA9PT0gXCJab2RFZmZlY3RzXCIpIHtcbiAgICAgIGNvbnN0IGlubmVyID0gZ2V0RWZmZWN0c1NjaGVtYShzY2hlbWEpXG4gICAgICBpZiAoIWlubmVyKSBicmVha1xuICAgICAgc2NoZW1hID0gaW5uZXJcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBzY2hlbWFcbn1cblxuY29uc3QgaXNab2RTY2hlbWFBcnJheSA9IChzY2hlbWE6IHouWm9kVHlwZUFueSkgPT4ge1xuICBjb25zdCB1bndyYXBwZWQgPSB1bndyYXBab2RTY2hlbWEoc2NoZW1hKVxuICByZXR1cm4gZ2V0VHlwZU5hbWUodW53cmFwcGVkKSA9PT0gXCJab2RBcnJheVwiXG59XG5cbmNvbnN0IGlzWm9kU2NoZW1hQm9vbGVhbiA9IChzY2hlbWE6IHouWm9kVHlwZUFueSkgPT4ge1xuICBjb25zdCB1bndyYXBwZWQgPSB1bndyYXBab2RTY2hlbWEoc2NoZW1hKVxuICByZXR1cm4gZ2V0VHlwZU5hbWUodW53cmFwcGVkKSA9PT0gXCJab2RCb29sZWFuXCJcbn1cblxuY29uc3QgcGFyc2VRdWVyeVBhcmFtcyA9IChcbiAgc2NoZW1hOiB6LlpvZFR5cGVBbnksXG4gIGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzOiBRdWVyeUFycmF5Rm9ybWF0c1xuKSA9PiB7XG4gIGNvbnN0IHBhcnNlZF9pbnB1dCA9IE9iamVjdC5hc3NpZ24oe30sIGlucHV0KVxuICBjb25zdCBvYmpfc2NoZW1hID0gdHJ5R2V0Wm9kU2NoZW1hQXNPYmplY3Qoc2NoZW1hKVxuXG4gIGlmIChvYmpfc2NoZW1hKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqX3NjaGVtYS5zaGFwZSkpIHtcbiAgICAgIGlmIChpc1pvZFNjaGVtYUFycmF5KHZhbHVlIGFzIHouWm9kVHlwZUFueSkpIHtcbiAgICAgICAgY29uc3QgYXJyYXlfaW5wdXQgPSBpbnB1dFtrZXldXG5cbiAgICAgICAgaWYgKHR5cGVvZiBhcnJheV9pbnB1dCA9PT0gXCJzdHJpbmdcIiAmJiBhcnJheV9pbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBwYXJzZWRfaW5wdXRba2V5XSA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIGFycmF5X2lucHV0ID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgYXJyYXlfaW5wdXQubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHN1cHBvcnRlZEFycmF5Rm9ybWF0cy5pbmNsdWRlcyhcImNvbW1hXCIpXG4gICAgICAgICkge1xuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gYXJyYXlfaW5wdXQuc3BsaXQoXCIsXCIpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBicmFja2V0X3N5bnRheF9hcnJheV9pbnB1dCA9IGlucHV0W2Ake2tleX1bXWBdXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXQgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICBzdXBwb3J0ZWRBcnJheUZvcm1hdHMuaW5jbHVkZXMoXCJicmFja2V0c1wiKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwcmVfc3BsaXRfYXJyYXkgPSBicmFja2V0X3N5bnRheF9hcnJheV9pbnB1dFxuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gcHJlX3NwbGl0X2FycmF5LnNwbGl0KFwiLFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIEFycmF5LmlzQXJyYXkoYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXQpICYmXG4gICAgICAgICAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzLmluY2x1ZGVzKFwiYnJhY2tldHNcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgcGFyc2VkX2lucHV0W2tleV0gPSBicmFja2V0X3N5bnRheF9hcnJheV9pbnB1dFxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGlzWm9kU2NoZW1hQm9vbGVhbih2YWx1ZSBhcyB6LlpvZFR5cGVBbnkpKSB7XG4gICAgICAgIGNvbnN0IGJvb2xlYW5faW5wdXQgPSBpbnB1dFtrZXldXG5cbiAgICAgICAgaWYgKHR5cGVvZiBib29sZWFuX2lucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcGFyc2VkX2lucHV0W2tleV0gPSBib29sZWFuX2lucHV0ID09PSBcInRydWVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNjaGVtYS5wYXJzZShwYXJzZWRfaW5wdXQpXG59XG5cbmNvbnN0IHZhbGlkYXRlUXVlcnlQYXJhbXMgPSAoXG4gIGlucHV0VXJsOiBzdHJpbmcsXG4gIHNjaGVtYTogei5ab2RUeXBlQW55LFxuICBzdXBwb3J0ZWRBcnJheUZvcm1hdHM6IFF1ZXJ5QXJyYXlGb3JtYXRzXG4pID0+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChpbnB1dFVybCwgXCJodHRwOi8vZHVtbXkuY29tXCIpXG5cbiAgY29uc3Qgc2VlbktleXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIGNvbnN0IG9ial9zY2hlbWEgPSB0cnlHZXRab2RTY2hlbWFBc09iamVjdChzY2hlbWEpXG4gIGlmICghb2JqX3NjaGVtYSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgdXJsLnNlYXJjaFBhcmFtcy5rZXlzKCkpIHtcbiAgICBmb3IgKGNvbnN0IFtzY2hlbWFLZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmpfc2NoZW1hLnNoYXBlKSkge1xuICAgICAgaWYgKGlzWm9kU2NoZW1hQXJyYXkodmFsdWUgYXMgei5ab2RUeXBlQW55KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ID09PSBgJHtzY2hlbWFLZXl9W11gICYmXG4gICAgICAgICAgIXN1cHBvcnRlZEFycmF5Rm9ybWF0cy5pbmNsdWRlcyhcImJyYWNrZXRzXCIpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW52YWxpZF9xdWVyeV9wYXJhbXNcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBCcmFja2V0IHN5bnRheCBub3Qgc3VwcG9ydGVkIGZvciBxdWVyeSBwYXJhbSBcIiR7c2NoZW1hS2V5fVwiYCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qga2V5X3NjaGVtYSA9IG9ial9zY2hlbWEuc2hhcGVba2V5XVxuXG4gICAgaWYgKGtleV9zY2hlbWEpIHtcbiAgICAgIGlmIChpc1pvZFNjaGVtYUFycmF5KGtleV9zY2hlbWEpKSB7XG4gICAgICAgIGlmIChzZWVuS2V5cy5oYXMoa2V5KSAmJiAhc3VwcG9ydGVkQXJyYXlGb3JtYXRzLmluY2x1ZGVzKFwicmVwZWF0XCIpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oe1xuICAgICAgICAgICAgdHlwZTogXCJpbnZhbGlkX3F1ZXJ5X3BhcmFtc1wiLFxuICAgICAgICAgICAgbWVzc2FnZTogYFJlcGVhdGVkIHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZCBmb3IgZHVwbGljYXRlIHF1ZXJ5IHBhcmFtIFwiJHtrZXl9XCJgLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZWVuS2V5cy5hZGQoa2V5KVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdElucHV0PFxuICBKc29uQm9keSBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgUXVlcnlQYXJhbXMgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gIENvbW1vblBhcmFtcyBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgRm9ybURhdGEgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gIEpzb25SZXNwb25zZSBleHRlbmRzIHouWm9kVHlwZUFueVxuPiB7XG4gIGpzb25Cb2R5PzogSnNvbkJvZHlcbiAgcXVlcnlQYXJhbXM/OiBRdWVyeVBhcmFtc1xuICBjb21tb25QYXJhbXM/OiBDb21tb25QYXJhbXNcbiAgZm9ybURhdGE/OiBGb3JtRGF0YVxuICBqc29uUmVzcG9uc2U/OiBKc29uUmVzcG9uc2VcbiAgc2hvdWxkVmFsaWRhdGVSZXNwb25zZXM/OiBib29sZWFuXG4gIHNob3VsZFZhbGlkYXRlR2V0UmVxdWVzdEJvZHk/OiBib29sZWFuXG4gIHN1cHBvcnRlZEFycmF5Rm9ybWF0cz86IFF1ZXJ5QXJyYXlGb3JtYXRzXG59XG5cbmNvbnN0IHpvZElzc3VlVG9TdHJpbmcgPSAoaXNzdWU6IHouWm9kSXNzdWUpID0+IHtcbiAgaWYgKGlzc3VlLnBhdGguam9pbihcIi5cIikgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gaXNzdWUubWVzc2FnZVxuICB9XG4gIGlmIChpc3N1ZS5tZXNzYWdlID09PSBcIlJlcXVpcmVkXCIpIHtcbiAgICByZXR1cm4gYCR7aXNzdWUucGF0aC5qb2luKFwiLlwiKX0gaXMgcmVxdWlyZWRgXG4gIH1cbiAgcmV0dXJuIGAke2lzc3VlLm1lc3NhZ2V9IGZvciBcIiR7aXNzdWUucGF0aC5qb2luKFwiLlwiKX1cImBcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVKc29uUmVzcG9uc2U8SnNvblJlc3BvbnNlIGV4dGVuZHMgei5ab2RUeXBlQW55PihcbiAganNvblJlc3BvbnNlOiBKc29uUmVzcG9uc2UgfCB1bmRlZmluZWQsXG4gIHJlczogTmV4dEFwaVJlc3BvbnNlXG4pIHtcbiAgY29uc3Qgb3JpZ2luYWxfcmVzX2pzb24gPSByZXMuanNvblxuICBjb25zdCBvdmVycmlkZV9yZXNfanNvbiA9IChqc29uOiBhbnkpID0+IHtcbiAgICBjb25zdCBpc19zdWNjZXNzID0gcmVzLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlcy5zdGF0dXNDb2RlIDwgMzAwXG4gICAgaWYgKCFpc19zdWNjZXNzKSB7XG4gICAgICByZXR1cm4gb3JpZ2luYWxfcmVzX2pzb24oanNvbilcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAganNvblJlc3BvbnNlPy5wYXJzZShqc29uKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oe1xuICAgICAgICB0eXBlOiBcImludmFsaWRfcmVzcG9uc2VcIixcbiAgICAgICAgbWVzc2FnZTogXCJ0aGUgcmVzcG9uc2UgZG9lcyBub3QgbWF0Y2ggd2l0aCBqc29uUmVzcG9uc2VcIixcbiAgICAgICAgem9kRXJyb3I6IGVycixcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIG9yaWdpbmFsX3Jlc19qc29uKGpzb24pXG4gIH1cbiAgcmVzLmpzb24gPSBvdmVycmlkZV9yZXNfanNvblxufVxuXG5leHBvcnQgY29uc3Qgd2l0aFZhbGlkYXRpb24gPVxuICA8XG4gICAgSnNvbkJvZHkgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gICAgUXVlcnlQYXJhbXMgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gICAgQ29tbW9uUGFyYW1zIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICAgIEZvcm1EYXRhIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICAgIEpzb25SZXNwb25zZSBleHRlbmRzIHouWm9kVHlwZUFueVxuICA+KFxuICAgIGlucHV0OiBSZXF1ZXN0SW5wdXQ8XG4gICAgICBKc29uQm9keSxcbiAgICAgIFF1ZXJ5UGFyYW1zLFxuICAgICAgQ29tbW9uUGFyYW1zLFxuICAgICAgRm9ybURhdGEsXG4gICAgICBKc29uUmVzcG9uc2VcbiAgICA+XG4gICkgPT5cbiAgKG5leHQpID0+XG4gIGFzeW5jIChyZXE6IE5leHRBcGlSZXF1ZXN0LCByZXM6IE5leHRBcGlSZXNwb25zZSkgPT4ge1xuICAgIGNvbnN0IHsgc3VwcG9ydGVkQXJyYXlGb3JtYXRzID0gREVGQVVMVF9BUlJBWV9GT1JNQVRTIH0gPSBpbnB1dFxuXG4gICAgaWYgKFxuICAgICAgKGlucHV0LmZvcm1EYXRhICYmIGlucHV0Lmpzb25Cb2R5KSB8fFxuICAgICAgKGlucHV0LmZvcm1EYXRhICYmIGlucHV0LmNvbW1vblBhcmFtcylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgZm9ybURhdGEgd2l0aCBqc29uQm9keSBvciBjb21tb25QYXJhbXNcIilcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocmVxLm1ldGhvZCA9PT0gXCJQT1NUXCIgfHwgcmVxLm1ldGhvZCA9PT0gXCJQQVRDSFwiKSAmJlxuICAgICAgKGlucHV0Lmpzb25Cb2R5IHx8IGlucHV0LmNvbW1vblBhcmFtcykgJiZcbiAgICAgICFyZXEuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXT8uaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi9qc29uXCIpICYmXG4gICAgICAhXy5pc0VtcHR5KHJlcS5ib2R5KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oe1xuICAgICAgICB0eXBlOiBcImludmFsaWRfY29udGVudF90eXBlXCIsXG4gICAgICAgIG1lc3NhZ2U6IGAke3JlcS5tZXRob2R9IHJlcXVlc3RzIG11c3QgaGF2ZSBDb250ZW50LVR5cGUgaGVhZGVyIHdpdGggXCJhcHBsaWNhdGlvbi9qc29uXCJgLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBpbnB1dC5mb3JtRGF0YSAmJlxuICAgICAgcmVxLm1ldGhvZCAhPT0gXCJHRVRcIiAmJlxuICAgICAgIXJlcS5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdPy5pbmNsdWRlcyhcbiAgICAgICAgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIlxuICAgICAgKVxuICAgICAgLy8gVE9ETyBldmVudHVhbGx5IHdlIHNob3VsZCBzdXBwb3J0IG11bHRpcGFydC9mb3JtLWRhdGFcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnZhbGlkX2NvbnRlbnRfdHlwZVwiLFxuICAgICAgICBtZXNzYWdlOiBgTXVzdCBoYXZlIENvbnRlbnQtVHlwZSBoZWFkZXIgd2l0aCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiYCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsX2NvbWJpbmVkX3BhcmFtcyA9IHsgLi4ucmVxLnF1ZXJ5LCAuLi5yZXEuYm9keSB9XG5cbiAgICAgIGNvbnN0IHdpbGxWYWxpZGF0ZVJlcXVlc3RCb2R5ID0gaW5wdXQuc2hvdWxkVmFsaWRhdGVHZXRSZXF1ZXN0Qm9keVxuICAgICAgICA/IHRydWVcbiAgICAgICAgOiByZXEubWV0aG9kICE9PSBcIkdFVFwiICYmIHJlcS5tZXRob2QgIT09IFwiREVMRVRFXCJcblxuICAgICAgY29uc3QgaXNGb3JtRGF0YSA9IEJvb2xlYW4oaW5wdXQuZm9ybURhdGEpXG5cbiAgICAgIGlmIChpc0Zvcm1EYXRhICYmIHdpbGxWYWxpZGF0ZVJlcXVlc3RCb2R5KSB7XG4gICAgICAgIHJlcS5ib2R5ID0gaW5wdXQuZm9ybURhdGE/LnBhcnNlKHJlcS5ib2R5KVxuICAgICAgfVxuXG4gICAgICBpZiAoIWlzRm9ybURhdGEgJiYgd2lsbFZhbGlkYXRlUmVxdWVzdEJvZHkpIHtcbiAgICAgICAgcmVxLmJvZHkgPSBpbnB1dC5qc29uQm9keT8ucGFyc2UocmVxLmJvZHkpXG4gICAgICB9XG5cbiAgICAgIGlmIChpbnB1dC5xdWVyeVBhcmFtcykge1xuICAgICAgICBpZiAoIXJlcS51cmwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZXEudXJsIGlzIHVuZGVmaW5lZFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgdmFsaWRhdGVRdWVyeVBhcmFtcyhyZXEudXJsLCBpbnB1dC5xdWVyeVBhcmFtcywgc3VwcG9ydGVkQXJyYXlGb3JtYXRzKVxuXG4gICAgICAgIHJlcS5xdWVyeSA9IHBhcnNlUXVlcnlQYXJhbXMoXG4gICAgICAgICAgaW5wdXQucXVlcnlQYXJhbXMsXG4gICAgICAgICAgcmVxLnF1ZXJ5LFxuICAgICAgICAgIHN1cHBvcnRlZEFycmF5Rm9ybWF0c1xuICAgICAgICApIGFzIHR5cGVvZiByZXEucXVlcnlcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0LmNvbW1vblBhcmFtcykge1xuICAgICAgICAvKipcbiAgICAgICAgICogYXMgY29tbW9uUGFyYW1zIGluY2x1ZGVzIHF1ZXJ5IHBhcmFtcywgd2UgY2FuIHVzZSB0aGUgcGFyc2VRdWVyeVBhcmFtcyBmdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgOyhyZXEgYXMgYW55KS5jb21tb25QYXJhbXMgPSBwYXJzZVF1ZXJ5UGFyYW1zKFxuICAgICAgICAgIGlucHV0LmNvbW1vblBhcmFtcyxcbiAgICAgICAgICBvcmlnaW5hbF9jb21iaW5lZF9wYXJhbXMsXG4gICAgICAgICAgc3VwcG9ydGVkQXJyYXlGb3JtYXRzXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCYWRSZXF1ZXN0RXhjZXB0aW9uKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvci5uYW1lID09PSBcIlpvZEVycm9yXCIpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2VcbiAgICAgICAgaWYgKGVycm9yLmlzc3Vlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBjb25zdCBpc3N1ZSA9IGVycm9yLmlzc3Vlc1swXVxuICAgICAgICAgIG1lc3NhZ2UgPSB6b2RJc3N1ZVRvU3RyaW5nKGlzc3VlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VfY29tcG9uZW50czogc3RyaW5nW10gPSBbXVxuICAgICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgZXJyb3IuaXNzdWVzKSB7XG4gICAgICAgICAgICBtZXNzYWdlX2NvbXBvbmVudHMucHVzaCh6b2RJc3N1ZVRvU3RyaW5nKGlzc3VlKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICBgJHtlcnJvci5pc3N1ZXMubGVuZ3RofSBJbnB1dCBFcnJvcnM6IGAgK1xuICAgICAgICAgICAgbWVzc2FnZV9jb21wb25lbnRzLmpvaW4oXCIsIFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oe1xuICAgICAgICAgIHR5cGU6IFwiaW52YWxpZF9pbnB1dFwiLFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgdmFsaWRhdGlvbl9lcnJvcnM6IGVycm9yLmZvcm1hdCgpLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgIHR5cGU6IFwiaW52YWxpZF9pbnB1dFwiLFxuICAgICAgICBtZXNzYWdlOiBcIkVycm9yIHdoaWxlIHBhcnNpbmcgaW5wdXRcIixcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyB3aWxsIG92ZXJyaWRlIHRoZSByZXMuanNvbiBtZXRob2QgdG8gdmFsaWRhdGUgdGhlIHJlc3BvbnNlXG4gICAgICovXG4gICAgaWYgKGlucHV0LnNob3VsZFZhbGlkYXRlUmVzcG9uc2VzKSB7XG4gICAgICB2YWxpZGF0ZUpzb25SZXNwb25zZShpbnB1dC5qc29uUmVzcG9uc2UsIHJlcylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dChyZXEsIHJlcylcbiAgfVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoVmFsaWRhdGlvblxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7OztBQ0FBOzs7QUNBQTtBQWlVTyxJQUFNLFdBQXFCLElBQUksaUJBQXdCO0FBQzVELFFBQU0sa0JBQWtCLGFBQWEsYUFBYSxTQUFTO0FBQzNELFFBQU0sTUFBTSxhQUFhLE1BQU0sR0FBRyxFQUFFO0FBRXBDLE1BQUksc0JBQXNCO0FBQzFCLFdBQVMsSUFBSSxJQUFJLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUN4QywwQkFBdUIsSUFBSSxHQUFXLG1CQUFtQjtBQUFBLEVBQzNEO0FBRUEsU0FBTztBQUNUO0FBRUEsSUFBTyxtQkFBUTs7O0FDN1VmO0FBV08sSUFBTSxjQUFjLENBQUMsWUFBMkIsQ0FBQyxTQUFTLENBQUMsS0FBSyxRQUFRO0FBQzdFLE1BQUksQ0FBQyxRQUFRLFNBQVMsSUFBSSxNQUFNLEdBQUc7QUFDakMsVUFBTSxJQUFJLDBCQUEwQjtBQUFBLE1BQ2xDLE1BQU07QUFBQSxNQUNOLFNBQVMsUUFBUSxRQUFRLEtBQUssR0FBRztBQUFBLElBQ25DLENBQUM7QUFB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nextlove",
3
- "version": "2.20.0",
3
+ "version": "3.0.1",
4
4
  "private": false,
5
5
  "sideEffects": false,
6
6
  "repository": "https://github.com/seamapi/nextlove",
@@ -53,7 +53,7 @@
53
53
  "react": ">=18",
54
54
  "react-dom": ">=18",
55
55
  "typescript": "^5.0.2",
56
- "zod": "^3.0.0"
56
+ "zod": "^3.0.0 || ^4.0.0"
57
57
  },
58
58
  "dependencies": {
59
59
  "@types/js-yaml": "^4.0.9",
@@ -61,11 +61,9 @@
61
61
  "js-yaml": "^4.1.0",
62
62
  "lodash": "^4.17.21",
63
63
  "openapi3-ts": "^4.4.0",
64
- "ts-deepmerge": "^6.0.3",
65
64
  "ts-morph": "^21.0.1"
66
65
  },
67
66
  "devDependencies": {
68
- "@anatine/zod-openapi": "^2.0.1",
69
67
  "@types/lodash": "^4.14.182",
70
68
  "@types/node": "18.0.0",
71
69
  "@types/prettier": "^2.7.1",
@@ -91,6 +89,6 @@
91
89
  "tsup": "^5.6.3",
92
90
  "turbo": "^1.3.1",
93
91
  "type-fest": "^3.1.0",
94
- "zod": "^3.21.4"
92
+ "zod": "^4.3.5"
95
93
  }
96
94
  }