UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

471 lines 67.5 kB
import { Component, ElementRef, Injector, Input, ViewChild } from '@angular/core'; import { Animator, Duration as AnimationDuration } from '@microsoft/windows-admin-center-sdk/core/data/animation'; import { LogLevel } from '@microsoft/windows-admin-center-sdk/core/diagnostics/log-level'; import { Logging } from '@microsoft/windows-admin-center-sdk/core/diagnostics/logging'; import { TelemetryControlType } from '@microsoft/windows-admin-center-sdk/core/diagnostics/telemetry-control-type'; import { EnvironmentModule } from '@microsoft/windows-admin-center-sdk/core/manifest/environment-modules'; import { RpcShellNavigateClient } from '@microsoft/windows-admin-center-sdk/core/rpc/shell-navigate/rpc-shell-navigate-client'; import { of } from 'rxjs'; import { first, map, mergeMap } from 'rxjs/operators'; import { AppContextService } from '../../service/app-context.service'; import { CoreBaseComponent } from '../common/base.component'; import { DialogService } from '../dialog/dialog.service'; import * as i0 from "@angular/core"; import * as i1 from "../../service/app-context.service"; import * as i2 from "../dialog/dialog.service"; import * as i3 from "@angular/common"; import * as i4 from "../tooltip/tooltip.directive"; const _c0 = ["carouselContent"]; function BannerComponent_div_0_div_1_Template(rf, ctx) { if (rf & 1) { const _r8 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 13)(1, "button", 11); i0.ɵɵlistener("click", function BannerComponent_div_0_div_1_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r7.onCarouselLeftArrowButtonClick()); }); i0.ɵɵelement(2, "span", 14); i0.ɵɵelementEnd(); i0.ɵɵelementStart(3, "span", 15); i0.ɵɵtext(4); i0.ɵɵelementEnd(); i0.ɵɵelementStart(5, "button", 11); i0.ɵɵlistener("click", function BannerComponent_div_0_div_1_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r8); const ctx_r9 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r9.onCarouselRightArrowButtonClick()); }); i0.ɵɵelement(6, "span", 16); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵadvance(1); i0.ɵɵproperty("title", ctx_r1.strings.MsftSmeShell.Angular.Banner.ChevronLeft.label); i0.ɵɵattribute("aria-label", ctx_r1.strings.MsftSmeShell.Angular.Banner.ChevronLeft.label); i0.ɵɵadvance(3); i0.ɵɵtextInterpolate(ctx_r1.carouselPosition); i0.ɵɵadvance(1); i0.ɵɵproperty("title", ctx_r1.strings.MsftSmeShell.Angular.Banner.ChevronRight.label); i0.ɵɵattribute("aria-label", ctx_r1.strings.MsftSmeShell.Angular.Banner.ChevronRight.label); } } function BannerComponent_div_0_div_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 17); i0.ɵɵelement(1, "div", 18); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r3 = i0.ɵɵnextContext(2); i0.ɵɵadvance(1); i0.ɵɵproperty("ngClass", ctx_r3.currentFontIcon); } } function BannerComponent_div_0_div_5_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelement(0, "div", 19); } if (rf & 2) { const ctx_r4 = i0.ɵɵnextContext(2); i0.ɵɵstyleProp("background-image", ctx_r4.currentExternalIcon); } } function BannerComponent_div_0_a_9_Template(rf, ctx) { if (rf & 1) { const _r11 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "a", 20); i0.ɵɵlistener("click", function BannerComponent_div_0_a_9_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r10 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r10.onSetUpClick(ctx_r10.currentItem)); }); i0.ɵɵelementStart(1, "span"); i0.ɵɵtext(2); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r5 = i0.ɵɵnextContext(2); i0.ɵɵproperty("title", ctx_r5.currentItem.actionText ? ctx_r5.currentItem.actionText : ctx_r5.strings.MsftSmeShell.Angular.Banner.SetUpNow.label); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(ctx_r5.currentItem.actionText ? ctx_r5.currentItem.actionText : ctx_r5.strings.MsftSmeShell.Angular.Banner.SetUpNow.label); } } function BannerComponent_div_0_a_10_Template(rf, ctx) { if (rf & 1) { const _r13 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "a", 21); i0.ɵɵlistener("click", function BannerComponent_div_0_a_10_Template_a_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r12.onExternalLinkClick(ctx_r12.currentItem)); }); i0.ɵɵelementStart(1, "span", 22); i0.ɵɵtext(2); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r6 = i0.ɵɵnextContext(2); i0.ɵɵproperty("href", ctx_r6.currentItem.externalLink, i0.ɵɵsanitizeUrl)("title", ctx_r6.currentItem.linkDescription); i0.ɵɵattribute("aria-label", ctx_r6.currentItem.linkDescription); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(ctx_r6.strings.MsftSmeShell.Angular.Banner.LearnMore.label); } } function BannerComponent_div_0_Template(rf, ctx) { if (rf & 1) { const _r15 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 1); i0.ɵɵtemplate(1, BannerComponent_div_0_div_1_Template, 7, 5, "div", 2); i0.ɵɵelementStart(2, "div", 3, 4); i0.ɵɵtemplate(4, BannerComponent_div_0_div_4_Template, 2, 1, "div", 5); i0.ɵɵtemplate(5, BannerComponent_div_0_div_5_Template, 1, 2, "div", 6); i0.ɵɵelementStart(6, "div", 7)(7, "span", 8); i0.ɵɵtext(8); i0.ɵɵelementEnd(); i0.ɵɵtemplate(9, BannerComponent_div_0_a_9_Template, 3, 2, "a", 9); i0.ɵɵelementEnd(); i0.ɵɵtemplate(10, BannerComponent_div_0_a_10_Template, 3, 4, "a", 10); i0.ɵɵelementEnd(); i0.ɵɵelementStart(11, "button", 11); i0.ɵɵlistener("click", function BannerComponent_div_0_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r15); const ctx_r14 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r14.onDismissItemButtonClick()); }); i0.ɵɵelement(12, "span", 12); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵattribute("aria-label", ctx_r0.currentItem.title); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.items && ctx_r0.items.length > 1); i0.ɵɵadvance(3); i0.ɵɵproperty("ngIf", ctx_r0.currentFontIcon); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !ctx_r0.currentFontIcon); i0.ɵɵadvance(2); i0.ɵɵproperty("title", ctx_r0.currentItem.title); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r0.currentItem.title); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.currentItem.rpcShellNavigate || ctx_r0.currentItem.setUpFunction); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.currentItem.externalLink); i0.ɵɵadvance(1); i0.ɵɵproperty("title", ctx_r0.strings.MsftSmeShell.Angular.Banner.ButtonClose.label); i0.ɵɵattribute("aria-label", ctx_r0.strings.MsftSmeShell.Angular.Banner.ButtonClose.label); } } /** * An enumeration of the possible choices from the dismissal dialog. */ var BannerDismissChoice; (function (BannerDismissChoice) { /** * Dismiss the banner for the session. */ BannerDismissChoice[BannerDismissChoice["Session"] = 0] = "Session"; /** * Save the preference to never see the banner. */ BannerDismissChoice[BannerDismissChoice["Permanent"] = 1] = "Permanent"; })(BannerDismissChoice || (BannerDismissChoice = {})); /** * * @smeDoc {@label Banner @id sme-banner} * * @overview * @file {@filepath ./examples/banner-overview.md} * * @example {@label Basic Usage @id basic-usage} * @file {@filename component.ts @filepath ./examples/banner-example.component.ts} * @file {@filename component.html @filepath ./examples/banner-example.component.html} * */ /** * The component definition of the banner control. */ export class BannerComponent extends CoreBaseComponent { /** * Initializes a new instance of the BannerComponent class. * * @param appContextService The app context service. * @param dialogService The dialog service. * @param injector The injector */ constructor(appContextService, dialogService, injector) { super(injector); this.appContextService = appContextService; this.dialogService = dialogService; /** * Resource strings. */ this.strings = MsftSme.getStrings(); /** * Whether the component is currently animating. */ this.animating = false; /** * The index of the current banner item. */ this.carouselIndex = 0; } /** * The source name to use for logging */ get logSourceName() { return 'BannerComponent'; } /** * Gets the position in the carousel. */ get carouselPosition() { return '{0}/{1}'.format(this.carouselIndex + 1, this.items.length); } /** * Gets the external icon of the current banner item. */ get currentExternalIcon() { return `url(${this.currentItem.icon})`; } /** * Gets the current banner item's font icon, if available. */ get currentFontIcon() { return EnvironmentModule.getSmeIconClassFromRef(this.currentItem.icon); } /** * Gets the current banner item being displayed. */ get currentItem() { return this.items.length === 0 ? null : this.items[this.carouselIndex]; } /** * Gets the content of the carousel. */ get carouselContent() { return this.carouselContentViewChild.nativeElement; } /** * The method called after the component inputs are set. */ ngOnInit() { if (MsftSme.isNullOrUndefined(this.items)) { throw new Error(`BannerComponent initialization failed. Input 'items' is null or undefined.`); } } /** * The method called when the carousel left arrow button button is clicked. */ onCarouselLeftArrowButtonClick() { if (this.animating) { return; } const subscription = this.animateCarouselBackward() .pipe(first()) .subscribe(() => { if (!MsftSme.isNullOrUndefined(subscription)) { subscription.unsubscribe(); } }); } /** * The method called when the carousel right arrow button is clicked. */ onCarouselRightArrowButtonClick() { if (this.animating) { return; } const subscription = this.animateCarouselForward() .pipe(first()) .subscribe(() => { if (!MsftSme.isNullOrUndefined(subscription)) { subscription.unsubscribe(); } }); } /** * The method called when the dismiss button is clicked. */ onDismissItemButtonClick() { if (this.animating) { return; } const dialogOptions = { cancelButtonText: this.strings.MsftSmeShell.Angular.Common.close, choices: [ { name: this.strings.MsftSmeShell.Angular.Banner.DismissalDialog.Choices.Session.label, value: BannerDismissChoice.Session }, { name: this.strings.MsftSmeShell.Angular.Banner.DismissalDialog.Choices.Permanent.label.format(this.currentItem.serviceName), value: BannerDismissChoice.Permanent } ], confirmButtonText: this.strings.MsftSmeShell.Angular.Common.save, footnote: this.strings.MsftSmeShell.Angular.Banner.DismissalDialog.footnote, title: this.strings.MsftSmeShell.Angular.Banner.DismissalDialog.title.format(this.currentItem.serviceName), message: '' }; const subscription = this.dialogService.showChoice(dialogOptions).pipe(mergeMap((dialogResult) => { if (dialogResult && dialogResult.confirmed) { const hideType = dialogResult.choice.value === BannerDismissChoice.Permanent ? 2 /* BannerHideType.Permanent */ : 1 /* BannerHideType.Session */; this.trace('Suggestion setting', this.currentItem.id, { controlText: this.currentItem.title, controlServiceName: this.currentItem.serviceName, controlSuggestionSetting: hideType }); return this.updateBannerHideSettings(hideType).pipe(map(() => dialogResult)); } else { return of(dialogResult); } })) .subscribe({ next: (dialogResult) => { if (dialogResult && dialogResult.confirmed) { if (this.items.length === 1) { MsftSme.remove(this.items, this.currentItem); if (!MsftSme.isNullOrUndefined(subscription)) { subscription.unsubscribe(); } } else if (this.carouselIndex === 0) { const animateSubscription = this.animateCarouselForward() .pipe(first()) .subscribe(() => { MsftSme.remove(this.items, MsftSme.first(this.items)); this.carouselIndex = 0; if (!MsftSme.isNullOrUndefined(animateSubscription)) { animateSubscription.unsubscribe(); } if (!MsftSme.isNullOrUndefined(subscription)) { subscription.unsubscribe(); } }); } else { const oldIndex = this.carouselIndex; const animateSubscription = this.animateCarouselBackward() .pipe(first()) .subscribe(() => { MsftSme.remove(this.items, this.items[oldIndex]); if (!MsftSme.isNullOrUndefined(animateSubscription)) { animateSubscription.unsubscribe(); } if (!MsftSme.isNullOrUndefined(subscription)) { subscription.unsubscribe(); } }); } } }, error: (error) => { Logging.log({ consoleGroupHeader: 'Banner Component', level: LogLevel.Error, message: `BannerComponent failed to update the hide settings for banner with ID '${this.currentItem.id}'`, params: { error: error, currentItem: this.currentItem }, source: 'BannerComponent.onDismissItemButtonClick()' }); } }); } /** * The method called when the set up link is clicked. */ onSetUpClick(item) { if (!MsftSme.isNullOrUndefined(this.currentItem.rpcShellNavigate)) { RpcShellNavigateClient.shellNavigate(this.appContextService.rpc, this.currentItem.rpcShellNavigate); } else if (!MsftSme.isNullOrUndefined(this.currentItem.setUpFunction)) { this.currentItem.setUpFunction(); } this.trace('Update now', item.id, { controlText: item.title, controlServiceName: item.serviceName }); } /** * The method called when the learn more link is clicked. */ onExternalLinkClick(item) { this.trace('Learn more', item.id, { hint: item.externalLink }); } /** * The method called when the learn more link is hovered on. */ onExternalLinkHover(item) { this.trace('Learn more', item.id, { hint: item.externalLink }); } /** * Wrapper method for banner telemetry traces. */ trace(controlName, controlId, additionalData) { // Capture node information if connected if (this.appContextService.activeConnection && this.appContextService.connectionManager.activeConnection && this.appContextService.connectionManager.activeConnection.type) { Logging.traceControl(TelemetryControlType.Banner, controlName, controlId, additionalData, this.appContextService.activeConnection.nodeName, this.appContextService.connectionManager.activeConnection.type); } else { Logging.traceControl(TelemetryControlType.Banner, controlName, controlId, additionalData); } } /** * Animates the carousel for going backward. * * @returns A void observable of the animation event. */ animateCarouselBackward() { this.animating = true; return Animator.slideOutToRight(this.carouselContent, AnimationDuration.Xs, true) .pipe(mergeMap(() => { if (this.carouselIndex === 0) { this.carouselIndex = this.items.length - 1; } else { this.carouselIndex--; } return Animator.slideInToRight(this.carouselContent, AnimationDuration.Xs, true); }), map(() => { this.animating = false; return null; })); } /** * Animates the carousel for going forward. * * @returns A void observable of the animation event. */ animateCarouselForward() { this.animating = true; return Animator.slideOutToLeft(this.carouselContent, AnimationDuration.Xs, true) .pipe(mergeMap(() => { if (this.carouselIndex === this.items.length - 1) { this.carouselIndex = 0; } else { this.carouselIndex++; } return Animator.slideInToLeft(this.carouselContent, AnimationDuration.Xs, true); }), map(() => { this.animating = false; })); } /** * Updates the hide settings of the current banner item. * * @param hideType The preferred settings of hiding the current banner from the user. * @returns A void observable of updating the banner setting. */ updateBannerHideSettings(hideType) { return this.appContextService.settingsManager.getCommonUserSettings() .pipe(mergeMap((userSettings) => { return userSettings.trySave(() => { const bannerSetting = MsftSme.find(userSettings.banners, (x) => x.id === this.currentItem.id); if (MsftSme.isNullOrUndefined(bannerSetting)) { userSettings.banners.push({ id: this.currentItem.id, hideType: hideType }); } else { bannerSetting.hideType = hideType; } }); })); } } /** @nocollapse */ BannerComponent.ɵfac = function BannerComponent_Factory(t) { return new (t || BannerComponent)(i0.ɵɵdirectiveInject(i1.AppContextService), i0.ɵɵdirectiveInject(i2.DialogService), i0.ɵɵdirectiveInject(i0.Injector)); }; /** @nocollapse */ BannerComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: BannerComponent, selectors: [["sme-banner"]], viewQuery: function BannerComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.carouselContentViewChild = _t.first); } }, inputs: { items: "items" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 1, vars: 1, consts: [["tabindex", "0", "role", "region", "class", "sme-position-stretch-h sme-arrange-stack-h sme-padding-left-xl sme-height-xxl sme-border-vertical-sm sme-border-color-base-90 sme-focus-zone", 4, "ngIf"], ["tabindex", "0", "role", "region", 1, "sme-position-stretch-h", "sme-arrange-stack-h", "sme-padding-left-xl", "sme-height-xxl", "sme-border-vertical-sm", "sme-border-color-base-90", "sme-focus-zone"], ["class", "sme-arrange-stack-h sme-position-flex-none sme-position-flex-align-center sme-margin-right-xs", 4, "ngIf"], [1, "sme-arrange-overflow-hide", "sme-arrange-stack-h", "sme-position-flex-auto", "sme-position-stretch-v"], ["carouselContent", ""], ["class", "sme-square-xxl sme-margin-right-xs sme-background-color-accent sme-layout-relative", 4, "ngIf"], ["class", "sme-square-xxl sme-margin-right-xs sme-url-icon", 3, "background-image", 4, "ngIf"], [1, "sme-arrange-stack-h", "sme-position-flex-auto", "sme-arrange-overflow-hide", 2, "min-width", "35px"], [1, "sme-font-body", "sme-position-flex-align-center", "sme-arrange-ellipsis", 2, "min-width", "15px", 3, "title"], ["tabindex", "0", "role", "link", "style", "min-width: 15px", "class", "sme-link sme-margin-horizontal-xs sme-position-flex-align-center sme-arrange-ws-nowrap sme-arrange-ellipsis", 3, "title", "click", 4, "ngIf"], ["target", "_blank", "class", "sme-link sme-margin-horizontal-xs sme-position-flex-align-center sme-arrange-ws-nowrap sme-arrange-ellipsis sme-icon sme-icon-openInNewWindow sme-icon-after", 3, "href", "title", "click", 4, "ngIf"], [1, "sme-button-trigger", "sme-button-auto-width", 3, "title", "click"], [1, "sme-icon", "sme-icon-cancel"], [1, "sme-arrange-stack-h", "sme-position-flex-none", "sme-position-flex-align-center", "sme-margin-right-xs"], [1, "sme-icon", "sme-icon-chevronLeft"], [1, "sme-arrange-stack-h", "sme-margin-horizontal-xxs", "sme-position-flex-align-center"], [1, "sme-icon", "sme-icon-chevronRight"], [1, "sme-square-xxl", "sme-margin-right-xs", "sme-background-color-accent", "sme-layout-relative"], [1, "sme-icon", "sme-icon-sm", "sme-color-base", "sme-position-center", "sme-layout-absolute", 3, "ngClass"], [1, "sme-square-xxl", "sme-margin-right-xs", "sme-url-icon"], ["tabindex", "0", "role", "link", 1, "sme-link", "sme-margin-horizontal-xs", "sme-position-flex-align-center", "sme-arrange-ws-nowrap", "sme-arrange-ellipsis", 2, "min-width", "15px", 3, "title", "click"], ["target", "_blank", 1, "sme-link", "sme-margin-horizontal-xs", "sme-position-flex-align-center", "sme-arrange-ws-nowrap", "sme-arrange-ellipsis", "sme-icon", "sme-icon-openInNewWindow", "sme-icon-after", 3, "href", "title", "click"], [1, "sme-arrange-ellipsis"]], template: function BannerComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵtemplate(0, BannerComponent_div_0_Template, 13, 10, "div", 0); } if (rf & 2) { i0.ɵɵproperty("ngIf", ctx.items && ctx.items.length > 0); } }, dependencies: [i3.NgClass, i3.NgIf, i4.TooltipDirective], encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BannerComponent, [{ type: Component, args: [{ selector: 'sme-banner', template: "<div *ngIf=\"items && items.length > 0\" tabindex=\"0\" role=\"region\"\r\n class=\"sme-position-stretch-h sme-arrange-stack-h sme-padding-left-xl sme-height-xxl sme-border-vertical-sm sme-border-color-base-90 sme-focus-zone\"\r\n [attr.aria-label]=\"currentItem.title\">\r\n <div *ngIf=\"items && items.length > 1\"\r\n class=\"sme-arrange-stack-h sme-position-flex-none sme-position-flex-align-center sme-margin-right-xs\">\r\n <button class=\"sme-button-trigger sme-button-auto-width\" (click)=\"onCarouselLeftArrowButtonClick()\"\r\n [attr.aria-label]=\"strings.MsftSmeShell.Angular.Banner.ChevronLeft.label\"\r\n [title]=\"strings.MsftSmeShell.Angular.Banner.ChevronLeft.label\">\r\n <span class=\"sme-icon sme-icon-chevronLeft\"></span>\r\n </button>\r\n <span\r\n class=\"sme-arrange-stack-h sme-margin-horizontal-xxs sme-position-flex-align-center\">{{ carouselPosition }}</span>\r\n <button class=\"sme-button-trigger sme-button-auto-width\" (click)=\"onCarouselRightArrowButtonClick()\"\r\n [attr.aria-label]=\"strings.MsftSmeShell.Angular.Banner.ChevronRight.label\"\r\n [title]=\"strings.MsftSmeShell.Angular.Banner.ChevronRight.label\">\r\n <span class=\"sme-icon sme-icon-chevronRight\"></span>\r\n </button>\r\n </div>\r\n\r\n <div #carouselContent\r\n class=\"sme-arrange-overflow-hide sme-arrange-stack-h sme-position-flex-auto sme-position-stretch-v\">\r\n <div *ngIf=\"currentFontIcon\"\r\n class=\"sme-square-xxl sme-margin-right-xs sme-background-color-accent sme-layout-relative\">\r\n <div [ngClass]=\"currentFontIcon\"\r\n class=\"sme-icon sme-icon-sm sme-color-base sme-position-center sme-layout-absolute\"></div>\r\n </div>\r\n <div *ngIf=\"!currentFontIcon\" [style.background-image]=\"currentExternalIcon\"\r\n class=\"sme-square-xxl sme-margin-right-xs sme-url-icon\"></div>\r\n\r\n <div class=\"sme-arrange-stack-h sme-position-flex-auto sme-arrange-overflow-hide\" style=\"min-width: 35px\">\r\n <span [title]=\"currentItem.title\"\r\n class=\"sme-font-body sme-position-flex-align-center sme-arrange-ellipsis\" style=\"min-width: 15px\">{{ currentItem.title }}</span>\r\n <a tabindex=\"0\" role=\"link\" *ngIf=\"currentItem.rpcShellNavigate || currentItem.setUpFunction\"\r\n [title]=\"currentItem.actionText ? currentItem.actionText : strings.MsftSmeShell.Angular.Banner.SetUpNow.label\"\r\n (click)=\"onSetUpClick(currentItem)\" style=\"min-width: 15px\"\r\n class=\"sme-link sme-margin-horizontal-xs sme-position-flex-align-center sme-arrange-ws-nowrap sme-arrange-ellipsis\">\r\n <span>{{ currentItem.actionText ? currentItem.actionText : strings.MsftSmeShell.Angular.Banner.SetUpNow.label }}</span>\r\n </a>\r\n </div>\r\n\r\n <a *ngIf=\"currentItem.externalLink\" target=\"_blank\" [attr.aria-label]=\"currentItem.linkDescription\" [href]=\"currentItem.externalLink\" [title]=\"currentItem.linkDescription\"\r\n class=\"sme-link sme-margin-horizontal-xs sme-position-flex-align-center sme-arrange-ws-nowrap sme-arrange-ellipsis sme-icon sme-icon-openInNewWindow sme-icon-after\"\r\n (click)=\"onExternalLinkClick(currentItem)\">\r\n <span class=\"sme-arrange-ellipsis\">{{ strings.MsftSmeShell.Angular.Banner.LearnMore.label }}</span>\r\n </a>\r\n </div>\r\n\r\n <button class=\"sme-button-trigger sme-button-auto-width\" (click)=\"onDismissItemButtonClick()\"\r\n [attr.aria-label]=\"strings.MsftSmeShell.Angular.Banner.ButtonClose.label\"\r\n [title]=\"strings.MsftSmeShell.Angular.Banner.ButtonClose.label\">\r\n <span class=\"sme-icon sme-icon-cancel\"></span>\r\n </button>\r\n</div>\r\n" }] }], function () { return [{ type: i1.AppContextService }, { type: i2.DialogService }, { type: i0.Injector }]; }, { carouselContentViewChild: [{ type: ViewChild, args: ['carouselContent'] }], items: [{ type: Input }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFubmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2Jhbm5lci9iYW5uZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvYmFubmVyL2Jhbm5lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsSUFBSSxpQkFBaUIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBRWxILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkVBQTZFLENBQUM7QUFDbkgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUVBQXVFLENBQUM7QUFFMUcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUZBQXVGLENBQUM7QUFDL0gsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7OztJQ1p2RCwrQkFDd0csaUJBQUE7SUFDN0MsbUtBQVMsZUFBQSx1Q0FBZ0MsQ0FB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QStCOzt1RkRvRHhCLGVBQWU7Y0FKM0IsU0FBUzsyQkFDSSxZQUFZO3VIQWVmLHdCQUF3QjtrQkFEOUIsU0FBUzttQkFBQyxpQkFBaUI7WUFPckIsS0FBSztrQkFEWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFuaW1hdG9yLCBEdXJhdGlvbiBhcyBBbmltYXRpb25EdXJhdGlvbiB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9hbmltYXRpb24nO1xyXG5pbXBvcnQgeyBCYW5uZXJIaWRlVHlwZSwgQ29tbW9uVXNlclNldHRpbmdzIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL3NldHRpbmdzLW1hbmFnZXInO1xyXG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nLWxldmVsJztcclxuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nZ2luZyc7XHJcbmltcG9ydCB7IFRlbGVtZXRyeUNvbnRyb2xUeXBlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kaWFnbm9zdGljcy90ZWxlbWV0cnktY29udHJvbC10eXBlJztcclxuaW1wb3J0IHsgRW52aXJvbm1lbnRNb2R1bGUgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL21hbmlmZXN0L2Vudmlyb25tZW50LW1vZHVsZXMnO1xyXG5pbXBvcnQgeyBScGNEaWFsb2dDaG9pY2VSZXNwb25zZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvcnBjL2RpYWxvZy9ycGMtZGlhbG9nLW1vZGVsJztcclxuaW1wb3J0IHsgUnBjU2hlbGxOYXZpZ2F0ZUNsaWVudCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvcnBjL3NoZWxsLW5hdmlnYXRlL3JwYy1zaGVsbC1uYXZpZ2F0ZS1jbGllbnQnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaXJzdCwgbWFwLCBtZXJnZU1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU3RyaW5ncyB9IGZyb20gJy4uLy4uL2dlbmVyYXRlZC9zdHJpbmdzJztcclxuaW1wb3J0IHsgQXBwQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2FwcC1jb250ZXh0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENob2ljZURpYWxvZ1Jlc3VsdCB9IGZyb20gJy4uL2RpYWxvZy9jaG9pY2UtZGlhbG9nL2Nob2ljZS1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uL2RpYWxvZy9kaWFsb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhbm5lckl0ZW0gfSBmcm9tICcuL21vZGVscy9iYW5uZXItaXRlbSc7XHJcblxyXG4vKipcclxuICogQW4gZW51bWVyYXRpb24gb2YgdGhlIHBvc3NpYmxlIGNob2ljZXMgZnJvbSB0aGUgZGlzbWlzc2FsIGRpYWxvZy5cclxuICovXHJcbmVudW0gQmFubmVyRGlzbWlzc0Nob2ljZSB7XHJcbiAgICAvKipcclxuICAgICAqIERpc21pc3MgdGhlIGJhbm5lciBmb3IgdGhlIHNlc3Npb24uXHJcbiAgICAgKi9cclxuICAgIFNlc3Npb24gPSAwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2F2ZSB0aGUgcHJlZmVyZW5jZSB0byBuZXZlciBzZWUgdGhlIGJhbm5lci5cclxuICAgICAqL1xyXG4gICAgUGVybWFuZW50ID0gMVxyXG59XHJcblxyXG4vKipcclxuICpcclxuICogQHNtZURvYyB7QGxhYmVsIEJhbm5lciBAaWQgc21lLWJhbm5lcn1cclxuICpcclxuICogQG92ZXJ2aWV3XHJcbiAqIEBmaWxlIHtAZmlsZXBhdGggLi9leGFtcGxlcy9iYW5uZXItb3ZlcnZpZXcubWR9XHJcbiAqXHJcbiAqIEBleGFtcGxlIHtAbGFiZWwgQmFzaWMgVXNhZ2UgQGlkIGJhc2ljLXVzYWdlfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC50cyBAZmlsZXBhdGggLi9leGFtcGxlcy9iYW5uZXItZXhhbXBsZS5jb21wb25lbnQudHN9XHJcbiAqIEBmaWxlIHtAZmlsZW5hbWUgY29tcG9uZW50Lmh0bWwgQGZpbGVwYXRoIC4vZXhhbXBsZXMvYmFubmVyLWV4YW1wbGUuY29tcG9uZW50Lmh0bWx9XHJcbiAqXHJcbiAqL1xyXG4vKipcclxuICogVGhlIGNvbXBvbmVudCBkZWZpbml0aW9uIG9mIHRoZSBiYW5uZXIgY29udHJvbC5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtYmFubmVyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9iYW5uZXIuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYW5uZXJDb21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnQmFubmVyQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjYXJvdXNlbCBjb250ZW50IHZpZXcgY2hpbGQuXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2Nhcm91c2VsQ29udGVudCcpXHJcbiAgICBwdWJsaWMgY2Fyb3VzZWxDb250ZW50Vmlld0NoaWxkOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGJhbm5lciBpdGVtcyB0byBkaXNwbGF5LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGl0ZW1zOiBCYW5uZXJJdGVtW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwb3NpdGlvbiBpbiB0aGUgY2Fyb3VzZWwuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY2Fyb3VzZWxQb3NpdGlvbigpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiAnezB9L3sxfScuZm9ybWF0KHRoaXMuY2Fyb3VzZWxJbmRleCArIDEsIHRoaXMuaXRlbXMubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGV4dGVybmFsIGljb24gb2YgdGhlIGN1cnJlbnQgYmFubmVyIGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgY3VycmVudEV4dGVybmFsSWNvbigpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBgdXJsKCR7dGhpcy5jdXJyZW50SXRlbS5pY29ufSlgO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBiYW5uZXIgaXRlbSdzIGZvbnQgaWNvbiwgaWYgYXZhaWxhYmxlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnRGb250SWNvbigpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBFbnZpcm9ubWVudE1vZHVsZS5nZXRTbWVJY29uQ2xhc3NGcm9tUmVmKHRoaXMuY3VycmVudEl0ZW0uaWNvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGJhbm5lciBpdGVtIGJlaW5nIGRpc3BsYXllZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBjdXJyZW50SXRlbSgpOiBCYW5uZXJJdGVtIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGggPT09IDAgPyBudWxsIDogdGhpcy5pdGVtc1t0aGlzLmNhcm91c2VsSW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzb3VyY2Ugc3RyaW5ncy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0cmluZ3MgPSBNc2Z0U21lLmdldFN0cmluZ3M8U3RyaW5ncz4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGNvbnRlbnQgb2YgdGhlIGNhcm91c2VsLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldCBjYXJvdXNlbENvbnRlbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiAoPEhUTUxFbGVtZW50PnRoaXMuY2Fyb3VzZWxDb250ZW50Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGN1cnJlbnRseSBhbmltYXRpbmcuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYW5pbWF0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgYmFubmVyIGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2Fyb3VzZWxJbmRleCA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQmFubmVyQ29tcG9uZW50IGNsYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBhcHBDb250ZXh0U2VydmljZSBUaGUgYXBwIGNvbnRleHQgc2VydmljZS5cclxuICAgICAqIEBwYXJhbSBkaWFsb2dTZXJ2aWNlIFRoZSBkaWFsb2cgc2VydmljZS5cclxuICAgICAqIEBwYXJhbSBpbmplY3RvciBUaGUgaW5qZWN0b3JcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBhcHBDb250ZXh0U2VydmljZTogQXBwQ29udGV4dFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZXRob2QgY2FsbGVkIGFmdGVyIHRoZSBjb21wb25lbnQgaW5wdXRzIGFyZSBzZXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKE1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5pdGVtcykpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYW5uZXJDb21wb25lbnQgaW5pdGlhbGl6YXRpb24gZmFpbGVkLiBJbnB1dCAnaXRlbXMnIGlzIG51bGwgb3IgdW5kZWZpbmVkLmApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGNhcm91c2VsIGxlZnQgYXJyb3cgYnV0dG9uIGJ1dHRvbiBpcyBjbGlja2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25DYXJvdXNlbExlZnRBcnJvd0J1dHRvbkNsaWNrKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmFuaW1hdGluZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmFuaW1hdGVDYXJvdXNlbEJhY2t3YXJkKClcclxuICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIU1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQoc3Vic2NyaXB0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGNhcm91c2VsIHJpZ2h0IGFycm93IGJ1dHRvbiBpcyBjbGlja2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25DYXJvdXNlbFJpZ2h0QXJyb3dCdXR0b25DbGljaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hbmltYXRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5hbmltYXRlQ2Fyb3VzZWxGb3J3YXJkKClcclxuICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIU1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQoc3Vic2NyaXB0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGRpc21pc3MgYnV0dG9uIGlzIGNsaWNrZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkRpc21pc3NJdGVtQnV0dG9uQ2xpY2soKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRpYWxvZ09wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Db21tb24uY2xvc2UsXHJcbiAgICAgICAgICAgIGNob2ljZXM6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQmFubmVyLkRpc21pc3NhbERpYWxvZy5DaG9pY2VzLlNlc3Npb24ubGFiZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IEJhbm5lckRpc21pc3NDaG9pY2UuU2Vzc2lvblxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQmFubmVyLkRpc21pc3NhbERpYWxvZy5DaG9pY2VzLlBlcm1hbmVudC5sYWJlbC5mb3JtYXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEl0ZW0uc2VydmljZU5hbWVcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBCYW5uZXJEaXNtaXNzQ2hvaWNlLlBlcm1hbmVudFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB