form-dynamic-ajax 7.0.4 → 7.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -61
- package/esm2022/form-dynamic-ajax.mjs +1 -1
- package/esm2022/lib/form-dynamic-angular.component.mjs +4 -3
- package/esm2022/lib/form-dynamic-angular.module.mjs +6 -2
- package/esm2022/public-api.mjs +2 -2
- package/fesm2022/form-dynamic-ajax.mjs +9 -4
- package/fesm2022/form-dynamic-ajax.mjs.map +1 -1
- package/lib/form-dynamic-angular.component.d.ts +1 -1
- package/lib/form-dynamic-angular.module.d.ts +3 -2
- package/package.json +4 -6
|
@@ -22,6 +22,7 @@ import * as i19 from "primeng/treeselect";
|
|
|
22
22
|
import * as i20 from "primeng/radiobutton";
|
|
23
23
|
import * as i21 from "primeng/autocomplete";
|
|
24
24
|
import * as i22 from "primeng/overlaypanel";
|
|
25
|
+
import * as i23 from "primeng/editor";
|
|
25
26
|
export class FormDynamicAngularComponent {
|
|
26
27
|
constructor(translate, formBuilder) {
|
|
27
28
|
this.translate = translate;
|
|
@@ -158,11 +159,11 @@ export class FormDynamicAngularComponent {
|
|
|
158
159
|
}
|
|
159
160
|
}
|
|
160
161
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: FormDynamicAngularComponent, deps: [{ token: i1.TranslateService }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
161
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: FormDynamicAngularComponent, selector: "form-dynamic-angular", inputs: { title: "title", subTitle: "subTitle", validateForm: "validateForm", form: "form", control: "control", buttonsStandard: "buttonsStandard", buttonsOptional: "buttonsOptional", files: "files" }, ngImport: i0, template: "<div>\r\n <div *ngIf=\"title\" class=\"div-title\">\r\n <span translate={{title}}></span>\r\n <div *ngIf=\"subTitle\" class=\"flex subtitle\">\r\n <span translate={{subTitle}}></span>\r\n </div>\r\n <p-divider></p-divider>\r\n </div>\r\n <form *ngIf=\"control\" [formGroup]=\"control\">\r\n <div class=\"grid\">\r\n <div *ngFor=\"let item of form\" class=\"{{item.col}} col-12\">\r\n <label *ngIf=\"item.label && !item.hideLabelTop\">{{item.label}}</label>\r\n <label *ngIf=\"item.required && item.label\" class=\"danger-text ml-2\">*</label>\r\n\r\n <div class=\"mt-2\">\r\n <!-- text -->\r\n <input id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" pInputText placeholder={{item.placeholder}} *ngIf=\"item.type == 'text' || item.type == 'number' \"\r\n type={{item.type}} formControlName={{item.formControl}} class=\"w-full\" />\r\n\r\n <!-- select -->\r\n <p-dropdown id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" [filter]=item.search emptyFilterMessage=\"Nenhum dado encontrado\"\r\n emptyMessage=\"Nenhum dado encontrado\" placeholder={{item.placeholder}} styleClass=\"w-full p-0\"\r\n (onChange)=\"onChange(item.onChange)\" *ngIf=\"item.type === 'select'\" [showClear]=\"true\"\r\n [options]=\"item.options\" formControlName={{item.formControl}} optionLabel=\"description\"\r\n (onClear)=\"clickCLear(item.onCLear)\"></p-dropdown>\r\n\r\n <!-- currency -->\r\n <p-inputNumber id={{item.id}} *ngIf=\"item.type === 'currency'\" [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" formControlName={{item.formControl}} placeholder={{item.placeholder}} inputStyleClass=\"w-full\"\r\n styleClass=\"w-full\" (onKeyDown)=\"onChange(item.onChange)\" mode=\"currency\" [min]=\"0\"\r\n currency=\"BRL\">\r\n </p-inputNumber>\r\n\r\n <!-- mask -->\r\n <p-inputMask id={{item.id}} *ngIf=\"item.type === 'mask'\" [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" formControlName={{item.formControl}} placeholder={{item.placeholder}} styleClass=\"w-full\"\r\n (onComplete)=\"onChange(item.onChange)\" mask={{item.mask}} unmask={{item.unmask}}\r\n (onClear)=\"clickCLear(item.onCLear)\" showClear=\"true\"></p-inputMask>\r\n\r\n <!-- treeSelect -->\r\n <p-treeSelect id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" placeholder={{item.placeholder}} (onNodeSelect)=\"onChange(item.onChange)\"\r\n *ngIf=\"item.type === 'tree-select'\" containerStyleClass=\"w-full p-0\"\r\n formControlName={{item.formControl}} [options]=\"item.treeSelectOptions\" [filter]=\"true\"\r\n [filterInputAutoFocus]=\"true\" emptyMessage=\"Nenhum dado encontrado\" [showClear]=\"true\"\r\n (onClear)=\"clickCLear(item.onCLear)\"></p-treeSelect>\r\n\r\n <!-- autoComplete -->\r\n <p-autoComplete inputId={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" placeholder={{item.placeholder}} styleClass=\"w-full p-0\" [inputStyle]=\"{'width':'100%'}\"\r\n *ngIf=\"item.type === 'autocomplete'\" (onSelect)=\" onChange(item.onChange)\"\r\n formControlName={{item.formControl}} [suggestions]=\"filteredAutoComplete\"\r\n (completeMethod)=\"filterAutoComplete($event, item.options)\" [forceSelection]=\"false\"\r\n [showEmptyMessage]=\"true\" emptyMessage=\"Nenhum dado encontrado\" dataKey=\"code\"\r\n field=\"description\" showClear=true (onClear)=\"clickCLear(item.onCLear)\"></p-autoComplete>\r\n\r\n <!-- date -->\r\n <p-calendar id={{item.id}} view=\"{{item.viewDate}}\" *ngIf=\"item.type === 'date'\" [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" formControlName={{item.formControl}} styleClass=\"w-full\"\r\n [numberOfMonths]=numberOfMonthsDate(item.numberOfMonthsDate)\r\n [selectionMode]=selectionMode(item.selectionMode) (onFocus)=\"onChange(item.onFocusDate)\"\r\n [maxDate]=\"item.maxDate\" [minDate]=\"item.minDate\" dateFormat=\"{{item.dateFormat}}\"\r\n (onSelect)=\"onChange(item.onChange)\" [iconDisplay]=\"'input'\" placeholder={{item.placeholder}}\r\n [showIcon]=\"true\" [showTime]=\"item.showTime\" [timeOnly]=\"item.timeOnly\"></p-calendar>\r\n\r\n <!-- textarea -->\r\n <div *ngIf=\"item.type === 'text-area'\" class=\"text-right\">\r\n <textarea id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" placeholder={{item.placeholder}} class=\"w-full\" maxlength=\"{{item.maxlength}}\"\r\n counterTemplate=\"{1} of 50, {0} remaining\" counter=\"display\"\r\n (attr.change)=\"onChange(item.onChange)\" pInputTextarea formControlName={{item.formControl}}\r\n rows={{item.rowsTextArea}}></textarea>\r\n <small *ngIf=\"item.maxlength\" id=\"username-help\">\r\n {{control.controls[item.formControl].value.length}}/{{item.maxlength}}\r\n </small>\r\n </div>\r\n\r\n <!-- checkbox -->\r\n <div *ngIf=\"item.type == 'check-box'\">\r\n <p-checkbox id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" (onChange)=\"onChange(item.onChange)\" binary=\"true\" formControlName={{item.formControl}}\r\n value={{item.formControl}} label={{item.label}}></p-checkbox>\r\n </div>\r\n\r\n <!-- checkbox multiple -->\r\n <div id={{item.id}} *ngIf=\"item.type === 'check-box-multi'\" class=\"flex gap-3\">\r\n <div formArrayName=\"{{item.formControl}}\" *ngFor=\"let list of item.options; let i = index\"\r\n class=\"flex align-items-center gap-2\">\r\n <div [formGroupName]=\"i\">\r\n <p-checkbox id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" (onChange)=\"onChange(item.onChange)\" binary=\"true\" formControlName=\"{{list.code}}\"\r\n label={{list.description}}></p-checkbox>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- button -->\r\n <p-button id={{item.id}} *ngIf=\"item.type == 'button'\" styleClass='{{item.buttonClass}} w-full mt-3'\r\n (click)=\"item.onCLick()\" [disabled]=item.disabled icon={{item.iconButton}}\r\n label={{item.label}}></p-button>\r\n\r\n <!-- can -->\r\n <div id={{item.id}} class=\"area\" *ngIf=\"item.type == 'can'\">\r\n <video autoplay=\"true\" id=\"webCamera\">\r\n </video>\r\n\r\n <input type=\"text\" id=\"base_img\" name=\"base_img\">\r\n <button type=\"button\" onclick=\"takeSnapShot()\">Tirar foto e salvar</button>\r\n\r\n <img id=\"imagemConvertida\">\r\n <p id=\"caminhoImagem\" class=\"caminho-imagem\"><a href=\"\" target=\"_blank\" rel=\"noopener\"></a></p>\r\n <script src=\"script.js\"></script>\r\n </div>\r\n\r\n <!-- upload files -->\r\n <div id={{item.id}} *ngIf=\"item.type === 'upload-files' && !item.disabled \" class=\"drag-image\"\r\n [style.border]=\"validateForm && control.controls[item.formControl].errors ? ' 1px dashed #f18282' : ' 1px dashed #d1d5db'\">\r\n <i *ngIf=\"filesView.length === 0\" class=\"pi pi-cloud-upload\"></i>\r\n <p *ngIf=\"filesView.length === 0\">Clique ou arraste e solte um arquivo para anexar</p>\r\n <span *ngIf=\"filesView.length === 0\">{{item.msgAcceptFiles}}</span>\r\n <input id=\"fileInput\" type=\"file\" [multiple]=item.multileFile [accept]=\"item.acceptFiles\"\r\n (change)=\"onSelectFile(item.formControl, $event, item.multileFile)\" />\r\n <div *ngFor=\"let f of filesView\">\r\n <div *ngIf=\"f.type && f.type.includes('image')\">\r\n <label class=\"preview-img\">\r\n <img *ngIf=\"!f.content\" src='{{getUrl(f)}}'>\r\n <img *ngIf=\"f.content\" src='{{f.content}}'>\r\n <span *ngIf=\"item.viewNameFile\">{{ f.name }}</span>\r\n <input type=\"file\" [multiple]=item.multileFile [accept]=\"item.acceptFiles\"\r\n (change)=\"onSelectFile(item.formControl, $event,item.multileFile)\" />\r\n <label> <i class=\"pi pi-times remove-file absolute\"\r\n (click)=\"onRemove(item.formControl, f)\"></i></label>\r\n </label>\r\n </div>\r\n <div *ngIf=\"f.type && !f.type.includes('image')\">\r\n <label class=\"preview-img h-0 max-w-0 mh-75 m-0\">\r\n <label class=\"mr-3\">{{ f.name }}</label>\r\n <input type=\"file\" [multiple]=item.multileFile [accept]=\"item.acceptFiles\"\r\n (change)=\"onSelectFile(item.formControl, $event,item.multileFile)\" />\r\n <label> <i class=\"pi pi-times remove-file absolute\"\r\n (click)=\"onRemove(f)\"></i></label>\r\n\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- upload files disabled -->\r\n <!-- <p-fileUpload mode=\"basic\" formControlName=\"{{item.formControl}}\" chooseLabel=\"Choose\"\r\n chooseIcon=\"pi pi-upload\" accept=\"image/*\" maxFileSize=\"1000000\" /> -->\r\n\r\n <div id={{item.id}} *ngIf=\"item.type === 'upload-files' && item.disabled \">\r\n <p-button (click)=\"op.toggle($event)\" icon=\"pi pi-paperclip\"\r\n label=\"Arquivos anexados\"></p-button>\r\n\r\n <p-overlayPanel #op [style]=\"{'width': '450px'}\" [showCloseIcon]=\"true\">\r\n <ng-template pTemplate=\"content\">\r\n <p-table *ngIf=\"files.length > 0\" [value]=\"files\" selectionMode=\"single\"\r\n [(selection)]=\"selectedProduct\" (onRowSelect)=\"onRowSelect($event, op)\"\r\n responsiveLayout=\"scroll\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th pSortableColumn=\"name\">Nome<p-sortIcon field=\"name\"></p-sortIcon></th>\r\n <th></th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-file>\r\n <tr>\r\n <td *ngIf=\"item.viewNameFile\">{{file.name}}</td>\r\n <td> <p-button *ngIf=\"item.onCLick\" icon=\"pi pi-download\"\r\n (click)='item.onCLick(file)'></p-button>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div *ngIf=\"files.length === 0\" class=\"p-10\">\r\n <label>Nenhum arquivo anexado</label>\r\n </div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n\r\n <!-- list -->\r\n <ul id={{item.id}} *ngIf=\"item.type === 'list' && item.options\">\r\n <li *ngFor=\"let list of item.options\">{{list.description}}</li>\r\n </ul>\r\n\r\n <!-- multi -->\r\n <p-multiSelect id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" placeholder={{item.placeholder}} *ngIf=\"item.type === 'multi'\" [options]=\"item.options\"\r\n formControlName={{item.formControl}} styleClass=\"p-0 w-full\" optionLabel=\"description\"\r\n (onChange)=\"onChange(item.onChange)\" maxSelectedLabels=\"100\"></p-multiSelect>\r\n\r\n <!-- radioButton -->\r\n <div id={{item.id}} *ngIf=\"item.type === 'radio-button'\" class=\"flex gap-3\">\r\n <div *ngFor=\"let listRadioButton of item.options\" class=\"flex align-items-center gap-2\">\r\n <p-radioButton [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" [value]=\"listRadioButton.code\" formControlName={{item.formControl}}\r\n (onClick)=\"onChange(item.onChange)\"></p-radioButton>\r\n <label>{{listRadioButton.description}}</label>\r\n </div>\r\n @if(control.controls[item.formControl].value == 'other'){\r\n <input pInputText type=\"text\" formControlName={{item.formControlOther}} />\r\n }\r\n </div>\r\n\r\n <!-- selectButton -->\r\n <div class=\"d-flex\" *ngIf=\"item.type === 'select-button'\">\r\n <p-selectButton id={{item.id}} (onChange)=\"onChange(item.onChange)\" [options]=\"item.options\"\r\n formControlName={{item.formControl}} optionValue=\"code\">\r\n <ng-template let-item>\r\n <span>{{item.description}}</span>\r\n </ng-template>\r\n </p-selectButton>\r\n <!-- <input type=\"text\" pInputText [attr.disabled]=\"item.disabled\"\r\n formControlName={{item.formControlSecondary}}> -->\r\n </div>\r\n\r\n <!-- table -->\r\n <p-table id={{item.id}} *ngIf=\"item.type === 'table'\" [scrollable]=\"true\"\r\n scrollHeight={{item.scrollHeight}} [columns]=item.colsTable\r\n styleClass=\"p-datatable-striped p-datatable-sm\" [value]=item.rowsTable>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngFor=\"let col of columns\">\r\n <span *ngIf=\"col.filed !== 'action'\">{{ col.header }}</span>\r\n <span *ngIf=\"col.filed === 'action'\">A\u00E7\u00E3o</span>\r\n </th>\r\n\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\r\n <tr>\r\n <td *ngFor=\"let col of columns\">\r\n <div *ngIf=\"col.field !== 'button'\">\r\n {{ rowData[col.field] }}\r\n </div>\r\n <div *ngIf=\"col.field === 'action'\">\r\n <p-button *ngFor=\"let action of item.buttonsTable\"\r\n styleClass={{action.styleClass}} label={{action.label}}\r\n (click)=\"action.onCLick(rowData)\" icon={{action.icon}}></p-button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"footer\" let-columns>\r\n <tr *ngFor=\"let footer of item.rowsFooter\">\r\n <td colspan=12><span class=\"font-normal\">{{footer.text}}:</span> {{footer.value}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <!-- inputSwitch -->\r\n <div class=\"d-flex\" *ngIf=\"item.type === 'switch'\">\r\n <p-inputSwitch id={{item.id}} formControlName={{item.formControl}} class=\"mr-10\"\r\n (onChange)=\"onChange(item.onChange)\"></p-inputSwitch>\r\n <p translate={{item.label}}></p>\r\n </div>\r\n\r\n <!-- password -->\r\n <p-password id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" placeholder={{item.placeholder}} *ngIf=\"item.type === 'password'\" [feedback]=\"false\"\r\n formControlName={{item.formControl}} (onChange)=\"onChange(item.onChange)\" styleClass=\"w-full\"\r\n [toggleMask]=\"true\"></p-password>\r\n\r\n <!-- photo -->\r\n <div id={{item.id}} class=\"camera\" *ngIf=\"item.type === 'photo'\">\r\n <video id=\"video\" class=\"foto\" autoplay>V\u00EDdeo n\u00E3o dispon\u00EDvel.</video>\r\n <canvas id=\"canvas\" class=\"foto\" style=\"display: none;\"></canvas>\r\n <button pButton icon=\"pi pi-times\" class=\"remove-file\" id=\"icon-remove\" [rounded]=\"true\"\r\n style=\"visibility: collapse;\" (click)=\"removePhoto()\"></button>\r\n <button pButton icon=\"pi pi-camera\" [rounded]=\"true\" (click)=\"capturePhoto(item.formControl)\"\r\n id=\"button\"></button>\r\n </div>\r\n\r\n <!-- likert -->\r\n <p-table id={{item.id}} *ngIf=\"item.type === 'likert'\" [scrollable]=\"true\"\r\n scrollHeight={{item.scrollHeight}} [columns]=item.colsTable\r\n styleClass=\"p-datatable-striped p-datatable-sm\" [value]=item.rowsTable>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th style=\"width: 4rem\"></th>\r\n <th *ngFor=\"let col of columns\">\r\n <span>{{ col.header }}</span>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-row let-rowIndex=\"rowIndex\" let-columns=\"columns\"\r\n formArrayName=\"{{item.formControl}}\">\r\n <tr>\r\n <td>\r\n {{row}}\r\n </td>\r\n @for (control of columns; track item; let index = $index) {\r\n <td [formGroupName]=\"rowIndex\">\r\n <p-radioButton value=\"{{columns[index].field}}+{{row}}\"\r\n formControlName=\"question{{rowIndex}}\" />\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <!-- editable table -->\r\n <p-table\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'editable-table'\"\r\n [scrollable]=\"true\"\r\n scrollHeight=\"{{ item.scrollHeight }}\"\r\n [columns]=\"item.colsTable\"\r\n styleClass=\"p-datatable-striped p-datatable-sm\"\r\n [value]=\"item.rowsTable\"\r\n editMode=\"cell\">\r\n\r\n <!-- Cabe\u00E7alho da tabela -->\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th></th>\r\n <th *ngFor=\"let col of columns\">\r\n <span>{{ col.header }}</span>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Corpo da tabela -->\r\n <ng-template pTemplate=\"body\" let-row let-rowIndex=\"rowIndex\" let-columns=\"columns\"\r\n formArrayName=\"{{ item.formControl }}\" let-editing=\"editing\">\r\n <tr>\r\n <td>{{ row }}</td>\r\n @for (control of columns; track item; let index = $index) {\r\n <td [formGroupName]=\"rowIndex\" [pEditableColumn]=\"row\" pEditableColumnField=\"row\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input class=\"w-full\" pInputText type=\"text\" formControlName=\"_{{control.field}}question{{ rowIndex }}\" />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <input class=\"w-full\" pInputText type=\"text\" formControlName=\"_{{control.field}}question{{ rowIndex }}\" />\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n\r\n <!-- valida\u00E7\u00E3o de item -->\r\n <div>\r\n <small class=\"danger-text\"\r\n *ngIf=\"validateForm && control.controls[item.formControl] && control.controls[item.formControl].errors?.['required']\">\r\n Campo obrigat\u00F3rio\r\n </small>\r\n <small class=\"danger-text\"\r\n *ngIf=\"validateForm && control.controls[item.formControl] && control.controls[item.formControl].errors?.['email']\">\r\n Email inv\u00E1lido\r\n </small>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <p-divider\r\n *ngIf=\"(buttonsStandard && buttonsStandard.length > 0) || (buttonsOptional && buttonsOptional.length > 0)\"></p-divider>\r\n\r\n <div class=\"buttons-form\">\r\n <div *ngFor=\"let button of buttonsStandard\">\r\n <p-button *ngIf=\"button.type === 'clean'\" styleClass=\"p-button-warning {{button.styleClass}}\"\r\n label=\"Limpar\" (click)=\"button.onCLick()\" icon=\"pi pi-times\"></p-button>\r\n <p-button *ngIf=\"button.type === 'filter'\" styleClass=\"{{button.styleClass}}\" label=\"Filtrar\"\r\n (click)=\"button.onCLick()\" icon=\"pi pi-search\"></p-button>\r\n <p-button *ngIf=\"button.type === 'save'\" styleClass=\"p-button-success {{button.styleClass}}\"\r\n label=\"Salvar\" (click)=\"button.onCLick()\" icon=\"pi pi-save\"></p-button>\r\n <p-button *ngIf=\"button.type === 'cancel'\" styleClass=\"p-button-danger {{button.styleClass}}\"\r\n label=\"Cancelar\" (click)=\"button.onCLick()\" icon=\"pi pi-times\"></p-button>\r\n </div>\r\n <div *ngFor=\"let button of buttonsOptional\">\r\n <p-button styleClass={{button.styleClass}} label={{button.label}} (click)=\" button.onCLick()\"\r\n icon={{button.icon}}></p-button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n", styles: [".div-title span{font-size:20px;font-weight:500}.buttons-form{display:flex;gap:10px;justify-content:flex-end}.danger-text{color:#f18282}.drag-image{height:auto;width:100%;border-radius:10px;font-weight:400;display:flex;align-items:center;flex-direction:column;top:20px;max-height:250px;color:#000;padding:20px;text-align:center;overflow:auto}.drag-image h6{font-size:20px}.drag-image .file-name{font-size:14px}.drag-image i{font-size:3rem}.subtitle span{font-size:14px;margin-right:5px}.subtitle{align-items:baseline}.mh-75{min-height:75px!important}input[type=file]{position:absolute;width:100%;height:100%;inset:0;opacity:0;cursor:pointer}.preview-img{align-items:center;border-radius:5px;display:flex;height:140px;justify-content:center;margin:10px;max-width:180px;min-height:140px;min-width:180px;padding:0 20px;position:relative}.preview-img span{position:absolute;overflow-wrap:break-word}.remove-file{display:flex;justify-content:center;align-items:center;height:22px;width:22px;top:5px;right:5px;border-radius:50%;background:#bbb;color:#333;cursor:pointer;font-size:.8rem!important}.preview-img img{max-width:100%;opacity:.8}.camera{display:flex;flex-direction:column;align-items:center;position:relative}.foto{max-width:186px;min-height:140px;min-width:180px;border:1px dashed #000;border-radius:5px;margin-bottom:1em}.preview-photo{position:relative}.h-0{height:0}\n"], dependencies: [{ kind: "component", type: i3.InputMask, selector: "p-inputMask", inputs: ["type", "slotChar", "autoClear", "showClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaLabelledBy", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autoFocus", "autocomplete", "keepBuffer", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown", "onClear"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i6.Password, selector: "p-password", inputs: ["ariaLabel", "ariaLabelledBy", "label", "disabled", "promptLabel", "mediumRegex", "strongRegex", "weakLabel", "mediumLabel", "maxLength", "strongLabel", "inputId", "feedback", "appendTo", "toggleMask", "inputStyleClass", "styleClass", "style", "inputStyle", "showTransitionOptions", "hideTransitionOptions", "autocomplete", "placeholder", "showClear"], outputs: ["onFocus", "onBlur", "onClear"] }, { kind: "directive", type: i7.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i7.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "size", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i8.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i8.EditableColumn, selector: "[pEditableColumn]", inputs: ["pEditableColumn", "pEditableColumnField", "pEditableColumnRowIndex", "pEditableColumnDisabled", "pFocusCellSelector"] }, { kind: "component", type: i8.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i8.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i9.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i11.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i12.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy"], outputs: ["onChange"] }, { kind: "component", type: i13.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "trueValue", "falseValue"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i14.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize"], outputs: ["onResize"] }, { kind: "directive", type: i15.InputText, selector: "[pInputText]" }, { kind: "component", type: i16.Divider, selector: "p-divider", inputs: ["style", "styleClass", "layout", "type", "align"] }, { kind: "component", type: i17.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i18.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i19.TreeSelect, selector: "p-treeSelect", inputs: ["inputId", "scrollHeight", "disabled", "metaKeySelection", "display", "selectionMode", "tabindex", "ariaLabel", "ariaLabelledBy", "placeholder", "panelClass", "panelStyle", "panelStyleClass", "containerStyle", "containerStyleClass", "labelStyle", "labelStyleClass", "overlayOptions", "emptyMessage", "appendTo", "filter", "filterBy", "filterMode", "filterPlaceholder", "filterLocale", "filterInputAutoFocus", "propagateSelectionDown", "propagateSelectionUp", "showClear", "resetFilterOnHide", "options", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onNodeExpand", "onNodeCollapse", "onShow", "onHide", "onClear", "onFilter", "onNodeUnselect", "onNodeSelect"] }, { kind: "component", type: i20.RadioButton, selector: "p-radioButton", inputs: ["value", "formControlName", "name", "disabled", "label", "tabindex", "inputId", "ariaLabelledBy", "ariaLabel", "style", "styleClass", "labelStyleClass"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i21.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize", "optionLabel", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i22.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
162
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.0", type: FormDynamicAngularComponent, selector: "form-dynamic-angular", inputs: { title: "title", subTitle: "subTitle", validateForm: "validateForm", form: "form", control: "control", buttonsStandard: "buttonsStandard", buttonsOptional: "buttonsOptional", files: "files" }, ngImport: i0, template: "<div>\r\n <div *ngIf=\"title\" class=\"div-title\">\r\n <span translate=\"{{ title }}\"></span>\r\n <div *ngIf=\"subTitle\" class=\"flex subtitle\">\r\n <span translate=\"{{ subTitle }}\"></span>\r\n </div>\r\n <p-divider></p-divider>\r\n </div>\r\n <form *ngIf=\"control\" [formGroup]=\"control\">\r\n <div class=\"grid\">\r\n <div *ngFor=\"let item of form\" class=\"{{ item.col }} col-12\">\r\n <label *ngIf=\"item.label && !item.hideLabelTop\">{{ item.label }}</label>\r\n <label *ngIf=\"item.required && item.label\" class=\"danger-text ml-2\"\r\n >*</label\r\n >\r\n\r\n <div class=\"mt-2\">\r\n <!-- text -->\r\n <input\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n pInputText\r\n placeholder=\"{{ item.placeholder }}\"\r\n *ngIf=\"item.type == 'text' || item.type == 'number'\"\r\n type=\"{{ item.type }}\"\r\n formControlName=\"{{ item.formControl }}\"\r\n class=\"w-full\"\r\n />\r\n\r\n <p-editor\r\n *ngIf=\"item.type == 'editor'\"\r\n formControlName=\"{{ item.formControl }}\"\r\n [style]=\"{ height: '320px' }\"\r\n />\r\n\r\n <!-- select -->\r\n <p-dropdown\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n [filter]=\"item.search\"\r\n emptyFilterMessage=\"Nenhum dado encontrado\"\r\n emptyMessage=\"Nenhum dado encontrado\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n styleClass=\"w-full p-0\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n *ngIf=\"item.type === 'select'\"\r\n [showClear]=\"true\"\r\n [options]=\"item.options\"\r\n formControlName=\"{{ item.formControl }}\"\r\n optionLabel=\"description\"\r\n (onClear)=\"clickCLear(item.onCLear)\"\r\n ></p-dropdown>\r\n\r\n <!-- currency -->\r\n <p-inputNumber\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'currency'\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n formControlName=\"{{ item.formControl }}\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n inputStyleClass=\"w-full\"\r\n styleClass=\"w-full\"\r\n (onKeyDown)=\"onChange(item.onChange)\"\r\n mode=\"currency\"\r\n [min]=\"0\"\r\n currency=\"BRL\"\r\n >\r\n </p-inputNumber>\r\n\r\n <!-- mask -->\r\n <p-inputMask\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'mask'\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n formControlName=\"{{ item.formControl }}\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n styleClass=\"w-full\"\r\n (onComplete)=\"onChange(item.onChange)\"\r\n mask=\"{{ item.mask }}\"\r\n unmask=\"{{ item.unmask }}\"\r\n (onClear)=\"clickCLear(item.onCLear)\"\r\n showClear=\"true\"\r\n ></p-inputMask>\r\n\r\n <!-- treeSelect -->\r\n <p-treeSelect\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n (onNodeSelect)=\"onChange(item.onChange)\"\r\n *ngIf=\"item.type === 'tree-select'\"\r\n containerStyleClass=\"w-full p-0\"\r\n formControlName=\"{{ item.formControl }}\"\r\n [options]=\"item.treeSelectOptions\"\r\n [filter]=\"true\"\r\n [filterInputAutoFocus]=\"true\"\r\n emptyMessage=\"Nenhum dado encontrado\"\r\n [showClear]=\"true\"\r\n (onClear)=\"clickCLear(item.onCLear)\"\r\n ></p-treeSelect>\r\n\r\n <!-- autoComplete -->\r\n <p-autoComplete\r\n inputId=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n styleClass=\"w-full p-0\"\r\n [inputStyle]=\"{ width: '100%' }\"\r\n *ngIf=\"item.type === 'autocomplete'\"\r\n (onSelect)=\"onChange(item.onChange)\"\r\n formControlName=\"{{ item.formControl }}\"\r\n [suggestions]=\"filteredAutoComplete\"\r\n (completeMethod)=\"filterAutoComplete($event, item.options)\"\r\n [forceSelection]=\"false\"\r\n [showEmptyMessage]=\"true\"\r\n emptyMessage=\"Nenhum dado encontrado\"\r\n dataKey=\"code\"\r\n field=\"description\"\r\n showClear=\"true\"\r\n (onClear)=\"clickCLear(item.onCLear)\"\r\n ></p-autoComplete>\r\n\r\n <!-- date -->\r\n <p-calendar\r\n id=\"{{ item.id }}\"\r\n view=\"{{ item.viewDate }}\"\r\n *ngIf=\"item.type === 'date'\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n formControlName=\"{{ item.formControl }}\"\r\n styleClass=\"w-full\"\r\n [numberOfMonths]=\"numberOfMonthsDate(item.numberOfMonthsDate)\"\r\n [selectionMode]=\"selectionMode(item.selectionMode)\"\r\n (onFocus)=\"onChange(item.onFocusDate)\"\r\n [maxDate]=\"item.maxDate\"\r\n [minDate]=\"item.minDate\"\r\n dateFormat=\"{{ item.dateFormat }}\"\r\n (onSelect)=\"onChange(item.onChange)\"\r\n [iconDisplay]=\"'input'\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n [showIcon]=\"true\"\r\n [showTime]=\"item.showTime\"\r\n [timeOnly]=\"item.timeOnly\"\r\n ></p-calendar>\r\n\r\n <!-- textarea -->\r\n <div *ngIf=\"item.type === 'text-area'\" class=\"text-right\">\r\n <textarea\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n class=\"w-full\"\r\n maxlength=\"{{ item.maxlength }}\"\r\n counterTemplate=\"{1} of 50, {0} remaining\"\r\n counter=\"display\"\r\n (attr.change)=\"onChange(item.onChange)\"\r\n pInputTextarea\r\n formControlName=\"{{ item.formControl }}\"\r\n rows=\"{{ item.rowsTextArea }}\"\r\n ></textarea>\r\n <small *ngIf=\"item.maxlength\" id=\"username-help\">\r\n {{ control.controls[item.formControl].value.length }}/{{\r\n item.maxlength\r\n }}\r\n </small>\r\n </div>\r\n\r\n <!-- checkbox -->\r\n <div *ngIf=\"item.type == 'check-box'\">\r\n <p-checkbox\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n binary=\"true\"\r\n formControlName=\"{{ item.formControl }}\"\r\n value=\"{{ item.formControl }}\"\r\n label=\"{{ item.label }}\"\r\n ></p-checkbox>\r\n </div>\r\n\r\n <!-- checkbox multiple -->\r\n <div\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'check-box-multi'\"\r\n class=\"flex gap-3\"\r\n >\r\n <div\r\n formArrayName=\"{{ item.formControl }}\"\r\n *ngFor=\"let list of item.options; let i = index\"\r\n class=\"flex align-items-center gap-2\"\r\n >\r\n <div [formGroupName]=\"i\">\r\n <p-checkbox\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n binary=\"true\"\r\n formControlName=\"{{ list.code }}\"\r\n label=\"{{ list.description }}\"\r\n ></p-checkbox>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- button -->\r\n <p-button\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type == 'button'\"\r\n styleClass=\"{{ item.buttonClass }} w-full mt-3\"\r\n (click)=\"item.onCLick()\"\r\n [disabled]=\"item.disabled\"\r\n icon=\"{{ item.iconButton }}\"\r\n label=\"{{ item.label }}\"\r\n ></p-button>\r\n\r\n <!-- can -->\r\n <div id=\"{{ item.id }}\" class=\"area\" *ngIf=\"item.type == 'can'\">\r\n <video autoplay=\"true\" id=\"webCamera\"></video>\r\n\r\n <input type=\"text\" id=\"base_img\" name=\"base_img\" />\r\n <button type=\"button\" onclick=\"takeSnapShot()\">\r\n Tirar foto e salvar\r\n </button>\r\n\r\n <img id=\"imagemConvertida\" />\r\n <p id=\"caminhoImagem\" class=\"caminho-imagem\">\r\n <a href=\"\" target=\"_blank\" rel=\"noopener\"></a>\r\n </p>\r\n <script src=\"script.js\"></script>\r\n </div>\r\n\r\n <!-- upload files -->\r\n <div\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'upload-files' && !item.disabled\"\r\n class=\"drag-image\"\r\n [style.border]=\"\r\n validateForm && control.controls[item.formControl].errors\r\n ? ' 1px dashed #f18282'\r\n : ' 1px dashed #d1d5db'\r\n \"\r\n >\r\n <i *ngIf=\"filesView.length === 0\" class=\"pi pi-cloud-upload\"></i>\r\n <p *ngIf=\"filesView.length === 0\">\r\n Clique ou arraste e solte um arquivo para anexar\r\n </p>\r\n <span *ngIf=\"filesView.length === 0\">{{\r\n item.msgAcceptFiles\r\n }}</span>\r\n <input\r\n id=\"fileInput\"\r\n type=\"file\"\r\n [multiple]=\"item.multileFile\"\r\n [accept]=\"item.acceptFiles\"\r\n (change)=\"\r\n onSelectFile(item.formControl, $event, item.multileFile)\r\n \"\r\n />\r\n <div *ngFor=\"let f of filesView\">\r\n <div *ngIf=\"f.type && f.type.includes('image')\">\r\n <label class=\"preview-img\">\r\n <img *ngIf=\"!f.content\" src=\"{{ getUrl(f) }}\" />\r\n <img *ngIf=\"f.content\" src=\"{{ f.content }}\" />\r\n <span *ngIf=\"item.viewNameFile\">{{ f.name }}</span>\r\n <input\r\n type=\"file\"\r\n [multiple]=\"item.multileFile\"\r\n [accept]=\"item.acceptFiles\"\r\n (change)=\"\r\n onSelectFile(item.formControl, $event, item.multileFile)\r\n \"\r\n />\r\n <label>\r\n <i\r\n class=\"pi pi-times remove-file absolute\"\r\n (click)=\"onRemove(item.formControl, f)\"\r\n ></i\r\n ></label>\r\n </label>\r\n </div>\r\n <div *ngIf=\"f.type && !f.type.includes('image')\">\r\n <label class=\"preview-img h-0 max-w-0 mh-75 m-0\">\r\n <label class=\"mr-3\">{{ f.name }}</label>\r\n <input\r\n type=\"file\"\r\n [multiple]=\"item.multileFile\"\r\n [accept]=\"item.acceptFiles\"\r\n (change)=\"\r\n onSelectFile(item.formControl, $event, item.multileFile)\r\n \"\r\n />\r\n <label>\r\n <i\r\n class=\"pi pi-times remove-file absolute\"\r\n (click)=\"onRemove(f)\"\r\n ></i\r\n ></label>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- upload files disabled -->\r\n <!-- <p-fileUpload mode=\"basic\" formControlName=\"{{item.formControl}}\" chooseLabel=\"Choose\"\r\n chooseIcon=\"pi pi-upload\" accept=\"image/*\" maxFileSize=\"1000000\" /> -->\r\n\r\n <div\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'upload-files' && item.disabled\"\r\n >\r\n <p-button\r\n (click)=\"op.toggle($event)\"\r\n icon=\"pi pi-paperclip\"\r\n label=\"Arquivos anexados\"\r\n ></p-button>\r\n\r\n <p-overlayPanel\r\n #op\r\n [style]=\"{ width: '450px' }\"\r\n [showCloseIcon]=\"true\"\r\n >\r\n <ng-template pTemplate=\"content\">\r\n <p-table\r\n *ngIf=\"files.length > 0\"\r\n [value]=\"files\"\r\n selectionMode=\"single\"\r\n [(selection)]=\"selectedProduct\"\r\n (onRowSelect)=\"onRowSelect($event, op)\"\r\n responsiveLayout=\"scroll\"\r\n >\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th pSortableColumn=\"name\">\r\n Nome<p-sortIcon field=\"name\"></p-sortIcon>\r\n </th>\r\n <th></th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-file>\r\n <tr>\r\n <td *ngIf=\"item.viewNameFile\">{{ file.name }}</td>\r\n <td>\r\n <p-button\r\n *ngIf=\"item.onCLick\"\r\n icon=\"pi pi-download\"\r\n (click)=\"item.onCLick(file)\"\r\n ></p-button>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div *ngIf=\"files.length === 0\" class=\"p-10\">\r\n <label>Nenhum arquivo anexado</label>\r\n </div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n\r\n <!-- list -->\r\n <ul id=\"{{ item.id }}\" *ngIf=\"item.type === 'list' && item.options\">\r\n <li *ngFor=\"let list of item.options\">{{ list.description }}</li>\r\n </ul>\r\n\r\n <!-- multi -->\r\n <p-multiSelect\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n *ngIf=\"item.type === 'multi'\"\r\n [options]=\"item.options\"\r\n formControlName=\"{{ item.formControl }}\"\r\n styleClass=\"p-0 w-full\"\r\n optionLabel=\"description\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n maxSelectedLabels=\"100\"\r\n ></p-multiSelect>\r\n\r\n <!-- radioButton -->\r\n <div\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'radio-button'\"\r\n class=\"flex gap-3\"\r\n >\r\n <div\r\n *ngFor=\"let listRadioButton of item.options\"\r\n class=\"flex align-items-center gap-2\"\r\n >\r\n <p-radioButton\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n [value]=\"listRadioButton.code\"\r\n formControlName=\"{{ item.formControl }}\"\r\n (onClick)=\"onChange(item.onChange)\"\r\n ></p-radioButton>\r\n <label>{{ listRadioButton.description }}</label>\r\n </div>\r\n @if(control.controls[item.formControl].value == 'other'){\r\n <input\r\n pInputText\r\n type=\"text\"\r\n formControlName=\"{{ item.formControlOther }}\"\r\n />\r\n }\r\n </div>\r\n\r\n <!-- selectButton -->\r\n <div class=\"d-flex\" *ngIf=\"item.type === 'select-button'\">\r\n <p-selectButton\r\n id=\"{{ item.id }}\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n [options]=\"item.options\"\r\n formControlName=\"{{ item.formControl }}\"\r\n optionValue=\"code\"\r\n >\r\n <ng-template let-item>\r\n <span>{{ item.description }}</span>\r\n </ng-template>\r\n </p-selectButton>\r\n <!-- <input type=\"text\" pInputText [attr.disabled]=\"item.disabled\"\r\n formControlName={{item.formControlSecondary}}> -->\r\n </div>\r\n\r\n <!-- table -->\r\n <p-table\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'table'\"\r\n [scrollable]=\"true\"\r\n scrollHeight=\"{{ item.scrollHeight }}\"\r\n [columns]=\"item.colsTable\"\r\n styleClass=\"p-datatable-striped p-datatable-sm\"\r\n [value]=\"item.rowsTable\"\r\n >\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngFor=\"let col of columns\">\r\n <span *ngIf=\"col.filed !== 'action'\">{{ col.header }}</span>\r\n <span *ngIf=\"col.filed === 'action'\">A\u00E7\u00E3o</span>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\r\n <tr>\r\n <td *ngFor=\"let col of columns\">\r\n <div *ngIf=\"col.field !== 'button'\">\r\n {{ rowData[col.field] }}\r\n </div>\r\n <div *ngIf=\"col.field === 'action'\">\r\n <p-button\r\n *ngFor=\"let action of item.buttonsTable\"\r\n styleClass=\"{{ action.styleClass }}\"\r\n label=\"{{ action.label }}\"\r\n (click)=\"action.onCLick(rowData)\"\r\n icon=\"{{ action.icon }}\"\r\n ></p-button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"footer\" let-columns>\r\n <tr *ngFor=\"let footer of item.rowsFooter\">\r\n <td colspan=\"12\">\r\n <span class=\"font-normal\">{{ footer.text }}:</span>\r\n {{ footer.value }}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <!-- inputSwitch -->\r\n <div class=\"d-flex\" *ngIf=\"item.type === 'switch'\">\r\n <p-inputSwitch\r\n id=\"{{ item.id }}\"\r\n formControlName=\"{{ item.formControl }}\"\r\n class=\"mr-10\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n ></p-inputSwitch>\r\n <p translate=\"{{ item.label }}\"></p>\r\n </div>\r\n\r\n <!-- password -->\r\n <p-password\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n *ngIf=\"item.type === 'password'\"\r\n [feedback]=\"false\"\r\n formControlName=\"{{ item.formControl }}\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n styleClass=\"w-full\"\r\n [toggleMask]=\"true\"\r\n ></p-password>\r\n\r\n <!-- photo -->\r\n <div id=\"{{ item.id }}\" class=\"camera\" *ngIf=\"item.type === 'photo'\">\r\n <video id=\"video\" class=\"foto\" autoplay>\r\n V\u00EDdeo n\u00E3o dispon\u00EDvel.\r\n </video>\r\n <canvas id=\"canvas\" class=\"foto\" style=\"display: none\"></canvas>\r\n <button\r\n pButton\r\n icon=\"pi pi-times\"\r\n class=\"remove-file\"\r\n id=\"icon-remove\"\r\n [rounded]=\"true\"\r\n style=\"visibility: collapse\"\r\n (click)=\"removePhoto()\"\r\n ></button>\r\n <button\r\n pButton\r\n icon=\"pi pi-camera\"\r\n [rounded]=\"true\"\r\n (click)=\"capturePhoto(item.formControl)\"\r\n id=\"button\"\r\n ></button>\r\n </div>\r\n\r\n <!-- likert -->\r\n <p-table\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'likert'\"\r\n [scrollable]=\"true\"\r\n scrollHeight=\"{{ item.scrollHeight }}\"\r\n [columns]=\"item.colsTable\"\r\n styleClass=\"p-datatable-striped p-datatable-sm\"\r\n [value]=\"item.rowsTable\"\r\n >\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th style=\"width: 4rem\"></th>\r\n <th *ngFor=\"let col of columns\">\r\n <span>{{ col.header }}</span>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template\r\n pTemplate=\"body\"\r\n let-row\r\n let-rowIndex=\"rowIndex\"\r\n let-columns=\"columns\"\r\n formArrayName=\"{{ item.formControl }}\"\r\n >\r\n <tr>\r\n <td>\r\n {{ row }}\r\n </td>\r\n @for (control of columns; track item; let index = $index) {\r\n <td [formGroupName]=\"rowIndex\">\r\n <p-radioButton\r\n value=\"{{ columns[index].field }}+{{ row }}\"\r\n formControlName=\"question{{ rowIndex }}\"\r\n />\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <!-- editable table -->\r\n <p-table\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'editable-table'\"\r\n [scrollable]=\"true\"\r\n scrollHeight=\"{{ item.scrollHeight }}\"\r\n [columns]=\"item.colsTable\"\r\n styleClass=\"p-datatable-striped p-datatable-sm\"\r\n [value]=\"item.rowsTable\"\r\n editMode=\"cell\"\r\n >\r\n <!-- Cabe\u00E7alho da tabela -->\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th style=\"width: 4rem\"></th>\r\n <th *ngFor=\"let col of columns\">\r\n <span>{{ col.header }}</span>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Corpo da tabela -->\r\n <ng-template\r\n pTemplate=\"body\"\r\n let-row\r\n let-rowIndex=\"rowIndex\"\r\n let-columns=\"columns\"\r\n formArrayName=\"{{ item.formControl }}\"\r\n let-editing=\"editing\"\r\n >\r\n <tr>\r\n <td>{{ row }}</td>\r\n @for (control of columns; track item; let index = $index) {\r\n <td\r\n [formGroupName]=\"rowIndex\"\r\n [pEditableColumn]=\"row\"\r\n pEditableColumnField=\"row\"\r\n >\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n formControlName=\"_{{ control.field }}question{{\r\n rowIndex\r\n }}\"\r\n />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n formControlName=\"_{{ control.field }}question{{\r\n rowIndex\r\n }}\"\r\n />\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <!-- valida\u00E7\u00E3o de item -->\r\n <div>\r\n <small\r\n class=\"danger-text\"\r\n *ngIf=\"validateForm && control.controls[item.formControl] && control.controls[item.formControl].errors?.['required']\"\r\n >\r\n Campo obrigat\u00F3rio\r\n </small>\r\n <small\r\n class=\"danger-text\"\r\n *ngIf=\"validateForm && control.controls[item.formControl] && control.controls[item.formControl].errors?.['email']\"\r\n >\r\n Email inv\u00E1lido\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-divider\r\n *ngIf=\"\r\n (buttonsStandard && buttonsStandard.length > 0) ||\r\n (buttonsOptional && buttonsOptional.length > 0)\r\n \"\r\n ></p-divider>\r\n\r\n <div class=\"buttons-form\">\r\n <div *ngFor=\"let button of buttonsStandard\">\r\n <p-button\r\n *ngIf=\"button.type === 'clean'\"\r\n styleClass=\"p-button-warning {{ button.styleClass }}\"\r\n label=\"Limpar\"\r\n (click)=\"button.onCLick()\"\r\n icon=\"pi pi-times\"\r\n ></p-button>\r\n <p-button\r\n *ngIf=\"button.type === 'filter'\"\r\n styleClass=\"{{ button.styleClass }}\"\r\n label=\"Filtrar\"\r\n (click)=\"button.onCLick()\"\r\n icon=\"pi pi-search\"\r\n ></p-button>\r\n <p-button\r\n *ngIf=\"button.type === 'save'\"\r\n styleClass=\"p-button-success {{ button.styleClass }}\"\r\n label=\"Salvar\"\r\n (click)=\"button.onCLick()\"\r\n icon=\"pi pi-save\"\r\n ></p-button>\r\n <p-button\r\n *ngIf=\"button.type === 'cancel'\"\r\n styleClass=\"p-button-danger {{ button.styleClass }}\"\r\n label=\"Cancelar\"\r\n (click)=\"button.onCLick()\"\r\n icon=\"pi pi-times\"\r\n ></p-button>\r\n </div>\r\n <div *ngFor=\"let button of buttonsOptional\">\r\n <p-button\r\n styleClass=\"{{ button.styleClass }}\"\r\n label=\"{{ button.label }}\"\r\n (click)=\"button.onCLick()\"\r\n icon=\"{{ button.icon }}\"\r\n ></p-button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n", styles: [".div-title span{font-size:20px;font-weight:500}.buttons-form{display:flex;gap:10px;justify-content:flex-end}.danger-text{color:#f18282}.drag-image{height:auto;width:100%;border-radius:10px;font-weight:400;display:flex;align-items:center;flex-direction:column;top:20px;max-height:250px;color:#000;padding:20px;text-align:center;overflow:auto}.drag-image h6{font-size:20px}.drag-image .file-name{font-size:14px}.drag-image i{font-size:3rem}.subtitle span{font-size:14px;margin-right:5px}.subtitle{align-items:baseline}.mh-75{min-height:75px!important}input[type=file]{position:absolute;width:100%;height:100%;inset:0;opacity:0;cursor:pointer}.preview-img{align-items:center;border-radius:5px;display:flex;height:140px;justify-content:center;margin:10px;max-width:180px;min-height:140px;min-width:180px;padding:0 20px;position:relative}.preview-img span{position:absolute;overflow-wrap:break-word}.remove-file{display:flex;justify-content:center;align-items:center;height:22px;width:22px;top:5px;right:5px;border-radius:50%;background:#bbb;color:#333;cursor:pointer;font-size:.8rem!important}.preview-img img{max-width:100%;opacity:.8}.camera{display:flex;flex-direction:column;align-items:center;position:relative}.foto{max-width:186px;min-height:140px;min-width:180px;border:1px dashed #000;border-radius:5px;margin-bottom:1em}.preview-photo{position:relative}.h-0{height:0}\n"], dependencies: [{ kind: "component", type: i3.InputMask, selector: "p-inputMask", inputs: ["type", "slotChar", "autoClear", "showClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaLabelledBy", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autoFocus", "autocomplete", "keepBuffer", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown", "onClear"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i6.Password, selector: "p-password", inputs: ["ariaLabel", "ariaLabelledBy", "label", "disabled", "promptLabel", "mediumRegex", "strongRegex", "weakLabel", "mediumLabel", "maxLength", "strongLabel", "inputId", "feedback", "appendTo", "toggleMask", "inputStyleClass", "styleClass", "style", "inputStyle", "showTransitionOptions", "hideTransitionOptions", "autocomplete", "placeholder", "showClear"], outputs: ["onFocus", "onBlur", "onClear"] }, { kind: "directive", type: i7.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i7.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "size", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i8.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i8.EditableColumn, selector: "[pEditableColumn]", inputs: ["pEditableColumn", "pEditableColumnField", "pEditableColumnRowIndex", "pEditableColumnDisabled", "pFocusCellSelector"] }, { kind: "component", type: i8.CellEditor, selector: "p-cellEditor" }, { kind: "component", type: i8.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i9.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i10.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i11.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i12.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy"], outputs: ["onChange"] }, { kind: "component", type: i13.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "trueValue", "falseValue"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "directive", type: i14.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize"], outputs: ["onResize"] }, { kind: "directive", type: i15.InputText, selector: "[pInputText]" }, { kind: "component", type: i16.Divider, selector: "p-divider", inputs: ["style", "styleClass", "layout", "type", "align"] }, { kind: "component", type: i17.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i18.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i19.TreeSelect, selector: "p-treeSelect", inputs: ["inputId", "scrollHeight", "disabled", "metaKeySelection", "display", "selectionMode", "tabindex", "ariaLabel", "ariaLabelledBy", "placeholder", "panelClass", "panelStyle", "panelStyleClass", "containerStyle", "containerStyleClass", "labelStyle", "labelStyleClass", "overlayOptions", "emptyMessage", "appendTo", "filter", "filterBy", "filterMode", "filterPlaceholder", "filterLocale", "filterInputAutoFocus", "propagateSelectionDown", "propagateSelectionUp", "showClear", "resetFilterOnHide", "options", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onNodeExpand", "onNodeCollapse", "onShow", "onHide", "onClear", "onFilter", "onNodeUnselect", "onNodeSelect"] }, { kind: "component", type: i20.RadioButton, selector: "p-radioButton", inputs: ["value", "formControlName", "name", "disabled", "label", "tabindex", "inputId", "ariaLabelledBy", "ariaLabel", "style", "styleClass", "labelStyleClass"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i21.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize", "optionLabel", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i22.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "component", type: i23.Editor, selector: "p-editor", inputs: ["style", "styleClass", "placeholder", "formats", "modules", "bounds", "scrollingContainer", "debug", "readonly"], outputs: ["onInit", "onTextChange", "onSelectionChange"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
162
163
|
}
|
|
163
164
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImport: i0, type: FormDynamicAngularComponent, decorators: [{
|
|
164
165
|
type: Component,
|
|
165
|
-
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'form-dynamic-angular', template: "<div>\r\n <div *ngIf=\"title\" class=\"div-title\">\r\n <span translate={{title}}></span>\r\n <div *ngIf=\"subTitle\" class=\"flex subtitle\">\r\n <span translate={{subTitle}}></span>\r\n </div>\r\n <p-divider></p-divider>\r\n </div>\r\n <form *ngIf=\"control\" [formGroup]=\"control\">\r\n <div class=\"grid\">\r\n <div *ngFor=\"let item of form\" class=\"{{item.col}} col-12\">\r\n <label *ngIf=\"item.label && !item.hideLabelTop\">{{item.label}}</label>\r\n <label *ngIf=\"item.required && item.label\" class=\"danger-text ml-2\">*</label>\r\n\r\n <div class=\"mt-2\">\r\n <!-- text -->\r\n <input id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" pInputText placeholder={{item.placeholder}} *ngIf=\"item.type == 'text' || item.type == 'number' \"\r\n type={{item.type}} formControlName={{item.formControl}} class=\"w-full\" />\r\n\r\n <!-- select -->\r\n <p-dropdown id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" [filter]=item.search emptyFilterMessage=\"Nenhum dado encontrado\"\r\n emptyMessage=\"Nenhum dado encontrado\" placeholder={{item.placeholder}} styleClass=\"w-full p-0\"\r\n (onChange)=\"onChange(item.onChange)\" *ngIf=\"item.type === 'select'\" [showClear]=\"true\"\r\n [options]=\"item.options\" formControlName={{item.formControl}} optionLabel=\"description\"\r\n (onClear)=\"clickCLear(item.onCLear)\"></p-dropdown>\r\n\r\n <!-- currency -->\r\n <p-inputNumber id={{item.id}} *ngIf=\"item.type === 'currency'\" [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" formControlName={{item.formControl}} placeholder={{item.placeholder}} inputStyleClass=\"w-full\"\r\n styleClass=\"w-full\" (onKeyDown)=\"onChange(item.onChange)\" mode=\"currency\" [min]=\"0\"\r\n currency=\"BRL\">\r\n </p-inputNumber>\r\n\r\n <!-- mask -->\r\n <p-inputMask id={{item.id}} *ngIf=\"item.type === 'mask'\" [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" formControlName={{item.formControl}} placeholder={{item.placeholder}} styleClass=\"w-full\"\r\n (onComplete)=\"onChange(item.onChange)\" mask={{item.mask}} unmask={{item.unmask}}\r\n (onClear)=\"clickCLear(item.onCLear)\" showClear=\"true\"></p-inputMask>\r\n\r\n <!-- treeSelect -->\r\n <p-treeSelect id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" placeholder={{item.placeholder}} (onNodeSelect)=\"onChange(item.onChange)\"\r\n *ngIf=\"item.type === 'tree-select'\" containerStyleClass=\"w-full p-0\"\r\n formControlName={{item.formControl}} [options]=\"item.treeSelectOptions\" [filter]=\"true\"\r\n [filterInputAutoFocus]=\"true\" emptyMessage=\"Nenhum dado encontrado\" [showClear]=\"true\"\r\n (onClear)=\"clickCLear(item.onCLear)\"></p-treeSelect>\r\n\r\n <!-- autoComplete -->\r\n <p-autoComplete inputId={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" placeholder={{item.placeholder}} styleClass=\"w-full p-0\" [inputStyle]=\"{'width':'100%'}\"\r\n *ngIf=\"item.type === 'autocomplete'\" (onSelect)=\" onChange(item.onChange)\"\r\n formControlName={{item.formControl}} [suggestions]=\"filteredAutoComplete\"\r\n (completeMethod)=\"filterAutoComplete($event, item.options)\" [forceSelection]=\"false\"\r\n [showEmptyMessage]=\"true\" emptyMessage=\"Nenhum dado encontrado\" dataKey=\"code\"\r\n field=\"description\" showClear=true (onClear)=\"clickCLear(item.onCLear)\"></p-autoComplete>\r\n\r\n <!-- date -->\r\n <p-calendar id={{item.id}} view=\"{{item.viewDate}}\" *ngIf=\"item.type === 'date'\" [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" formControlName={{item.formControl}} styleClass=\"w-full\"\r\n [numberOfMonths]=numberOfMonthsDate(item.numberOfMonthsDate)\r\n [selectionMode]=selectionMode(item.selectionMode) (onFocus)=\"onChange(item.onFocusDate)\"\r\n [maxDate]=\"item.maxDate\" [minDate]=\"item.minDate\" dateFormat=\"{{item.dateFormat}}\"\r\n (onSelect)=\"onChange(item.onChange)\" [iconDisplay]=\"'input'\" placeholder={{item.placeholder}}\r\n [showIcon]=\"true\" [showTime]=\"item.showTime\" [timeOnly]=\"item.timeOnly\"></p-calendar>\r\n\r\n <!-- textarea -->\r\n <div *ngIf=\"item.type === 'text-area'\" class=\"text-right\">\r\n <textarea id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" placeholder={{item.placeholder}} class=\"w-full\" maxlength=\"{{item.maxlength}}\"\r\n counterTemplate=\"{1} of 50, {0} remaining\" counter=\"display\"\r\n (attr.change)=\"onChange(item.onChange)\" pInputTextarea formControlName={{item.formControl}}\r\n rows={{item.rowsTextArea}}></textarea>\r\n <small *ngIf=\"item.maxlength\" id=\"username-help\">\r\n {{control.controls[item.formControl].value.length}}/{{item.maxlength}}\r\n </small>\r\n </div>\r\n\r\n <!-- checkbox -->\r\n <div *ngIf=\"item.type == 'check-box'\">\r\n <p-checkbox id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" (onChange)=\"onChange(item.onChange)\" binary=\"true\" formControlName={{item.formControl}}\r\n value={{item.formControl}} label={{item.label}}></p-checkbox>\r\n </div>\r\n\r\n <!-- checkbox multiple -->\r\n <div id={{item.id}} *ngIf=\"item.type === 'check-box-multi'\" class=\"flex gap-3\">\r\n <div formArrayName=\"{{item.formControl}}\" *ngFor=\"let list of item.options; let i = index\"\r\n class=\"flex align-items-center gap-2\">\r\n <div [formGroupName]=\"i\">\r\n <p-checkbox id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" (onChange)=\"onChange(item.onChange)\" binary=\"true\" formControlName=\"{{list.code}}\"\r\n label={{list.description}}></p-checkbox>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- button -->\r\n <p-button id={{item.id}} *ngIf=\"item.type == 'button'\" styleClass='{{item.buttonClass}} w-full mt-3'\r\n (click)=\"item.onCLick()\" [disabled]=item.disabled icon={{item.iconButton}}\r\n label={{item.label}}></p-button>\r\n\r\n <!-- can -->\r\n <div id={{item.id}} class=\"area\" *ngIf=\"item.type == 'can'\">\r\n <video autoplay=\"true\" id=\"webCamera\">\r\n </video>\r\n\r\n <input type=\"text\" id=\"base_img\" name=\"base_img\">\r\n <button type=\"button\" onclick=\"takeSnapShot()\">Tirar foto e salvar</button>\r\n\r\n <img id=\"imagemConvertida\">\r\n <p id=\"caminhoImagem\" class=\"caminho-imagem\"><a href=\"\" target=\"_blank\" rel=\"noopener\"></a></p>\r\n <script src=\"script.js\"></script>\r\n </div>\r\n\r\n <!-- upload files -->\r\n <div id={{item.id}} *ngIf=\"item.type === 'upload-files' && !item.disabled \" class=\"drag-image\"\r\n [style.border]=\"validateForm && control.controls[item.formControl].errors ? ' 1px dashed #f18282' : ' 1px dashed #d1d5db'\">\r\n <i *ngIf=\"filesView.length === 0\" class=\"pi pi-cloud-upload\"></i>\r\n <p *ngIf=\"filesView.length === 0\">Clique ou arraste e solte um arquivo para anexar</p>\r\n <span *ngIf=\"filesView.length === 0\">{{item.msgAcceptFiles}}</span>\r\n <input id=\"fileInput\" type=\"file\" [multiple]=item.multileFile [accept]=\"item.acceptFiles\"\r\n (change)=\"onSelectFile(item.formControl, $event, item.multileFile)\" />\r\n <div *ngFor=\"let f of filesView\">\r\n <div *ngIf=\"f.type && f.type.includes('image')\">\r\n <label class=\"preview-img\">\r\n <img *ngIf=\"!f.content\" src='{{getUrl(f)}}'>\r\n <img *ngIf=\"f.content\" src='{{f.content}}'>\r\n <span *ngIf=\"item.viewNameFile\">{{ f.name }}</span>\r\n <input type=\"file\" [multiple]=item.multileFile [accept]=\"item.acceptFiles\"\r\n (change)=\"onSelectFile(item.formControl, $event,item.multileFile)\" />\r\n <label> <i class=\"pi pi-times remove-file absolute\"\r\n (click)=\"onRemove(item.formControl, f)\"></i></label>\r\n </label>\r\n </div>\r\n <div *ngIf=\"f.type && !f.type.includes('image')\">\r\n <label class=\"preview-img h-0 max-w-0 mh-75 m-0\">\r\n <label class=\"mr-3\">{{ f.name }}</label>\r\n <input type=\"file\" [multiple]=item.multileFile [accept]=\"item.acceptFiles\"\r\n (change)=\"onSelectFile(item.formControl, $event,item.multileFile)\" />\r\n <label> <i class=\"pi pi-times remove-file absolute\"\r\n (click)=\"onRemove(f)\"></i></label>\r\n\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- upload files disabled -->\r\n <!-- <p-fileUpload mode=\"basic\" formControlName=\"{{item.formControl}}\" chooseLabel=\"Choose\"\r\n chooseIcon=\"pi pi-upload\" accept=\"image/*\" maxFileSize=\"1000000\" /> -->\r\n\r\n <div id={{item.id}} *ngIf=\"item.type === 'upload-files' && item.disabled \">\r\n <p-button (click)=\"op.toggle($event)\" icon=\"pi pi-paperclip\"\r\n label=\"Arquivos anexados\"></p-button>\r\n\r\n <p-overlayPanel #op [style]=\"{'width': '450px'}\" [showCloseIcon]=\"true\">\r\n <ng-template pTemplate=\"content\">\r\n <p-table *ngIf=\"files.length > 0\" [value]=\"files\" selectionMode=\"single\"\r\n [(selection)]=\"selectedProduct\" (onRowSelect)=\"onRowSelect($event, op)\"\r\n responsiveLayout=\"scroll\">\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th pSortableColumn=\"name\">Nome<p-sortIcon field=\"name\"></p-sortIcon></th>\r\n <th></th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-file>\r\n <tr>\r\n <td *ngIf=\"item.viewNameFile\">{{file.name}}</td>\r\n <td> <p-button *ngIf=\"item.onCLick\" icon=\"pi pi-download\"\r\n (click)='item.onCLick(file)'></p-button>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div *ngIf=\"files.length === 0\" class=\"p-10\">\r\n <label>Nenhum arquivo anexado</label>\r\n </div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n\r\n <!-- list -->\r\n <ul id={{item.id}} *ngIf=\"item.type === 'list' && item.options\">\r\n <li *ngFor=\"let list of item.options\">{{list.description}}</li>\r\n </ul>\r\n\r\n <!-- multi -->\r\n <p-multiSelect id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" placeholder={{item.placeholder}} *ngIf=\"item.type === 'multi'\" [options]=\"item.options\"\r\n formControlName={{item.formControl}} styleClass=\"p-0 w-full\" optionLabel=\"description\"\r\n (onChange)=\"onChange(item.onChange)\" maxSelectedLabels=\"100\"></p-multiSelect>\r\n\r\n <!-- radioButton -->\r\n <div id={{item.id}} *ngIf=\"item.type === 'radio-button'\" class=\"flex gap-3\">\r\n <div *ngFor=\"let listRadioButton of item.options\" class=\"flex align-items-center gap-2\">\r\n <p-radioButton [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" [value]=\"listRadioButton.code\" formControlName={{item.formControl}}\r\n (onClick)=\"onChange(item.onChange)\"></p-radioButton>\r\n <label>{{listRadioButton.description}}</label>\r\n </div>\r\n @if(control.controls[item.formControl].value == 'other'){\r\n <input pInputText type=\"text\" formControlName={{item.formControlOther}} />\r\n }\r\n </div>\r\n\r\n <!-- selectButton -->\r\n <div class=\"d-flex\" *ngIf=\"item.type === 'select-button'\">\r\n <p-selectButton id={{item.id}} (onChange)=\"onChange(item.onChange)\" [options]=\"item.options\"\r\n formControlName={{item.formControl}} optionValue=\"code\">\r\n <ng-template let-item>\r\n <span>{{item.description}}</span>\r\n </ng-template>\r\n </p-selectButton>\r\n <!-- <input type=\"text\" pInputText [attr.disabled]=\"item.disabled\"\r\n formControlName={{item.formControlSecondary}}> -->\r\n </div>\r\n\r\n <!-- table -->\r\n <p-table id={{item.id}} *ngIf=\"item.type === 'table'\" [scrollable]=\"true\"\r\n scrollHeight={{item.scrollHeight}} [columns]=item.colsTable\r\n styleClass=\"p-datatable-striped p-datatable-sm\" [value]=item.rowsTable>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngFor=\"let col of columns\">\r\n <span *ngIf=\"col.filed !== 'action'\">{{ col.header }}</span>\r\n <span *ngIf=\"col.filed === 'action'\">A\u00E7\u00E3o</span>\r\n </th>\r\n\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\r\n <tr>\r\n <td *ngFor=\"let col of columns\">\r\n <div *ngIf=\"col.field !== 'button'\">\r\n {{ rowData[col.field] }}\r\n </div>\r\n <div *ngIf=\"col.field === 'action'\">\r\n <p-button *ngFor=\"let action of item.buttonsTable\"\r\n styleClass={{action.styleClass}} label={{action.label}}\r\n (click)=\"action.onCLick(rowData)\" icon={{action.icon}}></p-button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"footer\" let-columns>\r\n <tr *ngFor=\"let footer of item.rowsFooter\">\r\n <td colspan=12><span class=\"font-normal\">{{footer.text}}:</span> {{footer.value}}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <!-- inputSwitch -->\r\n <div class=\"d-flex\" *ngIf=\"item.type === 'switch'\">\r\n <p-inputSwitch id={{item.id}} formControlName={{item.formControl}} class=\"mr-10\"\r\n (onChange)=\"onChange(item.onChange)\"></p-inputSwitch>\r\n <p translate={{item.label}}></p>\r\n </div>\r\n\r\n <!-- password -->\r\n <p-password id={{item.id}} [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\" placeholder={{item.placeholder}} *ngIf=\"item.type === 'password'\" [feedback]=\"false\"\r\n formControlName={{item.formControl}} (onChange)=\"onChange(item.onChange)\" styleClass=\"w-full\"\r\n [toggleMask]=\"true\"></p-password>\r\n\r\n <!-- photo -->\r\n <div id={{item.id}} class=\"camera\" *ngIf=\"item.type === 'photo'\">\r\n <video id=\"video\" class=\"foto\" autoplay>V\u00EDdeo n\u00E3o dispon\u00EDvel.</video>\r\n <canvas id=\"canvas\" class=\"foto\" style=\"display: none;\"></canvas>\r\n <button pButton icon=\"pi pi-times\" class=\"remove-file\" id=\"icon-remove\" [rounded]=\"true\"\r\n style=\"visibility: collapse;\" (click)=\"removePhoto()\"></button>\r\n <button pButton icon=\"pi pi-camera\" [rounded]=\"true\" (click)=\"capturePhoto(item.formControl)\"\r\n id=\"button\"></button>\r\n </div>\r\n\r\n <!-- likert -->\r\n <p-table id={{item.id}} *ngIf=\"item.type === 'likert'\" [scrollable]=\"true\"\r\n scrollHeight={{item.scrollHeight}} [columns]=item.colsTable\r\n styleClass=\"p-datatable-striped p-datatable-sm\" [value]=item.rowsTable>\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th style=\"width: 4rem\"></th>\r\n <th *ngFor=\"let col of columns\">\r\n <span>{{ col.header }}</span>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-row let-rowIndex=\"rowIndex\" let-columns=\"columns\"\r\n formArrayName=\"{{item.formControl}}\">\r\n <tr>\r\n <td>\r\n {{row}}\r\n </td>\r\n @for (control of columns; track item; let index = $index) {\r\n <td [formGroupName]=\"rowIndex\">\r\n <p-radioButton value=\"{{columns[index].field}}+{{row}}\"\r\n formControlName=\"question{{rowIndex}}\" />\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <!-- editable table -->\r\n <p-table\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'editable-table'\"\r\n [scrollable]=\"true\"\r\n scrollHeight=\"{{ item.scrollHeight }}\"\r\n [columns]=\"item.colsTable\"\r\n styleClass=\"p-datatable-striped p-datatable-sm\"\r\n [value]=\"item.rowsTable\"\r\n editMode=\"cell\">\r\n\r\n <!-- Cabe\u00E7alho da tabela -->\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th></th>\r\n <th *ngFor=\"let col of columns\">\r\n <span>{{ col.header }}</span>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Corpo da tabela -->\r\n <ng-template pTemplate=\"body\" let-row let-rowIndex=\"rowIndex\" let-columns=\"columns\"\r\n formArrayName=\"{{ item.formControl }}\" let-editing=\"editing\">\r\n <tr>\r\n <td>{{ row }}</td>\r\n @for (control of columns; track item; let index = $index) {\r\n <td [formGroupName]=\"rowIndex\" [pEditableColumn]=\"row\" pEditableColumnField=\"row\">\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input class=\"w-full\" pInputText type=\"text\" formControlName=\"_{{control.field}}question{{ rowIndex }}\" />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <input class=\"w-full\" pInputText type=\"text\" formControlName=\"_{{control.field}}question{{ rowIndex }}\" />\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n\r\n <!-- valida\u00E7\u00E3o de item -->\r\n <div>\r\n <small class=\"danger-text\"\r\n *ngIf=\"validateForm && control.controls[item.formControl] && control.controls[item.formControl].errors?.['required']\">\r\n Campo obrigat\u00F3rio\r\n </small>\r\n <small class=\"danger-text\"\r\n *ngIf=\"validateForm && control.controls[item.formControl] && control.controls[item.formControl].errors?.['email']\">\r\n Email inv\u00E1lido\r\n </small>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <p-divider\r\n *ngIf=\"(buttonsStandard && buttonsStandard.length > 0) || (buttonsOptional && buttonsOptional.length > 0)\"></p-divider>\r\n\r\n <div class=\"buttons-form\">\r\n <div *ngFor=\"let button of buttonsStandard\">\r\n <p-button *ngIf=\"button.type === 'clean'\" styleClass=\"p-button-warning {{button.styleClass}}\"\r\n label=\"Limpar\" (click)=\"button.onCLick()\" icon=\"pi pi-times\"></p-button>\r\n <p-button *ngIf=\"button.type === 'filter'\" styleClass=\"{{button.styleClass}}\" label=\"Filtrar\"\r\n (click)=\"button.onCLick()\" icon=\"pi pi-search\"></p-button>\r\n <p-button *ngIf=\"button.type === 'save'\" styleClass=\"p-button-success {{button.styleClass}}\"\r\n label=\"Salvar\" (click)=\"button.onCLick()\" icon=\"pi pi-save\"></p-button>\r\n <p-button *ngIf=\"button.type === 'cancel'\" styleClass=\"p-button-danger {{button.styleClass}}\"\r\n label=\"Cancelar\" (click)=\"button.onCLick()\" icon=\"pi pi-times\"></p-button>\r\n </div>\r\n <div *ngFor=\"let button of buttonsOptional\">\r\n <p-button styleClass={{button.styleClass}} label={{button.label}} (click)=\" button.onCLick()\"\r\n icon={{button.icon}}></p-button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n", styles: [".div-title span{font-size:20px;font-weight:500}.buttons-form{display:flex;gap:10px;justify-content:flex-end}.danger-text{color:#f18282}.drag-image{height:auto;width:100%;border-radius:10px;font-weight:400;display:flex;align-items:center;flex-direction:column;top:20px;max-height:250px;color:#000;padding:20px;text-align:center;overflow:auto}.drag-image h6{font-size:20px}.drag-image .file-name{font-size:14px}.drag-image i{font-size:3rem}.subtitle span{font-size:14px;margin-right:5px}.subtitle{align-items:baseline}.mh-75{min-height:75px!important}input[type=file]{position:absolute;width:100%;height:100%;inset:0;opacity:0;cursor:pointer}.preview-img{align-items:center;border-radius:5px;display:flex;height:140px;justify-content:center;margin:10px;max-width:180px;min-height:140px;min-width:180px;padding:0 20px;position:relative}.preview-img span{position:absolute;overflow-wrap:break-word}.remove-file{display:flex;justify-content:center;align-items:center;height:22px;width:22px;top:5px;right:5px;border-radius:50%;background:#bbb;color:#333;cursor:pointer;font-size:.8rem!important}.preview-img img{max-width:100%;opacity:.8}.camera{display:flex;flex-direction:column;align-items:center;position:relative}.foto{max-width:186px;min-height:140px;min-width:180px;border:1px dashed #000;border-radius:5px;margin-bottom:1em}.preview-photo{position:relative}.h-0{height:0}\n"] }]
|
|
166
|
+
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'form-dynamic-angular', template: "<div>\r\n <div *ngIf=\"title\" class=\"div-title\">\r\n <span translate=\"{{ title }}\"></span>\r\n <div *ngIf=\"subTitle\" class=\"flex subtitle\">\r\n <span translate=\"{{ subTitle }}\"></span>\r\n </div>\r\n <p-divider></p-divider>\r\n </div>\r\n <form *ngIf=\"control\" [formGroup]=\"control\">\r\n <div class=\"grid\">\r\n <div *ngFor=\"let item of form\" class=\"{{ item.col }} col-12\">\r\n <label *ngIf=\"item.label && !item.hideLabelTop\">{{ item.label }}</label>\r\n <label *ngIf=\"item.required && item.label\" class=\"danger-text ml-2\"\r\n >*</label\r\n >\r\n\r\n <div class=\"mt-2\">\r\n <!-- text -->\r\n <input\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n pInputText\r\n placeholder=\"{{ item.placeholder }}\"\r\n *ngIf=\"item.type == 'text' || item.type == 'number'\"\r\n type=\"{{ item.type }}\"\r\n formControlName=\"{{ item.formControl }}\"\r\n class=\"w-full\"\r\n />\r\n\r\n <p-editor\r\n *ngIf=\"item.type == 'editor'\"\r\n formControlName=\"{{ item.formControl }}\"\r\n [style]=\"{ height: '320px' }\"\r\n />\r\n\r\n <!-- select -->\r\n <p-dropdown\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n [filter]=\"item.search\"\r\n emptyFilterMessage=\"Nenhum dado encontrado\"\r\n emptyMessage=\"Nenhum dado encontrado\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n styleClass=\"w-full p-0\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n *ngIf=\"item.type === 'select'\"\r\n [showClear]=\"true\"\r\n [options]=\"item.options\"\r\n formControlName=\"{{ item.formControl }}\"\r\n optionLabel=\"description\"\r\n (onClear)=\"clickCLear(item.onCLear)\"\r\n ></p-dropdown>\r\n\r\n <!-- currency -->\r\n <p-inputNumber\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'currency'\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n formControlName=\"{{ item.formControl }}\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n inputStyleClass=\"w-full\"\r\n styleClass=\"w-full\"\r\n (onKeyDown)=\"onChange(item.onChange)\"\r\n mode=\"currency\"\r\n [min]=\"0\"\r\n currency=\"BRL\"\r\n >\r\n </p-inputNumber>\r\n\r\n <!-- mask -->\r\n <p-inputMask\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'mask'\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n formControlName=\"{{ item.formControl }}\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n styleClass=\"w-full\"\r\n (onComplete)=\"onChange(item.onChange)\"\r\n mask=\"{{ item.mask }}\"\r\n unmask=\"{{ item.unmask }}\"\r\n (onClear)=\"clickCLear(item.onCLear)\"\r\n showClear=\"true\"\r\n ></p-inputMask>\r\n\r\n <!-- treeSelect -->\r\n <p-treeSelect\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n (onNodeSelect)=\"onChange(item.onChange)\"\r\n *ngIf=\"item.type === 'tree-select'\"\r\n containerStyleClass=\"w-full p-0\"\r\n formControlName=\"{{ item.formControl }}\"\r\n [options]=\"item.treeSelectOptions\"\r\n [filter]=\"true\"\r\n [filterInputAutoFocus]=\"true\"\r\n emptyMessage=\"Nenhum dado encontrado\"\r\n [showClear]=\"true\"\r\n (onClear)=\"clickCLear(item.onCLear)\"\r\n ></p-treeSelect>\r\n\r\n <!-- autoComplete -->\r\n <p-autoComplete\r\n inputId=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n styleClass=\"w-full p-0\"\r\n [inputStyle]=\"{ width: '100%' }\"\r\n *ngIf=\"item.type === 'autocomplete'\"\r\n (onSelect)=\"onChange(item.onChange)\"\r\n formControlName=\"{{ item.formControl }}\"\r\n [suggestions]=\"filteredAutoComplete\"\r\n (completeMethod)=\"filterAutoComplete($event, item.options)\"\r\n [forceSelection]=\"false\"\r\n [showEmptyMessage]=\"true\"\r\n emptyMessage=\"Nenhum dado encontrado\"\r\n dataKey=\"code\"\r\n field=\"description\"\r\n showClear=\"true\"\r\n (onClear)=\"clickCLear(item.onCLear)\"\r\n ></p-autoComplete>\r\n\r\n <!-- date -->\r\n <p-calendar\r\n id=\"{{ item.id }}\"\r\n view=\"{{ item.viewDate }}\"\r\n *ngIf=\"item.type === 'date'\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n formControlName=\"{{ item.formControl }}\"\r\n styleClass=\"w-full\"\r\n [numberOfMonths]=\"numberOfMonthsDate(item.numberOfMonthsDate)\"\r\n [selectionMode]=\"selectionMode(item.selectionMode)\"\r\n (onFocus)=\"onChange(item.onFocusDate)\"\r\n [maxDate]=\"item.maxDate\"\r\n [minDate]=\"item.minDate\"\r\n dateFormat=\"{{ item.dateFormat }}\"\r\n (onSelect)=\"onChange(item.onChange)\"\r\n [iconDisplay]=\"'input'\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n [showIcon]=\"true\"\r\n [showTime]=\"item.showTime\"\r\n [timeOnly]=\"item.timeOnly\"\r\n ></p-calendar>\r\n\r\n <!-- textarea -->\r\n <div *ngIf=\"item.type === 'text-area'\" class=\"text-right\">\r\n <textarea\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n class=\"w-full\"\r\n maxlength=\"{{ item.maxlength }}\"\r\n counterTemplate=\"{1} of 50, {0} remaining\"\r\n counter=\"display\"\r\n (attr.change)=\"onChange(item.onChange)\"\r\n pInputTextarea\r\n formControlName=\"{{ item.formControl }}\"\r\n rows=\"{{ item.rowsTextArea }}\"\r\n ></textarea>\r\n <small *ngIf=\"item.maxlength\" id=\"username-help\">\r\n {{ control.controls[item.formControl].value.length }}/{{\r\n item.maxlength\r\n }}\r\n </small>\r\n </div>\r\n\r\n <!-- checkbox -->\r\n <div *ngIf=\"item.type == 'check-box'\">\r\n <p-checkbox\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n binary=\"true\"\r\n formControlName=\"{{ item.formControl }}\"\r\n value=\"{{ item.formControl }}\"\r\n label=\"{{ item.label }}\"\r\n ></p-checkbox>\r\n </div>\r\n\r\n <!-- checkbox multiple -->\r\n <div\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'check-box-multi'\"\r\n class=\"flex gap-3\"\r\n >\r\n <div\r\n formArrayName=\"{{ item.formControl }}\"\r\n *ngFor=\"let list of item.options; let i = index\"\r\n class=\"flex align-items-center gap-2\"\r\n >\r\n <div [formGroupName]=\"i\">\r\n <p-checkbox\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n binary=\"true\"\r\n formControlName=\"{{ list.code }}\"\r\n label=\"{{ list.description }}\"\r\n ></p-checkbox>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- button -->\r\n <p-button\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type == 'button'\"\r\n styleClass=\"{{ item.buttonClass }} w-full mt-3\"\r\n (click)=\"item.onCLick()\"\r\n [disabled]=\"item.disabled\"\r\n icon=\"{{ item.iconButton }}\"\r\n label=\"{{ item.label }}\"\r\n ></p-button>\r\n\r\n <!-- can -->\r\n <div id=\"{{ item.id }}\" class=\"area\" *ngIf=\"item.type == 'can'\">\r\n <video autoplay=\"true\" id=\"webCamera\"></video>\r\n\r\n <input type=\"text\" id=\"base_img\" name=\"base_img\" />\r\n <button type=\"button\" onclick=\"takeSnapShot()\">\r\n Tirar foto e salvar\r\n </button>\r\n\r\n <img id=\"imagemConvertida\" />\r\n <p id=\"caminhoImagem\" class=\"caminho-imagem\">\r\n <a href=\"\" target=\"_blank\" rel=\"noopener\"></a>\r\n </p>\r\n <script src=\"script.js\"></script>\r\n </div>\r\n\r\n <!-- upload files -->\r\n <div\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'upload-files' && !item.disabled\"\r\n class=\"drag-image\"\r\n [style.border]=\"\r\n validateForm && control.controls[item.formControl].errors\r\n ? ' 1px dashed #f18282'\r\n : ' 1px dashed #d1d5db'\r\n \"\r\n >\r\n <i *ngIf=\"filesView.length === 0\" class=\"pi pi-cloud-upload\"></i>\r\n <p *ngIf=\"filesView.length === 0\">\r\n Clique ou arraste e solte um arquivo para anexar\r\n </p>\r\n <span *ngIf=\"filesView.length === 0\">{{\r\n item.msgAcceptFiles\r\n }}</span>\r\n <input\r\n id=\"fileInput\"\r\n type=\"file\"\r\n [multiple]=\"item.multileFile\"\r\n [accept]=\"item.acceptFiles\"\r\n (change)=\"\r\n onSelectFile(item.formControl, $event, item.multileFile)\r\n \"\r\n />\r\n <div *ngFor=\"let f of filesView\">\r\n <div *ngIf=\"f.type && f.type.includes('image')\">\r\n <label class=\"preview-img\">\r\n <img *ngIf=\"!f.content\" src=\"{{ getUrl(f) }}\" />\r\n <img *ngIf=\"f.content\" src=\"{{ f.content }}\" />\r\n <span *ngIf=\"item.viewNameFile\">{{ f.name }}</span>\r\n <input\r\n type=\"file\"\r\n [multiple]=\"item.multileFile\"\r\n [accept]=\"item.acceptFiles\"\r\n (change)=\"\r\n onSelectFile(item.formControl, $event, item.multileFile)\r\n \"\r\n />\r\n <label>\r\n <i\r\n class=\"pi pi-times remove-file absolute\"\r\n (click)=\"onRemove(item.formControl, f)\"\r\n ></i\r\n ></label>\r\n </label>\r\n </div>\r\n <div *ngIf=\"f.type && !f.type.includes('image')\">\r\n <label class=\"preview-img h-0 max-w-0 mh-75 m-0\">\r\n <label class=\"mr-3\">{{ f.name }}</label>\r\n <input\r\n type=\"file\"\r\n [multiple]=\"item.multileFile\"\r\n [accept]=\"item.acceptFiles\"\r\n (change)=\"\r\n onSelectFile(item.formControl, $event, item.multileFile)\r\n \"\r\n />\r\n <label>\r\n <i\r\n class=\"pi pi-times remove-file absolute\"\r\n (click)=\"onRemove(f)\"\r\n ></i\r\n ></label>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- upload files disabled -->\r\n <!-- <p-fileUpload mode=\"basic\" formControlName=\"{{item.formControl}}\" chooseLabel=\"Choose\"\r\n chooseIcon=\"pi pi-upload\" accept=\"image/*\" maxFileSize=\"1000000\" /> -->\r\n\r\n <div\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'upload-files' && item.disabled\"\r\n >\r\n <p-button\r\n (click)=\"op.toggle($event)\"\r\n icon=\"pi pi-paperclip\"\r\n label=\"Arquivos anexados\"\r\n ></p-button>\r\n\r\n <p-overlayPanel\r\n #op\r\n [style]=\"{ width: '450px' }\"\r\n [showCloseIcon]=\"true\"\r\n >\r\n <ng-template pTemplate=\"content\">\r\n <p-table\r\n *ngIf=\"files.length > 0\"\r\n [value]=\"files\"\r\n selectionMode=\"single\"\r\n [(selection)]=\"selectedProduct\"\r\n (onRowSelect)=\"onRowSelect($event, op)\"\r\n responsiveLayout=\"scroll\"\r\n >\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th pSortableColumn=\"name\">\r\n Nome<p-sortIcon field=\"name\"></p-sortIcon>\r\n </th>\r\n <th></th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-file>\r\n <tr>\r\n <td *ngIf=\"item.viewNameFile\">{{ file.name }}</td>\r\n <td>\r\n <p-button\r\n *ngIf=\"item.onCLick\"\r\n icon=\"pi pi-download\"\r\n (click)=\"item.onCLick(file)\"\r\n ></p-button>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div *ngIf=\"files.length === 0\" class=\"p-10\">\r\n <label>Nenhum arquivo anexado</label>\r\n </div>\r\n </ng-template>\r\n </p-overlayPanel>\r\n </div>\r\n\r\n <!-- list -->\r\n <ul id=\"{{ item.id }}\" *ngIf=\"item.type === 'list' && item.options\">\r\n <li *ngFor=\"let list of item.options\">{{ list.description }}</li>\r\n </ul>\r\n\r\n <!-- multi -->\r\n <p-multiSelect\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n *ngIf=\"item.type === 'multi'\"\r\n [options]=\"item.options\"\r\n formControlName=\"{{ item.formControl }}\"\r\n styleClass=\"p-0 w-full\"\r\n optionLabel=\"description\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n maxSelectedLabels=\"100\"\r\n ></p-multiSelect>\r\n\r\n <!-- radioButton -->\r\n <div\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'radio-button'\"\r\n class=\"flex gap-3\"\r\n >\r\n <div\r\n *ngFor=\"let listRadioButton of item.options\"\r\n class=\"flex align-items-center gap-2\"\r\n >\r\n <p-radioButton\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n [value]=\"listRadioButton.code\"\r\n formControlName=\"{{ item.formControl }}\"\r\n (onClick)=\"onChange(item.onChange)\"\r\n ></p-radioButton>\r\n <label>{{ listRadioButton.description }}</label>\r\n </div>\r\n @if(control.controls[item.formControl].value == 'other'){\r\n <input\r\n pInputText\r\n type=\"text\"\r\n formControlName=\"{{ item.formControlOther }}\"\r\n />\r\n }\r\n </div>\r\n\r\n <!-- selectButton -->\r\n <div class=\"d-flex\" *ngIf=\"item.type === 'select-button'\">\r\n <p-selectButton\r\n id=\"{{ item.id }}\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n [options]=\"item.options\"\r\n formControlName=\"{{ item.formControl }}\"\r\n optionValue=\"code\"\r\n >\r\n <ng-template let-item>\r\n <span>{{ item.description }}</span>\r\n </ng-template>\r\n </p-selectButton>\r\n <!-- <input type=\"text\" pInputText [attr.disabled]=\"item.disabled\"\r\n formControlName={{item.formControlSecondary}}> -->\r\n </div>\r\n\r\n <!-- table -->\r\n <p-table\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'table'\"\r\n [scrollable]=\"true\"\r\n scrollHeight=\"{{ item.scrollHeight }}\"\r\n [columns]=\"item.colsTable\"\r\n styleClass=\"p-datatable-striped p-datatable-sm\"\r\n [value]=\"item.rowsTable\"\r\n >\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th *ngFor=\"let col of columns\">\r\n <span *ngIf=\"col.filed !== 'action'\">{{ col.header }}</span>\r\n <span *ngIf=\"col.filed === 'action'\">A\u00E7\u00E3o</span>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-rowData let-columns=\"columns\">\r\n <tr>\r\n <td *ngFor=\"let col of columns\">\r\n <div *ngIf=\"col.field !== 'button'\">\r\n {{ rowData[col.field] }}\r\n </div>\r\n <div *ngIf=\"col.field === 'action'\">\r\n <p-button\r\n *ngFor=\"let action of item.buttonsTable\"\r\n styleClass=\"{{ action.styleClass }}\"\r\n label=\"{{ action.label }}\"\r\n (click)=\"action.onCLick(rowData)\"\r\n icon=\"{{ action.icon }}\"\r\n ></p-button>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"footer\" let-columns>\r\n <tr *ngFor=\"let footer of item.rowsFooter\">\r\n <td colspan=\"12\">\r\n <span class=\"font-normal\">{{ footer.text }}:</span>\r\n {{ footer.value }}\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <!-- inputSwitch -->\r\n <div class=\"d-flex\" *ngIf=\"item.type === 'switch'\">\r\n <p-inputSwitch\r\n id=\"{{ item.id }}\"\r\n formControlName=\"{{ item.formControl }}\"\r\n class=\"mr-10\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n ></p-inputSwitch>\r\n <p translate=\"{{ item.label }}\"></p>\r\n </div>\r\n\r\n <!-- password -->\r\n <p-password\r\n id=\"{{ item.id }}\"\r\n [ngClass]=\"{\r\n 'ng-invalid ng-dirty':\r\n validateForm && control.controls[item.formControl].errors\r\n }\"\r\n placeholder=\"{{ item.placeholder }}\"\r\n *ngIf=\"item.type === 'password'\"\r\n [feedback]=\"false\"\r\n formControlName=\"{{ item.formControl }}\"\r\n (onChange)=\"onChange(item.onChange)\"\r\n styleClass=\"w-full\"\r\n [toggleMask]=\"true\"\r\n ></p-password>\r\n\r\n <!-- photo -->\r\n <div id=\"{{ item.id }}\" class=\"camera\" *ngIf=\"item.type === 'photo'\">\r\n <video id=\"video\" class=\"foto\" autoplay>\r\n V\u00EDdeo n\u00E3o dispon\u00EDvel.\r\n </video>\r\n <canvas id=\"canvas\" class=\"foto\" style=\"display: none\"></canvas>\r\n <button\r\n pButton\r\n icon=\"pi pi-times\"\r\n class=\"remove-file\"\r\n id=\"icon-remove\"\r\n [rounded]=\"true\"\r\n style=\"visibility: collapse\"\r\n (click)=\"removePhoto()\"\r\n ></button>\r\n <button\r\n pButton\r\n icon=\"pi pi-camera\"\r\n [rounded]=\"true\"\r\n (click)=\"capturePhoto(item.formControl)\"\r\n id=\"button\"\r\n ></button>\r\n </div>\r\n\r\n <!-- likert -->\r\n <p-table\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'likert'\"\r\n [scrollable]=\"true\"\r\n scrollHeight=\"{{ item.scrollHeight }}\"\r\n [columns]=\"item.colsTable\"\r\n styleClass=\"p-datatable-striped p-datatable-sm\"\r\n [value]=\"item.rowsTable\"\r\n >\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th style=\"width: 4rem\"></th>\r\n <th *ngFor=\"let col of columns\">\r\n <span>{{ col.header }}</span>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template\r\n pTemplate=\"body\"\r\n let-row\r\n let-rowIndex=\"rowIndex\"\r\n let-columns=\"columns\"\r\n formArrayName=\"{{ item.formControl }}\"\r\n >\r\n <tr>\r\n <td>\r\n {{ row }}\r\n </td>\r\n @for (control of columns; track item; let index = $index) {\r\n <td [formGroupName]=\"rowIndex\">\r\n <p-radioButton\r\n value=\"{{ columns[index].field }}+{{ row }}\"\r\n formControlName=\"question{{ rowIndex }}\"\r\n />\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <!-- editable table -->\r\n <p-table\r\n id=\"{{ item.id }}\"\r\n *ngIf=\"item.type === 'editable-table'\"\r\n [scrollable]=\"true\"\r\n scrollHeight=\"{{ item.scrollHeight }}\"\r\n [columns]=\"item.colsTable\"\r\n styleClass=\"p-datatable-striped p-datatable-sm\"\r\n [value]=\"item.rowsTable\"\r\n editMode=\"cell\"\r\n >\r\n <!-- Cabe\u00E7alho da tabela -->\r\n <ng-template pTemplate=\"header\" let-columns>\r\n <tr>\r\n <th style=\"width: 4rem\"></th>\r\n <th *ngFor=\"let col of columns\">\r\n <span>{{ col.header }}</span>\r\n </th>\r\n </tr>\r\n </ng-template>\r\n\r\n <!-- Corpo da tabela -->\r\n <ng-template\r\n pTemplate=\"body\"\r\n let-row\r\n let-rowIndex=\"rowIndex\"\r\n let-columns=\"columns\"\r\n formArrayName=\"{{ item.formControl }}\"\r\n let-editing=\"editing\"\r\n >\r\n <tr>\r\n <td>{{ row }}</td>\r\n @for (control of columns; track item; let index = $index) {\r\n <td\r\n [formGroupName]=\"rowIndex\"\r\n [pEditableColumn]=\"row\"\r\n pEditableColumnField=\"row\"\r\n >\r\n <p-cellEditor>\r\n <ng-template pTemplate=\"input\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n formControlName=\"_{{ control.field }}question{{\r\n rowIndex\r\n }}\"\r\n />\r\n </ng-template>\r\n <ng-template pTemplate=\"output\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n formControlName=\"_{{ control.field }}question{{\r\n rowIndex\r\n }}\"\r\n />\r\n </ng-template>\r\n </p-cellEditor>\r\n </td>\r\n }\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n\r\n <!-- valida\u00E7\u00E3o de item -->\r\n <div>\r\n <small\r\n class=\"danger-text\"\r\n *ngIf=\"validateForm && control.controls[item.formControl] && control.controls[item.formControl].errors?.['required']\"\r\n >\r\n Campo obrigat\u00F3rio\r\n </small>\r\n <small\r\n class=\"danger-text\"\r\n *ngIf=\"validateForm && control.controls[item.formControl] && control.controls[item.formControl].errors?.['email']\"\r\n >\r\n Email inv\u00E1lido\r\n </small>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <p-divider\r\n *ngIf=\"\r\n (buttonsStandard && buttonsStandard.length > 0) ||\r\n (buttonsOptional && buttonsOptional.length > 0)\r\n \"\r\n ></p-divider>\r\n\r\n <div class=\"buttons-form\">\r\n <div *ngFor=\"let button of buttonsStandard\">\r\n <p-button\r\n *ngIf=\"button.type === 'clean'\"\r\n styleClass=\"p-button-warning {{ button.styleClass }}\"\r\n label=\"Limpar\"\r\n (click)=\"button.onCLick()\"\r\n icon=\"pi pi-times\"\r\n ></p-button>\r\n <p-button\r\n *ngIf=\"button.type === 'filter'\"\r\n styleClass=\"{{ button.styleClass }}\"\r\n label=\"Filtrar\"\r\n (click)=\"button.onCLick()\"\r\n icon=\"pi pi-search\"\r\n ></p-button>\r\n <p-button\r\n *ngIf=\"button.type === 'save'\"\r\n styleClass=\"p-button-success {{ button.styleClass }}\"\r\n label=\"Salvar\"\r\n (click)=\"button.onCLick()\"\r\n icon=\"pi pi-save\"\r\n ></p-button>\r\n <p-button\r\n *ngIf=\"button.type === 'cancel'\"\r\n styleClass=\"p-button-danger {{ button.styleClass }}\"\r\n label=\"Cancelar\"\r\n (click)=\"button.onCLick()\"\r\n icon=\"pi pi-times\"\r\n ></p-button>\r\n </div>\r\n <div *ngFor=\"let button of buttonsOptional\">\r\n <p-button\r\n styleClass=\"{{ button.styleClass }}\"\r\n label=\"{{ button.label }}\"\r\n (click)=\"button.onCLick()\"\r\n icon=\"{{ button.icon }}\"\r\n ></p-button>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n</div>\r\n", styles: [".div-title span{font-size:20px;font-weight:500}.buttons-form{display:flex;gap:10px;justify-content:flex-end}.danger-text{color:#f18282}.drag-image{height:auto;width:100%;border-radius:10px;font-weight:400;display:flex;align-items:center;flex-direction:column;top:20px;max-height:250px;color:#000;padding:20px;text-align:center;overflow:auto}.drag-image h6{font-size:20px}.drag-image .file-name{font-size:14px}.drag-image i{font-size:3rem}.subtitle span{font-size:14px;margin-right:5px}.subtitle{align-items:baseline}.mh-75{min-height:75px!important}input[type=file]{position:absolute;width:100%;height:100%;inset:0;opacity:0;cursor:pointer}.preview-img{align-items:center;border-radius:5px;display:flex;height:140px;justify-content:center;margin:10px;max-width:180px;min-height:140px;min-width:180px;padding:0 20px;position:relative}.preview-img span{position:absolute;overflow-wrap:break-word}.remove-file{display:flex;justify-content:center;align-items:center;height:22px;width:22px;top:5px;right:5px;border-radius:50%;background:#bbb;color:#333;cursor:pointer;font-size:.8rem!important}.preview-img img{max-width:100%;opacity:.8}.camera{display:flex;flex-direction:column;align-items:center;position:relative}.foto{max-width:186px;min-height:140px;min-width:180px;border:1px dashed #000;border-radius:5px;margin-bottom:1em}.preview-photo{position:relative}.h-0{height:0}\n"] }]
|
|
166
167
|
}], ctorParameters: () => [{ type: i1.TranslateService }, { type: i2.FormBuilder }], propDecorators: { title: [{
|
|
167
168
|
type: Input
|
|
168
169
|
}], subTitle: [{
|
|
@@ -180,4 +181,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.0", ngImpor
|
|
|
180
181
|
}], files: [{
|
|
181
182
|
type: Input
|
|
182
183
|
}] } });
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1keW5hbWljLWFuZ3VsYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybS1keW5hbWljLWFuZ3VsYXIvc3JjL2xpYi9mb3JtLWR5bmFtaWMtYW5ndWxhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLWR5bmFtaWMtYW5ndWxhci9zcmMvbGliL2Zvcm0tZHluYW1pYy1hbmd1bGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxSGxGLE1BQU0sT0FBTywyQkFBMkI7SUFnQnRDLFlBQ1MsU0FBMkIsRUFDMUIsV0FBd0I7UUFEekIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFmekIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFFOUIsU0FBSSxHQUFZLEVBQUUsQ0FBQTtRQU1sQixVQUFLLEdBQVUsRUFBRSxDQUFDO1FBRTNCLGNBQVMsR0FBVSxFQUFFLENBQUM7UUFDdEIseUJBQW9CLEdBQVUsRUFBRSxDQUFDO1FBaUlqQyxhQUFRLEdBQUcsS0FBSyxFQUFFLElBQVUsRUFBRSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2hDLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDaEQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FB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cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRyZWVTZWxlY3RPcHRpb25zIHtcclxuICBrZXk6IHN0cmluZyxcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGljb246IHN0cmluZyxcclxuICBjaGlsZHJlbj86IElUcmVlU2VsZWN0T3B0aW9uc1tdXHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBJT3B0aW9ucyB7XHJcbiAgZGVzY3JpcHRpb246IHN0cmluZyxcclxuICBjb2RlOiBudW1iZXIgfCBzdHJpbmdcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIElDb2xzIHtcclxuICBmaWVsZDogc3RyaW5nLFxyXG4gIGhlYWRlcjogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFRUeXBlcyA9XHJcbiAgXCJhdXRvY29tcGxldGVcIiB8XHJcbiAgXCJidXR0b25cIiB8XHJcbiAgXCJjaGVjay1ib3hcIiB8XHJcbiAgXCJjdXJyZW5jeVwiIHxcclxuICBcImNoZWNrLWJveC1tdWx0aVwiIHxcclxuICBcImRhdGVcIiB8XHJcbiAgXCJzd2l0Y2hcIiB8XHJcbiAgXCJsaXN0XCIgfFxyXG4gIFwibGlrZXJ0XCIgfFxyXG4gIFwibWFza1wiIHxcclxuICBcIm11bHRpXCIgfFxyXG4gIFwibnVtYmVyXCIgfFxyXG4gIFwicGFzc3dvcmRcIiB8XHJcbiAgXCJwaG90b1wiIHxcclxuICBcInJhZGlvLWJ1dHRvblwiIHxcclxuICBcInNlbGVjdFwiIHxcclxuICBcInNlbGVjdC1idXR0b25cIiB8XHJcbiAgXCJ0YWJsZVwiIHxcclxuICBcInRleHRcIiB8XHJcbiAgXCJ0ZXh0LWFyZWFcIiB8XHJcbiAgXCJ0cmVlLXNlbGVjdFwiIHxcclxuICBcInVwbG9hZC1maWxlc1wiIHxcclxuICBcImVkaXRhYmxlLXRhYmxlXCJcclxuZXhwb3J0IGludGVyZmFjZSBJRm9ybSB7XHJcbiAgaWQ6IG51bWJlciB8IHN0cmluZyxcclxuICBsYWJlbD86IHN0cmluZyxcclxuICB0eXBlOiBUVHlwZXMsXHJcbiAgY29sPzogc3RyaW5nLFxyXG4gIGRpc2FibGVkPzogYm9vbGVhbiB8IG51bGwsXHJcbiAgZm9ybUNvbnRyb2w/OiBzdHJpbmcsXHJcbiAgcmVxdWlyZWQ/OiBib29sZWFuLFxyXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nLFxyXG5cclxuICBudW1iZXJPZk1vbnRoc0RhdGU/OiBudW1iZXI7XHJcbiAgc2VsZWN0aW9uTW9kZT86IFwibXVsdGlwbGVcIiB8IFwicmFuZ2VcIiB8IFwic2luZ2xlXCJcclxuICBtaW5EYXRlPzogRGF0ZSxcclxuICBtYXhEYXRlPzogRGF0ZSxcclxuICB2aWV3RGF0ZT86ICdtb250aCcgfCAnZGF0ZScsXHJcbiAgZGF0ZUZvcm1hdD86IHN0cmluZ1xyXG4gIHRpbWVPbmx5PzogYm9vbGVhblxyXG4gIHNob3dUaW1lPzogYm9vbGVhbixcclxuXHJcbiAgbWF4bGVuZ3RoPzogbnVtYmVyLFxyXG4gIHJvd3NUZXh0QXJlYT86IG51bWJlcixcclxuXHJcbiAgbWFzaz86IHN0cmluZyxcclxuICB1bm1hc2s/OiBib29sZWFuLFxyXG5cclxuICBzZWFyY2g/OiBib29sZWFuLFxyXG4gIG9wdGlvbnM/OiBJT3B0aW9uc1tdXHJcbiAgdHJlZVNlbGVjdE9wdGlvbnM/OiBJVHJlZVNlbGVjdE9wdGlvbnNbXSxcclxuXHJcbiAgYnV0dG9uQ2xhc3M/OiBzdHJpbmcsXHJcbiAgaWNvbkJ1dHRvbj86IHN0cmluZyxcclxuXHJcbiAgZm9ybUNvbnRyb2xPdGhlcj86IHN0cmluZyxcclxuICBoaWRlTGFiZWxUb3A/OiBib29sZWFuLFxyXG5cclxuICBzY3JvbGxIZWlnaHQ/OiBzdHJpbmcsXHJcbiAgY29sc1RhYmxlPzogSUNvbHNbXSxcclxuICByb3dzVGFibGU/OiBhbnlbXSxcclxuICByb3dzRm9vdGVyPzogYW55W10sXHJcbiAgYnV0dG9uc1RhYmxlPzogSUJ1dHRvbnNUYWJsZVtdLFxyXG5cclxuICBhY2NlcHRGaWxlcz86IHN0cmluZyxcclxuICBtc2dBY2NlcHRGaWxlcz86IHN0cmluZyxcclxuICB2aWV3TmFtZUZpbGU/OiBib29sZWFuLFxyXG4gIG11bHRpbGVGaWxlPzogYm9vbGVhbixcclxuXHJcbiAgb25DaGFuZ2U/OiBGdW5jdGlvbixcclxuICBvbkNMaWNrPzogRnVuY3Rpb24sXHJcbiAgb25DTGVhcj86IEZ1bmN0aW9uLFxyXG4gIG9uRm9jdXNEYXRlPzogRnVuY3Rpb24sXHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBJQnV0dG9uc1N0YW5kYXJkIHtcclxuICB0eXBlOiAnY2xlYW4nIHwgJ2ZpbHRlcicgfCAnc2F2ZScgfCAnY2FuY2VsJyxcclxuICBvbkNMaWNrOiBGdW5jdGlvbixcclxuICBzdHlsZUNsYXNzPzogc3RyaW5nXHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBJQnV0dG9uc09wdGlvbmFsIHtcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIG9uQ0xpY2s6IEZ1bmN0aW9uLFxyXG4gIGljb246IHN0cmluZyxcclxuICBzdHlsZUNsYXNzOiBzdHJpbmcsXHJcbiAgdmlldz86IEZ1bmN0aW9uO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElCdXR0b25zVGFibGUge1xyXG4gIHN0eWxlQ2xhc3M6IHN0cmluZyxcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGljb246IHN0cmluZyxcclxuICBvbkNMaWNrOiBGdW5jdGlvblxyXG59XHJcbkBDb21wb25lbnQoe1xyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHNlbGVjdG9yOiAnZm9ybS1keW5hbWljLWFuZ3VsYXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnZm9ybS1keW5hbWljLWFuZ3VsYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWydmb3JtLWR5bmFtaWMtYW5ndWxhci5jb21wb25lbnQuY3NzJ11cclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBGb3JtRHluYW1pY0FuZ3VsYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIHRpdGxlITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHN1YlRpdGxlITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHZhbGlkYXRlRm9ybTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBmb3JtOiBJRm9ybVtdID0gW11cclxuICBASW5wdXQoKSBjb250cm9sOiBGb3JtR3JvdXA7XHJcblxyXG4gIEBJbnB1dCgpIGJ1dHRvbnNTdGFuZGFyZDogSUJ1dHRvbnNTdGFuZGFyZFtdXHJcbiAgQElucHV0KCkgYnV0dG9uc09wdGlvbmFsOiBJQnV0dG9uc09wdGlvbmFsW11cclxuXHJcbiAgQElucHV0KCkgZmlsZXM6IGFueVtdID0gW107XHJcblxyXG4gIGZpbGVzVmlldzogYW55W10gPSBbXTtcclxuICBmaWx0ZXJlZEF1dG9Db21wbGV0ZTogYW55W10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXJcclxuICApIHtcclxuICAgIHRoaXMuY29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe30pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmZpbGVzLm1hcChmID0+IHtcclxuICAgICAgdGhpcy5maWxlc1ZpZXcucHVzaCh7IC4uLmYsIHR5cGU6IGYuY29udGVudFR5cGUgfSlcclxuICAgIH0pXHJcblxyXG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwc1wiKSB7XHJcbiAgICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgdmlkZW86IHRydWUgfSlcclxuICAgICAgICAudGhlbihmdW5jdGlvbiAobWVkaWFTdHJlYW0pIHtcclxuICAgICAgICAgIGNvbnN0IHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN2aWRlbycpO1xyXG4gICAgICAgICAgaWYgKHZpZGVvKSB7XHJcbiAgICAgICAgICAgIHZpZGVvLnNyY09iamVjdCA9IG1lZGlhU3RyZWFtO1xyXG4gICAgICAgICAgICB2aWRlby5wbGF5KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycikgeyB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbnVtYmVyT2ZNb250aHNEYXRlKG51bWJlck9mTW9udGhzRGF0ZTogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gbnVtYmVyT2ZNb250aHNEYXRlID8/IDFcclxuICB9XHJcblxyXG4gIHNlbGVjdGlvbk1vZGUoc2VsZWN0aW9uTW9kZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZSA/PyBcInNpbmdsZVwiXHJcbiAgfVxyXG5cclxuICBhc3luYyBjYXB0dXJlUGhvdG8oZmlsZU5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2NhbnZhc1wiKTtcclxuICAgIGNvbnN0IGljb246IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWNvbi1yZW1vdmVcIik7XHJcbiAgICBjb25zdCB2aWRlbzogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlkZW8nKTtcclxuICAgIGNvbnN0IGJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2J1dHRvbicpO1xyXG5cclxuXHJcbiAgICBpZiAoY2FudmFzICYmIHZpZGVvKSB7XHJcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSB2aWRlby52aWRlb0hlaWdodDtcclxuICAgICAgY2FudmFzLndpZHRoID0gdmlkZW8udmlkZW9XaWR0aDtcclxuICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICBpZiAoY29udGV4dCAmJiBpY29uICYmIGJ1dHRvbikge1xyXG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKHZpZGVvLCAwLCAwKVxyXG4gICAgICAgIHZpZGVvLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxyXG4gICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgICAgICBjYW52YXMuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIlxyXG4gICAgICAgIGljb24uc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiXHJcblxyXG4gICAgICAgIGxldCBhdXggPSB7XHJcbiAgICAgICAgICBuYW1lOiBcInBob3RvIHVzZXJcIixcclxuICAgICAgICAgIGNvbnRlbnRUeXBlOiBcImltYWdlL3BuZ1wiLFxyXG4gICAgICAgICAgY29udGVudDogY2FudmFzLnRvRGF0YVVSTChcImltYWdlL3BuZ1wiKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuY29udHJvbC5nZXQoZmlsZU5hbWUpPy5zZXRWYWx1ZShhdXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVQaG90bygpIHtcclxuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjYW52YXNcIik7XHJcbiAgICBjb25zdCBpY29uOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2ljb24tcmVtb3ZlXCIpO1xyXG4gICAgY29uc3QgdmlkZW86IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZGVvJyk7XHJcbiAgICBjb25zdCBidXR0b246IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNidXR0b24nKTtcclxuXHJcbiAgICBpZiAoY2FudmFzICYmIHZpZGVvKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgaWYgKGNvbnRleHQgJiYgaWNvbiAmJiBidXR0b24pIHtcclxuICAgICAgICB2aWRlby5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiXHJcbiAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2VcclxuICAgICAgICBjYW52YXMuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiXHJcbiAgICAgICAgaWNvbi5zdHlsZS52aXNpYmlsaXR5ID0gXCJjb2xsYXBzZVwiXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFVybChmaWxlOiBGaWxlKSB7XHJcbiAgICByZXR1cm4gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSlcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU2VsZWN0RmlsZShmaWxlTmFtZTogc3RyaW5nLCBldmVudDogYW55LCBtdWx0aXBsZTogYm9vbGVhbikge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1xyXG4gICAgLy8gaWYgKCFtdWx0aXBsZSkge1xyXG4gICAgLy8gICB0aGlzLmZpbGVzVmlldyA9IFtdO1xyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5maWxlc1ZpZXcucHVzaCguLi5maWxlKTtcclxuXHJcbiAgICBjb25zdCBuZXdGSWxlcyA9IGZpbGVcclxuICAgIGxldCBhcnIgPSBbXTtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBuZXdGSWxlcykge1xyXG4gICAgICBsZXQgYXV4ID0ge1xyXG4gICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcclxuICAgICAgICBjb250ZW50VHlwZTogaXRlbT8udHlwZSxcclxuICAgICAgICBjb250ZW50OiBhd2FpdCB0aGlzLnRvQmFzZTY0KGl0ZW0pXHJcbiAgICAgIH07XHJcbiAgICAgIGFyci5wdXNoKGF1eCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnRyb2wuZ2V0KGZpbGVOYW1lKT8uc2V0VmFsdWUoYXJyKTtcclxuICB9XHJcblxyXG4gIG9uUmVtb3ZlKGV2ZW50OiBGaWxlLCBmaWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmZpbGVzVmlldy5zcGxpY2UodGhpcy5maWxlc1ZpZXcuaW5kZXhPZihldmVudCksIDEpO1xyXG4gICAgdmFyIGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGVJbnB1dCcpIGFzIEhUTUxJbnB1dEVsZW1lbnRcclxuICAgIGlmIChpbnB1dCkge1xyXG4gICAgICBpbnB1dC52YWx1ZSA9ICcnXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJBdXRvQ29tcGxldGUoZXZlbnQ6IHsgcXVlcnk6IGFueTsgfSwgc3VnZ2VzdGlvbnNBdXRvQ29tcGxldGU6IGFueSkge1xyXG4gICAgbGV0IGZpbHRlcmVkOiBhbnlbXSA9IFtdO1xyXG4gICAgbGV0IHF1ZXJ5ID0gZXZlbnQucXVlcnk7XHJcblxyXG4gICAgaWYgKHN1Z2dlc3Rpb25zQXV0b0NvbXBsZXRlKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3VnZ2VzdGlvbnNBdXRvQ29tcGxldGUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgZGFkb3MgPSBzdWdnZXN0aW9uc0F1dG9Db21wbGV0ZVtpXTtcclxuICAgICAgICBpZiAoZGFkb3MuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5ub3JtYWxpemUoJ05GRCcpLnJlcGxhY2UoL1xccHtNfS91ZywgJycpLmluZGV4T2YocXVlcnkudG9Mb3dlckNhc2UoKS5ub3JtYWxpemUoJ05GRCcpLnJlcGxhY2UoL1xccHtNfS91ZywgJycpKSAhPSAtMSkge1xyXG4gICAgICAgICAgZmlsdGVyZWQucHVzaChkYWRvcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcmVkQXV0b0NvbXBsZXRlID0gZmlsdGVyZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b0Jhc2U2NCA9IGFzeW5jIChmaWxlOiBGaWxlKSA9PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIF8pID0+IHtcclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCk7XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZShjaGFuZ2U/OiBGdW5jdGlvbikge1xyXG4gICAgaWYgKGNoYW5nZSkge1xyXG4gICAgICBjaGFuZ2UoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xpY2tDTGVhcihjbGVhcj86IEZ1bmN0aW9uKSB7XHJcbiAgICBpZiAoY2xlYXIpIHtcclxuICAgICAgY2xlYXIoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25CbHVyKGJsdXI/OiBGdW5jdGlvbikge1xyXG4gICAgaWYgKGJsdXIpIHtcclxuICAgICAgYmx1cigpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidGl0bGVcIiBjbGFzcz1cImRpdi10aXRsZVwiPlxyXG4gICAgICAgIDxzcGFuIHRyYW5zbGF0ZT17e3RpdGxlfX0+PC9zcGFuPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzdWJUaXRsZVwiIGNsYXNzPVwiZmxleCBzdWJ0aXRsZVwiPlxyXG4gICAgICAgICAgICA8c3BhbiB0cmFuc2xhdGU9e3tzdWJUaXRsZX19Pjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8cC1kaXZpZGVyPjwvcC1kaXZpZGVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8Zm9ybSAqbmdJZj1cImNvbnRyb2xcIiBbZm9ybUdyb3VwXT1cImNvbnRyb2xcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZvcm1cIiBjbGFzcz1cInt7aXRlbS5jb2x9fSBjb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cIml0ZW0ubGFiZWwgJiYgIWl0ZW0uaGlkZUxhYmVsVG9wXCI+e3tpdGVtLmxhYmVsfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwiaXRlbS5yZXF1aXJlZCAmJiBpdGVtLmxhYmVsXCIgY2xhc3M9XCJkYW5nZXItdGV4dCBtbC0yXCI+KjwvbGFiZWw+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIHRleHQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPXt7aXRlbS5pZH19IFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAnbmctaW52YWxpZCBuZy1kaXJ0eSc6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVGb3JtICYmIGNvbnRyb2wuY29udHJvbHNbaXRlbS5mb3JtQ29udHJvbF0uZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgIH1cIiBwSW5wdXRUZXh0IHBsYWNlaG9sZGVyPXt7aXRlbS5wbGFjZWhvbGRlcn19ICpuZ0lmPVwiaXRlbS50eXBlID09ICd0ZXh0JyB8fCBpdGVtLnR5cGUgPT0gJ251bWJlcicgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT17e2l0ZW0udHlwZX19IGZvcm1Db250cm9sTmFtZT17e2l0ZW0uZm9ybUNvbnRyb2x9fSBjbGFzcz1cInctZnVsbFwiIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gc2VsZWN0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIGlkPXt7aXRlbS5pZH19IFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAnbmctaW52YWxpZCBuZy1kaXJ0eSc6XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVGb3JtICYmIGNvbnRyb2wuY29udHJvbHNbaXRlbS5mb3JtQ29udHJvbF0uZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgIH1cIiBbZmlsdGVyXT1pdGVtLnNlYXJjaCBlbXB0eUZpbHRlck1lc3NhZ2U9XCJOZW5odW0gZGFkbyBlbmNvbnRyYWRvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlNZXNzYWdlPVwiTmVuaHVtIGRhZG8gZW5jb250cmFkb1wiIHBsYWNlaG9sZGVyPXt7aXRlbS5wbGFjZWhvbGRlcn19IHN0eWxlQ2xhc3M9XCJ3LWZ1bGwgcC0wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlKGl0ZW0ub25DaGFuZ2UpXCIgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdzZWxlY3QnXCIgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiaXRlbS5vcHRpb25zXCIgZm9ybUNvbnRyb2xOYW1lPXt7aXRlbS5mb3JtQ29udHJvbH19IG9wdGlvbkxhYmVsPVwiZGVzY3JpcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhcik9XCJjbGlja0NMZWFyKGl0ZW0ub25DTGVhcilcIj48L3AtZHJvcGRvd24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gY3VycmVuY3kgIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIGlkPXt7aXRlbS5pZH19ICpuZ0lmPVwiaXRlbS50eXBlID09PSAnY3VycmVuY3knXCIgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICduZy1pbnZhbGlkIG5nLWRpcnR5JzpcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgICAgICAgfVwiIGZvcm1Db250cm9sTmFtZT17e2l0ZW0uZm9ybUNvbnRyb2x9fSBwbGFjZWhvbGRlcj17e2l0ZW0ucGxhY2Vob2xkZXJ9fSBpbnB1dFN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwidy1mdWxsXCIgKG9uS2V5RG93bik9XCJvbkNoYW5nZShpdGVtLm9uQ2hhbmdlKVwiIG1vZGU9XCJjdXJyZW5jeVwiIFttaW5dPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5PVwiQlJMXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wLWlucHV0TnVtYmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIG1hc2sgIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TWFzayBpZD17e2l0ZW0uaWR9fSAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ21hc2snXCIgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICduZy1pbnZhbGlkIG5nLWRpcnR5JzpcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgICAgICAgfVwiIGZvcm1Db250cm9sTmFtZT17e2l0ZW0uZm9ybUNvbnRyb2x9fSBwbGFjZWhvbGRlcj17e2l0ZW0ucGxhY2Vob2xkZXJ9fSBzdHlsZUNsYXNzPVwidy1mdWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ29tcGxldGUpPVwib25DaGFuZ2UoaXRlbS5vbkNoYW5nZSlcIiBtYXNrPXt7aXRlbS5tYXNrfX0gdW5tYXNrPXt7aXRlbS51bm1hc2t9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhcik9XCJjbGlja0NMZWFyKGl0ZW0ub25DTGVhcilcIiBzaG93Q2xlYXI9XCJ0cnVlXCI+PC9wLWlucHV0TWFzaz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSB0cmVlU2VsZWN0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXRyZWVTZWxlY3QgaWQ9e3tpdGVtLmlkfX0gW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICduZy1pbnZhbGlkIG5nLWRpcnR5JzpcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgICAgICAgfVwiIHBsYWNlaG9sZGVyPXt7aXRlbS5wbGFjZWhvbGRlcn19IChvbk5vZGVTZWxlY3QpPVwib25DaGFuZ2UoaXRlbS5vbkNoYW5nZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ3RyZWUtc2VsZWN0J1wiIGNvbnRhaW5lclN0eWxlQ2xhc3M9XCJ3LWZ1bGwgcC0wXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPXt7aXRlbS5mb3JtQ29udHJvbH19IFtvcHRpb25zXT1cIml0ZW0udHJlZVNlbGVjdE9wdGlvbnNcIiBbZmlsdGVyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVySW5wdXRBdXRvRm9jdXNdPVwidHJ1ZVwiIGVtcHR5TWVzc2FnZT1cIk5lbmh1bSBkYWRvIGVuY29udHJhZG9cIiBbc2hvd0NsZWFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAob25DbGVhcik9XCJjbGlja0NMZWFyKGl0ZW0ub25DTGVhcilcIj48L3AtdHJlZVNlbGVjdD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBhdXRvQ29tcGxldGUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtYXV0b0NvbXBsZXRlIGlucHV0SWQ9e3tpdGVtLmlkfX0gW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICduZy1pbnZhbGlkIG5nLWRpcnR5JzpcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgICAgICAgfVwiIHBsYWNlaG9sZGVyPXt7aXRlbS5wbGFjZWhvbGRlcn19IHN0eWxlQ2xhc3M9XCJ3LWZ1bGwgcC0wXCIgW2lucHV0U3R5bGVdPVwieyd3aWR0aCc6JzEwMCUnfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnYXV0b2NvbXBsZXRlJ1wiIChvblNlbGVjdCk9XCIgb25DaGFuZ2UoaXRlbS5vbkNoYW5nZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9e3tpdGVtLmZvcm1Db250cm9sfX0gW3N1Z2dlc3Rpb25zXT1cImZpbHRlcmVkQXV0b0NvbXBsZXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZXRlTWV0aG9kKT1cImZpbHRlckF1dG9Db21wbGV0ZSgkZXZlbnQsIGl0ZW0ub3B0aW9ucylcIiBbZm9yY2VTZWxlY3Rpb25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0VtcHR5TWVzc2FnZV09XCJ0cnVlXCIgZW1wdHlNZXNzYWdlPVwiTmVuaHVtIGRhZG8gZW5jb250cmFkb1wiIGRhdGFLZXk9XCJjb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ9XCJkZXNjcmlwdGlvblwiIHNob3dDbGVhcj10cnVlIChvbkNsZWFyKT1cImNsaWNrQ0xlYXIoaXRlbS5vbkNMZWFyKVwiPjwvcC1hdXRvQ29tcGxldGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gZGF0ZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciBpZD17e2l0ZW0uaWR9fSB2aWV3PVwie3tpdGVtLnZpZXdEYXRlfX1cIiAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2RhdGUnXCIgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnbmctaW52YWxpZCBuZy1kaXJ0eSc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlRm9ybSAmJiBjb250cm9sLmNvbnRyb2xzW2l0ZW0uZm9ybUNvbnRyb2xdLmVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgIH1cIiBmb3JtQ29udHJvbE5hbWU9e3tpdGVtLmZvcm1Db250cm9sfX0gc3R5bGVDbGFzcz1cInctZnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtudW1iZXJPZk1vbnRoc109bnVtYmVyT2ZNb250aHNEYXRlKGl0ZW0ubnVtYmVyT2ZNb250aHNEYXRlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0aW9uTW9kZV09c2VsZWN0aW9uTW9kZShpdGVtLnNlbGVjdGlvbk1vZGUpIChvbkZvY3VzKT1cIm9uQ2hhbmdlKGl0ZW0ub25Gb2N1c0RhdGUpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW21heERhdGVdPVwiaXRlbS5tYXhEYXRlXCIgW21pbkRhdGVdPVwiaXRlbS5taW5EYXRlXCIgZGF0ZUZvcm1hdD1cInt7aXRlbS5kYXRlRm9ybWF0fX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwib25DaGFuZ2UoaXRlbS5vbkNoYW5nZSlcIiBbaWNvbkRpc3BsYXldPVwiJ2lucHV0J1wiIHBsYWNlaG9sZGVyPXt7aXRlbS5wbGFjZWhvbGRlcn19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93SWNvbl09XCJ0cnVlXCIgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIiBbdGltZU9ubHldPVwiaXRlbS50aW1lT25seVwiPjwvcC1jYWxlbmRhcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSB0ZXh0YXJlYSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50eXBlID09PSAndGV4dC1hcmVhJ1wiIGNsYXNzPVwidGV4dC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9e3tpdGVtLmlkfX0gW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICduZy1pbnZhbGlkIG5nLWRpcnR5JzpcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgICAgICAgfVwiIHBsYWNlaG9sZGVyPXt7aXRlbS5wbGFjZWhvbGRlcn19IGNsYXNzPVwidy1mdWxsXCIgbWF4bGVuZ3RoPVwie3tpdGVtLm1heGxlbmd0aH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJUZW1wbGF0ZT1cInsxfSBvZiA1MCwgezB9IHJlbWFpbmluZ1wiIGNvdW50ZXI9XCJkaXNwbGF5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdHRyLmNoYW5nZSk9XCJvbkNoYW5nZShpdGVtLm9uQ2hhbmdlKVwiIHBJbnB1dFRleHRhcmVhIGZvcm1Db250cm9sTmFtZT17e2l0ZW0uZm9ybUNvbnRyb2x9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cz17e2l0ZW0ucm93c1RleHRBcmVhfX0+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwiaXRlbS5tYXhsZW5ndGhcIiBpZD1cInVzZXJuYW1lLWhlbHBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS52YWx1ZS5sZW5ndGh9fS97e2l0ZW0ubWF4bGVuZ3RofX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBjaGVja2JveCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50eXBlID09ICdjaGVjay1ib3gnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNoZWNrYm94IGlkPXt7aXRlbS5pZH19IFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ25nLWludmFsaWQgbmctZGlydHknOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICAgIH1cIiAob25DaGFuZ2UpPVwib25DaGFuZ2UoaXRlbS5vbkNoYW5nZSlcIiBiaW5hcnk9XCJ0cnVlXCIgZm9ybUNvbnRyb2xOYW1lPXt7aXRlbS5mb3JtQ29udHJvbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17e2l0ZW0uZm9ybUNvbnRyb2x9fSBsYWJlbD17e2l0ZW0ubGFiZWx9fT48L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gY2hlY2tib3ggIG11bHRpcGxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9e3tpdGVtLmlkfX0gKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdjaGVjay1ib3gtbXVsdGknXCIgY2xhc3M9XCJmbGV4IGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cInt7aXRlbS5mb3JtQ29udHJvbH19XCIgKm5nRm9yPVwibGV0IGxpc3Qgb2YgaXRlbS5vcHRpb25zOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNoZWNrYm94IGlkPXt7aXRlbS5pZH19IFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25nLWludmFsaWQgbmctZGlydHknOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlKGl0ZW0ub25DaGFuZ2UpXCIgYmluYXJ5PVwidHJ1ZVwiIGZvcm1Db250cm9sTmFtZT1cInt7bGlzdC5jb2RlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17e2xpc3QuZGVzY3JpcHRpb259fT48L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGJ1dHRvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8cC1idXR0b24gaWQ9e3tpdGVtLmlkfX0gKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2J1dHRvbidcIiBzdHlsZUNsYXNzPSd7e2l0ZW0uYnV0dG9uQ2xhc3N9fSB3LWZ1bGwgbXQtMydcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIml0ZW0ub25DTGljaygpXCIgW2Rpc2FibGVkXT1pdGVtLmRpc2FibGVkIGljb249e3tpdGVtLmljb25CdXR0b259fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD17e2l0ZW0ubGFiZWx9fT48L3AtYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGNhbiAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD17e2l0ZW0uaWR9fSBjbGFzcz1cImFyZWFcIiAqbmdJZj1cIml0ZW0udHlwZSA9PSAnY2FuJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dmlkZW8gYXV0b3BsYXk9XCJ0cnVlXCIgaWQ9XCJ3ZWJDYW1lcmFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC92aWRlbz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiYmFzZV9pbWdcIiBuYW1lPVwiYmFzZV9pbWdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25jbGljaz1cInRha2VTbmFwU2hvdCgpXCI+VGlyYXIgZm90byBlIHNhbHZhcjwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBpZD1cImltYWdlbUNvbnZlcnRpZGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgaWQ9XCJjYW1pbmhvSW1hZ2VtXCIgY2xhc3M9XCJjYW1pbmhvLWltYWdlbVwiPjxhIGhyZWY9XCJcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiPjwvYT48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgc3JjPVwic2NyaXB0LmpzXCI+PC9zY3JpcHQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gdXBsb2FkIGZpbGVzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9e3tpdGVtLmlkfX0gKm5nSWY9XCJpdGVtLnR5cGUgPT09ICd1cGxvYWQtZmlsZXMnICYmICFpdGVtLmRpc2FibGVkIFwiIGNsYXNzPVwiZHJhZy1pbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJdPVwidmFsaWRhdGVGb3JtICYmIGNvbnRyb2wuY29udHJvbHNbaXRlbS5mb3JtQ29udHJvbF0uZXJyb3JzID8gJyAxcHggZGFzaGVkICNmMTgyODInIDogJyAxcHggZGFzaGVkICNkMWQ1ZGInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiZmlsZXNWaWV3Lmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwicGkgcGktY2xvdWQtdXBsb2FkXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImZpbGVzVmlldy5sZW5ndGggPT09IDBcIj5DbGlxdWUgb3UgYXJyYXN0ZSBlIHNvbHRlIHVtIGFycXVpdm8gcGFyYSBhbmV4YXI8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmlsZXNWaWV3Lmxlbmd0aCA9PT0gMFwiPnt7aXRlbS5tc2dBY2NlcHRGaWxlc319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJmaWxlSW5wdXRcIiB0eXBlPVwiZmlsZVwiIFttdWx0aXBsZV09aXRlbS5tdWx0aWxlRmlsZSBbYWNjZXB0XT1cIml0ZW0uYWNjZXB0RmlsZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdEZpbGUoaXRlbS5mb3JtQ29udHJvbCwgJGV2ZW50LCBpdGVtLm11bHRpbGVGaWxlKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGYgb2YgZmlsZXNWaWV3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZi50eXBlICYmIGYudHlwZS5pbmNsdWRlcygnaW1hZ2UnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInByZXZpZXctaW1nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCIhZi5jb250ZW50XCIgc3JjPSd7e2dldFVybChmKX19Jz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImYuY29udGVudFwiIHNyYz0ne3tmLmNvbnRlbnR9fSc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXRlbS52aWV3TmFtZUZpbGVcIj57eyBmLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIFttdWx0aXBsZV09aXRlbS5tdWx0aWxlRmlsZSBbYWNjZXB0XT1cIml0ZW0uYWNjZXB0RmlsZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdEZpbGUoaXRlbS5mb3JtQ29udHJvbCwgJGV2ZW50LGl0ZW0ubXVsdGlsZUZpbGUpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiA8aSBjbGFzcz1cInBpIHBpLXRpbWVzIHJlbW92ZS1maWxlIGFic29sdXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25SZW1vdmUoaXRlbS5mb3JtQ29udHJvbCwgZilcIj48L2k+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZi50eXBlICYmICFmLnR5cGUuaW5jbHVkZXMoJ2ltYWdlJylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwcmV2aWV3LWltZyBoLTAgbWF4LXctMCBtaC03NSBtLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibXItM1wiPnt7IGYubmFtZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIFttdWx0aXBsZV09aXRlbS5tdWx0aWxlRmlsZSBbYWNjZXB0XT1cIml0ZW0uYWNjZXB0RmlsZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblNlbGVjdEZpbGUoaXRlbS5mb3JtQ29udHJvbCwgJGV2ZW50LGl0ZW0ubXVsdGlsZUZpbGUpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiA8aSBjbGFzcz1cInBpIHBpLXRpbWVzIHJlbW92ZS1maWxlIGFic29sdXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25SZW1vdmUoZilcIj48L2k+PC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSB1cGxvYWQgZmlsZXMgZGlzYWJsZWQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8cC1maWxlVXBsb2FkIG1vZGU9XCJiYXNpY1wiIGZvcm1Db250cm9sTmFtZT1cInt7aXRlbS5mb3JtQ29udHJvbH19XCIgY2hvb3NlTGFiZWw9XCJDaG9vc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaG9vc2VJY29uPVwicGkgcGktdXBsb2FkXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIG1heEZpbGVTaXplPVwiMTAwMDAwMFwiIC8+IC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPXt7aXRlbS5pZH19ICpuZ0lmPVwiaXRlbS50eXBlID09PSAndXBsb2FkLWZpbGVzJyAmJiBpdGVtLmRpc2FibGVkIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1idXR0b24gKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCIgaWNvbj1cInBpIHBpLXBhcGVyY2xpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIkFycXVpdm9zIGFuZXhhZG9zXCI+PC9wLWJ1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLW92ZXJsYXlQYW5lbCAjb3AgW3N0eWxlXT1cInsnd2lkdGgnOiAnNDUwcHgnfVwiIFtzaG93Q2xvc2VJY29uXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtdGFibGUgKm5nSWY9XCJmaWxlcy5sZW5ndGggPiAwXCIgW3ZhbHVlXT1cImZpbGVzXCIgc2VsZWN0aW9uTW9kZT1cInNpbmdsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0aW9uKV09XCJzZWxlY3RlZFByb2R1Y3RcIiAob25Sb3dTZWxlY3QpPVwib25Sb3dTZWxlY3QoJGV2ZW50LCBvcClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zaXZlTGF5b3V0PVwic2Nyb2xsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggcFNvcnRhYmxlQ29sdW1uPVwibmFtZVwiPk5vbWU8cC1zb3J0SWNvbiBmaWVsZD1cIm5hbWVcIj48L3Atc29ydEljb24+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvd0RhdGEgbGV0LWZpbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiaXRlbS52aWV3TmFtZUZpbGVcIj57e2ZpbGUubmFtZX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IDxwLWJ1dHRvbiAqbmdJZj1cIml0ZW0ub25DTGlja1wiIGljb249XCJwaSBwaS1kb3dubG9hZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPSdpdGVtLm9uQ0xpY2soZmlsZSknPjwvcC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWxlcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cInAtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5lbmh1bSBhcnF1aXZvIGFuZXhhZG88L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLW92ZXJsYXlQYW5lbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBsaXN0IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBpZD17e2l0ZW0uaWR9fSAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2xpc3QnICYmIGl0ZW0ub3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGxpc3Qgb2YgaXRlbS5vcHRpb25zXCI+e3tsaXN0LmRlc2NyaXB0aW9ufX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gbXVsdGkgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3QgaWQ9e3tpdGVtLmlkfX0gW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICAgICAgICduZy1pbnZhbGlkIG5nLWRpcnR5JzpcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgICAgICAgfVwiIHBsYWNlaG9sZGVyPXt7aXRlbS5wbGFjZWhvbGRlcn19ICpuZ0lmPVwiaXRlbS50eXBlID09PSAnbXVsdGknXCIgW29wdGlvbnNdPVwiaXRlbS5vcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPXt7aXRlbS5mb3JtQ29udHJvbH19IHN0eWxlQ2xhc3M9XCJwLTAgdy1mdWxsXCIgb3B0aW9uTGFiZWw9XCJkZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZShpdGVtLm9uQ2hhbmdlKVwiIG1heFNlbGVjdGVkTGFiZWxzPVwiMTAwXCI+PC9wLW11bHRpU2VsZWN0PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIHJhZGlvQnV0dG9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9e3tpdGVtLmlkfX0gKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdyYWRpby1idXR0b24nXCIgY2xhc3M9XCJmbGV4IGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGxpc3RSYWRpb0J1dHRvbiBvZiBpdGVtLm9wdGlvbnNcIiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1yYWRpb0J1dHRvbiBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmctaW52YWxpZCBuZy1kaXJ0eSc6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgW3ZhbHVlXT1cImxpc3RSYWRpb0J1dHRvbi5jb2RlXCIgZm9ybUNvbnRyb2xOYW1lPXt7aXRlbS5mb3JtQ29udHJvbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DaGFuZ2UoaXRlbS5vbkNoYW5nZSlcIj48L3AtcmFkaW9CdXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+e3tsaXN0UmFkaW9CdXR0b24uZGVzY3JpcHRpb259fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYoY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS52YWx1ZSA9PSAnb3RoZXInKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHBJbnB1dFRleHQgdHlwZT1cInRleHRcIiBmb3JtQ29udHJvbE5hbWU9e3tpdGVtLmZvcm1Db250cm9sT3RoZXJ9fSAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gc2VsZWN0QnV0dG9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ3NlbGVjdC1idXR0b24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLXNlbGVjdEJ1dHRvbiBpZD17e2l0ZW0uaWR9fSAob25DaGFuZ2UpPVwib25DaGFuZ2UoaXRlbS5vbkNoYW5nZSlcIiBbb3B0aW9uc109XCJpdGVtLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPXt7aXRlbS5mb3JtQ29udHJvbH19IG9wdGlvblZhbHVlPVwiY29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7aXRlbS5kZXNjcmlwdGlvbn19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9wLXNlbGVjdEJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8aW5wdXQgdHlwZT1cInRleHRcIiBwSW5wdXRUZXh0IFthdHRyLmRpc2FibGVkXT1cIml0ZW0uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9e3tpdGVtLmZvcm1Db250cm9sU2Vjb25kYXJ5fX0+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIHRhYmxlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLXRhYmxlIGlkPXt7aXRlbS5pZH19ICpuZ0lmPVwiaXRlbS50eXBlID09PSAndGFibGUnXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEhlaWdodD17e2l0ZW0uc2Nyb2xsSGVpZ2h0fX0gW2NvbHVtbnNdPWl0ZW0uY29sc1RhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zdHJpcGVkIHAtZGF0YXRhYmxlLXNtXCIgW3ZhbHVlXT1pdGVtLnJvd3NUYWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2wuZmlsZWQgIT09ICdhY3Rpb24nXCI+e3sgY29sLmhlYWRlciB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb2wuZmlsZWQgPT09ICdhY3Rpb24nXCI+QcOnw6NvPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93RGF0YSBsZXQtY29sdW1ucz1cImNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZmllbGQgIT09ICdidXR0b24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyByb3dEYXRhW2NvbC5maWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuZmllbGQgPT09ICdhY3Rpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1idXR0b24gKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBpdGVtLmJ1dHRvbnNUYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz17e2FjdGlvbi5zdHlsZUNsYXNzfX0gbGFiZWw9e3thY3Rpb24ubGFiZWx9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb24ub25DTGljayhyb3dEYXRhKVwiIGljb249e3thY3Rpb24uaWNvbn19PjwvcC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZm9vdGVyXCIgbGV0LWNvbHVtbnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGZvb3RlciBvZiBpdGVtLnJvd3NGb290ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0xMj48c3BhbiBjbGFzcz1cImZvbnQtbm9ybWFsXCI+e3tmb290ZXIudGV4dH19Ojwvc3Bhbj4ge3tmb290ZXIudmFsdWV9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBpbnB1dFN3aXRjaCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCIgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdzd2l0Y2gnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWlucHV0U3dpdGNoIGlkPXt7aXRlbS5pZH19IGZvcm1Db250cm9sTmFtZT17e2l0ZW0uZm9ybUNvbnRyb2x9fSBjbGFzcz1cIm1yLTEwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZShpdGVtLm9uQ2hhbmdlKVwiPjwvcC1pbnB1dFN3aXRjaD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgdHJhbnNsYXRlPXt7aXRlbS5sYWJlbH19PjwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBwYXNzd29yZCAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8cC1wYXNzd29yZCBpZD17e2l0ZW0uaWR9fSBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgJ25nLWludmFsaWQgbmctZGlydHknOlxyXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlRm9ybSAmJiBjb250cm9sLmNvbnRyb2xzW2l0ZW0uZm9ybUNvbnRyb2xdLmVycm9yc1xyXG4gICAgICAgICAgICAgICAgICB9XCIgcGxhY2Vob2xkZXI9e3tpdGVtLnBsYWNlaG9sZGVyfX0gKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdwYXNzd29yZCdcIiBbZmVlZGJhY2tdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9e3tpdGVtLmZvcm1Db250cm9sfX0gKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlKGl0ZW0ub25DaGFuZ2UpXCIgc3R5bGVDbGFzcz1cInctZnVsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0b2dnbGVNYXNrXT1cInRydWVcIj48L3AtcGFzc3dvcmQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gcGhvdG8gIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9e3tpdGVtLmlkfX0gY2xhc3M9XCJjYW1lcmFcIiAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ3Bob3RvJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dmlkZW8gaWQ9XCJ2aWRlb1wiIGNsYXNzPVwiZm90b1wiIGF1dG9wbGF5PlbDrWRlbyBuw6NvIGRpc3BvbsOtdmVsLjwvdmlkZW8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjYW52YXMgaWQ9XCJjYW52YXNcIiBjbGFzcz1cImZvdG9cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9jYW52YXM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBpY29uPVwicGkgcGktdGltZXNcIiBjbGFzcz1cInJlbW92ZS1maWxlXCIgaWQ9XCJpY29uLXJlbW92ZVwiIFtyb3VuZGVkXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ2aXNpYmlsaXR5OiBjb2xsYXBzZTtcIiAoY2xpY2spPVwicmVtb3ZlUGhvdG8oKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gaWNvbj1cInBpIHBpLWNhbWVyYVwiIFtyb3VuZGVkXT1cInRydWVcIiAoY2xpY2spPVwiY2FwdHVyZVBob3RvKGl0ZW0uZm9ybUNvbnRyb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYnV0dG9uXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gbGlrZXJ0ICAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZSBpZD17e2l0ZW0uaWR9fSAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ2xpa2VydCdcIiBbc2Nyb2xsYWJsZV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0PXt7aXRlbS5zY3JvbGxIZWlnaHR9fSBbY29sdW1uc109aXRlbS5jb2xzVGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXN0cmlwZWQgcC1kYXRhdGFibGUtc21cIiBbdmFsdWVdPWl0ZW0ucm93c1RhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCIgbGV0LWNvbHVtbnM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwid2lkdGg6IDRyZW1cIj48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgY29sLmhlYWRlciB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93IGxldC1yb3dJbmRleD1cInJvd0luZGV4XCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1BcnJheU5hbWU9XCJ7e2l0ZW0uZm9ybUNvbnRyb2x9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tyb3d9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoY29udHJvbCBvZiBjb2x1bW5zOyB0cmFjayBpdGVtOyBsZXQgaW5kZXggPSAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgW2Zvcm1Hcm91cE5hbWVdPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtcmFkaW9CdXR0b24gdmFsdWU9XCJ7e2NvbHVtbnNbaW5kZXhdLmZpZWxkfX0re3tyb3d9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJxdWVzdGlvbnt7cm93SW5kZXh9fVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBlZGl0YWJsZSB0YWJsZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8cC10YWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIGlkPVwie3sgaXRlbS5pZCB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdlZGl0YWJsZS10YWJsZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbEhlaWdodD1cInt7IGl0ZW0uc2Nyb2xsSGVpZ2h0IH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbY29sdW1uc109XCJpdGVtLmNvbHNUYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXN0cmlwZWQgcC1kYXRhdGFibGUtc21cIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtLnJvd3NUYWJsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGU9XCJjZWxsXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxobyBkYSB0YWJlbGEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvbC5oZWFkZXIgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQ29ycG8gZGEgdGFiZWxhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvdyBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtQXJyYXlOYW1lPVwie3sgaXRlbS5mb3JtQ29udHJvbCB9fVwiIGxldC1lZGl0aW5nPVwiZWRpdGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+e3sgcm93IH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQGZvciAoY29udHJvbCBvZiBjb2x1bW5zOyB0cmFjayBpdGVtOyBsZXQgaW5kZXggPSAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgW2Zvcm1Hcm91cE5hbWVdPVwicm93SW5kZXhcIiBbcEVkaXRhYmxlQ29sdW1uXT1cInJvd1wiIHBFZGl0YWJsZUNvbHVtbkZpZWxkPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jZWxsRWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ3LWZ1bGxcIiBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiX3t7Y29udHJvbC5maWVsZH19cXVlc3Rpb257eyByb3dJbmRleCB9fVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJvdXRwdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ3LWZ1bGxcIiBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwiX3t7Y29udHJvbC5maWVsZH19cXVlc3Rpb257eyByb3dJbmRleCB9fVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2VsbEVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgIDwvcC10YWJsZT5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gdmFsaWRhw6fDo28gZGUgaXRlbSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJkYW5nZXItdGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRlRm9ybSAmJiBjb250cm9sLmNvbnRyb2xzW2l0ZW0uZm9ybUNvbnRyb2xdICYmIGNvbnRyb2wuY29udHJvbHNbaXRlbS5mb3JtQ29udHJvbF0uZXJyb3JzPy5bJ3JlcXVpcmVkJ11cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbXBvIG9icmlnYXTDs3Jpb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJkYW5nZXItdGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRlRm9ybSAmJiBjb250cm9sLmNvbnRyb2xzW2l0ZW0uZm9ybUNvbnRyb2xdICYmIGNvbnRyb2wuY29udHJvbHNbaXRlbS5mb3JtQ29udHJvbF0uZXJyb3JzPy5bJ2VtYWlsJ11cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtYWlsIGludsOhbGlkb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxwLWRpdmlkZXJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiKGJ1dHRvbnNTdGFuZGFyZCAmJiBidXR0b25zU3RhbmRhcmQubGVuZ3RoID4gMCkgfHwgKGJ1dHRvbnNPcHRpb25hbCAmJiBidXR0b25zT3B0aW9uYWwubGVuZ3RoID4gMClcIj48L3AtZGl2aWRlcj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zLWZvcm1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGJ1dHRvbiBvZiBidXR0b25zU3RhbmRhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cC1idXR0b24gKm5nSWY9XCJidXR0b24udHlwZSA9PT0gJ2NsZWFuJ1wiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi13YXJuaW5nIHt7YnV0dG9uLnN0eWxlQ2xhc3N9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiTGltcGFyXCIgKGNsaWNrKT1cImJ1dHRvbi5vbkNMaWNrKClcIiBpY29uPVwicGkgcGktdGltZXNcIj48L3AtYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiAqbmdJZj1cImJ1dHRvbi50eXBlID09PSAnZmlsdGVyJ1wiIHN0eWxlQ2xhc3M9XCJ7e2J1dHRvbi5zdHlsZUNsYXNzfX1cIiBsYWJlbD1cIkZpbHRyYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYnV0dG9uLm9uQ0xpY2soKVwiIGljb249XCJwaSBwaS1zZWFyY2hcIj48L3AtYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiAqbmdJZj1cImJ1dHRvbi50eXBlID09PSAnc2F2ZSdcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tc3VjY2VzcyB7e2J1dHRvbi5zdHlsZUNsYXNzfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cIlNhbHZhclwiIChjbGljayk9XCJidXR0b24ub25DTGljaygpXCIgaWNvbj1cInBpIHBpLXNhdmVcIj48L3AtYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiAqbmdJZj1cImJ1dHRvbi50eXBlID09PSAnY2FuY2VsJ1wiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXIge3tidXR0b24uc3R5bGVDbGFzc319XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9XCJDYW5jZWxhclwiIChjbGljayk9XCJidXR0b24ub25DTGljaygpXCIgaWNvbj1cInBpIHBpLXRpbWVzXCI+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGJ1dHRvbnNPcHRpb25hbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiBzdHlsZUNsYXNzPXt7YnV0dG9uLnN0eWxlQ2xhc3N9fSBsYWJlbD17e2J1dHRvbi5sYWJlbH19IChjbGljayk9XCIgYnV0dG9uLm9uQ0xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249e3tidXR0b24uaWNvbn19PjwvcC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbjwvZGl2PlxyXG4iXX0=
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1keW5hbWljLWFuZ3VsYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybS1keW5hbWljLWFqYXgvc3JjL2xpYi9mb3JtLWR5bmFtaWMtYW5ndWxhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9mb3JtLWR5bmFtaWMtYWpheC9zcmMvbGliL2Zvcm0tZHluYW1pYy1hbmd1bGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0hsRixNQUFNLE9BQU8sMkJBQTJCO0lBZ0J0QyxZQUNTLFNBQTJCLEVBQzFCLFdBQXdCO1FBRHpCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBZnpCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRTlCLFNBQUksR0FBWSxFQUFFLENBQUE7UUFNbEIsVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUUzQixjQUFTLEdBQVUsRUFBRSxDQUFDO1FBQ3RCLHlCQUFvQixHQUFVLEVBQUUsQ0FBQztRQWlJakMsYUFBUSxHQUFHLEtBQUssRUFBRSxJQUFVLEVBQUUsRUFBRTtZQUM5QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUE7UUFq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IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmV4cG9ydCBpbnRlcmZhY2UgSVRyZWVTZWxlY3RPcHRpb25zIHtcclxuICBrZXk6IHN0cmluZyxcclxuICBsYWJlbDogc3RyaW5nLFxyXG4gIGljb246IHN0cmluZyxcclxuICBjaGlsZHJlbj86IElUcmVlU2VsZWN0T3B0aW9uc1tdXHJcbn1cclxuZXhwb3J0IGludGVyZmFjZSBJT3B0aW9ucyB7XHJcbiAgZGVzY3JpcHRpb246IHN0cmluZyxcclxuICBjb2RlOiBudW1iZXIgfCBzdHJpbmdcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIElDb2xzIHtcclxuICBmaWVsZDogc3RyaW5nLFxyXG4gIGhlYWRlcjogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFRUeXBlcyA9XHJcbiAgXCJhdXRvY29tcGxldGVcIiB8XHJcbiAgXCJidXR0b25cIiB8XHJcbiAgXCJjaGVjay1ib3hcIiB8XHJcbiAgXCJjdXJyZW5jeVwiIHxcclxuICBcImNoZWNrLWJveC1tdWx0aVwiIHxcclxuICBcImRhdGVcIiB8XHJcbiAgXCJzd2l0Y2hcIiB8XHJcbiAgXCJsaXN0XCIgfFxyXG4gIFwibGlrZXJ0XCIgfFxyXG4gIFwibWFza1wiIHxcclxuICBcIm11bHRpXCIgfFxyXG4gIFwibnVtYmVyXCIgfFxyXG4gIFwicGFzc3dvcmRcIiB8XHJcbiAgXCJwaG90b1wiIHxcclxuICBcInJhZGlvLWJ1dHRvblwiIHxcclxuICBcInNlbGVjdFwiIHxcclxuICBcInNlbGVjdC1idXR0b25cIiB8XHJcbiAgXCJ0YWJsZVwiIHxcclxuICBcInRleHRcIiB8XHJcbiAgXCJ0ZXh0LWFyZWFcIiB8XHJcbiAgXCJ0cmVlLXNlbGVjdFwiIHxcclxuICBcInVwbG9hZC1maWxlc1wiIHxcclxuICBcImVkaXRhYmxlLXRhYmxlXCIgfCBcclxuICBcImVkaXRvclwiXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUZvcm0ge1xyXG4gIGlkOiBudW1iZXIgfCBzdHJpbmcsXHJcbiAgbGFiZWw/OiBzdHJpbmcsXHJcbiAgdHlwZTogVFR5cGVzLFxyXG4gIGNvbD86IHN0cmluZyxcclxuICBkaXNhYmxlZD86IGJvb2xlYW4gfCBudWxsLFxyXG4gIGZvcm1Db250cm9sPzogc3RyaW5nLFxyXG4gIHJlcXVpcmVkPzogYm9vbGVhbixcclxuICBwbGFjZWhvbGRlcj86IHN0cmluZyxcclxuXHJcbiAgbnVtYmVyT2ZNb250aHNEYXRlPzogbnVtYmVyO1xyXG4gIHNlbGVjdGlvbk1vZGU/OiBcIm11bHRpcGxlXCIgfCBcInJhbmdlXCIgfCBcInNpbmdsZVwiXHJcbiAgbWluRGF0ZT86IERhdGUsXHJcbiAgbWF4RGF0ZT86IERhdGUsXHJcbiAgdmlld0RhdGU/OiAnbW9udGgnIHwgJ2RhdGUnLFxyXG4gIGRhdGVGb3JtYXQ/OiBzdHJpbmdcclxuICB0aW1lT25seT86IGJvb2xlYW5cclxuICBzaG93VGltZT86IGJvb2xlYW4sXHJcblxyXG4gIG1heGxlbmd0aD86IG51bWJlcixcclxuICByb3dzVGV4dEFyZWE/OiBudW1iZXIsXHJcblxyXG4gIG1hc2s/OiBzdHJpbmcsXHJcbiAgdW5tYXNrPzogYm9vbGVhbixcclxuXHJcbiAgc2VhcmNoPzogYm9vbGVhbixcclxuICBvcHRpb25zPzogSU9wdGlvbnNbXVxyXG4gIHRyZWVTZWxlY3RPcHRpb25zPzogSVRyZWVTZWxlY3RPcHRpb25zW10sXHJcblxyXG4gIGJ1dHRvbkNsYXNzPzogc3RyaW5nLFxyXG4gIGljb25CdXR0b24/OiBzdHJpbmcsXHJcblxyXG4gIGZvcm1Db250cm9sT3RoZXI/OiBzdHJpbmcsXHJcbiAgaGlkZUxhYmVsVG9wPzogYm9vbGVhbixcclxuXHJcbiAgc2Nyb2xsSGVpZ2h0Pzogc3RyaW5nLFxyXG4gIGNvbHNUYWJsZT86IElDb2xzW10sXHJcbiAgcm93c1RhYmxlPzogYW55W10sXHJcbiAgcm93c0Zvb3Rlcj86IGFueVtdLFxyXG4gIGJ1dHRvbnNUYWJsZT86IElCdXR0b25zVGFibGVbXSxcclxuXHJcbiAgYWNjZXB0RmlsZXM/OiBzdHJpbmcsXHJcbiAgbXNnQWNjZXB0RmlsZXM/OiBzdHJpbmcsXHJcbiAgdmlld05hbWVGaWxlPzogYm9vbGVhbixcclxuICBtdWx0aWxlRmlsZT86IGJvb2xlYW4sXHJcblxyXG4gIG9uQ2hhbmdlPzogRnVuY3Rpb24sXHJcbiAgb25DTGljaz86IEZ1bmN0aW9uLFxyXG4gIG9uQ0xlYXI/OiBGdW5jdGlvbixcclxuICBvbkZvY3VzRGF0ZT86IEZ1bmN0aW9uLFxyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJ1dHRvbnNTdGFuZGFyZCB7XHJcbiAgdHlwZTogJ2NsZWFuJyB8ICdmaWx0ZXInIHwgJ3NhdmUnIHwgJ2NhbmNlbCcsXHJcbiAgb25DTGljazogRnVuY3Rpb24sXHJcbiAgc3R5bGVDbGFzcz86IHN0cmluZ1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgSUJ1dHRvbnNPcHRpb25hbCB7XHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBvbkNMaWNrOiBGdW5jdGlvbixcclxuICBpY29uOiBzdHJpbmcsXHJcbiAgc3R5bGVDbGFzczogc3RyaW5nLFxyXG4gIHZpZXc/OiBGdW5jdGlvbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQnV0dG9uc1RhYmxlIHtcclxuICBzdHlsZUNsYXNzOiBzdHJpbmcsXHJcbiAgbGFiZWw6IHN0cmluZyxcclxuICBpY29uOiBzdHJpbmcsXHJcbiAgb25DTGljazogRnVuY3Rpb25cclxufVxyXG5AQ29tcG9uZW50KHtcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBzZWxlY3RvcjogJ2Zvcm0tZHluYW1pYy1hbmd1bGFyJyxcclxuICB0ZW1wbGF0ZVVybDogJ2Zvcm0tZHluYW1pYy1hbmd1bGFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnZm9ybS1keW5hbWljLWFuZ3VsYXIuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgRm9ybUR5bmFtaWNBbmd1bGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBASW5wdXQoKSB0aXRsZSE6IHN0cmluZztcclxuICBASW5wdXQoKSBzdWJUaXRsZSE6IHN0cmluZztcclxuICBASW5wdXQoKSB2YWxpZGF0ZUZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgZm9ybTogSUZvcm1bXSA9IFtdXHJcbiAgQElucHV0KCkgY29udHJvbDogRm9ybUdyb3VwO1xyXG5cclxuICBASW5wdXQoKSBidXR0b25zU3RhbmRhcmQ6IElCdXR0b25zU3RhbmRhcmRbXVxyXG4gIEBJbnB1dCgpIGJ1dHRvbnNPcHRpb25hbDogSUJ1dHRvbnNPcHRpb25hbFtdXHJcblxyXG4gIEBJbnB1dCgpIGZpbGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBmaWxlc1ZpZXc6IGFueVtdID0gW107XHJcbiAgZmlsdGVyZWRBdXRvQ29tcGxldGU6IGFueVtdID0gW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyXHJcbiAgKSB7XHJcbiAgICB0aGlzLmNvbnRyb2wgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHt9KTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWxlcy5tYXAoZiA9PiB7XHJcbiAgICAgIHRoaXMuZmlsZXNWaWV3LnB1c2goeyAuLi5mLCB0eXBlOiBmLmNvbnRlbnRUeXBlIH0pXHJcbiAgICB9KVxyXG5cclxuICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09IFwiaHR0cHNcIikge1xyXG4gICAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IHZpZGVvOiB0cnVlIH0pXHJcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKG1lZGlhU3RyZWFtKSB7XHJcbiAgICAgICAgICBjb25zdCB2aWRlbzogSFRNTFZpZGVvRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlkZW8nKTtcclxuICAgICAgICAgIGlmICh2aWRlbykge1xyXG4gICAgICAgICAgICB2aWRlby5zcmNPYmplY3QgPSBtZWRpYVN0cmVhbTtcclxuICAgICAgICAgICAgdmlkZW8ucGxheSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHsgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG51bWJlck9mTW9udGhzRGF0ZShudW1iZXJPZk1vbnRoc0RhdGU6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIG51bWJlck9mTW9udGhzRGF0ZSA/PyAxXHJcbiAgfVxyXG5cclxuICBzZWxlY3Rpb25Nb2RlKHNlbGVjdGlvbk1vZGU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGUgPz8gXCJzaW5nbGVcIlxyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FwdHVyZVBob3RvKGZpbGVOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjYW52YXNcIik7XHJcbiAgICBjb25zdCBpY29uOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2ljb24tcmVtb3ZlXCIpO1xyXG4gICAgY29uc3QgdmlkZW86IEhUTUxWaWRlb0VsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZGVvJyk7XHJcbiAgICBjb25zdCBidXR0b246IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNidXR0b24nKTtcclxuXHJcblxyXG4gICAgaWYgKGNhbnZhcyAmJiB2aWRlbykge1xyXG4gICAgICBjYW52YXMuaGVpZ2h0ID0gdmlkZW8udmlkZW9IZWlnaHQ7XHJcbiAgICAgIGNhbnZhcy53aWR0aCA9IHZpZGVvLnZpZGVvV2lkdGg7XHJcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgaWYgKGNvbnRleHQgJiYgaWNvbiAmJiBidXR0b24pIHtcclxuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZSh2aWRlbywgMCwgMClcclxuICAgICAgICB2aWRlby5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcclxuICAgICAgICBidXR0b24uZGlzYWJsZWQgPSB0cnVlXHJcbiAgICAgICAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCJcclxuICAgICAgICBpY29uLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIlxyXG5cclxuICAgICAgICBsZXQgYXV4ID0ge1xyXG4gICAgICAgICAgbmFtZTogXCJwaG90byB1c2VyXCIsXHJcbiAgICAgICAgICBjb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcclxuICAgICAgICAgIGNvbnRlbnQ6IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIilcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmNvbnRyb2wuZ2V0KGZpbGVOYW1lKT8uc2V0VmFsdWUoYXV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUGhvdG8oKSB7XHJcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY2FudmFzXCIpO1xyXG4gICAgY29uc3QgaWNvbjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNpY29uLXJlbW92ZVwiKTtcclxuICAgIGNvbnN0IHZpZGVvOiBIVE1MVmlkZW9FbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN2aWRlbycpO1xyXG4gICAgY29uc3QgYnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYnV0dG9uJyk7XHJcblxyXG4gICAgaWYgKGNhbnZhcyAmJiB2aWRlbykge1xyXG4gICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgIGlmIChjb250ZXh0ICYmIGljb24gJiYgYnV0dG9uKSB7XHJcbiAgICAgICAgdmlkZW8uc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIlxyXG4gICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIlxyXG4gICAgICAgIGljb24uc3R5bGUudmlzaWJpbGl0eSA9IFwiY29sbGFwc2VcIlxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRVcmwoZmlsZTogRmlsZSkge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpXHJcbiAgfVxyXG5cclxuICBhc3luYyBvblNlbGVjdEZpbGUoZmlsZU5hbWU6IHN0cmluZywgZXZlbnQ6IGFueSwgbXVsdGlwbGU6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNcclxuICAgIC8vIGlmICghbXVsdGlwbGUpIHtcclxuICAgIC8vICAgdGhpcy5maWxlc1ZpZXcgPSBbXTtcclxuICAgIC8vIH1cclxuICAgIHRoaXMuZmlsZXNWaWV3LnB1c2goLi4uZmlsZSk7XHJcblxyXG4gICAgY29uc3QgbmV3RklsZXMgPSBmaWxlXHJcbiAgICBsZXQgYXJyID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3RklsZXMpIHtcclxuICAgICAgbGV0IGF1eCA9IHtcclxuICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXHJcbiAgICAgICAgY29udGVudFR5cGU6IGl0ZW0/LnR5cGUsXHJcbiAgICAgICAgY29udGVudDogYXdhaXQgdGhpcy50b0Jhc2U2NChpdGVtKVxyXG4gICAgICB9O1xyXG4gICAgICBhcnIucHVzaChhdXgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250cm9sLmdldChmaWxlTmFtZSk/LnNldFZhbHVlKGFycik7XHJcbiAgfVxyXG5cclxuICBvblJlbW92ZShldmVudDogRmlsZSwgZmlsZU5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5maWxlc1ZpZXcuc3BsaWNlKHRoaXMuZmlsZXNWaWV3LmluZGV4T2YoZXZlbnQpLCAxKTtcclxuICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlSW5wdXQnKSBhcyBIVE1MSW5wdXRFbGVtZW50XHJcbiAgICBpZiAoaW5wdXQpIHtcclxuICAgICAgaW5wdXQudmFsdWUgPSAnJ1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsdGVyQXV0b0NvbXBsZXRlKGV2ZW50OiB7IHF1ZXJ5OiBhbnk7IH0sIHN1Z2dlc3Rpb25zQXV0b0NvbXBsZXRlOiBhbnkpIHtcclxuICAgIGxldCBmaWx0ZXJlZDogYW55W10gPSBbXTtcclxuICAgIGxldCBxdWVyeSA9IGV2ZW50LnF1ZXJ5O1xyXG5cclxuICAgIGlmIChzdWdnZXN0aW9uc0F1dG9Db21wbGV0ZSkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1Z2dlc3Rpb25zQXV0b0NvbXBsZXRlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGRhZG9zID0gc3VnZ2VzdGlvbnNBdXRvQ29tcGxldGVbaV07XHJcbiAgICAgICAgaWYgKGRhZG9zLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkubm9ybWFsaXplKCdORkQnKS5yZXBsYWNlKC9cXHB7TX0vdWcsICcnKS5pbmRleE9mKHF1ZXJ5LnRvTG93ZXJDYXNlKCkubm9ybWFsaXplKCdORkQnKS5yZXBsYWNlKC9cXHB7TX0vdWcsICcnKSkgIT0gLTEpIHtcclxuICAgICAgICAgIGZpbHRlcmVkLnB1c2goZGFkb3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5maWx0ZXJlZEF1dG9Db21wbGV0ZSA9IGZpbHRlcmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9CYXNlNjQgPSBhc3luYyAoZmlsZTogRmlsZSkgPT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCBfKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQpO1xyXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2UoY2hhbmdlPzogRnVuY3Rpb24pIHtcclxuICAgIGlmIChjaGFuZ2UpIHtcclxuICAgICAgY2hhbmdlKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsaWNrQ0xlYXIoY2xlYXI/OiBGdW5jdGlvbikge1xyXG4gICAgaWYgKGNsZWFyKSB7XHJcbiAgICAgIGNsZWFyKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQmx1cihibHVyPzogRnVuY3Rpb24pIHtcclxuICAgIGlmIChibHVyKSB7XHJcbiAgICAgIGJsdXIoKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2PlxyXG4gIDxkaXYgKm5nSWY9XCJ0aXRsZVwiIGNsYXNzPVwiZGl2LXRpdGxlXCI+XHJcbiAgICA8c3BhbiB0cmFuc2xhdGU9XCJ7eyB0aXRsZSB9fVwiPjwvc3Bhbj5cclxuICAgIDxkaXYgKm5nSWY9XCJzdWJUaXRsZVwiIGNsYXNzPVwiZmxleCBzdWJ0aXRsZVwiPlxyXG4gICAgICA8c3BhbiB0cmFuc2xhdGU9XCJ7eyBzdWJUaXRsZSB9fVwiPjwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHAtZGl2aWRlcj48L3AtZGl2aWRlcj5cclxuICA8L2Rpdj5cclxuICA8Zm9ybSAqbmdJZj1cImNvbnRyb2xcIiBbZm9ybUdyb3VwXT1cImNvbnRyb2xcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJncmlkXCI+XHJcbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZm9ybVwiIGNsYXNzPVwie3sgaXRlbS5jb2wgfX0gY29sLTEyXCI+XHJcbiAgICAgICAgPGxhYmVsICpuZ0lmPVwiaXRlbS5sYWJlbCAmJiAhaXRlbS5oaWRlTGFiZWxUb3BcIj57eyBpdGVtLmxhYmVsIH19PC9sYWJlbD5cclxuICAgICAgICA8bGFiZWwgKm5nSWY9XCJpdGVtLnJlcXVpcmVkICYmIGl0ZW0ubGFiZWxcIiBjbGFzcz1cImRhbmdlci10ZXh0IG1sLTJcIlxyXG4gICAgICAgICAgPio8L2xhYmVsXHJcbiAgICAgICAgPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiPlxyXG4gICAgICAgICAgPCEtLSB0ZXh0IC0tPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIGlkPVwie3sgaXRlbS5pZCB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAnbmctaW52YWxpZCBuZy1kaXJ0eSc6XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgIHBJbnB1dFRleHRcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyBpdGVtLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3RleHQnIHx8IGl0ZW0udHlwZSA9PSAnbnVtYmVyJ1wiXHJcbiAgICAgICAgICAgIHR5cGU9XCJ7eyBpdGVtLnR5cGUgfX1cIlxyXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBpdGVtLmZvcm1Db250cm9sIH19XCJcclxuICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGxcIlxyXG4gICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICA8cC1lZGl0b3JcclxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2VkaXRvcidcIlxyXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBpdGVtLmZvcm1Db250cm9sIH19XCJcclxuICAgICAgICAgICAgW3N0eWxlXT1cInsgaGVpZ2h0OiAnMzIwcHgnIH1cIlxyXG4gICAgICAgICAgLz5cclxuXHJcbiAgICAgICAgICA8IS0tIHNlbGVjdCAtLT5cclxuICAgICAgICAgIDxwLWRyb3Bkb3duXHJcbiAgICAgICAgICAgIGlkPVwie3sgaXRlbS5pZCB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAnbmctaW52YWxpZCBuZy1kaXJ0eSc6XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgIFtmaWx0ZXJdPVwiaXRlbS5zZWFyY2hcIlxyXG4gICAgICAgICAgICBlbXB0eUZpbHRlck1lc3NhZ2U9XCJOZW5odW0gZGFkbyBlbmNvbnRyYWRvXCJcclxuICAgICAgICAgICAgZW1wdHlNZXNzYWdlPVwiTmVuaHVtIGRhZG8gZW5jb250cmFkb1wiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgaXRlbS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJ3LWZ1bGwgcC0wXCJcclxuICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlKGl0ZW0ub25DaGFuZ2UpXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdzZWxlY3QnXCJcclxuICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgW29wdGlvbnNdPVwiaXRlbS5vcHRpb25zXCJcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgaXRlbS5mb3JtQ29udHJvbCB9fVwiXHJcbiAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwiZGVzY3JpcHRpb25cIlxyXG4gICAgICAgICAgICAob25DbGVhcik9XCJjbGlja0NMZWFyKGl0ZW0ub25DTGVhcilcIlxyXG4gICAgICAgICAgPjwvcC1kcm9wZG93bj5cclxuXHJcbiAgICAgICAgICA8IS0tIGN1cnJlbmN5ICAtLT5cclxuICAgICAgICAgIDxwLWlucHV0TnVtYmVyXHJcbiAgICAgICAgICAgIGlkPVwie3sgaXRlbS5pZCB9fVwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnY3VycmVuY3knXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICduZy1pbnZhbGlkIG5nLWRpcnR5JzpcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlRm9ybSAmJiBjb250cm9sLmNvbnRyb2xzW2l0ZW0uZm9ybUNvbnRyb2xdLmVycm9yc1xyXG4gICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgaXRlbS5mb3JtQ29udHJvbCB9fVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgaXRlbS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgIGlucHV0U3R5bGVDbGFzcz1cInctZnVsbFwiXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIlxyXG4gICAgICAgICAgICAob25LZXlEb3duKT1cIm9uQ2hhbmdlKGl0ZW0ub25DaGFuZ2UpXCJcclxuICAgICAgICAgICAgbW9kZT1cImN1cnJlbmN5XCJcclxuICAgICAgICAgICAgW21pbl09XCIwXCJcclxuICAgICAgICAgICAgY3VycmVuY3k9XCJCUkxcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPC9wLWlucHV0TnVtYmVyPlxyXG5cclxuICAgICAgICAgIDwhLS0gbWFzayAgLS0+XHJcbiAgICAgICAgICA8cC1pbnB1dE1hc2tcclxuICAgICAgICAgICAgaWQ9XCJ7eyBpdGVtLmlkIH19XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdtYXNrJ1wiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAnbmctaW52YWxpZCBuZy1kaXJ0eSc6XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGl0ZW0uZm9ybUNvbnRyb2wgfX1cIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IGl0ZW0ucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwidy1mdWxsXCJcclxuICAgICAgICAgICAgKG9uQ29tcGxldGUpPVwib25DaGFuZ2UoaXRlbS5vbkNoYW5nZSlcIlxyXG4gICAgICAgICAgICBtYXNrPVwie3sgaXRlbS5tYXNrIH19XCJcclxuICAgICAgICAgICAgdW5tYXNrPVwie3sgaXRlbS51bm1hc2sgfX1cIlxyXG4gICAgICAgICAgICAob25DbGVhcik9XCJjbGlja0NMZWFyKGl0ZW0ub25DTGVhcilcIlxyXG4gICAgICAgICAgICBzaG93Q2xlYXI9XCJ0cnVlXCJcclxuICAgICAgICAgID48L3AtaW5wdXRNYXNrPlxyXG5cclxuICAgICAgICAgIDwhLS0gdHJlZVNlbGVjdCAtLT5cclxuICAgICAgICAgIDxwLXRyZWVTZWxlY3RcclxuICAgICAgICAgICAgaWQ9XCJ7eyBpdGVtLmlkIH19XCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xyXG4gICAgICAgICAgICAgICduZy1pbnZhbGlkIG5nLWRpcnR5JzpcclxuICAgICAgICAgICAgICAgIHZhbGlkYXRlRm9ybSAmJiBjb250cm9sLmNvbnRyb2xzW2l0ZW0uZm9ybUNvbnRyb2xdLmVycm9yc1xyXG4gICAgICAgICAgICB9XCJcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyBpdGVtLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgICAgKG9uTm9kZVNlbGVjdCk9XCJvbkNoYW5nZShpdGVtLm9uQ2hhbmdlKVwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAndHJlZS1zZWxlY3QnXCJcclxuICAgICAgICAgICAgY29udGFpbmVyU3R5bGVDbGFzcz1cInctZnVsbCBwLTBcIlxyXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBpdGVtLmZvcm1Db250cm9sIH19XCJcclxuICAgICAgICAgICAgW29wdGlvbnNdPVwiaXRlbS50cmVlU2VsZWN0T3B0aW9uc1wiXHJcbiAgICAgICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFtmaWx0ZXJJbnB1dEF1dG9Gb2N1c109XCJ0cnVlXCJcclxuICAgICAgICAgICAgZW1wdHlNZXNzYWdlPVwiTmVuaHVtIGRhZG8gZW5jb250cmFkb1wiXHJcbiAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIChvbkNsZWFyKT1cImNsaWNrQ0xlYXIoaXRlbS5vbkNMZWFyKVwiXHJcbiAgICAgICAgICA+PC9wLXRyZWVTZWxlY3Q+XHJcblxyXG4gICAgICAgICAgPCEtLSBhdXRvQ29tcGxldGUgLS0+XHJcbiAgICAgICAgICA8cC1hdXRvQ29tcGxldGVcclxuICAgICAgICAgICAgaW5wdXRJZD1cInt7IGl0ZW0uaWQgfX1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgJ25nLWludmFsaWQgbmctZGlydHknOlxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVGb3JtICYmIGNvbnRyb2wuY29udHJvbHNbaXRlbS5mb3JtQ29udHJvbF0uZXJyb3JzXHJcbiAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IGl0ZW0ucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwidy1mdWxsIHAtMFwiXHJcbiAgICAgICAgICAgIFtpbnB1dFN0eWxlXT1cInsgd2lkdGg6ICcxMDAlJyB9XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdhdXRvY29tcGxldGUnXCJcclxuICAgICAgICAgICAgKG9uU2VsZWN0KT1cIm9uQ2hhbmdlKGl0ZW0ub25DaGFuZ2UpXCJcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgaXRlbS5mb3JtQ29udHJvbCB9fVwiXHJcbiAgICAgICAgICAgIFtzdWdnZXN0aW9uc109XCJmaWx0ZXJlZEF1dG9Db21wbGV0ZVwiXHJcbiAgICAgICAgICAgIChjb21wbGV0ZU1ldGhvZCk9XCJmaWx0ZXJBdXRvQ29tcGxldGUoJGV2ZW50LCBpdGVtLm9wdGlvbnMpXCJcclxuICAgICAgICAgICAgW2ZvcmNlU2VsZWN0aW9uXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgW3Nob3dFbXB0eU1lc3NhZ2VdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIGVtcHR5TWVzc2FnZT1cIk5lbmh1bSBkYWRvIGVuY29udHJhZG9cIlxyXG4gICAgICAgICAgICBkYXRhS2V5PVwiY29kZVwiXHJcbiAgICAgICAgICAgIGZpZWxkPVwiZGVzY3JpcHRpb25cIlxyXG4gICAgICAgICAgICBzaG93Q2xlYXI9XCJ0cnVlXCJcclxuICAgICAgICAgICAgKG9uQ2xlYXIpPVwiY2xpY2tDTGVhcihpdGVtLm9uQ0xlYXIpXCJcclxuICAgICAgICAgID48L3AtYXV0b0NvbXBsZXRlPlxyXG5cclxuICAgICAgICAgIDwhLS0gZGF0ZSAtLT5cclxuICAgICAgICAgIDxwLWNhbGVuZGFyXHJcbiAgICAgICAgICAgIGlkPVwie3sgaXRlbS5pZCB9fVwiXHJcbiAgICAgICAgICAgIHZpZXc9XCJ7eyBpdGVtLnZpZXdEYXRlIH19XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdkYXRlJ1wiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAnbmctaW52YWxpZCBuZy1kaXJ0eSc6XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGl0ZW0uZm9ybUNvbnRyb2wgfX1cIlxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwidy1mdWxsXCJcclxuICAgICAgICAgICAgW251bWJlck9mTW9udGhzXT1cIm51bWJlck9mTW9udGhzRGF0ZShpdGVtLm51bWJlck9mTW9udGhzRGF0ZSlcIlxyXG4gICAgICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25Nb2RlKGl0ZW0uc2VsZWN0aW9uTW9kZSlcIlxyXG4gICAgICAgICAgICAob25Gb2N1cyk9XCJvbkNoYW5nZShpdGVtLm9uRm9jdXNEYXRlKVwiXHJcbiAgICAgICAgICAgIFttYXhEYXRlXT1cIml0ZW0ubWF4RGF0ZVwiXHJcbiAgICAgICAgICAgIFttaW5EYXRlXT1cIml0ZW0ubWluRGF0ZVwiXHJcbiAgICAgICAgICAgIGRhdGVGb3JtYXQ9XCJ7eyBpdGVtLmRhdGVGb3JtYXQgfX1cIlxyXG4gICAgICAgICAgICAob25TZWxlY3QpPVwib25DaGFuZ2UoaXRlbS5vbkNoYW5nZSlcIlxyXG4gICAgICAgICAgICBbaWNvbkRpc3BsYXldPVwiJ2lucHV0J1wiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgaXRlbS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgIFtzaG93SWNvbl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgW3Nob3dUaW1lXT1cIml0ZW0uc2hvd1RpbWVcIlxyXG4gICAgICAgICAgICBbdGltZU9ubHldPVwiaXRlbS50aW1lT25seVwiXHJcbiAgICAgICAgICA+PC9wLWNhbGVuZGFyPlxyXG5cclxuICAgICAgICAgIDwhLS0gdGV4dGFyZWEgLS0+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50eXBlID09PSAndGV4dC1hcmVhJ1wiIGNsYXNzPVwidGV4dC1yaWdodFwiPlxyXG4gICAgICAgICAgICA8dGV4dGFyZWFcclxuICAgICAgICAgICAgICBpZD1cInt7IGl0ZW0uaWQgfX1cIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICduZy1pbnZhbGlkIG5nLWRpcnR5JzpcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGVGb3JtICYmIGNvbnRyb2wuY29udHJvbHNbaXRlbS5mb3JtQ29udHJvbF0uZXJyb3JzXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyBpdGVtLnBsYWNlaG9sZGVyIH19XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbFwiXHJcbiAgICAgICAgICAgICAgbWF4bGVuZ3RoPVwie3sgaXRlbS5tYXhsZW5ndGggfX1cIlxyXG4gICAgICAgICAgICAgIGNvdW50ZXJUZW1wbGF0ZT1cInsxfSBvZiA1MCwgezB9IHJlbWFpbmluZ1wiXHJcbiAgICAgICAgICAgICAgY291bnRlcj1cImRpc3BsYXlcIlxyXG4gICAgICAgICAgICAgIChhdHRyLmNoYW5nZSk9XCJvbkNoYW5nZShpdGVtLm9uQ2hhbmdlKVwiXHJcbiAgICAgICAgICAgICAgcElucHV0VGV4dGFyZWFcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBpdGVtLmZvcm1Db250cm9sIH19XCJcclxuICAgICAgICAgICAgICByb3dzPVwie3sgaXRlbS5yb3dzVGV4dEFyZWEgfX1cIlxyXG4gICAgICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwiaXRlbS5tYXhsZW5ndGhcIiBpZD1cInVzZXJuYW1lLWhlbHBcIj5cclxuICAgICAgICAgICAgICB7eyBjb250cm9sLmNvbnRyb2xzW2l0ZW0uZm9ybUNvbnRyb2xdLnZhbHVlLmxlbmd0aCB9fS97e1xyXG4gICAgICAgICAgICAgICAgaXRlbS5tYXhsZW5ndGhcclxuICAgICAgICAgICAgICB9fVxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBjaGVja2JveCAtLT5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2NoZWNrLWJveCdcIj5cclxuICAgICAgICAgICAgPHAtY2hlY2tib3hcclxuICAgICAgICAgICAgICBpZD1cInt7IGl0ZW0uaWQgfX1cIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICduZy1pbnZhbGlkIG5nLWRpcnR5JzpcclxuICAgICAgICAgICAgICAgICAgdmFsaWRhdGVGb3JtICYmIGNvbnRyb2wuY29udHJvbHNbaXRlbS5mb3JtQ29udHJvbF0uZXJyb3JzXHJcbiAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlKGl0ZW0ub25DaGFuZ2UpXCJcclxuICAgICAgICAgICAgICBiaW5hcnk9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBpdGVtLmZvcm1Db250cm9sIH19XCJcclxuICAgICAgICAgICAgICB2YWx1ZT1cInt7IGl0ZW0uZm9ybUNvbnRyb2wgfX1cIlxyXG4gICAgICAgICAgICAgIGxhYmVsPVwie3sgaXRlbS5sYWJlbCB9fVwiXHJcbiAgICAgICAgICAgID48L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIGNoZWNrYm94ICBtdWx0aXBsZSAtLT5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgaWQ9XCJ7eyBpdGVtLmlkIH19XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdjaGVjay1ib3gtbXVsdGknXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGdhcC0zXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgIGZvcm1BcnJheU5hbWU9XCJ7eyBpdGVtLmZvcm1Db250cm9sIH19XCJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbGlzdCBvZiBpdGVtLm9wdGlvbnM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJpXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1jaGVja2JveFxyXG4gICAgICAgICAgICAgICAgICBpZD1cInt7IGl0ZW0uaWQgfX1cIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgJ25nLWludmFsaWQgbmctZGlydHknOlxyXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVGb3JtICYmIGNvbnRyb2wuY29udHJvbHNbaXRlbS5mb3JtQ29udHJvbF0uZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2UoaXRlbS5vbkNoYW5nZSlcIlxyXG4gICAgICAgICAgICAgICAgICBiaW5hcnk9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgbGlzdC5jb2RlIH19XCJcclxuICAgICAgICAgICAgICAgICAgbGFiZWw9XCJ7eyBsaXN0LmRlc2NyaXB0aW9uIH19XCJcclxuICAgICAgICAgICAgICAgID48L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBidXR0b24gLS0+XHJcbiAgICAgICAgICA8cC1idXR0b25cclxuICAgICAgICAgICAgaWQ9XCJ7eyBpdGVtLmlkIH19XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2J1dHRvbidcIlxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwie3sgaXRlbS5idXR0b25DbGFzcyB9fSB3LWZ1bGwgbXQtM1wiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJpdGVtLm9uQ0xpY2soKVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgaWNvbj1cInt7IGl0ZW0uaWNvbkJ1dHRvbiB9fVwiXHJcbiAgICAgICAgICAgIGxhYmVsPVwie3sgaXRlbS5sYWJlbCB9fVwiXHJcbiAgICAgICAgICA+PC9wLWJ1dHRvbj5cclxuXHJcbiAgICAgICAgICA8IS0tIGNhbiAgLS0+XHJcbiAgICAgICAgICA8ZGl2IGlkPVwie3sgaXRlbS5pZCB9fVwiIGNsYXNzPVwiYXJlYVwiICpuZ0lmPVwiaXRlbS50eXBlID09ICdjYW4nXCI+XHJcbiAgICAgICAgICAgIDx2aWRlbyBhdXRvcGxheT1cInRydWVcIiBpZD1cIndlYkNhbWVyYVwiPjwvdmlkZW8+XHJcblxyXG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImJhc2VfaW1nXCIgbmFtZT1cImJhc2VfaW1nXCIgLz5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25jbGljaz1cInRha2VTbmFwU2hvdCgpXCI+XHJcbiAgICAgICAgICAgICAgVGlyYXIgZm90byBlIHNhbHZhclxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgIDxpbWcgaWQ9XCJpbWFnZW1Db252ZXJ0aWRhXCIgLz5cclxuICAgICAgICAgICAgPHAgaWQ9XCJjYW1pbmhvSW1hZ2VtXCIgY2xhc3M9XCJjYW1pbmhvLWltYWdlbVwiPlxyXG4gICAgICAgICAgICAgIDxhIGhyZWY9XCJcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lclwiPjwvYT5cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8c2NyaXB0IHNyYz1cInNjcmlwdC5qc1wiPjwvc2NyaXB0PlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSB1cGxvYWQgZmlsZXMgLS0+XHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGlkPVwie3sgaXRlbS5pZCB9fVwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAndXBsb2FkLWZpbGVzJyAmJiAhaXRlbS5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZHJhZy1pbWFnZVwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJdPVwiXHJcbiAgICAgICAgICAgICAgdmFsaWRhdGVGb3JtICYmIGNvbnRyb2wuY29udHJvbHNbaXRlbS5mb3JtQ29udHJvbF0uZXJyb3JzXHJcbiAgICAgICAgICAgICAgICA/ICcgMXB4IGRhc2hlZCAjZjE4MjgyJ1xyXG4gICAgICAgICAgICAgICAgOiAnIDFweCBkYXNoZWQgI2QxZDVkYidcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGkgKm5nSWY9XCJmaWxlc1ZpZXcubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJwaSBwaS1jbG91ZC11cGxvYWRcIj48L2k+XHJcbiAgICAgICAgICAgIDxwICpuZ0lmPVwiZmlsZXNWaWV3Lmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgICAgIENsaXF1ZSBvdSBhcnJhc3RlIGUgc29sdGUgdW0gYXJxdWl2byBwYXJhIGFuZXhhclxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmlsZXNWaWV3Lmxlbmd0aCA9PT0gMFwiPnt7XHJcbiAgICAgICAgICAgICAgaXRlbS5tc2dBY2NlcHRGaWxlc1xyXG4gICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgaWQ9XCJmaWxlSW5wdXRcIlxyXG4gICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcclxuICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiaXRlbS5tdWx0aWxlRmlsZVwiXHJcbiAgICAgICAgICAgICAgW2FjY2VwdF09XCJpdGVtLmFjY2VwdEZpbGVzXCJcclxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIlxyXG4gICAgICAgICAgICAgICAgb25TZWxlY3RGaWxlKGl0ZW0uZm9ybUNvbnRyb2wsICRldmVudCwgaXRlbS5tdWx0aWxlRmlsZSlcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmIG9mIGZpbGVzVmlld1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmLnR5cGUgJiYgZi50eXBlLmluY2x1ZGVzKCdpbWFnZScpXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwcmV2aWV3LWltZ1wiPlxyXG4gICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiIWYuY29udGVudFwiIHNyYz1cInt7IGdldFVybChmKSB9fVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJmLmNvbnRlbnRcIiBzcmM9XCJ7eyBmLmNvbnRlbnQgfX1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0udmlld05hbWVGaWxlXCI+e3sgZi5uYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cIml0ZW0ubXVsdGlsZUZpbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthY2NlcHRdPVwiaXRlbS5hY2NlcHRGaWxlc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0RmlsZShpdGVtLmZvcm1Db250cm9sLCAkZXZlbnQsIGl0ZW0ubXVsdGlsZUZpbGUpXHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBpIHBpLXRpbWVzIHJlbW92ZS1maWxlIGFic29sdXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblJlbW92ZShpdGVtLmZvcm1Db250cm9sLCBmKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvaVxyXG4gICAgICAgICAgICAgICAgICA+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImYudHlwZSAmJiAhZi50eXBlLmluY2x1ZGVzKCdpbWFnZScpXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJwcmV2aWV3LWltZyBoLTAgbWF4LXctMCBtaC03NSBtLTBcIj5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibXItM1wiPnt7IGYubmFtZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiaXRlbS5tdWx0aWxlRmlsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FjY2VwdF09XCJpdGVtLmFjY2VwdEZpbGVzXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3RGaWxlKGl0ZW0uZm9ybUNvbnRyb2wsICRldmVudCwgaXRlbS5tdWx0aWxlRmlsZSlcclxuICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGkgcGktdGltZXMgcmVtb3ZlLWZpbGUgYWJzb2x1dGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVtb3ZlKGYpXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9pXHJcbiAgICAgICAgICAgICAgICAgID48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIHVwbG9hZCBmaWxlcyBkaXNhYmxlZCAtLT5cclxuICAgICAgICAgIDwhLS0gPHAtZmlsZVVwbG9hZCBtb2RlPVwiYmFzaWNcIiBmb3JtQ29udHJvbE5hbWU9XCJ7e2l0ZW0uZm9ybUNvbnRyb2x9fVwiIGNob29zZUxhYmVsPVwiQ2hvb3NlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hvb3NlSWNvbj1cInBpIHBpLXVwbG9hZFwiIGFjY2VwdD1cImltYWdlLypcIiBtYXhGaWxlU2l6ZT1cIjEwMDAwMDBcIiAvPiAtLT5cclxuXHJcbiAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgIGlkPVwie3sgaXRlbS5pZCB9fVwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAndXBsb2FkLWZpbGVzJyAmJiBpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHAtYnV0dG9uXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wLnRvZ2dsZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICBpY29uPVwicGkgcGktcGFwZXJjbGlwXCJcclxuICAgICAgICAgICAgICBsYWJlbD1cIkFycXVpdm9zIGFuZXhhZG9zXCJcclxuICAgICAgICAgICAgPjwvcC1idXR0b24+XHJcblxyXG4gICAgICAgICAgICA8cC1vdmVybGF5UGFuZWxcclxuICAgICAgICAgICAgICAjb3BcclxuICAgICAgICAgICAgICBbc3R5bGVdPVwieyB3aWR0aDogJzQ1MHB4JyB9XCJcclxuICAgICAgICAgICAgICBbc2hvd0Nsb3NlSWNvbl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8cC10YWJsZVxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImZpbGVzLmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZmlsZXNcIlxyXG4gICAgICAgICAgICAgICAgICBzZWxlY3Rpb25Nb2RlPVwic2luZ2xlXCJcclxuICAgICAgICAgICAgICAgICAgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGVkUHJvZHVjdFwiXHJcbiAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdCk9XCJvblJvd1NlbGVjdCgkZXZlbnQsIG9wKVwiXHJcbiAgICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVMYXlvdXQ9XCJzY3JvbGxcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoIHBTb3J0YWJsZUNvbHVtbj1cIm5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgTm9tZTxwLXNvcnRJY29uIGZpZWxkPVwibmFtZVwiPjwvcC1zb3J0SWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1yb3dEYXRhIGxldC1maWxlPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdJZj1cIml0ZW0udmlld05hbWVGaWxlXCI+e3sgZmlsZS5uYW1lIH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLm9uQ0xpY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1kb3dubG9hZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIml0ZW0ub25DTGljayhmaWxlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3AtYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLXRhYmxlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbGVzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwicC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWw+TmVuaHVtIGFycXVpdm8gYW5leGFkbzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBsaXN0IC0tPlxyXG4gICAgICAgICAgPHVsIGlkPVwie3sgaXRlbS5pZCB9fVwiICpuZ0lmPVwiaXRlbS50eXBlID09PSAnbGlzdCcgJiYgaXRlbS5vcHRpb25zXCI+XHJcbiAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgbGlzdCBvZiBpdGVtLm9wdGlvbnNcIj57eyBsaXN0LmRlc2NyaXB0aW9uIH19PC9saT5cclxuICAgICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgICAgPCEtLSBtdWx0aSAtLT5cclxuICAgICAgICAgIDxwLW11bHRpU2VsZWN0XHJcbiAgICAgICAgICAgIGlkPVwie3sgaXRlbS5pZCB9fVwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAnbmctaW52YWxpZCBuZy1kaXJ0eSc6XHJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwie3sgaXRlbS5wbGFjZWhvbGRlciB9fVwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnbXVsdGknXCJcclxuICAgICAgICAgICAgW29wdGlvbnNdPVwiaXRlbS5vcHRpb25zXCJcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgaXRlbS5mb3JtQ29udHJvbCB9fVwiXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLTAgdy1mdWxsXCJcclxuICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJkZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkNoYW5nZShpdGVtLm9uQ2hhbmdlKVwiXHJcbiAgICAgICAgICAgIG1heFNlbGVjdGVkTGFiZWxzPVwiMTAwXCJcclxuICAgICAgICAgID48L3AtbXVsdGlTZWxlY3Q+XHJcblxyXG4gICAgICAgICAgPCEtLSByYWRpb0J1dHRvbiAtLT5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgaWQ9XCJ7eyBpdGVtLmlkIH19XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdyYWRpby1idXR0b24nXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGdhcC0zXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsaXN0UmFkaW9CdXR0b24gb2YgaXRlbS5vcHRpb25zXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxwLXJhZGlvQnV0dG9uXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICduZy1pbnZhbGlkIG5nLWRpcnR5JzpcclxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS5lcnJvcnNcclxuICAgICAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImxpc3RSYWRpb0J1dHRvbi5jb2RlXCJcclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGl0ZW0uZm9ybUNvbnRyb2wgfX1cIlxyXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwib25DaGFuZ2UoaXRlbS5vbkNoYW5nZSlcIlxyXG4gICAgICAgICAgICAgID48L3AtcmFkaW9CdXR0b24+XHJcbiAgICAgICAgICAgICAgPGxhYmVsPnt7IGxpc3RSYWRpb0J1dHRvbi5kZXNjcmlwdGlvbiB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICBAaWYoY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXS52YWx1ZSA9PSAnb3RoZXInKXtcclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ7eyBpdGVtLmZvcm1Db250cm9sT3RoZXIgfX1cIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8IS0tIHNlbGVjdEJ1dHRvbiAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIiAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ3NlbGVjdC1idXR0b24nXCI+XHJcbiAgICAgICAgICAgIDxwLXNlbGVjdEJ1dHRvblxyXG4gICAgICAgICAgICAgIGlkPVwie3sgaXRlbS5pZCB9fVwiXHJcbiAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlKGl0ZW0ub25DaGFuZ2UpXCJcclxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJpdGVtLm9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGl0ZW0uZm9ybUNvbnRyb2wgfX1cIlxyXG4gICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwiY29kZVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWl0ZW0+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLmRlc2NyaXB0aW9uIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvcC1zZWxlY3RCdXR0b24+XHJcbiAgICAgICAgICAgIDwhLS0gPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcElucHV0VGV4dCBbYXR0ci5kaXNhYmxlZF09XCJpdGVtLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPXt7aXRlbS5mb3JtQ29udHJvbFNlY29uZGFyeX19PiAtLT5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gdGFibGUgLS0+XHJcbiAgICAgICAgICA8cC10YWJsZVxyXG4gICAgICAgICAgICBpZD1cInt7IGl0ZW0uaWQgfX1cIlxyXG4gICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ3RhYmxlJ1wiXHJcbiAgICAgICAgICAgIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgICAgICBzY3JvbGxIZWlnaHQ9XCJ7eyBpdGVtLnNjcm9sbEhlaWdodCB9fVwiXHJcbiAgICAgICAgICAgIFtjb2x1bW5zXT1cIml0ZW0uY29sc1RhYmxlXCJcclxuICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtZGF0YXRhYmxlLXN0cmlwZWQgcC1kYXRhdGFibGUtc21cIlxyXG4gICAgICAgICAgICBbdmFsdWVdPVwiaXRlbS5yb3dzVGFibGVcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCIgbGV0LWNvbHVtbnM+XHJcbiAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbC5maWxlZCAhPT0gJ2FjdGlvbidcIj57eyBjb2wuaGVhZGVyIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbC5maWxlZCA9PT0gJ2FjdGlvbidcIj5Bw6fDo288L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LXJvd0RhdGEgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLmZpZWxkICE9PSAnYnV0dG9uJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHJvd0RhdGFbY29sLmZpZWxkXSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5maWVsZCA9PT0gJ2FjdGlvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgaXRlbS5idXR0b25zVGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInt7IGFjdGlvbi5zdHlsZUNsYXNzIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwie3sgYWN0aW9uLmxhYmVsIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb24ub25DTGljayhyb3dEYXRhKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBpY29uPVwie3sgYWN0aW9uLmljb24gfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgID48L3AtYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiIGxldC1jb2x1bW5zPlxyXG4gICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgZm9vdGVyIG9mIGl0ZW0ucm93c0Zvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49XCIxMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtbm9ybWFsXCI+e3sgZm9vdGVyLnRleHQgfX06PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICB7eyBmb290ZXIudmFsdWUgfX1cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvcC10YWJsZT5cclxuXHJcbiAgICAgICAgICA8IS0tIGlucHV0U3dpdGNoIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiICpuZ0lmPVwiaXRlbS50eXBlID09PSAnc3dpdGNoJ1wiPlxyXG4gICAgICAgICAgICA8cC1pbnB1dFN3aXRjaFxyXG4gICAgICAgICAgICAgIGlkPVwie3sgaXRlbS5pZCB9fVwiXHJcbiAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwie3sgaXRlbS5mb3JtQ29udHJvbCB9fVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtci0xMFwiXHJcbiAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlKGl0ZW0ub25DaGFuZ2UpXCJcclxuICAgICAgICAgICAgPjwvcC1pbnB1dFN3aXRjaD5cclxuICAgICAgICAgICAgPHAgdHJhbnNsYXRlPVwie3sgaXRlbS5sYWJlbCB9fVwiPjwvcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwhLS0gcGFzc3dvcmQgLS0+XHJcbiAgICAgICAgICA8cC1wYXNzd29yZFxyXG4gICAgICAgICAgICBpZD1cInt7IGl0ZW0uaWQgfX1cIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgJ25nLWludmFsaWQgbmctZGlydHknOlxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVGb3JtICYmIGNvbnRyb2wuY29udHJvbHNbaXRlbS5mb3JtQ29udHJvbF0uZXJyb3JzXHJcbiAgICAgICAgICAgIH1cIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7IGl0ZW0ucGxhY2Vob2xkZXIgfX1cIlxyXG4gICAgICAgICAgICAqbmdJZj1cIml0ZW0udHlwZSA9PT0gJ3Bhc3N3b3JkJ1wiXHJcbiAgICAgICAgICAgIFtmZWVkYmFja109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInt7IGl0ZW0uZm9ybUNvbnRyb2wgfX1cIlxyXG4gICAgICAgICAgICAob25DaGFuZ2UpPVwib25DaGFuZ2UoaXRlbS5vbkNoYW5nZSlcIlxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwidy1mdWxsXCJcclxuICAgICAgICAgICAgW3RvZ2dsZU1hc2tdPVwidHJ1ZVwiXHJcbiAgICAgICAgICA+PC9wLXBhc3N3b3JkPlxyXG5cclxuICAgICAgICAgIDwhLS0gcGhvdG8gIC0tPlxyXG4gICAgICAgICAgPGRpdiBpZD1cInt7IGl0ZW0uaWQgfX1cIiBjbGFzcz1cImNhbWVyYVwiICpuZ0lmPVwiaXRlbS50eXBlID09PSAncGhvdG8nXCI+XHJcbiAgICAgICAgICAgIDx2aWRlbyBpZD1cInZpZGVvXCIgY2xhc3M9XCJmb3RvXCIgYXV0b3BsYXk+XHJcbiAgICAgICAgICAgICAgVsOtZGVvIG7Do28gZGlzcG9uw612ZWwuXHJcbiAgICAgICAgICAgIDwvdmlkZW8+XHJcbiAgICAgICAgICAgIDxjYW52YXMgaWQ9XCJjYW52YXNcIiBjbGFzcz1cImZvdG9cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj48L2NhbnZhcz5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHBCdXR0b25cclxuICAgICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicmVtb3ZlLWZpbGVcIlxyXG4gICAgICAgICAgICAgIGlkPVwiaWNvbi1yZW1vdmVcIlxyXG4gICAgICAgICAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIHN0eWxlPVwidmlzaWJpbGl0eTogY29sbGFwc2VcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVQaG90bygpXCJcclxuICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgcEJ1dHRvblxyXG4gICAgICAgICAgICAgIGljb249XCJwaSBwaS1jYW1lcmFcIlxyXG4gICAgICAgICAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJjYXB0dXJlUGhvdG8oaXRlbS5mb3JtQ29udHJvbClcIlxyXG4gICAgICAgICAgICAgIGlkPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgPjwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPCEtLSBsaWtlcnQgIC0tPlxyXG4gICAgICAgICAgPHAtdGFibGVcclxuICAgICAgICAgICAgaWQ9XCJ7eyBpdGVtLmlkIH19XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT09ICdsaWtlcnQnXCJcclxuICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIHNjcm9sbEhlaWdodD1cInt7IGl0ZW0uc2Nyb2xsSGVpZ2h0IH19XCJcclxuICAgICAgICAgICAgW2NvbHVtbnNdPVwiaXRlbS5jb2xzVGFibGVcIlxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc3RyaXBlZCBwLWRhdGF0YWJsZS1zbVwiXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtLnJvd3NUYWJsZVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNHJlbVwiPjwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvbC5oZWFkZXIgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgIHBUZW1wbGF0ZT1cImJvZHlcIlxyXG4gICAgICAgICAgICAgIGxldC1yb3dcclxuICAgICAgICAgICAgICBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiXHJcbiAgICAgICAgICAgICAgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCJcclxuICAgICAgICAgICAgICBmb3JtQXJyYXlOYW1lPVwie3sgaXRlbS5mb3JtQ29udHJvbCB9fVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgIHt7IHJvdyB9fVxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbnRyb2wgb2YgY29sdW1uczsgdHJhY2sgaXRlbTsgbGV0IGluZGV4ID0gJGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICA8dGQgW2Zvcm1Hcm91cE5hbWVdPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPHAtcmFkaW9CdXR0b25cclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInt7IGNvbHVtbnNbaW5kZXhdLmZpZWxkIH19K3t7IHJvdyB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicXVlc3Rpb257eyByb3dJbmRleCB9fVwiXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3AtdGFibGU+XHJcblxyXG4gICAgICAgICAgPCEtLSBlZGl0YWJsZSB0YWJsZSAtLT5cclxuICAgICAgICAgIDxwLXRhYmxlXHJcbiAgICAgICAgICAgIGlkPVwie3sgaXRlbS5pZCB9fVwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09PSAnZWRpdGFibGUtdGFibGUnXCJcclxuICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIHNjcm9sbEhlaWdodD1cInt7IGl0ZW0uc2Nyb2xsSGVpZ2h0IH19XCJcclxuICAgICAgICAgICAgW2NvbHVtbnNdPVwiaXRlbS5jb2xzVGFibGVcIlxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc3RyaXBlZCBwLWRhdGF0YWJsZS1zbVwiXHJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJpdGVtLnJvd3NUYWJsZVwiXHJcbiAgICAgICAgICAgIGVkaXRNb2RlPVwiY2VsbFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwhLS0gQ2FiZcOnYWxobyBkYSB0YWJlbGEgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIiBsZXQtY29sdW1ucz5cclxuICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ3aWR0aDogNHJlbVwiPjwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGNvbC5oZWFkZXIgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIENvcnBvIGRhIHRhYmVsYSAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgcFRlbXBsYXRlPVwiYm9keVwiXHJcbiAgICAgICAgICAgICAgbGV0LXJvd1xyXG4gICAgICAgICAgICAgIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCJcclxuICAgICAgICAgICAgICBsZXQtY29sdW1ucz1cImNvbHVtbnNcIlxyXG4gICAgICAgICAgICAgIGZvcm1BcnJheU5hbWU9XCJ7eyBpdGVtLmZvcm1Db250cm9sIH19XCJcclxuICAgICAgICAgICAgICBsZXQtZWRpdGluZz1cImVkaXRpbmdcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgPHRkPnt7IHJvdyB9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICBAZm9yIChjb250cm9sIG9mIGNvbHVtbnM7IHRyYWNrIGl0ZW07IGxldCBpbmRleCA9ICRpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cInJvd0luZGV4XCJcclxuICAgICAgICAgICAgICAgICAgW3BFZGl0YWJsZUNvbHVtbl09XCJyb3dcIlxyXG4gICAgICAgICAgICAgICAgICBwRWRpdGFibGVDb2x1bW5GaWVsZD1cInJvd1wiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxwLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIl97eyBjb250cm9sLmZpZWxkIH19cXVlc3Rpb257e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwib3V0cHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIl97eyBjb250cm9sLmZpZWxkIH19cXVlc3Rpb257e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luZGV4XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9wLWNlbGxFZGl0b3I+XHJcbiAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3AtdGFibGU+XHJcblxyXG4gICAgICAgICAgPCEtLSB2YWxpZGHDp8OjbyBkZSBpdGVtIC0tPlxyXG4gICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPHNtYWxsXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJkYW5nZXItdGV4dFwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJ2YWxpZGF0ZUZvcm0gJiYgY29udHJvbC5jb250cm9sc1tpdGVtLmZvcm1Db250cm9sXSAmJiBjb250cm9sLmNvbnRyb2xzW2l0ZW0uZm9ybUNvbnRyb2xdLmVycm9ycz8uWydyZXF1aXJlZCddXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIENhbXBvIG9icmlnYXTDs3Jpb1xyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8c21hbGxcclxuICAgICAgICAgICAgICBjbGFzcz1cImRhbmdlci10ZXh0XCJcclxuICAgICAgICAgICAgICAqbmdJZj1cInZhbGlkYXRlRm9ybSAmJiBjb250cm9sLmNvbnRyb2xzW2l0ZW0uZm9ybUNvbnRyb2xdICYmIGNvbnRyb2wuY29udHJvbHNbaXRlbS5mb3JtQ29udHJvbF0uZXJyb3JzPy5bJ2VtYWlsJ11cIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgRW1haWwgaW52w6FsaWRvXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8cC1kaXZpZGVyXHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgIChidXR0b25zU3RhbmRhcmQgJiYgYnV0dG9uc1N0YW5kYXJkLmxlbmd0aCA+IDApIHx8XHJcbiAgICAgICAgICAoYnV0dG9uc09wdGlvbmFsICYmIGJ1dHRvbnNPcHRpb25hbC5sZW5ndGggPiAwKVxyXG4gICAgICAgIFwiXHJcbiAgICAgID48L3AtZGl2aWRlcj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zLWZvcm1cIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBidXR0b24gb2YgYnV0dG9uc1N0YW5kYXJkXCI+XHJcbiAgICAgICAgICA8cC1idXR0b25cclxuICAgICAgICAgICAgKm5nSWY9XCJidXR0b24udHlwZSA9PT0gJ2NsZWFuJ1wiXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi13YXJuaW5nIHt7IGJ1dHRvbi5zdHlsZUNsYXNzIH19XCJcclxuICAgICAgICAgICAgbGFiZWw9XCJMaW1wYXJcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiYnV0dG9uLm9uQ0xpY2soKVwiXHJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiXHJcbiAgICAgICAgICA+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgIDxwLWJ1dHRvblxyXG4gICAgICAgICAgICAqbmdJZj1cImJ1dHRvbi50eXBlID09PSAnZmlsdGVyJ1wiXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJ7eyBidXR0b24uc3R5bGVDbGFzcyB9fVwiXHJcbiAgICAgICAgICAgIGxhYmVsPVwiRmlsdHJhclwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJidXR0b24ub25DTGljaygpXCJcclxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLXNlYXJjaFwiXHJcbiAgICAgICAgICA+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgIDxwLWJ1dHRvblxyXG4gICAgICAgICAgICAqbmdJZj1cImJ1dHRvbi50eXBlID09PSAnc2F2ZSdcIlxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tc3VjY2VzcyB7eyBidXR0b24uc3R5bGVDbGFzcyB9fVwiXHJcbiAgICAgICAgICAgIGxhYmVsPVwiU2FsdmFyXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImJ1dHRvbi5vbkNMaWNrKClcIlxyXG4gICAgICAgICAgICBpY29uPVwicGkgcGktc2F2ZVwiXHJcbiAgICAgICAgICA+PC9wLWJ1dHRvbj5cclxuICAgICAgICAgIDxwLWJ1dHRvblxyXG4gICAgICAgICAgICAqbmdJZj1cImJ1dHRvbi50eXBlID09PSAnY2FuY2VsJ1wiXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1kYW5nZXIge3sgYnV0dG9uLnN0eWxlQ2xhc3MgfX1cIlxyXG4gICAgICAgICAgICBsYWJlbD1cIkNhbmNlbGFyXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImJ1dHRvbi5vbkNMaWNrKClcIlxyXG4gICAgICAgICAgICBpY29uPVwicGkgcGktdGltZXNcIlxyXG4gICAgICAgICAgPjwvcC1idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGJ1dHRvbnNPcHRpb25hbFwiPlxyXG4gICAgICAgICAgPHAtYnV0dG9uXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJ7eyBidXR0b24uc3R5bGVDbGFzcyB9fVwiXHJcbiAgICAgICAgICAgIGxhYmVsPVwie3sgYnV0dG9uLmxhYmVsIH19XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImJ1dHRvbi5vbkNMaWNrKClcIlxyXG4gICAgICAgICAgICBpY29uPVwie3sgYnV0dG9uLmljb24gfX1cIlxyXG4gICAgICAgICAgPjwvcC1idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9mb3JtPlxyXG48L2Rpdj5cclxuIl19
|