@seniorsistemas/angular-components 19.9.7 → 19.9.8-develop-5d2dfb27
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/card/lib/card/card.component.d.ts +6 -2
- package/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.d.ts +0 -1
- package/datepicker/README.md +6 -2
- package/datepicker/lib/datepicker/date-segment-input.d.ts +7 -1
- package/datepicker/lib/datepicker/datepicker.component.d.ts +137 -3
- package/dialog/lib/src/dialog/services/dialog.service.d.ts +2 -0
- package/esm2022/accordion/lib/accordion/components/accordion-panel/accordion-panel.component.mjs +3 -3
- package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +8 -3
- package/esm2022/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +4 -3
- package/esm2022/breadcrumb/lib/breadcrumb/breadcrumb.component.mjs +3 -3
- package/esm2022/breadcrumb/lib/dynamic-breadcrumb/dynamic-breadcrumb.component.mjs +4 -2
- package/esm2022/button/lib/button/button.component.mjs +3 -3
- package/esm2022/card/lib/card/card.component.mjs +13 -5
- package/esm2022/checkbox/lib/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/checkbox-list/lib/checkbox-list/checkbox-list.component.mjs +3 -3
- package/esm2022/chips/lib/chips/chip-item/chip-item.component.mjs +3 -3
- package/esm2022/chips/lib/chips/chips/chips.component.mjs +3 -3
- package/esm2022/code-editor/lib/code-editor/infra/cores/codemirror-6/themes/sds-light/sds-light-style.mjs +3 -2
- package/esm2022/collapse-link/lib/collapse-link/collapse-link.component.mjs +3 -3
- package/esm2022/country-phone-picker/lib/country-phone-picker/country-phone-picker.component.mjs +14 -9
- package/esm2022/datepicker/lib/datepicker/date-segment-input.mjs +19 -2
- package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +405 -38
- package/esm2022/dialog/lib/src/dialog/dialog.component.mjs +3 -3
- package/esm2022/dialog/lib/src/dialog/services/dialog.service.mjs +13 -1
- package/esm2022/drawer/lib/drawer/drawer.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +6 -4
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/password/password-field.component.mjs +3 -3
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/text/text-field.component.mjs +3 -3
- package/esm2022/editor/lib/editor/editor.component.mjs +3 -3
- package/esm2022/editor/lib/editor/toolbar-button/editor-toolbar-button.component.mjs +3 -3
- package/esm2022/fieldset/lib/fieldset/fieldset.component.mjs +3 -3
- package/esm2022/file-picker/lib/file-picker/file-picker.component.mjs +3 -3
- package/esm2022/gantt/lib/gantt/components/gantt/bar.mjs +2 -1
- package/esm2022/gantt/lib/gantt/gantt.component.mjs +3 -3
- package/esm2022/global-search/lib/global-search/global-search.component.mjs +16 -25
- package/esm2022/grid-menu/lib/grid-menu/components/grid-menu-item/grid-menu-item.component.mjs +3 -3
- package/esm2022/input-text/lib/input-text/input-text.directive.mjs +3 -3
- package/esm2022/lib/locale/fallback.mjs +40 -13
- package/esm2022/navigation-button/lib/navigation-button/navigation-button.component.mjs +3 -3
- package/esm2022/object-card/lib/object-card/object-card.component.mjs +3 -3
- package/esm2022/paginator/lib/paginator/paginator.component.mjs +3 -3
- package/esm2022/pin-code-field/lib/pin-code-field/pin-code-field.component.mjs +3 -3
- package/esm2022/radio-button/lib/radio-button/radio-button.component.mjs +4 -10
- package/esm2022/rating-scale/lib/rating-scale/rating-scale.component.mjs +3 -3
- package/esm2022/select/lib/select/select.component.mjs +3 -3
- package/esm2022/select-button/lib/select-button/components/select-button-item/select-button-item.component.mjs +3 -3
- package/esm2022/shared/lib/accessibility/datepicker-no-period-tab.directive.mjs +6 -6
- package/esm2022/side-sheet/lib/side-sheet/side-sheet.component.mjs +3 -3
- package/esm2022/slider/lib/slider/slider.component.mjs +67 -65
- package/esm2022/slider/lib/slider/slider.module.mjs +2 -2
- package/esm2022/split-button/lib/split-button/split-button.component.mjs +3 -3
- package/esm2022/star-rating/star-rating/star-rating.component.mjs +3 -3
- package/esm2022/stepper/lib/stepper/stepper.component.mjs +3 -3
- package/esm2022/switch/lib/switch/switch.component.mjs +5 -19
- package/esm2022/tabs/lib/tabs/tabs.component.mjs +3 -3
- package/esm2022/text-area/lib/text-area/text-area.component.mjs +3 -3
- package/esm2022/thumbnail/lib/thumbnail/thumbnail.component.mjs +10 -3
- package/esm2022/thumbnails/lib/thumbnails/components/thumbnail-item/thumbnail-item.component.mjs +3 -3
- package/esm2022/tiered-menu/lib/tiered-menu/components/tiered-menu-item/tiered-menu-item.component.mjs +3 -3
- package/esm2022/tiered-menu/lib/tiered-menu/services/tiered-menu.global.service.mjs +4 -3
- package/esm2022/tile/lib/tile/tile.component.mjs +3 -3
- package/esm2022/tree/lib/tree/components/tree-node-item/tree-node-item.component.mjs +20 -3
- package/esm2022/workspace-switch/lib/workspace-switch/workspace-switch.component.mjs +3 -3
- package/fesm2022/seniorsistemas-angular-components-accordion.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-accordion.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +10 -5
- package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs +5 -3
- package/fesm2022/seniorsistemas-angular-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-button.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-card.mjs +12 -4
- package/fesm2022/seniorsistemas-angular-components-card.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-checkbox-list.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-checkbox.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-checkbox.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-chips.mjs +4 -4
- package/fesm2022/seniorsistemas-angular-components-chips.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-code-editor.mjs +2 -1
- package/fesm2022/seniorsistemas-angular-components-code-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-collapse-link.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs +13 -8
- package/fesm2022/seniorsistemas-angular-components-country-phone-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +422 -38
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dialog.mjs +14 -2
- package/fesm2022/seniorsistemas-angular-components-dialog.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-drawer.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-drawer.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +13 -12
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-editor.mjs +4 -4
- package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-fieldset.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-fieldset.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-file-picker.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-gantt.mjs +3 -2
- package/fesm2022/seniorsistemas-angular-components-gantt.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-global-search.mjs +14 -23
- package/fesm2022/seniorsistemas-angular-components-global-search.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-grid-menu.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-input-text.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-input-text.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-navigation-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-object-card.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-object-card.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-pin-code-field.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-radio-button.mjs +3 -9
- package/fesm2022/seniorsistemas-angular-components-radio-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select-button.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-select-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-shared.mjs +5 -5
- package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-side-sheet.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-slider.mjs +67 -65
- package/fesm2022/seniorsistemas-angular-components-slider.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-split-button.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-star-rating.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-star-rating.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-stepper.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-stepper.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-switch.mjs +4 -18
- package/fesm2022/seniorsistemas-angular-components-switch.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tabs.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-tabs.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs +9 -2
- package/fesm2022/seniorsistemas-angular-components-thumbnail.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-thumbnails.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs +5 -4
- package/fesm2022/seniorsistemas-angular-components-tiered-menu.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tile.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-tile.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-tree.mjs +20 -3
- package/fesm2022/seniorsistemas-angular-components-tree.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs +2 -2
- package/fesm2022/seniorsistemas-angular-components-workspace-switch.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components.mjs +39 -12
- package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
- package/global-search/lib/global-search/global-search.component.d.ts +7 -3
- package/package.json +1 -1
- package/radio-button/lib/radio-button/radio-button.component.d.ts +0 -1
- package/slider/lib/slider/slider.component.d.ts +25 -7
- package/styles.css +5 -0
- package/switch/lib/switch/switch.component.d.ts +0 -2
- package/thumbnail/lib/thumbnail/thumbnail.component.d.ts +1 -0
- package/tree/lib/tree/components/tree-node-item/tree-node-item.component.d.ts +4 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { CdkTrapFocus } from '@angular/cdk/a11y';
|
|
2
|
+
import { CdkTrapFocus, LiveAnnouncer } from '@angular/cdk/a11y';
|
|
3
3
|
import { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
|
|
4
4
|
import { NgClass } from '@angular/common';
|
|
5
5
|
import { afterNextRender, Component, computed, DestroyRef, ElementRef, inject, Injector, input, model, output, signal, viewChild, } from '@angular/core';
|
|
@@ -177,12 +177,20 @@ export class DatepickerComponent {
|
|
|
177
177
|
hostElement = inject(ElementRef);
|
|
178
178
|
translateService = inject(TranslateService);
|
|
179
179
|
destroyRef = inject(DestroyRef);
|
|
180
|
+
liveAnnouncer = inject(LiveAnnouncer);
|
|
180
181
|
currentLang = signal(this.translateService.currentLang);
|
|
181
182
|
/** Reflete `(pointer: coarse)` — dispositivos touch preferem o popup do calendário ao teclado. */
|
|
182
183
|
isTouchDevice = signal(typeof window !== 'undefined' && typeof window.matchMedia === 'function'
|
|
183
184
|
? window.matchMedia('(pointer: coarse)').matches
|
|
184
185
|
: false);
|
|
185
186
|
segmentEngine = new DateSegmentEngine();
|
|
187
|
+
/** Elemento que tinha foco antes do painel abrir — ver `captureFocusOrigin`/`closePanel`. */
|
|
188
|
+
elementToRestoreFocusTo = null;
|
|
189
|
+
/** `true` só durante o `.focus()` programático de restauração em `closePanel()` — evita que
|
|
190
|
+
* `handleInputFocus` interprete esse foco como um foco genuíno do usuário e reabra o painel
|
|
191
|
+
* na hora via `showOnFocus` (ex.: selecionar uma data devolve o foco pro input, que senão
|
|
192
|
+
* reabriria o painel imediatamente depois de fechá-lo). */
|
|
193
|
+
isRestoringFocusOnClose = false;
|
|
186
194
|
lastSegmentConfig = null;
|
|
187
195
|
measureCanvas;
|
|
188
196
|
/** Incrementado a cada mutação do usuário — invalida callbacks de clique/foco adiados que ficaram obsoletos. */
|
|
@@ -217,6 +225,15 @@ export class DatepickerComponent {
|
|
|
217
225
|
const translated = this.resolveTranslatedOrDefault('platform.angular_components.hour_format', '24');
|
|
218
226
|
return translated === '12' ? '12' : '24';
|
|
219
227
|
});
|
|
228
|
+
static SEGMENT_LABEL_KEYS = {
|
|
229
|
+
day: 'platform.angular_components.datepicker_segment_day',
|
|
230
|
+
month: 'platform.angular_components.datepicker_segment_month',
|
|
231
|
+
year: 'platform.angular_components.datepicker_segment_year',
|
|
232
|
+
hour: 'platform.angular_components.datepicker_hour',
|
|
233
|
+
minute: 'platform.angular_components.datepicker_minute',
|
|
234
|
+
second: 'platform.angular_components.datepicker_second',
|
|
235
|
+
ampm: 'platform.angular_components.datepicker_segment_ampm',
|
|
236
|
+
};
|
|
220
237
|
/** Modos cujo formato de exibição é resolvido pela engine de segmentos (independente de touch/readonly). */
|
|
221
238
|
isSegmentModeCandidate = computed(() => {
|
|
222
239
|
if (this.isMultipleMode())
|
|
@@ -229,14 +246,33 @@ export class DatepickerComponent {
|
|
|
229
246
|
/** Indica se o time picker deve usar o formato de 12 horas com seletor AM/PM. */
|
|
230
247
|
is12HourFormat = computed(() => this.resolvedHourFormat() === '12');
|
|
231
248
|
/** Hora exibida no time picker: 1–12 no formato 12h, 0–23 no formato 24h. */
|
|
232
|
-
displayHours = computed(() =>
|
|
249
|
+
displayHours = computed(() => this.displayHourFor(this.hours()));
|
|
250
|
+
/** Meridiano atual derivado da hora interna (0–23). */
|
|
251
|
+
amPm = computed(() => this.meridiemFor(this.hours()));
|
|
252
|
+
displayHourFor(hours24) {
|
|
233
253
|
if (!this.is12HourFormat())
|
|
234
|
-
return
|
|
235
|
-
const h12 =
|
|
254
|
+
return hours24;
|
|
255
|
+
const h12 = hours24 % DatepickerComponent.HOURS_PER_MERIDIEM;
|
|
236
256
|
return h12 === 0 ? DatepickerComponent.HOURS_PER_MERIDIEM : h12;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
|
|
257
|
+
}
|
|
258
|
+
meridiemFor(hours24) {
|
|
259
|
+
return hours24 < DatepickerComponent.HOURS_PER_MERIDIEM ? 'AM' : 'PM';
|
|
260
|
+
}
|
|
261
|
+
/** Texto (com AM/PM quando aplicável) da hora de destino do botão "aumentar"/"diminuir hora"
|
|
262
|
+
* — mesma motivação de `prevMonthTarget`/`nextMonthTarget`/`prevYearTarget`/`nextYearTarget`:
|
|
263
|
+
* sem isso, o botão só diz "aumentar hora", sem dizer qual hora vai resultar. */
|
|
264
|
+
formatHourTarget(hours24) {
|
|
265
|
+
const padded = this.padTime(this.displayHourFor(hours24));
|
|
266
|
+
return this.is12HourFormat() ? `${padded} ${this.meridiemFor(hours24)}` : padded;
|
|
267
|
+
}
|
|
268
|
+
prevHourTarget = computed(() => this.formatHourTarget((this.hours() - this.stepHour() + this.maxHours) % this.maxHours));
|
|
269
|
+
nextHourTarget = computed(() => this.formatHourTarget((this.hours() + this.stepHour()) % this.maxHours));
|
|
270
|
+
/** Mesma motivação, para os botões de minuto/segundo/AM-PM. */
|
|
271
|
+
prevMinuteTarget = computed(() => this.padTime((this.minutes() - this.minuteStep() + this.maxMinutes) % this.maxMinutes));
|
|
272
|
+
nextMinuteTarget = computed(() => this.padTime((this.minutes() + this.minuteStep()) % this.maxMinutes));
|
|
273
|
+
prevSecondTarget = computed(() => this.padTime((this.seconds() - this.stepSecond() + 60) % 60));
|
|
274
|
+
nextSecondTarget = computed(() => this.padTime((this.seconds() + this.stepSecond()) % 60));
|
|
275
|
+
nextMeridiemTarget = computed(() => (this.amPm() === 'AM' ? 'PM' : 'AM'));
|
|
240
276
|
positions = [
|
|
241
277
|
{ originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetY: 4 },
|
|
242
278
|
{ originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetY: -4 },
|
|
@@ -245,17 +281,74 @@ export class DatepickerComponent {
|
|
|
245
281
|
currentMonthIndex = computed(() => this.viewDate().getMonth());
|
|
246
282
|
currentYear = computed(() => this.viewDate().getFullYear());
|
|
247
283
|
currentMonthKey = computed(() => this.monthKeys[this.currentMonthIndex()]);
|
|
284
|
+
/** Ano de destino do botão "ano anterior"/"próximo ano" (view de meses) — pro aria-label
|
|
285
|
+
* anunciar pra onde o botão vai, já que "Ano anterior" sozinho não diz qual ano é esse. */
|
|
286
|
+
prevYearTarget = computed(() => this.currentYear() - 1);
|
|
287
|
+
nextYearTarget = computed(() => this.currentYear() + 1);
|
|
288
|
+
/** Mês/ano de destino do botão "mês anterior"/"próximo mês" (view de calendário) — mesma
|
|
289
|
+
* motivação de `prevYearTarget`/`nextYearTarget`: "Mês anterior" sozinho não diz qual mês é
|
|
290
|
+
* esse, e cruzar a fronteira do ano (ex.: janeiro → dezembro do ano anterior) tornaria essa
|
|
291
|
+
* falta de contexto ainda mais confusa sem o ano junto. */
|
|
292
|
+
prevMonthTarget = computed(() => {
|
|
293
|
+
const view = this.viewDate();
|
|
294
|
+
const target = new Date(view.getFullYear(), view.getMonth() - 1, 1);
|
|
295
|
+
return target.toLocaleDateString(this.currentLang(), { month: 'long', year: 'numeric' });
|
|
296
|
+
});
|
|
297
|
+
nextMonthTarget = computed(() => {
|
|
298
|
+
const view = this.viewDate();
|
|
299
|
+
const target = new Date(view.getFullYear(), view.getMonth() + 1, 1);
|
|
300
|
+
return target.toLocaleDateString(this.currentLang(), { month: 'long', year: 'numeric' });
|
|
301
|
+
});
|
|
248
302
|
showCalendar = computed(() => this.mode() !== 'time');
|
|
249
303
|
showTimePicker = computed(() => this.mode() === 'datetime' || this.mode() === 'time');
|
|
250
304
|
/** Seleção múltipla ativa: apenas no modo `date` com `selectionMode = 'multiple'`. */
|
|
251
305
|
isMultipleMode = computed(() => this.selectionMode() === 'multiple' && this.mode() === 'date');
|
|
306
|
+
/** Instrução lida junto do rótulo da grade de dias — cada modo com semântica de seleção não
|
|
307
|
+
* óbvia (múltipla, intervalo) ganha uma frase própria; `range` ainda se divide em duas fases
|
|
308
|
+
* (escolhendo início vs. já com `pendingRangeStart`, escolhendo fim). */
|
|
309
|
+
calendarGridAriaLabelKey = computed(() => {
|
|
310
|
+
if (this.isMultipleMode())
|
|
311
|
+
return 'platform.angular_components.datepicker_calendar_label_multiple';
|
|
312
|
+
if (this.mode() === 'range') {
|
|
313
|
+
return this.pendingRangeStart()
|
|
314
|
+
? 'platform.angular_components.datepicker_calendar_label_range_pending'
|
|
315
|
+
: 'platform.angular_components.datepicker_calendar_label_range';
|
|
316
|
+
}
|
|
317
|
+
return 'platform.angular_components.datepicker_calendar_label';
|
|
318
|
+
});
|
|
252
319
|
orderedWeekDayKeys = computed(() => {
|
|
253
320
|
const start = this.firstDayOfWeek();
|
|
254
321
|
return [...this.weekDayKeys.slice(start), ...this.weekDayKeys.slice(0, start)];
|
|
255
322
|
});
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
323
|
+
/** Ciente da fase de seleção em `range`: enquanto não há `pendingRangeStart`, é a mesma chave
|
|
324
|
+
* de sempre ("selecionar intervalo"); depois do primeiro clique, muda pra uma chave que cita
|
|
325
|
+
* a data inicial já escolhida, já que reabrir/reentrar no diálogo nesse meio-tempo não dava
|
|
326
|
+
* nenhuma pista de que a segunda metade do fluxo era a que faltava. */
|
|
327
|
+
dialogAriaLabelKey = computed(() => {
|
|
328
|
+
if (this.mode() !== 'range')
|
|
329
|
+
return 'platform.angular_components.datepicker_select_date';
|
|
330
|
+
return this.pendingRangeStart()
|
|
331
|
+
? 'platform.angular_components.datepicker_select_range_end'
|
|
332
|
+
: 'platform.angular_components.datepicker_select_range';
|
|
333
|
+
});
|
|
334
|
+
dialogAriaLabelParams = computed(() => {
|
|
335
|
+
const pending = this.pendingRangeStart();
|
|
336
|
+
return pending ? { date: this.formatDayAriaLabel(pending) } : {};
|
|
337
|
+
});
|
|
338
|
+
rangeStatusElementId = computed(() => `${this.inputId()}-range-status`);
|
|
339
|
+
/** Texto do `<span>` `sr-only` referenciado por `aria-describedby` no `<input>` — dá ao campo
|
|
340
|
+
* um conteúdo persistente e acessível enquanto só a data inicial do intervalo foi escolhida,
|
|
341
|
+
* já que `inputDate` só reflete o valor completo depois da segunda escolha (a atualização
|
|
342
|
+
* parcial em `selectDate()` cobre o texto visível; isto cobre o que um leitor de tela lê ao
|
|
343
|
+
* focar/reler o campo). Usa `aria-describedby`, não `aria-label`, pra só ACRESCENTAR
|
|
344
|
+
* informação sem sobrescrever o nome acessível que integrações (dynamic-form, showcase)
|
|
345
|
+
* já controlam por fora do componente. */
|
|
346
|
+
rangePendingStatusText = computed(() => {
|
|
347
|
+
if (this.mode() !== 'range')
|
|
348
|
+
return '';
|
|
349
|
+
const pending = this.pendingRangeStart();
|
|
350
|
+
return pending ? this.buildRangeStartSelectedText(pending) : '';
|
|
351
|
+
});
|
|
259
352
|
placeholderKey = computed(() => {
|
|
260
353
|
const mode = this.mode();
|
|
261
354
|
return `platform.angular_components.datepicker_placeholder_${mode}`;
|
|
@@ -319,6 +412,19 @@ export class DatepickerComponent {
|
|
|
319
412
|
return rows;
|
|
320
413
|
});
|
|
321
414
|
currentDecadeStart = computed(() => Math.floor(this.currentYear() / 10) * 10);
|
|
415
|
+
/** Intervalo de destino do botão "década anterior"/"próxima década" (view de anos) — mesma
|
|
416
|
+
* motivação de `prevYearTarget`/`nextYearTarget`. `navigatePrev`/`navigateNext` deslocam
|
|
417
|
+
* `viewDate` em ±10 anos (não ±12) nessa view; o grid exibido é que mostra 12 anos por
|
|
418
|
+
* página (ver `yearsGrid`) — daí o intervalo ir de `currentDecadeStart() ± 10` até
|
|
419
|
+
* `+ 11` pra bater exatamente com a página que o clique realmente abre. */
|
|
420
|
+
prevDecadeRange = computed(() => {
|
|
421
|
+
const start = this.currentDecadeStart() - 10;
|
|
422
|
+
return { startYear: start, endYear: start + 11 };
|
|
423
|
+
});
|
|
424
|
+
nextDecadeRange = computed(() => {
|
|
425
|
+
const start = this.currentDecadeStart() + 10;
|
|
426
|
+
return { startYear: start, endYear: start + 11 };
|
|
427
|
+
});
|
|
322
428
|
yearsGrid = computed(() => {
|
|
323
429
|
const start = this.currentDecadeStart();
|
|
324
430
|
const rows = [];
|
|
@@ -455,33 +561,58 @@ export class DatepickerComponent {
|
|
|
455
561
|
open() {
|
|
456
562
|
if (this.disabled())
|
|
457
563
|
return;
|
|
564
|
+
this.captureFocusOrigin();
|
|
458
565
|
this.isOpen.set(true);
|
|
459
566
|
this.prepareOpenView();
|
|
460
567
|
this.show.emit();
|
|
461
|
-
|
|
462
|
-
afterNextRender(() => this.increaseHourButton()?.nativeElement.focus(), { injector: this.injector });
|
|
463
|
-
}
|
|
464
|
-
else {
|
|
465
|
-
this.focusBestCalendarTarget();
|
|
466
|
-
}
|
|
568
|
+
this.focusPanelAfterOpen();
|
|
467
569
|
}
|
|
468
|
-
/** Abre o painel sem transferir o foco
|
|
570
|
+
/** Abre o painel sem transferir o foco por padrão (usado pelo showOnFocus). Em modos sem
|
|
571
|
+
* digitação por segmento (multiple/range/year/touch) o foco segue pro calendário igual em
|
|
572
|
+
* open(); em modo segmentado o foco permanece no input pra continuar digitando. */
|
|
469
573
|
openOnFocus() {
|
|
470
574
|
if (this.disabled() || this.isOpen())
|
|
471
575
|
return;
|
|
576
|
+
this.captureFocusOrigin();
|
|
472
577
|
this.isOpen.set(true);
|
|
473
578
|
this.prepareOpenView();
|
|
474
579
|
this.show.emit();
|
|
475
|
-
|
|
580
|
+
if (!this.isSegmentedMode()) {
|
|
581
|
+
this.focusPanelAfterOpen();
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
focusPanelAfterOpen() {
|
|
585
|
+
if (this.mode() === 'time') {
|
|
586
|
+
afterNextRender(() => this.increaseHourButton()?.nativeElement.focus(), { injector: this.injector });
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
this.focusBestCalendarTarget();
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
/** Guarda o elemento focado no momento em que o painel abre, pra devolver o foco pra lá ao
|
|
593
|
+
* fechar em vez de sempre forçar pro botão do ícone — ver `closePanel()`. */
|
|
594
|
+
captureFocusOrigin() {
|
|
595
|
+
this.elementToRestoreFocusTo = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
476
596
|
}
|
|
477
597
|
/**
|
|
478
598
|
* Define a view inicial do painel e posiciona o calendário no `defaultDate`
|
|
479
599
|
* quando nenhum valor está selecionado.
|
|
480
600
|
*/
|
|
481
601
|
prepareOpenView() {
|
|
482
|
-
const
|
|
483
|
-
if (
|
|
484
|
-
|
|
602
|
+
const range = this.rangeValue();
|
|
603
|
+
if (this.mode() === 'range' && range?.start) {
|
|
604
|
+
// Reabrir um intervalo já definido precisa cair sempre no mês do início — senão
|
|
605
|
+
// `viewDate` fica onde uma navegação anterior parou por acaso (ex.: cruzar mês ao
|
|
606
|
+
// escolher o fim), e `focusBestCalendarTarget()` (primeiro `[data-focus="selected"]`
|
|
607
|
+
// em ordem de DOM) acaba focando o fim ou nenhuma célula, dependendo de qual mês
|
|
608
|
+
// calha de estar em exibição.
|
|
609
|
+
this.viewDate.set(new Date(range.start.getFullYear(), range.start.getMonth(), 1));
|
|
610
|
+
}
|
|
611
|
+
else {
|
|
612
|
+
const defaultDate = this.defaultDate();
|
|
613
|
+
if (defaultDate && !this.value() && !this.rangeValue()) {
|
|
614
|
+
this.viewDate.set(new Date(defaultDate.getFullYear(), defaultDate.getMonth(), 1));
|
|
615
|
+
}
|
|
485
616
|
}
|
|
486
617
|
if (this.mode() === 'month') {
|
|
487
618
|
this.pickerView.set('months');
|
|
@@ -498,21 +629,64 @@ export class DatepickerComponent {
|
|
|
498
629
|
const panel = this.popupPanel()?.nativeElement;
|
|
499
630
|
if (!panel)
|
|
500
631
|
return;
|
|
501
|
-
const
|
|
632
|
+
const navHeaderTarget = this.pickerView() === 'calendar'
|
|
633
|
+
? null
|
|
634
|
+
: panel.querySelector('[data-nav-header] button:not([disabled])');
|
|
635
|
+
const target = navHeaderTarget ??
|
|
636
|
+
panel.querySelector('[data-focus="selected"]') ??
|
|
502
637
|
panel.querySelector('[data-focus="today"]') ??
|
|
503
638
|
panel.querySelector('button:not([disabled])');
|
|
504
639
|
target?.focus();
|
|
505
640
|
}, { injector: this.injector });
|
|
506
641
|
}
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
642
|
+
/** Zera o estado de intervalo em andamento — usado tanto pelo fechamento total do painel
|
|
643
|
+
* (`closePanel`, onde não faz sentido anunciar nada porque o diálogo inteiro está sumindo)
|
|
644
|
+
* quanto pelo cancelamento leve via Escape dentro da grade (`cancelPendingRangeStart`), que
|
|
645
|
+
* mantém o painel aberto e por isso anuncia a mudança separadamente. */
|
|
646
|
+
resetPendingRangeSelection() {
|
|
510
647
|
this.pendingRangeStart.set(null);
|
|
511
648
|
this.hoverDate.set(null);
|
|
649
|
+
}
|
|
650
|
+
/** Cancelamento leve de uma seleção de intervalo em andamento (ver `handleCalendarGridKeydown`,
|
|
651
|
+
* tecla Escape) — ao contrário de `closePanel`, o painel continua aberto, então aqui faz
|
|
652
|
+
* sentido anunciar a mudança de estado. */
|
|
653
|
+
cancelPendingRangeStart() {
|
|
654
|
+
this.resetPendingRangeSelection();
|
|
655
|
+
// A escolha do início (ramo `!pending` de selectDate()) grava o início pendente em
|
|
656
|
+
// `inputDate` pra não deixar o campo obsoleto durante a seleção parcial (ver selectDate())
|
|
657
|
+
// — cancelar essa escolha precisa desfazer isso também, voltando pro intervalo já
|
|
658
|
+
// confirmado (ou vazio, se nenhum) — testado manualmente via devtools: sem esta linha, o
|
|
659
|
+
// campo ficava preso mostrando a data pendente descartada mesmo com o intervalo antigo
|
|
660
|
+
// ainda destacado no calendário.
|
|
661
|
+
this.inputDate = this.formatForDisplay(this.rangeValue());
|
|
662
|
+
void this.liveAnnouncer.announce(this.translateService.instant('platform.angular_components.datepicker_range_selection_cancelled'), 'polite');
|
|
663
|
+
}
|
|
664
|
+
closePanel() {
|
|
665
|
+
const panelElement = this.popupPanel()?.nativeElement;
|
|
666
|
+
this.isOpen.set(false);
|
|
667
|
+
this.resetPendingRangeSelection();
|
|
512
668
|
this._onTouched();
|
|
513
|
-
this.closed.emit(
|
|
669
|
+
this.closed.emit(panelElement ?? this.hostElement.nativeElement);
|
|
670
|
+
// Só força o foco pra outro lugar se ele estiver dentro do painel que está sendo fechado
|
|
671
|
+
// (senão o usuário ficaria com foco "preso" num elemento que está prestes a sumir do DOM).
|
|
672
|
+
// Se o foco já está em outro lugar — ex.: o próprio input segmentado, que abriu o painel
|
|
673
|
+
// via `openOnFocus` e nunca chegou a perder o foco — deixamos como está, em vez de puxar
|
|
674
|
+
// o foco pro botão do ícone sem nenhum motivo (bug relatado via GNOME Orca: fechar o
|
|
675
|
+
// painel clicando fora, com o foco ainda no input, fazia o foco pular pro ícone).
|
|
676
|
+
const focusIsInsidePanel = panelElement != null && document.activeElement instanceof Node && panelElement.contains(document.activeElement);
|
|
677
|
+
if (!focusIsInsidePanel)
|
|
678
|
+
return;
|
|
679
|
+
const restoreTarget = this.elementToRestoreFocusTo;
|
|
680
|
+
this.elementToRestoreFocusTo = null;
|
|
514
681
|
afterNextRender(() => {
|
|
515
|
-
this.
|
|
682
|
+
this.isRestoringFocusOnClose = true;
|
|
683
|
+
if (restoreTarget && document.contains(restoreTarget)) {
|
|
684
|
+
restoreTarget.focus();
|
|
685
|
+
}
|
|
686
|
+
else {
|
|
687
|
+
this.iconButton()?.nativeElement.focus();
|
|
688
|
+
}
|
|
689
|
+
this.isRestoringFocusOnClose = false;
|
|
516
690
|
}, { injector: this.injector });
|
|
517
691
|
}
|
|
518
692
|
/**
|
|
@@ -627,6 +801,7 @@ export class DatepickerComponent {
|
|
|
627
801
|
this.segmentEngine.selectSegment(index);
|
|
628
802
|
input.focus();
|
|
629
803
|
this.selectActiveSegmentRange(input);
|
|
804
|
+
this.announceActiveSegment();
|
|
630
805
|
};
|
|
631
806
|
focusAndSelect();
|
|
632
807
|
setTimeout(focusAndSelect, 0);
|
|
@@ -684,6 +859,7 @@ export class DatepickerComponent {
|
|
|
684
859
|
const generation = ++this.interactionGeneration;
|
|
685
860
|
this.segmentEngine.selectFirstSegment();
|
|
686
861
|
this.selectActiveSegmentRange(input);
|
|
862
|
+
this.announceGenuineFocus();
|
|
687
863
|
setTimeout(() => {
|
|
688
864
|
if (generation !== this.interactionGeneration)
|
|
689
865
|
return;
|
|
@@ -696,11 +872,13 @@ export class DatepickerComponent {
|
|
|
696
872
|
// Já existe um segmento ativo — por exemplo, handleInputClick acabou de
|
|
697
873
|
// defini-lo e está refocando o input programaticamente após um blur espúrio.
|
|
698
874
|
// Não reinicia para o primeiro segmento; só garante que a seleção visual bata
|
|
699
|
-
// com o estado atual
|
|
875
|
+
// com o estado atual, e anuncia só o segmento (o resumo do valor inteiro é
|
|
876
|
+
// reservado ao primeiro foco genuíno).
|
|
700
877
|
this.selectActiveSegmentRange(input);
|
|
878
|
+
this.announceActiveSegment();
|
|
701
879
|
}
|
|
702
880
|
}
|
|
703
|
-
if (this.showOnFocus()) {
|
|
881
|
+
if (this.showOnFocus() && !this.isRestoringFocusOnClose) {
|
|
704
882
|
this.openOnFocus();
|
|
705
883
|
}
|
|
706
884
|
}
|
|
@@ -738,6 +916,7 @@ export class DatepickerComponent {
|
|
|
738
916
|
if (wasSegmented) {
|
|
739
917
|
this.ensureSegmentEngineConfigured();
|
|
740
918
|
this.segmentEngine.deactivate();
|
|
919
|
+
this.liveAnnouncer.clear();
|
|
741
920
|
this.commitSegmentedValueIfComplete();
|
|
742
921
|
this.inputDate = this.segmentEngine.isEmpty() ? '' : this.segmentEngine.getDisplayString();
|
|
743
922
|
input.value = this.inputDate;
|
|
@@ -880,6 +1059,7 @@ export class DatepickerComponent {
|
|
|
880
1059
|
this.inputDate = this.segmentEngine.getDisplayString();
|
|
881
1060
|
input.value = this.inputDate;
|
|
882
1061
|
this.selectActiveSegmentRange(input);
|
|
1062
|
+
this.announceActiveSegment();
|
|
883
1063
|
input.dispatchEvent(new Event('input', { bubbles: true }));
|
|
884
1064
|
this.commitSegmentedValueIfComplete();
|
|
885
1065
|
}
|
|
@@ -890,6 +1070,67 @@ export class DatepickerComponent {
|
|
|
890
1070
|
const [start, end] = this.segmentEngine.getSegmentRange(index);
|
|
891
1071
|
input.setSelectionRange(start, end);
|
|
892
1072
|
}
|
|
1073
|
+
/** "{rótulo do segmento}, {valor}" (ex.: "Dia, 03") — texto do anúncio de nível de segmento. */
|
|
1074
|
+
buildSegmentAnnouncementText() {
|
|
1075
|
+
const kind = this.segmentEngine.activeKind();
|
|
1076
|
+
if (kind === null)
|
|
1077
|
+
return '';
|
|
1078
|
+
const label = this.translateService.instant(DatepickerComponent.SEGMENT_LABEL_KEYS[kind]);
|
|
1079
|
+
const text = this.segmentEngine.getActiveSegmentText();
|
|
1080
|
+
const value = text || this.translateService.instant('platform.angular_components.datepicker_segment_empty');
|
|
1081
|
+
return `${label}, ${value}`;
|
|
1082
|
+
}
|
|
1083
|
+
/** Anuncia via LiveAnnouncer o segmento ativo — chamado em todo ponto que muda o segmento ativo/seu
|
|
1084
|
+
* valor DEPOIS do primeiro foco genuíno (que já recebe esse mesmo texto embutido em `announceGenuineFocus`). */
|
|
1085
|
+
announceActiveSegment() {
|
|
1086
|
+
const text = this.buildSegmentAnnouncementText();
|
|
1087
|
+
if (text)
|
|
1088
|
+
void this.liveAnnouncer.announce(text, 'polite');
|
|
1089
|
+
}
|
|
1090
|
+
/** Resumo humanizado do valor inteiro (ex.: "10 de outubro de 2020", ou a frase genérica de campo
|
|
1091
|
+
* vazio) — complementa o `<input>` segmentado, que o leitor de tela lê de forma literal/pouco
|
|
1092
|
+
* natural (esqueleto de sublinhados quando vazio, dígitos separados por barra quando completo).
|
|
1093
|
+
* Formatação pura via `Intl`, sem chaves de tradução novas (exceto a frase de campo vazio).
|
|
1094
|
+
* Espelha `formatDayAriaLabel` pro modo `date`. */
|
|
1095
|
+
describeWholeValue() {
|
|
1096
|
+
if (this.segmentEngine.isEmpty()) {
|
|
1097
|
+
return this.translateService.instant('platform.angular_components.datepicker_no_value_selected');
|
|
1098
|
+
}
|
|
1099
|
+
const date = this.value();
|
|
1100
|
+
if (!date)
|
|
1101
|
+
return ''; // valor parcialmente digitado (incompleto) — nada humanizável ainda.
|
|
1102
|
+
const lang = this.currentLang();
|
|
1103
|
+
switch (this.mode()) {
|
|
1104
|
+
case 'date':
|
|
1105
|
+
return this.formatDayAriaLabel(date);
|
|
1106
|
+
case 'month':
|
|
1107
|
+
return date.toLocaleDateString(lang, { month: 'long', year: 'numeric' });
|
|
1108
|
+
case 'time':
|
|
1109
|
+
return date.toLocaleTimeString(lang, {
|
|
1110
|
+
hour: 'numeric',
|
|
1111
|
+
minute: '2-digit',
|
|
1112
|
+
second: this.showSeconds() ? '2-digit' : undefined,
|
|
1113
|
+
hour12: this.resolvedHourFormat() === '12',
|
|
1114
|
+
});
|
|
1115
|
+
case 'datetime':
|
|
1116
|
+
return date.toLocaleString(lang, {
|
|
1117
|
+
dateStyle: 'long',
|
|
1118
|
+
timeStyle: this.showSeconds() ? 'medium' : 'short',
|
|
1119
|
+
hour12: this.resolvedHourFormat() === '12',
|
|
1120
|
+
});
|
|
1121
|
+
default:
|
|
1122
|
+
return ''; // isSegmentedMode() já restringe a date/month/time/datetime
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
/** Anúncio combinado no primeiro foco genuíno do campo: resumo do valor inteiro + segmento ativo,
|
|
1126
|
+
* numa ÚNICA chamada a `announce` (evita duas regiões concorrentes/uma cortando a outra). */
|
|
1127
|
+
announceGenuineFocus() {
|
|
1128
|
+
const summary = this.describeWholeValue();
|
|
1129
|
+
const segmentText = this.buildSegmentAnnouncementText();
|
|
1130
|
+
const combined = summary ? `${summary}. ${segmentText}` : segmentText;
|
|
1131
|
+
if (combined)
|
|
1132
|
+
void this.liveAnnouncer.announce(combined, 'polite');
|
|
1133
|
+
}
|
|
893
1134
|
/** Propaga o valor da engine para o modelo (CVA) assim que todos os segmentos estiverem completos. */
|
|
894
1135
|
commitSegmentedValueIfComplete() {
|
|
895
1136
|
if (!this.segmentEngine.isComplete()) {
|
|
@@ -921,15 +1162,19 @@ export class DatepickerComponent {
|
|
|
921
1162
|
if (this.pickerView() === 'years') {
|
|
922
1163
|
this.viewDate.set(new Date(view.getFullYear() - 10, view.getMonth(), 1));
|
|
923
1164
|
this.yearChange.emit({ month: view.getMonth(), year: view.getFullYear() - 10 });
|
|
1165
|
+
this.announceDecadeChange();
|
|
924
1166
|
}
|
|
925
1167
|
else if (this.pickerView() === 'months') {
|
|
926
|
-
|
|
927
|
-
this.
|
|
1168
|
+
const newDate = new Date(view.getFullYear() - 1, view.getMonth(), 1);
|
|
1169
|
+
this.viewDate.set(newDate);
|
|
1170
|
+
this.yearChange.emit({ month: view.getMonth(), year: newDate.getFullYear() });
|
|
1171
|
+
this.announceYearChange(newDate);
|
|
928
1172
|
}
|
|
929
1173
|
else {
|
|
930
1174
|
const newDate = new Date(view.getFullYear(), view.getMonth() - 1, 1);
|
|
931
1175
|
this.viewDate.set(newDate);
|
|
932
1176
|
this.monthChange.emit({ month: newDate.getMonth(), year: newDate.getFullYear() });
|
|
1177
|
+
this.announceMonthChange(newDate);
|
|
933
1178
|
}
|
|
934
1179
|
}
|
|
935
1180
|
navigateNext() {
|
|
@@ -937,18 +1182,55 @@ export class DatepickerComponent {
|
|
|
937
1182
|
if (this.pickerView() === 'years') {
|
|
938
1183
|
this.viewDate.set(new Date(view.getFullYear() + 10, view.getMonth(), 1));
|
|
939
1184
|
this.yearChange.emit({ month: view.getMonth(), year: view.getFullYear() + 10 });
|
|
1185
|
+
this.announceDecadeChange();
|
|
940
1186
|
}
|
|
941
1187
|
else if (this.pickerView() === 'months') {
|
|
942
|
-
|
|
943
|
-
this.
|
|
1188
|
+
const newDate = new Date(view.getFullYear() + 1, view.getMonth(), 1);
|
|
1189
|
+
this.viewDate.set(newDate);
|
|
1190
|
+
this.yearChange.emit({ month: view.getMonth(), year: newDate.getFullYear() });
|
|
1191
|
+
this.announceYearChange(newDate);
|
|
944
1192
|
}
|
|
945
1193
|
else {
|
|
946
1194
|
const newDate = new Date(view.getFullYear(), view.getMonth() + 1, 1);
|
|
947
1195
|
this.viewDate.set(newDate);
|
|
948
1196
|
this.monthChange.emit({ month: newDate.getMonth(), year: newDate.getFullYear() });
|
|
1197
|
+
this.announceMonthChange(newDate);
|
|
949
1198
|
}
|
|
950
1199
|
}
|
|
1200
|
+
/** Anuncia só "{mês} de {ano}" (ex.: "outubro de 2026") ao cruzar fronteira de mês na grade de dias.
|
|
1201
|
+
* O novo foco (button[role="gridcell"]) já carrega essa info dentro do aria-label longo de
|
|
1202
|
+
* `formatDayAriaLabel`, mas o nome do mês fica "enterrado" no meio da frase e passa despercebido
|
|
1203
|
+
* (confirmado com teste manual via Orca). Sem prefixo tipo "agora exibindo", mesma convenção
|
|
1204
|
+
* adotada por outros calendários acessíveis (ex.: react-aria). */
|
|
1205
|
+
announceMonthChange(newDate) {
|
|
1206
|
+
void this.liveAnnouncer.announce(newDate.toLocaleDateString(this.currentLang(), { month: 'long', year: 'numeric' }), 'polite');
|
|
1207
|
+
}
|
|
1208
|
+
/** Anuncia o ano atualmente exibido ao paginar a view 'months' (ex.: "2025"). O `<span>` central
|
|
1209
|
+
* que mostra esse ano no cabeçalho não é focável, e o aria-label dos botões de navegação só
|
|
1210
|
+
* fala o ano de DESTINO ("Ano anterior, 2025") — sem isso, o leitor de tela nunca confirma o
|
|
1211
|
+
* ano que passou a estar em exibição, só os alvos "anterior"/"próximo". */
|
|
1212
|
+
announceYearChange(newDate) {
|
|
1213
|
+
void this.liveAnnouncer.announce(newDate.toLocaleDateString(this.currentLang(), { year: 'numeric' }), 'polite');
|
|
1214
|
+
}
|
|
1215
|
+
/** Mesma motivação de `announceYearChange`, para a view 'years' (paginação de década) — anuncia
|
|
1216
|
+
* o intervalo atualmente exibido (ex.: "2020 – 2031"), espelhando o texto do `<span>` central. */
|
|
1217
|
+
announceDecadeChange() {
|
|
1218
|
+
void this.liveAnnouncer.announce(`${this.currentDecadeStart()} – ${this.currentDecadeStart() + 11}`, 'polite');
|
|
1219
|
+
}
|
|
951
1220
|
handleCalendarGridKeydown(event) {
|
|
1221
|
+
if (event.key === 'Escape' && this.mode() === 'range' && this.pendingRangeStart() !== null) {
|
|
1222
|
+
event.preventDefault();
|
|
1223
|
+
// Cancelamento leve: desiste só da data inicial pendente, mantendo o painel aberto,
|
|
1224
|
+
// em vez de fechar o diálogo inteiro (o único caminho antes disso). `stopPropagation`
|
|
1225
|
+
// impede esse mesmo Escape de borbulhar até `document.body`, onde o
|
|
1226
|
+
// `OverlayKeyboardDispatcher` do CDK escuta `keydown` (fase de bubble, sem capture) e
|
|
1227
|
+
// dispararia `handleOverlayKeydown`/`closePanel()` — sem isso, o cancelamento leve e o
|
|
1228
|
+
// fechamento total aconteceriam nesse mesmo Escape. Sem `pendingRangeStart`, esse `if`
|
|
1229
|
+
// é falso e o Escape segue intocado até `document.body`, fechando o painel como sempre.
|
|
1230
|
+
event.stopPropagation();
|
|
1231
|
+
this.cancelPendingRangeStart();
|
|
1232
|
+
return;
|
|
1233
|
+
}
|
|
952
1234
|
const ARROWS = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'];
|
|
953
1235
|
if (!ARROWS.includes(event.key))
|
|
954
1236
|
return;
|
|
@@ -1027,6 +1309,11 @@ export class DatepickerComponent {
|
|
|
1027
1309
|
const pending = this.pendingRangeStart();
|
|
1028
1310
|
if (!pending) {
|
|
1029
1311
|
this.pendingRangeStart.set(day.date);
|
|
1312
|
+
// Sem isso o <input> ficava com o valor anterior (ou vazio) enquanto só a data
|
|
1313
|
+
// inicial estava escolhida — tanto o texto visível quanto o que um leitor de tela
|
|
1314
|
+
// lê ao focar o campo ficavam obsoletos até a segunda escolha.
|
|
1315
|
+
this.inputDate = this.formatForDisplay({ start: day.date, end: null });
|
|
1316
|
+
this.announceRangeStartSelected(day.date);
|
|
1030
1317
|
}
|
|
1031
1318
|
else {
|
|
1032
1319
|
const [start, end] = pending.getTime() <= day.date.getTime() ? [pending, day.date] : [day.date, pending];
|
|
@@ -1035,6 +1322,7 @@ export class DatepickerComponent {
|
|
|
1035
1322
|
this.inputDate = this.formatForDisplay(range);
|
|
1036
1323
|
this._onChange(range);
|
|
1037
1324
|
this.selected.emit(range);
|
|
1325
|
+
this.announceRangeCompleted(range);
|
|
1038
1326
|
this.closePanel();
|
|
1039
1327
|
}
|
|
1040
1328
|
return;
|
|
@@ -1070,6 +1358,44 @@ export class DatepickerComponent {
|
|
|
1070
1358
|
this.onValidatorChange();
|
|
1071
1359
|
this._onChange(emitValue);
|
|
1072
1360
|
this.selected.emit(emitValue);
|
|
1361
|
+
this.announceMultipleDateToggle(normalized, index < 0);
|
|
1362
|
+
}
|
|
1363
|
+
/** Anuncia via LiveAnnouncer a data completa (dia da semana, dia, mês, ano) e se ela acabou
|
|
1364
|
+
* de ser selecionada ou desmarcada — pro usuário de leitor de tela saber exatamente o que
|
|
1365
|
+
* mudou antes de seguir escolhendo a próxima data. */
|
|
1366
|
+
announceMultipleDateToggle(date, isNowSelected) {
|
|
1367
|
+
const dateText = this.formatDayAriaLabel(date);
|
|
1368
|
+
const key = isNowSelected
|
|
1369
|
+
? 'platform.angular_components.datepicker_date_selected'
|
|
1370
|
+
: 'platform.angular_components.datepicker_date_deselected';
|
|
1371
|
+
void this.liveAnnouncer.announce(this.translateService.instant(key, { date: dateText }), 'polite');
|
|
1372
|
+
}
|
|
1373
|
+
/** Texto compartilhado entre o anúncio transitório de início de intervalo escolhido
|
|
1374
|
+
* (`announceRangeStartSelected`) e o status persistente exposto via `aria-describedby` no
|
|
1375
|
+
* `<input>` (`rangePendingStatusText`) — mesma redação nos dois lugares de propósito, pra não
|
|
1376
|
+
* soarem como dois estados diferentes pro mesmo momento. */
|
|
1377
|
+
buildRangeStartSelectedText(date) {
|
|
1378
|
+
return this.translateService.instant('platform.angular_components.datepicker_range_start_selected', {
|
|
1379
|
+
date: this.formatDayAriaLabel(date),
|
|
1380
|
+
});
|
|
1381
|
+
}
|
|
1382
|
+
/** Anuncia que a data INICIAL do intervalo foi escolhida — o primeiro clique em `range` era
|
|
1383
|
+
* mudo (ao contrário do toggle em modo `multiple`, sempre anunciado). Recebe um `Date` puro,
|
|
1384
|
+
* não um clique: `selectToday()` chama `selectDate()` internamente e herda este anúncio de
|
|
1385
|
+
* graça, sem precisar de uma segunda chamada. */
|
|
1386
|
+
announceRangeStartSelected(date) {
|
|
1387
|
+
void this.liveAnnouncer.announce(this.buildRangeStartSelectedText(date), 'polite');
|
|
1388
|
+
}
|
|
1389
|
+
/** Anuncia o intervalo concluído, chamado antes de `closePanel()` — o `LiveAnnouncer` escreve
|
|
1390
|
+
* numa região `aria-live` própria e desacoplada do foco, então não é cortado pela restauração
|
|
1391
|
+
* de foco que `closePanel()` agenda um tick depois via `afterNextRender`. */
|
|
1392
|
+
announceRangeCompleted(range) {
|
|
1393
|
+
if (!range.start || !range.end)
|
|
1394
|
+
return;
|
|
1395
|
+
void this.liveAnnouncer.announce(this.translateService.instant('platform.angular_components.datepicker_range_selected', {
|
|
1396
|
+
start: this.formatDayAriaLabel(range.start),
|
|
1397
|
+
end: this.formatDayAriaLabel(range.end),
|
|
1398
|
+
}), 'polite');
|
|
1073
1399
|
}
|
|
1074
1400
|
selectYear(year) {
|
|
1075
1401
|
if (this.isYearDisabled(year))
|
|
@@ -1115,9 +1441,20 @@ export class DatepickerComponent {
|
|
|
1115
1441
|
};
|
|
1116
1442
|
this.selectDate(calDay);
|
|
1117
1443
|
this.todayClick.emit(today);
|
|
1444
|
+
if (this.mode() === 'range' && this.isOpen()) {
|
|
1445
|
+
// Em range, selectDate() só fecha o painel na segunda escolha (ver seu ramo
|
|
1446
|
+
// 'range'); na primeira, o foco fica parado no botão "Hoje" do rodapé, fora da
|
|
1447
|
+
// grade — sem isso o usuário não tinha nenhuma pista de que precisava voltar pra
|
|
1448
|
+
// grade pra escolher a data final. A célula de hoje já carrega
|
|
1449
|
+
// `data-focus="selected"` (isRangeStart acabou de ser setado por selectDate), que
|
|
1450
|
+
// focusBestCalendarTarget() já prioriza. O anúncio de "início selecionado" já
|
|
1451
|
+
// disparou dentro de selectDate() antes deste bloco rodar.
|
|
1452
|
+
this.focusBestCalendarTarget();
|
|
1453
|
+
}
|
|
1118
1454
|
}
|
|
1119
1455
|
}
|
|
1120
1456
|
clearValue(event) {
|
|
1457
|
+
const hadRangeInProgress = this.mode() === 'range' && (this.pendingRangeStart() !== null || this.rangeValue() !== null);
|
|
1121
1458
|
this.value.set(null);
|
|
1122
1459
|
this.hours.set(0);
|
|
1123
1460
|
this.minutes.set(0);
|
|
@@ -1128,6 +1465,11 @@ export class DatepickerComponent {
|
|
|
1128
1465
|
this.setDisplayFor(null);
|
|
1129
1466
|
this._onChange(null);
|
|
1130
1467
|
this.clearClick.emit(event);
|
|
1468
|
+
if (hadRangeInProgress) {
|
|
1469
|
+
// Só anuncia quando havia de fato algo a limpar — evita "intervalo limpo" toda vez
|
|
1470
|
+
// que alguém aperta "Limpar" por garantia, sem nada selecionado ainda.
|
|
1471
|
+
void this.liveAnnouncer.announce(this.translateService.instant('platform.angular_components.datepicker_range_cleared'), 'polite');
|
|
1472
|
+
}
|
|
1131
1473
|
this.closePanel();
|
|
1132
1474
|
}
|
|
1133
1475
|
confirm() {
|
|
@@ -1288,13 +1630,38 @@ export class DatepickerComponent {
|
|
|
1288
1630
|
padTime(value) {
|
|
1289
1631
|
return String(value).padStart(2, '0');
|
|
1290
1632
|
}
|
|
1291
|
-
|
|
1292
|
-
|
|
1633
|
+
/** `day` é opcional e só usado em `mode="range"` — os demais call sites (resumo do valor
|
|
1634
|
+
* segmentado, anúncio de toggle em modo `multiple`) nunca têm um `CalendarDay` à mão e nunca
|
|
1635
|
+
* rodam em `range`, então continuam recebendo exatamente o texto de sempre. */
|
|
1636
|
+
formatDayAriaLabel(date, day) {
|
|
1637
|
+
const base = date.toLocaleDateString(this.currentLang(), {
|
|
1293
1638
|
weekday: 'long',
|
|
1294
1639
|
year: 'numeric',
|
|
1295
1640
|
month: 'long',
|
|
1296
1641
|
day: 'numeric',
|
|
1297
1642
|
});
|
|
1643
|
+
if (!day || this.mode() !== 'range')
|
|
1644
|
+
return base;
|
|
1645
|
+
const suffix = this.rangeDayStatusSuffix(day);
|
|
1646
|
+
return suffix ? `${base}, ${suffix}` : base;
|
|
1647
|
+
}
|
|
1648
|
+
/** Sufixo que diz o papel do dia dentro do intervalo selecionado — sem isso, toda célula da
|
|
1649
|
+
* grade soa idêntica pro leitor de tela, e o único jeito de saber onde está o início/fim é
|
|
1650
|
+
* enxergando o destaque visual. */
|
|
1651
|
+
rangeDayStatusSuffix(day) {
|
|
1652
|
+
if (day.isRangeStart && day.isRangeEnd) {
|
|
1653
|
+
return this.translateService.instant('platform.angular_components.datepicker_range_start_end');
|
|
1654
|
+
}
|
|
1655
|
+
if (day.isRangeStart) {
|
|
1656
|
+
return this.translateService.instant('platform.angular_components.datepicker_range_start');
|
|
1657
|
+
}
|
|
1658
|
+
if (day.isRangeEnd) {
|
|
1659
|
+
return this.translateService.instant('platform.angular_components.datepicker_range_end');
|
|
1660
|
+
}
|
|
1661
|
+
if (day.isInRange) {
|
|
1662
|
+
return this.translateService.instant('platform.angular_components.datepicker_range_in_range');
|
|
1663
|
+
}
|
|
1664
|
+
return '';
|
|
1298
1665
|
}
|
|
1299
1666
|
/** Formata o valor para exibição no input, aplicando rangeSeparator, dateFormat e multipleSeparator. */
|
|
1300
1667
|
formatForDisplay(value) {
|
|
@@ -1436,7 +1803,7 @@ export class DatepickerComponent {
|
|
|
1436
1803
|
useExisting: DatepickerComponent,
|
|
1437
1804
|
multi: true,
|
|
1438
1805
|
},
|
|
1439
|
-
], viewQueries: [{ propertyName: "popupPanel", first: true, predicate: ["popupPanel"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "increaseHourButton", first: true, predicate: ["increaseHourButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "iconButton", first: true, predicate: ["iconButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "triggerInput", first: true, predicate: ["triggerInput"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus:border-primary\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n />\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !isFocused()\"\n [class.border-primary]=\"isFocused() && !disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_month' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }} {{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_month' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_calendar_label'\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date)\"\n [attr.aria-selected]=\"day.isSelected || day.isRangeStart || day.isRangeEnd || null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_decade' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_decade' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_year' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_year' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_hour' | translate\"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_hour' | translate\"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_minute' | translate\"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_minute' | translate\"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_second' | translate\"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_second' | translate\"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_toggle_meridiem' | translate\"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
|
|
1806
|
+
], viewQueries: [{ propertyName: "popupPanel", first: true, predicate: ["popupPanel"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "increaseHourButton", first: true, predicate: ["increaseHourButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "iconButton", first: true, predicate: ["iconButton"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "triggerInput", first: true, predicate: ["triggerInput"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n [attr.aria-describedby]=\"mode() === 'range' ? rangeStatusElementId() : null\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n />\n\n @if (mode() === 'range') {\n <span\n class=\"sr-only\"\n [id]=\"rangeStatusElementId()\"\n >{{ rangePendingStatusText() }}</span\n >\n }\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !isFocused()\"\n [class.border-primary]=\"isFocused() && !disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_month'\n | translate: { month: prevMonthTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }} {{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_month'\n | translate: { month: nextMonthTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n calendarGridAriaLabelKey()\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n [attr.aria-multiselectable]=\"mode() === 'range' ? true : null\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date, day)\"\n [attr.aria-selected]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd || day.isInRange || null\n \"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (focus)=\"onDayHover(day.date)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_decade' | translate: prevDecadeRange()\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_decade' | translate: nextDecadeRange()\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_year' | translate: { year: prevYearTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_year' | translate: { year: nextYearTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n </div>\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_hour'\n | translate: { time: nextHourTarget() }\n \"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_hour'\n | translate: { time: prevHourTarget() }\n \"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_minute'\n | translate: { time: nextMinuteTarget() }\n \"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_minute'\n | translate: { time: prevMinuteTarget() }\n \"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_second'\n | translate: { time: nextSecondTarget() }\n \"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_second'\n | translate: { time: prevSecondTarget() }\n \"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_toggle_meridiem'\n | translate: { meridiem: nextMeridiemTarget() }\n \"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
|
|
1440
1807
|
}
|
|
1441
1808
|
__decorate([
|
|
1442
1809
|
numericKeysOnly()
|
|
@@ -1470,6 +1837,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
1470
1837
|
useExisting: DatepickerComponent,
|
|
1471
1838
|
multi: true,
|
|
1472
1839
|
},
|
|
1473
|
-
], template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus:border-primary\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n />\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !isFocused()\"\n [class.border-primary]=\"isFocused() && !disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_month' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }} {{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_month' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_calendar_label'\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date)\"\n [attr.aria-selected]=\"day.isSelected || day.isRangeStart || day.isRangeEnd || null\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_decade' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_decade' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_prev_year' | translate\"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_next_year' | translate\"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_hour' | translate\"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_hour' | translate\"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_minute' | translate\"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_minute' | translate\"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_increment_second' | translate\"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus:border-primary focus:outline-1 focus:outline-primary\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_decrement_second' | translate\"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_toggle_meridiem' | translate\"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}\n"] }]
|
|
1840
|
+
], template: "<div\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"relative flex w-full items-center\"\n role=\"combobox\"\n aria-haspopup=\"grid\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"popupId()\"\n>\n <input\n #triggerInput\n class=\"h-[35px] w-full rounded-small border border-solid border-grayscale-30 pl-3 text-sm outline-none transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [class.pr-10]=\"showIcon() && !showClear()\"\n [class.pr-16]=\"showIcon() && showClear()\"\n [class.pr-6]=\"!showIcon() && showClear()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [id]=\"inputId()\"\n [name]=\"name() ?? inputId()\"\n type=\"text\"\n [placeholder]=\"placeholder() ?? (placeholderKey() | translate)\"\n [disabled]=\"disabled()\"\n [readonly]=\"\n readonlyInput() ||\n mode() === 'range' ||\n mode() === 'year' ||\n isMultipleMode() ||\n (isSegmentModeCandidate() && isTouchDevice())\n \"\n [tabIndex]=\"tabindex() ?? null\"\n [autofocus]=\"autofocus()\"\n [(ngModel)]=\"inputDate\"\n (ngModelChange)=\"handleInputChange($event)\"\n (focus)=\"handleInputFocus($event)\"\n (blur)=\"handleInputBlur($event)\"\n (mousedown)=\"handleInputClick($event)\"\n (keydown)=\"handleTriggerKeydown($event)\"\n (input)=\"handleNativeInput($event)\"\n [attr.aria-invalid]=\"ngControl?.control?.invalid || null\"\n [attr.aria-describedby]=\"mode() === 'range' ? rangeStatusElementId() : null\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n />\n\n @if (mode() === 'range') {\n <span\n class=\"sr-only\"\n [id]=\"rangeStatusElementId()\"\n >{{ rangePendingStatusText() }}</span\n >\n }\n\n @if (showClear() && inputDate) {\n <button\n type=\"button\"\n class=\"absolute flex h-[35px] w-6 items-center justify-center text-grayscale-60 transition-colors hover:text-grayscale-90\"\n [class.right-9]=\"showIcon()\"\n [class.right-0]=\"!showIcon()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_clear' | translate\"\n (click)=\"clearValue($event)\"\n >\n <i\n class=\"fas fa-times text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n @if (showIcon()) {\n <button\n #iconButton\n type=\"button\"\n class=\"absolute right-0 flex h-[35px] w-9 items-center justify-center border-l border-solid transition-colors\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.cursor-not-allowed]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled() && !isFocused()\"\n [class.border-primary]=\"isFocused() && !disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.hover:bg-grayscale-10]=\"!disabled()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_open' | translate\"\n (click)=\"toggle()\"\n (keydown)=\"handleTriggerKeydown($event)\"\n >\n <i\n [class]=\"resolvedIcon()\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"positions\"\n (backdropClick)=\"handleBackdropClick($event)\"\n (overlayKeydown)=\"handleOverlayKeydown($event)\"\n (detach)=\"isOpen.set(false)\"\n>\n <div\n #popupPanel\n class=\"z-50 w-72 rounded-medium border border-solid border-grayscale-30 bg-grayscale-0 shadow-md\"\n role=\"dialog\"\n cdkTrapFocus\n [id]=\"popupId()\"\n [attr.aria-label]=\"dialogAriaLabelKey() | translate: dialogAriaLabelParams()\"\n >\n @if (showCalendar()) {\n @if (pickerView() === 'calendar') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o mensal -->\n <div class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_month'\n | translate: { month: prevMonthTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex items-center gap-1 rounded-small px-2 py-1 text-sm font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month_year' | translate\"\n (click)=\"switchToMonths()\"\n >\n {{ currentMonthKey() | translate }} {{ currentYear() }}\n <i\n class=\"fas fa-chevron-down text-[10px]\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_month'\n | translate: { month: nextMonthTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Cabe\u00E7alhos dos dias da semana -->\n <div\n class=\"grid grid-cols-7 px-3 pt-2\"\n role=\"row\"\n >\n @for (dayKey of orderedWeekDayKeys(); track dayKey) {\n <div\n class=\"flex h-8 items-center justify-center text-xs font-medium text-grayscale-60\"\n role=\"columnheader\"\n [attr.aria-label]=\"dayKey | translate\"\n >\n {{ dayKey | translate }}\n </div>\n }\n </div>\n\n <!-- Grade do calend\u00E1rio -->\n <div\n class=\"grid grid-cols-7 px-3 pb-2\"\n role=\"grid\"\n [attr.aria-label]=\"\n calendarGridAriaLabelKey()\n | translate: { month: (currentMonthKey() | translate), year: currentYear() }\n \"\n [attr.aria-multiselectable]=\"mode() === 'range' ? true : null\"\n (keydown)=\"handleCalendarGridKeydown($event)\"\n >\n @for (week of calendarWeeks(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (day of week; track day.date.toISOString()) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-8 w-8 items-center justify-center rounded-[50%] text-sm font-normal transition-colors\"\n [class.invisible]=\"!showOtherMonths() && !day.isCurrentMonth\"\n [attr.aria-label]=\"formatDayAriaLabel(day.date, day)\"\n [attr.aria-selected]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd || day.isInRange || null\n \"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n [attr.aria-disabled]=\"day.isDisabled ? 'true' : null\"\n [attr.aria-hidden]=\"!showOtherMonths() && !day.isCurrentMonth ? 'true' : null\"\n [attr.data-focus]=\"\n day.isSelected || day.isRangeStart || day.isRangeEnd\n ? 'selected'\n : day.isToday\n ? 'today'\n : null\n \"\n [disabled]=\"day.isDisabled\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0':\n day.isSelected || day.isRangeStart || day.isRangeEnd,\n 'bg-grayscale-10 hover:bg-grayscale-20':\n day.isInRange && !day.isRangeStart && !day.isRangeEnd,\n 'text-grayscale-90 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n day.isCurrentMonth,\n 'text-grayscale-60 hover:bg-grayscale-10':\n !day.isSelected &&\n !day.isRangeStart &&\n !day.isRangeEnd &&\n !day.isDisabled &&\n !day.isCurrentMonth,\n 'ring-2 ring-inset ring-primary':\n day.isToday && !day.isSelected && !day.isRangeStart && !day.isRangeEnd,\n 'cursor-not-allowed text-grayscale-30': day.isDisabled,\n }\"\n (mouseenter)=\"onDayHover(day.date)\"\n (mouseleave)=\"onDayHover(null)\"\n (focus)=\"onDayHover(day.date)\"\n (click)=\"selectDate(day)\"\n >\n {{ day.dayOfMonth }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'years') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o por d\u00E9cada -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_decade' | translate: prevDecadeRange()\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\"\n >{{ currentDecadeStart() }} \u2013 {{ currentDecadeStart() + 11 }}</span\n >\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_decade' | translate: nextDecadeRange()\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de anos -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_year' | translate\"\n >\n @for (row of yearsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (year of row; track year) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isYearSelected(year) || null\"\n [attr.aria-disabled]=\"isYearDisabled(year) ? 'true' : null\"\n [attr.aria-current]=\"isCurrentYear(year) ? 'date' : null\"\n [attr.data-focus]=\"\n isYearSelected(year) ? 'selected' : isCurrentYear(year) ? 'today' : null\n \"\n [disabled]=\"isYearDisabled(year)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isYearSelected(year),\n 'ring-2 ring-inset ring-primary':\n isCurrentYear(year) && !isYearSelected(year) && !isYearDisabled(year),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isYearSelected(year) && !isYearDisabled(year),\n 'cursor-not-allowed text-grayscale-30': isYearDisabled(year),\n }\"\n (click)=\"selectYear(year)\"\n >\n {{ year }}\n </button>\n }\n </div>\n }\n </div>\n }\n\n @if (pickerView() === 'months') {\n <!-- Cabe\u00E7alho de navega\u00E7\u00E3o anual -->\n <div\n data-nav-header\n class=\"flex items-center justify-between border-b border-solid border-grayscale-30 px-3 py-2\"\n >\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"prevDisabled()\"\n [attr.aria-disabled]=\"prevDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_prev_year' | translate: { year: prevYearTarget() }\n \"\n (click)=\"navigatePrev()\"\n >\n <i\n class=\"fas fa-chevron-left text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n\n <span class=\"text-sm font-medium text-grayscale-90\">{{ currentYear() }}</span>\n\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10 disabled:cursor-not-allowed disabled:text-grayscale-30\"\n [disabled]=\"nextDisabled()\"\n [attr.aria-disabled]=\"nextDisabled() ? 'true' : null\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_next_year' | translate: { year: nextYearTarget() }\n \"\n (click)=\"navigateNext()\"\n >\n <i\n class=\"fas fa-chevron-right text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <!-- Grade de meses -->\n <div\n class=\"grid grid-cols-3 gap-2 px-3 py-3\"\n role=\"grid\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_month' | translate\"\n >\n @for (row of monthsGrid(); track $index) {\n <div\n role=\"row\"\n class=\"contents\"\n >\n @for (month of row; track month.index) {\n <button\n type=\"button\"\n role=\"gridcell\"\n class=\"flex h-9 items-center justify-center rounded-small text-sm font-normal transition-colors\"\n [attr.aria-selected]=\"isMonthSelected(month.index) || null\"\n [attr.aria-disabled]=\"isMonthDisabled(month.index) ? 'true' : null\"\n [attr.data-focus]=\"isMonthSelected(month.index) ? 'selected' : null\"\n [disabled]=\"isMonthDisabled(month.index)\"\n [ngClass]=\"{\n 'bg-primary font-semibold text-grayscale-0': isMonthSelected(month.index),\n 'text-grayscale-90 hover:bg-grayscale-10':\n !isMonthSelected(month.index) && !isMonthDisabled(month.index),\n 'cursor-not-allowed text-grayscale-30': isMonthDisabled(month.index),\n }\"\n (click)=\"selectMonth(month.index)\"\n >\n {{ month.key | translate }}\n </button>\n }\n </div>\n }\n </div>\n\n @if (mode() !== 'month') {\n <div class=\"border-t border-solid border-grayscale-30 px-3 py-2\">\n <button\n type=\"button\"\n class=\"flex items-center gap-2 rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"backToCalendar()\"\n >\n <i\n class=\"fas fa-arrow-left\"\n aria-hidden=\"true\"\n ></i>\n {{ 'platform.angular_components.datepicker_back_to_calendar' | translate }}\n </button>\n </div>\n }\n }\n }\n\n <!-- Time picker -->\n @if (showTimePicker()) {\n <div\n class=\"flex items-center justify-center gap-3 px-4 py-3\"\n [class.border-t]=\"showCalendar()\"\n [class.border-solid]=\"showCalendar()\"\n [class.border-grayscale-30]=\"showCalendar()\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_select_time' | translate\"\n >\n <!-- Horas -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n #increaseHourButton\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_hour'\n | translate: { time: nextHourTarget() }\n \"\n (click)=\"incrementHours()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(displayHours())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_hour' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleHoursKeydown($event)\"\n (change)=\"handleHoursInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_hour'\n | translate: { time: prevHourTarget() }\n \"\n (click)=\"decrementHours()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Minutos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_minute'\n | translate: { time: nextMinuteTarget() }\n \"\n (click)=\"incrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(minutes())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_minute' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleMinutesKeydown($event)\"\n (change)=\"handleMinutesInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_minute'\n | translate: { time: prevMinuteTarget() }\n \"\n (click)=\"decrementMinutes()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n\n @if (showSeconds()) {\n <span\n class=\"text-xl font-bold text-grayscale-60\"\n aria-hidden=\"true\"\n >:</span\n >\n\n <!-- Segundos -->\n <div class=\"flex flex-col items-center gap-1\">\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_increment_second'\n | translate: { time: nextSecondTarget() }\n \"\n (click)=\"incrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-up text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <input\n type=\"text\"\n inputmode=\"numeric\"\n [attr.maxlength]=\"timeInputMaxLength\"\n class=\"h-9 w-12 rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-center text-base font-medium text-grayscale-90 outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-[var(--s-focus-ring-color,#0090ff)]\"\n [value]=\"padTime(seconds())\"\n [attr.aria-label]=\"'platform.angular_components.datepicker_second' | translate\"\n aria-live=\"polite\"\n pattern=\"[0-9]+\"\n (keydown)=\"handleSecondsKeydown($event)\"\n (change)=\"handleSecondsInput($event)\"\n />\n <button\n type=\"button\"\n class=\"flex h-6 w-6 items-center justify-center rounded-small text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_decrement_second'\n | translate: { time: prevSecondTarget() }\n \"\n (click)=\"decrementSeconds()\"\n >\n <i\n class=\"fas fa-chevron-down text-xs\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n @if (is12HourFormat()) {\n <!-- Seletor AM/PM -->\n <button\n type=\"button\"\n class=\"flex h-9 w-12 items-center justify-center rounded-small border border-solid border-grayscale-30 bg-grayscale-5 text-base font-medium text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n [attr.aria-label]=\"\n 'platform.angular_components.datepicker_toggle_meridiem'\n | translate: { meridiem: nextMeridiemTarget() }\n \"\n aria-live=\"polite\"\n (click)=\"toggleAmPm()\"\n >\n {{ amPm() }}\n </button>\n }\n </div>\n }\n\n <!-- Rodap\u00E9 de a\u00E7\u00F5es -->\n @if (showButtonBar() || mode() === 'datetime' || mode() === 'time') {\n <div class=\"flex items-center justify-between border-t border-solid border-grayscale-30 px-3 py-2\">\n @if (showButtonBar()) {\n <div>\n @if (mode() === 'date' || mode() === 'datetime' || mode() === 'range') {\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"selectToday()\"\n >\n {{ 'platform.angular_components.datepicker_today' | translate }}\n </button>\n }\n </div>\n\n <div class=\"flex gap-2\">\n <button\n type=\"button\"\n class=\"rounded-small px-2 py-1 text-sm text-grayscale-90 transition-colors hover:bg-grayscale-10\"\n (click)=\"clearValue($event)\"\n >\n {{ 'platform.angular_components.datepicker_clear' | translate }}\n </button>\n\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n } @else {\n <div></div>\n <div>\n @if (mode() === 'datetime' || mode() === 'time') {\n <button\n type=\"button\"\n class=\"rounded-small bg-primary px-3 py-1 text-sm font-medium text-grayscale-0 transition-colors hover:opacity-90\"\n (click)=\"confirm()\"\n >\n {{ 'platform.angular_components.datepicker_confirm' | translate }}\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n</ng-template>\n\n", styles: [":host{display:block;position:relative;width:100%}:host.ng-invalid.ng-dirty input{border-color:#c13018}:host.ng-invalid.ng-dirty input:focus{border-color:#c13018;outline-color:#c13018}:host.ng-invalid.ng-dirty button[type=button]{border-color:#c13018}:host.no-icon button[type=button]{display:none}:host.no-icon input{padding-right:.75rem}button[type=button]:focus-visible{outline:2px solid #428bca;outline-offset:1px;border-radius:inherit}\n"] }]
|
|
1474
1841
|
}], ctorParameters: () => [], propDecorators: { handleHoursKeydown: [], handleMinutesKeydown: [], handleSecondsKeydown: [] } });
|
|
1475
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNILGVBQWUsRUFDZixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixVQUFVLEVBQ1YsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsS0FBSyxFQUVMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFHSCxXQUFXLEVBQ1gsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsbUJBQW1CLEVBR25CLFVBQVUsR0FDYixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQXVCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0s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ZDt3QkFDRDs0QkFDSSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxxQkFBcUI7NEJBQ2hDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKO3dEQTJ5Q1Msa0JBQWtCLE1BV2xCLG9CQUFvQixNQVdwQixvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtUcmFwRm9jdXMgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBDZGtDb25uZWN0ZWRPdmVybGF5LCBDZGtPdmVybGF5T3JpZ2luLCBDb25uZWN0ZWRQb3NpdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBhZnRlck5leHRSZW5kZXIsXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBpbmplY3QsXG4gICAgSW5qZWN0b3IsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25Jbml0LFxuICAgIG91dHB1dCxcbiAgICBzaWduYWwsXG4gICAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIE5HX1ZBTElEQVRPUlMsXG4gICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgTmdDb250cm9sLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgVmFsaWRhdGlvbkVycm9ycyxcbiAgICBWYWxpZGF0b3IsXG4gICAgVmFsaWRhdG9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBEYXRlU2VnbWVudEVuZ2luZSwgU2VnbWVudEVuZ2luZUNvbmZpZyB9IGZyb20gJy4vZGF0ZS1zZWdtZW50LWlucHV0JztcbmltcG9ydCB7IGZvcm1hdFZhbHVlRm9ySW5wdXQsIGlzU2FtZURheSwgcGFyc2VJbnB1dCwgc3RyaXBUaW1lIH0gZnJvbSAnLi9kYXRlLnV0aWxzJztcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJEYXksIERhdGVQaWNrZXJNb2RlLCBEYXRlUmFuZ2UgfSBmcm9tICcuL21vZGVscyc7XG5cbnR5cGUgRGF0ZXBpY2tlclZhbHVlID0gRGF0ZSB8IERhdGVSYW5nZSB8IERhdGVbXSB8IG51bGw7XG50eXBlIFBpY2tlclZpZXcgPSAnY2FsZW5kYXInIHwgJ21vbnRocycgfCAneWVhcnMnO1xuXG5mdW5jdGlvbiBudW1lcmljS2V5c09ubHkoKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgICByZXR1cm4gKF90YXJnZXQsIF9rZXksIGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbDogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkID0gZGVzY3JpcHRvci52YWx1ZTtcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICh0aGlzOiB1bmtub3duLCBldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZEtleSA9XG4gICAgICAgICAgICAgICAgWydBcnJvd1VwJywgJ0Fycm93RG93bicsICdCYWNrc3BhY2UnLCAnRGVsZXRlJywgJ1RhYiddLmluY2x1ZGVzKGV2ZW50LmtleSkgfHwgL15cXGQkLy50ZXN0KGV2ZW50LmtleSk7XG4gICAgICAgICAgICBpZiAoIWlzVmFsaWRLZXkpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbC5jYWxsKHRoaXMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfTtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLWRhdGVwaWNrZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIENka1RyYXBGb2N1cyxcbiAgICAgICAgQ2RrT3ZlcmxheU9yaWdpbixcbiAgICAgICAgQ2RrQ29ubmVjdGVkT3ZlcmxheSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVzOiBbXG4gICAgICAgIGBcbiAgICAgICAgICAgIDpob3N0IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uZy1pbnZhbGlkLm5nLWRpcnR5IGlucHV0IHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICNjMTMwMTg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uZy1pbnZhbGlkLm5nLWRpcnR5IGlucHV0OmZvY3VzIHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICNjMTMwMTg7XG4gICAgICAgICAgICAgICAgb3V0bGluZS1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5nLWludmFsaWQubmctZGlydHkgYnV0dG9uW3R5cGU9J2J1dHRvbiddIHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6ICNjMTMwMTg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6aG9zdC5uby1pY29uIGJ1dHRvblt0eXBlPSdidXR0b24nXSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5vLWljb24gaW5wdXQge1xuICAgICAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDAuNzVyZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidXR0b25bdHlwZT0nYnV0dG9uJ106Zm9jdXMtdmlzaWJsZSB7XG4gICAgICAgICAgICAgICAgb3V0bGluZTogMnB4IHNvbGlkICM0MjhiY2E7XG4gICAgICAgICAgICAgICAgb3V0bGluZS1vZmZzZXQ6IDFweDtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0O1xuICAgICAgICAgICAgfVxuICAgICAgICBgLFxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLm5vLWljb25dJzogJyFzaG93SWNvbigpJyxcbiAgICB9LFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBEYXRlcGlja2VyQ29tcG9uZW50LFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogRGF0ZXBpY2tlckNvbXBvbmVudCxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIERhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBPbkluaXQge1xuICAgIHByaXZhdGUgc3RhdGljIGlkQ291bnRlciA9IDA7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREFZU19JTl9XRUVLID0gNztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT05USFNfSU5fWUVBUiA9IDEyO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1PTlRIU19QRVJfUk9XID0gMztcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBZRUFSU19QRVJfR1JJRCA9IDEyO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFlFQVJTX1BFUl9ST1cgPSAzO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTUlOVVRFX1NURVAgPSA1O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9IT1VSUyA9IDI0O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9NSU5VVEVTID0gNjA7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSE9VUlNfUEVSX01FUklESUVNID0gMTI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRE9VQkxFX0NMSUNLX1RIUkVTSE9MRF9NUyA9IDQwMDtcblxuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCgpOiBzdHJpbmcge1xuICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmlkQ291bnRlcisrO1xuICAgICAgICByZXR1cm4gYHMtZGF0ZXBpY2tlci0ke0RhdGVwaWNrZXJDb21wb25lbnQuaWRDb3VudGVyfWA7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIElucHV0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIC8qKiBIVE1MIGBpZGAgYXBsaWNhZG8gYW8gZWxlbWVudG8gYDxpbnB1dD5gLiBBdXRvLWdlcmFkbyBxdWFuZG8gb21pdGlkby4gKi9cbiAgICByZWFkb25seSBpbnB1dElkID0gaW5wdXQ8c3RyaW5nPihEYXRlcGlja2VyQ29tcG9uZW50Lm5leHRJZCgpKTtcblxuICAgIC8qKiBBdHJpYnV0byBgbmFtZWAgZG8gYDxpbnB1dD5gIG5hdGl2by4gKi9cbiAgICByZWFkb25seSBuYW1lID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gICAgLyoqIFRleHRvIGV4aWJpZG8gcXVhbmRvIG5lbmh1bSB2YWxvciBlc3TDoSBzZWxlY2lvbmFkby4gKi9cbiAgICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIE1vZG8gZGUgc2VsZcOnw6NvIGRvIGNvbXBvbmVudGUuXG4gICAgICogLSBgJ2RhdGUnYCDigJQgc2VsZcOnw6NvIGRlIGRhdGEgw7puaWNhIChwYWRyw6NvKVxuICAgICAqIC0gYCdtb250aCdgIOKAlCBzZWxlw6fDo28gZGUgbcOqcy9hbm9cbiAgICAgKiAtIGAnZGF0ZXRpbWUnYCDigJQgZGF0YSBjb20gaG9yYSAocmVxdWVyIGNvbmZpcm1hw6fDo28pXG4gICAgICogLSBgJ3RpbWUnYCDigJQgYXBlbmFzIHNlbGXDp8OjbyBkZSBob3JhXG4gICAgICogLSBgJ3JhbmdlJ2Ag4oCUIGludGVydmFsbyBlbnRyZSBkdWFzIGRhdGFzXG4gICAgICovXG4gICAgcmVhZG9ubHkgbW9kZSA9IGlucHV0PERhdGVQaWNrZXJNb2RlPignZGF0ZScpO1xuXG4gICAgLyoqXG4gICAgICogTW9kbyBkZSBzZWxlw6fDo28gcXVhbmRvIGBtb2RlYCDDqSBgJ2RhdGUnYC5cbiAgICAgKiAtIGAnc2luZ2xlJ2Ag4oCUIHNlbGXDp8OjbyBkZSB1bWEgw7puaWNhIGRhdGEgKHBhZHLDo28pXG4gICAgICogLSBgJ211bHRpcGxlJ2Ag4oCUIHNlbGXDp8OjbyBkZSBtw7psdGlwbGFzIGRhdGFzIGF2dWxzYXNcbiAgICAgKi9cbiAgICByZWFkb25seSBzZWxlY3Rpb25Nb2RlID0gaW5wdXQ8J3NpbmdsZScgfCAnbXVsdGlwbGUnPignc2luZ2xlJyk7XG5cbiAgICAvKiogU2VwYXJhZG9yIGV4aWJpZG8gZW50cmUgYXMgZGF0YXMgbm8gbW9kbyBgc2VsZWN0aW9uTW9kZSA9ICdtdWx0aXBsZSdgLiAqL1xuICAgIHJlYWRvbmx5IG11bHRpcGxlU2VwYXJhdG9yID0gaW5wdXQ8c3RyaW5nPignLCAnKTtcblxuICAgIC8qKiBRdWFuZG8gYHRydWVgLCBleGliZSBvIGJvdMOjbyBkZSDDrWNvbmUgYW8gbGFkbyBkbyBjYW1wby4gKi9cbiAgICByZWFkb25seSBzaG93SWNvbiA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogQ2xhc3NlIGRvIMOtY29uZSBleGliaWRvIG5vIGJvdMOjbyBkbyBjYW1wby5cbiAgICAgKiBRdWFuZG8gYG1vZGVgIMOpIGAndGltZSdgLCBvIHBhZHLDo28gbXVkYSBhdXRvbWF0aWNhbWVudGUgcGFyYSBgJ2ZhcyBmYS1jbG9jaydgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGljb24gPSBpbnB1dDxzdHJpbmc+KCdmYXMgZmEtY2FsZW5kYXInKTtcblxuICAgIC8qKiBEYXRhIG3DrW5pbWEgc2VsZWNpb27DoXZlbC4gRGlhcy9tZXNlcyBhbnRlcmlvcmVzIGZpY2FtIGRlc2FiaWxpdGFkb3MuICovXG4gICAgcmVhZG9ubHkgbWluID0gaW5wdXQ8RGF0ZSB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqIERhdGEgbcOheGltYSBzZWxlY2lvbsOhdmVsLiBEaWFzL21lc2VzIHBvc3RlcmlvcmVzIGZpY2FtIGRlc2FiaWxpdGFkb3MuICovXG4gICAgcmVhZG9ubHkgbWF4ID0gaW5wdXQ8RGF0ZSB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqIERhdGEgZXhpYmlkYSBhbyBhYnJpciBvIGNhbGVuZMOhcmlvIHF1YW5kbyBuZW5odW1hIGRhdGEgZXN0w6Egc2VsZWNpb25hZGEuICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdERhdGUgPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRvIGRlIGV4aWJpw6fDo28gZGEgZGF0YSBubyBjYW1wby4gUXVhbmRvIG9taXRpZG8sIMOpIHJlc29sdmlkbyBhIHBhcnRpciBkb1xuICAgICAqIGxvY2FsZSBhdGl2byAoY2hhdmUgYHBsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlX2Zvcm1hdGApLCBjb20gZmFsbGJhY2sgcGFyYSBgZGQvTU0veXl5eWAuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGF0ZUZvcm1hdCA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8qKlxuICAgICAqIEZvcm1hdG8gZGUgZXhpYmnDp8OjbyBkYXMgaG9yYXM6IGAnMTInYCBvdSBgJzI0J2AuIFF1YW5kbyBvbWl0aWRvLCDDqSByZXNvbHZpZG8gYSBwYXJ0aXJcbiAgICAgKiBkbyBsb2NhbGUgYXRpdm8gKGNoYXZlIGBwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuaG91cl9mb3JtYXRgKSwgY29tIGZhbGxiYWNrIHBhcmEgYCcyNCdgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGhvdXJGb3JtYXQgPSBpbnB1dDwnMTInIHwgJzI0JyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIC8qKiBJbmNyZW1lbnRvIGVtIG1pbnV0b3MgYW8gdXNhciBhcyBzZXRhcyBkbyB0aW1lIHBpY2tlci4gKi9cbiAgICByZWFkb25seSBtaW51dGVTdGVwID0gaW5wdXQ8bnVtYmVyPihEYXRlcGlja2VyQ29tcG9uZW50LkRFRkFVTFRfTUlOVVRFX1NURVApO1xuXG4gICAgLyoqIFF1YW5kbyBgdHJ1ZWAsIGV4aWJlIG8gY2FtcG8gZGUgc2VndW5kb3Mgbm8gdGltZSBwaWNrZXIuICovXG4gICAgcmVhZG9ubHkgc2hvd1NlY29uZHMgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogU2VwYXJhZG9yIGV4aWJpZG8gZW50cmUgYXMgZGF0YXMgbm8gbW9kbyBgJ3JhbmdlJ2AuICovXG4gICAgcmVhZG9ubHkgcmFuZ2VTZXBhcmF0b3IgPSBpbnB1dDxzdHJpbmc+KCcg4oCUICcpO1xuXG4gICAgLyoqIEFicmUgbyBwYWluZWwgYW8gZm9jYXIgbyBpbnB1dDsgZm9jbyBwZXJtYW5lY2Ugbm8gaW5wdXQsIG7Do28gcHVsYSBwYXJhIG8gZHJvcGRvd24uICovXG4gICAgcmVhZG9ubHkgc2hvd09uRm9jdXMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKiBJbXBlZGUgZGlnaXRhw6fDo28gbWFudWFsOyB2YWxvciBzw7MgcG9kZSBzZXIgc2VsZWNpb25hZG8gcGVsbyBjYWxlbmTDoXJpby4gKi9cbiAgICByZWFkb25seSByZWFkb25seUlucHV0ID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqIFByaW1laXJvIGRpYSBkYSBzZW1hbmEgKDAgPSBkb21pbmdvLCAxID0gc2VndW5kYS1mZWlyYSwgLi4uLCA2ID0gc8OhYmFkbykuICovXG4gICAgcmVhZG9ubHkgZmlyc3REYXlPZldlZWsgPSBpbnB1dDxudW1iZXI+KDApO1xuXG4gICAgLyoqIEV4aWJlL29jdWx0YSBhIGJhcnJhIGRlIGJvdMO1ZXMgSG9qZSBlIExpbXBhciBubyByb2RhcMOpLiAqL1xuICAgIHJlYWRvbmx5IHNob3dCdXR0b25CYXIgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICAgIC8qKiBFeGliZSDDrWNvbmUgZGUgbGltcGFyIGlubGluZSBubyBjYW1wbyBkZSBpbnB1dC4gKi9cbiAgICByZWFkb25seSBzaG93Q2xlYXIgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogRXhpYmUgZGlhcyBkZSBtZXNlcyBhZGphY2VudGVzIG5hIGdyYWRlIGRvIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IHNob3dPdGhlck1vbnRocyA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgLyoqIFBlcm1pdGUgc2VsZWNpb25hciBkaWFzIGRlIG1lc2VzIGFkamFjZW50ZXMgbmEgZ3JhZGUgZG8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgc2VsZWN0T3RoZXJNb250aHMgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogRmVjaGEgbyBwYWluZWwgYXDDs3Mgc2VsZWNpb25hciB1bWEgZGF0YSBubyBtb2RvIGBkYXRldGltZWAuICovXG4gICAgcmVhZG9ubHkgaGlkZU9uRGF0ZVRpbWVTZWxlY3QgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogSW5jcmVtZW50byBkZSBob3JhcyBubyB0aW1lIHBpY2tlci4gKi9cbiAgICByZWFkb25seSBzdGVwSG91ciA9IGlucHV0PG51bWJlcj4oMSk7XG5cbiAgICAvKiogSW5jcmVtZW50byBkZSBzZWd1bmRvcyBubyB0aW1lIHBpY2tlci4gKi9cbiAgICByZWFkb25seSBzdGVwU2Vjb25kID0gaW5wdXQ8bnVtYmVyPigxKTtcblxuICAgIC8qKiDDjW5kaWNlIGRlIHRhYiBkbyBjYW1wbyBkZSBpbnB1dC4gKi9cbiAgICByZWFkb25seSB0YWJpbmRleCA9IGlucHV0PG51bWJlcj4oKTtcblxuICAgIC8qKiBGb2NhIGF1dG9tYXRpY2FtZW50ZSBvIGNhbXBvIGFvIGNhcnJlZ2FyIG8gY29tcG9uZW50ZS4gKi9cbiAgICByZWFkb25seSBhdXRvZm9jdXMgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogRGF0YXMgZXNwZWPDrWZpY2FzIGRlc2FiaWxpdGFkYXMgbm8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZWREYXRlcyA9IGlucHV0PERhdGVbXT4oW10pO1xuXG4gICAgLyoqIERpYXMgZGEgc2VtYW5hIGRlc2FiaWxpdGFkb3MgKDAgPSBkb21pbmdvLCAuLi4sIDYgPSBzw6FiYWRvKS4gKi9cbiAgICByZWFkb25seSBkaXNhYmxlZERheXMgPSBpbnB1dDxudW1iZXJbXT4oW10pO1xuXG4gICAgLy8g4pSA4pSAIFR3by13YXkgbW9kZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgLyoqIEVzdGFkbyBkZXNhYmlsaXRhZG8gZG8gY29tcG9uZW50ZS4gKi9cbiAgICByZWFkb25seSBkaXNhYmxlZCA9IG1vZGVsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8vIOKUgOKUgCBPdXRwdXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gY2FtcG8gcGVyZGUgbyBmb2NvLiAqL1xuICAgIHJlYWRvbmx5IGJsdXJyZWQgPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBjYW1wbyByZWNlYmUgbyBmb2NvLiAqL1xuICAgIHJlYWRvbmx5IGZvY3VzZWQgPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBzZWxlY2lvbmFyIHVtYSBkYXRhLCBtw6pzLCBob3LDoXJpbyBvdSBpbnRlcnZhbG8uICovXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWQgPSBvdXRwdXQ8RGF0ZXBpY2tlclZhbHVlPigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gcGFpbmVsIGRvIGNhbGVuZMOhcmlvIGZlY2hhLiBFbWl0ZSBvIGVsZW1lbnRvIGRvIHBhaW5lbC4gKi9cbiAgICByZWFkb25seSBjbG9zZWQgPSBvdXRwdXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBhbyBjbGljYXIgbm8gYm90w6NvIFwiSG9qZVwiLiAqL1xuICAgIHJlYWRvbmx5IHRvZGF5Q2xpY2sgPSBvdXRwdXQ8RGF0ZT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIGFvIGNsaWNhciBubyBib3TDo28gXCJMaW1wYXJcIiBvdSBubyDDrWNvbmUgZGUgbGltcGFyIGlubGluZS4gKi9cbiAgICByZWFkb25seSBjbGVhckNsaWNrID0gb3V0cHV0PE1vdXNlRXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBtw6pzIHZpc3VhbGl6YWRvIG11ZGEuICovXG4gICAgcmVhZG9ubHkgbW9udGhDaGFuZ2UgPSBvdXRwdXQ8eyBtb250aDogbnVtYmVyOyB5ZWFyOiBudW1iZXIgfT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIGFubyB2aXN1YWxpemFkbyBtdWRhLiAqL1xuICAgIHJlYWRvbmx5IHllYXJDaGFuZ2UgPSBvdXRwdXQ8eyBtb250aDogbnVtYmVyOyB5ZWFyOiBudW1iZXIgfT4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIHBhaW5lbCBkbyBjYWxlbmTDoXJpbyBhYnJlLiAqL1xuICAgIHJlYWRvbmx5IHNob3cgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIHVzdcOhcmlvIGRpZ2l0YSBtYW51YWxtZW50ZSBubyBjYW1wby4gKi9cbiAgICByZWFkb25seSB2YWx1ZUlucHV0ID0gb3V0cHV0PEV2ZW50PigpO1xuXG4gICAgLy8g4pSA4pSAIEludGVybmFsIHN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1heEhvdXJzID0gRGF0ZXBpY2tlckNvbXBvbmVudC5NQVhfSE9VUlM7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1heE1pbnV0ZXMgPSBEYXRlcGlja2VyQ29tcG9uZW50Lk1BWF9NSU5VVEVTO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB0aW1lSW5wdXRNYXhMZW5ndGggPSAyO1xuXG4gICAgcHJvdGVjdGVkIGlucHV0RGF0ZSA9ICcnO1xuXG4gICAgcHJvdGVjdGVkIG5nQ29udHJvbDogTmdDb250cm9sIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmFsdWUgPSBzaWduYWw8RGF0ZSB8IG51bGw+KG51bGwpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc09wZW4gPSBzaWduYWwoZmFsc2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc0ZvY3VzZWQgPSBzaWduYWwoZmFsc2UpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSB2aWV3RGF0ZSA9IHNpZ25hbChuZXcgRGF0ZSgpKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGlja2VyVmlldyA9IHNpZ25hbDxQaWNrZXJWaWV3PignY2FsZW5kYXInKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG91cnMgPSBzaWduYWwoMCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1pbnV0ZXMgPSBzaWduYWwoMCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlY29uZHMgPSBzaWduYWwoMCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJhbmdlVmFsdWUgPSBzaWduYWw8RGF0ZVJhbmdlIHwgbnVsbD4obnVsbCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG11bHRpcGxlVmFsdWVzID0gc2lnbmFsPERhdGVbXT4oW10pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwZW5kaW5nUmFuZ2VTdGFydCA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhvdmVyRGF0ZSA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gICAgcHJpdmF0ZSBfaGFzRm9ybWF0RXJyb3IgPSBmYWxzZTtcbiAgICBwcml2YXRlIG9uVmFsaWRhdG9yQ2hhbmdlOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHBvcHVwUGFuZWwgPSB2aWV3Q2hpbGQoJ3BvcHVwUGFuZWwnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmNyZWFzZUhvdXJCdXR0b24gPSB2aWV3Q2hpbGQoJ2luY3JlYXNlSG91ckJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGljb25CdXR0b24gPSB2aWV3Q2hpbGQoJ2ljb25CdXR0b24nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmlnZ2VySW5wdXQgPSB2aWV3Q2hpbGQucmVxdWlyZWQoJ3RyaWdnZXJJbnB1dCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3RFbGVtZW50ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRMYW5nID0gc2lnbmFsKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyk7XG5cbiAgICAvKiogUmVmbGV0ZSBgKHBvaW50ZXI6IGNvYXJzZSlgIOKAlCBkaXNwb3NpdGl2b3MgdG91Y2ggcHJlZmVyZW0gbyBwb3B1cCBkbyBjYWxlbmTDoXJpbyBhbyB0ZWNsYWRvLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1RvdWNoRGV2aWNlID0gc2lnbmFsKFxuICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gd2luZG93Lm1hdGNoTWVkaWEoJyhwb2ludGVyOiBjb2Fyc2UpJykubWF0Y2hlc1xuICAgICAgICAgICAgOiBmYWxzZSxcbiAgICApO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZWdtZW50RW5naW5lID0gbmV3IERhdGVTZWdtZW50RW5naW5lKCk7XG4gICAgcHJpdmF0ZSBsYXN0U2VnbWVudENvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgbWVhc3VyZUNhbnZhcz86IEhUTUxDYW52YXNFbGVtZW50O1xuICAgIC8qKiBJbmNyZW1lbnRhZG8gYSBjYWRhIG11dGHDp8OjbyBkbyB1c3XDoXJpbyDigJQgaW52YWxpZGEgY2FsbGJhY2tzIGRlIGNsaXF1ZS9mb2NvIGFkaWFkb3MgcXVlIGZpY2FyYW0gb2Jzb2xldG9zLiAqL1xuICAgIHByaXZhdGUgaW50ZXJhY3Rpb25HZW5lcmF0aW9uID0gMDtcbiAgICAvKiogYHRpbWVTdGFtcGAgZG8gw7psdGltbyBtb3VzZWRvd24gbm8gaW5wdXQgc2VnbWVudGFkbyDigJQgdXNhZG8gcHJhIGRldGVjdGFyIGR1cGxvIGNsaXF1ZSBuYSBtw6NvLiAqL1xuICAgIHByaXZhdGUgbGFzdE1vdXNlRG93bkF0ID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uub25MYW5nQ2hhbmdlLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmcuc2V0KGV2ZW50LmxhbmcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5tYXRjaE1lZGlhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBtZWRpYVF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwb2ludGVyOiBjb2Fyc2UpJyk7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVQb2ludGVyQ2hhbmdlID0gKGV2ZW50OiBNZWRpYVF1ZXJ5TGlzdEV2ZW50KTogdm9pZCA9PiB0aGlzLmlzVG91Y2hEZXZpY2Uuc2V0KGV2ZW50Lm1hdGNoZXMpO1xuICAgICAgICAgICAgbWVkaWFRdWVyeS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVQb2ludGVyQ2hhbmdlKTtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gbWVkaWFRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVQb2ludGVyQ2hhbmdlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIAgQ29tcHV0ZWQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRJY29uID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMubW9kZSgpID09PSAndGltZScgPyAnZmFzIGZhLWNsb2NrJyA6IHRoaXMuaWNvbigpKSk7XG5cbiAgICAvKiogYGRhdGVGb3JtYXRgIGV4cGzDrWNpdG8gb3UgcmVzb2x2aWRvIGEgcGFydGlyIGRvIGxvY2FsZSBhdGl2byAoZmFsbGJhY2sgYGRkL01NL3l5eXlgKS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWREYXRlRm9ybWF0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRMYW5nKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmRhdGVGb3JtYXQoKSA/P1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVHJhbnNsYXRlZE9yRGVmYXVsdCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVfZm9ybWF0JywgJ2RkL01NL3l5eXknKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgLyoqIGBob3VyRm9ybWF0YCBleHBsw61jaXRvIG91IHJlc29sdmlkbyBhIHBhcnRpciBkbyBsb2NhbGUgYXRpdm8gKGZhbGxiYWNrIGAnMjQnYCkuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVkSG91ckZvcm1hdCA9IGNvbXB1dGVkPCcxMicgfCAnMjQnPigoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudExhbmcoKTtcbiAgICAgICAgY29uc3QgZXhwbGljaXQgPSB0aGlzLmhvdXJGb3JtYXQoKTtcbiAgICAgICAgaWYgKGV4cGxpY2l0KSByZXR1cm4gZXhwbGljaXQ7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnJlc29sdmVUcmFuc2xhdGVkT3JEZWZhdWx0KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuaG91cl9mb3JtYXQnLCAnMjQnKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQgPT09ICcxMicgPyAnMTInIDogJzI0JztcbiAgICB9KTtcblxuICAgIC8qKiBNb2RvcyBjdWpvIGZvcm1hdG8gZGUgZXhpYmnDp8OjbyDDqSByZXNvbHZpZG8gcGVsYSBlbmdpbmUgZGUgc2VnbWVudG9zIChpbmRlcGVuZGVudGUgZGUgdG91Y2gvcmVhZG9ubHkpLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1NlZ21lbnRNb2RlQ2FuZGlkYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgcmV0dXJuIG1vZGUgPT09ICdkYXRlJyB8fCBtb2RlID09PSAnbW9udGgnIHx8IG1vZGUgPT09ICd0aW1lJyB8fCBtb2RlID09PSAnZGF0ZXRpbWUnO1xuICAgIH0pO1xuXG4gICAgLyoqIEludGVyYXRpdmlkYWRlIGRlIGRpZ2l0YcOnw6NvIHBvciBzZWdtZW50byDigJQgZGVzbGlnYWRhIGVtIHRvdWNoIG91IHF1YW5kbyBgcmVhZG9ubHlJbnB1dGAgw6kgdXNhZG8uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzU2VnbWVudGVkTW9kZSA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PiB0aGlzLmlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSAmJiAhdGhpcy5pc1RvdWNoRGV2aWNlKCkgJiYgIXRoaXMucmVhZG9ubHlJbnB1dCgpLFxuICAgICk7XG5cbiAgICAvKiogSW5kaWNhIHNlIG8gdGltZSBwaWNrZXIgZGV2ZSB1c2FyIG8gZm9ybWF0byBkZSAxMiBob3JhcyBjb20gc2VsZXRvciBBTS9QTS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXMxMkhvdXJGb3JtYXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlc29sdmVkSG91ckZvcm1hdCgpID09PSAnMTInKTtcblxuICAgIC8qKiBIb3JhIGV4aWJpZGEgbm8gdGltZSBwaWNrZXI6IDHigJMxMiBubyBmb3JtYXRvIDEyaCwgMOKAkzIzIG5vIGZvcm1hdG8gMjRoLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwbGF5SG91cnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pczEySG91ckZvcm1hdCgpKSByZXR1cm4gdGhpcy5ob3VycygpO1xuICAgICAgICBjb25zdCBoMTIgPSB0aGlzLmhvdXJzKCkgJSBEYXRlcGlja2VyQ29tcG9uZW50LkhPVVJTX1BFUl9NRVJJRElFTTtcbiAgICAgICAgcmV0dXJuIGgxMiA9PT0gMCA/IERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNIDogaDEyO1xuICAgIH0pO1xuXG4gICAgLyoqIE1lcmlkaWFubyBhdHVhbCBkZXJpdmFkbyBkYSBob3JhIGludGVybmEgKDDigJMyMykuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFtUG0gPSBjb21wdXRlZDwnQU0nIHwgJ1BNJz4oKCkgPT5cbiAgICAgICAgdGhpcy5ob3VycygpIDwgRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU0gPyAnQU0nIDogJ1BNJyxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcbiAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJywgb2Zmc2V0WTogNCB9LFxuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nLCBvZmZzZXRZOiAtNCB9LFxuICAgIF07XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9wdXBJZCA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMuaW5wdXRJZCgpfS1wb3B1cGApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN1cnJlbnRNb250aEluZGV4ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy52aWV3RGF0ZSgpLmdldE1vbnRoKCkpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50WWVhciA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlld0RhdGUoKS5nZXRGdWxsWWVhcigpKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudE1vbnRoS2V5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb250aEtleXNbdGhpcy5jdXJyZW50TW9udGhJbmRleCgpXSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd0NhbGVuZGFyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb2RlKCkgIT09ICd0aW1lJyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dUaW1lUGlja2VyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb2RlKCkgPT09ICdkYXRldGltZScgfHwgdGhpcy5tb2RlKCkgPT09ICd0aW1lJyk7XG5cbiAgICAvKiogU2VsZcOnw6NvIG3Dumx0aXBsYSBhdGl2YTogYXBlbmFzIG5vIG1vZG8gYGRhdGVgIGNvbSBgc2VsZWN0aW9uTW9kZSA9ICdtdWx0aXBsZSdgLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc011bHRpcGxlTW9kZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0aW9uTW9kZSgpID09PSAnbXVsdGlwbGUnICYmIHRoaXMubW9kZSgpID09PSAnZGF0ZScpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9yZGVyZWRXZWVrRGF5S2V5cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmZpcnN0RGF5T2ZXZWVrKCk7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy53ZWVrRGF5S2V5cy5zbGljZShzdGFydCksIC4uLnRoaXMud2Vla0RheUtleXMuc2xpY2UoMCwgc3RhcnQpXTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBkaWFsb2dBcmlhTGFiZWxLZXkgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICB0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJ1xuICAgICAgICAgICAgPyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3JhbmdlJ1xuICAgICAgICAgICAgOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X2RhdGUnLFxuICAgICk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGxhY2Vob2xkZXJLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgcmV0dXJuIGBwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9wbGFjZWhvbGRlcl8ke21vZGV9YDtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBlZmZlY3RpdmVSYW5nZSA9IGNvbXB1dGVkKCgpOiB7IHN0YXJ0OiBEYXRlIHwgbnVsbDsgZW5kOiBEYXRlIHwgbnVsbCB9ID0+IHtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKTtcbiAgICAgICAgY29uc3QgaG92ZXIgPSB0aGlzLmhvdmVyRGF0ZSgpO1xuICAgICAgICBpZiAocGVuZGluZykge1xuICAgICAgICAgICAgaWYgKGhvdmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gcGVuZGluZy5nZXRUaW1lKCkgPD0gaG92ZXIuZ2V0VGltZSgpID8gW3BlbmRpbmcsIGhvdmVyXSA6IFtob3ZlciwgcGVuZGluZ107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IHBlbmRpbmcsIGVuZDogbnVsbCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJhbmdlVmFsdWUoKSA/PyB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBjYWxlbmRhcldlZWtzID0gY29tcHV0ZWQoKCk6IENhbGVuZGFyRGF5W11bXSA9PiB7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50TW9udGhJbmRleCgpO1xuICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuZWZmZWN0aXZlUmFuZ2UoKTtcbiAgICAgICAgY29uc3QgcmFuZ2VTdGFydFRpbWUgPSByYW5nZS5zdGFydCA/IHN0cmlwVGltZShyYW5nZS5zdGFydCkgOiBudWxsO1xuICAgICAgICBjb25zdCByYW5nZUVuZFRpbWUgPSByYW5nZS5lbmQgPyBzdHJpcFRpbWUocmFuZ2UuZW5kKSA6IG51bGw7XG5cbiAgICAgICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xuICAgICAgICBjb25zdCBzdGFydFdlZWtEYXkgPSBmaXJzdERheU9mTW9udGguZ2V0RGF5KCk7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkU3RhcnREYXkgPSAoc3RhcnRXZWVrRGF5IC0gdGhpcy5maXJzdERheU9mV2VlaygpICsgNykgJSA3O1xuICAgICAgICBjb25zdCBkYXlzSW5Nb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICAgICAgICBjb25zdCBkYXlzSW5QcmV2TW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMCkuZ2V0RGF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGFsbERheXM6IENhbGVuZGFyRGF5W10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gYWRqdXN0ZWRTdGFydERheSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXlzSW5QcmV2TW9udGggLSBpKTtcbiAgICAgICAgICAgIGFsbERheXMucHVzaCh0aGlzLmJ1aWxkQ2FsZW5kYXJEYXkoZGF0ZSwgZmFsc2UsIHRvZGF5LCBzZWxlY3RlZCwgcmFuZ2UsIHJhbmdlU3RhcnRUaW1lLCByYW5nZUVuZFRpbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGQgPSAxOyBkIDw9IGRheXNJbk1vbnRoOyBkKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZCk7XG4gICAgICAgICAgICBhbGxEYXlzLnB1c2godGhpcy5idWlsZENhbGVuZGFyRGF5KGRhdGUsIHRydWUsIHRvZGF5LCBzZWxlY3RlZCwgcmFuZ2UsIHJhbmdlU3RhcnRUaW1lLCByYW5nZUVuZFRpbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsQ2VsbHMgPVxuICAgICAgICAgICAgTWF0aC5jZWlsKGFsbERheXMubGVuZ3RoIC8gRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUspICogRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUs7XG4gICAgICAgIGxldCBuZXh0RGF5ID0gMTtcbiAgICAgICAgd2hpbGUgKGFsbERheXMubGVuZ3RoIDwgdG90YWxDZWxscykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgbmV4dERheSk7XG4gICAgICAgICAgICBuZXh0RGF5Kys7XG4gICAgICAgICAgICBhbGxEYXlzLnB1c2godGhpcy5idWlsZENhbGVuZGFyRGF5KGRhdGUsIGZhbHNlLCB0b2RheSwgc2VsZWN0ZWQsIHJhbmdlLCByYW5nZVN0YXJ0VGltZSwgcmFuZ2VFbmRUaW1lKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3ZWVrczogQ2FsZW5kYXJEYXlbXVtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsRGF5cy5sZW5ndGg7IGkgKz0gRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUspIHtcbiAgICAgICAgICAgIHdlZWtzLnB1c2goYWxsRGF5cy5zbGljZShpLCBpICsgRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUspKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2Vla3M7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9udGhzR3JpZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgcm93czogeyBrZXk6IHN0cmluZzsgaW5kZXg6IG51bWJlciB9W11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERhdGVwaWNrZXJDb21wb25lbnQuTU9OVEhTX0lOX1lFQVI7IGkgKz0gRGF0ZXBpY2tlckNvbXBvbmVudC5NT05USFNfUEVSX1JPVykge1xuICAgICAgICAgICAgcm93cy5wdXNoKFtcbiAgICAgICAgICAgICAgICB7IGtleTogdGhpcy5tb250aEtleXNbaV0sIGluZGV4OiBpIH0sXG4gICAgICAgICAgICAgICAgeyBrZXk6IHRoaXMubW9udGhLZXlzW2kgKyAxXSwgaW5kZXg6IGkgKyAxIH0sXG4gICAgICAgICAgICAgICAgeyBrZXk6IHRoaXMubW9udGhLZXlzW2kgKyAyXSwgaW5kZXg6IGkgKyAyIH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50RGVjYWRlU3RhcnQgPSBjb21wdXRlZCgoKSA9PiBNYXRoLmZsb29yKHRoaXMuY3VycmVudFllYXIoKSAvIDEwKSAqIDEwKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB5ZWFyc0dyaWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKTtcbiAgICAgICAgY29uc3Qgcm93czogbnVtYmVyW11bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX0dSSUQ7IGkgKz0gRGF0ZXBpY2tlckNvbXBvbmVudC5ZRUFSU19QRVJfUk9XKSB7XG4gICAgICAgICAgICByb3dzLnB1c2goW3N0YXJ0ICsgaSwgc3RhcnQgKyBpICsgMSwgc3RhcnQgKyBpICsgMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZEaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgaWYgKCFtaW4pIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSA8PSBtaW4uZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5nZXRGdWxsWWVhcigpIDw9IG1pbi5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB2aWV3LmdldEZ1bGxZZWFyKCkgPCBtaW4uZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgICAgICAgKHZpZXcuZ2V0RnVsbFllYXIoKSA9PT0gbWluLmdldEZ1bGxZZWFyKCkgJiYgdmlldy5nZXRNb250aCgpIDw9IG1pbi5nZXRNb250aCgpKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHREaXNhYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKCFtYXgpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSArIERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX0dSSUQgLSAxID49IG1heC5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgIHJldHVybiB2aWV3LmdldEZ1bGxZZWFyKCkgPj0gbWF4LmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHZpZXcuZ2V0RnVsbFllYXIoKSA+IG1heC5nZXRGdWxsWWVhcigpIHx8XG4gICAgICAgICAgICAodmlldy5nZXRGdWxsWWVhcigpID09PSBtYXguZ2V0RnVsbFllYXIoKSAmJiB2aWV3LmdldE1vbnRoKCkgPj0gbWF4LmdldE1vbnRoKCkpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyDilIDilIAgVHJhbnNsYXRpb24ga2V5cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB3ZWVrRGF5S2V5cyA9IFtcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9zdW4nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X21vbicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfdHVlJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV93ZWQnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X3RodScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfZnJpJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9zYXQnLFxuICAgIF07XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9udGhLZXlzID0gW1xuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfamFuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2ZlYicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9tYXInLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfYXByJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX21heScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9qdW4nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfanVsJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2F1ZycsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9zZXAnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfb2N0JyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX25vdicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9kZWMnLFxuICAgIF07XG5cbiAgICAvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm5nQ29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCwgbnVsbCwgeyBzZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmRlZmF1bHREYXRlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGQgJiYgIXRoaXMudmFsdWUoKSAmJiAhdGhpcy5yYW5nZVZhbHVlKCkgJiYgdGhpcy5tdWx0aXBsZVZhbHVlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnNldChkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKGQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBpbmplY3RvcjogdGhpcy5pbmplY3RvciB9LFxuICAgICAgICApO1xuICAgIH1cbiAgICAvLyDilIDilIAgQ29udHJvbFZhbHVlQWNjZXNzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKTogdm9pZCB7XG4gICAgICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZCA9IFsuLi52YWx1ZV0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChzb3J0ZWQpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkoc29ydGVkKTtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gc29ydGVkWzBdO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZmlyc3QuZ2V0RnVsbFllYXIoKSwgZmlyc3QuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZVJhbmdlKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhcnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2YWx1ZS5zdGFydC5nZXRGdWxsWWVhcigpLCB2YWx1ZS5zdGFydC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWx1ZS5zZXQodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGQgPSB2YWx1ZSBhcyBEYXRlO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IoZCk7XG4gICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KGQuZ2V0SG91cnMoKSk7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoZC5nZXRNaW51dGVzKCkpO1xuICAgICAgICB0aGlzLnNlY29uZHMuc2V0KGQuZ2V0U2Vjb25kcygpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkLnNldChpc0Rpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgVmFsaWRhdG9yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgbGV0IHZhbHVlOiBEYXRlcGlja2VyVmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5tdWx0aXBsZVZhbHVlcygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMucmFuZ2VWYWx1ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZVZhbGlkYXRpb25FcnJvcnModmFsdWUsIGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgUHVibGljIGFjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgb3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMucHJlcGFyZU9wZW5WaWV3KCk7XG4gICAgICAgIHRoaXMuc2hvdy5lbWl0KCk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoKCkgPT4gdGhpcy5pbmNyZWFzZUhvdXJCdXR0b24oKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpLCB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEFicmUgbyBwYWluZWwgc2VtIHRyYW5zZmVyaXIgbyBmb2NvIHBhcmEgbyBkcm9wZG93biAodXNhZG8gcGVsbyBzaG93T25Gb2N1cykuICovXG4gICAgcHJpdmF0ZSBvcGVuT25Gb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSB8fCB0aGlzLmlzT3BlbigpKSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlT3BlblZpZXcoKTtcbiAgICAgICAgdGhpcy5zaG93LmVtaXQoKTtcbiAgICAgICAgLy8gRm9jbyBwZXJtYW5lY2Ugbm8gaW5wdXQg4oCUIG7Do28gY2hhbWEgZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBhIHZpZXcgaW5pY2lhbCBkbyBwYWluZWwgZSBwb3NpY2lvbmEgbyBjYWxlbmTDoXJpbyBubyBgZGVmYXVsdERhdGVgXG4gICAgICogcXVhbmRvIG5lbmh1bSB2YWxvciBlc3TDoSBzZWxlY2lvbmFkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXBhcmVPcGVuVmlldygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdERhdGUgPSB0aGlzLmRlZmF1bHREYXRlKCk7XG4gICAgICAgIGlmIChkZWZhdWx0RGF0ZSAmJiAhdGhpcy52YWx1ZSgpICYmICF0aGlzLnJhbmdlVmFsdWUoKSkge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZGVmYXVsdERhdGUuZ2V0RnVsbFllYXIoKSwgZGVmYXVsdERhdGUuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgnbW9udGhzJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tb2RlKCkgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgneWVhcnMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ2NhbGVuZGFyJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk6IHZvaWQge1xuICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLnBvcHVwUGFuZWwoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoIXBhbmVsKSByZXR1cm47XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwic2VsZWN0ZWRcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZm9jdXM9XCJ0b2RheVwiXScpID8/XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdidXR0b246bm90KFtkaXNhYmxlZF0pJyk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xvc2VQYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFuZWwgPSAodGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgPz8gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50KSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuaG92ZXJEYXRlLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQocGFuZWwpO1xuXG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmljb25CdXR0b24oKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPIGJhY2tkcm9wIGRvIENESyBPdmVybGF5IGNvYnJlIGEgdGVsYSBpbnRlaXJhLCBpbmNsdWluZG8gbyBwcsOzcHJpbyB0cmlnZ2VyIOKAlCBjbGljYXIgbm9cbiAgICAgKiBpbnB1dCBvdSBub3MgYm90w7VlcyBkbyB0cmlnZ2VyIGVucXVhbnRvIG8gcGFpbmVsIGrDoSBlc3TDoSBhYmVydG8gdGFtYsOpbSBkaXNwYXJhXG4gICAgICogYGJhY2tkcm9wQ2xpY2tgIChvIHByw7NwcmlvIGA8aW5wdXQ+YCBudW5jYSByZWNlYmUgbyBgY2xpY2tgIG5lc3NlIGNhc28sIGVudMOjb1xuICAgICAqIGBoYW5kbGVJbnB1dENsaWNrYCBudW5jYSBkaXNwYXJhKS4gU2VtIGVzdGUgZmlsdHJvLCBjbGljYXIgbm8gaW5wdXQgcGFyYSB0cm9jYXIgZGVcbiAgICAgKiBzZWdtZW50byBmZWNoYXJpYSBvIHBhaW5lbCBlIHJvdWJhcmlhIG8gZm9jbyBwYXJhIG8gYm90w6NvIGRvIMOtY29uZSAodmlhIGBjbG9zZVBhbmVsYCkuXG4gICAgICogUXVhbmRvIG8gY2xpcXVlIGNhaXUgZXNwZWNpZmljYW1lbnRlIHNvYnJlIG8gYDxpbnB1dD5gLCByZWFwbGljYW1vcyBhIG1lc21hIGzDs2dpY2EgZGVcbiAgICAgKiByZXBvc2ljaW9uYW1lbnRvIGRlIHNlZ21lbnRvIHF1ZSBgaGFuZGxlSW5wdXRDbGlja2AgZmFyaWEsIGVtIHZleiBkZSBzw7MgaWdub3JhciBvIGNsaXF1ZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlQmFja2Ryb3BDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICAvLyBgZXZlbnQudGFyZ2V0YCBkZSB1bSBiYWNrZHJvcENsaWNrIGRvIENESyBPdmVybGF5IMOpIHNlbXByZSBvIHByw7NwcmlvIDxkaXY+IGRvXG4gICAgICAgIC8vIGJhY2tkcm9wLCBudW5jYSBvIGVsZW1lbnRvIHJlYWxtZW50ZSBjbGljYWRvIOKAlCBlbnTDo28gY2hlY2FyIGAuY29udGFpbnMoZXZlbnQudGFyZ2V0KWBcbiAgICAgICAgLy8gbnVuY2EgZnVuY2lvbmEuIEVtIHZleiBkaXNzbywgY29tcGFyYW1vcyBhIGNvb3JkZW5hZGEgcmVhbCBkbyBjbGlxdWUgKHF1ZSBvXG4gICAgICAgIC8vIE1vdXNlRXZlbnQgc2VtcHJlIGNhcnJlZ2EgY29ycmV0YW1lbnRlKSBjb250cmEgb3MgcmV0w6JuZ3Vsb3MgZG9zIGVsZW1lbnRvcyBkbyB0cmlnZ2VyLlxuICAgICAgICBjb25zdCBpbnB1dEVsID0gdGhpcy50cmlnZ2VySW5wdXQoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5wdXRFbCAmJiB0aGlzLmlzU2VnbWVudGVkTW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dFJlY3QgPSBpbnB1dEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgY2xpY2tlZE9uSW5wdXQgPVxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPj0gaW5wdXRSZWN0LmxlZnQgJiZcbiAgICAgICAgICAgICAgICBldmVudC5jbGllbnRYIDw9IGlucHV0UmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPj0gaW5wdXRSZWN0LnRvcCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPD0gaW5wdXRSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgIGlmIChjbGlja2VkT25JbnB1dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VnbWVudFBvaW50ZXJEb3duKGlucHV0RWwsIGV2ZW50LmNsaWVudFgsIGV2ZW50LnRpbWVTdGFtcCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IGNsaWNrZWRPblRyaWdnZXIgPVxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WCA+PSByZWN0LmxlZnQgJiZcbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPD0gcmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSA+PSByZWN0LnRvcCAmJlxuICAgICAgICAgICAgZXZlbnQuY2xpZW50WSA8PSByZWN0LmJvdHRvbTtcbiAgICAgICAgaWYgKGNsaWNrZWRPblRyaWdnZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4oKSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVPdmVybGF5S2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgfHwgIShldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJvdW5kIHRvIGBtb3VzZWRvd25gLCBuw6NvIGBjbGlja2AgKHZlamEgbyBjb21lbnTDoXJpbyBlbSBgYXBwbHlTZWdtZW50Q2xpY2tgKS4gT1xuICAgICAgICAvLyBjb21wb3J0YW1lbnRvIG5hdGl2byBwYWRyw6NvIGRvIGJyb3dzZXIgcHJhIG1vdXNlZG93biBudW0gYDxpbnB1dD5gIGRlIHRleHRvIMOpXG4gICAgICAgIC8vIHBvc2ljaW9uYXIgbyBjYXJldC9pbmljaWFyIHNlbGXDp8OjbyBkZSB0ZXh0byBuYSBjb29yZGVuYWRhIGRvIGNsaXF1ZSDigJQgaXNzbyByb2RhXG4gICAgICAgIC8vICpkZXBvaXMqIGRvcyBub3Nzb3MgbGlzdGVuZXJzIGUgc29icmVzY3JldmVyaWEgbyBgc2V0U2VsZWN0aW9uUmFuZ2VgIGRvIHNlZ21lbnRvXG4gICAgICAgIC8vIGFwbGljYWRvIGxvZ28gYWJhaXhvLiBgcHJldmVudERlZmF1bHQoKWAgZXZpdGEgZXNzYSBjb3JyaWRhLlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihldmVudC50YXJnZXQsIGV2ZW50LmNsaWVudFgsIGV2ZW50LnRpbWVTdGFtcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUG9udG8gZGUgZW50cmFkYSDDum5pY28gcHJvIGNsaXF1ZSBubyBpbnB1dCBzZWdtZW50YWRvIOKAlCBjaGFtYWRvIHRhbnRvIHBvclxuICAgICAqIGBoYW5kbGVJbnB1dENsaWNrYCAobW91c2Vkb3duIGRpcmV0byBubyBgPGlucHV0PmAsIG8gcHJpbWVpcm8gY2xpcXVlLCBhbnRlcyBkbyBiYWNrZHJvcFxuICAgICAqIGV4aXN0aXIpIHF1YW50byBwb3IgYGhhbmRsZUJhY2tkcm9wQ2xpY2tgIChjbGlxdWVzIHNlZ3VpbnRlcywgasOhIGNvbSBvIHBhaW5lbCBhYmVydG8gZSBvXG4gICAgICogYmFja2Ryb3AgY29icmluZG8gbyBpbnB1dCkuIFByZWNpc2Egc2VyIMO6bmljbyBwb3JxdWUgb3MgZG9pcyBjbGlxdWVzIGRlIHVtIGR1cGxvIGNsaXF1ZVxuICAgICAqIHJlYWwgY29zdHVtYW0gY2hlZ2FyIHBvciBjYW1pbmhvcyBESUZFUkVOVEVTIOKAlCBvIHByaW1laXJvIHZpYSBtb3VzZWRvd24gbm8gaW5wdXQsIG9cbiAgICAgKiBzZWd1bmRvIHZpYSBiYWNrZHJvcENsaWNrIOKAlCBlbnTDo28gcmFzdHJlYXIgbyB0aW1lc3RhbXAgZG8gXCLDumx0aW1vIGNsaXF1ZVwiIHNlcGFyYWRhbWVudGVcbiAgICAgKiBlbSBjYWRhIGhhbmRsZXIgbnVuY2EgZGV0ZWN0YXJpYSB1bSBkdXBsbyBjbGlxdWUgZGUgdmVyZGFkZS4gTmVtIGBkYmxjbGlja2AgbmVtXG4gICAgICogYGV2ZW50LmRldGFpbGAgc8OjbyBjb25macOhdmVpcyBhcXVpIChkZXBlbmRlbSBkYSBjb250YWdlbS90YXJnZXRpbmcgaW50ZXJuYSBkZSBjbGlxdWVzIGRvXG4gICAgICogYnJvd3NlciwgcXVlIG5vc3NhcyBtYW5pcHVsYcOnw7VlcyBkZSBmb2NvL3NlbGXDp8OjbyBwYXJlY2VtIGF0cmFwYWxoYXIg4oCUIG9ic2VydmFkb1xuICAgICAqIGVtcGlyaWNhbWVudGU6IGBldmVudC5kZXRhaWxgIGZpY2Egc2VtcHJlIDEpLCBkYcOtIGEgZGV0ZWPDp8OjbyBtYW51YWwgcG9yIHRpbWVzdGFtcC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihpbnB1dDogSFRNTElucHV0RWxlbWVudCwgY2xpZW50WDogbnVtYmVyLCB0aW1lU3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0RvdWJsZUNsaWNrID0gdGltZVN0YW1wIC0gdGhpcy5sYXN0TW91c2VEb3duQXQgPCBEYXRlcGlja2VyQ29tcG9uZW50LkRPVUJMRV9DTElDS19USFJFU0hPTERfTVM7XG4gICAgICAgIHRoaXMubGFzdE1vdXNlRG93bkF0ID0gdGltZVN0YW1wO1xuICAgICAgICBpZiAoaXNEb3VibGVDbGljaykge1xuICAgICAgICAgICAgdGhpcy5sYXN0TW91c2VEb3duQXQgPSAwOyAvLyBldml0YSBxdWUgdW0gdGVyY2Vpcm8gY2xpcXVlIGVuY2FkZWllIGVtIG91dHJvIFwiZHVwbG9cIlxuICAgICAgICAgICAgdGhpcy5zZWxlY3RXaG9sZUZpZWxkKGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGx5U2VnbWVudENsaWNrKGlucHV0LCBjbGllbnRYKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgbyBzZWdtZW50byBzb2IgYSBjb29yZGVuYWRhIGBjbGllbnRYYCBkZSB1bSBjbGlxdWUgbm8gaW5wdXQgc2VnbWVudGFkby5cbiAgICAgKiBDb21wYXJ0aWxoYWRvIHBvciBgaGFuZGxlSW5wdXRDbGlja2AgKG1vdXNlZG93biByZWFsIG5vIGA8aW5wdXQ+YCDigJQgdXNhbW9zIGBtb3VzZWRvd25gXG4gICAgICogZW0gdmV6IGRlIGBjbGlja2AgcG9ycXVlIG8gYGZvY3VzYC9gb3Blbk9uRm9jdXNgIGRpc3BhcmFkbyBubyBtZWlvIGRvIGdlc3RvIHBvZGUgbW9udGFyXG4gICAgICogbyBiYWNrZHJvcCBkbyBDREsgT3ZlcmxheSBlbWJhaXhvIGRvIGN1cnNvciBhbnRlcyBkbyBgbW91c2V1cGAsIGZhemVuZG8gbyBicm93c2VyIHJlc29sdmVyXG4gICAgICogbyBgY2xpY2tgIHBybyBhbmNlc3RyYWwgY29tdW0gZW50cmUgbyBhbHZvIGRvIG1vdXNlZG93biBlIG8gZG8gbW91c2V1cCDigJQgbmEgcHLDoXRpY2EsXG4gICAgICogYDxib2R5PmAg4oCUIGVtIHZleiBkbyBgPGlucHV0PmAgb3UgZG8gYmFja2Ryb3ApIGUgYGhhbmRsZUJhY2tkcm9wQ2xpY2tgIChjbGlxdWUgbm8gdHJpZ2dlclxuICAgICAqIGNvbSBvIHBhaW5lbCBqw6EgYWJlcnRvIGVtIHJlZ2ltZSBlc3TDoXZlbCwgaW50ZXJjZXB0YWRvIHBlbG8gYmFja2Ryb3AgZG8gQ0RLIE92ZXJsYXkpLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXBwbHlTZWdtZW50Q2xpY2soaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsIGNsaWVudFg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIC8vIENhbGN1bGEgbyBzZWdtZW50byBhIHBhcnRpciBkYSBjb29yZGVuYWRhIGRvIGNsaXF1ZSAoY2xpZW50WCksIG7Do28gZGVcbiAgICAgICAgLy8gYGlucHV0LnNlbGVjdGlvblN0YXJ0YCDigJQgbyBicm93c2VyIGFqdXN0YSBhIHBvc2nDp8OjbyBkbyBjYXJldCBkZSBmb3JtYSBhc3PDrW5jcm9uYVxuICAgICAgICAvLyBhcMOzcyBvIGNsaXF1ZSAob2JzZXJ2YWRvIGVtcGlyaWNhbWVudGUsIGVzcGVjaWFsbWVudGUgbmEgdHJhbnNpw6fDo28gZGUgZm9jbyksIGVudMOjb1xuICAgICAgICAvLyBsZXIgYHNlbGVjdGlvblN0YXJ0YCBuZXNzZSBtb21lbnRvIMOpIHVtYSBmb250ZSBuw6NvIGNvbmZpw6F2ZWwuIGBjbGllbnRYYCDDqSBzw61uY3Jvbm9cbiAgICAgICAgLy8gZSBpbWVkaWF0bywgc2VtIGVzc2EgY29ycmlkYS5cbiAgICAgICAgY29uc3QgY2hhckluZGV4ID0gdGhpcy5jbGlja0NsaWVudFhUb0NoYXJJbmRleChpbnB1dCwgY2xpZW50WCk7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uO1xuICAgICAgICAvLyBGb2NhIGUgc2VsZWNpb25hIG8gc2VnbWVudG8ganVudG9zLCBlIHJlYXBsaWNhIG9zIGRvaXMgYWxndW1hcyB2ZXplcyBsb2dvIGVtIHNlZ3VpZGEg4oCUXG4gICAgICAgIC8vIG8gYnJvd3Nlci9DREsgT3ZlcmxheSBwb2RlIG1leGVyIG5vIGZvY28gZGUgZm9ybWEgYXNzw61uY3JvbmEgZGVwb2lzIGRvIGNsaXF1ZSAoYmx1clxuICAgICAgICAvLyBuYXRpdm8gZG8gYmFja2Ryb3AsIGNka1RyYXBGb2N1cyBkbyBwYWluZWwsIGV0Yy4pOyBlbSB2ZXogZGUgdGVudGFyIHByZXZlci9ldml0YXIgY2FkYVxuICAgICAgICAvLyBjYXVzYSwgc2ltcGxlc21lbnRlIHZlbmNlbW9zIHJlYWZpcm1hbmRvIGZvY28rc2VsZcOnw6NvIHBvciBjaW1hLlxuICAgICAgICBjb25zdCBmb2N1c0FuZFNlbGVjdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudEF0KGNoYXJJbmRleCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChpbmRleCk7XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICB9O1xuICAgICAgICBmb2N1c0FuZFNlbGVjdCgpO1xuICAgICAgICBzZXRUaW1lb3V0KGZvY3VzQW5kU2VsZWN0LCAwKTtcbiAgICAgICAgc2V0VGltZW91dChmb2N1c0FuZFNlbGVjdCwgNTApO1xuICAgIH1cblxuICAgIC8qKiBEdXBsbyBjbGlxdWUgc2VsZWNpb25hIG8gaW5wdXQgaW50ZWlybyAodG9kb3Mgb3Mgc2VnbWVudG9zKSwgY29tbyBudW0gYDxpbnB1dD5gIGRlIHRleHRvIGNvbXVtLiAqL1xuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dERibENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc1NlZ21lbnRlZE1vZGUoKSB8fCAhKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2VsZWN0V2hvbGVGaWVsZChldmVudC50YXJnZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjaW9uYSB0b2RvcyBvcyBzZWdtZW50b3MgZG8gaW5wdXQgKHVzYWRvIHRhbnRvIHBlbG8gZHVwbG8gY2xpcXVlIGRldGVjdGFkbyBuYSBtw6NvIGVtXG4gICAgICogYGhhbmRsZVNlZ21lbnRQb2ludGVyRG93bmAgcXVhbnRvIHBvciBgaGFuZGxlSW5wdXREYmxDbGlja2AsIG1hbnRpZG8gY29tbyBjYW1pbmhvIGRpcmV0b1xuICAgICAqIHByYSBxdWVtIGRpc3BhcmEgdW0gYGRibGNsaWNrYCBkZSB2ZXJkYWRlLCBleC46IGFjZXNzaWJpbGlkYWRlL3Rlc3RlcykuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZWxlY3RXaG9sZUZpZWxkKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTtcbiAgICAgICAgLy8gR2FyYW50ZSB1bSBzZWdtZW50byBhdGl2byAqYW50ZXMqIGRlIGZvY2FyOiBzZSBvIENESyBPdmVybGF5IHRpdmVyIHJvdWJhZG8gbyBmb2NvIGRlXG4gICAgICAgIC8vIGZvcm1hIGFzc8OtbmNyb25hIChibHVyKSBlbnRyZSBvcyBjbGlxdWVzIHF1ZSBjb21ww7VlbSBvIGR1cGxvIGNsaXF1ZSwgbyBgaW5wdXQuZm9jdXMoKWBcbiAgICAgICAgLy8gYWJhaXhvIGRpc3BhcmEgdW0gZXZlbnRvIGBmb2N1c2AgZ2VudcOtbm8sIGUgaGFuZGxlSW5wdXRGb2N1cyBzw7MgZXZpdGEgYWdlbmRhciBzdWEgcHLDs3ByaWFcbiAgICAgICAgLy8gcmVhcGxpY2HDp8OjbyBjb25jb3JyZW50ZSAocXVlIHNvYnJlc2NyZXZlcmlhIG5vc3NhIHNlbGXDp8OjbyBkbyBjYW1wbyBpbnRlaXJvIG1haXMgdGFyZGUpXG4gICAgICAgIC8vIHF1YW5kbyBlbmNvbnRyYSBgZ2V0QWN0aXZlSW5kZXgoKSAhPT0gbnVsbGAg4oCUIG8gbWVzbW8gbW90aXZvIHBlbG8gcXVhbCBoYW5kbGVJbnB1dENsaWNrXG4gICAgICAgIC8vIHNlbXByZSBjaGFtYSBgc2VnbWVudEVuZ2luZS5zZWxlY3RTZWdtZW50KGluZGV4KWAgYW50ZXMgZGUgYGlucHV0LmZvY3VzKClgLlxuICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZWxlY3RGaXJzdFNlZ21lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbjtcbiAgICAgICAgLy8gTWVzbW8gcGFkcsOjbyBkZWZlbnNpdm8gZGUgaGFuZGxlSW5wdXRDbGljazogbyBjbGlxdWUgcXVlIGZlY2hhIG8gZHVwbG8gY2xpcXVlIGrDoSByb2RvdVxuICAgICAgICAvLyBoYW5kbGVJbnB1dENsaWNrIChzZWxlY2lvbmFuZG8gc8OzIHVtIHNlZ21lbnRvKSBlIHBvZGUgdGVyIGFnZW5kYWRvIHN1YXMgcHLDs3ByaWFzXG4gICAgICAgIC8vIHJlYXBsaWNhw6fDtWVzIGFkaWFkYXMg4oCUIGEgZ2VyYcOnw6NvIHJlY8OpbS1pbmNyZW1lbnRhZGEgYXMgaW52YWxpZGEsIGVudMOjbyBzw7MgYSBzZWxlw6fDo28gZG9cbiAgICAgICAgLy8gY2FtcG8gaW50ZWlybyBzb2JyZXZpdmUuXG4gICAgICAgIGNvbnN0IGZvY3VzQW5kU2VsZWN0QWxsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT09IHRoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uKSByZXR1cm47XG4gICAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgaW5wdXQudmFsdWUubGVuZ3RoKTtcbiAgICAgICAgfTtcbiAgICAgICAgZm9jdXNBbmRTZWxlY3RBbGwoKTtcbiAgICAgICAgc2V0VGltZW91dChmb2N1c0FuZFNlbGVjdEFsbCwgMCk7XG4gICAgICAgIHNldFRpbWVvdXQoZm9jdXNBbmRTZWxlY3RBbGwsIDUwKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSW5wdXRGb2N1cyhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLmZvY3VzZWQuZW1pdChldmVudCk7XG4gICAgICAgIGlmICh0aGlzLmlzU2VnbWVudGVkTW9kZSgpICYmIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlID09PSAnJykge1xuICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5zZWdtZW50RW5naW5lLmdldERpc3BsYXlTdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIEZvY28gXCJnZW51w61ub1wiIChUYWIgYSBwYXJ0aXIgZGUgb3V0cm8gY2FtcG8sIG91IHByaW1laXJvIGZvY28gbm8gY2FtcG8pIOKAlFxuICAgICAgICAgICAgICAgIC8vIG5lbmh1bSBzZWdtZW50byBhdGl2byBhaW5kYSwgZW50w6NvIHNlbGVjaW9uYSBvIHByaW1laXJvLlxuICAgICAgICAgICAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZWxlY3RGaXJzdFNlZ21lbnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBKw6EgZXhpc3RlIHVtIHNlZ21lbnRvIGF0aXZvIOKAlCBwb3IgZXhlbXBsbywgaGFuZGxlSW5wdXRDbGljayBhY2Fib3UgZGVcbiAgICAgICAgICAgICAgICAvLyBkZWZpbmktbG8gZSBlc3TDoSByZWZvY2FuZG8gbyBpbnB1dCBwcm9ncmFtYXRpY2FtZW50ZSBhcMOzcyB1bSBibHVyIGVzcMO6cmlvLlxuICAgICAgICAgICAgICAgIC8vIE7Do28gcmVpbmljaWEgcGFyYSBvIHByaW1laXJvIHNlZ21lbnRvOyBzw7MgZ2FyYW50ZSBxdWUgYSBzZWxlw6fDo28gdmlzdWFsIGJhdGFcbiAgICAgICAgICAgICAgICAvLyBjb20gbyBlc3RhZG8gYXR1YWwuXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3dPbkZvY3VzKCkpIHtcbiAgICAgICAgICAgIHRoaXMub3Blbk9uRm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBNYXBlaWEgYSBjb29yZGVuYWRhIFggKHZpZXdwb3J0KSBkZSB1bSBjbGlxdWUgcGFyYSBvIMOtbmRpY2UgZGUgY2FyYWN0ZXJlIG1haXMgcHLDs3hpbW8gbm8gdmFsb3IgZXhpYmlkby4gKi9cbiAgICBwcml2YXRlIGNsaWNrQ2xpZW50WFRvQ2hhckluZGV4KGlucHV0OiBIVE1MSW5wdXRFbGVtZW50LCBjbGllbnRYOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoaW5wdXQpO1xuICAgICAgICBjb25zdCBjYW52YXMgPSAodGhpcy5tZWFzdXJlQ2FudmFzID8/PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSk7XG4gICAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICBpZiAoIWN0eCkgcmV0dXJuIDA7XG4gICAgICAgIGN0eC5mb250ID0gYCR7c3R5bGUuZm9udFN0eWxlfSAke3N0eWxlLmZvbnRXZWlnaHR9ICR7c3R5bGUuZm9udFNpemV9ICR7c3R5bGUuZm9udEZhbWlseX1gO1xuICAgICAgICBjb25zdCByZWN0ID0gaW5wdXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdMZWZ0ID0gcGFyc2VGbG9hdChzdHlsZS5wYWRkaW5nTGVmdCkgfHwgMDtcbiAgICAgICAgY29uc3QgbG9jYWxYID0gY2xpZW50WCAtIHJlY3QubGVmdCAtIHBhZGRpbmdMZWZ0ICsgaW5wdXQuc2Nyb2xsTGVmdDtcbiAgICAgICAgY29uc3QgdGV4dCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBsZXQgYmVzdEluZGV4ID0gMDtcbiAgICAgICAgbGV0IGJlc3REaXN0YW5jZSA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGN0eC5tZWFzdXJlVGV4dCh0ZXh0LnNsaWNlKDAsIGkpKS53aWR0aCAtIGxvY2FsWCk7XG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICBiZXN0SW5kZXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0SW5kZXg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZU5hdGl2ZUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlSW5wdXQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Qmx1cihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5ibHVycmVkLmVtaXQoZXZlbnQpO1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCB3YXNTZWdtZW50ZWQgPSB0aGlzLmlzU2VnbWVudGVkTW9kZSgpO1xuICAgICAgICBpZiAod2FzU2VnbWVudGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5jb21taXRTZWdtZW50ZWRWYWx1ZUlmQ29tcGxldGUoKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5zZWdtZW50RW5naW5lLmlzRW1wdHkoKSA/ICcnIDogdGhpcy5zZWdtZW50RW5naW5lLmdldERpc3BsYXlTdHJpbmcoKTtcbiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5pbnB1dERhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbnB1dC52YWx1ZT8udHJpbSgpKSB7XG4gICAgICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSAoZXZlbnQgYXMgRm9jdXNFdmVudCkucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gRW0gbW9kbyBzZWdtZW50YWRvLCB1bSBibHVyIHNlbSBgcmVsYXRlZFRhcmdldGAgbm9ybWFsbWVudGUgbsOjbyDDqSB1bWEgc2HDrWRhIHJlYWxcbiAgICAgICAgICAgIC8vIGRlIGZvY28g4oCUIMOpIG8gYmFja2Ryb3AgdHJhbnNwYXJlbnRlIGRvIHByw7NwcmlvIHBvcHVwIChuw6NvIGZvY8OhdmVsKSBpbnRlcmNlcHRhbmRvXG4gICAgICAgICAgICAvLyB1bSBjbGlxdWUgbm8gdHJpZ2dlciBwYXJhIHRyb2NhciBkZSBzZWdtZW50by4gTsOjbyByZWRpcmVjaW9uYSBvIGZvY28gcHJvIHBhaW5lbFxuICAgICAgICAgICAgLy8gbmVzc2UgY2FzbzsgZGVpeGEgaGFuZGxlSW5wdXRDbGljay9oYW5kbGVJbnB1dEZvY3VzIHJlc29sdmVyZW0gKGVsZXMgcmVmb2NhbSBvXG4gICAgICAgICAgICAvLyBpbnB1dCBlIHJlYXBsaWNhbSBvIHNlZ21lbnRvIGNvcnJldG8gbG9nbyBlbSBzZWd1aWRhKS5cbiAgICAgICAgICAgIGNvbnN0IGxvb2tzTGlrZU93blRyaWdnZXJDbGljayA9IHdhc1NlZ21lbnRlZCAmJiAhcmVsYXRlZFRhcmdldDtcbiAgICAgICAgICAgIGlmICghbG9va3NMaWtlT3duVHJpZ2dlckNsaWNrICYmICghcmVsYXRlZFRhcmdldCB8fCAhcGFuZWw/LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jcmVhc2VIb3VyQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZm9jdXM9XCJ0b2RheVwiXScpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ2J1dHRvbjpub3QoW2Rpc2FibGVkXSknKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dENoYW5nZShyYXc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1NlZ21lbnRNb2RlQ2FuZGlkYXRlKCkpIHJldHVybjtcbiAgICAgICAgaWYgKCFyYXc/LnRyaW0oKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW5wdXQodGhpcy5tb2RlKCksIHJhdywgdGhpcy5yYW5nZVNlcGFyYXRvcigpKTtcbiAgICAgICAgaWYgKHBhcnNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hhc0Zvcm1hdEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNEYXRlUmFuZ2UocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChwYXJzZWQpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocGFyc2VkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBwYXJzZWQgYXMgRGF0ZTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGQpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMuaG91cnMuc2V0KGQuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KGQuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZVRyaWdnZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VnbWVudGVkTW9kZSgpICYmIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VnbWVudGVkS2V5ZG93bihldmVudCwgZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGVjbGFzIHF1ZSBkZXZlbSBwYXNzYXIgZGlyZXRvIHBhcmEgbyBicm93c2VyIHNlbSBpbnNlcmlyL2FsdGVyYXIgbmFkYSBubyBjYW1wby4gKi9cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTRUdNRU5URURfUEFTU1RIUk9VR0hfS0VZUyA9IFsnSG9tZScsICdFbmQnLCAnU2hpZnQnLCAnQ2Fwc0xvY2snLCAnRXNjYXBlJywgJ0VudGVyJywgJyAnXTtcblxuICAgIC8qKiBEaWdpdGHDp8OjbyBwb3Igc2VnbWVudG8gKGRpYS9tw6pzL2Fuby9ob3JhL21pbnV0by9zZWd1bmRvL2FtcG0pIG5vIGlucHV0IGRvIHRyaWdnZXIuICovXG4gICAgcHJpdmF0ZSBoYW5kbGVTZWdtZW50ZWRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIGNvbnN0IHsga2V5LCBjdHJsS2V5LCBtZXRhS2V5LCBhbHRLZXksIHNoaWZ0S2V5IH0gPSBldmVudDtcbiAgICAgICAgaWYgKGN0cmxLZXkgfHwgbWV0YUtleSB8fCBhbHRLZXkgfHwga2V5LnN0YXJ0c1dpdGgoJ0YnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoRGF0ZXBpY2tlckNvbXBvbmVudC5TRUdNRU5URURfUEFTU1RIUk9VR0hfS0VZUy5pbmNsdWRlcyhrZXkpKSByZXR1cm47XG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uKys7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VnbWVudEVuZ2luZS5tb3ZlVG9BZGphY2VudFNlZ21lbnQoc2hpZnRLZXkgPyAtMSA6IDEpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ21vdmVkJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBrZXkgPT09ICdBcnJvd1JpZ2h0Jykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIC8vIEFvIGNvbnRyw6FyaW8gZG8gVGFiLCBzZXRhIG5vIHByaW1laXJvL8O6bHRpbW8gc2VnbWVudG8gbsOjbyBkZXZlIHNhaXIgZG8gY2FtcG8gbmVtXG4gICAgICAgICAgICAvLyBkZXNhdGl2YXIgYSBzZWxlw6fDo28g4oCUIGBtb3ZlVG9BZGphY2VudFNlZ21lbnRgIHplcmEgYGFjdGl2ZUluZGV4YCBhbyBiYXRlciBubyBsaW1pdGVcbiAgICAgICAgICAgIC8vIChjb21wb3J0YW1lbnRvIGNlcnRvIHBybyBUYWIgZXNjYXBhciBkbyBjYW1wbyksIGVudMOjbyBuYSBib3JkYSBhIGdlbnRlIHJlc2VsZWNpb25hXG4gICAgICAgICAgICAvLyBvIHNlZ21lbnRvIHF1ZSBqw6EgZXN0YXZhIGF0aXZvLCBpbWl0YW5kbyBvIGA8aW5wdXQgdHlwZT1cImRhdGVcIj5gIG5hdGl2byAoYSBzZXRhIHNvbWVcbiAgICAgICAgICAgIC8vIG5vIGxpbWl0ZSwgbsOjbyBuYXZlZ2EgcHJhIGZvcmEpLlxuICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gdGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlZ21lbnRFbmdpbmUubW92ZVRvQWRqYWNlbnRTZWdtZW50KGtleSA9PT0gJ0Fycm93TGVmdCcgPyAtMSA6IDEpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ2JvdW5kYXJ5JyAmJiBiZWZvcmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChiZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ0Fycm93VXAnIHx8IGtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuaW5jcmVtZW50QWN0aXZlU2VnbWVudChrZXkgPT09ICdBcnJvd1VwJyA/IDEgOiAtMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQmFja3NwYWNlJyB8fCBrZXkgPT09ICdEZWxldGUnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY29uc3QgaXNXaG9sZUZpZWxkU2VsZWN0ZWQgPSBpbnB1dC5zZWxlY3Rpb25TdGFydCA9PT0gMCAmJiBpbnB1dC5zZWxlY3Rpb25FbmQgPT09IGlucHV0LnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChpc1dob2xlRmllbGRTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5jbGVhckFsbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuY2xlYXJBY3RpdmVTZWdtZW50KGtleSA9PT0gJ0JhY2tzcGFjZScgPyAnYmFja3NwYWNlJyA6ICdkZWxldGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3luY1NlZ21lbnRlZElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgvXlswLTldJC8udGVzdChrZXkpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnR5cGVEaWdpdChrZXkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudEVuZ2luZS5hY3RpdmVLaW5kKCkgPT09ICdhbXBtJyAmJiAvXlthcEFQXSQvLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZXRBbVBtKGtleS50b0xvd2VyQ2FzZSgpID09PSAnYScgPyAwIDogMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWFscXVlciBvdXRyYSB0ZWNsYSBpbXByaW3DrXZlbCAobGV0cmFzLCBzw61tYm9sb3MpIG7Do28gw6kgaW5zZXJpZGEgbm8gY2FtcG8uXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqIFNpbmNyb25pemEgbyBET00gY29tIG8gZXN0YWRvIGF0dWFsIGRhIGVuZ2luZSAodmFsb3IgKyBzZWxlw6fDo28gZG8gc2VnbWVudG8gYXRpdm8pIGFww7NzIHVtYSBtdXRhw6fDo28uICovXG4gICAgcHJpdmF0ZSBzeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpO1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHRoaXMuaW5wdXREYXRlO1xuICAgICAgICB0aGlzLnNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dCk7XG4gICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgIHRoaXMuY29tbWl0U2VnbWVudGVkVmFsdWVJZkNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXRTZWdtZW50UmFuZ2UoaW5kZXgpO1xuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKiogUHJvcGFnYSBvIHZhbG9yIGRhIGVuZ2luZSBwYXJhIG8gbW9kZWxvIChDVkEpIGFzc2ltIHF1ZSB0b2RvcyBvcyBzZWdtZW50b3MgZXN0aXZlcmVtIGNvbXBsZXRvcy4gKi9cbiAgICBwcml2YXRlIGNvbW1pdFNlZ21lbnRlZFZhbHVlSWZDb21wbGV0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlZ21lbnRFbmdpbmUuaXNDb21wbGV0ZSgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSgpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFzZSA9XG4gICAgICAgICAgICB0aGlzLnZhbHVlKCkgPz9cbiAgICAgICAgICAgIG5ldyBEYXRlKFxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldE1vbnRoKCksXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXREYXRlKCksXG4gICAgICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnNlZ21lbnRFbmdpbmUudG9EYXRlKGJhc2UpO1xuICAgICAgICBpZiAoIWRhdGUpIHJldHVybjtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQoZGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLnNob3dDYWxlbmRhcigpKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNob3dUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaG91cnMuc2V0KGRhdGUuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KGRhdGUuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoZGF0ZS5nZXRTZWNvbmRzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKGRhdGUpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBOYXZpZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIG5hdmlnYXRlUHJldigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgLSAxMCwgdmlldy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IHZpZXcuZ2V0RnVsbFllYXIoKSAtIDEwIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAnbW9udGhzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpIC0gMSwgdmlldy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IHZpZXcuZ2V0RnVsbFllYXIoKSAtIDEgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpLCB2aWV3LmdldE1vbnRoKCkgLSAxLCAxKTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5tb250aENoYW5nZS5lbWl0KHsgbW9udGg6IG5ld0RhdGUuZ2V0TW9udGgoKSwgeWVhcjogbmV3RGF0ZS5nZXRGdWxsWWVhcigpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG5hdmlnYXRlTmV4dCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld0RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCkgKyAxMCwgdmlldy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IHZpZXcuZ2V0RnVsbFllYXIoKSArIDEwIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAnbW9udGhzJykge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpICsgMSwgdmlldy5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB0aGlzLnllYXJDaGFuZ2UuZW1pdCh7IG1vbnRoOiB2aWV3LmdldE1vbnRoKCksIHllYXI6IHZpZXcuZ2V0RnVsbFllYXIoKSArIDEgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpLCB2aWV3LmdldE1vbnRoKCkgKyAxLCAxKTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5tb250aENoYW5nZS5lbWl0KHsgbW9udGg6IG5ld0RhdGUuZ2V0TW9udGgoKSwgeWVhcjogbmV3RGF0ZS5nZXRGdWxsWWVhcigpIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUNhbGVuZGFyR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgQVJST1dTID0gWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdBcnJvd1VwJywgJ0Fycm93RG93biddO1xuICAgICAgICBpZiAoIUFSUk9XUy5pbmNsdWRlcyhldmVudC5rZXkpKSByZXR1cm47XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBncmlkID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgYnV0dG9ucyA9IEFycmF5LmZyb20oZ3JpZC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpKTtcbiAgICAgICAgY29uc3QgY3VycmVudElkeCA9IGJ1dHRvbnMuaW5kZXhPZihldmVudC50YXJnZXQgYXMgSFRNTEJ1dHRvbkVsZW1lbnQpO1xuICAgICAgICBpZiAoY3VycmVudElkeCA9PT0gLTEpIHJldHVybjtcblxuICAgICAgICBsZXQgZGVsdGEgPSAwO1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dSaWdodCcpIGRlbHRhID0gMTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dMZWZ0JykgZGVsdGEgPSAtMTtcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykgZGVsdGEgPSBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSztcbiAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIGRlbHRhID0gLURhdGVwaWNrZXJDb21wb25lbnQuREFZU19JTl9XRUVLO1xuXG4gICAgICAgIGNvbnN0IG5leHRJZHggPSBjdXJyZW50SWR4ICsgZGVsdGE7XG5cbiAgICAgICAgaWYgKG5leHRJZHggPCAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2RGlzYWJsZWQoKSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXYoKTtcbiAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsID0gdGhpcy5wb3B1cFBhbmVsKCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0bnMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCdidXR0b25bcm9sZT1cImdyaWRjZWxsXCJdJykgPz8gW10sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldElkeCA9IE1hdGgubWF4KDAsIGJ0bnMubGVuZ3RoICsgbmV4dElkeCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgLTEpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dElkeCA+PSBidXR0b25zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmV4dERpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCk7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidG5zID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJZHggPSBNYXRoLm1pbihuZXh0SWR4IC0gYnV0dG9ucy5sZW5ndGgsIGJ0bnMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgMSkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuZmluZEVuYWJsZWQoYnRucywgdGFyZ2V0SWR4LCAtMSk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWJ1dHRvbnNbbmV4dElkeF0/LmRpc2FibGVkKSB7XG4gICAgICAgICAgICBidXR0b25zW25leHRJZHhdLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBmaW5kRW5hYmxlZChcbiAgICAgICAgYnV0dG9uczogSFRNTEJ1dHRvbkVsZW1lbnRbXSxcbiAgICAgICAgc3RhcnRJZHg6IG51bWJlcixcbiAgICAgICAgZGlyZWN0aW9uOiAxIHwgLTEsXG4gICAgKTogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SWR4OyBpID49IDAgJiYgaSA8IGJ1dHRvbnMubGVuZ3RoOyBpICs9IGRpcmVjdGlvbikge1xuICAgICAgICAgICAgaWYgKCFidXR0b25zW2ldLmRpc2FibGVkKSByZXR1cm4gYnV0dG9uc1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3dpdGNoVG9Nb250aHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ21vbnRocycpO1xuICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJhY2tUb0NhbGVuZGFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFNlbGVjdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBzZWxlY3REYXRlKGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRheS5pc0Rpc2FibGVkKSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTXVsdGlwbGVEYXRlKGRheS5kYXRlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0LnNldChkYXkuZGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9XG4gICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuZ2V0VGltZSgpIDw9IGRheS5kYXRlLmdldFRpbWUoKSA/IFtwZW5kaW5nLCBkYXkuZGF0ZV0gOiBbZGF5LmRhdGUsIHBlbmRpbmddO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlOiBEYXRlUmFuZ2UgPSB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgICAgICAgZGF5LmRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGRheS5kYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICBkYXkuZGF0ZS5nZXREYXRlKCksXG4gICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMoKSxcbiAgICAgICAgICAgIHRoaXMuc2hvd1NlY29uZHMoKSA/IHRoaXMuc2Vjb25kcygpIDogMCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSgpID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdEYXRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhpZGVPbkRhdGVUaW1lU2VsZWN0KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBBZGljaW9uYS9yZW1vdmUgdW1hIGRhdGEgZGEgc2VsZcOnw6NvIG3Dumx0aXBsYS4gTyBwYWluZWwgcGVybWFuZWNlIGFiZXJ0by4gKi9cbiAgICBwcml2YXRlIHRvZ2dsZU11bHRpcGxlRGF0ZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMubXVsdGlwbGVWYWx1ZXMoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBleGlzdGluZy5maW5kSW5kZXgoKGQpID0+IGlzU2FtZURheShkLCBub3JtYWxpemVkKSk7XG4gICAgICAgIGNvbnN0IG5leHQgPVxuICAgICAgICAgICAgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgID8gZXhpc3RpbmcuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleClcbiAgICAgICAgICAgICAgICA6IFsuLi5leGlzdGluZywgbm9ybWFsaXplZF0uc29ydCgoYSwgYikgPT4gYS5nZXRUaW1lKCkgLSBiLmdldFRpbWUoKSk7XG4gICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KG5leHQpO1xuICAgICAgICB0aGlzLmlucHV0RGF0ZSA9IHRoaXMuZm9ybWF0Rm9yRGlzcGxheShuZXh0KTtcbiAgICAgICAgY29uc3QgZW1pdFZhbHVlID0gbmV4dC5sZW5ndGggPyBuZXh0IDogbnVsbDtcbiAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShlbWl0VmFsdWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQoZW1pdFZhbHVlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNZZWFyRGlzYWJsZWQoeWVhcikpIHJldHVybjtcbiAgICAgICAgY29uc3QgbmV3RGF0ZSA9IG5ldyBEYXRlKHllYXIsIDAsIDEpO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld0RhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNNb250aERpc2FibGVkKG1vbnRoSW5kZXgpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG5ld1ZpZXdEYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGhJbmRleCwgMSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ21vbnRoJykge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMucGlja2VyVmlldy5zZXQoJ2NhbGVuZGFyJyk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0VG9kYXkoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGF0ZURpc2FibGVkKHRvZGF5KSkge1xuICAgICAgICAgICAgY29uc3QgY2FsRGF5OiBDYWxlbmRhckRheSA9IHtcbiAgICAgICAgICAgICAgICBkYXRlOiB0b2RheSxcbiAgICAgICAgICAgICAgICBkYXlPZk1vbnRoOiB0b2RheS5nZXREYXRlKCksXG4gICAgICAgICAgICAgICAgaXNDdXJyZW50TW9udGg6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNUb2RheTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0Rpc2FibGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1JhbmdlU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzUmFuZ2VFbmQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzSW5SYW5nZTogZmFsc2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGNhbERheSk7XG4gICAgICAgICAgICB0aGlzLnRvZGF5Q2xpY2suZW1pdCh0b2RheSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xlYXJWYWx1ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQoMCk7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoMCk7XG4gICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoMCk7XG4gICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMubXVsdGlwbGVWYWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihudWxsKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UobnVsbCk7XG4gICAgICAgIHRoaXMuY2xlYXJDbGljay5lbWl0KGV2ZW50KTtcbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnZhbHVlKCkgPz8gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gbmV3IERhdGUoXG4gICAgICAgICAgICBjdXJyZW50LmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBjdXJyZW50LmdldE1vbnRoKCksXG4gICAgICAgICAgICBjdXJyZW50LmdldERhdGUoKSxcbiAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgdGhpcy5zaG93U2Vjb25kcygpID8gdGhpcy5zZWNvbmRzKCkgOiAwLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChjb25maXJtZWQpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KGNvbmZpcm1lZCk7XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBUaW1lIHBpY2tlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRIb3VycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQoKHRoaXMuaG91cnMoKSArIHRoaXMuc3RlcEhvdXIoKSkgJSB0aGlzLm1heEhvdXJzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50SG91cnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KCh0aGlzLmhvdXJzKCkgLSB0aGlzLnN0ZXBIb3VyKCkgKyB0aGlzLm1heEhvdXJzKSAlIHRoaXMubWF4SG91cnMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRNaW51dGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KCh0aGlzLm1pbnV0ZXMoKSArIHRoaXMubWludXRlU3RlcCgpKSAlIHRoaXMubWF4TWludXRlcyk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlY3JlbWVudE1pbnV0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoKHRoaXMubWludXRlcygpIC0gdGhpcy5taW51dGVTdGVwKCkgKyB0aGlzLm1heE1pbnV0ZXMpICUgdGhpcy5tYXhNaW51dGVzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5jcmVtZW50U2Vjb25kcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgodGhpcy5zZWNvbmRzKCkgKyB0aGlzLnN0ZXBTZWNvbmQoKSkgJSA2MCk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlY3JlbWVudFNlY29uZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoKHRoaXMuc2Vjb25kcygpIC0gdGhpcy5zdGVwU2Vjb25kKCkgKyA2MCkgJSA2MCk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgQG51bWVyaWNLZXlzT25seSgpXG4gICAgcHJvdGVjdGVkIGhhbmRsZUhvdXJzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudEhvdXJzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50SG91cnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBudW1lcmljS2V5c09ubHkoKVxuICAgIHByb3RlY3RlZCBoYW5kbGVNaW51dGVzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudE1pbnV0ZXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRNaW51dGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBAbnVtZXJpY0tleXNPbmx5KClcbiAgICBwcm90ZWN0ZWQgaGFuZGxlU2Vjb25kc0tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRTZWNvbmRzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50U2Vjb25kcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUhvdXJzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAgICAgICBjb25zdCBoYWxmID0gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU07XG4gICAgICAgICAgICBjb25zdCBoMTIgPSBNYXRoLm1pbihoYWxmLCBNYXRoLm1heCgxLCBwYXJzZWQpKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBoMTIgJSBoYWxmO1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQodGhpcy5hbVBtKCkgPT09ICdQTScgPyBiYXNlICsgaGFsZiA6IGJhc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQoTWF0aC5taW4odGhpcy5tYXhIb3VycyAtIDEsIE1hdGgubWF4KDAsIHBhcnNlZCkpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKiBBbHRlcm5hIGVudHJlIEFNIGUgUE0gc29tYW5kby9zdWJ0cmFpbmRvIDEyIGhvcmFzIGRhIGhvcmEgaW50ZXJuYS4gKi9cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlQW1QbSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGFsZiA9IERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICB0aGlzLmhvdXJzLnNldCh0aGlzLmhvdXJzKCkgPCBoYWxmID8gdGhpcy5ob3VycygpICsgaGFsZiA6IHRoaXMuaG91cnMoKSAtIGhhbGYpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVNaW51dGVzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQoTWF0aC5taW4odGhpcy5tYXhNaW51dGVzIC0gMSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVTZWNvbmRzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoTWF0aC5taW4oNTksIE1hdGgubWF4KDAsIHBhcnNlZCkpKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25EYXlIb3ZlcihkYXRlOiBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJEYXRlLnNldChkYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiBzdHJpcFRpbWUoZGF0ZSkgPCBzdHJpcFRpbWUobWluKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGRhdGUpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBkaXNhYmxlZERheXMgPSB0aGlzLmRpc2FibGVkRGF5cygpO1xuICAgICAgICBpZiAoZGlzYWJsZWREYXlzLmxlbmd0aCAmJiBkaXNhYmxlZERheXMuaW5jbHVkZXMoZGF0ZS5nZXREYXkoKSkpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBkaXNhYmxlZERhdGVzID0gdGhpcy5kaXNhYmxlZERhdGVzKCk7XG4gICAgICAgIGlmIChkaXNhYmxlZERhdGVzLmxlbmd0aCAmJiBkaXNhYmxlZERhdGVzLnNvbWUoKGQpID0+IGlzU2FtZURheShkLCBkYXRlKSkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzWWVhclNlbGVjdGVkKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgcmV0dXJuICEhc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0geWVhcjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNZZWFyRGlzYWJsZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgeWVhciA8IG1pbi5nZXRGdWxsWWVhcigpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1heCAmJiB5ZWFyID4gbWF4LmdldEZ1bGxZZWFyKCkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQ3VycmVudFllYXIoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB5ZWFyID09PSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzTW9udGhTZWxlY3RlZChtb250aEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIHJldHVybiAhIXNlbGVjdGVkICYmIHNlbGVjdGVkLmdldE1vbnRoKCkgPT09IG1vbnRoSW5kZXggJiYgc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc01vbnRoRGlzYWJsZWQobW9udGhJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgKHllYXIgPCBtaW4uZ2V0RnVsbFllYXIoKSB8fCAoeWVhciA9PT0gbWluLmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA8IG1pbi5nZXRNb250aCgpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXggJiYgKHllYXIgPiBtYXguZ2V0RnVsbFllYXIoKSB8fCAoeWVhciA9PT0gbWF4LmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA+IG1heC5nZXRNb250aCgpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcGFkVGltZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcodGhpcy5jdXJyZW50TGFuZygpLCB7XG4gICAgICAgICAgICB3ZWVrZGF5OiAnbG9uZycsXG4gICAgICAgICAgICB5ZWFyOiAnbnVtZXJpYycsXG4gICAgICAgICAgICBtb250aDogJ2xvbmcnLFxuICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGb3JtYXRhIG8gdmFsb3IgcGFyYSBleGliacOnw6NvIG5vIGlucHV0LCBhcGxpY2FuZG8gcmFuZ2VTZXBhcmF0b3IsIGRhdGVGb3JtYXQgZSBtdWx0aXBsZVNlcGFyYXRvci4gKi9cbiAgICBwcml2YXRlIGZvcm1hdEZvckRpc3BsYXkodmFsdWU6IERhdGUgfCBEYXRlUmFuZ2UgfCBEYXRlW10gfCBudWxsKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlRm9ySW5wdXQoXG4gICAgICAgICAgICB0aGlzLm1vZGUoKSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdGhpcy5yYW5nZVNlcGFyYXRvcigpLFxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlZERhdGVGb3JtYXQoKSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVTZXBhcmF0b3IoKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHVhbGl6YSBgaW5wdXREYXRlYCBhIHBhcnRpciBkZSB1bSB2YWxvciDDum5pY28sIHJvdGVhbmRvIHBlbGEgZW5naW5lIGRlIHNlZ21lbnRvc1xuICAgICAqIChkYXRlL21vbnRoL3RpbWUvZGF0ZXRpbWUpIG91IHBlbG8gZm9ybWF0YWRvciBsZWdhZG8gKHJhbmdlL3llYXIvbXVsdGlwbGUpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0RGlzcGxheUZvcih2YWx1ZTogRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWdtZW50TW9kZUNhbmRpZGF0ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUubG9hZEZyb21EYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdmFsdWUgPyB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpIDogJyc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIChSZSljb25maWd1cmEgYSBlbmdpbmUgZGUgc2VnbWVudG9zIHF1YW5kbyBgbW9kZWAvYGRhdGVGb3JtYXRgL2Bob3VyRm9ybWF0YC9gc2hvd1NlY29uZHNgXG4gICAgICogbXVkYXJhbSBkZXNkZSBhIMO6bHRpbWEgY2hhbWFkYSwgcmVjYXJyZWdhbmRvIG8gdmFsb3IgYXR1YWwuIENoYW1hZG8gZGUgZm9ybWEgc8OtbmNyb25hIGFcbiAgICAgKiBwYXJ0aXIgZGUgdG9kbyBwb250byBkZSBlbnRyYWRhIHF1ZSB1c2EgYSBlbmdpbmUg4oCUIG7Do28gZGVwZW5kZSBkZSB1bSBgZWZmZWN0KClgIChxdWUgc8OzXG4gICAgICogcm9kYSBlbSB1bSBjaWNsbyBkZSBjaGFuZ2UgZGV0ZWN0aW9uLCB0YXJkZSBkZW1haXMgcGFyYSBsZWl0dXJhcy9lc2NyaXRhcyBpbWVkaWF0YXMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgaWYgKG1vZGUgIT09ICdkYXRlJyAmJiBtb2RlICE9PSAnbW9udGgnICYmIG1vZGUgIT09ICd0aW1lJyAmJiBtb2RlICE9PSAnZGF0ZXRpbWUnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGNvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyA9IHtcbiAgICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgICBkYXRlRm9ybWF0OiB0aGlzLnJlc29sdmVkRGF0ZUZvcm1hdCgpLFxuICAgICAgICAgICAgaG91ckZvcm1hdDogdGhpcy5yZXNvbHZlZEhvdXJGb3JtYXQoKSxcbiAgICAgICAgICAgIHNob3dTZWNvbmRzOiB0aGlzLnNob3dTZWNvbmRzKCksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLmxhc3RTZWdtZW50Q29uZmlnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBsYXN0ICYmXG4gICAgICAgICAgICBsYXN0Lm1vZGUgPT09IGNvbmZpZy5tb2RlICYmXG4gICAgICAgICAgICBsYXN0LmRhdGVGb3JtYXQgPT09IGNvbmZpZy5kYXRlRm9ybWF0ICYmXG4gICAgICAgICAgICBsYXN0LmhvdXJGb3JtYXQgPT09IGNvbmZpZy5ob3VyRm9ybWF0ICYmXG4gICAgICAgICAgICBsYXN0LnNob3dTZWNvbmRzID09PSBjb25maWcuc2hvd1NlY29uZHNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0U2VnbWVudENvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLmNvbmZpZ3VyZShjb25maWcpO1xuICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUubG9hZEZyb21EYXRlKHRoaXMudmFsdWUoKSk7XG4gICAgfVxuXG4gICAgLyoqIFJldG9ybmEgYSB0cmFkdcOnw6NvIGRlIGBrZXlgLCBvdSBgZmFsbGJhY2tgIHF1YW5kbyBhIGNoYXZlIG7Do28gZXN0w6EgdHJhZHV6aWRhIChuZ3gtdHJhbnNsYXRlIHJldG9ybmEgYSBwcsOzcHJpYSBjaGF2ZSkuICovXG4gICAgcHJpdmF0ZSByZXNvbHZlVHJhbnNsYXRlZE9yRGVmYXVsdChrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zbGF0ZWQgIT09ICdzdHJpbmcnIHx8ICF0cmFuc2xhdGVkIHx8IHRyYW5zbGF0ZWQgPT09IGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3luY1RpbWVUb1ZhbHVlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy52YWx1ZSgpID8/IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KG5ld0RhdGUpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRDYWxlbmRhckRheShcbiAgICAgICAgZGF0ZTogRGF0ZSxcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IGJvb2xlYW4sXG4gICAgICAgIHRvZGF5OiBEYXRlLFxuICAgICAgICBzZWxlY3RlZDogRGF0ZSB8IG51bGwsXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBEYXRlIHwgbnVsbDsgZW5kOiBEYXRlIHwgbnVsbCB9LFxuICAgICAgICByYW5nZVN0YXJ0VGltZTogbnVtYmVyIHwgbnVsbCxcbiAgICAgICAgcmFuZ2VFbmRUaW1lOiBudW1iZXIgfCBudWxsLFxuICAgICk6IENhbGVuZGFyRGF5IHtcbiAgICAgICAgY29uc3QgaXNSYW5nZVN0YXJ0ID0gcmFuZ2Uuc3RhcnQgPyBpc1NhbWVEYXkoZGF0ZSwgcmFuZ2Uuc3RhcnQpIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzUmFuZ2VFbmQgPSByYW5nZS5lbmQgPyBpc1NhbWVEYXkoZGF0ZSwgcmFuZ2UuZW5kKSA6IGZhbHNlO1xuICAgICAgICBjb25zdCBkYXRlVGltZSA9IHN0cmlwVGltZShkYXRlKTtcbiAgICAgICAgY29uc3QgaXNJblJhbmdlID1cbiAgICAgICAgICAgIHJhbmdlU3RhcnRUaW1lICE9PSBudWxsICYmIHJhbmdlRW5kVGltZSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZGF0ZVRpbWUgPiByYW5nZVN0YXJ0VGltZSAmJiBkYXRlVGltZSA8IHJhbmdlRW5kVGltZVxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmlzTXVsdGlwbGVNb2RlKClcbiAgICAgICAgICAgID8gdGhpcy5tdWx0aXBsZVZhbHVlcygpLnNvbWUoKGQpID0+IGlzU2FtZURheShkLCBkYXRlKSlcbiAgICAgICAgICAgIDogc2VsZWN0ZWRcbiAgICAgICAgICAgICAgPyBpc1NhbWVEYXkoZGF0ZSwgc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlPZk1vbnRoOiBkYXRlLmdldERhdGUoKSxcbiAgICAgICAgICAgIGlzVG9kYXk6IGlzU2FtZURheShkYXRlLCB0b2RheSksXG4gICAgICAgICAgICBpc1NlbGVjdGVkLFxuICAgICAgICAgICAgaXNEaXNhYmxlZDogdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSB8fCAoIWlzQ3VycmVudE1vbnRoICYmICF0aGlzLnNlbGVjdE90aGVyTW9udGhzKCkpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgaXNSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgaXNSYW5nZUVuZCxcbiAgICAgICAgICAgIGlzSW5SYW5nZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVWYWxpZGF0aW9uRXJyb3JzKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc0Zvcm1hdEVycm9yKSByZXR1cm4geyBpbnZhbGlkRm9ybWF0OiB0cnVlIH07XG4gICAgICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiAmJiBzdHJpcFRpbWUoZCkgPCBzdHJpcFRpbWUobWluKSkgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgICAgICAgICBpZiAobWF4ICYmIHN0cmlwVGltZShkKSA+IHN0cmlwVGltZShtYXgpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RhdGVSYW5nZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydCAmJiBtaW4gJiYgc3RyaXBUaW1lKHZhbHVlLnN0YXJ0KSA8IHN0cmlwVGltZShtaW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiB2YWx1ZS5zdGFydCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUuZW5kICYmIG1heCAmJiBzdHJpcFRpbWUodmFsdWUuZW5kKSA+IHN0cmlwVGltZShtYXgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF4OiB7IG1heCwgYWN0dWFsOiB2YWx1ZS5lbmQgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkID0gdmFsdWUgYXMgRGF0ZTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGlmIChtaW4gJiYgZC5nZXRGdWxsWWVhcigpIDwgbWluLmdldEZ1bGxZZWFyKCkpIHJldHVybiB7IG1pbjogeyBtaW4sIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICBpZiAobWF4ICYmIGQuZ2V0RnVsbFllYXIoKSA+IG1heC5nZXRGdWxsWWVhcigpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICBpZiAobWF4ICYmIHN0cmlwVGltZShkKSA+IHN0cmlwVGltZShtYXgpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEYXRlUmFuZ2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRlUmFuZ2Uge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAnc3RhcnQnIGluIHZhbHVlICYmICdlbmQnIGluIHZhbHVlO1xuICAgIH1cbn1cblxuIiwiPGRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIGFyaWEtaGFzcG9wdXA9XCJncmlkXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbigpXCJcbiAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInBvcHVwSWQoKVwiXG4+XG4gICAgPGlucHV0XG4gICAgICAgICN0cmlnZ2VySW5wdXRcbiAgICAgICAgY2xhc3M9XCJoLVszNXB4XSB3LWZ1bGwgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtMyB0ZXh0LXNtIG91dGxpbmUtbm9uZSB0cmFuc2l0aW9uLWNvbG9ycyBmb2N1czpib3JkZXItcHJpbWFyeVwiXG4gICAgICAgIFtjbGFzcy5wci0xMF09XCJzaG93SWNvbigpICYmICFzaG93Q2xlYXIoKVwiXG4gICAgICAgIFtjbGFzcy5wci0xNl09XCJzaG93SWNvbigpICYmIHNob3dDbGVhcigpXCJcbiAgICAgICAgW2NsYXNzLnByLTZdPVwiIXNob3dJY29uKCkgJiYgc2hvd0NsZWFyKClcIlxuICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0yMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmJnLWdyYXlzY2FsZS01XT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy5jdXJzb3Itbm90LWFsbG93ZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtpZF09XCJpbnB1dElkKClcIlxuICAgICAgICBbbmFtZV09XCJuYW1lKCkgPz8gaW5wdXRJZCgpXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIoKSA/PyAocGxhY2Vob2xkZXJLZXkoKSB8IHRyYW5zbGF0ZSlcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtyZWFkb25seV09XCJcbiAgICAgICAgICAgIHJlYWRvbmx5SW5wdXQoKSB8fFxuICAgICAgICAgICAgbW9kZSgpID09PSAncmFuZ2UnIHx8XG4gICAgICAgICAgICBtb2RlKCkgPT09ICd5ZWFyJyB8fFxuICAgICAgICAgICAgaXNNdWx0aXBsZU1vZGUoKSB8fFxuICAgICAgICAgICAgKGlzU2VnbWVudE1vZGVDYW5kaWRhdGUoKSAmJiBpc1RvdWNoRGV2aWNlKCkpXG4gICAgICAgIFwiXG4gICAgICAgIFt0YWJJbmRleF09XCJ0YWJpbmRleCgpID8/IG51bGxcIlxuICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1cygpXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJpbnB1dERhdGVcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJoYW5kbGVJbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKGZvY3VzKT1cImhhbmRsZUlucHV0Rm9jdXMoJGV2ZW50KVwiXG4gICAgICAgIChibHVyKT1cImhhbmRsZUlucHV0Qmx1cigkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJoYW5kbGVJbnB1dENsaWNrKCRldmVudClcIlxuICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVUcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgKGlucHV0KT1cImhhbmRsZU5hdGl2ZUlucHV0KCRldmVudClcIlxuICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwibmdDb250cm9sPy5jb250cm9sPy5pbnZhbGlkIHx8IG51bGxcIlxuICAgIC8+XG5cbiAgICBAaWYgKHNob3dDbGVhcigpICYmIGlucHV0RGF0ZSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgZmxleCBoLVszNXB4XSB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtZ3JheXNjYWxlLTYwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOnRleHQtZ3JheXNjYWxlLTkwXCJcbiAgICAgICAgICAgIFtjbGFzcy5yaWdodC05XT1cInNob3dJY29uKClcIlxuICAgICAgICAgICAgW2NsYXNzLnJpZ2h0LTBdPVwiIXNob3dJY29uKClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2xlYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLXRpbWVzIHRleHQteHNcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG5cbiAgICBAaWYgKHNob3dJY29uKCkpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgI2ljb25CdXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSByaWdodC0wIGZsZXggaC1bMzVweF0gdy05IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXItbCBib3JkZXItc29saWQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMjBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuY3Vyc29yLW5vdC1hbGxvd2VkXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwiIWRpc2FibGVkKCkgJiYgIWlzRm9jdXNlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItcHJpbWFyeV09XCJpc0ZvY3VzZWQoKSAmJiAhZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmhvdmVyOmJnLWdyYXlzY2FsZS0xMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9vcGVuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlVHJpZ2dlcktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cInJlc29sdmVkSWNvbigpXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJ0cmlnZ2VyXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW5dPVwiaXNPcGVuKClcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BdPVwidHJ1ZVwiXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3M9XCJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnNdPVwicG9zaXRpb25zXCJcbiAgICAoYmFja2Ryb3BDbGljayk9XCJoYW5kbGVCYWNrZHJvcENsaWNrKCRldmVudClcIlxuICAgIChvdmVybGF5S2V5ZG93bik9XCJoYW5kbGVPdmVybGF5S2V5ZG93bigkZXZlbnQpXCJcbiAgICAoZGV0YWNoKT1cImlzT3Blbi5zZXQoZmFsc2UpXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgICNwb3B1cFBhbmVsXG4gICAgICAgIGNsYXNzPVwiei01MCB3LTcyIHJvdW5kZWQtbWVkaXVtIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtMCBzaGFkb3ctbWRcIlxuICAgICAgICByb2xlPVwiZGlhbG9nXCJcbiAgICAgICAgY2RrVHJhcEZvY3VzXG4gICAgICAgIFtpZF09XCJwb3B1cElkKClcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRpYWxvZ0FyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlXCJcbiAgICA+XG4gICAgICAgIEBpZiAoc2hvd0NhbGVuZGFyKCkpIHtcbiAgICAgICAgICAgIEBpZiAocGlja2VyVmlldygpID09PSAnY2FsZW5kYXInKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvIGRlIG5hdmVnYcOnw6NvIG1lbnNhbCAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3ByZXZfbW9udGgnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVByZXYoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcm91bmRlZC1zbWFsbCBweC0yIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X21vbnRoX3llYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzd2l0Y2hUb01vbnRocygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgY3VycmVudE1vbnRoS2V5KCkgfCB0cmFuc2xhdGUgfX0mbmJzcDt7eyBjdXJyZW50WWVhcigpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biB0ZXh0LVsxMHB4XVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbmV4dF9tb250aCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxob3MgZG9zIGRpYXMgZGEgc2VtYW5hIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IHB4LTMgcHQtMlwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF5S2V5IG9mIG9yZGVyZWRXZWVrRGF5S2V5cygpOyB0cmFjayBkYXlLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRheUtleSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5S2V5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBHcmFkZSBkbyBjYWxlbmTDoXJpbyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBweC0zIHBiLTJcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2FsZW5kYXJfbGFiZWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgbW9udGg6IChjdXJyZW50TW9udGhLZXkoKSB8IHRyYW5zbGF0ZSksIHllYXI6IGN1cnJlbnRZZWFyKCkgfVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVDYWxlbmRhckdyaWRLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAod2VlayBvZiBjYWxlbmRhcldlZWtzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udGVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGRheSBvZiB3ZWVrOyB0cmFjayBkYXkuZGF0ZS50b0lTT1N0cmluZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTggdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLVs1MCVdIHRleHQtc20gZm9udC1ub3JtYWwgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCIhc2hvd090aGVyTW9udGhzKCkgJiYgIWRheS5pc0N1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZvcm1hdERheUFyaWFMYWJlbChkYXkuZGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJkYXkuaXNTZWxlY3RlZCB8fCBkYXkuaXNSYW5nZVN0YXJ0IHx8IGRheS5pc1JhbmdlRW5kIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImRheS5pc1RvZGF5ID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRheS5pc0Rpc2FibGVkID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCIhc2hvd090aGVyTW9udGhzKCkgJiYgIWRheS5pc0N1cnJlbnRNb250aCA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNTZWxlY3RlZCB8fCBkYXkuaXNSYW5nZVN0YXJ0IHx8IGRheS5pc1JhbmdlRW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3NlbGVjdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRheS5pc1RvZGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAndG9kYXknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRheS5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSBmb250LXNlbWlib2xkIHRleHQtZ3JheXNjYWxlLTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNTZWxlY3RlZCB8fCBkYXkuaXNSYW5nZVN0YXJ0IHx8IGRheS5pc1JhbmdlRW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1ncmF5c2NhbGUtMTAgaG92ZXI6YmctZ3JheXNjYWxlLTIwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzSW5SYW5nZSAmJiAhZGF5LmlzUmFuZ2VTdGFydCAmJiAhZGF5LmlzUmFuZ2VFbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNTZWxlY3RlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzUmFuZ2VTdGFydCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzUmFuZ2VFbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc0Rpc2FibGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc0N1cnJlbnRNb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtNjAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZVN0YXJ0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZUVuZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzRGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc0N1cnJlbnRNb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmluZy0yIHJpbmctaW5zZXQgcmluZy1wcmltYXJ5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzVG9kYXkgJiYgIWRheS5pc1NlbGVjdGVkICYmICFkYXkuaXNSYW5nZVN0YXJ0ICYmICFkYXkuaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogZGF5LmlzRGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uRGF5SG92ZXIoZGF5LmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uRGF5SG92ZXIobnVsbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGUoZGF5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheS5kYXlPZk1vbnRoIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAocGlja2VyVmlldygpID09PSAneWVhcnMnKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvIGRlIG5hdmVnYcOnw6NvIHBvciBkw6ljYWRhIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcHJldl9kZWNhZGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVByZXYoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPnt7IGN1cnJlbnREZWNhZGVTdGFydCgpIH19IOKAkyB7eyBjdXJyZW50RGVjYWRlU3RhcnQoKSArIDExIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25leHRfZGVjYWRlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVOZXh0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tcmlnaHQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBHcmFkZSBkZSBhbm9zIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIHB4LTMgcHktM1wiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3llYXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiB5ZWFyc0dyaWQoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yICh5ZWFyIG9mIHJvdzsgdHJhY2sgeWVhcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTkgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1zbSBmb250LW5vcm1hbCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNZZWFyU2VsZWN0ZWQoeWVhcikgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNZZWFyRGlzYWJsZWQoeWVhcikgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImlzQ3VycmVudFllYXIoeWVhcikgPyAnZGF0ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzWWVhclNlbGVjdGVkKHllYXIpID8gJ3NlbGVjdGVkJyA6IGlzQ3VycmVudFllYXIoeWVhcikgPyAndG9kYXknIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNZZWFyRGlzYWJsZWQoeWVhcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSBmb250LXNlbWlib2xkIHRleHQtZ3JheXNjYWxlLTAnOiBpc1llYXJTZWxlY3RlZCh5ZWFyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaW5nLTIgcmluZy1pbnNldCByaW5nLXByaW1hcnknOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ3VycmVudFllYXIoeWVhcikgJiYgIWlzWWVhclNlbGVjdGVkKHllYXIpICYmICFpc1llYXJEaXNhYmxlZCh5ZWFyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS05MCBob3ZlcjpiZy1ncmF5c2NhbGUtMTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc1llYXJTZWxlY3RlZCh5ZWFyKSAmJiAhaXNZZWFyRGlzYWJsZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogaXNZZWFyRGlzYWJsZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB5ZWFyIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChwaWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDYWJlw6dhbGhvIGRlIG5hdmVnYcOnw6NvIGFudWFsIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcHJldl95ZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVQcmV2KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tbGVmdCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwXCI+e3sgY3VycmVudFllYXIoKSB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25leHRfeWVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gR3JhZGUgZGUgbWVzZXMgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTIgcHgtMyBweS0zXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfbW9udGgnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBtb250aHNHcmlkKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAobW9udGggb2Ygcm93OyB0cmFjayBtb250aC5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTkgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1zbSBmb250LW5vcm1hbCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJpc01vbnRoRGlzYWJsZWQobW9udGguaW5kZXgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZm9jdXNdPVwiaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSA/ICdzZWxlY3RlZCcgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSBmb250LXNlbWlib2xkIHRleHQtZ3JheXNjYWxlLTAnOiBpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzTW9udGhTZWxlY3RlZChtb250aC5pbmRleCkgJiYgIWlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RNb250aChtb250aC5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbW9udGgua2V5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpICE9PSAnbW9udGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXItdCBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmFja1RvQ2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtYXJyb3ctbGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfYmFja190b19jYWxlbmRhcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFRpbWUgcGlja2VyIC0tPlxuICAgICAgICBAaWYgKHNob3dUaW1lUGlja2VyKCkpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0zIHB4LTQgcHktM1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci10XT1cInNob3dDYWxlbmRhcigpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLXNvbGlkXT1cInNob3dDYWxlbmRhcigpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCJzaG93Q2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3RpbWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8IS0tIEhvcmFzIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAjaW5jcmVhc2VIb3VyQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9pbmNyZW1lbnRfaG91cicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImluY3JlbWVudEhvdXJzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpbWVJbnB1dE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLXByaW1hcnkgZm9jdXM6b3V0bGluZS0xIGZvY3VzOm91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFkVGltZShkaXNwbGF5SG91cnMoKSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaG91cicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XStcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlSG91cnNLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJoYW5kbGVIb3Vyc0lucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kZWNyZW1lbnRfaG91cicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudEhvdXJzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tZG93biB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQteGwgZm9udC1ib2xkIHRleHQtZ3JheXNjYWxlLTYwXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjo8L3NwYW5cbiAgICAgICAgICAgICAgICA+XG5cbiAgICAgICAgICAgICAgICA8IS0tIE1pbnV0b3MgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2luY3JlbWVudF9taW51dGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRNaW51dGVzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpbWVJbnB1dE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXM6Ym9yZGVyLXByaW1hcnkgZm9jdXM6b3V0bGluZS0xIGZvY3VzOm91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFkVGltZShtaW51dGVzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21pbnV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XStcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlTWludXRlc0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZU1pbnV0ZXNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X21pbnV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlY3JlbWVudE1pbnV0ZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1kb3duIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd1NlY29uZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LWdyYXlzY2FsZS02MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjo8L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU2VndW5kb3MgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaW5jcmVtZW50X3NlY29uZCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRTZWNvbmRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJ0aW1lSW5wdXRNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC05IHctMTIgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTUgdGV4dC1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIG91dGxpbmUtbm9uZSBmb2N1czpib3JkZXItcHJpbWFyeSBmb2N1czpvdXRsaW5lLTEgZm9jdXM6b3V0bGluZS1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFkVGltZShzZWNvbmRzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWNvbmQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XStcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZVNlY29uZHNLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlU2Vjb25kc0lucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RlY3JlbWVudF9zZWNvbmQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50U2Vjb25kcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd24gdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBAaWYgKGlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWxldG9yIEFNL1BNIC0tPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTkgdy0xMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTUgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl90b2dnbGVfbWVyaWRpZW0nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQW1QbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYW1QbSgpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBSb2RhcMOpIGRlIGHDp8O1ZXMgLS0+XG4gICAgICAgIEBpZiAoc2hvd0J1dHRvbkJhcigpIHx8IG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItdCBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIj5cbiAgICAgICAgICAgICAgICBAaWYgKHNob3dCdXR0b25CYXIoKSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgPT09ICdkYXRlJyB8fCBtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUb2RheSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl90b2RheScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2xlYXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgYmctcHJpbWFyeSBweC0zIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS0wIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOm9wYWNpdHktOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29uZmlybSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jb25maXJtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXNtYWxsIGJnLXByaW1hcnkgcHgtMyBweS0xIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtMCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpvcGFjaXR5LTkwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY29uZmlybScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbiJdfQ==
|
|
1842
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZGF0ZXBpY2tlci9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQXFCLE1BQU0sc0JBQXNCLENBQUM7QUFDaEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFDSCxlQUFlLEVBQ2YsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBR0gsV0FBVyxFQUNYLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsU0FBUyxFQUNULG1CQUFtQixFQUduQixVQUFVLEdBQ2IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFvQyxNQUFNLHNCQUFzQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMs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QkFDSjt3REE0cURTLGtCQUFrQixNQVdsQixvQkFBb0IsTUFXcEIsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2RrVHJhcEZvY3VzLCBMaXZlQW5ub3VuY2VyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgQ2RrQ29ubmVjdGVkT3ZlcmxheSwgQ2RrT3ZlcmxheU9yaWdpbiwgQ29ubmVjdGVkUG9zaXRpb24gfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBEZXN0cm95UmVmLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgaW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIGlucHV0LFxuICAgIG1vZGVsLFxuICAgIE9uSW5pdCxcbiAgICBvdXRwdXQsXG4gICAgc2lnbmFsLFxuICAgIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge1xuICAgIEFic3RyYWN0Q29udHJvbCxcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOR19WQUxJREFUT1JTLFxuICAgIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIE5nQ29udHJvbCxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIFZhbGlkYXRpb25FcnJvcnMsXG4gICAgVmFsaWRhdG9yLFxuICAgIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZVNlZ21lbnRFbmdpbmUsIFNlZ21lbnRFbmdpbmVDb25maWcsIFNlZ21lbnRLaW5kIH0gZnJvbSAnLi9kYXRlLXNlZ21lbnQtaW5wdXQnO1xuaW1wb3J0IHsgZm9ybWF0VmFsdWVGb3JJbnB1dCwgaXNTYW1lRGF5LCBwYXJzZUlucHV0LCBzdHJpcFRpbWUgfSBmcm9tICcuL2RhdGUudXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhckRheSwgRGF0ZVBpY2tlck1vZGUsIERhdGVSYW5nZSB9IGZyb20gJy4vbW9kZWxzJztcblxudHlwZSBEYXRlcGlja2VyVmFsdWUgPSBEYXRlIHwgRGF0ZVJhbmdlIHwgRGF0ZVtdIHwgbnVsbDtcbnR5cGUgUGlja2VyVmlldyA9ICdjYWxlbmRhcicgfCAnbW9udGhzJyB8ICd5ZWFycyc7XG5cbmZ1bmN0aW9uIG51bWVyaWNLZXlzT25seSgpOiBNZXRob2REZWNvcmF0b3Ige1xuICAgIHJldHVybiAoX3RhcmdldCwgX2tleSwgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24gKHRoaXM6IHVua25vd24sIGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkS2V5ID1cbiAgICAgICAgICAgICAgICBbJ0Fycm93VXAnLCAnQXJyb3dEb3duJywgJ0JhY2tzcGFjZScsICdEZWxldGUnLCAnVGFiJ10uaW5jbHVkZXMoZXZlbnQua2V5KSB8fCAvXlxcZCQvLnRlc3QoZXZlbnQua2V5KTtcbiAgICAgICAgICAgIGlmICghaXNWYWxpZEtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsLmNhbGwodGhpcywgZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3MtZGF0ZXBpY2tlcicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nQ2xhc3MsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgQ2RrVHJhcEZvY3VzLFxuICAgICAgICBDZGtPdmVybGF5T3JpZ2luLFxuICAgICAgICBDZGtDb25uZWN0ZWRPdmVybGF5LFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZXM6IFtcbiAgICAgICAgYFxuICAgICAgICAgICAgOmhvc3Qge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5nLWludmFsaWQubmctZGlydHkgaW5wdXQge1xuICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5nLWludmFsaWQubmctZGlydHkgaW5wdXQ6Zm9jdXMge1xuICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgICAgICBvdXRsaW5lLWNvbG9yOiAjYzEzMDE4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOmhvc3QubmctaW52YWxpZC5uZy1kaXJ0eSBidXR0b25bdHlwZT0nYnV0dG9uJ10ge1xuICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDpob3N0Lm5vLWljb24gYnV0dG9uW3R5cGU9J2J1dHRvbiddIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOmhvc3Qubm8taWNvbiBpbnB1dCB7XG4gICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMC43NXJlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1dHRvblt0eXBlPSdidXR0b24nXTpmb2N1cy12aXNpYmxlIHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lOiAycHggc29saWQgIzQyOGJjYTtcbiAgICAgICAgICAgICAgICBvdXRsaW5lLW9mZnNldDogMXB4O1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3Mubm8taWNvbl0nOiAnIXNob3dJY29uKCknLFxuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IERhdGVwaWNrZXJDb21wb25lbnQsXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBEYXRlcGlja2VyQ29tcG9uZW50LFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3IsIE9uSW5pdCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaWRDb3VudGVyID0gMDtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEQVlTX0lOX1dFRUsgPSA3O1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1PTlRIU19JTl9ZRUFSID0gMTI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTU9OVEhTX1BFUl9ST1cgPSAzO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFlFQVJTX1BFUl9HUklEID0gMTI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgWUVBUlNfUEVSX1JPVyA9IDM7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NSU5VVEVfU1RFUCA9IDU7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0hPVVJTID0gMjQ7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX01JTlVURVMgPSA2MDtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIT1VSU19QRVJfTUVSSURJRU0gPSAxMjtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBET1VCTEVfQ0xJQ0tfVEhSRVNIT0xEX01TID0gNDAwO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmV4dElkKCk6IHN0cmluZyB7XG4gICAgICAgIERhdGVwaWNrZXJDb21wb25lbnQuaWRDb3VudGVyKys7XG4gICAgICAgIHJldHVybiBgcy1kYXRlcGlja2VyLSR7RGF0ZXBpY2tlckNvbXBvbmVudC5pZENvdW50ZXJ9YDtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgSW5wdXRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgLyoqIEhUTUwgYGlkYCBhcGxpY2FkbyBhbyBlbGVtZW50byBgPGlucHV0PmAuIEF1dG8tZ2VyYWRvIHF1YW5kbyBvbWl0aWRvLiAqL1xuICAgIHJlYWRvbmx5IGlucHV0SWQgPSBpbnB1dDxzdHJpbmc+KERhdGVwaWNrZXJDb21wb25lbnQubmV4dElkKCkpO1xuXG4gICAgLyoqIEF0cmlidXRvIGBuYW1lYCBkbyBgPGlucHV0PmAgbmF0aXZvLiAqL1xuICAgIHJlYWRvbmx5IG5hbWUgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgICAvKiogVGV4dG8gZXhpYmlkbyBxdWFuZG8gbmVuaHVtIHZhbG9yIGVzdMOhIHNlbGVjaW9uYWRvLiAqL1xuICAgIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogTW9kbyBkZSBzZWxlw6fDo28gZG8gY29tcG9uZW50ZS5cbiAgICAgKiAtIGAnZGF0ZSdgIOKAlCBzZWxlw6fDo28gZGUgZGF0YSDDum5pY2EgKHBhZHLDo28pXG4gICAgICogLSBgJ21vbnRoJ2Ag4oCUIHNlbGXDp8OjbyBkZSBtw6pzL2Fub1xuICAgICAqIC0gYCdkYXRldGltZSdgIOKAlCBkYXRhIGNvbSBob3JhIChyZXF1ZXIgY29uZmlybWHDp8OjbylcbiAgICAgKiAtIGAndGltZSdgIOKAlCBhcGVuYXMgc2VsZcOnw6NvIGRlIGhvcmFcbiAgICAgKiAtIGAncmFuZ2UnYCDigJQgaW50ZXJ2YWxvIGVudHJlIGR1YXMgZGF0YXNcbiAgICAgKi9cbiAgICByZWFkb25seSBtb2RlID0gaW5wdXQ8RGF0ZVBpY2tlck1vZGU+KCdkYXRlJyk7XG5cbiAgICAvKipcbiAgICAgKiBNb2RvIGRlIHNlbGXDp8OjbyBxdWFuZG8gYG1vZGVgIMOpIGAnZGF0ZSdgLlxuICAgICAqIC0gYCdzaW5nbGUnYCDigJQgc2VsZcOnw6NvIGRlIHVtYSDDum5pY2EgZGF0YSAocGFkcsOjbylcbiAgICAgKiAtIGAnbXVsdGlwbGUnYCDigJQgc2VsZcOnw6NvIGRlIG3Dumx0aXBsYXMgZGF0YXMgYXZ1bHNhc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlbGVjdGlvbk1vZGUgPSBpbnB1dDwnc2luZ2xlJyB8ICdtdWx0aXBsZSc+KCdzaW5nbGUnKTtcblxuICAgIC8qKiBTZXBhcmFkb3IgZXhpYmlkbyBlbnRyZSBhcyBkYXRhcyBubyBtb2RvIGBzZWxlY3Rpb25Nb2RlID0gJ211bHRpcGxlJ2AuICovXG4gICAgcmVhZG9ubHkgbXVsdGlwbGVTZXBhcmF0b3IgPSBpbnB1dDxzdHJpbmc+KCcsICcpO1xuXG4gICAgLyoqIFF1YW5kbyBgdHJ1ZWAsIGV4aWJlIG8gYm90w6NvIGRlIMOtY29uZSBhbyBsYWRvIGRvIGNhbXBvLiAqL1xuICAgIHJlYWRvbmx5IHNob3dJY29uID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBDbGFzc2UgZG8gw61jb25lIGV4aWJpZG8gbm8gYm90w6NvIGRvIGNhbXBvLlxuICAgICAqIFF1YW5kbyBgbW9kZWAgw6kgYCd0aW1lJ2AsIG8gcGFkcsOjbyBtdWRhIGF1dG9tYXRpY2FtZW50ZSBwYXJhIGAnZmFzIGZhLWNsb2NrJ2AuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaWNvbiA9IGlucHV0PHN0cmluZz4oJ2ZhcyBmYS1jYWxlbmRhcicpO1xuXG4gICAgLyoqIERhdGEgbcOtbmltYSBzZWxlY2lvbsOhdmVsLiBEaWFzL21lc2VzIGFudGVyaW9yZXMgZmljYW0gZGVzYWJpbGl0YWRvcy4gKi9cbiAgICByZWFkb25seSBtaW4gPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogRGF0YSBtw6F4aW1hIHNlbGVjaW9uw6F2ZWwuIERpYXMvbWVzZXMgcG9zdGVyaW9yZXMgZmljYW0gZGVzYWJpbGl0YWRvcy4gKi9cbiAgICByZWFkb25seSBtYXggPSBpbnB1dDxEYXRlIHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKiogRGF0YSBleGliaWRhIGFvIGFicmlyIG8gY2FsZW5kw6FyaW8gcXVhbmRvIG5lbmh1bWEgZGF0YSBlc3TDoSBzZWxlY2lvbmFkYS4gKi9cbiAgICByZWFkb25seSBkZWZhdWx0RGF0ZSA9IGlucHV0PERhdGUgfCBudWxsPihudWxsKTtcblxuICAgIC8qKlxuICAgICAqIEZvcm1hdG8gZGUgZXhpYmnDp8OjbyBkYSBkYXRhIG5vIGNhbXBvLiBRdWFuZG8gb21pdGlkbywgw6kgcmVzb2x2aWRvIGEgcGFydGlyIGRvXG4gICAgICogbG9jYWxlIGF0aXZvIChjaGF2ZSBgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVfZm9ybWF0YCksIGNvbSBmYWxsYmFjayBwYXJhIGBkZC9NTS95eXl5YC5cbiAgICAgKi9cbiAgICByZWFkb25seSBkYXRlRm9ybWF0ID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgLyoqXG4gICAgICogRm9ybWF0byBkZSBleGliacOnw6NvIGRhcyBob3JhczogYCcxMidgIG91IGAnMjQnYC4gUXVhbmRvIG9taXRpZG8sIMOpIHJlc29sdmlkbyBhIHBhcnRpclxuICAgICAqIGRvIGxvY2FsZSBhdGl2byAoY2hhdmUgYHBsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ob3VyX2Zvcm1hdGApLCBjb20gZmFsbGJhY2sgcGFyYSBgJzI0J2AuXG4gICAgICovXG4gICAgcmVhZG9ubHkgaG91ckZvcm1hdCA9IGlucHV0PCcxMicgfCAnMjQnIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgLyoqIEluY3JlbWVudG8gZW0gbWludXRvcyBhbyB1c2FyIGFzIHNldGFzIGRvIHRpbWUgcGlja2VyLiAqL1xuICAgIHJlYWRvbmx5IG1pbnV0ZVN0ZXAgPSBpbnB1dDxudW1iZXI+KERhdGVwaWNrZXJDb21wb25lbnQuREVGQVVMVF9NSU5VVEVfU1RFUCk7XG5cbiAgICAvKiogUXVhbmRvIGB0cnVlYCwgZXhpYmUgbyBjYW1wbyBkZSBzZWd1bmRvcyBubyB0aW1lIHBpY2tlci4gKi9cbiAgICByZWFkb25seSBzaG93U2Vjb25kcyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBTZXBhcmFkb3IgZXhpYmlkbyBlbnRyZSBhcyBkYXRhcyBubyBtb2RvIGAncmFuZ2UnYC4gKi9cbiAgICByZWFkb25seSByYW5nZVNlcGFyYXRvciA9IGlucHV0PHN0cmluZz4oJyDigJQgJyk7XG5cbiAgICAvKiogQWJyZSBvIHBhaW5lbCBhbyBmb2NhciBvIGlucHV0OyBmb2NvIHBlcm1hbmVjZSBubyBpbnB1dCwgbsOjbyBwdWxhIHBhcmEgbyBkcm9wZG93bi4gKi9cbiAgICByZWFkb25seSBzaG93T25Gb2N1cyA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgLyoqIEltcGVkZSBkaWdpdGHDp8OjbyBtYW51YWw7IHZhbG9yIHPDsyBwb2RlIHNlciBzZWxlY2lvbmFkbyBwZWxvIGNhbGVuZMOhcmlvLiAqL1xuICAgIHJlYWRvbmx5IHJlYWRvbmx5SW5wdXQgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgICAvKiogUHJpbWVpcm8gZGlhIGRhIHNlbWFuYSAoMCA9IGRvbWluZ28sIDEgPSBzZWd1bmRhLWZlaXJhLCAuLi4sIDYgPSBzw6FiYWRvKS4gKi9cbiAgICByZWFkb25seSBmaXJzdERheU9mV2VlayA9IGlucHV0PG51bWJlcj4oMCk7XG5cbiAgICAvKiogRXhpYmUvb2N1bHRhIGEgYmFycmEgZGUgYm90w7VlcyBIb2plIGUgTGltcGFyIG5vIHJvZGFww6kuICovXG4gICAgcmVhZG9ubHkgc2hvd0J1dHRvbkJhciA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gICAgLyoqIEV4aWJlIMOtY29uZSBkZSBsaW1wYXIgaW5saW5lIG5vIGNhbXBvIGRlIGlucHV0LiAqL1xuICAgIHJlYWRvbmx5IHNob3dDbGVhciA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBFeGliZSBkaWFzIGRlIG1lc2VzIGFkamFjZW50ZXMgbmEgZ3JhZGUgZG8gY2FsZW5kw6FyaW8uICovXG4gICAgcmVhZG9ubHkgc2hvd090aGVyTW9udGhzID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKiogUGVybWl0ZSBzZWxlY2lvbmFyIGRpYXMgZGUgbWVzZXMgYWRqYWNlbnRlcyBuYSBncmFkZSBkbyBjYWxlbmTDoXJpby4gKi9cbiAgICByZWFkb25seSBzZWxlY3RPdGhlck1vbnRocyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBGZWNoYSBvIHBhaW5lbCBhcMOzcyBzZWxlY2lvbmFyIHVtYSBkYXRhIG5vIG1vZG8gYGRhdGV0aW1lYC4gKi9cbiAgICByZWFkb25seSBoaWRlT25EYXRlVGltZVNlbGVjdCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBJbmNyZW1lbnRvIGRlIGhvcmFzIG5vIHRpbWUgcGlja2VyLiAqL1xuICAgIHJlYWRvbmx5IHN0ZXBIb3VyID0gaW5wdXQ8bnVtYmVyPigxKTtcblxuICAgIC8qKiBJbmNyZW1lbnRvIGRlIHNlZ3VuZG9zIG5vIHRpbWUgcGlja2VyLiAqL1xuICAgIHJlYWRvbmx5IHN0ZXBTZWNvbmQgPSBpbnB1dDxudW1iZXI+KDEpO1xuXG4gICAgLyoqIMONbmRpY2UgZGUgdGFiIGRvIGNhbXBvIGRlIGlucHV0LiAqL1xuICAgIHJlYWRvbmx5IHRhYmluZGV4ID0gaW5wdXQ8bnVtYmVyPigpO1xuXG4gICAgLyoqIEZvY2EgYXV0b21hdGljYW1lbnRlIG8gY2FtcG8gYW8gY2FycmVnYXIgbyBjb21wb25lbnRlLiAqL1xuICAgIHJlYWRvbmx5IGF1dG9mb2N1cyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKiBEYXRhcyBlc3BlY8OtZmljYXMgZGVzYWJpbGl0YWRhcyBubyBjYWxlbmTDoXJpby4gKi9cbiAgICByZWFkb25seSBkaXNhYmxlZERhdGVzID0gaW5wdXQ8RGF0ZVtdPihbXSk7XG5cbiAgICAvKiogRGlhcyBkYSBzZW1hbmEgZGVzYWJpbGl0YWRvcyAoMCA9IGRvbWluZ28sIC4uLiwgNiA9IHPDoWJhZG8pLiAqL1xuICAgIHJlYWRvbmx5IGRpc2FibGVkRGF5cyA9IGlucHV0PG51bWJlcltdPihbXSk7XG5cbiAgICAvLyDilIDilIAgVHdvLXdheSBtb2RlbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICAvKiogRXN0YWRvIGRlc2FiaWxpdGFkbyBkbyBjb21wb25lbnRlLiAqL1xuICAgIHJlYWRvbmx5IGRpc2FibGVkID0gbW9kZWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLy8g4pSA4pSAIE91dHB1dHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBjYW1wbyBwZXJkZSBvIGZvY28uICovXG4gICAgcmVhZG9ubHkgYmx1cnJlZCA9IG91dHB1dDxFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIGNhbXBvIHJlY2ViZSBvIGZvY28uICovXG4gICAgcmVhZG9ubHkgZm9jdXNlZCA9IG91dHB1dDxFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIGFvIHNlbGVjaW9uYXIgdW1hIGRhdGEsIG3DqnMsIGhvcsOhcmlvIG91IGludGVydmFsby4gKi9cbiAgICByZWFkb25seSBzZWxlY3RlZCA9IG91dHB1dDxEYXRlcGlja2VyVmFsdWU+KCk7XG5cbiAgICAvKiogRW1pdGlkbyBxdWFuZG8gbyBwYWluZWwgZG8gY2FsZW5kw6FyaW8gZmVjaGEuIEVtaXRlIG8gZWxlbWVudG8gZG8gcGFpbmVsLiAqL1xuICAgIHJlYWRvbmx5IGNsb3NlZCA9IG91dHB1dDxIVE1MRWxlbWVudD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIGFvIGNsaWNhciBubyBib3TDo28gXCJIb2plXCIuICovXG4gICAgcmVhZG9ubHkgdG9kYXlDbGljayA9IG91dHB1dDxEYXRlPigpO1xuXG4gICAgLyoqIEVtaXRpZG8gYW8gY2xpY2FyIG5vIGJvdMOjbyBcIkxpbXBhclwiIG91IG5vIMOtY29uZSBkZSBsaW1wYXIgaW5saW5lLiAqL1xuICAgIHJlYWRvbmx5IGNsZWFyQ2xpY2sgPSBvdXRwdXQ8TW91c2VFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0aWRvIHF1YW5kbyBvIG3DqnMgdmlzdWFsaXphZG8gbXVkYS4gKi9cbiAgICByZWFkb25seSBtb250aENoYW5nZSA9IG91dHB1dDx7IG1vbnRoOiBudW1iZXI7IHllYXI6IG51bWJlciB9PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gYW5vIHZpc3VhbGl6YWRvIG11ZGEuICovXG4gICAgcmVhZG9ubHkgeWVhckNoYW5nZSA9IG91dHB1dDx7IG1vbnRoOiBudW1iZXI7IHllYXI6IG51bWJlciB9PigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gcGFpbmVsIGRvIGNhbGVuZMOhcmlvIGFicmUuICovXG4gICAgcmVhZG9ubHkgc2hvdyA9IG91dHB1dDx2b2lkPigpO1xuXG4gICAgLyoqIEVtaXRpZG8gcXVhbmRvIG8gdXN1w6FyaW8gZGlnaXRhIG1hbnVhbG1lbnRlIG5vIGNhbXBvLiAqL1xuICAgIHJlYWRvbmx5IHZhbHVlSW5wdXQgPSBvdXRwdXQ8RXZlbnQ+KCk7XG5cbiAgICAvLyDilIDilIAgSW50ZXJuYWwgc3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4SG91cnMgPSBEYXRlcGlja2VyQ29tcG9uZW50Lk1BWF9IT1VSUztcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4TWludXRlcyA9IERhdGVwaWNrZXJDb21wb25lbnQuTUFYX01JTlVURVM7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVJbnB1dE1heExlbmd0aCA9IDI7XG5cbiAgICBwcm90ZWN0ZWQgaW5wdXREYXRlID0gJyc7XG5cbiAgICBwcm90ZWN0ZWQgbmdDb250cm9sOiBOZ0NvbnRyb2wgfCBudWxsID0gbnVsbDtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSB2YWx1ZSA9IHNpZ25hbDxEYXRlIHwgbnVsbD4obnVsbCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzT3BlbiA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzRm9jdXNlZCA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHZpZXdEYXRlID0gc2lnbmFsKG5ldyBEYXRlKCkpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwaWNrZXJWaWV3ID0gc2lnbmFsPFBpY2tlclZpZXc+KCdjYWxlbmRhcicpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBob3VycyA9IHNpZ25hbCgwKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWludXRlcyA9IHNpZ25hbCgwKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2Vjb25kcyA9IHNpZ25hbCgwKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmFuZ2VWYWx1ZSA9IHNpZ25hbDxEYXRlUmFuZ2UgfCBudWxsPihudWxsKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbXVsdGlwbGVWYWx1ZXMgPSBzaWduYWw8RGF0ZVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBlbmRpbmdSYW5nZVN0YXJ0ID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaG92ZXJEYXRlID0gc2lnbmFsPERhdGUgfCBudWxsPihudWxsKTtcbiAgICBwcml2YXRlIF9oYXNGb3JtYXRFcnJvciA9IGZhbHNlO1xuICAgIHByaXZhdGUgb25WYWxpZGF0b3JDaGFuZ2U6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9wdXBQYW5lbCA9IHZpZXdDaGlsZCgncG9wdXBQYW5lbCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluY3JlYXNlSG91ckJ1dHRvbiA9IHZpZXdDaGlsZCgnaW5jcmVhc2VIb3VyQnV0dG9uJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWNvbkJ1dHRvbiA9IHZpZXdDaGlsZCgnaWNvbkJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyaWdnZXJJbnB1dCA9IHZpZXdDaGlsZC5yZXF1aXJlZCgndHJpZ2dlcklucHV0JywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaG9zdEVsZW1lbnQgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpdmVBbm5vdW5jZXIgPSBpbmplY3QoTGl2ZUFubm91bmNlcik7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRMYW5nID0gc2lnbmFsKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyk7XG5cbiAgICAvKiogUmVmbGV0ZSBgKHBvaW50ZXI6IGNvYXJzZSlgIOKAlCBkaXNwb3NpdGl2b3MgdG91Y2ggcHJlZmVyZW0gbyBwb3B1cCBkbyBjYWxlbmTDoXJpbyBhbyB0ZWNsYWRvLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1RvdWNoRGV2aWNlID0gc2lnbmFsKFxuICAgICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lm1hdGNoTWVkaWEgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gd2luZG93Lm1hdGNoTWVkaWEoJyhwb2ludGVyOiBjb2Fyc2UpJykubWF0Y2hlc1xuICAgICAgICAgICAgOiBmYWxzZSxcbiAgICApO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZWdtZW50RW5naW5lID0gbmV3IERhdGVTZWdtZW50RW5naW5lKCk7XG4gICAgLyoqIEVsZW1lbnRvIHF1ZSB0aW5oYSBmb2NvIGFudGVzIGRvIHBhaW5lbCBhYnJpciDigJQgdmVyIGBjYXB0dXJlRm9jdXNPcmlnaW5gL2BjbG9zZVBhbmVsYC4gKi9cbiAgICBwcml2YXRlIGVsZW1lbnRUb1Jlc3RvcmVGb2N1c1RvOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIC8qKiBgdHJ1ZWAgc8OzIGR1cmFudGUgbyBgLmZvY3VzKClgIHByb2dyYW3DoXRpY28gZGUgcmVzdGF1cmHDp8OjbyBlbSBgY2xvc2VQYW5lbCgpYCDigJQgZXZpdGEgcXVlXG4gICAgICogIGBoYW5kbGVJbnB1dEZvY3VzYCBpbnRlcnByZXRlIGVzc2UgZm9jbyBjb21vIHVtIGZvY28gZ2VudcOtbm8gZG8gdXN1w6FyaW8gZSByZWFicmEgbyBwYWluZWxcbiAgICAgKiAgbmEgaG9yYSB2aWEgYHNob3dPbkZvY3VzYCAoZXguOiBzZWxlY2lvbmFyIHVtYSBkYXRhIGRldm9sdmUgbyBmb2NvIHBybyBpbnB1dCwgcXVlIHNlbsOjb1xuICAgICAqICByZWFicmlyaWEgbyBwYWluZWwgaW1lZGlhdGFtZW50ZSBkZXBvaXMgZGUgZmVjaMOhLWxvKS4gKi9cbiAgICBwcml2YXRlIGlzUmVzdG9yaW5nRm9jdXNPbkNsb3NlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBsYXN0U2VnbWVudENvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgbWVhc3VyZUNhbnZhcz86IEhUTUxDYW52YXNFbGVtZW50O1xuICAgIC8qKiBJbmNyZW1lbnRhZG8gYSBjYWRhIG11dGHDp8OjbyBkbyB1c3XDoXJpbyDigJQgaW52YWxpZGEgY2FsbGJhY2tzIGRlIGNsaXF1ZS9mb2NvIGFkaWFkb3MgcXVlIGZpY2FyYW0gb2Jzb2xldG9zLiAqL1xuICAgIHByaXZhdGUgaW50ZXJhY3Rpb25HZW5lcmF0aW9uID0gMDtcbiAgICAvKiogYHRpbWVTdGFtcGAgZG8gw7psdGltbyBtb3VzZWRvd24gbm8gaW5wdXQgc2VnbWVudGFkbyDigJQgdXNhZG8gcHJhIGRldGVjdGFyIGR1cGxvIGNsaXF1ZSBuYSBtw6NvLiAqL1xuICAgIHByaXZhdGUgbGFzdE1vdXNlRG93bkF0ID0gMDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uub25MYW5nQ2hhbmdlLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmcuc2V0KGV2ZW50LmxhbmcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5tYXRjaE1lZGlhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBtZWRpYVF1ZXJ5ID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwb2ludGVyOiBjb2Fyc2UpJyk7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVQb2ludGVyQ2hhbmdlID0gKGV2ZW50OiBNZWRpYVF1ZXJ5TGlzdEV2ZW50KTogdm9pZCA9PiB0aGlzLmlzVG91Y2hEZXZpY2Uuc2V0KGV2ZW50Lm1hdGNoZXMpO1xuICAgICAgICAgICAgbWVkaWFRdWVyeS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVQb2ludGVyQ2hhbmdlKTtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gbWVkaWFRdWVyeS5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBoYW5kbGVQb2ludGVyQ2hhbmdlKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIAgQ29tcHV0ZWQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRJY29uID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMubW9kZSgpID09PSAndGltZScgPyAnZmFzIGZhLWNsb2NrJyA6IHRoaXMuaWNvbigpKSk7XG5cbiAgICAvKiogYGRhdGVGb3JtYXRgIGV4cGzDrWNpdG8gb3UgcmVzb2x2aWRvIGEgcGFydGlyIGRvIGxvY2FsZSBhdGl2byAoZmFsbGJhY2sgYGRkL01NL3l5eXlgKS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWREYXRlRm9ybWF0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRMYW5nKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmRhdGVGb3JtYXQoKSA/P1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlVHJhbnNsYXRlZE9yRGVmYXVsdCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVfZm9ybWF0JywgJ2RkL01NL3l5eXknKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgLyoqIGBob3VyRm9ybWF0YCBleHBsw61jaXRvIG91IHJlc29sdmlkbyBhIHBhcnRpciBkbyBsb2NhbGUgYXRpdm8gKGZhbGxiYWNrIGAnMjQnYCkuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc29sdmVkSG91ckZvcm1hdCA9IGNvbXB1dGVkPCcxMicgfCAnMjQnPigoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudExhbmcoKTtcbiAgICAgICAgY29uc3QgZXhwbGljaXQgPSB0aGlzLmhvdXJGb3JtYXQoKTtcbiAgICAgICAgaWYgKGV4cGxpY2l0KSByZXR1cm4gZXhwbGljaXQ7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnJlc29sdmVUcmFuc2xhdGVkT3JEZWZhdWx0KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuaG91cl9mb3JtYXQnLCAnMjQnKTtcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZWQgPT09ICcxMicgPyAnMTInIDogJzI0JztcbiAgICB9KTtcblxuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNFR01FTlRfTEFCRUxfS0VZUzogUmVjb3JkPFNlZ21lbnRLaW5kLCBzdHJpbmc+ID0ge1xuICAgICAgICBkYXk6ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWdtZW50X2RheScsXG4gICAgICAgIG1vbnRoOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VnbWVudF9tb250aCcsXG4gICAgICAgIHllYXI6ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWdtZW50X3llYXInLFxuICAgICAgICBob3VyOiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaG91cicsXG4gICAgICAgIG1pbnV0ZTogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21pbnV0ZScsXG4gICAgICAgIHNlY29uZDogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlY29uZCcsXG4gICAgICAgIGFtcG06ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWdtZW50X2FtcG0nLFxuICAgIH07XG5cbiAgICAvKiogTW9kb3MgY3VqbyBmb3JtYXRvIGRlIGV4aWJpw6fDo28gw6kgcmVzb2x2aWRvIHBlbGEgZW5naW5lIGRlIHNlZ21lbnRvcyAoaW5kZXBlbmRlbnRlIGRlIHRvdWNoL3JlYWRvbmx5KS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNTZWdtZW50TW9kZUNhbmRpZGF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aXBsZU1vZGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBtb2RlID0gdGhpcy5tb2RlKCk7XG4gICAgICAgIHJldHVybiBtb2RlID09PSAnZGF0ZScgfHwgbW9kZSA9PT0gJ21vbnRoJyB8fCBtb2RlID09PSAndGltZScgfHwgbW9kZSA9PT0gJ2RhdGV0aW1lJztcbiAgICB9KTtcblxuICAgIC8qKiBJbnRlcmF0aXZpZGFkZSBkZSBkaWdpdGHDp8OjbyBwb3Igc2VnbWVudG8g4oCUIGRlc2xpZ2FkYSBlbSB0b3VjaCBvdSBxdWFuZG8gYHJlYWRvbmx5SW5wdXRgIMOpIHVzYWRvLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1NlZ21lbnRlZE1vZGUgPSBjb21wdXRlZChcbiAgICAgICAgKCkgPT4gdGhpcy5pc1NlZ21lbnRNb2RlQ2FuZGlkYXRlKCkgJiYgIXRoaXMuaXNUb3VjaERldmljZSgpICYmICF0aGlzLnJlYWRvbmx5SW5wdXQoKSxcbiAgICApO1xuXG4gICAgLyoqIEluZGljYSBzZSBvIHRpbWUgcGlja2VyIGRldmUgdXNhciBvIGZvcm1hdG8gZGUgMTIgaG9yYXMgY29tIHNlbGV0b3IgQU0vUE0uICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzMTJIb3VyRm9ybWF0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5yZXNvbHZlZEhvdXJGb3JtYXQoKSA9PT0gJzEyJyk7XG5cbiAgICAvKiogSG9yYSBleGliaWRhIG5vIHRpbWUgcGlja2VyOiAx4oCTMTIgbm8gZm9ybWF0byAxMmgsIDDigJMyMyBubyBmb3JtYXRvIDI0aC4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcGxheUhvdXJzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kaXNwbGF5SG91ckZvcih0aGlzLmhvdXJzKCkpKTtcblxuICAgIC8qKiBNZXJpZGlhbm8gYXR1YWwgZGVyaXZhZG8gZGEgaG9yYSBpbnRlcm5hICgw4oCTMjMpLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBhbVBtID0gY29tcHV0ZWQ8J0FNJyB8ICdQTSc+KCgpID0+IHRoaXMubWVyaWRpZW1Gb3IodGhpcy5ob3VycygpKSk7XG5cbiAgICBwcml2YXRlIGRpc3BsYXlIb3VyRm9yKGhvdXJzMjQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5pczEySG91ckZvcm1hdCgpKSByZXR1cm4gaG91cnMyNDtcbiAgICAgICAgY29uc3QgaDEyID0gaG91cnMyNCAlIERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICByZXR1cm4gaDEyID09PSAwID8gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU0gOiBoMTI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtZXJpZGllbUZvcihob3VyczI0OiBudW1iZXIpOiAnQU0nIHwgJ1BNJyB7XG4gICAgICAgIHJldHVybiBob3VyczI0IDwgRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU0gPyAnQU0nIDogJ1BNJztcbiAgICB9XG5cbiAgICAvKiogVGV4dG8gKGNvbSBBTS9QTSBxdWFuZG8gYXBsaWPDoXZlbCkgZGEgaG9yYSBkZSBkZXN0aW5vIGRvIGJvdMOjbyBcImF1bWVudGFyXCIvXCJkaW1pbnVpciBob3JhXCJcbiAgICAgKiAg4oCUIG1lc21hIG1vdGl2YcOnw6NvIGRlIGBwcmV2TW9udGhUYXJnZXRgL2BuZXh0TW9udGhUYXJnZXRgL2BwcmV2WWVhclRhcmdldGAvYG5leHRZZWFyVGFyZ2V0YDpcbiAgICAgKiAgc2VtIGlzc28sIG8gYm90w6NvIHPDsyBkaXogXCJhdW1lbnRhciBob3JhXCIsIHNlbSBkaXplciBxdWFsIGhvcmEgdmFpIHJlc3VsdGFyLiAqL1xuICAgIHByaXZhdGUgZm9ybWF0SG91clRhcmdldChob3VyczI0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwYWRkZWQgPSB0aGlzLnBhZFRpbWUodGhpcy5kaXNwbGF5SG91ckZvcihob3VyczI0KSk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzMTJIb3VyRm9ybWF0KCkgPyBgJHtwYWRkZWR9ICR7dGhpcy5tZXJpZGllbUZvcihob3VyczI0KX1gIDogcGFkZGVkO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2SG91clRhcmdldCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMuZm9ybWF0SG91clRhcmdldCgodGhpcy5ob3VycygpIC0gdGhpcy5zdGVwSG91cigpICsgdGhpcy5tYXhIb3VycykgJSB0aGlzLm1heEhvdXJzKSxcbiAgICApO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0SG91clRhcmdldCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMuZm9ybWF0SG91clRhcmdldCgodGhpcy5ob3VycygpICsgdGhpcy5zdGVwSG91cigpKSAlIHRoaXMubWF4SG91cnMpLFxuICAgICk7XG5cbiAgICAvKiogTWVzbWEgbW90aXZhw6fDo28sIHBhcmEgb3MgYm90w7VlcyBkZSBtaW51dG8vc2VndW5kby9BTS1QTS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldk1pbnV0ZVRhcmdldCA9IGNvbXB1dGVkKCgpID0+XG4gICAgICAgIHRoaXMucGFkVGltZSgodGhpcy5taW51dGVzKCkgLSB0aGlzLm1pbnV0ZVN0ZXAoKSArIHRoaXMubWF4TWludXRlcykgJSB0aGlzLm1heE1pbnV0ZXMpLFxuICAgICk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRNaW51dGVUYXJnZXQgPSBjb21wdXRlZCgoKSA9PlxuICAgICAgICB0aGlzLnBhZFRpbWUoKHRoaXMubWludXRlcygpICsgdGhpcy5taW51dGVTdGVwKCkpICUgdGhpcy5tYXhNaW51dGVzKSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZTZWNvbmRUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnBhZFRpbWUoKHRoaXMuc2Vjb25kcygpIC0gdGhpcy5zdGVwU2Vjb25kKCkgKyA2MCkgJSA2MCkpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0U2Vjb25kVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5wYWRUaW1lKCh0aGlzLnNlY29uZHMoKSArIHRoaXMuc3RlcFNlY29uZCgpKSAlIDYwKSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmV4dE1lcmlkaWVtVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuYW1QbSgpID09PSAnQU0nID8gJ1BNJyA6ICdBTScpKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBwb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW10gPSBbXG4gICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2JvdHRvbScsIG92ZXJsYXlYOiAnc3RhcnQnLCBvdmVybGF5WTogJ3RvcCcsIG9mZnNldFk6IDQgfSxcbiAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnYm90dG9tJywgb2Zmc2V0WTogLTQgfSxcbiAgICBdO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvcHVwSWQgPSBjb21wdXRlZCgoKSA9PiBgJHt0aGlzLmlucHV0SWQoKX0tcG9wdXBgKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBjdXJyZW50TW9udGhJbmRleCA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmlld0RhdGUoKS5nZXRNb250aCgpKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3VycmVudFllYXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnZpZXdEYXRlKCkuZ2V0RnVsbFllYXIoKSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN1cnJlbnRNb250aEtleSA9IGNvbXB1dGVkKCgpID0+IHRoaXMubW9udGhLZXlzW3RoaXMuY3VycmVudE1vbnRoSW5kZXgoKV0pO1xuXG4gICAgLyoqIEFubyBkZSBkZXN0aW5vIGRvIGJvdMOjbyBcImFubyBhbnRlcmlvclwiL1wicHLDs3hpbW8gYW5vXCIgKHZpZXcgZGUgbWVzZXMpIOKAlCBwcm8gYXJpYS1sYWJlbFxuICAgICAqICBhbnVuY2lhciBwcmEgb25kZSBvIGJvdMOjbyB2YWksIGrDoSBxdWUgXCJBbm8gYW50ZXJpb3JcIiBzb3ppbmhvIG7Do28gZGl6IHF1YWwgYW5vIMOpIGVzc2UuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByZXZZZWFyVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jdXJyZW50WWVhcigpIC0gMSk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5leHRZZWFyVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jdXJyZW50WWVhcigpICsgMSk7XG5cbiAgICAvKiogTcOqcy9hbm8gZGUgZGVzdGlubyBkbyBib3TDo28gXCJtw6pzIGFudGVyaW9yXCIvXCJwcsOzeGltbyBtw6pzXCIgKHZpZXcgZGUgY2FsZW5kw6FyaW8pIOKAlCBtZXNtYVxuICAgICAqICBtb3RpdmHDp8OjbyBkZSBgcHJldlllYXJUYXJnZXRgL2BuZXh0WWVhclRhcmdldGA6IFwiTcOqcyBhbnRlcmlvclwiIHNvemluaG8gbsOjbyBkaXogcXVhbCBtw6pzIMOpXG4gICAgICogIGVzc2UsIGUgY3J1emFyIGEgZnJvbnRlaXJhIGRvIGFubyAoZXguOiBqYW5laXJvIOKGkiBkZXplbWJybyBkbyBhbm8gYW50ZXJpb3IpIHRvcm5hcmlhIGVzc2FcbiAgICAgKiAgZmFsdGEgZGUgY29udGV4dG8gYWluZGEgbWFpcyBjb25mdXNhIHNlbSBvIGFubyBqdW50by4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldk1vbnRoVGFyZ2V0ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCksIHZpZXcuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgICAgICByZXR1cm4gdGFyZ2V0LnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmN1cnJlbnRMYW5nKCksIHsgbW9udGg6ICdsb25nJywgeWVhcjogJ251bWVyaWMnIH0pO1xuICAgIH0pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0TW9udGhUYXJnZXQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSwgdmlldy5nZXRNb250aCgpICsgMSwgMSk7XG4gICAgICAgIHJldHVybiB0YXJnZXQudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuY3VycmVudExhbmcoKSwgeyBtb250aDogJ2xvbmcnLCB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvd0NhbGVuZGFyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb2RlKCkgIT09ICd0aW1lJyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dUaW1lUGlja2VyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5tb2RlKCkgPT09ICdkYXRldGltZScgfHwgdGhpcy5tb2RlKCkgPT09ICd0aW1lJyk7XG5cbiAgICAvKiogU2VsZcOnw6NvIG3Dumx0aXBsYSBhdGl2YTogYXBlbmFzIG5vIG1vZG8gYGRhdGVgIGNvbSBgc2VsZWN0aW9uTW9kZSA9ICdtdWx0aXBsZSdgLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc011bHRpcGxlTW9kZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0aW9uTW9kZSgpID09PSAnbXVsdGlwbGUnICYmIHRoaXMubW9kZSgpID09PSAnZGF0ZScpO1xuXG4gICAgLyoqIEluc3RydcOnw6NvIGxpZGEganVudG8gZG8gcsOzdHVsbyBkYSBncmFkZSBkZSBkaWFzIOKAlCBjYWRhIG1vZG8gY29tIHNlbcOibnRpY2EgZGUgc2VsZcOnw6NvIG7Do29cbiAgICAgKiAgw7NidmlhIChtw7psdGlwbGEsIGludGVydmFsbykgZ2FuaGEgdW1hIGZyYXNlIHByw7NwcmlhOyBgcmFuZ2VgIGFpbmRhIHNlIGRpdmlkZSBlbSBkdWFzIGZhc2VzXG4gICAgICogIChlc2NvbGhlbmRvIGluw61jaW8gdnMuIGrDoSBjb20gYHBlbmRpbmdSYW5nZVN0YXJ0YCwgZXNjb2xoZW5kbyBmaW0pLiAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjYWxlbmRhckdyaWRBcmlhTGFiZWxLZXkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlwbGVNb2RlKCkpIHJldHVybiAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfY2FsZW5kYXJfbGFiZWxfbXVsdGlwbGUnO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KClcbiAgICAgICAgICAgICAgICA/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jYWxlbmRhcl9sYWJlbF9yYW5nZV9wZW5kaW5nJ1xuICAgICAgICAgICAgICAgIDogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NhbGVuZGFyX2xhYmVsX3JhbmdlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NhbGVuZGFyX2xhYmVsJztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBvcmRlcmVkV2Vla0RheUtleXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5maXJzdERheU9mV2VlaygpO1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMud2Vla0RheUtleXMuc2xpY2Uoc3RhcnQpLCAuLi50aGlzLndlZWtEYXlLZXlzLnNsaWNlKDAsIHN0YXJ0KV07XG4gICAgfSk7XG5cbiAgICAvKiogQ2llbnRlIGRhIGZhc2UgZGUgc2VsZcOnw6NvIGVtIGByYW5nZWA6IGVucXVhbnRvIG7Do28gaMOhIGBwZW5kaW5nUmFuZ2VTdGFydGAsIMOpIGEgbWVzbWEgY2hhdmVcbiAgICAgKiAgZGUgc2VtcHJlIChcInNlbGVjaW9uYXIgaW50ZXJ2YWxvXCIpOyBkZXBvaXMgZG8gcHJpbWVpcm8gY2xpcXVlLCBtdWRhIHByYSB1bWEgY2hhdmUgcXVlIGNpdGFcbiAgICAgKiAgYSBkYXRhIGluaWNpYWwgasOhIGVzY29saGlkYSwgasOhIHF1ZSByZWFicmlyL3JlZW50cmFyIG5vIGRpw6Fsb2dvIG5lc3NlIG1laW8tdGVtcG8gbsOjbyBkYXZhXG4gICAgICogIG5lbmh1bWEgcGlzdGEgZGUgcXVlIGEgc2VndW5kYSBtZXRhZGUgZG8gZmx1eG8gZXJhIGEgcXVlIGZhbHRhdmEuICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpYWxvZ0FyaWFMYWJlbEtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpICE9PSAncmFuZ2UnKSByZXR1cm4gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9kYXRlJztcbiAgICAgICAgcmV0dXJuIHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKVxuICAgICAgICAgICAgPyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VsZWN0X3JhbmdlX2VuZCdcbiAgICAgICAgICAgIDogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9yYW5nZSc7XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlhbG9nQXJpYUxhYmVsUGFyYW1zID0gY29tcHV0ZWQ8eyBkYXRlPzogc3RyaW5nIH0+KCgpID0+IHtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmcgPyB7IGRhdGU6IHRoaXMuZm9ybWF0RGF5QXJpYUxhYmVsKHBlbmRpbmcpIH0gOiB7fTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSByYW5nZVN0YXR1c0VsZW1lbnRJZCA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMuaW5wdXRJZCgpfS1yYW5nZS1zdGF0dXNgKTtcblxuICAgIC8qKiBUZXh0byBkbyBgPHNwYW4+YCBgc3Itb25seWAgcmVmZXJlbmNpYWRvIHBvciBgYXJpYS1kZXNjcmliZWRieWAgbm8gYDxpbnB1dD5gIOKAlCBkw6EgYW8gY2FtcG9cbiAgICAgKiAgdW0gY29udGXDumRvIHBlcnNpc3RlbnRlIGUgYWNlc3PDrXZlbCBlbnF1YW50byBzw7MgYSBkYXRhIGluaWNpYWwgZG8gaW50ZXJ2YWxvIGZvaSBlc2NvbGhpZGEsXG4gICAgICogIGrDoSBxdWUgYGlucHV0RGF0ZWAgc8OzIHJlZmxldGUgbyB2YWxvciBjb21wbGV0byBkZXBvaXMgZGEgc2VndW5kYSBlc2NvbGhhIChhIGF0dWFsaXphw6fDo29cbiAgICAgKiAgcGFyY2lhbCBlbSBgc2VsZWN0RGF0ZSgpYCBjb2JyZSBvIHRleHRvIHZpc8OtdmVsOyBpc3RvIGNvYnJlIG8gcXVlIHVtIGxlaXRvciBkZSB0ZWxhIGzDqiBhb1xuICAgICAqICBmb2Nhci9yZWxlciBvIGNhbXBvKS4gVXNhIGBhcmlhLWRlc2NyaWJlZGJ5YCwgbsOjbyBgYXJpYS1sYWJlbGAsIHByYSBzw7MgQUNSRVNDRU5UQVJcbiAgICAgKiAgaW5mb3JtYcOnw6NvIHNlbSBzb2JyZXNjcmV2ZXIgbyBub21lIGFjZXNzw612ZWwgcXVlIGludGVncmHDp8O1ZXMgKGR5bmFtaWMtZm9ybSwgc2hvd2Nhc2UpXG4gICAgICogIGrDoSBjb250cm9sYW0gcG9yIGZvcmEgZG8gY29tcG9uZW50ZS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmFuZ2VQZW5kaW5nU3RhdHVzVGV4dCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpICE9PSAncmFuZ2UnKSByZXR1cm4gJyc7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0KCk7XG4gICAgICAgIHJldHVybiBwZW5kaW5nID8gdGhpcy5idWlsZFJhbmdlU3RhcnRTZWxlY3RlZFRleHQocGVuZGluZykgOiAnJztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBwbGFjZWhvbGRlcktleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMubW9kZSgpO1xuICAgICAgICByZXR1cm4gYHBsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3BsYWNlaG9sZGVyXyR7bW9kZX1gO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGVmZmVjdGl2ZVJhbmdlID0gY29tcHV0ZWQoKCk6IHsgc3RhcnQ6IERhdGUgfCBudWxsOyBlbmQ6IERhdGUgfCBudWxsIH0gPT4ge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpO1xuICAgICAgICBjb25zdCBob3ZlciA9IHRoaXMuaG92ZXJEYXRlKCk7XG4gICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgICBpZiAoaG92ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSBwZW5kaW5nLmdldFRpbWUoKSA8PSBob3Zlci5nZXRUaW1lKCkgPyBbcGVuZGluZywgaG92ZXJdIDogW2hvdmVyLCBwZW5kaW5nXTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogcGVuZGluZywgZW5kOiBudWxsIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmFuZ2VWYWx1ZSgpID8/IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhbGVuZGFyV2Vla3MgPSBjb21wdXRlZCgoKTogQ2FsZW5kYXJEYXlbXVtdID0+IHtcbiAgICAgICAgY29uc3QgeWVhciA9IHRoaXMuY3VycmVudFllYXIoKTtcbiAgICAgICAgY29uc3QgbW9udGggPSB0aGlzLmN1cnJlbnRNb250aEluZGV4KCk7XG4gICAgICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5lZmZlY3RpdmVSYW5nZSgpO1xuICAgICAgICBjb25zdCByYW5nZVN0YXJ0VGltZSA9IHJhbmdlLnN0YXJ0ID8gc3RyaXBUaW1lKHJhbmdlLnN0YXJ0KSA6IG51bGw7XG4gICAgICAgIGNvbnN0IHJhbmdlRW5kVGltZSA9IHJhbmdlLmVuZCA/IHN0cmlwVGltZShyYW5nZS5lbmQpIDogbnVsbDtcblxuICAgICAgICBjb25zdCBmaXJzdERheU9mTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0V2Vla0RheSA9IGZpcnN0RGF5T2ZNb250aC5nZXREYXkoKTtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWRTdGFydERheSA9IChzdGFydFdlZWtEYXkgLSB0aGlzLmZpcnN0RGF5T2ZXZWVrKCkgKyA3KSAlIDc7XG4gICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKCk7XG4gICAgICAgIGNvbnN0IGRheXNJblByZXZNb250aCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAwKS5nZXREYXRlKCk7XG5cbiAgICAgICAgY29uc3QgYWxsRGF5czogQ2FsZW5kYXJEYXlbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSBhZGp1c3RlZFN0YXJ0RGF5IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheXNJblByZXZNb250aCAtIGkpO1xuICAgICAgICAgICAgYWxsRGF5cy5wdXNoKHRoaXMuYnVpbGRDYWxlbmRhckRheShkYXRlLCBmYWxzZSwgdG9kYXksIHNlbGVjdGVkLCByYW5nZSwgcmFuZ2VTdGFydFRpbWUsIHJhbmdlRW5kVGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgZCA9IDE7IGQgPD0gZGF5c0luTW9udGg7IGQrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkKTtcbiAgICAgICAgICAgIGFsbERheXMucHVzaCh0aGlzLmJ1aWxkQ2FsZW5kYXJEYXkoZGF0ZSwgdHJ1ZSwgdG9kYXksIHNlbGVjdGVkLCByYW5nZSwgcmFuZ2VTdGFydFRpbWUsIHJhbmdlRW5kVGltZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxDZWxscyA9XG4gICAgICAgICAgICBNYXRoLmNlaWwoYWxsRGF5cy5sZW5ndGggLyBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSykgKiBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSztcbiAgICAgICAgbGV0IG5leHREYXkgPSAxO1xuICAgICAgICB3aGlsZSAoYWxsRGF5cy5sZW5ndGggPCB0b3RhbENlbGxzKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCBuZXh0RGF5KTtcbiAgICAgICAgICAgIG5leHREYXkrKztcbiAgICAgICAgICAgIGFsbERheXMucHVzaCh0aGlzLmJ1aWxkQ2FsZW5kYXJEYXkoZGF0ZSwgZmFsc2UsIHRvZGF5LCBzZWxlY3RlZCwgcmFuZ2UsIHJhbmdlU3RhcnRUaW1lLCByYW5nZUVuZFRpbWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdlZWtzOiBDYWxlbmRhckRheVtdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxEYXlzLmxlbmd0aDsgaSArPSBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSykge1xuICAgICAgICAgICAgd2Vla3MucHVzaChhbGxEYXlzLnNsaWNlKGksIGkgKyBEYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3ZWVrcztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtb250aHNHcmlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCByb3dzOiB7IGtleTogc3RyaW5nOyBpbmRleDogbnVtYmVyIH1bXVtdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRGF0ZXBpY2tlckNvbXBvbmVudC5NT05USFNfSU5fWUVBUjsgaSArPSBEYXRlcGlja2VyQ29tcG9uZW50Lk1PTlRIU19QRVJfUk9XKSB7XG4gICAgICAgICAgICByb3dzLnB1c2goW1xuICAgICAgICAgICAgICAgIHsga2V5OiB0aGlzLm1vbnRoS2V5c1tpXSwgaW5kZXg6IGkgfSxcbiAgICAgICAgICAgICAgICB7IGtleTogdGhpcy5tb250aEtleXNbaSArIDFdLCBpbmRleDogaSArIDEgfSxcbiAgICAgICAgICAgICAgICB7IGtleTogdGhpcy5tb250aEtleXNbaSArIDJdLCBpbmRleDogaSArIDIgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgIH0pO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGN1cnJlbnREZWNhZGVTdGFydCA9IGNvbXB1dGVkKCgpID0+IE1hdGguZmxvb3IodGhpcy5jdXJyZW50WWVhcigpIC8gMTApICogMTApO1xuXG4gICAgLyoqIEludGVydmFsbyBkZSBkZXN0aW5vIGRvIGJvdMOjbyBcImTDqWNhZGEgYW50ZXJpb3JcIi9cInByw7N4aW1hIGTDqWNhZGFcIiAodmlldyBkZSBhbm9zKSDigJQgbWVzbWFcbiAgICAgKiAgbW90aXZhw6fDo28gZGUgYHByZXZZZWFyVGFyZ2V0YC9gbmV4dFllYXJUYXJnZXRgLiBgbmF2aWdhdGVQcmV2YC9gbmF2aWdhdGVOZXh0YCBkZXNsb2NhbVxuICAgICAqICBgdmlld0RhdGVgIGVtIMKxMTAgYW5vcyAobsOjbyDCsTEyKSBuZXNzYSB2aWV3OyBvIGdyaWQgZXhpYmlkbyDDqSBxdWUgbW9zdHJhIDEyIGFub3MgcG9yXG4gICAgICogIHDDoWdpbmEgKHZlciBgeWVhcnNHcmlkYCkg4oCUIGRhw60gbyBpbnRlcnZhbG8gaXIgZGUgYGN1cnJlbnREZWNhZGVTdGFydCgpIMKxIDEwYCBhdMOpXG4gICAgICogIGArIDExYCBwcmEgYmF0ZXIgZXhhdGFtZW50ZSBjb20gYSBww6FnaW5hIHF1ZSBvIGNsaXF1ZSByZWFsbWVudGUgYWJyZS4gKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJldkRlY2FkZVJhbmdlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCkgLSAxMDtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnRZZWFyOiBzdGFydCwgZW5kWWVhcjogc3RhcnQgKyAxMSB9O1xuICAgIH0pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0RGVjYWRlUmFuZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5jdXJyZW50RGVjYWRlU3RhcnQoKSArIDEwO1xuICAgICAgICByZXR1cm4geyBzdGFydFllYXI6IHN0YXJ0LCBlbmRZZWFyOiBzdGFydCArIDExIH07XG4gICAgfSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgeWVhcnNHcmlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCk7XG4gICAgICAgIGNvbnN0IHJvd3M6IG51bWJlcltdW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBEYXRlcGlja2VyQ29tcG9uZW50LllFQVJTX1BFUl9HUklEOyBpICs9IERhdGVwaWNrZXJDb21wb25lbnQuWUVBUlNfUEVSX1JPVykge1xuICAgICAgICAgICAgcm93cy5wdXNoKFtzdGFydCArIGksIHN0YXJ0ICsgaSArIDEsIHN0YXJ0ICsgaSArIDJdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93cztcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBwcmV2RGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGlmICghbWluKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCkgPD0gbWluLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGlja2VyVmlldygpID09PSAnbW9udGhzJykge1xuICAgICAgICAgICAgcmV0dXJuIHZpZXcuZ2V0RnVsbFllYXIoKSA8PSBtaW4uZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdmlldy5nZXRGdWxsWWVhcigpIDwgbWluLmdldEZ1bGxZZWFyKCkgfHxcbiAgICAgICAgICAgICh2aWV3LmdldEZ1bGxZZWFyKCkgPT09IG1pbi5nZXRGdWxsWWVhcigpICYmIHZpZXcuZ2V0TW9udGgoKSA8PSBtaW4uZ2V0TW9udGgoKSlcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXh0RGlzYWJsZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmICghbWF4KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdEYXRlKCk7XG4gICAgICAgIGlmICh0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERlY2FkZVN0YXJ0KCkgKyBEYXRlcGlja2VyQ29tcG9uZW50LllFQVJTX1BFUl9HUklEIC0gMSA+PSBtYXguZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldy5nZXRGdWxsWWVhcigpID49IG1heC5nZXRGdWxsWWVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB2aWV3LmdldEZ1bGxZZWFyKCkgPiBtYXguZ2V0RnVsbFllYXIoKSB8fFxuICAgICAgICAgICAgKHZpZXcuZ2V0RnVsbFllYXIoKSA9PT0gbWF4LmdldEZ1bGxZZWFyKCkgJiYgdmlldy5nZXRNb250aCgpID49IG1heC5nZXRNb250aCgpKVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSAIFRyYW5zbGF0aW9uIGtleXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgd2Vla0RheUtleXMgPSBbXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfc3VuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV9tb24nLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X3R1ZScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfd2VkJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RheV90aHUnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF5X2ZyaScsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9kYXlfc2F0JyxcbiAgICBdO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1vbnRoS2V5cyA9IFtcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2phbicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9mZWInLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfbWFyJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2FwcicsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9tYXknLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfanVuJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX2p1bCcsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9hdWcnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfc2VwJyxcbiAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21vbnRoX29jdCcsXG4gICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9tb250aF9ub3YnLFxuICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbW9udGhfZGVjJyxcbiAgICBdO1xuXG4gICAgLy8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwsIHsgc2VsZjogdHJ1ZSwgb3B0aW9uYWw6IHRydWUgfSk7XG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gdGhpcy5kZWZhdWx0RGF0ZSgpO1xuICAgICAgICAgICAgICAgIGlmIChkICYmICF0aGlzLnZhbHVlKCkgJiYgIXRoaXMucmFuZ2VWYWx1ZSgpICYmIHRoaXMubXVsdGlwbGVWYWx1ZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQoZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLy8g4pSA4pSAIENvbnRyb2xWYWx1ZUFjY2Vzc29yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IERhdGVwaWNrZXJWYWx1ZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXZhbHVlIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBzb3J0ZWQgPSBbLi4udmFsdWVdLnNvcnQoKGEsIGIpID0+IGEuZ2V0VGltZSgpIC0gYi5nZXRUaW1lKCkpO1xuICAgICAgICAgICAgdGhpcy5tdWx0aXBsZVZhbHVlcy5zZXQoc29ydGVkKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KHNvcnRlZCk7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IHNvcnRlZFswXTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGZpcnN0LmdldEZ1bGxZZWFyKCksIGZpcnN0LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RhdGVSYW5nZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUodmFsdWUuc3RhcnQuZ2V0RnVsbFllYXIoKSwgdmFsdWUuc3RhcnQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KHZhbHVlIGFzIERhdGUpO1xuICAgICAgICBjb25zdCBkID0gdmFsdWUgYXMgRGF0ZTtcbiAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKGQpO1xuICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB0aGlzLmhvdXJzLnNldChkLmdldEhvdXJzKCkpO1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KGQuZ2V0TWludXRlcygpKTtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldChkLmdldFNlY29uZHMoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogRGF0ZXBpY2tlclZhbHVlKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoaXNEaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFZhbGlkYXRvciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGxldCB2YWx1ZTogRGF0ZXBpY2tlclZhbHVlO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMubXVsdGlwbGVWYWx1ZXMoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnJhbmdlVmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVWYWxpZGF0aW9uRXJyb3JzKHZhbHVlLCBjb250cm9sKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZShmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIFB1YmxpYyBhY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5jYXB0dXJlRm9jdXNPcmlnaW4oKTtcbiAgICAgICAgdGhpcy5pc09wZW4uc2V0KHRydWUpO1xuICAgICAgICB0aGlzLnByZXBhcmVPcGVuVmlldygpO1xuICAgICAgICB0aGlzLnNob3cuZW1pdCgpO1xuICAgICAgICB0aGlzLmZvY3VzUGFuZWxBZnRlck9wZW4oKTtcbiAgICB9XG5cbiAgICAvKiogQWJyZSBvIHBhaW5lbCBzZW0gdHJhbnNmZXJpciBvIGZvY28gcG9yIHBhZHLDo28gKHVzYWRvIHBlbG8gc2hvd09uRm9jdXMpLiBFbSBtb2RvcyBzZW1cbiAgICAgKiAgZGlnaXRhw6fDo28gcG9yIHNlZ21lbnRvIChtdWx0aXBsZS9yYW5nZS95ZWFyL3RvdWNoKSBvIGZvY28gc2VndWUgcHJvIGNhbGVuZMOhcmlvIGlndWFsIGVtXG4gICAgICogIG9wZW4oKTsgZW0gbW9kbyBzZWdtZW50YWRvIG8gZm9jbyBwZXJtYW5lY2Ugbm8gaW5wdXQgcHJhIGNvbnRpbnVhciBkaWdpdGFuZG8uICovXG4gICAgcHJpdmF0ZSBvcGVuT25Gb2N1cygpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSB8fCB0aGlzLmlzT3BlbigpKSByZXR1cm47XG4gICAgICAgIHRoaXMuY2FwdHVyZUZvY3VzT3JpZ2luKCk7XG4gICAgICAgIHRoaXMuaXNPcGVuLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlT3BlblZpZXcoKTtcbiAgICAgICAgdGhpcy5zaG93LmVtaXQoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2VnbWVudGVkTW9kZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzUGFuZWxBZnRlck9wZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNQYW5lbEFmdGVyT3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB0aGlzLmluY3JlYXNlSG91ckJ1dHRvbigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCksIHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogR3VhcmRhIG8gZWxlbWVudG8gZm9jYWRvIG5vIG1vbWVudG8gZW0gcXVlIG8gcGFpbmVsIGFicmUsIHByYSBkZXZvbHZlciBvIGZvY28gcHJhIGzDoSBhb1xuICAgICAqICBmZWNoYXIgZW0gdmV6IGRlIHNlbXByZSBmb3LDp2FyIHBybyBib3TDo28gZG8gw61jb25lIOKAlCB2ZXIgYGNsb3NlUGFuZWwoKWAuICovXG4gICAgcHJpdmF0ZSBjYXB0dXJlRm9jdXNPcmlnaW4oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWxlbWVudFRvUmVzdG9yZUZvY3VzVG8gPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgYSB2aWV3IGluaWNpYWwgZG8gcGFpbmVsIGUgcG9zaWNpb25hIG8gY2FsZW5kw6FyaW8gbm8gYGRlZmF1bHREYXRlYFxuICAgICAqIHF1YW5kbyBuZW5odW0gdmFsb3IgZXN0w6Egc2VsZWNpb25hZG8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcmVwYXJlT3BlblZpZXcoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5yYW5nZVZhbHVlKCk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3JhbmdlJyAmJiByYW5nZT8uc3RhcnQpIHtcbiAgICAgICAgICAgIC8vIFJlYWJyaXIgdW0gaW50ZXJ2YWxvIGrDoSBkZWZpbmlkbyBwcmVjaXNhIGNhaXIgc2VtcHJlIG5vIG3DqnMgZG8gaW7DrWNpbyDigJQgc2Vuw6NvXG4gICAgICAgICAgICAvLyBgdmlld0RhdGVgIGZpY2Egb25kZSB1bWEgbmF2ZWdhw6fDo28gYW50ZXJpb3IgcGFyb3UgcG9yIGFjYXNvIChleC46IGNydXphciBtw6pzIGFvXG4gICAgICAgICAgICAvLyBlc2NvbGhlciBvIGZpbSksIGUgYGZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KClgIChwcmltZWlybyBgW2RhdGEtZm9jdXM9XCJzZWxlY3RlZFwiXWBcbiAgICAgICAgICAgIC8vIGVtIG9yZGVtIGRlIERPTSkgYWNhYmEgZm9jYW5kbyBvIGZpbSBvdSBuZW5odW1hIGPDqWx1bGEsIGRlcGVuZGVuZG8gZGUgcXVhbCBtw6pzXG4gICAgICAgICAgICAvLyBjYWxoYSBkZSBlc3RhciBlbSBleGliacOnw6NvLlxuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUocmFuZ2Uuc3RhcnQuZ2V0RnVsbFllYXIoKSwgcmFuZ2Uuc3RhcnQuZ2V0TW9udGgoKSwgMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdERhdGUgPSB0aGlzLmRlZmF1bHREYXRlKCk7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdERhdGUgJiYgIXRoaXMudmFsdWUoKSAmJiAhdGhpcy5yYW5nZVZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXcgRGF0ZShkZWZhdWx0RGF0ZS5nZXRGdWxsWWVhcigpLCBkZWZhdWx0RGF0ZS5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdtb250aHMnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3llYXInKSB7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCd5ZWFycycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgnY2FsZW5kYXInKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKTogdm9pZCB7XG4gICAgICAgIGFmdGVyTmV4dFJlbmRlcihcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGlmICghcGFuZWwpIHJldHVybjtcbiAgICAgICAgICAgICAgICBjb25zdCBuYXZIZWFkZXJUYXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcoKSA9PT0gJ2NhbGVuZGFyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1uYXYtaGVhZGVyXSBidXR0b246bm90KFtkaXNhYmxlZF0pJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAgICAgbmF2SGVhZGVyVGFyZ2V0ID8/XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1tkYXRhLWZvY3VzPVwidG9kYXlcIl0nKSA/P1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignYnV0dG9uOm5vdChbZGlzYWJsZWRdKScpO1xuICAgICAgICAgICAgICAgIHRhcmdldD8uZm9jdXMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIFplcmEgbyBlc3RhZG8gZGUgaW50ZXJ2YWxvIGVtIGFuZGFtZW50byDigJQgdXNhZG8gdGFudG8gcGVsbyBmZWNoYW1lbnRvIHRvdGFsIGRvIHBhaW5lbFxuICAgICAqICAoYGNsb3NlUGFuZWxgLCBvbmRlIG7Do28gZmF6IHNlbnRpZG8gYW51bmNpYXIgbmFkYSBwb3JxdWUgbyBkacOhbG9nbyBpbnRlaXJvIGVzdMOhIHN1bWluZG8pXG4gICAgICogIHF1YW50byBwZWxvIGNhbmNlbGFtZW50byBsZXZlIHZpYSBFc2NhcGUgZGVudHJvIGRhIGdyYWRlIChgY2FuY2VsUGVuZGluZ1JhbmdlU3RhcnRgKSwgcXVlXG4gICAgICogIG1hbnTDqW0gbyBwYWluZWwgYWJlcnRvIGUgcG9yIGlzc28gYW51bmNpYSBhIG11ZGFuw6dhIHNlcGFyYWRhbWVudGUuICovXG4gICAgcHJpdmF0ZSByZXNldFBlbmRpbmdSYW5nZVNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydC5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuaG92ZXJEYXRlLnNldChudWxsKTtcbiAgICB9XG5cbiAgICAvKiogQ2FuY2VsYW1lbnRvIGxldmUgZGUgdW1hIHNlbGXDp8OjbyBkZSBpbnRlcnZhbG8gZW0gYW5kYW1lbnRvICh2ZXIgYGhhbmRsZUNhbGVuZGFyR3JpZEtleWRvd25gLFxuICAgICAqICB0ZWNsYSBFc2NhcGUpIOKAlCBhbyBjb250csOhcmlvIGRlIGBjbG9zZVBhbmVsYCwgbyBwYWluZWwgY29udGludWEgYWJlcnRvLCBlbnTDo28gYXF1aSBmYXpcbiAgICAgKiAgc2VudGlkbyBhbnVuY2lhciBhIG11ZGFuw6dhIGRlIGVzdGFkby4gKi9cbiAgICBwcml2YXRlIGNhbmNlbFBlbmRpbmdSYW5nZVN0YXJ0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlc2V0UGVuZGluZ1JhbmdlU2VsZWN0aW9uKCk7XG4gICAgICAgIC8vIEEgZXNjb2xoYSBkbyBpbsOtY2lvIChyYW1vIGAhcGVuZGluZ2AgZGUgc2VsZWN0RGF0ZSgpKSBncmF2YSBvIGluw61jaW8gcGVuZGVudGUgZW1cbiAgICAgICAgLy8gYGlucHV0RGF0ZWAgcHJhIG7Do28gZGVpeGFyIG8gY2FtcG8gb2Jzb2xldG8gZHVyYW50ZSBhIHNlbGXDp8OjbyBwYXJjaWFsICh2ZXIgc2VsZWN0RGF0ZSgpKVxuICAgICAgICAvLyDigJQgY2FuY2VsYXIgZXNzYSBlc2NvbGhhIHByZWNpc2EgZGVzZmF6ZXIgaXNzbyB0YW1iw6ltLCB2b2x0YW5kbyBwcm8gaW50ZXJ2YWxvIGrDoVxuICAgICAgICAvLyBjb25maXJtYWRvIChvdSB2YXppbywgc2UgbmVuaHVtKSDigJQgdGVzdGFkbyBtYW51YWxtZW50ZSB2aWEgZGV2dG9vbHM6IHNlbSBlc3RhIGxpbmhhLCBvXG4gICAgICAgIC8vIGNhbXBvIGZpY2F2YSBwcmVzbyBtb3N0cmFuZG8gYSBkYXRhIHBlbmRlbnRlIGRlc2NhcnRhZGEgbWVzbW8gY29tIG8gaW50ZXJ2YWxvIGFudGlnb1xuICAgICAgICAvLyBhaW5kYSBkZXN0YWNhZG8gbm8gY2FsZW5kw6FyaW8uXG4gICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KHRoaXMucmFuZ2VWYWx1ZSgpKTtcbiAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UoXG4gICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcmFuZ2Vfc2VsZWN0aW9uX2NhbmNlbGxlZCcpLFxuICAgICAgICAgICAgJ3BvbGl0ZScsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNsb3NlUGFuZWwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhbmVsRWxlbWVudCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmlzT3Blbi5zZXQoZmFsc2UpO1xuICAgICAgICB0aGlzLnJlc2V0UGVuZGluZ1JhbmdlU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KHBhbmVsRWxlbWVudCA/PyAodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KSk7XG5cbiAgICAgICAgLy8gU8OzIGZvcsOnYSBvIGZvY28gcHJhIG91dHJvIGx1Z2FyIHNlIGVsZSBlc3RpdmVyIGRlbnRybyBkbyBwYWluZWwgcXVlIGVzdMOhIHNlbmRvIGZlY2hhZG9cbiAgICAgICAgLy8gKHNlbsOjbyBvIHVzdcOhcmlvIGZpY2FyaWEgY29tIGZvY28gXCJwcmVzb1wiIG51bSBlbGVtZW50byBxdWUgZXN0w6EgcHJlc3RlcyBhIHN1bWlyIGRvIERPTSkuXG4gICAgICAgIC8vIFNlIG8gZm9jbyBqw6EgZXN0w6EgZW0gb3V0cm8gbHVnYXIg4oCUIGV4LjogbyBwcsOzcHJpbyBpbnB1dCBzZWdtZW50YWRvLCBxdWUgYWJyaXUgbyBwYWluZWxcbiAgICAgICAgLy8gdmlhIGBvcGVuT25Gb2N1c2AgZSBudW5jYSBjaGVnb3UgYSBwZXJkZXIgbyBmb2NvIOKAlCBkZWl4YW1vcyBjb21vIGVzdMOhLCBlbSB2ZXogZGUgcHV4YXJcbiAgICAgICAgLy8gbyBmb2NvIHBybyBib3TDo28gZG8gw61jb25lIHNlbSBuZW5odW0gbW90aXZvIChidWcgcmVsYXRhZG8gdmlhIEdOT01FIE9yY2E6IGZlY2hhciBvXG4gICAgICAgIC8vIHBhaW5lbCBjbGljYW5kbyBmb3JhLCBjb20gbyBmb2NvIGFpbmRhIG5vIGlucHV0LCBmYXppYSBvIGZvY28gcHVsYXIgcHJvIMOtY29uZSkuXG4gICAgICAgIGNvbnN0IGZvY3VzSXNJbnNpZGVQYW5lbCA9XG4gICAgICAgICAgICBwYW5lbEVsZW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluc3RhbmNlb2YgTm9kZSAmJiBwYW5lbEVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gICAgICAgIGlmICghZm9jdXNJc0luc2lkZVBhbmVsKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcmVzdG9yZVRhcmdldCA9IHRoaXMuZWxlbWVudFRvUmVzdG9yZUZvY3VzVG87XG4gICAgICAgIHRoaXMuZWxlbWVudFRvUmVzdG9yZUZvY3VzVG8gPSBudWxsO1xuICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1Jlc3RvcmluZ0ZvY3VzT25DbG9zZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3RvcmVUYXJnZXQgJiYgZG9jdW1lbnQuY29udGFpbnMocmVzdG9yZVRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdG9yZVRhcmdldC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWNvbkJ1dHRvbigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaXNSZXN0b3JpbmdGb2N1c09uQ2xvc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTyBiYWNrZHJvcCBkbyBDREsgT3ZlcmxheSBjb2JyZSBhIHRlbGEgaW50ZWlyYSwgaW5jbHVpbmRvIG8gcHLDs3ByaW8gdHJpZ2dlciDigJQgY2xpY2FyIG5vXG4gICAgICogaW5wdXQgb3Ugbm9zIGJvdMO1ZXMgZG8gdHJpZ2dlciBlbnF1YW50byBvIHBhaW5lbCBqw6EgZXN0w6EgYWJlcnRvIHRhbWLDqW0gZGlzcGFyYVxuICAgICAqIGBiYWNrZHJvcENsaWNrYCAobyBwcsOzcHJpbyBgPGlucHV0PmAgbnVuY2EgcmVjZWJlIG8gYGNsaWNrYCBuZXNzZSBjYXNvLCBlbnTDo29cbiAgICAgKiBgaGFuZGxlSW5wdXRDbGlja2AgbnVuY2EgZGlzcGFyYSkuIFNlbSBlc3RlIGZpbHRybywgY2xpY2FyIG5vIGlucHV0IHBhcmEgdHJvY2FyIGRlXG4gICAgICogc2VnbWVudG8gZmVjaGFyaWEgbyBwYWluZWwgZSByb3ViYXJpYSBvIGZvY28gcGFyYSBvIGJvdMOjbyBkbyDDrWNvbmUgKHZpYSBgY2xvc2VQYW5lbGApLlxuICAgICAqIFF1YW5kbyBvIGNsaXF1ZSBjYWl1IGVzcGVjaWZpY2FtZW50ZSBzb2JyZSBvIGA8aW5wdXQ+YCwgcmVhcGxpY2Ftb3MgYSBtZXNtYSBsw7NnaWNhIGRlXG4gICAgICogcmVwb3NpY2lvbmFtZW50byBkZSBzZWdtZW50byBxdWUgYGhhbmRsZUlucHV0Q2xpY2tgIGZhcmlhLCBlbSB2ZXogZGUgc8OzIGlnbm9yYXIgbyBjbGlxdWUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGhhbmRsZUJhY2tkcm9wQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gYGV2ZW50LnRhcmdldGAgZGUgdW0gYmFja2Ryb3BDbGljayBkbyBDREsgT3ZlcmxheSDDqSBzZW1wcmUgbyBwcsOzcHJpbyA8ZGl2PiBkb1xuICAgICAgICAvLyBiYWNrZHJvcCwgbnVuY2EgbyBlbGVtZW50byByZWFsbWVudGUgY2xpY2FkbyDigJQgZW50w6NvIGNoZWNhciBgLmNvbnRhaW5zKGV2ZW50LnRhcmdldClgXG4gICAgICAgIC8vIG51bmNhIGZ1bmNpb25hLiBFbSB2ZXogZGlzc28sIGNvbXBhcmFtb3MgYSBjb29yZGVuYWRhIHJlYWwgZG8gY2xpcXVlIChxdWUgb1xuICAgICAgICAvLyBNb3VzZUV2ZW50IHNlbXByZSBjYXJyZWdhIGNvcnJldGFtZW50ZSkgY29udHJhIG9zIHJldMOibmd1bG9zIGRvcyBlbGVtZW50b3MgZG8gdHJpZ2dlci5cbiAgICAgICAgY29uc3QgaW5wdXRFbCA9IHRoaXMudHJpZ2dlcklucHV0KCk/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGlucHV0RWwgJiYgdGhpcy5pc1NlZ21lbnRlZE1vZGUoKSkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRSZWN0ID0gaW5wdXRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGNsaWNrZWRPbklucHV0ID1cbiAgICAgICAgICAgICAgICBldmVudC5jbGllbnRYID49IGlucHV0UmVjdC5sZWZ0ICYmXG4gICAgICAgICAgICAgICAgZXZlbnQuY2xpZW50WCA8PSBpbnB1dFJlY3QucmlnaHQgJiZcbiAgICAgICAgICAgICAgICBldmVudC5jbGllbnRZID49IGlucHV0UmVjdC50b3AgJiZcbiAgICAgICAgICAgICAgICBldmVudC5jbGllbnRZIDw9IGlucHV0UmVjdC5ib3R0b207XG4gICAgICAgICAgICBpZiAoY2xpY2tlZE9uSW5wdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNlZ21lbnRQb2ludGVyRG93bihpbnB1dEVsLCBldmVudC5jbGllbnRYLCBldmVudC50aW1lU3RhbXApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBjbGlja2VkT25UcmlnZ2VyID1cbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFggPj0gcmVjdC5sZWZ0ICYmXG4gICAgICAgICAgICBldmVudC5jbGllbnRYIDw9IHJlY3QucmlnaHQgJiZcbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPj0gcmVjdC50b3AgJiZcbiAgICAgICAgICAgIGV2ZW50LmNsaWVudFkgPD0gcmVjdC5ib3R0b207XG4gICAgICAgIGlmIChjbGlja2VkT25UcmlnZ2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlT3ZlcmxheUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2VnbWVudGVkTW9kZSgpIHx8ICEoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBCb3VuZCB0byBgbW91c2Vkb3duYCwgbsOjbyBgY2xpY2tgICh2ZWphIG8gY29tZW50w6FyaW8gZW0gYGFwcGx5U2VnbWVudENsaWNrYCkuIE9cbiAgICAgICAgLy8gY29tcG9ydGFtZW50byBuYXRpdm8gcGFkcsOjbyBkbyBicm93c2VyIHByYSBtb3VzZWRvd24gbnVtIGA8aW5wdXQ+YCBkZSB0ZXh0byDDqVxuICAgICAgICAvLyBwb3NpY2lvbmFyIG8gY2FyZXQvaW5pY2lhciBzZWxlw6fDo28gZGUgdGV4dG8gbmEgY29vcmRlbmFkYSBkbyBjbGlxdWUg4oCUIGlzc28gcm9kYVxuICAgICAgICAvLyAqZGVwb2lzKiBkb3Mgbm9zc29zIGxpc3RlbmVycyBlIHNvYnJlc2NyZXZlcmlhIG8gYHNldFNlbGVjdGlvblJhbmdlYCBkbyBzZWdtZW50b1xuICAgICAgICAvLyBhcGxpY2FkbyBsb2dvIGFiYWl4by4gYHByZXZlbnREZWZhdWx0KClgIGV2aXRhIGVzc2EgY29ycmlkYS5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWdtZW50UG9pbnRlckRvd24oZXZlbnQudGFyZ2V0LCBldmVudC5jbGllbnRYLCBldmVudC50aW1lU3RhbXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvbnRvIGRlIGVudHJhZGEgw7puaWNvIHBybyBjbGlxdWUgbm8gaW5wdXQgc2VnbWVudGFkbyDigJQgY2hhbWFkbyB0YW50byBwb3JcbiAgICAgKiBgaGFuZGxlSW5wdXRDbGlja2AgKG1vdXNlZG93biBkaXJldG8gbm8gYDxpbnB1dD5gLCBvIHByaW1laXJvIGNsaXF1ZSwgYW50ZXMgZG8gYmFja2Ryb3BcbiAgICAgKiBleGlzdGlyKSBxdWFudG8gcG9yIGBoYW5kbGVCYWNrZHJvcENsaWNrYCAoY2xpcXVlcyBzZWd1aW50ZXMsIGrDoSBjb20gbyBwYWluZWwgYWJlcnRvIGUgb1xuICAgICAqIGJhY2tkcm9wIGNvYnJpbmRvIG8gaW5wdXQpLiBQcmVjaXNhIHNlciDDum5pY28gcG9ycXVlIG9zIGRvaXMgY2xpcXVlcyBkZSB1bSBkdXBsbyBjbGlxdWVcbiAgICAgKiByZWFsIGNvc3R1bWFtIGNoZWdhciBwb3IgY2FtaW5ob3MgRElGRVJFTlRFUyDigJQgbyBwcmltZWlybyB2aWEgbW91c2Vkb3duIG5vIGlucHV0LCBvXG4gICAgICogc2VndW5kbyB2aWEgYmFja2Ryb3BDbGljayDigJQgZW50w6NvIHJhc3RyZWFyIG8gdGltZXN0YW1wIGRvIFwiw7psdGltbyBjbGlxdWVcIiBzZXBhcmFkYW1lbnRlXG4gICAgICogZW0gY2FkYSBoYW5kbGVyIG51bmNhIGRldGVjdGFyaWEgdW0gZHVwbG8gY2xpcXVlIGRlIHZlcmRhZGUuIE5lbSBgZGJsY2xpY2tgIG5lbVxuICAgICAqIGBldmVudC5kZXRhaWxgIHPDo28gY29uZmnDoXZlaXMgYXF1aSAoZGVwZW5kZW0gZGEgY29udGFnZW0vdGFyZ2V0aW5nIGludGVybmEgZGUgY2xpcXVlcyBkb1xuICAgICAqIGJyb3dzZXIsIHF1ZSBub3NzYXMgbWFuaXB1bGHDp8O1ZXMgZGUgZm9jby9zZWxlw6fDo28gcGFyZWNlbSBhdHJhcGFsaGFyIOKAlCBvYnNlcnZhZG9cbiAgICAgKiBlbXBpcmljYW1lbnRlOiBgZXZlbnQuZGV0YWlsYCBmaWNhIHNlbXByZSAxKSwgZGHDrSBhIGRldGVjw6fDo28gbWFudWFsIHBvciB0aW1lc3RhbXAuXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYW5kbGVTZWdtZW50UG9pbnRlckRvd24oaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQsIGNsaWVudFg6IG51bWJlciwgdGltZVN0YW1wOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXNEb3VibGVDbGljayA9IHRpbWVTdGFtcCAtIHRoaXMubGFzdE1vdXNlRG93bkF0IDwgRGF0ZXBpY2tlckNvbXBvbmVudC5ET1VCTEVfQ0xJQ0tfVEhSRVNIT0xEX01TO1xuICAgICAgICB0aGlzLmxhc3RNb3VzZURvd25BdCA9IHRpbWVTdGFtcDtcbiAgICAgICAgaWYgKGlzRG91YmxlQ2xpY2spIHtcbiAgICAgICAgICAgIHRoaXMubGFzdE1vdXNlRG93bkF0ID0gMDsgLy8gZXZpdGEgcXVlIHVtIHRlcmNlaXJvIGNsaXF1ZSBlbmNhZGVpZSBlbSBvdXRybyBcImR1cGxvXCJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0V2hvbGVGaWVsZChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBseVNlZ21lbnRDbGljayhpbnB1dCwgY2xpZW50WCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWNpb25hIG8gc2VnbWVudG8gc29iIGEgY29vcmRlbmFkYSBgY2xpZW50WGAgZGUgdW0gY2xpcXVlIG5vIGlucHV0IHNlZ21lbnRhZG8uXG4gICAgICogQ29tcGFydGlsaGFkbyBwb3IgYGhhbmRsZUlucHV0Q2xpY2tgIChtb3VzZWRvd24gcmVhbCBubyBgPGlucHV0PmAg4oCUIHVzYW1vcyBgbW91c2Vkb3duYFxuICAgICAqIGVtIHZleiBkZSBgY2xpY2tgIHBvcnF1ZSBvIGBmb2N1c2AvYG9wZW5PbkZvY3VzYCBkaXNwYXJhZG8gbm8gbWVpbyBkbyBnZXN0byBwb2RlIG1vbnRhclxuICAgICAqIG8gYmFja2Ryb3AgZG8gQ0RLIE92ZXJsYXkgZW1iYWl4byBkbyBjdXJzb3IgYW50ZXMgZG8gYG1vdXNldXBgLCBmYXplbmRvIG8gYnJvd3NlciByZXNvbHZlclxuICAgICAqIG8gYGNsaWNrYCBwcm8gYW5jZXN0cmFsIGNvbXVtIGVudHJlIG8gYWx2byBkbyBtb3VzZWRvd24gZSBvIGRvIG1vdXNldXAg4oCUIG5hIHByw6F0aWNhLFxuICAgICAqIGA8Ym9keT5gIOKAlCBlbSB2ZXogZG8gYDxpbnB1dD5gIG91IGRvIGJhY2tkcm9wKSBlIGBoYW5kbGVCYWNrZHJvcENsaWNrYCAoY2xpcXVlIG5vIHRyaWdnZXJcbiAgICAgKiBjb20gbyBwYWluZWwgasOhIGFiZXJ0byBlbSByZWdpbWUgZXN0w6F2ZWwsIGludGVyY2VwdGFkbyBwZWxvIGJhY2tkcm9wIGRvIENESyBPdmVybGF5KS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFwcGx5U2VnbWVudENsaWNrKGlucHV0OiBIVE1MSW5wdXRFbGVtZW50LCBjbGllbnRYOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnN1cmVTZWdtZW50RW5naW5lQ29uZmlndXJlZCgpO1xuICAgICAgICAvLyBDYWxjdWxhIG8gc2VnbWVudG8gYSBwYXJ0aXIgZGEgY29vcmRlbmFkYSBkbyBjbGlxdWUgKGNsaWVudFgpLCBuw6NvIGRlXG4gICAgICAgIC8vIGBpbnB1dC5zZWxlY3Rpb25TdGFydGAg4oCUIG8gYnJvd3NlciBhanVzdGEgYSBwb3Npw6fDo28gZG8gY2FyZXQgZGUgZm9ybWEgYXNzw61uY3JvbmFcbiAgICAgICAgLy8gYXDDs3MgbyBjbGlxdWUgKG9ic2VydmFkbyBlbXBpcmljYW1lbnRlLCBlc3BlY2lhbG1lbnRlIG5hIHRyYW5zacOnw6NvIGRlIGZvY28pLCBlbnTDo29cbiAgICAgICAgLy8gbGVyIGBzZWxlY3Rpb25TdGFydGAgbmVzc2UgbW9tZW50byDDqSB1bWEgZm9udGUgbsOjbyBjb25macOhdmVsLiBgY2xpZW50WGAgw6kgc8OtbmNyb25vXG4gICAgICAgIC8vIGUgaW1lZGlhdG8sIHNlbSBlc3NhIGNvcnJpZGEuXG4gICAgICAgIGNvbnN0IGNoYXJJbmRleCA9IHRoaXMuY2xpY2tDbGllbnRYVG9DaGFySW5kZXgoaW5wdXQsIGNsaWVudFgpO1xuICAgICAgICBjb25zdCBnZW5lcmF0aW9uID0gKyt0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbjtcbiAgICAgICAgLy8gRm9jYSBlIHNlbGVjaW9uYSBvIHNlZ21lbnRvIGp1bnRvcywgZSByZWFwbGljYSBvcyBkb2lzIGFsZ3VtYXMgdmV6ZXMgbG9nbyBlbSBzZWd1aWRhIOKAlFxuICAgICAgICAvLyBvIGJyb3dzZXIvQ0RLIE92ZXJsYXkgcG9kZSBtZXhlciBubyBmb2NvIGRlIGZvcm1hIGFzc8OtbmNyb25hIGRlcG9pcyBkbyBjbGlxdWUgKGJsdXJcbiAgICAgICAgLy8gbmF0aXZvIGRvIGJhY2tkcm9wLCBjZGtUcmFwRm9jdXMgZG8gcGFpbmVsLCBldGMuKTsgZW0gdmV6IGRlIHRlbnRhciBwcmV2ZXIvZXZpdGFyIGNhZGFcbiAgICAgICAgLy8gY2F1c2EsIHNpbXBsZXNtZW50ZSB2ZW5jZW1vcyByZWFmaXJtYW5kbyBmb2NvK3NlbGXDp8OjbyBwb3IgY2ltYS5cbiAgICAgICAgY29uc3QgZm9jdXNBbmRTZWxlY3QgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gdGhpcy5pbnRlcmFjdGlvbkdlbmVyYXRpb24pIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWdtZW50RW5naW5lLnNlbGVjdFNlZ21lbnRBdChjaGFySW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnNlbGVjdFNlZ21lbnQoaW5kZXgpO1xuICAgICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgIH07XG4gICAgICAgIGZvY3VzQW5kU2VsZWN0KCk7XG4gICAgICAgIHNldFRpbWVvdXQoZm9jdXNBbmRTZWxlY3QsIDApO1xuICAgICAgICBzZXRUaW1lb3V0KGZvY3VzQW5kU2VsZWN0LCA1MCk7XG4gICAgfVxuXG4gICAgLyoqIER1cGxvIGNsaXF1ZSBzZWxlY2lvbmEgbyBpbnB1dCBpbnRlaXJvICh0b2RvcyBvcyBzZWdtZW50b3MpLCBjb21vIG51bSBgPGlucHV0PmAgZGUgdGV4dG8gY29tdW0uICovXG4gICAgcHJvdGVjdGVkIGhhbmRsZUlucHV0RGJsQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2VnbWVudGVkTW9kZSgpIHx8ICEoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkpIHJldHVybjtcbiAgICAgICAgdGhpcy5zZWxlY3RXaG9sZUZpZWxkKGV2ZW50LnRhcmdldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWNpb25hIHRvZG9zIG9zIHNlZ21lbnRvcyBkbyBpbnB1dCAodXNhZG8gdGFudG8gcGVsbyBkdXBsbyBjbGlxdWUgZGV0ZWN0YWRvIG5hIG3Do28gZW1cbiAgICAgKiBgaGFuZGxlU2VnbWVudFBvaW50ZXJEb3duYCBxdWFudG8gcG9yIGBoYW5kbGVJbnB1dERibENsaWNrYCwgbWFudGlkbyBjb21vIGNhbWluaG8gZGlyZXRvXG4gICAgICogcHJhIHF1ZW0gZGlzcGFyYSB1bSBgZGJsY2xpY2tgIGRlIHZlcmRhZGUsIGV4LjogYWNlc3NpYmlsaWRhZGUvdGVzdGVzKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNlbGVjdFdob2xlRmllbGQoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnN1cmVTZWdtZW50RW5naW5lQ29uZmlndXJlZCgpO1xuICAgICAgICAvLyBHYXJhbnRlIHVtIHNlZ21lbnRvIGF0aXZvICphbnRlcyogZGUgZm9jYXI6IHNlIG8gQ0RLIE92ZXJsYXkgdGl2ZXIgcm91YmFkbyBvIGZvY28gZGVcbiAgICAgICAgLy8gZm9ybWEgYXNzw61uY3JvbmEgKGJsdXIpIGVudHJlIG9zIGNsaXF1ZXMgcXVlIGNvbXDDtWVtIG8gZHVwbG8gY2xpcXVlLCBvIGBpbnB1dC5mb2N1cygpYFxuICAgICAgICAvLyBhYmFpeG8gZGlzcGFyYSB1bSBldmVudG8gYGZvY3VzYCBnZW51w61ubywgZSBoYW5kbGVJbnB1dEZvY3VzIHPDsyBldml0YSBhZ2VuZGFyIHN1YSBwcsOzcHJpYVxuICAgICAgICAvLyByZWFwbGljYcOnw6NvIGNvbmNvcnJlbnRlIChxdWUgc29icmVzY3JldmVyaWEgbm9zc2Egc2VsZcOnw6NvIGRvIGNhbXBvIGludGVpcm8gbWFpcyB0YXJkZSlcbiAgICAgICAgLy8gcXVhbmRvIGVuY29udHJhIGBnZXRBY3RpdmVJbmRleCgpICE9PSBudWxsYCDigJQgbyBtZXNtbyBtb3Rpdm8gcGVsbyBxdWFsIGhhbmRsZUlucHV0Q2xpY2tcbiAgICAgICAgLy8gc2VtcHJlIGNoYW1hIGBzZWdtZW50RW5naW5lLnNlbGVjdFNlZ21lbnQoaW5kZXgpYCBhbnRlcyBkZSBgaW5wdXQuZm9jdXMoKWAuXG4gICAgICAgIGlmICh0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnNlbGVjdEZpcnN0U2VnbWVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uO1xuICAgICAgICAvLyBNZXNtbyBwYWRyw6NvIGRlZmVuc2l2byBkZSBoYW5kbGVJbnB1dENsaWNrOiBvIGNsaXF1ZSBxdWUgZmVjaGEgbyBkdXBsbyBjbGlxdWUgasOhIHJvZG91XG4gICAgICAgIC8vIGhhbmRsZUlucHV0Q2xpY2sgKHNlbGVjaW9uYW5kbyBzw7MgdW0gc2VnbWVudG8pIGUgcG9kZSB0ZXIgYWdlbmRhZG8gc3VhcyBwcsOzcHJpYXNcbiAgICAgICAgLy8gcmVhcGxpY2HDp8O1ZXMgYWRpYWRhcyDigJQgYSBnZXJhw6fDo28gcmVjw6ltLWluY3JlbWVudGFkYSBhcyBpbnZhbGlkYSwgZW50w6NvIHPDsyBhIHNlbGXDp8OjbyBkb1xuICAgICAgICAvLyBjYW1wbyBpbnRlaXJvIHNvYnJldml2ZS5cbiAgICAgICAgY29uc3QgZm9jdXNBbmRTZWxlY3RBbGwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPT0gdGhpcy5pbnRlcmFjdGlvbkdlbmVyYXRpb24pIHJldHVybjtcbiAgICAgICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICAgICAgICB9O1xuICAgICAgICBmb2N1c0FuZFNlbGVjdEFsbCgpO1xuICAgICAgICBzZXRUaW1lb3V0KGZvY3VzQW5kU2VsZWN0QWxsLCAwKTtcbiAgICAgICAgc2V0VGltZW91dChmb2N1c0FuZFNlbGVjdEFsbCwgNTApO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dEZvY3VzKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRm9jdXNlZC5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWdtZW50ZWRNb2RlKCkgJiYgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5lbnN1cmVTZWdtZW50RW5naW5lQ29uZmlndXJlZCgpO1xuICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICBpZiAoaW5wdXQudmFsdWUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VnbWVudEVuZ2luZS5nZXRBY3RpdmVJbmRleCgpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9jbyBcImdlbnXDrW5vXCIgKFRhYiBhIHBhcnRpciBkZSBvdXRybyBjYW1wbywgb3UgcHJpbWVpcm8gZm9jbyBubyBjYW1wbykg4oCUXG4gICAgICAgICAgICAgICAgLy8gbmVuaHVtIHNlZ21lbnRvIGF0aXZvIGFpbmRhLCBlbnTDo28gc2VsZWNpb25hIG8gcHJpbWVpcm8uXG4gICAgICAgICAgICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9ICsrdGhpcy5pbnRlcmFjdGlvbkdlbmVyYXRpb247XG4gICAgICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnNlbGVjdEZpcnN0U2VnbWVudCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlR2VudWluZUZvY3VzKCk7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmludGVyYWN0aW9uR2VuZXJhdGlvbikgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWN0aXZlU2VnbWVudFJhbmdlKGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBKw6EgZXhpc3RlIHVtIHNlZ21lbnRvIGF0aXZvIOKAlCBwb3IgZXhlbXBsbywgaGFuZGxlSW5wdXRDbGljayBhY2Fib3UgZGVcbiAgICAgICAgICAgICAgICAvLyBkZWZpbmktbG8gZSBlc3TDoSByZWZvY2FuZG8gbyBpbnB1dCBwcm9ncmFtYXRpY2FtZW50ZSBhcMOzcyB1bSBibHVyIGVzcMO6cmlvLlxuICAgICAgICAgICAgICAgIC8vIE7Do28gcmVpbmljaWEgcGFyYSBvIHByaW1laXJvIHNlZ21lbnRvOyBzw7MgZ2FyYW50ZSBxdWUgYSBzZWxlw6fDo28gdmlzdWFsIGJhdGFcbiAgICAgICAgICAgICAgICAvLyBjb20gbyBlc3RhZG8gYXR1YWwsIGUgYW51bmNpYSBzw7MgbyBzZWdtZW50byAobyByZXN1bW8gZG8gdmFsb3IgaW50ZWlybyDDqVxuICAgICAgICAgICAgICAgIC8vIHJlc2VydmFkbyBhbyBwcmltZWlybyBmb2NvIGdlbnXDrW5vKS5cbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbm5vdW5jZUFjdGl2ZVNlZ21lbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zaG93T25Gb2N1cygpICYmICF0aGlzLmlzUmVzdG9yaW5nRm9jdXNPbkNsb3NlKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5PbkZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogTWFwZWlhIGEgY29vcmRlbmFkYSBYICh2aWV3cG9ydCkgZGUgdW0gY2xpcXVlIHBhcmEgbyDDrW5kaWNlIGRlIGNhcmFjdGVyZSBtYWlzIHByw7N4aW1vIG5vIHZhbG9yIGV4aWJpZG8uICovXG4gICAgcHJpdmF0ZSBjbGlja0NsaWVudFhUb0NoYXJJbmRleChpbnB1dDogSFRNTElucHV0RWxlbWVudCwgY2xpZW50WDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGlucHV0KTtcbiAgICAgICAgY29uc3QgY2FudmFzID0gKHRoaXMubWVhc3VyZUNhbnZhcyA/Pz0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykpO1xuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgaWYgKCFjdHgpIHJldHVybiAwO1xuICAgICAgICBjdHguZm9udCA9IGAke3N0eWxlLmZvbnRTdHlsZX0gJHtzdHlsZS5mb250V2VpZ2h0fSAke3N0eWxlLmZvbnRTaXplfSAke3N0eWxlLmZvbnRGYW1pbHl9YDtcbiAgICAgICAgY29uc3QgcmVjdCA9IGlucHV0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBwYWRkaW5nTGVmdCA9IHBhcnNlRmxvYXQoc3R5bGUucGFkZGluZ0xlZnQpIHx8IDA7XG4gICAgICAgIGNvbnN0IGxvY2FsWCA9IGNsaWVudFggLSByZWN0LmxlZnQgLSBwYWRkaW5nTGVmdCArIGlucHV0LnNjcm9sbExlZnQ7XG4gICAgICAgIGNvbnN0IHRleHQgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgbGV0IGJlc3RJbmRleCA9IDA7XG4gICAgICAgIGxldCBiZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyhjdHgubWVhc3VyZVRleHQodGV4dC5zbGljZSgwLCBpKSkud2lkdGggLSBsb2NhbFgpO1xuICAgICAgICAgICAgaWYgKGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgYmVzdEluZGV4ID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmVzdEluZGV4O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVOYXRpdmVJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZUlucHV0LmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dEJsdXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNGb2N1c2VkLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuYmx1cnJlZC5lbWl0KGV2ZW50KTtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3Qgd2FzU2VnbWVudGVkID0gdGhpcy5pc1NlZ21lbnRlZE1vZGUoKTtcbiAgICAgICAgaWYgKHdhc1NlZ21lbnRlZCkge1xuICAgICAgICAgICAgdGhpcy5lbnN1cmVTZWdtZW50RW5naW5lQ29uZmlndXJlZCgpO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICAgIHRoaXMubGl2ZUFubm91bmNlci5jbGVhcigpO1xuICAgICAgICAgICAgdGhpcy5jb21taXRTZWdtZW50ZWRWYWx1ZUlmQ29tcGxldGUoKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5zZWdtZW50RW5naW5lLmlzRW1wdHkoKSA/ICcnIDogdGhpcy5zZWdtZW50RW5naW5lLmdldERpc3BsYXlTdHJpbmcoKTtcbiAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5pbnB1dERhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbnB1dC52YWx1ZT8udHJpbSgpKSB7XG4gICAgICAgICAgICB0aGlzLm9uVmFsaWRhdG9yQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRUYXJnZXQgPSAoZXZlbnQgYXMgRm9jdXNFdmVudCkucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgLy8gRW0gbW9kbyBzZWdtZW50YWRvLCB1bSBibHVyIHNlbSBgcmVsYXRlZFRhcmdldGAgbm9ybWFsbWVudGUgbsOjbyDDqSB1bWEgc2HDrWRhIHJlYWxcbiAgICAgICAgICAgIC8vIGRlIGZvY28g4oCUIMOpIG8gYmFja2Ryb3AgdHJhbnNwYXJlbnRlIGRvIHByw7NwcmlvIHBvcHVwIChuw6NvIGZvY8OhdmVsKSBpbnRlcmNlcHRhbmRvXG4gICAgICAgICAgICAvLyB1bSBjbGlxdWUgbm8gdHJpZ2dlciBwYXJhIHRyb2NhciBkZSBzZWdtZW50by4gTsOjbyByZWRpcmVjaW9uYSBvIGZvY28gcHJvIHBhaW5lbFxuICAgICAgICAgICAgLy8gbmVzc2UgY2FzbzsgZGVpeGEgaGFuZGxlSW5wdXRDbGljay9oYW5kbGVJbnB1dEZvY3VzIHJlc29sdmVyZW0gKGVsZXMgcmVmb2NhbSBvXG4gICAgICAgICAgICAvLyBpbnB1dCBlIHJlYXBsaWNhbSBvIHNlZ21lbnRvIGNvcnJldG8gbG9nbyBlbSBzZWd1aWRhKS5cbiAgICAgICAgICAgIGNvbnN0IGxvb2tzTGlrZU93blRyaWdnZXJDbGljayA9IHdhc1NlZ21lbnRlZCAmJiAhcmVsYXRlZFRhcmdldDtcbiAgICAgICAgICAgIGlmICghbG9va3NMaWtlT3duVHJpZ2dlckNsaWNrICYmICghcmVsYXRlZFRhcmdldCB8fCAhcGFuZWw/LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jcmVhc2VIb3VyQnV0dG9uKCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWw/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCdbZGF0YS1mb2N1cz1cInNlbGVjdGVkXCJdJykgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignW2RhdGEtZm9jdXM9XCJ0b2RheVwiXScpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ2J1dHRvbjpub3QoW2Rpc2FibGVkXSknKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Py5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVJbnB1dENoYW5nZShyYXc6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc1NlZ21lbnRNb2RlQ2FuZGlkYXRlKCkpIHJldHVybjtcbiAgICAgICAgaWYgKCFyYXc/LnRyaW0oKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLnJhbmdlVmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKG51bGwpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW5wdXQodGhpcy5tb2RlKCksIHJhdywgdGhpcy5yYW5nZVNlcGFyYXRvcigpKTtcbiAgICAgICAgaWYgKHBhcnNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5faGFzRm9ybWF0RXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hhc0Zvcm1hdEVycm9yID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNEYXRlUmFuZ2UocGFyc2VkKSkge1xuICAgICAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChwYXJzZWQpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocGFyc2VkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBwYXJzZWQgYXMgRGF0ZTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGQpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMuaG91cnMuc2V0KGQuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KGQuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZVRyaWdnZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VnbWVudGVkTW9kZSgpICYmIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VnbWVudGVkS2V5ZG93bihldmVudCwgZXZlbnQudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogVGVjbGFzIHF1ZSBkZXZlbSBwYXNzYXIgZGlyZXRvIHBhcmEgbyBicm93c2VyIHNlbSBpbnNlcmlyL2FsdGVyYXIgbmFkYSBubyBjYW1wby4gKi9cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTRUdNRU5URURfUEFTU1RIUk9VR0hfS0VZUyA9IFsnSG9tZScsICdFbmQnLCAnU2hpZnQnLCAnQ2Fwc0xvY2snLCAnRXNjYXBlJywgJ0VudGVyJywgJyAnXTtcblxuICAgIC8qKiBEaWdpdGHDp8OjbyBwb3Igc2VnbWVudG8gKGRpYS9tw6pzL2Fuby9ob3JhL21pbnV0by9zZWd1bmRvL2FtcG0pIG5vIGlucHV0IGRvIHRyaWdnZXIuICovXG4gICAgcHJpdmF0ZSBoYW5kbGVTZWdtZW50ZWRLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgIGNvbnN0IHsga2V5LCBjdHJsS2V5LCBtZXRhS2V5LCBhbHRLZXksIHNoaWZ0S2V5IH0gPSBldmVudDtcbiAgICAgICAgaWYgKGN0cmxLZXkgfHwgbWV0YUtleSB8fCBhbHRLZXkgfHwga2V5LnN0YXJ0c1dpdGgoJ0YnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoRGF0ZXBpY2tlckNvbXBvbmVudC5TRUdNRU5URURfUEFTU1RIUk9VR0hfS0VZUy5pbmNsdWRlcyhrZXkpKSByZXR1cm47XG4gICAgICAgIHRoaXMuaW50ZXJhY3Rpb25HZW5lcmF0aW9uKys7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VnbWVudEVuZ2luZS5tb3ZlVG9BZGphY2VudFNlZ21lbnQoc2hpZnRLZXkgPyAtMSA6IDEpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ21vdmVkJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBrZXkgPT09ICdBcnJvd1JpZ2h0Jykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIC8vIEFvIGNvbnRyw6FyaW8gZG8gVGFiLCBzZXRhIG5vIHByaW1laXJvL8O6bHRpbW8gc2VnbWVudG8gbsOjbyBkZXZlIHNhaXIgZG8gY2FtcG8gbmVtXG4gICAgICAgICAgICAvLyBkZXNhdGl2YXIgYSBzZWxlw6fDo28g4oCUIGBtb3ZlVG9BZGphY2VudFNlZ21lbnRgIHplcmEgYGFjdGl2ZUluZGV4YCBhbyBiYXRlciBubyBsaW1pdGVcbiAgICAgICAgICAgIC8vIChjb21wb3J0YW1lbnRvIGNlcnRvIHBybyBUYWIgZXNjYXBhciBkbyBjYW1wbyksIGVudMOjbyBuYSBib3JkYSBhIGdlbnRlIHJlc2VsZWNpb25hXG4gICAgICAgICAgICAvLyBvIHNlZ21lbnRvIHF1ZSBqw6EgZXN0YXZhIGF0aXZvLCBpbWl0YW5kbyBvIGA8aW5wdXQgdHlwZT1cImRhdGVcIj5gIG5hdGl2byAoYSBzZXRhIHNvbWVcbiAgICAgICAgICAgIC8vIG5vIGxpbWl0ZSwgbsOjbyBuYXZlZ2EgcHJhIGZvcmEpLlxuICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gdGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZUluZGV4KCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlZ21lbnRFbmdpbmUubW92ZVRvQWRqYWNlbnRTZWdtZW50KGtleSA9PT0gJ0Fycm93TGVmdCcgPyAtMSA6IDEpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gJ2JvdW5kYXJ5JyAmJiBiZWZvcmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuc2VsZWN0U2VnbWVudChiZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ0Fycm93VXAnIHx8IGtleSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuaW5jcmVtZW50QWN0aXZlU2VnbWVudChrZXkgPT09ICdBcnJvd1VwJyA/IDEgOiAtMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ID09PSAnQmFja3NwYWNlJyB8fCBrZXkgPT09ICdEZWxldGUnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY29uc3QgaXNXaG9sZUZpZWxkU2VsZWN0ZWQgPSBpbnB1dC5zZWxlY3Rpb25TdGFydCA9PT0gMCAmJiBpbnB1dC5zZWxlY3Rpb25FbmQgPT09IGlucHV0LnZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChpc1dob2xlRmllbGRTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5jbGVhckFsbCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUuY2xlYXJBY3RpdmVTZWdtZW50KGtleSA9PT0gJ0JhY2tzcGFjZScgPyAnYmFja3NwYWNlJyA6ICdkZWxldGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3luY1NlZ21lbnRlZElucHV0KGlucHV0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgvXlswLTldJC8udGVzdChrZXkpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLnR5cGVEaWdpdChrZXkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VnbWVudEVuZ2luZS5hY3RpdmVLaW5kKCkgPT09ICdhbXBtJyAmJiAvXlthcEFQXSQvLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2VnbWVudEVuZ2luZS5zZXRBbVBtKGtleS50b0xvd2VyQ2FzZSgpID09PSAnYScgPyAwIDogMSk7XG4gICAgICAgICAgICB0aGlzLnN5bmNTZWdtZW50ZWRJbnB1dChpbnB1dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBRdWFscXVlciBvdXRyYSB0ZWNsYSBpbXByaW3DrXZlbCAobGV0cmFzLCBzw61tYm9sb3MpIG7Do28gw6kgaW5zZXJpZGEgbm8gY2FtcG8uXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLyoqIFNpbmNyb25pemEgbyBET00gY29tIG8gZXN0YWRvIGF0dWFsIGRhIGVuZ2luZSAodmFsb3IgKyBzZWxlw6fDo28gZG8gc2VnbWVudG8gYXRpdm8pIGFww7NzIHVtYSBtdXRhw6fDo28uICovXG4gICAgcHJpdmF0ZSBzeW5jU2VnbWVudGVkSW5wdXQoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpO1xuICAgICAgICBpbnB1dC52YWx1ZSA9IHRoaXMuaW5wdXREYXRlO1xuICAgICAgICB0aGlzLnNlbGVjdEFjdGl2ZVNlZ21lbnRSYW5nZShpbnB1dCk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VBY3RpdmVTZWdtZW50KCk7XG4gICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KSk7XG4gICAgICAgIHRoaXMuY29tbWl0U2VnbWVudGVkVmFsdWVJZkNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RBY3RpdmVTZWdtZW50UmFuZ2UoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0QWN0aXZlSW5kZXgoKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IHRoaXMuc2VnbWVudEVuZ2luZS5nZXRTZWdtZW50UmFuZ2UoaW5kZXgpO1xuICAgICAgICBpbnB1dC5zZXRTZWxlY3Rpb25SYW5nZShzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKiogXCJ7csOzdHVsbyBkbyBzZWdtZW50b30sIHt2YWxvcn1cIiAoZXguOiBcIkRpYSwgMDNcIikg4oCUIHRleHRvIGRvIGFuw7puY2lvIGRlIG7DrXZlbCBkZSBzZWdtZW50by4gKi9cbiAgICBwcml2YXRlIGJ1aWxkU2VnbWVudEFubm91bmNlbWVudFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qga2luZCA9IHRoaXMuc2VnbWVudEVuZ2luZS5hY3RpdmVLaW5kKCk7XG4gICAgICAgIGlmIChraW5kID09PSBudWxsKSByZXR1cm4gJyc7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoRGF0ZXBpY2tlckNvbXBvbmVudC5TRUdNRU5UX0xBQkVMX0tFWVNba2luZF0pO1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5zZWdtZW50RW5naW5lLmdldEFjdGl2ZVNlZ21lbnRUZXh0KCk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGV4dCB8fCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2VnbWVudF9lbXB0eScpO1xuICAgICAgICByZXR1cm4gYCR7bGFiZWx9LCAke3ZhbHVlfWA7XG4gICAgfVxuXG4gICAgLyoqIEFudW5jaWEgdmlhIExpdmVBbm5vdW5jZXIgbyBzZWdtZW50byBhdGl2byDigJQgY2hhbWFkbyBlbSB0b2RvIHBvbnRvIHF1ZSBtdWRhIG8gc2VnbWVudG8gYXRpdm8vc2V1XG4gICAgICogIHZhbG9yIERFUE9JUyBkbyBwcmltZWlybyBmb2NvIGdlbnXDrW5vIChxdWUgasOhIHJlY2ViZSBlc3NlIG1lc21vIHRleHRvIGVtYnV0aWRvIGVtIGBhbm5vdW5jZUdlbnVpbmVGb2N1c2ApLiAqL1xuICAgIHByaXZhdGUgYW5ub3VuY2VBY3RpdmVTZWdtZW50KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy5idWlsZFNlZ21lbnRBbm5vdW5jZW1lbnRUZXh0KCk7XG4gICAgICAgIGlmICh0ZXh0KSB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZSh0ZXh0LCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgLyoqIFJlc3VtbyBodW1hbml6YWRvIGRvIHZhbG9yIGludGVpcm8gKGV4LjogXCIxMCBkZSBvdXR1YnJvIGRlIDIwMjBcIiwgb3UgYSBmcmFzZSBnZW7DqXJpY2EgZGUgY2FtcG9cbiAgICAgKiAgdmF6aW8pIOKAlCBjb21wbGVtZW50YSBvIGA8aW5wdXQ+YCBzZWdtZW50YWRvLCBxdWUgbyBsZWl0b3IgZGUgdGVsYSBsw6ogZGUgZm9ybWEgbGl0ZXJhbC9wb3Vjb1xuICAgICAqICBuYXR1cmFsIChlc3F1ZWxldG8gZGUgc3VibGluaGFkb3MgcXVhbmRvIHZhemlvLCBkw61naXRvcyBzZXBhcmFkb3MgcG9yIGJhcnJhIHF1YW5kbyBjb21wbGV0bykuXG4gICAgICogIEZvcm1hdGHDp8OjbyBwdXJhIHZpYSBgSW50bGAsIHNlbSBjaGF2ZXMgZGUgdHJhZHXDp8OjbyBub3ZhcyAoZXhjZXRvIGEgZnJhc2UgZGUgY2FtcG8gdmF6aW8pLlxuICAgICAqICBFc3BlbGhhIGBmb3JtYXREYXlBcmlhTGFiZWxgIHBybyBtb2RvIGBkYXRlYC4gKi9cbiAgICBwcml2YXRlIGRlc2NyaWJlV2hvbGVWYWx1ZSgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5zZWdtZW50RW5naW5lLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9ub192YWx1ZV9zZWxlY3RlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIGlmICghZGF0ZSkgcmV0dXJuICcnOyAvLyB2YWxvciBwYXJjaWFsbWVudGUgZGlnaXRhZG8gKGluY29tcGxldG8pIOKAlCBuYWRhIGh1bWFuaXrDoXZlbCBhaW5kYS5cbiAgICAgICAgY29uc3QgbGFuZyA9IHRoaXMuY3VycmVudExhbmcoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLm1vZGUoKSkge1xuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGUpO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyhsYW5nLCB7IG1vbnRoOiAnbG9uZycsIHllYXI6ICdudW1lcmljJyB9KTtcbiAgICAgICAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlVGltZVN0cmluZyhsYW5nLCB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICAgICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgICAgICAgICAgICAgICAgIHNlY29uZDogdGhpcy5zaG93U2Vjb25kcygpID8gJzItZGlnaXQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBob3VyMTI6IHRoaXMucmVzb2x2ZWRIb3VyRm9ybWF0KCkgPT09ICcxMicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXNlICdkYXRldGltZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcobGFuZywge1xuICAgICAgICAgICAgICAgICAgICBkYXRlU3R5bGU6ICdsb25nJyxcbiAgICAgICAgICAgICAgICAgICAgdGltZVN0eWxlOiB0aGlzLnNob3dTZWNvbmRzKCkgPyAnbWVkaXVtJyA6ICdzaG9ydCcsXG4gICAgICAgICAgICAgICAgICAgIGhvdXIxMjogdGhpcy5yZXNvbHZlZEhvdXJGb3JtYXQoKSA9PT0gJzEyJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnOyAvLyBpc1NlZ21lbnRlZE1vZGUoKSBqw6EgcmVzdHJpbmdlIGEgZGF0ZS9tb250aC90aW1lL2RhdGV0aW1lXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQW7Dum5jaW8gY29tYmluYWRvIG5vIHByaW1laXJvIGZvY28gZ2VudcOtbm8gZG8gY2FtcG86IHJlc3VtbyBkbyB2YWxvciBpbnRlaXJvICsgc2VnbWVudG8gYXRpdm8sXG4gICAgICogIG51bWEgw5pOSUNBIGNoYW1hZGEgYSBgYW5ub3VuY2VgIChldml0YSBkdWFzIHJlZ2nDtWVzIGNvbmNvcnJlbnRlcy91bWEgY29ydGFuZG8gYSBvdXRyYSkuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZUdlbnVpbmVGb2N1cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHRoaXMuZGVzY3JpYmVXaG9sZVZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHNlZ21lbnRUZXh0ID0gdGhpcy5idWlsZFNlZ21lbnRBbm5vdW5jZW1lbnRUZXh0KCk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkID0gc3VtbWFyeSA/IGAke3N1bW1hcnl9LiAke3NlZ21lbnRUZXh0fWAgOiBzZWdtZW50VGV4dDtcbiAgICAgICAgaWYgKGNvbWJpbmVkKSB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShjb21iaW5lZCwgJ3BvbGl0ZScpO1xuICAgIH1cblxuICAgIC8qKiBQcm9wYWdhIG8gdmFsb3IgZGEgZW5naW5lIHBhcmEgbyBtb2RlbG8gKENWQSkgYXNzaW0gcXVlIHRvZG9zIG9zIHNlZ21lbnRvcyBlc3RpdmVyZW0gY29tcGxldG9zLiAqL1xuICAgIHByaXZhdGUgY29tbWl0U2VnbWVudGVkVmFsdWVJZkNvbXBsZXRlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc2VnbWVudEVuZ2luZS5pc0NvbXBsZXRlKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLnNldChudWxsKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYXNlID1cbiAgICAgICAgICAgIHRoaXMudmFsdWUoKSA/P1xuICAgICAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldERhdGUoKSxcbiAgICAgICAgICAgICAgICB0aGlzLmhvdXJzKCksXG4gICAgICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93U2Vjb25kcygpID8gdGhpcy5zZWNvbmRzKCkgOiAwLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHRoaXMuc2VnbWVudEVuZ2luZS50b0RhdGUoYmFzZSk7XG4gICAgICAgIGlmICghZGF0ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChkYXRlKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0NhbGVuZGFyKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2hvd1RpbWVQaWNrZXIoKSkge1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQoZGF0ZS5nZXRIb3VycygpKTtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQoZGF0ZS5nZXRNaW51dGVzKCkpO1xuICAgICAgICAgICAgdGhpcy5zZWNvbmRzLnNldChkYXRlLmdldFNlY29uZHMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoZGF0ZSk7XG4gICAgfVxuXG4gICAgLy8g4pSA4pSAIE5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgbmF2aWdhdGVQcmV2KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICd5ZWFycycpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSAtIDEwLCB2aWV3LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMueWVhckNoYW5nZS5lbWl0KHsgbW9udGg6IHZpZXcuZ2V0TW9udGgoKSwgeWVhcjogdmlldy5nZXRGdWxsWWVhcigpIC0gMTAgfSk7XG4gICAgICAgICAgICB0aGlzLmFubm91bmNlRGVjYWRlQ2hhbmdlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpIC0gMSwgdmlldy5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgfSk7XG4gICAgICAgICAgICB0aGlzLmFubm91bmNlWWVhckNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCksIHZpZXcuZ2V0TW9udGgoKSAtIDEsIDEpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoeyBtb250aDogbmV3RGF0ZS5nZXRNb250aCgpLCB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgfSk7XG4gICAgICAgICAgICB0aGlzLmFubm91bmNlTW9udGhDaGFuZ2UobmV3RGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgbmF2aWdhdGVOZXh0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3RGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICd5ZWFycycpIHtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ldyBEYXRlKHZpZXcuZ2V0RnVsbFllYXIoKSArIDEwLCB2aWV3LmdldE1vbnRoKCksIDEpKTtcbiAgICAgICAgICAgIHRoaXMueWVhckNoYW5nZS5lbWl0KHsgbW9udGg6IHZpZXcuZ2V0TW9udGgoKSwgeWVhcjogdmlldy5nZXRGdWxsWWVhcigpICsgMTAgfSk7XG4gICAgICAgICAgICB0aGlzLmFubm91bmNlRGVjYWRlQ2hhbmdlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5waWNrZXJWaWV3KCkgPT09ICdtb250aHMnKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodmlldy5nZXRGdWxsWWVhcigpICsgMSwgdmlldy5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgICAgIHRoaXMudmlld0RhdGUuc2V0KG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy55ZWFyQ2hhbmdlLmVtaXQoeyBtb250aDogdmlldy5nZXRNb250aCgpLCB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgfSk7XG4gICAgICAgICAgICB0aGlzLmFubm91bmNlWWVhckNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh2aWV3LmdldEZ1bGxZZWFyKCksIHZpZXcuZ2V0TW9udGgoKSArIDEsIDEpO1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLm1vbnRoQ2hhbmdlLmVtaXQoeyBtb250aDogbmV3RGF0ZS5nZXRNb250aCgpLCB5ZWFyOiBuZXdEYXRlLmdldEZ1bGxZZWFyKCkgfSk7XG4gICAgICAgICAgICB0aGlzLmFubm91bmNlTW9udGhDaGFuZ2UobmV3RGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSBzw7MgXCJ7bcOqc30gZGUge2Fub31cIiAoZXguOiBcIm91dHVicm8gZGUgMjAyNlwiKSBhbyBjcnV6YXIgZnJvbnRlaXJhIGRlIG3DqnMgbmEgZ3JhZGUgZGUgZGlhcy5cbiAgICAgKiAgTyBub3ZvIGZvY28gKGJ1dHRvbltyb2xlPVwiZ3JpZGNlbGxcIl0pIGrDoSBjYXJyZWdhIGVzc2EgaW5mbyBkZW50cm8gZG8gYXJpYS1sYWJlbCBsb25nbyBkZVxuICAgICAqICBgZm9ybWF0RGF5QXJpYUxhYmVsYCwgbWFzIG8gbm9tZSBkbyBtw6pzIGZpY2EgXCJlbnRlcnJhZG9cIiBubyBtZWlvIGRhIGZyYXNlIGUgcGFzc2EgZGVzcGVyY2ViaWRvXG4gICAgICogIChjb25maXJtYWRvIGNvbSB0ZXN0ZSBtYW51YWwgdmlhIE9yY2EpLiBTZW0gcHJlZml4byB0aXBvIFwiYWdvcmEgZXhpYmluZG9cIiwgbWVzbWEgY29udmVuw6fDo29cbiAgICAgKiAgYWRvdGFkYSBwb3Igb3V0cm9zIGNhbGVuZMOhcmlvcyBhY2Vzc8OtdmVpcyAoZXguOiByZWFjdC1hcmlhKS4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlTW9udGhDaGFuZ2UobmV3RGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgIG5ld0RhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuY3VycmVudExhbmcoKSwgeyBtb250aDogJ2xvbmcnLCB5ZWFyOiAnbnVtZXJpYycgfSksXG4gICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSBvIGFubyBhdHVhbG1lbnRlIGV4aWJpZG8gYW8gcGFnaW5hciBhIHZpZXcgJ21vbnRocycgKGV4LjogXCIyMDI1XCIpLiBPIGA8c3Bhbj5gIGNlbnRyYWxcbiAgICAgKiAgcXVlIG1vc3RyYSBlc3NlIGFubyBubyBjYWJlw6dhbGhvIG7Do28gw6kgZm9jw6F2ZWwsIGUgbyBhcmlhLWxhYmVsIGRvcyBib3TDtWVzIGRlIG5hdmVnYcOnw6NvIHPDs1xuICAgICAqICBmYWxhIG8gYW5vIGRlIERFU1RJTk8gKFwiQW5vIGFudGVyaW9yLCAyMDI1XCIpIOKAlCBzZW0gaXNzbywgbyBsZWl0b3IgZGUgdGVsYSBudW5jYSBjb25maXJtYSBvXG4gICAgICogIGFubyBxdWUgcGFzc291IGEgZXN0YXIgZW0gZXhpYmnDp8Ojbywgc8OzIG9zIGFsdm9zIFwiYW50ZXJpb3JcIi9cInByw7N4aW1vXCIuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZVllYXJDaGFuZ2UobmV3RGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgIG5ld0RhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuY3VycmVudExhbmcoKSwgeyB5ZWFyOiAnbnVtZXJpYycgfSksXG4gICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogTWVzbWEgbW90aXZhw6fDo28gZGUgYGFubm91bmNlWWVhckNoYW5nZWAsIHBhcmEgYSB2aWV3ICd5ZWFycycgKHBhZ2luYcOnw6NvIGRlIGTDqWNhZGEpIOKAlCBhbnVuY2lhXG4gICAgICogIG8gaW50ZXJ2YWxvIGF0dWFsbWVudGUgZXhpYmlkbyAoZXguOiBcIjIwMjAg4oCTIDIwMzFcIiksIGVzcGVsaGFuZG8gbyB0ZXh0byBkbyBgPHNwYW4+YCBjZW50cmFsLiAqL1xuICAgIHByaXZhdGUgYW5ub3VuY2VEZWNhZGVDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKGAke3RoaXMuY3VycmVudERlY2FkZVN0YXJ0KCl9IOKAkyAke3RoaXMuY3VycmVudERlY2FkZVN0YXJ0KCkgKyAxMX1gLCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUNhbGVuZGFyR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgdGhpcy5tb2RlKCkgPT09ICdyYW5nZScgJiYgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpICE9PSBudWxsKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgLy8gQ2FuY2VsYW1lbnRvIGxldmU6IGRlc2lzdGUgc8OzIGRhIGRhdGEgaW5pY2lhbCBwZW5kZW50ZSwgbWFudGVuZG8gbyBwYWluZWwgYWJlcnRvLFxuICAgICAgICAgICAgLy8gZW0gdmV6IGRlIGZlY2hhciBvIGRpw6Fsb2dvIGludGVpcm8gKG8gw7puaWNvIGNhbWluaG8gYW50ZXMgZGlzc28pLiBgc3RvcFByb3BhZ2F0aW9uYFxuICAgICAgICAgICAgLy8gaW1wZWRlIGVzc2UgbWVzbW8gRXNjYXBlIGRlIGJvcmJ1bGhhciBhdMOpIGBkb2N1bWVudC5ib2R5YCwgb25kZSBvXG4gICAgICAgICAgICAvLyBgT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlcmAgZG8gQ0RLIGVzY3V0YSBga2V5ZG93bmAgKGZhc2UgZGUgYnViYmxlLCBzZW0gY2FwdHVyZSkgZVxuICAgICAgICAgICAgLy8gZGlzcGFyYXJpYSBgaGFuZGxlT3ZlcmxheUtleWRvd25gL2BjbG9zZVBhbmVsKClgIOKAlCBzZW0gaXNzbywgbyBjYW5jZWxhbWVudG8gbGV2ZSBlIG9cbiAgICAgICAgICAgIC8vIGZlY2hhbWVudG8gdG90YWwgYWNvbnRlY2VyaWFtIG5lc3NlIG1lc21vIEVzY2FwZS4gU2VtIGBwZW5kaW5nUmFuZ2VTdGFydGAsIGVzc2UgYGlmYFxuICAgICAgICAgICAgLy8gw6kgZmFsc28gZSBvIEVzY2FwZSBzZWd1ZSBpbnRvY2FkbyBhdMOpIGBkb2N1bWVudC5ib2R5YCwgZmVjaGFuZG8gbyBwYWluZWwgY29tbyBzZW1wcmUuXG4gICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsUGVuZGluZ1JhbmdlU3RhcnQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IEFSUk9XUyA9IFsnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nXTtcbiAgICAgICAgaWYgKCFBUlJPV1MuaW5jbHVkZXMoZXZlbnQua2V5KSkgcmV0dXJuO1xuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgZ3JpZCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGJ1dHRvbnMgPSBBcnJheS5mcm9tKGdyaWQucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJ2J1dHRvbltyb2xlPVwiZ3JpZGNlbGxcIl0nKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRJZHggPSBidXR0b25zLmluZGV4T2YoZXZlbnQudGFyZ2V0IGFzIEhUTUxCdXR0b25FbGVtZW50KTtcbiAgICAgICAgaWYgKGN1cnJlbnRJZHggPT09IC0xKSByZXR1cm47XG5cbiAgICAgICAgbGV0IGRlbHRhID0gMDtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93UmlnaHQnKSBkZWx0YSA9IDE7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93TGVmdCcpIGRlbHRhID0gLTE7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93RG93bicpIGRlbHRhID0gRGF0ZXBpY2tlckNvbXBvbmVudC5EQVlTX0lOX1dFRUs7XG4gICAgICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSBkZWx0YSA9IC1EYXRlcGlja2VyQ29tcG9uZW50LkRBWVNfSU5fV0VFSztcblxuICAgICAgICBjb25zdCBuZXh0SWR4ID0gY3VycmVudElkeCArIGRlbHRhO1xuXG4gICAgICAgIGlmIChuZXh0SWR4IDwgMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldkRpc2FibGVkKCkpIHJldHVybjtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVQcmV2KCk7XG4gICAgICAgICAgICBhZnRlck5leHRSZW5kZXIoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMucG9wdXBQYW5lbCgpPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidG5zID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxCdXR0b25FbGVtZW50PignYnV0dG9uW3JvbGU9XCJncmlkY2VsbFwiXScpID8/IFtdLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJZHggPSBNYXRoLm1heCgwLCBidG5zLmxlbmd0aCArIG5leHRJZHgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5maW5kRW5hYmxlZChidG5zLCB0YXJnZXRJZHgsIC0xKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5maW5kRW5hYmxlZChidG5zLCB0YXJnZXRJZHgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJZHggPj0gYnV0dG9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm5leHREaXNhYmxlZCgpKSByZXR1cm47XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgpO1xuICAgICAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLnBvcHVwUGFuZWwoKT8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRucyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbD8ucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJ2J1dHRvbltyb2xlPVwiZ3JpZGNlbGxcIl0nKSA/PyBbXSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0SWR4ID0gTWF0aC5taW4obmV4dElkeCAtIGJ1dHRvbnMubGVuZ3RoLCBidG5zLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXBpY2tlckNvbXBvbmVudC5maW5kRW5hYmxlZChidG5zLCB0YXJnZXRJZHgsIDEpID8/XG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlcGlja2VyQ29tcG9uZW50LmZpbmRFbmFibGVkKGJ0bnMsIHRhcmdldElkeCwgLTEpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ/LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFidXR0b25zW25leHRJZHhdPy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgYnV0dG9uc1tuZXh0SWR4XS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZmluZEVuYWJsZWQoXG4gICAgICAgIGJ1dHRvbnM6IEhUTUxCdXR0b25FbGVtZW50W10sXG4gICAgICAgIHN0YXJ0SWR4OiBudW1iZXIsXG4gICAgICAgIGRpcmVjdGlvbjogMSB8IC0xLFxuICAgICk6IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydElkeDsgaSA+PSAwICYmIGkgPCBidXR0b25zLmxlbmd0aDsgaSArPSBkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIGlmICghYnV0dG9uc1tpXS5kaXNhYmxlZCkgcmV0dXJuIGJ1dHRvbnNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN3aXRjaFRvTW9udGhzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdtb250aHMnKTtcbiAgICAgICAgdGhpcy5mb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBiYWNrVG9DYWxlbmRhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5waWNrZXJWaWV3LnNldCgnY2FsZW5kYXInKTtcbiAgICAgICAgdGhpcy5mb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBTZWxlY3Rpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0RGF0ZShkYXk6IENhbGVuZGFyRGF5KTogdm9pZCB7XG4gICAgICAgIGlmIChkYXkuaXNEaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpcGxlTW9kZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZU11bHRpcGxlRGF0ZShkYXkuZGF0ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUmFuZ2VTdGFydCgpO1xuICAgICAgICAgICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmFuZ2VTdGFydC5zZXQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgICAgIC8vIFNlbSBpc3NvIG8gPGlucHV0PiBmaWNhdmEgY29tIG8gdmFsb3IgYW50ZXJpb3IgKG91IHZhemlvKSBlbnF1YW50byBzw7MgYSBkYXRhXG4gICAgICAgICAgICAgICAgLy8gaW5pY2lhbCBlc3RhdmEgZXNjb2xoaWRhIOKAlCB0YW50byBvIHRleHRvIHZpc8OtdmVsIHF1YW50byBvIHF1ZSB1bSBsZWl0b3IgZGUgdGVsYVxuICAgICAgICAgICAgICAgIC8vIGzDqiBhbyBmb2NhciBvIGNhbXBvIGZpY2F2YW0gb2Jzb2xldG9zIGF0w6kgYSBzZWd1bmRhIGVzY29saGEuXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkoeyBzdGFydDogZGF5LmRhdGUsIGVuZDogbnVsbCB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlUmFuZ2VTdGFydFNlbGVjdGVkKGRheS5kYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID1cbiAgICAgICAgICAgICAgICAgICAgcGVuZGluZy5nZXRUaW1lKCkgPD0gZGF5LmRhdGUuZ2V0VGltZSgpID8gW3BlbmRpbmcsIGRheS5kYXRlXSA6IFtkYXkuZGF0ZSwgcGVuZGluZ107XG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2U6IERhdGVSYW5nZSA9IHsgc3RhcnQsIGVuZCB9O1xuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VWYWx1ZS5zZXQocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShyYW5nZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KHJhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm91bmNlUmFuZ2VDb21wbGV0ZWQocmFuZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgIGRheS5kYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBkYXkuZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgZGF5LmRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KG5ld0RhdGUpO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdkYXRlJykge1xuICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGUoKSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKG5ld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UobmV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3RGF0ZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5oaWRlT25EYXRlVGltZVNlbGVjdCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQWRpY2lvbmEvcmVtb3ZlIHVtYSBkYXRhIGRhIHNlbGXDp8OjbyBtw7psdGlwbGEuIE8gcGFpbmVsIHBlcm1hbmVjZSBhYmVydG8uICovXG4gICAgcHJpdmF0ZSB0b2dnbGVNdWx0aXBsZURhdGUoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkID0gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLm11bHRpcGxlVmFsdWVzKCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZXhpc3RpbmcuZmluZEluZGV4KChkKSA9PiBpc1NhbWVEYXkoZCwgbm9ybWFsaXplZCkpO1xuICAgICAgICBjb25zdCBuZXh0ID1cbiAgICAgICAgICAgIGluZGV4ID49IDBcbiAgICAgICAgICAgICAgICA/IGV4aXN0aW5nLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpXG4gICAgICAgICAgICAgICAgOiBbLi4uZXhpc3RpbmcsIG5vcm1hbGl6ZWRdLnNvcnQoKGEsIGIpID0+IGEuZ2V0VGltZSgpIC0gYi5nZXRUaW1lKCkpO1xuICAgICAgICB0aGlzLm11bHRpcGxlVmFsdWVzLnNldChuZXh0KTtcbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkobmV4dCk7XG4gICAgICAgIGNvbnN0IGVtaXRWYWx1ZSA9IG5leHQubGVuZ3RoID8gbmV4dCA6IG51bGw7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoZW1pdFZhbHVlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KGVtaXRWYWx1ZSk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VNdWx0aXBsZURhdGVUb2dnbGUobm9ybWFsaXplZCwgaW5kZXggPCAwKTtcbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSB2aWEgTGl2ZUFubm91bmNlciBhIGRhdGEgY29tcGxldGEgKGRpYSBkYSBzZW1hbmEsIGRpYSwgbcOqcywgYW5vKSBlIHNlIGVsYSBhY2Fib3VcbiAgICAgKiAgZGUgc2VyIHNlbGVjaW9uYWRhIG91IGRlc21hcmNhZGEg4oCUIHBybyB1c3XDoXJpbyBkZSBsZWl0b3IgZGUgdGVsYSBzYWJlciBleGF0YW1lbnRlIG8gcXVlXG4gICAgICogIG11ZG91IGFudGVzIGRlIHNlZ3VpciBlc2NvbGhlbmRvIGEgcHLDs3hpbWEgZGF0YS4gKi9cbiAgICBwcml2YXRlIGFubm91bmNlTXVsdGlwbGVEYXRlVG9nZ2xlKGRhdGU6IERhdGUsIGlzTm93U2VsZWN0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGF0ZVRleHQgPSB0aGlzLmZvcm1hdERheUFyaWFMYWJlbChkYXRlKTtcbiAgICAgICAgY29uc3Qga2V5ID0gaXNOb3dTZWxlY3RlZFxuICAgICAgICAgICAgPyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGF0ZV9zZWxlY3RlZCdcbiAgICAgICAgICAgIDogJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2RhdGVfZGVzZWxlY3RlZCc7XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGtleSwgeyBkYXRlOiBkYXRlVGV4dCB9KSwgJ3BvbGl0ZScpO1xuICAgIH1cblxuICAgIC8qKiBUZXh0byBjb21wYXJ0aWxoYWRvIGVudHJlIG8gYW7Dum5jaW8gdHJhbnNpdMOzcmlvIGRlIGluw61jaW8gZGUgaW50ZXJ2YWxvIGVzY29saGlkb1xuICAgICAqICAoYGFubm91bmNlUmFuZ2VTdGFydFNlbGVjdGVkYCkgZSBvIHN0YXR1cyBwZXJzaXN0ZW50ZSBleHBvc3RvIHZpYSBgYXJpYS1kZXNjcmliZWRieWAgbm9cbiAgICAgKiAgYDxpbnB1dD5gIChgcmFuZ2VQZW5kaW5nU3RhdHVzVGV4dGApIOKAlCBtZXNtYSByZWRhw6fDo28gbm9zIGRvaXMgbHVnYXJlcyBkZSBwcm9ww7NzaXRvLCBwcmEgbsOjb1xuICAgICAqICBzb2FyZW0gY29tbyBkb2lzIGVzdGFkb3MgZGlmZXJlbnRlcyBwcm8gbWVzbW8gbW9tZW50by4gKi9cbiAgICBwcml2YXRlIGJ1aWxkUmFuZ2VTdGFydFNlbGVjdGVkVGV4dChkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9yYW5nZV9zdGFydF9zZWxlY3RlZCcsIHtcbiAgICAgICAgICAgIGRhdGU6IHRoaXMuZm9ybWF0RGF5QXJpYUxhYmVsKGRhdGUpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQW51bmNpYSBxdWUgYSBkYXRhIElOSUNJQUwgZG8gaW50ZXJ2YWxvIGZvaSBlc2NvbGhpZGEg4oCUIG8gcHJpbWVpcm8gY2xpcXVlIGVtIGByYW5nZWAgZXJhXG4gICAgICogIG11ZG8gKGFvIGNvbnRyw6FyaW8gZG8gdG9nZ2xlIGVtIG1vZG8gYG11bHRpcGxlYCwgc2VtcHJlIGFudW5jaWFkbykuIFJlY2ViZSB1bSBgRGF0ZWAgcHVybyxcbiAgICAgKiAgbsOjbyB1bSBjbGlxdWU6IGBzZWxlY3RUb2RheSgpYCBjaGFtYSBgc2VsZWN0RGF0ZSgpYCBpbnRlcm5hbWVudGUgZSBoZXJkYSBlc3RlIGFuw7puY2lvIGRlXG4gICAgICogIGdyYcOnYSwgc2VtIHByZWNpc2FyIGRlIHVtYSBzZWd1bmRhIGNoYW1hZGEuICovXG4gICAgcHJpdmF0ZSBhbm5vdW5jZVJhbmdlU3RhcnRTZWxlY3RlZChkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5saXZlQW5ub3VuY2VyLmFubm91bmNlKHRoaXMuYnVpbGRSYW5nZVN0YXJ0U2VsZWN0ZWRUZXh0KGRhdGUpLCAncG9saXRlJyk7XG4gICAgfVxuXG4gICAgLyoqIEFudW5jaWEgbyBpbnRlcnZhbG8gY29uY2x1w61kbywgY2hhbWFkbyBhbnRlcyBkZSBgY2xvc2VQYW5lbCgpYCDigJQgbyBgTGl2ZUFubm91bmNlcmAgZXNjcmV2ZVxuICAgICAqICBudW1hIHJlZ2nDo28gYGFyaWEtbGl2ZWAgcHLDs3ByaWEgZSBkZXNhY29wbGFkYSBkbyBmb2NvLCBlbnTDo28gbsOjbyDDqSBjb3J0YWRvIHBlbGEgcmVzdGF1cmHDp8Ojb1xuICAgICAqICBkZSBmb2NvIHF1ZSBgY2xvc2VQYW5lbCgpYCBhZ2VuZGEgdW0gdGljayBkZXBvaXMgdmlhIGBhZnRlck5leHRSZW5kZXJgLiAqL1xuICAgIHByaXZhdGUgYW5ub3VuY2VSYW5nZUNvbXBsZXRlZChyYW5nZTogRGF0ZVJhbmdlKTogdm9pZCB7XG4gICAgICAgIGlmICghcmFuZ2Uuc3RhcnQgfHwgIXJhbmdlLmVuZCkgcmV0dXJuO1xuICAgICAgICB2b2lkIHRoaXMubGl2ZUFubm91bmNlci5hbm5vdW5jZShcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9yYW5nZV9zZWxlY3RlZCcsIHtcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwocmFuZ2Uuc3RhcnQpLFxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5mb3JtYXREYXlBcmlhTGFiZWwocmFuZ2UuZW5kKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgJ3BvbGl0ZScsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNlbGVjdFllYXIoeWVhcjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzWWVhckRpc2FibGVkKHllYXIpKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZSh5ZWFyLCAwLCAxKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zZXQobmV3RGF0ZSk7XG4gICAgICAgIHRoaXMuaW5wdXREYXRlID0gdGhpcy5mb3JtYXRGb3JEaXNwbGF5KG5ld0RhdGUpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KG5ld0RhdGUpO1xuICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2VsZWN0TW9udGgobW9udGhJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzTW9udGhEaXNhYmxlZChtb250aEluZGV4KSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgICAgICBjb25zdCBuZXdWaWV3RGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoSW5kZXgsIDEpO1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG5ld1ZpZXdEYXRlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RGlzcGxheUZvcihuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmVtaXQobmV3Vmlld0RhdGUpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRlLnNldChuZXdWaWV3RGF0ZSk7XG4gICAgICAgICAgICB0aGlzLnBpY2tlclZpZXcuc2V0KCdjYWxlbmRhcicpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0Jlc3RDYWxlbmRhclRhcmdldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNlbGVjdFRvZGF5KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGlmICghdGhpcy5pc0RhdGVEaXNhYmxlZCh0b2RheSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbERheTogQ2FsZW5kYXJEYXkgPSB7XG4gICAgICAgICAgICAgICAgZGF0ZTogdG9kYXksXG4gICAgICAgICAgICAgICAgZGF5T2ZNb250aDogdG9kYXkuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgICAgIGlzQ3VycmVudE1vbnRoOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzVG9kYXk6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNEaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNSYW5nZVN0YXJ0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc1JhbmdlRW5kOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0luUmFuZ2U6IGZhbHNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShjYWxEYXkpO1xuICAgICAgICAgICAgdGhpcy50b2RheUNsaWNrLmVtaXQodG9kYXkpO1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAncmFuZ2UnICYmIHRoaXMuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBFbSByYW5nZSwgc2VsZWN0RGF0ZSgpIHPDsyBmZWNoYSBvIHBhaW5lbCBuYSBzZWd1bmRhIGVzY29saGEgKHZlciBzZXUgcmFtb1xuICAgICAgICAgICAgICAgIC8vICdyYW5nZScpOyBuYSBwcmltZWlyYSwgbyBmb2NvIGZpY2EgcGFyYWRvIG5vIGJvdMOjbyBcIkhvamVcIiBkbyByb2RhcMOpLCBmb3JhIGRhXG4gICAgICAgICAgICAgICAgLy8gZ3JhZGUg4oCUIHNlbSBpc3NvIG8gdXN1w6FyaW8gbsOjbyB0aW5oYSBuZW5odW1hIHBpc3RhIGRlIHF1ZSBwcmVjaXNhdmEgdm9sdGFyIHByYVxuICAgICAgICAgICAgICAgIC8vIGdyYWRlIHByYSBlc2NvbGhlciBhIGRhdGEgZmluYWwuIEEgY8OpbHVsYSBkZSBob2plIGrDoSBjYXJyZWdhXG4gICAgICAgICAgICAgICAgLy8gYGRhdGEtZm9jdXM9XCJzZWxlY3RlZFwiYCAoaXNSYW5nZVN0YXJ0IGFjYWJvdSBkZSBzZXIgc2V0YWRvIHBvciBzZWxlY3REYXRlKSwgcXVlXG4gICAgICAgICAgICAgICAgLy8gZm9jdXNCZXN0Q2FsZW5kYXJUYXJnZXQoKSBqw6EgcHJpb3JpemEuIE8gYW7Dum5jaW8gZGUgXCJpbsOtY2lvIHNlbGVjaW9uYWRvXCIgasOhXG4gICAgICAgICAgICAgICAgLy8gZGlzcGFyb3UgZGVudHJvIGRlIHNlbGVjdERhdGUoKSBhbnRlcyBkZXN0ZSBibG9jbyByb2Rhci5cbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzQmVzdENhbGVuZGFyVGFyZ2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2xlYXJWYWx1ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBoYWRSYW5nZUluUHJvZ3Jlc3MgPVxuICAgICAgICAgICAgdGhpcy5tb2RlKCkgPT09ICdyYW5nZScgJiYgKHRoaXMucGVuZGluZ1JhbmdlU3RhcnQoKSAhPT0gbnVsbCB8fCB0aGlzLnJhbmdlVmFsdWUoKSAhPT0gbnVsbCk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLmhvdXJzLnNldCgwKTtcbiAgICAgICAgdGhpcy5taW51dGVzLnNldCgwKTtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgwKTtcbiAgICAgICAgdGhpcy5yYW5nZVZhbHVlLnNldChudWxsKTtcbiAgICAgICAgdGhpcy5tdWx0aXBsZVZhbHVlcy5zZXQoW10pO1xuICAgICAgICB0aGlzLnBlbmRpbmdSYW5nZVN0YXJ0LnNldChudWxsKTtcbiAgICAgICAgdGhpcy5zZXREaXNwbGF5Rm9yKG51bGwpO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZShudWxsKTtcbiAgICAgICAgdGhpcy5jbGVhckNsaWNrLmVtaXQoZXZlbnQpO1xuICAgICAgICBpZiAoaGFkUmFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAvLyBTw7MgYW51bmNpYSBxdWFuZG8gaGF2aWEgZGUgZmF0byBhbGdvIGEgbGltcGFyIOKAlCBldml0YSBcImludGVydmFsbyBsaW1wb1wiIHRvZGEgdmV6XG4gICAgICAgICAgICAvLyBxdWUgYWxndcOpbSBhcGVydGEgXCJMaW1wYXJcIiBwb3IgZ2FyYW50aWEsIHNlbSBuYWRhIHNlbGVjaW9uYWRvIGFpbmRhLlxuICAgICAgICAgICAgdm9pZCB0aGlzLmxpdmVBbm5vdW5jZXIuYW5ub3VuY2UoXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX2NsZWFyZWQnKSxcbiAgICAgICAgICAgICAgICAncG9saXRlJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZVBhbmVsKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnZhbHVlKCkgPz8gbmV3IERhdGUoKTtcbiAgICAgICAgY29uc3QgY29uZmlybWVkID0gbmV3IERhdGUoXG4gICAgICAgICAgICBjdXJyZW50LmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICBjdXJyZW50LmdldE1vbnRoKCksXG4gICAgICAgICAgICBjdXJyZW50LmdldERhdGUoKSxcbiAgICAgICAgICAgIHRoaXMuaG91cnMoKSxcbiAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgdGhpcy5zaG93U2Vjb25kcygpID8gdGhpcy5zZWNvbmRzKCkgOiAwLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnZhbHVlLnNldChjb25maXJtZWQpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UoY29uZmlybWVkKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KGNvbmZpcm1lZCk7XG4gICAgICAgIHRoaXMuY2xvc2VQYW5lbCgpO1xuICAgIH1cblxuICAgIC8vIOKUgOKUgCBUaW1lIHBpY2tlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRIb3VycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3Vycy5zZXQoKHRoaXMuaG91cnMoKSArIHRoaXMuc3RlcEhvdXIoKSkgJSB0aGlzLm1heEhvdXJzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZGVjcmVtZW50SG91cnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG91cnMuc2V0KCh0aGlzLmhvdXJzKCkgLSB0aGlzLnN0ZXBIb3VyKCkgKyB0aGlzLm1heEhvdXJzKSAlIHRoaXMubWF4SG91cnMpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpbmNyZW1lbnRNaW51dGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1pbnV0ZXMuc2V0KCh0aGlzLm1pbnV0ZXMoKSArIHRoaXMubWludXRlU3RlcCgpKSAlIHRoaXMubWF4TWludXRlcyk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlY3JlbWVudE1pbnV0ZXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWludXRlcy5zZXQoKHRoaXMubWludXRlcygpIC0gdGhpcy5taW51dGVTdGVwKCkgKyB0aGlzLm1heE1pbnV0ZXMpICUgdGhpcy5tYXhNaW51dGVzKTtcbiAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaW5jcmVtZW50U2Vjb25kcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWNvbmRzLnNldCgodGhpcy5zZWNvbmRzKCkgKyB0aGlzLnN0ZXBTZWNvbmQoKSkgJSA2MCk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlY3JlbWVudFNlY29uZHMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoKHRoaXMuc2Vjb25kcygpIC0gdGhpcy5zdGVwU2Vjb25kKCkgKyA2MCkgJSA2MCk7XG4gICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgfVxuXG4gICAgQG51bWVyaWNLZXlzT25seSgpXG4gICAgcHJvdGVjdGVkIGhhbmRsZUhvdXJzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudEhvdXJzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50SG91cnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBudW1lcmljS2V5c09ubHkoKVxuICAgIHByb3RlY3RlZCBoYW5kbGVNaW51dGVzS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dVcCcpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudE1pbnV0ZXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRNaW51dGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBAbnVtZXJpY0tleXNPbmx5KClcbiAgICBwcm90ZWN0ZWQgaGFuZGxlU2Vjb25kc0tleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRTZWNvbmRzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50U2Vjb25kcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUhvdXJzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pczEySG91ckZvcm1hdCgpKSB7XG4gICAgICAgICAgICBjb25zdCBoYWxmID0gRGF0ZXBpY2tlckNvbXBvbmVudC5IT1VSU19QRVJfTUVSSURJRU07XG4gICAgICAgICAgICBjb25zdCBoMTIgPSBNYXRoLm1pbihoYWxmLCBNYXRoLm1heCgxLCBwYXJzZWQpKTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBoMTIgJSBoYWxmO1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQodGhpcy5hbVBtKCkgPT09ICdQTScgPyBiYXNlICsgaGFsZiA6IGJhc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ob3Vycy5zZXQoTWF0aC5taW4odGhpcy5tYXhIb3VycyAtIDEsIE1hdGgubWF4KDAsIHBhcnNlZCkpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIC8qKiBBbHRlcm5hIGVudHJlIEFNIGUgUE0gc29tYW5kby9zdWJ0cmFpbmRvIDEyIGhvcmFzIGRhIGhvcmEgaW50ZXJuYS4gKi9cbiAgICBwcm90ZWN0ZWQgdG9nZ2xlQW1QbSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGFsZiA9IERhdGVwaWNrZXJDb21wb25lbnQuSE9VUlNfUEVSX01FUklESUVNO1xuICAgICAgICB0aGlzLmhvdXJzLnNldCh0aGlzLmhvdXJzKCkgPCBoYWxmID8gdGhpcy5ob3VycygpICsgaGFsZiA6IHRoaXMuaG91cnMoKSAtIGhhbGYpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lVG9WYWx1ZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVNaW51dGVzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMubWludXRlcy5zZXQoTWF0aC5taW4odGhpcy5tYXhNaW51dGVzIC0gMSwgTWF0aC5tYXgoMCwgcGFyc2VkKSkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jVGltZVRvVmFsdWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVTZWNvbmRzSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHJhdywgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vjb25kcy5zZXQoTWF0aC5taW4oNTksIE1hdGgubWF4KDAsIHBhcnNlZCkpKTtcbiAgICAgICAgICAgIHRoaXMuc3luY1RpbWVUb1ZhbHVlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25EYXlIb3ZlcihkYXRlOiBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgIHRoaXMuaG92ZXJEYXRlLnNldChkYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gICAgcHJvdGVjdGVkIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgbWluID0gdGhpcy5taW4oKTtcbiAgICAgICAgY29uc3QgbWF4ID0gdGhpcy5tYXgoKTtcbiAgICAgICAgaWYgKG1pbiAmJiBzdHJpcFRpbWUoZGF0ZSkgPCBzdHJpcFRpbWUobWluKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChtYXggJiYgc3RyaXBUaW1lKGRhdGUpID4gc3RyaXBUaW1lKG1heCkpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBkaXNhYmxlZERheXMgPSB0aGlzLmRpc2FibGVkRGF5cygpO1xuICAgICAgICBpZiAoZGlzYWJsZWREYXlzLmxlbmd0aCAmJiBkaXNhYmxlZERheXMuaW5jbHVkZXMoZGF0ZS5nZXREYXkoKSkpIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBkaXNhYmxlZERhdGVzID0gdGhpcy5kaXNhYmxlZERhdGVzKCk7XG4gICAgICAgIGlmIChkaXNhYmxlZERhdGVzLmxlbmd0aCAmJiBkaXNhYmxlZERhdGVzLnNvbWUoKGQpID0+IGlzU2FtZURheShkLCBkYXRlKSkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzWWVhclNlbGVjdGVkKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgcmV0dXJuICEhc2VsZWN0ZWQgJiYgc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0geWVhcjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNZZWFyRGlzYWJsZWQoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgeWVhciA8IG1pbi5nZXRGdWxsWWVhcigpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1heCAmJiB5ZWFyID4gbWF4LmdldEZ1bGxZZWFyKCkpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQ3VycmVudFllYXIoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB5ZWFyID09PSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzTW9udGhTZWxlY3RlZChtb250aEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgIHJldHVybiAhIXNlbGVjdGVkICYmIHNlbGVjdGVkLmdldE1vbnRoKCkgPT09IG1vbnRoSW5kZXggJiYgc2VsZWN0ZWQuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5jdXJyZW50WWVhcigpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBpc01vbnRoRGlzYWJsZWQobW9udGhJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRZZWFyKCk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChtaW4gJiYgKHllYXIgPCBtaW4uZ2V0RnVsbFllYXIoKSB8fCAoeWVhciA9PT0gbWluLmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA8IG1pbi5nZXRNb250aCgpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXggJiYgKHllYXIgPiBtYXguZ2V0RnVsbFllYXIoKSB8fCAoeWVhciA9PT0gbWF4LmdldEZ1bGxZZWFyKCkgJiYgbW9udGhJbmRleCA+IG1heC5nZXRNb250aCgpKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcGFkVGltZSh2YWx1ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICB9XG5cbiAgICAvKiogYGRheWAgw6kgb3BjaW9uYWwgZSBzw7MgdXNhZG8gZW0gYG1vZGU9XCJyYW5nZVwiYCDigJQgb3MgZGVtYWlzIGNhbGwgc2l0ZXMgKHJlc3VtbyBkbyB2YWxvclxuICAgICAqICBzZWdtZW50YWRvLCBhbsO6bmNpbyBkZSB0b2dnbGUgZW0gbW9kbyBgbXVsdGlwbGVgKSBudW5jYSB0w6ptIHVtIGBDYWxlbmRhckRheWAgw6AgbcOjbyBlIG51bmNhXG4gICAgICogIHJvZGFtIGVtIGByYW5nZWAsIGVudMOjbyBjb250aW51YW0gcmVjZWJlbmRvIGV4YXRhbWVudGUgbyB0ZXh0byBkZSBzZW1wcmUuICovXG4gICAgcHJvdGVjdGVkIGZvcm1hdERheUFyaWFMYWJlbChkYXRlOiBEYXRlLCBkYXk/OiBDYWxlbmRhckRheSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZyh0aGlzLmN1cnJlbnRMYW5nKCksIHtcbiAgICAgICAgICAgIHdlZWtkYXk6ICdsb25nJyxcbiAgICAgICAgICAgIHllYXI6ICdudW1lcmljJyxcbiAgICAgICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZGF5IHx8IHRoaXMubW9kZSgpICE9PSAncmFuZ2UnKSByZXR1cm4gYmFzZTtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gdGhpcy5yYW5nZURheVN0YXR1c1N1ZmZpeChkYXkpO1xuICAgICAgICByZXR1cm4gc3VmZml4ID8gYCR7YmFzZX0sICR7c3VmZml4fWAgOiBiYXNlO1xuICAgIH1cblxuICAgIC8qKiBTdWZpeG8gcXVlIGRpeiBvIHBhcGVsIGRvIGRpYSBkZW50cm8gZG8gaW50ZXJ2YWxvIHNlbGVjaW9uYWRvIOKAlCBzZW0gaXNzbywgdG9kYSBjw6lsdWxhIGRhXG4gICAgICogIGdyYWRlIHNvYSBpZMOqbnRpY2EgcHJvIGxlaXRvciBkZSB0ZWxhLCBlIG8gw7puaWNvIGplaXRvIGRlIHNhYmVyIG9uZGUgZXN0w6EgbyBpbsOtY2lvL2ZpbSDDqVxuICAgICAqICBlbnhlcmdhbmRvIG8gZGVzdGFxdWUgdmlzdWFsLiAqL1xuICAgIHByaXZhdGUgcmFuZ2VEYXlTdGF0dXNTdWZmaXgoZGF5OiBDYWxlbmRhckRheSk6IHN0cmluZyB7XG4gICAgICAgIGlmIChkYXkuaXNSYW5nZVN0YXJ0ICYmIGRheS5pc1JhbmdlRW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX3N0YXJ0X2VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXkuaXNSYW5nZVN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX3N0YXJ0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheS5pc1JhbmdlRW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX2VuZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXkuaXNJblJhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3JhbmdlX2luX3JhbmdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKiBGb3JtYXRhIG8gdmFsb3IgcGFyYSBleGliacOnw6NvIG5vIGlucHV0LCBhcGxpY2FuZG8gcmFuZ2VTZXBhcmF0b3IsIGRhdGVGb3JtYXQgZSBtdWx0aXBsZVNlcGFyYXRvci4gKi9cbiAgICBwcml2YXRlIGZvcm1hdEZvckRpc3BsYXkodmFsdWU6IERhdGUgfCBEYXRlUmFuZ2UgfCBEYXRlW10gfCBudWxsKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlRm9ySW5wdXQoXG4gICAgICAgICAgICB0aGlzLm1vZGUoKSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdGhpcy5yYW5nZVNlcGFyYXRvcigpLFxuICAgICAgICAgICAgdGhpcy5yZXNvbHZlZERhdGVGb3JtYXQoKSxcbiAgICAgICAgICAgIHRoaXMubXVsdGlwbGVTZXBhcmF0b3IoKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHVhbGl6YSBgaW5wdXREYXRlYCBhIHBhcnRpciBkZSB1bSB2YWxvciDDum5pY28sIHJvdGVhbmRvIHBlbGEgZW5naW5lIGRlIHNlZ21lbnRvc1xuICAgICAqIChkYXRlL21vbnRoL3RpbWUvZGF0ZXRpbWUpIG91IHBlbG8gZm9ybWF0YWRvciBsZWdhZG8gKHJhbmdlL3llYXIvbXVsdGlwbGUpLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0RGlzcGxheUZvcih2YWx1ZTogRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWdtZW50TW9kZUNhbmRpZGF0ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlZ21lbnRFbmdpbmVDb25maWd1cmVkKCk7XG4gICAgICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUubG9hZEZyb21EYXRlKHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRlID0gdmFsdWUgPyB0aGlzLnNlZ21lbnRFbmdpbmUuZ2V0RGlzcGxheVN0cmluZygpIDogJyc7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnB1dERhdGUgPSB0aGlzLmZvcm1hdEZvckRpc3BsYXkodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIChSZSljb25maWd1cmEgYSBlbmdpbmUgZGUgc2VnbWVudG9zIHF1YW5kbyBgbW9kZWAvYGRhdGVGb3JtYXRgL2Bob3VyRm9ybWF0YC9gc2hvd1NlY29uZHNgXG4gICAgICogbXVkYXJhbSBkZXNkZSBhIMO6bHRpbWEgY2hhbWFkYSwgcmVjYXJyZWdhbmRvIG8gdmFsb3IgYXR1YWwuIENoYW1hZG8gZGUgZm9ybWEgc8OtbmNyb25hIGFcbiAgICAgKiBwYXJ0aXIgZGUgdG9kbyBwb250byBkZSBlbnRyYWRhIHF1ZSB1c2EgYSBlbmdpbmUg4oCUIG7Do28gZGVwZW5kZSBkZSB1bSBgZWZmZWN0KClgIChxdWUgc8OzXG4gICAgICogcm9kYSBlbSB1bSBjaWNsbyBkZSBjaGFuZ2UgZGV0ZWN0aW9uLCB0YXJkZSBkZW1haXMgcGFyYSBsZWl0dXJhcy9lc2NyaXRhcyBpbWVkaWF0YXMpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZW5zdXJlU2VnbWVudEVuZ2luZUNvbmZpZ3VyZWQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLm1vZGUoKTtcbiAgICAgICAgaWYgKG1vZGUgIT09ICdkYXRlJyAmJiBtb2RlICE9PSAnbW9udGgnICYmIG1vZGUgIT09ICd0aW1lJyAmJiBtb2RlICE9PSAnZGF0ZXRpbWUnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGNvbmZpZzogU2VnbWVudEVuZ2luZUNvbmZpZyA9IHtcbiAgICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgICBkYXRlRm9ybWF0OiB0aGlzLnJlc29sdmVkRGF0ZUZvcm1hdCgpLFxuICAgICAgICAgICAgaG91ckZvcm1hdDogdGhpcy5yZXNvbHZlZEhvdXJGb3JtYXQoKSxcbiAgICAgICAgICAgIHNob3dTZWNvbmRzOiB0aGlzLnNob3dTZWNvbmRzKCksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLmxhc3RTZWdtZW50Q29uZmlnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBsYXN0ICYmXG4gICAgICAgICAgICBsYXN0Lm1vZGUgPT09IGNvbmZpZy5tb2RlICYmXG4gICAgICAgICAgICBsYXN0LmRhdGVGb3JtYXQgPT09IGNvbmZpZy5kYXRlRm9ybWF0ICYmXG4gICAgICAgICAgICBsYXN0LmhvdXJGb3JtYXQgPT09IGNvbmZpZy5ob3VyRm9ybWF0ICYmXG4gICAgICAgICAgICBsYXN0LnNob3dTZWNvbmRzID09PSBjb25maWcuc2hvd1NlY29uZHNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXN0U2VnbWVudENvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zZWdtZW50RW5naW5lLmNvbmZpZ3VyZShjb25maWcpO1xuICAgICAgICB0aGlzLnNlZ21lbnRFbmdpbmUubG9hZEZyb21EYXRlKHRoaXMudmFsdWUoKSk7XG4gICAgfVxuXG4gICAgLyoqIFJldG9ybmEgYSB0cmFkdcOnw6NvIGRlIGBrZXlgLCBvdSBgZmFsbGJhY2tgIHF1YW5kbyBhIGNoYXZlIG7Do28gZXN0w6EgdHJhZHV6aWRhIChuZ3gtdHJhbnNsYXRlIHJldG9ybmEgYSBwcsOzcHJpYSBjaGF2ZSkuICovXG4gICAgcHJpdmF0ZSByZXNvbHZlVHJhbnNsYXRlZE9yRGVmYXVsdChrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zbGF0ZWQgIT09ICdzdHJpbmcnIHx8ICF0cmFuc2xhdGVkIHx8IHRyYW5zbGF0ZWQgPT09IGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2xhdGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3luY1RpbWVUb1ZhbHVlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkYXRlID0gdGhpcy52YWx1ZSgpID8/IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IG5ld0RhdGUgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgdGhpcy5taW51dGVzKCksXG4gICAgICAgICAgICB0aGlzLnNob3dTZWNvbmRzKCkgPyB0aGlzLnNlY29uZHMoKSA6IDAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudmFsdWUuc2V0KG5ld0RhdGUpO1xuICAgICAgICB0aGlzLnNldERpc3BsYXlGb3IobmV3RGF0ZSk7XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdEYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRDYWxlbmRhckRheShcbiAgICAgICAgZGF0ZTogRGF0ZSxcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IGJvb2xlYW4sXG4gICAgICAgIHRvZGF5OiBEYXRlLFxuICAgICAgICBzZWxlY3RlZDogRGF0ZSB8IG51bGwsXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBEYXRlIHwgbnVsbDsgZW5kOiBEYXRlIHwgbnVsbCB9LFxuICAgICAgICByYW5nZVN0YXJ0VGltZTogbnVtYmVyIHwgbnVsbCxcbiAgICAgICAgcmFuZ2VFbmRUaW1lOiBudW1iZXIgfCBudWxsLFxuICAgICk6IENhbGVuZGFyRGF5IHtcbiAgICAgICAgY29uc3QgaXNSYW5nZVN0YXJ0ID0gcmFuZ2Uuc3RhcnQgPyBpc1NhbWVEYXkoZGF0ZSwgcmFuZ2Uuc3RhcnQpIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzUmFuZ2VFbmQgPSByYW5nZS5lbmQgPyBpc1NhbWVEYXkoZGF0ZSwgcmFuZ2UuZW5kKSA6IGZhbHNlO1xuICAgICAgICBjb25zdCBkYXRlVGltZSA9IHN0cmlwVGltZShkYXRlKTtcbiAgICAgICAgY29uc3QgaXNJblJhbmdlID1cbiAgICAgICAgICAgIHJhbmdlU3RhcnRUaW1lICE9PSBudWxsICYmIHJhbmdlRW5kVGltZSAhPT0gbnVsbFxuICAgICAgICAgICAgICAgID8gZGF0ZVRpbWUgPiByYW5nZVN0YXJ0VGltZSAmJiBkYXRlVGltZSA8IHJhbmdlRW5kVGltZVxuICAgICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLmlzTXVsdGlwbGVNb2RlKClcbiAgICAgICAgICAgID8gdGhpcy5tdWx0aXBsZVZhbHVlcygpLnNvbWUoKGQpID0+IGlzU2FtZURheShkLCBkYXRlKSlcbiAgICAgICAgICAgIDogc2VsZWN0ZWRcbiAgICAgICAgICAgICAgPyBpc1NhbWVEYXkoZGF0ZSwgc2VsZWN0ZWQpXG4gICAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlPZk1vbnRoOiBkYXRlLmdldERhdGUoKSxcbiAgICAgICAgICAgIGlzVG9kYXk6IGlzU2FtZURheShkYXRlLCB0b2RheSksXG4gICAgICAgICAgICBpc1NlbGVjdGVkLFxuICAgICAgICAgICAgaXNEaXNhYmxlZDogdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKSB8fCAoIWlzQ3VycmVudE1vbnRoICYmICF0aGlzLnNlbGVjdE90aGVyTW9udGhzKCkpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGlzQ3VycmVudE1vbnRoLFxuICAgICAgICAgICAgaXNSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgaXNSYW5nZUVuZCxcbiAgICAgICAgICAgIGlzSW5SYW5nZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVWYWxpZGF0aW9uRXJyb3JzKHZhbHVlOiBEYXRlcGlja2VyVmFsdWUsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc0Zvcm1hdEVycm9yKSByZXR1cm4geyBpbnZhbGlkRm9ybWF0OiB0cnVlIH07XG4gICAgICAgIGlmICghdmFsdWUgfHwgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkpIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IoY29udHJvbCk7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4KCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkIG9mIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiAmJiBzdHJpcFRpbWUoZCkgPCBzdHJpcFRpbWUobWluKSkgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiBkIH0gfTtcbiAgICAgICAgICAgICAgICBpZiAobWF4ICYmIHN0cmlwVGltZShkKSA+IHN0cmlwVGltZShtYXgpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RhdGVSYW5nZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydCAmJiBtaW4gJiYgc3RyaXBUaW1lKHZhbHVlLnN0YXJ0KSA8IHN0cmlwVGltZShtaW4pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWluOiB7IG1pbiwgYWN0dWFsOiB2YWx1ZS5zdGFydCB9IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUuZW5kICYmIG1heCAmJiBzdHJpcFRpbWUodmFsdWUuZW5kKSA+IHN0cmlwVGltZShtYXgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF4OiB7IG1heCwgYWN0dWFsOiB2YWx1ZS5lbmQgfSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkID0gdmFsdWUgYXMgRGF0ZTtcbiAgICAgICAgaWYgKHRoaXMubW9kZSgpID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGlmIChtaW4gJiYgZC5nZXRGdWxsWWVhcigpIDwgbWluLmdldEZ1bGxZZWFyKCkpIHJldHVybiB7IG1pbjogeyBtaW4sIGFjdHVhbDogZCB9IH07XG4gICAgICAgICAgICBpZiAobWF4ICYmIGQuZ2V0RnVsbFllYXIoKSA+IG1heC5nZXRGdWxsWWVhcigpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcihjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWluICYmIHN0cmlwVGltZShkKSA8IHN0cmlwVGltZShtaW4pKSByZXR1cm4geyBtaW46IHsgbWluLCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICBpZiAobWF4ICYmIHN0cmlwVGltZShkKSA+IHN0cmlwVGltZShtYXgpKSByZXR1cm4geyBtYXg6IHsgbWF4LCBhY3R1YWw6IGQgfSB9O1xuICAgICAgICByZXR1cm4gVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yKGNvbnRyb2wpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEYXRlUmFuZ2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRlUmFuZ2Uge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAnc3RhcnQnIGluIHZhbHVlICYmICdlbmQnIGluIHZhbHVlO1xuICAgIH1cbn1cblxuIiwiPGRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIGFyaWEtaGFzcG9wdXA9XCJncmlkXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlbigpXCJcbiAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInBvcHVwSWQoKVwiXG4+XG4gICAgPGlucHV0XG4gICAgICAgICN0cmlnZ2VySW5wdXRcbiAgICAgICAgY2xhc3M9XCJoLVszNXB4XSB3LWZ1bGwgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtMyB0ZXh0LXNtIG91dGxpbmUtbm9uZSB0cmFuc2l0aW9uLWNvbG9ycyBmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW9mZnNldC1bLTJweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLVt2YXIoLS1zLWZvY3VzLXJpbmctY29sb3IsIzAwOTBmZildXCJcbiAgICAgICAgW2NsYXNzLnByLTEwXT1cInNob3dJY29uKCkgJiYgIXNob3dDbGVhcigpXCJcbiAgICAgICAgW2NsYXNzLnByLTE2XT1cInNob3dJY29uKCkgJiYgc2hvd0NsZWFyKClcIlxuICAgICAgICBbY2xhc3MucHItNl09XCIhc2hvd0ljb24oKSAmJiBzaG93Q2xlYXIoKVwiXG4gICAgICAgIFtjbGFzcy5iZy1ncmF5c2NhbGUtMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS05MF09XCIhZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgICAgICBbY2xhc3MuYmctZ3JheXNjYWxlLTVdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgIFtjbGFzcy50ZXh0LWdyYXlzY2FsZS0zMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmN1cnNvci1ub3QtYWxsb3dlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2lkXT1cImlucHV0SWQoKVwiXG4gICAgICAgIFtuYW1lXT1cIm5hbWUoKSA/PyBpbnB1dElkKClcIlxuICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlcigpID8/IChwbGFjZWhvbGRlcktleSgpIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIlxuICAgICAgICAgICAgcmVhZG9ubHlJbnB1dCgpIHx8XG4gICAgICAgICAgICBtb2RlKCkgPT09ICdyYW5nZScgfHxcbiAgICAgICAgICAgIG1vZGUoKSA9PT0gJ3llYXInIHx8XG4gICAgICAgICAgICBpc011bHRpcGxlTW9kZSgpIHx8XG4gICAgICAgICAgICAoaXNTZWdtZW50TW9kZUNhbmRpZGF0ZSgpICYmIGlzVG91Y2hEZXZpY2UoKSlcbiAgICAgICAgXCJcbiAgICAgICAgW3RhYkluZGV4XT1cInRhYmluZGV4KCkgPz8gbnVsbFwiXG4gICAgICAgIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzKClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0RGF0ZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImhhbmRsZUlucHV0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAoZm9jdXMpPVwiaGFuZGxlSW5wdXRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKGJsdXIpPVwiaGFuZGxlSW5wdXRCbHVyKCRldmVudClcIlxuICAgICAgICAobW91c2Vkb3duKT1cImhhbmRsZUlucHV0Q2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duKT1cImhhbmRsZVRyaWdnZXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICAoaW5wdXQpPVwiaGFuZGxlTmF0aXZlSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJuZ0NvbnRyb2w/LmNvbnRyb2w/LmludmFsaWQgfHwgbnVsbFwiXG4gICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwibW9kZSgpID09PSAncmFuZ2UnID8gcmFuZ2VTdGF0dXNFbGVtZW50SWQoKSA6IG51bGxcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRpYWxvZ0FyaWFMYWJlbEtleSgpIHwgdHJhbnNsYXRlOiBkaWFsb2dBcmlhTGFiZWxQYXJhbXMoKVwiXG4gICAgLz5cblxuICAgIEBpZiAobW9kZSgpID09PSAncmFuZ2UnKSB7XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInNyLW9ubHlcIlxuICAgICAgICAgICAgW2lkXT1cInJhbmdlU3RhdHVzRWxlbWVudElkKClcIlxuICAgICAgICAgICAgPnt7IHJhbmdlUGVuZGluZ1N0YXR1c1RleHQoKSB9fTwvc3BhblxuICAgICAgICA+XG4gICAgfVxuXG4gICAgQGlmIChzaG93Q2xlYXIoKSAmJiBpbnB1dERhdGUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGZsZXggaC1bMzVweF0gdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LWdyYXlzY2FsZS02MCB0cmFuc2l0aW9uLWNvbG9ycyBob3Zlcjp0ZXh0LWdyYXlzY2FsZS05MFwiXG4gICAgICAgICAgICBbY2xhc3MucmlnaHQtOV09XCJzaG93SWNvbigpXCJcbiAgICAgICAgICAgIFtjbGFzcy5yaWdodC0wXT1cIiFzaG93SWNvbigpXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NsZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10aW1lcyB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuXG4gICAgQGlmIChzaG93SWNvbigpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICNpY29uQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgcmlnaHQtMCBmbGV4IGgtWzM1cHhdIHctOSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWwgYm9yZGVyLXNvbGlkIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTIwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmN1cnNvci1ub3QtYWxsb3dlZF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItZ3JheXNjYWxlLTMwXT1cIiFkaXNhYmxlZCgpICYmICFpc0ZvY3VzZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MuYm9yZGVyLXByaW1hcnldPVwiaXNGb2N1c2VkKCkgJiYgIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5ob3ZlcjpiZy1ncmF5c2NhbGUtMTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfb3BlbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZSgpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZVRyaWdnZXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJyZXNvbHZlZEljb24oKVwiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cbjwvZGl2PlxuXG48bmctdGVtcGxhdGVcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cImlzT3BlbigpXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zXT1cInBvc2l0aW9uc1wiXG4gICAgKGJhY2tkcm9wQ2xpY2spPVwiaGFuZGxlQmFja2Ryb3BDbGljaygkZXZlbnQpXCJcbiAgICAob3ZlcmxheUtleWRvd24pPVwiaGFuZGxlT3ZlcmxheUtleWRvd24oJGV2ZW50KVwiXG4gICAgKGRldGFjaCk9XCJpc09wZW4uc2V0KGZhbHNlKVwiXG4+XG4gICAgPGRpdlxuICAgICAgICAjcG9wdXBQYW5lbFxuICAgICAgICBjbGFzcz1cInotNTAgdy03MiByb3VuZGVkLW1lZGl1bSBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTAgc2hhZG93LW1kXCJcbiAgICAgICAgcm9sZT1cImRpYWxvZ1wiXG4gICAgICAgIGNka1RyYXBGb2N1c1xuICAgICAgICBbaWRdPVwicG9wdXBJZCgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkaWFsb2dBcmlhTGFiZWxLZXkoKSB8IHRyYW5zbGF0ZTogZGlhbG9nQXJpYUxhYmVsUGFyYW1zKClcIlxuICAgID5cbiAgICAgICAgQGlmIChzaG93Q2FsZW5kYXIoKSkge1xuICAgICAgICAgICAgQGlmIChwaWNrZXJWaWV3KCkgPT09ICdjYWxlbmRhcicpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG8gZGUgbmF2ZWdhw6fDo28gbWVuc2FsIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcHJldl9tb250aCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgbW9udGg6IHByZXZNb250aFRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVQcmV2KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tbGVmdCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF9tb250aF95ZWFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3dpdGNoVG9Nb250aHMoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGN1cnJlbnRNb250aEtleSgpIHwgdHJhbnNsYXRlIH19Jm5ic3A7e3sgY3VycmVudFllYXIoKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd24gdGV4dC1bMTBweF1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25leHRfbW9udGgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IG1vbnRoOiBuZXh0TW9udGhUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxob3MgZG9zIGRpYXMgZGEgc2VtYW5hIC0tPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IHB4LTMgcHQtMlwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZGF5S2V5IG9mIG9yZGVyZWRXZWVrRGF5S2V5cygpOyB0cmFjayBkYXlLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImRheUtleSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5S2V5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBHcmFkZSBkbyBjYWxlbmTDoXJpbyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBweC0zIHBiLTJcIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckdyaWRBcmlhTGFiZWxLZXkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IG1vbnRoOiAoY3VycmVudE1vbnRoS2V5KCkgfCB0cmFuc2xhdGUpLCB5ZWFyOiBjdXJyZW50WWVhcigpIH1cbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdPVwibW9kZSgpID09PSAncmFuZ2UnID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVDYWxlbmRhckdyaWRLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAod2VlayBvZiBjYWxlbmRhcldlZWtzKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udGVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKGRheSBvZiB3ZWVrOyB0cmFjayBkYXkuZGF0ZS50b0lTT1N0cmluZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTggdy04IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLVs1MCVdIHRleHQtc20gZm9udC1ub3JtYWwgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmludmlzaWJsZV09XCIhc2hvd090aGVyTW9udGhzKCkgJiYgIWRheS5pc0N1cnJlbnRNb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZvcm1hdERheUFyaWFMYWJlbChkYXkuZGF0ZSwgZGF5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc1NlbGVjdGVkIHx8IGRheS5pc1JhbmdlU3RhcnQgfHwgZGF5LmlzUmFuZ2VFbmQgfHwgZGF5LmlzSW5SYW5nZSB8fCBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jdXJyZW50XT1cImRheS5pc1RvZGF5ID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRheS5pc0Rpc2FibGVkID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCIhc2hvd090aGVyTW9udGhzKCkgJiYgIWRheS5pc0N1cnJlbnRNb250aCA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNTZWxlY3RlZCB8fCBkYXkuaXNSYW5nZVN0YXJ0IHx8IGRheS5pc1JhbmdlRW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3NlbGVjdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRheS5pc1RvZGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAndG9kYXknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRheS5pc0Rpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmctcHJpbWFyeSBmb250LXNlbWlib2xkIHRleHQtZ3JheXNjYWxlLTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaXNTZWxlY3RlZCB8fCBkYXkuaXNSYW5nZVN0YXJ0IHx8IGRheS5pc1JhbmdlRW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1ncmF5c2NhbGUtMTAgaG92ZXI6YmctZ3JheXNjYWxlLTIwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzSW5SYW5nZSAmJiAhZGF5LmlzUmFuZ2VTdGFydCAmJiAhZGF5LmlzUmFuZ2VFbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNTZWxlY3RlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzUmFuZ2VTdGFydCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzUmFuZ2VFbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc0Rpc2FibGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pc0N1cnJlbnRNb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtNjAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc1NlbGVjdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZVN0YXJ0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkYXkuaXNSYW5nZUVuZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZGF5LmlzRGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRheS5pc0N1cnJlbnRNb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmluZy0yIHJpbmctaW5zZXQgcmluZy1wcmltYXJ5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmlzVG9kYXkgJiYgIWRheS5pc1NlbGVjdGVkICYmICFkYXkuaXNSYW5nZVN0YXJ0ICYmICFkYXkuaXNSYW5nZUVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogZGF5LmlzRGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uRGF5SG92ZXIoZGF5LmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uRGF5SG92ZXIobnVsbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRGF5SG92ZXIoZGF5LmRhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRheSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXkuZGF5T2ZNb250aCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHBpY2tlclZpZXcoKSA9PT0gJ3llYXJzJykge1xuICAgICAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxobyBkZSBuYXZlZ2HDp8OjbyBwb3IgZMOpY2FkYSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGRhdGEtbmF2LWhlYWRlclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBweC0zIHB5LTJcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC03IHctNyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOnRleHQtZ3JheXNjYWxlLTMwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInByZXZEaXNhYmxlZCgpID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9wcmV2X2RlY2FkZScgfCB0cmFuc2xhdGU6IHByZXZEZWNhZGVSYW5nZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlUHJldigpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+e3sgY3VycmVudERlY2FkZVN0YXJ0KCkgfX0g4oCTIHt7IGN1cnJlbnREZWNhZGVTdGFydCgpICsgMTEgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJuZXh0RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfbmV4dF9kZWNhZGUnIHwgdHJhbnNsYXRlOiBuZXh0RGVjYWRlUmFuZ2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuYXZpZ2F0ZU5leHQoKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIEdyYWRlIGRlIGFub3MgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTIgcHgtMyBweS0zXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfeWVhcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAocm93IG9mIHllYXJzR3JpZCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRlbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yICh5ZWFyIG9mIHJvdzsgdHJhY2sgeWVhcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC05IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtc20gZm9udC1ub3JtYWwgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc1llYXJTZWxlY3RlZCh5ZWFyKSB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNZZWFyRGlzYWJsZWQoeWVhcikgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJpc0N1cnJlbnRZZWFyKHllYXIpID8gJ2RhdGUnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWZvY3VzXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzWWVhclNlbGVjdGVkKHllYXIpID8gJ3NlbGVjdGVkJyA6IGlzQ3VycmVudFllYXIoeWVhcikgPyAndG9kYXknIDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1llYXJEaXNhYmxlZCh5ZWFyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnLXByaW1hcnkgZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXlzY2FsZS0wJzogaXNZZWFyU2VsZWN0ZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpbmctMiByaW5nLWluc2V0IHJpbmctcHJpbWFyeSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ3VycmVudFllYXIoeWVhcikgJiYgIWlzWWVhclNlbGVjdGVkKHllYXIpICYmICFpc1llYXJEaXNhYmxlZCh5ZWFyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtOTAgaG92ZXI6YmctZ3JheXNjYWxlLTEwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzWWVhclNlbGVjdGVkKHllYXIpICYmICFpc1llYXJEaXNhYmxlZCh5ZWFyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3Vyc29yLW5vdC1hbGxvd2VkIHRleHQtZ3JheXNjYWxlLTMwJzogaXNZZWFyRGlzYWJsZWQoeWVhciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RZZWFyKHllYXIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgeWVhciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKHBpY2tlclZpZXcoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENhYmXDp2FsaG8gZGUgbmF2ZWdhw6fDo28gYW51YWwgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBkYXRhLW5hdi1oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNyB3LTcgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDp0ZXh0LWdyYXlzY2FsZS0zMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicHJldkRpc2FibGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJwcmV2RGlzYWJsZWQoKSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfcHJldl95ZWFyJyB8IHRyYW5zbGF0ZTogeyB5ZWFyOiBwcmV2WWVhclRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVQcmV2KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tbGVmdCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwXCI+e3sgY3VycmVudFllYXIoKSB9fTwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTcgdy03IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6dGV4dC1ncmF5c2NhbGUtMzBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm5leHREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwibmV4dERpc2FibGVkKCkgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX25leHRfeWVhcicgfCB0cmFuc2xhdGU6IHsgeWVhcjogbmV4dFllYXJUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlTmV4dCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gR3JhZGUgZGUgbWVzZXMgLS0+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTMgZ2FwLTIgcHgtMyBweS0zXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9zZWxlY3RfbW9udGgnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKHJvdyBvZiBtb250aHNHcmlkKCk7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29udGVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKG1vbnRoIG9mIHJvdzsgdHJhY2sgbW9udGguaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtOSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LXNtIGZvbnQtbm9ybWFsIHRyYW5zaXRpb24tY29sb3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNNb250aFNlbGVjdGVkKG1vbnRoLmluZGV4KSB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNNb250aERpc2FibGVkKG1vbnRoLmluZGV4KSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mb2N1c109XCJpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpID8gJ3NlbGVjdGVkJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9udGhEaXNhYmxlZChtb250aC5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5c2NhbGUtMCc6IGlzTW9udGhTZWxlY3RlZChtb250aC5pbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwIGhvdmVyOmJnLWdyYXlzY2FsZS0xMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc01vbnRoU2VsZWN0ZWQobW9udGguaW5kZXgpICYmICFpc01vbnRoRGlzYWJsZWQobW9udGguaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJzb3Itbm90LWFsbG93ZWQgdGV4dC1ncmF5c2NhbGUtMzAnOiBpc01vbnRoRGlzYWJsZWQobW9udGguaW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0TW9udGgobW9udGguaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbW9udGgua2V5IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSAhPT0gJ21vbnRoJykge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgcHgtMyBweS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLXNtYWxsIHB4LTIgcHktMSB0ZXh0LXNtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImJhY2tUb0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWFycm93LWxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2JhY2tfdG9fY2FsZW5kYXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBUaW1lIHBpY2tlciAtLT5cbiAgICAgICAgQGlmIChzaG93VGltZVBpY2tlcigpKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMyBweC00IHB5LTNcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5ib3JkZXItdF09XCJzaG93Q2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1zb2xpZF09XCJzaG93Q2FsZW5kYXIoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwic2hvd0NhbGVuZGFyKClcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3NlbGVjdF90aW1lJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPCEtLSBIb3JhcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgI2luY3JlYXNlSG91ckJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaW5jcmVtZW50X2hvdXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHRpbWU6IG5leHRIb3VyVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRIb3VycygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJ0aW1lSW5wdXRNYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoLTkgdy0xMiByb3VuZGVkLXNtYWxsIGJvcmRlciBib3JkZXItc29saWQgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1ncmF5c2NhbGUtNSB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1tZWRpdW0gdGV4dC1ncmF5c2NhbGUtOTAgb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6b3V0bGluZSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMiBmb2N1cy12aXNpYmxlOm91dGxpbmUtb2Zmc2V0LVstMnB4XSBmb2N1cy12aXNpYmxlOm91dGxpbmUtW3ZhcigtLXMtZm9jdXMtcmluZy1jb2xvciwjMDA5MGZmKV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBhZFRpbWUoZGlzcGxheUhvdXJzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2hvdXInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV0rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZUhvdXJzS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiaGFuZGxlSG91cnNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X2hvdXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHRpbWU6IHByZXZIb3VyVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWNyZW1lbnRIb3VycygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd24gdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LXhsIGZvbnQtYm9sZCB0ZXh0LWdyYXlzY2FsZS02MFwiXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgID46PC9zcGFuXG4gICAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBNaW51dG9zIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTYgdy02IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLXNtYWxsIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9pbmNyZW1lbnRfbWludXRlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyB0aW1lOiBuZXh0TWludXRlVGFyZ2V0KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpbmNyZW1lbnRNaW51dGVzKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZXZyb24tdXAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0bW9kZT1cIm51bWVyaWNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cInRpbWVJbnB1dE1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1vZmZzZXQtWy0ycHhdIGZvY3VzLXZpc2libGU6b3V0bGluZS1bdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCMwMDkwZmYpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwicGFkVGltZShtaW51dGVzKCkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX21pbnV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49XCJbMC05XStcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlTWludXRlc0tleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZU1pbnV0ZXNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X21pbnV0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgdGltZTogcHJldk1pbnV0ZVRhcmdldCgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50TWludXRlcygpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd24gdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgQGlmIChzaG93U2Vjb25kcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQteGwgZm9udC1ib2xkIHRleHQtZ3JheXNjYWxlLTYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+Ojwvc3BhblxuICAgICAgICAgICAgICAgICAgICA+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWd1bmRvcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfaW5jcmVtZW50X3NlY29uZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHRpbWU6IG5leHRTZWNvbmRUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW5jcmVtZW50U2Vjb25kcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXVwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5tYXhsZW5ndGhdPVwidGltZUlucHV0TWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtOSB3LTEyIHJvdW5kZWQtc21hbGwgYm9yZGVyIGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS01IHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS05MCBvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lIGZvY3VzLXZpc2libGU6b3V0bGluZS0yIGZvY3VzLXZpc2libGU6b3V0bGluZS1vZmZzZXQtWy0ycHhdIGZvY3VzLXZpc2libGU6b3V0bGluZS1bdmFyKC0tcy1mb2N1cy1yaW5nLWNvbG9yLCMwMDkwZmYpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInBhZFRpbWUoc2Vjb25kcygpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfc2Vjb25kJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuPVwiWzAtOV0rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJoYW5kbGVTZWNvbmRzS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhhbmRsZVNlY29uZHNJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGgtNiB3LTYgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtc21hbGwgdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmRhdGVwaWNrZXJfZGVjcmVtZW50X3NlY29uZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IHRpbWU6IHByZXZTZWNvbmRUYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVjcmVtZW50U2Vjb25kcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd24gdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBAaWYgKGlzMTJIb3VyRm9ybWF0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTZWxldG9yIEFNL1BNIC0tPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBoLTkgdy0xMiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1zbWFsbCBib3JkZXIgYm9yZGVyLXNvbGlkIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTUgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTkwIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOmJnLWdyYXlzY2FsZS0xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl90b2dnbGVfbWVyaWRpZW0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IG1lcmlkaWVtOiBuZXh0TWVyaWRpZW1UYXJnZXQoKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBbVBtKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBhbVBtKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFJvZGFww6kgZGUgYcOnw7VlcyAtLT5cbiAgICAgICAgQGlmIChzaG93QnV0dG9uQmFyKCkgfHwgbW9kZSgpID09PSAnZGF0ZXRpbWUnIHx8IG1vZGUoKSA9PT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGJvcmRlci10IGJvcmRlci1zb2xpZCBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTMgcHktMlwiPlxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd0J1dHRvbkJhcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSA9PT0gJ2RhdGUnIHx8IG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgcHgtMiBweS0xIHRleHQtc20gdGV4dC1ncmF5c2NhbGUtOTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6YmctZ3JheXNjYWxlLTEwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFRvZGF5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX3RvZGF5JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1zbWFsbCBweC0yIHB5LTEgdGV4dC1zbSB0ZXh0LWdyYXlzY2FsZS05MCB0cmFuc2l0aW9uLWNvbG9ycyBob3ZlcjpiZy1ncmF5c2NhbGUtMTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jbGVhcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG1vZGUoKSA9PT0gJ2RhdGV0aW1lJyB8fCBtb2RlKCkgPT09ICd0aW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1zbWFsbCBiZy1wcmltYXJ5IHB4LTMgcHktMSB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheXNjYWxlLTAgdHJhbnNpdGlvbi1jb2xvcnMgaG92ZXI6b3BhY2l0eS05MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb25maXJtKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5kYXRlcGlja2VyX2NvbmZpcm0nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2PjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtb2RlKCkgPT09ICdkYXRldGltZScgfHwgbW9kZSgpID09PSAndGltZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtc21hbGwgYmctcHJpbWFyeSBweC0zIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXlzY2FsZS0wIHRyYW5zaXRpb24tY29sb3JzIGhvdmVyOm9wYWNpdHktOTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29uZmlybSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZGF0ZXBpY2tlcl9jb25maXJtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuIl19
|