@ngneat/helipopper 9.2.0 → 10.0.0-alpha.0
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/README.md +52 -55
- package/esm2022/lib/coercion.mjs +10 -0
- package/esm2022/lib/intersection-observer.mjs +9 -0
- package/esm2022/lib/providers.mjs +2 -2
- package/esm2022/lib/tippy.directive.mjs +249 -269
- package/esm2022/lib/tippy.factory.mjs +43 -0
- package/esm2022/lib/tippy.service.mjs +23 -21
- package/esm2022/lib/tippy.types.mjs +2 -7
- package/esm2022/lib/utils.mjs +3 -2
- package/fesm2022/ngneat-helipopper.mjs +325 -294
- package/fesm2022/ngneat-helipopper.mjs.map +1 -1
- package/lib/coercion.d.ts +9 -0
- package/lib/intersection-observer.d.ts +1 -0
- package/lib/providers.d.ts +1 -1
- package/lib/tippy.directive.d.ts +43 -51
- package/lib/tippy.factory.d.ts +16 -0
- package/lib/tippy.service.d.ts +3 -1
- package/lib/tippy.types.d.ts +15 -8
- package/package.json +2 -2
|
@@ -1,34 +1,98 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { computed, DestroyRef, Directive, effect, EventEmitter, inject, Inject, Injector, input, model, Output, PLATFORM_ID, untracked, } from '@angular/core';
|
|
2
2
|
import { isPlatformServer } from '@angular/common';
|
|
3
|
-
import
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
4
|
import { fromEvent, merge, Observable, Subject } from 'rxjs';
|
|
5
5
|
import { filter, map, switchMap, takeUntil } from 'rxjs/operators';
|
|
6
|
-
import { isComponent, isString, isTemplateRef } from '@ngneat/overview';
|
|
6
|
+
import { isComponent, isString, isTemplateRef, } from '@ngneat/overview';
|
|
7
7
|
import { coerceCssPixelValue, dimensionsChanges, inView, isElementOverflow, normalizeClassName, observeVisibility, onlyTippyProps, overflowChanges, } from './utils';
|
|
8
|
-
import { TIPPY_CONFIG, TIPPY_REF } from './tippy.types';
|
|
8
|
+
import { TIPPY_CONFIG, TIPPY_REF, } from './tippy.types';
|
|
9
|
+
import { TippyFactory } from './tippy.factory';
|
|
10
|
+
import { coerceBooleanAttribute } from './coercion';
|
|
9
11
|
import * as i0 from "@angular/core";
|
|
10
12
|
import * as i1 from "@ngneat/overview";
|
|
11
13
|
export class TippyDirective {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
// It should be a getter because computations are cached until
|
|
15
|
+
// any of the producers change.
|
|
16
|
+
get hostWidth() {
|
|
17
|
+
return this.host().getBoundingClientRect().width;
|
|
14
18
|
}
|
|
15
|
-
constructor(
|
|
16
|
-
this.platformId = platformId;
|
|
19
|
+
constructor(globalConfig, injector, viewService, vcr, ngZone, hostRef) {
|
|
17
20
|
this.globalConfig = globalConfig;
|
|
18
21
|
this.injector = injector;
|
|
19
22
|
this.viewService = viewService;
|
|
20
23
|
this.vcr = vcr;
|
|
21
|
-
this.
|
|
24
|
+
this.ngZone = ngZone;
|
|
22
25
|
this.hostRef = hostRef;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
this.
|
|
27
|
-
this.
|
|
28
|
-
this.
|
|
26
|
+
// Note that default values are not provided for these bindings because `tippy.js`
|
|
27
|
+
// has its own default values and checks whether the provided props are `undefined`.
|
|
28
|
+
// We should keep `undefined` as the default value.
|
|
29
|
+
this.appendTo = input(undefined, { alias: 'tpAppendTo' });
|
|
30
|
+
this.content = input(undefined, { alias: 'tp' });
|
|
31
|
+
this.delay = input(undefined, { alias: 'tpDelay' });
|
|
32
|
+
this.duration = input(undefined, { alias: 'tpDuration' });
|
|
33
|
+
this.hideOnClick = input(undefined, {
|
|
34
|
+
alias: 'tpHideOnClick',
|
|
35
|
+
});
|
|
36
|
+
this.interactive = input(undefined, {
|
|
37
|
+
alias: 'tpInteractive',
|
|
38
|
+
});
|
|
39
|
+
this.interactiveBorder = input(undefined, {
|
|
40
|
+
alias: 'tpInteractiveBorder',
|
|
41
|
+
});
|
|
42
|
+
this.maxWidth = input(undefined, { alias: 'tpMaxWidth' });
|
|
43
|
+
// Note that some of the input signal types are declared explicitly because the compiler
|
|
44
|
+
// also uses types from `@popperjs/core` and requires a type annotation.
|
|
45
|
+
this.offset = input(undefined, { alias: 'tpOffset' });
|
|
46
|
+
this.placement = input(undefined, {
|
|
47
|
+
alias: 'tpPlacement',
|
|
48
|
+
});
|
|
49
|
+
this.popperOptions = input(undefined, {
|
|
50
|
+
alias: 'tpPopperOptions',
|
|
51
|
+
});
|
|
52
|
+
this.showOnCreate = input(undefined, {
|
|
53
|
+
alias: 'tpShowOnCreate',
|
|
54
|
+
});
|
|
55
|
+
this.trigger = input(undefined, { alias: 'tpTrigger' });
|
|
56
|
+
this.triggerTarget = input(undefined, {
|
|
57
|
+
alias: 'tpTriggerTarget',
|
|
58
|
+
});
|
|
59
|
+
this.zIndex = input(undefined, { alias: 'tpZIndex' });
|
|
60
|
+
this.animation = input(undefined, {
|
|
61
|
+
alias: 'tpAnimation',
|
|
62
|
+
});
|
|
63
|
+
this.useTextContent = input(false, {
|
|
64
|
+
transform: coerceBooleanAttribute,
|
|
65
|
+
alias: 'tpUseTextContent',
|
|
66
|
+
});
|
|
67
|
+
this.isLazy = input(false, {
|
|
68
|
+
transform: coerceBooleanAttribute,
|
|
69
|
+
alias: 'tpIsLazy',
|
|
70
|
+
});
|
|
71
|
+
this.variation = input(undefined, { alias: 'tpVariation' });
|
|
72
|
+
this.isEnabled = input(true, { alias: 'tpIsEnabled' });
|
|
73
|
+
this.className = input('', { alias: 'tpClassName' });
|
|
74
|
+
this.onlyTextOverflow = input(false, {
|
|
75
|
+
transform: coerceBooleanAttribute,
|
|
76
|
+
alias: 'tpOnlyTextOverflow',
|
|
77
|
+
});
|
|
78
|
+
this.staticWidthHost = input(false, {
|
|
79
|
+
transform: coerceBooleanAttribute,
|
|
80
|
+
alias: 'tpStaticWidthHost',
|
|
81
|
+
});
|
|
82
|
+
this.data = input(undefined, { alias: 'tpData' });
|
|
83
|
+
this.useHostWidth = input(false, {
|
|
84
|
+
transform: coerceBooleanAttribute,
|
|
85
|
+
alias: 'tpUseHostWidth',
|
|
86
|
+
});
|
|
87
|
+
this.hideOnEscape = input(false, {
|
|
88
|
+
transform: coerceBooleanAttribute,
|
|
89
|
+
alias: 'tpHideOnEscape',
|
|
90
|
+
});
|
|
91
|
+
this.detectChangesComponent = input(true, { alias: 'tpDetectChangesComponent' });
|
|
92
|
+
this.popperWidth = input(undefined, { alias: 'tpPopperWidth' });
|
|
93
|
+
this.customHost = input(undefined, { alias: 'tpHost' });
|
|
94
|
+
this.isVisible = model(false, { alias: 'tpIsVisible' });
|
|
29
95
|
this.visible = new EventEmitter();
|
|
30
|
-
this.destroyed = new Subject();
|
|
31
|
-
this.enabled = true;
|
|
32
96
|
this.variationDefined = false;
|
|
33
97
|
/**
|
|
34
98
|
* We had use `visible` event emitter previously as a `takeUntil` subscriber in multiple places
|
|
@@ -39,10 +103,26 @@ export class TippyDirective {
|
|
|
39
103
|
*/
|
|
40
104
|
this.visibleInternal = new Subject();
|
|
41
105
|
this.contentChanged = new Subject();
|
|
106
|
+
this.host = computed(() => this.customHost() || this.hostRef.nativeElement);
|
|
107
|
+
this.destroyRef = inject(DestroyRef);
|
|
108
|
+
this.isServer = isPlatformServer(inject(PLATFORM_ID));
|
|
109
|
+
this.tippyFactory = inject(TippyFactory);
|
|
110
|
+
if (this.isServer)
|
|
111
|
+
return;
|
|
112
|
+
this.setupListeners();
|
|
113
|
+
this.destroyRef.onDestroy(() => {
|
|
114
|
+
this.instance?.destroy();
|
|
115
|
+
this.destroyView();
|
|
116
|
+
this.visibilityObserverCleanup?.();
|
|
117
|
+
});
|
|
42
118
|
}
|
|
43
119
|
ngOnChanges(changes) {
|
|
44
|
-
if (this.
|
|
120
|
+
if (this.isServer)
|
|
45
121
|
return;
|
|
122
|
+
// TODO: we can update it later.
|
|
123
|
+
// We need to go over class properties, check whether it's a signal (`isSignal(prop)`)
|
|
124
|
+
// and construct a record where `Record<string, Signal>`.
|
|
125
|
+
// Follow-up changes would be to have a computation and an effect.
|
|
46
126
|
let props = Object.keys(changes).reduce((acc, change) => {
|
|
47
127
|
if (change === 'isVisible')
|
|
48
128
|
return acc;
|
|
@@ -50,9 +130,6 @@ export class TippyDirective {
|
|
|
50
130
|
return acc;
|
|
51
131
|
}, {});
|
|
52
132
|
let variation;
|
|
53
|
-
if (isChanged('content', changes)) {
|
|
54
|
-
this.contentChanged.next();
|
|
55
|
-
}
|
|
56
133
|
if (isChanged('variation', changes)) {
|
|
57
134
|
variation = changes.variation.currentValue;
|
|
58
135
|
this.variationDefined = true;
|
|
@@ -67,57 +144,41 @@ export class TippyDirective {
|
|
|
67
144
|
...props,
|
|
68
145
|
};
|
|
69
146
|
}
|
|
70
|
-
if (isChanged('isEnabled', changes)) {
|
|
71
|
-
this.enabled = changes.isEnabled.currentValue;
|
|
72
|
-
this.setStatus();
|
|
73
|
-
}
|
|
74
|
-
if (isChanged('isVisible', changes)) {
|
|
75
|
-
this.isVisible ? this.show() : this.hide();
|
|
76
|
-
}
|
|
77
147
|
this.updateProps(props);
|
|
78
148
|
}
|
|
79
149
|
ngOnInit() {
|
|
80
|
-
if (this.useHostWidth) {
|
|
150
|
+
if (this.useHostWidth()) {
|
|
81
151
|
this.props.maxWidth = this.hostWidth;
|
|
82
152
|
}
|
|
83
153
|
}
|
|
84
154
|
ngAfterViewInit() {
|
|
85
|
-
if (this.
|
|
155
|
+
if (this.isServer)
|
|
86
156
|
return;
|
|
87
|
-
this.
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
.subscribe((isElementOverflow) => {
|
|
93
|
-
this.checkOverflow(isElementOverflow);
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
inView(this.host)
|
|
98
|
-
.pipe(takeUntil(this.destroyed))
|
|
99
|
-
.subscribe(() => {
|
|
100
|
-
this.createInstance();
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
else if (this.onlyTextOverflow) {
|
|
105
|
-
this.isOverflowing$()
|
|
106
|
-
.pipe(takeUntil(this.destroyed))
|
|
157
|
+
if (this.isLazy()) {
|
|
158
|
+
const hostInView$ = inView(this.host());
|
|
159
|
+
if (this.onlyTextOverflow()) {
|
|
160
|
+
hostInView$
|
|
161
|
+
.pipe(switchMap(() => this.isOverflowing$()), takeUntilDestroyed(this.destroyRef))
|
|
107
162
|
.subscribe((isElementOverflow) => {
|
|
108
163
|
this.checkOverflow(isElementOverflow);
|
|
109
164
|
});
|
|
110
165
|
}
|
|
111
166
|
else {
|
|
112
|
-
this.
|
|
167
|
+
hostInView$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
168
|
+
this.createInstance();
|
|
169
|
+
});
|
|
113
170
|
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
171
|
+
}
|
|
172
|
+
else if (this.onlyTextOverflow()) {
|
|
173
|
+
this.isOverflowing$()
|
|
174
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
175
|
+
.subscribe((isElementOverflow) => {
|
|
176
|
+
this.checkOverflow(isElementOverflow);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
this.createInstance();
|
|
181
|
+
}
|
|
121
182
|
}
|
|
122
183
|
destroyView() {
|
|
123
184
|
this.viewOptions$ = null;
|
|
@@ -130,27 +191,24 @@ export class TippyDirective {
|
|
|
130
191
|
* For example, if you have a grid row with an element that you toggle using the display CSS property on hover.
|
|
131
192
|
*/
|
|
132
193
|
observeHostVisibility() {
|
|
133
|
-
if (this.
|
|
194
|
+
if (this.isServer)
|
|
134
195
|
return;
|
|
135
196
|
// We don't want to observe the host visibility if we are appending to the body.
|
|
136
197
|
if (this.props.appendTo && this.props.appendTo !== document.body) {
|
|
137
198
|
this.visibilityObserverCleanup?.();
|
|
138
199
|
return this.visibleInternal
|
|
139
|
-
.
|
|
140
|
-
.pipe(takeUntil(this.destroyed))
|
|
200
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
141
201
|
.subscribe((isVisible) => {
|
|
142
202
|
if (isVisible) {
|
|
143
|
-
this.
|
|
144
|
-
this.
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
153
|
-
});
|
|
203
|
+
this.visibilityObserverCleanup = observeVisibility(this.instance.reference, () => {
|
|
204
|
+
this.hide();
|
|
205
|
+
// Because we have animation on the popper it doesn't close immediately doesn't trigger the `tpVisible` event.
|
|
206
|
+
// Tippy is relying on the transitionend event to trigger the `onHidden` callback.
|
|
207
|
+
// https://github.com/atomiks/tippyjs/blob/master/src/dom-utils.ts#L117
|
|
208
|
+
// This event never fires because the popper is removed from the DOM before the transition ends.
|
|
209
|
+
if (this.props.animation) {
|
|
210
|
+
this.onHidden();
|
|
211
|
+
}
|
|
154
212
|
});
|
|
155
213
|
}
|
|
156
214
|
else {
|
|
@@ -178,85 +236,86 @@ export class TippyDirective {
|
|
|
178
236
|
this.props = props;
|
|
179
237
|
this.instance?.setProps(onlyTippyProps(props));
|
|
180
238
|
}
|
|
181
|
-
setStatus() {
|
|
182
|
-
|
|
183
|
-
}
|
|
184
|
-
get host() {
|
|
185
|
-
return this.customHost || this.hostRef.nativeElement;
|
|
186
|
-
}
|
|
187
|
-
get hostWidth() {
|
|
188
|
-
return this.host.getBoundingClientRect().width;
|
|
239
|
+
setStatus(isEnabled) {
|
|
240
|
+
isEnabled ? this.instance?.enable() : this.instance?.disable();
|
|
189
241
|
}
|
|
190
242
|
createInstance() {
|
|
191
|
-
if (!this.content && !this.useTextContent) {
|
|
243
|
+
if (!this.content() && !this.useTextContent()) {
|
|
192
244
|
return;
|
|
193
245
|
}
|
|
194
|
-
this.
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
this.
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
if (this.isVisible === true) {
|
|
219
|
-
instance.show();
|
|
246
|
+
this.tippyFactory
|
|
247
|
+
.create(this.host(), {
|
|
248
|
+
allowHTML: true,
|
|
249
|
+
appendTo: document.body,
|
|
250
|
+
...(this.globalConfig.zIndexGetter
|
|
251
|
+
? { zIndex: this.globalConfig.zIndexGetter() }
|
|
252
|
+
: {}),
|
|
253
|
+
...onlyTippyProps(this.globalConfig),
|
|
254
|
+
...onlyTippyProps(this.props),
|
|
255
|
+
onMount: (instance) => {
|
|
256
|
+
const isVisible = true;
|
|
257
|
+
this.isVisible.set(isVisible);
|
|
258
|
+
this.visibleInternal.next(isVisible);
|
|
259
|
+
if (this.visible.observed) {
|
|
260
|
+
this.ngZone.run(() => this.visible.next(isVisible));
|
|
261
|
+
}
|
|
262
|
+
this.useHostWidth() && this.listenToHostResize();
|
|
263
|
+
this.globalConfig.onMount?.(instance);
|
|
264
|
+
},
|
|
265
|
+
onCreate: (instance) => {
|
|
266
|
+
instance.popper.classList.add(`tippy-variation-${this.variation() || this.globalConfig.defaultVariation}`);
|
|
267
|
+
if (this.className()) {
|
|
268
|
+
for (const klass of normalizeClassName(this.className())) {
|
|
269
|
+
instance.popper.classList.add(klass);
|
|
220
270
|
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
this.hideOnEscape && this.handleEscapeButton();
|
|
237
|
-
});
|
|
238
|
-
if (this.useHostWidth) {
|
|
239
|
-
this.setInstanceWidth(instance, this.hostWidth);
|
|
271
|
+
}
|
|
272
|
+
this.globalConfig.onCreate?.(instance);
|
|
273
|
+
if (this.isVisible() === true) {
|
|
274
|
+
instance.show();
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
onShow: (instance) => {
|
|
278
|
+
instance.reference.setAttribute('data-tippy-open', '');
|
|
279
|
+
// We're re-entering because we might create an Angular component,
|
|
280
|
+
// which should be done within the zone.
|
|
281
|
+
const content = this.ngZone.run(() => this.resolveContent(instance));
|
|
282
|
+
if (isString(content)) {
|
|
283
|
+
instance.setProps({ allowHTML: false });
|
|
284
|
+
if (!content?.trim()) {
|
|
285
|
+
this.disable();
|
|
240
286
|
}
|
|
241
|
-
else
|
|
242
|
-
this.
|
|
287
|
+
else {
|
|
288
|
+
this.enable();
|
|
243
289
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
290
|
+
}
|
|
291
|
+
instance.setContent(content);
|
|
292
|
+
this.hideOnEscape() && this.handleEscapeButton();
|
|
293
|
+
if (this.useHostWidth()) {
|
|
294
|
+
this.setInstanceWidth(instance, this.hostWidth);
|
|
295
|
+
}
|
|
296
|
+
else if (this.popperWidth()) {
|
|
297
|
+
this.setInstanceWidth(instance, this.popperWidth());
|
|
298
|
+
}
|
|
299
|
+
this.globalConfig.onShow?.(instance);
|
|
300
|
+
},
|
|
301
|
+
onHide(instance) {
|
|
302
|
+
instance.reference.removeAttribute('data-tippy-open');
|
|
303
|
+
},
|
|
304
|
+
onHidden: (instance) => {
|
|
305
|
+
this.onHidden(instance);
|
|
306
|
+
},
|
|
307
|
+
})
|
|
308
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
309
|
+
.subscribe((instance) => {
|
|
310
|
+
this.instance = instance;
|
|
311
|
+
this.setStatus(this.isEnabled());
|
|
254
312
|
this.setProps(this.props);
|
|
255
|
-
this.variation === 'contextMenu' && this.handleContextMenu();
|
|
313
|
+
this.variation() === 'contextMenu' && this.handleContextMenu();
|
|
256
314
|
});
|
|
257
315
|
}
|
|
258
316
|
resolveContent(instance) {
|
|
259
|
-
|
|
317
|
+
const content = this.content();
|
|
318
|
+
if (!this.viewOptions$ && !isString(content)) {
|
|
260
319
|
const injector = Injector.create({
|
|
261
320
|
providers: [
|
|
262
321
|
{
|
|
@@ -266,42 +325,43 @@ export class TippyDirective {
|
|
|
266
325
|
],
|
|
267
326
|
parent: this.injector,
|
|
268
327
|
});
|
|
269
|
-
|
|
270
|
-
|
|
328
|
+
const data = this.data();
|
|
329
|
+
if (isComponent(content)) {
|
|
330
|
+
this.instance.data = data;
|
|
271
331
|
this.viewOptions$ = {
|
|
272
332
|
injector,
|
|
273
333
|
};
|
|
274
334
|
}
|
|
275
|
-
else if (isTemplateRef(
|
|
335
|
+
else if (isTemplateRef(content)) {
|
|
276
336
|
this.viewOptions$ = {
|
|
277
337
|
injector,
|
|
278
338
|
context: {
|
|
339
|
+
data,
|
|
279
340
|
$implicit: this.hide.bind(this),
|
|
280
|
-
data: this.data,
|
|
281
341
|
},
|
|
282
342
|
};
|
|
283
343
|
}
|
|
284
344
|
}
|
|
285
|
-
this.viewRef = this.viewService.createView(
|
|
345
|
+
this.viewRef = this.viewService.createView(content, {
|
|
286
346
|
vcr: this.vcr,
|
|
287
347
|
...this.viewOptions$,
|
|
288
348
|
});
|
|
289
349
|
// We need to call detectChanges for onPush components to update the content
|
|
290
|
-
if (this.detectChangesComponent && isComponent(
|
|
350
|
+
if (this.detectChangesComponent() && isComponent(content)) {
|
|
291
351
|
this.viewRef.detectChanges();
|
|
292
352
|
}
|
|
293
|
-
let
|
|
294
|
-
if (this.useTextContent) {
|
|
295
|
-
|
|
353
|
+
let newContent = this.viewRef.getElement();
|
|
354
|
+
if (this.useTextContent()) {
|
|
355
|
+
newContent = instance.reference.textContent;
|
|
296
356
|
}
|
|
297
|
-
if (isString(
|
|
298
|
-
|
|
357
|
+
if (isString(newContent) && this.globalConfig.beforeRender) {
|
|
358
|
+
newContent = this.globalConfig.beforeRender(newContent);
|
|
299
359
|
}
|
|
300
|
-
return
|
|
360
|
+
return newContent;
|
|
301
361
|
}
|
|
302
362
|
handleContextMenu() {
|
|
303
|
-
fromEvent(this.host, 'contextmenu')
|
|
304
|
-
.pipe(
|
|
363
|
+
fromEvent(this.host(), 'contextmenu')
|
|
364
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
305
365
|
.subscribe((event) => {
|
|
306
366
|
event.preventDefault();
|
|
307
367
|
this.instance.setProps({
|
|
@@ -318,11 +378,9 @@ export class TippyDirective {
|
|
|
318
378
|
});
|
|
319
379
|
}
|
|
320
380
|
handleEscapeButton() {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
.subscribe(() => this.hide());
|
|
325
|
-
});
|
|
381
|
+
fromEvent(document.body, 'keydown')
|
|
382
|
+
.pipe(filter(({ code }) => code === 'Escape'), takeUntil(this.visibleInternal.pipe(filter((v) => !v))), takeUntilDestroyed(this.destroyRef))
|
|
383
|
+
.subscribe(() => this.hide());
|
|
326
384
|
}
|
|
327
385
|
checkOverflow(isElementOverflow) {
|
|
328
386
|
if (isElementOverflow) {
|
|
@@ -338,8 +396,8 @@ export class TippyDirective {
|
|
|
338
396
|
}
|
|
339
397
|
}
|
|
340
398
|
listenToHostResize() {
|
|
341
|
-
dimensionsChanges(this.host)
|
|
342
|
-
.pipe(takeUntil(
|
|
399
|
+
dimensionsChanges(this.host())
|
|
400
|
+
.pipe(takeUntil(this.visibleInternal), takeUntilDestroyed(this.destroyRef))
|
|
343
401
|
.subscribe(() => {
|
|
344
402
|
this.setInstanceWidth(this.instance, this.hostWidth);
|
|
345
403
|
});
|
|
@@ -350,23 +408,22 @@ export class TippyDirective {
|
|
|
350
408
|
instance.popper.style.maxWidth = inPixels;
|
|
351
409
|
instance.popper.firstElementChild.style.maxWidth = inPixels;
|
|
352
410
|
}
|
|
353
|
-
get isServerSide() {
|
|
354
|
-
return isPlatformServer(this.platformId);
|
|
355
|
-
}
|
|
356
411
|
onHidden(instance = this.instance) {
|
|
357
412
|
this.destroyView();
|
|
358
|
-
|
|
359
|
-
this.
|
|
413
|
+
const isVisible = false;
|
|
414
|
+
this.isVisible.set(isVisible);
|
|
415
|
+
this.visibleInternal.next(isVisible);
|
|
360
416
|
if (this.visible.observed) {
|
|
361
|
-
this.
|
|
417
|
+
this.ngZone.run(() => this.visible.next(isVisible));
|
|
362
418
|
}
|
|
363
419
|
this.globalConfig.onHidden?.(instance);
|
|
364
420
|
}
|
|
365
421
|
isOverflowing$() {
|
|
366
|
-
const
|
|
422
|
+
const host = this.host();
|
|
423
|
+
const notifiers$ = [overflowChanges(host)];
|
|
367
424
|
// We need to handle cases where the host has a static width but the content might change
|
|
368
|
-
if (this.staticWidthHost) {
|
|
369
|
-
notifiers$.push(this.contentChanged.
|
|
425
|
+
if (this.staticWidthHost()) {
|
|
426
|
+
notifiers$.push(this.contentChanged.pipe(
|
|
370
427
|
// We need to wait for the content to be rendered before we can check if it's overflowing.
|
|
371
428
|
switchMap(() => {
|
|
372
429
|
return new Observable((subscriber) => {
|
|
@@ -376,14 +433,30 @@ export class TippyDirective {
|
|
|
376
433
|
});
|
|
377
434
|
return () => cancelAnimationFrame(id);
|
|
378
435
|
});
|
|
379
|
-
}), map(() => isElementOverflow(
|
|
436
|
+
}), map(() => isElementOverflow(host))));
|
|
380
437
|
}
|
|
381
438
|
return merge(...notifiers$);
|
|
382
439
|
}
|
|
383
|
-
|
|
384
|
-
|
|
440
|
+
setupListeners() {
|
|
441
|
+
effect(() => {
|
|
442
|
+
const appendTo = this.appendTo();
|
|
443
|
+
this.updateProps({ appendTo });
|
|
444
|
+
});
|
|
445
|
+
effect(() => {
|
|
446
|
+
// Capture signal read to track its changes.
|
|
447
|
+
this.content();
|
|
448
|
+
untracked(() => this.contentChanged.next());
|
|
449
|
+
});
|
|
450
|
+
effect(() => this.setStatus(this.isEnabled()));
|
|
451
|
+
effect(() => {
|
|
452
|
+
const isVisible = this.isVisible();
|
|
453
|
+
isVisible ? this.show() : this.hide();
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: TippyDirective, deps: [{ token: TIPPY_CONFIG }, { token: i0.Injector }, { token: i1.ViewService }, { token: i0.ViewContainerRef }, { token: i0.NgZone }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
457
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.6", type: TippyDirective, isStandalone: true, selector: "[tp]", inputs: { appendTo: { classPropertyName: "appendTo", publicName: "tpAppendTo", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "tp", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "tpDelay", isSignal: true, isRequired: false, transformFunction: null }, duration: { classPropertyName: "duration", publicName: "tpDuration", isSignal: true, isRequired: false, transformFunction: null }, hideOnClick: { classPropertyName: "hideOnClick", publicName: "tpHideOnClick", isSignal: true, isRequired: false, transformFunction: null }, interactive: { classPropertyName: "interactive", publicName: "tpInteractive", isSignal: true, isRequired: false, transformFunction: null }, interactiveBorder: { classPropertyName: "interactiveBorder", publicName: "tpInteractiveBorder", isSignal: true, isRequired: false, transformFunction: null }, maxWidth: { classPropertyName: "maxWidth", publicName: "tpMaxWidth", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "tpOffset", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "tpPlacement", isSignal: true, isRequired: false, transformFunction: null }, popperOptions: { classPropertyName: "popperOptions", publicName: "tpPopperOptions", isSignal: true, isRequired: false, transformFunction: null }, showOnCreate: { classPropertyName: "showOnCreate", publicName: "tpShowOnCreate", isSignal: true, isRequired: false, transformFunction: null }, trigger: { classPropertyName: "trigger", publicName: "tpTrigger", isSignal: true, isRequired: false, transformFunction: null }, triggerTarget: { classPropertyName: "triggerTarget", publicName: "tpTriggerTarget", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "tpZIndex", isSignal: true, isRequired: false, transformFunction: null }, animation: { classPropertyName: "animation", publicName: "tpAnimation", isSignal: true, isRequired: false, transformFunction: null }, useTextContent: { classPropertyName: "useTextContent", publicName: "tpUseTextContent", isSignal: true, isRequired: false, transformFunction: null }, isLazy: { classPropertyName: "isLazy", publicName: "tpIsLazy", isSignal: true, isRequired: false, transformFunction: null }, variation: { classPropertyName: "variation", publicName: "tpVariation", isSignal: true, isRequired: false, transformFunction: null }, isEnabled: { classPropertyName: "isEnabled", publicName: "tpIsEnabled", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "tpClassName", isSignal: true, isRequired: false, transformFunction: null }, onlyTextOverflow: { classPropertyName: "onlyTextOverflow", publicName: "tpOnlyTextOverflow", isSignal: true, isRequired: false, transformFunction: null }, staticWidthHost: { classPropertyName: "staticWidthHost", publicName: "tpStaticWidthHost", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "tpData", isSignal: true, isRequired: false, transformFunction: null }, useHostWidth: { classPropertyName: "useHostWidth", publicName: "tpUseHostWidth", isSignal: true, isRequired: false, transformFunction: null }, hideOnEscape: { classPropertyName: "hideOnEscape", publicName: "tpHideOnEscape", isSignal: true, isRequired: false, transformFunction: null }, detectChangesComponent: { classPropertyName: "detectChangesComponent", publicName: "tpDetectChangesComponent", isSignal: true, isRequired: false, transformFunction: null }, popperWidth: { classPropertyName: "popperWidth", publicName: "tpPopperWidth", isSignal: true, isRequired: false, transformFunction: null }, customHost: { classPropertyName: "customHost", publicName: "tpHost", isSignal: true, isRequired: false, transformFunction: null }, isVisible: { classPropertyName: "isVisible", publicName: "tpIsVisible", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { isVisible: "tpIsVisibleChange", visible: "tpVisible" }, exportAs: ["tippy"], usesOnChanges: true, ngImport: i0 }); }
|
|
385
458
|
}
|
|
386
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
459
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.6", ngImport: i0, type: TippyDirective, decorators: [{
|
|
387
460
|
type: Directive,
|
|
388
461
|
args: [{
|
|
389
462
|
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
@@ -392,106 +465,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImpor
|
|
|
392
465
|
standalone: true,
|
|
393
466
|
}]
|
|
394
467
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
395
|
-
type: Inject,
|
|
396
|
-
args: [PLATFORM_ID]
|
|
397
|
-
}] }, { type: undefined, decorators: [{
|
|
398
468
|
type: Inject,
|
|
399
469
|
args: [TIPPY_CONFIG]
|
|
400
|
-
}] }, { type: i0.Injector }, { type: i1.ViewService }, { type: i0.ViewContainerRef }, { type: i0.NgZone }, { type: i0.ElementRef }], propDecorators: {
|
|
401
|
-
type: Input,
|
|
402
|
-
args: ['tpAppendTo']
|
|
403
|
-
}], content: [{
|
|
404
|
-
type: Input,
|
|
405
|
-
args: ['tp']
|
|
406
|
-
}], delay: [{
|
|
407
|
-
type: Input,
|
|
408
|
-
args: ['tpDelay']
|
|
409
|
-
}], duration: [{
|
|
410
|
-
type: Input,
|
|
411
|
-
args: ['tpDuration']
|
|
412
|
-
}], hideOnClick: [{
|
|
413
|
-
type: Input,
|
|
414
|
-
args: ['tpHideOnClick']
|
|
415
|
-
}], interactive: [{
|
|
416
|
-
type: Input,
|
|
417
|
-
args: ['tpInteractive']
|
|
418
|
-
}], interactiveBorder: [{
|
|
419
|
-
type: Input,
|
|
420
|
-
args: ['tpInteractiveBorder']
|
|
421
|
-
}], maxWidth: [{
|
|
422
|
-
type: Input,
|
|
423
|
-
args: ['tpMaxWidth']
|
|
424
|
-
}], offset: [{
|
|
425
|
-
type: Input,
|
|
426
|
-
args: ['tpOffset']
|
|
427
|
-
}], placement: [{
|
|
428
|
-
type: Input,
|
|
429
|
-
args: ['tpPlacement']
|
|
430
|
-
}], popperOptions: [{
|
|
431
|
-
type: Input,
|
|
432
|
-
args: ['tpPopperOptions']
|
|
433
|
-
}], showOnCreate: [{
|
|
434
|
-
type: Input,
|
|
435
|
-
args: ['tpShowOnCreate']
|
|
436
|
-
}], trigger: [{
|
|
437
|
-
type: Input,
|
|
438
|
-
args: ['tpTrigger']
|
|
439
|
-
}], triggerTarget: [{
|
|
440
|
-
type: Input,
|
|
441
|
-
args: ['tpTriggerTarget']
|
|
442
|
-
}], zIndex: [{
|
|
443
|
-
type: Input,
|
|
444
|
-
args: ['tpZIndex']
|
|
445
|
-
}], animation: [{
|
|
446
|
-
type: Input,
|
|
447
|
-
args: ['tpAnimation']
|
|
448
|
-
}], useTextContent: [{
|
|
449
|
-
type: Input,
|
|
450
|
-
args: [{ transform: booleanAttribute, alias: 'tpUseTextContent' }]
|
|
451
|
-
}], isLazy: [{
|
|
452
|
-
type: Input,
|
|
453
|
-
args: [{ transform: booleanAttribute, alias: 'tpIsLazy' }]
|
|
454
|
-
}], variation: [{
|
|
455
|
-
type: Input,
|
|
456
|
-
args: ['tpVariation']
|
|
457
|
-
}], isEnabled: [{
|
|
458
|
-
type: Input,
|
|
459
|
-
args: ['tpIsEnabled']
|
|
460
|
-
}], className: [{
|
|
461
|
-
type: Input,
|
|
462
|
-
args: ['tpClassName']
|
|
463
|
-
}], onlyTextOverflow: [{
|
|
464
|
-
type: Input,
|
|
465
|
-
args: [{ transform: booleanAttribute, alias: 'tpOnlyTextOverflow' }]
|
|
466
|
-
}], staticWidthHost: [{
|
|
467
|
-
type: Input,
|
|
468
|
-
args: [{ transform: booleanAttribute, alias: 'tpStaticWidthHost' }]
|
|
469
|
-
}], data: [{
|
|
470
|
-
type: Input,
|
|
471
|
-
args: ['tpData']
|
|
472
|
-
}], useHostWidth: [{
|
|
473
|
-
type: Input,
|
|
474
|
-
args: [{ transform: booleanAttribute, alias: 'tpUseHostWidth' }]
|
|
475
|
-
}], hideOnEscape: [{
|
|
476
|
-
type: Input,
|
|
477
|
-
args: [{ transform: booleanAttribute, alias: 'tpHideOnEscape' }]
|
|
478
|
-
}], detectChangesComponent: [{
|
|
479
|
-
type: Input,
|
|
480
|
-
args: ['tpDetectChangesComponent']
|
|
481
|
-
}], popperWidth: [{
|
|
482
|
-
type: Input,
|
|
483
|
-
args: ['tpPopperWidth']
|
|
484
|
-
}], customHost: [{
|
|
485
|
-
type: Input,
|
|
486
|
-
args: ['tpHost']
|
|
487
|
-
}], isVisible: [{
|
|
488
|
-
type: Input,
|
|
489
|
-
args: [{ transform: booleanAttribute, alias: 'tpIsVisible' }]
|
|
490
|
-
}], visible: [{
|
|
470
|
+
}] }, { type: i0.Injector }, { type: i1.ViewService }, { type: i0.ViewContainerRef }, { type: i0.NgZone }, { type: i0.ElementRef }], propDecorators: { visible: [{
|
|
491
471
|
type: Output,
|
|
492
472
|
args: ['tpVisible']
|
|
493
473
|
}] } });
|
|
494
474
|
function isChanged(key, changes) {
|
|
495
475
|
return key in changes;
|
|
496
476
|
}
|
|
497
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlwcHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmduZWF0L2hlbGlwb3BwZXIvc3JjL2xpYi90aXBweS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUtMLE1BQU0sRUFDTixXQUFXLEdBRVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxLQUFtQixNQUFNLFVBQVUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQVcsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQXFDLE1BQU0sa0JBQWtCLENBQUM7QUFFcEgsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxlQUFlLEdBQ2hCLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBYSxZQUFZLEVBQUUsU0FBUyxFQUEwQyxNQUFNLGVBQWUsQ0FBQzs7O0FBUTNHLE1BQU0sT0FBTyxjQUFjO0lBQ3pCLElBQXlCLFFBQVEsQ0FBQyxRQUFnQztRQUNoRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBb0RELFlBQ2lDLFVBQWtCLEVBQ2pCLFlBQXlCLEVBQy9DLFFBQWtCLEVBQ2xC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QUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtnQkFDRSxZQUFZO3NCQUE1RSxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtnQkFDNUIsc0JBQXNCO3NCQUF4RCxLQUFLO3VCQUFDLDBCQUEwQjtnQkFDVCxXQUFXO3NCQUFsQyxLQUFLO3VCQUFDLGVBQWU7Z0JBQ0wsVUFBVTtzQkFBMUIsS0FBSzt1QkFBQyxRQUFRO2dCQUMrQyxTQUFTO3NCQUF0RSxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7Z0JBRXZDLE9BQU87c0JBQTNCLE1BQU07dUJBQUMsV0FBVzs7QUFzYXJCLFNBQVMsU0FBUyxDQUFDLEdBQW9DLEVBQUUsT0FBa0M7SUFDekYsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB0aXBweSwgeyBJbnN0YW5jZSB9IGZyb20gJ3RpcHB5LmpzJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbnRlbnQsIGlzQ29tcG9uZW50LCBpc1N0cmluZywgaXNUZW1wbGF0ZVJlZiwgVmlld09wdGlvbnMsIFZpZXdSZWYsIFZpZXdTZXJ2aWNlIH0gZnJvbSAnQG5nbmVhdC9vdmVydmlldyc7XG5cbmltcG9ydCB7XG4gIGNvZXJjZUNzc1BpeGVsVmFsdWUsXG4gIGRpbWVuc2lvbnNDaGFuZ2VzLFxuICBpblZpZXcsXG4gIGlzRWxlbWVudE92ZXJmbG93LFxuICBub3JtYWxpemVDbGFzc05hbWUsXG4gIG9ic2VydmVWaXNpYmlsaXR5LFxuICBvbmx5VGlwcHlQcm9wcyxcbiAgb3ZlcmZsb3dDaGFuZ2VzLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IE5nQ2hhbmdlcywgVElQUFlfQ09ORklHLCBUSVBQWV9SRUYsIFRpcHB5Q29uZmlnLCBUaXBweUluc3RhbmNlLCBUaXBweVByb3BzIH0gZnJvbSAnLi90aXBweS50eXBlcyc7XG5cbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1t0cF0nLFxuICBleHBvcnRBczogJ3RpcHB5JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgVGlwcHlEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgQElucHV0KCd0cEFwcGVuZFRvJykgc2V0IGFwcGVuZFRvKGFwcGVuZFRvOiBUaXBweVByb3BzWydhcHBlbmRUbyddKSB7XG4gICAgdGhpcy51cGRhdGVQcm9wcyh7IGFwcGVuZFRvIH0pO1xuICB9XG4gIEBJbnB1dCgndHAnKSBjb250ZW50OiBDb250ZW50IHwgdW5kZWZpbmVkIHwgbnVsbDtcbiAgQElucHV0KCd0cERlbGF5JykgZGVsYXk6IFRpcHB5UHJvcHNbJ2RlbGF5J107XG4gIEBJbnB1dCgndHBEdXJhdGlvbicpIGR1cmF0aW9uOiBUaXBweVByb3BzWydkdXJhdGlvbiddO1xuICBASW5wdXQoJ3RwSGlkZU9uQ2xpY2snKSBoaWRlT25DbGljazogVGlwcHlQcm9wc1snaGlkZU9uQ2xpY2snXTtcbiAgQElucHV0KCd0cEludGVyYWN0aXZlJykgaW50ZXJhY3RpdmU6IFRpcHB5UHJvcHNbJ2ludGVyYWN0aXZlJ107XG4gIEBJbnB1dCgndHBJbnRlcmFjdGl2ZUJvcmRlcicpIGludGVyYWN0aXZlQm9yZGVyOiBUaXBweVByb3BzWydpbnRlcmFjdGl2ZUJvcmRlciddO1xuICBASW5wdXQoJ3RwTWF4V2lkdGgnKSBtYXhXaWR0aDogVGlwcHlQcm9wc1snbWF4V2lkdGgnXTtcbiAgQElucHV0KCd0cE9mZnNldCcpIG9mZnNldDogVGlwcHlQcm9wc1snb2Zmc2V0J107XG4gIEBJbnB1dCgndHBQbGFjZW1lbnQnKSBwbGFjZW1lbnQ6IFRpcHB5UHJvcHNbJ3BsYWNlbWVudCddO1xuICBASW5wdXQoJ3RwUG9wcGVyT3B0aW9ucycpIHBvcHBlck9wdGlvbnM6IFRpcHB5UHJvcHNbJ3BvcHBlck9wdGlvbnMnXTtcbiAgQElucHV0KCd0cFNob3dPbkNyZWF0ZScpIHNob3dPbkNyZWF0ZTogVGlwcHlQcm9wc1snc2hvd09uQ3JlYXRlJ107XG4gIEBJbnB1dCgndHBUcmlnZ2VyJykgdHJpZ2dlcjogVGlwcHlQcm9wc1sndHJpZ2dlciddO1xuICBASW5wdXQoJ3RwVHJpZ2dlclRhcmdldCcpIHRyaWdnZXJUYXJnZXQ6IFRpcHB5UHJvcHNbJ3RyaWdnZXJUYXJnZXQnXTtcbiAgQElucHV0KCd0cFpJbmRleCcpIHpJbmRleDogVGlwcHlQcm9wc1snekluZGV4J107XG4gIEBJbnB1dCgndHBBbmltYXRpb24nKSBhbmltYXRpb246IFRpcHB5UHJvcHNbJ2FuaW1hdGlvbiddO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAndHBVc2VUZXh0Q29udGVudCcgfSkgdXNlVGV4dENvbnRlbnQ6IGJvb2xlYW47XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICd0cElzTGF6eScgfSkgaXNMYXp5OiBib29sZWFuO1xuICBASW5wdXQoJ3RwVmFyaWF0aW9uJykgdmFyaWF0aW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgndHBJc0VuYWJsZWQnKSBpc0VuYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgndHBDbGFzc05hbWUnKSBjbGFzc05hbWU6IHN0cmluZyB8IHN0cmluZ1tdO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAndHBPbmx5VGV4dE92ZXJmbG93JyB9KSBvbmx5VGV4dE92ZXJmbG93ID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSwgYWxpYXM6ICd0cFN0YXRpY1dpZHRoSG9zdCcgfSkgc3RhdGljV2lkdGhIb3N0ID0gZmFsc2U7XG4gIEBJbnB1dCgndHBEYXRhJykgZGF0YTogYW55O1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAndHBVc2VIb3N0V2lkdGgnIH0pIHVzZUhvc3RXaWR0aCA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAndHBIaWRlT25Fc2NhcGUnIH0pIGhpZGVPbkVzY2FwZSA9IGZhbHNlO1xuICBASW5wdXQoJ3RwRGV0ZWN0Q2hhbmdlc0NvbXBvbmVudCcpIGRldGVjdENoYW5nZXNDb21wb25lbnQgPSB0cnVlO1xuICBASW5wdXQoJ3RwUG9wcGVyV2lkdGgnKSBwb3BwZXJXaWR0aDogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoJ3RwSG9zdCcpIGN1c3RvbUhvc3Q6IEhUTUxFbGVtZW50O1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsIGFsaWFzOiAndHBJc1Zpc2libGUnIH0pIGlzVmlzaWJsZSA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoJ3RwVmlzaWJsZScpIHZpc2libGUgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgcHJvdGVjdGVkIGluc3RhbmNlOiBUaXBweUluc3RhbmNlO1xuICBwcm90ZWN0ZWQgdmlld1JlZjogVmlld1JlZjtcbiAgcHJvdGVjdGVkIGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByb3RlY3RlZCBwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz47XG4gIHByb3RlY3RlZCBlbmFibGVkID0gdHJ1ZTtcbiAgcHJvdGVjdGVkIHZhcmlhdGlvbkRlZmluZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHZpZXdPcHRpb25zJDogVmlld09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFdlIGhhZCB1c2UgYHZpc2libGVgIGV2ZW50IGVtaXR0ZXIgcHJldmlvdXNseSBhcyBhIGB0YWtlVW50aWxgIHN1YnNjcmliZXIgaW4gbXVsdGlwbGUgcGxhY2VzXG4gICAqIHdpdGhpbiB0aGUgZGlyZWN0aXZlLlxuICAgKiBUaGlzIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgdGh1cyB3ZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCB0aGUgYHZpc2libGVgIGV2ZW50IGVtaXR0ZXJcbiAgICogYW5kIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbnMgb25seSB3aGVuIHRoZSBgdmlzaWJsZWAgZXZlbnQgaXMgYmVpbmcgbGlzdGVuZWQgb3V0c2lkZVxuICAgKiBpbiB0aGUgdGVtcGxhdGUgKGA8YnV0dG9uIFt0aXBweV09XCIuLi5cIiAodmlzaWJsZSk9XCIuLi5cIj48L2J1dHRvbj5gKS5cbiAgICovXG4gIHByb3RlY3RlZCB2aXNpYmxlSW50ZXJuYWwgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIHZpc2liaWxpdHlPYnNlcnZlckNsZWFudXA6ICgpID0+IHZvaWQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgY29udGVudENoYW5nZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByb3RlY3RlZCBwbGF0Zm9ybUlkOiBzdHJpbmcsXG4gICAgQEluamVjdChUSVBQWV9DT05GSUcpIHByb3RlY3RlZCBnbG9iYWxDb25maWc6IFRpcHB5Q29uZmlnLFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIHZpZXdTZXJ2aWNlOiBWaWV3U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdmNyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByb3RlY3RlZCB6b25lOiBOZ1pvbmUsXG4gICAgcHJvdGVjdGVkIGhvc3RSZWY6IEVsZW1lbnRSZWZcbiAgKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IE5nQ2hhbmdlczxUaXBweURpcmVjdGl2ZT4pIHtcbiAgICBpZiAodGhpcy5pc1NlcnZlclNpZGUpIHJldHVybjtcblxuICAgIGxldCBwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz4gPSBPYmplY3Qua2V5cyhjaGFuZ2VzKS5yZWR1Y2UoKGFjYywgY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlID09PSAnaXNWaXNpYmxlJykgcmV0dXJuIGFjYztcblxuICAgICAgYWNjW2NoYW5nZV0gPSBjaGFuZ2VzW2NoYW5nZV0uY3VycmVudFZhbHVlO1xuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIGxldCB2YXJpYXRpb246IHN0cmluZztcblxuICAgIGlmIChpc0NoYW5nZWQoJ2NvbnRlbnQnLCBjaGFuZ2VzKSkge1xuICAgICAgdGhpcy5jb250ZW50Q2hhbmdlZC5uZXh0KCk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ2hhbmdlZCgndmFyaWF0aW9uJywgY2hhbmdlcykpIHtcbiAgICAgIHZhcmlhdGlvbiA9IGNoYW5nZXMudmFyaWF0aW9uLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMudmFyaWF0aW9uRGVmaW5lZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmICghdGhpcy52YXJpYXRpb25EZWZpbmVkKSB7XG4gICAgICB2YXJpYXRpb24gPSB0aGlzLmdsb2JhbENvbmZpZy5kZWZhdWx0VmFyaWF0aW9uO1xuICAgICAgdGhpcy52YXJpYXRpb25EZWZpbmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodmFyaWF0aW9uKSB7XG4gICAgICBwcm9wcyA9IHtcbiAgICAgICAgLi4udGhpcy5nbG9iYWxDb25maWcudmFyaWF0aW9uc1t2YXJpYXRpb25dLFxuICAgICAgICAuLi5wcm9wcyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGlzQ2hhbmdlZCgnaXNFbmFibGVkJywgY2hhbmdlcykpIHtcbiAgICAgIHRoaXMuZW5hYmxlZCA9IGNoYW5nZXMuaXNFbmFibGVkLmN1cnJlbnRWYWx1ZTtcbiAgICAgIHRoaXMuc2V0U3RhdHVzKCk7XG4gICAgfVxuXG4gICAgaWYgKGlzQ2hhbmdlZCgnaXNWaXNpYmxlJywgY2hhbmdlcykpIHtcbiAgICAgIHRoaXMuaXNWaXNpYmxlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVByb3BzKHByb3BzKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLnVzZUhvc3RXaWR0aCkge1xuICAgICAgdGhpcy5wcm9wcy5tYXhXaWR0aCA9IHRoaXMuaG9zdFdpZHRoO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5pc1NlcnZlclNpZGUpIHJldHVybjtcblxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0xhenkpIHtcbiAgICAgICAgaWYgKHRoaXMub25seVRleHRPdmVyZmxvdykge1xuICAgICAgICAgIGluVmlldyh0aGlzLmhvc3QpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuaXNPdmVyZmxvd2luZyQoKSksXG4gICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGlzRWxlbWVudE92ZXJmbG93KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyZmxvdyhpc0VsZW1lbnRPdmVyZmxvdyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpblZpZXcodGhpcy5ob3N0KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUluc3RhbmNlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLm9ubHlUZXh0T3ZlcmZsb3cpIHtcbiAgICAgICAgdGhpcy5pc092ZXJmbG93aW5nJCgpXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgICAgICAuc3Vic2NyaWJlKChpc0VsZW1lbnRPdmVyZmxvdykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja092ZXJmbG93KGlzRWxlbWVudE92ZXJmbG93KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3JlYXRlSW5zdGFuY2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLmluc3RhbmNlPy5kZXN0cm95KCk7XG4gICAgdGhpcy5kZXN0cm95VmlldygpO1xuICAgIHRoaXMudmlzaWJpbGl0eU9ic2VydmVyQ2xlYW51cD8uKCk7XG4gIH1cblxuICBkZXN0cm95VmlldygpIHtcbiAgICB0aGlzLnZpZXdPcHRpb25zJCA9IG51bGw7XG4gICAgdGhpcy52aWV3UmVmPy5kZXN0cm95KCk7XG4gICAgdGhpcy52aWV3UmVmID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgd2hlbiB5b3UgYXBwZW5kIHRvIGFuIGVsZW1lbnQgdGhhdCB5b3UgbWlnaHQgcmVtb3ZlIGZyb20gdGhlIERPTS5cbiAgICogSW4gc3VjaCBjYXNlcyB3ZSB3YW50IHRvIGhpZGUgdGhlIHRvb2x0aXAgYW5kIGxldCBpdCBnbyB0aHJvdWdoIHRoZSBkZXN0cm95IGxpZmVjeWNsZS5cbiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZ3JpZCByb3cgd2l0aCBhbiBlbGVtZW50IHRoYXQgeW91IHRvZ2dsZSB1c2luZyB0aGUgZGlzcGxheSBDU1MgcHJvcGVydHkgb24gaG92ZXIuXG4gICAqL1xuICBvYnNlcnZlSG9zdFZpc2liaWxpdHkoKSB7XG4gICAgaWYgKHRoaXMuaXNTZXJ2ZXJTaWRlKSByZXR1cm47XG4gICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBvYnNlcnZlIHRoZSBob3N0IHZpc2liaWxpdHkgaWYgd2UgYXJlIGFwcGVuZGluZyB0byB0aGUgYm9keS5cbiAgICBpZiAodGhpcy5wcm9wcy5hcHBlbmRUbyAmJiB0aGlzLnByb3BzLmFwcGVuZFRvICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICB0aGlzLnZpc2liaWxpdHlPYnNlcnZlckNsZWFudXA/LigpO1xuICAgICAgcmV0dXJuIHRoaXMudmlzaWJsZUludGVybmFsXG4gICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgICAuc3Vic2NyaWJlKChpc1Zpc2libGUpID0+IHtcbiAgICAgICAgICBpZiAoaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnZpc2liaWxpdHlPYnNlcnZlckNsZWFudXAgPSBvYnNlcnZlVmlzaWJpbGl0eSh0aGlzLmluc3RhbmNlLnJlZmVyZW5jZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2UgaGF2ZSBhbmltYXRpb24gb24gdGhlIHBvcHBlciBpdCBkb2Vzbid0IGNsb3NlIGltbWVkaWF0ZWx5IGRvZXNuJ3QgdHJpZ2dlciB0aGUgYHRwVmlzaWJsZWAgZXZlbnQuXG4gICAgICAgICAgICAgICAgLy8gVGlwcHkgaXMgcmVseWluZyBvbiB0aGUgdHJhbnNpdGlvbmVuZCBldmVudCB0byB0cmlnZ2VyIHRoZSBgb25IaWRkZW5gIGNhbGxiYWNrLlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hdG9taWtzL3RpcHB5anMvYmxvYi9tYXN0ZXIvc3JjL2RvbS11dGlscy50cyNMMTE3XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBldmVudCBuZXZlciBmaXJlcyBiZWNhdXNlIHRoZSBwb3BwZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gYmVmb3JlIHRoZSB0cmFuc2l0aW9uIGVuZHMuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm9uSGlkZGVuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpc2liaWxpdHlPYnNlcnZlckNsZWFudXA/LigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICB0aGlzLmluc3RhbmNlPy5zaG93KCk7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMuaW5zdGFuY2U/LmhpZGUoKTtcbiAgfVxuXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLmluc3RhbmNlPy5lbmFibGUoKTtcbiAgfVxuXG4gIGRpc2FibGUoKSB7XG4gICAgdGhpcy5pbnN0YW5jZT8uZGlzYWJsZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVByb3BzKHByb3BzOiBQYXJ0aWFsPFRpcHB5Q29uZmlnPikge1xuICAgIHRoaXMuc2V0UHJvcHMoeyAuLi50aGlzLnByb3BzLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRQcm9wcyhwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz4pIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5pbnN0YW5jZT8uc2V0UHJvcHMob25seVRpcHB5UHJvcHMocHJvcHMpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRTdGF0dXMoKSB7XG4gICAgdGhpcy5lbmFibGVkID8gdGhpcy5pbnN0YW5jZT8uZW5hYmxlKCkgOiB0aGlzLmluc3RhbmNlPy5kaXNhYmxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGhvc3QoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbUhvc3QgfHwgdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGhvc3RXaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlSW5zdGFuY2UoKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnQgJiYgIXRoaXMudXNlVGV4dENvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5pbnN0YW5jZSA9IHRpcHB5KHRoaXMuaG9zdCwge1xuICAgICAgICBhbGxvd0hUTUw6IHRydWUsXG4gICAgICAgIGFwcGVuZFRvOiBkb2N1bWVudC5ib2R5LFxuICAgICAgICAuLi4odGhpcy5nbG9iYWxDb25maWcuekluZGV4R2V0dGVyID8geyB6SW5kZXg6IHRoaXMuZ2xvYmFsQ29uZmlnLnpJbmRleEdldHRlcigpIH0gOiB7fSksXG4gICAgICAgIC4uLm9ubHlUaXBweVByb3BzKHRoaXMuZ2xvYmFsQ29uZmlnKSxcbiAgICAgICAgLi4ub25seVRpcHB5UHJvcHModGhpcy5wcm9wcyksXG4gICAgICAgIG9uTW91bnQ6IChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnZpc2libGVJbnRlcm5hbC5uZXh0KHRoaXMuaXNWaXNpYmxlKTtcbiAgICAgICAgICBpZiAodGhpcy52aXNpYmxlLm9ic2VydmVkKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHRoaXMudmlzaWJsZS5uZXh0KHRoaXMuaXNWaXNpYmxlKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXNlSG9zdFdpZHRoICYmIHRoaXMubGlzdGVuVG9Ib3N0UmVzaXplKCk7XG4gICAgICAgICAgdGhpcy5nbG9iYWxDb25maWcub25Nb3VudD8uKGluc3RhbmNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DcmVhdGU6IChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgIGluc3RhbmNlLnBvcHBlci5jbGFzc0xpc3QuYWRkKGB0aXBweS12YXJpYXRpb24tJHt0aGlzLnZhcmlhdGlvbiB8fCB0aGlzLmdsb2JhbENvbmZpZy5kZWZhdWx0VmFyaWF0aW9ufWApO1xuICAgICAgICAgIGlmICh0aGlzLmNsYXNzTmFtZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrbGFzcyBvZiBub3JtYWxpemVDbGFzc05hbWUodGhpcy5jbGFzc05hbWUpKSB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLnBvcHBlci5jbGFzc0xpc3QuYWRkKGtsYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5nbG9iYWxDb25maWcub25DcmVhdGU/LihpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5zaG93KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvblNob3c6IChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgIGluc3RhbmNlLnJlZmVyZW5jZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGlwcHktb3BlbicsICcnKTtcbiAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnJlc29sdmVDb250ZW50KGluc3RhbmNlKTtcbiAgICAgICAgICAgIGlmIChpc1N0cmluZyhjb250ZW50KSkge1xuICAgICAgICAgICAgICBpbnN0YW5jZS5zZXRQcm9wcyh7IGFsbG93SFRNTDogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgICAgaWYgKCFjb250ZW50Py50cmltKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluc3RhbmNlLnNldENvbnRlbnQoY29udGVudCk7XG4gICAgICAgICAgICB0aGlzLmhpZGVPbkVzY2FwZSAmJiB0aGlzLmhhbmRsZUVzY2FwZUJ1dHRvbigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICh0aGlzLnVzZUhvc3RXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5zZXRJbnN0YW5jZVdpZHRoKGluc3RhbmNlLCB0aGlzLmhvc3RXaWR0aCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnBvcHBlcldpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluc3RhbmNlV2lkdGgoaW5zdGFuY2UsIHRoaXMucG9wcGVyV2lkdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmdsb2JhbENvbmZpZy5vblNob3c/LihpbnN0YW5jZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uSGlkZShpbnN0YW5jZSkge1xuICAgICAgICAgIGluc3RhbmNlLnJlZmVyZW5jZS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtdGlwcHktb3BlbicpO1xuICAgICAgICB9LFxuICAgICAgICBvbkhpZGRlbjogKGluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5vbkhpZGRlbihpbnN0YW5jZSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zZXRTdGF0dXMoKTtcbiAgICAgIHRoaXMuc2V0UHJvcHModGhpcy5wcm9wcyk7XG5cbiAgICAgIHRoaXMudmFyaWF0aW9uID09PSAnY29udGV4dE1lbnUnICYmIHRoaXMuaGFuZGxlQ29udGV4dE1lbnUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlQ29udGVudChpbnN0YW5jZTogVGlwcHlJbnN0YW5jZSkge1xuICAgIGlmICghdGhpcy52aWV3T3B0aW9ucyQgJiYgIWlzU3RyaW5nKHRoaXMuY29udGVudCkpIHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVElQUFlfUkVGLFxuICAgICAgICAgICAgdXNlVmFsdWU6IHRoaXMuaW5zdGFuY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yLFxuICAgICAgfSk7XG4gICAgICBpZiAoaXNDb21wb25lbnQodGhpcy5jb250ZW50KSkge1xuICAgICAgICB0aGlzLmluc3RhbmNlLmRhdGEgPSB0aGlzLmRhdGE7XG5cbiAgICAgICAgdGhpcy52aWV3T3B0aW9ucyQgPSB7XG4gICAgICAgICAgaW5qZWN0b3IsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGlzVGVtcGxhdGVSZWYodGhpcy5jb250ZW50KSkge1xuICAgICAgICB0aGlzLnZpZXdPcHRpb25zJCA9IHtcbiAgICAgICAgICBpbmplY3RvcixcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXMuaGlkZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy52aWV3UmVmID0gdGhpcy52aWV3U2VydmljZS5jcmVhdGVWaWV3KHRoaXMuY29udGVudCwge1xuICAgICAgdmNyOiB0aGlzLnZjcixcbiAgICAgIC4uLnRoaXMudmlld09wdGlvbnMkLFxuICAgIH0pO1xuXG4gICAgLy8gV2UgbmVlZCB0byBjYWxsIGRldGVjdENoYW5nZXMgZm9yIG9uUHVzaCBjb21wb25lbnRzIHRvIHVwZGF0ZSB0aGUgY29udGVudFxuICAgIGlmICh0aGlzLmRldGVjdENoYW5nZXNDb21wb25lbnQgJiYgaXNDb21wb25lbnQodGhpcy5jb250ZW50KSkge1xuICAgICAgdGhpcy52aWV3UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBsZXQgY29udGVudCA9IHRoaXMudmlld1JlZi5nZXRFbGVtZW50KCk7XG5cbiAgICBpZiAodGhpcy51c2VUZXh0Q29udGVudCkge1xuICAgICAgY29udGVudCA9IGluc3RhbmNlLnJlZmVyZW5jZS50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICBpZiAoaXNTdHJpbmcoY29udGVudCkgJiYgdGhpcy5nbG9iYWxDb25maWcuYmVmb3JlUmVuZGVyKSB7XG4gICAgICBjb250ZW50ID0gdGhpcy5nbG9iYWxDb25maWcuYmVmb3JlUmVuZGVyKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUNvbnRleHRNZW51KCkge1xuICAgIGZyb21FdmVudCh0aGlzLmhvc3QsICdjb250ZXh0bWVudScpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLmluc3RhbmNlLnNldFByb3BzKHtcbiAgICAgICAgICBnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiAoKSA9PlxuICAgICAgICAgICAgKHtcbiAgICAgICAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgICAgICAgdG9wOiBldmVudC5jbGllbnRZLFxuICAgICAgICAgICAgICBib3R0b206IGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgICAgIGxlZnQ6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgICAgIHJpZ2h0OiBldmVudC5jbGllbnRYLFxuICAgICAgICAgICAgfSBhcyBET01SZWN0UmVhZE9ubHkpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmluc3RhbmNlLnNob3coKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUVzY2FwZUJ1dHRvbigpOiB2b2lkIHtcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LmJvZHksICdrZXlkb3duJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKCh7IGNvZGUgfTogS2V5Ym9hcmRFdmVudCkgPT4gY29kZSA9PT0gJ0VzY2FwZScpLFxuICAgICAgICAgIHRha2VVbnRpbChtZXJnZSh0aGlzLmRlc3Ryb3llZCwgdGhpcy52aXNpYmxlSW50ZXJuYWwucGlwZShmaWx0ZXIoKHYpID0+ICF2KSkpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5oaWRlKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrT3ZlcmZsb3coaXNFbGVtZW50T3ZlcmZsb3c6IGJvb2xlYW4pIHtcbiAgICBpZiAoaXNFbGVtZW50T3ZlcmZsb3cpIHtcbiAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUluc3RhbmNlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluc3RhbmNlLmVuYWJsZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluc3RhbmNlPy5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGxpc3RlblRvSG9zdFJlc2l6ZSgpIHtcbiAgICBkaW1lbnNpb25zQ2hhbmdlcyh0aGlzLmhvc3QpXG4gICAgICAucGlwZSh0YWtlVW50aWwobWVyZ2UodGhpcy5kZXN0cm95ZWQsIHRoaXMudmlzaWJsZUludGVybmFsKSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRJbnN0YW5jZVdpZHRoKHRoaXMuaW5zdGFuY2UsIHRoaXMuaG9zdFdpZHRoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEluc3RhbmNlV2lkdGgoaW5zdGFuY2U6IEluc3RhbmNlLCB3aWR0aDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgY29uc3QgaW5QaXhlbHMgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHdpZHRoKTtcbiAgICBpbnN0YW5jZS5wb3BwZXIuc3R5bGUud2lkdGggPSBpblBpeGVscztcbiAgICBpbnN0YW5jZS5wb3BwZXIuc3R5bGUubWF4V2lkdGggPSBpblBpeGVscztcbiAgICAoaW5zdGFuY2UucG9wcGVyLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5tYXhXaWR0aCA9IGluUGl4ZWxzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaXNTZXJ2ZXJTaWRlKCkge1xuICAgIHJldHVybiBpc1BsYXRmb3JtU2VydmVyKHRoaXMucGxhdGZvcm1JZCk7XG4gIH1cblxuICBwcml2YXRlIG9uSGlkZGVuKGluc3RhbmNlOiBUaXBweUluc3RhbmNlID0gdGhpcy5pbnN0YW5jZSkge1xuICAgIHRoaXMuZGVzdHJveVZpZXcoKTtcbiAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMudmlzaWJsZUludGVybmFsLm5leHQodGhpcy5pc1Zpc2libGUpO1xuICAgIGlmICh0aGlzLnZpc2libGUub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gdGhpcy52aXNpYmxlLm5leHQodGhpcy5pc1Zpc2libGUpKTtcbiAgICB9XG4gICAgdGhpcy5nbG9iYWxDb25maWcub25IaWRkZW4/LihpbnN0YW5jZSk7XG4gIH1cblxuICBwcml2YXRlIGlzT3ZlcmZsb3dpbmckKCkge1xuICAgIGNvbnN0IG5vdGlmaWVycyQgPSBbb3ZlcmZsb3dDaGFuZ2VzKHRoaXMuaG9zdCldO1xuXG4gICAgLy8gV2UgbmVlZCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgdGhlIGhvc3QgaGFzIGEgc3RhdGljIHdpZHRoIGJ1dCB0aGUgY29udGVudCBtaWdodCBjaGFuZ2VcbiAgICBpZiAodGhpcy5zdGF0aWNXaWR0aEhvc3QpIHtcbiAgICAgIG5vdGlmaWVycyQucHVzaChcbiAgICAgICAgdGhpcy5jb250ZW50Q2hhbmdlZC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGNvbnRlbnQgdG8gYmUgcmVuZGVyZWQgYmVmb3JlIHdlIGNhbiBjaGVjayBpZiBpdCdzIG92ZXJmbG93aW5nLlxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoKTtcbiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybiAoKSA9PiBjYW5jZWxBbmltYXRpb25GcmFtZShpZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtYXAoKCkgPT4gaXNFbGVtZW50T3ZlcmZsb3codGhpcy5ob3N0KSlcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2UoLi4ubm90aWZpZXJzJCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDaGFuZ2VkKGtleToga2V5b2YgTmdDaGFuZ2VzPFRpcHB5RGlyZWN0aXZlPiwgY2hhbmdlczogTmdDaGFuZ2VzPFRpcHB5RGlyZWN0aXZlPikge1xuICByZXR1cm4ga2V5IGluIGNoYW5nZXM7XG59XG4iXX0=
|
|
477
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlwcHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmduZWF0L2hlbGlwb3BwZXIvc3JjL2xpYi90aXBweS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFFBQVEsRUFDUixVQUFVLEVBQ1YsU0FBUyxFQUNULE1BQU0sRUFFTixZQUFZLEVBQ1osTUFBTSxFQUNOLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUVMLEtBQUssRUFJTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixhQUFhLEdBSWQsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixNQUFNLEVBQ04saUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGVBQWUsR0FDaEIsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUVMLFlBQVksRUFDWixTQUFTLEdBSVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBUXBELE1BQU0sT0FB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LEVBQUUsTUFBTTtvQkFDaEIsUUFBUSxFQUFFLE9BQU87b0JBQ2pCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7MEJBK0lJLE1BQU07MkJBQUMsWUFBWTt1S0FsQ0QsT0FBTztzQkFBM0IsTUFBTTt1QkFBQyxXQUFXOztBQWtjckIsU0FBUyxTQUFTLENBQ2hCLEdBQW9DLEVBQ3BDLE9BQWtDO0lBRWxDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgY29tcHV0ZWQsXG4gIERlc3Ryb3lSZWYsXG4gIERpcmVjdGl2ZSxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGluamVjdCxcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgaW5wdXQsXG4gIElucHV0U2lnbmFsLFxuICBtb2RlbCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgdW50cmFja2VkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUGxhdGZvcm1TZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHR5cGUgeyBJbnN0YW5jZSB9IGZyb20gJ3RpcHB5LmpzJztcbmltcG9ydCB7IGZyb21FdmVudCwgbWVyZ2UsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIENvbnRlbnQsXG4gIGlzQ29tcG9uZW50LFxuICBpc1N0cmluZyxcbiAgaXNUZW1wbGF0ZVJlZixcbiAgVmlld09wdGlvbnMsXG4gIFZpZXdSZWYsXG4gIFZpZXdTZXJ2aWNlLFxufSBmcm9tICdAbmduZWF0L292ZXJ2aWV3JztcblxuaW1wb3J0IHtcbiAgY29lcmNlQ3NzUGl4ZWxWYWx1ZSxcbiAgZGltZW5zaW9uc0NoYW5nZXMsXG4gIGluVmlldyxcbiAgaXNFbGVtZW50T3ZlcmZsb3csXG4gIG5vcm1hbGl6ZUNsYXNzTmFtZSxcbiAgb2JzZXJ2ZVZpc2liaWxpdHksXG4gIG9ubHlUaXBweVByb3BzLFxuICBvdmVyZmxvd0NoYW5nZXMsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtcbiAgTmdDaGFuZ2VzLFxuICBUSVBQWV9DT05GSUcsXG4gIFRJUFBZX1JFRixcbiAgVGlwcHlDb25maWcsXG4gIFRpcHB5SW5zdGFuY2UsXG4gIFRpcHB5UHJvcHMsXG59IGZyb20gJy4vdGlwcHkudHlwZXMnO1xuaW1wb3J0IHsgVGlwcHlGYWN0b3J5IH0gZnJvbSAnLi90aXBweS5mYWN0b3J5JztcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5BdHRyaWJ1dGUgfSBmcm9tICcuL2NvZXJjaW9uJztcblxuQERpcmVjdGl2ZSh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnW3RwXScsXG4gIGV4cG9ydEFzOiAndGlwcHknLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBUaXBweURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0IHtcbiAgLy8gTm90ZSB0aGF0IGRlZmF1bHQgdmFsdWVzIGFyZSBub3QgcHJvdmlkZWQgZm9yIHRoZXNlIGJpbmRpbmdzIGJlY2F1c2UgYHRpcHB5LmpzYFxuICAvLyBoYXMgaXRzIG93biBkZWZhdWx0IHZhbHVlcyBhbmQgY2hlY2tzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHByb3BzIGFyZSBgdW5kZWZpbmVkYC5cbiAgLy8gV2Ugc2hvdWxkIGtlZXAgYHVuZGVmaW5lZGAgYXMgdGhlIGRlZmF1bHQgdmFsdWUuXG5cbiAgcmVhZG9ubHkgYXBwZW5kVG8gPSBpbnB1dDxUaXBweVByb3BzWydhcHBlbmRUbyddPih1bmRlZmluZWQsIHsgYWxpYXM6ICd0cEFwcGVuZFRvJyB9KTtcblxuICByZWFkb25seSBjb250ZW50ID0gaW5wdXQ8Q29udGVudCB8IHVuZGVmaW5lZCB8IG51bGw+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3RwJyB9KTtcblxuICByZWFkb25seSBkZWxheSA9IGlucHV0PFRpcHB5UHJvcHNbJ2RlbGF5J10+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3RwRGVsYXknIH0pO1xuXG4gIHJlYWRvbmx5IGR1cmF0aW9uID0gaW5wdXQ8VGlwcHlQcm9wc1snZHVyYXRpb24nXT4odW5kZWZpbmVkLCB7IGFsaWFzOiAndHBEdXJhdGlvbicgfSk7XG5cbiAgcmVhZG9ubHkgaGlkZU9uQ2xpY2sgPSBpbnB1dDxUaXBweVByb3BzWydoaWRlT25DbGljayddPih1bmRlZmluZWQsIHtcbiAgICBhbGlhczogJ3RwSGlkZU9uQ2xpY2snLFxuICB9KTtcblxuICByZWFkb25seSBpbnRlcmFjdGl2ZSA9IGlucHV0PFRpcHB5UHJvcHNbJ2ludGVyYWN0aXZlJ10+KHVuZGVmaW5lZCwge1xuICAgIGFsaWFzOiAndHBJbnRlcmFjdGl2ZScsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGludGVyYWN0aXZlQm9yZGVyID0gaW5wdXQ8VGlwcHlQcm9wc1snaW50ZXJhY3RpdmVCb3JkZXInXT4odW5kZWZpbmVkLCB7XG4gICAgYWxpYXM6ICd0cEludGVyYWN0aXZlQm9yZGVyJyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbWF4V2lkdGggPSBpbnB1dDxUaXBweVByb3BzWydtYXhXaWR0aCddPih1bmRlZmluZWQsIHsgYWxpYXM6ICd0cE1heFdpZHRoJyB9KTtcblxuICAvLyBOb3RlIHRoYXQgc29tZSBvZiB0aGUgaW5wdXQgc2lnbmFsIHR5cGVzIGFyZSBkZWNsYXJlZCBleHBsaWNpdGx5IGJlY2F1c2UgdGhlIGNvbXBpbGVyXG4gIC8vIGFsc28gdXNlcyB0eXBlcyBmcm9tIGBAcG9wcGVyanMvY29yZWAgYW5kIHJlcXVpcmVzIGEgdHlwZSBhbm5vdGF0aW9uLlxuICByZWFkb25seSBvZmZzZXQ6IElucHV0U2lnbmFsPFRpcHB5UHJvcHNbJ29mZnNldCddPiA9IGlucHV0PFRpcHB5UHJvcHNbJ29mZnNldCddPihcbiAgICB1bmRlZmluZWQsXG4gICAgeyBhbGlhczogJ3RwT2Zmc2V0JyB9XG4gICk7XG5cbiAgcmVhZG9ubHkgcGxhY2VtZW50OiBJbnB1dFNpZ25hbDxUaXBweVByb3BzWydwbGFjZW1lbnQnXT4gPSBpbnB1dDxcbiAgICBUaXBweVByb3BzWydwbGFjZW1lbnQnXVxuICA+KHVuZGVmaW5lZCwge1xuICAgIGFsaWFzOiAndHBQbGFjZW1lbnQnLFxuICB9KTtcblxuICByZWFkb25seSBwb3BwZXJPcHRpb25zOiBJbnB1dFNpZ25hbDxUaXBweVByb3BzWydwb3BwZXJPcHRpb25zJ10+ID0gaW5wdXQ8XG4gICAgVGlwcHlQcm9wc1sncG9wcGVyT3B0aW9ucyddXG4gID4odW5kZWZpbmVkLCB7XG4gICAgYWxpYXM6ICd0cFBvcHBlck9wdGlvbnMnLFxuICB9KTtcblxuICByZWFkb25seSBzaG93T25DcmVhdGUgPSBpbnB1dDxUaXBweVByb3BzWydzaG93T25DcmVhdGUnXT4odW5kZWZpbmVkLCB7XG4gICAgYWxpYXM6ICd0cFNob3dPbkNyZWF0ZScsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRyaWdnZXIgPSBpbnB1dDxUaXBweVByb3BzWyd0cmlnZ2VyJ10+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3RwVHJpZ2dlcicgfSk7XG5cbiAgcmVhZG9ubHkgdHJpZ2dlclRhcmdldCA9IGlucHV0PFRpcHB5UHJvcHNbJ3RyaWdnZXJUYXJnZXQnXT4odW5kZWZpbmVkLCB7XG4gICAgYWxpYXM6ICd0cFRyaWdnZXJUYXJnZXQnLFxuICB9KTtcblxuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxUaXBweVByb3BzWyd6SW5kZXgnXT4odW5kZWZpbmVkLCB7IGFsaWFzOiAndHBaSW5kZXgnIH0pO1xuXG4gIHJlYWRvbmx5IGFuaW1hdGlvbiA9IGlucHV0PFRpcHB5UHJvcHNbJ2FuaW1hdGlvbiddPih1bmRlZmluZWQsIHtcbiAgICBhbGlhczogJ3RwQW5pbWF0aW9uJyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgdXNlVGV4dENvbnRlbnQgPSBpbnB1dChmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogY29lcmNlQm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBhbGlhczogJ3RwVXNlVGV4dENvbnRlbnQnLFxuICB9KTtcblxuICByZWFkb25seSBpc0xhenkgPSBpbnB1dChmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogY29lcmNlQm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBhbGlhczogJ3RwSXNMYXp5JyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgdmFyaWF0aW9uID0gaW5wdXQ8c3RyaW5nPih1bmRlZmluZWQsIHsgYWxpYXM6ICd0cFZhcmlhdGlvbicgfSk7XG5cbiAgcmVhZG9ubHkgaXNFbmFibGVkID0gaW5wdXQodHJ1ZSwgeyBhbGlhczogJ3RwSXNFbmFibGVkJyB9KTtcblxuICByZWFkb25seSBjbGFzc05hbWUgPSBpbnB1dDxzdHJpbmcgfCBzdHJpbmdbXT4oJycsIHsgYWxpYXM6ICd0cENsYXNzTmFtZScgfSk7XG5cbiAgcmVhZG9ubHkgb25seVRleHRPdmVyZmxvdyA9IGlucHV0KGZhbHNlLCB7XG4gICAgdHJhbnNmb3JtOiBjb2VyY2VCb29sZWFuQXR0cmlidXRlLFxuICAgIGFsaWFzOiAndHBPbmx5VGV4dE92ZXJmbG93JyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc3RhdGljV2lkdGhIb3N0ID0gaW5wdXQoZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgYWxpYXM6ICd0cFN0YXRpY1dpZHRoSG9zdCcsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGRhdGEgPSBpbnB1dDxhbnk+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3RwRGF0YScgfSk7XG5cbiAgcmVhZG9ubHkgdXNlSG9zdFdpZHRoID0gaW5wdXQoZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06IGNvZXJjZUJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgYWxpYXM6ICd0cFVzZUhvc3RXaWR0aCcsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGhpZGVPbkVzY2FwZSA9IGlucHV0KGZhbHNlLCB7XG4gICAgdHJhbnNmb3JtOiBjb2VyY2VCb29sZWFuQXR0cmlidXRlLFxuICAgIGFsaWFzOiAndHBIaWRlT25Fc2NhcGUnLFxuICB9KTtcblxuICByZWFkb25seSBkZXRlY3RDaGFuZ2VzQ29tcG9uZW50ID0gaW5wdXQodHJ1ZSwgeyBhbGlhczogJ3RwRGV0ZWN0Q2hhbmdlc0NvbXBvbmVudCcgfSk7XG5cbiAgcmVhZG9ubHkgcG9wcGVyV2lkdGggPSBpbnB1dDxudW1iZXIgfCBzdHJpbmc+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3RwUG9wcGVyV2lkdGgnIH0pO1xuXG4gIHJlYWRvbmx5IGN1c3RvbUhvc3QgPSBpbnB1dDxIVE1MRWxlbWVudD4odW5kZWZpbmVkLCB7IGFsaWFzOiAndHBIb3N0JyB9KTtcblxuICByZWFkb25seSBpc1Zpc2libGUgPSBtb2RlbChmYWxzZSwgeyBhbGlhczogJ3RwSXNWaXNpYmxlJyB9KTtcblxuICBAT3V0cHV0KCd0cFZpc2libGUnKSB2aXNpYmxlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIHByb3RlY3RlZCBpbnN0YW5jZTogVGlwcHlJbnN0YW5jZTtcbiAgcHJvdGVjdGVkIHZpZXdSZWY6IFZpZXdSZWY7XG4gIHByb3RlY3RlZCBwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz47XG4gIHByb3RlY3RlZCB2YXJpYXRpb25EZWZpbmVkID0gZmFsc2U7XG4gIHByb3RlY3RlZCB2aWV3T3B0aW9ucyQ6IFZpZXdPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBXZSBoYWQgdXNlIGB2aXNpYmxlYCBldmVudCBlbWl0dGVyIHByZXZpb3VzbHkgYXMgYSBgdGFrZVVudGlsYCBzdWJzY3JpYmVyIGluIG11bHRpcGxlIHBsYWNlc1xuICAgKiB3aXRoaW4gdGhlIGRpcmVjdGl2ZS5cbiAgICogVGhpcyBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IHRodXMgd2UgZG9uJ3QgaGF2ZSB0byBkZWFsIHdpdGggdGhlIGB2aXNpYmxlYCBldmVudCBlbWl0dGVyXG4gICAqIGFuZCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25zIG9ubHkgd2hlbiB0aGUgYHZpc2libGVgIGV2ZW50IGlzIGJlaW5nIGxpc3RlbmVkIG91dHNpZGVcbiAgICogaW4gdGhlIHRlbXBsYXRlIChgPGJ1dHRvbiBbdGlwcHldPVwiLi4uXCIgKHZpc2libGUpPVwiLi4uXCI+PC9idXR0b24+YCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgdmlzaWJsZUludGVybmFsID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSB2aXNpYmlsaXR5T2JzZXJ2ZXJDbGVhbnVwOiAoKSA9PiB2b2lkIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGNvbnRlbnRDaGFuZ2VkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIGhvc3QgPSBjb21wdXRlZDxIVE1MRWxlbWVudD4oXG4gICAgKCkgPT4gdGhpcy5jdXN0b21Ib3N0KCkgfHwgdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnRcbiAgKTtcblxuICAvLyBJdCBzaG91bGQgYmUgYSBnZXR0ZXIgYmVjYXVzZSBjb21wdXRhdGlvbnMgYXJlIGNhY2hlZCB1bnRpbFxuICAvLyBhbnkgb2YgdGhlIHByb2R1Y2VycyBjaGFuZ2UuXG4gIHByaXZhdGUgZ2V0IGhvc3RXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5ob3N0KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgaXNTZXJ2ZXIgPSBpc1BsYXRmb3JtU2VydmVyKGluamVjdChQTEFURk9STV9JRCkpO1xuICBwcml2YXRlIHRpcHB5RmFjdG9yeSA9IGluamVjdChUaXBweUZhY3RvcnkpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVElQUFlfQ09ORklHKSBwcm90ZWN0ZWQgZ2xvYmFsQ29uZmlnOiBUaXBweUNvbmZpZyxcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCB2aWV3U2VydmljZTogVmlld1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHZjcjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcm90ZWN0ZWQgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJvdGVjdGVkIGhvc3RSZWY6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgaWYgKHRoaXMuaXNTZXJ2ZXIpIHJldHVybjtcblxuICAgIHRoaXMuc2V0dXBMaXN0ZW5lcnMoKTtcblxuICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgdGhpcy5pbnN0YW5jZT8uZGVzdHJveSgpO1xuICAgICAgdGhpcy5kZXN0cm95VmlldygpO1xuICAgICAgdGhpcy52aXNpYmlsaXR5T2JzZXJ2ZXJDbGVhbnVwPy4oKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IE5nQ2hhbmdlczxUaXBweURpcmVjdGl2ZT4pIHtcbiAgICBpZiAodGhpcy5pc1NlcnZlcikgcmV0dXJuO1xuXG4gICAgLy8gVE9ETzogd2UgY2FuIHVwZGF0ZSBpdCBsYXRlci5cbiAgICAvLyBXZSBuZWVkIHRvIGdvIG92ZXIgY2xhc3MgcHJvcGVydGllcywgY2hlY2sgd2hldGhlciBpdCdzIGEgc2lnbmFsIChgaXNTaWduYWwocHJvcClgKVxuICAgIC8vIGFuZCBjb25zdHJ1Y3QgYSByZWNvcmQgd2hlcmUgYFJlY29yZDxzdHJpbmcsIFNpZ25hbD5gLlxuICAgIC8vIEZvbGxvdy11cCBjaGFuZ2VzIHdvdWxkIGJlIHRvIGhhdmUgYSBjb21wdXRhdGlvbiBhbmQgYW4gZWZmZWN0LlxuICAgIGxldCBwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz4gPSBPYmplY3Qua2V5cyhjaGFuZ2VzKS5yZWR1Y2UoKGFjYywgY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlID09PSAnaXNWaXNpYmxlJykgcmV0dXJuIGFjYztcblxuICAgICAgYWNjW2NoYW5nZV0gPSBjaGFuZ2VzW2NoYW5nZV0uY3VycmVudFZhbHVlO1xuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIGxldCB2YXJpYXRpb246IHN0cmluZztcblxuICAgIGlmIChpc0NoYW5nZWQoJ3ZhcmlhdGlvbicsIGNoYW5nZXMpKSB7XG4gICAgICB2YXJpYXRpb24gPSBjaGFuZ2VzLnZhcmlhdGlvbi5jdXJyZW50VmFsdWU7XG4gICAgICB0aGlzLnZhcmlhdGlvbkRlZmluZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMudmFyaWF0aW9uRGVmaW5lZCkge1xuICAgICAgdmFyaWF0aW9uID0gdGhpcy5nbG9iYWxDb25maWcuZGVmYXVsdFZhcmlhdGlvbjtcbiAgICAgIHRoaXMudmFyaWF0aW9uRGVmaW5lZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHZhcmlhdGlvbikge1xuICAgICAgcHJvcHMgPSB7XG4gICAgICAgIC4uLnRoaXMuZ2xvYmFsQ29uZmlnLnZhcmlhdGlvbnNbdmFyaWF0aW9uXSxcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlUHJvcHMocHJvcHMpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMudXNlSG9zdFdpZHRoKCkpIHtcbiAgICAgIHRoaXMucHJvcHMubWF4V2lkdGggPSB0aGlzLmhvc3RXaWR0aDtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuaXNTZXJ2ZXIpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmlzTGF6eSgpKSB7XG4gICAgICBjb25zdCBob3N0SW5WaWV3JCA9IGluVmlldyh0aGlzLmhvc3QoKSk7XG5cbiAgICAgIGlmICh0aGlzLm9ubHlUZXh0T3ZlcmZsb3coKSkge1xuICAgICAgICBob3N0SW5WaWV3JFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuaXNPdmVyZmxvd2luZyQoKSksXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKChpc0VsZW1lbnRPdmVyZmxvdykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja092ZXJmbG93KGlzRWxlbWVudE92ZXJmbG93KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhvc3RJblZpZXckLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVJbnN0YW5jZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMub25seVRleHRPdmVyZmxvdygpKSB7XG4gICAgICB0aGlzLmlzT3ZlcmZsb3dpbmckKClcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKGlzRWxlbWVudE92ZXJmbG93KSA9PiB7XG4gICAgICAgICAgdGhpcy5jaGVja092ZXJmbG93KGlzRWxlbWVudE92ZXJmbG93KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JlYXRlSW5zdGFuY2UoKTtcbiAgICB9XG4gIH1cblxuICBkZXN0cm95VmlldygpIHtcbiAgICB0aGlzLnZpZXdPcHRpb25zJCA9IG51bGw7XG4gICAgdGhpcy52aWV3UmVmPy5kZXN0cm95KCk7XG4gICAgdGhpcy52aWV3UmVmID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgd2hlbiB5b3UgYXBwZW5kIHRvIGFuIGVsZW1lbnQgdGhhdCB5b3UgbWlnaHQgcmVtb3ZlIGZyb20gdGhlIERPTS5cbiAgICogSW4gc3VjaCBjYXNlcyB3ZSB3YW50IHRvIGhpZGUgdGhlIHRvb2x0aXAgYW5kIGxldCBpdCBnbyB0aHJvdWdoIHRoZSBkZXN0cm95IGxpZmVjeWNsZS5cbiAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZ3JpZCByb3cgd2l0aCBhbiBlbGVtZW50IHRoYXQgeW91IHRvZ2dsZSB1c2luZyB0aGUgZGlzcGxheSBDU1MgcHJvcGVydHkgb24gaG92ZXIuXG4gICAqL1xuICBvYnNlcnZlSG9zdFZpc2liaWxpdHkoKSB7XG4gICAgaWYgKHRoaXMuaXNTZXJ2ZXIpIHJldHVybjtcbiAgICAvLyBXZSBkb24ndCB3YW50IHRvIG9ic2VydmUgdGhlIGhvc3QgdmlzaWJpbGl0eSBpZiB3ZSBhcmUgYXBwZW5kaW5nIHRvIHRoZSBib2R5LlxuICAgIGlmICh0aGlzLnByb3BzLmFwcGVuZFRvICYmIHRoaXMucHJvcHMuYXBwZW5kVG8gIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIHRoaXMudmlzaWJpbGl0eU9ic2VydmVyQ2xlYW51cD8uKCk7XG4gICAgICByZXR1cm4gdGhpcy52aXNpYmxlSW50ZXJuYWxcbiAgICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgIC5zdWJzY3JpYmUoKGlzVmlzaWJsZSkgPT4ge1xuICAgICAgICAgIGlmIChpc1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJpbGl0eU9ic2VydmVyQ2xlYW51cCA9IG9ic2VydmVWaXNpYmlsaXR5KFxuICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlLnJlZmVyZW5jZSxcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2UgaGF2ZSBhbmltYXRpb24gb24gdGhlIHBvcHBlciBpdCBkb2Vzbid0IGNsb3NlIGltbWVkaWF0ZWx5IGRvZXNuJ3QgdHJpZ2dlciB0aGUgYHRwVmlzaWJsZWAgZXZlbnQuXG4gICAgICAgICAgICAgICAgLy8gVGlwcHkgaXMgcmVseWluZyBvbiB0aGUgdHJhbnNpdGlvbmVuZCBldmVudCB0byB0cmlnZ2VyIHRoZSBgb25IaWRkZW5gIGNhbGxiYWNrLlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hdG9taWtzL3RpcHB5anMvYmxvYi9tYXN0ZXIvc3JjL2RvbS11dGlscy50cyNMMTE3XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBldmVudCBuZXZlciBmaXJlcyBiZWNhdXNlIHRoZSBwb3BwZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00gYmVmb3JlIHRoZSB0cmFuc2l0aW9uIGVuZHMuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm9uSGlkZGVuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpc2liaWxpdHlPYnNlcnZlckNsZWFudXA/LigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2hvdygpIHtcbiAgICB0aGlzLmluc3RhbmNlPy5zaG93KCk7XG4gIH1cblxuICBoaWRlKCkge1xuICAgIHRoaXMuaW5zdGFuY2U/LmhpZGUoKTtcbiAgfVxuXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLmluc3RhbmNlPy5lbmFibGUoKTtcbiAgfVxuXG4gIGRpc2FibGUoKSB7XG4gICAgdGhpcy5pbnN0YW5jZT8uZGlzYWJsZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHVwZGF0ZVByb3BzKHByb3BzOiBQYXJ0aWFsPFRpcHB5Q29uZmlnPikge1xuICAgIHRoaXMuc2V0UHJvcHMoeyAuLi50aGlzLnByb3BzLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRQcm9wcyhwcm9wczogUGFydGlhbDxUaXBweUNvbmZpZz4pIHtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5pbnN0YW5jZT8uc2V0UHJvcHMob25seVRpcHB5UHJvcHMocHJvcHMpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRTdGF0dXMoaXNFbmFibGVkOiBib29sZWFuKSB7XG4gICAgaXNFbmFibGVkID8gdGhpcy5pbnN0YW5jZT8uZW5hYmxlKCkgOiB0aGlzLmluc3RhbmNlPy5kaXNhYmxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlSW5zdGFuY2UoKSB7XG4gICAgaWYgKCF0aGlzLmNvbnRlbnQoKSAmJiAhdGhpcy51c2VUZXh0Q29udGVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50aXBweUZhY3RvcnlcbiAgICAgIC5jcmVhdGUodGhpcy5ob3N0KCksIHtcbiAgICAgICAgYWxsb3dIVE1MOiB0cnVlLFxuICAgICAgICBhcHBlbmRUbzogZG9jdW1lbnQuYm9keSxcbiAgICAgICAgLi4uKHRoaXMuZ2xvYmFsQ29uZmlnLnpJbmRleEdldHRlclxuICAgICAgICAgID8geyB6SW5kZXg6IHRoaXMuZ2xvYmFsQ29uZmlnLnpJbmRleEdldHRlcigpIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4ub25seVRpcHB5UHJvcHModGhpcy5nbG9iYWxDb25maWcpLFxuICAgICAgICAuLi5vbmx5VGlwcHlQcm9wcyh0aGlzLnByb3BzKSxcbiAgICAgICAgb25Nb3VudDogKGluc3RhbmNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmlzVmlzaWJsZS5zZXQoaXNWaXNpYmxlKTtcbiAgICAgICAgICB0aGlzLnZpc2libGVJbnRlcm5hbC5uZXh0KGlzVmlzaWJsZSk7XG4gICAgICAgICAgaWYgKHRoaXMudmlzaWJsZS5vYnNlcnZlZCkge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMudmlzaWJsZS5uZXh0KGlzVmlzaWJsZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVzZUhvc3RXaWR0aCgpICYmIHRoaXMubGlzdGVuVG9Ib3N0UmVzaXplKCk7XG4gICAgICAgICAgdGhpcy5nbG9iYWxDb25maWcub25Nb3VudD8uKGluc3RhbmNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DcmVhdGU6IChpbnN0YW5jZSkgPT4ge1xuICAgICAgICAgIGluc3RhbmNlLnBvcHBlci5jbGFzc0xpc3QuYWRkKFxuICAgICAgICAgICAgYHRpcHB5LXZhcmlhdGlvbi0ke3RoaXMudmFyaWF0aW9uKCkgfHwgdGhpcy5nbG9iYWxDb25maWcuZGVmYXVsdFZhcmlhdGlvbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodGhpcy5jbGFzc05hbWUoKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrbGFzcyBvZiBub3JtYWxpemVDbGFzc05hbWUodGhpcy5jbGFzc05hbWUoKSkpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2UucG9wcGVyLmNsYXNzTGlzdC5hZGQoa2xhc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmdsb2JhbENvbmZpZy5vbkNyZWF0ZT8uKGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUoKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaW5zdGFuY2Uuc2hvdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb25TaG93OiAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICBpbnN0YW5jZS5yZWZlcmVuY2Uuc2V0QXR0cmlidXRlKCdkYXRhLXRpcHB5LW9wZW4nLCAnJyk7XG5cbiAgICAgICAgICAvLyBXZSdyZSByZS1lbnRlcmluZyBiZWNhdXNlIHdlIG1pZ2h0IGNyZWF0ZSBhbiBBbmd1bGFyIGNvbXBvbmVudCxcbiAgICAgICAgICAvLyB3aGljaCBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIHpvbmUuXG4gICAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnJlc29sdmVDb250ZW50KGluc3RhbmNlKSk7XG5cbiAgICAgICAgICBpZiAoaXNTdHJpbmcoY29udGVudCkpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLnNldFByb3BzKHsgYWxsb3dIVE1MOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgaWYgKCFjb250ZW50Py50cmltKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGluc3RhbmNlLnNldENvbnRlbnQoY29udGVudCk7XG4gICAgICAgICAgdGhpcy5oaWRlT25Fc2NhcGUoKSAmJiB0aGlzLmhhbmRsZUVzY2FwZUJ1dHRvbigpO1xuXG4gICAgICAgICAgaWYgKHRoaXMudXNlSG9zdFdpZHRoKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5zdGFuY2VXaWR0aChpbnN0YW5jZSwgdGhpcy5ob3N0V2lkdGgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wb3BwZXJXaWR0aCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluc3RhbmNlV2lkdGgoaW5zdGFuY2UsIHRoaXMucG9wcGVyV2lkdGgoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZ2xvYmFsQ29uZmlnLm9uU2hvdz8uKGluc3RhbmNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25IaWRlKGluc3RhbmNlKSB7XG4gICAgICAgICAgaW5zdGFuY2UucmVmZXJlbmNlLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS10aXBweS1vcGVuJyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uSGlkZGVuOiAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgICB0aGlzLm9uSGlkZGVuKGluc3RhbmNlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAgICAgICB0aGlzLnNldFN0YXR1cyh0aGlzLmlzRW5hYmxlZCgpKTtcbiAgICAgICAgdGhpcy5zZXRQcm9wcyh0aGlzLnByb3BzKTtcblxuICAgICAgICB0aGlzLnZhcmlhdGlvbigpID09PSAnY29udGV4dE1lbnUnICYmIHRoaXMuaGFuZGxlQ29udGV4dE1lbnUoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVDb250ZW50KGluc3RhbmNlOiBUaXBweUluc3RhbmNlKSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuY29udGVudCgpO1xuXG4gICAgaWYgKCF0aGlzLnZpZXdPcHRpb25zJCAmJiAhaXNTdHJpbmcoY29udGVudCkpIHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogVElQUFlfUkVGLFxuICAgICAgICAgICAgdXNlVmFsdWU6IHRoaXMuaW5zdGFuY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGEoKTtcblxuICAgICAgaWYgKGlzQ29tcG9uZW50KGNvbnRlbnQpKSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UuZGF0YSA9IGRhdGE7XG5cbiAgICAgICAgdGhpcy52aWV3T3B0aW9ucyQgPSB7XG4gICAgICAgICAgaW5qZWN0b3IsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGlzVGVtcGxhdGVSZWYoY29udGVudCkpIHtcbiAgICAgICAgdGhpcy52aWV3T3B0aW9ucyQgPSB7XG4gICAgICAgICAgaW5qZWN0b3IsXG4gICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICRpbXBsaWNpdDogdGhpcy5oaWRlLmJpbmQodGhpcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnZpZXdSZWYgPSB0aGlzLnZpZXdTZXJ2aWNlLmNyZWF0ZVZpZXcoY29udGVudCwge1xuICAgICAgdmNyOiB0aGlzLnZjcixcbiAgICAgIC4uLnRoaXMudmlld09wdGlvbnMkLFxuICAgIH0pO1xuXG4gICAgLy8gV2UgbmVlZCB0byBjYWxsIGRldGVjdENoYW5nZXMgZm9yIG9uUHVzaCBjb21wb25lbnRzIHRvIHVwZGF0ZSB0aGUgY29udGVudFxuICAgIGlmICh0aGlzLmRldGVjdENoYW5nZXNDb21wb25lbnQoKSAmJiBpc0NvbXBvbmVudChjb250ZW50KSkge1xuICAgICAgdGhpcy52aWV3UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3Q29udGVudCA9IHRoaXMudmlld1JlZi5nZXRFbGVtZW50KCk7XG5cbiAgICBpZiAodGhpcy51c2VUZXh0Q29udGVudCgpKSB7XG4gICAgICBuZXdDb250ZW50ID0gaW5zdGFuY2UucmVmZXJlbmNlLnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIGlmIChpc1N0cmluZyhuZXdDb250ZW50KSAmJiB0aGlzLmdsb2JhbENvbmZpZy5iZWZvcmVSZW5kZXIpIHtcbiAgICAgIG5ld0NvbnRlbnQgPSB0aGlzLmdsb2JhbENvbmZpZy5iZWZvcmVSZW5kZXIobmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0NvbnRlbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlQ29udGV4dE1lbnUoKSB7XG4gICAgZnJvbUV2ZW50KHRoaXMuaG9zdCgpLCAnY29udGV4dG1lbnUnKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2V0UHJvcHMoe1xuICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6ICgpID0+XG4gICAgICAgICAgICAoe1xuICAgICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICAgICAgICB0b3A6IGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgICAgIGJvdHRvbTogZXZlbnQuY2xpZW50WSxcbiAgICAgICAgICAgICAgbGVmdDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgICAgICAgcmlnaHQ6IGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgICB9IGFzIERPTVJlY3RSZWFkT25seSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaW5zdGFuY2Uuc2hvdygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlRXNjYXBlQnV0dG9uKCk6IHZvaWQge1xuICAgIGZyb21FdmVudChkb2N1bWVudC5ib2R5LCAna2V5ZG93bicpXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKCh7IGNvZGUgfTogS2V5Ym9hcmRFdmVudCkgPT4gY29kZSA9PT0gJ0VzY2FwZScpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy52aXNpYmxlSW50ZXJuYWwucGlwZShmaWx0ZXIoKHYpID0+ICF2KSkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmhpZGUoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tPdmVyZmxvdyhpc0VsZW1lbnRPdmVyZmxvdzogYm9vbGVhbikge1xuICAgIGlmIChpc0VsZW1lbnRPdmVyZmxvdykge1xuICAgICAgaWYgKCF0aGlzLmluc3RhbmNlKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlSW5zdGFuY2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UuZW5hYmxlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5zdGFuY2U/LmRpc2FibGUoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbGlzdGVuVG9Ib3N0UmVzaXplKCkge1xuICAgIGRpbWVuc2lvbnNDaGFuZ2VzKHRoaXMuaG9zdCgpKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMudmlzaWJsZUludGVybmFsKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRJbnN0YW5jZVdpZHRoKHRoaXMuaW5zdGFuY2UsIHRoaXMuaG9zdFdpZHRoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNldEluc3RhbmNlV2lkdGgoaW5zdGFuY2U6IEluc3RhbmNlLCB3aWR0aDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgY29uc3QgaW5QaXhlbHMgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHdpZHRoKTtcbiAgICBpbnN0YW5jZS5wb3BwZXIuc3R5bGUud2lkdGggPSBpblBpeGVscztcbiAgICBpbnN0YW5jZS5wb3BwZXIuc3R5bGUubWF4V2lkdGggPSBpblBpeGVscztcbiAgICAoaW5zdGFuY2UucG9wcGVyLmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5tYXhXaWR0aCA9IGluUGl4ZWxzO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkhpZGRlbihpbnN0YW5jZTogVGlwcHlJbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2UpIHtcbiAgICB0aGlzLmRlc3Ryb3lWaWV3KCk7XG4gICAgY29uc3QgaXNWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5pc1Zpc2libGUuc2V0KGlzVmlzaWJsZSk7XG4gICAgdGhpcy52aXNpYmxlSW50ZXJuYWwubmV4dChpc1Zpc2libGUpO1xuICAgIGlmICh0aGlzLnZpc2libGUub2JzZXJ2ZWQpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLnZpc2libGUubmV4dChpc1Zpc2libGUpKTtcbiAgICB9XG4gICAgdGhpcy5nbG9iYWxDb25maWcub25IaWRkZW4/LihpbnN0YW5jZSk7XG4gIH1cblxuICBwcml2YXRlIGlzT3ZlcmZsb3dpbmckKCkge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLmhvc3QoKTtcbiAgICBjb25zdCBub3RpZmllcnMkID0gW292ZXJmbG93Q2hhbmdlcyhob3N0KV07XG5cbiAgICAvLyBXZSBuZWVkIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgaG9zdCBoYXMgYSBzdGF0aWMgd2lkdGggYnV0IHRoZSBjb250ZW50IG1pZ2h0IGNoYW5nZVxuICAgIGlmICh0aGlzLnN0YXRpY1dpZHRoSG9zdCgpKSB7XG4gICAgICBub3RpZmllcnMkLnB1c2goXG4gICAgICAgIHRoaXMuY29udGVudENoYW5nZWQucGlwZShcbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBjb250ZW50IHRvIGJlIHJlbmRlcmVkIGJlZm9yZSB3ZSBjYW4gY2hlY2sgaWYgaXQncyBvdmVyZmxvd2luZy5cbiAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgbWFwKCgpID0+IGlzRWxlbWVudE92ZXJmbG93KGhvc3QpKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBtZXJnZSguLi5ub3RpZmllcnMkKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGFwcGVuZFRvID0gdGhpcy5hcHBlbmRUbygpO1xuICAgICAgdGhpcy51cGRhdGVQcm9wcyh7IGFwcGVuZFRvIH0pO1xuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIC8vIENhcHR1cmUgc2lnbmFsIHJlYWQgdG8gdHJhY2sgaXRzIGNoYW5nZXMuXG4gICAgICB0aGlzLmNvbnRlbnQoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB0aGlzLmNvbnRlbnRDaGFuZ2VkLm5leHQoKSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4gdGhpcy5zZXRTdGF0dXModGhpcy5pc0VuYWJsZWQoKSkpO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IHRoaXMuaXNWaXNpYmxlKCk7XG4gICAgICBpc1Zpc2libGUgPyB0aGlzLnNob3coKSA6IHRoaXMuaGlkZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ2hhbmdlZChcbiAga2V5OiBrZXlvZiBOZ0NoYW5nZXM8VGlwcHlEaXJlY3RpdmU+LFxuICBjaGFuZ2VzOiBOZ0NoYW5nZXM8VGlwcHlEaXJlY3RpdmU+XG4pIHtcbiAgcmV0dXJuIGtleSBpbiBjaGFuZ2VzO1xufVxuIl19
|