ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
316 lines • 35 kB
JavaScript
import { __decorate } from "tslib";
/**
* 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 { ChangeDetectionStrategy, Component, forwardRef, Input, ViewEncapsulation } from '@angular/core';
import { NG_ASYNC_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
import { of, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { parseExpression } from 'cron-parser';
import { InputBoolean } from 'ng-zorro-antd/core/util';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "ng-zorro-antd/i18n";
import * as i3 from "@angular/common";
import * as i4 from "ng-zorro-antd/collapse";
import * as i5 from "./cron-expression-label.component";
import * as i6 from "./cron-expression-input.component";
export class NzCronExpressionComponent {
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.focus = false;
this.labelFocus = null;
this.validLabel = null;
this.labels = [];
this.nextTimeList = [];
this.dateTime = new Date();
this.destroy$ = new Subject();
this.onChange = () => { };
this.onTouch = () => null;
this.checkValid = (control) => {
if (control.value) {
try {
const cron = [];
this.labels.forEach(label => {
label === this.validLabel ? cron.push(control.value) : cron.push('*');
});
parseExpression(cron.join(' '));
}
catch (err) {
return of({ error: true });
}
}
return of(null);
};
}
convertFormat(value) {
const values = value.split(' ');
const valueObject = {};
this.labels.map((a, b) => {
valueObject[a] = values[b];
});
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 });
}
}
ngOnInit() {
if (this.nzType === 'spring') {
this.labels = ['second', 'minute', 'hour', 'day', 'month', 'week'];
this.validateForm = this.formBuilder.group({
second: ['0', Validators.required, this.checkValid],
minute: ['*', Validators.required, this.checkValid],
hour: ['*', Validators.required, this.checkValid],
day: ['*', Validators.required, this.checkValid],
month: ['*', Validators.required, this.checkValid],
week: ['*', Validators.required, this.checkValid]
});
}
else {
this.labels = ['minute', 'hour', 'day', 'month', 'week'];
this.validateForm = this.formBuilder.group({
minute: ['*', Validators.required, this.checkValid],
hour: ['*', Validators.required, this.checkValid],
day: ['*', Validators.required, this.checkValid],
month: ['*', Validators.required, this.checkValid],
week: ['*', Validators.required, this.checkValid]
});
}
this.i18n.localeChange.pipe(takeUntil(this.destroy$)).subscribe(() => {
this.locale = this.i18n.getLocaleData('CronExpression');
this.cdr.markForCheck();
});
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();
});
}
previewDate(value) {
try {
this.interval = parseExpression(Object.values(value).join(' '));
this.dateTime = this.interval.next().toDate();
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.validLabel = item.label;
this.validateForm.controls[item.label].patchValue(item.value);
this.cdr.markForCheck();
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
}
NzCronExpressionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: NzCronExpressionComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i2.NzI18nService }], target: i0.ɵɵFactoryTarget.Component });
NzCronExpressionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: NzCronExpressionComponent, selector: "nz-cron-expression", inputs: { nzSize: "nzSize", nzType: "nzType", nzCollapseDisable: "nzCollapseDisable", nzExtra: "nzExtra" }, providers: [
{
provide: NG_ASYNC_VALIDATORS,
useExisting: forwardRef(() => NzCronExpressionComponent),
multi: true
},
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NzCronExpressionComponent),
multi: true
}
], exportAs: ["nzCronExpression"], ngImport: i0, template: `
<div class="ant-cron-expression">
<div class="ant-cron-expression-content">
<div
class="ant-cron-expression-input-group"
[class.ant-cron-expression-input-group-lg]="nzSize === 'large'"
[class.ant-cron-expression-input-group-sm]="nzSize === 'small'"
[class.ant-cron-expression-input-group-focus]="focus"
[class.ant-cron-expression-input-group-error]="!validateForm.valid"
[class.ant-cron-expression-input-group-error-focus]="!validateForm.valid && focus"
>
<ng-container *ngFor="let label of labels">
<nz-cron-expression-input
[value]="this.validateForm.controls[label].value"
[label]="label"
(focusEffect)="focusEffect($event)"
(blurEffect)="blurEffect()"
(getValue)="getValue($event)"
></nz-cron-expression-input>
</ng-container>
</div>
<div class="ant-cron-expression-label-group">
<ng-container *ngFor="let label of labels">
<nz-cron-expression-label
[type]="label"
[valid]="this.validateForm.controls[label].valid"
[labelFocus]="labelFocus"
[locale]="locale"
></nz-cron-expression-label>
</ng-container>
</div>
<nz-collapse *ngIf="!nzCollapseDisable" [nzBordered]="false">
<nz-collapse-panel [nzHeader]="nextDate">
<ng-container *ngIf="validateForm.valid">
<ul class="ant-cron-expression-preview-date">
<li *ngFor="let dateItem of nextTimeList">
{{ dateItem | date: 'YYYY-MM-dd HH:mm:ss' }}
</li>
<li><a (click)="loadMorePreview()">···</a></li>
</ul>
</ng-container>
<ng-container *ngIf="!validateForm.valid">{{ locale.cronError }}</ng-container>
</nz-collapse-panel>
</nz-collapse>
</div>
<div class="ant-cron-expression-map" *ngIf="nzExtra">
<ng-template [ngTemplateOutlet]="nzExtra"></ng-template>
</div>
<ng-template #nextDate>
<ng-container *ngIf="validateForm.valid">
{{ dateTime | date: 'YYYY-MM-dd HH:mm:ss' }}
</ng-container>
<ng-container *ngIf="!validateForm.valid">{{ locale.cronError }}</ng-container>
</ng-template>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.NzCollapsePanelComponent, selector: "nz-collapse-panel", inputs: ["nzActive", "nzDisabled", "nzShowArrow", "nzExtra", "nzHeader", "nzExpandedIcon"], outputs: ["nzActiveChange"], exportAs: ["nzCollapsePanel"] }, { kind: "component", type: i4.NzCollapseComponent, selector: "nz-collapse", inputs: ["nzAccordion", "nzBordered", "nzGhost", "nzExpandIconPosition"], exportAs: ["nzCollapse"] }, { kind: "component", type: i5.NzCronExpressionLabelComponent, selector: "nz-cron-expression-label", inputs: ["type", "valid", "locale", "labelFocus"], exportAs: ["nzCronExpression"] }, { kind: "component", type: i6.NzCronExpressionInputComponent, selector: "nz-cron-expression-input", inputs: ["value", "label"], outputs: ["focusEffect", "blurEffect", "getValue"], exportAs: ["nzCronExpression"] }, { kind: "pipe", type: i3.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
__decorate([
InputBoolean()
], NzCronExpressionComponent.prototype, "nzCollapseDisable", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", 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-cron-expression-input-group"
[class.ant-cron-expression-input-group-lg]="nzSize === 'large'"
[class.ant-cron-expression-input-group-sm]="nzSize === 'small'"
[class.ant-cron-expression-input-group-focus]="focus"
[class.ant-cron-expression-input-group-error]="!validateForm.valid"
[class.ant-cron-expression-input-group-error-focus]="!validateForm.valid && focus"
>
<ng-container *ngFor="let label of labels">
<nz-cron-expression-input
[value]="this.validateForm.controls[label].value"
[label]="label"
(focusEffect)="focusEffect($event)"
(blurEffect)="blurEffect()"
(getValue)="getValue($event)"
></nz-cron-expression-input>
</ng-container>
</div>
<div class="ant-cron-expression-label-group">
<ng-container *ngFor="let label of labels">
<nz-cron-expression-label
[type]="label"
[valid]="this.validateForm.controls[label].valid"
[labelFocus]="labelFocus"
[locale]="locale"
></nz-cron-expression-label>
</ng-container>
</div>
<nz-collapse *ngIf="!nzCollapseDisable" [nzBordered]="false">
<nz-collapse-panel [nzHeader]="nextDate">
<ng-container *ngIf="validateForm.valid">
<ul class="ant-cron-expression-preview-date">
<li *ngFor="let dateItem of nextTimeList">
{{ dateItem | date: 'YYYY-MM-dd HH:mm:ss' }}
</li>
<li><a (click)="loadMorePreview()">···</a></li>
</ul>
</ng-container>
<ng-container *ngIf="!validateForm.valid">{{ locale.cronError }}</ng-container>
</nz-collapse-panel>
</nz-collapse>
</div>
<div class="ant-cron-expression-map" *ngIf="nzExtra">
<ng-template [ngTemplateOutlet]="nzExtra"></ng-template>
</div>
<ng-template #nextDate>
<ng-container *ngIf="validateForm.valid">
{{ dateTime | date: 'YYYY-MM-dd HH:mm:ss' }}
</ng-container>
<ng-container *ngIf="!validateForm.valid">{{ locale.cronError }}</ng-container>
</ng-template>
</div>
`,
providers: [
{
provide: NG_ASYNC_VALIDATORS,
useExisting: forwardRef(() => NzCronExpressionComponent),
multi: true
},
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NzCronExpressionComponent),
multi: true
}
]
}]
}], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }, { type: i2.NzI18nService }]; }, propDecorators: { nzSize: [{
type: Input
}], nzType: [{
type: Input
}], nzCollapseDisable: [{
type: Input
}], nzExtra: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvbi1leHByZXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvY3Jvbi1leHByZXNzaW9uL2Nyb24tZXhwcmVzc2lvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBSUwsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFJTCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBSWpCLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQWtCLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUc5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7O0FBK0V2RCxNQUFNLE9BQU8seUJBQXlCO0lBb0RwQyxZQUFvQixXQUErQixFQUFVLEdBQXNCLEVBQVUsSUFBbUI7UUFBNUYsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFlO1FBbkR2RyxXQUFNLEdBQXlCLFNBQVMsQ0FBQztRQUN6QyxXQUFNLEdBQXVCLE9BQU8sQ0FBQztRQUNyQixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkQsWUFBTyxHQUE4QixJQUFJLENBQUM7UUFHbkQsVUFBSyxHQUFZLEtBQUssQ0FBQztRQUN2QixlQUFVLEdBQW9CLElBQUksQ0FBQztRQUNuQyxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUNqQyxXQUFNLEdBQWUsRUFBRSxDQUFDO1FBRXhCLGlCQUFZLEdBQVcs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QTBCLENBQUM7NEJBQ3hELEtBQUssRUFBRSxJQUFJO3lCQUNaO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDBCQUEwQixDQUFDOzRCQUN4RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjtxS0FFVSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNtQixpQkFBaUI7c0JBQXpDLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQXN5bmNWYWxpZGF0b3IsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCxcbiAgTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFVudHlwZWRGb3JtQnVpbGRlcixcbiAgVW50eXBlZEZvcm1Hcm91cCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDcm9uRXhwcmVzc2lvbiwgcGFyc2VFeHByZXNzaW9uIH0gZnJvbSAnY3Jvbi1wYXJzZXInO1xuXG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgTnpDcm9uRXhwcmVzc2lvbkkxOG5JbnRlcmZhY2UsIE56STE4blNlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL2kxOG4nO1xuXG5pbXBvcnQgeyBDcm9uQ2hhbmdlVHlwZSwgQ3JvblR5cGUsIE56Q3JvbkV4cHJlc3Npb25TaXplLCBUaW1lVHlwZSB9IGZyb20gJy4vdHlwaW5ncyc7XG5cbkBDb21wb25lbnQoe1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc2VsZWN0b3I6ICduei1jcm9uLWV4cHJlc3Npb24nLFxuICBleHBvcnRBczogJ256Q3JvbkV4cHJlc3Npb24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJhbnQtY3Jvbi1leHByZXNzaW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYW50LWNyb24tZXhwcmVzc2lvbi1jb250ZW50XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImFudC1jcm9uLWV4cHJlc3Npb24taW5wdXQtZ3JvdXBcIlxuICAgICAgICAgIFtjbGFzcy5hbnQtY3Jvbi1leHByZXNzaW9uLWlucHV0LWdyb3VwLWxnXT1cIm56U2l6ZSA9PT0gJ2xhcmdlJ1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1jcm9uLWV4cHJlc3Npb24taW5wdXQtZ3JvdXAtc21dPVwibnpTaXplID09PSAnc21hbGwnXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWNyb24tZXhwcmVzc2lvbi1pbnB1dC1ncm91cC1mb2N1c109XCJmb2N1c1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1jcm9uLWV4cHJlc3Npb24taW5wdXQtZ3JvdXAtZXJyb3JdPVwiIXZhbGlkYXRlRm9ybS52YWxpZFwiXG4gICAgICAgICAgW2NsYXNzLmFudC1jcm9uLWV4cHJlc3Npb24taW5wdXQtZ3JvdXAtZXJyb3ItZm9jdXNdPVwiIXZhbGlkYXRlRm9ybS52YWxpZCAmJiBmb2N1c1wiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBsYWJlbHNcIj5cbiAgICAgICAgICAgIDxuei1jcm9uLWV4cHJlc3Npb24taW5wdXRcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2xhYmVsXS52YWx1ZVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJsYWJlbFwiXG4gICAgICAgICAgICAgIChmb2N1c0VmZmVjdCk9XCJmb2N1c0VmZmVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGJsdXJFZmZlY3QpPVwiYmx1ckVmZmVjdCgpXCJcbiAgICAgICAgICAgICAgKGdldFZhbHVlKT1cImdldFZhbHVlKCRldmVudClcIlxuICAgICAgICAgICAgPjwvbnotY3Jvbi1leHByZXNzaW9uLWlucHV0PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFudC1jcm9uLWV4cHJlc3Npb24tbGFiZWwtZ3JvdXBcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBsYWJlbHNcIj5cbiAgICAgICAgICAgIDxuei1jcm9uLWV4cHJlc3Npb24tbGFiZWxcbiAgICAgICAgICAgICAgW3R5cGVdPVwibGFiZWxcIlxuICAgICAgICAgICAgICBbdmFsaWRdPVwidGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHNbbGFiZWxdLnZhbGlkXCJcbiAgICAgICAgICAgICAgW2xhYmVsRm9jdXNdPVwibGFiZWxGb2N1c1wiXG4gICAgICAgICAgICAgIFtsb2NhbGVdPVwibG9jYWxlXCJcbiAgICAgICAgICAgID48L256LWNyb24tZXhwcmVzc2lvbi1sYWJlbD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuei1jb2xsYXBzZSAqbmdJZj1cIiFuekNvbGxhcHNlRGlzYWJsZVwiIFtuekJvcmRlcmVkXT1cImZhbHNlXCI+XG4gICAgICAgICAgPG56LWNvbGxhcHNlLXBhbmVsIFtuekhlYWRlcl09XCJuZXh0RGF0ZVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZhbGlkYXRlRm9ybS52YWxpZFwiPlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJhbnQtY3Jvbi1leHByZXNzaW9uLXByZXZpZXctZGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgZGF0ZUl0ZW0gb2YgbmV4dFRpbWVMaXN0XCI+XG4gICAgICAgICAgICAgICAgICB7eyBkYXRlSXRlbSB8IGRhdGU6ICdZWVlZLU1NLWRkIEhIOm1tOnNzJyB9fVxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpPjxhIChjbGljayk9XCJsb2FkTW9yZVByZXZpZXcoKVwiPsK3wrfCtzwvYT48L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXZhbGlkYXRlRm9ybS52YWxpZFwiPnt7IGxvY2FsZS5jcm9uRXJyb3IgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L256LWNvbGxhcHNlLXBhbmVsPlxuICAgICAgICA8L256LWNvbGxhcHNlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYW50LWNyb24tZXhwcmVzc2lvbi1tYXBcIiAqbmdJZj1cIm56RXh0cmFcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm56RXh0cmFcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctdGVtcGxhdGUgI25leHREYXRlPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmFsaWRhdGVGb3JtLnZhbGlkXCI+XG4gICAgICAgICAge3sgZGF0ZVRpbWUgfCBkYXRlOiAnWVlZWS1NTS1kZCBISDptbTpzcycgfX1cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdmFsaWRhdGVGb3JtLnZhbGlkXCI+e3sgbG9jYWxlLmNyb25FcnJvciB9fTwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE56Q3JvbkV4cHJlc3Npb25Db21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnpDcm9uRXhwcmVzc2lvbkNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOekNyb25FeHByZXNzaW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgQXN5bmNWYWxpZGF0b3IsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIG56U2l6ZTogTnpDcm9uRXhwcmVzc2lvblNpemUgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCgpIG56VHlwZTogJ2xpbnV4JyB8ICdzcHJpbmcnID0gJ2xpbnV4JztcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56Q29sbGFwc2VEaXNhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG56RXh0cmE/OiBUZW1wbGF0ZVJlZjx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gIGxvY2FsZSE6IE56Q3JvbkV4cHJlc3Npb25JMThuSW50ZXJmYWNlO1xuICBmb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuICBsYWJlbEZvY3VzOiBUaW1lVHlwZSB8IG51bGwgPSBudWxsO1xuICB2YWxpZExhYmVsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgbGFiZWxzOiBUaW1lVHlwZVtdID0gW107XG4gIGludGVydmFsITogQ3JvbkV4cHJlc3Npb248ZmFsc2U+O1xuICBuZXh0VGltZUxpc3Q6IERhdGVbXSA9IFtdO1xuICBkYXRlVGltZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHZhbGlkYXRlRm9ybSE6IFVudHlwZWRGb3JtR3JvdXA7XG5cbiAgb25DaGFuZ2U6IE56U2FmZUFueSA9ICgpID0+IHt9O1xuICBvblRvdWNoOiAoKSA9PiB2b2lkID0gKCkgPT4gbnVsbDtcblxuICBjb252ZXJ0Rm9ybWF0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgnICcpO1xuICAgIGNvbnN0IHZhbHVlT2JqZWN0OiBDcm9uVHlwZSA9IHt9O1xuICAgIHRoaXMubGFiZWxzLm1hcCgoYSwgYikgPT4ge1xuICAgICAgdmFsdWVPYmplY3RbYV0gPSB2YWx1ZXNbYl07XG4gICAgfSk7XG4gICAgdGhpcy52YWxpZGF0ZUZvcm0ucGF0Y2hWYWx1ZSh2YWx1ZU9iamVjdCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmNvbnZlcnRGb3JtYXQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IE56U2FmZUFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBOelNhZmVBbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2ggPSBmbjtcbiAgfVxuXG4gIHZhbGlkYXRlKCk6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+IHtcbiAgICBpZiAodGhpcy52YWxpZGF0ZUZvcm0udmFsaWQpIHtcbiAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9mKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgaTE4bjogTnpJMThuU2VydmljZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5uelR5cGUgPT09ICdzcHJpbmcnKSB7XG4gICAgICB0aGlzLmxhYmVscyA9IFsnc2Vjb25kJywgJ21pbnV0ZScsICdob3VyJywgJ2RheScsICdtb250aCcsICd3ZWVrJ107XG4gICAgICB0aGlzLnZhbGlkYXRlRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICBzZWNvbmQ6IFsnMCcsIFZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuY2hlY2tWYWxpZF0sXG4gICAgICAgIG1pbnV0ZTogWycqJywgVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5jaGVja1ZhbGlkXSxcbiAgICAgICAgaG91cjogWycqJywgVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5jaGVja1ZhbGlkXSxcbiAgICAgICAgZGF5OiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdLFxuICAgICAgICBtb250aDogWycqJywgVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5jaGVja1ZhbGlkXSxcbiAgICAgICAgd2VlazogWycqJywgVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5jaGVja1ZhbGlkXVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGFiZWxzID0gWydtaW51dGUnLCAnaG91cicsICdkYXknLCAnbW9udGgnLCAnd2VlayddO1xuICAgICAgdGhpcy52YWxpZGF0ZUZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgbWludXRlOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdLFxuICAgICAgICBob3VyOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdLFxuICAgICAgICBkYXk6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuY2hlY2tWYWxpZF0sXG4gICAgICAgIG1vbnRoOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdLFxuICAgICAgICB3ZWVrOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5pMThuLmxvY2FsZUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5pMThuLmdldExvY2FsZURhdGEoJ0Nyb25FeHByZXNzaW9uJyk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIHRoaXMucHJldmlld0RhdGUodGhpcy52YWxpZGF0ZUZvcm0udmFsdWUpO1xuXG4gICAgdGhpcy52YWxpZGF0ZUZvcm0udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgdGhpcy5vbkNoYW5nZShPYmplY3QudmFsdWVzKHZhbHVlKS5qb2luKCcgJykpO1xuICAgICAgdGhpcy5wcmV2aWV3RGF0ZSh2YWx1ZSk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByZXZpZXdEYXRlKHZhbHVlOiBDcm9uVHlwZSk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmludGVydmFsID0gcGFyc2VFeHByZXNzaW9uKE9iamVjdC52YWx1ZXModmFsdWUpLmpvaW4oJyAnKSk7XG4gICAgICB0aGlzLmRhdGVUaW1lID0gdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCk7XG4gICAgICB0aGlzLm5leHRUaW1lTGlzdCA9IFtcbiAgICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpXG4gICAgICBdO1xuICAgIH0gY2F0Y2ggKGVycjogTnpTYWZlQW55KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbG9hZE1vcmVQcmV2aWV3KCk6IHZvaWQge1xuICAgIHRoaXMubmV4dFRpbWVMaXN0ID0gW1xuICAgICAgLi4udGhpcy5uZXh0VGltZUxpc3QsXG4gICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpXG4gICAgXTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGZvY3VzRWZmZWN0KHZhbHVlOiBUaW1lVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXMgPSB0cnVlO1xuICAgIHRoaXMubGFiZWxGb2N1cyA9IHZhbHVlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgYmx1ckVmZmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gICAgdGhpcy5sYWJlbEZvY3VzID0gbnVsbDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldFZhbHVlKGl0ZW06IENyb25DaGFuZ2VUeXBlKTogdm9pZCB7XG4gICAgdGhpcy52YWxpZExhYmVsID0gaXRlbS5sYWJlbDtcbiAgICB0aGlzLnZhbGlkYXRlRm9ybS5jb250cm9sc1tpdGVtLmxhYmVsXS5wYXRjaFZhbHVlKGl0ZW0udmFsdWUpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgY2hlY2tWYWxpZCA9IChjb250cm9sOiBGb3JtQ29udHJvbCk6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+ID0+IHtcbiAgICBpZiAoY29udHJvbC52YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY3Jvbjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdGhpcy5sYWJlbHMuZm9yRWFjaChsYWJlbCA9PiB7XG4gICAgICAgICAgbGFiZWwgPT09IHRoaXMudmFsaWRMYWJlbCA/IGNyb24ucHVzaChjb250cm9sLnZhbHVlKSA6IGNyb24ucHVzaCgnKicpO1xuICAgICAgICB9KTtcbiAgICAgICAgcGFyc2VFeHByZXNzaW9uKGNyb24uam9pbignICcpKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gb2YoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9mKG51bGwpO1xuICB9O1xuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19