UNPKG

ng-zorro-antd

Version:

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

330 lines 35.9 kB
/** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { NgTemplateOutlet } from '@angular/common'; import { booleanAttribute, ChangeDetectionStrategy, Component, forwardRef, inject, Input, ViewEncapsulation } from '@angular/core'; import { NG_ASYNC_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; import { of } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { parseExpression } from 'cron-parser'; import { NzDestroyService } from 'ng-zorro-antd/core/services'; import { NzCronExpressionInputComponent } from './cron-expression-input.component'; import { NzCronExpressionLabelComponent } from './cron-expression-label.component'; import { NzCronExpressionPreviewComponent } from './cron-expression-preview.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "ng-zorro-antd/i18n"; function labelsOfType(type) { if (type === 'spring') { return ['second', 'minute', 'hour', 'day', 'month', 'week']; } return ['minute', 'hour', 'day', 'month', 'week']; } export class NzCronExpressionComponent { convertFormat(value) { const values = value.split(' '); const valueObject = this.labels.reduce((obj, label, idx) => { obj[label] = values[idx]; return obj; }, {}); this.validateForm.patchValue(valueObject); } writeValue(value) { if (value) { this.convertFormat(value); } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouch = fn; } validate() { if (this.validateForm.valid) { return of(null); } else { return of({ error: true }); } } setDisabledState(isDisabled) { this.nzDisabled = (this.isNzDisableFirstChange && this.nzDisabled) || isDisabled; this.isNzDisableFirstChange = false; this.cdr.markForCheck(); } constructor(formBuilder, cdr, i18n) { this.formBuilder = formBuilder; this.cdr = cdr; this.i18n = i18n; this.nzSize = 'default'; this.nzType = 'linux'; this.nzCollapseDisable = false; this.nzExtra = null; this.nzSemantic = null; this.nzBorderless = false; this.nzDisabled = false; this.focus = false; this.labelFocus = null; this.labels = labelsOfType(this.nzType); this.nextTimeList = []; this.isNzDisableFirstChange = true; this.destroy$ = inject(NzDestroyService); this.onChange = () => { }; this.onTouch = () => null; this.checkValid = (control) => { if (control.value) { try { const cron = []; this.labels.forEach(label => { cron.push(control.value[label]); }); parseExpression(cron.join(' ')); } catch (err) { return { error: true }; } } return null; }; this.validateForm = this.formBuilder.nonNullable.group({ second: ['0', Validators.required], minute: ['*', Validators.required], hour: ['*', Validators.required], day: ['*', Validators.required], month: ['*', Validators.required], week: ['*', Validators.required] }, { validators: this.checkValid }); } ngOnInit() { this.i18n.localeChange.pipe(takeUntil(this.destroy$)).subscribe(() => { this.locale = this.i18n.getLocaleData('CronExpression'); this.cdr.markForCheck(); }); this.cronFormType(); this.previewDate(this.validateForm.value); this.validateForm.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => { this.onChange(Object.values(value).join(' ')); this.previewDate(value); this.cdr.markForCheck(); }); } ngOnChanges(changes) { const { nzType } = changes; if (nzType) { this.labels = labelsOfType(this.nzType); this.cronFormType(); } } cronFormType() { if (this.nzType === 'spring') { this.validateForm.controls.second.enable(); } else { this.validateForm.controls.second.disable(); } } previewDate(value) { try { this.interval = parseExpression(Object.values(value).join(' ')); this.nextTimeList = [ this.interval.next().toDate(), this.interval.next().toDate(), this.interval.next().toDate(), this.interval.next().toDate(), this.interval.next().toDate() ]; } catch (err) { return; } } loadMorePreview() { this.nextTimeList = [ ...this.nextTimeList, this.interval.next().toDate(), this.interval.next().toDate(), this.interval.next().toDate(), this.interval.next().toDate(), this.interval.next().toDate() ]; this.cdr.markForCheck(); } focusEffect(value) { this.focus = true; this.labelFocus = value; this.cdr.markForCheck(); } blurEffect() { this.focus = false; this.labelFocus = null; this.cdr.markForCheck(); } getValue(item) { this.validateForm.controls[item.label].patchValue(item.value); this.cdr.markForCheck(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzCronExpressionComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: i2.NzI18nService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.2", type: NzCronExpressionComponent, isStandalone: true, selector: "nz-cron-expression", inputs: { nzSize: "nzSize", nzType: "nzType", nzCollapseDisable: ["nzCollapseDisable", "nzCollapseDisable", booleanAttribute], nzExtra: "nzExtra", nzSemantic: "nzSemantic", nzBorderless: ["nzBorderless", "nzBorderless", booleanAttribute], nzDisabled: ["nzDisabled", "nzDisabled", booleanAttribute] }, providers: [ { provide: NG_ASYNC_VALIDATORS, useExisting: forwardRef(() => NzCronExpressionComponent), multi: true }, { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NzCronExpressionComponent), multi: true }, NzDestroyService ], exportAs: ["nzCronExpression"], usesOnChanges: true, ngImport: i0, template: ` <div class="ant-cron-expression"> <div class="ant-cron-expression-content"> <div class="ant-input ant-cron-expression-input-group" [class.ant-input-lg]="nzSize === 'large'" [class.ant-input-sm]="nzSize === 'small'" [class.ant-input-borderless]="nzBorderless" [class.ant-cron-expression-input-group-focus]="focus && !nzBorderless" [class.ant-input-status-error]="!validateForm.valid && !nzBorderless" [class.ant-cron-expression-input-group-error-focus]="!validateForm.valid && focus && !nzBorderless" [class.ant-input-disabled]="nzDisabled" > @for (label of labels; track label) { <nz-cron-expression-input [value]="this.validateForm.controls[label].value" [label]="label" [disabled]="nzDisabled" (focusEffect)="focusEffect($event)" (blurEffect)="blurEffect()" (getValue)="getValue($event)" /> } </div> <div class="ant-cron-expression-label-group" [class.ant-input-lg]="nzSize === 'large'" [class.ant-cron-expression-label-group-default]="nzSize === 'default'" [class.ant-input-sm]="nzSize === 'small'" > @for (label of labels; track label) { <nz-cron-expression-label [type]="label" [labelFocus]="labelFocus" [locale]="locale" /> } </div> @if (!nzCollapseDisable) { <nz-cron-expression-preview [TimeList]="nextTimeList" [visible]="validateForm.valid" [locale]="locale" [nzSemantic]="nzSemantic" (loadMorePreview)="loadMorePreview()" /> } </div> @if (nzExtra) { <div class="ant-cron-expression-map"> <ng-template [ngTemplateOutlet]="nzExtra" /> </div> } </div> `, isInline: true, dependencies: [{ kind: "component", type: NzCronExpressionInputComponent, selector: "nz-cron-expression-input", inputs: ["value", "label", "disabled"], outputs: ["focusEffect", "blurEffect", "getValue"], exportAs: ["nzCronExpressionInput"] }, { kind: "component", type: NzCronExpressionLabelComponent, selector: "nz-cron-expression-label", inputs: ["type", "locale", "labelFocus"], exportAs: ["nzCronExpressionLabel"] }, { kind: "component", type: NzCronExpressionPreviewComponent, selector: "nz-cron-expression-preview", inputs: ["TimeList", "visible", "locale", "nzSemantic"], outputs: ["loadMorePreview"], exportAs: ["nzCronExpressionPreview"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzCronExpressionComponent, decorators: [{ type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, selector: 'nz-cron-expression', exportAs: 'nzCronExpression', template: ` <div class="ant-cron-expression"> <div class="ant-cron-expression-content"> <div class="ant-input ant-cron-expression-input-group" [class.ant-input-lg]="nzSize === 'large'" [class.ant-input-sm]="nzSize === 'small'" [class.ant-input-borderless]="nzBorderless" [class.ant-cron-expression-input-group-focus]="focus && !nzBorderless" [class.ant-input-status-error]="!validateForm.valid && !nzBorderless" [class.ant-cron-expression-input-group-error-focus]="!validateForm.valid && focus && !nzBorderless" [class.ant-input-disabled]="nzDisabled" > @for (label of labels; track label) { <nz-cron-expression-input [value]="this.validateForm.controls[label].value" [label]="label" [disabled]="nzDisabled" (focusEffect)="focusEffect($event)" (blurEffect)="blurEffect()" (getValue)="getValue($event)" /> } </div> <div class="ant-cron-expression-label-group" [class.ant-input-lg]="nzSize === 'large'" [class.ant-cron-expression-label-group-default]="nzSize === 'default'" [class.ant-input-sm]="nzSize === 'small'" > @for (label of labels; track label) { <nz-cron-expression-label [type]="label" [labelFocus]="labelFocus" [locale]="locale" /> } </div> @if (!nzCollapseDisable) { <nz-cron-expression-preview [TimeList]="nextTimeList" [visible]="validateForm.valid" [locale]="locale" [nzSemantic]="nzSemantic" (loadMorePreview)="loadMorePreview()" /> } </div> @if (nzExtra) { <div class="ant-cron-expression-map"> <ng-template [ngTemplateOutlet]="nzExtra" /> </div> } </div> `, providers: [ { provide: NG_ASYNC_VALIDATORS, useExisting: forwardRef(() => NzCronExpressionComponent), multi: true }, { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NzCronExpressionComponent), multi: true }, NzDestroyService ], imports: [ NzCronExpressionInputComponent, NzCronExpressionLabelComponent, NzCronExpressionPreviewComponent, NgTemplateOutlet ], standalone: true }] }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i2.NzI18nService }], propDecorators: { nzSize: [{ type: Input }], nzType: [{ type: Input }], nzCollapseDisable: [{ type: Input, args: [{ transform: booleanAttribute }] }], nzExtra: [{ type: Input }], nzSemantic: [{ type: Input }], nzBorderless: [{ type: Input, args: [{ transform: booleanAttribute }] }], nzDisabled: [{ type: Input, args: [{ transform: booleanAttribute }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvbi1leHByZXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvY3Jvbi1leHByZXNzaW9uL2Nyb24tZXhwcmVzc2lvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUtMLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBT0wsbUJBQW1CLEVBQ25CLGlCQUFpQixFQUdqQixVQUFVLEVBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQWtCLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUU5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUkvRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7OztBQUd2RixTQUFTLFlBQVksQ0FBQyxJQUEwQjtJQUM5QyxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN0QixPQUFPLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVB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ZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO29CQUNyQyxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0RUO29CQUNELFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsbUJBQW1COzRCQUM1QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsQ0FBQzs0QkFDeEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsMEJBQTBCLENBQUM7NEJBQ3hELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNELGdCQUFnQjtxQkFDakI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLDhCQUE4Qjt3QkFDOUIsOEJBQThCO3dCQUM5QixnQ0FBZ0M7d0JBQ2hDLGdCQUFnQjtxQkFDakI7b0JBQ0QsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzRJQUVVLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ2tDLGlCQUFpQjtzQkFBeEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFDN0IsT0FBTztzQkFBZixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ2tDLFlBQVk7c0JBQW5ELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ0UsVUFBVTtzQkFBakQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEFzeW5jVmFsaWRhdG9yLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIE5HX0FTWU5DX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3JGbixcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDcm9uRXhwcmVzc2lvbiwgcGFyc2VFeHByZXNzaW9uIH0gZnJvbSAnY3Jvbi1wYXJzZXInO1xuXG5pbXBvcnQgeyBOekRlc3Ryb3lTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3NlcnZpY2VzJztcbmltcG9ydCB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBOekNyb25FeHByZXNzaW9uSTE4bkludGVyZmFjZSwgTnpJMThuU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvaTE4bic7XG5cbmltcG9ydCB7IE56Q3JvbkV4cHJlc3Npb25JbnB1dENvbXBvbmVudCB9IGZyb20gJy4vY3Jvbi1leHByZXNzaW9uLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOekNyb25FeHByZXNzaW9uTGFiZWxDb21wb25lbnQgfSBmcm9tICcuL2Nyb24tZXhwcmVzc2lvbi1sYWJlbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTnpDcm9uRXhwcmVzc2lvblByZXZpZXdDb21wb25lbnQgfSBmcm9tICcuL2Nyb24tZXhwcmVzc2lvbi1wcmV2aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDcm9uLCBDcm9uQ2hhbmdlVHlwZSwgQ3JvblZhbHVlLCBOekNyb25FeHByZXNzaW9uU2l6ZSwgTnpDcm9uRXhwcmVzc2lvblR5cGUsIFRpbWVUeXBlIH0gZnJvbSAnLi90eXBpbmdzJztcblxuZnVuY3Rpb24gbGFiZWxzT2ZUeXBlKHR5cGU6IE56Q3JvbkV4cHJlc3Npb25UeXBlKTogVGltZVR5cGVbXSB7XG4gIGlmICh0eXBlID09PSAnc3ByaW5nJykge1xuICAgIHJldHVybiBbJ3NlY29uZCcsICdtaW51dGUnLCAnaG91cicsICdkYXknLCAnbW9udGgnLCAnd2VlayddO1xuICB9XG4gIHJldHVybiBbJ21pbnV0ZScsICdob3VyJywgJ2RheScsICdtb250aCcsICd3ZWVrJ107XG59XG5cbkBDb21wb25lbnQoe1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc2VsZWN0b3I6ICduei1jcm9uLWV4cHJlc3Npb24nLFxuICBleHBvcnRBczogJ256Q3JvbkV4cHJlc3Npb24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJhbnQtY3Jvbi1leHByZXNzaW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYW50LWNyb24tZXhwcmVzc2lvbi1jb250ZW50XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImFudC1pbnB1dCBhbnQtY3Jvbi1leHByZXNzaW9uLWlucHV0LWdyb3VwXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWlucHV0LWxnXT1cIm56U2l6ZSA9PT0gJ2xhcmdlJ1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1zbV09XCJuelNpemUgPT09ICdzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzcy5hbnQtaW5wdXQtYm9yZGVybGVzc109XCJuekJvcmRlcmxlc3NcIlxuICAgICAgICAgIFtjbGFzcy5hbnQtY3Jvbi1leHByZXNzaW9uLWlucHV0LWdyb3VwLWZvY3VzXT1cImZvY3VzICYmICFuekJvcmRlcmxlc3NcIlxuICAgICAgICAgIFtjbGFzcy5hbnQtaW5wdXQtc3RhdHVzLWVycm9yXT1cIiF2YWxpZGF0ZUZvcm0udmFsaWQgJiYgIW56Qm9yZGVybGVzc1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1jcm9uLWV4cHJlc3Npb24taW5wdXQtZ3JvdXAtZXJyb3ItZm9jdXNdPVwiIXZhbGlkYXRlRm9ybS52YWxpZCAmJiBmb2N1cyAmJiAhbnpCb3JkZXJsZXNzXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWlucHV0LWRpc2FibGVkXT1cIm56RGlzYWJsZWRcIlxuICAgICAgICA+XG4gICAgICAgICAgQGZvciAobGFiZWwgb2YgbGFiZWxzOyB0cmFjayBsYWJlbCkge1xuICAgICAgICAgICAgPG56LWNyb24tZXhwcmVzc2lvbi1pbnB1dFxuICAgICAgICAgICAgICBbdmFsdWVdPVwidGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHNbbGFiZWxdLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImxhYmVsXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm56RGlzYWJsZWRcIlxuICAgICAgICAgICAgICAoZm9jdXNFZmZlY3QpPVwiZm9jdXNFZmZlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChibHVyRWZmZWN0KT1cImJsdXJFZmZlY3QoKVwiXG4gICAgICAgICAgICAgIChnZXRWYWx1ZSk9XCJnZXRWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiYW50LWNyb24tZXhwcmVzc2lvbi1sYWJlbC1ncm91cFwiXG4gICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1sZ109XCJuelNpemUgPT09ICdsYXJnZSdcIlxuICAgICAgICAgIFtjbGFzcy5hbnQtY3Jvbi1leHByZXNzaW9uLWxhYmVsLWdyb3VwLWRlZmF1bHRdPVwibnpTaXplID09PSAnZGVmYXVsdCdcIlxuICAgICAgICAgIFtjbGFzcy5hbnQtaW5wdXQtc21dPVwibnpTaXplID09PSAnc21hbGwnXCJcbiAgICAgICAgPlxuICAgICAgICAgIEBmb3IgKGxhYmVsIG9mIGxhYmVsczsgdHJhY2sgbGFiZWwpIHtcbiAgICAgICAgICAgIDxuei1jcm9uLWV4cHJlc3Npb24tbGFiZWwgW3R5cGVdPVwibGFiZWxcIiBbbGFiZWxGb2N1c109XCJsYWJlbEZvY3VzXCIgW2xvY2FsZV09XCJsb2NhbGVcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoIW56Q29sbGFwc2VEaXNhYmxlKSB7XG4gICAgICAgICAgPG56LWNyb24tZXhwcmVzc2lvbi1wcmV2aWV3XG4gICAgICAgICAgICBbVGltZUxpc3RdPVwibmV4dFRpbWVMaXN0XCJcbiAgICAgICAgICAgIFt2aXNpYmxlXT1cInZhbGlkYXRlRm9ybS52YWxpZFwiXG4gICAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgICBbbnpTZW1hbnRpY109XCJuelNlbWFudGljXCJcbiAgICAgICAgICAgIChsb2FkTW9yZVByZXZpZXcpPVwibG9hZE1vcmVQcmV2aWV3KClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmIChuekV4dHJhKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtY3Jvbi1leHByZXNzaW9uLW1hcFwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJuekV4dHJhXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX0FTWU5DX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOekNyb25FeHByZXNzaW9uQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE56Q3JvbkV4cHJlc3Npb25Db21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIE56RGVzdHJveVNlcnZpY2VcbiAgXSxcbiAgaW1wb3J0czogW1xuICAgIE56Q3JvbkV4cHJlc3Npb25JbnB1dENvbXBvbmVudCxcbiAgICBOekNyb25FeHByZXNzaW9uTGFiZWxDb21wb25lbnQsXG4gICAgTnpDcm9uRXhwcmVzc2lvblByZXZpZXdDb21wb25lbnQsXG4gICAgTmdUZW1wbGF0ZU91dGxldFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIE56Q3JvbkV4cHJlc3Npb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFzeW5jVmFsaWRhdG9yIHtcbiAgQElucHV0KCkgbnpTaXplOiBOekNyb25FeHByZXNzaW9uU2l6ZSA9ICdkZWZhdWx0JztcbiAgQElucHV0KCkgbnpUeXBlOiBOekNyb25FeHByZXNzaW9uVHlwZSA9ICdsaW51eCc7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBuekNvbGxhcHNlRGlzYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBuekV4dHJhPzogVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpTZW1hbnRpYzogVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG56Qm9yZGVybGVzcyA9IGZhbHNlO1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbnpEaXNhYmxlZCA9IGZhbHNlO1xuXG4gIGxvY2FsZSE6IE56Q3JvbkV4cHJlc3Npb25JMThuSW50ZXJmYWNlO1xuICBmb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuICBsYWJlbEZvY3VzOiBUaW1lVHlwZSB8IG51bGwgPSBudWxsO1xuICBsYWJlbHM6IFRpbWVUeXBlW10gPSBsYWJlbHNPZlR5cGUodGhpcy5uelR5cGUpO1xuICBpbnRlcnZhbCE6IENyb25FeHByZXNzaW9uPGZhbHNlPjtcbiAgbmV4dFRpbWVMaXN0OiBEYXRlW10gPSBbXTtcbiAgcHJpdmF0ZSBpc056RGlzYWJsZUZpcnN0Q2hhbmdlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IGluamVjdChOekRlc3Ryb3lTZXJ2aWNlKTtcblxuICB2YWxpZGF0ZUZvcm06IEZvcm1Hcm91cDxSZWNvcmQ8VGltZVR5cGUsIEZvcm1Db250cm9sPENyb25WYWx1ZT4+PjtcblxuICBvbkNoYW5nZTogTnpTYWZlQW55ID0gKCkgPT4ge307XG4gIG9uVG91Y2g6ICgpID0+IHZvaWQgPSAoKSA9PiBudWxsO1xuXG4gIGNvbnZlcnRGb3JtYXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlLnNwbGl0KCcgJyk7XG4gICAgY29uc3QgdmFsdWVPYmplY3QgPSB0aGlzLmxhYmVscy5yZWR1Y2UoKG9iaiwgbGFiZWwsIGlkeCkgPT4ge1xuICAgICAgb2JqW2xhYmVsXSA9IHZhbHVlc1tpZHhdO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LCB7fSBhcyBDcm9uKTtcbiAgICB0aGlzLnZhbGlkYXRlRm9ybS5wYXRjaFZhbHVlKHZhbHVlT2JqZWN0KTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuY29udmVydEZvcm1hdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogTnpTYWZlQW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IE56U2FmZUFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICB9XG5cbiAgdmFsaWRhdGUoKTogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLnZhbGlkYXRlRm9ybS52YWxpZCkge1xuICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb2YoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm56RGlzYWJsZWQgPSAodGhpcy5pc056RGlzYWJsZUZpcnN0Q2hhbmdlICYmIHRoaXMubnpEaXNhYmxlZCkgfHwgaXNEaXNhYmxlZDtcbiAgICB0aGlzLmlzTnpEaXNhYmxlRmlyc3RDaGFuZ2UgPSBmYWxzZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGkxOG46IE56STE4blNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy52YWxpZGF0ZUZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLm5vbk51bGxhYmxlLmdyb3VwKFxuICAgICAge1xuICAgICAgICBzZWNvbmQ6IFsnMCcsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBtaW51dGU6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBob3VyOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgZGF5OiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgbW9udGg6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICB3ZWVrOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxuICAgICAgfSxcbiAgICAgIHsgdmFsaWRhdG9yczogdGhpcy5jaGVja1ZhbGlkIH1cbiAgICApO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pMThuLmxvY2FsZUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5pMThuLmdldExvY2FsZURhdGEoJ0Nyb25FeHByZXNzaW9uJyk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgICB0aGlzLmNyb25Gb3JtVHlwZSgpO1xuICAgIHRoaXMucHJldmlld0RhdGUodGhpcy52YWxpZGF0ZUZvcm0udmFsdWUpO1xuXG4gICAgdGhpcy52YWxpZGF0ZUZvcm0udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgdGhpcy5vbkNoYW5nZShPYmplY3QudmFsdWVzKHZhbHVlKS5qb2luKCcgJykpO1xuICAgICAgdGhpcy5wcmV2aWV3RGF0ZSh2YWx1ZSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG56VHlwZSB9ID0gY2hhbmdlcztcblxuICAgIGlmIChuelR5cGUpIHtcbiAgICAgIHRoaXMubGFiZWxzID0gbGFiZWxzT2ZUeXBlKHRoaXMubnpUeXBlKTtcbiAgICAgIHRoaXMuY3JvbkZvcm1UeXBlKCk7XG4gICAgfVxuICB9XG5cbiAgY3JvbkZvcm1UeXBlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm56VHlwZSA9PT0gJ3NwcmluZycpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzLnNlY29uZC5lbmFibGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHMuc2Vjb25kLmRpc2FibGUoKTtcbiAgICB9XG4gIH1cblxuICBwcmV2aWV3RGF0ZSh2YWx1ZTogQ3Jvbik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmludGVydmFsID0gcGFyc2VFeHByZXNzaW9uKE9iamVjdC52YWx1ZXModmFsdWUpLmpvaW4oJyAnKSk7XG4gICAgICB0aGlzLm5leHRUaW1lTGlzdCA9IFtcbiAgICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpXG4gICAgICBdO1xuICAgIH0gY2F0Y2ggKGVycjogTnpTYWZlQW55KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbG9hZE1vcmVQcmV2aWV3KCk6IHZvaWQge1xuICAgIHRoaXMubmV4dFRpbWVMaXN0ID0gW1xuICAgICAgLi4udGhpcy5uZXh0VGltZUxpc3QsXG4gICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpXG4gICAgXTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGZvY3VzRWZmZWN0KHZhbHVlOiBUaW1lVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXMgPSB0cnVlO1xuICAgIHRoaXMubGFiZWxGb2N1cyA9IHZhbHVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgYmx1ckVmZmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gICAgdGhpcy5sYWJlbEZvY3VzID0gbnVsbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldFZhbHVlKGl0ZW06IENyb25DaGFuZ2VUeXBlKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHNbaXRlbS5sYWJlbF0ucGF0Y2hWYWx1ZShpdGVtLnZhbHVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNoZWNrVmFsaWQ6IFZhbGlkYXRvckZuID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICBpZiAoY29udHJvbC52YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3Jvbjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdGhpcy5sYWJlbHMuZm9yRWFjaChsYWJlbCA9PiB7XG4gICAgICAgICAgY3Jvbi5wdXNoKGNvbnRyb2wudmFsdWVbbGFiZWxdKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBhcnNlRXhwcmVzc2lvbihjcm9uLmpvaW4oJyAnKSk7XG4gICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG59XG4iXX0=