@workflow/web-shared 5.0.0-beta.21 → 5.0.0-beta.23

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 (39) hide show
  1. package/dist/components/index.d.ts +1 -0
  2. package/dist/components/index.d.ts.map +1 -1
  3. package/dist/components/index.js +2 -1
  4. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts +5 -0
  5. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.d.ts.map +1 -0
  6. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.js +55 -0
  7. package/dist/components/new-trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  8. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  9. package/dist/components/new-trace-viewer/trace-viewer.js +4 -4
  10. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  11. package/dist/components/sidebar/attribute-panel.js +4 -1
  12. package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
  13. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  14. package/dist/components/sidebar/copyable-data-block.js +2 -2
  15. package/dist/components/ui/data-inspector.d.ts +6 -6
  16. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  17. package/dist/components/ui/data-inspector.js +234 -91
  18. package/dist/components/ui/data-inspector.styles.d.ts +29 -0
  19. package/dist/components/ui/data-inspector.styles.d.ts.map +1 -0
  20. package/dist/components/ui/data-inspector.styles.js +95 -0
  21. package/dist/components/ui/kbd.d.ts +9 -5
  22. package/dist/components/ui/kbd.d.ts.map +1 -1
  23. package/dist/components/ui/kbd.js +22 -3
  24. package/dist/lib/hydration.js +3 -3
  25. package/package.json +3 -4
  26. package/src/components/index.ts +1 -0
  27. package/src/components/new-trace-viewer/components/trace-shortcut-helper.module.css +20 -0
  28. package/src/components/new-trace-viewer/components/trace-shortcut-helper.tsx +116 -0
  29. package/src/components/new-trace-viewer/trace-viewer.tsx +9 -4
  30. package/src/components/sidebar/attribute-panel.tsx +4 -0
  31. package/src/components/sidebar/copyable-data-block.tsx +1 -1
  32. package/src/components/ui/data-inspector.styles.ts +96 -0
  33. package/src/components/ui/data-inspector.tsx +492 -186
  34. package/src/components/ui/kbd.tsx +33 -11
  35. package/src/lib/hydration.ts +2 -2
  36. package/dist/components/ui/inspector-theme.d.ts +0 -95
  37. package/dist/components/ui/inspector-theme.d.ts.map +0 -1
  38. package/dist/components/ui/inspector-theme.js +0 -82
  39. package/src/components/ui/inspector-theme.ts +0 -110
@@ -1,20 +1,22 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  /**
4
- * Reusable data inspector component built on react-inspector.
4
+ * Reusable data inspector for the o11y UI.
5
5
  *
6
- * All data rendering in the o11y UI should use this component to ensure
7
- * consistent theming, custom type handling (StreamRef, ClassInstanceRef),
8
- * and expand behavior.
6
+ * Renders JSON as a collapsible tree: bracket notation (`{ }` / `[ … ]`),
7
+ * colored keys, typed value colors, `▸`/`▾` disclosure icons, and a `...`
8
+ * collapsed indicator.
9
+ *
10
+ * On top of plain JSON it handles the workflow-specific value types: StreamRef /
11
+ * RunRef badges, encrypted markers, decoded byte streams, Dates, and named
12
+ * class instances.
9
13
  */
10
14
  import { Lock } from 'lucide-react';
11
- import { createContext, useContext, useEffect, useMemo, useRef, useState, } from 'react';
12
- import { ObjectInspector, ObjectLabel, ObjectName, ObjectRootLabel, ObjectValue, } from 'react-inspector';
13
- import { useDarkMode } from '../../hooks/use-dark-mode';
15
+ import { createContext, useContext, useId, useMemo, useRef, useState, } from 'react';
14
16
  import { ENCRYPTED_DISPLAY_NAME } from '../../lib/hydration';
15
17
  import { formatArrayBufferViewForDisplay, } from '../../lib/stream-display';
16
- import { inspectorThemeDark, inspectorThemeExtendedDark, inspectorThemeExtendedLight, inspectorThemeLight, } from './inspector-theme';
17
18
  import { Button } from './button';
19
+ import { CLS, JSON_VIEW_STYLES } from './data-inspector.styles';
18
20
  import { Spinner } from './spinner';
19
21
  // ---------------------------------------------------------------------------
20
22
  // StreamRef / ClassInstanceRef type detection
@@ -69,6 +71,12 @@ function isClassInstanceRef(value) {
69
71
  '__type' in value &&
70
72
  value.__type === CLASS_INSTANCE_REF_TYPE);
71
73
  }
74
+ function isEncryptedMarker(value) {
75
+ return (value !== null &&
76
+ typeof value === 'object' &&
77
+ value.constructor?.name ===
78
+ ENCRYPTED_DISPLAY_NAME);
79
+ }
72
80
  // ---------------------------------------------------------------------------
73
81
  // Stream click context (passed through from the panel)
74
82
  // ---------------------------------------------------------------------------
@@ -79,6 +87,9 @@ function isClassInstanceRef(value) {
79
87
  export const StreamClickContext = createContext(undefined);
80
88
  export const DecryptClickContext = createContext(undefined);
81
89
  export const RunClickContext = createContext(undefined);
90
+ // ---------------------------------------------------------------------------
91
+ // Workflow-specific value renderers (badges, encrypted markers, byte streams)
92
+ // ---------------------------------------------------------------------------
82
93
  function EncryptedInlineLabel() {
83
94
  const ctx = useContext(DecryptClickContext);
84
95
  if (ctx) {
@@ -120,10 +131,6 @@ function RunRefInline({ runRef }) {
120
131
  onRunClick?.(runRef.runId);
121
132
  }, title: `View run: ${runRef.runId}`, children: _jsx("span", { children: runRef.runId }) }));
122
133
  }
123
- // ---------------------------------------------------------------------------
124
- // Extended theme context (for colors react-inspector doesn't support natively)
125
- // ---------------------------------------------------------------------------
126
- const ExtendedThemeContext = createContext(inspectorThemeExtendedLight);
127
134
  function DecodedBytesChunk({ decodedText, source, }) {
128
135
  const [selectedView, setSelectedView] = useState('decoded');
129
136
  const parsed = parseChunkData(decodedText);
@@ -144,75 +151,222 @@ function DecodedBytesInspector({ decodedText, source, }) {
144
151
  const [expanded, setExpanded] = useState(false);
145
152
  return (_jsxs("div", { className: "font-mono", children: [_jsxs("button", { type: "button", className: "flex max-w-full items-start gap-1 text-left", style: { color: 'var(--ds-gray-1000)' }, onClick: () => setExpanded((value) => !value), title: `${source.type} decoded as ${source.encoding.toUpperCase()} text`, children: [_jsx("span", { className: "select-none", style: { color: 'var(--ds-gray-700)' }, children: expanded ? '▼' : '▶' }), _jsx("span", { className: "min-w-0 break-words", children: source.rawSummary })] }), expanded && (_jsxs("div", { className: "mt-1 pl-5", children: [_jsx("span", { style: { color: 'var(--ds-gray-700)' }, children: "decoded: " }), _jsx("span", { className: "whitespace-pre-wrap break-words", style: { color: 'var(--ds-green-900)' }, children: JSON.stringify(decodedText) })] }))] }));
146
153
  }
147
- function BytesDisplayLabel({ name, display, }) {
148
- return (_jsxs("div", { className: "inline-block min-w-0 align-top", children: [name != null && _jsx(ObjectName, { name: name }), name != null && _jsx("span", { children: ": " }), display.decodedFrom ? (_jsx(DecodedBytesChunk, { decodedText: display.text, source: display.decodedFrom })) : (_jsx("span", { className: "whitespace-pre-wrap break-words", style: { color: 'var(--ds-gray-1000)' }, children: display.text }))] }));
154
+ function BytesDisplayValue({ display }) {
155
+ if (display.decodedFrom) {
156
+ return (_jsx(DecodedBytesChunk, { decodedText: display.text, source: display.decodedFrom }));
157
+ }
158
+ return (_jsx("span", { className: "whitespace-pre-wrap break-words", style: { color: 'var(--ds-gray-1000)' }, children: display.text }));
159
+ }
160
+ /** Field names are rendered unquoted (empty string shows as `""`). */
161
+ function formatField(field) {
162
+ return field === '' ? '""' : field;
149
163
  }
150
- // ---------------------------------------------------------------------------
151
- // Custom nodeRenderer
152
- // ---------------------------------------------------------------------------
153
164
  /**
154
- * Extends the default react-inspector nodeRenderer with special handling
155
- * for ClassInstanceRef, StreamRef, and Date types.
156
- *
157
- * react-inspector renders Date instances as unstyled plain text (no theme
158
- * key exists for them), so we intercept here and apply the magenta color
159
- * from our extended theme — matching Node.js util.inspect()'s date style.
160
- *
161
- * Default nodeRenderer reference:
162
- * https://github.com/storybookjs/react-inspector/blob/main/README.md#noderenderer
165
+ * Describe an object/array/map/set as an expandable container. Returns null for
166
+ * values that should render as a primitive. `prefix` carries a class name shown
167
+ * before the opening bracket (Map/Set and named class instances).
163
168
  */
164
- function NodeRenderer({ depth, name, data, isNonenumerable, }) {
165
- const extendedTheme = useContext(ExtendedThemeContext);
166
- if (isBytesDisplay(data)) {
167
- return _jsx(BytesDisplayLabel, { name: name, display: data });
168
- }
169
- // Encrypted marker → flat label with Lock icon, clickable when onDecrypt is available
170
- if (data !== null &&
171
- typeof data === 'object' &&
172
- data.constructor?.name === ENCRYPTED_DISPLAY_NAME) {
173
- const label = _jsx(EncryptedInlineLabel, {});
174
- if (depth === 0) {
175
- return label;
176
- }
177
- return (_jsxs("span", { children: [name != null && _jsx(ObjectName, { name: name }), name != null && _jsx("span", { children: ": " }), label] }));
169
+ function describeContainer(value) {
170
+ if (Array.isArray(value)) {
171
+ return {
172
+ entries: value.map((item) => [undefined, item]),
173
+ open: '[',
174
+ close: ']',
175
+ };
176
+ }
177
+ if (value instanceof Map) {
178
+ return {
179
+ entries: Array.from(value.entries(), ([key, val]) => [
180
+ String(key),
181
+ val,
182
+ ]),
183
+ open: '{',
184
+ close: '}',
185
+ prefix: 'Map',
186
+ };
187
+ }
188
+ if (value instanceof Set) {
189
+ return {
190
+ entries: Array.from(value.values(), (item) => [undefined, item]),
191
+ open: '[',
192
+ close: ']',
193
+ prefix: 'Set',
194
+ };
195
+ }
196
+ if (value !== null && typeof value === 'object') {
197
+ const name = value.constructor
198
+ ?.name;
199
+ return {
200
+ entries: Object.entries(value),
201
+ open: '{',
202
+ close: '}',
203
+ prefix: name && name !== 'Object' ? name : undefined,
204
+ };
178
205
  }
179
- // StreamRef → inline clickable badge
180
- if (isStreamRef(data)) {
181
- return (_jsxs("span", { children: [name != null && _jsx(ObjectName, { name: name }), name != null && _jsx("span", { children: ": " }), _jsx(StreamRefInline, { streamRef: data })] }));
206
+ return null;
207
+ }
208
+ function describePrimitive(value) {
209
+ if (value === null)
210
+ return { text: 'null', cls: CLS.null };
211
+ if (value === undefined)
212
+ return { text: 'undefined', cls: CLS.undefined };
213
+ if (typeof value === 'string' || value instanceof String) {
214
+ return { text: `"${String(value)}"`, cls: CLS.string };
215
+ }
216
+ if (typeof value === 'boolean' || value instanceof Boolean) {
217
+ return { text: String(value), cls: CLS.boolean };
218
+ }
219
+ if (typeof value === 'number' || value instanceof Number) {
220
+ return { text: String(value), cls: CLS.number };
182
221
  }
183
- // RunRef inline clickable badge linking to the target run
184
- if (isRunRef(data)) {
185
- return (_jsxs("span", { children: [name != null && _jsx(ObjectName, { name: name }), name != null && _jsx("span", { children: ": " }), _jsx(RunRefInline, { runRef: data })] }));
222
+ if (typeof value === 'bigint') {
223
+ return { text: `${value.toString()}n`, cls: CLS.number };
186
224
  }
187
- // ClassInstanceRef show className as type, data as the inspectable value
188
- if (isClassInstanceRef(data)) {
189
- if (depth === 0) {
190
- return _jsx(ObjectRootLabel, { name: data.className, data: data.data });
225
+ return { text: String(value), cls: CLS.punctuation };
226
+ }
227
+ function Label({ field, clickable }) {
228
+ if (field === undefined)
229
+ return null;
230
+ return (_jsx("span", { className: clickable ? CLS.clickableLabel : CLS.label, children: `${formatField(field)}:` }));
231
+ }
232
+ function Comma({ isLast }) {
233
+ if (isLast)
234
+ return null;
235
+ return _jsx("span", { className: CLS.punctuation, children: "," });
236
+ }
237
+ /** A non-expandable row: `field: <value>`. */
238
+ function LeafRow({ field, isLast, children, }) {
239
+ return (_jsxs("div", { className: CLS.child, role: "treeitem", tabIndex: -1, children: [_jsx(Label, { field: field }), children, _jsx(Comma, { isLast: isLast })] }));
240
+ }
241
+ function PrimitiveValue({ field, value, isLast }) {
242
+ const { text, cls } = describePrimitive(value);
243
+ return (_jsx(LeafRow, { field: field, isLast: isLast, children: _jsx("span", { className: cls, children: text }) }));
244
+ }
245
+ function EmptyContainer({ field, prefix, open, close, isLast, }) {
246
+ return (_jsxs("div", { className: CLS.child, role: "treeitem", tabIndex: -1, children: [_jsx(Label, { field: field }), prefix ? _jsx("span", { className: CLS.className, children: prefix }) : null, _jsx("span", { className: CLS.punctuation, children: open }), _jsx("span", { className: CLS.punctuation, children: close }), _jsx(Comma, { isLast: isLast })] }));
247
+ }
248
+ function focusExpander(button, outerRef) {
249
+ const previous = outerRef.current?.querySelector('[data-json-expander][tabindex="0"]');
250
+ if (previous)
251
+ previous.tabIndex = -1;
252
+ button.tabIndex = 0;
253
+ button.focus();
254
+ }
255
+ function moveExpanderFocus(outerRef, direction) {
256
+ const root = outerRef.current;
257
+ if (!root)
258
+ return;
259
+ const buttons = root.querySelectorAll('[data-json-expander]');
260
+ let current = -1;
261
+ for (let i = 0; i < buttons.length; i += 1) {
262
+ if (buttons[i].tabIndex === 0) {
263
+ current = i;
264
+ break;
265
+ }
266
+ }
267
+ if (current < 0)
268
+ return;
269
+ const next = (current + direction + buttons.length) % buttons.length;
270
+ buttons[current].tabIndex = -1;
271
+ buttons[next].tabIndex = 0;
272
+ buttons[next].focus();
273
+ }
274
+ function ExpandableContainer({ field, entries, open, close, prefix, ctx, isLast, }) {
275
+ const { level, shouldExpand, outerRef } = ctx;
276
+ const [expanded, setExpanded] = useState(() => shouldExpand(level));
277
+ const rowRef = useRef(null);
278
+ const contentsId = useId();
279
+ if (entries.length === 0) {
280
+ return (_jsx(EmptyContainer, { field: field, prefix: prefix, open: open, close: close, isLast: isLast }));
281
+ }
282
+ const toggle = () => {
283
+ setExpanded((value) => !value);
284
+ if (rowRef.current)
285
+ focusExpander(rowRef.current, outerRef);
286
+ };
287
+ // Toggle only for clicks that land on this row itself; clicks bubbling up out
288
+ // of a nested treeitem are handled by that descendant's own row.
289
+ const onClick = (event) => {
290
+ if (event.target.closest('[role="treeitem"]') !==
291
+ event.currentTarget) {
292
+ return;
293
+ }
294
+ toggle();
295
+ };
296
+ const onKeyDown = (event) => {
297
+ if (event.key === 'ArrowRight') {
298
+ event.preventDefault();
299
+ setExpanded(true);
191
300
  }
192
- return (_jsxs("span", { children: [name != null && _jsx(ObjectName, { name: name }), name != null && _jsx("span", { children: ": " }), _jsxs("span", { style: { fontStyle: 'italic' }, children: [data.className, " "] }), _jsx(ObjectValue, { object: data.data })] }));
193
- }
194
- // Date → magenta color (Node.js: 'date' → 'magenta')
195
- // react-inspector has no OBJECT_VALUE_DATE_COLOR theme key, so we handle it here.
196
- if (data instanceof Date) {
197
- const dateStr = data.toISOString();
198
- if (depth === 0) {
199
- return (_jsx("span", { style: { color: extendedTheme.OBJECT_VALUE_DATE_COLOR }, children: dateStr }));
301
+ else if (event.key === 'ArrowLeft') {
302
+ event.preventDefault();
303
+ setExpanded(false);
200
304
  }
201
- return (_jsxs("span", { children: [name != null && _jsx(ObjectName, { name: name }), name != null && _jsx("span", { children: ": " }), _jsx("span", { style: { color: extendedTheme.OBJECT_VALUE_DATE_COLOR }, children: dateStr })] }));
305
+ else if (event.key === 'ArrowUp') {
306
+ event.preventDefault();
307
+ moveExpanderFocus(outerRef, -1);
308
+ }
309
+ else if (event.key === 'ArrowDown') {
310
+ event.preventDefault();
311
+ moveExpanderFocus(outerRef, 1);
312
+ }
313
+ };
314
+ const lastIndex = entries.length - 1;
315
+ return (
316
+ // The treeitem row is the focusable, keyboard-operable control (roving
317
+ // tabindex + arrow keys); the disclosure marker below is purely decorative.
318
+ _jsxs("div", { className: CLS.child, role: "treeitem", "aria-expanded": expanded, "aria-controls": expanded ? contentsId : undefined, "data-json-expander": true, ref: rowRef, tabIndex: level === 0 ? 0 : -1, onClick: onClick, onKeyDown: onKeyDown, children: [_jsx("span", { className: expanded ? CLS.collapseIcon : CLS.expandIcon, "aria-hidden": "true" }), field !== undefined && (_jsx("span", { className: CLS.clickableLabel, children: `${formatField(field)}:` })), prefix ? _jsx("span", { className: CLS.className, children: prefix }) : null, _jsx("span", { className: CLS.punctuation, children: open }), expanded ? (
319
+ // biome-ignore lint/a11y/useSemanticElements: ARIA tree group is the correct role here
320
+ _jsx("ul", { id: contentsId, className: CLS.childFields, role: "group", children: entries.map(([childField, childValue], index) => (_jsx(DataRender, { field: childField, value: childValue, isLast: index === lastIndex, ctx: { ...ctx, level: level + 1 } }, childField ?? index))) })) : (_jsx("span", { className: CLS.collapsedContent, "aria-hidden": "true" })), _jsx("span", { className: CLS.punctuation, children: close }), _jsx(Comma, { isLast: isLast })] }));
321
+ }
322
+ function DataRender({ field, value, isLast, ctx }) {
323
+ if (isBytesDisplay(value)) {
324
+ return (_jsx(LeafRow, { field: field, isLast: isLast, children: _jsx(BytesDisplayValue, { display: value }) }));
202
325
  }
203
- // Default rendering (same as react-inspector's built-in)
204
- if (depth === 0) {
205
- return _jsx(ObjectRootLabel, { name: name, data: data });
326
+ if (isEncryptedMarker(value)) {
327
+ return (_jsx(LeafRow, { field: field, isLast: isLast, children: _jsx(EncryptedInlineLabel, {}) }));
206
328
  }
207
- return (_jsx(ObjectLabel, { name: name, data: data, isNonenumerable: isNonenumerable }));
329
+ if (isStreamRef(value)) {
330
+ return (_jsx(LeafRow, { field: field, isLast: isLast, children: _jsx(StreamRefInline, { streamRef: value }) }));
331
+ }
332
+ if (isRunRef(value)) {
333
+ return (_jsx(LeafRow, { field: field, isLast: isLast, children: _jsx(RunRefInline, { runRef: value }) }));
334
+ }
335
+ if (value instanceof Date) {
336
+ return (_jsx(LeafRow, { field: field, isLast: isLast, children: _jsx("span", { className: CLS.date, children: value.toISOString() }) }));
337
+ }
338
+ if (value instanceof RegExp) {
339
+ return (_jsx(LeafRow, { field: field, isLast: isLast, children: _jsx("span", { className: CLS.regexp, children: value.toString() }) }));
340
+ }
341
+ if (isClassInstanceRef(value)) {
342
+ return (_jsx(ClassInstanceNode, { field: field, instance: value, isLast: isLast, ctx: ctx }));
343
+ }
344
+ const container = describeContainer(value);
345
+ if (container) {
346
+ return (_jsx(ExpandableContainer, { field: field, entries: container.entries, open: container.open, close: container.close, prefix: container.prefix, ctx: ctx, isLast: isLast }));
347
+ }
348
+ return (_jsx(PrimitiveValue, { field: field, value: value, isLast: isLast, ctx: ctx }));
349
+ }
350
+ function ClassInstanceNode({ field, instance, isLast, ctx, }) {
351
+ const container = describeContainer(instance.data);
352
+ if (container) {
353
+ return (_jsx(ExpandableContainer, { field: field, entries: container.entries, open: container.open, close: container.close, prefix: instance.className, ctx: ctx, isLast: isLast }));
354
+ }
355
+ const { text, cls } = describePrimitive(instance.data);
356
+ return (_jsxs(LeafRow, { field: field, isLast: isLast, children: [_jsx("span", { className: CLS.className, children: instance.className }), _jsx("span", { className: cls, children: text })] }));
357
+ }
358
+ function JsonTree({ data, name, expandLevel, }) {
359
+ const outerRef = useRef(null);
360
+ const shouldExpand = useMemo(() => (level) => level < expandLevel, [expandLevel]);
361
+ return (_jsx("div", { ref: outerRef, className: CLS.container, role: "tree", "aria-label": "JSON view", children: _jsx(DataRender, { field: name, value: data, isLast: true, ctx: { level: 0, shouldExpand, outerRef } }) }));
208
362
  }
209
363
  // ---------------------------------------------------------------------------
210
- // Public component
364
+ // Ref / typed-array collapsing (preprocessing before render)
211
365
  // ---------------------------------------------------------------------------
212
366
  /**
213
367
  * Create a non-expandable wrapper that carries ref data as non-enumerable
214
- * properties. ObjectInspector won't render children for objects with no
215
- * enumerable keys, but our NodeRenderer can still detect them.
368
+ * properties so the renderer can detect StreamRef/RunRef without exposing
369
+ * their internals as object fields.
216
370
  */
217
371
  function makeOpaqueRef(ref) {
218
372
  const opaque = Object.create(null);
@@ -239,11 +393,11 @@ function makeBytesDisplay(display) {
239
393
  }
240
394
  /**
241
395
  * Recursively walk data and replace RunRef/StreamRef/typed array objects with
242
- * non-expandable versions so ObjectInspector doesn't show their internals.
396
+ * non-expandable versions so the renderer doesn't show their internals.
243
397
  * Only recurses into plain objects and arrays to avoid stripping class
244
- * instances (Date, Error, URL, Headers, etc.) that have their own rendering in
245
- * NodeRenderer. Map and Set containers are preserved while their contents are
246
- * prepared for display.
398
+ * instances (Date, Error, URL, Headers, etc.) that have their own rendering.
399
+ * Map and Set containers are preserved while their contents are prepared for
400
+ * display.
247
401
  *
248
402
  * Exported for testing the typed-array detection path used by hydrated
249
403
  * AI agent stream chunks (e.g. `{ delta: new Uint8Array(...) }`).
@@ -280,32 +434,21 @@ export function collapseRefs(data) {
280
434
  export function DataInspector({ data, expandLevel = 2, name, onStreamClick, onRunClick, onDecrypt, isDecrypting = false, }) {
281
435
  const collapsedData = useMemo(() => collapseRefs(data), [data]);
282
436
  const stableData = useStableInspectorData(collapsedData);
283
- const [initialExpandLevel, setInitialExpandLevel] = useState(expandLevel);
284
- const isDark = useDarkMode();
285
- const extendedTheme = isDark
286
- ? inspectorThemeExtendedDark
287
- : inspectorThemeExtendedLight;
288
- useEffect(() => {
289
- // react-inspector reapplies expandLevel on every data change, which can
290
- // reopen paths the user manually collapsed. Apply it only on mount.
291
- setInitialExpandLevel(0);
292
- }, []);
293
- const content = (_jsx(ExtendedThemeContext.Provider, { value: extendedTheme, children: _jsx(ObjectInspector, { data: stableData, name: name,
294
- // @ts-expect-error react-inspector accepts theme objects at runtime despite
295
- // types declaring string only — see https://github.com/storybookjs/react-inspector/blob/main/README.md#theme
296
- theme: isDark ? inspectorThemeDark : inspectorThemeLight, expandLevel: initialExpandLevel, nodeRenderer: NodeRenderer }) }));
297
- let wrapped = content;
437
+ let content = (_jsxs(_Fragment, { children: [_jsx("style", { href: "wf-json-view", precedence: "default", children: JSON_VIEW_STYLES }), _jsx(JsonTree, { data: stableData, name: name, expandLevel: expandLevel })] }));
298
438
  if (onStreamClick) {
299
- wrapped = (_jsx(StreamClickContext.Provider, { value: onStreamClick, children: wrapped }));
439
+ content = (_jsx(StreamClickContext.Provider, { value: onStreamClick, children: content }));
300
440
  }
301
441
  if (onRunClick) {
302
- wrapped = (_jsx(RunClickContext.Provider, { value: onRunClick, children: wrapped }));
442
+ content = (_jsx(RunClickContext.Provider, { value: onRunClick, children: content }));
303
443
  }
304
444
  if (onDecrypt) {
305
- wrapped = (_jsx(DecryptClickContext.Provider, { value: { onDecrypt, isDecrypting }, children: wrapped }));
445
+ content = (_jsx(DecryptClickContext.Provider, { value: { onDecrypt, isDecrypting }, children: content }));
306
446
  }
307
- return wrapped;
447
+ return content;
308
448
  }
449
+ // ---------------------------------------------------------------------------
450
+ // Render stabilization (avoid re-renders when data is deeply equal)
451
+ // ---------------------------------------------------------------------------
309
452
  function useStableInspectorData(next) {
310
453
  const previousRef = useRef(next);
311
454
  if (!isDeepEqual(previousRef.current, next)) {
@@ -383,4 +526,4 @@ function isDeepEqual(a, b, seen = new WeakMap()) {
383
526
  }
384
527
  return true;
385
528
  }
386
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1pbnNwZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9kYXRhLWluc3BlY3Rvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUNMLGFBQWEsRUFDYixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxNQUFNLEVBQ04sUUFBUSxHQUNULE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUNMLGVBQWUsRUFDZixXQUFXLEVBQ1gsVUFBVSxFQUNWLGVBQWUsRUFDZixXQUFXLEdBQ1osTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUdMLCtCQUErQixHQUNoQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFFTCxrQkFBa0IsRUFDbEIsMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQixtQkFBbUIsR0FDcEIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLDhDQUE4QztBQUM5Qyx3REFBd0Q7QUFDeEQsOEVBQThFO0FBRTlFLE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDO0FBQ2xELE1BQU0sdUJBQXVCLEdBQUcsaUNBQWlDLENBQUM7QUFDbEUsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQUM7QUFDNUMsTUFBTSxrQkFBa0IsR0FBRyw0QkFBNEIsQ0FBQztBQWtCeEQsU0FBUyxvQkFBb0IsQ0FBQyxJQUFZ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QztJQUNkLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFaEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbi8qKlxuICogUmV1c2FibGUgZGF0YSBpbnNwZWN0b3IgY29tcG9uZW50IGJ1aWx0IG9uIHJlYWN0LWluc3BlY3Rvci5cbiAqXG4gKiBBbGwgZGF0YSByZW5kZXJpbmcgaW4gdGhlIG8xMXkgVUkgc2hvdWxkIHVzZSB0aGlzIGNvbXBvbmVudCB0byBlbnN1cmVcbiAqIGNvbnNpc3RlbnQgdGhlbWluZywgY3VzdG9tIHR5cGUgaGFuZGxpbmcgKFN0cmVhbVJlZiwgQ2xhc3NJbnN0YW5jZVJlZiksXG4gKiBhbmQgZXhwYW5kIGJlaGF2aW9yLlxuICovXG5cbmltcG9ydCB7IExvY2sgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBPYmplY3RJbnNwZWN0b3IsXG4gIE9iamVjdExhYmVsLFxuICBPYmplY3ROYW1lLFxuICBPYmplY3RSb290TGFiZWwsXG4gIE9iamVjdFZhbHVlLFxufSBmcm9tICdyZWFjdC1pbnNwZWN0b3InO1xuaW1wb3J0IHsgdXNlRGFya01vZGUgfSBmcm9tICcuLi8uLi9ob29rcy91c2UtZGFyay1tb2RlJztcbmltcG9ydCB7IEVOQ1JZUFRFRF9ESVNQTEFZX05BTUUgfSBmcm9tICcuLi8uLi9saWIvaHlkcmF0aW9uJztcbmltcG9ydCB7XG4gIHR5cGUgRGVjb2RlZFN0cmVhbUNodW5rU291cmNlLFxuICB0eXBlIEZvcm1hdHRlZFN0cmVhbUNodW5rRGlzcGxheSxcbiAgZm9ybWF0QXJyYXlCdWZmZXJWaWV3Rm9yRGlzcGxheSxcbn0gZnJvbSAnLi4vLi4vbGliL3N0cmVhbS1kaXNwbGF5JztcbmltcG9ydCB7XG4gIHR5cGUgSW5zcGVjdG9yVGhlbWVFeHRlbmRlZCxcbiAgaW5zcGVjdG9yVGhlbWVEYXJrLFxuICBpbnNwZWN0b3JUaGVtZUV4dGVuZGVkRGFyayxcbiAgaW5zcGVjdG9yVGhlbWVFeHRlbmRlZExpZ2h0LFxuICBpbnNwZWN0b3JUaGVtZUxpZ2h0LFxufSBmcm9tICcuL2luc3BlY3Rvci10aGVtZSc7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL2J1dHRvbic7XG5pbXBvcnQgeyBTcGlubmVyIH0gZnJvbSAnLi9zcGlubmVyJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW1SZWYgLyBDbGFzc0luc3RhbmNlUmVmIHR5cGUgZGV0ZWN0aW9uXG4vLyAoaW5saW5lIHRvIGF2b2lkIGNpcmN1bGFyIGRlcHMgd2l0aCBoeWRyYXRpb24gbW9kdWxlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFNUUkVBTV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3N0cmVhbV9yZWZfXyc7XG5jb25zdCBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X2NsYXNzX2luc3RhbmNlX3JlZl9fJztcbmNvbnN0IFJVTl9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3J1bl9yZWZfXyc7XG5jb25zdCBCWVRFU19ESVNQTEFZX1RZUEUgPSAnX193b3JrZmxvd19ieXRlc19kaXNwbGF5X18nO1xuXG5pbnRlcmZhY2UgU3RyZWFtUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgU1RSRUFNX1JFRl9UWVBFO1xuICBzdHJlYW1JZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUnVuUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgUlVOX1JFRl9UWVBFO1xuICBydW5JZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQnl0ZXNEaXNwbGF5IHtcbiAgX190eXBlOiB0eXBlb2YgQllURVNfRElTUExBWV9UWVBFO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGRlY29kZWRGcm9tPzogRGVjb2RlZFN0cmVhbUNodW5rU291cmNlO1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZUNodW5rVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCAyKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDaHVua0RhdGEodGV4dDogc3RyaW5nKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3RyZWFtUmVmKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgU3RyZWFtUmVmIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgLy8gQ2hlY2sgYm90aCBlbnVtZXJhYmxlIGFuZCBub24tZW51bWVyYWJsZSBfX3R5cGUgKG9wYXF1ZSByZWZzIHVzZSBub24tZW51bWVyYWJsZSlcbiAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdfX3R5cGUnKTtcbiAgcmV0dXJuIGRlc2M/LnZhbHVlID09PSBTVFJFQU1fUkVGX1RZUEU7XG59XG5cbmZ1bmN0aW9uIGlzUnVuUmVmKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVuUmVmIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdfX3R5cGUnKTtcbiAgcmV0dXJuIGRlc2M/LnZhbHVlID09PSBSVU5fUkVGX1RZUEU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0J5dGVzRGlzcGxheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEJ5dGVzRGlzcGxheSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCAnX190eXBlJyk7XG4gIHJldHVybiBkZXNjPy52YWx1ZSA9PT0gQllURVNfRElTUExBWV9UWVBFO1xufVxuXG5mdW5jdGlvbiBpc0NsYXNzSW5zdGFuY2VSZWYodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB7XG4gIF9fdHlwZTogc3RyaW5nO1xuICBjbGFzc05hbWU6IHN0cmluZztcbiAgY2xhc3NJZDogc3RyaW5nO1xuICBkYXRhOiB1bmtub3duO1xufSB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgJ19fdHlwZScgaW4gdmFsdWUgJiZcbiAgICAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLl9fdHlwZSA9PT0gQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEVcbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW0gY2xpY2sgY29udGV4dCAocGFzc2VkIHRocm91Z2ggZnJvbSB0aGUgcGFuZWwpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb250ZXh0IGZvciBwYXNzaW5nIHN0cmVhbSBjbGljayBoYW5kbGVycyBkb3duIHRvIERhdGFJbnNwZWN0b3IgaW5zdGFuY2VzLlxuICogRXhwb3J0ZWQgc28gdGhhdCBwYXJlbnQgY29tcG9uZW50cyAoZS5nLiwgQXR0cmlidXRlUGFuZWwpIGNhbiBwcm92aWRlIHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgY29uc3QgU3RyZWFtQ2xpY2tDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxcbiAgKChzdHJlYW1JZDogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuPih1bmRlZmluZWQpO1xuXG4vKipcbiAqIENvbnRleHQgZm9yIHBhc3NpbmcgYSBkZWNyeXB0IGhhbmRsZXIgZG93biB0byBEYXRhSW5zcGVjdG9yIGluc3RhbmNlcy5cbiAqIFdoZW4gcHJvdmlkZWQsIGVuY3J5cHRlZCBtYXJrZXJzIGJlY29tZSBjbGlja2FibGUgYnV0dG9ucyB0aGF0IHRyaWdnZXIgZGVjcnlwdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgRGVjcnlwdENsaWNrQ29udGV4dFZhbHVlID0ge1xuICBvbkRlY3J5cHQ6ICgpID0+IHZvaWQ7XG4gIGlzRGVjcnlwdGluZzogYm9vbGVhbjtcbiAgaGFzRW5jcnlwdGVkRGF0YT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY29uc3QgRGVjcnlwdENsaWNrQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8XG4gIERlY3J5cHRDbGlja0NvbnRleHRWYWx1ZSB8IHVuZGVmaW5lZFxuPih1bmRlZmluZWQpO1xuXG5leHBvcnQgY29uc3QgUnVuQ2xpY2tDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxcbiAgKChydW5JZDogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuPih1bmRlZmluZWQpO1xuXG5mdW5jdGlvbiBFbmNyeXB0ZWRJbmxpbmVMYWJlbCgpIHtcbiAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChEZWNyeXB0Q2xpY2tDb250ZXh0KTtcbiAgaWYgKGN0eCkge1xuICAgIHJldHVybiAoXG4gICAgICA8QnV0dG9uXG4gICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgIGNsYXNzTmFtZT1cImFsaWduLWJhc2VsaW5lIGdhcC14LTFcIlxuICAgICAgICBkaXNhYmxlZD17Y3R4LmlzRGVjcnlwdGluZ31cbiAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGN0eC5vbkRlY3J5cHQoKTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2N0eC5pc0RlY3J5cHRpbmcgPyAoXG4gICAgICAgICAgPFNwaW5uZXIgc2l6ZT17MTB9IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPExvY2sgY2xhc3NOYW1lPVwiaC0zIHctM1wiIC8+XG4gICAgICAgICl9XG4gICAgICAgIDxzcGFuPkRlY3J5cHQ8L3NwYW4+XG4gICAgICA8L0J1dHRvbj5cbiAgICApO1xuICB9XG4gIHJldHVybiAoXG4gICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTYwMCknLCBmb250U3R5bGU6ICdpdGFsaWMnIH19PlxuICAgICAgPExvY2tcbiAgICAgICAgY2xhc3NOYW1lPVwiaC0zIHctM1wiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZScsXG4gICAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgICAgbWFyZ2luUmlnaHQ6ICczcHgnLFxuICAgICAgICAgIG1hcmdpblRvcDogJy0xcHgnLFxuICAgICAgICB9fVxuICAgICAgLz5cbiAgICAgIEVuY3J5cHRlZFxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cbmZ1bmN0aW9uIFN0cmVhbVJlZklubGluZSh7IHN0cmVhbVJlZiB9OiB7IHN0cmVhbVJlZjogU3RyZWFtUmVmIH0pIHtcbiAgY29uc3Qgb25TdHJlYW1DbGljayA9IHVzZUNvbnRleHQoU3RyZWFtQ2xpY2tDb250ZXh0KTtcbiAgY29uc3QgW2hvdmVyZWQsIHNldEhvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTEuNSBweS0wLjUgcm91bmRlZCB0ZXh0LVsxMHB4XSBmb250LW1vbm8gY3Vyc29yLXBvaW50ZXIgdW5kZXJsaW5lIGRlY29yYXRpb24tdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBob3ZlcmVkID8gJ3ZhcigtLWRzLWJsdWUtMjAwKScgOiAndmFyKC0tZHMtYmx1ZS0xMDApJyxcbiAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ibHVlLTkwMCknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgdmFyKC0tZHMtYmx1ZS0zMDApJyxcbiAgICAgIH19XG4gICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldEhvdmVyZWQodHJ1ZSl9XG4gICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldEhvdmVyZWQoZmFsc2UpfVxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25TdHJlYW1DbGljaz8uKHN0cmVhbVJlZi5zdHJlYW1JZCk7XG4gICAgICB9fVxuICAgICAgdGl0bGU9e2BWaWV3IHN0cmVhbTogJHtzdHJlYW1SZWYuc3RyZWFtSWR9YH1cbiAgICA+XG4gICAgICA8c3Bhbj7wn5OhPC9zcGFuPlxuICAgICAgPHNwYW4+e3N0cmVhbVJlZi5zdHJlYW1JZH08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFJ1blJlZklubGluZSh7IHJ1blJlZiB9OiB7IHJ1blJlZjogUnVuUmVmIH0pIHtcbiAgY29uc3Qgb25SdW5DbGljayA9IHVzZUNvbnRleHQoUnVuQ2xpY2tDb250ZXh0KTtcbiAgY29uc3QgW2hvdmVyZWQsIHNldEhvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTEuNSBweS0wLjUgcm91bmRlZCB0ZXh0LVsxMHB4XSBmb250LW1vbm8gY3Vyc29yLXBvaW50ZXIgdW5kZXJsaW5lIGRlY29yYXRpb24tdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBob3ZlcmVkXG4gICAgICAgICAgPyAndmFyKC0tZHMtcHVycGxlLTIwMCknXG4gICAgICAgICAgOiAndmFyKC0tZHMtcHVycGxlLTEwMCknLFxuICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLXB1cnBsZS05MDApJyxcbiAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIHZhcigtLWRzLXB1cnBsZS0zMDApJyxcbiAgICAgIH19XG4gICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldEhvdmVyZWQodHJ1ZSl9XG4gICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldEhvdmVyZWQoZmFsc2UpfVxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25SdW5DbGljaz8uKHJ1blJlZi5ydW5JZCk7XG4gICAgICB9fVxuICAgICAgdGl0bGU9e2BWaWV3IHJ1bjogJHtydW5SZWYucnVuSWR9YH1cbiAgICA+XG4gICAgICA8c3Bhbj57cnVuUmVmLnJ1bklkfTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHRlbmRlZCB0aGVtZSBjb250ZXh0IChmb3IgY29sb3JzIHJlYWN0LWluc3BlY3RvciBkb2Vzbid0IHN1cHBvcnQgbmF0aXZlbHkpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgRXh0ZW5kZWRUaGVtZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEluc3BlY3RvclRoZW1lRXh0ZW5kZWQ+KFxuICBpbnNwZWN0b3JUaGVtZUV4dGVuZGVkTGlnaHRcbik7XG5cbmZ1bmN0aW9uIERlY29kZWRCeXRlc0NodW5rKHtcbiAgZGVjb2RlZFRleHQsXG4gIHNvdXJjZSxcbn06IHtcbiAgZGVjb2RlZFRleHQ6IHN0cmluZztcbiAgc291cmNlOiBEZWNvZGVkU3RyZWFtQ2h1bmtTb3VyY2U7XG59KSB7XG4gIGNvbnN0IFtzZWxlY3RlZFZpZXcsIHNldFNlbGVjdGVkVmlld10gPSB1c2VTdGF0ZTwnZGVjb2RlZCcgfCAnYnl0ZXMnPihcbiAgICAnZGVjb2RlZCdcbiAgKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VDaHVua0RhdGEoZGVjb2RlZFRleHQpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wXCI+XG4gICAgICB7c2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCcgPyAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMFwiPlxuICAgICAgICAgIHt0eXBlb2YgcGFyc2VkID09PSAnc3RyaW5nJyA/IChcbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHNcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwMCknIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtkZXNlcmlhbGl6ZUNodW5rVGV4dChwYXJzZWQpfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8RGF0YUluc3BlY3RvciBkYXRhPXtwYXJzZWR9IGV4cGFuZExldmVsPXsxfSAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IChcbiAgICAgICAgPERlY29kZWRCeXRlc0luc3BlY3RvciBkZWNvZGVkVGV4dD17ZGVjb2RlZFRleHR9IHNvdXJjZT17c291cmNlfSAvPlxuICAgICAgKX1cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZCBib3JkZXJcIlxuICAgICAgICAgIHN0eWxlPXt7IGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS00MDApJyB9fVxuICAgICAgICAgIHRpdGxlPXtgJHtzb3VyY2UudHlwZX0gZGVjb2RlZCBhcyAke3NvdXJjZS5lbmNvZGluZy50b1VwcGVyQ2FzZSgpfSB0ZXh0LiBTd2l0Y2ggdG8gQnl0ZXMgdG8gaW5zcGVjdCB0aGUgc3VtbWFyaXplZCByYXcgdmFsdWUuYH1cbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC01IHB4LTEuNSB0ZXh0LVsxMHB4XSBmb250LW1lZGl1bVwiXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCdcbiAgICAgICAgICAgICAgICAgID8gJ3ZhcigtLWRzLWdyYXktMjAwKSdcbiAgICAgICAgICAgICAgICAgIDogJ3ZhcigtLWRzLWdyYXktMTAwKScsXG4gICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS05MDApJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTZWxlY3RlZFZpZXcoJ2RlY29kZWQnKX1cbiAgICAgICAgICAgIGFyaWEtcHJlc3NlZD17c2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCd9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2hvdyBkZWNvZGVkIHRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIERlY29kZWRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtNSBib3JkZXItbCBweC0xLjUgdGV4dC1bMTBweF0gZm9udC1tZWRpdW1cIlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTQwMCknLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRWaWV3ID09PSAnYnl0ZXMnXG4gICAgICAgICAgICAgICAgICA/ICd2YXIoLS1kcy1ncmF5LTIwMCknXG4gICAgICAgICAgICAgICAgICA6ICd2YXIoLS1kcy1ncmF5LTEwMCknLFxuICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLWdyYXktOTAwKScsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VsZWN0ZWRWaWV3KCdieXRlcycpfVxuICAgICAgICAgICAgYXJpYS1wcmVzc2VkPXtzZWxlY3RlZFZpZXcgPT09ICdieXRlcyd9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2hvdyByYXcgYnl0ZXMgc3VtbWFyeVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQnl0ZXNcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gRGVjb2RlZEJ5dGVzSW5zcGVjdG9yKHtcbiAgZGVjb2RlZFRleHQsXG4gIHNvdXJjZSxcbn06IHtcbiAgZGVjb2RlZFRleHQ6IHN0cmluZztcbiAgc291cmNlOiBEZWNvZGVkU3RyZWFtQ2h1bmtTb3VyY2U7XG59KSB7XG4gIGNvbnN0IFtleHBhbmRlZCwgc2V0RXhwYW5kZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmb250LW1vbm9cIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzTmFtZT1cImZsZXggbWF4LXctZnVsbCBpdGVtcy1zdGFydCBnYXAtMSB0ZXh0LWxlZnRcIlxuICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwMCknIH19XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEV4cGFuZGVkKCh2YWx1ZSkgPT4gIXZhbHVlKX1cbiAgICAgICAgdGl0bGU9e2Ake3NvdXJjZS50eXBlfSBkZWNvZGVkIGFzICR7c291cmNlLmVuY29kaW5nLnRvVXBwZXJDYXNlKCl9IHRleHRgfVxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzZWxlY3Qtbm9uZVwiIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyB9fT5cbiAgICAgICAgICB7ZXhwYW5kZWQgPyAn4pa8JyA6ICfilrYnfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1pbi13LTAgYnJlYWstd29yZHNcIj57c291cmNlLnJhd1N1bW1hcnl9PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICB7ZXhwYW5kZWQgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgcGwtNVwiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyB9fT5kZWNvZGVkOiA8L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHNcIlxuICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmVlbi05MDApJyB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtKU09OLnN0cmluZ2lmeShkZWNvZGVkVGV4dCl9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEJ5dGVzRGlzcGxheUxhYmVsKHtcbiAgbmFtZSxcbiAgZGlzcGxheSxcbn06IHtcbiAgbmFtZT86IHN0cmluZztcbiAgZGlzcGxheTogQnl0ZXNEaXNwbGF5O1xufSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiaW5saW5lLWJsb2NrIG1pbi13LTAgYWxpZ24tdG9wXCI+XG4gICAgICB7bmFtZSAhPSBudWxsICYmIDxPYmplY3ROYW1lIG5hbWU9e25hbWV9IC8+fVxuICAgICAge25hbWUgIT0gbnVsbCAmJiA8c3Bhbj46IDwvc3Bhbj59XG4gICAgICB7ZGlzcGxheS5kZWNvZGVkRnJvbSA/IChcbiAgICAgICAgPERlY29kZWRCeXRlc0NodW5rXG4gICAgICAgICAgZGVjb2RlZFRleHQ9e2Rpc3BsYXkudGV4dH1cbiAgICAgICAgICBzb3VyY2U9e2Rpc3BsYXkuZGVjb2RlZEZyb219XG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHNcIlxuICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHtkaXNwbGF5LnRleHR9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ3VzdG9tIG5vZGVSZW5kZXJlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRXh0ZW5kcyB0aGUgZGVmYXVsdCByZWFjdC1pbnNwZWN0b3Igbm9kZVJlbmRlcmVyIHdpdGggc3BlY2lhbCBoYW5kbGluZ1xuICogZm9yIENsYXNzSW5zdGFuY2VSZWYsIFN0cmVhbVJlZiwgYW5kIERhdGUgdHlwZXMuXG4gKlxuICogcmVhY3QtaW5zcGVjdG9yIHJlbmRlcnMgRGF0ZSBpbnN0YW5jZXMgYXMgdW5zdHlsZWQgcGxhaW4gdGV4dCAobm8gdGhlbWVcbiAqIGtleSBleGlzdHMgZm9yIHRoZW0pLCBzbyB3ZSBpbnRlcmNlcHQgaGVyZSBhbmQgYXBwbHkgdGhlIG1hZ2VudGEgY29sb3JcbiAqIGZyb20gb3VyIGV4dGVuZGVkIHRoZW1lIOKAlCBtYXRjaGluZyBOb2RlLmpzIHV0aWwuaW5zcGVjdCgpJ3MgZGF0ZSBzdHlsZS5cbiAqXG4gKiBEZWZhdWx0IG5vZGVSZW5kZXJlciByZWZlcmVuY2U6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3Rvcnlib29ranMvcmVhY3QtaW5zcGVjdG9yL2Jsb2IvbWFpbi9SRUFETUUubWQjbm9kZXJlbmRlcmVyXG4gKi9cbmZ1bmN0aW9uIE5vZGVSZW5kZXJlcih7XG4gIGRlcHRoLFxuICBuYW1lLFxuICBkYXRhLFxuICBpc05vbmVudW1lcmFibGUsXG59OiB7XG4gIGRlcHRoOiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGRhdGE6IHVua25vd247XG4gIGlzTm9uZW51bWVyYWJsZT86IGJvb2xlYW47XG4gIGV4cGFuZGVkPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgZXh0ZW5kZWRUaGVtZSA9IHVzZUNvbnRleHQoRXh0ZW5kZWRUaGVtZUNvbnRleHQpO1xuXG4gIGlmIChpc0J5dGVzRGlzcGxheShkYXRhKSkge1xuICAgIHJldHVybiA8Qnl0ZXNEaXNwbGF5TGFiZWwgbmFtZT17bmFtZX0gZGlzcGxheT17ZGF0YX0gLz47XG4gIH1cblxuICAvLyBFbmNyeXB0ZWQgbWFya2VyIOKGkiBmbGF0IGxhYmVsIHdpdGggTG9jayBpY29uLCBjbGlja2FibGUgd2hlbiBvbkRlY3J5cHQgaXMgYXZhaWxhYmxlXG4gIGlmIChcbiAgICBkYXRhICE9PSBudWxsICYmXG4gICAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgZGF0YS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gRU5DUllQVEVEX0RJU1BMQVlfTkFNRVxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IDxFbmNyeXB0ZWRJbmxpbmVMYWJlbCAvPjtcbiAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgIHJldHVybiBsYWJlbDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuPlxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxPYmplY3ROYW1lIG5hbWU9e25hbWV9IC8+fVxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxzcGFuPjogPC9zcGFuPn1cbiAgICAgICAge2xhYmVsfVxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH1cblxuICAvLyBTdHJlYW1SZWYg4oaSIGlubGluZSBjbGlja2FibGUgYmFkZ2VcbiAgaWYgKGlzU3RyZWFtUmVmKGRhdGEpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuPlxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxPYmplY3ROYW1lIG5hbWU9e25hbWV9IC8+fVxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxzcGFuPjogPC9zcGFuPn1cbiAgICAgICAgPFN0cmVhbVJlZklubGluZSBzdHJlYW1SZWY9e2RhdGF9IC8+XG4gICAgICA8L3NwYW4+XG4gICAgKTtcbiAgfVxuXG4gIC8vIFJ1blJlZiDihpIgaW5saW5lIGNsaWNrYWJsZSBiYWRnZSBsaW5raW5nIHRvIHRoZSB0YXJnZXQgcnVuXG4gIGlmIChpc1J1blJlZihkYXRhKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8c3Bhbj5cbiAgICAgICAge25hbWUgIT0gbnVsbCAmJiA8T2JqZWN0TmFtZSBuYW1lPXtuYW1lfSAvPn1cbiAgICAgICAge25hbWUgIT0gbnVsbCAmJiA8c3Bhbj46IDwvc3Bhbj59XG4gICAgICAgIDxSdW5SZWZJbmxpbmUgcnVuUmVmPXtkYXRhfSAvPlxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH1cblxuICAvLyBDbGFzc0luc3RhbmNlUmVmIOKGkiBzaG93IGNsYXNzTmFtZSBhcyB0eXBlLCBkYXRhIGFzIHRoZSBpbnNwZWN0YWJsZSB2YWx1ZVxuICBpZiAoaXNDbGFzc0luc3RhbmNlUmVmKGRhdGEpKSB7XG4gICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICByZXR1cm4gPE9iamVjdFJvb3RMYWJlbCBuYW1lPXtkYXRhLmNsYXNzTmFtZX0gZGF0YT17ZGF0YS5kYXRhfSAvPjtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuPlxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxPYmplY3ROYW1lIG5hbWU9e25hbWV9IC8+fVxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxzcGFuPjogPC9zcGFuPn1cbiAgICAgICAgPHNwYW4gc3R5bGU9e3sgZm9udFN0eWxlOiAnaXRhbGljJyB9fT57ZGF0YS5jbGFzc05hbWV9IDwvc3Bhbj5cbiAgICAgICAgPE9iamVjdFZhbHVlIG9iamVjdD17ZGF0YS5kYXRhfSAvPlxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH1cblxuICAvLyBEYXRlIOKGkiBtYWdlbnRhIGNvbG9yIChOb2RlLmpzOiAnZGF0ZScg4oaSICdtYWdlbnRhJylcbiAgLy8gcmVhY3QtaW5zcGVjdG9yIGhhcyBubyBPQkpFQ1RfVkFMVUVfREFURV9DT0xPUiB0aGVtZSBrZXksIHNvIHdlIGhhbmRsZSBpdCBoZXJlLlxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBjb25zdCBkYXRlU3RyID0gZGF0YS50b0lTT1N0cmluZygpO1xuICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6IGV4dGVuZGVkVGhlbWUuT0JKRUNUX1ZBTFVFX0RBVEVfQ09MT1IgfX0+XG4gICAgICAgICAge2RhdGVTdHJ9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8c3Bhbj5cbiAgICAgICAge25hbWUgIT0gbnVsbCAmJiA8T2JqZWN0TmFtZSBuYW1lPXtuYW1lfSAvPn1cbiAgICAgICAge25hbWUgIT0gbnVsbCAmJiA8c3Bhbj46IDwvc3Bhbj59XG4gICAgICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiBleHRlbmRlZFRoZW1lLk9CSkVDVF9WQUxVRV9EQVRFX0NPTE9SIH19PlxuICAgICAgICAgIHtkYXRlU3RyfVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgKTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgcmVuZGVyaW5nIChzYW1lIGFzIHJlYWN0LWluc3BlY3RvcidzIGJ1aWx0LWluKVxuICBpZiAoZGVwdGggPT09IDApIHtcbiAgICByZXR1cm4gPE9iamVjdFJvb3RMYWJlbCBuYW1lPXtuYW1lfSBkYXRhPXtkYXRhfSAvPjtcbiAgfVxuICByZXR1cm4gKFxuICAgIDxPYmplY3RMYWJlbCBuYW1lPXtuYW1lfSBkYXRhPXtkYXRhfSBpc05vbmVudW1lcmFibGU9e2lzTm9uZW51bWVyYWJsZX0gLz5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgY29tcG9uZW50XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGUgYSBub24tZXhwYW5kYWJsZSB3cmFwcGVyIHRoYXQgY2FycmllcyByZWYgZGF0YSBhcyBub24tZW51bWVyYWJsZVxuICogcHJvcGVydGllcy4gT2JqZWN0SW5zcGVjdG9yIHdvbid0IHJlbmRlciBjaGlsZHJlbiBmb3Igb2JqZWN0cyB3aXRoIG5vXG4gKiBlbnVtZXJhYmxlIGtleXMsIGJ1dCBvdXIgTm9kZVJlbmRlcmVyIGNhbiBzdGlsbCBkZXRlY3QgdGhlbS5cbiAqL1xuZnVuY3Rpb24gbWFrZU9wYXF1ZVJlZihyZWY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdW5rbm93biB7XG4gIGNvbnN0IG9wYXF1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlZikpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3BhcXVlLCBrZXksIHsgdmFsdWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICB9XG4gIHJldHVybiBvcGFxdWU7XG59XG5cbmZ1bmN0aW9uIG1ha2VCeXRlc0Rpc3BsYXkoZGlzcGxheTogRm9ybWF0dGVkU3RyZWFtQ2h1bmtEaXNwbGF5KTogdW5rbm93biB7XG4gIGNvbnN0IG9wYXF1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcGFxdWUsICdfX3R5cGUnLCB7XG4gICAgdmFsdWU6IEJZVEVTX0RJU1BMQVlfVFlQRSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcGFxdWUsICd0ZXh0Jywge1xuICAgIHZhbHVlOiBkaXNwbGF5LnRleHQsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3BhcXVlLCAnZGVjb2RlZEZyb20nLCB7XG4gICAgdmFsdWU6IGRpc3BsYXkuZGVjb2RlZEZyb20sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gb3BhcXVlO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHdhbGsgZGF0YSBhbmQgcmVwbGFjZSBSdW5SZWYvU3RyZWFtUmVmL3R5cGVkIGFycmF5IG9iamVjdHMgd2l0aFxuICogbm9uLWV4cGFuZGFibGUgdmVyc2lvbnMgc28gT2JqZWN0SW5zcGVjdG9yIGRvZXNuJ3Qgc2hvdyB0aGVpciBpbnRlcm5hbHMuXG4gKiBPbmx5IHJlY3Vyc2VzIGludG8gcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzIHRvIGF2b2lkIHN0cmlwcGluZyBjbGFzc1xuICogaW5zdGFuY2VzIChEYXRlLCBFcnJvciwgVVJMLCBIZWFkZXJzLCBldGMuKSB0aGF0IGhhdmUgdGhlaXIgb3duIHJlbmRlcmluZyBpblxuICogTm9kZVJlbmRlcmVyLiBNYXAgYW5kIFNldCBjb250YWluZXJzIGFyZSBwcmVzZXJ2ZWQgd2hpbGUgdGhlaXIgY29udGVudHMgYXJlXG4gKiBwcmVwYXJlZCBmb3IgZGlzcGxheS5cbiAqXG4gKiBFeHBvcnRlZCBmb3IgdGVzdGluZyB0aGUgdHlwZWQtYXJyYXkgZGV0ZWN0aW9uIHBhdGggdXNlZCBieSBoeWRyYXRlZFxuICogQUkgYWdlbnQgc3RyZWFtIGNodW5rcyAoZS5nLiBgeyBkZWx0YTogbmV3IFVpbnQ4QXJyYXkoLi4uKSB9YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsYXBzZVJlZnMoZGF0YTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBkYXRhO1xuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpICYmICEoZGF0YSBpbnN0YW5jZW9mIERhdGFWaWV3KSkge1xuICAgIHJldHVybiBtYWtlQnl0ZXNEaXNwbGF5KGZvcm1hdEFycmF5QnVmZmVyVmlld0ZvckRpc3BsYXkoZGF0YSkpO1xuICB9XG4gIGlmIChpc1J1blJlZihkYXRhKSB8fCBpc1N0cmVhbVJlZihkYXRhKSlcbiAgICByZXR1cm4gbWFrZU9wYXF1ZVJlZihkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIGRhdGEubWFwKGNvbGxhcHNlUmVmcyk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICBBcnJheS5mcm9tKGRhdGEuZW50cmllcygpLCAoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgIGNvbGxhcHNlUmVmcyhrZXkpLFxuICAgICAgICBjb2xsYXBzZVJlZnModmFsdWUpLFxuICAgICAgXSlcbiAgICApO1xuICB9XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuZnJvbShkYXRhLnZhbHVlcygpLCBjb2xsYXBzZVJlZnMpKTtcbiAgfVxuICAvLyBPbmx5IHJlY3Vyc2UgaW50byBwbGFpbiBvYmplY3RzIOKAlCBsZWF2ZSBjbGFzcyBpbnN0YW5jZXMgdW50b3VjaGVkXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGRhdGEpO1xuICBpZiAocHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUgJiYgcHJvdG8gIT09IG51bGwpIHJldHVybiBkYXRhO1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgcmVzdWx0W2tleV0gPSBjb2xsYXBzZVJlZnModmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUluc3BlY3RvclByb3BzIHtcbiAgLyoqIFRoZSBkYXRhIHRvIGluc3BlY3QgKi9cbiAgZGF0YTogdW5rbm93bjtcbiAgLyoqIEluaXRpYWwgZXhwYW5kIGRlcHRoIChkZWZhdWx0OiAyKSAqL1xuICBleHBhbmRMZXZlbD86IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSByb290IG5vZGUgKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIENhbGxiYWNrIHdoZW4gYSBzdHJlYW0gcmVmZXJlbmNlIGlzIGNsaWNrZWQgKi9cbiAgb25TdHJlYW1DbGljaz86IChzdHJlYW1JZDogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogQ2FsbGJhY2sgd2hlbiBhIHJ1biByZWZlcmVuY2UgaXMgY2xpY2tlZCAqL1xuICBvblJ1bkNsaWNrPzogKHJ1bklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB3aGVuIGFuIGVuY3J5cHRlZCBtYXJrZXIgaXMgY2xpY2tlZCAodHJpZ2dlcnMgZGVjcnlwdGlvbikgKi9cbiAgb25EZWNyeXB0PzogKCkgPT4gdm9pZDtcbiAgLyoqIFdoZXRoZXIgZGVjcnlwdGlvbiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKi9cbiAgaXNEZWNyeXB0aW5nPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERhdGFJbnNwZWN0b3Ioe1xuICBkYXRhLFxuICBleHBhbmRMZXZlbCA9IDIsXG4gIG5hbWUsXG4gIG9uU3RyZWFtQ2xpY2ssXG4gIG9uUnVuQ2xpY2ssXG4gIG9uRGVjcnlwdCxcbiAgaXNEZWNyeXB0aW5nID0gZmFsc2UsXG59OiBEYXRhSW5zcGVjdG9yUHJvcHMpIHtcbiAgY29uc3QgY29sbGFwc2VkRGF0YSA9IHVzZU1lbW8oKCkgPT4gY29sbGFwc2VSZWZzKGRhdGEpLCBbZGF0YV0pO1xuICBjb25zdCBzdGFibGVEYXRhID0gdXNlU3RhYmxlSW5zcGVjdG9yRGF0YShjb2xsYXBzZWREYXRhKTtcbiAgY29uc3QgW2luaXRpYWxFeHBhbmRMZXZlbCwgc2V0SW5pdGlhbEV4cGFuZExldmVsXSA9IHVzZVN0YXRlKGV4cGFuZExldmVsKTtcbiAgY29uc3QgaXNEYXJrID0gdXNlRGFya01vZGUoKTtcbiAgY29uc3QgZXh0ZW5kZWRUaGVtZSA9IGlzRGFya1xuICAgID8gaW5zcGVjdG9yVGhlbWVFeHRlbmRlZERhcmtcbiAgICA6IGluc3BlY3RvclRoZW1lRXh0ZW5kZWRMaWdodDtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIHJlYWN0LWluc3BlY3RvciByZWFwcGxpZXMgZXhwYW5kTGV2ZWwgb24gZXZlcnkgZGF0YSBjaGFuZ2UsIHdoaWNoIGNhblxuICAgIC8vIHJlb3BlbiBwYXRocyB0aGUgdXNlciBtYW51YWxseSBjb2xsYXBzZWQuIEFwcGx5IGl0IG9ubHkgb24gbW91bnQuXG4gICAgc2V0SW5pdGlhbEV4cGFuZExldmVsKDApO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgY29udGVudCA9IChcbiAgICA8RXh0ZW5kZWRUaGVtZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2V4dGVuZGVkVGhlbWV9PlxuICAgICAgPE9iamVjdEluc3BlY3RvclxuICAgICAgICBkYXRhPXtzdGFibGVEYXRhfVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlYWN0LWluc3BlY3RvciBhY2NlcHRzIHRoZW1lIG9iamVjdHMgYXQgcnVudGltZSBkZXNwaXRlXG4gICAgICAgIC8vIHR5cGVzIGRlY2xhcmluZyBzdHJpbmcgb25seSDigJQgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zdG9yeWJvb2tqcy9yZWFjdC1pbnNwZWN0b3IvYmxvYi9tYWluL1JFQURNRS5tZCN0aGVtZVxuICAgICAgICB0aGVtZT17aXNEYXJrID8gaW5zcGVjdG9yVGhlbWVEYXJrIDogaW5zcGVjdG9yVGhlbWVMaWdodH1cbiAgICAgICAgZXhwYW5kTGV2ZWw9e2luaXRpYWxFeHBhbmRMZXZlbH1cbiAgICAgICAgbm9kZVJlbmRlcmVyPXtOb2RlUmVuZGVyZXJ9XG4gICAgICAvPlxuICAgIDwvRXh0ZW5kZWRUaGVtZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG5cbiAgbGV0IHdyYXBwZWQgPSBjb250ZW50O1xuXG4gIGlmIChvblN0cmVhbUNsaWNrKSB7XG4gICAgd3JhcHBlZCA9IChcbiAgICAgIDxTdHJlYW1DbGlja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e29uU3RyZWFtQ2xpY2t9PlxuICAgICAgICB7d3JhcHBlZH1cbiAgICAgIDwvU3RyZWFtQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICAgICk7XG4gIH1cbiAgaWYgKG9uUnVuQ2xpY2spIHtcbiAgICB3cmFwcGVkID0gKFxuICAgICAgPFJ1bkNsaWNrQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17b25SdW5DbGlja30+XG4gICAgICAgIHt3cmFwcGVkfVxuICAgICAgPC9SdW5DbGlja0NvbnRleHQuUHJvdmlkZXI+XG4gICAgKTtcbiAgfVxuICBpZiAob25EZWNyeXB0KSB7XG4gICAgd3JhcHBlZCA9IChcbiAgICAgIDxEZWNyeXB0Q2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IG9uRGVjcnlwdCwgaXNEZWNyeXB0aW5nIH19PlxuICAgICAgICB7d3JhcHBlZH1cbiAgICAgIDwvRGVjcnlwdENsaWNrQ29udGV4dC5Qcm92aWRlcj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbmZ1bmN0aW9uIHVzZVN0YWJsZUluc3BlY3RvckRhdGE8VD4obmV4dDogVCk6IFQge1xuICBjb25zdCBwcmV2aW91c1JlZiA9IHVzZVJlZjxUPihuZXh0KTtcbiAgaWYgKCFpc0RlZXBFcXVhbChwcmV2aW91c1JlZi5jdXJyZW50LCBuZXh0KSkge1xuICAgIHByZXZpb3VzUmVmLmN1cnJlbnQgPSBuZXh0O1xuICB9XG4gIHJldHVybiBwcmV2aW91c1JlZi5jdXJyZW50O1xufVxuXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVCeXRlc0Rpc3BsYXkoYTogQnl0ZXNEaXNwbGF5LCBiOiBCeXRlc0Rpc3BsYXkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBhLnRleHQgPT09IGIudGV4dCAmJlxuICAgIGEuZGVjb2RlZEZyb20/LnR5cGUgPT09IGIuZGVjb2RlZEZyb20/LnR5cGUgJiZcbiAgICBhLmRlY29kZWRGcm9tPy5lbmNvZGluZyA9PT0gYi5kZWNvZGVkRnJvbT8uZW5jb2RpbmcgJiZcbiAgICBhLmRlY29kZWRGcm9tPy5yYXdTdW1tYXJ5ID09PSBiLmRlY29kZWRGcm9tPy5yYXdTdW1tYXJ5XG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRGVlcEVxdWFsKGE6IHVua25vd24sIGI6IHVua25vd24sIHNlZW4gPSBuZXcgV2Vha01hcCgpKTogYm9vbGVhbiB7XG4gIGlmIChPYmplY3QuaXMoYSwgYikpIHJldHVybiB0cnVlO1xuXG4gIGlmIChpc0J5dGVzRGlzcGxheShhKSB8fCBpc0J5dGVzRGlzcGxheShiKSkge1xuICAgIHJldHVybiBpc0J5dGVzRGlzcGxheShhKSAmJiBpc0J5dGVzRGlzcGxheShiKSAmJiBpc1NhbWVCeXRlc0Rpc3BsYXkoYSwgYik7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHAgJiYgYiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwICYmIGIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhLmVudHJpZXMoKSkge1xuICAgICAgaWYgKCFiLmhhcyhrZXkpIHx8ICFpc0RlZXBFcXVhbCh2YWx1ZSwgYi5nZXQoa2V5KSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIFNldCAmJiBiIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhLnZhbHVlcygpKSB7XG4gICAgICBpZiAoIWIuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaXNPYmplY3RMaWtlKGEpIHx8ICFpc09iamVjdExpa2UoYikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc2Vlbi5nZXQoYSkgPT09IGIpIHJldHVybiB0cnVlO1xuICBzZWVuLnNldChhLCBiKTtcblxuICBjb25zdCBhSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYSk7XG4gIGNvbnN0IGJJc0FycmF5ID0gQXJyYXkuaXNBcnJheShiKTtcbiAgaWYgKGFJc0FycmF5ICE9PSBiSXNBcnJheSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChhSXNBcnJheSAmJiBiSXNBcnJheSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICghaXNEZWVwRXF1YWwoYVtpXSwgYltpXSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBhS2V5cykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFpc0RlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIl19
529
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1pbnNwZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9kYXRhLWluc3BlY3Rvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFDTCxhQUFhLEVBS2IsVUFBVSxFQUNWLEtBQUssRUFDTCxPQUFPLEVBQ1AsTUFBTSxFQUNOLFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFHTCwrQkFBK0IsR0FDaEMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLDhFQUE4RTtBQUM5RSw4Q0FBOEM7QUFDOUMsd0RBQXdEO0FBQ3hELDhFQUE4RTtBQUU5RSxNQUFNLGVBQWUsR0FBRyx5QkFBeUIsQ0FBQztBQUNsRCxNQUFNLHVCQUF1QixHQUFHLGlDQUFpQyxDQUFDO0FBQ2xFLE1BQU0sWUFBWSxHQUFHLHNCQUFzQixDQUFDO0FBQzVDLE1BQU0sa0JBQWtCLEdBQUcsNEJBQTRCLENBQUM7QUF5QnhELFNBQVMsb0JBQW9CLENBQUMsSUFBWTtJQUN4QyxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0IsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELE9B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Q0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUVoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7SUFDdkQsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuLyoqXG4gKiBSZXVzYWJsZSBkYXRhIGluc3BlY3RvciBmb3IgdGhlIG8xMXkgVUkuXG4gKlxuICogUmVuZGVycyBKU09OIGFzIGEgY29sbGFwc2libGUgdHJlZTogYnJhY2tldCBub3RhdGlvbiAoYHsg4oCmIH1gIC8gYFsg4oCmIF1gKSxcbiAqIGNvbG9yZWQga2V5cywgdHlwZWQgdmFsdWUgY29sb3JzLCBg4pa4YC9g4pa+YCBkaXNjbG9zdXJlIGljb25zLCBhbmQgYSBgLi4uYFxuICogY29sbGFwc2VkIGluZGljYXRvci5cbiAqXG4gKiBPbiB0b3Agb2YgcGxhaW4gSlNPTiBpdCBoYW5kbGVzIHRoZSB3b3JrZmxvdy1zcGVjaWZpYyB2YWx1ZSB0eXBlczogU3RyZWFtUmVmIC9cbiAqIFJ1blJlZiBiYWRnZXMsIGVuY3J5cHRlZCBtYXJrZXJzLCBkZWNvZGVkIGJ5dGUgc3RyZWFtcywgRGF0ZXMsIGFuZCBuYW1lZFxuICogY2xhc3MgaW5zdGFuY2VzLlxuICovXG5cbmltcG9ydCB7IExvY2sgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdHlwZSBLZXlib2FyZEV2ZW50IGFzIFJlYWN0S2V5Ym9hcmRFdmVudCxcbiAgdHlwZSBNb3VzZUV2ZW50IGFzIFJlYWN0TW91c2VFdmVudCxcbiAgdHlwZSBSZWFjdE5vZGUsXG4gIHR5cGUgUmVmT2JqZWN0LFxuICB1c2VDb250ZXh0LFxuICB1c2VJZCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRU5DUllQVEVEX0RJU1BMQVlfTkFNRSB9IGZyb20gJy4uLy4uL2xpYi9oeWRyYXRpb24nO1xuaW1wb3J0IHtcbiAgdHlwZSBEZWNvZGVkU3RyZWFtQ2h1bmtTb3VyY2UsXG4gIHR5cGUgRm9ybWF0dGVkU3RyZWFtQ2h1bmtEaXNwbGF5LFxuICBmb3JtYXRBcnJheUJ1ZmZlclZpZXdGb3JEaXNwbGF5LFxufSBmcm9tICcuLi8uLi9saWIvc3RyZWFtLWRpc3BsYXknO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnLi9idXR0b24nO1xuaW1wb3J0IHsgQ0xTLCBKU09OX1ZJRVdfU1RZTEVTIH0gZnJvbSAnLi9kYXRhLWluc3BlY3Rvci5zdHlsZXMnO1xuaW1wb3J0IHsgU3Bpbm5lciB9IGZyb20gJy4vc3Bpbm5lcic7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3RyZWFtUmVmIC8gQ2xhc3NJbnN0YW5jZVJlZiB0eXBlIGRldGVjdGlvblxuLy8gKGlubGluZSB0byBhdm9pZCBjaXJjdWxhciBkZXBzIHdpdGggaHlkcmF0aW9uIG1vZHVsZSlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBTVFJFQU1fUkVGX1RZUEUgPSAnX193b3JrZmxvd19zdHJlYW1fcmVmX18nO1xuY29uc3QgQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEUgPSAnX193b3JrZmxvd19jbGFzc19pbnN0YW5jZV9yZWZfXyc7XG5jb25zdCBSVU5fUkVGX1RZUEUgPSAnX193b3JrZmxvd19ydW5fcmVmX18nO1xuY29uc3QgQllURVNfRElTUExBWV9UWVBFID0gJ19fd29ya2Zsb3dfYnl0ZXNfZGlzcGxheV9fJztcblxuaW50ZXJmYWNlIFN0cmVhbVJlZiB7XG4gIF9fdHlwZTogdHlwZW9mIFNUUkVBTV9SRUZfVFlQRTtcbiAgc3RyZWFtSWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJ1blJlZiB7XG4gIF9fdHlwZTogdHlwZW9mIFJVTl9SRUZfVFlQRTtcbiAgcnVuSWQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEJ5dGVzRGlzcGxheSB7XG4gIF9fdHlwZTogdHlwZW9mIEJZVEVTX0RJU1BMQVlfVFlQRTtcbiAgdGV4dDogc3RyaW5nO1xuICBkZWNvZGVkRnJvbT86IERlY29kZWRTdHJlYW1DaHVua1NvdXJjZTtcbn1cblxuaW50ZXJmYWNlIENsYXNzSW5zdGFuY2VSZWYge1xuICBfX3R5cGU6IHR5cGVvZiBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRTtcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIGNsYXNzSWQ6IHN0cmluZztcbiAgZGF0YTogdW5rbm93bjtcbn1cblxuZnVuY3Rpb24gZGVzZXJpYWxpemVDaHVua1RleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgIGlmICh0eXBlb2YgcGFyc2VkID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBhcnNlZCwgbnVsbCwgMik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ2h1bmtEYXRhKHRleHQ6IHN0cmluZyk6IHVua25vd24ge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N0cmVhbVJlZih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFN0cmVhbVJlZiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIC8vIENoZWNrIGJvdGggZW51bWVyYWJsZSBhbmQgbm9uLWVudW1lcmFibGUgX190eXBlIChvcGFxdWUgcmVmcyB1c2Ugbm9uLWVudW1lcmFibGUpXG4gIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCAnX190eXBlJyk7XG4gIHJldHVybiBkZXNjPy52YWx1ZSA9PT0gU1RSRUFNX1JFRl9UWVBFO1xufVxuXG5mdW5jdGlvbiBpc1J1blJlZih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJ1blJlZiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCAnX190eXBlJyk7XG4gIHJldHVybiBkZXNjPy52YWx1ZSA9PT0gUlVOX1JFRl9UWVBFO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCeXRlc0Rpc3BsYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBCeXRlc0Rpc3BsYXkge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwgJ19fdHlwZScpO1xuICByZXR1cm4gZGVzYz8udmFsdWUgPT09IEJZVEVTX0RJU1BMQVlfVFlQRTtcbn1cblxuZnVuY3Rpb24gaXNDbGFzc0luc3RhbmNlUmVmKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ2xhc3NJbnN0YW5jZVJlZiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgJ19fdHlwZScgaW4gdmFsdWUgJiZcbiAgICAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLl9fdHlwZSA9PT0gQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEVcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNFbmNyeXB0ZWRNYXJrZXIodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAodmFsdWUgYXMgeyBjb25zdHJ1Y3Rvcj86IHsgbmFtZT86IHN0cmluZyB9IH0pLmNvbnN0cnVjdG9yPy5uYW1lID09PVxuICAgICAgRU5DUllQVEVEX0RJU1BMQVlfTkFNRVxuICApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFN0cmVhbSBjbGljayBjb250ZXh0IChwYXNzZWQgdGhyb3VnaCBmcm9tIHRoZSBwYW5lbClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENvbnRleHQgZm9yIHBhc3Npbmcgc3RyZWFtIGNsaWNrIGhhbmRsZXJzIGRvd24gdG8gRGF0YUluc3BlY3RvciBpbnN0YW5jZXMuXG4gKiBFeHBvcnRlZCBzbyB0aGF0IHBhcmVudCBjb21wb25lbnRzIChlLmcuLCBBdHRyaWJ1dGVQYW5lbCkgY2FuIHByb3ZpZGUgdGhlIGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBTdHJlYW1DbGlja0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PFxuICAoKHN0cmVhbUlkOiBzdHJpbmcpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG4+KHVuZGVmaW5lZCk7XG5cbi8qKlxuICogQ29udGV4dCBmb3IgcGFzc2luZyBhIGRlY3J5cHQgaGFuZGxlciBkb3duIHRvIERhdGFJbnNwZWN0b3IgaW5zdGFuY2VzLlxuICogV2hlbiBwcm92aWRlZCwgZW5jcnlwdGVkIG1hcmtlcnMgYmVjb21lIGNsaWNrYWJsZSBidXR0b25zIHRoYXQgdHJpZ2dlciBkZWNyeXB0aW9uLlxuICovXG5leHBvcnQgdHlwZSBEZWNyeXB0Q2xpY2tDb250ZXh0VmFsdWUgPSB7XG4gIG9uRGVjcnlwdDogKCkgPT4gdm9pZDtcbiAgaXNEZWNyeXB0aW5nOiBib29sZWFuO1xuICBoYXNFbmNyeXB0ZWREYXRhPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBEZWNyeXB0Q2xpY2tDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxcbiAgRGVjcnlwdENsaWNrQ29udGV4dFZhbHVlIHwgdW5kZWZpbmVkXG4+KHVuZGVmaW5lZCk7XG5cbmV4cG9ydCBjb25zdCBSdW5DbGlja0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PFxuICAoKHJ1bklkOiBzdHJpbmcpID0+IHZvaWQpIHwgdW5kZWZpbmVkXG4+KHVuZGVmaW5lZCk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV29ya2Zsb3ctc3BlY2lmaWMgdmFsdWUgcmVuZGVyZXJzIChiYWRnZXMsIGVuY3J5cHRlZCBtYXJrZXJzLCBieXRlIHN0cmVhbXMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gRW5jcnlwdGVkSW5saW5lTGFiZWwoKSB7XG4gIGNvbnN0IGN0eCA9IHVzZUNvbnRleHQoRGVjcnlwdENsaWNrQ29udGV4dCk7XG4gIGlmIChjdHgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEJ1dHRvblxuICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICBjbGFzc05hbWU9XCJhbGlnbi1iYXNlbGluZSBnYXAteC0xXCJcbiAgICAgICAgZGlzYWJsZWQ9e2N0eC5pc0RlY3J5cHRpbmd9XG4gICAgICAgIG9uQ2xpY2s9eyhlKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBjdHgub25EZWNyeXB0KCk7XG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHtjdHguaXNEZWNyeXB0aW5nID8gKFxuICAgICAgICAgIDxTcGlubmVyIHNpemU9ezEwfSAvPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxMb2NrIGNsYXNzTmFtZT1cImgtMyB3LTNcIiAvPlxuICAgICAgICApfVxuICAgICAgICA8c3Bhbj5EZWNyeXB0PC9zcGFuPlxuICAgICAgPC9CdXR0b24+XG4gICAgKTtcbiAgfVxuICByZXR1cm4gKFxuICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS02MDApJywgZm9udFN0eWxlOiAnaXRhbGljJyB9fT5cbiAgICAgIDxMb2NrXG4gICAgICAgIGNsYXNzTmFtZT1cImgtMyB3LTNcIlxuICAgICAgICBzdHlsZT17e1xuICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUnLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgICAgICAgIG1hcmdpblJpZ2h0OiAnM3B4JyxcbiAgICAgICAgICBtYXJnaW5Ub3A6ICctMXB4JyxcbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgICBFbmNyeXB0ZWRcbiAgICA8L3NwYW4+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFN0cmVhbVJlZklubGluZSh7IHN0cmVhbVJlZiB9OiB7IHN0cmVhbVJlZjogU3RyZWFtUmVmIH0pIHtcbiAgY29uc3Qgb25TdHJlYW1DbGljayA9IHVzZUNvbnRleHQoU3RyZWFtQ2xpY2tDb250ZXh0KTtcbiAgY29uc3QgW2hvdmVyZWQsIHNldEhvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTEuNSBweS0wLjUgcm91bmRlZCB0ZXh0LVsxMHB4XSBmb250LW1vbm8gY3Vyc29yLXBvaW50ZXIgdW5kZXJsaW5lIGRlY29yYXRpb24tdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBob3ZlcmVkID8gJ3ZhcigtLWRzLWJsdWUtMjAwKScgOiAndmFyKC0tZHMtYmx1ZS0xMDApJyxcbiAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ibHVlLTkwMCknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgdmFyKC0tZHMtYmx1ZS0zMDApJyxcbiAgICAgIH19XG4gICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldEhvdmVyZWQodHJ1ZSl9XG4gICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldEhvdmVyZWQoZmFsc2UpfVxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25TdHJlYW1DbGljaz8uKHN0cmVhbVJlZi5zdHJlYW1JZCk7XG4gICAgICB9fVxuICAgICAgdGl0bGU9e2BWaWV3IHN0cmVhbTogJHtzdHJlYW1SZWYuc3RyZWFtSWR9YH1cbiAgICA+XG4gICAgICA8c3Bhbj7wn5OhPC9zcGFuPlxuICAgICAgPHNwYW4+e3N0cmVhbVJlZi5zdHJlYW1JZH08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFJ1blJlZklubGluZSh7IHJ1blJlZiB9OiB7IHJ1blJlZjogUnVuUmVmIH0pIHtcbiAgY29uc3Qgb25SdW5DbGljayA9IHVzZUNvbnRleHQoUnVuQ2xpY2tDb250ZXh0KTtcbiAgY29uc3QgW2hvdmVyZWQsIHNldEhvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTEuNSBweS0wLjUgcm91bmRlZCB0ZXh0LVsxMHB4XSBmb250LW1vbm8gY3Vyc29yLXBvaW50ZXIgdW5kZXJsaW5lIGRlY29yYXRpb24tdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBob3ZlcmVkXG4gICAgICAgICAgPyAndmFyKC0tZHMtcHVycGxlLTIwMCknXG4gICAgICAgICAgOiAndmFyKC0tZHMtcHVycGxlLTEwMCknLFxuICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLXB1cnBsZS05MDApJyxcbiAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIHZhcigtLWRzLXB1cnBsZS0zMDApJyxcbiAgICAgIH19XG4gICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldEhvdmVyZWQodHJ1ZSl9XG4gICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldEhvdmVyZWQoZmFsc2UpfVxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25SdW5DbGljaz8uKHJ1blJlZi5ydW5JZCk7XG4gICAgICB9fVxuICAgICAgdGl0bGU9e2BWaWV3IHJ1bjogJHtydW5SZWYucnVuSWR9YH1cbiAgICA+XG4gICAgICA8c3Bhbj57cnVuUmVmLnJ1bklkfTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gRGVjb2RlZEJ5dGVzQ2h1bmsoe1xuICBkZWNvZGVkVGV4dCxcbiAgc291cmNlLFxufToge1xuICBkZWNvZGVkVGV4dDogc3RyaW5nO1xuICBzb3VyY2U6IERlY29kZWRTdHJlYW1DaHVua1NvdXJjZTtcbn0pIHtcbiAgY29uc3QgW3NlbGVjdGVkVmlldywgc2V0U2VsZWN0ZWRWaWV3XSA9IHVzZVN0YXRlPCdkZWNvZGVkJyB8ICdieXRlcyc+KFxuICAgICdkZWNvZGVkJ1xuICApO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUNodW5rRGF0YShkZWNvZGVkVGV4dCk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cIm1pbi13LTBcIj5cbiAgICAgIHtzZWxlY3RlZFZpZXcgPT09ICdkZWNvZGVkJyA/IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wXCI+XG4gICAgICAgICAge3R5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnID8gKFxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwid2hpdGVzcGFjZS1wcmUtd3JhcCBicmVhay13b3Jkc1wiXG4gICAgICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2Rlc2VyaWFsaXplQ2h1bmtUZXh0KHBhcnNlZCl9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxEYXRhSW5zcGVjdG9yIGRhdGE9e3BhcnNlZH0gZXhwYW5kTGV2ZWw9ezF9IC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApIDogKFxuICAgICAgICA8RGVjb2RlZEJ5dGVzSW5zcGVjdG9yIGRlY29kZWRUZXh0PXtkZWNvZGVkVGV4dH0gc291cmNlPXtzb3VyY2V9IC8+XG4gICAgICApfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0yIGZsZXhcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IG92ZXJmbG93LWhpZGRlbiByb3VuZGVkIGJvcmRlclwiXG4gICAgICAgICAgc3R5bGU9e3sgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTQwMCknIH19XG4gICAgICAgICAgdGl0bGU9e2Ake3NvdXJjZS50eXBlfSBkZWNvZGVkIGFzICR7c291cmNlLmVuY29kaW5nLnRvVXBwZXJDYXNlKCl9IHRleHQuIFN3aXRjaCB0byBCeXRlcyB0byBpbnNwZWN0IHRoZSBzdW1tYXJpemVkIHJhdyB2YWx1ZS5gfVxuICAgICAgICA+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJoLTUgcHgtMS41IHRleHQtWzEwcHhdIGZvbnQtbWVkaXVtXCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjpcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFZpZXcgPT09ICdkZWNvZGVkJ1xuICAgICAgICAgICAgICAgICAgPyAndmFyKC0tZHMtZ3JheS0yMDApJ1xuICAgICAgICAgICAgICAgICAgOiAndmFyKC0tZHMtZ3JheS0xMDApJyxcbiAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTkwMCknLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNlbGVjdGVkVmlldygnZGVjb2RlZCcpfVxuICAgICAgICAgICAgYXJpYS1wcmVzc2VkPXtzZWxlY3RlZFZpZXcgPT09ICdkZWNvZGVkJ31cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTaG93IGRlY29kZWQgdGV4dFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgRGVjb2RlZFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC01IGJvcmRlci1sIHB4LTEuNSB0ZXh0LVsxMHB4XSBmb250LW1lZGl1bVwiXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWRzLWdyYXktNDAwKScsXG4gICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjpcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFZpZXcgPT09ICdieXRlcydcbiAgICAgICAgICAgICAgICAgID8gJ3ZhcigtLWRzLWdyYXktMjAwKSdcbiAgICAgICAgICAgICAgICAgIDogJ3ZhcigtLWRzLWdyYXktMTAwKScsXG4gICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS05MDApJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTZWxlY3RlZFZpZXcoJ2J5dGVzJyl9XG4gICAgICAgICAgICBhcmlhLXByZXNzZWQ9e3NlbGVjdGVkVmlldyA9PT0gJ2J5dGVzJ31cbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJTaG93IHJhdyBieXRlcyBzdW1tYXJ5XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBCeXRlc1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufVxuXG5mdW5jdGlvbiBEZWNvZGVkQnl0ZXNJbnNwZWN0b3Ioe1xuICBkZWNvZGVkVGV4dCxcbiAgc291cmNlLFxufToge1xuICBkZWNvZGVkVGV4dDogc3RyaW5nO1xuICBzb3VyY2U6IERlY29kZWRTdHJlYW1DaHVua1NvdXJjZTtcbn0pIHtcbiAgY29uc3QgW2V4cGFuZGVkLCBzZXRFeHBhbmRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZvbnQtbW9ub1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBtYXgtdy1mdWxsIGl0ZW1zLXN0YXJ0IGdhcC0xIHRleHQtbGVmdFwiXG4gICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScgfX1cbiAgICAgICAgb25DbGljaz17KCkgPT4gc2V0RXhwYW5kZWQoKHZhbHVlKSA9PiAhdmFsdWUpfVxuICAgICAgICB0aXRsZT17YCR7c291cmNlLnR5cGV9IGRlY29kZWQgYXMgJHtzb3VyY2UuZW5jb2RpbmcudG9VcHBlckNhc2UoKX0gdGV4dGB9XG4gICAgICA+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNlbGVjdC1ub25lXCIgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknIH19PlxuICAgICAgICAgIHtleHBhbmRlZCA/ICfilrwnIDogJ+KWtid9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWluLXctMCBicmVhay13b3Jkc1wiPntzb3VyY2UucmF3U3VtbWFyeX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIHtleHBhbmRlZCAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMSBwbC01XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTcwMCknIH19PmRlY29kZWQ6IDwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPVwid2hpdGVzcGFjZS1wcmUtd3JhcCBicmVhay13b3Jkc1wiXG4gICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyZWVuLTkwMCknIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge0pTT04uc3RyaW5naWZ5KGRlY29kZWRUZXh0KX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gQnl0ZXNEaXNwbGF5VmFsdWUoeyBkaXNwbGF5IH06IHsgZGlzcGxheTogQnl0ZXNEaXNwbGF5IH0pIHtcbiAgaWYgKGRpc3BsYXkuZGVjb2RlZEZyb20pIHtcbiAgICByZXR1cm4gKFxuICAgICAgPERlY29kZWRCeXRlc0NodW5rXG4gICAgICAgIGRlY29kZWRUZXh0PXtkaXNwbGF5LnRleHR9XG4gICAgICAgIHNvdXJjZT17ZGlzcGxheS5kZWNvZGVkRnJvbX1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuICByZXR1cm4gKFxuICAgIDxzcGFuXG4gICAgICBjbGFzc05hbWU9XCJ3aGl0ZXNwYWNlLXByZS13cmFwIGJyZWFrLXdvcmRzXCJcbiAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScgfX1cbiAgICA+XG4gICAgICB7ZGlzcGxheS50ZXh0fVxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUcmVlIHJlbmRlcmVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBFbnRyeSA9IFtmaWVsZDogc3RyaW5nIHwgdW5kZWZpbmVkLCB2YWx1ZTogdW5rbm93bl07XG5cbmludGVyZmFjZSBOb2RlQ29udGV4dCB7XG4gIGxldmVsOiBudW1iZXI7XG4gIHNob3VsZEV4cGFuZDogKGxldmVsOiBudW1iZXIpID0+IGJvb2xlYW47XG4gIG91dGVyUmVmOiBSZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQgfCBudWxsPjtcbn1cblxuLyoqIEZpZWxkIG5hbWVzIGFyZSByZW5kZXJlZCB1bnF1b3RlZCAoZW1wdHkgc3RyaW5nIHNob3dzIGFzIGBcIlwiYCkuICovXG5mdW5jdGlvbiBmb3JtYXRGaWVsZChmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZpZWxkID09PSAnJyA/ICdcIlwiJyA6IGZpZWxkO1xufVxuXG4vKipcbiAqIERlc2NyaWJlIGFuIG9iamVjdC9hcnJheS9tYXAvc2V0IGFzIGFuIGV4cGFuZGFibGUgY29udGFpbmVyLiBSZXR1cm5zIG51bGwgZm9yXG4gKiB2YWx1ZXMgdGhhdCBzaG91bGQgcmVuZGVyIGFzIGEgcHJpbWl0aXZlLiBgcHJlZml4YCBjYXJyaWVzIGEgY2xhc3MgbmFtZSBzaG93blxuICogYmVmb3JlIHRoZSBvcGVuaW5nIGJyYWNrZXQgKE1hcC9TZXQgYW5kIG5hbWVkIGNsYXNzIGluc3RhbmNlcykuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQ29udGFpbmVyKFxuICB2YWx1ZTogdW5rbm93blxuKTogeyBlbnRyaWVzOiBFbnRyeVtdOyBvcGVuOiBzdHJpbmc7IGNsb3NlOiBzdHJpbmc7IHByZWZpeD86IHN0cmluZyB9IHwgbnVsbCB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBlbnRyaWVzOiB2YWx1ZS5tYXAoKGl0ZW0pID0+IFt1bmRlZmluZWQsIGl0ZW1dIGFzIEVudHJ5KSxcbiAgICAgIG9wZW46ICdbJyxcbiAgICAgIGNsb3NlOiAnXScsXG4gICAgfTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50cmllczogQXJyYXkuZnJvbSh2YWx1ZS5lbnRyaWVzKCksIChba2V5LCB2YWxdKSA9PiBbXG4gICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICB2YWwsXG4gICAgICBdKSBhcyBFbnRyeVtdLFxuICAgICAgb3BlbjogJ3snLFxuICAgICAgY2xvc2U6ICd9JyxcbiAgICAgIHByZWZpeDogJ01hcCcsXG4gICAgfTtcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50cmllczogQXJyYXkuZnJvbSh2YWx1ZS52YWx1ZXMoKSwgKGl0ZW0pID0+IFt1bmRlZmluZWQsIGl0ZW1dIGFzIEVudHJ5KSxcbiAgICAgIG9wZW46ICdbJyxcbiAgICAgIGNsb3NlOiAnXScsXG4gICAgICBwcmVmaXg6ICdTZXQnLFxuICAgIH07XG4gIH1cbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBuYW1lID0gKHZhbHVlIGFzIHsgY29uc3RydWN0b3I/OiB7IG5hbWU/OiBzdHJpbmcgfSB9KS5jb25zdHJ1Y3RvclxuICAgICAgPy5uYW1lO1xuICAgIHJldHVybiB7XG4gICAgICBlbnRyaWVzOiBPYmplY3QuZW50cmllcyh2YWx1ZSkgYXMgRW50cnlbXSxcbiAgICAgIG9wZW46ICd7JyxcbiAgICAgIGNsb3NlOiAnfScsXG4gICAgICBwcmVmaXg6IG5hbWUgJiYgbmFtZSAhPT0gJ09iamVjdCcgPyBuYW1lIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlUHJpbWl0aXZlKHZhbHVlOiB1bmtub3duKTogeyB0ZXh0OiBzdHJpbmc7IGNsczogc3RyaW5nIH0ge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiB7IHRleHQ6ICdudWxsJywgY2xzOiBDTFMubnVsbCB9O1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgdGV4dDogJ3VuZGVmaW5lZCcsIGNsczogQ0xTLnVuZGVmaW5lZCB9O1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykge1xuICAgIHJldHVybiB7IHRleHQ6IGBcIiR7U3RyaW5nKHZhbHVlKX1cImAsIGNsczogQ0xTLnN0cmluZyB9O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHtcbiAgICByZXR1cm4geyB0ZXh0OiBTdHJpbmcodmFsdWUpLCBjbHM6IENMUy5ib29sZWFuIH07XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHtcbiAgICByZXR1cm4geyB0ZXh0OiBTdHJpbmcodmFsdWUpLCBjbHM6IENMUy5udW1iZXIgfTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiB7IHRleHQ6IGAke3ZhbHVlLnRvU3RyaW5nKCl9bmAsIGNsczogQ0xTLm51bWJlciB9O1xuICB9XG4gIHJldHVybiB7IHRleHQ6IFN0cmluZyh2YWx1ZSksIGNsczogQ0xTLnB1bmN0dWF0aW9uIH07XG59XG5cbmZ1bmN0aW9uIExhYmVsKHsgZmllbGQsIGNsaWNrYWJsZSB9OiB7IGZpZWxkPzogc3RyaW5nOyBjbGlja2FibGU/OiBib29sZWFuIH0pIHtcbiAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICByZXR1cm4gKFxuICAgIDxzcGFuIGNsYXNzTmFtZT17Y2xpY2thYmxlID8gQ0xTLmNsaWNrYWJsZUxhYmVsIDogQ0xTLmxhYmVsfT5cbiAgICAgIHtgJHtmb3JtYXRGaWVsZChmaWVsZCl9OmB9XG4gICAgPC9zcGFuPlxuICApO1xufVxuXG5mdW5jdGlvbiBDb21tYSh7IGlzTGFzdCB9OiB7IGlzTGFzdDogYm9vbGVhbiB9KSB7XG4gIGlmIChpc0xhc3QpIHJldHVybiBudWxsO1xuICByZXR1cm4gPHNwYW4gY2xhc3NOYW1lPXtDTFMucHVuY3R1YXRpb259Piw8L3NwYW4+O1xufVxuXG4vKiogQSBub24tZXhwYW5kYWJsZSByb3c6IGBmaWVsZDogPHZhbHVlPmAuICovXG5mdW5jdGlvbiBMZWFmUm93KHtcbiAgZmllbGQsXG4gIGlzTGFzdCxcbiAgY2hpbGRyZW4sXG59OiB7XG4gIGZpZWxkPzogc3RyaW5nO1xuICBpc0xhc3Q6IGJvb2xlYW47XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG59KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9e0NMUy5jaGlsZH0gcm9sZT1cInRyZWVpdGVtXCIgdGFiSW5kZXg9ey0xfT5cbiAgICAgIDxMYWJlbCBmaWVsZD17ZmllbGR9IC8+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICA8Q29tbWEgaXNMYXN0PXtpc0xhc3R9IC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFByaW1pdGl2ZVZhbHVlKHsgZmllbGQsIHZhbHVlLCBpc0xhc3QgfTogTm9kZVByb3BzKSB7XG4gIGNvbnN0IHsgdGV4dCwgY2xzIH0gPSBkZXNjcmliZVByaW1pdGl2ZSh2YWx1ZSk7XG4gIHJldHVybiAoXG4gICAgPExlYWZSb3cgZmllbGQ9e2ZpZWxkfSBpc0xhc3Q9e2lzTGFzdH0+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e2Nsc30+e3RleHR9PC9zcGFuPlxuICAgIDwvTGVhZlJvdz5cbiAgKTtcbn1cblxuZnVuY3Rpb24gRW1wdHlDb250YWluZXIoe1xuICBmaWVsZCxcbiAgcHJlZml4LFxuICBvcGVuLFxuICBjbG9zZSxcbiAgaXNMYXN0LFxufToge1xuICBmaWVsZD86IHN0cmluZztcbiAgcHJlZml4Pzogc3RyaW5nO1xuICBvcGVuOiBzdHJpbmc7XG4gIGNsb3NlOiBzdHJpbmc7XG4gIGlzTGFzdDogYm9vbGVhbjtcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Q0xTLmNoaWxkfSByb2xlPVwidHJlZWl0ZW1cIiB0YWJJbmRleD17LTF9PlxuICAgICAgPExhYmVsIGZpZWxkPXtmaWVsZH0gLz5cbiAgICAgIHtwcmVmaXggPyA8c3BhbiBjbGFzc05hbWU9e0NMUy5jbGFzc05hbWV9PntwcmVmaXh9PC9zcGFuPiA6IG51bGx9XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e0NMUy5wdW5jdHVhdGlvbn0+e29wZW59PC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtDTFMucHVuY3R1YXRpb259PntjbG9zZX08L3NwYW4+XG4gICAgICA8Q29tbWEgaXNMYXN0PXtpc0xhc3R9IC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIGZvY3VzRXhwYW5kZXIoXG4gIGJ1dHRvbjogSFRNTEVsZW1lbnQsXG4gIG91dGVyUmVmOiBSZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQgfCBudWxsPlxuKSB7XG4gIGNvbnN0IHByZXZpb3VzID0gb3V0ZXJSZWYuY3VycmVudD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXG4gICAgJ1tkYXRhLWpzb24tZXhwYW5kZXJdW3RhYmluZGV4PVwiMFwiXSdcbiAgKTtcbiAgaWYgKHByZXZpb3VzKSBwcmV2aW91cy50YWJJbmRleCA9IC0xO1xuICBidXR0b24udGFiSW5kZXggPSAwO1xuICBidXR0b24uZm9jdXMoKTtcbn1cblxuZnVuY3Rpb24gbW92ZUV4cGFuZGVyRm9jdXMoXG4gIG91dGVyUmVmOiBSZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQgfCBudWxsPixcbiAgZGlyZWN0aW9uOiAxIHwgLTFcbikge1xuICBjb25zdCByb290ID0gb3V0ZXJSZWYuY3VycmVudDtcbiAgaWYgKCFyb290KSByZXR1cm47XG4gIGNvbnN0IGJ1dHRvbnMgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdbZGF0YS1qc29uLWV4cGFuZGVyXScpO1xuICBsZXQgY3VycmVudCA9IC0xO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoYnV0dG9uc1tpXS50YWJJbmRleCA9PT0gMCkge1xuICAgICAgY3VycmVudCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGN1cnJlbnQgPCAwKSByZXR1cm47XG4gIGNvbnN0IG5leHQgPSAoY3VycmVudCArIGRpcmVjdGlvbiArIGJ1dHRvbnMubGVuZ3RoKSAlIGJ1dHRvbnMubGVuZ3RoO1xuICBidXR0b25zW2N1cnJlbnRdLnRhYkluZGV4ID0gLTE7XG4gIGJ1dHRvbnNbbmV4dF0udGFiSW5kZXggPSAwO1xuICBidXR0b25zW25leHRdLmZvY3VzKCk7XG59XG5cbmZ1bmN0aW9uIEV4cGFuZGFibGVDb250YWluZXIoe1xuICBmaWVsZCxcbiAgZW50cmllcyxcbiAgb3BlbixcbiAgY2xvc2UsXG4gIHByZWZpeCxcbiAgY3R4LFxuICBpc0xhc3QsXG59OiB7XG4gIGZpZWxkPzogc3RyaW5nO1xuICBlbnRyaWVzOiBFbnRyeVtdO1xuICBvcGVuOiBzdHJpbmc7XG4gIGNsb3NlOiBzdHJpbmc7XG4gIHByZWZpeD86IHN0cmluZztcbiAgY3R4OiBOb2RlQ29udGV4dDtcbiAgaXNMYXN0OiBib29sZWFuO1xufSkge1xuICBjb25zdCB7IGxldmVsLCBzaG91bGRFeHBhbmQsIG91dGVyUmVmIH0gPSBjdHg7XG4gIGNvbnN0IFtleHBhbmRlZCwgc2V0RXhwYW5kZWRdID0gdXNlU3RhdGUoKCkgPT4gc2hvdWxkRXhwYW5kKGxldmVsKSk7XG4gIGNvbnN0IHJvd1JlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbCk7XG4gIGNvbnN0IGNvbnRlbnRzSWQgPSB1c2VJZCgpO1xuXG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICA8RW1wdHlDb250YWluZXJcbiAgICAgICAgZmllbGQ9e2ZpZWxkfVxuICAgICAgICBwcmVmaXg9e3ByZWZpeH1cbiAgICAgICAgb3Blbj17b3Blbn1cbiAgICAgICAgY2xvc2U9e2Nsb3NlfVxuICAgICAgICBpc0xhc3Q9e2lzTGFzdH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRvZ2dsZSA9ICgpID0+IHtcbiAgICBzZXRFeHBhbmRlZCgodmFsdWUpID0+ICF2YWx1ZSk7XG4gICAgaWYgKHJvd1JlZi5jdXJyZW50KSBmb2N1c0V4cGFuZGVyKHJvd1JlZi5jdXJyZW50LCBvdXRlclJlZik7XG4gIH07XG5cbiAgLy8gVG9nZ2xlIG9ubHkgZm9yIGNsaWNrcyB0aGF0IGxhbmQgb24gdGhpcyByb3cgaXRzZWxmOyBjbGlja3MgYnViYmxpbmcgdXAgb3V0XG4gIC8vIG9mIGEgbmVzdGVkIHRyZWVpdGVtIGFyZSBoYW5kbGVkIGJ5IHRoYXQgZGVzY2VuZGFudCdzIG93biByb3cuXG4gIGNvbnN0IG9uQ2xpY2sgPSAoZXZlbnQ6IFJlYWN0TW91c2VFdmVudCkgPT4ge1xuICAgIGlmIChcbiAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJ1tyb2xlPVwidHJlZWl0ZW1cIl0nKSAhPT1cbiAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdG9nZ2xlKCk7XG4gIH07XG5cbiAgY29uc3Qgb25LZXlEb3duID0gKGV2ZW50OiBSZWFjdEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRFeHBhbmRlZCh0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRFeHBhbmRlZChmYWxzZSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIG1vdmVFeHBhbmRlckZvY3VzKG91dGVyUmVmLCAtMSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgbW92ZUV4cGFuZGVyRm9jdXMob3V0ZXJSZWYsIDEpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsYXN0SW5kZXggPSBlbnRyaWVzLmxlbmd0aCAtIDE7XG5cbiAgcmV0dXJuIChcbiAgICAvLyBUaGUgdHJlZWl0ZW0gcm93IGlzIHRoZSBmb2N1c2FibGUsIGtleWJvYXJkLW9wZXJhYmxlIGNvbnRyb2wgKHJvdmluZ1xuICAgIC8vIHRhYmluZGV4ICsgYXJyb3cga2V5cyk7IHRoZSBkaXNjbG9zdXJlIG1hcmtlciBiZWxvdyBpcyBwdXJlbHkgZGVjb3JhdGl2ZS5cbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e0NMUy5jaGlsZH1cbiAgICAgIHJvbGU9XCJ0cmVlaXRlbVwiXG4gICAgICBhcmlhLWV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgIGFyaWEtY29udHJvbHM9e2V4cGFuZGVkID8gY29udGVudHNJZCA6IHVuZGVmaW5lZH1cbiAgICAgIGRhdGEtanNvbi1leHBhbmRlclxuICAgICAgcmVmPXtyb3dSZWZ9XG4gICAgICB0YWJJbmRleD17bGV2ZWwgPT09IDAgPyAwIDogLTF9XG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgICAgb25LZXlEb3duPXtvbktleURvd259XG4gICAgPlxuICAgICAgPHNwYW5cbiAgICAgICAgY2xhc3NOYW1lPXtleHBhbmRlZCA/IENMUy5jb2xsYXBzZUljb24gOiBDTFMuZXhwYW5kSWNvbn1cbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIC8+XG4gICAgICB7ZmllbGQgIT09IHVuZGVmaW5lZCAmJiAoXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Q0xTLmNsaWNrYWJsZUxhYmVsfT57YCR7Zm9ybWF0RmllbGQoZmllbGQpfTpgfTwvc3Bhbj5cbiAgICAgICl9XG4gICAgICB7cHJlZml4ID8gPHNwYW4gY2xhc3NOYW1lPXtDTFMuY2xhc3NOYW1lfT57cHJlZml4fTwvc3Bhbj4gOiBudWxsfVxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtDTFMucHVuY3R1YXRpb259PntvcGVufTwvc3Bhbj5cbiAgICAgIHtleHBhbmRlZCA/IChcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvYTExeS91c2VTZW1hbnRpY0VsZW1lbnRzOiBBUklBIHRyZWUgZ3JvdXAgaXMgdGhlIGNvcnJlY3Qgcm9sZSBoZXJlXG4gICAgICAgIDx1bCBpZD17Y29udGVudHNJZH0gY2xhc3NOYW1lPXtDTFMuY2hpbGRGaWVsZHN9IHJvbGU9XCJncm91cFwiPlxuICAgICAgICAgIHtlbnRyaWVzLm1hcCgoW2NoaWxkRmllbGQsIGNoaWxkVmFsdWVdLCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPERhdGFSZW5kZXJcbiAgICAgICAgICAgICAga2V5PXtjaGlsZEZpZWxkID8/IGluZGV4fVxuICAgICAgICAgICAgICBmaWVsZD17Y2hpbGRGaWVsZH1cbiAgICAgICAgICAgICAgdmFsdWU9e2NoaWxkVmFsdWV9XG4gICAgICAgICAgICAgIGlzTGFzdD17aW5kZXggPT09IGxhc3RJbmRleH1cbiAgICAgICAgICAgICAgY3R4PXt7IC4uLmN0eCwgbGV2ZWw6IGxldmVsICsgMSB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC91bD5cbiAgICAgICkgOiAoXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17Q0xTLmNvbGxhcHNlZENvbnRlbnR9IGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICApfVxuICAgICAgPHNwYW4gY2xhc3NOYW1lPXtDTFMucHVuY3R1YXRpb259PntjbG9zZX08L3NwYW4+XG4gICAgICA8Q29tbWEgaXNMYXN0PXtpc0xhc3R9IC8+XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmludGVyZmFjZSBOb2RlUHJvcHMge1xuICBmaWVsZD86IHN0cmluZztcbiAgdmFsdWU6IHVua25vd247XG4gIGlzTGFzdDogYm9vbGVhbjtcbiAgY3R4OiBOb2RlQ29udGV4dDtcbn1cblxuZnVuY3Rpb24gRGF0YVJlbmRlcih7IGZpZWxkLCB2YWx1ZSwgaXNMYXN0LCBjdHggfTogTm9kZVByb3BzKSB7XG4gIGlmIChpc0J5dGVzRGlzcGxheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPExlYWZSb3cgZmllbGQ9e2ZpZWxkfSBpc0xhc3Q9e2lzTGFzdH0+XG4gICAgICAgIDxCeXRlc0Rpc3BsYXlWYWx1ZSBkaXNwbGF5PXt2YWx1ZX0gLz5cbiAgICAgIDwvTGVhZlJvdz5cbiAgICApO1xuICB9XG4gIGlmIChpc0VuY3J5cHRlZE1hcmtlcih2YWx1ZSkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPExlYWZSb3cgZmllbGQ9e2ZpZWxkfSBpc0xhc3Q9e2lzTGFzdH0+XG4gICAgICAgIDxFbmNyeXB0ZWRJbmxpbmVMYWJlbCAvPlxuICAgICAgPC9MZWFmUm93PlxuICAgICk7XG4gIH1cbiAgaWYgKGlzU3RyZWFtUmVmKHZhbHVlKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8TGVhZlJvdyBmaWVsZD17ZmllbGR9IGlzTGFzdD17aXNMYXN0fT5cbiAgICAgICAgPFN0cmVhbVJlZklubGluZSBzdHJlYW1SZWY9e3ZhbHVlfSAvPlxuICAgICAgPC9MZWFmUm93PlxuICAgICk7XG4gIH1cbiAgaWYgKGlzUnVuUmVmKHZhbHVlKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8TGVhZlJvdyBmaWVsZD17ZmllbGR9IGlzTGFzdD17aXNMYXN0fT5cbiAgICAgICAgPFJ1blJlZklubGluZSBydW5SZWY9e3ZhbHVlfSAvPlxuICAgICAgPC9MZWFmUm93PlxuICAgICk7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiAoXG4gICAgICA8TGVhZlJvdyBmaWVsZD17ZmllbGR9IGlzTGFzdD17aXNMYXN0fT5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtDTFMuZGF0ZX0+e3ZhbHVlLnRvSVNPU3RyaW5nKCl9PC9zcGFuPlxuICAgICAgPC9MZWFmUm93PlxuICAgICk7XG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxMZWFmUm93IGZpZWxkPXtmaWVsZH0gaXNMYXN0PXtpc0xhc3R9PlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9e0NMUy5yZWdleHB9Pnt2YWx1ZS50b1N0cmluZygpfTwvc3Bhbj5cbiAgICAgIDwvTGVhZlJvdz5cbiAgICApO1xuICB9XG4gIGlmIChpc0NsYXNzSW5zdGFuY2VSZWYodmFsdWUpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxDbGFzc0luc3RhbmNlTm9kZVxuICAgICAgICBmaWVsZD17ZmllbGR9XG4gICAgICAgIGluc3RhbmNlPXt2YWx1ZX1cbiAgICAgICAgaXNMYXN0PXtpc0xhc3R9XG4gICAgICAgIGN0eD17Y3R4fVxuICAgICAgLz5cbiAgICApO1xuICB9XG5cbiAgY29uc3QgY29udGFpbmVyID0gZGVzY3JpYmVDb250YWluZXIodmFsdWUpO1xuICBpZiAoY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxFeHBhbmRhYmxlQ29udGFpbmVyXG4gICAgICAgIGZpZWxkPXtmaWVsZH1cbiAgICAgICAgZW50cmllcz17Y29udGFpbmVyLmVudHJpZXN9XG4gICAgICAgIG9wZW49e2NvbnRhaW5lci5vcGVufVxuICAgICAgICBjbG9zZT17Y29udGFpbmVyLmNsb3NlfVxuICAgICAgICBwcmVmaXg9e2NvbnRhaW5lci5wcmVmaXh9XG4gICAgICAgIGN0eD17Y3R4fVxuICAgICAgICBpc0xhc3Q9e2lzTGFzdH1cbiAgICAgIC8+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFByaW1pdGl2ZVZhbHVlIGZpZWxkPXtmaWVsZH0gdmFsdWU9e3ZhbHVlfSBpc0xhc3Q9e2lzTGFzdH0gY3R4PXtjdHh9IC8+XG4gICk7XG59XG5cbmZ1bmN0aW9uIENsYXNzSW5zdGFuY2VOb2RlKHtcbiAgZmllbGQsXG4gIGluc3RhbmNlLFxuICBpc0xhc3QsXG4gIGN0eCxcbn06IHtcbiAgZmllbGQ/OiBzdHJpbmc7XG4gIGluc3RhbmNlOiBDbGFzc0luc3RhbmNlUmVmO1xuICBpc0xhc3Q6IGJvb2xlYW47XG4gIGN0eDogTm9kZUNvbnRleHQ7XG59KSB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRlc2NyaWJlQ29udGFpbmVyKGluc3RhbmNlLmRhdGEpO1xuICBpZiAoY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxFeHBhbmRhYmxlQ29udGFpbmVyXG4gICAgICAgIGZpZWxkPXtmaWVsZH1cbiAgICAgICAgZW50cmllcz17Y29udGFpbmVyLmVudHJpZXN9XG4gICAgICAgIG9wZW49e2NvbnRhaW5lci5vcGVufVxuICAgICAgICBjbG9zZT17Y29udGFpbmVyLmNsb3NlfVxuICAgICAgICBwcmVmaXg9e2luc3RhbmNlLmNsYXNzTmFtZX1cbiAgICAgICAgY3R4PXtjdHh9XG4gICAgICAgIGlzTGFzdD17aXNMYXN0fVxuICAgICAgLz5cbiAgICApO1xuICB9XG4gIGNvbnN0IHsgdGV4dCwgY2xzIH0gPSBkZXNjcmliZVByaW1pdGl2ZShpbnN0YW5jZS5kYXRhKTtcbiAgcmV0dXJuIChcbiAgICA8TGVhZlJvdyBmaWVsZD17ZmllbGR9IGlzTGFzdD17aXNMYXN0fT5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT17Q0xTLmNsYXNzTmFtZX0+e2luc3RhbmNlLmNsYXNzTmFtZX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9e2Nsc30+e3RleHR9PC9zcGFuPlxuICAgIDwvTGVhZlJvdz5cbiAgKTtcbn1cblxuZnVuY3Rpb24gSnNvblRyZWUoe1xuICBkYXRhLFxuICBuYW1lLFxuICBleHBhbmRMZXZlbCxcbn06IHtcbiAgZGF0YTogdW5rbm93bjtcbiAgbmFtZT86IHN0cmluZztcbiAgZXhwYW5kTGV2ZWw6IG51bWJlcjtcbn0pIHtcbiAgY29uc3Qgb3V0ZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBzaG91bGRFeHBhbmQgPSB1c2VNZW1vKFxuICAgICgpID0+IChsZXZlbDogbnVtYmVyKSA9PiBsZXZlbCA8IGV4cGFuZExldmVsLFxuICAgIFtleHBhbmRMZXZlbF1cbiAgKTtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICByZWY9e291dGVyUmVmfVxuICAgICAgY2xhc3NOYW1lPXtDTFMuY29udGFpbmVyfVxuICAgICAgcm9sZT1cInRyZWVcIlxuICAgICAgYXJpYS1sYWJlbD1cIkpTT04gdmlld1wiXG4gICAgPlxuICAgICAgPERhdGFSZW5kZXJcbiAgICAgICAgZmllbGQ9e25hbWV9XG4gICAgICAgIHZhbHVlPXtkYXRhfVxuICAgICAgICBpc0xhc3RcbiAgICAgICAgY3R4PXt7IGxldmVsOiAwLCBzaG91bGRFeHBhbmQsIG91dGVyUmVmIH19XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlZiAvIHR5cGVkLWFycmF5IGNvbGxhcHNpbmcgKHByZXByb2Nlc3NpbmcgYmVmb3JlIHJlbmRlcilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENyZWF0ZSBhIG5vbi1leHBhbmRhYmxlIHdyYXBwZXIgdGhhdCBjYXJyaWVzIHJlZiBkYXRhIGFzIG5vbi1lbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIHNvIHRoZSByZW5kZXJlciBjYW4gZGV0ZWN0IFN0cmVhbVJlZi9SdW5SZWYgd2l0aG91dCBleHBvc2luZ1xuICogdGhlaXIgaW50ZXJuYWxzIGFzIG9iamVjdCBmaWVsZHMuXG4gKi9cbmZ1bmN0aW9uIG1ha2VPcGFxdWVSZWYocmVmOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHVua25vd24ge1xuICBjb25zdCBvcGFxdWUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWYpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wYXF1ZSwga2V5LCB7IHZhbHVlLCBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcbiAgfVxuICByZXR1cm4gb3BhcXVlO1xufVxuXG5mdW5jdGlvbiBtYWtlQnl0ZXNEaXNwbGF5KGRpc3BsYXk6IEZvcm1hdHRlZFN0cmVhbUNodW5rRGlzcGxheSk6IHVua25vd24ge1xuICBjb25zdCBvcGFxdWUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3BhcXVlLCAnX190eXBlJywge1xuICAgIHZhbHVlOiBCWVRFU19ESVNQTEFZX1RZUEUsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3BhcXVlLCAndGV4dCcsIHtcbiAgICB2YWx1ZTogZGlzcGxheS50ZXh0LFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICB9KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wYXF1ZSwgJ2RlY29kZWRGcm9tJywge1xuICAgIHZhbHVlOiBkaXNwbGF5LmRlY29kZWRGcm9tLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIG9wYXF1ZTtcbn1cblxuLyoqXG4gKiBSZWN1cnNpdmVseSB3YWxrIGRhdGEgYW5kIHJlcGxhY2UgUnVuUmVmL1N0cmVhbVJlZi90eXBlZCBhcnJheSBvYmplY3RzIHdpdGhcbiAqIG5vbi1leHBhbmRhYmxlIHZlcnNpb25zIHNvIHRoZSByZW5kZXJlciBkb2Vzbid0IHNob3cgdGhlaXIgaW50ZXJuYWxzLlxuICogT25seSByZWN1cnNlcyBpbnRvIHBsYWluIG9iamVjdHMgYW5kIGFycmF5cyB0byBhdm9pZCBzdHJpcHBpbmcgY2xhc3NcbiAqIGluc3RhbmNlcyAoRGF0ZSwgRXJyb3IsIFVSTCwgSGVhZGVycywgZXRjLikgdGhhdCBoYXZlIHRoZWlyIG93biByZW5kZXJpbmcuXG4gKiBNYXAgYW5kIFNldCBjb250YWluZXJzIGFyZSBwcmVzZXJ2ZWQgd2hpbGUgdGhlaXIgY29udGVudHMgYXJlIHByZXBhcmVkIGZvclxuICogZGlzcGxheS5cbiAqXG4gKiBFeHBvcnRlZCBmb3IgdGVzdGluZyB0aGUgdHlwZWQtYXJyYXkgZGV0ZWN0aW9uIHBhdGggdXNlZCBieSBoeWRyYXRlZFxuICogQUkgYWdlbnQgc3RyZWFtIGNodW5rcyAoZS5nLiBgeyBkZWx0YTogbmV3IFVpbnQ4QXJyYXkoLi4uKSB9YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsYXBzZVJlZnMoZGF0YTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBkYXRhO1xuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpICYmICEoZGF0YSBpbnN0YW5jZW9mIERhdGFWaWV3KSkge1xuICAgIHJldHVybiBtYWtlQnl0ZXNEaXNwbGF5KGZvcm1hdEFycmF5QnVmZmVyVmlld0ZvckRpc3BsYXkoZGF0YSkpO1xuICB9XG4gIGlmIChpc1J1blJlZihkYXRhKSB8fCBpc1N0cmVhbVJlZihkYXRhKSlcbiAgICByZXR1cm4gbWFrZU9wYXF1ZVJlZihkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIGRhdGEubWFwKGNvbGxhcHNlUmVmcyk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICBBcnJheS5mcm9tKGRhdGEuZW50cmllcygpLCAoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgIGNvbGxhcHNlUmVmcyhrZXkpLFxuICAgICAgICBjb2xsYXBzZVJlZnModmFsdWUpLFxuICAgICAgXSlcbiAgICApO1xuICB9XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuZnJvbShkYXRhLnZhbHVlcygpLCBjb2xsYXBzZVJlZnMpKTtcbiAgfVxuICAvLyBPbmx5IHJlY3Vyc2UgaW50byBwbGFpbiBvYmplY3RzIOKAlCBsZWF2ZSBjbGFzcyBpbnN0YW5jZXMgdW50b3VjaGVkXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGRhdGEpO1xuICBpZiAocHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUgJiYgcHJvdG8gIT09IG51bGwpIHJldHVybiBkYXRhO1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgcmVzdWx0W2tleV0gPSBjb2xsYXBzZVJlZnModmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljIGNvbXBvbmVudFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUluc3BlY3RvclByb3BzIHtcbiAgLyoqIFRoZSBkYXRhIHRvIGluc3BlY3QgKi9cbiAgZGF0YTogdW5rbm93bjtcbiAgLyoqIExldmVscyBzdHJpY3RseSBiZWxvdyB0aGlzIG51bWJlciBhdXRvLWV4cGFuZCAoZGVmYXVsdDogMikgKi9cbiAgZXhwYW5kTGV2ZWw/OiBudW1iZXI7XG4gIC8qKiBPcHRpb25hbCBuYW1lIGZvciB0aGUgcm9vdCBub2RlICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBDYWxsYmFjayB3aGVuIGEgc3RyZWFtIHJlZmVyZW5jZSBpcyBjbGlja2VkICovXG4gIG9uU3RyZWFtQ2xpY2s/OiAoc3RyZWFtSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHdoZW4gYSBydW4gcmVmZXJlbmNlIGlzIGNsaWNrZWQgKi9cbiAgb25SdW5DbGljaz86IChydW5JZDogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogQ2FsbGJhY2sgd2hlbiBhbiBlbmNyeXB0ZWQgbWFya2VyIGlzIGNsaWNrZWQgKHRyaWdnZXJzIGRlY3J5cHRpb24pICovXG4gIG9uRGVjcnlwdD86ICgpID0+IHZvaWQ7XG4gIC8qKiBXaGV0aGVyIGRlY3J5cHRpb24gaXMgY3VycmVudGx5IGluIHByb2dyZXNzICovXG4gIGlzRGVjcnlwdGluZz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEYXRhSW5zcGVjdG9yKHtcbiAgZGF0YSxcbiAgZXhwYW5kTGV2ZWwgPSAyLFxuICBuYW1lLFxuICBvblN0cmVhbUNsaWNrLFxuICBvblJ1bkNsaWNrLFxuICBvbkRlY3J5cHQsXG4gIGlzRGVjcnlwdGluZyA9IGZhbHNlLFxufTogRGF0YUluc3BlY3RvclByb3BzKSB7XG4gIGNvbnN0IGNvbGxhcHNlZERhdGEgPSB1c2VNZW1vKCgpID0+IGNvbGxhcHNlUmVmcyhkYXRhKSwgW2RhdGFdKTtcbiAgY29uc3Qgc3RhYmxlRGF0YSA9IHVzZVN0YWJsZUluc3BlY3RvckRhdGEoY29sbGFwc2VkRGF0YSk7XG5cbiAgbGV0IGNvbnRlbnQ6IFJlYWN0Tm9kZSA9IChcbiAgICA8PlxuICAgICAgey8qIFJlYWN0IDE5IGhvaXN0cyAmIGRlZHVwZXMgdGhpcyA8c3R5bGU+IGJ5IGhyZWYsIHNvIGl0IGlzIGVtaXR0ZWQgb25jZVxuICAgICAgICAgIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgaW5zcGVjdG9ycyBhcmUgbW91bnRlZC4gKi99XG4gICAgICA8c3R5bGUgaHJlZj1cIndmLWpzb24tdmlld1wiIHByZWNlZGVuY2U9XCJkZWZhdWx0XCI+XG4gICAgICAgIHtKU09OX1ZJRVdfU1RZTEVTfVxuICAgICAgPC9zdHlsZT5cbiAgICAgIDxKc29uVHJlZSBkYXRhPXtzdGFibGVEYXRhfSBuYW1lPXtuYW1lfSBleHBhbmRMZXZlbD17ZXhwYW5kTGV2ZWx9IC8+XG4gICAgPC8+XG4gICk7XG5cbiAgaWYgKG9uU3RyZWFtQ2xpY2spIHtcbiAgICBjb250ZW50ID0gKFxuICAgICAgPFN0cmVhbUNsaWNrQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17b25TdHJlYW1DbGlja30+XG4gICAgICAgIHtjb250ZW50fVxuICAgICAgPC9TdHJlYW1DbGlja0NvbnRleHQuUHJvdmlkZXI+XG4gICAgKTtcbiAgfVxuICBpZiAob25SdW5DbGljaykge1xuICAgIGNvbnRlbnQgPSAoXG4gICAgICA8UnVuQ2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtvblJ1bkNsaWNrfT5cbiAgICAgICAge2NvbnRlbnR9XG4gICAgICA8L1J1bkNsaWNrQ29udGV4dC5Qcm92aWRlcj5cbiAgICApO1xuICB9XG4gIGlmIChvbkRlY3J5cHQpIHtcbiAgICBjb250ZW50ID0gKFxuICAgICAgPERlY3J5cHRDbGlja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3sgb25EZWNyeXB0LCBpc0RlY3J5cHRpbmcgfX0+XG4gICAgICAgIHtjb250ZW50fVxuICAgICAgPC9EZWNyeXB0Q2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29udGVudDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZW5kZXIgc3RhYmlsaXphdGlvbiAoYXZvaWQgcmUtcmVuZGVycyB3aGVuIGRhdGEgaXMgZGVlcGx5IGVxdWFsKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHVzZVN0YWJsZUluc3BlY3RvckRhdGE8VD4obmV4dDogVCk6IFQge1xuICBjb25zdCBwcmV2aW91c1JlZiA9IHVzZVJlZjxUPihuZXh0KTtcbiAgaWYgKCFpc0RlZXBFcXVhbChwcmV2aW91c1JlZi5jdXJyZW50LCBuZXh0KSkge1xuICAgIHByZXZpb3VzUmVmLmN1cnJlbnQgPSBuZXh0O1xuICB9XG4gIHJldHVybiBwcmV2aW91c1JlZi5jdXJyZW50O1xufVxuXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVCeXRlc0Rpc3BsYXkoYTogQnl0ZXNEaXNwbGF5LCBiOiBCeXRlc0Rpc3BsYXkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBhLnRleHQgPT09IGIudGV4dCAmJlxuICAgIGEuZGVjb2RlZEZyb20/LnR5cGUgPT09IGIuZGVjb2RlZEZyb20/LnR5cGUgJiZcbiAgICBhLmRlY29kZWRGcm9tPy5lbmNvZGluZyA9PT0gYi5kZWNvZGVkRnJvbT8uZW5jb2RpbmcgJiZcbiAgICBhLmRlY29kZWRGcm9tPy5yYXdTdW1tYXJ5ID09PSBiLmRlY29kZWRGcm9tPy5yYXdTdW1tYXJ5XG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRGVlcEVxdWFsKGE6IHVua25vd24sIGI6IHVua25vd24sIHNlZW4gPSBuZXcgV2Vha01hcCgpKTogYm9vbGVhbiB7XG4gIGlmIChPYmplY3QuaXMoYSwgYikpIHJldHVybiB0cnVlO1xuXG4gIGlmIChpc0J5dGVzRGlzcGxheShhKSB8fCBpc0J5dGVzRGlzcGxheShiKSkge1xuICAgIHJldHVybiBpc0J5dGVzRGlzcGxheShhKSAmJiBpc0J5dGVzRGlzcGxheShiKSAmJiBpc1NhbWVCeXRlc0Rpc3BsYXkoYSwgYik7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHAgJiYgYiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwICYmIGIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhLmVudHJpZXMoKSkge1xuICAgICAgaWYgKCFiLmhhcyhrZXkpIHx8ICFpc0RlZXBFcXVhbCh2YWx1ZSwgYi5nZXQoa2V5KSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIFNldCAmJiBiIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhLnZhbHVlcygpKSB7XG4gICAgICBpZiAoIWIuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaXNPYmplY3RMaWtlKGEpIHx8ICFpc09iamVjdExpa2UoYikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc2Vlbi5nZXQoYSkgPT09IGIpIHJldHVybiB0cnVlO1xuICBzZWVuLnNldChhLCBiKTtcblxuICBjb25zdCBhSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYSk7XG4gIGNvbnN0IGJJc0FycmF5ID0gQXJyYXkuaXNBcnJheShiKTtcbiAgaWYgKGFJc0FycmF5ICE9PSBiSXNBcnJheSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChhSXNBcnJheSAmJiBiSXNBcnJheSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICghaXNEZWVwRXF1YWwoYVtpXSwgYltpXSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBhS2V5cykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFpc0RlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIl19