@koalarx/ui 13.0.4 → 13.0.5

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.
@@ -558,10 +558,10 @@ export class DynamicFormComponent extends FormAbstract {
558
558
  }
559
559
  }
560
560
  DynamicFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: DynamicFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.KoalaDynamicFormService }], target: i0.ɵɵFactoryTarget.Component });
561
- DynamicFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: DynamicFormComponent, selector: "koala-dynamic-form", inputs: { form: "form", formConfig: "formConfig", showFields: "showFields", showFieldsMoreItensConfig: "showFieldsMoreItensConfig", setValues: "setValues", tabIndexStart: "tabIndexStart" }, viewQueries: [{ propertyName: "autocompleteInput", first: true, predicate: ["autocompleteInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"form\" class=\"p-relative w-100\">\n <div *ngFor=\"let propriedade of controls?.controls; let i = index;\"\n [ngClass]=\"(propriedade.get('show').value | async) ? propriedade.get('class').value : 'd-none'\"\n formArrayName=\"formData\">\n\t <div *ngIf=\"propriedade.get('show').value | async\">\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.text ||\n\t propriedade.get('type').value == typeField.password ||\n\t propriedade.get('type').value == typeField.cpf ||\n\t propriedade.get('type').value == typeField.cnpj ||\n\t propriedade.get('type').value == typeField.datetime ||\n\t propriedade.get('type').value == typeField.email ||\n\t propriedade.get('type').value == typeField.number ||\n\t propriedade.get('type').value == typeField.stringNumber ||\n\t propriedade.get('type').value == typeField.time ||\n\t propriedade.get('type').value == typeField.date ||\n\t propriedade.get('type').value == typeField.hoursAndMinutes ||\n\t propriedade.get('type').value == typeField.phone ||\n\t propriedade.get('type').value == typeField.percent ||\n\t propriedade.get('type').value == typeField.color ||\n\t propriedade.get('type').value == typeField.month ||\n\t propriedade.get('type').value == typeField.competenceDate ||\n propriedade.get('type').value == typeField.stringWithCustomMasc\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [dropSpecialCharacters]=\"false\"\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t (keyup)=\"hoursAndMinutesApplyMask(i, $event)\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [tabIndex]=\"tabIndexStart + i\"\n\t\t [mask]=\"((propriedade.get('type').value == typeField.competenceDate) ? '00/0000' : null) ||\n\t\t ((propriedade.get('type').value == typeField.phone) ? '(00)0000-0000?0' : null) ||\n\t\t ((propriedade.get('type').value == typeField.stringNumber) ? '0{'+propriedade.get('maxLength').value+'}' : null) ||\n ((propriedade.get('type').value == typeField.cpf) ? '000.000.000-00' : null) ||\n ((propriedade.get('type').value == typeField.cnpj) ? '00.000.000/0000-00' : null) ||\n ((propriedade.get('type').value == typeField.percent) ? 'percent' : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.hoursAndMinutes) ? hoursAndMinutesMask : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.stringWithCustomMasc) ? propriedade.get('customMasc').value : null)\"\n\t\t [validation]=\"\n\t (propriedade.get('type').value == typeField.cpf && propriedade.get('value').errors?.cpfInvalid) ||\n\t (propriedade.get('type').value == typeField.cnpj && propriedade.get('value').errors?.cnpjInvalid)\"\n\t\t [type]=\"((propriedade.get('type').value == typeField.cpf ||\n propriedade.get('type').value == typeField.cnpj ||\n propriedade.get('type').value == typeField.phone ||\n propriedade.get('type').value == typeField.percent\n )) ? 'tel' : (\n propriedade.get('type').value == typeField.month ?\n 'month' : (\n propriedade.get('type').value == typeField.date ?\n 'date' : (\n propriedade.get('type').value == typeField.datetime ?\n 'datetime-local' : (\n propriedade.get('type').value == typeField.email ?\n 'email' : (\n propriedade.get('type').value == typeField.number ?\n 'number' : (\n propriedade.get('type').value == typeField.time ?\n 'time' : (\n propriedade.get('type').value == typeField.password ?\n 'password' : (\n propriedade.get('type').value == typeField.color ?\n 'color' : 'text'))))))))\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [thousandSeparator]=\"propriedade.get('customMascThousandSeparator').value\"\n [suffix]=\"propriedade.get('customMascSuffix').value\"\n [prefix]=\"propriedade.get('customMascPrefix').value\"\n separatorLimit=\"0\"\n autocomplete=\"off\"\n\t\t formControlName=\"value\"\n\t\t matInput/>\n\t <button\n\t\t (click)=\"passwordView(i)\"\n\t\t *ngIf=\"propriedade.get('hidePassword').value !== null\"\n\t\t [attr.aria-label]=\"'Hide password'\"\n\t\t [attr.aria-pressed]=\"propriedade.get('hidePassword').value\"\n\t\t mat-icon-button matSuffix tabindex=\"-1\" type=\"button\">\n\t <mat-icon>{{propriedade.get('hidePassword').value ? 'visibility_off' : 'visibility'}}</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cpfInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cnpjInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.email\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMin\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMinMessage()}}\n {{propriedade.get('min').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMax\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMaxMessage()}}\n {{propriedade.get('max').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.coin\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n autocomplete=\"off\"\n\t\t currencyMask\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"tel\"/>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n *ngIf=\"propriedade.get('type').value == typeField.float\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <input\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n autocomplete=\"off\"\n currencyMask\n [options]=\"{prefix: ''}\"\n formControlName=\"value\"\n matInput\n type=\"tel\"/>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.valueList ||\n\t propriedade.get('type').value == typeField.textarea\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.textLogs\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <div [innerHTML]=\"propriedade.get('textLogs').value\" class=\"text-obs\"></div>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n\t </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.select\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <mat-select [multiple]=\"propriedade.get('multiple').value\" [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\" formControlName=\"value\">\n\t <mat-option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n\t {{options.name}}\n\t </mat-option>\n\t </mat-select>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n class=\"select-multiple-native\"\n *ngIf=\"propriedade.get('type').value == typeField.selectMultipleNative\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <select\n matNativeControl\n formControlName=\"value\"\n multiple\n [tabIndex]=\"tabIndexStart + i\"\n [required]=\"propriedade.get('required').value\">\n <option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n {{options.name}}\n </option>\n </select>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <div\n\t\t *ngIf=\"propriedade.get('type').value == typeField.checkbox\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-checkbox\n [tabIndex]=\"tabIndexStart + i\"\n\t\t formControlName=\"value\"\n\t\t value=\"true\">\n\t {{propriedade.get('label').value}}\n\t </mat-checkbox>\n\t </div>\n\t\t <div\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.moreItems\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\"\n\t\t\t class=\"more-items-content\">\n\t\t\t <fieldset>\n\t\t\t\t <legend>\n\t\t\t\t\t <koala-button\n\t\t\t\t\t\t (click)=\"addMoreItem(i)\"\n\t\t\t\t\t\t [disabled]=\"propriedade.get('moreItemsConfig').value.length === propriedade.get('moreItemsMaxItems').value\"\n\t\t\t\t\t\t [tooltip]=\"propriedade.get('moreItemsButtonIconAddlabel').value\"\n\t\t\t\t\t\t [backgroundColor]=\"propriedade.get('moreItemsIconBackgroundColor').value\"\n [color]=\"propriedade.get('moreItemsIconFontColor').value\"\n\t\t\t\t\t\t class=\"btn-add-more-items\"\n\t\t\t\t\t\t icon=\"add\">\n\t\t\t\t\t </koala-button>\n\t\t\t\t\t {{propriedade.get('label').value}} (Min.: {{propriedade.get('moreItemsMinItems').value}}\n\t\t\t\t\t | M\u00E1x.: {{propriedade.get('moreItemsMaxItems').value}})\n\t\t\t\t </legend>\n\t\t\t\t <mat-accordion class=\"items\" multi>\n\t\t\t\t\t <mat-expansion-panel\n\t\t\t\t\t\t *ngFor=\"let item of propriedade.get('moreItemsConfig').value.slice().reverse(); index as indexMoreItems\"\n\t\t\t\t\t\t expanded>\n\t\t\t\t\t\t <mat-expansion-panel-header>\n\t\t\t\t\t\t\t\t<mat-panel-title class=\"titleForm\">#\n\t\t\t\t\t\t\t\t\t{{propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems + 1}}</mat-panel-title>\n\t\t\t\t\t\t\t\t<mat-panel-description class=\"titleForm\">\n\t\t\t\t\t\t\t\t\t{{propriedade.get('label').value}}\n\t\t\t\t\t\t\t\t\t<mat-icon>{{propriedade.get('moreItemsIcon').value}}</mat-icon>\n\t\t\t\t\t\t\t\t</mat-panel-description>\n\t\t\t\t\t\t\t</mat-expansion-panel-header>\n\t\t\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t\t\t [showFieldsMoreItensConfig]=\"item.showFieldsMoreItensConfig\"\n\t\t\t\t\t\t\t [showFields]=\"item.showFields\"\n\t\t\t\t\t\t\t [formConfig]=\"item.formConfig\"\n\t\t\t\t\t\t\t [form]=\"item.form\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t\t\t </koala-dynamic-form>\n\t\t\t\t\t <mat-action-row\n\t\t\t\t\t\t *ngIf=\"propriedade.get('moreItemsConfig').value.length > propriedade.get('moreItemsMinItems').value\">\n\t\t\t\t\t <button\n\t\t\t\t\t\t (click)=\"removeMoreItem(i, propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems)\"\n\t\t\t\t\t\t mat-icon-button>\n\t\t\t\t\t\t <mat-icon>delete</mat-icon>\n\t\t\t\t\t </button>\n\t\t\t\t\t </mat-action-row>\n\t\t\t\t\t </mat-expansion-panel>\n\t\t\t\t </mat-accordion>\n\t\t\t </fieldset>\n\t\t </div>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.autocomplete\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}} {{propriedade.get('multiple').value &&\n\t propriedade.get('required').value ? '*' : ''}}</mat-label>\n\t\t\t <div *ngIf=\"propriedade.get('multiple').value else single\">\n\t <mat-chip-list #chipList>\n\t <mat-chip\n\t\t (removed)=\"removeOptionOnAutocomplete(i, option)\"\n\t\t *ngFor=\"let option of propriedade.get('autocompleteSelectedValue').value\"\n\t\t [color]=\"getColorChip(propriedade.get('autocompleteMultipleConfig').value | async)\"\n\t\t [removable]=\"true\"\n\t\t [selectable]=\"true\">\n\t {{display(option)}}\n\t\t <mat-icon matChipRemove>cancel</mat-icon>\n\t </mat-chip>\n\t <input\n\t\t #autocompleteInput\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [matAutocomplete]=\"auto\"\n\t\t [matChipInputFor]=\"chipList\"\n [tabIndex]=\"tabIndexStart + i\"\n autocomplete=\"off\"\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"text\"\n\t\t placeholder=\"Selecione um ou mais op\u00E7\u00F5es...\">\n\t </mat-chip-list>\n\t </div>\n\t <ng-template #single>\n\t\t <input\n\t\t\t [matAutocomplete]=\"auto\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n autocomplete=\"off\"\n\t\t\t formControlName=\"value\"\n\t\t\t matInput\n\t\t\t placeholder=\"Selecione uma op\u00E7\u00E3o...\"\n\t\t\t type=\"text\">\n\t </ng-template>\n\t <mat-spinner *ngIf=\"propriedade.get('autocompleteLoading').value | async\" color=\"primary\"\n\t matSuffix></mat-spinner>\n\t <button\n\t\t (click)=\"clearAutocomplete(i)\"\n\t\t *ngIf=\"\n\t !(propriedade.get('autocompleteLoading').value | async) &&\n\t !propriedade.get('disabled').value\"\n\t\t color=\"warn\"\n\t\t mat-icon-button\n\t\t matSuffix\n\t\t type=\"button\">\n\t <mat-icon>close</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required || propriedade.get('value').errors?.autocompleteSelected\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getAutocompleteMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t <mat-autocomplete\n\t\t #auto=\"matAutocomplete\"\n\t\t [displayWith]=\"display\" autoActiveFirstOption>\n\t\t <div *ngIf=\"(getAutocompleteOptions(propriedade) | async) as options\">\n\t\t <mat-option *ngFor=\"let option of options\" [value]=\"option\">\n\t\t {{option.name}}\n\t\t </mat-option>\n\t\t </div>\n\t </mat-autocomplete>\n\t </mat-form-field>\n\t\t <div *ngIf=\"propriedade.get('type').value == typeField.file\">\n\t\t\t <koala-file-button\n\t\t\t\t (getFiles)=\"propriedade.get('value').setValue($event)\"\n\t\t\t\t [accept]=\"propriedade.get('fileButtonConfig').value.accept\"\n\t\t\t\t [backgroundColor]=\"propriedade.get('fileButtonConfig').value.backgroundColor\"\n\t\t\t\t [color]=\"propriedade.get('fileButtonConfig').value.color\"\n\t\t\t\t [disabled]=\"propriedade.get('disabled').value\"\n\t\t\t\t [icon]=\"propriedade.get('fileButtonConfig').value.icon\"\n\t\t\t\t [multiple]=\"propriedade.get('multiple').value\"\n\t\t\t\t [text]=\"propriedade.get('fileButtonConfig').value.text\">\n\t\t\t </koala-file-button>\n\t\t </div>\n\t\t <div *ngIf=\"\n\t\t propriedade.get('type').value == typeField.dynamicForm &&\n\t\t\t\t(getDynamicFormConfig(propriedade) | async) as dynamicFormConfig\">\n\t\t\t <fieldset *ngIf=\"propriedade.get('label').value else dynamicFormWithoutLabel\">\n\t\t\t\t <legend>{{propriedade.get('label').value}}</legend>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </fieldset>\n\t\t\t <ng-template #dynamicFormWithoutLabel>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </ng-template>\n\t\t </div>\n <div\n class=\"radio-btn-group\"\n *ngIf=\"propriedade.get('type').value == typeField.radio\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-radio-group formControlName=\"value\">\n <label *ngIf=\"propriedade.get('label').value\">{{propriedade.get('label').value}}</label>\n <mat-radio-button\n [tabIndex]=\"tabIndexStart + i\"\n *ngFor=\"let options of propriedade.get('opcoesSelect').value\"\n [value]=\"options.value\">\n {{options.name}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\t </div>\n </div>\n <ng-content select=\"[btn-submit]\"></ng-content>\n</div>\n", styles: [".more-items-content fieldset{border:1px solid #cccccc;padding:16px}.more-items-content fieldset legend{font-family:Josefin Sans,sans-serif;font-size:11px;font-weight:700;padding:0 8px}.more-items-content .items .titleForm{color:#616161}.more-items-content .items .mat-expansion-panel-header-title,.more-items-content .items .mat-expansion-panel-header-description{flex-basis:0}.more-items-content .items .mat-expansion-panel-header-description{align-items:center;justify-content:space-between}.more-items-content .items .mat-form-field+.mat-form-field{margin-left:8px}.radio-btn-group label{position:relative;display:block;padding:10px 0}.text-obs{background:#eeeeee;border-radius:5px;color:#212121;font-family:OpenSansLight,sans-serif;height:150px;margin:0 auto 10px;overflow-y:auto;padding:10px;position:relative;width:calc(100% - 27px)}.select-multiple-native{margin-bottom:15px}.select-multiple-native select{width:100%;height:150px;background:transparent;border:none}.select-multiple-native select:focus,.select-multiple-native select:active{outline:none}.select-multiple-native select option{padding:5px 10px;font-family:JosefinSans,sans-serif}.select-multiple-native select option:checked{background:#f1f1f1!important}\n"], components: [{ type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i9.ButtonComponent, selector: "koala-button", inputs: ["color", "backgroundColor", "icon", "text", "tooltip", "disabled", "koalaIcon", "koalaIconSize"] }, { type: i10.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i10.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { type: DynamicFormComponent, selector: "koala-dynamic-form", inputs: ["form", "formConfig", "showFields", "showFieldsMoreItensConfig", "setValues", "tabIndexStart"] }, { type: i11.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i12.MatSpinner, selector: "mat-spinner", inputs: ["color"] }, { type: i13.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i14.FileButtonComponent, selector: "koala-file-button", inputs: ["color", "backgroundColor", "icon", "text", "tooltip", "disabled", "multiple", "accept", "setFile", "updateFileList", "autoclear"], outputs: ["getFiles"] }, { type: i15.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }], directives: [{ type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i16.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i16.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i16.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i3.MatLabel, selector: "mat-label" }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i17.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i18.MaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i19.KoalaAutofocusDirective, selector: "[koalaAutoFocus]", inputs: ["koalaAutoFocus"] }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i3.MatSuffix, selector: "[matSuffix]" }, { type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i3.MatError, selector: "mat-error", inputs: ["id"] }, { type: i20.CurrencyMaskDirective, selector: "[currencyMask]", inputs: ["max", "min", "options"] }, { type: i21.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { type: i1.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i10.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { type: i10.MatExpansionPanelTitle, selector: "mat-panel-title" }, { type: i10.MatExpansionPanelDescription, selector: "mat-panel-description" }, { type: i10.MatExpansionPanelActionRow, selector: "mat-action-row" }, { type: i11.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i11.MatChipRemove, selector: "[matChipRemove]" }, { type: i13.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i11.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i15.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }], pipes: { "async": i16.AsyncPipe, "date": i16.DatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
561
+ DynamicFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: DynamicFormComponent, selector: "koala-dynamic-form", inputs: { form: "form", formConfig: "formConfig", showFields: "showFields", showFieldsMoreItensConfig: "showFieldsMoreItensConfig", setValues: "setValues", tabIndexStart: "tabIndexStart" }, viewQueries: [{ propertyName: "autocompleteInput", first: true, predicate: ["autocompleteInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div [formGroup]=\"form\" class=\"p-relative w-100\">\n <div *ngFor=\"let propriedade of controls?.controls; let i = index;\"\n [ngClass]=\"(propriedade.get('show').value | async) ? propriedade.get('class').value : 'd-none'\"\n formArrayName=\"formData\">\n\t <div *ngIf=\"propriedade.get('show').value | async\">\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.text ||\n\t propriedade.get('type').value == typeField.password ||\n\t propriedade.get('type').value == typeField.cpf ||\n\t propriedade.get('type').value == typeField.cnpj ||\n\t propriedade.get('type').value == typeField.datetime ||\n\t propriedade.get('type').value == typeField.email ||\n\t propriedade.get('type').value == typeField.number ||\n\t propriedade.get('type').value == typeField.stringNumber ||\n\t propriedade.get('type').value == typeField.time ||\n\t propriedade.get('type').value == typeField.date ||\n\t propriedade.get('type').value == typeField.hoursAndMinutes ||\n\t propriedade.get('type').value == typeField.phone ||\n\t propriedade.get('type').value == typeField.percent ||\n\t propriedade.get('type').value == typeField.color ||\n\t propriedade.get('type').value == typeField.month ||\n\t propriedade.get('type').value == typeField.competenceDate ||\n propriedade.get('type').value == typeField.stringWithCustomMasc\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [dropSpecialCharacters]=\"false\"\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t (keyup)=\"hoursAndMinutesApplyMask(i, $event)\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [tabIndex]=\"tabIndexStart + i\"\n\t\t [mask]=\"((propriedade.get('type').value == typeField.competenceDate) ? '00/0000' : null) ||\n\t\t ((propriedade.get('type').value == typeField.phone) ? '(00)0000-0000?0' : null) ||\n\t\t ((propriedade.get('type').value == typeField.stringNumber) ? '0{'+propriedade.get('maxLength').value+'}' : null) ||\n ((propriedade.get('type').value == typeField.cpf) ? '000.000.000-00' : null) ||\n ((propriedade.get('type').value == typeField.cnpj) ? '00.000.000/0000-00' : null) ||\n ((propriedade.get('type').value == typeField.percent) ? 'percent' : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.hoursAndMinutes) ? hoursAndMinutesMask : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.stringWithCustomMasc) ? propriedade.get('customMasc').value : null)\"\n\t\t [validation]=\"\n\t (propriedade.get('type').value == typeField.cpf && propriedade.get('value').errors?.cpfInvalid) ||\n\t (propriedade.get('type').value == typeField.cnpj && propriedade.get('value').errors?.cnpjInvalid)\"\n\t\t [type]=\"((propriedade.get('type').value == typeField.cpf ||\n propriedade.get('type').value == typeField.cnpj ||\n propriedade.get('type').value == typeField.phone ||\n propriedade.get('type').value == typeField.percent\n )) ? 'tel' : (\n propriedade.get('type').value == typeField.month ?\n 'month' : (\n propriedade.get('type').value == typeField.date ?\n 'date' : (\n propriedade.get('type').value == typeField.datetime ?\n 'datetime-local' : (\n propriedade.get('type').value == typeField.email ?\n 'email' : (\n propriedade.get('type').value == typeField.number ?\n 'number' : (\n propriedade.get('type').value == typeField.time ?\n 'time' : (\n propriedade.get('type').value == typeField.password ?\n 'password' : (\n propriedade.get('type').value == typeField.color ?\n 'color' : 'text'))))))))\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [thousandSeparator]=\"propriedade.get('customMascThousandSeparator').value\"\n [suffix]=\"propriedade.get('customMascSuffix').value\"\n [prefix]=\"propriedade.get('customMascPrefix').value\"\n separatorLimit=\"0\"\n autocomplete=\"-1\"\n\t\t formControlName=\"value\"\n\t\t matInput/>\n\t <button\n\t\t (click)=\"passwordView(i)\"\n\t\t *ngIf=\"propriedade.get('hidePassword').value !== null\"\n\t\t [attr.aria-label]=\"'Hide password'\"\n\t\t [attr.aria-pressed]=\"propriedade.get('hidePassword').value\"\n\t\t mat-icon-button matSuffix tabindex=\"-1\" type=\"button\">\n\t <mat-icon>{{propriedade.get('hidePassword').value ? 'visibility_off' : 'visibility'}}</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cpfInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cnpjInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.email\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMin\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMinMessage()}}\n {{propriedade.get('min').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMax\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMaxMessage()}}\n {{propriedade.get('max').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.coin\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n autocomplete=\"-1\"\n\t\t currencyMask\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"tel\"/>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n *ngIf=\"propriedade.get('type').value == typeField.float\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <input\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n autocomplete=\"-1\"\n currencyMask\n [options]=\"{prefix: ''}\"\n formControlName=\"value\"\n matInput\n type=\"tel\"/>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.valueList ||\n\t propriedade.get('type').value == typeField.textarea\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.textLogs\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <div [innerHTML]=\"propriedade.get('textLogs').value\" class=\"text-obs\"></div>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n\t </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.select\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <mat-select [multiple]=\"propriedade.get('multiple').value\" [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\" formControlName=\"value\">\n\t <mat-option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n\t {{options.name}}\n\t </mat-option>\n\t </mat-select>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n class=\"select-multiple-native\"\n *ngIf=\"propriedade.get('type').value == typeField.selectMultipleNative\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <select\n matNativeControl\n formControlName=\"value\"\n multiple\n [tabIndex]=\"tabIndexStart + i\"\n [required]=\"propriedade.get('required').value\">\n <option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n {{options.name}}\n </option>\n </select>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <div\n\t\t *ngIf=\"propriedade.get('type').value == typeField.checkbox\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-checkbox\n [tabIndex]=\"tabIndexStart + i\"\n\t\t formControlName=\"value\"\n\t\t value=\"true\">\n\t {{propriedade.get('label').value}}\n\t </mat-checkbox>\n\t </div>\n\t\t <div\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.moreItems\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\"\n\t\t\t class=\"more-items-content\">\n\t\t\t <fieldset>\n\t\t\t\t <legend>\n\t\t\t\t\t <koala-button\n\t\t\t\t\t\t (click)=\"addMoreItem(i)\"\n\t\t\t\t\t\t [disabled]=\"propriedade.get('moreItemsConfig').value.length === propriedade.get('moreItemsMaxItems').value\"\n\t\t\t\t\t\t [tooltip]=\"propriedade.get('moreItemsButtonIconAddlabel').value\"\n\t\t\t\t\t\t [backgroundColor]=\"propriedade.get('moreItemsIconBackgroundColor').value\"\n [color]=\"propriedade.get('moreItemsIconFontColor').value\"\n\t\t\t\t\t\t class=\"btn-add-more-items\"\n\t\t\t\t\t\t icon=\"add\">\n\t\t\t\t\t </koala-button>\n\t\t\t\t\t {{propriedade.get('label').value}} (Min.: {{propriedade.get('moreItemsMinItems').value}}\n\t\t\t\t\t | M\u00E1x.: {{propriedade.get('moreItemsMaxItems').value}})\n\t\t\t\t </legend>\n\t\t\t\t <mat-accordion class=\"items\" multi>\n\t\t\t\t\t <mat-expansion-panel\n\t\t\t\t\t\t *ngFor=\"let item of propriedade.get('moreItemsConfig').value.slice().reverse(); index as indexMoreItems\"\n\t\t\t\t\t\t expanded>\n\t\t\t\t\t\t <mat-expansion-panel-header>\n\t\t\t\t\t\t\t\t<mat-panel-title class=\"titleForm\">#\n\t\t\t\t\t\t\t\t\t{{propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems + 1}}</mat-panel-title>\n\t\t\t\t\t\t\t\t<mat-panel-description class=\"titleForm\">\n\t\t\t\t\t\t\t\t\t{{propriedade.get('label').value}}\n\t\t\t\t\t\t\t\t\t<mat-icon>{{propriedade.get('moreItemsIcon').value}}</mat-icon>\n\t\t\t\t\t\t\t\t</mat-panel-description>\n\t\t\t\t\t\t\t</mat-expansion-panel-header>\n\t\t\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t\t\t [showFieldsMoreItensConfig]=\"item.showFieldsMoreItensConfig\"\n\t\t\t\t\t\t\t [showFields]=\"item.showFields\"\n\t\t\t\t\t\t\t [formConfig]=\"item.formConfig\"\n\t\t\t\t\t\t\t [form]=\"item.form\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t\t\t </koala-dynamic-form>\n\t\t\t\t\t <mat-action-row\n\t\t\t\t\t\t *ngIf=\"propriedade.get('moreItemsConfig').value.length > propriedade.get('moreItemsMinItems').value\">\n\t\t\t\t\t <button\n\t\t\t\t\t\t (click)=\"removeMoreItem(i, propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems)\"\n\t\t\t\t\t\t mat-icon-button>\n\t\t\t\t\t\t <mat-icon>delete</mat-icon>\n\t\t\t\t\t </button>\n\t\t\t\t\t </mat-action-row>\n\t\t\t\t\t </mat-expansion-panel>\n\t\t\t\t </mat-accordion>\n\t\t\t </fieldset>\n\t\t </div>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.autocomplete\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}} {{propriedade.get('multiple').value &&\n\t propriedade.get('required').value ? '*' : ''}}</mat-label>\n\t\t\t <div *ngIf=\"propriedade.get('multiple').value else single\">\n\t <mat-chip-list #chipList>\n\t <mat-chip\n\t\t (removed)=\"removeOptionOnAutocomplete(i, option)\"\n\t\t *ngFor=\"let option of propriedade.get('autocompleteSelectedValue').value\"\n\t\t [color]=\"getColorChip(propriedade.get('autocompleteMultipleConfig').value | async)\"\n\t\t [removable]=\"true\"\n\t\t [selectable]=\"true\">\n\t {{display(option)}}\n\t\t <mat-icon matChipRemove>cancel</mat-icon>\n\t </mat-chip>\n\t <input\n\t\t #autocompleteInput\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [matAutocomplete]=\"auto\"\n\t\t [matChipInputFor]=\"chipList\"\n [tabIndex]=\"tabIndexStart + i\"\n autocomplete=\"-1\"\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"text\"\n\t\t placeholder=\"Selecione um ou mais op\u00E7\u00F5es...\">\n\t </mat-chip-list>\n\t </div>\n\t <ng-template #single>\n\t\t <input\n\t\t\t [matAutocomplete]=\"auto\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n autocomplete=\"-1\"\n\t\t\t formControlName=\"value\"\n\t\t\t matInput\n\t\t\t placeholder=\"Selecione uma op\u00E7\u00E3o...\"\n\t\t\t type=\"text\">\n\t </ng-template>\n\t <mat-spinner *ngIf=\"propriedade.get('autocompleteLoading').value | async\" color=\"primary\"\n\t matSuffix></mat-spinner>\n\t <button\n\t\t (click)=\"clearAutocomplete(i)\"\n\t\t *ngIf=\"\n\t !(propriedade.get('autocompleteLoading').value | async) &&\n\t !propriedade.get('disabled').value\"\n\t\t color=\"warn\"\n\t\t mat-icon-button\n\t\t matSuffix\n\t\t type=\"button\">\n\t <mat-icon>close</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required || propriedade.get('value').errors?.autocompleteSelected\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getAutocompleteMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t <mat-autocomplete\n\t\t #auto=\"matAutocomplete\"\n\t\t [displayWith]=\"display\" autoActiveFirstOption>\n\t\t <div *ngIf=\"(getAutocompleteOptions(propriedade) | async) as options\">\n\t\t <mat-option *ngFor=\"let option of options\" [value]=\"option\">\n\t\t {{option.name}}\n\t\t </mat-option>\n\t\t </div>\n\t </mat-autocomplete>\n\t </mat-form-field>\n\t\t <div *ngIf=\"propriedade.get('type').value == typeField.file\">\n\t\t\t <koala-file-button\n\t\t\t\t (getFiles)=\"propriedade.get('value').setValue($event)\"\n\t\t\t\t [accept]=\"propriedade.get('fileButtonConfig').value.accept\"\n\t\t\t\t [backgroundColor]=\"propriedade.get('fileButtonConfig').value.backgroundColor\"\n\t\t\t\t [color]=\"propriedade.get('fileButtonConfig').value.color\"\n\t\t\t\t [disabled]=\"propriedade.get('disabled').value\"\n\t\t\t\t [icon]=\"propriedade.get('fileButtonConfig').value.icon\"\n\t\t\t\t [multiple]=\"propriedade.get('multiple').value\"\n\t\t\t\t [text]=\"propriedade.get('fileButtonConfig').value.text\">\n\t\t\t </koala-file-button>\n\t\t </div>\n\t\t <div *ngIf=\"\n\t\t propriedade.get('type').value == typeField.dynamicForm &&\n\t\t\t\t(getDynamicFormConfig(propriedade) | async) as dynamicFormConfig\">\n\t\t\t <fieldset *ngIf=\"propriedade.get('label').value else dynamicFormWithoutLabel\">\n\t\t\t\t <legend>{{propriedade.get('label').value}}</legend>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </fieldset>\n\t\t\t <ng-template #dynamicFormWithoutLabel>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </ng-template>\n\t\t </div>\n <div\n class=\"radio-btn-group\"\n *ngIf=\"propriedade.get('type').value == typeField.radio\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-radio-group formControlName=\"value\">\n <label *ngIf=\"propriedade.get('label').value\">{{propriedade.get('label').value}}</label>\n <mat-radio-button\n [tabIndex]=\"tabIndexStart + i\"\n *ngFor=\"let options of propriedade.get('opcoesSelect').value\"\n [value]=\"options.value\">\n {{options.name}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\t </div>\n </div>\n <ng-content select=\"[btn-submit]\"></ng-content>\n</div>\n", styles: [".more-items-content fieldset{border:1px solid #cccccc;padding:16px}.more-items-content fieldset legend{font-family:Josefin Sans,sans-serif;font-size:11px;font-weight:700;padding:0 8px}.more-items-content .items .titleForm{color:#616161}.more-items-content .items .mat-expansion-panel-header-title,.more-items-content .items .mat-expansion-panel-header-description{flex-basis:0}.more-items-content .items .mat-expansion-panel-header-description{align-items:center;justify-content:space-between}.more-items-content .items .mat-form-field+.mat-form-field{margin-left:8px}.radio-btn-group label{position:relative;display:block;padding:10px 0}.text-obs{background:#eeeeee;border-radius:5px;color:#212121;font-family:OpenSansLight,sans-serif;height:150px;margin:0 auto 10px;overflow-y:auto;padding:10px;position:relative;width:calc(100% - 27px)}.select-multiple-native{margin-bottom:15px}.select-multiple-native select{width:100%;height:150px;background:transparent;border:none}.select-multiple-native select:focus,.select-multiple-native select:active{outline:none}.select-multiple-native select option{padding:5px 10px;font-family:JosefinSans,sans-serif}.select-multiple-native select option:checked{background:#f1f1f1!important}\n"], components: [{ type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i9.ButtonComponent, selector: "koala-button", inputs: ["color", "backgroundColor", "icon", "text", "tooltip", "disabled", "koalaIcon", "koalaIconSize"] }, { type: i10.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i10.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { type: DynamicFormComponent, selector: "koala-dynamic-form", inputs: ["form", "formConfig", "showFields", "showFieldsMoreItensConfig", "setValues", "tabIndexStart"] }, { type: i11.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i12.MatSpinner, selector: "mat-spinner", inputs: ["color"] }, { type: i13.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i14.FileButtonComponent, selector: "koala-file-button", inputs: ["color", "backgroundColor", "icon", "text", "tooltip", "disabled", "multiple", "accept", "setFile", "updateFileList", "autoclear"], outputs: ["getFiles"] }, { type: i15.MatRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }], directives: [{ type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i16.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { type: i16.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i16.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { type: i3.MatLabel, selector: "mat-label" }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i17.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i18.MaskDirective, selector: "input[mask], textarea[mask]", inputs: ["mask", "specialCharacters", "patterns", "prefix", "suffix", "thousandSeparator", "decimalMarker", "dropSpecialCharacters", "hiddenInput", "showMaskTyped", "placeHolderCharacter", "shownMaskExpression", "showTemplate", "clearIfNotMatch", "validation", "separatorLimit", "allowNegativeNumbers"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i19.KoalaAutofocusDirective, selector: "[koalaAutoFocus]", inputs: ["koalaAutoFocus"] }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i3.MatSuffix, selector: "[matSuffix]" }, { type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { type: i3.MatError, selector: "mat-error", inputs: ["id"] }, { type: i20.CurrencyMaskDirective, selector: "[currencyMask]", inputs: ["max", "min", "options"] }, { type: i21.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { type: i1.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i10.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { type: i10.MatExpansionPanelTitle, selector: "mat-panel-title" }, { type: i10.MatExpansionPanelDescription, selector: "mat-panel-description" }, { type: i10.MatExpansionPanelActionRow, selector: "mat-action-row" }, { type: i11.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i11.MatChipRemove, selector: "[matChipRemove]" }, { type: i13.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i11.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i15.MatRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }], pipes: { "async": i16.AsyncPipe, "date": i16.DatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
562
562
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: DynamicFormComponent, decorators: [{
563
563
  type: Component,
564
- args: [{ selector: 'koala-dynamic-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [formGroup]=\"form\" class=\"p-relative w-100\">\n <div *ngFor=\"let propriedade of controls?.controls; let i = index;\"\n [ngClass]=\"(propriedade.get('show').value | async) ? propriedade.get('class').value : 'd-none'\"\n formArrayName=\"formData\">\n\t <div *ngIf=\"propriedade.get('show').value | async\">\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.text ||\n\t propriedade.get('type').value == typeField.password ||\n\t propriedade.get('type').value == typeField.cpf ||\n\t propriedade.get('type').value == typeField.cnpj ||\n\t propriedade.get('type').value == typeField.datetime ||\n\t propriedade.get('type').value == typeField.email ||\n\t propriedade.get('type').value == typeField.number ||\n\t propriedade.get('type').value == typeField.stringNumber ||\n\t propriedade.get('type').value == typeField.time ||\n\t propriedade.get('type').value == typeField.date ||\n\t propriedade.get('type').value == typeField.hoursAndMinutes ||\n\t propriedade.get('type').value == typeField.phone ||\n\t propriedade.get('type').value == typeField.percent ||\n\t propriedade.get('type').value == typeField.color ||\n\t propriedade.get('type').value == typeField.month ||\n\t propriedade.get('type').value == typeField.competenceDate ||\n propriedade.get('type').value == typeField.stringWithCustomMasc\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [dropSpecialCharacters]=\"false\"\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t (keyup)=\"hoursAndMinutesApplyMask(i, $event)\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [tabIndex]=\"tabIndexStart + i\"\n\t\t [mask]=\"((propriedade.get('type').value == typeField.competenceDate) ? '00/0000' : null) ||\n\t\t ((propriedade.get('type').value == typeField.phone) ? '(00)0000-0000?0' : null) ||\n\t\t ((propriedade.get('type').value == typeField.stringNumber) ? '0{'+propriedade.get('maxLength').value+'}' : null) ||\n ((propriedade.get('type').value == typeField.cpf) ? '000.000.000-00' : null) ||\n ((propriedade.get('type').value == typeField.cnpj) ? '00.000.000/0000-00' : null) ||\n ((propriedade.get('type').value == typeField.percent) ? 'percent' : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.hoursAndMinutes) ? hoursAndMinutesMask : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.stringWithCustomMasc) ? propriedade.get('customMasc').value : null)\"\n\t\t [validation]=\"\n\t (propriedade.get('type').value == typeField.cpf && propriedade.get('value').errors?.cpfInvalid) ||\n\t (propriedade.get('type').value == typeField.cnpj && propriedade.get('value').errors?.cnpjInvalid)\"\n\t\t [type]=\"((propriedade.get('type').value == typeField.cpf ||\n propriedade.get('type').value == typeField.cnpj ||\n propriedade.get('type').value == typeField.phone ||\n propriedade.get('type').value == typeField.percent\n )) ? 'tel' : (\n propriedade.get('type').value == typeField.month ?\n 'month' : (\n propriedade.get('type').value == typeField.date ?\n 'date' : (\n propriedade.get('type').value == typeField.datetime ?\n 'datetime-local' : (\n propriedade.get('type').value == typeField.email ?\n 'email' : (\n propriedade.get('type').value == typeField.number ?\n 'number' : (\n propriedade.get('type').value == typeField.time ?\n 'time' : (\n propriedade.get('type').value == typeField.password ?\n 'password' : (\n propriedade.get('type').value == typeField.color ?\n 'color' : 'text'))))))))\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [thousandSeparator]=\"propriedade.get('customMascThousandSeparator').value\"\n [suffix]=\"propriedade.get('customMascSuffix').value\"\n [prefix]=\"propriedade.get('customMascPrefix').value\"\n separatorLimit=\"0\"\n autocomplete=\"off\"\n\t\t formControlName=\"value\"\n\t\t matInput/>\n\t <button\n\t\t (click)=\"passwordView(i)\"\n\t\t *ngIf=\"propriedade.get('hidePassword').value !== null\"\n\t\t [attr.aria-label]=\"'Hide password'\"\n\t\t [attr.aria-pressed]=\"propriedade.get('hidePassword').value\"\n\t\t mat-icon-button matSuffix tabindex=\"-1\" type=\"button\">\n\t <mat-icon>{{propriedade.get('hidePassword').value ? 'visibility_off' : 'visibility'}}</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cpfInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cnpjInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.email\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMin\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMinMessage()}}\n {{propriedade.get('min').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMax\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMaxMessage()}}\n {{propriedade.get('max').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.coin\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n autocomplete=\"off\"\n\t\t currencyMask\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"tel\"/>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n *ngIf=\"propriedade.get('type').value == typeField.float\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <input\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n autocomplete=\"off\"\n currencyMask\n [options]=\"{prefix: ''}\"\n formControlName=\"value\"\n matInput\n type=\"tel\"/>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.valueList ||\n\t propriedade.get('type').value == typeField.textarea\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.textLogs\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <div [innerHTML]=\"propriedade.get('textLogs').value\" class=\"text-obs\"></div>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n\t </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.select\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <mat-select [multiple]=\"propriedade.get('multiple').value\" [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\" formControlName=\"value\">\n\t <mat-option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n\t {{options.name}}\n\t </mat-option>\n\t </mat-select>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n class=\"select-multiple-native\"\n *ngIf=\"propriedade.get('type').value == typeField.selectMultipleNative\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <select\n matNativeControl\n formControlName=\"value\"\n multiple\n [tabIndex]=\"tabIndexStart + i\"\n [required]=\"propriedade.get('required').value\">\n <option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n {{options.name}}\n </option>\n </select>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <div\n\t\t *ngIf=\"propriedade.get('type').value == typeField.checkbox\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-checkbox\n [tabIndex]=\"tabIndexStart + i\"\n\t\t formControlName=\"value\"\n\t\t value=\"true\">\n\t {{propriedade.get('label').value}}\n\t </mat-checkbox>\n\t </div>\n\t\t <div\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.moreItems\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\"\n\t\t\t class=\"more-items-content\">\n\t\t\t <fieldset>\n\t\t\t\t <legend>\n\t\t\t\t\t <koala-button\n\t\t\t\t\t\t (click)=\"addMoreItem(i)\"\n\t\t\t\t\t\t [disabled]=\"propriedade.get('moreItemsConfig').value.length === propriedade.get('moreItemsMaxItems').value\"\n\t\t\t\t\t\t [tooltip]=\"propriedade.get('moreItemsButtonIconAddlabel').value\"\n\t\t\t\t\t\t [backgroundColor]=\"propriedade.get('moreItemsIconBackgroundColor').value\"\n [color]=\"propriedade.get('moreItemsIconFontColor').value\"\n\t\t\t\t\t\t class=\"btn-add-more-items\"\n\t\t\t\t\t\t icon=\"add\">\n\t\t\t\t\t </koala-button>\n\t\t\t\t\t {{propriedade.get('label').value}} (Min.: {{propriedade.get('moreItemsMinItems').value}}\n\t\t\t\t\t | M\u00E1x.: {{propriedade.get('moreItemsMaxItems').value}})\n\t\t\t\t </legend>\n\t\t\t\t <mat-accordion class=\"items\" multi>\n\t\t\t\t\t <mat-expansion-panel\n\t\t\t\t\t\t *ngFor=\"let item of propriedade.get('moreItemsConfig').value.slice().reverse(); index as indexMoreItems\"\n\t\t\t\t\t\t expanded>\n\t\t\t\t\t\t <mat-expansion-panel-header>\n\t\t\t\t\t\t\t\t<mat-panel-title class=\"titleForm\">#\n\t\t\t\t\t\t\t\t\t{{propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems + 1}}</mat-panel-title>\n\t\t\t\t\t\t\t\t<mat-panel-description class=\"titleForm\">\n\t\t\t\t\t\t\t\t\t{{propriedade.get('label').value}}\n\t\t\t\t\t\t\t\t\t<mat-icon>{{propriedade.get('moreItemsIcon').value}}</mat-icon>\n\t\t\t\t\t\t\t\t</mat-panel-description>\n\t\t\t\t\t\t\t</mat-expansion-panel-header>\n\t\t\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t\t\t [showFieldsMoreItensConfig]=\"item.showFieldsMoreItensConfig\"\n\t\t\t\t\t\t\t [showFields]=\"item.showFields\"\n\t\t\t\t\t\t\t [formConfig]=\"item.formConfig\"\n\t\t\t\t\t\t\t [form]=\"item.form\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t\t\t </koala-dynamic-form>\n\t\t\t\t\t <mat-action-row\n\t\t\t\t\t\t *ngIf=\"propriedade.get('moreItemsConfig').value.length > propriedade.get('moreItemsMinItems').value\">\n\t\t\t\t\t <button\n\t\t\t\t\t\t (click)=\"removeMoreItem(i, propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems)\"\n\t\t\t\t\t\t mat-icon-button>\n\t\t\t\t\t\t <mat-icon>delete</mat-icon>\n\t\t\t\t\t </button>\n\t\t\t\t\t </mat-action-row>\n\t\t\t\t\t </mat-expansion-panel>\n\t\t\t\t </mat-accordion>\n\t\t\t </fieldset>\n\t\t </div>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.autocomplete\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}} {{propriedade.get('multiple').value &&\n\t propriedade.get('required').value ? '*' : ''}}</mat-label>\n\t\t\t <div *ngIf=\"propriedade.get('multiple').value else single\">\n\t <mat-chip-list #chipList>\n\t <mat-chip\n\t\t (removed)=\"removeOptionOnAutocomplete(i, option)\"\n\t\t *ngFor=\"let option of propriedade.get('autocompleteSelectedValue').value\"\n\t\t [color]=\"getColorChip(propriedade.get('autocompleteMultipleConfig').value | async)\"\n\t\t [removable]=\"true\"\n\t\t [selectable]=\"true\">\n\t {{display(option)}}\n\t\t <mat-icon matChipRemove>cancel</mat-icon>\n\t </mat-chip>\n\t <input\n\t\t #autocompleteInput\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [matAutocomplete]=\"auto\"\n\t\t [matChipInputFor]=\"chipList\"\n [tabIndex]=\"tabIndexStart + i\"\n autocomplete=\"off\"\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"text\"\n\t\t placeholder=\"Selecione um ou mais op\u00E7\u00F5es...\">\n\t </mat-chip-list>\n\t </div>\n\t <ng-template #single>\n\t\t <input\n\t\t\t [matAutocomplete]=\"auto\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n autocomplete=\"off\"\n\t\t\t formControlName=\"value\"\n\t\t\t matInput\n\t\t\t placeholder=\"Selecione uma op\u00E7\u00E3o...\"\n\t\t\t type=\"text\">\n\t </ng-template>\n\t <mat-spinner *ngIf=\"propriedade.get('autocompleteLoading').value | async\" color=\"primary\"\n\t matSuffix></mat-spinner>\n\t <button\n\t\t (click)=\"clearAutocomplete(i)\"\n\t\t *ngIf=\"\n\t !(propriedade.get('autocompleteLoading').value | async) &&\n\t !propriedade.get('disabled').value\"\n\t\t color=\"warn\"\n\t\t mat-icon-button\n\t\t matSuffix\n\t\t type=\"button\">\n\t <mat-icon>close</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required || propriedade.get('value').errors?.autocompleteSelected\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getAutocompleteMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t <mat-autocomplete\n\t\t #auto=\"matAutocomplete\"\n\t\t [displayWith]=\"display\" autoActiveFirstOption>\n\t\t <div *ngIf=\"(getAutocompleteOptions(propriedade) | async) as options\">\n\t\t <mat-option *ngFor=\"let option of options\" [value]=\"option\">\n\t\t {{option.name}}\n\t\t </mat-option>\n\t\t </div>\n\t </mat-autocomplete>\n\t </mat-form-field>\n\t\t <div *ngIf=\"propriedade.get('type').value == typeField.file\">\n\t\t\t <koala-file-button\n\t\t\t\t (getFiles)=\"propriedade.get('value').setValue($event)\"\n\t\t\t\t [accept]=\"propriedade.get('fileButtonConfig').value.accept\"\n\t\t\t\t [backgroundColor]=\"propriedade.get('fileButtonConfig').value.backgroundColor\"\n\t\t\t\t [color]=\"propriedade.get('fileButtonConfig').value.color\"\n\t\t\t\t [disabled]=\"propriedade.get('disabled').value\"\n\t\t\t\t [icon]=\"propriedade.get('fileButtonConfig').value.icon\"\n\t\t\t\t [multiple]=\"propriedade.get('multiple').value\"\n\t\t\t\t [text]=\"propriedade.get('fileButtonConfig').value.text\">\n\t\t\t </koala-file-button>\n\t\t </div>\n\t\t <div *ngIf=\"\n\t\t propriedade.get('type').value == typeField.dynamicForm &&\n\t\t\t\t(getDynamicFormConfig(propriedade) | async) as dynamicFormConfig\">\n\t\t\t <fieldset *ngIf=\"propriedade.get('label').value else dynamicFormWithoutLabel\">\n\t\t\t\t <legend>{{propriedade.get('label').value}}</legend>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </fieldset>\n\t\t\t <ng-template #dynamicFormWithoutLabel>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </ng-template>\n\t\t </div>\n <div\n class=\"radio-btn-group\"\n *ngIf=\"propriedade.get('type').value == typeField.radio\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-radio-group formControlName=\"value\">\n <label *ngIf=\"propriedade.get('label').value\">{{propriedade.get('label').value}}</label>\n <mat-radio-button\n [tabIndex]=\"tabIndexStart + i\"\n *ngFor=\"let options of propriedade.get('opcoesSelect').value\"\n [value]=\"options.value\">\n {{options.name}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\t </div>\n </div>\n <ng-content select=\"[btn-submit]\"></ng-content>\n</div>\n", styles: [".more-items-content fieldset{border:1px solid #cccccc;padding:16px}.more-items-content fieldset legend{font-family:Josefin Sans,sans-serif;font-size:11px;font-weight:700;padding:0 8px}.more-items-content .items .titleForm{color:#616161}.more-items-content .items .mat-expansion-panel-header-title,.more-items-content .items .mat-expansion-panel-header-description{flex-basis:0}.more-items-content .items .mat-expansion-panel-header-description{align-items:center;justify-content:space-between}.more-items-content .items .mat-form-field+.mat-form-field{margin-left:8px}.radio-btn-group label{position:relative;display:block;padding:10px 0}.text-obs{background:#eeeeee;border-radius:5px;color:#212121;font-family:OpenSansLight,sans-serif;height:150px;margin:0 auto 10px;overflow-y:auto;padding:10px;position:relative;width:calc(100% - 27px)}.select-multiple-native{margin-bottom:15px}.select-multiple-native select{width:100%;height:150px;background:transparent;border:none}.select-multiple-native select:focus,.select-multiple-native select:active{outline:none}.select-multiple-native select option{padding:5px 10px;font-family:JosefinSans,sans-serif}.select-multiple-native select option:checked{background:#f1f1f1!important}\n"] }]
564
+ args: [{ selector: 'koala-dynamic-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [formGroup]=\"form\" class=\"p-relative w-100\">\n <div *ngFor=\"let propriedade of controls?.controls; let i = index;\"\n [ngClass]=\"(propriedade.get('show').value | async) ? propriedade.get('class').value : 'd-none'\"\n formArrayName=\"formData\">\n\t <div *ngIf=\"propriedade.get('show').value | async\">\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.text ||\n\t propriedade.get('type').value == typeField.password ||\n\t propriedade.get('type').value == typeField.cpf ||\n\t propriedade.get('type').value == typeField.cnpj ||\n\t propriedade.get('type').value == typeField.datetime ||\n\t propriedade.get('type').value == typeField.email ||\n\t propriedade.get('type').value == typeField.number ||\n\t propriedade.get('type').value == typeField.stringNumber ||\n\t propriedade.get('type').value == typeField.time ||\n\t propriedade.get('type').value == typeField.date ||\n\t propriedade.get('type').value == typeField.hoursAndMinutes ||\n\t propriedade.get('type').value == typeField.phone ||\n\t propriedade.get('type').value == typeField.percent ||\n\t propriedade.get('type').value == typeField.color ||\n\t propriedade.get('type').value == typeField.month ||\n\t propriedade.get('type').value == typeField.competenceDate ||\n propriedade.get('type').value == typeField.stringWithCustomMasc\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [dropSpecialCharacters]=\"false\"\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t (keyup)=\"hoursAndMinutesApplyMask(i, $event)\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [tabIndex]=\"tabIndexStart + i\"\n\t\t [mask]=\"((propriedade.get('type').value == typeField.competenceDate) ? '00/0000' : null) ||\n\t\t ((propriedade.get('type').value == typeField.phone) ? '(00)0000-0000?0' : null) ||\n\t\t ((propriedade.get('type').value == typeField.stringNumber) ? '0{'+propriedade.get('maxLength').value+'}' : null) ||\n ((propriedade.get('type').value == typeField.cpf) ? '000.000.000-00' : null) ||\n ((propriedade.get('type').value == typeField.cnpj) ? '00.000.000/0000-00' : null) ||\n ((propriedade.get('type').value == typeField.percent) ? 'percent' : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.hoursAndMinutes) ? hoursAndMinutesMask : null) ||\n\t\t\t\t\t\t\t\t\t((propriedade.get('type').value == typeField.stringWithCustomMasc) ? propriedade.get('customMasc').value : null)\"\n\t\t [validation]=\"\n\t (propriedade.get('type').value == typeField.cpf && propriedade.get('value').errors?.cpfInvalid) ||\n\t (propriedade.get('type').value == typeField.cnpj && propriedade.get('value').errors?.cnpjInvalid)\"\n\t\t [type]=\"((propriedade.get('type').value == typeField.cpf ||\n propriedade.get('type').value == typeField.cnpj ||\n propriedade.get('type').value == typeField.phone ||\n propriedade.get('type').value == typeField.percent\n )) ? 'tel' : (\n propriedade.get('type').value == typeField.month ?\n 'month' : (\n propriedade.get('type').value == typeField.date ?\n 'date' : (\n propriedade.get('type').value == typeField.datetime ?\n 'datetime-local' : (\n propriedade.get('type').value == typeField.email ?\n 'email' : (\n propriedade.get('type').value == typeField.number ?\n 'number' : (\n propriedade.get('type').value == typeField.time ?\n 'time' : (\n propriedade.get('type').value == typeField.password ?\n 'password' : (\n propriedade.get('type').value == typeField.color ?\n 'color' : 'text'))))))))\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n [thousandSeparator]=\"propriedade.get('customMascThousandSeparator').value\"\n [suffix]=\"propriedade.get('customMascSuffix').value\"\n [prefix]=\"propriedade.get('customMascPrefix').value\"\n separatorLimit=\"0\"\n autocomplete=\"-1\"\n\t\t formControlName=\"value\"\n\t\t matInput/>\n\t <button\n\t\t (click)=\"passwordView(i)\"\n\t\t *ngIf=\"propriedade.get('hidePassword').value !== null\"\n\t\t [attr.aria-label]=\"'Hide password'\"\n\t\t [attr.aria-pressed]=\"propriedade.get('hidePassword').value\"\n\t\t mat-icon-button matSuffix tabindex=\"-1\" type=\"button\">\n\t <mat-icon>{{propriedade.get('hidePassword').value ? 'visibility_off' : 'visibility'}}</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cpfInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.cnpjInvalid\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.email\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getInvalidMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMin\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMinMessage()}}\n {{propriedade.get('min').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.dateMax\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getDateMaxMessage()}}\n {{propriedade.get('max').value | date:\"shortDate\"}}.\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.coin\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <input\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n autocomplete=\"-1\"\n\t\t currencyMask\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"tel\"/>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n *ngIf=\"propriedade.get('type').value == typeField.float\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <input\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [min]=\"propriedade.get('min').value\"\n [max]=\"propriedade.get('max').value\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n autocomplete=\"-1\"\n currencyMask\n [options]=\"{prefix: ''}\"\n formControlName=\"value\"\n matInput\n type=\"tel\"/>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.min\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinMessage(propriedade.get('min').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.max\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxMessage(propriedade.get('max').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.valueList ||\n\t propriedade.get('type').value == typeField.textarea\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.textLogs\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <div [innerHTML]=\"propriedade.get('textLogs').value\" class=\"text-obs\"></div>\n\t <textarea\n #textarea\n\t\t [koalaAutoFocus]=\"propriedade.get('focus').value\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n\t\t [cdkAutosizeMaxRows]=\"8\"\n\t\t [cdkAutosizeMinRows]=\"3\"\n\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n [minLength]=\"propriedade.get('minLength').value\"\n [maxLength]=\"propriedade.get('maxLength').value\"\n\t\t formControlName=\"value\"\n\t\t matInput>\n\t </textarea>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n <mat-hint align=\"end\" *ngIf=\"propriedade.get('maxLength').value\">\n {{textarea.value.length}}/{{propriedade.get('maxLength').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.minLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMinLengthMessage(propriedade.get('minLength').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.maxLength\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getMaxLengthMessage(propriedade.get('maxLength').value)}}\n </mat-error>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n\t <mat-form-field\n\t\t *ngIf=\"propriedade.get('type').value == typeField.select\"\n\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}}</mat-label>\n\t <mat-select [multiple]=\"propriedade.get('multiple').value\" [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\" formControlName=\"value\">\n\t <mat-option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n\t {{options.name}}\n\t </mat-option>\n\t </mat-select>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t </mat-form-field>\n <mat-form-field\n class=\"select-multiple-native\"\n *ngIf=\"propriedade.get('type').value == typeField.selectMultipleNative\"\n [appearance]=\"propriedade.get('appearance').value\"\n [floatLabel]=\"propriedade.get('floatLabel').value\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-label>{{propriedade.get('label').value}}</mat-label>\n <select\n matNativeControl\n formControlName=\"value\"\n multiple\n [tabIndex]=\"tabIndexStart + i\"\n [required]=\"propriedade.get('required').value\">\n <option *ngFor=\"let options of propriedade.get('opcoesSelect').value\" [value]=\"options.value\">\n {{options.name}}\n </option>\n </select>\n <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n <mat-icon>info</mat-icon>\n {{propriedade.get('textHint').value}}\n </mat-hint>\n <mat-error *ngIf=\"propriedade.get('value').errors?.required\">\n <mat-icon>error</mat-icon>\n {{errorMessage.getRequiredMessage(propriedade.get('label').value)}}\n </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n </mat-form-field>\n\t <div\n\t\t *ngIf=\"propriedade.get('type').value == typeField.checkbox\"\n\t\t [formGroupName]=\"i\"\n\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-checkbox\n [tabIndex]=\"tabIndexStart + i\"\n\t\t formControlName=\"value\"\n\t\t value=\"true\">\n\t {{propriedade.get('label').value}}\n\t </mat-checkbox>\n\t </div>\n\t\t <div\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.moreItems\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\"\n\t\t\t class=\"more-items-content\">\n\t\t\t <fieldset>\n\t\t\t\t <legend>\n\t\t\t\t\t <koala-button\n\t\t\t\t\t\t (click)=\"addMoreItem(i)\"\n\t\t\t\t\t\t [disabled]=\"propriedade.get('moreItemsConfig').value.length === propriedade.get('moreItemsMaxItems').value\"\n\t\t\t\t\t\t [tooltip]=\"propriedade.get('moreItemsButtonIconAddlabel').value\"\n\t\t\t\t\t\t [backgroundColor]=\"propriedade.get('moreItemsIconBackgroundColor').value\"\n [color]=\"propriedade.get('moreItemsIconFontColor').value\"\n\t\t\t\t\t\t class=\"btn-add-more-items\"\n\t\t\t\t\t\t icon=\"add\">\n\t\t\t\t\t </koala-button>\n\t\t\t\t\t {{propriedade.get('label').value}} (Min.: {{propriedade.get('moreItemsMinItems').value}}\n\t\t\t\t\t | M\u00E1x.: {{propriedade.get('moreItemsMaxItems').value}})\n\t\t\t\t </legend>\n\t\t\t\t <mat-accordion class=\"items\" multi>\n\t\t\t\t\t <mat-expansion-panel\n\t\t\t\t\t\t *ngFor=\"let item of propriedade.get('moreItemsConfig').value.slice().reverse(); index as indexMoreItems\"\n\t\t\t\t\t\t expanded>\n\t\t\t\t\t\t <mat-expansion-panel-header>\n\t\t\t\t\t\t\t\t<mat-panel-title class=\"titleForm\">#\n\t\t\t\t\t\t\t\t\t{{propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems + 1}}</mat-panel-title>\n\t\t\t\t\t\t\t\t<mat-panel-description class=\"titleForm\">\n\t\t\t\t\t\t\t\t\t{{propriedade.get('label').value}}\n\t\t\t\t\t\t\t\t\t<mat-icon>{{propriedade.get('moreItemsIcon').value}}</mat-icon>\n\t\t\t\t\t\t\t\t</mat-panel-description>\n\t\t\t\t\t\t\t</mat-expansion-panel-header>\n\t\t\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t\t\t [showFieldsMoreItensConfig]=\"item.showFieldsMoreItensConfig\"\n\t\t\t\t\t\t\t [showFields]=\"item.showFields\"\n\t\t\t\t\t\t\t [formConfig]=\"item.formConfig\"\n\t\t\t\t\t\t\t [form]=\"item.form\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t\t\t </koala-dynamic-form>\n\t\t\t\t\t <mat-action-row\n\t\t\t\t\t\t *ngIf=\"propriedade.get('moreItemsConfig').value.length > propriedade.get('moreItemsMinItems').value\">\n\t\t\t\t\t <button\n\t\t\t\t\t\t (click)=\"removeMoreItem(i, propriedade.get('moreItemsConfig').value.length - 1 - indexMoreItems)\"\n\t\t\t\t\t\t mat-icon-button>\n\t\t\t\t\t\t <mat-icon>delete</mat-icon>\n\t\t\t\t\t </button>\n\t\t\t\t\t </mat-action-row>\n\t\t\t\t\t </mat-expansion-panel>\n\t\t\t\t </mat-accordion>\n\t\t\t </fieldset>\n\t\t </div>\n\t\t <mat-form-field\n\t\t\t *ngIf=\"propriedade.get('type').value == typeField.autocomplete\"\n\t\t\t [appearance]=\"propriedade.get('appearance').value\"\n\t\t\t [floatLabel]=\"propriedade.get('floatLabel').value\"\n\t\t\t [formGroupName]=\"i\"\n\t\t\t [ngClass]=\"propriedade.get('fieldClass').value\">\n\t <mat-label>{{propriedade.get('label').value}} {{propriedade.get('multiple').value &&\n\t propriedade.get('required').value ? '*' : ''}}</mat-label>\n\t\t\t <div *ngIf=\"propriedade.get('multiple').value else single\">\n\t <mat-chip-list #chipList>\n\t <mat-chip\n\t\t (removed)=\"removeOptionOnAutocomplete(i, option)\"\n\t\t *ngFor=\"let option of propriedade.get('autocompleteSelectedValue').value\"\n\t\t [color]=\"getColorChip(propriedade.get('autocompleteMultipleConfig').value | async)\"\n\t\t [removable]=\"true\"\n\t\t [selectable]=\"true\">\n\t {{display(option)}}\n\t\t <mat-icon matChipRemove>cancel</mat-icon>\n\t </mat-chip>\n\t <input\n\t\t #autocompleteInput\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t [required]=\"propriedade.get('required').value\"\n\t\t [matAutocomplete]=\"auto\"\n\t\t [matChipInputFor]=\"chipList\"\n [tabIndex]=\"tabIndexStart + i\"\n autocomplete=\"-1\"\n\t\t formControlName=\"value\"\n\t\t matInput\n\t\t type=\"text\"\n\t\t placeholder=\"Selecione um ou mais op\u00E7\u00F5es...\">\n\t </mat-chip-list>\n\t </div>\n\t <ng-template #single>\n\t\t <input\n\t\t\t [matAutocomplete]=\"auto\"\n [koalaAutoFocus]=\"propriedade.get('focus').value\"\n\t\t\t [required]=\"propriedade.get('required').value\"\n [tabIndex]=\"tabIndexStart + i\"\n autocomplete=\"-1\"\n\t\t\t formControlName=\"value\"\n\t\t\t matInput\n\t\t\t placeholder=\"Selecione uma op\u00E7\u00E3o...\"\n\t\t\t type=\"text\">\n\t </ng-template>\n\t <mat-spinner *ngIf=\"propriedade.get('autocompleteLoading').value | async\" color=\"primary\"\n\t matSuffix></mat-spinner>\n\t <button\n\t\t (click)=\"clearAutocomplete(i)\"\n\t\t *ngIf=\"\n\t !(propriedade.get('autocompleteLoading').value | async) &&\n\t !propriedade.get('disabled').value\"\n\t\t color=\"warn\"\n\t\t mat-icon-button\n\t\t matSuffix\n\t\t type=\"button\">\n\t <mat-icon>close</mat-icon>\n\t </button>\n\t <mat-hint *ngIf=\"propriedade.get('textHint').value\">\n\t <mat-icon>info</mat-icon>\n\t\t {{propriedade.get('textHint').value}}\n\t </mat-hint>\n\t <mat-error *ngIf=\"propriedade.get('value').errors?.required || propriedade.get('value').errors?.autocompleteSelected\">\n\t <mat-icon>error</mat-icon>\n {{errorMessage.getAutocompleteMessage(propriedade.get('label').value)}}\n\t </mat-error>\n <mat-error *ngIf=\"propriedade.get('value').errors?.customError\">\n <mat-icon>error</mat-icon>\n {{propriedade.get('value').errors?.customError.message}}.\n </mat-error>\n\t <mat-autocomplete\n\t\t #auto=\"matAutocomplete\"\n\t\t [displayWith]=\"display\" autoActiveFirstOption>\n\t\t <div *ngIf=\"(getAutocompleteOptions(propriedade) | async) as options\">\n\t\t <mat-option *ngFor=\"let option of options\" [value]=\"option\">\n\t\t {{option.name}}\n\t\t </mat-option>\n\t\t </div>\n\t </mat-autocomplete>\n\t </mat-form-field>\n\t\t <div *ngIf=\"propriedade.get('type').value == typeField.file\">\n\t\t\t <koala-file-button\n\t\t\t\t (getFiles)=\"propriedade.get('value').setValue($event)\"\n\t\t\t\t [accept]=\"propriedade.get('fileButtonConfig').value.accept\"\n\t\t\t\t [backgroundColor]=\"propriedade.get('fileButtonConfig').value.backgroundColor\"\n\t\t\t\t [color]=\"propriedade.get('fileButtonConfig').value.color\"\n\t\t\t\t [disabled]=\"propriedade.get('disabled').value\"\n\t\t\t\t [icon]=\"propriedade.get('fileButtonConfig').value.icon\"\n\t\t\t\t [multiple]=\"propriedade.get('multiple').value\"\n\t\t\t\t [text]=\"propriedade.get('fileButtonConfig').value.text\">\n\t\t\t </koala-file-button>\n\t\t </div>\n\t\t <div *ngIf=\"\n\t\t propriedade.get('type').value == typeField.dynamicForm &&\n\t\t\t\t(getDynamicFormConfig(propriedade) | async) as dynamicFormConfig\">\n\t\t\t <fieldset *ngIf=\"propriedade.get('label').value else dynamicFormWithoutLabel\">\n\t\t\t\t <legend>{{propriedade.get('label').value}}</legend>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </fieldset>\n\t\t\t <ng-template #dynamicFormWithoutLabel>\n\t\t\t\t <koala-dynamic-form\n\t\t\t\t\t [formConfig]=\"dynamicFormConfig.formConfig\"\n\t\t\t\t\t [form]=\"dynamicFormConfig.form\"\n\t\t\t\t\t [setValues]=\"dynamicFormConfig.setValues\"\n\t\t\t\t\t [showFields]=\"dynamicFormConfig.showFields\"\n [tabIndexStart]=\"tabIndexStart + i\">\n\t\t\t\t </koala-dynamic-form>\n\t\t\t </ng-template>\n\t\t </div>\n <div\n class=\"radio-btn-group\"\n *ngIf=\"propriedade.get('type').value == typeField.radio\"\n [formGroupName]=\"i\"\n [ngClass]=\"propriedade.get('fieldClass').value\">\n <mat-radio-group formControlName=\"value\">\n <label *ngIf=\"propriedade.get('label').value\">{{propriedade.get('label').value}}</label>\n <mat-radio-button\n [tabIndex]=\"tabIndexStart + i\"\n *ngFor=\"let options of propriedade.get('opcoesSelect').value\"\n [value]=\"options.value\">\n {{options.name}}\n </mat-radio-button>\n </mat-radio-group>\n </div>\n\t </div>\n </div>\n <ng-content select=\"[btn-submit]\"></ng-content>\n</div>\n", styles: [".more-items-content fieldset{border:1px solid #cccccc;padding:16px}.more-items-content fieldset legend{font-family:Josefin Sans,sans-serif;font-size:11px;font-weight:700;padding:0 8px}.more-items-content .items .titleForm{color:#616161}.more-items-content .items .mat-expansion-panel-header-title,.more-items-content .items .mat-expansion-panel-header-description{flex-basis:0}.more-items-content .items .mat-expansion-panel-header-description{align-items:center;justify-content:space-between}.more-items-content .items .mat-form-field+.mat-form-field{margin-left:8px}.radio-btn-group label{position:relative;display:block;padding:10px 0}.text-obs{background:#eeeeee;border-radius:5px;color:#212121;font-family:OpenSansLight,sans-serif;height:150px;margin:0 auto 10px;overflow-y:auto;padding:10px;position:relative;width:calc(100% - 27px)}.select-multiple-native{margin-bottom:15px}.select-multiple-native select{width:100%;height:150px;background:transparent;border:none}.select-multiple-native select:focus,.select-multiple-native select:active{outline:none}.select-multiple-native select option{padding:5px 10px;font-family:JosefinSans,sans-serif}.select-multiple-native select option:checked{background:#f1f1f1!important}\n"] }]
565
565
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.KoalaDynamicFormService }]; }, propDecorators: { form: [{
566
566
  type: Input
567
567
  }], formConfig: [{
@@ -578,4 +578,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImpor
578
578
  type: ViewChild,
579
579
  args: ['autocompleteInput']
580
580
  }] } });
581
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUMsVUFBVSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBRWhHLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQVE3RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVF2RCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsWUFBWTtJQWNwRCxZQUNVLEVBQWUsRUFDZixrQkFBMkM7UUFFbkQsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUhmLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXlCO1FBVjVDLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBRTVCLGNBQVMsR0FBRyx3QkFBd0IsQ0FBQztRQUNyQyx3QkFBbUIsR0FBRyxRQUFRLENBQUM7UUFDL0IsaUJBQVksR0FBRyxtQkFBbUIsQ0FBQztJQVMxQyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNyRDtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFjLENBQUM7UUFDdkQsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUU7Z0JBQzFCLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2FBQ3RFO1lBQ0QsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ25ELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3hELE1BQU0sNEJBQTRCLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEtBQXlELENBQUM7Z0JBQ3JJLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsRUFBRTtvQkFDdkQsSUFBSSxlQUFlLEVBQUU7d0JBQ25CLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7NEJBQy9DLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFO2dDQUN6RixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDckUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7NkJBQzNDO3dCQUNILENBQUMsQ0FBQyxDQUFDO3FCQUNKO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUNFLE1BQU0sQ0FBQyxZQUFZO2dCQUNuQixNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFlBQVk7Z0JBQ3JELE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsV0FBVztnQkFDcEQsSUFBSSxDQUFDLHlCQUF5QixFQUM5QjtnQkFDQSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsWUFBWSxFQUFFO29CQUN6RCxNQUFNLDBCQUEwQixHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFvRSxDQUFDO29CQUNoSixJQUFJLDBCQUEwQixFQUFFO3dCQUM5QiwwQkFBMEIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3FCQUN0SDtpQkFDRjtnQkFDRCxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztxQkFDWixZQUFZO3FCQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ3ZCLFNBQVMsQ0FBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEVBQUU7b0JBQ3ZCLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUM5QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsWUFBWSxFQUFFO3dCQUN6RCxJQUNFLEtBQUssSUFBSSxDQUNQLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDOzRCQUM3QixLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQzs0QkFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUNoQyxJQUFJLENBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7NEJBQ3BCLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUNuQyxFQUFFOzRCQUNILElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0NBQ3RDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtvQ0FDeEIsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQ0FDOUQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztpQ0FDakY7cUNBQU07b0NBQ0wsSUFBSSxJQUFJLENBQUMsMEJBQTBCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTt3Q0FDL0YsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7cUNBQ2pFO2lDQUNGO2dDQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLGFBQWEsRUFBRTtvQ0FDekMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO2lDQUNqRDs2QkFDRjtpQ0FBTTtnQ0FDTCxZQUFZLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUMvRDt5QkFDRjs2QkFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUU7NEJBQzlDLFlBQVksQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7aUNBQzFFLEtBQUssRUFBa0M7aUNBQ3ZDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUM7aUNBQzlDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLCtCQUErQixJQUFJLElBQUksQ0FBQyxDQUFDO3lCQUM1RDt3QkFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsWUFBWSxFQUFFOzRCQUN6RCxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxLQUFLLEVBQUU7Z0NBQ3JDLE1BQU0sMEJBQTBCLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEtBQW9FLENBQUM7Z0NBQ2hKLFlBQVksQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FDaEYsMEJBQTBCLENBQUMsS0FBSyxFQUNoQyxLQUFLLENBQ04sQ0FBQyxDQUFDOzZCQUNKO2lDQUFNLElBQUksTUFBTSxDQUFDLGdCQUFnQixLQUFLLFVBQVUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0NBQzlFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFpQyxDQUFDO2dDQUN6RixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUNsQixNQUFNLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29DQUNuRCxZQUFZLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQ0FDcEUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDckIsQ0FBQyxDQUFDLENBQUM7NkJBQ0o7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO3dCQUN2QixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsWUFBWSxFQUFFOzRCQUN6RCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQ0FDcEMsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQ0FDN0UsWUFBWSxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQzlFLENBQUMsQ0FBQzt5QkFDSjs2QkFBTTs0QkFDTCxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUM1QjtxQkFDRjtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNoQjtZQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pDLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRTtnQkFDMUIsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFO29CQUNoQyxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxFQUFFO3dCQUN2RCxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUU7NEJBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7eUJBQy9CO3FCQUNGO2lCQUNGO2dCQUNELElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUU7b0JBQ3BDLE1BQU0sQ0FBQyxlQUFlO3lCQUNmLFNBQVM7eUJBQ1QsU0FBUyxDQUFDLEtBQUssRUFBQyxNQUFNLEVBQUMsRUFBRTt3QkFDeEIsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTs0QkFDckIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRTtnQ0FDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtvQ0FDakYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQ0FDL0I7Z0NBQ0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQ0FDZCxJQUFJLENBQUMsaUJBQWlCLENBQ3BCLFNBQVMsRUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUNsRixDQUFDO2dDQUNKLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFDVixDQUFDLENBQUMsQ0FBQzt5QkFDSjtvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDVjthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pEO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7SUFFTSx3QkFBd0IsQ0FBQyxLQUFhLEVBQUUsS0FBb0I7UUFDakUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFpQyxDQUFDO1FBQ3BFLElBQUksSUFBSSxLQUFLLHdCQUF3QixDQUFDLGVBQWUsRUFBRTtZQUNyRCxNQUFNLEtBQUssR0FBRyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUMxQyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksV0FBVyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNoRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsUUFBUSxDQUFDO2FBQ3JDO2lCQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxXQUFXLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7Z0JBQ3hELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxRQUFRLENBQUM7YUFDckM7U0FDRjtJQUNILENBQUM7SUFFTSxZQUFZLENBQUMsS0FBYTtRQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3pELE9BQU8sRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BELE9BQU8sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2Qsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsd0JBQXdCLENBQUMsSUFBSSxDQUMxRCxDQUFDO0lBQ0osQ0FBQztJQUVNLFdBQVcsQ0FBQyxTQUFpQjtRQUNsQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsS0FBSyxFQUFFO1lBQzVJLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ2xFLElBQUksRUFBRSxTQUFTO2dCQUNmLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxVQUFVO2dCQUNqRSxVQUFVLEVBQUUsSUFBSSxlQUFlLENBQXFELEVBQUUsQ0FBQztnQkFDdkYseUJBQXlCLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCO2FBQ3ZGLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsQ0FDakUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQzFFLENBQUM7WUFDRixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBYyxDQUFDO1lBQ3BHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFFTSxjQUFjLENBQUMsU0FBaUIsRUFBRSxXQUFXO1FBQ2xELE1BQU0saUJBQWlCLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN2SCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBRU0saUJBQWlCLENBQUMsU0FBaUI7UUFDeEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFO1lBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoRixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQy9EO2FBQU07WUFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQywrQkFBK0IsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUNoSixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsK0JBQStCLElBQUksSUFBSSxDQUFDLENBQUM7U0FDN0g7SUFDSCxDQUFDO0lBRU0sT0FBTyxDQUFDLE1BQWlEO1FBQzlELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDMUMsQ0FBQztJQUVNLDBCQUEwQixDQUFDLFNBQWlCLEVBQUUsTUFBZ0Q7UUFDbkcsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxNQUFNLENBQStDLENBQUM7UUFDckssSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25GLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0Q7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBWSxFQUFFO1lBQ2xELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN4RTtJQUNILENBQUM7SUFFTSxZQUFZLENBQUMsTUFBMkQ7UUFDN0UsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFTSxzQkFBc0IsQ0FBQyxXQUE0QjtRQUN4RCxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxLQUErQixDQUFDO0lBQ3hGLENBQUM7SUFFTSxvQkFBb0IsQ0FBQyxXQUE0QjtRQUN0RCxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxLQUF5RCxDQUFDO0lBQ3hHLENBQUM7SUFFTyxVQUFVLENBQUMsTUFBc0M7UUFDdkQsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDN0MsSUFBSSxLQUFLLEdBQVEsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDcEMsSUFBSSx5QkFBeUIsR0FBMEYsQ0FDckgsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsSUFBSSxJQUFJLENBQUMsQ0FDeEUsQ0FBQztRQUVGLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkUsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRO1lBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlGLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUTtZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RixJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsSUFBSTtZQUM3QyxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFFBQVE7WUFDakQsTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxJQUFJLEVBQzdDO1lBQ0EsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUU7Z0JBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUFFO1lBQ3BHLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFO2dCQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFBRTtTQUNyRztRQUNELElBQUksTUFBTSxDQUFDLFNBQVM7WUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxNQUFNLENBQUMsU0FBUztZQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUU5RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsR0FBRyxFQUFFO1lBQ2hELFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDL0I7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsSUFBSSxFQUFFO1lBQ3hELFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDaEM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsS0FBSyxFQUFFO1lBQ3pELFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFlBQVksRUFBRTtZQUNoRSxJQUFJLEtBQUssRUFBRTtnQkFDVCx5QkFBeUIsR0FBRyxLQUFLLENBQUM7Z0JBQ2xDLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsRTtZQUNELElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUU7Z0JBQzVCLFVBQVUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQzthQUNoRDtTQUNGO2FBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFFBQVEsRUFBRTtZQUM1RCxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7U0FDL0I7UUFFRCxJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsZUFBZTtZQUN4RCxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFDakI7WUFDQSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsUUFBUSxDQUFDO1NBQ3JDO1FBRUQsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUU7WUFDNUIsTUFBTSxzQkFBc0IsR0FBRyxFQUFxQyxDQUFDO1lBQ3JFLE1BQU0sQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDaEUsc0JBQXNCLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDNUQsTUFBTSxDQUFDLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO1NBQ25EO1FBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRTtZQUN6QixVQUFVLEdBQUcsRUFBRSxDQUFDO1NBQ2pCO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDMUIsSUFBSSxFQUFFLENBQUMsSUFBSSxlQUFlLENBQVUsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQztZQUN6RCxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ3JCLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbkIsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNuQixnQkFBZ0IsRUFBRSxDQUFDO29CQUNqQixJQUFJLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLElBQUksSUFBSSxhQUFhO29CQUNyRCxJQUFJLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLElBQUksSUFBSSw2QkFBNkI7b0JBQ3JFLGVBQWUsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxJQUFJLE9BQU87b0JBQ3JFLEtBQUssRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxJQUFJLE1BQU07b0JBQ2hELE1BQU0sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxJQUFJLEdBQUc7aUJBQ2hELENBQUM7WUFDRixpQkFBaUIsRUFBRSxDQUFDLElBQUksZUFBZSxDQUFrQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNuRyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUMvQixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQy9CLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDakMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNyQixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQy9CLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDM0IsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7WUFDcEMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDdEIsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDaEMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7WUFDbEMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUM7WUFDcEMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7WUFDcEMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7WUFDOUIsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7WUFDcEMsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7WUFDekMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDN0UsMkJBQTJCLEVBQUUsQ0FBQyxNQUFNLENBQUMsMkJBQTJCLENBQUM7WUFDakUsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO1lBQ2xELGlCQUFpQixFQUFFLENBQUMsTUFBTSxDQUFDLGlCQUFpQixJQUFJLEdBQUcsQ0FBQztZQUNwRCxhQUFhLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1lBQ3JDLHNCQUFzQixFQUFFLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1lBQ3ZELDRCQUE0QixFQUFFLENBQUMsTUFBTSxDQUFDLDRCQUE0QixDQUFDO1lBQ25FLGlCQUFpQixFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNyQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztZQUMxRCxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztZQUNqRCwwQkFBMEIsRUFBRSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQztZQUMvRCwyQkFBMkIsRUFBRSxDQUFDLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzNELHlCQUF5QixFQUFFLENBQUMseUJBQXlCLENBQUM7WUFDdEQsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQztZQUMzQixVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO1lBQ2hDLDJCQUEyQixFQUFFLENBQUMsTUFBTSxFQUFFLDJCQUEyQixJQUFJLEVBQUUsQ0FBQztZQUN4RSxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsSUFBSSxFQUFFLENBQUM7WUFDbEQsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLElBQUksRUFBRSxDQUFDO1lBQ2xELEtBQUssRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUM7U0FDaEYsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEtBQUssVUFBVSxFQUFFO1lBQzFDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxLQUFpQyxDQUFDO1lBQ2xGLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEIsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDaEQsS0FBSyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzdELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE9BQXlELEVBQUUsSUFBZTtRQUNsRyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLElBQUksSUFBSSxFQUFFO2dCQUNSLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFjLENBQUM7Z0JBQ3BELEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDdEM7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQThELEVBQUUsSUFBZTtRQUM1RyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM3QyxJQUFJLElBQUksRUFBRTtnQkFDUixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBYyxDQUFDO2dCQUNwRCxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDaEMsS0FBSyxNQUFNLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUU7d0JBQ2xFLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRTs0QkFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDMUMsTUFBTSxNQUFNLEdBQW1DLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDOzRCQUNyRixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0NBQ2IsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO2dDQUNwQixJQUFJLE1BQU0sRUFBRTtvQ0FDVixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsV0FBVyxFQUFFO3dDQUN4RCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQWMsQ0FBQzt3Q0FDeEUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsQ0FBQztxQ0FDMUQ7eUNBQU07d0NBQ0wsVUFBVSxHQUFHLE1BQU0sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO3dDQUN6QyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFOzRDQUM1QixVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQzt5Q0FDdEM7d0NBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLEdBQUcsRUFBRTs0Q0FDaEQsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzt5Q0FDL0I7NkNBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLElBQUksRUFBRTs0Q0FDeEQsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzt5Q0FDaEM7NkNBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLEtBQUssRUFBRTs0Q0FDekQsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7eUNBQ25DOzZDQUFNLElBQ0wsTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJOzRDQUN4QixNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFlBQVksRUFDckQ7NENBQ0EsVUFBVSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO3lDQUNoRDt3Q0FFRCxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksT0FBTyxNQUFNLENBQUMsR0FBRyxLQUFLLFFBQVE7NENBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dDQUM5RixJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksT0FBTyxNQUFNLENBQUMsR0FBRyxLQUFLLFFBQVE7NENBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dDQUM5RixJQUNFLE1BQU0sQ0FBQyxJQUFJLEtBQUssd0JBQXdCLENBQUMsSUFBSTs0Q0FDN0MsTUFBTSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FBQyxRQUFROzRDQUNqRCxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLElBQUksRUFDN0M7NENBQ0EsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUU7Z0RBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs2Q0FBRTs0Q0FDcEcsSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUU7Z0RBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs2Q0FBRTt5Q0FDckc7d0NBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUzs0Q0FBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7d0NBQzlFLElBQUksTUFBTSxDQUFDLFNBQVM7NENBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3dDQUU5RSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3Q0FDL0MsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFOzRDQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQzt5Q0FDakU7cUNBQ0Y7b0NBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO29DQUM5QyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTt3Q0FDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7cUNBQ3JDO2lDQUNGOzZCQUNGO2lDQUFNO2dDQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUM7Z0NBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQ0FDNUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQ0FFOUMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLHdCQUF3QixDQUFDLFdBQVcsRUFBRTtvQ0FDeEQsTUFBTSxTQUFTLEdBQUcsT0FBb0IsQ0FBQztvQ0FDdkMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29DQUM1QyxTQUFTLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUNBQzdEOzZCQUNGOzRCQUNELE1BQU07eUJBQ1A7cUJBQ0Y7aUJBQ0Y7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEdBQStDLEVBQUUsS0FBYTtRQUN2RixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDekIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7Z0JBQzdCLElBQUksTUFBTSxFQUFFO29CQUNWLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDaEIsS0FBSyxDQUFDLFdBQVcsRUFBRTt5QkFDYixLQUFLLENBQUMsR0FBRyxDQUFDO3lCQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDZCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTs0QkFDL0MsSUFBSSxHQUFHLEtBQUssQ0FBQzs0QkFDYixPQUFPLEtBQUssQ0FBQzt5QkFDZDtvQkFDSCxDQUFDLENBQUMsQ0FBQztvQkFFUixPQUFPLElBQUksQ0FBQztpQkFDYjthQUNGO2lCQUFNO2dCQUNMLE9BQU8sSUFBSSxDQUFDO2FBQ2I7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxjQUFjLENBQUMsU0FBb0IsRUFBRSxJQUFtQztRQUM5RSxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNqQyxJQUFJLGtCQUFvRSxDQUFDO2dCQUN6RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QixHQUFHO29CQUNELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7b0JBQzdHLElBQUksYUFBYSxLQUFLLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUM1QyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsS0FBSyxDQUFDO3dCQUM1RCxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDbEQsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDdEYsSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFO2dDQUN6QixXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dDQUNyRixJQUFJLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3dDQUN6QyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7cUNBQ2xCLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7NkJBQ2pCO2lDQUFNO2dDQUNMLFdBQVcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQWtDLENBQUM7d0NBQzVFLElBQUksRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7d0NBQ3pDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztxQ0FDbEIsQ0FBQyxDQUFDLENBQUM7NkJBQ0w7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsYUFBYSxFQUFFLENBQUM7aUJBQ2pCLFFBQVEsYUFBYSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2FBQ2xEO2lCQUFNO2dCQUNMLEtBQUssTUFBTSxPQUFPLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDakQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO3dCQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzFDLE1BQU07cUJBQ1A7aUJBQ0Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxZQUF1QjtRQUN4RCxJQUFJLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtZQUNsQyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUM5QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMseUJBQXlCO2lCQUN6QixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUNyRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ2IsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN4QixPQUFPLENBQUMsQ0FBQztpQkFDVjtnQkFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ1osQ0FBQyxDQUFDLENBQUM7WUFDdkIsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7Z0JBQzVCLElBQUksTUFBTSxFQUFFO29CQUNWLElBQUksTUFBTSxDQUFDLGlCQUFpQixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7d0JBQ3BELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFFBQVE7NkJBQ1IsUUFBUTs2QkFDUixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FDZCxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDNUQsQ0FBQzt3QkFDdkMsTUFBTSx3QkFBd0IsR0FBRyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxLQUF5RCxDQUFDO3dCQUM3SSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3BDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNmLHdCQUF3QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztxQkFDaEU7b0JBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FDaEMsSUFBSSxDQUFDLFVBQVUsRUFDZixNQUFNLENBQUMsWUFBWSxFQUNuQixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUNwQixNQUFNLENBQUMsaUJBQWlCLENBQ3pCLENBQUM7aUJBQ0g7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVPLDBCQUEwQixDQUFDLGNBQTBELEVBQUUsS0FBK0M7UUFDNUksSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRW5CLEtBQUssTUFBTSxZQUFZLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xELElBQUksWUFBWSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFFO2dCQUNwQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNoQixNQUFNO2FBQ1A7U0FDRjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7O2lIQWxqQlUsb0JBQW9CO3FHQUFwQixvQkFBb0IsdVlDOUJqQyxzczVCQW1rQkEsbzJGRHJpQmEsb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBTmhDLFNBQVM7K0JBQ0Usb0JBQW9CLG1CQUdiLHVCQUF1QixDQUFDLE1BQU07d0lBR3RDLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFNMEIsaUJBQWlCO3NCQUFoRCxTQUFTO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycywgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1maWVsZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtIH0gZnJvbSAnLi9lbnVtcy9keW5hbWljLWZvcm0tdHlwZS1maWVsZC5lbnVtJztcbmltcG9ydCB7IENwZlZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9ycy9jcGYudmFsaWRhdG9yJztcbmltcG9ydCB7IENucGpWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMvY25wai52YWxpZGF0b3InO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQWJzdHJhY3QgfSBmcm9tICcuLi9mb3JtLmFic3RyYWN0JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1zZXQtdmFsdWUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3JzL2F1dG9jb21wbGV0ZS1zZWxlY3RlZC52YWxpZGF0b3InO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWF1dG9jb21wbGV0ZS1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtU2hvd0ZpZWxkSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1zaG93LWZpZWxkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtU2VydmljZSB9IGZyb20gJy4va29hbGEuZHluYW1pYy1mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybU1vcmVJdGVuc1Nob3dGaWVsZENvbmZpZ0ludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWZvcm0tbW9yZS1pdGVucy1zaG93LWZpZWxkLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtQXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWdJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1mb3JtLWF1dG9jb21wbGV0ZS1tdWx0aXBsZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1mb3JtLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwiQGtvYWxhcngvdXRpbHMvb3BlcmF0b3JzL2RlbGF5XCI7XG5pbXBvcnQgeyBrb2FsYSB9IGZyb20gXCJAa29hbGFyeC91dGlsc1wiO1xuaW1wb3J0IHsgRGF0ZU1pblZhbGlkYXRvciB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvZGF0ZS1taW4udmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBEYXRlTWF4VmFsaWRhdG9yIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9kYXRlLW1heC52YWxpZGF0b3JcIjtcbmltcG9ydCB7IEtvYWxhTGFuZ3VhZ2VIZWxwZXIgfSBmcm9tIFwiQGtvYWxhcngvdWkvY29yZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdrb2FsYS1keW5hbWljLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJ2R5bmFtaWMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydkeW5hbWljLWZvcm0uY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybUNvbXBvbmVudCBleHRlbmRzIEZvcm1BYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGZvcm06IEZvcm1Hcm91cDtcbiAgQElucHV0KCkgZm9ybUNvbmZpZzogS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlW107XG4gIEBJbnB1dCgpIHNob3dGaWVsZHM6IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtU2hvd0ZpZWxkSW50ZXJmYWNlW10+O1xuICBASW5wdXQoKSBzaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnOiBLb2FsYUR5bmFtaWNGb3JtTW9yZUl0ZW5zU2hvd0ZpZWxkQ29uZmlnSW50ZXJmYWNlW107XG4gIEBJbnB1dCgpIHNldFZhbHVlczogQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+O1xuICBASW5wdXQoKSB0YWJJbmRleFN0YXJ0OiBudW1iZXIgPSAxO1xuICBwdWJsaWMgY29udHJvbHM6IEZvcm1BcnJheTtcbiAgcHVibGljIHR5cGVGaWVsZCA9IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bTtcbiAgcHVibGljIGhvdXJzQW5kTWludXRlc01hc2sgPSAnMDA6MDAwJztcbiAgcHVibGljIGVycm9yTWVzc2FnZSA9IEtvYWxhTGFuZ3VhZ2VIZWxwZXI7XG5cbiAgQFZpZXdDaGlsZCgnYXV0b2NvbXBsZXRlSW5wdXQnKSBhdXRvY29tcGxldGVJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGR5bmFtaWNGb3JtU2VydmljZTogS29hbGFEeW5hbWljRm9ybVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKCkgPT4gdGhpcy5mb3JtKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5mb3JtLmdldCgnZm9ybURhdGEnKSkge1xuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woJ2Zvcm1EYXRhJywgdGhpcy5mYi5hcnJheShbXSkpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRyb2xzID0gdGhpcy5mb3JtLmdldCgnZm9ybURhdGEnKSBhcyBGb3JtQXJyYXk7XG4gICAgdGhpcy5mb3JtQ29uZmlnPy5mb3JFYWNoKChjb25maWcsIGluZGV4Q29uZmlnKSA9PiB7XG4gICAgICBjb25zdCBuZXdGb3JtR3JvdXAgPSB0aGlzLm5ld0NvbnRyb2woY29uZmlnKTtcbiAgICAgIGlmIChjb25maWcuYXN5bmNWYWxpZGF0b3JzKSB7XG4gICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykuc2V0QXN5bmNWYWxpZGF0b3JzKGNvbmZpZy5hc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgfVxuICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5keW5hbWljRm9ybSkge1xuICAgICAgICBjb25zdCBmb3JtR3JvdXBEeW5hbWljRm9ybXNTdWJqZWN0ID0gbmV3Rm9ybUdyb3VwLmdldCgnZHluYW1pY0Zvcm1Db25maWcnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZT47XG4gICAgICAgIGZvcm1Hcm91cER5bmFtaWNGb3Jtc1N1YmplY3Quc3Vic2NyaWJlKGZvcm1Hcm91cENvbmZpZyA9PiB7XG4gICAgICAgICAgaWYgKGZvcm1Hcm91cENvbmZpZykge1xuICAgICAgICAgICAgZm9ybUdyb3VwQ29uZmlnLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChmb3JtR3JvdXBDb25maWcuZm9ybS52YWxpZCAmJiAoY29uZmlnLnZhbHVlQ2hhbmdlcyB8fCB0aGlzLnNob3dGaWVsZHNNb3JlSXRlbnNDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5lbWl0RGF0YShmb3JtR3JvdXBDb25maWcuZm9ybSk7XG4gICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy52YWx1ZUNoYW5nZXMgfHxcbiAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUgfHxcbiAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5keW5hbWljRm9ybSB8fFxuICAgICAgICB0aGlzLnNob3dGaWVsZHNNb3JlSXRlbnNDb25maWdcbiAgICAgICkge1xuICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgICAgICBjb25zdCBhdXRvY29tcGxldGVPcHRpb25zU3ViamVjdCA9IG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnMnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdPjtcbiAgICAgICAgICBpZiAoYXV0b2NvbXBsZXRlT3B0aW9uc1N1YmplY3QpIHtcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnNTdWJqZWN0LnN1YnNjcmliZShvcHRpb25zID0+IG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZCcpLnZhbHVlLm5leHQob3B0aW9ucykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCd2YWx1ZScpXG4gICAgICAgICAgICAgICAgICAgIC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q29uZmlnRHluYW1pY0Zvcm0obmV3Rm9ybUdyb3VwKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuaGFzT3duUHJvcGVydHkoJ25hbWUnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0Zvcm1Hcm91cC5nZXQoJ211bHRpcGxlJykudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0ZUF1dG9jb21wbGV0ZVNlbGVjdChuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWUucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZUlucHV0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbmV3Rm9ybUdyb3VwLmdldCgnbXVsdGlwbGUnKS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUoa29hbGEodGhpcy5mb3JtQ29uZmlnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcnJheTxLb2FsYUR5bmFtaWNGb3JtRmllbGRJbnRlcmZhY2U+KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKG5ld0Zvcm1Hcm91cC5nZXQoJ25hbWUnKS52YWx1ZSwgJ25hbWUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpWzBdPy5hdXRvY29tcGxldGVEZWZhdWx0VmFsdWVPbkNsZWFyID8/IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hdXRvY29tcGxldGVUeXBlID09PSAnYWxsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZU9wdGlvbnNTdWJqZWN0ID0gbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlT3B0aW9ucycpLnZhbHVlIGFzIEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10+O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZCcpLnZhbHVlLm5leHQodGhpcy5hdXRvY29tcGxldGVGaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zU3ViamVjdC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZVR5cGUgPT09ICdvbkRlbWFuZCcgJiYgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVyID0gbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlTG9hZGluZycpLnZhbHVlIGFzIEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYXV0b2NvbXBsZXRlRmlsdGVyKHZhbHVlKS5zdWJzY3JpYmUob3B0aW9ucyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQnKS52YWx1ZS5uZXh0KG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcudmFsdWVDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnZhbHVlQ2hhbmdlcygobmV3Rm9ybUdyb3VwLmdldCgnbXVsdGlwbGUnKS52YWx1ZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS52YWx1ZS5tYXAoaXRlbSA9PiBpdGVtLnZhbHVlKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS52YWx1ZT8udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudmFsdWVDaGFuZ2VzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jb250cm9scy5wdXNoKG5ld0Zvcm1Hcm91cCk7XG4gICAgICBpZiAoY29uZmlnLm1vcmVJdGVtc0NvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLm1vcmVJdGVtc01pbkl0ZW1zID4gMCkge1xuICAgICAgICAgIGZvciAobGV0IG1pbiA9IDA7IG1pbiA8IGNvbmZpZy5tb3JlSXRlbXNNaW5JdGVtczsgbWluKyspIHtcbiAgICAgICAgICAgIGlmIChtaW4gPD0gY29uZmlnLm1vcmVJdGVtc01heEl0ZW1zKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkTW9yZUl0ZW0oaW5kZXhDb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLm1vcmVJdGVtc0NvbmZpZy5zZXRWYWx1ZXMpIHtcbiAgICAgICAgICBjb25maWcubW9yZUl0ZW1zQ29uZmlnXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlc1xuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoYXN5bmMgdmFsdWVzID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaCgoaXRlbVZhbHVlLCBpbmRleFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW2luZGV4Q29uZmlnXS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlW2luZGV4VmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1vcmVJdGVtKGluZGV4Q29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlc09uRmllbGRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbaW5kZXhDb25maWddLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWVbaW5kZXhWYWx1ZV0uZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0aGlzLnNob3dGaWVsZHMpIHtcbiAgICAgIHRoaXMuY2hhbmdlVmlzaWJpbGl0eUZpZWxkcyh0aGlzLnNob3dGaWVsZHMsIHRoaXMuZm9ybSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNldFZhbHVlcykge1xuICAgICAgdGhpcy5zZXRWYWx1ZXNPbkZpZWxkcyh0aGlzLnNldFZhbHVlcywgdGhpcy5mb3JtKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaG91cnNBbmRNaW51dGVzQXBwbHlNYXNrKGluZGV4OiBudW1iZXIsIGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuY29udHJvbHM/LmNvbnRyb2xzW2luZGV4XTtcbiAgICBjb25zdCB0eXBlID0gY29udHJvbD8uZ2V0KCd0eXBlJykudmFsdWUgYXMgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtO1xuICAgIGlmICh0eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uaG91cnNBbmRNaW51dGVzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2w/LmdldCgndmFsdWUnKS52YWx1ZTtcbiAgICAgIGlmIChldmVudC5rZXkgPT0gJ0JhY2tzcGFjZScgJiYgdmFsdWUubGVuZ3RoIDwgNikge1xuICAgICAgICB0aGlzLmhvdXJzQW5kTWludXRlc01hc2sgPSAnMDA6MDAwJztcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ICE9ICdCYWNrc3BhY2UnICYmIHZhbHVlLmxlbmd0aCA+PSA2KSB7XG4gICAgICAgIHRoaXMuaG91cnNBbmRNaW51dGVzTWFzayA9ICcwMDA6MDAnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwYXNzd29yZFZpZXcoaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2xzPy5jb250cm9sc1tpbmRleF07XG4gICAgY29uc3QgaGlkZVBhc3N3b3JkID0gIWNvbnRyb2w/LmdldCgnaGlkZVBhc3N3b3JkJykudmFsdWU7XG4gICAgY29udHJvbD8uZ2V0KCdoaWRlUGFzc3dvcmQnKS5zZXRWYWx1ZShoaWRlUGFzc3dvcmQpO1xuICAgIGNvbnRyb2w/LmdldCgndHlwZScpLnNldFZhbHVlKGhpZGVQYXNzd29yZCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnBhc3N3b3JkIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0udGV4dFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYWRkTW9yZUl0ZW0ocHJvcEluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoIDwgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zTWF4SXRlbXMnKS52YWx1ZSkge1xuICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5wdXNoKHtcbiAgICAgICAgZm9ybTogZm9ybUdyb3VwLFxuICAgICAgICBmb3JtQ29uZmlnOiB0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS5tb3JlSXRlbXNDb25maWcuZm9ybUNvbmZpZyxcbiAgICAgICAgc2hvd0ZpZWxkczogbmV3IEJlaGF2aW9yU3ViamVjdDxCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2VbXT5bXT4oW10pLFxuICAgICAgICBzaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnOiB0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS5tb3JlSXRlbXNDb25maWcuc2hvd0ZpZWxkc0NvbmZpZ1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNFeHBhbmRlZCcpLnNldFZhbHVlKFxuICAgICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5sZW5ndGggLSAxXG4gICAgICApO1xuICAgICAgY29uc3QgZm9ybUFycmF5TW9yZUl0ZW1zID0gdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zRm9ybUdyb3VwJykgYXMgRm9ybUFycmF5O1xuICAgICAgZm9ybUFycmF5TW9yZUl0ZW1zLnB1c2goZm9ybUdyb3VwKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlTW9yZUl0ZW0ocHJvcEluZGV4OiBudW1iZXIsIHJlbW92ZUluZGV4KSB7XG4gICAgY29uc3QgZXhwYW5kZWRJdGVtSW5kZXggPSByZW1vdmVJbmRleCAtIDE7XG4gICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUuc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0V4cGFuZGVkJykuc2V0VmFsdWUoKGV4cGFuZGVkSXRlbUluZGV4IDwgMCkgPyAwIDogZXhwYW5kZWRJdGVtSW5kZXgpO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckF1dG9jb21wbGV0ZShwcm9wSW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtdWx0aXBsZScpLnZhbHVlKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUoW10pO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgndmFsdWUnKS5zZXRWYWx1ZShudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKHRoaXMuZm9ybUNvbmZpZ1twcm9wSW5kZXhdLmF1dG9jb21wbGV0ZURlZmF1bHRWYWx1ZU9uQ2xlYXIgPz8gbnVsbCk7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCd2YWx1ZScpLnNldFZhbHVlKHRoaXMuZm9ybUNvbmZpZ1twcm9wSW5kZXhdLmF1dG9jb21wbGV0ZURlZmF1bHRWYWx1ZU9uQ2xlYXIgPz8gbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc3BsYXkob3B0aW9uPzogS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvbi5uYW1lIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZU9wdGlvbk9uQXV0b2NvbXBsZXRlKHByb3BJbmRleDogbnVtYmVyLCBvcHRpb246IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS52YWx1ZS5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSBvcHRpb24pIGFzIEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXTtcbiAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZShbXSk7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0udmFsdWVDaGFuZ2VzKSB7XG4gICAgICB0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS52YWx1ZUNoYW5nZXModmFsdWUubWFwKGl0ZW0gPT4gaXRlbS52YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDb2xvckNoaXAoY29uZmlnOiBLb2FsYUR5bmFtaWNGb3JtQXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWdJbnRlcmZhY2UpOiBUaGVtZVBhbGV0dGUge1xuICAgIHJldHVybiBjb25maWcuY29sb3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyhwcm9wcmllZGFkZTogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgcmV0dXJuIHByb3ByaWVkYWRlLmdldCgnYXV0b2NvbXBsZXRlT3B0aW9uc0ZpbHRlcmVkJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PGFueVtdPjtcbiAgfVxuXG4gIHB1YmxpYyBnZXREeW5hbWljRm9ybUNvbmZpZyhwcm9wcmllZGFkZTogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgcmV0dXJuIHByb3ByaWVkYWRlLmdldCgnZHluYW1pY0Zvcm1Db25maWcnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZT47XG4gIH1cblxuICBwcml2YXRlIG5ld0NvbnRyb2woY29uZmlnOiBLb2FsYUR5bmFtaWNGb3JtRmllbGRJbnRlcmZhY2UpOiBGb3JtR3JvdXAge1xuICAgIGxldCB2YWxpZGF0b3JzID0gY29uZmlnLnN5bmNWYWxpZGF0b3JzID8/IFtdO1xuICAgIGxldCB2YWx1ZTogYW55ID0gY29uZmlnLnZhbHVlID8/ICcnO1xuICAgIGxldCB2YWx1ZVNlbGVjdGVkQXV0b2NvbXBsZXRlOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlIHwgS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdID0gKFxuICAgICAgY29uZmlnLm11bHRpcGxlID8gW10gOiAoY29uZmlnLmF1dG9jb21wbGV0ZURlZmF1bHRWYWx1ZU9uQ2xlYXIgPz8gbnVsbClcbiAgICApO1xuXG4gICAgaWYgKGNvbmZpZy5yZXF1aXJlZCA9PT0gdHJ1ZSkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgIGlmIChjb25maWcubWluICYmIHR5cGVvZiBjb25maWcubWluID09PSBcIm51bWJlclwiKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW4oY29uZmlnLm1pbikpO1xuICAgIGlmIChjb25maWcubWF4ICYmIHR5cGVvZiBjb25maWcubWF4ID09PSBcIm51bWJlclwiKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXgoY29uZmlnLm1heCkpO1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZGF0ZSB8fFxuICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5kYXRldGltZSB8fFxuICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS50aW1lXG4gICAgKSB7XG4gICAgICBpZiAoY29uZmlnLm1pbiAmJiB0eXBlb2YgY29uZmlnLm1pbiA9PT0gXCJzdHJpbmdcIikgeyB2YWxpZGF0b3JzLnB1c2goRGF0ZU1pblZhbGlkYXRvcihjb25maWcubWluKSk7IH1cbiAgICAgIGlmIChjb25maWcubWF4ICYmIHR5cGVvZiBjb25maWcubWF4ID09PSBcInN0cmluZ1wiKSB7IHZhbGlkYXRvcnMucHVzaChEYXRlTWF4VmFsaWRhdG9yKGNvbmZpZy5tYXgpKTsgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLm1pbkxlbmd0aCkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKGNvbmZpZy5taW5MZW5ndGgpKTtcbiAgICBpZiAoY29uZmlnLm1heExlbmd0aCkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKGNvbmZpZy5tYXhMZW5ndGgpKTtcblxuICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmNwZikge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKENwZlZhbGlkYXRvcik7XG4gICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmNucGopIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChDbnBqVmFsaWRhdG9yKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZW1haWwpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdmFsdWVTZWxlY3RlZEF1dG9jb21wbGV0ZSA9IHZhbHVlO1xuICAgICAgICB2YWx1ZSA9IChjb25maWcubXVsdGlwbGUgPyB2YWx1ZVNlbGVjdGVkQXV0b2NvbXBsZXRlWzBdIDogdmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5yZXF1aXJlZCA9PT0gdHJ1ZSkge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goQXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWxpZGF0b3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5jaGVja2JveCkge1xuICAgICAgdmFsdWUgPSBjb25maWcudmFsdWUgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5ob3Vyc0FuZE1pbnV0ZXMgJiZcbiAgICAgIHZhbHVlLmxlbmd0aCA+PSA2XG4gICAgKSB7XG4gICAgICB0aGlzLmhvdXJzQW5kTWludXRlc01hc2sgPSAnMDAwOjAwJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnKSB7XG4gICAgICBjb25zdCBjbG9uZUR5bmFtaWNGb3JtQ29uZmlnID0ge30gYXMgS29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2xvbmVEeW5hbWljRm9ybUNvbmZpZywgY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnKTtcbiAgICAgIGNsb25lRHluYW1pY0Zvcm1Db25maWcuZm9ybSA9IGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZy5mb3JtO1xuICAgICAgY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnID0gY2xvbmVEeW5hbWljRm9ybUNvbmZpZztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnNob3cgPT09IGZhbHNlKSB7XG4gICAgICB2YWxpZGF0b3JzID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHNob3c6IFtuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGNvbmZpZy5zaG93ID8/IHRydWUpXSxcbiAgICAgIGxhYmVsOiBbY29uZmlnLmxhYmVsXSxcbiAgICAgIG5hbWU6IFtjb25maWcubmFtZV0sXG4gICAgICB0eXBlOiBbY29uZmlnLnR5cGVdLFxuICAgICAgZmlsZUJ1dHRvbkNvbmZpZzogW3tcbiAgICAgICAgaWNvbjogY29uZmlnPy5maWxlQnV0dG9uQ29uZmlnPy5pY29uID8/ICdhdHRhY2hfZmlsZScsXG4gICAgICAgIHRleHQ6IGNvbmZpZz8uZmlsZUJ1dHRvbkNvbmZpZz8udGV4dCA/PyAnQ2xpcXVlIHBhcmEgYW5leGFyIGFycXVpdm9zJyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/LmJhY2tncm91bmRDb2xvciA/PyAnd2hpdGUnLFxuICAgICAgICBjb2xvcjogY29uZmlnPy5maWxlQnV0dG9uQ29uZmlnPy5jb2xvciA/PyAnYmx1ZScsXG4gICAgICAgIGFjY2VwdDogY29uZmlnPy5maWxlQnV0dG9uQ29uZmlnPy5hY2NlcHQgPz8gJyonXG4gICAgICB9XSxcbiAgICAgIGR5bmFtaWNGb3JtQ29uZmlnOiBbbmV3IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlPihjb25maWcuZHluYW1pY0Zvcm1Db25maWcpXSxcbiAgICAgIGR5bmFtaWNGb3JtR3JvdXA6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgICAgYXBwZWFyYW5jZTogW2NvbmZpZy5hcHBlYXJhbmNlXSxcbiAgICAgIGZsb2F0TGFiZWw6IFtjb25maWcuZmxvYXRMYWJlbF0sXG4gICAgICBwbGFjZWhvbGRlcjogW2NvbmZpZy5wbGFjZWhvbGRlcl0sXG4gICAgICBjbGFzczogW2NvbmZpZy5jbGFzc10sXG4gICAgICBmaWVsZENsYXNzOiBbY29uZmlnLmZpZWxkQ2xhc3NdLFxuICAgICAgdGV4dEhpbnQ6IFtjb25maWcudGV4dEhpbnRdLFxuICAgICAgcmVxdWlyZWQ6IFtjb25maWcucmVxdWlyZWQgPz8gZmFsc2VdLFxuICAgICAgbWluOiBbY29uZmlnLm1pbiA/PyAwXSxcbiAgICAgIG1heDogW2NvbmZpZy5tYXggPz8gOTk5OTk5OTk5OTldLFxuICAgICAgbWluTGVuZ3RoOiBbY29uZmlnLm1pbkxlbmd0aCA/PyAwXSxcbiAgICAgIG1heExlbmd0aDogW2NvbmZpZy5tYXhMZW5ndGggPz8gMjU1XSxcbiAgICAgIGRpc2FibGVkOiBbY29uZmlnLmRpc2FibGVkID8/IGZhbHNlXSxcbiAgICAgIGZvY3VzOiBbY29uZmlnLmZvY3VzID8/IGZhbHNlXSxcbiAgICAgIG11bHRpcGxlOiBbY29uZmlnLm11bHRpcGxlID8/IGZhbHNlXSxcbiAgICAgIG9wY29lc1NlbGVjdDogW2NvbmZpZy5vcGNvZXNTZWxlY3QgPz8gW11dLFxuICAgICAgaGlkZVBhc3N3b3JkOiBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnBhc3N3b3JkID8gdHJ1ZSA6IG51bGwsXG4gICAgICBtb3JlSXRlbXNCdXR0b25JY29uQWRkbGFiZWw6IFtjb25maWcubW9yZUl0ZW1zQnV0dG9uSWNvbkFkZGxhYmVsXSxcbiAgICAgIG1vcmVJdGVtc01pbkl0ZW1zOiBbY29uZmlnLm1vcmVJdGVtc01pbkl0ZW1zID8/IDBdLFxuICAgICAgbW9yZUl0ZW1zTWF4SXRlbXM6IFtjb25maWcubW9yZUl0ZW1zTWF4SXRlbXMgPz8gMTAwXSxcbiAgICAgIG1vcmVJdGVtc0ljb246IFtjb25maWcubW9yZUl0ZW1zSWNvbl0sXG4gICAgICBtb3JlSXRlbXNJY29uRm9udENvbG9yOiBbY29uZmlnLm1vcmVJdGVtc0ljb25Gb250Q29sb3JdLFxuICAgICAgbW9yZUl0ZW1zSWNvbkJhY2tncm91bmRDb2xvcjogW2NvbmZpZy5tb3JlSXRlbXNJY29uQmFja2dyb3VuZENvbG9yXSxcbiAgICAgIG1vcmVJdGVtc0V4cGFuZGVkOiBbJyddLFxuICAgICAgbW9yZUl0ZW1zQ29uZmlnOiBbW11dLFxuICAgICAgbW9yZUl0ZW1zRm9ybUdyb3VwOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICAgIGF1dG9jb21wbGV0ZUxvYWRpbmc6IFtuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKV0sXG4gICAgICBhdXRvY29tcGxldGVPcHRpb25zOiBbY29uZmlnLmF1dG9jb21wbGV0ZU9wdGlvbnNdLFxuICAgICAgYXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWc6IFtjb25maWcuYXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWddLFxuICAgICAgYXV0b2NvbXBsZXRlT3B0aW9uc0ZpbHRlcmVkOiBbbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KFtdKV0sXG4gICAgICBhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlOiBbdmFsdWVTZWxlY3RlZEF1dG9jb21wbGV0ZV0sXG4gICAgICB0ZXh0TG9nczogW2NvbmZpZz8udGV4dE9ic10sXG4gICAgICBjdXN0b21NYXNjOiBbY29uZmlnPy5jdXN0b21NYXNjXSxcbiAgICAgIGN1c3RvbU1hc2NUaG91c2FuZFNlcGFyYXRvcjogW2NvbmZpZz8uY3VzdG9tTWFzY1Rob3VzYW5kU2VwYXJhdG9yID8/ICcnXSxcbiAgICAgIGN1c3RvbU1hc2NTdWZmaXg6IFtjb25maWc/LmN1c3RvbU1hc2NTdWZmaXggPz8gJyddLFxuICAgICAgY3VzdG9tTWFzY1ByZWZpeDogW2NvbmZpZz8uY3VzdG9tTWFzY1ByZWZpeCA/PyAnJ10sXG4gICAgICB2YWx1ZTogW3t2YWx1ZSwgZGlzYWJsZWQ6IGNvbmZpZy5kaXNhYmxlZH0sIHZhbGlkYXRvcnMsIGNvbmZpZy5hc3luY1ZhbGlkYXRvcnNdXG4gICAgfSk7XG5cbiAgICBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZVR5cGUgPT09IFwib25EZW1hbmRcIikge1xuICAgICAgY29uc3QgbG9hZGVyID0gZmllbGQuZ2V0KCdhdXRvY29tcGxldGVMb2FkaW5nJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICAgICAgbG9hZGVyLm5leHQodHJ1ZSk7XG4gICAgICBjb25maWcuYXV0b2NvbXBsZXRlRmlsdGVyKCcnKS5zdWJzY3JpYmUob3B0aW9ucyA9PiB7XG4gICAgICAgIGZpZWxkLmdldCgnYXV0b2NvbXBsZXRlT3B0aW9uc0ZpbHRlcmVkJykudmFsdWUubmV4dChvcHRpb25zKTtcbiAgICAgICAgbG9hZGVyLm5leHQoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpZWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRWYWx1ZXNPbkZpZWxkcyhzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2VbXT4sIGZvcm06IEZvcm1Hcm91cCkge1xuICAgIHN1YmplY3Quc3Vic2NyaWJlKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgZm9ybUFycmF5ID0gZm9ybS5nZXQoJ2Zvcm1EYXRhJykgYXMgRm9ybUFycmF5O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgaXRlbS52YWx1ZXMoKSkge1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWVCeVByb3AoZm9ybUFycmF5LCBwcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VWaXNpYmlsaXR5RmllbGRzKHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtU2hvd0ZpZWxkSW50ZXJmYWNlW10+LCBmb3JtOiBGb3JtR3JvdXApIHtcbiAgICBzdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKDUpKS5zdWJzY3JpYmUoaXRlbSA9PiB7XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSBmb3JtLmdldCgnZm9ybURhdGEnKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBpdGVtLnZhbHVlcygpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbaW5kZXhDb250cm9sLCBjb250cm9sXSBvZiBmb3JtQXJyYXkuY29udHJvbHMuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbC5nZXQoJ25hbWUnKS52YWx1ZSA9PT0gcHJvcC5uYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCdzaG93JykudmFsdWUubmV4dChwcm9wLnNob3cpO1xuICAgICAgICAgICAgICBjb25zdCBjb25maWc6IEtvYWxhRHluYW1pY0Zvcm1GaWVsZEludGVyZmFjZSA9IHRoaXMuZm9ybUNvbmZpZ1tpbmRleENvbnRyb2xdID8/IG51bGw7XG4gICAgICAgICAgICAgIGlmIChwcm9wLnNob3cpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsaWRhdG9ycyA9IFtdO1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmR5bmFtaWNGb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1BcnJheU1vcmVJdGVtcyA9IGNvbnRyb2wuZ2V0KCdkeW5hbWljRm9ybUdyb3VwJykgYXMgRm9ybUFycmF5O1xuICAgICAgICAgICAgICAgICAgICBmb3JtQXJyYXlNb3JlSXRlbXMucHVzaChjb25maWc/LmR5bmFtaWNGb3JtQ29uZmlnPy5mb3JtKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMgPSBjb25maWcuc3luY1ZhbGlkYXRvcnMgPz8gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcucmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY3BmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKENwZlZhbGlkYXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5jbnBqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKENucGpWYWxpZGF0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZW1haWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnJlcXVpcmVkID09PSB0cnVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsaWRhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWluICYmIHR5cGVvZiBjb25maWcubWluID09PSBcIm51bWJlclwiKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW4oY29uZmlnLm1pbikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm1heCAmJiB0eXBlb2YgY29uZmlnLm1heCA9PT0gXCJudW1iZXJcIikgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4KGNvbmZpZy5tYXgpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZGF0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZGF0ZXRpbWUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnRpbWVcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5taW4gJiYgdHlwZW9mIGNvbmZpZy5taW4gPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNaW5WYWxpZGF0b3IoY29uZmlnLm1pbikpOyB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5tYXggJiYgdHlwZW9mIGNvbmZpZy5tYXggPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNYXhWYWxpZGF0b3IoY29uZmlnLm1heCkpOyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5taW5MZW5ndGgpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aChjb25maWcubWluTGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWF4TGVuZ3RoKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoY29uZmlnLm1heExlbmd0aCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuYXN5bmNWYWxpZGF0b3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0QXN5bmNWYWxpZGF0b3JzKGNvbmZpZy5hc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmNsZWFyQ3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5jbGVhckFzeW5jVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcblxuICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmR5bmFtaWNGb3JtKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdkeW5hbWljRm9ybUdyb3VwJyk7XG4gICAgICAgICAgICAgICAgICBmb3JtR3JvdXAuYWRkQ29udHJvbCgnZHluYW1pY0Zvcm1Hcm91cCcsIHRoaXMuZmIuYXJyYXkoW10pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGF1dG9jb21wbGV0ZUZpbHRlcihhcnI6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXSwgdmFsdWU6IHN0cmluZyk6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXSB7XG4gICAgcmV0dXJuIGFyci5maWx0ZXIoZmlsdGVyID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICBsZXQgZmluZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgLnNwbGl0KCcgJylcbiAgICAgICAgICAgICAgIC5mb3JFYWNoKHBhcnQgPT4ge1xuICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHBhcnQpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgIGZpbmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIGZpbmQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRWYWx1ZUJ5UHJvcChmb3JtQXJyYXk6IEZvcm1BcnJheSwgcHJvcDogS29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2UpIHtcbiAgICBpZiAoZm9ybUFycmF5KSB7XG4gICAgICBpZiAocHJvcC5uYW1lLmluZGV4T2YoJyA+ICcpID49IDApIHtcbiAgICAgICAgbGV0IGR5bmFtaWNGb3JtU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+O1xuICAgICAgICBjb25zdCBhcnJQcm9wTmFtZSA9IHByb3AubmFtZS5zcGxpdCgnID4gJyk7XG4gICAgICAgIGxldCBpbmRleFByb3BOYW1lID0gMDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtQXJyYXkuY29udHJvbHMuZmluZChjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJykudmFsdWUgPT09IGFyclByb3BOYW1lW2luZGV4UHJvcE5hbWVdKTtcbiAgICAgICAgICBpZiAoaW5kZXhQcm9wTmFtZSA9PT0gYXJyUHJvcE5hbWUubGVuZ3RoIC0gMikge1xuICAgICAgICAgICAgZHluYW1pY0Zvcm1TdWJqZWN0ID0gY29udHJvbC5nZXQoJ2R5bmFtaWNGb3JtQ29uZmlnJykudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBkeW5hbWljRm9ybSA9IGR5bmFtaWNGb3JtU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKGR5bmFtaWNGb3JtLmZvcm1Db25maWcuZmluZChmYyA9PiBmYy5uYW1lID09PSBhcnJQcm9wTmFtZVthcnJQcm9wTmFtZS5sZW5ndGggLSAxXSkpIHtcbiAgICAgICAgICAgICAgaWYgKGR5bmFtaWNGb3JtLnNldFZhbHVlcykge1xuICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtLnNldFZhbHVlcy5uZXh0KGtvYWxhKGR5bmFtaWNGb3JtLnNldFZhbHVlcy5nZXRWYWx1ZSgpKS5hcnJheTxhbnk+KCkubWVyZ2UoW3tcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGFyclByb3BOYW1lW2FyclByb3BOYW1lLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHByb3AudmFsdWVcbiAgICAgICAgICAgICAgICB9XSkuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHluYW1pY0Zvcm0uc2V0VmFsdWVzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNTZXRWYWx1ZUludGVyZmFjZVtdPihbe1xuICAgICAgICAgICAgICAgICAgbmFtZTogYXJyUHJvcE5hbWVbYXJyUHJvcE5hbWUubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcC52YWx1ZVxuICAgICAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpbmRleFByb3BOYW1lKys7XG4gICAgICAgIH0gd2hpbGUgKGluZGV4UHJvcE5hbWUgPCBhcnJQcm9wTmFtZS5sZW5ndGggLSAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBmb3JtQXJyYXkuY29udHJvbHMudmFsdWVzKCkpIHtcbiAgICAgICAgICBpZiAoY29udHJvbC5nZXQoJ25hbWUnKS52YWx1ZSA9PT0gcHJvcC5uYW1lKSB7XG4gICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5zZXRWYWx1ZShwcm9wLnZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0Q29uZmlnRHluYW1pY0Zvcm0obmV3Rm9ybUdyb3VwOiBGb3JtR3JvdXApIHtcbiAgICBpZiAodGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykudmFsdWU7XG4gICAgICBjb25zdCBjb25maWdzID0gdGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoY29uZmlnID0+IGNvbmZpZy5uYW1lRmllbGQgPT09IG5ld0Zvcm1Hcm91cC5nZXQoJ25hbWUnKS52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoY29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmZuU2hvdyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykge1xuICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgaWYgKGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyAmJiBjb25maWcuZm5TaG93KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbER5bmFtaWNGb3JtQ29uZmlnID0gdGhpcy5jb250cm9sc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250cm9sc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKGNvbnRyb2wgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5maWVsZHNUb1Nob3cuaW5kZXhPZihjb250cm9sLmdldCgnbmFtZScpLnZhbHVlKSA+PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGb3JtQ29uZmlnU3ViamVjdCA9IGNvbnRyb2xEeW5hbWljRm9ybUNvbmZpZy5nZXQoJ2R5bmFtaWNGb3JtQ29uZmlnJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+O1xuICAgICAgICAgICAgZHluYW1pY0Zvcm1Db25maWdTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxheSgxKTtcbiAgICAgICAgICAgIGR5bmFtaWNGb3JtQ29uZmlnU3ViamVjdC5uZXh0KGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyh2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5zaG93RmllbGRzKFxuICAgICAgICAgICAgdGhpcy5zaG93RmllbGRzLFxuICAgICAgICAgICAgY29uZmlnLmZpZWxkc1RvU2hvdyxcbiAgICAgICAgICAgIGNvbmZpZy5mblNob3codmFsdWUpLFxuICAgICAgICAgICAgY29uZmlnLmNsZWFyQ3VycmVudFZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBdXRvY29tcGxldGVTZWxlY3Qoc2VsZWN0ZWRWYWx1ZXM6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXSwgdmFsdWU6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UpIHtcbiAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG5cbiAgICBmb3IgKGNvbnN0IHNlbGVjdGVkSXRlbSBvZiBzZWxlY3RlZFZhbHVlcy52YWx1ZXMoKSkge1xuICAgICAgaWYgKHNlbGVjdGVkSXRlbS5uYW1lID09PSB2YWx1ZS5uYW1lKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cbn1cbiIsIjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJwLXJlbGF0aXZlIHctMTAwXCI+XG4gIDxkaXYgKm5nRm9yPVwibGV0IHByb3ByaWVkYWRlIG9mIGNvbnRyb2xzPy5jb250cm9sczsgbGV0IGkgPSBpbmRleDtcIlxuICAgICAgIFtuZ0NsYXNzXT1cIihwcm9wcmllZGFkZS5nZXQoJ3Nob3cnKS52YWx1ZSB8IGFzeW5jKSA/IHByb3ByaWVkYWRlLmdldCgnY2xhc3MnKS52YWx1ZSA6ICdkLW5vbmUnXCJcbiAgICAgICBmb3JtQXJyYXlOYW1lPVwiZm9ybURhdGFcIj5cblx0ICA8ZGl2ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCdzaG93JykudmFsdWUgfCBhc3luY1wiPlxuXHQgICAgPG1hdC1mb3JtLWZpZWxkXG5cdFx0ICAgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnRleHQgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5wYXNzd29yZCB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNwZiB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNucGogfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5kYXRldGltZSB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmVtYWlsIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQubnVtYmVyIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuc3RyaW5nTnVtYmVyIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQudGltZSB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmRhdGUgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5ob3Vyc0FuZE1pbnV0ZXMgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5waG9uZSB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnBlcmNlbnQgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jb2xvciB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLm1vbnRoIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY29tcGV0ZW5jZURhdGUgfHxcbiAgICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5zdHJpbmdXaXRoQ3VzdG9tTWFzY1wiXG5cdFx0ICAgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcblx0XHQgICAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuXHRcdCAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcblx0XHQgICAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cblx0ICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9tYXQtbGFiZWw+XG5cdCAgICAgIDxpbnB1dFxuXHRcdCAgICAgIFtkcm9wU3BlY2lhbENoYXJhY3RlcnNdPVwiZmFsc2VcIlxuXHRcdCAgICAgIFtrb2FsYUF1dG9Gb2N1c109XCJwcm9wcmllZGFkZS5nZXQoJ2ZvY3VzJykudmFsdWVcIlxuXHRcdCAgICAgIChrZXl1cCk9XCJob3Vyc0FuZE1pbnV0ZXNBcHBseU1hc2soaSwgJGV2ZW50KVwiXG5cdFx0ICAgICAgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG5cdFx0ICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcblx0XHQgICAgICBbbWFza109XCIoKHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jb21wZXRlbmNlRGF0ZSkgPyAnMDAvMDAwMCcgOiBudWxsKSB8fFxuXHRcdCAgICAgICAgICAgICAgKChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucGhvbmUpID8gJygwMCkwMDAwLTAwMDA/MCcgOiBudWxsKSB8fFxuXHRcdCAgICAgICAgICAgICAgKChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuc3RyaW5nTnVtYmVyKSA/ICcweycrcHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZSsnfScgOiBudWxsKSB8fFxuICAgICAgICAgICAgICAgICAgKChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY3BmKSA/ICcwMDAuMDAwLjAwMC0wMCcgOiBudWxsKSB8fFxuICAgICAgICAgICAgICAgICAgKChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY25waikgPyAnMDAuMDAwLjAwMC8wMDAwLTAwJyA6IG51bGwpIHx8XG4gICAgICAgICAgICAgICAgICAoKHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5wZXJjZW50KSA/ICdwZXJjZW50JyA6IG51bGwpIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoKHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5ob3Vyc0FuZE1pbnV0ZXMpID8gaG91cnNBbmRNaW51dGVzTWFzayA6IG51bGwpIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoKHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5zdHJpbmdXaXRoQ3VzdG9tTWFzYykgPyBwcm9wcmllZGFkZS5nZXQoJ2N1c3RvbU1hc2MnKS52YWx1ZSA6IG51bGwpXCJcblx0XHQgICAgICBbdmFsaWRhdGlvbl09XCJcblx0ICAgICAgICAgICAgICAgICAgICAocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNwZiAmJiBwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jcGZJbnZhbGlkKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgIChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY25waiAmJiBwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jbnBqSW52YWxpZClcIlxuXHRcdCAgICAgIFt0eXBlXT1cIigocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNwZiB8fFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY25waiB8fFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucGhvbmUgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnBlcmNlbnRcbiAgICAgICAgICAgICAgICAgICkpID8gJ3RlbCcgOiAoXG4gICAgICAgICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5tb250aCA/XG4gICAgICAgICAgICAgICAgICAgICdtb250aCcgOiAoXG4gICAgICAgICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5kYXRlID9cbiAgICAgICAgICAgICAgICAgICAgJ2RhdGUnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuZGF0ZXRpbWUgP1xuICAgICAgICAgICAgICAgICAgICAnZGF0ZXRpbWUtbG9jYWwnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuZW1haWwgP1xuICAgICAgICAgICAgICAgICAgICAnZW1haWwnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQubnVtYmVyID9cbiAgICAgICAgICAgICAgICAgICAgJ251bWJlcicgOiAoXG4gICAgICAgICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC50aW1lID9cbiAgICAgICAgICAgICAgICAgICAgJ3RpbWUnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucGFzc3dvcmQgP1xuICAgICAgICAgICAgICAgICAgICAncGFzc3dvcmQnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY29sb3IgP1xuICAgICAgICAgICAgICAgICAgICAnY29sb3InIDogJ3RleHQnKSkpKSkpKSlcIlxuICAgICAgICAgIFttaW5dPVwicHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZVwiXG4gICAgICAgICAgW21heF09XCJwcm9wcmllZGFkZS5nZXQoJ21heCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWluTGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIFttYXhMZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZVwiXG4gICAgICAgICAgW3Rob3VzYW5kU2VwYXJhdG9yXT1cInByb3ByaWVkYWRlLmdldCgnY3VzdG9tTWFzY1Rob3VzYW5kU2VwYXJhdG9yJykudmFsdWVcIlxuICAgICAgICAgIFtzdWZmaXhdPVwicHJvcHJpZWRhZGUuZ2V0KCdjdXN0b21NYXNjU3VmZml4JykudmFsdWVcIlxuICAgICAgICAgIFtwcmVmaXhdPVwicHJvcHJpZWRhZGUuZ2V0KCdjdXN0b21NYXNjUHJlZml4JykudmFsdWVcIlxuICAgICAgICAgIHNlcGFyYXRvckxpbWl0PVwiMFwiXG4gICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcblx0XHQgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG5cdFx0ICAgICAgbWF0SW5wdXQvPlxuXHQgICAgICA8YnV0dG9uXG5cdFx0ICAgICAgKGNsaWNrKT1cInBhc3N3b3JkVmlldyhpKVwiXG5cdFx0ICAgICAgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ2hpZGVQYXNzd29yZCcpLnZhbHVlICE9PSBudWxsXCJcblx0XHQgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIaWRlIHBhc3N3b3JkJ1wiXG5cdFx0ICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cInByb3ByaWVkYWRlLmdldCgnaGlkZVBhc3N3b3JkJykudmFsdWVcIlxuXHRcdCAgICAgIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggdGFiaW5kZXg9XCItMVwiIHR5cGU9XCJidXR0b25cIj5cblx0ICAgICAgICA8bWF0LWljb24+e3twcm9wcmllZGFkZS5nZXQoJ2hpZGVQYXNzd29yZCcpLnZhbHVlID8gJ3Zpc2liaWxpdHlfb2ZmJyA6ICd2aXNpYmlsaXR5J319PC9tYXQtaWNvbj5cblx0ICAgICAgPC9idXR0b24+XG5cdCAgICAgIDxtYXQtaGludCAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZVwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cblx0XHQgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZX19XG5cdCAgICAgIDwvbWF0LWhpbnQ+XG5cdCAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5yZXF1aXJlZFwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0UmVxdWlyZWRNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZSl9fVxuXHQgICAgICA8L21hdC1lcnJvcj5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmNwZkludmFsaWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldEludmFsaWRNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZSl9fVxuXHQgICAgICA8L21hdC1lcnJvcj5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmNucGpJbnZhbGlkXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRJbnZhbGlkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG5cdCAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5lbWFpbFwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0SW52YWxpZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWluXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNaW5NZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWluJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5tYXhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1heE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtYXgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1pbkxlbmd0aFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWluTGVuZ3RoTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21pbkxlbmd0aCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWF4TGVuZ3RoXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNYXhMZW5ndGhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5kYXRlTWluXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXREYXRlTWluTWVzc2FnZSgpfX1cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgnbWluJykudmFsdWUgfCBkYXRlOlwic2hvcnREYXRlXCJ9fS5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5kYXRlTWF4XCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXREYXRlTWF4TWVzc2FnZSgpfX1cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgnbWF4JykudmFsdWUgfCBkYXRlOlwic2hvcnREYXRlXCJ9fS5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgPC9tYXQtZm9ybS1maWVsZD5cblx0ICAgIDxtYXQtZm9ybS1maWVsZFxuXHRcdCAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jb2luXCJcblx0XHQgICAgW2FwcGVhcmFuY2VdPVwicHJvcHJpZWRhZGUuZ2V0KCdhcHBlYXJhbmNlJykudmFsdWVcIlxuXHRcdCAgICBbZmxvYXRMYWJlbF09XCJwcm9wcmllZGFkZS5nZXQoJ2Zsb2F0TGFiZWwnKS52YWx1ZVwiXG5cdFx0ICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuXHRcdCAgICBbbmdDbGFzc109XCJwcm9wcmllZGFkZS5nZXQoJ2ZpZWxkQ2xhc3MnKS52YWx1ZVwiPlxuXHQgICAgICA8bWF0LWxhYmVsPnt7cHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlfX08L21hdC1sYWJlbD5cblx0ICAgICAgPGlucHV0XG5cdFx0ICAgICAgW2tvYWxhQXV0b0ZvY3VzXT1cInByb3ByaWVkYWRlLmdldCgnZm9jdXMnKS52YWx1ZVwiXG5cdFx0ICAgICAgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG4gICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcbiAgICAgICAgICBbbWluXT1cInByb3ByaWVkYWRlLmdldCgnbWluJykudmFsdWVcIlxuICAgICAgICAgIFttYXhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXgnKS52YWx1ZVwiXG4gICAgICAgICAgW21pbkxlbmd0aF09XCJwcm9wcmllZGFkZS5nZXQoJ21pbkxlbmd0aCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWF4TGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG5cdFx0ICAgICAgY3VycmVuY3lNYXNrXG5cdFx0ICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuXHRcdCAgICAgIG1hdElucHV0XG5cdFx0ICAgICAgdHlwZT1cInRlbFwiLz5cblx0ICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuXHRcdCAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cblx0ICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1pblwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWluTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21pbicpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWF4XCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNYXhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWF4JykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5MZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbkxlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW5MZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heExlbmd0aFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TGVuZ3RoTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ucmVxdWlyZWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldFJlcXVpcmVkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtZm9ybS1maWVsZFxuICAgICAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5mbG9hdFwiXG4gICAgICAgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcbiAgICAgICAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIFtrb2FsYUF1dG9Gb2N1c109XCJwcm9wcmllZGFkZS5nZXQoJ2ZvY3VzJykudmFsdWVcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIlxuICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiXG4gICAgICAgICAgW21pbl09XCJwcm9wcmllZGFkZS5nZXQoJ21pbicpLnZhbHVlXCJcbiAgICAgICAgICBbbWF4XT1cInByb3ByaWVkYWRlLmdldCgnbWF4JykudmFsdWVcIlxuICAgICAgICAgIFttaW5MZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtaW5MZW5ndGgnKS52YWx1ZVwiXG4gICAgICAgICAgW21heExlbmd0aF09XCJwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlXCJcbiAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgIGN1cnJlbmN5TWFza1xuICAgICAgICAgIFtvcHRpb25zXT1cIntwcmVmaXg6ICcnfVwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgdHlwZT1cInRlbFwiLz5cbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cbiAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1pblwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWluTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21pbicpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWF4XCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNYXhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWF4JykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5MZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbkxlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW5MZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heExlbmd0aFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TGVuZ3RoTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ucmVxdWlyZWRcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldFJlcXVpcmVkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblx0ICAgIDxtYXQtZm9ybS1maWVsZFxuXHRcdCAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC52YWx1ZUxpc3QgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC50ZXh0YXJlYVwiXG5cdFx0ICAgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcblx0XHQgICAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuXHRcdCAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcblx0XHQgICAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cblx0ICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9tYXQtbGFiZWw+XG5cdCAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICN0ZXh0YXJlYVxuXHRcdCAgICAgIFtrb2FsYUF1dG9Gb2N1c109XCJwcm9wcmllZGFkZS5nZXQoJ2ZvY3VzJykudmFsdWVcIlxuICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAjYXV0b3NpemU9XCJjZGtUZXh0YXJlYUF1dG9zaXplXCJcblx0XHQgICAgICBbY2RrQXV0b3NpemVNYXhSb3dzXT1cIjhcIlxuXHRcdCAgICAgIFtjZGtBdXRvc2l6ZU1pblJvd3NdPVwiM1wiXG5cdFx0ICAgICAgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG4gICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcbiAgICAgICAgICBbbWluTGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIFttYXhMZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZVwiXG5cdFx0ICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuXHRcdCAgICAgIG1hdElucHV0PlxuICAgICAgICA8L3RleHRhcmVhPlxuXHQgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWVcIj5cblx0ICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XG5cdFx0ICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWV9fVxuXHQgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8bWF0LWhpbnQgYWxpZ249XCJlbmRcIiAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWVcIj5cbiAgICAgICAgICB7e3RleHRhcmVhLnZhbHVlLmxlbmd0aH19L3t7cHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZX19XG4gICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5MZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbkxlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW5MZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heExlbmd0aFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TGVuZ3RoTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ucmVxdWlyZWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldFJlcXVpcmVkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgPC9tYXQtZm9ybS1maWVsZD5cblx0XHQgIDxtYXQtZm9ybS1maWVsZFxuXHRcdFx0ICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC50ZXh0TG9nc1wiXG5cdFx0XHQgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcblx0XHRcdCAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuXHRcdFx0ICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcblx0XHRcdCAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cblx0ICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9tYXQtbGFiZWw+XG5cdCAgICAgIDxkaXYgW2lubmVySFRNTF09XCJwcm9wcmllZGFkZS5nZXQoJ3RleHRMb2dzJykudmFsdWVcIiBjbGFzcz1cInRleHQtb2JzXCI+PC9kaXY+XG5cdCAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICN0ZXh0YXJlYVxuXHRcdCAgICAgIFtrb2FsYUF1dG9Gb2N1c109XCJwcm9wcmllZGFkZS5nZXQoJ2ZvY3VzJykudmFsdWVcIlxuICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAjYXV0b3NpemU9XCJjZGtUZXh0YXJlYUF1dG9zaXplXCJcblx0XHQgICAgICBbY2RrQXV0b3NpemVNYXhSb3dzXT1cIjhcIlxuXHRcdCAgICAgIFtjZGtBdXRvc2l6ZU1pblJvd3NdPVwiM1wiXG5cdFx0ICAgICAgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG4gICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcbiAgICAgICAgICBbbWluTGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIFttYXhMZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZVwiXG5cdFx0ICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuXHRcdCAgICAgIG1hdElucHV0PlxuXHQgICAgICA8L3RleHRhcmVhPlxuXHQgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWVcIj5cblx0ICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XG5cdFx0ICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWV9fVxuXHQgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8bWF0LWhpbnQgYWxpZ249XCJlbmRcIiAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWVcIj5cbiAgICAgICAgICB7e3RleHRhcmVhLnZhbHVlLmxlbmd0aH19L3t7cHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZX19XG4gICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5MZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbkxlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW5MZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heExlbmd0aFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TGVuZ3RoTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ucmVxdWlyZWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldFJlcXVpcmVkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgPC9tYXQtZm9ybS1maWVsZD5cblx0ICAgIDxtYXQtZm9ybS1maWVsZFxuXHRcdCAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5zZWxlY3RcIlxuXHRcdCAgICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0ICAgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHQgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0ICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbWF0LWxhYmVsPlxuXHQgICAgICA8bWF0LXNlbGVjdCBbbXVsdGlwbGVdPVwicHJvcHJpZWRhZGUuZ2V0KCdtdWx0aXBsZScpLnZhbHVlXCIgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbnMgb2YgcHJvcHJpZWRhZGUuZ2V0KCdvcGNvZXNTZWxlY3QnKS52YWx1ZVwiIFt2YWx1ZV09XCJvcHRpb25zLnZhbHVlXCI+XG5cdCAgICAgICAgICB7e29wdGlvbnMubmFtZX19XG5cdCAgICAgICAgPC9tYXQtb3B0aW9uPlxuXHQgICAgICA8L21hdC1zZWxlY3Q+XG5cdCAgICAgIDxtYXQtaGludCAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZVwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cblx0XHQgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZX19XG5cdCAgICAgIDwvbWF0LWhpbnQ+XG5cdCAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5yZXF1aXJlZFwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0UmVxdWlyZWRNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZSl9fVxuXHQgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yLm1lc3NhZ2V9fS5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG5cdCAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgIGNsYXNzPVwic2VsZWN0LW11bHRpcGxlLW5hdGl2ZVwiXG4gICAgICAgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnNlbGVjdE11bHRpcGxlTmF0aXZlXCJcbiAgICAgICAgW2FwcGVhcmFuY2VdPVwicHJvcHJpZWRhZGUuZ2V0KCdhcHBlYXJhbmNlJykudmFsdWVcIlxuICAgICAgICBbZmxvYXRMYWJlbF09XCJwcm9wcmllZGFkZS5nZXQoJ2Zsb2F0TGFiZWwnKS52YWx1ZVwiXG4gICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuICAgICAgICBbbmdDbGFzc109XCJwcm9wcmllZGFkZS5nZXQoJ2ZpZWxkQ2xhc3MnKS52YWx1ZVwiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7cHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlfX08L21hdC1sYWJlbD5cbiAgICAgICAgPHNlbGVjdFxuICAgICAgICAgIG1hdE5hdGl2ZUNvbnRyb2xcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIj5cbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb25zIG9mIHByb3ByaWVkYWRlLmdldCgnb3Bjb2VzU2VsZWN0JykudmFsdWVcIiBbdmFsdWVdPVwib3B0aW9ucy52YWx1ZVwiPlxuICAgICAgICAgICAge3tvcHRpb25zLm5hbWV9fVxuICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cbiAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRSZXF1aXJlZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3JcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3IubWVzc2FnZX19LlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cdCAgICA8ZGl2XG5cdFx0ICAgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNoZWNrYm94XCJcblx0XHQgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0ICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuXHRcdCAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcblx0XHQgICAgICB2YWx1ZT1cInRydWVcIj5cblx0ICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19XG5cdCAgICAgIDwvbWF0LWNoZWNrYm94PlxuXHQgICAgPC9kaXY+XG5cdFx0ICA8ZGl2XG5cdFx0XHQgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLm1vcmVJdGVtc1wiXG5cdFx0XHQgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuXHRcdFx0ICBbbmdDbGFzc109XCJwcm9wcmllZGFkZS5nZXQoJ2ZpZWxkQ2xhc3MnKS52YWx1ZVwiXG5cdFx0XHQgIGNsYXNzPVwibW9yZS1pdGVtcy1jb250ZW50XCI+XG5cdFx0XHQgIDxmaWVsZHNldD5cblx0XHRcdFx0ICA8bGVnZW5kPlxuXHRcdFx0XHRcdCAgPGtvYWxhLWJ1dHRvblxuXHRcdFx0XHRcdFx0ICAoY2xpY2spPVwiYWRkTW9yZUl0ZW0oaSlcIlxuXHRcdFx0XHRcdFx0ICBbZGlzYWJsZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5sZW5ndGggPT09IHByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zTWF4SXRlbXMnKS52YWx1ZVwiXG5cdFx0XHRcdFx0XHQgIFt0b29sdGlwXT1cInByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zQnV0dG9uSWNvbkFkZGxhYmVsJykudmFsdWVcIlxuXHRcdFx0XHRcdFx0ICBbYmFja2dyb3VuZENvbG9yXT1cInByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zSWNvbkJhY2tncm91bmRDb2xvcicpLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cInByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zSWNvbkZvbnRDb2xvcicpLnZhbHVlXCJcblx0XHRcdFx0XHRcdCAgY2xhc3M9XCJidG4tYWRkLW1vcmUtaXRlbXNcIlxuXHRcdFx0XHRcdFx0ICBpY29uPVwiYWRkXCI+XG5cdFx0XHRcdFx0ICA8L2tvYWxhLWJ1dHRvbj5cblx0XHRcdFx0XHQgIHt7cHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlfX0gKE1pbi46IHt7cHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNNaW5JdGVtcycpLnZhbHVlfX1cblx0XHRcdFx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNw6F4Ljoge3twcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc01heEl0ZW1zJykudmFsdWV9fSlcblx0XHRcdFx0ICA8L2xlZ2VuZD5cblx0XHRcdFx0ICA8bWF0LWFjY29yZGlvbiBjbGFzcz1cIml0ZW1zXCIgbXVsdGk+XG5cdFx0XHRcdFx0ICA8bWF0LWV4cGFuc2lvbi1wYW5lbFxuXHRcdFx0XHRcdFx0ICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlLnNsaWNlKCkucmV2ZXJzZSgpOyBpbmRleCBhcyBpbmRleE1vcmVJdGVtc1wiXG5cdFx0XHRcdFx0XHQgIGV4cGFuZGVkPlxuXHRcdFx0XHRcdFx0ICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1wYW5lbC10aXRsZSBjbGFzcz1cInRpdGxlRm9ybVwiPiNcblx0XHRcdFx0XHRcdFx0XHRcdHt7cHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5sZW5ndGggLSAxIC0gaW5kZXhNb3JlSXRlbXMgKyAxfX08L21hdC1wYW5lbC10aXRsZT5cblx0XHRcdFx0XHRcdFx0XHQ8bWF0LXBhbmVsLWRlc2NyaXB0aW9uIGNsYXNzPVwidGl0bGVGb3JtXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHR7e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19XG5cdFx0XHRcdFx0XHRcdFx0XHQ8bWF0LWljb24+e3twcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc0ljb24nKS52YWx1ZX19PC9tYXQtaWNvbj5cblx0XHRcdFx0XHRcdFx0XHQ8L21hdC1wYW5lbC1kZXNjcmlwdGlvbj5cblx0XHRcdFx0XHRcdFx0PC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cblx0XHRcdFx0XHRcdCAgPGtvYWxhLWR5bmFtaWMtZm9ybVxuXHRcdFx0XHRcdFx0XHQgIFtzaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnXT1cIml0ZW0uc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZ1wiXG5cdFx0XHRcdFx0XHRcdCAgW3Nob3dGaWVsZHNdPVwiaXRlbS5zaG93RmllbGRzXCJcblx0XHRcdFx0XHRcdFx0ICBbZm9ybUNvbmZpZ109XCJpdGVtLmZvcm1Db25maWdcIlxuXHRcdFx0XHRcdFx0XHQgIFtmb3JtXT1cIml0ZW0uZm9ybVwiXG4gICAgICAgICAgICAgICAgW3RhYkluZGV4U3RhcnRdPVwidGFiSW5kZXhTdGFydCArIGlcIj5cblx0XHRcdFx0XHRcdCAgPC9rb2FsYS1keW5hbWljLWZvcm0+XG5cdFx0XHRcdFx0ICAgIDxtYXQtYWN0aW9uLXJvd1xuXHRcdFx0XHRcdFx0ICAgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5sZW5ndGggPiBwcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc01pbkl0ZW1zJykudmFsdWVcIj5cblx0XHRcdFx0XHQgICAgICA8YnV0dG9uXG5cdFx0XHRcdFx0XHQgICAgICAoY2xpY2spPVwicmVtb3ZlTW9yZUl0ZW0oaSwgcHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5sZW5ndGggLSAxIC0gaW5kZXhNb3JlSXRlbXMpXCJcblx0XHRcdFx0XHRcdCAgICAgIG1hdC1pY29uLWJ1dHRvbj5cblx0XHRcdFx0XHRcdCAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuXHRcdFx0XHRcdCAgICAgIDwvYnV0dG9uPlxuXHRcdFx0XHRcdCAgICA8L21hdC1hY3Rpb24tcm93PlxuXHRcdFx0XHRcdCAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuXHRcdFx0XHQgIDwvbWF0LWFjY29yZGlvbj5cblx0XHRcdCAgPC9maWVsZHNldD5cblx0XHQgIDwvZGl2PlxuXHRcdCAgPG1hdC1mb3JtLWZpZWxkXG5cdFx0XHQgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmF1dG9jb21wbGV0ZVwiXG5cdFx0XHQgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcblx0XHRcdCAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuXHRcdFx0ICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcblx0XHRcdCAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cblx0ICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19IHt7cHJvcHJpZWRhZGUuZ2V0KCdtdWx0aXBsZScpLnZhbHVlICYmXG5cdCAgICAgIHByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZSA/ICcqJyA6ICcnfX08L21hdC1sYWJlbD5cblx0XHRcdCAgPGRpdiAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnbXVsdGlwbGUnKS52YWx1ZSBlbHNlIHNpbmdsZVwiPlxuXHQgICAgICAgIDxtYXQtY2hpcC1saXN0ICNjaGlwTGlzdD5cblx0ICAgICAgICAgIDxtYXQtY2hpcFxuXHRcdCAgICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmVPcHRpb25PbkF1dG9jb21wbGV0ZShpLCBvcHRpb24pXCJcblx0XHQgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wcmllZGFkZS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS52YWx1ZVwiXG5cdFx0ICAgICAgICAgIFtjb2xvcl09XCJnZXRDb2xvckNoaXAocHJvcHJpZWRhZGUuZ2V0KCdhdXRvY29tcGxldGVNdWx0aXBsZUNvbmZpZycpLnZhbHVlIHwgYXN5bmMpXCJcblx0XHQgICAgICAgICAgW3JlbW92YWJsZV09XCJ0cnVlXCJcblx0XHQgICAgICAgICAgW3NlbGVjdGFibGVdPVwidHJ1ZVwiPlxuXHQgICAgICAgICAgICB7e2Rpc3BsYXkob3B0aW9uKX19XG5cdFx0ICAgICAgICAgIDxtYXQtaWNvbiBtYXRDaGlwUmVtb3ZlPmNhbmNlbDwvbWF0LWljb24+XG5cdCAgICAgICAgICA8L21hdC1jaGlwPlxuXHQgICAgICAgICAgPGlucHV0XG5cdFx0ICAgICAgICAgICNhdXRvY29tcGxldGVJbnB1dFxuICAgICAgICAgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcblx0XHQgICAgICAgICAgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG5cdFx0ICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG5cdFx0ICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RcIlxuICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuXHRcdCAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG5cdFx0ICAgICAgICAgIG1hdElucHV0XG5cdFx0ICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcblx0XHQgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY2lvbmUgdW0gb3UgbWFpcyBvcMOnw7Vlcy4uLlwiPlxuXHQgICAgICAgIDwvbWF0LWNoaXAtbGlzdD5cblx0ICAgICAgPC9kaXY+XG5cdCAgICAgIDxuZy10ZW1wbGF0ZSAjc2luZ2xlPlxuXHRcdCAgICAgIDxpbnB1dFxuXHRcdFx0ICAgICAgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcbiAgICAgICAgICAgIFtrb2FsYUF1dG9Gb2N1c109XCJwcm9wcmllZGFkZS5nZXQoJ2ZvY3VzJykudmFsdWVcIlxuXHRcdFx0ICAgICAgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG4gICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcblx0XHRcdCAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcblx0XHRcdCAgICAgIG1hdElucHV0XG5cdFx0XHQgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZSB1bWEgb3DDp8Ojby4uLlwiXG5cdFx0XHQgICAgICB0eXBlPVwidGV4dFwiPlxuXHQgICAgICA8L25nLXRlbXBsYXRlPlxuXHQgICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ2F1dG9jb21wbGV0ZUxvYWRpbmcnKS52YWx1ZSB8IGFzeW5jXCIgY29sb3I9XCJwcmltYXJ5XCJcblx0ICAgICAgICAgICAgICAgICAgIG1hdFN1ZmZpeD48L21hdC1zcGlubmVyPlxuXHQgICAgICA8YnV0dG9uXG5cdFx0ICAgICAgKGNsaWNrKT1cImNsZWFyQXV0b2NvbXBsZXRlKGkpXCJcblx0XHQgICAgICAqbmdJZj1cIlxuXHQgICAgICAgICAgIShwcm9wcmllZGFkZS5nZXQoJ2F1dG9jb21wbGV0ZUxvYWRpbmcnKS52YWx1ZSB8IGFzeW5jKSAmJlxuXHQgICAgICAgICAgIXByb3ByaWVkYWRlLmdldCgnZGlzYWJsZWQnKS52YWx1ZVwiXG5cdFx0ICAgICAgY29sb3I9XCJ3YXJuXCJcblx0XHQgICAgICBtYXQtaWNvbi1idXR0b25cblx0XHQgICAgICBtYXRTdWZmaXhcblx0XHQgICAgICB0eXBlPVwiYnV0dG9uXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cblx0ICAgICAgPC9idXR0b24+XG5cdCAgICAgIDxtYXQtaGludCAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZVwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cblx0XHQgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZX19XG5cdCAgICAgIDwvbWF0LWhpbnQ+XG5cdCAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5yZXF1aXJlZCB8fCBwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5hdXRvY29tcGxldGVTZWxlY3RlZFwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0QXV0b2NvbXBsZXRlTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWF1dG9jb21wbGV0ZVxuXHRcdCAgICAgICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCJcblx0XHQgICAgICBbZGlzcGxheVdpdGhdPVwiZGlzcGxheVwiIGF1dG9BY3RpdmVGaXJzdE9wdGlvbj5cblx0XHQgICAgICA8ZGl2ICpuZ0lmPVwiKGdldEF1dG9jb21wbGV0ZU9wdGlvbnMocHJvcHJpZWRhZGUpIHwgYXN5bmMpIGFzIG9wdGlvbnNcIj5cblx0XHQgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb25cIj5cblx0XHQgICAgICAgICAge3tvcHRpb24ubmFtZX19XG5cdFx0ICAgICAgICA8L21hdC1vcHRpb24+XG5cdFx0ICAgICAgPC9kaXY+XG5cdCAgICAgIDwvbWF0LWF1dG9jb21wbGV0ZT5cblx0ICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cdFx0ICA8ZGl2ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmZpbGVcIj5cblx0XHRcdCAgPGtvYWxhLWZpbGUtYnV0dG9uXG5cdFx0XHRcdCAgKGdldEZpbGVzKT1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5zZXRWYWx1ZSgkZXZlbnQpXCJcblx0XHRcdFx0ICBbYWNjZXB0XT1cInByb3ByaWVkYWRlLmdldCgnZmlsZUJ1dHRvbkNvbmZpZycpLnZhbHVlLmFjY2VwdFwiXG5cdFx0XHRcdCAgW2JhY2tncm91bmRDb2xvcl09XCJwcm9wcmllZGFkZS5nZXQoJ2ZpbGVCdXR0b25Db25maWcnKS52YWx1ZS5iYWNrZ3JvdW5kQ29sb3JcIlxuXHRcdFx0XHQgIFtjb2xvcl09XCJwcm9wcmllZGFkZS5nZXQoJ2ZpbGVCdXR0b25Db25maWcnKS52YWx1ZS5jb2xvclwiXG5cdFx0XHRcdCAgW2Rpc2FibGVkXT1cInByb3ByaWVkYWRlLmdldCgnZGlzYWJsZWQnKS52YWx1ZVwiXG5cdFx0XHRcdCAgW2ljb25dPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWxlQnV0dG9uQ29uZmlnJykudmFsdWUuaWNvblwiXG5cdFx0XHRcdCAgW211bHRpcGxlXT1cInByb3ByaWVkYWRlLmdldCgnbXVsdGlwbGUnKS52YWx1ZVwiXG5cdFx0XHRcdCAgW3RleHRdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWxlQnV0dG9uQ29uZmlnJykudmFsdWUudGV4dFwiPlxuXHRcdFx0ICA8L2tvYWxhLWZpbGUtYnV0dG9uPlxuXHRcdCAgPC9kaXY+XG5cdFx0ICA8ZGl2ICpuZ0lmPVwiXG5cdFx0ICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5keW5hbWljRm9ybSAmJlxuXHRcdFx0XHQoZ2V0RHluYW1pY0Zvcm1Db25maWcocHJvcHJpZWRhZGUpIHwgYXN5bmMpIGFzIGR5bmFtaWNGb3JtQ29uZmlnXCI+XG5cdFx0XHQgIDxmaWVsZHNldCAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZSBlbHNlIGR5bmFtaWNGb3JtV2l0aG91dExhYmVsXCI+XG5cdFx0XHRcdCAgPGxlZ2VuZD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9sZWdlbmQ+XG5cdFx0XHRcdCAgPGtvYWxhLWR5bmFtaWMtZm9ybVxuXHRcdFx0XHRcdCAgW2Zvcm1Db25maWddPVwiZHluYW1pY0Zvcm1Db25maWcuZm9ybUNvbmZpZ1wiXG5cdFx0XHRcdFx0ICBbZm9ybV09XCJkeW5hbWljRm9ybUNvbmZpZy5mb3JtXCJcblx0XHRcdFx0XHQgIFtzZXRWYWx1ZXNdPVwiZHluYW1pY0Zvcm1Db25maWcuc2V0VmFsdWVzXCJcblx0XHRcdFx0XHQgIFtzaG93RmllbGRzXT1cImR5bmFtaWNGb3JtQ29uZmlnLnNob3dGaWVsZHNcIlxuICAgICAgICAgICAgW3RhYkluZGV4U3RhcnRdPVwidGFiSW5kZXhTdGFydCArIGlcIj5cblx0XHRcdFx0ICA8L2tvYWxhLWR5bmFtaWMtZm9ybT5cblx0XHRcdCAgPC9maWVsZHNldD5cblx0XHRcdCAgPG5nLXRlbXBsYXRlICNkeW5hbWljRm9ybVdpdGhvdXRMYWJlbD5cblx0XHRcdFx0ICA8a29hbGEtZHluYW1pYy1mb3JtXG5cdFx0XHRcdFx0ICBbZm9ybUNvbmZpZ109XCJkeW5hbWljRm9ybUNvbmZpZy5mb3JtQ29uZmlnXCJcblx0XHRcdFx0XHQgIFtmb3JtXT1cImR5bmFtaWNGb3JtQ29uZmlnLmZvcm1cIlxuXHRcdFx0XHRcdCAgW3NldFZhbHVlc109XCJkeW5hbWljRm9ybUNvbmZpZy5zZXRWYWx1ZXNcIlxuXHRcdFx0XHRcdCAgW3Nob3dGaWVsZHNdPVwiZHluYW1pY0Zvcm1Db25maWcuc2hvd0ZpZWxkc1wiXG4gICAgICAgICAgICBbdGFiSW5kZXhTdGFydF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiPlxuXHRcdFx0XHQgIDwva29hbGEtZHluYW1pYy1mb3JtPlxuXHRcdFx0ICA8L25nLXRlbXBsYXRlPlxuXHRcdCAgPC9kaXY+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicmFkaW8tYnRuLWdyb3VwXCJcbiAgICAgICAgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucmFkaW9cIlxuICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcbiAgICAgICAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cbiAgICAgICAgPG1hdC1yYWRpby1ncm91cCBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiPlxuICAgICAgICAgIDxsYWJlbCAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZVwiPnt7cHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlfX08L2xhYmVsPlxuICAgICAgICAgIDxtYXQtcmFkaW8tYnV0dG9uXG4gICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbnMgb2YgcHJvcHJpZWRhZGUuZ2V0KCdvcGNvZXNTZWxlY3QnKS52YWx1ZVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwib3B0aW9ucy52YWx1ZVwiPlxuICAgICAgICAgICAge3tvcHRpb25zLm5hbWV9fVxuICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICA8L2Rpdj5cblx0ICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIltidG4tc3VibWl0XVwiPjwvbmctY29udGVudD5cbjwvZGl2PlxuIl19
581
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Zvcm0vc3JjL2xpYi9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUMsVUFBVSxFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBRWhHLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQVE3RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7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QixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUNwQixNQUFNLENBQUMsaUJBQWlCLENBQ3pCLENBQUM7aUJBQ0g7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVPLDBCQUEwQixDQUFDLGNBQTBELEVBQUUsS0FBK0M7UUFDNUksSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRW5CLEtBQUssTUFBTSxZQUFZLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xELElBQUksWUFBWSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFFO2dCQUNwQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNoQixNQUFNO2FBQ1A7U0FDRjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7O2lIQWxqQlUsb0JBQW9CO3FHQUFwQixvQkFBb0IsdVlDOUJqQyxpczVCQW1rQkEsbzJGRHJpQmEsb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBTmhDLFNBQVM7K0JBQ0Usb0JBQW9CLG1CQUdiLHVCQUF1QixDQUFDLE1BQU07d0lBR3RDLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0cseUJBQXlCO3NCQUFqQyxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFNMEIsaUJBQWlCO3NCQUFoRCxTQUFTO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycywgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1maWVsZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtIH0gZnJvbSAnLi9lbnVtcy9keW5hbWljLWZvcm0tdHlwZS1maWVsZC5lbnVtJztcbmltcG9ydCB7IENwZlZhbGlkYXRvciB9IGZyb20gJy4vdmFsaWRhdG9ycy9jcGYudmFsaWRhdG9yJztcbmltcG9ydCB7IENucGpWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMvY25wai52YWxpZGF0b3InO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQWJzdHJhY3QgfSBmcm9tICcuLi9mb3JtLmFic3RyYWN0JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1zZXQtdmFsdWUuaW50ZXJmYWNlJztcbmltcG9ydCB7IEF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3JzL2F1dG9jb21wbGV0ZS1zZWxlY3RlZC52YWxpZGF0b3InO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWF1dG9jb21wbGV0ZS1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtU2hvd0ZpZWxkSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2tvYWxhLmR5bmFtaWMtZm9ybS1zaG93LWZpZWxkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtU2VydmljZSB9IGZyb20gJy4va29hbGEuZHluYW1pYy1mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgS29hbGFEeW5hbWljRm9ybU1vcmVJdGVuc1Nob3dGaWVsZENvbmZpZ0ludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9rb2FsYS5keW5hbWljLWZvcm0tbW9yZS1pdGVucy1zaG93LWZpZWxkLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBLb2FsYUR5bmFtaWNGb3JtQXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWdJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1mb3JtLWF1dG9jb21wbGV0ZS1tdWx0aXBsZS1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMva29hbGEuZHluYW1pYy1mb3JtLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwiQGtvYWxhcngvdXRpbHMvb3BlcmF0b3JzL2RlbGF5XCI7XG5pbXBvcnQgeyBrb2FsYSB9IGZyb20gXCJAa29hbGFyeC91dGlsc1wiO1xuaW1wb3J0IHsgRGF0ZU1pblZhbGlkYXRvciB9IGZyb20gXCIuL3ZhbGlkYXRvcnMvZGF0ZS1taW4udmFsaWRhdG9yXCI7XG5pbXBvcnQgeyBEYXRlTWF4VmFsaWRhdG9yIH0gZnJvbSBcIi4vdmFsaWRhdG9ycy9kYXRlLW1heC52YWxpZGF0b3JcIjtcbmltcG9ydCB7IEtvYWxhTGFuZ3VhZ2VIZWxwZXIgfSBmcm9tIFwiQGtvYWxhcngvdWkvY29yZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdrb2FsYS1keW5hbWljLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJ2R5bmFtaWMtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydkeW5hbWljLWZvcm0uY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybUNvbXBvbmVudCBleHRlbmRzIEZvcm1BYnN0cmFjdCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGZvcm06IEZvcm1Hcm91cDtcbiAgQElucHV0KCkgZm9ybUNvbmZpZzogS29hbGFEeW5hbWljRm9ybUZpZWxkSW50ZXJmYWNlW107XG4gIEBJbnB1dCgpIHNob3dGaWVsZHM6IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtU2hvd0ZpZWxkSW50ZXJmYWNlW10+O1xuICBASW5wdXQoKSBzaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnOiBLb2FsYUR5bmFtaWNGb3JtTW9yZUl0ZW5zU2hvd0ZpZWxkQ29uZmlnSW50ZXJmYWNlW107XG4gIEBJbnB1dCgpIHNldFZhbHVlczogQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY1NldFZhbHVlSW50ZXJmYWNlW10+O1xuICBASW5wdXQoKSB0YWJJbmRleFN0YXJ0OiBudW1iZXIgPSAxO1xuICBwdWJsaWMgY29udHJvbHM6IEZvcm1BcnJheTtcbiAgcHVibGljIHR5cGVGaWVsZCA9IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bTtcbiAgcHVibGljIGhvdXJzQW5kTWludXRlc01hc2sgPSAnMDA6MDAwJztcbiAgcHVibGljIGVycm9yTWVzc2FnZSA9IEtvYWxhTGFuZ3VhZ2VIZWxwZXI7XG5cbiAgQFZpZXdDaGlsZCgnYXV0b2NvbXBsZXRlSW5wdXQnKSBhdXRvY29tcGxldGVJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGR5bmFtaWNGb3JtU2VydmljZTogS29hbGFEeW5hbWljRm9ybVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKCkgPT4gdGhpcy5mb3JtKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICghdGhpcy5mb3JtLmdldCgnZm9ybURhdGEnKSkge1xuICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woJ2Zvcm1EYXRhJywgdGhpcy5mYi5hcnJheShbXSkpO1xuICAgIH1cbiAgICB0aGlzLmNvbnRyb2xzID0gdGhpcy5mb3JtLmdldCgnZm9ybURhdGEnKSBhcyBGb3JtQXJyYXk7XG4gICAgdGhpcy5mb3JtQ29uZmlnPy5mb3JFYWNoKChjb25maWcsIGluZGV4Q29uZmlnKSA9PiB7XG4gICAgICBjb25zdCBuZXdGb3JtR3JvdXAgPSB0aGlzLm5ld0NvbnRyb2woY29uZmlnKTtcbiAgICAgIGlmIChjb25maWcuYXN5bmNWYWxpZGF0b3JzKSB7XG4gICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykuc2V0QXN5bmNWYWxpZGF0b3JzKGNvbmZpZy5hc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgfVxuICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5keW5hbWljRm9ybSkge1xuICAgICAgICBjb25zdCBmb3JtR3JvdXBEeW5hbWljRm9ybXNTdWJqZWN0ID0gbmV3Rm9ybUdyb3VwLmdldCgnZHluYW1pY0Zvcm1Db25maWcnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZT47XG4gICAgICAgIGZvcm1Hcm91cER5bmFtaWNGb3Jtc1N1YmplY3Quc3Vic2NyaWJlKGZvcm1Hcm91cENvbmZpZyA9PiB7XG4gICAgICAgICAgaWYgKGZvcm1Hcm91cENvbmZpZykge1xuICAgICAgICAgICAgZm9ybUdyb3VwQ29uZmlnLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChmb3JtR3JvdXBDb25maWcuZm9ybS52YWxpZCAmJiAoY29uZmlnLnZhbHVlQ2hhbmdlcyB8fCB0aGlzLnNob3dGaWVsZHNNb3JlSXRlbnNDb25maWcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5lbWl0RGF0YShmb3JtR3JvdXBDb25maWcuZm9ybSk7XG4gICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgndmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZy52YWx1ZUNoYW5nZXMgfHxcbiAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUgfHxcbiAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5keW5hbWljRm9ybSB8fFxuICAgICAgICB0aGlzLnNob3dGaWVsZHNNb3JlSXRlbnNDb25maWdcbiAgICAgICkge1xuICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgICAgICBjb25zdCBhdXRvY29tcGxldGVPcHRpb25zU3ViamVjdCA9IG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnMnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdPjtcbiAgICAgICAgICBpZiAoYXV0b2NvbXBsZXRlT3B0aW9uc1N1YmplY3QpIHtcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZU9wdGlvbnNTdWJqZWN0LnN1YnNjcmliZShvcHRpb25zID0+IG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZCcpLnZhbHVlLm5leHQob3B0aW9ucykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCd2YWx1ZScpXG4gICAgICAgICAgICAgICAgICAgIC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDMwMCkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q29uZmlnRHluYW1pY0Zvcm0obmV3Rm9ybUdyb3VwKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuaGFzT3duUHJvcGVydHkoJ25hbWUnKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdtdWx0aXBsZScpLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0Zvcm1Hcm91cC5nZXQoJ211bHRpcGxlJykudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0ZUF1dG9jb21wbGV0ZVNlbGVjdChuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWUsIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykudmFsdWUucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZUlucHV0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbmV3Rm9ybUdyb3VwLmdldCgnbXVsdGlwbGUnKS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUoa29hbGEodGhpcy5mb3JtQ29uZmlnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcnJheTxLb2FsYUR5bmFtaWNGb3JtRmllbGRJbnRlcmZhY2U+KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKG5ld0Zvcm1Hcm91cC5nZXQoJ25hbWUnKS52YWx1ZSwgJ25hbWUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpWzBdPy5hdXRvY29tcGxldGVEZWZhdWx0VmFsdWVPbkNsZWFyID8/IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hdXRvY29tcGxldGVUeXBlID09PSAnYWxsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZU9wdGlvbnNTdWJqZWN0ID0gbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlT3B0aW9ucycpLnZhbHVlIGFzIEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlW10+O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZU9wdGlvbnNGaWx0ZXJlZCcpLnZhbHVlLm5leHQodGhpcy5hdXRvY29tcGxldGVGaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGVPcHRpb25zU3ViamVjdC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZVR5cGUgPT09ICdvbkRlbWFuZCcgJiYgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZGVyID0gbmV3Rm9ybUdyb3VwLmdldCgnYXV0b2NvbXBsZXRlTG9hZGluZycpLnZhbHVlIGFzIEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIubmV4dCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYXV0b2NvbXBsZXRlRmlsdGVyKHZhbHVlKS5zdWJzY3JpYmUob3B0aW9ucyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtR3JvdXAuZ2V0KCdhdXRvY29tcGxldGVPcHRpb25zRmlsdGVyZWQnKS52YWx1ZS5uZXh0KG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcudmFsdWVDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnZhbHVlQ2hhbmdlcygobmV3Rm9ybUdyb3VwLmdldCgnbXVsdGlwbGUnKS52YWx1ZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS52YWx1ZS5tYXAoaXRlbSA9PiBpdGVtLnZhbHVlKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1Hcm91cC5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS52YWx1ZT8udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcudmFsdWVDaGFuZ2VzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5jb250cm9scy5wdXNoKG5ld0Zvcm1Hcm91cCk7XG4gICAgICBpZiAoY29uZmlnLm1vcmVJdGVtc0NvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLm1vcmVJdGVtc01pbkl0ZW1zID4gMCkge1xuICAgICAgICAgIGZvciAobGV0IG1pbiA9IDA7IG1pbiA8IGNvbmZpZy5tb3JlSXRlbXNNaW5JdGVtczsgbWluKyspIHtcbiAgICAgICAgICAgIGlmIChtaW4gPD0gY29uZmlnLm1vcmVJdGVtc01heEl0ZW1zKSB7XG4gICAgICAgICAgICAgIHRoaXMuYWRkTW9yZUl0ZW0oaW5kZXhDb25maWcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLm1vcmVJdGVtc0NvbmZpZy5zZXRWYWx1ZXMpIHtcbiAgICAgICAgICBjb25maWcubW9yZUl0ZW1zQ29uZmlnXG4gICAgICAgICAgICAgICAgLnNldFZhbHVlc1xuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoYXN5bmMgdmFsdWVzID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaCgoaXRlbVZhbHVlLCBpbmRleFZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW2luZGV4Q29uZmlnXS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlW2luZGV4VmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1vcmVJdGVtKGluZGV4Q29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlc09uRmllbGRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbaW5kZXhDb25maWddLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWVbaW5kZXhWYWx1ZV0uZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0aGlzLnNob3dGaWVsZHMpIHtcbiAgICAgIHRoaXMuY2hhbmdlVmlzaWJpbGl0eUZpZWxkcyh0aGlzLnNob3dGaWVsZHMsIHRoaXMuZm9ybSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNldFZhbHVlcykge1xuICAgICAgdGhpcy5zZXRWYWx1ZXNPbkZpZWxkcyh0aGlzLnNldFZhbHVlcywgdGhpcy5mb3JtKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaG91cnNBbmRNaW51dGVzQXBwbHlNYXNrKGluZGV4OiBudW1iZXIsIGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuY29udHJvbHM/LmNvbnRyb2xzW2luZGV4XTtcbiAgICBjb25zdCB0eXBlID0gY29udHJvbD8uZ2V0KCd0eXBlJykudmFsdWUgYXMgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtO1xuICAgIGlmICh0eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uaG91cnNBbmRNaW51dGVzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2w/LmdldCgndmFsdWUnKS52YWx1ZTtcbiAgICAgIGlmIChldmVudC5rZXkgPT0gJ0JhY2tzcGFjZScgJiYgdmFsdWUubGVuZ3RoIDwgNikge1xuICAgICAgICB0aGlzLmhvdXJzQW5kTWludXRlc01hc2sgPSAnMDA6MDAwJztcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ICE9ICdCYWNrc3BhY2UnICYmIHZhbHVlLmxlbmd0aCA+PSA2KSB7XG4gICAgICAgIHRoaXMuaG91cnNBbmRNaW51dGVzTWFzayA9ICcwMDA6MDAnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwYXNzd29yZFZpZXcoaW5kZXg6IG51bWJlcikge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2xzPy5jb250cm9sc1tpbmRleF07XG4gICAgY29uc3QgaGlkZVBhc3N3b3JkID0gIWNvbnRyb2w/LmdldCgnaGlkZVBhc3N3b3JkJykudmFsdWU7XG4gICAgY29udHJvbD8uZ2V0KCdoaWRlUGFzc3dvcmQnKS5zZXRWYWx1ZShoaWRlUGFzc3dvcmQpO1xuICAgIGNvbnRyb2w/LmdldCgndHlwZScpLnNldFZhbHVlKGhpZGVQYXNzd29yZCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnBhc3N3b3JkIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0udGV4dFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYWRkTW9yZUl0ZW0ocHJvcEluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUubGVuZ3RoIDwgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zTWF4SXRlbXMnKS52YWx1ZSkge1xuICAgICAgY29uc3QgZm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7fSk7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5wdXNoKHtcbiAgICAgICAgZm9ybTogZm9ybUdyb3VwLFxuICAgICAgICBmb3JtQ29uZmlnOiB0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS5tb3JlSXRlbXNDb25maWcuZm9ybUNvbmZpZyxcbiAgICAgICAgc2hvd0ZpZWxkczogbmV3IEJlaGF2aW9yU3ViamVjdDxCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2VbXT5bXT4oW10pLFxuICAgICAgICBzaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnOiB0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS5tb3JlSXRlbXNDb25maWcuc2hvd0ZpZWxkc0NvbmZpZ1xuICAgICAgfSk7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNFeHBhbmRlZCcpLnNldFZhbHVlKFxuICAgICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5sZW5ndGggLSAxXG4gICAgICApO1xuICAgICAgY29uc3QgZm9ybUFycmF5TW9yZUl0ZW1zID0gdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zRm9ybUdyb3VwJykgYXMgRm9ybUFycmF5O1xuICAgICAgZm9ybUFycmF5TW9yZUl0ZW1zLnB1c2goZm9ybUdyb3VwKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlTW9yZUl0ZW0ocHJvcEluZGV4OiBudW1iZXIsIHJlbW92ZUluZGV4KSB7XG4gICAgY29uc3QgZXhwYW5kZWRJdGVtSW5kZXggPSByZW1vdmVJbmRleCAtIDE7XG4gICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnbW9yZUl0ZW1zQ29uZmlnJykudmFsdWUuc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ21vcmVJdGVtc0V4cGFuZGVkJykuc2V0VmFsdWUoKGV4cGFuZGVkSXRlbUluZGV4IDwgMCkgPyAwIDogZXhwYW5kZWRJdGVtSW5kZXgpO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckF1dG9jb21wbGV0ZShwcm9wSW5kZXg6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdtdWx0aXBsZScpLnZhbHVlKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUoW10pO1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgndmFsdWUnKS5zZXRWYWx1ZShudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb250cm9scy5jb250cm9sc1twcm9wSW5kZXhdLmdldCgnYXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWx1ZScpLnNldFZhbHVlKHRoaXMuZm9ybUNvbmZpZ1twcm9wSW5kZXhdLmF1dG9jb21wbGV0ZURlZmF1bHRWYWx1ZU9uQ2xlYXIgPz8gbnVsbCk7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCd2YWx1ZScpLnNldFZhbHVlKHRoaXMuZm9ybUNvbmZpZ1twcm9wSW5kZXhdLmF1dG9jb21wbGV0ZURlZmF1bHRWYWx1ZU9uQ2xlYXIgPz8gbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc3BsYXkob3B0aW9uPzogS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvbi5uYW1lIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZU9wdGlvbk9uQXV0b2NvbXBsZXRlKHByb3BJbmRleDogbnVtYmVyLCBvcHRpb246IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS52YWx1ZS5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSBvcHRpb24pIGFzIEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXTtcbiAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCdhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlJykuc2V0VmFsdWUodmFsdWUpO1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY29udHJvbHMuY29udHJvbHNbcHJvcEluZGV4XS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS5zZXRWYWx1ZShbXSk7XG4gICAgICB0aGlzLmNvbnRyb2xzLmNvbnRyb2xzW3Byb3BJbmRleF0uZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtQ29uZmlnW3Byb3BJbmRleF0udmFsdWVDaGFuZ2VzKSB7XG4gICAgICB0aGlzLmZvcm1Db25maWdbcHJvcEluZGV4XS52YWx1ZUNoYW5nZXModmFsdWUubWFwKGl0ZW0gPT4gaXRlbS52YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDb2xvckNoaXAoY29uZmlnOiBLb2FsYUR5bmFtaWNGb3JtQXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWdJbnRlcmZhY2UpOiBUaGVtZVBhbGV0dGUge1xuICAgIHJldHVybiBjb25maWcuY29sb3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyhwcm9wcmllZGFkZTogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgcmV0dXJuIHByb3ByaWVkYWRlLmdldCgnYXV0b2NvbXBsZXRlT3B0aW9uc0ZpbHRlcmVkJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PGFueVtdPjtcbiAgfVxuXG4gIHB1YmxpYyBnZXREeW5hbWljRm9ybUNvbmZpZyhwcm9wcmllZGFkZTogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgcmV0dXJuIHByb3ByaWVkYWRlLmdldCgnZHluYW1pY0Zvcm1Db25maWcnKS52YWx1ZSBhcyBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZT47XG4gIH1cblxuICBwcml2YXRlIG5ld0NvbnRyb2woY29uZmlnOiBLb2FsYUR5bmFtaWNGb3JtRmllbGRJbnRlcmZhY2UpOiBGb3JtR3JvdXAge1xuICAgIGxldCB2YWxpZGF0b3JzID0gY29uZmlnLnN5bmNWYWxpZGF0b3JzID8/IFtdO1xuICAgIGxldCB2YWx1ZTogYW55ID0gY29uZmlnLnZhbHVlID8/ICcnO1xuICAgIGxldCB2YWx1ZVNlbGVjdGVkQXV0b2NvbXBsZXRlOiBLb2FsYUR5bmFtaWNBdXRvY29tcGxldGVPcHRpb25zSW50ZXJmYWNlIHwgS29hbGFEeW5hbWljQXV0b2NvbXBsZXRlT3B0aW9uc0ludGVyZmFjZVtdID0gKFxuICAgICAgY29uZmlnLm11bHRpcGxlID8gW10gOiAoY29uZmlnLmF1dG9jb21wbGV0ZURlZmF1bHRWYWx1ZU9uQ2xlYXIgPz8gbnVsbClcbiAgICApO1xuXG4gICAgaWYgKGNvbmZpZy5yZXF1aXJlZCA9PT0gdHJ1ZSkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgIGlmIChjb25maWcubWluICYmIHR5cGVvZiBjb25maWcubWluID09PSBcIm51bWJlclwiKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW4oY29uZmlnLm1pbikpO1xuICAgIGlmIChjb25maWcubWF4ICYmIHR5cGVvZiBjb25maWcubWF4ID09PSBcIm51bWJlclwiKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXgoY29uZmlnLm1heCkpO1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZGF0ZSB8fFxuICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5kYXRldGltZSB8fFxuICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS50aW1lXG4gICAgKSB7XG4gICAgICBpZiAoY29uZmlnLm1pbiAmJiB0eXBlb2YgY29uZmlnLm1pbiA9PT0gXCJzdHJpbmdcIikgeyB2YWxpZGF0b3JzLnB1c2goRGF0ZU1pblZhbGlkYXRvcihjb25maWcubWluKSk7IH1cbiAgICAgIGlmIChjb25maWcubWF4ICYmIHR5cGVvZiBjb25maWcubWF4ID09PSBcInN0cmluZ1wiKSB7IHZhbGlkYXRvcnMucHVzaChEYXRlTWF4VmFsaWRhdG9yKGNvbmZpZy5tYXgpKTsgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLm1pbkxlbmd0aCkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKGNvbmZpZy5taW5MZW5ndGgpKTtcbiAgICBpZiAoY29uZmlnLm1heExlbmd0aCkgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKGNvbmZpZy5tYXhMZW5ndGgpKTtcblxuICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmNwZikge1xuICAgICAgdmFsaWRhdG9ycy5wdXNoKENwZlZhbGlkYXRvcik7XG4gICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmNucGopIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChDbnBqVmFsaWRhdG9yKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZW1haWwpIHtcbiAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLmVtYWlsKTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uYXV0b2NvbXBsZXRlKSB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdmFsdWVTZWxlY3RlZEF1dG9jb21wbGV0ZSA9IHZhbHVlO1xuICAgICAgICB2YWx1ZSA9IChjb25maWcubXVsdGlwbGUgPyB2YWx1ZVNlbGVjdGVkQXV0b2NvbXBsZXRlWzBdIDogdmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5yZXF1aXJlZCA9PT0gdHJ1ZSkge1xuICAgICAgICB2YWxpZGF0b3JzLnB1c2goQXV0b2NvbXBsZXRlU2VsZWN0ZWRWYWxpZGF0b3IpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5jaGVja2JveCkge1xuICAgICAgdmFsdWUgPSBjb25maWcudmFsdWUgPz8gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5ob3Vyc0FuZE1pbnV0ZXMgJiZcbiAgICAgIHZhbHVlLmxlbmd0aCA+PSA2XG4gICAgKSB7XG4gICAgICB0aGlzLmhvdXJzQW5kTWludXRlc01hc2sgPSAnMDAwOjAwJztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnKSB7XG4gICAgICBjb25zdCBjbG9uZUR5bmFtaWNGb3JtQ29uZmlnID0ge30gYXMgS29hbGFEeW5hbWljRm9ybUNvbmZpZ0ludGVyZmFjZTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2xvbmVEeW5hbWljRm9ybUNvbmZpZywgY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnKTtcbiAgICAgIGNsb25lRHluYW1pY0Zvcm1Db25maWcuZm9ybSA9IGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZy5mb3JtO1xuICAgICAgY29uZmlnLmR5bmFtaWNGb3JtQ29uZmlnID0gY2xvbmVEeW5hbWljRm9ybUNvbmZpZztcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnNob3cgPT09IGZhbHNlKSB7XG4gICAgICB2YWxpZGF0b3JzID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHNob3c6IFtuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGNvbmZpZy5zaG93ID8/IHRydWUpXSxcbiAgICAgIGxhYmVsOiBbY29uZmlnLmxhYmVsXSxcbiAgICAgIG5hbWU6IFtjb25maWcubmFtZV0sXG4gICAgICB0eXBlOiBbY29uZmlnLnR5cGVdLFxuICAgICAgZmlsZUJ1dHRvbkNvbmZpZzogW3tcbiAgICAgICAgaWNvbjogY29uZmlnPy5maWxlQnV0dG9uQ29uZmlnPy5pY29uID8/ICdhdHRhY2hfZmlsZScsXG4gICAgICAgIHRleHQ6IGNvbmZpZz8uZmlsZUJ1dHRvbkNvbmZpZz8udGV4dCA/PyAnQ2xpcXVlIHBhcmEgYW5leGFyIGFycXVpdm9zJyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBjb25maWc/LmZpbGVCdXR0b25Db25maWc/LmJhY2tncm91bmRDb2xvciA/PyAnd2hpdGUnLFxuICAgICAgICBjb2xvcjogY29uZmlnPy5maWxlQnV0dG9uQ29uZmlnPy5jb2xvciA/PyAnYmx1ZScsXG4gICAgICAgIGFjY2VwdDogY29uZmlnPy5maWxlQnV0dG9uQ29uZmlnPy5hY2NlcHQgPz8gJyonXG4gICAgICB9XSxcbiAgICAgIGR5bmFtaWNGb3JtQ29uZmlnOiBbbmV3IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtQ29uZmlnSW50ZXJmYWNlPihjb25maWcuZHluYW1pY0Zvcm1Db25maWcpXSxcbiAgICAgIGR5bmFtaWNGb3JtR3JvdXA6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgICAgYXBwZWFyYW5jZTogW2NvbmZpZy5hcHBlYXJhbmNlXSxcbiAgICAgIGZsb2F0TGFiZWw6IFtjb25maWcuZmxvYXRMYWJlbF0sXG4gICAgICBwbGFjZWhvbGRlcjogW2NvbmZpZy5wbGFjZWhvbGRlcl0sXG4gICAgICBjbGFzczogW2NvbmZpZy5jbGFzc10sXG4gICAgICBmaWVsZENsYXNzOiBbY29uZmlnLmZpZWxkQ2xhc3NdLFxuICAgICAgdGV4dEhpbnQ6IFtjb25maWcudGV4dEhpbnRdLFxuICAgICAgcmVxdWlyZWQ6IFtjb25maWcucmVxdWlyZWQgPz8gZmFsc2VdLFxuICAgICAgbWluOiBbY29uZmlnLm1pbiA/PyAwXSxcbiAgICAgIG1heDogW2NvbmZpZy5tYXggPz8gOTk5OTk5OTk5OTldLFxuICAgICAgbWluTGVuZ3RoOiBbY29uZmlnLm1pbkxlbmd0aCA/PyAwXSxcbiAgICAgIG1heExlbmd0aDogW2NvbmZpZy5tYXhMZW5ndGggPz8gMjU1XSxcbiAgICAgIGRpc2FibGVkOiBbY29uZmlnLmRpc2FibGVkID8/IGZhbHNlXSxcbiAgICAgIGZvY3VzOiBbY29uZmlnLmZvY3VzID8/IGZhbHNlXSxcbiAgICAgIG11bHRpcGxlOiBbY29uZmlnLm11bHRpcGxlID8/IGZhbHNlXSxcbiAgICAgIG9wY29lc1NlbGVjdDogW2NvbmZpZy5vcGNvZXNTZWxlY3QgPz8gW11dLFxuICAgICAgaGlkZVBhc3N3b3JkOiBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnBhc3N3b3JkID8gdHJ1ZSA6IG51bGwsXG4gICAgICBtb3JlSXRlbXNCdXR0b25JY29uQWRkbGFiZWw6IFtjb25maWcubW9yZUl0ZW1zQnV0dG9uSWNvbkFkZGxhYmVsXSxcbiAgICAgIG1vcmVJdGVtc01pbkl0ZW1zOiBbY29uZmlnLm1vcmVJdGVtc01pbkl0ZW1zID8/IDBdLFxuICAgICAgbW9yZUl0ZW1zTWF4SXRlbXM6IFtjb25maWcubW9yZUl0ZW1zTWF4SXRlbXMgPz8gMTAwXSxcbiAgICAgIG1vcmVJdGVtc0ljb246IFtjb25maWcubW9yZUl0ZW1zSWNvbl0sXG4gICAgICBtb3JlSXRlbXNJY29uRm9udENvbG9yOiBbY29uZmlnLm1vcmVJdGVtc0ljb25Gb250Q29sb3JdLFxuICAgICAgbW9yZUl0ZW1zSWNvbkJhY2tncm91bmRDb2xvcjogW2NvbmZpZy5tb3JlSXRlbXNJY29uQmFja2dyb3VuZENvbG9yXSxcbiAgICAgIG1vcmVJdGVtc0V4cGFuZGVkOiBbJyddLFxuICAgICAgbW9yZUl0ZW1zQ29uZmlnOiBbW11dLFxuICAgICAgbW9yZUl0ZW1zRm9ybUdyb3VwOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICAgIGF1dG9jb21wbGV0ZUxvYWRpbmc6IFtuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKV0sXG4gICAgICBhdXRvY29tcGxldGVPcHRpb25zOiBbY29uZmlnLmF1dG9jb21wbGV0ZU9wdGlvbnNdLFxuICAgICAgYXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWc6IFtjb25maWcuYXV0b2NvbXBsZXRlTXVsdGlwbGVDb25maWddLFxuICAgICAgYXV0b2NvbXBsZXRlT3B0aW9uc0ZpbHRlcmVkOiBbbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KFtdKV0sXG4gICAgICBhdXRvY29tcGxldGVTZWxlY3RlZFZhbHVlOiBbdmFsdWVTZWxlY3RlZEF1dG9jb21wbGV0ZV0sXG4gICAgICB0ZXh0TG9nczogW2NvbmZpZz8udGV4dE9ic10sXG4gICAgICBjdXN0b21NYXNjOiBbY29uZmlnPy5jdXN0b21NYXNjXSxcbiAgICAgIGN1c3RvbU1hc2NUaG91c2FuZFNlcGFyYXRvcjogW2NvbmZpZz8uY3VzdG9tTWFzY1Rob3VzYW5kU2VwYXJhdG9yID8/ICcnXSxcbiAgICAgIGN1c3RvbU1hc2NTdWZmaXg6IFtjb25maWc/LmN1c3RvbU1hc2NTdWZmaXggPz8gJyddLFxuICAgICAgY3VzdG9tTWFzY1ByZWZpeDogW2NvbmZpZz8uY3VzdG9tTWFzY1ByZWZpeCA/PyAnJ10sXG4gICAgICB2YWx1ZTogW3t2YWx1ZSwgZGlzYWJsZWQ6IGNvbmZpZy5kaXNhYmxlZH0sIHZhbGlkYXRvcnMsIGNvbmZpZy5hc3luY1ZhbGlkYXRvcnNdXG4gICAgfSk7XG5cbiAgICBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZVR5cGUgPT09IFwib25EZW1hbmRcIikge1xuICAgICAgY29uc3QgbG9hZGVyID0gZmllbGQuZ2V0KCdhdXRvY29tcGxldGVMb2FkaW5nJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICAgICAgbG9hZGVyLm5leHQodHJ1ZSk7XG4gICAgICBjb25maWcuYXV0b2NvbXBsZXRlRmlsdGVyKCcnKS5zdWJzY3JpYmUob3B0aW9ucyA9PiB7XG4gICAgICAgIGZpZWxkLmdldCgnYXV0b2NvbXBsZXRlT3B0aW9uc0ZpbHRlcmVkJykudmFsdWUubmV4dChvcHRpb25zKTtcbiAgICAgICAgbG9hZGVyLm5leHQoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpZWxkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRWYWx1ZXNPbkZpZWxkcyhzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8S29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2VbXT4sIGZvcm06IEZvcm1Hcm91cCkge1xuICAgIHN1YmplY3Quc3Vic2NyaWJlKGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgY29uc3QgZm9ybUFycmF5ID0gZm9ybS5nZXQoJ2Zvcm1EYXRhJykgYXMgRm9ybUFycmF5O1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgaXRlbS52YWx1ZXMoKSkge1xuICAgICAgICAgIHRoaXMuc2V0VmFsdWVCeVByb3AoZm9ybUFycmF5LCBwcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VWaXNpYmlsaXR5RmllbGRzKHN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNGb3JtU2hvd0ZpZWxkSW50ZXJmYWNlW10+LCBmb3JtOiBGb3JtR3JvdXApIHtcbiAgICBzdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKDUpKS5zdWJzY3JpYmUoaXRlbSA9PiB7XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSBmb3JtLmdldCgnZm9ybURhdGEnKSBhcyBGb3JtQXJyYXk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBpdGVtLnZhbHVlcygpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbaW5kZXhDb250cm9sLCBjb250cm9sXSBvZiBmb3JtQXJyYXkuY29udHJvbHMuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbC5nZXQoJ25hbWUnKS52YWx1ZSA9PT0gcHJvcC5uYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCdzaG93JykudmFsdWUubmV4dChwcm9wLnNob3cpO1xuICAgICAgICAgICAgICBjb25zdCBjb25maWc6IEtvYWxhRHluYW1pY0Zvcm1GaWVsZEludGVyZmFjZSA9IHRoaXMuZm9ybUNvbmZpZ1tpbmRleENvbnRyb2xdID8/IG51bGw7XG4gICAgICAgICAgICAgIGlmIChwcm9wLnNob3cpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsaWRhdG9ycyA9IFtdO1xuICAgICAgICAgICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmR5bmFtaWNGb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1BcnJheU1vcmVJdGVtcyA9IGNvbnRyb2wuZ2V0KCdkeW5hbWljRm9ybUdyb3VwJykgYXMgRm9ybUFycmF5O1xuICAgICAgICAgICAgICAgICAgICBmb3JtQXJyYXlNb3JlSXRlbXMucHVzaChjb25maWc/LmR5bmFtaWNGb3JtQ29uZmlnPy5mb3JtKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMgPSBjb25maWcuc3luY1ZhbGlkYXRvcnMgPz8gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcucmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uY3BmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKENwZlZhbGlkYXRvcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5jbnBqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKENucGpWYWxpZGF0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZW1haWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnJlcXVpcmVkID09PSB0cnVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnR5cGUgPT09IER5bmFtaWNGb3JtVHlwZUZpZWxkRW51bS5hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKEF1dG9jb21wbGV0ZVNlbGVjdGVkVmFsaWRhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWluICYmIHR5cGVvZiBjb25maWcubWluID09PSBcIm51bWJlclwiKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW4oY29uZmlnLm1pbikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm1heCAmJiB0eXBlb2YgY29uZmlnLm1heCA9PT0gXCJudW1iZXJcIikgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4KGNvbmZpZy5tYXgpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZGF0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSBEeW5hbWljRm9ybVR5cGVGaWVsZEVudW0uZGF0ZXRpbWUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLnRpbWVcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5taW4gJiYgdHlwZW9mIGNvbmZpZy5taW4gPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNaW5WYWxpZGF0b3IoY29uZmlnLm1pbikpOyB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5tYXggJiYgdHlwZW9mIGNvbmZpZy5tYXggPT09IFwic3RyaW5nXCIpIHsgdmFsaWRhdG9ycy5wdXNoKERhdGVNYXhWYWxpZGF0b3IoY29uZmlnLm1heCkpOyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5taW5MZW5ndGgpIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aChjb25maWcubWluTGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcubWF4TGVuZ3RoKSB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgoY29uZmlnLm1heExlbmd0aCkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbGlkYXRvcnModmFsaWRhdG9ycyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuYXN5bmNWYWxpZGF0b3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3ZhbHVlJykuc2V0QXN5bmNWYWxpZGF0b3JzKGNvbmZpZy5hc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgICAgICAgIGlmIChwcm9wLmNsZWFyQ3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5jbGVhckFzeW5jVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnNldFZhbHVlKG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCd2YWx1ZScpLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcblxuICAgICAgICAgICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gRHluYW1pY0Zvcm1UeXBlRmllbGRFbnVtLmR5bmFtaWNGb3JtKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cC5yZW1vdmVDb250cm9sKCdkeW5hbWljRm9ybUdyb3VwJyk7XG4gICAgICAgICAgICAgICAgICBmb3JtR3JvdXAuYWRkQ29udHJvbCgnZHluYW1pY0Zvcm1Hcm91cCcsIHRoaXMuZmIuYXJyYXkoW10pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGF1dG9jb21wbGV0ZUZpbHRlcihhcnI6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXSwgdmFsdWU6IHN0cmluZyk6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXSB7XG4gICAgcmV0dXJuIGFyci5maWx0ZXIoZmlsdGVyID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICBsZXQgZmluZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgLnNwbGl0KCcgJylcbiAgICAgICAgICAgICAgIC5mb3JFYWNoKHBhcnQgPT4ge1xuICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLm5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHBhcnQpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgIGZpbmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIGZpbmQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRWYWx1ZUJ5UHJvcChmb3JtQXJyYXk6IEZvcm1BcnJheSwgcHJvcDogS29hbGFEeW5hbWljU2V0VmFsdWVJbnRlcmZhY2UpIHtcbiAgICBpZiAoZm9ybUFycmF5KSB7XG4gICAgICBpZiAocHJvcC5uYW1lLmluZGV4T2YoJyA+ICcpID49IDApIHtcbiAgICAgICAgbGV0IGR5bmFtaWNGb3JtU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+O1xuICAgICAgICBjb25zdCBhcnJQcm9wTmFtZSA9IHByb3AubmFtZS5zcGxpdCgnID4gJyk7XG4gICAgICAgIGxldCBpbmRleFByb3BOYW1lID0gMDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtQXJyYXkuY29udHJvbHMuZmluZChjb250cm9sID0+IGNvbnRyb2wuZ2V0KCduYW1lJykudmFsdWUgPT09IGFyclByb3BOYW1lW2luZGV4UHJvcE5hbWVdKTtcbiAgICAgICAgICBpZiAoaW5kZXhQcm9wTmFtZSA9PT0gYXJyUHJvcE5hbWUubGVuZ3RoIC0gMikge1xuICAgICAgICAgICAgZHluYW1pY0Zvcm1TdWJqZWN0ID0gY29udHJvbC5nZXQoJ2R5bmFtaWNGb3JtQ29uZmlnJykudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBkeW5hbWljRm9ybSA9IGR5bmFtaWNGb3JtU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKGR5bmFtaWNGb3JtLmZvcm1Db25maWcuZmluZChmYyA9PiBmYy5uYW1lID09PSBhcnJQcm9wTmFtZVthcnJQcm9wTmFtZS5sZW5ndGggLSAxXSkpIHtcbiAgICAgICAgICAgICAgaWYgKGR5bmFtaWNGb3JtLnNldFZhbHVlcykge1xuICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtLnNldFZhbHVlcy5uZXh0KGtvYWxhKGR5bmFtaWNGb3JtLnNldFZhbHVlcy5nZXRWYWx1ZSgpKS5hcnJheTxhbnk+KCkubWVyZ2UoW3tcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGFyclByb3BOYW1lW2FyclByb3BOYW1lLmxlbmd0aCAtIDFdLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHByb3AudmFsdWVcbiAgICAgICAgICAgICAgICB9XSkuZ2V0VmFsdWUoKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHluYW1pY0Zvcm0uc2V0VmFsdWVzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxLb2FsYUR5bmFtaWNTZXRWYWx1ZUludGVyZmFjZVtdPihbe1xuICAgICAgICAgICAgICAgICAgbmFtZTogYXJyUHJvcE5hbWVbYXJyUHJvcE5hbWUubGVuZ3RoIC0gMV0sXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogcHJvcC52YWx1ZVxuICAgICAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpbmRleFByb3BOYW1lKys7XG4gICAgICAgIH0gd2hpbGUgKGluZGV4UHJvcE5hbWUgPCBhcnJQcm9wTmFtZS5sZW5ndGggLSAxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiBmb3JtQXJyYXkuY29udHJvbHMudmFsdWVzKCkpIHtcbiAgICAgICAgICBpZiAoY29udHJvbC5nZXQoJ25hbWUnKS52YWx1ZSA9PT0gcHJvcC5uYW1lKSB7XG4gICAgICAgICAgICBjb250cm9sLmdldCgndmFsdWUnKS5zZXRWYWx1ZShwcm9wLnZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0Q29uZmlnRHluYW1pY0Zvcm0obmV3Rm9ybUdyb3VwOiBGb3JtR3JvdXApIHtcbiAgICBpZiAodGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG5ld0Zvcm1Hcm91cC5nZXQoJ3ZhbHVlJykudmFsdWU7XG4gICAgICBjb25zdCBjb25maWdzID0gdGhpcy5zaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoY29uZmlnID0+IGNvbmZpZy5uYW1lRmllbGQgPT09IG5ld0Zvcm1Hcm91cC5nZXQoJ25hbWUnKS52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoY29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmZuU2hvdyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykge1xuICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgaWYgKGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyAmJiBjb25maWcuZm5TaG93KHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbER5bmFtaWNGb3JtQ29uZmlnID0gdGhpcy5jb250cm9sc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250cm9sc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKGNvbnRyb2wgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5maWVsZHNUb1Nob3cuaW5kZXhPZihjb250cm9sLmdldCgnbmFtZScpLnZhbHVlKSA+PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGR5bmFtaWNGb3JtQ29uZmlnU3ViamVjdCA9IGNvbnRyb2xEeW5hbWljRm9ybUNvbmZpZy5nZXQoJ2R5bmFtaWNGb3JtQ29uZmlnJykudmFsdWUgYXMgQmVoYXZpb3JTdWJqZWN0PEtvYWxhRHluYW1pY0Zvcm1Db25maWdJbnRlcmZhY2U+O1xuICAgICAgICAgICAgZHluYW1pY0Zvcm1Db25maWdTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgICAgICAgICBhd2FpdCBkZWxheSgxKTtcbiAgICAgICAgICAgIGR5bmFtaWNGb3JtQ29uZmlnU3ViamVjdC5uZXh0KGNvbmZpZy5keW5hbWljRm9ybUNvbmZpZyh2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5zaG93RmllbGRzKFxuICAgICAgICAgICAgdGhpcy5zaG93RmllbGRzLFxuICAgICAgICAgICAgY29uZmlnLmZpZWxkc1RvU2hvdyxcbiAgICAgICAgICAgIGNvbmZpZy5mblNob3codmFsdWUpLFxuICAgICAgICAgICAgY29uZmlnLmNsZWFyQ3VycmVudFZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBdXRvY29tcGxldGVTZWxlY3Qoc2VsZWN0ZWRWYWx1ZXM6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2VbXSwgdmFsdWU6IEtvYWxhRHluYW1pY0F1dG9jb21wbGV0ZU9wdGlvbnNJbnRlcmZhY2UpIHtcbiAgICBsZXQgaXNWYWxpZCA9IHRydWU7XG5cbiAgICBmb3IgKGNvbnN0IHNlbGVjdGVkSXRlbSBvZiBzZWxlY3RlZFZhbHVlcy52YWx1ZXMoKSkge1xuICAgICAgaWYgKHNlbGVjdGVkSXRlbS5uYW1lID09PSB2YWx1ZS5uYW1lKSB7XG4gICAgICAgIGlzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGlzVmFsaWQ7XG4gIH1cbn1cbiIsIjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJwLXJlbGF0aXZlIHctMTAwXCI+XG4gIDxkaXYgKm5nRm9yPVwibGV0IHByb3ByaWVkYWRlIG9mIGNvbnRyb2xzPy5jb250cm9sczsgbGV0IGkgPSBpbmRleDtcIlxuICAgICAgIFtuZ0NsYXNzXT1cIihwcm9wcmllZGFkZS5nZXQoJ3Nob3cnKS52YWx1ZSB8IGFzeW5jKSA/IHByb3ByaWVkYWRlLmdldCgnY2xhc3MnKS52YWx1ZSA6ICdkLW5vbmUnXCJcbiAgICAgICBmb3JtQXJyYXlOYW1lPVwiZm9ybURhdGFcIj5cblx0ICA8ZGl2ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCdzaG93JykudmFsdWUgfCBhc3luY1wiPlxuXHQgICAgPG1hdC1mb3JtLWZpZWxkXG5cdFx0ICAgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnRleHQgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5wYXNzd29yZCB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNwZiB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNucGogfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5kYXRldGltZSB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmVtYWlsIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQubnVtYmVyIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuc3RyaW5nTnVtYmVyIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQudGltZSB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmRhdGUgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5ob3Vyc0FuZE1pbnV0ZXMgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5waG9uZSB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnBlcmNlbnQgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jb2xvciB8fFxuXHQgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLm1vbnRoIHx8XG5cdCAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY29tcGV0ZW5jZURhdGUgfHxcbiAgICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5zdHJpbmdXaXRoQ3VzdG9tTWFzY1wiXG5cdFx0ICAgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcblx0XHQgICAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuXHRcdCAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcblx0XHQgICAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cblx0ICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9tYXQtbGFiZWw+XG5cdCAgICAgIDxpbnB1dFxuXHRcdCAgICAgIFtkcm9wU3BlY2lhbENoYXJhY3RlcnNdPVwiZmFsc2VcIlxuXHRcdCAgICAgIFtrb2FsYUF1dG9Gb2N1c109XCJwcm9wcmllZGFkZS5nZXQoJ2ZvY3VzJykudmFsdWVcIlxuXHRcdCAgICAgIChrZXl1cCk9XCJob3Vyc0FuZE1pbnV0ZXNBcHBseU1hc2soaSwgJGV2ZW50KVwiXG5cdFx0ICAgICAgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG5cdFx0ICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcblx0XHQgICAgICBbbWFza109XCIoKHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5jb21wZXRlbmNlRGF0ZSkgPyAnMDAvMDAwMCcgOiBudWxsKSB8fFxuXHRcdCAgICAgICAgICAgICAgKChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucGhvbmUpID8gJygwMCkwMDAwLTAwMDA/MCcgOiBudWxsKSB8fFxuXHRcdCAgICAgICAgICAgICAgKChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuc3RyaW5nTnVtYmVyKSA/ICcweycrcHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZSsnfScgOiBudWxsKSB8fFxuICAgICAgICAgICAgICAgICAgKChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY3BmKSA/ICcwMDAuMDAwLjAwMC0wMCcgOiBudWxsKSB8fFxuICAgICAgICAgICAgICAgICAgKChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY25waikgPyAnMDAuMDAwLjAwMC8wMDAwLTAwJyA6IG51bGwpIHx8XG4gICAgICAgICAgICAgICAgICAoKHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5wZXJjZW50KSA/ICdwZXJjZW50JyA6IG51bGwpIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoKHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5ob3Vyc0FuZE1pbnV0ZXMpID8gaG91cnNBbmRNaW51dGVzTWFzayA6IG51bGwpIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoKHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5zdHJpbmdXaXRoQ3VzdG9tTWFzYykgPyBwcm9wcmllZGFkZS5nZXQoJ2N1c3RvbU1hc2MnKS52YWx1ZSA6IG51bGwpXCJcblx0XHQgICAgICBbdmFsaWRhdGlvbl09XCJcblx0ICAgICAgICAgICAgICAgICAgICAocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNwZiAmJiBwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jcGZJbnZhbGlkKSB8fFxuXHQgICAgICAgICAgICAgICAgICAgIChwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY25waiAmJiBwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jbnBqSW52YWxpZClcIlxuXHRcdCAgICAgIFt0eXBlXT1cIigocHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNwZiB8fFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY25waiB8fFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucGhvbmUgfHxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnBlcmNlbnRcbiAgICAgICAgICAgICAgICAgICkpID8gJ3RlbCcgOiAoXG4gICAgICAgICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5tb250aCA/XG4gICAgICAgICAgICAgICAgICAgICdtb250aCcgOiAoXG4gICAgICAgICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5kYXRlID9cbiAgICAgICAgICAgICAgICAgICAgJ2RhdGUnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuZGF0ZXRpbWUgP1xuICAgICAgICAgICAgICAgICAgICAnZGF0ZXRpbWUtbG9jYWwnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuZW1haWwgP1xuICAgICAgICAgICAgICAgICAgICAnZW1haWwnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQubnVtYmVyID9cbiAgICAgICAgICAgICAgICAgICAgJ251bWJlcicgOiAoXG4gICAgICAgICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC50aW1lID9cbiAgICAgICAgICAgICAgICAgICAgJ3RpbWUnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQucGFzc3dvcmQgP1xuICAgICAgICAgICAgICAgICAgICAncGFzc3dvcmQnIDogKFxuICAgICAgICAgICAgICAgICAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuY29sb3IgP1xuICAgICAgICAgICAgICAgICAgICAnY29sb3InIDogJ3RleHQnKSkpKSkpKSlcIlxuICAgICAgICAgIFttaW5dPVwicHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZVwiXG4gICAgICAgICAgW21heF09XCJwcm9wcmllZGFkZS5nZXQoJ21heCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWluTGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIFttYXhMZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZVwiXG4gICAgICAgICAgW3Rob3VzYW5kU2VwYXJhdG9yXT1cInByb3ByaWVkYWRlLmdldCgnY3VzdG9tTWFzY1Rob3VzYW5kU2VwYXJhdG9yJykudmFsdWVcIlxuICAgICAgICAgIFtzdWZmaXhdPVwicHJvcHJpZWRhZGUuZ2V0KCdjdXN0b21NYXNjU3VmZml4JykudmFsdWVcIlxuICAgICAgICAgIFtwcmVmaXhdPVwicHJvcHJpZWRhZGUuZ2V0KCdjdXN0b21NYXNjUHJlZml4JykudmFsdWVcIlxuICAgICAgICAgIHNlcGFyYXRvckxpbWl0PVwiMFwiXG4gICAgICAgICAgYXV0b2NvbXBsZXRlPVwiLTFcIlxuXHRcdCAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcblx0XHQgICAgICBtYXRJbnB1dC8+XG5cdCAgICAgIDxidXR0b25cblx0XHQgICAgICAoY2xpY2spPVwicGFzc3dvcmRWaWV3KGkpXCJcblx0XHQgICAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnaGlkZVBhc3N3b3JkJykudmFsdWUgIT09IG51bGxcIlxuXHRcdCAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hpZGUgcGFzc3dvcmQnXCJcblx0XHQgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdoaWRlUGFzc3dvcmQnKS52YWx1ZVwiXG5cdFx0ICAgICAgbWF0LWljb24tYnV0dG9uIG1hdFN1ZmZpeCB0YWJpbmRleD1cIi0xXCIgdHlwZT1cImJ1dHRvblwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj57e3Byb3ByaWVkYWRlLmdldCgnaGlkZVBhc3N3b3JkJykudmFsdWUgPyAndmlzaWJpbGl0eV9vZmYnIDogJ3Zpc2liaWxpdHknfX08L21hdC1pY29uPlxuXHQgICAgICA8L2J1dHRvbj5cblx0ICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuXHRcdCAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cblx0ICAgICAgPC9tYXQtaGludD5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRSZXF1aXJlZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3BmSW52YWxpZFwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0SW52YWxpZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY25wakludmFsaWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldEludmFsaWRNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZSl9fVxuXHQgICAgICA8L21hdC1lcnJvcj5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmVtYWlsXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRJbnZhbGlkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5cIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbk1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWluTGVuZ3RoXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNaW5MZW5ndGhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5tYXhMZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1heExlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmRhdGVNaW5cIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldERhdGVNaW5NZXNzYWdlKCl9fVxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZSB8IGRhdGU6XCJzaG9ydERhdGVcIn19LlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmRhdGVNYXhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldERhdGVNYXhNZXNzYWdlKCl9fVxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCdtYXgnKS52YWx1ZSB8IGRhdGU6XCJzaG9ydERhdGVcIn19LlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yLm1lc3NhZ2V9fS5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG5cdCAgICA8L21hdC1mb3JtLWZpZWxkPlxuXHQgICAgPG1hdC1mb3JtLWZpZWxkXG5cdFx0ICAgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNvaW5cIlxuXHRcdCAgICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0ICAgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHQgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0ICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbWF0LWxhYmVsPlxuXHQgICAgICA8aW5wdXRcblx0XHQgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcblx0XHQgICAgICBbcmVxdWlyZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdyZXF1aXJlZCcpLnZhbHVlXCJcbiAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuICAgICAgICAgIFttaW5dPVwicHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZVwiXG4gICAgICAgICAgW21heF09XCJwcm9wcmllZGFkZS5nZXQoJ21heCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWluTGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIFttYXhMZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZVwiXG4gICAgICAgICAgYXV0b2NvbXBsZXRlPVwiLTFcIlxuXHRcdCAgICAgIGN1cnJlbmN5TWFza1xuXHRcdCAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcblx0XHQgICAgICBtYXRJbnB1dFxuXHRcdCAgICAgIHR5cGU9XCJ0ZWxcIi8+XG5cdCAgICAgIDxtYXQtaGludCAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZVwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cblx0XHQgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZX19XG5cdCAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5cIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbk1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWluTGVuZ3RoXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNaW5MZW5ndGhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5tYXhMZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1heExlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cblx0ICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkXCI+XG5cdCAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRSZXF1aXJlZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3JcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3IubWVzc2FnZX19LlxuICAgICAgICA8L21hdC1lcnJvcj5cblx0ICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuZmxvYXRcIlxuICAgICAgICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG4gICAgICAgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcbiAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdyZXF1aXJlZCcpLnZhbHVlXCJcbiAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuICAgICAgICAgIFttaW5dPVwicHJvcHJpZWRhZGUuZ2V0KCdtaW4nKS52YWx1ZVwiXG4gICAgICAgICAgW21heF09XCJwcm9wcmllZGFkZS5nZXQoJ21heCcpLnZhbHVlXCJcbiAgICAgICAgICBbbWluTGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIFttYXhMZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZVwiXG4gICAgICAgICAgYXV0b2NvbXBsZXRlPVwiLTFcIlxuICAgICAgICAgIGN1cnJlbmN5TWFza1xuICAgICAgICAgIFtvcHRpb25zXT1cIntwcmVmaXg6ICcnfVwiXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgdHlwZT1cInRlbFwiLz5cbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cbiAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1pblwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWluTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21pbicpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ubWF4XCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRNYXhNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbWF4JykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5MZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbkxlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW5MZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heExlbmd0aFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TGVuZ3RoTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ucmVxdWlyZWRcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldFJlcXVpcmVkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblx0ICAgIDxtYXQtZm9ybS1maWVsZFxuXHRcdCAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC52YWx1ZUxpc3QgfHxcblx0ICAgICAgICAgICAgIHByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC50ZXh0YXJlYVwiXG5cdFx0ICAgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcblx0XHQgICAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuXHRcdCAgICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcblx0XHQgICAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cblx0ICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9tYXQtbGFiZWw+XG5cdCAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICN0ZXh0YXJlYVxuXHRcdCAgICAgIFtrb2FsYUF1dG9Gb2N1c109XCJwcm9wcmllZGFkZS5nZXQoJ2ZvY3VzJykudmFsdWVcIlxuICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAjYXV0b3NpemU9XCJjZGtUZXh0YXJlYUF1dG9zaXplXCJcblx0XHQgICAgICBbY2RrQXV0b3NpemVNYXhSb3dzXT1cIjhcIlxuXHRcdCAgICAgIFtjZGtBdXRvc2l6ZU1pblJvd3NdPVwiM1wiXG5cdFx0ICAgICAgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG4gICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcbiAgICAgICAgICBbbWluTGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIFttYXhMZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZVwiXG5cdFx0ICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuXHRcdCAgICAgIG1hdElucHV0PlxuICAgICAgICA8L3RleHRhcmVhPlxuXHQgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWVcIj5cblx0ICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XG5cdFx0ICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWV9fVxuXHQgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8bWF0LWhpbnQgYWxpZ249XCJlbmRcIiAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWVcIj5cbiAgICAgICAgICB7e3RleHRhcmVhLnZhbHVlLmxlbmd0aH19L3t7cHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZX19XG4gICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5MZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbkxlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW5MZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heExlbmd0aFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TGVuZ3RoTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ucmVxdWlyZWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldFJlcXVpcmVkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgPC9tYXQtZm9ybS1maWVsZD5cblx0XHQgIDxtYXQtZm9ybS1maWVsZFxuXHRcdFx0ICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC50ZXh0TG9nc1wiXG5cdFx0XHQgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcblx0XHRcdCAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuXHRcdFx0ICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcblx0XHRcdCAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cblx0ICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9tYXQtbGFiZWw+XG5cdCAgICAgIDxkaXYgW2lubmVySFRNTF09XCJwcm9wcmllZGFkZS5nZXQoJ3RleHRMb2dzJykudmFsdWVcIiBjbGFzcz1cInRleHQtb2JzXCI+PC9kaXY+XG5cdCAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICN0ZXh0YXJlYVxuXHRcdCAgICAgIFtrb2FsYUF1dG9Gb2N1c109XCJwcm9wcmllZGFkZS5nZXQoJ2ZvY3VzJykudmFsdWVcIlxuICAgICAgICAgIGNka1RleHRhcmVhQXV0b3NpemVcbiAgICAgICAgICAjYXV0b3NpemU9XCJjZGtUZXh0YXJlYUF1dG9zaXplXCJcblx0XHQgICAgICBbY2RrQXV0b3NpemVNYXhSb3dzXT1cIjhcIlxuXHRcdCAgICAgIFtjZGtBdXRvc2l6ZU1pblJvd3NdPVwiM1wiXG5cdFx0ICAgICAgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG4gICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcbiAgICAgICAgICBbbWluTGVuZ3RoXT1cInByb3ByaWVkYWRlLmdldCgnbWluTGVuZ3RoJykudmFsdWVcIlxuICAgICAgICAgIFttYXhMZW5ndGhdPVwicHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZVwiXG5cdFx0ICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIlxuXHRcdCAgICAgIG1hdElucHV0PlxuXHQgICAgICA8L3RleHRhcmVhPlxuXHQgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWVcIj5cblx0ICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XG5cdFx0ICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWV9fVxuXHQgICAgICA8L21hdC1oaW50PlxuICAgICAgICA8bWF0LWhpbnQgYWxpZ249XCJlbmRcIiAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnbWF4TGVuZ3RoJykudmFsdWVcIj5cbiAgICAgICAgICB7e3RleHRhcmVhLnZhbHVlLmxlbmd0aH19L3t7cHJvcHJpZWRhZGUuZ2V0KCdtYXhMZW5ndGgnKS52YWx1ZX19XG4gICAgICAgIDwvbWF0LWhpbnQ+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5taW5MZW5ndGhcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldE1pbkxlbmd0aE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdtaW5MZW5ndGgnKS52YWx1ZSl9fVxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/Lm1heExlbmd0aFwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0TWF4TGVuZ3RoTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ21heExlbmd0aCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ucmVxdWlyZWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldFJlcXVpcmVkTWVzc2FnZShwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUpfX1cblx0ICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvclwiPlxuICAgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5jdXN0b21FcnJvci5tZXNzYWdlfX0uXG4gICAgICAgIDwvbWF0LWVycm9yPlxuXHQgICAgPC9tYXQtZm9ybS1maWVsZD5cblx0ICAgIDxtYXQtZm9ybS1maWVsZFxuXHRcdCAgICAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5zZWxlY3RcIlxuXHRcdCAgICBbYXBwZWFyYW5jZV09XCJwcm9wcmllZGFkZS5nZXQoJ2FwcGVhcmFuY2UnKS52YWx1ZVwiXG5cdFx0ICAgIFtmbG9hdExhYmVsXT1cInByb3ByaWVkYWRlLmdldCgnZmxvYXRMYWJlbCcpLnZhbHVlXCJcblx0XHQgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0ICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtbGFiZWw+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbWF0LWxhYmVsPlxuXHQgICAgICA8bWF0LXNlbGVjdCBbbXVsdGlwbGVdPVwicHJvcHJpZWRhZGUuZ2V0KCdtdWx0aXBsZScpLnZhbHVlXCIgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCI+XG5cdCAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbnMgb2YgcHJvcHJpZWRhZGUuZ2V0KCdvcGNvZXNTZWxlY3QnKS52YWx1ZVwiIFt2YWx1ZV09XCJvcHRpb25zLnZhbHVlXCI+XG5cdCAgICAgICAgICB7e29wdGlvbnMubmFtZX19XG5cdCAgICAgICAgPC9tYXQtb3B0aW9uPlxuXHQgICAgICA8L21hdC1zZWxlY3Q+XG5cdCAgICAgIDxtYXQtaGludCAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZVwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5pbmZvPC9tYXQtaWNvbj5cblx0XHQgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndGV4dEhpbnQnKS52YWx1ZX19XG5cdCAgICAgIDwvbWF0LWhpbnQ+XG5cdCAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuZXJyb3JzPy5yZXF1aXJlZFwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5lcnJvcjwvbWF0LWljb24+XG4gICAgICAgICAge3tlcnJvck1lc3NhZ2UuZ2V0UmVxdWlyZWRNZXNzYWdlKHByb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZSl9fVxuXHQgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LmN1c3RvbUVycm9yLm1lc3NhZ2V9fS5cbiAgICAgICAgPC9tYXQtZXJyb3I+XG5cdCAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgIGNsYXNzPVwic2VsZWN0LW11bHRpcGxlLW5hdGl2ZVwiXG4gICAgICAgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnNlbGVjdE11bHRpcGxlTmF0aXZlXCJcbiAgICAgICAgW2FwcGVhcmFuY2VdPVwicHJvcHJpZWRhZGUuZ2V0KCdhcHBlYXJhbmNlJykudmFsdWVcIlxuICAgICAgICBbZmxvYXRMYWJlbF09XCJwcm9wcmllZGFkZS5nZXQoJ2Zsb2F0TGFiZWwnKS52YWx1ZVwiXG4gICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuICAgICAgICBbbmdDbGFzc109XCJwcm9wcmllZGFkZS5nZXQoJ2ZpZWxkQ2xhc3MnKS52YWx1ZVwiPlxuICAgICAgICA8bWF0LWxhYmVsPnt7cHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlfX08L21hdC1sYWJlbD5cbiAgICAgICAgPHNlbGVjdFxuICAgICAgICAgIG1hdE5hdGl2ZUNvbnRyb2xcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgbXVsdGlwbGVcbiAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJwcm9wcmllZGFkZS5nZXQoJ3JlcXVpcmVkJykudmFsdWVcIj5cbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb25zIG9mIHByb3ByaWVkYWRlLmdldCgnb3Bjb2VzU2VsZWN0JykudmFsdWVcIiBbdmFsdWVdPVwib3B0aW9ucy52YWx1ZVwiPlxuICAgICAgICAgICAge3tvcHRpb25zLm5hbWV9fVxuICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPG1hdC1oaW50ICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd0ZXh0SGludCcpLnZhbHVlfX1cbiAgICAgICAgPC9tYXQtaGludD5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndmFsdWUnKS5lcnJvcnM/LnJlcXVpcmVkXCI+XG4gICAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cbiAgICAgICAgICB7e2Vycm9yTWVzc2FnZS5nZXRSZXF1aXJlZE1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG4gICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3JcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3IubWVzc2FnZX19LlxuICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cdCAgICA8ZGl2XG5cdFx0ICAgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmNoZWNrYm94XCJcblx0XHQgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG5cdFx0ICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG5cdCAgICAgIDxtYXQtY2hlY2tib3hcbiAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuXHRcdCAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcblx0XHQgICAgICB2YWx1ZT1cInRydWVcIj5cblx0ICAgICAgICB7e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19XG5cdCAgICAgIDwvbWF0LWNoZWNrYm94PlxuXHQgICAgPC9kaXY+XG5cdFx0ICA8ZGl2XG5cdFx0XHQgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLm1vcmVJdGVtc1wiXG5cdFx0XHQgIFtmb3JtR3JvdXBOYW1lXT1cImlcIlxuXHRcdFx0ICBbbmdDbGFzc109XCJwcm9wcmllZGFkZS5nZXQoJ2ZpZWxkQ2xhc3MnKS52YWx1ZVwiXG5cdFx0XHQgIGNsYXNzPVwibW9yZS1pdGVtcy1jb250ZW50XCI+XG5cdFx0XHQgIDxmaWVsZHNldD5cblx0XHRcdFx0ICA8bGVnZW5kPlxuXHRcdFx0XHRcdCAgPGtvYWxhLWJ1dHRvblxuXHRcdFx0XHRcdFx0ICAoY2xpY2spPVwiYWRkTW9yZUl0ZW0oaSlcIlxuXHRcdFx0XHRcdFx0ICBbZGlzYWJsZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5sZW5ndGggPT09IHByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zTWF4SXRlbXMnKS52YWx1ZVwiXG5cdFx0XHRcdFx0XHQgIFt0b29sdGlwXT1cInByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zQnV0dG9uSWNvbkFkZGxhYmVsJykudmFsdWVcIlxuXHRcdFx0XHRcdFx0ICBbYmFja2dyb3VuZENvbG9yXT1cInByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zSWNvbkJhY2tncm91bmRDb2xvcicpLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2NvbG9yXT1cInByb3ByaWVkYWRlLmdldCgnbW9yZUl0ZW1zSWNvbkZvbnRDb2xvcicpLnZhbHVlXCJcblx0XHRcdFx0XHRcdCAgY2xhc3M9XCJidG4tYWRkLW1vcmUtaXRlbXNcIlxuXHRcdFx0XHRcdFx0ICBpY29uPVwiYWRkXCI+XG5cdFx0XHRcdFx0ICA8L2tvYWxhLWJ1dHRvbj5cblx0XHRcdFx0XHQgIHt7cHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlfX0gKE1pbi46IHt7cHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNNaW5JdGVtcycpLnZhbHVlfX1cblx0XHRcdFx0XHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNw6F4Ljoge3twcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc01heEl0ZW1zJykudmFsdWV9fSlcblx0XHRcdFx0ICA8L2xlZ2VuZD5cblx0XHRcdFx0ICA8bWF0LWFjY29yZGlvbiBjbGFzcz1cIml0ZW1zXCIgbXVsdGk+XG5cdFx0XHRcdFx0ICA8bWF0LWV4cGFuc2lvbi1wYW5lbFxuXHRcdFx0XHRcdFx0ICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBwcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc0NvbmZpZycpLnZhbHVlLnNsaWNlKCkucmV2ZXJzZSgpOyBpbmRleCBhcyBpbmRleE1vcmVJdGVtc1wiXG5cdFx0XHRcdFx0XHQgIGV4cGFuZGVkPlxuXHRcdFx0XHRcdFx0ICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1wYW5lbC10aXRsZSBjbGFzcz1cInRpdGxlRm9ybVwiPiNcblx0XHRcdFx0XHRcdFx0XHRcdHt7cHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5sZW5ndGggLSAxIC0gaW5kZXhNb3JlSXRlbXMgKyAxfX08L21hdC1wYW5lbC10aXRsZT5cblx0XHRcdFx0XHRcdFx0XHQ8bWF0LXBhbmVsLWRlc2NyaXB0aW9uIGNsYXNzPVwidGl0bGVGb3JtXCI+XG5cdFx0XHRcdFx0XHRcdFx0XHR7e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19XG5cdFx0XHRcdFx0XHRcdFx0XHQ8bWF0LWljb24+e3twcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc0ljb24nKS52YWx1ZX19PC9tYXQtaWNvbj5cblx0XHRcdFx0XHRcdFx0XHQ8L21hdC1wYW5lbC1kZXNjcmlwdGlvbj5cblx0XHRcdFx0XHRcdFx0PC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cblx0XHRcdFx0XHRcdCAgPGtvYWxhLWR5bmFtaWMtZm9ybVxuXHRcdFx0XHRcdFx0XHQgIFtzaG93RmllbGRzTW9yZUl0ZW5zQ29uZmlnXT1cIml0ZW0uc2hvd0ZpZWxkc01vcmVJdGVuc0NvbmZpZ1wiXG5cdFx0XHRcdFx0XHRcdCAgW3Nob3dGaWVsZHNdPVwiaXRlbS5zaG93RmllbGRzXCJcblx0XHRcdFx0XHRcdFx0ICBbZm9ybUNvbmZpZ109XCJpdGVtLmZvcm1Db25maWdcIlxuXHRcdFx0XHRcdFx0XHQgIFtmb3JtXT1cIml0ZW0uZm9ybVwiXG4gICAgICAgICAgICAgICAgW3RhYkluZGV4U3RhcnRdPVwidGFiSW5kZXhTdGFydCArIGlcIj5cblx0XHRcdFx0XHRcdCAgPC9rb2FsYS1keW5hbWljLWZvcm0+XG5cdFx0XHRcdFx0ICAgIDxtYXQtYWN0aW9uLXJvd1xuXHRcdFx0XHRcdFx0ICAgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5sZW5ndGggPiBwcm9wcmllZGFkZS5nZXQoJ21vcmVJdGVtc01pbkl0ZW1zJykudmFsdWVcIj5cblx0XHRcdFx0XHQgICAgICA8YnV0dG9uXG5cdFx0XHRcdFx0XHQgICAgICAoY2xpY2spPVwicmVtb3ZlTW9yZUl0ZW0oaSwgcHJvcHJpZWRhZGUuZ2V0KCdtb3JlSXRlbXNDb25maWcnKS52YWx1ZS5sZW5ndGggLSAxIC0gaW5kZXhNb3JlSXRlbXMpXCJcblx0XHRcdFx0XHRcdCAgICAgIG1hdC1pY29uLWJ1dHRvbj5cblx0XHRcdFx0XHRcdCAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuXHRcdFx0XHRcdCAgICAgIDwvYnV0dG9uPlxuXHRcdFx0XHRcdCAgICA8L21hdC1hY3Rpb24tcm93PlxuXHRcdFx0XHRcdCAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuXHRcdFx0XHQgIDwvbWF0LWFjY29yZGlvbj5cblx0XHRcdCAgPC9maWVsZHNldD5cblx0XHQgIDwvZGl2PlxuXHRcdCAgPG1hdC1mb3JtLWZpZWxkXG5cdFx0XHQgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLmF1dG9jb21wbGV0ZVwiXG5cdFx0XHQgIFthcHBlYXJhbmNlXT1cInByb3ByaWVkYWRlLmdldCgnYXBwZWFyYW5jZScpLnZhbHVlXCJcblx0XHRcdCAgW2Zsb2F0TGFiZWxdPVwicHJvcHJpZWRhZGUuZ2V0KCdmbG9hdExhYmVsJykudmFsdWVcIlxuXHRcdFx0ICBbZm9ybUdyb3VwTmFtZV09XCJpXCJcblx0XHRcdCAgW25nQ2xhc3NdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWVsZENsYXNzJykudmFsdWVcIj5cblx0ICAgICAgPG1hdC1sYWJlbD57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19IHt7cHJvcHJpZWRhZGUuZ2V0KCdtdWx0aXBsZScpLnZhbHVlICYmXG5cdCAgICAgIHByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZSA/ICcqJyA6ICcnfX08L21hdC1sYWJlbD5cblx0XHRcdCAgPGRpdiAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgnbXVsdGlwbGUnKS52YWx1ZSBlbHNlIHNpbmdsZVwiPlxuXHQgICAgICAgIDxtYXQtY2hpcC1saXN0ICNjaGlwTGlzdD5cblx0ICAgICAgICAgIDxtYXQtY2hpcFxuXHRcdCAgICAgICAgICAocmVtb3ZlZCk9XCJyZW1vdmVPcHRpb25PbkF1dG9jb21wbGV0ZShpLCBvcHRpb24pXCJcblx0XHQgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wcmllZGFkZS5nZXQoJ2F1dG9jb21wbGV0ZVNlbGVjdGVkVmFsdWUnKS52YWx1ZVwiXG5cdFx0ICAgICAgICAgIFtjb2xvcl09XCJnZXRDb2xvckNoaXAocHJvcHJpZWRhZGUuZ2V0KCdhdXRvY29tcGxldGVNdWx0aXBsZUNvbmZpZycpLnZhbHVlIHwgYXN5bmMpXCJcblx0XHQgICAgICAgICAgW3JlbW92YWJsZV09XCJ0cnVlXCJcblx0XHQgICAgICAgICAgW3NlbGVjdGFibGVdPVwidHJ1ZVwiPlxuXHQgICAgICAgICAgICB7e2Rpc3BsYXkob3B0aW9uKX19XG5cdFx0ICAgICAgICAgIDxtYXQtaWNvbiBtYXRDaGlwUmVtb3ZlPmNhbmNlbDwvbWF0LWljb24+XG5cdCAgICAgICAgICA8L21hdC1jaGlwPlxuXHQgICAgICAgICAgPGlucHV0XG5cdFx0ICAgICAgICAgICNhdXRvY29tcGxldGVJbnB1dFxuICAgICAgICAgICAgICBba29hbGFBdXRvRm9jdXNdPVwicHJvcHJpZWRhZGUuZ2V0KCdmb2N1cycpLnZhbHVlXCJcblx0XHQgICAgICAgICAgW3JlcXVpcmVkXT1cInByb3ByaWVkYWRlLmdldCgncmVxdWlyZWQnKS52YWx1ZVwiXG5cdFx0ICAgICAgICAgIFttYXRBdXRvY29tcGxldGVdPVwiYXV0b1wiXG5cdFx0ICAgICAgICAgIFttYXRDaGlwSW5wdXRGb3JdPVwiY2hpcExpc3RcIlxuICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhTdGFydCArIGlcIlxuICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCItMVwiXG5cdFx0ICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCJcblx0XHQgICAgICAgICAgbWF0SW5wdXRcblx0XHQgICAgICAgICAgdHlwZT1cInRleHRcIlxuXHRcdCAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZSB1bSBvdSBtYWlzIG9ww6fDtWVzLi4uXCI+XG5cdCAgICAgICAgPC9tYXQtY2hpcC1saXN0PlxuXHQgICAgICA8L2Rpdj5cblx0ICAgICAgPG5nLXRlbXBsYXRlICNzaW5nbGU+XG5cdFx0ICAgICAgPGlucHV0XG5cdFx0XHQgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxuICAgICAgICAgICAgW2tvYWxhQXV0b0ZvY3VzXT1cInByb3ByaWVkYWRlLmdldCgnZm9jdXMnKS52YWx1ZVwiXG5cdFx0XHQgICAgICBbcmVxdWlyZWRdPVwicHJvcHJpZWRhZGUuZ2V0KCdyZXF1aXJlZCcpLnZhbHVlXCJcbiAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFN0YXJ0ICsgaVwiXG4gICAgICAgICAgICBhdXRvY29tcGxldGU9XCItMVwiXG5cdFx0XHQgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiXG5cdFx0XHQgICAgICBtYXRJbnB1dFxuXHRcdFx0ICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY2lvbmUgdW1hIG9ww6fDo28uLi5cIlxuXHRcdFx0ICAgICAgdHlwZT1cInRleHRcIj5cblx0ICAgICAgPC9uZy10ZW1wbGF0ZT5cblx0ICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCdhdXRvY29tcGxldGVMb2FkaW5nJykudmFsdWUgfCBhc3luY1wiIGNvbG9yPVwicHJpbWFyeVwiXG5cdCAgICAgICAgICAgICAgICAgICBtYXRTdWZmaXg+PC9tYXQtc3Bpbm5lcj5cblx0ICAgICAgPGJ1dHRvblxuXHRcdCAgICAgIChjbGljayk9XCJjbGVhckF1dG9jb21wbGV0ZShpKVwiXG5cdFx0ICAgICAgKm5nSWY9XCJcblx0ICAgICAgICAgICEocHJvcHJpZWRhZGUuZ2V0KCdhdXRvY29tcGxldGVMb2FkaW5nJykudmFsdWUgfCBhc3luYykgJiZcblx0ICAgICAgICAgICFwcm9wcmllZGFkZS5nZXQoJ2Rpc2FibGVkJykudmFsdWVcIlxuXHRcdCAgICAgIGNvbG9yPVwid2FyblwiXG5cdFx0ICAgICAgbWF0LWljb24tYnV0dG9uXG5cdFx0ICAgICAgbWF0U3VmZml4XG5cdFx0ICAgICAgdHlwZT1cImJ1dHRvblwiPlxuXHQgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XG5cdCAgICAgIDwvYnV0dG9uPlxuXHQgICAgICA8bWF0LWhpbnQgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWVcIj5cblx0ICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XG5cdFx0ICAgICAge3twcm9wcmllZGFkZS5nZXQoJ3RleHRIaW50JykudmFsdWV9fVxuXHQgICAgICA8L21hdC1oaW50PlxuXHQgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8ucmVxdWlyZWQgfHwgcHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uYXV0b2NvbXBsZXRlU2VsZWN0ZWRcIj5cblx0ICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7ZXJyb3JNZXNzYWdlLmdldEF1dG9jb21wbGV0ZU1lc3NhZ2UocHJvcHJpZWRhZGUuZ2V0KCdsYWJlbCcpLnZhbHVlKX19XG5cdCAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3JcIj5cbiAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxuICAgICAgICAgIHt7cHJvcHJpZWRhZGUuZ2V0KCd2YWx1ZScpLmVycm9ycz8uY3VzdG9tRXJyb3IubWVzc2FnZX19LlxuICAgICAgICA8L21hdC1lcnJvcj5cblx0ICAgICAgPG1hdC1hdXRvY29tcGxldGVcblx0XHQgICAgICAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXG5cdFx0ICAgICAgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlcIiBhdXRvQWN0aXZlRmlyc3RPcHRpb24+XG5cdFx0ICAgICAgPGRpdiAqbmdJZj1cIihnZXRBdXRvY29tcGxldGVPcHRpb25zKHByb3ByaWVkYWRlKSB8IGFzeW5jKSBhcyBvcHRpb25zXCI+XG5cdFx0ICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG5cdFx0ICAgICAgICAgIHt7b3B0aW9uLm5hbWV9fVxuXHRcdCAgICAgICAgPC9tYXQtb3B0aW9uPlxuXHRcdCAgICAgIDwvZGl2PlxuXHQgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG5cdCAgICA8L21hdC1mb3JtLWZpZWxkPlxuXHRcdCAgPGRpdiAqbmdJZj1cInByb3ByaWVkYWRlLmdldCgndHlwZScpLnZhbHVlID09IHR5cGVGaWVsZC5maWxlXCI+XG5cdFx0XHQgIDxrb2FsYS1maWxlLWJ1dHRvblxuXHRcdFx0XHQgIChnZXRGaWxlcyk9XCJwcm9wcmllZGFkZS5nZXQoJ3ZhbHVlJykuc2V0VmFsdWUoJGV2ZW50KVwiXG5cdFx0XHRcdCAgW2FjY2VwdF09XCJwcm9wcmllZGFkZS5nZXQoJ2ZpbGVCdXR0b25Db25maWcnKS52YWx1ZS5hY2NlcHRcIlxuXHRcdFx0XHQgIFtiYWNrZ3JvdW5kQ29sb3JdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWxlQnV0dG9uQ29uZmlnJykudmFsdWUuYmFja2dyb3VuZENvbG9yXCJcblx0XHRcdFx0ICBbY29sb3JdPVwicHJvcHJpZWRhZGUuZ2V0KCdmaWxlQnV0dG9uQ29uZmlnJykudmFsdWUuY29sb3JcIlxuXHRcdFx0XHQgIFtkaXNhYmxlZF09XCJwcm9wcmllZGFkZS5nZXQoJ2Rpc2FibGVkJykudmFsdWVcIlxuXHRcdFx0XHQgIFtpY29uXT1cInByb3ByaWVkYWRlLmdldCgnZmlsZUJ1dHRvbkNvbmZpZycpLnZhbHVlLmljb25cIlxuXHRcdFx0XHQgIFttdWx0aXBsZV09XCJwcm9wcmllZGFkZS5nZXQoJ211bHRpcGxlJykudmFsdWVcIlxuXHRcdFx0XHQgIFt0ZXh0XT1cInByb3ByaWVkYWRlLmdldCgnZmlsZUJ1dHRvbkNvbmZpZycpLnZhbHVlLnRleHRcIj5cblx0XHRcdCAgPC9rb2FsYS1maWxlLWJ1dHRvbj5cblx0XHQgIDwvZGl2PlxuXHRcdCAgPGRpdiAqbmdJZj1cIlxuXHRcdCAgICBwcm9wcmllZGFkZS5nZXQoJ3R5cGUnKS52YWx1ZSA9PSB0eXBlRmllbGQuZHluYW1pY0Zvcm0gJiZcblx0XHRcdFx0KGdldER5bmFtaWNGb3JtQ29uZmlnKHByb3ByaWVkYWRlKSB8IGFzeW5jKSBhcyBkeW5hbWljRm9ybUNvbmZpZ1wiPlxuXHRcdFx0ICA8ZmllbGRzZXQgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWUgZWxzZSBkeW5hbWljRm9ybVdpdGhvdXRMYWJlbFwiPlxuXHRcdFx0XHQgIDxsZWdlbmQ+e3twcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWV9fTwvbGVnZW5kPlxuXHRcdFx0XHQgIDxrb2FsYS1keW5hbWljLWZvcm1cblx0XHRcdFx0XHQgIFtmb3JtQ29uZmlnXT1cImR5bmFtaWNGb3JtQ29uZmlnLmZvcm1Db25maWdcIlxuXHRcdFx0XHRcdCAgW2Zvcm1dPVwiZHluYW1pY0Zvcm1Db25maWcuZm9ybVwiXG5cdFx0XHRcdFx0ICBbc2V0VmFsdWVzXT1cImR5bmFtaWNGb3JtQ29uZmlnLnNldFZhbHVlc1wiXG5cdFx0XHRcdFx0ICBbc2hvd0ZpZWxkc109XCJkeW5hbWljRm9ybUNvbmZpZy5zaG93RmllbGRzXCJcbiAgICAgICAgICAgIFt0YWJJbmRleFN0YXJ0XT1cInRhYkluZGV4U3RhcnQgKyBpXCI+XG5cdFx0XHRcdCAgPC9rb2FsYS1keW5hbWljLWZvcm0+XG5cdFx0XHQgIDwvZmllbGRzZXQ+XG5cdFx0XHQgIDxuZy10ZW1wbGF0ZSAjZHluYW1pY0Zvcm1XaXRob3V0TGFiZWw+XG5cdFx0XHRcdCAgPGtvYWxhLWR5bmFtaWMtZm9ybVxuXHRcdFx0XHRcdCAgW2Zvcm1Db25maWddPVwiZHluYW1pY0Zvcm1Db25maWcuZm9ybUNvbmZpZ1wiXG5cdFx0XHRcdFx0ICBbZm9ybV09XCJkeW5hbWljRm9ybUNvbmZpZy5mb3JtXCJcblx0XHRcdFx0XHQgIFtzZXRWYWx1ZXNdPVwiZHluYW1pY0Zvcm1Db25maWcuc2V0VmFsdWVzXCJcblx0XHRcdFx0XHQgIFtzaG93RmllbGRzXT1cImR5bmFtaWNGb3JtQ29uZmlnLnNob3dGaWVsZHNcIlxuICAgICAgICAgICAgW3RhYkluZGV4U3RhcnRdPVwidGFiSW5kZXhTdGFydCArIGlcIj5cblx0XHRcdFx0ICA8L2tvYWxhLWR5bmFtaWMtZm9ybT5cblx0XHRcdCAgPC9uZy10ZW1wbGF0ZT5cblx0XHQgIDwvZGl2PlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cInJhZGlvLWJ0bi1ncm91cFwiXG4gICAgICAgICpuZ0lmPVwicHJvcHJpZWRhZGUuZ2V0KCd0eXBlJykudmFsdWUgPT0gdHlwZUZpZWxkLnJhZGlvXCJcbiAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInByb3ByaWVkYWRlLmdldCgnZmllbGRDbGFzcycpLnZhbHVlXCI+XG4gICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgZm9ybUNvbnRyb2xOYW1lPVwidmFsdWVcIj5cbiAgICAgICAgICA8bGFiZWwgKm5nSWY9XCJwcm9wcmllZGFkZS5nZXQoJ2xhYmVsJykudmFsdWVcIj57e3Byb3ByaWVkYWRlLmdldCgnbGFiZWwnKS52YWx1ZX19PC9sYWJlbD5cbiAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvblxuICAgICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4U3RhcnQgKyBpXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb25zIG9mIHByb3ByaWVkYWRlLmdldCgnb3Bjb2VzU2VsZWN0JykudmFsdWVcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbnMudmFsdWVcIj5cbiAgICAgICAgICAgIHt7b3B0aW9ucy5uYW1lfX1cbiAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgPC9kaXY+XG5cdCAgPC9kaXY+XG4gIDwvZGl2PlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbYnRuLXN1Ym1pdF1cIj48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbiJdfQ==