ngx-material-entity 16.0.2 → 16.0.3
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/components/edit-page/edit-page.component.d.ts +13 -2
- package/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.d.ts +1 -0
- package/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.d.ts +2 -1
- package/components/input/input.component.d.ts +1 -1
- package/components/input/input.module.d.ts +4 -2
- package/components/input/number/number-slider-input/number-slider-input.component.d.ts +2 -1
- package/components/table/create-dialog/create-entity-dialog.component.d.ts +3 -0
- package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +4 -0
- package/components/tooltip/tooltip.component.d.ts +9 -0
- package/decorators/array/array-decorator-internal.data.d.ts +6 -6
- package/decorators/array/array-decorator.data.d.ts +7 -7
- package/decorators/base/property-decorator-internal.data.d.ts +11 -2
- package/decorators/base/property-decorator.data.d.ts +9 -1
- package/decorators/boolean/boolean-decorator-internal.data.d.ts +3 -3
- package/decorators/boolean/boolean-decorator.data.d.ts +1 -1
- package/decorators/custom/custom-decorator-internal.data.d.ts +2 -2
- package/decorators/custom/custom-decorator.data.d.ts +4 -4
- package/decorators/date/date-decorator-internal.data.d.ts +4 -4
- package/decorators/date/date-decorator.data.d.ts +5 -5
- package/decorators/file/file-decorator-internal.data.d.ts +3 -3
- package/decorators/file/file-decorator.data.d.ts +1 -1
- package/decorators/has-many/has-many-decorator-internal.data.d.ts +1 -1
- package/decorators/has-many/has-many-decorator.data.d.ts +1 -1
- package/decorators/number/number-decorator-internal.data.d.ts +3 -3
- package/decorators/number/number-decorator.data.d.ts +1 -1
- package/decorators/object/object-decorator-internal.data.d.ts +1 -1
- package/decorators/object/object-decorator.data.d.ts +1 -1
- package/decorators/references-many/references-many-decorator-internal.data.d.ts +1 -1
- package/decorators/references-many/references-many-decorator.data.d.ts +1 -1
- package/decorators/references-one/references-one-decorator-internal.data.d.ts +1 -1
- package/decorators/references-one/references-one-decorator.data.d.ts +1 -1
- package/decorators/string/string-decorator-internal.data.d.ts +5 -6
- package/decorators/string/string-decorator.data.d.ts +1 -7
- package/directives/number.directive.d.ts +17 -0
- package/directives/password-match.directive.d.ts +14 -0
- package/directives/tooltip.directive.d.ts +33 -0
- package/esm2022/components/edit-page/edit-page.component.mjs +57 -13
- package/esm2022/components/input/array/array-date-range-input/array-date-range-input.component.mjs +1 -1
- package/esm2022/components/input/base-input.component.mjs +2 -1
- package/esm2022/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +6 -3
- package/esm2022/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +6 -3
- package/esm2022/components/input/date/date-range-input/date-range-input.component.mjs +3 -1
- package/esm2022/components/input/file/file-image-input/file-image-input.component.mjs +3 -3
- package/esm2022/components/input/file/file-input/file-input.component.mjs +1 -1
- package/esm2022/components/input/input.component.mjs +7 -6
- package/esm2022/components/input/input.module.mjs +10 -4
- package/esm2022/components/input/number/number-input/number-input.component.mjs +4 -3
- package/esm2022/components/input/number/number-slider-input/number-slider-input.component.mjs +6 -3
- package/esm2022/components/input/string/string-password-input/string-password-input.component.mjs +4 -3
- package/esm2022/components/table/create-dialog/create-entity-dialog.component.mjs +18 -6
- package/esm2022/components/table/edit-dialog/edit-entity-dialog.component.mjs +26 -13
- package/esm2022/components/table/table.component.mjs +7 -4
- package/esm2022/components/tooltip/tooltip.component.mjs +20 -0
- package/esm2022/decorators/array/array-decorator-internal.data.mjs +1 -1
- package/esm2022/decorators/array/array-decorator.data.mjs +1 -1
- package/esm2022/decorators/base/property-decorator-internal.data.mjs +22 -1
- package/esm2022/decorators/base/property-decorator.data.mjs +10 -1
- package/esm2022/decorators/boolean/boolean-decorator-internal.data.mjs +1 -1
- package/esm2022/decorators/boolean/boolean-decorator.data.mjs +1 -1
- package/esm2022/decorators/custom/custom-decorator-internal.data.mjs +2 -2
- package/esm2022/decorators/custom/custom-decorator.data.mjs +1 -1
- package/esm2022/decorators/date/date-decorator-internal.data.mjs +2 -1
- package/esm2022/decorators/date/date-decorator.data.mjs +1 -1
- package/esm2022/decorators/file/file-decorator-internal.data.mjs +1 -1
- package/esm2022/decorators/file/file-decorator.data.mjs +1 -1
- package/esm2022/decorators/has-many/has-many-decorator-internal.data.mjs +1 -1
- package/esm2022/decorators/has-many/has-many-decorator.data.mjs +1 -1
- package/esm2022/decorators/number/number-decorator-internal.data.mjs +1 -1
- package/esm2022/decorators/number/number-decorator.data.mjs +1 -1
- package/esm2022/decorators/object/object-decorator-internal.data.mjs +1 -1
- package/esm2022/decorators/object/object-decorator.data.mjs +1 -1
- package/esm2022/decorators/references-many/references-many-decorator-internal.data.mjs +1 -1
- package/esm2022/decorators/references-many/references-many-decorator.data.mjs +1 -1
- package/esm2022/decorators/references-one/references-one-decorator-internal.data.mjs +1 -1
- package/esm2022/decorators/references-one/references-one-decorator.data.mjs +1 -1
- package/esm2022/decorators/string/string-decorator-internal.data.mjs +1 -4
- package/esm2022/decorators/string/string-decorator.data.mjs +1 -1
- package/esm2022/directives/drag-drop.directive.mjs +62 -0
- package/esm2022/directives/number.directive.mjs +38 -0
- package/esm2022/directives/password-match.directive.mjs +30 -0
- package/esm2022/directives/tooltip.directive.mjs +112 -0
- package/esm2022/functions/get-validation-error-message.function.mjs +49 -0
- package/esm2022/functions/get-validation-errors-tooltip-content.function.ts.mjs +25 -0
- package/esm2022/public-api.mjs +6 -2
- package/esm2022/utilities/entity.utilities.mjs +83 -386
- package/esm2022/utilities/validation.utilities.mjs +455 -0
- package/fesm2022/ngx-material-entity.mjs +1374 -905
- package/fesm2022/ngx-material-entity.mjs.map +1 -1
- package/functions/get-validation-errors-tooltip-content.function.ts.d.ts +10 -0
- package/package.json +1 -1
- package/public-api.d.ts +4 -1
- package/utilities/entity.utilities.d.ts +33 -30
- package/utilities/validation.utilities.d.ts +56 -0
- package/esm2022/components/get-validation-error-message.function.mjs +0 -42
- package/esm2022/components/input/file/file-input/dragDrop.directive.mjs +0 -62
- /package/{components/input/file/file-input/dragDrop.directive.d.ts → directives/drag-drop.directive.d.ts} +0 -0
- /package/{components → functions}/get-validation-error-message.function.d.ts +0 -0
|
@@ -12,12 +12,13 @@ import { LodashUtilities } from '../../encapsulation/lodash.utilities';
|
|
|
12
12
|
import { ReflectUtilities } from '../../encapsulation/reflect.utilities';
|
|
13
13
|
import { UUIDUtilities } from '../../encapsulation/uuid.utilities';
|
|
14
14
|
import { defaultFalse } from '../../functions/default-false.function';
|
|
15
|
+
import { NGX_GET_VALIDATION_ERROR_MESSAGE } from '../../functions/get-validation-error-message.function';
|
|
15
16
|
import { DateUtilities } from '../../utilities/date.utilities';
|
|
16
17
|
import { EntityUtilities } from '../../utilities/entity.utilities';
|
|
17
18
|
import { SelectionUtilities } from '../../utilities/selection.utilities';
|
|
19
|
+
import { ValidationUtilities } from '../../utilities/validation.utilities';
|
|
18
20
|
import { ConfirmDialogDataBuilder } from '../confirm-dialog/confirm-dialog-data.builder';
|
|
19
21
|
import { NgxMatEntityConfirmDialogComponent } from '../confirm-dialog/confirm-dialog.component';
|
|
20
|
-
import { NGX_GET_VALIDATION_ERROR_MESSAGE } from '../get-validation-error-message.function';
|
|
21
22
|
import { CreateDialogDataBuilder } from '../table/create-dialog/create-dialog-data.builder';
|
|
22
23
|
import { BaseTableActionInternal } from '../table/table-data.builder';
|
|
23
24
|
import * as i0 from "@angular/core";
|
|
@@ -732,7 +733,7 @@ export class NgxMatEntityInputComponent {
|
|
|
732
733
|
* @param omit - Whether values omitted for create or update should be left out.
|
|
733
734
|
*/
|
|
734
735
|
checkIsHasManyEntityValid(omit) {
|
|
735
|
-
this.isHasManyEntityValid =
|
|
736
|
+
this.isHasManyEntityValid = ValidationUtilities.isEntityValid(this.hasManyEntity, omit);
|
|
736
737
|
}
|
|
737
738
|
/**
|
|
738
739
|
* Checks whether the array item is valid and if the array item is dirty.
|
|
@@ -751,7 +752,7 @@ export class NgxMatEntityInputComponent {
|
|
|
751
752
|
* Checks if the arrayItem is valid.
|
|
752
753
|
*/
|
|
753
754
|
checkIsArrayItemValid() {
|
|
754
|
-
this.isArrayItemValid =
|
|
755
|
+
this.isArrayItemValid = ValidationUtilities.isEntityValid(this.arrayItem, 'create');
|
|
755
756
|
}
|
|
756
757
|
/**
|
|
757
758
|
* Emits that a the value has been changed.
|
|
@@ -858,11 +859,11 @@ export class NgxMatEntityInputComponent {
|
|
|
858
859
|
this.emitChange();
|
|
859
860
|
}
|
|
860
861
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: NgxMatEntityInputComponent, deps: [{ token: i1.MatDialog }, { token: i0.EnvironmentInjector }, { token: i2.Router }, { token: NGX_GET_VALIDATION_ERROR_MESSAGE }, { token: i3.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
|
|
861
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: { entity: "entity", propertyKey: "propertyKey", getValidationErrorMessage: "getValidationErrorMessage", hideOmitForCreate: "hideOmitForCreate", hideOmitForEdit: "hideOmitForEdit", validEmpty: "validEmpty", isReadOnly: "isReadOnly" }, outputs: { inputChangeEvent: "inputChangeEvent" }, viewQueries: [{ propertyName: "addArrayItemDialog", first: true, predicate: ["addArrayItemDialog"], descendants: true }, { propertyName: "editArrayItemDialog", first: true, predicate: ["editArrayItemDialog"], descendants: true }, { propertyName: "hasManyPaginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "hasManySort", first: true, predicate: MatSort, descendants: true }, { propertyName: "hasManyFilter", first: true, predicate: ["filter"], descendants: true, static: true }, { propertyName: "createHasManyDialog", first: true, predicate: ["createHasManyDialog"], descendants: true }, { propertyName: "editHasManyDialog", first: true, predicate: ["editHasManyDialog"], descendants: true }], ngImport: i0, template: "<div [ngSwitch]=\"type\" *ngIf=\"!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)\">\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.STRING\">\n <string-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_TEXTBOX\">\n <string-textbox-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-textbox-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_AUTOCOMPLETE\">\n <string-autocomplete-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-autocomplete-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_DROPDOWN\">\n <string-dropdown-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-dropdown-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_PASSWORD\">\n <string-password-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-password-input>\n </div>\n\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_CHECKBOX\">\n <boolean-checkbox-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </boolean-checkbox-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_TOGGLE\">\n <boolean-toggle-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </boolean-toggle-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_DROPDOWN\">\n <boolean-dropdown-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </boolean-dropdown-input>\n </div>\n\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER\">\n <number-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </number-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_DROPDOWN\">\n <number-dropdown-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </number-dropdown-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_SLIDER\">\n <number-slider-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </number-slider-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE\">\n <array-date-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-date-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE_TIME\">\n <array-date-time-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-date-time-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE_RANGE\">\n <array-date-range-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-date-range-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_CHIPS\">\n <array-string-chips-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-string-chips-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS\">\n <array-string-autocomplete-chips\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-string-autocomplete-chips>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Dates-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.DATE\">\n <date-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </date-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.DATE_RANGE\">\n <date-range-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </date-range-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.DATE_TIME\">\n <date-time-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </date-time-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Files-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.FILE_DEFAULT\">\n <file-default-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </file-default-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.FILE_IMAGE\">\n <file-image-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </file-image-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------- references many ------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.REFERENCES_MANY\">\n <references-many-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </references-many-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Custom------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.CUSTOM\">\n <custom-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </custom-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.OBJECT\">\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <mat-tab-group *ngIf=\"objectPropertyTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of objectPropertyTabs; let tI = index; trackBy: trackByFn\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows;\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let rI = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"isPropertyReadOnly(objectProperty, key)\"\n class=\"col-lg-{{EntityUtilities.getWidth(objectProperty, key, 'lg')}} col-md-{{EntityUtilities.getWidth(objectProperty, key, 'md')}} col-sm-{{EntityUtilities.getWidth(objectProperty, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <div *ngIf=\"objectPropertyTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of objectPropertyTabs[0].rows\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"isPropertyReadOnly(objectProperty, key)\"\n class=\"col-lg-{{EntityUtilities.getWidth(objectProperty, key, 'lg')}} col-md-{{EntityUtilities.getWidth(objectProperty, key, 'md')}} col-sm-{{EntityUtilities.getWidth(objectProperty, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------- references one ------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.REFERENCES_ONE\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"internalEntity[internalPropertyKey]\"\n [name]=\"internalPropertyKey.toString() + 'input' + referencesOneUUID\"\n #inputModel=\"ngModel\"\n [disabled]=\"internalIsReadOnly\"\n [required]=\"metadata.required(entity)\"\n (ngModelChange)=\"setReferencesOneObject()\"\n >\n <mat-option *ngIf=\"!metadata.required(entity)\">-</mat-option>\n <mat-option *ngFor=\"let value of referencesOneDropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{internalGetValidationErrorMessage(inputModel)}}</mat-error>\n </mat-form-field>\n <!-- iterates over the references one properties -->\n <mat-tab-group *ngIf=\"referencesOnePropertyTabs && referencesOnePropertyTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of referencesOnePropertyTabs; let tI = index; trackBy: trackByFn\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows;\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let rI = index; trackBy: trackByFn\"\n [entity]=\"referencesOneObject\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(referencesOneObject, key, 'lg')}} col-md-{{EntityUtilities.getWidth(referencesOneObject, key, 'md')}} col-sm-{{EntityUtilities.getWidth(referencesOneObject, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <div *ngIf=\"referencesOnePropertyTabs && referencesOnePropertyTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of referencesOnePropertyTabs[0].rows\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"referencesOneObject\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(referencesOneObject, key, 'lg')}} col-md-{{EntityUtilities.getWidth(referencesOneObject, key, 'md')}} col-sm-{{EntityUtilities.getWidth(referencesOneObject, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div class=\"entityArray\" *ngSwitchCase=\"DecoratorTypes.ARRAY\">\n <div class=\"mat-elevation-z8 elevation-container\">\n <div class=\"array-headline\">\n <b>{{metadataEntityArray.displayName}}</b>\n </div>\n <div *ngIf=\"metadataEntityArray.createInline && !internalIsReadOnly\">\n <mat-tab-group *ngIf=\"arrayItemInlineTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of arrayItemInlineTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <div *ngIf=\"arrayItemInlineTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of arrayItemInlineTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </div>\n\n <div class=\"buttons\" *ngIf=\"!internalIsReadOnly\">\n <button type=\"button\" mat-raised-button\n [disabled]=\"metadataEntityArray.createInline && !isArrayItemValid\"\n (click)=\"addEntity()\">\n {{metadataEntityArray.addButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button\n [disabled]=\"!entityArraySelection.selected.length\"\n (click)=\"removeFromEntityArray()\">\n {{metadataEntityArray.removeButtonLabel}}\n </button>\n </div>\n \n <mat-table [dataSource]=\"entityArrayDataSource\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\" *ngIf=\"!internalIsReadOnly\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox\n [disabled]=\"!entityArrayDataSource.data.length\" (change)=\"$event ? SelectionUtilities.masterToggle(entityArraySelection, entityArrayDataSource) : null\"\n [checked]=\"entityArraySelection.hasValue() && SelectionUtilities.isAllSelected(entityArraySelection, entityArrayDataSource)\"\n [indeterminate]=\"entityArraySelection.hasValue() && !SelectionUtilities.isAllSelected(entityArraySelection, entityArrayDataSource)\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let entity\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? entityArraySelection.toggle(entity) : null\" [checked]=\"entityArraySelection.isSelected(entity)\"></mat-checkbox>\n </mat-cell>\n </ng-container>\n \n <ng-container *ngFor=\"let dCol of metadataEntityArray.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell [class.enabled]=\"!dCol.disableClick\" (click)=\"editArrayItem(entity, dCol)\" *matCellDef=\"let entity\">\n <ng-container *ngIf=\"dCol.Component\">\n <display-column-value [entity]=\"entity\" [ComponentClass]=\"dCol.Component\"></display-column-value>\n </ng-container>\n <ng-container *ngIf=\"!dCol.Component\">\n {{getDisplayColumnValue(entity, dCol)}}\n </ng-container>\n </mat-cell>\n </ng-container>\n \n <mat-header-row *matHeaderRowDef=\"entityArrayDisplayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: entityArrayDisplayedColumns\"></mat-row>\n </mat-table>\n \n <div class=\"array-error\" *ngIf=\"metadataEntityArray.required(entity) && !entityArrayDataSource.data.length\">\n {{metadataEntityArray.missingErrorMessage}}\n </div>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!------------------ has many ---------------->\n <!-------------------------------------------->\n <div class=\"hasMany\" *ngSwitchCase=\"DecoratorTypes.HAS_MANY\">\n <h2 class=\"title\">{{metadataHasMany.tableData.baseData.title}}</h2>\n\n <div class=\"row\">\n <mat-form-field class=\"col-lg-8 col-md-6 col-sm-12\">\n <mat-label>{{metadataHasMany.tableData.baseData.searchLabel}}</mat-label>\n <input matInput (keyup)=\"applyHasManyFilter($event)\">\n </mat-form-field>\n <div\n *ngIf=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-lg-2]=\"hasManyAllowCreate\"\n [class.col-lg-4]=\"!hasManyAllowCreate\"\n [class.col-md-3]=\"hasManyAllowCreate\"\n [class.col-md-6]=\"!hasManyAllowCreate\"\n [class.col-sm-6]=\"hasManyAllowCreate\"\n [class.col-sm-12]=\"!hasManyAllowCreate\"\n >\n <button type=\"button\" class=\"actions-button\" [matMenuTriggerFor]=\"menu\" mat-raised-button>\n {{metadataHasMany.tableData.baseData.tableActionsLabel}}\n </button>\n </div>\n <mat-menu #menu=\"matMenu\">\n <button *ngIf=\"metadataHasMany.tableData.baseData.allowJsonImport\" type=\"button\" [disabled]=\"hasManyTableActionDisabled(hasManyImportAction)\" (click)=\"runHasManyTableAction(hasManyImportAction)\" mat-menu-item>\n {{hasManyImportAction.displayName}}\n </button>\n <button type=\"button\" *ngFor=\"let action of metadataHasMany.tableData.baseData.tableActions\" [disabled]=\"hasManyTableActionDisabled(action)\" (click)=\"runHasManyTableAction(action)\" mat-menu-item>\n {{action.displayName}}\n </button>\n </mat-menu>\n\n <div\n *ngIf=\"hasManyAllowCreate\"\n [class.col-lg-2]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-lg-4]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-md-3]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-md-6]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-sm-6]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-sm-12]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n >\n <button type=\"button\" class=\"create-button\" (click)=\"createHasManyEntity()\" mat-raised-button>\n {{metadataHasMany.tableData.baseData.createButtonLabel}}\n </button>\n </div>\n </div>\n\n <div class=\"mat-elevation-z8 elevation-container\">\n <mat-table [dataSource]=\"hasManyDataSource\" matSort>\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox (change)=\"$event ? SelectionUtilities.masterToggle(hasManySelection, hasManyDataSource) : null\"\n [checked]=\"hasManySelection.hasValue() && SelectionUtilities.isAllSelected(hasManySelection, hasManyDataSource)\"\n [indeterminate]=\"hasManySelection.hasValue() && !SelectionUtilities.isAllSelected(hasManySelection, hasManyDataSource)\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let entity\" class=\"enabled\">\n <mat-checkbox (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? hasManySelection.toggle(entity) : null\"\n [checked]=\"hasManySelection.isSelected(entity)\">\n </mat-checkbox>\n </mat-cell>\n </ng-container>\n\n <ng-container *ngFor=\"let dCol of metadataHasMany.tableData.baseData.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell [class.enabled]=\"!dCol.disableClick && (hasManyAllowUpdate(entity) || hasManyAllowRead(entity))\"\n (click)=\"editHasManyEntity(entity, dCol)\"\n *matCellDef=\"let entity\"\n >\n <ng-container *ngIf=\"dCol.Component\">\n <display-column-value [entity]=\"entity\" [ComponentClass]=\"dCol.Component\"></display-column-value>\n </ng-container>\n <ng-container *ngIf=\"!dCol.Component\">\n {{getDisplayColumnValue(entity, dCol)}}\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedHasManyColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedHasManyColumns\"></mat-row>\n </mat-table>\n\n <mat-spinner *ngIf=\"hasManyIsLoading && metadataHasMany.tableData.baseData.displayLoadingSpinner\">\n </mat-spinner>\n\n <mat-paginator [length]=\"hasManyDataSource.filteredData.length\" [pageIndex]=\"0\" [pageSize]=\"10\" [pageSizeOptions]=\"[5, 10, 25, 50]\"></mat-paginator>\n </div>\n </div>\n\n <div *ngSwitchDefault>ERROR: The type {{type}} is not known.</div>\n</div>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<!--------------------------------------------------------->\n<!--------------------Add Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #addArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{addArrayItemDialogData.title}}</div>\n </div>\n\n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"arrayItemDialogTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of arrayItemDialogTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"arrayItemDialogTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of arrayItemDialogTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" mat-raised-button (click)=\"addArrayItem()\" [disabled]=\"!isArrayItemValid\">\n {{addArrayItemDialogData.createButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"closeAddArrayItemDialog()\" class=\"cancel-button\">\n {{addArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Edit Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #editArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{editArrayItemDialogData.title(arrayItemPriorChanges)}}</div>\n </div>\n \n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"arrayItemDialogTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of arrayItemDialogTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkArrayItem()\"\n [isReadOnly]=\"isPropertyReadOnly(arrayItem, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"arrayItemDialogTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of arrayItemDialogTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkArrayItem()\"\n [isReadOnly]=\"isPropertyReadOnly(arrayItem, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" (click)=\"saveArrayItem()\" mat-raised-button [disabled]=\"internalIsReadOnly || !isArrayItemValid || !isArrayItemDirty\">\n {{editArrayItemDialogData.confirmButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"closeEditArrayItemDialog()\" class=\"cancel-button\">\n {{editArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Create Has Many Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #createHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.createDialogData.title}}</div>\n </div>\n \n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"hasManyCreateTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of hasManyCreateTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsHasManyEntityValid('create')\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"hasManyCreateTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of hasManyCreateTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsHasManyEntityValid('create')\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" (click)=\"dialogCreateHasMany()\" mat-raised-button [disabled]=\"!isHasManyEntityValid\">\n {{metadataHasMany.tableData.createDialogData.createButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"dialogCancelCreateHasMany()\" class=\"cancel-button\">\n {{metadataHasMany.tableData.createDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n \n</ng-template>\n\n<ng-template #editHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.editData.title(hasManyEntityPriorChanges)}}</div>\n\n <div class=\"actions-container\">\n <button *ngIf=\"metadataHasMany.tableData.editData.actions.length\" type=\"button\" [matMenuTriggerFor]=\"menu\" mat-raised-button>\n {{metadataHasMany.tableData.editData.actionsLabel}}\n </button>\n <mat-menu #menu=\"matMenu\">\n <button type=\"button\" *ngFor=\"let action of metadataHasMany.tableData.editData.actions\" [disabled]=\"hasManyEditActionDisabled(action)\" (click)=\"hasManyRunEditAction(action)\" mat-menu-item>\n {{action.displayName}}\n </button>\n </mat-menu>\n \n <button type=\"button\" *ngIf=\"hasManyAllowDelete(hasManyEntity)\" mat-raised-button (click)=\"deleteHasManyEntity()\" color=\"warn\" class=\"delete-button\" tabindex=\"-1\">\n {{metadataHasMany.tableData.editData.deleteButtonLabel}}\n </button>\n </div>\n </div>\n \n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"hasManyUpdateTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of hasManyUpdateTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkHasManyEntity()\"\n [isReadOnly]=\"isPropertyReadOnly(hasManyEntity, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"hasManyUpdateTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of hasManyUpdateTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkHasManyEntity()\"\n [isReadOnly]=\"isPropertyReadOnly(hasManyEntity, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" (click)=\"dialogEditHasMany()\" mat-raised-button [disabled]=\"internalIsReadOnly || !isHasManyEntityValid || !isHasManyEntityDirty\">\n {{metadataHasMany.tableData.editData.confirmButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"dialogCancelEditHasMany()\" class=\"cancel-button\">\n {{metadataHasMany.tableData.editData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form> \n</ng-template>", styles: [".mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:1px solid rgba(0,0,0,.12)}.mat-dialog-title{padding:12px 20px;display:flex;justify-content:space-between;align-items:center}.mat-dialog-title div{font-size:var(--mdc-dialog-subhead-size, 14px);font-weight:var(--mdc-dialog-subhead-weight, 500)}::ng-deep .mdc-dialog .mdc-dialog__content{padding:6px 20px!important}mat-dialog-actions{justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}mat-spinner{margin:10px auto}::ng-deep .mat-mdc-tab-body-wrapper{margin-left:-12px;margin-right:-12px}::ng-deep mat-tab-body{padding-top:10px;padding-left:12px;padding-right:12px}::ng-deep mat-tab-body .mat-mdc-tab-body-content{overflow:initial}::ng-deep .mat-mdc-form-field.mat-form-field-disabled label{color:#0009}::ng-deep .mat-mdc-form-field.mat-form-field-disabled input,::ng-deep .mat-mdc-form-field.mat-form-field-disabled textarea,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-disabled,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#000}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled button{opacity:.2}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-date-range-input-inner:disabled{color:#000}::ng-deep .mat-mdc-form-field .mat-mdc-slide-toggle{opacity:1}.entityArray .elevation-container{border-radius:5px;padding:15px;margin-bottom:15px;margin-top:15px}.entityArray .array-headline{padding-bottom:10px}.entityArray .buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px}.entityArray mat-table{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:25px}.entityArray .mat-column-select{flex:0 0 75px}.entityArray .enabled:hover{cursor:pointer}.entityArray .array-error{display:flex;align-items:center;justify-content:center;margin-top:-25.8px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:25.8px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.hasMany button{width:100%;height:56px;line-height:24px;font-size:16px}.hasMany .title{text-align:center}.hasMany .elevation-container{border-radius:5px;padding:5px;margin-bottom:15px}.hasMany .mat-column-select{flex:0 0 75px}.hasMany .enabled:hover{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i5.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"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i11.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i11.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i12.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i13.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: i14.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i14.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i14.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i15.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i16.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i17.DisplayColumnValueComponent, selector: "display-column-value", inputs: ["entity", "ComponentClass"] }, { kind: "directive", type: i18.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i18.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i19.StringInputComponent, selector: "string-input" }, { kind: "component", type: i20.StringTextboxInputComponent, selector: "string-textbox-input" }, { kind: "component", type: i21.StringAutocompleteInputComponent, selector: "string-autocomplete-input" }, { kind: "component", type: i22.StringDropdownInputComponent, selector: "string-dropdown-input" }, { kind: "component", type: i23.StringPasswordInputComponent, selector: "string-password-input" }, { kind: "component", type: i24.BooleanCheckboxInputComponent, selector: "boolean-checkbox-input" }, { kind: "component", type: i25.BooleanToggleInputComponent, selector: "boolean-toggle-input" }, { kind: "component", type: i26.BooleanDropdownInputComponent, selector: "boolean-dropdown-input" }, { kind: "component", type: i27.NumberInputComponent, selector: "number-input" }, { kind: "component", type: i28.NumberDropdownInputComponent, selector: "number-dropdown-input" }, { kind: "component", type: i29.NumberSliderInputComponent, selector: "number-slider-input" }, { kind: "component", type: i30.ArrayStringChipsInputComponent, selector: "array-string-chips-input" }, { kind: "component", type: i31.ArrayStringAutocompleteChipsComponent, selector: "array-string-autocomplete-chips" }, { kind: "component", type: i32.DateInputComponent, selector: "date-input" }, { kind: "component", type: i33.DateRangeInputComponent, selector: "date-range-input" }, { kind: "component", type: i34.DateTimeInputComponent, selector: "date-time-input" }, { kind: "component", type: i35.ArrayDateInputComponent, selector: "array-date-input" }, { kind: "component", type: i36.ArrayDateTimeInputComponent, selector: "array-date-time-input" }, { kind: "component", type: i37.ArrayDateRangeInputComponent, selector: "array-date-range-input" }, { kind: "component", type: i38.FileImageInputComponent, selector: "file-image-input" }, { kind: "component", type: i39.FileDefaultInputComponent, selector: "file-default-input" }, { kind: "component", type: i40.ReferencesManyInputComponent, selector: "references-many-input" }, { kind: "component", type: i41.CustomInputComponent, selector: "custom-input" }, { kind: "component", type: NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: ["entity", "propertyKey", "getValidationErrorMessage", "hideOmitForCreate", "hideOmitForEdit", "validEmpty", "isReadOnly"], outputs: ["inputChangeEvent"] }] });
|
|
862
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.0", type: NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: { entity: "entity", propertyKey: "propertyKey", getValidationErrorMessage: "getValidationErrorMessage", hideOmitForCreate: "hideOmitForCreate", hideOmitForEdit: "hideOmitForEdit", validEmpty: "validEmpty", isReadOnly: "isReadOnly" }, outputs: { inputChangeEvent: "inputChangeEvent" }, viewQueries: [{ propertyName: "addArrayItemDialog", first: true, predicate: ["addArrayItemDialog"], descendants: true }, { propertyName: "editArrayItemDialog", first: true, predicate: ["editArrayItemDialog"], descendants: true }, { propertyName: "hasManyPaginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "hasManySort", first: true, predicate: MatSort, descendants: true }, { propertyName: "hasManyFilter", first: true, predicate: ["filter"], descendants: true, static: true }, { propertyName: "createHasManyDialog", first: true, predicate: ["createHasManyDialog"], descendants: true }, { propertyName: "editHasManyDialog", first: true, predicate: ["editHasManyDialog"], descendants: true }], ngImport: i0, template: "<div [ngSwitch]=\"type\" *ngIf=\"!(hideOmitForCreate && metadata.omitForCreate) && !(hideOmitForEdit && metadata.omitForUpdate)\">\n <!-------------------------------------------->\n <!-----------------Strings-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.STRING\">\n <string-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_TEXTBOX\">\n <string-textbox-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-textbox-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_AUTOCOMPLETE\">\n <string-autocomplete-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-autocomplete-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_DROPDOWN\">\n <string-dropdown-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-dropdown-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_PASSWORD\">\n <string-password-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-password-input>\n </div>\n\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_CHECKBOX\">\n <boolean-checkbox-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </boolean-checkbox-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_TOGGLE\">\n <boolean-toggle-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </boolean-toggle-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_DROPDOWN\">\n <boolean-dropdown-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </boolean-dropdown-input>\n </div>\n\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER\">\n <number-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </number-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_DROPDOWN\">\n <number-dropdown-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </number-dropdown-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_SLIDER\">\n <number-slider-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </number-slider-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE\">\n <array-date-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-date-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE_TIME\">\n <array-date-time-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-date-time-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE_RANGE\">\n <array-date-range-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-date-range-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_CHIPS\">\n <array-string-chips-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-string-chips-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS\">\n <array-string-autocomplete-chips\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-string-autocomplete-chips>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Dates-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.DATE\">\n <date-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </date-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.DATE_RANGE\">\n <date-range-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </date-range-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.DATE_TIME\">\n <date-time-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </date-time-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Files-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.FILE_DEFAULT\">\n <file-default-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </file-default-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.FILE_IMAGE\">\n <file-image-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </file-image-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------- references many ------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.REFERENCES_MANY\">\n <references-many-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </references-many-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Custom------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.CUSTOM\">\n <custom-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </custom-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.OBJECT\">\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <mat-tab-group *ngIf=\"objectPropertyTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of objectPropertyTabs; let tI = index; trackBy: trackByFn\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows;\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let rI = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"isPropertyReadOnly(objectProperty, key)\"\n class=\"col-lg-{{EntityUtilities.getWidth(objectProperty, key, 'lg')}} col-md-{{EntityUtilities.getWidth(objectProperty, key, 'md')}} col-sm-{{EntityUtilities.getWidth(objectProperty, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <div *ngIf=\"objectPropertyTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of objectPropertyTabs[0].rows\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"isPropertyReadOnly(objectProperty, key)\"\n class=\"col-lg-{{EntityUtilities.getWidth(objectProperty, key, 'lg')}} col-md-{{EntityUtilities.getWidth(objectProperty, key, 'md')}} col-sm-{{EntityUtilities.getWidth(objectProperty, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------- references one ------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.REFERENCES_ONE\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"internalEntity[internalPropertyKey]\"\n [name]=\"internalPropertyKey.toString() + 'input' + referencesOneUUID\"\n #inputModel=\"ngModel\"\n [disabled]=\"internalIsReadOnly\"\n [required]=\"metadata.required(entity)\"\n (ngModelChange)=\"setReferencesOneObject()\"\n >\n <mat-option *ngIf=\"!metadata.required(entity)\">-</mat-option>\n <mat-option *ngFor=\"let value of referencesOneDropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{internalGetValidationErrorMessage(inputModel)}}</mat-error>\n </mat-form-field>\n <!-- iterates over the references one properties -->\n <mat-tab-group *ngIf=\"referencesOnePropertyTabs && referencesOnePropertyTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of referencesOnePropertyTabs; let tI = index; trackBy: trackByFn\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows;\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let rI = index; trackBy: trackByFn\"\n [entity]=\"referencesOneObject\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(referencesOneObject, key, 'lg')}} col-md-{{EntityUtilities.getWidth(referencesOneObject, key, 'md')}} col-sm-{{EntityUtilities.getWidth(referencesOneObject, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <div *ngIf=\"referencesOnePropertyTabs && referencesOnePropertyTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of referencesOnePropertyTabs[0].rows\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"referencesOneObject\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(referencesOneObject, key, 'lg')}} col-md-{{EntityUtilities.getWidth(referencesOneObject, key, 'md')}} col-sm-{{EntityUtilities.getWidth(referencesOneObject, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div class=\"entityArray\" *ngSwitchCase=\"DecoratorTypes.ARRAY\">\n <div class=\"mat-elevation-z8 elevation-container\">\n <div class=\"array-headline\">\n <b>{{metadataEntityArray.displayName}}</b>\n </div>\n <div *ngIf=\"metadataEntityArray.createInline && !internalIsReadOnly\">\n <mat-tab-group *ngIf=\"arrayItemInlineTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of arrayItemInlineTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <div *ngIf=\"arrayItemInlineTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of arrayItemInlineTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </div>\n\n <div class=\"buttons\" *ngIf=\"!internalIsReadOnly\">\n <button type=\"button\" mat-raised-button\n [disabled]=\"metadataEntityArray.createInline && !isArrayItemValid\"\n (click)=\"addEntity()\">\n {{metadataEntityArray.addButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button\n [disabled]=\"!entityArraySelection.selected.length\"\n (click)=\"removeFromEntityArray()\">\n {{metadataEntityArray.removeButtonLabel}}\n </button>\n </div>\n \n <mat-table [dataSource]=\"entityArrayDataSource\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\" *ngIf=\"!internalIsReadOnly\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox\n [disabled]=\"!entityArrayDataSource.data.length\" (change)=\"$event ? SelectionUtilities.masterToggle(entityArraySelection, entityArrayDataSource) : null\"\n [checked]=\"entityArraySelection.hasValue() && SelectionUtilities.isAllSelected(entityArraySelection, entityArrayDataSource)\"\n [indeterminate]=\"entityArraySelection.hasValue() && !SelectionUtilities.isAllSelected(entityArraySelection, entityArrayDataSource)\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let entity\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? entityArraySelection.toggle(entity) : null\" [checked]=\"entityArraySelection.isSelected(entity)\"></mat-checkbox>\n </mat-cell>\n </ng-container>\n \n <ng-container *ngFor=\"let dCol of metadataEntityArray.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell [class.enabled]=\"!dCol.disableClick\" (click)=\"editArrayItem(entity, dCol)\" *matCellDef=\"let entity\">\n <ng-container *ngIf=\"dCol.Component\">\n <display-column-value [entity]=\"entity\" [ComponentClass]=\"dCol.Component\"></display-column-value>\n </ng-container>\n <ng-container *ngIf=\"!dCol.Component\">\n {{getDisplayColumnValue(entity, dCol)}}\n </ng-container>\n </mat-cell>\n </ng-container>\n \n <mat-header-row *matHeaderRowDef=\"entityArrayDisplayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: entityArrayDisplayedColumns\"></mat-row>\n </mat-table>\n \n <div class=\"array-error\" *ngIf=\"metadataEntityArray.required(entity) && !entityArrayDataSource.data.length\">\n {{metadataEntityArray.missingErrorMessage}}\n </div>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!------------------ has many ---------------->\n <!-------------------------------------------->\n <div class=\"hasMany\" *ngSwitchCase=\"DecoratorTypes.HAS_MANY\">\n <h2 class=\"title\">{{metadataHasMany.tableData.baseData.title}}</h2>\n\n <div class=\"row\">\n <mat-form-field class=\"col-lg-8 col-md-6 col-sm-12\">\n <mat-label>{{metadataHasMany.tableData.baseData.searchLabel}}</mat-label>\n <input matInput (keyup)=\"applyHasManyFilter($event)\">\n </mat-form-field>\n <div\n *ngIf=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-lg-2]=\"hasManyAllowCreate\"\n [class.col-lg-4]=\"!hasManyAllowCreate\"\n [class.col-md-3]=\"hasManyAllowCreate\"\n [class.col-md-6]=\"!hasManyAllowCreate\"\n [class.col-sm-6]=\"hasManyAllowCreate\"\n [class.col-sm-12]=\"!hasManyAllowCreate\"\n >\n <button type=\"button\" class=\"actions-button\" [matMenuTriggerFor]=\"menu\" mat-raised-button>\n {{metadataHasMany.tableData.baseData.tableActionsLabel}}\n </button>\n </div>\n <mat-menu #menu=\"matMenu\">\n <button *ngIf=\"metadataHasMany.tableData.baseData.allowJsonImport\" type=\"button\" [disabled]=\"hasManyTableActionDisabled(hasManyImportAction)\" (click)=\"runHasManyTableAction(hasManyImportAction)\" mat-menu-item>\n {{hasManyImportAction.displayName}}\n </button>\n <button type=\"button\" *ngFor=\"let action of metadataHasMany.tableData.baseData.tableActions\" [disabled]=\"hasManyTableActionDisabled(action)\" (click)=\"runHasManyTableAction(action)\" mat-menu-item>\n {{action.displayName}}\n </button>\n </mat-menu>\n\n <div\n *ngIf=\"hasManyAllowCreate\"\n [class.col-lg-2]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-lg-4]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-md-3]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-md-6]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-sm-6]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-sm-12]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n >\n <button type=\"button\" class=\"create-button\" (click)=\"createHasManyEntity()\" mat-raised-button>\n {{metadataHasMany.tableData.baseData.createButtonLabel}}\n </button>\n </div>\n </div>\n\n <div class=\"mat-elevation-z8 elevation-container\">\n <mat-table [dataSource]=\"hasManyDataSource\" matSort>\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox (change)=\"$event ? SelectionUtilities.masterToggle(hasManySelection, hasManyDataSource) : null\"\n [checked]=\"hasManySelection.hasValue() && SelectionUtilities.isAllSelected(hasManySelection, hasManyDataSource)\"\n [indeterminate]=\"hasManySelection.hasValue() && !SelectionUtilities.isAllSelected(hasManySelection, hasManyDataSource)\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let entity\" class=\"enabled\">\n <mat-checkbox (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? hasManySelection.toggle(entity) : null\"\n [checked]=\"hasManySelection.isSelected(entity)\">\n </mat-checkbox>\n </mat-cell>\n </ng-container>\n\n <ng-container *ngFor=\"let dCol of metadataHasMany.tableData.baseData.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell [class.enabled]=\"!dCol.disableClick && (hasManyAllowUpdate(entity) || hasManyAllowRead(entity))\"\n (click)=\"editHasManyEntity(entity, dCol)\"\n *matCellDef=\"let entity\"\n >\n <ng-container *ngIf=\"dCol.Component\">\n <display-column-value [entity]=\"entity\" [ComponentClass]=\"dCol.Component\"></display-column-value>\n </ng-container>\n <ng-container *ngIf=\"!dCol.Component\">\n {{getDisplayColumnValue(entity, dCol)}}\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedHasManyColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedHasManyColumns\"></mat-row>\n </mat-table>\n\n <mat-spinner *ngIf=\"hasManyIsLoading && metadataHasMany.tableData.baseData.displayLoadingSpinner\">\n </mat-spinner>\n\n <mat-paginator [length]=\"hasManyDataSource.filteredData.length\" [pageIndex]=\"0\" [pageSize]=\"10\" [pageSizeOptions]=\"[5, 10, 25, 50]\"></mat-paginator>\n </div>\n </div>\n\n <div *ngSwitchDefault>ERROR: The type {{type}} is not known.</div>\n</div>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<!--------------------------------------------------------->\n<!--------------------Add Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #addArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{addArrayItemDialogData.title}}</div>\n </div>\n\n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"arrayItemDialogTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of arrayItemDialogTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"arrayItemDialogTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of arrayItemDialogTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" mat-raised-button (click)=\"addArrayItem()\" [disabled]=\"!isArrayItemValid\">\n {{addArrayItemDialogData.createButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"closeAddArrayItemDialog()\" class=\"cancel-button\">\n {{addArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Edit Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #editArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{editArrayItemDialogData.title(arrayItemPriorChanges)}}</div>\n </div>\n \n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"arrayItemDialogTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of arrayItemDialogTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkArrayItem()\"\n [isReadOnly]=\"isPropertyReadOnly(arrayItem, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"arrayItemDialogTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of arrayItemDialogTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkArrayItem()\"\n [isReadOnly]=\"isPropertyReadOnly(arrayItem, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" (click)=\"saveArrayItem()\" mat-raised-button [disabled]=\"internalIsReadOnly || !isArrayItemValid || !isArrayItemDirty\">\n {{editArrayItemDialogData.confirmButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"closeEditArrayItemDialog()\" class=\"cancel-button\">\n {{editArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Create Has Many Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #createHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.createDialogData.title}}</div>\n </div>\n \n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"hasManyCreateTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of hasManyCreateTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsHasManyEntityValid('create')\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"hasManyCreateTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of hasManyCreateTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsHasManyEntityValid('create')\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" (click)=\"dialogCreateHasMany()\" mat-raised-button [disabled]=\"!isHasManyEntityValid\">\n {{metadataHasMany.tableData.createDialogData.createButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"dialogCancelCreateHasMany()\" class=\"cancel-button\">\n {{metadataHasMany.tableData.createDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n \n</ng-template>\n\n<ng-template #editHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.editData.title(hasManyEntityPriorChanges)}}</div>\n\n <div class=\"actions-container\">\n <button *ngIf=\"metadataHasMany.tableData.editData.actions.length\" type=\"button\" [matMenuTriggerFor]=\"menu\" mat-raised-button>\n {{metadataHasMany.tableData.editData.actionsLabel}}\n </button>\n <mat-menu #menu=\"matMenu\">\n <button type=\"button\" *ngFor=\"let action of metadataHasMany.tableData.editData.actions\" [disabled]=\"hasManyEditActionDisabled(action)\" (click)=\"hasManyRunEditAction(action)\" mat-menu-item>\n {{action.displayName}}\n </button>\n </mat-menu>\n \n <button type=\"button\" *ngIf=\"hasManyAllowDelete(hasManyEntity)\" mat-raised-button (click)=\"deleteHasManyEntity()\" color=\"warn\" class=\"delete-button\" tabindex=\"-1\">\n {{metadataHasMany.tableData.editData.deleteButtonLabel}}\n </button>\n </div>\n </div>\n \n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"hasManyUpdateTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of hasManyUpdateTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkHasManyEntity()\"\n [isReadOnly]=\"isPropertyReadOnly(hasManyEntity, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"hasManyUpdateTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of hasManyUpdateTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkHasManyEntity()\"\n [isReadOnly]=\"isPropertyReadOnly(hasManyEntity, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" (click)=\"dialogEditHasMany()\" mat-raised-button [disabled]=\"internalIsReadOnly || !isHasManyEntityValid || !isHasManyEntityDirty\">\n {{metadataHasMany.tableData.editData.confirmButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"dialogCancelEditHasMany()\" class=\"cancel-button\">\n {{metadataHasMany.tableData.editData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form> \n</ng-template>", styles: [".mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:1px solid rgba(0,0,0,.12)}.mat-dialog-title{padding:12px 20px;display:flex;justify-content:space-between;align-items:center}.mat-dialog-title div{font-size:var(--mdc-dialog-subhead-size, 14px);font-weight:var(--mdc-dialog-subhead-weight, 500)}::ng-deep .mdc-dialog .mdc-dialog__content{padding:6px 20px!important}mat-dialog-actions{justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}mat-spinner{margin:10px auto}::ng-deep .mat-mdc-tab-body-wrapper{margin-left:-12px;margin-right:-12px}::ng-deep mat-tab-body{padding-top:10px;padding-left:12px;padding-right:12px}::ng-deep mat-tab-body .mat-mdc-tab-body-content{overflow:initial}::ng-deep .mat-mdc-form-field.mat-form-field-disabled label{color:#0009}::ng-deep .mat-mdc-form-field.mat-form-field-disabled input,::ng-deep .mat-mdc-form-field.mat-form-field-disabled textarea,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-disabled,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#000!important}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:#707070}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:checked~.mdc-checkbox__background,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:indeterminate~.mdc-checkbox__background,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[data-indeterminate=true][disabled]~.mdc-checkbox__background{background-color:#000}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled button{opacity:.2}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__icons,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__icons{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__handle:after,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__handle:after{opacity:1;background:black}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__track,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__track{opacity:.3}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-date-range-input-inner:disabled{color:#000}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled{opacity:1}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled .mdc-slider__input{cursor:default}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mat-mdc-slider,::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mdc-slider__thumb:hover,::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mdc-slider__thumb-knob{background-color:#000;border-color:#000}::ng-deep .mat-mdc-form-field .mat-mdc-slide-toggle{opacity:1}.entityArray .elevation-container{border-radius:5px;padding:15px;margin-bottom:15px;margin-top:15px}.entityArray .array-headline{padding-bottom:10px}.entityArray .buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px}.entityArray mat-table{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:25px}.entityArray .mat-column-select{flex:0 0 75px}.entityArray .enabled:hover{cursor:pointer}.entityArray .array-error{display:flex;align-items:center;justify-content:center;margin-top:-25.8px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:25.8px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.hasMany button{width:100%;height:56px;line-height:24px;font-size:16px}.hasMany .title{text-align:center}.hasMany .elevation-container{border-radius:5px;padding:5px;margin-bottom:15px}.hasMany .mat-column-select{flex:0 0 75px}.hasMany .enabled:hover{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i5.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"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i11.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i11.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i11.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i11.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i11.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i11.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i11.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i11.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i11.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i11.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i12.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i13.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: i14.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i14.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i14.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i15.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i16.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i17.DisplayColumnValueComponent, selector: "display-column-value", inputs: ["entity", "ComponentClass"] }, { kind: "directive", type: i18.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i18.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i19.StringInputComponent, selector: "string-input" }, { kind: "component", type: i20.StringTextboxInputComponent, selector: "string-textbox-input" }, { kind: "component", type: i21.StringAutocompleteInputComponent, selector: "string-autocomplete-input" }, { kind: "component", type: i22.StringDropdownInputComponent, selector: "string-dropdown-input" }, { kind: "component", type: i23.StringPasswordInputComponent, selector: "string-password-input" }, { kind: "component", type: i24.BooleanCheckboxInputComponent, selector: "boolean-checkbox-input" }, { kind: "component", type: i25.BooleanToggleInputComponent, selector: "boolean-toggle-input" }, { kind: "component", type: i26.BooleanDropdownInputComponent, selector: "boolean-dropdown-input" }, { kind: "component", type: i27.NumberInputComponent, selector: "number-input" }, { kind: "component", type: i28.NumberDropdownInputComponent, selector: "number-dropdown-input" }, { kind: "component", type: i29.NumberSliderInputComponent, selector: "number-slider-input" }, { kind: "component", type: i30.ArrayStringChipsInputComponent, selector: "array-string-chips-input" }, { kind: "component", type: i31.ArrayStringAutocompleteChipsComponent, selector: "array-string-autocomplete-chips" }, { kind: "component", type: i32.DateInputComponent, selector: "date-input" }, { kind: "component", type: i33.DateRangeInputComponent, selector: "date-range-input" }, { kind: "component", type: i34.DateTimeInputComponent, selector: "date-time-input" }, { kind: "component", type: i35.ArrayDateInputComponent, selector: "array-date-input" }, { kind: "component", type: i36.ArrayDateTimeInputComponent, selector: "array-date-time-input" }, { kind: "component", type: i37.ArrayDateRangeInputComponent, selector: "array-date-range-input" }, { kind: "component", type: i38.FileImageInputComponent, selector: "file-image-input" }, { kind: "component", type: i39.FileDefaultInputComponent, selector: "file-default-input" }, { kind: "component", type: i40.ReferencesManyInputComponent, selector: "references-many-input" }, { kind: "component", type: i41.CustomInputComponent, selector: "custom-input" }, { kind: "component", type: NgxMatEntityInputComponent, selector: "ngx-mat-entity-input", inputs: ["entity", "propertyKey", "getValidationErrorMessage", "hideOmitForCreate", "hideOmitForEdit", "validEmpty", "isReadOnly"], outputs: ["inputChangeEvent"] }] });
|
|
862
863
|
}
|
|
863
864
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImport: i0, type: NgxMatEntityInputComponent, decorators: [{
|
|
864
865
|
type: Component,
|
|
865
|
-
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 <string-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_TEXTBOX\">\n <string-textbox-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-textbox-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_AUTOCOMPLETE\">\n <string-autocomplete-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-autocomplete-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_DROPDOWN\">\n <string-dropdown-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-dropdown-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_PASSWORD\">\n <string-password-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-password-input>\n </div>\n\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_CHECKBOX\">\n <boolean-checkbox-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </boolean-checkbox-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_TOGGLE\">\n <boolean-toggle-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </boolean-toggle-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_DROPDOWN\">\n <boolean-dropdown-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </boolean-dropdown-input>\n </div>\n\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER\">\n <number-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </number-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_DROPDOWN\">\n <number-dropdown-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </number-dropdown-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_SLIDER\">\n <number-slider-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </number-slider-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE\">\n <array-date-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-date-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE_TIME\">\n <array-date-time-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-date-time-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE_RANGE\">\n <array-date-range-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-date-range-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_CHIPS\">\n <array-string-chips-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-string-chips-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS\">\n <array-string-autocomplete-chips\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-string-autocomplete-chips>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Dates-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.DATE\">\n <date-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </date-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.DATE_RANGE\">\n <date-range-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </date-range-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.DATE_TIME\">\n <date-time-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </date-time-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Files-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.FILE_DEFAULT\">\n <file-default-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </file-default-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.FILE_IMAGE\">\n <file-image-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </file-image-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------- references many ------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.REFERENCES_MANY\">\n <references-many-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </references-many-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Custom------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.CUSTOM\">\n <custom-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </custom-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.OBJECT\">\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <mat-tab-group *ngIf=\"objectPropertyTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of objectPropertyTabs; let tI = index; trackBy: trackByFn\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows;\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let rI = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"isPropertyReadOnly(objectProperty, key)\"\n class=\"col-lg-{{EntityUtilities.getWidth(objectProperty, key, 'lg')}} col-md-{{EntityUtilities.getWidth(objectProperty, key, 'md')}} col-sm-{{EntityUtilities.getWidth(objectProperty, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <div *ngIf=\"objectPropertyTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of objectPropertyTabs[0].rows\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"isPropertyReadOnly(objectProperty, key)\"\n class=\"col-lg-{{EntityUtilities.getWidth(objectProperty, key, 'lg')}} col-md-{{EntityUtilities.getWidth(objectProperty, key, 'md')}} col-sm-{{EntityUtilities.getWidth(objectProperty, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------- references one ------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.REFERENCES_ONE\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"internalEntity[internalPropertyKey]\"\n [name]=\"internalPropertyKey.toString() + 'input' + referencesOneUUID\"\n #inputModel=\"ngModel\"\n [disabled]=\"internalIsReadOnly\"\n [required]=\"metadata.required(entity)\"\n (ngModelChange)=\"setReferencesOneObject()\"\n >\n <mat-option *ngIf=\"!metadata.required(entity)\">-</mat-option>\n <mat-option *ngFor=\"let value of referencesOneDropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{internalGetValidationErrorMessage(inputModel)}}</mat-error>\n </mat-form-field>\n <!-- iterates over the references one properties -->\n <mat-tab-group *ngIf=\"referencesOnePropertyTabs && referencesOnePropertyTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of referencesOnePropertyTabs; let tI = index; trackBy: trackByFn\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows;\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let rI = index; trackBy: trackByFn\"\n [entity]=\"referencesOneObject\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(referencesOneObject, key, 'lg')}} col-md-{{EntityUtilities.getWidth(referencesOneObject, key, 'md')}} col-sm-{{EntityUtilities.getWidth(referencesOneObject, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <div *ngIf=\"referencesOnePropertyTabs && referencesOnePropertyTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of referencesOnePropertyTabs[0].rows\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"referencesOneObject\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(referencesOneObject, key, 'lg')}} col-md-{{EntityUtilities.getWidth(referencesOneObject, key, 'md')}} col-sm-{{EntityUtilities.getWidth(referencesOneObject, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div class=\"entityArray\" *ngSwitchCase=\"DecoratorTypes.ARRAY\">\n <div class=\"mat-elevation-z8 elevation-container\">\n <div class=\"array-headline\">\n <b>{{metadataEntityArray.displayName}}</b>\n </div>\n <div *ngIf=\"metadataEntityArray.createInline && !internalIsReadOnly\">\n <mat-tab-group *ngIf=\"arrayItemInlineTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of arrayItemInlineTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <div *ngIf=\"arrayItemInlineTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of arrayItemInlineTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </div>\n\n <div class=\"buttons\" *ngIf=\"!internalIsReadOnly\">\n <button type=\"button\" mat-raised-button\n [disabled]=\"metadataEntityArray.createInline && !isArrayItemValid\"\n (click)=\"addEntity()\">\n {{metadataEntityArray.addButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button\n [disabled]=\"!entityArraySelection.selected.length\"\n (click)=\"removeFromEntityArray()\">\n {{metadataEntityArray.removeButtonLabel}}\n </button>\n </div>\n \n <mat-table [dataSource]=\"entityArrayDataSource\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\" *ngIf=\"!internalIsReadOnly\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox\n [disabled]=\"!entityArrayDataSource.data.length\" (change)=\"$event ? SelectionUtilities.masterToggle(entityArraySelection, entityArrayDataSource) : null\"\n [checked]=\"entityArraySelection.hasValue() && SelectionUtilities.isAllSelected(entityArraySelection, entityArrayDataSource)\"\n [indeterminate]=\"entityArraySelection.hasValue() && !SelectionUtilities.isAllSelected(entityArraySelection, entityArrayDataSource)\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let entity\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? entityArraySelection.toggle(entity) : null\" [checked]=\"entityArraySelection.isSelected(entity)\"></mat-checkbox>\n </mat-cell>\n </ng-container>\n \n <ng-container *ngFor=\"let dCol of metadataEntityArray.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell [class.enabled]=\"!dCol.disableClick\" (click)=\"editArrayItem(entity, dCol)\" *matCellDef=\"let entity\">\n <ng-container *ngIf=\"dCol.Component\">\n <display-column-value [entity]=\"entity\" [ComponentClass]=\"dCol.Component\"></display-column-value>\n </ng-container>\n <ng-container *ngIf=\"!dCol.Component\">\n {{getDisplayColumnValue(entity, dCol)}}\n </ng-container>\n </mat-cell>\n </ng-container>\n \n <mat-header-row *matHeaderRowDef=\"entityArrayDisplayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: entityArrayDisplayedColumns\"></mat-row>\n </mat-table>\n \n <div class=\"array-error\" *ngIf=\"metadataEntityArray.required(entity) && !entityArrayDataSource.data.length\">\n {{metadataEntityArray.missingErrorMessage}}\n </div>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!------------------ has many ---------------->\n <!-------------------------------------------->\n <div class=\"hasMany\" *ngSwitchCase=\"DecoratorTypes.HAS_MANY\">\n <h2 class=\"title\">{{metadataHasMany.tableData.baseData.title}}</h2>\n\n <div class=\"row\">\n <mat-form-field class=\"col-lg-8 col-md-6 col-sm-12\">\n <mat-label>{{metadataHasMany.tableData.baseData.searchLabel}}</mat-label>\n <input matInput (keyup)=\"applyHasManyFilter($event)\">\n </mat-form-field>\n <div\n *ngIf=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-lg-2]=\"hasManyAllowCreate\"\n [class.col-lg-4]=\"!hasManyAllowCreate\"\n [class.col-md-3]=\"hasManyAllowCreate\"\n [class.col-md-6]=\"!hasManyAllowCreate\"\n [class.col-sm-6]=\"hasManyAllowCreate\"\n [class.col-sm-12]=\"!hasManyAllowCreate\"\n >\n <button type=\"button\" class=\"actions-button\" [matMenuTriggerFor]=\"menu\" mat-raised-button>\n {{metadataHasMany.tableData.baseData.tableActionsLabel}}\n </button>\n </div>\n <mat-menu #menu=\"matMenu\">\n <button *ngIf=\"metadataHasMany.tableData.baseData.allowJsonImport\" type=\"button\" [disabled]=\"hasManyTableActionDisabled(hasManyImportAction)\" (click)=\"runHasManyTableAction(hasManyImportAction)\" mat-menu-item>\n {{hasManyImportAction.displayName}}\n </button>\n <button type=\"button\" *ngFor=\"let action of metadataHasMany.tableData.baseData.tableActions\" [disabled]=\"hasManyTableActionDisabled(action)\" (click)=\"runHasManyTableAction(action)\" mat-menu-item>\n {{action.displayName}}\n </button>\n </mat-menu>\n\n <div\n *ngIf=\"hasManyAllowCreate\"\n [class.col-lg-2]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-lg-4]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-md-3]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-md-6]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-sm-6]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-sm-12]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n >\n <button type=\"button\" class=\"create-button\" (click)=\"createHasManyEntity()\" mat-raised-button>\n {{metadataHasMany.tableData.baseData.createButtonLabel}}\n </button>\n </div>\n </div>\n\n <div class=\"mat-elevation-z8 elevation-container\">\n <mat-table [dataSource]=\"hasManyDataSource\" matSort>\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox (change)=\"$event ? SelectionUtilities.masterToggle(hasManySelection, hasManyDataSource) : null\"\n [checked]=\"hasManySelection.hasValue() && SelectionUtilities.isAllSelected(hasManySelection, hasManyDataSource)\"\n [indeterminate]=\"hasManySelection.hasValue() && !SelectionUtilities.isAllSelected(hasManySelection, hasManyDataSource)\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let entity\" class=\"enabled\">\n <mat-checkbox (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? hasManySelection.toggle(entity) : null\"\n [checked]=\"hasManySelection.isSelected(entity)\">\n </mat-checkbox>\n </mat-cell>\n </ng-container>\n\n <ng-container *ngFor=\"let dCol of metadataHasMany.tableData.baseData.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell [class.enabled]=\"!dCol.disableClick && (hasManyAllowUpdate(entity) || hasManyAllowRead(entity))\"\n (click)=\"editHasManyEntity(entity, dCol)\"\n *matCellDef=\"let entity\"\n >\n <ng-container *ngIf=\"dCol.Component\">\n <display-column-value [entity]=\"entity\" [ComponentClass]=\"dCol.Component\"></display-column-value>\n </ng-container>\n <ng-container *ngIf=\"!dCol.Component\">\n {{getDisplayColumnValue(entity, dCol)}}\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedHasManyColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedHasManyColumns\"></mat-row>\n </mat-table>\n\n <mat-spinner *ngIf=\"hasManyIsLoading && metadataHasMany.tableData.baseData.displayLoadingSpinner\">\n </mat-spinner>\n\n <mat-paginator [length]=\"hasManyDataSource.filteredData.length\" [pageIndex]=\"0\" [pageSize]=\"10\" [pageSizeOptions]=\"[5, 10, 25, 50]\"></mat-paginator>\n </div>\n </div>\n\n <div *ngSwitchDefault>ERROR: The type {{type}} is not known.</div>\n</div>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<!--------------------------------------------------------->\n<!--------------------Add Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #addArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{addArrayItemDialogData.title}}</div>\n </div>\n\n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"arrayItemDialogTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of arrayItemDialogTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"arrayItemDialogTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of arrayItemDialogTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" mat-raised-button (click)=\"addArrayItem()\" [disabled]=\"!isArrayItemValid\">\n {{addArrayItemDialogData.createButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"closeAddArrayItemDialog()\" class=\"cancel-button\">\n {{addArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Edit Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #editArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{editArrayItemDialogData.title(arrayItemPriorChanges)}}</div>\n </div>\n \n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"arrayItemDialogTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of arrayItemDialogTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkArrayItem()\"\n [isReadOnly]=\"isPropertyReadOnly(arrayItem, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"arrayItemDialogTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of arrayItemDialogTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkArrayItem()\"\n [isReadOnly]=\"isPropertyReadOnly(arrayItem, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" (click)=\"saveArrayItem()\" mat-raised-button [disabled]=\"internalIsReadOnly || !isArrayItemValid || !isArrayItemDirty\">\n {{editArrayItemDialogData.confirmButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"closeEditArrayItemDialog()\" class=\"cancel-button\">\n {{editArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Create Has Many Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #createHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.createDialogData.title}}</div>\n </div>\n \n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"hasManyCreateTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of hasManyCreateTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsHasManyEntityValid('create')\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"hasManyCreateTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of hasManyCreateTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsHasManyEntityValid('create')\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" (click)=\"dialogCreateHasMany()\" mat-raised-button [disabled]=\"!isHasManyEntityValid\">\n {{metadataHasMany.tableData.createDialogData.createButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"dialogCancelCreateHasMany()\" class=\"cancel-button\">\n {{metadataHasMany.tableData.createDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n \n</ng-template>\n\n<ng-template #editHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.editData.title(hasManyEntityPriorChanges)}}</div>\n\n <div class=\"actions-container\">\n <button *ngIf=\"metadataHasMany.tableData.editData.actions.length\" type=\"button\" [matMenuTriggerFor]=\"menu\" mat-raised-button>\n {{metadataHasMany.tableData.editData.actionsLabel}}\n </button>\n <mat-menu #menu=\"matMenu\">\n <button type=\"button\" *ngFor=\"let action of metadataHasMany.tableData.editData.actions\" [disabled]=\"hasManyEditActionDisabled(action)\" (click)=\"hasManyRunEditAction(action)\" mat-menu-item>\n {{action.displayName}}\n </button>\n </mat-menu>\n \n <button type=\"button\" *ngIf=\"hasManyAllowDelete(hasManyEntity)\" mat-raised-button (click)=\"deleteHasManyEntity()\" color=\"warn\" class=\"delete-button\" tabindex=\"-1\">\n {{metadataHasMany.tableData.editData.deleteButtonLabel}}\n </button>\n </div>\n </div>\n \n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"hasManyUpdateTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of hasManyUpdateTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkHasManyEntity()\"\n [isReadOnly]=\"isPropertyReadOnly(hasManyEntity, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"hasManyUpdateTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of hasManyUpdateTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkHasManyEntity()\"\n [isReadOnly]=\"isPropertyReadOnly(hasManyEntity, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" (click)=\"dialogEditHasMany()\" mat-raised-button [disabled]=\"internalIsReadOnly || !isHasManyEntityValid || !isHasManyEntityDirty\">\n {{metadataHasMany.tableData.editData.confirmButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"dialogCancelEditHasMany()\" class=\"cancel-button\">\n {{metadataHasMany.tableData.editData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form> \n</ng-template>", styles: [".mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:1px solid rgba(0,0,0,.12)}.mat-dialog-title{padding:12px 20px;display:flex;justify-content:space-between;align-items:center}.mat-dialog-title div{font-size:var(--mdc-dialog-subhead-size, 14px);font-weight:var(--mdc-dialog-subhead-weight, 500)}::ng-deep .mdc-dialog .mdc-dialog__content{padding:6px 20px!important}mat-dialog-actions{justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}mat-spinner{margin:10px auto}::ng-deep .mat-mdc-tab-body-wrapper{margin-left:-12px;margin-right:-12px}::ng-deep mat-tab-body{padding-top:10px;padding-left:12px;padding-right:12px}::ng-deep mat-tab-body .mat-mdc-tab-body-content{overflow:initial}::ng-deep .mat-mdc-form-field.mat-form-field-disabled label{color:#0009}::ng-deep .mat-mdc-form-field.mat-form-field-disabled input,::ng-deep .mat-mdc-form-field.mat-form-field-disabled textarea,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-disabled,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#000}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled button{opacity:.2}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-date-range-input-inner:disabled{color:#000}::ng-deep .mat-mdc-form-field .mat-mdc-slide-toggle{opacity:1}.entityArray .elevation-container{border-radius:5px;padding:15px;margin-bottom:15px;margin-top:15px}.entityArray .array-headline{padding-bottom:10px}.entityArray .buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px}.entityArray mat-table{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:25px}.entityArray .mat-column-select{flex:0 0 75px}.entityArray .enabled:hover{cursor:pointer}.entityArray .array-error{display:flex;align-items:center;justify-content:center;margin-top:-25.8px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:25.8px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.hasMany button{width:100%;height:56px;line-height:24px;font-size:16px}.hasMany .title{text-align:center}.hasMany .elevation-container{border-radius:5px;padding:5px;margin-bottom:15px}.hasMany .mat-column-select{flex:0 0 75px}.hasMany .enabled:hover{cursor:pointer}\n"] }]
|
|
866
|
+
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 <string-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_TEXTBOX\">\n <string-textbox-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-textbox-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_AUTOCOMPLETE\">\n <string-autocomplete-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-autocomplete-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_DROPDOWN\">\n <string-dropdown-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-dropdown-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.STRING_PASSWORD\">\n <string-password-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </string-password-input>\n </div>\n\n <!-------------------------------------------->\n <!-----------------Booleans------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_CHECKBOX\">\n <boolean-checkbox-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </boolean-checkbox-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_TOGGLE\">\n <boolean-toggle-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </boolean-toggle-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.BOOLEAN_DROPDOWN\">\n <boolean-dropdown-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </boolean-dropdown-input>\n </div>\n\n <!-------------------------------------------->\n <!------------------Numbers------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER\">\n <number-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </number-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_DROPDOWN\">\n <number-dropdown-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </number-dropdown-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.NUMBER_SLIDER\">\n <number-slider-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </number-slider-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE\">\n <array-date-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-date-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE_TIME\">\n <array-date-time-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-date-time-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_DATE_RANGE\">\n <array-date-range-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-date-range-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_CHIPS\">\n <array-string-chips-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-string-chips-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS\">\n <array-string-autocomplete-chips\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </array-string-autocomplete-chips>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Dates-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.DATE\">\n <date-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </date-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.DATE_RANGE\">\n <date-range-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </date-range-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.DATE_TIME\">\n <date-time-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </date-time-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Files-------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.FILE_DEFAULT\">\n <file-default-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </file-default-input>\n </div>\n <div *ngSwitchCase=\"DecoratorTypes.FILE_IMAGE\">\n <file-image-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </file-image-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------- references many ------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.REFERENCES_MANY\">\n <references-many-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </references-many-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Custom------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.CUSTOM\">\n <custom-input\n (inputChangeEvent)=\"emitChange()\"\n [entity]=\"internalEntity\"\n [key]=\"internalPropertyKey\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [isReadOnly]=\"internalIsReadOnly\"\n >\n </custom-input>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Object------------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.OBJECT\">\n <b>{{metadataDefaultObject.displayName}}</b>\n <!-- iterates over the object properties -->\n <mat-tab-group *ngIf=\"objectPropertyTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of objectPropertyTabs; let tI = index; trackBy: trackByFn\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows;\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let rI = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"isPropertyReadOnly(objectProperty, key)\"\n class=\"col-lg-{{EntityUtilities.getWidth(objectProperty, key, 'lg')}} col-md-{{EntityUtilities.getWidth(objectProperty, key, 'md')}} col-sm-{{EntityUtilities.getWidth(objectProperty, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <div *ngIf=\"objectPropertyTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of objectPropertyTabs[0].rows\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"objectProperty\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"isPropertyReadOnly(objectProperty, key)\"\n class=\"col-lg-{{EntityUtilities.getWidth(objectProperty, key, 'lg')}} col-md-{{EntityUtilities.getWidth(objectProperty, key, 'md')}} col-sm-{{EntityUtilities.getWidth(objectProperty, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------- references one ------------->\n <!-------------------------------------------->\n <div *ngSwitchCase=\"DecoratorTypes.REFERENCES_ONE\">\n <mat-form-field>\n <mat-label>{{metadata.displayName}}</mat-label>\n <mat-select [(ngModel)]=\"internalEntity[internalPropertyKey]\"\n [name]=\"internalPropertyKey.toString() + 'input' + referencesOneUUID\"\n #inputModel=\"ngModel\"\n [disabled]=\"internalIsReadOnly\"\n [required]=\"metadata.required(entity)\"\n (ngModelChange)=\"setReferencesOneObject()\"\n >\n <mat-option *ngIf=\"!metadata.required(entity)\">-</mat-option>\n <mat-option *ngFor=\"let value of referencesOneDropdownValues\" [value]=\"value.value\">{{value.displayName}}</mat-option>\n </mat-select>\n <mat-error>{{internalGetValidationErrorMessage(inputModel)}}</mat-error>\n </mat-form-field>\n <!-- iterates over the references one properties -->\n <mat-tab-group *ngIf=\"referencesOnePropertyTabs && referencesOnePropertyTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of referencesOnePropertyTabs; let tI = index; trackBy: trackByFn\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows;\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let rI = index; trackBy: trackByFn\"\n [entity]=\"referencesOneObject\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(referencesOneObject, key, 'lg')}} col-md-{{EntityUtilities.getWidth(referencesOneObject, key, 'md')}} col-sm-{{EntityUtilities.getWidth(referencesOneObject, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <div *ngIf=\"referencesOnePropertyTabs && referencesOnePropertyTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of referencesOnePropertyTabs[0].rows\">\n <ngx-mat-entity-input *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"referencesOneObject\"\n [propertyKey]=\"key\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n [hideOmitForCreate]=\"hideOmitForCreate\"\n [hideOmitForEdit]=\"hideOmitForEdit\"\n [validEmpty]=\"!metadata.required(entity)\"\n [isReadOnly]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(referencesOneObject, key, 'lg')}} col-md-{{EntityUtilities.getWidth(referencesOneObject, key, 'md')}} col-sm-{{EntityUtilities.getWidth(referencesOneObject, key, 'sm')}}\"\n (inputChangeEvent)=\"emitChange()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!-------------------Array-------------------->\n <!-------------------------------------------->\n <div class=\"entityArray\" *ngSwitchCase=\"DecoratorTypes.ARRAY\">\n <div class=\"mat-elevation-z8 elevation-container\">\n <div class=\"array-headline\">\n <b>{{metadataEntityArray.displayName}}</b>\n </div>\n <div *ngIf=\"metadataEntityArray.createInline && !internalIsReadOnly\">\n <mat-tab-group *ngIf=\"arrayItemInlineTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of arrayItemInlineTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n\n <div *ngIf=\"arrayItemInlineTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of arrayItemInlineTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys; let i = index; trackBy: trackByFn\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </div>\n\n <div class=\"buttons\" *ngIf=\"!internalIsReadOnly\">\n <button type=\"button\" mat-raised-button\n [disabled]=\"metadataEntityArray.createInline && !isArrayItemValid\"\n (click)=\"addEntity()\">\n {{metadataEntityArray.addButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button\n [disabled]=\"!entityArraySelection.selected.length\"\n (click)=\"removeFromEntityArray()\">\n {{metadataEntityArray.removeButtonLabel}}\n </button>\n </div>\n \n <mat-table [dataSource]=\"entityArrayDataSource\">\n <!-- select Column -->\n <ng-container matColumnDef=\"select\" *ngIf=\"!internalIsReadOnly\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox\n [disabled]=\"!entityArrayDataSource.data.length\" (change)=\"$event ? SelectionUtilities.masterToggle(entityArraySelection, entityArrayDataSource) : null\"\n [checked]=\"entityArraySelection.hasValue() && SelectionUtilities.isAllSelected(entityArraySelection, entityArrayDataSource)\"\n [indeterminate]=\"entityArraySelection.hasValue() && !SelectionUtilities.isAllSelected(entityArraySelection, entityArrayDataSource)\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let entity\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? entityArraySelection.toggle(entity) : null\" [checked]=\"entityArraySelection.isSelected(entity)\"></mat-checkbox>\n </mat-cell>\n </ng-container>\n \n <ng-container *ngFor=\"let dCol of metadataEntityArray.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell [class.enabled]=\"!dCol.disableClick\" (click)=\"editArrayItem(entity, dCol)\" *matCellDef=\"let entity\">\n <ng-container *ngIf=\"dCol.Component\">\n <display-column-value [entity]=\"entity\" [ComponentClass]=\"dCol.Component\"></display-column-value>\n </ng-container>\n <ng-container *ngIf=\"!dCol.Component\">\n {{getDisplayColumnValue(entity, dCol)}}\n </ng-container>\n </mat-cell>\n </ng-container>\n \n <mat-header-row *matHeaderRowDef=\"entityArrayDisplayedColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: entityArrayDisplayedColumns\"></mat-row>\n </mat-table>\n \n <div class=\"array-error\" *ngIf=\"metadataEntityArray.required(entity) && !entityArrayDataSource.data.length\">\n {{metadataEntityArray.missingErrorMessage}}\n </div>\n </div>\n </div>\n\n <!-------------------------------------------->\n <!------------------ has many ---------------->\n <!-------------------------------------------->\n <div class=\"hasMany\" *ngSwitchCase=\"DecoratorTypes.HAS_MANY\">\n <h2 class=\"title\">{{metadataHasMany.tableData.baseData.title}}</h2>\n\n <div class=\"row\">\n <mat-form-field class=\"col-lg-8 col-md-6 col-sm-12\">\n <mat-label>{{metadataHasMany.tableData.baseData.searchLabel}}</mat-label>\n <input matInput (keyup)=\"applyHasManyFilter($event)\">\n </mat-form-field>\n <div\n *ngIf=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-lg-2]=\"hasManyAllowCreate\"\n [class.col-lg-4]=\"!hasManyAllowCreate\"\n [class.col-md-3]=\"hasManyAllowCreate\"\n [class.col-md-6]=\"!hasManyAllowCreate\"\n [class.col-sm-6]=\"hasManyAllowCreate\"\n [class.col-sm-12]=\"!hasManyAllowCreate\"\n >\n <button type=\"button\" class=\"actions-button\" [matMenuTriggerFor]=\"menu\" mat-raised-button>\n {{metadataHasMany.tableData.baseData.tableActionsLabel}}\n </button>\n </div>\n <mat-menu #menu=\"matMenu\">\n <button *ngIf=\"metadataHasMany.tableData.baseData.allowJsonImport\" type=\"button\" [disabled]=\"hasManyTableActionDisabled(hasManyImportAction)\" (click)=\"runHasManyTableAction(hasManyImportAction)\" mat-menu-item>\n {{hasManyImportAction.displayName}}\n </button>\n <button type=\"button\" *ngFor=\"let action of metadataHasMany.tableData.baseData.tableActions\" [disabled]=\"hasManyTableActionDisabled(action)\" (click)=\"runHasManyTableAction(action)\" mat-menu-item>\n {{action.displayName}}\n </button>\n </mat-menu>\n\n <div\n *ngIf=\"hasManyAllowCreate\"\n [class.col-lg-2]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-lg-4]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-md-3]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-md-6]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-sm-6]=\"metadataHasMany.tableData.baseData.tableActions.length\"\n [class.col-sm-12]=\"!metadataHasMany.tableData.baseData.tableActions.length\"\n >\n <button type=\"button\" class=\"create-button\" (click)=\"createHasManyEntity()\" mat-raised-button>\n {{metadataHasMany.tableData.baseData.createButtonLabel}}\n </button>\n </div>\n </div>\n\n <div class=\"mat-elevation-z8 elevation-container\">\n <mat-table [dataSource]=\"hasManyDataSource\" matSort>\n <!-- select Column -->\n <ng-container matColumnDef=\"select\">\n <mat-header-cell *matHeaderCellDef>\n <mat-checkbox (change)=\"$event ? SelectionUtilities.masterToggle(hasManySelection, hasManyDataSource) : null\"\n [checked]=\"hasManySelection.hasValue() && SelectionUtilities.isAllSelected(hasManySelection, hasManyDataSource)\"\n [indeterminate]=\"hasManySelection.hasValue() && !SelectionUtilities.isAllSelected(hasManySelection, hasManyDataSource)\">\n </mat-checkbox>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let entity\" class=\"enabled\">\n <mat-checkbox (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? hasManySelection.toggle(entity) : null\"\n [checked]=\"hasManySelection.isSelected(entity)\">\n </mat-checkbox>\n </mat-cell>\n </ng-container>\n\n <ng-container *ngFor=\"let dCol of metadataHasMany.tableData.baseData.displayColumns\" [matColumnDef]=\"dCol.displayName\">\n <mat-header-cell *matHeaderCellDef mat-sort-header>\n {{dCol.displayName}}\n </mat-header-cell>\n <mat-cell [class.enabled]=\"!dCol.disableClick && (hasManyAllowUpdate(entity) || hasManyAllowRead(entity))\"\n (click)=\"editHasManyEntity(entity, dCol)\"\n *matCellDef=\"let entity\"\n >\n <ng-container *ngIf=\"dCol.Component\">\n <display-column-value [entity]=\"entity\" [ComponentClass]=\"dCol.Component\"></display-column-value>\n </ng-container>\n <ng-container *ngIf=\"!dCol.Component\">\n {{getDisplayColumnValue(entity, dCol)}}\n </ng-container>\n </mat-cell>\n </ng-container>\n\n <mat-header-row *matHeaderRowDef=\"displayedHasManyColumns\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: displayedHasManyColumns\"></mat-row>\n </mat-table>\n\n <mat-spinner *ngIf=\"hasManyIsLoading && metadataHasMany.tableData.baseData.displayLoadingSpinner\">\n </mat-spinner>\n\n <mat-paginator [length]=\"hasManyDataSource.filteredData.length\" [pageIndex]=\"0\" [pageSize]=\"10\" [pageSizeOptions]=\"[5, 10, 25, 50]\"></mat-paginator>\n </div>\n </div>\n\n <div *ngSwitchDefault>ERROR: The type {{type}} is not known.</div>\n</div>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<!--------------------------------------------------------->\n<!--------------------Add Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #addArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{addArrayItemDialogData.title}}</div>\n </div>\n\n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"arrayItemDialogTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of arrayItemDialogTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"arrayItemDialogTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of arrayItemDialogTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n [getValidationErrorMessage]=\"internalGetValidationErrorMessage\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsArrayItemValid()\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" mat-raised-button (click)=\"addArrayItem()\" [disabled]=\"!isArrayItemValid\">\n {{addArrayItemDialogData.createButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"closeAddArrayItemDialog()\" class=\"cancel-button\">\n {{addArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Edit Array Item Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #editArrayItemDialog>\n <div class=\"mat-dialog-title\">\n <div>{{editArrayItemDialogData.title(arrayItemPriorChanges)}}</div>\n </div>\n \n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"arrayItemDialogTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of arrayItemDialogTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkArrayItem()\"\n [isReadOnly]=\"isPropertyReadOnly(arrayItem, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"arrayItemDialogTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of arrayItemDialogTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"arrayItem\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(arrayItem, key, 'lg')}} col-md-{{EntityUtilities.getWidth(arrayItem, key, 'md')}} col-sm-{{EntityUtilities.getWidth(arrayItem, key, 'sm')}}\"\n (inputChangeEvent)=\"checkArrayItem()\"\n [isReadOnly]=\"isPropertyReadOnly(arrayItem, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" (click)=\"saveArrayItem()\" mat-raised-button [disabled]=\"internalIsReadOnly || !isArrayItemValid || !isArrayItemDirty\">\n {{editArrayItemDialogData.confirmButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"closeEditArrayItemDialog()\" class=\"cancel-button\">\n {{editArrayItemDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n</ng-template>\n\n<!--------------------------------------------------------->\n<!--------------------Create Has Many Dialog---------------->\n<!--------------------------------------------------------->\n<ng-template #createHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.createDialogData.title}}</div>\n </div>\n \n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"hasManyCreateTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of hasManyCreateTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsHasManyEntityValid('create')\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"hasManyCreateTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of hasManyCreateTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForCreate]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkIsHasManyEntityValid('create')\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" (click)=\"dialogCreateHasMany()\" mat-raised-button [disabled]=\"!isHasManyEntityValid\">\n {{metadataHasMany.tableData.createDialogData.createButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"dialogCancelCreateHasMany()\" class=\"cancel-button\">\n {{metadataHasMany.tableData.createDialogData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form>\n \n</ng-template>\n\n<ng-template #editHasManyDialog>\n <div class=\"mat-dialog-title\">\n <div>{{metadataHasMany.tableData.editData.title(hasManyEntityPriorChanges)}}</div>\n\n <div class=\"actions-container\">\n <button *ngIf=\"metadataHasMany.tableData.editData.actions.length\" type=\"button\" [matMenuTriggerFor]=\"menu\" mat-raised-button>\n {{metadataHasMany.tableData.editData.actionsLabel}}\n </button>\n <mat-menu #menu=\"matMenu\">\n <button type=\"button\" *ngFor=\"let action of metadataHasMany.tableData.editData.actions\" [disabled]=\"hasManyEditActionDisabled(action)\" (click)=\"hasManyRunEditAction(action)\" mat-menu-item>\n {{action.displayName}}\n </button>\n </mat-menu>\n \n <button type=\"button\" *ngIf=\"hasManyAllowDelete(hasManyEntity)\" mat-raised-button (click)=\"deleteHasManyEntity()\" color=\"warn\" class=\"delete-button\" tabindex=\"-1\">\n {{metadataHasMany.tableData.editData.deleteButtonLabel}}\n </button>\n </div>\n </div>\n \n <form>\n <mat-dialog-content>\n <mat-tab-group *ngIf=\"hasManyUpdateTabs.length > 1\" preserveContent>\n <mat-tab *ngFor=\"let tab of hasManyUpdateTabs\" [label]=\"tab.tabName\">\n <div class=\"row\" *ngFor=\"let row of tab.rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkHasManyEntity()\"\n [isReadOnly]=\"isPropertyReadOnly(hasManyEntity, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </mat-tab>\n </mat-tab-group>\n \n <div *ngIf=\"hasManyUpdateTabs.length <= 1\">\n <div class=\"row\" *ngFor=\"let row of hasManyUpdateTabs[0].rows\">\n <ngx-mat-entity-input\n *ngFor=\"let key of row.keys\"\n [entity]=\"hasManyEntity\"\n [propertyKey]=\"key\"\n [hideOmitForEdit]=\"true\"\n class=\"col-lg-{{EntityUtilities.getWidth(hasManyEntity, key, 'lg')}} col-md-{{EntityUtilities.getWidth(hasManyEntity, key, 'md')}} col-sm-{{EntityUtilities.getWidth(hasManyEntity, key, 'sm')}}\"\n (inputChangeEvent)=\"checkHasManyEntity()\"\n [isReadOnly]=\"isPropertyReadOnly(hasManyEntity, key)\"\n >\n </ngx-mat-entity-input>\n </div>\n </div>\n </mat-dialog-content>\n \n <mat-dialog-actions>\n <button type=\"submit\" (click)=\"dialogEditHasMany()\" mat-raised-button [disabled]=\"internalIsReadOnly || !isHasManyEntityValid || !isHasManyEntityDirty\">\n {{metadataHasMany.tableData.editData.confirmButtonLabel}}\n </button>\n <button type=\"button\" mat-raised-button (click)=\"dialogCancelEditHasMany()\" class=\"cancel-button\">\n {{metadataHasMany.tableData.editData.cancelButtonLabel}}\n </button>\n </mat-dialog-actions>\n </form> \n</ng-template>", styles: [".mdc-data-table__row:last-child .mdc-data-table__cell{border-bottom:1px solid rgba(0,0,0,.12)}.mat-dialog-title{padding:12px 20px;display:flex;justify-content:space-between;align-items:center}.mat-dialog-title div{font-size:var(--mdc-dialog-subhead-size, 14px);font-weight:var(--mdc-dialog-subhead-weight, 500)}::ng-deep .mdc-dialog .mdc-dialog__content{padding:6px 20px!important}mat-dialog-actions{justify-content:space-between;align-items:center;padding-left:20px;padding-right:20px}mat-spinner{margin:10px auto}::ng-deep .mat-mdc-tab-body-wrapper{margin-left:-12px;margin-right:-12px}::ng-deep mat-tab-body{padding-top:10px;padding-left:12px;padding-right:12px}::ng-deep mat-tab-body .mat-mdc-tab-body-content{overflow:initial}::ng-deep .mat-mdc-form-field.mat-form-field-disabled label{color:#0009}::ng-deep .mat-mdc-form-field.mat-form-field-disabled input,::ng-deep .mat-mdc-form-field.mat-form-field-disabled textarea,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-disabled,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-select-value{color:#000!important}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:not(:checked):not(:indeterminate):not([data-indeterminate=true])~.mdc-checkbox__background{border-color:#707070}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:checked~.mdc-checkbox__background,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[disabled]:indeterminate~.mdc-checkbox__background,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-checkbox .mdc-checkbox__native-control[data-indeterminate=true][disabled]~.mdc-checkbox__background{background-color:#000}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-mdc-chip.mat-mdc-standard-chip.mat-mdc-chip-disabled button{opacity:.2}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__icons,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__icons{opacity:1}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__handle:after,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__handle:after{opacity:1;background:black}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--selected:disabled .mdc-switch__track,::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mdc-switch.mdc-switch--unselected:disabled .mdc-switch__track{opacity:.3}::ng-deep .mat-mdc-form-field.mat-form-field-disabled .mat-date-range-input-inner:disabled{color:#000}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled{opacity:1}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled .mdc-slider__input{cursor:default}::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mat-mdc-slider,::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mdc-slider__thumb:hover,::ng-deep #slider.mat-mdc-slider.mdc-slider--disabled mat-slider-visual-thumb .mdc-slider__thumb-knob{background-color:#000;border-color:#000}::ng-deep .mat-mdc-form-field .mat-mdc-slide-toggle{opacity:1}.entityArray .elevation-container{border-radius:5px;padding:15px;margin-bottom:15px;margin-top:15px}.entityArray .array-headline{padding-bottom:10px}.entityArray .buttons{display:flex;justify-content:space-between;margin-bottom:10px;margin-top:5px}.entityArray mat-table{border:1px solid #E0E0E0;border-radius:5px;padding-top:5px;padding-bottom:25px}.entityArray .mat-column-select{flex:0 0 75px}.entityArray .enabled:hover{cursor:pointer}.entityArray .array-error{display:flex;align-items:center;justify-content:center;margin-top:-25.8px;border:1px solid #E0E0E0;background-color:#f8d3d7;color:#721c24;height:25.8px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.hasMany button{width:100%;height:56px;line-height:24px;font-size:16px}.hasMany .title{text-align:center}.hasMany .elevation-container{border-radius:5px;padding:5px;margin-bottom:15px}.hasMany .mat-column-select{flex:0 0 75px}.hasMany .enabled:hover{cursor:pointer}\n"] }]
|
|
866
867
|
}], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i0.EnvironmentInjector }, { type: i2.Router }, { type: undefined, decorators: [{
|
|
867
868
|
type: Inject,
|
|
868
869
|
args: [NGX_GET_VALIDATION_ERROR_MESSAGE]
|
|
@@ -904,4 +905,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.0", ngImpor
|
|
|
904
905
|
type: ViewChild,
|
|
905
906
|
args: ['editHasManyDialog']
|
|
906
907
|
}] } });
|
|
907
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9pbnB1dC9pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2lucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUksT0FBTyxFQUFFLFNBQVMsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQU01RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFv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Z0M7MkZBMUpuQywwQkFBMEIsMm1CQW9HeEIsWUFBWSw4RUFVWixPQUFPLDhXQzdKdEIseWt3Q0FxekJjLHNtVUR0d0JELDBCQUEwQjs7MkZBQTFCLDBCQUEwQjtrQkFMdEMsU0FBUzsrQkFDSSxzQkFBc0I7OzBCQThKM0IsTUFBTTsyQkFBQyxnQ0FBZ0M7cUVBcEo1QyxNQUFNO3NCQURMLEtBQUs7Z0JBUU4sV0FBVztzQkFEVixLQUFLO2dCQVFOLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFXTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBVU4sZUFBZTtzQkFEZCxLQUFLO2dCQVVOLFVBQVU7c0JBRFQsS0FBSztnQkFVTixVQUFVO3NCQURULEtBQUs7Z0JBS04sZ0JBQWdCO3NCQURmLE1BQU07Z0JBSVAsa0JBQWtCO3NCQURqQixTQUFTO3VCQUFDLG9CQUFvQjtnQkFLL0IsbUJBQW1CO3NCQURsQixTQUFTO3VCQUFDLHFCQUFxQjtnQkFpQ0gsZ0JBQWdCO3NCQUE1QyxTQUFTO3VCQUFDLFlBQVk7Z0JBVUMsV0FBVztzQkFBbEMsU0FBUzt1QkFBQyxPQUFPO2dCQU1sQixhQUFhO3NCQURaLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFRckMsbUJBQW1CO3NCQURsQixTQUFTO3VCQUFDLHFCQUFxQjtnQkFJaEMsaUJBQWlCO3NCQURoQixTQUFTO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVudmlyb25tZW50SW5qZWN0b3IsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XG5pbXBvcnQgeyBNYXRTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQgeyBNYXRUYWJsZURhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJhc2VFbnRpdHlUeXBlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgRWRpdEFycmF5SXRlbURpYWxvZ0RhdGFJbnRlcm5hbCwgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvYXJyYXkvYXJyYXktZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRGVjb3JhdG9yVHlwZXMgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2Jhc2UvZGVjb3JhdG9yLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgRHJvcGRvd25WYWx1ZSB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvYmFzZS9kcm9wZG93bi12YWx1ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvYmFzZS9wcm9wZXJ0eS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBIYXNNYW55RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2hhcy1tYW55L2hhcy1tYW55LWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvb2JqZWN0L29iamVjdC1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBSZWZlcmVuY2VzT25lRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3JlZmVyZW5jZXMtb25lL3JlZmVyZW5jZXMtb25lLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IExvZGFzaFV0aWxpdGllcyB9IGZyb20gJy4uLy4uL2VuY2Fwc3VsYXRpb24vbG9kYXNoLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBSZWZsZWN0VXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vZW5jYXBzdWxhdGlvbi9yZWZsZWN0LnV0aWxpdGllcyc7XG5pbXBvcnQgeyBVVUlEVXRpbGl0aWVzIH0gZnJvbSAnLi4vLi4vZW5jYXBzdWxhdGlvbi91dWlkLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBkZWZhdWx0RmFsc2UgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZGVmYXVsdC1mYWxzZS5mdW5jdGlvbic7XG5pbXBvcnQgeyBFbnRpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZW50aXR5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZVV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9kYXRlLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBFbnRpdHlUYWIsIEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzJztcbmltcG9ydCB7IFNlbGVjdGlvblV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zZWxlY3Rpb24udXRpbGl0aWVzJztcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlciwgQ29uZmlybURpYWxvZ0RhdGFJbnRlcm5hbCB9IGZyb20gJy4uL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLWRhdGEuYnVpbGRlcic7XG5pbXBvcnQgeyBOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vY29uZmlybS1kaWFsb2cvY29uZmlybS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IE5HWF9HRVRfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFIH0gZnJvbSAnLi4vZ2V0LXZhbGlkYXRpb24tZXJyb3ItbWVzc2FnZS5mdW5jdGlvbic7XG5pbXBvcnQgeyBDcmVhdGVEaWFsb2dEYXRhQnVpbGRlciwgQ3JlYXRlRGlhbG9nRGF0YUludGVybmFsIH0gZnJvbSAnLi4vdGFibGUvY3JlYXRlLWRpYWxvZy9jcmVhdGUtZGlhbG9nLWRhdGEuYnVpbGRlcic7XG5pbXBvcnQgeyBFZGl0QWN0aW9uSW50ZXJuYWwgfSBmcm9tICcuLi90YWJsZS9lZGl0LWRpYWxvZy9lZGl0LWRhdGEuYnVpbGRlcic7XG5pbXBvcnQgeyBEaXNwbGF5Q29sdW1uIH0gZnJvbSAnLi4vdGFibGUvdGFibGUtZGF0YSc7XG5pbXBvcnQgeyBCYXNlVGFibGVBY3Rpb25JbnRlcm5hbCwgVGFibGVBY3Rpb25JbnRlcm5hbCB9IGZyb20gJy4uL3RhYmxlL3RhYmxlLWRhdGEuYnVpbGRlcic7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgaW5wdXQgY29tcG9uZW50LiBJdCBnZXRzIHRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvcGVydHkgZnJvbSB0aGUgZ2l2ZW4gQElucHV0IFwiZW50aXR5XCIgYW5kIEBJbnB1dCBcInByb3BlcnR5S2V5XCJcbiAqIGFuZCBkaXNwbGF5cyB0aGUgaW5wdXQgZmllbGQgYWNjb3JkaW5nbHkuXG4gKlxuICogWW91IGNhbiBhbHNvIGRlZmluZSBhIG1ldGhvZCB0aGF0IGdlbmVyYXRlcyBlcnJvci1tZXNzYWdlcyBhbmQgaWYgdGhlIGlucHV0IHNob3VsZCBiZSBoaWRkZW4gd2hlbiBpdHMgbWV0YWRhdGEgc2F5c1xuICogdGhhdCBpdCBzaG91bGQgYmUgb21pdHRlZCBmb3IgY3JlYXRpbmcgb3IgdXBkYXRpbmcuXG4gKiBUaGUgbGFzdCBwYXJ0IGJlaW5nIG1vc3RseSByZWxldmFudCBpZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBjb21wb25lbnQgaW5zaWRlIGFuIG5nRm9yLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25neC1tYXQtZW50aXR5LWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2lucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmd4TWF0RW50aXR5SW5wdXRDb21wb25lbnQ8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGVudGl0eSBvbiB3aGljaCB0aGUgcHJvcGVydHkgZXhpc3RzLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFwicHJvcGVydHlLZXlcIlxuICAgICAqIHRvIGRldGVybWluZSB0aGUgcHJvcGVydHkgZm9yIHdoaWNoIHRoZSBpbnB1dCBzaG91bGQgYmUgZ2VuZXJhdGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZW50aXR5PzogRW50aXR5VHlwZTtcbiAgICBpbnRlcm5hbEVudGl0eSE6IEVudGl0eVR5cGU7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2VuZXJhdGUgdGhlIGlucHV0IGZvci4gVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBcImVudGl0eVwiLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHJvcGVydHlLZXk/OiBrZXlvZiBFbnRpdHlUeXBlO1xuICAgIGludGVybmFsUHJvcGVydHlLZXkhOiBrZXlvZiBFbnRpdHlUeXBlO1xuXG4gICAgLyoqXG4gICAgICogKG9wdGlvbmFsKSBBIGN1c3RvbSBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGUgZXJyb3ItbWVzc2FnZSBmb3IgaW52YWxpZCBpbnB1dHMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlPzogKG1vZGVsOiBOZ01vZGVsKSA9PiBzdHJpbmc7XG4gICAgaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlITogKG1vZGVsOiBOZ01vZGVsKSA9PiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGhpZGUgYSB2YWx1ZSBpZiBpdCBpcyBvbWl0dGVkIGZvciBjcmVhdGlvbi5cbiAgICAgKiBJcyB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGlkZU9taXRGb3JDcmVhdGU/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBoaWRlIGEgdmFsdWUgaWYgaXQgaXMgb21pdHRlZCBmb3IgZWRpdGluZy5cbiAgICAgKiBJcyB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaGlkZU9taXRGb3JFZGl0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgb3Igbm90IGFuIGVtcHR5IHZhbHVlIHNob3VsZCBiZSB2YWxpZC5cbiAgICAgKiBJcyB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBvYmplY3QgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHZhbGlkRW1wdHk/OiBib29sZWFuOyAvLyBUT0RPXG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgaW5wdXQgc2hvdWxkIGJlIHJlYWRvbmx5LlxuICAgICAqIEluIHRoYXQgY2FzZSBpdCBpcyBkaXNhYmxlZCwgYnV0IG1vc3Qgb2YgdGhlIGRlZmF1bHQgc3R5bGluZyBpcyBvdmVyd3JpdHRlbi5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBpc1JlYWRPbmx5PzogYm9vbGVhbjtcbiAgICBpbnRlcm5hbElzUmVhZE9ubHkhOiBib29sZWFuO1xuXG4gICAgQE91dHB1dCgpXG4gICAgaW5wdXRDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgQFZpZXdDaGlsZCgnYWRkQXJyYXlJdGVtRGlhbG9nJylcbiAgICBhZGRBcnJheUl0ZW1EaWFsb2chOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgICBhZGRBcnJheUl0ZW1EaWFsb2dSZWYhOiBNYXREaWFsb2dSZWY8dW5rbm93bj47XG5cbiAgICBAVmlld0NoaWxkKCdlZGl0QXJyYXlJdGVtRGlhbG9nJylcbiAgICBlZGl0QXJyYXlJdGVtRGlhbG9nITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gICAgZWRpdEFycmF5SXRlbURpYWxvZ1JlZiE6IE1hdERpYWxvZ1JlZjx1bmtub3duPjtcblxuICAgIHR5cGUhOiBEZWNvcmF0b3JUeXBlcztcbiAgICBtZXRhZGF0YSE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG5cbiAgICBtZXRhZGF0YURlZmF1bHRPYmplY3QhOiBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZT47XG4gICAgb2JqZWN0UHJvcGVydHkhOiBFbnRpdHlUeXBlO1xuICAgIG9iamVjdFByb3BlcnR5VGFicyE6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdO1xuXG4gICAgbWV0YWRhdGFFbnRpdHlBcnJheSE6IEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZT47XG4gICAgZW50aXR5QXJyYXlWYWx1ZXMhOiBFbnRpdHlUeXBlW107XG4gICAgYXJyYXlJdGVtITogRW50aXR5VHlwZTtcbiAgICBhcnJheUl0ZW1QcmlvckNoYW5nZXMhOiBFbnRpdHlUeXBlO1xuICAgIGFycmF5SXRlbUlubGluZVRhYnMhOiBFbnRpdHlUYWI8RW50aXR5VHlwZT5bXTtcbiAgICBlbnRpdHlBcnJheURhdGFTb3VyY2UhOiBNYXRUYWJsZURhdGFTb3VyY2U8RW50aXR5VHlwZT47XG4gICAgZW50aXR5QXJyYXlTZWxlY3Rpb246IFNlbGVjdGlvbk1vZGVsPEVudGl0eVR5cGU+ID0gbmV3IFNlbGVjdGlvbk1vZGVsPEVudGl0eVR5cGU+KHRydWUsIFtdKTtcbiAgICBlbnRpdHlBcnJheURpc3BsYXllZENvbHVtbnMhOiBzdHJpbmdbXTtcbiAgICBpc0FycmF5SXRlbVZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgaXNBcnJheUl0ZW1EaXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGluZGV4T2ZFZGl0ZWRBcnJheUl0ZW0hOiBudW1iZXI7XG4gICAgYWRkQXJyYXlJdGVtRGlhbG9nRGF0YSE6IENyZWF0ZURpYWxvZ0RhdGFJbnRlcm5hbDtcbiAgICBhcnJheUl0ZW1EaWFsb2dUYWJzITogRW50aXR5VGFiPEVudGl0eVR5cGU+W107XG4gICAgZWRpdEFycmF5SXRlbURpYWxvZ0RhdGEhOiBFZGl0QXJyYXlJdGVtRGlhbG9nRGF0YUludGVybmFsPEVudGl0eVR5cGU+O1xuXG4gICAgbWV0YWRhdGFIYXNNYW55ITogSGFzTWFueURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGUsIEVudGl0eVR5cGU+O1xuICAgIGhhc01hbnlJc0xvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgaGFzIG1hbnkgcGFnaW5hdG9yLlxuICAgICAqIElzIG5lZWRlZCBiZWNhdXNlIHRoZSBwYWdpbmF0b3IgaXMgaW5zaWRlIGEgc3dpdGNoIGNhc2UsXG4gICAgICogd2hpY2ggbWVhbnMgdGhhdCBhdCBuZ09uSW5pdCBpdCBjYW4ndCBiZSBpbml0aWFsaXplZC5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKE1hdFBhZ2luYXRvcikgc2V0IGhhc01hbnlQYWdpbmF0b3IocGFnaW5hdG9yOiBNYXRQYWdpbmF0b3IpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc01hbnlEYXRhU291cmNlLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55RGF0YVNvdXJjZS5wYWdpbmF0b3IgPSBwYWdpbmF0b3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBzZXR0ZXIgZm9yIHRoZSBoYXMgbWFueSBzb3J0LlxuICAgICAqIElzIG5lZWRlZCBiZWNhdXNlIHRoZSBzb3J0IGlzIGluc2lkZSBhIHN3aXRjaCBjYXNlLFxuICAgICAqIHdoaWNoIG1lYW5zIHRoYXQgYXQgbmdPbkluaXQgaXQgY2FuJ3QgYmUgaW5pdGlhbGl6ZWQuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChNYXRTb3J0KSBzZXQgaGFzTWFueVNvcnQoc29ydDogTWF0U29ydCkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzTWFueURhdGFTb3VyY2Uuc29ydCkge1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55RGF0YVNvdXJjZS5zb3J0ID0gc29ydDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBAVmlld0NoaWxkKCdmaWx0ZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIGhhc01hbnlGaWx0ZXIhOiBzdHJpbmc7XG4gICAgZGlzcGxheWVkSGFzTWFueUNvbHVtbnMhOiBzdHJpbmdbXTtcbiAgICBoYXNNYW55RGF0YVNvdXJjZTogTWF0VGFibGVEYXRhU291cmNlPEVudGl0eVR5cGU+ID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSgpO1xuICAgIGhhc01hbnlTZWxlY3Rpb246IFNlbGVjdGlvbk1vZGVsPEVudGl0eVR5cGU+ID0gbmV3IFNlbGVjdGlvbk1vZGVsPEVudGl0eVR5cGU+KHRydWUsIFtdKTtcbiAgICBoYXNNYW55SW1wb3J0QWN0aW9uITogQmFzZVRhYmxlQWN0aW9uSW50ZXJuYWw7XG4gICAgcHJpdmF0ZSBoYXNNYW55RW50aXR5U2VydmljZSE6IEVudGl0eVNlcnZpY2U8RW50aXR5VHlwZT47XG4gICAgQFZpZXdDaGlsZCgnY3JlYXRlSGFzTWFueURpYWxvZycpXG4gICAgY3JlYXRlSGFzTWFueURpYWxvZyE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIGNyZWF0ZUhhc01hbnlEaWFsb2dSZWYhOiBNYXREaWFsb2dSZWY8dW5rbm93bj47XG4gICAgQFZpZXdDaGlsZCgnZWRpdEhhc01hbnlEaWFsb2cnKVxuICAgIGVkaXRIYXNNYW55RGlhbG9nITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gICAgZWRpdEhhc01hbnlEaWFsb2dSZWYhOiBNYXREaWFsb2dSZWY8dW5rbm93bj47XG4gICAgaGFzTWFueUVudGl0eSE6IEVudGl0eVR5cGU7XG4gICAgaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyE6IEVudGl0eVR5cGU7XG4gICAgaXNIYXNNYW55RW50aXR5VmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpc0hhc01hbnlFbnRpdHlEaXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGhhc01hbnlBbGxvd0NyZWF0ZSE6IGJvb2xlYW47XG4gICAgaGFzTWFueUNyZWF0ZVRhYnMhOiBFbnRpdHlUYWI8RW50aXR5VHlwZT5bXTtcbiAgICBoYXNNYW55VXBkYXRlVGFicyE6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdO1xuICAgIHByaXZhdGUgaGFzTWFueUNyZWF0ZUJhc2VVcmwhOiBzdHJpbmc7XG5cbiAgICBtZXRhZGF0YVJlZmVyZW5jZXNPbmUhOiBSZWZlcmVuY2VzT25lRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZT47XG4gICAgcmVmZXJlbmNlc09uZU9iamVjdCE6IEVudGl0eVR5cGU7XG4gICAgcmVmZXJlbmNlc09uZVByb3BlcnR5VGFicyE6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdO1xuICAgIHJlZmVyZW5jZXNPbmVBbGxSZWZlcmVuY2VkRW50aXRpZXMhOiBFbnRpdHlUeXBlW107XG4gICAgcmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVzITogRHJvcGRvd25WYWx1ZTxzdHJpbmc+W107XG5cbiAgICByZWFkb25seSBEZWNvcmF0b3JUeXBlczogdHlwZW9mIERlY29yYXRvclR5cGVzID0gRGVjb3JhdG9yVHlwZXM7XG5cbiAgICBFbnRpdHlVdGlsaXRpZXM6IHR5cGVvZiBFbnRpdHlVdGlsaXRpZXMgPSBFbnRpdHlVdGlsaXRpZXM7XG4gICAgRGF0ZVV0aWxpdGllczogdHlwZW9mIERhdGVVdGlsaXRpZXMgPSBEYXRlVXRpbGl0aWVzO1xuICAgIFNlbGVjdGlvblV0aWxpdGllczogdHlwZW9mIFNlbGVjdGlvblV0aWxpdGllcyA9IFNlbGVjdGlvblV0aWxpdGllcztcbiAgICByZWZlcmVuY2VzT25lVVVJRDogc3RyaW5nID0gVVVJRFV0aWxpdGllcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZzogTWF0RGlhbG9nLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgICAgICBASW5qZWN0KE5HWF9HRVRfVkFMSURBVElPTl9FUlJPUl9NRVNTQUdFKVxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2U6IChtb2RlbDogTmdNb2RlbCkgPT4gc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnRcbiAgICApIHt9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGlucHV0IHdpdGggdGhlIGdpdmVuIGtleSBvbiB0aGUgZ2l2ZW4gcHJvcGVydHkgaXMgcmVhZG9ubHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb24gd2hpY2ggdG8gY2hlY2sgdGhlIGlucHV0LlxuICAgICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IGZvciB0aGUgaW5wdXQgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGlucHV0IGlzIHJlYWRvbmx5LlxuICAgICAqL1xuICAgIGlzUHJvcGVydHlSZWFkT25seShwcm9wZXJ0eTogRW50aXR5VHlwZSwga2V5OiBrZXlvZiBFbnRpdHlUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdG9yLnJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcm5hbElzUmVhZE9ubHkgfHwgdGhpcy5tZXRhZGF0YURlZmF1bHRPYmplY3Q/LmlzUmVhZE9ubHkocHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKHByb3BlcnR5LCBrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmlzUmVhZE9ubHkocHJvcGVydHkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIGlucHV0cyB0byB3b3JrIGluc2lkZSBhbiBuZ0Zvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgbmdGb3IuXG4gICAgICogQHJldHVybnMgVGhlIGluZGV4LlxuICAgICAqL1xuICAgIHRyYWNrQnlGbihpbmRleDogdW5rbm93bik6IHVua25vd24ge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmFsdWUgdG8gZGlzcGxheSBpbiB0aGUgY29sdW1uLlxuICAgICAqIFJ1bnMgaW4gZW52aXJvbm1lbnQgY29udGV4dCB0byBlbmFibGUgaW5qZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tLlxuICAgICAqIEBwYXJhbSBkaXNwbGF5Q29sdW1uIC0gVGhlIGRpc3BsYXkgY29sdW1uIHRvIGdldCB0aGUgdmFsdWUgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIGRpc3BsYXkgY29sdW1uLlxuICAgICAqL1xuICAgIGdldERpc3BsYXlDb2x1bW5WYWx1ZShlbnRpdHk6IEVudGl0eVR5cGUsIGRpc3BsYXlDb2x1bW46IERpc3BsYXlDb2x1bW48RW50aXR5VHlwZT4pOiB1bmtub3duIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IucnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkaXNwbGF5Q29sdW1uLnZhbHVlKGVudGl0eSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZW50aXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgSW5wdXQgZGF0YSBcImVudGl0eVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbnRlcm5hbEVudGl0eSA9IHRoaXMuZW50aXR5O1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BlcnR5S2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBJbnB1dCBkYXRhIFwicHJvcGVydHlLZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW50ZXJuYWxQcm9wZXJ0eUtleSA9IHRoaXMucHJvcGVydHlLZXk7XG5cbiAgICAgICAgdGhpcy5pbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UgPSB0aGlzLmdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2UgPz8gdGhpcy5kZWZhdWx0R2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbElzUmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHkgPz8gZmFsc2U7XG5cbiAgICAgICAgdGhpcy50eXBlID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5VHlwZSh0aGlzLmludGVybmFsRW50aXR5LCB0aGlzLmludGVybmFsUHJvcGVydHlLZXkpO1xuICAgICAgICBpZiAodGhpcy52YWxpZEVtcHR5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAgICAgY29uc3QgY3VycmVudE1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsID0gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YSgnbWV0YWRhdGEnLCB0aGlzLmludGVybmFsRW50aXR5LCB0aGlzLmludGVybmFsUHJvcGVydHlLZXkpIGFzIFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5kZWZpbmVNZXRhZGF0YSgnbWV0YWRhdGEnLCB7IC4uLmN1cnJlbnRNZXRhZGF0YSwgcmVxdWlyZWQ6IGRlZmF1bHRGYWxzZSB9LCB0aGlzLmludGVybmFsRW50aXR5LCB0aGlzLmludGVybmFsUHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YSh0aGlzLmludGVybmFsRW50aXR5LCB0aGlzLmludGVybmFsUHJvcGVydHlLZXksIHRoaXMudHlwZSk7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuT0JKRUNUOlxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdE9iamVjdElucHV0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZOlxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEVudGl0eUFycmF5KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkhBU19NQU5ZOlxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEhhc01hbnkoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuUkVGRVJFTkNFU19PTkU6XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UmVmZXJlbmNlc09uZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFJlZmVyZW5jZXNPbmUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWV0YWRhdGFSZWZlcmVuY2VzT25lID0gdGhpcy5tZXRhZGF0YSBhcyBSZWZlcmVuY2VzT25lRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZT47XG5cbiAgICAgICAgdm9pZCB0aGlzLmluamVjdG9yLnJ1bkluQ29udGV4dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZmVyZW5jZXNPbmVBbGxSZWZlcmVuY2VkRW50aXRpZXMgPSBhd2FpdCB0aGlzLm1ldGFkYXRhUmVmZXJlbmNlc09uZS5nZXRSZWZlcmVuY2VkRW50aXRpZXMoKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICAgICB0aGlzLnJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlcyA9IHRoaXMubWV0YWRhdGFSZWZlcmVuY2VzT25lLmdldERyb3Bkb3duVmFsdWVzKExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5yZWZlcmVuY2VzT25lQWxsUmVmZXJlbmNlZEVudGl0aWVzKSk7XG4gICAgICAgICAgICB0aGlzLnNldFJlZmVyZW5jZXNPbmVPYmplY3QoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0SGFzTWFueSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZXRhZGF0YUhhc01hbnkgPSB0aGlzLm1ldGFkYXRhIGFzIEhhc01hbnlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlLCBFbnRpdHlUeXBlPjtcbiAgICAgICAgdGhpcy5oYXNNYW55SW1wb3J0QWN0aW9uID0gbmV3IEJhc2VUYWJsZUFjdGlvbkludGVybmFsKHtcbiAgICAgICAgICAgIC4uLnRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5pbXBvcnRBY3Rpb25EYXRhLFxuICAgICAgICAgICAgYWN0aW9uOiAoKSA9PiB0aGlzLnN0YXJ0SW1wb3J0SnNvbigpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaW5qZWN0b3IucnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueUFsbG93Q3JlYXRlID0gdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93Q3JlYXRlKCk7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlID0gaW5qZWN0PEVudGl0eVNlcnZpY2U8RW50aXR5VHlwZT4+KHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5FbnRpdHlTZXJ2aWNlQ2xhc3MpO1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55Q3JlYXRlQmFzZVVybCA9IHRoaXMubWV0YWRhdGFIYXNNYW55LmNyZWF0ZUJhc2VVcmwodGhpcy5pbnRlcm5hbEVudGl0eSwgdGhpcy5tZXRhZGF0YUhhc01hbnkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBnaXZlbkRpc3BsYXlDb2x1bW5zOiBzdHJpbmdbXSA9IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5kaXNwbGF5Q29sdW1ucy5tYXAoKHYpID0+IHYuZGlzcGxheU5hbWUpO1xuICAgICAgICBpZiAodGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5maWx0ZXIodEEgPT4gdEEudHlwZSA9PT0gJ211bHRpLXNlbGVjdCcpLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIYXNNYW55Q29sdW1ucyA9IFsnc2VsZWN0J10uY29uY2F0KGdpdmVuRGlzcGxheUNvbHVtbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRIYXNNYW55Q29sdW1ucyA9IGdpdmVuRGlzcGxheUNvbHVtbnM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhc01hbnlEYXRhU291cmNlLnNvcnRpbmdEYXRhQWNjZXNzb3IgPSAoZW50aXR5OiBFbnRpdHlUeXBlLCBoZWFkZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IucnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuZGlzcGxheUNvbHVtbnMuZmluZCgoZHApID0+IGRwLmRpc3BsYXlOYW1lID09PSBoZWFkZXIpPy52YWx1ZShlbnRpdHkpIGFzIHN0cmluZztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhc01hbnlEYXRhU291cmNlLmZpbHRlclByZWRpY2F0ZSA9IChlbnRpdHk6IEVudGl0eVR5cGUsIGZpbHRlcjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWFyY2hTdHI6IHN0cmluZyA9IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5zZWFyY2hTdHJpbmcoZW50aXR5KTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFNlYXJjaFN0cmluZzogc3RyaW5nID0gc2VhcmNoU3RyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRGaWx0ZXJTdHJpbmc6IHN0cmluZyA9IGZpbHRlci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZFNlYXJjaFN0cmluZy5pbmNsdWRlcyhmb3JtYXR0ZWRGaWx0ZXJTdHJpbmcpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhc01hbnlEYXRhU291cmNlLmZpbHRlciA9IHRoaXMuaGFzTWFueUZpbHRlcjtcblxuICAgICAgICB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmVudGl0aWVzU3ViamVjdC5zdWJzY3JpYmUoKGVudGl0aWVzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlEYXRhU291cmNlLmRhdGEgPSBlbnRpdGllcztcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueVNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVhZEJhc2VVcmw6IHN0cmluZyA9IHRoaXMubWV0YWRhdGFIYXNNYW55LnJlYWRCYXNlVXJsKHRoaXMuaW50ZXJuYWxFbnRpdHksIHRoaXMubWV0YWRhdGFIYXNNYW55KTtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5oYXNNYW55RW50aXR5U2VydmljZS5yZWFkKHJlYWRCYXNlVXJsKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc01hbnlJc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRFbnRpdHlBcnJheSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5ID0gdGhpcy5tZXRhZGF0YSBhcyBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbEVudGl0eVt0aGlzLmludGVybmFsUHJvcGVydHlLZXldID09IG51bGwpIHtcbiAgICAgICAgICAgICh0aGlzLmludGVybmFsRW50aXR5W3RoaXMuaW50ZXJuYWxQcm9wZXJ0eUtleV0gYXMgRW50aXR5VHlwZVtdKSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW50aXR5QXJyYXlWYWx1ZXMgPSB0aGlzLmludGVybmFsRW50aXR5W3RoaXMuaW50ZXJuYWxQcm9wZXJ0eUtleV0gYXMgRW50aXR5VHlwZVtdO1xuICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5jcmVhdGVJbmxpbmUgJiYgIXRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5jcmVhdGVEaWFsb2dEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlRGlhbG9nRGF0YSA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogJ0FkZCdcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2l2ZW5EaXNwbGF5Q29sdW1uczogc3RyaW5nW10gPSB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuZGlzcGxheUNvbHVtbnMubWFwKCh2KSA9PiB2LmRpc3BsYXlOYW1lKTtcbiAgICAgICAgaWYgKGdpdmVuRGlzcGxheUNvbHVtbnMuZmluZChzID0+IHMgPT09ICdzZWxlY3QnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBUaGUgbmFtZSBcInNlbGVjdFwiIGZvciBhIGRpc3BsYXkgY29sdW1uIGlzIHJlc2VydmVkLlxuICAgICAgICAgICAgICAgIFBsZWFzZSBjaG9vc2UgYSBkaWZmZXJlbnQgbmFtZS5gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW50aXR5QXJyYXlEaXNwbGF5ZWRDb2x1bW5zID0gdGhpcy5pbnRlcm5hbElzUmVhZE9ubHkgPyBnaXZlbkRpc3BsYXlDb2x1bW5zIDogWydzZWxlY3QnXS5jb25jYXQoZ2l2ZW5EaXNwbGF5Q29sdW1ucyk7XG4gICAgICAgIHRoaXMuZW50aXR5QXJyYXlEYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSgpO1xuICAgICAgICB0aGlzLmVudGl0eUFycmF5RGF0YVNvdXJjZS5kYXRhID0gdGhpcy5lbnRpdHlBcnJheVZhbHVlcztcbiAgICAgICAgdGhpcy5hcnJheUl0ZW0gPSBuZXcgdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LkVudGl0eUNsYXNzKCk7XG4gICAgICAgIHRoaXMuYXJyYXlJdGVtUHJpb3JDaGFuZ2VzID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmFycmF5SXRlbSk7XG4gICAgICAgIHRoaXMuYXJyYXlJdGVtSW5saW5lVGFicyA9IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKHRoaXMuYXJyYXlJdGVtLCB0cnVlKTtcblxuICAgICAgICB0aGlzLmFkZEFycmF5SXRlbURpYWxvZ0RhdGEgPSBuZXcgQ3JlYXRlRGlhbG9nRGF0YUJ1aWxkZXIodGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZURpYWxvZ0RhdGEpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ2NyZWF0ZUJ1dHRvbkxhYmVsJywgJ0FkZCcpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RpdGxlJywgJ0FkZCB0byBhcnJheScpXG4gICAgICAgICAgICAuZ2V0UmVzdWx0KCk7XG4gICAgICAgIHRoaXMuYXJyYXlJdGVtRGlhbG9nVGFicyA9IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKHRoaXMuYXJyYXlJdGVtLCB0cnVlKTtcblxuICAgICAgICB0aGlzLmVkaXRBcnJheUl0ZW1EaWFsb2dEYXRhID0gdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmVkaXREaWFsb2dEYXRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdE9iamVjdElucHV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1ldGFkYXRhRGVmYXVsdE9iamVjdCA9IHRoaXMubWV0YWRhdGEgYXMgRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgICAgICB0aGlzLm9iamVjdFByb3BlcnR5ID0gdGhpcy5pbnRlcm5hbEVudGl0eVt0aGlzLmludGVybmFsUHJvcGVydHlLZXldIGFzIEVudGl0eVR5cGU7XG4gICAgICAgIHRoaXMub2JqZWN0UHJvcGVydHlUYWJzID0gRW50aXR5VXRpbGl0aWVzLmdldEVudGl0eVRhYnMoXG4gICAgICAgICAgICB0aGlzLm9iamVjdFByb3BlcnR5LFxuICAgICAgICAgICAgdGhpcy5oaWRlT21pdEZvckNyZWF0ZSxcbiAgICAgICAgICAgIHRoaXMuaGlkZU9taXRGb3JFZGl0LFxuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YURlZmF1bHRPYmplY3Qub21pdFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhcnRJbXBvcnRKc29uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgIGlucHV0LnR5cGUgPSAnZmlsZSc7XG4gICAgICAgIGlucHV0LmFjY2VwdCA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgICAgICAgaW5wdXQub25jaGFuZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuZmlsZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltcG9ydEpzb24oaW5wdXQuZmlsZXNbMF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpbnB1dC5jbGljaygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW1wb3J0SnNvbihmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMuaGFzTWFueUltcG9ydEFjdGlvbi5jb25maXJtRGlhbG9nRGF0YSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGV4dCcsIHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5pbXBvcnRBY3Rpb25EYXRhLmNvbmZpcm1EaWFsb2dEYXRhPy50ZXh0IClcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGl0bGUnLCB0aGlzLmhhc01hbnlJbXBvcnRBY3Rpb24uZGlzcGxheU5hbWUpXG4gICAgICAgICAgICAuZ2V0UmVzdWx0KCk7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIGJvb2xlYW4+ID0gdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmltcG9ydChmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVmZXJlbmNlcyBvbmUgb2JqZWN0IHVzaW5nIHRoZSBpbnB1dCBpZC5cbiAgICAgKi9cbiAgICBzZXRSZWZlcmVuY2VzT25lT2JqZWN0KCk6IHZvaWQge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICBjb25zdCBmb3VuZEVudGl0eTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCA9IHRoaXMubWV0YWRhdGFSZWZlcmVuY2VzT25lLmdldEVudGl0eUZvcklkKHRoaXMuaW50ZXJuYWxFbnRpdHlbdGhpcy5pbnRlcm5hbFByb3BlcnR5S2V5XSBhcyBzdHJpbmcsIHRoaXMucmVmZXJlbmNlc09uZUFsbFJlZmVyZW5jZWRFbnRpdGllcyk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlc09uZU9iamVjdCA9IG5ldyB0aGlzLm1ldGFkYXRhUmVmZXJlbmNlc09uZS5FbnRpdHlDbGFzcyhmb3VuZEVudGl0eSk7XG4gICAgICAgIHRoaXMucmVmZXJlbmNlc09uZVByb3BlcnR5VGFicyA9IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKHRoaXMucmVmZXJlbmNlc09uZU9iamVjdCk7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVkaXRzIGFuIGVudGl0eS4gVGhpcyBlaXRoZXIgY2FsbHMgdGhlIGVkaXQtTWV0aG9kIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIG9yIHVzZXMgYSBkZWZhdWx0IGVkaXQtZGlhbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdGhhdCBzaG91bGQgYmUgdXBkYXRlZC5cbiAgICAgKiBAcGFyYW0gZENvbCAtIFRoZSBkaXNwbGF5IGNvbHVtbiB0aGF0IHdhcyBjbGlja2VkIG9uLlxuICAgICAqIEB0aHJvd3MgV2hlbiBubyBFbnRpdHlDbGFzcyB3YXMgcHJvdmlkZWQsIGFzIGEgbmV3IGNhbGwgaXMgbmVlZGVkIHRvIGluaXRpYWxpemUgbWV0YWRhdGEuXG4gICAgICovXG4gICAgZWRpdEhhc01hbnlFbnRpdHkoZW50aXR5OiBFbnRpdHlUeXBlLCBkQ29sOiBEaXNwbGF5Q29sdW1uPEVudGl0eVR5cGU+KTogdm9pZCB7XG4gICAgICAgIGlmICgoZENvbC5kaXNhYmxlQ2xpY2sgPT09IHRydWUpIHx8ICghdGhpcy5oYXNNYW55QWxsb3dVcGRhdGUoZW50aXR5KSAmJiAhdGhpcy5oYXNNYW55QWxsb3dSZWFkKGVudGl0eSkpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuRW50aXR5Q2xhc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gXCJFbnRpdHlDbGFzc1wiIHNwZWNpZmllZCBmb3IgdGhpcyB0YWJsZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuZWRpdCkge1xuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmVkaXQobmV3IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcyhlbnRpdHkpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmRlZmF1bHRFZGl0ID09ICdwYWdlJykge1xuICAgICAgICAgICAgdGhpcy5lZGl0SGFzTWFueURlZmF1bHRQYWdlKG5ldyB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuRW50aXR5Q2xhc3MoZW50aXR5KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdm9pZCB0aGlzLmVkaXRIYXNNYW55RGVmYXVsdERpYWxvZyhuZXcgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLkVudGl0eUNsYXNzKGVudGl0eSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdXBkYXRpbmcgdGhlIHByb3ZpZGVkIGVudGl0eSBmcm9tIHRoZSBoYXMgbWFueSBwcm9wZXJ0eSBpcyBhbGxvd2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEEgc2luZ2xlIHZhbHVlIG9mIHRoZSBoYXMgbWFueSBwcm9wZXJ0eSB0aGF0IHRoZSB1c2VyIHdhbnRzIHRvIGVkaXQuXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSB1c2VyIGNhbiBlZGl0IHRoZSBwcm92aWRlZCBlbnRpdHkgYW5kIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBoYXNNYW55QWxsb3dVcGRhdGUoZW50aXR5OiBFbnRpdHlUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdG9yLnJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93VXBkYXRlKGVudGl0eSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdmlld2luZyB0aGUgcHJvdmlkZWQgZW50aXR5IGZyb20gdGhlIGhhcyBtYW55IHByb3BlcnR5IGlzIGFsbG93ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gQSBzaW5nbGUgdmFsdWUgb2YgdGhlIGhhcyBtYW55IHByb3BlcnR5IHRoYXQgdGhlIHVzZXIgd2FudHMgdG8gdmlldy5cbiAgICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gdGhlIHVzZXIgY2FuIHZpZXcgdGhlIHByb3ZpZGVkIGVudGl0eSBhbmQgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGhhc01hbnlBbGxvd1JlYWQoZW50aXR5OiBFbnRpdHlUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdG9yLnJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93UmVhZChlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGRlbGV0aW5nIHRoZSBwcm92aWRlZCBlbnRpdHkgZnJvbSB0aGUgaGFzIG1hbnkgcHJvcGVydHkgaXMgYWxsb3dlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBBIHNpbmdsZSB2YWx1ZSBvZiB0aGUgaGFzIG1hbnkgcHJvcGVydHkgdGhhdCB0aGUgdXNlciB3YW50cyB0byBkZWxldGUuXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSB1c2VyIGNhbiBkZWxldGUgdGhlIHByb3ZpZGVkIGVudGl0eSBhbmQgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGhhc01hbnlBbGxvd0RlbGV0ZShlbnRpdHk6IEVudGl0eVR5cGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IucnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuYWxsb3dEZWxldGUoZW50aXR5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFuIEVkaXRBY3Rpb24gaXMgZGlzYWJsZWQgKGUuZy4gQmVjYXVzZSB0aGUgY3VycmVudCBlbnRyeSBkb2Vzbid0IGZ1bGxmaWwgdGhlIHJlcXVpcmVtZW50cykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0aW9uIC0gVGhlIEVkaXRBY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIEFjdGlvbiBjYW4gYmUgdXNlZC5cbiAgICAgKi9cbiAgICBoYXNNYW55RWRpdEFjdGlvbkRpc2FibGVkKGFjdGlvbjogRWRpdEFjdGlvbkludGVybmFsPEVudGl0eVR5cGU+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdG9yLnJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gIWFjdGlvbi5lbmFibGVkKHRoaXMuaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJ1bnMgdGhlIGVkaXQgYWN0aW9uIG9uIHRoZSBlbnRpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0aW9uIC0gVGhlIGFjdGlvbiB0byBydW4uXG4gICAgICovXG4gICAgaGFzTWFueVJ1bkVkaXRBY3Rpb24oYWN0aW9uOiBFZGl0QWN0aW9uSW50ZXJuYWw8RW50aXR5VHlwZT4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVxdWlyZUNvbmZpcm1EaWFsb2c6IGJvb2xlYW4gPSB0aGlzLmluamVjdG9yLnJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJlcXVpcmVDb25maXJtRGlhbG9nKHRoaXMuaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcmVxdWlyZUNvbmZpcm1EaWFsb2cpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybUhhc01hbnlSdW5FZGl0QWN0aW9uKGFjdGlvbik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGFjdGlvbi5jb25maXJtRGlhbG9nRGF0YSxcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlybUhhc01hbnlSdW5FZGl0QWN0aW9uKGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlybUhhc01hbnlSdW5FZGl0QWN0aW9uKGFjdGlvbjogRWRpdEFjdGlvbkludGVybmFsPEVudGl0eVR5cGU+KTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgYWN0aW9uLmFjdGlvbih0aGlzLmhhc01hbnlFbnRpdHksIHRoaXMuaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSGFzTWFueUVudGl0eSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVkaXRIYXNNYW55RGVmYXVsdFBhZ2UoZW50aXR5OiBFbnRpdHlUeXBlKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycnLCB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmVkaXRCYXNlUm91dGUsIGVudGl0eVt0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmlkS2V5XV0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZWRpdEhhc01hbnlEZWZhdWx0RGlhbG9nKGVudGl0eTogRW50aXR5VHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmhhc01hbnlFbnRpdHkgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKGVudGl0eSk7XG4gICAgICAgIHRoaXMuaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5oYXNNYW55RW50aXR5KTtcbiAgICAgICAgdGhpcy5oYXNNYW55VXBkYXRlVGFicyA9IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKHRoaXMuaGFzTWFueUVudGl0eSwgZmFsc2UsIHRydWUpO1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrSGFzTWFueUVudGl0eSgpO1xuICAgICAgICB0aGlzLmVkaXRIYXNNYW55RGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihcbiAgICAgICAgICAgIHRoaXMuZWRpdEhhc01hbnlEaWFsb2csXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWluV2lkdGg6ICc2MCUnLFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZXM6IG51bWJlciA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuZWRpdEhhc01hbnlEaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKSkgYXMgbnVtYmVyO1xuICAgICAgICBpZiAocmVzID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhOiBFbnRpdHlUeXBlW10gPSB0aGlzLmhhc01hbnlEYXRhU291cmNlLmRhdGE7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAgICAgZGF0YVt0aGlzLmhhc01hbnlEYXRhU291cmNlLmRhdGEuZmluZEluZGV4KChlKSA9PiBlW3RoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UuaWRLZXldID09PSBlbnRpdHlbdGhpcy5oYXNNYW55RW50aXR5U2VydmljZS5pZEtleV0pXSA9IGVudGl0eTtcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueURhdGFTb3VyY2UuZGF0YSA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlTZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIHNhdmUgdGhlIGNoYW5nZXMgYW5kIGNsb3NlIHRoZSBkaWFsb2cgYWZ0ZXJ3YXJkcy5cbiAgICAgKiBBbHNvIGhhbmRsZXMgdGhlIGNvbmZpcm1hdGlvbiBpZiByZXF1aXJlZC5cbiAgICAgKi9cbiAgICBkaWFsb2dFZGl0SGFzTWFueSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxJc1JlYWRPbmx5IHx8ICF0aGlzLmlzSGFzTWFueUVudGl0eVZhbGlkIHx8ICF0aGlzLmlzSGFzTWFueUVudGl0eURpcnR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuZWRpdFJlcXVpcmVzQ29uZmlybURpYWxvZykge1xuICAgICAgICAgICAgdGhpcy5kaWFsb2dDb25maXJtRWRpdEhhc01hbnkoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICBjb25zdCBkaWFsb2dEYXRhOiBDb25maXJtRGlhbG9nRGF0YUludGVybmFsID0gbmV3IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlcih0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuY29uZmlybUVkaXREaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0ZXh0JywgWydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gc2F2ZSBhbGwgY2hhbmdlcz8nXSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgnY29uZmlybUJ1dHRvbkxhYmVsJywgJ1NhdmUnKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0aXRsZScsICdFZGl0JylcbiAgICAgICAgICAgIC5nZXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ0NvbmZpcm1FZGl0SGFzTWFueSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBkaWFsb2dDb25maXJtRWRpdEhhc01hbnkoKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5oYXNNYW55RW50aXR5U2VydmljZS51cGRhdGUodGhpcy5oYXNNYW55RW50aXR5LCB0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0SGFzTWFueURpYWxvZ1JlZi5jbG9zZSgxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyaWVzIHRvIGRlbGV0ZSB0aGUgZW50aXR5IGFuZCBjbG9zZSB0aGUgZGlhbG9nIGFmdGVyd2FyZHMuXG4gICAgICogQWxzbyBoYW5kbGVzIHRoZSBjb25maXJtYXRpb24gaWYgcmVxdWlyZWQuXG4gICAgICovXG4gICAgZGVsZXRlSGFzTWFueUVudGl0eSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuZGVsZXRlUmVxdWlyZXNDb25maXJtRGlhbG9nKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1EZWxldGVIYXNNYW55RW50aXR5KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgY29uc3QgZGlhbG9nRGF0YTogQ29uZmlybURpYWxvZ0RhdGFJbnRlcm5hbCA9IG5ldyBDb25maXJtRGlhbG9nRGF0YUJ1aWxkZXIodGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmVkaXREYXRhLmNvbmZpcm1EZWxldGVEaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0ZXh0JywgWydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgZW50aXR5PyddKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0eXBlJywgJ2RlbGV0ZScpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ2NvbmZpcm1CdXR0b25MYWJlbCcsICdEZWxldGUnKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0aXRsZScsICdEZWxldGUnKVxuICAgICAgICAgICAgLmdldFJlc3VsdCgpO1xuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCBib29sZWFuPiA9IHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgZGF0YTogZGlhbG9nRGF0YSxcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlybURlbGV0ZUhhc01hbnlFbnRpdHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25maXJtRGVsZXRlSGFzTWFueUVudGl0eSgpOiB2b2lkIHtcbiAgICAgICAgdm9pZCB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmRlbGV0ZSh0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lZGl0SGFzTWFueURpYWxvZ1JlZi5jbG9zZSgyKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIHRoZSBlZGl0aW5nIG9mIHRoZSBoYXMgbWFueSBlbnRpdHkgYW5kIGNsb3NlcyB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIGRpYWxvZ0NhbmNlbEVkaXRIYXNNYW55KCk6IHZvaWQge1xuICAgICAgICBFbnRpdHlVdGlsaXRpZXMucmVzZXRDaGFuZ2VzT25FbnRpdHkodGhpcy5oYXNNYW55RW50aXR5LCB0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICB0aGlzLmVkaXRIYXNNYW55RGlhbG9nUmVmLmNsb3NlKDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRW50aXR5LiBUaGlzIGVpdGhlciBjYWxscyB0aGUgY3JlYXRlLU1ldGhvZCBwcm92aWRlZCBieSB0aGUgdXNlciBvciB1c2VzIGEgZGVmYXVsdCBjcmVhdGUtZGlhbG9nLlxuICAgICAqXG4gICAgICogQHRocm93cyBXaGVuIG5vIEVudGl0eUNsYXNzIHdhcyBwcm92aWRlZCwgYXMgYSBuZXcgY2FsbCBpcyBuZWVkZWQgdG8gaW5pdGlhbGl6ZSBtZXRhZGF0YS5cbiAgICAgKi9cbiAgICBjcmVhdGVIYXNNYW55RW50aXR5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmluamVjdG9yLnJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93Q3JlYXRlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFwiRW50aXR5Q2xhc3NcIiBzcGVjaWZpZWQgZm9yIHRoaXMgdGFibGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5jcmVhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmNyZWF0ZShuZXcgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLkVudGl0eUNsYXNzKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVIYXNNYW55RGVmYXVsdChuZXcgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLkVudGl0eUNsYXNzKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVIYXNNYW55RGVmYXVsdChlbnRpdHk6IEVudGl0eVR5cGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oYXNNYW55RW50aXR5ID0gZW50aXR5O1xuICAgICAgICB0aGlzLmhhc01hbnlDcmVhdGVUYWJzID0gRW50aXR5VXRpbGl0aWVzLmdldEVudGl0eVRhYnModGhpcy5oYXNNYW55RW50aXR5LCB0cnVlKTtcbiAgICAgICAgdGhpcy5jaGVja0lzSGFzTWFueUVudGl0eVZhbGlkKCdjcmVhdGUnKTtcbiAgICAgICAgdGhpcy5jcmVhdGVIYXNNYW55RGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlSGFzTWFueURpYWxvZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogJzYwJScsXG4gICAgICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgaGFzIG1hbnkgZW50aXR5IG92ZXIgdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBkaWFsb2dDcmVhdGVIYXNNYW55KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNIYXNNYW55RW50aXR5VmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5jcmVhdGVEaWFsb2dEYXRhLmNyZWF0ZVJlcXVpcmVzQ29uZmlybURpYWxvZykge1xuICAgICAgICAgICAgdGhpcy5kaWFsb2dDb25maXJtQ3JlYXRlSGFzTWFueSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgIGNvbnN0IGRpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5jcmVhdGVEaWFsb2dEYXRhLmNvbmZpcm1DcmVhdGVEaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0ZXh0JywgWydEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY3JlYXRlIHRoaXMgZW50aXR5PyddKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCdjb25maXJtQnV0dG9uTGFiZWwnLCAnQ3JlYXRlJylcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGl0bGUnLCAnQ3JlYXRlJylcbiAgICAgICAgICAgIC5nZXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ0NvbmZpcm1DcmVhdGVIYXNNYW55KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwcml2YXRlIGRpYWxvZ0NvbmZpcm1DcmVhdGVIYXNNYW55KCk6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UuY3JlYXRlKHRoaXMuaGFzTWFueUVudGl0eSwgdGhpcy5oYXNNYW55Q3JlYXRlQmFzZVVybCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUhhc01hbnlEaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYW5jZWxzIHRoZSBjcmVhdGluZyBvZiB0aGUgaGFzIG1hbnkgZW50aXR5IGFuZCBjbG9zZXMgdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBkaWFsb2dDYW5jZWxDcmVhdGVIYXNNYW55KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNyZWF0ZUhhc01hbnlEaWFsb2dSZWYuY2xvc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIHRoZSBUYWJsZUFjdGlvbiBmb3IgYWxsIHNlbGVjdGVkIGVudHJpZXMuXG4gICAgICogQWxzbyBoYW5kbGVzIGNvbmZpcm1hdGlvbiB3aXRoIGFuIGFkZGl0aW9uYWwgZGlhbG9nIGlmIGNvbmZpZ3VyZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0aW9uIC0gVGhlIFRhYmxlQWN0aW9uIHRvIHJ1bi5cbiAgICAgKi9cbiAgICBydW5IYXNNYW55VGFibGVBY3Rpb24oYWN0aW9uOiBUYWJsZUFjdGlvbkludGVybmFsPEVudGl0eVR5cGU+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVDb25maXJtRGlhbG9nOiBib29sZWFuID0gdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5yZXF1aXJlQ29uZmlybURpYWxvZyh0aGlzLmhhc01hbnlTZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFyZXF1aXJlQ29uZmlybURpYWxvZykge1xuICAgICAgICAgICAgdGhpcy5jb25maXJtUnVuSGFzTWFueVRhYmxlQWN0aW9uKGFjdGlvbik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlhbG9nRGF0YTogQ29uZmlybURpYWxvZ0RhdGFJbnRlcm5hbCA9IG5ldyBDb25maXJtRGlhbG9nRGF0YUJ1aWxkZXIoYWN0aW9uLmNvbmZpcm1EaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0ZXh0JywgW2BEbyB5b3UgcmVhbGx5IHdhbnQgdG8gcnVuIHRoaXMgYWN0aW9uIG9uICR7dGhpcy5oYXNNYW55U2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aH0gZW50cmllcz9gXSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGl0bGUnLCBhY3Rpb24uZGlzcGxheU5hbWUpXG4gICAgICAgICAgICAuZ2V0UmVzdWx0KCk7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIGJvb2xlYW4+ID0gdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maXJtUnVuSGFzTWFueVRhYmxlQWN0aW9uKGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlybVJ1bkhhc01hbnlUYWJsZUFjdGlvbihhY3Rpb246IFRhYmxlQWN0aW9uSW50ZXJuYWw8RW50aXR5VHlwZT4pOiB2b2lkIHtcbiAgICAgICAgdm9pZCB0aGlzLmluamVjdG9yLnJ1bkluQ29udGV4dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBhY3Rpb24uYWN0aW9uKHRoaXMuaGFzTWFueVNlbGVjdGlvbi5zZWxlY3RlZCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFuIFRhYmxlQWN0aW9uIGlzIGRpc2FibGVkIChlLmcuIEJlY2F1c2Ugbm8gZW50cmllcyBoYXZlIGJlZW4gc2VsZWN0ZWQpLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdGlvbiAtIFRoZSBUYWJsZUFjdGlvbiB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgQWN0aW9uIGNhbiBiZSB1c2VkLlxuICAgICAqL1xuICAgIGhhc01hbnlUYWJsZUFjdGlvbkRpc2FibGVkKGFjdGlvbjogVGFibGVBY3Rpb25JbnRlcm5hbDxFbnRpdHlUeXBlPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFhY3Rpb24uZW5hYmxlZCh0aGlzLmhhc01hbnlTZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBzZWFyY2ggaW5wdXQgdG8gZmlsdGVyIHRoZSB0YWJsZSBlbnRyaWVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIGtleXVwLWV2ZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBzZWFyY2gtc3RyaW5nIG9mIHRoZSB1c2VyLlxuICAgICAqL1xuICAgIGFwcGx5SGFzTWFueUZpbHRlcihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZmlsdGVyVmFsdWU6IHN0cmluZyA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgIHRoaXMuaGFzTWFueURhdGFTb3VyY2UuZmlsdGVyID0gZmlsdGVyVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbnRpdHkgaXMgdmFsaWQgZm9yIHVwZGF0aW5nIGFuZCBpZiBpdCBpcyBkaXJ0eS5cbiAgICAgKi9cbiAgICBhc3luYyBjaGVja0hhc01hbnlFbnRpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY2hlY2tJc0hhc01hbnlFbnRpdHlWYWxpZCgndXBkYXRlJyk7XG4gICAgICAgIHRoaXMuaXNIYXNNYW55RW50aXR5RGlydHkgPSBhd2FpdCBFbnRpdHlVdGlsaXRpZXMuaXNEaXJ0eSh0aGlzLmhhc01hbnlFbnRpdHksIHRoaXMuaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcywgdGhpcy5odHRwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGVudGl0eSBpcyB2YWxpZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvbWl0IC0gV2hldGhlciB2YWx1ZXMgb21pdHRlZCBmb3IgY3JlYXRlIG9yIHVwZGF0ZSBzaG91bGQgYmUgbGVmdCBvdXQuXG4gICAgICovXG4gICAgY2hlY2tJc0hhc01hbnlFbnRpdHlWYWxpZChvbWl0OiAnY3JlYXRlJyB8ICd1cGRhdGUnKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNIYXNNYW55RW50aXR5VmFsaWQgPSBFbnRpdHlVdGlsaXRpZXMuaXNFbnRpdHlWYWxpZCh0aGlzLmhhc01hbnlFbnRpdHksIG9taXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBhcnJheSBpdGVtIGlzIHZhbGlkIGFuZCBpZiB0aGUgYXJyYXkgaXRlbSBpcyBkaXJ0eS5cbiAgICAgKi9cbiAgICBjaGVja0FycmF5SXRlbSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jaGVja0lzQXJyYXlJdGVtVmFsaWQoKTtcbiAgICAgICAgdm9pZCB0aGlzLmNoZWNrSXNBcnJheUl0ZW1EaXJ0eSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgYXJyYXkgaXRlbSBpcyBkaXJ0eS5cbiAgICAgKi9cbiAgICBhc3luYyBjaGVja0lzQXJyYXlJdGVtRGlydHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuaXNBcnJheUl0ZW1EaXJ0eSA9IGF3YWl0IEVudGl0eVV0aWxpdGllcy5pc0RpcnR5KHRoaXMuYXJyYXlJdGVtLCB0aGlzLmFycmF5SXRlbVByaW9yQ2hhbmdlcywgdGhpcy5odHRwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGFycmF5SXRlbSBpcyB2YWxpZC5cbiAgICAgKi9cbiAgICBjaGVja0lzQXJyYXlJdGVtVmFsaWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNBcnJheUl0ZW1WYWxpZCA9IEVudGl0eVV0aWxpdGllcy5pc0VudGl0eVZhbGlkKHRoaXMuYXJyYXlJdGVtLCAnY3JlYXRlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgdGhhdCBhIHRoZSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgICAqL1xuICAgIGVtaXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRDaGFuZ2VFdmVudC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gYWRkIGFuIGl0ZW0gdG8gdGhlIGVudGl0eSBhcnJheS5cbiAgICAgKiBEb2VzIHRoaXMgZWl0aGVyIGlubGluZSBpZiB0aGUgXCJjcmVhdGVJbmxpbmVcIi1tZXRhZGF0YSBpcyBzZXQgdG8gdHJ1ZVxuICAgICAqIG9yIGluIGEgc2VwYXJhdGUgZGlhbG9nIGlmIGl0IGlzIHNldCB0byBmYWxzZS5cbiAgICAgKi9cbiAgICBhc3luYyBhZGRFbnRpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5hbGxvd0R1cGxpY2F0ZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy5lbnRpdHlBcnJheVZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGF3YWl0IEVudGl0eVV0aWxpdGllcy5pc0VxdWFsKHRoaXMuYXJyYXlJdGVtLCB2LCB0aGlzLm1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuaXRlbVR5cGUsIHRoaXMuaHR0cCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuZHVwbGljYXRlc0Vycm9yRGlhbG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVudGl0eUFycmF5VmFsdWVzLnB1c2goTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmFycmF5SXRlbSkpO1xuICAgICAgICAgICAgdGhpcy5lbnRpdHlBcnJheURhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZW50aXR5QXJyYXlWYWx1ZXM7XG4gICAgICAgICAgICBFbnRpdHlVdGlsaXRpZXMucmVzZXRDaGFuZ2VzT25FbnRpdHkodGhpcy5hcnJheUl0ZW0sIHRoaXMuYXJyYXlJdGVtUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tJc0FycmF5SXRlbVZhbGlkKCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQXJyYXlJdGVtRGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFycmF5SXRlbURpYWxvZyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnNjAlJyxcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBhcnJheSBpdGVtIGRlZmluZWQgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBhZGRBcnJheUl0ZW0oKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0FycmF5SXRlbVZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbnRpdHlBcnJheVZhbHVlcy5wdXNoKExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5hcnJheUl0ZW0pKTtcbiAgICAgICAgdGhpcy5lbnRpdHlBcnJheURhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZW50aXR5QXJyYXlWYWx1ZXM7XG5cbiAgICAgICAgdGhpcy5jbG9zZUFkZEFycmF5SXRlbURpYWxvZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbmNlbHMgYWRkaW5nIHRoZSBhcnJheSBpdGVtIGRlZmluZWQgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBjbG9zZUFkZEFycmF5SXRlbURpYWxvZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRBcnJheUl0ZW1EaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgICAgRW50aXR5VXRpbGl0aWVzLnJlc2V0Q2hhbmdlc09uRW50aXR5KHRoaXMuYXJyYXlJdGVtLCB0aGlzLmFycmF5SXRlbVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIHRoaXMuY2hlY2tJc0FycmF5SXRlbVZhbGlkKCk7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVkaXRzIGFuIGVudGl0eSBhcnJheSBpdGVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdGhhdCBoYXMgYmVlbiBjbGlja2VkLlxuICAgICAqIEBwYXJhbSBkQ29sIC0gVGhlIGRpc3BsYXkgY29sdW1uIHRoYXQgd2FzIGNsaWNrZWQgb24uXG4gICAgICovXG4gICAgZWRpdEFycmF5SXRlbShlbnRpdHk6IEVudGl0eVR5cGUsIGRDb2w6IERpc3BsYXlDb2x1bW48RW50aXR5VHlwZT4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGRDb2wuZGlzYWJsZUNsaWNrID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleE9mRWRpdGVkQXJyYXlJdGVtID0gdGhpcy5lbnRpdHlBcnJheVZhbHVlcy5pbmRleE9mKGVudGl0eSk7XG4gICAgICAgIHRoaXMuYXJyYXlJdGVtID0gbmV3IHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5FbnRpdHlDbGFzcyhlbnRpdHkpO1xuICAgICAgICB0aGlzLmFycmF5SXRlbVByaW9yQ2hhbmdlcyA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5hcnJheUl0ZW0pO1xuXG4gICAgICAgIHRoaXMuY2hlY2tBcnJheUl0ZW0oKTtcblxuICAgICAgICB0aGlzLmVkaXRBcnJheUl0ZW1EaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFxuICAgICAgICAgICAgdGhpcy5lZGl0QXJyYXlJdGVtRGlhbG9nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnNjAlJyxcbiAgICAgICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlcyBjaGFuZ2VzIG9uIHRoZSBhcnJheSBpdGVtIGluIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgc2F2ZUFycmF5SXRlbSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnRpdHlBcnJheVZhbHVlc1t0aGlzLmluZGV4T2ZFZGl0ZWRBcnJheUl0ZW1dID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmFycmF5SXRlbSk7XG4gICAgICAgIHRoaXMuZW50aXR5QXJyYXlEYXRhU291cmNlLmRhdGEgPSB0aGlzLmVudGl0eUFycmF5VmFsdWVzO1xuXG4gICAgICAgIHRoaXMuY2xvc2VFZGl0QXJyYXlJdGVtRGlhbG9nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBlZGl0IGFycmF5IGl0ZW0gZGlhbG9nIGFuZCByZXNldHMgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBjbG9zZUVkaXRBcnJheUl0ZW1EaWFsb2coKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdEFycmF5SXRlbURpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgICB0aGlzLmFycmF5SXRlbSA9IG5ldyB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuRW50aXR5Q2xhc3MoKTtcbiAgICAgICAgdGhpcy5hcnJheUl0ZW1QcmlvckNoYW5nZXMgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMuYXJyYXlJdGVtKTtcbiAgICAgICAgdGhpcy5jaGVja0FycmF5SXRlbSgpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBzZWxlY3RlZCBlbnRyaWVzIGZyb20gdGhlIGVudGl0eSBhcnJheS5cbiAgICAgKi9cbiAgICByZW1vdmVGcm9tRW50aXR5QXJyYXkoKTogdm9pZCB7XG4gICAgICAgIFNlbGVjdGlvblV0aWxpdGllcy5yZW1vdmUodGhpcy5lbnRpdHlBcnJheVNlbGVjdGlvbiwgdGhpcy5lbnRpdHlBcnJheVZhbHVlcywgdGhpcy5lbnRpdHlBcnJheURhdGFTb3VyY2UpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG59IiwiPGRpdiBbbmdTd2l0Y2hdPVwidHlwZVwiICpuZ0lmPVwiIShoaWRlT21pdEZvckNyZWF0ZSAmJiBtZXRhZGF0YS5vbWl0Rm9yQ3JlYXRlKSAmJiAhKGhpZGVPbWl0Rm9yRWRpdCAmJiBtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlKVwiPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLVN0cmluZ3MtLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLlNUUklOR1wiPlxuICAgICAgICA8c3RyaW5nLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9zdHJpbmctaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuU1RSSU5HX1RFWFRCT1hcIj5cbiAgICAgICAgPHN0cmluZy10ZXh0Ym94LWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9zdHJpbmctdGV4dGJveC1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5TVFJJTkdfQVVUT0NPTVBMRVRFXCI+XG4gICAgICAgIDxzdHJpbmctYXV0b2NvbXBsZXRlLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9zdHJpbmctYXV0b2NvbXBsZXRlLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLlNUUklOR19EUk9QRE9XTlwiPlxuICAgICAgICA8c3RyaW5nLWRyb3Bkb3duLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9zdHJpbmctZHJvcGRvd24taW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuU1RSSU5HX1BBU1NXT1JEXCI+XG4gICAgICAgIDxzdHJpbmctcGFzc3dvcmQtaW5wdXRcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L3N0cmluZy1wYXNzd29yZC1pbnB1dD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLUJvb2xlYW5zLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkJPT0xFQU5fQ0hFQ0tCT1hcIj5cbiAgICAgICAgPGJvb2xlYW4tY2hlY2tib3gtaW5wdXRcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L2Jvb2xlYW4tY2hlY2tib3gtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQk9PTEVBTl9UT0dHTEVcIj5cbiAgICAgICAgPGJvb2xlYW4tdG9nZ2xlLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9ib29sZWFuLXRvZ2dsZS1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5CT09MRUFOX0RST1BET1dOXCI+XG4gICAgICAgIDxib29sZWFuLWRyb3Bkb3duLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9ib29sZWFuLWRyb3Bkb3duLWlucHV0PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLU51bWJlcnMtLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuTlVNQkVSXCI+XG4gICAgICAgIDxudW1iZXItaW5wdXRcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L251bWJlci1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5OVU1CRVJfRFJPUERPV05cIj5cbiAgICAgICAgPG51bWJlci1kcm9wZG93bi1pbnB1dFxuICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIlxuICAgICAgICAgICAgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICA+XG4gICAgICAgIDwvbnVtYmVyLWRyb3Bkb3duLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLk5VTUJFUl9TTElERVJcIj5cbiAgICAgICAgPG51bWJlci1zbGlkZXItaW5wdXRcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L251bWJlci1zbGlkZXItaW5wdXQ+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLUFycmF5LS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFXCI+XG4gICAgICAgIDxhcnJheS1kYXRlLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9hcnJheS1kYXRlLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVfVElNRVwiPlxuICAgICAgICA8YXJyYXktZGF0ZS10aW1lLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9hcnJheS1kYXRlLXRpbWUtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9SQU5HRVwiPlxuICAgICAgICA8YXJyYXktZGF0ZS1yYW5nZS1pbnB1dFxuICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIlxuICAgICAgICAgICAgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICA+XG4gICAgICAgIDwvYXJyYXktZGF0ZS1yYW5nZS1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQ0hJUFNcIj5cbiAgICAgICAgPGFycmF5LXN0cmluZy1jaGlwcy1pbnB1dFxuICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIlxuICAgICAgICAgICAgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICA+XG4gICAgICAgIDwvYXJyYXktc3RyaW5nLWNoaXBzLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19BVVRPQ09NUExFVEVfQ0hJUFNcIj5cbiAgICAgICAgPGFycmF5LXN0cmluZy1hdXRvY29tcGxldGUtY2hpcHNcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L2FycmF5LXN0cmluZy1hdXRvY29tcGxldGUtY2hpcHM+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLURhdGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5EQVRFXCI+XG4gICAgICAgIDxkYXRlLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9kYXRlLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkRBVEVfUkFOR0VcIj5cbiAgICAgICAgPGRhdGUtcmFuZ2UtaW5wdXRcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L2RhdGUtcmFuZ2UtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuREFURV9USU1FXCI+XG4gICAgICAgIDxkYXRlLXRpbWUtaW5wdXRcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L2RhdGUtdGltZS1pbnB1dD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tRmlsZXMtLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkZJTEVfREVGQVVMVFwiPlxuICAgICAgICA8ZmlsZS1kZWZhdWx0LWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9maWxlLWRlZmF1bHQtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRVwiPlxuICAgICAgICA8ZmlsZS1pbWFnZS1pbnB1dFxuICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIlxuICAgICAgICAgICAgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICA+XG4gICAgICAgIDwvZmlsZS1pbWFnZS1pbnB1dD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLSByZWZlcmVuY2VzIG1hbnkgLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLlJFRkVSRU5DRVNfTUFOWVwiPlxuICAgICAgICA8cmVmZXJlbmNlcy1tYW55LWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9yZWZlcmVuY2VzLW1hbnktaW5wdXQ+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLUN1c3RvbS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5DVVNUT01cIj5cbiAgICAgICAgPGN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIlxuICAgICAgICAgICAgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICA+XG4gICAgICAgIDwvY3VzdG9tLWlucHV0PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS1PYmplY3QtLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuT0JKRUNUXCI+XG4gICAgICAgIDxiPnt7bWV0YWRhdGFEZWZhdWx0T2JqZWN0LmRpc3BsYXlOYW1lfX08L2I+XG4gICAgICAgIDwhLS0gaXRlcmF0ZXMgb3ZlciB0aGUgb2JqZWN0IHByb3BlcnRpZXMgLS0+XG4gICAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwib2JqZWN0UHJvcGVydHlUYWJzLmxlbmd0aCA+IDFcIiBwcmVzZXJ2ZUNvbnRlbnQ+XG4gICAgICAgICAgICA8bWF0LXRhYiAqbmdGb3I9XCJsZXQgdGFiIG9mIG9iamVjdFByb3BlcnR5VGFiczsgbGV0IHRJID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiIFtsYWJlbF09XCJ0YWIudGFiTmFtZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYi5yb3dzO1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXQgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5czsgbGV0IHJJID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cIm9iamVjdFByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckNyZWF0ZV09XCJoaWRlT21pdEZvckNyZWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JFZGl0XT1cImhpZGVPbWl0Rm9yRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRFbXB0eV09XCIhbWV0YWRhdGEucmVxdWlyZWQoZW50aXR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpc1Byb3BlcnR5UmVhZE9ubHkob2JqZWN0UHJvcGVydHksIGtleSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgob2JqZWN0UHJvcGVydHksIGtleSwgJ2xnJyl9fSBjb2wtbWQte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgob2JqZWN0UHJvcGVydHksIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgob2JqZWN0UHJvcGVydHksIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDwvbWF0LXRhYi1ncm91cD5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwib2JqZWN0UHJvcGVydHlUYWJzLmxlbmd0aCA8PSAxXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBvYmplY3RQcm9wZXJ0eVRhYnNbMF0ucm93c1wiPlxuICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dCAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdy5rZXlzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIlxuICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cIm9iamVjdFByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckNyZWF0ZV09XCJoaWRlT21pdEZvckNyZWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwiaGlkZU9taXRGb3JFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkRW1wdHldPVwiIW1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSlcIlxuICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpc1Byb3BlcnR5UmVhZE9ubHkob2JqZWN0UHJvcGVydHksIGtleSlcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1sZy17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChvYmplY3RQcm9wZXJ0eSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChvYmplY3RQcm9wZXJ0eSwga2V5LCAnbWQnKX19IGNvbC1zbS17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChvYmplY3RQcm9wZXJ0eSwga2V5LCAnc20nKX19XCJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9uZ3gtbWF0LWVudGl0eS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLSByZWZlcmVuY2VzIG9uZSAtLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuUkVGRVJFTkNFU19PTkVcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e21ldGFkYXRhLmRpc3BsYXlOYW1lfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwiaW50ZXJuYWxFbnRpdHlbaW50ZXJuYWxQcm9wZXJ0eUtleV1cIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cImludGVybmFsUHJvcGVydHlLZXkudG9TdHJpbmcoKSArICdpbnB1dCcgKyByZWZlcmVuY2VzT25lVVVJRFwiXG4gICAgICAgICAgICAgICAgI2lucHV0TW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWQoZW50aXR5KVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0UmVmZXJlbmNlc09uZU9iamVjdCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cIiFtZXRhZGF0YS5yZXF1aXJlZChlbnRpdHkpXCI+LTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgcmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVzXCIgW3ZhbHVlXT1cInZhbHVlLnZhbHVlXCI+e3t2YWx1ZS5kaXNwbGF5TmFtZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPG1hdC1lcnJvcj57e2ludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShpbnB1dE1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwhLS0gaXRlcmF0ZXMgb3ZlciB0aGUgcmVmZXJlbmNlcyBvbmUgcHJvcGVydGllcyAtLT5cbiAgICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJyZWZlcmVuY2VzT25lUHJvcGVydHlUYWJzICYmIHJlZmVyZW5jZXNPbmVQcm9wZXJ0eVRhYnMubGVuZ3RoID4gMVwiIHByZXNlcnZlQ29udGVudD5cbiAgICAgICAgICAgIDxtYXQtdGFiICpuZ0Zvcj1cImxldCB0YWIgb2YgcmVmZXJlbmNlc09uZVByb3BlcnR5VGFiczsgbGV0IHRJID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiIFtsYWJlbF09XCJ0YWIudGFiTmFtZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYi5yb3dzO1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXQgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5czsgbGV0IHJJID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cInJlZmVyZW5jZXNPbmVPYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cImhpZGVPbWl0Rm9yQ3JlYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwiaGlkZU9taXRGb3JFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZEVtcHR5XT1cIiFtZXRhZGF0YS5yZXF1aXJlZChlbnRpdHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgocmVmZXJlbmNlc09uZU9iamVjdCwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChyZWZlcmVuY2VzT25lT2JqZWN0LCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKHJlZmVyZW5jZXNPbmVPYmplY3QsIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDwvbWF0LXRhYi1ncm91cD5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwicmVmZXJlbmNlc09uZVByb3BlcnR5VGFicyAmJiByZWZlcmVuY2VzT25lUHJvcGVydHlUYWJzLmxlbmd0aCA8PSAxXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiByZWZlcmVuY2VzT25lUHJvcGVydHlUYWJzWzBdLnJvd3NcIj5cbiAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXQgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJyZWZlcmVuY2VzT25lT2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckNyZWF0ZV09XCJoaWRlT21pdEZvckNyZWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwiaGlkZU9taXRGb3JFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkRW1wdHldPVwiIW1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSlcIlxuICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgocmVmZXJlbmNlc09uZU9iamVjdCwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChyZWZlcmVuY2VzT25lT2JqZWN0LCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKHJlZmVyZW5jZXNPbmVPYmplY3QsIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLUFycmF5LS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2IGNsYXNzPVwiZW50aXR5QXJyYXlcIiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQVJSQVlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejggZWxldmF0aW9uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycmF5LWhlYWRsaW5lXCI+XG4gICAgICAgICAgICAgICAgPGI+e3ttZXRhZGF0YUVudGl0eUFycmF5LmRpc3BsYXlOYW1lfX08L2I+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJtZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZUlubGluZSAmJiAhaW50ZXJuYWxJc1JlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJhcnJheUl0ZW1JbmxpbmVUYWJzLmxlbmd0aCA+IDFcIiBwcmVzZXJ2ZUNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiICpuZ0Zvcj1cImxldCB0YWIgb2YgYXJyYXlJdGVtSW5saW5lVGFic1wiIFtsYWJlbF09XCJ0YWIudGFiTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2YgdGFiLnJvd3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJhcnJheUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydHlLZXldPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1sZy17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ2xnJyl9fSBjb2wtbWQte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnc20nKX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tJc0FycmF5SXRlbVZhbGlkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XG5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXJyYXlJdGVtSW5saW5lVGFicy5sZW5ndGggPD0gMVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBhcnJheUl0ZW1JbmxpbmVUYWJzWzBdLnJvd3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBrZXkgb2Ygcm93LmtleXM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJhcnJheUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckNyZWF0ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWxnLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdzbScpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImNoZWNrSXNBcnJheUl0ZW1WYWxpZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCIgKm5nSWY9XCIhaW50ZXJuYWxJc1JlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lICYmICFpc0FycmF5SXRlbVZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEVudGl0eSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFFbnRpdHlBcnJheS5hZGRCdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlbnRpdHlBcnJheVNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRnJvbUVudGl0eUFycmF5KClcIj5cbiAgICAgICAgICAgICAgICAgICAge3ttZXRhZGF0YUVudGl0eUFycmF5LnJlbW92ZUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgICAgIDxtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZW50aXR5QXJyYXlEYXRhU291cmNlXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBzZWxlY3QgQ29sdW1uIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCIgKm5nSWY9XCIhaW50ZXJuYWxJc1JlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlbnRpdHlBcnJheURhdGFTb3VyY2UuZGF0YS5sZW5ndGhcIiAoY2hhbmdlKT1cIiRldmVudCA/IFNlbGVjdGlvblV0aWxpdGllcy5tYXN0ZXJUb2dnbGUoZW50aXR5QXJyYXlTZWxlY3Rpb24sIGVudGl0eUFycmF5RGF0YVNvdXJjZSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJlbnRpdHlBcnJheVNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIFNlbGVjdGlvblV0aWxpdGllcy5pc0FsbFNlbGVjdGVkKGVudGl0eUFycmF5U2VsZWN0aW9uLCBlbnRpdHlBcnJheURhdGFTb3VyY2UpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJlbnRpdHlBcnJheVNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFTZWxlY3Rpb25VdGlsaXRpZXMuaXNBbGxTZWxlY3RlZChlbnRpdHlBcnJheVNlbGVjdGlvbiwgZW50aXR5QXJyYXlEYXRhU291cmNlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZW50aXR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIiRldmVudCA/IGVudGl0eUFycmF5U2VsZWN0aW9uLnRvZ2dsZShlbnRpdHkpIDogbnVsbFwiIFtjaGVja2VkXT1cImVudGl0eUFycmF5U2VsZWN0aW9uLmlzU2VsZWN0ZWQoZW50aXR5KVwiPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZENvbCBvZiBtZXRhZGF0YUVudGl0eUFycmF5LmRpc3BsYXlDb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJkQ29sLmRpc3BsYXlOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2RDb2wuZGlzcGxheU5hbWV9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jZWxsIFtjbGFzcy5lbmFibGVkXT1cIiFkQ29sLmRpc2FibGVDbGlja1wiIChjbGljayk9XCJlZGl0QXJyYXlJdGVtKGVudGl0eSwgZENvbClcIiAqbWF0Q2VsbERlZj1cImxldCBlbnRpdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkQ29sLkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWNvbHVtbi12YWx1ZSBbZW50aXR5XT1cImVudGl0eVwiIFtDb21wb25lbnRDbGFzc109XCJkQ29sLkNvbXBvbmVudFwiPjwvZGlzcGxheS1jb2x1bW4tdmFsdWU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZENvbC5Db21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2dldERpc3BsYXlDb2x1bW5WYWx1ZShlbnRpdHksIGRDb2wpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJlbnRpdHlBcnJheURpc3BsYXllZENvbHVtbnNcIj48L21hdC1oZWFkZXItcm93PlxuICAgICAgICAgICAgICAgIDxtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBlbnRpdHlBcnJheURpc3BsYXllZENvbHVtbnNcIj48L21hdC1yb3c+XG4gICAgICAgICAgICA8L21hdC10YWJsZT5cbiAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyYXktZXJyb3JcIiAqbmdJZj1cIm1ldGFkYXRhRW50aXR5QXJyYXkucmVxdWlyZWQoZW50aXR5KSAmJiAhZW50aXR5QXJyYXlEYXRhU291cmNlLmRhdGEubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YUVudGl0eUFycmF5Lm1pc3NpbmdFcnJvck1lc3NhZ2V9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLSBoYXMgbWFueSAtLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiBjbGFzcz1cImhhc01hbnlcIiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuSEFTX01BTllcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwidGl0bGVcIj57e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGl0bGV9fTwvaDI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiY29sLWxnLTggY29sLW1kLTYgY29sLXNtLTEyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuc2VhcmNoTGFiZWx9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCAoa2V5dXApPVwiYXBwbHlIYXNNYW55RmlsdGVyKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJtZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtbGctMl09XCJoYXNNYW55QWxsb3dDcmVhdGVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtbGctNF09XCIhaGFzTWFueUFsbG93Q3JlYXRlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuY29sLW1kLTNdPVwiaGFzTWFueUFsbG93Q3JlYXRlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuY29sLW1kLTZdPVwiIWhhc01hbnlBbGxvd0NyZWF0ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1zbS02XT1cImhhc01hbnlBbGxvd0NyZWF0ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1zbS0xMl09XCIhaGFzTWFueUFsbG93Q3JlYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFjdGlvbnMtYnV0dG9uXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAge3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9uc0xhYmVsfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJtZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93SnNvbkltcG9ydFwiIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaGFzTWFueVRhYmxlQWN0aW9uRGlzYWJsZWQoaGFzTWFueUltcG9ydEFjdGlvbilcIiAoY2xpY2spPVwicnVuSGFzTWFueVRhYmxlQWN0aW9uKGhhc01hbnlJbXBvcnRBY3Rpb24pXCIgbWF0LW1lbnUtaXRlbT5cbiAgICAgICAgICAgICAgICAgICAge3toYXNNYW55SW1wb3J0QWN0aW9uLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIG1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zXCIgW2Rpc2FibGVkXT1cImhhc01hbnlUYWJsZUFjdGlvbkRpc2FibGVkKGFjdGlvbilcIiAoY2xpY2spPVwicnVuSGFzTWFueVRhYmxlQWN0aW9uKGFjdGlvbilcIiBtYXQtbWVudS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICB7e2FjdGlvbi5kaXNwbGF5TmFtZX19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1tZW51PlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJoYXNNYW55QWxsb3dDcmVhdGVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtbGctMl09XCJtZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtbGctNF09XCIhbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuY29sLW1kLTNdPVwibWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuY29sLW1kLTZdPVwiIW1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1zbS02XT1cIm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1zbS0xMl09XCIhbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNyZWF0ZS1idXR0b25cIiAoY2xpY2spPVwiY3JlYXRlSGFzTWFueUVudGl0eSgpXCIgbWF0LXJhaXNlZC1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5jcmVhdGVCdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejggZWxldmF0aW9uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJoYXNNYW55RGF0YVNvdXJjZVwiIG1hdFNvcnQ+XG4gICAgICAgICAgICAgICAgPCEtLSBzZWxlY3QgQ29sdW1uIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiJGV2ZW50ID8gU2VsZWN0aW9uVXRpbGl0aWVzLm1hc3RlclRvZ2dsZShoYXNNYW55U2VsZWN0aW9uLCBoYXNNYW55RGF0YVNvdXJjZSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJoYXNNYW55U2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgU2VsZWN0aW9uVXRpbGl0aWVzLmlzQWxsU2VsZWN0ZWQoaGFzTWFueVNlbGVjdGlvbiwgaGFzTWFueURhdGFTb3VyY2UpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJoYXNNYW55U2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIVNlbGVjdGlvblV0aWxpdGllcy5pc0FsbFNlbGVjdGVkKGhhc01hbnlTZWxlY3Rpb24sIGhhc01hbnlEYXRhU291cmNlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZW50aXR5XCIgY2xhc3M9XCJlbmFibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gaGFzTWFueVNlbGVjdGlvbi50b2dnbGUoZW50aXR5KSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImhhc01hbnlTZWxlY3Rpb24uaXNTZWxlY3RlZChlbnRpdHkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRDb2wgb2YgbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5kaXNwbGF5Q29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5kaXNwbGF5TmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ZENvbC5kaXNwbGF5TmFtZX19XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgW2NsYXNzLmVuYWJsZWRdPVwiIWRDb2wuZGlzYWJsZUNsaWNrICYmIChoYXNNYW55QWxsb3dVcGRhdGUoZW50aXR5KSB8fCBoYXNNYW55QWxsb3dSZWFkKGVudGl0eSkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0SGFzTWFueUVudGl0eShlbnRpdHksIGRDb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IGVudGl0eVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkQ29sLkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWNvbHVtbi12YWx1ZSBbZW50aXR5XT1cImVudGl0eVwiIFtDb21wb25lbnRDbGFzc109XCJkQ29sLkNvbXBvbmVudFwiPjwvZGlzcGxheS1jb2x1bW4tdmFsdWU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZENvbC5Db21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2dldERpc3BsYXlDb2x1bW5WYWx1ZShlbnRpdHksIGRDb2wpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRIYXNNYW55Q29sdW1uc1wiPjwvbWF0LWhlYWRlci1yb3c+XG4gICAgICAgICAgICAgICAgPG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZEhhc01hbnlDb2x1bW5zXCI+PC9tYXQtcm93PlxuICAgICAgICAgICAgPC9tYXQtdGFibGU+XG5cbiAgICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImhhc01hbnlJc0xvYWRpbmcgJiYgbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5kaXNwbGF5TG9hZGluZ1NwaW5uZXJcIj5cbiAgICAgICAgICAgIDwvbWF0LXNwaW5uZXI+XG5cbiAgICAgICAgICAgIDxtYXQtcGFnaW5hdG9yIFtsZW5ndGhdPVwiaGFzTWFueURhdGFTb3VyY2UuZmlsdGVyZWREYXRhLmxlbmd0aFwiIFtwYWdlSW5kZXhdPVwiMFwiIFtwYWdlU2l6ZV09XCIxMFwiIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzUsIDEwLCAyNSwgNTBdXCI+PC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5FUlJPUjogVGhlIHR5cGUge3t0eXBlfX0gaXMgbm90IGtub3duLjwvZGl2PlxuPC9kaXY+XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLUFkZCBBcnJheSBJdGVtIERpYWxvZy0tLS0tLS0tLS0tLS0tLS0+XG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjxuZy10ZW1wbGF0ZSAjYWRkQXJyYXlJdGVtRGlhbG9nPlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtZGlhbG9nLXRpdGxlXCI+XG4gICAgICAgIDxkaXY+e3thZGRBcnJheUl0ZW1EaWFsb2dEYXRhLnRpdGxlfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxmb3JtPlxuICAgICAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJhcnJheUl0ZW1EaWFsb2dUYWJzLmxlbmd0aCA+IDFcIiBwcmVzZXJ2ZUNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPG1hdC10YWIgKm5nRm9yPVwibGV0IHRhYiBvZiBhcnJheUl0ZW1EaWFsb2dUYWJzXCIgW2xhYmVsXT1cInRhYi50YWJOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYi5yb3dzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdy5rZXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cImFycmF5SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdsZycpfX0gY29sLW1kLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnbWQnKX19IGNvbC1zbS17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tJc0FycmF5SXRlbVZhbGlkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtbWF0LWVudGl0eS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgIFxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFycmF5SXRlbURpYWxvZ1RhYnMubGVuZ3RoIDw9IDFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBhcnJheUl0ZW1EaWFsb2dUYWJzWzBdLnJvd3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdy5rZXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiYXJyYXlJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWxnLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdzbScpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tJc0FycmF5SXRlbVZhbGlkKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgXG4gICAgICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiYWRkQXJyYXlJdGVtKClcIiBbZGlzYWJsZWRdPVwiIWlzQXJyYXlJdGVtVmFsaWRcIj5cbiAgICAgICAgICAgICAgICB7e2FkZEFycmF5SXRlbURpYWxvZ0RhdGEuY3JlYXRlQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiY2xvc2VBZGRBcnJheUl0ZW1EaWFsb2coKVwiIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgIHt7YWRkQXJyYXlJdGVtRGlhbG9nRGF0YS5jYW5jZWxCdXR0b25MYWJlbH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPC9mb3JtPlxuXG48L25nLXRlbXBsYXRlPlxuXG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS1FZGl0IEFycmF5IEl0ZW0gRGlhbG9nLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPG5nLXRlbXBsYXRlICNlZGl0QXJyYXlJdGVtRGlhbG9nPlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtZGlhbG9nLXRpdGxlXCI+XG4gICAgICAgIDxkaXY+e3tlZGl0QXJyYXlJdGVtRGlhbG9nRGF0YS50aXRsZShhcnJheUl0ZW1QcmlvckNoYW5nZXMpfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8Zm9ybT5cbiAgICAgICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwiYXJyYXlJdGVtRGlhbG9nVGFicy5sZW5ndGggPiAxXCIgcHJlc2VydmVDb250ZW50PlxuICAgICAgICAgICAgICAgIDxtYXQtdGFiICpuZ0Zvcj1cImxldCB0YWIgb2YgYXJyYXlJdGVtRGlhbG9nVGFic1wiIFtsYWJlbF09XCJ0YWIudGFiTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiB0YWIucm93c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJhcnJheUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdsZycpfX0gY29sLW1kLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnbWQnKX19IGNvbC1zbS17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tBcnJheUl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaXNQcm9wZXJ0eVJlYWRPbmx5KGFycmF5SXRlbSwga2V5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgICAgIFxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFycmF5SXRlbURpYWxvZ1RhYnMubGVuZ3RoIDw9IDFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBhcnJheUl0ZW1EaWFsb2dUYWJzWzBdLnJvd3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdy5rZXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiYXJyYXlJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yRWRpdF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWxnLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdzbScpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tBcnJheUl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpc1Byb3BlcnR5UmVhZE9ubHkoYXJyYXlJdGVtLCBrZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICBcbiAgICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJzYXZlQXJyYXlJdGVtKClcIiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiaW50ZXJuYWxJc1JlYWRPbmx5IHx8ICFpc0FycmF5SXRlbVZhbGlkIHx8ICFpc0FycmF5SXRlbURpcnR5XCI+XG4gICAgICAgICAgICAgICAge3tlZGl0QXJyYXlJdGVtRGlhbG9nRGF0YS5jb25maXJtQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiY2xvc2VFZGl0QXJyYXlJdGVtRGlhbG9nKClcIiBjbGFzcz1cImNhbmNlbC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICB7e2VkaXRBcnJheUl0ZW1EaWFsb2dEYXRhLmNhbmNlbEJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS1DcmVhdGUgSGFzIE1hbnkgRGlhbG9nLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPG5nLXRlbXBsYXRlICNjcmVhdGVIYXNNYW55RGlhbG9nPlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtZGlhbG9nLXRpdGxlXCI+XG4gICAgICAgIDxkaXY+e3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmNyZWF0ZURpYWxvZ0RhdGEudGl0bGV9fTwvZGl2PlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxmb3JtPlxuICAgICAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJoYXNNYW55Q3JlYXRlVGFicy5sZW5ndGggPiAxXCIgcHJlc2VydmVDb250ZW50PlxuICAgICAgICAgICAgICAgIDxtYXQtdGFiICpuZ0Zvcj1cImxldCB0YWIgb2YgaGFzTWFueUNyZWF0ZVRhYnNcIiBbbGFiZWxdPVwidGFiLnRhYk5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2YgdGFiLnJvd3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBrZXkgb2Ygcm93LmtleXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiaGFzTWFueUVudGl0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWxnLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGhhc01hbnlFbnRpdHksIGtleSwgJ2xnJyl9fSBjb2wtbWQte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoaGFzTWFueUVudGl0eSwga2V5LCAnbWQnKX19IGNvbC1zbS17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChoYXNNYW55RW50aXR5LCBrZXksICdzbScpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImNoZWNrSXNIYXNNYW55RW50aXR5VmFsaWQoJ2NyZWF0ZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgICAgXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzTWFueUNyZWF0ZVRhYnMubGVuZ3RoIDw9IDFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBoYXNNYW55Q3JlYXRlVGFic1swXS5yb3dzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cImhhc01hbnlFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JDcmVhdGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1sZy17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChoYXNNYW55RW50aXR5LCBrZXksICdsZycpfX0gY29sLW1kLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGhhc01hbnlFbnRpdHksIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoaGFzTWFueUVudGl0eSwga2V5LCAnc20nKX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImNoZWNrSXNIYXNNYW55RW50aXR5VmFsaWQoJ2NyZWF0ZScpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICBcbiAgICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJkaWFsb2dDcmVhdGVIYXNNYW55KClcIiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiIWlzSGFzTWFueUVudGl0eVZhbGlkXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmNyZWF0ZURpYWxvZ0RhdGEuY3JlYXRlQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiZGlhbG9nQ2FuY2VsQ3JlYXRlSGFzTWFueSgpXCIgY2xhc3M9XCJjYW5jZWwtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmNyZWF0ZURpYWxvZ0RhdGEuY2FuY2VsQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvZm9ybT5cbiAgICBcbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZWRpdEhhc01hbnlEaWFsb2c+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1kaWFsb2ctdGl0bGVcIj5cbiAgICAgICAgPGRpdj57e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEudGl0bGUoaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyl9fTwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuYWN0aW9ucy5sZW5ndGhcIiB0eXBlPVwiYnV0dG9uXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICB7e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuYWN0aW9uc0xhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS5hY3Rpb25zXCIgW2Rpc2FibGVkXT1cImhhc01hbnlFZGl0QWN0aW9uRGlzYWJsZWQoYWN0aW9uKVwiIChjbGljayk9XCJoYXNNYW55UnVuRWRpdEFjdGlvbihhY3Rpb24pXCIgbWF0LW1lbnUtaXRlbT5cbiAgICAgICAgICAgICAgICAgICAge3thY3Rpb24uZGlzcGxheU5hbWV9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImhhc01hbnlBbGxvd0RlbGV0ZShoYXNNYW55RW50aXR5KVwiIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJkZWxldGVIYXNNYW55RW50aXR5KClcIiBjb2xvcj1cIndhcm5cIiBjbGFzcz1cImRlbGV0ZS1idXR0b25cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmVkaXREYXRhLmRlbGV0ZUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8Zm9ybT5cbiAgICAgICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwiaGFzTWFueVVwZGF0ZVRhYnMubGVuZ3RoID4gMVwiIHByZXNlcnZlQ29udGVudD5cbiAgICAgICAgICAgICAgICA8bWF0LXRhYiAqbmdGb3I9XCJsZXQgdGFiIG9mIGhhc01hbnlVcGRhdGVUYWJzXCIgW2xhYmVsXT1cInRhYi50YWJOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYi5yb3dzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdy5rZXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cImhhc01hbnlFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoaGFzTWFueUVudGl0eSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChoYXNNYW55RW50aXR5LCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGhhc01hbnlFbnRpdHksIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tIYXNNYW55RW50aXR5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImlzUHJvcGVydHlSZWFkT25seShoYXNNYW55RW50aXR5LCBrZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgICAgXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzTWFueVVwZGF0ZVRhYnMubGVuZ3RoIDw9IDFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBoYXNNYW55VXBkYXRlVGFic1swXS5yb3dzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cImhhc01hbnlFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JFZGl0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoaGFzTWFueUVudGl0eSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChoYXNNYW55RW50aXR5LCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGhhc01hbnlFbnRpdHksIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJjaGVja0hhc01hbnlFbnRpdHkoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpc1Byb3BlcnR5UmVhZE9ubHkoaGFzTWFueUVudGl0eSwga2V5KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9uZ3gtbWF0LWVudGl0eS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgXG4gICAgICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAoY2xpY2spPVwiZGlhbG9nRWRpdEhhc01hbnkoKVwiIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpbnRlcm5hbElzUmVhZE9ubHkgfHwgIWlzSGFzTWFueUVudGl0eVZhbGlkIHx8ICFpc0hhc01hbnlFbnRpdHlEaXJ0eVwiPlxuICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS5jb25maXJtQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiZGlhbG9nQ2FuY2VsRWRpdEhhc01hbnkoKVwiIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS5jYW5jZWxCdXR0b25MYWJlbH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPC9mb3JtPiAgICBcbjwvbmctdGVtcGxhdGU+Il19
|
|
908
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hdGVyaWFsLWVudGl0eS9zcmMvY29tcG9uZW50cy9pbnB1dC9pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9jb21wb25lbnRzL2lucHV0L2lucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUksT0FBTyxFQUFFLFNBQVMsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQU01RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFv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LEVBQUUsQ0FBQztJQUN0QixDQUFDO3VHQTUzQlEsMEJBQTBCLG9HQTBKdkIsZ0NBQWdDOzJGQTFKbkMsMEJBQTBCLDJtQkFvR3hCLFlBQVksOEVBVVosT0FBTyw4V0M5SnRCLHlrd0NBcXpCYyxvZ1lEcndCRCwwQkFBMEI7OzJGQUExQiwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0ksc0JBQXNCOzswQkE4SjNCLE1BQU07MkJBQUMsZ0NBQWdDO3FFQXBKNUMsTUFBTTtzQkFETCxLQUFLO2dCQVFOLFdBQVc7c0JBRFYsS0FBSztnQkFRTix5QkFBeUI7c0JBRHhCLEtBQUs7Z0JBV04saUJBQWlCO3NCQURoQixLQUFLO2dCQVVOLGVBQWU7c0JBRGQsS0FBSztnQkFVTixVQUFVO3NCQURULEtBQUs7Z0JBVU4sVUFBVTtzQkFEVCxLQUFLO2dCQUtOLGdCQUFnQjtzQkFEZixNQUFNO2dCQUlQLGtCQUFrQjtzQkFEakIsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBSy9CLG1CQUFtQjtzQkFEbEIsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBaUNILGdCQUFnQjtzQkFBNUMsU0FBUzt1QkFBQyxZQUFZO2dCQVVDLFdBQVc7c0JBQWxDLFNBQVM7dUJBQUMsT0FBTztnQkFNbEIsYUFBYTtzQkFEWixTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBUXJDLG1CQUFtQjtzQkFEbEIsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBSWhDLGlCQUFpQjtzQkFEaEIsU0FBUzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbnZpcm9ubWVudEluamVjdG9yLCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nTW9kZWwgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wYWdpbmF0b3InO1xuaW1wb3J0IHsgTWF0U29ydCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCYXNlRW50aXR5VHlwZSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7IEVkaXRBcnJheUl0ZW1EaWFsb2dEYXRhSW50ZXJuYWwsIEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2FycmF5L2FycmF5LWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERlY29yYXRvclR5cGVzIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9iYXNlL2RlY29yYXRvci10eXBlcy5lbnVtJztcbmltcG9ydCB7IERyb3Bkb3duVmFsdWUgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2Jhc2UvZHJvcGRvd24tdmFsdWUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL2Jhc2UvcHJvcGVydHktZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgSGFzTWFueURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9oYXMtbWFueS9oYXMtbWFueS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL29iamVjdC9vYmplY3QtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgUmVmZXJlbmNlc09uZURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9yZWZlcmVuY2VzLW9uZS9yZWZlcmVuY2VzLW9uZS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBMb2Rhc2hVdGlsaXRpZXMgfSBmcm9tICcuLi8uLi9lbmNhcHN1bGF0aW9uL2xvZGFzaC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgUmVmbGVjdFV0aWxpdGllcyB9IGZyb20gJy4uLy4uL2VuY2Fwc3VsYXRpb24vcmVmbGVjdC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgVVVJRFV0aWxpdGllcyB9IGZyb20gJy4uLy4uL2VuY2Fwc3VsYXRpb24vdXVpZC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgZGVmYXVsdEZhbHNlIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zL2RlZmF1bHQtZmFsc2UuZnVuY3Rpb24nO1xuaW1wb3J0IHsgTkdYX0dFVF9WQUxJREFUSU9OX0VSUk9SX01FU1NBR0UgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZ2V0LXZhbGlkYXRpb24tZXJyb3ItbWVzc2FnZS5mdW5jdGlvbic7XG5pbXBvcnQgeyBFbnRpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZW50aXR5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZVV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9kYXRlLnV0aWxpdGllcyc7XG5pbXBvcnQgeyBFbnRpdHlUYWIsIEVudGl0eVV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzJztcbmltcG9ydCB7IFNlbGVjdGlvblV0aWxpdGllcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zZWxlY3Rpb24udXRpbGl0aWVzJztcbmltcG9ydCB7IFZhbGlkYXRpb25VdGlsaXRpZXMgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvdmFsaWRhdGlvbi51dGlsaXRpZXMnO1xuaW1wb3J0IHsgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyLCBDb25maXJtRGlhbG9nRGF0YUludGVybmFsIH0gZnJvbSAnLi4vY29uZmlybS1kaWFsb2cvY29uZmlybS1kaWFsb2ctZGF0YS5idWlsZGVyJztcbmltcG9ydCB7IE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9jb25maXJtLWRpYWxvZy9jb25maXJtLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3JlYXRlRGlhbG9nRGF0YUJ1aWxkZXIsIENyZWF0ZURpYWxvZ0RhdGFJbnRlcm5hbCB9IGZyb20gJy4uL3RhYmxlL2NyZWF0ZS1kaWFsb2cvY3JlYXRlLWRpYWxvZy1kYXRhLmJ1aWxkZXInO1xuaW1wb3J0IHsgRWRpdEFjdGlvbkludGVybmFsIH0gZnJvbSAnLi4vdGFibGUvZWRpdC1kaWFsb2cvZWRpdC1kYXRhLmJ1aWxkZXInO1xuaW1wb3J0IHsgRGlzcGxheUNvbHVtbiB9IGZyb20gJy4uL3RhYmxlL3RhYmxlLWRhdGEnO1xuaW1wb3J0IHsgQmFzZVRhYmxlQWN0aW9uSW50ZXJuYWwsIFRhYmxlQWN0aW9uSW50ZXJuYWwgfSBmcm9tICcuLi90YWJsZS90YWJsZS1kYXRhLmJ1aWxkZXInO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGlucHV0IGNvbXBvbmVudC4gSXQgZ2V0cyB0aGUgbWV0YWRhdGEgb2YgdGhlIHByb3BlcnR5IGZyb20gdGhlIGdpdmVuIEBJbnB1dCBcImVudGl0eVwiIGFuZCBASW5wdXQgXCJwcm9wZXJ0eUtleVwiXG4gKiBhbmQgZGlzcGxheXMgdGhlIGlucHV0IGZpZWxkIGFjY29yZGluZ2x5LlxuICpcbiAqIFlvdSBjYW4gYWxzbyBkZWZpbmUgYSBtZXRob2QgdGhhdCBnZW5lcmF0ZXMgZXJyb3ItbWVzc2FnZXMgYW5kIGlmIHRoZSBpbnB1dCBzaG91bGQgYmUgaGlkZGVuIHdoZW4gaXRzIG1ldGFkYXRhIHNheXNcbiAqIHRoYXQgaXQgc2hvdWxkIGJlIG9taXR0ZWQgZm9yIGNyZWF0aW5nIG9yIHVwZGF0aW5nLlxuICogVGhlIGxhc3QgcGFydCBiZWluZyBtb3N0bHkgcmVsZXZhbnQgaWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgY29tcG9uZW50IGluc2lkZSBhbiBuZ0Zvci5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduZ3gtbWF0LWVudGl0eS1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2lucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbnB1dC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5neE1hdEVudGl0eUlucHV0Q29tcG9uZW50PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4gaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbnRpdHkgb24gd2hpY2ggdGhlIHByb3BlcnR5IGV4aXN0cy4gVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBcInByb3BlcnR5S2V5XCJcbiAgICAgKiB0byBkZXRlcm1pbmUgdGhlIHByb3BlcnR5IGZvciB3aGljaCB0aGUgaW5wdXQgc2hvdWxkIGJlIGdlbmVyYXRlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGVudGl0eT86IEVudGl0eVR5cGU7XG4gICAgaW50ZXJuYWxFbnRpdHkhOiBFbnRpdHlUeXBlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdlbmVyYXRlIHRoZSBpbnB1dCBmb3IuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgXCJlbnRpdHlcIi5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHByb3BlcnR5S2V5Pzoga2V5b2YgRW50aXR5VHlwZTtcbiAgICBpbnRlcm5hbFByb3BlcnR5S2V5IToga2V5b2YgRW50aXR5VHlwZTtcblxuICAgIC8qKlxuICAgICAqIChvcHRpb25hbCkgQSBjdXN0b20gZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIGVycm9yLW1lc3NhZ2UgZm9yIGludmFsaWQgaW5wdXRzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZT86IChtb2RlbDogTmdNb2RlbCkgPT4gc3RyaW5nO1xuICAgIGludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZSE6IChtb2RlbDogTmdNb2RlbCkgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBoaWRlIGEgdmFsdWUgaWYgaXQgaXMgb21pdHRlZCBmb3IgY3JlYXRpb24uXG4gICAgICogSXMgdXNlZCBpbnRlcm5hbGx5IGZvciB0aGUgb2JqZWN0IHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGhpZGVPbWl0Rm9yQ3JlYXRlPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gaGlkZSBhIHZhbHVlIGlmIGl0IGlzIG9taXR0ZWQgZm9yIGVkaXRpbmcuXG4gICAgICogSXMgdXNlZCBpbnRlcm5hbGx5IGZvciB0aGUgb2JqZWN0IHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGhpZGVPbWl0Rm9yRWRpdD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCBhbiBlbXB0eSB2YWx1ZSBzaG91bGQgYmUgdmFsaWQuXG4gICAgICogSXMgdXNlZCBpbnRlcm5hbGx5IGZvciB0aGUgb2JqZWN0IHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgdW5kZWZpbmVkXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICB2YWxpZEVtcHR5PzogYm9vbGVhbjsgLy8gVE9ET1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgdGhlIGlucHV0IHNob3VsZCBiZSByZWFkb25seS5cbiAgICAgKiBJbiB0aGF0IGNhc2UgaXQgaXMgZGlzYWJsZWQsIGJ1dCBtb3N0IG9mIHRoZSBkZWZhdWx0IHN0eWxpbmcgaXMgb3ZlcndyaXR0ZW4uXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgaXNSZWFkT25seT86IGJvb2xlYW47XG4gICAgaW50ZXJuYWxJc1JlYWRPbmx5ITogYm9vbGVhbjtcblxuICAgIEBPdXRwdXQoKVxuICAgIGlucHV0Q2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIEBWaWV3Q2hpbGQoJ2FkZEFycmF5SXRlbURpYWxvZycpXG4gICAgYWRkQXJyYXlJdGVtRGlhbG9nITogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gICAgYWRkQXJyYXlJdGVtRGlhbG9nUmVmITogTWF0RGlhbG9nUmVmPHVua25vd24+O1xuXG4gICAgQFZpZXdDaGlsZCgnZWRpdEFycmF5SXRlbURpYWxvZycpXG4gICAgZWRpdEFycmF5SXRlbURpYWxvZyE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIGVkaXRBcnJheUl0ZW1EaWFsb2dSZWYhOiBNYXREaWFsb2dSZWY8dW5rbm93bj47XG5cbiAgICB0eXBlITogRGVjb3JhdG9yVHlwZXM7XG4gICAgbWV0YWRhdGEhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+O1xuXG4gICAgbWV0YWRhdGFEZWZhdWx0T2JqZWN0ITogRGVmYXVsdE9iamVjdERlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgIG9iamVjdFByb3BlcnR5ITogRW50aXR5VHlwZTtcbiAgICBvYmplY3RQcm9wZXJ0eVRhYnMhOiBFbnRpdHlUYWI8RW50aXR5VHlwZT5bXTtcblxuICAgIG1ldGFkYXRhRW50aXR5QXJyYXkhOiBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgIGVudGl0eUFycmF5VmFsdWVzITogRW50aXR5VHlwZVtdO1xuICAgIGFycmF5SXRlbSE6IEVudGl0eVR5cGU7XG4gICAgYXJyYXlJdGVtUHJpb3JDaGFuZ2VzITogRW50aXR5VHlwZTtcbiAgICBhcnJheUl0ZW1JbmxpbmVUYWJzITogRW50aXR5VGFiPEVudGl0eVR5cGU+W107XG4gICAgZW50aXR5QXJyYXlEYXRhU291cmNlITogTWF0VGFibGVEYXRhU291cmNlPEVudGl0eVR5cGU+O1xuICAgIGVudGl0eUFycmF5U2VsZWN0aW9uOiBTZWxlY3Rpb25Nb2RlbDxFbnRpdHlUeXBlPiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxFbnRpdHlUeXBlPih0cnVlLCBbXSk7XG4gICAgZW50aXR5QXJyYXlEaXNwbGF5ZWRDb2x1bW5zITogc3RyaW5nW107XG4gICAgaXNBcnJheUl0ZW1WYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGlzQXJyYXlJdGVtRGlydHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBpbmRleE9mRWRpdGVkQXJyYXlJdGVtITogbnVtYmVyO1xuICAgIGFkZEFycmF5SXRlbURpYWxvZ0RhdGEhOiBDcmVhdGVEaWFsb2dEYXRhSW50ZXJuYWw7XG4gICAgYXJyYXlJdGVtRGlhbG9nVGFicyE6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdO1xuICAgIGVkaXRBcnJheUl0ZW1EaWFsb2dEYXRhITogRWRpdEFycmF5SXRlbURpYWxvZ0RhdGFJbnRlcm5hbDxFbnRpdHlUeXBlPjtcblxuICAgIG1ldGFkYXRhSGFzTWFueSE6IEhhc01hbnlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlLCBFbnRpdHlUeXBlPjtcbiAgICBoYXNNYW55SXNMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBBIHNldHRlciBmb3IgdGhlIGhhcyBtYW55IHBhZ2luYXRvci5cbiAgICAgKiBJcyBuZWVkZWQgYmVjYXVzZSB0aGUgcGFnaW5hdG9yIGlzIGluc2lkZSBhIHN3aXRjaCBjYXNlLFxuICAgICAqIHdoaWNoIG1lYW5zIHRoYXQgYXQgbmdPbkluaXQgaXQgY2FuJ3QgYmUgaW5pdGlhbGl6ZWQuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChNYXRQYWdpbmF0b3IpIHNldCBoYXNNYW55UGFnaW5hdG9yKHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNNYW55RGF0YVNvdXJjZS5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueURhdGFTb3VyY2UucGFnaW5hdG9yID0gcGFnaW5hdG9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEEgc2V0dGVyIGZvciB0aGUgaGFzIG1hbnkgc29ydC5cbiAgICAgKiBJcyBuZWVkZWQgYmVjYXVzZSB0aGUgc29ydCBpcyBpbnNpZGUgYSBzd2l0Y2ggY2FzZSxcbiAgICAgKiB3aGljaCBtZWFucyB0aGF0IGF0IG5nT25Jbml0IGl0IGNhbid0IGJlIGluaXRpYWxpemVkLlxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoTWF0U29ydCkgc2V0IGhhc01hbnlTb3J0KHNvcnQ6IE1hdFNvcnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc01hbnlEYXRhU291cmNlLnNvcnQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueURhdGFTb3VyY2Uuc29ydCA9IHNvcnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQFZpZXdDaGlsZCgnZmlsdGVyJywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBoYXNNYW55RmlsdGVyITogc3RyaW5nO1xuICAgIGRpc3BsYXllZEhhc01hbnlDb2x1bW5zITogc3RyaW5nW107XG4gICAgaGFzTWFueURhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxFbnRpdHlUeXBlPiA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKTtcbiAgICBoYXNNYW55U2VsZWN0aW9uOiBTZWxlY3Rpb25Nb2RlbDxFbnRpdHlUeXBlPiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxFbnRpdHlUeXBlPih0cnVlLCBbXSk7XG4gICAgaGFzTWFueUltcG9ydEFjdGlvbiE6IEJhc2VUYWJsZUFjdGlvbkludGVybmFsO1xuICAgIHByaXZhdGUgaGFzTWFueUVudGl0eVNlcnZpY2UhOiBFbnRpdHlTZXJ2aWNlPEVudGl0eVR5cGU+O1xuICAgIEBWaWV3Q2hpbGQoJ2NyZWF0ZUhhc01hbnlEaWFsb2cnKVxuICAgIGNyZWF0ZUhhc01hbnlEaWFsb2chOiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgICBjcmVhdGVIYXNNYW55RGlhbG9nUmVmITogTWF0RGlhbG9nUmVmPHVua25vd24+O1xuICAgIEBWaWV3Q2hpbGQoJ2VkaXRIYXNNYW55RGlhbG9nJylcbiAgICBlZGl0SGFzTWFueURpYWxvZyE6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIGVkaXRIYXNNYW55RGlhbG9nUmVmITogTWF0RGlhbG9nUmVmPHVua25vd24+O1xuICAgIGhhc01hbnlFbnRpdHkhOiBFbnRpdHlUeXBlO1xuICAgIGhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMhOiBFbnRpdHlUeXBlO1xuICAgIGlzSGFzTWFueUVudGl0eVZhbGlkOiBib29sZWFuID0gZmFsc2U7XG4gICAgaXNIYXNNYW55RW50aXR5RGlydHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBoYXNNYW55QWxsb3dDcmVhdGUhOiBib29sZWFuO1xuICAgIGhhc01hbnlDcmVhdGVUYWJzITogRW50aXR5VGFiPEVudGl0eVR5cGU+W107XG4gICAgaGFzTWFueVVwZGF0ZVRhYnMhOiBFbnRpdHlUYWI8RW50aXR5VHlwZT5bXTtcbiAgICBwcml2YXRlIGhhc01hbnlDcmVhdGVCYXNlVXJsITogc3RyaW5nO1xuXG4gICAgbWV0YWRhdGFSZWZlcmVuY2VzT25lITogUmVmZXJlbmNlc09uZURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuICAgIHJlZmVyZW5jZXNPbmVPYmplY3QhOiBFbnRpdHlUeXBlO1xuICAgIHJlZmVyZW5jZXNPbmVQcm9wZXJ0eVRhYnMhOiBFbnRpdHlUYWI8RW50aXR5VHlwZT5bXTtcbiAgICByZWZlcmVuY2VzT25lQWxsUmVmZXJlbmNlZEVudGl0aWVzITogRW50aXR5VHlwZVtdO1xuICAgIHJlZmVyZW5jZXNPbmVEcm9wZG93blZhbHVlcyE6IERyb3Bkb3duVmFsdWU8c3RyaW5nPltdO1xuXG4gICAgcmVhZG9ubHkgRGVjb3JhdG9yVHlwZXM6IHR5cGVvZiBEZWNvcmF0b3JUeXBlcyA9IERlY29yYXRvclR5cGVzO1xuXG4gICAgRW50aXR5VXRpbGl0aWVzOiB0eXBlb2YgRW50aXR5VXRpbGl0aWVzID0gRW50aXR5VXRpbGl0aWVzO1xuICAgIERhdGVVdGlsaXRpZXM6IHR5cGVvZiBEYXRlVXRpbGl0aWVzID0gRGF0ZVV0aWxpdGllcztcbiAgICBTZWxlY3Rpb25VdGlsaXRpZXM6IHR5cGVvZiBTZWxlY3Rpb25VdGlsaXRpZXMgPSBTZWxlY3Rpb25VdGlsaXRpZXM7XG4gICAgcmVmZXJlbmNlc09uZVVVSUQ6IHN0cmluZyA9IFVVSURVdGlsaXRpZXMuY3JlYXRlKCk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgQEluamVjdChOR1hfR0VUX1ZBTElEQVRJT05fRVJST1JfTUVTU0FHRSlcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlZmF1bHRHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlOiAobW9kZWw6IE5nTW9kZWwpID0+IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50XG4gICAgKSB7fVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBpbnB1dCB3aXRoIHRoZSBnaXZlbiBrZXkgb24gdGhlIGdpdmVuIHByb3BlcnR5IGlzIHJlYWRvbmx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG9uIHdoaWNoIHRvIGNoZWNrIHRoZSBpbnB1dC5cbiAgICAgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSBmb3IgdGhlIGlucHV0IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBpbnB1dCBpcyByZWFkb25seS5cbiAgICAgKi9cbiAgICBpc1Byb3BlcnR5UmVhZE9ubHkocHJvcGVydHk6IEVudGl0eVR5cGUsIGtleToga2V5b2YgRW50aXR5VHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxJc1JlYWRPbmx5IHx8IHRoaXMubWV0YWRhdGFEZWZhdWx0T2JqZWN0Py5pc1JlYWRPbmx5KHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gPSBFbnRpdHlVdGlsaXRpZXMuZ2V0UHJvcGVydHlNZXRhZGF0YShwcm9wZXJ0eSwga2V5KTtcbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5pc1JlYWRPbmx5KHByb3BlcnR5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBpbnB1dHMgdG8gd29yayBpbnNpZGUgYW4gbmdGb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgaW4gdGhlIG5nRm9yLlxuICAgICAqIEByZXR1cm5zIFRoZSBpbmRleC5cbiAgICAgKi9cbiAgICB0cmFja0J5Rm4oaW5kZXg6IHVua25vd24pOiB1bmtub3duIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIHRvIGRpc3BsYXkgaW4gdGhlIGNvbHVtbi5cbiAgICAgKiBSdW5zIGluIGVudmlyb25tZW50IGNvbnRleHQgdG8gZW5hYmxlIGluamVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGdldCB0aGUgdmFsdWUgZnJvbS5cbiAgICAgKiBAcGFyYW0gZGlzcGxheUNvbHVtbiAtIFRoZSBkaXNwbGF5IGNvbHVtbiB0byBnZXQgdGhlIHZhbHVlIGZyb20uXG4gICAgICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBkaXNwbGF5IGNvbHVtbi5cbiAgICAgKi9cbiAgICBnZXREaXNwbGF5Q29sdW1uVmFsdWUoZW50aXR5OiBFbnRpdHlUeXBlLCBkaXNwbGF5Q29sdW1uOiBEaXNwbGF5Q29sdW1uPEVudGl0eVR5cGU+KTogdW5rbm93biB7XG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdG9yLnJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZGlzcGxheUNvbHVtbi52YWx1ZShlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmVudGl0eSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIElucHV0IGRhdGEgXCJlbnRpdHlcIicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW50ZXJuYWxFbnRpdHkgPSB0aGlzLmVudGl0eTtcblxuICAgICAgICBpZiAodGhpcy5wcm9wZXJ0eUtleSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgSW5wdXQgZGF0YSBcInByb3BlcnR5S2V5XCInKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludGVybmFsUHJvcGVydHlLZXkgPSB0aGlzLnByb3BlcnR5S2V5O1xuXG4gICAgICAgIHRoaXMuaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlID0gdGhpcy5nZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlID8/IHRoaXMuZGVmYXVsdEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2U7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxJc1JlYWRPbmx5ID0gdGhpcy5pc1JlYWRPbmx5ID8/IGZhbHNlO1xuXG4gICAgICAgIHRoaXMudHlwZSA9IEVudGl0eVV0aWxpdGllcy5nZXRQcm9wZXJ0eVR5cGUodGhpcy5pbnRlcm5hbEVudGl0eSwgdGhpcy5pbnRlcm5hbFByb3BlcnR5S2V5KTtcbiAgICAgICAgaWYgKHRoaXMudmFsaWRFbXB0eSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiA9IFJlZmxlY3RVdGlsaXRpZXMuZ2V0TWV0YWRhdGEoJ21ldGFkYXRhJywgdGhpcy5pbnRlcm5hbEVudGl0eSwgdGhpcy5pbnRlcm5hbFByb3BlcnR5S2V5KSBhcyBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+O1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuZGVmaW5lTWV0YWRhdGEoJ21ldGFkYXRhJywgeyAuLi5jdXJyZW50TWV0YWRhdGEsIHJlcXVpcmVkOiBkZWZhdWx0RmFsc2UgfSwgdGhpcy5pbnRlcm5hbEVudGl0eSwgdGhpcy5pbnRlcm5hbFByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1ldGFkYXRhID0gRW50aXR5VXRpbGl0aWVzLmdldFByb3BlcnR5TWV0YWRhdGEodGhpcy5pbnRlcm5hbEVudGl0eSwgdGhpcy5pbnRlcm5hbFByb3BlcnR5S2V5LCB0aGlzLnR5cGUpO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLk9CSkVDVDpcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRPYmplY3RJbnB1dCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWTpcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRFbnRpdHlBcnJheSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5IQVNfTUFOWTpcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRIYXNNYW55KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLlJFRkVSRU5DRVNfT05FOlxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFJlZmVyZW5jZXNPbmUoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRSZWZlcmVuY2VzT25lKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1ldGFkYXRhUmVmZXJlbmNlc09uZSA9IHRoaXMubWV0YWRhdGEgYXMgUmVmZXJlbmNlc09uZURlY29yYXRvckNvbmZpZ0ludGVybmFsPEVudGl0eVR5cGU+O1xuXG4gICAgICAgIHZvaWQgdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VzT25lQWxsUmVmZXJlbmNlZEVudGl0aWVzID0gYXdhaXQgdGhpcy5tZXRhZGF0YVJlZmVyZW5jZXNPbmUuZ2V0UmVmZXJlbmNlZEVudGl0aWVzKCk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VzT25lRHJvcGRvd25WYWx1ZXMgPSB0aGlzLm1ldGFkYXRhUmVmZXJlbmNlc09uZS5nZXREcm9wZG93blZhbHVlcyhMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMucmVmZXJlbmNlc09uZUFsbFJlZmVyZW5jZWRFbnRpdGllcykpO1xuICAgICAgICAgICAgdGhpcy5zZXRSZWZlcmVuY2VzT25lT2JqZWN0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEhhc01hbnkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWV0YWRhdGFIYXNNYW55ID0gdGhpcy5tZXRhZGF0YSBhcyBIYXNNYW55RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8RW50aXR5VHlwZSwgRW50aXR5VHlwZT47XG4gICAgICAgIHRoaXMuaGFzTWFueUltcG9ydEFjdGlvbiA9IG5ldyBCYXNlVGFibGVBY3Rpb25JbnRlcm5hbCh7XG4gICAgICAgICAgICAuLi50aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuaW1wb3J0QWN0aW9uRGF0YSxcbiAgICAgICAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5zdGFydEltcG9ydEpzb24oKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmluamVjdG9yLnJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlBbGxvd0NyZWF0ZSA9IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5hbGxvd0NyZWF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55RW50aXR5U2VydmljZSA9IGluamVjdDxFbnRpdHlTZXJ2aWNlPEVudGl0eVR5cGU+Pih0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuRW50aXR5U2VydmljZUNsYXNzKTtcbiAgICAgICAgICAgIHRoaXMuaGFzTWFueUNyZWF0ZUJhc2VVcmwgPSB0aGlzLm1ldGFkYXRhSGFzTWFueS5jcmVhdGVCYXNlVXJsKHRoaXMuaW50ZXJuYWxFbnRpdHksIHRoaXMubWV0YWRhdGFIYXNNYW55KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZ2l2ZW5EaXNwbGF5Q29sdW1uczogc3RyaW5nW10gPSB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuZGlzcGxheUNvbHVtbnMubWFwKCh2KSA9PiB2LmRpc3BsYXlOYW1lKTtcbiAgICAgICAgaWYgKHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMuZmlsdGVyKHRBID0+IHRBLnR5cGUgPT09ICdtdWx0aS1zZWxlY3QnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkSGFzTWFueUNvbHVtbnMgPSBbJ3NlbGVjdCddLmNvbmNhdChnaXZlbkRpc3BsYXlDb2x1bW5zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheWVkSGFzTWFueUNvbHVtbnMgPSBnaXZlbkRpc3BsYXlDb2x1bW5zO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYXNNYW55RGF0YVNvdXJjZS5zb3J0aW5nRGF0YUFjY2Vzc29yID0gKGVudGl0eTogRW50aXR5VHlwZSwgaGVhZGVyOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmluamVjdG9yLnJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmRpc3BsYXlDb2x1bW5zLmZpbmQoKGRwKSA9PiBkcC5kaXNwbGF5TmFtZSA9PT0gaGVhZGVyKT8udmFsdWUoZW50aXR5KSBhcyBzdHJpbmc7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYXNNYW55RGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGUgPSAoZW50aXR5OiBFbnRpdHlUeXBlLCBmaWx0ZXI6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoU3RyOiBzdHJpbmcgPSB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuc2VhcmNoU3RyaW5nKGVudGl0eSk7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRTZWFyY2hTdHJpbmc6IHN0cmluZyA9IHNlYXJjaFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRmlsdGVyU3RyaW5nOiBzdHJpbmcgPSBmaWx0ZXIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXR0ZWRTZWFyY2hTdHJpbmcuaW5jbHVkZXMoZm9ybWF0dGVkRmlsdGVyU3RyaW5nKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYXNNYW55RGF0YVNvdXJjZS5maWx0ZXIgPSB0aGlzLmhhc01hbnlGaWx0ZXI7XG5cbiAgICAgICAgdGhpcy5oYXNNYW55RW50aXR5U2VydmljZS5lbnRpdGllc1N1YmplY3Quc3Vic2NyaWJlKChlbnRpdGllcykgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55RGF0YVNvdXJjZS5kYXRhID0gZW50aXRpZXM7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlTZWxlY3Rpb24uY2xlYXIoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5qZWN0b3IucnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWRCYXNlVXJsOiBzdHJpbmcgPSB0aGlzLm1ldGFkYXRhSGFzTWFueS5yZWFkQmFzZVVybCh0aGlzLmludGVybmFsRW50aXR5LCB0aGlzLm1ldGFkYXRhSGFzTWFueSk7XG4gICAgICAgICAgICB2b2lkIHRoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UucmVhZChyZWFkQmFzZVVybCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNNYW55SXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0RW50aXR5QXJyYXkoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheSA9IHRoaXMubWV0YWRhdGEgYXMgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPjtcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxFbnRpdHlbdGhpcy5pbnRlcm5hbFByb3BlcnR5S2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAodGhpcy5pbnRlcm5hbEVudGl0eVt0aGlzLmludGVybmFsUHJvcGVydHlLZXldIGFzIEVudGl0eVR5cGVbXSkgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVudGl0eUFycmF5VmFsdWVzID0gdGhpcy5pbnRlcm5hbEVudGl0eVt0aGlzLmludGVybmFsUHJvcGVydHlLZXldIGFzIEVudGl0eVR5cGVbXTtcbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lICYmICF0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlRGlhbG9nRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZURpYWxvZ0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgdGl0bGU6ICdBZGQnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdpdmVuRGlzcGxheUNvbHVtbnM6IHN0cmluZ1tdID0gdGhpcy5tZXRhZGF0YUVudGl0eUFycmF5LmRpc3BsYXlDb2x1bW5zLm1hcCgodikgPT4gdi5kaXNwbGF5TmFtZSk7XG4gICAgICAgIGlmIChnaXZlbkRpc3BsYXlDb2x1bW5zLmZpbmQocyA9PiBzID09PSAnc2VsZWN0JykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgVGhlIG5hbWUgXCJzZWxlY3RcIiBmb3IgYSBkaXNwbGF5IGNvbHVtbiBpcyByZXNlcnZlZC5cbiAgICAgICAgICAgICAgICBQbGVhc2UgY2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVudGl0eUFycmF5RGlzcGxheWVkQ29sdW1ucyA9IHRoaXMuaW50ZXJuYWxJc1JlYWRPbmx5ID8gZ2l2ZW5EaXNwbGF5Q29sdW1ucyA6IFsnc2VsZWN0J10uY29uY2F0KGdpdmVuRGlzcGxheUNvbHVtbnMpO1xuICAgICAgICB0aGlzLmVudGl0eUFycmF5RGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKTtcbiAgICAgICAgdGhpcy5lbnRpdHlBcnJheURhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZW50aXR5QXJyYXlWYWx1ZXM7XG4gICAgICAgIHRoaXMuYXJyYXlJdGVtID0gbmV3IHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5FbnRpdHlDbGFzcygpO1xuICAgICAgICB0aGlzLmFycmF5SXRlbVByaW9yQ2hhbmdlcyA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5hcnJheUl0ZW0pO1xuICAgICAgICB0aGlzLmFycmF5SXRlbUlubGluZVRhYnMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyh0aGlzLmFycmF5SXRlbSwgdHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5hZGRBcnJheUl0ZW1EaWFsb2dEYXRhID0gbmV3IENyZWF0ZURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5jcmVhdGVEaWFsb2dEYXRhKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCdjcmVhdGVCdXR0b25MYWJlbCcsICdBZGQnKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCd0aXRsZScsICdBZGQgdG8gYXJyYXknKVxuICAgICAgICAgICAgLmdldFJlc3VsdCgpO1xuICAgICAgICB0aGlzLmFycmF5SXRlbURpYWxvZ1RhYnMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyh0aGlzLmFycmF5SXRlbSwgdHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5lZGl0QXJyYXlJdGVtRGlhbG9nRGF0YSA9IHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5lZGl0RGlhbG9nRGF0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRPYmplY3RJbnB1dCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tZXRhZGF0YURlZmF1bHRPYmplY3QgPSB0aGlzLm1ldGFkYXRhIGFzIERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbDxFbnRpdHlUeXBlPjtcbiAgICAgICAgdGhpcy5vYmplY3RQcm9wZXJ0eSA9IHRoaXMuaW50ZXJuYWxFbnRpdHlbdGhpcy5pbnRlcm5hbFByb3BlcnR5S2V5XSBhcyBFbnRpdHlUeXBlO1xuICAgICAgICB0aGlzLm9iamVjdFByb3BlcnR5VGFicyA9IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKFxuICAgICAgICAgICAgdGhpcy5vYmplY3RQcm9wZXJ0eSxcbiAgICAgICAgICAgIHRoaXMuaGlkZU9taXRGb3JDcmVhdGUsXG4gICAgICAgICAgICB0aGlzLmhpZGVPbWl0Rm9yRWRpdCxcbiAgICAgICAgICAgIHRoaXMubWV0YWRhdGFEZWZhdWx0T2JqZWN0Lm9taXRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0SW1wb3J0SnNvbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICBpbnB1dC50eXBlID0gJ2ZpbGUnO1xuICAgICAgICBpbnB1dC5hY2NlcHQgPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgIGlucHV0Lm9uY2hhbmdlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlucHV0LmZpbGVzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbXBvcnRKc29uKGlucHV0LmZpbGVzWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaW5wdXQuY2xpY2soKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGltcG9ydEpzb24oZmlsZTogRmlsZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBkaWFsb2dEYXRhOiBDb25maXJtRGlhbG9nRGF0YUludGVybmFsID0gbmV3IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlcih0aGlzLmhhc01hbnlJbXBvcnRBY3Rpb24uY29uZmlybURpYWxvZ0RhdGEpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RleHQnLCB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuaW1wb3J0QWN0aW9uRGF0YS5jb25maXJtRGlhbG9nRGF0YT8udGV4dCApXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RpdGxlJywgdGhpcy5oYXNNYW55SW1wb3J0QWN0aW9uLmRpc3BsYXlOYW1lKVxuICAgICAgICAgICAgLmdldFJlc3VsdCgpO1xuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCBib29sZWFuPiA9IHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgZGF0YTogZGlhbG9nRGF0YSxcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5oYXNNYW55RW50aXR5U2VydmljZS5pbXBvcnQoZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlZmVyZW5jZXMgb25lIG9iamVjdCB1c2luZyB0aGUgaW5wdXQgaWQuXG4gICAgICovXG4gICAgc2V0UmVmZXJlbmNlc09uZU9iamVjdCgpOiB2b2lkIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgY29uc3QgZm91bmRFbnRpdHk6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQgPSB0aGlzLm1ldGFkYXRhUmVmZXJlbmNlc09uZS5nZXRFbnRpdHlGb3JJZCh0aGlzLmludGVybmFsRW50aXR5W3RoaXMuaW50ZXJuYWxQcm9wZXJ0eUtleV0gYXMgc3RyaW5nLCB0aGlzLnJlZmVyZW5jZXNPbmVBbGxSZWZlcmVuY2VkRW50aXRpZXMpO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZXNPbmVPYmplY3QgPSBuZXcgdGhpcy5tZXRhZGF0YVJlZmVyZW5jZXNPbmUuRW50aXR5Q2xhc3MoZm91bmRFbnRpdHkpO1xuICAgICAgICB0aGlzLnJlZmVyZW5jZXNPbmVQcm9wZXJ0eVRhYnMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyh0aGlzLnJlZmVyZW5jZXNPbmVPYmplY3QpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFZGl0cyBhbiBlbnRpdHkuIFRoaXMgZWl0aGVyIGNhbGxzIHRoZSBlZGl0LU1ldGhvZCBwcm92aWRlZCBieSB0aGUgdXNlciBvciB1c2VzIGEgZGVmYXVsdCBlZGl0LWRpYWxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQuXG4gICAgICogQHBhcmFtIGRDb2wgLSBUaGUgZGlzcGxheSBjb2x1bW4gdGhhdCB3YXMgY2xpY2tlZCBvbi5cbiAgICAgKiBAdGhyb3dzIFdoZW4gbm8gRW50aXR5Q2xhc3Mgd2FzIHByb3ZpZGVkLCBhcyBhIG5ldyBjYWxsIGlzIG5lZWRlZCB0byBpbml0aWFsaXplIG1ldGFkYXRhLlxuICAgICAqL1xuICAgIGVkaXRIYXNNYW55RW50aXR5KGVudGl0eTogRW50aXR5VHlwZSwgZENvbDogRGlzcGxheUNvbHVtbjxFbnRpdHlUeXBlPik6IHZvaWQge1xuICAgICAgICBpZiAoKGRDb2wuZGlzYWJsZUNsaWNrID09PSB0cnVlKSB8fCAoIXRoaXMuaGFzTWFueUFsbG93VXBkYXRlKGVudGl0eSkgJiYgIXRoaXMuaGFzTWFueUFsbG93UmVhZChlbnRpdHkpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLkVudGl0eUNsYXNzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFwiRW50aXR5Q2xhc3NcIiBzcGVjaWZpZWQgZm9yIHRoaXMgdGFibGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmVkaXQpIHtcbiAgICAgICAgICAgIHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5lZGl0KG5ldyB0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuRW50aXR5Q2xhc3MoZW50aXR5KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5kZWZhdWx0RWRpdCA9PSAncGFnZScpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdEhhc01hbnlEZWZhdWx0UGFnZShuZXcgdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLkVudGl0eUNsYXNzKGVudGl0eSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZvaWQgdGhpcy5lZGl0SGFzTWFueURlZmF1bHREaWFsb2cobmV3IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcyhlbnRpdHkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVwZGF0aW5nIHRoZSBwcm92aWRlZCBlbnRpdHkgZnJvbSB0aGUgaGFzIG1hbnkgcHJvcGVydHkgaXMgYWxsb3dlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBBIHNpbmdsZSB2YWx1ZSBvZiB0aGUgaGFzIG1hbnkgcHJvcGVydHkgdGhhdCB0aGUgdXNlciB3YW50cyB0byBlZGl0LlxuICAgICAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgdXNlciBjYW4gZWRpdCB0aGUgcHJvdmlkZWQgZW50aXR5IGFuZCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaGFzTWFueUFsbG93VXBkYXRlKGVudGl0eTogRW50aXR5VHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5hbGxvd1VwZGF0ZShlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHZpZXdpbmcgdGhlIHByb3ZpZGVkIGVudGl0eSBmcm9tIHRoZSBoYXMgbWFueSBwcm9wZXJ0eSBpcyBhbGxvd2VkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEEgc2luZ2xlIHZhbHVlIG9mIHRoZSBoYXMgbWFueSBwcm9wZXJ0eSB0aGF0IHRoZSB1c2VyIHdhbnRzIHRvIHZpZXcuXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSB1c2VyIGNhbiB2aWV3IHRoZSBwcm92aWRlZCBlbnRpdHkgYW5kIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBoYXNNYW55QWxsb3dSZWFkKGVudGl0eTogRW50aXR5VHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5hbGxvd1JlYWQoZW50aXR5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciBkZWxldGluZyB0aGUgcHJvdmlkZWQgZW50aXR5IGZyb20gdGhlIGhhcyBtYW55IHByb3BlcnR5IGlzIGFsbG93ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gQSBzaW5nbGUgdmFsdWUgb2YgdGhlIGhhcyBtYW55IHByb3BlcnR5IHRoYXQgdGhlIHVzZXIgd2FudHMgdG8gZGVsZXRlLlxuICAgICAqIEByZXR1cm5zIFRydWUgd2hlbiB0aGUgdXNlciBjYW4gZGVsZXRlIHRoZSBwcm92aWRlZCBlbnRpdHkgYW5kIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBoYXNNYW55QWxsb3dEZWxldGUoZW50aXR5OiBFbnRpdHlUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdG9yLnJ1bkluQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93RGVsZXRlKGVudGl0eSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBFZGl0QWN0aW9uIGlzIGRpc2FibGVkIChlLmcuIEJlY2F1c2UgdGhlIGN1cnJlbnQgZW50cnkgZG9lc24ndCBmdWxsZmlsIHRoZSByZXF1aXJlbWVudHMpLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdGlvbiAtIFRoZSBFZGl0QWN0aW9uIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBBY3Rpb24gY2FuIGJlIHVzZWQuXG4gICAgICovXG4gICAgaGFzTWFueUVkaXRBY3Rpb25EaXNhYmxlZChhY3Rpb246IEVkaXRBY3Rpb25JbnRlcm5hbDxFbnRpdHlUeXBlPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICFhY3Rpb24uZW5hYmxlZCh0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSdW5zIHRoZSBlZGl0IGFjdGlvbiBvbiB0aGUgZW50aXR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdGlvbiAtIFRoZSBhY3Rpb24gdG8gcnVuLlxuICAgICAqL1xuICAgIGhhc01hbnlSdW5FZGl0QWN0aW9uKGFjdGlvbjogRWRpdEFjdGlvbkludGVybmFsPEVudGl0eVR5cGU+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVDb25maXJtRGlhbG9nOiBib29sZWFuID0gdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5yZXF1aXJlQ29uZmlybURpYWxvZyh0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXJlcXVpcmVDb25maXJtRGlhbG9nKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpcm1IYXNNYW55UnVuRWRpdEFjdGlvbihhY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIGJvb2xlYW4+ID0gdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiBhY3Rpb24uY29uZmlybURpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpcm1IYXNNYW55UnVuRWRpdEFjdGlvbihhY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbmZpcm1IYXNNYW55UnVuRWRpdEFjdGlvbihhY3Rpb246IEVkaXRBY3Rpb25JbnRlcm5hbDxFbnRpdHlUeXBlPik6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMuaW5qZWN0b3IucnVuSW5Db250ZXh0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGFjdGlvbi5hY3Rpb24odGhpcy5oYXNNYW55RW50aXR5LCB0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja0hhc01hbnlFbnRpdHkoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlZGl0SGFzTWFueURlZmF1bHRQYWdlKGVudGl0eTogRW50aXR5VHlwZSk6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnJywgdGhpcy5oYXNNYW55RW50aXR5U2VydmljZS5lZGl0QmFzZVJvdXRlLCBlbnRpdHlbdGhpcy5oYXNNYW55RW50aXR5U2VydmljZS5pZEtleV1dKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGVkaXRIYXNNYW55RGVmYXVsdERpYWxvZyhlbnRpdHk6IEVudGl0eVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5oYXNNYW55RW50aXR5ID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcChlbnRpdHkpO1xuICAgICAgICB0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMuaGFzTWFueUVudGl0eSk7XG4gICAgICAgIHRoaXMuaGFzTWFueVVwZGF0ZVRhYnMgPSBFbnRpdHlVdGlsaXRpZXMuZ2V0RW50aXR5VGFicyh0aGlzLmhhc01hbnlFbnRpdHksIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jaGVja0hhc01hbnlFbnRpdHkoKTtcbiAgICAgICAgdGhpcy5lZGl0SGFzTWFueURpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oXG4gICAgICAgICAgICB0aGlzLmVkaXRIYXNNYW55RGlhbG9nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnNjAlJyxcbiAgICAgICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVzOiBudW1iZXIgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmVkaXRIYXNNYW55RGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkpIGFzIG51bWJlcjtcbiAgICAgICAgaWYgKHJlcyA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YTogRW50aXR5VHlwZVtdID0gdGhpcy5oYXNNYW55RGF0YVNvdXJjZS5kYXRhO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICAgIGRhdGFbdGhpcy5oYXNNYW55RGF0YVNvdXJjZS5kYXRhLmZpbmRJbmRleCgoZSkgPT4gZVt0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmlkS2V5XSA9PT0gZW50aXR5W3RoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UuaWRLZXldKV0gPSBlbnRpdHk7XG4gICAgICAgICAgICB0aGlzLmhhc01hbnlEYXRhU291cmNlLmRhdGEgPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5oYXNNYW55U2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmllcyB0byBzYXZlIHRoZSBjaGFuZ2VzIGFuZCBjbG9zZSB0aGUgZGlhbG9nIGFmdGVyd2FyZHMuXG4gICAgICogQWxzbyBoYW5kbGVzIHRoZSBjb25maXJtYXRpb24gaWYgcmVxdWlyZWQuXG4gICAgICovXG4gICAgZGlhbG9nRWRpdEhhc01hbnkoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmludGVybmFsSXNSZWFkT25seSB8fCAhdGhpcy5pc0hhc01hbnlFbnRpdHlWYWxpZCB8fCAhdGhpcy5pc0hhc01hbnlFbnRpdHlEaXJ0eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmVkaXREYXRhLmVkaXRSZXF1aXJlc0NvbmZpcm1EaWFsb2cpIHtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nQ29uZmlybUVkaXRIYXNNYW55KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgY29uc3QgZGlhbG9nRGF0YTogQ29uZmlybURpYWxvZ0RhdGFJbnRlcm5hbCA9IG5ldyBDb25maXJtRGlhbG9nRGF0YUJ1aWxkZXIodGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmVkaXREYXRhLmNvbmZpcm1FZGl0RGlhbG9nRGF0YSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGV4dCcsIFsnRG8geW91IHJlYWxseSB3YW50IHRvIHNhdmUgYWxsIGNoYW5nZXM/J10pXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ2NvbmZpcm1CdXR0b25MYWJlbCcsICdTYXZlJylcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGl0bGUnLCAnRWRpdCcpXG4gICAgICAgICAgICAuZ2V0UmVzdWx0KCk7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIGJvb2xlYW4+ID0gdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dDb25maXJtRWRpdEhhc01hbnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByaXZhdGUgZGlhbG9nQ29uZmlybUVkaXRIYXNNYW55KCk6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMuaGFzTWFueUVudGl0eVNlcnZpY2UudXBkYXRlKHRoaXMuaGFzTWFueUVudGl0eSwgdGhpcy5oYXNNYW55RW50aXR5UHJpb3JDaGFuZ2VzKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZWRpdEhhc01hbnlEaWFsb2dSZWYuY2xvc2UoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmllcyB0byBkZWxldGUgdGhlIGVudGl0eSBhbmQgY2xvc2UgdGhlIGRpYWxvZyBhZnRlcndhcmRzLlxuICAgICAqIEFsc28gaGFuZGxlcyB0aGUgY29uZmlybWF0aW9uIGlmIHJlcXVpcmVkLlxuICAgICAqL1xuICAgIGRlbGV0ZUhhc01hbnlFbnRpdHkoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmVkaXREYXRhLmRlbGV0ZVJlcXVpcmVzQ29uZmlybURpYWxvZykge1xuICAgICAgICAgICAgdGhpcy5jb25maXJtRGVsZXRlSGFzTWFueUVudGl0eSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgIGNvbnN0IGRpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS5jb25maXJtRGVsZXRlRGlhbG9nRGF0YSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGV4dCcsIFsnRG8geW91IHJlYWxseSB3YW50IHRvIGRlbGV0ZSB0aGlzIGVudGl0eT8nXSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndHlwZScsICdkZWxldGUnKVxuICAgICAgICAgICAgLndpdGhEZWZhdWx0KCdjb25maXJtQnV0dG9uTGFiZWwnLCAnRGVsZXRlJylcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGl0bGUnLCAnRGVsZXRlJylcbiAgICAgICAgICAgIC5nZXRSZXN1bHQoKTtcbiAgICAgICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8Tmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwgYm9vbGVhbj4gPSB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpcm1EZWxldGVIYXNNYW55RW50aXR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29uZmlybURlbGV0ZUhhc01hbnlFbnRpdHkoKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5oYXNNYW55RW50aXR5U2VydmljZS5kZWxldGUodGhpcy5oYXNNYW55RW50aXR5UHJpb3JDaGFuZ2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWRpdEhhc01hbnlEaWFsb2dSZWYuY2xvc2UoMik7XG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VscyB0aGUgZWRpdGluZyBvZiB0aGUgaGFzIG1hbnkgZW50aXR5IGFuZCBjbG9zZXMgdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBkaWFsb2dDYW5jZWxFZGl0SGFzTWFueSgpOiB2b2lkIHtcbiAgICAgICAgRW50aXR5VXRpbGl0aWVzLnJlc2V0Q2hhbmdlc09uRW50aXR5KHRoaXMuaGFzTWFueUVudGl0eSwgdGhpcy5oYXNNYW55RW50aXR5UHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgdGhpcy5lZGl0SGFzTWFueURpYWxvZ1JlZi5jbG9zZSgwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEVudGl0eS4gVGhpcyBlaXRoZXIgY2FsbHMgdGhlIGNyZWF0ZS1NZXRob2QgcHJvdmlkZWQgYnkgdGhlIHVzZXIgb3IgdXNlcyBhIGRlZmF1bHQgY3JlYXRlLWRpYWxvZy5cbiAgICAgKlxuICAgICAqIEB0aHJvd3MgV2hlbiBubyBFbnRpdHlDbGFzcyB3YXMgcHJvdmlkZWQsIGFzIGEgbmV3IGNhbGwgaXMgbmVlZGVkIHRvIGluaXRpYWxpemUgbWV0YWRhdGEuXG4gICAgICovXG4gICAgY3JlYXRlSGFzTWFueUVudGl0eSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5hbGxvd0NyZWF0ZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuRW50aXR5Q2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBcIkVudGl0eUNsYXNzXCIgc3BlY2lmaWVkIGZvciB0aGlzIHRhYmxlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuY3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5jcmVhdGUobmV3IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlSGFzTWFueURlZmF1bHQobmV3IHRoaXMubWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5FbnRpdHlDbGFzcygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlSGFzTWFueURlZmF1bHQoZW50aXR5OiBFbnRpdHlUeXBlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGFzTWFueUVudGl0eSA9IGVudGl0eTtcbiAgICAgICAgdGhpcy5oYXNNYW55Q3JlYXRlVGFicyA9IEVudGl0eVV0aWxpdGllcy5nZXRFbnRpdHlUYWJzKHRoaXMuaGFzTWFueUVudGl0eSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuY2hlY2tJc0hhc01hbnlFbnRpdHlWYWxpZCgnY3JlYXRlJyk7XG4gICAgICAgIHRoaXMuY3JlYXRlSGFzTWFueURpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUhhc01hbnlEaWFsb2csXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWluV2lkdGg6ICc2MCUnLFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIGhhcyBtYW55IGVudGl0eSBvdmVyIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgZGlhbG9nQ3JlYXRlSGFzTWFueSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzSGFzTWFueUVudGl0eVZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuY3JlYXRlRGlhbG9nRGF0YS5jcmVhdGVSZXF1aXJlc0NvbmZpcm1EaWFsb2cpIHtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nQ29uZmlybUNyZWF0ZUhhc01hbnkoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICBjb25zdCBkaWFsb2dEYXRhOiBDb25maXJtRGlhbG9nRGF0YUludGVybmFsID0gbmV3IENvbmZpcm1EaWFsb2dEYXRhQnVpbGRlcih0aGlzLm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuY3JlYXRlRGlhbG9nRGF0YS5jb25maXJtQ3JlYXRlRGlhbG9nRGF0YSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGV4dCcsIFsnRG8geW91IHJlYWxseSB3YW50IHRvIGNyZWF0ZSB0aGlzIGVudGl0eT8nXSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgnY29uZmlybUJ1dHRvbkxhYmVsJywgJ0NyZWF0ZScpXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RpdGxlJywgJ0NyZWF0ZScpXG4gICAgICAgICAgICAuZ2V0UmVzdWx0KCk7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIGJvb2xlYW4+ID0gdGhpcy5kaWFsb2cub3BlbihOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiBkaWFsb2dEYXRhLFxuICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dDb25maXJtQ3JlYXRlSGFzTWFueSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBkaWFsb2dDb25maXJtQ3JlYXRlSGFzTWFueSgpOiB2b2lkIHtcbiAgICAgICAgdm9pZCB0aGlzLmhhc01hbnlFbnRpdHlTZXJ2aWNlLmNyZWF0ZSh0aGlzLmhhc01hbnlFbnRpdHksIHRoaXMuaGFzTWFueUNyZWF0ZUJhc2VVcmwpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVIYXNNYW55RGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FuY2VscyB0aGUgY3JlYXRpbmcgb2YgdGhlIGhhcyBtYW55IGVudGl0eSBhbmQgY2xvc2VzIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgZGlhbG9nQ2FuY2VsQ3JlYXRlSGFzTWFueSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jcmVhdGVIYXNNYW55RGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyB0aGUgVGFibGVBY3Rpb24gZm9yIGFsbCBzZWxlY3RlZCBlbnRyaWVzLlxuICAgICAqIEFsc28gaGFuZGxlcyBjb25maXJtYXRpb24gd2l0aCBhbiBhZGRpdGlvbmFsIGRpYWxvZyBpZiBjb25maWd1cmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdGlvbiAtIFRoZSBUYWJsZUFjdGlvbiB0byBydW4uXG4gICAgICovXG4gICAgcnVuSGFzTWFueVRhYmxlQWN0aW9uKGFjdGlvbjogVGFibGVBY3Rpb25JbnRlcm5hbDxFbnRpdHlUeXBlPik6IHZvaWQge1xuICAgICAgICBjb25zdCByZXF1aXJlQ29uZmlybURpYWxvZzogYm9vbGVhbiA9IHRoaXMuaW5qZWN0b3IucnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucmVxdWlyZUNvbmZpcm1EaWFsb2codGhpcy5oYXNNYW55U2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcmVxdWlyZUNvbmZpcm1EaWFsb2cpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlybVJ1bkhhc01hbnlUYWJsZUFjdGlvbihhY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpYWxvZ0RhdGE6IENvbmZpcm1EaWFsb2dEYXRhSW50ZXJuYWwgPSBuZXcgQ29uZmlybURpYWxvZ0RhdGFCdWlsZGVyKGFjdGlvbi5jb25maXJtRGlhbG9nRGF0YSlcbiAgICAgICAgICAgIC53aXRoRGVmYXVsdCgndGV4dCcsIFtgRG8geW91IHJlYWxseSB3YW50IHRvIHJ1biB0aGlzIGFjdGlvbiBvbiAke3RoaXMuaGFzTWFueVNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGh9IGVudHJpZXM/YF0pXG4gICAgICAgICAgICAud2l0aERlZmF1bHQoJ3RpdGxlJywgYWN0aW9uLmRpc3BsYXlOYW1lKVxuICAgICAgICAgICAgLmdldFJlc3VsdCgpO1xuICAgICAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxOZ3hNYXRFbnRpdHlDb25maXJtRGlhbG9nQ29tcG9uZW50LCBib29sZWFuPiA9IHRoaXMuZGlhbG9nLm9wZW4oTmd4TWF0RW50aXR5Q29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgZGF0YTogZGlhbG9nRGF0YSxcbiAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICByZXN0b3JlRm9jdXM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlybVJ1bkhhc01hbnlUYWJsZUFjdGlvbihhY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbmZpcm1SdW5IYXNNYW55VGFibGVBY3Rpb24oYWN0aW9uOiBUYWJsZUFjdGlvbkludGVybmFsPEVudGl0eVR5cGU+KTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5pbmplY3Rvci5ydW5JbkNvbnRleHQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgYWN0aW9uLmFjdGlvbih0aGlzLmhhc01hbnlTZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICAgICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBUYWJsZUFjdGlvbiBpcyBkaXNhYmxlZCAoZS5nLiBCZWNhdXNlIG5vIGVudHJpZXMgaGF2ZSBiZWVuIHNlbGVjdGVkKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gLSBUaGUgVGFibGVBY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIEFjdGlvbiBjYW4gYmUgdXNlZC5cbiAgICAgKi9cbiAgICBoYXNNYW55VGFibGVBY3Rpb25EaXNhYmxlZChhY3Rpb246IFRhYmxlQWN0aW9uSW50ZXJuYWw8RW50aXR5VHlwZT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IucnVuSW5Db250ZXh0KCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAhYWN0aW9uLmVuYWJsZWQodGhpcy5oYXNNYW55U2VsZWN0aW9uLnNlbGVjdGVkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgc2VhcmNoIGlucHV0IHRvIGZpbHRlciB0aGUgdGFibGUgZW50cmllcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudCAtIFRoZSBrZXl1cC1ldmVudCB3aGljaCBjb250YWlucyB0aGUgc2VhcmNoLXN0cmluZyBvZiB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBhcHBseUhhc01hbnlGaWx0ZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbHRlclZhbHVlOiBzdHJpbmcgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICB0aGlzLmhhc01hbnlEYXRhU291cmNlLmZpbHRlciA9IGZpbHRlclZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZW50aXR5IGlzIHZhbGlkIGZvciB1cGRhdGluZyBhbmQgaWYgaXQgaXMgZGlydHkuXG4gICAgICovXG4gICAgYXN5bmMgY2hlY2tIYXNNYW55RW50aXR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNoZWNrSXNIYXNNYW55RW50aXR5VmFsaWQoJ3VwZGF0ZScpO1xuICAgICAgICB0aGlzLmlzSGFzTWFueUVudGl0eURpcnR5ID0gYXdhaXQgRW50aXR5VXRpbGl0aWVzLmlzRGlydHkodGhpcy5oYXNNYW55RW50aXR5LCB0aGlzLmhhc01hbnlFbnRpdHlQcmlvckNoYW5nZXMsIHRoaXMuaHR0cCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbnRpdHkgaXMgdmFsaWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb21pdCAtIFdoZXRoZXIgdmFsdWVzIG9taXR0ZWQgZm9yIGNyZWF0ZSBvciB1cGRhdGUgc2hvdWxkIGJlIGxlZnQgb3V0LlxuICAgICAqL1xuICAgIGNoZWNrSXNIYXNNYW55RW50aXR5VmFsaWQob21pdDogJ2NyZWF0ZScgfCAndXBkYXRlJyk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzSGFzTWFueUVudGl0eVZhbGlkID0gVmFsaWRhdGlvblV0aWxpdGllcy5pc0VudGl0eVZhbGlkKHRoaXMuaGFzTWFueUVudGl0eSwgb21pdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGFycmF5IGl0ZW0gaXMgdmFsaWQgYW5kIGlmIHRoZSBhcnJheSBpdGVtIGlzIGRpcnR5LlxuICAgICAqL1xuICAgIGNoZWNrQXJyYXlJdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoZWNrSXNBcnJheUl0ZW1WYWxpZCgpO1xuICAgICAgICB2b2lkIHRoaXMuY2hlY2tJc0FycmF5SXRlbURpcnR5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBhcnJheSBpdGVtIGlzIGRpcnR5LlxuICAgICAqL1xuICAgIGFzeW5jIGNoZWNrSXNBcnJheUl0ZW1EaXJ0eSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5pc0FycmF5SXRlbURpcnR5ID0gYXdhaXQgRW50aXR5VXRpbGl0aWVzLmlzRGlydHkodGhpcy5hcnJheUl0ZW0sIHRoaXMuYXJyYXlJdGVtUHJpb3JDaGFuZ2VzLCB0aGlzLmh0dHApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgYXJyYXlJdGVtIGlzIHZhbGlkLlxuICAgICAqL1xuICAgIGNoZWNrSXNBcnJheUl0ZW1WYWxpZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0FycmF5SXRlbVZhbGlkID0gVmFsaWRhdGlvblV0aWxpdGllcy5pc0VudGl0eVZhbGlkKHRoaXMuYXJyYXlJdGVtLCAnY3JlYXRlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgdGhhdCBhIHRoZSB2YWx1ZSBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgICAqL1xuICAgIGVtaXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRDaGFuZ2VFdmVudC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJpZXMgdG8gYWRkIGFuIGl0ZW0gdG8gdGhlIGVudGl0eSBhcnJheS5cbiAgICAgKiBEb2VzIHRoaXMgZWl0aGVyIGlubGluZSBpZiB0aGUgXCJjcmVhdGVJbmxpbmVcIi1tZXRhZGF0YSBpcyBzZXQgdG8gdHJ1ZVxuICAgICAqIG9yIGluIGEgc2VwYXJhdGUgZGlhbG9nIGlmIGl0IGlzIHNldCB0byBmYWxzZS5cbiAgICAgKi9cbiAgICBhc3luYyBhZGRFbnRpdHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5hbGxvd0R1cGxpY2F0ZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy5lbnRpdHlBcnJheVZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGF3YWl0IEVudGl0eVV0aWxpdGllcy5pc0VxdWFsKHRoaXMuYXJyYXlJdGVtLCB2LCB0aGlzLm1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuaXRlbVR5cGUsIHRoaXMuaHR0cCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE5neE1hdEVudGl0eUNvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuZHVwbGljYXRlc0Vycm9yRGlhbG9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVudGl0eUFycmF5VmFsdWVzLnB1c2goTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmFycmF5SXRlbSkpO1xuICAgICAgICAgICAgdGhpcy5lbnRpdHlBcnJheURhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZW50aXR5QXJyYXlWYWx1ZXM7XG4gICAgICAgICAgICBFbnRpdHlVdGlsaXRpZXMucmVzZXRDaGFuZ2VzT25FbnRpdHkodGhpcy5hcnJheUl0ZW0sIHRoaXMuYXJyYXlJdGVtUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tJc0FycmF5SXRlbVZhbGlkKCk7XG4gICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkQXJyYXlJdGVtRGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFycmF5SXRlbURpYWxvZyxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnNjAlJyxcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdG9yZUZvY3VzOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBhcnJheSBpdGVtIGRlZmluZWQgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBhZGRBcnJheUl0ZW0oKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0FycmF5SXRlbVZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbnRpdHlBcnJheVZhbHVlcy5wdXNoKExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5hcnJheUl0ZW0pKTtcbiAgICAgICAgdGhpcy5lbnRpdHlBcnJheURhdGFTb3VyY2UuZGF0YSA9IHRoaXMuZW50aXR5QXJyYXlWYWx1ZXM7XG5cbiAgICAgICAgdGhpcy5jbG9zZUFkZEFycmF5SXRlbURpYWxvZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbmNlbHMgYWRkaW5nIHRoZSBhcnJheSBpdGVtIGRlZmluZWQgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBjbG9zZUFkZEFycmF5SXRlbURpYWxvZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hZGRBcnJheUl0ZW1EaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgICAgRW50aXR5VXRpbGl0aWVzLnJlc2V0Q2hhbmdlc09uRW50aXR5KHRoaXMuYXJyYXlJdGVtLCB0aGlzLmFycmF5SXRlbVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIHRoaXMuY2hlY2tJc0FycmF5SXRlbVZhbGlkKCk7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVkaXRzIGFuIGVudGl0eSBhcnJheSBpdGVtLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdGhhdCBoYXMgYmVlbiBjbGlja2VkLlxuICAgICAqIEBwYXJhbSBkQ29sIC0gVGhlIGRpc3BsYXkgY29sdW1uIHRoYXQgd2FzIGNsaWNrZWQgb24uXG4gICAgICovXG4gICAgZWRpdEFycmF5SXRlbShlbnRpdHk6IEVudGl0eVR5cGUsIGRDb2w6IERpc3BsYXlDb2x1bW48RW50aXR5VHlwZT4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGRDb2wuZGlzYWJsZUNsaWNrID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRleE9mRWRpdGVkQXJyYXlJdGVtID0gdGhpcy5lbnRpdHlBcnJheVZhbHVlcy5pbmRleE9mKGVudGl0eSk7XG4gICAgICAgIHRoaXMuYXJyYXlJdGVtID0gbmV3IHRoaXMubWV0YWRhdGFFbnRpdHlBcnJheS5FbnRpdHlDbGFzcyhlbnRpdHkpO1xuICAgICAgICB0aGlzLmFycmF5SXRlbVByaW9yQ2hhbmdlcyA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodGhpcy5hcnJheUl0ZW0pO1xuXG4gICAgICAgIHRoaXMuY2hlY2tBcnJheUl0ZW0oKTtcblxuICAgICAgICB0aGlzLmVkaXRBcnJheUl0ZW1EaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKFxuICAgICAgICAgICAgdGhpcy5lZGl0QXJyYXlJdGVtRGlhbG9nLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnNjAlJyxcbiAgICAgICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHJlc3RvcmVGb2N1czogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlcyBjaGFuZ2VzIG9uIHRoZSBhcnJheSBpdGVtIGluIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgc2F2ZUFycmF5SXRlbSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnRpdHlBcnJheVZhbHVlc1t0aGlzLmluZGV4T2ZFZGl0ZWRBcnJheUl0ZW1dID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh0aGlzLmFycmF5SXRlbSk7XG4gICAgICAgIHRoaXMuZW50aXR5QXJyYXlEYXRhU291cmNlLmRhdGEgPSB0aGlzLmVudGl0eUFycmF5VmFsdWVzO1xuXG4gICAgICAgIHRoaXMuY2xvc2VFZGl0QXJyYXlJdGVtRGlhbG9nKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBlZGl0IGFycmF5IGl0ZW0gZGlhbG9nIGFuZCByZXNldHMgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBjbG9zZUVkaXRBcnJheUl0ZW1EaWFsb2coKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdEFycmF5SXRlbURpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgICB0aGlzLmFycmF5SXRlbSA9IG5ldyB0aGlzLm1ldGFkYXRhRW50aXR5QXJyYXkuRW50aXR5Q2xhc3MoKTtcbiAgICAgICAgdGhpcy5hcnJheUl0ZW1QcmlvckNoYW5nZXMgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHRoaXMuYXJyYXlJdGVtKTtcbiAgICAgICAgdGhpcy5jaGVja0FycmF5SXRlbSgpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBzZWxlY3RlZCBlbnRyaWVzIGZyb20gdGhlIGVudGl0eSBhcnJheS5cbiAgICAgKi9cbiAgICByZW1vdmVGcm9tRW50aXR5QXJyYXkoKTogdm9pZCB7XG4gICAgICAgIFNlbGVjdGlvblV0aWxpdGllcy5yZW1vdmUodGhpcy5lbnRpdHlBcnJheVNlbGVjdGlvbiwgdGhpcy5lbnRpdHlBcnJheVZhbHVlcywgdGhpcy5lbnRpdHlBcnJheURhdGFTb3VyY2UpO1xuICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgICB9XG59IiwiPGRpdiBbbmdTd2l0Y2hdPVwidHlwZVwiICpuZ0lmPVwiIShoaWRlT21pdEZvckNyZWF0ZSAmJiBtZXRhZGF0YS5vbWl0Rm9yQ3JlYXRlKSAmJiAhKGhpZGVPbWl0Rm9yRWRpdCAmJiBtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlKVwiPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLVN0cmluZ3MtLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLlNUUklOR1wiPlxuICAgICAgICA8c3RyaW5nLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9zdHJpbmctaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuU1RSSU5HX1RFWFRCT1hcIj5cbiAgICAgICAgPHN0cmluZy10ZXh0Ym94LWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9zdHJpbmctdGV4dGJveC1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5TVFJJTkdfQVVUT0NPTVBMRVRFXCI+XG4gICAgICAgIDxzdHJpbmctYXV0b2NvbXBsZXRlLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9zdHJpbmctYXV0b2NvbXBsZXRlLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLlNUUklOR19EUk9QRE9XTlwiPlxuICAgICAgICA8c3RyaW5nLWRyb3Bkb3duLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9zdHJpbmctZHJvcGRvd24taW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuU1RSSU5HX1BBU1NXT1JEXCI+XG4gICAgICAgIDxzdHJpbmctcGFzc3dvcmQtaW5wdXRcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L3N0cmluZy1wYXNzd29yZC1pbnB1dD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLUJvb2xlYW5zLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkJPT0xFQU5fQ0hFQ0tCT1hcIj5cbiAgICAgICAgPGJvb2xlYW4tY2hlY2tib3gtaW5wdXRcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L2Jvb2xlYW4tY2hlY2tib3gtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQk9PTEVBTl9UT0dHTEVcIj5cbiAgICAgICAgPGJvb2xlYW4tdG9nZ2xlLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9ib29sZWFuLXRvZ2dsZS1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5CT09MRUFOX0RST1BET1dOXCI+XG4gICAgICAgIDxib29sZWFuLWRyb3Bkb3duLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9ib29sZWFuLWRyb3Bkb3duLWlucHV0PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLU51bWJlcnMtLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuTlVNQkVSXCI+XG4gICAgICAgIDxudW1iZXItaW5wdXRcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L251bWJlci1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5OVU1CRVJfRFJPUERPV05cIj5cbiAgICAgICAgPG51bWJlci1kcm9wZG93bi1pbnB1dFxuICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIlxuICAgICAgICAgICAgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICA+XG4gICAgICAgIDwvbnVtYmVyLWRyb3Bkb3duLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLk5VTUJFUl9TTElERVJcIj5cbiAgICAgICAgPG51bWJlci1zbGlkZXItaW5wdXRcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L251bWJlci1zbGlkZXItaW5wdXQ+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLUFycmF5LS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFXCI+XG4gICAgICAgIDxhcnJheS1kYXRlLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9hcnJheS1kYXRlLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVfVElNRVwiPlxuICAgICAgICA8YXJyYXktZGF0ZS10aW1lLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9hcnJheS1kYXRlLXRpbWUtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9SQU5HRVwiPlxuICAgICAgICA8YXJyYXktZGF0ZS1yYW5nZS1pbnB1dFxuICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIlxuICAgICAgICAgICAgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICA+XG4gICAgICAgIDwvYXJyYXktZGF0ZS1yYW5nZS1pbnB1dD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5BUlJBWV9TVFJJTkdfQ0hJUFNcIj5cbiAgICAgICAgPGFycmF5LXN0cmluZy1jaGlwcy1pbnB1dFxuICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIlxuICAgICAgICAgICAgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICA+XG4gICAgICAgIDwvYXJyYXktc3RyaW5nLWNoaXBzLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19BVVRPQ09NUExFVEVfQ0hJUFNcIj5cbiAgICAgICAgPGFycmF5LXN0cmluZy1hdXRvY29tcGxldGUtY2hpcHNcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L2FycmF5LXN0cmluZy1hdXRvY29tcGxldGUtY2hpcHM+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLURhdGVzLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5EQVRFXCI+XG4gICAgICAgIDxkYXRlLWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9kYXRlLWlucHV0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkRBVEVfUkFOR0VcIj5cbiAgICAgICAgPGRhdGUtcmFuZ2UtaW5wdXRcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L2RhdGUtcmFuZ2UtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuREFURV9USU1FXCI+XG4gICAgICAgIDxkYXRlLXRpbWUtaW5wdXRcbiAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICBbZW50aXR5XT1cImludGVybmFsRW50aXR5XCJcbiAgICAgICAgICAgIFtrZXldPVwiaW50ZXJuYWxQcm9wZXJ0eUtleVwiXG4gICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgPlxuICAgICAgICA8L2RhdGUtdGltZS1pbnB1dD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tRmlsZXMtLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLkZJTEVfREVGQVVMVFwiPlxuICAgICAgICA8ZmlsZS1kZWZhdWx0LWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9maWxlLWRlZmF1bHQtaW5wdXQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRVwiPlxuICAgICAgICA8ZmlsZS1pbWFnZS1pbnB1dFxuICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIlxuICAgICAgICAgICAgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICA+XG4gICAgICAgIDwvZmlsZS1pbWFnZS1pbnB1dD5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLSByZWZlcmVuY2VzIG1hbnkgLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDxkaXYgKm5nU3dpdGNoQ2FzZT1cIkRlY29yYXRvclR5cGVzLlJFRkVSRU5DRVNfTUFOWVwiPlxuICAgICAgICA8cmVmZXJlbmNlcy1tYW55LWlucHV0XG4gICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgW2VudGl0eV09XCJpbnRlcm5hbEVudGl0eVwiXG4gICAgICAgICAgICBba2V5XT1cImludGVybmFsUHJvcGVydHlLZXlcIlxuICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImludGVybmFsSXNSZWFkT25seVwiXG4gICAgICAgID5cbiAgICAgICAgPC9yZWZlcmVuY2VzLW1hbnktaW5wdXQ+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLUN1c3RvbS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2ICpuZ1N3aXRjaENhc2U9XCJEZWNvcmF0b3JUeXBlcy5DVVNUT01cIj5cbiAgICAgICAgPGN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgIFtlbnRpdHldPVwiaW50ZXJuYWxFbnRpdHlcIlxuICAgICAgICAgICAgW2tleV09XCJpbnRlcm5hbFByb3BlcnR5S2V5XCJcbiAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICBbaXNSZWFkT25seV09XCJpbnRlcm5hbElzUmVhZE9ubHlcIlxuICAgICAgICA+XG4gICAgICAgIDwvY3VzdG9tLWlucHV0PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS1PYmplY3QtLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuT0JKRUNUXCI+XG4gICAgICAgIDxiPnt7bWV0YWRhdGFEZWZhdWx0T2JqZWN0LmRpc3BsYXlOYW1lfX08L2I+XG4gICAgICAgIDwhLS0gaXRlcmF0ZXMgb3ZlciB0aGUgb2JqZWN0IHByb3BlcnRpZXMgLS0+XG4gICAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwib2JqZWN0UHJvcGVydHlUYWJzLmxlbmd0aCA+IDFcIiBwcmVzZXJ2ZUNvbnRlbnQ+XG4gICAgICAgICAgICA8bWF0LXRhYiAqbmdGb3I9XCJsZXQgdGFiIG9mIG9iamVjdFByb3BlcnR5VGFiczsgbGV0IHRJID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiIFtsYWJlbF09XCJ0YWIudGFiTmFtZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYi5yb3dzO1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXQgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5czsgbGV0IHJJID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cIm9iamVjdFByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckNyZWF0ZV09XCJoaWRlT21pdEZvckNyZWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JFZGl0XT1cImhpZGVPbWl0Rm9yRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRFbXB0eV09XCIhbWV0YWRhdGEucmVxdWlyZWQoZW50aXR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpc1Byb3BlcnR5UmVhZE9ubHkob2JqZWN0UHJvcGVydHksIGtleSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgob2JqZWN0UHJvcGVydHksIGtleSwgJ2xnJyl9fSBjb2wtbWQte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgob2JqZWN0UHJvcGVydHksIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgob2JqZWN0UHJvcGVydHksIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDwvbWF0LXRhYi1ncm91cD5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwib2JqZWN0UHJvcGVydHlUYWJzLmxlbmd0aCA8PSAxXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBvYmplY3RQcm9wZXJ0eVRhYnNbMF0ucm93c1wiPlxuICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dCAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdy5rZXlzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm5cIlxuICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cIm9iamVjdFByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckNyZWF0ZV09XCJoaWRlT21pdEZvckNyZWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwiaGlkZU9taXRGb3JFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkRW1wdHldPVwiIW1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSlcIlxuICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpc1Byb3BlcnR5UmVhZE9ubHkob2JqZWN0UHJvcGVydHksIGtleSlcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1sZy17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChvYmplY3RQcm9wZXJ0eSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChvYmplY3RQcm9wZXJ0eSwga2V5LCAnbWQnKX19IGNvbC1zbS17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChvYmplY3RQcm9wZXJ0eSwga2V5LCAnc20nKX19XCJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiZW1pdENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9uZ3gtbWF0LWVudGl0eS1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLSByZWZlcmVuY2VzIG9uZSAtLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuUkVGRVJFTkNFU19PTkVcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e21ldGFkYXRhLmRpc3BsYXlOYW1lfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwiaW50ZXJuYWxFbnRpdHlbaW50ZXJuYWxQcm9wZXJ0eUtleV1cIlxuICAgICAgICAgICAgICAgIFtuYW1lXT1cImludGVybmFsUHJvcGVydHlLZXkudG9TdHJpbmcoKSArICdpbnB1dCcgKyByZWZlcmVuY2VzT25lVVVJRFwiXG4gICAgICAgICAgICAgICAgI2lucHV0TW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaW50ZXJuYWxJc1JlYWRPbmx5XCJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwibWV0YWRhdGEucmVxdWlyZWQoZW50aXR5KVwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2V0UmVmZXJlbmNlc09uZU9iamVjdCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cIiFtZXRhZGF0YS5yZXF1aXJlZChlbnRpdHkpXCI+LTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgcmVmZXJlbmNlc09uZURyb3Bkb3duVmFsdWVzXCIgW3ZhbHVlXT1cInZhbHVlLnZhbHVlXCI+e3t2YWx1ZS5kaXNwbGF5TmFtZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPG1hdC1lcnJvcj57e2ludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZShpbnB1dE1vZGVsKX19PC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwhLS0gaXRlcmF0ZXMgb3ZlciB0aGUgcmVmZXJlbmNlcyBvbmUgcHJvcGVydGllcyAtLT5cbiAgICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJyZWZlcmVuY2VzT25lUHJvcGVydHlUYWJzICYmIHJlZmVyZW5jZXNPbmVQcm9wZXJ0eVRhYnMubGVuZ3RoID4gMVwiIHByZXNlcnZlQ29udGVudD5cbiAgICAgICAgICAgIDxtYXQtdGFiICpuZ0Zvcj1cImxldCB0YWIgb2YgcmVmZXJlbmNlc09uZVByb3BlcnR5VGFiczsgbGV0IHRJID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiIFtsYWJlbF09XCJ0YWIudGFiTmFtZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYi5yb3dzO1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXQgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5czsgbGV0IHJJID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cInJlZmVyZW5jZXNPbmVPYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cImhpZGVPbWl0Rm9yQ3JlYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwiaGlkZU9taXRGb3JFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZEVtcHR5XT1cIiFtZXRhZGF0YS5yZXF1aXJlZChlbnRpdHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgocmVmZXJlbmNlc09uZU9iamVjdCwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChyZWZlcmVuY2VzT25lT2JqZWN0LCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKHJlZmVyZW5jZXNPbmVPYmplY3QsIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJlbWl0Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgIDwvbWF0LXRhYi1ncm91cD5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwicmVmZXJlbmNlc09uZVByb3BlcnR5VGFicyAmJiByZWZlcmVuY2VzT25lUHJvcGVydHlUYWJzLmxlbmd0aCA8PSAxXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiByZWZlcmVuY2VzT25lUHJvcGVydHlUYWJzWzBdLnJvd3NcIj5cbiAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXQgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJyZWZlcmVuY2VzT25lT2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckNyZWF0ZV09XCJoaWRlT21pdEZvckNyZWF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwiaGlkZU9taXRGb3JFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkRW1wdHldPVwiIW1ldGFkYXRhLnJlcXVpcmVkKGVudGl0eSlcIlxuICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgocmVmZXJlbmNlc09uZU9iamVjdCwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChyZWZlcmVuY2VzT25lT2JqZWN0LCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKHJlZmVyZW5jZXNPbmVPYmplY3QsIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImVtaXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLUFycmF5LS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8ZGl2IGNsYXNzPVwiZW50aXR5QXJyYXlcIiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuQVJSQVlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejggZWxldmF0aW9uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFycmF5LWhlYWRsaW5lXCI+XG4gICAgICAgICAgICAgICAgPGI+e3ttZXRhZGF0YUVudGl0eUFycmF5LmRpc3BsYXlOYW1lfX08L2I+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJtZXRhZGF0YUVudGl0eUFycmF5LmNyZWF0ZUlubGluZSAmJiAhaW50ZXJuYWxJc1JlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJhcnJheUl0ZW1JbmxpbmVUYWJzLmxlbmd0aCA+IDFcIiBwcmVzZXJ2ZUNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtdGFiICpuZ0Zvcj1cImxldCB0YWIgb2YgYXJyYXlJdGVtSW5saW5lVGFic1wiIFtsYWJlbF09XCJ0YWIudGFiTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2YgdGFiLnJvd3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJhcnJheUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJvcGVydHlLZXldPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1sZy17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ2xnJyl9fSBjb2wtbWQte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnc20nKX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tJc0FycmF5SXRlbVZhbGlkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XG5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXJyYXlJdGVtSW5saW5lVGFicy5sZW5ndGggPD0gMVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBhcnJheUl0ZW1JbmxpbmVUYWJzWzBdLnJvd3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBrZXkgb2Ygcm93LmtleXM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJhcnJheUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckNyZWF0ZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZV09XCJpbnRlcm5hbEdldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWxnLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdzbScpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImNoZWNrSXNBcnJheUl0ZW1WYWxpZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zXCIgKm5nSWY9XCIhaW50ZXJuYWxJc1JlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1ldGFkYXRhRW50aXR5QXJyYXkuY3JlYXRlSW5saW5lICYmICFpc0FycmF5SXRlbVZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEVudGl0eSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFFbnRpdHlBcnJheS5hZGRCdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlbnRpdHlBcnJheVNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlRnJvbUVudGl0eUFycmF5KClcIj5cbiAgICAgICAgICAgICAgICAgICAge3ttZXRhZGF0YUVudGl0eUFycmF5LnJlbW92ZUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICBcbiAgICAgICAgICAgIDxtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiZW50aXR5QXJyYXlEYXRhU291cmNlXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBzZWxlY3QgQ29sdW1uIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCIgKm5nSWY9XCIhaW50ZXJuYWxJc1JlYWRPbmx5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFlbnRpdHlBcnJheURhdGFTb3VyY2UuZGF0YS5sZW5ndGhcIiAoY2hhbmdlKT1cIiRldmVudCA/IFNlbGVjdGlvblV0aWxpdGllcy5tYXN0ZXJUb2dnbGUoZW50aXR5QXJyYXlTZWxlY3Rpb24sIGVudGl0eUFycmF5RGF0YVNvdXJjZSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJlbnRpdHlBcnJheVNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIFNlbGVjdGlvblV0aWxpdGllcy5pc0FsbFNlbGVjdGVkKGVudGl0eUFycmF5U2VsZWN0aW9uLCBlbnRpdHlBcnJheURhdGFTb3VyY2UpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJlbnRpdHlBcnJheVNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFTZWxlY3Rpb25VdGlsaXRpZXMuaXNBbGxTZWxlY3RlZChlbnRpdHlBcnJheVNlbGVjdGlvbiwgZW50aXR5QXJyYXlEYXRhU291cmNlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZW50aXR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIiRldmVudCA/IGVudGl0eUFycmF5U2VsZWN0aW9uLnRvZ2dsZShlbnRpdHkpIDogbnVsbFwiIFtjaGVja2VkXT1cImVudGl0eUFycmF5U2VsZWN0aW9uLmlzU2VsZWN0ZWQoZW50aXR5KVwiPjwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZENvbCBvZiBtZXRhZGF0YUVudGl0eUFycmF5LmRpc3BsYXlDb2x1bW5zXCIgW21hdENvbHVtbkRlZl09XCJkQ29sLmRpc3BsYXlOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2RDb2wuZGlzcGxheU5hbWV9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1jZWxsIFtjbGFzcy5lbmFibGVkXT1cIiFkQ29sLmRpc2FibGVDbGlja1wiIChjbGljayk9XCJlZGl0QXJyYXlJdGVtKGVudGl0eSwgZENvbClcIiAqbWF0Q2VsbERlZj1cImxldCBlbnRpdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkQ29sLkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWNvbHVtbi12YWx1ZSBbZW50aXR5XT1cImVudGl0eVwiIFtDb21wb25lbnRDbGFzc109XCJkQ29sLkNvbXBvbmVudFwiPjwvZGlzcGxheS1jb2x1bW4tdmFsdWU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZENvbC5Db21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2dldERpc3BsYXlDb2x1bW5WYWx1ZShlbnRpdHksIGRDb2wpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJlbnRpdHlBcnJheURpc3BsYXllZENvbHVtbnNcIj48L21hdC1oZWFkZXItcm93PlxuICAgICAgICAgICAgICAgIDxtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBlbnRpdHlBcnJheURpc3BsYXllZENvbHVtbnNcIj48L21hdC1yb3c+XG4gICAgICAgICAgICA8L21hdC10YWJsZT5cbiAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyYXktZXJyb3JcIiAqbmdJZj1cIm1ldGFkYXRhRW50aXR5QXJyYXkucmVxdWlyZWQoZW50aXR5KSAmJiAhZW50aXR5QXJyYXlEYXRhU291cmNlLmRhdGEubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YUVudGl0eUFycmF5Lm1pc3NpbmdFcnJvck1lc3NhZ2V9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbiAgICA8IS0tLS0tLS0tLS0tLS0tLS0tLSBoYXMgbWFueSAtLS0tLS0tLS0tLS0tLS0tPlxuICAgIDwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4gICAgPGRpdiBjbGFzcz1cImhhc01hbnlcIiAqbmdTd2l0Y2hDYXNlPVwiRGVjb3JhdG9yVHlwZXMuSEFTX01BTllcIj5cbiAgICAgICAgPGgyIGNsYXNzPVwidGl0bGVcIj57e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGl0bGV9fTwvaDI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiY29sLWxnLTggY29sLW1kLTYgY29sLXNtLTEyXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEuc2VhcmNoTGFiZWx9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCAoa2V5dXApPVwiYXBwbHlIYXNNYW55RmlsdGVyKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJtZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtbGctMl09XCJoYXNNYW55QWxsb3dDcmVhdGVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtbGctNF09XCIhaGFzTWFueUFsbG93Q3JlYXRlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuY29sLW1kLTNdPVwiaGFzTWFueUFsbG93Q3JlYXRlXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuY29sLW1kLTZdPVwiIWhhc01hbnlBbGxvd0NyZWF0ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1zbS02XT1cImhhc01hbnlBbGxvd0NyZWF0ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1zbS0xMl09XCIhaGFzTWFueUFsbG93Q3JlYXRlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFjdGlvbnMtYnV0dG9uXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAge3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9uc0xhYmVsfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJtZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLmFsbG93SnNvbkltcG9ydFwiIHR5cGU9XCJidXR0b25cIiBbZGlzYWJsZWRdPVwiaGFzTWFueVRhYmxlQWN0aW9uRGlzYWJsZWQoaGFzTWFueUltcG9ydEFjdGlvbilcIiAoY2xpY2spPVwicnVuSGFzTWFueVRhYmxlQWN0aW9uKGhhc01hbnlJbXBvcnRBY3Rpb24pXCIgbWF0LW1lbnUtaXRlbT5cbiAgICAgICAgICAgICAgICAgICAge3toYXNNYW55SW1wb3J0QWN0aW9uLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIG1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zXCIgW2Rpc2FibGVkXT1cImhhc01hbnlUYWJsZUFjdGlvbkRpc2FibGVkKGFjdGlvbilcIiAoY2xpY2spPVwicnVuSGFzTWFueVRhYmxlQWN0aW9uKGFjdGlvbilcIiBtYXQtbWVudS1pdGVtPlxuICAgICAgICAgICAgICAgICAgICB7e2FjdGlvbi5kaXNwbGF5TmFtZX19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1tZW51PlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJoYXNNYW55QWxsb3dDcmVhdGVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtbGctMl09XCJtZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmJhc2VEYXRhLnRhYmxlQWN0aW9ucy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5jb2wtbGctNF09XCIhbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuY29sLW1kLTNdPVwibWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuY29sLW1kLTZdPVwiIW1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1zbS02XT1cIm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuYmFzZURhdGEudGFibGVBY3Rpb25zLmxlbmd0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmNvbC1zbS0xMl09XCIhbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS50YWJsZUFjdGlvbnMubGVuZ3RoXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNyZWF0ZS1idXR0b25cIiAoY2xpY2spPVwiY3JlYXRlSGFzTWFueUVudGl0eSgpXCIgbWF0LXJhaXNlZC1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5jcmVhdGVCdXR0b25MYWJlbH19XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejggZWxldmF0aW9uLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJoYXNNYW55RGF0YVNvdXJjZVwiIG1hdFNvcnQ+XG4gICAgICAgICAgICAgICAgPCEtLSBzZWxlY3QgQ29sdW1uIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiJGV2ZW50ID8gU2VsZWN0aW9uVXRpbGl0aWVzLm1hc3RlclRvZ2dsZShoYXNNYW55U2VsZWN0aW9uLCBoYXNNYW55RGF0YVNvdXJjZSkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJoYXNNYW55U2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgU2VsZWN0aW9uVXRpbGl0aWVzLmlzQWxsU2VsZWN0ZWQoaGFzTWFueVNlbGVjdGlvbiwgaGFzTWFueURhdGFTb3VyY2UpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJoYXNNYW55U2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIVNlbGVjdGlvblV0aWxpdGllcy5pc0FsbFNlbGVjdGVkKGhhc01hbnlTZWxlY3Rpb24sIGhhc01hbnlEYXRhU291cmNlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZW50aXR5XCIgY2xhc3M9XCJlbmFibGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiJGV2ZW50ID8gaGFzTWFueVNlbGVjdGlvbi50b2dnbGUoZW50aXR5KSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImhhc01hbnlTZWxlY3Rpb24uaXNTZWxlY3RlZChlbnRpdHkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRDb2wgb2YgbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5kaXNwbGF5Q29sdW1uc1wiIFttYXRDb2x1bW5EZWZdPVwiZENvbC5kaXNwbGF5TmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ZENvbC5kaXNwbGF5TmFtZX19XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgW2NsYXNzLmVuYWJsZWRdPVwiIWRDb2wuZGlzYWJsZUNsaWNrICYmIChoYXNNYW55QWxsb3dVcGRhdGUoZW50aXR5KSB8fCBoYXNNYW55QWxsb3dSZWFkKGVudGl0eSkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0SGFzTWFueUVudGl0eShlbnRpdHksIGRDb2wpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IGVudGl0eVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkQ29sLkNvbXBvbmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5LWNvbHVtbi12YWx1ZSBbZW50aXR5XT1cImVudGl0eVwiIFtDb21wb25lbnRDbGFzc109XCJkQ29sLkNvbXBvbmVudFwiPjwvZGlzcGxheS1jb2x1bW4tdmFsdWU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZENvbC5Db21wb25lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2dldERpc3BsYXlDb2x1bW5WYWx1ZShlbnRpdHksIGRDb2wpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRIYXNNYW55Q29sdW1uc1wiPjwvbWF0LWhlYWRlci1yb3c+XG4gICAgICAgICAgICAgICAgPG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXllZEhhc01hbnlDb2x1bW5zXCI+PC9tYXQtcm93PlxuICAgICAgICAgICAgPC9tYXQtdGFibGU+XG5cbiAgICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImhhc01hbnlJc0xvYWRpbmcgJiYgbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5iYXNlRGF0YS5kaXNwbGF5TG9hZGluZ1NwaW5uZXJcIj5cbiAgICAgICAgICAgIDwvbWF0LXNwaW5uZXI+XG5cbiAgICAgICAgICAgIDxtYXQtcGFnaW5hdG9yIFtsZW5ndGhdPVwiaGFzTWFueURhdGFTb3VyY2UuZmlsdGVyZWREYXRhLmxlbmd0aFwiIFtwYWdlSW5kZXhdPVwiMFwiIFtwYWdlU2l6ZV09XCIxMFwiIFtwYWdlU2l6ZU9wdGlvbnNdPVwiWzUsIDEwLCAyNSwgNTBdXCI+PC9tYXQtcGFnaW5hdG9yPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nU3dpdGNoRGVmYXVsdD5FUlJPUjogVGhlIHR5cGUge3t0eXBlfX0gaXMgbm90IGtub3duLjwvZGl2PlxuPC9kaXY+XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLUFkZCBBcnJheSBJdGVtIERpYWxvZy0tLS0tLS0tLS0tLS0tLS0+XG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjxuZy10ZW1wbGF0ZSAjYWRkQXJyYXlJdGVtRGlhbG9nPlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtZGlhbG9nLXRpdGxlXCI+XG4gICAgICAgIDxkaXY+e3thZGRBcnJheUl0ZW1EaWFsb2dEYXRhLnRpdGxlfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxmb3JtPlxuICAgICAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJhcnJheUl0ZW1EaWFsb2dUYWJzLmxlbmd0aCA+IDFcIiBwcmVzZXJ2ZUNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPG1hdC10YWIgKm5nRm9yPVwibGV0IHRhYiBvZiBhcnJheUl0ZW1EaWFsb2dUYWJzXCIgW2xhYmVsXT1cInRhYi50YWJOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYi5yb3dzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdy5rZXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cImFycmF5SXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtnZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXT1cImludGVybmFsR2V0VmFsaWRhdGlvbkVycm9yTWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdsZycpfX0gY29sLW1kLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnbWQnKX19IGNvbC1zbS17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tJc0FycmF5SXRlbVZhbGlkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ3gtbWF0LWVudGl0eS1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgIFxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFycmF5SXRlbURpYWxvZ1RhYnMubGVuZ3RoIDw9IDFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBhcnJheUl0ZW1EaWFsb2dUYWJzWzBdLnJvd3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdy5rZXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiYXJyYXlJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2dldFZhbGlkYXRpb25FcnJvck1lc3NhZ2VdPVwiaW50ZXJuYWxHZXRWYWxpZGF0aW9uRXJyb3JNZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWxnLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdzbScpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tJc0FycmF5SXRlbVZhbGlkKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgXG4gICAgICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiYWRkQXJyYXlJdGVtKClcIiBbZGlzYWJsZWRdPVwiIWlzQXJyYXlJdGVtVmFsaWRcIj5cbiAgICAgICAgICAgICAgICB7e2FkZEFycmF5SXRlbURpYWxvZ0RhdGEuY3JlYXRlQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiY2xvc2VBZGRBcnJheUl0ZW1EaWFsb2coKVwiIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgIHt7YWRkQXJyYXlJdGVtRGlhbG9nRGF0YS5jYW5jZWxCdXR0b25MYWJlbH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPC9mb3JtPlxuXG48L25nLXRlbXBsYXRlPlxuXG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS1FZGl0IEFycmF5IEl0ZW0gRGlhbG9nLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPG5nLXRlbXBsYXRlICNlZGl0QXJyYXlJdGVtRGlhbG9nPlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtZGlhbG9nLXRpdGxlXCI+XG4gICAgICAgIDxkaXY+e3tlZGl0QXJyYXlJdGVtRGlhbG9nRGF0YS50aXRsZShhcnJheUl0ZW1QcmlvckNoYW5nZXMpfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8Zm9ybT5cbiAgICAgICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwiYXJyYXlJdGVtRGlhbG9nVGFicy5sZW5ndGggPiAxXCIgcHJlc2VydmVDb250ZW50PlxuICAgICAgICAgICAgICAgIDxtYXQtdGFiICpuZ0Zvcj1cImxldCB0YWIgb2YgYXJyYXlJdGVtRGlhbG9nVGFic1wiIFtsYWJlbF09XCJ0YWIudGFiTmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiB0YWIucm93c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VudGl0eV09XCJhcnJheUl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdsZycpfX0gY29sLW1kLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnbWQnKX19IGNvbC1zbS17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tBcnJheUl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzUmVhZE9ubHldPVwiaXNQcm9wZXJ0eVJlYWRPbmx5KGFycmF5SXRlbSwga2V5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC10YWI+XG4gICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgICAgIFxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFycmF5SXRlbURpYWxvZ1RhYnMubGVuZ3RoIDw9IDFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBhcnJheUl0ZW1EaWFsb2dUYWJzWzBdLnJvd3NcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5neC1tYXQtZW50aXR5LWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdy5rZXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiYXJyYXlJdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yRWRpdF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWxnLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGFycmF5SXRlbSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChhcnJheUl0ZW0sIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoYXJyYXlJdGVtLCBrZXksICdzbScpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tBcnJheUl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpc1Byb3BlcnR5UmVhZE9ubHkoYXJyYXlJdGVtLCBrZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICBcbiAgICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJzYXZlQXJyYXlJdGVtKClcIiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiaW50ZXJuYWxJc1JlYWRPbmx5IHx8ICFpc0FycmF5SXRlbVZhbGlkIHx8ICFpc0FycmF5SXRlbURpcnR5XCI+XG4gICAgICAgICAgICAgICAge3tlZGl0QXJyYXlJdGVtRGlhbG9nRGF0YS5jb25maXJtQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiY2xvc2VFZGl0QXJyYXlJdGVtRGlhbG9nKClcIiBjbGFzcz1cImNhbmNlbC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICB7e2VkaXRBcnJheUl0ZW1EaWFsb2dEYXRhLmNhbmNlbEJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L21hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICA8L2Zvcm0+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS1DcmVhdGUgSGFzIE1hbnkgRGlhbG9nLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPG5nLXRlbXBsYXRlICNjcmVhdGVIYXNNYW55RGlhbG9nPlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtZGlhbG9nLXRpdGxlXCI+XG4gICAgICAgIDxkaXY+e3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmNyZWF0ZURpYWxvZ0RhdGEudGl0bGV9fTwvZGl2PlxuICAgIDwvZGl2PlxuICAgIFxuICAgIDxmb3JtPlxuICAgICAgICA8bWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJoYXNNYW55Q3JlYXRlVGFicy5sZW5ndGggPiAxXCIgcHJlc2VydmVDb250ZW50PlxuICAgICAgICAgICAgICAgIDxtYXQtdGFiICpuZ0Zvcj1cImxldCB0YWIgb2YgaGFzTWFueUNyZWF0ZVRhYnNcIiBbbGFiZWxdPVwidGFiLnRhYk5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiICpuZ0Zvcj1cImxldCByb3cgb2YgdGFiLnJvd3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBrZXkgb2Ygcm93LmtleXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbnRpdHldPVwiaGFzTWFueUVudGl0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpZGVPbWl0Rm9yQ3JlYXRlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLWxnLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGhhc01hbnlFbnRpdHksIGtleSwgJ2xnJyl9fSBjb2wtbWQte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoaGFzTWFueUVudGl0eSwga2V5LCAnbWQnKX19IGNvbC1zbS17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChoYXNNYW55RW50aXR5LCBrZXksICdzbScpfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImNoZWNrSXNIYXNNYW55RW50aXR5VmFsaWQoJ2NyZWF0ZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgICAgXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzTWFueUNyZWF0ZVRhYnMubGVuZ3RoIDw9IDFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBoYXNNYW55Q3JlYXRlVGFic1swXS5yb3dzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cImhhc01hbnlFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JDcmVhdGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1sZy17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChoYXNNYW55RW50aXR5LCBrZXksICdsZycpfX0gY29sLW1kLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGhhc01hbnlFbnRpdHksIGtleSwgJ21kJyl9fSBjb2wtc20te3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoaGFzTWFueUVudGl0eSwga2V5LCAnc20nKX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChpbnB1dENoYW5nZUV2ZW50KT1cImNoZWNrSXNIYXNNYW55RW50aXR5VmFsaWQoJ2NyZWF0ZScpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtZW50aXR5LWlucHV0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICBcbiAgICAgICAgPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIChjbGljayk9XCJkaWFsb2dDcmVhdGVIYXNNYW55KClcIiBtYXQtcmFpc2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwiIWlzSGFzTWFueUVudGl0eVZhbGlkXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmNyZWF0ZURpYWxvZ0RhdGEuY3JlYXRlQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiZGlhbG9nQ2FuY2VsQ3JlYXRlSGFzTWFueSgpXCIgY2xhc3M9XCJjYW5jZWwtYnV0dG9uXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmNyZWF0ZURpYWxvZ0RhdGEuY2FuY2VsQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvZm9ybT5cbiAgICBcbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZWRpdEhhc01hbnlEaWFsb2c+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1kaWFsb2ctdGl0bGVcIj5cbiAgICAgICAgPGRpdj57e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEudGl0bGUoaGFzTWFueUVudGl0eVByaW9yQ2hhbmdlcyl9fTwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIm1ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuYWN0aW9ucy5sZW5ndGhcIiB0eXBlPVwiYnV0dG9uXCIgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICB7e21ldGFkYXRhSGFzTWFueS50YWJsZURhdGEuZWRpdERhdGEuYWN0aW9uc0xhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1tZW51ICNtZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgbWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS5hY3Rpb25zXCIgW2Rpc2FibGVkXT1cImhhc01hbnlFZGl0QWN0aW9uRGlzYWJsZWQoYWN0aW9uKVwiIChjbGljayk9XCJoYXNNYW55UnVuRWRpdEFjdGlvbihhY3Rpb24pXCIgbWF0LW1lbnUtaXRlbT5cbiAgICAgICAgICAgICAgICAgICAge3thY3Rpb24uZGlzcGxheU5hbWV9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImhhc01hbnlBbGxvd0RlbGV0ZShoYXNNYW55RW50aXR5KVwiIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJkZWxldGVIYXNNYW55RW50aXR5KClcIiBjb2xvcj1cIndhcm5cIiBjbGFzcz1cImRlbGV0ZS1idXR0b25cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgICAgICAge3ttZXRhZGF0YUhhc01hbnkudGFibGVEYXRhLmVkaXREYXRhLmRlbGV0ZUJ1dHRvbkxhYmVsfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8Zm9ybT5cbiAgICAgICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwiaGFzTWFueVVwZGF0ZVRhYnMubGVuZ3RoID4gMVwiIHByZXNlcnZlQ29udGVudD5cbiAgICAgICAgICAgICAgICA8bWF0LXRhYiAqbmdGb3I9XCJsZXQgdGFiIG9mIGhhc01hbnlVcGRhdGVUYWJzXCIgW2xhYmVsXT1cInRhYi50YWJOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIHRhYi5yb3dzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmd4LW1hdC1lbnRpdHktaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQga2V5IG9mIHJvdy5rZXlzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cImhhc01hbnlFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eUtleV09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaWRlT21pdEZvckVkaXRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoaGFzTWFueUVudGl0eSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChoYXNNYW55RW50aXR5LCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGhhc01hbnlFbnRpdHksIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0Q2hhbmdlRXZlbnQpPVwiY2hlY2tIYXNNYW55RW50aXR5KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpc1JlYWRPbmx5XT1cImlzUHJvcGVydHlSZWFkT25seShoYXNNYW55RW50aXR5LCBrZXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1lbnRpdHktaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LXRhYj5cbiAgICAgICAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgICAgXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzTWFueVVwZGF0ZVRhYnMubGVuZ3RoIDw9IDFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiBoYXNNYW55VXBkYXRlVGFic1swXS5yb3dzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWVudGl0eS1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGtleSBvZiByb3cua2V5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZW50aXR5XT1cImhhc01hbnlFbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5S2V5XT1cImtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGlkZU9taXRGb3JFZGl0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtbGcte3tFbnRpdHlVdGlsaXRpZXMuZ2V0V2lkdGgoaGFzTWFueUVudGl0eSwga2V5LCAnbGcnKX19IGNvbC1tZC17e0VudGl0eVV0aWxpdGllcy5nZXRXaWR0aChoYXNNYW55RW50aXR5LCBrZXksICdtZCcpfX0gY29sLXNtLXt7RW50aXR5VXRpbGl0aWVzLmdldFdpZHRoKGhhc01hbnlFbnRpdHksIGtleSwgJ3NtJyl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRDaGFuZ2VFdmVudCk9XCJjaGVja0hhc01hbnlFbnRpdHkoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNSZWFkT25seV09XCJpc1Byb3BlcnR5UmVhZE9ubHkoaGFzTWFueUVudGl0eSwga2V5KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9uZ3gtbWF0LWVudGl0eS1pbnB1dD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgXG4gICAgICAgIDxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAoY2xpY2spPVwiZGlhbG9nRWRpdEhhc01hbnkoKVwiIG1hdC1yYWlzZWQtYnV0dG9uIFtkaXNhYmxlZF09XCJpbnRlcm5hbElzUmVhZE9ubHkgfHwgIWlzSGFzTWFueUVudGl0eVZhbGlkIHx8ICFpc0hhc01hbnlFbnRpdHlEaXJ0eVwiPlxuICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS5jb25maXJtQnV0dG9uTGFiZWx9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwiZGlhbG9nQ2FuY2VsRWRpdEhhc01hbnkoKVwiIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiPlxuICAgICAgICAgICAgICAgIHt7bWV0YWRhdGFIYXNNYW55LnRhYmxlRGF0YS5lZGl0RGF0YS5jYW5jZWxCdXR0b25MYWJlbH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPC9mb3JtPiAgICBcbjwvbmctdGVtcGxhdGU+Il19
|