@sarasanalytics-com/design-system 0.0.190 → 0.0.191

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.
@@ -36,6 +36,7 @@ export class MessageBannerV2Component {
36
36
  });
37
37
  this.banner = {};
38
38
  this.formConfig = null;
39
+ this.onContactUsClick = new EventEmitter();
39
40
  this.form = new FormGroup({});
40
41
  this.model = {};
41
42
  this.fields = [];
@@ -427,6 +428,20 @@ export class MessageBannerV2Component {
427
428
  data: model
428
429
  });
429
430
  }
431
+ /**
432
+ * Handles click events on the description area, specifically for custom contact links.
433
+ * If a custom contact link is clicked and there's an observer for onContactUsClick,
434
+ * it prevents the default navigation and emits the custom event instead.
435
+ * @param event - The mouse click event from the description area
436
+ */
437
+ handleDescriptionClick(event) {
438
+ const target = event.target;
439
+ const link = target?.closest('a.custom-contact-link');
440
+ if (link && this.onContactUsClick.observed) {
441
+ event.preventDefault();
442
+ this.onContactUsClick.emit();
443
+ }
444
+ }
430
445
  // Get initial fields to display in the first row
431
446
  getInitialFields() {
432
447
  if (!this.activeFormInputs)
@@ -469,11 +484,11 @@ export class MessageBannerV2Component {
469
484
  return allFieldsFilled && formValid;
470
485
  }
471
486
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MessageBannerV2Component, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
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) {\n <div class=\"error-page message-banner-v2\">\n <div class=\"content-container\" [ngStyle]=\"{ gap: contentGap || 'var(--medium-32px, 32px)' }\">\n @if(content?.messageIcon){\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 }\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 <!-- 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]=\"allFormlyFields\" \n [model]=\"model\"\n (modelChange)=\"onFormModelChange($event)\">\n </formly-form>\n </form>\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' : button?.state\"\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"] }] }); }
487
+ 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: { onContactUsClick: "onContactUsClick", 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 @if(content?.messageIcon){\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 }\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\" (click)=\"handleDescriptionClick($event)\"></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 <!-- 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]=\"allFormlyFields\" \n [model]=\"model\"\n (modelChange)=\"onFormModelChange($event)\">\n </formly-form>\n </form>\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' : button?.state\"\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"] }] }); }
473
488
  }
474
489
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: MessageBannerV2Component, decorators: [{
475
490
  type: Component,
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) {\n <div class=\"error-page message-banner-v2\">\n <div class=\"content-container\" [ngStyle]=\"{ gap: contentGap || 'var(--medium-32px, 32px)' }\">\n @if(content?.messageIcon){\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 }\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 <!-- 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]=\"allFormlyFields\" \n [model]=\"model\"\n (modelChange)=\"onFormModelChange($event)\">\n </formly-form>\n </form>\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' : button?.state\"\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"] }]
491
+ 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 @if(content?.messageIcon){\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 }\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\" (click)=\"handleDescriptionClick($event)\"></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 <!-- 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]=\"allFormlyFields\" \n [model]=\"model\"\n (modelChange)=\"onFormModelChange($event)\">\n </formly-form>\n </form>\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' : button?.state\"\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"] }]
477
492
  }], propDecorators: { messageType: [{
478
493
  type: Input
479
494
  }], contactUrl: [{
@@ -492,6 +507,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
492
507
  type: Input
493
508
  }], prebuiltFormFields: [{
494
509
  type: Input
510
+ }], onContactUsClick: [{
511
+ type: Output
495
512
  }], onFormEvent: [{
496
513
  type: Output
497
514
  }], messageIcon: [{
@@ -507,4 +524,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
507
524
  }], buttonClick: [{
508
525
  type: Output
509
526
  }] } });
510
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1iYW5uZXItdjIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50LWxpYnJhcnkvc3JjL2xpYi9tZXNzYWdlLWJhbm5lci12Mi9tZXNzYWdlLWJhbm5lci12Mi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL21lc3NhZ2UtYmFubmVyLXYyL21lc3NhZ2UtYmFubmVyLXYyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQXFCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFN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QUFZLEVBQUUsY0FBYyxDQUFDLGFBQzlMLENBQUMsV0FBVyxDQUFDOzhCQXlCZixXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csaUNBQWlDO3NCQUF6QyxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQWtDSSxXQUFXO3NCQUFwQixNQUFNO2dCQW9DTSxXQUFXO3NCQUF2QixLQUFLO2dCQUlPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBSU8sS0FBSztzQkFBakIsS0FBSztnQkFJTyxXQUFXO3NCQUF2QixLQUFLO2dCQUlHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgY29tcHV0ZWQsIHNpZ25hbCwgZWZmZWN0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSWNvblNlcnZpY2UgfSBmcm9tICcuLi9pY29uL2ljb24uc2VydmljZSc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJY29uTmFtZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvaWNvbi1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQnV0dG9uSWNvblBvc2l0aW9uLCBCdXR0b25TaXplLCBCdXR0b25UeXBlLCBCdXR0b25JbnRlcmZhY2UsIEJ1dHRvbkNsaWNrRXZlbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2J1dHRvbi1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSHR0cENsaWVudE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcbmltcG9ydCB7IE1lc3NhZ2VCYW5uZXJDb21wb25lbnQgfSBmcm9tICcuLi9tZXNzYWdlLWJhbm5lci9tZXNzYWdlLWJhbm5lci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS1pbnB1dC9mb3JtLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS1zZWxlY3QvZm9ybS1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRm9ybWx5TW9kdWxlLCBGb3JtbHlGaWVsZENvbmZpZyB9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHsgQ2hpcHNDb21wb25lbnQgfSBmcm9tICcuLi9jaGlwcy9jaGlwcy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybUxheW91dENvbmZpZywgRm9ybUZpZWxkQ29uZmlnLCBVbmlmaWVkRm9ybUNvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvZm9ybS1sYXlvdXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmludGVyZmFjZSBNZXNzYWdlQmFubmVyU3RhdGUge1xuICB0eXBlOiAnZGVmYXVsdCcgfCAnY29ubmVjdGlvbicgfCAnYWNjZXNzJyB8ICdhY2Nlc3NSZXN0cmljdGVkJztcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgbWVzc2FnZUljb246IHN0cmluZztcbiAgbWVzc2FnZUljb25TaXplPzoge1xuICAgIHdpZHRoPzogc3RyaW5nO1xuICAgIGhlaWdodD86IHN0cmluZztcbiAgfTtcbiAgc3BhY2luZ0JldHdlZW5JbWFnZUFuZERlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBjb250ZW50R2FwPzogc3RyaW5nOyBcbiAgY29udGFjdFVybD86IHN0cmluZztcbiAgdGl0bGVDbGFzcz86IHN0cmluZztcbiAgZGVzY3JpcHRpb25DbGFzcz86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2EtbWVzc2FnZS1iYW5uZXItdjInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJY29uQ29tcG9uZW50LCBCdXR0b25Db21wb25lbnQsIEh0dHBDbGllbnRNb2R1bGUsTWVzc2FnZUJhbm5lckNvbXBvbmVudCwgRm9ybUlucHV0Q29tcG9uZW50LCBGb3JtU2VsZWN0Q29tcG9uZW50LCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybWx5TW9kdWxlLCBDaGlwc0NvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW0ljb25TZXJ2aWNlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL21lc3NhZ2UtYmFubmVyLXYyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWVzc2FnZS1iYW5uZXItdjIuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VCYW5uZXJWMkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8vIFN0YXRlIG1hbmFnZW1lbnQgdXNpbmcgc2lnbmFsc1xuICBwcml2YXRlIHN0YXRlID0gc2lnbmFsPE1lc3NhZ2VCYW5uZXJTdGF0ZT4oe1xuICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICB0aXRsZTogJycsXG4gICAgZGVzY3JpcHRpb246ICcnLFxuICAgIG1lc3NhZ2VJY29uOiAnJyxcbiAgICBtZXNzYWdlSWNvblNpemU6IHtcbiAgICAgIGhlaWdodDogJzEyLjVyZW0nXG4gICAgfVxuICB9KTtcblxuICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzXG4gIHByb3RlY3RlZCBiYW5uZXJDb250ZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuc3RhdGUoKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY3VycmVudFN0YXRlLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuc2FuaXRpemVEZXNjcmlwdGlvbihjdXJyZW50U3RhdGUuZGVzY3JpcHRpb24pXG4gICAgfTtcbiAgfSk7XG5cbiAgQElucHV0KCkgbWVzc2FnZVR5cGU6ICdkZWZhdWx0JyB8ICdjb25uZWN0aW9uJyB8ICdhY2Nlc3MnIHwgJ2FjY2Vzc1Jlc3RyaWN0ZWQnO1xuICBASW5wdXQoKSBjb250YWN0VXJsPzogc3RyaW5nO1xuICBASW5wdXQoKSBzcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbnRlbnRHYXA/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRpdGxlQ2xhc3M/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uQ2xhc3M/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJhbm5lcjphbnkgPSB7fTtcbiAgQElucHV0KCkgZm9ybUNvbmZpZzogVW5pZmllZEZvcm1Db25maWcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgcHJlYnVpbHRGb3JtRmllbGRzOiBUZW1wbGF0ZVJlZjxhbnk+IFxuICBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gIG1vZGVsOiBhbnkgPSB7fTtcbiAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gIGZvcm1seUZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICBhbGxGaWVsZHNGaWxsZWQgPSBzaWduYWwoZmFsc2UpO1xuICBhZGRpdGlvbmFsRm9ybWx5RmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gIGFsbEZvcm1seUZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICB1c2VQcmVidWlsdEZpZWxkcyA9IHNpZ25hbChmYWxzZSk7XG4gIC8vIENvbXB1dGVkIHByb3BlcnRpZXMgZm9yIHVuaWZpZWQgYWNjZXNzXG4gIGdldCBhY3RpdmVGb3JtSW5wdXRzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnPy5maWVsZHMgfHwgW107XG4gIH1cblxuICBnZXQgYWN0aXZlQ2hpcHMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWc/LmNoaXBzIHx8IFtdO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUN1c3RvbUZvcm1CdXR0b24oKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnPy5jdXN0b21CdXR0b24gfHwgW107XG4gIH1cblxuICBnZXQgYWN0aXZlRGl2aWRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnPy5kaXZpZGVyPy5lbmFibGVkID8/IGZhbHNlO1xuICB9IFxuXG4gIGdldCBhY3RpdmVEaXZpZGVyQ29uZmlnKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbmZpZz8uZGl2aWRlciB8fCB7fTtcbiAgfVxuXG4gIGdldCBhY3RpdmVGb3JtTGF5b3V0KCk6IEZvcm1MYXlvdXRDb25maWcge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWc/LmxheW91dCB8fCB7fTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBvbkZvcm1FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8e3R5cGU6IHN0cmluZywgZGF0YTogYW55fT4oKTtcbiAgXG4gIG9uQ2hpcFJlbW92ZShjaGlwOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uRm9ybUV2ZW50LmVtaXQoeyB0eXBlOiAnY2hpcC1yZW1vdmUnLCBkYXRhOiBjaGlwIH0pO1xuICB9XG4gIFxuICBvbkFkZFVzZXIoKTogdm9pZCB7XG4gICAgbGV0IGNsaWNrZWRCdXR0b24gPSB0aGlzLmFjdGl2ZUN1c3RvbUZvcm1CdXR0b247XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5hY3RpdmVDdXN0b21Gb3JtQnV0dG9uKSkge1xuICAgICAgY2xpY2tlZEJ1dHRvbiA9IHRoaXMuYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi5maW5kKGJ0biA9PiBcbiAgICAgICAgYnRuLnRleHQgPT09ICdBZGQgVXNlcicgfHwgYnRuLmlkID09PSAnYWRkLXVzZXInIHx8IGJ0bi5hY3Rpb24gPT09ICdhZGQtdXNlcidcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMub25Gb3JtRXZlbnQuZW1pdCh7IHR5cGU6ICdjdXN0b20tYnV0dG9uLWNsaWNrJywgZGF0YTogY2xpY2tlZEJ1dHRvbiB9KTtcbiAgICAvLyBPbmx5IHJlc2V0IGZvcm0gaWYgZXhwbGljaXRseSBjb25maWd1cmVkIHRvIGRvIHNvXG4gICAgaWYgKGNsaWNrZWRCdXR0b24/LnJlc2V0Rm9ybSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgfVxuICB9XG4gIFxuICAvLyBTZXBhcmF0ZSBtZXRob2QgZm9yIGZvcm0gcmVzZXQgdGhhdCBjYW4gYmUgY2FsbGVkIGV4dGVybmFsbHlcbiAgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSB7fTtcbiAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgICB0aGlzLmFjdGl2ZUZvcm1JbnB1dHM/LmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUZvcm1seUZpZWxkcygpO1xuICB9XG4gIFxuICBhcmVBbGxGaWVsZHNGaWxsZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZUZvcm1JbnB1dHMgfHwgdGhpcy5hY3RpdmVGb3JtSW5wdXRzLmxlbmd0aCA8IDQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVGb3JtSW5wdXRzLmV2ZXJ5KGZpZWxkID0+IGZpZWxkLnZhbHVlICYmIGZpZWxkLnZhbHVlLnRyaW0oKSAhPT0gJycpO1xuICB9XG4gIFxuXG4gIEBJbnB1dCgpIHNldCBtZXNzYWdlSWNvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoeyAuLi5zLCBtZXNzYWdlSWNvbjogdmFsdWUgfSkpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG1lc3NhZ2VJY29uU2l6ZSh2YWx1ZTogeyB3aWR0aD86IHN0cmluZzsgaGVpZ2h0Pzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7IC4uLnMsIG1lc3NhZ2VJY29uU2l6ZTogdmFsdWUgfSkpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7IC4uLnMsIHRpdGxlOiB2YWx1ZSB9KSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGVzY3JpcHRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgZGVzY3JpcHRpb246IHZhbHVlIH0pKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGJ1dHRvbnM6IEJ1dHRvbkludGVyZmFjZVtdID0gW107XG4gIEBPdXRwdXQoKSBidXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8QnV0dG9uQ2xpY2tFdmVudD4oKTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5pdGlhbGl6YXRpb24gb3IgaWYgbWVzc2FnZVR5cGUgaGFzIGNoYW5nZWRcbiAgICBjb25zdCBzaG91bGRVcGRhdGVCYXNlZE9uVHlwZSA9IGNoYW5nZXNbJ21lc3NhZ2VUeXBlJ10gJiYgXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBiYXNlZCBvbiB0eXBlIGlmIHdlIGRvbid0IGhhdmUgY3VzdG9tIHZhbHVlcyBzZXRcbiAgICAgICEodGhpcy5zdGF0ZSgpLnRpdGxlIHx8IHRoaXMuc3RhdGUoKS5kZXNjcmlwdGlvbiB8fCB0aGlzLnN0YXRlKCkubWVzc2FnZUljb24pO1xuICAgIFxuICAgIGlmIChzaG91bGRVcGRhdGVCYXNlZE9uVHlwZSkge1xuICAgICAgdGhpcy51cGRhdGVDb250ZW50QmFzZWRPblR5cGUodGhpcy5tZXNzYWdlVHlwZSB8fCAnZGVmYXVsdCcpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiBwcmVidWlsdCBmaWVsZHMgYXJlIHByb3ZpZGVkXG4gICAgaWYgKGNoYW5nZXNbJ3ByZWJ1aWx0Rm9ybUZpZWxkcyddKSB7XG4gICAgICB0aGlzLnVzZVByZWJ1aWx0RmllbGRzLnNldCghIXRoaXMucHJlYnVpbHRGb3JtRmllbGRzKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGNoYW5nZXNbJ2Zvcm1Db25maWcnXSkge1xuICAgICAgaWYgKCF0aGlzLnVzZVByZWJ1aWx0RmllbGRzKCkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlGaWVsZHMoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplQ2xlYW5Gb3JtU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2xlYW5Gb3JtU3RhdGUoKTogdm9pZCB7XG4gICAvLyB0aGlzLm1vZGVsID0ge307XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICBjb250cm9sLm1hcmtBc1VudG91Y2hlZCgpO1xuICAgICAgICAgIGNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgICBjb250cm9sLnNldEVycm9ycyhudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnRCYXNlZE9uVHlwZSh0eXBlOiAnZGVmYXVsdCcgfCAnY29ubmVjdGlvbicgfCAnYWNjZXNzJyB8ICdhY2Nlc3NSZXN0cmljdGVkJykgeyAgXG4gICAgLy8gRGVmaW5lIGEgdHlwZSBmb3IgdGhlIGNvbnRlbnQgaXRlbXMgdG8gZW5zdXJlIGFsbCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseSB0eXBlZFxuICAgIHR5cGUgQ29udGVudEl0ZW0gPSB7XG4gICAgICB0aXRsZTogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgIG1lc3NhZ2VJY29uOiBzdHJpbmc7XG4gICAgICBzcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgICBjb250ZW50R2FwPzogc3RyaW5nO1xuICAgICAgdGl0bGVDbGFzcz86IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uQ2xhc3M/OiBzdHJpbmc7XG4gICAgfTtcblxuICAgIC8vIE9ubHkgYXBwbHkgZGVmYXVsdCBjb250ZW50IGlmIGN1c3RvbSBjb250ZW50IGhhc24ndCBiZWVuIHByb3ZpZGVkXG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5zdGF0ZSgpO1xuICAgIGNvbnN0IGNvbnRlbnQ6IFJlY29yZDwnZGVmYXVsdCcgfCAnY29ubmVjdGlvbicgfCAnYWNjZXNzJyB8ICdhY2Nlc3NSZXN0cmljdGVkJywgQ29udGVudEl0ZW0+ID0ge1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aXRsZTogJ09vcHMhIFNvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluIG9yIHRyeSBhZnRlciBzb21lIHRpbWUnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0lmIHRoZSBpc3N1ZSBwZXJzaXN0cywgY29udGFjdCBvdXIgc3VwcG9ydCB0ZWFtIGF0IDxzcGFuIGNsYXNzPVwic3VwcG9ydC1lbWFpbFwiPnN1cHBvcnRAc2FyYXNhbmFseXRpY3MuY29tPC9zcGFuPicsXG4gICAgICAgIG1lc3NhZ2VJY29uOiAnL2Fzc2V0cy9lcnJvci5naWYnXG4gICAgICB9LFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICB0aXRsZTogJ1dlXFwncmUgaGF2aW5nIHRyb3VibGUgY29ubmVjdGluZy4gUGxlYXNlIGNoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdZb3UgY2FuIGFsc28gcmVhY2ggb3V0IHRvIG91ciBzdXBwb3J0IHRlYW0gYXQgPHNwYW4gY2xhc3M9XCJzdXBwb3J0LWVtYWlsXCI+c3VwcG9ydEBzYXJhc2FuYWx5dGljcy5jb208L3NwYW4+IGZvciBhc3Npc3RhbmNlJyxcbiAgICAgICAgbWVzc2FnZUljb246ICcvYXNzZXRzL2xvc3QtY29ubmVjdGlvbi5naWYnXG4gICAgICB9LFxuICAgICAgYWNjZXNzOiB7XG4gICAgICAgIHRpdGxlOiAnVGhpcyBpcyB0YWtpbmcgYSBiaXQgbG9uZ2VyIHRoYW4gdXN1YWwuIFBsZWFzZSBob2xkIG9uIScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnSWYgdGhlIGRlbGF5IGNvbnRpbnVlcywgY2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgcmVmcmVzaGluZyB0aGUgcGFnZS4nLFxuICAgICAgICBtZXNzYWdlSWNvbjogJy9hc3NldHMvbG9uZy1sb2FkaW5nLmdpZidcbiAgICAgIH0sXG4gICAgICBhY2Nlc3NSZXN0cmljdGVkOiB7XG4gICAgICAgIHRpdGxlOiAnQWNjZXNzIFJlc3RyaWN0ZWQhJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBMb29rcyBsaWtlIHlvdSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGlzIG1vZHVsZSBqdXN0IHlldC4gTm8gd29ycmllc+KAlHJlYWNoIG91dCB0byB5b3VyIGFkbWluIHRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZmVhdHVyZS4gSWYgeW91J3JlIGZhY2luZyBhbnkgaXNzdWVzLCBmZWVsIGZyZWUgdG8gPGEgY2xhc3M9XCJjdXN0b20tY29udGFjdC1saW5rXCIgaHJlZj1cIiR7dGhpcy5jb250YWN0VXJsID8/ICdodHRwczovL3N1cHBvcnQuZGVmYXVsdC5jb20nfVwiIHRhcmdldD1cIl9ibGFua1wiPkNvbnRhY3QgVXM8L2E+LmAsXG4gICAgICAgIG1lc3NhZ2VJY29uOiAnL2Fzc2V0cy9hY2Nlc3MtcmVzdHJpY3RlZC5naWYnLFxuICAgICAgICBzcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb246ICcwcHgnLFxuICAgICAgICBjb250ZW50R2FwOicyMHB4JyxcbiAgICAgICAgdGl0bGVDbGFzczogJ2FjY2Vzcy1yZXN0cmljdGVkLXRpdGxlJyxcbiAgICAgICAgZGVzY3JpcHRpb25DbGFzczogJ2FjY2Vzcy1yZXN0cmljdGVkLWRlc2NyaXB0aW9uJyxcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50W3R5cGVdO1xuXG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoe1xuICAgICAgLi4ucyxcbiAgICAgIHR5cGUsXG4gICAgICAvLyBPbmx5IGFwcGx5IGRlZmF1bHQgdmFsdWVzIGlmIGN1c3RvbSB2YWx1ZXMgaGF2ZW4ndCBiZWVuIHByb3ZpZGVkXG4gICAgICB0aXRsZTogcy50aXRsZSB8fCBjb250ZW50SXRlbS50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBzLmRlc2NyaXB0aW9uIHx8IGNvbnRlbnRJdGVtLmRlc2NyaXB0aW9uLFxuICAgICAgbWVzc2FnZUljb246IHMubWVzc2FnZUljb24gfHwgY29udGVudEl0ZW0ubWVzc2FnZUljb24sXG4gICAgICAvLyBGb3Igb3RoZXIgcHJvcGVydGllcywgb25seSBhcHBseSB0aGVtIGlmIHRoZXkgZXhpc3QgaW4gdGhlIGNvbnRlbnRJdGVtXG4gICAgICAuLi4oY29udGVudEl0ZW0uc3BhY2luZ0JldHdlZW5JbWFnZUFuZERlc2NyaXB0aW9uICYmIHsgc3BhY2luZ0JldHdlZW5JbWFnZUFuZERlc2NyaXB0aW9uOiBjb250ZW50SXRlbS5zcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb24gfSksXG4gICAgICAuLi4oY29udGVudEl0ZW0uY29udGVudEdhcCAmJiB7IGNvbnRlbnRHYXA6IGNvbnRlbnRJdGVtLmNvbnRlbnRHYXAgfSksXG4gICAgICAuLi4oY29udGVudEl0ZW0udGl0bGVDbGFzcyAmJiB7IHRpdGxlQ2xhc3M6IGNvbnRlbnRJdGVtLnRpdGxlQ2xhc3MgfSksXG4gICAgICAuLi4oY29udGVudEl0ZW0uZGVzY3JpcHRpb25DbGFzcyAmJiB7IGRlc2NyaXB0aW9uQ2xhc3M6IGNvbnRlbnRJdGVtLmRlc2NyaXB0aW9uQ2xhc3MgfSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHNhbml0aXplRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uLnJlcGxhY2UoXG4gICAgICAvc3VwcG9ydEBzYXJhc2FuYWx5dGljc1xcLmNvbS9nLFxuICAgICAgJzxzcGFuIGNsYXNzPVwic3VwcG9ydC1lbWFpbFwiPnN1cHBvcnRAc2FyYXNhbmFseXRpY3MuY29tPC9zcGFuPidcbiAgICApO1xuICB9XG5cbiAgb25CdXR0b25DbGljayhidXR0b246IGFueSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBmb3JtIGJ1dHRvbiAoZnJvbSBhY3RpdmVDdXN0b21Gb3JtQnV0dG9uKSBvciByZWd1bGFyIGJhbm5lciBidXR0b25cbiAgICBpZiAoIWV2ZW50ICYmIChidXR0b24uYWN0aW9uID09PSAnc3VibWl0JyB8fCBidXR0b24uYWN0aW9uID09PSAnbGluaycgfHwgYnV0dG9uLmlkID09PSAnYWRkLXVzZXInIHx8IGJ1dHRvbi5pZCA9PT0gJ2xlYXJuLW1vcmUnKSkge1xuICAgICAgLy8gSGFuZGxlIGZvcm0gYnV0dG9ucyB3aXRoIG5ldyBsb2dpY1xuICAgICAgaWYgKCBidXR0b24uaWQgPT09ICdhZGQtdXNlcicpIHtcbiAgICAgICAgLy8gSGFuZGxlIGZvcm0gc3VibWlzc2lvbiAoZXhpc3RpbmcgQWRkIFVzZXIgZnVuY3Rpb25hbGl0eSlcbiAgICAgICAgdGhpcy5vbkFkZFVzZXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoYnV0dG9uLmFjdGlvbiA9PT0gJ2xpbmsnICYmIGJ1dHRvbi5saW5rKSB7XG4gICAgICAgIC8vIEhhbmRsZSBsaW5rIG5hdmlnYXRpb24gKExlYXJuIE1vcmUgZnVuY3Rpb25hbGl0eSlcbiAgICAgICAgd2luZG93Lm9wZW4oYnV0dG9uLmxpbmssICdfYmxhbmsnKTtcbiAgICAgIH0gZWxzZSBpZiAoYnV0dG9uLm9uQ2xpY2spIHtcbiAgICAgICAgLy8gSGFuZGxlIGN1c3RvbSBjbGljayBmdW5jdGlvblxuICAgICAgICBidXR0b24ub25DbGljaygpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXZlbnQpIHtcbiAgICAgIC8vIEhhbmRsZSByZWd1bGFyIGJhbm5lciBidXR0b25zIHdpdGggb3JpZ2luYWwgbG9naWMgKGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICB0aGlzLmJ1dHRvbkNsaWNrLmVtaXQoe1xuICAgICAgICB0eXBlOiBidXR0b24udHlwZSBhcyAncHJpbWFyeScgfCAnc2Vjb25kYXJ5JyxcbiAgICAgICAgYnV0dG9uLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNCdXR0b25BcnJheSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLmFjdGl2ZUN1c3RvbUZvcm1CdXR0b24pO1xuICB9XG5cbiAgaXNFbXB0eU9iamVjdChvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChvYmopIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbiAgICB9ZWxzZXtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRm9ybWx5RmllbGRzKCk6IHZvaWQge1xuICAgIC8vIFNraXAgRm9ybWx5IGZpZWxkIGdlbmVyYXRpb24gaWYgdXNpbmcgcHJlYnVpbHQgZmllbGRzXG4gICAgaWYgKHRoaXMudXNlUHJlYnVpbHRGaWVsZHMoKSkge1xuICAgICAgdGhpcy5mb3JtbHlGaWVsZHMgPSBbXTtcbiAgICAgIHRoaXMuYWxsRm9ybWx5RmllbGRzID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZvcm1Db25maWcgfHwgIXRoaXMuZm9ybUNvbmZpZy5maWVsZHMgfHwgdGhpcy5mb3JtQ29uZmlnLmZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZm9ybWx5RmllbGRzID0gW107XG4gICAgICB0aGlzLmFsbEZvcm1seUZpZWxkcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCBsYXlvdXQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuYWN0aXZlRm9ybUxheW91dDtcbiAgICBjb25zdCBmaWVsZHNQZXJSb3cgPSBsYXlvdXQuZmllbGRzUGVyUm93IHx8IDI7XG4gICAgY29uc3QgaW5pdGlhbFZpc2libGVGaWVsZHMgPSBsYXlvdXQuaW5pdGlhbFZpc2libGVGaWVsZHMgfHwgZmllbGRzUGVyUm93O1xuICAgIFxuICAgIC8vIFVwZGF0ZSBDU1MgZ3JpZCBjb2x1bW5zIGR5bmFtaWNhbGx5XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1ucyhmaWVsZHNQZXJSb3cpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBhbGwgZmllbGRzIHdpdGggcHJvcGVyIGhpZGUgZXhwcmVzc2lvbnMgZm9yIGNvbmRpdGlvbmFsIGZpZWxkc1xuICAgIHRoaXMuYWxsRm9ybWx5RmllbGRzID0gdGhpcy5mb3JtQ29uZmlnLmZpZWxkcy5tYXAoKGZpZWxkLCBpbmRleCkgPT4ge1xuICAgICAgLy8gTm9ybWFsaXplIGZpZWxkIHN0cnVjdHVyZSB0byBwcm9wZXIgRm9ybWx5IGZvcm1hdFxuICAgICAgY29uc3QgcGxhY2Vob2xkZXJWYWx1ZSA9IGZpZWxkLnBsYWNlaG9sZGVyIHx8IGZpZWxkLnByb3BzPy5wbGFjZWhvbGRlciB8fCBmaWVsZC5wYXJhbXM/LnBsYWNlaG9sZGVyIHx8IGZpZWxkLnByb3BzPy5wYXJhbXM/LnBsYWNlaG9sZGVyIHx8ICcnO1xuICAgICAgXG4gICAgICBjb25zdCBpc0NvbmRpdGlvbmFsRmllbGQgPSBpbmRleCA+PSBpbml0aWFsVmlzaWJsZUZpZWxkcztcbiAgICAgIFxuICAgICAgY29uc3QgZm9ybWx5RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAgICBrZXk6IGZpZWxkLmtleSxcbiAgICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmdldEZpZWxkQ2xhc3NOYW1lKGluZGV4ICUgZmllbGRzUGVyUm93LCBmaWVsZHNQZXJSb3cpLFxuICAgICAgICBoaWRlRXhwcmVzc2lvbjogaXNDb25kaXRpb25hbEZpZWxkID8gKCkgPT4gIXRoaXMuc2hvdWxkU2hvd0FkZGl0aW9uYWxGaWVsZHMoKSA6IGZhbHNlLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIC8vIEhhbmRsZSBtaXhlZCBzdHJ1Y3R1cmUgLSBzb21lIGZpZWxkcyBoYXZlIHByb3BzIGF0IHJvb3QsIG90aGVycyBuZXN0ZWRcbiAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJWYWx1ZSxcbiAgICAgICAgICByZXF1aXJlZDogZmllbGQucmVxdWlyZWQgfHwgZmllbGQucHJvcHM/LnJlcXVpcmVkIHx8IGZhbHNlLFxuICAgICAgICAgIGRpc2FibGVkOiBmaWVsZC5kaXNhYmxlZCB8fCBmaWVsZC5wcm9wcz8uZGlzYWJsZWQgfHwgZmFsc2UsXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRm9yIHNlbGVjdCBmaWVsZHMsIGluY2x1ZGUgc2VsZWN0LXNwZWNpZmljIHByb3BlcnRpZXNcbiAgICAgICAgICAuLi4oZmllbGQucHJvcHM/Lm9wdGlvbnMgJiYge1xuICAgICAgICAgICAgb3B0aW9uczogZmllbGQucHJvcHMub3B0aW9ucyxcbiAgICAgICAgICAgIG11bHRpcGxlOiBmaWVsZC5wcm9wcy5tdWx0aXBsZSB8fCBmYWxzZSxcbiAgICAgICAgICAgIGJpbmRMYWJlbDogZmllbGQucHJvcHMucGFyYW1zPy5iaW5kTGFiZWwgfHwgJ2xhYmVsJyxcbiAgICAgICAgICAgIGJpbmRWYWx1ZTogZmllbGQucHJvcHMucGFyYW1zPy5iaW5kVmFsdWUgfHwgJ3ZhbHVlJyxcbiAgICAgICAgICAgIGlzQ2xlYXJhYmxlOiBmaWVsZC5wcm9wcy5wYXJhbXM/LmlzQ2xlYXJhYmxlICE9PSBmYWxzZSxcbiAgICAgICAgICAgIHNob3dDaGVja2JveGVzOiBmaWVsZC5wcm9wcy5wYXJhbXM/LnNob3dDaGVja2JveGVzIHx8IGZhbHNlXG4gICAgICAgICAgfSksXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gSW5jbHVkZSBwYXJhbXMgZm9yIGNvbXBvbmVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAuLi4oZmllbGQucGFyYW1zIHx8IHt9KSxcbiAgICAgICAgICAgIC4uLihmaWVsZC5wcm9wcz8ucGFyYW1zIHx8IHt9KSxcbiAgICAgICAgICAgIC8vIEVuc3VyZSBsYWJlbCBhbmQgcGxhY2Vob2xkZXIgYXJlIHNldFxuICAgICAgICAgICAgbGFiZWw6IGZpZWxkLmxhYmVsIHx8IGZpZWxkLnByb3BzPy5wYXJhbXM/LmxhYmVsIHx8IHBsYWNlaG9sZGVyVmFsdWUsXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJWYWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRhdG9yczogdGhpcy5nZXRGb3JtbHlWYWxpZGF0b3JzKGZpZWxkKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlIGlmIHByb3ZpZGVkXG4gICAgICBpZiAoZmllbGQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm1vZGVsW2ZpZWxkLmtleSBhcyBzdHJpbmddID0gZmllbGQudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBmb3JtIGNvbnRyb2wgdG8gZm9ybSBncm91cCBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICBjb25zdCBrZXkgPSBmaWVsZC5rZXkgYXMgc3RyaW5nO1xuICAgICAgaWYgKCF0aGlzLmZvcm0uZ2V0KGtleSkpIHtcbiAgICAgICAgbGV0IGZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcbiAgICAgICAgaWYgKGZpZWxkLmZvcm1Db250cm9sKSB7XG4gICAgICAgICAgZm9ybUNvbnRyb2wgPSBmaWVsZC5mb3JtQ29udHJvbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gZmllbGQucGFyYW1zPy52YWxpZGF0b3JzIHx8IFtdO1xuICAgICAgICAgIGZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKGZpZWxkLnZhbHVlIHx8ICcnLCB2YWxpZGF0b3JzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChrZXksIGZvcm1Db250cm9sKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm1seUZpZWxkO1xuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtbHlGaWVsZHMgPSB0aGlzLmFsbEZvcm1seUZpZWxkcy5zbGljZSgwLCBpbml0aWFsVmlzaWJsZUZpZWxkcyk7XG4gICAgdGhpcy51cGRhdGVBZGRpdGlvbmFsRmllbGRzKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEZpZWxkQ2xhc3NOYW1lKGluZGV4OiBudW1iZXIsIGZpZWxkc1BlclJvdzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2xTaXplID0gMTIgLyBmaWVsZHNQZXJSb3c7XG4gICAgcmV0dXJuIGBjb2wtJHtjb2xTaXplfWA7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUdyaWRDb2x1bW5zKGZpZWxkc1BlclJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gVXNlIENTUyBjdXN0b20gcHJvcGVydHkgdG8gZHluYW1pY2FsbHkgdXBkYXRlIGdyaWQgY29sdW1uc1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1mb3JtLWdyaWQtY29sdW1ucycsIGZpZWxkc1BlclJvdy50b1N0cmluZygpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9ybWx5VmFsaWRhdG9ycyhmaWVsZDogYW55KTogYW55IHtcbiAgICBjb25zdCB2YWxpZGF0b3JzOiBhbnkgPSB7fTtcbiAgICBcbiAgICBpZiAoZmllbGQuZm9ybUNvbnRyb2wgJiYgZmllbGQuZm9ybUNvbnRyb2wudmFsaWRhdG9yKSB7XG4gICAgICB2YWxpZGF0b3JzLnZhbGlkYXRpb24gPSBmaWVsZC5mb3JtQ29udHJvbC52YWxpZGF0b3I7XG4gICAgfVxuICAgIFxuICAgIGlmIChmaWVsZC5wYXJhbXM/LnZhbGlkYXRvcnMgJiYgQXJyYXkuaXNBcnJheShmaWVsZC5wYXJhbXMudmFsaWRhdG9ycykpIHtcbiAgICAgIHZhbGlkYXRvcnMudmFsaWRhdGlvbiA9IGZpZWxkLnBhcmFtcy52YWxpZGF0b3JzO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZmllbGQudmFsaWRhdG9ycykge1xuICAgICAgaWYgKGZpZWxkLnZhbGlkYXRvcnMudmFsaWRhdGlvbikge1xuICAgICAgICB2YWxpZGF0b3JzLnZhbGlkYXRpb24gPSBmaWVsZC52YWxpZGF0b3JzLnZhbGlkYXRpb247XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQudmFsaWRhdG9ycykpIHtcbiAgICAgICAgdmFsaWRhdG9ycy52YWxpZGF0aW9uID0gZmllbGQudmFsaWRhdG9ycztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cblxuXG4gIHNob3VsZFNob3dBZGRpdGlvbmFsRmllbGRzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5hY3RpdmVGb3JtSW5wdXRzIHx8IHRoaXMuYWN0aXZlRm9ybUlucHV0cy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmFjdGl2ZUZvcm1MYXlvdXQ7XG4gICAgY29uc3QgaW5pdGlhbFZpc2libGVGaWVsZHMgPSBsYXlvdXQuaW5pdGlhbFZpc2libGVGaWVsZHMgfHwgbGF5b3V0LmZpZWxkc1BlclJvdyB8fCAyO1xuICAgIFxuICAgIC8vIElmIG5vIGNvbmRpdGlvbmFsIGZpZWxkcyBjb25maWd1cmF0aW9uLCBjaGVjayBpZiBpbml0aWFsIGZpZWxkcyBhcmUgZmlsbGVkXG4gICAgaWYgKCFsYXlvdXQuY29uZGl0aW9uYWxGaWVsZHMpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyZUFsbFZpc2libGVGaWVsZHNGaWxsZWQoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIGN1c3RvbSBzaG93V2hlbiBmdW5jdGlvbiBpZiBwcm92aWRlZFxuICAgIGNvbnN0IHNob3VsZFNob3cgPSBsYXlvdXQuY29uZGl0aW9uYWxGaWVsZHMuc2hvd1doZW4gPyBcbiAgICAgIGxheW91dC5jb25kaXRpb25hbEZpZWxkcy5zaG93V2hlbih0aGlzLm1vZGVsKSA6IHRoaXMuYXJlQWxsVmlzaWJsZUZpZWxkc0ZpbGxlZCgpO1xuICAgIHJldHVybiBzaG91bGRTaG93O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBZGRpdGlvbmFsRmllbGRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuYWN0aXZlRm9ybUxheW91dDtcbiAgICBjb25zdCBmaWVsZHNQZXJSb3cgPSBsYXlvdXQuZmllbGRzUGVyUm93IHx8IDI7XG4gICAgY29uc3QgaW5pdGlhbFZpc2libGVGaWVsZHMgPSBsYXlvdXQuaW5pdGlhbFZpc2libGVGaWVsZHMgfHwgZmllbGRzUGVyUm93O1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBzaG93IGFkZGl0aW9uYWwgZmllbGRzXG4gICAgY29uc3Qgc2hvdWxkU2hvd0NvbmRpdGlvbmFsRmllbGRzID0gdGhpcy5zaG91bGRTaG93QWRkaXRpb25hbEZpZWxkcygpO1xuICAgIFxuICAgIGlmIChzaG91bGRTaG93Q29uZGl0aW9uYWxGaWVsZHMgJiYgdGhpcy5mb3JtQ29uZmlnLmZpZWxkcy5sZW5ndGggPiBpbml0aWFsVmlzaWJsZUZpZWxkcykge1xuICAgICAgLy8gR2V0IHNwZWNpZmljIGNvbmRpdGlvbmFsIGZpZWxkIGluZGljZXMgb3IgYWxsIHJlbWFpbmluZyBmaWVsZHNcbiAgICAgIGNvbnN0IGNvbmRpdGlvbmFsRmllbGRJbmRpY2VzID0gbGF5b3V0LmNvbmRpdGlvbmFsRmllbGRzPy5maWVsZHMgfHwgXG4gICAgICAgIEFycmF5LmZyb20oe2xlbmd0aDogdGhpcy5mb3JtQ29uZmlnLmZpZWxkcy5sZW5ndGggLSBpbml0aWFsVmlzaWJsZUZpZWxkc30sIChfLCBpKSA9PiBpICsgaW5pdGlhbFZpc2libGVGaWVsZHMpO1xuICAgICAgXG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmllbGRzID0gY29uZGl0aW9uYWxGaWVsZEluZGljZXMubWFwKGluZGV4ID0+IHRoaXMuZm9ybUNvbmZpZy5maWVsZHNbaW5kZXhdKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBcbiAgICAgIC8vIE5vcm1hbGl6ZSBhZGRpdGlvbmFsIGZpZWxkcyB0byBwcm9wZXIgRm9ybWx5IGZvcm1hdFxuICAgICAgdGhpcy5hZGRpdGlvbmFsRm9ybWx5RmllbGRzID0gYWRkaXRpb25hbEZpZWxkcy5tYXAoKGZpZWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBOb3JtYWxpemUgZmllbGQgc3RydWN0dXJlIHRvIHByb3BlciBGb3JtbHkgZm9ybWF0XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyVmFsdWUgPSBmaWVsZC5wbGFjZWhvbGRlciB8fCBmaWVsZC5wcm9wcz8ucGxhY2Vob2xkZXIgfHwgZmllbGQucGFyYW1zPy5wbGFjZWhvbGRlciB8fCBmaWVsZC5wcm9wcz8ucGFyYW1zPy5wbGFjZWhvbGRlciB8fCAnJztcbiAgICAgICAgXG4gICAgICAgIGNvbnNvbGUubG9nKCdQcm9jZXNzaW5nIGNvbmRpdGlvbmFsIGZpZWxkOicsIGZpZWxkLmtleSwgJ3BsYWNlaG9sZGVyOicsIHBsYWNlaG9sZGVyVmFsdWUsICdmaWVsZDonLCBmaWVsZCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBmb3JtbHlGaWVsZDogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgICBjbGFzc05hbWU6IHRoaXMuZ2V0RmllbGRDbGFzc05hbWUoaW5kZXgsIGZpZWxkc1BlclJvdyksXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBtaXhlZCBzdHJ1Y3R1cmUgLSBzb21lIGZpZWxkcyBoYXZlIHByb3BzIGF0IHJvb3QsIG90aGVycyBuZXN0ZWRcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwbGFjZWhvbGRlclZhbHVlLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IGZpZWxkLnJlcXVpcmVkIHx8IGZpZWxkLnByb3BzPy5yZXF1aXJlZCB8fCBmYWxzZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBmaWVsZC5kaXNhYmxlZCB8fCBmaWVsZC5wcm9wcz8uZGlzYWJsZWQgfHwgZmFsc2UsXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZvciBzZWxlY3QgZmllbGRzLCBpbmNsdWRlIHNlbGVjdC1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAuLi4oZmllbGQucHJvcHM/Lm9wdGlvbnMgJiYge1xuICAgICAgICAgICAgICBvcHRpb25zOiBmaWVsZC5wcm9wcy5vcHRpb25zLFxuICAgICAgICAgICAgICBtdWx0aXBsZTogZmllbGQucHJvcHMubXVsdGlwbGUgfHwgZmFsc2UsXG4gICAgICAgICAgICAgIGJpbmRMYWJlbDogZmllbGQucHJvcHMucGFyYW1zPy5iaW5kTGFiZWwgfHwgJ2xhYmVsJyxcbiAgICAgICAgICAgICAgYmluZFZhbHVlOiBmaWVsZC5wcm9wcy5wYXJhbXM/LmJpbmRWYWx1ZSB8fCAndmFsdWUnLFxuICAgICAgICAgICAgICBpc0NsZWFyYWJsZTogZmllbGQucHJvcHMucGFyYW1zPy5pc0NsZWFyYWJsZSAhPT0gZmFsc2UsXG4gICAgICAgICAgICAgIHNob3dDaGVja2JveGVzOiBmaWVsZC5wcm9wcy5wYXJhbXM/LnNob3dDaGVja2JveGVzIHx8IGZhbHNlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSW5jbHVkZSBwYXJhbXMgZm9yIGNvbXBvbmVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgLi4uKGZpZWxkLnBhcmFtcyB8fCB7fSksXG4gICAgICAgICAgICAgIC4uLihmaWVsZC5wcm9wcz8ucGFyYW1zIHx8IHt9KSxcbiAgICAgICAgICAgICAgLy8gRW5zdXJlIGxhYmVsIGFuZCBwbGFjZWhvbGRlciBhcmUgc2V0XG4gICAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbCB8fCBmaWVsZC5wcm9wcz8ucGFyYW1zPy5sYWJlbCB8fCBwbGFjZWhvbGRlclZhbHVlLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJWYWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsaWRhdG9yczogZmllbGQudmFsaWRhdG9ycyB8fCBmaWVsZC5wcm9wcz8udmFsaWRhdG9ycyB8fCB7fVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmIChmaWVsZC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbFtmaWVsZC5rZXkgYXMgc3RyaW5nXSA9IGZpZWxkLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGZvcm0gY29udHJvbCB0byBmb3JtIGdyb3VwIGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICAgICAgY29uc3Qga2V5ID0gZmllbGQua2V5IGFzIHN0cmluZztcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0uZ2V0KGtleSkpIHtcbiAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChrZXksIGZpZWxkLmZvcm1Db250cm9sIHx8IG5ldyBGb3JtQ29udHJvbChmaWVsZC52YWx1ZSB8fCAnJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1seUZpZWxkO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENsZWFyIGFkZGl0aW9uYWwgZmllbGRzIGlmIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXRcbiAgICAgIHRoaXMuYWRkaXRpb25hbEZvcm1seUZpZWxkcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXZhbHVhdGVTaG93V2hlbihzaG93V2hlbjogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFzaG93V2hlbikgcmV0dXJuIHRydWU7XG4gICAgXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBzaG93V2hlbiBjb25kaXRpb25zXG4gICAgaWYgKHR5cGVvZiBzaG93V2hlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHNob3dXaGVuKHRoaXMubW9kZWwsIHRoaXMuZm9ybSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0eXBlb2Ygc2hvd1doZW4gPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBIYW5kbGUgZmllbGQtYmFzZWQgY29uZGl0aW9ucyBsaWtlIHsgZmllbGQ6ICdyb2xlJywgdmFsdWU6ICdhZG1pbicgfVxuICAgICAgaWYgKHNob3dXaGVuLmZpZWxkICYmIHNob3dXaGVuLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxbc2hvd1doZW4uZmllbGRdID09PSBzaG93V2hlbi52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBIYW5kbGUgZm9ybSBtb2RlbCBjaGFuZ2VzIGZyb20gRm9ybWx5XG4gIG9uRm9ybU1vZGVsQ2hhbmdlKG1vZGVsOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0geyAuLi50aGlzLm1vZGVsLCAuLi5tb2RlbCB9O1xuICAgIFxuICAgIC8vIFRyaWdnZXIgZmllbGQgdmlzaWJpbGl0eSB1cGRhdGVzIGJ5IHVwZGF0aW5nIHRoZSBhbGxGb3JtbHlGaWVsZHMgYXJyYXlcbiAgICAvLyBUaGlzIHdpbGwgY2F1c2UgRm9ybWx5IHRvIHJlLWV2YWx1YXRlIGhpZGVFeHByZXNzaW9uIGZvciBhbGwgZmllbGRzXG4gICAgdGhpcy5hbGxGb3JtbHlGaWVsZHMgPSBbLi4udGhpcy5hbGxGb3JtbHlGaWVsZHNdO1xuICAgIFxuICAgIC8vIEVtaXQgdGhlIGNoYW5nZSBldmVudFxuICAgIHRoaXMub25Gb3JtRXZlbnQuZW1pdCh7IFxuICAgICAgdHlwZTogJ2Zvcm0tbW9kZWwtY2hhbmdlJywgXG4gICAgICBkYXRhOiBtb2RlbCBcbiAgICB9KTtcbiAgfVxuXG5cblxuXG5cblxuXG4gIC8vIEdldCBpbml0aWFsIGZpZWxkcyB0byBkaXNwbGF5IGluIHRoZSBmaXJzdCByb3dcbiAgZ2V0SW5pdGlhbEZpZWxkcygpOiBGb3JtRmllbGRDb25maWdbXSB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZUZvcm1JbnB1dHMpIHJldHVybiBbXTtcbiAgICBcbiAgICBjb25zdCBpbml0aWFsQ291bnQgPSB0aGlzLmFjdGl2ZUZvcm1MYXlvdXQuaW5pdGlhbFZpc2libGVGaWVsZHMgfHwgdGhpcy5hY3RpdmVGb3JtTGF5b3V0LmZpZWxkc1BlclJvdyB8fCAyO1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZvcm1JbnB1dHMuc2xpY2UoMCwgaW5pdGlhbENvdW50KTtcbiAgfVxuXG5cbiAgLy8gQ2hlY2sgaWYgYWxsIHZpc2libGUgZmllbGRzIGFyZSBmaWxsZWQgYW5kIGZvcm0gaXMgdmFsaWRcbiAgYXJlQWxsVmlzaWJsZUZpZWxkc0ZpbGxlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlRm9ybUlucHV0cyB8fCB0aGlzLmFjdGl2ZUZvcm1JbnB1dHMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBcbiAgICAvLyBHZXQgbGF5b3V0IGNvbmZpZ3VyYXRpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGZpZWxkcyBzaG91bGQgYmUgdmlzaWJsZVxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuYWN0aXZlRm9ybUxheW91dDtcbiAgICBjb25zdCBpbml0aWFsVmlzaWJsZUZpZWxkcyA9IGxheW91dC5pbml0aWFsVmlzaWJsZUZpZWxkcyB8fCBsYXlvdXQuZmllbGRzUGVyUm93IHx8IDI7XG4gICAgXG4gICAgLy8gR2V0IGFsbCBjdXJyZW50bHkgdmlzaWJsZSBmaWVsZHMgKGluaXRpYWwgKyBjb25kaXRpb25hbCBpZiBzaG93bilcbiAgICBjb25zdCB2aXNpYmxlRmllbGRzID0gdGhpcy5hY3RpdmVGb3JtSW5wdXRzLnNsaWNlKDAsIGluaXRpYWxWaXNpYmxlRmllbGRzKTtcbiAgICBpZiAodGhpcy5zaG91bGRTaG93QWRkaXRpb25hbEZpZWxkcygpKSB7XG4gICAgICBjb25zdCBjb25kaXRpb25hbEZpZWxkSW5kaWNlcyA9IGxheW91dC5jb25kaXRpb25hbEZpZWxkcz8uZmllbGRzIHx8IFxuICAgICAgICBBcnJheS5mcm9tKHtsZW5ndGg6IHRoaXMuYWN0aXZlRm9ybUlucHV0cy5sZW5ndGggLSBpbml0aWFsVmlzaWJsZUZpZWxkc30sIChfLCBpKSA9PiBpICsgaW5pdGlhbFZpc2libGVGaWVsZHMpO1xuICAgICAgY29uc3QgY29uZGl0aW9uYWxGaWVsZHMgPSBjb25kaXRpb25hbEZpZWxkSW5kaWNlcy5tYXAoaW5kZXggPT4gdGhpcy5hY3RpdmVGb3JtSW5wdXRzW2luZGV4XSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgdmlzaWJsZUZpZWxkcy5wdXNoKC4uLmNvbmRpdGlvbmFsRmllbGRzKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgYWxsIHZpc2libGUgZmllbGRzIGhhdmUgdmFsdWVzIHVzaW5nIHRoZWlyIGtleXNcbiAgICBjb25zdCBhbGxGaWVsZHNGaWxsZWQgPSB2aXNpYmxlRmllbGRzLmV2ZXJ5KGZpZWxkID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkS2V5ID0gZmllbGQua2V5O1xuICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHRoaXMubW9kZWxbZmllbGRLZXldO1xuICAgICAgXG4gICAgICBpZiAoIWZpZWxkVmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICAgIFxuICAgICAgLy8gRm9yIHN0cmluZyB2YWx1ZXMsIGNoZWNrIGlmIG5vdCBlbXB0eSBhZnRlciB0cmltXG4gICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBmaWVsZFZhbHVlLnRyaW0oKSAhPT0gJyc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZvciBhcnJheXMgKG11bHRpLXNlbGVjdCksIGNoZWNrIGlmIG5vdCBlbXB0eVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWUubGVuZ3RoID4gMDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gICAgXG4gICAgY29uc3QgZm9ybVZhbGlkID0gdGhpcy5mb3JtLnZhbGlkO1xuXG4gICAgcmV0dXJuIGFsbEZpZWxkc0ZpbGxlZCAmJiBmb3JtVmFsaWQ7XG4gIH1cbiAgXG59XG4iLCJAaWYgKGJhbm5lckNvbnRlbnQoKTsgYXMgY29udGVudCkge1xuICA8ZGl2IGNsYXNzPVwiZXJyb3ItcGFnZSBtZXNzYWdlLWJhbm5lci12MlwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWNvbnRhaW5lclwiIFtuZ1N0eWxlXT1cInsgZ2FwOiBjb250ZW50R2FwIHx8ICd2YXIoLS1tZWRpdW0tMzJweCwgMzJweCknIH1cIj5cbiAgICAgIEBpZihjb250ZW50Py5tZXNzYWdlSWNvbil7XG4gICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2UtY29udGFpbmVyXCJcbiAgICAgICAgW25nU3R5bGVdPVwieyAnbWFyZ2luLWJvdHRvbSc6IHNwYWNpbmdCZXR3ZWVuSW1hZ2VBbmREZXNjcmlwdGlvbiA/PyAndmFyKC0tc21hbGwtMTZweCwgMTZweCknIH1cIj5cbiAgICAgICAgPGltZyBbc3JjXT1cImNvbnRlbnQubWVzc2FnZUljb25cIiBbYWx0XT1cImNvbnRlbnQudHlwZSArICcgaW1hZ2UnXCJcbiAgICAgICAgICBbc3R5bGUuLS1tZXNzYWdlLWljb24taGVpZ2h0XT1cImNvbnRlbnQubWVzc2FnZUljb25TaXplPy5oZWlnaHRcIlxuICAgICAgICAgIFtzdHlsZS4tLW1lc3NhZ2UtaWNvbi13aWR0aF09XCJjb250ZW50Lm1lc3NhZ2VJY29uU2l6ZT8ud2lkdGhcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGUtY2xhc3NcIiBbbmdDbGFzc109XCJ0aXRsZUNsYXNzIHx8ICd0aXRsZS1jbGFzcydcIiBbaW5uZXJIVE1MXT1cImNvbnRlbnQudGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cImRlc2NyaXB0aW9uXCIgW25nQ2xhc3NdPVwiZGVzY3JpcHRpb25DbGFzcyB8fCAnZGVzY3JpcHRpb24nXCIgW2lubmVySFRNTF09XCJjb250ZW50LmRlc2NyaXB0aW9uXCI+PC9wPiBcbiAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cInsgbWFyZ2luOiBiYW5uZXI/LnNwYWNpbmcgKyAncHggMHB4JyB9XCI+XG4gICAgICAgICAgICA8c2EtbWVzc2FnZS1iYW5uZXIgKm5nSWY9XCIhaXNFbXB0eU9iamVjdChiYW5uZXIpXCIgW3R5cGVdPVwiYmFubmVyPy50eXBlXCIgW2Jhbm5lckljb25dPVwiYmFubmVyPy5iYW5uZXJJY29uXCIgW2J1dHRvbkljb25dPVwiYmFubmVyPy5idXR0b25JY29uXCJcbiAgICAgICAgICAgICAgW2Jhbm5lckljb25TaXplXT1cImJhbm5lcj8uYmFubmVySWNvblNpemVcIiBbYnV0dG9uVHlwZV09XCJiYW5uZXI/LmJ1dHRvblR5cGVcIiBbYnV0dG9uU2l6ZV09XCJiYW5uZXI/LmJ1dHRvblNpemVcIiBbYnV0dG9uSWNvblBvc2l0aW9uXT1cImJhbm5lcj8uYnV0dG9uSWNvblBvc2l0aW9uXCJcbiAgICAgICAgICAgICAgW2J1dHRvbkljb25TaXplXT1cImJhbm5lcj8uYnV0dG9uSWNvblNpemVcIiBbYWN0aW9uVGV4dF09XCJiYW5uZXI/LmFjdGlvblRleHRcIiA+XG4gICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJiYW5uZXI/LnRleHRcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvc2EtbWVzc2FnZS1iYW5uZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgPCEtLSBGb3JtIGlucHV0cyBzZWN0aW9uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJlYnVpbHRGb3JtRmllbGRzIHx8IGFjdGl2ZUZvcm1JbnB1dHM/Lmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkcy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPCEtLSBQcmVidWlsdCBmb3JtIGZpZWxkcyAoZGlyZWN0IGNvbXBvbmVudCByZW5kZXJpbmcpIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlUHJlYnVpbHRGaWVsZHMoKSAmJiBwcmVidWlsdEZvcm1GaWVsZHNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJlYnVpbHRGb3JtRmllbGRzXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPCEtLSBVc2UgRm9ybWx5IGZvciBwcm9wZXIgZm9ybSByZW5kZXJpbmcgLS0+XG4gICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiZGlhbG9nLWZvcm1cIiAqbmdJZj1cIiF1c2VQcmVidWlsdEZpZWxkcygpICYmIGFjdGl2ZUZvcm1JbnB1dHM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxmb3JtbHktZm9ybSBcbiAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBcbiAgICAgICAgICAgICAgICAgIFtmaWVsZHNdPVwiYWxsRm9ybWx5RmllbGRzXCIgXG4gICAgICAgICAgICAgICAgICBbbW9kZWxdPVwibW9kZWxcIlxuICAgICAgICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cIm9uRm9ybU1vZGVsQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2Zvcm1seS1mb3JtPlxuICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEN1c3RvbSBmb3JtIGJ1dHRvbihzKSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1idXR0b24tY29udGFpbmVyXCIgKm5nSWY9XCJhY3RpdmVDdXN0b21Gb3JtQnV0dG9uICYmICF1c2VQcmVidWlsdEZpZWxkcygpXCI+XG4gICAgICAgICAgICA8IS0tIFN1cHBvcnQgYm90aCBzaW5nbGUgYnV0dG9uIGFuZCBhcnJheSBvZiBidXR0b25zIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQnV0dG9uQXJyYXkoKTsgZWxzZSBzaW5nbGVCdXR0b25cIj5cbiAgICAgICAgICAgICAgPHNhLWJ1dHRvbiBcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGFjdGl2ZUN1c3RvbUZvcm1CdXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2lkXT1cImJ1dHRvbi5pZFwiXG4gICAgICAgICAgICAgICAgW3RleHRdPVwiYnV0dG9uLnRleHRcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImJ1dHRvbi50eXBlXCJcbiAgICAgICAgICAgICAgICBbc2l6ZV09XCJidXR0b24uc2l6ZVwiXG4gICAgICAgICAgICAgICAgW3N0YXRlXT1cImJ1dHRvbi5zdGF0ZVwiXG4gICAgICAgICAgICAgICAgW0ltYWdlUGF0aF09XCJidXR0b24uSW1hZ2VQYXRoXCJcbiAgICAgICAgICAgICAgICBbaWNvblBvc2l0aW9uXT1cImJ1dHRvbi5pY29uUG9zaXRpb25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrKGJ1dHRvbilcIj5cbiAgICAgICAgICAgICAgPC9zYS1idXR0b24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVCdXR0b24+XG4gICAgICAgICAgICAgIDxzYS1idXR0b24gY2xhc3M9XCJhY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi5pZFwiXG4gICAgICAgICAgICAgICAgW3RleHRdPVwiYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi50ZXh0XCJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCJhY3RpdmVDdXN0b21Gb3JtQnV0dG9uLnR5cGVcIlxuICAgICAgICAgICAgICAgIFtzaXplXT1cImFjdGl2ZUN1c3RvbUZvcm1CdXR0b24uc2l6ZVwiXG4gICAgICAgICAgICAgICAgW3N0YXRlXT1cImFjdGl2ZUN1c3RvbUZvcm1CdXR0b24uc3RhdGVcIlxuICAgICAgICAgICAgICAgIFtJbWFnZVBhdGhdPVwiYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi5JbWFnZVBhdGhcIlxuICAgICAgICAgICAgICAgIFtpY29uUG9zaXRpb25dPVwiYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi5pY29uUG9zaXRpb25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrKGFjdGl2ZUN1c3RvbUZvcm1CdXR0b24pXCI+XG4gICAgICAgICAgICAgIDwvc2EtYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgXG4gICAgICAgICAgPCEtLSBEaXZpZGVyIHNlY3Rpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXItc2VjdGlvblwiICpuZ0lmPVwiYWN0aXZlRGl2aWRlciAmJiAhdXNlUHJlYnVpbHRGaWVsZHMoKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJkaXZpZGVyLXRpdGxlXCIgKm5nSWY9XCJhY3RpdmVEaXZpZGVyQ29uZmlnLnRpdGxlXCI+e3sgYWN0aXZlRGl2aWRlckNvbmZpZy50aXRsZSB9fTwvaDM+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiZGl2aWRlci1zdWJ0aXRsZVwiICpuZ0lmPVwiYWN0aXZlRGl2aWRlckNvbmZpZy5zdWJ0aXRsZSB8fCBhY3RpdmVEaXZpZGVyQ29uZmlnLnNob3dTdWJ0aXRsZVdoZW5FbXB0eVwiPlxuICAgICAgICAgICAgICAgIHt7IGFjdGl2ZURpdmlkZXJDb25maWcuc3VidGl0bGUgfHwgJ05vIGl0ZW1zIGFkZGVkIHlldCcgfX1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgICA8IS0tIENoaXBzIHNlY3Rpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtbGlzdFwiICpuZ0lmPVwiYWN0aXZlQ2hpcHM/Lmxlbmd0aCAmJiAhdXNlUHJlYnVpbHRGaWVsZHMoKVwiPlxuICAgICAgICAgICAgPHNhLWNoaXAgXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoaXAgb2YgYWN0aXZlQ2hpcHNcIlxuICAgICAgICAgICAgICAgIFt0ZXh0XT1cImNoaXAubGFiZWwgfHwgY2hpcC50ZXh0IHx8IGNoaXBcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cIidyZWd1bGFyJ1wiXG4gICAgICAgICAgICAgICAgW3N0YXRlXT1cIidkZWZhdWx0J1wiXG4gICAgICAgICAgICAgICAgW2ZpbGxpbmddPVwiJ2ZpbGxlZCdcIlxuICAgICAgICAgICAgICAgIFtpY29uUG9zaXRpb25dPVwiJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgW2ljb25QYXRoXT1cIicuLi9hc3NldHMvY2xvc2VCbHVlT3V0bGluZWQuc3ZnJ1wiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2tFdmVudCk9XCJjaGlwLnJlbW92YWJsZSA/IG9uQ2hpcFJlbW92ZShjaGlwKSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgPC9zYS1jaGlwPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICBcbiAgICAgICAgQGlmKGJ1dHRvbnMpe1xuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWdyb3VwXCI+XG4gICAgICAgICAgQGZvciAoYnV0dG9uIG9mIGJ1dHRvbnM7IHRyYWNrIGJ1dHRvbi50ZXh0KSB7XG4gICAgICAgICAgICA8c2EtYnV0dG9uIFxuICAgICAgICAgICAgICBbdGV4dF09XCJidXR0b24udGV4dFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cImJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgICAgW3NpemVdPVwiYnV0dG9uLnNpemVcIlxuICAgICAgICAgICAgICBbdHlwZV09XCJidXR0b24udHlwZVwiXG4gICAgICAgICAgICAgIFtpY29uUG9zaXRpb25dPVwiYnV0dG9uLmljb25Qb3NpdGlvblwiXG4gICAgICAgICAgICAgIFtidXR0b25JY29uU2l6ZV09XCJidXR0b24uYnV0dG9uSWNvblNpemVcIlxuICAgICAgICAgICAgICAob25DbGlja0V2ZW50KT1cIm9uQnV0dG9uQ2xpY2soYnV0dG9uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtzdGF0ZV09XCIhYXJlQWxsVmlzaWJsZUZpZWxkc0ZpbGxlZCgpID8gJ2Rpc2FibGVkJyA6IGJ1dHRvbj8uc3RhdGVcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImJ1dHRvbi50ZXh0XCI+XG4gICAgICAgICAgICA8L3NhLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIH0iXX0=
527
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1iYW5uZXItdjIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50LWxpYnJhcnkvc3JjL2xpYi9tZXNzYWdlLWJhbm5lci12Mi9tZXNzYWdlLWJhbm5lci12Mi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL21lc3NhZ2UtYmFubmVyLXYyL21lc3NhZ2UtYmFubmVyLXYyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBNEIsTUFBTSxlQUFlLENBQUM7QUFDM0gsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxZQUFZLEVBQXFCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFN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R0FsakJVLHdCQUF3QjtrR0FBeEIsd0JBQXdCLHdtQkFKeEIsQ0FBQyxXQUFXLENBQUMsK0NDckMxQiw2NUxBMEhHLGdzS0R0RlMsWUFBWSwwbEJBQWlCLGVBQWUsdVJBQUUsZ0JBQWdCLCtCQUFDLHNCQUFzQiwwUUFBMkMsV0FBVyxtU0FBRSxtQkFBbUIsK0tBQUUsWUFBWSw4S0FBRSxjQUFjOzsyRkFLN0wsd0JBQXdCO2tCQVJwQyxTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBQyxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLGNBQWMsQ0FBQyxhQUM5TCxDQUFDLFdBQVcsQ0FBQzs4QkF5QmYsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGlDQUFpQztzQkFBekMsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDSSxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBa0NHLFdBQVc7c0JBQXBCLE1BQU07Z0JBb0NNLFdBQVc7c0JBQXZCLEtBQUs7Z0JBSU8sZUFBZTtzQkFBM0IsS0FBSztnQkFJTyxLQUFLO3NCQUFqQixLQUFLO2dCQUlPLFdBQVc7c0JBQXZCLEtBQUs7Z0JBSUcsT0FBTztzQkFBZixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBjb21wdXRlZCwgc2lnbmFsLCBlZmZlY3QsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJY29uU2VydmljZSB9IGZyb20gJy4uL2ljb24vaWNvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEljb25OYW1lIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9pY29uLWludGVyZmFjZSc7XG5pbXBvcnQgeyBCdXR0b25JY29uUG9zaXRpb24sIEJ1dHRvblNpemUsIEJ1dHRvblR5cGUsIEJ1dHRvbkludGVyZmFjZSwgQnV0dG9uQ2xpY2tFdmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYnV0dG9uLWludGVyZmFjZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWVzc2FnZUJhbm5lckNvbXBvbmVudCB9IGZyb20gJy4uL21lc3NhZ2UtYmFubmVyL21lc3NhZ2UtYmFubmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9mb3JtLWlucHV0L2Zvcm0taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1TZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9mb3JtLXNlbGVjdC9mb3JtLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb3JtbHlNb2R1bGUsIEZvcm1seUZpZWxkQ29uZmlnIH0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQgeyBDaGlwc0NvbXBvbmVudCB9IGZyb20gJy4uL2NoaXBzL2NoaXBzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtTGF5b3V0Q29uZmlnLCBGb3JtRmllbGRDb25maWcsIFVuaWZpZWRGb3JtQ29uZmlnIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9mb3JtLWxheW91dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW50ZXJmYWNlIE1lc3NhZ2VCYW5uZXJTdGF0ZSB7XG4gIHR5cGU6ICdkZWZhdWx0JyB8ICdjb25uZWN0aW9uJyB8ICdhY2Nlc3MnIHwgJ2FjY2Vzc1Jlc3RyaWN0ZWQnO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBtZXNzYWdlSWNvbjogc3RyaW5nO1xuICBtZXNzYWdlSWNvblNpemU/OiB7XG4gICAgd2lkdGg/OiBzdHJpbmc7XG4gICAgaGVpZ2h0Pzogc3RyaW5nO1xuICB9O1xuICBzcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNvbnRlbnRHYXA/OiBzdHJpbmc7IFxuICBjb250YWN0VXJsPzogc3RyaW5nO1xuICB0aXRsZUNsYXNzPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbkNsYXNzPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzYS1tZXNzYWdlLWJhbm5lci12MicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEljb25Db21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudCwgSHR0cENsaWVudE1vZHVsZSxNZXNzYWdlQmFubmVyQ29tcG9uZW50LCBGb3JtSW5wdXRDb21wb25lbnQsIEZvcm1TZWxlY3RDb21wb25lbnQsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3JtbHlNb2R1bGUsIENoaXBzQ29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbSWNvblNlcnZpY2VdLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS1iYW5uZXItdjIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tZXNzYWdlLWJhbm5lci12Mi5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUJhbm5lclYyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLy8gU3RhdGUgbWFuYWdlbWVudCB1c2luZyBzaWduYWxzXG4gIHByaXZhdGUgc3RhdGUgPSBzaWduYWw8TWVzc2FnZUJhbm5lclN0YXRlPih7XG4gICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgIHRpdGxlOiAnJyxcbiAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgbWVzc2FnZUljb246ICcnLFxuICAgIG1lc3NhZ2VJY29uU2l6ZToge1xuICAgICAgaGVpZ2h0OiAnMTIuNXJlbSdcbiAgICB9XG4gIH0pO1xuXG4gIC8vIENvbXB1dGVkIHByb3BlcnRpZXNcbiAgcHJvdGVjdGVkIGJhbm5lckNvbnRlbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5zdGF0ZSgpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jdXJyZW50U3RhdGUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5zYW5pdGl6ZURlc2NyaXB0aW9uKGN1cnJlbnRTdGF0ZS5kZXNjcmlwdGlvbilcbiAgICB9O1xuICB9KTtcblxuICBASW5wdXQoKSBtZXNzYWdlVHlwZTogJ2RlZmF1bHQnIHwgJ2Nvbm5lY3Rpb24nIHwgJ2FjY2VzcycgfCAnYWNjZXNzUmVzdHJpY3RlZCc7XG4gIEBJbnB1dCgpIGNvbnRhY3RVcmw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNwYWNpbmdCZXR3ZWVuSW1hZ2VBbmREZXNjcmlwdGlvbj86IHN0cmluZztcbiAgQElucHV0KCkgY29udGVudEdhcD86IHN0cmluZztcbiAgQElucHV0KCkgdGl0bGVDbGFzcz86IHN0cmluZztcbiAgQElucHV0KCkgZGVzY3JpcHRpb25DbGFzcz86IHN0cmluZztcbiAgQElucHV0KCkgYmFubmVyOmFueSA9IHt9O1xuICBASW5wdXQoKSBmb3JtQ29uZmlnOiBVbmlmaWVkRm9ybUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBwcmVidWlsdEZvcm1GaWVsZHM6IFRlbXBsYXRlUmVmPGFueT4gXG4gIEBPdXRwdXQoKSBvbkNvbnRhY3RVc0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gIG1vZGVsOiBhbnkgPSB7fTtcbiAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gIGZvcm1seUZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICBhbGxGaWVsZHNGaWxsZWQgPSBzaWduYWwoZmFsc2UpO1xuICBhZGRpdGlvbmFsRm9ybWx5RmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gIGFsbEZvcm1seUZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICB1c2VQcmVidWlsdEZpZWxkcyA9IHNpZ25hbChmYWxzZSk7XG4gIC8vIENvbXB1dGVkIHByb3BlcnRpZXMgZm9yIHVuaWZpZWQgYWNjZXNzXG4gIGdldCBhY3RpdmVGb3JtSW5wdXRzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnPy5maWVsZHMgfHwgW107XG4gIH1cblxuICBnZXQgYWN0aXZlQ2hpcHMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWc/LmNoaXBzIHx8IFtdO1xuICB9XG5cbiAgZ2V0IGFjdGl2ZUN1c3RvbUZvcm1CdXR0b24oKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnPy5jdXN0b21CdXR0b24gfHwgW107XG4gIH1cblxuICBnZXQgYWN0aXZlRGl2aWRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQ29uZmlnPy5kaXZpZGVyPy5lbmFibGVkID8/IGZhbHNlO1xuICB9IFxuXG4gIGdldCBhY3RpdmVEaXZpZGVyQ29uZmlnKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUNvbmZpZz8uZGl2aWRlciB8fCB7fTtcbiAgfVxuXG4gIGdldCBhY3RpdmVGb3JtTGF5b3V0KCk6IEZvcm1MYXlvdXRDb25maWcge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWc/LmxheW91dCB8fCB7fTtcbiAgfVxuXG4gIEBPdXRwdXQoKSBvbkZvcm1FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8e3R5cGU6IHN0cmluZywgZGF0YTogYW55fT4oKTtcbiAgXG4gIG9uQ2hpcFJlbW92ZShjaGlwOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uRm9ybUV2ZW50LmVtaXQoeyB0eXBlOiAnY2hpcC1yZW1vdmUnLCBkYXRhOiBjaGlwIH0pO1xuICB9XG4gIFxuICBvbkFkZFVzZXIoKTogdm9pZCB7XG4gICAgbGV0IGNsaWNrZWRCdXR0b24gPSB0aGlzLmFjdGl2ZUN1c3RvbUZvcm1CdXR0b247XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5hY3RpdmVDdXN0b21Gb3JtQnV0dG9uKSkge1xuICAgICAgY2xpY2tlZEJ1dHRvbiA9IHRoaXMuYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi5maW5kKGJ0biA9PiBcbiAgICAgICAgYnRuLnRleHQgPT09ICdBZGQgVXNlcicgfHwgYnRuLmlkID09PSAnYWRkLXVzZXInIHx8IGJ0bi5hY3Rpb24gPT09ICdhZGQtdXNlcidcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMub25Gb3JtRXZlbnQuZW1pdCh7IHR5cGU6ICdjdXN0b20tYnV0dG9uLWNsaWNrJywgZGF0YTogY2xpY2tlZEJ1dHRvbiB9KTtcbiAgICAvLyBPbmx5IHJlc2V0IGZvcm0gaWYgZXhwbGljaXRseSBjb25maWd1cmVkIHRvIGRvIHNvXG4gICAgaWYgKGNsaWNrZWRCdXR0b24/LnJlc2V0Rm9ybSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgfVxuICB9XG4gIFxuICAvLyBTZXBhcmF0ZSBtZXRob2QgZm9yIGZvcm0gcmVzZXQgdGhhdCBjYW4gYmUgY2FsbGVkIGV4dGVybmFsbHlcbiAgcmVzZXRGb3JtKCk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSB7fTtcbiAgICB0aGlzLmZvcm0ucmVzZXQoKTtcbiAgICB0aGlzLmFjdGl2ZUZvcm1JbnB1dHM/LmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUZvcm1seUZpZWxkcygpO1xuICB9XG4gIFxuICBhcmVBbGxGaWVsZHNGaWxsZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZUZvcm1JbnB1dHMgfHwgdGhpcy5hY3RpdmVGb3JtSW5wdXRzLmxlbmd0aCA8IDQpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVGb3JtSW5wdXRzLmV2ZXJ5KGZpZWxkID0+IGZpZWxkLnZhbHVlICYmIGZpZWxkLnZhbHVlLnRyaW0oKSAhPT0gJycpO1xuICB9XG4gIFxuXG4gIEBJbnB1dCgpIHNldCBtZXNzYWdlSWNvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoeyAuLi5zLCBtZXNzYWdlSWNvbjogdmFsdWUgfSkpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG1lc3NhZ2VJY29uU2l6ZSh2YWx1ZTogeyB3aWR0aD86IHN0cmluZzsgaGVpZ2h0Pzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7IC4uLnMsIG1lc3NhZ2VJY29uU2l6ZTogdmFsdWUgfSkpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7IC4uLnMsIHRpdGxlOiB2YWx1ZSB9KSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGVzY3JpcHRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgZGVzY3JpcHRpb246IHZhbHVlIH0pKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGJ1dHRvbnM6IEJ1dHRvbkludGVyZmFjZVtdID0gW107XG4gIEBPdXRwdXQoKSBidXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8QnV0dG9uQ2xpY2tFdmVudD4oKTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5pdGlhbGl6YXRpb24gb3IgaWYgbWVzc2FnZVR5cGUgaGFzIGNoYW5nZWRcbiAgICBjb25zdCBzaG91bGRVcGRhdGVCYXNlZE9uVHlwZSA9IGNoYW5nZXNbJ21lc3NhZ2VUeXBlJ10gJiYgXG4gICAgICAvLyBPbmx5IHVwZGF0ZSBiYXNlZCBvbiB0eXBlIGlmIHdlIGRvbid0IGhhdmUgY3VzdG9tIHZhbHVlcyBzZXRcbiAgICAgICEodGhpcy5zdGF0ZSgpLnRpdGxlIHx8IHRoaXMuc3RhdGUoKS5kZXNjcmlwdGlvbiB8fCB0aGlzLnN0YXRlKCkubWVzc2FnZUljb24pO1xuICAgIFxuICAgIGlmIChzaG91bGRVcGRhdGVCYXNlZE9uVHlwZSkge1xuICAgICAgdGhpcy51cGRhdGVDb250ZW50QmFzZWRPblR5cGUodGhpcy5tZXNzYWdlVHlwZSB8fCAnZGVmYXVsdCcpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiBwcmVidWlsdCBmaWVsZHMgYXJlIHByb3ZpZGVkXG4gICAgaWYgKGNoYW5nZXNbJ3ByZWJ1aWx0Rm9ybUZpZWxkcyddKSB7XG4gICAgICB0aGlzLnVzZVByZWJ1aWx0RmllbGRzLnNldCghIXRoaXMucHJlYnVpbHRGb3JtRmllbGRzKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGNoYW5nZXNbJ2Zvcm1Db25maWcnXSkge1xuICAgICAgaWYgKCF0aGlzLnVzZVByZWJ1aWx0RmllbGRzKCkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlGaWVsZHMoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplQ2xlYW5Gb3JtU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2xlYW5Gb3JtU3RhdGUoKTogdm9pZCB7XG4gICAvLyB0aGlzLm1vZGVsID0ge307XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICBjb250cm9sLm1hcmtBc1VudG91Y2hlZCgpO1xuICAgICAgICAgIGNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgICAgICBjb250cm9sLnNldEVycm9ycyhudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbnRlbnRCYXNlZE9uVHlwZSh0eXBlOiAnZGVmYXVsdCcgfCAnY29ubmVjdGlvbicgfCAnYWNjZXNzJyB8ICdhY2Nlc3NSZXN0cmljdGVkJykgeyAgXG4gICAgLy8gRGVmaW5lIGEgdHlwZSBmb3IgdGhlIGNvbnRlbnQgaXRlbXMgdG8gZW5zdXJlIGFsbCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseSB0eXBlZFxuICAgIHR5cGUgQ29udGVudEl0ZW0gPSB7XG4gICAgICB0aXRsZTogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgIG1lc3NhZ2VJY29uOiBzdHJpbmc7XG4gICAgICBzcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgICBjb250ZW50R2FwPzogc3RyaW5nO1xuICAgICAgdGl0bGVDbGFzcz86IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uQ2xhc3M/OiBzdHJpbmc7XG4gICAgfTtcblxuICAgIC8vIE9ubHkgYXBwbHkgZGVmYXVsdCBjb250ZW50IGlmIGN1c3RvbSBjb250ZW50IGhhc24ndCBiZWVuIHByb3ZpZGVkXG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5zdGF0ZSgpO1xuICAgIGNvbnN0IGNvbnRlbnQ6IFJlY29yZDwnZGVmYXVsdCcgfCAnY29ubmVjdGlvbicgfCAnYWNjZXNzJyB8ICdhY2Nlc3NSZXN0cmljdGVkJywgQ29udGVudEl0ZW0+ID0ge1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aXRsZTogJ09vcHMhIFNvbWV0aGluZyB3ZW50IHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluIG9yIHRyeSBhZnRlciBzb21lIHRpbWUnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0lmIHRoZSBpc3N1ZSBwZXJzaXN0cywgY29udGFjdCBvdXIgc3VwcG9ydCB0ZWFtIGF0IDxzcGFuIGNsYXNzPVwic3VwcG9ydC1lbWFpbFwiPnN1cHBvcnRAc2FyYXNhbmFseXRpY3MuY29tPC9zcGFuPicsXG4gICAgICAgIG1lc3NhZ2VJY29uOiAnL2Fzc2V0cy9lcnJvci5naWYnXG4gICAgICB9LFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICB0aXRsZTogJ1dlXFwncmUgaGF2aW5nIHRyb3VibGUgY29ubmVjdGluZy4gUGxlYXNlIGNoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdZb3UgY2FuIGFsc28gcmVhY2ggb3V0IHRvIG91ciBzdXBwb3J0IHRlYW0gYXQgPHNwYW4gY2xhc3M9XCJzdXBwb3J0LWVtYWlsXCI+c3VwcG9ydEBzYXJhc2FuYWx5dGljcy5jb208L3NwYW4+IGZvciBhc3Npc3RhbmNlJyxcbiAgICAgICAgbWVzc2FnZUljb246ICcvYXNzZXRzL2xvc3QtY29ubmVjdGlvbi5naWYnXG4gICAgICB9LFxuICAgICAgYWNjZXNzOiB7XG4gICAgICAgIHRpdGxlOiAnVGhpcyBpcyB0YWtpbmcgYSBiaXQgbG9uZ2VyIHRoYW4gdXN1YWwuIFBsZWFzZSBob2xkIG9uIScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnSWYgdGhlIGRlbGF5IGNvbnRpbnVlcywgY2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgcmVmcmVzaGluZyB0aGUgcGFnZS4nLFxuICAgICAgICBtZXNzYWdlSWNvbjogJy9hc3NldHMvbG9uZy1sb2FkaW5nLmdpZidcbiAgICAgIH0sXG4gICAgICBhY2Nlc3NSZXN0cmljdGVkOiB7XG4gICAgICAgIHRpdGxlOiAnQWNjZXNzIFJlc3RyaWN0ZWQhJyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBMb29rcyBsaWtlIHlvdSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGlzIG1vZHVsZSBqdXN0IHlldC4gTm8gd29ycmllc+KAlHJlYWNoIG91dCB0byB5b3VyIGFkbWluIHRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZmVhdHVyZS4gSWYgeW91J3JlIGZhY2luZyBhbnkgaXNzdWVzLCBmZWVsIGZyZWUgdG8gPGEgY2xhc3M9XCJjdXN0b20tY29udGFjdC1saW5rXCIgaHJlZj1cIiR7dGhpcy5jb250YWN0VXJsID8/ICdodHRwczovL3N1cHBvcnQuZGVmYXVsdC5jb20nfVwiIHRhcmdldD1cIl9ibGFua1wiPkNvbnRhY3QgVXM8L2E+LmAsXG4gICAgICAgIG1lc3NhZ2VJY29uOiAnL2Fzc2V0cy9hY2Nlc3MtcmVzdHJpY3RlZC5naWYnLFxuICAgICAgICBzcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb246ICcwcHgnLFxuICAgICAgICBjb250ZW50R2FwOicyMHB4JyxcbiAgICAgICAgdGl0bGVDbGFzczogJ2FjY2Vzcy1yZXN0cmljdGVkLXRpdGxlJyxcbiAgICAgICAgZGVzY3JpcHRpb25DbGFzczogJ2FjY2Vzcy1yZXN0cmljdGVkLWRlc2NyaXB0aW9uJyxcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50W3R5cGVdO1xuXG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoe1xuICAgICAgLi4ucyxcbiAgICAgIHR5cGUsXG4gICAgICAvLyBPbmx5IGFwcGx5IGRlZmF1bHQgdmFsdWVzIGlmIGN1c3RvbSB2YWx1ZXMgaGF2ZW4ndCBiZWVuIHByb3ZpZGVkXG4gICAgICB0aXRsZTogcy50aXRsZSB8fCBjb250ZW50SXRlbS50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBzLmRlc2NyaXB0aW9uIHx8IGNvbnRlbnRJdGVtLmRlc2NyaXB0aW9uLFxuICAgICAgbWVzc2FnZUljb246IHMubWVzc2FnZUljb24gfHwgY29udGVudEl0ZW0ubWVzc2FnZUljb24sXG4gICAgICAvLyBGb3Igb3RoZXIgcHJvcGVydGllcywgb25seSBhcHBseSB0aGVtIGlmIHRoZXkgZXhpc3QgaW4gdGhlIGNvbnRlbnRJdGVtXG4gICAgICAuLi4oY29udGVudEl0ZW0uc3BhY2luZ0JldHdlZW5JbWFnZUFuZERlc2NyaXB0aW9uICYmIHsgc3BhY2luZ0JldHdlZW5JbWFnZUFuZERlc2NyaXB0aW9uOiBjb250ZW50SXRlbS5zcGFjaW5nQmV0d2VlbkltYWdlQW5kRGVzY3JpcHRpb24gfSksXG4gICAgICAuLi4oY29udGVudEl0ZW0uY29udGVudEdhcCAmJiB7IGNvbnRlbnRHYXA6IGNvbnRlbnRJdGVtLmNvbnRlbnRHYXAgfSksXG4gICAgICAuLi4oY29udGVudEl0ZW0udGl0bGVDbGFzcyAmJiB7IHRpdGxlQ2xhc3M6IGNvbnRlbnRJdGVtLnRpdGxlQ2xhc3MgfSksXG4gICAgICAuLi4oY29udGVudEl0ZW0uZGVzY3JpcHRpb25DbGFzcyAmJiB7IGRlc2NyaXB0aW9uQ2xhc3M6IGNvbnRlbnRJdGVtLmRlc2NyaXB0aW9uQ2xhc3MgfSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHNhbml0aXplRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uLnJlcGxhY2UoXG4gICAgICAvc3VwcG9ydEBzYXJhc2FuYWx5dGljc1xcLmNvbS9nLFxuICAgICAgJzxzcGFuIGNsYXNzPVwic3VwcG9ydC1lbWFpbFwiPnN1cHBvcnRAc2FyYXNhbmFseXRpY3MuY29tPC9zcGFuPidcbiAgICApO1xuICB9XG5cbiAgb25CdXR0b25DbGljayhidXR0b246IGFueSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBmb3JtIGJ1dHRvbiAoZnJvbSBhY3RpdmVDdXN0b21Gb3JtQnV0dG9uKSBvciByZWd1bGFyIGJhbm5lciBidXR0b25cbiAgICBpZiAoIWV2ZW50ICYmIChidXR0b24uYWN0aW9uID09PSAnc3VibWl0JyB8fCBidXR0b24uYWN0aW9uID09PSAnbGluaycgfHwgYnV0dG9uLmlkID09PSAnYWRkLXVzZXInIHx8IGJ1dHRvbi5pZCA9PT0gJ2xlYXJuLW1vcmUnKSkge1xuICAgICAgLy8gSGFuZGxlIGZvcm0gYnV0dG9ucyB3aXRoIG5ldyBsb2dpY1xuICAgICAgaWYgKCBidXR0b24uaWQgPT09ICdhZGQtdXNlcicpIHtcbiAgICAgICAgLy8gSGFuZGxlIGZvcm0gc3VibWlzc2lvbiAoZXhpc3RpbmcgQWRkIFVzZXIgZnVuY3Rpb25hbGl0eSlcbiAgICAgICAgdGhpcy5vbkFkZFVzZXIoKTtcbiAgICAgIH0gZWxzZSBpZiAoYnV0dG9uLmFjdGlvbiA9PT0gJ2xpbmsnICYmIGJ1dHRvbi5saW5rKSB7XG4gICAgICAgIC8vIEhhbmRsZSBsaW5rIG5hdmlnYXRpb24gKExlYXJuIE1vcmUgZnVuY3Rpb25hbGl0eSlcbiAgICAgICAgd2luZG93Lm9wZW4oYnV0dG9uLmxpbmssICdfYmxhbmsnKTtcbiAgICAgIH0gZWxzZSBpZiAoYnV0dG9uLm9uQ2xpY2spIHtcbiAgICAgICAgLy8gSGFuZGxlIGN1c3RvbSBjbGljayBmdW5jdGlvblxuICAgICAgICBidXR0b24ub25DbGljaygpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXZlbnQpIHtcbiAgICAgIC8vIEhhbmRsZSByZWd1bGFyIGJhbm5lciBidXR0b25zIHdpdGggb3JpZ2luYWwgbG9naWMgKGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICB0aGlzLmJ1dHRvbkNsaWNrLmVtaXQoe1xuICAgICAgICB0eXBlOiBidXR0b24udHlwZSBhcyAncHJpbWFyeScgfCAnc2Vjb25kYXJ5JyxcbiAgICAgICAgYnV0dG9uLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldmVudFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNCdXR0b25BcnJheSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLmFjdGl2ZUN1c3RvbUZvcm1CdXR0b24pO1xuICB9XG5cbiAgaXNFbXB0eU9iamVjdChvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChvYmopIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbiAgICB9ZWxzZXtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRm9ybWx5RmllbGRzKCk6IHZvaWQge1xuICAgIC8vIFNraXAgRm9ybWx5IGZpZWxkIGdlbmVyYXRpb24gaWYgdXNpbmcgcHJlYnVpbHQgZmllbGRzXG4gICAgaWYgKHRoaXMudXNlUHJlYnVpbHRGaWVsZHMoKSkge1xuICAgICAgdGhpcy5mb3JtbHlGaWVsZHMgPSBbXTtcbiAgICAgIHRoaXMuYWxsRm9ybWx5RmllbGRzID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZvcm1Db25maWcgfHwgIXRoaXMuZm9ybUNvbmZpZy5maWVsZHMgfHwgdGhpcy5mb3JtQ29uZmlnLmZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZm9ybWx5RmllbGRzID0gW107XG4gICAgICB0aGlzLmFsbEZvcm1seUZpZWxkcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCBsYXlvdXQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuYWN0aXZlRm9ybUxheW91dDtcbiAgICBjb25zdCBmaWVsZHNQZXJSb3cgPSBsYXlvdXQuZmllbGRzUGVyUm93IHx8IDI7XG4gICAgY29uc3QgaW5pdGlhbFZpc2libGVGaWVsZHMgPSBsYXlvdXQuaW5pdGlhbFZpc2libGVGaWVsZHMgfHwgZmllbGRzUGVyUm93O1xuICAgIFxuICAgIC8vIFVwZGF0ZSBDU1MgZ3JpZCBjb2x1bW5zIGR5bmFtaWNhbGx5XG4gICAgdGhpcy51cGRhdGVHcmlkQ29sdW1ucyhmaWVsZHNQZXJSb3cpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBhbGwgZmllbGRzIHdpdGggcHJvcGVyIGhpZGUgZXhwcmVzc2lvbnMgZm9yIGNvbmRpdGlvbmFsIGZpZWxkc1xuICAgIHRoaXMuYWxsRm9ybWx5RmllbGRzID0gdGhpcy5mb3JtQ29uZmlnLmZpZWxkcy5tYXAoKGZpZWxkLCBpbmRleCkgPT4ge1xuICAgICAgLy8gTm9ybWFsaXplIGZpZWxkIHN0cnVjdHVyZSB0byBwcm9wZXIgRm9ybWx5IGZvcm1hdFxuICAgICAgY29uc3QgcGxhY2Vob2xkZXJWYWx1ZSA9IGZpZWxkLnBsYWNlaG9sZGVyIHx8IGZpZWxkLnByb3BzPy5wbGFjZWhvbGRlciB8fCBmaWVsZC5wYXJhbXM/LnBsYWNlaG9sZGVyIHx8IGZpZWxkLnByb3BzPy5wYXJhbXM/LnBsYWNlaG9sZGVyIHx8ICcnO1xuICAgICAgXG4gICAgICBjb25zdCBpc0NvbmRpdGlvbmFsRmllbGQgPSBpbmRleCA+PSBpbml0aWFsVmlzaWJsZUZpZWxkcztcbiAgICAgIFxuICAgICAgY29uc3QgZm9ybWx5RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAgICBrZXk6IGZpZWxkLmtleSxcbiAgICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmdldEZpZWxkQ2xhc3NOYW1lKGluZGV4ICUgZmllbGRzUGVyUm93LCBmaWVsZHNQZXJSb3cpLFxuICAgICAgICBoaWRlRXhwcmVzc2lvbjogaXNDb25kaXRpb25hbEZpZWxkID8gKCkgPT4gIXRoaXMuc2hvdWxkU2hvd0FkZGl0aW9uYWxGaWVsZHMoKSA6IGZhbHNlLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIC8vIEhhbmRsZSBtaXhlZCBzdHJ1Y3R1cmUgLSBzb21lIGZpZWxkcyBoYXZlIHByb3BzIGF0IHJvb3QsIG90aGVycyBuZXN0ZWRcbiAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJWYWx1ZSxcbiAgICAgICAgICByZXF1aXJlZDogZmllbGQucmVxdWlyZWQgfHwgZmllbGQucHJvcHM/LnJlcXVpcmVkIHx8IGZhbHNlLFxuICAgICAgICAgIGRpc2FibGVkOiBmaWVsZC5kaXNhYmxlZCB8fCBmaWVsZC5wcm9wcz8uZGlzYWJsZWQgfHwgZmFsc2UsXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRm9yIHNlbGVjdCBmaWVsZHMsIGluY2x1ZGUgc2VsZWN0LXNwZWNpZmljIHByb3BlcnRpZXNcbiAgICAgICAgICAuLi4oZmllbGQucHJvcHM/Lm9wdGlvbnMgJiYge1xuICAgICAgICAgICAgb3B0aW9uczogZmllbGQucHJvcHMub3B0aW9ucyxcbiAgICAgICAgICAgIG11bHRpcGxlOiBmaWVsZC5wcm9wcy5tdWx0aXBsZSB8fCBmYWxzZSxcbiAgICAgICAgICAgIGJpbmRMYWJlbDogZmllbGQucHJvcHMucGFyYW1zPy5iaW5kTGFiZWwgfHwgJ2xhYmVsJyxcbiAgICAgICAgICAgIGJpbmRWYWx1ZTogZmllbGQucHJvcHMucGFyYW1zPy5iaW5kVmFsdWUgfHwgJ3ZhbHVlJyxcbiAgICAgICAgICAgIGlzQ2xlYXJhYmxlOiBmaWVsZC5wcm9wcy5wYXJhbXM/LmlzQ2xlYXJhYmxlICE9PSBmYWxzZSxcbiAgICAgICAgICAgIHNob3dDaGVja2JveGVzOiBmaWVsZC5wcm9wcy5wYXJhbXM/LnNob3dDaGVja2JveGVzIHx8IGZhbHNlXG4gICAgICAgICAgfSksXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gSW5jbHVkZSBwYXJhbXMgZm9yIGNvbXBvbmVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAuLi4oZmllbGQucGFyYW1zIHx8IHt9KSxcbiAgICAgICAgICAgIC4uLihmaWVsZC5wcm9wcz8ucGFyYW1zIHx8IHt9KSxcbiAgICAgICAgICAgIC8vIEVuc3VyZSBsYWJlbCBhbmQgcGxhY2Vob2xkZXIgYXJlIHNldFxuICAgICAgICAgICAgbGFiZWw6IGZpZWxkLmxhYmVsIHx8IGZpZWxkLnByb3BzPy5wYXJhbXM/LmxhYmVsIHx8IHBsYWNlaG9sZGVyVmFsdWUsXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJWYWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRhdG9yczogdGhpcy5nZXRGb3JtbHlWYWxpZGF0b3JzKGZpZWxkKSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlIGlmIHByb3ZpZGVkXG4gICAgICBpZiAoZmllbGQudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm1vZGVsW2ZpZWxkLmtleSBhcyBzdHJpbmddID0gZmllbGQudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBmb3JtIGNvbnRyb2wgdG8gZm9ybSBncm91cCBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICBjb25zdCBrZXkgPSBmaWVsZC5rZXkgYXMgc3RyaW5nO1xuICAgICAgaWYgKCF0aGlzLmZvcm0uZ2V0KGtleSkpIHtcbiAgICAgICAgbGV0IGZvcm1Db250cm9sOiBGb3JtQ29udHJvbDtcbiAgICAgICAgaWYgKGZpZWxkLmZvcm1Db250cm9sKSB7XG4gICAgICAgICAgZm9ybUNvbnRyb2wgPSBmaWVsZC5mb3JtQ29udHJvbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gZmllbGQucGFyYW1zPy52YWxpZGF0b3JzIHx8IFtdO1xuICAgICAgICAgIGZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKGZpZWxkLnZhbHVlIHx8ICcnLCB2YWxpZGF0b3JzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChrZXksIGZvcm1Db250cm9sKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm1seUZpZWxkO1xuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JtbHlGaWVsZHMgPSB0aGlzLmFsbEZvcm1seUZpZWxkcy5zbGljZSgwLCBpbml0aWFsVmlzaWJsZUZpZWxkcyk7XG4gICAgdGhpcy51cGRhdGVBZGRpdGlvbmFsRmllbGRzKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEZpZWxkQ2xhc3NOYW1lKGluZGV4OiBudW1iZXIsIGZpZWxkc1BlclJvdzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2xTaXplID0gMTIgLyBmaWVsZHNQZXJSb3c7XG4gICAgcmV0dXJuIGBjb2wtJHtjb2xTaXplfWA7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUdyaWRDb2x1bW5zKGZpZWxkc1BlclJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gVXNlIENTUyBjdXN0b20gcHJvcGVydHkgdG8gZHluYW1pY2FsbHkgdXBkYXRlIGdyaWQgY29sdW1uc1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1mb3JtLWdyaWQtY29sdW1ucycsIGZpZWxkc1BlclJvdy50b1N0cmluZygpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9ybWx5VmFsaWRhdG9ycyhmaWVsZDogYW55KTogYW55IHtcbiAgICBjb25zdCB2YWxpZGF0b3JzOiBhbnkgPSB7fTtcbiAgICBcbiAgICBpZiAoZmllbGQuZm9ybUNvbnRyb2wgJiYgZmllbGQuZm9ybUNvbnRyb2wudmFsaWRhdG9yKSB7XG4gICAgICB2YWxpZGF0b3JzLnZhbGlkYXRpb24gPSBmaWVsZC5mb3JtQ29udHJvbC52YWxpZGF0b3I7XG4gICAgfVxuICAgIFxuICAgIGlmIChmaWVsZC5wYXJhbXM/LnZhbGlkYXRvcnMgJiYgQXJyYXkuaXNBcnJheShmaWVsZC5wYXJhbXMudmFsaWRhdG9ycykpIHtcbiAgICAgIHZhbGlkYXRvcnMudmFsaWRhdGlvbiA9IGZpZWxkLnBhcmFtcy52YWxpZGF0b3JzO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZmllbGQudmFsaWRhdG9ycykge1xuICAgICAgaWYgKGZpZWxkLnZhbGlkYXRvcnMudmFsaWRhdGlvbikge1xuICAgICAgICB2YWxpZGF0b3JzLnZhbGlkYXRpb24gPSBmaWVsZC52YWxpZGF0b3JzLnZhbGlkYXRpb247XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQudmFsaWRhdG9ycykpIHtcbiAgICAgICAgdmFsaWRhdG9ycy52YWxpZGF0aW9uID0gZmllbGQudmFsaWRhdG9ycztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHZhbGlkYXRvcnM7XG4gIH1cblxuXG4gIHNob3VsZFNob3dBZGRpdGlvbmFsRmllbGRzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5hY3RpdmVGb3JtSW5wdXRzIHx8IHRoaXMuYWN0aXZlRm9ybUlucHV0cy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmFjdGl2ZUZvcm1MYXlvdXQ7XG4gICAgY29uc3QgaW5pdGlhbFZpc2libGVGaWVsZHMgPSBsYXlvdXQuaW5pdGlhbFZpc2libGVGaWVsZHMgfHwgbGF5b3V0LmZpZWxkc1BlclJvdyB8fCAyO1xuICAgIFxuICAgIC8vIElmIG5vIGNvbmRpdGlvbmFsIGZpZWxkcyBjb25maWd1cmF0aW9uLCBjaGVjayBpZiBpbml0aWFsIGZpZWxkcyBhcmUgZmlsbGVkXG4gICAgaWYgKCFsYXlvdXQuY29uZGl0aW9uYWxGaWVsZHMpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyZUFsbFZpc2libGVGaWVsZHNGaWxsZWQoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIGN1c3RvbSBzaG93V2hlbiBmdW5jdGlvbiBpZiBwcm92aWRlZFxuICAgIGNvbnN0IHNob3VsZFNob3cgPSBsYXlvdXQuY29uZGl0aW9uYWxGaWVsZHMuc2hvd1doZW4gPyBcbiAgICAgIGxheW91dC5jb25kaXRpb25hbEZpZWxkcy5zaG93V2hlbih0aGlzLm1vZGVsKSA6IHRoaXMuYXJlQWxsVmlzaWJsZUZpZWxkc0ZpbGxlZCgpO1xuICAgIHJldHVybiBzaG91bGRTaG93O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBZGRpdGlvbmFsRmllbGRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxheW91dCA9IHRoaXMuYWN0aXZlRm9ybUxheW91dDtcbiAgICBjb25zdCBmaWVsZHNQZXJSb3cgPSBsYXlvdXQuZmllbGRzUGVyUm93IHx8IDI7XG4gICAgY29uc3QgaW5pdGlhbFZpc2libGVGaWVsZHMgPSBsYXlvdXQuaW5pdGlhbFZpc2libGVGaWVsZHMgfHwgZmllbGRzUGVyUm93O1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBzaG93IGFkZGl0aW9uYWwgZmllbGRzXG4gICAgY29uc3Qgc2hvdWxkU2hvd0NvbmRpdGlvbmFsRmllbGRzID0gdGhpcy5zaG91bGRTaG93QWRkaXRpb25hbEZpZWxkcygpO1xuICAgIFxuICAgIGlmIChzaG91bGRTaG93Q29uZGl0aW9uYWxGaWVsZHMgJiYgdGhpcy5mb3JtQ29uZmlnLmZpZWxkcy5sZW5ndGggPiBpbml0aWFsVmlzaWJsZUZpZWxkcykge1xuICAgICAgLy8gR2V0IHNwZWNpZmljIGNvbmRpdGlvbmFsIGZpZWxkIGluZGljZXMgb3IgYWxsIHJlbWFpbmluZyBmaWVsZHNcbiAgICAgIGNvbnN0IGNvbmRpdGlvbmFsRmllbGRJbmRpY2VzID0gbGF5b3V0LmNvbmRpdGlvbmFsRmllbGRzPy5maWVsZHMgfHwgXG4gICAgICAgIEFycmF5LmZyb20oe2xlbmd0aDogdGhpcy5mb3JtQ29uZmlnLmZpZWxkcy5sZW5ndGggLSBpbml0aWFsVmlzaWJsZUZpZWxkc30sIChfLCBpKSA9PiBpICsgaW5pdGlhbFZpc2libGVGaWVsZHMpO1xuICAgICAgXG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmllbGRzID0gY29uZGl0aW9uYWxGaWVsZEluZGljZXMubWFwKGluZGV4ID0+IHRoaXMuZm9ybUNvbmZpZy5maWVsZHNbaW5kZXhdKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBcbiAgICAgIC8vIE5vcm1hbGl6ZSBhZGRpdGlvbmFsIGZpZWxkcyB0byBwcm9wZXIgRm9ybWx5IGZvcm1hdFxuICAgICAgdGhpcy5hZGRpdGlvbmFsRm9ybWx5RmllbGRzID0gYWRkaXRpb25hbEZpZWxkcy5tYXAoKGZpZWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAvLyBOb3JtYWxpemUgZmllbGQgc3RydWN0dXJlIHRvIHByb3BlciBGb3JtbHkgZm9ybWF0XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyVmFsdWUgPSBmaWVsZC5wbGFjZWhvbGRlciB8fCBmaWVsZC5wcm9wcz8ucGxhY2Vob2xkZXIgfHwgZmllbGQucGFyYW1zPy5wbGFjZWhvbGRlciB8fCBmaWVsZC5wcm9wcz8ucGFyYW1zPy5wbGFjZWhvbGRlciB8fCAnJztcbiAgICAgICAgXG4gICAgICAgIGNvbnNvbGUubG9nKCdQcm9jZXNzaW5nIGNvbmRpdGlvbmFsIGZpZWxkOicsIGZpZWxkLmtleSwgJ3BsYWNlaG9sZGVyOicsIHBsYWNlaG9sZGVyVmFsdWUsICdmaWVsZDonLCBmaWVsZCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBmb3JtbHlGaWVsZDogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICAgICAga2V5OiBmaWVsZC5rZXksXG4gICAgICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgICAgICBjbGFzc05hbWU6IHRoaXMuZ2V0RmllbGRDbGFzc05hbWUoaW5kZXgsIGZpZWxkc1BlclJvdyksXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBtaXhlZCBzdHJ1Y3R1cmUgLSBzb21lIGZpZWxkcyBoYXZlIHByb3BzIGF0IHJvb3QsIG90aGVycyBuZXN0ZWRcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwbGFjZWhvbGRlclZhbHVlLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IGZpZWxkLnJlcXVpcmVkIHx8IGZpZWxkLnByb3BzPy5yZXF1aXJlZCB8fCBmYWxzZSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBmaWVsZC5kaXNhYmxlZCB8fCBmaWVsZC5wcm9wcz8uZGlzYWJsZWQgfHwgZmFsc2UsXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZvciBzZWxlY3QgZmllbGRzLCBpbmNsdWRlIHNlbGVjdC1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAuLi4oZmllbGQucHJvcHM/Lm9wdGlvbnMgJiYge1xuICAgICAgICAgICAgICBvcHRpb25zOiBmaWVsZC5wcm9wcy5vcHRpb25zLFxuICAgICAgICAgICAgICBtdWx0aXBsZTogZmllbGQucHJvcHMubXVsdGlwbGUgfHwgZmFsc2UsXG4gICAgICAgICAgICAgIGJpbmRMYWJlbDogZmllbGQucHJvcHMucGFyYW1zPy5iaW5kTGFiZWwgfHwgJ2xhYmVsJyxcbiAgICAgICAgICAgICAgYmluZFZhbHVlOiBmaWVsZC5wcm9wcy5wYXJhbXM/LmJpbmRWYWx1ZSB8fCAndmFsdWUnLFxuICAgICAgICAgICAgICBpc0NsZWFyYWJsZTogZmllbGQucHJvcHMucGFyYW1zPy5pc0NsZWFyYWJsZSAhPT0gZmFsc2UsXG4gICAgICAgICAgICAgIHNob3dDaGVja2JveGVzOiBmaWVsZC5wcm9wcy5wYXJhbXM/LnNob3dDaGVja2JveGVzIHx8IGZhbHNlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSW5jbHVkZSBwYXJhbXMgZm9yIGNvbXBvbmVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgLi4uKGZpZWxkLnBhcmFtcyB8fCB7fSksXG4gICAgICAgICAgICAgIC4uLihmaWVsZC5wcm9wcz8ucGFyYW1zIHx8IHt9KSxcbiAgICAgICAgICAgICAgLy8gRW5zdXJlIGxhYmVsIGFuZCBwbGFjZWhvbGRlciBhcmUgc2V0XG4gICAgICAgICAgICAgIGxhYmVsOiBmaWVsZC5sYWJlbCB8fCBmaWVsZC5wcm9wcz8ucGFyYW1zPy5sYWJlbCB8fCBwbGFjZWhvbGRlclZhbHVlLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJWYWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdmFsaWRhdG9yczogZmllbGQudmFsaWRhdG9ycyB8fCBmaWVsZC5wcm9wcz8udmFsaWRhdG9ycyB8fCB7fVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmIChmaWVsZC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbFtmaWVsZC5rZXkgYXMgc3RyaW5nXSA9IGZpZWxkLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGZvcm0gY29udHJvbCB0byBmb3JtIGdyb3VwIGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICAgICAgY29uc3Qga2V5ID0gZmllbGQua2V5IGFzIHN0cmluZztcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0uZ2V0KGtleSkpIHtcbiAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChrZXksIGZpZWxkLmZvcm1Db250cm9sIHx8IG5ldyBGb3JtQ29udHJvbChmaWVsZC52YWx1ZSB8fCAnJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1seUZpZWxkO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENsZWFyIGFkZGl0aW9uYWwgZmllbGRzIGlmIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXRcbiAgICAgIHRoaXMuYWRkaXRpb25hbEZvcm1seUZpZWxkcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXZhbHVhdGVTaG93V2hlbihzaG93V2hlbjogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKCFzaG93V2hlbikgcmV0dXJuIHRydWU7XG4gICAgXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBzaG93V2hlbiBjb25kaXRpb25zXG4gICAgaWYgKHR5cGVvZiBzaG93V2hlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHNob3dXaGVuKHRoaXMubW9kZWwsIHRoaXMuZm9ybSk7XG4gICAgfVxuICAgIFxuICAgIGlmICh0eXBlb2Ygc2hvd1doZW4gPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBIYW5kbGUgZmllbGQtYmFzZWQgY29uZGl0aW9ucyBsaWtlIHsgZmllbGQ6ICdyb2xlJywgdmFsdWU6ICdhZG1pbicgfVxuICAgICAgaWYgKHNob3dXaGVuLmZpZWxkICYmIHNob3dXaGVuLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxbc2hvd1doZW4uZmllbGRdID09PSBzaG93V2hlbi52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBIYW5kbGUgZm9ybSBtb2RlbCBjaGFuZ2VzIGZyb20gRm9ybWx5XG4gIG9uRm9ybU1vZGVsQ2hhbmdlKG1vZGVsOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0geyAuLi50aGlzLm1vZGVsLCAuLi5tb2RlbCB9O1xuICAgIFxuICAgIC8vIFRyaWdnZXIgZmllbGQgdmlzaWJpbGl0eSB1cGRhdGVzIGJ5IHVwZGF0aW5nIHRoZSBhbGxGb3JtbHlGaWVsZHMgYXJyYXlcbiAgICAvLyBUaGlzIHdpbGwgY2F1c2UgRm9ybWx5IHRvIHJlLWV2YWx1YXRlIGhpZGVFeHByZXNzaW9uIGZvciBhbGwgZmllbGRzXG4gICAgdGhpcy5hbGxGb3JtbHlGaWVsZHMgPSBbLi4udGhpcy5hbGxGb3JtbHlGaWVsZHNdO1xuICAgIFxuICAgIC8vIEVtaXQgdGhlIGNoYW5nZSBldmVudFxuICAgIHRoaXMub25Gb3JtRXZlbnQuZW1pdCh7IFxuICAgICAgdHlwZTogJ2Zvcm0tbW9kZWwtY2hhbmdlJywgXG4gICAgICBkYXRhOiBtb2RlbCBcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNsaWNrIGV2ZW50cyBvbiB0aGUgZGVzY3JpcHRpb24gYXJlYSwgc3BlY2lmaWNhbGx5IGZvciBjdXN0b20gY29udGFjdCBsaW5rcy5cbiAgICogSWYgYSBjdXN0b20gY29udGFjdCBsaW5rIGlzIGNsaWNrZWQgYW5kIHRoZXJlJ3MgYW4gb2JzZXJ2ZXIgZm9yIG9uQ29udGFjdFVzQ2xpY2ssXG4gICAqIGl0IHByZXZlbnRzIHRoZSBkZWZhdWx0IG5hdmlnYXRpb24gYW5kIGVtaXRzIHRoZSBjdXN0b20gZXZlbnQgaW5zdGVhZC5cbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIG1vdXNlIGNsaWNrIGV2ZW50IGZyb20gdGhlIGRlc2NyaXB0aW9uIGFyZWFcbiAgICovXG4gIGhhbmRsZURlc2NyaXB0aW9uQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgbGluayA9IHRhcmdldD8uY2xvc2VzdCgnYS5jdXN0b20tY29udGFjdC1saW5rJyk7XG4gICAgaWYgKGxpbmsgJiYgdGhpcy5vbkNvbnRhY3RVc0NsaWNrLm9ic2VydmVkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5vbkNvbnRhY3RVc0NsaWNrLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgaW5pdGlhbCBmaWVsZHMgdG8gZGlzcGxheSBpbiB0aGUgZmlyc3Qgcm93XG4gIGdldEluaXRpYWxGaWVsZHMoKTogRm9ybUZpZWxkQ29uZmlnW10ge1xuICAgIGlmICghdGhpcy5hY3RpdmVGb3JtSW5wdXRzKSByZXR1cm4gW107XG4gICAgXG4gICAgY29uc3QgaW5pdGlhbENvdW50ID0gdGhpcy5hY3RpdmVGb3JtTGF5b3V0LmluaXRpYWxWaXNpYmxlRmllbGRzIHx8IHRoaXMuYWN0aXZlRm9ybUxheW91dC5maWVsZHNQZXJSb3cgfHwgMjtcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVGb3JtSW5wdXRzLnNsaWNlKDAsIGluaXRpYWxDb3VudCk7XG4gIH1cblxuICAvLyBDaGVjayBpZiBhbGwgdmlzaWJsZSBmaWVsZHMgYXJlIGZpbGxlZCBhbmQgZm9ybSBpcyB2YWxpZFxuICBhcmVBbGxWaXNpYmxlRmllbGRzRmlsbGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5hY3RpdmVGb3JtSW5wdXRzIHx8IHRoaXMuYWN0aXZlRm9ybUlucHV0cy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgIFxuICAgIC8vIEdldCBsYXlvdXQgY29uZmlndXJhdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggZmllbGRzIHNob3VsZCBiZSB2aXNpYmxlXG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5hY3RpdmVGb3JtTGF5b3V0O1xuICAgIGNvbnN0IGluaXRpYWxWaXNpYmxlRmllbGRzID0gbGF5b3V0LmluaXRpYWxWaXNpYmxlRmllbGRzIHx8IGxheW91dC5maWVsZHNQZXJSb3cgfHwgMjtcbiAgICBcbiAgICAvLyBHZXQgYWxsIGN1cnJlbnRseSB2aXNpYmxlIGZpZWxkcyAoaW5pdGlhbCArIGNvbmRpdGlvbmFsIGlmIHNob3duKVxuICAgIGNvbnN0IHZpc2libGVGaWVsZHMgPSB0aGlzLmFjdGl2ZUZvcm1JbnB1dHMuc2xpY2UoMCwgaW5pdGlhbFZpc2libGVGaWVsZHMpO1xuICAgIGlmICh0aGlzLnNob3VsZFNob3dBZGRpdGlvbmFsRmllbGRzKCkpIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbmFsRmllbGRJbmRpY2VzID0gbGF5b3V0LmNvbmRpdGlvbmFsRmllbGRzPy5maWVsZHMgfHwgXG4gICAgICAgIEFycmF5LmZyb20oe2xlbmd0aDogdGhpcy5hY3RpdmVGb3JtSW5wdXRzLmxlbmd0aCAtIGluaXRpYWxWaXNpYmxlRmllbGRzfSwgKF8sIGkpID0+IGkgKyBpbml0aWFsVmlzaWJsZUZpZWxkcyk7XG4gICAgICBjb25zdCBjb25kaXRpb25hbEZpZWxkcyA9IGNvbmRpdGlvbmFsRmllbGRJbmRpY2VzLm1hcChpbmRleCA9PiB0aGlzLmFjdGl2ZUZvcm1JbnB1dHNbaW5kZXhdKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICB2aXNpYmxlRmllbGRzLnB1c2goLi4uY29uZGl0aW9uYWxGaWVsZHMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiBhbGwgdmlzaWJsZSBmaWVsZHMgaGF2ZSB2YWx1ZXMgdXNpbmcgdGhlaXIga2V5c1xuICAgIGNvbnN0IGFsbEZpZWxkc0ZpbGxlZCA9IHZpc2libGVGaWVsZHMuZXZlcnkoZmllbGQgPT4ge1xuICAgICAgY29uc3QgZmllbGRLZXkgPSBmaWVsZC5rZXk7XG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5tb2RlbFtmaWVsZEtleV07XG4gICAgICBcbiAgICAgIGlmICghZmllbGRWYWx1ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgXG4gICAgICAvLyBGb3Igc3RyaW5nIHZhbHVlcywgY2hlY2sgaWYgbm90IGVtcHR5IGFmdGVyIHRyaW1cbiAgICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWUudHJpbSgpICE9PSAnJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRm9yIGFycmF5cyAobXVsdGktc2VsZWN0KSwgY2hlY2sgaWYgbm90IGVtcHR5XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmllbGRWYWx1ZS5sZW5ndGggPiAwO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCBmb3JtVmFsaWQgPSB0aGlzLmZvcm0udmFsaWQ7XG5cbiAgICByZXR1cm4gYWxsRmllbGRzRmlsbGVkICYmIGZvcm1WYWxpZDtcbiAgfVxuICBcbn1cbiIsIkBpZiAoYmFubmVyQ29udGVudCgpOyBhcyBjb250ZW50KSB7XG4gIDxkaXYgY2xhc3M9XCJlcnJvci1wYWdlIG1lc3NhZ2UtYmFubmVyLXYyXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtY29udGFpbmVyXCIgW25nU3R5bGVdPVwieyBnYXA6IGNvbnRlbnRHYXAgfHwgJ3ZhcigtLW1lZGl1bS0zMnB4LCAzMnB4KScgfVwiPlxuICAgICAgQGlmKGNvbnRlbnQ/Lm1lc3NhZ2VJY29uKXtcbiAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1jb250YWluZXJcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7ICdtYXJnaW4tYm90dG9tJzogc3BhY2luZ0JldHdlZW5JbWFnZUFuZERlc2NyaXB0aW9uID8/ICd2YXIoLS1zbWFsbC0xNnB4LCAxNnB4KScgfVwiPlxuICAgICAgICA8aW1nIFtzcmNdPVwiY29udGVudC5tZXNzYWdlSWNvblwiIFthbHRdPVwiY29udGVudC50eXBlICsgJyBpbWFnZSdcIlxuICAgICAgICAgIFtzdHlsZS4tLW1lc3NhZ2UtaWNvbi1oZWlnaHRdPVwiY29udGVudC5tZXNzYWdlSWNvblNpemU/LmhlaWdodFwiXG4gICAgICAgICAgW3N0eWxlLi0tbWVzc2FnZS1pY29uLXdpZHRoXT1cImNvbnRlbnQubWVzc2FnZUljb25TaXplPy53aWR0aFwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1jbGFzc1wiIFtuZ0NsYXNzXT1cInRpdGxlQ2xhc3MgfHwgJ3RpdGxlLWNsYXNzJ1wiIFtpbm5lckhUTUxdPVwiY29udGVudC50aXRsZVwiPjwvZGl2PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZGVzY3JpcHRpb25cIiBbbmdDbGFzc109XCJkZXNjcmlwdGlvbkNsYXNzIHx8ICdkZXNjcmlwdGlvbidcIiBbaW5uZXJIVE1MXT1cImNvbnRlbnQuZGVzY3JpcHRpb25cIiAoY2xpY2spPVwiaGFuZGxlRGVzY3JpcHRpb25DbGljaygkZXZlbnQpXCI+PC9wPiBcbiAgICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cInsgbWFyZ2luOiBiYW5uZXI/LnNwYWNpbmcgKyAncHggMHB4JyB9XCI+XG4gICAgICAgICAgICA8c2EtbWVzc2FnZS1iYW5uZXIgKm5nSWY9XCIhaXNFbXB0eU9iamVjdChiYW5uZXIpXCIgW3R5cGVdPVwiYmFubmVyPy50eXBlXCIgW2Jhbm5lckljb25dPVwiYmFubmVyPy5iYW5uZXJJY29uXCIgW2J1dHRvbkljb25dPVwiYmFubmVyPy5idXR0b25JY29uXCJcbiAgICAgICAgICAgICAgW2Jhbm5lckljb25TaXplXT1cImJhbm5lcj8uYmFubmVySWNvblNpemVcIiBbYnV0dG9uVHlwZV09XCJiYW5uZXI/LmJ1dHRvblR5cGVcIiBbYnV0dG9uU2l6ZV09XCJiYW5uZXI/LmJ1dHRvblNpemVcIiBbYnV0dG9uSWNvblBvc2l0aW9uXT1cImJhbm5lcj8uYnV0dG9uSWNvblBvc2l0aW9uXCJcbiAgICAgICAgICAgICAgW2J1dHRvbkljb25TaXplXT1cImJhbm5lcj8uYnV0dG9uSWNvblNpemVcIiBbYWN0aW9uVGV4dF09XCJiYW5uZXI/LmFjdGlvblRleHRcIiA+XG4gICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJiYW5uZXI/LnRleHRcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvc2EtbWVzc2FnZS1iYW5uZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgPCEtLSBGb3JtIGlucHV0cyBzZWN0aW9uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJlYnVpbHRGb3JtRmllbGRzIHx8IGFjdGl2ZUZvcm1JbnB1dHM/Lmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkcy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPCEtLSBQcmVidWlsdCBmb3JtIGZpZWxkcyAoZGlyZWN0IGNvbXBvbmVudCByZW5kZXJpbmcpIC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlUHJlYnVpbHRGaWVsZHMoKSAmJiBwcmVidWlsdEZvcm1GaWVsZHNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJlYnVpbHRGb3JtRmllbGRzXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgPCEtLSBVc2UgRm9ybWx5IGZvciBwcm9wZXIgZm9ybSByZW5kZXJpbmcgLS0+XG4gICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiZGlhbG9nLWZvcm1cIiAqbmdJZj1cIiF1c2VQcmVidWlsdEZpZWxkcygpICYmIGFjdGl2ZUZvcm1JbnB1dHM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxmb3JtbHktZm9ybSBcbiAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1cIiBcbiAgICAgICAgICAgICAgICAgIFtmaWVsZHNdPVwiYWxsRm9ybWx5RmllbGRzXCIgXG4gICAgICAgICAgICAgICAgICBbbW9kZWxdPVwibW9kZWxcIlxuICAgICAgICAgICAgICAgICAgKG1vZGVsQ2hhbmdlKT1cIm9uRm9ybU1vZGVsQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8L2Zvcm1seS1mb3JtPlxuICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEN1c3RvbSBmb3JtIGJ1dHRvbihzKSAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1idXR0b24tY29udGFpbmVyXCIgKm5nSWY9XCJhY3RpdmVDdXN0b21Gb3JtQnV0dG9uICYmICF1c2VQcmVidWlsdEZpZWxkcygpXCI+XG4gICAgICAgICAgICA8IS0tIFN1cHBvcnQgYm90aCBzaW5nbGUgYnV0dG9uIGFuZCBhcnJheSBvZiBidXR0b25zIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQnV0dG9uQXJyYXkoKTsgZWxzZSBzaW5nbGVCdXR0b25cIj5cbiAgICAgICAgICAgICAgPHNhLWJ1dHRvbiBcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGFjdGl2ZUN1c3RvbUZvcm1CdXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2lkXT1cImJ1dHRvbi5pZFwiXG4gICAgICAgICAgICAgICAgW3RleHRdPVwiYnV0dG9uLnRleHRcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImJ1dHRvbi50eXBlXCJcbiAgICAgICAgICAgICAgICBbc2l6ZV09XCJidXR0b24uc2l6ZVwiXG4gICAgICAgICAgICAgICAgW3N0YXRlXT1cImJ1dHRvbi5zdGF0ZVwiXG4gICAgICAgICAgICAgICAgW0ltYWdlUGF0aF09XCJidXR0b24uSW1hZ2VQYXRoXCJcbiAgICAgICAgICAgICAgICBbaWNvblBvc2l0aW9uXT1cImJ1dHRvbi5pY29uUG9zaXRpb25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrKGJ1dHRvbilcIj5cbiAgICAgICAgICAgICAgPC9zYS1idXR0b24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGVCdXR0b24+XG4gICAgICAgICAgICAgIDxzYS1idXR0b24gY2xhc3M9XCJhY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBbaWRdPVwiYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi5pZFwiXG4gICAgICAgICAgICAgICAgW3RleHRdPVwiYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi50ZXh0XCJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCJhY3RpdmVDdXN0b21Gb3JtQnV0dG9uLnR5cGVcIlxuICAgICAgICAgICAgICAgIFtzaXplXT1cImFjdGl2ZUN1c3RvbUZvcm1CdXR0b24uc2l6ZVwiXG4gICAgICAgICAgICAgICAgW3N0YXRlXT1cImFjdGl2ZUN1c3RvbUZvcm1CdXR0b24uc3RhdGVcIlxuICAgICAgICAgICAgICAgIFtJbWFnZVBhdGhdPVwiYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi5JbWFnZVBhdGhcIlxuICAgICAgICAgICAgICAgIFtpY29uUG9zaXRpb25dPVwiYWN0aXZlQ3VzdG9tRm9ybUJ1dHRvbi5pY29uUG9zaXRpb25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkJ1dHRvbkNsaWNrKGFjdGl2ZUN1c3RvbUZvcm1CdXR0b24pXCI+XG4gICAgICAgICAgICAgIDwvc2EtYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgXG4gICAgICAgICAgPCEtLSBEaXZpZGVyIHNlY3Rpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXItc2VjdGlvblwiICpuZ0lmPVwiYWN0aXZlRGl2aWRlciAmJiAhdXNlUHJlYnVpbHRGaWVsZHMoKVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJkaXZpZGVyLXRpdGxlXCIgKm5nSWY9XCJhY3RpdmVEaXZpZGVyQ29uZmlnLnRpdGxlXCI+e3sgYWN0aXZlRGl2aWRlckNvbmZpZy50aXRsZSB9fTwvaDM+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiZGl2aWRlci1zdWJ0aXRsZVwiICpuZ0lmPVwiYWN0aXZlRGl2aWRlckNvbmZpZy5zdWJ0aXRsZSB8fCBhY3RpdmVEaXZpZGVyQ29uZmlnLnNob3dTdWJ0aXRsZVdoZW5FbXB0eVwiPlxuICAgICAgICAgICAgICAgIHt7IGFjdGl2ZURpdmlkZXJDb25maWcuc3VidGl0bGUgfHwgJ05vIGl0ZW1zIGFkZGVkIHlldCcgfX1cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgICA8IS0tIENoaXBzIHNlY3Rpb24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAtbGlzdFwiICpuZ0lmPVwiYWN0aXZlQ2hpcHM/Lmxlbmd0aCAmJiAhdXNlUHJlYnVpbHRGaWVsZHMoKVwiPlxuICAgICAgICAgICAgPHNhLWNoaXAgXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNoaXAgb2YgYWN0aXZlQ2hpcHNcIlxuICAgICAgICAgICAgICAgIFt0ZXh0XT1cImNoaXAubGFiZWwgfHwgY2hpcC50ZXh0IHx8IGNoaXBcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cIidyZWd1bGFyJ1wiXG4gICAgICAgICAgICAgICAgW3N0YXRlXT1cIidkZWZhdWx0J1wiXG4gICAgICAgICAgICAgICAgW2ZpbGxpbmddPVwiJ2ZpbGxlZCdcIlxuICAgICAgICAgICAgICAgIFtpY29uUG9zaXRpb25dPVwiJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgW2ljb25QYXRoXT1cIicuLi9hc3NldHMvY2xvc2VCbHVlT3V0bGluZWQuc3ZnJ1wiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2tFdmVudCk9XCJjaGlwLnJlbW92YWJsZSA/IG9uQ2hpcFJlbW92ZShjaGlwKSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgPC9zYS1jaGlwPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICBcbiAgICAgICAgQGlmKGJ1dHRvbnMpe1xuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWdyb3VwXCI+XG4gICAgICAgICAgQGZvciAoYnV0dG9uIG9mIGJ1dHRvbnM7IHRyYWNrIGJ1dHRvbi50ZXh0KSB7XG4gICAgICAgICAgICA8c2EtYnV0dG9uIFxuICAgICAgICAgICAgICBbdGV4dF09XCJidXR0b24udGV4dFwiXG4gICAgICAgICAgICAgIFtpY29uXT1cImJ1dHRvbi5pY29uXCJcbiAgICAgICAgICAgICAgW3NpemVdPVwiYnV0dG9uLnNpemVcIlxuICAgICAgICAgICAgICBbdHlwZV09XCJidXR0b24udHlwZVwiXG4gICAgICAgICAgICAgIFtpY29uUG9zaXRpb25dPVwiYnV0dG9uLmljb25Qb3NpdGlvblwiXG4gICAgICAgICAgICAgIFtidXR0b25JY29uU2l6ZV09XCJidXR0b24uYnV0dG9uSWNvblNpemVcIlxuICAgICAgICAgICAgICAob25DbGlja0V2ZW50KT1cIm9uQnV0dG9uQ2xpY2soYnV0dG9uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtzdGF0ZV09XCIhYXJlQWxsVmlzaWJsZUZpZWxkc0ZpbGxlZCgpID8gJ2Rpc2FibGVkJyA6IGJ1dHRvbj8uc3RhdGVcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImJ1dHRvbi50ZXh0XCI+XG4gICAgICAgICAgICA8L3NhLWJ1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIH0iXX0=