UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

138 lines 25.9 kB
import { ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { CommonModule, CountdownIntervalComponent, CountdownIntervalModule, IntervalBasedReload, ListGroupModule, WidgetGlobalAutoRefreshService, gettext } from '@c8y/ngx-components'; import { TranslateService } from '@ngx-translate/core'; import { TooltipModule } from 'ngx-bootstrap/tooltip'; import { BehaviorSubject, Subject, takeUntil, tap } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "@ngx-translate/core"; import * as i2 from "@c8y/ngx-components"; import * as i3 from "@angular/common"; import * as i4 from "ngx-bootstrap/tooltip"; export class DatapointsReloadComponent extends IntervalBasedReload { constructor(cdRef, translateService, widgetGlobalAutoRefreshService) { super(); this.cdRef = cdRef; this.translateService = translateService; this.widgetGlobalAutoRefreshService = widgetGlobalAutoRefreshService; /** * @inheritdoc */ this.isRefreshDisabled = false; /** * @inheritdoc */ this.onCountdownEnded = new EventEmitter(); /** * @inheritdoc */ this.manuallyDisabledCountdown = false; this.destroy$ = new Subject(); } ngAfterViewInit() { if (this.widgetInstanceGlobalAutoRefreshContext) { this.widgetGlobalAutoRefreshService.countdownActions.countdownEnded$ .pipe(takeUntil(this.destroy$), tap(() => this.onCountdownEnded.emit())) .subscribe(); } } ngOnChanges(changes) { if (this.isRefreshDisabled && this.isAutoRefreshEnabled) { this.isIntervalRefreshToggleOn = false; this.disableCountdown(); return; } if (this.isExportModalOpen && this.canDisableCountdownWhenModalIsOpen()) { this.isIntervalRefreshToggleOn = !this.isIntervalRefreshToggleOn; this.disableCountdown(); } else { if (this.canStartCountdown(changes)) { this.isIntervalRefreshToggleOn = true; this.startCountdown(); } if (this.canHandleScrolling()) { this.handleScrolling(); } } } ngOnDestroy() { if (this.countdownSubscription) { this.countdownSubscription.unsubscribe(); } this.destroy$.next(); this.destroy$.complete(); } /** * @inheritdoc */ countdownEnded() { /** * @inheritdoc */ this.autoRefreshList(); } reload() { /** * @inheritdoc */ this.autoRefreshList(); } /** * @inheritdoc */ enableCountdown() { this.hideCountdown = false; // Prevents the countdown from getting stuck on an initial value. this.cdRef.detectChanges(); this.startCountdown(); } /** * @inheritdoc */ updateCountdownButtonTooltipText() { this.toggleCountdownButtonTooltipText = this.isIntervalRefreshToggleOn ? this.translateService.instant(gettext('Disable auto refresh')) : this.translateService.instant(gettext('Enable auto refresh')); } canStartCountdown(changes) { const { isAutoRefreshEnabled, refreshInterval } = changes; return ((isAutoRefreshEnabled || refreshInterval) && (this.isAutoRefreshEnabled || !!this.refreshInterval)); } canHandleScrolling() { return !this.manuallyDisabledCountdown && this.isAutoRefreshEnabled; } canDisableCountdownWhenModalIsOpen() { return (this.isAutoRefreshEnabled && !!this.refreshInterval && !this.manuallyDisabledCountdown && !this.isScrolling && !this.hideCountdown); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsReloadComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.TranslateService }, { token: i2.WidgetGlobalAutoRefreshService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DatapointsReloadComponent, isStandalone: true, selector: "c8y-datapoints-reload", inputs: { isAutoRefreshEnabled: "isAutoRefreshEnabled", isRefreshDisabled: "isRefreshDisabled", isLoading: "isLoading", isScrolling: "isScrolling", isExportModalOpen: "isExportModalOpen", refreshInterval: "refreshInterval", widgetInstanceGlobalAutoRefreshContext: "widgetInstanceGlobalAutoRefreshContext" }, outputs: { onCountdownEnded: "onCountdownEnded" }, viewQueries: [{ propertyName: "countdownIntervalComponent", first: true, predicate: CountdownIntervalComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"!widgetInstanceGlobalAutoRefreshContext\">\n <div class=\"a-i-center input-group p-t-4 p-b-4 max-width-fit m-l-auto\">\n <label\n class=\"m-b-0 m-r-8 text-label-small text-truncate flex-no-shrink\"\n title=\" {{ 'Auto refresh' | translate }}\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n >\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isRefreshDisabled\"\n [attr.aria-label]=\"toggleCountdownButtonTooltipText\"\n [tooltip]=\"toggleCountdownButtonTooltipText\"\n placement=\"bottom\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isIntervalRefreshToggleOn\"\n [disabled]=\"isRefreshDisabled\"\n data-cy=\"c8y-data-points-table-widget--interval-toggle-button\"\n (click)=\"onToggleCountdownButtonState($event)\"\n />\n\n <c8y-countdown-interval\n *ngIf=\"isIntervalRefreshToggleOn\"\n [countdownInterval]=\"refreshInterval\"\n (countdownEnded)=\"countdownEnded()\"\n ></c8y-countdown-interval>\n <i\n c8yIcon=\"pause\"\n *ngIf=\"!isIntervalRefreshToggleOn\"\n ></i>\n </label>\n\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n [disabled]=\"isRefreshDisabled || (isLoading | async)\"\n (click)=\"reload()\"\n data-cy=\"c8y-data-points-table-widget--reload-button\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading | async }\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: CountdownIntervalModule }, { kind: "component", type: i2.CountdownIntervalComponent, selector: "c8y-countdown-interval", inputs: ["countdownInterval"], outputs: ["countdownEnded"] }, { kind: "ngmodule", type: ListGroupModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DatapointsReloadComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-datapoints-reload', standalone: true, imports: [CommonModule, CountdownIntervalModule, ListGroupModule, TooltipModule], template: "<ng-container *ngIf=\"!widgetInstanceGlobalAutoRefreshContext\">\n <div class=\"a-i-center input-group p-t-4 p-b-4 max-width-fit m-l-auto\">\n <label\n class=\"m-b-0 m-r-8 text-label-small text-truncate flex-no-shrink\"\n title=\" {{ 'Auto refresh' | translate }}\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n >\n {{ 'Auto refresh' | translate }}\n </label>\n <div class=\"input-group\">\n <label\n class=\"toggle-countdown\"\n [class.toggle-countdown-disabled]=\"isRefreshDisabled\"\n [attr.aria-label]=\"toggleCountdownButtonTooltipText\"\n [tooltip]=\"toggleCountdownButtonTooltipText\"\n placement=\"bottom\"\n *ngIf=\"refreshInterval && isAutoRefreshEnabled\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"isIntervalRefreshToggleOn\"\n [disabled]=\"isRefreshDisabled\"\n data-cy=\"c8y-data-points-table-widget--interval-toggle-button\"\n (click)=\"onToggleCountdownButtonState($event)\"\n />\n\n <c8y-countdown-interval\n *ngIf=\"isIntervalRefreshToggleOn\"\n [countdownInterval]=\"refreshInterval\"\n (countdownEnded)=\"countdownEnded()\"\n ></c8y-countdown-interval>\n <i\n c8yIcon=\"pause\"\n *ngIf=\"!isIntervalRefreshToggleOn\"\n ></i>\n </label>\n\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Refresh' | translate\"\n [tooltip]=\"'Refresh' | translate\"\n placement=\"bottom\"\n type=\"button\"\n [adaptivePosition]=\"false\"\n [container]=\"'body'\"\n [delay]=\"500\"\n [disabled]=\"isRefreshDisabled || (isLoading | async)\"\n (click)=\"reload()\"\n data-cy=\"c8y-data-points-table-widget--reload-button\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': isLoading | async }\"\n ></i>\n </button>\n </div>\n </div>\n </div>\n</ng-container>\n" }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.TranslateService }, { type: i2.WidgetGlobalAutoRefreshService }], propDecorators: { countdownIntervalComponent: [{ type: ViewChild, args: [CountdownIntervalComponent, { static: false }] }], isAutoRefreshEnabled: [{ type: Input }], isRefreshDisabled: [{ type: Input }], isLoading: [{ type: Input }], isScrolling: [{ type: Input }], isExportModalOpen: [{ type: Input }], refreshInterval: [{ type: Input }], widgetInstanceGlobalAutoRefreshContext: [{ type: Input }], onCountdownEnded: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy1yZWxvYWQvZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvZGF0YXBvaW50cy10YWJsZS9kYXRhcG9pbnRzLXRhYmxlLXZpZXcvZGF0YXBvaW50cy1yZWxvYWQvZGF0YXBvaW50cy1yZWxvYWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxZQUFZLEVBQ1osMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLDhCQUE4QixFQUM5QixPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBUWhFLE1BQU0sT0FBTyx5QkFDWCxTQUFRLG1CQUFtQjtJQWdEM0IsWUFDVSxLQUF3QixFQUN4QixnQkFBa0MsRUFDbEMsOEJBQThEO1FBRXRFLEtBQUssRUFBRSxDQUFDO1FBSkEsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIscUJBQWdCLEdBQWhCLGdCQUFnQixD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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ29tbW9uTW9kdWxlLFxuICBDb3VudGRvd25JbnRlcnZhbENvbXBvbmVudCxcbiAgQ291bnRkb3duSW50ZXJ2YWxNb2R1bGUsXG4gIEludGVydmFsQmFzZWRSZWxvYWQsXG4gIExpc3RHcm91cE1vZHVsZSxcbiAgV2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2hTZXJ2aWNlLFxuICBnZXR0ZXh0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvdG9vbHRpcCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kYXRhcG9pbnRzLXJlbG9hZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhcG9pbnRzLXJlbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIENvdW50ZG93bkludGVydmFsTW9kdWxlLCBMaXN0R3JvdXBNb2R1bGUsIFRvb2x0aXBNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIERhdGFwb2ludHNSZWxvYWRDb21wb25lbnRcbiAgZXh0ZW5kcyBJbnRlcnZhbEJhc2VkUmVsb2FkXG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgQFZpZXdDaGlsZChDb3VudGRvd25JbnRlcnZhbENvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGNvdW50ZG93bkludGVydmFsQ29tcG9uZW50OiBDb3VudGRvd25JbnRlcnZhbENvbXBvbmVudDtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBASW5wdXQoKSBpc0F1dG9SZWZyZXNoRW5hYmxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBASW5wdXQoKSBpc1JlZnJlc2hEaXNhYmxlZCA9IGZhbHNlO1xuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuXG4gIEBJbnB1dCgpIGlzU2Nyb2xsaW5nOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIGlzRXhwb3J0TW9kYWxPcGVuOiBib29sZWFuO1xuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIEBJbnB1dCgpIHJlZnJlc2hJbnRlcnZhbDogbnVtYmVyO1xuXG4gIEBJbnB1dCgpIHdpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0OiBib29sZWFuO1xuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIEBPdXRwdXQoKSBvbkNvdW50ZG93bkVuZGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT246IGJvb2xlYW47XG5cbiAgdG9nZ2xlQ291bnRkb3duQnV0dG9uVG9vbHRpcFRleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwcm90ZWN0ZWQgbWFudWFsbHlEaXNhYmxlZENvdW50ZG93biA9IGZhbHNlO1xuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIHByb3RlY3RlZCBoaWRlQ291bnRkb3duOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgd2lkZ2V0R2xvYmFsQXV0b1JlZnJlc2hTZXJ2aWNlOiBXaWRnZXRHbG9iYWxBdXRvUmVmcmVzaFNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy53aWRnZXRJbnN0YW5jZUdsb2JhbEF1dG9SZWZyZXNoQ29udGV4dCkge1xuICAgICAgdGhpcy53aWRnZXRHbG9iYWxBdXRvUmVmcmVzaFNlcnZpY2UuY291bnRkb3duQWN0aW9ucy5jb3VudGRvd25FbmRlZCRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLm9uQ291bnRkb3duRW5kZWQuZW1pdCgpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSZWZyZXNoRGlzYWJsZWQgJiYgdGhpcy5pc0F1dG9SZWZyZXNoRW5hYmxlZCkge1xuICAgICAgdGhpcy5pc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uID0gZmFsc2U7XG4gICAgICB0aGlzLmRpc2FibGVDb3VudGRvd24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0V4cG9ydE1vZGFsT3BlbiAmJiB0aGlzLmNhbkRpc2FibGVDb3VudGRvd25XaGVuTW9kYWxJc09wZW4oKSkge1xuICAgICAgdGhpcy5pc0ludGVydmFsUmVmcmVzaFRvZ2dsZU9uID0gIXRoaXMuaXNJbnRlcnZhbFJlZnJlc2hUb2dnbGVPbjtcbiAgICAgIHRoaXMuZGlzYWJsZUNvdW50ZG93bigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5jYW5TdGFydENvdW50ZG93bihjaGFuZ2VzKSkge1xuICAgICAgICB0aGlzLmlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT24gPSB0cnVlO1xuICAgICAgICB0aGlzLnN0YXJ0Q291bnRkb3duKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNhbkhhbmRsZVNjcm9sbGluZygpKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsaW5nKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY291bnRkb3duU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmNvdW50ZG93blN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGNvdW50ZG93bkVuZGVkKCk6IHZvaWQge1xuICAgIC8qKlxuICAgICAqIEBpbmhlcml0ZG9jXG4gICAgICovXG4gICAgdGhpcy5hdXRvUmVmcmVzaExpc3QoKTtcbiAgfVxuXG4gIHJlbG9hZCgpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBAaW5oZXJpdGRvY1xuICAgICAqL1xuICAgIHRoaXMuYXV0b1JlZnJlc2hMaXN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXRkb2NcbiAgICovXG4gIGVuYWJsZUNvdW50ZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmhpZGVDb3VudGRvd24gPSBmYWxzZTtcbiAgICAvLyBQcmV2ZW50cyB0aGUgY291bnRkb3duIGZyb20gZ2V0dGluZyBzdHVjayBvbiBhbiBpbml0aWFsIHZhbHVlLlxuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIHRoaXMuc3RhcnRDb3VudGRvd24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUNvdW50ZG93bkJ1dHRvblRvb2x0aXBUZXh0KCk6IHZvaWQge1xuICAgIHRoaXMudG9nZ2xlQ291bnRkb3duQnV0dG9uVG9vbHRpcFRleHQgPSB0aGlzLmlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT25cbiAgICAgID8gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnRGlzYWJsZSBhdXRvIHJlZnJlc2gnKSlcbiAgICAgIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoZ2V0dGV4dCgnRW5hYmxlIGF1dG8gcmVmcmVzaCcpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuU3RhcnRDb3VudGRvd24oY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgaXNBdXRvUmVmcmVzaEVuYWJsZWQsIHJlZnJlc2hJbnRlcnZhbCB9ID0gY2hhbmdlcztcbiAgICByZXR1cm4gKFxuICAgICAgKGlzQXV0b1JlZnJlc2hFbmFibGVkIHx8IHJlZnJlc2hJbnRlcnZhbCkgJiZcbiAgICAgICh0aGlzLmlzQXV0b1JlZnJlc2hFbmFibGVkIHx8ICEhdGhpcy5yZWZyZXNoSW50ZXJ2YWwpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FuSGFuZGxlU2Nyb2xsaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5tYW51YWxseURpc2FibGVkQ291bnRkb3duICYmIHRoaXMuaXNBdXRvUmVmcmVzaEVuYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIGNhbkRpc2FibGVDb3VudGRvd25XaGVuTW9kYWxJc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNBdXRvUmVmcmVzaEVuYWJsZWQgJiZcbiAgICAgICEhdGhpcy5yZWZyZXNoSW50ZXJ2YWwgJiZcbiAgICAgICF0aGlzLm1hbnVhbGx5RGlzYWJsZWRDb3VudGRvd24gJiZcbiAgICAgICF0aGlzLmlzU2Nyb2xsaW5nICYmXG4gICAgICAhdGhpcy5oaWRlQ291bnRkb3duXG4gICAgKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3aWRnZXRJbnN0YW5jZUdsb2JhbEF1dG9SZWZyZXNoQ29udGV4dFwiPlxuICA8ZGl2IGNsYXNzPVwiYS1pLWNlbnRlciBpbnB1dC1ncm91cCBwLXQtNCBwLWItNCBtYXgtd2lkdGgtZml0IG0tbC1hdXRvXCI+XG4gICAgPGxhYmVsXG4gICAgICBjbGFzcz1cIm0tYi0wIG0tci04IHRleHQtbGFiZWwtc21hbGwgdGV4dC10cnVuY2F0ZSBmbGV4LW5vLXNocmlua1wiXG4gICAgICB0aXRsZT1cIiB7eyAnQXV0byByZWZyZXNoJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAqbmdJZj1cInJlZnJlc2hJbnRlcnZhbCAmJiBpc0F1dG9SZWZyZXNoRW5hYmxlZFwiXG4gICAgPlxuICAgICAge3sgJ0F1dG8gcmVmcmVzaCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxuICAgICAgPGxhYmVsXG4gICAgICAgIGNsYXNzPVwidG9nZ2xlLWNvdW50ZG93blwiXG4gICAgICAgIFtjbGFzcy50b2dnbGUtY291bnRkb3duLWRpc2FibGVkXT1cImlzUmVmcmVzaERpc2FibGVkXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0b2dnbGVDb3VudGRvd25CdXR0b25Ub29sdGlwVGV4dFwiXG4gICAgICAgIFt0b29sdGlwXT1cInRvZ2dsZUNvdW50ZG93bkJ1dHRvblRvb2x0aXBUZXh0XCJcbiAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgKm5nSWY9XCJyZWZyZXNoSW50ZXJ2YWwgJiYgaXNBdXRvUmVmcmVzaEVuYWJsZWRcIlxuICAgICAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIFtjb250YWluZXJdPVwiJ2JvZHknXCJcbiAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICA+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgW2NoZWNrZWRdPVwiaXNJbnRlcnZhbFJlZnJlc2hUb2dnbGVPblwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVmcmVzaERpc2FibGVkXCJcbiAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtcG9pbnRzLXRhYmxlLXdpZGdldC0taW50ZXJ2YWwtdG9nZ2xlLWJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uVG9nZ2xlQ291bnRkb3duQnV0dG9uU3RhdGUoJGV2ZW50KVwiXG4gICAgICAgIC8+XG5cbiAgICAgICAgPGM4eS1jb3VudGRvd24taW50ZXJ2YWxcbiAgICAgICAgICAqbmdJZj1cImlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT25cIlxuICAgICAgICAgIFtjb3VudGRvd25JbnRlcnZhbF09XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgIChjb3VudGRvd25FbmRlZCk9XCJjb3VudGRvd25FbmRlZCgpXCJcbiAgICAgICAgPjwvYzh5LWNvdW50ZG93bi1pbnRlcnZhbD5cbiAgICAgICAgPGlcbiAgICAgICAgICBjOHlJY29uPVwicGF1c2VcIlxuICAgICAgICAgICpuZ0lmPVwiIWlzSW50ZXJ2YWxSZWZyZXNoVG9nZ2xlT25cIlxuICAgICAgICA+PC9pPlxuICAgICAgPC9sYWJlbD5cblxuICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1JlZnJlc2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICBbdG9vbHRpcF09XCInUmVmcmVzaCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW2FkYXB0aXZlUG9zaXRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgIFtjb250YWluZXJdPVwiJ2JvZHknXCJcbiAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNSZWZyZXNoRGlzYWJsZWQgfHwgKGlzTG9hZGluZyB8IGFzeW5jKVwiXG4gICAgICAgICAgKGNsaWNrKT1cInJlbG9hZCgpXCJcbiAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhdGEtcG9pbnRzLXRhYmxlLXdpZGdldC0tcmVsb2FkLWJ1dHRvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8aVxuICAgICAgICAgICAgYzh5SWNvbj1cInJlZnJlc2hcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogaXNMb2FkaW5nIHwgYXN5bmMgfVwiXG4gICAgICAgICAgPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==