@sarasanalytics-com/design-system 0.0.157 → 0.0.159
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/esm2022/interfaces/avatar-interface.mjs +1 -1
- package/esm2022/interfaces/button-interface.mjs +1 -1
- package/esm2022/interfaces/card-carousel-interface.mjs +1 -1
- package/esm2022/interfaces/chip-interface.mjs +1 -1
- package/esm2022/interfaces/form-layout.interface.mjs +1 -1
- package/esm2022/interfaces/grid-interface.mjs +1 -1
- package/esm2022/interfaces/guide-card-interface.mjs +1 -1
- package/esm2022/interfaces/header-interface.mjs +1 -1
- package/esm2022/interfaces/icon-interface.mjs +1 -1
- package/esm2022/interfaces/layout-section-interface.mjs +1 -1
- package/esm2022/interfaces/left-nav-interface.mjs +1 -1
- package/esm2022/interfaces/menu.interface.mjs +1 -1
- package/esm2022/interfaces/message-banner.mjs +1 -1
- package/esm2022/interfaces/option-interface.mjs +1 -1
- package/esm2022/interfaces/scrolling-card-interface.mjs +1 -1
- package/esm2022/interfaces/select-interface.mjs +1 -1
- package/esm2022/interfaces/status-dot.interface.mjs +1 -1
- package/esm2022/interfaces/tab-interface.mjs +1 -1
- package/esm2022/interfaces/toast-interface.mjs +1 -1
- package/esm2022/interfaces/typography-animation-interface.mjs +1 -1
- package/esm2022/lib/accordion/accordion.component.mjs +3 -3
- package/esm2022/lib/avatar/avatar.component.mjs +3 -3
- package/esm2022/lib/button/button.component.mjs +3 -3
- package/esm2022/lib/calendar-header/calendar-header.component.mjs +3 -3
- package/esm2022/lib/card/card-body/card-body.component.mjs +1 -1
- package/esm2022/lib/card/card-custom-header/card-custom-header.component.mjs +1 -1
- package/esm2022/lib/card/card-footer-actions/card-footer-actions.component.mjs +3 -3
- package/esm2022/lib/card/card-icon/card-icon.component.mjs +1 -1
- package/esm2022/lib/card/card-title-actions/card-title-actions.component.mjs +1 -1
- package/esm2022/lib/card/card.component.mjs +3 -3
- package/esm2022/lib/card/checkbox-card/checkbox-card.component.mjs +3 -3
- package/esm2022/lib/card/guide-card/guide-card.component.mjs +3 -3
- package/esm2022/lib/card/menu-card/menu-card.component.mjs +3 -3
- package/esm2022/lib/card/thumbnail-card/thumbnail-card.component.mjs +3 -3
- package/esm2022/lib/card-carousel/card-carousel.component.mjs +3 -3
- package/esm2022/lib/categories-nav/categories-nav.component.mjs +3 -3
- package/esm2022/lib/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/lib/chips/chips.component.mjs +3 -3
- package/esm2022/lib/component-library.component.mjs +9 -9
- package/esm2022/lib/component-library.service.mjs +1 -1
- package/esm2022/lib/dashboard-loader/dashboard-loader.component.mjs +1 -1
- package/esm2022/lib/data-grid/data-grid.component.mjs +6 -8
- package/esm2022/lib/datepicker/datepicker.component.mjs +3 -3
- package/esm2022/lib/dialog/dialog.component.mjs +3 -3
- package/esm2022/lib/dropdown/category-dropdown/category-dropdown.component.mjs +9 -22
- package/esm2022/lib/dropdown/ng-select/ng-select.component.mjs +3 -3
- package/esm2022/lib/filter/filter.component.mjs +3 -3
- package/esm2022/lib/form-input/form-input.component.mjs +3 -3
- package/esm2022/lib/form-select/form-select.component.mjs +14 -3
- package/esm2022/lib/grid-cell/grid-cell.component.mjs +10 -10
- package/esm2022/lib/header/header.component.mjs +3 -3
- package/esm2022/lib/icon/icon.component.mjs +3 -3
- package/esm2022/lib/icon/icon.service.mjs +1 -1
- package/esm2022/lib/layout-section/layout-section.component.mjs +3 -3
- package/esm2022/lib/left-nav/left-nav.component.mjs +3 -3
- package/esm2022/lib/list/list.component.mjs +3 -3
- package/esm2022/lib/menu/menu-list/menu-item.component.mjs +3 -3
- package/esm2022/lib/menu/menu.component.mjs +3 -3
- package/esm2022/lib/menu/menu.directive.mjs +1 -1
- package/esm2022/lib/message-banner/message-banner.component.mjs +3 -3
- package/esm2022/lib/message-banner-v2/message-banner-v2.component.mjs +73 -33
- package/esm2022/lib/mini-card/mini-card.component.mjs +3 -3
- package/esm2022/lib/page-layout/page-layout.component.mjs +3 -3
- package/esm2022/lib/progress-bar/progress-bar.component.mjs +3 -3
- package/esm2022/lib/query-builder/query-builder-demo.component.mjs +45 -45
- package/esm2022/lib/query-builder/query-builder.component.mjs +3 -3
- package/esm2022/lib/query-builder/query-builder.service.mjs +1 -1
- package/esm2022/lib/query-builder-formly/query-builder-formly.component.mjs +3 -3
- package/esm2022/lib/query-builder-textarea/query-builder-textarea-demo.component.mjs +39 -39
- package/esm2022/lib/query-builder-textarea/query-builder-textarea.component.mjs +3 -3
- package/esm2022/lib/radio-button/radio-button.component.mjs +3 -3
- package/esm2022/lib/scrolling-cards/scrolling-cards.component.mjs +3 -3
- package/esm2022/lib/skeleton/skeleton-base.component.mjs +1 -1
- package/esm2022/lib/skeleton/skeleton-container.component.mjs +9 -9
- package/esm2022/lib/skeleton/skeleton-loader.component.mjs +193 -193
- package/esm2022/lib/skeleton/skeleton-presets.mjs +1 -1
- package/esm2022/lib/skeleton/skeleton-shapes.component.mjs +1 -1
- package/esm2022/lib/spinner/spinner.component.mjs +1 -1
- package/esm2022/lib/status-dot/status-dot.component.mjs +17 -17
- package/esm2022/lib/stepper/stepper.component.mjs +3 -3
- package/esm2022/lib/tabs/tabs.component.mjs +3 -3
- package/esm2022/lib/toast/toast.component.mjs +3 -3
- package/esm2022/lib/tool-tip/tool-tip.component.mjs +3 -3
- package/esm2022/lib/typography-animation/typography-animation.component.mjs +3 -3
- package/esm2022/utils/validators.mjs +1 -1
- package/fesm2022/sarasanalytics-com-design-system.mjs +493 -457
- package/fesm2022/sarasanalytics-com-design-system.mjs.map +1 -1
- package/lib/data-grid/data-grid.component.d.ts +2 -2
- package/lib/form-select/form-select.component.d.ts +1 -0
- package/lib/message-banner-v2/message-banner-v2.component.d.ts +3 -0
- package/package.json +1 -1
- package/styles/styles.css +432 -432
|
@@ -42,6 +42,7 @@ export class MessageBannerV2Component {
|
|
|
42
42
|
this.formlyFields = [];
|
|
43
43
|
this.allFieldsFilled = signal(false);
|
|
44
44
|
this.additionalFormlyFields = [];
|
|
45
|
+
this.allFormlyFields = [];
|
|
45
46
|
this.usePrebuiltFields = signal(false);
|
|
46
47
|
this.onFormEvent = new EventEmitter();
|
|
47
48
|
this.buttons = [];
|
|
@@ -118,12 +119,26 @@ export class MessageBannerV2Component {
|
|
|
118
119
|
if (changes['prebuiltFormFields']) {
|
|
119
120
|
this.usePrebuiltFields.set(!!this.prebuiltFormFields);
|
|
120
121
|
}
|
|
121
|
-
if (changes['formConfig']
|
|
122
|
+
if (changes['formConfig']) {
|
|
122
123
|
if (!this.usePrebuiltFields()) {
|
|
123
124
|
this.updateFormlyFields();
|
|
125
|
+
this.initializeCleanFormState();
|
|
124
126
|
}
|
|
125
127
|
}
|
|
126
128
|
}
|
|
129
|
+
initializeCleanFormState() {
|
|
130
|
+
this.model = {};
|
|
131
|
+
setTimeout(() => {
|
|
132
|
+
Object.keys(this.form.controls).forEach(key => {
|
|
133
|
+
const control = this.form.get(key);
|
|
134
|
+
if (control) {
|
|
135
|
+
control.markAsUntouched();
|
|
136
|
+
control.markAsPristine();
|
|
137
|
+
control.setErrors(null);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}, 0);
|
|
141
|
+
}
|
|
127
142
|
updateContentBasedOnType(type) {
|
|
128
143
|
// Only apply default content if custom content hasn't been provided
|
|
129
144
|
const currentState = this.state();
|
|
@@ -212,10 +227,12 @@ export class MessageBannerV2Component {
|
|
|
212
227
|
// Skip Formly field generation if using prebuilt fields
|
|
213
228
|
if (this.usePrebuiltFields()) {
|
|
214
229
|
this.formlyFields = [];
|
|
230
|
+
this.allFormlyFields = [];
|
|
215
231
|
return;
|
|
216
232
|
}
|
|
217
233
|
if (!this.formConfig || !this.formConfig.fields || this.formConfig.fields.length === 0) {
|
|
218
234
|
this.formlyFields = [];
|
|
235
|
+
this.allFormlyFields = [];
|
|
219
236
|
return;
|
|
220
237
|
}
|
|
221
238
|
// Get layout configuration
|
|
@@ -224,16 +241,16 @@ export class MessageBannerV2Component {
|
|
|
224
241
|
const initialVisibleFields = layout.initialVisibleFields || fieldsPerRow;
|
|
225
242
|
// Update CSS grid columns dynamically
|
|
226
243
|
this.updateGridColumns(fieldsPerRow);
|
|
227
|
-
// Create
|
|
228
|
-
|
|
229
|
-
// Create Formly fields for initial visible fields - normalize the field structure
|
|
230
|
-
this.formlyFields = initialFields.map((field, index) => {
|
|
244
|
+
// Create all fields with proper hide expressions for conditional fields
|
|
245
|
+
this.allFormlyFields = this.formConfig.fields.map((field, index) => {
|
|
231
246
|
// Normalize field structure to proper Formly format
|
|
232
247
|
const placeholderValue = field.placeholder || field.props?.placeholder || field.params?.placeholder || field.props?.params?.placeholder || '';
|
|
248
|
+
const isConditionalField = index >= initialVisibleFields;
|
|
233
249
|
const formlyField = {
|
|
234
250
|
key: field.key,
|
|
235
251
|
type: field.type,
|
|
236
|
-
className: this.getFieldClassName(index, fieldsPerRow),
|
|
252
|
+
className: this.getFieldClassName(index % fieldsPerRow, fieldsPerRow),
|
|
253
|
+
hideExpression: isConditionalField ? () => !this.shouldShowAdditionalFields() : false,
|
|
237
254
|
props: {
|
|
238
255
|
// Handle mixed structure - some fields have props at root, others nested
|
|
239
256
|
placeholder: placeholderValue,
|
|
@@ -257,7 +274,7 @@ export class MessageBannerV2Component {
|
|
|
257
274
|
placeholder: placeholderValue
|
|
258
275
|
}
|
|
259
276
|
},
|
|
260
|
-
validators:
|
|
277
|
+
validators: this.getFormlyValidators(field),
|
|
261
278
|
};
|
|
262
279
|
// Set initial value if provided
|
|
263
280
|
if (field.value !== undefined) {
|
|
@@ -266,11 +283,19 @@ export class MessageBannerV2Component {
|
|
|
266
283
|
// Add form control to form group if not already present
|
|
267
284
|
const key = field.key;
|
|
268
285
|
if (!this.form.get(key)) {
|
|
269
|
-
|
|
286
|
+
let formControl;
|
|
287
|
+
if (field.formControl) {
|
|
288
|
+
formControl = field.formControl;
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
const validators = field.params?.validators || [];
|
|
292
|
+
formControl = new FormControl(field.value || '', validators);
|
|
293
|
+
}
|
|
294
|
+
this.form.addControl(key, formControl);
|
|
270
295
|
}
|
|
271
296
|
return formlyField;
|
|
272
297
|
});
|
|
273
|
-
|
|
298
|
+
this.formlyFields = this.allFormlyFields.slice(0, initialVisibleFields);
|
|
274
299
|
this.updateAdditionalFields();
|
|
275
300
|
}
|
|
276
301
|
getFieldClassName(index, fieldsPerRow) {
|
|
@@ -281,6 +306,24 @@ export class MessageBannerV2Component {
|
|
|
281
306
|
// Use CSS custom property to dynamically update grid columns
|
|
282
307
|
document.documentElement.style.setProperty('--form-grid-columns', fieldsPerRow.toString());
|
|
283
308
|
}
|
|
309
|
+
getFormlyValidators(field) {
|
|
310
|
+
const validators = {};
|
|
311
|
+
if (field.formControl && field.formControl.validator) {
|
|
312
|
+
validators.validation = field.formControl.validator;
|
|
313
|
+
}
|
|
314
|
+
if (field.params?.validators && Array.isArray(field.params.validators)) {
|
|
315
|
+
validators.validation = field.params.validators;
|
|
316
|
+
}
|
|
317
|
+
if (field.validators) {
|
|
318
|
+
if (field.validators.validation) {
|
|
319
|
+
validators.validation = field.validators.validation;
|
|
320
|
+
}
|
|
321
|
+
else if (Array.isArray(field.validators)) {
|
|
322
|
+
validators.validation = field.validators;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return validators;
|
|
326
|
+
}
|
|
284
327
|
shouldShowAdditionalFields() {
|
|
285
328
|
if (!this.activeFormInputs || this.activeFormInputs.length === 0)
|
|
286
329
|
return false;
|
|
@@ -293,7 +336,6 @@ export class MessageBannerV2Component {
|
|
|
293
336
|
// Use custom showWhen function if provided
|
|
294
337
|
const shouldShow = layout.conditionalFields.showWhen ?
|
|
295
338
|
layout.conditionalFields.showWhen(this.model) : this.areAllVisibleFieldsFilled();
|
|
296
|
-
console.log('shouldShowAdditionalFields:', shouldShow, 'model:', this.model, 'conditionalFields:', layout.conditionalFields);
|
|
297
339
|
return shouldShow;
|
|
298
340
|
}
|
|
299
341
|
updateAdditionalFields() {
|
|
@@ -376,19 +418,9 @@ export class MessageBannerV2Component {
|
|
|
376
418
|
// Handle form model changes from Formly
|
|
377
419
|
onFormModelChange(model) {
|
|
378
420
|
this.model = { ...this.model, ...model };
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
layout.conditionalFields.showWhen(this.model) : false;
|
|
383
|
-
console.log('Should show conditional fields:', shouldShow);
|
|
384
|
-
// Only update if condition changes
|
|
385
|
-
if (shouldShow && this.additionalFormlyFields.length === 0) {
|
|
386
|
-
console.log('Triggering conditional fields');
|
|
387
|
-
this.updateAdditionalFields();
|
|
388
|
-
}
|
|
389
|
-
else if (!shouldShow && this.additionalFormlyFields.length > 0) {
|
|
390
|
-
this.additionalFormlyFields = [];
|
|
391
|
-
}
|
|
421
|
+
// Trigger field visibility updates by updating the allFormlyFields array
|
|
422
|
+
// This will cause Formly to re-evaluate hideExpression for all fields
|
|
423
|
+
this.allFormlyFields = [...this.allFormlyFields];
|
|
392
424
|
// Emit the change event
|
|
393
425
|
this.onFormEvent.emit({
|
|
394
426
|
type: 'form-model-change',
|
|
@@ -406,13 +438,21 @@ export class MessageBannerV2Component {
|
|
|
406
438
|
areAllVisibleFieldsFilled() {
|
|
407
439
|
if (!this.activeFormInputs || this.activeFormInputs.length === 0)
|
|
408
440
|
return true;
|
|
409
|
-
// Get
|
|
410
|
-
const
|
|
411
|
-
const
|
|
412
|
-
//
|
|
413
|
-
const
|
|
414
|
-
|
|
415
|
-
const
|
|
441
|
+
// Get layout configuration to determine which fields should be visible
|
|
442
|
+
const layout = this.activeFormLayout;
|
|
443
|
+
const initialVisibleFields = layout.initialVisibleFields || layout.fieldsPerRow || 2;
|
|
444
|
+
// Get all currently visible fields (initial + conditional if shown)
|
|
445
|
+
const visibleFields = this.activeFormInputs.slice(0, initialVisibleFields);
|
|
446
|
+
if (this.shouldShowAdditionalFields()) {
|
|
447
|
+
const conditionalFieldIndices = layout.conditionalFields?.fields ||
|
|
448
|
+
Array.from({ length: this.activeFormInputs.length - initialVisibleFields }, (_, i) => i + initialVisibleFields);
|
|
449
|
+
const conditionalFields = conditionalFieldIndices.map(index => this.activeFormInputs[index]).filter(Boolean);
|
|
450
|
+
visibleFields.push(...conditionalFields);
|
|
451
|
+
}
|
|
452
|
+
// Check if all visible fields have values using their keys
|
|
453
|
+
const allFieldsFilled = visibleFields.every(field => {
|
|
454
|
+
const fieldKey = field.key;
|
|
455
|
+
const fieldValue = this.model[fieldKey];
|
|
416
456
|
if (!fieldValue)
|
|
417
457
|
return false;
|
|
418
458
|
// For string values, check if not empty after trim
|
|
@@ -429,11 +469,11 @@ export class MessageBannerV2Component {
|
|
|
429
469
|
return allFieldsFilled && formValid;
|
|
430
470
|
}
|
|
431
471
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MessageBannerV2Component, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
432
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: MessageBannerV2Component, isStandalone: true, selector: "sa-message-banner-v2", inputs: { messageType: "messageType", contactUrl: "contactUrl", spacingBetweenImageAndDescription: "spacingBetweenImageAndDescription", contentGap: "contentGap", titleClass: "titleClass", descriptionClass: "descriptionClass", banner: "banner", formConfig: "formConfig", prebuiltFormFields: "prebuiltFormFields", messageIcon: "messageIcon", messageIconSize: "messageIconSize", title: "title", description: "description", buttons: "buttons" }, outputs: { onFormEvent: "onFormEvent", buttonClick: "buttonClick" }, providers: [IconService], usesOnChanges: true, ngImport: i0, template: "@if (bannerContent(); as content) {\n <div class=\"error-page message-banner-v2\">\n <div class=\"content-container\" [ngStyle]=\"{ gap: contentGap || 'var(--medium-32px, 32px)' }\">\n <div class=\"image-container\"\n [ngStyle]=\"{ 'margin-bottom': spacingBetweenImageAndDescription ?? 'var(--small-16px, 16px)' }\">\n <img [src]=\"content.messageIcon\" [alt]=\"content.type + ' image'\"\n [style.--message-icon-height]=\"content.messageIconSize?.height\"\n [style.--message-icon-width]=\"content.messageIconSize?.width\" />\n </div>\n <div class=\"details\">\n <div class=\"title-description\">\n <div class=\"title-class\" [ngClass]=\"titleClass || 'title-class'\" [innerHTML]=\"content.title\"></div>\n <p class=\"description\" [ngClass]=\"descriptionClass || 'description'\" [innerHTML]=\"content.description\"></p> \n <div [ngStyle]=\"{ margin: banner?.spacing + 'px 0px' }\">\n <sa-message-banner *ngIf=\"!isEmptyObject(banner)\" [type]=\"banner?.type\" [bannerIcon]=\"banner?.bannerIcon\" [buttonIcon]=\"banner?.buttonIcon\"\n [bannerIconSize]=\"banner?.bannerIconSize\" [buttonType]=\"banner?.buttonType\" [buttonSize]=\"banner?.buttonSize\" [buttonIconPosition]=\"banner?.buttonIconPosition\"\n [buttonIconSize]=\"banner?.buttonIconSize\" [actionText]=\"banner?.actionText\" >\n <div [innerHTML]=\"banner?.text\"></div>\n </sa-message-banner>\n </div>\n </div>\n \n <!-- Form inputs section -->\n <ng-container *ngIf=\"prebuiltFormFields || activeFormInputs?.length\">\n <div class=\"form-fields-container\">\n <div class=\"form-fields-scroll-area\">\n <!-- Prebuilt form fields (direct component rendering) -->\n <ng-container *ngIf=\"usePrebuiltFields() && prebuiltFormFields\">\n <ng-container *ngTemplateOutlet=\"prebuiltFormFields\"></ng-container>\n </ng-container>\n \n <!-- Use Formly for proper form rendering -->\n <form [formGroup]=\"form\" class=\"dialog-form\" *ngIf=\"!usePrebuiltFields() && activeFormInputs?.length\">\n <formly-form \n [form]=\"form\" \n [fields]=\"formlyFields\" \n [model]=\"model\"\n (modelChange)=\"onFormModelChange($event)\">\n </formly-form>\n \n <!-- Additional fields (conditional based on formLayout.conditionalFields) -->\n <div class=\"additional-fields\" *ngIf=\"shouldShowAdditionalFields()\">\n <formly-form \n [form]=\"form\" \n [fields]=\"additionalFormlyFields\" \n [model]=\"model\"\n (modelChange)=\"onFormModelChange($event)\">\n </formly-form>\n </div>\n </form>\n </div>\n </div>\n\n <!-- Custom form button(s) -->\n <div class=\"form-button-container\" *ngIf=\"activeCustomFormButton && !usePrebuiltFields()\">\n <!-- Support both single button and array of buttons -->\n <ng-container *ngIf=\"isButtonArray(); else singleButton\">\n <sa-button \n *ngFor=\"let button of activeCustomFormButton\"\n class=\"action-button\"\n [id]=\"button.id\"\n [text]=\"button.text\"\n [type]=\"button.type\"\n [size]=\"button.size\"\n [state]=\"button.state\"\n [ImagePath]=\"button.ImagePath\"\n [iconPosition]=\"button.iconPosition\"\n (click)=\"onButtonClick(button)\">\n </sa-button>\n </ng-container>\n \n <ng-template #singleButton>\n <sa-button class=\"action-button\"\n [id]=\"activeCustomFormButton.id\"\n [text]=\"activeCustomFormButton.text\"\n [type]=\"activeCustomFormButton.type\"\n [size]=\"activeCustomFormButton.size\"\n [state]=\"activeCustomFormButton.state\"\n [ImagePath]=\"activeCustomFormButton.ImagePath\"\n [iconPosition]=\"activeCustomFormButton.iconPosition\"\n (click)=\"onButtonClick(activeCustomFormButton)\">\n </sa-button>\n </ng-template>\n </div>\n \n <!-- Divider section -->\n <div class=\"divider-section\" *ngIf=\"activeDivider && !usePrebuiltFields()\">\n <div class=\"divider\"></div>\n <div class=\"divider-header\">\n <h3 class=\"divider-title\" *ngIf=\"activeDividerConfig.title\">{{ activeDividerConfig.title }}</h3>\n <p class=\"divider-subtitle\" *ngIf=\"activeDividerConfig.subtitle || activeDividerConfig.showSubtitleWhenEmpty\">\n {{ activeDividerConfig.subtitle || 'No items added yet' }}\n </p>\n </div>\n \n <!-- Chips section -->\n <div class=\"chip-list\" *ngIf=\"activeChips?.length && !usePrebuiltFields()\">\n <sa-chip \n *ngFor=\"let chip of activeChips\"\n [text]=\"chip.label || chip.text || chip\"\n [type]=\"'regular'\"\n [state]=\"'default'\"\n [filling]=\"'filled'\"\n [iconPosition]=\"'right'\"\n [iconPath]=\"'../assets/closeBlueOutlined.svg'\"\n (onClickEvent)=\"chip.removable ? onChipRemove(chip) : null\">\n </sa-chip>\n </div>\n </div>\n </ng-container>\n \n @if(buttons){\n <div class=\"button-group\">\n @for (button of buttons; track button.text) {\n <sa-button \n [text]=\"button.text\"\n [icon]=\"button.icon\"\n [size]=\"button.size\"\n [type]=\"button.type\"\n [iconPosition]=\"button.iconPosition\"\n [buttonIconSize]=\"button.buttonIconSize\"\n (onClickEvent)=\"onButtonClick(button, $event)\"\n role=\"button\"\n [state]=\"!areAllVisibleFieldsFilled() ? 'disabled' : ''\"\n [attr.aria-label]=\"button.text\">\n </sa-button>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }", styles: [".error-page{display:flex;justify-content:center;align-items:center;box-sizing:border-box}.title-class{color:var(--text-highemphasis, #1C1B20);text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--small-16px, 16px);font-style:normal;font-weight:600;line-height:1.5rem;letter-spacing:.15px}.content-container{display:flex;flex-direction:column;align-items:center;gap:var(--medium-32px, 32px);text-align:center}.image-container{display:flex;justify-content:center;align-items:center;margin-bottom:var(--small-16px, 16px)}.image-container img{height:var(--message-icon-height, 12.5rem);width:var(--message-icon-width, auto)}.details{display:flex;flex-direction:column;align-items:center;gap:var(--medium-20px, 20px);text-align:center;background-color:var(--structural-white, #FFF)}::ng-deep .description .support-email{color:var(--primary-500);font-family:var(--font-roboto, Roboto);font-size:14px;font-style:normal;font-weight:500;line-height:1.25rem;letter-spacing:.1px}.description{color:var(--Text-Medium-Emphasis, #6D6979);text-align:center;font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px;margin:0}.message-banner-v2 .button-group{display:flex;gap:var(--small-8px);justify-content:center}::ng-deep .custom-contact-link{color:var(--primary-500, #7F56D9);font-family:var(--font-roboto, Roboto);font-size:var(--small-16px, 16px);font-style:normal;font-weight:600;line-height:var(--medium-24px);letter-spacing:.15px;text-decoration:none}.access-restricted-title{color:var(--text-highemphasis, #1C1B20);text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--medium-22px);font-style:normal;font-weight:500;line-height:var(--medium-28px);margin-bottom:var(--small-10px)}.access-restricted-description{text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--small-16px, 16px);line-height:var(--medium-24px);max-width:44rem;white-space:normal;word-break:break-word}.access-error-title{color:var(--semantic-error-500, #BD271E);text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--medium-22px);font-style:normal;font-weight:500;line-height:var(--medium-28px);margin-bottom:var(--small-10px)}.redirect-link{display:flex;align-items:center;gap:8px;cursor:pointer}.info-icon{width:16px;height:16px;color:var(--primary-500, #825CEE)}.learn-more-text{font-size:14px;color:var(--primary-500, #825CEE);text-decoration:none}.redirect-link:hover .learn-more-text{text-decoration:underline}.additional-fields{display:flex;gap:16px;width:100%}.form-button-container{display:flex;justify-content:flex-end;align-items:center;align-self:stretch}::ng-deep .form-button-container .action-button .sa-button{align-self:flex-start;display:flex;justify-content:center;align-items:center;gap:var(--small-3px, 3px);align-self:stretch}.divider-section{flex:0 0 auto;margin-top:32px;width:100%}.divider{width:100%;height:1px;background:var(--grey-200, #E4E7EC);margin-bottom:24px}.divider-header{margin-bottom:16px}.divider-title{font-size:16px;font-weight:600;color:var(--text-high-emphasis, #1C1B20);margin:0 0 8px;font-family:var(--font-family, Roboto)}.divider-subtitle{font-size:14px;font-weight:400;color:var(--text-medium-emphasis, #6D6979);margin:0;font-style:italic;font-family:var(--font-family, Roboto)}.chip-list{display:flex;flex-wrap:wrap;gap:8px}.dialog-form{width:100%;display:block}.form-fields-container{min-height:0;flex:0 0 auto;width:100%;position:relative;z-index:1;overflow:visible}.dialog-form .form-row{display:flex;gap:16px;margin-bottom:16px;width:100%}.dialog-form .form-field-wrapper{flex:1;display:flex;flex-direction:column;gap:4px}.dialog-form .form-field-wrapper.full-width{flex:1 1 100%}.dialog-form .additional-fields{display:flex;flex-direction:column;gap:16px;width:100%}::ng-deep .dialog-form formly-form{width:100%;display:block}::ng-deep .dialog-form formly-group{width:100%;display:grid;grid-template-columns:repeat(var(--form-grid-columns, 2),1fr);gap:16px;margin:0;padding:0;grid-auto-rows:min-content}::ng-deep .dialog-form formly-field>formly-group{display:grid;grid-template-columns:repeat(var(--form-grid-columns, 2),1fr);gap:16px;width:100%}::ng-deep .dialog-form formly-field{width:100%;display:block}::ng-deep .dialog-form .col-6{width:100%;display:block}::ng-deep .dialog-form .col-12{width:100%;display:block;grid-column:span 2}::ng-deep .additional-fields formly-form{width:100%;display:block}::ng-deep .dialog-form lib-form-select{width:100%}::ng-deep .dialog-form .sa-select-container{width:100%;display:flex;flex-direction:column}::ng-deep .dialog-form .sa-select-field-container{width:100%;position:relative}::ng-deep .dialog-form .ng-select{min-height:44px;border-radius:4px;padding:unset;border:1px solid var(--Grey-100, #EAECF0);background:var(--Structural-White, #FFF)}::ng-deep .dialog-form .sa-select-container .sa-select-field-container .ng-select-field{padding:unset;border:none}::ng-deep .dialog-form .ng-select.ng-select-focused{border-color:var(--primary-500, #825CEE);box-shadow:0 0 0 3px #825cee1a}::ng-deep .dialog-form .ng-select .ng-select-container{min-height:44px;padding:12px 16px}.form-fields-scroll-wrapper{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ButtonComponent, selector: "sa-button", inputs: ["id", "type", "state", "size", "text", "ImagePath", "icon", "iconPosition", "href", "hrefTarget", "width", "isSubmit", "buttonIconSize", "showSpinner"], outputs: ["onClickEvent", "onMouseInEvent", "onMouseOutEvent"] }, { kind: "ngmodule", type: HttpClientModule }, { kind: "component", type: MessageBannerComponent, selector: "sa-message-banner", inputs: ["type", "actionText", "content", "bannerIcon", "bannerIconSize", "buttonIcon", "buttonType", "buttonIconPosition", "buttonSize", "buttonIconSize", "button", "onAction"], outputs: ["actionClick"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i3.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "component", type: ChipsComponent, selector: "sa-chip", inputs: ["id", "iconPath", "text", "type", "state", "filling", "iconPosition", "largeStateIcon", "largeStateText", "tooltip", "className"], outputs: ["onClickEvent"] }] }); }
|
|
472
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: MessageBannerV2Component, isStandalone: true, selector: "sa-message-banner-v2", inputs: { messageType: "messageType", contactUrl: "contactUrl", spacingBetweenImageAndDescription: "spacingBetweenImageAndDescription", contentGap: "contentGap", titleClass: "titleClass", descriptionClass: "descriptionClass", banner: "banner", formConfig: "formConfig", prebuiltFormFields: "prebuiltFormFields", messageIcon: "messageIcon", messageIconSize: "messageIconSize", title: "title", description: "description", buttons: "buttons" }, outputs: { onFormEvent: "onFormEvent", buttonClick: "buttonClick" }, providers: [IconService], usesOnChanges: true, ngImport: i0, template: "@if (bannerContent(); as content) {\r\n <div class=\"error-page message-banner-v2\">\r\n <div class=\"content-container\" [ngStyle]=\"{ gap: contentGap || 'var(--medium-32px, 32px)' }\">\r\n <div class=\"image-container\"\r\n [ngStyle]=\"{ 'margin-bottom': spacingBetweenImageAndDescription ?? 'var(--small-16px, 16px)' }\">\r\n <img [src]=\"content.messageIcon\" [alt]=\"content.type + ' image'\"\r\n [style.--message-icon-height]=\"content.messageIconSize?.height\"\r\n [style.--message-icon-width]=\"content.messageIconSize?.width\" />\r\n </div>\r\n <div class=\"details\">\r\n <div class=\"title-description\">\r\n <div class=\"title-class\" [ngClass]=\"titleClass || 'title-class'\" [innerHTML]=\"content.title\"></div>\r\n <p class=\"description\" [ngClass]=\"descriptionClass || 'description'\" [innerHTML]=\"content.description\"></p> \r\n <div [ngStyle]=\"{ margin: banner?.spacing + 'px 0px' }\">\r\n <sa-message-banner *ngIf=\"!isEmptyObject(banner)\" [type]=\"banner?.type\" [bannerIcon]=\"banner?.bannerIcon\" [buttonIcon]=\"banner?.buttonIcon\"\r\n [bannerIconSize]=\"banner?.bannerIconSize\" [buttonType]=\"banner?.buttonType\" [buttonSize]=\"banner?.buttonSize\" [buttonIconPosition]=\"banner?.buttonIconPosition\"\r\n [buttonIconSize]=\"banner?.buttonIconSize\" [actionText]=\"banner?.actionText\" >\r\n <div [innerHTML]=\"banner?.text\"></div>\r\n </sa-message-banner>\r\n </div>\r\n </div>\r\n \r\n <!-- Form inputs section -->\r\n <ng-container *ngIf=\"prebuiltFormFields || activeFormInputs?.length\">\r\n <div class=\"form-fields-container\">\r\n <!-- Prebuilt form fields (direct component rendering) -->\r\n <ng-container *ngIf=\"usePrebuiltFields() && prebuiltFormFields\">\r\n <ng-container *ngTemplateOutlet=\"prebuiltFormFields\"></ng-container>\r\n </ng-container>\r\n \r\n <!-- Use Formly for proper form rendering -->\r\n <form [formGroup]=\"form\" class=\"dialog-form\" *ngIf=\"!usePrebuiltFields() && activeFormInputs?.length\">\r\n <formly-form \r\n [form]=\"form\" \r\n [fields]=\"allFormlyFields\" \r\n [model]=\"model\"\r\n (modelChange)=\"onFormModelChange($event)\">\r\n </formly-form>\r\n </form>\r\n </div>\r\n\r\n <!-- Custom form button(s) -->\r\n <div class=\"form-button-container\" *ngIf=\"activeCustomFormButton && !usePrebuiltFields()\">\r\n <!-- Support both single button and array of buttons -->\r\n <ng-container *ngIf=\"isButtonArray(); else singleButton\">\r\n <sa-button \r\n *ngFor=\"let button of activeCustomFormButton\"\r\n class=\"action-button\"\r\n [id]=\"button.id\"\r\n [text]=\"button.text\"\r\n [type]=\"button.type\"\r\n [size]=\"button.size\"\r\n [state]=\"button.state\"\r\n [ImagePath]=\"button.ImagePath\"\r\n [iconPosition]=\"button.iconPosition\"\r\n (click)=\"onButtonClick(button)\">\r\n </sa-button>\r\n </ng-container>\r\n \r\n <ng-template #singleButton>\r\n <sa-button class=\"action-button\"\r\n [id]=\"activeCustomFormButton.id\"\r\n [text]=\"activeCustomFormButton.text\"\r\n [type]=\"activeCustomFormButton.type\"\r\n [size]=\"activeCustomFormButton.size\"\r\n [state]=\"activeCustomFormButton.state\"\r\n [ImagePath]=\"activeCustomFormButton.ImagePath\"\r\n [iconPosition]=\"activeCustomFormButton.iconPosition\"\r\n (click)=\"onButtonClick(activeCustomFormButton)\">\r\n </sa-button>\r\n </ng-template>\r\n </div>\r\n \r\n <!-- Divider section -->\r\n <div class=\"divider-section\" *ngIf=\"activeDivider && !usePrebuiltFields()\">\r\n <div class=\"divider\"></div>\r\n <div class=\"divider-header\">\r\n <h3 class=\"divider-title\" *ngIf=\"activeDividerConfig.title\">{{ activeDividerConfig.title }}</h3>\r\n <p class=\"divider-subtitle\" *ngIf=\"activeDividerConfig.subtitle || activeDividerConfig.showSubtitleWhenEmpty\">\r\n {{ activeDividerConfig.subtitle || 'No items added yet' }}\r\n </p>\r\n </div>\r\n \r\n <!-- Chips section -->\r\n <div class=\"chip-list\" *ngIf=\"activeChips?.length && !usePrebuiltFields()\">\r\n <sa-chip \r\n *ngFor=\"let chip of activeChips\"\r\n [text]=\"chip.label || chip.text || chip\"\r\n [type]=\"'regular'\"\r\n [state]=\"'default'\"\r\n [filling]=\"'filled'\"\r\n [iconPosition]=\"'right'\"\r\n [iconPath]=\"'../assets/closeBlueOutlined.svg'\"\r\n (onClickEvent)=\"chip.removable ? onChipRemove(chip) : null\">\r\n </sa-chip>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n @if(buttons){\r\n <div class=\"button-group\">\r\n @for (button of buttons; track button.text) {\r\n <sa-button \r\n [text]=\"button.text\"\r\n [icon]=\"button.icon\"\r\n [size]=\"button.size\"\r\n [type]=\"button.type\"\r\n [iconPosition]=\"button.iconPosition\"\r\n [buttonIconSize]=\"button.buttonIconSize\"\r\n (onClickEvent)=\"onButtonClick(button, $event)\"\r\n role=\"button\"\r\n [state]=\"!areAllVisibleFieldsFilled() ? 'disabled' : ''\"\r\n [attr.aria-label]=\"button.text\">\r\n </sa-button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }", styles: [".error-page{display:flex;justify-content:center;align-items:center;box-sizing:border-box}.title-class{color:var(--text-highemphasis, #1C1B20);text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--small-16px, 16px);font-style:normal;font-weight:600;line-height:1.5rem;letter-spacing:.15px}.content-container{display:flex;flex-direction:column;align-items:center;gap:var(--medium-32px, 32px);text-align:center}.image-container{display:flex;justify-content:center;align-items:center;margin-bottom:var(--small-16px, 16px)}.image-container img{height:var(--message-icon-height, 12.5rem);width:var(--message-icon-width, auto)}.details{display:flex;flex-direction:column;align-items:center;gap:var(--medium-20px, 20px);text-align:center;background-color:var(--structural-white, #FFF)}::ng-deep .description .support-email{color:var(--primary-500);font-family:var(--font-roboto, Roboto);font-size:14px;font-style:normal;font-weight:500;line-height:1.25rem;letter-spacing:.1px}.description{color:var(--Text-Medium-Emphasis, #6D6979);text-align:center;font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px;margin:0}.message-banner-v2 .button-group{display:flex;gap:var(--small-8px);justify-content:center}::ng-deep .custom-contact-link{color:var(--primary-500, #7F56D9);font-family:var(--font-roboto, Roboto);font-size:var(--small-16px, 16px);font-style:normal;font-weight:600;line-height:var(--medium-24px);letter-spacing:.15px;text-decoration:none}.access-restricted-title{color:var(--text-highemphasis, #1C1B20);text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--medium-22px);font-style:normal;font-weight:500;line-height:var(--medium-28px);margin-bottom:var(--small-10px)}.access-restricted-description{text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--small-16px, 16px);line-height:var(--medium-24px);max-width:44rem;white-space:normal;word-break:break-word}.access-error-title{color:var(--semantic-error-500, #BD271E);text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--medium-22px);font-style:normal;font-weight:500;line-height:var(--medium-28px);margin-bottom:var(--small-10px)}.redirect-link{display:flex;align-items:center;gap:8px;cursor:pointer}.info-icon{width:16px;height:16px;color:var(--primary-500, #825CEE)}.learn-more-text{font-size:14px;color:var(--primary-500, #825CEE);text-decoration:none}.redirect-link:hover .learn-more-text{text-decoration:underline}.additional-fields{display:flex;gap:16px;width:100%}.form-button-container{display:flex;justify-content:flex-end;align-items:center;align-self:stretch}::ng-deep .form-button-container .action-button .sa-button{align-self:flex-start;display:flex;justify-content:center;align-items:center;gap:var(--small-3px, 3px);align-self:stretch}.divider-section{flex:0 0 auto;margin-top:32px;width:100%}.divider{width:100%;height:1px;background:var(--grey-200, #E4E7EC);margin-bottom:24px}.divider-header{margin-bottom:16px}.divider-title{font-size:16px;font-weight:600;color:var(--text-high-emphasis, #1C1B20);margin:0 0 8px;font-family:var(--font-family, Roboto)}.divider-subtitle{font-size:14px;font-weight:400;color:var(--text-medium-emphasis, #6D6979);margin:0;font-style:italic;font-family:var(--font-family, Roboto)}.chip-list{display:flex;flex-wrap:wrap;gap:8px}.dialog-form{width:100%;display:block}.form-fields-container{min-height:0;flex:0 0 auto;width:100%;position:relative;z-index:1;overflow:visible}.dialog-form .form-row{display:flex;gap:16px;margin-bottom:16px;width:100%}.dialog-form .form-field-wrapper{flex:1;display:flex;flex-direction:column;gap:4px}.dialog-form .form-field-wrapper.full-width{flex:1 1 100%}.dialog-form .additional-fields{display:flex;flex-direction:column;gap:16px;width:100%}::ng-deep .dialog-form formly-form{width:100%;display:block}::ng-deep .dialog-form formly-group{width:100%;display:grid;grid-template-columns:repeat(var(--form-grid-columns, 2),1fr);gap:16px;margin:0;padding:0;grid-auto-rows:min-content}::ng-deep .dialog-form formly-field>formly-group{display:grid;grid-template-columns:repeat(var(--form-grid-columns, 2),1fr);gap:16px;width:100%}::ng-deep .dialog-form formly-field{width:100%;display:block}::ng-deep .dialog-form .col-6{width:100%;display:block}::ng-deep .dialog-form .col-12{width:100%;display:block;grid-column:span 2}::ng-deep .additional-fields formly-form{width:100%;display:block}::ng-deep .dialog-form lib-form-select{width:100%}::ng-deep .dialog-form .sa-select-container{width:100%;display:flex;flex-direction:column}::ng-deep .dialog-form .sa-select-field-container{width:100%;position:relative}::ng-deep .dialog-form .ng-select{min-height:44px;border-radius:4px;padding:unset;border:1px solid var(--Grey-100, #EAECF0);background:var(--Structural-White, #FFF)}::ng-deep .dialog-form .sa-select-container .sa-select-field-container .ng-select-field{padding:unset;border:none}::ng-deep .dialog-form .ng-select.ng-select-focused{border-color:var(--primary-500, #825CEE);box-shadow:0 0 0 3px #825cee1a}::ng-deep .dialog-form .ng-select .ng-select-container{min-height:44px;padding:12px 16px}.form-fields-scroll-wrapper{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ButtonComponent, selector: "sa-button", inputs: ["id", "type", "state", "size", "text", "ImagePath", "icon", "iconPosition", "href", "hrefTarget", "width", "isSubmit", "buttonIconSize", "showSpinner"], outputs: ["onClickEvent", "onMouseInEvent", "onMouseOutEvent"] }, { kind: "ngmodule", type: HttpClientModule }, { kind: "component", type: MessageBannerComponent, selector: "sa-message-banner", inputs: ["type", "actionText", "content", "bannerIcon", "bannerIconSize", "buttonIcon", "buttonType", "buttonIconPosition", "buttonSize", "buttonIconSize", "button", "onAction"], outputs: ["actionClick"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i3.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "component", type: ChipsComponent, selector: "sa-chip", inputs: ["id", "iconPath", "text", "type", "state", "filling", "iconPosition", "largeStateIcon", "largeStateText", "tooltip", "className"], outputs: ["onClickEvent"] }] }); }
|
|
433
473
|
}
|
|
434
474
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MessageBannerV2Component, decorators: [{
|
|
435
475
|
type: Component,
|
|
436
|
-
args: [{ selector: 'sa-message-banner-v2', standalone: true, imports: [CommonModule, IconComponent, ButtonComponent, HttpClientModule, MessageBannerComponent, FormInputComponent, FormSelectComponent, FormsModule, ReactiveFormsModule, FormlyModule, ChipsComponent], providers: [IconService], template: "@if (bannerContent(); as content) {\n <div class=\"error-page message-banner-v2\">\n <div class=\"content-container\" [ngStyle]=\"{ gap: contentGap || 'var(--medium-32px, 32px)' }\">\n <div class=\"image-container\"\n [ngStyle]=\"{ 'margin-bottom': spacingBetweenImageAndDescription ?? 'var(--small-16px, 16px)' }\">\n <img [src]=\"content.messageIcon\" [alt]=\"content.type + ' image'\"\n [style.--message-icon-height]=\"content.messageIconSize?.height\"\n [style.--message-icon-width]=\"content.messageIconSize?.width\" />\n </div>\n <div class=\"details\">\n <div class=\"title-description\">\n <div class=\"title-class\" [ngClass]=\"titleClass || 'title-class'\" [innerHTML]=\"content.title\"></div>\n <p class=\"description\" [ngClass]=\"descriptionClass || 'description'\" [innerHTML]=\"content.description\"></p> \n <div [ngStyle]=\"{ margin: banner?.spacing + 'px 0px' }\">\n <sa-message-banner *ngIf=\"!isEmptyObject(banner)\" [type]=\"banner?.type\" [bannerIcon]=\"banner?.bannerIcon\" [buttonIcon]=\"banner?.buttonIcon\"\n [bannerIconSize]=\"banner?.bannerIconSize\" [buttonType]=\"banner?.buttonType\" [buttonSize]=\"banner?.buttonSize\" [buttonIconPosition]=\"banner?.buttonIconPosition\"\n [buttonIconSize]=\"banner?.buttonIconSize\" [actionText]=\"banner?.actionText\" >\n <div [innerHTML]=\"banner?.text\"></div>\n </sa-message-banner>\n </div>\n </div>\n \n <!-- Form inputs section -->\n <ng-container *ngIf=\"prebuiltFormFields || activeFormInputs?.length\">\n <div class=\"form-fields-container\">\n <div class=\"form-fields-scroll-area\">\n <!-- Prebuilt form fields (direct component rendering) -->\n <ng-container *ngIf=\"usePrebuiltFields() && prebuiltFormFields\">\n <ng-container *ngTemplateOutlet=\"prebuiltFormFields\"></ng-container>\n </ng-container>\n \n <!-- Use Formly for proper form rendering -->\n <form [formGroup]=\"form\" class=\"dialog-form\" *ngIf=\"!usePrebuiltFields() && activeFormInputs?.length\">\n <formly-form \n [form]=\"form\" \n [fields]=\"formlyFields\" \n [model]=\"model\"\n (modelChange)=\"onFormModelChange($event)\">\n </formly-form>\n \n <!-- Additional fields (conditional based on formLayout.conditionalFields) -->\n <div class=\"additional-fields\" *ngIf=\"shouldShowAdditionalFields()\">\n <formly-form \n [form]=\"form\" \n [fields]=\"additionalFormlyFields\" \n [model]=\"model\"\n (modelChange)=\"onFormModelChange($event)\">\n </formly-form>\n </div>\n </form>\n </div>\n </div>\n\n <!-- Custom form button(s) -->\n <div class=\"form-button-container\" *ngIf=\"activeCustomFormButton && !usePrebuiltFields()\">\n <!-- Support both single button and array of buttons -->\n <ng-container *ngIf=\"isButtonArray(); else singleButton\">\n <sa-button \n *ngFor=\"let button of activeCustomFormButton\"\n class=\"action-button\"\n [id]=\"button.id\"\n [text]=\"button.text\"\n [type]=\"button.type\"\n [size]=\"button.size\"\n [state]=\"button.state\"\n [ImagePath]=\"button.ImagePath\"\n [iconPosition]=\"button.iconPosition\"\n (click)=\"onButtonClick(button)\">\n </sa-button>\n </ng-container>\n \n <ng-template #singleButton>\n <sa-button class=\"action-button\"\n [id]=\"activeCustomFormButton.id\"\n [text]=\"activeCustomFormButton.text\"\n [type]=\"activeCustomFormButton.type\"\n [size]=\"activeCustomFormButton.size\"\n [state]=\"activeCustomFormButton.state\"\n [ImagePath]=\"activeCustomFormButton.ImagePath\"\n [iconPosition]=\"activeCustomFormButton.iconPosition\"\n (click)=\"onButtonClick(activeCustomFormButton)\">\n </sa-button>\n </ng-template>\n </div>\n \n <!-- Divider section -->\n <div class=\"divider-section\" *ngIf=\"activeDivider && !usePrebuiltFields()\">\n <div class=\"divider\"></div>\n <div class=\"divider-header\">\n <h3 class=\"divider-title\" *ngIf=\"activeDividerConfig.title\">{{ activeDividerConfig.title }}</h3>\n <p class=\"divider-subtitle\" *ngIf=\"activeDividerConfig.subtitle || activeDividerConfig.showSubtitleWhenEmpty\">\n {{ activeDividerConfig.subtitle || 'No items added yet' }}\n </p>\n </div>\n \n <!-- Chips section -->\n <div class=\"chip-list\" *ngIf=\"activeChips?.length && !usePrebuiltFields()\">\n <sa-chip \n *ngFor=\"let chip of activeChips\"\n [text]=\"chip.label || chip.text || chip\"\n [type]=\"'regular'\"\n [state]=\"'default'\"\n [filling]=\"'filled'\"\n [iconPosition]=\"'right'\"\n [iconPath]=\"'../assets/closeBlueOutlined.svg'\"\n (onClickEvent)=\"chip.removable ? onChipRemove(chip) : null\">\n </sa-chip>\n </div>\n </div>\n </ng-container>\n \n @if(buttons){\n <div class=\"button-group\">\n @for (button of buttons; track button.text) {\n <sa-button \n [text]=\"button.text\"\n [icon]=\"button.icon\"\n [size]=\"button.size\"\n [type]=\"button.type\"\n [iconPosition]=\"button.iconPosition\"\n [buttonIconSize]=\"button.buttonIconSize\"\n (onClickEvent)=\"onButtonClick(button, $event)\"\n role=\"button\"\n [state]=\"!areAllVisibleFieldsFilled() ? 'disabled' : ''\"\n [attr.aria-label]=\"button.text\">\n </sa-button>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }", styles: [".error-page{display:flex;justify-content:center;align-items:center;box-sizing:border-box}.title-class{color:var(--text-highemphasis, #1C1B20);text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--small-16px, 16px);font-style:normal;font-weight:600;line-height:1.5rem;letter-spacing:.15px}.content-container{display:flex;flex-direction:column;align-items:center;gap:var(--medium-32px, 32px);text-align:center}.image-container{display:flex;justify-content:center;align-items:center;margin-bottom:var(--small-16px, 16px)}.image-container img{height:var(--message-icon-height, 12.5rem);width:var(--message-icon-width, auto)}.details{display:flex;flex-direction:column;align-items:center;gap:var(--medium-20px, 20px);text-align:center;background-color:var(--structural-white, #FFF)}::ng-deep .description .support-email{color:var(--primary-500);font-family:var(--font-roboto, Roboto);font-size:14px;font-style:normal;font-weight:500;line-height:1.25rem;letter-spacing:.1px}.description{color:var(--Text-Medium-Emphasis, #6D6979);text-align:center;font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px;margin:0}.message-banner-v2 .button-group{display:flex;gap:var(--small-8px);justify-content:center}::ng-deep .custom-contact-link{color:var(--primary-500, #7F56D9);font-family:var(--font-roboto, Roboto);font-size:var(--small-16px, 16px);font-style:normal;font-weight:600;line-height:var(--medium-24px);letter-spacing:.15px;text-decoration:none}.access-restricted-title{color:var(--text-highemphasis, #1C1B20);text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--medium-22px);font-style:normal;font-weight:500;line-height:var(--medium-28px);margin-bottom:var(--small-10px)}.access-restricted-description{text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--small-16px, 16px);line-height:var(--medium-24px);max-width:44rem;white-space:normal;word-break:break-word}.access-error-title{color:var(--semantic-error-500, #BD271E);text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--medium-22px);font-style:normal;font-weight:500;line-height:var(--medium-28px);margin-bottom:var(--small-10px)}.redirect-link{display:flex;align-items:center;gap:8px;cursor:pointer}.info-icon{width:16px;height:16px;color:var(--primary-500, #825CEE)}.learn-more-text{font-size:14px;color:var(--primary-500, #825CEE);text-decoration:none}.redirect-link:hover .learn-more-text{text-decoration:underline}.additional-fields{display:flex;gap:16px;width:100%}.form-button-container{display:flex;justify-content:flex-end;align-items:center;align-self:stretch}::ng-deep .form-button-container .action-button .sa-button{align-self:flex-start;display:flex;justify-content:center;align-items:center;gap:var(--small-3px, 3px);align-self:stretch}.divider-section{flex:0 0 auto;margin-top:32px;width:100%}.divider{width:100%;height:1px;background:var(--grey-200, #E4E7EC);margin-bottom:24px}.divider-header{margin-bottom:16px}.divider-title{font-size:16px;font-weight:600;color:var(--text-high-emphasis, #1C1B20);margin:0 0 8px;font-family:var(--font-family, Roboto)}.divider-subtitle{font-size:14px;font-weight:400;color:var(--text-medium-emphasis, #6D6979);margin:0;font-style:italic;font-family:var(--font-family, Roboto)}.chip-list{display:flex;flex-wrap:wrap;gap:8px}.dialog-form{width:100%;display:block}.form-fields-container{min-height:0;flex:0 0 auto;width:100%;position:relative;z-index:1;overflow:visible}.dialog-form .form-row{display:flex;gap:16px;margin-bottom:16px;width:100%}.dialog-form .form-field-wrapper{flex:1;display:flex;flex-direction:column;gap:4px}.dialog-form .form-field-wrapper.full-width{flex:1 1 100%}.dialog-form .additional-fields{display:flex;flex-direction:column;gap:16px;width:100%}::ng-deep .dialog-form formly-form{width:100%;display:block}::ng-deep .dialog-form formly-group{width:100%;display:grid;grid-template-columns:repeat(var(--form-grid-columns, 2),1fr);gap:16px;margin:0;padding:0;grid-auto-rows:min-content}::ng-deep .dialog-form formly-field>formly-group{display:grid;grid-template-columns:repeat(var(--form-grid-columns, 2),1fr);gap:16px;width:100%}::ng-deep .dialog-form formly-field{width:100%;display:block}::ng-deep .dialog-form .col-6{width:100%;display:block}::ng-deep .dialog-form .col-12{width:100%;display:block;grid-column:span 2}::ng-deep .additional-fields formly-form{width:100%;display:block}::ng-deep .dialog-form lib-form-select{width:100%}::ng-deep .dialog-form .sa-select-container{width:100%;display:flex;flex-direction:column}::ng-deep .dialog-form .sa-select-field-container{width:100%;position:relative}::ng-deep .dialog-form .ng-select{min-height:44px;border-radius:4px;padding:unset;border:1px solid var(--Grey-100, #EAECF0);background:var(--Structural-White, #FFF)}::ng-deep .dialog-form .sa-select-container .sa-select-field-container .ng-select-field{padding:unset;border:none}::ng-deep .dialog-form .ng-select.ng-select-focused{border-color:var(--primary-500, #825CEE);box-shadow:0 0 0 3px #825cee1a}::ng-deep .dialog-form .ng-select .ng-select-container{min-height:44px;padding:12px 16px}.form-fields-scroll-wrapper{width:100%}\n"] }]
|
|
476
|
+
args: [{ selector: 'sa-message-banner-v2', standalone: true, imports: [CommonModule, IconComponent, ButtonComponent, HttpClientModule, MessageBannerComponent, FormInputComponent, FormSelectComponent, FormsModule, ReactiveFormsModule, FormlyModule, ChipsComponent], providers: [IconService], template: "@if (bannerContent(); as content) {\r\n <div class=\"error-page message-banner-v2\">\r\n <div class=\"content-container\" [ngStyle]=\"{ gap: contentGap || 'var(--medium-32px, 32px)' }\">\r\n <div class=\"image-container\"\r\n [ngStyle]=\"{ 'margin-bottom': spacingBetweenImageAndDescription ?? 'var(--small-16px, 16px)' }\">\r\n <img [src]=\"content.messageIcon\" [alt]=\"content.type + ' image'\"\r\n [style.--message-icon-height]=\"content.messageIconSize?.height\"\r\n [style.--message-icon-width]=\"content.messageIconSize?.width\" />\r\n </div>\r\n <div class=\"details\">\r\n <div class=\"title-description\">\r\n <div class=\"title-class\" [ngClass]=\"titleClass || 'title-class'\" [innerHTML]=\"content.title\"></div>\r\n <p class=\"description\" [ngClass]=\"descriptionClass || 'description'\" [innerHTML]=\"content.description\"></p> \r\n <div [ngStyle]=\"{ margin: banner?.spacing + 'px 0px' }\">\r\n <sa-message-banner *ngIf=\"!isEmptyObject(banner)\" [type]=\"banner?.type\" [bannerIcon]=\"banner?.bannerIcon\" [buttonIcon]=\"banner?.buttonIcon\"\r\n [bannerIconSize]=\"banner?.bannerIconSize\" [buttonType]=\"banner?.buttonType\" [buttonSize]=\"banner?.buttonSize\" [buttonIconPosition]=\"banner?.buttonIconPosition\"\r\n [buttonIconSize]=\"banner?.buttonIconSize\" [actionText]=\"banner?.actionText\" >\r\n <div [innerHTML]=\"banner?.text\"></div>\r\n </sa-message-banner>\r\n </div>\r\n </div>\r\n \r\n <!-- Form inputs section -->\r\n <ng-container *ngIf=\"prebuiltFormFields || activeFormInputs?.length\">\r\n <div class=\"form-fields-container\">\r\n <!-- Prebuilt form fields (direct component rendering) -->\r\n <ng-container *ngIf=\"usePrebuiltFields() && prebuiltFormFields\">\r\n <ng-container *ngTemplateOutlet=\"prebuiltFormFields\"></ng-container>\r\n </ng-container>\r\n \r\n <!-- Use Formly for proper form rendering -->\r\n <form [formGroup]=\"form\" class=\"dialog-form\" *ngIf=\"!usePrebuiltFields() && activeFormInputs?.length\">\r\n <formly-form \r\n [form]=\"form\" \r\n [fields]=\"allFormlyFields\" \r\n [model]=\"model\"\r\n (modelChange)=\"onFormModelChange($event)\">\r\n </formly-form>\r\n </form>\r\n </div>\r\n\r\n <!-- Custom form button(s) -->\r\n <div class=\"form-button-container\" *ngIf=\"activeCustomFormButton && !usePrebuiltFields()\">\r\n <!-- Support both single button and array of buttons -->\r\n <ng-container *ngIf=\"isButtonArray(); else singleButton\">\r\n <sa-button \r\n *ngFor=\"let button of activeCustomFormButton\"\r\n class=\"action-button\"\r\n [id]=\"button.id\"\r\n [text]=\"button.text\"\r\n [type]=\"button.type\"\r\n [size]=\"button.size\"\r\n [state]=\"button.state\"\r\n [ImagePath]=\"button.ImagePath\"\r\n [iconPosition]=\"button.iconPosition\"\r\n (click)=\"onButtonClick(button)\">\r\n </sa-button>\r\n </ng-container>\r\n \r\n <ng-template #singleButton>\r\n <sa-button class=\"action-button\"\r\n [id]=\"activeCustomFormButton.id\"\r\n [text]=\"activeCustomFormButton.text\"\r\n [type]=\"activeCustomFormButton.type\"\r\n [size]=\"activeCustomFormButton.size\"\r\n [state]=\"activeCustomFormButton.state\"\r\n [ImagePath]=\"activeCustomFormButton.ImagePath\"\r\n [iconPosition]=\"activeCustomFormButton.iconPosition\"\r\n (click)=\"onButtonClick(activeCustomFormButton)\">\r\n </sa-button>\r\n </ng-template>\r\n </div>\r\n \r\n <!-- Divider section -->\r\n <div class=\"divider-section\" *ngIf=\"activeDivider && !usePrebuiltFields()\">\r\n <div class=\"divider\"></div>\r\n <div class=\"divider-header\">\r\n <h3 class=\"divider-title\" *ngIf=\"activeDividerConfig.title\">{{ activeDividerConfig.title }}</h3>\r\n <p class=\"divider-subtitle\" *ngIf=\"activeDividerConfig.subtitle || activeDividerConfig.showSubtitleWhenEmpty\">\r\n {{ activeDividerConfig.subtitle || 'No items added yet' }}\r\n </p>\r\n </div>\r\n \r\n <!-- Chips section -->\r\n <div class=\"chip-list\" *ngIf=\"activeChips?.length && !usePrebuiltFields()\">\r\n <sa-chip \r\n *ngFor=\"let chip of activeChips\"\r\n [text]=\"chip.label || chip.text || chip\"\r\n [type]=\"'regular'\"\r\n [state]=\"'default'\"\r\n [filling]=\"'filled'\"\r\n [iconPosition]=\"'right'\"\r\n [iconPath]=\"'../assets/closeBlueOutlined.svg'\"\r\n (onClickEvent)=\"chip.removable ? onChipRemove(chip) : null\">\r\n </sa-chip>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n @if(buttons){\r\n <div class=\"button-group\">\r\n @for (button of buttons; track button.text) {\r\n <sa-button \r\n [text]=\"button.text\"\r\n [icon]=\"button.icon\"\r\n [size]=\"button.size\"\r\n [type]=\"button.type\"\r\n [iconPosition]=\"button.iconPosition\"\r\n [buttonIconSize]=\"button.buttonIconSize\"\r\n (onClickEvent)=\"onButtonClick(button, $event)\"\r\n role=\"button\"\r\n [state]=\"!areAllVisibleFieldsFilled() ? 'disabled' : ''\"\r\n [attr.aria-label]=\"button.text\">\r\n </sa-button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }", styles: [".error-page{display:flex;justify-content:center;align-items:center;box-sizing:border-box}.title-class{color:var(--text-highemphasis, #1C1B20);text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--small-16px, 16px);font-style:normal;font-weight:600;line-height:1.5rem;letter-spacing:.15px}.content-container{display:flex;flex-direction:column;align-items:center;gap:var(--medium-32px, 32px);text-align:center}.image-container{display:flex;justify-content:center;align-items:center;margin-bottom:var(--small-16px, 16px)}.image-container img{height:var(--message-icon-height, 12.5rem);width:var(--message-icon-width, auto)}.details{display:flex;flex-direction:column;align-items:center;gap:var(--medium-20px, 20px);text-align:center;background-color:var(--structural-white, #FFF)}::ng-deep .description .support-email{color:var(--primary-500);font-family:var(--font-roboto, Roboto);font-size:14px;font-style:normal;font-weight:500;line-height:1.25rem;letter-spacing:.1px}.description{color:var(--Text-Medium-Emphasis, #6D6979);text-align:center;font-family:var(--font-family, Roboto);font-size:var(--small-14px, 14px);font-style:normal;font-weight:400;line-height:var(--medium-20px, 20px);letter-spacing:.25px;margin:0}.message-banner-v2 .button-group{display:flex;gap:var(--small-8px);justify-content:center}::ng-deep .custom-contact-link{color:var(--primary-500, #7F56D9);font-family:var(--font-roboto, Roboto);font-size:var(--small-16px, 16px);font-style:normal;font-weight:600;line-height:var(--medium-24px);letter-spacing:.15px;text-decoration:none}.access-restricted-title{color:var(--text-highemphasis, #1C1B20);text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--medium-22px);font-style:normal;font-weight:500;line-height:var(--medium-28px);margin-bottom:var(--small-10px)}.access-restricted-description{text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--small-16px, 16px);line-height:var(--medium-24px);max-width:44rem;white-space:normal;word-break:break-word}.access-error-title{color:var(--semantic-error-500, #BD271E);text-align:center;font-family:var(--font-roboto, Roboto);font-size:var(--medium-22px);font-style:normal;font-weight:500;line-height:var(--medium-28px);margin-bottom:var(--small-10px)}.redirect-link{display:flex;align-items:center;gap:8px;cursor:pointer}.info-icon{width:16px;height:16px;color:var(--primary-500, #825CEE)}.learn-more-text{font-size:14px;color:var(--primary-500, #825CEE);text-decoration:none}.redirect-link:hover .learn-more-text{text-decoration:underline}.additional-fields{display:flex;gap:16px;width:100%}.form-button-container{display:flex;justify-content:flex-end;align-items:center;align-self:stretch}::ng-deep .form-button-container .action-button .sa-button{align-self:flex-start;display:flex;justify-content:center;align-items:center;gap:var(--small-3px, 3px);align-self:stretch}.divider-section{flex:0 0 auto;margin-top:32px;width:100%}.divider{width:100%;height:1px;background:var(--grey-200, #E4E7EC);margin-bottom:24px}.divider-header{margin-bottom:16px}.divider-title{font-size:16px;font-weight:600;color:var(--text-high-emphasis, #1C1B20);margin:0 0 8px;font-family:var(--font-family, Roboto)}.divider-subtitle{font-size:14px;font-weight:400;color:var(--text-medium-emphasis, #6D6979);margin:0;font-style:italic;font-family:var(--font-family, Roboto)}.chip-list{display:flex;flex-wrap:wrap;gap:8px}.dialog-form{width:100%;display:block}.form-fields-container{min-height:0;flex:0 0 auto;width:100%;position:relative;z-index:1;overflow:visible}.dialog-form .form-row{display:flex;gap:16px;margin-bottom:16px;width:100%}.dialog-form .form-field-wrapper{flex:1;display:flex;flex-direction:column;gap:4px}.dialog-form .form-field-wrapper.full-width{flex:1 1 100%}.dialog-form .additional-fields{display:flex;flex-direction:column;gap:16px;width:100%}::ng-deep .dialog-form formly-form{width:100%;display:block}::ng-deep .dialog-form formly-group{width:100%;display:grid;grid-template-columns:repeat(var(--form-grid-columns, 2),1fr);gap:16px;margin:0;padding:0;grid-auto-rows:min-content}::ng-deep .dialog-form formly-field>formly-group{display:grid;grid-template-columns:repeat(var(--form-grid-columns, 2),1fr);gap:16px;width:100%}::ng-deep .dialog-form formly-field{width:100%;display:block}::ng-deep .dialog-form .col-6{width:100%;display:block}::ng-deep .dialog-form .col-12{width:100%;display:block;grid-column:span 2}::ng-deep .additional-fields formly-form{width:100%;display:block}::ng-deep .dialog-form lib-form-select{width:100%}::ng-deep .dialog-form .sa-select-container{width:100%;display:flex;flex-direction:column}::ng-deep .dialog-form .sa-select-field-container{width:100%;position:relative}::ng-deep .dialog-form .ng-select{min-height:44px;border-radius:4px;padding:unset;border:1px solid var(--Grey-100, #EAECF0);background:var(--Structural-White, #FFF)}::ng-deep .dialog-form .sa-select-container .sa-select-field-container .ng-select-field{padding:unset;border:none}::ng-deep .dialog-form .ng-select.ng-select-focused{border-color:var(--primary-500, #825CEE);box-shadow:0 0 0 3px #825cee1a}::ng-deep .dialog-form .ng-select .ng-select-container{min-height:44px;padding:12px 16px}.form-fields-scroll-wrapper{width:100%}\n"] }]
|
|
437
477
|
}], propDecorators: { messageType: [{
|
|
438
478
|
type: Input
|
|
439
479
|
}], contactUrl: [{
|
|
@@ -467,4 +507,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
|
|
|
467
507
|
}], buttonClick: [{
|
|
468
508
|
type: Output
|
|
469
509
|
}] } });
|
|
470
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1iYW5uZXItdjIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50LWxpYnJhcnkvc3JjL2xpYi9tZXNzYWdlLWJhbm5lci12Mi9tZXNzYWdlLWJhbm5lci12Mi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL21lc3NhZ2UtYmFubmVyLXYyL21lc3NhZ2UtYmFubmVyLXYyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQXFCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFN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Y2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBjb21wdXRlZCwgc2lnbmFsLCBlZmZlY3QsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJY29uU2VydmljZSB9IGZyb20gJy4uL2ljb24vaWNvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEljb25OYW1lIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9pY29uLWludGVyZmFjZSc7XG5pbXBvcnQgeyBCdXR0b25JY29uUG9zaXRpb24sIEJ1dHRvblNpemUsIEJ1dHRvblR5cGUsIEJ1dHRvbkludGVyZmFjZSwgQnV0dG9uQ2xpY2tFdmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYnV0dG9uLWludGVyZmFjZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWVzc2FnZUJhbm5lckNvbXBvbmVudCB9IGZyb20gJy4uL21lc3NhZ2UtYmFubmVyL21lc3NhZ2UtYmFubmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9mb3JtLWlucHV0L2Zvcm0taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1TZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9mb3JtLXNlbGVjdC9mb3JtLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtbHlNb2R1bGUsIEZvcm1seUZpZWxkQ29uZmlnIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBDaGlwc0NvbXBvbmVudCB9IGZyb20gJy4uL2NoaXBzL2NoaXBzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtTGF5b3V0Q29uZmlnLCBGb3JtRmllbGRDb25maWcsIFVuaWZpZWRGb3JtQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9mb3JtLWxheW91dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW50ZXJmYWNlIE1lc3NhZ2VCYW5uZXJTdGF0ZSB7XG4gIHR5cGU6ICdkZWZhdWx0JyB8ICdjb25uZWN0aW9uJyB8ICdhY2Nlc3MnIHwgJ2FjY2Vzc1Jlc3RyaWN0ZWQnO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBtZXNzYWdlSWNvbjogc3RyaW5nO1xuICBtZXNzYWdlSWNvblNpemU/OiB7XG4gICAgd2lkdGg/OiBzdHJpbmc7XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICB9O1xuICBzcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNvbnRlbnRHYXA/OiBzdHJpbmc7IFxuICBjb250YWN0VXJsPzogc3RyaW5nO1xuICB0aXRsZUNsYXNzPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbkNsYXNzPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzYS1tZXNzYWdlLWJhbm5lci12MicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEljb25Db21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudCwgSHR0cENsaWVudE1vZHVsZSxNZXNzYWdlQmFubmVyQ29tcG9uZW50LCBGb3JtSW5wdXRDb21wb25lbnQsIEZvcm1TZWxlY3RDb21wb25lbnQsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3JtbHlNb2R1bGUsIENoaXBzQ29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbSWNvblNlcnZpY2VdLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS1iYW5uZXItdjIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tZXNzYWdlLWJhbm5lci12Mi5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUJhbm5lclYyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLy8gU3RhdGUgbWFuYWdlbWVudCB1c2luZyBzaWduYWxzXG4gIHByaXZhdGUgc3RhdGUgPSBzaWduYWw8TWVzc2FnZUJhbm5lclN0YXRlPih7XG4gICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgIHRpdGxlOiAnJyxcbiAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgbWVzc2FnZUljb246ICcnLFxuICAgIG1lc3NhZ2VJY29uU2l6ZToge1xuICAgICAgaGVpZ2h0OiAnMTIuNXJlbSdcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENvbXB1dGVkIHByb3BlcnRpZXNcbiAgcHJvdGVjdGVkIGJhbm5lckNvbnRlbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5zdGF0ZSgpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jdXJyZW50U3RhdGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5zYW5pdGl6ZURlc2NyaXB0aW9uKGN1cnJlbnRTdGF0ZS5kZXNjcmlwdGlvbilcbiAgICB9O1xuICB9KTtcblxuICBASW5wdXQoKSBtZXNzYWdlVHlwZTogJ2RlZmF1bHQnIHwgJ2Nvbm5lY3Rpb24nIHwgJ2FjY2VzcycgfCAnYWNjZXNzUmVzdHJpY3RlZCc7XG4gIEBJbnB1dCgpIGNvbnRhY3RVcmw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNwYWNpbmdCZXR3ZWVuSW1hZ2VBbmREZXNjcmlwdGlvbj86IHN0cmluZztcbiAgQElucHV0KCkgY29udGVudEdhcD86IHN0cmluZztcbiAgQElucHV0KCkgdGl0bGVDbGFzcz86IHN0cmluZztcbiAgQElucHV0KCkgZGVzY3JpcHRpb25DbGFzcz86IHN0cmluZztcbiAgQElucHV0KCkgYmFubmVyOmFueSA9IHt9O1xuICBASW5wdXQoKSBmb3JtQ29uZmlnOiBVbmlmaWVkRm9ybUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBwcmVidWlsdEZvcm1GaWVsZHM6IFRlbXBsYXRlUmVmPGFueT4gXG4gIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgbW9kZWw6IGFueSA9IHt9O1xuICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgZm9ybWx5RmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gIGFsbEZpZWxkc0ZpbGxlZCA9IHNpZ25hbChmYWxzZSk7XG4gIGFkZGl0aW9uYWxGb3JtbHlGaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgdXNlUHJlYnVpbHRGaWVsZHMgPSBzaWduYWwoZmFsc2UpO1xuICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzIGZvciB1bmlmaWVkIGFjY2Vzc1xuICBnZXQgYWN0aXZlRm9ybUlucHV0cygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbmZpZz8uZmllbGRzIHx8IFtdO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUNoaXBzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnPy5jaGlwcyB8fCBbXTtcbiAgfVxuXG4gIGdldCBhY3RpdmVDdXN0b21Gb3JtQnV0dG9uKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbmZpZz8uY3VzdG9tQnV0dG9uIHx8IFtdO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZURpdmlkZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbmZpZz8uZGl2aWRlcj8uZW5hYmxlZCA/PyBmYWxzZTtcbiAgfSBcblxuICBnZXQgYWN0aXZlRGl2aWRlckNvbmZpZygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWc/LmRpdmlkZXIgfHwge307XG4gIH1cblxuICBnZXQgYWN0aXZlRm9ybUxheW91dCgpOiBGb3JtTGF5b3V0Q29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnPy5sYXlvdXQgfHwge307XG4gIH1cblxuICBAT3V0cHV0KCkgb25Gb3JtRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHt0eXBlOiBzdHJpbmcsIGRhdGE6IGFueX0+KCk7XG4gIFxuICBvbkNoaXBSZW1vdmUoY2hpcDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkZvcm1FdmVudC5lbWl0KHsgdHlwZTogJ2NoaXAtcmVtb3ZlJywgZGF0YTogY2hpcCB9KTtcbiAgfVxuICBcbiAgb25BZGRVc2VyKCk6IHZvaWQge1xuICAgIGxldCBjbGlja2VkQnV0dG9uID0gdGhpcy5hY3RpdmVDdXN0b21Gb3JtQnV0dG9uO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbikpIHtcbiAgICAgIGNsaWNrZWRCdXR0b24gPSB0aGlzLmFjdGl2ZUN1c3RvbUZvcm1CdXR0b24uZmluZChidG4gPT4gXG4gICAgICAgIGJ0bi50ZXh0ID09PSAnQWRkIFVzZXInIHx8IGJ0bi5pZCA9PT0gJ2FkZC11c2VyJyB8fCBidG4uYWN0aW9uID09PSAnYWRkLXVzZXInXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLm9uRm9ybUV2ZW50LmVtaXQoeyB0eXBlOiAnY3VzdG9tLWJ1dHRvbi1jbGljaycsIGRhdGE6IGNsaWNrZWRCdXR0b24gfSk7XG4gICAgLy8gT25seSByZXNldCBmb3JtIGlmIGV4cGxpY2l0bHkgY29uZmlndXJlZCB0byBkbyBzb1xuICAgIGlmIChjbGlja2VkQnV0dG9uPy5yZXNldEZvcm0gIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gU2VwYXJhdGUgbWV0aG9kIGZvciBmb3JtIHJlc2V0IHRoYXQgY2FuIGJlIGNhbGxlZCBleHRlcm5hbGx5XG4gIHJlc2V0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0ge307XG4gICAgdGhpcy5mb3JtLnJlc2V0KCk7XG4gICAgdGhpcy5hY3RpdmVGb3JtSW5wdXRzPy5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVGb3JtbHlGaWVsZHMoKTtcbiAgfVxuICBcbiAgYXJlQWxsRmllbGRzRmlsbGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5hY3RpdmVGb3JtSW5wdXRzIHx8IHRoaXMuYWN0aXZlRm9ybUlucHV0cy5sZW5ndGggPCA0KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlRm9ybUlucHV0cy5ldmVyeShmaWVsZCA9PiBmaWVsZC52YWx1ZSAmJiBmaWVsZC52YWx1ZS50cmltKCkgIT09ICcnKTtcbiAgfVxuICBcblxuICBASW5wdXQoKSBzZXQgbWVzc2FnZUljb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgbWVzc2FnZUljb246IHZhbHVlIH0pKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBtZXNzYWdlSWNvblNpemUodmFsdWU6IHsgd2lkdGg/OiBzdHJpbmc7IGhlaWdodD86IHN0cmluZyB9KSB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoeyAuLi5zLCBtZXNzYWdlSWNvblNpemU6IHZhbHVlIH0pKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0aXRsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoeyAuLi5zLCB0aXRsZTogdmFsdWUgfSkpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRlc2NyaXB0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7IC4uLnMsIGRlc2NyaXB0aW9uOiB2YWx1ZSB9KSk7XG4gIH1cblxuICBASW5wdXQoKSBidXR0b25zOiBCdXR0b25JbnRlcmZhY2VbXSA9IFtdO1xuICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEJ1dHRvbkNsaWNrRXZlbnQ+KCk7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGluaXRpYWxpemF0aW9uIG9yIGlmIG1lc3NhZ2VUeXBlIGhhcyBjaGFuZ2VkXG4gICAgY29uc3Qgc2hvdWxkVXBkYXRlQmFzZWRPblR5cGUgPSBjaGFuZ2VzWydtZXNzYWdlVHlwZSddICYmIFxuICAgICAgLy8gT25seSB1cGRhdGUgYmFzZWQgb24gdHlwZSBpZiB3ZSBkb24ndCBoYXZlIGN1c3RvbSB2YWx1ZXMgc2V0XG4gICAgICAhKHRoaXMuc3RhdGUoKS50aXRsZSB8fCB0aGlzLnN0YXRlKCkuZGVzY3JpcHRpb24gfHwgdGhpcy5zdGF0ZSgpLm1lc3NhZ2VJY29uKTtcbiAgICBcbiAgICBpZiAoc2hvdWxkVXBkYXRlQmFzZWRPblR5cGUpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29udGVudEJhc2VkT25UeXBlKHRoaXMubWVzc2FnZVR5cGUgfHwgJ2RlZmF1bHQnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgcHJlYnVpbHQgZmllbGRzIGFyZSBwcm92aWRlZFxuICAgIGlmIChjaGFuZ2VzWydwcmVidWlsdEZvcm1GaWVsZHMnXSkge1xuICAgICAgdGhpcy51c2VQcmVidWlsdEZpZWxkcy5zZXQoISF0aGlzLnByZWJ1aWx0Rm9ybUZpZWxkcyk7XG4gICAgfVxuICAgIFxuICAgIGlmIChjaGFuZ2VzWydmb3JtQ29uZmlnJ10gfHwgY2hhbmdlc1snZm9ybUlucHV0cyddKSB7XG4gICAgICBpZiAoIXRoaXMudXNlUHJlYnVpbHRGaWVsZHMoKSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1seUZpZWxkcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29udGVudEJhc2VkT25UeXBlKHR5cGU6ICdkZWZhdWx0JyB8ICdjb25uZWN0aW9uJyB8ICdhY2Nlc3MnIHwgJ2FjY2Vzc1Jlc3RyaWN0ZWQnKSB7ICBcbiAgICAvLyBEZWZpbmUgYSB0eXBlIGZvciB0aGUgY29udGVudCBpdGVtcyB0byBlbnN1cmUgYWxsIHByb3BlcnRpZXMgYXJlIHByb3Blcmx5IHR5cGVkXG4gICAgdHlwZSBDb250ZW50SXRlbSA9IHtcbiAgICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgICAgbWVzc2FnZUljb246IHN0cmluZztcbiAgICAgIHNwYWNpbmdCZXR3ZWVuSW1hZ2VBbmREZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAgIGNvbnRlbnRHYXA/OiBzdHJpbmc7XG4gICAgICB0aXRsZUNsYXNzPzogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb25DbGFzcz86IHN0cmluZztcbiAgICB9O1xuXG4gICAgLy8gT25seSBhcHBseSBkZWZhdWx0IGNvbnRlbnQgaWYgY3VzdG9tIGNvbnRlbnQgaGFzbid0IGJlZW4gcHJvdmlkZWRcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnN0YXRlKCk7XG4gICAgY29uc3QgY29udGVudDogUmVjb3JkPCdkZWZhdWx0JyB8ICdjb25uZWN0aW9uJyB8ICdhY2Nlc3MnIHwgJ2FjY2Vzc1Jlc3RyaWN0ZWQnLCBDb250ZW50SXRlbT4gPSB7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRpdGxlOiAnT29wcyEgU29tZXRoaW5nIHdlbnQgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4gb3IgdHJ5IGFmdGVyIHNvbWUgdGltZScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnSWYgdGhlIGlzc3VlIHBlcnNpc3RzLCBjb250YWN0IG91ciBzdXBwb3J0IHRlYW0gYXQgPHNwYW4gY2xhc3M9XCJzdXBwb3J0LWVtYWlsXCI+c3VwcG9ydEBzYXJhc2FuYWx5dGljcy5jb208L3NwYW4+JyxcbiAgICAgICAgbWVzc2FnZUljb246ICcvYXNzZXRzL2Vycm9yLmdpZidcbiAgICAgIH0sXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIHRpdGxlOiAnV2VcXCdyZSBoYXZpbmcgdHJvdWJsZSBjb25uZWN0aW5nLiBQbGVhc2UgY2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1lvdSBjYW4gYWxzbyByZWFjaCBvdXQgdG8gb3VyIHN1cHBvcnQgdGVhbSBhdCA8c3BhbiBjbGFzcz1cInN1cHBvcnQtZW1haWxcIj5zdXBwb3J0QHNhcmFzYW5hbHl0aWNzLmNvbTwvc3Bhbj4gZm9yIGFzc2lzdGFuY2UnLFxuICAgICAgICBtZXNzYWdlSWNvbjogJy9hc3NldHMvbG9zdC1jb25uZWN0aW9uLmdpZidcbiAgICAgIH0sXG4gICAgICBhY2Nlc3M6IHtcbiAgICAgICAgdGl0bGU6ICdUaGlzIGlzIHRha2luZyBhIGJpdCBsb25nZXIgdGhhbiB1c3VhbC4gUGxlYXNlIGhvbGQgb24hJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdJZiB0aGUgZGVsYXkgY29udGludWVzLCBjaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSByZWZyZXNoaW5nIHRoZSBwYWdlLicsXG4gICAgICAgIG1lc3NhZ2VJY29uOiAnL2Fzc2V0cy9sb25nLWxvYWRpbmcuZ2lmJ1xuICAgICAgfSxcbiAgICAgIGFjY2Vzc1Jlc3RyaWN0ZWQ6IHtcbiAgICAgICAgdGl0bGU6ICdBY2Nlc3MgUmVzdHJpY3RlZCEnLFxuICAgICAgICBkZXNjcmlwdGlvbjogYExvb2tzIGxpa2UgeW91IGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoaXMgbW9kdWxlIGp1c3QgeWV0LiBObyB3b3JyaWVz4oCUcmVhY2ggb3V0IHRvIHlvdXIgYWRtaW4gdG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBmZWF0dXJlLiBJZiB5b3UncmUgZmFjaW5nIGFueSBpc3N1ZXMsIGZlZWwgZnJlZSB0byA8YSBjbGFzcz1cImN1c3RvbS1jb250YWN0LWxpbmtcIiBocmVmPVwiJHt0aGlzLmNvbnRhY3RVcmwgPz8gJ2h0dHBzOi8vc3VwcG9ydC5kZWZhdWx0LmNvbSd9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+Q29udGFjdCBVczwvYT4uYCxcbiAgICAgICAgbWVzc2FnZUljb246ICcvYXNzZXRzL2FjY2Vzcy1yZXN0cmljdGVkLmdpZicsXG4gICAgICAgIHNwYWNpbmdCZXR3ZWVuSW1hZ2VBbmREZXNjcmlwdGlvbjogJzBweCcsXG4gICAgICAgIGNvbnRlbnRHYXA6JzIwcHgnLFxuICAgICAgICB0aXRsZUNsYXNzOiAnYWNjZXNzLXJlc3RyaWN0ZWQtdGl0bGUnLFxuICAgICAgICBkZXNjcmlwdGlvbkNsYXNzOiAnYWNjZXNzLXJlc3RyaWN0ZWQtZGVzY3JpcHRpb24nLFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRbdHlwZV07XG5cbiAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7XG4gICAgICAuLi5zLFxuICAgICAgdHlwZSxcbiAgICAgIC8vIE9ubHkgYXBwbHkgZGVmYXVsdCB2YWx1ZXMgaWYgY3VzdG9tIHZhbHVlcyBoYXZlbid0IGJlZW4gcHJvdmlkZWRcbiAgICAgIHRpdGxlOiBzLnRpdGxlIHx8IGNvbnRlbnRJdGVtLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IHMuZGVzY3JpcHRpb24gfHwgY29udGVudEl0ZW0uZGVzY3JpcHRpb24sXG4gICAgICBtZXNzYWdlSWNvbjogcy5tZXNzYWdlSWNvbiB8fCBjb250ZW50SXRlbS5tZXNzYWdlSWNvbixcbiAgICAgIC8vIEZvciBvdGhlciBwcm9wZXJ0aWVzLCBvbmx5IGFwcGx5IHRoZW0gaWYgdGhleSBleGlzdCBpbiB0aGUgY29udGVudEl0ZW1cbiAgICAgIC4uLihjb250ZW50SXRlbS5zcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb24gJiYgeyBzcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb246IGNvbnRlbnRJdGVtLnNwYWNpbmdCZXR3ZWVuSW1hZ2VBbmREZXNjcmlwdGlvbiB9KSxcbiAgICAgIC4uLihjb250ZW50SXRlbS5jb250ZW50R2FwICYmIHsgY29udGVudEdhcDogY29udGVudEl0ZW0uY29udGVudEdhcCB9KSxcbiAgICAgIC4uLihjb250ZW50SXRlbS50aXRsZUNsYXNzICYmIHsgdGl0bGVDbGFzczogY29udGVudEl0ZW0udGl0bGVDbGFzcyB9KSxcbiAgICAgIC4uLihjb250ZW50SXRlbS5kZXNjcmlwdGlvbkNsYXNzICYmIHsgZGVzY3JpcHRpb25DbGFzczogY29udGVudEl0ZW0uZGVzY3JpcHRpb25DbGFzcyB9KVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgc2FuaXRpemVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGVzY3JpcHRpb24ucmVwbGFjZShcbiAgICAgIC9zdXBwb3J0QHNhcmFzYW5hbHl0aWNzXFwuY29tL2csXG4gICAgICAnPHNwYW4gY2xhc3M9XCJzdXBwb3J0LWVtYWlsXCI+c3VwcG9ydEBzYXJhc2FuYWx5dGljcy5jb208L3NwYW4+J1xuICAgICk7XG4gIH1cblxuICBvbkJ1dHRvbkNsaWNrKGJ1dHRvbjogYW55LCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGZvcm0gYnV0dG9uIChmcm9tIGFjdGl2ZUN1c3RvbUZvcm1CdXR0b24pIG9yIHJlZ3VsYXIgYmFubmVyIGJ1dHRvblxuICAgIGlmICghZXZlbnQgJiYgKGJ1dHRvbi5hY3Rpb24gPT09ICdzdWJtaXQnIHx8IGJ1dHRvbi5hY3Rpb24gPT09ICdsaW5rJyB8fCBidXR0b24uaWQgPT09ICdhZGQtdXNlcicgfHwgYnV0dG9uLmlkID09PSAnbGVhcm4tbW9yZScpKSB7XG4gICAgICAvLyBIYW5kbGUgZm9ybSBidXR0b25zIHdpdGggbmV3IGxvZ2ljXG4gICAgICBpZiAoIGJ1dHRvbi5pZCA9PT0gJ2FkZC11c2VyJykge1xuICAgICAgICAvLyBIYW5kbGUgZm9ybSBzdWJtaXNzaW9uIChleGlzdGluZyBBZGQgVXNlciBmdW5jdGlvbmFsaXR5KVxuICAgICAgICB0aGlzLm9uQWRkVXNlcigpO1xuICAgICAgfSBlbHNlIGlmIChidXR0b24uYWN0aW9uID09PSAnbGluaycgJiYgYnV0dG9uLmxpbmspIHtcbiAgICAgICAgLy8gSGFuZGxlIGxpbmsgbmF2aWdhdGlvbiAoTGVhcm4gTW9yZSBmdW5jdGlvbmFsaXR5KVxuICAgICAgICB3aW5kb3cub3BlbihidXR0b24ubGluaywgJ19ibGFuaycpO1xuICAgICAgfSBlbHNlIGlmIChidXR0b24ub25DbGljaykge1xuICAgICAgICAvLyBIYW5kbGUgY3VzdG9tIGNsaWNrIGZ1bmN0aW9uXG4gICAgICAgIGJ1dHRvbi5vbkNsaWNrKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChldmVudCkge1xuICAgICAgLy8gSGFuZGxlIHJlZ3VsYXIgYmFubmVyIGJ1dHRvbnMgd2l0aCBvcmlnaW5hbCBsb2dpYyAoYmFja3dhcmQgY29tcGF0aWJpbGl0eSlcbiAgICAgIHRoaXMuYnV0dG9uQ2xpY2suZW1pdCh7XG4gICAgICAgIHR5cGU6IGJ1dHRvbi50eXBlIGFzICdwcmltYXJ5JyB8ICdzZWNvbmRhcnknLFxuICAgICAgICBidXR0b24sXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2ZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc0J1dHRvbkFycmF5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMuYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbik7XG4gIH1cblxuICBpc0VtcHR5T2JqZWN0KG9iajogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKG9iaikge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xuICAgIH1lbHNle1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGb3JtbHlGaWVsZHMoKTogdm9pZCB7XG4gICAgLy8gU2tpcCBGb3JtbHkgZmllbGQgZ2VuZXJhdGlvbiBpZiB1c2luZyBwcmVidWlsdCBmaWVsZHNcbiAgICBpZiAodGhpcy51c2VQcmVidWlsdEZpZWxkcygpKSB7XG4gICAgICB0aGlzLmZvcm1seUZpZWxkcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5mb3JtQ29uZmlnIHx8ICF0aGlzLmZvcm1Db25maWcuZmllbGRzIHx8IHRoaXMuZm9ybUNvbmZpZy5maWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmZvcm1seUZpZWxkcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCBsYXlvdXQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuYWN0aXZlRm9ybUxheW91dDtcbiAgICBjb25zdCBmaWVsZHNQZXJSb3cgPSBsYXlvdXQuZmllbGRzUGVyUm93IHx8IDI7XG4gICAgY29uc3QgaW5pdGlhbFZpc2libGVGaWVsZHMgPSBsYXlvdXQuaW5pdGlhbFZpc2libGVGaWVsZHMgfHwgZmllbGRzUGVyUm93O1xuICAgIFxuICAgIC8vIFVwZGF0ZSBDU1MgZ3JpZCBjb2x1bW5zIGR5bmFtaWNhbGx5XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1ucyhmaWVsZHNQZXJSb3cpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBpbml0aWFsIHZpc2libGUgZmllbGRzXG4gICAgY29uc3QgaW5pdGlhbEZpZWxkcyA9IHRoaXMuZm9ybUNvbmZpZy5maWVsZHMuc2xpY2UoMCwgaW5pdGlhbFZpc2libGVGaWVsZHMpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBGb3JtbHkgZmllbGRzIGZvciBpbml0aWFsIHZpc2libGUgZmllbGRzIC0gbm9ybWFsaXplIHRoZSBmaWVsZCBzdHJ1Y3R1cmVcbiAgICB0aGlzLmZvcm1seUZpZWxkcyA9IGluaXRpYWxGaWVsZHMubWFwKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSBmaWVsZCBzdHJ1Y3R1cmUgdG8gcHJvcGVyIEZvcm1seSBmb3JtYXRcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyVmFsdWUgPSBmaWVsZC5wbGFjZWhvbGRlciB8fCBmaWVsZC5wcm9wcz8ucGxhY2Vob2xkZXIgfHwgZmllbGQucGFyYW1zPy5wbGFjZWhvbGRlciB8fCBmaWVsZC5wcm9wcz8ucGFyYW1zPy5wbGFjZWhvbGRlciB8fCAnJztcbiAgICAgIFxuICAgICAgY29uc3QgZm9ybWx5RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAgICBrZXk6IGZpZWxkLmtleSxcbiAgICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmdldEZpZWxkQ2xhc3NOYW1lKGluZGV4LCBmaWVsZHNQZXJSb3cpLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIC8vIEhhbmRsZSBtaXhlZCBzdHJ1Y3R1cmUgLSBzb21lIGZpZWxkcyBoYXZlIHByb3BzIGF0IHJvb3QsIG90aGVycyBuZXN0ZWRcbiAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJWYWx1ZSxcbiAgICAgICAgICByZXF1aXJlZDogZmllbGQucmVxdWlyZWQgfHwgZmllbGQucHJvcHM/LnJlcXVpcmVkIHx8IGZhbHNlLFxuICAgICAgICAgIGRpc2FibGVkOiBmaWVsZC5kaXNhYmxlZCB8fCBmaWVsZC5wcm9wcz8uZGlzYWJsZWQgfHwgZmFsc2UsXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRm9yIHNlbGVjdCBmaWVsZHMsIGluY2x1ZGUgc2VsZWN0LXNwZWNpZmljIHByb3BlcnRpZXNcbiAgICAgICAgICAuLi4oZmllbGQucHJvcHM/Lm9wdGlvbnMgJiYge1xuICAgICAgICAgICAgb3B0aW9uczogZmllbGQucHJvcHMub3B0aW9ucyxcbiAgICAgICAgICAgIG11bHRpcGxlOiBmaWVsZC5wcm9wcy5tdWx0aXBsZSB8fCBmYWxzZSxcbiAgICAgICAgICAgIGJpbmRMYWJlbDogZmllbGQucHJvcHMucGFyYW1zPy5iaW5kTGFiZWwgfHwgJ2xhYmVsJyxcbiAgICAgICAgICAgIGJpbmRWYWx1ZTogZmllbGQucHJvcHMucGFyYW1zPy5iaW5kVmFsdWUgfHwgJ3ZhbHVlJyxcbiAgICAgICAgICAgIGlzQ2xlYXJhYmxlOiBmaWVsZC5wcm9wcy5wYXJhbXM/LmlzQ2xlYXJhYmxlICE9PSBmYWxzZSxcbiAgICAgICAgICAgIHNob3dDaGVja2JveGVzOiBmaWVsZC5wcm9wcy5wYXJhbXM/LnNob3dDaGVja2JveGVzIHx8IGZhbHNlXG4gICAgICAgICAgfSksXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gSW5jbHVkZSBwYXJhbXMgZm9yIGNvbXBvbmVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAuLi4oZmllbGQucGFyYW1zIHx8IHt9KSxcbiAgICAgICAgICAgIC4uLihmaWVsZC5wcm9wcz8ucGFyYW1zIHx8IHt9KSxcbiAgICAgICAgICAgIC8vIEVuc3VyZSBsYWJlbCBhbmQgcGxhY2Vob2xkZXIgYXJlIHNldFxuICAgICAgICAgICAgbGFiZWw6IGZpZWxkLmxhYmVsIHx8IGZpZWxkLnByb3BzPy5wYXJhbXM/LmxhYmVsIHx8IHBsYWNlaG9sZGVyVmFsdWUsXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJWYWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRhdG9yczogZmllbGQudmFsaWRhdG9ycyB8fCBmaWVsZC5wcm9wcz8udmFsaWRhdG9ycyB8fCB7fVxuICAgICAgfTtcblxuICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWUgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChmaWVsZC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubW9kZWxbZmllbGQua2V5IGFzIHN0cmluZ10gPSBmaWVsZC52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGZvcm0gY29udHJvbCB0byBmb3JtIGdyb3VwIGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICAgIGNvbnN0IGtleSA9IGZpZWxkLmtleSBhcyBzdHJpbmc7XG4gICAgICBpZiAoIXRoaXMuZm9ybS5nZXQoa2V5KSkge1xuICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChrZXksIGZpZWxkLmZvcm1Db250cm9sIHx8IG5ldyBGb3JtQ29udHJvbChmaWVsZC52YWx1ZSB8fCAnJykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9ybWx5RmllbGQ7XG4gICAgfSk7XG5cbiAgICAvLyBIYW5kbGUgYWRkaXRpb25hbCBmaWVsZHMgdGhhdCBzaG91bGQgc2hvdyBjb25kaXRpb25hbGx5XG4gICAgdGhpcy51cGRhdGVBZGRpdGlvbmFsRmllbGRzKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEZpZWxkQ2xhc3NOYW1lKGluZGV4OiBudW1iZXIsIGZpZWxkc1BlclJvdzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2xTaXplID0gMTIgLyBmaWVsZHNQZXJSb3c7XG4gICAgcmV0dXJuIGBjb2wtJHtjb2xTaXplfWA7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUdyaWRDb2x1bW5zKGZpZWxkc1BlclJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gVXNlIENTUyBjdXN0b20gcHJvcGVydHkgdG8gZHluYW1pY2FsbHkgdXBkYXRlIGdyaWQgY29sdW1uc1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1mb3JtLWdyaWQtY29sdW1ucycsIGZpZWxkc1BlclJvdy50b1N0cmluZygpKTtcbiAgfVxuXG5cbiAgc2hvdWxkU2hvd0FkZGl0aW9uYWxGaWVsZHMoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZUZvcm1JbnB1dHMgfHwgdGhpcy5hY3RpdmVGb3JtSW5wdXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuYWN0aXZlRm9ybUxheW91dDtcbiAgICBjb25zdCBpbml0aWFsVmlzaWJsZUZpZWxkcyA9IGxheW91dC5pbml0aWFsVmlzaWJsZUZpZWxkcyB8fCBsYXlvdXQuZmllbGRzUGVyUm93IHx8IDI7XG4gICAgXG4gICAgLy8gSWYgbm8gY29uZGl0aW9uYWwgZmllbGRzIGNvbmZpZ3VyYXRpb24sIGNoZWNrIGlmIGluaXRpYWwgZmllbGRzIGFyZSBmaWxsZWRcbiAgICBpZiAoIWxheW91dC5jb25kaXRpb25hbEZpZWxkcykge1xuICAgICAgcmV0dXJuIHRoaXMuYXJlQWxsVmlzaWJsZUZpZWxkc0ZpbGxlZCgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBVc2UgY3VzdG9tIHNob3dXaGVuIGZ1bmN0aW9uIGlmIHByb3ZpZGVkXG4gICAgY29uc3Qgc2hvdWxkU2hvdyA9IGxheW91dC5jb25kaXRpb25hbEZpZWxkcy5zaG93V2hlbiA/IFxuICAgICAgbGF5b3V0LmNvbmRpdGlvbmFsRmllbGRzLnNob3dXaGVuKHRoaXMubW9kZWwpIDogdGhpcy5hcmVBbGxWaXNpYmxlRmllbGRzRmlsbGVkKCk7XG4gICAgXG4gICAgY29uc29sZS5sb2coJ3Nob3VsZFNob3dBZGRpdGlvbmFsRmllbGRzOicsIHNob3VsZFNob3csICdtb2RlbDonLCB0aGlzLm1vZGVsLCAnY29uZGl0aW9uYWxGaWVsZHM6JywgbGF5b3V0LmNvbmRpdGlvbmFsRmllbGRzKTtcbiAgICBcbiAgICByZXR1cm4gc2hvdWxkU2hvdztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQWRkaXRpb25hbEZpZWxkcygpOiB2b2lkIHtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmFjdGl2ZUZvcm1MYXlvdXQ7XG4gICAgY29uc3QgZmllbGRzUGVyUm93ID0gbGF5b3V0LmZpZWxkc1BlclJvdyB8fCAyO1xuICAgIGNvbnN0IGluaXRpYWxWaXNpYmxlRmllbGRzID0gbGF5b3V0LmluaXRpYWxWaXNpYmxlRmllbGRzIHx8IGZpZWxkc1BlclJvdztcbiAgICBcbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgc2hvdyBhZGRpdGlvbmFsIGZpZWxkc1xuICAgIGNvbnN0IHNob3VsZFNob3dDb25kaXRpb25hbEZpZWxkcyA9IHRoaXMuc2hvdWxkU2hvd0FkZGl0aW9uYWxGaWVsZHMoKTtcbiAgICBcbiAgICBpZiAoc2hvdWxkU2hvd0NvbmRpdGlvbmFsRmllbGRzICYmIHRoaXMuZm9ybUNvbmZpZy5maWVsZHMubGVuZ3RoID4gaW5pdGlhbFZpc2libGVGaWVsZHMpIHtcbiAgICAgIC8vIEdldCBzcGVjaWZpYyBjb25kaXRpb25hbCBmaWVsZCBpbmRpY2VzIG9yIGFsbCByZW1haW5pbmcgZmllbGRzXG4gICAgICBjb25zdCBjb25kaXRpb25hbEZpZWxkSW5kaWNlcyA9IGxheW91dC5jb25kaXRpb25hbEZpZWxkcz8uZmllbGRzIHx8IFxuICAgICAgICBBcnJheS5mcm9tKHtsZW5ndGg6IHRoaXMuZm9ybUNvbmZpZy5maWVsZHMubGVuZ3RoIC0gaW5pdGlhbFZpc2libGVGaWVsZHN9LCAoXywgaSkgPT4gaSArIGluaXRpYWxWaXNpYmxlRmllbGRzKTtcbiAgICAgIFxuICAgICAgY29uc3QgYWRkaXRpb25hbEZpZWxkcyA9IGNvbmRpdGlvbmFsRmllbGRJbmRpY2VzLm1hcChpbmRleCA9PiB0aGlzLmZvcm1Db25maWcuZmllbGRzW2luZGV4XSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgXG4gICAgICAvLyBOb3JtYWxpemUgYWRkaXRpb25hbCBmaWVsZHMgdG8gcHJvcGVyIEZvcm1seSBmb3JtYXRcbiAgICAgIHRoaXMuYWRkaXRpb25hbEZvcm1seUZpZWxkcyA9IGFkZGl0aW9uYWxGaWVsZHMubWFwKChmaWVsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgLy8gTm9ybWFsaXplIGZpZWxkIHN0cnVjdHVyZSB0byBwcm9wZXIgRm9ybWx5IGZvcm1hdFxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlclZhbHVlID0gZmllbGQucGxhY2Vob2xkZXIgfHwgZmllbGQucHJvcHM/LnBsYWNlaG9sZGVyIHx8IGZpZWxkLnBhcmFtcz8ucGxhY2Vob2xkZXIgfHwgZmllbGQucHJvcHM/LnBhcmFtcz8ucGxhY2Vob2xkZXIgfHwgJyc7XG4gICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZygnUHJvY2Vzc2luZyBjb25kaXRpb25hbCBmaWVsZDonLCBmaWVsZC5rZXksICdwbGFjZWhvbGRlcjonLCBwbGFjZWhvbGRlclZhbHVlLCAnZmllbGQ6JywgZmllbGQpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZm9ybWx5RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICAgIHR5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmdldEZpZWxkQ2xhc3NOYW1lKGluZGV4LCBmaWVsZHNQZXJSb3cpLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgbWl4ZWQgc3RydWN0dXJlIC0gc29tZSBmaWVsZHMgaGF2ZSBwcm9wcyBhdCByb290LCBvdGhlcnMgbmVzdGVkXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJWYWx1ZSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiBmaWVsZC5yZXF1aXJlZCB8fCBmaWVsZC5wcm9wcz8ucmVxdWlyZWQgfHwgZmFsc2UsXG4gICAgICAgICAgICBkaXNhYmxlZDogZmllbGQuZGlzYWJsZWQgfHwgZmllbGQucHJvcHM/LmRpc2FibGVkIHx8IGZhbHNlLFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGb3Igc2VsZWN0IGZpZWxkcywgaW5jbHVkZSBzZWxlY3Qtc3BlY2lmaWMgcHJvcGVydGllc1xuICAgICAgICAgICAgLi4uKGZpZWxkLnByb3BzPy5vcHRpb25zICYmIHtcbiAgICAgICAgICAgICAgb3B0aW9uczogZmllbGQucHJvcHMub3B0aW9ucyxcbiAgICAgICAgICAgICAgbXVsdGlwbGU6IGZpZWxkLnByb3BzLm11bHRpcGxlIHx8IGZhbHNlLFxuICAgICAgICAgICAgICBiaW5kTGFiZWw6IGZpZWxkLnByb3BzLnBhcmFtcz8uYmluZExhYmVsIHx8ICdsYWJlbCcsXG4gICAgICAgICAgICAgIGJpbmRWYWx1ZTogZmllbGQucHJvcHMucGFyYW1zPy5iaW5kVmFsdWUgfHwgJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgaXNDbGVhcmFibGU6IGZpZWxkLnByb3BzLnBhcmFtcz8uaXNDbGVhcmFibGUgIT09IGZhbHNlLFxuICAgICAgICAgICAgICBzaG93Q2hlY2tib3hlczogZmllbGQucHJvcHMucGFyYW1zPy5zaG93Q2hlY2tib3hlcyB8fCBmYWxzZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEluY2x1ZGUgcGFyYW1zIGZvciBjb21wb25lbnQtc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgIC4uLihmaWVsZC5wYXJhbXMgfHwge30pLFxuICAgICAgICAgICAgICAuLi4oZmllbGQucHJvcHM/LnBhcmFtcyB8fCB7fSksXG4gICAgICAgICAgICAgIC8vIEVuc3VyZSBsYWJlbCBhbmQgcGxhY2Vob2xkZXIgYXJlIHNldFxuICAgICAgICAgICAgICBsYWJlbDogZmllbGQubGFiZWwgfHwgZmllbGQucHJvcHM/LnBhcmFtcz8ubGFiZWwgfHwgcGxhY2Vob2xkZXJWYWx1ZSxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHBsYWNlaG9sZGVyVmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRvcnM6IGZpZWxkLnZhbGlkYXRvcnMgfHwgZmllbGQucHJvcHM/LnZhbGlkYXRvcnMgfHwge31cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZSBpZiBwcm92aWRlZFxuICAgICAgICBpZiAoZmllbGQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubW9kZWxbZmllbGQua2V5IGFzIHN0cmluZ10gPSBmaWVsZC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBmb3JtIGNvbnRyb2wgdG8gZm9ybSBncm91cCBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICAgIGNvbnN0IGtleSA9IGZpZWxkLmtleSBhcyBzdHJpbmc7XG4gICAgICAgIGlmICghdGhpcy5mb3JtLmdldChrZXkpKSB7XG4gICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woa2V5LCBmaWVsZC5mb3JtQ29udHJvbCB8fCBuZXcgRm9ybUNvbnRyb2woZmllbGQudmFsdWUgfHwgJycpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtbHlGaWVsZDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDbGVhciBhZGRpdGlvbmFsIGZpZWxkcyBpZiBjb25kaXRpb25zIGFyZSBub3QgbWV0XG4gICAgICB0aGlzLmFkZGl0aW9uYWxGb3JtbHlGaWVsZHMgPSBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV2YWx1YXRlU2hvd1doZW4oc2hvd1doZW46IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICghc2hvd1doZW4pIHJldHVybiB0cnVlO1xuICAgIFxuICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgc2hvd1doZW4gY29uZGl0aW9uc1xuICAgIGlmICh0eXBlb2Ygc2hvd1doZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBzaG93V2hlbih0aGlzLm1vZGVsLCB0aGlzLmZvcm0pO1xuICAgIH1cbiAgICBcbiAgICBpZiAodHlwZW9mIHNob3dXaGVuID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gSGFuZGxlIGZpZWxkLWJhc2VkIGNvbmRpdGlvbnMgbGlrZSB7IGZpZWxkOiAncm9sZScsIHZhbHVlOiAnYWRtaW4nIH1cbiAgICAgIGlmIChzaG93V2hlbi5maWVsZCAmJiBzaG93V2hlbi52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsW3Nob3dXaGVuLmZpZWxkXSA9PT0gc2hvd1doZW4udmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gSGFuZGxlIGZvcm0gbW9kZWwgY2hhbmdlcyBmcm9tIEZvcm1seVxuICBvbkZvcm1Nb2RlbENoYW5nZShtb2RlbDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5tb2RlbCA9IHsgLi4udGhpcy5tb2RlbCwgLi4ubW9kZWwgfTtcbiAgICBcbiAgICBjb25zb2xlLmxvZygnRm9ybSBtb2RlbCBjaGFuZ2VkOicsIHRoaXMubW9kZWwpO1xuICAgIFxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuYWN0aXZlRm9ybUxheW91dDtcbiAgICBjb25zdCBzaG91bGRTaG93ID0gbGF5b3V0LmNvbmRpdGlvbmFsRmllbGRzPy5zaG93V2hlbiA/IFxuICAgICAgbGF5b3V0LmNvbmRpdGlvbmFsRmllbGRzLnNob3dXaGVuKHRoaXMubW9kZWwpIDogZmFsc2U7XG4gICAgXG4gICAgY29uc29sZS5sb2coJ1Nob3VsZCBzaG93IGNvbmRpdGlvbmFsIGZpZWxkczonLCBzaG91bGRTaG93KTtcbiAgICBcbiAgICAvLyBPbmx5IHVwZGF0ZSBpZiBjb25kaXRpb24gY2hhbmdlc1xuICAgIGlmIChzaG91bGRTaG93ICYmIHRoaXMuYWRkaXRpb25hbEZvcm1seUZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKCdUcmlnZ2VyaW5nIGNvbmRpdGlvbmFsIGZpZWxkcycpO1xuICAgICAgdGhpcy51cGRhdGVBZGRpdGlvbmFsRmllbGRzKCk7XG4gICAgfSBlbHNlIGlmICghc2hvdWxkU2hvdyAmJiB0aGlzLmFkZGl0aW9uYWxGb3JtbHlGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hZGRpdGlvbmFsRm9ybWx5RmllbGRzID0gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEVtaXQgdGhlIGNoYW5nZSBldmVudFxuICAgIHRoaXMub25Gb3JtRXZlbnQuZW1pdCh7IFxuICAgICAgdHlwZTogJ2Zvcm0tbW9kZWwtY2hhbmdlJywgXG4gICAgICBkYXRhOiBtb2RlbCBcbiAgICB9KTtcbiAgfVxuXG5cblxuXG5cblxuXG4gIC8vIEdldCBpbml0aWFsIGZpZWxkcyB0byBkaXNwbGF5IGluIHRoZSBmaXJzdCByb3dcbiAgZ2V0SW5pdGlhbEZpZWxkcygpOiBGb3JtRmllbGRDb25maWdbXSB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZUZvcm1JbnB1dHMpIHJldHVybiBbXTtcbiAgICBcbiAgICBjb25zdCBpbml0aWFsQ291bnQgPSB0aGlzLmFjdGl2ZUZvcm1MYXlvdXQuaW5pdGlhbFZpc2libGVGaWVsZHMgfHwgdGhpcy5hY3RpdmVGb3JtTGF5b3V0LmZpZWxkc1BlclJvdyB8fCAyO1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZvcm1JbnB1dHMuc2xpY2UoMCwgaW5pdGlhbENvdW50KTtcbiAgfVxuXG5cbiAgLy8gQ2hlY2sgaWYgYWxsIHZpc2libGUgZmllbGRzIGFyZSBmaWxsZWQgYW5kIGZvcm0gaXMgdmFsaWRcbiAgYXJlQWxsVmlzaWJsZUZpZWxkc0ZpbGxlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlRm9ybUlucHV0cyB8fCB0aGlzLmFjdGl2ZUZvcm1JbnB1dHMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBcbiAgICAvLyBHZXQgYWxsIGN1cnJlbnRseSB2aXNpYmxlIGZpZWxkc1xuICAgIGNvbnN0IGluaXRpYWxGaWVsZHMgPSB0aGlzLmdldEluaXRpYWxGaWVsZHMoKTtcbiAgICBjb25zdCBhbGxWaXNpYmxlRmllbGRzID0gWy4uLmluaXRpYWxGaWVsZHNdO1xuICAgIFxuICAgIC8vIENoZWNrIGlmIGFsbCB2aXNpYmxlIGZpZWxkcyBoYXZlIHZhbHVlc1xuICAgIGNvbnN0IGFsbEZpZWxkc0ZpbGxlZCA9IGFsbFZpc2libGVGaWVsZHMuZXZlcnkoZmllbGQgPT4ge1xuICAgICAgY29uc3QgbW9kZWxLZXkgPSBmaWVsZD8ubGFiZWw/LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnXycpfHwgZmllbGQ/LnBsYWNlaG9sZGVyPy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJ18nKTtcbiAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSB0aGlzLm1vZGVsW21vZGVsS2V5XTtcbiAgICAgIFxuICAgICAgaWYgKCFmaWVsZFZhbHVlKSByZXR1cm4gZmFsc2U7XG4gICAgICBcbiAgICAgIC8vIEZvciBzdHJpbmcgdmFsdWVzLCBjaGVjayBpZiBub3QgZW1wdHkgYWZ0ZXIgdHJpbVxuICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmllbGRWYWx1ZS50cmltKCkgIT09ICcnO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3IgYXJyYXlzIChtdWx0aS1zZWxlY3QpLCBjaGVjayBpZiBub3QgZW1wdHlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmaWVsZFZhbHVlLmxlbmd0aCA+IDA7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIFxuICAgIGNvbnN0IGZvcm1WYWxpZCA9IHRoaXMuZm9ybS52YWxpZDtcblxuICAgIHJldHVybiBhbGxGaWVsZHNGaWxsZWQgJiYgZm9ybVZhbGlkO1xuICB9XG4gIFxufVxuIiwiQGlmIChiYW5uZXJDb250ZW50KCk7IGFzIGNvbnRlbnQpIHtcbiAgPGRpdiBjbGFzcz1cImVycm9yLXBhZ2UgbWVzc2FnZS1iYW5uZXItdjJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1jb250YWluZXJcIiBbbmdTdHlsZV09XCJ7IGdhcDogY29udGVudEdhcCB8fCAndmFyKC0tbWVkaXVtLTMycHgsIDMycHgpJyB9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2UtY29udGFpbmVyXCJcbiAgICAgICAgW25nU3R5bGVdPVwieyAnbWFyZ2luLWJvdHRvbSc6IHNwYWNpbmdCZXR3ZWVuSW1hZ2VBbmREZXNjcmlwdGlvbiA/PyAndmFyKC0tc21hbGwtMTZweCwgMTZweCknIH1cIj5cbiAgICAgICAgPGltZyBbc3JjXT1cImNvbnRlbnQubWVzc2FnZUljb25cIiBbYWx0XT1cImNvbnRlbnQudHlwZSArICcgaW1hZ2UnXCJcbiAgICAgICAgICBbc3R5bGUuLS1tZXNzYWdlLWljb24taGVpZ2h0XT1cImNvbnRlbnQubWVzc2FnZUljb25TaXplPy5oZWlnaHRcIlxuICAgICAgICAgIFtzdHlsZS4tLW1lc3NhZ2UtaWNvbi13aWR0aF09XCJjb250ZW50Lm1lc3NhZ2VJY29uU2l6ZT8ud2lkdGhcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtY2xhc3NcIiBbbmdDbGFzc109XCJ0aXRsZUNsYXNzIHx8ICd0aXRsZS1jbGFzcydcIiBbaW5uZXJIVE1MXT1cImNvbnRlbnQudGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cImRlc2NyaXB0aW9uXCIgW25nQ2xhc3NdPVwiZGVzY3JpcHRpb25DbGFzcyB8fCAnZGVzY3JpcHRpb24nXCIgW2lubmVySFRNTF09XCJjb250ZW50LmRlc2NyaXB0aW9uXCI+PC9wPiBcbiAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cInsgbWFyZ2luOiBiYW5uZXI/LnNwYWNpbmcgKyAncHggMHB4JyB9XCI+XG4gICAgICAgICAgICA8c2EtbWVzc2FnZS1iYW5uZXIgKm5nSWY9XCIhaXNFbXB0eU9iamVjdChiYW5uZXIpXCIgW3R5cGVdPVwiYmFubmVyPy50eXBlXCIgW2Jhbm5lckljb25dPVwiYmFubmVyPy5iYW5uZXJJY29uXCIgW2J1dHRvbkljb25dPVwiYmFubmVyPy5idXR0b25JY29uXCJcbiAgICAgICAgICAgICAgW2Jhbm5lckljb25TaXplXT1cImJhbm5lcj8uYmFubmVySWNvblNpemVcIiBbYnV0dG9uVHlwZV09XCJiYW5uZXI/LmJ1dHRvblR5cGVcIiBbYnV0dG9uU2l6ZV09XCJiYW5uZXI/LmJ1dHRvblNpemVcIiBbYnV0dG9uSWNvblBvc2l0aW9uXT1cImJhbm5lcj8uYnV0dG9uSWNvblBvc2l0aW9uXCJcbiAgICAgICAgICAgICAgW2J1dHRvbkljb25TaXplXT1cImJhbm5lcj8uYnV0dG9uSWNvblNpemVcIiBbYWN0aW9uVGV4dF09XCJiYW5uZXI/LmFjdGlvblRleHRcIiA+XG4gICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJiYW5uZXI/LnRleHRcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvc2EtbWVzc2FnZS1iYW5uZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgPCEtLSBGb3JtIGlucHV0cyBzZWN0aW9uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJlYnVpbHRGb3JtRmllbGRzIHx8IGFjdGl2ZUZvcm1JbnB1dHM/Lmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkcy1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkcy1zY3JvbGwtYXJlYVwiPlxuICAgICAgICAgICAgICA8IS0tIFByZWJ1aWx0IGZvcm0gZmllbGRzIChkaXJlY3QgY29tcG9uZW50IHJlbmRlcmluZykgLS0+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VQcmVidWlsdEZpZWxkcygpICYmIHByZWJ1aWx0Rm9ybUZpZWxkc1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcmVidWlsdEZvcm1GaWVsZHNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA8IS0tIFVzZSBGb3JtbHkgZm9yIHByb3BlciBmb3JtIHJlbmRlcmluZyAtLT5cbiAgICAgICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJkaWFsb2ctZm9ybVwiICpuZ0lmPVwiIXVzZVByZWJ1aWx0RmllbGRzKCkgJiYgYWN0aXZlRm9ybUlucHV0cz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGZvcm1seS1mb3JtIFxuICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiIFxuICAgICAgICAgICAgICAgICAgW2ZpZWxkc109XCJmb3JtbHlGaWVsZHNcIiBcbiAgICAgICAgICAgICAgICAgIFttb2RlbF09XCJtb2RlbFwiXG4gICAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwib25Gb3JtTW9kZWxDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvZm9ybWx5LWZvcm0+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPCEtLSBBZGRpdGlvbmFsIGZpZWxkcyAoY29uZGl0aW9uYWwgYmFzZWQgb24gZm9ybUxheW91dC5jb25kaXRpb25hbEZpZWxkcykgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZGl0aW9uYWwtZmllbGRzXCIgKm5nSWY9XCJzaG91bGRTaG93QWRkaXRpb25hbEZpZWxkcygpXCI+XG4gICAgICAgICAgICAgICAgICA8Zm9ybWx5LWZvcm0gXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBcbiAgICAgICAgICAgICAgICAgICAgW2ZpZWxkc109XCJhZGRpdGlvbmFsRm9ybWx5RmllbGRzXCIgXG4gICAgICAgICAgICAgICAgICAgIFttb2RlbF09XCJtb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgIChtb2RlbENoYW5nZSk9XCJvbkZvcm1Nb2RlbENoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8L2Zvcm1seS1mb3JtPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gQ3VzdG9tIGZvcm0gYnV0dG9uKHMpIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWJ1dHRvbi1jb250YWluZXJcIiAqbmdJZj1cImFjdGl2ZUN1c3RvbUZvcm1CdXR0b24gJiYgIXVzZVByZWJ1aWx0RmllbGRzKClcIj5cbiAgICAgICAgICAgIDwhLS0gU3VwcG9ydCBib3RoIHNpbmdsZSBidXR0b24gYW5kIGFycmF5IG9mIGJ1dHRvbnMgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNCdXR0b25BcnJheSgpOyBlbHNlIHNpbmdsZUJ1dHRvblwiPlxuICAgICAgICAgICAgICA8c2EtYnV0dG9uIFxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBidXR0b24gb2YgYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiYnV0dG9uLmlkXCJcbiAgICAgICAgICAgICAgICBbdGV4dF09XCJidXR0b24udGV4dFwiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiYnV0dG9uLnR5cGVcIlxuICAgICAgICAgICAgICAgIFtzaXplXT1cImJ1dHRvbi5zaXplXCJcbiAgICAgICAgICAgICAgICBbc3RhdGVdPVwiYnV0dG9uLnN0YXRlXCJcbiAgICAgICAgICAgICAgICBbSW1hZ2VQYXRoXT1cImJ1dHRvbi5JbWFnZVBhdGhcIlxuICAgICAgICAgICAgICAgIFtpY29uUG9zaXRpb25dPVwiYnV0dG9uLmljb25Qb3NpdGlvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQnV0dG9uQ2xpY2soYnV0dG9uKVwiPlxuICAgICAgICAgICAgICA8L3NhLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbmdsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgPHNhLWJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgIFtpZF09XCJhY3RpdmVDdXN0b21Gb3JtQnV0dG9uLmlkXCJcbiAgICAgICAgICAgICAgICBbdGV4dF09XCJhY3RpdmVDdXN0b21Gb3JtQnV0dG9uLnRleHRcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImFjdGl2ZUN1c3RvbUZvcm1CdXR0b24udHlwZVwiXG4gICAgICAgICAgICAgICAgW3NpemVdPVwiYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi5zaXplXCJcbiAgICAgICAgICAgICAgICBbc3RhdGVdPVwiYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi5zdGF0ZVwiXG4gICAgICAgICAgICAgICAgW0ltYWdlUGF0aF09XCJhY3RpdmVDdXN0b21Gb3JtQnV0dG9uLkltYWdlUGF0aFwiXG4gICAgICAgICAgICAgICAgW2ljb25Qb3NpdGlvbl09XCJhY3RpdmVDdXN0b21Gb3JtQnV0dG9uLmljb25Qb3NpdGlvblwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQnV0dG9uQ2xpY2soYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbilcIj5cbiAgICAgICAgICAgICAgPC9zYS1idXR0b24+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgICA8IS0tIERpdmlkZXIgc2VjdGlvbiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlci1zZWN0aW9uXCIgKm5nSWY9XCJhY3RpdmVEaXZpZGVyICYmICF1c2VQcmVidWlsdEZpZWxkcygpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXItaGVhZGVyXCI+XG4gICAgICAgICAgICAgIDxoMyBjbGFzcz1cImRpdmlkZXItdGl0bGVcIiAqbmdJZj1cImFjdGl2ZURpdmlkZXJDb25maWcudGl0bGVcIj57eyBhY3RpdmVEaXZpZGVyQ29uZmlnLnRpdGxlIH19PC9oMz5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJkaXZpZGVyLXN1YnRpdGxlXCIgKm5nSWY9XCJhY3RpdmVEaXZpZGVyQ29uZmlnLnN1YnRpdGxlIHx8IGFjdGl2ZURpdmlkZXJDb25maWcuc2hvd1N1YnRpdGxlV2hlbkVtcHR5XCI+XG4gICAgICAgICAgICAgICAge3sgYWN0aXZlRGl2aWRlckNvbmZpZy5zdWJ0aXRsZSB8fCAnTm8gaXRlbXMgYWRkZWQgeWV0JyB9fVxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gIFxuICAgICAgICAgIDwhLS0gQ2hpcHMgc2VjdGlvbiAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcC1saXN0XCIgKm5nSWY9XCJhY3RpdmVDaGlwcz8ubGVuZ3RoICYmICF1c2VQcmVidWlsdEZpZWxkcygpXCI+XG4gICAgICAgICAgICA8c2EtY2hpcCBcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2hpcCBvZiBhY3RpdmVDaGlwc1wiXG4gICAgICAgICAgICAgICAgW3RleHRdPVwiY2hpcC5sYWJlbCB8fCBjaGlwLnRleHQgfHwgY2hpcFwiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiJ3JlZ3VsYXInXCJcbiAgICAgICAgICAgICAgICBbc3RhdGVdPVwiJ2RlZmF1bHQnXCJcbiAgICAgICAgICAgICAgICBbZmlsbGluZ109XCInZmlsbGVkJ1wiXG4gICAgICAgICAgICAgICAgW2ljb25Qb3NpdGlvbl09XCIncmlnaHQnXCJcbiAgICAgICAgICAgICAgICBbaWNvblBhdGhdPVwiJy4uL2Fzc2V0cy9jbG9zZUJsdWVPdXRsaW5lZC5zdmcnXCJcbiAgICAgICAgICAgICAgICAob25DbGlja0V2ZW50KT1cImNoaXAucmVtb3ZhYmxlID8gb25DaGlwUmVtb3ZlKGNoaXApIDogbnVsbFwiPlxuICAgICAgICAgICAgICA8L3NhLWNoaXA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gIFxuICAgICAgICBAaWYoYnV0dG9ucyl7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24tZ3JvdXBcIj5cbiAgICAgICAgICBAZm9yIChidXR0b24gb2YgYnV0dG9uczsgdHJhY2sgYnV0dG9uLnRleHQpIHtcbiAgICAgICAgICAgIDxzYS1idXR0b24gXG4gICAgICAgICAgICAgIFt0ZXh0XT1cImJ1dHRvbi50ZXh0XCJcbiAgICAgICAgICAgICAgW2ljb25dPVwiYnV0dG9uLmljb25cIlxuICAgICAgICAgICAgICBbc2l6ZV09XCJidXR0b24uc2l6ZVwiXG4gICAgICAgICAgICAgIFt0eXBlXT1cImJ1dHRvbi50eXBlXCJcbiAgICAgICAgICAgICAgW2ljb25Qb3NpdGlvbl09XCJidXR0b24uaWNvblBvc2l0aW9uXCJcbiAgICAgICAgICAgICAgW2J1dHRvbkljb25TaXplXT1cImJ1dHRvbi5idXR0b25JY29uU2l6ZVwiXG4gICAgICAgICAgICAgIChvbkNsaWNrRXZlbnQpPVwib25CdXR0b25DbGljayhidXR0b24sICRldmVudClcIlxuICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW3N0YXRlXT1cIiFhcmVBbGxWaXNpYmxlRmllbGRzRmlsbGVkKCkgPyAnZGlzYWJsZWQnIDogJydcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImJ1dHRvbi50ZXh0XCI+XG4gICAgICAgICAgICA8L3NhLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIH0iXX0=
|
|
510
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1iYW5uZXItdjIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50LWxpYnJhcnkvc3JjL2xpYi9tZXNzYWdlLWJhbm5lci12Mi9tZXNzYWdlLWJhbm5lci12Mi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL21lc3NhZ2UtYmFubmVyLXYyL21lc3NhZ2UtYmFubmVyLXYyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQXFCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFN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V0FBVyxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsYUFDOUwsQ0FBQyxXQUFXLENBQUM7OEJBeUJmLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxpQ0FBaUM7c0JBQXpDLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBa0NJLFdBQVc7c0JBQXBCLE1BQU07Z0JBb0NNLFdBQVc7c0JBQXZCLEtBQUs7Z0JBSU8sZUFBZTtzQkFBM0IsS0FBSztnQkFJTyxLQUFLO3NCQUFqQixLQUFLO2dCQUlPLFdBQVc7c0JBQXZCLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBjb21wdXRlZCwgc2lnbmFsLCBlZmZlY3QsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSWNvblNlcnZpY2UgfSBmcm9tICcuLi9pY29uL2ljb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgSWNvbk5hbWUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2ljb24taW50ZXJmYWNlJztcclxuaW1wb3J0IHsgQnV0dG9uSWNvblBvc2l0aW9uLCBCdXR0b25TaXplLCBCdXR0b25UeXBlLCBCdXR0b25JbnRlcmZhY2UsIEJ1dHRvbkNsaWNrRXZlbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2J1dHRvbi1pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1lc3NhZ2VCYW5uZXJDb21wb25lbnQgfSBmcm9tICcuLi9tZXNzYWdlLWJhbm5lci9tZXNzYWdlLWJhbm5lci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGb3JtSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9mb3JtLWlucHV0L2Zvcm0taW5wdXQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRm9ybVNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0tc2VsZWN0L2Zvcm0tc2VsZWN0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGb3JtbHlNb2R1bGUsIEZvcm1seUZpZWxkQ29uZmlnIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XHJcbmltcG9ydCB7IENoaXBzQ29tcG9uZW50IH0gZnJvbSAnLi4vY2hpcHMvY2hpcHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRm9ybUxheW91dENvbmZpZywgRm9ybUZpZWxkQ29uZmlnLCBVbmlmaWVkRm9ybUNvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZm9ybS1sYXlvdXQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmludGVyZmFjZSBNZXNzYWdlQmFubmVyU3RhdGUge1xyXG4gIHR5cGU6ICdkZWZhdWx0JyB8ICdjb25uZWN0aW9uJyB8ICdhY2Nlc3MnIHwgJ2FjY2Vzc1Jlc3RyaWN0ZWQnO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb246IHN0cmluZztcclxuICBtZXNzYWdlSWNvbjogc3RyaW5nO1xyXG4gIG1lc3NhZ2VJY29uU2l6ZT86IHtcclxuICAgIHdpZHRoPzogc3RyaW5nO1xyXG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xyXG4gIH07XHJcbiAgc3BhY2luZ0JldHdlZW5JbWFnZUFuZERlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG4gIGNvbnRlbnRHYXA/OiBzdHJpbmc7IFxyXG4gIGNvbnRhY3RVcmw/OiBzdHJpbmc7XHJcbiAgdGl0bGVDbGFzcz86IHN0cmluZztcclxuICBkZXNjcmlwdGlvbkNsYXNzPzogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NhLW1lc3NhZ2UtYmFubmVyLXYyJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEljb25Db21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudCwgSHR0cENsaWVudE1vZHVsZSxNZXNzYWdlQmFubmVyQ29tcG9uZW50LCBGb3JtSW5wdXRDb21wb25lbnQsIEZvcm1TZWxlY3RDb21wb25lbnQsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3JtbHlNb2R1bGUsIENoaXBzQ29tcG9uZW50XSxcclxuICBwcm92aWRlcnM6IFtJY29uU2VydmljZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL21lc3NhZ2UtYmFubmVyLXYyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9tZXNzYWdlLWJhbm5lci12Mi5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VCYW5uZXJWMkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgLy8gU3RhdGUgbWFuYWdlbWVudCB1c2luZyBzaWduYWxzXHJcbiAgcHJpdmF0ZSBzdGF0ZSA9IHNpZ25hbDxNZXNzYWdlQmFubmVyU3RhdGU+KHtcclxuICAgIHR5cGU6ICdkZWZhdWx0JyxcclxuICAgIHRpdGxlOiAnJyxcclxuICAgIGRlc2NyaXB0aW9uOiAnJyxcclxuICAgIG1lc3NhZ2VJY29uOiAnJyxcclxuICAgIG1lc3NhZ2VJY29uU2l6ZToge1xyXG4gICAgICBoZWlnaHQ6ICcxMi41cmVtJ1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzXHJcbiAgcHJvdGVjdGVkIGJhbm5lckNvbnRlbnQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnN0YXRlKCk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5jdXJyZW50U3RhdGUsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnNhbml0aXplRGVzY3JpcHRpb24oY3VycmVudFN0YXRlLmRlc2NyaXB0aW9uKVxyXG4gICAgfTtcclxuICB9KTtcclxuXHJcbiAgQElucHV0KCkgbWVzc2FnZVR5cGU6ICdkZWZhdWx0JyB8ICdjb25uZWN0aW9uJyB8ICdhY2Nlc3MnIHwgJ2FjY2Vzc1Jlc3RyaWN0ZWQnO1xyXG4gIEBJbnB1dCgpIGNvbnRhY3RVcmw/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc3BhY2luZ0JldHdlZW5JbWFnZUFuZERlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNvbnRlbnRHYXA/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdGl0bGVDbGFzcz86IHN0cmluZztcclxuICBASW5wdXQoKSBkZXNjcmlwdGlvbkNsYXNzPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGJhbm5lcjphbnkgPSB7fTtcclxuICBASW5wdXQoKSBmb3JtQ29uZmlnOiBVbmlmaWVkRm9ybUNvbmZpZyB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIHByZWJ1aWx0Rm9ybUZpZWxkczogVGVtcGxhdGVSZWY8YW55PiBcclxuICBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcbiAgbW9kZWw6IGFueSA9IHt9O1xyXG4gIGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xyXG4gIGZvcm1seUZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xyXG4gIGFsbEZpZWxkc0ZpbGxlZCA9IHNpZ25hbChmYWxzZSk7XHJcbiAgYWRkaXRpb25hbEZvcm1seUZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xyXG4gIGFsbEZvcm1seUZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xyXG4gIHVzZVByZWJ1aWx0RmllbGRzID0gc2lnbmFsKGZhbHNlKTtcclxuICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzIGZvciB1bmlmaWVkIGFjY2Vzc1xyXG4gIGdldCBhY3RpdmVGb3JtSW5wdXRzKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWc/LmZpZWxkcyB8fCBbXTtcclxuICB9XHJcblxyXG4gIGdldCBhY3RpdmVDaGlwcygpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnPy5jaGlwcyB8fCBbXTtcclxuICB9XHJcblxyXG4gIGdldCBhY3RpdmVDdXN0b21Gb3JtQnV0dG9uKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnPy5jdXN0b21CdXR0b24gfHwgW107XHJcbiAgfVxyXG5cclxuICBnZXQgYWN0aXZlRGl2aWRlcigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWc/LmRpdmlkZXI/LmVuYWJsZWQgPz8gZmFsc2U7XHJcbiAgfSBcclxuXHJcbiAgZ2V0IGFjdGl2ZURpdmlkZXJDb25maWcoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWc/LmRpdmlkZXIgfHwge307XHJcbiAgfVxyXG5cclxuICBnZXQgYWN0aXZlRm9ybUxheW91dCgpOiBGb3JtTGF5b3V0Q29uZmlnIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWc/LmxheW91dCB8fCB7fTtcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKSBvbkZvcm1FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8e3R5cGU6IHN0cmluZywgZGF0YTogYW55fT4oKTtcclxuICBcclxuICBvbkNoaXBSZW1vdmUoY2hpcDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uRm9ybUV2ZW50LmVtaXQoeyB0eXBlOiAnY2hpcC1yZW1vdmUnLCBkYXRhOiBjaGlwIH0pO1xyXG4gIH1cclxuICBcclxuICBvbkFkZFVzZXIoKTogdm9pZCB7XHJcbiAgICBsZXQgY2xpY2tlZEJ1dHRvbiA9IHRoaXMuYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbjtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbikpIHtcclxuICAgICAgY2xpY2tlZEJ1dHRvbiA9IHRoaXMuYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi5maW5kKGJ0biA9PiBcclxuICAgICAgICBidG4udGV4dCA9PT0gJ0FkZCBVc2VyJyB8fCBidG4uaWQgPT09ICdhZGQtdXNlcicgfHwgYnRuLmFjdGlvbiA9PT0gJ2FkZC11c2VyJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbkZvcm1FdmVudC5lbWl0KHsgdHlwZTogJ2N1c3RvbS1idXR0b24tY2xpY2snLCBkYXRhOiBjbGlja2VkQnV0dG9uIH0pO1xyXG4gICAgLy8gT25seSByZXNldCBmb3JtIGlmIGV4cGxpY2l0bHkgY29uZmlndXJlZCB0byBkbyBzb1xyXG4gICAgaWYgKGNsaWNrZWRCdXR0b24/LnJlc2V0Rm9ybSAhPT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5yZXNldEZvcm0oKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgLy8gU2VwYXJhdGUgbWV0aG9kIGZvciBmb3JtIHJlc2V0IHRoYXQgY2FuIGJlIGNhbGxlZCBleHRlcm5hbGx5XHJcbiAgcmVzZXRGb3JtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RlbCA9IHt9O1xyXG4gICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICB0aGlzLmFjdGl2ZUZvcm1JbnB1dHM/LmZvckVhY2goaW5wdXQgPT4ge1xyXG4gICAgICBpbnB1dC52YWx1ZSA9ICcnO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm1seUZpZWxkcygpO1xyXG4gIH1cclxuICBcclxuICBhcmVBbGxGaWVsZHNGaWxsZWQoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuYWN0aXZlRm9ybUlucHV0cyB8fCB0aGlzLmFjdGl2ZUZvcm1JbnB1dHMubGVuZ3RoIDwgNCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlRm9ybUlucHV0cy5ldmVyeShmaWVsZCA9PiBmaWVsZC52YWx1ZSAmJiBmaWVsZC52YWx1ZS50cmltKCkgIT09ICcnKTtcclxuICB9XHJcbiAgXHJcblxyXG4gIEBJbnB1dCgpIHNldCBtZXNzYWdlSWNvbih2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7IC4uLnMsIG1lc3NhZ2VJY29uOiB2YWx1ZSB9KSk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgbWVzc2FnZUljb25TaXplKHZhbHVlOiB7IHdpZHRoPzogc3RyaW5nOyBoZWlnaHQ/OiBzdHJpbmcgfSkge1xyXG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoeyAuLi5zLCBtZXNzYWdlSWNvblNpemU6IHZhbHVlIH0pKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCB0aXRsZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7IC4uLnMsIHRpdGxlOiB2YWx1ZSB9KSk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgZGVzY3JpcHRpb24odmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoeyAuLi5zLCBkZXNjcmlwdGlvbjogdmFsdWUgfSkpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgYnV0dG9uczogQnV0dG9uSW50ZXJmYWNlW10gPSBbXTtcclxuICBAT3V0cHV0KCkgYnV0dG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPEJ1dHRvbkNsaWNrRXZlbnQ+KCk7XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGluaXRpYWxpemF0aW9uIG9yIGlmIG1lc3NhZ2VUeXBlIGhhcyBjaGFuZ2VkXHJcbiAgICBjb25zdCBzaG91bGRVcGRhdGVCYXNlZE9uVHlwZSA9IGNoYW5nZXNbJ21lc3NhZ2VUeXBlJ10gJiYgXHJcbiAgICAgIC8vIE9ubHkgdXBkYXRlIGJhc2VkIG9uIHR5cGUgaWYgd2UgZG9uJ3QgaGF2ZSBjdXN0b20gdmFsdWVzIHNldFxyXG4gICAgICAhKHRoaXMuc3RhdGUoKS50aXRsZSB8fCB0aGlzLnN0YXRlKCkuZGVzY3JpcHRpb24gfHwgdGhpcy5zdGF0ZSgpLm1lc3NhZ2VJY29uKTtcclxuICAgIFxyXG4gICAgaWYgKHNob3VsZFVwZGF0ZUJhc2VkT25UeXBlKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlQ29udGVudEJhc2VkT25UeXBlKHRoaXMubWVzc2FnZVR5cGUgfHwgJ2RlZmF1bHQnKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gQ2hlY2sgaWYgcHJlYnVpbHQgZmllbGRzIGFyZSBwcm92aWRlZFxyXG4gICAgaWYgKGNoYW5nZXNbJ3ByZWJ1aWx0Rm9ybUZpZWxkcyddKSB7XHJcbiAgICAgIHRoaXMudXNlUHJlYnVpbHRGaWVsZHMuc2V0KCEhdGhpcy5wcmVidWlsdEZvcm1GaWVsZHMpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAoY2hhbmdlc1snZm9ybUNvbmZpZyddKSB7XHJcbiAgICAgIGlmICghdGhpcy51c2VQcmVidWlsdEZpZWxkcygpKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlGaWVsZHMoKTtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVDbGVhbkZvcm1TdGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNsZWFuRm9ybVN0YXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RlbCA9IHt9O1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcclxuICAgICAgICAgIGNvbnRyb2wubWFya0FzVW50b3VjaGVkKCk7XHJcbiAgICAgICAgICBjb250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgICBjb250cm9sLnNldEVycm9ycyhudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnRCYXNlZE9uVHlwZSh0eXBlOiAnZGVmYXVsdCcgfCAnY29ubmVjdGlvbicgfCAnYWNjZXNzJyB8ICdhY2Nlc3NSZXN0cmljdGVkJykgeyAgXHJcbiAgICAvLyBEZWZpbmUgYSB0eXBlIGZvciB0aGUgY29udGVudCBpdGVtcyB0byBlbnN1cmUgYWxsIHByb3BlcnRpZXMgYXJlIHByb3Blcmx5IHR5cGVkXHJcbiAgICB0eXBlIENvbnRlbnRJdGVtID0ge1xyXG4gICAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gICAgICBtZXNzYWdlSWNvbjogc3RyaW5nO1xyXG4gICAgICBzcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbiAgICAgIGNvbnRlbnRHYXA/OiBzdHJpbmc7XHJcbiAgICAgIHRpdGxlQ2xhc3M/OiBzdHJpbmc7XHJcbiAgICAgIGRlc2NyaXB0aW9uQ2xhc3M/OiBzdHJpbmc7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIE9ubHkgYXBwbHkgZGVmYXVsdCBjb250ZW50IGlmIGN1c3RvbSBjb250ZW50IGhhc24ndCBiZWVuIHByb3ZpZGVkXHJcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnN0YXRlKCk7XHJcbiAgICBjb25zdCBjb250ZW50OiBSZWNvcmQ8J2RlZmF1bHQnIHwgJ2Nvbm5lY3Rpb24nIHwgJ2FjY2VzcycgfCAnYWNjZXNzUmVzdHJpY3RlZCcsIENvbnRlbnRJdGVtPiA9IHtcclxuICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgIHRpdGxlOiAnT29wcyEgU29tZXRoaW5nIHdlbnQgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4gb3IgdHJ5IGFmdGVyIHNvbWUgdGltZScsXHJcbiAgICAgICAgZGVzY3JpcHRpb246ICdJZiB0aGUgaXNzdWUgcGVyc2lzdHMsIGNvbnRhY3Qgb3VyIHN1cHBvcnQgdGVhbSBhdCA8c3BhbiBjbGFzcz1cInN1cHBvcnQtZW1haWxcIj5zdXBwb3J0QHNhcmFzYW5hbHl0aWNzLmNvbTwvc3Bhbj4nLFxyXG4gICAgICAgIG1lc3NhZ2VJY29uOiAnL2Fzc2V0cy9lcnJvci5naWYnXHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbm5lY3Rpb246IHtcclxuICAgICAgICB0aXRsZTogJ1dlXFwncmUgaGF2aW5nIHRyb3VibGUgY29ubmVjdGluZy4gUGxlYXNlIGNoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluJyxcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ1lvdSBjYW4gYWxzbyByZWFjaCBvdXQgdG8gb3VyIHN1cHBvcnQgdGVhbSBhdCA8c3BhbiBjbGFzcz1cInN1cHBvcnQtZW1haWxcIj5zdXBwb3J0QHNhcmFzYW5hbHl0aWNzLmNvbTwvc3Bhbj4gZm9yIGFzc2lzdGFuY2UnLFxyXG4gICAgICAgIG1lc3NhZ2VJY29uOiAnL2Fzc2V0cy9sb3N0LWNvbm5lY3Rpb24uZ2lmJ1xyXG4gICAgICB9LFxyXG4gICAgICBhY2Nlc3M6IHtcclxuICAgICAgICB0aXRsZTogJ1RoaXMgaXMgdGFraW5nIGEgYml0IGxvbmdlciB0aGFuIHVzdWFsLiBQbGVhc2UgaG9sZCBvbiEnLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnSWYgdGhlIGRlbGF5IGNvbnRpbnVlcywgY2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgcmVmcmVzaGluZyB0aGUgcGFnZS4nLFxyXG4gICAgICAgIG1lc3NhZ2VJY29uOiAnL2Fzc2V0cy9sb25nLWxvYWRpbmcuZ2lmJ1xyXG4gICAgICB9LFxyXG4gICAgICBhY2Nlc3NSZXN0cmljdGVkOiB7XHJcbiAgICAgICAgdGl0bGU6ICdBY2Nlc3MgUmVzdHJpY3RlZCEnLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTG9va3MgbGlrZSB5b3UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhpcyBtb2R1bGUganVzdCB5ZXQuIE5vIHdvcnJpZXPigJRyZWFjaCBvdXQgdG8geW91ciBhZG1pbiB0byByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGZlYXR1cmUuIElmIHlvdSdyZSBmYWNpbmcgYW55IGlzc3VlcywgZmVlbCBmcmVlIHRvIDxhIGNsYXNzPVwiY3VzdG9tLWNvbnRhY3QtbGlua1wiIGhyZWY9XCIke3RoaXMuY29udGFjdFVybCA/PyAnaHR0cHM6Ly9zdXBwb3J0LmRlZmF1bHQuY29tJ31cIiB0YXJnZXQ9XCJfYmxhbmtcIj5Db250YWN0IFVzPC9hPi5gLFxyXG4gICAgICAgIG1lc3NhZ2VJY29uOiAnL2Fzc2V0cy9hY2Nlc3MtcmVzdHJpY3RlZC5naWYnLFxyXG4gICAgICAgIHNwYWNpbmdCZXR3ZWVuSW1hZ2VBbmREZXNjcmlwdGlvbjogJzBweCcsXHJcbiAgICAgICAgY29udGVudEdhcDonMjBweCcsXHJcbiAgICAgICAgdGl0bGVDbGFzczogJ2FjY2Vzcy1yZXN0cmljdGVkLXRpdGxlJyxcclxuICAgICAgICBkZXNjcmlwdGlvbkNsYXNzOiAnYWNjZXNzLXJlc3RyaWN0ZWQtZGVzY3JpcHRpb24nLFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudFt0eXBlXTtcclxuXHJcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7XHJcbiAgICAgIC4uLnMsXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIC8vIE9ubHkgYXBwbHkgZGVmYXVsdCB2YWx1ZXMgaWYgY3VzdG9tIHZhbHVlcyBoYXZlbid0IGJlZW4gcHJvdmlkZWRcclxuICAgICAgdGl0bGU6IHMudGl0bGUgfHwgY29udGVudEl0ZW0udGl0bGUsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiBzLmRlc2NyaXB0aW9uIHx8IGNvbnRlbnRJdGVtLmRlc2NyaXB0aW9uLFxyXG4gICAgICBtZXNzYWdlSWNvbjogcy5tZXNzYWdlSWNvbiB8fCBjb250ZW50SXRlbS5tZXNzYWdlSWNvbixcclxuICAgICAgLy8gRm9yIG90aGVyIHByb3BlcnRpZXMsIG9ubHkgYXBwbHkgdGhlbSBpZiB0aGV5IGV4aXN0IGluIHRoZSBjb250ZW50SXRlbVxyXG4gICAgICAuLi4oY29udGVudEl0ZW0uc3BhY2luZ0JldHdlZW5JbWFnZUFuZERlc2NyaXB0aW9uICYmIHsgc3BhY2luZ0JldHdlZW5JbWFnZUFuZERlc2NyaXB0aW9uOiBjb250ZW50SXRlbS5zcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb24gfSksXHJcbiAgICAgIC4uLihjb250ZW50SXRlbS5jb250ZW50R2FwICYmIHsgY29udGVudEdhcDogY29udGVudEl0ZW0uY29udGVudEdhcCB9KSxcclxuICAgICAgLi4uKGNvbnRlbnRJdGVtLnRpdGxlQ2xhc3MgJiYgeyB0aXRsZUNsYXNzOiBjb250ZW50SXRlbS50aXRsZUNsYXNzIH0pLFxyXG4gICAgICAuLi4oY29udGVudEl0ZW0uZGVzY3JpcHRpb25DbGFzcyAmJiB7IGRlc2NyaXB0aW9uQ2xhc3M6IGNvbnRlbnRJdGVtLmRlc2NyaXB0aW9uQ2xhc3MgfSlcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2FuaXRpemVEZXNjcmlwdGlvbihkZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBkZXNjcmlwdGlvbi5yZXBsYWNlKFxyXG4gICAgICAvc3VwcG9ydEBzYXJhc2FuYWx5dGljc1xcLmNvbS9nLFxyXG4gICAgICAnPHNwYW4gY2xhc3M9XCJzdXBwb3J0LWVtYWlsXCI+c3VwcG9ydEBzYXJhc2FuYWx5dGljcy5jb208L3NwYW4+J1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9uQnV0dG9uQ2xpY2soYnV0dG9uOiBhbnksIGV2ZW50PzogRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBmb3JtIGJ1dHRvbiAoZnJvbSBhY3RpdmVDdXN0b21Gb3JtQnV0dG9uKSBvciByZWd1bGFyIGJhbm5lciBidXR0b25cclxuICAgIGlmICghZXZlbnQgJiYgKGJ1dHRvbi5hY3Rpb24gPT09ICdzdWJtaXQnIHx8IGJ1dHRvbi5hY3Rpb24gPT09ICdsaW5rJyB8fCBidXR0b24uaWQgPT09ICdhZGQtdXNlcicgfHwgYnV0dG9uLmlkID09PSAnbGVhcm4tbW9yZScpKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBmb3JtIGJ1dHRvbnMgd2l0aCBuZXcgbG9naWNcclxuICAgICAgaWYgKCBidXR0b24uaWQgPT09ICdhZGQtdXNlcicpIHtcclxuICAgICAgICAvLyBIYW5kbGUgZm9ybSBzdWJtaXNzaW9uIChleGlzdGluZyBBZGQgVXNlciBmdW5jdGlvbmFsaXR5KVxyXG4gICAgICAgIHRoaXMub25BZGRVc2VyKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoYnV0dG9uLmFjdGlvbiA9PT0gJ2xpbmsnICYmIGJ1dHRvbi5saW5rKSB7XHJcbiAgICAgICAgLy8gSGFuZGxlIGxpbmsgbmF2aWdhdGlvbiAoTGVhcm4gTW9yZSBmdW5jdGlvbmFsaXR5KVxyXG4gICAgICAgIHdpbmRvdy5vcGVuKGJ1dHRvbi5saW5rLCAnX2JsYW5rJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoYnV0dG9uLm9uQ2xpY2spIHtcclxuICAgICAgICAvLyBIYW5kbGUgY3VzdG9tIGNsaWNrIGZ1bmN0aW9uXHJcbiAgICAgICAgYnV0dG9uLm9uQ2xpY2soKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChldmVudCkge1xyXG4gICAgICAvLyBIYW5kbGUgcmVndWxhciBiYW5uZXIgYnV0dG9ucyB3aXRoIG9yaWdpbmFsIGxvZ2ljIChiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxyXG4gICAgICB0aGlzLmJ1dHRvbkNsaWNrLmVtaXQoe1xyXG4gICAgICAgIHR5cGU6IGJ1dHRvbi50eXBlIGFzICdwcmltYXJ5JyB8ICdzZWNvbmRhcnknLFxyXG4gICAgICAgIGJ1dHRvbixcclxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzQnV0dG9uQXJyYXkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLmFjdGl2ZUN1c3RvbUZvcm1CdXR0b24pO1xyXG4gIH1cclxuXHJcbiAgaXNFbXB0eU9iamVjdChvYmo6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKG9iaikge1xyXG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZvcm1seUZpZWxkcygpOiB2b2lkIHtcclxuICAgIC8vIFNraXAgRm9ybWx5IGZpZWxkIGdlbmVyYXRpb24gaWYgdXNpbmcgcHJlYnVpbHQgZmllbGRzXHJcbiAgICBpZiAodGhpcy51c2VQcmVidWlsdEZpZWxkcygpKSB7XHJcbiAgICAgIHRoaXMuZm9ybWx5RmllbGRzID0gW107XHJcbiAgICAgIHRoaXMuYWxsRm9ybWx5RmllbGRzID0gW107XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuZm9ybUNvbmZpZyB8fCAhdGhpcy5mb3JtQ29uZmlnLmZpZWxkcyB8fCB0aGlzLmZvcm1Db25maWcuZmllbGRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmZvcm1seUZpZWxkcyA9IFtdO1xyXG4gICAgICB0aGlzLmFsbEZvcm1seUZpZWxkcyA9IFtdO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gR2V0IGxheW91dCBjb25maWd1cmF0aW9uXHJcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmFjdGl2ZUZvcm1MYXlvdXQ7XHJcbiAgICBjb25zdCBmaWVsZHNQZXJSb3cgPSBsYXlvdXQuZmllbGRzUGVyUm93IHx8IDI7XHJcbiAgICBjb25zdCBpbml0aWFsVmlzaWJsZUZpZWxkcyA9IGxheW91dC5pbml0aWFsVmlzaWJsZUZpZWxkcyB8fCBmaWVsZHNQZXJSb3c7XHJcbiAgICBcclxuICAgIC8vIFVwZGF0ZSBDU1MgZ3JpZCBjb2x1bW5zIGR5bmFtaWNhbGx5XHJcbiAgICB0aGlzLnVwZGF0ZUdyaWRDb2x1bW5zKGZpZWxkc1BlclJvdyk7XHJcbiAgICBcclxuICAgIC8vIENyZWF0ZSBhbGwgZmllbGRzIHdpdGggcHJvcGVyIGhpZGUgZXhwcmVzc2lvbnMgZm9yIGNvbmRpdGlvbmFsIGZpZWxkc1xyXG4gICAgdGhpcy5hbGxGb3JtbHlGaWVsZHMgPSB0aGlzLmZvcm1Db25maWcuZmllbGRzLm1hcCgoZmllbGQsIGluZGV4KSA9PiB7XHJcbiAgICAgIC8vIE5vcm1hbGl6ZSBmaWVsZCBzdHJ1Y3R1cmUgdG8gcHJvcGVyIEZvcm1seSBmb3JtYXRcclxuICAgICAgY29uc3QgcGxhY2Vob2xkZXJWYWx1ZSA9IGZpZWxkLnBsYWNlaG9sZGVyIHx8IGZpZWxkLnByb3BzPy5wbGFjZWhvbGRlciB8fCBmaWVsZC5wYXJhbXM/LnBsYWNlaG9sZGVyIHx8IGZpZWxkLnByb3BzPy5wYXJhbXM/LnBsYWNlaG9sZGVyIHx8ICcnO1xyXG4gICAgICBcclxuICAgICAgY29uc3QgaXNDb25kaXRpb25hbEZpZWxkID0gaW5kZXggPj0gaW5pdGlhbFZpc2libGVGaWVsZHM7XHJcbiAgICAgIFxyXG4gICAgICBjb25zdCBmb3JtbHlGaWVsZDogRm9ybWx5RmllbGRDb25maWcgPSB7XHJcbiAgICAgICAga2V5OiBmaWVsZC5rZXksXHJcbiAgICAgICAgdHlwZTogZmllbGQudHlwZSxcclxuICAgICAgICBjbGFzc05hbWU6IHRoaXMuZ2V0RmllbGRDbGFzc05hbWUoaW5kZXggJSBmaWVsZHNQZXJSb3csIGZpZWxkc1BlclJvdyksXHJcbiAgICAgICAgaGlkZUV4cHJlc3Npb246IGlzQ29uZGl0aW9uYWxGaWVsZCA/ICgpID0+ICF0aGlzLnNob3VsZFNob3dBZGRpdGlvbmFsRmllbGRzKCkgOiBmYWxzZSxcclxuICAgICAgICBwcm9wczoge1xyXG4gICAgICAgICAgLy8gSGFuZGxlIG1peGVkIHN0cnVjdHVyZSAtIHNvbWUgZmllbGRzIGhhdmUgcHJvcHMgYXQgcm9vdCwgb3RoZXJzIG5lc3RlZFxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IHBsYWNlaG9sZGVyVmFsdWUsXHJcbiAgICAgICAgICByZXF1aXJlZDogZmllbGQucmVxdWlyZWQgfHwgZmllbGQucHJvcHM/LnJlcXVpcmVkIHx8IGZhbHNlLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IGZpZWxkLmRpc2FibGVkIHx8IGZpZWxkLnByb3BzPy5kaXNhYmxlZCB8fCBmYWxzZSxcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgLy8gRm9yIHNlbGVjdCBmaWVsZHMsIGluY2x1ZGUgc2VsZWN0LXNwZWNpZmljIHByb3BlcnRpZXNcclxuICAgICAgICAgIC4uLihmaWVsZC5wcm9wcz8ub3B0aW9ucyAmJiB7XHJcbiAgICAgICAgICAgIG9wdGlvbnM6IGZpZWxkLnByb3BzLm9wdGlvbnMsXHJcbiAgICAgICAgICAgIG11bHRpcGxlOiBmaWVsZC5wcm9wcy5tdWx0aXBsZSB8fCBmYWxzZSxcclxuICAgICAgICAgICAgYmluZExhYmVsOiBmaWVsZC5wcm9wcy5wYXJhbXM/LmJpbmRMYWJlbCB8fCAnbGFiZWwnLFxyXG4gICAgICAgICAgICBiaW5kVmFsdWU6IGZpZWxkLnByb3BzLnBhcmFtcz8uYmluZFZhbHVlIHx8ICd2YWx1ZScsXHJcbiAgICAgICAgICAgIGlzQ2xlYXJhYmxlOiBmaWVsZC5wcm9wcy5wYXJhbXM/LmlzQ2xlYXJhYmxlICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgc2hvd0NoZWNrYm94ZXM6IGZpZWxkLnByb3BzLnBhcmFtcz8uc2hvd0NoZWNrYm94ZXMgfHwgZmFsc2VcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAvLyBJbmNsdWRlIHBhcmFtcyBmb3IgY29tcG9uZW50LXNwZWNpZmljIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICAgIHBhcmFtczoge1xyXG4gICAgICAgICAgICAuLi4oZmllbGQucGFyYW1zIHx8IHt9KSxcclxuICAgICAgICAgICAgLi4uKGZpZWxkLnByb3BzPy5wYXJhbXMgfHwge30pLFxyXG4gICAgICAgICAgICAvLyBFbnN1cmUgbGFiZWwgYW5kIHBsYWNlaG9sZGVyIGFyZSBzZXRcclxuICAgICAgICAgICAgbGFiZWw6IGZpZWxkLmxhYmVsIHx8IGZpZWxkLnByb3BzPy5wYXJhbXM/LmxhYmVsIHx8IHBsYWNlaG9sZGVyVmFsdWUsXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwbGFjZWhvbGRlclZhbHVlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB2YWxpZGF0b3JzOiB0aGlzLmdldEZvcm1seVZhbGlkYXRvcnMoZmllbGQpLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWUgaWYgcHJvdmlkZWRcclxuICAgICAgaWYgKGZpZWxkLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLm1vZGVsW2ZpZWxkLmtleSBhcyBzdHJpbmddID0gZmllbGQudmFsdWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEFkZCBmb3JtIGNvbnRyb2wgdG8gZm9ybSBncm91cCBpZiBub3QgYWxyZWFkeSBwcmVzZW50XHJcbiAgICAgIGNvbnN0IGtleSA9IGZpZWxkLmtleSBhcyBzdHJpbmc7XHJcbiAgICAgIGlmICghdGhpcy5mb3JtLmdldChrZXkpKSB7XHJcbiAgICAgICAgbGV0IGZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcclxuICAgICAgICBpZiAoZmllbGQuZm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgIGZvcm1Db250cm9sID0gZmllbGQuZm9ybUNvbnRyb2w7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBmaWVsZC5wYXJhbXM/LnZhbGlkYXRvcnMgfHwgW107XHJcbiAgICAgICAgICBmb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChmaWVsZC52YWx1ZSB8fCAnJywgdmFsaWRhdG9ycyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGtleSwgZm9ybUNvbnRyb2wpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZm9ybWx5RmllbGQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmZvcm1seUZpZWxkcyA9IHRoaXMuYWxsRm9ybWx5RmllbGRzLnNsaWNlKDAsIGluaXRpYWxWaXNpYmxlRmllbGRzKTtcclxuICAgIHRoaXMudXBkYXRlQWRkaXRpb25hbEZpZWxkcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWVsZENsYXNzTmFtZShpbmRleDogbnVtYmVyLCBmaWVsZHNQZXJSb3c6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjb2xTaXplID0gMTIgLyBmaWVsZHNQZXJSb3c7XHJcbiAgICByZXR1cm4gYGNvbC0ke2NvbFNpemV9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlR3JpZENvbHVtbnMoZmllbGRzUGVyUm93OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIC8vIFVzZSBDU1MgY3VzdG9tIHByb3BlcnR5IHRvIGR5bmFtaWNhbGx5IHVwZGF0ZSBncmlkIGNvbHVtbnNcclxuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1mb3JtLWdyaWQtY29sdW1ucycsIGZpZWxkc1BlclJvdy50b1N0cmluZygpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9ybWx5VmFsaWRhdG9ycyhmaWVsZDogYW55KTogYW55IHtcclxuICAgIGNvbnN0IHZhbGlkYXRvcnM6IGFueSA9IHt9O1xyXG4gICAgXHJcbiAgICBpZiAoZmllbGQuZm9ybUNvbnRyb2wgJiYgZmllbGQuZm9ybUNvbnRyb2wudmFsaWRhdG9yKSB7XHJcbiAgICAgIHZhbGlkYXRvcnMudmFsaWRhdGlvbiA9IGZpZWxkLmZvcm1Db250cm9sLnZhbGlkYXRvcjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKGZpZWxkLnBhcmFtcz8udmFsaWRhdG9ycyAmJiBBcnJheS5pc0FycmF5KGZpZWxkLnBhcmFtcy52YWxpZGF0b3JzKSkge1xyXG4gICAgICB2YWxpZGF0b3JzLnZhbGlkYXRpb24gPSBmaWVsZC5wYXJhbXMudmFsaWRhdG9ycztcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKGZpZWxkLnZhbGlkYXRvcnMpIHtcclxuICAgICAgaWYgKGZpZWxkLnZhbGlkYXRvcnMudmFsaWRhdGlvbikge1xyXG4gICAgICAgIHZhbGlkYXRvcnMudmFsaWRhdGlvbiA9IGZpZWxkLnZhbGlkYXRvcnMudmFsaWRhdGlvbjtcclxuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpZWxkLnZhbGlkYXRvcnMpKSB7XHJcbiAgICAgICAgdmFsaWRhdG9ycy52YWxpZGF0aW9uID0gZmllbGQudmFsaWRhdG9ycztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gdmFsaWRhdG9ycztcclxuICB9XHJcblxyXG5cclxuICBzaG91bGRTaG93QWRkaXRpb25hbEZpZWxkcygpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5hY3RpdmVGb3JtSW5wdXRzIHx8IHRoaXMuYWN0aXZlRm9ybUlucHV0cy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcclxuICAgIFxyXG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5hY3RpdmVGb3JtTGF5b3V0O1xyXG4gICAgY29uc3QgaW5pdGlhbFZpc2libGVGaWVsZHMgPSBsYXlvdXQuaW5pdGlhbFZpc2libGVGaWVsZHMgfHwgbGF5b3V0LmZpZWxkc1BlclJvdyB8fCAyO1xyXG4gICAgXHJcbiAgICAvLyBJZiBubyBjb25kaXRpb25hbCBmaWVsZHMgY29uZmlndXJhdGlvbiwgY2hlY2sgaWYgaW5pdGlhbCBmaWVsZHMgYXJlIGZpbGxlZFxyXG4gICAgaWYgKCFsYXlvdXQuY29uZGl0aW9uYWxGaWVsZHMpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXJlQWxsVmlzaWJsZUZpZWxkc0ZpbGxlZCgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBVc2UgY3VzdG9tIHNob3dXaGVuIGZ1bmN0aW9uIGlmIHByb3ZpZGVkXHJcbiAgICBjb25zdCBzaG91bGRTaG93ID0gbGF5b3V0LmNvbmRpdGlvbmFsRmllbGRzLnNob3dXaGVuID8gXHJcbiAgICAgIGxheW91dC5jb25kaXRpb25hbEZpZWxkcy5zaG93V2hlbih0aGlzLm1vZGVsKSA6IHRoaXMuYXJlQWxsVmlzaWJsZUZpZWxkc0ZpbGxlZCgpO1xyXG4gICAgcmV0dXJuIHNob3VsZFNob3c7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUFkZGl0aW9uYWxGaWVsZHMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmFjdGl2ZUZvcm1MYXlvdXQ7XHJcbiAgICBjb25zdCBmaWVsZHNQZXJSb3cgPSBsYXlvdXQuZmllbGRzUGVyUm93IHx8IDI7XHJcbiAgICBjb25zdCBpbml0aWFsVmlzaWJsZUZpZWxkcyA9IGxheW91dC5pbml0aWFsVmlzaWJsZUZpZWxkcyB8fCBmaWVsZHNQZXJSb3c7XHJcbiAgICBcclxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBzaG93IGFkZGl0aW9uYWwgZmllbGRzXHJcbiAgICBjb25zdCBzaG91bGRTaG93Q29uZGl0aW9uYWxGaWVsZHMgPSB0aGlzLnNob3VsZFNob3dBZGRpdGlvbmFsRmllbGRzKCk7XHJcbiAgICBcclxuICAgIGlmIChzaG91bGRTaG93Q29uZGl0aW9uYWxGaWVsZHMgJiYgdGhpcy5mb3JtQ29uZmlnLmZpZWxkcy5sZW5ndGggPiBpbml0aWFsVmlzaWJsZUZpZWxkcykge1xyXG4gICAgICAvLyBHZXQgc3BlY2lmaWMgY29uZGl0aW9uYWwgZmllbGQgaW5kaWNlcyBvciBhbGwgcmVtYWluaW5nIGZpZWxkc1xyXG4gICAgICBjb25zdCBjb25kaXRpb25hbEZpZWxkSW5kaWNlcyA9IGxheW91dC5jb25kaXRpb25hbEZpZWxkcz8uZmllbGRzIHx8IFxyXG4gICAgICAgIEFycmF5LmZyb20oe2xlbmd0aDogdGhpcy5mb3JtQ29uZmlnLmZpZWxkcy5sZW5ndGggLSBpbml0aWFsVmlzaWJsZUZpZWxkc30sIChfLCBpKSA9PiBpICsgaW5pdGlhbFZpc2libGVGaWVsZHMpO1xyXG4gICAgICBcclxuICAgICAgY29uc3QgYWRkaXRpb25hbEZpZWxkcyA9IGNvbmRpdGlvbmFsRmllbGRJbmRpY2VzLm1hcChpbmRleCA9PiB0aGlzLmZvcm1Db25maWcuZmllbGRzW2luZGV4XSkuZmlsdGVyKEJvb2xlYW4pO1xyXG4gICAgICBcclxuICAgICAgLy8gTm9ybWFsaXplIGFkZGl0aW9uYWwgZmllbGRzIHRvIHByb3BlciBGb3JtbHkgZm9ybWF0XHJcbiAgICAgIHRoaXMuYWRkaXRpb25hbEZvcm1seUZpZWxkcyA9IGFkZGl0aW9uYWxGaWVsZHMubWFwKChmaWVsZCwgaW5kZXgpID0+IHtcclxuICAgICAgICAvLyBOb3JtYWxpemUgZmllbGQgc3RydWN0dXJlIHRvIHByb3BlciBGb3JtbHkgZm9ybWF0XHJcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJWYWx1ZSA9IGZpZWxkLnBsYWNlaG9sZGVyIHx8IGZpZWxkLnByb3BzPy5wbGFjZWhvbGRlciB8fCBmaWVsZC5wYXJhbXM/LnBsYWNlaG9sZGVyIHx8IGZpZWxkLnByb3BzPy5wYXJhbXM/LnBsYWNlaG9sZGVyIHx8ICcnO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdQcm9jZXNzaW5nIGNvbmRpdGlvbmFsIGZpZWxkOicsIGZpZWxkLmtleSwgJ3BsYWNlaG9sZGVyOicsIHBsYWNlaG9sZGVyVmFsdWUsICdmaWVsZDonLCBmaWVsZCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgZm9ybWx5RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xyXG4gICAgICAgICAga2V5OiBmaWVsZC5rZXksXHJcbiAgICAgICAgICB0eXBlOiBmaWVsZC50eXBlLFxyXG4gICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmdldEZpZWxkQ2xhc3NOYW1lKGluZGV4LCBmaWVsZHNQZXJSb3cpLFxyXG4gICAgICAgICAgcHJvcHM6IHtcclxuICAgICAgICAgICAgLy8gSGFuZGxlIG1peGVkIHN0cnVjdHVyZSAtIHNvbWUgZmllbGRzIGhhdmUgcHJvcHMgYXQgcm9vdCwgb3RoZXJzIG5lc3RlZFxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJWYWx1ZSxcclxuICAgICAgICAgICAgcmVxdWlyZWQ6IGZpZWxkLnJlcXVpcmVkIHx8IGZpZWxkLnByb3BzPy5yZXF1aXJlZCB8fCBmYWxzZSxcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IGZpZWxkLmRpc2FibGVkIHx8IGZpZWxkLnByb3BzPy5kaXNhYmxlZCB8fCBmYWxzZSxcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIEZvciBzZWxlY3QgZmllbGRzLCBpbmNsdWRlIHNlbGVjdC1zcGVjaWZpYyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIC4uLihmaWVsZC5wcm9wcz8ub3B0aW9ucyAmJiB7XHJcbiAgICAgICAgICAgICAgb3B0aW9uczogZmllbGQucHJvcHMub3B0aW9ucyxcclxuICAgICAgICAgICAgICBtdWx0aXBsZTogZmllbGQucHJvcHMubXVsdGlwbGUgfHwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgYmluZExhYmVsOiBmaWVsZC5wcm9wcy5wYXJhbXM/LmJpbmRMYWJlbCB8fCAnbGFiZWwnLFxyXG4gICAgICAgICAgICAgIGJpbmRWYWx1ZTogZmllbGQucHJvcHMucGFyYW1zPy5iaW5kVmFsdWUgfHwgJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICBpc0NsZWFyYWJsZTogZmllbGQucHJvcHMucGFyYW1zPy5pc0NsZWFyYWJsZSAhPT0gZmFsc2UsXHJcbiAgICAgICAgICAgICAgc2hvd0NoZWNrYm94ZXM6IGZpZWxkLnByb3BzLnBhcmFtcz8uc2hvd0NoZWNrYm94ZXMgfHwgZmFsc2VcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBJbmNsdWRlIHBhcmFtcyBmb3IgY29tcG9uZW50LXNwZWNpZmljIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgICAgICAgLi4uKGZpZWxkLnBhcmFtcyB8fCB7fSksXHJcbiAgICAgICAgICAgICAgLi4uKGZpZWxkLnByb3BzPy5wYXJhbXMgfHwge30pLFxyXG4gICAgICAgICAgICAgIC8vIEVuc3VyZSBsYWJlbCBhbmQgcGxhY2Vob2xkZXIgYXJlIHNldFxyXG4gICAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbCB8fCBmaWVsZC5wcm9wcz8ucGFyYW1zPy5sYWJlbCB8fCBwbGFjZWhvbGRlclZhbHVlLFxyXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwbGFjZWhvbGRlclZhbHVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB2YWxpZGF0b3JzOiBmaWVsZC52YWxpZGF0b3JzIHx8IGZpZWxkLnByb3BzPy52YWxpZGF0b3JzIHx8IHt9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy8gU2V0IGluaXRpYWwgdmFsdWUgaWYgcHJvdmlkZWRcclxuICAgICAgICBpZiAoZmllbGQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5tb2RlbFtmaWVsZC5rZXkgYXMgc3RyaW5nXSA9IGZpZWxkLnZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQWRkIGZvcm0gY29udHJvbCB0byBmb3JtIGdyb3VwIGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcclxuICAgICAgICBjb25zdCBrZXkgPSBmaWVsZC5rZXkgYXMgc3RyaW5nO1xyXG4gICAgICAgIGlmICghdGhpcy5mb3JtLmdldChrZXkpKSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChrZXksIGZpZWxkLmZvcm1Db250cm9sIHx8IG5ldyBGb3JtQ29udHJvbChmaWVsZC52YWx1ZSB8fCAnJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZvcm1seUZpZWxkO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIENsZWFyIGFkZGl0aW9uYWwgZmllbGRzIGlmIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXRcclxuICAgICAgdGhpcy5hZGRpdGlvbmFsRm9ybWx5RmllbGRzID0gW107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV2YWx1YXRlU2hvd1doZW4oc2hvd1doZW46IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFzaG93V2hlbikgcmV0dXJuIHRydWU7XHJcbiAgICBcclxuICAgIC8vIEhhbmRsZSBkaWZmZXJlbnQgc2hvd1doZW4gY29uZGl0aW9uc1xyXG4gICAgaWYgKHR5cGVvZiBzaG93V2hlbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICByZXR1cm4gc2hvd1doZW4odGhpcy5tb2RlbCwgdGhpcy5mb3JtKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgaWYgKHR5cGVvZiBzaG93V2hlbiA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgLy8gSGFuZGxlIGZpZWxkLWJhc2VkIGNvbmRpdGlvbnMgbGlrZSB7IGZpZWxkOiAncm9sZScsIHZhbHVlOiAnYWRtaW4nIH1cclxuICAgICAgaWYgKHNob3dXaGVuLmZpZWxkICYmIHNob3dXaGVuLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbFtzaG93V2hlbi5maWVsZF0gPT09IHNob3dXaGVuLnZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZGxlIGZvcm0gbW9kZWwgY2hhbmdlcyBmcm9tIEZvcm1seVxyXG4gIG9uRm9ybU1vZGVsQ2hhbmdlKG1vZGVsOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwgPSB7IC4uLnRoaXMubW9kZWwsIC4uLm1vZGVsIH07XHJcbiAgICBcclxuICAgIC8vIFRyaWdnZXIgZmllbGQgdmlzaWJpbGl0eSB1cGRhdGVzIGJ5IHVwZGF0aW5nIHRoZSBhbGxGb3JtbHlGaWVsZHMgYXJyYXlcclxuICAgIC8vIFRoaXMgd2lsbCBjYXVzZSBGb3JtbHkgdG8gcmUtZXZhbHVhdGUgaGlkZUV4cHJlc3Npb24gZm9yIGFsbCBmaWVsZHNcclxuICAgIHRoaXMuYWxsRm9ybWx5RmllbGRzID0gWy4uLnRoaXMuYWxsRm9ybWx5RmllbGRzXTtcclxuICAgIFxyXG4gICAgLy8gRW1pdCB0aGUgY2hhbmdlIGV2ZW50XHJcbiAgICB0aGlzLm9uRm9ybUV2ZW50LmVtaXQoeyBcclxuICAgICAgdHlwZTogJ2Zvcm0tbW9kZWwtY2hhbmdlJywgXHJcbiAgICAgIGRhdGE6IG1vZGVsIFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuICAvLyBHZXQgaW5pdGlhbCBmaWVsZHMgdG8gZGlzcGxheSBpbiB0aGUgZmlyc3Qgcm93XHJcbiAgZ2V0SW5pdGlhbEZpZWxkcygpOiBGb3JtRmllbGRDb25maWdbXSB7XHJcbiAgICBpZiAoIXRoaXMuYWN0aXZlRm9ybUlucHV0cykgcmV0dXJuIFtdO1xyXG4gICAgXHJcbiAgICBjb25zdCBpbml0aWFsQ291bnQgPSB0aGlzLmFjdGl2ZUZvcm1MYXlvdXQuaW5pdGlhbFZpc2libGVGaWVsZHMgfHwgdGhpcy5hY3RpdmVGb3JtTGF5b3V0LmZpZWxkc1BlclJvdyB8fCAyO1xyXG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlRm9ybUlucHV0cy5zbGljZSgwLCBpbml0aWFsQ291bnQpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIENoZWNrIGlmIGFsbCB2aXNpYmxlIGZpZWxkcyBhcmUgZmlsbGVkIGFuZCBmb3JtIGlzIHZhbGlkXHJcbiAgYXJlQWxsVmlzaWJsZUZpZWxkc0ZpbGxlZCgpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5hY3RpdmVGb3JtSW5wdXRzIHx8IHRoaXMuYWN0aXZlRm9ybUlucHV0cy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xyXG4gICAgXHJcbiAgICAvLyBHZXQgbGF5b3V0IGNvbmZpZ3VyYXRpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGZpZWxkcyBzaG91bGQgYmUgdmlzaWJsZVxyXG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5hY3RpdmVGb3JtTGF5b3V0O1xyXG4gICAgY29uc3QgaW5pdGlhbFZpc2libGVGaWVsZHMgPSBsYXlvdXQuaW5pdGlhbFZpc2libGVGaWVsZHMgfHwgbGF5b3V0LmZpZWxkc1BlclJvdyB8fCAyO1xyXG4gICAgXHJcbiAgICAvLyBHZXQgYWxsIGN1cnJlbnRseSB2aXNpYmxlIGZpZWxkcyAoaW5pdGlhbCArIGNvbmRpdGlvbmFsIGlmIHNob3duKVxyXG4gICAgY29uc3QgdmlzaWJsZUZpZWxkcyA9IHRoaXMuYWN0aXZlRm9ybUlucHV0cy5zbGljZSgwLCBpbml0aWFsVmlzaWJsZUZpZWxkcyk7XHJcbiAgICBpZiAodGhpcy5zaG91bGRTaG93QWRkaXRpb25hbEZpZWxkcygpKSB7XHJcbiAgICAgIGNvbnN0IGNvbmRpdGlvbmFsRmllbGRJbmRpY2VzID0gbGF5b3V0LmNvbmRpdGlvbmFsRmllbGRzPy5maWVsZHMgfHwgXHJcbiAgICAgICAgQXJyYXkuZnJvbSh7bGVuZ3RoOiB0aGlzLmFjdGl2ZUZvcm1JbnB1dHMubGVuZ3RoIC0gaW5pdGlhbFZpc2libGVGaWVsZHN9LCAoXywgaSkgPT4gaSArIGluaXRpYWxWaXNpYmxlRmllbGRzKTtcclxuICAgICAgY29uc3QgY29uZGl0aW9uYWxGaWVsZHMgPSBjb25kaXRpb25hbEZpZWxkSW5kaWNlcy5tYXAoaW5kZXggPT4gdGhpcy5hY3RpdmVGb3JtSW5wdXRzW2luZGV4XSkuZmlsdGVyKEJvb2xlYW4pO1xyXG4gICAgICB2aXNpYmxlRmllbGRzLnB1c2goLi4uY29uZGl0aW9uYWxGaWVsZHMpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBDaGVjayBpZiBhbGwgdmlzaWJsZSBmaWVsZHMgaGF2ZSB2YWx1ZXMgdXNpbmcgdGhlaXIga2V5c1xyXG4gICAgY29uc3QgYWxsRmllbGRzRmlsbGVkID0gdmlzaWJsZUZpZWxkcy5ldmVyeShmaWVsZCA9PiB7XHJcbiAgICAgIGNvbnN0IGZpZWxkS2V5ID0gZmllbGQua2V5O1xyXG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5tb2RlbFtmaWVsZEtleV07XHJcbiAgICAgIFxyXG4gICAgICBpZiAoIWZpZWxkVmFsdWUpIHJldHVybiBmYWxzZTtcclxuICAgICAgXHJcbiAgICAgIC8vIEZvciBzdHJpbmcgdmFsdWVzLCBjaGVjayBpZiBub3QgZW1wdHkgYWZ0ZXIgdHJpbVxyXG4gICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWUudHJpbSgpICE9PSAnJztcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gRm9yIGFycmF5cyAobXVsdGktc2VsZWN0KSwgY2hlY2sgaWYgbm90IGVtcHR5XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWUubGVuZ3RoID4gMDtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgY29uc3QgZm9ybVZhbGlkID0gdGhpcy5mb3JtLnZhbGlkO1xyXG5cclxuICAgIHJldHVybiBhbGxGaWVsZHNGaWxsZWQgJiYgZm9ybVZhbGlkO1xyXG4gIH1cclxuICBcclxufVxyXG4iLCJAaWYgKGJhbm5lckNvbnRlbnQoKTsgYXMgY29udGVudCkge1xyXG4gIDxkaXYgY2xhc3M9XCJlcnJvci1wYWdlIG1lc3NhZ2UtYmFubmVyLXYyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1jb250YWluZXJcIiBbbmdTdHlsZV09XCJ7IGdhcDogY29udGVudEdhcCB8fCAndmFyKC0tbWVkaXVtLTMycHgsIDMycHgpJyB9XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1jb250YWluZXJcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInsgJ21hcmdpbi1ib3R0b20nOiBzcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb24gPz8gJ3ZhcigtLXNtYWxsLTE2cHgsIDE2cHgpJyB9XCI+XHJcbiAgICAgICAgPGltZyBbc3JjXT1cImNvbnRlbnQubWVzc2FnZUljb25cIiBbYWx0XT1cImNvbnRlbnQudHlwZSArICcgaW1hZ2UnXCJcclxuICAgICAgICAgIFtzdHlsZS4tLW1lc3NhZ2UtaWNvbi1oZWlnaHRdPVwiY29udGVudC5tZXNzYWdlSWNvblNpemU/LmhlaWdodFwiXHJcbiAgICAgICAgICBbc3R5bGUuLS1tZXNzYWdlLWljb24td2lkdGhdPVwiY29udGVudC5tZXNzYWdlSWNvblNpemU/LndpZHRoXCIgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlLWRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtY2xhc3NcIiBbbmdDbGFzc109XCJ0aXRsZUNsYXNzIHx8ICd0aXRsZS1jbGFzcydcIiBbaW5uZXJIVE1MXT1cImNvbnRlbnQudGl0bGVcIj48L2Rpdj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwiZGVzY3JpcHRpb25cIiBbbmdDbGFzc109XCJkZXNjcmlwdGlvbkNsYXNzIHx8ICdkZXNjcmlwdGlvbidcIiBbaW5uZXJIVE1MXT1cImNvbnRlbnQuZGVzY3JpcHRpb25cIj48L3A+IFxyXG4gICAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJ7IG1hcmdpbjogYmFubmVyPy5zcGFjaW5nICsgJ3B4IDBweCcgfVwiPlxyXG4gICAgICAgICAgICA8c2EtbWVzc2FnZS1iYW5uZXIgKm5nSWY9XCIhaXNFbXB0eU9iamVjdChiYW5uZXIpXCIgW3R5cGVdPVwiYmFubmVyPy50eXBlXCIgW2Jhbm5lckljb25dPVwiYmFubmVyPy5iYW5uZXJJY29uXCIgW2J1dHRvbkljb25dPVwiYmFubmVyPy5idXR0b25JY29uXCJcclxuICAgICAgICAgICAgICBbYmFubmVySWNvblNpemVdPVwiYmFubmVyPy5iYW5uZXJJY29uU2l6ZVwiIFtidXR0b25UeXBlXT1cImJhbm5lcj8uYnV0dG9uVHlwZVwiIFtidXR0b25TaXplXT1cImJhbm5lcj8uYnV0dG9uU2l6ZVwiIFtidXR0b25JY29uUG9zaXRpb25dPVwiYmFubmVyPy5idXR0b25JY29uUG9zaXRpb25cIlxyXG4gICAgICAgICAgICAgIFtidXR0b25JY29uU2l6ZV09XCJiYW5uZXI/LmJ1dHRvbkljb25TaXplXCIgW2FjdGlvblRleHRdPVwiYmFubmVyPy5hY3Rpb25UZXh0XCIgPlxyXG4gICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJiYW5uZXI/LnRleHRcIj48L2Rpdj5cclxuICAgICAgICAgICAgPC9zYS1tZXNzYWdlLWJhbm5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gIFxyXG4gICAgICAgIDwhLS0gRm9ybSBpbnB1dHMgc2VjdGlvbiAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJlYnVpbHRGb3JtRmllbGRzIHx8IGFjdGl2ZUZvcm1JbnB1dHM/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgIDwhLS0gUHJlYnVpbHQgZm9ybSBmaWVsZHMgKGRpcmVjdCBjb21wb25lbnQgcmVuZGVyaW5nKSAtLT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlUHJlYnVpbHRGaWVsZHMoKSAmJiBwcmVidWlsdEZvcm1GaWVsZHNcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcmVidWlsdEZvcm1GaWVsZHNcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICA8IS0tIFVzZSBGb3JtbHkgZm9yIHByb3BlciBmb3JtIHJlbmRlcmluZyAtLT5cclxuICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImRpYWxvZy1mb3JtXCIgKm5nSWY9XCIhdXNlUHJlYnVpbHRGaWVsZHMoKSAmJiBhY3RpdmVGb3JtSW5wdXRzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgIDxmb3JtbHktZm9ybSBcclxuICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVwiIFxyXG4gICAgICAgICAgICAgICAgICBbZmllbGRzXT1cImFsbEZvcm1seUZpZWxkc1wiIFxyXG4gICAgICAgICAgICAgICAgICBbbW9kZWxdPVwibW9kZWxcIlxyXG4gICAgICAgICAgICAgICAgICAobW9kZWxDaGFuZ2UpPVwib25Gb3JtTW9kZWxDaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgPC9mb3JtbHktZm9ybT5cclxuICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIEN1c3RvbSBmb3JtIGJ1dHRvbihzKSAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWJ1dHRvbi1jb250YWluZXJcIiAqbmdJZj1cImFjdGl2ZUN1c3RvbUZvcm1CdXR0b24gJiYgIXVzZVByZWJ1aWx0RmllbGRzKClcIj5cclxuICAgICAgICAgICAgPCEtLSBTdXBwb3J0IGJvdGggc2luZ2xlIGJ1dHRvbiBhbmQgYXJyYXkgb2YgYnV0dG9ucyAtLT5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQnV0dG9uQXJyYXkoKTsgZWxzZSBzaW5nbGVCdXR0b25cIj5cclxuICAgICAgICAgICAgICA8c2EtYnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBhY3RpdmVDdXN0b21Gb3JtQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBbaWRdPVwiYnV0dG9uLmlkXCJcclxuICAgICAgICAgICAgICAgIFt0ZXh0XT1cImJ1dHRvbi50ZXh0XCJcclxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImJ1dHRvbi50eXBlXCJcclxuICAgICAgICAgICAgICAgIFtzaXplXT1cImJ1dHRvbi5zaXplXCJcclxuICAgICAgICAgICAgICAgIFtzdGF0ZV09XCJidXR0b24uc3RhdGVcIlxyXG4gICAgICAgICAgICAgICAgW0ltYWdlUGF0aF09XCJidXR0b24uSW1hZ2VQYXRoXCJcclxuICAgICAgICAgICAgICAgIFtpY29uUG9zaXRpb25dPVwiYnV0dG9uLmljb25Qb3NpdGlvblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25CdXR0b25DbGljayhidXR0b24pXCI+XHJcbiAgICAgICAgICAgICAgPC9zYS1idXR0b24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVCdXR0b24+XHJcbiAgICAgICAgICAgICAgPHNhLWJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgW2lkXT1cImFjdGl2ZUN1c3RvbUZvcm1CdXR0b24uaWRcIlxyXG4gICAgICAgICAgICAgICAgW3RleHRdPVwiYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi50ZXh0XCJcclxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImFjdGl2ZUN1c3RvbUZvcm1CdXR0b24udHlwZVwiXHJcbiAgICAgICAgICAgICAgICBbc2l6ZV09XCJhY3RpdmVDdXN0b21Gb3JtQnV0dG9uLnNpemVcIlxyXG4gICAgICAgICAgICAgICAgW3N0YXRlXT1cImFjdGl2ZUN1c3RvbUZvcm1CdXR0b24uc3RhdGVcIlxyXG4gICAgICAgICAgICAgICAgW0ltYWdlUGF0aF09XCJhY3RpdmVDdXN0b21Gb3JtQnV0dG9uLkltYWdlUGF0aFwiXHJcbiAgICAgICAgICAgICAgICBbaWNvblBvc2l0aW9uXT1cImFjdGl2ZUN1c3RvbUZvcm1CdXR0b24uaWNvblBvc2l0aW9uXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrKGFjdGl2ZUN1c3RvbUZvcm1CdXR0b24pXCI+XHJcbiAgICAgICAgICAgICAgPC9zYS1idXR0b24+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICBcclxuICAgICAgICAgIDwhLS0gRGl2aWRlciBzZWN0aW9uIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXItc2VjdGlvblwiICpuZ0lmPVwiYWN0aXZlRGl2aWRlciAmJiAhdXNlUHJlYnVpbHRGaWVsZHMoKVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlclwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2aWRlci1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJkaXZpZGVyLXRpdGxlXCIgKm5nSWY9XCJhY3RpdmVEaXZpZGVyQ29uZmlnLnRpdGxlXCI+e3sgYWN0aXZlRGl2aWRlckNvbmZpZy50aXRsZSB9fTwvaDM+XHJcbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJkaXZpZGVyLXN1YnRpdGxlXCIgKm5nSWY9XCJhY3RpdmVEaXZpZGVyQ29uZmlnLnN1YnRpdGxlIHx8IGFjdGl2ZURpdmlkZXJDb25maWcuc2hvd1N1YnRpdGxlV2hlbkVtcHR5XCI+XHJcbiAgICAgICAgICAgICAgICB7eyBhY3RpdmVEaXZpZGVyQ29uZmlnLnN1YnRpdGxlIHx8ICdObyBpdGVtcyBhZGRlZCB5ZXQnIH19XHJcbiAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgXHJcbiAgICAgICAgICA8IS0tIENoaXBzIHNlY3Rpb24gLS0+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcC1saXN0XCIgKm5nSWY9XCJhY3RpdmVDaGlwcz8ubGVuZ3RoICYmICF1c2VQcmVidWlsdEZpZWxkcygpXCI+XHJcbiAgICAgICAgICAgIDxzYS1jaGlwIFxyXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoaXAgb2YgYWN0aXZlQ2hpcHNcIlxyXG4gICAgICAgICAgICAgICAgW3RleHRdPVwiY2hpcC5sYWJlbCB8fCBjaGlwLnRleHQgfHwgY2hpcFwiXHJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCIncmVndWxhcidcIlxyXG4gICAgICAgICAgICAgICAgW3N0YXRlXT1cIidkZWZhdWx0J1wiXHJcbiAgICAgICAgICAgICAgICBbZmlsbGluZ109XCInZmlsbGVkJ1wiXHJcbiAgICAgICAgICAgICAgICBbaWNvblBvc2l0aW9uXT1cIidyaWdodCdcIlxyXG4gICAgICAgICAgICAgICAgW2ljb25QYXRoXT1cIicuLi9hc3NldHMvY2xvc2VCbHVlT3V0bGluZWQuc3ZnJ1wiXHJcbiAgICAgICAgICAgICAgICAob25DbGlja0V2ZW50KT1cImNoaXAucmVtb3ZhYmxlID8gb25DaGlwUmVtb3ZlKGNoaXApIDogbnVsbFwiPlxyXG4gICAgICAgICAgICAgIDwvc2EtY2hpcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICBcclxuICAgICAgICBAaWYoYnV0dG9ucyl7XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1ncm91cFwiPlxyXG4gICAgICAgICAgQGZvciAoYnV0dG9uIG9mIGJ1dHRvbnM7IHRyYWNrIGJ1dHRvbi50ZXh0KSB7XHJcbiAgICAgICAgICAgIDxzYS1idXR0b24gXHJcbiAgICAgICAgICAgICAgW3RleHRdPVwiYnV0dG9uLnRleHRcIlxyXG4gICAgICAgICAgICAgIFtpY29uXT1cImJ1dHRvbi5pY29uXCJcclxuICAgICAgICAgICAgICBbc2l6ZV09XCJidXR0b24uc2l6ZVwiXHJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiYnV0dG9uLnR5cGVcIlxyXG4gICAgICAgICAgICAgIFtpY29uUG9zaXRpb25dPVwiYnV0dG9uLmljb25Qb3NpdGlvblwiXHJcbiAgICAgICAgICAgICAgW2J1dHRvbkljb25TaXplXT1cImJ1dHRvbi5idXR0b25JY29uU2l6ZVwiXHJcbiAgICAgICAgICAgICAgKG9uQ2xpY2tFdmVudCk9XCJvbkJ1dHRvbkNsaWNrKGJ1dHRvbiwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgW3N0YXRlXT1cIiFhcmVBbGxWaXNpYmxlRmllbGRzRmlsbGVkKCkgPyAnZGlzYWJsZWQnIDogJydcIlxyXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYnV0dG9uLnRleHRcIj5cclxuICAgICAgICAgICAgPC9zYS1idXR0b24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIH0iXX0=
|