@dbx-tools/appkit-mastra 0.9.153 → 0.9.157

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 (76) hide show
  1. package/README.md +4 -3
  2. package/index.ts +32 -24
  3. package/lib/index.d.ts +32 -24
  4. package/lib/index.js +32 -23
  5. package/lib/src/agents.d.ts +5 -6
  6. package/lib/src/agents.js +12 -15
  7. package/lib/src/chart.js +33 -33
  8. package/lib/src/chat.js +10 -13
  9. package/lib/src/config.d.ts +12 -13
  10. package/lib/src/config.js +4 -4
  11. package/lib/src/evaluation.js +7 -9
  12. package/lib/src/feedback-mode.d.ts +1 -1
  13. package/lib/src/feedback-mode.js +1 -1
  14. package/lib/src/filesystems.js +6 -6
  15. package/lib/src/follow-up-suggestions.js +10 -10
  16. package/lib/src/genie-chat.js +27 -29
  17. package/lib/src/genie.d.ts +2 -2
  18. package/lib/src/genie.js +29 -29
  19. package/lib/src/identity.d.ts +3 -30
  20. package/lib/src/identity.js +2 -27
  21. package/lib/src/memory.d.ts +1 -1
  22. package/lib/src/memory.js +24 -6
  23. package/lib/src/mlflow.d.ts +4 -4
  24. package/lib/src/mlflow.js +15 -18
  25. package/lib/src/model.d.ts +3 -3
  26. package/lib/src/model.js +6 -6
  27. package/lib/src/monty-sandbox.js +8 -8
  28. package/lib/src/observability.d.ts +6 -5
  29. package/lib/src/observability.js +8 -6
  30. package/lib/src/plugin.d.ts +1 -1
  31. package/lib/src/plugin.js +49 -51
  32. package/lib/src/remote-skills.d.ts +3 -4
  33. package/lib/src/remote-skills.js +46 -46
  34. package/lib/src/rest.d.ts +2 -2
  35. package/lib/src/rest.js +3 -3
  36. package/lib/src/server.js +17 -20
  37. package/lib/src/serving.js +10 -11
  38. package/lib/src/statement.js +7 -7
  39. package/lib/src/storage-schema.js +4 -4
  40. package/lib/src/summarize.js +5 -5
  41. package/lib/src/telemetry.d.ts +0 -6
  42. package/lib/src/telemetry.js +34 -41
  43. package/lib/src/validation.js +3 -4
  44. package/lib/src/workspaces.d.ts +2 -2
  45. package/lib/src/workspaces.js +34 -36
  46. package/lib/src/writer.d.ts +2 -2
  47. package/lib/src/writer.js +3 -3
  48. package/package.json +17 -305
  49. package/src/agents.ts +27 -21
  50. package/src/chart.ts +43 -37
  51. package/src/chat.ts +10 -12
  52. package/src/config.ts +14 -15
  53. package/src/evaluation.ts +6 -8
  54. package/src/feedback-mode.ts +1 -1
  55. package/src/filesystems.ts +5 -5
  56. package/src/follow-up-suggestions.ts +9 -9
  57. package/src/genie-chat.ts +32 -31
  58. package/src/genie.ts +29 -29
  59. package/src/identity.ts +3 -38
  60. package/src/memory.ts +24 -6
  61. package/src/mlflow.ts +21 -21
  62. package/src/model.ts +7 -7
  63. package/src/monty-sandbox.ts +7 -7
  64. package/src/observability.ts +8 -6
  65. package/src/plugin.ts +78 -65
  66. package/src/remote-skills.ts +63 -55
  67. package/src/rest.ts +4 -4
  68. package/src/server.ts +32 -20
  69. package/src/serving.ts +14 -11
  70. package/src/statement.ts +10 -6
  71. package/src/storage-schema.ts +3 -3
  72. package/src/summarize.ts +4 -4
  73. package/src/telemetry.ts +49 -55
  74. package/src/validation.ts +2 -3
  75. package/src/workspaces.ts +52 -42
  76. package/src/writer.ts +3 -3
@@ -18,25 +18,22 @@
18
18
  * @module
19
19
  */
20
20
  import { StringDecoder } from "node:string_decoder";
21
- import { telemetry as appkitTelemetry } from "@dbx-tools/appkit";
22
- import { getRequestTags } from "@dbx-tools/appkit/request-tags";
23
- import { environmentUtils, json, log, object, stringUtils } from "@dbx-tools/shared-core";
24
- import { feedback, thread } from "@dbx-tools/shared-mastra";
21
+ import { USER_TRACE_ATTRIBUTE, registerNativeSpanProcessor, getRequestTags, } from "@dbx-tools/appkit";
22
+ import { log, isDatabricksAppEnv, parse, isRecord, trimToNull, USER_EMAIL_HEADER, USER_ID_HEADER, } from "@dbx-tools/shared-core";
23
+ import { MLFLOW_TRACE_ID_HEADER, THREAD_ID_HEADER, THREAD_ID_QUERY, } from "@dbx-tools/shared-mastra";
25
24
  import { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY } from "@mastra/core/request-context";
26
25
  import { context, createContextKey, SpanKind, SpanStatusCode, trace, } from "@opentelemetry/api";
27
26
  import { getRPCMetadata, RPCType } from "@opentelemetry/core";
28
27
  import { MASTRA_AUTH_MODE_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_USER_NAME_KEY } from "./config.js";
29
- import { USER_EMAIL_HEADER, USER_ID_HEADER } from "./identity.js";
30
28
  import { appMlflowTraceInfoConfigured, directMlflowTracingActive, initializeAppMlflowTraceInfo, persistAppMlflowTraceInfo, updateActiveMlflowTrace, updateActiveMlflowTraceTags, } from "./mlflow.js";
31
29
  import { APPKIT_AGENT_TRACE_ROOT_ATTR, MLFLOW_AGENT_TAG, MLFLOW_AGENT_TAG_ATTR, MLFLOW_GENIE_TAG, MLFLOW_GENIE_TAG_ATTR, MLFLOW_LOCAL_TAG, MLFLOW_OBO_AUTH_TAG, MLFLOW_SP_AUTH_TAG, MLFLOW_TRACE_TAG_PREFIX, } from "./trace-attributes.js";
32
- export { MLFLOW_AGENT_TAG, MLFLOW_AGENT_TAG_ATTR, APPKIT_AGENT_TRACE_ROOT_ATTR, MLFLOW_GENIE_TAG, MLFLOW_GENIE_TAG_ATTR, MLFLOW_LOCAL_TAG, MLFLOW_LOCAL_TAG_ATTR, MLFLOW_OBO_AUTH_TAG, MLFLOW_OBO_AUTH_TAG_ATTR, MLFLOW_SP_AUTH_TAG, MLFLOW_SP_AUTH_TAG_ATTR, MLFLOW_TRACE_TAG_PREFIX, } from "./trace-attributes.js";
33
30
  const logger = log.logger("mastra/telemetry");
34
31
  /** Cap on each payload copied onto a span, so one turn cannot bloat the export. */
35
32
  export const TRACE_IO_LIMIT = 8_000;
36
33
  /** Bound for a non-streaming body captured through `res.end` instead of `res.json`. */
37
34
  const RESPONSE_BODY_LIMIT = TRACE_IO_LIMIT * 4;
38
35
  /** Tracer scope used only when AppKit did not create a recording HTTP span. */
39
- const CHAT_TURN_TRACER = "@dbx-tools/appkit-mastra/telemetry";
36
+ const CHAT_TURN_TRACER = "@dbx-tools/appkit-mastra";
40
37
  /**
41
38
  * Mount-relative Mastra agent invoke paths that carry a chat turn body
42
39
  * (`messages`) and stream an assistant answer. Resume / approve verbs
@@ -64,11 +61,6 @@ export const CHAT_GENIE_USED_ATTR = "appkit.mastra.genie.used";
64
61
  export const MLFLOW_SPAN_TYPE_ATTR = "mlflow.spanType";
65
62
  /** GenAI semantic-convention operation name, an alternate span-type source. */
66
63
  export const GEN_AI_OPERATION_NAME_ATTR = "gen_ai.operation.name";
67
- /**
68
- * Root-span user id the MLflow experiment UI's User column reads from OTel
69
- * traces. Prefer the forwarded email when present so the column is human.
70
- */
71
- export const MLFLOW_USER_ATTR = appkitTelemetry.USER_TRACE_ATTRIBUTE;
72
64
  /** Root-span session id that enables the MLflow Sessions tab. */
73
65
  export const MLFLOW_SESSION_ATTR = "session.id";
74
66
  /** Root-span type for a Mastra agent turn. */
@@ -90,23 +82,23 @@ export function stampGenieToolSpan(span = trace.getActiveSpan()) {
90
82
  span.setAttribute(MLFLOW_GENIE_TAG_ATTR, "true");
91
83
  }
92
84
  function requestHeader(req, name) {
93
- const fromMethod = typeof req.header === "function" ? stringUtils.trimToNull(req.header(name)) : undefined;
85
+ const fromMethod = typeof req.header === "function" ? trimToNull(req.header(name)) : undefined;
94
86
  if (fromMethod)
95
87
  return fromMethod;
96
88
  const raw = req.headers?.[name.toLowerCase()];
97
89
  const value = Array.isArray(raw) ? raw[0] : raw;
98
- return stringUtils.trimToNull(typeof value === "string" ? value : undefined) ?? undefined;
90
+ return trimToNull(typeof value === "string" ? value : undefined) ?? undefined;
99
91
  }
100
92
  function requestQuery(req, name) {
101
93
  const raw = req.query?.[name];
102
94
  const value = Array.isArray(raw) ? raw[0] : raw;
103
- return stringUtils.trimToNull(typeof value === "string" ? value : undefined) ?? undefined;
95
+ return trimToNull(typeof value === "string" ? value : undefined) ?? undefined;
104
96
  }
105
97
  function stampMlflowActor(span, req) {
106
98
  const user = requestHeader(req, USER_EMAIL_HEADER) ?? requestHeader(req, USER_ID_HEADER);
107
99
  if (user)
108
- span.setAttribute(MLFLOW_USER_ATTR, user);
109
- const session = requestHeader(req, thread.THREAD_ID_HEADER) ?? requestQuery(req, thread.THREAD_ID_QUERY);
100
+ span.setAttribute(USER_TRACE_ATTRIBUTE, user);
101
+ const session = requestHeader(req, THREAD_ID_HEADER) ?? requestQuery(req, THREAD_ID_QUERY);
110
102
  if (session)
111
103
  span.setAttribute(MLFLOW_SESSION_ATTR, session);
112
104
  return user;
@@ -137,7 +129,7 @@ export function activeChatTracingOptions(options) {
137
129
  };
138
130
  }
139
131
  function setChatTraceTag(state, name, value) {
140
- const tag = stringUtils.trimToNull(name);
132
+ const tag = trimToNull(name);
141
133
  if (!tag)
142
134
  return;
143
135
  state.tags.set(tag, String(value));
@@ -160,7 +152,7 @@ export function recordActiveTraceTags(tags) {
160
152
  }
161
153
  /** Record the first selected model as the active chat trace's `agent` tag. */
162
154
  export function recordActiveTraceModel(modelId) {
163
- const value = stringUtils.trimToNull(modelId);
155
+ const value = trimToNull(modelId);
164
156
  if (!value)
165
157
  return;
166
158
  const state = activeChatTraceState();
@@ -175,7 +167,7 @@ export function recordActiveTraceModel(modelId) {
175
167
  }
176
168
  /** Record the best resolved user identifier on the active chat trace. */
177
169
  export function recordActiveTraceUser(user) {
178
- const value = stringUtils.trimToNull(user);
170
+ const value = trimToNull(user);
179
171
  if (!value)
180
172
  return;
181
173
  const state = activeChatTraceState();
@@ -192,7 +184,7 @@ function stampMlflowTraceId(res, traceId) {
192
184
  return;
193
185
  if (!traceId || traceId === INVALID_TRACE_ID)
194
186
  return;
195
- res.setHeader(feedback.MLFLOW_TRACE_ID_HEADER, `tr-${traceId}`);
187
+ res.setHeader(MLFLOW_TRACE_ID_HEADER, `tr-${traceId}`);
196
188
  }
197
189
  /** Return one raw prompt when the request is exactly one text-only user message. */
198
190
  export function textOnlyChatInput(messages) {
@@ -201,7 +193,7 @@ export function textOnlyChatInput(messages) {
201
193
  if (!Array.isArray(messages) || messages.length !== 1)
202
194
  return undefined;
203
195
  const message = messages[0];
204
- if (!object.isRecord(message) || message.role !== "user")
196
+ if (!isRecord(message) || message.role !== "user")
205
197
  return undefined;
206
198
  if (typeof message.content === "string")
207
199
  return message.content || undefined;
@@ -212,7 +204,7 @@ function textFromParts(value) {
212
204
  return undefined;
213
205
  const text = [];
214
206
  for (const part of value) {
215
- if (!object.isRecord(part) || part.type !== "text" || typeof part.text !== "string") {
207
+ if (!isRecord(part) || part.type !== "text" || typeof part.text !== "string") {
216
208
  return undefined;
217
209
  }
218
210
  text.push(part.text);
@@ -226,14 +218,14 @@ function serialized(value, limit = TRACE_IO_LIMIT) {
226
218
  function sseFrame(line) {
227
219
  if (!line.startsWith("data:"))
228
220
  return undefined;
229
- return json.parse(line.slice(5));
221
+ return parse(line.slice(5));
230
222
  }
231
223
  function valueUsesGenie(value, depth = 0) {
232
224
  if (depth > 3)
233
225
  return false;
234
226
  if (Array.isArray(value))
235
227
  return value.some((item) => valueUsesGenie(item, depth + 1));
236
- if (!object.isRecord(value))
228
+ if (!isRecord(value))
237
229
  return false;
238
230
  if (value.type === "data-genie-progress" ||
239
231
  value.type === "ask_genie_done" ||
@@ -249,11 +241,11 @@ function assistantTextFromSseLine(line) {
249
241
  return assistantTextFromSseFrame(sseFrame(line));
250
242
  }
251
243
  function assistantTextFromSseFrame(frame) {
252
- if (!object.isRecord(frame) || frame.type !== "text-delta")
244
+ if (!isRecord(frame) || frame.type !== "text-delta")
253
245
  return "";
254
246
  const text = typeof frame.delta === "string"
255
247
  ? frame.delta
256
- : object.isRecord(frame.payload)
248
+ : isRecord(frame.payload)
257
249
  ? frame.payload.text
258
250
  : undefined;
259
251
  return typeof text === "string" ? text : "";
@@ -277,7 +269,7 @@ export function assistantTextFromSse(body) {
277
269
  }
278
270
  /** Read the final assistant text from a non-streaming Mastra response. */
279
271
  export function assistantTextFromJson(body) {
280
- if (!object.isRecord(body) || typeof body.text !== "string")
272
+ if (!isRecord(body) || typeof body.text !== "string")
281
273
  return "";
282
274
  return body.text.slice(0, TRACE_IO_LIMIT);
283
275
  }
@@ -290,7 +282,7 @@ const MASTRA_MODEL_METADATA_ATTR = "mastra.metadata.modelMetadata";
290
282
  const MASTRA_METADATA_PREFIX = "mastra.metadata.";
291
283
  function attributeString(span, name) {
292
284
  const value = span.attributes[name];
293
- return typeof value === "string" ? (stringUtils.trimToNull(value) ?? undefined) : undefined;
285
+ return typeof value === "string" ? (trimToNull(value) ?? undefined) : undefined;
294
286
  }
295
287
  function metadataAttribute(key) {
296
288
  return `${MASTRA_METADATA_PREFIX}${key}`;
@@ -299,9 +291,9 @@ function modelFromSpan(span) {
299
291
  const direct = attributeString(span, GEN_AI_REQUEST_MODEL_ATTR);
300
292
  if (direct)
301
293
  return direct;
302
- const metadata = json.parse(attributeString(span, MASTRA_MODEL_METADATA_ATTR));
303
- return object.isRecord(metadata) && typeof metadata.modelId === "string"
304
- ? (stringUtils.trimToNull(metadata.modelId) ?? undefined)
294
+ const metadata = parse(attributeString(span, MASTRA_MODEL_METADATA_ATTR));
295
+ return isRecord(metadata) && typeof metadata.modelId === "string"
296
+ ? (trimToNull(metadata.modelId) ?? undefined)
305
297
  : undefined;
306
298
  }
307
299
  function spanUsesGenie(span) {
@@ -329,13 +321,13 @@ function previewInput(span) {
329
321
  const raw = attributeString(span, MASTRA_AGENT_INPUT_ATTR);
330
322
  if (!raw)
331
323
  return undefined;
332
- return (textOnlyChatInput(json.parse(raw)) ?? raw).slice(0, TRACE_IO_LIMIT);
324
+ return (textOnlyChatInput(parse(raw)) ?? raw).slice(0, TRACE_IO_LIMIT);
333
325
  }
334
326
  function previewOutput(span) {
335
327
  const raw = attributeString(span, MASTRA_AGENT_OUTPUT_ATTR);
336
328
  if (!raw)
337
329
  return undefined;
338
- const parsed = json.parse(raw);
330
+ const parsed = parse(raw);
339
331
  const text = assistantTextFromJson(parsed) || (typeof parsed === "string" ? parsed : raw);
340
332
  return text.slice(0, TRACE_IO_LIMIT);
341
333
  }
@@ -408,7 +400,7 @@ export async function registerAppMlflowTraceInfoProcessor() {
408
400
  if (!appMlflowTraceInfoConfigured())
409
401
  return false;
410
402
  await initializeAppMlflowTraceInfo();
411
- await appkitTelemetry.registerNativeSpanProcessor(new AppMlflowTraceInfoSpanProcessor());
403
+ await registerNativeSpanProcessor(new AppMlflowTraceInfoSpanProcessor());
412
404
  appMlflowTraceInfoProcessorRegistered = true;
413
405
  return true;
414
406
  }
@@ -472,7 +464,7 @@ class AssistantResponseCollector {
472
464
  this.answer += text.slice(0, TRACE_IO_LIMIT - this.answer.length);
473
465
  }
474
466
  jsonAnswer() {
475
- return assistantTextFromJson(json.parse(this.body));
467
+ return assistantTextFromJson(parse(this.body));
476
468
  }
477
469
  }
478
470
  /**
@@ -553,7 +545,7 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
553
545
  parentSpanId: target.span.spanContext().spanId,
554
546
  };
555
547
  const traceRequestTime = Date.now();
556
- if (!environmentUtils.isDatabricksAppEnv()) {
548
+ if (!isDatabricksAppEnv()) {
557
549
  setChatTraceTag(traceState, MLFLOW_LOCAL_TAG, true);
558
550
  }
559
551
  for (const [name, value] of Object.entries(getRequestTags(req))) {
@@ -626,15 +618,16 @@ export function chatTurnTelemetryMiddleware(req, res, next, options = {}) {
626
618
  for (const [name, value] of traceState.tags) {
627
619
  target.span.setAttribute(`${MLFLOW_TRACE_TAG_PREFIX}${name}`, value);
628
620
  }
629
- if (traceState.user)
630
- target.span.setAttribute(MLFLOW_USER_ATTR, traceState.user);
621
+ if (traceState.user) {
622
+ target.span.setAttribute(USER_TRACE_ATTRIBUTE, traceState.user);
623
+ }
631
624
  context.with(trace.setSpan(context.active(), target.span), () => {
632
625
  updateActiveMlflowTrace({
633
626
  ...(Object.keys(tags).length > 0 ? { tags } : {}),
634
627
  ...(traceState.user ? { user: traceState.user } : {}),
635
628
  });
636
629
  });
637
- if (!environmentUtils.isDatabricksAppEnv()) {
630
+ if (!isDatabricksAppEnv()) {
638
631
  persistAppMlflowTraceInfo({
639
632
  traceId: traceState.traceId,
640
633
  requestTime: traceRequestTime,
@@ -701,4 +694,4 @@ export function attachChatTurnTelemetry(app, options = {}) {
701
694
  app.use((req, res, next) => chatTurnTelemetryMiddleware(req, res, next, options));
702
695
  logger.info("chat turn telemetry middleware attached", options);
703
696
  }
704
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFBRSxTQUFTLElBQUksZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzVGLE9BQU8sRUFDTCxPQUFPLEVBQ1AsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDUixjQUFjLEVBQ2QsS0FBSyxHQUdOLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUk5RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHlCQUF5QixFQUN6Qiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2QiwyQkFBMkIsR0FDNUIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFn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SSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDbEYsTUFBTSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5IGVhY2ggTWFzdHJhIGNoYXQgdHVybidzIHJlcXVlc3QvcmVzcG9uc2Ugb250byBpdHMgT1RlbCByb290IHNwYW5cbiAqIHNvIERhdGFicmlja3MtbWFuYWdlZCBNTGZsb3cgY2FuIGRpc3BsYXkgdGhlbS5cbiAqXG4gKiBXaHkgdGhpcyBleGlzdHM6IE1MZmxvdydzIFVDIGA8dGFyZ2V0Pl90cmFjZV91bmlmaWVkYCB2aWV3IHBpY2tzIHRoZVxuICogb25lIHNwYW4gd2hvc2UgYHBhcmVudF9zcGFuX2lkYCBpcyBlbXB0eSBhbmQgcmVhZHMgcmVxdWVzdC9yZXNwb25zZVxuICogZnJvbSBgbWxmbG93LnNwYW5JbnB1dHNgIC8gYG1sZmxvdy5zcGFuT3V0cHV0c2AgKG9yIHRoZSBgZ2VuX2FpLipgXG4gKiBlcXVpdmFsZW50cykgb24gVEhBVCBzcGFuIG9ubHkuIE1hc3RyYSByZWNvcmRzIHRoZSB0dXJuIG9uIGl0c1xuICogYGludm9rZV9hZ2VudGAgY2hpbGQgdW5kZXIgYG1hc3RyYS5hZ2VudF9ydW4uaW5wdXRgIC8gYC5vdXRwdXRgLCBrZXlzXG4gKiB0aGUgdmlldyBuZXZlciByZWFkcywgc28gY2hhdCB0cmFjZXMgYXJyaXZlIHdpdGggYm90aCBjb2x1bW5zIG51bGxcbiAqIGV2ZW4gd2hlbiB0aGUgc3BhbnMgdGhlbXNlbHZlcyBsb29rIGhlYWx0aHkuXG4gKlxuICogQXBwS2l0J3MgSFRUUCBpbnN0cnVtZW50YXRpb24gcmVjb3JkcyB0aGUgc2VydmVyIHNwYW4gaW4gT1RlbCBSUEMgbWV0YWRhdGEsXG4gKiB3aGljaCByZW1haW5zIGF2YWlsYWJsZSBldmVuIHdoZW4gRXhwcmVzcyBtYWtlcyBhIG1pZGRsZXdhcmUtbGF5ZXIgY2hpbGRcbiAqIGFjdGl2ZS4gV2hlbiBpbnN0cnVtZW50YXRpb24gaXMgdW5hdmFpbGFibGUsIHRoaXMgbW9kdWxlIGNyZWF0ZXMgb25lXG4gKiByZXF1ZXN0LWxpZmV0aW1lIHNlcnZlciBzcGFuIGFuZCBydW5zIE1hc3RyYSB1bmRlciBpdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgU3RyaW5nRGVjb2RlciB9IGZyb20gXCJub2RlOnN0cmluZ19kZWNvZGVyXCI7XG5cbmltcG9ydCB7IHRlbGVtZXRyeSBhcyBhcHBraXRUZWxlbWV0cnkgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGdldFJlcXVlc3RUYWdzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L3JlcXVlc3QtdGFnc1wiO1xuaW1wb3J0IHsgZW52aXJvbm1lbnRVdGlscywganNvbiwgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGZlZWRiYWNrLCB0aHJlYWQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgdHlwZSB7IFRyYWNpbmdPcHRpb25zIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9vYnNlcnZhYmlsaXR5XCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBNQVNUUkFfVEhSRUFEX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQge1xuICBjb250ZXh0LFxuICBjcmVhdGVDb250ZXh0S2V5LFxuICBTcGFuS2luZCxcbiAgU3BhblN0YXR1c0NvZGUsXG4gIHRyYWNlLFxuICB0eXBlIENvbnRleHQsXG4gIHR5cGUgU3Bhbixcbn0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgZ2V0UlBDTWV0YWRhdGEsIFJQQ1R5cGUgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZVNwYW4sIFNwYW4gYXMgU2RrU3BhbiwgU3BhblByb2Nlc3NvciB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBNQVNUUkFfQVVUSF9NT0RFX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgVVNFUl9FTUFJTF9IRUFERVIsIFVTRVJfSURfSEVBREVSIH0gZnJvbSBcIi4vaWRlbnRpdHkudHNcIjtcbmltcG9ydCB7XG4gIGFwcE1sZmxvd1RyYWNlSW5mb0NvbmZpZ3VyZWQsXG4gIGRpcmVjdE1sZmxvd1RyYWNpbmdBY3RpdmUsXG4gIGluaXRpYWxpemVBcHBNbGZsb3dUcmFjZUluZm8sXG4gIHBlcnNpc3RBcHBNbGZsb3dUcmFjZUluZm8sXG4gIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlLFxuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZVRhZ3MsXG59IGZyb20gXCIuL21sZmxvdy50c1wiO1xuaW1wb3J0IHtcbiAgQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUixcbiAgTUxGTE9XX0FHRU5UX1RBRyxcbiAgTUxGTE9XX0FHRU5UX1RBR19BVFRSLFxuICBNTEZMT1dfR0VOSUVfVEFHLFxuICBNTEZMT1dfR0VOSUVfVEFHX0FUVFIsXG4gIE1MRkxPV19MT0NBTF9UQUcsXG4gIE1MRkxPV19PQk9fQVVUSF9UQUcsXG4gIE1MRkxPV19TUF9BVVRIX1RBRyxcbiAgTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgsXG59IGZyb20gXCIuL3RyYWNlLWF0dHJpYnV0ZXMudHNcIjtcblxuZXhwb3J0IHtcbiAgTUxGTE9XX0FHRU5UX1RBRyxcbiAgTUxGTE9XX0FHRU5UX1RBR19BVFRSLFxuICBBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSLFxuICBNTEZMT1dfR0VOSUVfVEFHLFxuICBNTEZMT1dfR0VOSUVfVEFHX0FUVFIsXG4gIE1MRkxPV19MT0NBTF9UQUcsXG4gIE1MRkxPV19MT0NBTF9UQUdfQVRUUixcbiAgTUxGTE9XX09CT19BVVRIX1RBRyxcbiAgTUxGTE9XX09CT19BVVRIX1RBR19BVFRSLFxuICBNTEZMT1dfU1BfQVVUSF9UQUcsXG4gIE1MRkxPV19TUF9BVVRIX1RBR19BVFRSLFxuICBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCxcbn0gZnJvbSBcIi4vdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3RlbGVtZXRyeVwiKTtcblxuLyoqIENhcCBvbiBlYWNoIHBheWxvYWQgY29waWVkIG9udG8gYSBzcGFuLCBzbyBvbmUgdHVybiBjYW5ub3QgYmxvYXQgdGhlIGV4cG9ydC4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9JT19MSU1JVCA9IDhfMDAwO1xuXG4vKiogQm91bmQgZm9yIGEgbm9uLXN0cmVhbWluZyBib2R5IGNhcHR1cmVkIHRocm91Z2ggYHJlcy5lbmRgIGluc3RlYWQgb2YgYHJlcy5qc29uYC4gKi9cbmNvbnN0IFJFU1BPTlNFX0JPRFlfTElNSVQgPSBUUkFDRV9JT19MSU1JVCAqIDQ7XG5cbi8qKiBUcmFjZXIgc2NvcGUgdXNlZCBvbmx5IHdoZW4gQXBwS2l0IGRpZCBub3QgY3JlYXRlIGEgcmVjb3JkaW5nIEhUVFAgc3Bhbi4gKi9cbmNvbnN0IENIQVRfVFVSTl9UUkFDRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS90ZWxlbWV0cnlcIjtcblxuLyoqXG4gKiBNb3VudC1yZWxhdGl2ZSBNYXN0cmEgYWdlbnQgaW52b2tlIHBhdGhzIHRoYXQgY2FycnkgYSBjaGF0IHR1cm4gYm9keVxuICogKGBtZXNzYWdlc2ApIGFuZCBzdHJlYW0gYW4gYXNzaXN0YW50IGFuc3dlci4gUmVzdW1lIC8gYXBwcm92ZSB2ZXJic1xuICogYXJlIGludGVudGlvbmFsbHkgZXhjbHVkZWQ6IHRoZWlyIGJvZGllcyBhcmUgdG9vbCBkZWNpc2lvbnMsIG5vdCB0aGVcbiAqIHVzZXIgcHJvbXB0LCBhbmQgdGhleSByYXJlbHkgcHJvZHVjZSBhIGZyZXNoIGFuc3dlciB3b3J0aCBzdXJmYWNpbmcuXG4gKi9cbmNvbnN0IEFHRU5UX1RVUk5fUk9VVEUgPSAvKD86XnxcXC8pKD86YWdlbnRzXFwvW14vXStcXC8oPzpzdHJlYW18Z2VuZXJhdGUpfGNoYXRcXC9bXi9dKylcXC8/JC9pO1xuXG4vKiogQXR0cmlidXRlIGtleXMgdGhlIE1MZmxvdyBVQyBgKl90cmFjZV91bmlmaWVkYCB2aWV3IHJlYWRzIGZyb20gdGhlIHJvb3Qgc3Bhbi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9JTlBVVFNfQVRUUiA9IFwibWxmbG93LnNwYW5JbnB1dHNcIjtcbi8qKiBSb290LXNwYW4gYXR0cmlidXRlIGNvbnN1bWVkIGFzIGNoYXQgb3V0cHV0IGJ5IE1MZmxvdyB1bmlmaWVkIHRyYWNlIHZpZXdzLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX09VVFBVVFNfQVRUUiA9IFwibWxmbG93LnNwYW5PdXRwdXRzXCI7XG4vKiogRnVsbCBzZXJpYWxpemVkIHJlcXVlc3QgbWVzc2FnZXMgcmV0YWluZWQgd2hlbiB0aGUgTUxmbG93IHByZXZpZXcgaXMgcGxhaW4gdGV4dC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX01FU1NBR0VTX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuY2hhdC5tZXNzYWdlc1wiO1xuLyoqIEZ1bGwgc2VyaWFsaXplZCByZXNwb25zZSByZXRhaW5lZCB3aGVuIHRoZSBNTGZsb3cgcHJldmlldyBpcyBwbGFpbiB0ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfUkVTUE9OU0VfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5jaGF0LnJlc3BvbnNlXCI7XG4vKiogQ3JlZGVudGlhbCBtb2RlIHVzZWQgYnkgRGF0YWJyaWNrcyBjYWxscyBpbiB0aGlzIGNoYXQgdHVybi4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX0lERU5USVRZX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuaWRlbnRpdHkubW9kZVwiO1xuLyoqIFdoZXRoZXIgdGhlIHN0cmVhbWVkIHR1cm4gZW1pdHRlZCBhIEdlbmllIHRvb2wgb3IgcHJvZ3Jlc3MgZXZlbnQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9HRU5JRV9VU0VEX0FUVFIgPSBcImFwcGtpdC5tYXN0cmEuZ2VuaWUudXNlZFwiO1xuLyoqXG4gKiBNTGZsb3cgc3Bhbi10eXBlIGF0dHJpYnV0ZS4gRGF0YWJyaWNrcyBtYXBzIHRoaXMgKG9yIGBnZW5fYWkub3BlcmF0aW9uLm5hbWVgKVxuICogb250byB0aGUgdHlwZSBjaGlwIGluIHRoZSBleHBlcmltZW50IFVJLiBDdXN0b20gdmFsdWVzIHN1Y2ggYXMgYEdFTklFYCBhcmVcbiAqIGFsbG93ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9UWVBFX0FUVFIgPSBcIm1sZmxvdy5zcGFuVHlwZVwiO1xuLyoqIEdlbkFJIHNlbWFudGljLWNvbnZlbnRpb24gb3BlcmF0aW9uIG5hbWUsIGFuIGFsdGVybmF0ZSBzcGFuLXR5cGUgc291cmNlLiAqL1xuZXhwb3J0IGNvbnN0IEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSID0gXCJnZW5fYWkub3BlcmF0aW9uLm5hbWVcIjtcbi8qKlxuICogUm9vdC1zcGFuIHVzZXIgaWQgdGhlIE1MZmxvdyBleHBlcmltZW50IFVJJ3MgVXNlciBjb2x1bW4gcmVhZHMgZnJvbSBPVGVsXG4gKiB0cmFjZXMuIFByZWZlciB0aGUgZm9yd2FyZGVkIGVtYWlsIHdoZW4gcHJlc2VudCBzbyB0aGUgY29sdW1uIGlzIGh1bWFuLlxuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1VTRVJfQVRUUiA9IGFwcGtpdFRlbGVtZXRyeS5VU0VSX1RSQUNFX0FUVFJJQlVURTtcbi8qKiBSb290LXNwYW4gc2Vzc2lvbiBpZCB0aGF0IGVuYWJsZXMgdGhlIE1MZmxvdyBTZXNzaW9ucyB0YWIuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NFU1NJT05fQVRUUiA9IFwic2Vzc2lvbi5pZFwiO1xuLyoqIFJvb3Qtc3BhbiB0eXBlIGZvciBhIE1hc3RyYSBhZ2VudCB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQgPSBcIkFHRU5UXCI7XG4vKiogU3BhbiB0eXBlIGZvciBhbiBgYXNrX2dlbmllYCB0b29sIGNhbGwuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9HRU5JRSA9IFwiR0VOSUVcIjtcblxuLyoqIFJvb3Qtc3BhbiBtZXRhZGF0YSBrbm93biBiZWZvcmUgYSBjaGF0IHJlcXVlc3QgaXMgZGlzcGF0Y2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zIHtcbiAgcmVhZG9ubHkgaWRlbnRpdHk/OlxuICAgIFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIgfCAoKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCkgPT4gXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIik7XG4gIC8qKiBJbml0aWFsIHRyYWNlIHRhZ3MgZGVyaXZlZCBmcm9tIHRoZSBpbmJvdW5kIHJlcXVlc3QuICovXG4gIHJlYWRvbmx5IHRhZ3M/OlxuICAgIHwgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+PlxuICAgIHwgKChyZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QpID0+IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYXRUcmFjZVRhZ1ZhbHVlIHwgdW5kZWZpbmVkPj4pO1xufVxuXG5pbnRlcmZhY2UgVHJhY2VUYXJnZXQge1xuICBzcGFuOiBTcGFuO1xuICBvd25lZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENoYXRUcmFjZVN0YXRlIHtcbiAgcmVhZG9ubHkgdGFnczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgcmVhZG9ubHkgdHJhY2VJZDogc3RyaW5nO1xuICByZWFkb25seSBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIGZpcnN0TW9kZWw/OiBzdHJpbmc7XG4gIHVzZXI/OiBzdHJpbmc7XG59XG5cbi8qKiBWYWx1ZXMgYWNjZXB0ZWQgYnkgcmVxdWVzdC1zY29wZWQgdHJhY2UtdGFnIGluamVjdGlvbiBoZWxwZXJzLiAqL1xuZXhwb3J0IHR5cGUgQ2hhdFRyYWNlVGFnVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuO1xuXG5jb25zdCBDSEFUX1RSQUNFX1NUQVRFX0tFWSA9IGNyZWF0ZUNvbnRleHRLZXkoXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmEvY2hhdC10cmFjZS1zdGF0ZVwiKTtcblxuLyoqIE9wZW5UZWxlbWV0cnkncyBzZW50aW5lbCBmb3IgXCJubyB2YWxpZCB0cmFjZVwiIC0gMzIgemVybyBoZXggY2hhcnMuICovXG5jb25zdCBJTlZBTElEX1RSQUNFX0lEID0gXCIwXCIucmVwZWF0KDMyKTtcblxuLyoqXG4gKiBNYXJrIHRoZSBhY3RpdmUgc3BhbiBhcyBhIEdlbmllIGNhbGwgc28gdGhlIGV4cGVyaW1lbnQgVUkgdHlwZXMgaXQgYEdFTklFYFxuICogYW5kIHRhZ3MgdGhlIHRyYWNlIGBnZW5pZT10cnVlYC4gU2FmZSBuby1vcCB3aGVuIG5vIHJlY29yZGluZyBzcGFuIGlzIGFjdGl2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YW1wR2VuaWVUb29sU3BhbihzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogdm9pZCB7XG4gIGlmICghc3Bhbj8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuO1xuICBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfR0VOSUUpO1xuICBzcGFuLnNldEF0dHJpYnV0ZShHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUiwgXCJleGVjdXRlX3Rvb2xcIik7XG4gIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0SGVhZGVyKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBmcm9tTWV0aG9kID1cbiAgICB0eXBlb2YgcmVxLmhlYWRlciA9PT0gXCJmdW5jdGlvblwiID8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXEuaGVhZGVyKG5hbWUpKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGZyb21NZXRob2QpIHJldHVybiBmcm9tTWV0aG9kO1xuICBjb25zdCByYXcgPSByZXEuaGVhZGVycz8uW25hbWUudG9Mb3dlckNhc2UoKV07XG4gIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UXVlcnkocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHJlcS5xdWVyeT8uW25hbWVdO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RhbXBNbGZsb3dBY3RvcihzcGFuOiBTcGFuLCByZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0SGVhZGVyKHJlcSwgVVNFUl9FTUFJTF9IRUFERVIpID8/IHJlcXVlc3RIZWFkZXIocmVxLCBVU0VSX0lEX0hFQURFUik7XG4gIGlmICh1c2VyKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfVVNFUl9BVFRSLCB1c2VyKTtcbiAgY29uc3Qgc2Vzc2lvbiA9XG4gICAgcmVxdWVzdEhlYWRlcihyZXEsIHRocmVhZC5USFJFQURfSURfSEVBREVSKSA/PyByZXF1ZXN0UXVlcnkocmVxLCB0aHJlYWQuVEhSRUFEX0lEX1FVRVJZKTtcbiAgaWYgKHNlc3Npb24pIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TRVNTSU9OX0FUVFIsIHNlc3Npb24pO1xuICByZXR1cm4gdXNlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2VJZChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuPy5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gIHJldHVybiB2YWx1ZSAmJiB2YWx1ZSAhPT0gSU5WQUxJRF9UUkFDRV9JRCA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpOiBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmFjdGl2ZSgpLmdldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZKSBhcyBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCaW5kIGEgTWFzdHJhIGFnZW50IHJ1biB0byB0aGUgdHJhY2Ugc2VsZWN0ZWQgYnkgY2hhdCB0ZWxlbWV0cnkuXG4gKlxuICogRGF0YWJyaWNrcyBBcHBzIHVzZXMgYSBkZWRpY2F0ZWQgYWdlbnQgdHJhY2UgYmVjYXVzZSBldmVudGVkIGFnZW50cyBmaW5pc2hcbiAqIGJlZm9yZSB0aGUgSFRUUCBzZXJ2ZXIgc3Bhbi4gUHJvbW90aW5nIE1MZmxvdyB0cmFjZSBpbmZvIGFmdGVyIHRoZSBhZ2VudCByb290XG4gKiBjbG9zZXMgYXZvaWRzIHRoZSBzaWRlY2FyIHJlcGxhY2luZyBjbGVhbiBwcmV2aWV3cyBhbmQgdGFncyB3aXRoIGVtcHR5IEhUVFBcbiAqIHRyYWNlIG1ldGFkYXRhLiBPdGhlciBydW50aW1lcyByZXRhaW4gdGhlIGV4aXN0aW5nIEhUVFAvbG9jYWwgcGFyZW50YWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZlQ2hhdFRyYWNpbmdPcHRpb25zKFxuICBvcHRpb25zOiBUcmFjaW5nT3B0aW9ucyB8IHVuZGVmaW5lZCxcbik6IFRyYWNpbmdPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoIXN0YXRlKSByZXR1cm4gb3B0aW9ucztcbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHRyYWNlSWQ6IHN0YXRlLnRyYWNlSWQsXG4gICAgLi4uKHN0YXRlLnBhcmVudFNwYW5JZCA/IHsgcGFyZW50U3BhbklkOiBzdGF0ZS5wYXJlbnRTcGFuSWQgfSA6IHsgcGFyZW50U3BhbklkOiB1bmRlZmluZWQgfSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNldENoYXRUcmFjZVRhZyhzdGF0ZTogQ2hhdFRyYWNlU3RhdGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IENoYXRUcmFjZVRhZ1ZhbHVlKTogdm9pZCB7XG4gIGNvbnN0IHRhZyA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobmFtZSk7XG4gIGlmICghdGFnKSByZXR1cm47XG4gIHN0YXRlLnRhZ3Muc2V0KHRhZywgU3RyaW5nKHZhbHVlKSk7XG59XG5cbi8qKiBJbmplY3Qgb25lIE1MZmxvdyB0cmFjZSB0YWcgaW50byB0aGUgYWN0aXZlIGNoYXQgcmVxdWVzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVRhZyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBDaGF0VHJhY2VUYWdWYWx1ZSA9IHRydWUpOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoc3RhdGUpIHNldENoYXRUcmFjZVRhZyhzdGF0ZSwgbmFtZSwgdmFsdWUpO1xufVxuXG4vKiogSW5qZWN0IG11bHRpcGxlIE1MZmxvdyB0cmFjZSB0YWdzIGludG8gdGhlIGFjdGl2ZSBjaGF0IHJlcXVlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VUYWdzKFxuICB0YWdzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+LFxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSkgcmV0dXJuO1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncykpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqIFJlY29yZCB0aGUgZmlyc3Qgc2VsZWN0ZWQgbW9kZWwgYXMgdGhlIGFjdGl2ZSBjaGF0IHRyYWNlJ3MgYGFnZW50YCB0YWcuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VNb2RlbChtb2RlbElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG1vZGVsSWQpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSB8fCBzdGF0ZS5maXJzdE1vZGVsKSByZXR1cm47XG4gIHN0YXRlLmZpcnN0TW9kZWwgPSB2YWx1ZTtcbiAgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBNTEZMT1dfQUdFTlRfVEFHLCB2YWx1ZSk7XG4gIGNvbnN0IHNwYW4gPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCk7XG4gIGlmIChzcGFuPy5pc1JlY29yZGluZygpKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfQUdFTlRfVEFHX0FUVFIsIHZhbHVlKTtcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzKHsgW01MRkxPV19BR0VOVF9UQUddOiB2YWx1ZSB9KTtcbn1cblxuLyoqIFJlY29yZCB0aGUgYmVzdCByZXNvbHZlZCB1c2VyIGlkZW50aWZpZXIgb24gdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlVXNlcih1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHVzZXIpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKHN0YXRlKSBzdGF0ZS51c2VyID0gdmFsdWU7XG59XG5cbi8qKiBSZWNvcmQgb25lIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gbW9kZSB1c2VkIGR1cmluZyB0aGUgYWN0aXZlIGNoYXQgdHJhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VBdXRoKGF1dGg6IFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIpOiB2b2lkIHtcbiAgcmVjb3JkQWN0aXZlVHJhY2VUYWcoYXV0aCA9PT0gXCJvYm9cIiA/IE1MRkxPV19PQk9fQVVUSF9UQUcgOiBNTEZMT1dfU1BfQVVUSF9UQUcpO1xufVxuXG4vKiogUHVibGlzaCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBiZWZvcmUgdGhlIGhhbmRsZXIgd3JpdGVzIHRoZSBib2R5LiAqL1xuZnVuY3Rpb24gc3RhbXBNbGZsb3dUcmFjZUlkKHJlczogZXhwcmVzcy5SZXNwb25zZSwgdHJhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgaWYgKCF0cmFjZUlkIHx8IHRyYWNlSWQgPT09IElOVkFMSURfVFJBQ0VfSUQpIHJldHVybjtcbiAgcmVzLnNldEhlYWRlcihmZWVkYmFjay5NTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xufVxuXG4vKiogUmV0dXJuIG9uZSByYXcgcHJvbXB0IHdoZW4gdGhlIHJlcXVlc3QgaXMgZXhhY3RseSBvbmUgdGV4dC1vbmx5IHVzZXIgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlczogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZXMgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlcyB8fCB1bmRlZmluZWQ7XG4gIGlmICghQXJyYXkuaXNBcnJheShtZXNzYWdlcykgfHwgbWVzc2FnZXMubGVuZ3RoICE9PSAxKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKG1lc3NhZ2UpIHx8IG1lc3NhZ2Uucm9sZSAhPT0gXCJ1c2VyXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbWVzc2FnZS5jb250ZW50ID09PSBcInN0cmluZ1wiKSByZXR1cm4gbWVzc2FnZS5jb250ZW50IHx8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRleHRGcm9tUGFydHMobWVzc2FnZS5wYXJ0cykgPz8gdGV4dEZyb21QYXJ0cyhtZXNzYWdlLmNvbnRlbnQpO1xufVxuXG5mdW5jdGlvbiB0ZXh0RnJvbVBhcnRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHRleHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcGFydCBvZiB2YWx1ZSkge1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnQpIHx8IHBhcnQudHlwZSAhPT0gXCJ0ZXh0XCIgfHwgdHlwZW9mIHBhcnQudGV4dCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGV4dC5wdXNoKHBhcnQudGV4dCk7XG4gIH1cbiAgY29uc3Qgam9pbmVkID0gdGV4dC5qb2luKFwiXCIpO1xuICByZXR1cm4gam9pbmVkIHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplZCh2YWx1ZTogdW5rbm93biwgbGltaXQgPSBUUkFDRV9JT19MSU1JVCk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk/LnNsaWNlKDAsIGxpbWl0KSA/PyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIGxpbWl0KTtcbn1cblxuZnVuY3Rpb24gc3NlRnJhbWUobGluZTogc3RyaW5nKTogdW5rbm93biB7XG4gIGlmICghbGluZS5zdGFydHNXaXRoKFwiZGF0YTpcIikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBqc29uLnBhcnNlKGxpbmUuc2xpY2UoNSkpO1xufVxuXG5mdW5jdGlvbiB2YWx1ZVVzZXNHZW5pZSh2YWx1ZTogdW5rbm93biwgZGVwdGggPSAwKTogYm9vbGVhbiB7XG4gIGlmIChkZXB0aCA+IDMpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuc29tZSgoaXRlbSkgPT4gdmFsdWVVc2VzR2VuaWUoaXRlbSwgZGVwdGggKyAxKSk7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoXG4gICAgdmFsdWUudHlwZSA9PT0gXCJkYXRhLWdlbmllLXByb2dyZXNzXCIgfHxcbiAgICB2YWx1ZS50eXBlID09PSBcImFza19nZW5pZV9kb25lXCIgfHxcbiAgICB2YWx1ZS50b29sTmFtZSA9PT0gXCJhc2tfZ2VuaWVcIiB8fFxuICAgIHZhbHVlLnRvb2xfbmFtZSA9PT0gXCJhc2tfZ2VuaWVcIiB8fFxuICAgIHZhbHVlLm5hbWUgPT09IFwiYXNrX2dlbmllXCJcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIFtcImRhdGFcIiwgXCJldmVudFwiLCBcInBheWxvYWRcIl0uc29tZSgoa2V5KSA9PiB2YWx1ZVVzZXNHZW5pZSh2YWx1ZVtrZXldLCBkZXB0aCArIDEpKTtcbn1cblxuLyoqIFJldHVybiB0aGUgYXNzaXN0YW50IHRleHQgZnJvbSBvbmUgU1NFIGxpbmUsIG9yIGFuIGVtcHR5IHN0cmluZy4gKi9cbmZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlTGluZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShzc2VGcmFtZShsaW5lKSk7XG59XG5cbmZ1bmN0aW9uIGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoZnJhbWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChmcmFtZSkgfHwgZnJhbWUudHlwZSAhPT0gXCJ0ZXh0LWRlbHRhXCIpIHJldHVybiBcIlwiO1xuICBjb25zdCB0ZXh0ID1cbiAgICB0eXBlb2YgZnJhbWUuZGVsdGEgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZnJhbWUuZGVsdGFcbiAgICAgIDogb2JqZWN0LmlzUmVjb3JkKGZyYW1lLnBheWxvYWQpXG4gICAgICAgID8gZnJhbWUucGF5bG9hZC50ZXh0XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIHRleHQgPT09IFwic3RyaW5nXCIgPyB0ZXh0IDogXCJcIjtcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZSB0aGUgYXNzaXN0YW50J3MgYW5zd2VyIG91dCBvZiBhbiBBSSBTREsgU1NFIHRyYW5zY3JpcHQuXG4gKlxuICogVGhlIGFnZW50IHN0cmVhbXMgaXRzIHJlcGx5IGFzIGB0ZXh0LWRlbHRhYCBmcmFtZXNcbiAqIChgZGF0YToge1widHlwZVwiOlwidGV4dC1kZWx0YVwiLFwicGF5bG9hZFwiOntcInRleHRcIjpcIi4uLlwifX1gKSwgc28gdGhlIGZ1bGxcbiAqIGFuc3dlciBvbmx5IGV2ZXIgZXhpc3RzIGFzIGRlbHRhcyBvbiB0aGUgd2lyZSBhbmQgaGFzIHRvIGJlXG4gKiByZWFzc2VtYmxlZCBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Tc2UoYm9keTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBib2R5LnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tU3NlTGluZShsaW5lKTtcbiAgICBpZiAodGV4dCkgcGFydHMucHVzaCh0ZXh0KTtcbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihcIlwiKS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG59XG5cbi8qKiBSZWFkIHRoZSBmaW5hbCBhc3Npc3RhbnQgdGV4dCBmcm9tIGEgbm9uLXN0cmVhbWluZyBNYXN0cmEgcmVzcG9uc2UuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHk6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChib2R5KSB8fCB0eXBlb2YgYm9keS50ZXh0ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGJvZHkudGV4dC5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG59XG5cbmNvbnN0IE1BU1RSQV9BR0VOVF9JTlBVVF9BVFRSID0gXCJtYXN0cmEuYWdlbnRfcnVuLmlucHV0XCI7XG5jb25zdCBNQVNUUkFfQUdFTlRfT1VUUFVUX0FUVFIgPSBcIm1hc3RyYS5hZ2VudF9ydW4ub3V0cHV0XCI7XG5jb25zdCBHRU5fQUlfUkVRVUVTVF9NT0RFTF9BVFRSID0gXCJnZW5fYWkucmVxdWVzdC5tb2RlbFwiO1xuY29uc3QgR0VOX0FJX0FHRU5UX0lEX0FUVFIgPSBcImdlbl9haS5hZ2VudC5pZFwiO1xuY29uc3QgR0VOX0FJX0FHRU5UX05BTUVfQVRUUiA9IFwiZ2VuX2FpLmFnZW50Lm5hbWVcIjtcbmNvbnN0IE1BU1RSQV9NT0RFTF9NRVRBREFUQV9BVFRSID0gXCJtYXN0cmEubWV0YWRhdGEubW9kZWxNZXRhZGF0YVwiO1xuY29uc3QgTUFTVFJBX01FVEFEQVRBX1BSRUZJWCA9IFwibWFzdHJhLm1ldGFkYXRhLlwiO1xuXG5pbnRlcmZhY2UgQXBwTWxmbG93VHJhY2VTdGF0ZSB7XG4gIHJlYWRvbmx5IHRhZ3M6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIGdlbmllOiBib29sZWFuO1xuICBtb2RlbD86IHN0cmluZztcbn1cblxuZnVuY3Rpb24gYXR0cmlidXRlU3RyaW5nKHNwYW46IFJlYWRhYmxlU3BhbiwgbmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuLmF0dHJpYnV0ZXNbbmFtZV07XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyAoc3RyaW5nVXRpbHMudHJpbVRvTnVsbCh2YWx1ZSkgPz8gdW5kZWZpbmVkKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbWV0YWRhdGFBdHRyaWJ1dGUoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7TUFTVFJBX01FVEFEQVRBX1BSRUZJWH0ke2tleX1gO1xufVxuXG5mdW5jdGlvbiBtb2RlbEZyb21TcGFuKHNwYW46IFJlYWRhYmxlU3Bhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRpcmVjdCA9IGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBHRU5fQUlfUkVRVUVTVF9NT0RFTF9BVFRSKTtcbiAgaWYgKGRpcmVjdCkgcmV0dXJuIGRpcmVjdDtcbiAgY29uc3QgbWV0YWRhdGEgPSBqc29uLnBhcnNlKGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBNQVNUUkFfTU9ERUxfTUVUQURBVEFfQVRUUikpO1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKG1ldGFkYXRhKSAmJiB0eXBlb2YgbWV0YWRhdGEubW9kZWxJZCA9PT0gXCJzdHJpbmdcIlxuICAgID8gKHN0cmluZ1V0aWxzLnRyaW1Ub051bGwobWV0YWRhdGEubW9kZWxJZCkgPz8gdW5kZWZpbmVkKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBzcGFuVXNlc0dlbmllKHNwYW46IFJlYWRhYmxlU3Bhbik6IGJvb2xlYW4ge1xuICBpZiAoc3Bhbi5hdHRyaWJ1dGVzW01MRkxPV19HRU5JRV9UQUdfQVRUUl0gPT09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKC9cXGJhc2tfZ2VuaWUoPzpffFxcYikvaS50ZXN0KHNwYW4ubmFtZSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gW1wiZ2VuX2FpLnRvb2wubmFtZVwiLCBcIm1hc3RyYS50b29sX2NhbGwubmFtZVwiXS5zb21lKChuYW1lKSA9PlxuICAgIC9eYXNrX2dlbmllKD86X3wkKS9pLnRlc3QoYXR0cmlidXRlU3RyaW5nKHNwYW4sIG5hbWUpID8/IFwiXCIpLFxuICApO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0VHJhY2VUYWdzKHNwYW46IFJlYWRhYmxlU3Bhbiwgc3RhdGU6IEFwcE1sZmxvd1RyYWNlU3RhdGUpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNwYW4uYXR0cmlidXRlcykpIHtcbiAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aChNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHRhZyA9IG5hbWUuc2xpY2UoTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgubGVuZ3RoKTtcbiAgICBpZiAoXG4gICAgICB0YWcgJiZcbiAgICAgICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpXG4gICAgKSB7XG4gICAgICBzdGF0ZS50YWdzLnNldCh0YWcsIFN0cmluZyh2YWx1ZSkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBoclRpbWVNaWxsaXNlY29uZHModmFsdWU6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0pOiBudW1iZXIge1xuICByZXR1cm4gdmFsdWVbMF0gKiAxXzAwMCArIHZhbHVlWzFdIC8gMV8wMDBfMDAwO1xufVxuXG5mdW5jdGlvbiBwcmV2aWV3SW5wdXQoc3BhbjogUmVhZGFibGVTcGFuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gYXR0cmlidXRlU3RyaW5nKHNwYW4sIE1BU1RSQV9BR0VOVF9JTlBVVF9BVFRSKTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAodGV4dE9ubHlDaGF0SW5wdXQoanNvbi5wYXJzZShyYXcpKSA/PyByYXcpLnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbn1cblxuZnVuY3Rpb24gcHJldmlld091dHB1dChzcGFuOiBSZWFkYWJsZVNwYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgTUFTVFJBX0FHRU5UX09VVFBVVF9BVFRSKTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2UocmF3KTtcbiAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tSnNvbihwYXJzZWQpIHx8ICh0eXBlb2YgcGFyc2VkID09PSBcInN0cmluZ1wiID8gcGFyc2VkIDogcmF3KTtcbiAgcmV0dXJuIHRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogUHJvbW90ZSB0aGUgYWN0dWFsIE1hc3RyYSBgaW52b2tlX2FnZW50YCB0cmFjZSBleHBvcnRlZCBieSBBcHBLaXQncyBwcm92aWRlci4gKi9cbmV4cG9ydCBjbGFzcyBBcHBNbGZsb3dUcmFjZUluZm9TcGFuUHJvY2Vzc29yIGltcGxlbWVudHMgU3BhblByb2Nlc3NvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhY2VzID0gbmV3IE1hcDxzdHJpbmcsIEFwcE1sZmxvd1RyYWNlU3RhdGU+KCk7XG5cbiAgb25TdGFydChzcGFuOiBTZGtTcGFuLCBfcGFyZW50Q29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBpZiAoIXRoaXMudHJhY2VzLmhhcyh0cmFjZUlkKSkge1xuICAgICAgdGhpcy50cmFjZXMuc2V0KHRyYWNlSWQsIHsgdGFnczogbmV3IE1hcCgpLCBnZW5pZTogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgb25FbmQoc3BhbjogUmVhZGFibGVTcGFuKTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGNvbnN0IHN0YXRlOiBBcHBNbGZsb3dUcmFjZVN0YXRlID0gdGhpcy50cmFjZXMuZ2V0KHRyYWNlSWQpID8/IHtcbiAgICAgIHRhZ3M6IG5ldyBNYXAoKSxcbiAgICAgIGdlbmllOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMudHJhY2VzLnNldCh0cmFjZUlkLCBzdGF0ZSk7XG4gICAgY29sbGVjdFRyYWNlVGFncyhzcGFuLCBzdGF0ZSk7XG4gICAgc3RhdGUubW9kZWwgPz89IG1vZGVsRnJvbVNwYW4oc3Bhbik7XG4gICAgc3RhdGUuZ2VuaWUgfHw9IHNwYW5Vc2VzR2VuaWUoc3Bhbik7XG5cbiAgICBpZiAoYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSKSAhPT0gXCJpbnZva2VfYWdlbnRcIikge1xuICAgICAgaWYgKCFzcGFuLnBhcmVudFNwYW5Db250ZXh0Py5zcGFuSWQpIHRoaXMudHJhY2VzLmRlbGV0ZSh0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2VudCA9XG4gICAgICBzdGF0ZS5tb2RlbCA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9JRF9BVFRSKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9OQU1FX0FUVFIpO1xuICAgIGlmIChhZ2VudCkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0FHRU5UX1RBRywgYWdlbnQpO1xuICAgIGlmIChzdGF0ZS5nZW5pZSkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0dFTklFX1RBRywgXCJ0cnVlXCIpO1xuICAgIGNvbnN0IGF1dGggPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgbWV0YWRhdGFBdHRyaWJ1dGUoTUFTVFJBX0FVVEhfTU9ERV9LRVkpKTtcbiAgICBpZiAoYXV0aCA9PT0gXCJvYm9cIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX09CT19BVVRIX1RBRywgXCJ0cnVlXCIpO1xuICAgIGVsc2UgaWYgKGF1dGggPT09IFwic2VydmljZS1wcmluY2lwYWxcIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX1NQX0FVVEhfVEFHLCBcInRydWVcIik7XG5cbiAgICBjb25zdCB1c2VyID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVVNFUl9FTUFJTF9LRVkpKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIG1ldGFkYXRhQXR0cmlidXRlKE1BU1RSQV9VU0VSX05BTUVfS0VZKSkgPz9cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSk7XG4gICAgY29uc3Qgc2Vzc2lvbklkID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVEhSRUFEX0lEX0tFWSkpID8/XG4gICAgICBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgXCJnZW5fYWkuY29udmVyc2F0aW9uLmlkXCIpO1xuICAgIGNvbnN0IHJlcXVlc3RQcmV2aWV3ID0gcHJldmlld0lucHV0KHNwYW4pO1xuICAgIGNvbnN0IHJlc3BvbnNlUHJldmlldyA9IHByZXZpZXdPdXRwdXQoc3Bhbik7XG4gICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICB0cmFjZUlkLFxuICAgICAgcmVxdWVzdFRpbWU6IGhyVGltZU1pbGxpc2Vjb25kcyhzcGFuLnN0YXJ0VGltZSksXG4gICAgICBleGVjdXRpb25EdXJhdGlvbjogaHJUaW1lTWlsbGlzZWNvbmRzKHNwYW4uZHVyYXRpb24pLFxuICAgICAgZXJyb3I6IHNwYW4uc3RhdHVzLmNvZGUgPT09IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgdGFnczogT2JqZWN0LmZyb21FbnRyaWVzKHN0YXRlLnRhZ3MpLFxuICAgICAgLi4uKHVzZXIgPyB7IHVzZXIgfSA6IHt9KSxcbiAgICAgIC4uLihzZXNzaW9uSWQgPyB7IHNlc3Npb25JZCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgfSk7XG4gICAgdGhpcy50cmFjZXMuZGVsZXRlKHRyYWNlSWQpO1xuICB9XG5cbiAgYXN5bmMgZm9yY2VGbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy50cmFjZXMuY2xlYXIoKTtcbiAgfVxufVxuXG5sZXQgYXBwTWxmbG93VHJhY2VJbmZvUHJvY2Vzc29yUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogUmVnaXN0ZXIgdHJhY2UgZW5yaWNobWVudCBiZWZvcmUgQXBwS2l0IGNvbnN0cnVjdHMgaXRzIG5hdGl2ZSBwcm92aWRlci4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvcigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvclJlZ2lzdGVyZWQpIHJldHVybiB0cnVlO1xuICBpZiAoIWFwcE1sZmxvd1RyYWNlSW5mb0NvbmZpZ3VyZWQoKSkgcmV0dXJuIGZhbHNlO1xuICBhd2FpdCBpbml0aWFsaXplQXBwTWxmbG93VHJhY2VJbmZvKCk7XG4gIGF3YWl0IGFwcGtpdFRlbGVtZXRyeS5yZWdpc3Rlck5hdGl2ZVNwYW5Qcm9jZXNzb3IobmV3IEFwcE1sZmxvd1RyYWNlSW5mb1NwYW5Qcm9jZXNzb3IoKSk7XG4gIGFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvclJlZ2lzdGVyZWQgPSB0cnVlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIEluY3JlbWVudGFsbHkgYXNzZW1ibGUgVVRGLTggU1NFIHRleHQgd2hpbGUgcmV0YWluaW5nIGEgYm91bmRlZCBKU09OIGZhbGxiYWNrLiAqL1xuY2xhc3MgQXNzaXN0YW50UmVzcG9uc2VDb2xsZWN0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihcInV0ZjhcIik7XG4gIHByaXZhdGUgYW5zd2VyID0gXCJcIjtcbiAgcHJpdmF0ZSBib2R5ID0gXCJcIjtcbiAgcHJpdmF0ZSBwZW5kaW5nTGluZSA9IFwiXCI7XG4gIHByaXZhdGUgZmluaXNoZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBnZW5pZSA9IGZhbHNlO1xuXG4gIHdyaXRlKGNodW5rOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoY2h1bmspO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGNodW5rKSkge1xuICAgICAgdGhpcy5jb25zdW1lKFxuICAgICAgICB0aGlzLmRlY29kZXIud3JpdGUoQnVmZmVyLmZyb20oY2h1bmsuYnVmZmVyLCBjaHVuay5ieXRlT2Zmc2V0LCBjaHVuay5ieXRlTGVuZ3RoKSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZpbmlzaCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmZpbmlzaGVkKSByZXR1cm4gdGhpcy5hbnN3ZXIgfHwgdGhpcy5qc29uQW5zd2VyKCk7XG4gICAgdGhpcy5maW5pc2hlZCA9IHRydWU7XG4gICAgdGhpcy5jb25zdW1lKHRoaXMuZGVjb2Rlci5lbmQoKSk7XG4gICAgdGhpcy5jb25zdW1lU3NlTGluZSh0aGlzLnBlbmRpbmdMaW5lKTtcbiAgICB0aGlzLnBlbmRpbmdMaW5lID0gXCJcIjtcbiAgICByZXR1cm4gdGhpcy5hbnN3ZXIgfHwgdGhpcy5qc29uQW5zd2VyKCk7XG4gIH1cblxuICByYXdCb2R5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYm9keS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCk7XG4gIH1cblxuICB1c2VkR2VuaWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2VuaWU7XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWUodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm47XG4gICAgaWYgKHRoaXMuYm9keS5sZW5ndGggPCBSRVNQT05TRV9CT0RZX0xJTUlUKSB7XG4gICAgICB0aGlzLmJvZHkgKz0gdGV4dC5zbGljZSgwLCBSRVNQT05TRV9CT0RZX0xJTUlUIC0gdGhpcy5ib2R5Lmxlbmd0aCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0xpbmUgKz0gdGV4dDtcbiAgICBsZXQgbmV3bGluZSA9IHRoaXMucGVuZGluZ0xpbmUuaW5kZXhPZihcIlxcblwiKTtcbiAgICB3aGlsZSAobmV3bGluZSA+PSAwKSB7XG4gICAgICB0aGlzLmNvbnN1bWVTc2VMaW5lKHRoaXMucGVuZGluZ0xpbmUuc2xpY2UoMCwgbmV3bGluZSkucmVwbGFjZSgvXFxyJC8sIFwiXCIpKTtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKG5ld2xpbmUgKyAxKTtcbiAgICAgIG5ld2xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLmluZGV4T2YoXCJcXG5cIik7XG4gICAgfVxuICAgIGlmICh0aGlzLnBlbmRpbmdMaW5lLmxlbmd0aCA+IFJFU1BPTlNFX0JPRFlfTElNSVQpIHtcbiAgICAgIHRoaXMucGVuZGluZ0xpbmUgPSB0aGlzLnBlbmRpbmdMaW5lLnNsaWNlKC1SRVNQT05TRV9CT0RZX0xJTUlUKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnN1bWVTc2VMaW5lKGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZyYW1lID0gc3NlRnJhbWUobGluZSk7XG4gICAgdGhpcy5nZW5pZSB8fD0gdmFsdWVVc2VzR2VuaWUoZnJhbWUpO1xuICAgIGlmICh0aGlzLmFuc3dlci5sZW5ndGggPj0gVFJBQ0VfSU9fTElNSVQpIHJldHVybjtcbiAgICBjb25zdCB0ZXh0ID0gYXNzaXN0YW50VGV4dEZyb21Tc2VGcmFtZShmcmFtZSk7XG4gICAgdGhpcy5hbnN3ZXIgKz0gdGV4dC5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCAtIHRoaXMuYW5zd2VyLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGpzb25BbnN3ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYXNzaXN0YW50VGV4dEZyb21Kc29uKGpzb24ucGFyc2UodGhpcy5ib2R5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNwYW4gTUxmbG93IHRyZWF0cyBhcyB0aGUgcmVxdWVzdCByb290LlxuICpcbiAqIE9UZWwgSFRUUCBpbnN0cnVtZW50YXRpb24gc3RvcmVzIGl0cyBzZXJ2ZXIgc3BhbiBpbiBSUEMgbWV0YWRhdGEuIFRoYXQgc3BhblxuICogd2lucyBvdmVyIGFuIGFjdGl2ZSBFeHByZXNzIGNoaWxkLiBJZiBubyByZWNvcmRpbmcgbG9jYWwgc3BhbiBleGlzdHMsIGNyZWF0ZVxuICogb25lIHVuZGVyIHRoZSBjdXJyZW50IGNvbnRleHQgc28gZW5hYmxlZCBXM0MgcHJvcGFnYXRpb24gcmVtYWlucyBpbnRhY3QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUcmFjZVRhcmdldCgpOiBUcmFjZVRhcmdldCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjdGl2ZUNvbnRleHQgPSBjb250ZXh0LmFjdGl2ZSgpO1xuICBpZiAoZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSgpKSB7XG4gICAgY29uc3Qgc3BhbiA9IHRyYWNlLmdldFRyYWNlcihDSEFUX1RVUk5fVFJBQ0VSKS5zdGFydFNwYW4oXG4gICAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICAgIHtcbiAgICAgICAga2luZDogU3BhbktpbmQuU0VSVkVSLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgW0FQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFJdOiB0cnVlLFxuICAgICAgICAgIFtNTEZMT1dfU1BBTl9UWVBFX0FUVFJdOiBNTEZMT1dfU1BBTl9UWVBFX0FHRU5ULFxuICAgICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJhY2UuZGVsZXRlU3BhbihhY3RpdmVDb250ZXh0KSxcbiAgICApO1xuICAgIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IHJwYyA9IGdldFJQQ01ldGFkYXRhKGFjdGl2ZUNvbnRleHQpO1xuICBpZiAocnBjPy50eXBlID09PSBSUENUeXBlLkhUVFAgJiYgcnBjLnNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHJldHVybiB7IHNwYW46IHJwYy5zcGFuLCBvd25lZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZSA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKTtcbiAgaWYgKGFjdGl2ZT8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuIHsgc3BhbjogYWN0aXZlLCBvd25lZDogZmFsc2UgfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2UuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpLnN0YXJ0U3BhbihcbiAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICB7XG4gICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIFtBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSXTogdHJ1ZSxcbiAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgYWN0aXZlQ29udGV4dCxcbiAgKTtcbiAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICBzcGFuLmVuZCgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCBzdGFtcHMgY2hhdCB0dXJuIEkvTyBvbnRvIHRoZSBleHBvcnRlZCBPVGVsIHJvb3QuXG4gKlxuICogVGVlIGByZXMud3JpdGVgLCBgcmVzLmpzb25gLCBhbmQgYHJlcy5lbmRgIGluc3RlYWQgb2YgbGlzdGVuaW5nIGZvciBgZmluaXNoYDpcbiAqIEhUVFAgaW5zdHJ1bWVudGF0aW9uIGVuZHMgaXRzIHNlcnZlciBzcGFuIG9uIGZpbmlzaCwgYW5kIGF0dHJpYnV0ZXMgc2V0XG4gKiBhZnRlciBhIHNwYW4gZW5kcyBuZXZlciByZWFjaCB0aGUgZXhwb3J0ZXIuXG4gKlxuICogYHBhdGhgIGlzIG1vdW50LXJlbGF0aXZlICh3aGF0IHRoZSBNYXN0cmEgc3ViLWFwcCBzZWVzKSwgZS5nLlxuICogYC9hZ2VudHMvc3VwcG9ydC9zdHJlYW1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlKFxuICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgaWYgKHJlcS5tZXRob2QgIT09IFwiUE9TVFwiIHx8ICFBR0VOVF9UVVJOX1JPVVRFLnRlc3QocmVxLnBhdGgpKSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSByZXNvbHZlVHJhY2VUYXJnZXQoKTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhcmdldFRyYWNlSWQgPSB0cmFjZUlkKHRhcmdldC5zcGFuKTtcbiAgaWYgKCF0YXJnZXRUcmFjZUlkKSB7XG4gICAgaWYgKHRhcmdldC5vd25lZCkgdGFyZ2V0LnNwYW4uZW5kKCk7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0cmFjZVN0YXRlOiBDaGF0VHJhY2VTdGF0ZSA9IHtcbiAgICB0YWdzOiBuZXcgTWFwKCksXG4gICAgdHJhY2VJZDogdGFyZ2V0VHJhY2VJZCxcbiAgICBwYXJlbnRTcGFuSWQ6IHRhcmdldC5zcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkLFxuICB9O1xuICBjb25zdCB0cmFjZVJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgaWYgKCFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgc2V0Q2hhdFRyYWNlVGFnKHRyYWNlU3RhdGUsIE1MRkxPV19MT0NBTF9UQUcsIHRydWUpO1xuICB9XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhnZXRSZXF1ZXN0VGFncyhyZXEpKSkge1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgY29uc3QgaW5pdGlhbFRhZ3MgPSB0eXBlb2Ygb3B0aW9ucy50YWdzID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLnRhZ3MocmVxKSA6IG9wdGlvbnMudGFncztcbiAgaWYgKGluaXRpYWxUYWdzKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWxUYWdzKSkge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHN0YW1wTWxmbG93VHJhY2VJZChyZXMsIHRyYWNlU3RhdGUudHJhY2VJZCk7XG4gIHRyYWNlU3RhdGUudXNlciA9IHN0YW1wTWxmbG93QWN0b3IodGFyZ2V0LnNwYW4sIHJlcSk7XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9UWVBFX0FUVFIsIE1MRkxPV19TUEFOX1RZUEVfQUdFTlQpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIsIFwiaW52b2tlX2FnZW50XCIpO1xuICBjb25zdCBpZGVudGl0eSA9XG4gICAgdHlwZW9mIG9wdGlvbnMuaWRlbnRpdHkgPT09IFwiZnVuY3Rpb25cIiA/IG9wdGlvbnMuaWRlbnRpdHkocmVxKSA6IG9wdGlvbnMuaWRlbnRpdHk7XG4gIGlmIChpZGVudGl0eSkge1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0lERU5USVRZX0FUVFIsIGlkZW50aXR5KTtcbiAgICBzZXRDaGF0VHJhY2VUYWcoXG4gICAgICB0cmFjZVN0YXRlLFxuICAgICAgaWRlbnRpdHkgPT09IFwib2JvXCIgPyBNTEZMT1dfT0JPX0FVVEhfVEFHIDogTUxGTE9XX1NQX0FVVEhfVEFHLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9XG4gIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgZmFsc2UpO1xuXG4gIGNvbnN0IG1lc3NhZ2VzID0gKHJlcS5ib2R5IGFzIHsgbWVzc2FnZXM/OiB1bmtub3duIH0gfCB1bmRlZmluZWQpPy5tZXNzYWdlcztcbiAgbGV0IHJlcXVlc3RQcmV2aWV3OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChtZXNzYWdlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZnVsbElucHV0ID0gc2VyaWFsaXplZChtZXNzYWdlcyk7XG4gICAgcmVxdWVzdFByZXZpZXcgPSB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlcykgPz8gZnVsbElucHV0O1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX01FU1NBR0VTX0FUVFIsIGZ1bGxJbnB1dCk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TUEFOX0lOUFVUU19BVFRSLCByZXF1ZXN0UHJldmlldy5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICB9XG5cbiAgY29uc3QgY29sbGVjdG9yID0gbmV3IEFzc2lzdGFudFJlc3BvbnNlQ29sbGVjdG9yKCk7XG4gIGxldCByZXNwb25zZVByZXZpZXc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IG91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBmdWxsT3V0cHV0UmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IGdlbmllUmVjb3JkZWQgPSBmYWxzZTtcbiAgbGV0IG93bmVkU3BhbkVuZGVkID0gZmFsc2U7XG4gIGxldCB0cmFjZUZpbmFsaXplZCA9IGZhbHNlO1xuICBjb25zdCBwYXNzVGhyb3VnaFdyaXRlID0gcmVzLndyaXRlLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBib29sZWFuO1xuICBjb25zdCBwYXNzVGhyb3VnaEVuZCA9IHJlcy5lbmQuYmluZChyZXMpIGFzICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gIGNvbnN0IHBhc3NUaHJvdWdoSnNvbiA9IHJlcy5qc29uLmJpbmQocmVzKSBhcyAoYm9keT86IHVua25vd24pID0+IGV4cHJlc3MuUmVzcG9uc2U7XG4gIGNvbnN0IHJlY29yZE91dHB1dCA9IChhbnN3ZXI6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChvdXRwdXRSZWNvcmRlZCB8fCAhYW5zd2VyKSByZXR1cm47XG4gICAgcmVzcG9uc2VQcmV2aWV3ID0gYW5zd2VyO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9PVVRQVVRTX0FUVFIsIGFuc3dlci5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIG91dHB1dFJlY29yZGVkID0gdHJ1ZTtcbiAgfTtcbiAgY29uc3QgcmVjb3JkRnVsbE91dHB1dCA9IChyZXNwb25zZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKGZ1bGxPdXRwdXRSZWNvcmRlZCB8fCAhcmVzcG9uc2UpIHJldHVybjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9SRVNQT05TRV9BVFRSLCByZXNwb25zZS5zbGljZSgwLCBUUkFDRV9JT19MSU1JVCkpO1xuICAgIGZ1bGxPdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEdlbmllID0gKHVzZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICBpZiAoIXVzZWQgfHwgZ2VuaWVSZWNvcmRlZCkgcmV0dXJuO1xuICAgIGdlbmllUmVjb3JkZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShDSEFUX0dFTklFX1VTRURfQVRUUiwgdHJ1ZSk7XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19HRU5JRV9UQUdfQVRUUiwgXCJ0cnVlXCIpO1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfR0VOSUVfVEFHLCB0cnVlKTtcbiAgICBjb250ZXh0LndpdGgodHJhY2Uuc2V0U3Bhbihjb250ZXh0LmFjdGl2ZSgpLCB0YXJnZXQuc3BhbiksICgpID0+IHtcbiAgICAgIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyh7IFtNTEZMT1dfR0VOSUVfVEFHXTogXCJ0cnVlXCIgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGZpbmFsaXplVHJhY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRyYWNlRmluYWxpemVkKSByZXR1cm47XG4gICAgdHJhY2VGaW5hbGl6ZWQgPSB0cnVlO1xuICAgIGNvbnN0IHRhZ3MgPSBPYmplY3QuZnJvbUVudHJpZXModHJhY2VTdGF0ZS50YWdzKTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgdHJhY2VTdGF0ZS50YWdzKSB7XG4gICAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoYCR7TUxGTE9XX1RSQUNFX1RBR19QUkVGSVh9JHtuYW1lfWAsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRyYWNlU3RhdGUudXNlcikgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19VU0VSX0FUVFIsIHRyYWNlU3RhdGUudXNlcik7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKCFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgICBwZXJzaXN0QXBwTWxmbG93VHJhY2VJbmZvKHtcbiAgICAgICAgdHJhY2VJZDogdHJhY2VTdGF0ZS50cmFjZUlkLFxuICAgICAgICByZXF1ZXN0VGltZTogdHJhY2VSZXF1ZXN0VGltZSxcbiAgICAgICAgZXhlY3V0aW9uRHVyYXRpb246IERhdGUubm93KCkgLSB0cmFjZVJlcXVlc3RUaW1lLFxuICAgICAgICBlcnJvcjogcmVzLnN0YXR1c0NvZGUgPj0gNTAwLFxuICAgICAgICB0YWdzLFxuICAgICAgICAuLi4odHJhY2VTdGF0ZS51c2VyID8geyB1c2VyOiB0cmFjZVN0YXRlLnVzZXIgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgICAuLi4ocmVzcG9uc2VQcmV2aWV3ID8geyByZXNwb25zZVByZXZpZXcgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZW5kT3duZWRTcGFuID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICghdGFyZ2V0Lm93bmVkIHx8IG93bmVkU3BhbkVuZGVkKSByZXR1cm47XG4gICAgb3duZWRTcGFuRW5kZWQgPSB0cnVlO1xuICAgIHRhcmdldC5zcGFuLmVuZCgpO1xuICB9O1xuXG4gIHJlcy53cml0ZSA9ICgoY2h1bms6IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbGxlY3Rvci53cml0ZShjaHVuayk7XG4gICAgcmV0dXJuIHBhc3NUaHJvdWdoV3JpdGUoY2h1bmssIC4uLnJlc3QpO1xuICB9KSBhcyB0eXBlb2YgcmVzLndyaXRlO1xuXG4gIHJlcy5qc29uID0gKChib2R5PzogdW5rbm93bikgPT4ge1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoc2VyaWFsaXplZChib2R5KSk7XG4gICAgcmVjb3JkR2VuaWUodmFsdWVVc2VzR2VuaWUoYm9keSkpO1xuICAgIHJlY29yZE91dHB1dChhc3Npc3RhbnRUZXh0RnJvbUpzb24oYm9keSkpO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaEpzb24oYm9keSk7XG4gIH0pIGFzIHR5cGVvZiByZXMuanNvbjtcblxuICByZXMuZW5kID0gKChjaHVuaz86IHVua25vd24sIC4uLnJlc3Q6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbGxlY3Rvci53cml0ZShjaHVuayk7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoRW5kKGNodW5rLCAuLi5yZXN0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgZW5kT3duZWRTcGFuKCk7XG4gICAgfVxuICB9KSBhcyB0eXBlb2YgcmVzLmVuZDtcblxuICByZXMub25jZShcImNsb3NlXCIsICgpID0+IHtcbiAgICByZWNvcmRPdXRwdXQoY29sbGVjdG9yLmZpbmlzaCgpKTtcbiAgICByZWNvcmRGdWxsT3V0cHV0KGNvbGxlY3Rvci5yYXdCb2R5KCkpO1xuICAgIHJlY29yZEdlbmllKGNvbGxlY3Rvci51c2VkR2VuaWUoKSk7XG4gICAgZmluYWxpemVUcmFjZSgpO1xuICAgIGVuZE93bmVkU3BhbigpO1xuICB9KTtcblxuICBjb25zdCBjaGF0Q29udGV4dCA9IHRyYWNlXG4gICAgLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pXG4gICAgLnNldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZLCB0cmFjZVN0YXRlKTtcbiAgY29udGV4dC53aXRoKGNoYXRDb250ZXh0LCAoKSA9PiB7XG4gICAgbmV4dCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJbnN0YWxsIHtAbGluayBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmV9IG9uIGEgTWFzdHJhIEV4cHJlc3Mgc3ViLWFwcC5cbiAqXG4gKiBDYWxsIGJlZm9yZSBgTWFzdHJhU2VydmVyLmluaXQoKWAgc28gdGhlIGxheWVyIHNpdHMgYWhlYWQgb2YgdGhlIGFnZW50XG4gKiByb3V0ZXMuIFNhZmUgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHk6IHdoZW4gbm8gcmVjb3JkaW5nIHRyYWNlciBpcyByZWdpc3RlcmVkLFxuICogdGhlIG1pZGRsZXdhcmUgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaENoYXRUdXJuVGVsZW1ldHJ5KFxuICBhcHA6IGV4cHJlc3MuRXhwcmVzcyxcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgYXBwLnVzZSgocmVxLCByZXMsIG5leHQpID0+IGNoYXRUdXJuVGVsZW1ldHJ5TWlkZGxld2FyZShyZXEsIHJlcywgbmV4dCwgb3B0aW9ucykpO1xuICBsb2dnZXIuaW5mbyhcImNoYXQgdHVybiB0ZWxlbWV0cnkgbWlkZGxld2FyZSBhdHRhY2hlZFwiLCBvcHRpb25zKTtcbn1cbiJdfQ==
697
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMkJBQTJCLEVBQzNCLGNBQWMsR0FDZixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCxHQUFHLEVBQ0gsa0JBQWtCLEVBQ2xCLEtBQUssRUFDTCxRQUFRLEVBQ1IsVUFBVSxFQUNWLGlCQUFpQixFQUNqQixjQUFjLEdBQ2YsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNoQixlQUFlLEdBQ2hCLE1BQU0sMEJBQTBCLENBQUM7QUFFbEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUYsT0FBTyxFQUNMLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLGNBQWMsRUFDZCxLQUFLLEdBR04sTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSTlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRyxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHlCQUF5QixFQUN6Qiw0QkFBNEIsRUFDNUIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2QiwyQkFBMkIsR0FDNUIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLDRCQUE0QixFQUM1QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLG1CQUFt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Q0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQztTQUN0QyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1FBQzdCLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxHQUFvQixFQUNwQixVQUFvQyxFQUFFO0lBRXRDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNsRixNQUFNLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2xFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHkgZWFjaCBNYXN0cmEgY2hhdCB0dXJuJ3MgcmVxdWVzdC9yZXNwb25zZSBvbnRvIGl0cyBPVGVsIHJvb3Qgc3BhblxuICogc28gRGF0YWJyaWNrcy1tYW5hZ2VkIE1MZmxvdyBjYW4gZGlzcGxheSB0aGVtLlxuICpcbiAqIFdoeSB0aGlzIGV4aXN0czogTUxmbG93J3MgVUMgYDx0YXJnZXQ+X3RyYWNlX3VuaWZpZWRgIHZpZXcgcGlja3MgdGhlXG4gKiBvbmUgc3BhbiB3aG9zZSBgcGFyZW50X3NwYW5faWRgIGlzIGVtcHR5IGFuZCByZWFkcyByZXF1ZXN0L3Jlc3BvbnNlXG4gKiBmcm9tIGBtbGZsb3cuc3BhbklucHV0c2AgLyBgbWxmbG93LnNwYW5PdXRwdXRzYCAob3IgdGhlIGBnZW5fYWkuKmBcbiAqIGVxdWl2YWxlbnRzKSBvbiBUSEFUIHNwYW4gb25seS4gTWFzdHJhIHJlY29yZHMgdGhlIHR1cm4gb24gaXRzXG4gKiBgaW52b2tlX2FnZW50YCBjaGlsZCB1bmRlciBgbWFzdHJhLmFnZW50X3J1bi5pbnB1dGAgLyBgLm91dHB1dGAsIGtleXNcbiAqIHRoZSB2aWV3IG5ldmVyIHJlYWRzLCBzbyBjaGF0IHRyYWNlcyBhcnJpdmUgd2l0aCBib3RoIGNvbHVtbnMgbnVsbFxuICogZXZlbiB3aGVuIHRoZSBzcGFucyB0aGVtc2VsdmVzIGxvb2sgaGVhbHRoeS5cbiAqXG4gKiBBcHBLaXQncyBIVFRQIGluc3RydW1lbnRhdGlvbiByZWNvcmRzIHRoZSBzZXJ2ZXIgc3BhbiBpbiBPVGVsIFJQQyBtZXRhZGF0YSxcbiAqIHdoaWNoIHJlbWFpbnMgYXZhaWxhYmxlIGV2ZW4gd2hlbiBFeHByZXNzIG1ha2VzIGEgbWlkZGxld2FyZS1sYXllciBjaGlsZFxuICogYWN0aXZlLiBXaGVuIGluc3RydW1lbnRhdGlvbiBpcyB1bmF2YWlsYWJsZSwgdGhpcyBtb2R1bGUgY3JlYXRlcyBvbmVcbiAqIHJlcXVlc3QtbGlmZXRpbWUgc2VydmVyIHNwYW4gYW5kIHJ1bnMgTWFzdHJhIHVuZGVyIGl0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBTdHJpbmdEZWNvZGVyIH0gZnJvbSBcIm5vZGU6c3RyaW5nX2RlY29kZXJcIjtcblxuaW1wb3J0IHtcbiAgVVNFUl9UUkFDRV9BVFRSSUJVVEUsXG4gIHJlZ2lzdGVyTmF0aXZlU3BhblByb2Nlc3NvcixcbiAgZ2V0UmVxdWVzdFRhZ3MsXG59IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgbG9nLFxuICBpc0RhdGFicmlja3NBcHBFbnYsXG4gIHBhcnNlLFxuICBpc1JlY29yZCxcbiAgdHJpbVRvTnVsbCxcbiAgVVNFUl9FTUFJTF9IRUFERVIsXG4gIFVTRVJfSURfSEVBREVSLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgTUxGTE9XX1RSQUNFX0lEX0hFQURFUixcbiAgVEhSRUFEX0lEX0hFQURFUixcbiAgVEhSRUFEX0lEX1FVRVJZLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgdHlwZSB7IFRyYWNpbmdPcHRpb25zIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9vYnNlcnZhYmlsaXR5XCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZLCBNQVNUUkFfVEhSRUFEX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQge1xuICBjb250ZXh0LFxuICBjcmVhdGVDb250ZXh0S2V5LFxuICBTcGFuS2luZCxcbiAgU3BhblN0YXR1c0NvZGUsXG4gIHRyYWNlLFxuICB0eXBlIENvbnRleHQsXG4gIHR5cGUgU3Bhbixcbn0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHsgZ2V0UlBDTWV0YWRhdGEsIFJQQ1R5cGUgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZVNwYW4sIFNwYW4gYXMgU2RrU3BhbiwgU3BhblByb2Nlc3NvciB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZVwiO1xuaW1wb3J0IHR5cGUgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBNQVNUUkFfQVVUSF9NT0RFX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgYXBwTWxmbG93VHJhY2VJbmZvQ29uZmlndXJlZCxcbiAgZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSxcbiAgaW5pdGlhbGl6ZUFwcE1sZmxvd1RyYWNlSW5mbyxcbiAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyxcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2UsXG4gIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlVGFncyxcbn0gZnJvbSBcIi4vbWxmbG93LnRzXCI7XG5pbXBvcnQge1xuICBBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSLFxuICBNTEZMT1dfQUdFTlRfVEFHLFxuICBNTEZMT1dfQUdFTlRfVEFHX0FUVFIsXG4gIE1MRkxPV19HRU5JRV9UQUcsXG4gIE1MRkxPV19HRU5JRV9UQUdfQVRUUixcbiAgTUxGTE9XX0xPQ0FMX1RBRyxcbiAgTUxGTE9XX09CT19BVVRIX1RBRyxcbiAgTUxGTE9XX1NQX0FVVEhfVEFHLFxuICBNTEZMT1dfVFJBQ0VfVEFHX1BSRUZJWCxcbn0gZnJvbSBcIi4vdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3RlbGVtZXRyeVwiKTtcblxuLyoqIENhcCBvbiBlYWNoIHBheWxvYWQgY29waWVkIG9udG8gYSBzcGFuLCBzbyBvbmUgdHVybiBjYW5ub3QgYmxvYXQgdGhlIGV4cG9ydC4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9JT19MSU1JVCA9IDhfMDAwO1xuXG4vKiogQm91bmQgZm9yIGEgbm9uLXN0cmVhbWluZyBib2R5IGNhcHR1cmVkIHRocm91Z2ggYHJlcy5lbmRgIGluc3RlYWQgb2YgYHJlcy5qc29uYC4gKi9cbmNvbnN0IFJFU1BPTlNFX0JPRFlfTElNSVQgPSBUUkFDRV9JT19MSU1JVCAqIDQ7XG5cbi8qKiBUcmFjZXIgc2NvcGUgdXNlZCBvbmx5IHdoZW4gQXBwS2l0IGRpZCBub3QgY3JlYXRlIGEgcmVjb3JkaW5nIEhUVFAgc3Bhbi4gKi9cbmNvbnN0IENIQVRfVFVSTl9UUkFDRVIgPSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuXG4vKipcbiAqIE1vdW50LXJlbGF0aXZlIE1hc3RyYSBhZ2VudCBpbnZva2UgcGF0aHMgdGhhdCBjYXJyeSBhIGNoYXQgdHVybiBib2R5XG4gKiAoYG1lc3NhZ2VzYCkgYW5kIHN0cmVhbSBhbiBhc3Npc3RhbnQgYW5zd2VyLiBSZXN1bWUgLyBhcHByb3ZlIHZlcmJzXG4gKiBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZDogdGhlaXIgYm9kaWVzIGFyZSB0b29sIGRlY2lzaW9ucywgbm90IHRoZVxuICogdXNlciBwcm9tcHQsIGFuZCB0aGV5IHJhcmVseSBwcm9kdWNlIGEgZnJlc2ggYW5zd2VyIHdvcnRoIHN1cmZhY2luZy5cbiAqL1xuY29uc3QgQUdFTlRfVFVSTl9ST1VURSA9IC8oPzpefFxcLykoPzphZ2VudHNcXC9bXi9dK1xcLyg/OnN0cmVhbXxnZW5lcmF0ZSl8Y2hhdFxcL1teL10rKVxcLz8kL2k7XG5cbi8qKiBBdHRyaWJ1dGUga2V5cyB0aGUgTUxmbG93IFVDIGAqX3RyYWNlX3VuaWZpZWRgIHZpZXcgcmVhZHMgZnJvbSB0aGUgcm9vdCBzcGFuLiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX0lOUFVUU19BVFRSID0gXCJtbGZsb3cuc3BhbklucHV0c1wiO1xuLyoqIFJvb3Qtc3BhbiBhdHRyaWJ1dGUgY29uc3VtZWQgYXMgY2hhdCBvdXRwdXQgYnkgTUxmbG93IHVuaWZpZWQgdHJhY2Ugdmlld3MuICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fT1VUUFVUU19BVFRSID0gXCJtbGZsb3cuc3Bhbk91dHB1dHNcIjtcbi8qKiBGdWxsIHNlcmlhbGl6ZWQgcmVxdWVzdCBtZXNzYWdlcyByZXRhaW5lZCB3aGVuIHRoZSBNTGZsb3cgcHJldmlldyBpcyBwbGFpbiB0ZXh0LiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfTUVTU0FHRVNfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5jaGF0Lm1lc3NhZ2VzXCI7XG4vKiogRnVsbCBzZXJpYWxpemVkIHJlc3BvbnNlIHJldGFpbmVkIHdoZW4gdGhlIE1MZmxvdyBwcmV2aWV3IGlzIHBsYWluIHRleHQuICovXG5leHBvcnQgY29uc3QgQ0hBVF9SRVNQT05TRV9BVFRSID0gXCJhcHBraXQubWFzdHJhLmNoYXQucmVzcG9uc2VcIjtcbi8qKiBDcmVkZW50aWFsIG1vZGUgdXNlZCBieSBEYXRhYnJpY2tzIGNhbGxzIGluIHRoaXMgY2hhdCB0dXJuLiAqL1xuZXhwb3J0IGNvbnN0IENIQVRfSURFTlRJVFlfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5pZGVudGl0eS5tb2RlXCI7XG4vKiogV2hldGhlciB0aGUgc3RyZWFtZWQgdHVybiBlbWl0dGVkIGEgR2VuaWUgdG9vbCBvciBwcm9ncmVzcyBldmVudC4gKi9cbmV4cG9ydCBjb25zdCBDSEFUX0dFTklFX1VTRURfQVRUUiA9IFwiYXBwa2l0Lm1hc3RyYS5nZW5pZS51c2VkXCI7XG4vKipcbiAqIE1MZmxvdyBzcGFuLXR5cGUgYXR0cmlidXRlLiBEYXRhYnJpY2tzIG1hcHMgdGhpcyAob3IgYGdlbl9haS5vcGVyYXRpb24ubmFtZWApXG4gKiBvbnRvIHRoZSB0eXBlIGNoaXAgaW4gdGhlIGV4cGVyaW1lbnQgVUkuIEN1c3RvbSB2YWx1ZXMgc3VjaCBhcyBgR0VOSUVgIGFyZVxuICogYWxsb3dlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1MRkxPV19TUEFOX1RZUEVfQVRUUiA9IFwibWxmbG93LnNwYW5UeXBlXCI7XG4vKiogR2VuQUkgc2VtYW50aWMtY29udmVudGlvbiBvcGVyYXRpb24gbmFtZSwgYW4gYWx0ZXJuYXRlIHNwYW4tdHlwZSBzb3VyY2UuICovXG5leHBvcnQgY29uc3QgR0VOX0FJX09QRVJBVElPTl9OQU1FX0FUVFIgPSBcImdlbl9haS5vcGVyYXRpb24ubmFtZVwiO1xuLyoqIFJvb3Qtc3BhbiBzZXNzaW9uIGlkIHRoYXQgZW5hYmxlcyB0aGUgTUxmbG93IFNlc3Npb25zIHRhYi4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU0VTU0lPTl9BVFRSID0gXCJzZXNzaW9uLmlkXCI7XG4vKiogUm9vdC1zcGFuIHR5cGUgZm9yIGEgTWFzdHJhIGFnZW50IHR1cm4uICovXG5leHBvcnQgY29uc3QgTUxGTE9XX1NQQU5fVFlQRV9BR0VOVCA9IFwiQUdFTlRcIjtcbi8qKiBTcGFuIHR5cGUgZm9yIGFuIGBhc2tfZ2VuaWVgIHRvb2wgY2FsbC4gKi9cbmV4cG9ydCBjb25zdCBNTEZMT1dfU1BBTl9UWVBFX0dFTklFID0gXCJHRU5JRVwiO1xuXG4vKiogUm9vdC1zcGFuIG1ldGFkYXRhIGtub3duIGJlZm9yZSBhIGNoYXQgcmVxdWVzdCBpcyBkaXNwYXRjaGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGF0VHVyblRlbGVtZXRyeU9wdGlvbnMge1xuICByZWFkb25seSBpZGVudGl0eT86XG4gICAgXCJvYm9cIiB8IFwic2VydmljZS1wcmluY2lwYWxcIiB8ICgocmVxdWVzdDogZXhwcmVzcy5SZXF1ZXN0KSA9PiBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiKTtcbiAgLyoqIEluaXRpYWwgdHJhY2UgdGFncyBkZXJpdmVkIGZyb20gdGhlIGluYm91bmQgcmVxdWVzdC4gKi9cbiAgcmVhZG9ubHkgdGFncz86XG4gICAgfCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+XG4gICAgfCAoKHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCkgPT4gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQ2hhdFRyYWNlVGFnVmFsdWUgfCB1bmRlZmluZWQ+Pik7XG59XG5cbmludGVyZmFjZSBUcmFjZVRhcmdldCB7XG4gIHNwYW46IFNwYW47XG4gIG93bmVkOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQ2hhdFRyYWNlU3RhdGUge1xuICByZWFkb25seSB0YWdzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICByZWFkb25seSB0cmFjZUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgZmlyc3RNb2RlbD86IHN0cmluZztcbiAgdXNlcj86IHN0cmluZztcbn1cblxuLyoqIFZhbHVlcyBhY2NlcHRlZCBieSByZXF1ZXN0LXNjb3BlZCB0cmFjZS10YWcgaW5qZWN0aW9uIGhlbHBlcnMuICovXG5leHBvcnQgdHlwZSBDaGF0VHJhY2VUYWdWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW47XG5cbmNvbnN0IENIQVRfVFJBQ0VfU1RBVEVfS0VZID0gY3JlYXRlQ29udGV4dEtleShcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYS9jaGF0LXRyYWNlLXN0YXRlXCIpO1xuXG4vKiogT3BlblRlbGVtZXRyeSdzIHNlbnRpbmVsIGZvciBcIm5vIHZhbGlkIHRyYWNlXCIgLSAzMiB6ZXJvIGhleCBjaGFycy4gKi9cbmNvbnN0IElOVkFMSURfVFJBQ0VfSUQgPSBcIjBcIi5yZXBlYXQoMzIpO1xuXG4vKipcbiAqIE1hcmsgdGhlIGFjdGl2ZSBzcGFuIGFzIGEgR2VuaWUgY2FsbCBzbyB0aGUgZXhwZXJpbWVudCBVSSB0eXBlcyBpdCBgR0VOSUVgXG4gKiBhbmQgdGFncyB0aGUgdHJhY2UgYGdlbmllPXRydWVgLiBTYWZlIG5vLW9wIHdoZW4gbm8gcmVjb3JkaW5nIHNwYW4gaXMgYWN0aXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbXBHZW5pZVRvb2xTcGFuKHNwYW46IFNwYW4gfCB1bmRlZmluZWQgPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCkpOiB2b2lkIHtcbiAgaWYgKCFzcGFuPy5pc1JlY29yZGluZygpKSByZXR1cm47XG4gIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TUEFOX1RZUEVfQVRUUiwgTUxGTE9XX1NQQU5fVFlQRV9HRU5JRSk7XG4gIHNwYW4uc2V0QXR0cmlidXRlKEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSLCBcImV4ZWN1dGVfdG9vbFwiKTtcbiAgc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX0dFTklFX1RBR19BVFRSLCBcInRydWVcIik7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RIZWFkZXIocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZyb21NZXRob2QgPSB0eXBlb2YgcmVxLmhlYWRlciA9PT0gXCJmdW5jdGlvblwiID8gdHJpbVRvTnVsbChyZXEuaGVhZGVyKG5hbWUpKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGZyb21NZXRob2QpIHJldHVybiBmcm9tTWV0aG9kO1xuICBjb25zdCByYXcgPSByZXEuaGVhZGVycz8uW25hbWUudG9Mb3dlckNhc2UoKV07XG4gIGNvbnN0IHZhbHVlID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3WzBdIDogcmF3O1xuICByZXR1cm4gdHJpbVRvTnVsbCh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0UXVlcnkocmVxOiBleHByZXNzLlJlcXVlc3QsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHJlcS5xdWVyeT8uW25hbWVdO1xuICBjb25zdCB2YWx1ZSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdztcbiAgcmV0dXJuIHRyaW1Ub051bGwodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUgOiB1bmRlZmluZWQpID8/IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RhbXBNbGZsb3dBY3RvcihzcGFuOiBTcGFuLCByZXE6IGV4cHJlc3MuUmVxdWVzdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0SGVhZGVyKHJlcSwgVVNFUl9FTUFJTF9IRUFERVIpID8/IHJlcXVlc3RIZWFkZXIocmVxLCBVU0VSX0lEX0hFQURFUik7XG4gIGlmICh1c2VyKSBzcGFuLnNldEF0dHJpYnV0ZShVU0VSX1RSQUNFX0FUVFJJQlVURSwgdXNlcik7XG4gIGNvbnN0IHNlc3Npb24gPSByZXF1ZXN0SGVhZGVyKHJlcSwgVEhSRUFEX0lEX0hFQURFUikgPz8gcmVxdWVzdFF1ZXJ5KHJlcSwgVEhSRUFEX0lEX1FVRVJZKTtcbiAgaWYgKHNlc3Npb24pIHNwYW4uc2V0QXR0cmlidXRlKE1MRkxPV19TRVNTSU9OX0FUVFIsIHNlc3Npb24pO1xuICByZXR1cm4gdXNlcjtcbn1cblxuZnVuY3Rpb24gdHJhY2VJZChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkID0gdHJhY2UuZ2V0QWN0aXZlU3BhbigpKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdmFsdWUgPSBzcGFuPy5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gIHJldHVybiB2YWx1ZSAmJiB2YWx1ZSAhPT0gSU5WQUxJRF9UUkFDRV9JRCA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpOiBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb250ZXh0LmFjdGl2ZSgpLmdldFZhbHVlKENIQVRfVFJBQ0VfU1RBVEVfS0VZKSBhcyBDaGF0VHJhY2VTdGF0ZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCaW5kIGEgTWFzdHJhIGFnZW50IHJ1biB0byB0aGUgdHJhY2Ugc2VsZWN0ZWQgYnkgY2hhdCB0ZWxlbWV0cnkuXG4gKlxuICogRGF0YWJyaWNrcyBBcHBzIHVzZXMgYSBkZWRpY2F0ZWQgYWdlbnQgdHJhY2UgYmVjYXVzZSBldmVudGVkIGFnZW50cyBmaW5pc2hcbiAqIGJlZm9yZSB0aGUgSFRUUCBzZXJ2ZXIgc3Bhbi4gUHJvbW90aW5nIE1MZmxvdyB0cmFjZSBpbmZvIGFmdGVyIHRoZSBhZ2VudCByb290XG4gKiBjbG9zZXMgYXZvaWRzIHRoZSBzaWRlY2FyIHJlcGxhY2luZyBjbGVhbiBwcmV2aWV3cyBhbmQgdGFncyB3aXRoIGVtcHR5IEhUVFBcbiAqIHRyYWNlIG1ldGFkYXRhLiBPdGhlciBydW50aW1lcyByZXRhaW4gdGhlIGV4aXN0aW5nIEhUVFAvbG9jYWwgcGFyZW50YWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWN0aXZlQ2hhdFRyYWNpbmdPcHRpb25zKFxuICBvcHRpb25zOiBUcmFjaW5nT3B0aW9ucyB8IHVuZGVmaW5lZCxcbik6IFRyYWNpbmdPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoIXN0YXRlKSByZXR1cm4gb3B0aW9ucztcbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHRyYWNlSWQ6IHN0YXRlLnRyYWNlSWQsXG4gICAgLi4uKHN0YXRlLnBhcmVudFNwYW5JZCA/IHsgcGFyZW50U3BhbklkOiBzdGF0ZS5wYXJlbnRTcGFuSWQgfSA6IHsgcGFyZW50U3BhbklkOiB1bmRlZmluZWQgfSksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNldENoYXRUcmFjZVRhZyhzdGF0ZTogQ2hhdFRyYWNlU3RhdGUsIG5hbWU6IHN0cmluZywgdmFsdWU6IENoYXRUcmFjZVRhZ1ZhbHVlKTogdm9pZCB7XG4gIGNvbnN0IHRhZyA9IHRyaW1Ub051bGwobmFtZSk7XG4gIGlmICghdGFnKSByZXR1cm47XG4gIHN0YXRlLnRhZ3Muc2V0KHRhZywgU3RyaW5nKHZhbHVlKSk7XG59XG5cbi8qKiBJbmplY3Qgb25lIE1MZmxvdyB0cmFjZSB0YWcgaW50byB0aGUgYWN0aXZlIGNoYXQgcmVxdWVzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRBY3RpdmVUcmFjZVRhZyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBDaGF0VHJhY2VUYWdWYWx1ZSA9IHRydWUpOiB2b2lkIHtcbiAgY29uc3Qgc3RhdGUgPSBhY3RpdmVDaGF0VHJhY2VTdGF0ZSgpO1xuICBpZiAoc3RhdGUpIHNldENoYXRUcmFjZVRhZyhzdGF0ZSwgbmFtZSwgdmFsdWUpO1xufVxuXG4vKiogSW5qZWN0IG11bHRpcGxlIE1MZmxvdyB0cmFjZSB0YWdzIGludG8gdGhlIGFjdGl2ZSBjaGF0IHJlcXVlc3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VUYWdzKFxuICB0YWdzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGF0VHJhY2VUYWdWYWx1ZSB8IHVuZGVmaW5lZD4+LFxuKTogdm9pZCB7XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSkgcmV0dXJuO1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGFncykpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBuYW1lLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqIFJlY29yZCB0aGUgZmlyc3Qgc2VsZWN0ZWQgbW9kZWwgYXMgdGhlIGFjdGl2ZSBjaGF0IHRyYWNlJ3MgYGFnZW50YCB0YWcuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VNb2RlbChtb2RlbElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSB0cmltVG9OdWxsKG1vZGVsSWQpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKCFzdGF0ZSB8fCBzdGF0ZS5maXJzdE1vZGVsKSByZXR1cm47XG4gIHN0YXRlLmZpcnN0TW9kZWwgPSB2YWx1ZTtcbiAgc2V0Q2hhdFRyYWNlVGFnKHN0YXRlLCBNTEZMT1dfQUdFTlRfVEFHLCB2YWx1ZSk7XG4gIGNvbnN0IHNwYW4gPSB0cmFjZS5nZXRBY3RpdmVTcGFuKCk7XG4gIGlmIChzcGFuPy5pc1JlY29yZGluZygpKSBzcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfQUdFTlRfVEFHX0FUVFIsIHZhbHVlKTtcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzKHsgW01MRkxPV19BR0VOVF9UQUddOiB2YWx1ZSB9KTtcbn1cblxuLyoqIFJlY29yZCB0aGUgYmVzdCByZXNvbHZlZCB1c2VyIGlkZW50aWZpZXIgb24gdGhlIGFjdGl2ZSBjaGF0IHRyYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEFjdGl2ZVRyYWNlVXNlcih1c2VyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgdmFsdWUgPSB0cmltVG9OdWxsKHVzZXIpO1xuICBpZiAoIXZhbHVlKSByZXR1cm47XG4gIGNvbnN0IHN0YXRlID0gYWN0aXZlQ2hhdFRyYWNlU3RhdGUoKTtcbiAgaWYgKHN0YXRlKSBzdGF0ZS51c2VyID0gdmFsdWU7XG59XG5cbi8qKiBSZWNvcmQgb25lIERhdGFicmlja3MgYXV0aGVudGljYXRpb24gbW9kZSB1c2VkIGR1cmluZyB0aGUgYWN0aXZlIGNoYXQgdHJhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQWN0aXZlVHJhY2VBdXRoKGF1dGg6IFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCIpOiB2b2lkIHtcbiAgcmVjb3JkQWN0aXZlVHJhY2VUYWcoYXV0aCA9PT0gXCJvYm9cIiA/IE1MRkxPV19PQk9fQVVUSF9UQUcgOiBNTEZMT1dfU1BfQVVUSF9UQUcpO1xufVxuXG4vKiogUHVibGlzaCB0aGUgdHVybidzIE1MZmxvdyB0cmFjZSBpZCBiZWZvcmUgdGhlIGhhbmRsZXIgd3JpdGVzIHRoZSBib2R5LiAqL1xuZnVuY3Rpb24gc3RhbXBNbGZsb3dUcmFjZUlkKHJlczogZXhwcmVzcy5SZXNwb25zZSwgdHJhY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChyZXMuaGVhZGVyc1NlbnQpIHJldHVybjtcbiAgaWYgKCF0cmFjZUlkIHx8IHRyYWNlSWQgPT09IElOVkFMSURfVFJBQ0VfSUQpIHJldHVybjtcbiAgcmVzLnNldEhlYWRlcihNTEZMT1dfVFJBQ0VfSURfSEVBREVSLCBgdHItJHt0cmFjZUlkfWApO1xufVxuXG4vKiogUmV0dXJuIG9uZSByYXcgcHJvbXB0IHdoZW4gdGhlIHJlcXVlc3QgaXMgZXhhY3RseSBvbmUgdGV4dC1vbmx5IHVzZXIgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0T25seUNoYXRJbnB1dChtZXNzYWdlczogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgbWVzc2FnZXMgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlcyB8fCB1bmRlZmluZWQ7XG4gIGlmICghQXJyYXkuaXNBcnJheShtZXNzYWdlcykgfHwgbWVzc2FnZXMubGVuZ3RoICE9PSAxKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZXNbMF07XG4gIGlmICghaXNSZWNvcmQobWVzc2FnZSkgfHwgbWVzc2FnZS5yb2xlICE9PSBcInVzZXJcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHJldHVybiBtZXNzYWdlLmNvbnRlbnQgfHwgdW5kZWZpbmVkO1xuICByZXR1cm4gdGV4dEZyb21QYXJ0cyhtZXNzYWdlLnBhcnRzKSA/PyB0ZXh0RnJvbVBhcnRzKG1lc3NhZ2UuY29udGVudCk7XG59XG5cbmZ1bmN0aW9uIHRleHRGcm9tUGFydHModmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdGV4dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHZhbHVlKSB7XG4gICAgaWYgKCFpc1JlY29yZChwYXJ0KSB8fCBwYXJ0LnR5cGUgIT09IFwidGV4dFwiIHx8IHR5cGVvZiBwYXJ0LnRleHQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRleHQucHVzaChwYXJ0LnRleHQpO1xuICB9XG4gIGNvbnN0IGpvaW5lZCA9IHRleHQuam9pbihcIlwiKTtcbiAgcmV0dXJuIGpvaW5lZCB8fCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZWQodmFsdWU6IHVua25vd24sIGxpbWl0ID0gVFJBQ0VfSU9fTElNSVQpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpPy5zbGljZSgwLCBsaW1pdCkgPz8gU3RyaW5nKHZhbHVlKS5zbGljZSgwLCBsaW1pdCk7XG59XG5cbmZ1bmN0aW9uIHNzZUZyYW1lKGxpbmU6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIWxpbmUuc3RhcnRzV2l0aChcImRhdGE6XCIpKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gcGFyc2UobGluZS5zbGljZSg1KSk7XG59XG5cbmZ1bmN0aW9uIHZhbHVlVXNlc0dlbmllKHZhbHVlOiB1bmtub3duLCBkZXB0aCA9IDApOiBib29sZWFuIHtcbiAgaWYgKGRlcHRoID4gMykgcmV0dXJuIGZhbHNlO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5zb21lKChpdGVtKSA9PiB2YWx1ZVVzZXNHZW5pZShpdGVtLCBkZXB0aCArIDEpKTtcbiAgaWYgKCFpc1JlY29yZCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIHZhbHVlLnR5cGUgPT09IFwiZGF0YS1nZW5pZS1wcm9ncmVzc1wiIHx8XG4gICAgdmFsdWUudHlwZSA9PT0gXCJhc2tfZ2VuaWVfZG9uZVwiIHx8XG4gICAgdmFsdWUudG9vbE5hbWUgPT09IFwiYXNrX2dlbmllXCIgfHxcbiAgICB2YWx1ZS50b29sX25hbWUgPT09IFwiYXNrX2dlbmllXCIgfHxcbiAgICB2YWx1ZS5uYW1lID09PSBcImFza19nZW5pZVwiXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBbXCJkYXRhXCIsIFwiZXZlbnRcIiwgXCJwYXlsb2FkXCJdLnNvbWUoKGtleSkgPT4gdmFsdWVVc2VzR2VuaWUodmFsdWVba2V5XSwgZGVwdGggKyAxKSk7XG59XG5cbi8qKiBSZXR1cm4gdGhlIGFzc2lzdGFudCB0ZXh0IGZyb20gb25lIFNTRSBsaW5lLCBvciBhbiBlbXB0eSBzdHJpbmcuICovXG5mdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZUxpbmUobGluZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFzc2lzdGFudFRleHRGcm9tU3NlRnJhbWUoc3NlRnJhbWUobGluZSkpO1xufVxuXG5mdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKGZyYW1lOiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKCFpc1JlY29yZChmcmFtZSkgfHwgZnJhbWUudHlwZSAhPT0gXCJ0ZXh0LWRlbHRhXCIpIHJldHVybiBcIlwiO1xuICBjb25zdCB0ZXh0ID1cbiAgICB0eXBlb2YgZnJhbWUuZGVsdGEgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZnJhbWUuZGVsdGFcbiAgICAgIDogaXNSZWNvcmQoZnJhbWUucGF5bG9hZClcbiAgICAgICAgPyBmcmFtZS5wYXlsb2FkLnRleHRcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgdGV4dCA9PT0gXCJzdHJpbmdcIiA/IHRleHQgOiBcIlwiO1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlIHRoZSBhc3Npc3RhbnQncyBhbnN3ZXIgb3V0IG9mIGFuIEFJIFNESyBTU0UgdHJhbnNjcmlwdC5cbiAqXG4gKiBUaGUgYWdlbnQgc3RyZWFtcyBpdHMgcmVwbHkgYXMgYHRleHQtZGVsdGFgIGZyYW1lc1xuICogKGBkYXRhOiB7XCJ0eXBlXCI6XCJ0ZXh0LWRlbHRhXCIsXCJwYXlsb2FkXCI6e1widGV4dFwiOlwiLi4uXCJ9fWApLCBzbyB0aGUgZnVsbFxuICogYW5zd2VyIG9ubHkgZXZlciBleGlzdHMgYXMgZGVsdGFzIG9uIHRoZSB3aXJlIGFuZCBoYXMgdG8gYmVcbiAqIHJlYXNzZW1ibGVkIGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbVNzZShib2R5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGJvZHkuc3BsaXQoXCJcXG5cIikpIHtcbiAgICBjb25zdCB0ZXh0ID0gYXNzaXN0YW50VGV4dEZyb21Tc2VMaW5lKGxpbmUpO1xuICAgIGlmICh0ZXh0KSBwYXJ0cy5wdXNoKHRleHQpO1xuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKFwiXCIpLnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbn1cblxuLyoqIFJlYWQgdGhlIGZpbmFsIGFzc2lzdGFudCB0ZXh0IGZyb20gYSBub24tc3RyZWFtaW5nIE1hc3RyYSByZXNwb25zZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3Npc3RhbnRUZXh0RnJvbUpzb24oYm9keTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICghaXNSZWNvcmQoYm9keSkgfHwgdHlwZW9mIGJvZHkudGV4dCAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiXCI7XG4gIHJldHVybiBib2R5LnRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG5jb25zdCBNQVNUUkFfQUdFTlRfSU5QVVRfQVRUUiA9IFwibWFzdHJhLmFnZW50X3J1bi5pbnB1dFwiO1xuY29uc3QgTUFTVFJBX0FHRU5UX09VVFBVVF9BVFRSID0gXCJtYXN0cmEuYWdlbnRfcnVuLm91dHB1dFwiO1xuY29uc3QgR0VOX0FJX1JFUVVFU1RfTU9ERUxfQVRUUiA9IFwiZ2VuX2FpLnJlcXVlc3QubW9kZWxcIjtcbmNvbnN0IEdFTl9BSV9BR0VOVF9JRF9BVFRSID0gXCJnZW5fYWkuYWdlbnQuaWRcIjtcbmNvbnN0IEdFTl9BSV9BR0VOVF9OQU1FX0FUVFIgPSBcImdlbl9haS5hZ2VudC5uYW1lXCI7XG5jb25zdCBNQVNUUkFfTU9ERUxfTUVUQURBVEFfQVRUUiA9IFwibWFzdHJhLm1ldGFkYXRhLm1vZGVsTWV0YWRhdGFcIjtcbmNvbnN0IE1BU1RSQV9NRVRBREFUQV9QUkVGSVggPSBcIm1hc3RyYS5tZXRhZGF0YS5cIjtcblxuaW50ZXJmYWNlIEFwcE1sZmxvd1RyYWNlU3RhdGUge1xuICByZWFkb25seSB0YWdzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBnZW5pZTogYm9vbGVhbjtcbiAgbW9kZWw/OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGF0dHJpYnV0ZVN0cmluZyhzcGFuOiBSZWFkYWJsZVNwYW4sIG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gc3Bhbi5hdHRyaWJ1dGVzW25hbWVdO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gKHRyaW1Ub051bGwodmFsdWUpID8/IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG1ldGFkYXRhQXR0cmlidXRlKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke01BU1RSQV9NRVRBREFUQV9QUkVGSVh9JHtrZXl9YDtcbn1cblxuZnVuY3Rpb24gbW9kZWxGcm9tU3BhbihzcGFuOiBSZWFkYWJsZVNwYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkaXJlY3QgPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgR0VOX0FJX1JFUVVFU1RfTU9ERUxfQVRUUik7XG4gIGlmIChkaXJlY3QpIHJldHVybiBkaXJlY3Q7XG4gIGNvbnN0IG1ldGFkYXRhID0gcGFyc2UoYXR0cmlidXRlU3RyaW5nKHNwYW4sIE1BU1RSQV9NT0RFTF9NRVRBREFUQV9BVFRSKSk7XG4gIHJldHVybiBpc1JlY29yZChtZXRhZGF0YSkgJiYgdHlwZW9mIG1ldGFkYXRhLm1vZGVsSWQgPT09IFwic3RyaW5nXCJcbiAgICA/ICh0cmltVG9OdWxsKG1ldGFkYXRhLm1vZGVsSWQpID8/IHVuZGVmaW5lZClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3BhblVzZXNHZW5pZShzcGFuOiBSZWFkYWJsZVNwYW4pOiBib29sZWFuIHtcbiAgaWYgKHNwYW4uYXR0cmlidXRlc1tNTEZMT1dfR0VOSUVfVEFHX0FUVFJdID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG4gIGlmICgvXFxiYXNrX2dlbmllKD86X3xcXGIpL2kudGVzdChzcGFuLm5hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIFtcImdlbl9haS50b29sLm5hbWVcIiwgXCJtYXN0cmEudG9vbF9jYWxsLm5hbWVcIl0uc29tZSgobmFtZSkgPT5cbiAgICAvXmFza19nZW5pZSg/Ol98JCkvaS50ZXN0KGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBuYW1lKSA/PyBcIlwiKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFRyYWNlVGFncyhzcGFuOiBSZWFkYWJsZVNwYW4sIHN0YXRlOiBBcHBNbGZsb3dUcmFjZVN0YXRlKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzcGFuLmF0dHJpYnV0ZXMpKSB7XG4gICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoTUxGTE9XX1RSQUNFX1RBR19QUkVGSVgpKSBjb250aW51ZTtcbiAgICBjb25zdCB0YWcgPSBuYW1lLnNsaWNlKE1MRkxPV19UUkFDRV9UQUdfUFJFRklYLmxlbmd0aCk7XG4gICAgaWYgKFxuICAgICAgdGFnICYmXG4gICAgICAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKVxuICAgICkge1xuICAgICAgc3RhdGUudGFncy5zZXQodGFnLCBTdHJpbmcodmFsdWUpKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaHJUaW1lTWlsbGlzZWNvbmRzKHZhbHVlOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdKTogbnVtYmVyIHtcbiAgcmV0dXJuIHZhbHVlWzBdICogMV8wMDAgKyB2YWx1ZVsxXSAvIDFfMDAwXzAwMDtcbn1cblxuZnVuY3Rpb24gcHJldmlld0lucHV0KHNwYW46IFJlYWRhYmxlU3Bhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBNQVNUUkFfQUdFTlRfSU5QVVRfQVRUUik7XG4gIGlmICghcmF3KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKHRleHRPbmx5Q2hhdElucHV0KHBhcnNlKHJhdykpID8/IHJhdykuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG5mdW5jdGlvbiBwcmV2aWV3T3V0cHV0KHNwYW46IFJlYWRhYmxlU3Bhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBNQVNUUkFfQUdFTlRfT1VUUFVUX0FUVFIpO1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2UocmF3KTtcbiAgY29uc3QgdGV4dCA9IGFzc2lzdGFudFRleHRGcm9tSnNvbihwYXJzZWQpIHx8ICh0eXBlb2YgcGFyc2VkID09PSBcInN0cmluZ1wiID8gcGFyc2VkIDogcmF3KTtcbiAgcmV0dXJuIHRleHQuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpO1xufVxuXG4vKiogUHJvbW90ZSB0aGUgYWN0dWFsIE1hc3RyYSBgaW52b2tlX2FnZW50YCB0cmFjZSBleHBvcnRlZCBieSBBcHBLaXQncyBwcm92aWRlci4gKi9cbmV4cG9ydCBjbGFzcyBBcHBNbGZsb3dUcmFjZUluZm9TcGFuUHJvY2Vzc29yIGltcGxlbWVudHMgU3BhblByb2Nlc3NvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhY2VzID0gbmV3IE1hcDxzdHJpbmcsIEFwcE1sZmxvd1RyYWNlU3RhdGU+KCk7XG5cbiAgb25TdGFydChzcGFuOiBTZGtTcGFuLCBfcGFyZW50Q29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBpZiAoIXRoaXMudHJhY2VzLmhhcyh0cmFjZUlkKSkge1xuICAgICAgdGhpcy50cmFjZXMuc2V0KHRyYWNlSWQsIHsgdGFnczogbmV3IE1hcCgpLCBnZW5pZTogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgb25FbmQoc3BhbjogUmVhZGFibGVTcGFuKTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2VJZCA9IHNwYW4uc3BhbkNvbnRleHQoKS50cmFjZUlkO1xuICAgIGNvbnN0IHN0YXRlOiBBcHBNbGZsb3dUcmFjZVN0YXRlID0gdGhpcy50cmFjZXMuZ2V0KHRyYWNlSWQpID8/IHtcbiAgICAgIHRhZ3M6IG5ldyBNYXAoKSxcbiAgICAgIGdlbmllOiBmYWxzZSxcbiAgICB9O1xuICAgIHRoaXMudHJhY2VzLnNldCh0cmFjZUlkLCBzdGF0ZSk7XG4gICAgY29sbGVjdFRyYWNlVGFncyhzcGFuLCBzdGF0ZSk7XG4gICAgc3RhdGUubW9kZWwgPz89IG1vZGVsRnJvbVNwYW4oc3Bhbik7XG4gICAgc3RhdGUuZ2VuaWUgfHw9IHNwYW5Vc2VzR2VuaWUoc3Bhbik7XG5cbiAgICBpZiAoYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSKSAhPT0gXCJpbnZva2VfYWdlbnRcIikge1xuICAgICAgaWYgKCFzcGFuLnBhcmVudFNwYW5Db250ZXh0Py5zcGFuSWQpIHRoaXMudHJhY2VzLmRlbGV0ZSh0cmFjZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2VudCA9XG4gICAgICBzdGF0ZS5tb2RlbCA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9JRF9BVFRSKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIEdFTl9BSV9BR0VOVF9OQU1FX0FUVFIpO1xuICAgIGlmIChhZ2VudCkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0FHRU5UX1RBRywgYWdlbnQpO1xuICAgIGlmIChzdGF0ZS5nZW5pZSkgc3RhdGUudGFncy5zZXQoTUxGTE9XX0dFTklFX1RBRywgXCJ0cnVlXCIpO1xuICAgIGNvbnN0IGF1dGggPSBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgbWV0YWRhdGFBdHRyaWJ1dGUoTUFTVFJBX0FVVEhfTU9ERV9LRVkpKTtcbiAgICBpZiAoYXV0aCA9PT0gXCJvYm9cIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX09CT19BVVRIX1RBRywgXCJ0cnVlXCIpO1xuICAgIGVsc2UgaWYgKGF1dGggPT09IFwic2VydmljZS1wcmluY2lwYWxcIikgc3RhdGUudGFncy5zZXQoTUxGTE9XX1NQX0FVVEhfVEFHLCBcInRydWVcIik7XG5cbiAgICBjb25zdCB1c2VyID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVVNFUl9FTUFJTF9LRVkpKSA/P1xuICAgICAgYXR0cmlidXRlU3RyaW5nKHNwYW4sIG1ldGFkYXRhQXR0cmlidXRlKE1BU1RSQV9VU0VSX05BTUVfS0VZKSkgPz9cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKSk7XG4gICAgY29uc3Qgc2Vzc2lvbklkID1cbiAgICAgIGF0dHJpYnV0ZVN0cmluZyhzcGFuLCBtZXRhZGF0YUF0dHJpYnV0ZShNQVNUUkFfVEhSRUFEX0lEX0tFWSkpID8/XG4gICAgICBhdHRyaWJ1dGVTdHJpbmcoc3BhbiwgXCJnZW5fYWkuY29udmVyc2F0aW9uLmlkXCIpO1xuICAgIGNvbnN0IHJlcXVlc3RQcmV2aWV3ID0gcHJldmlld0lucHV0KHNwYW4pO1xuICAgIGNvbnN0IHJlc3BvbnNlUHJldmlldyA9IHByZXZpZXdPdXRwdXQoc3Bhbik7XG4gICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICB0cmFjZUlkLFxuICAgICAgcmVxdWVzdFRpbWU6IGhyVGltZU1pbGxpc2Vjb25kcyhzcGFuLnN0YXJ0VGltZSksXG4gICAgICBleGVjdXRpb25EdXJhdGlvbjogaHJUaW1lTWlsbGlzZWNvbmRzKHNwYW4uZHVyYXRpb24pLFxuICAgICAgZXJyb3I6IHNwYW4uc3RhdHVzLmNvZGUgPT09IFNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgdGFnczogT2JqZWN0LmZyb21FbnRyaWVzKHN0YXRlLnRhZ3MpLFxuICAgICAgLi4uKHVzZXIgPyB7IHVzZXIgfSA6IHt9KSxcbiAgICAgIC4uLihzZXNzaW9uSWQgPyB7IHNlc3Npb25JZCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgfSk7XG4gICAgdGhpcy50cmFjZXMuZGVsZXRlKHRyYWNlSWQpO1xuICB9XG5cbiAgYXN5bmMgZm9yY2VGbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgYXN5bmMgc2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy50cmFjZXMuY2xlYXIoKTtcbiAgfVxufVxuXG5sZXQgYXBwTWxmbG93VHJhY2VJbmZvUHJvY2Vzc29yUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogUmVnaXN0ZXIgdHJhY2UgZW5yaWNobWVudCBiZWZvcmUgQXBwS2l0IGNvbnN0cnVjdHMgaXRzIG5hdGl2ZSBwcm92aWRlci4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvcigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb1Byb2Nlc3NvclJlZ2lzdGVyZWQpIHJldHVybiB0cnVlO1xuICBpZiAoIWFwcE1sZmxvd1RyYWNlSW5mb0NvbmZpZ3VyZWQoKSkgcmV0dXJuIGZhbHNlO1xuICBhd2FpdCBpbml0aWFsaXplQXBwTWxmbG93VHJhY2VJbmZvKCk7XG4gIGF3YWl0IHJlZ2lzdGVyTmF0aXZlU3BhblByb2Nlc3NvcihuZXcgQXBwTWxmbG93VHJhY2VJbmZvU3BhblByb2Nlc3NvcigpKTtcbiAgYXBwTWxmbG93VHJhY2VJbmZvUHJvY2Vzc29yUmVnaXN0ZXJlZCA9IHRydWU7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogSW5jcmVtZW50YWxseSBhc3NlbWJsZSBVVEYtOCBTU0UgdGV4dCB3aGlsZSByZXRhaW5pbmcgYSBib3VuZGVkIEpTT04gZmFsbGJhY2suICovXG5jbGFzcyBBc3Npc3RhbnRSZXNwb25zZUNvbGxlY3RvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKFwidXRmOFwiKTtcbiAgcHJpdmF0ZSBhbnN3ZXIgPSBcIlwiO1xuICBwcml2YXRlIGJvZHkgPSBcIlwiO1xuICBwcml2YXRlIHBlbmRpbmdMaW5lID0gXCJcIjtcbiAgcHJpdmF0ZSBmaW5pc2hlZCA9IGZhbHNlO1xuICBwcml2YXRlIGdlbmllID0gZmFsc2U7XG5cbiAgd3JpdGUoY2h1bms6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maW5pc2hlZCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgY2h1bmsgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuY29uc3VtZShjaHVuayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcoY2h1bmspKSB7XG4gICAgICB0aGlzLmNvbnN1bWUoXG4gICAgICAgIHRoaXMuZGVjb2Rlci53cml0ZShCdWZmZXIuZnJvbShjaHVuay5idWZmZXIsIGNodW5rLmJ5dGVPZmZzZXQsIGNodW5rLmJ5dGVMZW5ndGgpKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgZmluaXNoKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZmluaXNoZWQpIHJldHVybiB0aGlzLmFuc3dlciB8fCB0aGlzLmpzb25BbnN3ZXIoKTtcbiAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnN1bWUodGhpcy5kZWNvZGVyLmVuZCgpKTtcbiAgICB0aGlzLmNvbnN1bWVTc2VMaW5lKHRoaXMucGVuZGluZ0xpbmUpO1xuICAgIHRoaXMucGVuZGluZ0xpbmUgPSBcIlwiO1xuICAgIHJldHVybiB0aGlzLmFuc3dlciB8fCB0aGlzLmpzb25BbnN3ZXIoKTtcbiAgfVxuXG4gIHJhd0JvZHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ib2R5LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUKTtcbiAgfVxuXG4gIHVzZWRHZW5pZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZW5pZTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRleHQpIHJldHVybjtcbiAgICBpZiAodGhpcy5ib2R5Lmxlbmd0aCA8IFJFU1BPTlNFX0JPRFlfTElNSVQpIHtcbiAgICAgIHRoaXMuYm9keSArPSB0ZXh0LnNsaWNlKDAsIFJFU1BPTlNFX0JPRFlfTElNSVQgLSB0aGlzLmJvZHkubGVuZ3RoKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nTGluZSArPSB0ZXh0O1xuICAgIGxldCBuZXdsaW5lID0gdGhpcy5wZW5kaW5nTGluZS5pbmRleE9mKFwiXFxuXCIpO1xuICAgIHdoaWxlIChuZXdsaW5lID49IDApIHtcbiAgICAgIHRoaXMuY29uc3VtZVNzZUxpbmUodGhpcy5wZW5kaW5nTGluZS5zbGljZSgwLCBuZXdsaW5lKS5yZXBsYWNlKC9cXHIkLywgXCJcIikpO1xuICAgICAgdGhpcy5wZW5kaW5nTGluZSA9IHRoaXMucGVuZGluZ0xpbmUuc2xpY2UobmV3bGluZSArIDEpO1xuICAgICAgbmV3bGluZSA9IHRoaXMucGVuZGluZ0xpbmUuaW5kZXhPZihcIlxcblwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGVuZGluZ0xpbmUubGVuZ3RoID4gUkVTUE9OU0VfQk9EWV9MSU1JVCkge1xuICAgICAgdGhpcy5wZW5kaW5nTGluZSA9IHRoaXMucGVuZGluZ0xpbmUuc2xpY2UoLVJFU1BPTlNFX0JPRFlfTElNSVQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uc3VtZVNzZUxpbmUobGluZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZnJhbWUgPSBzc2VGcmFtZShsaW5lKTtcbiAgICB0aGlzLmdlbmllIHx8PSB2YWx1ZVVzZXNHZW5pZShmcmFtZSk7XG4gICAgaWYgKHRoaXMuYW5zd2VyLmxlbmd0aCA+PSBUUkFDRV9JT19MSU1JVCkgcmV0dXJuO1xuICAgIGNvbnN0IHRleHQgPSBhc3Npc3RhbnRUZXh0RnJvbVNzZUZyYW1lKGZyYW1lKTtcbiAgICB0aGlzLmFuc3dlciArPSB0ZXh0LnNsaWNlKDAsIFRSQUNFX0lPX0xJTUlUIC0gdGhpcy5hbnN3ZXIubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUganNvbkFuc3dlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBhc3Npc3RhbnRUZXh0RnJvbUpzb24ocGFyc2UodGhpcy5ib2R5KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlY3QgdGhlIHNwYW4gTUxmbG93IHRyZWF0cyBhcyB0aGUgcmVxdWVzdCByb290LlxuICpcbiAqIE9UZWwgSFRUUCBpbnN0cnVtZW50YXRpb24gc3RvcmVzIGl0cyBzZXJ2ZXIgc3BhbiBpbiBSUEMgbWV0YWRhdGEuIFRoYXQgc3BhblxuICogd2lucyBvdmVyIGFuIGFjdGl2ZSBFeHByZXNzIGNoaWxkLiBJZiBubyByZWNvcmRpbmcgbG9jYWwgc3BhbiBleGlzdHMsIGNyZWF0ZVxuICogb25lIHVuZGVyIHRoZSBjdXJyZW50IGNvbnRleHQgc28gZW5hYmxlZCBXM0MgcHJvcGFnYXRpb24gcmVtYWlucyBpbnRhY3QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVUcmFjZVRhcmdldCgpOiBUcmFjZVRhcmdldCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGFjdGl2ZUNvbnRleHQgPSBjb250ZXh0LmFjdGl2ZSgpO1xuICBpZiAoZGlyZWN0TWxmbG93VHJhY2luZ0FjdGl2ZSgpKSB7XG4gICAgY29uc3Qgc3BhbiA9IHRyYWNlLmdldFRyYWNlcihDSEFUX1RVUk5fVFJBQ0VSKS5zdGFydFNwYW4oXG4gICAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICAgIHtcbiAgICAgICAga2luZDogU3BhbktpbmQuU0VSVkVSLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgW0FQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFJdOiB0cnVlLFxuICAgICAgICAgIFtNTEZMT1dfU1BBTl9UWVBFX0FUVFJdOiBNTEZMT1dfU1BBTl9UWVBFX0FHRU5ULFxuICAgICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdHJhY2UuZGVsZXRlU3BhbihhY3RpdmVDb250ZXh0KSxcbiAgICApO1xuICAgIGlmICghc3Bhbi5pc1JlY29yZGluZygpKSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbiAgfVxuXG4gIGNvbnN0IHJwYyA9IGdldFJQQ01ldGFkYXRhKGFjdGl2ZUNvbnRleHQpO1xuICBpZiAocnBjPy50eXBlID09PSBSUENUeXBlLkhUVFAgJiYgcnBjLnNwYW4uaXNSZWNvcmRpbmcoKSkge1xuICAgIHJldHVybiB7IHNwYW46IHJwYy5zcGFuLCBvd25lZDogZmFsc2UgfTtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZSA9IHRyYWNlLmdldEFjdGl2ZVNwYW4oKTtcbiAgaWYgKGFjdGl2ZT8uaXNSZWNvcmRpbmcoKSkgcmV0dXJuIHsgc3BhbjogYWN0aXZlLCBvd25lZDogZmFsc2UgfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2UuZ2V0VHJhY2VyKENIQVRfVFVSTl9UUkFDRVIpLnN0YXJ0U3BhbihcbiAgICBcIm1hc3RyYS5jaGF0X3R1cm5cIixcbiAgICB7XG4gICAgICBraW5kOiBTcGFuS2luZC5TRVJWRVIsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIFtBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSXTogdHJ1ZSxcbiAgICAgICAgW01MRkxPV19TUEFOX1RZUEVfQVRUUl06IE1MRkxPV19TUEFOX1RZUEVfQUdFTlQsXG4gICAgICAgIFtHRU5fQUlfT1BFUkFUSU9OX05BTUVfQVRUUl06IFwiaW52b2tlX2FnZW50XCIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgYWN0aXZlQ29udGV4dCxcbiAgKTtcbiAgaWYgKCFzcGFuLmlzUmVjb3JkaW5nKCkpIHtcbiAgICBzcGFuLmVuZCgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHsgc3Bhbiwgb3duZWQ6IHRydWUgfTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCBzdGFtcHMgY2hhdCB0dXJuIEkvTyBvbnRvIHRoZSBleHBvcnRlZCBPVGVsIHJvb3QuXG4gKlxuICogVGVlIGByZXMud3JpdGVgLCBgcmVzLmpzb25gLCBhbmQgYHJlcy5lbmRgIGluc3RlYWQgb2YgbGlzdGVuaW5nIGZvciBgZmluaXNoYDpcbiAqIEhUVFAgaW5zdHJ1bWVudGF0aW9uIGVuZHMgaXRzIHNlcnZlciBzcGFuIG9uIGZpbmlzaCwgYW5kIGF0dHJpYnV0ZXMgc2V0XG4gKiBhZnRlciBhIHNwYW4gZW5kcyBuZXZlciByZWFjaCB0aGUgZXhwb3J0ZXIuXG4gKlxuICogYHBhdGhgIGlzIG1vdW50LXJlbGF0aXZlICh3aGF0IHRoZSBNYXN0cmEgc3ViLWFwcCBzZWVzKSwgZS5nLlxuICogYC9hZ2VudHMvc3VwcG9ydC9zdHJlYW1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlKFxuICByZXE6IGV4cHJlc3MuUmVxdWVzdCxcbiAgcmVzOiBleHByZXNzLlJlc3BvbnNlLFxuICBuZXh0OiBleHByZXNzLk5leHRGdW5jdGlvbixcbiAgb3B0aW9uczogQ2hhdFR1cm5UZWxlbWV0cnlPcHRpb25zID0ge30sXG4pOiB2b2lkIHtcbiAgaWYgKHJlcS5tZXRob2QgIT09IFwiUE9TVFwiIHx8ICFBR0VOVF9UVVJOX1JPVVRFLnRlc3QocmVxLnBhdGgpKSB7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSByZXNvbHZlVHJhY2VUYXJnZXQoKTtcbiAgaWYgKCF0YXJnZXQpIHtcbiAgICBuZXh0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhcmdldFRyYWNlSWQgPSB0cmFjZUlkKHRhcmdldC5zcGFuKTtcbiAgaWYgKCF0YXJnZXRUcmFjZUlkKSB7XG4gICAgaWYgKHRhcmdldC5vd25lZCkgdGFyZ2V0LnNwYW4uZW5kKCk7XG4gICAgbmV4dCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0cmFjZVN0YXRlOiBDaGF0VHJhY2VTdGF0ZSA9IHtcbiAgICB0YWdzOiBuZXcgTWFwKCksXG4gICAgdHJhY2VJZDogdGFyZ2V0VHJhY2VJZCxcbiAgICBwYXJlbnRTcGFuSWQ6IHRhcmdldC5zcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkLFxuICB9O1xuICBjb25zdCB0cmFjZVJlcXVlc3RUaW1lID0gRGF0ZS5ub3coKTtcbiAgaWYgKCFpc0RhdGFicmlja3NBcHBFbnYoKSkge1xuICAgIHNldENoYXRUcmFjZVRhZyh0cmFjZVN0YXRlLCBNTEZMT1dfTE9DQUxfVEFHLCB0cnVlKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZ2V0UmVxdWVzdFRhZ3MocmVxKSkpIHtcbiAgICBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICB9XG4gIGNvbnN0IGluaXRpYWxUYWdzID0gdHlwZW9mIG9wdGlvbnMudGFncyA9PT0gXCJmdW5jdGlvblwiID8gb3B0aW9ucy50YWdzKHJlcSkgOiBvcHRpb25zLnRhZ3M7XG4gIGlmIChpbml0aWFsVGFncykge1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsVGFncykpIHtcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgbmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICBzdGFtcE1sZmxvd1RyYWNlSWQocmVzLCB0cmFjZVN0YXRlLnRyYWNlSWQpO1xuICB0cmFjZVN0YXRlLnVzZXIgPSBzdGFtcE1sZmxvd0FjdG9yKHRhcmdldC5zcGFuLCByZXEpO1xuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NQQU5fVFlQRV9BVFRSLCBNTEZMT1dfU1BBTl9UWVBFX0FHRU5UKTtcbiAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKEdFTl9BSV9PUEVSQVRJT05fTkFNRV9BVFRSLCBcImludm9rZV9hZ2VudFwiKTtcbiAgY29uc3QgaWRlbnRpdHkgPVxuICAgIHR5cGVvZiBvcHRpb25zLmlkZW50aXR5ID09PSBcImZ1bmN0aW9uXCIgPyBvcHRpb25zLmlkZW50aXR5KHJlcSkgOiBvcHRpb25zLmlkZW50aXR5O1xuICBpZiAoaWRlbnRpdHkpIHtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9JREVOVElUWV9BVFRSLCBpZGVudGl0eSk7XG4gICAgc2V0Q2hhdFRyYWNlVGFnKFxuICAgICAgdHJhY2VTdGF0ZSxcbiAgICAgIGlkZW50aXR5ID09PSBcIm9ib1wiID8gTUxGTE9XX09CT19BVVRIX1RBRyA6IE1MRkxPV19TUF9BVVRIX1RBRyxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgfVxuICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9HRU5JRV9VU0VEX0FUVFIsIGZhbHNlKTtcblxuICBjb25zdCBtZXNzYWdlcyA9IChyZXEuYm9keSBhcyB7IG1lc3NhZ2VzPzogdW5rbm93biB9IHwgdW5kZWZpbmVkKT8ubWVzc2FnZXM7XG4gIGxldCByZXF1ZXN0UHJldmlldzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAobWVzc2FnZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZ1bGxJbnB1dCA9IHNlcmlhbGl6ZWQobWVzc2FnZXMpO1xuICAgIHJlcXVlc3RQcmV2aWV3ID0gdGV4dE9ubHlDaGF0SW5wdXQobWVzc2FnZXMpID8/IGZ1bGxJbnB1dDtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9NRVNTQUdFU19BVFRSLCBmdWxsSW5wdXQpO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfU1BBTl9JTlBVVFNfQVRUUiwgcmVxdWVzdFByZXZpZXcuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpKTtcbiAgfVxuXG4gIGNvbnN0IGNvbGxlY3RvciA9IG5ldyBBc3Npc3RhbnRSZXNwb25zZUNvbGxlY3RvcigpO1xuICBsZXQgcmVzcG9uc2VQcmV2aWV3OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBvdXRwdXRSZWNvcmRlZCA9IGZhbHNlO1xuICBsZXQgZnVsbE91dHB1dFJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBnZW5pZVJlY29yZGVkID0gZmFsc2U7XG4gIGxldCBvd25lZFNwYW5FbmRlZCA9IGZhbHNlO1xuICBsZXQgdHJhY2VGaW5hbGl6ZWQgPSBmYWxzZTtcbiAgY29uc3QgcGFzc1Rocm91Z2hXcml0ZSA9IHJlcy53cml0ZS5iaW5kKHJlcykgYXMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYm9vbGVhbjtcbiAgY29uc3QgcGFzc1Rocm91Z2hFbmQgPSByZXMuZW5kLmJpbmQocmVzKSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICBjb25zdCBwYXNzVGhyb3VnaEpzb24gPSByZXMuanNvbi5iaW5kKHJlcykgYXMgKGJvZHk/OiB1bmtub3duKSA9PiBleHByZXNzLlJlc3BvbnNlO1xuICBjb25zdCByZWNvcmRPdXRwdXQgPSAoYW5zd2VyOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAob3V0cHV0UmVjb3JkZWQgfHwgIWFuc3dlcikgcmV0dXJuO1xuICAgIHJlc3BvbnNlUHJldmlldyA9IGFuc3dlcjtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoTUxGTE9XX1NQQU5fT1VUUFVUU19BVFRSLCBhbnN3ZXIuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpKTtcbiAgICBvdXRwdXRSZWNvcmRlZCA9IHRydWU7XG4gIH07XG4gIGNvbnN0IHJlY29yZEZ1bGxPdXRwdXQgPSAocmVzcG9uc2U6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChmdWxsT3V0cHV0UmVjb3JkZWQgfHwgIXJlc3BvbnNlKSByZXR1cm47XG4gICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKENIQVRfUkVTUE9OU0VfQVRUUiwgcmVzcG9uc2Uuc2xpY2UoMCwgVFJBQ0VfSU9fTElNSVQpKTtcbiAgICBmdWxsT3V0cHV0UmVjb3JkZWQgPSB0cnVlO1xuICB9O1xuICBjb25zdCByZWNvcmRHZW5pZSA9ICh1c2VkOiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgaWYgKCF1c2VkIHx8IGdlbmllUmVjb3JkZWQpIHJldHVybjtcbiAgICBnZW5pZVJlY29yZGVkID0gdHJ1ZTtcbiAgICB0YXJnZXQuc3Bhbi5zZXRBdHRyaWJ1dGUoQ0hBVF9HRU5JRV9VU0VEX0FUVFIsIHRydWUpO1xuICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShNTEZMT1dfR0VOSUVfVEFHX0FUVFIsIFwidHJ1ZVwiKTtcbiAgICBzZXRDaGF0VHJhY2VUYWcodHJhY2VTdGF0ZSwgTUxGTE9XX0dFTklFX1RBRywgdHJ1ZSk7XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZVRhZ3MoeyBbTUxGTE9XX0dFTklFX1RBR106IFwidHJ1ZVwiIH0pO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBmaW5hbGl6ZVRyYWNlID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICh0cmFjZUZpbmFsaXplZCkgcmV0dXJuO1xuICAgIHRyYWNlRmluYWxpemVkID0gdHJ1ZTtcbiAgICBjb25zdCB0YWdzID0gT2JqZWN0LmZyb21FbnRyaWVzKHRyYWNlU3RhdGUudGFncyk7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHRyYWNlU3RhdGUudGFncykge1xuICAgICAgdGFyZ2V0LnNwYW4uc2V0QXR0cmlidXRlKGAke01MRkxPV19UUkFDRV9UQUdfUFJFRklYfSR7bmFtZX1gLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0cmFjZVN0YXRlLnVzZXIpIHtcbiAgICAgIHRhcmdldC5zcGFuLnNldEF0dHJpYnV0ZShVU0VSX1RSQUNFX0FUVFJJQlVURSwgdHJhY2VTdGF0ZS51c2VyKTtcbiAgICB9XG4gICAgY29udGV4dC53aXRoKHRyYWNlLnNldFNwYW4oY29udGV4dC5hY3RpdmUoKSwgdGFyZ2V0LnNwYW4pLCAoKSA9PiB7XG4gICAgICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7XG4gICAgICAgIC4uLihPYmplY3Qua2V5cyh0YWdzKS5sZW5ndGggPiAwID8geyB0YWdzIH0gOiB7fSksXG4gICAgICAgIC4uLih0cmFjZVN0YXRlLnVzZXIgPyB7IHVzZXI6IHRyYWNlU3RhdGUudXNlciB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKCFpc0RhdGFicmlja3NBcHBFbnYoKSkge1xuICAgICAgcGVyc2lzdEFwcE1sZmxvd1RyYWNlSW5mbyh7XG4gICAgICAgIHRyYWNlSWQ6IHRyYWNlU3RhdGUudHJhY2VJZCxcbiAgICAgICAgcmVxdWVzdFRpbWU6IHRyYWNlUmVxdWVzdFRpbWUsXG4gICAgICAgIGV4ZWN1dGlvbkR1cmF0aW9uOiBEYXRlLm5vdygpIC0gdHJhY2VSZXF1ZXN0VGltZSxcbiAgICAgICAgZXJyb3I6IHJlcy5zdGF0dXNDb2RlID49IDUwMCxcbiAgICAgICAgdGFncyxcbiAgICAgICAgLi4uKHRyYWNlU3RhdGUudXNlciA/IHsgdXNlcjogdHJhY2VTdGF0ZS51c2VyIH0gOiB7fSksXG4gICAgICAgIC4uLihyZXF1ZXN0UHJldmlldyA/IHsgcmVxdWVzdFByZXZpZXcgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlc3BvbnNlUHJldmlldyA/IHsgcmVzcG9uc2VQcmV2aWV3IH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGVuZE93bmVkU3BhbiA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAoIXRhcmdldC5vd25lZCB8fCBvd25lZFNwYW5FbmRlZCkgcmV0dXJuO1xuICAgIG93bmVkU3BhbkVuZGVkID0gdHJ1ZTtcbiAgICB0YXJnZXQuc3Bhbi5lbmQoKTtcbiAgfTtcblxuICByZXMud3JpdGUgPSAoKGNodW5rOiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJldHVybiBwYXNzVGhyb3VnaFdyaXRlKGNodW5rLCAuLi5yZXN0KTtcbiAgfSkgYXMgdHlwZW9mIHJlcy53cml0ZTtcblxuICByZXMuanNvbiA9ICgoYm9keT86IHVua25vd24pID0+IHtcbiAgICByZWNvcmRGdWxsT3V0cHV0KHNlcmlhbGl6ZWQoYm9keSkpO1xuICAgIHJlY29yZEdlbmllKHZhbHVlVXNlc0dlbmllKGJvZHkpKTtcbiAgICByZWNvcmRPdXRwdXQoYXNzaXN0YW50VGV4dEZyb21Kc29uKGJvZHkpKTtcbiAgICByZXR1cm4gcGFzc1Rocm91Z2hKc29uKGJvZHkpO1xuICB9KSBhcyB0eXBlb2YgcmVzLmpzb247XG5cbiAgcmVzLmVuZCA9ICgoY2h1bms/OiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHtcbiAgICBjb2xsZWN0b3Iud3JpdGUoY2h1bmspO1xuICAgIHJlY29yZE91dHB1dChjb2xsZWN0b3IuZmluaXNoKCkpO1xuICAgIHJlY29yZEZ1bGxPdXRwdXQoY29sbGVjdG9yLnJhd0JvZHkoKSk7XG4gICAgcmVjb3JkR2VuaWUoY29sbGVjdG9yLnVzZWRHZW5pZSgpKTtcbiAgICBmaW5hbGl6ZVRyYWNlKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXNzVGhyb3VnaEVuZChjaHVuaywgLi4ucmVzdCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuZE93bmVkU3BhbigpO1xuICAgIH1cbiAgfSkgYXMgdHlwZW9mIHJlcy5lbmQ7XG5cbiAgcmVzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgcmVjb3JkT3V0cHV0KGNvbGxlY3Rvci5maW5pc2goKSk7XG4gICAgcmVjb3JkRnVsbE91dHB1dChjb2xsZWN0b3IucmF3Qm9keSgpKTtcbiAgICByZWNvcmRHZW5pZShjb2xsZWN0b3IudXNlZEdlbmllKCkpO1xuICAgIGZpbmFsaXplVHJhY2UoKTtcbiAgICBlbmRPd25lZFNwYW4oKTtcbiAgfSk7XG5cbiAgY29uc3QgY2hhdENvbnRleHQgPSB0cmFjZVxuICAgIC5zZXRTcGFuKGNvbnRleHQuYWN0aXZlKCksIHRhcmdldC5zcGFuKVxuICAgIC5zZXRWYWx1ZShDSEFUX1RSQUNFX1NUQVRFX0tFWSwgdHJhY2VTdGF0ZSk7XG4gIGNvbnRleHQud2l0aChjaGF0Q29udGV4dCwgKCkgPT4ge1xuICAgIG5leHQoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSW5zdGFsbCB7QGxpbmsgY2hhdFR1cm5UZWxlbWV0cnlNaWRkbGV3YXJlfSBvbiBhIE1hc3RyYSBFeHByZXNzIHN1Yi1hcHAuXG4gKlxuICogQ2FsbCBiZWZvcmUgYE1hc3RyYVNlcnZlci5pbml0KClgIHNvIHRoZSBsYXllciBzaXRzIGFoZWFkIG9mIHRoZSBhZ2VudFxuICogcm91dGVzLiBTYWZlIHRvIGNhbGwgdW5jb25kaXRpb25hbGx5OiB3aGVuIG5vIHJlY29yZGluZyB0cmFjZXIgaXMgcmVnaXN0ZXJlZCxcbiAqIHRoZSBtaWRkbGV3YXJlIGlzIGEgbm8tb3AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hDaGF0VHVyblRlbGVtZXRyeShcbiAgYXBwOiBleHByZXNzLkV4cHJlc3MsXG4gIG9wdGlvbnM6IENoYXRUdXJuVGVsZW1ldHJ5T3B0aW9ucyA9IHt9LFxuKTogdm9pZCB7XG4gIGFwcC51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiBjaGF0VHVyblRlbGVtZXRyeU1pZGRsZXdhcmUocmVxLCByZXMsIG5leHQsIG9wdGlvbnMpKTtcbiAgbG9nZ2VyLmluZm8oXCJjaGF0IHR1cm4gdGVsZW1ldHJ5IG1pZGRsZXdhcmUgYXR0YWNoZWRcIiwgb3B0aW9ucyk7XG59XG4iXX0=
@@ -9,15 +9,14 @@
9
9
  *
10
10
  * @module
11
11
  */
12
- import { object } from "@dbx-tools/shared-core";
12
+ import { sequence } from "@dbx-tools/shared-core";
13
13
  /** Distinct dot-joined field paths a failed parse flagged. */
14
14
  export function invalidFields(error) {
15
15
  return [
16
- ...object
17
- .sequence(error.issues)
16
+ ...sequence(error.issues)
18
17
  .map((issue) => issue.path.map(String).join("."))
19
18
  .filter(Boolean)
20
19
  .distinct(),
21
20
  ];
22
21
  }
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFPaEQsOERBQThEO0FBQzlELE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBbUI7SUFDL0MsT0FBTztRQUNMLEdBQUcsTUFBTTthQUNOLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO2FBQ3RCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2hELE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDZixRQUFRLEVBQUU7S0FDZCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVxdWVzdC1ib2R5IHZhbGlkYXRpb24gaGVscGVycyBzaGFyZWQgYnkgZXZlcnkgcm91dGUgdGhhdCBwYXJzZXMgYSBKU09OXG4gKiBib2R5IHdpdGggYSBzY2hlbWEgZnJvbSBgQGRieC10b29scy9zaGFyZWQtbWFzdHJhYC5cbiAqXG4gKiBBIHNjaGVtYSBsaWJyYXJ5J3Mgb3duIGlzc3VlIHRleHQgcXVvdGVzIHRoZSByZWNlaXZlZCBib2R5IGJhY2ssIHNvIGl0IGlzXG4gKiBsb2dnZWQgcmF0aGVyIHRoYW4gcmV0dXJuZWQuIFdoYXQgYSBjbGllbnQgZ2V0cyBpbnN0ZWFkIGlzIGEgc3RhYmxlIG1lc3NhZ2VcbiAqIHBsdXMgdGhlIGZpZWxkIHBhdGhzIHRoYXQgZmFpbGVkLCB3aGljaCBpcyBlbm91Z2ggdG8gaGlnaGxpZ2h0IHRoZSBvZmZlbmRpbmdcbiAqIGlucHV0cy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbi8qKiBUaGUgc3Vic2V0IG9mIGEgZmFpbGVkIHBhcnNlIHJlc3VsdCB0aGVzZSBoZWxwZXJzIHJlYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYUlzc3VlcyB7XG4gIGlzc3VlczogUmVhZG9ubHlBcnJheTx7IHBhdGg6IFByb3BlcnR5S2V5W10gfT47XG59XG5cbi8qKiBEaXN0aW5jdCBkb3Qtam9pbmVkIGZpZWxkIHBhdGhzIGEgZmFpbGVkIHBhcnNlIGZsYWdnZWQuICovXG5leHBvcnQgZnVuY3Rpb24gaW52YWxpZEZpZWxkcyhlcnJvcjogU2NoZW1hSXNzdWVzKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgIC4uLm9iamVjdFxuICAgICAgLnNlcXVlbmNlKGVycm9yLmlzc3VlcylcbiAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5wYXRoLm1hcChTdHJpbmcpLmpvaW4oXCIuXCIpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmRpc3RpbmN0KCksXG4gIF07XG59XG4iXX0=
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFPbEQsOERBQThEO0FBQzlELE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBbUI7SUFDL0MsT0FBTztRQUNMLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7YUFDdEIsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDaEQsTUFBTSxDQUFDLE9BQU8sQ0FBQzthQUNmLFFBQVEsRUFBRTtLQUNkLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXF1ZXN0LWJvZHkgdmFsaWRhdGlvbiBoZWxwZXJzIHNoYXJlZCBieSBldmVyeSByb3V0ZSB0aGF0IHBhcnNlcyBhIEpTT05cbiAqIGJvZHkgd2l0aCBhIHNjaGVtYSBmcm9tIGBAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFgLlxuICpcbiAqIEEgc2NoZW1hIGxpYnJhcnkncyBvd24gaXNzdWUgdGV4dCBxdW90ZXMgdGhlIHJlY2VpdmVkIGJvZHkgYmFjaywgc28gaXQgaXNcbiAqIGxvZ2dlZCByYXRoZXIgdGhhbiByZXR1cm5lZC4gV2hhdCBhIGNsaWVudCBnZXRzIGluc3RlYWQgaXMgYSBzdGFibGUgbWVzc2FnZVxuICogcGx1cyB0aGUgZmllbGQgcGF0aHMgdGhhdCBmYWlsZWQsIHdoaWNoIGlzIGVub3VnaCB0byBoaWdobGlnaHQgdGhlIG9mZmVuZGluZ1xuICogaW5wdXRzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgc2VxdWVuY2UgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG4vKiogVGhlIHN1YnNldCBvZiBhIGZhaWxlZCBwYXJzZSByZXN1bHQgdGhlc2UgaGVscGVycyByZWFkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFJc3N1ZXMge1xuICBpc3N1ZXM6IFJlYWRvbmx5QXJyYXk8eyBwYXRoOiBQcm9wZXJ0eUtleVtdIH0+O1xufVxuXG4vKiogRGlzdGluY3QgZG90LWpvaW5lZCBmaWVsZCBwYXRocyBhIGZhaWxlZCBwYXJzZSBmbGFnZ2VkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmFsaWRGaWVsZHMoZXJyb3I6IFNjaGVtYUlzc3Vlcyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5zZXF1ZW5jZShlcnJvci5pc3N1ZXMpXG4gICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUucGF0aC5tYXAoU3RyaW5nKS5qb2luKFwiLlwiKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5kaXN0aW5jdCgpLFxuICBdO1xufVxuIl19