UNPKG

ng-zorro-antd

Version:

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

477 lines 54.3 kB
import { NgIf, NgStyle } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output, ViewChildren, ViewEncapsulation, booleanAttribute } from '@angular/core'; import { Subject, of as observableOf, of } from 'rxjs'; import { distinctUntilChanged, map, takeUntil, withLatestFrom } from 'rxjs/operators'; import { NzButtonModule } from 'ng-zorro-antd/button'; import { getStatusClassNames, toArray } from 'ng-zorro-antd/core/util'; import { NzIconModule } from 'ng-zorro-antd/icon'; import { NzTransferListComponent } from './transfer-list.component'; import * as i0 from "@angular/core"; import * as i1 from "ng-zorro-antd/i18n"; import * as i2 from "@angular/cdk/bidi"; import * as i3 from "ng-zorro-antd/core/form"; import * as i4 from "ng-zorro-antd/icon"; import * as i5 from "ng-zorro-antd/button"; import * as i6 from "ng-zorro-antd/core/transition-patch"; import * as i7 from "ng-zorro-antd/core/wave"; export class NzTransferComponent { splitDataSource() { this.leftDataSource = []; this.rightDataSource = []; this.nzDataSource.forEach(record => { if (record.direction === 'right') { record.direction = 'right'; this.rightDataSource.push(record); } else { record.direction = 'left'; this.leftDataSource.push(record); } }); } getCheckedData(direction) { return this[direction === 'left' ? 'leftDataSource' : 'rightDataSource'].filter(w => w.checked); } handleSelect(direction, checked, item) { const list = this.getCheckedData(direction); this.updateOperationStatus(direction, list.length); this.nzSelectChange.emit({ direction, checked, list, item }); } handleFilterChange(ret) { this.nzSearchChange.emit(ret); } updateOperationStatus(direction, count) { this[direction === 'right' ? 'leftActive' : 'rightActive'] = (typeof count === 'undefined' ? this.getCheckedData(direction).filter(w => !w.disabled).length : count) > 0; } moveTo(direction) { const oppositeDirection = direction === 'left' ? 'right' : 'left'; this.updateOperationStatus(oppositeDirection, 0); const datasource = direction === 'left' ? this.rightDataSource : this.leftDataSource; const moveList = datasource.filter(item => item.checked === true && !item.disabled); this.nzCanMove({ direction, list: moveList }).subscribe(newMoveList => this.truthMoveTo(direction, newMoveList.filter(i => !!i)), () => moveList.forEach(i => (i.checked = false))); } truthMoveTo(direction, list) { const oppositeDirection = direction === 'left' ? 'right' : 'left'; const datasource = direction === 'left' ? this.rightDataSource : this.leftDataSource; const targetDatasource = direction === 'left' ? this.leftDataSource : this.rightDataSource; for (const item of list) { item.checked = false; item.hide = false; item.direction = direction; datasource.splice(datasource.indexOf(item), 1); } targetDatasource.splice(0, 0, ...list); this.updateOperationStatus(oppositeDirection); this.nzChange.emit({ from: oppositeDirection, to: direction, list }); this.markForCheckAllList(); } // #endregion constructor(cdr, i18n, elementRef, renderer, directionality, nzFormStatusService, nzFormNoStatusService) { this.cdr = cdr; this.i18n = i18n; this.elementRef = elementRef; this.renderer = renderer; this.directionality = directionality; this.nzFormStatusService = nzFormStatusService; this.nzFormNoStatusService = nzFormNoStatusService; this.unsubscribe$ = new Subject(); this.leftFilter = ''; this.rightFilter = ''; this.dir = 'ltr'; // status this.prefixCls = 'ant-transfer'; this.statusCls = {}; this.hasFeedback = false; // #region fields this.nzDisabled = false; this.nzDataSource = []; this.nzTitles = ['', '']; this.nzOperations = []; this.nzListStyle = {}; this.nzShowSelectAll = true; this.nzCanMove = (arg) => of(arg.list); this.nzRenderList = null; this.nzRender = null; this.nzFooter = null; this.nzShowSearch = false; this.nzTargetKeys = []; this.nzSelectedKeys = []; this.nzStatus = ''; // events this.nzChange = new EventEmitter(); this.nzSearchChange = new EventEmitter(); this.nzSelectChange = new EventEmitter(); // #endregion // #region process data // left this.leftDataSource = []; // right this.rightDataSource = []; this.handleLeftSelectAll = (checked) => this.handleSelect('left', checked); this.handleRightSelectAll = (checked) => this.handleSelect('right', checked); this.handleLeftSelect = (item) => this.handleSelect('left', !!item.checked, item); this.handleRightSelect = (item) => this.handleSelect('right', !!item.checked, item); // #endregion // #region operation this.leftActive = false; this.rightActive = false; this.moveToLeft = () => this.moveTo('left'); this.moveToRight = () => this.moveTo('right'); } markForCheckAllList() { if (!this.lists) { return; } this.lists.forEach(i => i.markForCheck()); } handleNzTargetKeys() { const keys = toArray(this.nzTargetKeys); const hasOwnKey = (e) => e.hasOwnProperty('key'); this.leftDataSource.forEach(e => { if (hasOwnKey(e) && keys.indexOf(e.key) !== -1 && !e.disabled) { e.checked = true; } }); this.moveToRight(); } handleNzSelectedKeys() { const keys = toArray(this.nzSelectedKeys); this.nzDataSource.forEach(e => { if (keys.indexOf(e.key) !== -1) { e.checked = true; } }); const term = (ld) => ld.disabled === false && ld.checked === true; this.rightActive = this.leftDataSource.some(term); this.leftActive = this.rightDataSource.some(term); } ngOnInit() { this.nzFormStatusService?.formStatusChanges .pipe(distinctUntilChanged((pre, cur) => { return pre.status === cur.status && pre.hasFeedback === cur.hasFeedback; }), withLatestFrom(this.nzFormNoStatusService ? this.nzFormNoStatusService.noFormStatus : observableOf(false)), map(([{ status, hasFeedback }, noStatus]) => ({ status: noStatus ? '' : status, hasFeedback })), takeUntil(this.unsubscribe$)) .subscribe(({ status, hasFeedback }) => { this.setStatusStyles(status, hasFeedback); }); this.i18n.localeChange.pipe(takeUntil(this.unsubscribe$)).subscribe(() => { this.locale = this.i18n.getLocaleData('Transfer'); this.markForCheckAllList(); }); this.dir = this.directionality.value; this.directionality.change?.pipe(takeUntil(this.unsubscribe$)).subscribe((direction) => { this.dir = direction; this.cdr.detectChanges(); }); } ngOnChanges(changes) { const { nzStatus, nzDataSource, nzTargetKeys, nzSelectedKeys } = changes; if (nzDataSource) { this.splitDataSource(); this.updateOperationStatus('left'); this.updateOperationStatus('right'); this.cdr.detectChanges(); this.markForCheckAllList(); } if (nzTargetKeys) { this.handleNzTargetKeys(); } if (nzSelectedKeys) { this.handleNzSelectedKeys(); } if (nzStatus) { this.setStatusStyles(this.nzStatus, this.hasFeedback); } } ngOnDestroy() { this.unsubscribe$.next(); this.unsubscribe$.complete(); } setStatusStyles(status, hasFeedback) { // set inner status this.hasFeedback = hasFeedback; this.cdr.markForCheck(); // render status if nzStatus is set this.statusCls = getStatusClassNames(this.prefixCls, status, hasFeedback); Object.keys(this.statusCls).forEach(status => { if (this.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.0.1", ngImport: i0, type: NzTransferComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NzI18nService }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i2.Directionality, optional: true }, { token: i3.NzFormStatusService, optional: true }, { token: i3.NzFormNoStatusService, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.0.1", type: NzTransferComponent, isStandalone: true, selector: "nz-transfer", inputs: { nzDisabled: ["nzDisabled", "nzDisabled", booleanAttribute], nzDataSource: "nzDataSource", nzTitles: "nzTitles", nzOperations: "nzOperations", nzListStyle: "nzListStyle", nzShowSelectAll: ["nzShowSelectAll", "nzShowSelectAll", booleanAttribute], nzItemUnit: "nzItemUnit", nzItemsUnit: "nzItemsUnit", nzCanMove: "nzCanMove", nzRenderList: "nzRenderList", nzRender: "nzRender", nzFooter: "nzFooter", nzShowSearch: ["nzShowSearch", "nzShowSearch", booleanAttribute], nzFilterOption: "nzFilterOption", nzSearchPlaceholder: "nzSearchPlaceholder", nzNotFoundContent: "nzNotFoundContent", nzTargetKeys: "nzTargetKeys", nzSelectedKeys: "nzSelectedKeys", nzStatus: "nzStatus" }, outputs: { nzChange: "nzChange", nzSearchChange: "nzSearchChange", nzSelectChange: "nzSelectChange" }, host: { properties: { "class.ant-transfer-rtl": "dir === 'rtl'", "class.ant-transfer-disabled": "nzDisabled", "class.ant-transfer-customize-list": "nzRenderList" }, classAttribute: "ant-transfer" }, viewQueries: [{ propertyName: "lists", predicate: NzTransferListComponent, descendants: true }], exportAs: ["nzTransfer"], usesOnChanges: true, ngImport: i0, template: ` <nz-transfer-list class="ant-transfer-list" [ngStyle]="nzListStyle" data-direction="left" direction="left" [titleText]="nzTitles[0]" [showSelectAll]="nzShowSelectAll" [dataSource]="leftDataSource" [filter]="leftFilter" [filterOption]="nzFilterOption" (filterChange)="handleFilterChange($event)" [renderList]="nzRenderList && nzRenderList[0]" [render]="nzRender" [disabled]="nzDisabled" [showSearch]="nzShowSearch" [searchPlaceholder]="nzSearchPlaceholder || locale?.searchPlaceholder" [notFoundContent]="nzNotFoundContent" [itemUnit]="nzItemUnit || locale?.itemUnit" [itemsUnit]="nzItemsUnit || locale?.itemsUnit" [footer]="nzFooter" (handleSelect)="handleLeftSelect($event)" (handleSelectAll)="handleLeftSelectAll($event)" ></nz-transfer-list> <div *ngIf="dir !== 'rtl'" class="ant-transfer-operation"> <button nz-button type="button" (click)="moveToLeft()" [disabled]="nzDisabled || !leftActive" [nzType]="'primary'" [nzSize]="'small'" > <span nz-icon nzType="left"></span> <span *ngIf="nzOperations[1]">{{ nzOperations[1] }}</span> </button> <button nz-button type="button" (click)="moveToRight()" [disabled]="nzDisabled || !rightActive" [nzType]="'primary'" [nzSize]="'small'" > <span nz-icon nzType="right"></span> <span *ngIf="nzOperations[0]">{{ nzOperations[0] }}</span> </button> </div> <div *ngIf="dir === 'rtl'" class="ant-transfer-operation"> <button nz-button type="button" (click)="moveToRight()" [disabled]="nzDisabled || !rightActive" [nzType]="'primary'" [nzSize]="'small'" > <span nz-icon nzType="left"></span> <span *ngIf="nzOperations[0]">{{ nzOperations[0] }}</span> </button> <button nz-button type="button" (click)="moveToLeft()" [disabled]="nzDisabled || !leftActive" [nzType]="'primary'" [nzSize]="'small'" > <span nz-icon nzType="right"></span> <span *ngIf="nzOperations[1]">{{ nzOperations[1] }}</span> </button> </div> <nz-transfer-list class="ant-transfer-list" [ngStyle]="nzListStyle" data-direction="right" direction="right" [titleText]="nzTitles[1]" [showSelectAll]="nzShowSelectAll" [dataSource]="rightDataSource" [filter]="rightFilter" [filterOption]="nzFilterOption" (filterChange)="handleFilterChange($event)" [renderList]="nzRenderList && nzRenderList[1]" [render]="nzRender" [disabled]="nzDisabled" [showSearch]="nzShowSearch" [searchPlaceholder]="nzSearchPlaceholder || locale?.searchPlaceholder" [notFoundContent]="nzNotFoundContent" [itemUnit]="nzItemUnit || locale?.itemUnit" [itemsUnit]="nzItemsUnit || locale?.itemsUnit" [footer]="nzFooter" (handleSelect)="handleRightSelect($event)" (handleSelectAll)="handleRightSelectAll($event)" ></nz-transfer-list> `, isInline: true, dependencies: [{ kind: "component", type: NzTransferListComponent, selector: "nz-transfer-list", inputs: ["direction", "titleText", "showSelectAll", "dataSource", "itemUnit", "itemsUnit", "filter", "disabled", "showSearch", "searchPlaceholder", "notFoundContent", "filterOption", "renderList", "render", "footer"], outputs: ["handleSelectAll", "handleSelect", "filterChange"], exportAs: ["nzTransferList"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i4.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzButtonModule }, { kind: "component", type: i5.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { kind: "directive", type: i6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i7.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: NzTransferComponent, decorators: [{ type: Component, args: [{ selector: 'nz-transfer', exportAs: 'nzTransfer', preserveWhitespaces: false, template: ` <nz-transfer-list class="ant-transfer-list" [ngStyle]="nzListStyle" data-direction="left" direction="left" [titleText]="nzTitles[0]" [showSelectAll]="nzShowSelectAll" [dataSource]="leftDataSource" [filter]="leftFilter" [filterOption]="nzFilterOption" (filterChange)="handleFilterChange($event)" [renderList]="nzRenderList && nzRenderList[0]" [render]="nzRender" [disabled]="nzDisabled" [showSearch]="nzShowSearch" [searchPlaceholder]="nzSearchPlaceholder || locale?.searchPlaceholder" [notFoundContent]="nzNotFoundContent" [itemUnit]="nzItemUnit || locale?.itemUnit" [itemsUnit]="nzItemsUnit || locale?.itemsUnit" [footer]="nzFooter" (handleSelect)="handleLeftSelect($event)" (handleSelectAll)="handleLeftSelectAll($event)" ></nz-transfer-list> <div *ngIf="dir !== 'rtl'" class="ant-transfer-operation"> <button nz-button type="button" (click)="moveToLeft()" [disabled]="nzDisabled || !leftActive" [nzType]="'primary'" [nzSize]="'small'" > <span nz-icon nzType="left"></span> <span *ngIf="nzOperations[1]">{{ nzOperations[1] }}</span> </button> <button nz-button type="button" (click)="moveToRight()" [disabled]="nzDisabled || !rightActive" [nzType]="'primary'" [nzSize]="'small'" > <span nz-icon nzType="right"></span> <span *ngIf="nzOperations[0]">{{ nzOperations[0] }}</span> </button> </div> <div *ngIf="dir === 'rtl'" class="ant-transfer-operation"> <button nz-button type="button" (click)="moveToRight()" [disabled]="nzDisabled || !rightActive" [nzType]="'primary'" [nzSize]="'small'" > <span nz-icon nzType="left"></span> <span *ngIf="nzOperations[0]">{{ nzOperations[0] }}</span> </button> <button nz-button type="button" (click)="moveToLeft()" [disabled]="nzDisabled || !leftActive" [nzType]="'primary'" [nzSize]="'small'" > <span nz-icon nzType="right"></span> <span *ngIf="nzOperations[1]">{{ nzOperations[1] }}</span> </button> </div> <nz-transfer-list class="ant-transfer-list" [ngStyle]="nzListStyle" data-direction="right" direction="right" [titleText]="nzTitles[1]" [showSelectAll]="nzShowSelectAll" [dataSource]="rightDataSource" [filter]="rightFilter" [filterOption]="nzFilterOption" (filterChange)="handleFilterChange($event)" [renderList]="nzRenderList && nzRenderList[1]" [render]="nzRender" [disabled]="nzDisabled" [showSearch]="nzShowSearch" [searchPlaceholder]="nzSearchPlaceholder || locale?.searchPlaceholder" [notFoundContent]="nzNotFoundContent" [itemUnit]="nzItemUnit || locale?.itemUnit" [itemsUnit]="nzItemsUnit || locale?.itemsUnit" [footer]="nzFooter" (handleSelect)="handleRightSelect($event)" (handleSelectAll)="handleRightSelectAll($event)" ></nz-transfer-list> `, host: { class: 'ant-transfer', '[class.ant-transfer-rtl]': `dir === 'rtl'`, '[class.ant-transfer-disabled]': `nzDisabled`, '[class.ant-transfer-customize-list]': `nzRenderList` }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NzTransferListComponent, NgStyle, NzIconModule, NzButtonModule, NgIf], standalone: true }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.NzI18nService }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i2.Directionality, decorators: [{ type: Optional }] }, { type: i3.NzFormStatusService, decorators: [{ type: Optional }] }, { type: i3.NzFormNoStatusService, decorators: [{ type: Optional }] }], propDecorators: { lists: [{ type: ViewChildren, args: [NzTransferListComponent] }], nzDisabled: [{ type: Input, args: [{ transform: booleanAttribute }] }], nzDataSource: [{ type: Input }], nzTitles: [{ type: Input }], nzOperations: [{ type: Input }], nzListStyle: [{ type: Input }], nzShowSelectAll: [{ type: Input, args: [{ transform: booleanAttribute }] }], nzItemUnit: [{ type: Input }], nzItemsUnit: [{ type: Input }], nzCanMove: [{ type: Input }], nzRenderList: [{ type: Input }], nzRender: [{ type: Input }], nzFooter: [{ type: Input }], nzShowSearch: [{ type: Input, args: [{ transform: booleanAttribute }] }], nzFilterOption: [{ type: Input }], nzSearchPlaceholder: [{ type: Input }], nzNotFoundContent: [{ type: Input }], nzTargetKeys: [{ type: Input }], nzSelectedKeys: [{ type: Input }], nzStatus: [{ type: Input }], nzChange: [{ type: Output }], nzSearchChange: [{ type: Output }], nzSelectChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy90cmFuc2Zlci90cmFuc2Zlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBS04sWUFBWSxFQUNaLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLE9BQU8sRUFBRSxFQUFFLElBQUksWUFBWSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVVsRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7O0FBaUhwRSxNQUFNLE9BQU8sbUJBQW1CO0lBb0R0QixlQUFlO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pDLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxDQUFDLFNBQVMsR0FB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V0FBVztzQkFBbkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNrQyxZQUFZO3NCQUFuRCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUM3QixjQUFjO3NCQUF0QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR2EsUUFBUTtzQkFBMUIsTUFBTTtnQkFDWSxjQUFjO3NCQUFoQyxNQUFNO2dCQUNZLGNBQWM7c0JBQWhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3Rpb24sIERpcmVjdGlvbmFsaXR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xuaW1wb3J0IHsgTmdJZiwgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBib29sZWFuQXR0cmlidXRlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YgYXMgb2JzZXJ2YWJsZU9mLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgdGFrZVVudGlsLCB3aXRoTGF0ZXN0RnJvbSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTnpCdXR0b25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2J1dHRvbic7XG5pbXBvcnQgeyBOekZvcm1Ob1N0YXR1c1NlcnZpY2UsIE56Rm9ybVN0YXR1c1NlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvZm9ybSc7XG5pbXBvcnQgeyBOZ0NsYXNzSW50ZXJmYWNlLCBOZ1N0eWxlSW50ZXJmYWNlLCBOelNhZmVBbnksIE56U3RhdHVzLCBOelZhbGlkYXRlU3RhdHVzIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IGdldFN0YXR1c0NsYXNzTmFtZXMsIHRvQXJyYXkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdXRpbCc7XG5pbXBvcnQgeyBOekkxOG5TZXJ2aWNlLCBOelRyYW5zZmVySTE4bkludGVyZmFjZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaTE4bic7XG5pbXBvcnQgeyBOekljb25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2ljb24nO1xuXG5pbXBvcnQge1xuICBUcmFuc2ZlckNhbk1vdmUsXG4gIFRyYW5zZmVyQ2hhbmdlLFxuICBUcmFuc2ZlckRpcmVjdGlvbixcbiAgVHJhbnNmZXJJdGVtLFxuICBUcmFuc2ZlclNlYXJjaENoYW5nZSxcbiAgVHJhbnNmZXJTZWxlY3RDaGFuZ2Vcbn0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTnpUcmFuc2Zlckxpc3RDb21wb25lbnQgfSBmcm9tICcuL3RyYW5zZmVyLWxpc3QuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotdHJhbnNmZXInLFxuICBleHBvcnRBczogJ256VHJhbnNmZXInLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bnotdHJhbnNmZXItbGlzdFxuICAgICAgY2xhc3M9XCJhbnQtdHJhbnNmZXItbGlzdFwiXG4gICAgICBbbmdTdHlsZV09XCJuekxpc3RTdHlsZVwiXG4gICAgICBkYXRhLWRpcmVjdGlvbj1cImxlZnRcIlxuICAgICAgZGlyZWN0aW9uPVwibGVmdFwiXG4gICAgICBbdGl0bGVUZXh0XT1cIm56VGl0bGVzWzBdXCJcbiAgICAgIFtzaG93U2VsZWN0QWxsXT1cIm56U2hvd1NlbGVjdEFsbFwiXG4gICAgICBbZGF0YVNvdXJjZV09XCJsZWZ0RGF0YVNvdXJjZVwiXG4gICAgICBbZmlsdGVyXT1cImxlZnRGaWx0ZXJcIlxuICAgICAgW2ZpbHRlck9wdGlvbl09XCJuekZpbHRlck9wdGlvblwiXG4gICAgICAoZmlsdGVyQ2hhbmdlKT1cImhhbmRsZUZpbHRlckNoYW5nZSgkZXZlbnQpXCJcbiAgICAgIFtyZW5kZXJMaXN0XT1cIm56UmVuZGVyTGlzdCAmJiBuelJlbmRlckxpc3RbMF1cIlxuICAgICAgW3JlbmRlcl09XCJuelJlbmRlclwiXG4gICAgICBbZGlzYWJsZWRdPVwibnpEaXNhYmxlZFwiXG4gICAgICBbc2hvd1NlYXJjaF09XCJuelNob3dTZWFyY2hcIlxuICAgICAgW3NlYXJjaFBsYWNlaG9sZGVyXT1cIm56U2VhcmNoUGxhY2Vob2xkZXIgfHwgbG9jYWxlPy5zZWFyY2hQbGFjZWhvbGRlclwiXG4gICAgICBbbm90Rm91bmRDb250ZW50XT1cIm56Tm90Rm91bmRDb250ZW50XCJcbiAgICAgIFtpdGVtVW5pdF09XCJuekl0ZW1Vbml0IHx8IGxvY2FsZT8uaXRlbVVuaXRcIlxuICAgICAgW2l0ZW1zVW5pdF09XCJuekl0ZW1zVW5pdCB8fCBsb2NhbGU/Lml0ZW1zVW5pdFwiXG4gICAgICBbZm9vdGVyXT1cIm56Rm9vdGVyXCJcbiAgICAgIChoYW5kbGVTZWxlY3QpPVwiaGFuZGxlTGVmdFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgIChoYW5kbGVTZWxlY3RBbGwpPVwiaGFuZGxlTGVmdFNlbGVjdEFsbCgkZXZlbnQpXCJcbiAgICA+PC9uei10cmFuc2Zlci1saXN0PlxuICAgIDxkaXYgKm5nSWY9XCJkaXIgIT09ICdydGwnXCIgY2xhc3M9XCJhbnQtdHJhbnNmZXItb3BlcmF0aW9uXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG56LWJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cIm1vdmVUb0xlZnQoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJuekRpc2FibGVkIHx8ICFsZWZ0QWN0aXZlXCJcbiAgICAgICAgW256VHlwZV09XCIncHJpbWFyeSdcIlxuICAgICAgICBbbnpTaXplXT1cIidzbWFsbCdcIlxuICAgICAgPlxuICAgICAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cImxlZnRcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwibnpPcGVyYXRpb25zWzFdXCI+e3sgbnpPcGVyYXRpb25zWzFdIH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG56LWJ1dHRvblxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cIm1vdmVUb1JpZ2h0KClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibnpEaXNhYmxlZCB8fCAhcmlnaHRBY3RpdmVcIlxuICAgICAgICBbbnpUeXBlXT1cIidwcmltYXJ5J1wiXG4gICAgICAgIFtuelNpemVdPVwiJ3NtYWxsJ1wiXG4gICAgICA+XG4gICAgICAgIDxzcGFuIG56LWljb24gbnpUeXBlPVwicmlnaHRcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwibnpPcGVyYXRpb25zWzBdXCI+e3sgbnpPcGVyYXRpb25zWzBdIH19PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cImRpciA9PT0gJ3J0bCdcIiBjbGFzcz1cImFudC10cmFuc2Zlci1vcGVyYXRpb25cIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgbnotYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwibW92ZVRvUmlnaHQoKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJuekRpc2FibGVkIHx8ICFyaWdodEFjdGl2ZVwiXG4gICAgICAgIFtuelR5cGVdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgW256U2l6ZV09XCInc21hbGwnXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gbnotaWNvbiBuelR5cGU9XCJsZWZ0XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIm56T3BlcmF0aW9uc1swXVwiPnt7IG56T3BlcmF0aW9uc1swXSB9fTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBuei1idXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJtb3ZlVG9MZWZ0KClcIlxuICAgICAgICBbZGlzYWJsZWRdPVwibnpEaXNhYmxlZCB8fCAhbGVmdEFjdGl2ZVwiXG4gICAgICAgIFtuelR5cGVdPVwiJ3ByaW1hcnknXCJcbiAgICAgICAgW256U2l6ZV09XCInc21hbGwnXCJcbiAgICAgID5cbiAgICAgICAgPHNwYW4gbnotaWNvbiBuelR5cGU9XCJyaWdodFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJuek9wZXJhdGlvbnNbMV1cIj57eyBuek9wZXJhdGlvbnNbMV0gfX08L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8bnotdHJhbnNmZXItbGlzdFxuICAgICAgY2xhc3M9XCJhbnQtdHJhbnNmZXItbGlzdFwiXG4gICAgICBbbmdTdHlsZV09XCJuekxpc3RTdHlsZVwiXG4gICAgICBkYXRhLWRpcmVjdGlvbj1cInJpZ2h0XCJcbiAgICAgIGRpcmVjdGlvbj1cInJpZ2h0XCJcbiAgICAgIFt0aXRsZVRleHRdPVwibnpUaXRsZXNbMV1cIlxuICAgICAgW3Nob3dTZWxlY3RBbGxdPVwibnpTaG93U2VsZWN0QWxsXCJcbiAgICAgIFtkYXRhU291cmNlXT1cInJpZ2h0RGF0YVNvdXJjZVwiXG4gICAgICBbZmlsdGVyXT1cInJpZ2h0RmlsdGVyXCJcbiAgICAgIFtmaWx0ZXJPcHRpb25dPVwibnpGaWx0ZXJPcHRpb25cIlxuICAgICAgKGZpbHRlckNoYW5nZSk9XCJoYW5kbGVGaWx0ZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICBbcmVuZGVyTGlzdF09XCJuelJlbmRlckxpc3QgJiYgbnpSZW5kZXJMaXN0WzFdXCJcbiAgICAgIFtyZW5kZXJdPVwibnpSZW5kZXJcIlxuICAgICAgW2Rpc2FibGVkXT1cIm56RGlzYWJsZWRcIlxuICAgICAgW3Nob3dTZWFyY2hdPVwibnpTaG93U2VhcmNoXCJcbiAgICAgIFtzZWFyY2hQbGFjZWhvbGRlcl09XCJuelNlYXJjaFBsYWNlaG9sZGVyIHx8IGxvY2FsZT8uc2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgW25vdEZvdW5kQ29udGVudF09XCJuek5vdEZvdW5kQ29udGVudFwiXG4gICAgICBbaXRlbVVuaXRdPVwibnpJdGVtVW5pdCB8fCBsb2NhbGU/Lml0ZW1Vbml0XCJcbiAgICAgIFtpdGVtc1VuaXRdPVwibnpJdGVtc1VuaXQgfHwgbG9jYWxlPy5pdGVtc1VuaXRcIlxuICAgICAgW2Zvb3Rlcl09XCJuekZvb3RlclwiXG4gICAgICAoaGFuZGxlU2VsZWN0KT1cImhhbmRsZVJpZ2h0U2VsZWN0KCRldmVudClcIlxuICAgICAgKGhhbmRsZVNlbGVjdEFsbCk9XCJoYW5kbGVSaWdodFNlbGVjdEFsbCgkZXZlbnQpXCJcbiAgICA+PC9uei10cmFuc2Zlci1saXN0PlxuICBgLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdhbnQtdHJhbnNmZXInLFxuICAgICdbY2xhc3MuYW50LXRyYW5zZmVyLXJ0bF0nOiBgZGlyID09PSAncnRsJ2AsXG4gICAgJ1tjbGFzcy5hbnQtdHJhbnNmZXItZGlzYWJsZWRdJzogYG56RGlzYWJsZWRgLFxuICAgICdbY2xhc3MuYW50LXRyYW5zZmVyLWN1c3RvbWl6ZS1saXN0XSc6IGBuelJlbmRlckxpc3RgXG4gIH0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbTnpUcmFuc2Zlckxpc3RDb21wb25lbnQsIE5nU3R5bGUsIE56SWNvbk1vZHVsZSwgTnpCdXR0b25Nb2R1bGUsIE5nSWZdLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIE56VHJhbnNmZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBWaWV3Q2hpbGRyZW4oTnpUcmFuc2Zlckxpc3RDb21wb25lbnQpIGxpc3RzITogUXVlcnlMaXN0PE56VHJhbnNmZXJMaXN0Q29tcG9uZW50PjtcbiAgbG9jYWxlITogTnpUcmFuc2ZlckkxOG5JbnRlcmZhY2U7XG5cbiAgbGVmdEZpbHRlciA9ICcnO1xuICByaWdodEZpbHRlciA9ICcnO1xuICBkaXI6IERpcmVjdGlvbiA9ICdsdHInO1xuXG4gIC8vIHN0YXR1c1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbnQtdHJhbnNmZXInO1xuICBzdGF0dXNDbHM6IE5nQ2xhc3NJbnRlcmZhY2UgPSB7fTtcbiAgaGFzRmVlZGJhY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyAjcmVnaW9uIGZpZWxkc1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBuekRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIG56RGF0YVNvdXJjZTogVHJhbnNmZXJJdGVtW10gPSBbXTtcbiAgQElucHV0KCkgbnpUaXRsZXM6IHN0cmluZ1tdID0gWycnLCAnJ107XG4gIEBJbnB1dCgpIG56T3BlcmF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgbnpMaXN0U3R5bGU6IE5nU3R5bGVJbnRlcmZhY2UgPSB7fTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56U2hvd1NlbGVjdEFsbCA9IHRydWU7XG4gIEBJbnB1dCgpIG56SXRlbVVuaXQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG56SXRlbXNVbml0Pzogc3RyaW5nO1xuICBASW5wdXQoKSBuekNhbk1vdmU6IChhcmc6IFRyYW5zZmVyQ2FuTW92ZSkgPT4gT2JzZXJ2YWJsZTxUcmFuc2Zlckl0ZW1bXT4gPSAoYXJnOiBUcmFuc2ZlckNhbk1vdmUpID0+IG9mKGFyZy5saXN0KTtcbiAgQElucHV0KCkgbnpSZW5kZXJMaXN0OiBBcnJheTxUZW1wbGF0ZVJlZjxOelNhZmVBbnk+IHwgbnVsbD4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpSZW5kZXI6IFRlbXBsYXRlUmVmPE56U2FmZUFueT4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpGb290ZXI6IFRlbXBsYXRlUmVmPE56U2FmZUFueT4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56U2hvd1NlYXJjaCA9IGZhbHNlO1xuICBASW5wdXQoKSBuekZpbHRlck9wdGlvbj86IChpbnB1dFZhbHVlOiBzdHJpbmcsIGl0ZW06IFRyYW5zZmVySXRlbSkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgbnpTZWFyY2hQbGFjZWhvbGRlcj86IHN0cmluZztcbiAgQElucHV0KCkgbnpOb3RGb3VuZENvbnRlbnQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG56VGFyZ2V0S2V5czogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgbnpTZWxlY3RlZEtleXM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIG56U3RhdHVzOiBOelN0YXR1cyA9ICcnO1xuXG4gIC8vIGV2ZW50c1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRyYW5zZmVyQ2hhbmdlPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpTZWFyY2hDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRyYW5zZmVyU2VhcmNoQ2hhbmdlPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpTZWxlY3RDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRyYW5zZmVyU2VsZWN0Q2hhbmdlPigpO1xuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIHByb2Nlc3MgZGF0YVxuXG4gIC8vIGxlZnRcbiAgbGVmdERhdGFTb3VyY2U6IFRyYW5zZmVySXRlbVtdID0gW107XG5cbiAgLy8gcmlnaHRcbiAgcmlnaHREYXRhU291cmNlOiBUcmFuc2Zlckl0ZW1bXSA9IFtdO1xuXG4gIHByaXZhdGUgc3BsaXREYXRhU291cmNlKCk6IHZvaWQge1xuICAgIHRoaXMubGVmdERhdGFTb3VyY2UgPSBbXTtcbiAgICB0aGlzLnJpZ2h0RGF0YVNvdXJjZSA9IFtdO1xuICAgIHRoaXMubnpEYXRhU291cmNlLmZvckVhY2gocmVjb3JkID0+IHtcbiAgICAgIGlmIChyZWNvcmQuZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgIHJlY29yZC5kaXJlY3Rpb24gPSAncmlnaHQnO1xuICAgICAgICB0aGlzLnJpZ2h0RGF0YVNvdXJjZS5wdXNoKHJlY29yZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWNvcmQuZGlyZWN0aW9uID0gJ2xlZnQnO1xuICAgICAgICB0aGlzLmxlZnREYXRhU291cmNlLnB1c2gocmVjb3JkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2hlY2tlZERhdGEoZGlyZWN0aW9uOiBUcmFuc2ZlckRpcmVjdGlvbik6IFRyYW5zZmVySXRlbVtdIHtcbiAgICByZXR1cm4gdGhpc1tkaXJlY3Rpb24gPT09ICdsZWZ0JyA/ICdsZWZ0RGF0YVNvdXJjZScgOiAncmlnaHREYXRhU291cmNlJ10uZmlsdGVyKHcgPT4gdy5jaGVja2VkKTtcbiAgfVxuXG4gIGhhbmRsZUxlZnRTZWxlY3RBbGwgPSAoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQgPT4gdGhpcy5oYW5kbGVTZWxlY3QoJ2xlZnQnLCBjaGVja2VkKTtcbiAgaGFuZGxlUmlnaHRTZWxlY3RBbGwgPSAoY2hlY2tlZDogYm9vbGVhbik6IHZvaWQgPT4gdGhpcy5oYW5kbGVTZWxlY3QoJ3JpZ2h0JywgY2hlY2tlZCk7XG5cbiAgaGFuZGxlTGVmdFNlbGVjdCA9IChpdGVtOiBUcmFuc2Zlckl0ZW0pOiB2b2lkID0+IHRoaXMuaGFuZGxlU2VsZWN0KCdsZWZ0JywgISFpdGVtLmNoZWNrZWQsIGl0ZW0pO1xuICBoYW5kbGVSaWdodFNlbGVjdCA9IChpdGVtOiBUcmFuc2Zlckl0ZW0pOiB2b2lkID0+IHRoaXMuaGFuZGxlU2VsZWN0KCdyaWdodCcsICEhaXRlbS5jaGVja2VkLCBpdGVtKTtcblxuICBoYW5kbGVTZWxlY3QoZGlyZWN0aW9uOiBUcmFuc2ZlckRpcmVjdGlvbiwgY2hlY2tlZDogYm9vbGVhbiwgaXRlbT86IFRyYW5zZmVySXRlbSk6IHZvaWQge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLmdldENoZWNrZWREYXRhKGRpcmVjdGlvbik7XG4gICAgdGhpcy51cGRhdGVPcGVyYXRpb25TdGF0dXMoZGlyZWN0aW9uLCBsaXN0Lmxlbmd0aCk7XG4gICAgdGhpcy5uelNlbGVjdENoYW5nZS5lbWl0KHsgZGlyZWN0aW9uLCBjaGVja2VkLCBsaXN0LCBpdGVtIH0pO1xuICB9XG5cbiAgaGFuZGxlRmlsdGVyQ2hhbmdlKHJldDogeyBkaXJlY3Rpb246IFRyYW5zZmVyRGlyZWN0aW9uOyB2YWx1ZTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLm56U2VhcmNoQ2hhbmdlLmVtaXQocmV0KTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIG9wZXJhdGlvblxuXG4gIGxlZnRBY3RpdmUgPSBmYWxzZTtcbiAgcmlnaHRBY3RpdmUgPSBmYWxzZTtcblxuICBwcml2YXRlIHVwZGF0ZU9wZXJhdGlvblN0YXR1cyhkaXJlY3Rpb246IFRyYW5zZmVyRGlyZWN0aW9uLCBjb3VudD86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXNbZGlyZWN0aW9uID09PSAncmlnaHQnID8gJ2xlZnRBY3RpdmUnIDogJ3JpZ2h0QWN0aXZlJ10gPVxuICAgICAgKHR5cGVvZiBjb3VudCA9PT0gJ3VuZGVmaW5lZCcgPyB0aGlzLmdldENoZWNrZWREYXRhKGRpcmVjdGlvbikuZmlsdGVyKHcgPT4gIXcuZGlzYWJsZWQpLmxlbmd0aCA6IGNvdW50KSA+IDA7XG4gIH1cblxuICBtb3ZlVG9MZWZ0ID0gKCk6IHZvaWQgPT4gdGhpcy5tb3ZlVG8oJ2xlZnQnKTtcbiAgbW92ZVRvUmlnaHQgPSAoKTogdm9pZCA9PiB0aGlzLm1vdmVUbygncmlnaHQnKTtcblxuICBtb3ZlVG8oZGlyZWN0aW9uOiBUcmFuc2ZlckRpcmVjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IG9wcG9zaXRlRGlyZWN0aW9uID0gZGlyZWN0aW9uID09PSAnbGVmdCcgPyAncmlnaHQnIDogJ2xlZnQnO1xuICAgIHRoaXMudXBkYXRlT3BlcmF0aW9uU3RhdHVzKG9wcG9zaXRlRGlyZWN0aW9uLCAwKTtcbiAgICBjb25zdCBkYXRhc291cmNlID0gZGlyZWN0aW9uID09PSAnbGVmdCcgPyB0aGlzLnJpZ2h0RGF0YVNvdXJjZSA6IHRoaXMubGVmdERhdGFTb3VyY2U7XG4gICAgY29uc3QgbW92ZUxpc3QgPSBkYXRhc291cmNlLmZpbHRlcihpdGVtID0+IGl0ZW0uY2hlY2tlZCA9PT0gdHJ1ZSAmJiAhaXRlbS5kaXNhYmxlZCk7XG4gICAgdGhpcy5uekNhbk1vdmUoeyBkaXJlY3Rpb24sIGxpc3Q6IG1vdmVMaXN0IH0pLnN1YnNjcmliZShcbiAgICAgIG5ld01vdmVMaXN0ID0+XG4gICAgICAgIHRoaXMudHJ1dGhNb3ZlVG8oXG4gICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgIG5ld01vdmVMaXN0LmZpbHRlcihpID0+ICEhaSlcbiAgICAgICAgKSxcbiAgICAgICgpID0+IG1vdmVMaXN0LmZvckVhY2goaSA9PiAoaS5jaGVja2VkID0gZmFsc2UpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHRydXRoTW92ZVRvKGRpcmVjdGlvbjogVHJhbnNmZXJEaXJlY3Rpb24sIGxpc3Q6IFRyYW5zZmVySXRlbVtdKTogdm9pZCB7XG4gICAgY29uc3Qgb3Bwb3NpdGVEaXJlY3Rpb24gPSBkaXJlY3Rpb24gPT09ICdsZWZ0JyA/ICdyaWdodCcgOiAnbGVmdCc7XG4gICAgY29uc3QgZGF0YXNvdXJjZSA9IGRpcmVjdGlvbiA9PT0gJ2xlZnQnID8gdGhpcy5yaWdodERhdGFTb3VyY2UgOiB0aGlzLmxlZnREYXRhU291cmNlO1xuICAgIGNvbnN0IHRhcmdldERhdGFzb3VyY2UgPSBkaXJlY3Rpb24gPT09ICdsZWZ0JyA/IHRoaXMubGVmdERhdGFTb3VyY2UgOiB0aGlzLnJpZ2h0RGF0YVNvdXJjZTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdCkge1xuICAgICAgaXRlbS5jaGVja2VkID0gZmFsc2U7XG4gICAgICBpdGVtLmhpZGUgPSBmYWxzZTtcbiAgICAgIGl0ZW0uZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgZGF0YXNvdXJjZS5zcGxpY2UoZGF0YXNvdXJjZS5pbmRleE9mKGl0ZW0pLCAxKTtcbiAgICB9XG4gICAgdGFyZ2V0RGF0YXNvdXJjZS5zcGxpY2UoMCwgMCwgLi4ubGlzdCk7XG4gICAgdGhpcy51cGRhdGVPcGVyYXRpb25TdGF0dXMob3Bwb3NpdGVEaXJlY3Rpb24pO1xuICAgIHRoaXMubnpDaGFuZ2UuZW1pdCh7XG4gICAgICBmcm9tOiBvcHBvc2l0ZURpcmVjdGlvbixcbiAgICAgIHRvOiBkaXJlY3Rpb24sXG4gICAgICBsaXN0XG4gICAgfSk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2tBbGxMaXN0KCk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgaTE4bjogTnpJMThuU2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRpcmVjdGlvbmFsaXR5OiBEaXJlY3Rpb25hbGl0eSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIG56Rm9ybVN0YXR1c1NlcnZpY2U/OiBOekZvcm1TdGF0dXNTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbnpGb3JtTm9TdGF0dXNTZXJ2aWNlPzogTnpGb3JtTm9T