ctt-babylon 0.24.61 → 0.24.63

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.
@@ -1,11 +1,12 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, Input, ViewEncapsulation, inject } from '@angular/core';
1
+ import { CommonModule, isPlatformBrowser } from '@angular/common';
2
+ import { Component, Input, PLATFORM_ID, ViewEncapsulation, inject, } from '@angular/core';
3
3
  import { FormsModule } from '@angular/forms';
4
4
  import { BabylonLinkTypeDirective } from '../../../../directives/link-type/link-type.directive';
5
5
  import { BabylonCurrencyPipe } from '../../../../pipes/babylon-currency.pipe';
6
6
  import { buildFilterOptions, filteredItems, getItemBrand, } from '../../../../utils/filter.utils';
7
7
  import { ChangeDetectorRef, } from '@angular/core';
8
- import { ActivatedRoute } from '@angular/router';
8
+ import { NavigationEnd, Router } from '@angular/router';
9
+ import { filter } from 'rxjs';
9
10
  import { Utils } from '../../../../utils';
10
11
  import { getFirstImageByTagFromImages } from '../../../../utils/mutimedia.utils';
11
12
  import { normalizeGlobalItems } from '../../../../utils/normalize-items.utils';
@@ -27,10 +28,27 @@ export class LisC2ImgTxtCtaComponent {
27
28
  this.filterLabelToSlug = new Map();
28
29
  this.destinationLabelToSlug = new Map();
29
30
  this.brandLabelToSlug = new Map();
30
- this.route = inject(ActivatedRoute);
31
+ this.router = inject(Router);
31
32
  this.cdr = inject(ChangeDetectorRef);
33
+ this.platformId = inject(PLATFORM_ID);
34
+ this.historyPatched = false;
32
35
  // Items filtrados sin normalizar (usados para lógica)
33
36
  this._filteredItemsRaw = [];
37
+ this.handleExternalUrlChange = () => {
38
+ if (!isPlatformBrowser(this.platformId))
39
+ return;
40
+ const url = window.location.pathname + window.location.search;
41
+ const param = this.router
42
+ .parseUrl(url)
43
+ .queryParamMap.get('destinations');
44
+ const currentDestination = param
45
+ ? decodeURIComponent(param)
46
+ : undefined;
47
+ // Evitar procesar cambios de URL ajenos al filtro (modales, analytics, etc.)
48
+ if (currentDestination === this.lastDestinationFromUrl)
49
+ return;
50
+ this.applyDestinationsFromUrl(url);
51
+ };
34
52
  }
35
53
  findAndSelectDestination(destinationName) {
36
54
  const normalizedName = destinationName.toLowerCase()?.trim();
@@ -107,40 +125,102 @@ export class LisC2ImgTxtCtaComponent {
107
125
  this.filterLabelToSlug = opts.filterLabelToSlug;
108
126
  this.destinationLabelToSlug = opts.destinationLabelToSlug;
109
127
  this.brandLabelToSlug = opts.brandLabelToSlug;
110
- // Solo resetear si no hay un destino pendiente de la URL
111
- if (!this.pendingDestination) {
128
+ // Sincronizar con el filtro de destino de la URL actual
129
+ const destinationsParam = this.router
130
+ .parseUrl(this.router.url)
131
+ .queryParamMap.get('destinations');
132
+ if (destinationsParam) {
133
+ this.pendingDestination = decodeURIComponent(destinationsParam);
134
+ this.findAndSelectDestination(this.pendingDestination);
135
+ }
136
+ else {
137
+ // No hay filtro en la URL → resetear los filtros
138
+ this.pendingDestination = undefined;
112
139
  this.selectedHotelType = '';
113
140
  this.selectedDestination = '';
114
141
  this.selectedBrand = '';
115
142
  }
116
- else {
117
- // Si hay un destino pendiente de la URL, intenta seleccionarlo ahora
118
- this.findAndSelectDestination(this.pendingDestination);
119
- }
120
143
  // Actualizar items filtrados
121
144
  this.updateFilteredItems();
122
145
  }
123
146
  }
124
147
  ngOnInit() {
125
- // Suscribirse a los cambios de query params
126
- this.qpSub = this.route.queryParamMap.subscribe((params) => {
127
- const destinationsParam = params.get('destinations');
128
- if (destinationsParam) {
129
- const decodedDestination = decodeURIComponent(destinationsParam);
130
- this.pendingDestination = decodedDestination;
131
- // Si ya tenemos destinationOptions, buscar y seleccionar
132
- if (this.destinationOptions &&
133
- this.destinationOptions.length > 0) {
134
- this.findAndSelectDestination(decodedDestination);
135
- }
136
- else {
137
- }
138
- this.cdr.markForCheck();
139
- }
148
+ // Aplicar el destino de la URL actual (también cubre el primer renderizado)
149
+ this.applyDestinationsFromUrl(this.router.url);
150
+ // Reaccionar a cualquier navegación (incluida la misma ruta cambiando solo la query)
151
+ this.routerSub = this.router.events
152
+ .pipe(filter((event) => event instanceof NavigationEnd))
153
+ .subscribe(() => {
154
+ this.applyDestinationsFromUrl(this.router.url);
140
155
  });
156
+ // Detectar cambios de URL hechos fuera del Router de Angular (SSR-safe)
157
+ if (isPlatformBrowser(this.platformId)) {
158
+ window.addEventListener('popstate', this.handleExternalUrlChange);
159
+ this.patchHistory();
160
+ }
161
+ }
162
+ patchHistory() {
163
+ if (this.historyPatched)
164
+ return;
165
+ this.originalPushState = window.history.pushState;
166
+ this.originalReplaceState = window.history.replaceState;
167
+ this.patchedPushState = (data, unused, url) => {
168
+ this.originalPushState?.call(window.history, data, unused, url);
169
+ this.handleExternalUrlChange();
170
+ };
171
+ this.patchedReplaceState = (data, unused, url) => {
172
+ this.originalReplaceState?.call(window.history, data, unused, url);
173
+ this.handleExternalUrlChange();
174
+ };
175
+ window.history.pushState = this.patchedPushState;
176
+ window.history.replaceState = this.patchedReplaceState;
177
+ this.historyPatched = true;
178
+ }
179
+ restoreHistory() {
180
+ if (!this.historyPatched)
181
+ return;
182
+ // Solo restaurar si la función actual sigue siendo la que instalamos
183
+ if (this.patchedPushState &&
184
+ window.history.pushState === this.patchedPushState) {
185
+ window.history.pushState = this.originalPushState;
186
+ }
187
+ if (this.patchedReplaceState &&
188
+ window.history.replaceState === this.patchedReplaceState) {
189
+ window.history.replaceState = this.originalReplaceState;
190
+ }
191
+ this.historyPatched = false;
192
+ }
193
+ applyDestinationsFromUrl(url) {
194
+ const destinationsParam = this.router
195
+ .parseUrl(url)
196
+ .queryParamMap.get('destinations');
197
+ this.lastDestinationFromUrl = destinationsParam
198
+ ? decodeURIComponent(destinationsParam)
199
+ : undefined;
200
+ if (destinationsParam) {
201
+ const decodedDestination = decodeURIComponent(destinationsParam);
202
+ this.pendingDestination = decodedDestination;
203
+ // Si ya tenemos destinationOptions, buscar y seleccionar
204
+ if (this.destinationOptions?.length) {
205
+ this.findAndSelectDestination(decodedDestination);
206
+ }
207
+ }
208
+ else {
209
+ // El filtro ya no está en la URL → limpiar el destino seleccionado
210
+ this.pendingDestination = undefined;
211
+ if (this.selectedDestination) {
212
+ this.selectedDestination = '';
213
+ this.updateFilteredItems();
214
+ }
215
+ }
216
+ this.cdr.markForCheck();
141
217
  }
142
218
  ngOnDestroy() {
143
- this.qpSub?.unsubscribe();
219
+ this.routerSub?.unsubscribe();
220
+ if (isPlatformBrowser(this.platformId)) {
221
+ window.removeEventListener('popstate', this.handleExternalUrlChange);
222
+ this.restoreHistory();
223
+ }
144
224
  }
145
225
  /**
146
226
  * Devuelve un array normalizado de BabylonGlobalItem
@@ -237,4 +317,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
237
317
  }], showFilters: [{
238
318
  type: Input
239
319
  }] } });
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzLWMyLWltZy10eHQtY3RhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhYnlsb24vc3JjL2xpYi9jb21wb25lbnRzL2V4dGVybmFsL2NvcmUvbGlzLWMyLWltZy10eHQtY3RhL2xpcy1jMi1pbWctdHh0LWN0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYWJ5bG9uL3NyYy9saWIvY29tcG9uZW50cy9leHRlcm5hbC9jb3JlL2xpcy1jMi1pbWctdHh0LWN0YS9saXMtYzItaW1nLXR4dC1jdGEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFNaEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDOUUsT0FBTyxFQUNILGtCQUFrQixFQUNsQixhQUFhLEVBQ2IsWUFBWSxHQUNmLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsT0FBTyxFQUNILGlCQUFpQixHQUtwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7O0FB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dCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVmlld0VuY2Fwc3VsYXRpb24sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCYWJ5bG9uTGlua1R5cGVEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi8uLi9kaXJlY3RpdmVzL2xpbmstdHlwZS9saW5rLXR5cGUuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gICAgQmFieWxvbkJ1dHRvbkksXG4gICAgQmFieWxvbkltYWdlSSxcbiAgICBCYWJ5bG9uVGV4dEluZm9JLFxufSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEJhYnlsb25DdXJyZW5jeVBpcGUgfSBmcm9tICcuLi8uLi8uLi8uLi9waXBlcy9iYWJ5bG9uLWN1cnJlbmN5LnBpcGUnO1xuaW1wb3J0IHtcbiAgICBidWlsZEZpbHRlck9wdGlvbnMsXG4gICAgZmlsdGVyZWRJdGVtcyxcbiAgICBnZXRJdGVtQnJhbmQsXG59IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzL2ZpbHRlci51dGlscyc7XG5cbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJhYnlsb25HbG9iYWxJdGVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcy9iYWJ5bG9uLWdsb2JhbC1pdGVtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IGdldEZpcnN0SW1hZ2VCeVRhZ0Zyb21JbWFnZXMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9tdXRpbWVkaWEudXRpbHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplR2xvYmFsSXRlbXMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9ub3JtYWxpemUtaXRlbXMudXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpcy1jMi1pbWctdHh0LWN0YScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgQmFieWxvbkxpbmtUeXBlRGlyZWN0aXZlLFxuICAgICAgICBCYWJ5bG9uQ3VycmVuY3lQaXBlLFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9saXMtYzItaW1nLXR4dC1jdGEuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9saXMtYzItaW1nLXR4dC1jdGEuY29tcG9uZW50LnNjc3MnLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkLFxufSlcbmV4cG9ydCBjbGFzcyBMaXNDMkltZ1R4dEN0YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIEBJbnB1dCgpIHRleHRzPzogQmFieWxvblRleHRJbmZvSTtcbiAgICBASW5wdXQoKSBpdGVtcz86IEJhYnlsb25HbG9iYWxJdGVtW107XG4gICAgQElucHV0KCkgbGlua3M/OiBCYWJ5bG9uQnV0dG9uSVtdO1xuICAgIEBJbnB1dCgpIGFkZGl0aW9uYWwxTGlrZU1hcmNhPzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHNob3dDbGVhbkZpbHRlcnM6IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIHNob3dGaWx0ZXJzOiBib29sZWFuID0gdHJ1ZTsgLy8gdG8gc2hvdyBvciBoaWRlIGZpbHRlcnMgc2VjdGlvblxuXG4gICAgdGFnTmFtZTogc3RyaW5nID0gJ0xpc0MySW1nVHh0Q3RhJztcblxuICAgIHNlbGVjdGVkSG90ZWxUeXBlOiBzdHJpbmcgPSAnJztcbiAgICBzZWxlY3RlZERlc3RpbmF0aW9uOiBzdHJpbmcgPSAnJztcbiAgICBzZWxlY3RlZEJyYW5kOiBzdHJpbmcgPSAnJztcblxuICAgIGhvdGVsVHlwZU9wdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgZGVzdGluYXRpb25PcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGJyYW5kT3B0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZpbHRlckxhYmVsVG9TbHVnID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBkZXN0aW5hdGlvbkxhYmVsVG9TbHVnID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBicmFuZExhYmVsVG9TbHVnID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAgIHByaXZhdGUgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICAgIHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBwcml2YXRlIHFwU3ViPzogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgcGVuZGluZ0Rlc3RpbmF0aW9uPzogc3RyaW5nO1xuXG4gICAgLy8gSXRlbXMgZmlsdHJhZG9zIHNpbiBub3JtYWxpemFyICh1c2Fkb3MgcGFyYSBsw7NnaWNhKVxuICAgIHByaXZhdGUgX2ZpbHRlcmVkSXRlbXNSYXc6IEJhYnlsb25HbG9iYWxJdGVtW10gPSBbXTtcblxuICAgIHByaXZhdGUgZmluZEFuZFNlbGVjdERlc3RpbmF0aW9uKGRlc3RpbmF0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gZGVzdGluYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk/LnRyaW0oKTtcblxuICAgICAgICAvLyBQcmltZXJvIGJ1c2NhciBlbiBlbCBhcnJheSBkZSBzdHJpbmdzIGRlIGRlc3Rpbm9zXG4gICAgICAgIGxldCBmb3VuZCA9IHRoaXMuZGVzdGluYXRpb25PcHRpb25zPy5maW5kKFxuICAgICAgICAgICAgKGRlc3RpbmF0aW9uKSA9PlxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLnRvTG93ZXJDYXNlKCk/LnRyaW0oKSA9PT0gbm9ybWFsaXplZE5hbWVcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREZXN0aW5hdGlvbiA9IGZvdW5kO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaSBubyBlbmN1ZW50cmEgZW4gZGVzdGluYXRpb25PcHRpb25zLCBidXNjYXIgZW4gbG9zIGl0ZW1zIHBvciBjb3VudHJ5XG4gICAgICAgIGNvbnN0IGl0ZW1XaXRoQ291bnRyeSA9IHRoaXMuaXRlbXM/LmZpbmQoXG4gICAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5jb3VudHJ5Py50b0xvd2VyQ2FzZSgpPy50cmltKCkgPT09IG5vcm1hbGl6ZWROYW1lXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGl0ZW1XaXRoQ291bnRyeSAmJiBpdGVtV2l0aENvdW50cnkuY291bnRyeSkge1xuICAgICAgICAgICAgLy8gRmlsdHJhciBkaXJlY3RhbWVudGUgcG9yIGNvdW50cnkgYXVucXVlIG5vIGV4aXN0YSBlbiBkZXN0aW5hdGlvbk9wdGlvbnNcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREZXN0aW5hdGlvbiA9IGl0ZW1XaXRoQ291bnRyeS5jb3VudHJ5O1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXZ1ZWx2ZSBlbCBsYWJlbCBkZWwgYm90w7NuIGVuIGxhIHBvc2ljacOzbiBpbmRleCwgYnVzY2FuZG8gZW4gaXRlbS5idXR0b25zW2luZGV4XS5sYWJlbFxuICAgICAqIHkgc2kgbm8gZXhpc3RlLCBlbiBpdGVtLm11bHRpbWVkaWEuaW1hZ2VuZXNbMF0uYnV0dG9uc1tpbmRleF0ubGFiZWxcbiAgICAgKi9cbiAgICBnZXRCdXR0b25MYWJlbChpdGVtOiBCYWJ5bG9uR2xvYmFsSXRlbSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmIChpdGVtPy5idXR0b25zPy5baW5kZXhdPy5sYWJlbCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0uYnV0dG9uc1tpbmRleF0ubGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW0/Lm11bHRpbWVkaWE/LmltYWdlbmVzPy5bMF0/LmJ1dHRvbnM/LltpbmRleF0/LmxhYmVsO1xuICAgIH1cblxuICAgIGdldEJ1dHRvblVybChpdGVtOiBCYWJ5bG9uR2xvYmFsSXRlbSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmJ1aWxkTWVudVVybChcbiAgICAgICAgICAgICAgICBpdGVtPy5tdWx0aW1lZGlhPy5pbWFnZW5lcz8uWzBdPy5idXR0b25zPy5baW5kZXhdXG4gICAgICAgICAgICApIHx8IHRoaXMuYnVpbGRNZW51VXJsKGl0ZW0/LmJ1dHRvbnM/LltpbmRleF0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0QnV0dG9uTGlua1R5cGUoaXRlbTogQmFieWxvbkdsb2JhbEl0ZW0sIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXRlbT8ubXVsdGltZWRpYT8uaW1hZ2VuZXM/LlswXT8uYnV0dG9ucz8uW2luZGV4XT8ubGlua1R5cGUgfHxcbiAgICAgICAgICAgIGl0ZW0/LmJ1dHRvbnM/LltpbmRleF0/LmxpbmtUeXBlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0TGlua0xhYmVsKGl0ZW06IEJhYnlsb25HbG9iYWxJdGVtLCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKGl0ZW0/LmxpbmtzPy5baW5kZXhdPy5sYWJlbCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubGlua3NbaW5kZXhdLmxhYmVsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtPy5tdWx0aW1lZGlhPy5pbWFnZW5lcz8uWzBdPy5saW5rcz8uW2luZGV4XT8ubGFiZWw7XG4gICAgfVxuXG4gICAgZ2V0TGlua1VybChpdGVtOiBCYWJ5bG9uR2xvYmFsSXRlbSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmJ1aWxkTWVudVVybChcbiAgICAgICAgICAgICAgICBpdGVtPy5tdWx0aW1lZGlhPy5pbWFnZW5lcz8uWzBdPy5saW5rcz8uW2luZGV4XVxuICAgICAgICAgICAgKSB8fCB0aGlzLmJ1aWxkTWVudVVybChpdGVtPy5saW5rcz8uW2luZGV4XSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRMaW5rTGlua1R5cGUoaXRlbTogQmFieWxvbkdsb2JhbEl0ZW0sIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaXRlbT8ubXVsdGltZWRpYT8uaW1hZ2VuZXM/LlswXT8ubGlua3M/LltpbmRleF0/LmxpbmtUeXBlIHx8XG4gICAgICAgICAgICBpdGVtPy5saW5rcz8uW2luZGV4XT8ubGlua1R5cGVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBidWlsZE1lbnVVcmwoaXRlbTogQmFieWxvbkJ1dHRvbkkgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIWl0ZW0/LnVybCkgcmV0dXJuICcnO1xuXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSBpdGVtLnVybC5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSAoaXRlbS52YXJzID8/ICcnKS50b1N0cmluZygpPy50cmltKCk7XG5cbiAgICAgICAgaWYgKCFkZXN0aW5hdGlvbikgcmV0dXJuIGJhc2VVcmw7XG5cbiAgICAgICAgY29uc3Qgc2x1ZyA9IFV0aWxzLnRvU2x1ZyhkZXN0aW5hdGlvbik7XG4gICAgICAgIGlmICghc2x1ZykgcmV0dXJuIGJhc2VVcmw7XG5cbiAgICAgICAgcmV0dXJuIGAke2Jhc2VVcmx9P2Rlc3RpbmF0aW9ucz0ke2Rlc3RpbmF0aW9ufWA7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1snaXRlbXMnXSkge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IGJ1aWxkRmlsdGVyT3B0aW9ucyhcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zID8/IFtdLFxuICAgICAgICAgICAgICAgIHRoaXMuYWRkaXRpb25hbDFMaWtlTWFyY2EgPz8gZmFsc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmhvdGVsVHlwZU9wdGlvbnMgPSBvcHRzLmhvdGVsVHlwZU9wdGlvbnM7XG4gICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uT3B0aW9ucyA9IG9wdHMuZGVzdGluYXRpb25PcHRpb25zO1xuXG4gICAgICAgICAgICAvLyBSZWxsZW5hciBicmFuZE9wdGlvbnMgdXNhbmRvIGdldEl0ZW1CcmFuZCBwYXJhIGNvaGVyZW5jaWFcbiAgICAgICAgICAgIGNvbnN0IGJyYW5kcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgKHRoaXMuaXRlbXMgPz8gW10pLmZvckVhY2goKGl0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnJhbmQgPSBnZXRJdGVtQnJhbmQoXG4gICAgICAgICAgICAgICAgICAgIGl0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZGl0aW9uYWwxTGlrZU1hcmNhID8/IGZhbHNlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJhbmQpIGJyYW5kcy5hZGQoYnJhbmQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmJyYW5kT3B0aW9ucyA9IEFycmF5LmZyb20oYnJhbmRzKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyTGFiZWxUb1NsdWcgPSBvcHRzLmZpbHRlckxhYmVsVG9TbHVnO1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbkxhYmVsVG9TbHVnID0gb3B0cy5kZXN0aW5hdGlvbkxhYmVsVG9TbHVnO1xuICAgICAgICAgICAgdGhpcy5icmFuZExhYmVsVG9TbHVnID0gb3B0cy5icmFuZExhYmVsVG9TbHVnO1xuXG4gICAgICAgICAgICAvLyBTb2xvIHJlc2V0ZWFyIHNpIG5vIGhheSB1biBkZXN0aW5vIHBlbmRpZW50ZSBkZSBsYSBVUkxcbiAgICAgICAgICAgIGlmICghdGhpcy5wZW5kaW5nRGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSG90ZWxUeXBlID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERlc3RpbmF0aW9uID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEJyYW5kID0gJyc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNpIGhheSB1biBkZXN0aW5vIHBlbmRpZW50ZSBkZSBsYSBVUkwsIGludGVudGEgc2VsZWNjaW9uYXJsbyBhaG9yYVxuICAgICAgICAgICAgICAgIHRoaXMuZmluZEFuZFNlbGVjdERlc3RpbmF0aW9uKHRoaXMucGVuZGluZ0Rlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWN0dWFsaXphciBpdGVtcyBmaWx0cmFkb3NcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWRJdGVtcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIFN1c2NyaWJpcnNlIGEgbG9zIGNhbWJpb3MgZGUgcXVlcnkgcGFyYW1zXG4gICAgICAgIHRoaXMucXBTdWIgPSB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1NYXAuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uc1BhcmFtID0gcGFyYW1zLmdldCgnZGVzdGluYXRpb25zJyk7XG5cbiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbnNQYXJhbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZWREZXN0aW5hdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgIGRlY29kZVVSSUNvbXBvbmVudChkZXN0aW5hdGlvbnNQYXJhbSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nRGVzdGluYXRpb24gPSBkZWNvZGVkRGVzdGluYXRpb247XG5cbiAgICAgICAgICAgICAgICAvLyBTaSB5YSB0ZW5lbW9zIGRlc3RpbmF0aW9uT3B0aW9ucywgYnVzY2FyIHkgc2VsZWNjaW9uYXJcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb25PcHRpb25zICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb25PcHRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kQW5kU2VsZWN0RGVzdGluYXRpb24oZGVjb2RlZERlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5xcFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXZ1ZWx2ZSB1biBhcnJheSBub3JtYWxpemFkbyBkZSBCYWJ5bG9uR2xvYmFsSXRlbVxuICAgICAqL1xuICAgIGdldCBub3JtYWxpemVkSXRlbXMoKTogQmFieWxvbkdsb2JhbEl0ZW1bXSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVHbG9iYWxJdGVtcyh0aGlzLml0ZW1zKTtcbiAgICB9XG5cbiAgICBnZXRGaXJzdEltYWdlQnlUYWcodGFnTmFtZTogc3RyaW5nLCBpbWFnZW5lczogQmFieWxvbkltYWdlSVtdKSB7XG4gICAgICAgIHJldHVybiBnZXRGaXJzdEltYWdlQnlUYWdGcm9tSW1hZ2VzKGltYWdlbmVzLCB0YWdOYW1lKTtcbiAgICB9XG5cbiAgICBnZXQgZmlsdGVyZWRJdGVtcygpIHtcbiAgICAgICAgLy8gRGV2b2x2ZXIgbG9zIGl0ZW1zIGZpbHRyYWRvcyBub3JtYWxpemFkb3NcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZUdsb2JhbEl0ZW1zKHRoaXMuX2ZpbHRlcmVkSXRlbXNSYXcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRmlsdGVyZWRJdGVtcygpOiB2b2lkIHtcbiAgICAgICAgbGV0IGl0ZW1zID0gZmlsdGVyZWRJdGVtcyh7XG4gICAgICAgICAgICBpdGVtczogdGhpcy5pdGVtcyA/PyBbXSxcbiAgICAgICAgICAgIHNlbGVjdGVkSG90ZWxUeXBlOiB0aGlzLnNlbGVjdGVkSG90ZWxUeXBlLFxuICAgICAgICAgICAgc2VsZWN0ZWREZXN0aW5hdGlvbjogdGhpcy5zZWxlY3RlZERlc3RpbmF0aW9uLFxuICAgICAgICAgICAgc2VsZWN0ZWRCcmFuZDogdGhpcy5zZWxlY3RlZEJyYW5kLFxuICAgICAgICAgICAgYWRkaXRpb25hbDFMaWtlTWFyY2E6IHRoaXMuYWRkaXRpb25hbDFMaWtlTWFyY2EgPz8gZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNpIGhheSBkZXN0aW5hdGlvblNlbGVjdGVkIHkgbm8gdGllbmUgcmVzdWx0YWRvcywgaW50ZW50YXIgZmlsdHJhciBwb3IgY291bnRyeVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERlc3RpbmF0aW9uICYmIGl0ZW1zLmxlbmd0aCA9PT0gMCAmJiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICBpdGVtcyA9IHRoaXMuaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG90ZWxUeXBlT2sgPVxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5zZWxlY3RlZEhvdGVsVHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAoaXRlbSBhcyBhbnkpPy5ob3RlbHR5cGUgPT09IHRoaXMuc2VsZWN0ZWRIb3RlbFR5cGU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbk9rID1cbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuc2VsZWN0ZWREZXN0aW5hdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICBpdGVtLmNvdW50cnk/LnRvTG93ZXJDYXNlKCk/LnRyaW0oKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREZXN0aW5hdGlvbi50b0xvd2VyQ2FzZSgpPy50cmltKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBicmFuZE9rID1cbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuc2VsZWN0ZWRCcmFuZCB8fFxuICAgICAgICAgICAgICAgICAgICBVdGlscy50b1NsdWcoXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRJdGVtQnJhbmQoaXRlbSwgdGhpcy5hZGRpdGlvbmFsMUxpa2VNYXJjYSA/PyBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgKSA9PT0gVXRpbHMudG9TbHVnKHRoaXMuc2VsZWN0ZWRCcmFuZCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaG90ZWxUeXBlT2sgJiYgZGVzdGluYXRpb25PayAmJiBicmFuZE9rO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9maWx0ZXJlZEl0ZW1zUmF3ID0gaXRlbXM7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIGdldCBoYXNBY3RpdmVGaWx0ZXJzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEhvdGVsVHlwZSxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREZXN0aW5hdGlvbixcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRCcmFuZCxcbiAgICAgICAgXS5zb21lKCh2KSA9PiB2ICYmIHYgIT09ICcnKTtcbiAgICB9XG5cbiAgICBvbkhvdGVsVHlwZUNoYW5nZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRIb3RlbFR5cGUgPSB2YWx1ZSA/PyAnJztcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgfVxuXG4gICAgb25EZXN0aW5hdGlvbkNoYW5nZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREZXN0aW5hdGlvbiA9IHZhbHVlID8/ICcnO1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkSXRlbXMoKTtcbiAgICB9XG5cbiAgICBvbkJyYW5kQ2hhbmdlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEJyYW5kID0gdmFsdWUgPz8gJyc7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWRJdGVtcygpO1xuICAgIH1cblxuICAgIGNsZWFyRmlsdGVycygpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEhvdGVsVHlwZSA9ICcnO1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGVzdGluYXRpb24gPSAnJztcbiAgICAgICAgdGhpcy5zZWxlY3RlZEJyYW5kID0gJyc7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWRJdGVtcygpO1xuICAgIH1cblxuICAgIHRyYWNrRmlsdGVyKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIHRyYWNrT3B0aW9uKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICAgIHRyYWNrT2ZmZXIoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicGFnZS1jb250YWluZXIgZmlyc3QtbW9kdWxlIG9mZmVycy1wYWdlXCI+XG4gICAgPGRpdiBjbGFzcz1cImJpZy13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwLXBhZ2UtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8aGVhZGVyIGNsYXNzPVwiZ2xvYmFsLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwLWdsb2JhbC1oZWFkZXIgdmlzaWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHRleHRzPy50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPVwiZ2xvYmFsLWhlYWRlci10aXRsZVwiPnt7IHRleHRzPy50aXRsZSB9fTwvaDE+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmICh0ZXh0cz8uc3VidGl0bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJnbG9iYWwtaGVhZGVyLXN1YnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRleHRzPy5zdWJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9wPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvZmZlcnMtaW5wdXRzXCIgKm5nSWY9XCJzaG93RmlsdGVyc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdsb2JhbC1oZWFkZXItZm9ybVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1maWx0ZXJzLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBCcmFuZCBmaWx0ZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1mb3JtLWVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWVsZW1lbnQgc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcC1pbnB1dC1lbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh0ZXh0cz8ubWFyY2EpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1lbGVtZW50LXRleHRcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHM/Lm1hcmNhID8/ICdtYXJjYSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1lbGVtZW50LWZpZWxkIGpzLWZpbHRlci1vZmZlcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkQnJhbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnJhbmRDaGFuZ2UoJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdGV4dHM/Lm1hcmNhID8/ICdtYXJjYScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0IG9mIGJyYW5kT3B0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrICRpbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIm9wdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHNlcnZpY2VzLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1mb3JtLWVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWVsZW1lbnQgc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcC1pbnB1dC1lbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh0ZXh0cz8uZGVzdGluYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZWxlbWVudC10ZXh0XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRzPy5kZXN0aW5hdGlvbnMgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVzdGlub3MnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZWxlbWVudC1maWVsZCBqcy1maWx0ZXItb2ZmZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZERlc3RpbmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkRlc3RpbmF0aW9uQ2hhbmdlKCRldmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHM/LmRlc3RpbmF0aW9ucyA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVzdGlub3MnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgb2YgZGVzdGluYXRpb25PcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgJGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwib3B0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1lbmQgZmlsdGVycy0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9oZWFkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG48c2VjdGlvbiBjbGFzcz1cInByb21vLW1vZHVsZSBvZmZlcnMtcGFnZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJiaWctd3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcC1wcm9tby1tb2R1bGUgbW9kdWxlLXNwYWNlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb21vLW1vZHVsZS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgQGlmIChmaWx0ZXJlZEl0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBmaWx0ZXJlZEl0ZW1zOyB0cmFjayB0cmFja09mZmVyKCRpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9tby1tb2R1bGUtZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwLXByb21vLWVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cImdldEJ1dHRvblVybChpdGVtLCAxKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlua1R5cGVdPVwiZ2V0QnV0dG9uTGlua1R5cGUoaXRlbSwgMSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9tby1lbGVtZW50LW1lZGlhIGpzLXNlY3Rpb24tYXJyb3dzLXpvbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpcnN0SW1hZ2VCeVRhZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy5tdWx0aW1lZGlhPy5pbWFnZW5lcyA/PyBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy5tdWx0aW1lZGlhPy5pbWFnZW5lcz8uWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpZ3VyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9tby1lbGVtZW50LW1lZGlhX2ltZyByZXNwb25zaXZlLXJlc2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiaW1nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nPy5pbWc/LmFsdCA/PyAnaXRlbUltYWdlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZmlsZW5hbWVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nPy5pbWc/LmFsdCA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpdGVtRmlsZU5hbWUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtaW1hZ2VdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCgnICsgaW1nPy5pbWc/LnNyYyArICcpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvZmlndXJlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb21vLWVsZW1lbnQtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbT8udGV4dHM/LmFkZGl0aW9uYWwzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByb21vLWVsZW1lbnQtaW5mb190YWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8udGV4dHM/LmFkZGl0aW9uYWwzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LnRleHRzPy50aXRsZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy50ZXh0cz8ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9tby1lbGVtZW50LWluZm9fdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy50ZXh0cz8udGl0bGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy50ZXh0cz8ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtPy50ZXh0cz8uYWRkaXRpb25hbDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvbW8tZWxlbWVudC1pbmZvX3N1YnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8udGV4dHM/LmFkZGl0aW9uYWwyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9tby1lbGVtZW50LWZvb3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9tby1lbGVtZW50LXByaWNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0/LnByaWNlIHx8IGl0ZW0/LmRpc2NvdW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy50ZXh0cz8uYWRkaXRpb25hbDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvbW8tZWxlbWVudC1wcmljZV9zaW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy50ZXh0cz8uYWRkaXRpb25hbDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtPy5wcmljZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9tby1lbGVtZW50LXByaWNlX251bVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0/LnByaWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTxzbWFsbD57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LmN1cnJlbmN5IHx8ICdFVVInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY3VycmVuY3lTeW1ib2xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zbWFsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uZGlzY291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvbW8tZWxlbWVudC1wcmljZV9udW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtPy5kaXNjb3VudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08c21hbGw+ICU8L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvbW8tZWxlbWVudC1idG5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChnZXRCdXR0b25MYWJlbChpdGVtLCAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvcnBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJ1dHRvblVybChpdGVtLCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpbmtUeXBlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCdXR0b25MaW5rVHlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWNvcnAtdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QnV0dG9uTGFiZWwoaXRlbSwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChnZXRCdXR0b25MYWJlbChpdGVtLCAxKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwiZ2V0QnV0dG9uVXJsKGl0ZW0sIDEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5rVHlwZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCdXR0b25MaW5rVHlwZShpdGVtLCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWxpbmtlciB0b3JpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1saW5rZXItdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QnV0dG9uTGFiZWwoaXRlbSwgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGdldExpbmtMYWJlbChpdGVtLCAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwiZ2V0TGlua1VybChpdGVtLCAwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlua1R5cGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGlua0xpbmtUeXBlKGl0ZW0sIDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tbGlua2VyIHRvcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWxpbmtlci10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5rTGFiZWwoaXRlbSwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib2ZmZXJzLW1lc3NhZ2VcIiBbY2xhc3Muc2hvd109XCJmaWx0ZXJlZEl0ZW1zPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3JhcC1tZXNzYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAodGV4dHM/Lm5vdEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWVzc2FnZS10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cInRleHRzPy5ub3RGb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9wPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZW1wLXRyYXNoXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9zZWN0aW9uPlxuIl19
320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzLWMyLWltZy10eHQtY3RhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhYnlsb24vc3JjL2xpYi9jb21wb25lbnRzL2V4dGVybmFsL2NvcmUvbGlzLWMyLWltZy10eHQtY3RhL2xpcy1jMi1pbWctdHh0LWN0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYWJ5bG9uL3NyYy9saWIvY29tcG9uZW50cy9leHRlcm5hbC9jb3JlL2xpcy1jMi1pbWctdHh0LWN0YS9saXMtYzItaW1nLXR4dC1jdGEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFDSCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQU1oRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUM5RSxPQUFPLEVBQ0gsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixZQUFZLEdBQ2YsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4QyxPQUFPLEVBQ0gsaUJBQWlCLEdBS3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFnQixNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFNUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7O0FBZS9FLE1BQU0sT0FBTyx1QkFBdUI7SUFicEM7UUFpQmEseUJBQW9CLEdBQWEsS0FBSyxDQUFDO1FBQ3ZDLHFCQUFnQixHQUFZLElBQUksQ0FBQztRQUNqQyxnQkFBVyxHQUFZLElBQUksQ0FBQyxDQUFDLGtDQUFrQztRQUV4RSxZQUFPLEdBQVcsZ0JBQWdCLENBQUM7UUFFbkMsc0JBQWlCLEdBQVcsRUFBRSxDQUFDO1FBQy9CLHdCQUFtQixHQUFXLEVBQUUsQ0FBQztRQUNqQyxrQkFBYSxHQUFXLEVBQUUsQ0FBQztRQUUzQixxQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFDaEMsdUJBQWtCLEdBQWEsRUFBRSxDQUFDO1FBQ2xDLGlCQUFZLEdBQWEsRUFBRSxDQUFDO1FBRTVCLHNCQUFpQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQzlDLDJCQUFzQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQ25ELHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBRTVCLFdBQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hDLGVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFLMUMsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFNL0Isc0RBQXNEO1FBQzlDLHNCQUFpQixHQUF3QixFQUFFLENBQUM7UUE4Sm5DLDRCQUF1QixHQUFHLEdBQVMsRUFBRTtZQUNsRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFBRSxPQUFPO1lBRWhELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNO2lCQUNwQixRQUFRLENBQUMsR0FBRyxDQUFDO2lCQUNiLGFBQWEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdkMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLO2dCQUM1QixDQUFDLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDO2dCQUMzQixDQUFDLENBQUMsU0FBUyxDQUFDO1lBRWhCLDZFQUE2RTtZQUM3RSxJQUFJLGtCQUFrQixLQUFLLElBQUksQ0FBQyxzQkFBc0I7Z0JBQUUsT0FBTztZQUUvRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDO0tBbUxMO0lBOVZXLHdCQUF3QixDQUFDLGVBQXVCO1FBQ3BELE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUU3RCxvREFBb0Q7UUFDcEQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FDckMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUNaLFdBQVcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxjQUFjLENBQzNELENBQUM7UUFFRixJQUFJLEtBQUssRUFBRTtZQUNQLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7WUFDakMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsT0FBTztTQUNWO1FBRUQseUVBQXlFO1FBQ3pFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUNwQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxjQUFjLENBQ25FLENBQUM7UUFFRixJQUFJLGVBQWUsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFO1lBQzVDLDBFQUEwRTtZQUMxRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztZQUNuRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM5QjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjLENBQUMsSUFBdUIsRUFBRSxLQUFhO1FBQ2pELElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRTtZQUMvQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUNwRSxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQXVCLEVBQUUsS0FBYTtRQUMvQyxPQUFPLENBQ0gsSUFBSSxDQUFDLFlBQVksQ0FDYixJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUNwRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ2pELENBQUM7SUFDTixDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBdUIsRUFBRSxLQUFhO1FBQ3BELE9BQU8sQ0FDSCxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVE7WUFDM0QsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FDbkMsQ0FBQztJQUNOLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBdUIsRUFBRSxLQUFhO1FBQy9DLElBQUksSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRTtZQUM3QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUNsRSxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQXVCLEVBQUUsS0FBYTtRQUM3QyxPQUFPLENBQ0gsSUFBSSxDQUFDLFlBQVksQ0FDYixJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUNsRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQy9DLENBQUM7SUFDTixDQUFDO0lBRUQsZUFBZSxDQUFDLElBQXVCLEVBQUUsS0FBYTtRQUNsRCxPQUFPLENBQ0gsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRO1lBQ3pELElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQ2pDLENBQUM7SUFDTixDQUFDO0lBRUQsWUFBWSxDQUFDLElBQWdDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTFCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QyxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFekQsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUVqQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFFMUIsT0FBTyxHQUFHLE9BQU8saUJBQWlCLFdBQVcsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQzNCLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxFQUNoQixJQUFJLENBQUMsb0JBQW9CLElBQUksS0FBSyxDQUNyQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUM5QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBRWxELDREQUE0RDtZQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1lBQ2pDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUN0QixFQUFFLEVBQ0YsSUFBSSxDQUFDLG9CQUFvQixJQUFJLEtBQUssQ0FDckMsQ0FBQztnQkFDRixJQUFJLEtBQUs7b0JBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ2hELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFDMUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUU5Qyx3REFBd0Q7WUFDeEQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTTtpQkFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN6QixhQUFhLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRXZDLElBQUksaUJBQWlCLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUNoRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDMUQ7aUJBQU07Z0JBQ0gsaURBQWlEO2dCQUNqRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQzthQUMzQjtZQUVELDZCQUE2QjtZQUM3QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM5QjtJQUNMLENBQUM7SUFFRCxRQUFRO1FBQ0osNEVBQTRFO1FBQzVFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRS9DLHFGQUFxRjtRQUNyRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTthQUM5QixJQUFJLENBQ0QsTUFBTSxDQUNGLENBQUMsS0FBSyxFQUEwQixFQUFFLENBQzlCLEtBQUssWUFBWSxhQUFhLENBQ3JDLENBQ0o7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFUCx3RUFBd0U7UUFDeEUsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDcEMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDdkI7SUFDTCxDQUFDO0lBbUJPLFlBQVk7UUFDaEIsSUFBSSxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU87UUFFaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQ2xELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztRQUV4RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FDcEIsSUFBYSxFQUNiLE1BQWMsRUFDZCxHQUF5QixFQUNyQixFQUFFO1lBQ04sSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDbkMsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQ3ZCLElBQWEsRUFDYixNQUFjLEVBQ2QsR0FBeUIsRUFDckIsRUFBRTtZQUNOLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25FLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ25DLENBQUMsQ0FBQztRQUVGLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqRCxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDdkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVPLGNBQWM7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUVqQyxxRUFBcUU7UUFDckUsSUFDSSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3JCLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFDcEQ7WUFDRSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWtCLENBQUM7U0FDdEQ7UUFDRCxJQUNJLElBQUksQ0FBQyxtQkFBbUI7WUFDeEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLG1CQUFtQixFQUMxRDtZQUNFLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxvQkFBcUIsQ0FBQztTQUM1RDtRQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxHQUFXO1FBQ3hDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU07YUFDaEMsUUFBUSxDQUFDLEdBQUcsQ0FBQzthQUNiLGFBQWEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGlCQUFpQjtZQUMzQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUM7WUFDdkMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUVoQixJQUFJLGlCQUFpQixFQUFFO1lBQ25CLE1BQU0sa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7WUFFN0MseURBQXlEO1lBQ3pELElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBRTtnQkFDakMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDckQ7U0FDSjthQUFNO1lBQ0gsbUVBQW1FO1lBQ25FLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7WUFDcEMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2FBQzlCO1NBQ0o7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUM5QixJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNwQyxNQUFNLENBQUMsbUJBQW1CLENBQ3RCLFVBQVUsRUFDVixJQUFJLENBQUMsdUJBQXVCLENBQy9CLENBQUM7WUFDRixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDekI7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGVBQWU7UUFDZixPQUFPLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsT0FBZSxFQUFFLFFBQXlCO1FBQ3pELE9BQU8sNEJBQTRCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDYiw0Q0FBNEM7UUFDNUMsT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3ZCLElBQUksS0FBSyxHQUFHLGFBQWEsQ0FBQztZQUN0QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3ZCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7WUFDekMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtZQUM3QyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDakMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixJQUFJLEtBQUs7U0FDM0QsQ0FBQyxDQUFDO1FBRUgsaUZBQWlGO1FBQ2pGLElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDOUQsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQy9CLE1BQU0sV0FBVyxHQUNiLENBQUMsSUFBSSxDQUFDLGlCQUFpQjtvQkFDdEIsSUFBWSxFQUFFLFNBQVMsS0FBSyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBRXhELE1BQU0sYUFBYSxHQUNmLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtvQkFDekIsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUU7d0JBQy9CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFFdkQsTUFBTSxPQUFPLEdBQ1QsQ0FBQyxJQUFJLENBQUMsYUFBYTtvQkFDbkIsS0FBSyxDQUFDLE1BQU0sQ0FDUixZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxLQUFLLENBQUMsQ0FDekQsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFFM0MsT0FBTyxXQUFXLElBQUksYUFBYSxJQUFJLE9BQU8sQ0FBQztZQUNuRCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNoQixPQUFPO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQjtZQUN0QixJQUFJLENBQUMsbUJBQW1CO1lBQ3hCLElBQUksQ0FBQyxhQUFhO1NBQ3JCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxLQUF5QjtRQUN2QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBeUI7UUFDekMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUF5QjtRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELFlBQVk7UUFDUixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhO1FBQ3JCLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxXQUFXLENBQUMsS0FBYTtRQUNyQixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0QsVUFBVSxDQUFDLEtBQWE7UUFDcEIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQzsrR0FuWVEsdUJBQXVCO21HQUF2Qix1QkFBdUIsK1FDakRwQyxnM2RBNFFBLDgxdDJCRHBPUSxZQUFZLG1JQUNaLHdCQUF3Qiw4SkFDeEIsbUJBQW1CLHNEQUNuQixXQUFXOzs0RkFNTix1QkFBdUI7a0JBYm5DLFNBQVM7K0JBQ0ksb0JBQW9CLGNBQ2xCLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLHdCQUF3Qjt3QkFDeEIsbUJBQW1CO3dCQUNuQixXQUFXO3FCQUNkLGlCQUdjLGlCQUFpQixDQUFDLFFBQVE7OEJBR2hDLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgSW5wdXQsXG4gICAgUExBVEZPUk1fSUQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmFieWxvbkxpbmtUeXBlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGlyZWN0aXZlcy9saW5rLXR5cGUvbGluay10eXBlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1xuICAgIEJhYnlsb25CdXR0b25JLFxuICAgIEJhYnlsb25JbWFnZUksXG4gICAgQmFieWxvblRleHRJbmZvSSxcbn0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBCYWJ5bG9uQ3VycmVuY3lQaXBlIH0gZnJvbSAnLi4vLi4vLi4vLi4vcGlwZXMvYmFieWxvbi1jdXJyZW5jeS5waXBlJztcbmltcG9ydCB7XG4gICAgYnVpbGRGaWx0ZXJPcHRpb25zLFxuICAgIGZpbHRlcmVkSXRlbXMsXG4gICAgZ2V0SXRlbUJyYW5kLFxufSBmcm9tICcuLi8uLi8uLi8uLi91dGlscy9maWx0ZXIudXRpbHMnO1xuXG5pbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCYWJ5bG9uR2xvYmFsSXRlbSB9IGZyb20gJy4uLy4uLy4uLy4uL2ludGVyZmFjZXMvYmFieWxvbi1nbG9iYWwtaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgeyBnZXRGaXJzdEltYWdlQnlUYWdGcm9tSW1hZ2VzIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvbXV0aW1lZGlhLnV0aWxzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUdsb2JhbEl0ZW1zIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbHMvbm9ybWFsaXplLWl0ZW1zLnV0aWxzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdsaXMtYzItaW1nLXR4dC1jdGEnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIEJhYnlsb25MaW5rVHlwZURpcmVjdGl2ZSxcbiAgICAgICAgQmFieWxvbkN1cnJlbmN5UGlwZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgXSxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbGlzLWMyLWltZy10eHQtY3RhLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vbGlzLWMyLWltZy10eHQtY3RhLmNvbXBvbmVudC5zY3NzJyxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbn0pXG5leHBvcnQgY2xhc3MgTGlzQzJJbWdUeHRDdGFDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKSB0ZXh0cz86IEJhYnlsb25UZXh0SW5mb0k7XG4gICAgQElucHV0KCkgaXRlbXM/OiBCYWJ5bG9uR2xvYmFsSXRlbVtdO1xuICAgIEBJbnB1dCgpIGxpbmtzPzogQmFieWxvbkJ1dHRvbklbXTtcbiAgICBASW5wdXQoKSBhZGRpdGlvbmFsMUxpa2VNYXJjYT86IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBzaG93Q2xlYW5GaWx0ZXJzOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaG93RmlsdGVyczogYm9vbGVhbiA9IHRydWU7IC8vIHRvIHNob3cgb3IgaGlkZSBmaWx0ZXJzIHNlY3Rpb25cblxuICAgIHRhZ05hbWU6IHN0cmluZyA9ICdMaXNDMkltZ1R4dEN0YSc7XG5cbiAgICBzZWxlY3RlZEhvdGVsVHlwZTogc3RyaW5nID0gJyc7XG4gICAgc2VsZWN0ZWREZXN0aW5hdGlvbjogc3RyaW5nID0gJyc7XG4gICAgc2VsZWN0ZWRCcmFuZDogc3RyaW5nID0gJyc7XG5cbiAgICBob3RlbFR5cGVPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGRlc3RpbmF0aW9uT3B0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICBicmFuZE9wdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmaWx0ZXJMYWJlbFRvU2x1ZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgZGVzdGluYXRpb25MYWJlbFRvU2x1ZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgYnJhbmRMYWJlbFRvU2x1ZyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICAgIHByaXZhdGUgcm91dGVyU3ViPzogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgcGVuZGluZ0Rlc3RpbmF0aW9uPzogc3RyaW5nO1xuICAgIHByaXZhdGUgbGFzdERlc3RpbmF0aW9uRnJvbVVybD86IHN0cmluZztcblxuICAgIHByaXZhdGUgaGlzdG9yeVBhdGNoZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIG9yaWdpbmFsUHVzaFN0YXRlPzogdHlwZW9mIGhpc3RvcnkucHVzaFN0YXRlO1xuICAgIHByaXZhdGUgb3JpZ2luYWxSZXBsYWNlU3RhdGU/OiB0eXBlb2YgaGlzdG9yeS5yZXBsYWNlU3RhdGU7XG4gICAgcHJpdmF0ZSBwYXRjaGVkUHVzaFN0YXRlPzogdHlwZW9mIGhpc3RvcnkucHVzaFN0YXRlO1xuICAgIHByaXZhdGUgcGF0Y2hlZFJlcGxhY2VTdGF0ZT86IHR5cGVvZiBoaXN0b3J5LnJlcGxhY2VTdGF0ZTtcblxuICAgIC8vIEl0ZW1zIGZpbHRyYWRvcyBzaW4gbm9ybWFsaXphciAodXNhZG9zIHBhcmEgbMOzZ2ljYSlcbiAgICBwcml2YXRlIF9maWx0ZXJlZEl0ZW1zUmF3OiBCYWJ5bG9uR2xvYmFsSXRlbVtdID0gW107XG5cbiAgICBwcml2YXRlIGZpbmRBbmRTZWxlY3REZXN0aW5hdGlvbihkZXN0aW5hdGlvbk5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IGRlc3RpbmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpPy50cmltKCk7XG5cbiAgICAgICAgLy8gUHJpbWVybyBidXNjYXIgZW4gZWwgYXJyYXkgZGUgc3RyaW5ncyBkZSBkZXN0aW5vc1xuICAgICAgICBsZXQgZm91bmQgPSB0aGlzLmRlc3RpbmF0aW9uT3B0aW9ucz8uZmluZChcbiAgICAgICAgICAgIChkZXN0aW5hdGlvbikgPT5cbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi50b0xvd2VyQ2FzZSgpPy50cmltKCkgPT09IG5vcm1hbGl6ZWROYW1lXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGVzdGluYXRpb24gPSBmb3VuZDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWRJdGVtcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2kgbm8gZW5jdWVudHJhIGVuIGRlc3RpbmF0aW9uT3B0aW9ucywgYnVzY2FyIGVuIGxvcyBpdGVtcyBwb3IgY291bnRyeVxuICAgICAgICBjb25zdCBpdGVtV2l0aENvdW50cnkgPSB0aGlzLml0ZW1zPy5maW5kKFxuICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uY291bnRyeT8udG9Mb3dlckNhc2UoKT8udHJpbSgpID09PSBub3JtYWxpemVkTmFtZVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChpdGVtV2l0aENvdW50cnkgJiYgaXRlbVdpdGhDb3VudHJ5LmNvdW50cnkpIHtcbiAgICAgICAgICAgIC8vIEZpbHRyYXIgZGlyZWN0YW1lbnRlIHBvciBjb3VudHJ5IGF1bnF1ZSBubyBleGlzdGEgZW4gZGVzdGluYXRpb25PcHRpb25zXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGVzdGluYXRpb24gPSBpdGVtV2l0aENvdW50cnkuY291bnRyeTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWRJdGVtcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV2dWVsdmUgZWwgbGFiZWwgZGVsIGJvdMOzbiBlbiBsYSBwb3NpY2nDs24gaW5kZXgsIGJ1c2NhbmRvIGVuIGl0ZW0uYnV0dG9uc1tpbmRleF0ubGFiZWxcbiAgICAgKiB5IHNpIG5vIGV4aXN0ZSwgZW4gaXRlbS5tdWx0aW1lZGlhLmltYWdlbmVzWzBdLmJ1dHRvbnNbaW5kZXhdLmxhYmVsXG4gICAgICovXG4gICAgZ2V0QnV0dG9uTGFiZWwoaXRlbTogQmFieWxvbkdsb2JhbEl0ZW0sIGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoaXRlbT8uYnV0dG9ucz8uW2luZGV4XT8ubGFiZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmJ1dHRvbnNbaW5kZXhdLmxhYmVsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtPy5tdWx0aW1lZGlhPy5pbWFnZW5lcz8uWzBdPy5idXR0b25zPy5baW5kZXhdPy5sYWJlbDtcbiAgICB9XG5cbiAgICBnZXRCdXR0b25VcmwoaXRlbTogQmFieWxvbkdsb2JhbEl0ZW0sIGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5idWlsZE1lbnVVcmwoXG4gICAgICAgICAgICAgICAgaXRlbT8ubXVsdGltZWRpYT8uaW1hZ2VuZXM/LlswXT8uYnV0dG9ucz8uW2luZGV4XVxuICAgICAgICAgICAgKSB8fCB0aGlzLmJ1aWxkTWVudVVybChpdGVtPy5idXR0b25zPy5baW5kZXhdKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldEJ1dHRvbkxpbmtUeXBlKGl0ZW06IEJhYnlsb25HbG9iYWxJdGVtLCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGl0ZW0/Lm11bHRpbWVkaWE/LmltYWdlbmVzPy5bMF0/LmJ1dHRvbnM/LltpbmRleF0/LmxpbmtUeXBlIHx8XG4gICAgICAgICAgICBpdGVtPy5idXR0b25zPy5baW5kZXhdPy5saW5rVHlwZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldExpbmtMYWJlbChpdGVtOiBCYWJ5bG9uR2xvYmFsSXRlbSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmIChpdGVtPy5saW5rcz8uW2luZGV4XT8ubGFiZWwpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVtLmxpbmtzW2luZGV4XS5sYWJlbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbT8ubXVsdGltZWRpYT8uaW1hZ2VuZXM/LlswXT8ubGlua3M/LltpbmRleF0/LmxhYmVsO1xuICAgIH1cblxuICAgIGdldExpbmtVcmwoaXRlbTogQmFieWxvbkdsb2JhbEl0ZW0sIGluZGV4OiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5idWlsZE1lbnVVcmwoXG4gICAgICAgICAgICAgICAgaXRlbT8ubXVsdGltZWRpYT8uaW1hZ2VuZXM/LlswXT8ubGlua3M/LltpbmRleF1cbiAgICAgICAgICAgICkgfHwgdGhpcy5idWlsZE1lbnVVcmwoaXRlbT8ubGlua3M/LltpbmRleF0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0TGlua0xpbmtUeXBlKGl0ZW06IEJhYnlsb25HbG9iYWxJdGVtLCBpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGl0ZW0/Lm11bHRpbWVkaWE/LmltYWdlbmVzPy5bMF0/LmxpbmtzPy5baW5kZXhdPy5saW5rVHlwZSB8fFxuICAgICAgICAgICAgaXRlbT8ubGlua3M/LltpbmRleF0/LmxpbmtUeXBlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYnVpbGRNZW51VXJsKGl0ZW06IEJhYnlsb25CdXR0b25JIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFpdGVtPy51cmwpIHJldHVybiAnJztcblxuICAgICAgICBjb25zdCBiYXNlVXJsID0gaXRlbS51cmwucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gKGl0ZW0udmFycyA/PyAnJykudG9TdHJpbmcoKT8udHJpbSgpO1xuXG4gICAgICAgIGlmICghZGVzdGluYXRpb24pIHJldHVybiBiYXNlVXJsO1xuXG4gICAgICAgIGNvbnN0IHNsdWcgPSBVdGlscy50b1NsdWcoZGVzdGluYXRpb24pO1xuICAgICAgICBpZiAoIXNsdWcpIHJldHVybiBiYXNlVXJsO1xuXG4gICAgICAgIHJldHVybiBgJHtiYXNlVXJsfT9kZXN0aW5hdGlvbnM9JHtkZXN0aW5hdGlvbn1gO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ2l0ZW1zJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBidWlsZEZpbHRlck9wdGlvbnMoXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtcyA/PyBbXSxcbiAgICAgICAgICAgICAgICB0aGlzLmFkZGl0aW9uYWwxTGlrZU1hcmNhID8/IGZhbHNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5ob3RlbFR5cGVPcHRpb25zID0gb3B0cy5ob3RlbFR5cGVPcHRpb25zO1xuICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbk9wdGlvbnMgPSBvcHRzLmRlc3RpbmF0aW9uT3B0aW9ucztcblxuICAgICAgICAgICAgLy8gUmVsbGVuYXIgYnJhbmRPcHRpb25zIHVzYW5kbyBnZXRJdGVtQnJhbmQgcGFyYSBjb2hlcmVuY2lhXG4gICAgICAgICAgICBjb25zdCBicmFuZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgICh0aGlzLml0ZW1zID8/IFtdKS5mb3JFYWNoKChpdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJyYW5kID0gZ2V0SXRlbUJyYW5kKFxuICAgICAgICAgICAgICAgICAgICBpdCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRpdGlvbmFsMUxpa2VNYXJjYSA/PyBmYWxzZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGJyYW5kKSBicmFuZHMuYWRkKGJyYW5kKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5icmFuZE9wdGlvbnMgPSBBcnJheS5mcm9tKGJyYW5kcyk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlckxhYmVsVG9TbHVnID0gb3B0cy5maWx0ZXJMYWJlbFRvU2x1ZztcbiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb25MYWJlbFRvU2x1ZyA9IG9wdHMuZGVzdGluYXRpb25MYWJlbFRvU2x1ZztcbiAgICAgICAgICAgIHRoaXMuYnJhbmRMYWJlbFRvU2x1ZyA9IG9wdHMuYnJhbmRMYWJlbFRvU2x1ZztcblxuICAgICAgICAgICAgLy8gU2luY3Jvbml6YXIgY29uIGVsIGZpbHRybyBkZSBkZXN0aW5vIGRlIGxhIFVSTCBhY3R1YWxcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uc1BhcmFtID0gdGhpcy5yb3V0ZXJcbiAgICAgICAgICAgICAgICAucGFyc2VVcmwodGhpcy5yb3V0ZXIudXJsKVxuICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtTWFwLmdldCgnZGVzdGluYXRpb25zJyk7XG5cbiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbnNQYXJhbSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0Rlc3RpbmF0aW9uID0gZGVjb2RlVVJJQ29tcG9uZW50KGRlc3RpbmF0aW9uc1BhcmFtKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbmRBbmRTZWxlY3REZXN0aW5hdGlvbih0aGlzLnBlbmRpbmdEZXN0aW5hdGlvbik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vIGhheSBmaWx0cm8gZW4gbGEgVVJMIOKGkiByZXNldGVhciBsb3MgZmlsdHJvc1xuICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0Rlc3RpbmF0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRIb3RlbFR5cGUgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGVzdGluYXRpb24gPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQnJhbmQgPSAnJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWN0dWFsaXphciBpdGVtcyBmaWx0cmFkb3NcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWRJdGVtcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIEFwbGljYXIgZWwgZGVzdGlubyBkZSBsYSBVUkwgYWN0dWFsICh0YW1iacOpbiBjdWJyZSBlbCBwcmltZXIgcmVuZGVyaXphZG8pXG4gICAgICAgIHRoaXMuYXBwbHlEZXN0aW5hdGlvbnNGcm9tVXJsKHRoaXMucm91dGVyLnVybCk7XG5cbiAgICAgICAgLy8gUmVhY2Npb25hciBhIGN1YWxxdWllciBuYXZlZ2FjacOzbiAoaW5jbHVpZGEgbGEgbWlzbWEgcnV0YSBjYW1iaWFuZG8gc29sbyBsYSBxdWVyeSlcbiAgICAgICAgdGhpcy5yb3V0ZXJTdWIgPSB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKGV2ZW50KTogZXZlbnQgaXMgTmF2aWdhdGlvbkVuZCA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseURlc3RpbmF0aW9uc0Zyb21VcmwodGhpcy5yb3V0ZXIudXJsKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERldGVjdGFyIGNhbWJpb3MgZGUgVVJMIGhlY2hvcyBmdWVyYSBkZWwgUm91dGVyIGRlIEFuZ3VsYXIgKFNTUi1zYWZlKVxuICAgICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BvcHN0YXRlJywgdGhpcy5oYW5kbGVFeHRlcm5hbFVybENoYW5nZSk7XG4gICAgICAgICAgICB0aGlzLnBhdGNoSGlzdG9yeSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVFeHRlcm5hbFVybENoYW5nZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCFpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaDtcbiAgICAgICAgY29uc3QgcGFyYW0gPSB0aGlzLnJvdXRlclxuICAgICAgICAgICAgLnBhcnNlVXJsKHVybClcbiAgICAgICAgICAgIC5xdWVyeVBhcmFtTWFwLmdldCgnZGVzdGluYXRpb25zJyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREZXN0aW5hdGlvbiA9IHBhcmFtXG4gICAgICAgICAgICA/IGRlY29kZVVSSUNvbXBvbmVudChwYXJhbSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIEV2aXRhciBwcm9jZXNhciBjYW1iaW9zIGRlIFVSTCBhamVub3MgYWwgZmlsdHJvIChtb2RhbGVzLCBhbmFseXRpY3MsIGV0Yy4pXG4gICAgICAgIGlmIChjdXJyZW50RGVzdGluYXRpb24gPT09IHRoaXMubGFzdERlc3RpbmF0aW9uRnJvbVVybCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuYXBwbHlEZXN0aW5hdGlvbnNGcm9tVXJsKHVybCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcGF0Y2hIaXN0b3J5KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oaXN0b3J5UGF0Y2hlZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMub3JpZ2luYWxQdXNoU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU7XG4gICAgICAgIHRoaXMub3JpZ2luYWxSZXBsYWNlU3RhdGUgPSB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGU7XG5cbiAgICAgICAgdGhpcy5wYXRjaGVkUHVzaFN0YXRlID0gKFxuICAgICAgICAgICAgZGF0YTogdW5rbm93bixcbiAgICAgICAgICAgIHVudXNlZDogc3RyaW5nLFxuICAgICAgICAgICAgdXJsPzogc3RyaW5nIHwgVVJMIHwgbnVsbFxuICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxQdXNoU3RhdGU/LmNhbGwod2luZG93Lmhpc3RvcnksIGRhdGEsIHVudXNlZCwgdXJsKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXh0ZXJuYWxVcmxDaGFuZ2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wYXRjaGVkUmVwbGFjZVN0YXRlID0gKFxuICAgICAgICAgICAgZGF0YTogdW5rbm93bixcbiAgICAgICAgICAgIHVudXNlZDogc3RyaW5nLFxuICAgICAgICAgICAgdXJsPzogc3RyaW5nIHwgVVJMIHwgbnVsbFxuICAgICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxSZXBsYWNlU3RhdGU/LmNhbGwod2luZG93Lmhpc3RvcnksIGRhdGEsIHVudXNlZCwgdXJsKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXh0ZXJuYWxVcmxDaGFuZ2UoKTtcbiAgICAgICAgfTtcblxuICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUgPSB0aGlzLnBhdGNoZWRQdXNoU3RhdGU7XG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSA9IHRoaXMucGF0Y2hlZFJlcGxhY2VTdGF0ZTtcbiAgICAgICAgdGhpcy5oaXN0b3J5UGF0Y2hlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXN0b3JlSGlzdG9yeSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmhpc3RvcnlQYXRjaGVkKSByZXR1cm47XG5cbiAgICAgICAgLy8gU29sbyByZXN0YXVyYXIgc2kgbGEgZnVuY2nDs24gYWN0dWFsIHNpZ3VlIHNpZW5kbyBsYSBxdWUgaW5zdGFsYW1vc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnBhdGNoZWRQdXNoU3RhdGUgJiZcbiAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSA9PT0gdGhpcy5wYXRjaGVkUHVzaFN0YXRlXG4gICAgICAgICkge1xuICAgICAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlID0gdGhpcy5vcmlnaW5hbFB1c2hTdGF0ZSE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5wYXRjaGVkUmVwbGFjZVN0YXRlICYmXG4gICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUgPT09IHRoaXMucGF0Y2hlZFJlcGxhY2VTdGF0ZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSA9IHRoaXMub3JpZ2luYWxSZXBsYWNlU3RhdGUhO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oaXN0b3J5UGF0Y2hlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXBwbHlEZXN0aW5hdGlvbnNGcm9tVXJsKHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uc1BhcmFtID0gdGhpcy5yb3V0ZXJcbiAgICAgICAgICAgIC5wYXJzZVVybCh1cmwpXG4gICAgICAgICAgICAucXVlcnlQYXJhbU1hcC5nZXQoJ2Rlc3RpbmF0aW9ucycpO1xuICAgICAgICB0aGlzLmxhc3REZXN0aW5hdGlvbkZyb21VcmwgPSBkZXN0aW5hdGlvbnNQYXJhbVxuICAgICAgICAgICAgPyBkZWNvZGVVUklDb21wb25lbnQoZGVzdGluYXRpb25zUGFyYW0pXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoZGVzdGluYXRpb25zUGFyYW0pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlY29kZWREZXN0aW5hdGlvbiA9IGRlY29kZVVSSUNvbXBvbmVudChkZXN0aW5hdGlvbnNQYXJhbSk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdEZXN0aW5hdGlvbiA9IGRlY29kZWREZXN0aW5hdGlvbjtcblxuICAgICAgICAgICAgLy8gU2kgeWEgdGVuZW1vcyBkZXN0aW5hdGlvbk9wdGlvbnMsIGJ1c2NhciB5IHNlbGVjY2lvbmFyXG4gICAgICAgICAgICBpZiAodGhpcy5kZXN0aW5hdGlvbk9wdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmluZEFuZFNlbGVjdERlc3RpbmF0aW9uKGRlY29kZWREZXN0aW5hdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBFbCBmaWx0cm8geWEgbm8gZXN0w6EgZW4gbGEgVVJMIOKGkiBsaW1waWFyIGVsIGRlc3Rpbm8gc2VsZWNjaW9uYWRvXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdEZXN0aW5hdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGVzdGluYXRpb24gPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkSXRlbXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJvdXRlclN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICdwb3BzdGF0ZScsXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFeHRlcm5hbFVybENoYW5nZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZUhpc3RvcnkoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldnVlbHZlIHVuIGFycmF5IG5vcm1hbGl6YWRvIGRlIEJhYnlsb25HbG9iYWxJdGVtXG4gICAgICovXG4gICAgZ2V0IG5vcm1hbGl6ZWRJdGVtcygpOiBCYWJ5bG9uR2xvYmFsSXRlbVtdIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZUdsb2JhbEl0ZW1zKHRoaXMuaXRlbXMpO1xuICAgIH1cblxuICAgIGdldEZpcnN0SW1hZ2VCeVRhZyh0YWdOYW1lOiBzdHJpbmcsIGltYWdlbmVzOiBCYWJ5bG9uSW1hZ2VJW10pIHtcbiAgICAgICAgcmV0dXJuIGdldEZpcnN0SW1hZ2VCeVRhZ0Zyb21JbWFnZXMoaW1hZ2VuZXMsIHRhZ05hbWUpO1xuICAgIH1cblxuICAgIGdldCBmaWx0ZXJlZEl0ZW1zKCkge1xuICAgICAgICAvLyBEZXZvbHZlciBsb3MgaXRlbXMgZmlsdHJhZG9zIG5vcm1hbGl6YWRvc1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplR2xvYmFsSXRlbXModGhpcy5fZmlsdGVyZWRJdGVtc1Jhdyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXJlZEl0ZW1zKCk6IHZvaWQge1xuICAgICAgICBsZXQgaXRlbXMgPSBmaWx0ZXJlZEl0ZW1zKHtcbiAgICAgICAgICAgIGl0ZW1zOiB0aGlzLml0ZW1zID8/IFtdLFxuICAgICAgICAgICAgc2VsZWN0ZWRIb3RlbFR5cGU6IHRoaXMuc2VsZWN0ZWRIb3RlbFR5cGUsXG4gICAgICAgICAgICBzZWxlY3RlZERlc3RpbmF0aW9uOiB0aGlzLnNlbGVjdGVkRGVzdGluYXRpb24sXG4gICAgICAgICAgICBzZWxlY3RlZEJyYW5kOiB0aGlzLnNlbGVjdGVkQnJhbmQsXG4gICAgICAgICAgICBhZGRpdGlvbmFsMUxpa2VNYXJjYTogdGhpcy5hZGRpdGlvbmFsMUxpa2VNYXJjYSA/PyBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2kgaGF5IGRlc3RpbmF0aW9uU2VsZWN0ZWQgeSBubyB0aWVuZSByZXN1bHRhZG9zLCBpbnRlbnRhciBmaWx0cmFyIHBvciBjb3VudHJ5XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGVzdGluYXRpb24gJiYgaXRlbXMubGVuZ3RoID09PSAwICYmIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgICAgIGl0ZW1zID0gdGhpcy5pdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3RlbFR5cGVPayA9XG4gICAgICAgICAgICAgICAgICAgICF0aGlzLnNlbGVjdGVkSG90ZWxUeXBlIHx8XG4gICAgICAgICAgICAgICAgICAgIChpdGVtIGFzIGFueSk/LmhvdGVsdHlwZSA9PT0gdGhpcy5zZWxlY3RlZEhvdGVsVHlwZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uT2sgPVxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5zZWxlY3RlZERlc3RpbmF0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uY291bnRyeT8udG9Mb3dlckNhc2UoKT8udHJpbSgpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERlc3RpbmF0aW9uLnRvTG93ZXJDYXNlKCk/LnRyaW0oKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJyYW5kT2sgPVxuICAgICAgICAgICAgICAgICAgICAhdGhpcy5zZWxlY3RlZEJyYW5kIHx8XG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnRvU2x1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldEl0ZW1CcmFuZChpdGVtLCB0aGlzLmFkZGl0aW9uYWwxTGlrZU1hcmNhID8/IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICApID09PSBVdGlscy50b1NsdWcodGhpcy5zZWxlY3RlZEJyYW5kKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBob3RlbFR5cGVPayAmJiBkZXN0aW5hdGlvbk9rICYmIGJyYW5kT2s7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2ZpbHRlcmVkSXRlbXNSYXcgPSBpdGVtcztcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgZ2V0IGhhc0FjdGl2ZUZpbHRlcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSG90ZWxUeXBlLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERlc3RpbmF0aW9uLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEJyYW5kLFxuICAgICAgICBdLnNvbWUoKHYpID0+IHYgJiYgdiAhPT0gJycpO1xuICAgIH1cblxuICAgIG9uSG90ZWxUeXBlQ2hhbmdlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEhvdGVsVHlwZSA9IHZhbHVlID8/ICcnO1xuICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcmVkSXRlbXMoKTtcbiAgICB9XG5cbiAgICBvbkRlc3RpbmF0aW9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERlc3RpbmF0aW9uID0gdmFsdWUgPz8gJyc7XG4gICAgICAgIHRoaXMudXBkYXRlRmlsdGVyZWRJdGVtcygpO1xuICAgIH1cblxuICAgIG9uQnJhbmRDaGFuZ2UodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQnJhbmQgPSB2YWx1ZSA/PyAnJztcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgfVxuXG4gICAgY2xlYXJGaWx0ZXJzKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSG90ZWxUeXBlID0gJyc7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREZXN0aW5hdGlvbiA9ICcnO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQnJhbmQgPSAnJztcbiAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgfVxuXG4gICAgdHJhY2tGaWx0ZXIoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgdHJhY2tPcHRpb24oaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gICAgdHJhY2tPZmZlcihpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJwYWdlLWNvbnRhaW5lciBmaXJzdC1tb2R1bGUgb2ZmZXJzLXBhZ2VcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYmlnLXdyYXBwZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndyYXAtcGFnZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxoZWFkZXIgY2xhc3M9XCJnbG9iYWwtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXAtZ2xvYmFsLWhlYWRlciB2aXNpYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAodGV4dHM/LnRpdGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDEgY2xhc3M9XCJnbG9iYWwtaGVhZGVyLXRpdGxlXCI+e3sgdGV4dHM/LnRpdGxlIH19PC9oMT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKHRleHRzPy5zdWJ0aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImdsb2JhbC1oZWFkZXItc3VidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwidGV4dHM/LnN1YnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3A+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9mZmVycy1pbnB1dHNcIiAqbmdJZj1cInNob3dGaWx0ZXJzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWhlYWRlci1mb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLWZpbHRlcnMtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEJyYW5kIGZpbHRlciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWZvcm0tZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZWxlbWVudCBzZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwLWlucHV0LWVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHRleHRzPy5tYXJjYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlucHV0LWVsZW1lbnQtdGV4dFwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0cz8ubWFyY2EgPz8gJ21hcmNhJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWVsZW1lbnQtZmllbGQganMtZmlsdGVyLW9mZmVyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRCcmFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25CcmFuZENoYW5nZSgkZXZlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZXh0cz8ubWFyY2EgPz8gJ21hcmNhJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQgb2YgYnJhbmRPcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sgJGluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwib3B0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0IH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc2VydmljZXMtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWZvcm0tZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZWxlbWVudCBzZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwLWlucHV0LWVsZW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHRleHRzPy5kZXN0aW5hdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1lbGVtZW50LXRleHRcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHM/LmRlc3RpbmF0aW9ucyA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXN0aW5vcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnB1dC1lbGVtZW50LWZpZWxkIGpzLWZpbHRlci1vZmZlcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRGVzdGluYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRGVzdGluYXRpb25DaGFuZ2UoJGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0cz8uZGVzdGluYXRpb25zID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXN0aW5vcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdCBvZiBkZXN0aW5hdGlvbk9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjayAkaW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJvcHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHQgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLWVuZCBmaWx0ZXJzLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2hlYWRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxzZWN0aW9uIGNsYXNzPVwicHJvbW8tbW9kdWxlIG9mZmVycy1wYWdlXCI+XG4gICAgPGRpdiBjbGFzcz1cImJpZy13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwLXByb21vLW1vZHVsZSBtb2R1bGUtc3BhY2VyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvbW8tbW9kdWxlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGZpbHRlcmVkSXRlbXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGZpbHRlcmVkSXRlbXM7IHRyYWNrIHRyYWNrT2ZmZXIoJGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb21vLW1vZHVsZS1lbGVtZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndyYXAtcHJvbW8tZWxlbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwiZ2V0QnV0dG9uVXJsKGl0ZW0sIDEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5rVHlwZV09XCJnZXRCdXR0b25MaW5rVHlwZShpdGVtLCAxKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByb21vLWVsZW1lbnQtbWVkaWEganMtc2VjdGlvbi1hcnJvd3Mtem9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Rmlyc3RJbWFnZUJ5VGFnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/Lm11bHRpbWVkaWE/LmltYWdlbmVzID8/IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/Lm11bHRpbWVkaWE/LmltYWdlbmVzPy5bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlndXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByb21vLWVsZW1lbnQtbWVkaWFfaW1nIHJlc3BvbnNpdmUtcmVzaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU9XCJpbWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWc/LmltZz8uYWx0ID8/ICdpdGVtSW1hZ2UnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1maWxlbmFtZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWc/LmltZz8uYWx0ID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0ZW1GaWxlTmFtZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXJsKCcgKyBpbWc/LmltZz8uc3JjICsgJyknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9maWd1cmU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvbW8tZWxlbWVudC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtPy50ZXh0cz8uYWRkaXRpb25hbDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvbW8tZWxlbWVudC1pbmZvX3RhZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy50ZXh0cz8uYWRkaXRpb25hbDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8udGV4dHM/LnRpdGxlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LnRleHRzPy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByb21vLWVsZW1lbnQtaW5mb190aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LnRleHRzPy50aXRsZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LnRleHRzPy5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0/LnRleHRzPy5hZGRpdGlvbmFsMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9tby1lbGVtZW50LWluZm9fc3VidGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy50ZXh0cz8uYWRkaXRpb25hbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb21vLWVsZW1lbnQtZm9vdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb21vLWVsZW1lbnQtcHJpY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbT8ucHJpY2UgfHwgaXRlbT8uZGlzY291bnQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LnRleHRzPy5hZGRpdGlvbmFsMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9tby1lbGVtZW50LXByaWNlX3NpbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LnRleHRzPy5hZGRpdGlvbmFsMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0/LnByaWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByb21vLWVsZW1lbnQtcHJpY2VfbnVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXRlbT8ucHJpY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PHNtYWxsPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8uY3VycmVuY3kgfHwgJ0VVUidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjdXJyZW5jeVN5bWJvbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L3NtYWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5kaXNjb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9tby1lbGVtZW50LXByaWNlX251bVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0/LmRpc2NvdW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTxzbWFsbD4gJTwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9tby1lbGVtZW50LWJ0bnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGdldEJ1dHRvbkxhYmVsKGl0ZW0sIDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29ycFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QnV0dG9uVXJsKGl0ZW0sIDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGlua1R5cGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJ1dHRvbkxpbmtUeXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tY29ycC10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCdXR0b25MYWJlbChpdGVtLCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGdldEJ1dHRvbkxhYmVsKGl0ZW0sIDEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJnZXRCdXR0b25VcmwoaXRlbSwgMSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpbmtUeXBlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJ1dHRvbkxpbmtUeXBlKGl0ZW0sIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tbGlua2VyIHRvcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWxpbmtlci10ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCdXR0b25MYWJlbChpdGVtLCAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZ2V0TGlua0xhYmVsKGl0ZW0sIDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJnZXRMaW5rVXJsKGl0ZW0sIDApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5rVHlwZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5rTGlua1R5cGUoaXRlbSwgMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1saW5rZXIgdG9yaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tbGlua2VyLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExpbmtMYWJlbChpdGVtLCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvZmZlcnMtbWVzc2FnZVwiIFtjbGFzcy5zaG93XT1cImZpbHRlcmVkSXRlbXM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwLW1lc3NhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmICh0ZXh0cz8ubm90Rm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZXNzYWdlLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwidGV4dHM/Lm5vdEZvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3A+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRlbXAtdHJhc2hcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L3NlY3Rpb24+XG4iXX0=