ngx-material-entity 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CONTRIBUTING.md +93 -0
- package/LICENSE.md +21 -0
- package/README.md +691 -0
- package/classes/entity-model.class.d.ts +9 -0
- package/classes/entity-service.class.d.ts +56 -0
- package/classes/entity-utilities.class.d.ts +95 -0
- package/components/confirm-dialog/confirm-dialog-data.d.ts +41 -0
- package/components/confirm-dialog/confirm-dialog.component.d.ts +18 -0
- package/components/confirm-dialog/confirm-dialog.module.d.ts +12 -0
- package/components/get-validation-error-message.function.d.ts +7 -0
- package/components/input/array-table/add-array-item-dialog/add-array-item-dialog.component.d.ts +35 -0
- package/components/input/array-table/add-array-item-dialog/add-array-item-dialog.module.d.ts +12 -0
- package/components/input/array-table/array-table.component.d.ts +34 -0
- package/components/input/array-table/array-table.module.d.ts +19 -0
- package/components/input/input.component.d.ts +73 -0
- package/components/input/input.module.d.ts +18 -0
- package/components/input/internal-input/internal-input.component.d.ts +57 -0
- package/components/input/internal-input/internal-input.module.d.ts +16 -0
- package/components/table/create-dialog/create-entity-dialog-data.d.ts +21 -0
- package/components/table/create-dialog/create-entity-dialog.component.d.ts +25 -0
- package/components/table/create-dialog/create-entity-dialog.module.d.ts +12 -0
- package/components/table/edit-dialog/edit-entity-dialog-data.d.ts +25 -0
- package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +28 -0
- package/components/table/edit-dialog/edit-entity-dialog.module.d.ts +13 -0
- package/components/table/table-data.d.ts +184 -0
- package/components/table/table.component.d.ts +41 -0
- package/components/table/table.module.d.ts +17 -0
- package/decorators/array.decorator.d.ts +125 -0
- package/decorators/base/base-property.decorator.d.ts +9 -0
- package/decorators/base/decorator-types.enum.d.ts +28 -0
- package/decorators/base/property-decorator-config.interface.d.ts +50 -0
- package/decorators/boolean.decorator.d.ts +42 -0
- package/decorators/number.decorator.d.ts +40 -0
- package/decorators/object.decorator.d.ts +27 -0
- package/decorators/string.decorator.d.ts +76 -0
- package/esm2020/classes/entity-model.class.mjs +19 -0
- package/esm2020/classes/entity-service.class.mjs +70 -0
- package/esm2020/classes/entity-utilities.class.mjs +296 -0
- package/esm2020/components/confirm-dialog/confirm-dialog-data.mjs +2 -0
- package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +51 -0
- package/esm2020/components/confirm-dialog/confirm-dialog.module.mjs +22 -0
- package/esm2020/components/get-validation-error-message.function.mjs +32 -0
- package/esm2020/components/input/array-table/add-array-item-dialog/add-array-item-dialog.component.mjs +43 -0
- package/esm2020/components/input/array-table/add-array-item-dialog/add-array-item-dialog.module.mjs +22 -0
- package/esm2020/components/input/array-table/array-table.component.mjs +116 -0
- package/esm2020/components/input/array-table/array-table.module.mjs +66 -0
- package/esm2020/components/input/input.component.mjs +158 -0
- package/esm2020/components/input/input.module.mjs +62 -0
- package/esm2020/components/input/internal-input/internal-input.component.mjs +73 -0
- package/esm2020/components/input/internal-input/internal-input.module.mjs +54 -0
- package/esm2020/components/table/create-dialog/create-entity-dialog-data.mjs +2 -0
- package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +77 -0
- package/esm2020/components/table/create-dialog/create-entity-dialog.module.mjs +22 -0
- package/esm2020/components/table/edit-dialog/edit-entity-dialog-data.mjs +2 -0
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +112 -0
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.module.mjs +42 -0
- package/esm2020/components/table/table-data.mjs +2 -0
- package/esm2020/components/table/table.component.mjs +232 -0
- package/esm2020/components/table/table.module.mjs +58 -0
- package/esm2020/decorators/array.decorator.mjs +70 -0
- package/esm2020/decorators/base/base-property.decorator.mjs +13 -0
- package/esm2020/decorators/base/decorator-types.enum.mjs +20 -0
- package/esm2020/decorators/base/property-decorator-config.interface.mjs +31 -0
- package/esm2020/decorators/boolean.decorator.mjs +44 -0
- package/esm2020/decorators/number.decorator.mjs +36 -0
- package/esm2020/decorators/object.decorator.mjs +23 -0
- package/esm2020/decorators/string.decorator.mjs +61 -0
- package/esm2020/ngx-material-entity.mjs +5 -0
- package/esm2020/public-api.mjs +32 -0
- package/fesm2015/ngx-material-entity.mjs +1786 -0
- package/fesm2015/ngx-material-entity.mjs.map +1 -0
- package/fesm2020/ngx-material-entity.mjs +1760 -0
- package/fesm2020/ngx-material-entity.mjs.map +1 -0
- package/ngx-material-entity.d.ts +5 -0
- package/package.json +40 -0
- package/public-api.d.ts +25 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { EntityUtilities } from '../../classes/entity-utilities.class';
|
|
3
|
+
import { DecoratorTypes } from '../../decorators/base/decorator-types.enum';
|
|
4
|
+
import { getValidationErrorMessage } from '../get-validation-error-message.function';
|
|
5
|
+
import { cloneDeep } from 'lodash';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/material/form-field";
|
|
8
|
+
import * as i2 from "@angular/material/autocomplete";
|
|
9
|
+
import * as i3 from "@angular/material/core";
|
|
10
|
+
import * as i4 from "@angular/material/select";
|
|
11
|
+
import * as i5 from "@angular/material/checkbox";
|
|
12
|
+
import * as i6 from "@angular/material/slide-toggle";
|
|
13
|
+
import * as i7 from "./array-table/array-table.component";
|
|
14
|
+
import * as i8 from "@angular/material/chips";
|
|
15
|
+
import * as i9 from "@angular/material/icon";
|
|
16
|
+
import * as i10 from "@angular/common";
|
|
17
|
+
import * as i11 from "@angular/material/input";
|
|
18
|
+
import * as i12 from "@angular/forms";
|
|
19
|
+
import * as i13 from "@angular/cdk/text-field";
|
|
20
|
+
export class NgxMatEntityInputComponent {
|
|
21
|
+
constructor() {
|
|
22
|
+
this.chipsInput = '';
|
|
23
|
+
this.DecoratorTypes = DecoratorTypes;
|
|
24
|
+
this.getWidth = EntityUtilities.getWidth;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Helper method needed to recursively generate property input components (used eg. with the object)
|
|
28
|
+
*/
|
|
29
|
+
trackByFn(index) {
|
|
30
|
+
return index;
|
|
31
|
+
}
|
|
32
|
+
ngOnInit() {
|
|
33
|
+
if (!this.entity) {
|
|
34
|
+
throw new Error('Missing required Input data "entity"');
|
|
35
|
+
}
|
|
36
|
+
if (!this.propertyKey) {
|
|
37
|
+
throw new Error('Missing required Input data "propertyKey"');
|
|
38
|
+
}
|
|
39
|
+
this.type = EntityUtilities.getPropertyType(this.entity, this.propertyKey);
|
|
40
|
+
this.metadata = EntityUtilities.getPropertyMetadata(this.entity, this.propertyKey, this.type);
|
|
41
|
+
this.metadataDefaultString = this.metadata;
|
|
42
|
+
this.metadataTextboxString = this.metadata;
|
|
43
|
+
this.metadataAutocompleteString = this.metadata;
|
|
44
|
+
this.autocompleteStrings = this.metadataAutocompleteString.autocompleteValues;
|
|
45
|
+
this.filteredAutocompleteStrings = cloneDeep(this.autocompleteStrings);
|
|
46
|
+
this.metadataDropdownString = this.metadata;
|
|
47
|
+
this.metadataDropdownBoolean = this.metadata;
|
|
48
|
+
this.metadataDefaultNumber = this.metadata;
|
|
49
|
+
this.metadataDropdownNumber = this.metadata;
|
|
50
|
+
this.metadataDefaultObject = this.metadata;
|
|
51
|
+
this.objectProperty = this.entity[this.propertyKey];
|
|
52
|
+
this.metadataEntityArray = this.metadata;
|
|
53
|
+
if (this.metadataEntityArray.EntityClass) {
|
|
54
|
+
if (!this.entity[this.propertyKey]) {
|
|
55
|
+
this.entity[this.propertyKey] = [];
|
|
56
|
+
}
|
|
57
|
+
this.entityArrayValues = this.entity[this.propertyKey];
|
|
58
|
+
if (this.metadataEntityArray.createInline === undefined) {
|
|
59
|
+
this.metadataEntityArray.createInline = true;
|
|
60
|
+
}
|
|
61
|
+
if (!this.metadataEntityArray.createInline && !this.metadataEntityArray.createDialogData) {
|
|
62
|
+
this.metadataEntityArray.createDialogData = {
|
|
63
|
+
title: 'Add'
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
this.metadataStringChipsArray = this.metadata;
|
|
68
|
+
if (this.metadataStringChipsArray.itemType
|
|
69
|
+
&& this.entity[this.propertyKey]?.length) {
|
|
70
|
+
this.stringChipsArrayValues = this.entity[this.propertyKey];
|
|
71
|
+
}
|
|
72
|
+
this.metadataAutocompleteStringChipsArray = this.metadata;
|
|
73
|
+
if (!this.getValidationErrorMessage) {
|
|
74
|
+
this.getValidationErrorMessage = getValidationErrorMessage;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
getObjectProperties() {
|
|
78
|
+
const res = [];
|
|
79
|
+
for (const property in this.objectProperty) {
|
|
80
|
+
const metadata = EntityUtilities.getPropertyMetadata(this.objectProperty, property, EntityUtilities.getPropertyType(this.objectProperty, property));
|
|
81
|
+
if (!(this.hideOmitForCreate && metadata.omitForCreate)
|
|
82
|
+
&& !(this.hideOmitForEdit && metadata.omitForUpdate)) {
|
|
83
|
+
res.push(property);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return res.sort((a, b) => EntityUtilities.compareOrder(a, b, this.objectProperty));
|
|
87
|
+
}
|
|
88
|
+
addStringChipArrayValue(event) {
|
|
89
|
+
const value = (event.value || '').trim();
|
|
90
|
+
if (value) {
|
|
91
|
+
if (this.metadataStringChipsArray.minLength && value.length < this.metadataStringChipsArray.minLength) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (this.metadataStringChipsArray.maxLength && value.length > this.metadataStringChipsArray.maxLength) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (this.metadataStringChipsArray.regex && !value.match(this.metadataStringChipsArray.regex)) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (!this.stringChipsArrayValues) {
|
|
101
|
+
if (!this.entity[this.propertyKey]) {
|
|
102
|
+
this.entity[this.propertyKey] = [];
|
|
103
|
+
}
|
|
104
|
+
this.stringChipsArrayValues = this.entity[this.propertyKey];
|
|
105
|
+
}
|
|
106
|
+
this.stringChipsArrayValues.push(value);
|
|
107
|
+
}
|
|
108
|
+
event.chipInput.clear();
|
|
109
|
+
}
|
|
110
|
+
removeStringChipArrayValue(value) {
|
|
111
|
+
this.stringChipsArrayValues.splice(this.stringChipsArrayValues.indexOf(value), 1);
|
|
112
|
+
if (!this.stringChipsArrayValues.length) {
|
|
113
|
+
this.entity[this.propertyKey] = undefined;
|
|
114
|
+
this.stringChipsArrayValues = this.entity[this.propertyKey];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
selected(event, chipsInput) {
|
|
118
|
+
const value = (event.option.viewValue || '').trim();
|
|
119
|
+
if (this.metadataStringChipsArray.minLength && value.length < this.metadataStringChipsArray.minLength) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (this.metadataStringChipsArray.maxLength && value.length > this.metadataStringChipsArray.maxLength) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (this.metadataStringChipsArray.regex && !value.match(this.metadataStringChipsArray.regex)) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (!this.stringChipsArrayValues) {
|
|
129
|
+
if (!this.entity[this.propertyKey]) {
|
|
130
|
+
this.entity[this.propertyKey] = [];
|
|
131
|
+
}
|
|
132
|
+
this.stringChipsArrayValues = this.entity[this.propertyKey];
|
|
133
|
+
}
|
|
134
|
+
this.stringChipsArrayValues.push(value);
|
|
135
|
+
chipsInput.value = '';
|
|
136
|
+
}
|
|
137
|
+
filterAutocompleteStrings(input) {
|
|
138
|
+
const filterValue = input.toLowerCase();
|
|
139
|
+
this.filteredAutocompleteStrings = this.autocompleteStrings.filter(s => s.toLowerCase().includes(filterValue));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
NgxMatEntityInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
143
|
+
NgxMatEntityInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: { entity: "entity", propertyKey: "propertyKey", getValidationErrorMessage: "getValidationErrorMessage", hideOmitForCreate: "hideOmitForCreate", hideOmitForEdit: "hideOmitForEdit" }, ngImport: i0, template: "<div [ngSwitch]=\"type\" *ngIf=\"!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)\">\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.STRING\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [required]=\"metadata.required ? metadata.required : false\"\n [pattern]=\"metadataDefaultString.regex ? metadataDefaultString.regex : '[\\\\s\\\\S]*'\"\n [minlength]=\"metadataDefaultString.minLength ? metadataDefaultString.minLength : null\"\n [maxlength]=\"metadataDefaultString.maxLength ? metadataDefaultString.maxLength : null\"\n />\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_TEXTBOX\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <textarea\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"10\"\n [required]=\"metadata.required ? metadata.required : false\"\n [minlength]=\"metadataTextboxString.minLength ? metadataTextboxString.minLength : null\"\n [maxlength]=\"metadataTextboxString.maxLength ? metadataTextboxString.maxLength : null\"\n >\n </textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_AUTOCOMPLETE\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [matAutocomplete]=\"auto\"\n (keyup)=\"filterAutocompleteStrings(entity[propertyKey])\"\n [required]=\"metadata.required ? metadata.required : false\"\n [minlength]=\"metadataAutocompleteString.minLength ? metadataAutocompleteString.minLength : null\"\n [maxlength]=\"metadataAutocompleteString.maxLength ? metadataAutocompleteString.maxLength : null\"\n [pattern]=\"metadataAutocompleteString.regex ? metadataAutocompleteString.regex : '[\\\\s\\\\S]*'\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let value of filteredAutocompleteStrings\" [value]=\"value\">\n {{value}}\n </mat-option>\n </mat-autocomplete>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required ? metadata.required : false\">\n <mat-option *ngFor=\"let value of metadataDropdownString.dropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_CHECKBOX\">\n <mat-form-field>\n <mat-checkbox [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required ? metadata.required : false\">\n {{metadata.displayName}}\n </mat-checkbox>\n <!-- hidden input is needed so that the checkbox can be used inside a mat-form-field -->\n <textarea matInput hidden></textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_TOGGLE\">\n <mat-form-field>\n <mat-slide-toggle [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required ? metadata.required : false\">\n {{metadata.displayName}}\n </mat-slide-toggle>\n <!-- hidden input is needed so that the toggle can be used inside a mat-form-field -->\n <textarea matInput hidden></textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required ? metadata.required : false\">\n <mat-option [value]=\"undefined\">-</mat-option>\n <mat-option [value]=\"true\">{{metadataDropdownBoolean.dropdownTrue}}</mat-option>\n <mat-option [value]=\"false\">{{metadataDropdownBoolean.dropdownFalse}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n type=\"number\"\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [required]=\"metadata.required ? metadata.required : false\"\n [min]=\"metadataDefaultNumber.min ? metadataDefaultNumber.min : null\"\n [max]=\"metadataDefaultNumber.max ? metadataDefaultNumber.max : null\"\n />\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required ? metadata.required : false\">\n <mat-option *ngFor=\"let value of metadataDropdownNumber.dropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.OBJECT\">\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <div class=\"row\">\n <!--\n displays another ngx-material-entity with the:\n object as the entity,\n the current key in the loop received by the keyvalue direction as the propertyKey\n and the getValidationErrorMessage of the current component\n -->\n <ngx-mat-entity-input\n *ngFor=\"let key of getObjectProperties(); let i = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n class=\"col-lg-{{getWidth(objectProperty, key, 'lg')}} col-md-{{getWidth(objectProperty, key, 'md')}} col-sm-{{getWidth(objectProperty, key, 'sm')}}\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY\">\n <ngx-mat-entity-array-table\n [arrayItems]=\"entityArrayValues\"\n [metadata]=\"metadataEntityArray\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [omit]=\"hideOmitForCreate ? 'create' : 'edit'\"\n >\n </ngx-mat-entity-array-table>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_CHIPS\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-list #chipList\n [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\"\n [required]=\"metadata.required ? metadata.required : false\"\n >\n <mat-chip *ngFor=\"let value of stringChipsArrayValues\" (removed)=\"removeStringChipArrayValue(value)\">\n {{value}}\n <button matChipRemove *ngIf=\"metadataStringChipsArray.deleteHtml\" [innerHtml]=\"metadataStringChipsArray.deleteHtml\">\n </button>\n <button matChipRemove *ngIf=\"!metadataStringChipsArray.deleteHtml\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n <input matInput\n [matChipInputFor]=\"chipList\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addStringChipArrayValue($event)\"\n [(ngModel)]=\"chipsInput\" [name]=\"propertyKey.toString()\" #chipsModel=\"ngModel\"\n [minlength]='metadataStringChipsArray.minLength ? metadataStringChipsArray.minLength : null'\n [maxlength]='metadataStringChipsArray.maxLength ? metadataStringChipsArray.maxLength : null'\n [pattern]=\"metadataStringChipsArray.regex ? metadataStringChipsArray.regex : '[\\\\s\\\\S]*'\"\n >\n <mat-error *ngIf=\"chipsModel.errors\">{{getValidationErrorMessage(chipsModel)}}</mat-error>\n </mat-chip-list>\n <mat-error *ngIf=\"!chipsModel.errors\">{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-list #chipList\n [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\"\n [required]=\"metadata.required ? metadata.required : false\"\n >\n <mat-chip *ngFor=\"let value of stringChipsArrayValues\" (removed)=\"removeStringChipArrayValue(value)\">\n {{value}}\n <button matChipRemove *ngIf=\"metadataStringChipsArray.deleteHtml\" [innerHtml]=\"metadataStringChipsArray.deleteHtml\">\n </button>\n <button matChipRemove *ngIf=\"!metadataStringChipsArray.deleteHtml\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n <input matInput\n [matChipInputFor]=\"chipList\"\n [matAutocomplete]=\"auto\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addStringChipArrayValue($event)\"\n (keyup)=\"filterAutocompleteStrings(chipsInput)\"\n [(ngModel)]=\"chipsInput\" [name]=\"propertyKey.toString()\" #chipsModel=\"ngModel\"\n #chipsElement\n [minlength]='metadataStringChipsArray.minLength ? metadataStringChipsArray.minLength : null'\n [maxlength]='metadataStringChipsArray.maxLength ? metadataStringChipsArray.maxLength : null'\n [pattern]=\"metadataStringChipsArray.regex ? metadataStringChipsArray.regex : '[\\\\s\\\\S]*'\"\n >\n <mat-error *ngIf=\"chipsModel.errors\">{{getValidationErrorMessage(chipsModel)}}</mat-error>\n </mat-chip-list>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event, chipsElement)\">\n <mat-option *ngFor=\"let value of filteredAutocompleteStrings\" [value]=\"value\">\n {{value}}\n </mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"!chipsModel.errors\">{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchDefault>ERROR: The type {{type}}is not known.</div>\n</div>", styles: ["mat-form-field{width:100%}\n"], components: [{ type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i4.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i6.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: ["entity", "propertyKey", "getValidationErrorMessage", "hideOmitForCreate", "hideOmitForEdit"] }, { type: i7.NgxMatEntityArrayTableComponent, selector: "ngx-mat-entity-array-table", inputs: ["arrayItems", "metadata", "getValidationErrorMessage", "omit"] }, { type: i8.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i10.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i1.MatLabel, selector: "mat-label" }, { type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i12.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i12.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { type: i12.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { type: i12.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i1.MatError, selector: "mat-error", inputs: ["id"] }, { type: i13.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { type: i2.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.MatCheckboxRequiredValidator, selector: "mat-checkbox[required][formControlName], mat-checkbox[required][formControl], mat-checkbox[required][ngModel]" }, { type: i6.MatSlideToggleRequiredValidator, selector: "mat-slide-toggle[required][formControlName], mat-slide-toggle[required][formControl], mat-slide-toggle[required][ngModel]" }, { type: i12.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i12.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i12.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { type: i8.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i8.MatChipRemove, selector: "[matChipRemove]" }, { type: i8.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i10.NgSwitchDefault, selector: "[ngSwitchDefault]" }] });
|
|
144
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityInputComponent, decorators: [{
|
|
145
|
+
type: Component,
|
|
146
|
+
args: [{ selector: 'ngx-mat-entity-input', template: "<div [ngSwitch]=\"type\" *ngIf=\"!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)\">\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.STRING\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [required]=\"metadata.required ? metadata.required : false\"\n [pattern]=\"metadataDefaultString.regex ? metadataDefaultString.regex : '[\\\\s\\\\S]*'\"\n [minlength]=\"metadataDefaultString.minLength ? metadataDefaultString.minLength : null\"\n [maxlength]=\"metadataDefaultString.maxLength ? metadataDefaultString.maxLength : null\"\n />\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_TEXTBOX\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <textarea\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"10\"\n [required]=\"metadata.required ? metadata.required : false\"\n [minlength]=\"metadataTextboxString.minLength ? metadataTextboxString.minLength : null\"\n [maxlength]=\"metadataTextboxString.maxLength ? metadataTextboxString.maxLength : null\"\n >\n </textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_AUTOCOMPLETE\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [matAutocomplete]=\"auto\"\n (keyup)=\"filterAutocompleteStrings(entity[propertyKey])\"\n [required]=\"metadata.required ? metadata.required : false\"\n [minlength]=\"metadataAutocompleteString.minLength ? metadataAutocompleteString.minLength : null\"\n [maxlength]=\"metadataAutocompleteString.maxLength ? metadataAutocompleteString.maxLength : null\"\n [pattern]=\"metadataAutocompleteString.regex ? metadataAutocompleteString.regex : '[\\\\s\\\\S]*'\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let value of filteredAutocompleteStrings\" [value]=\"value\">\n {{value}}\n </mat-option>\n </mat-autocomplete>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required ? metadata.required : false\">\n <mat-option *ngFor=\"let value of metadataDropdownString.dropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_CHECKBOX\">\n <mat-form-field>\n <mat-checkbox [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required ? metadata.required : false\">\n {{metadata.displayName}}\n </mat-checkbox>\n <!-- hidden input is needed so that the checkbox can be used inside a mat-form-field -->\n <textarea matInput hidden></textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_TOGGLE\">\n <mat-form-field>\n <mat-slide-toggle [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required ? metadata.required : false\">\n {{metadata.displayName}}\n </mat-slide-toggle>\n <!-- hidden input is needed so that the toggle can be used inside a mat-form-field -->\n <textarea matInput hidden></textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required ? metadata.required : false\">\n <mat-option [value]=\"undefined\">-</mat-option>\n <mat-option [value]=\"true\">{{metadataDropdownBoolean.dropdownTrue}}</mat-option>\n <mat-option [value]=\"false\">{{metadataDropdownBoolean.dropdownFalse}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n type=\"number\"\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [required]=\"metadata.required ? metadata.required : false\"\n [min]=\"metadataDefaultNumber.min ? metadataDefaultNumber.min : null\"\n [max]=\"metadataDefaultNumber.max ? metadataDefaultNumber.max : null\"\n />\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\" [required]=\"metadata.required ? metadata.required : false\">\n <mat-option *ngFor=\"let value of metadataDropdownNumber.dropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.OBJECT\">\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <div class=\"row\">\n <!--\n displays another ngx-material-entity with the:\n object as the entity,\n the current key in the loop received by the keyvalue direction as the propertyKey\n and the getValidationErrorMessage of the current component\n -->\n <ngx-mat-entity-input\n *ngFor=\"let key of getObjectProperties(); let i = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n class=\"col-lg-{{getWidth(objectProperty, key, 'lg')}} col-md-{{getWidth(objectProperty, key, 'md')}} col-sm-{{getWidth(objectProperty, key, 'sm')}}\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY\">\n <ngx-mat-entity-array-table\n [arrayItems]=\"entityArrayValues\"\n [metadata]=\"metadataEntityArray\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [omit]=\"hideOmitForCreate ? 'create' : 'edit'\"\n >\n </ngx-mat-entity-array-table>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_CHIPS\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-list #chipList\n [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\"\n [required]=\"metadata.required ? metadata.required : false\"\n >\n <mat-chip *ngFor=\"let value of stringChipsArrayValues\" (removed)=\"removeStringChipArrayValue(value)\">\n {{value}}\n <button matChipRemove *ngIf=\"metadataStringChipsArray.deleteHtml\" [innerHtml]=\"metadataStringChipsArray.deleteHtml\">\n </button>\n <button matChipRemove *ngIf=\"!metadataStringChipsArray.deleteHtml\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n <input matInput\n [matChipInputFor]=\"chipList\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addStringChipArrayValue($event)\"\n [(ngModel)]=\"chipsInput\" [name]=\"propertyKey.toString()\" #chipsModel=\"ngModel\"\n [minlength]='metadataStringChipsArray.minLength ? metadataStringChipsArray.minLength : null'\n [maxlength]='metadataStringChipsArray.maxLength ? metadataStringChipsArray.maxLength : null'\n [pattern]=\"metadataStringChipsArray.regex ? metadataStringChipsArray.regex : '[\\\\s\\\\S]*'\"\n >\n <mat-error *ngIf=\"chipsModel.errors\">{{getValidationErrorMessage(chipsModel)}}</mat-error>\n </mat-chip-list>\n <mat-error *ngIf=\"!chipsModel.errors\">{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-chip-list #chipList\n [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\"\n [required]=\"metadata.required ? metadata.required : false\"\n >\n <mat-chip *ngFor=\"let value of stringChipsArrayValues\" (removed)=\"removeStringChipArrayValue(value)\">\n {{value}}\n <button matChipRemove *ngIf=\"metadataStringChipsArray.deleteHtml\" [innerHtml]=\"metadataStringChipsArray.deleteHtml\">\n </button>\n <button matChipRemove *ngIf=\"!metadataStringChipsArray.deleteHtml\">\n <mat-icon>cancel</mat-icon>\n </button>\n </mat-chip>\n <input matInput\n [matChipInputFor]=\"chipList\"\n [matAutocomplete]=\"auto\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"addStringChipArrayValue($event)\"\n (keyup)=\"filterAutocompleteStrings(chipsInput)\"\n [(ngModel)]=\"chipsInput\" [name]=\"propertyKey.toString()\" #chipsModel=\"ngModel\"\n #chipsElement\n [minlength]='metadataStringChipsArray.minLength ? metadataStringChipsArray.minLength : null'\n [maxlength]='metadataStringChipsArray.maxLength ? metadataStringChipsArray.maxLength : null'\n [pattern]=\"metadataStringChipsArray.regex ? metadataStringChipsArray.regex : '[\\\\s\\\\S]*'\"\n >\n <mat-error *ngIf=\"chipsModel.errors\">{{getValidationErrorMessage(chipsModel)}}</mat-error>\n </mat-chip-list>\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event, chipsElement)\">\n <mat-option *ngFor=\"let value of filteredAutocompleteStrings\" [value]=\"value\">\n {{value}}\n </mat-option>\n </mat-autocomplete>\n <mat-error *ngIf=\"!chipsModel.errors\">{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchDefault>ERROR: The type {{type}}is not known.</div>\n</div>", styles: ["mat-form-field{width:100%}\n"] }]
|
|
147
|
+
}], ctorParameters: function () { return []; }, propDecorators: { entity: [{
|
|
148
|
+
type: Input
|
|
149
|
+
}], propertyKey: [{
|
|
150
|
+
type: Input
|
|
151
|
+
}], getValidationErrorMessage: [{
|
|
152
|
+
type: Input
|
|
153
|
+
}], hideOmitForCreate: [{
|
|
154
|
+
type: Input
|
|
155
|
+
}], hideOmitForEdit: [{
|
|
156
|
+
type: Input
|
|
157
|
+
}] } });
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9pbnB1dC9pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2lucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFNUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFRckYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBT25DLE1BQU0sT0FBTywwQkFBMEI7SUFpRW5DO1FBUkEsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUlmLG1CQUFjLEdBQUcsY0FBYyxDQUFDO1FBRXpDLGFBQVEsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDO0lBRXJCLENBQUM7SUFFaEI7O09BRUc7SUFDSCxTQUFTLENBQUMsS0FBYztRQUNwQixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFl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THRDLFNBQVM7K0JBQ0ksc0JBQXNCOzBFQVVoQyxNQUFNO3NCQURMLEtBQUs7Z0JBT04sV0FBVztzQkFEVixLQUFLO2dCQU9OLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFRTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBUU4sZUFBZTtzQkFEZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ01vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRW50aXR5VXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9lbnRpdHktdXRpbGl0aWVzLmNsYXNzJztcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZW50aXR5LW1vZGVsLmNsYXNzJztcbmltcG9ydCB7IERlY29yYXRvclR5cGVzIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9iYXNlL2RlY29yYXRvci10eXBlcy5lbnVtJztcbmltcG9ydCB7IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9iYXNlL3Byb3BlcnR5LWRlY29yYXRvci1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IGdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UgfSBmcm9tICcuLi9nZXQtdmFsaWRhdGlvbi1lcnJvci1tZXNzYWdlLmZ1bmN0aW9uJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVN0cmluZ0RlY29yYXRvckNvbmZpZywgRGVmYXVsdFN0cmluZ0RlY29yYXRvckNvbmZpZywgRHJvcGRvd25TdHJpbmdEZWNvcmF0b3JDb25maWcsIFRleHRib3hTdHJpbmdEZWNvcmF0b3JDb25maWcgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3N0cmluZy5kZWNvcmF0b3InO1xuaW1wb3J0IHsgRHJvcGRvd25Cb29sZWFuRGVjb3JhdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9ib29sZWFuLmRlY29yYXRvcic7XG5pbXBvcnQgeyBEZWZhdWx0TnVtYmVyRGVjb3JhdG9yQ29uZmlnLCBEcm9wZG93bk51bWJlckRlY29yYXRvckNvbmZpZyB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvbnVtYmVyLmRlY29yYXRvcic7XG5pbXBvcnQgeyBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9vYmplY3QuZGVjb3JhdG9yJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVN0cmluZ0NoaXBzQXJyYXlEZWNvcmF0b3JDb25maWcsIEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnLCBTdHJpbmdDaGlwc0FycmF5RGVjb3JhdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9hcnJheS5kZWNvcmF0b3InO1xuaW1wb3J0IHsgTWF0Q2hpcElucHV0RXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LW1hdC1lbnRpdHktaW5wdXQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vaW5wdXQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hNYXRFbnRpdHlJbnB1dENvbXBvbmVudDxFbnRpdHlUeXBlIGV4dGVuZHMgRW50aXR5PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGVudGl0eSBvbiB3aGljaCB0aGUgcHJvcGVydHkgZXhpc3RzLiBVc2VkIGluIGNvbmp1Y3Rpb24gd2l0aCB0aGUgXCJwcm9wZXJ0eUtleVwiXG4gICAgICogdG8gZGV0ZXJtaW5lIHRoZSBwcm9wZXJ0eSBmb3Igd2hpY2ggdGhlIGlucHV0IHNob3VsZCBiZSBnZW5lcmF0ZWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBlbnRpdHkhOiBFbnRpdHlUeXBlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdlbmVyYXRlIHRoZSBpbnB1dCBmb3IuIFVzZWQgaW4gY29uanVjdGlvbiB3aXRoIHRoZSBcImVudGl0eVwiLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHJvcGVydHlLZXkhOiBrZXlvZiBFbnRpdHlUeXBlO1xuXG4gICAgLyoqXG4gICAgICogKG9wdGlvbmFsKSBBIGN1c3RvbSBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGUgZXJyb3ItbWVzc2FnZSBmb3IgaW52YWxpZCBpbnB1dHMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlITogKG1vZGVsOiBOZ01vZGVsKSA9PiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGhpZGUgYSB2YWx1ZSBpZiBpdCBpcyBvbWl0dGVkIGZvciBjcmVhdGlvbi5cbiAgICAgKiBJcyB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBoaWRlT21pdEZvckNyZWF0ZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGhpZGUgYSB2YWx1ZSBpZiBpdCBpcyBvbWl0dGVkIGZvciBlZGl0aW5nLlxuICAgICAqIElzIHVzZWQgaW50ZXJuYWxseSBmb3IgdGhlIG9iamVjdCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGhpZGVPbWl0Rm9yRWRpdD86IGJvb2xlYW47XG5cbiAgICB0eXBlITogRGVjb3JhdG9yVHlwZXM7XG5cbiAgICBtZXRhZGF0YSE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnO1xuXG4gICAgbWV0YWRhdGFEZWZhdWx0U3RyaW5nITogRGVmYXVsdFN0cmluZ0RlY29yYXRvckNvbmZpZztcbiAgICBtZXRhZGF0YVRleHRib3hTdHJpbmchOiBUZXh0Ym94U3RyaW5nRGVjb3JhdG9yQ29uZmlnO1xuICAgIG1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nITogQXV0b2NvbXBsZXRlU3RyaW5nRGVjb3JhdG9yQ29uZmlnO1xuICAgIGF1dG9jb21wbGV0ZVN0cmluZ3MhOiBzdHJpbmdbXTtcbiAgICBmaWx0ZXJlZEF1dG9jb21wbGV0ZVN0cmluZ3MhOiBzdHJpbmdbXTtcbiAgICBtZXRhZGF0YURyb3Bkb3duU3RyaW5nITogRHJvcGRvd25TdHJpbmdEZWNvcmF0b3JDb25maWc7XG5cbiAgICBtZXRhZGF0YURyb3Bkb3duQm9vbGVhbiE6IERyb3Bkb3duQm9vbGVhbkRlY29yYXRvckNvbmZpZztcblxuICAgIG1ldGFkYXRhRGVmYXVsdE51bWJlciE6IERlZmF1bHROdW1iZXJEZWNvcmF0b3JDb25maWc7XG4gICAgbWV0YWRhdGFEcm9wZG93bk51bWJlciE6IERyb3Bkb3duTnVtYmVyRGVjb3JhdG9yQ29uZmlnO1xuXG4gICAgbWV0YWRhdGFEZWZhdWx0T2JqZWN0ITogRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZztcbiAgICBvYmplY3RQcm9wZXJ0eSE6IEVudGl0eTtcblxuICAgIG1ldGFkYXRhRW50aXR5QXJyYXkhOiBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZzxFbnRpdHk+O1xuICAgIGVudGl0eUFycmF5VmFsdWVzITogRW50aXR5W107XG4gICAgbWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5ITogU3RyaW5nQ2hpcHNBcnJheURlY29yYXRvckNvbmZpZztcbiAgICBzdHJpbmdDaGlwc0FycmF5VmFsdWVzITogc3RyaW5nW107XG4gICAgY2hpcHNJbnB1dDogc3RyaW5nID0gJyc7XG5cbiAgICBtZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZ0NoaXBzQXJyYXkhOiBBdXRvY29tcGxldGVTdHJpbmdDaGlwc0FycmF5RGVjb3JhdG9yQ29uZmlnO1xuXG4gICAgcmVhZG9ubHkgRGVjb3JhdG9yVHlwZXMgPSBEZWNvcmF0b3JUeXBlcztcblxuICAgIGdldFdpZHRoID0gRW50aXR5VXRpbGl0aWVzLmdldFdpZHRoO1xuXG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCBuZWVkZWQgdG8gcmVjdXJzaXZlbHkgZ2VuZXJhdGUgcHJvcGVydHkgaW5wdXQgY29tcG9uZW50cyAodXNlZCBlZy4gd2l0aCB0aGUgb2JqZWN0KVxuICAgICAqL1xuICAgIHRyYWNrQnlGbihpbmRleDogdW5rbm93bik6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbnRpdHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBJbnB1dCBkYXRhIFwiZW50aXR5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBJbnB1dCBkYXRhIFwicHJvcGVydHlLZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHlwZSA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUodGhpcy5lbnRpdHksIHRoaXMucHJvcGVydHlLZXkpO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEodGhpcy5lbnRpdHksIHRoaXMucHJvcGVydHlLZXksIHRoaXMudHlwZSk7XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YURlZmF1bHRTdHJpbmcgPSB0aGlzLm1ldGFkYXRhIGFzIERlZmF1bHRTdHJpbmdEZWNvcmF0b3JDb25maWc7XG4gICAgICAgIHRoaXMubWV0YWRhdGFUZXh0Ym94U3RyaW5nID0gdGhpcy5tZXRhZGF0YSBhcyBUZXh0Ym94U3RyaW5nRGVjb3JhdG9yQ29uZmlnO1xuXG4gICAgICAgIHRoaXMubWV0YWRhdGFBdXRvY29tcGxldGVTdHJpbmcgPSB0aGlzLm1ldGFkYXRhIGFzIEF1dG9jb21wbGV0ZVN0cmluZ0RlY29yYXRvckNvbmZpZztcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVTdHJpbmdzID0gdGhpcy5tZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZy5hdXRvY29tcGxldGVWYWx1ZXM7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRBdXRvY29tcGxldGVTdHJpbmdzID0gY2xvbmVEZWVwKHRoaXMuYXV0b2NvbXBsZXRlU3RyaW5ncyk7XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YURyb3Bkb3duU3RyaW5nID0gdGhpcy5tZXRhZGF0YSBhcyBEcm9wZG93blN0cmluZ0RlY29yYXRvckNvbmZpZztcblxuICAgICAgICB0aGlzLm1ldGFkYXRhRHJvcGRvd25Cb29sZWFuID0gdGhpcy5tZXRhZGF0YSBhcyBEcm9wZG93bkJvb2xlYW5EZWNvcmF0b3JDb25maWc7XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YURlZmF1bHROdW1iZXIgPSB0aGlzLm1ldGFkYXRhIGFzIERlZmF1bHROdW1iZXJEZWNvcmF0b3JDb25maWc7XG4gICAgICAgIHRoaXMubWV0YWRhdGFEcm9wZG93bk51bWJlciA9IHRoaXMubWV0YWRhdGEgYXMgRHJvcGRvd25OdW1iZXJEZWNvcmF0b3JDb25maWc7XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YURlZmF1bHRPYmplY3QgPSB0aGlzLm1ldGFkYXRhIGFzIERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWc7XG4gICAgICAgIHRoaXMub2JqZWN0UHJvcGVydHkgPSB0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyB1bmtub3duIGFzIEVudGl0eTtcblxuICAgICAgICB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkgPSB0aGlzLm1ldGFkYXRhIGFzIEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnPEVudGl0eT47XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuRW50aXR5Q2xhc3MpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0pIHtcbiAgICAgICAgICAgICAgICAodGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgdW5rbm93biBhcyBFbnRpdHlbXSkgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW50aXR5QXJyYXlWYWx1ZXMgPSB0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyB1bmtub3duIGFzIEVudGl0eVtdO1xuICAgICAgICAgICAgaWYgKHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5jcmVhdGVJbmxpbmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5jcmVhdGVJbmxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lICYmICF0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlRGlhbG9nRGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5jcmVhdGVEaWFsb2dEYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0FkZCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheSA9IHRoaXMubWV0YWRhdGEgYXMgU3RyaW5nQ2hpcHNBcnJheURlY29yYXRvckNvbmZpZztcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkuaXRlbVR5cGVcbiAgICAgICAgICAgICYmICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyB1bmtub3duIGFzIHN0cmluZ1tdKT8ubGVuZ3RoXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zdHJpbmdDaGlwc0FycmF5VmFsdWVzID0gKHRoaXMuZW50aXR5W3RoaXMucHJvcGVydHlLZXldIGFzIHVua25vd24gYXMgc3RyaW5nW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZ0NoaXBzQXJyYXkgPSB0aGlzLm1ldGFkYXRhIGFzIEF1dG9jb21wbGV0ZVN0cmluZ0NoaXBzQXJyYXlEZWNvcmF0b3JDb25maWc7XG5cbiAgICAgICAgaWYgKCF0aGlzLmdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZSA9IGdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRPYmplY3RQcm9wZXJ0aWVzKCk6IChrZXlvZiBFbnRpdHkpW10ge1xuICAgICAgICBjb25zdCByZXM6IChrZXlvZiBFbnRpdHkpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiB0aGlzLm9iamVjdFByb3BlcnR5KSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKFxuICAgICAgICAgICAgICAgIHRoaXMub2JqZWN0UHJvcGVydHksXG4gICAgICAgICAgICAgICAgcHJvcGVydHkgYXMga2V5b2YgRW50aXR5LFxuICAgICAgICAgICAgICAgIEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUodGhpcy5vYmplY3RQcm9wZXJ0eSwgcHJvcGVydHkgYXMga2V5b2YgRW50aXR5KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhKHRoaXMuaGlkZU9taXRGb3JDcmVhdGUgJiYgbWV0YWRhdGEub21pdEZvckNyZWF0ZSlcbiAgICAgICAgICAgICAgICAmJiAhKHRoaXMuaGlkZU9taXRGb3JFZGl0ICYmIG1ldGFkYXRhLm9taXRGb3JVcGRhdGUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChwcm9wZXJ0eSBhcyBrZXlvZiBFbnRpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXMuc29ydCgoYSwgYikgPT4gRW50aXR5VXRpbGl0aWVzLmNvbXBhcmVPcmRlcihhLCBiLCB0aGlzLm9iamVjdFByb3BlcnR5KSk7XG4gICAgfVxuXG4gICAgYWRkU3RyaW5nQ2hpcEFycmF5VmFsdWUoZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5Lm1pbkxlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPCB0aGlzLm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5taW5MZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5tZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkubWF4TGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA+IHRoaXMubWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5Lm1heExlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5yZWdleCAgJiYgIXZhbHVlLm1hdGNoKHRoaXMubWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5LnJlZ2V4KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5zdHJpbmdDaGlwc0FycmF5VmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyB1bmtub3duIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyB1bmtub3duIGFzIHN0cmluZ1tdKSA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnN0cmluZ0NoaXBzQXJyYXlWYWx1ZXMgPSB0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyB1bmtub3duIGFzIHN0cmluZ1tdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdHJpbmdDaGlwc0FycmF5VmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LmNoaXBJbnB1dCEuY2xlYXIoKTtcbiAgICB9XG5cbiAgICByZW1vdmVTdHJpbmdDaGlwQXJyYXlWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RyaW5nQ2hpcHNBcnJheVZhbHVlcy5zcGxpY2UodGhpcy5zdHJpbmdDaGlwc0FycmF5VmFsdWVzLmluZGV4T2YodmFsdWUpLCAxKTtcbiAgICAgICAgaWYgKCF0aGlzLnN0cmluZ0NoaXBzQXJyYXlWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAodGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgdW5rbm93bikgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnN0cmluZ0NoaXBzQXJyYXlWYWx1ZXMgPSB0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyB1bmtub3duIGFzIHN0cmluZ1tdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0ZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQsIGNoaXBzSW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAoZXZlbnQub3B0aW9uLnZpZXdWYWx1ZSB8fCAnJykudHJpbSgpO1xuICAgICAgICBpZiAodGhpcy5tZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkubWluTGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA8IHRoaXMubWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5Lm1pbkxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5tYXhMZW5ndGggJiYgdmFsdWUubGVuZ3RoID4gdGhpcy5tZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5LnJlZ2V4ICAmJiAhdmFsdWUubWF0Y2godGhpcy5tZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkucmVnZXgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnN0cmluZ0NoaXBzQXJyYXlWYWx1ZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgdW5rbm93biBhcyBzdHJpbmdbXSkge1xuICAgICAgICAgICAgICAgICh0aGlzLmVudGl0eVt0aGlzLnByb3BlcnR5S2V5XSBhcyB1bmtub3duIGFzIHN0cmluZ1tdKSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdHJpbmdDaGlwc0FycmF5VmFsdWVzID0gdGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgdW5rbm93biBhcyBzdHJpbmdbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0cmluZ0NoaXBzQXJyYXlWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIGNoaXBzSW5wdXQudmFsdWUgPSAnJztcbiAgICB9XG5cbiAgICBmaWx0ZXJBdXRvY29tcGxldGVTdHJpbmdzKGlucHV0OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gKGlucHV0IGFzIHN0cmluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJlZEF1dG9jb21wbGV0ZVN0cmluZ3MgPSB0aGlzLmF1dG9jb21wbGV0ZVN0cmluZ3MuZmlsdGVyKHMgPT4gcy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKSk7XG4gICAgfVxufSIsIjxkaXYgW25nU3dpdGNoXT1cInR5cGVcIiAqbmdJZj1cIiEoaGlkZU9taXRGb3JDcmVhdGUgJiYgbWV0YWRhdGEub21pdEZvckNyZWF0ZSkgJiYgIShoaWRlT21pdEZvckVkaXQgJiYgbWV0YWRhdGEub21pdEZvclVwZGF0ZSlcIj5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS1TdHJpbmdzLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5TVFJJTkdcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e21ldGFkYXRhLmRpc3BsYXlOYW1lfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlbnRpdHlbcHJvcGVydHlLZXldXCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCJcbiAgICAgICAgICAgICAgICAjbW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWQgPyBtZXRhZGF0YS5yZXF1aXJlZCA6IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJtZXRhZGF0YURlZmF1bHRTdHJpbmcucmVnZXggPyBtZXRhZGF0YURlZmF1bHRTdHJpbmcucmVnZXggOiAnW1xcXFxzXFxcXFNdKidcIlxuICAgICAgICAgICAgICAgIFttaW5sZW5ndGhdPVwibWV0YWRhdGFEZWZhdWx0U3RyaW5nLm1pbkxlbmd0aCA/IG1ldGFkYXRhRGVmYXVsdFN0cmluZy5taW5MZW5ndGggOiBudWxsXCJcbiAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIm1ldGFkYXRhRGVmYXVsdFN0cmluZy5tYXhMZW5ndGggPyBtZXRhZGF0YURlZmF1bHRTdHJpbmcubWF4TGVuZ3RoIDogbnVsbFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPG1hdC1lcnJvcj57e2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UobW9kZWwpfX08L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLlNUUklOR19URVhUQk9YXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZW50aXR5W3Byb3BlcnR5S2V5XVwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiXG4gICAgICAgICAgICAgICAgI21vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgY2RrVGV4dGFyZWFBdXRvc2l6ZVxuICAgICAgICAgICAgICAgIGNka0F1dG9zaXplTWluUm93cz1cIjEwXCJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWQgPyBtZXRhZGF0YS5yZXF1aXJlZCA6IGZhbHNlXCJcbiAgICAgICAgICAgICAgICBbbWlubGVuZ3RoXT1cIm1ldGFkYXRhVGV4dGJveFN0cmluZy5taW5MZW5ndGggPyBtZXRhZGF0YVRleHRib3hTdHJpbmcubWluTGVuZ3RoIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW21heGxlbmd0aF09XCJtZXRhZGF0YVRleHRib3hTdHJpbmcubWF4TGVuZ3RoID8gbWV0YWRhdGFUZXh0Ym94U3RyaW5nLm1heExlbmd0aCA6IG51bGxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5TVFJJTkdfQVVUT0NPTVBMRVRFXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZW50aXR5W3Byb3BlcnR5S2V5XVwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiXG4gICAgICAgICAgICAgICAgI21vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwiZmlsdGVyQXV0b2NvbXBsZXRlU3RyaW5ncyhlbnRpdHlbcHJvcGVydHlLZXldKVwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkID8gbWV0YWRhdGEucmVxdWlyZWQgOiBmYWxzZVwiXG4gICAgICAgICAgICAgICAgW21pbmxlbmd0aF09XCJtZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZy5taW5MZW5ndGggPyBtZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZy5taW5MZW5ndGggOiBudWxsXCJcbiAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIm1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nLm1heExlbmd0aCA/IG1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nLm1heExlbmd0aCA6IG51bGxcIlxuICAgICAgICAgICAgICAgIFtwYXR0ZXJuXT1cIm1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nLnJlZ2V4ID8gbWV0YWRhdGFBdXRvY29tcGxldGVTdHJpbmcucmVnZXggOiAnW1xcXFxzXFxcXFNdKidcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHZhbHVlIG9mIGZpbHRlcmVkQXV0b2NvbXBsZXRlU3RyaW5nc1wiIFt2YWx1ZV09XCJ2YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7e3ZhbHVlfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuU1RSSU5HX0RST1BET1dOXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIiBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCIgI21vZGVsPVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJtZXRhZGF0YS5yZXF1aXJlZCA/IG1ldGFkYXRhLnJlcXVpcmVkIDogZmFsc2VcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgbWV0YWRhdGFEcm9wZG93blN0cmluZy5kcm9wZG93blZhbHVlc1wiIFt2YWx1ZV09XCJ2YWx1ZS52YWx1ZVwiPnt7dmFsdWUuZGlzcGxheU5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS1Cb29sZWFucy0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5CT09MRUFOX0NIRUNLQk9YXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJlbnRpdHlbcHJvcGVydHlLZXldXCIgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiICNtb2RlbD1cIm5nTW9kZWxcIiBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWQgPyBtZXRhZGF0YS5yZXF1aXJlZCA6IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIGlucHV0IGlzIG5lZWRlZCBzbyB0aGF0IHRoZSBjaGVja2JveCBjYW4gYmUgdXNlZCBpbnNpZGUgYSBtYXQtZm9ybS1maWVsZCAtLT5cbiAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBoaWRkZW4+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5CT09MRUFOX1RPR0dMRVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIiBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCIgI21vZGVsPVwibmdNb2RlbFwiIFtyZXF1aXJlZF09XCJtZXRhZGF0YS5yZXF1aXJlZCA/IG1ldGFkYXRhLnJlcXVpcmVkIDogZmFsc2VcIj5cbiAgICAgICAgICAgICAgICB7e21ldGFkYXRhLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIGlucHV0IGlzIG5lZWRlZCBzbyB0aGF0IHRoZSB0b2dnbGUgY2FuIGJlIHVzZWQgaW5zaWRlIGEgbWF0LWZvcm0tZmllbGQgLS0+XG4gICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgaGlkZGVuPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQk9PTEVBTl9EUk9QRE9XTlwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7bWV0YWRhdGEuZGlzcGxheU5hbWV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJlbnRpdHlbcHJvcGVydHlLZXldXCIgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiICNtb2RlbD1cIm5nTW9kZWxcIiBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWQgPyBtZXRhZGF0YS5yZXF1aXJlZCA6IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInVuZGVmaW5lZFwiPi08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInRydWVcIj57e21ldGFkYXRhRHJvcGRvd25Cb29sZWFuLmRyb3Bkb3duVHJ1ZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJmYWxzZVwiPnt7bWV0YWRhdGFEcm9wZG93bkJvb2xlYW4uZHJvcGRvd25GYWxzZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPG1hdC1lcnJvcj57e2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UobW9kZWwpfX08L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS1OdW1iZXJzLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLk5VTUJFUlwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7bWV0YWRhdGEuZGlzcGxheU5hbWV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cInByb3BlcnR5S2V5LnRvU3RyaW5nKClcIlxuICAgICAgICAgICAgICAgICNtb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJtZXRhZGF0YS5yZXF1aXJlZCA/IG1ldGFkYXRhLnJlcXVpcmVkIDogZmFsc2VcIlxuICAgICAgICAgICAgICAgIFttaW5dPVwibWV0YWRhdGFEZWZhdWx0TnVtYmVyLm1pbiA/IG1ldGFkYXRhRGVmYXVsdE51bWJlci5taW4gOiBudWxsXCJcbiAgICAgICAgICAgICAgICBbbWF4XT1cIm1ldGFkYXRhRGVmYXVsdE51bWJlci5tYXggPyBtZXRhZGF0YURlZmF1bHROdW1iZXIubWF4IDogbnVsbFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPG1hdC1lcnJvcj57e2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UobW9kZWwpfX08L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLk5VTUJFUl9EUk9QRE9XTlwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7bWV0YWRhdGEuZGlzcGxheU5hbWV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJlbnRpdHlbcHJvcGVydHlLZXldXCIgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiICNtb2RlbD1cIm5nTW9kZWxcIiBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWQgPyBtZXRhZGF0YS5yZXF1aXJlZCA6IGZhbHNlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHZhbHVlIG9mIG1ldGFkYXRhRHJvcGRvd25OdW1iZXIuZHJvcGRvd25WYWx1ZXNcIiBbdmFsdWVdPVwidmFsdWUudmFsdWVcIj57e3ZhbHVlLmRpc3BsYXlOYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS1PYmplY3QtLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuT0JKRUNUXCI+XG4gICAgICAgIDxiPnt7bWV0YWRhdGFEZWZhdWx0T2JqZWN0LmRpc3BsYXlOYW1lfX08L2I+XG4gICAgICAgIDwhLS0gaXRlcmF0ZXMgb3ZlciB0aGUgb2JqZWN0IHByb3BlcnRpZXMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgICAgICBkaXNwbGF5cyBhbm90aGVyIG5neC1tYXRlcmlhbC1lbnRpdHkgd2l0aCB0aGU6XG4gICAgICAgICAgICAgICAgb2JqZWN0IGFzIHRoZSBlbnRpdHksXG4gICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQga2V5IGluIHRoZSBsb29wIHJlY2VpdmVkIGJ5IHRoZSBrZXl2YWx1ZSBkaXJlY3Rpb24gYXMgdGhlIHByb3BlcnR5S2V5XG4gICAgICAgICAgICAgICAgYW5kIHRoZSBnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlIG9mIHRoZSBjdXJyZW50IGNvbXBvbmVudFxuICAgICAgICAgICAgLS0+XG4gICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXRcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQga2V5IG9mIGdldE9iamVjdFByb3BlcnRpZXMoKTsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgICAgICAgICBbZW50aXR5XT1cIm9iamVjdFByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICBbcHJvcGVydHlLZXldPVwia2V5XCJcbiAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JDcmVhdGVdPVwiaGlkZU9taXRGb3JDcmVhdGVcIlxuICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwiaGlkZU9taXRGb3JFZGl0XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1sZy17e2dldFdpZHRoKG9iamVjdFByb3BlcnR5LCBrZXksICdsZycpfX0gY29sLW1kLXt7Z2V0V2lkdGgob2JqZWN0UHJvcGVydHksIGtleSwgJ21kJyl9fSBjb2wtc20te3tnZXRXaWR0aChvYmplY3RQcm9wZXJ0eSwga2V5LCAnc20nKX19XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS1BcnJheS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQVJSQVlcIj5cbiAgICAgICAgPG5neC1tYXQtZW50aXR5LWFycmF5LXRhYmxlXG4gICAgICAgICAgICBbYXJyYXlJdGVtc109XCJlbnRpdHlBcnJheVZhbHVlc1wiXG4gICAgICAgICAgICBbbWV0YWRhdGFdPVwibWV0YWRhdGFFbnRpdHlBcnJheVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtvbWl0XT1cImhpZGVPbWl0Rm9yQ3JlYXRlID8gJ2NyZWF0ZScgOiAnZWRpdCdcIlxuICAgICAgICA+XG4gICAgICAgIDwvbmd4LW1hdC1lbnRpdHktYXJyYXktdGFibGU+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQ0hJUFNcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e21ldGFkYXRhLmRpc3BsYXlOYW1lfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtY2hpcC1saXN0ICNjaGlwTGlzdFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZW50aXR5W3Byb3BlcnR5S2V5XVwiIFtuYW1lXT1cInByb3BlcnR5S2V5LnRvU3RyaW5nKClcIiAjbW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWQgPyBtZXRhZGF0YS5yZXF1aXJlZCA6IGZhbHNlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWNoaXAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIHN0cmluZ0NoaXBzQXJyYXlWYWx1ZXNcIiAocmVtb3ZlZCk9XCJyZW1vdmVTdHJpbmdDaGlwQXJyYXlWYWx1ZSh2YWx1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAge3t2YWx1ZX19XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0Q2hpcFJlbW92ZSAqbmdJZj1cIm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5kZWxldGVIdG1sXCIgW2lubmVySHRtbF09XCJtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkuZGVsZXRlSHRtbFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlICpuZ0lmPVwiIW1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5kZWxldGVIdG1sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJjaGlwTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRBZGRPbkJsdXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGRTdHJpbmdDaGlwQXJyYXlWYWx1ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjaGlwc0lucHV0XCIgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiICNjaGlwc01vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgIFttaW5sZW5ndGhdPSdtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkubWluTGVuZ3RoID8gbWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5Lm1pbkxlbmd0aCA6IG51bGwnXG4gICAgICAgICAgICAgICAgICAgIFttYXhsZW5ndGhdPSdtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkubWF4TGVuZ3RoID8gbWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5Lm1heExlbmd0aCA6IG51bGwnXG4gICAgICAgICAgICAgICAgICAgIFtwYXR0ZXJuXT1cIm1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5yZWdleCA/IG1ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5yZWdleCA6ICdbXFxcXHNcXFxcU10qJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJjaGlwc01vZGVsLmVycm9yc1wiPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShjaGlwc01vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiIWNoaXBzTW9kZWwuZXJyb3JzXCI+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQVVUT0NPTVBMRVRFX0NISVBTXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LWNoaXAtbGlzdCAjY2hpcExpc3RcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIiBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCIgI21vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cIm1ldGFkYXRhLnJlcXVpcmVkID8gbWV0YWRhdGEucmVxdWlyZWQgOiBmYWxzZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1jaGlwICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiBzdHJpbmdDaGlwc0FycmF5VmFsdWVzXCIgKHJlbW92ZWQpPVwicmVtb3ZlU3RyaW5nQ2hpcEFycmF5VmFsdWUodmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7dmFsdWV9fVxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdENoaXBSZW1vdmUgKm5nSWY9XCJtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkuZGVsZXRlSHRtbFwiIFtpbm5lckh0bWxdPVwibWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5LmRlbGV0ZUh0bWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0Q2hpcFJlbW92ZSAqbmdJZj1cIiFtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkuZGVsZXRlSHRtbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RcIlxuICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAobWF0Q2hpcElucHV0VG9rZW5FbmQpPVwiYWRkU3RyaW5nQ2hpcEFycmF5VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJmaWx0ZXJBdXRvY29tcGxldGVTdHJpbmdzKGNoaXBzSW5wdXQpXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjaGlwc0lucHV0XCIgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiICNjaGlwc01vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICNjaGlwc0VsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgW21pbmxlbmd0aF09J21ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5taW5MZW5ndGggPyBtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkubWluTGVuZ3RoIDogbnVsbCdcbiAgICAgICAgICAgICAgICAgICAgW21heGxlbmd0aF09J21ldGFkYXRhU3RyaW5nQ2hpcHNBcnJheS5tYXhMZW5ndGggPyBtZXRhZGF0YVN0cmluZ0NoaXBzQXJyYXkubWF4TGVuZ3RoIDogbnVsbCdcbiAgICAgICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwibWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5LnJlZ2V4ID8gbWV0YWRhdGFTdHJpbmdDaGlwc0FycmF5LnJlZ2V4IDogJ1tcXFxcc1xcXFxTXSonXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImNoaXBzTW9kZWwuZXJyb3JzXCI+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKGNoaXBzTW9kZWwpfX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCIgKG9wdGlvblNlbGVjdGVkKT1cInNlbGVjdGVkKCRldmVudCwgY2hpcHNFbGVtZW50KVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiBmaWx0ZXJlZEF1dG9jb21wbGV0ZVN0cmluZ3NcIiBbdmFsdWVdPVwidmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgIHt7dmFsdWV9fVxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCIhY2hpcHNNb2RlbC5lcnJvcnNcIj57e2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UobW9kZWwpfX08L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5FUlJPUjogVGhlIHR5cGUge3t0eXBlfX1pcyBub3Qga25vd24uPC9kaXY+XG48L2Rpdj4iXX0=
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { NgxMatEntityInputComponent } from './input.component';
|
|
4
|
+
import { MatInputModule } from '@angular/material/input';
|
|
5
|
+
import { FormsModule } from '@angular/forms';
|
|
6
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
7
|
+
import { MatSelectModule } from '@angular/material/select';
|
|
8
|
+
import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
|
9
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
10
|
+
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
11
|
+
import { NgxMatEntityArrayTableModule } from './array-table/array-table.module';
|
|
12
|
+
import { MatChipsModule } from '@angular/material/chips';
|
|
13
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
export class NgxMatEntityInputModule {
|
|
16
|
+
}
|
|
17
|
+
NgxMatEntityInputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
18
|
+
NgxMatEntityInputModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityInputModule, declarations: [NgxMatEntityInputComponent], imports: [CommonModule,
|
|
19
|
+
MatInputModule,
|
|
20
|
+
FormsModule,
|
|
21
|
+
MatFormFieldModule,
|
|
22
|
+
MatSelectModule,
|
|
23
|
+
MatAutocompleteModule,
|
|
24
|
+
MatCheckboxModule,
|
|
25
|
+
MatSlideToggleModule,
|
|
26
|
+
NgxMatEntityArrayTableModule,
|
|
27
|
+
MatChipsModule,
|
|
28
|
+
MatIconModule], exports: [NgxMatEntityInputComponent] });
|
|
29
|
+
NgxMatEntityInputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityInputModule, imports: [[
|
|
30
|
+
CommonModule,
|
|
31
|
+
MatInputModule,
|
|
32
|
+
FormsModule,
|
|
33
|
+
MatFormFieldModule,
|
|
34
|
+
MatSelectModule,
|
|
35
|
+
MatAutocompleteModule,
|
|
36
|
+
MatCheckboxModule,
|
|
37
|
+
MatSlideToggleModule,
|
|
38
|
+
NgxMatEntityArrayTableModule,
|
|
39
|
+
MatChipsModule,
|
|
40
|
+
MatIconModule
|
|
41
|
+
]] });
|
|
42
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityInputModule, decorators: [{
|
|
43
|
+
type: NgModule,
|
|
44
|
+
args: [{
|
|
45
|
+
declarations: [NgxMatEntityInputComponent],
|
|
46
|
+
imports: [
|
|
47
|
+
CommonModule,
|
|
48
|
+
MatInputModule,
|
|
49
|
+
FormsModule,
|
|
50
|
+
MatFormFieldModule,
|
|
51
|
+
MatSelectModule,
|
|
52
|
+
MatAutocompleteModule,
|
|
53
|
+
MatCheckboxModule,
|
|
54
|
+
MatSlideToggleModule,
|
|
55
|
+
NgxMatEntityArrayTableModule,
|
|
56
|
+
MatChipsModule,
|
|
57
|
+
MatIconModule
|
|
58
|
+
],
|
|
59
|
+
exports: [NgxMatEntityInputComponent]
|
|
60
|
+
}]
|
|
61
|
+
}] });
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9pbnB1dC9pbnB1dC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFtQnZELE1BQU0sT0FBTyx1QkFBdUI7O3FIQUF2Qix1QkFBdUI7c0hBQXZCLHVCQUF1QixpQkFoQmpCLDBCQUEwQixhQUVyQyxZQUFZO1FBQ1osY0FBYztRQUNkLFdBQVc7UUFDWCxrQkFBa0I7UUFDbEIsZUFBZTtRQUNmLHFCQUFxQjtRQUNyQixpQkFBaUI7UUFDakIsb0JBQW9CO1FBQ3BCLDRCQUE0QjtRQUM1QixjQUFjO1FBQ2QsYUFBYSxhQUVQLDBCQUEwQjtzSEFFM0IsdUJBQXVCLFlBZnZCO1lBQ0wsWUFBWTtZQUNaLGNBQWM7WUFDZCxXQUFXO1lBQ1gsa0JBQWtCO1lBQ2xCLGVBQWU7WUFDZixxQkFBcUI7WUFDckIsaUJBQWlCO1lBQ2pCLG9CQUFvQjtZQUNwQiw0QkFBNEI7WUFDNUIsY0FBYztZQUNkLGFBQWE7U0FDaEI7NEZBR1EsdUJBQXVCO2tCQWpCbkMsUUFBUTttQkFBQztvQkFDTixZQUFZLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztvQkFDMUMsT0FBTyxFQUFFO3dCQUNMLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxXQUFXO3dCQUNYLGtCQUFrQjt3QkFDbEIsZUFBZTt3QkFDZixxQkFBcUI7d0JBQ3JCLGlCQUFpQjt3QkFDakIsb0JBQW9CO3dCQUNwQiw0QkFBNEI7d0JBQzVCLGNBQWM7d0JBQ2QsYUFBYTtxQkFDaEI7b0JBQ0QsT0FBTyxFQUFFLENBQUMsMEJBQTBCLENBQUM7aUJBQ3hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ3hNYXRFbnRpdHlJbnB1dENvbXBvbmVudCB9IGZyb20gJy4vaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XG5pbXBvcnQgeyBNYXRTbGlkZVRvZ2dsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NsaWRlLXRvZ2dsZSc7XG5pbXBvcnQgeyBOZ3hNYXRFbnRpdHlBcnJheVRhYmxlTW9kdWxlIH0gZnJvbSAnLi9hcnJheS10YWJsZS9hcnJheS10YWJsZS5tb2R1bGUnO1xuaW1wb3J0IHsgTWF0Q2hpcHNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbTmd4TWF0RW50aXR5SW5wdXRDb21wb25lbnRdLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICAgICAgTWF0U2VsZWN0TW9kdWxlLFxuICAgICAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgICAgIE1hdENoZWNrYm94TW9kdWxlLFxuICAgICAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZSxcbiAgICAgICAgTmd4TWF0RW50aXR5QXJyYXlUYWJsZU1vZHVsZSxcbiAgICAgICAgTWF0Q2hpcHNNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGVcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtOZ3hNYXRFbnRpdHlJbnB1dENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4TWF0RW50aXR5SW5wdXRNb2R1bGUge30iXX0=
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { DecoratorTypes } from '../../../decorators/base/decorator-types.enum';
|
|
3
|
+
import { EntityUtilities } from '../../../classes/entity-utilities.class';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/material/form-field";
|
|
6
|
+
import * as i2 from "@angular/material/autocomplete";
|
|
7
|
+
import * as i3 from "@angular/material/core";
|
|
8
|
+
import * as i4 from "@angular/material/select";
|
|
9
|
+
import * as i5 from "@angular/material/checkbox";
|
|
10
|
+
import * as i6 from "@angular/material/slide-toggle";
|
|
11
|
+
import * as i7 from "@angular/common";
|
|
12
|
+
import * as i8 from "@angular/material/input";
|
|
13
|
+
import * as i9 from "@angular/forms";
|
|
14
|
+
import * as i10 from "@angular/cdk/text-field";
|
|
15
|
+
export class NgxMatEntityInternalInputComponent {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.DecoratorTypes = DecoratorTypes;
|
|
18
|
+
this.getWidth = EntityUtilities.getWidth;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Helper method needed to recursively generate property input components (used eg. with the object)
|
|
22
|
+
*/
|
|
23
|
+
trackByFn(index) {
|
|
24
|
+
return index;
|
|
25
|
+
}
|
|
26
|
+
ngOnInit() {
|
|
27
|
+
if (!this.entity) {
|
|
28
|
+
throw new Error('Missing required Input data "entity"');
|
|
29
|
+
}
|
|
30
|
+
if (!this.propertyKey) {
|
|
31
|
+
throw new Error('Missing required Input data "propertyKey"');
|
|
32
|
+
}
|
|
33
|
+
this.type = EntityUtilities.getPropertyType(this.entity, this.propertyKey);
|
|
34
|
+
this.metadata = EntityUtilities.getPropertyMetadata(this.entity, this.propertyKey, this.type);
|
|
35
|
+
this.metadataDefaultString = this.metadata;
|
|
36
|
+
this.metadataTextboxString = this.metadata;
|
|
37
|
+
this.metadataAutocompleteString = this.metadata;
|
|
38
|
+
this.metadataDropdownString = this.metadata;
|
|
39
|
+
this.metadataDropdownBoolean = this.metadata;
|
|
40
|
+
this.metadataDefaultNumber = this.metadata;
|
|
41
|
+
this.metadataDropdownNumber = this.metadata;
|
|
42
|
+
this.metadataDefaultObject = this.metadata;
|
|
43
|
+
this.objectProperty = this.entity[this.propertyKey];
|
|
44
|
+
}
|
|
45
|
+
getObjectProperties() {
|
|
46
|
+
const res = [];
|
|
47
|
+
for (const property in this.objectProperty) {
|
|
48
|
+
const metadata = EntityUtilities.getPropertyMetadata(this.objectProperty, property, EntityUtilities.getPropertyType(this.objectProperty, property));
|
|
49
|
+
if (!(this.hideOmitForCreate && metadata.omitForCreate)
|
|
50
|
+
&& !(this.hideOmitForEdit && metadata.omitForUpdate)) {
|
|
51
|
+
res.push(property);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return res.sort((a, b) => EntityUtilities.compareOrder(a, b, this.objectProperty));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
NgxMatEntityInternalInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityInternalInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
58
|
+
NgxMatEntityInternalInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: NgxMatEntityInternalInputComponent, selector: "ngx-mat-entity-internal-input", inputs: { entity: "entity", propertyKey: "propertyKey", hideOmitForCreate: "hideOmitForCreate", hideOmitForEdit: "hideOmitForEdit", getValidationErrorMessage: "getValidationErrorMessage" }, ngImport: i0, template: "<div [ngSwitch]=\"type\" *ngIf=\"!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)\">\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.STRING\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [pattern]=\"metadataDefaultString.regex ? metadataDefaultString.regex : '[\\\\s\\\\S]*'\"\n [minlength]=\"metadataDefaultString.minLength ? metadataDefaultString.minLength : null\"\n [maxlength]=\"metadataDefaultString.maxLength ? metadataDefaultString.maxLength : null\"\n />\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_TEXTBOX\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <textarea\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"10\"\n [minlength]=\"metadataTextboxString.minLength ? metadataTextboxString.minLength : null\"\n [maxlength]=\"metadataTextboxString.maxLength ? metadataTextboxString.maxLength : null\"\n >\n </textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_AUTOCOMPLETE\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [matAutocomplete]=\"auto\"\n [minlength]=\"metadataAutocompleteString.minLength ? metadataAutocompleteString.minLength : null\"\n [maxlength]=\"metadataAutocompleteString.maxLength ? metadataAutocompleteString.maxLength : null\"\n [pattern]=\"metadataAutocompleteString.regex ? metadataAutocompleteString.regex : '[\\\\s\\\\S]*'\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let value of metadataAutocompleteString.autocompleteValues\" [value]=\"value\">\n {{value}}\n </mat-option>\n </mat-autocomplete>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\">\n <mat-option *ngFor=\"let value of metadataDropdownString.dropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_CHECKBOX\">\n <mat-form-field>\n <mat-checkbox [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\">\n {{metadata.displayName}}\n </mat-checkbox>\n <!-- hidden input is needed so that the checkbox can be used inside a mat-form-field -->\n <textarea matInput hidden></textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_TOGGLE\">\n <mat-form-field>\n <mat-slide-toggle [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\">\n {{metadata.displayName}}\n </mat-slide-toggle>\n <!-- hidden input is needed so that the toggle can be used inside a mat-form-field -->\n <textarea matInput hidden></textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\">\n <mat-option [value]=\"undefined\">-</mat-option>\n <mat-option [value]=\"true\">{{metadataDropdownBoolean.dropdownTrue}}</mat-option>\n <mat-option [value]=\"false\">{{metadataDropdownBoolean.dropdownFalse}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n type=\"number\"\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [min]=\"metadataDefaultNumber.min ? metadataDefaultNumber.min : null\"\n [max]=\"metadataDefaultNumber.max ? metadataDefaultNumber.max : null\"\n />\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\">\n <mat-option *ngFor=\"let value of metadataDropdownNumber.dropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.OBJECT\">\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <div class=\"row\">\n <!--\n displays another ngx-material-entity with the:\n object as the entity,\n the current key in the loop received by the keyvalue direction as the propertyKey\n and the getValidationErrorMessage of the current component\n -->\n <ngx-mat-entity-internal-input\n *ngFor=\"let key of getObjectProperties(); let i = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n class=\"col-lg-{{getWidth(objectProperty, key, 'lg')}} col-md-{{getWidth(objectProperty, key, 'md')}} col-sm-{{getWidth(objectProperty, key, 'sm')}}\"\n >\n </ngx-mat-entity-internal-input>\n </div>\n </div>\n\n <div *ngSwitchDefault>ERROR: The type {{type}}is not known.</div>\n</div>", styles: ["mat-form-field{width:100%}\n"], components: [{ type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i4.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i6.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex", "name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "checked"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { type: NgxMatEntityInternalInputComponent, selector: "ngx-mat-entity-internal-input", inputs: ["entity", "propertyKey", "hideOmitForCreate", "hideOmitForEdit", "getValidationErrorMessage"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i7.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i1.MatLabel, selector: "mat-label" }, { type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i9.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i9.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { type: i9.MinLengthValidator, selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]", inputs: ["minlength"] }, { type: i9.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i1.MatError, selector: "mat-error", inputs: ["id"] }, { type: i10.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { type: i2.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i9.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i9.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { type: i7.NgSwitchDefault, selector: "[ngSwitchDefault]" }] });
|
|
59
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: NgxMatEntityInternalInputComponent, decorators: [{
|
|
60
|
+
type: Component,
|
|
61
|
+
args: [{ selector: 'ngx-mat-entity-internal-input', template: "<div [ngSwitch]=\"type\" *ngIf=\"!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)\">\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.STRING\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [pattern]=\"metadataDefaultString.regex ? metadataDefaultString.regex : '[\\\\s\\\\S]*'\"\n [minlength]=\"metadataDefaultString.minLength ? metadataDefaultString.minLength : null\"\n [maxlength]=\"metadataDefaultString.maxLength ? metadataDefaultString.maxLength : null\"\n />\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_TEXTBOX\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <textarea\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"10\"\n [minlength]=\"metadataTextboxString.minLength ? metadataTextboxString.minLength : null\"\n [maxlength]=\"metadataTextboxString.maxLength ? metadataTextboxString.maxLength : null\"\n >\n </textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_AUTOCOMPLETE\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [matAutocomplete]=\"auto\"\n [minlength]=\"metadataAutocompleteString.minLength ? metadataAutocompleteString.minLength : null\"\n [maxlength]=\"metadataAutocompleteString.maxLength ? metadataAutocompleteString.maxLength : null\"\n [pattern]=\"metadataAutocompleteString.regex ? metadataAutocompleteString.regex : '[\\\\s\\\\S]*'\"\n />\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let value of metadataAutocompleteString.autocompleteValues\" [value]=\"value\">\n {{value}}\n </mat-option>\n </mat-autocomplete>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.STRING_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\">\n <mat-option *ngFor=\"let value of metadataDropdownString.dropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_CHECKBOX\">\n <mat-form-field>\n <mat-checkbox [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\">\n {{metadata.displayName}}\n </mat-checkbox>\n <!-- hidden input is needed so that the checkbox can be used inside a mat-form-field -->\n <textarea matInput hidden></textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_TOGGLE\">\n <mat-form-field>\n <mat-slide-toggle [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\">\n {{metadata.displayName}}\n </mat-slide-toggle>\n <!-- hidden input is needed so that the toggle can be used inside a mat-form-field -->\n <textarea matInput hidden></textarea>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\">\n <mat-option [value]=\"undefined\">-</mat-option>\n <mat-option [value]=\"true\">{{metadataDropdownBoolean.dropdownTrue}}</mat-option>\n <mat-option [value]=\"false\">{{metadataDropdownBoolean.dropdownFalse}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <input\n matInput\n type=\"number\"\n [(ngModel)]=\"entity[propertyKey]\"\n [name]=\"propertyKey.toString()\"\n #model=\"ngModel\"\n [min]=\"metadataDefaultNumber.min ? metadataDefaultNumber.min : null\"\n [max]=\"metadataDefaultNumber.max ? metadataDefaultNumber.max : null\"\n />\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_DROPDOWN\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"entity[propertyKey]\" [name]=\"propertyKey.toString()\" #model=\"ngModel\">\n <mat-option *ngFor=\"let value of metadataDropdownNumber.dropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{getValidationErrorMessage(model)}}</mat-error>\n </mat-form-field>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.OBJECT\">\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <div class=\"row\">\n <!--\n displays another ngx-material-entity with the:\n object as the entity,\n the current key in the loop received by the keyvalue direction as the propertyKey\n and the getValidationErrorMessage of the current component\n -->\n <ngx-mat-entity-internal-input\n *ngFor=\"let key of getObjectProperties(); let i = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"getValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n class=\"col-lg-{{getWidth(objectProperty, key, 'lg')}} col-md-{{getWidth(objectProperty, key, 'md')}} col-sm-{{getWidth(objectProperty, key, 'sm')}}\"\n >\n </ngx-mat-entity-internal-input>\n </div>\n </div>\n\n <div *ngSwitchDefault>ERROR: The type {{type}}is not known.</div>\n</div>", styles: ["mat-form-field{width:100%}\n"] }]
|
|
62
|
+
}], propDecorators: { entity: [{
|
|
63
|
+
type: Input
|
|
64
|
+
}], propertyKey: [{
|
|
65
|
+
type: Input
|
|
66
|
+
}], hideOmitForCreate: [{
|
|
67
|
+
type: Input
|
|
68
|
+
}], hideOmitForEdit: [{
|
|
69
|
+
type: Input
|
|
70
|
+
}], getValidationErrorMessage: [{
|
|
71
|
+
type: Input
|
|
72
|
+
}] } });
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9pbnB1dC9pbnRlcm5hbC1pbnB1dC9pbnRlcm5hbC1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2ludGVybmFsLWlucHV0L2ludGVybmFsLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQU8vRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7Ozs7Ozs7OztBQVExRSxNQUFNLE9BQU8sa0NBQWtDO0lBTC9DO1FBd0RhLG1CQUFjLEdBQUcsY0FBYyxDQUFDO1FBRXpDLGFBQVEsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDO0tBa0R2QztJQWhERzs7T0FFRztJQUNILFNBQVMsQ0FBQyxLQUFjO1FBQ3BCLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDM0Q7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7U0FDaEU7UUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxlQUFlLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU5RixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLFFBQXdDLENBQUM7UUFDM0UsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxRQUF3QyxDQUFDO1FBQzNFLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUMsUUFBNkMsQ0FBQztRQUNyRixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFFBQXlDLENBQUM7UUFFN0UsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksQ0FBQyxRQUEwQyxDQUFDO1FBRS9FLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsUUFBd0MsQ0FBQztRQUMzRSxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFFBQXlDLENBQUM7UUFFN0UsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxRQUF3QyxDQUFDO1FBQzNFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFzQixDQUFDO0lBQzdFLENBQUM7SUFFRCxtQkFBbUI7UUFDZixNQUFNLEdBQUcsR0FBcUIsRUFBRSxDQUFDO1FBQ2pDLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN4QyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsbUJBQW1CLENBQ2hELElBQUksQ0FBQyxjQUFjLEVBQ2xCLFFBQXdCLEVBQ3hCLGVBQWUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUF3QixDQUFDLENBQ2xGLENBQUM7WUFDRixJQUNJLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQzttQkFDL0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUN2RDtnQkFDRSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQXdCLENBQUMsQ0FBQzthQUN0QztTQUNKO1FBQ0QsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7O2dJQXRHUSxrQ0FBa0M7b0hBQWxDLGtDQUFrQyxtUUNoQi9DLDBpUUFtS00sa29DRG5KTyxrQ0FBa0M7NEZBQWxDLGtDQUFrQztrQkFMOUMsU0FBUzsrQkFDSSwrQkFBK0I7OEJBVXpDLE1BQU07c0JBREwsS0FBSztnQkFPTixXQUFXO3NCQURWLEtBQUs7Z0JBUU4saUJBQWlCO3NCQURoQixLQUFLO2dCQVFOLGVBQWU7c0JBRGQsS0FBSztnQkFPTix5QkFBeUI7c0JBRHhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERlY29yYXRvclR5cGVzIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy9iYXNlL2RlY29yYXRvci10eXBlcy5lbnVtJztcbmltcG9ydCB7IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy9iYXNlL3Byb3BlcnR5LWRlY29yYXRvci1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IERlZmF1bHROdW1iZXJEZWNvcmF0b3JDb25maWcsIERyb3Bkb3duTnVtYmVyRGVjb3JhdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy9udW1iZXIuZGVjb3JhdG9yJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVN0cmluZ0RlY29yYXRvckNvbmZpZywgRGVmYXVsdFN0cmluZ0RlY29yYXRvckNvbmZpZywgRHJvcGRvd25TdHJpbmdEZWNvcmF0b3JDb25maWcsIFRleHRib3hTdHJpbmdEZWNvcmF0b3JDb25maWcgfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzL3N0cmluZy5kZWNvcmF0b3InO1xuaW1wb3J0IHsgRHJvcGRvd25Cb29sZWFuRGVjb3JhdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy9ib29sZWFuLmRlY29yYXRvcic7XG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2VudGl0eS1tb2RlbC5jbGFzcyc7XG5pbXBvcnQgeyBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy9vYmplY3QuZGVjb3JhdG9yJztcbmltcG9ydCB7IEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvZW50aXR5LXV0aWxpdGllcy5jbGFzcyc7XG5pbXBvcnQgeyBOZ01vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25neC1tYXQtZW50aXR5LWludGVybmFsLWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vaW50ZXJuYWwtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2ludGVybmFsLWlucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmd4TWF0RW50aXR5SW50ZXJuYWxJbnB1dENvbXBvbmVudDxFbnRpdHlUeXBlIGV4dGVuZHMgRW50aXR5PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGVudGl0eSBvbiB3aGljaCB0aGUgcHJvcGVydHkgZXhpc3RzLiBVc2VkIGluIGNvbmp1Y3Rpb24gd2l0aCB0aGUgXCJwcm9wZXJ0eUtleVwiXG4gICAgICogdG8gZGV0ZXJtaW5lIHRoZSBwcm9wZXJ0eSBmb3Igd2hpY2ggdGhlIGlucHV0IHNob3VsZCBiZSBnZW5lcmF0ZWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBlbnRpdHkhOiBFbnRpdHlUeXBlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdlbmVyYXRlIHRoZSBpbnB1dCBmb3IuIFVzZWQgaW4gY29uanVjdGlvbiB3aXRoIHRoZSBcImVudGl0eVwiLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHJvcGVydHlLZXkhOiBrZXlvZiBFbnRpdHlUeXBlO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBoaWRlIGEgdmFsdWUgaWYgaXQgaXMgb21pdHRlZCBmb3IgY3JlYXRpb24uXG4gICAgICogSXMgdXNlZCBpbnRlcm5hbGx5IGZvciB0aGUgb2JqZWN0IHByb3BlcnR5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGlkZU9taXRGb3JDcmVhdGU/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBoaWRlIGEgdmFsdWUgaWYgaXQgaXMgb21pdHRlZCBmb3IgZWRpdGluZy5cbiAgICAgKiBJcyB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBoaWRlT21pdEZvckVkaXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogKG9wdGlvbmFsKSBBIGN1c3RvbSBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGUgZXJyb3ItbWVzc2FnZSBmb3IgaW52YWxpZCBpbnB1dHMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlITogKG1vZGVsOiBOZ01vZGVsKSA9PiBzdHJpbmc7XG5cbiAgICB0eXBlITogRGVjb3JhdG9yVHlwZXM7XG5cbiAgICBtZXRhZGF0YSE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnO1xuXG4gICAgbWV0YWRhdGFEZWZhdWx0U3RyaW5nITogRGVmYXVsdFN0cmluZ0RlY29yYXRvckNvbmZpZztcbiAgICBtZXRhZGF0YVRleHRib3hTdHJpbmchOiBUZXh0Ym94U3RyaW5nRGVjb3JhdG9yQ29uZmlnO1xuICAgIG1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nITogQXV0b2NvbXBsZXRlU3RyaW5nRGVjb3JhdG9yQ29uZmlnO1xuICAgIG1ldGFkYXRhRHJvcGRvd25TdHJpbmchOiBEcm9wZG93blN0cmluZ0RlY29yYXRvckNvbmZpZztcblxuICAgIG1ldGFkYXRhRHJvcGRvd25Cb29sZWFuITogRHJvcGRvd25Cb29sZWFuRGVjb3JhdG9yQ29uZmlnO1xuXG4gICAgbWV0YWRhdGFEZWZhdWx0TnVtYmVyITogRGVmYXVsdE51bWJlckRlY29yYXRvckNvbmZpZztcbiAgICBtZXRhZGF0YURyb3Bkb3duTnVtYmVyITogRHJvcGRvd25OdW1iZXJEZWNvcmF0b3JDb25maWc7XG5cbiAgICBtZXRhZGF0YURlZmF1bHRPYmplY3QhOiBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnO1xuICAgIG9iamVjdFByb3BlcnR5ITogRW50aXR5O1xuXG4gICAgcmVhZG9ubHkgRGVjb3JhdG9yVHlwZXMgPSBEZWNvcmF0b3JUeXBlcztcblxuICAgIGdldFdpZHRoID0gRW50aXR5VXRpbGl0aWVzLmdldFdpZHRoO1xuXG4gICAgLyoqXG4gICAgICogSGVscGVyIG1ldGhvZCBuZWVkZWQgdG8gcmVjdXJzaXZlbHkgZ2VuZXJhdGUgcHJvcGVydHkgaW5wdXQgY29tcG9uZW50cyAodXNlZCBlZy4gd2l0aCB0aGUgb2JqZWN0KVxuICAgICAqL1xuICAgIHRyYWNrQnlGbihpbmRleDogdW5rbm93bik6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbnRpdHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBJbnB1dCBkYXRhIFwiZW50aXR5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBJbnB1dCBkYXRhIFwicHJvcGVydHlLZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHlwZSA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUodGhpcy5lbnRpdHksIHRoaXMucHJvcGVydHlLZXkpO1xuICAgICAgICB0aGlzLm1ldGFkYXRhID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEodGhpcy5lbnRpdHksIHRoaXMucHJvcGVydHlLZXksIHRoaXMudHlwZSk7XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YURlZmF1bHRTdHJpbmcgPSB0aGlzLm1ldGFkYXRhIGFzIERlZmF1bHRTdHJpbmdEZWNvcmF0b3JDb25maWc7XG4gICAgICAgIHRoaXMubWV0YWRhdGFUZXh0Ym94U3RyaW5nID0gdGhpcy5tZXRhZGF0YSBhcyBUZXh0Ym94U3RyaW5nRGVjb3JhdG9yQ29uZmlnO1xuICAgICAgICB0aGlzLm1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nID0gdGhpcy5tZXRhZGF0YSBhcyBBdXRvY29tcGxldGVTdHJpbmdEZWNvcmF0b3JDb25maWc7XG4gICAgICAgIHRoaXMubWV0YWRhdGFEcm9wZG93blN0cmluZyA9IHRoaXMubWV0YWRhdGEgYXMgRHJvcGRvd25TdHJpbmdEZWNvcmF0b3JDb25maWc7XG5cbiAgICAgICAgdGhpcy5tZXRhZGF0YURyb3Bkb3duQm9vbGVhbiA9IHRoaXMubWV0YWRhdGEgYXMgRHJvcGRvd25Cb29sZWFuRGVjb3JhdG9yQ29uZmlnO1xuXG4gICAgICAgIHRoaXMubWV0YWRhdGFEZWZhdWx0TnVtYmVyID0gdGhpcy5tZXRhZGF0YSBhcyBEZWZhdWx0TnVtYmVyRGVjb3JhdG9yQ29uZmlnO1xuICAgICAgICB0aGlzLm1ldGFkYXRhRHJvcGRvd25OdW1iZXIgPSB0aGlzLm1ldGFkYXRhIGFzIERyb3Bkb3duTnVtYmVyRGVjb3JhdG9yQ29uZmlnO1xuXG4gICAgICAgIHRoaXMubWV0YWRhdGFEZWZhdWx0T2JqZWN0ID0gdGhpcy5tZXRhZGF0YSBhcyBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnO1xuICAgICAgICB0aGlzLm9iamVjdFByb3BlcnR5ID0gdGhpcy5lbnRpdHlbdGhpcy5wcm9wZXJ0eUtleV0gYXMgdW5rbm93biBhcyBFbnRpdHk7XG4gICAgfVxuXG4gICAgZ2V0T2JqZWN0UHJvcGVydGllcygpOiAoa2V5b2YgRW50aXR5KVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5KVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gdGhpcy5vYmplY3RQcm9wZXJ0eSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShcbiAgICAgICAgICAgICAgICB0aGlzLm9iamVjdFByb3BlcnR5LFxuICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBhcyBrZXlvZiBFbnRpdHksXG4gICAgICAgICAgICAgICAgIEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUodGhpcy5vYmplY3RQcm9wZXJ0eSwgcHJvcGVydHkgYXMga2V5b2YgRW50aXR5KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhKHRoaXMuaGlkZU9taXRGb3JDcmVhdGUgJiYgbWV0YWRhdGEub21pdEZvckNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgJiYgISh0aGlzLmhpZGVPbWl0Rm9yRWRpdCAmJiBtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2gocHJvcGVydHkgYXMga2V5b2YgRW50aXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzLnNvcnQoKGEsIGIpID0+IEVudGl0eVV0aWxpdGllcy5jb21wYXJlT3JkZXIoYSwgYiwgdGhpcy5vYmplY3RQcm9wZXJ0eSkpO1xuICAgIH1cbn0iLCI8ZGl2IFtuZ1N3aXRjaF09XCJ0eXBlXCIgKm5nSWY9XCIhKGhpZGVPbWl0Rm9yQ3JlYXRlICYmIG1ldGFkYXRhLm9taXRGb3JDcmVhdGUpICYmICEoaGlkZU9taXRGb3JFZGl0ICYmIG1ldGFkYXRhLm9taXRGb3JVcGRhdGUpXCI+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tU3RyaW5ncy0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuU1RSSU5HXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZW50aXR5W3Byb3BlcnR5S2V5XVwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiXG4gICAgICAgICAgICAgICAgI21vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwibWV0YWRhdGFEZWZhdWx0U3RyaW5nLnJlZ2V4ID8gbWV0YWRhdGFEZWZhdWx0U3RyaW5nLnJlZ2V4IDogJ1tcXFxcc1xcXFxTXSonXCJcbiAgICAgICAgICAgICAgICBbbWlubGVuZ3RoXT1cIm1ldGFkYXRhRGVmYXVsdFN0cmluZy5taW5MZW5ndGggPyBtZXRhZGF0YURlZmF1bHRTdHJpbmcubWluTGVuZ3RoIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW21heGxlbmd0aF09XCJtZXRhZGF0YURlZmF1bHRTdHJpbmcubWF4TGVuZ3RoID8gbWV0YWRhdGFEZWZhdWx0U3RyaW5nLm1heExlbmd0aCA6IG51bGxcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxtYXQtZXJyb3I+e3tnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKG1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5TVFJJTkdfVEVYVEJPWFwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7bWV0YWRhdGEuZGlzcGxheU5hbWV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cInByb3BlcnR5S2V5LnRvU3RyaW5nKClcIlxuICAgICAgICAgICAgICAgICNtb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAgICAgICBjZGtBdXRvc2l6ZU1pblJvd3M9XCIxMFwiXG4gICAgICAgICAgICAgICAgW21pbmxlbmd0aF09XCJtZXRhZGF0YVRleHRib3hTdHJpbmcubWluTGVuZ3RoID8gbWV0YWRhdGFUZXh0Ym94U3RyaW5nLm1pbkxlbmd0aCA6IG51bGxcIlxuICAgICAgICAgICAgICAgIFttYXhsZW5ndGhdPVwibWV0YWRhdGFUZXh0Ym94U3RyaW5nLm1heExlbmd0aCA/IG1ldGFkYXRhVGV4dGJveFN0cmluZy5tYXhMZW5ndGggOiBudWxsXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuU1RSSU5HX0FVVE9DT01QTEVURVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7bWV0YWRhdGEuZGlzcGxheU5hbWV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cInByb3BlcnR5S2V5LnRvU3RyaW5nKClcIlxuICAgICAgICAgICAgICAgICNtb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgW21pbmxlbmd0aF09XCJtZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZy5taW5MZW5ndGggPyBtZXRhZGF0YUF1dG9jb21wbGV0ZVN0cmluZy5taW5MZW5ndGggOiBudWxsXCJcbiAgICAgICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIm1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nLm1heExlbmd0aCA/IG1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nLm1heExlbmd0aCA6IG51bGxcIlxuICAgICAgICAgICAgICAgIFtwYXR0ZXJuXT1cIm1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nLnJlZ2V4ID8gbWV0YWRhdGFBdXRvY29tcGxldGVTdHJpbmcucmVnZXggOiAnW1xcXFxzXFxcXFNdKidcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHZhbHVlIG9mIG1ldGFkYXRhQXV0b2NvbXBsZXRlU3RyaW5nLmF1dG9jb21wbGV0ZVZhbHVlc1wiIFt2YWx1ZV09XCJ2YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7e3ZhbHVlfX1cbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuU1RSSU5HX0RST1BET1dOXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIiBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCIgI21vZGVsPVwibmdNb2RlbFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiBtZXRhZGF0YURyb3Bkb3duU3RyaW5nLmRyb3Bkb3duVmFsdWVzXCIgW3ZhbHVlXT1cInZhbHVlLnZhbHVlXCI+e3t2YWx1ZS5kaXNwbGF5TmFtZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPG1hdC1lcnJvcj57e2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UobW9kZWwpfX08L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLUJvb2xlYW5zLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkJPT0xFQU5fQ0hFQ0tCT1hcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIiBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCIgI21vZGVsPVwibmdNb2RlbFwiPlxuICAgICAgICAgICAgICAgIHt7bWV0YWRhdGEuZGlzcGxheU5hbWV9fVxuICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICA8IS0tIGhpZGRlbiBpbnB1dCBpcyBuZWVkZWQgc28gdGhhdCB0aGUgY2hlY2tib3ggY2FuIGJlIHVzZWQgaW5zaWRlIGEgbWF0LWZvcm0tZmllbGQgLS0+XG4gICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgaGlkZGVuPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQk9PTEVBTl9UT0dHTEVcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgWyhuZ01vZGVsKV09XCJlbnRpdHlbcHJvcGVydHlLZXldXCIgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiICNtb2RlbD1cIm5nTW9kZWxcIj5cbiAgICAgICAgICAgICAgICB7e21ldGFkYXRhLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgIDwhLS0gaGlkZGVuIGlucHV0IGlzIG5lZWRlZCBzbyB0aGF0IHRoZSB0b2dnbGUgY2FuIGJlIHVzZWQgaW5zaWRlIGEgbWF0LWZvcm0tZmllbGQgLS0+XG4gICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgaGlkZGVuPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQk9PTEVBTl9EUk9QRE9XTlwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7bWV0YWRhdGEuZGlzcGxheU5hbWV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJlbnRpdHlbcHJvcGVydHlLZXldXCIgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiICNtb2RlbD1cIm5nTW9kZWxcIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwidW5kZWZpbmVkXCI+LTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwidHJ1ZVwiPnt7bWV0YWRhdGFEcm9wZG93bkJvb2xlYW4uZHJvcGRvd25UcnVlfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImZhbHNlXCI+e3ttZXRhZGF0YURyb3Bkb3duQm9vbGVhbi5kcm9wZG93bkZhbHNlfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLU51bWJlcnMtLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuTlVNQkVSXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZW50aXR5W3Byb3BlcnR5S2V5XVwiXG4gICAgICAgICAgICAgICAgW25hbWVdPVwicHJvcGVydHlLZXkudG9TdHJpbmcoKVwiXG4gICAgICAgICAgICAgICAgI21vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgW21pbl09XCJtZXRhZGF0YURlZmF1bHROdW1iZXIubWluID8gbWV0YWRhdGFEZWZhdWx0TnVtYmVyLm1pbiA6IG51bGxcIlxuICAgICAgICAgICAgICAgIFttYXhdPVwibWV0YWRhdGFEZWZhdWx0TnVtYmVyLm1heCA/IG1ldGFkYXRhRGVmYXVsdE51bWJlci5tYXggOiBudWxsXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bWF0LWVycm9yPnt7Z2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShtb2RlbCl9fTwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuTlVNQkVSX0RST1BET1dOXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+e3ttZXRhZGF0YS5kaXNwbGF5TmFtZX19PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cImVudGl0eVtwcm9wZXJ0eUtleV1cIiBbbmFtZV09XCJwcm9wZXJ0eUtleS50b1N0cmluZygpXCIgI21vZGVsPVwibmdNb2RlbFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiBtZXRhZGF0YURyb3Bkb3duTnVtYmVyLmRyb3Bkb3duVmFsdWVzXCIgW3ZhbHVlXT1cInZhbHVlLnZhbHVlXCI+e3t2YWx1ZS5kaXNwbGF5TmFtZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPG1hdC1lcnJvcj57e2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UobW9kZWwpfX08L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tT2JqZWN0LS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLk9CSkVDVFwiPlxuICAgICAgICA8Yj57e21ldGFkYXRhRGVmYXVsdE9iamVjdC5kaXNwbGF5TmFtZX19PC9iPlxuICAgICAgICA8IS0tIGl0ZXJhdGVzIG92ZXIgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8IS0tXG4gICAgICAgICAgICAgICAgZGlzcGxheXMgYW5vdGhlciBuZ3gtbWF0ZXJpYWwtZW50aXR5IHdpdGggdGhlOlxuICAgICAgICAgICAgICAgIG9iamVjdCBhcyB0aGUgZW50aXR5LFxuICAgICAgICAgICAgICAgIHRoZSBjdXJyZW50IGtleSBpbiB0aGUgbG9vcCByZWNlaXZlZCBieSB0aGUga2V5dmFsdWUgZGlyZWN0aW9uIGFzIHRoZSBwcm9wZXJ0eUtleVxuICAgICAgICAgICAgICAgIGFuZCB0aGUgZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZSBvZiB0aGUgY3VycmVudCBjb21wb25lbnRcbiAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LWludGVybmFsLWlucHV0XG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiBnZXRPYmplY3RQcm9wZXJ0aWVzKCk7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgICAgICAgICAgW2VudGl0eV09XCJvYmplY3RQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cImhpZGVPbWl0Rm9yQ3JlYXRlXCJcbiAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JFZGl0XT1cImhpZGVPbWl0Rm9yRWRpdFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tnZXRXaWR0aChvYmplY3RQcm9wZXJ0eSwga2V5LCAnbGcnKX19IGNvbC1tZC17e2dldFdpZHRoKG9iamVjdFByb3BlcnR5LCBrZXksICdtZCcpfX0gY29sLXNtLXt7Z2V0V2lkdGgob2JqZWN0UHJvcGVydHksIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWludGVybmFsLWlucHV0PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5FUlJPUjogVGhlIHR5cGUge3t0eXBlfX1pcyBub3Qga25vd24uPC9kaXY+XG48L2Rpdj4iXX0=
|