UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

329 lines (323 loc) 42.6 kB
import { NgClass, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, ContentChildren, Directive, Input, ViewEncapsulation, booleanAttribute, inject } from '@angular/core'; import { Subject, merge } from 'rxjs'; import { distinctUntilChanged, map, mergeMap, startWith, switchMap, takeUntil } from 'rxjs/operators'; import { NzFormNoStatusService, NzFormPatchModule, NzFormStatusService } from 'ng-zorro-antd/core/form'; import { getStatusClassNames } from 'ng-zorro-antd/core/util'; import { NzInputGroupSlotComponent } from './input-group-slot.component'; import { NzInputDirective } from './input.directive'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/a11y"; import * as i2 from "@angular/cdk/bidi"; import * as i3 from "ng-zorro-antd/core/form"; export class NzInputGroupWhitSuffixOrPrefixDirective { constructor(elementRef) { this.elementRef = elementRef; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzInputGroupWhitSuffixOrPrefixDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.1.2", type: NzInputGroupWhitSuffixOrPrefixDirective, isStandalone: true, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]", ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzInputGroupWhitSuffixOrPrefixDirective, decorators: [{ type: Directive, args: [{ selector: `nz-input-group[nzSuffix], nz-input-group[nzPrefix]`, standalone: true }] }], ctorParameters: () => [{ type: i0.ElementRef }] }); export class NzInputGroupComponent { constructor(focusMonitor, elementRef, renderer, cdr, directionality) { this.focusMonitor = focusMonitor; this.elementRef = elementRef; this.renderer = renderer; this.cdr = cdr; this.directionality = directionality; this.nzAddOnBeforeIcon = null; this.nzAddOnAfterIcon = null; this.nzPrefixIcon = null; this.nzSuffixIcon = null; this.nzStatus = ''; this.nzSize = 'default'; this.nzSearch = false; this.nzCompact = false; this.isLarge = false; this.isSmall = false; this.isAffix = false; this.isAddOn = false; this.isFeedback = false; this.focused = false; this.disabled = false; this.dir = 'ltr'; // status this.prefixCls = 'ant-input'; this.affixStatusCls = {}; this.groupStatusCls = {}; this.affixInGroupStatusCls = {}; this.status = ''; this.hasFeedback = false; this.destroy$ = new Subject(); this.nzFormStatusService = inject(NzFormStatusService, { optional: true }); this.nzFormNoStatusService = inject(NzFormNoStatusService, { optional: true }); } updateChildrenInputSize() { if (this.listOfNzInputDirective) { this.listOfNzInputDirective.forEach(item => (item.nzSize = this.nzSize)); } } ngOnInit() { this.nzFormStatusService?.formStatusChanges .pipe(distinctUntilChanged((pre, cur) => { return pre.status === cur.status && pre.hasFeedback === cur.hasFeedback; }), takeUntil(this.destroy$)) .subscribe(({ status, hasFeedback }) => { this.setStatusStyles(status, hasFeedback); }); this.focusMonitor .monitor(this.elementRef, true) .pipe(takeUntil(this.destroy$)) .subscribe(focusOrigin => { this.focused = !!focusOrigin; this.cdr.markForCheck(); }); this.dir = this.directionality.value; this.directionality.change?.pipe(takeUntil(this.destroy$)).subscribe((direction) => { this.dir = direction; }); } ngAfterContentInit() { this.updateChildrenInputSize(); const listOfInputChange$ = this.listOfNzInputDirective.changes.pipe(startWith(this.listOfNzInputDirective)); listOfInputChange$ .pipe(switchMap(list => merge(...[listOfInputChange$, ...list.map((input) => input.disabled$)])), mergeMap(() => listOfInputChange$), map(list => list.some((input) => input.disabled)), takeUntil(this.destroy$)) .subscribe(disabled => { this.disabled = disabled; this.cdr.markForCheck(); }); } ngOnChanges(changes) { const { nzSize, nzSuffix, nzPrefix, nzPrefixIcon, nzSuffixIcon, nzAddOnAfter, nzAddOnBefore, nzAddOnAfterIcon, nzAddOnBeforeIcon, nzStatus } = changes; if (nzSize) { this.updateChildrenInputSize(); this.isLarge = this.nzSize === 'large'; this.isSmall = this.nzSize === 'small'; } if (nzSuffix || nzPrefix || nzPrefixIcon || nzSuffixIcon) { this.isAffix = !!(this.nzSuffix || this.nzPrefix || this.nzPrefixIcon || this.nzSuffixIcon); } if (nzAddOnAfter || nzAddOnBefore || nzAddOnAfterIcon || nzAddOnBeforeIcon) { this.isAddOn = !!(this.nzAddOnAfter || this.nzAddOnBefore || this.nzAddOnAfterIcon || this.nzAddOnBeforeIcon); this.nzFormNoStatusService?.noFormStatus?.next(this.isAddOn); } if (nzStatus) { this.setStatusStyles(this.nzStatus, this.hasFeedback); } } ngOnDestroy() { this.focusMonitor.stopMonitoring(this.elementRef); this.destroy$.next(); this.destroy$.complete(); } setStatusStyles(status, hasFeedback) { // set inner status this.status = status; this.hasFeedback = hasFeedback; this.isFeedback = !!status && hasFeedback; const baseAffix = !!(this.nzSuffix || this.nzPrefix || this.nzPrefixIcon || this.nzSuffixIcon); this.isAffix = baseAffix || (!this.isAddOn && hasFeedback); this.affixInGroupStatusCls = this.isAffix || this.isFeedback ? (this.affixStatusCls = getStatusClassNames(`${this.prefixCls}-affix-wrapper`, status, hasFeedback)) : {}; this.cdr.markForCheck(); // render status if nzStatus is set this.affixStatusCls = getStatusClassNames(`${this.prefixCls}-affix-wrapper`, this.isAddOn ? '' : status, this.isAddOn ? false : hasFeedback); this.groupStatusCls = getStatusClassNames(`${this.prefixCls}-group-wrapper`, this.isAddOn ? status : '', this.isAddOn ? hasFeedback : false); const statusCls = { ...this.affixStatusCls, ...this.groupStatusCls }; Object.keys(statusCls).forEach(status => { if (statusCls[status]) { this.renderer.addClass(this.elementRef.nativeElement, status); } else { this.renderer.removeClass(this.elementRef.nativeElement, status); } }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzInputGroupComponent, deps: [{ token: i1.FocusMonitor }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i2.Directionality }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.2", type: NzInputGroupComponent, isStandalone: true, selector: "nz-input-group", inputs: { nzAddOnBeforeIcon: "nzAddOnBeforeIcon", nzAddOnAfterIcon: "nzAddOnAfterIcon", nzPrefixIcon: "nzPrefixIcon", nzSuffixIcon: "nzSuffixIcon", nzAddOnBefore: "nzAddOnBefore", nzAddOnAfter: "nzAddOnAfter", nzPrefix: "nzPrefix", nzStatus: "nzStatus", nzSuffix: "nzSuffix", nzSize: "nzSize", nzSearch: ["nzSearch", "nzSearch", booleanAttribute], nzCompact: ["nzCompact", "nzCompact", booleanAttribute] }, host: { properties: { "class.ant-input-group-compact": "nzCompact", "class.ant-input-search-enter-button": "nzSearch", "class.ant-input-search": "nzSearch", "class.ant-input-search-rtl": "dir === 'rtl'", "class.ant-input-search-sm": "nzSearch && isSmall", "class.ant-input-search-large": "nzSearch && isLarge", "class.ant-input-group-wrapper": "isAddOn", "class.ant-input-group-wrapper-rtl": "dir === 'rtl'", "class.ant-input-group-wrapper-lg": "isAddOn && isLarge", "class.ant-input-group-wrapper-sm": "isAddOn && isSmall", "class.ant-input-affix-wrapper": "isAffix && !isAddOn", "class.ant-input-affix-wrapper-rtl": "dir === 'rtl'", "class.ant-input-affix-wrapper-focused": "isAffix && focused", "class.ant-input-affix-wrapper-disabled": "isAffix && disabled", "class.ant-input-affix-wrapper-lg": "isAffix && !isAddOn && isLarge", "class.ant-input-affix-wrapper-sm": "isAffix && !isAddOn && isSmall", "class.ant-input-group": "!isAffix && !isAddOn", "class.ant-input-group-rtl": "dir === 'rtl'", "class.ant-input-group-lg": "!isAffix && !isAddOn && isLarge", "class.ant-input-group-sm": "!isAffix && !isAddOn && isSmall" } }, providers: [NzFormNoStatusService], queries: [{ propertyName: "listOfNzInputDirective", predicate: NzInputDirective }], exportAs: ["nzInputGroup"], usesOnChanges: true, ngImport: i0, template: ` @if (isAddOn) { <span class="ant-input-wrapper ant-input-group"> @if (nzAddOnBefore || nzAddOnBeforeIcon) { <span nz-input-group-slot type="addon" [icon]="nzAddOnBeforeIcon" [template]="nzAddOnBefore"></span> } @if (isAffix || hasFeedback) { <span class="ant-input-affix-wrapper" [class.ant-input-affix-wrapper-disabled]="disabled" [class.ant-input-affix-wrapper-sm]="isSmall" [class.ant-input-affix-wrapper-lg]="isLarge" [class.ant-input-affix-wrapper-focused]="focused" [ngClass]="affixInGroupStatusCls" > <ng-template [ngTemplateOutlet]="affixTemplate"></ng-template> </span> } @else { <ng-template [ngTemplateOutlet]="contentTemplate" /> } @if (nzAddOnAfter || nzAddOnAfterIcon) { <span nz-input-group-slot type="addon" [icon]="nzAddOnAfterIcon" [template]="nzAddOnAfter"></span> } </span> } @else { @if (isAffix) { <ng-template [ngTemplateOutlet]="affixTemplate" /> } @else { <ng-template [ngTemplateOutlet]="contentTemplate" /> } } <!-- affix template --> <ng-template #affixTemplate> @if (nzPrefix || nzPrefixIcon) { <span nz-input-group-slot type="prefix" [icon]="nzPrefixIcon" [template]="nzPrefix"></span> } <ng-template [ngTemplateOutlet]="contentTemplate" /> @if (nzSuffix || nzSuffixIcon || isFeedback) { <span nz-input-group-slot type="suffix" [icon]="nzSuffixIcon" [template]="nzSuffix"> @if (isFeedback) { <nz-form-item-feedback-icon [status]="status" /> } </span> } </ng-template> <!-- content template --> <ng-template #contentTemplate> <ng-content></ng-content> @if (!isAddOn && !isAffix && isFeedback) { <span nz-input-group-slot type="suffix"> <nz-form-item-feedback-icon [status]="status" /> </span> } </ng-template> `, isInline: true, dependencies: [{ kind: "component", type: NzInputGroupSlotComponent, selector: "[nz-input-group-slot]", inputs: ["icon", "type", "template"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: NzFormPatchModule }, { kind: "component", type: i3.NzFormItemFeedbackIconComponent, selector: "nz-form-item-feedback-icon", inputs: ["status"], exportAs: ["nzFormFeedbackIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzInputGroupComponent, decorators: [{ type: Component, args: [{ selector: 'nz-input-group', exportAs: 'nzInputGroup', preserveWhitespaces: false, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [NzFormNoStatusService], template: ` @if (isAddOn) { <span class="ant-input-wrapper ant-input-group"> @if (nzAddOnBefore || nzAddOnBeforeIcon) { <span nz-input-group-slot type="addon" [icon]="nzAddOnBeforeIcon" [template]="nzAddOnBefore"></span> } @if (isAffix || hasFeedback) { <span class="ant-input-affix-wrapper" [class.ant-input-affix-wrapper-disabled]="disabled" [class.ant-input-affix-wrapper-sm]="isSmall" [class.ant-input-affix-wrapper-lg]="isLarge" [class.ant-input-affix-wrapper-focused]="focused" [ngClass]="affixInGroupStatusCls" > <ng-template [ngTemplateOutlet]="affixTemplate"></ng-template> </span> } @else { <ng-template [ngTemplateOutlet]="contentTemplate" /> } @if (nzAddOnAfter || nzAddOnAfterIcon) { <span nz-input-group-slot type="addon" [icon]="nzAddOnAfterIcon" [template]="nzAddOnAfter"></span> } </span> } @else { @if (isAffix) { <ng-template [ngTemplateOutlet]="affixTemplate" /> } @else { <ng-template [ngTemplateOutlet]="contentTemplate" /> } } <!-- affix template --> <ng-template #affixTemplate> @if (nzPrefix || nzPrefixIcon) { <span nz-input-group-slot type="prefix" [icon]="nzPrefixIcon" [template]="nzPrefix"></span> } <ng-template [ngTemplateOutlet]="contentTemplate" /> @if (nzSuffix || nzSuffixIcon || isFeedback) { <span nz-input-group-slot type="suffix" [icon]="nzSuffixIcon" [template]="nzSuffix"> @if (isFeedback) { <nz-form-item-feedback-icon [status]="status" /> } </span> } </ng-template> <!-- content template --> <ng-template #contentTemplate> <ng-content></ng-content> @if (!isAddOn && !isAffix && isFeedback) { <span nz-input-group-slot type="suffix"> <nz-form-item-feedback-icon [status]="status" /> </span> } </ng-template> `, host: { '[class.ant-input-group-compact]': `nzCompact`, '[class.ant-input-search-enter-button]': `nzSearch`, '[class.ant-input-search]': `nzSearch`, '[class.ant-input-search-rtl]': `dir === 'rtl'`, '[class.ant-input-search-sm]': `nzSearch && isSmall`, '[class.ant-input-search-large]': `nzSearch && isLarge`, '[class.ant-input-group-wrapper]': `isAddOn`, '[class.ant-input-group-wrapper-rtl]': `dir === 'rtl'`, '[class.ant-input-group-wrapper-lg]': `isAddOn && isLarge`, '[class.ant-input-group-wrapper-sm]': `isAddOn && isSmall`, '[class.ant-input-affix-wrapper]': `isAffix && !isAddOn`, '[class.ant-input-affix-wrapper-rtl]': `dir === 'rtl'`, '[class.ant-input-affix-wrapper-focused]': `isAffix && focused`, '[class.ant-input-affix-wrapper-disabled]': `isAffix && disabled`, '[class.ant-input-affix-wrapper-lg]': `isAffix && !isAddOn && isLarge`, '[class.ant-input-affix-wrapper-sm]': `isAffix && !isAddOn && isSmall`, '[class.ant-input-group]': `!isAffix && !isAddOn`, '[class.ant-input-group-rtl]': `dir === 'rtl'`, '[class.ant-input-group-lg]': `!isAffix && !isAddOn && isLarge`, '[class.ant-input-group-sm]': `!isAffix && !isAddOn && isSmall` }, imports: [NzInputGroupSlotComponent, NgClass, NgTemplateOutlet, NzFormPatchModule], standalone: true }] }], ctorParameters: () => [{ type: i1.FocusMonitor }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i2.Directionality }], propDecorators: { listOfNzInputDirective: [{ type: ContentChildren, args: [NzInputDirective] }], nzAddOnBeforeIcon: [{ type: Input }], nzAddOnAfterIcon: [{ type: Input }], nzPrefixIcon: [{ type: Input }], nzSuffixIcon: [{ type: Input }], nzAddOnBefore: [{ type: Input }], nzAddOnAfter: [{ type: Input }], nzPrefix: [{ type: Input }], nzStatus: [{ type: Input }], nzSuffix: [{ type: Input }], nzSize: [{ type: Input }], nzSearch: [{ type: Input, args: [{ transform: booleanAttribute }] }], nzCompact: [{ type: Input, args: [{ transform: booleanAttribute }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy9pbnB1dC9pbnB1dC1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVELE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULGVBQWUsRUFDZixTQUFTLEVBRVQsS0FBSyxFQVFMLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFeEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7O0FBTXJELE1BQU0sT0FBTyx1Q0FBdUM7SUFDbEQsWUFBbUIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUFHLENBQUM7OEdBRGxDLHVDQUF1QztrR0FBdkMsdUNBQXVDOzsyRkFBdkMsdUNBQXVDO2tCQUpuRCxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvREFBb0Q7b0JBQzlELFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7QUErRkQsTUFBTSxPQUFPLHFCQUFxQjtJQWlDaEMs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QkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQztvQkFDbEYsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOytMQUVvQyxzQkFBc0I7c0JBQXhELGVBQWU7dUJBQUMsZ0JBQWdCO2dCQUN4QixpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNrQyxRQUFRO3NCQUEvQyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUNFLFNBQVM7c0JBQWhELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBGb2N1c01vbml0b3IgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBEaXJlY3Rpb24sIERpcmVjdGlvbmFsaXR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xuaW1wb3J0IHsgTmdDbGFzcywgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBib29sZWFuQXR0cmlidXRlLFxuICBpbmplY3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgbWVyZ2VNYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE56Rm9ybU5vU3RhdHVzU2VydmljZSwgTnpGb3JtUGF0Y2hNb2R1bGUsIE56Rm9ybVN0YXR1c1NlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvZm9ybSc7XG5pbXBvcnQgeyBOZ0NsYXNzSW50ZXJmYWNlLCBOelNpemVMRFNUeXBlLCBOelN0YXR1cywgTnpWYWxpZGF0ZVN0YXR1cyB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBnZXRTdGF0dXNDbGFzc05hbWVzIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuXG5pbXBvcnQgeyBOeklucHV0R3JvdXBTbG90Q29tcG9uZW50IH0gZnJvbSAnLi9pbnB1dC1ncm91cC1zbG90LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOeklucHV0RGlyZWN0aXZlIH0gZnJvbSAnLi9pbnB1dC5kaXJlY3RpdmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IGBuei1pbnB1dC1ncm91cFtuelN1ZmZpeF0sIG56LWlucHV0LWdyb3VwW256UHJlZml4XWAsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTnpJbnB1dEdyb3VwV2hpdFN1ZmZpeE9yUHJlZml4RGlyZWN0aXZlIHtcbiAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHt9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ256LWlucHV0LWdyb3VwJyxcbiAgZXhwb3J0QXM6ICdueklucHV0R3JvdXAnLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW056Rm9ybU5vU3RhdHVzU2VydmljZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgQGlmIChpc0FkZE9uKSB7XG4gICAgICA8c3BhbiBjbGFzcz1cImFudC1pbnB1dC13cmFwcGVyIGFudC1pbnB1dC1ncm91cFwiPlxuICAgICAgICBAaWYgKG56QWRkT25CZWZvcmUgfHwgbnpBZGRPbkJlZm9yZUljb24pIHtcbiAgICAgICAgICA8c3BhbiBuei1pbnB1dC1ncm91cC1zbG90IHR5cGU9XCJhZGRvblwiIFtpY29uXT1cIm56QWRkT25CZWZvcmVJY29uXCIgW3RlbXBsYXRlXT1cIm56QWRkT25CZWZvcmVcIj48L3NwYW4+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGlzQWZmaXggfHwgaGFzRmVlZGJhY2spIHtcbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJhbnQtaW5wdXQtYWZmaXgtd3JhcHBlclwiXG4gICAgICAgICAgICBbY2xhc3MuYW50LWlucHV0LWFmZml4LXdyYXBwZXItZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1hZmZpeC13cmFwcGVyLXNtXT1cImlzU21hbGxcIlxuICAgICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1hZmZpeC13cmFwcGVyLWxnXT1cImlzTGFyZ2VcIlxuICAgICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1hZmZpeC13cmFwcGVyLWZvY3VzZWRdPVwiZm9jdXNlZFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJhZmZpeEluR3JvdXBTdGF0dXNDbHNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJhZmZpeFRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50VGVtcGxhdGVcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAobnpBZGRPbkFmdGVyIHx8IG56QWRkT25BZnRlckljb24pIHtcbiAgICAgICAgICA8c3BhbiBuei1pbnB1dC1ncm91cC1zbG90IHR5cGU9XCJhZGRvblwiIFtpY29uXT1cIm56QWRkT25BZnRlckljb25cIiBbdGVtcGxhdGVdPVwibnpBZGRPbkFmdGVyXCI+PC9zcGFuPlxuICAgICAgICB9XG4gICAgICA8L3NwYW4+XG4gICAgfSBAZWxzZSB7XG4gICAgICBAaWYgKGlzQWZmaXgpIHtcbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFmZml4VGVtcGxhdGVcIiAvPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50VGVtcGxhdGVcIiAvPlxuICAgICAgfVxuICAgIH1cblxuICAgIDwhLS0gYWZmaXggdGVtcGxhdGUgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNhZmZpeFRlbXBsYXRlPlxuICAgICAgQGlmIChuelByZWZpeCB8fCBuelByZWZpeEljb24pIHtcbiAgICAgICAgPHNwYW4gbnotaW5wdXQtZ3JvdXAtc2xvdCB0eXBlPVwicHJlZml4XCIgW2ljb25dPVwibnpQcmVmaXhJY29uXCIgW3RlbXBsYXRlXT1cIm56UHJlZml4XCI+PC9zcGFuPlxuICAgICAgfVxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnRUZW1wbGF0ZVwiIC8+XG4gICAgICBAaWYgKG56U3VmZml4IHx8IG56U3VmZml4SWNvbiB8fCBpc0ZlZWRiYWNrKSB7XG4gICAgICAgIDxzcGFuIG56LWlucHV0LWdyb3VwLXNsb3QgdHlwZT1cInN1ZmZpeFwiIFtpY29uXT1cIm56U3VmZml4SWNvblwiIFt0ZW1wbGF0ZV09XCJuelN1ZmZpeFwiPlxuICAgICAgICAgIEBpZiAoaXNGZWVkYmFjaykge1xuICAgICAgICAgICAgPG56LWZvcm0taXRlbS1mZWVkYmFjay1pY29uIFtzdGF0dXNdPVwic3RhdHVzXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIH1cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSBjb250ZW50IHRlbXBsYXRlIC0tPlxuICAgIDxuZy10ZW1wbGF0ZSAjY29udGVudFRlbXBsYXRlPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgQGlmICghaXNBZGRPbiAmJiAhaXNBZmZpeCAmJiBpc0ZlZWRiYWNrKSB7XG4gICAgICAgIDxzcGFuIG56LWlucHV0LWdyb3VwLXNsb3QgdHlwZT1cInN1ZmZpeFwiPlxuICAgICAgICAgIDxuei1mb3JtLWl0ZW0tZmVlZGJhY2staWNvbiBbc3RhdHVzXT1cInN0YXR1c1wiIC8+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIH1cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtZ3JvdXAtY29tcGFjdF0nOiBgbnpDb21wYWN0YCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1zZWFyY2gtZW50ZXItYnV0dG9uXSc6IGBuelNlYXJjaGAsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtc2VhcmNoXSc6IGBuelNlYXJjaGAsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtc2VhcmNoLXJ0bF0nOiBgZGlyID09PSAncnRsJ2AsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtc2VhcmNoLXNtXSc6IGBuelNlYXJjaCAmJiBpc1NtYWxsYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1zZWFyY2gtbGFyZ2VdJzogYG56U2VhcmNoICYmIGlzTGFyZ2VgLFxuICAgICdbY2xhc3MuYW50LWlucHV0LWdyb3VwLXdyYXBwZXJdJzogYGlzQWRkT25gLFxuICAgICdbY2xhc3MuYW50LWlucHV0LWdyb3VwLXdyYXBwZXItcnRsXSc6IGBkaXIgPT09ICdydGwnYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1ncm91cC13cmFwcGVyLWxnXSc6IGBpc0FkZE9uICYmIGlzTGFyZ2VgLFxuICAgICdbY2xhc3MuYW50LWlucHV0LWdyb3VwLXdyYXBwZXItc21dJzogYGlzQWRkT24gJiYgaXNTbWFsbGAsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtYWZmaXgtd3JhcHBlcl0nOiBgaXNBZmZpeCAmJiAhaXNBZGRPbmAsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtYWZmaXgtd3JhcHBlci1ydGxdJzogYGRpciA9PT0gJ3J0bCdgLFxuICAgICdbY2xhc3MuYW50LWlucHV0LWFmZml4LXdyYXBwZXItZm9jdXNlZF0nOiBgaXNBZmZpeCAmJiBmb2N1c2VkYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1hZmZpeC13cmFwcGVyLWRpc2FibGVkXSc6IGBpc0FmZml4ICYmIGRpc2FibGVkYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1hZmZpeC13cmFwcGVyLWxnXSc6IGBpc0FmZml4ICYmICFpc0FkZE9uICYmIGlzTGFyZ2VgLFxuICAgICdbY2xhc3MuYW50LWlucHV0LWFmZml4LXdyYXBwZXItc21dJzogYGlzQWZmaXggJiYgIWlzQWRkT24gJiYgaXNTbWFsbGAsXG4gICAgJ1tjbGFzcy5hbnQtaW5wdXQtZ3JvdXBdJzogYCFpc0FmZml4ICYmICFpc0FkZE9uYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1ncm91cC1ydGxdJzogYGRpciA9PT0gJ3J0bCdgLFxuICAgICdbY2xhc3MuYW50LWlucHV0LWdyb3VwLWxnXSc6IGAhaXNBZmZpeCAmJiAhaXNBZGRPbiAmJiBpc0xhcmdlYCxcbiAgICAnW2NsYXNzLmFudC1pbnB1dC1ncm91cC1zbV0nOiBgIWlzQWZmaXggJiYgIWlzQWRkT24gJiYgaXNTbWFsbGBcbiAgfSxcbiAgaW1wb3J0czogW056SW5wdXRHcm91cFNsb3RDb21wb25lbnQsIE5nQ2xhc3MsIE5nVGVtcGxhdGVPdXRsZXQsIE56Rm9ybVBhdGNoTW9kdWxlXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBOeklucHV0R3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQENvbnRlbnRDaGlsZHJlbihOeklucHV0RGlyZWN0aXZlKSBsaXN0T2ZOeklucHV0RGlyZWN0aXZlITogUXVlcnlMaXN0PE56SW5wdXREaXJlY3RpdmU+O1xuICBASW5wdXQoKSBuekFkZE9uQmVmb3JlSWNvbj86IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBuekFkZE9uQWZ0ZXJJY29uPzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG56UHJlZml4SWNvbj86IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBuelN1ZmZpeEljb24/OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpBZGRPbkJlZm9yZT86IHN0cmluZyB8IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBASW5wdXQoKSBuekFkZE9uQWZ0ZXI/OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgQElucHV0KCkgbnpQcmVmaXg/OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgQElucHV0KCkgbnpTdGF0dXM6IE56U3RhdHVzID0gJyc7XG4gIEBJbnB1dCgpIG56U3VmZml4Pzogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dm9pZD47XG4gIEBJbnB1dCgpIG56U2l6ZTogTnpTaXplTERTVHlwZSA9ICdkZWZhdWx0JztcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56U2VhcmNoID0gZmFsc2U7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBuekNvbXBhY3QgPSBmYWxzZTtcbiAgaXNMYXJnZSA9IGZhbHNlO1xuICBpc1NtYWxsID0gZmFsc2U7XG4gIGlzQWZmaXggPSBmYWxzZTtcbiAgaXNBZGRPbiA9IGZhbHNlO1xuICBpc0ZlZWRiYWNrID0gZmFsc2U7XG4gIGZvY3VzZWQgPSBmYWxzZTtcbiAgZGlzYWJsZWQgPSBmYWxzZTtcbiAgZGlyOiBEaXJlY3Rpb24gPSAnbHRyJztcbiAgLy8gc3RhdHVzXG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FudC1pbnB1dCc7XG4gIGFmZml4U3RhdHVzQ2xzOiBOZ0NsYXNzSW50ZXJmYWNlID0ge307XG4gIGdyb3VwU3RhdHVzQ2xzOiBOZ0NsYXNzSW50ZXJmYWNlID0ge307XG4gIGFmZml4SW5Hcm91cFN0YXR1c0NsczogTmdDbGFzc0ludGVyZmFjZSA9IHt9O1xuICBzdGF0dXM6IE56VmFsaWRhdGVTdGF0dXMgPSAnJztcbiAgaGFzRmVlZGJhY2s6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgbnpGb3JtU3RhdHVzU2VydmljZSA9IGluamVjdChOekZvcm1TdGF0dXNTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIG56Rm9ybU5vU3RhdHVzU2VydmljZSA9IGluamVjdChOekZvcm1Ob1N0YXR1c1NlcnZpY2UsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb2N1c01vbml0b3I6IEZvY3VzTW9uaXRvcixcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGRpcmVjdGlvbmFsaXR5OiBEaXJlY3Rpb25hbGl0eVxuICApIHt9XG5cbiAgdXBkYXRlQ2hpbGRyZW5JbnB1dFNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGlzdE9mTnpJbnB1dERpcmVjdGl2ZSkge1xuICAgICAgdGhpcy5saXN0T2ZOeklucHV0RGlyZWN0aXZlLmZvckVhY2goaXRlbSA9PiAoaXRlbS5uelNpemUgPSB0aGlzLm56U2l6ZSkpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubnpGb3JtU3RhdHVzU2VydmljZT8uZm9ybVN0YXR1c0NoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJlLCBjdXIpID0+IHtcbiAgICAgICAgICByZXR1cm4gcHJlLnN0YXR1cyA9PT0gY3VyLnN0YXR1cyAmJiBwcmUuaGFzRmVlZGJhY2sgPT09IGN1ci5oYXNGZWVkYmFjaztcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoeyBzdGF0dXMsIGhhc0ZlZWRiYWNrIH0pID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0dXNTdHlsZXMoc3RhdHVzLCBoYXNGZWVkYmFjayk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZm9jdXNNb25pdG9yXG4gICAgICAubW9uaXRvcih0aGlzLmVsZW1lbnRSZWYsIHRydWUpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKGZvY3VzT3JpZ2luID0+IHtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gISFmb2N1c09yaWdpbjtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZGlyID0gdGhpcy5kaXJlY3Rpb25hbGl0eS52YWx1ZTtcbiAgICB0aGlzLmRpcmVjdGlvbmFsaXR5LmNoYW5nZT8ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZGlyZWN0aW9uOiBEaXJlY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuZGlyID0gZGlyZWN0aW9uO1xuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQ2hpbGRyZW5JbnB1dFNpemUoKTtcbiAgICBjb25zdCBsaXN0T2ZJbnB1dENoYW5nZSQgPSB0aGlzLmxpc3RPZk56SW5wdXREaXJlY3RpdmUuY2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLmxpc3RPZk56SW5wdXREaXJlY3RpdmUpKTtcbiAgICBsaXN0T2ZJbnB1dENoYW5nZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAobGlzdCA9PiBtZXJnZSguLi5bbGlzdE9mSW5wdXRDaGFuZ2UkLCAuLi5saXN0Lm1hcCgoaW5wdXQ6IE56SW5wdXREaXJlY3RpdmUpID0+IGlucHV0LmRpc2FibGVkJCldKSksXG4gICAgICAgIG1lcmdlTWFwKCgpID0+IGxpc3RPZklucHV0Q2hhbmdlJCksXG4gICAgICAgIG1hcChsaXN0ID0+IGxpc3Quc29tZSgoaW5wdXQ6IE56SW5wdXREaXJlY3RpdmUpID0+IGlucHV0LmRpc2FibGVkKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShkaXNhYmxlZCA9PiB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgbnpTaXplLFxuICAgICAgbnpTdWZmaXgsXG4gICAgICBuelByZWZpeCxcbiAgICAgIG56UHJlZml4SWNvbixcbiAgICAgIG56U3VmZml4SWNvbixcbiAgICAgIG56QWRkT25BZnRlcixcbiAgICAgIG56QWRkT25CZWZvcmUsXG4gICAgICBuekFkZE9uQWZ0ZXJJY29uLFxuICAgICAgbnpBZGRPbkJlZm9yZUljb24sXG4gICAgICBuelN0YXR1c1xuICAgIH0gPSBjaGFuZ2VzO1xuICAgIGlmIChuelNpemUpIHtcbiAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW5JbnB1dFNpemUoKTtcbiAgICAgIHRoaXMuaXNMYXJnZSA9IHRoaXMubnpTaXplID09PSAnbGFyZ2UnO1xuICAgICAgdGhpcy5pc1NtYWxsID0gdGhpcy5uelNpemUgPT09ICdzbWFsbCc7XG4gICAgfVxuICAgIGlmIChuelN1ZmZpeCB8fCBuelByZWZpeCB8fCBuelByZWZpeEljb24gfHwgbnpTdWZmaXhJY29uKSB7XG4gICAgICB0aGlzLmlzQWZmaXggPSAhISh0aGlzLm56U3VmZml4IHx8IHRoaXMubnpQcmVmaXggfHwgdGhpcy5uelByZWZpeEljb24gfHwgdGhpcy5uelN1ZmZpeEljb24pO1xuICAgIH1cbiAgICBpZiAobnpBZGRPbkFmdGVyIHx8IG56QWRkT25CZWZvcmUgfHwgbnpBZGRPbkFmdGVySWNvbiB8fCBuekFkZE9uQmVmb3JlSWNvbikge1xuICAgICAgdGhpcy5pc0FkZE9uID0gISEodGhpcy5uekFkZE9uQWZ0ZXIgfHwgdGhpcy5uekFkZE9uQmVmb3JlIHx8IHRoaXMubnpBZGRPbkFmdGVySWNvbiB8fCB0aGlzLm56QWRkT25CZWZvcmVJY29uKTtcbiAgICAgIHRoaXMubnpGb3JtTm9TdGF0dXNTZXJ2aWNlPy5ub0Zvcm1TdGF0dXM/Lm5leHQodGhpcy5pc0FkZE9uKTtcbiAgICB9XG4gICAgaWYgKG56U3RhdHVzKSB7XG4gICAgICB0aGlzLnNldFN0YXR1c1N0eWxlcyh0aGlzLm56U3RhdHVzLCB0aGlzLmhhc0ZlZWRiYWNrKTtcbiAgICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5lbGVtZW50UmVmKTtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0YXR1c1N0eWxlcyhzdGF0dXM6IE56VmFsaWRhdGVTdGF0dXMsIGhhc0ZlZWRiYWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gc2V0IGlubmVyIHN0YXR1c1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuaGFzRmVlZGJhY2sgPSBoYXNGZWVkYmFjaztcbiAgICB0aGlzLmlzRmVlZGJhY2sgPSAhIXN0YXR1cyAmJiBoYXNGZWVkYmFjaztcbiAgICBjb25zdCBiYXNlQWZmaXggPSAhISh0aGlzLm56U3VmZml4IHx8IHRoaXMubnpQcmVmaXggfHwgdGhpcy5uelByZWZpeEljb24gfHwgdGhpcy5uelN1ZmZpeEljb24pO1xuICAgIHRoaXMuaXNBZmZpeCA9IGJhc2VBZmZpeCB8fCAoIXRoaXMuaXNBZGRPbiAmJiBoYXNGZWVkYmFjayk7XG4gICAgdGhpcy5hZmZpeEluR3JvdXBTdGF0dXNDbHMgPVxuICAgICAgdGhpcy5pc0FmZml4IHx8IHRoaXMuaXNGZWVkYmFja1xuICAgICAgICA/ICh0aGlzLmFmZml4U3RhdHVzQ2xzID0gZ2V0U3RhdHVzQ2xhc3NOYW1lcyhgJHt0aGlzLnByZWZpeENsc30tYWZmaXgtd3JhcHBlcmAsIHN0YXR1cywgaGFzRmVlZGJhY2spKVxuICAgICAgICA6IHt9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIC8vIHJlbmRlciBzdGF0dXMgaWYgbnpTdGF0dXMgaXMgc2V0XG4gICAgdGhpcy5hZmZpeFN0YXR1c0NscyA9IGdldFN0YXR1c0NsYXNzTmFtZXMoXG4gICAgICBgJHt0aGlzLnByZWZpeENsc30tYWZmaXgtd3JhcHBlcmAsXG4gICAgICB0aGlzLmlzQWRkT24gPyAnJyA6IHN0YXR1cyxcbiAgICAgIHRoaXMuaXNBZGRPbiA/IGZhbHNlIDogaGFzRmVlZGJhY2tcbiAgICApO1xuICAgIHRoaXMuZ3JvdXBTdGF0dXNDbHMgPSBnZXRTdGF0dXNDbGFzc05hbWVzKFxuICAgICAgYCR7dGhpcy5wcmVmaXhDbHN9LWdyb3VwLXdyYXBwZXJgLFxuICAgICAgdGhpcy5pc0FkZE9uID8gc3RhdHVzIDogJycsXG4gICAgICB0aGlzLmlzQWRkT24gPyBoYXNGZWVkYmFjayA6IGZhbHNlXG4gICAgKTtcbiAgICBjb25zdCBzdGF0dXNDbHMgPSB7XG4gICAgICAuLi50aGlzLmFmZml4U3RhdHVzQ2xzLFxuICAgICAgLi4udGhpcy5ncm91cFN0YXR1c0Nsc1xuICAgIH07XG4gICAgT2JqZWN0LmtleXMoc3RhdHVzQ2xzKS5mb3JFYWNoKHN0YXR1cyA9PiB7XG4gICAgICBpZiAoc3RhdHVzQ2xzW3N0YXR1c10pIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgc3RhdHVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHN0YXR1cyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==