every-plugin 0.4.4 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/build/rspack/index.cjs +300 -0
  2. package/dist/build/rspack/index.d.cts +20 -0
  3. package/dist/build/rspack/index.d.mts +20 -0
  4. package/dist/build/rspack/index.mjs +298 -0
  5. package/dist/chunk-QQAxy9l9.mjs +31 -0
  6. package/dist/chunk-zltIcp7o.cjs +46 -0
  7. package/dist/effect.cjs +9 -0
  8. package/dist/effect.d.cts +1 -0
  9. package/dist/effect.d.mts +1 -0
  10. package/dist/effect.mjs +3 -0
  11. package/dist/errors-CVnoPl9v.cjs +68 -0
  12. package/dist/errors-Car4tFVP.d.mts +75 -0
  13. package/dist/errors-D7keKf7a.mjs +63 -0
  14. package/dist/errors-DKPPPYYT.d.cts +75 -0
  15. package/dist/errors.cjs +4 -0
  16. package/dist/errors.d.cts +3 -0
  17. package/dist/errors.d.mts +3 -0
  18. package/dist/errors.mjs +4 -0
  19. package/dist/fetch-Cc95-7kM.cjs +336 -0
  20. package/dist/fetch-KLktuWuM.mjs +335 -0
  21. package/dist/index-bwAhA9ca.d.mts +383 -0
  22. package/dist/index-matrPV4m.d.cts +382 -0
  23. package/dist/index.cjs +57 -0
  24. package/dist/index.d.cts +5 -0
  25. package/dist/index.d.mts +5 -0
  26. package/dist/index.mjs +52 -0
  27. package/dist/{runtime/services/normalize.d.ts → normalize-BLTyqFww.d.mts} +5 -2
  28. package/dist/{runtime/services/normalize.js → normalize-BW7kk8Lk.d.cts} +5 -1
  29. package/dist/normalize-D4Qh0wVk.cjs +28 -0
  30. package/dist/normalize-D7nae0Hn.mjs +22 -0
  31. package/dist/openapi.DrTcell5-C6kyDyUK.mjs +669 -0
  32. package/dist/openapi.DrTcell5-DDf4D5V3.cjs +687 -0
  33. package/dist/orpc.cjs +46 -0
  34. package/dist/orpc.d.cts +7 -0
  35. package/dist/orpc.d.mts +7 -0
  36. package/dist/orpc.mjs +11 -0
  37. package/dist/package-CmegWGdE.cjs +154 -0
  38. package/dist/package-Dn-xZ55N.mjs +149 -0
  39. package/dist/plugins-C-7lh5gK.cjs +128 -0
  40. package/dist/plugins-Ps5Xxpk2.mjs +128 -0
  41. package/dist/runtime/index.cjs +6 -0
  42. package/dist/runtime/index.d.cts +5 -0
  43. package/dist/runtime/index.d.mts +5 -0
  44. package/dist/runtime/index.mjs +5 -0
  45. package/dist/runtime/services/normalize.cjs +3 -0
  46. package/dist/runtime/services/normalize.d.cts +2 -0
  47. package/dist/runtime/services/normalize.d.mts +2 -0
  48. package/dist/runtime/services/normalize.mjs +3 -0
  49. package/dist/runtime-CgRUExK3.cjs +523 -0
  50. package/dist/runtime-Da2NjzYy.mjs +458 -0
  51. package/dist/standard-DaxKTFui.mjs +595 -0
  52. package/dist/standard-eUgUkWaf.cjs +702 -0
  53. package/dist/testing/index.cjs +78 -0
  54. package/dist/testing/index.d.cts +60 -0
  55. package/dist/testing/index.d.mts +60 -0
  56. package/dist/testing/index.mjs +75 -0
  57. package/dist/zod-A7Pti5IV.d.cts +4 -0
  58. package/dist/zod-BVo51kgJ.mjs +10 -0
  59. package/dist/zod-D4CFw8d9.d.mts +4 -0
  60. package/dist/zod-DYghWCz1.cjs +14 -0
  61. package/dist/zod.cjs +10 -0
  62. package/dist/zod.d.cts +2 -0
  63. package/dist/zod.d.mts +2 -0
  64. package/dist/zod.mjs +5 -0
  65. package/dist/zod4-BXTBR1od.cjs +318 -0
  66. package/dist/zod4-VpXuwRO7.mjs +317 -0
  67. package/package.json +64 -23
  68. package/dist/effect.d.ts +0 -2
  69. package/dist/effect.d.ts.map +0 -1
  70. package/dist/effect.js +0 -1
  71. package/dist/errors.d.ts +0 -70
  72. package/dist/errors.d.ts.map +0 -1
  73. package/dist/errors.js +0 -61
  74. package/dist/index.d.ts +0 -6
  75. package/dist/index.d.ts.map +0 -1
  76. package/dist/index.js +0 -5
  77. package/dist/orpc.d.ts +0 -10
  78. package/dist/orpc.d.ts.map +0 -1
  79. package/dist/orpc.js +0 -6
  80. package/dist/plugin.d.ts +0 -57
  81. package/dist/plugin.d.ts.map +0 -1
  82. package/dist/plugin.js +0 -43
  83. package/dist/runtime/errors.d.ts +0 -36
  84. package/dist/runtime/errors.d.ts.map +0 -1
  85. package/dist/runtime/errors.js +0 -47
  86. package/dist/runtime/index.d.ts +0 -20
  87. package/dist/runtime/index.d.ts.map +0 -1
  88. package/dist/runtime/index.js +0 -131
  89. package/dist/runtime/services/module-federation.service.d.ts +0 -13
  90. package/dist/runtime/services/module-federation.service.d.ts.map +0 -1
  91. package/dist/runtime/services/module-federation.service.js +0 -155
  92. package/dist/runtime/services/normalize.d.ts.map +0 -1
  93. package/dist/runtime/services/plugin-lifecycle.service.d.ts +0 -14
  94. package/dist/runtime/services/plugin-lifecycle.service.d.ts.map +0 -1
  95. package/dist/runtime/services/plugin-lifecycle.service.js +0 -34
  96. package/dist/runtime/services/plugin-loader.service.d.ts +0 -45
  97. package/dist/runtime/services/plugin-loader.service.d.ts.map +0 -1
  98. package/dist/runtime/services/plugin-loader.service.js +0 -93
  99. package/dist/runtime/services/plugin.service.d.ts +0 -36
  100. package/dist/runtime/services/plugin.service.d.ts.map +0 -1
  101. package/dist/runtime/services/plugin.service.js +0 -31
  102. package/dist/runtime/services/secrets.service.d.ts +0 -15
  103. package/dist/runtime/services/secrets.service.d.ts.map +0 -1
  104. package/dist/runtime/services/secrets.service.js +0 -35
  105. package/dist/runtime/services.d.ts +0 -6
  106. package/dist/runtime/services.d.ts.map +0 -1
  107. package/dist/runtime/services.js +0 -5
  108. package/dist/runtime/validation.d.ts +0 -5
  109. package/dist/runtime/validation.d.ts.map +0 -1
  110. package/dist/runtime/validation.js +0 -13
  111. package/dist/testing/index.d.ts +0 -59
  112. package/dist/testing/index.d.ts.map +0 -1
  113. package/dist/testing/index.js +0 -45
  114. package/dist/testing/mocks/module-federation.service.d.ts +0 -6
  115. package/dist/testing/mocks/module-federation.service.d.ts.map +0 -1
  116. package/dist/testing/mocks/module-federation.service.js +0 -29
  117. package/dist/tsconfig.tsbuildinfo +0 -1
  118. package/dist/types.d.ts +0 -187
  119. package/dist/types.d.ts.map +0 -1
  120. package/dist/types.js +0 -1
  121. package/dist/zod.d.ts +0 -2
  122. package/dist/zod.d.ts.map +0 -1
  123. package/dist/zod.js +0 -1
@@ -0,0 +1,335 @@
1
+ import { _ as tryDecodeURIComponent, a as toHttpPath, h as stringifyJSON, i as standardizeHTTPPath, l as isORPCErrorStatus, n as StandardOpenAPISerializer, o as StandardBracketNotationSerializer, p as isObject, t as StandardOpenAPIJsonSerializer, v as value } from "./standard-DaxKTFui.mjs";
2
+ import { createContractedProcedure, getLazyMeta, getRouter, isProcedure, traverseContractProcedures, unlazy } from "@orpc/server";
3
+ import { fallbackContractConfig } from "@orpc/contract";
4
+ import { FetchHandler } from "@orpc/server/fetch";
5
+ import { StandardHandler } from "@orpc/server/standard";
6
+
7
+ //#region ../../node_modules/.bun/rou3@0.7.10/node_modules/rou3/dist/index.mjs
8
+ const NullProtoObj = /* @__PURE__ */ (() => {
9
+ const e = function() {};
10
+ return e.prototype = Object.create(null), Object.freeze(e.prototype), e;
11
+ })();
12
+ /**
13
+ * Create a new router context.
14
+ */
15
+ function createRouter() {
16
+ return {
17
+ root: { key: "" },
18
+ static: new NullProtoObj()
19
+ };
20
+ }
21
+ function splitPath(path) {
22
+ const [_, ...s] = path.split("/");
23
+ return s[s.length - 1] === "" ? s.slice(0, -1) : s;
24
+ }
25
+ function getMatchParams(segments, paramsMap) {
26
+ const params = new NullProtoObj();
27
+ for (const [index, name] of paramsMap) {
28
+ const segment = index < 0 ? segments.slice(-1 * index).join("/") : segments[index];
29
+ if (typeof name === "string") params[name] = segment;
30
+ else {
31
+ const match = segment.match(name);
32
+ if (match) for (const key in match.groups) params[key] = match.groups[key];
33
+ }
34
+ }
35
+ return params;
36
+ }
37
+ /**
38
+ * Add a route to the router context.
39
+ */
40
+ function addRoute(ctx, method = "", path, data) {
41
+ method = method.toUpperCase();
42
+ if (path.charCodeAt(0) !== 47) path = `/${path}`;
43
+ const segments = splitPath(path);
44
+ let node = ctx.root;
45
+ let _unnamedParamIndex = 0;
46
+ const paramsMap = [];
47
+ const paramsRegexp = [];
48
+ for (let i = 0; i < segments.length; i++) {
49
+ const segment = segments[i];
50
+ if (segment.startsWith("**")) {
51
+ if (!node.wildcard) node.wildcard = { key: "**" };
52
+ node = node.wildcard;
53
+ paramsMap.push([
54
+ -i,
55
+ segment.split(":")[1] || "_",
56
+ segment.length === 2
57
+ ]);
58
+ break;
59
+ }
60
+ if (segment === "*" || segment.includes(":")) {
61
+ if (!node.param) node.param = { key: "*" };
62
+ node = node.param;
63
+ if (segment === "*") paramsMap.push([
64
+ i,
65
+ `_${_unnamedParamIndex++}`,
66
+ true
67
+ ]);
68
+ else if (segment.includes(":", 1)) {
69
+ const regexp = getParamRegexp(segment);
70
+ paramsRegexp[i] = regexp;
71
+ node.hasRegexParam = true;
72
+ paramsMap.push([
73
+ i,
74
+ regexp,
75
+ false
76
+ ]);
77
+ } else paramsMap.push([
78
+ i,
79
+ segment.slice(1),
80
+ false
81
+ ]);
82
+ continue;
83
+ }
84
+ const child = node.static?.[segment];
85
+ if (child) node = child;
86
+ else {
87
+ const staticNode = { key: segment };
88
+ if (!node.static) node.static = new NullProtoObj();
89
+ node.static[segment] = staticNode;
90
+ node = staticNode;
91
+ }
92
+ }
93
+ const hasParams = paramsMap.length > 0;
94
+ if (!node.methods) node.methods = new NullProtoObj();
95
+ node.methods[method] ??= [];
96
+ node.methods[method].push({
97
+ data: data || null,
98
+ paramsRegexp,
99
+ paramsMap: hasParams ? paramsMap : void 0
100
+ });
101
+ if (!hasParams) ctx.static[path] = node;
102
+ }
103
+ function getParamRegexp(segment) {
104
+ const regex = segment.replace(/:(\w+)/g, (_, id) => `(?<${id}>[^/]+)`).replace(/\./g, "\\.");
105
+ return /* @__PURE__ */ new RegExp(`^${regex}$`);
106
+ }
107
+ /**
108
+ * Find a route by path.
109
+ */
110
+ function findRoute(ctx, method = "", path, opts) {
111
+ if (path.charCodeAt(path.length - 1) === 47) path = path.slice(0, -1);
112
+ const staticNode = ctx.static[path];
113
+ if (staticNode && staticNode.methods) {
114
+ const staticMatch = staticNode.methods[method] || staticNode.methods[""];
115
+ if (staticMatch !== void 0) return staticMatch[0];
116
+ }
117
+ const segments = splitPath(path);
118
+ const match = _lookupTree(ctx, ctx.root, method, segments, 0)?.[0];
119
+ if (match === void 0) return;
120
+ if (opts?.params === false) return match;
121
+ return {
122
+ data: match.data,
123
+ params: match.paramsMap ? getMatchParams(segments, match.paramsMap) : void 0
124
+ };
125
+ }
126
+ function _lookupTree(ctx, node, method, segments, index) {
127
+ if (index === segments.length) {
128
+ if (node.methods) {
129
+ const match = node.methods[method] || node.methods[""];
130
+ if (match) return match;
131
+ }
132
+ if (node.param && node.param.methods) {
133
+ const match = node.param.methods[method] || node.param.methods[""];
134
+ if (match) {
135
+ const pMap = match[0].paramsMap;
136
+ if (pMap?.[pMap?.length - 1]?.[2]) return match;
137
+ }
138
+ }
139
+ if (node.wildcard && node.wildcard.methods) {
140
+ const match = node.wildcard.methods[method] || node.wildcard.methods[""];
141
+ if (match) {
142
+ const pMap = match[0].paramsMap;
143
+ if (pMap?.[pMap?.length - 1]?.[2]) return match;
144
+ }
145
+ }
146
+ return;
147
+ }
148
+ const segment = segments[index];
149
+ if (node.static) {
150
+ const staticChild = node.static[segment];
151
+ if (staticChild) {
152
+ const match = _lookupTree(ctx, staticChild, method, segments, index + 1);
153
+ if (match) return match;
154
+ }
155
+ }
156
+ if (node.param) {
157
+ const match = _lookupTree(ctx, node.param, method, segments, index + 1);
158
+ if (match) {
159
+ if (node.param.hasRegexParam) {
160
+ const exactMatch = match.find((m) => m.paramsRegexp[index]?.test(segment)) || match.find((m) => !m.paramsRegexp[index]);
161
+ return exactMatch ? [exactMatch] : void 0;
162
+ }
163
+ return match;
164
+ }
165
+ }
166
+ if (node.wildcard && node.wildcard.methods) return node.wildcard.methods[method] || node.wildcard.methods[""];
167
+ }
168
+
169
+ //#endregion
170
+ //#region ../../node_modules/.bun/@orpc+openapi@1.10.4/node_modules/@orpc/openapi/dist/shared/openapi.DIt-Z9W1.mjs
171
+ var StandardOpenAPICodec = class {
172
+ constructor(serializer, options = {}) {
173
+ this.serializer = serializer;
174
+ this.customErrorResponseBodyEncoder = options.customErrorResponseBodyEncoder;
175
+ }
176
+ customErrorResponseBodyEncoder;
177
+ async decode(request, params, procedure) {
178
+ if (fallbackContractConfig("defaultInputStructure", procedure["~orpc"].route.inputStructure) === "compact") {
179
+ const data = request.method === "GET" ? this.serializer.deserialize(request.url.searchParams) : this.serializer.deserialize(await request.body());
180
+ if (data === void 0) return params;
181
+ if (isObject(data)) return {
182
+ ...params,
183
+ ...data
184
+ };
185
+ return data;
186
+ }
187
+ const deserializeSearchParams = () => {
188
+ return this.serializer.deserialize(request.url.searchParams);
189
+ };
190
+ return {
191
+ params,
192
+ get query() {
193
+ const value$1 = deserializeSearchParams();
194
+ Object.defineProperty(this, "query", {
195
+ value: value$1,
196
+ writable: true
197
+ });
198
+ return value$1;
199
+ },
200
+ set query(value$1) {
201
+ Object.defineProperty(this, "query", {
202
+ value: value$1,
203
+ writable: true
204
+ });
205
+ },
206
+ headers: request.headers,
207
+ body: this.serializer.deserialize(await request.body())
208
+ };
209
+ }
210
+ encode(output, procedure) {
211
+ const successStatus = fallbackContractConfig("defaultSuccessStatus", procedure["~orpc"].route.successStatus);
212
+ if (fallbackContractConfig("defaultOutputStructure", procedure["~orpc"].route.outputStructure) === "compact") return {
213
+ status: successStatus,
214
+ headers: {},
215
+ body: this.serializer.serialize(output)
216
+ };
217
+ if (!this.#isDetailedOutput(output)) throw new Error(`
218
+ Invalid "detailed" output structure:
219
+ \u2022 Expected an object with optional properties:
220
+ - status (number 200-399)
221
+ - headers (Record<string, string | string[]>)
222
+ - body (any)
223
+ \u2022 No extra keys allowed.
224
+
225
+ Actual value:
226
+ ${stringifyJSON(output)}
227
+ `);
228
+ return {
229
+ status: output.status ?? successStatus,
230
+ headers: output.headers ?? {},
231
+ body: this.serializer.serialize(output.body)
232
+ };
233
+ }
234
+ encodeError(error) {
235
+ const body = this.customErrorResponseBodyEncoder?.(error) ?? error.toJSON();
236
+ return {
237
+ status: error.status,
238
+ headers: {},
239
+ body: this.serializer.serialize(body, { outputFormat: "plain" })
240
+ };
241
+ }
242
+ #isDetailedOutput(output) {
243
+ if (!isObject(output)) return false;
244
+ if (output.headers && !isObject(output.headers)) return false;
245
+ if (output.status !== void 0 && (typeof output.status !== "number" || !Number.isInteger(output.status) || isORPCErrorStatus(output.status))) return false;
246
+ return true;
247
+ }
248
+ };
249
+ function toRou3Pattern(path) {
250
+ return standardizeHTTPPath(path).replace(/\/\{\+([^}]+)\}/g, "/**:$1").replace(/\/\{([^}]+)\}/g, "/:$1");
251
+ }
252
+ function decodeParams(params) {
253
+ return Object.fromEntries(Object.entries(params).map(([key, value$1]) => [key, tryDecodeURIComponent(value$1)]));
254
+ }
255
+ var StandardOpenAPIMatcher = class {
256
+ filter;
257
+ tree = createRouter();
258
+ pendingRouters = [];
259
+ constructor(options = {}) {
260
+ this.filter = options.filter ?? true;
261
+ }
262
+ init(router, path = []) {
263
+ const laziedOptions = traverseContractProcedures({
264
+ router,
265
+ path
266
+ }, (traverseOptions) => {
267
+ if (!value(this.filter, traverseOptions)) return;
268
+ const { path: path2, contract } = traverseOptions;
269
+ const method = fallbackContractConfig("defaultMethod", contract["~orpc"].route.method);
270
+ const httpPath = toRou3Pattern(contract["~orpc"].route.path ?? toHttpPath(path2));
271
+ if (isProcedure(contract)) addRoute(this.tree, method, httpPath, {
272
+ path: path2,
273
+ contract,
274
+ procedure: contract,
275
+ router
276
+ });
277
+ else addRoute(this.tree, method, httpPath, {
278
+ path: path2,
279
+ contract,
280
+ procedure: void 0,
281
+ router
282
+ });
283
+ });
284
+ this.pendingRouters.push(...laziedOptions.map((option) => ({
285
+ ...option,
286
+ httpPathPrefix: toHttpPath(option.path),
287
+ laziedPrefix: getLazyMeta(option.router).prefix
288
+ })));
289
+ }
290
+ async match(method, pathname) {
291
+ if (this.pendingRouters.length) {
292
+ const newPendingRouters = [];
293
+ for (const pendingRouter of this.pendingRouters) if (!pendingRouter.laziedPrefix || pathname.startsWith(pendingRouter.laziedPrefix) || pathname.startsWith(pendingRouter.httpPathPrefix)) {
294
+ const { default: router } = await unlazy(pendingRouter.router);
295
+ this.init(router, pendingRouter.path);
296
+ } else newPendingRouters.push(pendingRouter);
297
+ this.pendingRouters = newPendingRouters;
298
+ }
299
+ const match = findRoute(this.tree, method, pathname);
300
+ if (!match) return;
301
+ if (!match.data.procedure) {
302
+ const { default: maybeProcedure } = await unlazy(getRouter(match.data.router, match.data.path));
303
+ if (!isProcedure(maybeProcedure)) throw new Error(`
304
+ [Contract-First] Missing or invalid implementation for procedure at path: ${toHttpPath(match.data.path)}.
305
+ Ensure that the procedure is correctly defined and matches the expected contract.
306
+ `);
307
+ match.data.procedure = createContractedProcedure(maybeProcedure, match.data.contract);
308
+ }
309
+ return {
310
+ path: match.data.path,
311
+ procedure: match.data.procedure,
312
+ params: match.params ? decodeParams(match.params) : void 0
313
+ };
314
+ }
315
+ };
316
+ var StandardOpenAPIHandler = class extends StandardHandler {
317
+ constructor(router, options) {
318
+ const serializer = new StandardOpenAPISerializer(new StandardOpenAPIJsonSerializer(options), new StandardBracketNotationSerializer(options));
319
+ const matcher = new StandardOpenAPIMatcher(options);
320
+ const codec = new StandardOpenAPICodec(serializer, options);
321
+ super(router, matcher, codec, options);
322
+ }
323
+ };
324
+
325
+ //#endregion
326
+ //#region ../../node_modules/.bun/@orpc+openapi@1.10.4/node_modules/@orpc/openapi/dist/adapters/fetch/index.mjs
327
+ var OpenAPIHandler = class extends FetchHandler {
328
+ constructor(router, options = {}) {
329
+ super(new StandardOpenAPIHandler(router, options), options);
330
+ }
331
+ };
332
+
333
+ //#endregion
334
+ export { OpenAPIHandler };
335
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmV0Y2gtS0xrdHVXdU0ubWpzIiwibmFtZXMiOlsidmFsdWUiLCIjaXNEZXRhaWxlZE91dHB1dCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8uYnVuL3JvdTNAMC43LjEwL25vZGVfbW9kdWxlcy9yb3UzL2Rpc3QvaW5kZXgubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5idW4vQG9ycGMrb3BlbmFwaUAxLjEwLjQvbm9kZV9tb2R1bGVzL0BvcnBjL29wZW5hcGkvZGlzdC9zaGFyZWQvb3BlbmFwaS5ESXQtWjlXMS5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLmJ1bi9Ab3JwYytvcGVuYXBpQDEuMTAuNC9ub2RlX21vZHVsZXMvQG9ycGMvb3BlbmFwaS9kaXN0L2FkYXB0ZXJzL2ZldGNoL2luZGV4Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBOdWxsUHJvdG9PYmogPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHtcblx0Y29uc3QgZSA9IGZ1bmN0aW9uKCkge307XG5cdHJldHVybiBlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCksIE9iamVjdC5mcmVlemUoZS5wcm90b3R5cGUpLCBlO1xufSkoKTtcblxuLyoqXG4qIENyZWF0ZSBhIG5ldyByb3V0ZXIgY29udGV4dC5cbiovXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZXIoKSB7XG5cdHJldHVybiB7XG5cdFx0cm9vdDogeyBrZXk6IFwiXCIgfSxcblx0XHRzdGF0aWM6IG5ldyBOdWxsUHJvdG9PYmooKVxuXHR9O1xufVxuXG5mdW5jdGlvbiBzcGxpdFBhdGgocGF0aCkge1xuXHRjb25zdCBbXywgLi4uc10gPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0cmV0dXJuIHNbcy5sZW5ndGggLSAxXSA9PT0gXCJcIiA/IHMuc2xpY2UoMCwgLTEpIDogcztcbn1cbmZ1bmN0aW9uIGdldE1hdGNoUGFyYW1zKHNlZ21lbnRzLCBwYXJhbXNNYXApIHtcblx0Y29uc3QgcGFyYW1zID0gbmV3IE51bGxQcm90b09iaigpO1xuXHRmb3IgKGNvbnN0IFtpbmRleCwgbmFtZV0gb2YgcGFyYW1zTWFwKSB7XG5cdFx0Y29uc3Qgc2VnbWVudCA9IGluZGV4IDwgMCA/IHNlZ21lbnRzLnNsaWNlKC0xICogaW5kZXgpLmpvaW4oXCIvXCIpIDogc2VnbWVudHNbaW5kZXhdO1xuXHRcdGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikgcGFyYW1zW25hbWVdID0gc2VnbWVudDtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gc2VnbWVudC5tYXRjaChuYW1lKTtcblx0XHRcdGlmIChtYXRjaCkgZm9yIChjb25zdCBrZXkgaW4gbWF0Y2guZ3JvdXBzKSBwYXJhbXNba2V5XSA9IG1hdGNoLmdyb3Vwc1trZXldO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcGFyYW1zO1xufVxuXG4vKipcbiogQWRkIGEgcm91dGUgdG8gdGhlIHJvdXRlciBjb250ZXh0LlxuKi9cbmZ1bmN0aW9uIGFkZFJvdXRlKGN0eCwgbWV0aG9kID0gXCJcIiwgcGF0aCwgZGF0YSkge1xuXHRtZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcblx0aWYgKHBhdGguY2hhckNvZGVBdCgwKSAhPT0gNDcpIHBhdGggPSBgLyR7cGF0aH1gO1xuXHRjb25zdCBzZWdtZW50cyA9IHNwbGl0UGF0aChwYXRoKTtcblx0bGV0IG5vZGUgPSBjdHgucm9vdDtcblx0bGV0IF91bm5hbWVkUGFyYW1JbmRleCA9IDA7XG5cdGNvbnN0IHBhcmFtc01hcCA9IFtdO1xuXHRjb25zdCBwYXJhbXNSZWdleHAgPSBbXTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcblx0XHRpZiAoc2VnbWVudC5zdGFydHNXaXRoKFwiKipcIikpIHtcblx0XHRcdGlmICghbm9kZS53aWxkY2FyZCkgbm9kZS53aWxkY2FyZCA9IHsga2V5OiBcIioqXCIgfTtcblx0XHRcdG5vZGUgPSBub2RlLndpbGRjYXJkO1xuXHRcdFx0cGFyYW1zTWFwLnB1c2goW1xuXHRcdFx0XHQtaSxcblx0XHRcdFx0c2VnbWVudC5zcGxpdChcIjpcIilbMV0gfHwgXCJfXCIsXG5cdFx0XHRcdHNlZ21lbnQubGVuZ3RoID09PSAyXG5cdFx0XHRdKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0XHRpZiAoc2VnbWVudCA9PT0gXCIqXCIgfHwgc2VnbWVudC5pbmNsdWRlcyhcIjpcIikpIHtcblx0XHRcdGlmICghbm9kZS5wYXJhbSkgbm9kZS5wYXJhbSA9IHsga2V5OiBcIipcIiB9O1xuXHRcdFx0bm9kZSA9IG5vZGUucGFyYW07XG5cdFx0XHRpZiAoc2VnbWVudCA9PT0gXCIqXCIpIHBhcmFtc01hcC5wdXNoKFtcblx0XHRcdFx0aSxcblx0XHRcdFx0YF8ke191bm5hbWVkUGFyYW1JbmRleCsrfWAsXG5cdFx0XHRcdHRydWVcblx0XHRcdF0pO1xuXHRcdFx0ZWxzZSBpZiAoc2VnbWVudC5pbmNsdWRlcyhcIjpcIiwgMSkpIHtcblx0XHRcdFx0Y29uc3QgcmVnZXhwID0gZ2V0UGFyYW1SZWdleHAoc2VnbWVudCk7XG5cdFx0XHRcdHBhcmFtc1JlZ2V4cFtpXSA9IHJlZ2V4cDtcblx0XHRcdFx0bm9kZS5oYXNSZWdleFBhcmFtID0gdHJ1ZTtcblx0XHRcdFx0cGFyYW1zTWFwLnB1c2goW1xuXHRcdFx0XHRcdGksXG5cdFx0XHRcdFx0cmVnZXhwLFxuXHRcdFx0XHRcdGZhbHNlXG5cdFx0XHRcdF0pO1xuXHRcdFx0fSBlbHNlIHBhcmFtc01hcC5wdXNoKFtcblx0XHRcdFx0aSxcblx0XHRcdFx0c2VnbWVudC5zbGljZSgxKSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdF0pO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGNvbnN0IGNoaWxkID0gbm9kZS5zdGF0aWM/LltzZWdtZW50XTtcblx0XHRpZiAoY2hpbGQpIG5vZGUgPSBjaGlsZDtcblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHN0YXRpY05vZGUgPSB7IGtleTogc2VnbWVudCB9O1xuXHRcdFx0aWYgKCFub2RlLnN0YXRpYykgbm9kZS5zdGF0aWMgPSBuZXcgTnVsbFByb3RvT2JqKCk7XG5cdFx0XHRub2RlLnN0YXRpY1tzZWdtZW50XSA9IHN0YXRpY05vZGU7XG5cdFx0XHRub2RlID0gc3RhdGljTm9kZTtcblx0XHR9XG5cdH1cblx0Y29uc3QgaGFzUGFyYW1zID0gcGFyYW1zTWFwLmxlbmd0aCA+IDA7XG5cdGlmICghbm9kZS5tZXRob2RzKSBub2RlLm1ldGhvZHMgPSBuZXcgTnVsbFByb3RvT2JqKCk7XG5cdG5vZGUubWV0aG9kc1ttZXRob2RdID8/PSBbXTtcblx0bm9kZS5tZXRob2RzW21ldGhvZF0ucHVzaCh7XG5cdFx0ZGF0YTogZGF0YSB8fCBudWxsLFxuXHRcdHBhcmFtc1JlZ2V4cCxcblx0XHRwYXJhbXNNYXA6IGhhc1BhcmFtcyA/IHBhcmFtc01hcCA6IHZvaWQgMFxuXHR9KTtcblx0aWYgKCFoYXNQYXJhbXMpIGN0eC5zdGF0aWNbcGF0aF0gPSBub2RlO1xufVxuZnVuY3Rpb24gZ2V0UGFyYW1SZWdleHAoc2VnbWVudCkge1xuXHRjb25zdCByZWdleCA9IHNlZ21lbnQucmVwbGFjZSgvOihcXHcrKS9nLCAoXywgaWQpID0+IGAoPzwke2lkfT5bXi9dKylgKS5yZXBsYWNlKC9cXC4vZywgXCJcXFxcLlwiKTtcblx0cmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBuZXcgUmVnRXhwKGBeJHtyZWdleH0kYCk7XG59XG5cbi8qKlxuKiBGaW5kIGEgcm91dGUgYnkgcGF0aC5cbiovXG5mdW5jdGlvbiBmaW5kUm91dGUoY3R4LCBtZXRob2QgPSBcIlwiLCBwYXRoLCBvcHRzKSB7XG5cdGlmIChwYXRoLmNoYXJDb2RlQXQocGF0aC5sZW5ndGggLSAxKSA9PT0gNDcpIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKTtcblx0Y29uc3Qgc3RhdGljTm9kZSA9IGN0eC5zdGF0aWNbcGF0aF07XG5cdGlmIChzdGF0aWNOb2RlICYmIHN0YXRpY05vZGUubWV0aG9kcykge1xuXHRcdGNvbnN0IHN0YXRpY01hdGNoID0gc3RhdGljTm9kZS5tZXRob2RzW21ldGhvZF0gfHwgc3RhdGljTm9kZS5tZXRob2RzW1wiXCJdO1xuXHRcdGlmIChzdGF0aWNNYXRjaCAhPT0gdm9pZCAwKSByZXR1cm4gc3RhdGljTWF0Y2hbMF07XG5cdH1cblx0Y29uc3Qgc2VnbWVudHMgPSBzcGxpdFBhdGgocGF0aCk7XG5cdGNvbnN0IG1hdGNoID0gX2xvb2t1cFRyZWUoY3R4LCBjdHgucm9vdCwgbWV0aG9kLCBzZWdtZW50cywgMCk/LlswXTtcblx0aWYgKG1hdGNoID09PSB2b2lkIDApIHJldHVybjtcblx0aWYgKG9wdHM/LnBhcmFtcyA9PT0gZmFsc2UpIHJldHVybiBtYXRjaDtcblx0cmV0dXJuIHtcblx0XHRkYXRhOiBtYXRjaC5kYXRhLFxuXHRcdHBhcmFtczogbWF0Y2gucGFyYW1zTWFwID8gZ2V0TWF0Y2hQYXJhbXMoc2VnbWVudHMsIG1hdGNoLnBhcmFtc01hcCkgOiB2b2lkIDBcblx0fTtcbn1cbmZ1bmN0aW9uIF9sb29rdXBUcmVlKGN0eCwgbm9kZSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXgpIHtcblx0aWYgKGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGgpIHtcblx0XHRpZiAobm9kZS5tZXRob2RzKSB7XG5cdFx0XHRjb25zdCBtYXRjaCA9IG5vZGUubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUubWV0aG9kc1tcIlwiXTtcblx0XHRcdGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoO1xuXHRcdH1cblx0XHRpZiAobm9kZS5wYXJhbSAmJiBub2RlLnBhcmFtLm1ldGhvZHMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gbm9kZS5wYXJhbS5tZXRob2RzW21ldGhvZF0gfHwgbm9kZS5wYXJhbS5tZXRob2RzW1wiXCJdO1xuXHRcdFx0aWYgKG1hdGNoKSB7XG5cdFx0XHRcdGNvbnN0IHBNYXAgPSBtYXRjaFswXS5wYXJhbXNNYXA7XG5cdFx0XHRcdGlmIChwTWFwPy5bcE1hcD8ubGVuZ3RoIC0gMV0/LlsyXSkgcmV0dXJuIG1hdGNoO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAobm9kZS53aWxkY2FyZCAmJiBub2RlLndpbGRjYXJkLm1ldGhvZHMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gbm9kZS53aWxkY2FyZC5tZXRob2RzW21ldGhvZF0gfHwgbm9kZS53aWxkY2FyZC5tZXRob2RzW1wiXCJdO1xuXHRcdFx0aWYgKG1hdGNoKSB7XG5cdFx0XHRcdGNvbnN0IHBNYXAgPSBtYXRjaFswXS5wYXJhbXNNYXA7XG5cdFx0XHRcdGlmIChwTWFwPy5bcE1hcD8ubGVuZ3RoIC0gMV0/LlsyXSkgcmV0dXJuIG1hdGNoO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblx0Y29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2luZGV4XTtcblx0aWYgKG5vZGUuc3RhdGljKSB7XG5cdFx0Y29uc3Qgc3RhdGljQ2hpbGQgPSBub2RlLnN0YXRpY1tzZWdtZW50XTtcblx0XHRpZiAoc3RhdGljQ2hpbGQpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gX2xvb2t1cFRyZWUoY3R4LCBzdGF0aWNDaGlsZCwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXggKyAxKTtcblx0XHRcdGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoO1xuXHRcdH1cblx0fVxuXHRpZiAobm9kZS5wYXJhbSkge1xuXHRcdGNvbnN0IG1hdGNoID0gX2xvb2t1cFRyZWUoY3R4LCBub2RlLnBhcmFtLCBtZXRob2QsIHNlZ21lbnRzLCBpbmRleCArIDEpO1xuXHRcdGlmIChtYXRjaCkge1xuXHRcdFx0aWYgKG5vZGUucGFyYW0uaGFzUmVnZXhQYXJhbSkge1xuXHRcdFx0XHRjb25zdCBleGFjdE1hdGNoID0gbWF0Y2guZmluZCgobSkgPT4gbS5wYXJhbXNSZWdleHBbaW5kZXhdPy50ZXN0KHNlZ21lbnQpKSB8fCBtYXRjaC5maW5kKChtKSA9PiAhbS5wYXJhbXNSZWdleHBbaW5kZXhdKTtcblx0XHRcdFx0cmV0dXJuIGV4YWN0TWF0Y2ggPyBbZXhhY3RNYXRjaF0gOiB2b2lkIDA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fVxuXHR9XG5cdGlmIChub2RlLndpbGRjYXJkICYmIG5vZGUud2lsZGNhcmQubWV0aG9kcykgcmV0dXJuIG5vZGUud2lsZGNhcmQubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUud2lsZGNhcmQubWV0aG9kc1tcIlwiXTtcbn1cblxuLyoqXG4qIFJlbW92ZSBhIHJvdXRlIGZyb20gdGhlIHJvdXRlciBjb250ZXh0LlxuKi9cbmZ1bmN0aW9uIHJlbW92ZVJvdXRlKGN0eCwgbWV0aG9kLCBwYXRoKSB7XG5cdGNvbnN0IHNlZ21lbnRzID0gc3BsaXRQYXRoKHBhdGgpO1xuXHRyZXR1cm4gX3JlbW92ZShjdHgucm9vdCwgbWV0aG9kIHx8IFwiXCIsIHNlZ21lbnRzLCAwKTtcbn1cbmZ1bmN0aW9uIF9yZW1vdmUobm9kZSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXgpIHtcblx0aWYgKGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGgpIHtcblx0XHRpZiAobm9kZS5tZXRob2RzICYmIG1ldGhvZCBpbiBub2RlLm1ldGhvZHMpIHtcblx0XHRcdGRlbGV0ZSBub2RlLm1ldGhvZHNbbWV0aG9kXTtcblx0XHRcdGlmIChPYmplY3Qua2V5cyhub2RlLm1ldGhvZHMpLmxlbmd0aCA9PT0gMCkgbm9kZS5tZXRob2RzID0gdm9pZCAwO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblx0Y29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2luZGV4XTtcblx0aWYgKHNlZ21lbnQgPT09IFwiKlwiKSB7XG5cdFx0aWYgKG5vZGUucGFyYW0pIHtcblx0XHRcdF9yZW1vdmUobm9kZS5wYXJhbSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXggKyAxKTtcblx0XHRcdGlmIChfaXNFbXB0eU5vZGUobm9kZS5wYXJhbSkpIG5vZGUucGFyYW0gPSB2b2lkIDA7XG5cdFx0fVxuXHRcdHJldHVybjtcblx0fVxuXHRpZiAoc2VnbWVudC5zdGFydHNXaXRoKFwiKipcIikpIHtcblx0XHRpZiAobm9kZS53aWxkY2FyZCkge1xuXHRcdFx0X3JlbW92ZShub2RlLndpbGRjYXJkLCBtZXRob2QsIHNlZ21lbnRzLCBpbmRleCArIDEpO1xuXHRcdFx0aWYgKF9pc0VtcHR5Tm9kZShub2RlLndpbGRjYXJkKSkgbm9kZS53aWxkY2FyZCA9IHZvaWQgMDtcblx0XHR9XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IGNoaWxkTm9kZSA9IG5vZGUuc3RhdGljPy5bc2VnbWVudF07XG5cdGlmIChjaGlsZE5vZGUpIHtcblx0XHRfcmVtb3ZlKGNoaWxkTm9kZSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXggKyAxKTtcblx0XHRpZiAoX2lzRW1wdHlOb2RlKGNoaWxkTm9kZSkpIHtcblx0XHRcdGRlbGV0ZSBub2RlLnN0YXRpY1tzZWdtZW50XTtcblx0XHRcdGlmIChPYmplY3Qua2V5cyhub2RlLnN0YXRpYykubGVuZ3RoID09PSAwKSBub2RlLnN0YXRpYyA9IHZvaWQgMDtcblx0XHR9XG5cdH1cbn1cbmZ1bmN0aW9uIF9pc0VtcHR5Tm9kZShub2RlKSB7XG5cdHJldHVybiBub2RlLm1ldGhvZHMgPT09IHZvaWQgMCAmJiBub2RlLnN0YXRpYyA9PT0gdm9pZCAwICYmIG5vZGUucGFyYW0gPT09IHZvaWQgMCAmJiBub2RlLndpbGRjYXJkID09PSB2b2lkIDA7XG59XG5cbi8qKlxuKiBGaW5kIGFsbCByb3V0ZSBwYXR0ZXJucyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXRoLlxuKi9cbmZ1bmN0aW9uIGZpbmRBbGxSb3V0ZXMoY3R4LCBtZXRob2QgPSBcIlwiLCBwYXRoLCBvcHRzKSB7XG5cdGlmIChwYXRoLmNoYXJDb2RlQXQocGF0aC5sZW5ndGggLSAxKSA9PT0gNDcpIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKTtcblx0Y29uc3Qgc2VnbWVudHMgPSBzcGxpdFBhdGgocGF0aCk7XG5cdGNvbnN0IG1hdGNoZXMgPSBfZmluZEFsbChjdHgsIGN0eC5yb290LCBtZXRob2QsIHNlZ21lbnRzLCAwKTtcblx0aWYgKG9wdHM/LnBhcmFtcyA9PT0gZmFsc2UpIHJldHVybiBtYXRjaGVzO1xuXHRyZXR1cm4gbWF0Y2hlcy5tYXAoKG0pID0+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZGF0YTogbS5kYXRhLFxuXHRcdFx0cGFyYW1zOiBtLnBhcmFtc01hcCA/IGdldE1hdGNoUGFyYW1zKHNlZ21lbnRzLCBtLnBhcmFtc01hcCkgOiB2b2lkIDBcblx0XHR9O1xuXHR9KTtcbn1cbmZ1bmN0aW9uIF9maW5kQWxsKGN0eCwgbm9kZSwgbWV0aG9kLCBzZWdtZW50cywgaW5kZXgsIG1hdGNoZXMgPSBbXSkge1xuXHRjb25zdCBzZWdtZW50ID0gc2VnbWVudHNbaW5kZXhdO1xuXHRpZiAobm9kZS53aWxkY2FyZCAmJiBub2RlLndpbGRjYXJkLm1ldGhvZHMpIHtcblx0XHRjb25zdCBtYXRjaCA9IG5vZGUud2lsZGNhcmQubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUud2lsZGNhcmQubWV0aG9kc1tcIlwiXTtcblx0XHRpZiAobWF0Y2gpIG1hdGNoZXMucHVzaCguLi5tYXRjaCk7XG5cdH1cblx0aWYgKG5vZGUucGFyYW0pIHtcblx0XHRfZmluZEFsbChjdHgsIG5vZGUucGFyYW0sIG1ldGhvZCwgc2VnbWVudHMsIGluZGV4ICsgMSwgbWF0Y2hlcyk7XG5cdFx0aWYgKGluZGV4ID09PSBzZWdtZW50cy5sZW5ndGggJiYgbm9kZS5wYXJhbS5tZXRob2RzKSB7XG5cdFx0XHRjb25zdCBtYXRjaCA9IG5vZGUucGFyYW0ubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUucGFyYW0ubWV0aG9kc1tcIlwiXTtcblx0XHRcdGlmIChtYXRjaCkge1xuXHRcdFx0XHRjb25zdCBwTWFwID0gbWF0Y2hbMF0ucGFyYW1zTWFwO1xuXHRcdFx0XHRpZiAocE1hcD8uW3BNYXA/Lmxlbmd0aCAtIDFdPy5bMl0pIG1hdGNoZXMucHVzaCguLi5tYXRjaCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGNvbnN0IHN0YXRpY0NoaWxkID0gbm9kZS5zdGF0aWM/LltzZWdtZW50XTtcblx0aWYgKHN0YXRpY0NoaWxkKSBfZmluZEFsbChjdHgsIHN0YXRpY0NoaWxkLCBtZXRob2QsIHNlZ21lbnRzLCBpbmRleCArIDEsIG1hdGNoZXMpO1xuXHRpZiAoaW5kZXggPT09IHNlZ21lbnRzLmxlbmd0aCAmJiBub2RlLm1ldGhvZHMpIHtcblx0XHRjb25zdCBtYXRjaCA9IG5vZGUubWV0aG9kc1ttZXRob2RdIHx8IG5vZGUubWV0aG9kc1tcIlwiXTtcblx0XHRpZiAobWF0Y2gpIG1hdGNoZXMucHVzaCguLi5tYXRjaCk7XG5cdH1cblx0cmV0dXJuIG1hdGNoZXM7XG59XG5cbmZ1bmN0aW9uIHJvdXRlVG9SZWdFeHAocm91dGUgPSBcIi9cIikge1xuXHRjb25zdCByZVNlZ21lbnRzID0gW107XG5cdGxldCBpZEN0ciA9IDA7XG5cdGZvciAoY29uc3Qgc2VnbWVudCBvZiByb3V0ZS5zcGxpdChcIi9cIikpIHtcblx0XHRpZiAoIXNlZ21lbnQpIGNvbnRpbnVlO1xuXHRcdGlmIChzZWdtZW50ID09PSBcIipcIikgcmVTZWdtZW50cy5wdXNoKGAoPzxfJHtpZEN0cisrfT5bXi9dKilgKTtcblx0XHRlbHNlIGlmIChzZWdtZW50LnN0YXJ0c1dpdGgoXCIqKlwiKSkgcmVTZWdtZW50cy5wdXNoKHNlZ21lbnQgPT09IFwiKipcIiA/IFwiPyg/PF8+LiopXCIgOiBgPyg/PCR7c2VnbWVudC5zbGljZSgzKX0+LispYCk7XG5cdFx0ZWxzZSBpZiAoc2VnbWVudC5pbmNsdWRlcyhcIjpcIikpIHJlU2VnbWVudHMucHVzaChzZWdtZW50LnJlcGxhY2UoLzooXFx3KykvZywgKF8sIGlkKSA9PiBgKD88JHtpZH0+W14vXSspYCkucmVwbGFjZSgvXFwuL2csIFwiXFxcXC5cIikpO1xuXHRcdGVsc2UgcmVTZWdtZW50cy5wdXNoKHNlZ21lbnQpO1xuXHR9XG5cdHJldHVybiAvKiBAX19QVVJFX18gKi8gbmV3IFJlZ0V4cChgXi8ke3JlU2VnbWVudHMuam9pbihcIi9cIil9Lz8kYCk7XG59XG5cbmV4cG9ydCB7IE51bGxQcm90b09iaiwgYWRkUm91dGUsIGNyZWF0ZVJvdXRlciwgZmluZEFsbFJvdXRlcywgZmluZFJvdXRlLCByZW1vdmVSb3V0ZSwgcm91dGVUb1JlZ0V4cCB9OyIsImltcG9ydCB7IHN0YW5kYXJkaXplSFRUUFBhdGgsIFN0YW5kYXJkT3BlbkFQSUpzb25TZXJpYWxpemVyLCBTdGFuZGFyZEJyYWNrZXROb3RhdGlvblNlcmlhbGl6ZXIsIFN0YW5kYXJkT3BlbkFQSVNlcmlhbGl6ZXIgfSBmcm9tICdAb3JwYy9vcGVuYXBpLWNsaWVudC9zdGFuZGFyZCc7XG5pbXBvcnQgeyBTdGFuZGFyZEhhbmRsZXIgfSBmcm9tICdAb3JwYy9zZXJ2ZXIvc3RhbmRhcmQnO1xuaW1wb3J0IHsgaXNPUlBDRXJyb3JTdGF0dXMgfSBmcm9tICdAb3JwYy9jbGllbnQnO1xuaW1wb3J0IHsgZmFsbGJhY2tDb250cmFjdENvbmZpZyB9IGZyb20gJ0BvcnBjL2NvbnRyYWN0JztcbmltcG9ydCB7IGlzT2JqZWN0LCBzdHJpbmdpZnlKU09OLCB0cnlEZWNvZGVVUklDb21wb25lbnQsIHZhbHVlIH0gZnJvbSAnQG9ycGMvc2hhcmVkJztcbmltcG9ydCB7IHRvSHR0cFBhdGggfSBmcm9tICdAb3JwYy9jbGllbnQvc3RhbmRhcmQnO1xuaW1wb3J0IHsgdHJhdmVyc2VDb250cmFjdFByb2NlZHVyZXMsIGlzUHJvY2VkdXJlLCBnZXRMYXp5TWV0YSwgdW5sYXp5LCBnZXRSb3V0ZXIsIGNyZWF0ZUNvbnRyYWN0ZWRQcm9jZWR1cmUgfSBmcm9tICdAb3JwYy9zZXJ2ZXInO1xuaW1wb3J0IHsgY3JlYXRlUm91dGVyLCBhZGRSb3V0ZSwgZmluZFJvdXRlIH0gZnJvbSAncm91Myc7XG5cbmNsYXNzIFN0YW5kYXJkT3BlbkFQSUNvZGVjIHtcbiAgY29uc3RydWN0b3Ioc2VyaWFsaXplciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5zZXJpYWxpemVyID0gc2VyaWFsaXplcjtcbiAgICB0aGlzLmN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RW5jb2RlciA9IG9wdGlvbnMuY3VzdG9tRXJyb3JSZXNwb25zZUJvZHlFbmNvZGVyO1xuICB9XG4gIGN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RW5jb2RlcjtcbiAgYXN5bmMgZGVjb2RlKHJlcXVlc3QsIHBhcmFtcywgcHJvY2VkdXJlKSB7XG4gICAgY29uc3QgaW5wdXRTdHJ1Y3R1cmUgPSBmYWxsYmFja0NvbnRyYWN0Q29uZmlnKFwiZGVmYXVsdElucHV0U3RydWN0dXJlXCIsIHByb2NlZHVyZVtcIn5vcnBjXCJdLnJvdXRlLmlucHV0U3RydWN0dXJlKTtcbiAgICBpZiAoaW5wdXRTdHJ1Y3R1cmUgPT09IFwiY29tcGFjdFwiKSB7XG4gICAgICBjb25zdCBkYXRhID0gcmVxdWVzdC5tZXRob2QgPT09IFwiR0VUXCIgPyB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVxdWVzdC51cmwuc2VhcmNoUGFyYW1zKSA6IHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShhd2FpdCByZXF1ZXN0LmJvZHkoKSk7XG4gICAgICBpZiAoZGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgLi4uZGF0YVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvbnN0IGRlc2VyaWFsaXplU2VhcmNoUGFyYW1zID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShyZXF1ZXN0LnVybC5zZWFyY2hQYXJhbXMpO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtcyxcbiAgICAgIGdldCBxdWVyeSgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBkZXNlcmlhbGl6ZVNlYXJjaFBhcmFtcygpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJxdWVyeVwiLCB7IHZhbHVlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcbiAgICAgIHNldCBxdWVyeSh2YWx1ZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJxdWVyeVwiLCB7IHZhbHVlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgICAgIH0sXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICBib2R5OiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYXdhaXQgcmVxdWVzdC5ib2R5KCkpXG4gICAgfTtcbiAgfVxuICBlbmNvZGUob3V0cHV0LCBwcm9jZWR1cmUpIHtcbiAgICBjb25zdCBzdWNjZXNzU3RhdHVzID0gZmFsbGJhY2tDb250cmFjdENvbmZpZyhcImRlZmF1bHRTdWNjZXNzU3RhdHVzXCIsIHByb2NlZHVyZVtcIn5vcnBjXCJdLnJvdXRlLnN1Y2Nlc3NTdGF0dXMpO1xuICAgIGNvbnN0IG91dHB1dFN0cnVjdHVyZSA9IGZhbGxiYWNrQ29udHJhY3RDb25maWcoXCJkZWZhdWx0T3V0cHV0U3RydWN0dXJlXCIsIHByb2NlZHVyZVtcIn5vcnBjXCJdLnJvdXRlLm91dHB1dFN0cnVjdHVyZSk7XG4gICAgaWYgKG91dHB1dFN0cnVjdHVyZSA9PT0gXCJjb21wYWN0XCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogc3VjY2Vzc1N0YXR1cyxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGJvZHk6IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUob3V0cHV0KVxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLiNpc0RldGFpbGVkT3V0cHV0KG91dHB1dCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICAgIEludmFsaWQgXCJkZXRhaWxlZFwiIG91dHB1dCBzdHJ1Y3R1cmU6XG4gICAgICAgIFxcdTIwMjIgRXhwZWN0ZWQgYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwgcHJvcGVydGllczpcbiAgICAgICAgICAtIHN0YXR1cyAobnVtYmVyIDIwMC0zOTkpXG4gICAgICAgICAgLSBoZWFkZXJzIChSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4pXG4gICAgICAgICAgLSBib2R5IChhbnkpXG4gICAgICAgIFxcdTIwMjIgTm8gZXh0cmEga2V5cyBhbGxvd2VkLlxuXG4gICAgICAgIEFjdHVhbCB2YWx1ZTpcbiAgICAgICAgICAke3N0cmluZ2lmeUpTT04ob3V0cHV0KX1cbiAgICAgIGApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBvdXRwdXQuc3RhdHVzID8/IHN1Y2Nlc3NTdGF0dXMsXG4gICAgICBoZWFkZXJzOiBvdXRwdXQuaGVhZGVycyA/PyB7fSxcbiAgICAgIGJvZHk6IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUob3V0cHV0LmJvZHkpXG4gICAgfTtcbiAgfVxuICBlbmNvZGVFcnJvcihlcnJvcikge1xuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmN1c3RvbUVycm9yUmVzcG9uc2VCb2R5RW5jb2Rlcj8uKGVycm9yKSA/PyBlcnJvci50b0pTT04oKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBlcnJvci5zdGF0dXMsXG4gICAgICBoZWFkZXJzOiB7fSxcbiAgICAgIGJvZHk6IHRoaXMuc2VyaWFsaXplci5zZXJpYWxpemUoYm9keSwgeyBvdXRwdXRGb3JtYXQ6IFwicGxhaW5cIiB9KVxuICAgIH07XG4gIH1cbiAgI2lzRGV0YWlsZWRPdXRwdXQob3V0cHV0KSB7XG4gICAgaWYgKCFpc09iamVjdChvdXRwdXQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuaGVhZGVycyAmJiAhaXNPYmplY3Qob3V0cHV0LmhlYWRlcnMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuc3RhdHVzICE9PSB2b2lkIDAgJiYgKHR5cGVvZiBvdXRwdXQuc3RhdHVzICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG91dHB1dC5zdGF0dXMpIHx8IGlzT1JQQ0Vycm9yU3RhdHVzKG91dHB1dC5zdGF0dXMpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1JvdTNQYXR0ZXJuKHBhdGgpIHtcbiAgcmV0dXJuIHN0YW5kYXJkaXplSFRUUFBhdGgocGF0aCkucmVwbGFjZSgvXFwvXFx7XFwrKFtefV0rKVxcfS9nLCBcIi8qKjokMVwiKS5yZXBsYWNlKC9cXC9cXHsoW159XSspXFx9L2csIFwiLzokMVwiKTtcbn1cbmZ1bmN0aW9uIGRlY29kZVBhcmFtcyhwYXJhbXMpIHtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwYXJhbXMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCB0cnlEZWNvZGVVUklDb21wb25lbnQodmFsdWUpXSkpO1xufVxuXG5jbGFzcyBTdGFuZGFyZE9wZW5BUElNYXRjaGVyIHtcbiAgZmlsdGVyO1xuICB0cmVlID0gY3JlYXRlUm91dGVyKCk7XG4gIHBlbmRpbmdSb3V0ZXJzID0gW107XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuZmlsdGVyID0gb3B0aW9ucy5maWx0ZXIgPz8gdHJ1ZTtcbiAgfVxuICBpbml0KHJvdXRlciwgcGF0aCA9IFtdKSB7XG4gICAgY29uc3QgbGF6aWVkT3B0aW9ucyA9IHRyYXZlcnNlQ29udHJhY3RQcm9jZWR1cmVzKHsgcm91dGVyLCBwYXRoIH0sICh0cmF2ZXJzZU9wdGlvbnMpID0+IHtcbiAgICAgIGlmICghdmFsdWUodGhpcy5maWx0ZXIsIHRyYXZlcnNlT3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBwYXRoOiBwYXRoMiwgY29udHJhY3QgfSA9IHRyYXZlcnNlT3B0aW9ucztcbiAgICAgIGNvbnN0IG1ldGhvZCA9IGZhbGxiYWNrQ29udHJhY3RDb25maWcoXCJkZWZhdWx0TWV0aG9kXCIsIGNvbnRyYWN0W1wifm9ycGNcIl0ucm91dGUubWV0aG9kKTtcbiAgICAgIGNvbnN0IGh0dHBQYXRoID0gdG9Sb3UzUGF0dGVybihjb250cmFjdFtcIn5vcnBjXCJdLnJvdXRlLnBhdGggPz8gdG9IdHRwUGF0aChwYXRoMikpO1xuICAgICAgaWYgKGlzUHJvY2VkdXJlKGNvbnRyYWN0KSkge1xuICAgICAgICBhZGRSb3V0ZSh0aGlzLnRyZWUsIG1ldGhvZCwgaHR0cFBhdGgsIHtcbiAgICAgICAgICBwYXRoOiBwYXRoMixcbiAgICAgICAgICBjb250cmFjdCxcbiAgICAgICAgICBwcm9jZWR1cmU6IGNvbnRyYWN0LFxuICAgICAgICAgIC8vIHRoaXMgbWVhbiBkZXYgbm90IHVzZWQgY29udHJhY3QtZmlyc3Qgc28gd2UgY2FuIHVzZWQgY29udHJhY3QgYXMgcHJvY2VkdXJlIGRpcmVjdGx5XG4gICAgICAgICAgcm91dGVyXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkUm91dGUodGhpcy50cmVlLCBtZXRob2QsIGh0dHBQYXRoLCB7XG4gICAgICAgICAgcGF0aDogcGF0aDIsXG4gICAgICAgICAgY29udHJhY3QsXG4gICAgICAgICAgcHJvY2VkdXJlOiB2b2lkIDAsXG4gICAgICAgICAgcm91dGVyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZ1JvdXRlcnMucHVzaCguLi5sYXppZWRPcHRpb25zLm1hcCgob3B0aW9uKSA9PiAoe1xuICAgICAgLi4ub3B0aW9uLFxuICAgICAgaHR0cFBhdGhQcmVmaXg6IHRvSHR0cFBhdGgob3B0aW9uLnBhdGgpLFxuICAgICAgbGF6aWVkUHJlZml4OiBnZXRMYXp5TWV0YShvcHRpb24ucm91dGVyKS5wcmVmaXhcbiAgICB9KSkpO1xuICB9XG4gIGFzeW5jIG1hdGNoKG1ldGhvZCwgcGF0aG5hbWUpIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nUm91dGVycy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5ld1BlbmRpbmdSb3V0ZXJzID0gW107XG4gICAgICBmb3IgKGNvbnN0IHBlbmRpbmdSb3V0ZXIgb2YgdGhpcy5wZW5kaW5nUm91dGVycykge1xuICAgICAgICBpZiAoIXBlbmRpbmdSb3V0ZXIubGF6aWVkUHJlZml4IHx8IHBhdGhuYW1lLnN0YXJ0c1dpdGgocGVuZGluZ1JvdXRlci5sYXppZWRQcmVmaXgpIHx8IHBhdGhuYW1lLnN0YXJ0c1dpdGgocGVuZGluZ1JvdXRlci5odHRwUGF0aFByZWZpeCkpIHtcbiAgICAgICAgICBjb25zdCB7IGRlZmF1bHQ6IHJvdXRlciB9ID0gYXdhaXQgdW5sYXp5KHBlbmRpbmdSb3V0ZXIucm91dGVyKTtcbiAgICAgICAgICB0aGlzLmluaXQocm91dGVyLCBwZW5kaW5nUm91dGVyLnBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1BlbmRpbmdSb3V0ZXJzLnB1c2gocGVuZGluZ1JvdXRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ1JvdXRlcnMgPSBuZXdQZW5kaW5nUm91dGVycztcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBmaW5kUm91dGUodGhpcy50cmVlLCBtZXRob2QsIHBhdGhuYW1lKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICBpZiAoIW1hdGNoLmRhdGEucHJvY2VkdXJlKSB7XG4gICAgICBjb25zdCB7IGRlZmF1bHQ6IG1heWJlUHJvY2VkdXJlIH0gPSBhd2FpdCB1bmxhenkoZ2V0Um91dGVyKG1hdGNoLmRhdGEucm91dGVyLCBtYXRjaC5kYXRhLnBhdGgpKTtcbiAgICAgIGlmICghaXNQcm9jZWR1cmUobWF5YmVQcm9jZWR1cmUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXG4gICAgICAgICAgW0NvbnRyYWN0LUZpcnN0XSBNaXNzaW5nIG9yIGludmFsaWQgaW1wbGVtZW50YXRpb24gZm9yIHByb2NlZHVyZSBhdCBwYXRoOiAke3RvSHR0cFBhdGgobWF0Y2guZGF0YS5wYXRoKX0uXG4gICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHByb2NlZHVyZSBpcyBjb3JyZWN0bHkgZGVmaW5lZCBhbmQgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgY29udHJhY3QuXG4gICAgICAgIGApO1xuICAgICAgfVxuICAgICAgbWF0Y2guZGF0YS5wcm9jZWR1cmUgPSBjcmVhdGVDb250cmFjdGVkUHJvY2VkdXJlKG1heWJlUHJvY2VkdXJlLCBtYXRjaC5kYXRhLmNvbnRyYWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IG1hdGNoLmRhdGEucGF0aCxcbiAgICAgIHByb2NlZHVyZTogbWF0Y2guZGF0YS5wcm9jZWR1cmUsXG4gICAgICBwYXJhbXM6IG1hdGNoLnBhcmFtcyA/IGRlY29kZVBhcmFtcyhtYXRjaC5wYXJhbXMpIDogdm9pZCAwXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBTdGFuZGFyZE9wZW5BUElIYW5kbGVyIGV4dGVuZHMgU3RhbmRhcmRIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Iocm91dGVyLCBvcHRpb25zKSB7XG4gICAgY29uc3QganNvblNlcmlhbGl6ZXIgPSBuZXcgU3RhbmRhcmRPcGVuQVBJSnNvblNlcmlhbGl6ZXIob3B0aW9ucyk7XG4gICAgY29uc3QgYnJhY2tldE5vdGF0aW9uU2VyaWFsaXplciA9IG5ldyBTdGFuZGFyZEJyYWNrZXROb3RhdGlvblNlcmlhbGl6ZXIob3B0aW9ucyk7XG4gICAgY29uc3Qgc2VyaWFsaXplciA9IG5ldyBTdGFuZGFyZE9wZW5BUElTZXJpYWxpemVyKGpzb25TZXJpYWxpemVyLCBicmFja2V0Tm90YXRpb25TZXJpYWxpemVyKTtcbiAgICBjb25zdCBtYXRjaGVyID0gbmV3IFN0YW5kYXJkT3BlbkFQSU1hdGNoZXIob3B0aW9ucyk7XG4gICAgY29uc3QgY29kZWMgPSBuZXcgU3RhbmRhcmRPcGVuQVBJQ29kZWMoc2VyaWFsaXplciwgb3B0aW9ucyk7XG4gICAgc3VwZXIocm91dGVyLCBtYXRjaGVyLCBjb2RlYywgb3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU3RhbmRhcmRPcGVuQVBJQ29kZWMgYXMgUywgU3RhbmRhcmRPcGVuQVBJSGFuZGxlciBhcyBhLCBTdGFuZGFyZE9wZW5BUElNYXRjaGVyIGFzIGIsIGRlY29kZVBhcmFtcyBhcyBkLCB0b1JvdTNQYXR0ZXJuIGFzIHQgfTtcbiIsImltcG9ydCB7IEZldGNoSGFuZGxlciB9IGZyb20gJ0BvcnBjL3NlcnZlci9mZXRjaCc7XG5pbXBvcnQgJ0BvcnBjL2NsaWVudCc7XG5pbXBvcnQgJ0BvcnBjL2NvbnRyYWN0JztcbmltcG9ydCAnQG9ycGMvc2hhcmVkJztcbmltcG9ydCB7IGEgYXMgU3RhbmRhcmRPcGVuQVBJSGFuZGxlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9vcGVuYXBpLkRJdC1aOVcxLm1qcyc7XG5pbXBvcnQgJ0BvcnBjL2NsaWVudC9zdGFuZGFyZCc7XG5pbXBvcnQgJ0BvcnBjL3NlcnZlcic7XG5pbXBvcnQgJ3JvdTMnO1xuaW1wb3J0ICdAb3JwYy9vcGVuYXBpLWNsaWVudC9zdGFuZGFyZCc7XG5pbXBvcnQgJ0BvcnBjL3NlcnZlci9zdGFuZGFyZCc7XG5cbmNsYXNzIE9wZW5BUElIYW5kbGVyIGV4dGVuZHMgRmV0Y2hIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Iocm91dGVyLCBvcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihuZXcgU3RhbmRhcmRPcGVuQVBJSGFuZGxlcihyb3V0ZXIsIG9wdGlvbnMpLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQgeyBPcGVuQVBJSGFuZGxlciB9O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FB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