UNPKG

@jsonforms/angular-material

Version:

Material Renderer Set for Angular module of JSON Forms

261 lines (257 loc) 27.1 kB
/* The MIT License Copyright (c) 2017-2020 EclipseSource Munich https://github.com/eclipsesource/jsonforms Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { JsonFormsAngularService, JsonFormsAbstractControl, } from '@jsonforms/angular'; import { arrayDefaultTranslations, createDefaultValue, defaultJsonFormsI18nState, findUISchema, getArrayTranslations, isObjectArrayWithNesting, mapDispatchToArrayControlProps, mapStateToArrayLayoutProps, Paths, rankWith, setReadonly, unsetReadonly, } from '@jsonforms/core'; import * as i0 from "@angular/core"; import * as i1 from "@jsonforms/angular"; import * as i2 from "@angular/common"; import * as i3 from "@angular/material/card"; import * as i4 from "@angular/material/button"; import * as i5 from "@angular/material/icon"; import * as i6 from "@angular/material/tooltip"; import * as i7 from "@angular/material/badge"; export class ArrayLayoutRenderer extends JsonFormsAbstractControl { noData; translations = {}; addItem; moveItemUp; moveItemDown; removeItems; uischemas; constructor(jsonFormsService) { super(jsonFormsService); } mapToProps(state) { const props = mapStateToArrayLayoutProps(state, this.getOwnProps()); const t = state.jsonforms.i18n?.translate ?? defaultJsonFormsI18nState.translate; const translations = getArrayTranslations(t, arrayDefaultTranslations, props.i18nKeyPrefix, props.label); return { ...props, translations }; } remove(index) { this.removeItems(this.propsPath, [index])(); } add() { this.addItem(this.propsPath, createDefaultValue(this.scopedSchema, this.rootSchema))(); } up(index) { this.moveItemUp(this.propsPath, index)(); } down(index) { this.moveItemDown(this.propsPath, index)(); } ngOnInit() { super.ngOnInit(); const { addItem, removeItems, moveUp, moveDown } = mapDispatchToArrayControlProps(this.jsonFormsService.updateCore.bind(this.jsonFormsService)); this.addItem = addItem; this.moveItemUp = moveUp; this.moveItemDown = moveDown; this.removeItems = removeItems; } mapAdditionalProps(props) { this.noData = !props.data || props.data === 0; this.uischemas = props.uischemas; this.translations = props.translations; } getProps(index) { const uischema = findUISchema(this.uischemas, this.scopedSchema, this.uischema.scope, this.propsPath, undefined, this.uischema, this.rootSchema); if (this.isEnabled()) { unsetReadonly(uischema); } else { setReadonly(uischema); } return { schema: this.scopedSchema, path: Paths.compose(this.propsPath, `${index}`), uischema, }; } trackByFn(index) { return index; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ArrayLayoutRenderer, deps: [{ token: i1.JsonFormsAngularService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ArrayLayoutRenderer, selector: "app-array-layout-renderer", usesInheritance: true, ngImport: i0, template: ` <div [ngStyle]="{ display: hidden ? 'none' : '' }" class="array-layout"> <div class="array-layout-toolbar"> <h2 class="mat-h2 array-layout-title">{{ label }}</h2> <span></span> <mat-icon *ngIf="this.error?.length" color="warn" matBadge="{{ this.error.split('').length }}" matBadgeColor="warn" matTooltip="{{ this.error }}" matTooltipClass="error-message-tooltip" > error_outline </mat-icon> <span></span> <button mat-button matTooltip="{{ translations.addTooltip }}" [disabled]="!isEnabled()" (click)="add()" attr.aria-label="{{ translations.addAriaLabel }}" > <mat-icon>add</mat-icon> </button> </div> <p *ngIf="noData">{{ translations.noDataMessage }}</p> <div *ngFor=" let item of [].constructor(data); let idx = index; trackBy: trackByFn; last as last; first as first " > <mat-card class="array-item" appearance="outlined"> <mat-card-content> <jsonforms-outlet [renderProps]="getProps(idx)"></jsonforms-outlet> </mat-card-content> <mat-card-actions *ngIf="isEnabled()"> <button *ngIf="uischema?.options?.showSortButtons" class="item-up" mat-button [disabled]="first" (click)="up(idx)" attr.aria-label="{{ translations.upAriaLabel }}" matTooltip="{{ translations.up }}" matTooltipPosition="right" > <mat-icon>arrow_upward</mat-icon> </button> <button *ngIf="uischema?.options?.showSortButtons" class="item-down" mat-button [disabled]="last" (click)="down(idx)" attr.aria-label="{{ translations.downAriaLabel }}" matTooltip="{{ translations.down }}" matTooltipPosition="right" > <mat-icon>arrow_downward</mat-icon> </button> <button mat-button color="warn" (click)="remove(idx)" attr.aria-label="{{ translations.removeAriaLabel }}" matTooltip="{{ translations.removeTooltip }}" matTooltipPosition="right" > <mat-icon>delete</mat-icon> </button> </mat-card-actions> </mat-card> </div> </div> `, isInline: true, styles: [".array-layout{display:flex;flex-direction:column;gap:16px}.array-layout>*{flex:1 1 auto}.array-layout-toolbar{display:flex;align-items:center}.array-layout-title{margin:0}.array-layout-toolbar>span{flex:1 1 auto}.array-item{padding:16px}::ng-deep .error-message-tooltip{white-space:pre-line}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.JsonFormsOutlet, selector: "jsonforms-outlet", inputs: ["renderProps"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i7.MatBadge, selector: "[matBadge]", inputs: ["matBadgeColor", "matBadgeOverlap", "matBadgeDisabled", "matBadgePosition", "matBadge", "matBadgeDescription", "matBadgeSize", "matBadgeHidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ArrayLayoutRenderer, decorators: [{ type: Component, args: [{ selector: 'app-array-layout-renderer', template: ` <div [ngStyle]="{ display: hidden ? 'none' : '' }" class="array-layout"> <div class="array-layout-toolbar"> <h2 class="mat-h2 array-layout-title">{{ label }}</h2> <span></span> <mat-icon *ngIf="this.error?.length" color="warn" matBadge="{{ this.error.split('').length }}" matBadgeColor="warn" matTooltip="{{ this.error }}" matTooltipClass="error-message-tooltip" > error_outline </mat-icon> <span></span> <button mat-button matTooltip="{{ translations.addTooltip }}" [disabled]="!isEnabled()" (click)="add()" attr.aria-label="{{ translations.addAriaLabel }}" > <mat-icon>add</mat-icon> </button> </div> <p *ngIf="noData">{{ translations.noDataMessage }}</p> <div *ngFor=" let item of [].constructor(data); let idx = index; trackBy: trackByFn; last as last; first as first " > <mat-card class="array-item" appearance="outlined"> <mat-card-content> <jsonforms-outlet [renderProps]="getProps(idx)"></jsonforms-outlet> </mat-card-content> <mat-card-actions *ngIf="isEnabled()"> <button *ngIf="uischema?.options?.showSortButtons" class="item-up" mat-button [disabled]="first" (click)="up(idx)" attr.aria-label="{{ translations.upAriaLabel }}" matTooltip="{{ translations.up }}" matTooltipPosition="right" > <mat-icon>arrow_upward</mat-icon> </button> <button *ngIf="uischema?.options?.showSortButtons" class="item-down" mat-button [disabled]="last" (click)="down(idx)" attr.aria-label="{{ translations.downAriaLabel }}" matTooltip="{{ translations.down }}" matTooltipPosition="right" > <mat-icon>arrow_downward</mat-icon> </button> <button mat-button color="warn" (click)="remove(idx)" attr.aria-label="{{ translations.removeAriaLabel }}" matTooltip="{{ translations.removeTooltip }}" matTooltipPosition="right" > <mat-icon>delete</mat-icon> </button> </mat-card-actions> </mat-card> </div> </div> `, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [".array-layout{display:flex;flex-direction:column;gap:16px}.array-layout>*{flex:1 1 auto}.array-layout-toolbar{display:flex;align-items:center}.array-layout-title{margin:0}.array-layout-toolbar>span{flex:1 1 auto}.array-item{padding:16px}::ng-deep .error-message-tooltip{white-space:pre-line}\n"] }] }], ctorParameters: () => [{ type: i1.JsonFormsAngularService }] }); export const ArrayLayoutRendererTester = rankWith(4, isObjectArrayWithNesting); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXktbGF5b3V0LnJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYnJhcnkvbGF5b3V0cy9hcnJheS1sYXlvdXQucmVuZGVyZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBdUJFO0FBQ0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHdCQUF3QixHQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCx3QkFBd0IsRUFHeEIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixZQUFZLEVBQ1osb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUV4Qiw4QkFBOEIsRUFDOUIsMEJBQTBCLEVBRTFCLEtBQUssRUFFTCxRQUFRLEVBQ1IsV0FBVyxFQUlYLGFBQWEsR0FDZCxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7QUFtSHpCLE1BQU0sT0FBTyxtQkFDWCxTQUFRLHdCQUFpRDtJQUd6RCxNQUFNLENBQVU7SUFDaEIsWUFBWSxHQUFzQixFQUFFLENBQUM7SUFDckMsT0FBTyxDQUEyQztJQUNsRCxVQUFVLENBQThDO0lBQ3hELFlBQVksQ0FBOEM7SUFDMUQsV0FBVyxDQUFtRDtJQUM5RCxTQUFTLENBR0w7SUFDSixZQUFZLGdCQUF5QztRQUNuRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsVUFBVSxDQUNSLEtBQXFCO1FBRXJCLE1BQU0sS0FBSyxHQUFHLDBCQUEwQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNwRSxNQUFNLENBQUMsR0FDTCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLElBQUkseUJBQXlCLENBQUMsU0FBUyxDQUFDO1FBQ3pFLE1BQU0sWUFBWSxH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LFNBQVM7K0JBQ0UsMkJBQTJCLFlBQzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0VULG1CQTZCZ0IsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxLQUFLOztBQTRGbkIsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQWlCLFFBQVEsQ0FDN0QsQ0FBQyxFQUNELHdCQUF3QixDQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgVGhlIE1JVCBMaWNlbnNlXG5cbiAgQ29weXJpZ2h0IChjKSAyMDE3LTIwMjAgRWNsaXBzZVNvdXJjZSBNdW5pY2hcbiAgaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2Vzb3VyY2UvanNvbmZvcm1zXG5cbiAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gIFRIRSBTT0ZUV0FSRS5cbiovXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEpzb25Gb3Jtc0FuZ3VsYXJTZXJ2aWNlLFxuICBKc29uRm9ybXNBYnN0cmFjdENvbnRyb2wsXG59IGZyb20gJ0Bqc29uZm9ybXMvYW5ndWxhcic7XG5pbXBvcnQge1xuICBhcnJheURlZmF1bHRUcmFuc2xhdGlvbnMsXG4gIEFycmF5TGF5b3V0UHJvcHMsXG4gIEFycmF5VHJhbnNsYXRpb25zLFxuICBjcmVhdGVEZWZhdWx0VmFsdWUsXG4gIGRlZmF1bHRKc29uRm9ybXNJMThuU3RhdGUsXG4gIGZpbmRVSVNjaGVtYSxcbiAgZ2V0QXJyYXlUcmFuc2xhdGlvbnMsXG4gIGlzT2JqZWN0QXJyYXlXaXRoTmVzdGluZyxcbiAgSnNvbkZvcm1zU3RhdGUsXG4gIG1hcERpc3BhdGNoVG9BcnJheUNvbnRyb2xQcm9wcyxcbiAgbWFwU3RhdGVUb0FycmF5TGF5b3V0UHJvcHMsXG4gIE93blByb3BzT2ZSZW5kZXJlcixcbiAgUGF0aHMsXG4gIFJhbmtlZFRlc3RlcixcbiAgcmFua1dpdGgsXG4gIHNldFJlYWRvbmx5LFxuICBTdGF0ZVByb3BzT2ZBcnJheUxheW91dCxcbiAgVUlTY2hlbWFFbGVtZW50LFxuICBVSVNjaGVtYVRlc3RlcixcbiAgdW5zZXRSZWFkb25seSxcbn0gZnJvbSAnQGpzb25mb3Jtcy9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFycmF5LWxheW91dC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbbmdTdHlsZV09XCJ7IGRpc3BsYXk6IGhpZGRlbiA/ICdub25lJyA6ICcnIH1cIiBjbGFzcz1cImFycmF5LWxheW91dFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImFycmF5LWxheW91dC10b29sYmFyXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cIm1hdC1oMiBhcnJheS1sYXlvdXQtdGl0bGVcIj57eyBsYWJlbCB9fTwvaDI+XG4gICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgKm5nSWY9XCJ0aGlzLmVycm9yPy5sZW5ndGhcIlxuICAgICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgbWF0QmFkZ2U9XCJ7eyB0aGlzLmVycm9yLnNwbGl0KCcnKS5sZW5ndGggfX1cIlxuICAgICAgICAgIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICBtYXRUb29sdGlwPVwie3sgdGhpcy5lcnJvciB9fVwiXG4gICAgICAgICAgbWF0VG9vbHRpcENsYXNzPVwiZXJyb3ItbWVzc2FnZS10b29sdGlwXCJcbiAgICAgICAgPlxuICAgICAgICAgIGVycm9yX291dGxpbmVcbiAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyB0cmFuc2xhdGlvbnMuYWRkVG9vbHRpcCB9fVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0VuYWJsZWQoKVwiXG4gICAgICAgICAgKGNsaWNrKT1cImFkZCgpXCJcbiAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJ7eyB0cmFuc2xhdGlvbnMuYWRkQXJpYUxhYmVsIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgKm5nSWY9XCJub0RhdGFcIj57eyB0cmFuc2xhdGlvbnMubm9EYXRhTWVzc2FnZSB9fTwvcD5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgbGV0IGl0ZW0gb2YgW10uY29uc3RydWN0b3IoZGF0YSk7XG4gICAgICAgICAgbGV0IGlkeCA9IGluZGV4O1xuICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlGbjtcbiAgICAgICAgICBsYXN0IGFzIGxhc3Q7XG4gICAgICAgICAgZmlyc3QgYXMgZmlyc3RcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwiYXJyYXktaXRlbVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lZFwiPlxuICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgPGpzb25mb3Jtcy1vdXRsZXQgW3JlbmRlclByb3BzXT1cImdldFByb3BzKGlkeClcIj48L2pzb25mb3Jtcy1vdXRsZXQ+XG4gICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgIDxtYXQtY2FyZC1hY3Rpb25zICpuZ0lmPVwiaXNFbmFibGVkKClcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nSWY9XCJ1aXNjaGVtYT8ub3B0aW9ucz8uc2hvd1NvcnRCdXR0b25zXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtLXVwXCJcbiAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlyc3RcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidXAoaWR4KVwiXG4gICAgICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInt7IHRyYW5zbGF0aW9ucy51cEFyaWFMYWJlbCB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyB0cmFuc2xhdGlvbnMudXAgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJyaWdodFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd191cHdhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0lmPVwidWlzY2hlbWE/Lm9wdGlvbnM/LnNob3dTb3J0QnV0dG9uc1wiXG4gICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS1kb3duXCJcbiAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibGFzdFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJkb3duKGlkeClcIlxuICAgICAgICAgICAgICBhdHRyLmFyaWEtbGFiZWw9XCJ7eyB0cmFuc2xhdGlvbnMuZG93bkFyaWFMYWJlbCB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyB0cmFuc2xhdGlvbnMuZG93biB9fVwiXG4gICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cInJpZ2h0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmUoaWR4KVwiXG4gICAgICAgICAgICAgIGF0dHIuYXJpYS1sYWJlbD1cInt7IHRyYW5zbGF0aW9ucy5yZW1vdmVBcmlhTGFiZWwgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwPVwie3sgdHJhbnNsYXRpb25zLnJlbW92ZVRvb2x0aXAgfX1cIlxuICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJyaWdodFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9tYXQtY2FyZC1hY3Rpb25zPlxuICAgICAgICA8L21hdC1jYXJkPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5hcnJheS1sYXlvdXQge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICB9XG4gICAgICAuYXJyYXktbGF5b3V0ID4gKiB7XG4gICAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgICAgfVxuICAgICAgLmFycmF5LWxheW91dC10b29sYmFyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIH1cbiAgICAgIC5hcnJheS1sYXlvdXQtdGl0bGUge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgICAuYXJyYXktbGF5b3V0LXRvb2xiYXIgPiBzcGFuIHtcbiAgICAgICAgZmxleDogMSAxIGF1dG87XG4gICAgICB9XG4gICAgICAuYXJyYXktaXRlbSB7XG4gICAgICAgIHBhZGRpbmc6IDE2cHg7XG4gICAgICB9XG4gICAgICA6Om5nLWRlZXAgLmVycm9yLW1lc3NhZ2UtdG9vbHRpcCB7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG59KVxuZXhwb3J0IGNsYXNzIEFycmF5TGF5b3V0UmVuZGVyZXJcbiAgZXh0ZW5kcyBKc29uRm9ybXNBYnN0cmFjdENvbnRyb2w8U3RhdGVQcm9wc09mQXJyYXlMYXlvdXQ+XG4gIGltcGxlbWVudHMgT25Jbml0XG57XG4gIG5vRGF0YTogYm9vbGVhbjtcbiAgdHJhbnNsYXRpb25zOiBBcnJheVRyYW5zbGF0aW9ucyA9IHt9O1xuICBhZGRJdGVtOiAocGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiAoKSA9PiB2b2lkO1xuICBtb3ZlSXRlbVVwOiAocGF0aDogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiAoKSA9PiB2b2lkO1xuICBtb3ZlSXRlbURvd246IChwYXRoOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+ICgpID0+IHZvaWQ7XG4gIHJlbW92ZUl0ZW1zOiAocGF0aDogc3RyaW5nLCB0b0RlbGV0ZTogbnVtYmVyW10pID0+ICgpID0+IHZvaWQ7XG4gIHVpc2NoZW1hczoge1xuICAgIHRlc3RlcjogVUlTY2hlbWFUZXN0ZXI7XG4gICAgdWlzY2hlbWE6IFVJU2NoZW1hRWxlbWVudDtcbiAgfVtdO1xuICBjb25zdHJ1Y3Rvcihqc29uRm9ybXNTZXJ2aWNlOiBKc29uRm9ybXNBbmd1bGFyU2VydmljZSkge1xuICAgIHN1cGVyKGpzb25Gb3Jtc1NlcnZpY2UpO1xuICB9XG4gIG1hcFRvUHJvcHMoXG4gICAgc3RhdGU6IEpzb25Gb3Jtc1N0YXRlXG4gICk6IFN0YXRlUHJvcHNPZkFycmF5TGF5b3V0ICYgeyB0cmFuc2xhdGlvbnM6IEFycmF5VHJhbnNsYXRpb25zIH0ge1xuICAgIGNvbnN0IHByb3BzID0gbWFwU3RhdGVUb0FycmF5TGF5b3V0UHJvcHMoc3RhdGUsIHRoaXMuZ2V0T3duUHJvcHMoKSk7XG4gICAgY29uc3QgdCA9XG4gICAgICBzdGF0ZS5qc29uZm9ybXMuaTE4bj8udHJhbnNsYXRlID8/IGRlZmF1bHRKc29uRm9ybXNJMThuU3RhdGUudHJhbnNsYXRlO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IGdldEFycmF5VHJhbnNsYXRpb25zKFxuICAgICAgdCxcbiAgICAgIGFycmF5RGVmYXVsdFRyYW5zbGF0aW9ucyxcbiAgICAgIHByb3BzLmkxOG5LZXlQcmVmaXgsXG4gICAgICBwcm9wcy5sYWJlbFxuICAgICk7XG4gICAgcmV0dXJuIHsgLi4ucHJvcHMsIHRyYW5zbGF0aW9ucyB9O1xuICB9XG4gIHJlbW92ZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVJdGVtcyh0aGlzLnByb3BzUGF0aCwgW2luZGV4XSkoKTtcbiAgfVxuICBhZGQoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRJdGVtKFxuICAgICAgdGhpcy5wcm9wc1BhdGgsXG4gICAgICBjcmVhdGVEZWZhdWx0VmFsdWUodGhpcy5zY29wZWRTY2hlbWEsIHRoaXMucm9vdFNjaGVtYSlcbiAgICApKCk7XG4gIH1cbiAgdXAoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubW92ZUl0ZW1VcCh0aGlzLnByb3BzUGF0aCwgaW5kZXgpKCk7XG4gIH1cbiAgZG93bihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5tb3ZlSXRlbURvd24odGhpcy5wcm9wc1BhdGgsIGluZGV4KSgpO1xuICB9XG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgY29uc3QgeyBhZGRJdGVtLCByZW1vdmVJdGVtcywgbW92ZVVwLCBtb3ZlRG93biB9ID1cbiAgICAgIG1hcERpc3BhdGNoVG9BcnJheUNvbnRyb2xQcm9wcyhcbiAgICAgICAgdGhpcy5qc29uRm9ybXNTZXJ2aWNlLnVwZGF0ZUNvcmUuYmluZCh0aGlzLmpzb25Gb3Jtc1NlcnZpY2UpXG4gICAgICApO1xuICAgIHRoaXMuYWRkSXRlbSA9IGFkZEl0ZW07XG4gICAgdGhpcy5tb3ZlSXRlbVVwID0gbW92ZVVwO1xuICAgIHRoaXMubW92ZUl0ZW1Eb3duID0gbW92ZURvd247XG4gICAgdGhpcy5yZW1vdmVJdGVtcyA9IHJlbW92ZUl0ZW1zO1xuICB9XG4gIG1hcEFkZGl0aW9uYWxQcm9wcyhcbiAgICBwcm9wczogQXJyYXlMYXlvdXRQcm9wcyAmIHsgdHJhbnNsYXRpb25zOiBBcnJheVRyYW5zbGF0aW9ucyB9XG4gICkge1xuICAgIHRoaXMubm9EYXRhID0gIXByb3BzLmRhdGEgfHwgcHJvcHMuZGF0YSA9PT0gMDtcbiAgICB0aGlzLnVpc2NoZW1hcyA9IHByb3BzLnVpc2NoZW1hcztcbiAgICB0aGlzLnRyYW5zbGF0aW9ucyA9IHByb3BzLnRyYW5zbGF0aW9ucztcbiAgfVxuICBnZXRQcm9wcyhpbmRleDogbnVtYmVyKTogT3duUHJvcHNPZlJlbmRlcmVyIHtcbiAgICBjb25zdCB1aXNjaGVtYSA9IGZpbmRVSVNjaGVtYShcbiAgICAgIHRoaXMudWlzY2hlbWFzLFxuICAgICAgdGhpcy5zY29wZWRTY2hlbWEsXG4gICAgICB0aGlzLnVpc2NoZW1hLnNjb3BlLFxuICAgICAgdGhpcy5wcm9wc1BhdGgsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLnVpc2NoZW1hLFxuICAgICAgdGhpcy5yb290U2NoZW1hXG4gICAgKTtcbiAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSkge1xuICAgICAgdW5zZXRSZWFkb25seSh1aXNjaGVtYSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFJlYWRvbmx5KHVpc2NoZW1hKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtYTogdGhpcy5zY29wZWRTY2hlbWEsXG4gICAgICBwYXRoOiBQYXRocy5jb21wb3NlKHRoaXMucHJvcHNQYXRoLCBgJHtpbmRleH1gKSxcbiAgICAgIHVpc2NoZW1hLFxuICAgIH07XG4gIH1cbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEFycmF5TGF5b3V0UmVuZGVyZXJUZXN0ZXI6IFJhbmtlZFRlc3RlciA9IHJhbmtXaXRoKFxuICA0LFxuICBpc09iamVjdEFycmF5V2l0aE5lc3Rpbmdcbik7XG4iXX0=