@ethlete/core 4.18.4 → 4.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/esm2022/lib/components/structured-data/structured-data.component.mjs +3 -3
- package/esm2022/lib/directives/animatable/animatable.directive.mjs +3 -3
- package/esm2022/lib/directives/animated-if/animated-if.directive.mjs +3 -3
- package/esm2022/lib/directives/animated-lifecycle/animated-lifecycle.directive.mjs +3 -3
- package/esm2022/lib/directives/animated-overlay/animated-overlay.directive.mjs +3 -3
- package/esm2022/lib/directives/click-outside/click-outside.directive.mjs +3 -3
- package/esm2022/lib/directives/cursor-drag-scroll/cursor-drag-scroll.directive.mjs +3 -3
- package/esm2022/lib/directives/debug/debug.directive.mjs +3 -3
- package/esm2022/lib/directives/delayable/delayable.directive.mjs +3 -3
- package/esm2022/lib/directives/is-active-element/is-active-element.directive.mjs +3 -3
- package/esm2022/lib/directives/is-element/is-element.directive.mjs +3 -3
- package/esm2022/lib/directives/let/let.directive.mjs +3 -3
- package/esm2022/lib/directives/observe-content/observe-content.directive.mjs +3 -3
- package/esm2022/lib/directives/observe-resize/observe-resize.directive.mjs +3 -3
- package/esm2022/lib/directives/observe-scroll-state/observe-scroll-state.directive.mjs +3 -3
- package/esm2022/lib/directives/observe-visibility/observe-visibility.directive.mjs +3 -3
- package/esm2022/lib/directives/repeat/repeat.directive.mjs +3 -3
- package/esm2022/lib/directives/root-boundary/root-boundary.directive.mjs +3 -3
- package/esm2022/lib/directives/scroll-observer-first-element/scroll-observer-first-element.directive.mjs +3 -3
- package/esm2022/lib/directives/scroll-observer-ignore-target/scroll-observer-ignore-target.directive.mjs +3 -3
- package/esm2022/lib/directives/scroll-observer-last-element/scroll-observer-last-element.directive.mjs +3 -3
- package/esm2022/lib/directives/seo/seo.directive.mjs +3 -3
- package/esm2022/lib/pipes/infer-mime-type/infer-mime-type.pipe.mjs +3 -3
- package/esm2022/lib/pipes/normalize-game-result-type/normalize-game-result-type.pipe.mjs +3 -3
- package/esm2022/lib/pipes/normalize-match-participants/normalize-match-participants.pipe.mjs +3 -3
- package/esm2022/lib/pipes/normalize-match-score/normalize-match-score.pipe.mjs +3 -3
- package/esm2022/lib/pipes/normalize-match-state/normalize-match-state.pipe.mjs +3 -3
- package/esm2022/lib/pipes/normalize-match-type/normalize-match-type.pipe.mjs +3 -3
- package/esm2022/lib/pipes/to-array/to-array.pipe.mjs +3 -3
- package/esm2022/lib/props/props.directive.mjs +3 -3
- package/esm2022/lib/services/click-observer.service.mjs +6 -6
- package/esm2022/lib/services/content-observer.service.mjs +6 -6
- package/esm2022/lib/services/focus-visible.service.mjs +3 -3
- package/esm2022/lib/services/intersection-observer.service.mjs +6 -6
- package/esm2022/lib/services/resize-observer.service.mjs +6 -6
- package/esm2022/lib/services/router-state.service.mjs +3 -3
- package/esm2022/lib/services/viewport.service.mjs +3 -3
- package/esm2022/lib/utils/signal.utils.mjs +82 -55
- package/fesm2022/ethlete-core.mjs +205 -178
- package/fesm2022/ethlete-core.mjs.map +1 -1
- package/lib/utils/signal.utils.d.ts +38 -21
- package/package.json +7 -7
|
@@ -114,11 +114,12 @@ export const buildSignalEffects = (el, config) => {
|
|
|
114
114
|
runInInjectionContext(injector, () => {
|
|
115
115
|
effects[tokens] = effect(() => {
|
|
116
116
|
const { currentElements } = untracked(() => elements());
|
|
117
|
+
const value = signal();
|
|
117
118
|
for (const el of currentElements) {
|
|
118
119
|
const tokenArray = tokens.split(' ');
|
|
119
120
|
if (!tokenArray.length)
|
|
120
121
|
continue;
|
|
121
|
-
config.updateFn(el, tokenArray,
|
|
122
|
+
config.updateFn(el, tokenArray, value);
|
|
122
123
|
}
|
|
123
124
|
});
|
|
124
125
|
});
|
|
@@ -213,57 +214,70 @@ export const signalStyles = (el, styleMap) => {
|
|
|
213
214
|
});
|
|
214
215
|
};
|
|
215
216
|
export const signalHostStyles = (styleMap) => signalStyles(inject(ElementRef), styleMap);
|
|
217
|
+
export const boundingClientRectToElementRect = (rect) => ({
|
|
218
|
+
bottom: rect.bottom,
|
|
219
|
+
height: rect.height,
|
|
220
|
+
left: rect.left,
|
|
221
|
+
right: rect.right,
|
|
222
|
+
top: rect.top,
|
|
223
|
+
width: rect.width,
|
|
224
|
+
x: rect.x,
|
|
225
|
+
y: rect.y,
|
|
226
|
+
});
|
|
227
|
+
export const createElementDimensions = (el, rect) => {
|
|
228
|
+
if (!el) {
|
|
229
|
+
return {
|
|
230
|
+
rect: null,
|
|
231
|
+
client: null,
|
|
232
|
+
scroll: null,
|
|
233
|
+
offset: null,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
rect: rect ? boundingClientRectToElementRect(rect) : boundingClientRectToElementRect(el.getBoundingClientRect()),
|
|
238
|
+
client: { width: el.clientWidth, height: el.clientHeight },
|
|
239
|
+
scroll: { width: el.scrollWidth, height: el.scrollHeight },
|
|
240
|
+
offset: { width: el.offsetWidth, height: el.offsetHeight },
|
|
241
|
+
};
|
|
242
|
+
};
|
|
216
243
|
export const signalElementDimensions = (el) => {
|
|
217
244
|
const destroyRef = inject(DestroyRef);
|
|
218
245
|
const elements = buildElementSignal(el);
|
|
219
246
|
const zone = inject(NgZone);
|
|
220
247
|
const isRendered = signalIsRendered();
|
|
221
|
-
const initialValue = () => (
|
|
222
|
-
rect: elements().currentElement?.getBoundingClientRect() ?? null,
|
|
223
|
-
borderBoxSize: null,
|
|
224
|
-
contentBoxSize: null,
|
|
225
|
-
devicePixelContentBoxSize: null,
|
|
226
|
-
});
|
|
248
|
+
const initialValue = () => createElementDimensions(elements().currentElement);
|
|
227
249
|
const elementDimensionsSignal = signal(initialValue());
|
|
228
250
|
const observer = new ResizeObserver((e) => {
|
|
229
251
|
if (!isRendered())
|
|
230
252
|
return;
|
|
231
253
|
const entry = e[0];
|
|
232
254
|
if (entry) {
|
|
233
|
-
const
|
|
234
|
-
const
|
|
235
|
-
|
|
236
|
-
zone.run(() => elementDimensionsSignal.set({
|
|
237
|
-
rect: entry.contentRect,
|
|
238
|
-
borderBoxSize: borderBoxSize
|
|
239
|
-
? { inlineSize: borderBoxSize.inlineSize, blockSize: borderBoxSize.blockSize }
|
|
240
|
-
: null,
|
|
241
|
-
contentBoxSize: contentBoxSize
|
|
242
|
-
? { inlineSize: contentBoxSize.inlineSize, blockSize: contentBoxSize.blockSize }
|
|
243
|
-
: null,
|
|
244
|
-
devicePixelContentBoxSize: devicePixelContentBoxSize
|
|
245
|
-
? { inlineSize: devicePixelContentBoxSize.inlineSize, blockSize: devicePixelContentBoxSize.blockSize }
|
|
246
|
-
: null,
|
|
247
|
-
}));
|
|
255
|
+
const target = entry.target;
|
|
256
|
+
const newDimensions = createElementDimensions(target);
|
|
257
|
+
zone.run(() => elementDimensionsSignal.set(newDimensions));
|
|
248
258
|
}
|
|
249
259
|
});
|
|
250
260
|
effect(() => {
|
|
251
261
|
const els = elements();
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
if (els.currentElement) {
|
|
257
|
-
const computedDisplay = getComputedStyle(els.currentElement).display;
|
|
258
|
-
const currentElIsAngularComponent = els.currentElement?.tagName.toLowerCase().includes('-');
|
|
259
|
-
if (computedDisplay === 'inline' && isDevMode() && currentElIsAngularComponent) {
|
|
260
|
-
console.error(`Element <${els.currentElement?.tagName.toLowerCase()}> is an Angular component and has a display of 'inline'. Inline elements cannot be observed for dimensions. Please change it to 'block' or something else.`);
|
|
262
|
+
untracked(() => {
|
|
263
|
+
elementDimensionsSignal.set(initialValue());
|
|
264
|
+
if (els.previousElement) {
|
|
265
|
+
observer.disconnect();
|
|
261
266
|
}
|
|
262
|
-
|
|
263
|
-
|
|
267
|
+
if (els.currentElement) {
|
|
268
|
+
const computedDisplay = getComputedStyle(els.currentElement).display;
|
|
269
|
+
const currentElIsAngularComponent = els.currentElement?.tagName.toLowerCase().includes('-');
|
|
270
|
+
if (computedDisplay === 'inline' && isDevMode() && currentElIsAngularComponent) {
|
|
271
|
+
console.error(`Element <${els.currentElement?.tagName.toLowerCase()}> is an Angular component and has a display of 'inline'. Inline elements cannot be observed for dimensions. Please change it to 'block' or something else.`);
|
|
272
|
+
}
|
|
273
|
+
observer.observe(els.currentElement);
|
|
274
|
+
}
|
|
275
|
+
});
|
|
264
276
|
}, { allowSignalWrites: true });
|
|
265
277
|
destroyRef.onDestroy(() => observer.disconnect());
|
|
266
|
-
return elementDimensionsSignal
|
|
278
|
+
return computed(() => elementDimensionsSignal(), {
|
|
279
|
+
equal: (a, b) => equal(a, b),
|
|
280
|
+
});
|
|
267
281
|
};
|
|
268
282
|
export const signalHostElementDimensions = () => signalElementDimensions(inject(ElementRef));
|
|
269
283
|
export const signalElementMutations = (el, options) => {
|
|
@@ -294,8 +308,15 @@ export const signalElementMutations = (el, options) => {
|
|
|
294
308
|
return elementMutationsSignal.asReadonly();
|
|
295
309
|
};
|
|
296
310
|
export const signalHostElementMutations = (options) => signalElementMutations(inject(ElementRef), options);
|
|
311
|
+
export const areScrollStatesEqual = (a, b) => {
|
|
312
|
+
return (a.canScroll === b.canScroll &&
|
|
313
|
+
a.canScrollHorizontally === b.canScrollHorizontally &&
|
|
314
|
+
a.canScrollVertically === b.canScrollVertically &&
|
|
315
|
+
equal(a.elementDimensions, b.elementDimensions));
|
|
316
|
+
};
|
|
297
317
|
export const signalElementScrollState = (el, options) => {
|
|
298
318
|
const elements = buildElementSignal(el);
|
|
319
|
+
const observedEl = firstElementSignal(elements);
|
|
299
320
|
const elementDimensions = signalElementDimensions(elements);
|
|
300
321
|
const elementMutations = signalElementMutations(elements, { childList: true, subtree: true, attributes: true });
|
|
301
322
|
const isRendered = signalIsRendered();
|
|
@@ -305,7 +326,7 @@ export const signalElementScrollState = (el, options) => {
|
|
|
305
326
|
if (!isRendered())
|
|
306
327
|
return;
|
|
307
328
|
const scrollPosition = initialScrollPosition();
|
|
308
|
-
const element =
|
|
329
|
+
const element = observedEl().currentElement;
|
|
309
330
|
if (scrollPosition && element) {
|
|
310
331
|
if (scrollPosition.left !== undefined)
|
|
311
332
|
element.scrollLeft = scrollPosition.left;
|
|
@@ -315,35 +336,30 @@ export const signalElementScrollState = (el, options) => {
|
|
|
315
336
|
}
|
|
316
337
|
});
|
|
317
338
|
}
|
|
339
|
+
const notScrollable = (dimensions) => ({
|
|
340
|
+
canScroll: false,
|
|
341
|
+
canScrollHorizontally: false,
|
|
342
|
+
canScrollVertically: false,
|
|
343
|
+
elementDimensions: dimensions,
|
|
344
|
+
});
|
|
318
345
|
return computed(() => {
|
|
319
|
-
const element =
|
|
346
|
+
const element = observedEl().currentElement;
|
|
320
347
|
const dimensions = elementDimensions();
|
|
321
|
-
const notScrollable = () => ({
|
|
322
|
-
canScroll: false,
|
|
323
|
-
canScrollHorizontally: false,
|
|
324
|
-
canScrollVertically: false,
|
|
325
|
-
scrollWidth: element?.scrollWidth ?? null,
|
|
326
|
-
scrollHeight: element?.scrollHeight ?? null,
|
|
327
|
-
elementDimensions: dimensions,
|
|
328
|
-
});
|
|
329
348
|
// We are not interested what the mutation is, just that there is one.
|
|
330
349
|
// Changes to the DOM can affect the scroll state of the element.
|
|
331
350
|
elementMutations();
|
|
332
|
-
if (!element || !
|
|
333
|
-
return notScrollable();
|
|
334
|
-
const { scrollWidth, scrollHeight } = element;
|
|
335
|
-
const
|
|
336
|
-
const
|
|
337
|
-
const canScrollVertically = scrollHeight > height;
|
|
351
|
+
if (!element || !isRendered())
|
|
352
|
+
return notScrollable(dimensions);
|
|
353
|
+
const { scrollWidth, scrollHeight, clientHeight, clientWidth } = element;
|
|
354
|
+
const canScrollHorizontally = scrollWidth > clientWidth;
|
|
355
|
+
const canScrollVertically = scrollHeight > clientHeight;
|
|
338
356
|
return {
|
|
339
357
|
canScroll: canScrollHorizontally || canScrollVertically,
|
|
340
358
|
canScrollHorizontally,
|
|
341
359
|
canScrollVertically,
|
|
342
|
-
scrollWidth,
|
|
343
|
-
scrollHeight,
|
|
344
360
|
elementDimensions: dimensions,
|
|
345
361
|
};
|
|
346
|
-
});
|
|
362
|
+
}, { equal: (a, b) => areScrollStatesEqual(a, b) });
|
|
347
363
|
};
|
|
348
364
|
export const signalHostElementScrollState = () => signalElementScrollState(inject(ElementRef));
|
|
349
365
|
export const signalElementIntersection = (el, options) => {
|
|
@@ -490,7 +506,7 @@ export const signalElementChildren = (el) => {
|
|
|
490
506
|
}
|
|
491
507
|
}
|
|
492
508
|
return children;
|
|
493
|
-
});
|
|
509
|
+
}, { equal: (a, b) => a.length === b.length && a.every((v, i) => v === b[i]) });
|
|
494
510
|
};
|
|
495
511
|
export const previousSignalValue = (signal) => {
|
|
496
512
|
const obs = toObservable(signal).pipe(pairwise(), map(([prev]) => prev));
|
|
@@ -804,6 +820,17 @@ export const computedTillFalsy = (source) => {
|
|
|
804
820
|
}, { allowSignalWrites: true });
|
|
805
821
|
return value.asReadonly();
|
|
806
822
|
};
|
|
823
|
+
/**
|
|
824
|
+
* A writeable signal that will be set to the provided value once all inputs are set.
|
|
825
|
+
* During that time, the signal will be set to `null`.
|
|
826
|
+
*/
|
|
827
|
+
export const deferredSignal = (valueFn) => {
|
|
828
|
+
const valueSignal = signal(null);
|
|
829
|
+
afterNextRender(() => {
|
|
830
|
+
valueSignal.set(valueFn());
|
|
831
|
+
});
|
|
832
|
+
return valueSignal;
|
|
833
|
+
};
|
|
807
834
|
/** Inject a signal containing a boolean value indicating if the viewport is xs */
|
|
808
835
|
export const injectIsXs = () => {
|
|
809
836
|
return toSignal(inject(ViewportService).isXs$, { requireSync: true });
|
|
@@ -847,4 +874,4 @@ export const injectCurrentBreakpoint = () => {
|
|
|
847
874
|
initialValue: inject(ViewportService).currentViewport,
|
|
848
875
|
});
|
|
849
876
|
};
|
|
850
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvdXRpbHMvc2lnbmFsLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNMLFVBQVUsRUFFVixVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULG1CQUFtQixFQUduQixlQUFlLEVBQ2YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFFBQVEsRUFDUixxQkFBcUIsRUFDckIsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXhGLE9BQU8sRUFDTCxVQUFVLEVBQ1YsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sU0FBUyxFQUNULEdBQUcsRUFDSCxLQUFLLEVBQ0wsRUFBRSxFQUNGLFFBQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQThCdEQsU0FBUyxlQUFlLENBQUMsRUFBVztJQUNsQyxJQUFJLFFBQVEsQ0FBQyxF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QyxPQUFPLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEgsQ0FBQyxDQUFDO0FBRUYseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsRUFBRTtJQUMxQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsZ0JBQWdCLEVBQUU7UUFDeEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxlQUFlO0tBQ3RELENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZUVsZW1lbnQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgRGVzdHJveVJlZixcbiAgRWZmZWN0UmVmLFxuICBFbGVtZW50UmVmLFxuICBJbmplY3RvcixcbiAgTmdab25lLFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgUmVuZGVyZXJTdHlsZUZsYWdzMixcbiAgU2lnbmFsLFxuICBXcml0YWJsZVNpZ25hbCxcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlzRGV2TW9kZSxcbiAgaXNTaWduYWwsXG4gIHJ1bkluSW5qZWN0aW9uQ29udGV4dCxcbiAgc2lnbmFsLFxuICB1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSxcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmcm9tRXZlbnQsXG4gIG1hcCxcbiAgbWVyZ2UsXG4gIG9mLFxuICBwYWlyd2lzZSxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJvdXRlclN0YXRlU2VydmljZSwgVmlld3BvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgQnJlYWtwb2ludCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5leHRGcmFtZSB9IGZyb20gJy4vYW5pbWF0aW9uLnV0aWxzJztcbmltcG9ydCB7IGVxdWFsIH0gZnJvbSAnLi9lcXVhbC51dGlsJztcbmltcG9ydCB7IGlzRWxlbWVudFZpc2libGUgfSBmcm9tICcuL3Njcm9sbGFibGUudXRpbHMnO1xuXG50eXBlIFNpZ25hbEVsZW1lbnRCaW5kaW5nQ29tcGxleFR5cGUgPVxuICB8IEhUTUxFbGVtZW50XG4gIHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgfCBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudD5cbiAgfCBBcnJheTxFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IEhUTUxFbGVtZW50PlxuICB8IG51bGxcbiAgfCB1bmRlZmluZWQ7XG5cbnR5cGUgU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlID1cbiAgfCBIVE1MRWxlbWVudFxuICB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gIHwgT2JzZXJ2YWJsZTxTaWduYWxFbGVtZW50QmluZGluZ0NvbXBsZXhUeXBlPlxuICB8IFNpZ25hbDxTaWduYWxFbGVtZW50QmluZGluZ0NvbXBsZXhUeXBlPlxuICB8IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IEhUTUxFbGVtZW50PlxuICB8IEVsZW1lbnRTaWduYWw7XG5cbnR5cGUgRWxlbWVudFNpZ25hbCA9IFNpZ25hbDx7XG4gIC8qKiBAZGVwcmVjYXRlZCBBbHdheXMgdXNlIGN1cnJlbnRFbGVtZW50cyAgKi9cbiAgY3VycmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAvKiogQGRlcHJlY2F0ZWQgQWx3YXlzIHVzZSBwcmV2aW91c0VsZW1lbnRzICAqL1xuICBwcmV2aW91c0VsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgY3VycmVudEVsZW1lbnRzOiBIVE1MRWxlbWVudFtdO1xuICBwcmV2aW91c0VsZW1lbnRzOiBIVE1MRWxlbWVudFtdO1xufT47XG5cbnR5cGUgRWxlbWVudFNpZ25hbFZhbHVlID0gUmV0dXJuVHlwZTxFbGVtZW50U2lnbmFsPjtcblxuZnVuY3Rpb24gaXNFbGVtZW50U2lnbmFsKGVsOiB1bmtub3duKTogZWwgaXMgRWxlbWVudFNpZ25hbCB7XG4gIGlmIChpc1NpZ25hbChlbCkpIHtcbiAgICBjb25zdCB2YWwgPSBlbCgpO1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgJ2N1cnJlbnRFbGVtZW50JyBpbiB2YWwgJiYgJ3ByZXZpb3VzRWxlbWVudCcgaW4gdmFsO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5jb25zdCBkb2N1bWVudEVsZW1lbnRTaWduYWwgPSAoKTogRWxlbWVudFNpZ25hbCA9PlxuICBzaWduYWwoe1xuICAgIGN1cnJlbnRFbGVtZW50OiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgcHJldmlvdXNFbGVtZW50OiBudWxsLFxuICAgIGN1cnJlbnRFbGVtZW50czogW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0sXG4gICAgcHJldmlvdXNFbGVtZW50czogW10sXG4gIH0pO1xuXG5jb25zdCBidWlsZEVsZW1lbnRTaWduYWwgPSAoZWw6IFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZSB8IG51bGwgfCB1bmRlZmluZWQpOiBFbGVtZW50U2lnbmFsID0+IHtcbiAgaWYgKGVsID09PSBudWxsIHx8IGVsID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc2lnbmFsKHsgY3VycmVudEVsZW1lbnQ6IG51bGwsIHByZXZpb3VzRWxlbWVudDogbnVsbCwgY3VycmVudEVsZW1lbnRzOiBbXSwgcHJldmlvdXNFbGVtZW50czogW10gfSk7XG4gIH1cblxuICBpZiAoaXNFbGVtZW50U2lnbmFsKGVsKSkge1xuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIGxldCBtRWxTaWduYWw6IFNpZ25hbDxIVE1MRWxlbWVudFtdIHwgbnVsbD4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBzd2l0Y2hFbGVtZW50ID0gKCkgPT5cbiAgICBzd2l0Y2hNYXAoKGVsT3JSZWY6IFNpZ25hbEVsZW1lbnRCaW5kaW5nQ29tcGxleFR5cGUpID0+IHtcbiAgICAgIGlmIChlbE9yUmVmIGluc3RhbmNlb2YgUXVlcnlMaXN0KSB7XG4gICAgICAgIHJldHVybiBlbE9yUmVmLmNoYW5nZXMucGlwZShcbiAgICAgICAgICBzdGFydFdpdGgoZWxPclJlZiksXG4gICAgICAgICAgbWFwKCgpID0+IGVsT3JSZWYudG9BcnJheSgpLm1hcCgocikgPT4gY29lcmNlRWxlbWVudChyKSkpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVsT3JSZWYpKSB7XG4gICAgICAgIHJldHVybiBvZihlbE9yUmVmLm1hcCgocikgPT4gY29lcmNlRWxlbWVudChyKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29lcmNlZEVsID0gY29lcmNlRWxlbWVudChlbE9yUmVmKTtcbiAgICAgICAgcmV0dXJuIG9mKGNvZXJjZWRFbCA/IFtjb2VyY2VkRWxdIDogbnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgaWYgKGVsIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgIG1FbFNpZ25hbCA9IHRvU2lnbmFsKGVsLnBpcGUoc3dpdGNoRWxlbWVudCgpKSwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIH0gZWxzZSBpZiAoaXNTaWduYWwoZWwpKSB7XG4gICAgbUVsU2lnbmFsID0gdG9TaWduYWwodG9PYnNlcnZhYmxlKGVsKS5waXBlKHN3aXRjaEVsZW1lbnQoKSksIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICB9IGVsc2UgaWYgKGVsIGluc3RhbmNlb2YgUXVlcnlMaXN0KSB7XG4gICAgbUVsU2lnbmFsID0gdG9TaWduYWwoXG4gICAgICBlbC5jaGFuZ2VzLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChlbCksXG4gICAgICAgIG1hcCgoKSA9PiBlbC50b0FycmF5KCkubWFwKChyKSA9PiBjb2VyY2VFbGVtZW50KHIpKSksXG4gICAgICApLFxuICAgICAgeyBpbml0aWFsVmFsdWU6IG51bGwgfSxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIG1FbFNpZ25hbCA9IHNpZ25hbChbY29lcmNlRWxlbWVudChlbCldKTtcbiAgfVxuXG4gIGNvbnN0IGVsU2lnID0gdG9TaWduYWwoXG4gICAgdG9PYnNlcnZhYmxlKG1FbFNpZ25hbCkucGlwZShcbiAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgIHBhaXJ3aXNlKCksXG4gICAgICBtYXAoKFtwcmV2aW91c0VsZW1lbnRzLCBjdXJyZW50RWxlbWVudHNdKSA9PiAoe1xuICAgICAgICBwcmV2aW91c0VsZW1lbnRzOiBwcmV2aW91c0VsZW1lbnRzID8/IFtdLFxuICAgICAgICBjdXJyZW50RWxlbWVudHM6IGN1cnJlbnRFbGVtZW50cyA/PyBbXSxcbiAgICAgICAgY3VycmVudEVsZW1lbnQ6IGN1cnJlbnRFbGVtZW50cz8uWzBdID8/IG51bGwsXG4gICAgICAgIHByZXZpb3VzRWxlbWVudDogcHJldmlvdXNFbGVtZW50cz8uWzBdID8/IG51bGwsXG4gICAgICB9KSksXG4gICAgKSxcbiAgICB7IGluaXRpYWxWYWx1ZTogeyBjdXJyZW50RWxlbWVudDogbnVsbCwgcHJldmlvdXNFbGVtZW50OiBudWxsLCBwcmV2aW91c0VsZW1lbnRzOiBbXSwgY3VycmVudEVsZW1lbnRzOiBbXSB9IH0sXG4gICk7XG5cbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IGVsU2lnKCksIHtcbiAgICBlcXVhbDogKGEsIGIpID0+XG4gICAgICBhLmN1cnJlbnRFbGVtZW50ID09PSBiLmN1cnJlbnRFbGVtZW50ICYmXG4gICAgICBhLnByZXZpb3VzRWxlbWVudCA9PT0gYi5wcmV2aW91c0VsZW1lbnQgJiZcbiAgICAgIGEuY3VycmVudEVsZW1lbnRzLmxlbmd0aCA9PT0gYi5jdXJyZW50RWxlbWVudHMubGVuZ3RoICYmXG4gICAgICBhLmN1cnJlbnRFbGVtZW50cy5ldmVyeSgodiwgaSkgPT4gdiA9PT0gYi5jdXJyZW50RWxlbWVudHNbaV0pICYmXG4gICAgICBhLnByZXZpb3VzRWxlbWVudHMubGVuZ3RoID09PSBiLnByZXZpb3VzRWxlbWVudHMubGVuZ3RoICYmXG4gICAgICBhLnByZXZpb3VzRWxlbWVudHMuZXZlcnkoKHYsIGkpID0+IHYgPT09IGIucHJldmlvdXNFbGVtZW50c1tpXSksXG4gIH0pO1xufTtcblxuY29uc3QgZmlyc3RFbGVtZW50U2lnbmFsID0gKGVsOiBFbGVtZW50U2lnbmFsKSA9PiB7XG4gIHJldHVybiBjb21wdXRlZChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gZWwoKTtcblxuICAgICAgaWYgKGN1cnJlbnQuY3VycmVudEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdNb3JlIHRoYW4gb25lIGVsZW1lbnQgaXMgYm91bmQgdG8gdGhlIHNpZ25hbC4gT25seSB0aGUgZmlyc3QgZWxlbWVudCB3aWxsIGJlIHVzZWQuJyxcbiAgICAgICAgICBjdXJyZW50LmN1cnJlbnRFbGVtZW50cyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VyciA9IGN1cnJlbnQuY3VycmVudEVsZW1lbnRzWzBdID8/IG51bGw7XG4gICAgICBjb25zdCBwcmV2ID0gY3VycmVudC5wcmV2aW91c0VsZW1lbnRzWzBdID8/IG51bGw7XG5cbiAgICAgIHJldHVybiB7IGN1cnJlbnRFbGVtZW50OiBjdXJyLCBwcmV2aW91c0VsZW1lbnQ6IHByZXYgfTtcbiAgICB9LFxuICAgIHsgZXF1YWw6IChhLCBiKSA9PiBhLmN1cnJlbnRFbGVtZW50ID09PSBiLmN1cnJlbnRFbGVtZW50ICYmIGEucHJldmlvdXNFbGVtZW50ID09PSBiLnByZXZpb3VzRWxlbWVudCB9LFxuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFNpZ25hbEVmZmVjdHNDb25maWc8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+IHtcbiAgLyoqIFRoZSB0b2tlbnMgdG8gYXBwbHkgYW5kIHRoZWlyIHNpZ25hbCB2YWx1ZSAgKi9cbiAgdG9rZW5NYXA6IFQ7XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGZvciBlbGVtZW50cyB0aGF0IHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBzaWduYWwgZWZmZWN0cyAqL1xuICBjbGVhbnVwRm46IChlbDogSFRNTEVsZW1lbnQsIHRva2Vuczogc3RyaW5nW10pID0+IHZvaWQ7XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGZvciBlbGVtZW50cyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIHNpZ25hbCBlZmZlY3RzIG9yIHdoZW4gdGhlaXIgc2lnbmFsIHZhbHVlIGNoYW5nZXMgKi9cbiAgdXBkYXRlRm46IChlbDogSFRNTEVsZW1lbnQsIHRva2Vuczogc3RyaW5nW10sIGNvbmRpdGlvblJlc3VsdDogdW5rbm93bikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkU2lnbmFsRWZmZWN0cyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oXG4gIGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsXG4gIGNvbmZpZzogQnVpbGRTaWduYWxFZmZlY3RzQ29uZmlnPFQ+LFxuKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gYnVpbGRFbGVtZW50U2lnbmFsKGVsKTtcbiAgY29uc3QgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gIGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgeyBjdXJyZW50RWxlbWVudHMsIHByZXZpb3VzRWxlbWVudHMgfSA9IGVsZW1lbnRzKCk7XG5cbiAgICBmb3IgKGNvbnN0IHByZXZpb3VzRWwgb2YgcHJldmlvdXNFbGVtZW50cykge1xuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50cy5pbmNsdWRlcyhwcmV2aW91c0VsKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHRva2VucyA9IE9iamVjdC5rZXlzKGNvbmZpZy50b2tlbk1hcClcbiAgICAgICAgLm1hcCgoa2V5KSA9PiBrZXkuc3BsaXQoJyAnKSlcbiAgICAgICAgLmZsYXQoKTtcblxuICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoKSBjb250aW51ZTtcblxuICAgICAgY29uZmlnLmNsZWFudXBGbihwcmV2aW91c0VsLCB0b2tlbnMpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY3VycmVudEVsIG9mIGN1cnJlbnRFbGVtZW50cykge1xuICAgICAgaWYgKHByZXZpb3VzRWxlbWVudHMuaW5jbHVkZXMoY3VycmVudEVsKSkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgW3Rva2VucywgY29uZGl0aW9uXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcudG9rZW5NYXApKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdG9rZW5BcnJheSA9IHRva2Vucy5zcGxpdCgnICcpO1xuICAgICAgICAgIGlmICghdG9rZW5BcnJheS5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgIGNvbmZpZy51cGRhdGVGbihjdXJyZW50RWwsIHRva2VuQXJyYXksIGNvbmRpdGlvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBlZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBFZmZlY3RSZWY+ID0ge307XG5cbiAgY29uc3QgaGFzID0gKHRva2Vuczogc3RyaW5nKSA9PiB0b2tlbnMgaW4gZWZmZWN0cztcblxuICBjb25zdCBwdXNoID0gKHRva2Vuczogc3RyaW5nLCBzaWduYWw6IFNpZ25hbDx1bmtub3duPikgPT4ge1xuICAgIGlmIChoYXModG9rZW5zKSkgcmV0dXJuO1xuXG4gICAgcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCAoKSA9PiB7XG4gICAgICBlZmZlY3RzW3Rva2Vuc10gPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGN1cnJlbnRFbGVtZW50cyB9ID0gdW50cmFja2VkKCgpID0+IGVsZW1lbnRzKCkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZWwgb2YgY3VycmVudEVsZW1lbnRzKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW5BcnJheSA9IHRva2Vucy5zcGxpdCgnICcpO1xuICAgICAgICAgIGlmICghdG9rZW5BcnJheS5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uZmlnLnVwZGF0ZUZuKGVsLCB0b2tlbkFycmF5LCBzaWduYWwoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHB1c2hNYW55ID0gKG1hcDogUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+PikgPT4ge1xuICAgIGZvciAoY29uc3QgW3Rva2Vucywgc2lnbmFsXSBvZiBPYmplY3QuZW50cmllcyhtYXApKSB7XG4gICAgICBwdXNoKHRva2Vucywgc2lnbmFsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlID0gKHRva2Vuczogc3RyaW5nKSA9PiB7XG4gICAgZWZmZWN0c1t0b2tlbnNdPy5kZXN0cm95KCk7XG5cbiAgICBkZWxldGUgZWZmZWN0c1t0b2tlbnNdO1xuXG4gICAgZm9yIChjb25zdCBlbCBvZiBlbGVtZW50cygpLmN1cnJlbnRFbGVtZW50cykge1xuICAgICAgY29uc3QgdG9rZW5BcnJheSA9IHRva2Vucy5zcGxpdCgnICcpO1xuICAgICAgaWYgKCF0b2tlbkFycmF5Lmxlbmd0aCkgY29udGludWU7XG5cbiAgICAgIGNvbmZpZy5jbGVhbnVwRm4oZWwsIHRva2VuQXJyYXkpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCByZW1vdmVNYW55ID0gKHRva2Vuczogc3RyaW5nW10pID0+IHtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgcmVtb3ZlKHRva2VuKTtcbiAgICB9XG4gIH07XG5cbiAgcHVzaE1hbnkoY29uZmlnLnRva2VuTWFwKTtcblxuICByZXR1cm4geyByZW1vdmUsIHJlbW92ZU1hbnksIGhhcywgcHVzaCwgcHVzaE1hbnkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxJc1JlbmRlcmVkID0gKCkgPT4ge1xuICBjb25zdCBpc1JlbmRlcmVkID0gc2lnbmFsKGZhbHNlKTtcblxuICBhZnRlck5leHRSZW5kZXIoKCkgPT4gaXNSZW5kZXJlZC5zZXQodHJ1ZSkpO1xuXG4gIHJldHVybiBpc1JlbmRlcmVkLmFzUmVhZG9ubHkoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxDbGFzc2VzID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8dW5rbm93bj4+PihlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlLCBjbGFzc01hcDogVCkgPT4ge1xuICBjb25zdCByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gIHJldHVybiBidWlsZFNpZ25hbEVmZmVjdHMoZWwsIHtcbiAgICB0b2tlbk1hcDogY2xhc3NNYXAsXG4gICAgY2xlYW51cEZuOiAoZWwsIHRva2VucykgPT4gdG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiByZW5kZXJlci5yZW1vdmVDbGFzcyhlbCwgdG9rZW4pKSxcbiAgICB1cGRhdGVGbjogKGVsLCB0b2tlbnMsIGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgdG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiByZW5kZXJlci5yZW1vdmVDbGFzcyhlbCwgdG9rZW4pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRva2Vucy5mb3JFYWNoKCh0b2tlbikgPT4gcmVuZGVyZXIuYWRkQ2xhc3MoZWwsIHRva2VuKSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdENsYXNzZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGNsYXNzTWFwOiBUKSA9PlxuICBzaWduYWxDbGFzc2VzKGluamVjdChFbGVtZW50UmVmKSwgY2xhc3NNYXApO1xuXG5jb25zdCBBTFdBWVNfVFJVRV9BVFRSSUJVVEVfS0VZUyA9IFsnZGlzYWJsZWQnLCAncmVhZG9ubHknLCAncmVxdWlyZWQnLCAnY2hlY2tlZCcsICdzZWxlY3RlZCcsICdoaWRkZW4nLCAnaW5lcnQnXTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEF0dHJpYnV0ZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KFxuICBlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlLFxuICBhdHRyaWJ1dGVNYXA6IFQsXG4pID0+IHtcbiAgY29uc3QgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuICByZXR1cm4gYnVpbGRTaWduYWxFZmZlY3RzKGVsLCB7XG4gICAgdG9rZW5NYXA6IGF0dHJpYnV0ZU1hcCxcbiAgICBjbGVhbnVwRm46IChlbCwgdG9rZW5zKSA9PiB0b2tlbnMuZm9yRWFjaCgodG9rZW4pID0+IGVsLnJlbW92ZUF0dHJpYnV0ZSh0b2tlbikpLFxuICAgIHVwZGF0ZUZuOiAoZWwsIHRva2VucywgY29uZGl0aW9uKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBpZiAoQUxXQVlTX1RSVUVfQVRUUklCVVRFX0tFWVMuaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsLCB0b2tlbiwgJycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUoZWwsIHRva2VuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBudWxsIHx8IGNvbmRpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGVsLCB0b2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsLCB0b2tlbiwgYCR7Y29uZGl0aW9ufWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdEF0dHJpYnV0ZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGF0dHJpYnV0ZU1hcDogVCkgPT5cbiAgc2lnbmFsQXR0cmlidXRlcyhpbmplY3QoRWxlbWVudFJlZiksIGF0dHJpYnV0ZU1hcCk7XG5cbmV4cG9ydCBjb25zdCBzaWduYWxTdHlsZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsIHN0eWxlTWFwOiBUKSA9PiB7XG4gIGNvbnN0IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgcmV0dXJuIGJ1aWxkU2lnbmFsRWZmZWN0cyhlbCwge1xuICAgIHRva2VuTWFwOiBzdHlsZU1hcCxcbiAgICBjbGVhbnVwRm46IChlbCwgdG9rZW5zKSA9PiB0b2tlbnMuZm9yRWFjaCgodG9rZW4pID0+IHJlbmRlcmVyLnJlbW92ZVN0eWxlKGVsLCB0b2tlbikpLFxuICAgIHVwZGF0ZUZuOiAoZWwsIHRva2VucywgY29uZGl0aW9uKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBudWxsIHx8IGNvbmRpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVuZGVyZXIucmVtb3ZlU3R5bGUoZWwsIHRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgdG9rZW4sIGAke2NvbmRpdGlvbn1gLCBSZW5kZXJlclN0eWxlRmxhZ3MyLkRhc2hDYXNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEhvc3RTdHlsZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KHN0eWxlTWFwOiBUKSA9PlxuICBzaWduYWxTdHlsZXMoaW5qZWN0KEVsZW1lbnRSZWYpLCBzdHlsZU1hcCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNhbFNpemUge1xuICBpbmxpbmVTaXplOiBudW1iZXI7XG4gIGJsb2NrU2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnREaW1lbnNpb25zIHtcbiAgcmVjdDogRE9NUmVjdFJlYWRPbmx5IHwgbnVsbDtcbiAgYm9yZGVyQm94U2l6ZTogTG9naWNhbFNpemUgfCBudWxsO1xuICBjb250ZW50Qm94U2l6ZTogTG9naWNhbFNpemUgfCBudWxsO1xuICBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplOiBMb2dpY2FsU2l6ZSB8IG51bGw7XG59XG5cbmV4cG9ydCBjb25zdCBzaWduYWxFbGVtZW50RGltZW5zaW9ucyA9IChlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlKSA9PiB7XG4gIGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIGNvbnN0IGVsZW1lbnRzID0gYnVpbGRFbGVtZW50U2lnbmFsKGVsKTtcbiAgY29uc3Qgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBjb25zdCBpc1JlbmRlcmVkID0gc2lnbmFsSXNSZW5kZXJlZCgpO1xuXG4gIGNvbnN0IGluaXRpYWxWYWx1ZSA9ICgpID0+ICh7XG4gICAgcmVjdDogZWxlbWVudHMoKS5jdXJyZW50RWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgPz8gbnVsbCxcbiAgICBib3JkZXJCb3hTaXplOiBudWxsLFxuICAgIGNvbnRlbnRCb3hTaXplOiBudWxsLFxuICAgIGRldmljZVBpeGVsQ29udGVudEJveFNpemU6IG51bGwsXG4gIH0pO1xuXG4gIGNvbnN0IGVsZW1lbnREaW1lbnNpb25zU2lnbmFsID0gc2lnbmFsPEVsZW1lbnREaW1lbnNpb25zPihpbml0aWFsVmFsdWUoKSk7XG5cbiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGUpID0+IHtcbiAgICBpZiAoIWlzUmVuZGVyZWQoKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZW50cnkgPSBlWzBdO1xuXG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICBjb25zdCBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplID0gZW50cnkuZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZT8uWzBdID8/IG51bGw7XG4gICAgICBjb25zdCBib3JkZXJCb3hTaXplID0gZW50cnkuYm9yZGVyQm94U2l6ZT8uWzBdID8/IG51bGw7XG4gICAgICBjb25zdCBjb250ZW50Qm94U2l6ZSA9IGVudHJ5LmNvbnRlbnRCb3hTaXplPy5bMF0gPz8gbnVsbDtcblxuICAgICAgem9uZS5ydW4oKCkgPT5cbiAgICAgICAgZWxlbWVudERpbWVuc2lvbnNTaWduYWwuc2V0KHtcbiAgICAgICAgICByZWN0OiBlbnRyeS5jb250ZW50UmVjdCxcbiAgICAgICAgICBib3JkZXJCb3hTaXplOiBib3JkZXJCb3hTaXplXG4gICAgICAgICAgICA/IHsgaW5saW5lU2l6ZTogYm9yZGVyQm94U2l6ZS5pbmxpbmVTaXplLCBibG9ja1NpemU6IGJvcmRlckJveFNpemUuYmxvY2tTaXplIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBjb250ZW50Qm94U2l6ZTogY29udGVudEJveFNpemVcbiAgICAgICAgICAgID8geyBpbmxpbmVTaXplOiBjb250ZW50Qm94U2l6ZS5pbmxpbmVTaXplLCBibG9ja1NpemU6IGNvbnRlbnRCb3hTaXplLmJsb2NrU2l6ZSB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZTogZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZVxuICAgICAgICAgICAgPyB7IGlubGluZVNpemU6IGRldmljZVBpeGVsQ29udGVudEJveFNpemUuaW5saW5lU2l6ZSwgYmxvY2tTaXplOiBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplLmJsb2NrU2l6ZSB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBlbHMgPSBlbGVtZW50cygpO1xuXG4gICAgICBlbGVtZW50RGltZW5zaW9uc1NpZ25hbC5zZXQoaW5pdGlhbFZhbHVlKCkpO1xuXG4gICAgICBpZiAoZWxzLnByZXZpb3VzRWxlbWVudCkge1xuICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlbHMuY3VycmVudEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWREaXNwbGF5ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbHMuY3VycmVudEVsZW1lbnQpLmRpc3BsYXk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFbElzQW5ndWxhckNvbXBvbmVudCA9IGVscy5jdXJyZW50RWxlbWVudD8udGFnTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCctJyk7XG5cbiAgICAgICAgaWYgKGNvbXB1dGVkRGlzcGxheSA9PT0gJ2lubGluZScgJiYgaXNEZXZNb2RlKCkgJiYgY3VycmVudEVsSXNBbmd1bGFyQ29tcG9uZW50KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBFbGVtZW50IDwke2Vscy5jdXJyZW50RWxlbWVudD8udGFnTmFtZS50b0xvd2VyQ2FzZSgpfT4gaXMgYW4gQW5ndWxhciBjb21wb25lbnQgYW5kIGhhcyBhIGRpc3BsYXkgb2YgJ2lubGluZScuIElubGluZSBlbGVtZW50cyBjYW5ub3QgYmUgb2JzZXJ2ZWQgZm9yIGRpbWVuc2lvbnMuIFBsZWFzZSBjaGFuZ2UgaXQgdG8gJ2Jsb2NrJyBvciBzb21ldGhpbmcgZWxzZS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGVscy5jdXJyZW50RWxlbWVudCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICk7XG5cbiAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpKTtcblxuICByZXR1cm4gZWxlbWVudERpbWVuc2lvbnNTaWduYWwuYXNSZWFkb25seSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEhvc3RFbGVtZW50RGltZW5zaW9ucyA9ICgpID0+IHNpZ25hbEVsZW1lbnREaW1lbnNpb25zKGluamVjdChFbGVtZW50UmVmKSk7XG5cbmV4cG9ydCBjb25zdCBzaWduYWxFbGVtZW50TXV0YXRpb25zID0gKGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsIG9wdGlvbnM/OiBNdXRhdGlvbk9ic2VydmVySW5pdCkgPT4ge1xuICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBjb25zdCBlbGVtZW50cyA9IGJ1aWxkRWxlbWVudFNpZ25hbChlbCk7XG4gIGNvbnN0IHpvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgY29uc3QgaXNSZW5kZXJlZCA9IHNpZ25hbElzUmVuZGVyZWQoKTtcblxuICBjb25zdCBlbGVtZW50TXV0YXRpb25zU2lnbmFsID0gc2lnbmFsPE11dGF0aW9uUmVjb3JkIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoZSkgPT4ge1xuICAgIGlmICghaXNSZW5kZXJlZCgpKSByZXR1cm47XG5cbiAgICBjb25zdCBlbnRyeSA9IGVbMF07XG5cbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIHpvbmUucnVuKCgpID0+IGVsZW1lbnRNdXRhdGlvbnNTaWduYWwuc2V0KGVudHJ5KSk7XG4gICAgfVxuICB9KTtcblxuICBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZWxzID0gZWxlbWVudHMoKTtcblxuICAgICAgZWxlbWVudE11dGF0aW9uc1NpZ25hbC5zZXQobnVsbCk7XG5cbiAgICAgIGlmIChlbHMucHJldmlvdXNFbGVtZW50KSB7XG4gICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVscy5jdXJyZW50RWxlbWVudCkge1xuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGVscy5jdXJyZW50RWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICk7XG5cbiAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpKTtcblxuICByZXR1cm4gZWxlbWVudE11dGF0aW9uc1NpZ25hbC5hc1JlYWRvbmx5KCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdEVsZW1lbnRNdXRhdGlvbnMgPSAob3B0aW9ucz86IE11dGF0aW9uT2JzZXJ2ZXJJbml0KSA9PlxuICBzaWduYWxFbGVtZW50TXV0YXRpb25zKGluamVjdChFbGVtZW50UmVmKSwgb3B0aW9ucyk7XG5cbmV4cG9ydCB0eXBlIFNpZ25hbEVsZW1lbnRTY3JvbGxTdGF0ZU9wdGlvbnMgPSB7XG4gIC8qKiBUaGUgaW5pdGlhbCBzY3JvbGwgcG9zaXRpb24gdG8gc2Nyb2xsIHRvLiBPbmNlIGEgdHJ1dGh5IHZhbHVlIGdldCdzIGVtaXR0ZWQsIGFsbCBmdXJ0aGVyIHZhbHVlcyB3aWxsIGJlIGlnbm9yZWQuICovXG4gIGluaXRpYWxTY3JvbGxQb3NpdGlvbj86IFNpZ25hbDxTY3JvbGxUb09wdGlvbnMgfCBudWxsPjtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxFbGVtZW50U2Nyb2xsU3RhdGUgPSAoZWw6IFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZSwgb3B0aW9ucz86IFNpZ25hbEVsZW1lbnRTY3JvbGxTdGF0ZU9wdGlvbnMpID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBidWlsZEVsZW1lbnRTaWduYWwoZWwpO1xuICBjb25zdCBlbGVtZW50RGltZW5zaW9ucyA9IHNpZ25hbEVsZW1lbnREaW1lbnNpb25zKGVsZW1lbnRzKTtcbiAgY29uc3QgZWxlbWVudE11dGF0aW9ucyA9IHNpZ25hbEVsZW1lbnRNdXRhdGlvbnMoZWxlbWVudHMsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICBjb25zdCBpc1JlbmRlcmVkID0gc2lnbmFsSXNSZW5kZXJlZCgpO1xuXG4gIGNvbnN0IGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9IG9wdGlvbnM/LmluaXRpYWxTY3JvbGxQb3NpdGlvbjtcblxuICBpZiAoaW5pdGlhbFNjcm9sbFBvc2l0aW9uKSB7XG4gICAgY29uc3QgcmVmID0gZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghaXNSZW5kZXJlZCgpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gaW5pdGlhbFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHMoKS5jdXJyZW50RWxlbWVudDtcblxuICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uICYmIGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uLmxlZnQgIT09IHVuZGVmaW5lZCkgZWxlbWVudC5zY3JvbGxMZWZ0ID0gc2Nyb2xsUG9zaXRpb24ubGVmdDtcbiAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uLnRvcCAhPT0gdW5kZWZpbmVkKSBlbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFBvc2l0aW9uLnRvcDtcbiAgICAgICAgcmVmLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzKCkuY3VycmVudEVsZW1lbnQ7XG4gICAgY29uc3QgZGltZW5zaW9ucyA9IGVsZW1lbnREaW1lbnNpb25zKCk7XG5cbiAgICBjb25zdCBub3RTY3JvbGxhYmxlID0gKCkgPT4gKHtcbiAgICAgIGNhblNjcm9sbDogZmFsc2UsXG4gICAgICBjYW5TY3JvbGxIb3Jpem9udGFsbHk6IGZhbHNlLFxuICAgICAgY2FuU2Nyb2xsVmVydGljYWxseTogZmFsc2UsXG4gICAgICBzY3JvbGxXaWR0aDogZWxlbWVudD8uc2Nyb2xsV2lkdGggPz8gbnVsbCxcbiAgICAgIHNjcm9sbEhlaWdodDogZWxlbWVudD8uc2Nyb2xsSGVpZ2h0ID8/IG51bGwsXG4gICAgICBlbGVtZW50RGltZW5zaW9uczogZGltZW5zaW9ucyxcbiAgICB9KTtcblxuICAgIC8vIFdlIGFyZSBub3QgaW50ZXJlc3RlZCB3aGF0IHRoZSBtdXRhdGlvbiBpcywganVzdCB0aGF0IHRoZXJlIGlzIG9uZS5cbiAgICAvLyBDaGFuZ2VzIHRvIHRoZSBET00gY2FuIGFmZmVjdCB0aGUgc2Nyb2xsIHN0YXRlIG9mIHRoZSBlbGVtZW50LlxuICAgIGVsZW1lbnRNdXRhdGlvbnMoKTtcblxuICAgIGlmICghZWxlbWVudCB8fCAhZGltZW5zaW9ucy5yZWN0IHx8ICFpc1JlbmRlcmVkKCkpIHJldHVybiBub3RTY3JvbGxhYmxlKCk7XG5cbiAgICBjb25zdCB7IHNjcm9sbFdpZHRoLCBzY3JvbGxIZWlnaHQgfSA9IGVsZW1lbnQ7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBkaW1lbnNpb25zLnJlY3Q7XG5cbiAgICBjb25zdCBjYW5TY3JvbGxIb3Jpem9udGFsbHkgPSBzY3JvbGxXaWR0aCA+IHdpZHRoO1xuICAgIGNvbnN0IGNhblNjcm9sbFZlcnRpY2FsbHkgPSBzY3JvbGxIZWlnaHQgPiBoZWlnaHQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2FuU2Nyb2xsOiBjYW5TY3JvbGxIb3Jpem9udGFsbHkgfHwgY2FuU2Nyb2xsVmVydGljYWxseSxcbiAgICAgIGNhblNjcm9sbEhvcml6b250YWxseSxcbiAgICAgIGNhblNjcm9sbFZlcnRpY2FsbHksXG4gICAgICBzY3JvbGxXaWR0aCxcbiAgICAgIHNjcm9sbEhlaWdodCxcbiAgICAgIGVsZW1lbnREaW1lbnNpb25zOiBkaW1lbnNpb25zLFxuICAgIH07XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEhvc3RFbGVtZW50U2Nyb2xsU3RhdGUgPSAoKSA9PiBzaWduYWxFbGVtZW50U2Nyb2xsU3RhdGUoaW5qZWN0KEVsZW1lbnRSZWYpKTtcblxuZXhwb3J0IHR5cGUgU2lnbmFsRWxlbWVudEludGVyc2VjdGlvbk9wdGlvbnMgPSBPbWl0PEludGVyc2VjdGlvbk9ic2VydmVySW5pdCwgJ3Jvb3QnPiAmIHtcbiAgcm9vdD86IFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZTtcbiAgZW5hYmxlZD86IFNpZ25hbDxib29sZWFuPjtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxFbGVtZW50SW50ZXJzZWN0aW9uID0gKGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsIG9wdGlvbnM/OiBTaWduYWxFbGVtZW50SW50ZXJzZWN0aW9uT3B0aW9ucykgPT4ge1xuICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBjb25zdCBlbGVtZW50cyA9IGJ1aWxkRWxlbWVudFNpZ25hbChlbCk7XG4gIGNvbnN0IHJvb3QgPSBmaXJzdEVsZW1lbnRTaWduYWwob3B0aW9ucz8ucm9vdCA/IGJ1aWxkRWxlbWVudFNpZ25hbChvcHRpb25zPy5yb290KSA6IGRvY3VtZW50RWxlbWVudFNpZ25hbCgpKTtcbiAgY29uc3Qgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBjb25zdCBpc1JlbmRlcmVkID0gc2lnbmFsSXNSZW5kZXJlZCgpO1xuICBjb25zdCBpc0VuYWJsZWQgPSBvcHRpb25zPy5lbmFibGVkID8/IHNpZ25hbCh0cnVlKTtcblxuICBjb25zdCBlbGVtZW50SW50ZXJzZWN0aW9uU2lnbmFsID0gc2lnbmFsPEludGVyc2VjdGlvbk9ic2VydmVyRW50cnlbXT4oW10pO1xuICBjb25zdCBvYnNlcnZlciA9IHNpZ25hbDxJbnRlcnNlY3Rpb25PYnNlcnZlciB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IGN1cnJlbnRseU9ic2VydmVkRWxlbWVudHMgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuXG4gIGNvbnN0IHVwZGF0ZUludGVyc2VjdGlvbnMgPSAoZW50cmllczogSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeVtdKSA9PiB7XG4gICAgbGV0IGN1cnJlbnRWYWx1ZXMgPSBbLi4uZWxlbWVudEludGVyc2VjdGlvblNpZ25hbCgpXTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgZXhpc3RpbmdFbnRyeUluZGV4ID0gY3VycmVudFZhbHVlcy5maW5kSW5kZXgoKHYpID0+IHYudGFyZ2V0ID09PSBlbnRyeS50YXJnZXQpO1xuXG4gICAgICAvLyBSb3VuZCB0aGUgaW50ZXJzZWN0aW9uIHJhdGlvIHRvIHRoZSBuZWFyZXN0IDAuMDEgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgZXJyb3JzIGFuZCBzeXN0ZW0gc2NhbGluZyBpc3N1ZXMuXG4gICAgICBjb25zdCByb3VuZGVkSW50ZXJzZWN0aW9uUmF0aW8gPSBNYXRoLnJvdW5kKGVudHJ5LmludGVyc2VjdGlvblJhdGlvICogMTAwKSAvIDEwMDtcblxuICAgICAgY29uc3QgaW50ZXJzZWN0aW9uRW50cnk6IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgPSB7XG4gICAgICAgIGJvdW5kaW5nQ2xpZW50UmVjdDogZW50cnkuYm91bmRpbmdDbGllbnRSZWN0LFxuICAgICAgICBpbnRlcnNlY3Rpb25SYXRpbzogcm91bmRlZEludGVyc2VjdGlvblJhdGlvLFxuICAgICAgICBpbnRlcnNlY3Rpb25SZWN0OiBlbnRyeS5pbnRlcnNlY3Rpb25SZWN0LFxuICAgICAgICBpc0ludGVyc2VjdGluZzogZW50cnkuaXNJbnRlcnNlY3RpbmcsXG4gICAgICAgIHJvb3RCb3VuZHM6IGVudHJ5LnJvb3RCb3VuZHMsXG4gICAgICAgIHRhcmdldDogZW50cnkudGFyZ2V0LFxuICAgICAgICB0aW1lOiBlbnRyeS50aW1lLFxuICAgICAgfTtcblxuICAgICAgaWYgKGV4aXN0aW5nRW50cnlJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgY3VycmVudFZhbHVlcyA9IFtcbiAgICAgICAgICAuLi5jdXJyZW50VmFsdWVzLnNsaWNlKDAsIGV4aXN0aW5nRW50cnlJbmRleCksXG4gICAgICAgICAgaW50ZXJzZWN0aW9uRW50cnksXG4gICAgICAgICAgLi4uY3VycmVudFZhbHVlcy5zbGljZShleGlzdGluZ0VudHJ5SW5kZXggKyAxKSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRWYWx1ZXMgPSBbLi4uY3VycmVudFZhbHVlcywgaW50ZXJzZWN0aW9uRW50cnldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHpvbmUucnVuKCgpID0+IGVsZW1lbnRJbnRlcnNlY3Rpb25TaWduYWwuc2V0KGN1cnJlbnRWYWx1ZXMpKTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVJbnRlcnNlY3Rpb25PYnNlcnZlciA9IChyZW5kZXJlZDogYm9vbGVhbiwgZW5hYmxlZDogYm9vbGVhbiwgcm9vdEVsOiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHtcbiAgICBvYnNlcnZlcigpPy5kaXNjb25uZWN0KCk7XG4gICAgY3VycmVudGx5T2JzZXJ2ZWRFbGVtZW50cy5jbGVhcigpO1xuXG4gICAgaWYgKCFyZW5kZXJlZCB8fCAhZW5hYmxlZCB8fCAhcm9vdEVsKSB7XG4gICAgICBvYnNlcnZlci5zZXQobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3T2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHVwZGF0ZUludGVyc2VjdGlvbnMoZW50cmllcyksIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICByb290OiByb290RWwsXG4gICAgfSk7XG5cbiAgICBvYnNlcnZlci5zZXQobmV3T2JzZXJ2ZXIpO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZU9ic2VydmVkRWxlbWVudHMgPSAob2JzZXJ2ZXI6IEludGVyc2VjdGlvbk9ic2VydmVyIHwgbnVsbCwgZWxlbWVudHM6IEVsZW1lbnRTaWduYWxWYWx1ZSkgPT4ge1xuICAgIGNvbnN0IHJvb3RFbCA9IHJvb3QoKS5jdXJyZW50RWxlbWVudDtcbiAgICBjb25zdCByb290Qm91bmRzID0gcm9vdEVsPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGlmICghb2JzZXJ2ZXIgfHwgIXJvb3RFbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3VyckludGVyc2VjaW9uVmFsdWUgPSBlbGVtZW50SW50ZXJzZWN0aW9uU2lnbmFsKCk7XG4gICAgY29uc3QgbmV3SW50ZXJzZWN0aW9uVmFsdWU6IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnlbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbCBvZiBlbGVtZW50cy5jdXJyZW50RWxlbWVudHMpIHtcbiAgICAgIGlmIChjdXJyZW50bHlPYnNlcnZlZEVsZW1lbnRzLmhhcyhlbCkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdFbnRyeUluZGV4ID0gY3VyckludGVyc2VjaW9uVmFsdWUuZmluZEluZGV4KCh2KSA9PiB2LnRhcmdldCA9PT0gZWwpO1xuICAgICAgICBjb25zdCBleGlzdGluZ0VudHJ5ID0gY3VyckludGVyc2VjaW9uVmFsdWVbZXhpc3RpbmdFbnRyeUluZGV4XTtcblxuICAgICAgICBpZiAoIWV4aXN0aW5nRW50cnkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmaW5kIGV4aXN0aW5nIGVudHJ5IGZvciBlbGVtZW50LiBUaGUgaW50ZXJzZWN0aW9uIG9ic2VydmVyIG1pZ2h0IGJlIGJyb2tlbiBub3cuJywgZWwpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV3SW50ZXJzZWN0aW9uVmFsdWUucHVzaChleGlzdGluZ0VudHJ5KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluaXRpYWxFbGVtZW50VmlzaWJpbGl0eSA9IGlzRWxlbWVudFZpc2libGUoe1xuICAgICAgICBjb250YWluZXI6IHJvb3RFbCxcbiAgICAgICAgZWxlbWVudDogZWwsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFpbml0aWFsRWxlbWVudFZpc2liaWxpdHkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignTm8gdmlzaWJpbGl0eSBkYXRhIGZvdW5kIGZvciBlbGVtZW50LicsIHtcbiAgICAgICAgICBlbGVtZW50OiBlbCxcbiAgICAgICAgICBjb250YWluZXI6IHJvb3RFbCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsQm91bmRzID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIGNvbnN0IGlubGluZUludGVyc2VjdGlvblJhdGlvID0gaW5pdGlhbEVsZW1lbnRWaXNpYmlsaXR5LmlubGluZUludGVyc2VjdGlvbiAvIDEwMDtcbiAgICAgIGNvbnN0IGJsb2NrSW50ZXJzZWN0aW9uUmF0aW8gPSBpbml0aWFsRWxlbWVudFZpc2liaWxpdHkuYmxvY2tJbnRlcnNlY3Rpb24gLyAxMDA7XG4gICAgICBjb25zdCBpc0ludGVyc2VjdGluZyA9IGlubGluZUludGVyc2VjdGlvblJhdGlvID4gMCAmJiBibG9ja0ludGVyc2VjdGlvblJhdGlvID4gMDtcbiAgICAgIGNvbnN0IGludGVyc2VjdGlvblJhdGlvID0gTWF0aC5taW4oaW5saW5lSW50ZXJzZWN0aW9uUmF0aW8sIGJsb2NrSW50ZXJzZWN0aW9uUmF0aW8pO1xuXG4gICAgICAvLyBSb3VuZCB0aGUgaW50ZXJzZWN0aW9uIHJhdGlvIHRvIHRoZSBuZWFyZXN0IDAuMDEgdG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQgZXJyb3JzIGFuZCBzeXN0ZW0gc2NhbGluZyBpc3N1ZXMuXG4gICAgICBjb25zdCByb3VuZGVkSW50ZXJzZWN0aW9uUmF0aW8gPSBNYXRoLnJvdW5kKGludGVyc2VjdGlvblJhdGlvICogMTAwKSAvIDEwMDtcblxuICAgICAgY29uc3QgaW50ZXJzZWN0aW9uRW50cnk6IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgPSB7XG4gICAgICAgIGJvdW5kaW5nQ2xpZW50UmVjdDogZWxCb3VuZHMsXG4gICAgICAgIGludGVyc2VjdGlvblJhdGlvOiByb3VuZGVkSW50ZXJzZWN0aW9uUmF0aW8sXG4gICAgICAgIGludGVyc2VjdGlvblJlY3Q6IGVsQm91bmRzLFxuICAgICAgICBpc0ludGVyc2VjdGluZyxcbiAgICAgICAgcm9vdEJvdW5kczogcm9vdEJvdW5kcyA/PyBudWxsLFxuICAgICAgICB0YXJnZXQ6IGVsLFxuICAgICAgICB0aW1lOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgIH07XG5cbiAgICAgIG5ld0ludGVyc2VjdGlvblZhbHVlLnB1c2goaW50ZXJzZWN0aW9uRW50cnkpO1xuXG4gICAgICBjdXJyZW50bHlPYnNlcnZlZEVsZW1lbnRzLmFkZChlbCk7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGVsKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGVsIG9mIGVsZW1lbnRzLnByZXZpb3VzRWxlbWVudHMpIHtcbiAgICAgIGlmIChlbGVtZW50cy5jdXJyZW50RWxlbWVudHMuaW5jbHVkZXMoZWwpKSBjb250aW51ZTtcblxuICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKGVsKTtcbiAgICAgIGN1cnJlbnRseU9ic2VydmVkRWxlbWVudHMuZGVsZXRlKGVsKTtcbiAgICB9XG5cbiAgICBlbGVtZW50SW50ZXJzZWN0aW9uU2lnbmFsLnNldChuZXdJbnRlcnNlY3Rpb25WYWx1ZSk7XG4gIH07XG5cbiAgZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IHJvb3RFbCA9IHJvb3QoKS5jdXJyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gaXNSZW5kZXJlZCgpO1xuICAgICAgY29uc3QgZW5hYmxlZCA9IGlzRW5hYmxlZCgpO1xuXG4gICAgICB1bnRyYWNrZWQoKCkgPT4gdXBkYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIocmVuZGVyZWQsIGVuYWJsZWQsIHJvb3RFbCkpO1xuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICApO1xuXG4gIGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZWxzID0gZWxlbWVudHMoKTtcbiAgICBjb25zdCBvYnMgPSBvYnNlcnZlcigpO1xuXG4gICAgdW50cmFja2VkKCgpID0+IHVwZGF0ZU9ic2VydmVkRWxlbWVudHMob2JzLCBlbHMpKTtcbiAgfSk7XG5cbiAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gb2JzZXJ2ZXIoKT8uZGlzY29ubmVjdCgpKTtcblxuICByZXR1cm4gZWxlbWVudEludGVyc2VjdGlvblNpZ25hbC5hc1JlYWRvbmx5KCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdEVsZW1lbnRJbnRlcnNlY3Rpb24gPSAob3B0aW9ucz86IFNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb25PcHRpb25zKSA9PlxuICBzaWduYWxFbGVtZW50SW50ZXJzZWN0aW9uKGluamVjdChFbGVtZW50UmVmKSwgb3B0aW9ucyk7XG5cbmV4cG9ydCBjb25zdCBzaWduYWxFbGVtZW50Q2hpbGRyZW4gPSAoZWw6IFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZSkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IGJ1aWxkRWxlbWVudFNpZ25hbChlbCk7XG4gIGNvbnN0IGlzUmVuZGVyZWQgPSBzaWduYWxJc1JlbmRlcmVkKCk7XG4gIGNvbnN0IGVsZW1lbnRNdXRhdGlvbnMgPSBzaWduYWxFbGVtZW50TXV0YXRpb25zKGVsZW1lbnRzLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSB9KTtcblxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGlmICghaXNSZW5kZXJlZCgpKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBlbHMgPSBlbGVtZW50cygpO1xuXG4gICAgLy8gV2UgYXJlIG5vdCBpbnRlcmVzdGVkIHdoYXQgdGhlIG11dGF0aW9uIGlzLCBqdXN0IHRoYXQgdGhlcmUgaXMgb25lLlxuICAgIC8vIENoYW5nZXMgdG8gdGhlIERPTSBtYXkgYWZmZWN0IHRoZSBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudC5cbiAgICBlbGVtZW50TXV0YXRpb25zKCk7XG5cbiAgICBpZiAoIWVscy5jdXJyZW50RWxlbWVudCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgY2hpbGRyZW46IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlbHMuY3VycmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxzLmN1cnJlbnRFbGVtZW50LmNoaWxkcmVuW2luZGV4XTtcblxuICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICBjaGlsZHJlbi5wdXNoKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcHJldmlvdXNTaWduYWxWYWx1ZSA9IDxUPihzaWduYWw6IFNpZ25hbDxUPikgPT4ge1xuICBjb25zdCBvYnMgPSB0b09ic2VydmFibGUoc2lnbmFsKS5waXBlKFxuICAgIHBhaXJ3aXNlKCksXG4gICAgbWFwKChbcHJldl0pID0+IHByZXYpLFxuICApO1xuXG4gIHJldHVybiB0b1NpZ25hbChvYnMpO1xufTtcblxuZXhwb3J0IGNvbnN0IHN5bmNTaWduYWwgPSA8VD4oZnJvbTogU2lnbmFsPFQ+LCB0bzogV3JpdGFibGVTaWduYWw8VD4pID0+IHtcbiAgZWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBmb3JtVmFsID0gZnJvbSgpO1xuXG4gICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgIHRvLnNldChmb3JtVmFsKTtcbiAgICB9KTtcbiAgfSk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xWYWx1ZVNpZ25hbE9wdGlvbnMge1xuICAvKipcbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBkZWJvdW5jZVRpbWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkZWJvdW5jZUZpcnN0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnRyb2xWYWx1ZVNpZ25hbCA9IDxUIGV4dGVuZHMgRm9ybUNvbnRyb2wgfCBGb3JtR3JvdXAgfCBGb3JtQXJyYXk+KFxuICBjb250cm9sOiBULFxuICBvcHRpb25zPzogQ29udHJvbFZhbHVlU2lnbmFsT3B0aW9ucyxcbikgPT4ge1xuICBjb25zdCB2Y3NPYnMgPSBvcHRpb25zPy5kZWJvdW5jZVRpbWVcbiAgICA/IGNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKG9wdGlvbnM/LmRlYm91bmNlVGltZSA/PyAzMDApKVxuICAgIDogY29udHJvbC52YWx1ZUNoYW5nZXM7XG5cbiAgY29uc3Qgb2JzOiBPYnNlcnZhYmxlPFJldHVyblR5cGU8VFsnZ2V0UmF3VmFsdWUnXT4+ID0gb3B0aW9ucz8uZGVib3VuY2VGaXJzdFxuICAgID8gbWVyZ2Uob2YoY29udHJvbC52YWx1ZSksIHZjc09icylcbiAgICA6IHZjc09icy5waXBlKHN0YXJ0V2l0aChjb250cm9sLmdldFJhd1ZhbHVlKCkpKTtcblxuICByZXR1cm4gdG9TaWduYWwob2JzLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGVxdWFsKGEsIGIpKSksIHtcbiAgICByZXF1aXJlU3luYzogdHJ1ZSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBwYWlyIGlzIHRoZSBwcmV2aW91cyB2YWx1ZSBhbmQgdGhlIHNlY29uZCBpdGVtIGlzIHRoZSBjdXJyZW50IHZhbHVlLlxuICovXG5leHBvcnQgY29uc3QgY29udHJvbFZhbHVlU2lnbmFsV2l0aFByZXZpb3VzID0gPFQgZXh0ZW5kcyBGb3JtQ29udHJvbCB8IEZvcm1Hcm91cCB8IEZvcm1BcnJheT4oXG4gIGNvbnRyb2w6IFQsXG4gIG9wdGlvbnM/OiBDb250cm9sVmFsdWVTaWduYWxPcHRpb25zLFxuKSA9PiB7XG4gIGNvbnN0IG9icyA9IHRvT2JzZXJ2YWJsZShjb250cm9sVmFsdWVTaWduYWwoY29udHJvbCwgb3B0aW9ucykpLnBpcGUoXG4gICAgcGFpcndpc2UoKSxcbiAgICBzdGFydFdpdGgoW251bGwsIGNvbnRyb2wuZ2V0UmF3VmFsdWUoKV0pLFxuICApO1xuXG4gIHJldHVybiB0b1NpZ25hbChvYnMsIHsgcmVxdWlyZVN5bmM6IHRydWUgfSk7XG59O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgY29udHJvbFZhbHVlU2lnbmFsYCBpbnN0ZWFkIHdpdGggYGRlYm91bmNlVGltZWAgb3B0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlYm91bmNlZENvbnRyb2xWYWx1ZVNpZ25hbE9wdGlvbnMge1xuICAvKipcbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBkZWJvdW5jZVRpbWU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBjb250cm9sVmFsdWVTaWduYWxgIGluc3RlYWQgd2l0aCBgZGVib3VuY2VUaW1lYCBzZXQgdG8gYDMwMGAgYW5kIGBkZWJvdW5jZUZpcnN0YCBzZXQgdG8gYHRydWVgLlxuICovXG5leHBvcnQgY29uc3QgZGVib3VuY2VkQ29udHJvbFZhbHVlU2lnbmFsID0gPFQgZXh0ZW5kcyBGb3JtQ29udHJvbD4oXG4gIGNvbnRyb2w6IFQsXG4gIG9wdGlvbnM/OiBEZWJvdW5jZWRDb250cm9sVmFsdWVTaWduYWxPcHRpb25zLFxuKSA9PiBjb250cm9sVmFsdWVTaWduYWwoY29udHJvbCwgb3B0aW9ucyA/PyB7IGRlYm91bmNlVGltZTogMzAwLCBkZWJvdW5jZUZpcnN0OiB0cnVlIH0pO1xuXG5leHBvcnQgdHlwZSBJbmplY3RVdGlsQ29uZmlnID0ge1xuICAvKiogVGhlIGluamVjdG9yIHRvIHVzZSBmb3IgdGhlIGluamVjdGlvbi4gTXVzdCBiZSBwcm92aWRlZCBpZiB0aGUgZnVuY3Rpb24gaXMgbm90IGNhbGxlZCBmcm9tIHdpdGhpbiBhIGluamVjdGlvbiBjb250ZXh0LiAqL1xuICBpbmplY3Rvcj86IEluamVjdG9yO1xufTtcblxuZXhwb3J0IHR5cGUgSW5qZWN0VXRpbFRyYW5zZm9ybUNvbmZpZzxJbiwgT3V0PiA9IHtcbiAgLyoqXG4gICAqIEEgdHJhbnNmb3JtIGZ1bmN0aW9uIHNpbWlsYXIgdG8gdGhlIGB0cmFuc2Zvcm1gIGZ1bmN0aW9uIGluIEFuZ3VsYXIgaW5wdXQgYmluZGluZ3MuXG4gICAqIENhbiBiZSB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgYmVmb3JlIGl0IGlzIHJldHVybmVkLlxuICAgKiBFLmcuIHRyYW5zZm9ybWluZyBgXCJ0cnVlXCJgIHRvIGB0cnVlYCBmb3IgYSBib29sZWFuIGF0dHJpYnV0ZS5cbiAgICovXG4gIHRyYW5zZm9ybT86ICh2YWx1ZTogSW4pID0+IE91dDtcbn07XG5cbmV4cG9ydCBjb25zdCBpbmplY3RPclJ1bkluQ29udGV4dCA9IDxUPihmbjogKCkgPT4gVCwgY29uZmlnPzogSW5qZWN0VXRpbENvbmZpZykgPT4ge1xuICBpZiAoY29uZmlnPy5pbmplY3Rvcikge1xuICAgIHJldHVybiBydW5JbkluamVjdGlvbkNvbnRleHQoY29uZmlnLmluamVjdG9yLCBmbik7XG4gIH1cblxuICByZXR1cm4gZm4oKTtcbn07XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1PclJldHVybiA9IDxJbiwgT3V0PihzcmM6IFNpZ25hbDxJbj4sIGNvbmZpZz86IEluamVjdFV0aWxUcmFuc2Zvcm1Db25maWc8SW4sIE91dD4pID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtZXIgPSBjb25maWc/LnRyYW5zZm9ybTtcblxuICBpZiAodHJhbnNmb3JtZXIpIHtcbiAgICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gdHJhbnNmb3JtZXIoc3JjKCkpKTtcbiAgfVxuXG4gIHJldHVybiBzcmMgYXMgdW5rbm93biBhcyBTaWduYWw8T3V0Pjtcbn07XG5cbi8qKiBJbmplY3QgYSBzaWduYWwgY29udGFpbmluZyB0aGUgY3VycmVudCByb3V0ZSBmcmFnbWVudCAodGhlIHBhcnQgYWZ0ZXIgdGhlICMgaW5zaWRlIHRoZSB1cmwgaWYgcHJlc2VudCkgKi9cbmV4cG9ydCBjb25zdCBpbmplY3RGcmFnbWVudCA9IDxUID0gc3RyaW5nIHwgbnVsbD4oXG4gIGNvbmZpZz86IEluamVjdFV0aWxDb25maWcgJiBJbmplY3RVdGlsVHJhbnNmb3JtQ29uZmlnPHN0cmluZyB8IG51bGwsIFQ+LFxuKSA9PiB7XG4gIHJldHVybiBpbmplY3RPclJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgY29uc3Qgcm91dGVyU3RhdGVTZXJ2aWNlID0gaW5qZWN0KFJvdXRlclN0YXRlU2VydmljZSk7XG4gICAgY29uc3Qgc3JjID0gdG9TaWduYWwocm91dGVyU3RhdGVTZXJ2aWNlLmZyYWdtZW50JCwgeyBpbml0aWFsVmFsdWU6IHJvdXRlclN0YXRlU2VydmljZS5mcmFnbWVudCB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1PclJldHVybihzcmMsIGNvbmZpZyk7XG4gIH0sIGNvbmZpZyk7XG59O1xuXG4vKiogSW5qZWN0IGFsbCBjdXJyZW50bHkgYXZhaWxhYmxlIHF1ZXJ5IHBhcmFtZXRlcnMgYXMgYSBzaWduYWwgKi9cbmV4cG9ydCBjb25zdCBpbmplY3RRdWVyeVBhcmFtcyA9IChjb25maWc/OiBJbmplY3RVdGlsQ29uZmlnKSA9PiB7XG4gIHJldHVybiBpbmplY3RPclJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgY29uc3Qgcm91dGVyU3RhdGVTZXJ2aWNlID0gaW5qZWN0KFJvdXRlclN0YXRlU2VydmljZSk7XG5cbiAgICByZXR1cm4gdG9TaWduYWwocm91dGVyU3RhdGVTZXJ2aWNlLnF1ZXJ5UGFyYW1zJCwgeyBpbml0aWFsVmFsdWU6IHJvdXRlclN0YXRlU2VydmljZS5xdWVyeVBhcmFtcyB9KTtcbiAgfSwgY29uZmlnKTtcbn07XG5cbi8qKiBJbmplY3QgYWxsIGN1cnJlbnRseSBhdmFpbGFibGUgcm91dGUgZGF0YSBhcyBhIHNpZ25hbCAqL1xuZXhwb3J0IGNvbnN0IGluamVjdFJvdXRlRGF0YSA9IChjb25maWc/OiBJbmplY3RVdGlsQ29uZmlnKSA9PiB7XG4gIHJldHVybiBpbmplY3RPclJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgY29uc3Qgcm91dGVyU3RhdGVTZXJ2aWNlID0gaW5qZWN0KFJvdXRlclN0YXRlU2VydmljZSk7XG5cbiAgICByZXR1cm4gdG9TaWduYWwocm91dGVyU3RhdGVTZXJ2aWNlLmRhdGEkLCB7IGluaXRpYWxWYWx1ZTogcm91dGVyU3RhdGVTZXJ2aWNlLmRhdGEgfSk7XG4gIH0sIGNvbmZpZyk7XG59O1xuXG4vKiogSW5qZWN0IHRoZSBjdXJyZW50IHJvdXRlIHRpdGxlIGFzIGEgc2lnbmFsICovXG5leHBvcnQgY29uc3QgaW5qZWN0Um91dGVUaXRsZSA9IDxUID0gc3RyaW5nIHwgbnVsbD4oXG4gIGNvbmZpZz86IEluamVjdFV0aWxDb25maWcgJiBJbmplY3RVdGlsVHJhbnNmb3JtQ29uZmlnPHN0cmluZyB8IG51bGwsIFQ+LFxuKSA9PiB7XG4gIHJldHVybiBpbmplY3RPclJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgY29uc3Qgcm91dGVyU3RhdGVTZXJ2aWNlID0gaW5qZWN0KFJvdXRlclN0YXRlU2VydmljZSk7XG4gICAgY29uc3Qgc3JjID0gdG9TaWduYWwocm91dGVyU3RhdGVTZXJ2aWNlLnRpdGxlJCwgeyBpbml0aWFsVmFsdWU6IHJvdXRlclN0YXRlU2VydmljZS50aXRsZSB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1PclJldHVybihzcmMsIGNvbmZpZyk7XG4gIH0sIGNvbmZpZyk7XG59O1xuXG4vKiogSW5qZWN0IGFsbCBjdXJyZW50bHkgYXZhaWxhYmxlIHBhdGggcGFyYW1ldGVycyBhcyBhIHNpZ25hbCAqL1xuZXhwb3J0IGNvbnN0IGluamVjdFBhdGhQYXJhbXMgPSAoY29uZmlnPzogSW5qZWN0VXRpbENvbmZpZykgPT4ge1xuICByZXR1cm4gaW5qZWN0T3JSdW5JbkNvbnRleHQoKCkgPT4ge1xuICAgIGNvbnN0IHJvdXRlclN0YXRlU2VydmljZSA9IGluamVjdChSb3V0ZXJTdGF0ZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIHRvU2lnbmFsKHJvdXRlclN0YXRlU2VydmljZS5wYXRoUGFyYW1zJCwgeyBpbml0aWFsVmFsdWU6IHJvdXRlclN0YXRlU2VydmljZS5wYXRoUGFyYW1zIH0pO1xuICB9LCBjb25maWcpO1xufTtcblxuLyoqIEluamVjdCBhIHNwZWNpZmljIHF1ZXJ5IHBhcmFtZXRlciBhcyBhIHNpZ25hbCAqL1xuZXhwb3J0IGNvbnN0IGluamVjdFF1ZXJ5UGFyYW0gPSA8VCA9IHN0cmluZyB8IG51bGw+KFxuICBrZXk6IHN0cmluZyxcbiAgY29uZmlnPzogSW5qZWN0VXRpbENvbmZpZyAmIEluamVjdFV0aWxUcmFuc2Zvcm1Db25maWc8c3RyaW5nIHwgbnVsbCwgVD4sXG4pID0+IHtcbiAgY29uc3QgcXVlcnlQYXJhbXMgPSBpbmplY3RRdWVyeVBhcmFtcyhjb25maWcpO1xuICBjb25zdCBzcmMgPSBjb21wdXRlZCgoKSA9PiBxdWVyeVBhcmFtcygpW2tleV0gPz8gbnVsbCkgYXMgU2lnbmFsPHN0cmluZyB8IG51bGw+O1xuXG4gIHJldHVybiB0cmFuc2Zvcm1PclJldHVybihzcmMsIGNvbmZpZyk7XG59O1xuXG4vKiogSW5qZWN0IGEgc3BlY2lmaWMgcm91dGUgZGF0YSBpdGVtIGFzIGEgc2lnbmFsICovXG5leHBvcnQgY29uc3QgaW5qZWN0Um91dGVEYXRhSXRlbSA9IDxUID0gdW5rbm93bj4oXG4gIGtleTogc3RyaW5nLFxuICBjb25maWc/OiBJbmplY3RVdGlsQ29uZmlnICYgSW5qZWN0VXRpbFRyYW5zZm9ybUNvbmZpZzx1bmtub3duLCBUPixcbikgPT4ge1xuICBjb25zdCBkYXRhID0gaW5qZWN0Um91dGVEYXRhKGNvbmZpZyk7XG4gIGNvbnN0IHNyYyA9IGNvbXB1dGVkKCgpID0+IGRhdGEoKVtrZXldID8/IG51bGwpIGFzIFNpZ25hbDxUPjtcblxuICByZXR1cm4gdHJhbnNmb3JtT3JSZXR1cm4oc3JjLCBjb25maWcpO1xufTtcblxuLyoqIEluamVjdCBhIHNwZWNpZmljIHBhdGggcGFyYW1ldGVyIGFzIGEgc2lnbmFsICovXG5leHBvcnQgY29uc3QgaW5qZWN0UGF0aFBhcmFtID0gPFQgPSBzdHJpbmcgfCBudWxsPihcbiAga2V5OiBzdHJpbmcsXG4gIGNvbmZpZz86IEluamVjdFV0aWxDb25maWcgJiBJbmplY3RVdGlsVHJhbnNmb3JtQ29uZmlnPHN0cmluZyB8IG51bGwsIFQ+LFxuKSA9PiB7XG4gIGNvbnN0IHBhdGhQYXJhbXMgPSBpbmplY3RQYXRoUGFyYW1zKGNvbmZpZyk7XG4gIGNvbnN0IHNyYyA9IGNvbXB1dGVkKCgpID0+IHBhdGhQYXJhbXMoKVtrZXldID8/IG51bGwpIGFzIFNpZ25hbDxzdHJpbmcgfCBudWxsPjtcblxuICByZXR1cm4gdHJhbnNmb3JtT3JSZXR1cm4oc3JjLCBjb25maWcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlzUmVuZGVyZWRTaWduYWwgPSAoKSA9PiB7XG4gIGNvbnN0IHZhbHVlID0gc2lnbmFsKGZhbHNlKTtcblxuICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgIGlmICghdmFsdWUoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ1JlbmRlciBzaWduYWwgd2FzIG5vdCBzZXQgdG8gdHJ1ZS4gVGhpcyBjYW4gY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvci4gTWFrZSBzdXJlIHRvIC5iaW5kKCkgdGhlIHJlbmRlciBzaWduYWwgYXQgdGhlIGVuZCBvZiB0aGUgY29uc3RydWN0b3IuJyxcbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHN0YXRlOiB2YWx1ZSxcbiAgICBiaW5kOiAoKSA9PiBlZmZlY3QoKCkgPT4gdmFsdWUuc2V0KHRydWUpLCB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0pLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUNhbkFuaW1hdGVTaWduYWwgPSAoKSA9PiB7XG4gIGNvbnN0IHZhbHVlID0gc2lnbmFsKGZhbHNlKTtcblxuICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgIHZhbHVlLnNldCh0cnVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdGF0ZTogdmFsdWUuYXNSZWFkb25seSgpLFxuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgQ3Vyc29yRHJhZ1Njcm9sbERpcmVjdGlvbiA9ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcgfCAnYm90aCc7XG5cbmV4cG9ydCB0eXBlIE1heWJlU2lnbmFsPFQ+ID0gVCB8IFNpZ25hbDxUPjtcblxuZXhwb3J0IGNvbnN0IG1heWJlU2lnbmFsVmFsdWUgPSA8VD4odmFsdWU6IE1heWJlU2lnbmFsPFQ+KSA9PiB7XG4gIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUoKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmV4cG9ydCB0eXBlIEN1cnNvckRyYWdTY3JvbGxPcHRpb25zID0ge1xuICAvKiogSWYgdHJ1ZSwgY3Vyc29yIGRyYWcgc2Nyb2xsaW5nIHdpbGwgYmUgZW5hYmxlZC4gKi9cbiAgZW5hYmxlZD86IFNpZ25hbDxib29sZWFuPjtcblxuICAvKiogVGhlIGFsbG93ZWQgc2Nyb2xsIGRpcmVjdGlvbi4gKi9cbiAgYWxsb3dlZERpcmVjdGlvbj86IE1heWJlU2lnbmFsPEN1cnNvckRyYWdTY3JvbGxEaXJlY3Rpb24+O1xufTtcblxuLyoqIFRoZSBkZWFkem9uZSBpbiBwaXhlbHMgYWZ0ZXIgd2hpY2ggdGhlIGN1cnNvciBkcmFnIHNjcm9sbCB3aWxsIHRha2UgZWZmZWN0LiAqL1xuY29uc3QgQ1VSU09SX0RSQUdfU0NST0xMX0RFQURaT05FID0gNTtcblxuLyoqIFRoZSBjbGFzcyB0aGF0IGlzIGFkZGVkIHRvIHRoZSBlbGVtZW50IHdoZW4gdGhlIGN1cnNvciBpcyBiZWluZyBkcmFnZ2VkLiAqL1xuY29uc3QgQ1VSU09SX0RSQUdfU0NST0xMSU5HX0NMQVNTID0gJ2V0LWN1cnNvci1kcmFnLXNjcm9sbC0tc2Nyb2xsaW5nJztcbmNvbnN0IENVUlNPUl9EUkFHX0lOSVRfQ0xBU1MgPSAnZXQtY3Vyc29yLWRyYWctc2Nyb2xsLS1pbml0JztcblxuLyoqIEEgZnVuY3Rpb24gdG8gYXBwbHkgY3Vyc29yIGRyYWcgc2Nyb2xsIGJlaGF2aW9yIHRvIGFuIGVsZW1lbnQuICovXG5leHBvcnQgY29uc3QgdXNlQ3Vyc29yRHJhZ1Njcm9sbCA9IChlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlLCBvcHRpb25zPzogQ3Vyc29yRHJhZ1Njcm9sbE9wdGlvbnMpID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBidWlsZEVsZW1lbnRTaWduYWwoZWwpO1xuICBjb25zdCBlbGVtZW50ID0gZmlyc3RFbGVtZW50U2lnbmFsKGVsZW1lbnRzKTtcbiAgY29uc3QgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgY29uc3QgeyBlbmFibGVkID0gc2lnbmFsKHRydWUpLCBhbGxvd2VkRGlyZWN0aW9uID0gJ2JvdGgnIH0gPSBvcHRpb25zID8/IHt9O1xuICBjb25zdCBzY3JvbGxTdGF0ZSA9IHNpZ25hbEVsZW1lbnRTY3JvbGxTdGF0ZShlbGVtZW50cyk7XG4gIGNvbnN0IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG4gIGNvbnN0IGlzRHJhZ2dpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBjb25zdCBpc0luaXREcmFnZ2luZyA9IHNpZ25hbChmYWxzZSk7XG4gIGNvbnN0IGluaXRpYWxEcmFnUG9zaXRpb24gPSBzaWduYWwoeyB4OiAwLCB5OiAwIH0pO1xuICBjb25zdCBpbml0aWFsU2Nyb2xsUG9zaXRpb24gPSBzaWduYWwoeyB4OiAwLCB5OiAwIH0pO1xuICBjb25zdCBkcmFnQW1vdW50ID0gc2lnbmFsKHsgeDogMCwgeTogMCB9KTtcbiAgY29uc3QgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXG4gIGNvbnN0IGNhblNjcm9sbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50U2Nyb2xsU3RhdGUgPSBzY3JvbGxTdGF0ZSgpO1xuICAgIGNvbnN0IGRpcmVjdGlvbiA9IG1heWJlU2lnbmFsVmFsdWUoYWxsb3dlZERpcmVjdGlvbik7XG5cbiAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgY2FzZSAnYm90aCc6XG4gICAgICAgIHJldHVybiBjdXJyZW50U2Nyb2xsU3RhdGUuY2FuU2Nyb2xsSG9yaXpvbnRhbGx5IHx8IGN1cnJlbnRTY3JvbGxTdGF0ZS5jYW5TY3JvbGxWZXJ0aWNhbGx5O1xuICAgICAgY2FzZSAnaG9yaXpvbnRhbCc6XG4gICAgICAgIHJldHVybiBjdXJyZW50U2Nyb2xsU3RhdGUuY2FuU2Nyb2xsSG9yaXpvbnRhbGx5O1xuICAgICAgY2FzZSAndmVydGljYWwnOlxuICAgICAgICByZXR1cm4gY3VycmVudFNjcm9sbFN0YXRlLmNhblNjcm9sbFZlcnRpY2FsbHk7XG4gICAgfVxuICB9KTtcblxuICAvLyBDbGVhbnVwIGlmIHRoZSBlbGVtZW50IHRoZSBjdXJzb3IgZHJhZyBzY3JvbGwgaXMgYm91bmQgdG8gZ2V0cyBjaGFuZ2VkXG4gIGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgeyBwcmV2aW91c0VsZW1lbnQgfSA9IGVsZW1lbnQoKTtcblxuICAgIGlmIChwcmV2aW91c0VsZW1lbnQpIHtcbiAgICAgIHJlbmRlcmVyLnJlbW92ZVN0eWxlKHByZXZpb3VzRWxlbWVudCwgJ2N1cnNvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQ29uZGl0aW9uYWxseSBhcHBseSBzdHlsZXMvY2xhc3NlcyB0byB0aGUgZWxlbWVudCBhbmQgdGhlIGRvY3VtZW50XG4gIGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY3VyckNhblNjcm9sbCA9IGNhblNjcm9sbCgpO1xuICAgIGNvbnN0IGlzRW5hYmxlZCA9IGVuYWJsZWQoKTtcbiAgICBjb25zdCBjdXJySXNEcmFnZ2luZyA9IGlzRHJhZ2dpbmcoKTtcbiAgICBjb25zdCBjdXJySXNJbml0RHJhZ2dpbmcgPSBpc0luaXREcmFnZ2luZygpO1xuXG4gICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gZWxlbWVudCgpLmN1cnJlbnRFbGVtZW50O1xuXG4gICAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICAgIGlmICghY3VyckNhblNjcm9sbCB8fCAhaXNFbmFibGVkKSB7XG4gICAgICAgIHJlbmRlcmVyLnJlbW92ZVN0eWxlKGVsLCAnY3Vyc29yJyk7XG4gICAgICAgIHJlbmRlcmVyLnJlbW92ZVN0eWxlKGVsLCAnc2Nyb2xsU25hcFR5cGUnKTtcbiAgICAgICAgcmVuZGVyZXIucmVtb3ZlU3R5bGUoZWwsICdzY3JvbGxCZWhhdmlvcicpO1xuICAgICAgICByZW5kZXJlci5yZW1vdmVDbGFzcyhlbCwgQ1VSU09SX0RSQUdfU0NST0xMSU5HX0NMQVNTKTtcbiAgICAgICAgcmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsIENVUlNPUl9EUkFHX0lOSVRfQ0xBU1MpO1xuICAgICAgICByZW5kZXJlci5yZW1vdmVTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdjdXJzb3InKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3VycklzSW5pdERyYWdnaW5nKSB7XG4gICAgICAgIHJlbmRlcmVyLmFkZENsYXNzKGVsLCBDVVJTT1JfRFJBR19JTklUX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJJc0RyYWdnaW5nKSB7XG4gICAgICAgIHJlbmRlcmVyLmFkZENsYXNzKGVsLCBDVVJTT1JfRFJBR19TQ1JPTExJTkdfQ0xBU1MpO1xuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ3Njcm9sbFNuYXBUeXBlJywgJ25vbmUnKTtcbiAgICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICdzY3JvbGxCZWhhdmlvcicsICd1bnNldCcpO1xuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ2N1cnNvcicsICdncmFiYmluZycpO1xuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICdjdXJzb3InLCAnZ3JhYmJpbmcnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjdXJySXNJbml0RHJhZ2dpbmcgJiYgIWN1cnJJc0RyYWdnaW5nKSB7XG4gICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAnY3Vyc29yJywgJ2dyYWInKTtcbiAgICAgICAgcmVuZGVyZXIucmVtb3ZlU3R5bGUoZWwsICdzY3JvbGxTbmFwVHlwZScpO1xuICAgICAgICByZW5kZXJlci5yZW1vdmVTdHlsZShlbCwgJ3Njcm9sbEJlaGF2aW9yJyk7XG4gICAgICAgIHJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsLCBDVVJTT1JfRFJBR19TQ1JPTExJTkdfQ0xBU1MpO1xuICAgICAgICByZW5kZXJlci5yZW1vdmVDbGFzcyhlbCwgQ1VSU09SX0RSQUdfSU5JVF9DTEFTUyk7XG4gICAgICAgIHJlbmRlcmVyLnJlbW92ZVN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ2N1cnNvcicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICAvLyBVcGRhdGUgdGhlIGVsZW1lbnQncyBzY3JvbGwgcG9zaXRpb24gd2hlbiB0aGUgdXNlciBkcmFnc1xuICBlZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJEcmFnQW1vdW50ID0gZHJhZ0Ftb3VudCgpO1xuXG4gICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJJc0RyYWdnaW5nID0gaXNEcmFnZ2luZygpO1xuICAgICAgY29uc3QgZWwgPSBlbGVtZW50KCkuY3VycmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCB7IHg6IGRyYWdYLCB5OiBkcmFnWSB9ID0gY3VyckRyYWdBbW91bnQ7XG4gICAgICBjb25zdCB7IHg6IHNjcm9sbFgsIHk6IHNjcm9sbFkgfSA9IGluaXRpYWxTY3JvbGxQb3NpdGlvbigpO1xuICAgICAgY29uc3QgY3VyckFsbG93ZWREaXJlY3Rpb24gPSBtYXliZVNpZ25hbFZhbHVlKGFsbG93ZWREaXJlY3Rpb24pO1xuXG4gICAgICBpZiAoIWVsIHx8ICFjdXJySXNEcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgICBzd2l0Y2ggKGN1cnJBbGxvd2VkRGlyZWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2JvdGgnOlxuICAgICAgICAgIGVsLnNjcm9sbCh7XG4gICAgICAgICAgICB0b3A6IGRyYWdZICsgc2Nyb2xsWSxcbiAgICAgICAgICAgIGxlZnQ6IGRyYWdYICsgc2Nyb2xsWCxcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2hvcml6b250YWwnOlxuICAgICAgICAgIGVsLnNjcm9sbCh7XG4gICAgICAgICAgICBsZWZ0OiBkcmFnWCArIHNjcm9sbFgsXG4gICAgICAgICAgICBiZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd2ZXJ0aWNhbCc6XG4gICAgICAgICAgZWwuc2Nyb2xsKHtcbiAgICAgICAgICAgIHRvcDogZHJhZ1kgKyBzY3JvbGxZLFxuICAgICAgICAgICAgYmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgY29uc3QgdXBkYXRlRHJhZ2dpbmcgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IGVsID0gZWxlbWVudCgpLmN1cnJlbnRFbGVtZW50O1xuXG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgZHggPSAoZS5jbGllbnRYIC0gaW5pdGlhbERyYWdQb3NpdGlvbigpLngpICogLTE7XG4gICAgY29uc3QgZHkgPSAoZS5jbGllbnRZIC0gaW5pdGlhbERyYWdQb3NpdGlvbigpLnkpICogLTE7XG5cbiAgICBkcmFnQW1vdW50LnNldCh7IHg6IGR4LCB5OiBkeSB9KTtcblxuICAgIGlmIChNYXRoLmFicyhkeCkgPiBDVVJTT1JfRFJBR19TQ1JPTExfREVBRFpPTkUgfHwgTWF0aC5hYnMoZHkpID4gQ1VSU09SX0RSQUdfU0NST0xMX0RFQURaT05FKSB7XG4gICAgICBpc0RyYWdnaW5nLnNldCh0cnVlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlRHJhZ2dpbmdFbmQgPSAoKSA9PiB7XG4gICAgaXNEcmFnZ2luZy5zZXQoZmFsc2UpO1xuICAgIGlzSW5pdERyYWdnaW5nLnNldChmYWxzZSk7XG4gICAgaW5pdGlhbERyYWdQb3NpdGlvbi5zZXQoeyB4OiAwLCB5OiAwIH0pO1xuICAgIGluaXRpYWxTY3JvbGxQb3NpdGlvbi5zZXQoeyB4OiAwLCB5OiAwIH0pO1xuICAgIGRyYWdBbW91bnQuc2V0KHsgeDogMCwgeTogMCB9KTtcbiAgfTtcblxuICBjb25zdCBzZXR1cERyYWdnaW5nID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBtb3VzZVVwID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2V1cCcpO1xuICAgIGNvbnN0IG1vdXNlTW92ZSA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pihkb2N1bWVudCwgJ21vdXNlbW92ZScpO1xuICAgIGNvbnN0IGVsID0gZWxlbWVudCgpLmN1cnJlbnRFbGVtZW50O1xuXG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgbW91c2VNb3ZlXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKGRlc3Ryb3lSZWYpLFxuICAgICAgICB0YWtlVW50aWwobW91c2VVcCksXG4gICAgICAgIHRhcCgoZSkgPT4gdXBkYXRlRHJhZ2dpbmcoZSkpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgbW91c2VVcFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZChkZXN0cm95UmVmKSxcbiAgICAgICAgdGFwKCgpID0+IHVwZGF0ZURyYWdnaW5nRW5kKCkpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgaW5pdGlhbERyYWdQb3NpdGlvbi5zZXQoeyB4OiBlLmNsaWVudFgsIHk6IGUuY2xpZW50WSB9KTtcbiAgICBpbml0aWFsU2Nyb2xsUG9zaXRpb24uc2V0KHsgeDogZWwuc2Nyb2xsTGVmdCwgeTogZWwuc2Nyb2xsVG9wIH0pO1xuICAgIGlzSW5pdERyYWdnaW5nLnNldCh0cnVlKTtcbiAgfTtcblxuICB0b09ic2VydmFibGUoZWxlbWVudClcbiAgICAucGlwZShcbiAgICAgIG1hcCgoZSkgPT4gZT8uY3VycmVudEVsZW1lbnQpLFxuICAgICAgc3dpdGNoTWFwKChlbCkgPT4gKGVsID8gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGVsLCAnbW91c2Vkb3duJykgOiBvZihudWxsKSkpLFxuICAgICAgZmlsdGVyKChlKTogZSBpcyBNb3VzZUV2ZW50ID0+ICEhZSksXG4gICAgICBmaWx0ZXIoKCkgPT4gZW5hYmxlZCgpKSxcbiAgICAgIHRhcCgoZSkgPT4gc2V0dXBEcmFnZ2luZyhlKSksXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICApXG4gICAgLnN1YnNjcmliZSgpO1xuXG4gIHJldHVybiB7XG4gICAgaXNEcmFnZ2luZzogaXNEcmFnZ2luZy5hc1JlYWRvbmx5KCksXG4gICAgY3VycmVudERyYWdBbW91bnQ6IGRyYWdBbW91bnQuYXNSZWFkb25seSgpLFxuICB9O1xufTtcblxuLyoqXG4gKiBBIGNvbXB1dGVkIHRoYXQgd2lsbCBvbmx5IGJlIHJlYWN0aXZlIHVudGlsIHRoZSBzb3VyY2Ugc2lnbmFsIGNvbnRhaW5zIGEgdHJ1dGh5IHZhbHVlLlxuICogQWxsIHN1YnNlcXVlbnQgY2hhbmdlcyBpbnNpZGUgdGhlIGNvbXB1dGF0aW9uIHdpbGwgYmUgaWdub3JlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXB1dGVkVGlsbFRydXRoeSA9IDxUPihzb3VyY2U6IFNpZ25hbDxUPikgPT4ge1xuICBjb25zdCB2YWx1ZSA9IHNpZ25hbDxUIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgcmVmID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHNvdXJjZSgpO1xuXG4gICAgICBpZiAodmFsKSB7XG4gICAgICAgIHZhbHVlLnNldCh2YWwpO1xuICAgICAgICByZWYuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICApO1xuXG4gIHJldHVybiB2YWx1ZS5hc1JlYWRvbmx5KCk7XG59O1xuXG4vKipcbiAqIEEgY29tcHV0ZWQgdGhhdCB3aWxsIG9ubHkgYmUgcmVhY3RpdmUgdW50aWwgdGhlIHNvdXJjZSBzaWduYWwgY29udGFpbnMgYSBmYWxzeSB2YWx1ZS5cbiAqIEFsbCBzdWJzZXF1ZW50IGNoYW5nZXMgaW5zaWRlIHRoZSBjb21wdXRhdGlvbiB3aWxsIGJlIGlnbm9yZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wdXRlZFRpbGxGYWxzeSA9IDxUPihzb3VyY2U6IFNpZ25hbDxUPikgPT4ge1xuICBjb25zdCB2YWx1ZSA9IHNpZ25hbDxUIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgcmVmID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9IHNvdXJjZSgpO1xuXG4gICAgICBpZiAoIXZhbCkge1xuICAgICAgICB2YWx1ZS5zZXQodmFsKTtcbiAgICAgICAgcmVmLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSxcbiAgKTtcblxuICByZXR1cm4gdmFsdWUuYXNSZWFkb25seSgpO1xufTtcblxuLyoqIEluamVjdCBhIHNpZ25hbCBjb250YWluaW5nIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZSB2aWV3cG9ydCBpcyB4cyAqL1xuZXhwb3J0IGNvbnN0IGluamVjdElzWHMgPSAoKSA9PiB7XG4gIHJldHVybiB0b1NpZ25hbChpbmplY3QoVmlld3BvcnRTZXJ2aWNlKS5pc1hzJCwgeyByZXF1aXJlU3luYzogdHJ1ZSB9KTtcbn07XG5cbi8qKiBJbmplY3QgYSBzaWduYWwgY29udGFpbmluZyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgdmlld3BvcnQgaXMgc20gKi9cbmV4cG9ydCBjb25zdCBpbmplY3RJc1NtID0gKCkgPT4ge1xuICByZXR1cm4gdG9TaWduYWwoaW5qZWN0KFZpZXdwb3J0U2VydmljZSkuaXNTbSQsIHsgcmVxdWlyZVN5bmM6IHRydWUgfSk7XG59O1xuXG4vKiogSW5qZWN0IGEgc2lnbmFsIGNvbnRhaW5pbmcgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHZpZXdwb3J0IGlzIG1kICovXG5leHBvcnQgY29uc3QgaW5qZWN0SXNNZCA9ICgpID0+IHtcbiAgcmV0dXJuIHRvU2lnbmFsKGluamVjdChWaWV3cG9ydFNlcnZpY2UpLmlzTWQkLCB7IHJlcXVpcmVTeW5jOiB0cnVlIH0pO1xufTtcblxuLyoqIEluamVjdCBhIHNpZ25hbCBjb250YWluaW5nIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZSB2aWV3cG9ydCBpcyBsZyAqL1xuZXhwb3J0IGNvbnN0IGluamVjdElzTGcgPSAoKSA9PiB7XG4gIHJldHVybiB0b1NpZ25hbChpbmplY3QoVmlld3BvcnRTZXJ2aWNlKS5pc0xnJCwgeyByZXF1aXJlU3luYzogdHJ1ZSB9KTtcbn07XG5cbi8qKiBJbmplY3QgYSBzaWduYWwgY29udGFpbmluZyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgdmlld3BvcnQgaXMgeGwgKi9cbmV4cG9ydCBjb25zdCBpbmplY3RJc1hsID0gKCkgPT4ge1xuICByZXR1cm4gdG9TaWduYWwoaW5qZWN0KFZpZXdwb3J0U2VydmljZSkuaXNYbCQsIHsgcmVxdWlyZVN5bmM6IHRydWUgfSk7XG59O1xuXG4vKiogSW5qZWN0IGEgc2lnbmFsIGNvbnRhaW5pbmcgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHZpZXdwb3J0IGlzIDJ4bCAqL1xuZXhwb3J0IGNvbnN0IGluamVjdElzMlhsID0gKCkgPT4ge1xuICByZXR1cm4gdG9TaWduYWwoaW5qZWN0KFZpZXdwb3J0U2VydmljZSkuaXMyWGwkLCB7IHJlcXVpcmVTeW5jOiB0cnVlIH0pO1xufTtcblxuLyoqXG4gKiBJbmplY3QgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHZpZXdwb3J0IGlzIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICogVGhpcyB2YWx1ZSBpcyBub3QgcmVhY3RpdmUuIElmIHlvdSB3YW50IHRvIHJlYWN0IHRvIGNoYW5nZXMsIHVzZSB0aGUge0BsaW5rIGluamVjdE9ic2VydmVCcmVha3BvaW50fSBmdW5jdGlvbiBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgaW5qZWN0QnJlYWtwb2ludElzTWF0Y2hlZCA9IChvcHRpb25zOiB7IG1pbj86IG51bWJlciB8IEJyZWFrcG9pbnQ7IG1heD86IG51bWJlciB8IEJyZWFrcG9pbnQgfSkgPT4ge1xuICByZXR1cm4gaW5qZWN0KFZpZXdwb3J0U2VydmljZSkuaXNNYXRjaGVkKG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBJbmplY3QgYSBzaWduYWwgY29udGFpbmluZyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgdmlld3BvcnQgaXMgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBpbmplY3RPYnNlcnZlQnJlYWtwb2ludCA9IChvcHRpb25zOiB7IG1pbj86IG51bWJlciB8IEJyZWFrcG9pbnQ7IG1heD86IG51bWJlciB8IEJyZWFrcG9pbnQgfSkgPT4ge1xuICByZXR1cm4gdG9TaWduYWwoaW5qZWN0KFZpZXdwb3J0U2VydmljZSkub2JzZXJ2ZShvcHRpb25zKSwgeyBpbml0aWFsVmFsdWU6IGluamVjdEJyZWFrcG9pbnRJc01hdGNoZWQob3B0aW9ucykgfSk7XG59O1xuXG4vKiogSW5qZWN0IGEgc2lnbmFsIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgYnJlYWtwb2ludC4gKi9cbmV4cG9ydCBjb25zdCBpbmplY3RDdXJyZW50QnJlYWtwb2ludCA9ICgpID0+IHtcbiAgcmV0dXJuIHRvU2lnbmFsKGluamVjdChWaWV3cG9ydFNlcnZpY2UpLmN1cnJlbnRWaWV3cG9ydCQsIHtcbiAgICBpbml0aWFsVmFsdWU6IGluamVjdChWaWV3cG9ydFNlcnZpY2UpLmN1cnJlbnRWaWV3cG9ydCxcbiAgfSk7XG59O1xuIl19
|
|
877
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvdXRpbHMvc2lnbmFsLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNMLFVBQVUsRUFFVixVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULG1CQUFtQixFQUduQixlQUFlLEVBQ2YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFFBQVEsRUFDUixxQkFBcUIsRUFDckIsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXhGLE9BQU8sRUFDTCxVQUFVLEVBQ1YsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sU0FBUyxFQUNULEdBQUcsRUFDSCxLQUFLLEVBQ0wsRUFBRSxFQUNGLFFBQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQThCdEQsU0FBUyxlQUFlLENBQUMsRUFBVztJQUNsQyxJQUFJLFFBQVEsQ0FBQyxF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QUM7QUFDekUsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxPQUFpRSxFQUFFLEVBQUU7SUFDN0csT0FBTyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BELENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxPQUFpRSxFQUFFLEVBQUU7SUFDM0csT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEgsQ0FBQyxDQUFDO0FBRUYseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsRUFBRTtJQUMxQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsZ0JBQWdCLEVBQUU7UUFDeEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxlQUFlO0tBQ3RELENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZUVsZW1lbnQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgRGVzdHJveVJlZixcbiAgRWZmZWN0UmVmLFxuICBFbGVtZW50UmVmLFxuICBJbmplY3RvcixcbiAgTmdab25lLFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgUmVuZGVyZXJTdHlsZUZsYWdzMixcbiAgU2lnbmFsLFxuICBXcml0YWJsZVNpZ25hbCxcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlzRGV2TW9kZSxcbiAgaXNTaWduYWwsXG4gIHJ1bkluSW5qZWN0aW9uQ29udGV4dCxcbiAgc2lnbmFsLFxuICB1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSxcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmcm9tRXZlbnQsXG4gIG1hcCxcbiAgbWVyZ2UsXG4gIG9mLFxuICBwYWlyd2lzZSxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJvdXRlclN0YXRlU2VydmljZSwgVmlld3BvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgQnJlYWtwb2ludCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5leHRGcmFtZSB9IGZyb20gJy4vYW5pbWF0aW9uLnV0aWxzJztcbmltcG9ydCB7IGVxdWFsIH0gZnJvbSAnLi9lcXVhbC51dGlsJztcbmltcG9ydCB7IGlzRWxlbWVudFZpc2libGUgfSBmcm9tICcuL3Njcm9sbGFibGUudXRpbHMnO1xuXG50eXBlIFNpZ25hbEVsZW1lbnRCaW5kaW5nQ29tcGxleFR5cGUgPVxuICB8IEhUTUxFbGVtZW50XG4gIHwgRWxlbWVudFJlZjxIVE1MRWxlbWVudD5cbiAgfCBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudD5cbiAgfCBBcnJheTxFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IEhUTUxFbGVtZW50PlxuICB8IG51bGxcbiAgfCB1bmRlZmluZWQ7XG5cbnR5cGUgU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlID1cbiAgfCBIVE1MRWxlbWVudFxuICB8IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XG4gIHwgT2JzZXJ2YWJsZTxTaWduYWxFbGVtZW50QmluZGluZ0NvbXBsZXhUeXBlPlxuICB8IFNpZ25hbDxTaWduYWxFbGVtZW50QmluZGluZ0NvbXBsZXhUeXBlPlxuICB8IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IEhUTUxFbGVtZW50PlxuICB8IEVsZW1lbnRTaWduYWw7XG5cbnR5cGUgRWxlbWVudFNpZ25hbCA9IFNpZ25hbDx7XG4gIC8qKiBAZGVwcmVjYXRlZCBBbHdheXMgdXNlIGN1cnJlbnRFbGVtZW50cyAgKi9cbiAgY3VycmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAvKiogQGRlcHJlY2F0ZWQgQWx3YXlzIHVzZSBwcmV2aW91c0VsZW1lbnRzICAqL1xuICBwcmV2aW91c0VsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgY3VycmVudEVsZW1lbnRzOiBIVE1MRWxlbWVudFtdO1xuICBwcmV2aW91c0VsZW1lbnRzOiBIVE1MRWxlbWVudFtdO1xufT47XG5cbnR5cGUgRWxlbWVudFNpZ25hbFZhbHVlID0gUmV0dXJuVHlwZTxFbGVtZW50U2lnbmFsPjtcblxuZnVuY3Rpb24gaXNFbGVtZW50U2lnbmFsKGVsOiB1bmtub3duKTogZWwgaXMgRWxlbWVudFNpZ25hbCB7XG4gIGlmIChpc1NpZ25hbChlbCkpIHtcbiAgICBjb25zdCB2YWwgPSBlbCgpO1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgJ2N1cnJlbnRFbGVtZW50JyBpbiB2YWwgJiYgJ3ByZXZpb3VzRWxlbWVudCcgaW4gdmFsO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5jb25zdCBkb2N1bWVudEVsZW1lbnRTaWduYWwgPSAoKTogRWxlbWVudFNpZ25hbCA9PlxuICBzaWduYWwoe1xuICAgIGN1cnJlbnRFbGVtZW50OiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgcHJldmlvdXNFbGVtZW50OiBudWxsLFxuICAgIGN1cnJlbnRFbGVtZW50czogW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0sXG4gICAgcHJldmlvdXNFbGVtZW50czogW10sXG4gIH0pO1xuXG5jb25zdCBidWlsZEVsZW1lbnRTaWduYWwgPSAoZWw6IFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZSB8IG51bGwgfCB1bmRlZmluZWQpOiBFbGVtZW50U2lnbmFsID0+IHtcbiAgaWYgKGVsID09PSBudWxsIHx8IGVsID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc2lnbmFsKHsgY3VycmVudEVsZW1lbnQ6IG51bGwsIHByZXZpb3VzRWxlbWVudDogbnVsbCwgY3VycmVudEVsZW1lbnRzOiBbXSwgcHJldmlvdXNFbGVtZW50czogW10gfSk7XG4gIH1cblxuICBpZiAoaXNFbGVtZW50U2lnbmFsKGVsKSkge1xuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIGxldCBtRWxTaWduYWw6IFNpZ25hbDxIVE1MRWxlbWVudFtdIHwgbnVsbD4gfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBzd2l0Y2hFbGVtZW50ID0gKCkgPT5cbiAgICBzd2l0Y2hNYXAoKGVsT3JSZWY6IFNpZ25hbEVsZW1lbnRCaW5kaW5nQ29tcGxleFR5cGUpID0+IHtcbiAgICAgIGlmIChlbE9yUmVmIGluc3RhbmNlb2YgUXVlcnlMaXN0KSB7XG4gICAgICAgIHJldHVybiBlbE9yUmVmLmNoYW5nZXMucGlwZShcbiAgICAgICAgICBzdGFydFdpdGgoZWxPclJlZiksXG4gICAgICAgICAgbWFwKCgpID0+IGVsT3JSZWYudG9BcnJheSgpLm1hcCgocikgPT4gY29lcmNlRWxlbWVudChyKSkpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVsT3JSZWYpKSB7XG4gICAgICAgIHJldHVybiBvZihlbE9yUmVmLm1hcCgocikgPT4gY29lcmNlRWxlbWVudChyKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29lcmNlZEVsID0gY29lcmNlRWxlbWVudChlbE9yUmVmKTtcbiAgICAgICAgcmV0dXJuIG9mKGNvZXJjZWRFbCA/IFtjb2VyY2VkRWxdIDogbnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgaWYgKGVsIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgIG1FbFNpZ25hbCA9IHRvU2lnbmFsKGVsLnBpcGUoc3dpdGNoRWxlbWVudCgpKSwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIH0gZWxzZSBpZiAoaXNTaWduYWwoZWwpKSB7XG4gICAgbUVsU2lnbmFsID0gdG9TaWduYWwodG9PYnNlcnZhYmxlKGVsKS5waXBlKHN3aXRjaEVsZW1lbnQoKSksIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICB9IGVsc2UgaWYgKGVsIGluc3RhbmNlb2YgUXVlcnlMaXN0KSB7XG4gICAgbUVsU2lnbmFsID0gdG9TaWduYWwoXG4gICAgICBlbC5jaGFuZ2VzLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aChlbCksXG4gICAgICAgIG1hcCgoKSA9PiBlbC50b0FycmF5KCkubWFwKChyKSA9PiBjb2VyY2VFbGVtZW50KHIpKSksXG4gICAgICApLFxuICAgICAgeyBpbml0aWFsVmFsdWU6IG51bGwgfSxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIG1FbFNpZ25hbCA9IHNpZ25hbChbY29lcmNlRWxlbWVudChlbCldKTtcbiAgfVxuXG4gIGNvbnN0IGVsU2lnID0gdG9TaWduYWwoXG4gICAgdG9PYnNlcnZhYmxlKG1FbFNpZ25hbCkucGlwZShcbiAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgIHBhaXJ3aXNlKCksXG4gICAgICBtYXAoKFtwcmV2aW91c0VsZW1lbnRzLCBjdXJyZW50RWxlbWVudHNdKSA9PiAoe1xuICAgICAgICBwcmV2aW91c0VsZW1lbnRzOiBwcmV2aW91c0VsZW1lbnRzID8/IFtdLFxuICAgICAgICBjdXJyZW50RWxlbWVudHM6IGN1cnJlbnRFbGVtZW50cyA/PyBbXSxcbiAgICAgICAgY3VycmVudEVsZW1lbnQ6IGN1cnJlbnRFbGVtZW50cz8uWzBdID8/IG51bGwsXG4gICAgICAgIHByZXZpb3VzRWxlbWVudDogcHJldmlvdXNFbGVtZW50cz8uWzBdID8/IG51bGwsXG4gICAgICB9KSksXG4gICAgKSxcbiAgICB7IGluaXRpYWxWYWx1ZTogeyBjdXJyZW50RWxlbWVudDogbnVsbCwgcHJldmlvdXNFbGVtZW50OiBudWxsLCBwcmV2aW91c0VsZW1lbnRzOiBbXSwgY3VycmVudEVsZW1lbnRzOiBbXSB9IH0sXG4gICk7XG5cbiAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IGVsU2lnKCksIHtcbiAgICBlcXVhbDogKGEsIGIpID0+XG4gICAgICBhLmN1cnJlbnRFbGVtZW50ID09PSBiLmN1cnJlbnRFbGVtZW50ICYmXG4gICAgICBhLnByZXZpb3VzRWxlbWVudCA9PT0gYi5wcmV2aW91c0VsZW1lbnQgJiZcbiAgICAgIGEuY3VycmVudEVsZW1lbnRzLmxlbmd0aCA9PT0gYi5jdXJyZW50RWxlbWVudHMubGVuZ3RoICYmXG4gICAgICBhLmN1cnJlbnRFbGVtZW50cy5ldmVyeSgodiwgaSkgPT4gdiA9PT0gYi5jdXJyZW50RWxlbWVudHNbaV0pICYmXG4gICAgICBhLnByZXZpb3VzRWxlbWVudHMubGVuZ3RoID09PSBiLnByZXZpb3VzRWxlbWVudHMubGVuZ3RoICYmXG4gICAgICBhLnByZXZpb3VzRWxlbWVudHMuZXZlcnkoKHYsIGkpID0+IHYgPT09IGIucHJldmlvdXNFbGVtZW50c1tpXSksXG4gIH0pO1xufTtcblxuY29uc3QgZmlyc3RFbGVtZW50U2lnbmFsID0gKGVsOiBFbGVtZW50U2lnbmFsKSA9PiB7XG4gIHJldHVybiBjb21wdXRlZChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gZWwoKTtcblxuICAgICAgaWYgKGN1cnJlbnQuY3VycmVudEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdNb3JlIHRoYW4gb25lIGVsZW1lbnQgaXMgYm91bmQgdG8gdGhlIHNpZ25hbC4gT25seSB0aGUgZmlyc3QgZWxlbWVudCB3aWxsIGJlIHVzZWQuJyxcbiAgICAgICAgICBjdXJyZW50LmN1cnJlbnRFbGVtZW50cyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VyciA9IGN1cnJlbnQuY3VycmVudEVsZW1lbnRzWzBdID8/IG51bGw7XG4gICAgICBjb25zdCBwcmV2ID0gY3VycmVudC5wcmV2aW91c0VsZW1lbnRzWzBdID8/IG51bGw7XG5cbiAgICAgIHJldHVybiB7IGN1cnJlbnRFbGVtZW50OiBjdXJyLCBwcmV2aW91c0VsZW1lbnQ6IHByZXYgfTtcbiAgICB9LFxuICAgIHsgZXF1YWw6IChhLCBiKSA9PiBhLmN1cnJlbnRFbGVtZW50ID09PSBiLmN1cnJlbnRFbGVtZW50ICYmIGEucHJldmlvdXNFbGVtZW50ID09PSBiLnByZXZpb3VzRWxlbWVudCB9LFxuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZFNpZ25hbEVmZmVjdHNDb25maWc8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+IHtcbiAgLyoqIFRoZSB0b2tlbnMgdG8gYXBwbHkgYW5kIHRoZWlyIHNpZ25hbCB2YWx1ZSAgKi9cbiAgdG9rZW5NYXA6IFQ7XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGZvciBlbGVtZW50cyB0aGF0IHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBzaWduYWwgZWZmZWN0cyAqL1xuICBjbGVhbnVwRm46IChlbDogSFRNTEVsZW1lbnQsIHRva2Vuczogc3RyaW5nW10pID0+IHZvaWQ7XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIGZvciBlbGVtZW50cyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIHNpZ25hbCBlZmZlY3RzIG9yIHdoZW4gdGhlaXIgc2lnbmFsIHZhbHVlIGNoYW5nZXMgKi9cbiAgdXBkYXRlRm46IChlbDogSFRNTEVsZW1lbnQsIHRva2Vuczogc3RyaW5nW10sIGNvbmRpdGlvblJlc3VsdDogdW5rbm93bikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IGJ1aWxkU2lnbmFsRWZmZWN0cyA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+Pj4oXG4gIGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsXG4gIGNvbmZpZzogQnVpbGRTaWduYWxFZmZlY3RzQ29uZmlnPFQ+LFxuKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gYnVpbGRFbGVtZW50U2lnbmFsKGVsKTtcbiAgY29uc3QgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gIGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgeyBjdXJyZW50RWxlbWVudHMsIHByZXZpb3VzRWxlbWVudHMgfSA9IGVsZW1lbnRzKCk7XG5cbiAgICBmb3IgKGNvbnN0IHByZXZpb3VzRWwgb2YgcHJldmlvdXNFbGVtZW50cykge1xuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50cy5pbmNsdWRlcyhwcmV2aW91c0VsKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHRva2VucyA9IE9iamVjdC5rZXlzKGNvbmZpZy50b2tlbk1hcClcbiAgICAgICAgLm1hcCgoa2V5KSA9PiBrZXkuc3BsaXQoJyAnKSlcbiAgICAgICAgLmZsYXQoKTtcblxuICAgICAgaWYgKCF0b2tlbnMubGVuZ3RoKSBjb250aW51ZTtcblxuICAgICAgY29uZmlnLmNsZWFudXBGbihwcmV2aW91c0VsLCB0b2tlbnMpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY3VycmVudEVsIG9mIGN1cnJlbnRFbGVtZW50cykge1xuICAgICAgaWYgKHByZXZpb3VzRWxlbWVudHMuaW5jbHVkZXMoY3VycmVudEVsKSkgY29udGludWU7XG5cbiAgICAgIGZvciAoY29uc3QgW3Rva2VucywgY29uZGl0aW9uXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcudG9rZW5NYXApKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdG9rZW5BcnJheSA9IHRva2Vucy5zcGxpdCgnICcpO1xuICAgICAgICAgIGlmICghdG9rZW5BcnJheS5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgIGNvbmZpZy51cGRhdGVGbihjdXJyZW50RWwsIHRva2VuQXJyYXksIGNvbmRpdGlvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBlZmZlY3RzOiBSZWNvcmQ8c3RyaW5nLCBFZmZlY3RSZWY+ID0ge307XG5cbiAgY29uc3QgaGFzID0gKHRva2Vuczogc3RyaW5nKSA9PiB0b2tlbnMgaW4gZWZmZWN0cztcblxuICBjb25zdCBwdXNoID0gKHRva2Vuczogc3RyaW5nLCBzaWduYWw6IFNpZ25hbDx1bmtub3duPikgPT4ge1xuICAgIGlmIChoYXModG9rZW5zKSkgcmV0dXJuO1xuXG4gICAgcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCAoKSA9PiB7XG4gICAgICBlZmZlY3RzW3Rva2Vuc10gPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGN1cnJlbnRFbGVtZW50cyB9ID0gdW50cmFja2VkKCgpID0+IGVsZW1lbnRzKCkpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHNpZ25hbCgpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZWwgb2YgY3VycmVudEVsZW1lbnRzKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW5BcnJheSA9IHRva2Vucy5zcGxpdCgnICcpO1xuICAgICAgICAgIGlmICghdG9rZW5BcnJheS5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uZmlnLnVwZGF0ZUZuKGVsLCB0b2tlbkFycmF5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHB1c2hNYW55ID0gKG1hcDogUmVjb3JkPHN0cmluZywgU2lnbmFsPHVua25vd24+PikgPT4ge1xuICAgIGZvciAoY29uc3QgW3Rva2Vucywgc2lnbmFsXSBvZiBPYmplY3QuZW50cmllcyhtYXApKSB7XG4gICAgICBwdXNoKHRva2Vucywgc2lnbmFsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlID0gKHRva2Vuczogc3RyaW5nKSA9PiB7XG4gICAgZWZmZWN0c1t0b2tlbnNdPy5kZXN0cm95KCk7XG5cbiAgICBkZWxldGUgZWZmZWN0c1t0b2tlbnNdO1xuXG4gICAgZm9yIChjb25zdCBlbCBvZiBlbGVtZW50cygpLmN1cnJlbnRFbGVtZW50cykge1xuICAgICAgY29uc3QgdG9rZW5BcnJheSA9IHRva2Vucy5zcGxpdCgnICcpO1xuICAgICAgaWYgKCF0b2tlbkFycmF5Lmxlbmd0aCkgY29udGludWU7XG5cbiAgICAgIGNvbmZpZy5jbGVhbnVwRm4oZWwsIHRva2VuQXJyYXkpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCByZW1vdmVNYW55ID0gKHRva2Vuczogc3RyaW5nW10pID0+IHtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgcmVtb3ZlKHRva2VuKTtcbiAgICB9XG4gIH07XG5cbiAgcHVzaE1hbnkoY29uZmlnLnRva2VuTWFwKTtcblxuICByZXR1cm4geyByZW1vdmUsIHJlbW92ZU1hbnksIGhhcywgcHVzaCwgcHVzaE1hbnkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxJc1JlbmRlcmVkID0gKCkgPT4ge1xuICBjb25zdCBpc1JlbmRlcmVkID0gc2lnbmFsKGZhbHNlKTtcblxuICBhZnRlck5leHRSZW5kZXIoKCkgPT4gaXNSZW5kZXJlZC5zZXQodHJ1ZSkpO1xuXG4gIHJldHVybiBpc1JlbmRlcmVkLmFzUmVhZG9ubHkoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxDbGFzc2VzID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8dW5rbm93bj4+PihlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlLCBjbGFzc01hcDogVCkgPT4ge1xuICBjb25zdCByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gIHJldHVybiBidWlsZFNpZ25hbEVmZmVjdHMoZWwsIHtcbiAgICB0b2tlbk1hcDogY2xhc3NNYXAsXG4gICAgY2xlYW51cEZuOiAoZWwsIHRva2VucykgPT4gdG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiByZW5kZXJlci5yZW1vdmVDbGFzcyhlbCwgdG9rZW4pKSxcbiAgICB1cGRhdGVGbjogKGVsLCB0b2tlbnMsIGNvbmRpdGlvbikgPT4ge1xuICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgdG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiByZW5kZXJlci5yZW1vdmVDbGFzcyhlbCwgdG9rZW4pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRva2Vucy5mb3JFYWNoKCh0b2tlbikgPT4gcmVuZGVyZXIuYWRkQ2xhc3MoZWwsIHRva2VuKSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdENsYXNzZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGNsYXNzTWFwOiBUKSA9PlxuICBzaWduYWxDbGFzc2VzKGluamVjdChFbGVtZW50UmVmKSwgY2xhc3NNYXApO1xuXG5jb25zdCBBTFdBWVNfVFJVRV9BVFRSSUJVVEVfS0VZUyA9IFsnZGlzYWJsZWQnLCAncmVhZG9ubHknLCAncmVxdWlyZWQnLCAnY2hlY2tlZCcsICdzZWxlY3RlZCcsICdoaWRkZW4nLCAnaW5lcnQnXTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEF0dHJpYnV0ZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KFxuICBlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlLFxuICBhdHRyaWJ1dGVNYXA6IFQsXG4pID0+IHtcbiAgY29uc3QgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuICByZXR1cm4gYnVpbGRTaWduYWxFZmZlY3RzKGVsLCB7XG4gICAgdG9rZW5NYXA6IGF0dHJpYnV0ZU1hcCxcbiAgICBjbGVhbnVwRm46IChlbCwgdG9rZW5zKSA9PiB0b2tlbnMuZm9yRWFjaCgodG9rZW4pID0+IGVsLnJlbW92ZUF0dHJpYnV0ZSh0b2tlbikpLFxuICAgIHVwZGF0ZUZuOiAoZWwsIHRva2VucywgY29uZGl0aW9uKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBpZiAoQUxXQVlTX1RSVUVfQVRUUklCVVRFX0tFWVMuaW5jbHVkZXModG9rZW4pKSB7XG4gICAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsLCB0b2tlbiwgJycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUoZWwsIHRva2VuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBudWxsIHx8IGNvbmRpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGVsLCB0b2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKGVsLCB0b2tlbiwgYCR7Y29uZGl0aW9ufWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdEF0dHJpYnV0ZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGF0dHJpYnV0ZU1hcDogVCkgPT5cbiAgc2lnbmFsQXR0cmlidXRlcyhpbmplY3QoRWxlbWVudFJlZiksIGF0dHJpYnV0ZU1hcCk7XG5cbmV4cG9ydCBjb25zdCBzaWduYWxTdHlsZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsIHN0eWxlTWFwOiBUKSA9PiB7XG4gIGNvbnN0IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgcmV0dXJuIGJ1aWxkU2lnbmFsRWZmZWN0cyhlbCwge1xuICAgIHRva2VuTWFwOiBzdHlsZU1hcCxcbiAgICBjbGVhbnVwRm46IChlbCwgdG9rZW5zKSA9PiB0b2tlbnMuZm9yRWFjaCgodG9rZW4pID0+IHJlbmRlcmVyLnJlbW92ZVN0eWxlKGVsLCB0b2tlbikpLFxuICAgIHVwZGF0ZUZuOiAoZWwsIHRva2VucywgY29uZGl0aW9uKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBudWxsIHx8IGNvbmRpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVuZGVyZXIucmVtb3ZlU3R5bGUoZWwsIHRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgdG9rZW4sIGAke2NvbmRpdGlvbn1gLCBSZW5kZXJlclN0eWxlRmxhZ3MyLkRhc2hDYXNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEhvc3RTdHlsZXMgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFNpZ25hbDx1bmtub3duPj4+KHN0eWxlTWFwOiBUKSA9PlxuICBzaWduYWxTdHlsZXMoaW5qZWN0KEVsZW1lbnRSZWYpLCBzdHlsZU1hcCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNhbFNpemUge1xuICBpbmxpbmVTaXplOiBudW1iZXI7XG4gIGJsb2NrU2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBFbGVtZW50UmVjdCA9IHtcbiAgYm90dG9tOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBsZWZ0OiBudW1iZXI7XG4gIHJpZ2h0OiBudW1iZXI7XG4gIHRvcDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEVsZW1lbnRTaXplID0ge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBib3VuZGluZ0NsaWVudFJlY3RUb0VsZW1lbnRSZWN0ID0gKHJlY3Q6IERPTVJlY3RSZWFkT25seSk6IEVsZW1lbnRSZWN0ID0+ICh7XG4gIGJvdHRvbTogcmVjdC5ib3R0b20sXG4gIGhlaWdodDogcmVjdC5oZWlnaHQsXG4gIGxlZnQ6IHJlY3QubGVmdCxcbiAgcmlnaHQ6IHJlY3QucmlnaHQsXG4gIHRvcDogcmVjdC50b3AsXG4gIHdpZHRoOiByZWN0LndpZHRoLFxuICB4OiByZWN0LngsXG4gIHk6IHJlY3QueSxcbn0pO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRWxlbWVudERpbWVuc2lvbnMgPSAoZWw6IEhUTUxFbGVtZW50IHwgbnVsbCwgcmVjdD86IERPTVJlY3QpOiBOdWxsYWJsZUVsZW1lbnREaW1lbnNpb25zID0+IHtcbiAgaWYgKCFlbCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWN0OiBudWxsLFxuICAgICAgY2xpZW50OiBudWxsLFxuICAgICAgc2Nyb2xsOiBudWxsLFxuICAgICAgb2Zmc2V0OiBudWxsLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlY3Q6IHJlY3QgPyBib3VuZGluZ0NsaWVudFJlY3RUb0VsZW1lbnRSZWN0KHJlY3QpIDogYm91bmRpbmdDbGllbnRSZWN0VG9FbGVtZW50UmVjdChlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksXG4gICAgY2xpZW50OiB7IHdpZHRoOiBlbC5jbGllbnRXaWR0aCwgaGVpZ2h0OiBlbC5jbGllbnRIZWlnaHQgfSxcbiAgICBzY3JvbGw6IHsgd2lkdGg6IGVsLnNjcm9sbFdpZHRoLCBoZWlnaHQ6IGVsLnNjcm9sbEhlaWdodCB9LFxuICAgIG9mZnNldDogeyB3aWR0aDogZWwub2Zmc2V0V2lkdGgsIGhlaWdodDogZWwub2Zmc2V0SGVpZ2h0IH0sXG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBFbGVtZW50RGltZW5zaW9ucyA9IHtcbiAgcmVjdDogRWxlbWVudFJlY3Q7XG4gIGNsaWVudDogRWxlbWVudFNpemU7XG4gIHNjcm9sbDogRWxlbWVudFNpemU7XG4gIG9mZnNldDogRWxlbWVudFNpemU7XG59O1xuXG5leHBvcnQgdHlwZSBOdWxsYWJsZUVsZW1lbnREaW1lbnNpb25zID0ge1xuICBbSyBpbiBrZXlvZiBFbGVtZW50RGltZW5zaW9uc106IEVsZW1lbnREaW1lbnNpb25zW0tdIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxFbGVtZW50RGltZW5zaW9ucyA9IChlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlKSA9PiB7XG4gIGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIGNvbnN0IGVsZW1lbnRzID0gYnVpbGRFbGVtZW50U2lnbmFsKGVsKTtcbiAgY29uc3Qgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBjb25zdCBpc1JlbmRlcmVkID0gc2lnbmFsSXNSZW5kZXJlZCgpO1xuXG4gIGNvbnN0IGluaXRpYWxWYWx1ZSA9ICgpID0+IGNyZWF0ZUVsZW1lbnREaW1lbnNpb25zKGVsZW1lbnRzKCkuY3VycmVudEVsZW1lbnQpO1xuXG4gIGNvbnN0IGVsZW1lbnREaW1lbnNpb25zU2lnbmFsID0gc2lnbmFsPE51bGxhYmxlRWxlbWVudERpbWVuc2lvbnM+KGluaXRpYWxWYWx1ZSgpKTtcblxuICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZSkgPT4ge1xuICAgIGlmICghaXNSZW5kZXJlZCgpKSByZXR1cm47XG5cbiAgICBjb25zdCBlbnRyeSA9IGVbMF07XG5cbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGVudHJ5LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IG5ld0RpbWVuc2lvbnMgPSBjcmVhdGVFbGVtZW50RGltZW5zaW9ucyh0YXJnZXQpO1xuXG4gICAgICB6b25lLnJ1bigoKSA9PiBlbGVtZW50RGltZW5zaW9uc1NpZ25hbC5zZXQobmV3RGltZW5zaW9ucykpO1xuICAgIH1cbiAgfSk7XG5cbiAgZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGVscyA9IGVsZW1lbnRzKCk7XG5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGVsZW1lbnREaW1lbnNpb25zU2lnbmFsLnNldChpbml0aWFsVmFsdWUoKSk7XG5cbiAgICAgICAgaWYgKGVscy5wcmV2aW91c0VsZW1lbnQpIHtcbiAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZWxzLmN1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgY29tcHV0ZWREaXNwbGF5ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbHMuY3VycmVudEVsZW1lbnQpLmRpc3BsYXk7XG4gICAgICAgICAgY29uc3QgY3VycmVudEVsSXNBbmd1bGFyQ29tcG9uZW50ID0gZWxzLmN1cnJlbnRFbGVtZW50Py50YWdOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJy0nKTtcblxuICAgICAgICAgIGlmIChjb21wdXRlZERpc3BsYXkgPT09ICdpbmxpbmUnICYmIGlzRGV2TW9kZSgpICYmIGN1cnJlbnRFbElzQW5ndWxhckNvbXBvbmVudCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgYEVsZW1lbnQgPCR7ZWxzLmN1cnJlbnRFbGVtZW50Py50YWdOYW1lLnRvTG93ZXJDYXNlKCl9PiBpcyBhbiBBbmd1bGFyIGNvbXBvbmVudCBhbmQgaGFzIGEgZGlzcGxheSBvZiAnaW5saW5lJy4gSW5saW5lIGVsZW1lbnRzIGNhbm5vdCBiZSBvYnNlcnZlZCBmb3IgZGltZW5zaW9ucy4gUGxlYXNlIGNoYW5nZSBpdCB0byAnYmxvY2snIG9yIHNvbWV0aGluZyBlbHNlLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZWxzLmN1cnJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICk7XG5cbiAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpKTtcblxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gZWxlbWVudERpbWVuc2lvbnNTaWduYWwoKSwge1xuICAgIGVxdWFsOiAoYSwgYikgPT4gZXF1YWwoYSwgYiksXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEhvc3RFbGVtZW50RGltZW5zaW9ucyA9ICgpID0+IHNpZ25hbEVsZW1lbnREaW1lbnNpb25zKGluamVjdChFbGVtZW50UmVmKSk7XG5cbmV4cG9ydCBjb25zdCBzaWduYWxFbGVtZW50TXV0YXRpb25zID0gKGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsIG9wdGlvbnM/OiBNdXRhdGlvbk9ic2VydmVySW5pdCkgPT4ge1xuICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBjb25zdCBlbGVtZW50cyA9IGJ1aWxkRWxlbWVudFNpZ25hbChlbCk7XG4gIGNvbnN0IHpvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgY29uc3QgaXNSZW5kZXJlZCA9IHNpZ25hbElzUmVuZGVyZWQoKTtcblxuICBjb25zdCBlbGVtZW50TXV0YXRpb25zU2lnbmFsID0gc2lnbmFsPE11dGF0aW9uUmVjb3JkIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoZSkgPT4ge1xuICAgIGlmICghaXNSZW5kZXJlZCgpKSByZXR1cm47XG5cbiAgICBjb25zdCBlbnRyeSA9IGVbMF07XG5cbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIHpvbmUucnVuKCgpID0+IGVsZW1lbnRNdXRhdGlvbnNTaWduYWwuc2V0KGVudHJ5KSk7XG4gICAgfVxuICB9KTtcblxuICBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZWxzID0gZWxlbWVudHMoKTtcblxuICAgICAgZWxlbWVudE11dGF0aW9uc1NpZ25hbC5zZXQobnVsbCk7XG5cbiAgICAgIGlmIChlbHMucHJldmlvdXNFbGVtZW50KSB7XG4gICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVscy5jdXJyZW50RWxlbWVudCkge1xuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGVscy5jdXJyZW50RWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICk7XG5cbiAgZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpKTtcblxuICByZXR1cm4gZWxlbWVudE11dGF0aW9uc1NpZ25hbC5hc1JlYWRvbmx5KCk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdEVsZW1lbnRNdXRhdGlvbnMgPSAob3B0aW9ucz86IE11dGF0aW9uT2JzZXJ2ZXJJbml0KSA9PlxuICBzaWduYWxFbGVtZW50TXV0YXRpb25zKGluamVjdChFbGVtZW50UmVmKSwgb3B0aW9ucyk7XG5cbmV4cG9ydCB0eXBlIFNpZ25hbEVsZW1lbnRTY3JvbGxTdGF0ZU9wdGlvbnMgPSB7XG4gIC8qKiBUaGUgaW5pdGlhbCBzY3JvbGwgcG9zaXRpb24gdG8gc2Nyb2xsIHRvLiBPbmNlIGEgdHJ1dGh5IHZhbHVlIGdldCdzIGVtaXR0ZWQsIGFsbCBmdXJ0aGVyIHZhbHVlcyB3aWxsIGJlIGlnbm9yZWQuICovXG4gIGluaXRpYWxTY3JvbGxQb3NpdGlvbj86IFNpZ25hbDxTY3JvbGxUb09wdGlvbnMgfCBudWxsPjtcbn07XG5cbmV4cG9ydCB0eXBlIEVsZW1lbnRTY3JvbGxTdGF0ZSA9IHtcbiAgY2FuU2Nyb2xsOiBib29sZWFuO1xuICBjYW5TY3JvbGxIb3Jpem9udGFsbHk6IGJvb2xlYW47XG4gIGNhblNjcm9sbFZlcnRpY2FsbHk6IGJvb2xlYW47XG4gIGVsZW1lbnREaW1lbnNpb25zOiBOdWxsYWJsZUVsZW1lbnREaW1lbnNpb25zO1xufTtcblxuZXhwb3J0IGNvbnN0IGFyZVNjcm9sbFN0YXRlc0VxdWFsID0gKGE6IEVsZW1lbnRTY3JvbGxTdGF0ZSwgYjogRWxlbWVudFNjcm9sbFN0YXRlKSA9PiB7XG4gIHJldHVybiAoXG4gICAgYS5jYW5TY3JvbGwgPT09IGIuY2FuU2Nyb2xsICYmXG4gICAgYS5jYW5TY3JvbGxIb3Jpem9udGFsbHkgPT09IGIuY2FuU2Nyb2xsSG9yaXpvbnRhbGx5ICYmXG4gICAgYS5jYW5TY3JvbGxWZXJ0aWNhbGx5ID09PSBiLmNhblNjcm9sbFZlcnRpY2FsbHkgJiZcbiAgICBlcXVhbChhLmVsZW1lbnREaW1lbnNpb25zLCBiLmVsZW1lbnREaW1lbnNpb25zKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEVsZW1lbnRTY3JvbGxTdGF0ZSA9IChlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlLCBvcHRpb25zPzogU2lnbmFsRWxlbWVudFNjcm9sbFN0YXRlT3B0aW9ucykgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IGJ1aWxkRWxlbWVudFNpZ25hbChlbCk7XG4gIGNvbnN0IG9ic2VydmVkRWwgPSBmaXJzdEVsZW1lbnRTaWduYWwoZWxlbWVudHMpO1xuICBjb25zdCBlbGVtZW50RGltZW5zaW9ucyA9IHNpZ25hbEVsZW1lbnREaW1lbnNpb25zKGVsZW1lbnRzKTtcbiAgY29uc3QgZWxlbWVudE11dGF0aW9ucyA9IHNpZ25hbEVsZW1lbnRNdXRhdGlvbnMoZWxlbWVudHMsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICBjb25zdCBpc1JlbmRlcmVkID0gc2lnbmFsSXNSZW5kZXJlZCgpO1xuXG4gIGNvbnN0IGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9IG9wdGlvbnM/LmluaXRpYWxTY3JvbGxQb3NpdGlvbjtcblxuICBpZiAoaW5pdGlhbFNjcm9sbFBvc2l0aW9uKSB7XG4gICAgY29uc3QgcmVmID0gZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghaXNSZW5kZXJlZCgpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gaW5pdGlhbFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gb2JzZXJ2ZWRFbCgpLmN1cnJlbnRFbGVtZW50O1xuXG4gICAgICBpZiAoc2Nyb2xsUG9zaXRpb24gJiYgZWxlbWVudCkge1xuICAgICAgICBpZiAoc2Nyb2xsUG9zaXRpb24ubGVmdCAhPT0gdW5kZWZpbmVkKSBlbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxQb3NpdGlvbi5sZWZ0O1xuICAgICAgICBpZiAoc2Nyb2xsUG9zaXRpb24udG9wICE9PSB1bmRlZmluZWQpIGVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsUG9zaXRpb24udG9wO1xuICAgICAgICByZWYuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3Qgbm90U2Nyb2xsYWJsZSA9IChkaW1lbnNpb25zOiBOdWxsYWJsZUVsZW1lbnREaW1lbnNpb25zKSA9PiAoe1xuICAgIGNhblNjcm9sbDogZmFsc2UsXG4gICAgY2FuU2Nyb2xsSG9yaXpvbnRhbGx5OiBmYWxzZSxcbiAgICBjYW5TY3JvbGxWZXJ0aWNhbGx5OiBmYWxzZSxcbiAgICBlbGVtZW50RGltZW5zaW9uczogZGltZW5zaW9ucyxcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbXB1dGVkPEVsZW1lbnRTY3JvbGxTdGF0ZT4oXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IG9ic2VydmVkRWwoKS5jdXJyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBlbGVtZW50RGltZW5zaW9ucygpO1xuXG4gICAgICAvLyBXZSBhcmUgbm90IGludGVyZXN0ZWQgd2hhdCB0aGUgbXV0YXRpb24gaXMsIGp1c3QgdGhhdCB0aGVyZSBpcyBvbmUuXG4gICAgICAvLyBDaGFuZ2VzIHRvIHRoZSBET00gY2FuIGFmZmVjdCB0aGUgc2Nyb2xsIHN0YXRlIG9mIHRoZSBlbGVtZW50LlxuICAgICAgZWxlbWVudE11dGF0aW9ucygpO1xuXG4gICAgICBpZiAoIWVsZW1lbnQgfHwgIWlzUmVuZGVyZWQoKSkgcmV0dXJuIG5vdFNjcm9sbGFibGUoZGltZW5zaW9ucyk7XG5cbiAgICAgIGNvbnN0IHsgc2Nyb2xsV2lkdGgsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0LCBjbGllbnRXaWR0aCB9ID0gZWxlbWVudDtcblxuICAgICAgY29uc3QgY2FuU2Nyb2xsSG9yaXpvbnRhbGx5ID0gc2Nyb2xsV2lkdGggPiBjbGllbnRXaWR0aDtcbiAgICAgIGNvbnN0IGNhblNjcm9sbFZlcnRpY2FsbHkgPSBzY3JvbGxIZWlnaHQgPiBjbGllbnRIZWlnaHQ7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhblNjcm9sbDogY2FuU2Nyb2xsSG9yaXpvbnRhbGx5IHx8IGNhblNjcm9sbFZlcnRpY2FsbHksXG4gICAgICAgIGNhblNjcm9sbEhvcml6b250YWxseSxcbiAgICAgICAgY2FuU2Nyb2xsVmVydGljYWxseSxcbiAgICAgICAgZWxlbWVudERpbWVuc2lvbnM6IGRpbWVuc2lvbnMsXG4gICAgICB9O1xuICAgIH0sXG4gICAgeyBlcXVhbDogKGEsIGIpID0+IGFyZVNjcm9sbFN0YXRlc0VxdWFsKGEsIGIpIH0sXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbmFsSG9zdEVsZW1lbnRTY3JvbGxTdGF0ZSA9ICgpID0+IHNpZ25hbEVsZW1lbnRTY3JvbGxTdGF0ZShpbmplY3QoRWxlbWVudFJlZikpO1xuXG5leHBvcnQgdHlwZSBTaWduYWxFbGVtZW50SW50ZXJzZWN0aW9uT3B0aW9ucyA9IE9taXQ8SW50ZXJzZWN0aW9uT2JzZXJ2ZXJJbml0LCAncm9vdCc+ICYge1xuICByb290PzogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlO1xuICBlbmFibGVkPzogU2lnbmFsPGJvb2xlYW4+O1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb24gPSAoZWw6IFNpZ25hbEVsZW1lbnRCaW5kaW5nVHlwZSwgb3B0aW9ucz86IFNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb25PcHRpb25zKSA9PiB7XG4gIGNvbnN0IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIGNvbnN0IGVsZW1lbnRzID0gYnVpbGRFbGVtZW50U2lnbmFsKGVsKTtcbiAgY29uc3Qgcm9vdCA9IGZpcnN0RWxlbWVudFNpZ25hbChvcHRpb25zPy5yb290ID8gYnVpbGRFbGVtZW50U2lnbmFsKG9wdGlvbnM/LnJvb3QpIDogZG9jdW1lbnRFbGVtZW50U2lnbmFsKCkpO1xuICBjb25zdCB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIGNvbnN0IGlzUmVuZGVyZWQgPSBzaWduYWxJc1JlbmRlcmVkKCk7XG4gIGNvbnN0IGlzRW5hYmxlZCA9IG9wdGlvbnM/LmVuYWJsZWQgPz8gc2lnbmFsKHRydWUpO1xuXG4gIGNvbnN0IGVsZW1lbnRJbnRlcnNlY3Rpb25TaWduYWwgPSBzaWduYWw8SW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeVtdPihbXSk7XG4gIGNvbnN0IG9ic2VydmVyID0gc2lnbmFsPEludGVyc2VjdGlvbk9ic2VydmVyIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3QgY3VycmVudGx5T2JzZXJ2ZWRFbGVtZW50cyA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgY29uc3QgdXBkYXRlSW50ZXJzZWN0aW9ucyA9IChlbnRyaWVzOiBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5W10pID0+IHtcbiAgICBsZXQgY3VycmVudFZhbHVlcyA9IFsuLi5lbGVtZW50SW50ZXJzZWN0aW9uU2lnbmFsKCldO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0VudHJ5SW5kZXggPSBjdXJyZW50VmFsdWVzLmZpbmRJbmRleCgodikgPT4gdi50YXJnZXQgPT09IGVudHJ5LnRhcmdldCk7XG5cbiAgICAgIC8vIFJvdW5kIHRoZSBpbnRlcnNlY3Rpb24gcmF0aW8gdG8gdGhlIG5lYXJlc3QgMC4wMSB0byBhdm9pZCBmbG9hdGluZyBwb2ludCBlcnJvcnMgYW5kIHN5c3RlbSBzY2FsaW5nIGlzc3Vlcy5cbiAgICAgIGNvbnN0IHJvdW5kZWRJbnRlcnNlY3Rpb25SYXRpbyA9IE1hdGgucm91bmQoZW50cnkuaW50ZXJzZWN0aW9uUmF0aW8gKiAxMDApIC8gMTAwO1xuXG4gICAgICBjb25zdCBpbnRlcnNlY3Rpb25FbnRyeTogSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSA9IHtcbiAgICAgICAgYm91bmRpbmdDbGllbnRSZWN0OiBlbnRyeS5ib3VuZGluZ0NsaWVudFJlY3QsXG4gICAgICAgIGludGVyc2VjdGlvblJhdGlvOiByb3VuZGVkSW50ZXJzZWN0aW9uUmF0aW8sXG4gICAgICAgIGludGVyc2VjdGlvblJlY3Q6IGVudHJ5LmludGVyc2VjdGlvblJlY3QsXG4gICAgICAgIGlzSW50ZXJzZWN0aW5nOiBlbnRyeS5pc0ludGVyc2VjdGluZyxcbiAgICAgICAgcm9vdEJvdW5kczogZW50cnkucm9vdEJvdW5kcyxcbiAgICAgICAgdGFyZ2V0OiBlbnRyeS50YXJnZXQsXG4gICAgICAgIHRpbWU6IGVudHJ5LnRpbWUsXG4gICAgICB9O1xuXG4gICAgICBpZiAoZXhpc3RpbmdFbnRyeUluZGV4ICE9PSAtMSkge1xuICAgICAgICBjdXJyZW50VmFsdWVzID0gW1xuICAgICAgICAgIC4uLmN1cnJlbnRWYWx1ZXMuc2xpY2UoMCwgZXhpc3RpbmdFbnRyeUluZGV4KSxcbiAgICAgICAgICBpbnRlcnNlY3Rpb25FbnRyeSxcbiAgICAgICAgICAuLi5jdXJyZW50VmFsdWVzLnNsaWNlKGV4aXN0aW5nRW50cnlJbmRleCArIDEpLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudFZhbHVlcyA9IFsuLi5jdXJyZW50VmFsdWVzLCBpbnRlcnNlY3Rpb25FbnRyeV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgem9uZS5ydW4oKCkgPT4gZWxlbWVudEludGVyc2VjdGlvblNpZ25hbC5zZXQoY3VycmVudFZhbHVlcykpO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZUludGVyc2VjdGlvbk9ic2VydmVyID0gKHJlbmRlcmVkOiBib29sZWFuLCBlbmFibGVkOiBib29sZWFuLCByb290RWw6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgIG9ic2VydmVyKCk/LmRpc2Nvbm5lY3QoKTtcbiAgICBjdXJyZW50bHlPYnNlcnZlZEVsZW1lbnRzLmNsZWFyKCk7XG5cbiAgICBpZiAoIXJlbmRlcmVkIHx8ICFlbmFibGVkIHx8ICFyb290RWwpIHtcbiAgICAgIG9ic2VydmVyLnNldChudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdPYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4gdXBkYXRlSW50ZXJzZWN0aW9ucyhlbnRyaWVzKSwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHJvb3Q6IHJvb3RFbCxcbiAgICB9KTtcblxuICAgIG9ic2VydmVyLnNldChuZXdPYnNlcnZlcik7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlT2JzZXJ2ZWRFbGVtZW50cyA9IChvYnNlcnZlcjogSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgfCBudWxsLCBlbGVtZW50czogRWxlbWVudFNpZ25hbFZhbHVlKSA9PiB7XG4gICAgY29uc3Qgcm9vdEVsID0gcm9vdCgpLmN1cnJlbnRFbGVtZW50O1xuICAgIGNvbnN0IHJvb3RCb3VuZHMgPSByb290RWw/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgaWYgKCFvYnNlcnZlciB8fCAhcm9vdEVsKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJySW50ZXJzZWNpb25WYWx1ZSA9IGVsZW1lbnRJbnRlcnNlY3Rpb25TaWduYWwoKTtcbiAgICBjb25zdCBuZXdJbnRlcnNlY3Rpb25WYWx1ZTogSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGVsIG9mIGVsZW1lbnRzLmN1cnJlbnRFbGVtZW50cykge1xuICAgICAgaWYgKGN1cnJlbnRseU9ic2VydmVkRWxlbWVudHMuaGFzKGVsKSkge1xuICAgICAgICBjb25zdCBleGlzdGluZ0VudHJ5SW5kZXggPSBjdXJySW50ZXJzZWNpb25WYWx1ZS5maW5kSW5kZXgoKHYpID0+IHYudGFyZ2V0ID09PSBlbCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRW50cnkgPSBjdXJySW50ZXJzZWNpb25WYWx1ZVtleGlzdGluZ0VudHJ5SW5kZXhdO1xuXG4gICAgICAgIGlmICghZXhpc3RpbmdFbnRyeSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGZpbmQgZXhpc3RpbmcgZW50cnkgZm9yIGVsZW1lbnQuIFRoZSBpbnRlcnNlY3Rpb24gb2JzZXJ2ZXIgbWlnaHQgYmUgYnJva2VuIG5vdy4nLCBlbCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBuZXdJbnRlcnNlY3Rpb25WYWx1ZS5wdXNoKGV4aXN0aW5nRW50cnkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5pdGlhbEVsZW1lbnRWaXNpYmlsaXR5ID0gaXNFbGVtZW50VmlzaWJsZSh7XG4gICAgICAgIGNvbnRhaW5lcjogcm9vdEVsLFxuICAgICAgICBlbGVtZW50OiBlbCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWluaXRpYWxFbGVtZW50VmlzaWJpbGl0eSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyB2aXNpYmlsaXR5IGRhdGEgZm91bmQgZm9yIGVsZW1lbnQuJywge1xuICAgICAgICAgIGVsZW1lbnQ6IGVsLFxuICAgICAgICAgIGNvbnRhaW5lcjogcm9vdEVsLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxCb3VuZHMgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgY29uc3QgaW5saW5lSW50ZXJzZWN0aW9uUmF0aW8gPSBpbml0aWFsRWxlbWVudFZpc2liaWxpdHkuaW5saW5lSW50ZXJzZWN0aW9uIC8gMTAwO1xuICAgICAgY29uc3QgYmxvY2tJbnRlcnNlY3Rpb25SYXRpbyA9IGluaXRpYWxFbGVtZW50VmlzaWJpbGl0eS5ibG9ja0ludGVyc2VjdGlvbiAvIDEwMDtcbiAgICAgIGNvbnN0IGlzSW50ZXJzZWN0aW5nID0gaW5saW5lSW50ZXJzZWN0aW9uUmF0aW8gPiAwICYmIGJsb2NrSW50ZXJzZWN0aW9uUmF0aW8gPiAwO1xuICAgICAgY29uc3QgaW50ZXJzZWN0aW9uUmF0aW8gPSBNYXRoLm1pbihpbmxpbmVJbnRlcnNlY3Rpb25SYXRpbywgYmxvY2tJbnRlcnNlY3Rpb25SYXRpbyk7XG5cbiAgICAgIC8vIFJvdW5kIHRoZSBpbnRlcnNlY3Rpb24gcmF0aW8gdG8gdGhlIG5lYXJlc3QgMC4wMSB0byBhdm9pZCBmbG9hdGluZyBwb2ludCBlcnJvcnMgYW5kIHN5c3RlbSBzY2FsaW5nIGlzc3Vlcy5cbiAgICAgIGNvbnN0IHJvdW5kZWRJbnRlcnNlY3Rpb25SYXRpbyA9IE1hdGgucm91bmQoaW50ZXJzZWN0aW9uUmF0aW8gKiAxMDApIC8gMTAwO1xuXG4gICAgICBjb25zdCBpbnRlcnNlY3Rpb25FbnRyeTogSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSA9IHtcbiAgICAgICAgYm91bmRpbmdDbGllbnRSZWN0OiBlbEJvdW5kcyxcbiAgICAgICAgaW50ZXJzZWN0aW9uUmF0aW86IHJvdW5kZWRJbnRlcnNlY3Rpb25SYXRpbyxcbiAgICAgICAgaW50ZXJzZWN0aW9uUmVjdDogZWxCb3VuZHMsXG4gICAgICAgIGlzSW50ZXJzZWN0aW5nLFxuICAgICAgICByb290Qm91bmRzOiByb290Qm91bmRzID8/IG51bGwsXG4gICAgICAgIHRhcmdldDogZWwsXG4gICAgICAgIHRpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgfTtcblxuICAgICAgbmV3SW50ZXJzZWN0aW9uVmFsdWUucHVzaChpbnRlcnNlY3Rpb25FbnRyeSk7XG5cbiAgICAgIGN1cnJlbnRseU9ic2VydmVkRWxlbWVudHMuYWRkKGVsKTtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoZWwpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZWwgb2YgZWxlbWVudHMucHJldmlvdXNFbGVtZW50cykge1xuICAgICAgaWYgKGVsZW1lbnRzLmN1cnJlbnRFbGVtZW50cy5pbmNsdWRlcyhlbCkpIGNvbnRpbnVlO1xuXG4gICAgICBvYnNlcnZlci51bm9ic2VydmUoZWwpO1xuICAgICAgY3VycmVudGx5T2JzZXJ2ZWRFbGVtZW50cy5kZWxldGUoZWwpO1xuICAgIH1cblxuICAgIGVsZW1lbnRJbnRlcnNlY3Rpb25TaWduYWwuc2V0KG5ld0ludGVyc2VjdGlvblZhbHVlKTtcbiAgfTtcblxuICBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9vdEVsID0gcm9vdCgpLmN1cnJlbnRFbGVtZW50O1xuICAgICAgY29uc3QgcmVuZGVyZWQgPSBpc1JlbmRlcmVkKCk7XG4gICAgICBjb25zdCBlbmFibGVkID0gaXNFbmFibGVkKCk7XG5cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB1cGRhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcihyZW5kZXJlZCwgZW5hYmxlZCwgcm9vdEVsKSk7XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICk7XG5cbiAgZWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBlbHMgPSBlbGVtZW50cygpO1xuICAgIGNvbnN0IG9icyA9IG9ic2VydmVyKCk7XG5cbiAgICB1bnRyYWNrZWQoKCkgPT4gdXBkYXRlT2JzZXJ2ZWRFbGVtZW50cyhvYnMsIGVscykpO1xuICB9KTtcblxuICBkZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiBvYnNlcnZlcigpPy5kaXNjb25uZWN0KCkpO1xuXG4gIHJldHVybiBlbGVtZW50SW50ZXJzZWN0aW9uU2lnbmFsLmFzUmVhZG9ubHkoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduYWxIb3N0RWxlbWVudEludGVyc2VjdGlvbiA9IChvcHRpb25zPzogU2lnbmFsRWxlbWVudEludGVyc2VjdGlvbk9wdGlvbnMpID0+XG4gIHNpZ25hbEVsZW1lbnRJbnRlcnNlY3Rpb24oaW5qZWN0KEVsZW1lbnRSZWYpLCBvcHRpb25zKTtcblxuZXhwb3J0IGNvbnN0IHNpZ25hbEVsZW1lbnRDaGlsZHJlbiA9IChlbDogU2lnbmFsRWxlbWVudEJpbmRpbmdUeXBlKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gYnVpbGRFbGVtZW50U2lnbmFsKGVsKTtcbiAgY29uc3QgaXNSZW5kZXJlZCA9IHNpZ25hbElzUmVuZGVyZWQoKTtcbiAgY29uc3QgZWxlbWVudE11dGF0aW9ucyA9IHNpZ25hbEVsZW1lbnRNdXRhdGlvbnMoZWxlbWVudHMsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuXG4gIHJldHVybiBjb21wdXRlZChcbiAgICAoKSA9PiB7XG4gICAgICBpZiAoIWlzUmVuZGVyZWQoKSkgcmV0dXJuIFtdO1xuXG4gICAgICBjb25zdCBlbHMgPSBlbGVtZW50cygpO1xuXG4gICAgICAvLyBXZSBhcmUgbm90IGludGVyZXN0ZWQgd2hhdCB0aGUgbXV0YXRpb24gaXMsIGp1c3QgdGhhdCB0aGVyZSBpcyBvbmUuXG4gICAgICAvLyBDaGFuZ2VzIHRvIHRoZSBET00gbWF5IGFmZmVjdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnQuXG4gICAgICBlbGVtZW50TXV0YXRpb25zKCk7XG5cbiAgICAgIGlmICghZWxzLmN1cnJlbnRFbGVtZW50KSByZXR1cm4gW107XG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuOiBIVE1MRWxlbWVudFtdID0gW107XG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBlbHMuY3VycmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbHMuY3VycmVudEVsZW1lbnQuY2hpbGRyZW5baW5kZXhdO1xuXG4gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICBjaGlsZHJlbi5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICB9LFxuICAgIHsgZXF1YWw6IChhLCBiKSA9PiBhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5ldmVyeSgodiwgaSkgPT4gdiA9PT0gYltpXSkgfSxcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcmV2aW91c1NpZ25hbFZhbHVlID0gPFQ+KHNpZ25hbDogU2lnbmFsPFQ+KSA9PiB7XG4gIGNvbnN0IG9icyA9IHRvT2JzZXJ2YWJsZShzaWduYWwpLnBpcGUoXG4gICAgcGFpcndpc2UoKSxcbiAgICBtYXAoKFtwcmV2XSkgPT4gcHJldiksXG4gICk7XG5cbiAgcmV0dXJuIHRvU2lnbmFsKG9icyk7XG59O1xuXG5leHBvcnQgY29uc3Qgc3luY1NpZ25hbCA9IDxUPihmcm9tOiBTaWduYWw8VD4sIHRvOiBXcml0YWJsZVNpZ25hbDxUPikgPT4ge1xuICBlZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGZvcm1WYWwgPSBmcm9tKCk7XG5cbiAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgdG8uc2V0KGZvcm1WYWwpO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJvbFZhbHVlU2lnbmFsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCAzMDBcbiAgICovXG4gIGRlYm91bmNlVGltZT86IG51bWJlcjtcblxuICAvKipcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRlYm91bmNlRmlyc3Q/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgY29udHJvbFZhbHVlU2lnbmFsID0gPFQgZXh0ZW5kcyBGb3JtQ29udHJvbCB8IEZvcm1Hcm91cCB8IEZvcm1BcnJheT4oXG4gIGNvbnRyb2w6IFQsXG4gIG9wdGlvbnM/OiBDb250cm9sVmFsdWVTaWduYWxPcHRpb25zLFxuKSA9PiB7XG4gIGNvbnN0IHZjc09icyA9IG9wdGlvbnM/LmRlYm91bmNlVGltZVxuICAgID8gY29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUob3B0aW9ucz8uZGVib3VuY2VUaW1lID8/IDMwMCkpXG4gICAgOiBjb250cm9sLnZhbHVlQ2hhbmdlcztcblxuICBjb25zdCBvYnM6IE9ic2VydmFibGU8UmV0dXJuVHlwZTxUWydnZXRSYXdWYWx1ZSddPj4gPSBvcHRpb25zPy5kZWJvdW5jZUZpcnN0XG4gICAgPyBtZXJnZShvZihjb250cm9sLnZhbHVlKSwgdmNzT2JzKVxuICAgIDogdmNzT2JzLnBpcGUoc3RhcnRXaXRoKGNvbnRyb2wuZ2V0UmF3VmFsdWUoKSkpO1xuXG4gIHJldHVybiB0b1NpZ25hbChvYnMucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gZXF1YWwoYSwgYikpKSwge1xuICAgIHJlcXVpcmVTeW5jOiB0cnVlLFxuICB9KTtcbn07XG5cbi8qKlxuICogVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHBhaXIgaXMgdGhlIHByZXZpb3VzIHZhbHVlIGFuZCB0aGUgc2Vjb25kIGl0ZW0gaXMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBjb250cm9sVmFsdWVTaWduYWxXaXRoUHJldmlvdXMgPSA8VCBleHRlbmRzIEZvcm1Db250cm9sIHwgRm9ybUdyb3VwIHwgRm9ybUFycmF5PihcbiAgY29udHJvbDogVCxcbiAgb3B0aW9ucz86IENvbnRyb2xWYWx1ZVNpZ25hbE9wdGlvbnMsXG4pID0+IHtcbiAgY29uc3Qgb2JzID0gdG9PYnNlcnZhYmxlKGNvbnRyb2xWYWx1ZVNpZ25hbChjb250cm9sLCBvcHRpb25zKSkucGlwZShcbiAgICBwYWlyd2lzZSgpLFxuICAgIHN0YXJ0V2l0aChbbnVsbCwgY29udHJvbC5nZXRSYXdWYWx1ZSgpXSksXG4gICk7XG5cbiAgcmV0dXJuIHRvU2lnbmFsKG9icywgeyByZXF1aXJlU3luYzogdHJ1ZSB9KTtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBjb250cm9sVmFsdWVTaWduYWxgIGluc3RlYWQgd2l0aCBgZGVib3VuY2VUaW1lYCBvcHRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVib3VuY2VkQ29udHJvbFZhbHVlU2lnbmFsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBAZGVmYXVsdCAzMDBcbiAgICovXG4gIGRlYm91bmNlVGltZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYGNvbnRyb2xWYWx1ZVNpZ25hbGAgaW5zdGVhZCB3aXRoIGBkZWJvdW5jZVRpbWVgIHNldCB0byBgMzAwYCBhbmQgYGRlYm91bmNlRmlyc3RgIHNldCB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWJvdW5jZWRDb250cm9sVmFsdWVTaWduYWwgPSA8VCBleHRlbmRzIEZvcm1Db250cm9sPihcbiAgY29udHJvbDogVCxcbiAgb3B0aW9ucz86IERlYm91bmNlZENvbnRyb2xWYWx1ZVNpZ25hbE9wdGlvbnMsXG4pID0+IGNvbnRyb2xWYWx1ZVNpZ25hbChjb250cm9sLCBvcHRpb25zID8/IHsgZGVib3VuY2VUaW1lOiAzMDAsIGRlYm91bmNlRmlyc3Q6IHRydWUgfSk7XG5cbmV4cG9ydCB0eXBlIEluamVjdFV0aWxDb25maWcgPSB7XG4gIC8qKiBUaGUgaW5qZWN0b3IgdG8gdXNlIGZvciB0aGUgaW5qZWN0aW9uLiBNdXN0IGJlIHByb3ZpZGVkIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgY2FsbGVkIGZyb20gd2l0aGluIGEgaW5qZWN0aW9uIGNvbnRleHQuICovXG4gIGluamVjdG9yPzogSW5qZWN0b3I7XG59O1xuXG5leHBvcnQgdHlwZSBJbmplY3RVdGlsVHJhbnNmb3JtQ29uZmlnPEluLCBPdXQ+ID0ge1xuICAvKipcbiAgICogQSB0cmFuc2Zvcm0gZnVuY3Rpb24gc2ltaWxhciB0byB0aGUgYHRyYW5zZm9ybWAgZnVuY3Rpb24gaW4gQW5ndWxhciBpbnB1dCBiaW5kaW5ncy5cbiAgICogQ2FuIGJlIHVzZWQgdG8gdHJhbnNmb3JtIHRoZSB2YWx1ZSBiZWZvcmUgaXQgaXMgcmV0dXJuZWQuXG4gICAqIEUuZy4gdHJhbnNmb3JtaW5nIGBcInRydWVcImAgdG8gYHRydWVgIGZvciBhIGJvb2xlYW4gYXR0cmlidXRlLlxuICAgKi9cbiAgdHJhbnNmb3JtPzogKHZhbHVlOiBJbikgPT4gT3V0O1xufTtcblxuZXhwb3J0IGNvbnN0IGluamVjdE9yUnVuSW5Db250ZXh0ID0gPFQ+KGZuOiAoKSA9PiBULCBjb25maWc/OiBJbmplY3RVdGlsQ29uZmlnKSA9PiB7XG4gIGlmIChjb25maWc/LmluamVjdG9yKSB7XG4gICAgcmV0dXJuIHJ1bkluSW5qZWN0aW9uQ29udGV4dChjb25maWcuaW5qZWN0b3IsIGZuKTtcbiAgfVxuXG4gIHJldHVybiBmbigpO1xufTtcblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybU9yUmV0dXJuID0gPEluLCBPdXQ+KHNyYzogU2lnbmFsPEluPiwgY29uZmlnPzogSW5qZWN0VXRpbFRyYW5zZm9ybUNvbmZpZzxJbiwgT3V0PikgPT4ge1xuICBjb25zdCB0cmFuc2Zvcm1lciA9IGNvbmZpZz8udHJhbnNmb3JtO1xuXG4gIGlmICh0cmFuc2Zvcm1lcikge1xuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiB0cmFuc2Zvcm1lcihzcmMoKSkpO1xuICB9XG5cbiAgcmV0dXJuIHNyYyBhcyB1bmtub3duIGFzIFNpZ25hbDxPdXQ+O1xufTtcblxuLyoqIEluamVjdCBhIHNpZ25hbCBjb250YWluaW5nIHRoZSBjdXJyZW50IHJvdXRlIGZyYWdtZW50ICh0aGUgcGFydCBhZnRlciB0aGUgIyBpbnNpZGUgdGhlIHVybCBpZiBwcmVzZW50KSAqL1xuZXhwb3J0IGNvbnN0IGluamVjdEZyYWdtZW50ID0gPFQgPSBzdHJpbmcgfCBudWxsPihcbiAgY29uZmlnPzogSW5qZWN0VXRpbENvbmZpZyAmIEluamVjdFV0aWxUcmFuc2Zvcm1Db25maWc8c3RyaW5nIHwgbnVsbCwgVD4sXG4pID0+IHtcbiAgcmV0dXJuIGluamVjdE9yUnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICBjb25zdCByb3V0ZXJTdGF0ZVNlcnZpY2UgPSBpbmplY3QoUm91dGVyU3RhdGVTZXJ2aWNlKTtcbiAgICBjb25zdCBzcmMgPSB0b1NpZ25hbChyb3V0ZXJTdGF0ZVNlcnZpY2UuZnJhZ21lbnQkLCB7IGluaXRpYWxWYWx1ZTogcm91dGVyU3RhdGVTZXJ2aWNlLmZyYWdtZW50IH0pO1xuXG4gICAgcmV0dXJuIHRyYW5zZm9ybU9yUmV0dXJuKHNyYywgY29uZmlnKTtcbiAgfSwgY29uZmlnKTtcbn07XG5cbi8qKiBJbmplY3QgYWxsIGN1cnJlbnRseSBhdmFpbGFibGUgcXVlcnkgcGFyYW1ldGVycyBhcyBhIHNpZ25hbCAqL1xuZXhwb3J0IGNvbnN0IGluamVjdFF1ZXJ5UGFyYW1zID0gKGNvbmZpZz86IEluamVjdFV0aWxDb25maWcpID0+IHtcbiAgcmV0dXJuIGluamVjdE9yUnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICBjb25zdCByb3V0ZXJTdGF0ZVNlcnZpY2UgPSBpbmplY3QoUm91dGVyU3RhdGVTZXJ2aWNlKTtcblxuICAgIHJldHVybiB0b1NpZ25hbChyb3V0ZXJTdGF0ZVNlcnZpY2UucXVlcnlQYXJhbXMkLCB7IGluaXRpYWxWYWx1ZTogcm91dGVyU3RhdGVTZXJ2aWNlLnF1ZXJ5UGFyYW1zIH0pO1xuICB9LCBjb25maWcpO1xufTtcblxuLyoqIEluamVjdCBhbGwgY3VycmVudGx5IGF2YWlsYWJsZSByb3V0ZSBkYXRhIGFzIGEgc2lnbmFsICovXG5leHBvcnQgY29uc3QgaW5qZWN0Um91dGVEYXRhID0gKGNvbmZpZz86IEluamVjdFV0aWxDb25maWcpID0+IHtcbiAgcmV0dXJuIGluamVjdE9yUnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICBjb25zdCByb3V0ZXJTdGF0ZVNlcnZpY2UgPSBpbmplY3QoUm91dGVyU3RhdGVTZXJ2aWNlKTtcblxuICAgIHJldHVybiB0b1NpZ25hbChyb3V0ZXJTdGF0ZVNlcnZpY2UuZGF0YSQsIHsgaW5pdGlhbFZhbHVlOiByb3V0ZXJTdGF0ZVNlcnZpY2UuZGF0YSB9KTtcbiAgfSwgY29uZmlnKTtcbn07XG5cbi8qKiBJbmplY3QgdGhlIGN1cnJlbnQgcm91dGUgdGl0bGUgYXMgYSBzaWduYWwgKi9cbmV4cG9ydCBjb25zdCBpbmplY3RSb3V0ZVRpdGxlID0gPFQgPSBzdHJpbmcgfCBudWxsPihcbiAgY29uZmlnPzogSW5qZWN0VXRpbENvbmZpZyAmIEluamVjdFV0aWxUcmFuc2Zvcm1Db25maWc8c3RyaW5nIHwgbnVsbCwgVD4sXG4pID0+IHtcbiAgcmV0dXJuIGluamVjdE9yUnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICBjb25zdCByb3V0ZXJTdGF0ZVNlcnZpY2UgPSBpbmplY3QoUm91dGVyU3RhdGVTZXJ2aWNlKTtcbiAgICBjb25zdCBzcmMgPSB0b1NpZ25hbChyb3V0ZXJTdGF0ZVNlcnZpY2UudGl0bGUkLCB7IGluaXRpYWxWYWx1ZTogcm91dGVyU3RhdGVTZXJ2aWNlLnRpdGxlIH0pO1xuXG4gICAgcmV0dXJuIHRyYW5zZm9ybU9yUmV0dXJuKHNyYywgY29uZmlnKTtcbiAgfSwgY29uZmlnKTtcbn07XG5cbi8qKiBJbmplY3QgYWxsIGN1cnJlbnRseSBhdmFpbGFibGUgcGF0aCBwYXJhbWV0ZXJzIGFzIGEgc2lnbmFsICovXG5leHBvcnQgY29uc3QgaW5qZWN0UGF0aFBhcmFtcyA9IChjb25maWc/OiBJbmplY3RVdGlsQ29uZmlnKSA9PiB7XG4gIHJldHVybiBpbmplY3RPclJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgY29uc3Qgcm91dGVyU3RhdGVTZXJ2aWNlID0gaW5qZWN0KFJvdXRlclN0YXRlU2VydmljZSk7XG5cbiAgICByZXR1cm4gdG9TaWduYWwocm91dGVyU3RhdGVTZXJ2aWNlLnBhdGhQYXJhbXMkLCB7IGluaXRpYWxWYWx1ZTogcm91dGVyU3RhdGVTZXJ2aWNlLnBhdGhQYXJhbXMgfSk7XG4gIH0sIGNvbmZpZyk7XG59O1xuXG4vKiogSW5qZWN0IGEgc3BlY2lmaWMgcXVlcnkgcGFyYW1ldGVyIGFzIGEgc2lnbmFsICovXG5leHBvcnQgY29uc3QgaW5qZWN0UXVlcnlQYXJhbSA9IDxUID0gc3RyaW5nIHwgbnVsbD4oXG4gIGtleTogc3RyaW5nLFxuICBjb25maWc/OiBJbmplY3RVdGlsQ29uZmlnICYgSW5qZWN0VXRpbFRyYW5zZm9ybUNvbmZpZzxzdHJpbmcgfCBudWxsLCBUPixcbikgPT4ge1xuICBjb25zdCBxdWVyeVBhcmFtcyA9IGluamVjdFF1ZXJ5UGFyYW1zKGNvbmZpZyk7XG4gIGNvbnN0IHNyYyA9IGNvbXB1dGVkKCgpID0+IHF1ZXJ5UGFyYW1zKClba2V5XSA/PyBudWxsKSBhcyBTaWduYWw8c3RyaW5nIHwgbnVsbD47XG5cbiAgcmV0dXJuIHRyYW5zZm9ybU9yUmV0dXJuKHNyYywgY29uZmlnKTtcbn07XG5cbi8qKiBJbmplY3QgYSBzcGVjaWZpYyByb3V0ZSBkYXRhIGl0ZW0gYXMgYSBzaWduYWwgKi9cbmV4cG9ydCBjb25zdCBpbmplY3RSb3V0ZURhdGFJdGVtID0gPFQgPSB1bmtub3duPihcbiAga2V5OiBzdHJpbmcsXG4gIGNvbmZpZz86IEluamVjdFV0aWxDb25maWcgJiBJbmplY3RVdGlsVHJhbnNmb3JtQ29uZmlnPHVua25vd24sIFQ+LFxuKSA9PiB7XG4gIGNvbnN0IGRhdGEgPSBpbmplY3RSb3V0ZURhdGEoY29uZmlnKTtcbiAgY29uc3Qgc3JjID0gY29tcHV0ZWQoKCkgPT4gZGF0YSgpW2tleV0gPz8gbnVsbCkgYXMgU2lnbmFsPFQ+O1xuXG4gIHJldHVybiB0cmFuc2Zvcm1PclJldHVybihzcmMsIGNvbmZpZyk7XG59O1xuXG4vKiogSW5qZWN0IGEgc3BlY2lmaWMgcGF0aCBwYXJhbWV0ZXIgYXMgYSBzaWduYWwgKi9cbmV4cG9ydCBjb25zdCBpbmplY3RQYXRoUGFyYW0gPSA8VCA9IHN0cmluZyB8IG51bGw+KFxuICBrZXk6IHN0cmluZyxcbiAgY29uZmlnPzogSW5qZWN0VXRpbENvbmZpZyAmIEluamVjdFV0aWxUcmFuc2Zvcm1Db25maWc8c3RyaW5nIHwgbnVsbCwgVD4sXG4pID0+IHtcbiAgY29uc3QgcGF0aFBhcmFtcyA9IGluamVjdFBhdGhQYXJhbXMoY29uZmlnKTtcbiAgY29uc3Qgc3JjID0gY29tcHV0ZWQoKCkgPT4gcGF0aFBhcmFtcygpW2tleV0gPz8gbnVsbCkgYXMgU2lnbmFsPHN0cmluZyB8IG51bGw+O1xuXG4gIHJldHVybiB0cmFuc2Zvcm1PclJldHVybihzcmMsIGNvbmZpZyk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlSXNSZW5kZXJlZFNpZ25hbCA9ICgpID0+IHtcbiAgY29uc3QgdmFsdWUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgaWYgKCF2YWx1ZSgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnUmVuZGVyIHNpZ25hbCB3YXMgbm90IHNldCB0byB0cnVlLiBUaGlzIGNhbiBjYXVzZSB1bmV4cGVjdGVkIGJlaGF2aW9yLiBNYWtlIHN1cmUgdG8gLmJpbmQoKSB0aGUgcmVuZGVyIHNpZ25hbCBhdCB0aGUgZW5kIG9mIHRoZSBjb25zdHJ1Y3Rvci4nLFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgc3RhdGU6IHZhbHVlLFxuICAgIGJpbmQ6ICgpID0+IGVmZmVjdCgoKSA9PiB2YWx1ZS5zZXQodHJ1ZSksIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSksXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ2FuQW5pbWF0ZVNpZ25hbCA9ICgpID0+IHtcbiAgY29uc3QgdmFsdWUgPSBzaWduYWwoZmFsc2UpO1xuXG4gIG5leHRGcmFtZSgoKSA9PiB7XG4gICAgdmFsdWUuc2V0KHRydWUpO1xuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHN0YXRlOiB2YWx1ZS5hc1JlYWRvbmx5KCksXG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBDdXJzb3JEcmFnU2Nyb2xsRGlyZWN0aW9uID0gJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJyB8ICdib3RoJztcblxuZXhwb3J0IHR5cGUgTWF5YmVTaWduYWw8VD4gPSBUIHwgU2lnbmFsPFQ+O1xuXG5leHBvcnQgY29uc3QgbWF5YmVTaWduYWxWYWx1ZSA9IDxUPih2YWx1ZTogTWF5YmVTaWduYWw8VD4pID0+IHtcbiAgaWYgKGlzU2lnbmFsKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZSgpO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuZXhwb3J0IHR5cGUgQ3Vyc29yRHJhZ1Njcm9sbE9wdGlvbnMgPSB7XG4gIC8qKiBJZiB0cnVlLCBjdXJzb3IgZHJhZyBzY3JvbGxpbmcgd2lsbCBiZSBlbmFibGVkLiAqL1xuICBlbmFibGVkPzogU2lnbmFsPGJvb2xlYW4+O1xuXG4gIC8qKiBUaGUgYWxsb3dlZCBzY3JvbGwgZGlyZWN0aW9uLiAqL1xuICBhbGxvd2VkRGlyZWN0aW9uPzogTWF5YmVTaWduYWw8Q3Vyc29yRHJhZ1Njcm9sbERpcmVjdGlvbj47XG59O1xuXG4vKiogVGhlIGRlYWR6b25lIGluIHBpeGVscyBhZnRlciB3aGljaCB0aGUgY3Vyc29yIGRyYWcgc2Nyb2xsIHdpbGwgdGFrZSBlZmZlY3QuICovXG5jb25zdCBDVVJTT1JfRFJBR19TQ1JPTExfREVBRFpPTkUgPSA1O1xuXG4vKiogVGhlIGNsYXNzIHRoYXQgaXMgYWRkZWQgdG8gdGhlIGVsZW1lbnQgd2hlbiB0aGUgY3Vyc29yIGlzIGJlaW5nIGRyYWdnZWQuICovXG5jb25zdCBDVVJTT1JfRFJBR19TQ1JPTExJTkdfQ0xBU1MgPSAnZXQtY3Vyc29yLWRyYWctc2Nyb2xsLS1zY3JvbGxpbmcnO1xuY29uc3QgQ1VSU09SX0RSQUdfSU5JVF9DTEFTUyA9ICdldC1jdXJzb3ItZHJhZy1zY3JvbGwtLWluaXQnO1xuXG4vKiogQSBmdW5jdGlvbiB0byBhcHBseSBjdXJzb3IgZHJhZyBzY3JvbGwgYmVoYXZpb3IgdG8gYW4gZWxlbWVudC4gKi9cbmV4cG9ydCBjb25zdCB1c2VDdXJzb3JEcmFnU2Nyb2xsID0gKGVsOiBTaWduYWxFbGVtZW50QmluZGluZ1R5cGUsIG9wdGlvbnM/OiBDdXJzb3JEcmFnU2Nyb2xsT3B0aW9ucykgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IGJ1aWxkRWxlbWVudFNpZ25hbChlbCk7XG4gIGNvbnN0IGVsZW1lbnQgPSBmaXJzdEVsZW1lbnRTaWduYWwoZWxlbWVudHMpO1xuICBjb25zdCBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBjb25zdCB7IGVuYWJsZWQgPSBzaWduYWwodHJ1ZSksIGFsbG93ZWREaXJlY3Rpb24gPSAnYm90aCcgfSA9IG9wdGlvbnMgPz8ge307XG4gIGNvbnN0IHNjcm9sbFN0YXRlID0gc2lnbmFsRWxlbWVudFNjcm9sbFN0YXRlKGVsZW1lbnRzKTtcbiAgY29uc3QgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgY29uc3QgaXNEcmFnZ2luZyA9IHNpZ25hbChmYWxzZSk7XG4gIGNvbnN0IGlzSW5pdERyYWdnaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgY29uc3QgaW5pdGlhbERyYWdQb3NpdGlvbiA9IHNpZ25hbCh7IHg6IDAsIHk6IDAgfSk7XG4gIGNvbnN0IGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9IHNpZ25hbCh7IHg6IDAsIHk6IDAgfSk7XG4gIGNvbnN0IGRyYWdBbW91bnQgPSBzaWduYWwoeyB4OiAwLCB5OiAwIH0pO1xuICBjb25zdCBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG5cbiAgY29uc3QgY2FuU2Nyb2xsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRTY3JvbGxTdGF0ZSA9IHNjcm9sbFN0YXRlKCk7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gbWF5YmVTaWduYWxWYWx1ZShhbGxvd2VkRGlyZWN0aW9uKTtcblxuICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICdib3RoJzpcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTY3JvbGxTdGF0ZS5jYW5TY3JvbGxIb3Jpem9udGFsbHkgfHwgY3VycmVudFNjcm9sbFN0YXRlLmNhblNjcm9sbFZlcnRpY2FsbHk7XG4gICAgICBjYXNlICdob3Jpem9udGFsJzpcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTY3JvbGxTdGF0ZS5jYW5TY3JvbGxIb3Jpem9udGFsbHk7XG4gICAgICBjYXNlICd2ZXJ0aWNhbCc6XG4gICAgICAgIHJldHVybiBjdXJyZW50U2Nyb2xsU3RhdGUuY2FuU2Nyb2xsVmVydGljYWxseTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENsZWFudXAgaWYgdGhlIGVsZW1lbnQgdGhlIGN1cnNvciBkcmFnIHNjcm9sbCBpcyBib3VuZCB0byBnZXRzIGNoYW5nZWRcbiAgZWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCB7IHByZXZpb3VzRWxlbWVudCB9ID0gZWxlbWVudCgpO1xuXG4gICAgaWYgKHByZXZpb3VzRWxlbWVudCkge1xuICAgICAgcmVuZGVyZXIucmVtb3ZlU3R5bGUocHJldmlvdXNFbGVtZW50LCAnY3Vyc29yJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBDb25kaXRpb25hbGx5IGFwcGx5IHN0eWxlcy9jbGFzc2VzIHRvIHRoZSBlbGVtZW50IGFuZCB0aGUgZG9jdW1lbnRcbiAgZWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjdXJyQ2FuU2Nyb2xsID0gY2FuU2Nyb2xsKCk7XG4gICAgY29uc3QgaXNFbmFibGVkID0gZW5hYmxlZCgpO1xuICAgIGNvbnN0IGN1cnJJc0RyYWdnaW5nID0gaXNEcmFnZ2luZygpO1xuICAgIGNvbnN0IGN1cnJJc0luaXREcmFnZ2luZyA9IGlzSW5pdERyYWdnaW5nKCk7XG5cbiAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBlbGVtZW50KCkuY3VycmVudEVsZW1lbnQ7XG5cbiAgICAgIGlmICghZWwpIHJldHVybjtcblxuICAgICAgaWYgKCFjdXJyQ2FuU2Nyb2xsIHx8ICFpc0VuYWJsZWQpIHtcbiAgICAgICAgcmVuZGVyZXIucmVtb3ZlU3R5bGUoZWwsICdjdXJzb3InKTtcbiAgICAgICAgcmVuZGVyZXIucmVtb3ZlU3R5bGUoZWwsICdzY3JvbGxTbmFwVHlwZScpO1xuICAgICAgICByZW5kZXJlci5yZW1vdmVTdHlsZShlbCwgJ3Njcm9sbEJlaGF2aW9yJyk7XG4gICAgICAgIHJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsLCBDVVJTT1JfRFJBR19TQ1JPTExJTkdfQ0xBU1MpO1xuICAgICAgICByZW5kZXJlci5yZW1vdmVDbGFzcyhlbCwgQ1VSU09SX0RSQUdfSU5JVF9DTEFTUyk7XG4gICAgICAgIHJlbmRlcmVyLnJlbW92ZVN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ2N1cnNvcicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJySXNJbml0RHJhZ2dpbmcpIHtcbiAgICAgICAgcmVuZGVyZXIuYWRkQ2xhc3MoZWwsIENVUlNPUl9EUkFHX0lOSVRfQ0xBU1MpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3VycklzRHJhZ2dpbmcpIHtcbiAgICAgICAgcmVuZGVyZXIuYWRkQ2xhc3MoZWwsIENVUlNPUl9EUkFHX1NDUk9MTElOR19DTEFTUyk7XG4gICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAnc2Nyb2xsU25hcFR5cGUnLCAnbm9uZScpO1xuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ3Njcm9sbEJlaGF2aW9yJywgJ3Vuc2V0Jyk7XG4gICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAnY3Vyc29yJywgJ2dyYWJiaW5nJyk7XG4gICAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ2N1cnNvcicsICdncmFiYmluZycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWN1cnJJc0luaXREcmFnZ2luZyAmJiAhY3VycklzRHJhZ2dpbmcpIHtcbiAgICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICdjdXJzb3InLCAnZ3JhYicpO1xuICAgICAgICByZW5kZXJlci5yZW1vdmVTdHlsZShlbCwgJ3Njcm9sbFNuYXBUeXBlJyk7XG4gICAgICAgIHJlbmRlcmVyLnJlbW92ZVN0eWxlKGVsLCAnc2Nyb2xsQmVoYXZpb3InKTtcbiAgICAgICAgcmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwsIENVUlNPUl9EUkFHX1NDUk9MTElOR19DTEFTUyk7XG4gICAgICAgIHJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsLCBDVVJTT1JfRFJBR19JTklUX0NMQVNTKTtcbiAgICAgICAgcmVuZGVyZXIucmVtb3ZlU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAnY3Vyc29yJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFVwZGF0ZSB0aGUgZWxlbWVudCdzIHNjcm9sbCBwb3NpdGlvbiB3aGVuIHRoZSB1c2VyIGRyYWdzXG4gIGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY3VyckRyYWdBbW91bnQgPSBkcmFnQW1vdW50KCk7XG5cbiAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgY29uc3QgY3VycklzRHJhZ2dpbmcgPSBpc0RyYWdnaW5nKCk7XG4gICAgICBjb25zdCBlbCA9IGVsZW1lbnQoKS5jdXJyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHsgeDogZHJhZ1gsIHk6IGRyYWdZIH0gPSBjdXJyRHJhZ0Ftb3VudDtcbiAgICAgIGNvbnN0IHsgeDogc2Nyb2xsWCwgeTogc2Nyb2xsWSB9ID0gaW5pdGlhbFNjcm9sbFBvc2l0aW9uKCk7XG4gICAgICBjb25zdCBjdXJyQWxsb3dlZERpcmVjdGlvbiA9IG1heWJlU2lnbmFsVmFsdWUoYWxsb3dlZERpcmVjdGlvbik7XG5cbiAgICAgIGlmICghZWwgfHwgIWN1cnJJc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICAgIHN3aXRjaCAoY3VyckFsbG93ZWREaXJlY3Rpb24pIHtcbiAgICAgICAgY2FzZSAnYm90aCc6XG4gICAgICAgICAgZWwuc2Nyb2xsKHtcbiAgICAgICAgICAgIHRvcDogZHJhZ1kgKyBzY3JvbGxZLFxuICAgICAgICAgICAgbGVmdDogZHJhZ1ggKyBzY3JvbGxYLFxuICAgICAgICAgICAgYmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnaG9yaXpvbnRhbCc6XG4gICAgICAgICAgZWwuc2Nyb2xsKHtcbiAgICAgICAgICAgIGxlZnQ6IGRyYWdYICsgc2Nyb2xsWCxcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3ZlcnRpY2FsJzpcbiAgICAgICAgICBlbC5zY3JvbGwoe1xuICAgICAgICAgICAgdG9wOiBkcmFnWSArIHNjcm9sbFksXG4gICAgICAgICAgICBiZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCB1cGRhdGVEcmFnZ2luZyA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgZWwgPSBlbGVtZW50KCkuY3VycmVudEVsZW1lbnQ7XG5cbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICBjb25zdCBkeCA9IChlLmNsaWVudFggLSBpbml0aWFsRHJhZ1Bvc2l0aW9uKCkueCkgKiAtMTtcbiAgICBjb25zdCBkeSA9IChlLmNsaWVudFkgLSBpbml0aWFsRHJhZ1Bvc2l0aW9uKCkueSkgKiAtMTtcblxuICAgIGRyYWdBbW91bnQuc2V0KHsgeDogZHgsIHk6IGR5IH0pO1xuXG4gICAgaWYgKE1hdGguYWJzKGR4KSA+IENVUlNPUl9EUkFHX1NDUk9MTF9ERUFEWk9ORSB8fCBNYXRoLmFicyhkeSkgPiBDVVJTT1JfRFJBR19TQ1JPTExfREVBRFpPTkUpIHtcbiAgICAgIGlzRHJhZ2dpbmcuc2V0KHRydWUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1cGRhdGVEcmFnZ2luZ0VuZCA9ICgpID0+IHtcbiAgICBpc0RyYWdnaW5nLnNldChmYWxzZSk7XG4gICAgaXNJbml0RHJhZ2dpbmcuc2V0KGZhbHNlKTtcbiAgICBpbml0aWFsRHJhZ1Bvc2l0aW9uLnNldCh7IHg6IDAsIHk6IDAgfSk7XG4gICAgaW5pdGlhbFNjcm9sbFBvc2l0aW9uLnNldCh7IHg6IDAsIHk6IDAgfSk7XG4gICAgZHJhZ0Ftb3VudC5zZXQoeyB4OiAwLCB5OiAwIH0pO1xuICB9O1xuXG4gIGNvbnN0IHNldHVwRHJhZ2dpbmcgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IG1vdXNlVXAgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdtb3VzZXVwJyk7XG4gICAgY29uc3QgbW91c2VNb3ZlID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGRvY3VtZW50LCAnbW91c2Vtb3ZlJyk7XG4gICAgY29uc3QgZWwgPSBlbGVtZW50KCkuY3VycmVudEVsZW1lbnQ7XG5cbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgICBtb3VzZU1vdmVcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoZGVzdHJveVJlZiksXG4gICAgICAgIHRha2VVbnRpbChtb3VzZVVwKSxcbiAgICAgICAgdGFwKChlKSA9PiB1cGRhdGVEcmFnZ2luZyhlKSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBtb3VzZVVwXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKGRlc3Ryb3lSZWYpLFxuICAgICAgICB0YXAoKCkgPT4gdXBkYXRlRHJhZ2dpbmdFbmQoKSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBpbml0aWFsRHJhZ1Bvc2l0aW9uLnNldCh7IHg6IGUuY2xpZW50WCwgeTogZS5jbGllbnRZIH0pO1xuICAgIGluaXRpYWxTY3JvbGxQb3NpdGlvbi5zZXQoeyB4OiBlbC5zY3JvbGxMZWZ0LCB5OiBlbC5zY3JvbGxUb3AgfSk7XG4gICAgaXNJbml0RHJhZ2dpbmcuc2V0KHRydWUpO1xuICB9O1xuXG4gIHRvT2JzZXJ2YWJsZShlbGVtZW50KVxuICAgIC5waXBlKFxuICAgICAgbWFwKChlKSA9PiBlPy5jdXJyZW50RWxlbWVudCksXG4gICAgICBzd2l0Y2hNYXAoKGVsKSA9PiAoZWwgPyBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZWwsICdtb3VzZWRvd24nKSA6IG9mKG51bGwpKSksXG4gICAgICBmaWx0ZXIoKGUpOiBlIGlzIE1vdXNlRXZlbnQgPT4gISFlKSxcbiAgICAgIGZpbHRlcigoKSA9PiBlbmFibGVkKCkpLFxuICAgICAgdGFwKChlKSA9PiBzZXR1cERyYWdnaW5nKGUpKSxcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgIClcbiAgICAuc3Vic2NyaWJlKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBpc0RyYWdnaW5nOiBpc0RyYWdnaW5nLmFzUmVhZG9ubHkoKSxcbiAgICBjdXJyZW50RHJhZ0Ftb3VudDogZHJhZ0Ftb3VudC5hc1JlYWRvbmx5KCksXG4gIH07XG59O1xuXG4vKipcbiAqIEEgY29tcHV0ZWQgdGhhdCB3aWxsIG9ubHkgYmUgcmVhY3RpdmUgdW50aWwgdGhlIHNvdXJjZSBzaWduYWwgY29udGFpbnMgYSB0cnV0aHkgdmFsdWUuXG4gKiBBbGwgc3Vic2VxdWVudCBjaGFuZ2VzIGluc2lkZSB0aGUgY29tcHV0YXRpb24gd2lsbCBiZSBpZ25vcmVkLlxuICovXG5leHBvcnQgY29uc3QgY29tcHV0ZWRUaWxsVHJ1dGh5ID0gPFQ+KHNvdXJjZTogU2lnbmFsPFQ+KSA9PiB7XG4gIGNvbnN0IHZhbHVlID0gc2lnbmFsPFQgfCBudWxsPihudWxsKTtcblxuICBjb25zdCByZWYgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gc291cmNlKCk7XG5cbiAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgdmFsdWUuc2V0KHZhbCk7XG4gICAgICAgIHJlZi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0sXG4gICk7XG5cbiAgcmV0dXJuIHZhbHVlLmFzUmVhZG9ubHkoKTtcbn07XG5cbi8qKlxuICogQSBjb21wdXRlZCB0aGF0IHdpbGwgb25seSBiZSByZWFjdGl2ZSB1bnRpbCB0aGUgc291cmNlIHNpZ25hbCBjb250YWlucyBhIGZhbHN5IHZhbHVlLlxuICogQWxsIHN1YnNlcXVlbnQgY2hhbmdlcyBpbnNpZGUgdGhlIGNvbXB1dGF0aW9uIHdpbGwgYmUgaWdub3JlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXB1dGVkVGlsbEZhbHN5ID0gPFQ+KHNvdXJjZTogU2lnbmFsPFQ+KSA9PiB7XG4gIGNvbnN0IHZhbHVlID0gc2lnbmFsPFQgfCBudWxsPihudWxsKTtcblxuICBjb25zdCByZWYgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gc291cmNlKCk7XG5cbiAgICAgIGlmICghdmFsKSB7XG4gICAgICAgIHZhbHVlLnNldCh2YWwpO1xuICAgICAgICByZWYuZGVzdHJveSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9LFxuICApO1xuXG4gIHJldHVybiB2YWx1ZS5hc1JlYWRvbmx5KCk7XG59O1xuXG4vKipcbiAqIEEgd3JpdGVhYmxlIHNpZ25hbCB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBwcm92aWRlZCB2YWx1ZSBvbmNlIGFsbCBpbnB1dHMgYXJlIHNldC5cbiAqIER1cmluZyB0aGF0IHRpbWUsIHRoZSBzaWduYWwgd2lsbCBiZSBzZXQgdG8gYG51bGxgLlxuICovXG5leHBvcnQgY29uc3QgZGVmZXJyZWRTaWduYWwgPSA8VCBleHRlbmRzICgpID0+IHVua25vd24+KHZhbHVlRm46IFQpID0+IHtcbiAgY29uc3QgdmFsdWVTaWduYWwgPSBzaWduYWw8UmV0dXJuVHlwZTxUPiB8IG51bGw+KG51bGwpO1xuXG4gIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgdmFsdWVTaWduYWwuc2V0KHZhbHVlRm4oKSBhcyBSZXR1cm5UeXBlPFQ+KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHZhbHVlU2lnbmFsO1xufTtcblxuLyoqIEluamVjdCBhIHNpZ25hbCBjb250YWluaW5nIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZSB2aWV3cG9ydCBpcyB4cyAqL1xuZXhwb3J0IGNvbnN0IGluamVjdElzWHMgPSAoKSA9PiB7XG4gIHJldHVybiB0b1NpZ25hbChpbmplY3QoVmlld3BvcnRTZXJ2aWNlKS5pc1hzJCwgeyByZXF1aXJlU3luYzogdHJ1ZSB9KTtcbn07XG5cbi8qKiBJbmplY3QgYSBzaWduYWwgY29udGFpbmluZyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgdmlld3BvcnQgaXMgc20gKi9cbmV4cG9ydCBjb25zdCBpbmplY3RJc1NtID0gKCkgPT4ge1xuICByZXR1cm4gdG9TaWduYWwoaW5qZWN0KFZpZXdwb3J0U2VydmljZSkuaXNTbSQsIHsgcmVxdWlyZVN5bmM6IHRydWUgfSk7XG59O1xuXG4vKiogSW5qZWN0IGEgc2lnbmFsIGNvbnRhaW5pbmcgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHZpZXdwb3J0IGlzIG1kICovXG5leHBvcnQgY29uc3QgaW5qZWN0SXNNZCA9ICgpID0+IHtcbiAgcmV0dXJuIHRvU2lnbmFsKGluamVjdChWaWV3cG9ydFNlcnZpY2UpLmlzTWQkLCB7IHJlcXVpcmVTeW5jOiB0cnVlIH0pO1xufTtcblxuLyoqIEluamVjdCBhIHNpZ25hbCBjb250YWluaW5nIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIGlmIHRoZSB2aWV3cG9ydCBpcyBsZyAqL1xuZXhwb3J0IGNvbnN0IGluamVjdElzTGcgPSAoKSA9PiB7XG4gIHJldHVybiB0b1NpZ25hbChpbmplY3QoVmlld3BvcnRTZXJ2aWNlKS5pc0xnJCwgeyByZXF1aXJlU3luYzogdHJ1ZSB9KTtcbn07XG5cbi8qKiBJbmplY3QgYSBzaWduYWwgY29udGFpbmluZyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgdmlld3BvcnQgaXMgeGwgKi9cbmV4cG9ydCBjb25zdCBpbmplY3RJc1hsID0gKCkgPT4ge1xuICByZXR1cm4gdG9TaWduYWwoaW5qZWN0KFZpZXdwb3J0U2VydmljZSkuaXNYbCQsIHsgcmVxdWlyZVN5bmM6IHRydWUgfSk7XG59O1xuXG4vKiogSW5qZWN0IGEgc2lnbmFsIGNvbnRhaW5pbmcgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHZpZXdwb3J0IGlzIDJ4bCAqL1xuZXhwb3J0IGNvbnN0IGluamVjdElzMlhsID0gKCkgPT4ge1xuICByZXR1cm4gdG9TaWduYWwoaW5qZWN0KFZpZXdwb3J0U2VydmljZSkuaXMyWGwkLCB7IHJlcXVpcmVTeW5jOiB0cnVlIH0pO1xufTtcblxuLyoqXG4gKiBJbmplY3QgYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgdGhlIHZpZXdwb3J0IGlzIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICogVGhpcyB2YWx1ZSBpcyBub3QgcmVhY3RpdmUuIElmIHlvdSB3YW50IHRvIHJlYWN0IHRvIGNoYW5nZXMsIHVzZSB0aGUge0BsaW5rIGluamVjdE9ic2VydmVCcmVha3BvaW50fSBmdW5jdGlvbiBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgaW5qZWN0QnJlYWtwb2ludElzTWF0Y2hlZCA9IChvcHRpb25zOiB7IG1pbj86IG51bWJlciB8IEJyZWFrcG9pbnQ7IG1heD86IG51bWJlciB8IEJyZWFrcG9pbnQgfSkgPT4ge1xuICByZXR1cm4gaW5qZWN0KFZpZXdwb3J0U2VydmljZSkuaXNNYXRjaGVkKG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBJbmplY3QgYSBzaWduYWwgY29udGFpbmluZyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgdmlld3BvcnQgaXMgbWF0Y2hpbmcgdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBpbmplY3RPYnNlcnZlQnJlYWtwb2ludCA9IChvcHRpb25zOiB7IG1pbj86IG51bWJlciB8IEJyZWFrcG9pbnQ7IG1heD86IG51bWJlciB8IEJyZWFrcG9pbnQgfSkgPT4ge1xuICByZXR1cm4gdG9TaWduYWwoaW5qZWN0KFZpZXdwb3J0U2VydmljZSkub2JzZXJ2ZShvcHRpb25zKSwgeyBpbml0aWFsVmFsdWU6IGluamVjdEJyZWFrcG9pbnRJc01hdGNoZWQob3B0aW9ucykgfSk7XG59O1xuXG4vKiogSW5qZWN0IGEgc2lnbmFsIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgYnJlYWtwb2ludC4gKi9cbmV4cG9ydCBjb25zdCBpbmplY3RDdXJyZW50QnJlYWtwb2ludCA9ICgpID0+IHtcbiAgcmV0dXJuIHRvU2lnbmFsKGluamVjdChWaWV3cG9ydFNlcnZpY2UpLmN1cnJlbnRWaWV3cG9ydCQsIHtcbiAgICBpbml0aWFsVmFsdWU6IGluamVjdChWaWV3cG9ydFNlcnZpY2UpLmN1cnJlbnRWaWV3cG9ydCxcbiAgfSk7XG59O1xuIl19
|