@wertzui/ngx-restworld-client 7.2.0 → 8.0.0

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.
Files changed (96) hide show
  1. package/esm2020/lib/components/restworld-file/restworld-file.component.mjs +57 -0
  2. package/esm2020/lib/components/restworld-form/restworld-form.component.mjs +188 -0
  3. package/esm2020/lib/components/restworld-id-navigation/restworld-id-navigation.component.mjs +65 -0
  4. package/esm2020/lib/components/restworld-image/restworld-image.component.mjs +164 -0
  5. package/esm2020/lib/components/restworld-inputs/restworld-inputs.mjs +306 -0
  6. package/esm2020/lib/components/restworld-label/restworld-label.component.mjs +24 -0
  7. package/esm2020/lib/components/restworld-menu-button/restworld-menu-button.component.mjs +40 -0
  8. package/esm2020/lib/components/restworld-table/restworld-table.component.mjs +157 -0
  9. package/esm2020/lib/components/restworld-validation-errors/restworld-validation-errors.component.mjs +21 -0
  10. package/esm2020/lib/models/o-data.mjs +2 -0
  11. package/esm2020/lib/models/restworld-image.mjs +2 -0
  12. package/esm2020/lib/models/restworld-options.mjs +2 -2
  13. package/esm2020/lib/models/special-properties.mjs +6 -0
  14. package/esm2020/lib/models/templating.mjs +2 -0
  15. package/esm2020/lib/restworld-client.module.mjs +83 -25
  16. package/esm2020/lib/services/o-data.service.mjs +6 -3
  17. package/esm2020/lib/services/restworld-client-collection.mjs +7 -7
  18. package/esm2020/lib/services/restworld-client.mjs +40 -29
  19. package/esm2020/lib/services/settings.service.mjs +5 -5
  20. package/esm2020/lib/views/restworld-edit-view/restworld-edit-view.component.mjs +24 -255
  21. package/esm2020/lib/views/restworld-list-view/restworld-list-view.component.mjs +49 -101
  22. package/esm2020/public-api.mjs +17 -6
  23. package/fesm2015/wertzui-ngx-restworld-client.mjs +1373 -1017
  24. package/fesm2015/wertzui-ngx-restworld-client.mjs.map +1 -1
  25. package/fesm2020/wertzui-ngx-restworld-client.mjs +1322 -978
  26. package/fesm2020/wertzui-ngx-restworld-client.mjs.map +1 -1
  27. package/index.d.ts +1 -0
  28. package/lib/components/restworld-avatar/restworld-avatar.component.d.ts +1 -0
  29. package/lib/components/restworld-avatar/restworld-avatar.component.d.ts.map +1 -0
  30. package/lib/{views/restworld-file-view/restworld-file-view.component.d.ts → components/restworld-file/restworld-file.component.d.ts} +4 -3
  31. package/lib/components/restworld-file/restworld-file.component.d.ts.map +1 -0
  32. package/lib/components/restworld-form/restworld-form.component.d.ts +53 -0
  33. package/lib/components/restworld-form/restworld-form.component.d.ts.map +1 -0
  34. package/lib/components/restworld-id-navigation/restworld-id-navigation.component.d.ts +27 -0
  35. package/lib/components/restworld-id-navigation/restworld-id-navigation.component.d.ts.map +1 -0
  36. package/lib/components/restworld-image/restworld-image.component.d.ts +62 -0
  37. package/lib/components/restworld-image/restworld-image.component.d.ts.map +1 -0
  38. package/lib/components/restworld-inputs/restworld-inputs.d.ts +146 -0
  39. package/lib/components/restworld-inputs/restworld-inputs.d.ts.map +1 -0
  40. package/lib/components/restworld-label/restworld-label.component.d.ts +14 -0
  41. package/lib/components/restworld-label/restworld-label.component.d.ts.map +1 -0
  42. package/lib/components/restworld-menu-button/restworld-menu-button.component.d.ts +12 -0
  43. package/lib/components/restworld-menu-button/restworld-menu-button.component.d.ts.map +1 -0
  44. package/lib/components/restworld-table/restworld-table.component.d.ts +54 -0
  45. package/lib/components/restworld-table/restworld-table.component.d.ts.map +1 -0
  46. package/lib/components/restworld-validation-errors/restworld-validation-errors.component.d.ts +15 -0
  47. package/lib/components/restworld-validation-errors/restworld-validation-errors.component.d.ts.map +1 -0
  48. package/lib/constants/link-names.d.ts +1 -0
  49. package/lib/constants/link-names.d.ts.map +1 -0
  50. package/lib/models/api-url.d.ts +1 -0
  51. package/lib/models/api-url.d.ts.map +1 -0
  52. package/lib/models/client-settings.d.ts +1 -0
  53. package/lib/models/client-settings.d.ts.map +1 -0
  54. package/lib/models/o-data.d.ts +7 -0
  55. package/lib/models/o-data.d.ts.map +1 -0
  56. package/lib/models/problem-details.d.ts +1 -0
  57. package/lib/models/problem-details.d.ts.map +1 -0
  58. package/lib/models/restworld-image.d.ts +28 -0
  59. package/lib/models/restworld-image.d.ts.map +1 -0
  60. package/lib/models/restworld-options.d.ts +2 -1
  61. package/lib/models/restworld-options.d.ts.map +1 -0
  62. package/lib/models/special-properties.d.ts +9 -0
  63. package/lib/models/special-properties.d.ts.map +1 -0
  64. package/lib/models/templating.d.ts +8 -0
  65. package/lib/models/templating.d.ts.map +1 -0
  66. package/lib/pipes/as.pipe.d.ts +1 -0
  67. package/lib/pipes/as.pipe.d.ts.map +1 -0
  68. package/lib/pipes/safe-url.pipe.d.ts +1 -0
  69. package/lib/pipes/safe-url.pipe.d.ts.map +1 -0
  70. package/lib/restworld-client.module.d.ts +45 -37
  71. package/lib/restworld-client.module.d.ts.map +1 -0
  72. package/lib/services/avatar-generator.d.ts +1 -0
  73. package/lib/services/avatar-generator.d.ts.map +1 -0
  74. package/lib/services/form.service.d.ts +1 -0
  75. package/lib/services/form.service.d.ts.map +1 -0
  76. package/lib/services/o-data.service.d.ts +1 -0
  77. package/lib/services/o-data.service.d.ts.map +1 -0
  78. package/lib/services/restworld-client-collection.d.ts +9 -8
  79. package/lib/services/restworld-client-collection.d.ts.map +1 -0
  80. package/lib/services/restworld-client.d.ts +12 -4
  81. package/lib/services/restworld-client.d.ts.map +1 -0
  82. package/lib/services/settings.service.d.ts +3 -2
  83. package/lib/services/settings.service.d.ts.map +1 -0
  84. package/lib/views/restworld-edit-view/restworld-edit-view.component.d.ts +16 -68
  85. package/lib/views/restworld-edit-view/restworld-edit-view.component.d.ts.map +1 -0
  86. package/lib/views/restworld-list-view/restworld-list-view.component.d.ts +25 -41
  87. package/lib/views/restworld-list-view/restworld-list-view.component.d.ts.map +1 -0
  88. package/package.json +6 -6
  89. package/public-api.d.ts +17 -5
  90. package/public-api.d.ts.map +1 -0
  91. package/wertzui-ngx-restworld-client.d.ts.map +1 -0
  92. package/esm2020/lib/views/restworld-edit-form/restworld-edit-form.component.mjs +0 -233
  93. package/esm2020/lib/views/restworld-file-view/restworld-file-view.component.mjs +0 -57
  94. package/esm2020/lib/views/restworld-image-view/restworld-image-view.component.mjs +0 -139
  95. package/lib/views/restworld-edit-form/restworld-edit-form.component.d.ts +0 -74
  96. package/lib/views/restworld-image-view/restworld-image-view.component.d.ts +0 -57
@@ -1,233 +0,0 @@
1
- import { Component, ContentChild, Input } from '@angular/core';
2
- import { FormArray, FormGroup } from '@angular/forms';
3
- import { PropertyPromptDisplayType, PropertyType, Template } from '@wertzui/ngx-hal-client';
4
- import { ProblemDetails } from '../../models/problem-details';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../../services/form.service";
7
- import * as i2 from "primeng/api";
8
- import * as i3 from "../../services/restworld-client-collection";
9
- import * as i4 from "@angular/common";
10
- import * as i5 from "@angular/forms";
11
- import * as i6 from "primeng/tooltip";
12
- import * as i7 from "primeng/inputtext";
13
- import * as i8 from "primeng/inputnumber";
14
- import * as i9 from "primeng/calendar";
15
- import * as i10 from "primeng/button";
16
- import * as i11 from "primeng/checkbox";
17
- import * as i12 from "primeng/ripple";
18
- import * as i13 from "primeng/tristatecheckbox";
19
- import * as i14 from "primeng/dropdown";
20
- import * as i15 from "primeng/multiselect";
21
- import * as i16 from "ngx-valdemort";
22
- import * as i17 from "@angular/cdk/drag-drop";
23
- import * as i18 from "../restworld-image-view/restworld-image-view.component";
24
- import * as i19 from "../restworld-file-view/restworld-file-view.component";
25
- import * as i20 from "../../pipes/as.pipe";
26
- export class RestworldEditFormComponent {
27
- constructor(_formService, _changeDetectorRef, _messageService, _clients) {
28
- this._formService = _formService;
29
- this._changeDetectorRef = _changeDetectorRef;
30
- this._messageService = _messageService;
31
- this._clients = _clients;
32
- this.UntypedFormGroup = (FormGroup);
33
- this.UntypedFormArray = (FormArray);
34
- this.Number = Number;
35
- }
36
- get PropertyType() {
37
- return PropertyType;
38
- }
39
- get PropertyPromptDisplayType() {
40
- return PropertyPromptDisplayType;
41
- }
42
- get dateFormat() {
43
- return new Date(3333, 11, 22)
44
- .toLocaleDateString()
45
- .replace("22", "dd")
46
- .replace("11", "mm")
47
- .replace("3333", "yy")
48
- .replace("33", "y");
49
- }
50
- ngOnInit() {
51
- if (!this.formGroup)
52
- throw new Error("[formGroup] is required on <rw-form>");
53
- if (!this.template)
54
- throw new Error("[template] is required on <rw-form>");
55
- if (!this.apiName)
56
- throw new Error("[apiName] is required on <rw-form>");
57
- }
58
- getTooltip(resource, keysToExclude) {
59
- const tooltip = Object.entries(resource)
60
- .filter(([key]) => !(key.startsWith('_') || ['createdAt', 'createdBy', 'lastChangedAt', 'lastChangedBy', 'timestamp'].includes(key) || keysToExclude?.includes(key)))
61
- .reduce((prev, [key, value], index) => `${prev}${index === 0 ? '' : '\n'}${key}: ${RestworldEditFormComponent.jsonStringifyWithElipsis(value)}`, '');
62
- return tooltip;
63
- }
64
- static jsonStringifyWithElipsis(value) {
65
- const maxLength = 200;
66
- const end = 10;
67
- const start = maxLength - end - 2;
68
- const json = JSON.stringify(value);
69
- const shortened = json.length > maxLength ? json.substring(0, start) + '…' + json.substring(json.length - end) : json;
70
- return shortened;
71
- }
72
- getCollectionEntryTemplates(property) {
73
- if (!property)
74
- return [];
75
- return Object.entries(property._templates)
76
- .filter(([key,]) => Number.isInteger(Number.parseInt(key)))
77
- .map(([, value]) => value);
78
- }
79
- addNewItemToCollection(property, formArray) {
80
- if (!(formArray instanceof (FormArray)))
81
- throw new Error('formArray is not an instance of FormArray.');
82
- const maxIndex = Math.max(...Object.keys(property._templates)
83
- .map(key => Number.parseInt(key))
84
- .filter(key => Number.isSafeInteger(key)));
85
- const nextIndex = maxIndex < 0 ? 0 : maxIndex + 1;
86
- const defaultTemplate = property._templates['default'];
87
- const copiedTemplateDto = JSON.parse(JSON.stringify(defaultTemplate));
88
- const copiedTemplate = new Template(copiedTemplateDto);
89
- copiedTemplate.title = nextIndex.toString();
90
- property._templates[copiedTemplate.title] = copiedTemplate;
91
- formArray.push(this._formService.createFormGroupFromTemplate(defaultTemplate));
92
- }
93
- deleteItemFromCollection(property, formArray, template) {
94
- if (!template.title)
95
- throw new Error(`Cannot delete the item, because the template '${template}' does not have a title.`);
96
- if (!(formArray instanceof (FormArray)))
97
- throw new Error('formArray is not an instance of FormArray.');
98
- const templates = property._templates;
99
- delete templates[template.title];
100
- formArray.removeAt(Number.parseInt(template.title));
101
- }
102
- collectionItemDropped($event) {
103
- const formArray = $event.container.data.formArray;
104
- const previousIndex = $event.previousIndex;
105
- const currentIndex = $event.currentIndex;
106
- const movementDirection = currentIndex > previousIndex ? 1 : -1;
107
- // Move in FormArray
108
- // We do not need to move the item in the _templates object
109
- const movedControl = formArray.at(previousIndex);
110
- for (let i = previousIndex; i * movementDirection < currentIndex * movementDirection; i = i + movementDirection) {
111
- formArray.setControl(i, formArray.at(i + movementDirection));
112
- }
113
- formArray.setControl(currentIndex, movedControl);
114
- this._changeDetectorRef.markForCheck();
115
- console.log($event);
116
- }
117
- async onOptionsFiltered(property, event) {
118
- const options = property?.options;
119
- if (!options?.link?.href || !event.filter || event.filter === '')
120
- return;
121
- const templatedUri = options.link.href;
122
- let filter = `contains(${options.promptField}, '${event.filter}')`;
123
- if (options.valueField?.toLowerCase() === 'id' && !Number.isNaN(Number.parseInt(event.filter)))
124
- filter = `(${options.valueField} eq ${event.filter}) or (${filter})`;
125
- const response = await this.getClient().getListByUri(templatedUri, { $filter: filter, $top: 10 });
126
- if (!response.ok || ProblemDetails.isProblemDetails(response.body) || !response.body) {
127
- const message = `An error occurred while getting the filtered items.`;
128
- this._messageService.add({ severity: 'error', summary: 'Error', detail: message, data: response });
129
- return;
130
- }
131
- const items = response.body._embedded.items;
132
- options.inline = items;
133
- }
134
- getClient() {
135
- if (!this.apiName)
136
- throw new Error('Cannot get a client, because the apiName is not set.');
137
- return this._clients.getClient(this.apiName);
138
- }
139
- }
140
- RestworldEditFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: RestworldEditFormComponent, deps: [{ token: i1.FormService }, { token: i0.ChangeDetectorRef }, { token: i2.MessageService }, { token: i3.RESTworldClientCollection }], target: i0.ɵɵFactoryTarget.Component });
141
- RestworldEditFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.3", 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: "\r\n<div class=\"grid field\">\r\n <div class=\"col-12 md:col-10 md:col-offset-2\">\r\n <val-errors [control]=\"formGroup\">\r\n <ng-template valError=\"remote\" let-error=\"error\">{{ error }}</ng-template>\r\n </val-errors>\r\n </div>\r\n</div>\r\n<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\" [class.label-hidden]=\"property.promptDisplay === PropertyPromptDisplayType.Hidden\" [class.label-collapsed]=\"property.promptDisplay === PropertyPromptDisplayType.Collapsed\">{{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\"\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 : UntypedFormGroup)\" [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 : UntypedFormArray)}\" (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 : UntypedFormArray).controls[Number.parseInt(template.title!)] | as : UntypedFormGroup)\" [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}.label-hidden{visibility:hidden}.label-collapsed{display:none}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i7.InputText, selector: "[pInputText]" }, { kind: "component", type: i8.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", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i9.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", "showClear", "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", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i10.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i11.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"] }, { kind: "directive", type: i12.Ripple, selector: "[pRipple]" }, { kind: "component", type: i13.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { kind: "component", type: i14.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", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i15.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad"] }, { kind: "component", type: i16.ValidationErrorsComponent, selector: "val-errors", inputs: ["control", "controlName", "label"] }, { kind: "directive", type: i16.ValidationErrorDirective, selector: "ng-template[valError]", inputs: ["valError"] }, { kind: "directive", 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"] }, { kind: "directive", 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"] }, { kind: "directive", type: i17.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i18.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"] }, { kind: "component", type: i19.RESTWorldFileViewComponent, selector: "rw-file", inputs: ["accept", "fileName"] }, { kind: "component", type: RestworldEditFormComponent, selector: "rw-form", inputs: ["formGroup", "template", "apiName"] }, { kind: "pipe", type: i20.AsPipe, name: "as" }] });
142
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: RestworldEditFormComponent, decorators: [{
143
- type: Component,
144
- args: [{ selector: 'rw-form', template: "\r\n<div class=\"grid field\">\r\n <div class=\"col-12 md:col-10 md:col-offset-2\">\r\n <val-errors [control]=\"formGroup\">\r\n <ng-template valError=\"remote\" let-error=\"error\">{{ error }}</ng-template>\r\n </val-errors>\r\n </div>\r\n</div>\r\n<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\" [class.label-hidden]=\"property.promptDisplay === PropertyPromptDisplayType.Hidden\" [class.label-collapsed]=\"property.promptDisplay === PropertyPromptDisplayType.Collapsed\">{{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\"\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 : UntypedFormGroup)\" [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 : UntypedFormArray)}\" (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 : UntypedFormArray).controls[Number.parseInt(template.title!)] | as : UntypedFormGroup)\" [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}.label-hidden{visibility:hidden}.label-collapsed{display:none}\n"] }]
145
- }], ctorParameters: function () { return [{ type: i1.FormService }, { type: i0.ChangeDetectorRef }, { type: i2.MessageService }, { type: i3.RESTworldClientCollection }]; }, propDecorators: { formGroup: [{
146
- type: Input
147
- }], template: [{
148
- type: Input
149
- }], apiName: [{
150
- type: Input
151
- }], inputOptionsSingleRef: [{
152
- type: ContentChild,
153
- args: ['inputOptionsSingle', { static: false }]
154
- }], inputOptionsMultipleRef: [{
155
- type: ContentChild,
156
- args: ['inputOptionsMultiple', { static: false }]
157
- }], inputOptionsRef: [{
158
- type: ContentChild,
159
- args: ['inputOptions', { static: false }]
160
- }], inputHiddenRef: [{
161
- type: ContentChild,
162
- args: ['inputHidden', { static: false }]
163
- }], inputTextRef: [{
164
- type: ContentChild,
165
- args: ['inputText', { static: false }]
166
- }], inputTextareaRef: [{
167
- type: ContentChild,
168
- args: ['inputTextarea', { static: false }]
169
- }], inputSearchRef: [{
170
- type: ContentChild,
171
- args: ['inputSearch', { static: false }]
172
- }], inputTelRef: [{
173
- type: ContentChild,
174
- args: ['inputTel', { static: false }]
175
- }], inputUrlRef: [{
176
- type: ContentChild,
177
- args: ['inputUrl', { static: false }]
178
- }], inputEmailRef: [{
179
- type: ContentChild,
180
- args: ['inputEmail', { static: false }]
181
- }], inputPasswordRef: [{
182
- type: ContentChild,
183
- args: ['inputPassword', { static: false }]
184
- }], inputDateRef: [{
185
- type: ContentChild,
186
- args: ['inputDate', { static: false }]
187
- }], inputMonthRef: [{
188
- type: ContentChild,
189
- args: ['inputMonth', { static: false }]
190
- }], inputWeekRef: [{
191
- type: ContentChild,
192
- args: ['inputWeek', { static: false }]
193
- }], inputTimeRef: [{
194
- type: ContentChild,
195
- args: ['inputTime', { static: false }]
196
- }], inputDatetimeLocalRef: [{
197
- type: ContentChild,
198
- args: ['inputDatetimeLocal', { static: false }]
199
- }], inputNumberRef: [{
200
- type: ContentChild,
201
- args: ['inputNumber', { static: false }]
202
- }], inputRangeRef: [{
203
- type: ContentChild,
204
- args: ['inputRange', { static: false }]
205
- }], inputColorRef: [{
206
- type: ContentChild,
207
- args: ['inputColor', { static: false }]
208
- }], inputBoolRef: [{
209
- type: ContentChild,
210
- args: ['inputBool', { static: false }]
211
- }], inputDatetimeOffsetRef: [{
212
- type: ContentChild,
213
- args: ['inputDatetimeOffset', { static: false }]
214
- }], inputDurationRef: [{
215
- type: ContentChild,
216
- args: ['inputDuration', { static: false }]
217
- }], inputImageRef: [{
218
- type: ContentChild,
219
- args: ['inputImage', { static: false }]
220
- }], inputFileRef: [{
221
- type: ContentChild,
222
- args: ['inputFile', { static: false }]
223
- }], inputObjectRef: [{
224
- type: ContentChild,
225
- args: ['inputObject', { static: false }]
226
- }], inputCollectionRef: [{
227
- type: ContentChild,
228
- args: ['inputCollection', { static: false }]
229
- }], inputDefaultRef: [{
230
- type: ContentChild,
231
- args: ['inputDefault', { static: false }]
232
- }] } });
233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LWZvcm0vcmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LWZvcm0vcmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFDNUUsT0FBTyxFQUFtQixTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFZLHlCQUF5QixFQUFFLFlBQVksRUFBWSxRQUFRLEVBQWUsTUFBTSx5QkFBeUIsQ0FBQztBQUU3SCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVOUQsTUFBTSxPQUFPLDBCQUEwQjtJQWdIckMsWUFDVSxZQUF5QixFQUN6QixrQkFBcUMsRUFDckMsZUFBK0IsRUFDL0IsUUFBbUM7UUFIbkMsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDekIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFtQjtRQUNyQyxvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDL0IsYUFBUSxHQUFSLFFBQVEsQ0FBMkI7UUFSdEMscUJBQWdCLElBQUcsU0FBYyxFQUFDO1FBQ2xDLHFCQUFnQixJQUFHLFNBQWMsRUFBQztRQUNsQyxXQUFNLEdBQUcsTUFBTSxDQUFDO0lBT25CLENBQUM7SUExQkwsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sWUFB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QUssRUFBRTtnQkFJN0MsYUFBYTtzQkFEWixZQUFZO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSTdDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUk1QyxzQkFBc0I7c0JBRHJCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUl0RCxnQkFBZ0I7c0JBRGYsWUFBWTt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUloRCxhQUFhO3NCQURaLFlBQVk7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJN0MsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSTVDLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUk5QyxrQkFBa0I7c0JBRGpCLFlBQVk7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUlsRCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0RyYWdEcm9wIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgSW5wdXQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUHJvcGVydHksIFByb3BlcnR5UHJvbXB0RGlzcGxheVR5cGUsIFByb3BlcnR5VHlwZSwgUmVzb3VyY2UsIFRlbXBsYXRlLCBUZW1wbGF0ZUR0byB9IGZyb20gJ0B3ZXJ0enVpL25neC1oYWwtY2xpZW50JztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgUHJvYmxlbURldGFpbHMgfSBmcm9tICcuLi8uLi9tb2RlbHMvcHJvYmxlbS1kZXRhaWxzJztcbmltcG9ydCB7IEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IFJFU1R3b3JsZENsaWVudCB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3R3b3JsZC1jbGllbnQnO1xuaW1wb3J0IHsgUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3R3b3JsZC1jbGllbnQtY29sbGVjdGlvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3J3LWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vcmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Jlc3R3b3JsZC1lZGl0LWZvcm0uY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJlc3R3b3JsZEVkaXRGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgZm9ybUdyb3VwITogRm9ybUdyb3VwPGFueT47XG5cbiAgQElucHV0KClcbiAgdGVtcGxhdGUhOiBUZW1wbGF0ZTtcblxuICBASW5wdXQoKVxuICBhcGlOYW1lPzogc3RyaW5nO1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0T3B0aW9uc1NpbmdsZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dE9wdGlvbnNTaW5nbGVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dE9wdGlvbnNNdWx0aXBsZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dE9wdGlvbnNNdWx0aXBsZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0T3B0aW9ucycsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dE9wdGlvbnNSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dEhpZGRlbicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dEhpZGRlblJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0VGV4dCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFRleHRSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFRleHRhcmVhJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0VGV4dGFyZWFSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFNlYXJjaCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFNlYXJjaFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0VGVsJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0VGVsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRVcmwnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRVcmxSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dEVtYWlsJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0RW1haWxSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFBhc3N3b3JkJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0UGFzc3dvcmRSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dERhdGUnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXREYXRlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRNb250aCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dE1vbnRoUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRXZWVrJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0V2Vla1JlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0VGltZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFRpbWVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dERhdGV0aW1lTG9jYWwnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXREYXRldGltZUxvY2FsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXROdW1iZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXROdW1iZXJSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFJhbmdlJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0UmFuZ2VSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dENvbG9yJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0Q29sb3JSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dEJvb2wnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRCb29sUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXREYXRldGltZU9mZnNldCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dERhdGV0aW1lT2Zmc2V0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXREdXJhdGlvbicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dER1cmF0aW9uUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRJbWFnZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dEltYWdlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRGaWxlJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0RmlsZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0T2JqZWN0JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0T2JqZWN0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRDb2xsZWN0aW9uJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0Q29sbGVjdGlvblJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RGVmYXVsdCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dERlZmF1bHRSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBwdWJsaWMgZ2V0IFByb3BlcnR5VHlwZSgpIHtcbiAgICByZXR1cm4gUHJvcGVydHlUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBQcm9wZXJ0eVByb21wdERpc3BsYXlUeXBlKCkge1xuICAgIHJldHVybiBQcm9wZXJ0eVByb21wdERpc3BsYXlUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRlRm9ybWF0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKDMzMzMsIDExLCAyMilcbiAgICAgIC50b0xvY2FsZURhdGVTdHJpbmcoKVxuICAgICAgLnJlcGxhY2UoXCIyMlwiLCBcImRkXCIpXG4gICAgICAucmVwbGFjZShcIjExXCIsIFwibW1cIilcbiAgICAgIC5yZXBsYWNlKFwiMzMzM1wiLCBcInl5XCIpXG4gICAgICAucmVwbGFjZShcIjMzXCIsIFwieVwiKTtcbiAgfVxuXG4gIHB1YmxpYyBVbnR5cGVkRm9ybUdyb3VwID0gRm9ybUdyb3VwPGFueT47XG4gIHB1YmxpYyBVbnR5cGVkRm9ybUFycmF5ID0gRm9ybUFycmF5PGFueT47XG4gIHB1YmxpYyBOdW1iZXIgPSBOdW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLFxuICAgIHByaXZhdGUgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfY2xpZW50czogUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvblxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5mb3JtR3JvdXApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbZm9ybUdyb3VwXSBpcyByZXF1aXJlZCBvbiA8cnctZm9ybT5cIik7XG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiW3RlbXBsYXRlXSBpcyByZXF1aXJlZCBvbiA8cnctZm9ybT5cIik7XG4gICAgaWYgKCF0aGlzLmFwaU5hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbYXBpTmFtZV0gaXMgcmVxdWlyZWQgb24gPHJ3LWZvcm0+XCIpO1xuICB9XG5cbiAgcHVibGljIGdldFRvb2x0aXAocmVzb3VyY2U6IFJlc291cmNlLCBrZXlzVG9FeGNsdWRlPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHRvb2x0aXAgPSBPYmplY3QuZW50cmllcyhyZXNvdXJjZSlcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhKGtleS5zdGFydHNXaXRoKCdfJykgfHwgWydjcmVhdGVkQXQnLCAnY3JlYXRlZEJ5JywgJ2xhc3RDaGFuZ2VkQXQnLCAnbGFzdENoYW5nZWRCeScsICd0aW1lc3RhbXAnXS5pbmNsdWRlcyhrZXkpIHx8IGtleXNUb0V4Y2x1ZGU/LmluY2x1ZGVzKGtleSkpKVxuICAgICAgLnJlZHVjZSgocHJldiwgW2tleSwgdmFsdWVdLCBpbmRleCkgPT4gYCR7cHJldn0ke2luZGV4ID09PSAwID8gJycgOiAnXFxuJ30ke2tleX06ICR7UmVzdHdvcmxkRWRpdEZvcm1Db21wb25lbnQuanNvblN0cmluZ2lmeVdpdGhFbGlwc2lzKHZhbHVlKX1gLCAnJyk7XG5cbiAgICByZXR1cm4gdG9vbHRpcDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGpzb25TdHJpbmdpZnlXaXRoRWxpcHNpcyh2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IG1heExlbmd0aCA9IDIwMDtcbiAgICBjb25zdCBlbmQgPSAxMDtcbiAgICBjb25zdCBzdGFydCA9IG1heExlbmd0aCAtIGVuZCAtIDI7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICBjb25zdCBzaG9ydGVuZWQgPSBqc29uLmxlbmd0aCA+IG1heExlbmd0aCA/IGpzb24uc3Vic3RyaW5nKDAsIHN0YXJ0KSArICfigKYnICsganNvbi5zdWJzdHJpbmcoanNvbi5sZW5ndGggLSBlbmQpIDoganNvbjtcblxuICAgIHJldHVybiBzaG9ydGVuZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sbGVjdGlvbkVudHJ5VGVtcGxhdGVzKHByb3BlcnR5PzogUHJvcGVydHkpOiBUZW1wbGF0ZVtdIHtcbiAgICBpZiAoIXByb3BlcnR5KVxuICAgICAgcmV0dXJuIFtdO1xuXG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHByb3BlcnR5Ll90ZW1wbGF0ZXMpXG4gICAgICAuZmlsdGVyKChba2V5LF0pID0+IE51bWJlci5pc0ludGVnZXIoTnVtYmVyLnBhcnNlSW50KGtleSkpKVxuICAgICAgLm1hcCgoWywgdmFsdWVdKSA9PiB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgYWRkTmV3SXRlbVRvQ29sbGVjdGlvbihwcm9wZXJ0eTogUHJvcGVydHksIGZvcm1BcnJheTogRm9ybUFycmF5PGFueT4gfCBBYnN0cmFjdENvbnRyb2wpOiB2b2lkIHtcbiAgICBpZiAoIShmb3JtQXJyYXkgaW5zdGFuY2VvZiBGb3JtQXJyYXk8YW55PikpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Zvcm1BcnJheSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgRm9ybUFycmF5LicpO1xuXG4gICAgY29uc3QgbWF4SW5kZXggPSBNYXRoLm1heCguLi5PYmplY3Qua2V5cyhwcm9wZXJ0eS5fdGVtcGxhdGVzKVxuICAgICAgLm1hcChrZXkgPT4gTnVtYmVyLnBhcnNlSW50KGtleSkpXG4gICAgICAuZmlsdGVyKGtleSA9PiBOdW1iZXIuaXNTYWZlSW50ZWdlcihrZXkpKSk7XG4gICAgY29uc3QgbmV4dEluZGV4ID0gbWF4SW5kZXggPCAwID8gMCA6IG1heEluZGV4ICsgMTtcblxuICAgIGNvbnN0IGRlZmF1bHRUZW1wbGF0ZSA9IHByb3BlcnR5Ll90ZW1wbGF0ZXNbJ2RlZmF1bHQnXTtcbiAgICBjb25zdCBjb3BpZWRUZW1wbGF0ZUR0byA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVmYXVsdFRlbXBsYXRlKSkgYXMgVGVtcGxhdGVEdG87XG4gICAgY29uc3QgY29waWVkVGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoY29waWVkVGVtcGxhdGVEdG8pO1xuICAgIGNvcGllZFRlbXBsYXRlLnRpdGxlID0gbmV4dEluZGV4LnRvU3RyaW5nKCk7XG5cbiAgICBwcm9wZXJ0eS5fdGVtcGxhdGVzW2NvcGllZFRlbXBsYXRlLnRpdGxlXSA9IGNvcGllZFRlbXBsYXRlO1xuICAgIGZvcm1BcnJheS5wdXNoKHRoaXMuX2Zvcm1TZXJ2aWNlLmNyZWF0ZUZvcm1Hcm91cEZyb21UZW1wbGF0ZShkZWZhdWx0VGVtcGxhdGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVJdGVtRnJvbUNvbGxlY3Rpb24ocHJvcGVydHk6IFByb3BlcnR5LCBmb3JtQXJyYXk6IEZvcm1BcnJheTxhbnk+IHwgQWJzdHJhY3RDb250cm9sLCB0ZW1wbGF0ZTogVGVtcGxhdGUpOiB2b2lkIHtcbiAgICBpZiAoIXRlbXBsYXRlLnRpdGxlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZGVsZXRlIHRoZSBpdGVtLCBiZWNhdXNlIHRoZSB0ZW1wbGF0ZSAnJHt0ZW1wbGF0ZX0nIGRvZXMgbm90IGhhdmUgYSB0aXRsZS5gKTtcblxuICAgIGlmICghKGZvcm1BcnJheSBpbnN0YW5jZW9mIEZvcm1BcnJheTxhbnk+KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9ybUFycmF5IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBGb3JtQXJyYXkuJyk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBwcm9wZXJ0eS5fdGVtcGxhdGVzO1xuICAgIGRlbGV0ZSB0ZW1wbGF0ZXNbdGVtcGxhdGUudGl0bGVdO1xuXG4gICAgZm9ybUFycmF5LnJlbW92ZUF0KE51bWJlci5wYXJzZUludCh0ZW1wbGF0ZS50aXRsZSkpO1xuICB9XG5cbiAgcHVibGljIGNvbGxlY3Rpb25JdGVtRHJvcHBlZCgkZXZlbnQ6IENka0RyYWdEcm9wPHsgcHJvcGVydHk6IFByb3BlcnR5OyBmb3JtQXJyYXk6IEZvcm1BcnJheTxhbnk+IH0+KSB7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gJGV2ZW50LmNvbnRhaW5lci5kYXRhLmZvcm1BcnJheTtcbiAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gJGV2ZW50LnByZXZpb3VzSW5kZXg7XG4gICAgY29uc3QgY3VycmVudEluZGV4ID0gJGV2ZW50LmN1cnJlbnRJbmRleDtcbiAgICBjb25zdCBtb3ZlbWVudERpcmVjdGlvbiA9IGN1cnJlbnRJbmRleCA+IHByZXZpb3VzSW5kZXggPyAxIDogLTE7XG5cbiAgICAvLyBNb3ZlIGluIEZvcm1BcnJheVxuICAgIC8vIFdlIGRvIG5vdCBuZWVkIHRvIG1vdmUgdGhlIGl0ZW0gaW4gdGhlIF90ZW1wbGF0ZXMgb2JqZWN0XG4gICAgY29uc3QgbW92ZWRDb250cm9sID0gZm9ybUFycmF5LmF0KHByZXZpb3VzSW5kZXgpO1xuICAgIGZvciAobGV0IGkgPSBwcmV2aW91c0luZGV4OyBpICogbW92ZW1lbnREaXJlY3Rpb24gPCBjdXJyZW50SW5kZXggKiBtb3ZlbWVudERpcmVjdGlvbjsgaSA9IGkgKyBtb3ZlbWVudERpcmVjdGlvbikge1xuICAgICAgZm9ybUFycmF5LnNldENvbnRyb2woaSwgZm9ybUFycmF5LmF0KGkgKyBtb3ZlbWVudERpcmVjdGlvbikpO1xuICAgIH1cbiAgICBmb3JtQXJyYXkuc2V0Q29udHJvbChjdXJyZW50SW5kZXgsIG1vdmVkQ29udHJvbCk7XG5cbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcblxuICAgIGNvbnNvbGUubG9nKCRldmVudCk7XG4gIH1cblxuXG4gIHB1YmxpYyBhc3luYyBvbk9wdGlvbnNGaWx0ZXJlZChwcm9wZXJ0eTogUHJvcGVydHksIGV2ZW50OiB7IG9yaWdpbmFsRXZlbnQ6IHVua25vd247IGZpbHRlcjogc3RyaW5nIHwgbnVsbCB9KSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHByb3BlcnR5Py5vcHRpb25zO1xuXG4gICAgaWYgKCFvcHRpb25zPy5saW5rPy5ocmVmIHx8ICFldmVudC5maWx0ZXIgfHwgZXZlbnQuZmlsdGVyID09PSAnJylcbiAgICAgIHJldHVybjtcblxuXG4gICAgY29uc3QgdGVtcGxhdGVkVXJpID0gb3B0aW9ucy5saW5rLmhyZWY7XG4gICAgbGV0IGZpbHRlciA9IGBjb250YWlucygke29wdGlvbnMucHJvbXB0RmllbGR9LCAnJHtldmVudC5maWx0ZXJ9JylgO1xuICAgIGlmIChvcHRpb25zLnZhbHVlRmllbGQ/LnRvTG93ZXJDYXNlKCkgPT09ICdpZCcgJiYgIU51bWJlci5pc05hTihOdW1iZXIucGFyc2VJbnQoZXZlbnQuZmlsdGVyKSkpXG4gICAgICBmaWx0ZXIgPSBgKCR7b3B0aW9ucy52YWx1ZUZpZWxkfSBlcSAke2V2ZW50LmZpbHRlcn0pICBvciAoJHtmaWx0ZXJ9KWA7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCkuZ2V0TGlzdEJ5VXJpKHRlbXBsYXRlZFVyaSwgeyAkZmlsdGVyOiBmaWx0ZXIsICR0b3A6IDEwIH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2sgfHwgUHJvYmxlbURldGFpbHMuaXNQcm9ibGVtRGV0YWlscyhyZXNwb25zZS5ib2R5KSB8fCAhcmVzcG9uc2UuYm9keSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZXR0aW5nIHRoZSBmaWx0ZXJlZCBpdGVtcy5gO1xuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogbWVzc2FnZSwgZGF0YTogcmVzcG9uc2UgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXRlbXMgPSByZXNwb25zZS5ib2R5Ll9lbWJlZGRlZC5pdGVtcztcbiAgICBvcHRpb25zLmlubGluZSA9IGl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDbGllbnQoKTogUkVTVHdvcmxkQ2xpZW50IHtcbiAgICBpZiAoIXRoaXMuYXBpTmFtZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCBhIGNsaWVudCwgYmVjYXVzZSB0aGUgYXBpTmFtZSBpcyBub3Qgc2V0LicpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudHMuZ2V0Q2xpZW50KHRoaXMuYXBpTmFtZSk7XG4gIH1cbn1cbiIsIlxyXG48ZGl2IGNsYXNzPVwiZ3JpZCBmaWVsZFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWQ6Y29sLTEwIG1kOmNvbC1vZmZzZXQtMlwiPlxyXG4gICAgPHZhbC1lcnJvcnMgW2NvbnRyb2xdPVwiZm9ybUdyb3VwXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cInJlbW90ZVwiIGxldC1lcnJvcj1cImVycm9yXCI+e3sgZXJyb3IgfX08L25nLXRlbXBsYXRlPlxyXG4gICAgPC92YWwtZXJyb3JzPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiAqbmdGb3I9XCJsZXQgcHJvcGVydHkgb2YgdGVtcGxhdGUucHJvcGVydGllc1wiIGNsYXNzPVwiZ3JpZCBmaWVsZFwiIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XHJcbiAgPGxhYmVsICpuZ0lmPVwicHJvcGVydHkudHlwZSAhPT0gUHJvcGVydHlUeXBlLkhpZGRlblwiIFthdHRyLmZvcl09XCJwcm9wZXJ0eS5uYW1lXCIgY2xhc3M9XCJjb2wtMTIgbWItMiBtZDpjb2wtMiBtZDptYi0wXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIiBbY2xhc3MuaGFzQ2hpbGRyZW5dPVwicHJvcGVydHkuX3RlbXBsYXRlc1wiIFtjbGFzcy5sYWJlbC1oaWRkZW5dPVwicHJvcGVydHkucHJvbXB0RGlzcGxheSA9PT0gUHJvcGVydHlQcm9tcHREaXNwbGF5VHlwZS5IaWRkZW5cIiBbY2xhc3MubGFiZWwtY29sbGFwc2VkXT1cInByb3BlcnR5LnByb21wdERpc3BsYXkgPT09IFByb3BlcnR5UHJvbXB0RGlzcGxheVR5cGUuQ29sbGFwc2VkXCI+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+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRCb29sUmVmIHx8IGRlZmF1bHRJbnB1dEJvb2w7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RGF0ZXRpbWVPZmZzZXQgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHAtY2FsZW5kYXIgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiBbZGF0ZUZvcm1hdF09XCJkYXRlRm9ybWF0XCIgW3Nob3dUaW1lXT1cInRydWVcIiBbc2hvd1dlZWtdPVwiZmFsc2VcIiBbc2hvd0ljb25dPVwidHJ1ZVwiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EYXRldGltZU9mZnNldFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RGF0ZXRpbWVPZmZzZXRSZWYgfHwgZGVmYXVsdElucHV0RGF0ZXRpbWVPZmZzZXQ7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RHVyYXRpb24gbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHAtY2FsZW5kYXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EdXJhdGlvblwiIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgW2RhdGVGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiIFtzaG93VGltZV09XCJ0cnVlXCIgW3RpbWVPbmx5XT1cInRydWVcIiBbc2hvd1dlZWtdPVwiZmFsc2VcIiBbc2hvd0ljb25dPVwidHJ1ZVwiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5EdXJhdGlvblwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RHVyYXRpb25SZWYgfHwgZGVmYXVsdElucHV0RHVyYXRpb247IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0SW1hZ2UgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHJ3LWltYWdlIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FjY2VwdF09XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZT8uYWNjZXB0ID8/IHByb3BlcnR5LnBsYWNlaG9sZGVyID8/ICdpbWFnZS8qJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FsaWduSW1hZ2VdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2U/LmFsaWduSW1hZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthbHRdPVwicHJvcGVydHkucHJvbXB0ID8/IHByb3BlcnR5Lm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthc3BlY3RSYXRpb109XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZT8uYXNwZWN0UmF0aW9cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtiYWNrZ3JvdW5kQ29sb3JdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2U/LmJhY2tncm91bmRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NhbnZhc1JvdGF0aW9uXT1cInByb3BlcnR5LnJlc3RXb3JsZEltYWdlPy5jYW52YXNSb3RhdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb109XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZT8uY29udGFpbldpdGhpbkFzcGVjdFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICAgICBbY3JvcHBlcl09XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZT8uY3JvcHBlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Nyb3BwZXJNYXhIZWlnaHRdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2U/LmNyb3BwZXJNYXhIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjcm9wcGVyTWF4V2lkdGhdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2U/LmNyb3BwZXJNYXhXaWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Nyb3BwZXJNaW5IZWlnaHRdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2U/LmNyb3BwZXJNaW5IZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjcm9wcGVyTWluV2lkdGhdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2U/LmNyb3BwZXJNaW5XaWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Nyb3BwZXJTdGF0aWNIZWlnaHRdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2U/LmNyb3BwZXJTdGF0aWNIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjcm9wcGVyU3RhdGljV2lkdGhdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2U/LmNyb3BwZXJTdGF0aWNXaWR0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2ZpbGVOYW1lXT1cInByb3BlcnR5Lm5hbWUgKyAnLicgKyAocHJvcGVydHkucmVzdFdvcmxkSW1hZ2U/LmZvcm1hdCA/PyAncG5nJylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtYXRdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2U/LmZvcm1hdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2ltYWdlUXVhbGl0eV09XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZT8uaW1hZ2VRdWFsaXR5XCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5pdGlhbFN0ZXBTaXplXT1cInByb3BlcnR5LnJlc3RXb3JsZEltYWdlPy5pbml0aWFsU3RlcFNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYWludGFpbkFzcGVjdFJhdGlvXT1cInByb3BlcnR5LnJlc3RXb3JsZEltYWdlPy5tYWludGFpbkFzcGVjdFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICAgICBbb25seVNjYWxlRG93bl09XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZT8ub25seVNjYWxlRG93blwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jlc2l6ZVRvV2lkdGhdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2U/LnJlc2l6ZVRvV2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZXNpemVUb0hlaWdodF09XCJwcm9wZXJ0eS5yZXN0V29ybGRJbWFnZT8ucmVzaXplVG9IZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3VuZENyb3BwZXJdPVwicHJvcGVydHkucmVzdFdvcmxkSW1hZ2U/LnJvdW5kQ3JvcHBlclwiPjwvcnctaW1hZ2U+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuSW1hZ2VcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dEltYWdlUmVmIHx8IGRlZmF1bHRJbnB1dEltYWdlOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dEZpbGUgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHJ3LWZpbGUgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2ZpbGVOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbYWNjZXB0XT1cInByb3BlcnR5LnBsYWNlaG9sZGVyXCI+PC9ydy1maWxlPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLkZpbGVcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dEZpbGVSZWYgfHwgZGVmYXVsdElucHV0RmlsZTsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRPYmplY3QgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJicmFjZVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxyXG4gICAgICAgICAgICAgIDxydy1mb3JtIFtmb3JtR3JvdXBdPVwiKGZvcm1Hcm91cC5jb250cm9sc1twcm9wZXJ0eS5uYW1lXSB8IGFzIDogVW50eXBlZEZvcm1Hcm91cClcIiBbdGVtcGxhdGVdPVwicHJvcGVydHkuX3RlbXBsYXRlcy5kZWZhdWx0XCIgW2FwaU5hbWVdPVwiYXBpTmFtZVwiPjwvcnctZm9ybT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5PYmplY3RcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dE9iamVjdFJlZiB8fCBkZWZhdWx0SW5wdXRPYmplY3Q7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0Q29sbGVjdGlvbiBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJyYWNlXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCIgY2RrRHJvcExpc3QgW2Nka0Ryb3BMaXN0RGF0YV09XCJ7IHByb3BlcnR5OiBwcm9wZXJ0eSwgZm9ybUFycmF5OiAoZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BlcnR5Lm5hbWVdIHwgYXMgOiBVbnR5cGVkRm9ybUFycmF5KX1cIiAoY2RrRHJvcExpc3REcm9wcGVkKT1cImNvbGxlY3Rpb25JdGVtRHJvcHBlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdGVtcGxhdGUgb2YgZ2V0Q29sbGVjdGlvbkVudHJ5VGVtcGxhdGVzKHByb3BlcnR5KVwiIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBjZGtEcmFnPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZ3JpcC1saW5lc1wiIGNka0RyYWdIYW5kbGU+PC9pPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJyYWNlXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxydy1mb3JtIFtmb3JtR3JvdXBdPVwiKChmb3JtR3JvdXAuY29udHJvbHNbcHJvcGVydHkubmFtZV0gfCBhcyA6IFVudHlwZWRGb3JtQXJyYXkpLmNvbnRyb2xzW051bWJlci5wYXJzZUludCh0ZW1wbGF0ZS50aXRsZSEpXSB8IGFzIDogVW50eXBlZEZvcm1Hcm91cClcIiBbdGVtcGxhdGVdPVwidGVtcGxhdGVcIiBbYXBpTmFtZV09XCJhcGlOYW1lXCIgY2xhc3M9XCJ3LWZ1bGxcIj48L3J3LWZvcm0+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBpY29uPVwiZmFzIGZhLXRyYXNoXCIgY2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZCBwLWJ1dHRvbi1kYW5nZXIgbWwtMiBtYi0zXCIgKGNsaWNrKT1cImRlbGV0ZUl0ZW1Gcm9tQ29sbGVjdGlvbihwcm9wZXJ0eSwgZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BlcnR5Lm5hbWVdLCB0ZW1wbGF0ZSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmQgdy1mdWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cImZhcyBmYS1wbHVzXCIgY2xhc3M9XCJwLWJ1dHRvbi1vdXRsaW5lZCBwLWJ1dHRvbi1pbmZvXCIgKGNsaWNrKT1cImFkZE5ld0l0ZW1Ub0NvbGxlY3Rpb24ocHJvcGVydHksIGZvcm1Hcm91cC5jb250cm9sc1twcm9wZXJ0eS5uYW1lXSlcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5Db2xsZWN0aW9uXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRDb2xsZWN0aW9uUmVmIHx8IGRlZmF1bHRJbnB1dENvbGxlY3Rpb247IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RGVmYXVsdCBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiB0eXBlPVwidGV4dFwiIHBJbnB1dFRleHQgY2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIC8+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXREZWZhdWx0UmVmIHx8IGRlZmF1bHRJbnB1dERlZmF1bHQ7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8dmFsLWVycm9ycyBbY29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZSB8fCBudWxsXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cInJlcXVpcmVkXCI+VGhlIGZpZWxkICd7e3Byb3BlcnR5LnByb21wdCB8fCBwcm9wZXJ0eS5uYW1lfX0nIGlzIHJlcXVpcmVkLjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cImVtYWlsXCI+VGhlIGVtYWlsIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cIm1pblwiIGxldC1lcnJvcj1cImVycm9yXCI+J3t7cHJvcGVydHkucHJvbXB0IHx8IHByb3BlcnR5Lm5hbWV9fScgbXVzdCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8ge3sgZXJyb3IubWluIH19LjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cIm1heFwiIGxldC1lcnJvcj1cImVycm9yXCI+J3t7cHJvcGVydHkucHJvbXB0IHx8IHByb3BlcnR5Lm5hbWV9fScgbXVzdCBiZSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8ge3sgZXJyb3IubWF4IH19LjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cIm1pbmxlbmd0aFwiIGxldC1lcnJvcj1cImVycm9yXCI+VGhlIGxlbmd0aCBvZiAne3twcm9wZXJ0eS5wcm9tcHQgfHwgcHJvcGVydHkubmFtZX19JyBtdXN0IGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB7eyBlcnJvci5yZXF1aXJlZExlbmd0aCB9fS48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgdmFsRXJyb3I9XCJtYXhsZW5ndGhcIiBsZXQtZXJyb3I9XCJlcnJvclwiPlRoZSBsZW5ndGggb2YgJ3t7cHJvcGVydHkucHJvbXB0IHx8IHByb3BlcnR5Lm5hbWV9fScgbXVzdCBiZSBzaG9ydGVyIHRoYW4gb3IgZXF1YWwgdG8ge3sgZXJyb3IucmVxdWlyZWRMZW5ndGggfX0uPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlIHZhbEVycm9yPVwicGF0dGVyblwiIGxldC1lcnJvcj1cImVycm9yXCI+VGhlIHZhbHVlIGZvciAne3twcm9wZXJ0eS5wcm9tcHQgfHwgcHJvcGVydHkubmFtZX19JyBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVybiB7eyBlcnJvciB9fS48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgdmFsRXJyb3I9XCJyZW1vdGVcIiBsZXQtZXJyb3I9XCJlcnJvclwiPnt7IGVycm9yIH19PC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvdmFsLWVycm9ycz5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -1,57 +0,0 @@
1
- import { Component, forwardRef, Input, ViewChildren } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { FileUpload } from 'primeng/fileupload';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "primeng/tooltip";
7
- import * as i3 from "primeng/button";
8
- import * as i4 from "primeng/fileupload";
9
- import * as i5 from "../../pipes/safe-url.pipe";
10
- export class RESTWorldFileViewComponent {
11
- constructor() {
12
- this.disabled = false;
13
- }
14
- writeValue(obj) {
15
- this.uri = obj;
16
- }
17
- registerOnChange(fn) {
18
- this.onChange = fn;
19
- }
20
- registerOnTouched() {
21
- // not needed for this component, but needed to implement the interface
22
- }
23
- setDisabledState(isDisabled) {
24
- this.disabled = isDisabled;
25
- }
26
- fileChanged(event) {
27
- const file = event.files[0];
28
- const reader = new FileReader();
29
- reader.onload = () => {
30
- this.uri = reader.result;
31
- this.onChange?.(this.uri);
32
- };
33
- reader.readAsDataURL(file);
34
- }
35
- }
36
- RESTWorldFileViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: RESTWorldFileViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
37
- RESTWorldFileViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.3", type: RESTWorldFileViewComponent, selector: "rw-file", inputs: { accept: "accept", fileName: "fileName" }, providers: [{
38
- provide: NG_VALUE_ACCESSOR,
39
- useExisting: forwardRef(() => RESTWorldFileViewComponent),
40
- multi: true
41
- }], viewQueries: [{ propertyName: "fileUploads", predicate: FileUpload, descendants: true }], ngImport: i0, template: "<div class=\"flex align-items-center\">\r\n <p-button *ngIf=\"!uri\" [disabled]=\"true\" icon=\"pi pi-download\" class=\"mr-1\" pTooltip=\"No file present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download file\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload chooseIcon=\"pi-upload fas fa-upload\" pTooltip=\"Upload new file\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || ''\" [customUpload]=\"true\" (uploadHandler)=\"fileChanged($event)\"></p-fileUpload>\r\n</div>\r\n", styles: ["a{text-decoration:none;height:calc(1rem + 18px)}a.p-button-icon-only span.p-button-label{height:1rem!important}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i4.FileUpload, selector: "p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError"] }, { kind: "pipe", type: i5.SafeUrlPipe, name: "safeUrl" }] });
42
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.3", ngImport: i0, type: RESTWorldFileViewComponent, decorators: [{
43
- type: Component,
44
- args: [{ selector: 'rw-file', providers: [{
45
- provide: NG_VALUE_ACCESSOR,
46
- useExisting: forwardRef(() => RESTWorldFileViewComponent),
47
- multi: true
48
- }], template: "<div class=\"flex align-items-center\">\r\n <p-button *ngIf=\"!uri\" [disabled]=\"true\" icon=\"pi pi-download\" class=\"mr-1\" pTooltip=\"No file present\"></p-button>\r\n <a *ngIf=\"uri\" [href]=\"uri | safeUrl\" [download]=\"fileName || 'download'\" class=\"mr-1\" pButton pTooltip=\"Download file\" icon=\"pi pi-download\"></a>\r\n <p-fileUpload chooseIcon=\"pi-upload fas fa-upload\" pTooltip=\"Upload new file\" mode=\"basic\" [auto]=\"true\" [accept]=\"accept || ''\" [customUpload]=\"true\" (uploadHandler)=\"fileChanged($event)\"></p-fileUpload>\r\n</div>\r\n", styles: ["a{text-decoration:none;height:calc(1rem + 18px)}a.p-button-icon-only span.p-button-label{height:1rem!important}\n"] }]
49
- }], propDecorators: { accept: [{
50
- type: Input
51
- }], fileName: [{
52
- type: Input
53
- }], fileUploads: [{
54
- type: ViewChildren,
55
- args: [FileUpload]
56
- }] } });
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWZpbGUtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1maWxlLXZpZXcvcmVzdHdvcmxkLWZpbGUtdmlldy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1maWxlLXZpZXcvcmVzdHdvcmxkLWZpbGUtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQWEsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7QUFZaEQsTUFBTSxPQUFPLDBCQUEwQjtJQVZ2QztRQXFCUyxhQUFRLEdBQUcsS0FBSyxDQUFDO0tBMEJ6QjtJQXZCQyxVQUFVLENBQUMsR0FBWTtRQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsRUFBYTtRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsdUVBQXVFO0lBQ3pFLENBQUM7SUFDRCxnQkFBZ0IsQ0FBRSxVQUFtQjtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUM3QixDQUFDO0lBRU0sV0FBVyxDQUFDLEtBQXdCO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFnQixDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDO1FBRUYsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDOzt1SEFwQ1UsMEJBQTBCOzJHQUExQiwwQkFBMEIsc0ZBTjFCLENBQUM7WUFDVixPQUFPLEVBQUUsaUJBQWlCO1lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMEJBQTBCLENBQUM7WUFDekQsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDLDBEQVVZLFVBQVUsZ0RDdEIxQiw2akJBS0E7MkZEU2EsMEJBQTBCO2tCQVZ0QyxTQUFTOytCQUNFLFNBQVMsYUFHUixDQUFDOzRCQUNWLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDJCQUEyQixDQUFDOzRCQUN6RCxLQUFLLEVBQUUsSUFBSTt5QkFDWixDQUFDOzhCQUtLLE1BQU07c0JBRFosS0FBSztnQkFJQyxRQUFRO3NCQURkLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkIH0gZnJvbSAncHJpbWVuZy9maWxldXBsb2FkJztcclxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdydy1maWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Jlc3R3b3JsZC1maWxlLXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZXN0d29ybGQtZmlsZS12aWV3LmNvbXBvbmVudC5jc3MnXSxcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSRVNUV29ybGRGaWxlVmlld0NvbXBvbmVudCksXHJcbiAgICBtdWx0aTogdHJ1ZVxyXG4gIH1dXG59KVxuZXhwb3J0IGNsYXNzIFJFU1RXb3JsZEZpbGVWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcml2YXRlIG9uQ2hhbmdlPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhY2NlcHQ/OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGZpbGVOYW1lPzogc3RyaW5nO1xuXHJcbiAgQFZpZXdDaGlsZHJlbihGaWxlVXBsb2FkKVxyXG4gIGZpbGVVcGxvYWRzPzogUXVlcnlMaXN0PEZpbGVVcGxvYWQ+O1xuXG4gIHB1YmxpYyBkaXNhYmxlZCA9IGZhbHNlO1xuICBwdWJsaWMgdXJpPzogc3RyaW5nO1xyXG5cbiAgd3JpdGVWYWx1ZShvYmo/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMudXJpID0gb2JqO1xyXG4gIH1cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuPzogRnVuY3Rpb24pOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoKTogdm9pZCB7XHJcbiAgICAvLyBub3QgbmVlZGVkIGZvciB0aGlzIGNvbXBvbmVudCwgYnV0IG5lZWRlZCB0byBpbXBsZW1lbnQgdGhlIGludGVyZmFjZVxyXG4gIH1cclxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICB9XG5cbiAgcHVibGljIGZpbGVDaGFuZ2VkKGV2ZW50OiB7IGZpbGVzOiBGaWxlW10gfSk6IHZvaWQge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50LmZpbGVzWzBdO1xyXG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMudXJpID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XHJcbiAgICAgIHRoaXMub25DaGFuZ2U/Lih0aGlzLnVyaSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gIDxwLWJ1dHRvbiAqbmdJZj1cIiF1cmlcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiIGljb249XCJwaSBwaS1kb3dubG9hZFwiIGNsYXNzPVwibXItMVwiIHBUb29sdGlwPVwiTm8gZmlsZSBwcmVzZW50XCI+PC9wLWJ1dHRvbj5cclxuICA8YSAqbmdJZj1cInVyaVwiIFtocmVmXT1cInVyaSB8IHNhZmVVcmxcIiBbZG93bmxvYWRdPVwiZmlsZU5hbWUgfHwgJ2Rvd25sb2FkJ1wiIGNsYXNzPVwibXItMVwiIHBCdXR0b24gcFRvb2x0aXA9XCJEb3dubG9hZCBmaWxlXCIgaWNvbj1cInBpIHBpLWRvd25sb2FkXCI+PC9hPlxyXG4gIDxwLWZpbGVVcGxvYWQgY2hvb3NlSWNvbj1cInBpLXVwbG9hZCBmYXMgZmEtdXBsb2FkXCIgcFRvb2x0aXA9XCJVcGxvYWQgbmV3IGZpbGVcIiBtb2RlPVwiYmFzaWNcIiBbYXV0b109XCJ0cnVlXCIgW2FjY2VwdF09XCJhY2NlcHQgfHwgJydcIiBbY3VzdG9tVXBsb2FkXT1cInRydWVcIiAodXBsb2FkSGFuZGxlcik9XCJmaWxlQ2hhbmdlZCgkZXZlbnQpXCI+PC9wLWZpbGVVcGxvYWQ+XHJcbjwvZGl2PlxyXG4iXX0=