@unifylib/ui-lib 1.2.18 → 1.2.19

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.
@@ -374,6 +374,10 @@ export class BaseFormCanvasComponent {
374
374
  }
375
375
  return (CONTROL?.value || CONTROL?.value === 0) && CONTROL?.status === 'INVALID';
376
376
  }
377
+ getFieldCurrentLength(prop) {
378
+ const value = this.formParam?.get([prop])?.value;
379
+ return value === undefined || value === null ? 0 : String(value).length;
380
+ }
377
381
  clearFieldValue(prop) {
378
382
  this.formParam?.get([prop])?.setValue('');
379
383
  }
@@ -737,7 +741,7 @@ export class BaseFormCanvasComponent {
737
741
  },
738
742
  { provide: MAT_DATE_FORMATS, useValue: DD_MM_YYYY_Format },
739
743
  { provide: MAT_DATE_LOCALE, useValue: 'en-GB' }
740
- ], viewQueries: [{ propertyName: "fieldsInput", first: true, predicate: ["EquationValueInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"main-form-canvas\">\n <div class=\"form-wrapper\">\n <ng-container *ngIf=\"defaults\">\n <ng-container *ngIf=\"editable; else readonlyView\" class=\"form-container\">\n <form [formGroup]=\"formParam\" class=\"form-content\">\n <div class=\"form-row\">\n <div class=\"form-column\">\n <ng-container *ngFor=\"let row of screenFields | keyvalue\">\n <div class=\"row-container\">\n <ng-container *ngFor=\"let field of row.value\">\n <div class=\"field-column\" [style.flex]=\"field.fieldSize ? ('0 0 ' + field.fieldSize + '%') : '1 1 0'\">\n <ng-container [ngSwitch]=\"field.type\">\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n\n <mat-form-field appearance=\"outline\">\n <input matInput\n [matDatepicker]=\"picker\"\n [min]=\"minDate\"\n (dateChange)=\"formParam.get(field.property).setValue($event.value)\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n formControlName=\"{{field.property}}\"\n [required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n\n <mat-datepicker-toggle *ngIf=\"!field.readonly\" matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n\n <mat-datepicker #picker\n [startView]=\"getView(field)\"\n (yearSelected)=\"setMonthAndYear($event, picker, field)\"\n panelClass=\"example-month-picker\">\n </mat-datepicker>\n\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'phone-number'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container class=\"custom-ngx-mat-intl-tel-input\" *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <div class=\"phone-input-wrapper\">\n <ngx-mat-intl-tel-input\n formControlName=\"{{ field.property }}\"\n [inputPlaceholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [preferredCountries]=\"['qa']\"\n [enablePlaceholder]=\"true\"\n [enableSearch]=\"true\"\n [onlyCountries]=\"getCountryCodeList()\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n </ngx-mat-intl-tel-input>\n </div>\n\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngSwitchCase=\"'iban-text'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'password'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input matInput\n class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n [type]=\"hide && !field.disabled ? 'password' : 'text'\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <!-- <mat-icon matSuffix-->\n <!-- (click)=\"hide = !hide\">-->\n <!-- {{ hide ? 'visibility_off' : 'visibility' }}-->\n <!-- </mat-icon>-->\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'text'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <mat-icon *ngIf=\"field.showSearchIcon\" matPrefix>search</mat-icon>\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n (keyup)=\"fixArabicNumbers($event.target)\"\n [attr.aria-required]=\"field.required\"\n [maxDigits]=\"field.maxLength\"\n [phoneNumberOnly]=\"field.phoneNumberOnly\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <span\n *ngIf=\"field.showSearchIcon && !field.readonly && (formParam?.get([field.property])?.value ?? '') !== ''\"\n matSuffix\n class=\"clear-icon-suffix\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"clear-icon-button\"\n [attr.aria-label]=\"'BASE_TABLE.clearField' | translate\"\n (click)=\"clearFieldValue(field.property)\">\n <mat-icon aria-hidden=\"true\">close</mat-icon>\n </button>\n </span>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-state-checkbox'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"multi-state-filter\" [formGroup]=\"formParam\">\n <button\n type=\"button\"\n class=\"multi-state-filter__trigger\"\n [matMenuTriggerFor]=\"statusMultiMenu\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"false\"\n [attr.aria-label]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : (field.label | translate)\">\n <span\n class=\"multi-state-filter__trigger-text\"\n [class.multi-state-filter__trigger-text--placeholder]=\"isMultiStateEmpty(field.property)\">\n {{\n getMultiStateFilterTriggerLabel(field)\n || (field.placeholder\n ? (labelKeyPlaceHolder(field) | translate)\n : ('FILTER-BUILDER.selectStatus' | translate))\n }}\n </span>\n <mat-icon class=\"multi-state-filter__chevron\" aria-hidden=\"true\">keyboard_arrow_down</mat-icon>\n </button>\n <mat-menu #statusMultiMenu=\"matMenu\" class=\"multi-state-filter__menu-panel\" [hasBackdrop]=\"true\">\n <div\n class=\"multi-state-filter__menu-inner\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onMultiStateMenuInnerKeydown($event, field)\">\n <div\n *ngFor=\"let code of field.listOptions || []\"\n mat-menu-item\n class=\"multi-state-filter__row\"\n [attr.data-multi-state-code]=\"code\"\n (click)=\"onMultiStateRowClick($event, field.property, code)\">\n <mat-checkbox\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation()\"\n [checked]=\"isMultiStateSelected(field.property, code)\"\n (change)=\"toggleMultiStateFilter(field.property, code, $event.checked)\">\n </mat-checkbox>\n <span\n class=\"multi-state-filter__pill stateType\"\n [ngClass]=\"code\">\n {{ statusOptionLabelKey(field, code) | translate }}\n </span>\n </div>\n </div>\n </mat-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip-list'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n\n <mat-chip-grid [attr.aria-labelledby]=\"'label-' + field.property\"\n formControlName=\"{{ field.property }}\">\n <mat-chip-row\n *ngFor=\"let mail of splittedChips(formParam, field.property); let idx = index\"\n [removable]=\"removable\"\n (removed)=\"removeChipsItem(formParam, field.property, idx)\">\n {{ mail }}\n <mat-icon matChipRemove *ngIf=\"removable\">cancel</mat-icon>\n </mat-chip-row>\n\n <input [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [matChipInputFor]=\"null\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\"\n (matChipInputTokenEnd)=\"addEmailToChips($event, formParam, field.property)\">\n </mat-chip-grid>\n <mat-error id=\"error-{{ field.property }}\" *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'amount'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"amountReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n type=\"number\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'sequence'\">\n <ng-container\n *ngIf=\"referenceAttributeTrue(field.property, 'autoGenerated'); else noSequence\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"true\"\n [disabled]=\"true\"\n [attr.aria-labelledby]=\"'label-' + field.property\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n\n <ng-template #noSequence>\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [readonly]=\"false\"\n [disabled]=\"false\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [required]=\"field.required\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-template>\n\n <ng-container *ngSwitchCase=\"'textarea'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textareaReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <textarea cdkFocusInitial\n formControlName=\"{{ field.property }}\"\n matInput\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"3\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [maxDigits]=\"field.maxLength\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"></textarea>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'number'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"numberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n type=\"number\"\n [attr.min]=\"field.allowNegative ? null : 0\"\n (keydown)=\"blockNegativeNumberKeydown($event, field)\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [maxDigits]=\"field.maxLength\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [required]=\"field.readonly ? false : field.required\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [pattern]=\"field.pattern\">\n <mat-error id=\"error-{{ field.property }}\" *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"numberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input\n matInput\n type=\"text\"\n inputmode=\"numeric\"\n formControlName=\"{{ field.property }}\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [numbersOnly]=\"true\" [maxDecimals]=\"field.maxDecimals\"\n [maxDigits]=\"field.maxLength\"\n [pattern]=\"field.pattern\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [required]=\"field.readonly ? false : field.required\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\">\n <mat-error id=\"error-{{ field.property }}\" *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'time'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"timeReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input\n #timeInput\n matInput\n class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n type=\"time\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [required]=\"field.required\">\n <span *ngIf=\"!field.readonly\" matSuffix class=\"mat-datepicker-toggle time-picker-toggle\">\n <button\n type=\"button\"\n mat-icon-button\n class=\"time-picker-toggle-button\"\n [attr.aria-label]=\"field.label! | translate\"\n (click)=\"openTimePicker(timeInput); $event.stopPropagation()\">\n <mat-icon>schedule</mat-icon>\n </button>\n </span>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"checkboxReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <mat-checkbox\n appearance=\"outline\"\n style=\"padding-bottom: 14px; padding-top: 14px;\"\n [disabled]=\"field.readonly\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n formControlName=\"{{ field.property }}\">\n {{ field.label! | translate }}\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-checkbox>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'toggle'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"toggleReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-slide-toggle\n [disabled]=\"field.readonly\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n formControlName=\"{{ field.property }}\">\n </mat-slide-toggle>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'color-picker'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center\">\n <h4 style=\"margin-right: 10px\">{{ field.label! | translate }}</h4>\n <input\n ejs-colorpicker\n type=\"color\"\n id=\"colorpicker\"\n formControlName=\"{{ field.property }}\"\n [attr.aria-label]=\"field.label! | translate\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n />\n </div>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"radioButtonReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <mat-radio-group\n formControlName=\"{{field.property}}\"\n class=\"app-radio\"\n [attr.aria-label]=\"field.label! | translate\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <div class=\"field-row\">\n <div class=\"field-label\">\n <span class=\"custom-label\">{{ field.label! | translate }}</span>\n </div>\n <div class=\"field-input\">\n <div class=\"radio-group-custom\">\n <mat-radio-button\n *ngFor=\"let option of field.listOptions\"\n [value]=\"option\"\n [attr.aria-labelledby]=\"option\">\n {{ option | translate }}\n </mat-radio-button>\n </div>\n </div>\n </div>\n\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-radio-group>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"listReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\" style=\"width: 100%\">\n <mat-select\n formControlName=\"{{field.property}}\"\n [attr.aria-label]=\"field.label! | translate\"\n [attr.aria-required]=\"field.required\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [disabled]=\"field.readonly\"\n [multiple]=\"field.multi || false\"\n [required]=\"field.readonly ? false : field.required\"\n [(value)]=\"field.defaultListOption\">\n <ng-container *ngIf=\"field.translate; else lookup_no_translation\">\n <mat-option\n *ngFor=\"let item of field.listOptions; let i = index\"\n [value]=\"item\">\n {{ friendlyName(field.label, field.property, item) | translate }}\n </mat-option>\n </ng-container>\n <ng-template #lookup_no_translation>\n <mat-option\n *ngFor=\"let item of field.listOptions\"\n [value]=\"item\">\n {{ getOptionValue(item) }}\n </mat-option>\n </ng-template>\n </mat-select>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'attachment'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <app-attachment-uploader\n [acceptedTypes]=\"getAcceptedFileTypes(field)\"\n [ariaDescribedBy]=\"showError(field.property) ? 'error-' + field.property : null\"\n (fileSelected)=\"onAttachmentFileSelected($event, field)\"\n style=\"margin-top: 5px\">\n </app-attachment-uploader>\n </ng-container>\n <mat-error class=\"iq-error\"\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'lookup'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"lookupReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <app-auto-complete\n [form]=\"formParam\"\n [field]=\"field\"\n [supportingAttributes]=\"supportingAttributes\"\n [defaultValue]=\"this.formParam.get(field.property)?.value\"\n (selectedValue)=\"patchLookupValue($event, field.property)\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </app-auto-complete>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'currency'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"currencyReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <!-- Uncomment and use the currency control when ready -->\n <!-- <app-currency\n [form]=\"formParam\"\n [field]=\"field\"\n [defaultValue]=\"this.formParam.get(field.property)?.value\"\n (selectedValue)=\"patchCurrencyValue($event, field.property)\">\n </app-currency> -->\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-select'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"multiSelectReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <app-multi-auto-complete\n [form]=\"formParam\"\n [field]=\"field\"\n [labelsSection]=\"pageInfo.labelsSection\"\n [defaultValue]=\"getMultiValue(field)\"\n (selectedValue)=\"patchMultiSelectValue($event, field.property)\">\n </app-multi-auto-complete>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngSwitchCase=\"'rich-text'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <!-- Uncomment and use the rich text editor when ready -->\n <!-- <ckeditor\n [editor]=\"Editor\"\n [disabled]=\"field.readonly\"\n formControlName=\"{{field.property}}\">\n </ckeditor> -->\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'divider'\">\n <mat-divider></mat-divider>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'hyper-text'\">\n <div>\n <mat-label\n (click)=\"getHyperTextEvent()\"\n class=\"hyper-link\">\n {{ field.label! | translate }}\n </mat-label>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'section-title'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div class=\"hrdivider-mid\">\n <span>{{ field.label | translate }}</span>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'equation-builder'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\" dir=\"ltr\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n <!-- <ng-container *ngSwitchCase=\"'equation-builder'\" [formGroup]=\"formParam\">-->\n <!-- <ng-container *ngIf=\"showField(defaults, field)\">-->\n <!-- <ng-container *ngIf=\"!workflowEditableField(field)\">-->\n <!-- <ng-container-->\n <!-- [ngTemplateOutlet]=\"dateReadonly\"-->\n <!-- [ngTemplateOutletContext]=\"{ field: field }\">-->\n <!-- </ng-container>-->\n <!-- </ng-container>-->\n <!-- <ng-container *ngIf=\"workflowEditableField(field)\">-->\n <!-- <div style=\"display: flex; width: 350%\">-->\n <!-- <mat-label>{{ field.label! | translate }}</mat-label>-->\n <!-- <mat-form-field style=\"width: 400%\" appearance=\"outline\">-->\n <!-- <mat-chip-grid #chipGrid>-->\n <!-- <ng-container *ngFor=\"let equationValue of equationValues(); let i = index\">-->\n <!-- <mat-chip-row (removed)=\"remove(equationValue, i)\">-->\n <!-- {{ equationValue }}-->\n <!-- <button-->\n <!-- matChipRemove-->\n <!-- [attr.aria-label]=\"'remove ' + equationValue\">-->\n <!-- <mat-icon>cancel</mat-icon>-->\n <!-- </button>-->\n <!-- </mat-chip-row>-->\n <!-- </ng-container>-->\n <!-- </mat-chip-grid>-->\n <!-- <input-->\n <!-- [(ngModel)]=\"currentEquationValue\"-->\n <!-- [matChipInputFor]=\"chipGrid\"-->\n <!-- [matAutocomplete]=\"auto\"-->\n <!-- [ngModelOptions]=\"{ standalone: true }\"-->\n <!-- [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"-->\n <!-- (matChipInputTokenEnd)=\"add($event)\"-->\n <!-- aria-label=\"Add equation value\" />-->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">-->\n <!-- <ng-container *ngFor=\"let filteredField of (equationFilteredFields() | async)\">-->\n <!-- <mat-option [value]=\"filteredField\">{{ filteredField }}</mat-option>-->\n <!-- </ng-container>-->\n <!-- </mat-autocomplete>-->\n <!-- </mat-form-field>-->\n <!-- </div>-->\n <!-- <mat-error class=\"iq-error\" *ngIf=\"showError(field.property)\" aria-live=\"assertive\">-->\n <!-- {{ getErrors(field.property) | translate }}-->\n <!-- </mat-error>-->\n <!-- </ng-container>-->\n <!-- </ng-container>-->\n <!-- </ng-container>-->\n\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </form>\n </ng-container>\n </ng-container>\n </div>\n\n</div>\n<ng-template #dateReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <ng-container *ngIf=\"isReadonlyTextValueEmpty(defaults, field) && field.emptyReadonlyPlaceholderKey; else dateReadonlyHasValue\">\n <span class=\"readonly-value readonly-value--empty\">{{ field.emptyReadonlyPlaceholderKey | translate }}</span>\n </ng-container>\n <ng-template #dateReadonlyHasValue>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) | date: getReadonlyDateFormat(field) }}</span>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #timeReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ formatTimeToDate(defaults[field.property]) | date: 'shortTime' }}</span>\n </div>\n</ng-template>\n\n<ng-template #phoneNumberReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #textReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\" *ngIf=\"!field.advancedFilter\"></label>\n <ng-container *ngIf=\"isReadonlyTextValueEmpty(defaults, field) && field.emptyReadonlyPlaceholderKey; else textReadonlyHasValue\">\n <span class=\"readonly-value readonly-value--empty\">{{ field.emptyReadonlyPlaceholderKey | translate }}</span>\n </ng-container>\n <ng-template #textReadonlyHasValue>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #textareaReadonly let-field=\"field\">\n <ng-container *ngIf=\"field.textFormat === 'json'; else normalText\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <div class=\"readonly-value json-viewer\">\n <ngx-json-viewer [json]=\"extractJsonFieldName(defaults, field.property)\" [expanded]=\"true\"></ngx-json-viewer>\n </div>\n </div>\n </ng-container>\n <ng-template #normalText>\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #numberReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #currencyReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #radioButtonReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ translateLable(defaults[field.property]) }}</span>\n </div>\n</ng-template>\n\n<ng-template #richTextReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\" [innerHtml]=\"extractFieldName(defaults, field.property)\"></span>\n </div>\n</ng-template>\n\n<ng-template #checkboxReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n <mat-icon color=\"warn\" *ngIf=\"extractFieldName(defaults, field.property); else showNo\">done</mat-icon>\n <ng-template #showNo>\n <mat-icon color=\"warn\">close</mat-icon>\n </ng-template>\n </span>\n </div>\n</ng-template>\n\n<ng-template #toggleReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n <mat-icon color=\"warn\" *ngIf=\"extractFieldName(defaults, field.property); else showNo\">done</mat-icon>\n <ng-template #showNo>\n <mat-icon color=\"warn\">close</mat-icon>\n </ng-template>\n </span>\n </div>\n</ng-template>\n\n<ng-template #listReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\" *ngIf=\"field.translate; else noTranslate\">\n {{ listShowValue(defaults, field) | translate }}\n </span>\n <ng-template #noTranslate>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #sequenceReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #lookupReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n {{ extractFieldName(defaults, field.property)?.[translateService.getDefaultLang() === 'en' ? 'englishName' : 'arabicName'] }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #amountReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n {{ extractFieldName(defaults, field.property) | currency: currency }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #multiSelectReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <mat-chip-grid class=\"readonly-value chipList\">\n <mat-chip *ngFor=\"let filedProp of showMultiSelectValuesAsReadonly(field)\">\n {{ filedProp }}\n </mat-chip>\n </mat-chip-grid>\n </div>\n</ng-template>\n\n<ng-template #chipListReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHTML]=\"field.label | translate\"></label>\n <mat-chip-listbox class=\"readonly-value chipList\">\n <mat-chip-option *ngFor=\"let loc of splitReadonly(extractFieldName(defaults, field.property))\"\n [selectable]=\"true\"\n color=\"warn\"\n [removable]=\"false\">\n {{ loc }}\n </mat-chip-option>\n </mat-chip-listbox>\n </div>\n</ng-template>\n\n\n<ng-template #readonlyView>\n <div class=\"row-wrapper\">\n <div class=\"column-wrapper\">\n <ng-container *ngFor=\"let row of screenFields | keyvalue\">\n <div class=\"row-container\">\n <ng-container *ngFor=\"let field of row.value\">\n <div class=\"field-column readonly-item\" [style.flex]=\"field.fieldSize ? ('0 0 ' + field.fieldSize + '%') : '1 1 0'\">\n\n <ng-container [ngSwitch]=\"field.type\">\n\n <ng-container *ngSwitchCase=\"'attachment'\">\n <ng-container *ngIf=\"isAttachmentFieldEditable && showField(defaults, field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n </div>\n <app-attachment-uploader\n [acceptedTypes]=\"getAcceptedFileTypes(field)\"\n [ariaDescribedBy]=\"showError(field.property) ? 'error-' + field.property : null\"\n (fileSelected)=\"onAttachmentFileSelected($event, field)\"\n style=\"margin-top: 5px\">\n </app-attachment-uploader>\n <mat-error class=\"iq-error\"\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container [ngTemplateOutlet]=\"dateReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'time'\">\n <ng-container [ngTemplateOutlet]=\"timeReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'phone-number'\">\n <ng-container [ngTemplateOutlet]=\"phoneNumberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'text'\">\n <ng-container [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'textarea'\">\n <ng-container [ngTemplateOutlet]=\"textareaReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'number'\">\n <ng-container [ngTemplateOutlet]=\"numberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'currency'\">\n <ng-container [ngTemplateOutlet]=\"currencyReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <ng-container [ngTemplateOutlet]=\"radioButtonReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <ng-container [ngTemplateOutlet]=\"checkboxReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'toggle'\">\n <ng-container [ngTemplateOutlet]=\"toggleReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'status'\">\n <ng-container [ngTemplateOutlet]=\"checkboxReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'lookup'\">\n <ng-container [ngTemplateOutlet]=\"lookupReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'amount'\">\n <ng-container [ngTemplateOutlet]=\"amountReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-select'\">\n <ng-container [ngTemplateOutlet]=\"multiSelectReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip-list'\">\n <ng-container [ngTemplateOutlet]=\"chipListReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'sequence'\">\n <ng-container [ngTemplateOutlet]=\"sequenceReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ng-container [ngTemplateOutlet]=\"listReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-state-checkbox'\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" *ngIf=\"!field.hideLabel\" [innerHtml]=\"field.label | translate\"></label>\n <span class=\"readonly-value\">{{ getMultiStateReadonlySummary(field, defaults) }}</span>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'iban-text'\">\n <p class=\"label\">\n <span [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></span>\n <span> : </span>\n <span class=\"value\" [innerHtml]=\"extractFieldName(defaults, field.property)\"></span>\n </p>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'section-title'\">\n <div class=\"hrdivider-mid\">\n <span>{{ field.label | translate }}</span>\n </div>\n </ng-container>\n\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n\n", styles: [".main-form-canvas{display:flex;flex-direction:row;gap:10px;align-items:flex-start;justify-content:flex-start;width:100%;flex-wrap:wrap}.form-wrapper{display:flex;flex-direction:column;flex:1}.form-container{display:flex;flex-direction:column;width:100%}.row-container{display:flex;flex-direction:row;gap:20px;flex-wrap:wrap;width:100%}.field-column{display:flex;flex-direction:column;flex:1}.label-and-asterisk-container{display:flex;align-items:center;gap:4px}.optional-text{color:#9b9b9b;font-size:11px;font-weight:400;line-height:1.4}.full-width{width:100%}.readonly-item{display:flex;flex-direction:column;align-items:flex-start;gap:2px;font-size:14px;padding:4px 0;width:100%;.readonly-label{font-weight:500;color:#9b9b9b;font-size:14px}.readonly-value{font-weight:500;color:#222;word-break:break-word;font-size:14px}.readonly-value--empty{font-style:italic;font-weight:500;color:#6b7280}.json-viewer{width:100%}.chipList{display:flex;flex-wrap:wrap;gap:4px}mat-icon{font-size:18px;vertical-align:middle}}.row-wrapper{display:flex;flex-direction:row;gap:20px;width:100%;flex-wrap:wrap}.column-wrapper{display:flex;flex-direction:column;width:100%;align-items:flex-start}.row-container{display:flex;flex-direction:row;gap:20px;width:100%;flex-wrap:wrap}.field-column{display:flex;flex-direction:column;min-width:50px!important}.field-row{display:flex;flex-direction:row;gap:10px;width:100%;align-items:flex-start}.field-label{flex:0 0 40%;display:flex;flex-direction:column;justify-content:center}.field-input{flex:0 0 60%;display:flex;flex-direction:column}.radio-group-custom{display:flex;flex-direction:row;flex-wrap:wrap;gap:10px}.clear-icon-button{width:40px!important;height:40px!important;min-width:40px!important;padding:8px!important;margin:0!important;margin-inline-start:4px!important;display:flex!important;align-items:center!important;justify-content:center!important;cursor:pointer!important}.clear-icon-button mat-icon{width:24px!important;height:24px!important;font-size:24px!important;line-height:24px!important;margin-top:0!important}.clear-icon-suffix{display:flex!important;align-items:center!important;align-content:center!important;height:100%!important}@media (max-width: 600px){.main-form-canvas{flex-direction:column}.row-container{flex-direction:column;gap:10px}.field-column{width:100%;flex:1 1 100%!important}.column-wrapper{align-items:center}.field-row{flex-direction:column}.field-label,.field-input{flex:1 1 100%}.radio-group-custom{flex-direction:column;gap:5px}}.custom-ngx-mat-intl-tel-input[readonly] input,.custom-ngx-mat-intl-tel-input.ngx-mat-intl-tel-input input[disabled]{pointer-events:none!important;background-color:#f5f5f5!important;color:#444!important}.custom-ngx-mat-intl-tel-input .iti__flag-container,.custom-ngx-mat-intl-tel-input .iti__selected-flag{pointer-events:none!important;opacity:.6}.custom-ngx-mat-intl-tel-input{pointer-events:none!important}::ng-deep .mat-datepicker-content-container mat-calendar.example-month-picker~.mat-datepicker-close-button{display:none!important}.time-picker-toggle .time-picker-toggle-button{--mdc-icon-button-state-layer-size: 40px;width:40px;height:40px;padding:0}.time-picker-toggle .mat-icon{width:20px;height:20px;font-size:20px}@media (max-width: 960px){.row-wrapper,.row-container{flex-direction:column}.row-container{gap:15px}.field-column{flex:1 1 100%!important}}.multi-state-filter{display:flex;flex-direction:column;align-items:flex-start}.multi-state-filter__trigger{display:flex;align-items:center;justify-content:space-between;gap:4px;min-height:45px;padding:0 16px;margin:0;border:1px solid #b7b7b7;border-radius:8px;background:#fff;cursor:pointer;font-family:inherit;font-size:16px;font-weight:300;line-height:1.2;color:#000;box-sizing:border-box;width:100%}.multi-state-filter__trigger:focus-visible{outline:2px solid #0d4261;outline-offset:2px}.multi-state-filter__trigger-text{flex:1 1 auto;text-align:left;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}.multi-state-filter__trigger-text--placeholder{color:#888}:host ::ng-deep .mat-mdc-select-placeholder{color:#888!important}.multi-state-filter__chevron{flex-shrink:0;width:24px;height:24px;font-size:24px;color:#0d4261}::ng-deep .multi-state-filter__menu-panel{max-width:320px;min-width:250px}.multi-state-filter__menu-inner{padding:4px 0}.multi-state-filter__row{display:flex;align-items:center;gap:8px;min-height:28px;max-height:34px;padding:4px 8px;box-sizing:border-box}.multi-state-filter__pill{display:inline-flex;align-items:center;justify-content:center;min-height:24px;padding:0 16px;font-size:14px;font-weight:400;line-height:1.2;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i9.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "directive", type: MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "component", type: MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled", "tabIndex"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "directive", type: MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: PhoneNumberOnlyDirective, selector: "[phoneNumberOnly]", inputs: ["phoneNumberOnly"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "ngmodule", type: NgxJsonViewerModule }, { kind: "component", type: i10.NgxJsonViewerComponent, selector: "ngx-json-viewer", inputs: ["json", "expanded", "depth", "_currentDepth"] }, { kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "component", type: NgxMatIntlTelInputComponent, selector: "ngx-mat-intl-tel-input", inputs: ["preferredCountries", "enablePlaceholder", "inputPlaceholder", "cssClass", "name", "onlyCountries", "errorStateMatcher", "enableSearch", "searchPlaceholder", "describedBy", "format", "placeholder", "required", "disabled"], outputs: ["countryChanged"] }, { kind: "component", type: MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "component", type: MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "component", type: MultiAutoCompleteComponent, selector: "app-multi-auto-complete", inputs: ["field", "form", "defaultValue", "pathParam", "readonly", "labelsSection"], outputs: ["selectedValue"] }, { kind: "component", type: AutoCompleteComponent, selector: "app-auto-complete", inputs: ["field", "form", "defaultValue", "readonly", "supportingAttributes"], outputs: ["selectedValue"] }, { kind: "directive", type: MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: AttachmentUploaderComponent, selector: "app-attachment-uploader", inputs: ["acceptedTypes", "ariaDescribedBy"], outputs: ["fileSelected"] }, { kind: "directive", type: DecimalOnlyDirective, selector: "[numbersOnly]", inputs: ["maxDecimals", "numbersOnly", "numbersOnlyWithPlus"] }, { kind: "directive", type: MaxDigitsDirective, selector: "[maxDigits]", inputs: ["maxDigits"] }] }); }
744
+ ], viewQueries: [{ propertyName: "fieldsInput", first: true, predicate: ["EquationValueInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"main-form-canvas\">\n <div class=\"form-wrapper\">\n <ng-container *ngIf=\"defaults\">\n <ng-container *ngIf=\"editable; else readonlyView\" class=\"form-container\">\n <form [formGroup]=\"formParam\" class=\"form-content\">\n <div class=\"form-row\">\n <div class=\"form-column\">\n <ng-container *ngFor=\"let row of screenFields | keyvalue\">\n <div class=\"row-container\">\n <ng-container *ngFor=\"let field of row.value\">\n <div class=\"field-column\" [style.flex]=\"field.fieldSize ? ('0 0 ' + field.fieldSize + '%') : '1 1 0'\">\n <ng-container [ngSwitch]=\"field.type\">\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n\n <mat-form-field appearance=\"outline\">\n <input matInput\n [matDatepicker]=\"picker\"\n [min]=\"minDate\"\n (dateChange)=\"formParam.get(field.property).setValue($event.value)\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n formControlName=\"{{field.property}}\"\n [required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n\n <mat-datepicker-toggle *ngIf=\"!field.readonly\" matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n\n <mat-datepicker #picker\n [startView]=\"getView(field)\"\n (yearSelected)=\"setMonthAndYear($event, picker, field)\"\n panelClass=\"example-month-picker\">\n </mat-datepicker>\n\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'phone-number'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container class=\"custom-ngx-mat-intl-tel-input\" *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <div class=\"phone-input-wrapper\">\n <ngx-mat-intl-tel-input\n formControlName=\"{{ field.property }}\"\n [inputPlaceholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [preferredCountries]=\"['qa']\"\n [enablePlaceholder]=\"true\"\n [enableSearch]=\"true\"\n [onlyCountries]=\"getCountryCodeList()\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n </ngx-mat-intl-tel-input>\n </div>\n\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngSwitchCase=\"'iban-text'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'password'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input matInput\n class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n [type]=\"hide && !field.disabled ? 'password' : 'text'\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <!-- <mat-icon matSuffix-->\n <!-- (click)=\"hide = !hide\">-->\n <!-- {{ hide ? 'visibility_off' : 'visibility' }}-->\n <!-- </mat-icon>-->\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'text'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <mat-icon *ngIf=\"field.showSearchIcon\" matPrefix>search</mat-icon>\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n (keyup)=\"fixArabicNumbers($event.target)\"\n [attr.aria-required]=\"field.required\"\n [maxDigits]=\"field.maxLength\"\n [phoneNumberOnly]=\"field.phoneNumberOnly\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <span\n *ngIf=\"field.showSearchIcon && !field.readonly && (formParam?.get([field.property])?.value ?? '') !== ''\"\n matSuffix\n class=\"clear-icon-suffix\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"clear-icon-button\"\n [attr.aria-label]=\"'BASE_TABLE.clearField' | translate\"\n (click)=\"clearFieldValue(field.property)\">\n <mat-icon aria-hidden=\"true\">close</mat-icon>\n </button>\n </span>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-state-checkbox'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"multi-state-filter\" [formGroup]=\"formParam\">\n <button\n type=\"button\"\n class=\"multi-state-filter__trigger\"\n [matMenuTriggerFor]=\"statusMultiMenu\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"false\"\n [attr.aria-label]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : (field.label | translate)\">\n <span\n class=\"multi-state-filter__trigger-text\"\n [class.multi-state-filter__trigger-text--placeholder]=\"isMultiStateEmpty(field.property)\">\n {{\n getMultiStateFilterTriggerLabel(field)\n || (field.placeholder\n ? (labelKeyPlaceHolder(field) | translate)\n : ('FILTER-BUILDER.selectStatus' | translate))\n }}\n </span>\n <mat-icon class=\"multi-state-filter__chevron\" aria-hidden=\"true\">keyboard_arrow_down</mat-icon>\n </button>\n <mat-menu #statusMultiMenu=\"matMenu\" class=\"multi-state-filter__menu-panel\" [hasBackdrop]=\"true\">\n <div\n class=\"multi-state-filter__menu-inner\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onMultiStateMenuInnerKeydown($event, field)\">\n <div\n *ngFor=\"let code of field.listOptions || []\"\n mat-menu-item\n class=\"multi-state-filter__row\"\n [attr.data-multi-state-code]=\"code\"\n (click)=\"onMultiStateRowClick($event, field.property, code)\">\n <mat-checkbox\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation()\"\n [checked]=\"isMultiStateSelected(field.property, code)\"\n (change)=\"toggleMultiStateFilter(field.property, code, $event.checked)\">\n </mat-checkbox>\n <span\n class=\"multi-state-filter__pill stateType\"\n [ngClass]=\"code\">\n {{ statusOptionLabelKey(field, code) | translate }}\n </span>\n </div>\n </div>\n </mat-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip-list'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n\n <mat-chip-grid [attr.aria-labelledby]=\"'label-' + field.property\"\n formControlName=\"{{ field.property }}\">\n <mat-chip-row\n *ngFor=\"let mail of splittedChips(formParam, field.property); let idx = index\"\n [removable]=\"removable\"\n (removed)=\"removeChipsItem(formParam, field.property, idx)\">\n {{ mail }}\n <mat-icon matChipRemove *ngIf=\"removable\">cancel</mat-icon>\n </mat-chip-row>\n\n <input [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [matChipInputFor]=\"null\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\"\n (matChipInputTokenEnd)=\"addEmailToChips($event, formParam, field.property)\">\n </mat-chip-grid>\n <mat-error id=\"error-{{ field.property }}\" *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'amount'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"amountReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n type=\"number\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'sequence'\">\n <ng-container\n *ngIf=\"referenceAttributeTrue(field.property, 'autoGenerated'); else noSequence\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"true\"\n [disabled]=\"true\"\n [attr.aria-labelledby]=\"'label-' + field.property\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n\n <ng-template #noSequence>\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [readonly]=\"false\"\n [disabled]=\"false\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [required]=\"field.required\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-template>\n\n <ng-container *ngSwitchCase=\"'textarea'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textareaReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <textarea cdkFocusInitial\n formControlName=\"{{ field.property }}\"\n matInput\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"3\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [maxDigits]=\"field.maxLength\"\n [attr.maxlength]=\"field.maxLength || null\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"></textarea>\n <mat-hint *ngIf=\"field.maxLength\" align=\"end\">\n {{ getFieldCurrentLength(field.property) }}/{{ field.maxLength }}\n </mat-hint>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'number'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"numberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n type=\"number\"\n [attr.min]=\"field.allowNegative ? null : 0\"\n (keydown)=\"blockNegativeNumberKeydown($event, field)\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [maxDigits]=\"field.maxLength\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [required]=\"field.readonly ? false : field.required\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [pattern]=\"field.pattern\">\n <mat-error id=\"error-{{ field.property }}\" *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"numberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input\n matInput\n type=\"text\"\n inputmode=\"numeric\"\n formControlName=\"{{ field.property }}\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [numbersOnly]=\"true\" [maxDecimals]=\"field.maxDecimals\"\n [maxDigits]=\"field.maxLength\"\n [pattern]=\"field.pattern\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [required]=\"field.readonly ? false : field.required\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\">\n <mat-error id=\"error-{{ field.property }}\" *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'time'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"timeReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input\n #timeInput\n matInput\n class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n type=\"time\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [required]=\"field.required\">\n <span *ngIf=\"!field.readonly\" matSuffix class=\"mat-datepicker-toggle time-picker-toggle\">\n <button\n type=\"button\"\n mat-icon-button\n class=\"time-picker-toggle-button\"\n [attr.aria-label]=\"field.label! | translate\"\n (click)=\"openTimePicker(timeInput); $event.stopPropagation()\">\n <mat-icon>schedule</mat-icon>\n </button>\n </span>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"checkboxReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <mat-checkbox\n appearance=\"outline\"\n style=\"padding-bottom: 14px; padding-top: 14px;\"\n [disabled]=\"field.readonly\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n formControlName=\"{{ field.property }}\">\n {{ field.label! | translate }}\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-checkbox>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'toggle'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"toggleReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-slide-toggle\n [disabled]=\"field.readonly\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n formControlName=\"{{ field.property }}\">\n </mat-slide-toggle>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'color-picker'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center\">\n <h4 style=\"margin-right: 10px\">{{ field.label! | translate }}</h4>\n <input\n ejs-colorpicker\n type=\"color\"\n id=\"colorpicker\"\n formControlName=\"{{ field.property }}\"\n [attr.aria-label]=\"field.label! | translate\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n />\n </div>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"radioButtonReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <mat-radio-group\n formControlName=\"{{field.property}}\"\n class=\"app-radio\"\n [attr.aria-label]=\"field.label! | translate\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <div class=\"field-row\">\n <div class=\"field-label\">\n <span class=\"custom-label\">{{ field.label! | translate }}</span>\n </div>\n <div class=\"field-input\">\n <div class=\"radio-group-custom\">\n <mat-radio-button\n *ngFor=\"let option of field.listOptions\"\n [value]=\"option\"\n [attr.aria-labelledby]=\"option\">\n {{ option | translate }}\n </mat-radio-button>\n </div>\n </div>\n </div>\n\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-radio-group>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"listReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\" style=\"width: 100%\">\n <mat-select\n formControlName=\"{{field.property}}\"\n [attr.aria-label]=\"field.label! | translate\"\n [attr.aria-required]=\"field.required\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [disabled]=\"field.readonly\"\n [multiple]=\"field.multi || false\"\n [required]=\"field.readonly ? false : field.required\"\n [(value)]=\"field.defaultListOption\">\n <ng-container *ngIf=\"field.translate; else lookup_no_translation\">\n <mat-option\n *ngFor=\"let item of field.listOptions; let i = index\"\n [value]=\"item\">\n {{ friendlyName(field.label, field.property, item) | translate }}\n </mat-option>\n </ng-container>\n <ng-template #lookup_no_translation>\n <mat-option\n *ngFor=\"let item of field.listOptions\"\n [value]=\"item\">\n {{ getOptionValue(item) }}\n </mat-option>\n </ng-template>\n </mat-select>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'attachment'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <app-attachment-uploader\n [acceptedTypes]=\"getAcceptedFileTypes(field)\"\n [ariaDescribedBy]=\"showError(field.property) ? 'error-' + field.property : null\"\n (fileSelected)=\"onAttachmentFileSelected($event, field)\"\n style=\"margin-top: 5px\">\n </app-attachment-uploader>\n </ng-container>\n <mat-error class=\"iq-error\"\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'lookup'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"lookupReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <app-auto-complete\n [form]=\"formParam\"\n [field]=\"field\"\n [supportingAttributes]=\"supportingAttributes\"\n [defaultValue]=\"this.formParam.get(field.property)?.value\"\n (selectedValue)=\"patchLookupValue($event, field.property)\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </app-auto-complete>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'currency'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"currencyReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <!-- Uncomment and use the currency control when ready -->\n <!-- <app-currency\n [form]=\"formParam\"\n [field]=\"field\"\n [defaultValue]=\"this.formParam.get(field.property)?.value\"\n (selectedValue)=\"patchCurrencyValue($event, field.property)\">\n </app-currency> -->\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-select'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"multiSelectReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <app-multi-auto-complete\n [form]=\"formParam\"\n [field]=\"field\"\n [labelsSection]=\"pageInfo.labelsSection\"\n [defaultValue]=\"getMultiValue(field)\"\n (selectedValue)=\"patchMultiSelectValue($event, field.property)\">\n </app-multi-auto-complete>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngSwitchCase=\"'rich-text'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <!-- Uncomment and use the rich text editor when ready -->\n <!-- <ckeditor\n [editor]=\"Editor\"\n [disabled]=\"field.readonly\"\n formControlName=\"{{field.property}}\">\n </ckeditor> -->\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'divider'\">\n <mat-divider></mat-divider>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'hyper-text'\">\n <div>\n <mat-label\n (click)=\"getHyperTextEvent()\"\n class=\"hyper-link\">\n {{ field.label! | translate }}\n </mat-label>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'section-title'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div class=\"hrdivider-mid\">\n <span>{{ field.label | translate }}</span>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'equation-builder'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\" dir=\"ltr\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n <!-- <ng-container *ngSwitchCase=\"'equation-builder'\" [formGroup]=\"formParam\">-->\n <!-- <ng-container *ngIf=\"showField(defaults, field)\">-->\n <!-- <ng-container *ngIf=\"!workflowEditableField(field)\">-->\n <!-- <ng-container-->\n <!-- [ngTemplateOutlet]=\"dateReadonly\"-->\n <!-- [ngTemplateOutletContext]=\"{ field: field }\">-->\n <!-- </ng-container>-->\n <!-- </ng-container>-->\n <!-- <ng-container *ngIf=\"workflowEditableField(field)\">-->\n <!-- <div style=\"display: flex; width: 350%\">-->\n <!-- <mat-label>{{ field.label! | translate }}</mat-label>-->\n <!-- <mat-form-field style=\"width: 400%\" appearance=\"outline\">-->\n <!-- <mat-chip-grid #chipGrid>-->\n <!-- <ng-container *ngFor=\"let equationValue of equationValues(); let i = index\">-->\n <!-- <mat-chip-row (removed)=\"remove(equationValue, i)\">-->\n <!-- {{ equationValue }}-->\n <!-- <button-->\n <!-- matChipRemove-->\n <!-- [attr.aria-label]=\"'remove ' + equationValue\">-->\n <!-- <mat-icon>cancel</mat-icon>-->\n <!-- </button>-->\n <!-- </mat-chip-row>-->\n <!-- </ng-container>-->\n <!-- </mat-chip-grid>-->\n <!-- <input-->\n <!-- [(ngModel)]=\"currentEquationValue\"-->\n <!-- [matChipInputFor]=\"chipGrid\"-->\n <!-- [matAutocomplete]=\"auto\"-->\n <!-- [ngModelOptions]=\"{ standalone: true }\"-->\n <!-- [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"-->\n <!-- (matChipInputTokenEnd)=\"add($event)\"-->\n <!-- aria-label=\"Add equation value\" />-->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">-->\n <!-- <ng-container *ngFor=\"let filteredField of (equationFilteredFields() | async)\">-->\n <!-- <mat-option [value]=\"filteredField\">{{ filteredField }}</mat-option>-->\n <!-- </ng-container>-->\n <!-- </mat-autocomplete>-->\n <!-- </mat-form-field>-->\n <!-- </div>-->\n <!-- <mat-error class=\"iq-error\" *ngIf=\"showError(field.property)\" aria-live=\"assertive\">-->\n <!-- {{ getErrors(field.property) | translate }}-->\n <!-- </mat-error>-->\n <!-- </ng-container>-->\n <!-- </ng-container>-->\n <!-- </ng-container>-->\n\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </form>\n </ng-container>\n </ng-container>\n </div>\n\n</div>\n<ng-template #dateReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <ng-container *ngIf=\"isReadonlyTextValueEmpty(defaults, field) && field.emptyReadonlyPlaceholderKey; else dateReadonlyHasValue\">\n <span class=\"readonly-value readonly-value--empty\">{{ field.emptyReadonlyPlaceholderKey | translate }}</span>\n </ng-container>\n <ng-template #dateReadonlyHasValue>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) | date: getReadonlyDateFormat(field) }}</span>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #timeReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ formatTimeToDate(defaults[field.property]) | date: 'shortTime' }}</span>\n </div>\n</ng-template>\n\n<ng-template #phoneNumberReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #textReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\" *ngIf=\"!field.advancedFilter\"></label>\n <ng-container *ngIf=\"isReadonlyTextValueEmpty(defaults, field) && field.emptyReadonlyPlaceholderKey; else textReadonlyHasValue\">\n <span class=\"readonly-value readonly-value--empty\">{{ field.emptyReadonlyPlaceholderKey | translate }}</span>\n </ng-container>\n <ng-template #textReadonlyHasValue>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #textareaReadonly let-field=\"field\">\n <ng-container *ngIf=\"field.textFormat === 'json'; else normalText\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <div class=\"readonly-value json-viewer\">\n <ngx-json-viewer [json]=\"extractJsonFieldName(defaults, field.property)\" [expanded]=\"true\"></ngx-json-viewer>\n </div>\n </div>\n </ng-container>\n <ng-template #normalText>\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #numberReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #currencyReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #radioButtonReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ translateLable(defaults[field.property]) }}</span>\n </div>\n</ng-template>\n\n<ng-template #richTextReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\" [innerHtml]=\"extractFieldName(defaults, field.property)\"></span>\n </div>\n</ng-template>\n\n<ng-template #checkboxReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n <mat-icon color=\"warn\" *ngIf=\"extractFieldName(defaults, field.property); else showNo\">done</mat-icon>\n <ng-template #showNo>\n <mat-icon color=\"warn\">close</mat-icon>\n </ng-template>\n </span>\n </div>\n</ng-template>\n\n<ng-template #toggleReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n <mat-icon color=\"warn\" *ngIf=\"extractFieldName(defaults, field.property); else showNo\">done</mat-icon>\n <ng-template #showNo>\n <mat-icon color=\"warn\">close</mat-icon>\n </ng-template>\n </span>\n </div>\n</ng-template>\n\n<ng-template #listReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\" *ngIf=\"field.translate; else noTranslate\">\n {{ listShowValue(defaults, field) | translate }}\n </span>\n <ng-template #noTranslate>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #sequenceReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #lookupReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n {{ extractFieldName(defaults, field.property)?.[translateService.getDefaultLang() === 'en' ? 'englishName' : 'arabicName'] }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #amountReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n {{ extractFieldName(defaults, field.property) | currency: currency }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #multiSelectReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <mat-chip-grid class=\"readonly-value chipList\">\n <mat-chip *ngFor=\"let filedProp of showMultiSelectValuesAsReadonly(field)\">\n {{ filedProp }}\n </mat-chip>\n </mat-chip-grid>\n </div>\n</ng-template>\n\n<ng-template #chipListReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHTML]=\"field.label | translate\"></label>\n <mat-chip-listbox class=\"readonly-value chipList\">\n <mat-chip-option *ngFor=\"let loc of splitReadonly(extractFieldName(defaults, field.property))\"\n [selectable]=\"true\"\n color=\"warn\"\n [removable]=\"false\">\n {{ loc }}\n </mat-chip-option>\n </mat-chip-listbox>\n </div>\n</ng-template>\n\n\n<ng-template #readonlyView>\n <div class=\"row-wrapper\">\n <div class=\"column-wrapper\">\n <ng-container *ngFor=\"let row of screenFields | keyvalue\">\n <div class=\"row-container\">\n <ng-container *ngFor=\"let field of row.value\">\n <div class=\"field-column readonly-item\" [style.flex]=\"field.fieldSize ? ('0 0 ' + field.fieldSize + '%') : '1 1 0'\">\n\n <ng-container [ngSwitch]=\"field.type\">\n\n <ng-container *ngSwitchCase=\"'attachment'\">\n <ng-container *ngIf=\"isAttachmentFieldEditable && showField(defaults, field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n </div>\n <app-attachment-uploader\n [acceptedTypes]=\"getAcceptedFileTypes(field)\"\n [ariaDescribedBy]=\"showError(field.property) ? 'error-' + field.property : null\"\n (fileSelected)=\"onAttachmentFileSelected($event, field)\"\n style=\"margin-top: 5px\">\n </app-attachment-uploader>\n <mat-error class=\"iq-error\"\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container [ngTemplateOutlet]=\"dateReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'time'\">\n <ng-container [ngTemplateOutlet]=\"timeReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'phone-number'\">\n <ng-container [ngTemplateOutlet]=\"phoneNumberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'text'\">\n <ng-container [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'textarea'\">\n <ng-container [ngTemplateOutlet]=\"textareaReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'number'\">\n <ng-container [ngTemplateOutlet]=\"numberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'currency'\">\n <ng-container [ngTemplateOutlet]=\"currencyReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <ng-container [ngTemplateOutlet]=\"radioButtonReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <ng-container [ngTemplateOutlet]=\"checkboxReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'toggle'\">\n <ng-container [ngTemplateOutlet]=\"toggleReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'status'\">\n <ng-container [ngTemplateOutlet]=\"checkboxReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'lookup'\">\n <ng-container [ngTemplateOutlet]=\"lookupReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'amount'\">\n <ng-container [ngTemplateOutlet]=\"amountReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-select'\">\n <ng-container [ngTemplateOutlet]=\"multiSelectReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip-list'\">\n <ng-container [ngTemplateOutlet]=\"chipListReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'sequence'\">\n <ng-container [ngTemplateOutlet]=\"sequenceReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ng-container [ngTemplateOutlet]=\"listReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-state-checkbox'\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" *ngIf=\"!field.hideLabel\" [innerHtml]=\"field.label | translate\"></label>\n <span class=\"readonly-value\">{{ getMultiStateReadonlySummary(field, defaults) }}</span>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'iban-text'\">\n <p class=\"label\">\n <span [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></span>\n <span> : </span>\n <span class=\"value\" [innerHtml]=\"extractFieldName(defaults, field.property)\"></span>\n </p>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'section-title'\">\n <div class=\"hrdivider-mid\">\n <span>{{ field.label | translate }}</span>\n </div>\n </ng-container>\n\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n\n", styles: [".main-form-canvas{display:flex;flex-direction:row;gap:10px;align-items:flex-start;justify-content:flex-start;width:100%;flex-wrap:wrap}.form-wrapper{display:flex;flex-direction:column;flex:1}.form-container{display:flex;flex-direction:column;width:100%}.row-container{display:flex;flex-direction:row;gap:20px;flex-wrap:wrap;width:100%}.field-column{display:flex;flex-direction:column;flex:1}.label-and-asterisk-container{display:flex;align-items:center;gap:4px}.optional-text{color:#9b9b9b;font-size:11px;font-weight:400;line-height:1.4}.full-width{width:100%}.readonly-item{display:flex;flex-direction:column;align-items:flex-start;gap:2px;font-size:14px;padding:4px 0;width:100%;.readonly-label{font-weight:500;color:#9b9b9b;font-size:14px}.readonly-value{font-weight:500;color:#222;word-break:break-word;font-size:14px}.readonly-value--empty{font-style:italic;font-weight:500;color:#6b7280}.json-viewer{width:100%}.chipList{display:flex;flex-wrap:wrap;gap:4px}mat-icon{font-size:18px;vertical-align:middle}}.row-wrapper{display:flex;flex-direction:row;gap:20px;width:100%;flex-wrap:wrap}.column-wrapper{display:flex;flex-direction:column;width:100%;align-items:flex-start}.row-container{display:flex;flex-direction:row;gap:20px;width:100%;flex-wrap:wrap}.field-column{display:flex;flex-direction:column;min-width:50px!important}.field-row{display:flex;flex-direction:row;gap:10px;width:100%;align-items:flex-start}.field-label{flex:0 0 40%;display:flex;flex-direction:column;justify-content:center}.field-input{flex:0 0 60%;display:flex;flex-direction:column}.radio-group-custom{display:flex;flex-direction:row;flex-wrap:wrap;gap:10px}.clear-icon-button{width:40px!important;height:40px!important;min-width:40px!important;padding:8px!important;margin:0!important;margin-inline-start:4px!important;display:flex!important;align-items:center!important;justify-content:center!important;cursor:pointer!important}.clear-icon-button mat-icon{width:24px!important;height:24px!important;font-size:24px!important;line-height:24px!important;margin-top:0!important}.clear-icon-suffix{display:flex!important;align-items:center!important;align-content:center!important;height:100%!important}@media (max-width: 600px){.main-form-canvas{flex-direction:column}.row-container{flex-direction:column;gap:10px}.field-column{width:100%;flex:1 1 100%!important}.column-wrapper{align-items:center}.field-row{flex-direction:column}.field-label,.field-input{flex:1 1 100%}.radio-group-custom{flex-direction:column;gap:5px}}.custom-ngx-mat-intl-tel-input[readonly] input,.custom-ngx-mat-intl-tel-input.ngx-mat-intl-tel-input input[disabled]{pointer-events:none!important;background-color:#f5f5f5!important;color:#444!important}.custom-ngx-mat-intl-tel-input .iti__flag-container,.custom-ngx-mat-intl-tel-input .iti__selected-flag{pointer-events:none!important;opacity:.6}.custom-ngx-mat-intl-tel-input{pointer-events:none!important}::ng-deep .mat-datepicker-content-container mat-calendar.example-month-picker~.mat-datepicker-close-button{display:none!important}.time-picker-toggle .time-picker-toggle-button{--mdc-icon-button-state-layer-size: 40px;width:40px;height:40px;padding:0}.time-picker-toggle .mat-icon{width:20px;height:20px;font-size:20px}@media (max-width: 960px){.row-wrapper,.row-container{flex-direction:column}.row-container{gap:15px}.field-column{flex:1 1 100%!important}}.multi-state-filter{display:flex;flex-direction:column;align-items:flex-start}.multi-state-filter__trigger{display:flex;align-items:center;justify-content:space-between;gap:4px;min-height:45px;padding:0 16px;margin:0;border:1px solid #b7b7b7;border-radius:8px;background:#fff;cursor:pointer;font-family:inherit;font-size:16px;font-weight:300;line-height:1.2;color:#000;box-sizing:border-box;width:100%}.multi-state-filter__trigger:focus-visible{outline:2px solid #0d4261;outline-offset:2px}.multi-state-filter__trigger-text{flex:1 1 auto;text-align:left;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}.multi-state-filter__trigger-text--placeholder{color:#888}:host ::ng-deep .mat-mdc-select-placeholder{color:#888!important}.multi-state-filter__chevron{flex-shrink:0;width:24px;height:24px;font-size:24px;color:#0d4261}::ng-deep .multi-state-filter__menu-panel{max-width:320px;min-width:250px}.multi-state-filter__menu-inner{padding:4px 0}.multi-state-filter__row{display:flex;align-items:center;gap:8px;min-height:28px;max-height:34px;padding:4px 8px;box-sizing:border-box}.multi-state-filter__pill{display:inline-flex;align-items:center;justify-content:center;min-height:24px;padding:0 16px;font-size:14px;font-weight:400;line-height:1.2;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: KeyValuePipe, name: "keyvalue" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i7.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i9.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "directive", type: MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "component", type: MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled", "tabIndex"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "directive", type: MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: PhoneNumberOnlyDirective, selector: "[phoneNumberOnly]", inputs: ["phoneNumberOnly"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "ngmodule", type: NgxJsonViewerModule }, { kind: "component", type: i10.NgxJsonViewerComponent, selector: "ngx-json-viewer", inputs: ["json", "expanded", "depth", "_currentDepth"] }, { kind: "pipe", type: CurrencyPipe, name: "currency" }, { kind: "component", type: NgxMatIntlTelInputComponent, selector: "ngx-mat-intl-tel-input", inputs: ["preferredCountries", "enablePlaceholder", "inputPlaceholder", "cssClass", "name", "onlyCountries", "errorStateMatcher", "enableSearch", "searchPlaceholder", "describedBy", "format", "placeholder", "required", "disabled"], outputs: ["countryChanged"] }, { kind: "component", type: MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "component", type: MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "component", type: MultiAutoCompleteComponent, selector: "app-multi-auto-complete", inputs: ["field", "form", "defaultValue", "pathParam", "readonly", "labelsSection"], outputs: ["selectedValue"] }, { kind: "component", type: AutoCompleteComponent, selector: "app-auto-complete", inputs: ["field", "form", "defaultValue", "readonly", "supportingAttributes"], outputs: ["selectedValue"] }, { kind: "directive", type: MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: AttachmentUploaderComponent, selector: "app-attachment-uploader", inputs: ["acceptedTypes", "ariaDescribedBy"], outputs: ["fileSelected"] }, { kind: "directive", type: DecimalOnlyDirective, selector: "[numbersOnly]", inputs: ["maxDecimals", "numbersOnly", "numbersOnlyWithPlus"] }, { kind: "directive", type: MaxDigitsDirective, selector: "[maxDigits]", inputs: ["maxDigits"] }] }); }
741
745
  }
742
746
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseFormCanvasComponent, decorators: [{
743
747
  type: Component,
@@ -806,7 +810,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
806
810
  },
807
811
  { provide: MAT_DATE_FORMATS, useValue: DD_MM_YYYY_Format },
808
812
  { provide: MAT_DATE_LOCALE, useValue: 'en-GB' }
809
- ], template: "<div class=\"main-form-canvas\">\n <div class=\"form-wrapper\">\n <ng-container *ngIf=\"defaults\">\n <ng-container *ngIf=\"editable; else readonlyView\" class=\"form-container\">\n <form [formGroup]=\"formParam\" class=\"form-content\">\n <div class=\"form-row\">\n <div class=\"form-column\">\n <ng-container *ngFor=\"let row of screenFields | keyvalue\">\n <div class=\"row-container\">\n <ng-container *ngFor=\"let field of row.value\">\n <div class=\"field-column\" [style.flex]=\"field.fieldSize ? ('0 0 ' + field.fieldSize + '%') : '1 1 0'\">\n <ng-container [ngSwitch]=\"field.type\">\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n\n <mat-form-field appearance=\"outline\">\n <input matInput\n [matDatepicker]=\"picker\"\n [min]=\"minDate\"\n (dateChange)=\"formParam.get(field.property).setValue($event.value)\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n formControlName=\"{{field.property}}\"\n [required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n\n <mat-datepicker-toggle *ngIf=\"!field.readonly\" matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n\n <mat-datepicker #picker\n [startView]=\"getView(field)\"\n (yearSelected)=\"setMonthAndYear($event, picker, field)\"\n panelClass=\"example-month-picker\">\n </mat-datepicker>\n\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'phone-number'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container class=\"custom-ngx-mat-intl-tel-input\" *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <div class=\"phone-input-wrapper\">\n <ngx-mat-intl-tel-input\n formControlName=\"{{ field.property }}\"\n [inputPlaceholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [preferredCountries]=\"['qa']\"\n [enablePlaceholder]=\"true\"\n [enableSearch]=\"true\"\n [onlyCountries]=\"getCountryCodeList()\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n </ngx-mat-intl-tel-input>\n </div>\n\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngSwitchCase=\"'iban-text'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'password'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input matInput\n class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n [type]=\"hide && !field.disabled ? 'password' : 'text'\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <!-- <mat-icon matSuffix-->\n <!-- (click)=\"hide = !hide\">-->\n <!-- {{ hide ? 'visibility_off' : 'visibility' }}-->\n <!-- </mat-icon>-->\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'text'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <mat-icon *ngIf=\"field.showSearchIcon\" matPrefix>search</mat-icon>\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n (keyup)=\"fixArabicNumbers($event.target)\"\n [attr.aria-required]=\"field.required\"\n [maxDigits]=\"field.maxLength\"\n [phoneNumberOnly]=\"field.phoneNumberOnly\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <span\n *ngIf=\"field.showSearchIcon && !field.readonly && (formParam?.get([field.property])?.value ?? '') !== ''\"\n matSuffix\n class=\"clear-icon-suffix\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"clear-icon-button\"\n [attr.aria-label]=\"'BASE_TABLE.clearField' | translate\"\n (click)=\"clearFieldValue(field.property)\">\n <mat-icon aria-hidden=\"true\">close</mat-icon>\n </button>\n </span>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-state-checkbox'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"multi-state-filter\" [formGroup]=\"formParam\">\n <button\n type=\"button\"\n class=\"multi-state-filter__trigger\"\n [matMenuTriggerFor]=\"statusMultiMenu\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"false\"\n [attr.aria-label]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : (field.label | translate)\">\n <span\n class=\"multi-state-filter__trigger-text\"\n [class.multi-state-filter__trigger-text--placeholder]=\"isMultiStateEmpty(field.property)\">\n {{\n getMultiStateFilterTriggerLabel(field)\n || (field.placeholder\n ? (labelKeyPlaceHolder(field) | translate)\n : ('FILTER-BUILDER.selectStatus' | translate))\n }}\n </span>\n <mat-icon class=\"multi-state-filter__chevron\" aria-hidden=\"true\">keyboard_arrow_down</mat-icon>\n </button>\n <mat-menu #statusMultiMenu=\"matMenu\" class=\"multi-state-filter__menu-panel\" [hasBackdrop]=\"true\">\n <div\n class=\"multi-state-filter__menu-inner\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onMultiStateMenuInnerKeydown($event, field)\">\n <div\n *ngFor=\"let code of field.listOptions || []\"\n mat-menu-item\n class=\"multi-state-filter__row\"\n [attr.data-multi-state-code]=\"code\"\n (click)=\"onMultiStateRowClick($event, field.property, code)\">\n <mat-checkbox\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation()\"\n [checked]=\"isMultiStateSelected(field.property, code)\"\n (change)=\"toggleMultiStateFilter(field.property, code, $event.checked)\">\n </mat-checkbox>\n <span\n class=\"multi-state-filter__pill stateType\"\n [ngClass]=\"code\">\n {{ statusOptionLabelKey(field, code) | translate }}\n </span>\n </div>\n </div>\n </mat-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip-list'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n\n <mat-chip-grid [attr.aria-labelledby]=\"'label-' + field.property\"\n formControlName=\"{{ field.property }}\">\n <mat-chip-row\n *ngFor=\"let mail of splittedChips(formParam, field.property); let idx = index\"\n [removable]=\"removable\"\n (removed)=\"removeChipsItem(formParam, field.property, idx)\">\n {{ mail }}\n <mat-icon matChipRemove *ngIf=\"removable\">cancel</mat-icon>\n </mat-chip-row>\n\n <input [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [matChipInputFor]=\"null\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\"\n (matChipInputTokenEnd)=\"addEmailToChips($event, formParam, field.property)\">\n </mat-chip-grid>\n <mat-error id=\"error-{{ field.property }}\" *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'amount'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"amountReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n type=\"number\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'sequence'\">\n <ng-container\n *ngIf=\"referenceAttributeTrue(field.property, 'autoGenerated'); else noSequence\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"true\"\n [disabled]=\"true\"\n [attr.aria-labelledby]=\"'label-' + field.property\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n\n <ng-template #noSequence>\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [readonly]=\"false\"\n [disabled]=\"false\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [required]=\"field.required\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-template>\n\n <ng-container *ngSwitchCase=\"'textarea'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textareaReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <textarea cdkFocusInitial\n formControlName=\"{{ field.property }}\"\n matInput\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"3\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [maxDigits]=\"field.maxLength\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"></textarea>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'number'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"numberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n type=\"number\"\n [attr.min]=\"field.allowNegative ? null : 0\"\n (keydown)=\"blockNegativeNumberKeydown($event, field)\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [maxDigits]=\"field.maxLength\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [required]=\"field.readonly ? false : field.required\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [pattern]=\"field.pattern\">\n <mat-error id=\"error-{{ field.property }}\" *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"numberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input\n matInput\n type=\"text\"\n inputmode=\"numeric\"\n formControlName=\"{{ field.property }}\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [numbersOnly]=\"true\" [maxDecimals]=\"field.maxDecimals\"\n [maxDigits]=\"field.maxLength\"\n [pattern]=\"field.pattern\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [required]=\"field.readonly ? false : field.required\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\">\n <mat-error id=\"error-{{ field.property }}\" *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'time'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"timeReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input\n #timeInput\n matInput\n class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n type=\"time\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [required]=\"field.required\">\n <span *ngIf=\"!field.readonly\" matSuffix class=\"mat-datepicker-toggle time-picker-toggle\">\n <button\n type=\"button\"\n mat-icon-button\n class=\"time-picker-toggle-button\"\n [attr.aria-label]=\"field.label! | translate\"\n (click)=\"openTimePicker(timeInput); $event.stopPropagation()\">\n <mat-icon>schedule</mat-icon>\n </button>\n </span>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"checkboxReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <mat-checkbox\n appearance=\"outline\"\n style=\"padding-bottom: 14px; padding-top: 14px;\"\n [disabled]=\"field.readonly\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n formControlName=\"{{ field.property }}\">\n {{ field.label! | translate }}\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-checkbox>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'toggle'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"toggleReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-slide-toggle\n [disabled]=\"field.readonly\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n formControlName=\"{{ field.property }}\">\n </mat-slide-toggle>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'color-picker'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center\">\n <h4 style=\"margin-right: 10px\">{{ field.label! | translate }}</h4>\n <input\n ejs-colorpicker\n type=\"color\"\n id=\"colorpicker\"\n formControlName=\"{{ field.property }}\"\n [attr.aria-label]=\"field.label! | translate\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n />\n </div>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"radioButtonReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <mat-radio-group\n formControlName=\"{{field.property}}\"\n class=\"app-radio\"\n [attr.aria-label]=\"field.label! | translate\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <div class=\"field-row\">\n <div class=\"field-label\">\n <span class=\"custom-label\">{{ field.label! | translate }}</span>\n </div>\n <div class=\"field-input\">\n <div class=\"radio-group-custom\">\n <mat-radio-button\n *ngFor=\"let option of field.listOptions\"\n [value]=\"option\"\n [attr.aria-labelledby]=\"option\">\n {{ option | translate }}\n </mat-radio-button>\n </div>\n </div>\n </div>\n\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-radio-group>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"listReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\" style=\"width: 100%\">\n <mat-select\n formControlName=\"{{field.property}}\"\n [attr.aria-label]=\"field.label! | translate\"\n [attr.aria-required]=\"field.required\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [disabled]=\"field.readonly\"\n [multiple]=\"field.multi || false\"\n [required]=\"field.readonly ? false : field.required\"\n [(value)]=\"field.defaultListOption\">\n <ng-container *ngIf=\"field.translate; else lookup_no_translation\">\n <mat-option\n *ngFor=\"let item of field.listOptions; let i = index\"\n [value]=\"item\">\n {{ friendlyName(field.label, field.property, item) | translate }}\n </mat-option>\n </ng-container>\n <ng-template #lookup_no_translation>\n <mat-option\n *ngFor=\"let item of field.listOptions\"\n [value]=\"item\">\n {{ getOptionValue(item) }}\n </mat-option>\n </ng-template>\n </mat-select>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'attachment'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <app-attachment-uploader\n [acceptedTypes]=\"getAcceptedFileTypes(field)\"\n [ariaDescribedBy]=\"showError(field.property) ? 'error-' + field.property : null\"\n (fileSelected)=\"onAttachmentFileSelected($event, field)\"\n style=\"margin-top: 5px\">\n </app-attachment-uploader>\n </ng-container>\n <mat-error class=\"iq-error\"\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'lookup'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"lookupReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <app-auto-complete\n [form]=\"formParam\"\n [field]=\"field\"\n [supportingAttributes]=\"supportingAttributes\"\n [defaultValue]=\"this.formParam.get(field.property)?.value\"\n (selectedValue)=\"patchLookupValue($event, field.property)\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </app-auto-complete>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'currency'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"currencyReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <!-- Uncomment and use the currency control when ready -->\n <!-- <app-currency\n [form]=\"formParam\"\n [field]=\"field\"\n [defaultValue]=\"this.formParam.get(field.property)?.value\"\n (selectedValue)=\"patchCurrencyValue($event, field.property)\">\n </app-currency> -->\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-select'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"multiSelectReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <app-multi-auto-complete\n [form]=\"formParam\"\n [field]=\"field\"\n [labelsSection]=\"pageInfo.labelsSection\"\n [defaultValue]=\"getMultiValue(field)\"\n (selectedValue)=\"patchMultiSelectValue($event, field.property)\">\n </app-multi-auto-complete>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngSwitchCase=\"'rich-text'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <!-- Uncomment and use the rich text editor when ready -->\n <!-- <ckeditor\n [editor]=\"Editor\"\n [disabled]=\"field.readonly\"\n formControlName=\"{{field.property}}\">\n </ckeditor> -->\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'divider'\">\n <mat-divider></mat-divider>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'hyper-text'\">\n <div>\n <mat-label\n (click)=\"getHyperTextEvent()\"\n class=\"hyper-link\">\n {{ field.label! | translate }}\n </mat-label>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'section-title'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div class=\"hrdivider-mid\">\n <span>{{ field.label | translate }}</span>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'equation-builder'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\" dir=\"ltr\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n <!-- <ng-container *ngSwitchCase=\"'equation-builder'\" [formGroup]=\"formParam\">-->\n <!-- <ng-container *ngIf=\"showField(defaults, field)\">-->\n <!-- <ng-container *ngIf=\"!workflowEditableField(field)\">-->\n <!-- <ng-container-->\n <!-- [ngTemplateOutlet]=\"dateReadonly\"-->\n <!-- [ngTemplateOutletContext]=\"{ field: field }\">-->\n <!-- </ng-container>-->\n <!-- </ng-container>-->\n <!-- <ng-container *ngIf=\"workflowEditableField(field)\">-->\n <!-- <div style=\"display: flex; width: 350%\">-->\n <!-- <mat-label>{{ field.label! | translate }}</mat-label>-->\n <!-- <mat-form-field style=\"width: 400%\" appearance=\"outline\">-->\n <!-- <mat-chip-grid #chipGrid>-->\n <!-- <ng-container *ngFor=\"let equationValue of equationValues(); let i = index\">-->\n <!-- <mat-chip-row (removed)=\"remove(equationValue, i)\">-->\n <!-- {{ equationValue }}-->\n <!-- <button-->\n <!-- matChipRemove-->\n <!-- [attr.aria-label]=\"'remove ' + equationValue\">-->\n <!-- <mat-icon>cancel</mat-icon>-->\n <!-- </button>-->\n <!-- </mat-chip-row>-->\n <!-- </ng-container>-->\n <!-- </mat-chip-grid>-->\n <!-- <input-->\n <!-- [(ngModel)]=\"currentEquationValue\"-->\n <!-- [matChipInputFor]=\"chipGrid\"-->\n <!-- [matAutocomplete]=\"auto\"-->\n <!-- [ngModelOptions]=\"{ standalone: true }\"-->\n <!-- [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"-->\n <!-- (matChipInputTokenEnd)=\"add($event)\"-->\n <!-- aria-label=\"Add equation value\" />-->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">-->\n <!-- <ng-container *ngFor=\"let filteredField of (equationFilteredFields() | async)\">-->\n <!-- <mat-option [value]=\"filteredField\">{{ filteredField }}</mat-option>-->\n <!-- </ng-container>-->\n <!-- </mat-autocomplete>-->\n <!-- </mat-form-field>-->\n <!-- </div>-->\n <!-- <mat-error class=\"iq-error\" *ngIf=\"showError(field.property)\" aria-live=\"assertive\">-->\n <!-- {{ getErrors(field.property) | translate }}-->\n <!-- </mat-error>-->\n <!-- </ng-container>-->\n <!-- </ng-container>-->\n <!-- </ng-container>-->\n\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </form>\n </ng-container>\n </ng-container>\n </div>\n\n</div>\n<ng-template #dateReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <ng-container *ngIf=\"isReadonlyTextValueEmpty(defaults, field) && field.emptyReadonlyPlaceholderKey; else dateReadonlyHasValue\">\n <span class=\"readonly-value readonly-value--empty\">{{ field.emptyReadonlyPlaceholderKey | translate }}</span>\n </ng-container>\n <ng-template #dateReadonlyHasValue>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) | date: getReadonlyDateFormat(field) }}</span>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #timeReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ formatTimeToDate(defaults[field.property]) | date: 'shortTime' }}</span>\n </div>\n</ng-template>\n\n<ng-template #phoneNumberReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #textReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\" *ngIf=\"!field.advancedFilter\"></label>\n <ng-container *ngIf=\"isReadonlyTextValueEmpty(defaults, field) && field.emptyReadonlyPlaceholderKey; else textReadonlyHasValue\">\n <span class=\"readonly-value readonly-value--empty\">{{ field.emptyReadonlyPlaceholderKey | translate }}</span>\n </ng-container>\n <ng-template #textReadonlyHasValue>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #textareaReadonly let-field=\"field\">\n <ng-container *ngIf=\"field.textFormat === 'json'; else normalText\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <div class=\"readonly-value json-viewer\">\n <ngx-json-viewer [json]=\"extractJsonFieldName(defaults, field.property)\" [expanded]=\"true\"></ngx-json-viewer>\n </div>\n </div>\n </ng-container>\n <ng-template #normalText>\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #numberReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #currencyReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #radioButtonReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ translateLable(defaults[field.property]) }}</span>\n </div>\n</ng-template>\n\n<ng-template #richTextReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\" [innerHtml]=\"extractFieldName(defaults, field.property)\"></span>\n </div>\n</ng-template>\n\n<ng-template #checkboxReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n <mat-icon color=\"warn\" *ngIf=\"extractFieldName(defaults, field.property); else showNo\">done</mat-icon>\n <ng-template #showNo>\n <mat-icon color=\"warn\">close</mat-icon>\n </ng-template>\n </span>\n </div>\n</ng-template>\n\n<ng-template #toggleReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n <mat-icon color=\"warn\" *ngIf=\"extractFieldName(defaults, field.property); else showNo\">done</mat-icon>\n <ng-template #showNo>\n <mat-icon color=\"warn\">close</mat-icon>\n </ng-template>\n </span>\n </div>\n</ng-template>\n\n<ng-template #listReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\" *ngIf=\"field.translate; else noTranslate\">\n {{ listShowValue(defaults, field) | translate }}\n </span>\n <ng-template #noTranslate>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #sequenceReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #lookupReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n {{ extractFieldName(defaults, field.property)?.[translateService.getDefaultLang() === 'en' ? 'englishName' : 'arabicName'] }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #amountReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n {{ extractFieldName(defaults, field.property) | currency: currency }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #multiSelectReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <mat-chip-grid class=\"readonly-value chipList\">\n <mat-chip *ngFor=\"let filedProp of showMultiSelectValuesAsReadonly(field)\">\n {{ filedProp }}\n </mat-chip>\n </mat-chip-grid>\n </div>\n</ng-template>\n\n<ng-template #chipListReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHTML]=\"field.label | translate\"></label>\n <mat-chip-listbox class=\"readonly-value chipList\">\n <mat-chip-option *ngFor=\"let loc of splitReadonly(extractFieldName(defaults, field.property))\"\n [selectable]=\"true\"\n color=\"warn\"\n [removable]=\"false\">\n {{ loc }}\n </mat-chip-option>\n </mat-chip-listbox>\n </div>\n</ng-template>\n\n\n<ng-template #readonlyView>\n <div class=\"row-wrapper\">\n <div class=\"column-wrapper\">\n <ng-container *ngFor=\"let row of screenFields | keyvalue\">\n <div class=\"row-container\">\n <ng-container *ngFor=\"let field of row.value\">\n <div class=\"field-column readonly-item\" [style.flex]=\"field.fieldSize ? ('0 0 ' + field.fieldSize + '%') : '1 1 0'\">\n\n <ng-container [ngSwitch]=\"field.type\">\n\n <ng-container *ngSwitchCase=\"'attachment'\">\n <ng-container *ngIf=\"isAttachmentFieldEditable && showField(defaults, field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n </div>\n <app-attachment-uploader\n [acceptedTypes]=\"getAcceptedFileTypes(field)\"\n [ariaDescribedBy]=\"showError(field.property) ? 'error-' + field.property : null\"\n (fileSelected)=\"onAttachmentFileSelected($event, field)\"\n style=\"margin-top: 5px\">\n </app-attachment-uploader>\n <mat-error class=\"iq-error\"\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container [ngTemplateOutlet]=\"dateReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'time'\">\n <ng-container [ngTemplateOutlet]=\"timeReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'phone-number'\">\n <ng-container [ngTemplateOutlet]=\"phoneNumberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'text'\">\n <ng-container [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'textarea'\">\n <ng-container [ngTemplateOutlet]=\"textareaReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'number'\">\n <ng-container [ngTemplateOutlet]=\"numberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'currency'\">\n <ng-container [ngTemplateOutlet]=\"currencyReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <ng-container [ngTemplateOutlet]=\"radioButtonReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <ng-container [ngTemplateOutlet]=\"checkboxReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'toggle'\">\n <ng-container [ngTemplateOutlet]=\"toggleReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'status'\">\n <ng-container [ngTemplateOutlet]=\"checkboxReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'lookup'\">\n <ng-container [ngTemplateOutlet]=\"lookupReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'amount'\">\n <ng-container [ngTemplateOutlet]=\"amountReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-select'\">\n <ng-container [ngTemplateOutlet]=\"multiSelectReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip-list'\">\n <ng-container [ngTemplateOutlet]=\"chipListReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'sequence'\">\n <ng-container [ngTemplateOutlet]=\"sequenceReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ng-container [ngTemplateOutlet]=\"listReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-state-checkbox'\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" *ngIf=\"!field.hideLabel\" [innerHtml]=\"field.label | translate\"></label>\n <span class=\"readonly-value\">{{ getMultiStateReadonlySummary(field, defaults) }}</span>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'iban-text'\">\n <p class=\"label\">\n <span [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></span>\n <span> : </span>\n <span class=\"value\" [innerHtml]=\"extractFieldName(defaults, field.property)\"></span>\n </p>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'section-title'\">\n <div class=\"hrdivider-mid\">\n <span>{{ field.label | translate }}</span>\n </div>\n </ng-container>\n\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n\n", styles: [".main-form-canvas{display:flex;flex-direction:row;gap:10px;align-items:flex-start;justify-content:flex-start;width:100%;flex-wrap:wrap}.form-wrapper{display:flex;flex-direction:column;flex:1}.form-container{display:flex;flex-direction:column;width:100%}.row-container{display:flex;flex-direction:row;gap:20px;flex-wrap:wrap;width:100%}.field-column{display:flex;flex-direction:column;flex:1}.label-and-asterisk-container{display:flex;align-items:center;gap:4px}.optional-text{color:#9b9b9b;font-size:11px;font-weight:400;line-height:1.4}.full-width{width:100%}.readonly-item{display:flex;flex-direction:column;align-items:flex-start;gap:2px;font-size:14px;padding:4px 0;width:100%;.readonly-label{font-weight:500;color:#9b9b9b;font-size:14px}.readonly-value{font-weight:500;color:#222;word-break:break-word;font-size:14px}.readonly-value--empty{font-style:italic;font-weight:500;color:#6b7280}.json-viewer{width:100%}.chipList{display:flex;flex-wrap:wrap;gap:4px}mat-icon{font-size:18px;vertical-align:middle}}.row-wrapper{display:flex;flex-direction:row;gap:20px;width:100%;flex-wrap:wrap}.column-wrapper{display:flex;flex-direction:column;width:100%;align-items:flex-start}.row-container{display:flex;flex-direction:row;gap:20px;width:100%;flex-wrap:wrap}.field-column{display:flex;flex-direction:column;min-width:50px!important}.field-row{display:flex;flex-direction:row;gap:10px;width:100%;align-items:flex-start}.field-label{flex:0 0 40%;display:flex;flex-direction:column;justify-content:center}.field-input{flex:0 0 60%;display:flex;flex-direction:column}.radio-group-custom{display:flex;flex-direction:row;flex-wrap:wrap;gap:10px}.clear-icon-button{width:40px!important;height:40px!important;min-width:40px!important;padding:8px!important;margin:0!important;margin-inline-start:4px!important;display:flex!important;align-items:center!important;justify-content:center!important;cursor:pointer!important}.clear-icon-button mat-icon{width:24px!important;height:24px!important;font-size:24px!important;line-height:24px!important;margin-top:0!important}.clear-icon-suffix{display:flex!important;align-items:center!important;align-content:center!important;height:100%!important}@media (max-width: 600px){.main-form-canvas{flex-direction:column}.row-container{flex-direction:column;gap:10px}.field-column{width:100%;flex:1 1 100%!important}.column-wrapper{align-items:center}.field-row{flex-direction:column}.field-label,.field-input{flex:1 1 100%}.radio-group-custom{flex-direction:column;gap:5px}}.custom-ngx-mat-intl-tel-input[readonly] input,.custom-ngx-mat-intl-tel-input.ngx-mat-intl-tel-input input[disabled]{pointer-events:none!important;background-color:#f5f5f5!important;color:#444!important}.custom-ngx-mat-intl-tel-input .iti__flag-container,.custom-ngx-mat-intl-tel-input .iti__selected-flag{pointer-events:none!important;opacity:.6}.custom-ngx-mat-intl-tel-input{pointer-events:none!important}::ng-deep .mat-datepicker-content-container mat-calendar.example-month-picker~.mat-datepicker-close-button{display:none!important}.time-picker-toggle .time-picker-toggle-button{--mdc-icon-button-state-layer-size: 40px;width:40px;height:40px;padding:0}.time-picker-toggle .mat-icon{width:20px;height:20px;font-size:20px}@media (max-width: 960px){.row-wrapper,.row-container{flex-direction:column}.row-container{gap:15px}.field-column{flex:1 1 100%!important}}.multi-state-filter{display:flex;flex-direction:column;align-items:flex-start}.multi-state-filter__trigger{display:flex;align-items:center;justify-content:space-between;gap:4px;min-height:45px;padding:0 16px;margin:0;border:1px solid #b7b7b7;border-radius:8px;background:#fff;cursor:pointer;font-family:inherit;font-size:16px;font-weight:300;line-height:1.2;color:#000;box-sizing:border-box;width:100%}.multi-state-filter__trigger:focus-visible{outline:2px solid #0d4261;outline-offset:2px}.multi-state-filter__trigger-text{flex:1 1 auto;text-align:left;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}.multi-state-filter__trigger-text--placeholder{color:#888}:host ::ng-deep .mat-mdc-select-placeholder{color:#888!important}.multi-state-filter__chevron{flex-shrink:0;width:24px;height:24px;font-size:24px;color:#0d4261}::ng-deep .multi-state-filter__menu-panel{max-width:320px;min-width:250px}.multi-state-filter__menu-inner{padding:4px 0}.multi-state-filter__row{display:flex;align-items:center;gap:8px;min-height:28px;max-height:34px;padding:4px 8px;box-sizing:border-box}.multi-state-filter__pill{display:inline-flex;align-items:center;justify-content:center;min-height:24px;padding:0 16px;font-size:14px;font-weight:400;line-height:1.2;white-space:nowrap}\n"] }]
813
+ ], template: "<div class=\"main-form-canvas\">\n <div class=\"form-wrapper\">\n <ng-container *ngIf=\"defaults\">\n <ng-container *ngIf=\"editable; else readonlyView\" class=\"form-container\">\n <form [formGroup]=\"formParam\" class=\"form-content\">\n <div class=\"form-row\">\n <div class=\"form-column\">\n <ng-container *ngFor=\"let row of screenFields | keyvalue\">\n <div class=\"row-container\">\n <ng-container *ngFor=\"let field of row.value\">\n <div class=\"field-column\" [style.flex]=\"field.fieldSize ? ('0 0 ' + field.fieldSize + '%') : '1 1 0'\">\n <ng-container [ngSwitch]=\"field.type\">\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n\n <mat-form-field appearance=\"outline\">\n <input matInput\n [matDatepicker]=\"picker\"\n [min]=\"minDate\"\n (dateChange)=\"formParam.get(field.property).setValue($event.value)\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n formControlName=\"{{field.property}}\"\n [required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n\n <mat-datepicker-toggle *ngIf=\"!field.readonly\" matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n\n <mat-datepicker #picker\n [startView]=\"getView(field)\"\n (yearSelected)=\"setMonthAndYear($event, picker, field)\"\n panelClass=\"example-month-picker\">\n </mat-datepicker>\n\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'phone-number'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container class=\"custom-ngx-mat-intl-tel-input\" *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <div class=\"phone-input-wrapper\">\n <ngx-mat-intl-tel-input\n formControlName=\"{{ field.property }}\"\n [inputPlaceholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [preferredCountries]=\"['qa']\"\n [enablePlaceholder]=\"true\"\n [enableSearch]=\"true\"\n [onlyCountries]=\"getCountryCodeList()\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n </ngx-mat-intl-tel-input>\n </div>\n\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngSwitchCase=\"'iban-text'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'password'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input matInput\n class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n [type]=\"hide && !field.disabled ? 'password' : 'text'\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <!-- <mat-icon matSuffix-->\n <!-- (click)=\"hide = !hide\">-->\n <!-- {{ hide ? 'visibility_off' : 'visibility' }}-->\n <!-- </mat-icon>-->\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'text'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <mat-icon *ngIf=\"field.showSearchIcon\" matPrefix>search</mat-icon>\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n (keyup)=\"fixArabicNumbers($event.target)\"\n [attr.aria-required]=\"field.required\"\n [maxDigits]=\"field.maxLength\"\n [phoneNumberOnly]=\"field.phoneNumberOnly\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <span\n *ngIf=\"field.showSearchIcon && !field.readonly && (formParam?.get([field.property])?.value ?? '') !== ''\"\n matSuffix\n class=\"clear-icon-suffix\">\n <button\n mat-icon-button\n type=\"button\"\n class=\"clear-icon-button\"\n [attr.aria-label]=\"'BASE_TABLE.clearField' | translate\"\n (click)=\"clearFieldValue(field.property)\">\n <mat-icon aria-hidden=\"true\">close</mat-icon>\n </button>\n </span>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-state-checkbox'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"multi-state-filter\" [formGroup]=\"formParam\">\n <button\n type=\"button\"\n class=\"multi-state-filter__trigger\"\n [matMenuTriggerFor]=\"statusMultiMenu\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"false\"\n [attr.aria-label]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : (field.label | translate)\">\n <span\n class=\"multi-state-filter__trigger-text\"\n [class.multi-state-filter__trigger-text--placeholder]=\"isMultiStateEmpty(field.property)\">\n {{\n getMultiStateFilterTriggerLabel(field)\n || (field.placeholder\n ? (labelKeyPlaceHolder(field) | translate)\n : ('FILTER-BUILDER.selectStatus' | translate))\n }}\n </span>\n <mat-icon class=\"multi-state-filter__chevron\" aria-hidden=\"true\">keyboard_arrow_down</mat-icon>\n </button>\n <mat-menu #statusMultiMenu=\"matMenu\" class=\"multi-state-filter__menu-panel\" [hasBackdrop]=\"true\">\n <div\n class=\"multi-state-filter__menu-inner\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onMultiStateMenuInnerKeydown($event, field)\">\n <div\n *ngFor=\"let code of field.listOptions || []\"\n mat-menu-item\n class=\"multi-state-filter__row\"\n [attr.data-multi-state-code]=\"code\"\n (click)=\"onMultiStateRowClick($event, field.property, code)\">\n <mat-checkbox\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation()\"\n [checked]=\"isMultiStateSelected(field.property, code)\"\n (change)=\"toggleMultiStateFilter(field.property, code, $event.checked)\">\n </mat-checkbox>\n <span\n class=\"multi-state-filter__pill stateType\"\n [ngClass]=\"code\">\n {{ statusOptionLabelKey(field, code) | translate }}\n </span>\n </div>\n </div>\n </mat-menu>\n </div>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip-list'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n\n <mat-chip-grid [attr.aria-labelledby]=\"'label-' + field.property\"\n formControlName=\"{{ field.property }}\">\n <mat-chip-row\n *ngFor=\"let mail of splittedChips(formParam, field.property); let idx = index\"\n [removable]=\"removable\"\n (removed)=\"removeChipsItem(formParam, field.property, idx)\">\n {{ mail }}\n <mat-icon matChipRemove *ngIf=\"removable\">cancel</mat-icon>\n </mat-chip-row>\n\n <input [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [matChipInputFor]=\"null\"\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\n [matChipInputAddOnBlur]=\"addOnBlur\"\n (matChipInputTokenEnd)=\"addEmailToChips($event, formParam, field.property)\">\n </mat-chip-grid>\n <mat-error id=\"error-{{ field.property }}\" *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'amount'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"amountReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n type=\"number\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'sequence'\">\n <ng-container\n *ngIf=\"referenceAttributeTrue(field.property, 'autoGenerated'); else noSequence\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"true\"\n [disabled]=\"true\"\n [attr.aria-labelledby]=\"'label-' + field.property\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n\n <ng-template #noSequence>\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required\" class=\"required-asterisk\"> * </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n [readonly]=\"false\"\n [disabled]=\"false\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [required]=\"field.required\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-template>\n\n <ng-container *ngSwitchCase=\"'textarea'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textareaReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <textarea cdkFocusInitial\n formControlName=\"{{ field.property }}\"\n matInput\n cdkTextareaAutosize\n cdkAutosizeMinRows=\"3\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [maxDigits]=\"field.maxLength\"\n [attr.maxlength]=\"field.maxLength || null\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"></textarea>\n <mat-hint *ngIf=\"field.maxLength\" align=\"end\">\n {{ getFieldCurrentLength(field.property) }}/{{ field.maxLength }}\n </mat-hint>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'number'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"numberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n matInput\n type=\"number\"\n [attr.min]=\"field.allowNegative ? null : 0\"\n (keydown)=\"blockNegativeNumberKeydown($event, field)\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [maxDigits]=\"field.maxLength\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [required]=\"field.readonly ? false : field.required\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [pattern]=\"field.pattern\">\n <mat-error id=\"error-{{ field.property }}\" *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'bigdecimal'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"numberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input\n matInput\n type=\"text\"\n inputmode=\"numeric\"\n formControlName=\"{{ field.property }}\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [numbersOnly]=\"true\" [maxDecimals]=\"field.maxDecimals\"\n [maxDigits]=\"field.maxLength\"\n [pattern]=\"field.pattern\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [required]=\"field.readonly ? false : field.required\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\">\n <mat-error id=\"error-{{ field.property }}\" *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'time'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"timeReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input\n #timeInput\n matInput\n class=\"app-input\"\n formControlName=\"{{ field.property }}\"\n type=\"time\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [required]=\"field.required\">\n <span *ngIf=\"!field.readonly\" matSuffix class=\"mat-datepicker-toggle time-picker-toggle\">\n <button\n type=\"button\"\n mat-icon-button\n class=\"time-picker-toggle-button\"\n [attr.aria-label]=\"field.label! | translate\"\n (click)=\"openTimePicker(timeInput); $event.stopPropagation()\">\n <mat-icon>schedule</mat-icon>\n </button>\n </span>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"checkboxReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <mat-checkbox\n appearance=\"outline\"\n style=\"padding-bottom: 14px; padding-top: 14px;\"\n [disabled]=\"field.readonly\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n formControlName=\"{{ field.property }}\">\n {{ field.label! | translate }}\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-checkbox>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'toggle'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"toggleReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-slide-toggle\n [disabled]=\"field.readonly\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n formControlName=\"{{ field.property }}\">\n </mat-slide-toggle>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'color-picker'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center\">\n <h4 style=\"margin-right: 10px\">{{ field.label! | translate }}</h4>\n <input\n ejs-colorpicker\n type=\"color\"\n id=\"colorpicker\"\n formControlName=\"{{ field.property }}\"\n [attr.aria-label]=\"field.label! | translate\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n />\n </div>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"radioButtonReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <mat-radio-group\n formControlName=\"{{field.property}}\"\n class=\"app-radio\"\n [attr.aria-label]=\"field.label! | translate\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <div class=\"field-row\">\n <div class=\"field-label\">\n <span class=\"custom-label\">{{ field.label! | translate }}</span>\n </div>\n <div class=\"field-input\">\n <div class=\"radio-group-custom\">\n <mat-radio-button\n *ngFor=\"let option of field.listOptions\"\n [value]=\"option\"\n [attr.aria-labelledby]=\"option\">\n {{ option | translate }}\n </mat-radio-button>\n </div>\n </div>\n </div>\n\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-radio-group>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"listReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\" style=\"width: 100%\">\n <mat-select\n formControlName=\"{{field.property}}\"\n [attr.aria-label]=\"field.label! | translate\"\n [attr.aria-required]=\"field.required\"\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\"\n [disabled]=\"field.readonly\"\n [multiple]=\"field.multi || false\"\n [required]=\"field.readonly ? false : field.required\"\n [(value)]=\"field.defaultListOption\">\n <ng-container *ngIf=\"field.translate; else lookup_no_translation\">\n <mat-option\n *ngFor=\"let item of field.listOptions; let i = index\"\n [value]=\"item\">\n {{ friendlyName(field.label, field.property, item) | translate }}\n </mat-option>\n </ng-container>\n <ng-template #lookup_no_translation>\n <mat-option\n *ngFor=\"let item of field.listOptions\"\n [value]=\"item\">\n {{ getOptionValue(item) }}\n </mat-option>\n </ng-template>\n </mat-select>\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'attachment'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <app-attachment-uploader\n [acceptedTypes]=\"getAcceptedFileTypes(field)\"\n [ariaDescribedBy]=\"showError(field.property) ? 'error-' + field.property : null\"\n (fileSelected)=\"onAttachmentFileSelected($event, field)\"\n style=\"margin-top: 5px\">\n </app-attachment-uploader>\n </ng-container>\n <mat-error class=\"iq-error\"\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'lookup'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"lookupReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <app-auto-complete\n [form]=\"formParam\"\n [field]=\"field\"\n [supportingAttributes]=\"supportingAttributes\"\n [defaultValue]=\"this.formParam.get(field.property)?.value\"\n (selectedValue)=\"patchLookupValue($event, field.property)\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </app-auto-complete>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'currency'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"currencyReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <!-- Uncomment and use the currency control when ready -->\n <!-- <app-currency\n [form]=\"formParam\"\n [field]=\"field\"\n [defaultValue]=\"this.formParam.get(field.property)?.value\"\n (selectedValue)=\"patchCurrencyValue($event, field.property)\">\n </app-currency> -->\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-select'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"multiSelectReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <app-multi-auto-complete\n [form]=\"formParam\"\n [field]=\"field\"\n [labelsSection]=\"pageInfo.labelsSection\"\n [defaultValue]=\"getMultiValue(field)\"\n (selectedValue)=\"patchMultiSelectValue($event, field.property)\">\n </app-multi-auto-complete>\n\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngSwitchCase=\"'rich-text'\" [formGroup]=\"formParam\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <!-- Uncomment and use the rich text editor when ready -->\n <!-- <ckeditor\n [editor]=\"Editor\"\n [disabled]=\"field.readonly\"\n formControlName=\"{{field.property}}\">\n </ckeditor> -->\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'divider'\">\n <mat-divider></mat-divider>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'hyper-text'\">\n <div>\n <mat-label\n (click)=\"getHyperTextEvent()\"\n class=\"hyper-link\">\n {{ field.label! | translate }}\n </mat-label>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'section-title'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <div class=\"hrdivider-mid\">\n <span>{{ field.label | translate }}</span>\n </div>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'equation-builder'\">\n <ng-container *ngIf=\"showField(defaults, field)\">\n <ng-container *ngIf=\"!workflowEditableField(field)\">\n <ng-container\n [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\">\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"workflowEditableField(field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n <span *ngIf=\"!field.required && !field.hideLabel && !field.readonly\" class=\"optional-text\"> {{ 'optional' | translate }} </span>\n </div>\n <mat-form-field appearance=\"outline\">\n <input class=\"app-input\" dir=\"ltr\"\n formControlName=\"{{ field.property }}\"\n matInput\n [placeholder]=\"field.placeholder ? (labelKeyPlaceHolder(field) | translate) : ''\"\n [readonly]=\"field.readonly\"\n [attr.tabindex]=\"field.readonly ? -1 : null\"\n [required]=\"field.required\"\n [attr.aria-required]=\"field.required\"\n [attr.aria-invalid]=\"showError(field.property)\"\n [attr.aria-labelledby]=\"'label-' + field.property\"\n [attr.aria-describedby]=\"showError(field.property) ? 'error-' + field.property : null\">\n <mat-error\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </mat-form-field>\n\n\n </ng-container>\n </ng-container>\n </ng-container>\n <!-- <ng-container *ngSwitchCase=\"'equation-builder'\" [formGroup]=\"formParam\">-->\n <!-- <ng-container *ngIf=\"showField(defaults, field)\">-->\n <!-- <ng-container *ngIf=\"!workflowEditableField(field)\">-->\n <!-- <ng-container-->\n <!-- [ngTemplateOutlet]=\"dateReadonly\"-->\n <!-- [ngTemplateOutletContext]=\"{ field: field }\">-->\n <!-- </ng-container>-->\n <!-- </ng-container>-->\n <!-- <ng-container *ngIf=\"workflowEditableField(field)\">-->\n <!-- <div style=\"display: flex; width: 350%\">-->\n <!-- <mat-label>{{ field.label! | translate }}</mat-label>-->\n <!-- <mat-form-field style=\"width: 400%\" appearance=\"outline\">-->\n <!-- <mat-chip-grid #chipGrid>-->\n <!-- <ng-container *ngFor=\"let equationValue of equationValues(); let i = index\">-->\n <!-- <mat-chip-row (removed)=\"remove(equationValue, i)\">-->\n <!-- {{ equationValue }}-->\n <!-- <button-->\n <!-- matChipRemove-->\n <!-- [attr.aria-label]=\"'remove ' + equationValue\">-->\n <!-- <mat-icon>cancel</mat-icon>-->\n <!-- </button>-->\n <!-- </mat-chip-row>-->\n <!-- </ng-container>-->\n <!-- </mat-chip-grid>-->\n <!-- <input-->\n <!-- [(ngModel)]=\"currentEquationValue\"-->\n <!-- [matChipInputFor]=\"chipGrid\"-->\n <!-- [matAutocomplete]=\"auto\"-->\n <!-- [ngModelOptions]=\"{ standalone: true }\"-->\n <!-- [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"-->\n <!-- (matChipInputTokenEnd)=\"add($event)\"-->\n <!-- aria-label=\"Add equation value\" />-->\n <!-- <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">-->\n <!-- <ng-container *ngFor=\"let filteredField of (equationFilteredFields() | async)\">-->\n <!-- <mat-option [value]=\"filteredField\">{{ filteredField }}</mat-option>-->\n <!-- </ng-container>-->\n <!-- </mat-autocomplete>-->\n <!-- </mat-form-field>-->\n <!-- </div>-->\n <!-- <mat-error class=\"iq-error\" *ngIf=\"showError(field.property)\" aria-live=\"assertive\">-->\n <!-- {{ getErrors(field.property) | translate }}-->\n <!-- </mat-error>-->\n <!-- </ng-container>-->\n <!-- </ng-container>-->\n <!-- </ng-container>-->\n\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </form>\n </ng-container>\n </ng-container>\n </div>\n\n</div>\n<ng-template #dateReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <ng-container *ngIf=\"isReadonlyTextValueEmpty(defaults, field) && field.emptyReadonlyPlaceholderKey; else dateReadonlyHasValue\">\n <span class=\"readonly-value readonly-value--empty\">{{ field.emptyReadonlyPlaceholderKey | translate }}</span>\n </ng-container>\n <ng-template #dateReadonlyHasValue>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) | date: getReadonlyDateFormat(field) }}</span>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #timeReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ formatTimeToDate(defaults[field.property]) | date: 'shortTime' }}</span>\n </div>\n</ng-template>\n\n<ng-template #phoneNumberReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #textReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\" *ngIf=\"!field.advancedFilter\"></label>\n <ng-container *ngIf=\"isReadonlyTextValueEmpty(defaults, field) && field.emptyReadonlyPlaceholderKey; else textReadonlyHasValue\">\n <span class=\"readonly-value readonly-value--empty\">{{ field.emptyReadonlyPlaceholderKey | translate }}</span>\n </ng-container>\n <ng-template #textReadonlyHasValue>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #textareaReadonly let-field=\"field\">\n <ng-container *ngIf=\"field.textFormat === 'json'; else normalText\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <div class=\"readonly-value json-viewer\">\n <ngx-json-viewer [json]=\"extractJsonFieldName(defaults, field.property)\" [expanded]=\"true\"></ngx-json-viewer>\n </div>\n </div>\n </ng-container>\n <ng-template #normalText>\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n </ng-template>\n</ng-template>\n\n<ng-template #numberReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #currencyReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #radioButtonReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ translateLable(defaults[field.property]) }}</span>\n </div>\n</ng-template>\n\n<ng-template #richTextReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\" [innerHtml]=\"extractFieldName(defaults, field.property)\"></span>\n </div>\n</ng-template>\n\n<ng-template #checkboxReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n <mat-icon color=\"warn\" *ngIf=\"extractFieldName(defaults, field.property); else showNo\">done</mat-icon>\n <ng-template #showNo>\n <mat-icon color=\"warn\">close</mat-icon>\n </ng-template>\n </span>\n </div>\n</ng-template>\n\n<ng-template #toggleReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n <mat-icon color=\"warn\" *ngIf=\"extractFieldName(defaults, field.property); else showNo\">done</mat-icon>\n <ng-template #showNo>\n <mat-icon color=\"warn\">close</mat-icon>\n </ng-template>\n </span>\n </div>\n</ng-template>\n\n<ng-template #listReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\" *ngIf=\"field.translate; else noTranslate\">\n {{ listShowValue(defaults, field) | translate }}\n </span>\n <ng-template #noTranslate>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </ng-template>\n </div>\n</ng-template>\n\n<ng-template #sequenceReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">{{ extractFieldName(defaults, field.property) }}</span>\n </div>\n</ng-template>\n\n<ng-template #lookupReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n {{ extractFieldName(defaults, field.property)?.[translateService.getDefaultLang() === 'en' ? 'englishName' : 'arabicName'] }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #amountReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <span class=\"readonly-value\">\n {{ extractFieldName(defaults, field.property) | currency: currency }}\n </span>\n </div>\n</ng-template>\n\n<ng-template #multiSelectReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></label>\n <mat-chip-grid class=\"readonly-value chipList\">\n <mat-chip *ngFor=\"let filedProp of showMultiSelectValuesAsReadonly(field)\">\n {{ filedProp }}\n </mat-chip>\n </mat-chip-grid>\n </div>\n</ng-template>\n\n<ng-template #chipListReadonly let-field=\"field\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" [innerHTML]=\"field.label | translate\"></label>\n <mat-chip-listbox class=\"readonly-value chipList\">\n <mat-chip-option *ngFor=\"let loc of splitReadonly(extractFieldName(defaults, field.property))\"\n [selectable]=\"true\"\n color=\"warn\"\n [removable]=\"false\">\n {{ loc }}\n </mat-chip-option>\n </mat-chip-listbox>\n </div>\n</ng-template>\n\n\n<ng-template #readonlyView>\n <div class=\"row-wrapper\">\n <div class=\"column-wrapper\">\n <ng-container *ngFor=\"let row of screenFields | keyvalue\">\n <div class=\"row-container\">\n <ng-container *ngFor=\"let field of row.value\">\n <div class=\"field-column readonly-item\" [style.flex]=\"field.fieldSize ? ('0 0 ' + field.fieldSize + '%') : '1 1 0'\">\n\n <ng-container [ngSwitch]=\"field.type\">\n\n <ng-container *ngSwitchCase=\"'attachment'\">\n <ng-container *ngIf=\"isAttachmentFieldEditable && showField(defaults, field)\">\n <div class=\"label-and-asterisk-container\">\n <span *ngIf=\"!field.hideLabel\" class=\"custom-label\" id=\"label-{{field.property}}\">\n {{ field.label! | translate }}\n </span>\n <span *ngIf=\"field.required && !field.hideLabel\" class=\"required-asterisk\"> * </span>\n </div>\n <app-attachment-uploader\n [acceptedTypes]=\"getAcceptedFileTypes(field)\"\n [ariaDescribedBy]=\"showError(field.property) ? 'error-' + field.property : null\"\n (fileSelected)=\"onAttachmentFileSelected($event, field)\"\n style=\"margin-top: 5px\">\n </app-attachment-uploader>\n <mat-error class=\"iq-error\"\n id=\"error-{{ field.property }}\"\n *ngIf=\"showError(field.property)\"\n aria-live=\"assertive\">\n {{ getErrors(field.property) | translate }}\n </mat-error>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'date'\">\n <ng-container [ngTemplateOutlet]=\"dateReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'time'\">\n <ng-container [ngTemplateOutlet]=\"timeReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'phone-number'\">\n <ng-container [ngTemplateOutlet]=\"phoneNumberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'text'\">\n <ng-container [ngTemplateOutlet]=\"textReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'textarea'\">\n <ng-container [ngTemplateOutlet]=\"textareaReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'number'\">\n <ng-container [ngTemplateOutlet]=\"numberReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'currency'\">\n <ng-container [ngTemplateOutlet]=\"currencyReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <ng-container [ngTemplateOutlet]=\"radioButtonReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <ng-container [ngTemplateOutlet]=\"checkboxReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'toggle'\">\n <ng-container [ngTemplateOutlet]=\"toggleReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'status'\">\n <ng-container [ngTemplateOutlet]=\"checkboxReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'lookup'\">\n <ng-container [ngTemplateOutlet]=\"lookupReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'amount'\">\n <ng-container [ngTemplateOutlet]=\"amountReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-select'\">\n <ng-container [ngTemplateOutlet]=\"multiSelectReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chip-list'\">\n <ng-container [ngTemplateOutlet]=\"chipListReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'sequence'\">\n <ng-container [ngTemplateOutlet]=\"sequenceReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'list'\">\n <ng-container [ngTemplateOutlet]=\"listReadonly\"\n [ngTemplateOutletContext]=\"{ field: field }\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'multi-state-checkbox'\">\n <div class=\"readonly-item\">\n <label class=\"readonly-label\" *ngIf=\"!field.hideLabel\" [innerHtml]=\"field.label | translate\"></label>\n <span class=\"readonly-value\">{{ getMultiStateReadonlySummary(field, defaults) }}</span>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'iban-text'\">\n <p class=\"label\">\n <span [innerHtml]=\"!field.hideLabel ? (field.label | translate) : ''\"></span>\n <span> : </span>\n <span class=\"value\" [innerHtml]=\"extractFieldName(defaults, field.property)\"></span>\n </p>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'section-title'\">\n <div class=\"hrdivider-mid\">\n <span>{{ field.label | translate }}</span>\n </div>\n </ng-container>\n\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n\n", styles: [".main-form-canvas{display:flex;flex-direction:row;gap:10px;align-items:flex-start;justify-content:flex-start;width:100%;flex-wrap:wrap}.form-wrapper{display:flex;flex-direction:column;flex:1}.form-container{display:flex;flex-direction:column;width:100%}.row-container{display:flex;flex-direction:row;gap:20px;flex-wrap:wrap;width:100%}.field-column{display:flex;flex-direction:column;flex:1}.label-and-asterisk-container{display:flex;align-items:center;gap:4px}.optional-text{color:#9b9b9b;font-size:11px;font-weight:400;line-height:1.4}.full-width{width:100%}.readonly-item{display:flex;flex-direction:column;align-items:flex-start;gap:2px;font-size:14px;padding:4px 0;width:100%;.readonly-label{font-weight:500;color:#9b9b9b;font-size:14px}.readonly-value{font-weight:500;color:#222;word-break:break-word;font-size:14px}.readonly-value--empty{font-style:italic;font-weight:500;color:#6b7280}.json-viewer{width:100%}.chipList{display:flex;flex-wrap:wrap;gap:4px}mat-icon{font-size:18px;vertical-align:middle}}.row-wrapper{display:flex;flex-direction:row;gap:20px;width:100%;flex-wrap:wrap}.column-wrapper{display:flex;flex-direction:column;width:100%;align-items:flex-start}.row-container{display:flex;flex-direction:row;gap:20px;width:100%;flex-wrap:wrap}.field-column{display:flex;flex-direction:column;min-width:50px!important}.field-row{display:flex;flex-direction:row;gap:10px;width:100%;align-items:flex-start}.field-label{flex:0 0 40%;display:flex;flex-direction:column;justify-content:center}.field-input{flex:0 0 60%;display:flex;flex-direction:column}.radio-group-custom{display:flex;flex-direction:row;flex-wrap:wrap;gap:10px}.clear-icon-button{width:40px!important;height:40px!important;min-width:40px!important;padding:8px!important;margin:0!important;margin-inline-start:4px!important;display:flex!important;align-items:center!important;justify-content:center!important;cursor:pointer!important}.clear-icon-button mat-icon{width:24px!important;height:24px!important;font-size:24px!important;line-height:24px!important;margin-top:0!important}.clear-icon-suffix{display:flex!important;align-items:center!important;align-content:center!important;height:100%!important}@media (max-width: 600px){.main-form-canvas{flex-direction:column}.row-container{flex-direction:column;gap:10px}.field-column{width:100%;flex:1 1 100%!important}.column-wrapper{align-items:center}.field-row{flex-direction:column}.field-label,.field-input{flex:1 1 100%}.radio-group-custom{flex-direction:column;gap:5px}}.custom-ngx-mat-intl-tel-input[readonly] input,.custom-ngx-mat-intl-tel-input.ngx-mat-intl-tel-input input[disabled]{pointer-events:none!important;background-color:#f5f5f5!important;color:#444!important}.custom-ngx-mat-intl-tel-input .iti__flag-container,.custom-ngx-mat-intl-tel-input .iti__selected-flag{pointer-events:none!important;opacity:.6}.custom-ngx-mat-intl-tel-input{pointer-events:none!important}::ng-deep .mat-datepicker-content-container mat-calendar.example-month-picker~.mat-datepicker-close-button{display:none!important}.time-picker-toggle .time-picker-toggle-button{--mdc-icon-button-state-layer-size: 40px;width:40px;height:40px;padding:0}.time-picker-toggle .mat-icon{width:20px;height:20px;font-size:20px}@media (max-width: 960px){.row-wrapper,.row-container{flex-direction:column}.row-container{gap:15px}.field-column{flex:1 1 100%!important}}.multi-state-filter{display:flex;flex-direction:column;align-items:flex-start}.multi-state-filter__trigger{display:flex;align-items:center;justify-content:space-between;gap:4px;min-height:45px;padding:0 16px;margin:0;border:1px solid #b7b7b7;border-radius:8px;background:#fff;cursor:pointer;font-family:inherit;font-size:16px;font-weight:300;line-height:1.2;color:#000;box-sizing:border-box;width:100%}.multi-state-filter__trigger:focus-visible{outline:2px solid #0d4261;outline-offset:2px}.multi-state-filter__trigger-text{flex:1 1 auto;text-align:left;color:#000;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}.multi-state-filter__trigger-text--placeholder{color:#888}:host ::ng-deep .mat-mdc-select-placeholder{color:#888!important}.multi-state-filter__chevron{flex-shrink:0;width:24px;height:24px;font-size:24px;color:#0d4261}::ng-deep .multi-state-filter__menu-panel{max-width:320px;min-width:250px}.multi-state-filter__menu-inner{padding:4px 0}.multi-state-filter__row{display:flex;align-items:center;gap:8px;min-height:28px;max-height:34px;padding:4px 8px;box-sizing:border-box}.multi-state-filter__pill{display:inline-flex;align-items:center;justify-content:center;min-height:24px;padding:0 16px;font-size:14px;font-weight:400;line-height:1.2;white-space:nowrap}\n"] }]
810
814
  }], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.ActivatedRoute }, { type: i3.BackendService }, { type: i4.FormBuilder }, { type: i5.LiveAnnouncer }], propDecorators: { pageInfo: [{
811
815
  type: Input
812
816
  }], currency: [{
@@ -845,4 +849,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
845
849
  type: ViewChild,
846
850
  args: ['EquationValueInput']
847
851
  }] } });
848
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNhbnZhcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtZm9ybS1jYW52YXMvYmFzZS1mb3JtLWNhbnZhcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtZm9ybS1jYW52YXMvYmFzZS1mb3JtLWNhbnZhcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUVOLFNBQVMsRUFDVCxRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXlCLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRyxPQUFPLEVBQ0wsT0FBTyxFQUNQLFdBQVcsRUFDWCxZQUFZLEVBRVosY0FBYyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQzVDLFVBQVUsRUFDWCxNQUFNLHlCQUF5QixDQUFDO0FBSWpDLE9BQU8sRUFBQyxlQUFlLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFFdEUsT0FBTyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHOUQsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osUUFBUSxFQUNSLFlBQVksRUFDWixPQUFPLEVBQ1AsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQ3RCLFFBQVEsRUFDUixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2pCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFDLFFBQVEsRUFBRSxrQkFBa0Is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QUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxF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QkFEUCxLQUFLO2dCQUlOLHlCQUF5QjtzQkFEeEIsS0FBSztnQkFNTixrQkFBa0I7c0JBRGpCLEtBQUs7Z0JBSU4sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sSUFBSTtzQkFESCxLQUFLO2dCQUtJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUlQLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBbUJFLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFhMkIsV0FBVztzQkFBM0MsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBjb21wdXRlZCxcbiAgbW9kZWwsXG4gIHNpZ25hbFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgRm9ybXNNb2R1bGUsIEZvcm1Db250cm9sfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gIE1hdENoaXAsXG4gIE1hdENoaXBHcmlkLFxuICBNYXRDaGlwSW5wdXQsXG4gIE1hdENoaXBJbnB1dEV2ZW50LFxuICBNYXRDaGlwTGlzdGJveCwgTWF0Q2hpcE9wdGlvbiwgTWF0Q2hpcFJlbW92ZSxcbiAgTWF0Q2hpcFJvd1xufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHNcIjtcbmltcG9ydCB7RmllbGRJbmZvfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9maWVsZC1pbmZvXCI7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQge0JhY2tlbmRTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvYmFja2VuZC1zZXJ2aWNlXCI7XG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcbmltcG9ydCB7UGFnZUluZm99IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL3BhZ2UtaW5mb1wiO1xuaW1wb3J0IHtDT01NQSwgRU5URVIsIFNFTUlDT0xPTn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9rZXljb2Rlc1wiO1xuaW1wb3J0IHtMb29rdXBJdGVtfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9sb29rdXBJdGVtXCI7XG5pbXBvcnQge0ZpZWxkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvYXBpLXJlc3BvbnNlXCI7XG5pbXBvcnQge1xuICBBc3luY1BpcGUsXG4gIEN1cnJlbmN5UGlwZSxcbiAgRGF0ZVBpcGUsXG4gIEtleVZhbHVlUGlwZSxcbiAgTmdGb3JPZixcbiAgTmdJZiwgTmdDbGFzcywgTmdTdHlsZSxcbiAgTmdTd2l0Y2gsXG4gIE5nU3dpdGNoQ2FzZSxcbiAgTmdUZW1wbGF0ZU91dGxldFxufSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge01hdEVycm9yLCBNYXRGb3JtRmllbGRNb2R1bGUsIE1hdExhYmVsfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xuaW1wb3J0IHtNYXRJbnB1dE1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2lucHV0XCI7XG5pbXBvcnQge01hdERhdGVwaWNrZXIsIE1hdERhdGVwaWNrZXJJbnB1dCwgTWF0RGF0ZXBpY2tlclRvZ2dsZSwgTWF0RGF0ZVJhbmdlSW5wdXR9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyXCI7XG5pbXBvcnQge01hdEljb259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCI7XG5pbXBvcnQge01hdEljb25CdXR0b259IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9idXR0b25cIjtcbmltcG9ydCB7Q2RrVGV4dGFyZWFBdXRvc2l6ZX0gZnJvbSBcIkBhbmd1bGFyL2Nkay90ZXh0LWZpZWxkXCI7XG5pbXBvcnQge01hdFJhZGlvQnV0dG9uLCBNYXRSYWRpb0dyb3VwfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvcmFkaW9cIjtcbmltcG9ydCB7TWF0Q2hlY2tib3h9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveFwiO1xuaW1wb3J0IHtNYXRTbGlkZVRvZ2dsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NsaWRlLXRvZ2dsZVwiO1xuaW1wb3J0IHtNYXRPcHRpb24sIE1hdFNlbGVjdH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NlbGVjdFwiO1xuaW1wb3J0IHtNYXRNZW51LCBNYXRNZW51SXRlbSwgTWF0TWVudVRyaWdnZXJ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9tZW51XCI7XG5pbXBvcnQge01hdERpdmlkZXJ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaXZpZGVyXCI7XG5pbXBvcnQge05neEpzb25WaWV3ZXJNb2R1bGV9IGZyb20gXCJuZ3gtanNvbi12aWV3ZXJcIjtcbmltcG9ydCB7Tmd4TWF0SW50bFRlbElucHV0Q29tcG9uZW50fSBmcm9tIFwibmd4LW1hdC1pbnRsLXRlbC1pbnB1dFwiO1xuaW1wb3J0IHtNdWx0aUF1dG9Db21wbGV0ZUNvbXBvbmVudH0gZnJvbSBcIi4uL211bHRpLWF1dG8tY29tcGxldGUvbXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnRcIjtcbmltcG9ydCB7QXV0b0NvbXBsZXRlQ29tcG9uZW50fSBmcm9tIFwiLi4vYXV0by1jb21wbGV0ZS9hdXRvLWNvbXBsZXRlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtBdHRhY2htZW50VXBsb2FkZXJDb21wb25lbnR9IGZyb20gXCIuLi9zaGFyZWQvYXR0YWNobWVudC11cGxvYWRlci9hdHRhY2htZW50LXVwbG9hZGVyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNYXRBdXRvY29tcGxldGUsIE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQsIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXJ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9hdXRvY29tcGxldGVcIjtcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBtYXB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge0xpdmVBbm5vdW5jZXJ9IGZyb20gXCJAYW5ndWxhci9jZGsvYTExeVwiO1xuaW1wb3J0IHtidWlsZEZvcm1GaWVsZHMsIGV4dHJhY3RGaWVsZE5hbWV9IGZyb20gXCIuLi8uLi91dGlscy9iYXNlLXV0aWxzXCI7XG5pbXBvcnQgbW9tZW50LCB7TW9tZW50fSBmcm9tIFwibW9tZW50L21vbWVudFwiO1xuaW1wb3J0IHtNYXRDZWxsLCBNYXRDZWxsRGVmLCBNYXRIZWFkZXJDZWxsLCBNYXRIZWFkZXJDZWxsRGVmfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcbmltcG9ydCB7RGF0ZUFkYXB0ZXIsIE1BVF9EQVRFX0ZPUk1BVFMsIE1BVF9EQVRFX0xPQ0FMRX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NvcmVcIjtcbmltcG9ydCB7TUFUX01PTUVOVF9EQVRFX0FEQVBURVJfT1BUSU9OUywgTW9tZW50RGF0ZUFkYXB0ZXJ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC1tb21lbnQtYWRhcHRlclwiO1xuaW1wb3J0IHtEZWNpbWFsT25seURpcmVjdGl2ZX0gZnJvbSBcIi4vTnVtYmVyc09ubHlEaXJlY3RpdmVcIjtcbmltcG9ydCB7TWF4RGlnaXRzRGlyZWN0aXZlfSBmcm9tIFwiLi9NYXhEaWdpdHNEaXJlY3RpdmVcIjtcbmltcG9ydCB7UGhvbmVOdW1iZXJPbmx5RGlyZWN0aXZlfSBmcm9tIFwiLi4vLi4vZGlyZWN0aXZlcy9waG9uZS1udW1iZXItb25seS5kaXJlY3RpdmVcIjtcbmV4cG9ydCBjb25zdCBERF9NTV9ZWVlZX0Zvcm1hdCA9IHtcbiAgcGFyc2U6IHsgZGF0ZUlucHV0OiAnREQvTU0vWVlZWScgfSxcbiAgZGlzcGxheToge1xuICAgIGRhdGVJbnB1dDogJ0REL01NL1lZWVknLFxuICAgIG1vbnRoWWVhckxhYmVsOiAnTU1NIFlZWVknLFxuICAgIGRhdGVBMTF5TGFiZWw6ICdERC9NTS9ZWVlZJyxcbiAgICBtb250aFllYXJBMTF5TGFiZWw6ICdNTU1NIFlZWVknLFxuICB9LFxufTtcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1iYXNlLWZvcm0tY2FudmFzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTmdTd2l0Y2gsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTmdGb3JPZixcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIEtleVZhbHVlUGlwZSxcbiAgICBOZ0lmLFxuICAgIE5nQ2xhc3MsXG4gICAgTWF0TGFiZWwsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBNYXRJbnB1dE1vZHVsZSxcbiAgICBNYXREYXRlcGlja2VySW5wdXQsXG4gICAgTWF0RGF0ZXBpY2tlcixcbiAgICBNYXREYXRlcGlja2VyVG9nZ2xlLFxuICAgIE1hdEVycm9yLFxuICAgIE5nU3dpdGNoQ2FzZSxcbiAgICBNYXRJY29uLFxuICAgIE1hdEljb25CdXR0b24sXG4gICAgTWF0QXV0b2NvbXBsZXRlLFxuICAgIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIsXG4gICAgTWF0Q2hpcCxcbiAgICBDZGtUZXh0YXJlYUF1dG9zaXplLFxuICAgIE1hdFJhZGlvR3JvdXAsXG4gICAgTWF0Q2hlY2tib3gsXG4gICAgTWF0UmFkaW9CdXR0b24sXG4gICAgTWF0U2xpZGVUb2dnbGUsXG4gICAgTWF0U2VsZWN0LFxuICAgIE1hdE9wdGlvbixcbiAgICBQaG9uZU51bWJlck9ubHlEaXJlY3RpdmUsXG4gICAgTWF0TWVudSxcbiAgICBNYXRNZW51SXRlbSxcbiAgICBNYXRNZW51VHJpZ2dlcixcbiAgICBNYXREaXZpZGVyLFxuICAgIERhdGVQaXBlLFxuICAgIE5neEpzb25WaWV3ZXJNb2R1bGUsXG4gICAgQ3VycmVuY3lQaXBlLFxuICAgIE5neE1hdEludGxUZWxJbnB1dENvbXBvbmVudCxcbiAgICBNYXRDaGlwR3JpZCxcbiAgICBNYXRDaGlwSW5wdXQsXG4gICAgTWF0Q2hpcFJvdyxcbiAgICBNYXRDaGlwTGlzdGJveCxcbiAgICBNYXRDaGlwT3B0aW9uLFxuICAgIE11bHRpQXV0b0NvbXBsZXRlQ29tcG9uZW50LFxuICAgIEF1dG9Db21wbGV0ZUNvbXBvbmVudCxcbiAgICBNYXREYXRlUmFuZ2VJbnB1dCxcbiAgICBBc3luY1BpcGUsXG4gICAgTWF0Q2hpcFJlbW92ZSxcbiAgICBNYXRDZWxsLFxuICAgIE1hdENlbGxEZWYsXG4gICAgTWF0SGVhZGVyQ2VsbCxcbiAgICBNYXRIZWFkZXJDZWxsRGVmLFxuICAgIE5nU3R5bGUsXG4gICAgQXR0YWNobWVudFVwbG9hZGVyQ29tcG9uZW50LFxuICAgIERlY2ltYWxPbmx5RGlyZWN0aXZlLFxuICAgIE1heERpZ2l0c0RpcmVjdGl2ZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vYmFzZS1mb3JtLWNhbnZhcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9iYXNlLWZvcm0tY2FudmFzLmNvbXBvbmVudC5jc3MnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBEYXRlQWRhcHRlcixcbiAgICAgIHVzZUNsYXNzOiBNb21lbnREYXRlQWRhcHRlcixcbiAgICAgIGRlcHM6IFtNQVRfREFURV9MT0NBTEUsIE1BVF9NT01FTlRfREFURV9BREFQVEVSX09QVElPTlNdXG4gICAgfSxcbiAgICB7IHByb3ZpZGU6IE1BVF9EQVRFX0ZPUk1BVFMsIHVzZVZhbHVlOiBERF9NTV9ZWVlZX0Zvcm1hdCB9LFxuICAgIHsgcHJvdmlkZTogTUFUX0RBVEVfTE9DQUxFLCB1c2VWYWx1ZTogJ2VuLUdCJyB9XG4gIF1cblxufSlcbmV4cG9ydCBjbGFzcyBCYXNlRm9ybUNhbnZhc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwdWJsaWMgaGlkZTogYm9vbGVhbiA9IHRydWU7XG4gIGRhdGVWaWV3TW9kZTogJ21vbnRoJyB8ICd5ZWFyJyB8ICdtdWx0aS15ZWFyJyA9ICdtb250aCc7XG4gIEBJbnB1dCgpXG4gIHBhZ2VJbmZvITogUGFnZUluZm87XG5cblxuICBASW5wdXQoKVxuICBjdXJyZW5jeTogc3RyaW5nO1xuXG4gIEBJbnB1dCgpLy8gQHRzLWlnbm9yZVxuICBmaWVsZHM6IEZpZWxkSW5mb1tdID0gW107XG5cbiAgQElucHV0KCkvLyBAdHMtaWdub3JlXG4gIGVycm9yczogRmllbGRNZXNzYWdlW10gPSBbXTtcblxuICBASW5wdXQoKVxuICB3b3JrZmxvd0VkaXRhYmxlRmllbGRzOiBzdHJpbmdbXT1bXTtcbiAgQElucHV0KClcbiAgaXNXb3JrZmxvd0VkaXRhYmxlTWFuYWdlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHN1cHBvcnRpbmdBdHRyaWJ1dGVzOiBhbnk7XG5cbiAgQElucHV0KClcbiAgZWRpdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBhdHRhY2htZW50c0Fsd2F5c0VkaXRhYmxlPzogYm9vbGVhbjtcblxuICAvLyBXaGVuIHRydWUsIGVtaXQgZm9ybVVwZGF0ZWQgb24gZXZlcnkgdmFsdWUgY2hhbmdlLiBEZWZhdWx0IGlzIGZhbHNlIHRvIGF2b2lkXG4gIC8vIG5vaXN5IGVtaXNzaW9ucyBmb3IgYWxsIGNvbnN1bWVycy4gSXRlbS1saW5lLWVkaXRvciB3aWxsIGVuYWJsZSB0aGlzIGV4cGxpY2l0bHkuXG4gIEBJbnB1dCgpXG4gIGVtaXRPblZhbHVlQ2hhbmdlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGZpbHRlclJlc2V0Tm9uY2UgPSAwO1xuXG4gIEBJbnB1dCgpXG4gIGl0ZW06IGFueSA9IHt9O1xuXG4gIF9kZWZhdWx0czogYW55ID0ge307XG5cbiAgQE91dHB1dCgpIGF0dGFjaG1lbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBPdXRwdXQoKSBhY3Rpb25FbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG5cbiAgQE91dHB1dCgpXG4gIGZvcm1VcGRhdGVkOiBFdmVudEVtaXR0ZXI8Rm9ybUdyb3VwPiA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybUdyb3VwPigpO1xuXG4gIEBPdXRwdXQoKVxuICBoeXBlclRleHRFdmVudDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cbiAgZm9ybVBhcmFtITogRm9ybUdyb3VwO1xuICBzY3JlZW5GaWVsZHMgPSBuZXcgTWFwPG51bWJlciwgRmllbGRJbmZvW10+KCk7XG4gIHJlbW92YWJsZSA9IHRydWU7XG4gIHNlbGVjdGFibGUgPSB0cnVlO1xuICBhZGRPbkJsdXIgPSB0cnVlO1xuXG4gIHJlYWRvbmx5IHNlcGFyYXRvcktleXNDb2RlczogbnVtYmVyW10gPSBbRU5URVIsIENPTU1BLCBTRU1JQ09MT05dO1xuXG4gIHJlYWRvbmx5IG1pbkRhdGUgPSBtb21lbnQoWzE4MDAsIDAsIDFdKTtcblxuICBwdWJsaWMgaXNQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBpc05ldzogYm9vbGVhbiA9IGZhbHNlO1xuICBpdGVtSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBlcXVhdGlvbk9wZXJhdG9ycyA6IHN0cmluZ1tdID0gWycrJywnLScsJygnIF07XG4gIEBJbnB1dCgpIGVxdWF0aW9uU3VnZ2VzdGVkRmllbGRzOiB7IG5hbWU6IHN0cmluZywgaWQ6IHN0cmluZyB9W10gPSBbXTtcbiAgYWxsRXF1YXRpb25GaWVsZHM6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT47XG4gIHJlYWRvbmx5IGVxdWF0aW9uVmFsdWVzID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG4gIGN1cnJlbnRFcXVhdGlvblZhbHVlID0gbW9kZWw8c3RyaW5nPignJyk7XG5cbiAgcmVhZG9ubHkgZXF1YXRpb25GaWx0ZXJlZEZpZWxkcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50RXF1YXRpb25WYWx1ZSA9IHRoaXMuY3VycmVudEVxdWF0aW9uVmFsdWUoKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0aGlzLmFsbEVxdWF0aW9uRmllbGRzLnBpcGUoXG4gICAgICAgIG1hcChmaWVsZHMgPT5cbiAgICAgICAgICAgIGN1cnJlbnRFcXVhdGlvblZhbHVlID8gZmllbGRzPy5maWx0ZXIoZmllbGQgPT4gZmllbGQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhjdXJyZW50RXF1YXRpb25WYWx1ZSkpIDogZmllbGRzPy5zbGljZSgpXG4gICAgICAgIClcbiAgICApO1xuICB9KTtcbiAgQFZpZXdDaGlsZCgnRXF1YXRpb25WYWx1ZUlucHV0JykgZmllbGRzSW5wdXQ6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgc2V0IGRlZmF1bHRzKHZhbHVlOiBhbnkgfCB1bmRlZmluZWQpIHtcbiAgICAvLyB0aGlzLmJhY2tlbmRTZXJ2aWNlLl9kZWZhdWx0cyA9IHZhbHVlO1xuICAgIHRoaXMuX2RlZmF1bHRzID0gdmFsdWU7XG4gICAgdGhpcy5idWlsZEZvcm0oKTtcbiAgICAvLyB0aGlzLm15Q2FsbGJhY2sgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBkZWZhdWx0cygpOiBhbnkgfCB1bmRlZmluZWQge1xuICAgIC8vIHRoaXMubXlDYWxsYmFjaztcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdHM7XG4gICAgLy8gcmV0dXJuIHRoaXMuYmFja2VuZFNlcnZpY2UuX2RlZmF1bHRzO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBiYWNrZW5kU2VydmljZTogQmFja2VuZFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIGFubm91bmNlcjogTGl2ZUFubm91bmNlcikge1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYodGhpcy5pdGVtICYmIHRoaXMuaXRlbS5maWVsZFZhbHVlKXtcbiAgICAgIHRoaXMuZXF1YXRpb25WYWx1ZXMudXBkYXRlKHZhbHVlID0+IHRoaXMuaXRlbS5maWVsZFZhbHVlKVxuICAgIH1cbiAgICB0aGlzLmRlZmF1bHRzID0gdGhpcy5pdGVtO1xuICAgIHRoaXMuZXh0cmFjdExhYmxlcygpO1xuICAgIHRoaXMuYnVpbGRGb3JtKCk7XG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5kYXRhLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMuaXNQZW5kaW5nID0gZGF0YVsnbW9kZSddID09PSAncGVuZGluZyc7XG4gICAgICB0aGlzLmlzTmV3ID0gZGF0YVsnbW9kZSddID09PSAnbmV3JztcbiAgICB9KTtcbiAgICAvLyB0aGlzLmF1dGhTZXJ2aWNlLnN1bW1hcnlQYW5lbFN0YXRlJC5uZXh0KENvbnN0YW50cy5TVU1NQVJZX1BBTkVMX0NMT1NFRCk7XG4gICAgLy8gdGhpcy5kZWZhdWx0cyA9IHt9O1xuICAgIC8vIHRoaXMuaW52b2ljZVFJbml0KCk7XG4gICAgdGhpcy5hbGxFcXVhdGlvbkZpZWxkcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+KFtdKTtcblxuICAgIHRoaXMudXBkYXRlRXF1YXRpb25PcHRpb25zKCk7XG4gIH1cblxuICBmb3JtYXRUaW1lVG9EYXRlKHY6IGFueSl7XG4gICAgY29uc3QgZnJvbVRpbWU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGlmICh2KSB7XG4gICAgICBsZXQgc3BsaXQgPSB2LnNwbGl0KFwiOlwiKTtcbiAgICAgIGZyb21UaW1lLnNldEhvdXJzKHNwbGl0WzBdLCBzcGxpdFsxXSk7XG4gICAgICByZXR1cm4gbmV3IERhdGUoZnJvbVRpbWUuZ2V0VGltZSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICBwYXRjaExvb2t1cFZhbHVlKCRldmVudDogTG9va3VwSXRlbSwgZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoJGV2ZW50Py5pZCAhPT0gLTEgJiYgdGhpcy5kZWZhdWx0cykge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5kZWZhdWx0c1tmaWVsZE5hbWVdID0gdGhpcy5mb3JtUGFyYW0uZ2V0KGZpZWxkTmFtZSkudmFsdWU7XG4gICAgfVxuICB9XG4gIGdldEJhbmtOYW1lKGZpZWxkTmFtZTogc3RyaW5nKSB7XG4gICAgLy9UT0RPIEJhdG9vbCBkbyB3ZSBuZWVkIHRoaXMgaGVyZSA/XG4gICAgaWYgKHRoaXMuZm9ybVBhcmFtLmdldChmaWVsZE5hbWUpLnZhbHVlPy5sZW5ndGggPiAxMCAmJiAhaXNOYU4odGhpcy5mb3JtUGFyYW0uZ2V0KGZpZWxkTmFtZSkudmFsdWUpICkge1xuICAgICAgcmV0dXJuICcgLyAnICsgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0JBTksuJyArIHRoaXMuZm9ybVBhcmFtLmdldChmaWVsZE5hbWUpLnZhbHVlPy5zdWJzdHIoNCwgNCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgcGF0Y2hNdWx0aVNlbGVjdFZhbHVlKCRldmVudDogTG9va3VwSXRlbVtdLCBmaWVsZE5hbWU6IHN0cmluZykge1xuICAgIGlmICgkZXZlbnQ/Lmxlbmd0aCA+PSAwICYmIHRoaXMuZGVmYXVsdHMpIHtcbiAgICAgIHRoaXMuZGVmYXVsdHNbZmllbGROYW1lXSA9IHRoaXMuZm9ybVBhcmFtLmdldChmaWVsZE5hbWUpLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGl0ZW0sIGVycm9ycywgZmllbGRzLCBmaWx0ZXJSZXNldE5vbmNlIH0gPSBjaGFuZ2VzO1xuXG4gICAgZXJyb3JzPy5jdXJyZW50VmFsdWU/LmZvckVhY2goKG1zZzogRmllbGRNZXNzYWdlKSA9PiB7XG4gICAgICB0aGlzLmZvcm1QYXJhbS5nZXQobXNnLmZpZWxkTmFtZSk/LnNldEVycm9ycyh7c2VydmVyRXJyb3I6IG1zZy5tZXNzYWdlfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoaXRlbT8uY3VycmVudFZhbHVlICYmICFpdGVtLmlzRmlyc3RDaGFuZ2UoKSl7XG4gICAgICB0aGlzLmRlZmF1bHRzID0gaXRlbS5jdXJyZW50VmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkcz8uY3VycmVudFZhbHVlICYmICFmaWVsZHMuaXNGaXJzdENoYW5nZSgpKXtcbiAgICAgIHRoaXMuYnVpbGRGb3JtKCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgZmlsdGVyUmVzZXROb25jZSAmJlxuICAgICAgIWZpbHRlclJlc2V0Tm9uY2UuaXNGaXJzdENoYW5nZSgpICYmXG4gICAgICBmaWx0ZXJSZXNldE5vbmNlLmN1cnJlbnRWYWx1ZSAhPT0gZmlsdGVyUmVzZXROb25jZS5wcmV2aW91c1ZhbHVlXG4gICAgKSB7XG4gICAgICB0aGlzLnJlc2V0RmlsdGVyRm9ybVZhbHVlcygpO1xuICAgIH1cbiAgfVxuXG4gIHNob3dGaWVsZChpdGVtOiBhbnksIGZpZWxkOiBhbnkpIHtcbiAgICByZXR1cm4gKGl0ZW0uaWQgfHwgKCFpdGVtLmlkICYmICFmaWVsZC51cGRhdGVPbmx5KSkgJiYgZmllbGQudmlzaWJsZVxuICB9XG5cbiAgZ2V0IGlzQXR0YWNobWVudEZpZWxkRWRpdGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXR0YWNobWVudHNBbHdheXNFZGl0YWJsZSA/PyB0aGlzLmVkaXRhYmxlO1xuICB9XG5cbiAgd29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkOiB7IHByb3BlcnR5OiBzdHJpbmc7IH0pIHtcbiAgICBjb25zdCB4ID0gdGhpcy5pc1dvcmtmbG93RWRpdGFibGVNYW5hZ2VkID8gdGhpcy53b3JrZmxvd0VkaXRhYmxlRmllbGRzPy5maW5kSW5kZXgoZCA9PiBkID09PSBmaWVsZC5wcm9wZXJ0eSkgPiAtMSA6IHRydWU7XG4gICAgcmV0dXJuIHg7XG4gIH1cblxuICBzaG93TXVsdGlTZWxlY3RWYWx1ZXNBc1JlYWRvbmx5KGZpZWxkOiBGaWVsZEluZm8pIHtcbiAgICBjb25zb2xlLmxvZyhcIi4wMzE1MTI1MTU2NFwiKVxuICAgIGNvbnN0IHZpZXdQcm9wID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldERlZmF1bHRMYW5nKCkgPT09ICdlbicgPyAnZW5nbGlzaE5hbWUnIDogJ2FyYWJpY05hbWUnO1xuICAgIHJldHVybiB0aGlzLmV4dHJhY3RGaWVsZE5hbWUodGhpcy5kZWZhdWx0cyxmaWVsZC5wcm9wZXJ0eSk/Lm1hcCgoYTogeyBbeDogc3RyaW5nXTogYW55OyB9KSA9PiBhW3ZpZXdQcm9wXSk7XG4gIH1cblxuICBzcGxpdFJlYWRvbmx5KHZhbHVlczogYW55KSB7XG4gICAgcmV0dXJuICF2YWx1ZXMgfHwgdmFsdWVzID09PSAnJyA/IFtdOiB2YWx1ZXMuc3BsaXQoJzsnKTtcbiAgfVxuXG5cbiAgcmVmZXJlbmNlQXR0cmlidXRlVHJ1ZShmaWVsZE5hbWU6IHN0cmluZywgYXR0cmlidXRlOiBhbnkpIHtcbiAgICAvLyByZXR1cm4gdGhpcy5hdXRoU2VydmljZS5yZWZlcmVuY2VBdHRyaWJ1dGVUcnVlKGZpZWxkTmFtZSwgdGhpcy5wYWdlSW5mby5wcm9jZXNzSWQsIGF0dHJpYnV0ZSk7XG4gIH1cblxuICB0cmFuc2xhdGVMYWJsZShpdGVtRWxlbWVudDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGl0ZW1FbGVtZW50KVxuICB9XG5cbiAgYnVpbGRGb3JtKCkge1xuICAgIGlmICghdGhpcy5maWVsZHMgfHwgdGhpcy5maWVsZHMubGVuZ3RoID09PSAwIHx8ICF0aGlzLmRlZmF1bHRzKSByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMuZm9ybVBhcmFtKSB7XG4gICAgICB0aGlzLmZvcm1QYXJhbSA9IHRoaXMuZmIuZ3JvdXAoYnVpbGRGb3JtRmllbGRzKHRoaXMuZmllbGRzLCB0aGlzLmRlZmF1bHRzKSk7XG4gICAgICB0aGlzLnBhdGNoRGlzYWJsZWRGb3JtVmFsaWRpdHkoKTtcbiAgICAgIC8vIEVtaXQgaW5pdGlhbCBmb3JtIHJlZmVyZW5jZVxuICAgICAgdGhpcy5mb3JtVXBkYXRlZC5uZXh0KHRoaXMuZm9ybVBhcmFtKTtcbiAgICAgIC8vIEVtaXQgb24gZXZlcnkgdmFsdWUgY2hhbmdlIHNvIHBhcmVudCBjb21wb25lbnRzIGNhbiByZWFjdCBsaXZlXG4gICAgICBpZiAodGhpcy5lbWl0T25WYWx1ZUNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5mb3JtUGFyYW0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5mb3JtVXBkYXRlZC5lbWl0KHRoaXMuZm9ybVBhcmFtKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0Y2hWYWx1ZXM6IGFueSA9IHt9O1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC5yZWFkb25seSkge1xuICAgICAgICB0aGlzLmZvcm1QYXJhbS5nZXQoZmllbGQucHJvcGVydHkpPy5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybVBhcmFtLmdldChmaWVsZC5wcm9wZXJ0eSk/LmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQudHlwZSAhPT0gJ3NwYWNlcicpIHtcbiAgICAgICAgbGV0IHYgPSBleHRyYWN0RmllbGROYW1lKHRoaXMuZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KTtcbiAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdtdWx0aS1zdGF0ZS1jaGVja2JveCcgJiYgKHYgPT09IHVuZGVmaW5lZCB8fCB2ID09PSBudWxsKSkge1xuICAgICAgICAgIHYgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBwYXRjaFZhbHVlc1tmaWVsZC5wcm9wZXJ0eV0gPSB2O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZm9ybVBhcmFtLnBhdGNoVmFsdWUocGF0Y2hWYWx1ZXMsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB0aGlzLnBhdGNoRGlzYWJsZWRGb3JtVmFsaWRpdHkoKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBwYXRjaERpc2FibGVkRm9ybVZhbGlkaXR5KCk6IHZvaWQge1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1QYXJhbTtcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZvcm0sICd2YWxpZCcsIHtcbiAgICAgIGdldDogKCkgPT4gZm9ybS5zdGF0dXMgPT09ICdESVNBQkxFRCcgfHwgZm9ybS5zdGF0dXMgPT09ICdWQUxJRCcsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGaWx0ZXJGb3JtVmFsdWVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5mb3JtUGFyYW0gfHwgIXRoaXMuZmllbGRzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZW1wdHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgIT09ICdzcGFjZXInKSB7XG4gICAgICAgIGVtcHR5W2ZpZWxkLnByb3BlcnR5XSA9IGZpZWxkLnR5cGUgPT09ICdtdWx0aS1zdGF0ZS1jaGVja2JveCcgPyBbXSA6IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZm9ybVBhcmFtLnBhdGNoVmFsdWUoZW1wdHksIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICB9XG5cbiAgbGFiZWxLZXkoY29sdW1uOiBhbnkpIHtcbiAgICBjb25zdCBjb25maWd1cmVkS2V5ID0gY29sdW1uLmxhYmVsID8gY29sdW1uLmxhYmVsIDogY29sdW1uLnByb3BlcnR5XG4gICAgcmV0dXJuIGNvbmZpZ3VyZWRLZXkuc3RhcnRzV2l0aCh0aGlzLnBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24pID8gYCR7Y29uZmlndXJlZEtleX1gIDogYCR7dGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9ufS4ke2NvbmZpZ3VyZWRLZXl9YDtcbiAgfVxuXG4gIGxhYmVsS2V5UGxhY2VIb2xkZXIoY29sdW1uOiBhbnkpIHtcbiAgICBjb25zdCBjb25maWd1cmVkS2V5ID0gY29sdW1uLnBsYWNlaG9sZGVyID8gY29sdW1uLnBsYWNlaG9sZGVyIDogY29sdW1uLnByb3BlcnR5XG4gICAgcmV0dXJuIGNvbmZpZ3VyZWRLZXkuc3RhcnRzV2l0aCh0aGlzLnBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24pID8gYCR7Y29uZmlndXJlZEtleX1gIDogYCR7dGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9ufS4ke2NvbmZpZ3VyZWRLZXl9YDtcbiAgfVxuXG4gIGJsb2NrTmVnYXRpdmVOdW1iZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBmaWVsZDogRmllbGRJbmZvKTogdm9pZCB7XG4gICAgaWYgKGZpZWxkLmFsbG93TmVnYXRpdmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJy0nIHx8IGV2ZW50LmNvZGUgPT09ICdNaW51cycgfHwgZXZlbnQuY29kZSA9PT0gJ051bXBhZFN1YnRyYWN0Jykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBvcGVuVGltZVBpY2tlcihpbnB1dDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghaW5wdXQgfHwgaW5wdXQuZGlzYWJsZWQgfHwgaW5wdXQucmVhZE9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGlucHV0LnNob3dQaWNrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlucHV0LnNob3dQaWNrZXIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGlucHV0LmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5wdXQuZm9jdXMoKTtcbiAgICBpbnB1dC5jbGljaygpO1xuICB9XG5cbiAgZ2V0RXJyb3JzKHByb3A6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybVBhcmFtPy5nZXQoW3Byb3BdKTtcbiAgICBpZiAoIWNvbnRyb2wgfHwgY29udHJvbC5kaXNhYmxlZCkgcmV0dXJuICcnO1xuXG4gICAgaWYgKGNvbnRyb2wuaW52YWxpZCAmJiBjb250cm9sLmVycm9ycykge1xuICAgICAgY29uc3QgZXJyID0gY29udHJvbC5lcnJvcnM7XG4gICAgICBpZiAoZXJyWydtYXREYXRlcGlja2VyTWluJ10pIHtcbiAgICAgICAgcmV0dXJuICdtYXREYXRlcGlja2VyTWluJztcbiAgICAgIH1cbiAgICAgIGlmIChlcnJbJ21hdERhdGVwaWNrZXJNYXgnXSkge1xuICAgICAgICByZXR1cm4gJ21hdERhdGVwaWNrZXJNYXgnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMuZmluZChmID0+IGYucHJvcGVydHkgPT09IHByb3ApO1xuXG4gICAgaWYgKCFmaWVsZD8udmFsaWRhdGlvbk1lc3NhZ2VzKSB7XG4gICAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICdwaG9uZS1udW1iZXInICYmIGNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmRpcnR5ICYmICFjb250cm9sLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHRoaXMucGFnZUluZm8ubGFiZWxzU2VjdGlvbiArIFwiLlwiO1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ0lOVkFMSURfUEhPTkVfTlVNQkVSJztcbiAgICAgIH1cbiAgICAgIGlmIChjb250cm9sLnZhbHVlICYmIGNvbnRyb2wuc3RhdHVzICE9PSAnVkFMSUQnICYmIHRoaXMuZ2V0Rmlyc3RFcnJvcktleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaXJzdEVycm9yS2V5KHByb3ApO1xuICAgICAgfVxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ3Bob25lLW51bWJlcicgJiYgY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZGlydHkgJiYgIWNvbnRyb2wudmFsdWUpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IHRoaXMucGFnZUluZm8ubGFiZWxzU2VjdGlvbiArIFwiLlwiO1xuICAgICAgcmV0dXJuIHByZWZpeCArIChmaWVsZC52YWxpZGF0aW9uTWVzc2FnZXM/LnZhbGlkYXRlUGhvbmVOdW1iZXIgfHwgJ0lOVkFMSURfUEhPTkVfTlVNQkVSJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgY29uc3QgZXJyb3JzID0gY29udHJvbC5lcnJvcnMgfHwge307XG4gICAgICBjb25zdCBwcmVmaXggPSB0aGlzLnBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyBcIi5cIjtcblxuICAgICAgaWYgKGVycm9yc1sncmVxdWlyZWQnXSkgcmV0dXJuIHByZWZpeCArICdSRVFVSVJFRCc7XG4gICAgICBpZiAoZXJyb3JzWydtaW4nXSkgcmV0dXJuIHByZWZpeCArIChmaWVsZC52YWxpZGF0aW9uTWVzc2FnZXM/Lm1pbiB8fCAnTlVNQkVSX01JTicpO1xuICAgICAgaWYgKGVycm9yc1snbWF4J10pIHJldHVybiBwcmVmaXggKyAoZmllbGQudmFsaWRhdGlvbk1lc3NhZ2VzPy5tYXggfHwgJ05VTUJFUl9NQVgnKTtcbiAgICAgIGlmIChlcnJvcnNbJ21heGxlbmd0aCddKSByZXR1cm4gcHJlZml4ICsgKGZpZWxkLnZhbGlkYXRpb25NZXNzYWdlcz8ubWF4bGVuZ3RoIHx8ICdNQVhfTEVOR1RIJyk7XG4gICAgICBpZiAoZXJyb3JzWydkZWNpbWFsTWluJ10pIHJldHVybiBwcmVmaXggKyAoZmllbGQudmFsaWRhdGlvbk1lc3NhZ2VzPy5kZWNpbWFsTWluIHx8ICdERUNJTUFMX01JTicpO1xuICAgICAgaWYgKGVycm9yc1snZGVjaW1hbE1heCddKSByZXR1cm4gcHJlZml4ICsgKGZpZWxkLnZhbGlkYXRpb25NZXNzYWdlcz8uZGVjaW1hbE1heCB8fCAnREVDSU1BTF9NQVgnKTtcbiAgICAgIGlmIChlcnJvcnNbJ3BhdHRlcm4nXSkgcmV0dXJuIHByZWZpeCArIChmaWVsZC52YWxpZGF0aW9uTWVzc2FnZXM/LnBhdHRlcm4gfHwgJ0lOVkFMSURfRk9STUFUJyk7XG4gICAgICBpZiAoZXJyb3JzWyd2YWxpZGF0ZVBob25lTnVtYmVyJ10pIHJldHVybiBwcmVmaXggKyAoZmllbGQudmFsaWRhdGlvbk1lc3NhZ2VzPy52YWxpZGF0ZVBob25lTnVtYmVyIHx8ICdJTlZBTElEX1BIT05FX05VTUJFUicpO1xuICAgICAgaWYgKGVycm9yc1snaW52YWxpZE1hdGhFeHByZXNzaW9uJ10pIHJldHVybiBwcmVmaXggKyAnSU5WQUxJRF9NQVRIJztcbiAgICAgIGlmIChlcnJvcnNbJ2RhdGVSYW5nZUludmFsaWQnXSkgcmV0dXJuIHByZWZpeCArICdkYXRlUmFuZ2VJbnZhbGlkJztcbiAgICAgIGlmIChlcnJvcnNbJ3NlcnZlckVycm9yJ10pIHJldHVybiBwcmVmaXggKyBlcnJvcnNbJ3NlcnZlckVycm9yJ107XG5cbiAgICAgIHJldHVybiBwcmVmaXggKyAnSU5WQUxJRF9WQUxVRSc7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cblxuICBnZXRGaXJzdEVycm9yS2V5KHByb3A6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy5mb3JtUGFyYW0/LmdldChbcHJvcF0pPy5lcnJvcnM7XG5cbiAgICBpZiAoIWVycm9ycyB8fCBPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGVycm9ycz8uWydzZXJ2ZXJFcnJvciddIHx8ICdJTlZBTElEX0ZPUk1BVCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGVycm9ycylbMF07XG4gIH1cblxuICBwdWJsaWMgZ2V0Q291bnRyeUNvZGVMaXN0KCkge1xuICAgIHJldHVybiBbJ2FmJywgJ2F4JywgJ2FsJywgJ2R6JywgJ2FzJywgJ2FkJywgJ2FvJywgJ2FpJywgJ2FxJywgJ2FnJywgJ2FyJywgJ2FtJywgJ2F3JywgJ2F1JywgJ2F0JywgJ2F6JyxcbiAgICAgICdicycsICdiaCcsICdiZCcsICdiYicsICdieScsICdiZScsICdieicsICdiaicsICdibScsICdidCcsICdibycsICdiYScsICdidycsICdidicsICdicicsICdpbycsICdibicsXG4gICAgICAnYmcnLCAnYmYnLCAnYmknLCAna2gnLCAnY20nLCAnY2EnLCAnY3YnLCAna3knLCAnY2YnLCAndGQnLCAnY2wnLCAnY24nLCAnY3gnLCAnY2MnLCAnY28nLCAna20nLCAnY2cnLFxuICAgICAgJ2NkJywgJ2NrJywgJ2NyJywgJ2NpJywgJ2hyJywgJ2N1JywgJ2N5JywgJ2N6JywgJ2RrJywgJ2RqJywgJ2RtJywgJ2RvJywgJ2VjJywgJ2VnJywgJ3N2JywgJ2dxJywgJ2VyJyxcbiAgICAgICdlZScsICdldCcsICdmaycsICdmbycsICdmaicsICdmaScsICdmcicsICdnZicsICdwZicsICd0ZicsICdnYScsICdnbScsICdnZScsICdkZScsICdnaCcsICdnaScsICdncicsXG4gICAgICAnZ2wnLCAnZ2QnLCAnZ3AnLCAnZ3UnLCAnZ3QnLCAnZ2cnLCAnZ24nLCAnZ3cnLCAnZ3knLCAnaHQnLCAnaG0nLCAndmEnLCAnaG4nLCAnaGsnLCAnaHUnLCAnaXMnLCAnaW4nLFxuICAgICAgJ2lkJywgJ2lyJywgJ2lxJywgJ2llJywgJ2ltJywgJ2l0JywgJ2ptJywgJ2pwJywgJ2plJywgJ2pvJywgJ2t6JywgJ2tlJywgJ2tpJywgJ2tyJywgJ2t3JywgJ2tnJywgJ2xhJyxcbiAgICAgICdsdicsICdsYicsICdscycsICdscicsICdseScsICdsaScsICdsdCcsICdsdScsICdtbycsICdtaycsICdtZycsICdtdycsICdteScsICdtdicsICdtbCcsICdtdCcsICdtaCcsXG4gICAgICAnbXEnLCAnbXInLCAnbXUnLCAneXQnLCAnbXgnLCAnZm0nLCAnbWQnLCAnbWMnLCAnbW4nLCAnbWUnLCAnbXMnLCAnbWEnLCAnbXonLCAnbW0nLCAnbmEnLCAnbnInLCAnbnAnLFxuICAgICAgJ25sJywgJ2FuJywgJ25jJywgJ256JywgJ25pJywgJ25lJywgJ25nJywgJ251JywgJ25mJywgJ21wJywgJ25vJywgJ29tJywgJ3BrJywgJ3B3JywgJ3BzJywgJ3BhJywgJ3BnJyxcbiAgICAgICdweScsICdwZScsICdwaCcsICdwbicsICdwbCcsICdwdCcsICdwcicsICdxYScsICdyZScsICdybycsICdydScsICdydycsICdibCcsICdzaCcsICdrbicsICdsYycsICdtZicsXG4gICAgICAncG0nLCAndmMnLCAnd3MnLCAnc20nLCAnc3QnLCAnc2EnLCAnc24nLCAncnMnLCAnc2MnLCAnc2wnLCAnc2cnLCAnc2snLCAnc2knLCAnc2InLCAnc28nLCAnemEnLCAnZ3MnLFxuICAgICAgJ2VzJywgJ2xrJywgJ3NkJywgJ3NyJywgJ3NqJywgJ3N6JywgJ3NlJywgJ2NoJywgJ3N5JywgJ3R3JywgJ3RqJywgJ3R6JywgJ3RoJywgJ3RsJywgJ3RnJywgJ3RrJywgJ3RvJyxcbiAgICAgICd0dCcsICd0bicsICd0cicsICd0bScsICd0YycsICd0dicsICd1ZycsICd1YScsICdhZScsICdnYicsICd1cycsICd1bScsICd1eScsICd1eicsICd2dScsICd2ZScsICd2bicsXG4gICAgICAndmcnLCAndmknLCAnd2YnLCAnZWgnLCAneWUnLCAnem0nLCAnencnXTtcbiAgfVxuXG5cbiAgZnJpZW5kbHlOYW1lKGZ1bGxQYXRoOiBzdHJpbmcgLCBzdWJQYXRoOiBzdHJpbmcgLCBpdGVtOiBzdHJpbmcpe1xuICAgIHJldHVybiAgZnVsbFBhdGguc3Vic3RyaW5nKDAsIGZ1bGxQYXRoLmluZGV4T2Yoc3ViUGF0aCkpICsgaXRlbSA7XG4gIH1cblxuICBzaG93VmFsdWUoZGVmYXVsdHMsIGZpZWxkKXtcbiAgICByZXR1cm4gIHRoaXMuZnJpZW5kbHlOYW1lKGZpZWxkLmxhYmVsICwgZmllbGQucHJvcGVydHkgLCBkZWZhdWx0c1tmaWVsZC5wcm9wZXJ0eV0pO1xuICB9XG5cbiAgc2hvd0Vycm9yKHByb3A6IHN0cmluZykge1xuICAgIGNvbnN0IENPTlRST0wgPSB0aGlzLmZvcm1QYXJhbT8uZ2V0KFtwcm9wXSk7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZpZWxkcy5maW5kKGYgPT4gZi5wcm9wZXJ0eSA9PT0gcHJvcCk7XG4gICAgaWYgKGZpZWxkPy50eXBlID09PSAncGhvbmUtbnVtYmVyJykge1xuICAgICAgcmV0dXJuIENPTlRST0w/LnRvdWNoZWQgJiYgQ09OVFJPTD8uZGlydHkgJiYgIUNPTlRST0w/LnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gKENPTlRST0w/LnZhbHVlIHx8IENPTlRST0w/LnZhbHVlID09PSAwKSAmJiBDT05UUk9MPy5zdGF0dXMgPT09ICdJTlZBTElEJztcbiAgfVxuXG4gIGNsZWFyRmllbGRWYWx1ZShwcm9wOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1QYXJhbT8uZ2V0KFtwcm9wXSk/LnNldFZhbHVlKCcnKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVmYXVsdHMgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0TGFibGVzKCkge1xuICAgIHRoaXMuZmllbGRzLmZvckVhY2goZiA9PiB7XG4gICAgICBpZiAoZi52aXNpYmxlKSB7XG4gICAgICAgIGYubGFiZWwgPSB0aGlzLmxhYmVsS2V5KGYpO1xuXG4gICAgICAgIGlmICghdGhpcy5zY3JlZW5GaWVsZHMuaGFzKGYucm93KSkge1xuICAgICAgICAgIHRoaXMuc2NyZWVuRmllbGRzLnNldChmLnJvdywgW10pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2NyZWVuRmllbGRzLmdldChmLnJvdykhLnB1c2goZik7XG5cbiAgICAgICAgaWYgKGYuY2FzY2FkZWRCeSkge1xuICAgICAgICAgIHRoaXMuZm9ybVBhcmFtPy5nZXQoW2YuY2FzY2FkZWRCeV0pPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9ybVBhcmFtPy5nZXQoW2YucHJvcGVydHldKT8ucGF0Y2hWYWx1ZShudWxsKTtcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRoaXMuc2NyZWVuRmllbGRzLnNpemU7IGkrKykge1xuICAgICAgdGhpcy5jYWxjRmxleFNpemUoaSk7XG4gICAgfVxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc2NyZWVuRmllbGRzKVxuICB9XG5cbiAgcHJpdmF0ZSBjYWxjRmxleFNpemUoaTogbnVtYmVyKXtcbiAgICAvLyBQcmVzZXJ2ZSBleHBsaWNpdCBmaWVsZFNpemUgdmFsdWVzIG9ubHkuIEZvciBmaWVsZHMgd2l0aG91dCBmaWVsZFNpemUsIGFsbG93XG4gICAgLy8gdGhlIGxheW91dCB0byBhdXRvLXNpemUgdmlhIGZsZXggKGhhbmRsZWQgaW4gdGhlIHRlbXBsYXRlL0NTUykuXG4gICAgLy8gSW50ZW50aW9uYWxseSBkbyBub3RoaW5nIGhlcmUgc28gdGhhdCB1bnNwZWNpZmllZCBmaWVsZHMgcmVtYWluIGZsZXhpYmxlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIGdldEN1cnJlbmN5UGF0dGVybihmaWVsZDogRmllbGRJbmZvKSB7XG4gICAgLy8gY29uc3QgZGVjaW1hbFBsYWNlcyAgPSB0aGlzLmF1dGhTZXJ2aWNlPy5teUN1cnJlbmNpZXM/LmZpbmQoYyA9PiBjLmtleSA9PT0gdGhpcy5mb3JtUGFyYW0uZ2V0KGZpZWxkLmN1cnJlbmN5KT8udmFsdWUpPy5jdXJyZW5jeU51bU9mRGVjaW1hbFBhdHRlcm4gfHwgMztcbiAgICBjb25zdCBkZWNpbWFsUGxhY2VzICA9IDM7XG4gICAgcmV0dXJuICdeXFxcXGQqKD86Wy4sXVxcXFxkezEsJyArIGRlY2ltYWxQbGFjZXMgKyAnfSk/JCc7XG4gIH1cblxuICBzcGxpdHRlZENoaXBzKGZvcm06IEZvcm1Hcm91cCwgZmllbGROYW1lOiBzdHJpbmcpOnN0cmluZ1tdIHtcbiAgICByZXR1cm4gZm9ybS5nZXQoZmllbGROYW1lKS52YWx1ZSA9PT0gJycgPyBbXTogZm9ybS5nZXQoZmllbGROYW1lKS52YWx1ZS50cmltKCkuc3BsaXQoJzsnKTtcbiAgfVxuXG5cbiAgZml4QXJhYmljTnVtYmVycyhzdHI6IGFueSkge1xuICAgIC8vIGlmKHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gICAgIHN0ciA9IHN0ci5yZXBsYWNlKC8oW9mg2aHZotmj2aTZpdmm2afZqNmpXSl8KFvbsNux27Lbs9u027Xbttu327jbuV0pL2csIChtLCAkMSwgJDIpID0+IG0uY2hhckNvZGVBdCgwKSAtICgkMSA/IDE2MzIgOiAxNzc2KSk7XG4gICAgLy8gfVxuICAgIC8vIGNvbnNvbGUubG9nKHN0cik7XG4gIH1cblxuICBsaXN0U2hvd1ZhbHVlKGRlZmF1bHRzOiBhbnksIGZpZWxkOiBGaWVsZEluZm8pIHtcbiAgICByZXR1cm4gZGVmYXVsdHNbZmllbGQucHJvcGVydHldID8gdGhpcy5zaG93VmFsdWUoZGVmYXVsdHMsIGZpZWxkKSA6ICcnO1xuICB9XG5cbiAgcmVtb3ZlQ2hpcHNJdGVtKGZvcm06IEZvcm1Hcm91cCwgZmllbGROYW1lOiBzdHJpbmcsIGlkeDogbnVtYmVyKSB7XG4gICAgY29uc3QgZW1haWxzID0gdGhpcy5zcGxpdHRlZENoaXBzKGZvcm0sIGZpZWxkTmFtZSk7XG4gICAgaWYgKGVtYWlscy5sZW5ndGggPj0gMSl7XG4gICAgICBlbWFpbHMuc3BsaWNlKGlkeCwxKTtcbiAgICB9XG4gICAgbGV0IGNsZWFuZWRFbWFpbHMgPSBlbWFpbHMuam9pbihcIjtcIik7XG4gICAgZm9ybS5nZXQoZmllbGROYW1lKS5zZXRWYWx1ZShjbGVhbmVkRW1haWxzKTtcbiAgfVxuXG4gIGV4dHJhY3RGaWVsZE5hbWUoZWxlbWVudDogYW55LCBwcm9wZXJ0eTogc3RyaW5nKSB7XG4gICAgaWYgKHByb3BlcnR5Py5pbmNsdWRlcygnLicpKSB7XG4gICAgICByZXR1cm4gcHJvcGVydHkuc3BsaXQoJy4nKS5yZWR1Y2UoKGFjYywgcGFydCkgPT4gYWNjICYmIGFjY1twYXJ0XSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtZW50W3Byb3BlcnR5XTtcbiAgICB9XG4gIH1cblxuICBpc1JlYWRvbmx5VGV4dFZhbHVlRW1wdHkoZGVmYXVsdHM6IGFueSwgZmllbGQ6IEZpZWxkSW5mbyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5leHRyYWN0RmllbGROYW1lKGRlZmF1bHRzLCBmaWVsZC5wcm9wZXJ0eSk7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKSA9PT0gJyc7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldFJlYWRvbmx5RGF0ZUZvcm1hdChmaWVsZDogRmllbGRJbmZvKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZmllbGQucmVhZG9ubHlEYXRlRGlzcGxheSA9PT0gJ2RhdGV0aW1lJyA/ICdkZC9NTS95eXl5IEhIOm1tJyA6ICdkZC9NTS95eXl5JztcbiAgfVxuXG4gIG9uTXVsdGlTdGF0ZU1lbnVJbm5lcktleWRvd24oZXZlbnQ6IEV2ZW50LCBmaWVsZDogRmllbGRJbmZvKTogdm9pZCB7XG4gICAgaWYgKCEoZXZlbnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXNNdWx0aVN0YXRlTWVudUFjdGl2YXRlS2V5KGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByb3cgPSB0aGlzLmZpbmRNdWx0aVN0YXRlUm93RnJvbUtleWJvYXJkRXZlbnQoZXZlbnQpO1xuICAgIGlmICghcm93KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvZGUgPSByb3cuZ2V0QXR0cmlidXRlKCdkYXRhLW11bHRpLXN0YXRlLWNvZGUnKTtcbiAgICBpZiAoIWNvZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBuZXh0ID0gIXRoaXMuaXNNdWx0aVN0YXRlU2VsZWN0ZWQoZmllbGQucHJvcGVydHksIGNvZGUpO1xuICAgIHRoaXMudG9nZ2xlTXVsdGlTdGF0ZUZpbHRlcihmaWVsZC5wcm9wZXJ0eSwgY29kZSwgbmV4dCk7XG4gIH1cblxuICBwcml2YXRlIGlzTXVsdGlTdGF0ZU1lbnVBY3RpdmF0ZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBldmVudC5rZXkgPT09ICdFbnRlcicgfHxcbiAgICAgIGV2ZW50LmtleSA9PT0gJyAnIHx8XG4gICAgICBldmVudC5rZXkgPT09ICdTcGFjZWJhcicgfHxcbiAgICAgIGV2ZW50LmNvZGUgPT09ICdTcGFjZScgfHxcbiAgICAgIGV2ZW50LmNvZGUgPT09ICdOdW1wYWRFbnRlcidcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kTXVsdGlTdGF0ZVJvd0Zyb21LZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBwYXRoID1cbiAgICAgIHR5cGVvZiBldmVudC5jb21wb3NlZFBhdGggPT09ICdmdW5jdGlvbicgPyBldmVudC5jb21wb3NlZFBhdGgoKSA6IFtdO1xuICAgIGNvbnN0IGZyb21QYXRoID0gcGF0aC5maW5kKFxuICAgICAgKG4pOiBuIGlzIEhUTUxFbGVtZW50ID0+XG4gICAgICAgIG4gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBuLmNsYXNzTGlzdC5jb250YWlucygnbXVsdGktc3RhdGUtZmlsdGVyX19yb3cnKSxcbiAgICApO1xuICAgIGlmIChmcm9tUGF0aCkge1xuICAgICAgcmV0dXJuIGZyb21QYXRoO1xuICAgIH1cbiAgICBjb25zdCB0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHJldHVybiB0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyB0LmNsb3Nlc3QoJy5tdWx0aS1zdGF0ZS1maWx0ZXJfX3JvdycpIDogbnVsbDtcbiAgfVxuXG4gIG9uTXVsdGlTdGF0ZVJvd0NsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBwcm9wZXJ0eTogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICh0YXJnZXQ/LmNsb3Nlc3QoJ21hdC1jaGVja2JveCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSAhdGhpcy5pc011bHRpU3RhdGVTZWxlY3RlZChwcm9wZXJ0eSwgY29kZSk7XG4gICAgdGhpcy50b2dnbGVNdWx0aVN0YXRlRmlsdGVyKHByb3BlcnR5LCBjb2RlLCBuZXh0KTtcbiAgfVxuXG4gIHRvZ2dsZU11bHRpU3RhdGVGaWx0ZXIocHJvcGVydHk6IHN0cmluZywgY29kZTogc3RyaW5nLCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybVBhcmFtLmdldChwcm9wZXJ0eSk7XG4gICAgaWYgKCFjdHJsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJhdyA9IGN0cmwudmFsdWU7XG4gICAgY29uc3QgY3VyOiBzdHJpbmdbXSA9IEFycmF5LmlzQXJyYXkocmF3KSA/IFsuLi5yYXddIDogW107XG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIGlmICghY3VyLmluY2x1ZGVzKGNvZGUpKSB7XG4gICAgICAgIGN1ci5wdXNoKGNvZGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpZHggPSBjdXIuaW5kZXhPZihjb2RlKTtcbiAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICBjdXIuc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGN0cmwuc2V0VmFsdWUoY3VyKTtcbiAgfVxuXG4gIGlzTXVsdGlTdGF0ZVNlbGVjdGVkKHByb3BlcnR5OiBzdHJpbmcsIGNvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuZm9ybVBhcmFtLmdldChwcm9wZXJ0eSk/LnZhbHVlO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHJhdykgJiYgcmF3LmluY2x1ZGVzKGNvZGUpO1xuICB9XG5cbiAgaXNNdWx0aVN0YXRlRW1wdHkocHJvcGVydHk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuZm9ybVBhcmFtLmdldChwcm9wZXJ0eSk/LnZhbHVlO1xuICAgIHJldHVybiAhQXJyYXkuaXNBcnJheShyYXcpIHx8IHJhdy5sZW5ndGggPT09IDA7XG4gIH1cblxuICAvKiogVHJpZ2dlciBsYWJlbDogZW1wdHkgPT4gY2FsbGVyIHNob3dzIHBsYWNlaG9sZGVyOyBlbHNlIHNob3J0IHN1bW1hcnkuICovXG4gIGdldE11bHRpU3RhdGVGaWx0ZXJUcmlnZ2VyTGFiZWwoZmllbGQ6IEZpZWxkSW5mbyk6IHN0cmluZyB7XG4gICAgY29uc3QgcmF3ID0gdGhpcy5mb3JtUGFyYW0uZ2V0KGZpZWxkLnByb3BlcnR5KT8udmFsdWU7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXcgOiBbXTtcbiAgICBjb25zdCBzZWN0aW9uID0gdGhpcy5wYWdlSW5mbz8ubGFiZWxzU2VjdGlvbiB8fCAnJztcbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9uKyBcIi5cIiArIGZpZWxkLnBsYWNlaG9sZGVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXJlQWxsTXVsdGlTdGF0ZU9wdGlvbnNTZWxlY3RlZChmaWVsZCwgc2VsZWN0ZWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9uKyBcIi5cIiArIGZpZWxkLnBsYWNlaG9sZGVyKTtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA8PSAyKSB7XG4gICAgICByZXR1cm4gc2VsZWN0ZWRcbiAgICAgICAgLm1hcChjID0+IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHNlY3Rpb24gPyBgJHtzZWN0aW9ufS4ke2N9YCA6IGMpKVxuICAgICAgICAuam9pbignLCAnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdGSUxURVItQlVJTERFUi5tdWx0aVN0YXR1c1N1bW1hcnknLCB7IGNvdW50OiBzZWxlY3RlZC5sZW5ndGggfSk7XG4gIH1cblxuICBwcml2YXRlIGFyZUFsbE11bHRpU3RhdGVPcHRpb25zU2VsZWN0ZWQoZmllbGQ6IEZpZWxkSW5mbywgc2VsZWN0ZWQ6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGZpZWxkLmxpc3RPcHRpb25zIHx8IFtdO1xuICAgIHJldHVybiBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgoY29kZTogc3RyaW5nKSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhjb2RlKSk7XG4gIH1cblxuICBzdGF0dXNPcHRpb25MYWJlbEtleShmaWVsZDogRmllbGRJbmZvLCBjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLnBhZ2VJbmZvPy5sYWJlbHNTZWN0aW9uO1xuICAgIHJldHVybiBzZWN0aW9uID8gYCR7c2VjdGlvbn0uJHtjb2RlfWAgOiBjb2RlO1xuICB9XG5cbiAgZ2V0TXVsdGlTdGF0ZVJlYWRvbmx5U3VtbWFyeShmaWVsZDogRmllbGRJbmZvLCBkZWZhdWx0czogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCByYXcgPSB0aGlzLmV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KTtcbiAgICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhdyA6IFtdO1xuICAgIGNvbnN0IHNlY3Rpb24gPSB0aGlzLnBhZ2VJbmZvPy5sYWJlbHNTZWN0aW9uIHx8ICcnO1xuICAgIHJldHVybiBzZWxlY3RlZFxuICAgICAgLm1hcChjID0+IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHNlY3Rpb24gPyBgJHtzZWN0aW9ufS4ke2N9YCA6IGMpKVxuICAgICAgLmpvaW4oJywgJyk7XG4gIH1cblxuICBnZXRNdWx0aVZhbHVlKGZpZWxkOiBGaWVsZEluZm8pIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtUGFyYW0uZ2V0KGZpZWxkLnByb3BlcnR5KT8udmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlRW1haWwoZW1haWwpIHtcbiAgICB2YXIgcmUgPSAvXigoW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKyhcXC5bXjw+KClcXFtcXF1cXFxcLiw7Olxcc0BcIl0rKSopfChcIi4rXCIpKUAoKFxcW1swLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXF0pfCgoW2EtekEtWlxcLTAtOV0rXFwuKStbYS16QS1aXXsyLH0pKSQvO1xuICAgIHJldHVybiByZS50ZXN0KFN0cmluZyhlbWFpbCkudG9Mb3dlckNhc2UoKSk7XG4gIH1cblxuICBhZGRFbWFpbFRvQ2hpcHMoZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50LCBmb3JtOiBGb3JtR3JvdXAsIGZpZWxkTmFtZTogc3RyaW5nKSB7XG5cbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LmlucHV0O1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudmFsdWU7XG4gICAgY29uc3QgaXRlbXMgPSB2YWx1ZS5zcGxpdCgnOycpO1xuICAgIC8vIHZhbHVlLnNwbGl0KCcgJyk7XG4gICAgaXRlbXMuZm9yRWFjaChpdG0gPT4ge1xuICAgICAgaWYgKHRoaXMudmFsaWRhdGVFbWFpbCgoaXRtIHx8ICcnKS50cmltKCkpKSB7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLnNwbGl0dGVkQ2hpcHMoZm9ybSwgZmllbGROYW1lKTtcbiAgICAgICAgeC5wdXNoKGl0bSk7XG4gICAgICAgIGZvcm0uZ2V0KGZpZWxkTmFtZSkucGF0Y2hWYWx1ZSh4LmpvaW4oJzsnKSk7XG4gICAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgZXh0cmFjdEpzb25GaWVsZE5hbWUoZGVmYXVsdHM6IGFueSwgcHJvcGVydHk6IHN0cmluZykge1xuICAgIGNvbnN0IHg9IHRoaXMuZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgcHJvcGVydHkpO1xuICAgIGlmICh4Py5sZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoeCk7XG4gICAgZWxzZSByZXR1cm4gJ3t9JztcbiAgfVxuXG4gIGdldE9wdGlvblZhbHVlKGl0ZW06IGFueSkge1xuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnID9cbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldERlZmF1bHRMYW5nKCkgPT09ICdlbicgPyBpdGVtLmVuZ2xpc2hOYW1lIDogaXRlbS5hcmFiaWNOYW1lXG4gICAgICAgIDogaXRlbTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBnZXRIeXBlclRleHRFdmVudCgpIHtcbiAgICB0aGlzLmh5cGVyVGV4dEV2ZW50LmVtaXQodHJ1ZSk7XG4gIH1cblxuICBhZGQoZXZlbnQ6IE1hdENoaXBJbnB1dEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLmVxdWF0aW9uT3BlcmF0b3JzLmluY2x1ZGVzKHZhbHVlKSB8fCAhdGhpcy5lcXVhdGlvblZhbHVlcygpLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICB0aGlzLmVxdWF0aW9uVmFsdWVzLnVwZGF0ZShlcXVhdGlvblZhbHVlcyA9PiBbLi4uZXF1YXRpb25WYWx1ZXMsIHZhbHVlXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maWVsZHNJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgdGhpcy5jdXJyZW50RXF1YXRpb25WYWx1ZS5zZXQoJycpO1xuICAgIHRoaXMudXBkYXRlRXF1YXRpb25PcHRpb25zKCk7XG5cbiAgfVxuXG4gIHJlbW92ZShpdGVtOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVxdWF0aW9uVmFsdWVzLnVwZGF0ZShlcXVhdGlvblZhbHVlcyA9PiB7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIHJldHVybiBlcXVhdGlvblZhbHVlcztcbiAgICAgIH1cblxuICAgICAgZXF1YXRpb25WYWx1ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuYW5ub3VuY2VyLmFubm91bmNlKGBSZW1vdmVkICR7aXRlbX1gKTtcbiAgICAgIHJldHVybiBbLi4uZXF1YXRpb25WYWx1ZXNdO1xuICAgIH0pO1xuICAgIHRoaXMudXBkYXRlRXF1YXRpb25PcHRpb25zKCk7XG4gIH1cblxuICBzZWxlY3RlZChldmVudDogTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCk6IHZvaWR7XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IGV2ZW50Lm9wdGlvbi52aWV3VmFsdWUudHJpbSgpO1xuXG4gICAgaWYgKCF0aGlzLmVxdWF0aW9uT3BlcmF0b3JzLmluY2x1ZGVzKHNlbGVjdGVkVmFsdWUpICYmICF0aGlzLmVxdWF0aW9uVmFsdWVzKCkuaW5jbHVkZXMoc2VsZWN0ZWRWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZXF1YXRpb25WYWx1ZXMudXBkYXRlKGVxdWF0aW9uVmFsdWVzID0+IFsuLi5lcXVhdGlvblZhbHVlcywgc2VsZWN0ZWRWYWx1ZV0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5lcXVhdGlvbk9wZXJhdG9ycy5pbmNsdWRlcyhzZWxlY3RlZFZhbHVlKSkge1xuICAgICAgdGhpcy5lcXVhdGlvblZhbHVlcy51cGRhdGUoZXF1YXRpb25WYWx1ZXMgPT4gWy4uLmVxdWF0aW9uVmFsdWVzLCBzZWxlY3RlZFZhbHVlXSk7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50RXF1YXRpb25WYWx1ZS5zZXQoJycpO1xuICAgIGV2ZW50Lm9wdGlvbi5kZXNlbGVjdCgpO1xuICAgIHRoaXMuZmllbGRzSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIHRoaXMudXBkYXRlRXF1YXRpb25PcHRpb25zKCk7XG4gIH1cblxuICB1cGRhdGVFcXVhdGlvbk9wdGlvbnMoKXtcbiAgICB0aGlzLnJlZmxlY3RFcXVhdGlvblZhbHVlT25Gb3JtKCk7XG5cbiAgICBsZXQgdXBkYXRlZEZpZWxkczogc3RyaW5nW107XG4gICAgaWYgKHRoaXMuZXF1YXRpb25WYWx1ZXMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHVwZGF0ZWRGaWVsZHMgPSB0aGlzLmdldE5hbWVzRnJvbVN1Z2dlc3RlZEVxdWF0aW9uRmllbGRzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBsYXN0RWxlbWVudCA9IHRoaXMuZXF1YXRpb25WYWx1ZXMoKVt0aGlzLmVxdWF0aW9uVmFsdWVzKCkubGVuZ3RoIC0gMV07XG4gICAgICBpZiAodGhpcy5lcXVhdGlvbk9wZXJhdG9ycy5pbmNsdWRlcyhsYXN0RWxlbWVudCkpIHtcbiAgICAgICAgdXBkYXRlZEZpZWxkcyA9IHRoaXMuZ2V0TmFtZXNGcm9tU3VnZ2VzdGVkRXF1YXRpb25GaWVsZHMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwZGF0ZWRGaWVsZHMgPSB0aGlzLmVxdWF0aW9uT3BlcmF0b3JzO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZygnKioqKionLCB1cGRhdGVkRmllbGRzKTtcbiAgICB0aGlzLmFsbEVxdWF0aW9uRmllbGRzLm5leHQodXBkYXRlZEZpZWxkcyk7XG4gIH1cblxuICBnZXROYW1lc0Zyb21TdWdnZXN0ZWRFcXVhdGlvbkZpZWxkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXF1YXRpb25TdWdnZXN0ZWRGaWVsZHM/Lm1hcChmaWVsZCA9PiBmaWVsZC5uYW1lKTtcbiAgfVxuXG4gIHJlZmxlY3RFcXVhdGlvblZhbHVlT25Gb3JtKCkge1xuICAgIGlmICh0aGlzLmZvcm1QYXJhbSAmJiB0aGlzLmZvcm1QYXJhbS5nZXQoJ2ZpZWxkVmFsdWUnKSkge1xuICAgICAgdGhpcy5mb3JtUGFyYW0uZ2V0KCdmaWVsZFZhbHVlJykuc2V0VmFsdWUodGhpcy5lcXVhdGlvblZhbHVlcygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29uc29sZS5sb2coJ0Zvcm0gb3IgZmllbGRWYWx1ZSBpcyBub3QgYXZhaWxhYmxlLicpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrRXF1YXRpb24oZmllbGQ6IEZpZWxkSW5mbywgJGV2ZW50OiBFdmVudCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCckZXZlbnQnLCAkZXZlbnQpO1xuICAgIC8vIHRyeSB7XG4gICAgLy8gICBldmFsdWF0ZShlcXVhdGlvbi5yZXBsYWNlKC9bYS16QS1aMC05XSsvZywgJzEnKSk7IC8vIFJlcGxhY2UgdmFyaWFibGVzIHdpdGggZHVtbXkgdmFsdWVzXG4gICAgLy8gICB0aGlzLmZvcm1Hcm91cHNbaW5kZXhdLmdldCgneHl6Jykuc2V0RXJyb3JzKG51bGwpO1xuICAgIC8vICAgY29uc29sZS5sb2coJ3ZhbGlkICcsIGVxdWF0aW9uKVxuICAgIC8vIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyAgIHRoaXMuZm9ybUdyb3Vwc1tpbmRleF0uZ2V0KCd4eXonKS5zZXRFcnJvcnMoe3NlcnZlckVycm9yOiAnaW5jb21wbGV0ZSAnfSk7XG4gICAgLy8gICBjb25zb2xlLmxvZygnYmFkICcsIGVxdWF0aW9uKVxuICAgIC8vIH1cbiAgfVxuXG4gIGdldFZpZXcoZmllbGQpOiAnbW9udGgnIHwgJ3llYXInIHwgJ211bHRpLXllYXInIHtcbiAgICByZXR1cm4gZmllbGQucGF0dGVybiB8fCAnbW9udGgnO1xuICB9XG5cbiAgc2V0TW9udGhBbmRZZWFyKG5vcm1hbGl6ZWRNb250aEFuZFllYXI6IE1vbWVudCwgcGlja2VyOiBNYXREYXRlcGlja2VyPE1vbWVudD4sIGZpZWxkKSB7XG4gICAgY29uc29sZS5sb2coJ2ZpZWxkLnBhdHRlcm4nLCBmaWVsZC5wYXR0ZXJuKVxuICAgIGlmIChmaWVsZC5wYXR0ZXJuID09PSAnbXVsdGkteWVhcicpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdoaScpXG4gICAgICBjb25zdCBkYXRlID0gbmV3IEZvcm1Db250cm9sKG1vbWVudCgpKTtcbiAgICAgIGNvbnN0IGN0cmxWYWx1ZSA9IGRhdGUudmFsdWU7XG4gICAgICBjdHJsVmFsdWUueWVhcihub3JtYWxpemVkTW9udGhBbmRZZWFyLnllYXIoKSk7XG4gICAgICBjdHJsVmFsdWUubW9udGgoMSk7XG4gICAgICBjdHJsVmFsdWUuZGF5T2ZZZWFyKDEpO1xuICAgICAgdGhpcy5mb3JtUGFyYW0uZ2V0KGZpZWxkLnByb3BlcnR5KS5zZXRWYWx1ZShjdHJsVmFsdWUpXG4gICAgICBwaWNrZXIuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICBnZXRBY2NlcHRlZEZpbGVUeXBlcyhmaWVsZDogRmllbGRJbmZvKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWZpZWxkLnN1cHBvcnRlZFR5cGVzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBDb252ZXJ0IFwiLmpwZywucG5nLC5wZGZcIiBmb3JtYXQgdG8gXCJpbWFnZS9qcGVnLGltYWdlL3BuZyxhcHBsaWNhdGlvbi9wZGZcIiBvciBrZWVwIGFzIGlzXG4gICAgLy8gRm9yIHNpbXBsaWNpdHksIHdlJ2xsIHBhc3MgdGhlIHN1cHBvcnRlZFR5cGVzIGFzLWlzIGFuZCBsZXQgdGhlIGJyb3dzZXIgaGFuZGxlIGl0XG4gICAgLy8gVGhlIGJyb3dzZXIgYWNjZXB0cyBib3RoIGZvcm1hdHNcbiAgICByZXR1cm4gZmllbGQuc3VwcG9ydGVkVHlwZXM7XG4gIH1cblxuICBvbkF0dGFjaG1lbnRGaWxlU2VsZWN0ZWQoZmlsZTogRmlsZSB8IG51bGwsIGZpZWxkOiBGaWVsZEluZm8pOiB2b2lkIHtcbiAgICBpZiAoZmlsZSkge1xuICAgICAgLy8gVmFsaWRhdGUgZmlsZSB0eXBlIGlmIHN1cHBvcnRlZFR5cGVzIGlzIHNwZWNpZmllZFxuICAgICAgaWYgKGZpZWxkLnN1cHBvcnRlZFR5cGVzKSB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IGZpZWxkLnN1cHBvcnRlZFR5cGVzLnNwbGl0KCcsJykubWFwKHQgPT4gdC50cmltKCkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSAnLicgKyBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKT8udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFhbGxvd2VkVHlwZXMuaW5jbHVkZXMoZmlsZUV4dGVuc2lvbikpIHtcbiAgICAgICAgICAvLyBGaWxlIHR5cGUgbm90IHN1cHBvcnRlZCAtIGNvdWxkIHNob3cgZXJyb3IgbWVzc2FnZVxuICAgICAgICAgIGNvbnNvbGUud2FybihgRmlsZSB0eXBlICR7ZmlsZUV4dGVuc2lvbn0gaXMgbm90IHN1cHBvcnRlZC4gQWxsb3dlZCB0eXBlczogJHtmaWVsZC5zdXBwb3J0ZWRUeXBlc31gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGZvcm0gY29udHJvbCBpZiBpdCBleGlzdHNcbiAgICAgIGlmICh0aGlzLmZvcm1QYXJhbSAmJiB0aGlzLmZvcm1QYXJhbS5nZXQoZmllbGQucHJvcGVydHkpKSB7XG4gICAgICAgIHRoaXMuZm9ybVBhcmFtLmdldChmaWVsZC5wcm9wZXJ0eSk/LnNldFZhbHVlKGZpbGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IGF0dGFjaG1lbnQgZXZlbnRcbiAgICAgIHRoaXMuYXR0YWNobWVudEVtaXR0ZXIuZW1pdCh7XG4gICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgICAgYXR0YWNobWVudFR5cGU6IGZpZWxkLmF0dGFjaG1lbnRUeXBlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2xlYXIgdGhlIGZvcm0gY29udHJvbCBpZiBmaWxlIGlzIHJlbW92ZWRcbiAgICAgIGlmICh0aGlzLmZvcm1QYXJhbSAmJiB0aGlzLmZvcm1QYXJhbS5nZXQoZmllbGQucHJvcGVydHkpKSB7XG4gICAgICAgIHRoaXMuZm9ybVBhcmFtLmdldChmaWVsZC5wcm9wZXJ0eSk/LnNldFZhbHVlKG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm1haW4tZm9ybS1jYW52YXNcIj5cbiAgPGRpdiBjbGFzcz1cImZvcm0td3JhcHBlclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZWZhdWx0c1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlOyBlbHNlIHJlYWRvbmx5Vmlld1wiIGNsYXNzPVwiZm9ybS1jb250YWluZXJcIj5cbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtUGFyYW1cIiBjbGFzcz1cImZvcm0tY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY29sdW1uXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJvdyBvZiBzY3JlZW5GaWVsZHMgfCBrZXl2YWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiByb3cudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbHVtblwiIFtzdHlsZS5mbGV4XT1cImZpZWxkLmZpZWxkU2l6ZSA/ICgnMCAwICcgKyBmaWVsZC5maWVsZFNpemUgKyAnJScpIDogJzEgMSAwJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImZpZWxkLnR5cGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWwgJiYgIWZpZWxkLnJlYWRvbmx5XCIgY2xhc3M9XCJvcHRpb25hbC10ZXh0XCI+IHt7ICdvcHRpb25hbCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIm1pbkRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiZm9ybVBhcmFtLmdldChmaWVsZC5wcm9wZXJ0eSkuc2V0VmFsdWUoJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgPyAobGFiZWxLZXlQbGFjZUhvbGRlcihmaWVsZCkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImZpZWxkLnJlYWRvbmx5ID8gLTEgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7ZmllbGQucHJvcGVydHl9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgZmllbGQucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlICpuZ0lmPVwiIWZpZWxkLnJlYWRvbmx5XCIgbWF0U3VmZml4IFtmb3JdPVwicGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdGFydFZpZXddPVwiZ2V0VmlldyhmaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHllYXJTZWxlY3RlZCk9XCJzZXRNb250aEFuZFllYXIoJGV2ZW50LCBwaWNrZXIsIGZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbENsYXNzPVwiZXhhbXBsZS1tb250aC1waWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZGF0ZXBpY2tlcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGhvbmUtbnVtYmVyJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIGNsYXNzPVwiY3VzdG9tLW5neC1tYXQtaW50bC10ZWwtaW5wdXRcIiAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1hbmQtYXN0ZXJpc2stY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cImN1c3RvbS1sYWJlbFwiIGlkPVwibGFiZWwte3tmaWVsZC5wcm9wZXJ0eX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+ICogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsICYmICFmaWVsZC5yZWFkb25seVwiIGNsYXNzPVwib3B0aW9uYWwtdGV4dFwiPiB7eyAnb3B0aW9uYWwnIHwgdHJhbnNsYXRlIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaG9uZS1pbnB1dC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5neC1tYXQtaW50bC10ZWwtaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dFBsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyID8gKGxhYmVsS2V5UGxhY2VIb2xkZXIoZmllbGQpIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcmVmZXJyZWRDb3VudHJpZXNdPVwiWydxYSddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGVQbGFjZWhvbGRlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGVTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb25seUNvdW50cmllc109XCJnZXRDb3VudHJ5Q29kZUxpc3QoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBmaWVsZC5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSkgPyAnZXJyb3ItJyArIGZpZWxkLnByb3BlcnR5IDogbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmd4LW1hdC1pbnRsLXRlbC1pbnB1dD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaWJhbi10ZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXdvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGV4dFJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1hbmQtYXN0ZXJpc2stY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cImN1c3RvbS1sYWJlbFwiIGlkPVwibGFiZWwte3tmaWVsZC5wcm9wZXJ0eX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+ICogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsICYmICFmaWVsZC5yZWFkb25seVwiIGNsYXNzPVwib3B0aW9uYWwtdGV4dFwiPiB7eyAnb3B0aW9uYWwnIHwgdHJhbnNsYXRlIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFwcC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyID8gKGxhYmVsS2V5UGxhY2VIb2xkZXIoZmllbGQpIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJmaWVsZC5yZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJmaWVsZC5yZWFkb25seSA/IC0xIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBmaWVsZC5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSkgPyAnZXJyb3ItJyArIGZpZWxkLnByb3BlcnR5IDogbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwYXNzd29yZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXBwLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiaGlkZSAmJiAhZmllbGQuZGlzYWJsZWQgPyAncGFzc3dvcmQnIDogJ3RleHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImZpZWxkLnJlYWRvbmx5ID8gLTEgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciA/IChsYWJlbEtleVBsYWNlSG9sZGVyKGZpZWxkKSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGZpZWxkLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSkgPyAnZXJyb3ItJyArIGZpZWxkLnByb3BlcnR5IDogbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0U3VmZml4LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGlkZSA9ICFoaWRlXCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaGlkZSA/ICd2aXNpYmlsaXR5X29mZicgOiAndmlzaWJpbGl0eScgfX0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGV4dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRleHRSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbCAmJiAhZmllbGQucmVhZG9ubHlcIiBjbGFzcz1cIm9wdGlvbmFsLXRleHRcIj4ge3sgJ29wdGlvbmFsJyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJmaWVsZC5zaG93U2VhcmNoSWNvblwiIG1hdFByZWZpeD5zZWFyY2g8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhcHAtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciA/IChsYWJlbEtleVBsYWNlSG9sZGVyKGZpZWxkKSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZmllbGQucmVhZG9ubHkgPyAtMSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXl1cCk9XCJmaXhBcmFiaWNOdW1iZXJzKCRldmVudC50YXJnZXQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heERpZ2l0c109XCJmaWVsZC5tYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Bob25lTnVtYmVyT25seV09XCJmaWVsZC5waG9uZU51bWJlck9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgZmllbGQucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpZWxkLnNob3dTZWFyY2hJY29uICYmICFmaWVsZC5yZWFkb25seSAmJiAoZm9ybVBhcmFtPy5nZXQoW2ZpZWxkLnByb3BlcnR5XSk/LnZhbHVlID8/ICcnKSAhPT0gJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xlYXItaWNvbi1zdWZmaXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjbGVhci1pY29uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidCQVNFX1RBQkxFLmNsZWFyRmllbGQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckZpZWxkVmFsdWUoZmllbGQucHJvcGVydHkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gYXJpYS1oaWRkZW49XCJ0cnVlXCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ211bHRpLXN0YXRlLWNoZWNrYm94J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11bHRpLXN0YXRlLWZpbHRlclwiIFtmb3JtR3JvdXBdPVwiZm9ybVBhcmFtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm11bHRpLXN0YXRlLWZpbHRlcl9fdHJpZ2dlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cInN0YXR1c011bHRpTWVudVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZpZWxkLnBsYWNlaG9sZGVyID8gKGxhYmVsS2V5UGxhY2VIb2xkZXIoZmllbGQpIHwgdHJhbnNsYXRlKSA6IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtdWx0aS1zdGF0ZS1maWx0ZXJfX3RyaWdnZXItdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubXVsdGktc3RhdGUtZmlsdGVyX190cmlnZ2VyLXRleHQtLXBsYWNlaG9sZGVyXT1cImlzTXVsdGlTdGF0ZUVtcHR5KGZpZWxkLnByb3BlcnR5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TXVsdGlTdGF0ZUZpbHRlclRyaWdnZXJMYWJlbChmaWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZmllbGQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGxhYmVsS2V5UGxhY2VIb2xkZXIoZmllbGQpIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoJ0ZJTFRFUi1CVUlMREVSLnNlbGVjdFN0YXR1cycgfCB0cmFuc2xhdGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibXVsdGktc3RhdGUtZmlsdGVyX19jaGV2cm9uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI3N0YXR1c011bHRpTWVudT1cIm1hdE1lbnVcIiBjbGFzcz1cIm11bHRpLXN0YXRlLWZpbHRlcl9fbWVudS1wYW5lbFwiIFtoYXNCYWNrZHJvcF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtdWx0aS1zdGF0ZS1maWx0ZXJfX21lbnUtaW5uZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbk11bHRpU3RhdGVNZW51SW5uZXJLZXlkb3duKCRldmVudCwgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb2RlIG9mIGZpZWxkLmxpc3RPcHRpb25zIHx8IFtdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm11bHRpLXN0YXRlLWZpbHRlcl9fcm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1tdWx0aS1zdGF0ZS1jb2RlXT1cImNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25NdWx0aVN0YXRlUm93Q2xpY2soJGV2ZW50LCBmaWVsZC5wcm9wZXJ0eSwgY29kZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImlzTXVsdGlTdGF0ZVNlbGVjdGVkKGZpZWxkLnByb3BlcnR5LCBjb2RlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVNdWx0aVN0YXRlRmlsdGVyKGZpZWxkLnByb3BlcnR5LCBjb2RlLCAkZXZlbnQuY2hlY2tlZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtdWx0aS1zdGF0ZS1maWx0ZXJfX3BpbGwgc3RhdGVUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc3RhdHVzT3B0aW9uTGFiZWxLZXkoZmllbGQsIGNvZGUpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGlwLWxpc3QnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1hbmQtYXN0ZXJpc2stY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cImN1c3RvbS1sYWJlbFwiIGlkPVwibGFiZWwte3tmaWVsZC5wcm9wZXJ0eX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1ncmlkIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGZpZWxkLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGZpZWxkLnByb3BlcnR5IH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1yb3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbWFpbCBvZiBzcGxpdHRlZENoaXBzKGZvcm1QYXJhbSwgZmllbGQucHJvcGVydHkpOyBsZXQgaWR4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwicmVtb3ZhYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmVDaGlwc0l0ZW0oZm9ybVBhcmFtLCBmaWVsZC5wcm9wZXJ0eSwgaWR4KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1haWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gbWF0Q2hpcFJlbW92ZSAqbmdJZj1cInJlbW92YWJsZVwiPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtcm93PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBmaWVsZC5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSkgPyAnZXJyb3ItJyArIGZpZWxkLnByb3BlcnR5IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0Rm9yXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzXT1cInNlcGFyYXRvcktleXNDb2Rlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0QWRkT25CbHVyXT1cImFkZE9uQmx1clwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Q2hpcElucHV0VG9rZW5FbmQpPVwiYWRkRW1haWxUb0NoaXBzKCRldmVudCwgZm9ybVBhcmFtLCBmaWVsZC5wcm9wZXJ0eSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtZ3JpZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Ftb3VudCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFtb3VudFJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1hbmQtYXN0ZXJpc2stY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cImN1c3RvbS1sYWJlbFwiIGlkPVwibGFiZWwte3tmaWVsZC5wcm9wZXJ0eX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+ICogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsICYmICFmaWVsZC5yZWFkb25seVwiIGNsYXNzPVwib3B0aW9uYWwtdGV4dFwiPiB7eyAnb3B0aW9uYWwnIHwgdHJhbnNsYXRlIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFwcC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgPyAobGFiZWxLZXlQbGFjZUhvbGRlcihmaWVsZCkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImZpZWxkLnJlYWRvbmx5ID8gLTEgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGZpZWxkLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3NlcXVlbmNlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZWZlcmVuY2VBdHRyaWJ1dGVUcnVlKGZpZWxkLnByb3BlcnR5LCAnYXV0b0dlbmVyYXRlZCcpOyBlbHNlIG5vU2VxdWVuY2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+ICogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYXBwLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgPyAobGFiZWxLZXlQbGFjZUhvbGRlcihmaWVsZCkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgZmllbGQucHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9TZXF1ZW5jZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhcHAtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciA/IChsYWJlbEtleVBsYWNlSG9sZGVyKGZpZWxkKSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGZpZWxkLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXdvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGV4dGFyZWFSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbCAmJiAhZmllbGQucmVhZG9ubHlcIiBjbGFzcz1cIm9wdGlvbmFsLXRleHRcIj4ge3sgJ29wdGlvbmFsJyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNka0ZvY3VzSW5pdGlhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGtBdXRvc2l6ZU1pblJvd3M9XCIzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgPyAobGFiZWxLZXlQbGFjZUhvbGRlcihmaWVsZCkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGZpZWxkLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4RGlnaXRzXT1cImZpZWxkLm1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImZpZWxkLnJlYWRvbmx5ID8gLTEgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbnVtYmVyJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXdvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibnVtYmVyUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWwgJiYgIWZpZWxkLnJlYWRvbmx5XCIgY2xhc3M9XCJvcHRpb25hbC10ZXh0XCI+IHt7ICdvcHRpb25hbCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYXBwLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLm1pbl09XCJmaWVsZC5hbGxvd05lZ2F0aXZlID8gbnVsbCA6IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiYmxvY2tOZWdhdGl2ZU51bWJlcktleWRvd24oJGV2ZW50LCBmaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyID8gKGxhYmVsS2V5UGxhY2VIb2xkZXIoZmllbGQpIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGZpZWxkLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heERpZ2l0c109XCJmaWVsZC5tYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlYWRvbmx5ID8gZmFsc2UgOiBmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZmllbGQucmVhZG9ubHkgPyAtMSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhdHRlcm5dPVwiZmllbGQucGF0dGVyblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIiAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidiaWdkZWNpbWFsJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXdvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibnVtYmVyUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWwgJiYgIWZpZWxkLnJlYWRvbmx5XCIgY2xhc3M9XCJvcHRpb25hbC10ZXh0XCI+IHt7ICdvcHRpb25hbCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRtb2RlPVwibnVtZXJpY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciA/IChsYWJlbEtleVBsYWNlSG9sZGVyKGZpZWxkKSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgZmllbGQucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnVtYmVyc09ubHldPVwidHJ1ZVwiICBbbWF4RGVjaW1hbHNdPVwiZmllbGQubWF4RGVjaW1hbHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhEaWdpdHNdPVwiZmllbGQubWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJmaWVsZC5wYXR0ZXJuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSkgPyAnZXJyb3ItJyArIGZpZWxkLnByb3BlcnR5IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlYWRvbmx5ID8gZmFsc2UgOiBmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJmaWVsZC5yZWFkb25seSA/IC0xIDogbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIiAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0aW1lJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXdvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGltZVJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1hbmQtYXN0ZXJpc2stY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cImN1c3RvbS1sYWJlbFwiIGlkPVwibGFiZWwte3tmaWVsZC5wcm9wZXJ0eX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+ICogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsICYmICFmaWVsZC5yZWFkb25seVwiIGNsYXNzPVwib3B0aW9uYWwtdGV4dFwiPiB7eyAnb3B0aW9uYWwnIHwgdHJhbnNsYXRlIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0aW1lSW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXBwLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRpbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciA/IChsYWJlbEtleVBsYWNlSG9sZGVyKGZpZWxkKSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJmaWVsZC5yZWFkb25seSA/IC0xIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgZmllbGQucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSkgPyAnZXJyb3ItJyArIGZpZWxkLnByb3BlcnR5IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlYWRvbmx5XCIgbWF0U3VmZml4IGNsYXNzPVwibWF0LWRhdGVwaWNrZXItdG9nZ2xlIHRpbWUtcGlja2VyLXRvZ2dsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRpbWUtcGlja2VyLXRvZ2dsZS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5UaW1lUGlja2VyKHRpbWVJbnB1dCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnNjaGVkdWxlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hlY2tib3gnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhd29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGVja2JveFJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAxNHB4OyBwYWRkaW5nLXRvcDogMTRweDtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSkgPyAnZXJyb3ItJyArIGZpZWxkLnByb3BlcnR5IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGZpZWxkLnByb3BlcnR5IH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RvZ2dsZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRvZ2dsZVJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1hbmQtYXN0ZXJpc2stY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+ICogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsICYmICFmaWVsZC5yZWFkb25seVwiIGNsYXNzPVwib3B0aW9uYWwtdGV4dFwiPiB7eyAnb3B0aW9uYWwnIHwgdHJhbnNsYXRlIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgZmllbGQucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSkgPyAnZXJyb3ItJyArIGZpZWxkLnByb3BlcnR5IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGZpZWxkLnByb3BlcnR5IH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjb2xvci1waWNrZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHhcIj57eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX08L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVqcy1jb2xvcnBpY2tlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImNvbG9ycGlja2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3JhZGlvLWJ1dHRvbidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJhZGlvQnV0dG9uUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3tmaWVsZC5wcm9wZXJ0eX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcHAtcmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCI+e3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1pbnB1dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJhZGlvLWdyb3VwLWN1c3RvbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmllbGQubGlzdE9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJvcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBvcHRpb24gfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbGlzdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpc3RSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWwgJiYgIWZpZWxkLnJlYWRvbmx5XCIgY2xhc3M9XCJvcHRpb25hbC10ZXh0XCI+IHt7ICdvcHRpb25hbCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3tmaWVsZC5wcm9wZXJ0eX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyID8gKGxhYmVsS2V5UGxhY2VIb2xkZXIoZmllbGQpIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5yZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cImZpZWxkLm11bHRpIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVhZG9ubHkgPyBmYWxzZSA6IGZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHZhbHVlKV09XCJmaWVsZC5kZWZhdWx0TGlzdE9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC50cmFuc2xhdGU7IGVsc2UgbG9va3VwX25vX3RyYW5zbGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWVsZC5saXN0T3B0aW9uczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZyaWVuZGx5TmFtZShmaWVsZC5sYWJlbCwgZmllbGQucHJvcGVydHksIGl0ZW0pIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsb29rdXBfbm9fdHJhbnNsYXRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWVsZC5saXN0T3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldE9wdGlvblZhbHVlKGl0ZW0pIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXR0YWNobWVudCdcIiBbZm9ybUdyb3VwXT1cImZvcm1QYXJhbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWwgJiYgIWZpZWxkLnJlYWRvbmx5XCIgY2xhc3M9XCJvcHRpb25hbC10ZXh0XCI+IHt7ICdvcHRpb25hbCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWF0dGFjaG1lbnQtdXBsb2FkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdGVkVHlwZXNdPVwiZ2V0QWNjZXB0ZWRGaWxlVHlwZXMoZmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FyaWFEZXNjcmliZWRCeV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZVNlbGVjdGVkKT1cIm9uQXR0YWNobWVudEZpbGVTZWxlY3RlZCgkZXZlbnQsIGZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXRvcDogNXB4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC1hdHRhY2htZW50LXVwbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgY2xhc3M9XCJpcS1lcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xvb2t1cCdcIiBbZm9ybUdyb3VwXT1cImZvcm1QYXJhbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXdvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9va3VwUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtYXV0by1jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtUGFyYW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3VwcG9ydGluZ0F0dHJpYnV0ZXNdPVwic3VwcG9ydGluZ0F0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFZhbHVlXT1cInRoaXMuZm9ybVBhcmFtLmdldChmaWVsZC5wcm9wZXJ0eSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkVmFsdWUpPVwicGF0Y2hMb29rdXBWYWx1ZSgkZXZlbnQsIGZpZWxkLnByb3BlcnR5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtYXV0by1jb21wbGV0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY3VycmVuY3knXCIgW2Zvcm1Hcm91cF09XCJmb3JtUGFyYW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1cnJlbmN5UmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVW5jb21tZW50IGFuZCB1c2UgdGhlIGN1cnJlbmN5IGNvbnRyb2wgd2hlbiByZWFkeSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGFwcC1jdXJyZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVBhcmFtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdFZhbHVlXT1cInRoaXMuZm9ybVBhcmFtLmdldChmaWVsZC5wcm9wZXJ0eSk/LnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFZhbHVlKT1cInBhdGNoQ3VycmVuY3lWYWx1ZSgkZXZlbnQsIGZpZWxkLnByb3BlcnR5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtY3VycmVuY3k+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbXVsdGktc2VsZWN0J1wiIFtmb3JtR3JvdXBdPVwiZm9ybVBhcmFtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhd29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJtdWx0aVNlbGVjdFJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLW11bHRpLWF1dG8tY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwiZm9ybVBhcmFtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsc1NlY3Rpb25dPVwicGFnZUluZm8ubGFiZWxzU2VjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwiZ2V0TXVsdGlWYWx1ZShmaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRWYWx1ZSk9XCJwYXRjaE11bHRpU2VsZWN0VmFsdWUoJGV2ZW50LCBmaWVsZC5wcm9wZXJ0eSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLW11bHRpLWF1dG8tY29tcGxldGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncmljaC10ZXh0J1wiIFtmb3JtR3JvdXBdPVwiZm9ybVBhcmFtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVW5jb21tZW50IGFuZCB1c2UgdGhlIHJpY2ggdGV4dCBlZGl0b3Igd2hlbiByZWFkeSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxja2VkaXRvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlZGl0b3JdPVwiRWRpdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY2tlZGl0b3I+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGl2aWRlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2h5cGVyLXRleHQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldEh5cGVyVGV4dEV2ZW50KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoeXBlci1saW5rXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3NlY3Rpb24tdGl0bGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJocmRpdmlkZXItbWlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VxdWF0aW9uLWJ1aWxkZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhd29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZXh0UmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWwgJiYgIWZpZWxkLnJlYWRvbmx5XCIgY2xhc3M9XCJvcHRpb25hbC10ZXh0XCI+IHt7ICdvcHRpb25hbCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYXBwLWlucHV0XCIgZGlyPVwibHRyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgPyAobGFiZWxLZXlQbGFjZUhvbGRlcihmaWVsZCkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImZpZWxkLnJlYWRvbmx5ID8gLTEgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGZpZWxkLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VxdWF0aW9uLWJ1aWxkZXInXCIgW2Zvcm1Hcm91cF09XCJmb3JtUGFyYW1cIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhd29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF0ZVJlYWRvbmx5XCItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IHdpZHRoOiAzNTAlXCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD57eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJ3aWR0aDogNDAwJVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtZ3JpZCAjY2hpcEdyaWQ+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVxdWF0aW9uVmFsdWUgb2YgZXF1YXRpb25WYWx1ZXMoKTsgbGV0IGkgPSBpbmRleFwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1yb3cgKHJlbW92ZWQpPVwicmVtb3ZlKGVxdWF0aW9uVmFsdWUsIGkpXCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBlcXVhdGlvblZhbHVlIH19LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdENoaXBSZW1vdmUtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncmVtb3ZlICcgKyBlcXVhdGlvblZhbHVlXCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1yb3c+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcC1ncmlkPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudEVxdWF0aW9uVmFsdWVcIi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0Rm9yXT1cImNoaXBHcmlkXCItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzXT1cInNlcGFyYXRvcktleXNDb2Rlc1wiLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRDaGlwSW5wdXRUb2tlbkVuZCk9XCJhZGQoJGV2ZW50KVwiLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgZXF1YXRpb24gdmFsdWVcIiAvPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1hdXRvY29tcGxldGUgI2F1dG89XCJtYXRBdXRvY29tcGxldGVcIiAob3B0aW9uU2VsZWN0ZWQpPVwic2VsZWN0ZWQoJGV2ZW50KVwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWx0ZXJlZEZpZWxkIG9mIChlcXVhdGlvbkZpbHRlcmVkRmllbGRzKCkgfCBhc3luYylcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiZmlsdGVyZWRGaWVsZFwiPnt7IGZpbHRlcmVkRmllbGQgfX08L21hdC1vcHRpb24+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYXV0b2NvbXBsZXRlPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yIGNsYXNzPVwiaXEtZXJyb3JcIiAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIiBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPi0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuPC9kaXY+XG48bmctdGVtcGxhdGUgI2RhdGVSZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgW2lubmVySHRtbF09XCIhZmllbGQuaGlkZUxhYmVsID8gKGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlKSA6ICcnXCI+PC9sYWJlbD5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNSZWFkb25seVRleHRWYWx1ZUVtcHR5KGRlZmF1bHRzLCBmaWVsZCkgJiYgZmllbGQuZW1wdHlSZWFkb25seVBsYWNlaG9sZGVyS2V5OyBlbHNlIGRhdGVSZWFkb25seUhhc1ZhbHVlXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlIHJlYWRvbmx5LXZhbHVlLS1lbXB0eVwiPnt7IGZpZWxkLmVtcHR5UmVhZG9ubHlQbGFjZWhvbGRlcktleSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2RhdGVSZWFkb25seUhhc1ZhbHVlPlxuICAgICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPnt7IGV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KSB8IGRhdGU6IGdldFJlYWRvbmx5RGF0ZUZvcm1hdChmaWVsZCkgfX08L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RpbWVSZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgW2lubmVySHRtbF09XCIhZmllbGQuaGlkZUxhYmVsID8gKGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlKSA6ICcnXCI+PC9sYWJlbD5cbiAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlXCI+e3sgZm9ybWF0VGltZVRvRGF0ZShkZWZhdWx0c1tmaWVsZC5wcm9wZXJ0eV0pIHwgZGF0ZTogJ3Nob3J0VGltZScgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwaG9uZU51bWJlclJlYWRvbmx5IGxldC1maWVsZD1cImZpZWxkXCI+XG4gIDxkaXYgY2xhc3M9XCJyZWFkb25seS1pdGVtXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwicmVhZG9ubHktbGFiZWxcIiBbaW5uZXJIdG1sXT1cIiFmaWVsZC5oaWRlTGFiZWwgPyAoZmllbGQubGFiZWwgfCB0cmFuc2xhdGUpIDogJydcIj48L2xhYmVsPlxuICAgIDxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmFsdWVcIj57eyBleHRyYWN0RmllbGROYW1lKGRlZmF1bHRzLCBmaWVsZC5wcm9wZXJ0eSkgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZXh0UmVhZG9ubHkgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LWl0ZW1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiICpuZ0lmPVwiIWZpZWxkLmFkdmFuY2VkRmlsdGVyXCI+PC9sYWJlbD5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNSZWFkb25seVRleHRWYWx1ZUVtcHR5KGRlZmF1bHRzLCBmaWVsZCkgJiYgZmllbGQuZW1wdHlSZWFkb25seVBsYWNlaG9sZGVyS2V5OyBlbHNlIHRleHRSZWFkb25seUhhc1ZhbHVlXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlIHJlYWRvbmx5LXZhbHVlLS1lbXB0eVwiPnt7IGZpZWxkLmVtcHR5UmVhZG9ubHlQbGFjZWhvbGRlcktleSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3RleHRSZWFkb25seUhhc1ZhbHVlPlxuICAgICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPnt7IGV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KSB9fTwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGV4dGFyZWFSZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQudGV4dEZvcm1hdCA9PT0gJ2pzb24nOyBlbHNlIG5vcm1hbFRleHRcIj5cbiAgICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwicmVhZG9ubHktbGFiZWxcIiBbaW5uZXJIdG1sXT1cIiFmaWVsZC5oaWRlTGFiZWwgPyAoZmllbGQubGFiZWwgfCB0cmFuc2xhdGUpIDogJydcIj48L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlIGpzb24tdmlld2VyXCI+XG4gICAgICAgIDxuZ3gtanNvbi12aWV3ZXIgW2pzb25dPVwiZXh0cmFjdEpzb25GaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KVwiIFtleHBhbmRlZF09XCJ0cnVlXCI+PC9uZ3gtanNvbi12aWV3ZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy10ZW1wbGF0ZSAjbm9ybWFsVGV4dD5cbiAgICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgICAgPGxhYmVsIGNsYXNzPVwicmVhZG9ubHktbGFiZWxcIiBbaW5uZXJIdG1sXT1cIiFmaWVsZC5oaWRlTGFiZWwgPyAoZmllbGQubGFiZWwgfCB0cmFuc2xhdGUpIDogJydcIj48L2xhYmVsPlxuICAgICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPnt7IGV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbnVtYmVyUmVhZG9ubHkgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LWl0ZW1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPnt7IGV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KSB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2N1cnJlbmN5UmVhZG9ubHkgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LWl0ZW1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPnt7IGV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KSB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3JhZGlvQnV0dG9uUmVhZG9ubHkgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LWl0ZW1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPnt7IHRyYW5zbGF0ZUxhYmxlKGRlZmF1bHRzW2ZpZWxkLnByb3BlcnR5XSkgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNyaWNoVGV4dFJlYWRvbmx5IGxldC1maWVsZD1cImZpZWxkXCI+XG4gIDxkaXYgY2xhc3M9XCJyZWFkb25seS1pdGVtXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwicmVhZG9ubHktbGFiZWxcIiBbaW5uZXJIdG1sXT1cIiFmaWVsZC5oaWRlTGFiZWwgPyAoZmllbGQubGFiZWwgfCB0cmFuc2xhdGUpIDogJydcIj48L2xhYmVsPlxuICAgIDxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmFsdWVcIiBbaW5uZXJIdG1sXT1cImV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KVwiPjwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NoZWNrYm94UmVhZG9ubHkgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LWl0ZW1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPlxuICAgICAgPG1hdC1pY29uIGNvbG9yPVwid2FyblwiICpuZ0lmPVwiZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpOyBlbHNlIHNob3dOb1wiPmRvbmU8L21hdC1pY29uPlxuICAgICAgPG5nLXRlbXBsYXRlICNzaG93Tm8+XG4gICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cIndhcm5cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RvZ2dsZVJlYWRvbmx5IGxldC1maWVsZD1cImZpZWxkXCI+XG4gIDxkaXYgY2xhc3M9XCJyZWFkb25seS1pdGVtXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwicmVhZG9ubHktbGFiZWxcIiBbaW5uZXJIdG1sXT1cIiFmaWVsZC5oaWRlTGFiZWwgPyAoZmllbGQubGFiZWwgfCB0cmFuc2xhdGUpIDogJydcIj48L2xhYmVsPlxuICAgIDxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmFsdWVcIj5cbiAgICAgIDxtYXQtaWNvbiBjb2xvcj1cIndhcm5cIiAqbmdJZj1cImV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KTsgZWxzZSBzaG93Tm9cIj5kb25lPC9tYXQtaWNvbj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd05vPlxuICAgICAgICA8bWF0LWljb24gY29sb3I9XCJ3YXJuXCI+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsaXN0UmVhZG9ubHkgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LWl0ZW1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiICpuZ0lmPVwiZmllbGQudHJhbnNsYXRlOyBlbHNlIG5vVHJhbnNsYXRlXCI+XG4gICAgICB7eyBsaXN0U2hvd1ZhbHVlKGRlZmF1bHRzLCBmaWVsZCkgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3NwYW4+XG4gICAgPG5nLXRlbXBsYXRlICNub1RyYW5zbGF0ZT5cbiAgICAgIDxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmFsdWVcIj57eyBleHRyYWN0RmllbGROYW1lKGRlZmF1bHRzLCBmaWVsZC5wcm9wZXJ0eSkgfX08L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3NlcXVlbmNlUmVhZG9ubHkgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LWl0ZW1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPnt7IGV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KSB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvb2t1cFJlYWRvbmx5IGxldC1maWVsZD1cImZpZWxkXCI+XG4gIDxkaXYgY2xhc3M9XCJyZWFkb25seS1pdGVtXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwicmVhZG9ubHktbGFiZWxcIiBbaW5uZXJIdG1sXT1cIiFmaWVsZC5oaWRlTGFiZWwgPyAoZmllbGQubGFiZWwgfCB0cmFuc2xhdGUpIDogJydcIj48L2xhYmVsPlxuICAgIDxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmFsdWVcIj5cbiAgICAgIHt7IGV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KT8uW3RyYW5zbGF0ZVNlcnZpY2UuZ2V0RGVmYXVsdExhbmcoKSA9PT0gJ2VuJyA/ICdlbmdsaXNoTmFtZScgOiAnYXJhYmljTmFtZSddIH19XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYW1vdW50UmVhZG9ubHkgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LWl0ZW1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPlxuICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpIHwgY3VycmVuY3k6IGN1cnJlbmN5IH19XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbXVsdGlTZWxlY3RSZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgW2lubmVySHRtbF09XCIhZmllbGQuaGlkZUxhYmVsID8gKGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlKSA6ICcnXCI+PC9sYWJlbD5cbiAgICA8bWF0LWNoaXAtZ3JpZCBjbGFzcz1cInJlYWRvbmx5LXZhbHVlIGNoaXBMaXN0XCI+XG4gICAgICA8bWF0LWNoaXAgKm5nRm9yPVwibGV0IGZpbGVkUHJvcCBvZiBzaG93TXVsdGlTZWxlY3RWYWx1ZXNBc1JlYWRvbmx5KGZpZWxkKVwiPlxuICAgICAgICB7eyBmaWxlZFByb3AgfX1cbiAgICAgIDwvbWF0LWNoaXA+XG4gICAgPC9tYXQtY2hpcC1ncmlkPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY2hpcExpc3RSZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgW2lubmVySFRNTF09XCJmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZVwiPjwvbGFiZWw+XG4gICAgPG1hdC1jaGlwLWxpc3Rib3ggY2xhc3M9XCJyZWFkb25seS12YWx1ZSBjaGlwTGlzdFwiPlxuICAgICAgPG1hdC1jaGlwLW9wdGlvbiAqbmdGb3I9XCJsZXQgbG9jIG9mIHNwbGl0UmVhZG9ubHkoZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxuICAgICAgICAgICAgICAgICAgICAgICBbcmVtb3ZhYmxlXT1cImZhbHNlXCI+XG4gICAgICAgIHt7IGxvYyB9fVxuICAgICAgPC9tYXQtY2hpcC1vcHRpb24+XG4gICAgPC9tYXQtY2hpcC1saXN0Ym94PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuPG5nLXRlbXBsYXRlICNyZWFkb25seVZpZXc+XG4gIDxkaXYgY2xhc3M9XCJyb3ctd3JhcHBlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4td3JhcHBlclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcm93IG9mIHNjcmVlbkZpZWxkcyB8IGtleXZhbHVlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3ctY29udGFpbmVyXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2Ygcm93LnZhbHVlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtY29sdW1uIHJlYWRvbmx5LWl0ZW1cIiBbc3R5bGUuZmxleF09XCJmaWVsZC5maWVsZFNpemUgPyAoJzAgMCAnICsgZmllbGQuZmllbGRTaXplICsgJyUnKSA6ICcxIDEgMCdcIj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmaWVsZC50eXBlXCI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXR0YWNobWVudCdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0F0dGFjaG1lbnRGaWVsZEVkaXRhYmxlICYmIHNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1hbmQtYXN0ZXJpc2stY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8YXBwLWF0dGFjaG1lbnQtdXBsb2FkZXJcbiAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0ZWRUeXBlc109XCJnZXRBY2NlcHRlZEZpbGVUeXBlcyhmaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgIFthcmlhRGVzY3JpYmVkQnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAoZmlsZVNlbGVjdGVkKT1cIm9uQXR0YWNobWVudEZpbGVTZWxlY3RlZCgkZXZlbnQsIGZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOiA1cHhcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9hcHAtYXR0YWNobWVudC11cGxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciBjbGFzcz1cImlxLWVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJkYXRlUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RpbWUnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRpbWVSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGhvbmUtbnVtYmVyJ1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwaG9uZU51bWJlclJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZXh0UmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZXh0YXJlYVJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm51bWJlclJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeSdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VycmVuY3lSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncmFkaW8tYnV0dG9uJ1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyYWRpb0J1dHRvblJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2hlY2tib3hSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndG9nZ2xlJ1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ0b2dnbGVSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3RhdHVzJ1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGVja2JveFJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsb29rdXAnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxvb2t1cFJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidhbW91bnQnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImFtb3VudFJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aS1zZWxlY3QnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm11bHRpU2VsZWN0UmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoaXAtbGlzdCdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2hpcExpc3RSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VxdWVuY2UnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlcXVlbmNlUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xpc3QnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpc3RSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbXVsdGktc3RhdGUtY2hlY2tib3gnXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIFtpbm5lckh0bWxdPVwiZmllbGQubGFiZWwgfCB0cmFuc2xhdGVcIj48L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlXCI+e3sgZ2V0TXVsdGlTdGF0ZVJlYWRvbmx5U3VtbWFyeShmaWVsZCwgZGVmYXVsdHMpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaWJhbi10ZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJsYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cIiFmaWVsZC5oaWRlTGFiZWwgPyAoZmllbGQubGFiZWwgfCB0cmFuc2xhdGUpIDogJydcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPiA6IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2YWx1ZVwiIFtpbm5lckh0bWxdPVwiZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3NlY3Rpb24tdGl0bGUnXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaHJkaXZpZGVyLW1pZFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuXG4iXX0=
852
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLWNhbnZhcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtZm9ybS1jYW52YXMvYmFzZS1mb3JtLWNhbnZhcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtZm9ybS1jYW52YXMvYmFzZS1mb3JtLWNhbnZhcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUVOLFNBQVMsRUFDVCxRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXlCLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRyxPQUFPLEVBQ0wsT0FBTyxFQUNQLFdBQVcsRUFDWCxZQUFZLEVBRVosY0FBYyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQzVDLFVBQVUsRUFDWCxNQUFNLHlCQUF5QixDQUFDO0FBSWpDLE9BQU8sRUFBQyxlQUFlLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFFdEUsT0FBTyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHOUQsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osUUFBUSxFQUNSLFlBQVksRUFDWixPQUFPLEVBQ1AsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQ3RCLFFBQVEsRUFDUixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2pCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFDLFFBQVEsRUFBRSxrQkFBa0Is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QUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUNwRyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxF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O3dCQUMxRCxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtxQkFDaEQ7cU1BT0QsUUFBUTtzQkFEUCxLQUFLO2dCQUtOLFFBQVE7c0JBRFAsS0FBSztnQkFJTixNQUFNO3NCQURMLEtBQUs7Z0JBSU4sTUFBTTtzQkFETCxLQUFLO2dCQUlOLHNCQUFzQjtzQkFEckIsS0FBSztnQkFHTix5QkFBeUI7c0JBRHhCLEtBQUs7Z0JBSU4sb0JBQW9CO3NCQURuQixLQUFLO2dCQUlOLFFBQVE7c0JBRFAsS0FBSztnQkFJTix5QkFBeUI7c0JBRHhCLEtBQUs7Z0JBTU4sa0JBQWtCO3NCQURqQixLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLElBQUk7c0JBREgsS0FBSztnQkFLSSxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFJUCxXQUFXO3NCQURWLE1BQU07Z0JBSVAsY0FBYztzQkFEYixNQUFNO2dCQW1CRSx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBYTJCLFdBQVc7c0JBQTNDLFNBQVM7dUJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgY29tcHV0ZWQsXG4gIG1vZGVsLFxuICBzaWduYWxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Zvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIEZvcm1zTW9kdWxlLCBGb3JtQ29udHJvbH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge1xuICBNYXRDaGlwLFxuICBNYXRDaGlwR3JpZCxcbiAgTWF0Q2hpcElucHV0LFxuICBNYXRDaGlwSW5wdXRFdmVudCxcbiAgTWF0Q2hpcExpc3Rib3gsIE1hdENoaXBPcHRpb24sIE1hdENoaXBSZW1vdmUsXG4gIE1hdENoaXBSb3dcbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NoaXBzXCI7XG5pbXBvcnQge0ZpZWxkSW5mb30gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvZmllbGQtaW5mb1wiO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZX0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHtCYWNrZW5kU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL2JhY2tlbmQtc2VydmljZVwiO1xuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5pbXBvcnQge1BhZ2VJbmZvfSBmcm9tIFwiLi4vLi4vYmFzZS1tb2RlbC9wYWdlLWluZm9cIjtcbmltcG9ydCB7Q09NTUEsIEVOVEVSLCBTRU1JQ09MT059IGZyb20gXCJAYW5ndWxhci9jZGsva2V5Y29kZXNcIjtcbmltcG9ydCB7TG9va3VwSXRlbX0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWwvbG9va3VwSXRlbVwiO1xuaW1wb3J0IHtGaWVsZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL2FwaS1yZXNwb25zZVwiO1xuaW1wb3J0IHtcbiAgQXN5bmNQaXBlLFxuICBDdXJyZW5jeVBpcGUsXG4gIERhdGVQaXBlLFxuICBLZXlWYWx1ZVBpcGUsXG4gIE5nRm9yT2YsXG4gIE5nSWYsIE5nQ2xhc3MsIE5nU3R5bGUsXG4gIE5nU3dpdGNoLFxuICBOZ1N3aXRjaENhc2UsXG4gIE5nVGVtcGxhdGVPdXRsZXRcbn0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtNYXRFcnJvciwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXRMYWJlbH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGRcIjtcbmltcG9ydCB7TWF0SW5wdXRNb2R1bGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pbnB1dFwiO1xuaW1wb3J0IHtNYXREYXRlcGlja2VyLCBNYXREYXRlcGlja2VySW5wdXQsIE1hdERhdGVwaWNrZXJUb2dnbGUsIE1hdERhdGVSYW5nZUlucHV0fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlclwiO1xuaW1wb3J0IHtNYXRJY29ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvblwiO1xuaW1wb3J0IHtNYXRJY29uQnV0dG9ufSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uXCI7XG5pbXBvcnQge0Nka1RleHRhcmVhQXV0b3NpemV9IGZyb20gXCJAYW5ndWxhci9jZGsvdGV4dC1maWVsZFwiO1xuaW1wb3J0IHtNYXRSYWRpb0J1dHRvbiwgTWF0UmFkaW9Hcm91cH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3JhZGlvXCI7XG5pbXBvcnQge01hdENoZWNrYm94fSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3hcIjtcbmltcG9ydCB7TWF0U2xpZGVUb2dnbGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGVcIjtcbmltcG9ydCB7TWF0T3B0aW9uLCBNYXRTZWxlY3R9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3RcIjtcbmltcG9ydCB7TWF0TWVudSwgTWF0TWVudUl0ZW0sIE1hdE1lbnVUcmlnZ2VyfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudVwiO1xuaW1wb3J0IHtNYXREaXZpZGVyfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlclwiO1xuaW1wb3J0IHtOZ3hKc29uVmlld2VyTW9kdWxlfSBmcm9tIFwibmd4LWpzb24tdmlld2VyXCI7XG5pbXBvcnQge05neE1hdEludGxUZWxJbnB1dENvbXBvbmVudH0gZnJvbSBcIm5neC1tYXQtaW50bC10ZWwtaW5wdXRcIjtcbmltcG9ydCB7TXVsdGlBdXRvQ29tcGxldGVDb21wb25lbnR9IGZyb20gXCIuLi9tdWx0aS1hdXRvLWNvbXBsZXRlL211bHRpLWF1dG8tY29tcGxldGUuY29tcG9uZW50XCI7XG5pbXBvcnQge0F1dG9Db21wbGV0ZUNvbXBvbmVudH0gZnJvbSBcIi4uL2F1dG8tY29tcGxldGUvYXV0by1jb21wbGV0ZS5jb21wb25lbnRcIjtcbmltcG9ydCB7QXR0YWNobWVudFVwbG9hZGVyQ29tcG9uZW50fSBmcm9tIFwiLi4vc2hhcmVkL2F0dGFjaG1lbnQtdXBsb2FkZXIvYXR0YWNobWVudC11cGxvYWRlci5jb21wb25lbnRcIjtcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlLCBNYXRBdXRvY29tcGxldGVTZWxlY3RlZEV2ZW50LCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlXCI7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgbWFwfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtMaXZlQW5ub3VuY2VyfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2ExMXlcIjtcbmltcG9ydCB7YnVpbGRGb3JtRmllbGRzLCBleHRyYWN0RmllbGROYW1lfSBmcm9tIFwiLi4vLi4vdXRpbHMvYmFzZS11dGlsc1wiO1xuaW1wb3J0IG1vbWVudCwge01vbWVudH0gZnJvbSBcIm1vbWVudC9tb21lbnRcIjtcbmltcG9ydCB7TWF0Q2VsbCwgTWF0Q2VsbERlZiwgTWF0SGVhZGVyQ2VsbCwgTWF0SGVhZGVyQ2VsbERlZn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3RhYmxlXCI7XG5pbXBvcnQge0RhdGVBZGFwdGVyLCBNQVRfREFURV9GT1JNQVRTLCBNQVRfREFURV9MT0NBTEV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9jb3JlXCI7XG5pbXBvcnQge01BVF9NT01FTlRfREFURV9BREFQVEVSX09QVElPTlMsIE1vbWVudERhdGVBZGFwdGVyfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwtbW9tZW50LWFkYXB0ZXJcIjtcbmltcG9ydCB7RGVjaW1hbE9ubHlEaXJlY3RpdmV9IGZyb20gXCIuL051bWJlcnNPbmx5RGlyZWN0aXZlXCI7XG5pbXBvcnQge01heERpZ2l0c0RpcmVjdGl2ZX0gZnJvbSBcIi4vTWF4RGlnaXRzRGlyZWN0aXZlXCI7XG5pbXBvcnQge1Bob25lTnVtYmVyT25seURpcmVjdGl2ZX0gZnJvbSBcIi4uLy4uL2RpcmVjdGl2ZXMvcGhvbmUtbnVtYmVyLW9ubHkuZGlyZWN0aXZlXCI7XG5leHBvcnQgY29uc3QgRERfTU1fWVlZWV9Gb3JtYXQgPSB7XG4gIHBhcnNlOiB7IGRhdGVJbnB1dDogJ0REL01NL1lZWVknIH0sXG4gIGRpc3BsYXk6IHtcbiAgICBkYXRlSW5wdXQ6ICdERC9NTS9ZWVlZJyxcbiAgICBtb250aFllYXJMYWJlbDogJ01NTSBZWVlZJyxcbiAgICBkYXRlQTExeUxhYmVsOiAnREQvTU0vWVlZWScsXG4gICAgbW9udGhZZWFyQTExeUxhYmVsOiAnTU1NTSBZWVlZJyxcbiAgfSxcbn07XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYmFzZS1mb3JtLWNhbnZhcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIE5nU3dpdGNoLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIE5nRm9yT2YsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBLZXlWYWx1ZVBpcGUsXG4gICAgTmdJZixcbiAgICBOZ0NsYXNzLFxuICAgIE1hdExhYmVsLFxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0RGF0ZXBpY2tlcklucHV0LFxuICAgIE1hdERhdGVwaWNrZXIsXG4gICAgTWF0RGF0ZXBpY2tlclRvZ2dsZSxcbiAgICBNYXRFcnJvcixcbiAgICBOZ1N3aXRjaENhc2UsXG4gICAgTWF0SWNvbixcbiAgICBNYXRJY29uQnV0dG9uLFxuICAgIE1hdEF1dG9jb21wbGV0ZSxcbiAgICBNYXRBdXRvY29tcGxldGVUcmlnZ2VyLFxuICAgIE1hdENoaXAsXG4gICAgQ2RrVGV4dGFyZWFBdXRvc2l6ZSxcbiAgICBNYXRSYWRpb0dyb3VwLFxuICAgIE1hdENoZWNrYm94LFxuICAgIE1hdFJhZGlvQnV0dG9uLFxuICAgIE1hdFNsaWRlVG9nZ2xlLFxuICAgIE1hdFNlbGVjdCxcbiAgICBNYXRPcHRpb24sXG4gICAgUGhvbmVOdW1iZXJPbmx5RGlyZWN0aXZlLFxuICAgIE1hdE1lbnUsXG4gICAgTWF0TWVudUl0ZW0sXG4gICAgTWF0TWVudVRyaWdnZXIsXG4gICAgTWF0RGl2aWRlcixcbiAgICBEYXRlUGlwZSxcbiAgICBOZ3hKc29uVmlld2VyTW9kdWxlLFxuICAgIEN1cnJlbmN5UGlwZSxcbiAgICBOZ3hNYXRJbnRsVGVsSW5wdXRDb21wb25lbnQsXG4gICAgTWF0Q2hpcEdyaWQsXG4gICAgTWF0Q2hpcElucHV0LFxuICAgIE1hdENoaXBSb3csXG4gICAgTWF0Q2hpcExpc3Rib3gsXG4gICAgTWF0Q2hpcE9wdGlvbixcbiAgICBNdWx0aUF1dG9Db21wbGV0ZUNvbXBvbmVudCxcbiAgICBBdXRvQ29tcGxldGVDb21wb25lbnQsXG4gICAgTWF0RGF0ZVJhbmdlSW5wdXQsXG4gICAgQXN5bmNQaXBlLFxuICAgIE1hdENoaXBSZW1vdmUsXG4gICAgTWF0Q2VsbCxcbiAgICBNYXRDZWxsRGVmLFxuICAgIE1hdEhlYWRlckNlbGwsXG4gICAgTWF0SGVhZGVyQ2VsbERlZixcbiAgICBOZ1N0eWxlLFxuICAgIEF0dGFjaG1lbnRVcGxvYWRlckNvbXBvbmVudCxcbiAgICBEZWNpbWFsT25seURpcmVjdGl2ZSxcbiAgICBNYXhEaWdpdHNEaXJlY3RpdmVcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhc2UtZm9ybS1jYW52YXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYmFzZS1mb3JtLWNhbnZhcy5jb21wb25lbnQuY3NzJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogRGF0ZUFkYXB0ZXIsXG4gICAgICB1c2VDbGFzczogTW9tZW50RGF0ZUFkYXB0ZXIsXG4gICAgICBkZXBzOiBbTUFUX0RBVEVfTE9DQUxFLCBNQVRfTU9NRU5UX0RBVEVfQURBUFRFUl9PUFRJT05TXVxuICAgIH0sXG4gICAgeyBwcm92aWRlOiBNQVRfREFURV9GT1JNQVRTLCB1c2VWYWx1ZTogRERfTU1fWVlZWV9Gb3JtYXQgfSxcbiAgICB7IHByb3ZpZGU6IE1BVF9EQVRFX0xPQ0FMRSwgdXNlVmFsdWU6ICdlbi1HQicgfVxuICBdXG5cbn0pXG5leHBvcnQgY2xhc3MgQmFzZUZvcm1DYW52YXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgcHVibGljIGhpZGU6IGJvb2xlYW4gPSB0cnVlO1xuICBkYXRlVmlld01vZGU6ICdtb250aCcgfCAneWVhcicgfCAnbXVsdGkteWVhcicgPSAnbW9udGgnO1xuICBASW5wdXQoKVxuICBwYWdlSW5mbyE6IFBhZ2VJbmZvO1xuXG5cbiAgQElucHV0KClcbiAgY3VycmVuY3k6IHN0cmluZztcblxuICBASW5wdXQoKS8vIEB0cy1pZ25vcmVcbiAgZmllbGRzOiBGaWVsZEluZm9bXSA9IFtdO1xuXG4gIEBJbnB1dCgpLy8gQHRzLWlnbm9yZVxuICBlcnJvcnM6IEZpZWxkTWVzc2FnZVtdID0gW107XG5cbiAgQElucHV0KClcbiAgd29ya2Zsb3dFZGl0YWJsZUZpZWxkczogc3RyaW5nW109W107XG4gIEBJbnB1dCgpXG4gIGlzV29ya2Zsb3dFZGl0YWJsZU1hbmFnZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzdXBwb3J0aW5nQXR0cmlidXRlczogYW55O1xuXG4gIEBJbnB1dCgpXG4gIGVkaXRhYmxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgYXR0YWNobWVudHNBbHdheXNFZGl0YWJsZT86IGJvb2xlYW47XG5cbiAgLy8gV2hlbiB0cnVlLCBlbWl0IGZvcm1VcGRhdGVkIG9uIGV2ZXJ5IHZhbHVlIGNoYW5nZS4gRGVmYXVsdCBpcyBmYWxzZSB0byBhdm9pZFxuICAvLyBub2lzeSBlbWlzc2lvbnMgZm9yIGFsbCBjb25zdW1lcnMuIEl0ZW0tbGluZS1lZGl0b3Igd2lsbCBlbmFibGUgdGhpcyBleHBsaWNpdGx5LlxuICBASW5wdXQoKVxuICBlbWl0T25WYWx1ZUNoYW5nZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBmaWx0ZXJSZXNldE5vbmNlID0gMDtcblxuICBASW5wdXQoKVxuICBpdGVtOiBhbnkgPSB7fTtcblxuICBfZGVmYXVsdHM6IGFueSA9IHt9O1xuXG4gIEBPdXRwdXQoKSBhdHRhY2htZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KCkgYWN0aW9uRW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuXG4gIEBPdXRwdXQoKVxuICBmb3JtVXBkYXRlZDogRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4gPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4oKTtcblxuICBAT3V0cHV0KClcbiAgaHlwZXJUZXh0RXZlbnQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXG4gIGZvcm1QYXJhbSE6IEZvcm1Hcm91cDtcbiAgc2NyZWVuRmllbGRzID0gbmV3IE1hcDxudW1iZXIsIEZpZWxkSW5mb1tdPigpO1xuICByZW1vdmFibGUgPSB0cnVlO1xuICBzZWxlY3RhYmxlID0gdHJ1ZTtcbiAgYWRkT25CbHVyID0gdHJ1ZTtcblxuICByZWFkb25seSBzZXBhcmF0b3JLZXlzQ29kZXM6IG51bWJlcltdID0gW0VOVEVSLCBDT01NQSwgU0VNSUNPTE9OXTtcblxuICByZWFkb25seSBtaW5EYXRlID0gbW9tZW50KFsxODAwLCAwLCAxXSk7XG5cbiAgcHVibGljIGlzUGVuZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNOZXc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXRlbUlkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgZXF1YXRpb25PcGVyYXRvcnMgOiBzdHJpbmdbXSA9IFsnKycsJy0nLCcoJyBdO1xuICBASW5wdXQoKSBlcXVhdGlvblN1Z2dlc3RlZEZpZWxkczogeyBuYW1lOiBzdHJpbmcsIGlkOiBzdHJpbmcgfVtdID0gW107XG4gIGFsbEVxdWF0aW9uRmllbGRzOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+O1xuICByZWFkb25seSBlcXVhdGlvblZhbHVlcyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuICBjdXJyZW50RXF1YXRpb25WYWx1ZSA9IG1vZGVsPHN0cmluZz4oJycpO1xuXG4gIHJlYWRvbmx5IGVxdWF0aW9uRmlsdGVyZWRGaWVsZHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY3VycmVudEVxdWF0aW9uVmFsdWUgPSB0aGlzLmN1cnJlbnRFcXVhdGlvblZhbHVlKCkudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gdGhpcy5hbGxFcXVhdGlvbkZpZWxkcy5waXBlKFxuICAgICAgICBtYXAoZmllbGRzID0+XG4gICAgICAgICAgICBjdXJyZW50RXF1YXRpb25WYWx1ZSA/IGZpZWxkcz8uZmlsdGVyKGZpZWxkID0+IGZpZWxkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY3VycmVudEVxdWF0aW9uVmFsdWUpKSA6IGZpZWxkcz8uc2xpY2UoKVxuICAgICAgICApXG4gICAgKTtcbiAgfSk7XG4gIEBWaWV3Q2hpbGQoJ0VxdWF0aW9uVmFsdWVJbnB1dCcpIGZpZWxkc0lucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gIHNldCBkZWZhdWx0cyh2YWx1ZTogYW55IHwgdW5kZWZpbmVkKSB7XG4gICAgLy8gdGhpcy5iYWNrZW5kU2VydmljZS5fZGVmYXVsdHMgPSB2YWx1ZTtcbiAgICB0aGlzLl9kZWZhdWx0cyA9IHZhbHVlO1xuICAgIHRoaXMuYnVpbGRGb3JtKCk7XG4gICAgLy8gdGhpcy5teUNhbGxiYWNrID0gdmFsdWU7XG4gIH1cblxuICBnZXQgZGVmYXVsdHMoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICAvLyB0aGlzLm15Q2FsbGJhY2s7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRzO1xuICAgIC8vIHJldHVybiB0aGlzLmJhY2tlbmRTZXJ2aWNlLl9kZWZhdWx0cztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmFja2VuZFNlcnZpY2U6IEJhY2tlbmRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBhbm5vdW5jZXI6IExpdmVBbm5vdW5jZXIpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmKHRoaXMuaXRlbSAmJiB0aGlzLml0ZW0uZmllbGRWYWx1ZSl7XG4gICAgICB0aGlzLmVxdWF0aW9uVmFsdWVzLnVwZGF0ZSh2YWx1ZSA9PiB0aGlzLml0ZW0uZmllbGRWYWx1ZSlcbiAgICB9XG4gICAgdGhpcy5kZWZhdWx0cyA9IHRoaXMuaXRlbTtcbiAgICB0aGlzLmV4dHJhY3RMYWJsZXMoKTtcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xuICAgIHRoaXMuYWN0aXZhdGVkUm91dGUuZGF0YS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmlzUGVuZGluZyA9IGRhdGFbJ21vZGUnXSA9PT0gJ3BlbmRpbmcnO1xuICAgICAgdGhpcy5pc05ldyA9IGRhdGFbJ21vZGUnXSA9PT0gJ25ldyc7XG4gICAgfSk7XG4gICAgLy8gdGhpcy5hdXRoU2VydmljZS5zdW1tYXJ5UGFuZWxTdGF0ZSQubmV4dChDb25zdGFudHMuU1VNTUFSWV9QQU5FTF9DTE9TRUQpO1xuICAgIC8vIHRoaXMuZGVmYXVsdHMgPSB7fTtcbiAgICAvLyB0aGlzLmludm9pY2VRSW5pdCgpO1xuICAgIHRoaXMuYWxsRXF1YXRpb25GaWVsZHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZ1tdPihbXSk7XG5cbiAgICB0aGlzLnVwZGF0ZUVxdWF0aW9uT3B0aW9ucygpO1xuICB9XG5cbiAgZm9ybWF0VGltZVRvRGF0ZSh2OiBhbnkpe1xuICAgIGNvbnN0IGZyb21UaW1lOiBEYXRlID0gbmV3IERhdGUoKTtcbiAgICBpZiAodikge1xuICAgICAgbGV0IHNwbGl0ID0gdi5zcGxpdChcIjpcIik7XG4gICAgICBmcm9tVGltZS5zZXRIb3VycyhzcGxpdFswXSwgc3BsaXRbMV0pO1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKGZyb21UaW1lLmdldFRpbWUoKSk7XG4gICAgfVxuICAgIHJldHVybiBcIlwiO1xuICB9XG5cbiAgcGF0Y2hMb29rdXBWYWx1ZSgkZXZlbnQ6IExvb2t1cEl0ZW0sIGZpZWxkTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCRldmVudD8uaWQgIT09IC0xICYmIHRoaXMuZGVmYXVsdHMpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMuZGVmYXVsdHNbZmllbGROYW1lXSA9IHRoaXMuZm9ybVBhcmFtLmdldChmaWVsZE5hbWUpLnZhbHVlO1xuICAgIH1cbiAgfVxuICBnZXRCYW5rTmFtZShmaWVsZE5hbWU6IHN0cmluZykge1xuICAgIC8vVE9ETyBCYXRvb2wgZG8gd2UgbmVlZCB0aGlzIGhlcmUgP1xuICAgIGlmICh0aGlzLmZvcm1QYXJhbS5nZXQoZmllbGROYW1lKS52YWx1ZT8ubGVuZ3RoID4gMTAgJiYgIWlzTmFOKHRoaXMuZm9ybVBhcmFtLmdldChmaWVsZE5hbWUpLnZhbHVlKSApIHtcbiAgICAgIHJldHVybiAnIC8gJyArIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdCQU5LLicgKyB0aGlzLmZvcm1QYXJhbS5nZXQoZmllbGROYW1lKS52YWx1ZT8uc3Vic3RyKDQsIDQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHBhdGNoTXVsdGlTZWxlY3RWYWx1ZSgkZXZlbnQ6IExvb2t1cEl0ZW1bXSwgZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoJGV2ZW50Py5sZW5ndGggPj0gMCAmJiB0aGlzLmRlZmF1bHRzKSB7XG4gICAgICB0aGlzLmRlZmF1bHRzW2ZpZWxkTmFtZV0gPSB0aGlzLmZvcm1QYXJhbS5nZXQoZmllbGROYW1lKS52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgeyBpdGVtLCBlcnJvcnMsIGZpZWxkcywgZmlsdGVyUmVzZXROb25jZSB9ID0gY2hhbmdlcztcblxuICAgIGVycm9ycz8uY3VycmVudFZhbHVlPy5mb3JFYWNoKChtc2c6IEZpZWxkTWVzc2FnZSkgPT4ge1xuICAgICAgdGhpcy5mb3JtUGFyYW0uZ2V0KG1zZy5maWVsZE5hbWUpPy5zZXRFcnJvcnMoe3NlcnZlckVycm9yOiBtc2cubWVzc2FnZX0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGl0ZW0/LmN1cnJlbnRWYWx1ZSAmJiAhaXRlbS5pc0ZpcnN0Q2hhbmdlKCkpe1xuICAgICAgdGhpcy5kZWZhdWx0cyA9IGl0ZW0uY3VycmVudFZhbHVlO1xuICAgIH1cblxuICAgIGlmIChmaWVsZHM/LmN1cnJlbnRWYWx1ZSAmJiAhZmllbGRzLmlzRmlyc3RDaGFuZ2UoKSl7XG4gICAgICB0aGlzLmJ1aWxkRm9ybSgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGZpbHRlclJlc2V0Tm9uY2UgJiZcbiAgICAgICFmaWx0ZXJSZXNldE5vbmNlLmlzRmlyc3RDaGFuZ2UoKSAmJlxuICAgICAgZmlsdGVyUmVzZXROb25jZS5jdXJyZW50VmFsdWUgIT09IGZpbHRlclJlc2V0Tm9uY2UucHJldmlvdXNWYWx1ZVxuICAgICkge1xuICAgICAgdGhpcy5yZXNldEZpbHRlckZvcm1WYWx1ZXMoKTtcbiAgICB9XG4gIH1cblxuICBzaG93RmllbGQoaXRlbTogYW55LCBmaWVsZDogYW55KSB7XG4gICAgcmV0dXJuIChpdGVtLmlkIHx8ICghaXRlbS5pZCAmJiAhZmllbGQudXBkYXRlT25seSkpICYmIGZpZWxkLnZpc2libGVcbiAgfVxuXG4gIGdldCBpc0F0dGFjaG1lbnRGaWVsZEVkaXRhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmF0dGFjaG1lbnRzQWx3YXlzRWRpdGFibGUgPz8gdGhpcy5lZGl0YWJsZTtcbiAgfVxuXG4gIHdvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZDogeyBwcm9wZXJ0eTogc3RyaW5nOyB9KSB7XG4gICAgY29uc3QgeCA9IHRoaXMuaXNXb3JrZmxvd0VkaXRhYmxlTWFuYWdlZCA/IHRoaXMud29ya2Zsb3dFZGl0YWJsZUZpZWxkcz8uZmluZEluZGV4KGQgPT4gZCA9PT0gZmllbGQucHJvcGVydHkpID4gLTEgOiB0cnVlO1xuICAgIHJldHVybiB4O1xuICB9XG5cbiAgc2hvd011bHRpU2VsZWN0VmFsdWVzQXNSZWFkb25seShmaWVsZDogRmllbGRJbmZvKSB7XG4gICAgY29uc29sZS5sb2coXCIuMDMxNTEyNTE1NjRcIilcbiAgICBjb25zdCB2aWV3UHJvcCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXREZWZhdWx0TGFuZygpID09PSAnZW4nID8gJ2VuZ2xpc2hOYW1lJyA6ICdhcmFiaWNOYW1lJztcbiAgICByZXR1cm4gdGhpcy5leHRyYWN0RmllbGROYW1lKHRoaXMuZGVmYXVsdHMsZmllbGQucHJvcGVydHkpPy5tYXAoKGE6IHsgW3g6IHN0cmluZ106IGFueTsgfSkgPT4gYVt2aWV3UHJvcF0pO1xuICB9XG5cbiAgc3BsaXRSZWFkb25seSh2YWx1ZXM6IGFueSkge1xuICAgIHJldHVybiAhdmFsdWVzIHx8IHZhbHVlcyA9PT0gJycgPyBbXTogdmFsdWVzLnNwbGl0KCc7Jyk7XG4gIH1cblxuXG4gIHJlZmVyZW5jZUF0dHJpYnV0ZVRydWUoZmllbGROYW1lOiBzdHJpbmcsIGF0dHJpYnV0ZTogYW55KSB7XG4gICAgLy8gcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UucmVmZXJlbmNlQXR0cmlidXRlVHJ1ZShmaWVsZE5hbWUsIHRoaXMucGFnZUluZm8ucHJvY2Vzc0lkLCBhdHRyaWJ1dGUpO1xuICB9XG5cbiAgdHJhbnNsYXRlTGFibGUoaXRlbUVsZW1lbnQ6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChpdGVtRWxlbWVudClcbiAgfVxuXG4gIGJ1aWxkRm9ybSgpIHtcbiAgICBpZiAoIXRoaXMuZmllbGRzIHx8IHRoaXMuZmllbGRzLmxlbmd0aCA9PT0gMCB8fCAhdGhpcy5kZWZhdWx0cykgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmZvcm1QYXJhbSkge1xuICAgICAgdGhpcy5mb3JtUGFyYW0gPSB0aGlzLmZiLmdyb3VwKGJ1aWxkRm9ybUZpZWxkcyh0aGlzLmZpZWxkcywgdGhpcy5kZWZhdWx0cykpO1xuICAgICAgdGhpcy5wYXRjaERpc2FibGVkRm9ybVZhbGlkaXR5KCk7XG4gICAgICAvLyBFbWl0IGluaXRpYWwgZm9ybSByZWZlcmVuY2VcbiAgICAgIHRoaXMuZm9ybVVwZGF0ZWQubmV4dCh0aGlzLmZvcm1QYXJhbSk7XG4gICAgICAvLyBFbWl0IG9uIGV2ZXJ5IHZhbHVlIGNoYW5nZSBzbyBwYXJlbnQgY29tcG9uZW50cyBjYW4gcmVhY3QgbGl2ZVxuICAgICAgaWYgKHRoaXMuZW1pdE9uVmFsdWVDaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuZm9ybVBhcmFtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZm9ybVVwZGF0ZWQuZW1pdCh0aGlzLmZvcm1QYXJhbSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGNoVmFsdWVzOiBhbnkgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQucmVhZG9ubHkpIHtcbiAgICAgICAgdGhpcy5mb3JtUGFyYW0uZ2V0KGZpZWxkLnByb3BlcnR5KT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZvcm1QYXJhbS5nZXQoZmllbGQucHJvcGVydHkpPy5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLnR5cGUgIT09ICdzcGFjZXInKSB7XG4gICAgICAgIGxldCB2ID0gZXh0cmFjdEZpZWxkTmFtZSh0aGlzLmRlZmF1bHRzLCBmaWVsZC5wcm9wZXJ0eSk7XG4gICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnbXVsdGktc3RhdGUtY2hlY2tib3gnICYmICh2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gbnVsbCkpIHtcbiAgICAgICAgICB2ID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2hWYWx1ZXNbZmllbGQucHJvcGVydHldID0gdjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZvcm1QYXJhbS5wYXRjaFZhbHVlKHBhdGNoVmFsdWVzLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgdGhpcy5wYXRjaERpc2FibGVkRm9ybVZhbGlkaXR5KCk7XG4gIH1cblxuXG4gIHByaXZhdGUgcGF0Y2hEaXNhYmxlZEZvcm1WYWxpZGl0eSgpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtUGFyYW07XG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmb3JtLCAndmFsaWQnLCB7XG4gICAgICBnZXQ6ICgpID0+IGZvcm0uc3RhdHVzID09PSAnRElTQUJMRUQnIHx8IGZvcm0uc3RhdHVzID09PSAnVkFMSUQnLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RmlsdGVyRm9ybVZhbHVlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZm9ybVBhcmFtIHx8ICF0aGlzLmZpZWxkcz8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGVtcHR5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC50eXBlICE9PSAnc3BhY2VyJykge1xuICAgICAgICBlbXB0eVtmaWVsZC5wcm9wZXJ0eV0gPSBmaWVsZC50eXBlID09PSAnbXVsdGktc3RhdGUtY2hlY2tib3gnID8gW10gOiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmZvcm1QYXJhbS5wYXRjaFZhbHVlKGVtcHR5LCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxhYmVsS2V5KGNvbHVtbjogYW55KSB7XG4gICAgY29uc3QgY29uZmlndXJlZEtleSA9IGNvbHVtbi5sYWJlbCA/IGNvbHVtbi5sYWJlbCA6IGNvbHVtbi5wcm9wZXJ0eVxuICAgIHJldHVybiBjb25maWd1cmVkS2V5LnN0YXJ0c1dpdGgodGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9uKSA/IGAke2NvbmZpZ3VyZWRLZXl9YCA6IGAke3RoaXMucGFnZUluZm8ubGFiZWxzU2VjdGlvbn0uJHtjb25maWd1cmVkS2V5fWA7XG4gIH1cblxuICBsYWJlbEtleVBsYWNlSG9sZGVyKGNvbHVtbjogYW55KSB7XG4gICAgY29uc3QgY29uZmlndXJlZEtleSA9IGNvbHVtbi5wbGFjZWhvbGRlciA/IGNvbHVtbi5wbGFjZWhvbGRlciA6IGNvbHVtbi5wcm9wZXJ0eVxuICAgIHJldHVybiBjb25maWd1cmVkS2V5LnN0YXJ0c1dpdGgodGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9uKSA/IGAke2NvbmZpZ3VyZWRLZXl9YCA6IGAke3RoaXMucGFnZUluZm8ubGFiZWxzU2VjdGlvbn0uJHtjb25maWd1cmVkS2V5fWA7XG4gIH1cblxuICBibG9ja05lZ2F0aXZlTnVtYmVyS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgZmllbGQ6IEZpZWxkSW5mbyk6IHZvaWQge1xuICAgIGlmIChmaWVsZC5hbGxvd05lZ2F0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICctJyB8fCBldmVudC5jb2RlID09PSAnTWludXMnIHx8IGV2ZW50LmNvZGUgPT09ICdOdW1wYWRTdWJ0cmFjdCcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgb3BlblRpbWVQaWNrZXIoaW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIWlucHV0IHx8IGlucHV0LmRpc2FibGVkIHx8IGlucHV0LnJlYWRPbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnB1dC5zaG93UGlja2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbnB1dC5zaG93UGlja2VyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBpbnB1dC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlucHV0LmZvY3VzKCk7XG4gICAgaW5wdXQuY2xpY2soKTtcbiAgfVxuXG4gIGdldEVycm9ycyhwcm9wOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1QYXJhbT8uZ2V0KFtwcm9wXSk7XG4gICAgaWYgKCFjb250cm9sIHx8IGNvbnRyb2wuZGlzYWJsZWQpIHJldHVybiAnJztcblxuICAgIGlmIChjb250cm9sLmludmFsaWQgJiYgY29udHJvbC5lcnJvcnMpIHtcbiAgICAgIGNvbnN0IGVyciA9IGNvbnRyb2wuZXJyb3JzO1xuICAgICAgaWYgKGVyclsnbWF0RGF0ZXBpY2tlck1pbiddKSB7XG4gICAgICAgIHJldHVybiAnbWF0RGF0ZXBpY2tlck1pbic7XG4gICAgICB9XG4gICAgICBpZiAoZXJyWydtYXREYXRlcGlja2VyTWF4J10pIHtcbiAgICAgICAgcmV0dXJuICdtYXREYXRlcGlja2VyTWF4JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoZiA9PiBmLnByb3BlcnR5ID09PSBwcm9wKTtcblxuICAgIGlmICghZmllbGQ/LnZhbGlkYXRpb25NZXNzYWdlcykge1xuICAgICAgaWYgKGZpZWxkPy50eXBlID09PSAncGhvbmUtbnVtYmVyJyAmJiBjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5kaXJ0eSAmJiAhY29udHJvbC52YWx1ZSkge1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLnBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyBcIi5cIjtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArICdJTlZBTElEX1BIT05FX05VTUJFUic7XG4gICAgICB9XG4gICAgICBpZiAoY29udHJvbC52YWx1ZSAmJiBjb250cm9sLnN0YXR1cyAhPT0gJ1ZBTElEJyAmJiB0aGlzLmdldEZpcnN0RXJyb3JLZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Rmlyc3RFcnJvcktleShwcm9wKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAoZmllbGQ/LnR5cGUgPT09ICdwaG9uZS1udW1iZXInICYmIGNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmRpcnR5ICYmICFjb250cm9sLnZhbHVlKSB7XG4gICAgICBjb25zdCBwcmVmaXggPSB0aGlzLnBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyBcIi5cIjtcbiAgICAgIHJldHVybiBwcmVmaXggKyAoZmllbGQudmFsaWRhdGlvbk1lc3NhZ2VzPy52YWxpZGF0ZVBob25lTnVtYmVyIHx8ICdJTlZBTElEX1BIT05FX05VTUJFUicpO1xuICAgIH1cblxuICAgIGlmIChjb250cm9sLmludmFsaWQpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IGNvbnRyb2wuZXJyb3JzIHx8IHt9O1xuICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9uICsgXCIuXCI7XG5cbiAgICAgIGlmIChlcnJvcnNbJ3JlcXVpcmVkJ10pIHJldHVybiBwcmVmaXggKyAnUkVRVUlSRUQnO1xuICAgICAgaWYgKGVycm9yc1snbWluJ10pIHJldHVybiBwcmVmaXggKyAoZmllbGQudmFsaWRhdGlvbk1lc3NhZ2VzPy5taW4gfHwgJ05VTUJFUl9NSU4nKTtcbiAgICAgIGlmIChlcnJvcnNbJ21heCddKSByZXR1cm4gcHJlZml4ICsgKGZpZWxkLnZhbGlkYXRpb25NZXNzYWdlcz8ubWF4IHx8ICdOVU1CRVJfTUFYJyk7XG4gICAgICBpZiAoZXJyb3JzWydtYXhsZW5ndGgnXSkgcmV0dXJuIHByZWZpeCArIChmaWVsZC52YWxpZGF0aW9uTWVzc2FnZXM/Lm1heGxlbmd0aCB8fCAnTUFYX0xFTkdUSCcpO1xuICAgICAgaWYgKGVycm9yc1snZGVjaW1hbE1pbiddKSByZXR1cm4gcHJlZml4ICsgKGZpZWxkLnZhbGlkYXRpb25NZXNzYWdlcz8uZGVjaW1hbE1pbiB8fCAnREVDSU1BTF9NSU4nKTtcbiAgICAgIGlmIChlcnJvcnNbJ2RlY2ltYWxNYXgnXSkgcmV0dXJuIHByZWZpeCArIChmaWVsZC52YWxpZGF0aW9uTWVzc2FnZXM/LmRlY2ltYWxNYXggfHwgJ0RFQ0lNQUxfTUFYJyk7XG4gICAgICBpZiAoZXJyb3JzWydwYXR0ZXJuJ10pIHJldHVybiBwcmVmaXggKyAoZmllbGQudmFsaWRhdGlvbk1lc3NhZ2VzPy5wYXR0ZXJuIHx8ICdJTlZBTElEX0ZPUk1BVCcpO1xuICAgICAgaWYgKGVycm9yc1sndmFsaWRhdGVQaG9uZU51bWJlciddKSByZXR1cm4gcHJlZml4ICsgKGZpZWxkLnZhbGlkYXRpb25NZXNzYWdlcz8udmFsaWRhdGVQaG9uZU51bWJlciB8fCAnSU5WQUxJRF9QSE9ORV9OVU1CRVInKTtcbiAgICAgIGlmIChlcnJvcnNbJ2ludmFsaWRNYXRoRXhwcmVzc2lvbiddKSByZXR1cm4gcHJlZml4ICsgJ0lOVkFMSURfTUFUSCc7XG4gICAgICBpZiAoZXJyb3JzWydkYXRlUmFuZ2VJbnZhbGlkJ10pIHJldHVybiBwcmVmaXggKyAnZGF0ZVJhbmdlSW52YWxpZCc7XG4gICAgICBpZiAoZXJyb3JzWydzZXJ2ZXJFcnJvciddKSByZXR1cm4gcHJlZml4ICsgZXJyb3JzWydzZXJ2ZXJFcnJvciddO1xuXG4gICAgICByZXR1cm4gcHJlZml4ICsgJ0lOVkFMSURfVkFMVUUnO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG5cbiAgZ2V0Rmlyc3RFcnJvcktleShwcm9wOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZm9ybVBhcmFtPy5nZXQoW3Byb3BdKT8uZXJyb3JzO1xuXG4gICAgaWYgKCFlcnJvcnMgfHwgT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBlcnJvcnM/Llsnc2VydmVyRXJyb3InXSB8fCAnSU5WQUxJRF9GT1JNQVQnO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhlcnJvcnMpWzBdO1xuICB9XG5cbiAgcHVibGljIGdldENvdW50cnlDb2RlTGlzdCgpIHtcbiAgICByZXR1cm4gWydhZicsICdheCcsICdhbCcsICdkeicsICdhcycsICdhZCcsICdhbycsICdhaScsICdhcScsICdhZycsICdhcicsICdhbScsICdhdycsICdhdScsICdhdCcsICdheicsXG4gICAgICAnYnMnLCAnYmgnLCAnYmQnLCAnYmInLCAnYnknLCAnYmUnLCAnYnonLCAnYmonLCAnYm0nLCAnYnQnLCAnYm8nLCAnYmEnLCAnYncnLCAnYnYnLCAnYnInLCAnaW8nLCAnYm4nLFxuICAgICAgJ2JnJywgJ2JmJywgJ2JpJywgJ2toJywgJ2NtJywgJ2NhJywgJ2N2JywgJ2t5JywgJ2NmJywgJ3RkJywgJ2NsJywgJ2NuJywgJ2N4JywgJ2NjJywgJ2NvJywgJ2ttJywgJ2NnJyxcbiAgICAgICdjZCcsICdjaycsICdjcicsICdjaScsICdocicsICdjdScsICdjeScsICdjeicsICdkaycsICdkaicsICdkbScsICdkbycsICdlYycsICdlZycsICdzdicsICdncScsICdlcicsXG4gICAgICAnZWUnLCAnZXQnLCAnZmsnLCAnZm8nLCAnZmonLCAnZmknLCAnZnInLCAnZ2YnLCAncGYnLCAndGYnLCAnZ2EnLCAnZ20nLCAnZ2UnLCAnZGUnLCAnZ2gnLCAnZ2knLCAnZ3InLFxuICAgICAgJ2dsJywgJ2dkJywgJ2dwJywgJ2d1JywgJ2d0JywgJ2dnJywgJ2duJywgJ2d3JywgJ2d5JywgJ2h0JywgJ2htJywgJ3ZhJywgJ2huJywgJ2hrJywgJ2h1JywgJ2lzJywgJ2luJyxcbiAgICAgICdpZCcsICdpcicsICdpcScsICdpZScsICdpbScsICdpdCcsICdqbScsICdqcCcsICdqZScsICdqbycsICdreicsICdrZScsICdraScsICdrcicsICdrdycsICdrZycsICdsYScsXG4gICAgICAnbHYnLCAnbGInLCAnbHMnLCAnbHInLCAnbHknLCAnbGknLCAnbHQnLCAnbHUnLCAnbW8nLCAnbWsnLCAnbWcnLCAnbXcnLCAnbXknLCAnbXYnLCAnbWwnLCAnbXQnLCAnbWgnLFxuICAgICAgJ21xJywgJ21yJywgJ211JywgJ3l0JywgJ214JywgJ2ZtJywgJ21kJywgJ21jJywgJ21uJywgJ21lJywgJ21zJywgJ21hJywgJ216JywgJ21tJywgJ25hJywgJ25yJywgJ25wJyxcbiAgICAgICdubCcsICdhbicsICduYycsICdueicsICduaScsICduZScsICduZycsICdudScsICduZicsICdtcCcsICdubycsICdvbScsICdwaycsICdwdycsICdwcycsICdwYScsICdwZycsXG4gICAgICAncHknLCAncGUnLCAncGgnLCAncG4nLCAncGwnLCAncHQnLCAncHInLCAncWEnLCAncmUnLCAncm8nLCAncnUnLCAncncnLCAnYmwnLCAnc2gnLCAna24nLCAnbGMnLCAnbWYnLFxuICAgICAgJ3BtJywgJ3ZjJywgJ3dzJywgJ3NtJywgJ3N0JywgJ3NhJywgJ3NuJywgJ3JzJywgJ3NjJywgJ3NsJywgJ3NnJywgJ3NrJywgJ3NpJywgJ3NiJywgJ3NvJywgJ3phJywgJ2dzJyxcbiAgICAgICdlcycsICdsaycsICdzZCcsICdzcicsICdzaicsICdzeicsICdzZScsICdjaCcsICdzeScsICd0dycsICd0aicsICd0eicsICd0aCcsICd0bCcsICd0ZycsICd0aycsICd0bycsXG4gICAgICAndHQnLCAndG4nLCAndHInLCAndG0nLCAndGMnLCAndHYnLCAndWcnLCAndWEnLCAnYWUnLCAnZ2InLCAndXMnLCAndW0nLCAndXknLCAndXonLCAndnUnLCAndmUnLCAndm4nLFxuICAgICAgJ3ZnJywgJ3ZpJywgJ3dmJywgJ2VoJywgJ3llJywgJ3ptJywgJ3p3J107XG4gIH1cblxuXG4gIGZyaWVuZGx5TmFtZShmdWxsUGF0aDogc3RyaW5nICwgc3ViUGF0aDogc3RyaW5nICwgaXRlbTogc3RyaW5nKXtcbiAgICByZXR1cm4gIGZ1bGxQYXRoLnN1YnN0cmluZygwLCBmdWxsUGF0aC5pbmRleE9mKHN1YlBhdGgpKSArIGl0ZW0gO1xuICB9XG5cbiAgc2hvd1ZhbHVlKGRlZmF1bHRzLCBmaWVsZCl7XG4gICAgcmV0dXJuICB0aGlzLmZyaWVuZGx5TmFtZShmaWVsZC5sYWJlbCAsIGZpZWxkLnByb3BlcnR5ICwgZGVmYXVsdHNbZmllbGQucHJvcGVydHldKTtcbiAgfVxuXG4gIHNob3dFcnJvcihwcm9wOiBzdHJpbmcpIHtcbiAgICBjb25zdCBDT05UUk9MID0gdGhpcy5mb3JtUGFyYW0/LmdldChbcHJvcF0pO1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMuZmluZChmID0+IGYucHJvcGVydHkgPT09IHByb3ApO1xuICAgIGlmIChmaWVsZD8udHlwZSA9PT0gJ3Bob25lLW51bWJlcicpIHtcbiAgICAgIHJldHVybiBDT05UUk9MPy50b3VjaGVkICYmIENPTlRST0w/LmRpcnR5ICYmICFDT05UUk9MPy52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIChDT05UUk9MPy52YWx1ZSB8fCBDT05UUk9MPy52YWx1ZSA9PT0gMCkgJiYgQ09OVFJPTD8uc3RhdHVzID09PSAnSU5WQUxJRCc7XG4gIH1cblxuICBnZXRGaWVsZEN1cnJlbnRMZW5ndGgocHJvcDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybVBhcmFtPy5nZXQoW3Byb3BdKT8udmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgPyAwIDogU3RyaW5nKHZhbHVlKS5sZW5ndGg7XG4gIH1cblxuICBjbGVhckZpZWxkVmFsdWUocHJvcDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtUGFyYW0/LmdldChbcHJvcF0pPy5zZXRWYWx1ZSgnJyk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlZmF1bHRzID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdExhYmxlcygpIHtcbiAgICB0aGlzLmZpZWxkcy5mb3JFYWNoKGYgPT4ge1xuICAgICAgaWYgKGYudmlzaWJsZSkge1xuICAgICAgICBmLmxhYmVsID0gdGhpcy5sYWJlbEtleShmKTtcblxuICAgICAgICBpZiAoIXRoaXMuc2NyZWVuRmllbGRzLmhhcyhmLnJvdykpIHtcbiAgICAgICAgICB0aGlzLnNjcmVlbkZpZWxkcy5zZXQoZi5yb3csIFtdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNjcmVlbkZpZWxkcy5nZXQoZi5yb3cpIS5wdXNoKGYpO1xuXG4gICAgICAgIGlmIChmLmNhc2NhZGVkQnkpIHtcbiAgICAgICAgICB0aGlzLmZvcm1QYXJhbT8uZ2V0KFtmLmNhc2NhZGVkQnldKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm1QYXJhbT8uZ2V0KFtmLnByb3BlcnR5XSk/LnBhdGNoVmFsdWUobnVsbCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnNjcmVlbkZpZWxkcy5zaXplOyBpKyspIHtcbiAgICAgIHRoaXMuY2FsY0ZsZXhTaXplKGkpO1xuICAgIH1cbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnNjcmVlbkZpZWxkcylcbiAgfVxuXG4gIHByaXZhdGUgY2FsY0ZsZXhTaXplKGk6IG51bWJlcil7XG4gICAgLy8gUHJlc2VydmUgZXhwbGljaXQgZmllbGRTaXplIHZhbHVlcyBvbmx5LiBGb3IgZmllbGRzIHdpdGhvdXQgZmllbGRTaXplLCBhbGxvd1xuICAgIC8vIHRoZSBsYXlvdXQgdG8gYXV0by1zaXplIHZpYSBmbGV4IChoYW5kbGVkIGluIHRoZSB0ZW1wbGF0ZS9DU1MpLlxuICAgIC8vIEludGVudGlvbmFsbHkgZG8gbm90aGluZyBoZXJlIHNvIHRoYXQgdW5zcGVjaWZpZWQgZmllbGRzIHJlbWFpbiBmbGV4aWJsZS5cbiAgICByZXR1cm47XG4gIH1cblxuICBnZXRDdXJyZW5jeVBhdHRlcm4oZmllbGQ6IEZpZWxkSW5mbykge1xuICAgIC8vIGNvbnN0IGRlY2ltYWxQbGFjZXMgID0gdGhpcy5hdXRoU2VydmljZT8ubXlDdXJyZW5jaWVzPy5maW5kKGMgPT4gYy5rZXkgPT09IHRoaXMuZm9ybVBhcmFtLmdldChmaWVsZC5jdXJyZW5jeSk/LnZhbHVlKT8uY3VycmVuY3lOdW1PZkRlY2ltYWxQYXR0ZXJuIHx8IDM7XG4gICAgY29uc3QgZGVjaW1hbFBsYWNlcyAgPSAzO1xuICAgIHJldHVybiAnXlxcXFxkKig/OlsuLF1cXFxcZHsxLCcgKyBkZWNpbWFsUGxhY2VzICsgJ30pPyQnO1xuICB9XG5cbiAgc3BsaXR0ZWRDaGlwcyhmb3JtOiBGb3JtR3JvdXAsIGZpZWxkTmFtZTogc3RyaW5nKTpzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGZvcm0uZ2V0KGZpZWxkTmFtZSkudmFsdWUgPT09ICcnID8gW106IGZvcm0uZ2V0KGZpZWxkTmFtZSkudmFsdWUudHJpbSgpLnNwbGl0KCc7Jyk7XG4gIH1cblxuXG4gIGZpeEFyYWJpY051bWJlcnMoc3RyOiBhbnkpIHtcbiAgICAvLyBpZih0eXBlb2Ygc3RyID09PSAnc3RyaW5nJykge1xuICAgIC8vICAgICBzdHIgPSBzdHIucmVwbGFjZSgvKFvZoNmh2aLZo9mk2aXZptmn2ajZqV0pfChb27Dbsduy27PbtNu127bbt9u427ldKS9nLCAobSwgJDEsICQyKSA9PiBtLmNoYXJDb2RlQXQoMCkgLSAoJDEgPyAxNjMyIDogMTc3NikpO1xuICAgIC8vIH1cbiAgICAvLyBjb25zb2xlLmxvZyhzdHIpO1xuICB9XG5cbiAgbGlzdFNob3dWYWx1ZShkZWZhdWx0czogYW55LCBmaWVsZDogRmllbGRJbmZvKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRzW2ZpZWxkLnByb3BlcnR5XSA/IHRoaXMuc2hvd1ZhbHVlKGRlZmF1bHRzLCBmaWVsZCkgOiAnJztcbiAgfVxuXG4gIHJlbW92ZUNoaXBzSXRlbShmb3JtOiBGb3JtR3JvdXAsIGZpZWxkTmFtZTogc3RyaW5nLCBpZHg6IG51bWJlcikge1xuICAgIGNvbnN0IGVtYWlscyA9IHRoaXMuc3BsaXR0ZWRDaGlwcyhmb3JtLCBmaWVsZE5hbWUpO1xuICAgIGlmIChlbWFpbHMubGVuZ3RoID49IDEpe1xuICAgICAgZW1haWxzLnNwbGljZShpZHgsMSk7XG4gICAgfVxuICAgIGxldCBjbGVhbmVkRW1haWxzID0gZW1haWxzLmpvaW4oXCI7XCIpO1xuICAgIGZvcm0uZ2V0KGZpZWxkTmFtZSkuc2V0VmFsdWUoY2xlYW5lZEVtYWlscyk7XG4gIH1cblxuICBleHRyYWN0RmllbGROYW1lKGVsZW1lbnQ6IGFueSwgcHJvcGVydHk6IHN0cmluZykge1xuICAgIGlmIChwcm9wZXJ0eT8uaW5jbHVkZXMoJy4nKSkge1xuICAgICAgcmV0dXJuIHByb3BlcnR5LnNwbGl0KCcuJykucmVkdWNlKChhY2MsIHBhcnQpID0+IGFjYyAmJiBhY2NbcGFydF0sIGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWxlbWVudFtwcm9wZXJ0eV07XG4gICAgfVxuICB9XG5cbiAgaXNSZWFkb25seVRleHRWYWx1ZUVtcHR5KGRlZmF1bHRzOiBhbnksIGZpZWxkOiBGaWVsZEluZm8pOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpO1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50cmltKCkgPT09ICcnO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRSZWFkb25seURhdGVGb3JtYXQoZmllbGQ6IEZpZWxkSW5mbyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGZpZWxkLnJlYWRvbmx5RGF0ZURpc3BsYXkgPT09ICdkYXRldGltZScgPyAnZGQvTU0veXl5eSBISDptbScgOiAnZGQvTU0veXl5eSc7XG4gIH1cblxuICBvbk11bHRpU3RhdGVNZW51SW5uZXJLZXlkb3duKGV2ZW50OiBFdmVudCwgZmllbGQ6IEZpZWxkSW5mbyk6IHZvaWQge1xuICAgIGlmICghKGV2ZW50IGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzTXVsdGlTdGF0ZU1lbnVBY3RpdmF0ZUtleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgcm93ID0gdGhpcy5maW5kTXVsdGlTdGF0ZVJvd0Zyb21LZXlib2FyZEV2ZW50KGV2ZW50KTtcbiAgICBpZiAoIXJvdykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb2RlID0gcm93LmdldEF0dHJpYnV0ZSgnZGF0YS1tdWx0aS1zdGF0ZS1jb2RlJyk7XG4gICAgaWYgKCFjb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgbmV4dCA9ICF0aGlzLmlzTXVsdGlTdGF0ZVNlbGVjdGVkKGZpZWxkLnByb3BlcnR5LCBjb2RlKTtcbiAgICB0aGlzLnRvZ2dsZU11bHRpU3RhdGVGaWx0ZXIoZmllbGQucHJvcGVydHksIGNvZGUsIG5leHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc011bHRpU3RhdGVNZW51QWN0aXZhdGVLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgZXZlbnQua2V5ID09PSAnRW50ZXInIHx8XG4gICAgICBldmVudC5rZXkgPT09ICcgJyB8fFxuICAgICAgZXZlbnQua2V5ID09PSAnU3BhY2ViYXInIHx8XG4gICAgICBldmVudC5jb2RlID09PSAnU3BhY2UnIHx8XG4gICAgICBldmVudC5jb2RlID09PSAnTnVtcGFkRW50ZXInXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZE11bHRpU3RhdGVSb3dGcm9tS2V5Ym9hcmRFdmVudChldmVudDogS2V5Ym9hcmRFdmVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgcGF0aCA9XG4gICAgICB0eXBlb2YgZXZlbnQuY29tcG9zZWRQYXRoID09PSAnZnVuY3Rpb24nID8gZXZlbnQuY29tcG9zZWRQYXRoKCkgOiBbXTtcbiAgICBjb25zdCBmcm9tUGF0aCA9IHBhdGguZmluZChcbiAgICAgIChuKTogbiBpcyBIVE1MRWxlbWVudCA9PlxuICAgICAgICBuIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgbi5jbGFzc0xpc3QuY29udGFpbnMoJ211bHRpLXN0YXRlLWZpbHRlcl9fcm93JyksXG4gICAgKTtcbiAgICBpZiAoZnJvbVBhdGgpIHtcbiAgICAgIHJldHVybiBmcm9tUGF0aDtcbiAgICB9XG4gICAgY29uc3QgdCA9IGV2ZW50LnRhcmdldDtcbiAgICByZXR1cm4gdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gdC5jbG9zZXN0KCcubXVsdGktc3RhdGUtZmlsdGVyX19yb3cnKSA6IG51bGw7XG4gIH1cblxuICBvbk11bHRpU3RhdGVSb3dDbGljayhldmVudDogTW91c2VFdmVudCwgcHJvcGVydHk6IHN0cmluZywgY29kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAodGFyZ2V0Py5jbG9zZXN0KCdtYXQtY2hlY2tib3gnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gIXRoaXMuaXNNdWx0aVN0YXRlU2VsZWN0ZWQocHJvcGVydHksIGNvZGUpO1xuICAgIHRoaXMudG9nZ2xlTXVsdGlTdGF0ZUZpbHRlcihwcm9wZXJ0eSwgY29kZSwgbmV4dCk7XG4gIH1cblxuICB0b2dnbGVNdWx0aVN0YXRlRmlsdGVyKHByb3BlcnR5OiBzdHJpbmcsIGNvZGU6IHN0cmluZywgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmZvcm1QYXJhbS5nZXQocHJvcGVydHkpO1xuICAgIGlmICghY3RybCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByYXcgPSBjdHJsLnZhbHVlO1xuICAgIGNvbnN0IGN1cjogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KHJhdykgPyBbLi4ucmF3XSA6IFtdO1xuICAgIGlmIChjaGVja2VkKSB7XG4gICAgICBpZiAoIWN1ci5pbmNsdWRlcyhjb2RlKSkge1xuICAgICAgICBjdXIucHVzaChjb2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaWR4ID0gY3VyLmluZGV4T2YoY29kZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgY3VyLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBjdHJsLnNldFZhbHVlKGN1cik7XG4gIH1cblxuICBpc011bHRpU3RhdGVTZWxlY3RlZChwcm9wZXJ0eTogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByYXcgPSB0aGlzLmZvcm1QYXJhbS5nZXQocHJvcGVydHkpPy52YWx1ZTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShyYXcpICYmIHJhdy5pbmNsdWRlcyhjb2RlKTtcbiAgfVxuXG4gIGlzTXVsdGlTdGF0ZUVtcHR5KHByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCByYXcgPSB0aGlzLmZvcm1QYXJhbS5nZXQocHJvcGVydHkpPy52YWx1ZTtcbiAgICByZXR1cm4gIUFycmF5LmlzQXJyYXkocmF3KSB8fCByYXcubGVuZ3RoID09PSAwO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgbGFiZWw6IGVtcHR5ID0+IGNhbGxlciBzaG93cyBwbGFjZWhvbGRlcjsgZWxzZSBzaG9ydCBzdW1tYXJ5LiAqL1xuICBnZXRNdWx0aVN0YXRlRmlsdGVyVHJpZ2dlckxhYmVsKGZpZWxkOiBGaWVsZEluZm8pOiBzdHJpbmcge1xuICAgIGNvbnN0IHJhdyA9IHRoaXMuZm9ybVBhcmFtLmdldChmaWVsZC5wcm9wZXJ0eSk/LnZhbHVlO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogW107XG4gICAgY29uc3Qgc2VjdGlvbiA9IHRoaXMucGFnZUluZm8/LmxhYmVsc1NlY3Rpb24gfHwgJyc7XG4gICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMucGFnZUluZm8ubGFiZWxzU2VjdGlvbisgXCIuXCIgKyBmaWVsZC5wbGFjZWhvbGRlcik7XG4gICAgfVxuICAgIGlmICh0aGlzLmFyZUFsbE11bHRpU3RhdGVPcHRpb25zU2VsZWN0ZWQoZmllbGQsIHNlbGVjdGVkKSkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMucGFnZUluZm8ubGFiZWxzU2VjdGlvbisgXCIuXCIgKyBmaWVsZC5wbGFjZWhvbGRlcik7XG4gICAgfVxuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPD0gMikge1xuICAgICAgcmV0dXJuIHNlbGVjdGVkXG4gICAgICAgIC5tYXAoYyA9PiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChzZWN0aW9uID8gYCR7c2VjdGlvbn0uJHtjfWAgOiBjKSlcbiAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnRklMVEVSLUJVSUxERVIubXVsdGlTdGF0dXNTdW1tYXJ5JywgeyBjb3VudDogc2VsZWN0ZWQubGVuZ3RoIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcmVBbGxNdWx0aVN0YXRlT3B0aW9uc1NlbGVjdGVkKGZpZWxkOiBGaWVsZEluZm8sIHNlbGVjdGVkOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBmaWVsZC5saXN0T3B0aW9ucyB8fCBbXTtcbiAgICByZXR1cm4gb3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnMuZXZlcnkoKGNvZGU6IHN0cmluZykgPT4gc2VsZWN0ZWQuaW5jbHVkZXMoY29kZSkpO1xuICB9XG5cbiAgc3RhdHVzT3B0aW9uTGFiZWxLZXkoZmllbGQ6IEZpZWxkSW5mbywgY29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWN0aW9uID0gdGhpcy5wYWdlSW5mbz8ubGFiZWxzU2VjdGlvbjtcbiAgICByZXR1cm4gc2VjdGlvbiA/IGAke3NlY3Rpb259LiR7Y29kZX1gIDogY29kZTtcbiAgfVxuXG4gIGdldE11bHRpU3RhdGVSZWFkb25seVN1bW1hcnkoZmllbGQ6IEZpZWxkSW5mbywgZGVmYXVsdHM6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgcmF3ID0gdGhpcy5leHRyYWN0RmllbGROYW1lKGRlZmF1bHRzLCBmaWVsZC5wcm9wZXJ0eSk7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXcgOiBbXTtcbiAgICBjb25zdCBzZWN0aW9uID0gdGhpcy5wYWdlSW5mbz8ubGFiZWxzU2VjdGlvbiB8fCAnJztcbiAgICByZXR1cm4gc2VsZWN0ZWRcbiAgICAgIC5tYXAoYyA9PiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChzZWN0aW9uID8gYCR7c2VjdGlvbn0uJHtjfWAgOiBjKSlcbiAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgZ2V0TXVsdGlWYWx1ZShmaWVsZDogRmllbGRJbmZvKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybVBhcmFtLmdldChmaWVsZC5wcm9wZXJ0eSk/LnZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVtYWlsKGVtYWlsKSB7XG4gICAgdmFyIHJlID0gL14oKFtePD4oKVxcW1xcXVxcXFwuLDs6XFxzQFwiXSsoXFwuW148PigpXFxbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKChcXFtbMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFxdKXwoKFthLXpBLVpcXC0wLTldK1xcLikrW2EtekEtWl17Mix9KSkkLztcbiAgICByZXR1cm4gcmUudGVzdChTdHJpbmcoZW1haWwpLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgYWRkRW1haWxUb0NoaXBzKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCwgZm9ybTogRm9ybUdyb3VwLCBmaWVsZE5hbWU6IHN0cmluZykge1xuXG4gICAgY29uc3QgaW5wdXQgPSBldmVudC5pbnB1dDtcbiAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnZhbHVlO1xuICAgIGNvbnN0IGl0ZW1zID0gdmFsdWUuc3BsaXQoJzsnKTtcbiAgICAvLyB2YWx1ZS5zcGxpdCgnICcpO1xuICAgIGl0ZW1zLmZvckVhY2goaXRtID0+IHtcbiAgICAgIGlmICh0aGlzLnZhbGlkYXRlRW1haWwoKGl0bSB8fCAnJykudHJpbSgpKSkge1xuICAgICAgICBjb25zdCB4ID0gdGhpcy5zcGxpdHRlZENoaXBzKGZvcm0sIGZpZWxkTmFtZSk7XG4gICAgICAgIHgucHVzaChpdG0pO1xuICAgICAgICBmb3JtLmdldChmaWVsZE5hbWUpLnBhdGNoVmFsdWUoeC5qb2luKCc7JykpO1xuICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIGV4dHJhY3RKc29uRmllbGROYW1lKGRlZmF1bHRzOiBhbnksIHByb3BlcnR5OiBzdHJpbmcpIHtcbiAgICBjb25zdCB4PSB0aGlzLmV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIHByb3BlcnR5KTtcbiAgICBpZiAoeD8ubGVuZ3RoID4gMClcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHgpO1xuICAgIGVsc2UgcmV0dXJuICd7fSc7XG4gIH1cblxuICBnZXRPcHRpb25WYWx1ZShpdGVtOiBhbnkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyA/XG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXREZWZhdWx0TGFuZygpID09PSAnZW4nID8gaXRlbS5lbmdsaXNoTmFtZSA6IGl0ZW0uYXJhYmljTmFtZVxuICAgICAgICA6IGl0ZW07XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgZ2V0SHlwZXJUZXh0RXZlbnQoKSB7XG4gICAgdGhpcy5oeXBlclRleHRFdmVudC5lbWl0KHRydWUpO1xuICB9XG5cbiAgYWRkKGV2ZW50OiBNYXRDaGlwSW5wdXRFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5lcXVhdGlvbk9wZXJhdG9ycy5pbmNsdWRlcyh2YWx1ZSkgfHwgIXRoaXMuZXF1YXRpb25WYWx1ZXMoKS5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5lcXVhdGlvblZhbHVlcy51cGRhdGUoZXF1YXRpb25WYWx1ZXMgPT4gWy4uLmVxdWF0aW9uVmFsdWVzLCB2YWx1ZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZmllbGRzSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIHRoaXMuY3VycmVudEVxdWF0aW9uVmFsdWUuc2V0KCcnKTtcbiAgICB0aGlzLnVwZGF0ZUVxdWF0aW9uT3B0aW9ucygpO1xuXG4gIH1cblxuICByZW1vdmUoaXRlbTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcXVhdGlvblZhbHVlcy51cGRhdGUoZXF1YXRpb25WYWx1ZXMgPT4ge1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICByZXR1cm4gZXF1YXRpb25WYWx1ZXM7XG4gICAgICB9XG5cbiAgICAgIGVxdWF0aW9uVmFsdWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB0aGlzLmFubm91bmNlci5hbm5vdW5jZShgUmVtb3ZlZCAke2l0ZW19YCk7XG4gICAgICByZXR1cm4gWy4uLmVxdWF0aW9uVmFsdWVzXTtcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUVxdWF0aW9uT3B0aW9ucygpO1xuICB9XG5cbiAgc2VsZWN0ZWQoZXZlbnQ6IE1hdEF1dG9jb21wbGV0ZVNlbGVjdGVkRXZlbnQpOiB2b2lke1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSBldmVudC5vcHRpb24udmlld1ZhbHVlLnRyaW0oKTtcblxuICAgIGlmICghdGhpcy5lcXVhdGlvbk9wZXJhdG9ycy5pbmNsdWRlcyhzZWxlY3RlZFZhbHVlKSAmJiAhdGhpcy5lcXVhdGlvblZhbHVlcygpLmluY2x1ZGVzKHNlbGVjdGVkVmFsdWUpKSB7XG4gICAgICB0aGlzLmVxdWF0aW9uVmFsdWVzLnVwZGF0ZShlcXVhdGlvblZhbHVlcyA9PiBbLi4uZXF1YXRpb25WYWx1ZXMsIHNlbGVjdGVkVmFsdWVdKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZXF1YXRpb25PcGVyYXRvcnMuaW5jbHVkZXMoc2VsZWN0ZWRWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZXF1YXRpb25WYWx1ZXMudXBkYXRlKGVxdWF0aW9uVmFsdWVzID0+IFsuLi5lcXVhdGlvblZhbHVlcywgc2VsZWN0ZWRWYWx1ZV0pO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudEVxdWF0aW9uVmFsdWUuc2V0KCcnKTtcbiAgICBldmVudC5vcHRpb24uZGVzZWxlY3QoKTtcbiAgICB0aGlzLmZpZWxkc0lucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB0aGlzLnVwZGF0ZUVxdWF0aW9uT3B0aW9ucygpO1xuICB9XG5cbiAgdXBkYXRlRXF1YXRpb25PcHRpb25zKCl7XG4gICAgdGhpcy5yZWZsZWN0RXF1YXRpb25WYWx1ZU9uRm9ybSgpO1xuXG4gICAgbGV0IHVwZGF0ZWRGaWVsZHM6IHN0cmluZ1tdO1xuICAgIGlmICh0aGlzLmVxdWF0aW9uVmFsdWVzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB1cGRhdGVkRmllbGRzID0gdGhpcy5nZXROYW1lc0Zyb21TdWdnZXN0ZWRFcXVhdGlvbkZpZWxkcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbGFzdEVsZW1lbnQgPSB0aGlzLmVxdWF0aW9uVmFsdWVzKClbdGhpcy5lcXVhdGlvblZhbHVlcygpLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKHRoaXMuZXF1YXRpb25PcGVyYXRvcnMuaW5jbHVkZXMobGFzdEVsZW1lbnQpKSB7XG4gICAgICAgIHVwZGF0ZWRGaWVsZHMgPSB0aGlzLmdldE5hbWVzRnJvbVN1Z2dlc3RlZEVxdWF0aW9uRmllbGRzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGVkRmllbGRzID0gdGhpcy5lcXVhdGlvbk9wZXJhdG9ycztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJyoqKioqJywgdXBkYXRlZEZpZWxkcyk7XG4gICAgdGhpcy5hbGxFcXVhdGlvbkZpZWxkcy5uZXh0KHVwZGF0ZWRGaWVsZHMpO1xuICB9XG5cbiAgZ2V0TmFtZXNGcm9tU3VnZ2VzdGVkRXF1YXRpb25GaWVsZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmVxdWF0aW9uU3VnZ2VzdGVkRmllbGRzPy5tYXAoZmllbGQgPT4gZmllbGQubmFtZSk7XG4gIH1cblxuICByZWZsZWN0RXF1YXRpb25WYWx1ZU9uRm9ybSgpIHtcbiAgICBpZiAodGhpcy5mb3JtUGFyYW0gJiYgdGhpcy5mb3JtUGFyYW0uZ2V0KCdmaWVsZFZhbHVlJykpIHtcbiAgICAgIHRoaXMuZm9ybVBhcmFtLmdldCgnZmllbGRWYWx1ZScpLnNldFZhbHVlKHRoaXMuZXF1YXRpb25WYWx1ZXMoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdGb3JtIG9yIGZpZWxkVmFsdWUgaXMgbm90IGF2YWlsYWJsZS4nKTtcbiAgICB9XG4gIH1cblxuICBjaGVja0VxdWF0aW9uKGZpZWxkOiBGaWVsZEluZm8sICRldmVudDogRXZlbnQpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnJGV2ZW50JywgJGV2ZW50KTtcbiAgICAvLyB0cnkge1xuICAgIC8vICAgZXZhbHVhdGUoZXF1YXRpb24ucmVwbGFjZSgvW2EtekEtWjAtOV0rL2csICcxJykpOyAvLyBSZXBsYWNlIHZhcmlhYmxlcyB3aXRoIGR1bW15IHZhbHVlc1xuICAgIC8vICAgdGhpcy5mb3JtR3JvdXBzW2luZGV4XS5nZXQoJ3h5eicpLnNldEVycm9ycyhudWxsKTtcbiAgICAvLyAgIGNvbnNvbGUubG9nKCd2YWxpZCAnLCBlcXVhdGlvbilcbiAgICAvLyB9IGNhdGNoIChlKSB7XG4gICAgLy8gICB0aGlzLmZvcm1Hcm91cHNbaW5kZXhdLmdldCgneHl6Jykuc2V0RXJyb3JzKHtzZXJ2ZXJFcnJvcjogJ2luY29tcGxldGUgJ30pO1xuICAgIC8vICAgY29uc29sZS5sb2coJ2JhZCAnLCBlcXVhdGlvbilcbiAgICAvLyB9XG4gIH1cblxuICBnZXRWaWV3KGZpZWxkKTogJ21vbnRoJyB8ICd5ZWFyJyB8ICdtdWx0aS15ZWFyJyB7XG4gICAgcmV0dXJuIGZpZWxkLnBhdHRlcm4gfHwgJ21vbnRoJztcbiAgfVxuXG4gIHNldE1vbnRoQW5kWWVhcihub3JtYWxpemVkTW9udGhBbmRZZWFyOiBNb21lbnQsIHBpY2tlcjogTWF0RGF0ZXBpY2tlcjxNb21lbnQ+LCBmaWVsZCkge1xuICAgIGNvbnNvbGUubG9nKCdmaWVsZC5wYXR0ZXJuJywgZmllbGQucGF0dGVybilcbiAgICBpZiAoZmllbGQucGF0dGVybiA9PT0gJ211bHRpLXllYXInKSB7XG4gICAgICBjb25zb2xlLmxvZygnaGknKVxuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBGb3JtQ29udHJvbChtb21lbnQoKSk7XG4gICAgICBjb25zdCBjdHJsVmFsdWUgPSBkYXRlLnZhbHVlO1xuICAgICAgY3RybFZhbHVlLnllYXIobm9ybWFsaXplZE1vbnRoQW5kWWVhci55ZWFyKCkpO1xuICAgICAgY3RybFZhbHVlLm1vbnRoKDEpO1xuICAgICAgY3RybFZhbHVlLmRheU9mWWVhcigxKTtcbiAgICAgIHRoaXMuZm9ybVBhcmFtLmdldChmaWVsZC5wcm9wZXJ0eSkuc2V0VmFsdWUoY3RybFZhbHVlKVxuICAgICAgcGlja2VyLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QWNjZXB0ZWRGaWxlVHlwZXMoZmllbGQ6IEZpZWxkSW5mbyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFmaWVsZC5zdXBwb3J0ZWRUeXBlcykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gQ29udmVydCBcIi5qcGcsLnBuZywucGRmXCIgZm9ybWF0IHRvIFwiaW1hZ2UvanBlZyxpbWFnZS9wbmcsYXBwbGljYXRpb24vcGRmXCIgb3Iga2VlcCBhcyBpc1xuICAgIC8vIEZvciBzaW1wbGljaXR5LCB3ZSdsbCBwYXNzIHRoZSBzdXBwb3J0ZWRUeXBlcyBhcy1pcyBhbmQgbGV0IHRoZSBicm93c2VyIGhhbmRsZSBpdFxuICAgIC8vIFRoZSBicm93c2VyIGFjY2VwdHMgYm90aCBmb3JtYXRzXG4gICAgcmV0dXJuIGZpZWxkLnN1cHBvcnRlZFR5cGVzO1xuICB9XG5cbiAgb25BdHRhY2htZW50RmlsZVNlbGVjdGVkKGZpbGU6IEZpbGUgfCBudWxsLCBmaWVsZDogRmllbGRJbmZvKTogdm9pZCB7XG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIC8vIFZhbGlkYXRlIGZpbGUgdHlwZSBpZiBzdXBwb3J0ZWRUeXBlcyBpcyBzcGVjaWZpZWRcbiAgICAgIGlmIChmaWVsZC5zdXBwb3J0ZWRUeXBlcykge1xuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSBmaWVsZC5zdXBwb3J0ZWRUeXBlcy5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghYWxsb3dlZFR5cGVzLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgICAgLy8gRmlsZSB0eXBlIG5vdCBzdXBwb3J0ZWQgLSBjb3VsZCBzaG93IGVycm9yIG1lc3NhZ2VcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEZpbGUgdHlwZSAke2ZpbGVFeHRlbnNpb259IGlzIG5vdCBzdXBwb3J0ZWQuIEFsbG93ZWQgdHlwZXM6ICR7ZmllbGQuc3VwcG9ydGVkVHlwZXN9YCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgaWYgaXQgZXhpc3RzXG4gICAgICBpZiAodGhpcy5mb3JtUGFyYW0gJiYgdGhpcy5mb3JtUGFyYW0uZ2V0KGZpZWxkLnByb3BlcnR5KSkge1xuICAgICAgICB0aGlzLmZvcm1QYXJhbS5nZXQoZmllbGQucHJvcGVydHkpPy5zZXRWYWx1ZShmaWxlKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW1pdCBhdHRhY2htZW50IGV2ZW50XG4gICAgICB0aGlzLmF0dGFjaG1lbnRFbWl0dGVyLmVtaXQoe1xuICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICAgIGF0dGFjaG1lbnRUeXBlOiBmaWVsZC5hdHRhY2htZW50VHlwZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENsZWFyIHRoZSBmb3JtIGNvbnRyb2wgaWYgZmlsZSBpcyByZW1vdmVkXG4gICAgICBpZiAodGhpcy5mb3JtUGFyYW0gJiYgdGhpcy5mb3JtUGFyYW0uZ2V0KGZpZWxkLnByb3BlcnR5KSkge1xuICAgICAgICB0aGlzLmZvcm1QYXJhbS5nZXQoZmllbGQucHJvcGVydHkpPy5zZXRWYWx1ZShudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtYWluLWZvcm0tY2FudmFzXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLXdyYXBwZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGVmYXVsdHNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZTsgZWxzZSByZWFkb25seVZpZXdcIiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCI+XG4gICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVBhcmFtXCIgY2xhc3M9XCJmb3JtLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbHVtblwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByb3cgb2Ygc2NyZWVuRmllbGRzIHwga2V5dmFsdWVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZmllbGQgb2Ygcm93LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb2x1bW5cIiBbc3R5bGUuZmxleF09XCJmaWVsZC5maWVsZFNpemUgPyAoJzAgMCAnICsgZmllbGQuZmllbGRTaXplICsgJyUnKSA6ICcxIDEgMCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJmaWVsZC50eXBlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1hbmQtYXN0ZXJpc2stY29udGFpbmVyXCI+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cbiAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+ICogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsICYmICFmaWVsZC5yZWFkb25seVwiIGNsYXNzPVwib3B0aW9uYWwtdGV4dFwiPiB7eyAnb3B0aW9uYWwnIHwgdHJhbnNsYXRlIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJtaW5EYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cImZvcm1QYXJhbS5nZXQoZmllbGQucHJvcGVydHkpLnNldFZhbHVlKCRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyID8gKGxhYmVsS2V5UGxhY2VIb2xkZXIoZmllbGQpIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJmaWVsZC5yZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJmaWVsZC5yZWFkb25seSA/IC0xIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7e2ZpZWxkLnByb3BlcnR5fX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGZpZWxkLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSAqbmdJZj1cIiFmaWVsZC5yZWFkb25seVwiIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RhcnRWaWV3XT1cImdldFZpZXcoZmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh5ZWFyU2VsZWN0ZWQpPVwic2V0TW9udGhBbmRZZWFyKCRldmVudCwgcGlja2VyLCBmaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxDbGFzcz1cImV4YW1wbGUtbW9udGgtcGlja2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWRhdGVwaWNrZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3Bob25lLW51bWJlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBjbGFzcz1cImN1c3RvbS1uZ3gtbWF0LWludGwtdGVsLWlucHV0XCIgKm5nSWY9XCJ3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbCAmJiAhZmllbGQucmVhZG9ubHlcIiBjbGFzcz1cIm9wdGlvbmFsLXRleHRcIj4ge3sgJ29wdGlvbmFsJyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGhvbmUtaW5wdXQtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZ3gtbWF0LWludGwtdGVsLWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRQbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciA/IChsYWJlbEtleVBsYWNlSG9sZGVyKGZpZWxkKSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcHJlZmVycmVkQ291bnRyaWVzXT1cIlsncWEnXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW5hYmxlUGxhY2Vob2xkZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW5hYmxlU2VhcmNoXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29ubHlDb3VudHJpZXNdPVwiZ2V0Q291bnRyeUNvZGVMaXN0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgZmllbGQucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25neC1tYXQtaW50bC10ZWwtaW5wdXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2liYW4tdGV4dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRleHRSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbCAmJiAhZmllbGQucmVhZG9ubHlcIiBjbGFzcz1cIm9wdGlvbmFsLXRleHRcIj4ge3sgJ29wdGlvbmFsJyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhcHAtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciA/IChsYWJlbEtleVBsYWNlSG9sZGVyKGZpZWxkKSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZmllbGQucmVhZG9ubHkgPyAtMSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgZmllbGQucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGFzc3dvcmQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1hbmQtYXN0ZXJpc2stY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cImN1c3RvbS1sYWJlbFwiIGlkPVwibGFiZWwte3tmaWVsZC5wcm9wZXJ0eX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFwcC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImhpZGUgJiYgIWZpZWxkLmRpc2FibGVkID8gJ3Bhc3N3b3JkJyA6ICd0ZXh0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJmaWVsZC5yZWFkb25seSA/IC0xIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgPyAobGFiZWxLZXlQbGFjZUhvbGRlcihmaWVsZCkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBmaWVsZC5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhpZGUgPSAhaGlkZVwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhpZGUgPyAndmlzaWJpbGl0eV9vZmYnIDogJ3Zpc2liaWxpdHknIH19LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWljb24+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhd29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZXh0UmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWwgJiYgIWZpZWxkLnJlYWRvbmx5XCIgY2xhc3M9XCJvcHRpb25hbC10ZXh0XCI+IHt7ICdvcHRpb25hbCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZmllbGQuc2hvd1NlYXJjaEljb25cIiBtYXRQcmVmaXg+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYXBwLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgPyAobGFiZWxLZXlQbGFjZUhvbGRlcihmaWVsZCkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZpZWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImZpZWxkLnJlYWRvbmx5ID8gLTEgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwiZml4QXJhYmljTnVtYmVycygkZXZlbnQudGFyZ2V0KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhEaWdpdHNdPVwiZmllbGQubWF4TGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwaG9uZU51bWJlck9ubHldPVwiZmllbGQucGhvbmVOdW1iZXJPbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGZpZWxkLnByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJmaWVsZC5zaG93U2VhcmNoSWNvbiAmJiAhZmllbGQucmVhZG9ubHkgJiYgKGZvcm1QYXJhbT8uZ2V0KFtmaWVsZC5wcm9wZXJ0eV0pPy52YWx1ZSA/PyAnJykgIT09ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNsZWFyLWljb24tc3VmZml4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY2xlYXItaWNvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQkFTRV9UQUJMRS5jbGVhckZpZWxkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJGaWVsZFZhbHVlKGZpZWxkLnByb3BlcnR5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aS1zdGF0ZS1jaGVja2JveCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdWx0aS1zdGF0ZS1maWx0ZXJcIiBbZm9ybUdyb3VwXT1cImZvcm1QYXJhbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtdWx0aS1zdGF0ZS1maWx0ZXJfX3RyaWdnZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJzdGF0dXNNdWx0aU1lbnVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJmaWVsZC5wbGFjZWhvbGRlciA/IChsYWJlbEtleVBsYWNlSG9sZGVyKGZpZWxkKSB8IHRyYW5zbGF0ZSkgOiAoZmllbGQubGFiZWwgfCB0cmFuc2xhdGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXVsdGktc3RhdGUtZmlsdGVyX190cmlnZ2VyLXRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm11bHRpLXN0YXRlLWZpbHRlcl9fdHJpZ2dlci10ZXh0LS1wbGFjZWhvbGRlcl09XCJpc011bHRpU3RhdGVFbXB0eShmaWVsZC5wcm9wZXJ0eSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE11bHRpU3RhdGVGaWx0ZXJUcmlnZ2VyTGFiZWwoZmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGZpZWxkLnBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChsYWJlbEtleVBsYWNlSG9sZGVyKGZpZWxkKSB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCdGSUxURVItQlVJTERFUi5zZWxlY3RTdGF0dXMnIHwgdHJhbnNsYXRlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm11bHRpLXN0YXRlLWZpbHRlcl9fY2hldnJvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1tZW51ICNzdGF0dXNNdWx0aU1lbnU9XCJtYXRNZW51XCIgY2xhc3M9XCJtdWx0aS1zdGF0ZS1maWx0ZXJfX21lbnUtcGFuZWxcIiBbaGFzQmFja2Ryb3BdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXVsdGktc3RhdGUtZmlsdGVyX19tZW51LWlubmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25NdWx0aVN0YXRlTWVudUlubmVyS2V5ZG93bigkZXZlbnQsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29kZSBvZiBmaWVsZC5saXN0T3B0aW9ucyB8fCBbXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtdWx0aS1zdGF0ZS1maWx0ZXJfX3Jvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtbXVsdGktc3RhdGUtY29kZV09XCJjb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uTXVsdGlTdGF0ZVJvd0NsaWNrKCRldmVudCwgZmllbGQucHJvcGVydHksIGNvZGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc011bHRpU3RhdGVTZWxlY3RlZChmaWVsZC5wcm9wZXJ0eSwgY29kZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlTXVsdGlTdGF0ZUZpbHRlcihmaWVsZC5wcm9wZXJ0eSwgY29kZSwgJGV2ZW50LmNoZWNrZWQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXVsdGktc3RhdGUtZmlsdGVyX19waWxsIHN0YXRlVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29kZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHN0YXR1c09wdGlvbkxhYmVsS2V5KGZpZWxkLCBjb2RlKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hpcC1saXN0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+ICogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtZ3JpZCBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBmaWVsZC5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBmaWVsZC5wcm9wZXJ0eSB9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtcm93XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG1haWwgb2Ygc3BsaXR0ZWRDaGlwcyhmb3JtUGFyYW0sIGZpZWxkLnByb3BlcnR5KTsgbGV0IGlkeCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVtb3ZhYmxlXT1cInJlbW92YWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWQpPVwicmVtb3ZlQ2hpcHNJdGVtKGZvcm1QYXJhbSwgZmllbGQucHJvcGVydHksIGlkeClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtYWlsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIG1hdENoaXBSZW1vdmUgKm5nSWY9XCJyZW1vdmFibGVcIj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLXJvdz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgZmllbGQucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEZvcl09XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRTZXBhcmF0b3JLZXlDb2Rlc109XCJzZXBhcmF0b3JLZXlzQ29kZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdENoaXBJbnB1dEFkZE9uQmx1cl09XCJhZGRPbkJsdXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImFkZEVtYWlsVG9DaGlwcygkZXZlbnQsIGZvcm1QYXJhbSwgZmllbGQucHJvcGVydHkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWdyaWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIiAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidhbW91bnQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhd29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJhbW91bnRSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbCAmJiAhZmllbGQucmVhZG9ubHlcIiBjbGFzcz1cIm9wdGlvbmFsLXRleHRcIj4ge3sgJ29wdGlvbmFsJyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhcHAtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyID8gKGxhYmVsS2V5UGxhY2VIb2xkZXIoZmllbGQpIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJmaWVsZC5yZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJmaWVsZC5yZWFkb25seSA/IC0xIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBmaWVsZC5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSkgPyAnZXJyb3ItJyArIGZpZWxkLnByb3BlcnR5IDogbnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzZXF1ZW5jZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVmZXJlbmNlQXR0cmlidXRlVHJ1ZShmaWVsZC5wcm9wZXJ0eSwgJ2F1dG9HZW5lcmF0ZWQnKTsgZWxzZSBub1NlcXVlbmNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZpZWxkLnJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImFwcC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyID8gKGxhYmVsS2V5UGxhY2VIb2xkZXIoZmllbGQpIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCInbGFiZWwtJyArIGZpZWxkLnByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vU2VxdWVuY2U+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYWJlbC1hbmQtYXN0ZXJpc2stY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cImN1c3RvbS1sYWJlbFwiIGlkPVwibGFiZWwte3tmaWVsZC5wcm9wZXJ0eX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWRcIiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+ICogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiYXBwLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgPyAobGFiZWxLZXlQbGFjZUhvbGRlcihmaWVsZCkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBmaWVsZC5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0YXJlYSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRleHRhcmVhUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWwgJiYgIWZpZWxkLnJlYWRvbmx5XCIgY2xhc3M9XCJvcHRpb25hbC10ZXh0XCI+IHt7ICdvcHRpb25hbCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjZGtGb2N1c0luaXRpYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGtUZXh0YXJlYUF1dG9zaXplXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RrQXV0b3NpemVNaW5Sb3dzPVwiM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyID8gKGxhYmVsS2V5UGxhY2VIb2xkZXIoZmllbGQpIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBmaWVsZC5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heERpZ2l0c109XCJmaWVsZC5tYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLm1heGxlbmd0aF09XCJmaWVsZC5tYXhMZW5ndGggfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImZpZWxkLnJlYWRvbmx5ID8gLTEgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJmaWVsZC5tYXhMZW5ndGhcIiBhbGlnbj1cImVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEZpZWxkQ3VycmVudExlbmd0aChmaWVsZC5wcm9wZXJ0eSkgfX0ve3sgZmllbGQubWF4TGVuZ3RoIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1iZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhd29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJudW1iZXJSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbCAmJiAhZmllbGQucmVhZG9ubHlcIiBjbGFzcz1cIm9wdGlvbmFsLXRleHRcIj4ge3sgJ29wdGlvbmFsJyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhcHAtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIubWluXT1cImZpZWxkLmFsbG93TmVnYXRpdmUgPyBudWxsIDogMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJibG9ja05lZ2F0aXZlTnVtYmVyS2V5ZG93bigkZXZlbnQsIGZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgPyAobGFiZWxLZXlQbGFjZUhvbGRlcihmaWVsZCkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgZmllbGQucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4RGlnaXRzXT1cImZpZWxkLm1heExlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSkgPyAnZXJyb3ItJyArIGZpZWxkLnByb3BlcnR5IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVhZG9ubHkgPyBmYWxzZSA6IGZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJmaWVsZC5yZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJmaWVsZC5yZWFkb25seSA/IC0xIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJmaWVsZC5wYXR0ZXJuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2JpZ2RlY2ltYWwnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhd29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJudW1iZXJSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbCAmJiAhZmllbGQucmVhZG9ubHlcIiBjbGFzcz1cIm9wdGlvbmFsLXRleHRcIj4ge3sgJ29wdGlvbmFsJyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dG1vZGU9XCJudW1lcmljXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyID8gKGxhYmVsS2V5UGxhY2VIb2xkZXIoZmllbGQpIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBmaWVsZC5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtudW1iZXJzT25seV09XCJ0cnVlXCIgIFttYXhEZWNpbWFsc109XCJmaWVsZC5tYXhEZWNpbWFsc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heERpZ2l0c109XCJmaWVsZC5tYXhMZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXR0ZXJuXT1cImZpZWxkLnBhdHRlcm5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVhZG9ubHkgPyBmYWxzZSA6IGZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImZpZWxkLnJlYWRvbmx5ID8gLTEgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RpbWUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhd29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0aW1lUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwiY3VzdG9tLWxhYmVsXCIgaWQ9XCJsYWJlbC17e2ZpZWxkLnByb3BlcnR5fX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWwgJiYgIWZpZWxkLnJlYWRvbmx5XCIgY2xhc3M9XCJvcHRpb25hbC10ZXh0XCI+IHt7ICdvcHRpb25hbCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3RpbWVJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcHAtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGltZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyID8gKGxhYmVsS2V5UGxhY2VIb2xkZXIoZmllbGQpIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImZpZWxkLnJlYWRvbmx5ID8gLTEgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBmaWVsZC5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQucmVhZG9ubHlcIiBtYXRTdWZmaXggY2xhc3M9XCJtYXQtZGF0ZXBpY2tlci10b2dnbGUgdGltZS1waWNrZXItdG9nZ2xlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGltZS1waWNrZXItdG9nZ2xlLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblRpbWVQaWNrZXIodGltZUlucHV0KTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+c2NoZWR1bGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjaGVja2JveCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNoZWNrYm94UmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZy1ib3R0b206IDE0cHg7IHBhZGRpbmctdG9wOiAxNHB4O1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5yZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgZmllbGQucHJvcGVydHkgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndG9nZ2xlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXdvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidG9nZ2xlUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbFwiIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4gKiA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWZpZWxkLnJlcXVpcmVkICYmICFmaWVsZC5oaWRlTGFiZWwgJiYgIWZpZWxkLnJlYWRvbmx5XCIgY2xhc3M9XCJvcHRpb25hbC10ZXh0XCI+IHt7ICdvcHRpb25hbCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ2xhYmVsLScgKyBmaWVsZC5wcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KSA/ICdlcnJvci0nICsgZmllbGQucHJvcGVydHkgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgZmllbGQucHJvcGVydHkgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlcnJvci17eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBnZXRFcnJvcnMoZmllbGQucHJvcGVydHkpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NvbG9yLXBpY2tlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbi1yaWdodDogMTBweFwiPnt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fTwvaDQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWpzLWNvbG9ycGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiY29sb3JwaWNrZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBmaWVsZC5wcm9wZXJ0eSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncmFkaW8tYnV0dG9uJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXdvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwicmFkaW9CdXR0b25SZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1ncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7e2ZpZWxkLnByb3BlcnR5fX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFwcC1yYWRpb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJmaWVsZC5yZXF1aXJlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXN0b20tbGFiZWxcIj57eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tZ3JvdXAtY3VzdG9tXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBmaWVsZC5saXN0T3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIm9wdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidsaXN0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXdvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibGlzdFJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbCAmJiAhZmllbGQucmVhZG9ubHlcIiBjbGFzcz1cIm9wdGlvbmFsLXRleHRcIj4ge3sgJ29wdGlvbmFsJyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7e2ZpZWxkLnByb3BlcnR5fX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXIgPyAobGFiZWxLZXlQbGFjZUhvbGRlcihmaWVsZCkgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSkgPyAnZXJyb3ItJyArIGZpZWxkLnByb3BlcnR5IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZpZWxkLnJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiZmllbGQubXVsdGkgfHwgZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJmaWVsZC5yZWFkb25seSA/IGZhbHNlIDogZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsodmFsdWUpXT1cImZpZWxkLmRlZmF1bHRMaXN0T3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLnRyYW5zbGF0ZTsgZWxzZSBsb29rdXBfbm9fdHJhbnNsYXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpZWxkLmxpc3RPcHRpb25zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZnJpZW5kbHlOYW1lKGZpZWxkLmxhYmVsLCBmaWVsZC5wcm9wZXJ0eSwgaXRlbSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvb2t1cF9ub190cmFuc2xhdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpZWxkLmxpc3RPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0T3B0aW9uVmFsdWUoaXRlbSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidhdHRhY2htZW50J1wiIFtmb3JtR3JvdXBdPVwiZm9ybVBhcmFtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cImN1c3RvbS1sYWJlbFwiIGlkPVwibGFiZWwte3tmaWVsZC5wcm9wZXJ0eX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQubGFiZWwhIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbCAmJiAhZmllbGQucmVhZG9ubHlcIiBjbGFzcz1cIm9wdGlvbmFsLXRleHRcIj4ge3sgJ29wdGlvbmFsJyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtYXR0YWNobWVudC11cGxvYWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0ZWRUeXBlc109XCJnZXRBY2NlcHRlZEZpbGVUeXBlcyhmaWVsZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXJpYURlc2NyaWJlZEJ5XT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSkgPyAnZXJyb3ItJyArIGZpZWxkLnByb3BlcnR5IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlU2VsZWN0ZWQpPVwib25BdHRhY2htZW50RmlsZVNlbGVjdGVkKCRldmVudCwgZmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOiA1cHhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWF0dGFjaG1lbnQtdXBsb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciBjbGFzcz1cImlxLWVycm9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbG9va3VwJ1wiIFtmb3JtR3JvdXBdPVwiZm9ybVBhcmFtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhd29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJsb29rdXBSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1hdXRvLWNvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cImZvcm1QYXJhbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaWVsZF09XCJmaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdXBwb3J0aW5nQXR0cmlidXRlc109XCJzdXBwb3J0aW5nQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwidGhpcy5mb3JtUGFyYW0uZ2V0KGZpZWxkLnByb3BlcnR5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRWYWx1ZSk9XCJwYXRjaExvb2t1cFZhbHVlKCRldmVudCwgZmllbGQucHJvcGVydHkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImVycm9yLXt7IGZpZWxkLnByb3BlcnR5IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC1hdXRvLWNvbXBsZXRlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidjdXJyZW5jeSdcIiBbZm9ybUdyb3VwXT1cImZvcm1QYXJhbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXdvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VycmVuY3lSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBVbmNvbW1lbnQgYW5kIHVzZSB0aGUgY3VycmVuY3kgY29udHJvbCB3aGVuIHJlYWR5IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YXBwLWN1cnJlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtUGFyYW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0VmFsdWVdPVwidGhpcy5mb3JtUGFyYW0uZ2V0KGZpZWxkLnByb3BlcnR5KT8udmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkVmFsdWUpPVwicGF0Y2hDdXJyZW5jeVZhbHVlKCRldmVudCwgZmllbGQucHJvcGVydHkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FwcC1jdXJyZW5jeT4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aS1zZWxlY3QnXCIgW2Zvcm1Hcm91cF09XCJmb3JtUGFyYW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm11bHRpU2VsZWN0UmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIndvcmtmbG93RWRpdGFibGVGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtbXVsdGktYXV0by1jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJmb3JtUGFyYW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRdPVwiZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxzU2VjdGlvbl09XCJwYWdlSW5mby5sYWJlbHNTZWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRWYWx1ZV09XCJnZXRNdWx0aVZhbHVlKGZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFZhbHVlKT1cInBhdGNoTXVsdGlTZWxlY3RWYWx1ZSgkZXZlbnQsIGZpZWxkLnByb3BlcnR5KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtbXVsdGktYXV0by1jb21wbGV0ZT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidyaWNoLXRleHQnXCIgW2Zvcm1Hcm91cF09XCJmb3JtUGFyYW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBVbmNvbW1lbnQgYW5kIHVzZSB0aGUgcmljaCB0ZXh0IGVkaXRvciB3aGVuIHJlYWR5IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGNrZWRpdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VkaXRvcl09XCJFZGl0b3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWVsZC5yZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3tmaWVsZC5wcm9wZXJ0eX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ja2VkaXRvcj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkaXZpZGVyJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaHlwZXItdGV4dCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0SHlwZXJUZXh0RXZlbnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImh5cGVyLWxpbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VjdGlvbi10aXRsZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhyZGl2aWRlci1taWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZXF1YXRpb24tYnVpbGRlcidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dGaWVsZChkZWZhdWx0cywgZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRleHRSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFiZWwtYW5kLWFzdGVyaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJjdXN0b20tbGFiZWxcIiBpZD1cImxhYmVsLXt7ZmllbGQucHJvcGVydHl9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZmllbGQucmVxdWlyZWQgJiYgIWZpZWxkLmhpZGVMYWJlbCAmJiAhZmllbGQucmVhZG9ubHlcIiBjbGFzcz1cIm9wdGlvbmFsLXRleHRcIj4ge3sgJ29wdGlvbmFsJyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJhcHAtaW5wdXRcIiBkaXI9XCJsdHJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlciA/IChsYWJlbEtleVBsYWNlSG9sZGVyKGZpZWxkKSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmllbGQucmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZmllbGQucmVhZG9ubHkgPyAtMSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImZpZWxkLnJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiZmllbGQucmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cInNob3dFcnJvcihmaWVsZC5wcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIidsYWJlbC0nICsgZmllbGQucHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZXF1YXRpb24tYnVpbGRlcidcIiBbZm9ybUdyb3VwXT1cImZvcm1QYXJhbVwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93RmllbGQoZGVmYXVsdHMsIGZpZWxkKVwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3b3JrZmxvd0VkaXRhYmxlRmllbGQoZmllbGQpXCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJkYXRlUmVhZG9ubHlcIi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwid29ya2Zsb3dFZGl0YWJsZUZpZWxkKGZpZWxkKVwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgd2lkdGg6IDM1MCVcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPnt7IGZpZWxkLmxhYmVsISB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBzdHlsZT1cIndpZHRoOiA0MDAlXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1ncmlkICNjaGlwR3JpZD4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZXF1YXRpb25WYWx1ZSBvZiBlcXVhdGlvblZhbHVlcygpOyBsZXQgaSA9IGluZGV4XCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLXJvdyAocmVtb3ZlZCk9XCJyZW1vdmUoZXF1YXRpb25WYWx1ZSwgaSlcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGVxdWF0aW9uVmFsdWUgfX0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Q2hpcFJlbW92ZS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidyZW1vdmUgJyArIGVxdWF0aW9uVmFsdWVcIj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLXJvdz4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWdyaWQ+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjdXJyZW50RXF1YXRpb25WYWx1ZVwiLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcEdyaWRcIi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwieyBzdGFuZGFsb25lOiB0cnVlIH1cIi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXNdPVwic2VwYXJhdG9yS2V5c0NvZGVzXCItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdENoaXBJbnB1dFRva2VuRW5kKT1cImFkZCgkZXZlbnQpXCItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkFkZCBlcXVhdGlvbiB2YWx1ZVwiIC8+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWF1dG9jb21wbGV0ZSAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiIChvcHRpb25TZWxlY3RlZCk9XCJzZWxlY3RlZCgkZXZlbnQpXCI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGZpbHRlcmVkRmllbGQgb2YgKGVxdWF0aW9uRmlsdGVyZWRGaWVsZHMoKSB8IGFzeW5jKVwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJmaWx0ZXJlZEZpZWxkXCI+e3sgZmlsdGVyZWRGaWVsZCB9fTwvbWF0LW9wdGlvbj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgY2xhc3M9XCJpcS1lcnJvclwiICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiIGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiPi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9ycyhmaWVsZC5wcm9wZXJ0eSkgfCB0cmFuc2xhdGUgfX0tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+LS0+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjZGF0ZVJlYWRvbmx5IGxldC1maWVsZD1cImZpZWxkXCI+XG4gIDxkaXYgY2xhc3M9XCJyZWFkb25seS1pdGVtXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwicmVhZG9ubHktbGFiZWxcIiBbaW5uZXJIdG1sXT1cIiFmaWVsZC5oaWRlTGFiZWwgPyAoZmllbGQubGFiZWwgfCB0cmFuc2xhdGUpIDogJydcIj48L2xhYmVsPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1JlYWRvbmx5VGV4dFZhbHVlRW1wdHkoZGVmYXVsdHMsIGZpZWxkKSAmJiBmaWVsZC5lbXB0eVJlYWRvbmx5UGxhY2Vob2xkZXJLZXk7IGVsc2UgZGF0ZVJlYWRvbmx5SGFzVmFsdWVcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmFsdWUgcmVhZG9ubHktdmFsdWUtLWVtcHR5XCI+e3sgZmllbGQuZW1wdHlSZWFkb25seVBsYWNlaG9sZGVyS2V5IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVJlYWRvbmx5SGFzVmFsdWU+XG4gICAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlXCI+e3sgZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpIHwgZGF0ZTogZ2V0UmVhZG9ubHlEYXRlRm9ybWF0KGZpZWxkKSB9fTwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGltZVJlYWRvbmx5IGxldC1maWVsZD1cImZpZWxkXCI+XG4gIDxkaXYgY2xhc3M9XCJyZWFkb25seS1pdGVtXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwicmVhZG9ubHktbGFiZWxcIiBbaW5uZXJIdG1sXT1cIiFmaWVsZC5oaWRlTGFiZWwgPyAoZmllbGQubGFiZWwgfCB0cmFuc2xhdGUpIDogJydcIj48L2xhYmVsPlxuICAgIDxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmFsdWVcIj57eyBmb3JtYXRUaW1lVG9EYXRlKGRlZmF1bHRzW2ZpZWxkLnByb3BlcnR5XSkgfCBkYXRlOiAnc2hvcnRUaW1lJyB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Bob25lTnVtYmVyUmVhZG9ubHkgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LWl0ZW1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPnt7IGV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KSB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RleHRSZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgW2lubmVySHRtbF09XCIhZmllbGQuaGlkZUxhYmVsID8gKGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlKSA6ICcnXCIgKm5nSWY9XCIhZmllbGQuYWR2YW5jZWRGaWx0ZXJcIj48L2xhYmVsPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1JlYWRvbmx5VGV4dFZhbHVlRW1wdHkoZGVmYXVsdHMsIGZpZWxkKSAmJiBmaWVsZC5lbXB0eVJlYWRvbmx5UGxhY2Vob2xkZXJLZXk7IGVsc2UgdGV4dFJlYWRvbmx5SGFzVmFsdWVcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmFsdWUgcmVhZG9ubHktdmFsdWUtLWVtcHR5XCI+e3sgZmllbGQuZW1wdHlSZWFkb25seVBsYWNlaG9sZGVyS2V5IHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjdGV4dFJlYWRvbmx5SGFzVmFsdWU+XG4gICAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlXCI+e3sgZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpIH19PC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0ZXh0YXJlYVJlYWRvbmx5IGxldC1maWVsZD1cImZpZWxkXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC50ZXh0Rm9ybWF0ID09PSAnanNvbic7IGVsc2Ugbm9ybWFsVGV4dFwiPlxuICAgIDxkaXYgY2xhc3M9XCJyZWFkb25seS1pdGVtXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktdmFsdWUganNvbi12aWV3ZXJcIj5cbiAgICAgICAgPG5neC1qc29uLXZpZXdlciBbanNvbl09XCJleHRyYWN0SnNvbkZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpXCIgW2V4cGFuZGVkXT1cInRydWVcIj48L25neC1qc29uLXZpZXdlcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPG5nLXRlbXBsYXRlICNub3JtYWxUZXh0PlxuICAgIDxkaXYgY2xhc3M9XCJyZWFkb25seS1pdGVtXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlXCI+e3sgZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNudW1iZXJSZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgW2lubmVySHRtbF09XCIhZmllbGQuaGlkZUxhYmVsID8gKGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlKSA6ICcnXCI+PC9sYWJlbD5cbiAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlXCI+e3sgZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpIH19PC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY3VycmVuY3lSZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgW2lubmVySHRtbF09XCIhZmllbGQuaGlkZUxhYmVsID8gKGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlKSA6ICcnXCI+PC9sYWJlbD5cbiAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlXCI+e3sgZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpIH19PC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmFkaW9CdXR0b25SZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgW2lubmVySHRtbF09XCIhZmllbGQuaGlkZUxhYmVsID8gKGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlKSA6ICcnXCI+PC9sYWJlbD5cbiAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlXCI+e3sgdHJhbnNsYXRlTGFibGUoZGVmYXVsdHNbZmllbGQucHJvcGVydHldKSB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3JpY2hUZXh0UmVhZG9ubHkgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LWl0ZW1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiIFtpbm5lckh0bWxdPVwiZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpXCI+PC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY2hlY2tib3hSZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgW2lubmVySHRtbF09XCIhZmllbGQuaGlkZUxhYmVsID8gKGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlKSA6ICcnXCI+PC9sYWJlbD5cbiAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlXCI+XG4gICAgICA8bWF0LWljb24gY29sb3I9XCJ3YXJuXCIgKm5nSWY9XCJleHRyYWN0RmllbGROYW1lKGRlZmF1bHRzLCBmaWVsZC5wcm9wZXJ0eSk7IGVsc2Ugc2hvd05vXCI+ZG9uZTwvbWF0LWljb24+XG4gICAgICA8bmctdGVtcGxhdGUgI3Nob3dObz5cbiAgICAgICAgPG1hdC1pY29uIGNvbG9yPVwid2FyblwiPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdG9nZ2xlUmVhZG9ubHkgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LWl0ZW1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPlxuICAgICAgPG1hdC1pY29uIGNvbG9yPVwid2FyblwiICpuZ0lmPVwiZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpOyBlbHNlIHNob3dOb1wiPmRvbmU8L21hdC1pY29uPlxuICAgICAgPG5nLXRlbXBsYXRlICNzaG93Tm8+XG4gICAgICAgIDxtYXQtaWNvbiBjb2xvcj1cIndhcm5cIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xpc3RSZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgW2lubmVySHRtbF09XCIhZmllbGQuaGlkZUxhYmVsID8gKGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlKSA6ICcnXCI+PC9sYWJlbD5cbiAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlXCIgKm5nSWY9XCJmaWVsZC50cmFuc2xhdGU7IGVsc2Ugbm9UcmFuc2xhdGVcIj5cbiAgICAgIHt7IGxpc3RTaG93VmFsdWUoZGVmYXVsdHMsIGZpZWxkKSB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvc3Bhbj5cbiAgICA8bmctdGVtcGxhdGUgI25vVHJhbnNsYXRlPlxuICAgICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPnt7IGV4dHJhY3RGaWVsZE5hbWUoZGVmYXVsdHMsIGZpZWxkLnByb3BlcnR5KSB9fTwvc3Bhbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2VxdWVuY2VSZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgW2lubmVySHRtbF09XCIhZmllbGQuaGlkZUxhYmVsID8gKGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlKSA6ICcnXCI+PC9sYWJlbD5cbiAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlXCI+e3sgZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpIH19PC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbG9va3VwUmVhZG9ubHkgbGV0LWZpZWxkPVwiZmllbGRcIj5cbiAgPGRpdiBjbGFzcz1cInJlYWRvbmx5LWl0ZW1cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJyZWFkb25seS1sYWJlbFwiIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvbGFiZWw+XG4gICAgPHNwYW4gY2xhc3M9XCJyZWFkb25seS12YWx1ZVwiPlxuICAgICAge3sgZXh0cmFjdEZpZWxkTmFtZShkZWZhdWx0cywgZmllbGQucHJvcGVydHkpPy5bdHJhbnNsYXRlU2VydmljZS5nZXREZWZhdWx0TGFuZygpID09PSAnZW4nID8gJ2VuZ2xpc2hOYW1lJyA6ICdhcmFiaWNOYW1lJ10gfX1cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhbW91bnRSZWFkb25seSBsZXQtZmllbGQ9XCJmaWVsZFwiPlxuICA8ZGl2IGNsYXNzPVwicmVhZG9ubHktaXRlbVwiPlxuICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgW2lubmVySHRtbF09XCIhZmllbGQuaGlkZUxhYmVsID8gKGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlKSA6ICcnXCI+PC9sYWJlbD5cbiAgICA8c3BhbiBjbGFzcz1cInJlYWRvbmx5LXZhbHVlXCI+XG4gICAgICB7eyBleHRyYWN0RmllbGROYW1lKGRlZmF1bHRzLCBmaWVsZC5wcm9wZXJ0eSkgfCBjdXJyZW5jeTogY3VycmVuY3kgfX1cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtdWx0aVNlbGVjdFJlYWRvbmx5IGxldC1maWVsZD1cImZpZWxkXCI+XG4gIDxkaXYgY2xhc3M9XCJyZWFkb25seS1pdGVtXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwicmVhZG9ubHktbGFiZWxcIiBbaW5uZXJIdG1sXT1cIiFmaWVsZC5oaWRlTGFiZWwgPyAoZmllbGQubGFiZWwgfCB0cmFuc2xhdGUpIDogJydcIj48L2xhYmVsPlxuICAgIDxtYXQtY2hpcC1ncmlkIGNsYXNzPVwicmVhZG9ubHktdmFsdWUgY2hpcExpc3RcIj5cbiAgICAgIDxtYXQtY2hpcCAqbmdGb3I9XCJsZXQgZmlsZWRQcm9wIG9mIHNob3dNdWx0aVNlbGVjdFZhbHVlc0FzUmVhZG9ubHkoZmllbGQpXCI+XG4gICAgICAgIHt7IGZpbGVkUHJvcCB9fVxuICAgICAgPC9tYXQtY2hpcD5cbiAgICA8L21hdC1jaGlwLWdyaWQ+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjaGlwTGlzdFJlYWRvbmx5IGxldC1maWVsZD1cImZpZWxkXCI+XG4gIDxkaXYgY2xhc3M9XCJyZWFkb25seS1pdGVtXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwicmVhZG9ubHktbGFiZWxcIiBbaW5uZXJIVE1MXT1cImZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlXCI+PC9sYWJlbD5cbiAgICA8bWF0LWNoaXAtbGlzdGJveCBjbGFzcz1cInJlYWRvbmx5LXZhbHVlIGNoaXBMaXN0XCI+XG4gICAgICA8bWF0LWNoaXAtb3B0aW9uICpuZ0Zvcj1cImxldCBsb2Mgb2Ygc3BsaXRSZWFkb25seShleHRyYWN0RmllbGROYW1lKGRlZmF1bHRzLCBmaWVsZC5wcm9wZXJ0eSkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwiZmFsc2VcIj5cbiAgICAgICAge3sgbG9jIH19XG4gICAgICA8L21hdC1jaGlwLW9wdGlvbj5cbiAgICA8L21hdC1jaGlwLWxpc3Rib3g+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuXG48bmctdGVtcGxhdGUgI3JlYWRvbmx5Vmlldz5cbiAgPGRpdiBjbGFzcz1cInJvdy13cmFwcGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbi13cmFwcGVyXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByb3cgb2Ygc2NyZWVuRmllbGRzIHwga2V5dmFsdWVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdy1jb250YWluZXJcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiByb3cudmFsdWVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1jb2x1bW4gcmVhZG9ubHktaXRlbVwiIFtzdHlsZS5mbGV4XT1cImZpZWxkLmZpZWxkU2l6ZSA/ICgnMCAwICcgKyBmaWVsZC5maWVsZFNpemUgKyAnJScpIDogJzEgMSAwJ1wiPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImZpZWxkLnR5cGVcIj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidhdHRhY2htZW50J1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzQXR0YWNobWVudEZpZWxkRWRpdGFibGUgJiYgc2hvd0ZpZWxkKGRlZmF1bHRzLCBmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLWFuZC1hc3Rlcmlzay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFmaWVsZC5oaWRlTGFiZWxcIiBjbGFzcz1cImN1c3RvbS1sYWJlbFwiIGlkPVwibGFiZWwte3tmaWVsZC5wcm9wZXJ0eX19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBmaWVsZC5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJmaWVsZC5yZXF1aXJlZCAmJiAhZmllbGQuaGlkZUxhYmVsXCIgY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPiAqIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtYXR0YWNobWVudC11cGxvYWRlclxuICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRlZFR5cGVzXT1cImdldEFjY2VwdGVkRmlsZVR5cGVzKGZpZWxkKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2FyaWFEZXNjcmliZWRCeV09XCJzaG93RXJyb3IoZmllbGQucHJvcGVydHkpID8gJ2Vycm9yLScgKyBmaWVsZC5wcm9wZXJ0eSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgIChmaWxlU2VsZWN0ZWQpPVwib25BdHRhY2htZW50RmlsZVNlbGVjdGVkKCRldmVudCwgZmllbGQpXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDVweFwiPlxuICAgICAgICAgICAgICAgICAgICA8L2FwcC1hdHRhY2htZW50LXVwbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWVycm9yIGNsYXNzPVwiaXEtZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZXJyb3Ite3sgZmllbGQucHJvcGVydHkgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0Vycm9yKGZpZWxkLnByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sgZ2V0RXJyb3JzKGZpZWxkLnByb3BlcnR5KSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGUnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRhdGVSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGltZSdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGltZVJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwaG9uZS1udW1iZXInXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBob25lTnVtYmVyUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHQnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRleHRSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGV4dGFyZWEnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRleHRhcmVhUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ251bWJlcidcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibnVtYmVyUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2N1cnJlbmN5J1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXJyZW5jeVJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidyYWRpby1idXR0b24nXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJhZGlvQnV0dG9uUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2NoZWNrYm94J1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGVja2JveFJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0b2dnbGUnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRvZ2dsZVJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdGF0dXMnXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNoZWNrYm94UmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2xvb2t1cCdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9va3VwUmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Ftb3VudCdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYW1vdW50UmVhZG9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ211bHRpLXNlbGVjdCdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibXVsdGlTZWxlY3RSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2hpcC1saXN0J1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjaGlwTGlzdFJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzZXF1ZW5jZSdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VxdWVuY2VSZWFkb25seVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbGlzdCdcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibGlzdFJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aS1zdGF0ZS1jaGVja2JveCdcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWFkb25seS1pdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJlYWRvbmx5LWxhYmVsXCIgKm5nSWY9XCIhZmllbGQuaGlkZUxhYmVsXCIgW2lubmVySHRtbF09XCJmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZVwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVhZG9ubHktdmFsdWVcIj57eyBnZXRNdWx0aVN0YXRlUmVhZG9ubHlTdW1tYXJ5KGZpZWxkLCBkZWZhdWx0cykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpYmFuLXRleHQnXCI+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwiIWZpZWxkLmhpZGVMYWJlbCA/IChmaWVsZC5sYWJlbCB8IHRyYW5zbGF0ZSkgOiAnJ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+IDogPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZhbHVlXCIgW2lubmVySHRtbF09XCJleHRyYWN0RmllbGROYW1lKGRlZmF1bHRzLCBmaWVsZC5wcm9wZXJ0eSlcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VjdGlvbi10aXRsZSdcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJocmRpdmlkZXItbWlkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGZpZWxkLmxhYmVsIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG5cbiJdfQ==