cytoscape-angular
Version:
Angular 12+ components for cytoscape charting.
265 lines (262 loc) • 27 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@angular/common";
import * as i3 from "primeng/fieldset";
import * as i4 from "primeng/inputswitch";
import * as i5 from "primeng/tooltip";
import * as i6 from "primeng/inputtext";
import * as i7 from "primeng/dropdown";
import * as i8 from "primeng/button";
function FluidFormComponent_ng_container_1_p_fieldset_1_div_2_ng_container_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "span", 10);
i0.ɵɵtext(2);
i0.ɵɵelementEnd();
i0.ɵɵelement(3, "p-inputSwitch", 11);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const fieldInfo_r5 = i0.ɵɵnextContext().$implicit;
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate1(" ", fieldInfo_r5.label, " ");
i0.ɵɵadvance(1);
i0.ɵɵpropertyInterpolate("name", fieldInfo_r5.modelProperty);
i0.ɵɵpropertyInterpolate("pTooltip", fieldInfo_r5.tooltip);
i0.ɵɵpropertyInterpolate("formControlName", fieldInfo_r5.modelProperty);
} }
function FluidFormComponent_ng_container_1_p_fieldset_1_div_2_ng_container_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "span", 12);
i0.ɵɵelement(2, "input", 13);
i0.ɵɵelementStart(3, "label", 14);
i0.ɵɵtext(4);
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const fieldInfo_r5 = i0.ɵɵnextContext().$implicit;
i0.ɵɵadvance(2);
i0.ɵɵpropertyInterpolate("id", fieldInfo_r5.modelProperty);
i0.ɵɵpropertyInterpolate("name", fieldInfo_r5.modelProperty);
i0.ɵɵpropertyInterpolate("formControlName", fieldInfo_r5.modelProperty);
i0.ɵɵproperty("pTooltip", fieldInfo_r5.tooltip)("type", fieldInfo_r5.inputType)("size", fieldInfo_r5.inputSize);
i0.ɵɵadvance(1);
i0.ɵɵpropertyInterpolate("for", fieldInfo_r5.modelProperty);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(fieldInfo_r5.label);
} }
function FluidFormComponent_ng_container_1_p_fieldset_1_div_2_ng_container_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "span", 12);
i0.ɵɵelement(2, "p-dropdown", 15);
i0.ɵɵelementStart(3, "label", 14);
i0.ɵɵtext(4);
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const fieldInfo_r5 = i0.ɵɵnextContext().$implicit;
i0.ɵɵadvance(2);
i0.ɵɵpropertyInterpolate("formControlName", fieldInfo_r5.modelProperty);
i0.ɵɵproperty("name", fieldInfo_r5.modelProperty)("options", fieldInfo_r5.options)("optionLabel", fieldInfo_r5.optionArrayLabelField)("pTooltip", fieldInfo_r5.tooltip);
i0.ɵɵadvance(1);
i0.ɵɵpropertyInterpolate("for", fieldInfo_r5.modelProperty);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(fieldInfo_r5.label);
} }
function FluidFormComponent_ng_container_1_p_fieldset_1_div_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 7);
i0.ɵɵelementStart(1, "div", 8);
i0.ɵɵtemplate(2, FluidFormComponent_ng_container_1_p_fieldset_1_div_2_ng_container_2_Template, 4, 4, "ng-container", 9);
i0.ɵɵtemplate(3, FluidFormComponent_ng_container_1_p_fieldset_1_div_2_ng_container_3_Template, 5, 8, "ng-container", 9);
i0.ɵɵtemplate(4, FluidFormComponent_ng_container_1_p_fieldset_1_div_2_ng_container_4_Template, 5, 7, "ng-container", 9);
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
} if (rf & 2) {
const fieldInfo_r5 = ctx.$implicit;
const ctx_r4 = i0.ɵɵnextContext(3);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", fieldInfo_r5.fieldType(ctx_r4.model) === "boolean");
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", fieldInfo_r5.fieldType(ctx_r4.model) === "string" || fieldInfo_r5.fieldType(ctx_r4.model) === "number");
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", fieldInfo_r5.fieldType(ctx_r4.model) === "options");
} }
function FluidFormComponent_ng_container_1_p_fieldset_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "p-fieldset", 4);
i0.ɵɵelementStart(1, "div", 5);
i0.ɵɵtemplate(2, FluidFormComponent_ng_container_1_p_fieldset_1_div_2_Template, 5, 3, "div", 6);
i0.ɵɵelementEnd();
i0.ɵɵelementEnd();
} if (rf & 2) {
const fieldSetInfo_r2 = i0.ɵɵnextContext().$implicit;
i0.ɵɵpropertyInterpolate("legend", fieldSetInfo_r2.legend);
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngForOf", fieldSetInfo_r2.fieldInfos);
} }
function FluidFormComponent_ng_container_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, FluidFormComponent_ng_container_1_p_fieldset_1_Template, 3, 2, "p-fieldset", 3);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const fieldSetInfo_r2 = ctx.$implicit;
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", fieldSetInfo_r2.showFieldsetForModel(ctx_r0.model));
} }
function FluidFormComponent_button_2_Template(rf, ctx) { if (rf & 1) {
const _r14 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 16);
i0.ɵɵlistener("submit", function FluidFormComponent_button_2_Template_button_submit_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r13 = i0.ɵɵnextContext(); return ctx_r13.onSubmit(); });
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵproperty("disabled", ctx_r1.formInfo.disableSubmitOnFormInvalid && !ctx_r1.formGroup.valid);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r1.formInfo.submitText || "Submit");
} }
export class FluidFormComponent {
constructor() {
this.modelChange = new EventEmitter();
}
ngOnInit() {
console.debug('FluidFormComponent this.formInfo:', JSON.stringify(this.formInfo));
let controls = {};
this.formInfo.fieldsets.forEach(fieldsetInfo => {
fieldsetInfo.fieldInfos.forEach(fieldInfo => {
let modelValue = this.model[fieldInfo.modelProperty];
// console.log('fieldInfo.modelProperty:', fieldInfo.modelProperty, ', modelValue:', modelValue)
const validators = typeof fieldInfo.validators === 'function' ? fieldInfo.validators() : fieldInfo.validators;
const asyncValidators = typeof fieldInfo.asyncValidators === 'function' ? fieldInfo.asyncValidators() : fieldInfo.asyncValidators;
const { updateOn } = fieldInfo;
let formControl = new FormControl(modelValue, { validators, asyncValidators, updateOn });
formControl.valueChanges.subscribe((change) => {
console.debug('form control change ', JSON.stringify(change), ' for prop ', fieldInfo.modelProperty, ', changing current model value ', this.model[fieldInfo.modelProperty], ' to ', change);
fieldInfo.setValue(change, this.model, this.modelChange);
});
controls[fieldInfo.modelProperty] = formControl;
});
});
this.formGroup = new FormGroup(controls);
}
ngOnChanges(changes) {
var _a;
console.debug('ngOnChanges fluid-form changes:', JSON.stringify(changes));
if (changes['model']) {
const model = changes['model'].currentValue;
for (let key of Object.keys(model)) {
console.debug('ngOnChanges model key copying to form:', key);
const control = (_a = this.formGroup) === null || _a === void 0 ? void 0 : _a.controls[key];
control ? control.setValue(model[key], { emitEvent: false }) : console.warn('no control for model key ', key);
}
}
}
ngAfterViewInit() {
// console.debug("ngAfterViewInit")
}
ngAfterViewChecked() {
// console.debug("ngAfterViewChecked")
}
onSubmit() {
console.log(`Form submitted`);
}
}
FluidFormComponent.ɵfac = function FluidFormComponent_Factory(t) { return new (t || FluidFormComponent)(); };
FluidFormComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FluidFormComponent, selectors: [["cyng-fluid-form"]], inputs: { model: "model", modelProperty: "modelProperty", formInfo: "formInfo" }, outputs: { modelChange: "modelChange" }, features: [i0.ɵɵNgOnChangesFeature], decls: 3, vars: 4, consts: [[3, "formGroup", "title", "ngSubmit"], [4, "ngFor", "ngForOf"], ["pButton", "", 3, "disabled", "submit", 4, "ngIf"], ["class", "fieldset", 3, "legend", 4, "ngIf"], [1, "fieldset", 3, "legend"], [1, "ui-g", "ui-fluid"], ["class", "ui-g-12 ui-md-4 field", 4, "ngFor", "ngForOf"], [1, "ui-g-12", "ui-md-4", "field"], [1, "ui-inputgroup"], [4, "ngIf"], [1, "ui-chkbox-label"], [3, "name", "pTooltip", "formControlName"], [1, "ui-float-label"], ["pInputText", "", 3, "id", "name", "formControlName", "pTooltip", "type", "size"], [3, "for"], [3, "formControlName", "name", "options", "optionLabel", "pTooltip"], ["pButton", "", 3, "disabled", "submit"]], template: function FluidFormComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "form", 0);
i0.ɵɵlistener("ngSubmit", function FluidFormComponent_Template_form_ngSubmit_0_listener() { return ctx.onSubmit(); });
i0.ɵɵtemplate(1, FluidFormComponent_ng_container_1_Template, 2, 1, "ng-container", 1);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(2, FluidFormComponent_button_2_Template, 2, 2, "button", 2);
} if (rf & 2) {
i0.ɵɵproperty("formGroup", ctx.formGroup)("title", ctx.formInfo == null ? null : ctx.formInfo.title);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngForOf", ctx.formInfo == null ? null : ctx.formInfo.fieldsets);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.formInfo.showSubmitButton);
} }, directives: [i1.ɵNgNoValidate, i1.NgControlStatusGroup, i1.FormGroupDirective, i2.NgForOf, i2.NgIf, i3.Fieldset, i4.InputSwitch, i5.Tooltip, i1.NgControlStatus, i1.FormControlName, i1.DefaultValueAccessor, i6.InputText, i7.Dropdown, i8.ButtonDirective], styles: [".ui-chkbox-label[_ngcontent-%COMP%] {\n padding-right: 0.5em;\n }\n\n .ui-dropdown-label[_ngcontent-%COMP%] {\n align-self: center;\n padding-right: 0.5em\n }\n\n .field[_ngcontent-%COMP%]:nth-child(n+4) {\n margin-top: 1em; // otherwise overlap betwen a field and a floating label of the field below it\n }\n\n .fieldset[_ngcontent-%COMP%] {\n }"] });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FluidFormComponent, [{
type: Component,
args: [{
selector: 'cyng-fluid-form',
template: `
<form [formGroup]="formGroup" [title]="formInfo?.title" (ngSubmit)="onSubmit()">
<ng-container *ngFor="let fieldSetInfo of formInfo?.fieldsets">
<p-fieldset *ngIf="fieldSetInfo.showFieldsetForModel(model)" class="fieldset" legend="{{fieldSetInfo.legend}}">
<div class="ui-g ui-fluid">
<div class="ui-g-12 ui-md-4 field" *ngFor="let fieldInfo of fieldSetInfo.fieldInfos">
<div class="ui-inputgroup">
<ng-container *ngIf="fieldInfo.fieldType(model) === 'boolean'">
<span class="ui-chkbox-label">
{{fieldInfo.label}}
</span>
<p-inputSwitch
name="{{fieldInfo.modelProperty}}"
pTooltip="{{fieldInfo.tooltip}}"
formControlName="{{fieldInfo.modelProperty}}"
>
</p-inputSwitch>
</ng-container>
<ng-container
*ngIf="fieldInfo.fieldType(model) === 'string' || fieldInfo.fieldType(model) === 'number'">
<span class="ui-float-label">
<input pInputText
id="{{fieldInfo.modelProperty}}"
name="{{fieldInfo.modelProperty}}"
formControlName="{{fieldInfo.modelProperty}}"
[]="fieldInfo.tooltip"
[]="fieldInfo.inputType"
[]="fieldInfo.inputSize"
/>
<label for="{{fieldInfo.modelProperty}}">{{fieldInfo.label}}</label>
</span>
</ng-container>
<ng-container *ngIf="fieldInfo.fieldType(model) === 'options'">
<span class="ui-float-label">
<p-dropdown
formControlName="{{fieldInfo.modelProperty}}"
[]="fieldInfo.modelProperty"
[]="fieldInfo.options"
[]="fieldInfo.optionArrayLabelField"
[]="fieldInfo.tooltip"
></p-dropdown>
<label for="{{fieldInfo.modelProperty}}">{{fieldInfo.label}}</label>
</span>
</ng-container>
</div>
</div>
</div>
</p-fieldset>
</ng-container>
</form>
<button *ngIf="formInfo.showSubmitButton" pButton
[]="formInfo.disableSubmitOnFormInvalid && !formGroup.valid"
(submit)="onSubmit()">{{formInfo.submitText || 'Submit' }}</button>
`,
styles: [`
.ui-chkbox-label {
padding-right: 0.5em;
}
.ui-dropdown-label {
align-self: center;
padding-right: 0.5em
}
.field:nth-child(n+4) {
margin-top: 1em; // otherwise overlap betwen a field and a floating label of the field below it
}
.fieldset {
}
`]
}]
}], function () { return []; }, { model: [{
type: Input
}], modelChange: [{
type: Output
}], modelProperty: [{
type: Input
}], formInfo: [{
type: Input
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1aWQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jeXRvc2NhcGUtYW5ndWxhci9zcmMvbGliL2ZsdWlkLWZvcm0vZmx1aWQtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUM0QixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUMzRixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQW9CLFdBQVcsRUFBRSxTQUFTLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQTs7Ozs7Ozs7Ozs7SUFZdEUsNkJBQStEO0lBQzdELGdDQUE4QjtJQUM1QixZQUNGO0lBQUEsaUJBQU87SUFDUCxvQ0FLZ0I7SUFDbEIsMEJBQWU7OztJQVJYLGVBQ0Y7SUFERSxtREFDRjtJQUVFLGVBQWtDO0lBQWxDLDREQUFrQztJQUNsQywwREFBZ0M7SUFDaEMsdUVBQTZDOzs7SUFJakQsNkJBQzZGO0lBQzNGLGdDQUE2QjtJQUMzQiw0QkFPRTtJQUNGLGlDQUF5QztJQUFBLFlBQW1CO0lBQUEsaUJBQVE7SUFDdEUsaUJBQU87SUFDVCwwQkFBZTs7O0lBVEosZUFBZ0M7SUFBaEMsMERBQWdDO0lBQ2hDLDREQUFrQztJQUNsQyx1RUFBNkM7SUFDN0MsK0NBQThCLGdDQUFBLGdDQUFBO0lBSTlCLGVBQWlDO0lBQWpDLDJEQUFpQztJQUFDLGVBQW1CO0lBQW5CLHdDQUFtQjs7O0lBR2hFLDZCQUErRDtJQUM3RCxnQ0FBNkI7SUFDM0IsaUNBTWM7SUFDZCxpQ0FBeUM7SUFBQSxZQUFtQjtJQUFBLGlCQUFRO0lBQ3RFLGlCQUFPO0lBQ1QsMEJBQWU7OztJQVJULGVBQTZDO0lBQTdDLHVFQUE2QztJQUM3QyxpREFBZ0MsaUNBQUEsbURBQUEsa0NBQUE7SUFLM0IsZUFBaUM7SUFBakMsMkRBQWlDO0lBQUMsZUFBbUI7SUFBbkIsd0NBQW1COzs7SUFwQ3BF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O0dBcURUO2dCQUNELE1BQU0sRUFBRSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JSLENBQUM7YUFDSDtzQ0FHQyxLQUFLO2tCQURKLEtBQUs7WUFHTixXQUFXO2tCQURWLE1BQU07WUFJUCxhQUFhO2tCQURaLEtBQUs7WUFHTixRQUFRO2tCQURQLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdDaGVja2VkLCBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IEFzeW5jVmFsaWRhdG9yRm4sIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQgeyBGb3JtSW5mbyB9IGZyb20gJy4vZm9ybS1pbmZvJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjeW5nLWZsdWlkLWZvcm0nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgW3RpdGxlXT1cImZvcm1JbmZvPy50aXRsZVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZFNldEluZm8gb2YgZm9ybUluZm8/LmZpZWxkc2V0c1wiPlxuICAgICAgICA8cC1maWVsZHNldCAqbmdJZj1cImZpZWxkU2V0SW5mby5zaG93RmllbGRzZXRGb3JNb2RlbChtb2RlbClcIiBjbGFzcz1cImZpZWxkc2V0XCIgbGVnZW5kPVwie3tmaWVsZFNldEluZm8ubGVnZW5kfX1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidWktZyB1aS1mbHVpZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWctMTIgdWktbWQtNCBmaWVsZFwiICpuZ0Zvcj1cImxldCBmaWVsZEluZm8gb2YgZmllbGRTZXRJbmZvLmZpZWxkSW5mb3NcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVpLWlucHV0Z3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGRJbmZvLmZpZWxkVHlwZShtb2RlbCkgPT09ICdib29sZWFuJ1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1aS1jaGtib3gtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAge3tmaWVsZEluZm8ubGFiZWx9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHAtaW5wdXRTd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cInt7ZmllbGRJbmZvLm1vZGVsUHJvcGVydHl9fVwiXG4gICAgICAgICAgICAgICAgICAgIHBUb29sdGlwPVwie3tmaWVsZEluZm8udG9vbHRpcH19XCJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3tmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eX19XCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDwvcC1pbnB1dFN3aXRjaD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImZpZWxkSW5mby5maWVsZFR5cGUobW9kZWwpID09PSAnc3RyaW5nJyB8fCBmaWVsZEluZm8uZmllbGRUeXBlKG1vZGVsKSA9PT0gJ251bWJlcidcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidWktZmxvYXQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwie3tmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7e2ZpZWxkSW5mby5tb2RlbFByb3BlcnR5fX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3tmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJmaWVsZEluZm8udG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJmaWVsZEluZm8uaW5wdXRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cImZpZWxkSW5mby5pbnB1dFNpemVcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwie3tmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eX19XCI+e3tmaWVsZEluZm8ubGFiZWx9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkSW5mby5maWVsZFR5cGUobW9kZWwpID09PSAnb3B0aW9ucydcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidWktZmxvYXQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7e2ZpZWxkSW5mby5tb2RlbFByb3BlcnR5fX1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImZpZWxkSW5mby5tb2RlbFByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJmaWVsZEluZm8ub3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkxhYmVsXT1cImZpZWxkSW5mby5vcHRpb25BcnJheUxhYmVsRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtwVG9vbHRpcF09XCJmaWVsZEluZm8udG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ7e2ZpZWxkSW5mby5tb2RlbFByb3BlcnR5fX1cIj57e2ZpZWxkSW5mby5sYWJlbH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9wLWZpZWxkc2V0PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9mb3JtPlxuICAgIDxidXR0b24gKm5nSWY9XCJmb3JtSW5mby5zaG93U3VibWl0QnV0dG9uXCIgcEJ1dHRvblxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm1JbmZvLmRpc2FibGVTdWJtaXRPbkZvcm1JbnZhbGlkICYmICFmb3JtR3JvdXAudmFsaWRcIlxuICAgICAgICAgICAgKHN1Ym1pdCk9XCJvblN1Ym1pdCgpXCI+e3tmb3JtSW5mby5zdWJtaXRUZXh0IHx8ICdTdWJtaXQnIH19PC9idXR0b24+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICAudWktY2hrYm94LWxhYmVsIHtcbiAgICAgIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xuICAgIH1cblxuICAgIC51aS1kcm9wZG93bi1sYWJlbCB7XG4gICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbVxuICAgIH1cblxuICAgIC5maWVsZDpudGgtY2hpbGQobis0KSB7XG4gICAgICAgIG1hcmdpbi10b3A6IDFlbTsgLy8gb3RoZXJ3aXNlIG92ZXJsYXAgYmV0d2VuIGEgZmllbGQgYW5kIGEgZmxvYXRpbmcgbGFiZWwgb2YgdGhlIGZpZWxkIGJlbG93IGl0XG4gICAgfVxuXG4gICAgLmZpZWxkc2V0IHtcbiAgICB9XG4gIGBdXG59KVxuZXhwb3J0IGNsYXNzIEZsdWlkRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkIHtcbiAgQElucHV0KClcbiAgbW9kZWw6IG9iamVjdFxuICBAT3V0cHV0KClcbiAgbW9kZWxDaGFuZ2U6IEV2ZW50RW1pdHRlcjxvYmplY3Q+ID0gbmV3IEV2ZW50RW1pdHRlcjxvYmplY3Q+KClcblxuICBASW5wdXQoKVxuICBtb2RlbFByb3BlcnR5OiBzdHJpbmdcbiAgQElucHV0KClcbiAgZm9ybUluZm86IEZvcm1JbmZvXG5cbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXBcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ0ZsdWlkRm9ybUNvbXBvbmVudCB0aGlzLmZvcm1JbmZvOicsIEpTT04uc3RyaW5naWZ5KHRoaXMuZm9ybUluZm8pKVxuICAgIGxldCBjb250cm9scyA9IHt9XG4gICAgdGhpcy5mb3JtSW5mby5maWVsZHNldHMuZm9yRWFjaChmaWVsZHNldEluZm8gPT4ge1xuICAgICAgZmllbGRzZXRJbmZvLmZpZWxkSW5mb3MuZm9yRWFjaChmaWVsZEluZm8gPT4ge1xuICAgICAgICBsZXQgbW9kZWxWYWx1ZSA9IHRoaXMubW9kZWxbZmllbGRJbmZvLm1vZGVsUHJvcGVydHldXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eTonLCBmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eSwgJywgbW9kZWxWYWx1ZTonLCBtb2RlbFZhbHVlKVxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBWYWxpZGF0b3JGbltdID0gdHlwZW9mIGZpZWxkSW5mby52YWxpZGF0b3JzID09PSAnZnVuY3Rpb24nID8gZmllbGRJbmZvLnZhbGlkYXRvcnMoKSA6IGZpZWxkSW5mby52YWxpZGF0b3JzXG4gICAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9yczogQXN5bmNWYWxpZGF0b3JGbltdID0gdHlwZW9mIGZpZWxkSW5mby5hc3luY1ZhbGlkYXRvcnMgPT09ICdmdW5jdGlvbicgPyBmaWVsZEluZm8uYXN5bmNWYWxpZGF0b3JzKCkgOiBmaWVsZEluZm8uYXN5bmNWYWxpZGF0b3JzXG4gICAgICAgIGNvbnN0IHsgdXBkYXRlT24gfSA9IGZpZWxkSW5mb1xuICAgICAgICBsZXQgZm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wobW9kZWxWYWx1ZSwge3ZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycywgdXBkYXRlT24gfSlcbiAgICAgICAgZm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSggKGNoYW5nZSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ2Zvcm0gY29udHJvbCBjaGFuZ2UgJywgSlNPTi5zdHJpbmdpZnkoY2hhbmdlKSwgJyBmb3IgcHJvcCAnLCBmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eSxcbiAgICAgICAgICAgICcsIGNoYW5naW5nIGN1cnJlbnQgbW9kZWwgdmFsdWUgJywgdGhpcy5tb2RlbFtmaWVsZEluZm8ubW9kZWxQcm9wZXJ0eV0sICcgdG8gJywgY2hhbmdlKVxuICAgICAgICAgIGZpZWxkSW5mby5zZXRWYWx1ZShjaGFuZ2UsIHRoaXMubW9kZWwsIHRoaXMubW9kZWxDaGFuZ2UpXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRyb2xzW2ZpZWxkSW5mby5tb2RlbFByb3BlcnR5XSA9IGZvcm1Db250cm9sXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5mb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKGNvbnRyb2xzKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZGVidWcoJ25nT25DaGFuZ2VzIGZsdWlkLWZvcm0gY2hhbmdlczonLCBKU09OLnN0cmluZ2lmeShjaGFuZ2VzKSlcbiAgICBpZiAoY2hhbmdlc1snbW9kZWwnXSkge1xuICAgICAgY29uc3QgbW9kZWwgPSBjaGFuZ2VzWydtb2RlbCddLmN1cnJlbnRWYWx1ZVxuICAgICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKG1vZGVsKSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCduZ09uQ2hhbmdlcyBtb2RlbCBrZXkgY29weWluZyB0byBmb3JtOicsIGtleSlcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUdyb3VwPy5jb250cm9sc1trZXldXG4gICAgICAgIGNvbnRyb2wgPyBjb250cm9sLnNldFZhbHVlKG1vZGVsW2tleV0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KSA6IGNvbnNvbGUud2Fybignbm8gY29udHJvbCBmb3IgbW9kZWwga2V5ICcsIGtleSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgLy8gY29uc29sZS5kZWJ1ZyhcIm5nQWZ0ZXJWaWV3SW5pdFwiKVxuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIC8vIGNvbnNvbGUuZGVidWcoXCJuZ0FmdGVyVmlld0NoZWNrZWRcIilcbiAgfVxuXG4gIG9uU3VibWl0KCkge1xuICAgIGNvbnNvbGUubG9nKGBGb3JtIHN1Ym1pdHRlZGApXG4gIH1cbn1cbiJdfQ==