@wertzui/ngx-restworld-client 4.1.3 → 4.2.2

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.
@@ -135,10 +135,10 @@ export class RestworldEditFormComponent {
135
135
  }
136
136
  }
137
137
  RestworldEditFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RestworldEditFormComponent, deps: [{ token: i1.FormService }, { token: i0.ChangeDetectorRef }, { token: i2.MessageService }, { token: i3.RESTworldClientCollection }], target: i0.ɵɵFactoryTarget.Component });
138
- RestworldEditFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: RestworldEditFormComponent, selector: "rw-form", inputs: { formGroup: "formGroup", template: "template", apiName: "apiName" }, queries: [{ propertyName: "inputOptionsSingleRef", first: true, predicate: ["inputOptionsSingle"], descendants: true }, { propertyName: "inputOptionsMultipleRef", first: true, predicate: ["inputOptionsMultiple"], descendants: true }, { propertyName: "inputOptionsRef", first: true, predicate: ["inputOptions"], descendants: true }, { propertyName: "inputHiddenRef", first: true, predicate: ["inputHidden"], descendants: true }, { propertyName: "inputTextRef", first: true, predicate: ["inputText"], descendants: true }, { propertyName: "inputTextareaRef", first: true, predicate: ["inputTextarea"], descendants: true }, { propertyName: "inputSearchRef", first: true, predicate: ["inputSearch"], descendants: true }, { propertyName: "inputTelRef", first: true, predicate: ["inputTel"], descendants: true }, { propertyName: "inputUrlRef", first: true, predicate: ["inputUrl"], descendants: true }, { propertyName: "inputEmailRef", first: true, predicate: ["inputEmail"], descendants: true }, { propertyName: "inputPasswordRef", first: true, predicate: ["inputPassword"], descendants: true }, { propertyName: "inputDateRef", first: true, predicate: ["inputDate"], descendants: true }, { propertyName: "inputMonthRef", first: true, predicate: ["inputMonth"], descendants: true }, { propertyName: "inputWeekRef", first: true, predicate: ["inputWeek"], descendants: true }, { propertyName: "inputTimeRef", first: true, predicate: ["inputTime"], descendants: true }, { propertyName: "inputDatetimeLocalRef", first: true, predicate: ["inputDatetimeLocal"], descendants: true }, { propertyName: "inputNumberRef", first: true, predicate: ["inputNumber"], descendants: true }, { propertyName: "inputRangeRef", first: true, predicate: ["inputRange"], descendants: true }, { propertyName: "inputColorRef", first: true, predicate: ["inputColor"], descendants: true }, { propertyName: "inputBoolRef", first: true, predicate: ["inputBool"], descendants: true }, { propertyName: "inputDatetimeOffsetRef", first: true, predicate: ["inputDatetimeOffset"], descendants: true }, { propertyName: "inputDurationRef", first: true, predicate: ["inputDuration"], descendants: true }, { propertyName: "inputImageRef", first: true, predicate: ["inputImage"], descendants: true }, { propertyName: "inputFileRef", first: true, predicate: ["inputFile"], descendants: true }, { propertyName: "inputObjectRef", first: true, predicate: ["inputObject"], descendants: true }, { propertyName: "inputCollectionRef", first: true, predicate: ["inputCollection"], descendants: true }, { propertyName: "inputDefaultRef", first: true, predicate: ["inputDefault"], descendants: true }], ngImport: i0, template: "<div *ngFor=\"let property of template.properties\" class=\"grid field\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"property.type !== PropertyType.Hidden\" [attr.for]=\"property.name\" class=\"col-12 mb-2 md:col-2 md:mb-0\" [class.p-disabled]=\"property.readOnly\" [class.hasChildren]=\"property._templates\">{{property.prompt || property.name}}</label>\r\n <div class=\"col-12 md:col-10\">\r\n\r\n <ng-template #defaultInputOptions let-property=\"property\" let-template=\"template\">\r\n\r\n <ng-template #defaultInputOptionsSingle let-property=\"property\" let-template=\"template\">\r\n <p-dropdown [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [filterBy]=\"(property.options.promptField || 'prompt') + ',' + (property.options.valueField || 'value')\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [required]=\"property.required || property.options.minItems > 0\" [filter]=\"true\" [autoDisplayFirst]=\"false\" [showClear]=\"!property.required || property.options.minItems <= 0\" (onFilter)=\"onOptionsFiltered(property, $event)\" styleClass=\"w-full\" [filterPlaceholder]=\"property?.options?.link?.href ? 'search for more results' : ''\">\r\n <ng-template let-item pTemplate=\"selectedItem\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n <ng-template let-item pTemplate=\"item\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n </p-dropdown>\r\n </ng-template>\r\n <ng-container *ngIf=\"!property.options.maxItems || property.options.maxItems == 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsSingleRef || defaultInputOptionsSingle; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputOptionsMultiple let-property=\"property\" let-template=\"template\">\r\n <p-multiSelect [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [optionLabel]=\"property.options.promptField || 'prompt'\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [selectionLimit]=\"property.options.maxItems\" [required]=\"property.required || property.options.minItems > 0\"></p-multiSelect>\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options.maxItems > 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsMultipleRef || defaultInputOptionsMultiple; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsRef || defaultInputOptions; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!property.options\">\r\n <div [ngSwitch]=\"property.type\">\r\n\r\n <ng-template #defaultInputHidden let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"hidden\" [value]=\"property.value\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Hidden\">\r\n <ng-container *ngTemplateOutlet=\"inputHiddenRef || defaultInputHidden; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputText let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\r\n <ng-container *ngTemplateOutlet=\"inputTextRef || defaultInputText; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTextarea let-property=\"property\" let-template=\"template\">\r\n <textarea [formControlName]=\"property.name\" [id]=\"property.name\" pInputTextarea class=\"w-full p-inputtextarea p-inputtext p-component p-element\" [class.p-disabled]=\"property.readOnly\" [cols]=\"property.cols\" [rows]=\"property.rows\"></textarea>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Textarea\">\r\n <ng-container *ngTemplateOutlet=\"inputTextareaRef || defaultInputTextarea; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputSearch let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"search\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Search\">\r\n <ng-container *ngTemplateOutlet=\"inputSearchRef || defaultInputSearch; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTel let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"tel\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Tel\">\r\n <ng-container *ngTemplateOutlet=\"inputTelRef || defaultInputTel; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputUrl let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"url\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Url\">\r\n <ng-container *ngTemplateOutlet=\"inputUrlRef || defaultInputUrl; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputEmail let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"email\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Email\">\r\n <ng-container *ngTemplateOutlet=\"inputEmailRef || defaultInputEmail; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputPassword let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"password\" pPassword class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Password\">\r\n <ng-container *ngTemplateOutlet=\"inputPasswordRef || defaultInputPassword; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDate let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"true\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Date\">\r\n <ng-container *ngTemplateOutlet=\"inputDateRef || defaultInputDate; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputMonth let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"false\" view=\"month\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Month\">\r\n <ng-container *ngTemplateOutlet=\"inputMonthRef || defaultInputMonth; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputWeek let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"week\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Week\">\r\n <ng-container *ngTemplateOutlet=\"inputWeekRef || defaultInputWeek; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTime let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Time\">\r\n <ng-container *ngTemplateOutlet=\"inputTimeRef || defaultInputTime; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeLocal let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeLocal\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeLocalRef || defaultInputDatetimeLocal; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputNumber let-property=\"property\" let-template=\"template\">\r\n <p-inputNumber [formControlName]=\"property.name\" [id]=\"property.name\" mode=\"decimal\" [showButtons]=\"!property.readOnly\" class=\"w-full\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-inputNumber>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Number\">\r\n <ng-container *ngTemplateOutlet=\"inputNumberRef || defaultInputNumber; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputRange let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"range\" [min]=\"property.min\" [max]=\"property.max\" [step]=\"property.step\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Range\">\r\n <ng-container *ngTemplateOutlet=\"inputRangeRef || defaultInputRange; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputColor let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"color\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Color\">\r\n <ng-container *ngTemplateOutlet=\"inputColorRef || defaultInputColor; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputBool let-property=\"property\" let-template=\"template\" let-formGroup=\"formGroup\">\r\n <p-checkbox *ngIf=\"property.required\" [binary]=\"true\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-checkbox>\r\n <p-triStateCheckbox *ngIf=\"!property.required\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-triStateCheckbox>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Bool\">\r\n <ng-container *ngTemplateOutlet=\"inputBoolRef || defaultInputBool; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeOffset let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeOffset\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeOffsetRef || defaultInputDatetimeOffset; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDuration let-property=\"property\" let-template=\"template\">\r\n <p-calendar *ngSwitchCase=\"PropertyType.Duration\" [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Duration\">\r\n <ng-container *ngTemplateOutlet=\"inputDurationRef || defaultInputDuration; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputImage let-property=\"property\" let-template=\"template\">\r\n <rw-image [formControlName]=\"property.name\" [accept]=\"property.placeholder\"></rw-image>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Image\">\r\n <ng-container *ngTemplateOutlet=\"inputImageRef || defaultInputImage; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputFile let-property=\"property\" let-template=\"template\">\r\n <rw-file [formControlName]=\"property.name\" [fileName]=\"property.name\" [accept]=\"property.placeholder\"></rw-file>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.File\">\r\n <ng-container *ngTemplateOutlet=\"inputFileRef || defaultInputFile; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputObject let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\">\r\n <rw-form [formGroup]=\"(formGroup.controls[property.name] | as : FormGroup)\" [template]=\"property._templates.default\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Object\">\r\n <ng-container *ngTemplateOutlet=\"inputObjectRef || defaultInputObject; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputCollection let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\" cdkDropList [cdkDropListData]=\"{ property: property, formArray: (formGroup.controls[property.name] | as : FormArray)}\" (cdkDropListDropped)=\"collectionItemDropped($event)\">\r\n <div *ngFor=\"let template of getCollectionEntryTemplates(property)\" class=\"flex align-items-center\" cdkDrag>\r\n <i class=\"fas fa-grip-lines\" cdkDragHandle></i>\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full flex justify-content-end\">\r\n <rw-form [formGroup]=\"((formGroup.controls[property.name] | as : FormArray).controls[Number.parseInt(template.title!)] | as : FormGroup)\" [template]=\"template\" [apiName]=\"apiName\" class=\"w-full\"></rw-form>\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-trash\" class=\"p-button-outlined p-button-danger ml-2 mb-3\" (click)=\"deleteItemFromCollection(property, formGroup.controls[property.name], template)\"></button>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end w-full\">\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-plus\" class=\"p-button-outlined p-button-info\" (click)=\"addNewItemToCollection(property, formGroup.controls[property.name])\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Collection\">\r\n <ng-container *ngTemplateOutlet=\"inputCollectionRef || defaultInputCollection; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDefault let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"inputDefaultRef || defaultInputDefault; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n <val-errors [controlName]=\"property.name || null\">\r\n <ng-template valError=\"required\">The field '{{property.prompt || property.name}}' is required.</ng-template>\r\n <ng-template valError=\"email\">The email must be a valid email address.</ng-template>\r\n <ng-template valError=\"min\" let-error=\"error\">'{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.min }}.</ng-template>\r\n <ng-template valError=\"max\" let-error=\"error\">'{{property.prompt || property.name}}' must be smaller than or equal to {{ error.max }}.</ng-template>\r\n <ng-template valError=\"minlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"maxlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be shorter than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"pattern\" let-error=\"error\">The value for '{{property.prompt || property.name}}' does not match the pattern {{ error }}.</ng-template>\r\n <ng-template valError=\"remote\" let-error=\"error\">{{ error }}</ng-template>\r\n </val-errors>\r\n </div>\r\n</div>\r\n", styles: [".brace{align-self:stretch;margin:.2rem .5rem;border-left:1px solid rgb(206,212,218);border-top:1px solid rgb(206,212,218);border-bottom:1px solid rgb(206,212,218);width:1rem}.cdk-drag-handle{cursor:move}.cdk-drag-preview{background-color:#ffffffd0;border:2px dashed rgb(206,212,218);cursor:move}.cdk-drag-placeholder{border:2px dashed rgb(206,212,218);margin:-2px}\n"], components: [{ type: i4.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "virtualScroll", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear"] }, { type: i5.MultiSelect, selector: "p-multiSelect", inputs: ["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", "autoZIndex", "baseZIndex", "filterBy", "virtualScroll", "itemSize", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "scrollHeight", "defaultLabel", "placeholder", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onPanelShow", "onPanelHide"] }, { type: i6.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "view", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { type: i7.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "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", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown"] }, { type: i8.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"] }, { type: i9.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { type: i10.RESTWorldImageViewComponent, selector: "rw-image", inputs: ["alt", "accept", "fileName", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "onlyScaleDown", "containWithinAspectRatio", "backgroundColor", "format"] }, { type: i11.RESTWorldFileViewComponent, selector: "rw-file", inputs: ["accept", "fileName"] }, { type: RestworldEditFormComponent, selector: "rw-form", inputs: ["formGroup", "template", "apiName"] }, { type: i12.ValidationErrorsComponent, selector: "val-errors", inputs: ["control", "controlName", "label"] }], directives: [{ type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i14.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i14.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i14.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i15.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i13.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i13.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i16.InputText, selector: "[pInputText]" }, { type: i14.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { type: i14.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i17.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i17.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i17.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { type: i18.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i19.Ripple, selector: "[pRipple]" }, { type: i13.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i12.ValidationErrorDirective, selector: "ng-template[valError]", inputs: ["valError"] }], pipes: { "as": i20.AsPipe } });
138
+ RestworldEditFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: RestworldEditFormComponent, selector: "rw-form", inputs: { formGroup: "formGroup", template: "template", apiName: "apiName" }, queries: [{ propertyName: "inputOptionsSingleRef", first: true, predicate: ["inputOptionsSingle"], descendants: true }, { propertyName: "inputOptionsMultipleRef", first: true, predicate: ["inputOptionsMultiple"], descendants: true }, { propertyName: "inputOptionsRef", first: true, predicate: ["inputOptions"], descendants: true }, { propertyName: "inputHiddenRef", first: true, predicate: ["inputHidden"], descendants: true }, { propertyName: "inputTextRef", first: true, predicate: ["inputText"], descendants: true }, { propertyName: "inputTextareaRef", first: true, predicate: ["inputTextarea"], descendants: true }, { propertyName: "inputSearchRef", first: true, predicate: ["inputSearch"], descendants: true }, { propertyName: "inputTelRef", first: true, predicate: ["inputTel"], descendants: true }, { propertyName: "inputUrlRef", first: true, predicate: ["inputUrl"], descendants: true }, { propertyName: "inputEmailRef", first: true, predicate: ["inputEmail"], descendants: true }, { propertyName: "inputPasswordRef", first: true, predicate: ["inputPassword"], descendants: true }, { propertyName: "inputDateRef", first: true, predicate: ["inputDate"], descendants: true }, { propertyName: "inputMonthRef", first: true, predicate: ["inputMonth"], descendants: true }, { propertyName: "inputWeekRef", first: true, predicate: ["inputWeek"], descendants: true }, { propertyName: "inputTimeRef", first: true, predicate: ["inputTime"], descendants: true }, { propertyName: "inputDatetimeLocalRef", first: true, predicate: ["inputDatetimeLocal"], descendants: true }, { propertyName: "inputNumberRef", first: true, predicate: ["inputNumber"], descendants: true }, { propertyName: "inputRangeRef", first: true, predicate: ["inputRange"], descendants: true }, { propertyName: "inputColorRef", first: true, predicate: ["inputColor"], descendants: true }, { propertyName: "inputBoolRef", first: true, predicate: ["inputBool"], descendants: true }, { propertyName: "inputDatetimeOffsetRef", first: true, predicate: ["inputDatetimeOffset"], descendants: true }, { propertyName: "inputDurationRef", first: true, predicate: ["inputDuration"], descendants: true }, { propertyName: "inputImageRef", first: true, predicate: ["inputImage"], descendants: true }, { propertyName: "inputFileRef", first: true, predicate: ["inputFile"], descendants: true }, { propertyName: "inputObjectRef", first: true, predicate: ["inputObject"], descendants: true }, { propertyName: "inputCollectionRef", first: true, predicate: ["inputCollection"], descendants: true }, { propertyName: "inputDefaultRef", first: true, predicate: ["inputDefault"], descendants: true }], ngImport: i0, template: "<div *ngFor=\"let property of template.properties\" class=\"grid field\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"property.type !== PropertyType.Hidden\" [attr.for]=\"property.name\" class=\"col-12 mb-2 md:col-2 md:mb-0\" [class.p-disabled]=\"property.readOnly\" [class.hasChildren]=\"property._templates\">{{property.prompt || property.name}}</label>\r\n <div class=\"col-12 md:col-10\">\r\n\r\n <ng-template #defaultInputOptions let-property=\"property\" let-template=\"template\">\r\n\r\n <ng-template #defaultInputOptionsSingle let-property=\"property\" let-template=\"template\">\r\n <p-dropdown [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [filterBy]=\"(property.options.promptField || 'prompt') + ',' + (property.options.valueField || 'value')\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [required]=\"property.required || property.options.minItems > 0\" [filter]=\"true\" [autoDisplayFirst]=\"false\" [showClear]=\"!property.required || property.options.minItems <= 0\" (onFilter)=\"onOptionsFiltered(property, $event)\" styleClass=\"w-full\" [filterPlaceholder]=\"property?.options?.link?.href ? 'search for more results' : ''\">\r\n <ng-template let-item pTemplate=\"selectedItem\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n <ng-template let-item pTemplate=\"item\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n </p-dropdown>\r\n </ng-template>\r\n <ng-container *ngIf=\"!property.options.maxItems || property.options.maxItems == 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsSingleRef || defaultInputOptionsSingle; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputOptionsMultiple let-property=\"property\" let-template=\"template\">\r\n <p-multiSelect [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [optionLabel]=\"property.options.promptField || 'prompt'\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [selectionLimit]=\"property.options.maxItems\" [required]=\"property.required || property.options.minItems > 0\"></p-multiSelect>\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options.maxItems > 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsMultipleRef || defaultInputOptionsMultiple; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsRef || defaultInputOptions; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!property.options\">\r\n <div [ngSwitch]=\"property.type\">\r\n\r\n <ng-template #defaultInputHidden let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"hidden\" [value]=\"property.value\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Hidden\">\r\n <ng-container *ngTemplateOutlet=\"inputHiddenRef || defaultInputHidden; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputText let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\r\n <ng-container *ngTemplateOutlet=\"inputTextRef || defaultInputText; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTextarea let-property=\"property\" let-template=\"template\">\r\n <textarea [formControlName]=\"property.name\" [id]=\"property.name\" pInputTextarea class=\"w-full p-inputtextarea p-inputtext p-component p-element\" [class.p-disabled]=\"property.readOnly\" [cols]=\"property.cols\" [rows]=\"property.rows\"></textarea>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Textarea\">\r\n <ng-container *ngTemplateOutlet=\"inputTextareaRef || defaultInputTextarea; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputSearch let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"search\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Search\">\r\n <ng-container *ngTemplateOutlet=\"inputSearchRef || defaultInputSearch; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTel let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"tel\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Tel\">\r\n <ng-container *ngTemplateOutlet=\"inputTelRef || defaultInputTel; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputUrl let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"url\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Url\">\r\n <ng-container *ngTemplateOutlet=\"inputUrlRef || defaultInputUrl; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputEmail let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"email\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Email\">\r\n <ng-container *ngTemplateOutlet=\"inputEmailRef || defaultInputEmail; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputPassword let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"password\" pPassword class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Password\">\r\n <ng-container *ngTemplateOutlet=\"inputPasswordRef || defaultInputPassword; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDate let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"true\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Date\">\r\n <ng-container *ngTemplateOutlet=\"inputDateRef || defaultInputDate; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputMonth let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"false\" view=\"month\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Month\">\r\n <ng-container *ngTemplateOutlet=\"inputMonthRef || defaultInputMonth; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputWeek let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"week\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Week\">\r\n <ng-container *ngTemplateOutlet=\"inputWeekRef || defaultInputWeek; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTime let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Time\">\r\n <ng-container *ngTemplateOutlet=\"inputTimeRef || defaultInputTime; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeLocal let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeLocal\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeLocalRef || defaultInputDatetimeLocal; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputNumber let-property=\"property\" let-template=\"template\">\r\n <p-inputNumber [formControlName]=\"property.name\" [id]=\"property.name\" mode=\"decimal\" [showButtons]=\"!property.readOnly\" class=\"w-full\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-inputNumber>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Number\">\r\n <ng-container *ngTemplateOutlet=\"inputNumberRef || defaultInputNumber; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputRange let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"range\" [min]=\"property.min\" [max]=\"property.max\" [step]=\"property.step\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Range\">\r\n <ng-container *ngTemplateOutlet=\"inputRangeRef || defaultInputRange; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputColor let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"color\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Color\">\r\n <ng-container *ngTemplateOutlet=\"inputColorRef || defaultInputColor; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputBool let-property=\"property\" let-template=\"template\" let-formGroup=\"formGroup\">\r\n <p-checkbox *ngIf=\"property.required\" [binary]=\"true\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-checkbox>\r\n <p-triStateCheckbox *ngIf=\"!property.required\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-triStateCheckbox>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Bool\">\r\n <ng-container *ngTemplateOutlet=\"inputBoolRef || defaultInputBool; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeOffset let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeOffset\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeOffsetRef || defaultInputDatetimeOffset; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDuration let-property=\"property\" let-template=\"template\">\r\n <p-calendar *ngSwitchCase=\"PropertyType.Duration\" [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Duration\">\r\n <ng-container *ngTemplateOutlet=\"inputDurationRef || defaultInputDuration; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputImage let-property=\"property\" let-template=\"template\">\r\n <rw-image\r\n [formControlName]=\"property.name\"\r\n [accept]=\"property.restWorldImage.accept ?? property.placeholder ?? 'image/*'\"\r\n [alignImage]=\"property.restWorldImage.alignImage\"\r\n [alt]=\"property.prompt ?? property.name\"\r\n [aspectRatio]=\"property.restWorldImage.aspectRatio\"\r\n [backgroundColor]=\"property.restWorldImage.backgroundColor\"\r\n [canvasRotation]=\"property.restWorldImage.canvasRotation\"\r\n [containWithinAspectRatio]=\"property.restWorldImage.containWithinAspectRatio\"\r\n [cropper]=\"property.restWorldImage.cropper\"\r\n [cropperMaxHeight]=\"property.restWorldImage.cropperMaxHeight\"\r\n [cropperMaxWidth]=\"property.restWorldImage.cropperMaxWidth\"\r\n [cropperMinHeight]=\"property.restWorldImage.cropperMinHeight\"\r\n [cropperMinWidth]=\"property.restWorldImage.cropperMinWidth\"\r\n [cropperStaticHeight]=\"property.restWorldImage.cropperStaticHeight\"\r\n [cropperStaticWidth]=\"property.restWorldImage.cropperStaticWidth\"\r\n [fileName]=\"property.name + '.' + (property.restWorldImage.format ?? 'png')\"\r\n [format]=\"property.restWorldImage.format\"\r\n [imageQuality]=\"property.restWorldImage.imageQuality\"\r\n [initialStepSize]=\"property.restWorldImage.initialStepSize\"\r\n [maintainAspectRatio]=\"property.restWorldImage.maintainAspectRatio\"\r\n [onlyScaleDown]=\"property.restWorldImage.onlyScaleDown\"\r\n [resizeToWidth]=\"property.restWorldImage.resizeToWidth\"\r\n [resizeToHeight]=\"property.restWorldImage.resizeToHeight\"\r\n [roundCropper]=\"property.restWorldImage.roundCropper\"></rw-image>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Image\">\r\n <ng-container *ngTemplateOutlet=\"inputImageRef || defaultInputImage; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputFile let-property=\"property\" let-template=\"template\">\r\n <rw-file [formControlName]=\"property.name\" [fileName]=\"property.name\" [accept]=\"property.placeholder\"></rw-file>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.File\">\r\n <ng-container *ngTemplateOutlet=\"inputFileRef || defaultInputFile; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputObject let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\">\r\n <rw-form [formGroup]=\"(formGroup.controls[property.name] | as : FormGroup)\" [template]=\"property._templates.default\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Object\">\r\n <ng-container *ngTemplateOutlet=\"inputObjectRef || defaultInputObject; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputCollection let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\" cdkDropList [cdkDropListData]=\"{ property: property, formArray: (formGroup.controls[property.name] | as : FormArray)}\" (cdkDropListDropped)=\"collectionItemDropped($event)\">\r\n <div *ngFor=\"let template of getCollectionEntryTemplates(property)\" class=\"flex align-items-center\" cdkDrag>\r\n <i class=\"fas fa-grip-lines\" cdkDragHandle></i>\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full flex justify-content-end\">\r\n <rw-form [formGroup]=\"((formGroup.controls[property.name] | as : FormArray).controls[Number.parseInt(template.title!)] | as : FormGroup)\" [template]=\"template\" [apiName]=\"apiName\" class=\"w-full\"></rw-form>\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-trash\" class=\"p-button-outlined p-button-danger ml-2 mb-3\" (click)=\"deleteItemFromCollection(property, formGroup.controls[property.name], template)\"></button>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end w-full\">\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-plus\" class=\"p-button-outlined p-button-info\" (click)=\"addNewItemToCollection(property, formGroup.controls[property.name])\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Collection\">\r\n <ng-container *ngTemplateOutlet=\"inputCollectionRef || defaultInputCollection; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDefault let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"inputDefaultRef || defaultInputDefault; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n <val-errors [controlName]=\"property.name || null\">\r\n <ng-template valError=\"required\">The field '{{property.prompt || property.name}}' is required.</ng-template>\r\n <ng-template valError=\"email\">The email must be a valid email address.</ng-template>\r\n <ng-template valError=\"min\" let-error=\"error\">'{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.min }}.</ng-template>\r\n <ng-template valError=\"max\" let-error=\"error\">'{{property.prompt || property.name}}' must be smaller than or equal to {{ error.max }}.</ng-template>\r\n <ng-template valError=\"minlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"maxlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be shorter than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"pattern\" let-error=\"error\">The value for '{{property.prompt || property.name}}' does not match the pattern {{ error }}.</ng-template>\r\n <ng-template valError=\"remote\" let-error=\"error\">{{ error }}</ng-template>\r\n </val-errors>\r\n </div>\r\n</div>\r\n", styles: [".brace{align-self:stretch;margin:.2rem .5rem;border-left:1px solid rgb(206,212,218);border-top:1px solid rgb(206,212,218);border-bottom:1px solid rgb(206,212,218);width:1rem}.cdk-drag-handle{cursor:move}.cdk-drag-preview{background-color:#ffffffd0;border:2px dashed rgb(206,212,218);cursor:move}.cdk-drag-placeholder{border:2px dashed rgb(206,212,218);margin:-2px}\n"], components: [{ type: i4.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "virtualScroll", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear"] }, { type: i5.MultiSelect, selector: "p-multiSelect", inputs: ["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", "autoZIndex", "baseZIndex", "filterBy", "virtualScroll", "itemSize", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "scrollHeight", "defaultLabel", "placeholder", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onPanelShow", "onPanelHide"] }, { type: i6.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "view", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { type: i7.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "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", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown"] }, { type: i8.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"] }, { type: i9.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { type: i10.RESTWorldImageViewComponent, selector: "rw-image", inputs: ["alt", "accept", "fileName", "alignImage", "aspectRatio", "backgroundColor", "canvasRotation", "containWithinAspectRatio", "cropper", "cropperMaxHeight", "cropperMaxWidth", "cropperMinHeight", "cropperMinWidth", "cropperStaticHeight", "cropperStaticWidth", "format", "imageQuality", "initialStepSize", "maintainAspectRatio", "onlyScaleDown", "resizeToWidth", "resizeToHeight", "roundCropper"] }, { type: i11.RESTWorldFileViewComponent, selector: "rw-file", inputs: ["accept", "fileName"] }, { type: RestworldEditFormComponent, selector: "rw-form", inputs: ["formGroup", "template", "apiName"] }, { type: i12.ValidationErrorsComponent, selector: "val-errors", inputs: ["control", "controlName", "label"] }], directives: [{ type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i14.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i14.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i14.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i15.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i13.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i13.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i16.InputText, selector: "[pInputText]" }, { type: i14.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { type: i14.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i17.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i17.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i17.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { type: i18.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i19.Ripple, selector: "[pRipple]" }, { type: i13.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i12.ValidationErrorDirective, selector: "ng-template[valError]", inputs: ["valError"] }], pipes: { "as": i20.AsPipe } });
139
139
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: RestworldEditFormComponent, decorators: [{
140
140
  type: Component,
141
- args: [{ selector: 'rw-form', template: "<div *ngFor=\"let property of template.properties\" class=\"grid field\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"property.type !== PropertyType.Hidden\" [attr.for]=\"property.name\" class=\"col-12 mb-2 md:col-2 md:mb-0\" [class.p-disabled]=\"property.readOnly\" [class.hasChildren]=\"property._templates\">{{property.prompt || property.name}}</label>\r\n <div class=\"col-12 md:col-10\">\r\n\r\n <ng-template #defaultInputOptions let-property=\"property\" let-template=\"template\">\r\n\r\n <ng-template #defaultInputOptionsSingle let-property=\"property\" let-template=\"template\">\r\n <p-dropdown [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [filterBy]=\"(property.options.promptField || 'prompt') + ',' + (property.options.valueField || 'value')\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [required]=\"property.required || property.options.minItems > 0\" [filter]=\"true\" [autoDisplayFirst]=\"false\" [showClear]=\"!property.required || property.options.minItems <= 0\" (onFilter)=\"onOptionsFiltered(property, $event)\" styleClass=\"w-full\" [filterPlaceholder]=\"property?.options?.link?.href ? 'search for more results' : ''\">\r\n <ng-template let-item pTemplate=\"selectedItem\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n <ng-template let-item pTemplate=\"item\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n </p-dropdown>\r\n </ng-template>\r\n <ng-container *ngIf=\"!property.options.maxItems || property.options.maxItems == 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsSingleRef || defaultInputOptionsSingle; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputOptionsMultiple let-property=\"property\" let-template=\"template\">\r\n <p-multiSelect [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [optionLabel]=\"property.options.promptField || 'prompt'\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [selectionLimit]=\"property.options.maxItems\" [required]=\"property.required || property.options.minItems > 0\"></p-multiSelect>\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options.maxItems > 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsMultipleRef || defaultInputOptionsMultiple; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsRef || defaultInputOptions; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!property.options\">\r\n <div [ngSwitch]=\"property.type\">\r\n\r\n <ng-template #defaultInputHidden let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"hidden\" [value]=\"property.value\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Hidden\">\r\n <ng-container *ngTemplateOutlet=\"inputHiddenRef || defaultInputHidden; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputText let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\r\n <ng-container *ngTemplateOutlet=\"inputTextRef || defaultInputText; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTextarea let-property=\"property\" let-template=\"template\">\r\n <textarea [formControlName]=\"property.name\" [id]=\"property.name\" pInputTextarea class=\"w-full p-inputtextarea p-inputtext p-component p-element\" [class.p-disabled]=\"property.readOnly\" [cols]=\"property.cols\" [rows]=\"property.rows\"></textarea>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Textarea\">\r\n <ng-container *ngTemplateOutlet=\"inputTextareaRef || defaultInputTextarea; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputSearch let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"search\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Search\">\r\n <ng-container *ngTemplateOutlet=\"inputSearchRef || defaultInputSearch; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTel let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"tel\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Tel\">\r\n <ng-container *ngTemplateOutlet=\"inputTelRef || defaultInputTel; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputUrl let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"url\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Url\">\r\n <ng-container *ngTemplateOutlet=\"inputUrlRef || defaultInputUrl; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputEmail let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"email\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Email\">\r\n <ng-container *ngTemplateOutlet=\"inputEmailRef || defaultInputEmail; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputPassword let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"password\" pPassword class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Password\">\r\n <ng-container *ngTemplateOutlet=\"inputPasswordRef || defaultInputPassword; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDate let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"true\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Date\">\r\n <ng-container *ngTemplateOutlet=\"inputDateRef || defaultInputDate; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputMonth let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"false\" view=\"month\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Month\">\r\n <ng-container *ngTemplateOutlet=\"inputMonthRef || defaultInputMonth; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputWeek let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"week\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Week\">\r\n <ng-container *ngTemplateOutlet=\"inputWeekRef || defaultInputWeek; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTime let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Time\">\r\n <ng-container *ngTemplateOutlet=\"inputTimeRef || defaultInputTime; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeLocal let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeLocal\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeLocalRef || defaultInputDatetimeLocal; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputNumber let-property=\"property\" let-template=\"template\">\r\n <p-inputNumber [formControlName]=\"property.name\" [id]=\"property.name\" mode=\"decimal\" [showButtons]=\"!property.readOnly\" class=\"w-full\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-inputNumber>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Number\">\r\n <ng-container *ngTemplateOutlet=\"inputNumberRef || defaultInputNumber; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputRange let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"range\" [min]=\"property.min\" [max]=\"property.max\" [step]=\"property.step\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Range\">\r\n <ng-container *ngTemplateOutlet=\"inputRangeRef || defaultInputRange; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputColor let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"color\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Color\">\r\n <ng-container *ngTemplateOutlet=\"inputColorRef || defaultInputColor; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputBool let-property=\"property\" let-template=\"template\" let-formGroup=\"formGroup\">\r\n <p-checkbox *ngIf=\"property.required\" [binary]=\"true\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-checkbox>\r\n <p-triStateCheckbox *ngIf=\"!property.required\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-triStateCheckbox>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Bool\">\r\n <ng-container *ngTemplateOutlet=\"inputBoolRef || defaultInputBool; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeOffset let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeOffset\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeOffsetRef || defaultInputDatetimeOffset; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDuration let-property=\"property\" let-template=\"template\">\r\n <p-calendar *ngSwitchCase=\"PropertyType.Duration\" [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Duration\">\r\n <ng-container *ngTemplateOutlet=\"inputDurationRef || defaultInputDuration; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputImage let-property=\"property\" let-template=\"template\">\r\n <rw-image [formControlName]=\"property.name\" [accept]=\"property.placeholder\"></rw-image>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Image\">\r\n <ng-container *ngTemplateOutlet=\"inputImageRef || defaultInputImage; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputFile let-property=\"property\" let-template=\"template\">\r\n <rw-file [formControlName]=\"property.name\" [fileName]=\"property.name\" [accept]=\"property.placeholder\"></rw-file>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.File\">\r\n <ng-container *ngTemplateOutlet=\"inputFileRef || defaultInputFile; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputObject let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\">\r\n <rw-form [formGroup]=\"(formGroup.controls[property.name] | as : FormGroup)\" [template]=\"property._templates.default\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Object\">\r\n <ng-container *ngTemplateOutlet=\"inputObjectRef || defaultInputObject; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputCollection let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\" cdkDropList [cdkDropListData]=\"{ property: property, formArray: (formGroup.controls[property.name] | as : FormArray)}\" (cdkDropListDropped)=\"collectionItemDropped($event)\">\r\n <div *ngFor=\"let template of getCollectionEntryTemplates(property)\" class=\"flex align-items-center\" cdkDrag>\r\n <i class=\"fas fa-grip-lines\" cdkDragHandle></i>\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full flex justify-content-end\">\r\n <rw-form [formGroup]=\"((formGroup.controls[property.name] | as : FormArray).controls[Number.parseInt(template.title!)] | as : FormGroup)\" [template]=\"template\" [apiName]=\"apiName\" class=\"w-full\"></rw-form>\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-trash\" class=\"p-button-outlined p-button-danger ml-2 mb-3\" (click)=\"deleteItemFromCollection(property, formGroup.controls[property.name], template)\"></button>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end w-full\">\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-plus\" class=\"p-button-outlined p-button-info\" (click)=\"addNewItemToCollection(property, formGroup.controls[property.name])\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Collection\">\r\n <ng-container *ngTemplateOutlet=\"inputCollectionRef || defaultInputCollection; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDefault let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"inputDefaultRef || defaultInputDefault; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n <val-errors [controlName]=\"property.name || null\">\r\n <ng-template valError=\"required\">The field '{{property.prompt || property.name}}' is required.</ng-template>\r\n <ng-template valError=\"email\">The email must be a valid email address.</ng-template>\r\n <ng-template valError=\"min\" let-error=\"error\">'{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.min }}.</ng-template>\r\n <ng-template valError=\"max\" let-error=\"error\">'{{property.prompt || property.name}}' must be smaller than or equal to {{ error.max }}.</ng-template>\r\n <ng-template valError=\"minlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"maxlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be shorter than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"pattern\" let-error=\"error\">The value for '{{property.prompt || property.name}}' does not match the pattern {{ error }}.</ng-template>\r\n <ng-template valError=\"remote\" let-error=\"error\">{{ error }}</ng-template>\r\n </val-errors>\r\n </div>\r\n</div>\r\n", styles: [".brace{align-self:stretch;margin:.2rem .5rem;border-left:1px solid rgb(206,212,218);border-top:1px solid rgb(206,212,218);border-bottom:1px solid rgb(206,212,218);width:1rem}.cdk-drag-handle{cursor:move}.cdk-drag-preview{background-color:#ffffffd0;border:2px dashed rgb(206,212,218);cursor:move}.cdk-drag-placeholder{border:2px dashed rgb(206,212,218);margin:-2px}\n"] }]
141
+ args: [{ selector: 'rw-form', template: "<div *ngFor=\"let property of template.properties\" class=\"grid field\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"property.type !== PropertyType.Hidden\" [attr.for]=\"property.name\" class=\"col-12 mb-2 md:col-2 md:mb-0\" [class.p-disabled]=\"property.readOnly\" [class.hasChildren]=\"property._templates\">{{property.prompt || property.name}}</label>\r\n <div class=\"col-12 md:col-10\">\r\n\r\n <ng-template #defaultInputOptions let-property=\"property\" let-template=\"template\">\r\n\r\n <ng-template #defaultInputOptionsSingle let-property=\"property\" let-template=\"template\">\r\n <p-dropdown [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [filterBy]=\"(property.options.promptField || 'prompt') + ',' + (property.options.valueField || 'value')\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [required]=\"property.required || property.options.minItems > 0\" [filter]=\"true\" [autoDisplayFirst]=\"false\" [showClear]=\"!property.required || property.options.minItems <= 0\" (onFilter)=\"onOptionsFiltered(property, $event)\" styleClass=\"w-full\" [filterPlaceholder]=\"property?.options?.link?.href ? 'search for more results' : ''\">\r\n <ng-template let-item pTemplate=\"selectedItem\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n <ng-template let-item pTemplate=\"item\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n </p-dropdown>\r\n </ng-template>\r\n <ng-container *ngIf=\"!property.options.maxItems || property.options.maxItems == 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsSingleRef || defaultInputOptionsSingle; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputOptionsMultiple let-property=\"property\" let-template=\"template\">\r\n <p-multiSelect [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [optionLabel]=\"property.options.promptField || 'prompt'\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [selectionLimit]=\"property.options.maxItems\" [required]=\"property.required || property.options.minItems > 0\"></p-multiSelect>\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options.maxItems > 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsMultipleRef || defaultInputOptionsMultiple; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsRef || defaultInputOptions; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!property.options\">\r\n <div [ngSwitch]=\"property.type\">\r\n\r\n <ng-template #defaultInputHidden let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"hidden\" [value]=\"property.value\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Hidden\">\r\n <ng-container *ngTemplateOutlet=\"inputHiddenRef || defaultInputHidden; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputText let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\r\n <ng-container *ngTemplateOutlet=\"inputTextRef || defaultInputText; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTextarea let-property=\"property\" let-template=\"template\">\r\n <textarea [formControlName]=\"property.name\" [id]=\"property.name\" pInputTextarea class=\"w-full p-inputtextarea p-inputtext p-component p-element\" [class.p-disabled]=\"property.readOnly\" [cols]=\"property.cols\" [rows]=\"property.rows\"></textarea>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Textarea\">\r\n <ng-container *ngTemplateOutlet=\"inputTextareaRef || defaultInputTextarea; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputSearch let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"search\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Search\">\r\n <ng-container *ngTemplateOutlet=\"inputSearchRef || defaultInputSearch; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTel let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"tel\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Tel\">\r\n <ng-container *ngTemplateOutlet=\"inputTelRef || defaultInputTel; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputUrl let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"url\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Url\">\r\n <ng-container *ngTemplateOutlet=\"inputUrlRef || defaultInputUrl; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputEmail let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"email\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Email\">\r\n <ng-container *ngTemplateOutlet=\"inputEmailRef || defaultInputEmail; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputPassword let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"password\" pPassword class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Password\">\r\n <ng-container *ngTemplateOutlet=\"inputPasswordRef || defaultInputPassword; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDate let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"true\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Date\">\r\n <ng-container *ngTemplateOutlet=\"inputDateRef || defaultInputDate; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputMonth let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"false\" view=\"month\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Month\">\r\n <ng-container *ngTemplateOutlet=\"inputMonthRef || defaultInputMonth; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputWeek let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"week\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Week\">\r\n <ng-container *ngTemplateOutlet=\"inputWeekRef || defaultInputWeek; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTime let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Time\">\r\n <ng-container *ngTemplateOutlet=\"inputTimeRef || defaultInputTime; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeLocal let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeLocal\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeLocalRef || defaultInputDatetimeLocal; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputNumber let-property=\"property\" let-template=\"template\">\r\n <p-inputNumber [formControlName]=\"property.name\" [id]=\"property.name\" mode=\"decimal\" [showButtons]=\"!property.readOnly\" class=\"w-full\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-inputNumber>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Number\">\r\n <ng-container *ngTemplateOutlet=\"inputNumberRef || defaultInputNumber; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputRange let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"range\" [min]=\"property.min\" [max]=\"property.max\" [step]=\"property.step\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Range\">\r\n <ng-container *ngTemplateOutlet=\"inputRangeRef || defaultInputRange; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputColor let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"color\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Color\">\r\n <ng-container *ngTemplateOutlet=\"inputColorRef || defaultInputColor; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputBool let-property=\"property\" let-template=\"template\" let-formGroup=\"formGroup\">\r\n <p-checkbox *ngIf=\"property.required\" [binary]=\"true\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-checkbox>\r\n <p-triStateCheckbox *ngIf=\"!property.required\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-triStateCheckbox>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Bool\">\r\n <ng-container *ngTemplateOutlet=\"inputBoolRef || defaultInputBool; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeOffset let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeOffset\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeOffsetRef || defaultInputDatetimeOffset; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDuration let-property=\"property\" let-template=\"template\">\r\n <p-calendar *ngSwitchCase=\"PropertyType.Duration\" [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Duration\">\r\n <ng-container *ngTemplateOutlet=\"inputDurationRef || defaultInputDuration; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputImage let-property=\"property\" let-template=\"template\">\r\n <rw-image\r\n [formControlName]=\"property.name\"\r\n [accept]=\"property.restWorldImage.accept ?? property.placeholder ?? 'image/*'\"\r\n [alignImage]=\"property.restWorldImage.alignImage\"\r\n [alt]=\"property.prompt ?? property.name\"\r\n [aspectRatio]=\"property.restWorldImage.aspectRatio\"\r\n [backgroundColor]=\"property.restWorldImage.backgroundColor\"\r\n [canvasRotation]=\"property.restWorldImage.canvasRotation\"\r\n [containWithinAspectRatio]=\"property.restWorldImage.containWithinAspectRatio\"\r\n [cropper]=\"property.restWorldImage.cropper\"\r\n [cropperMaxHeight]=\"property.restWorldImage.cropperMaxHeight\"\r\n [cropperMaxWidth]=\"property.restWorldImage.cropperMaxWidth\"\r\n [cropperMinHeight]=\"property.restWorldImage.cropperMinHeight\"\r\n [cropperMinWidth]=\"property.restWorldImage.cropperMinWidth\"\r\n [cropperStaticHeight]=\"property.restWorldImage.cropperStaticHeight\"\r\n [cropperStaticWidth]=\"property.restWorldImage.cropperStaticWidth\"\r\n [fileName]=\"property.name + '.' + (property.restWorldImage.format ?? 'png')\"\r\n [format]=\"property.restWorldImage.format\"\r\n [imageQuality]=\"property.restWorldImage.imageQuality\"\r\n [initialStepSize]=\"property.restWorldImage.initialStepSize\"\r\n [maintainAspectRatio]=\"property.restWorldImage.maintainAspectRatio\"\r\n [onlyScaleDown]=\"property.restWorldImage.onlyScaleDown\"\r\n [resizeToWidth]=\"property.restWorldImage.resizeToWidth\"\r\n [resizeToHeight]=\"property.restWorldImage.resizeToHeight\"\r\n [roundCropper]=\"property.restWorldImage.roundCropper\"></rw-image>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Image\">\r\n <ng-container *ngTemplateOutlet=\"inputImageRef || defaultInputImage; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputFile let-property=\"property\" let-template=\"template\">\r\n <rw-file [formControlName]=\"property.name\" [fileName]=\"property.name\" [accept]=\"property.placeholder\"></rw-file>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.File\">\r\n <ng-container *ngTemplateOutlet=\"inputFileRef || defaultInputFile; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputObject let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\">\r\n <rw-form [formGroup]=\"(formGroup.controls[property.name] | as : FormGroup)\" [template]=\"property._templates.default\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Object\">\r\n <ng-container *ngTemplateOutlet=\"inputObjectRef || defaultInputObject; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputCollection let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\" cdkDropList [cdkDropListData]=\"{ property: property, formArray: (formGroup.controls[property.name] | as : FormArray)}\" (cdkDropListDropped)=\"collectionItemDropped($event)\">\r\n <div *ngFor=\"let template of getCollectionEntryTemplates(property)\" class=\"flex align-items-center\" cdkDrag>\r\n <i class=\"fas fa-grip-lines\" cdkDragHandle></i>\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full flex justify-content-end\">\r\n <rw-form [formGroup]=\"((formGroup.controls[property.name] | as : FormArray).controls[Number.parseInt(template.title!)] | as : FormGroup)\" [template]=\"template\" [apiName]=\"apiName\" class=\"w-full\"></rw-form>\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-trash\" class=\"p-button-outlined p-button-danger ml-2 mb-3\" (click)=\"deleteItemFromCollection(property, formGroup.controls[property.name], template)\"></button>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end w-full\">\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-plus\" class=\"p-button-outlined p-button-info\" (click)=\"addNewItemToCollection(property, formGroup.controls[property.name])\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Collection\">\r\n <ng-container *ngTemplateOutlet=\"inputCollectionRef || defaultInputCollection; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDefault let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"inputDefaultRef || defaultInputDefault; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n <val-errors [controlName]=\"property.name || null\">\r\n <ng-template valError=\"required\">The field '{{property.prompt || property.name}}' is required.</ng-template>\r\n <ng-template valError=\"email\">The email must be a valid email address.</ng-template>\r\n <ng-template valError=\"min\" let-error=\"error\">'{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.min }}.</ng-template>\r\n <ng-template valError=\"max\" let-error=\"error\">'{{property.prompt || property.name}}' must be smaller than or equal to {{ error.max }}.</ng-template>\r\n <ng-template valError=\"minlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"maxlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be shorter than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"pattern\" let-error=\"error\">The value for '{{property.prompt || property.name}}' does not match the pattern {{ error }}.</ng-template>\r\n <ng-template valError=\"remote\" let-error=\"error\">{{ error }}</ng-template>\r\n </val-errors>\r\n </div>\r\n</div>\r\n", styles: [".brace{align-self:stretch;margin:.2rem .5rem;border-left:1px solid rgb(206,212,218);border-top:1px solid rgb(206,212,218);border-bottom:1px solid rgb(206,212,218);width:1rem}.cdk-drag-handle{cursor:move}.cdk-drag-preview{background-color:#ffffffd0;border:2px dashed rgb(206,212,218);cursor:move}.cdk-drag-placeholder{border:2px dashed rgb(206,212,218);margin:-2px}\n"] }]
142
142
  }], ctorParameters: function () { return [{ type: i1.FormService }, { type: i0.ChangeDetectorRef }, { type: i2.MessageService }, { type: i3.RESTworldClientCollection }]; }, propDecorators: { formGroup: [{
143
143
  type: Input
144
144
  }], template: [{
@@ -227,4 +227,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImpor
227
227
  type: ContentChild,
228
228
  args: ['inputDefault', { static: false }]
229
229
  }] } });
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LWZvcm0vcmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LWZvcm0vcmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFtQixTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFZLFlBQVksRUFBWSxRQUFRLEVBQWUsTUFBTSx5QkFBeUIsQ0FBQztBQUVsRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVOUQsTUFBTSxPQUFPLDBCQUEwQjtJQTRHckMsWUFDVSxZQUF5QixFQUN6QixrQkFBcUMsRUFDckMsZUFBK0IsRUFDL0IsUUFBbUM7UUFIbkMsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDekIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUNyQyxvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDL0IsYUFBUSxHQUFSLFFBQVEsQ0FBMkI7UUFSdEMsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QixjQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLFdBQU0sR0FBRyxNQUFNLENBQUM7SUFPbkIsQ0FBQztJQXRCTCxJQUFXLFlBQVk7UUFDckIsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FB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QyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJNUMsc0JBQXNCO3NCQURyQixZQUFZO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJdEQsZ0JBQWdCO3NCQURmLFlBQVk7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJaEQsYUFBYTtzQkFEWixZQUFZO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSTdDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUk1QyxjQUFjO3NCQURiLFlBQVk7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJOUMsa0JBQWtCO3NCQURqQixZQUFZO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJbEQsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtEcmFnRHJvcCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIElucHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgUHJvcGVydHksIFByb3BlcnR5VHlwZSwgUmVzb3VyY2UsIFRlbXBsYXRlLCBUZW1wbGF0ZUR0byB9IGZyb20gJ0B3ZXJ0enVpL25neC1oYWwtY2xpZW50JztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFByb2JsZW1EZXRhaWxzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3Byb2JsZW0tZGV0YWlscyc7XHJcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUkVTVHdvcmxkQ2xpZW50IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzdHdvcmxkLWNsaWVudCc7XHJcbmltcG9ydCB7IFJFU1R3b3JsZENsaWVudENvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXN0d29ybGQtY2xpZW50LWNvbGxlY3Rpb24nO1xyXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3J3LWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1lZGl0LWZvcm0uY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJlc3R3b3JsZEVkaXRGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgZm9ybUdyb3VwITogRm9ybUdyb3VwO1xuXG4gIEBJbnB1dCgpXG4gIHRlbXBsYXRlITogVGVtcGxhdGU7XG5cbiAgQElucHV0KClcbiAgYXBpTmFtZT86IHN0cmluZztcblxuICBAQ29udGVudENoaWxkKCdpbnB1dE9wdGlvbnNTaW5nbGUnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRPcHRpb25zU2luZ2xlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRPcHRpb25zTXVsdGlwbGUnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRPcHRpb25zTXVsdGlwbGVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dE9wdGlvbnMnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRPcHRpb25zUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRIaWRkZW4nLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRIaWRkZW5SZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFRleHQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRUZXh0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRUZXh0YXJlYScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFRleHRhcmVhUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRTZWFyY2gnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRTZWFyY2hSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFRlbCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFRlbFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0VXJsJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0VXJsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRFbWFpbCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dEVtYWlsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRQYXNzd29yZCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFBhc3N3b3JkUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXREYXRlJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0RGF0ZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0TW9udGgnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRNb250aFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0V2VlaycsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFdlZWtSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFRpbWUnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRUaW1lUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXREYXRldGltZUxvY2FsJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0RGF0ZXRpbWVMb2NhbFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0TnVtYmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0TnVtYmVyUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRSYW5nZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFJhbmdlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRDb2xvcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dENvbG9yUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRCb29sJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0Qm9vbFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RGF0ZXRpbWVPZmZzZXQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXREYXRldGltZU9mZnNldFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RHVyYXRpb24nLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXREdXJhdGlvblJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0SW1hZ2UnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRJbWFnZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RmlsZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dEZpbGVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dE9iamVjdCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dE9iamVjdFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0Q29sbGVjdGlvbicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dENvbGxlY3Rpb25SZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dERlZmF1bHQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXREZWZhdWx0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgcHVibGljIGdldCBQcm9wZXJ0eVR5cGUoKSB7XHJcbiAgICByZXR1cm4gUHJvcGVydHlUeXBlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkYXRlRm9ybWF0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoMzMzMywgMTAsIDIyKVxyXG4gICAgICAudG9Mb2NhbGVEYXRlU3RyaW5nKClcclxuICAgICAgLnJlcGxhY2UoXCIyMlwiLCBcImRkXCIpXHJcbiAgICAgIC5yZXBsYWNlKFwiMTFcIiwgXCJtbVwiKVxyXG4gICAgICAucmVwbGFjZShcIjMzMzNcIiwgXCJ5eVwiKVxyXG4gICAgICAucmVwbGFjZShcIjMzXCIsIFwieVwiKTtcclxuICB9XG5cbiAgcHVibGljIEZvcm1Hcm91cCA9IEZvcm1Hcm91cDtcbiAgcHVibGljIEZvcm1BcnJheSA9IEZvcm1BcnJheTtcbiAgcHVibGljIE51bWJlciA9IE51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9mb3JtU2VydmljZTogRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY2xpZW50czogUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvblxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZvcm1Hcm91cClcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW2Zvcm1Hcm91cF0gaXMgcmVxdWlyZWQgb24gPHJ3LWZvcm0+XCIpO1xyXG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbdGVtcGxhdGVdIGlzIHJlcXVpcmVkIG9uIDxydy1mb3JtPlwiKTtcclxuICAgIGlmICghdGhpcy5hcGlOYW1lKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbYXBpTmFtZV0gaXMgcmVxdWlyZWQgb24gPHJ3LWZvcm0+XCIpO1xyXG4gIH1cclxuXG4gIHB1YmxpYyBnZXRUb29sdGlwKHJlc291cmNlOiBSZXNvdXJjZSwga2V5c1RvRXhjbHVkZT86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b29sdGlwID0gT2JqZWN0LmVudHJpZXMocmVzb3VyY2UpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIShrZXkuc3RhcnRzV2l0aCgnXycpIHx8IFsnY3JlYXRlZEF0JywgJ2NyZWF0ZWRCeScsICdsYXN0Q2hhbmdlZEF0JywgJ2xhc3RDaGFuZ2VkQnknLCAndGltZXN0YW1wJ10uaW5jbHVkZXMoa2V5KSB8fCBrZXlzVG9FeGNsdWRlPy5pbmNsdWRlcyhrZXkpKSlcbiAgICAgIC5yZWR1Y2UoKHByZXYsIFtrZXksIHZhbHVlXSwgaW5kZXgpID0+IGAke3ByZXZ9JHtpbmRleCA9PT0gMCA/ICcnIDogJ1xcbid9JHtrZXl9OiAke1Jlc3R3b3JsZEVkaXRGb3JtQ29tcG9uZW50Lmpzb25TdHJpbmdpZnlXaXRoRWxpcHNpcyh2YWx1ZSl9YCwgJycpO1xuXG4gICAgcmV0dXJuIHRvb2x0aXA7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBqc29uU3RyaW5naWZ5V2l0aEVsaXBzaXModmFsdWU6IHVua25vd24pIHtcbiAgICBjb25zdCBtYXhMZW5ndGggPSAyMDA7XG4gICAgY29uc3QgZW5kID0gMTA7XG4gICAgY29uc3Qgc3RhcnQgPSBtYXhMZW5ndGggLSBlbmQgLSAyO1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgY29uc3Qgc2hvcnRlbmVkID0ganNvbi5sZW5ndGggPiBtYXhMZW5ndGggPyBqc29uLnN1YnN0cmluZygwLCBzdGFydCkgKyAn4oCmJyArIGpzb24uc3Vic3RyaW5nKGpzb24ubGVuZ3RoIC0gZW5kKSA6IGpzb247XG5cbiAgICByZXR1cm4gc2hvcnRlbmVkO1xuICB9XG5cbiAgcHVibGljIGdldENvbGxlY3Rpb25FbnRyeVRlbXBsYXRlcyhwcm9wZXJ0eT86IFByb3BlcnR5KTogVGVtcGxhdGVbXSB7XG4gICAgaWYgKCFwcm9wZXJ0eSlcclxuICAgICAgcmV0dXJuIFtdO1xyXG5cclxuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhwcm9wZXJ0eS5fdGVtcGxhdGVzKVxyXG4gICAgICAuZmlsdGVyKChba2V5LF0pID0+IE51bWJlci5pc0ludGVnZXIoTnVtYmVyLnBhcnNlSW50KGtleSkpKVxyXG4gICAgICAubWFwKChbLCB2YWx1ZV0pID0+IHZhbHVlKTtcclxuICB9XG5cbiAgcHVibGljIGFkZE5ld0l0ZW1Ub0NvbGxlY3Rpb24ocHJvcGVydHk6IFByb3BlcnR5LCBmb3JtQXJyYXk6IEZvcm1BcnJheSB8IEFic3RyYWN0Q29udHJvbCk6IHZvaWQge1xuICAgIGlmICghKGZvcm1BcnJheSBpbnN0YW5jZW9mIEZvcm1BcnJheSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zvcm1BcnJheSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgRm9ybUFycmF5LicpO1xyXG5cclxuICAgIGNvbnN0IG1heEluZGV4ID0gTWF0aC5tYXgoLi4uT2JqZWN0LmtleXMocHJvcGVydHkuX3RlbXBsYXRlcylcclxuICAgICAgLm1hcChrZXkgPT4gTnVtYmVyLnBhcnNlSW50KGtleSkpXHJcbiAgICAgIC5maWx0ZXIoa2V5ID0+IE51bWJlci5pc1NhZmVJbnRlZ2VyKGtleSkpKTtcclxuICAgIGNvbnN0IG5leHRJbmRleCA9IG1heEluZGV4IDwgMCA/IDAgOiBtYXhJbmRleCArIDE7XG5cbiAgICBjb25zdCBkZWZhdWx0VGVtcGxhdGUgPSBwcm9wZXJ0eS5fdGVtcGxhdGVzWydkZWZhdWx0J107XHJcbiAgICBjb25zdCBjb3BpZWRUZW1wbGF0ZUR0byA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmYXVsdFRlbXBsYXRlKSkgYXMgVGVtcGxhdGVEdG87XHJcbiAgICBjb25zdCBjb3BpZWRUZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShjb3BpZWRUZW1wbGF0ZUR0byk7XHJcbiAgICBjb3BpZWRUZW1wbGF0ZS50aXRsZSA9IG5leHRJbmRleC50b1N0cmluZygpO1xyXG5cclxuICAgIHByb3BlcnR5Ll90ZW1wbGF0ZXNbY29waWVkVGVtcGxhdGUudGl0bGVdID0gY29waWVkVGVtcGxhdGU7XHJcbiAgICBmb3JtQXJyYXkucHVzaCh0aGlzLl9mb3JtU2VydmljZS5jcmVhdGVGb3JtR3JvdXBGcm9tVGVtcGxhdGUoZGVmYXVsdFRlbXBsYXRlKSk7XHJcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVJdGVtRnJvbUNvbGxlY3Rpb24ocHJvcGVydHk6IFByb3BlcnR5LCBmb3JtQXJyYXk6IEZvcm1BcnJheSB8IEFic3RyYWN0Q29udHJvbCwgdGVtcGxhdGU6IFRlbXBsYXRlKTogdm9pZCB7XG4gICAgaWYgKCF0ZW1wbGF0ZS50aXRsZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRlbGV0ZSB0aGUgaXRlbSwgYmVjYXVzZSB0aGUgdGVtcGxhdGUgJyR7dGVtcGxhdGV9JyBkb2VzIG5vdCBoYXZlIGEgdGl0bGUuYCk7XG5cbiAgICBpZiAoIShmb3JtQXJyYXkgaW5zdGFuY2VvZiBGb3JtQXJyYXkpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3JtQXJyYXkgaXMgbm90IGFuIGluc3RhbmNlIG9mIEZvcm1BcnJheS4nKTtcblxuICAgIGNvbnN0IHRlbXBsYXRlcyA9IHByb3BlcnR5Ll90ZW1wbGF0ZXM7XHJcbiAgICBkZWxldGUgdGVtcGxhdGVzW3RlbXBsYXRlLnRpdGxlXTtcclxuXHJcbiAgICBmb3JtQXJyYXkucmVtb3ZlQXQoTnVtYmVyLnBhcnNlSW50KHRlbXBsYXRlLnRpdGxlKSk7XHJcbiAgfVxuXG4gIHB1YmxpYyBjb2xsZWN0aW9uSXRlbURyb3BwZWQoJGV2ZW50OiBDZGtEcmFnRHJvcDx7IHByb3BlcnR5OiBQcm9wZXJ0eTsgZm9ybUFycmF5OiBGb3JtQXJyYXkgfT4pIHtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSAkZXZlbnQuY29udGFpbmVyLmRhdGEuZm9ybUFycmF5O1xyXG4gICAgY29uc3QgcHJldmlvdXNJbmRleCA9ICRldmVudC5wcmV2aW91c0luZGV4O1xyXG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gJGV2ZW50LmN1cnJlbnRJbmRleDtcclxuICAgIGNvbnN0IG1vdmVtZW50RGlyZWN0aW9uID0gY3VycmVudEluZGV4ID4gcHJldmlvdXNJbmRleCA/IDEgOiAtMTtcclxuXHJcbiAgICAvLyBNb3ZlIGluIEZvcm1BcnJheVxyXG4gICAgLy8gV2UgZG8gbm90IG5lZWQgdG8gbW92ZSB0aGUgaXRlbSBpbiB0aGUgX3RlbXBsYXRlcyBvYmplY3RcclxuICAgIGNvbnN0IG1vdmVkQ29udHJvbCA9IGZvcm1BcnJheS5hdChwcmV2aW91c0luZGV4KTtcclxuICAgIGZvciAobGV0IGkgPSBwcmV2aW91c0luZGV4OyBpICogbW92ZW1lbnREaXJlY3Rpb24gPCBjdXJyZW50SW5kZXggKiBtb3ZlbWVudERpcmVjdGlvbjsgaSA9IGkgKyBtb3ZlbWVudERpcmVjdGlvbikge1xyXG4gICAgICBmb3JtQXJyYXkuc2V0Q29udHJvbChpLCBmb3JtQXJyYXkuYXQoaSArIG1vdmVtZW50RGlyZWN0aW9uKSk7XHJcbiAgICB9XHJcbiAgICBmb3JtQXJyYXkuc2V0Q29udHJvbChjdXJyZW50SW5kZXgsIG1vdmVkQ29udHJvbCk7XHJcblxyXG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgY29uc29sZS5sb2coJGV2ZW50KTtcclxuICB9XG5cclxuXHJcbiAgcHVibGljIGFzeW5jIG9uT3B0aW9uc0ZpbHRlcmVkKHByb3BlcnR5OiBQcm9wZXJ0eSwgZXZlbnQ6IHsgb3JpZ2luYWxFdmVudDogdW5rbm93bjsgZmlsdGVyOiBzdHJpbmcgfCBudWxsIH0pIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9wZXJ0eT8ub3B0aW9ucztcclxuXHJcbiAgICBpZiAoIW9wdGlvbnM/Lmxpbms/LmhyZWYgfHwgIWV2ZW50LmZpbHRlciB8fCBldmVudC5maWx0ZXIgPT09ICcnKVxyXG4gICAgICByZXR1cm47XHJcblxyXG5cclxuICAgIGNvbnN0IHRlbXBsYXRlZFVyaSA9IG9wdGlvbnMubGluay5ocmVmO1xyXG4gICAgbGV0IGZpbHRlciA9IGBjb250YWlucygke29wdGlvbnMucHJvbXB0RmllbGR9LCAnJHtldmVudC5maWx0ZXJ9JylgO1xyXG4gICAgaWYgKG9wdGlvbnMudmFsdWVGaWVsZD8udG9Mb3dlckNhc2UoKSA9PT0gJ2lkJyAmJiAhTnVtYmVyLmlzTmFOKE51bWJlci5wYXJzZUludChldmVudC5maWx0ZXIpKSlcclxuICAgICAgZmlsdGVyID0gYCgke29wdGlvbnMudmFsdWVGaWVsZH0gZXEgJHtldmVudC5maWx0ZXJ9KSAgb3IgKCR7ZmlsdGVyfSlgO1xyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKS5nZXRMaXN0QnlVcmkodGVtcGxhdGVkVXJpLCB7ICRmaWx0ZXI6IGZpbHRlciwgJHRvcDogMTAgfSk7XHJcbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IFByb2JsZW1EZXRhaWxzLmlzUHJvYmxlbURldGFpbHMocmVzcG9uc2UuYm9keSkgfHwgIXJlc3BvbnNlLmJvZHkpIHtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IGBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZXR0aW5nIHRoZSBmaWx0ZXJlZCBpdGVtcy5gO1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiBtZXNzYWdlLCBkYXRhOiByZXNwb25zZSB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1zID0gcmVzcG9uc2UuYm9keS5fZW1iZWRkZWQuaXRlbXM7XHJcbiAgICBvcHRpb25zLmlubGluZSA9IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDbGllbnQoKTogUkVTVHdvcmxkQ2xpZW50IHtcclxuICAgIGlmICghdGhpcy5hcGlOYW1lKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgYSBjbGllbnQsIGJlY2F1c2UgdGhlIGFwaU5hbWUgaXMgbm90IHNldC4nKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50cy5nZXRDbGllbnQodGhpcy5hcGlOYW1lKTtcclxuICB9XG59XG4iLCI8ZGl2ICpuZ0Zvcj1cImxldCBwcm9wZXJ0eSBvZiB0ZW1wbGF0ZS5wcm9wZXJ0aWVzXCIgY2xhc3M9XCJncmlkIGZpZWxkXCIgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cclxuICA8bGFiZWwgKm5nSWY9XCJwcm9wZXJ0eS50eXBlICE9PSBQcm9wZXJ0eVR5cGUuSGlkZGVuXCIgW2F0dHIuZm9yXT1cInByb3BlcnR5Lm5hbWVcIiBjbGFzcz1cImNvbC0xMiBtYi0yIG1kOmNvbC0yIG1kOm1iLTBcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIFtjbGFzcy5oYXNDaGlsZHJlbl09XCJwcm9wZXJ0eS5fdGVtcGxhdGVzXCI+e3twcm9wZXJ0eS5wcm9tcHQgfHwgcHJvcGVydHkubmFtZX19PC9sYWJlbD5cclxuICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1kOmNvbC0xMFwiPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0T3B0aW9ucyBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dE9wdGlvbnNTaW5nbGUgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxwLWRyb3Bkb3duIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgW29wdGlvbnNdPVwicHJvcGVydHkub3B0aW9ucy5pbmxpbmVcIiBbZmlsdGVyQnldPVwiKHByb3BlcnR5Lm9wdGlvbnMucHJvbXB0RmllbGQgfHwgJ3Byb21wdCcpICsgJywnICsgKHByb3BlcnR5Lm9wdGlvbnMudmFsdWVGaWVsZCB8fCAndmFsdWUnKVwiIFtvcHRpb25WYWx1ZV09XCJwcm9wZXJ0eS5vcHRpb25zLnZhbHVlRmllbGQgfHwgJ3ZhbHVlJ1wiIFtyZWFkb25seV09XCJwcm9wZXJ0eS5yZWFkT25seVwiIFtyZXF1aXJlZF09XCJwcm9wZXJ0eS5yZXF1aXJlZCB8fCBwcm9wZXJ0eS5vcHRpb25zLm1pbkl0ZW1zID4gMFwiIFtmaWx0ZXJdPVwidHJ1ZVwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCIhcHJvcGVydHkucmVxdWlyZWQgfHwgcHJvcGVydHkub3B0aW9ucy5taW5JdGVtcyA8PSAwXCIgKG9uRmlsdGVyKT1cIm9uT3B0aW9uc0ZpbHRlcmVkKHByb3BlcnR5LCAkZXZlbnQpXCIgc3R5bGVDbGFzcz1cInctZnVsbFwiIFtmaWx0ZXJQbGFjZWhvbGRlcl09XCJwcm9wZXJ0eT8ub3B0aW9ucz8ubGluaz8uaHJlZiA/ICdzZWFyY2ggZm9yIG1vcmUgcmVzdWx0cycgOiAnJ1wiPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtIHBUZW1wbGF0ZT1cInNlbGVjdGVkSXRlbVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBbcFRvb2x0aXBdPVwiZ2V0VG9vbHRpcChpdGVtLCBbcHJvcGVydHkub3B0aW9ucy5wcm9tcHRGaWVsZCB8fCAncHJvbXB0JywgcHJvcGVydHkub3B0aW9ucy52YWx1ZUZpZWxkIHx8ICd2YWx1ZSddKVwiPnt7aXRlbVtwcm9wZXJ0eS5vcHRpb25zLnByb21wdEZpZWxkIHx8ICdwcm9tcHQnXX19ICh7e2l0ZW1bcHJvcGVydHkub3B0aW9ucy52YWx1ZUZpZWxkIHx8ICd2YWx1ZSddfX0pPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIFtwVG9vbHRpcF09XCJnZXRUb29sdGlwKGl0ZW0sIFtwcm9wZXJ0eS5vcHRpb25zLnByb21wdEZpZWxkIHx8ICdwcm9tcHQnLCBwcm9wZXJ0eS5vcHRpb25zLnZhbHVlRmllbGQgfHwgJ3ZhbHVlJ10pXCI+e3tpdGVtW3Byb3BlcnR5Lm9wdGlvbnMucHJvbXB0RmllbGQgfHwgJ3Byb21wdCddfX0gKHt7aXRlbVtwcm9wZXJ0eS5vcHRpb25zLnZhbHVlRmllbGQgfHwgJ3ZhbHVlJ119fSk8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC1kcm9wZG93bj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFwcm9wZXJ0eS5vcHRpb25zLm1heEl0ZW1zIHx8IHByb3BlcnR5Lm9wdGlvbnMubWF4SXRlbXMgPT0gMVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dE9wdGlvbnNTaW5nbGVSZWYgfHwgZGVmYXVsdElucHV0T3B0aW9uc1NpbmdsZTsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0T3B0aW9uc011bHRpcGxlIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICA8cC1tdWx0aVNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIFtvcHRpb25zXT1cInByb3BlcnR5Lm9wdGlvbnMuaW5saW5lXCIgW29wdGlvbkxhYmVsXT1cInByb3BlcnR5Lm9wdGlvbnMucHJvbXB0RmllbGQgfHwgJ3Byb21wdCdcIiBbb3B0aW9uVmFsdWVdPVwicHJvcGVydHkub3B0aW9ucy52YWx1ZUZpZWxkIHx8ICd2YWx1ZSdcIiBbcmVhZG9ubHldPVwicHJvcGVydHkucmVhZE9ubHlcIiBbc2VsZWN0aW9uTGltaXRdPVwicHJvcGVydHkub3B0aW9ucy5tYXhJdGVtc1wiIFtyZXF1aXJlZF09XCJwcm9wZXJ0eS5yZXF1aXJlZCB8fCBwcm9wZXJ0eS5vcHRpb25zLm1pbkl0ZW1zID4gMFwiPjwvcC1tdWx0aVNlbGVjdD5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5Lm9wdGlvbnMubWF4SXRlbXMgPiAxXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0T3B0aW9uc011bHRpcGxlUmVmIHx8IGRlZmF1bHRJbnB1dE9wdGlvbnNNdWx0aXBsZTsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5Lm9wdGlvbnNcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0T3B0aW9uc1JlZiB8fCBkZWZhdWx0SW5wdXRPcHRpb25zOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiIXByb3BlcnR5Lm9wdGlvbnNcIj5cclxuICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwicHJvcGVydHkudHlwZVwiPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dEhpZGRlbiBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiB0eXBlPVwiaGlkZGVuXCIgW3ZhbHVlXT1cInByb3BlcnR5LnZhbHVlXCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5IaWRkZW5cIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dEhpZGRlblJlZiB8fCBkZWZhdWx0SW5wdXRIaWRkZW47IGNvbnRleHQ6eyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFRleHQgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cInRleHRcIiBwSW5wdXRUZXh0IGNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIiAvPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLlRleHRcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dFRleHRSZWYgfHwgZGVmYXVsdElucHV0VGV4dDsgY29udGV4dDp7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFRleHRhcmVhIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDx0ZXh0YXJlYSBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHBJbnB1dFRleHRhcmVhIGNsYXNzPVwidy1mdWxsIHAtaW5wdXR0ZXh0YXJlYSBwLWlucHV0dGV4dCBwLWNvbXBvbmVudCBwLWVsZW1lbnRcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIFtjb2xzXT1cInByb3BlcnR5LmNvbHNcIiBbcm93c109XCJwcm9wZXJ0eS5yb3dzXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5UZXh0YXJlYVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0VGV4dGFyZWFSZWYgfHwgZGVmYXVsdElucHV0VGV4dGFyZWE7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0U2VhcmNoIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHR5cGU9XCJzZWFyY2hcIiBwSW5wdXRUZXh0IGNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIiAvPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLlNlYXJjaFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0U2VhcmNoUmVmIHx8IGRlZmF1bHRJbnB1dFNlYXJjaDsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRUZWwgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cInRlbFwiIHBJbnB1dFRleHQgY2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIC8+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuVGVsXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRUZWxSZWYgfHwgZGVmYXVsdElucHV0VGVsOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFVybCBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiB0eXBlPVwidXJsXCIgcElucHV0VGV4dCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5VcmxcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dFVybFJlZiB8fCBkZWZhdWx0SW5wdXRVcmw7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RW1haWwgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cImVtYWlsXCIgcElucHV0VGV4dCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5FbWFpbFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RW1haWxSZWYgfHwgZGVmYXVsdElucHV0RW1haWw7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0UGFzc3dvcmQgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cInBhc3N3b3JkXCIgcFBhc3N3b3JkIGNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIiAvPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLlBhc3N3b3JkXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRQYXNzd29yZFJlZiB8fCBkZWZhdWx0SW5wdXRQYXNzd29yZDsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXREYXRlIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxwLWNhbGVuZGFyIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgW2RhdGVGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiIFtzaG93V2Vla109XCJ0cnVlXCIgW3Nob3dJY29uXT1cInRydWVcIiBzdHlsZUNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIj48L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuRGF0ZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RGF0ZVJlZiB8fCBkZWZhdWx0SW5wdXREYXRlOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dE1vbnRoIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxwLWNhbGVuZGFyIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgW2RhdGVGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiIFtzaG93V2Vla109XCJmYWxzZVwiIHZpZXc9XCJtb250aFwiIFtzaG93SWNvbl09XCJ0cnVlXCIgc3R5bGVDbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCI+PC9wLWNhbGVuZGFyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLk1vbnRoXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRNb250aFJlZiB8fCBkZWZhdWx0SW5wdXRNb250aDsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRXZWVrIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHR5cGU9XCJ3ZWVrXCIgcElucHV0VGV4dCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5XZWVrXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRXZWVrUmVmIHx8IGRlZmF1bHRJbnB1dFdlZWs7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0VGltZSBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8cC1jYWxlbmRhciBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIFtkYXRlRm9ybWF0XT1cImRhdGVGb3JtYXRcIiBbc2hvd1RpbWVdPVwidHJ1ZVwiIFt0aW1lT25seV09XCJ0cnVlXCIgW3Nob3dXZWVrXT1cImZhbHNlXCIgW3Nob3dJY29uXT1cInRydWVcIiBzdHlsZUNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIj48L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuVGltZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0VGltZVJlZiB8fCBkZWZhdWx0SW5wdXRUaW1lOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dERhdGV0aW1lTG9jYWwgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHAtY2FsZW5kYXIgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiBbZGF0ZUZvcm1hdF09XCJkYXRlRm9ybWF0XCIgW3Nob3dUaW1lXT1cInRydWVcIiBbc2hvd1dlZWtdPVwiZmFsc2VcIiBbc2hvd0ljb25dPVwidHJ1ZVwiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EYXRldGltZUxvY2FsXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXREYXRldGltZUxvY2FsUmVmIHx8IGRlZmF1bHRJbnB1dERhdGV0aW1lTG9jYWw7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0TnVtYmVyIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxwLWlucHV0TnVtYmVyIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgbW9kZT1cImRlY2ltYWxcIiBbc2hvd0J1dHRvbnNdPVwiIXByb3BlcnR5LnJlYWRPbmx5XCIgY2xhc3M9XCJ3LWZ1bGxcIiBzdHlsZUNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIj48L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuTnVtYmVyXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXROdW1iZXJSZWYgfHwgZGVmYXVsdElucHV0TnVtYmVyOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFJhbmdlIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHR5cGU9XCJyYW5nZVwiIFttaW5dPVwicHJvcGVydHkubWluXCIgW21heF09XCJwcm9wZXJ0eS5tYXhcIiBbc3RlcF09XCJwcm9wZXJ0eS5zdGVwXCIgcElucHV0VGV4dCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5SYW5nZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0UmFuZ2VSZWYgfHwgZGVmYXVsdElucHV0UmFuZ2U7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0Q29sb3IgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cImNvbG9yXCIgcElucHV0VGV4dCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5Db2xvclwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0Q29sb3JSZWYgfHwgZGVmYXVsdElucHV0Q29sb3I7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0Qm9vbCBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCIgbGV0LWZvcm1Hcm91cD1cImZvcm1Hcm91cFwiPlxyXG4gICAgICAgICAgPHAtY2hlY2tib3ggKm5nSWY9XCJwcm9wZXJ0eS5yZXF1aXJlZFwiIFtiaW5hcnldPVwidHJ1ZVwiIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbcHJvcGVydHkubmFtZV1cIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIFtyZWFkb25seV09XCJwcm9wZXJ0eS5yZWFkT25seVwiPjwvcC1jaGVja2JveD5cclxuICAgICAgICAgIDxwLXRyaVN0YXRlQ2hlY2tib3ggKm5nSWY9XCIhcHJvcGVydHkucmVxdWlyZWRcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BlcnR5Lm5hbWVdXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiBbcmVhZG9ubHldPVwicHJvcGVydHkucmVhZE9ubHlcIj48L3AtdHJpU3RhdGVDaGVja2JveD5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5Cb29sXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRCb29sUmVmIHx8IGRlZmF1bHRJbnB1dEJvb2w7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RGF0ZXRpbWVPZmZzZXQgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHAtY2FsZW5kYXIgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiBbZGF0ZUZvcm1hdF09XCJkYXRlRm9ybWF0XCIgW3Nob3dUaW1lXT1cInRydWVcIiBbc2hvd1dlZWtdPVwiZmFsc2VcIiBbc2hvd0ljb25dPVwidHJ1ZVwiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EYXRldGltZU9mZnNldFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RGF0ZXRpbWVPZmZzZXRSZWYgfHwgZGVmYXVsdElucHV0RGF0ZXRpbWVPZmZzZXQ7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RHVyYXRpb24gbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHAtY2FsZW5kYXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EdXJhdGlvblwiIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgW2RhdGVGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiIFtzaG93VGltZV09XCJ0cnVlXCIgW3RpbWVPbmx5XT1cInRydWVcIiBbc2hvd1dlZWtdPVwiZmFsc2VcIiBbc2hvd0ljb25dPVwidHJ1ZVwiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EdXJhdGlvblwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RHVyYXRpb25SZWYgfHwgZGVmYXVsdElucHV0RHVyYXRpb247IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0SW1hZ2UgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHJ3LWltYWdlIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFthY2NlcHRdPVwicHJvcGVydHkucGxhY2Vob2xkZXJcIj48L3J3LWltYWdlPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLkltYWdlXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRJbWFnZVJlZiB8fCBkZWZhdWx0SW5wdXRJbWFnZTsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRGaWxlIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxydy1maWxlIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtmaWxlTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2FjY2VwdF09XCJwcm9wZXJ0eS5wbGFjZWhvbGRlclwiPjwvcnctZmlsZT5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5GaWxlXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRGaWxlUmVmIHx8IGRlZmF1bHRJbnB1dEZpbGU7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0T2JqZWN0IGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnJhY2VcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cclxuICAgICAgICAgICAgICA8cnctZm9ybSBbZm9ybUdyb3VwXT1cIihmb3JtR3JvdXAuY29udHJvbHNbcHJvcGVydHkubmFtZV0gfCBhcyA6IEZvcm1Hcm91cClcIiBbdGVtcGxhdGVdPVwicHJvcGVydHkuX3RlbXBsYXRlcy5kZWZhdWx0XCIgW2FwaU5hbWVdPVwiYXBpTmFtZVwiPjwvcnctZm9ybT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5PYmplY3RcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dE9iamVjdFJlZiB8fCBkZWZhdWx0SW5wdXRPYmplY3Q7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0Q29sbGVjdGlvbiBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJyYWNlXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgY2RrRHJvcExpc3QgW2Nka0Ryb3BMaXN0RGF0YV09XCJ7IHByb3BlcnR5OiBwcm9wZXJ0eSwgZm9ybUFycmF5OiAoZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BlcnR5Lm5hbWVdIHwgYXMgOiBGb3JtQXJyYXkpfVwiIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiY29sbGVjdGlvbkl0ZW1Ecm9wcGVkKCRldmVudClcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB0ZW1wbGF0ZSBvZiBnZXRDb2xsZWN0aW9uRW50cnlUZW1wbGF0ZXMocHJvcGVydHkpXCIgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIGNka0RyYWc+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1ncmlwLWxpbmVzXCIgY2RrRHJhZ0hhbmRsZT48L2k+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnJhY2VcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHJ3LWZvcm0gW2Zvcm1Hcm91cF09XCIoKGZvcm1Hcm91cC5jb250cm9sc1twcm9wZXJ0eS5uYW1lXSB8IGFzIDogRm9ybUFycmF5KS5jb250cm9sc1tOdW1iZXIucGFyc2VJbnQodGVtcGxhdGUudGl0bGUhKV0gfCBhcyA6IEZvcm1Hcm91cClcIiBbdGVtcGxhdGVdPVwidGVtcGxhdGVcIiBbYXBpTmFtZV09XCJhcGlOYW1lXCIgY2xhc3M9XCJ3LWZ1bGxcIj48L3J3LWZvcm0+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwiZmFzIGZhLXRyYXNoXCIgY2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZCBwLWJ1dHRvbi1kYW5nZXIgbWwtMiBtYi0zXCIgKGNsaWNrKT1cImRlbGV0ZUl0ZW1Gcm9tQ29sbGVjdGlvbihwcm9wZXJ0eSwgZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BlcnR5Lm5hbWVdLCB0ZW1wbGF0ZSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cImZhcyBmYS1wbHVzXCIgY2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZCBwLWJ1dHRvbi1pbmZvXCIgKGNsaWNrKT1cImFkZE5ld0l0ZW1Ub0NvbGxlY3Rpb24ocHJvcGVydHksIGZvcm1Hcm91cC5jb250cm9sc1twcm9wZXJ0eS5uYW1lXSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5Db2xsZWN0aW9uXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRDb2xsZWN0aW9uUmVmIHx8IGRlZmF1bHRJbnB1dENvbGxlY3Rpb247IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RGVmYXVsdCBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiB0eXBlPVwidGV4dFwiIHBJbnB1dFRleHQgY2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIC8+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXREZWZhdWx0UmVmIHx8IGRlZmF1bHRJbnB1dERlZmF1bHQ7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8dmFsLWVycm9ycyBbY29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZSB8fCBudWxsXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cInJlcXVpcmVkXCI+VGhlIGZpZWxkICd7e3Byb3BlcnR5LnByb21wdCB8fCBwcm9wZXJ0eS5uYW1lfX0nIGlzIHJlcXVpcmVkLjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cImVtYWlsXCI+VGhlIGVtYWlsIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cIm1pblwiIGxldC1lcnJvcj1cImVycm9yXCI+J3t7cHJvcGVydHkucHJvbXB0IHx8IHByb3BlcnR5Lm5hbWV9fScgbXVzdCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8ge3sgZXJyb3IubWluIH19LjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cIm1heFwiIGxldC1lcnJvcj1cImVycm9yXCI+J3t7cHJvcGVydHkucHJvbXB0IHx8IHByb3BlcnR5Lm5hbWV9fScgbXVzdCBiZSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8ge3sgZXJyb3IubWF4IH19LjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cIm1pbmxlbmd0aFwiIGxldC1lcnJvcj1cImVycm9yXCI+VGhlIGxlbmd0aCBvZiAne3twcm9wZXJ0eS5wcm9tcHQgfHwgcHJvcGVydHkubmFtZX19JyBtdXN0IGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB7eyBlcnJvci5yZXF1aXJlZExlbmd0aCB9fS48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgdmFsRXJyb3I9XCJtYXhsZW5ndGhcIiBsZXQtZXJyb3I9XCJlcnJvclwiPlRoZSBsZW5ndGggb2YgJ3t7cHJvcGVydHkucHJvbXB0IHx8IHByb3BlcnR5Lm5hbWV9fScgbXVzdCBiZSBzaG9ydGVyIHRoYW4gb3IgZXF1YWwgdG8ge3sgZXJyb3IucmVxdWlyZWRMZW5ndGggfX0uPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlIHZhbEVycm9yPVwicGF0dGVyblwiIGxldC1lcnJvcj1cImVycm9yXCI+VGhlIHZhbHVlIGZvciAne3twcm9wZXJ0eS5wcm9tcHQgfHwgcHJvcGVydHkubmFtZX19JyBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVybiB7eyBlcnJvciB9fS48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgdmFsRXJyb3I9XCJyZW1vdGVcIiBsZXQtZXJyb3I9XCJlcnJvclwiPnt7IGVycm9yIH19PC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvdmFsLWVycm9ycz5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LWZvcm0vcmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LWZvcm0vcmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFtQixTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFZLFlBQVksRUFBWSxRQUFRLEVBQWUsTUFBTSx5QkFBeUIsQ0FBQztBQUVsRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVOUQsTUFBTSxPQUFPLDBCQUEwQjtJQTRHckMsWUFDVSxZQUF5QixFQUN6QixrQkFBcUMsRUFDckMsZUFBK0IsRUFDL0IsUUFBbUM7UUFIbkMsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDekIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUNyQyxvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDL0IsYUFBUSxHQUFSLFFBQVEsQ0FBMkI7UUFSdEMsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QixjQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLFdBQU0sR0FBRyxNQUFNLENBQUM7SUFPbkIsQ0FBQztJQXRCTCxJQUFXLFlBQVk7UUFDckIsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FB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QyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJNUMsc0JBQXNCO3NCQURyQixZQUFZO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJdEQsZ0JBQWdCO3NCQURmLFlBQVk7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJaEQsYUFBYTtzQkFEWixZQUFZO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSTdDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUk1QyxjQUFjO3NCQURiLFlBQVk7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJOUMsa0JBQWtCO3NCQURqQixZQUFZO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJbEQsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtEcmFnRHJvcCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xyXG5pbXBvcnQgeyBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIElucHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgUHJvcGVydHksIFByb3BlcnR5VHlwZSwgUmVzb3VyY2UsIFRlbXBsYXRlLCBUZW1wbGF0ZUR0byB9IGZyb20gJ0B3ZXJ0enVpL25neC1oYWwtY2xpZW50JztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFByb2JsZW1EZXRhaWxzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3Byb2JsZW0tZGV0YWlscyc7XHJcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9ybS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUkVTVHdvcmxkQ2xpZW50IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzdHdvcmxkLWNsaWVudCc7XHJcbmltcG9ydCB7IFJFU1R3b3JsZENsaWVudENvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXN0d29ybGQtY2xpZW50LWNvbGxlY3Rpb24nO1xyXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3J3LWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1lZGl0LWZvcm0uY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJlc3R3b3JsZEVkaXRGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgZm9ybUdyb3VwITogRm9ybUdyb3VwO1xuXG4gIEBJbnB1dCgpXG4gIHRlbXBsYXRlITogVGVtcGxhdGU7XG5cbiAgQElucHV0KClcbiAgYXBpTmFtZT86IHN0cmluZztcblxuICBAQ29udGVudENoaWxkKCdpbnB1dE9wdGlvbnNTaW5nbGUnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRPcHRpb25zU2luZ2xlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRPcHRpb25zTXVsdGlwbGUnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRPcHRpb25zTXVsdGlwbGVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dE9wdGlvbnMnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRPcHRpb25zUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRIaWRkZW4nLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRIaWRkZW5SZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFRleHQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRUZXh0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRUZXh0YXJlYScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFRleHRhcmVhUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRTZWFyY2gnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRTZWFyY2hSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFRlbCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFRlbFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0VXJsJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0VXJsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRFbWFpbCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dEVtYWlsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRQYXNzd29yZCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFBhc3N3b3JkUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXREYXRlJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0RGF0ZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0TW9udGgnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRNb250aFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0V2VlaycsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFdlZWtSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFRpbWUnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRUaW1lUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXREYXRldGltZUxvY2FsJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0RGF0ZXRpbWVMb2NhbFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0TnVtYmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0TnVtYmVyUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRSYW5nZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFJhbmdlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRDb2xvcicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dENvbG9yUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRCb29sJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0Qm9vbFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RGF0ZXRpbWVPZmZzZXQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXREYXRldGltZU9mZnNldFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RHVyYXRpb24nLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXREdXJhdGlvblJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0SW1hZ2UnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRJbWFnZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RmlsZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dEZpbGVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dE9iamVjdCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dE9iamVjdFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0Q29sbGVjdGlvbicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dENvbGxlY3Rpb25SZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dERlZmF1bHQnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXREZWZhdWx0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgcHVibGljIGdldCBQcm9wZXJ0eVR5cGUoKSB7XHJcbiAgICByZXR1cm4gUHJvcGVydHlUeXBlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkYXRlRm9ybWF0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoMzMzMywgMTAsIDIyKVxyXG4gICAgICAudG9Mb2NhbGVEYXRlU3RyaW5nKClcclxuICAgICAgLnJlcGxhY2UoXCIyMlwiLCBcImRkXCIpXHJcbiAgICAgIC5yZXBsYWNlKFwiMTFcIiwgXCJtbVwiKVxyXG4gICAgICAucmVwbGFjZShcIjMzMzNcIiwgXCJ5eVwiKVxyXG4gICAgICAucmVwbGFjZShcIjMzXCIsIFwieVwiKTtcclxuICB9XG5cbiAgcHVibGljIEZvcm1Hcm91cCA9IEZvcm1Hcm91cDtcbiAgcHVibGljIEZvcm1BcnJheSA9IEZvcm1BcnJheTtcbiAgcHVibGljIE51bWJlciA9IE51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9mb3JtU2VydmljZTogRm9ybVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY2xpZW50czogUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvblxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmZvcm1Hcm91cClcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW2Zvcm1Hcm91cF0gaXMgcmVxdWlyZWQgb24gPHJ3LWZvcm0+XCIpO1xyXG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbdGVtcGxhdGVdIGlzIHJlcXVpcmVkIG9uIDxydy1mb3JtPlwiKTtcclxuICAgIGlmICghdGhpcy5hcGlOYW1lKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbYXBpTmFtZV0gaXMgcmVxdWlyZWQgb24gPHJ3LWZvcm0+XCIpO1xyXG4gIH1cclxuXG4gIHB1YmxpYyBnZXRUb29sdGlwKHJlc291cmNlOiBSZXNvdXJjZSwga2V5c1RvRXhjbHVkZT86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b29sdGlwID0gT2JqZWN0LmVudHJpZXMocmVzb3VyY2UpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4gIShrZXkuc3RhcnRzV2l0aCgnXycpIHx8IFsnY3JlYXRlZEF0JywgJ2NyZWF0ZWRCeScsICdsYXN0Q2hhbmdlZEF0JywgJ2xhc3RDaGFuZ2VkQnknLCAndGltZXN0YW1wJ10uaW5jbHVkZXMoa2V5KSB8fCBrZXlzVG9FeGNsdWRlPy5pbmNsdWRlcyhrZXkpKSlcbiAgICAgIC5yZWR1Y2UoKHByZXYsIFtrZXksIHZhbHVlXSwgaW5kZXgpID0+IGAke3ByZXZ9JHtpbmRleCA9PT0gMCA/ICcnIDogJ1xcbid9JHtrZXl9OiAke1Jlc3R3b3JsZEVkaXRGb3JtQ29tcG9uZW50Lmpzb25TdHJpbmdpZnlXaXRoRWxpcHNpcyh2YWx1ZSl9YCwgJycpO1xuXG4gICAgcmV0dXJuIHRvb2x0aXA7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBqc29uU3RyaW5naWZ5V2l0aEVsaXBzaXModmFsdWU6IHVua25vd24pIHtcbiAgICBjb25zdCBtYXhMZW5ndGggPSAyMDA7XG4gICAgY29uc3QgZW5kID0gMTA7XG4gICAgY29uc3Qgc3RhcnQgPSBtYXhMZW5ndGggLSBlbmQgLSAyO1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgY29uc3Qgc2hvcnRlbmVkID0ganNvbi5sZW5ndGggPiBtYXhMZW5ndGggPyBqc29uLnN1YnN0cmluZygwLCBzdGFydCkgKyAn4oCmJyArIGpzb24uc3Vic3RyaW5nKGpzb24ubGVuZ3RoIC0gZW5kKSA6IGpzb247XG5cbiAgICByZXR1cm4gc2hvcnRlbmVkO1xuICB9XG5cbiAgcHVibGljIGdldENvbGxlY3Rpb25FbnRyeVRlbXBsYXRlcyhwcm9wZXJ0eT86IFByb3BlcnR5KTogVGVtcGxhdGVbXSB7XG4gICAgaWYgKCFwcm9wZXJ0eSlcclxuICAgICAgcmV0dXJuIFtdO1xyXG5cclxuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhwcm9wZXJ0eS5fdGVtcGxhdGVzKVxyXG4gICAgICAuZmlsdGVyKChba2V5LF0pID0+IE51bWJlci5pc0ludGVnZXIoTnVtYmVyLnBhcnNlSW50KGtleSkpKVxyXG4gICAgICAubWFwKChbLCB2YWx1ZV0pID0+IHZhbHVlKTtcclxuICB9XG5cbiAgcHVibGljIGFkZE5ld0l0ZW1Ub0NvbGxlY3Rpb24ocHJvcGVydHk6IFByb3BlcnR5LCBmb3JtQXJyYXk6IEZvcm1BcnJheSB8IEFic3RyYWN0Q29udHJvbCk6IHZvaWQge1xuICAgIGlmICghKGZvcm1BcnJheSBpbnN0YW5jZW9mIEZvcm1BcnJheSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zvcm1BcnJheSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgRm9ybUFycmF5LicpO1xyXG5cclxuICAgIGNvbnN0IG1heEluZGV4ID0gTWF0aC5tYXgoLi4uT2JqZWN0LmtleXMocHJvcGVydHkuX3RlbXBsYXRlcylcclxuICAgICAgLm1hcChrZXkgPT4gTnVtYmVyLnBhcnNlSW50KGtleSkpXHJcbiAgICAgIC5maWx0ZXIoa2V5ID0+IE51bWJlci5pc1NhZmVJbnRlZ2VyKGtleSkpKTtcclxuICAgIGNvbnN0IG5leHRJbmRleCA9IG1heEluZGV4IDwgMCA/IDAgOiBtYXhJbmRleCArIDE7XG5cbiAgICBjb25zdCBkZWZhdWx0VGVtcGxhdGUgPSBwcm9wZXJ0eS5fdGVtcGxhdGVzWydkZWZhdWx0J107XHJcbiAgICBjb25zdCBjb3BpZWRUZW1wbGF0ZUR0byA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmYXVsdFRlbXBsYXRlKSkgYXMgVGVtcGxhdGVEdG87XHJcbiAgICBjb25zdCBjb3BpZWRUZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShjb3BpZWRUZW1wbGF0ZUR0byk7XHJcbiAgICBjb3BpZWRUZW1wbGF0ZS50aXRsZSA9IG5leHRJbmRleC50b1N0cmluZygpO1xyXG5cclxuICAgIHByb3BlcnR5Ll90ZW1wbGF0ZXNbY29waWVkVGVtcGxhdGUudGl0bGVdID0gY29waWVkVGVtcGxhdGU7XHJcbiAgICBmb3JtQXJyYXkucHVzaCh0aGlzLl9mb3JtU2VydmljZS5jcmVhdGVGb3JtR3JvdXBGcm9tVGVtcGxhdGUoZGVmYXVsdFRlbXBsYXRlKSk7XHJcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVJdGVtRnJvbUNvbGxlY3Rpb24ocHJvcGVydHk6IFByb3BlcnR5LCBmb3JtQXJyYXk6IEZvcm1BcnJheSB8IEFic3RyYWN0Q29udHJvbCwgdGVtcGxhdGU6IFRlbXBsYXRlKTogdm9pZCB7XG4gICAgaWYgKCF0ZW1wbGF0ZS50aXRsZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGRlbGV0ZSB0aGUgaXRlbSwgYmVjYXVzZSB0aGUgdGVtcGxhdGUgJyR7dGVtcGxhdGV9JyBkb2VzIG5vdCBoYXZlIGEgdGl0bGUuYCk7XG5cbiAgICBpZiAoIShmb3JtQXJyYXkgaW5zdGFuY2VvZiBGb3JtQXJyYXkpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmb3JtQXJyYXkgaXMgbm90IGFuIGluc3RhbmNlIG9mIEZvcm1BcnJheS4nKTtcblxuICAgIGNvbnN0IHRlbXBsYXRlcyA9IHByb3BlcnR5Ll90ZW1wbGF0ZXM7XHJcbiAgICBkZWxldGUgdGVtcGxhdGVzW3RlbXBsYXRlLnRpdGxlXTtcclxuXHJcbiAgICBmb3JtQXJyYXkucmVtb3ZlQXQoTnVtYmVyLnBhcnNlSW50KHRlbXBsYXRlLnRpdGxlKSk7XHJcbiAgfVxuXG4gIHB1YmxpYyBjb2xsZWN0aW9uSXRlbURyb3BwZWQoJGV2ZW50OiBDZGtEcmFnRHJvcDx7IHByb3BlcnR5OiBQcm9wZXJ0eTsgZm9ybUFycmF5OiBGb3JtQXJyYXkgfT4pIHtcbiAgICBjb25zdCBmb3JtQXJyYXkgPSAkZXZlbnQuY29udGFpbmVyLmRhdGEuZm9ybUFycmF5O1xyXG4gICAgY29uc3QgcHJldmlvdXNJbmRleCA9ICRldmVudC5wcmV2aW91c0luZGV4O1xyXG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gJGV2ZW50LmN1cnJlbnRJbmRleDtcclxuICAgIGNvbnN0IG1vdmVtZW50RGlyZWN0aW9uID0gY3VycmVudEluZGV4ID4gcHJldmlvdXNJbmRleCA/IDEgOiAtMTtcclxuXHJcbiAgICAvLyBNb3ZlIGluIEZvcm1BcnJheVxyXG4gICAgLy8gV2UgZG8gbm90IG5lZWQgdG8gbW92ZSB0aGUgaXRlbSBpbiB0aGUgX3RlbXBsYXRlcyBvYmplY3RcclxuICAgIGNvbnN0IG1vdmVkQ29udHJvbCA9IGZvcm1BcnJheS5hdChwcmV2aW91c0luZGV4KTtcclxuICAgIGZvciAobGV0IGkgPSBwcmV2aW91c0luZGV4OyBpICogbW92ZW1lbnREaXJlY3Rpb24gPCBjdXJyZW50SW5kZXggKiBtb3ZlbWVudERpcmVjdGlvbjsgaSA9IGkgKyBtb3ZlbWVudERpcmVjdGlvbikge1xyXG4gICAgICBmb3JtQXJyYXkuc2V0Q29udHJvbChpLCBmb3JtQXJyYXkuYXQoaSArIG1vdmVtZW50RGlyZWN0aW9uKSk7XHJcbiAgICB9XHJcbiAgICBmb3JtQXJyYXkuc2V0Q29udHJvbChjdXJyZW50SW5kZXgsIG1vdmVkQ29udHJvbCk7XHJcblxyXG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcblxyXG4gICAgY29uc29sZS5sb2coJGV2ZW50KTtcclxuICB9XG5cclxuXHJcbiAgcHVibGljIGFzeW5jIG9uT3B0aW9uc0ZpbHRlcmVkKHByb3BlcnR5OiBQcm9wZXJ0eSwgZXZlbnQ6IHsgb3JpZ2luYWxFdmVudDogdW5rbm93bjsgZmlsdGVyOiBzdHJpbmcgfCBudWxsIH0pIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBwcm9wZXJ0eT8ub3B0aW9ucztcclxuXHJcbiAgICBpZiAoIW9wdGlvbnM/Lmxpbms/LmhyZWYgfHwgIWV2ZW50LmZpbHRlciB8fCBldmVudC5maWx0ZXIgPT09ICcnKVxyXG4gICAgICByZXR1cm47XHJcblxyXG5cclxuICAgIGNvbnN0IHRlbXBsYXRlZFVyaSA9IG9wdGlvbnMubGluay5ocmVmO1xyXG4gICAgbGV0IGZpbHRlciA9IGBjb250YWlucygke29wdGlvbnMucHJvbXB0RmllbGR9LCAnJHtldmVudC5maWx0ZXJ9JylgO1xyXG4gICAgaWYgKG9wdGlvbnMudmFsdWVGaWVsZD8udG9Mb3dlckNhc2UoKSA9PT0gJ2lkJyAmJiAhTnVtYmVyLmlzTmFOKE51bWJlci5wYXJzZUludChldmVudC5maWx0ZXIpKSlcclxuICAgICAgZmlsdGVyID0gYCgke29wdGlvbnMudmFsdWVGaWVsZH0gZXEgJHtldmVudC5maWx0ZXJ9KSAgb3IgKCR7ZmlsdGVyfSlgO1xyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKS5nZXRMaXN0QnlVcmkodGVtcGxhdGVkVXJpLCB7ICRmaWx0ZXI6IGZpbHRlciwgJHRvcDogMTAgfSk7XHJcbiAgICBpZiAoIXJlc3BvbnNlLm9rIHx8IFByb2JsZW1EZXRhaWxzLmlzUHJvYmxlbURldGFpbHMocmVzcG9uc2UuYm9keSkgfHwgIXJlc3BvbnNlLmJvZHkpIHtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IGBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZXR0aW5nIHRoZSBmaWx0ZXJlZCBpdGVtcy5gO1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiBtZXNzYWdlLCBkYXRhOiByZXNwb25zZSB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGl0ZW1zID0gcmVzcG9uc2UuYm9keS5fZW1iZWRkZWQuaXRlbXM7XHJcbiAgICBvcHRpb25zLmlubGluZSA9IGl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDbGllbnQoKTogUkVTVHdvcmxkQ2xpZW50IHtcclxuICAgIGlmICghdGhpcy5hcGlOYW1lKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgYSBjbGllbnQsIGJlY2F1c2UgdGhlIGFwaU5hbWUgaXMgbm90IHNldC4nKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50cy5nZXRDbGllbnQodGhpcy5hcGlOYW1lKTtcclxuICB9XG59XG4iLCI8ZGl2ICpuZ0Zvcj1cImxldCBwcm9wZXJ0eSBvZiB0ZW1wbGF0ZS5wcm9wZXJ0aWVzXCIgY2xhc3M9XCJncmlkIGZpZWxkXCIgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cclxuICA8bGFiZWwgKm5nSWY9XCJwcm9wZXJ0eS50eXBlICE9PSBQcm9wZXJ0eVR5cGUuSGlkZGVuXCIgW2F0dHIuZm9yXT1cInByb3BlcnR5Lm5hbWVcIiBjbGFzcz1cImNvbC0xMiBtYi0yIG1kOmNvbC0yIG1kOm1iLTBcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIFtjbGFzcy5oYXNDaGlsZHJlbl09XCJwcm9wZXJ0eS5fdGVtcGxhdGVzXCI+e3twcm9wZXJ0eS5wcm9tcHQgfHwgcHJvcGVydHkubmFtZX19PC9sYWJlbD5cclxuICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1kOmNvbC0xMFwiPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0T3B0aW9ucyBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dE9wdGlvbnNTaW5nbGUgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxwLWRyb3Bkb3duIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgW29wdGlvbnNdPVwicHJvcGVydHkub3B0aW9ucy5pbmxpbmVcIiBbZmlsdGVyQnldPVwiKHByb3BlcnR5Lm9wdGlvbnMucHJvbXB0RmllbGQgfHwgJ3Byb21wdCcpICsgJywnICsgKHByb3BlcnR5Lm9wdGlvbnMudmFsdWVGaWVsZCB8fCAndmFsdWUnKVwiIFtvcHRpb25WYWx1ZV09XCJwcm9wZXJ0eS5vcHRpb25zLnZhbHVlRmllbGQgfHwgJ3ZhbHVlJ1wiIFtyZWFkb25seV09XCJwcm9wZXJ0eS5yZWFkT25seVwiIFtyZXF1aXJlZF09XCJwcm9wZXJ0eS5yZXF1aXJlZCB8fCBwcm9wZXJ0eS5vcHRpb25zLm1pbkl0ZW1zID4gMFwiIFtmaWx0ZXJdPVwidHJ1ZVwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCIgW3Nob3dDbGVhcl09XCIhcHJvcGVydHkucmVxdWlyZWQgfHwgcHJvcGVydHkub3B0aW9ucy5taW5JdGVtcyA8PSAwXCIgKG9uRmlsdGVyKT1cIm9uT3B0aW9uc0ZpbHRlcmVkKHByb3BlcnR5LCAkZXZlbnQpXCIgc3R5bGVDbGFzcz1cInctZnVsbFwiIFtmaWx0ZXJQbGFjZWhvbGRlcl09XCJwcm9wZXJ0eT8ub3B0aW9ucz8ubGluaz8uaHJlZiA/ICdzZWFyY2ggZm9yIG1vcmUgcmVzdWx0cycgOiAnJ1wiPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1pdGVtIHBUZW1wbGF0ZT1cInNlbGVjdGVkSXRlbVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBbcFRvb2x0aXBdPVwiZ2V0VG9vbHRpcChpdGVtLCBbcHJvcGVydHkub3B0aW9ucy5wcm9tcHRGaWVsZCB8fCAncHJvbXB0JywgcHJvcGVydHkub3B0aW9ucy52YWx1ZUZpZWxkIHx8ICd2YWx1ZSddKVwiPnt7aXRlbVtwcm9wZXJ0eS5vcHRpb25zLnByb21wdEZpZWxkIHx8ICdwcm9tcHQnXX19ICh7e2l0ZW1bcHJvcGVydHkub3B0aW9ucy52YWx1ZUZpZWxkIHx8ICd2YWx1ZSddfX0pPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIFtwVG9vbHRpcF09XCJnZXRUb29sdGlwKGl0ZW0sIFtwcm9wZXJ0eS5vcHRpb25zLnByb21wdEZpZWxkIHx8ICdwcm9tcHQnLCBwcm9wZXJ0eS5vcHRpb25zLnZhbHVlRmllbGQgfHwgJ3ZhbHVlJ10pXCI+e3tpdGVtW3Byb3BlcnR5Lm9wdGlvbnMucHJvbXB0RmllbGQgfHwgJ3Byb21wdCddfX0gKHt7aXRlbVtwcm9wZXJ0eS5vcHRpb25zLnZhbHVlRmllbGQgfHwgJ3ZhbHVlJ119fSk8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvcC1kcm9wZG93bj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFwcm9wZXJ0eS5vcHRpb25zLm1heEl0ZW1zIHx8IHByb3BlcnR5Lm9wdGlvbnMubWF4SXRlbXMgPT0gMVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dE9wdGlvbnNTaW5nbGVSZWYgfHwgZGVmYXVsdElucHV0T3B0aW9uc1NpbmdsZTsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0T3B0aW9uc011bHRpcGxlIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICA8cC1tdWx0aVNlbGVjdCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIFtvcHRpb25zXT1cInByb3BlcnR5Lm9wdGlvbnMuaW5saW5lXCIgW29wdGlvbkxhYmVsXT1cInByb3BlcnR5Lm9wdGlvbnMucHJvbXB0RmllbGQgfHwgJ3Byb21wdCdcIiBbb3B0aW9uVmFsdWVdPVwicHJvcGVydHkub3B0aW9ucy52YWx1ZUZpZWxkIHx8ICd2YWx1ZSdcIiBbcmVhZG9ubHldPVwicHJvcGVydHkucmVhZE9ubHlcIiBbc2VsZWN0aW9uTGltaXRdPVwicHJvcGVydHkub3B0aW9ucy5tYXhJdGVtc1wiIFtyZXF1aXJlZF09XCJwcm9wZXJ0eS5yZXF1aXJlZCB8fCBwcm9wZXJ0eS5vcHRpb25zLm1pbkl0ZW1zID4gMFwiPjwvcC1tdWx0aVNlbGVjdD5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5Lm9wdGlvbnMubWF4SXRlbXMgPiAxXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0T3B0aW9uc011bHRpcGxlUmVmIHx8IGRlZmF1bHRJbnB1dE9wdGlvbnNNdWx0aXBsZTsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5Lm9wdGlvbnNcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0T3B0aW9uc1JlZiB8fCBkZWZhdWx0SW5wdXRPcHRpb25zOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiIXByb3BlcnR5Lm9wdGlvbnNcIj5cclxuICAgICAgPGRpdiBbbmdTd2l0Y2hdPVwicHJvcGVydHkudHlwZVwiPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dEhpZGRlbiBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiB0eXBlPVwiaGlkZGVuXCIgW3ZhbHVlXT1cInByb3BlcnR5LnZhbHVlXCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5IaWRkZW5cIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dEhpZGRlblJlZiB8fCBkZWZhdWx0SW5wdXRIaWRkZW47IGNvbnRleHQ6eyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFRleHQgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cInRleHRcIiBwSW5wdXRUZXh0IGNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIiAvPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLlRleHRcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dFRleHRSZWYgfHwgZGVmYXVsdElucHV0VGV4dDsgY29udGV4dDp7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFRleHRhcmVhIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDx0ZXh0YXJlYSBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHBJbnB1dFRleHRhcmVhIGNsYXNzPVwidy1mdWxsIHAtaW5wdXR0ZXh0YXJlYSBwLWlucHV0dGV4dCBwLWNvbXBvbmVudCBwLWVsZW1lbnRcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIFtjb2xzXT1cInByb3BlcnR5LmNvbHNcIiBbcm93c109XCJwcm9wZXJ0eS5yb3dzXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5UZXh0YXJlYVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0VGV4dGFyZWFSZWYgfHwgZGVmYXVsdElucHV0VGV4dGFyZWE7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0U2VhcmNoIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHR5cGU9XCJzZWFyY2hcIiBwSW5wdXRUZXh0IGNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIiAvPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLlNlYXJjaFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0U2VhcmNoUmVmIHx8IGRlZmF1bHRJbnB1dFNlYXJjaDsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRUZWwgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cInRlbFwiIHBJbnB1dFRleHQgY2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIC8+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuVGVsXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRUZWxSZWYgfHwgZGVmYXVsdElucHV0VGVsOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFVybCBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiB0eXBlPVwidXJsXCIgcElucHV0VGV4dCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5VcmxcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dFVybFJlZiB8fCBkZWZhdWx0SW5wdXRVcmw7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RW1haWwgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cImVtYWlsXCIgcElucHV0VGV4dCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5FbWFpbFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RW1haWxSZWYgfHwgZGVmYXVsdElucHV0RW1haWw7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0UGFzc3dvcmQgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cInBhc3N3b3JkXCIgcFBhc3N3b3JkIGNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIiAvPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLlBhc3N3b3JkXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRQYXNzd29yZFJlZiB8fCBkZWZhdWx0SW5wdXRQYXNzd29yZDsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXREYXRlIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxwLWNhbGVuZGFyIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgW2RhdGVGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiIFtzaG93V2Vla109XCJ0cnVlXCIgW3Nob3dJY29uXT1cInRydWVcIiBzdHlsZUNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIj48L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuRGF0ZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RGF0ZVJlZiB8fCBkZWZhdWx0SW5wdXREYXRlOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dE1vbnRoIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxwLWNhbGVuZGFyIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgW2RhdGVGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiIFtzaG93V2Vla109XCJmYWxzZVwiIHZpZXc9XCJtb250aFwiIFtzaG93SWNvbl09XCJ0cnVlXCIgc3R5bGVDbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCI+PC9wLWNhbGVuZGFyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLk1vbnRoXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRNb250aFJlZiB8fCBkZWZhdWx0SW5wdXRNb250aDsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRXZWVrIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHR5cGU9XCJ3ZWVrXCIgcElucHV0VGV4dCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5XZWVrXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRXZWVrUmVmIHx8IGRlZmF1bHRJbnB1dFdlZWs7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0VGltZSBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8cC1jYWxlbmRhciBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIFtkYXRlRm9ybWF0XT1cImRhdGVGb3JtYXRcIiBbc2hvd1RpbWVdPVwidHJ1ZVwiIFt0aW1lT25seV09XCJ0cnVlXCIgW3Nob3dXZWVrXT1cImZhbHNlXCIgW3Nob3dJY29uXT1cInRydWVcIiBzdHlsZUNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIj48L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuVGltZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0VGltZVJlZiB8fCBkZWZhdWx0SW5wdXRUaW1lOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dERhdGV0aW1lTG9jYWwgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHAtY2FsZW5kYXIgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiBbZGF0ZUZvcm1hdF09XCJkYXRlRm9ybWF0XCIgW3Nob3dUaW1lXT1cInRydWVcIiBbc2hvd1dlZWtdPVwiZmFsc2VcIiBbc2hvd0ljb25dPVwidHJ1ZVwiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EYXRldGltZUxvY2FsXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXREYXRldGltZUxvY2FsUmVmIHx8IGRlZmF1bHRJbnB1dERhdGV0aW1lTG9jYWw7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0TnVtYmVyIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxwLWlucHV0TnVtYmVyIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgbW9kZT1cImRlY2ltYWxcIiBbc2hvd0J1dHRvbnNdPVwiIXByb3BlcnR5LnJlYWRPbmx5XCIgY2xhc3M9XCJ3LWZ1bGxcIiBzdHlsZUNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIj48L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuTnVtYmVyXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXROdW1iZXJSZWYgfHwgZGVmYXVsdElucHV0TnVtYmVyOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFJhbmdlIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHR5cGU9XCJyYW5nZVwiIFttaW5dPVwicHJvcGVydHkubWluXCIgW21heF09XCJwcm9wZXJ0eS5tYXhcIiBbc3RlcF09XCJwcm9wZXJ0eS5zdGVwXCIgcElucHV0VGV4dCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5SYW5nZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0UmFuZ2VSZWYgfHwgZGVmYXVsdElucHV0UmFuZ2U7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0Q29sb3IgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cImNvbG9yXCIgcElucHV0VGV4dCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5Db2xvclwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0Q29sb3JSZWYgfHwgZGVmYXVsdElucHV0Q29sb3I7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0Qm9vbCBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCIgbGV0LWZvcm1Hcm91cD1cImZvcm1Hcm91cFwiPlxyXG4gICAgICAgICAgPHAtY2hlY2tib3ggKm5nSWY9XCJwcm9wZXJ0eS5yZXF1aXJlZFwiIFtiaW5hcnldPVwidHJ1ZVwiIFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXAuY29udHJvbHNbcHJvcGVydHkubmFtZV1cIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIFtyZWFkb25seV09XCJwcm9wZXJ0eS5yZWFkT25seVwiPjwvcC1jaGVja2JveD5cclxuICAgICAgICAgIDxwLXRyaVN0YXRlQ2hlY2tib3ggKm5nSWY9XCIhcHJvcGVydHkucmVxdWlyZWRcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BlcnR5Lm5hbWVdXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiBbcmVhZG9ubHldPVwicHJvcGVydHkucmVhZE9ubHlcIj48L3AtdHJpU3RhdGVDaGVja2JveD5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5Cb29sXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRCb29sUmVmIHx8IGRlZmF1bHRJbnB1dEJvb2w7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RGF0ZXRpbWVPZmZzZXQgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHAtY2FsZW5kYXIgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiBbZGF0ZUZvcm1hdF09XCJkYXRlRm9ybWF0XCIgW3Nob3dUaW1lXT1cInRydWVcIiBbc2hvd1dlZWtdPVwiZmFsc2VcIiBbc2hvd0ljb25dPVwidHJ1ZVwiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EYXRldGltZU9mZnNldFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RGF0ZXRpbWVPZmZzZXRSZWYgfHwgZGVmYXVsdElucHV0RGF0ZXRpbWVPZmZzZXQ7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RHVyYXRpb24gbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHAtY2FsZW5kYXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EdXJhdGlvblwiIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgW2RhdGVGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiIFtzaG93VGltZV09XCJ0cnVlXCIgW3RpbWVPbmx5XT1cInRydWVcIiBbc2hvd1dlZWtdPVwiZmFsc2VcIiBbc2hvd0ljb25dPVwidHJ1ZVwiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EdXJhdGlvblwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RHVyYXRpb25SZWYgfHwgZGVmYXVsdElucHV0RHVyYXRpb247IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0SW1hZ2UgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHJ3LWltYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbYWNjZXB0XT1cInByb3BlcnR5LnJlc3RXb3JsZEltYWdlLmFjY2VwdCA/PyBwcm9wZXJ0eS5wbGFjZWhvbGRlciA/PyAnaW1hZ2UvKidcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthbGlnbkltYWdlXT1cInByb3BlcnR5LnJlc3RXb3JsZEltYWdlLmFsaWduSW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthbHRdPVwicHJvcGVydHkucHJvbXB0ID8/IHByb3BlcnR5Lm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthc3BlY3RSYXRpb109XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZS5hc3BlY3RSYXRpb1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2JhY2tncm91bmRDb2xvcl09XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZS5iYWNrZ3JvdW5kQ29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjYW52YXNSb3RhdGlvbl09XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZS5jYW52YXNSb3RhdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb109XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZS5jb250YWluV2l0aGluQXNwZWN0UmF0aW9cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjcm9wcGVyXT1cInByb3BlcnR5LnJlc3RXb3JsZEltYWdlLmNyb3BwZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjcm9wcGVyTWF4SGVpZ2h0XT1cInByb3BlcnR5LnJlc3RXb3JsZEltYWdlLmNyb3BwZXJNYXhIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjcm9wcGVyTWF4V2lkdGhdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2UuY3JvcHBlck1heFdpZHRoXCJcclxuICAgICAgICAgICAgICAgICAgICBbY3JvcHBlck1pbkhlaWdodF09XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZS5jcm9wcGVyTWluSGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgICBbY3JvcHBlck1pbldpZHRoXT1cInByb3BlcnR5LnJlc3RXb3JsZEltYWdlLmNyb3BwZXJNaW5XaWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Nyb3BwZXJTdGF0aWNIZWlnaHRdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2UuY3JvcHBlclN0YXRpY0hlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Nyb3BwZXJTdGF0aWNXaWR0aF09XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZS5jcm9wcGVyU3RhdGljV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmaWxlTmFtZV09XCJwcm9wZXJ0eS5uYW1lICsgJy4nICsgKHByb3BlcnR5LnJlc3RXb3JsZEltYWdlLmZvcm1hdCA/PyAncG5nJylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2UuZm9ybWF0XCJcclxuICAgICAgICAgICAgICAgICAgICBbaW1hZ2VRdWFsaXR5XT1cInByb3BlcnR5LnJlc3RXb3JsZEltYWdlLmltYWdlUXVhbGl0eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2luaXRpYWxTdGVwU2l6ZV09XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZS5pbml0aWFsU3RlcFNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYWludGFpbkFzcGVjdFJhdGlvXT1cInByb3BlcnR5LnJlc3RXb3JsZEltYWdlLm1haW50YWluQXNwZWN0UmF0aW9cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvbmx5U2NhbGVEb3duXT1cInByb3BlcnR5LnJlc3RXb3JsZEltYWdlLm9ubHlTY2FsZURvd25cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZXNpemVUb1dpZHRoXT1cInByb3BlcnR5LnJlc3RXb3JsZEltYWdlLnJlc2l6ZVRvV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZXNpemVUb0hlaWdodF09XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZS5yZXNpemVUb0hlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3JvdW5kQ3JvcHBlcl09XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZS5yb3VuZENyb3BwZXJcIj48L3J3LWltYWdlPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLkltYWdlXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRJbWFnZVJlZiB8fCBkZWZhdWx0SW5wdXRJbWFnZTsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRGaWxlIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxydy1maWxlIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtmaWxlTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2FjY2VwdF09XCJwcm9wZXJ0eS5wbGFjZWhvbGRlclwiPjwvcnctZmlsZT5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5GaWxlXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRGaWxlUmVmIHx8IGRlZmF1bHRJbnB1dEZpbGU7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0T2JqZWN0IGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnJhY2VcIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cclxuICAgICAgICAgICAgICA8cnctZm9ybSBbZm9ybUdyb3VwXT1cIihmb3JtR3JvdXAuY29udHJvbHNbcHJvcGVydHkubmFtZV0gfCBhcyA6IEZvcm1Hcm91cClcIiBbdGVtcGxhdGVdPVwicHJvcGVydHkuX3RlbXBsYXRlcy5kZWZhdWx0XCIgW2FwaU5hbWVdPVwiYXBpTmFtZVwiPjwvcnctZm9ybT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5PYmplY3RcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dE9iamVjdFJlZiB8fCBkZWZhdWx0SW5wdXRPYmplY3Q7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0Q29sbGVjdGlvbiBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJyYWNlXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgY2RrRHJvcExpc3QgW2Nka0Ryb3BMaXN0RGF0YV09XCJ7IHByb3BlcnR5OiBwcm9wZXJ0eSwgZm9ybUFycmF5OiAoZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BlcnR5Lm5hbWVdIHwgYXMgOiBGb3JtQXJyYXkpfVwiIChjZGtEcm9wTGlzdERyb3BwZWQpPVwiY29sbGVjdGlvbkl0ZW1Ecm9wcGVkKCRldmVudClcIj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB0ZW1wbGF0ZSBvZiBnZXRDb2xsZWN0aW9uRW50cnlUZW1wbGF0ZXMocHJvcGVydHkpXCIgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiIGNka0RyYWc+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1ncmlwLWxpbmVzXCIgY2RrRHJhZ0hhbmRsZT48L2k+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnJhY2VcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgPHJ3LWZvcm0gW2Zvcm1Hcm91cF09XCIoKGZvcm1Hcm91cC5jb250cm9sc1twcm9wZXJ0eS5uYW1lXSB8IGFzIDogRm9ybUFycmF5KS5jb250cm9sc1tOdW1iZXIucGFyc2VJbnQodGVtcGxhdGUudGl0bGUhKV0gfCBhcyA6IEZvcm1Hcm91cClcIiBbdGVtcGxhdGVdPVwidGVtcGxhdGVcIiBbYXBpTmFtZV09XCJhcGlOYW1lXCIgY2xhc3M9XCJ3LWZ1bGxcIj48L3J3LWZvcm0+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwiZmFzIGZhLXRyYXNoXCIgY2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZCBwLWJ1dHRvbi1kYW5nZXIgbWwtMiBtYi0zXCIgKGNsaWNrKT1cImRlbGV0ZUl0ZW1Gcm9tQ29sbGVjdGlvbihwcm9wZXJ0eSwgZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BlcnR5Lm5hbWVdLCB0ZW1wbGF0ZSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cImZhcyBmYS1wbHVzXCIgY2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZCBwLWJ1dHRvbi1pbmZvXCIgKGNsaWNrKT1cImFkZE5ld0l0ZW1Ub0NvbGxlY3Rpb24ocHJvcGVydHksIGZvcm1Hcm91cC5jb250cm9sc1twcm9wZXJ0eS5uYW1lXSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5Db2xsZWN0aW9uXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRDb2xsZWN0aW9uUmVmIHx8IGRlZmF1bHRJbnB1dENvbGxlY3Rpb247IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RGVmYXVsdCBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiB0eXBlPVwidGV4dFwiIHBJbnB1dFRleHQgY2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIC8+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXREZWZhdWx0UmVmIHx8IGRlZmF1bHRJbnB1dERlZmF1bHQ7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8dmFsLWVycm9ycyBbY29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZSB8fCBudWxsXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cInJlcXVpcmVkXCI+VGhlIGZpZWxkICd7e3Byb3BlcnR5LnByb21wdCB8fCBwcm9wZXJ0eS5uYW1lfX0nIGlzIHJlcXVpcmVkLjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cImVtYWlsXCI+VGhlIGVtYWlsIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cIm1pblwiIGxldC1lcnJvcj1cImVycm9yXCI+J3t7cHJvcGVydHkucHJvbXB0IHx8IHByb3BlcnR5Lm5hbWV9fScgbXVzdCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8ge3sgZXJyb3IubWluIH19LjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cIm1heFwiIGxldC1lcnJvcj1cImVycm9yXCI+J3t7cHJvcGVydHkucHJvbXB0IHx8IHByb3BlcnR5Lm5hbWV9fScgbXVzdCBiZSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8ge3sgZXJyb3IubWF4IH19LjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cIm1pbmxlbmd0aFwiIGxldC1lcnJvcj1cImVycm9yXCI+VGhlIGxlbmd0aCBvZiAne3twcm9wZXJ0eS5wcm9tcHQgfHwgcHJvcGVydHkubmFtZX19JyBtdXN0IGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB7eyBlcnJvci5yZXF1aXJlZExlbmd0aCB9fS48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgdmFsRXJyb3I9XCJtYXhsZW5ndGhcIiBsZXQtZXJyb3I9XCJlcnJvclwiPlRoZSBsZW5ndGggb2YgJ3t7cHJvcGVydHkucHJvbXB0IHx8IHByb3BlcnR5Lm5hbWV9fScgbXVzdCBiZSBzaG9ydGVyIHRoYW4gb3IgZXF1YWwgdG8ge3sgZXJyb3IucmVxdWlyZWRMZW5ndGggfX0uPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlIHZhbEVycm9yPVwicGF0dGVyblwiIGxldC1lcnJvcj1cImVycm9yXCI+VGhlIHZhbHVlIGZvciAne3twcm9wZXJ0eS5wcm9tcHQgfHwgcHJvcGVydHkubmFtZX19JyBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVybiB7eyBlcnJvciB9fS48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgdmFsRXJyb3I9XCJyZW1vdGVcIiBsZXQtZXJyb3I9XCJlcnJvclwiPnt7IGVycm9yIH19PC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvdmFsLWVycm9ycz5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==