@wertzui/ngx-restworld-client 1.0.2 → 2.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 (31) hide show
  1. package/bundles/wertzui-ngx-restworld-client.umd.js +1101 -301
  2. package/bundles/wertzui-ngx-restworld-client.umd.js.map +1 -1
  3. package/esm2015/lib/models/problem-details.js +2 -2
  4. package/esm2015/lib/pipes/as.pipe.js +25 -0
  5. package/esm2015/lib/pipes/safe-url.pipe.js +23 -0
  6. package/esm2015/lib/restworld-client.module.js +68 -8
  7. package/esm2015/lib/services/avatar-generator.js +2 -2
  8. package/esm2015/lib/services/form.service.js +69 -0
  9. package/esm2015/lib/services/restworld-client-collection.js +1 -1
  10. package/esm2015/lib/services/restworld-client.js +46 -8
  11. package/esm2015/lib/views/restworld-edit-form/restworld-edit-form.component.js +238 -0
  12. package/esm2015/lib/views/restworld-edit-view/restworld-edit-view.component.js +209 -143
  13. package/esm2015/lib/views/restworld-file-view/restworld-file-view.component.js +63 -0
  14. package/esm2015/lib/views/restworld-image-view/restworld-image-view.component.js +107 -0
  15. package/esm2015/lib/views/restworld-list-view/restworld-list-view.component.js +64 -37
  16. package/esm2015/public-api.js +7 -1
  17. package/fesm2015/wertzui-ngx-restworld-client.js +880 -220
  18. package/fesm2015/wertzui-ngx-restworld-client.js.map +1 -1
  19. package/lib/models/problem-details.d.ts +4 -8
  20. package/lib/pipes/as.pipe.d.ts +18 -0
  21. package/lib/pipes/safe-url.pipe.d.ts +10 -0
  22. package/lib/restworld-client.module.d.ts +35 -21
  23. package/lib/services/form.service.d.ts +14 -0
  24. package/lib/services/restworld-client.d.ts +4 -1
  25. package/lib/views/restworld-edit-form/restworld-edit-form.component.d.ts +69 -0
  26. package/lib/views/restworld-edit-view/restworld-edit-view.component.d.ts +53 -32
  27. package/lib/views/restworld-file-view/restworld-file-view.component.d.ts +21 -0
  28. package/lib/views/restworld-image-view/restworld-image-view.component.d.ts +38 -0
  29. package/lib/views/restworld-list-view/restworld-list-view.component.d.ts +20 -8
  30. package/package.json +29 -8
  31. package/public-api.d.ts +6 -0
@@ -0,0 +1,238 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Component, ContentChild, Input } from '@angular/core';
3
+ import { FormArray, FormGroup } from '@angular/forms';
4
+ import { PropertyType, Template } from '@wertzui/ngx-hal-client';
5
+ import { ProblemDetails } from '../../models/problem-details';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../services/form.service";
8
+ import * as i2 from "primeng/api";
9
+ import * as i3 from "../../services/restworld-client-collection";
10
+ import * as i4 from "primeng/dropdown";
11
+ import * as i5 from "primeng/multiselect";
12
+ import * as i6 from "primeng/calendar";
13
+ import * as i7 from "primeng/inputnumber";
14
+ import * as i8 from "primeng/checkbox";
15
+ import * as i9 from "primeng/tristatecheckbox";
16
+ import * as i10 from "../restworld-image-view/restworld-image-view.component";
17
+ import * as i11 from "../restworld-file-view/restworld-file-view.component";
18
+ import * as i12 from "ngx-valdemort";
19
+ import * as i13 from "@angular/common";
20
+ import * as i14 from "@angular/forms";
21
+ import * as i15 from "primeng/tooltip";
22
+ import * as i16 from "primeng/inputtext";
23
+ import * as i17 from "@angular/cdk/drag-drop";
24
+ import * as i18 from "primeng/button";
25
+ import * as i19 from "primeng/ripple";
26
+ import * as i20 from "../../pipes/as.pipe";
27
+ export class RestworldEditFormComponent {
28
+ constructor(_formService, _changeDetectorRef, _messageService, _clients) {
29
+ this._formService = _formService;
30
+ this._changeDetectorRef = _changeDetectorRef;
31
+ this._messageService = _messageService;
32
+ this._clients = _clients;
33
+ this.FormGroup = FormGroup;
34
+ this.FormArray = FormArray;
35
+ this.Number = Number;
36
+ }
37
+ get PropertyType() {
38
+ return PropertyType;
39
+ }
40
+ get dateFormat() {
41
+ return new Date(3333, 10, 22)
42
+ .toLocaleDateString()
43
+ .replace("22", "dd")
44
+ .replace("11", "mm")
45
+ .replace("3333", "yy")
46
+ .replace("33", "y");
47
+ }
48
+ ngOnInit() {
49
+ if (!this.formGroup)
50
+ throw new Error("[formGroup] is required on <rw-form>");
51
+ if (!this.template)
52
+ throw new Error("[template] is required on <rw-form>");
53
+ if (!this.apiName)
54
+ throw new Error("[apiName] is required on <rw-form>");
55
+ }
56
+ getTooltip(resource, keysToExclude) {
57
+ const tooltip = Object.entries(resource)
58
+ .filter(([key]) => !(key.startsWith('_') || ['createdAt', 'createdBy', 'lastChangedAt', 'lastChangedBy', 'timestamp'].includes(key) || (keysToExclude === null || keysToExclude === void 0 ? void 0 : keysToExclude.includes(key))))
59
+ .reduce((prev, [key, value], index) => `${prev}${index === 0 ? '' : '\n'}${key}: ${RestworldEditFormComponent.jsonStringifyWithElipsis(value)}`, '');
60
+ return tooltip;
61
+ }
62
+ static jsonStringifyWithElipsis(value) {
63
+ const maxLength = 200;
64
+ const end = 10;
65
+ const start = maxLength - end - 2;
66
+ const json = JSON.stringify(value);
67
+ const shortened = json.length > maxLength ? json.substring(0, start) + '…' + json.substring(json.length - end) : json;
68
+ return shortened;
69
+ }
70
+ getCollectionEntryTemplates(property) {
71
+ if (!property)
72
+ return [];
73
+ return Object.entries(property._templates)
74
+ .filter(([key,]) => Number.isInteger(Number.parseInt(key)))
75
+ .map(([, value]) => value);
76
+ }
77
+ addNewItemToCollection(property, formArray) {
78
+ if (!(formArray instanceof FormArray))
79
+ throw new Error('formArray is not an instance of FormArray.');
80
+ const maxIndex = Math.max(...Object.keys(property._templates)
81
+ .map(key => Number.parseInt(key))
82
+ .filter(key => Number.isSafeInteger(key)));
83
+ const nextIndex = maxIndex + 1;
84
+ const defaultTemplate = property._templates['default'];
85
+ const copiedTemplateDto = JSON.parse(JSON.stringify(defaultTemplate));
86
+ const copiedTemplate = new Template(copiedTemplateDto);
87
+ copiedTemplate.title = nextIndex.toString();
88
+ property._templates[copiedTemplate.title] = copiedTemplate;
89
+ formArray.push(this._formService.createFormGroupFromTemplate(defaultTemplate));
90
+ }
91
+ deleteItemFromCollection(property, formArray, template) {
92
+ if (!template.title)
93
+ throw new Error(`Cannot delete the item, because the template '${template}' does not have a title.`);
94
+ if (!(formArray instanceof FormArray))
95
+ throw new Error('formArray is not an instance of FormArray.');
96
+ const templates = property._templates;
97
+ delete templates[template.title];
98
+ formArray.removeAt(Number.parseInt(template.title));
99
+ }
100
+ collectionItemDropped($event) {
101
+ const formArray = $event.container.data.formArray;
102
+ const previousIndex = $event.previousIndex;
103
+ const currentIndex = $event.currentIndex;
104
+ const movementDirection = currentIndex > previousIndex ? 1 : -1;
105
+ // Move in FormArray
106
+ // We do not need to move the item in the _templates object
107
+ const movedControl = formArray.at(previousIndex);
108
+ for (let i = previousIndex; i * movementDirection < currentIndex * movementDirection; i = i + movementDirection) {
109
+ formArray.setControl(i, formArray.at(i + movementDirection));
110
+ }
111
+ formArray.setControl(currentIndex, movedControl);
112
+ this._changeDetectorRef.markForCheck();
113
+ console.log($event);
114
+ }
115
+ onOptionsFiltered(property, event) {
116
+ var _a, _b;
117
+ return __awaiter(this, void 0, void 0, function* () {
118
+ const options = property === null || property === void 0 ? void 0 : property.options;
119
+ if (!((_a = options === null || options === void 0 ? void 0 : options.link) === null || _a === void 0 ? void 0 : _a.href) || !event.filter || event.filter === '')
120
+ return;
121
+ const templatedUri = options.link.href;
122
+ let filter = `contains(${options.promptField}, '${event.filter}')`;
123
+ if (((_b = options.valueField) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === 'id' && !Number.isNaN(Number.parseInt(event.filter)))
124
+ filter = `(${options.valueField} eq ${event.filter}) or (${filter})`;
125
+ const response = yield 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
+ }
135
+ getClient() {
136
+ if (!this.apiName)
137
+ throw new Error('Cannot get a client, because the apiName is not set.');
138
+ return this._clients.getClient(this.apiName);
139
+ }
140
+ }
141
+ RestworldEditFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: RestworldEditFormComponent, deps: [{ token: i1.FormService }, { token: i0.ChangeDetectorRef }, { token: i2.MessageService }, { token: i3.RESTworldClientCollection }], target: i0.ɵɵFactoryTarget.Component });
142
+ RestworldEditFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.11", type: RestworldEditFormComponent, selector: "rw-form", inputs: { formGroup: "formGroup", template: "template", apiName: "apiName" }, queries: [{ propertyName: "inputOptionsSingleRef", first: true, predicate: ["inputOptionsSingle"], descendants: true }, { propertyName: "inputOptionsMultipleRef", first: true, predicate: ["inputOptionsMultiple"], descendants: true }, { propertyName: "inputOptionsRef", first: true, predicate: ["inputOptions"], descendants: true }, { propertyName: "inputHiddenRef", first: true, predicate: ["inputHidden"], descendants: true }, { propertyName: "inputTextRef", first: true, predicate: ["inputText"], descendants: true }, { propertyName: "inputTextareaRef", first: true, predicate: ["inputTextarea"], descendants: true }, { propertyName: "inputSearchRef", first: true, predicate: ["inputSearch"], descendants: true }, { propertyName: "inputTelRef", first: true, predicate: ["inputTel"], descendants: true }, { propertyName: "inputUrlRef", first: true, predicate: ["inputUrl"], descendants: true }, { propertyName: "inputEmailRef", first: true, predicate: ["inputEmail"], descendants: true }, { propertyName: "inputPasswordRef", first: true, predicate: ["inputPassword"], descendants: true }, { propertyName: "inputDateRef", first: true, predicate: ["inputDate"], descendants: true }, { propertyName: "inputMonthRef", first: true, predicate: ["inputMonth"], descendants: true }, { propertyName: "inputWeekRef", first: true, predicate: ["inputWeek"], descendants: true }, { propertyName: "inputTimeRef", first: true, predicate: ["inputTime"], descendants: true }, { propertyName: "inputDatetimeLocalRef", first: true, predicate: ["inputDatetimeLocal"], descendants: true }, { propertyName: "inputNumberRef", first: true, predicate: ["inputNumber"], descendants: true }, { propertyName: "inputRangeRef", first: true, predicate: ["inputRange"], descendants: true }, { propertyName: "inputColorRef", first: true, predicate: ["inputColor"], descendants: true }, { propertyName: "inputBoolRef", first: true, predicate: ["inputBool"], descendants: true }, { propertyName: "inputDatetimeOffsetRef", first: true, predicate: ["inputDatetimeOffset"], descendants: true }, { propertyName: "inputDurationRef", first: true, predicate: ["inputDuration"], descendants: true }, { propertyName: "inputImageRef", first: true, predicate: ["inputImage"], descendants: true }, { propertyName: "inputFileRef", first: true, predicate: ["inputFile"], descendants: true }, { propertyName: "inputObjectRef", first: true, predicate: ["inputObject"], descendants: true }, { propertyName: "inputCollectionRef", first: true, predicate: ["inputCollection"], descendants: true }, { propertyName: "inputDefaultRef", first: true, predicate: ["inputDefault"], descendants: true }], ngImport: i0, template: "<div *ngFor=\"let property of template.properties\" class=\"grid field\" [formGroup]=\"formGroup\">\r\n <label *ngIf=\"property.type !== PropertyType.Hidden\" [attr.for]=\"property.name\" class=\"col-12 mb-2 md:col-2 md:mb-0\" [class.p-disabled]=\"property.readOnly\" [class.hasChildren]=\"property._templates\">{{property.prompt || property.name}}</label>\r\n <div class=\"col-12 md:col-10\">\r\n\r\n <ng-template #defaultInputOptions let-property=\"property\" let-template=\"template\">\r\n\r\n <ng-template #defaultInputOptionsSingle let-property=\"property\" let-template=\"template\">\r\n <p-dropdown [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [filterBy]=\"(property.options.promptField || 'prompt') + ',' + (property.options.valueField || 'value')\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [required]=\"property.required || property.options.minItems > 0\" [filter]=\"true\" [autoDisplayFirst]=\"false\" [showClear]=\"!property.required || property.options.minItems <= 0\" (onFilter)=\"onOptionsFiltered(property, $event)\" styleClass=\"w-full\" [filterPlaceholder]=\"property?.options?.link?.href ? 'search for more results' : ''\">\r\n <ng-template let-item pTemplate=\"selectedItem\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n <ng-template let-item pTemplate=\"item\">\r\n <span [pTooltip]=\"getTooltip(item, [property.options.promptField || 'prompt', property.options.valueField || 'value'])\">{{item[property.options.promptField || 'prompt']}} ({{item[property.options.valueField || 'value']}})</span>\r\n </ng-template>\r\n </p-dropdown>\r\n </ng-template>\r\n <ng-container *ngIf=\"!property.options.maxItems || property.options.maxItems == 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsSingleRef || defaultInputOptionsSingle; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputOptionsMultiple let-property=\"property\" let-template=\"template\">\r\n <p-multiSelect [formControlName]=\"property.name\" [id]=\"property.name\" [options]=\"property.options.inline\" [optionLabel]=\"property.options.promptField || 'prompt'\" [optionValue]=\"property.options.valueField || 'value'\" [readonly]=\"property.readOnly\" [selectionLimit]=\"property.options.maxItems\" [required]=\"property.required || property.options.minItems > 0\"></p-multiSelect>\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options.maxItems > 1\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsMultipleRef || defaultInputOptionsMultiple; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </ng-template>\r\n <ng-container *ngIf=\"property.options\">\r\n <ng-container *ngTemplateOutlet=\"inputOptionsRef || defaultInputOptions; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <div *ngIf=\"!property.options\">\r\n <div [ngSwitch]=\"property.type\">\r\n\r\n <ng-template #defaultInputHidden let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"hidden\" [value]=\"property.value\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Hidden\">\r\n <ng-container *ngTemplateOutlet=\"inputHiddenRef || defaultInputHidden; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #defaultInputText let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Text\">\r\n <ng-container *ngTemplateOutlet=\"inputTextRef || defaultInputText; context:{ property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTextarea let-property=\"property\" let-template=\"template\">\r\n <textarea [formControlName]=\"property.name\" [id]=\"property.name\" pInputTextarea class=\"w-full p-inputtextarea p-inputtext p-component p-element\" [class.p-disabled]=\"property.readOnly\" [cols]=\"property.cols\" [rows]=\"property.rows\"></textarea>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Textarea\">\r\n <ng-container *ngTemplateOutlet=\"inputTextareaRef || defaultInputTextarea; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputSearch let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"search\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Search\">\r\n <ng-container *ngTemplateOutlet=\"inputSearchRef || defaultInputSearch; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTel let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"tel\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Tel\">\r\n <ng-container *ngTemplateOutlet=\"inputTelRef || defaultInputTel; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputUrl let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"url\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Url\">\r\n <ng-container *ngTemplateOutlet=\"inputUrlRef || defaultInputUrl; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputEmail let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"email\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Email\">\r\n <ng-container *ngTemplateOutlet=\"inputEmailRef || defaultInputEmail; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputPassword let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"password\" pPassword class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Password\">\r\n <ng-container *ngTemplateOutlet=\"inputPasswordRef || defaultInputPassword; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDate let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"true\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Date\">\r\n <ng-container *ngTemplateOutlet=\"inputDateRef || defaultInputDate; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputMonth let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showWeek]=\"false\" view=\"month\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Month\">\r\n <ng-container *ngTemplateOutlet=\"inputMonthRef || defaultInputMonth; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputWeek let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"week\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Week\">\r\n <ng-container *ngTemplateOutlet=\"inputWeekRef || defaultInputWeek; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputTime let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Time\">\r\n <ng-container *ngTemplateOutlet=\"inputTimeRef || defaultInputTime; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeLocal let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeLocal\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeLocalRef || defaultInputDatetimeLocal; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputNumber let-property=\"property\" let-template=\"template\">\r\n <p-inputNumber [formControlName]=\"property.name\" [id]=\"property.name\" mode=\"decimal\" [showButtons]=\"!property.readOnly\" class=\"w-full\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-inputNumber>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Number\">\r\n <ng-container *ngTemplateOutlet=\"inputNumberRef || defaultInputNumber; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputRange let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"range\" [min]=\"property.min\" [max]=\"property.max\" [step]=\"property.step\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Range\">\r\n <ng-container *ngTemplateOutlet=\"inputRangeRef || defaultInputRange; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputColor let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"color\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Color\">\r\n <ng-container *ngTemplateOutlet=\"inputColorRef || defaultInputColor; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputBool let-property=\"property\" let-template=\"template\" let-formGroup=\"formGroup\">\r\n <p-checkbox *ngIf=\"property.required\" [binary]=\"true\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-checkbox>\r\n <p-triStateCheckbox *ngIf=\"!property.required\" [formControl]=\"formGroup.controls[property.name]\" [id]=\"property.name\" [readonly]=\"property.readOnly\"></p-triStateCheckbox>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Bool\">\r\n <ng-container *ngTemplateOutlet=\"inputBoolRef || defaultInputBool; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDatetimeOffset let-property=\"property\" let-template=\"template\">\r\n <p-calendar [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.DatetimeOffset\">\r\n <ng-container *ngTemplateOutlet=\"inputDatetimeOffsetRef || defaultInputDatetimeOffset; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDuration let-property=\"property\" let-template=\"template\">\r\n <p-calendar *ngSwitchCase=\"PropertyType.Duration\" [formControlName]=\"property.name\" [id]=\"property.name\" [dateFormat]=\"dateFormat\" [showTime]=\"true\" [timeOnly]=\"true\" [showWeek]=\"false\" [showIcon]=\"true\" styleClass=\"w-full\" [class.p-disabled]=\"property.readOnly\"></p-calendar>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Duration\">\r\n <ng-container *ngTemplateOutlet=\"inputDurationRef || defaultInputDuration; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputImage let-property=\"property\" let-template=\"template\">\r\n <rw-image [formControlName]=\"property.name\" [accept]=\"property.placeholder\"></rw-image>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Image\">\r\n <ng-container *ngTemplateOutlet=\"inputImageRef || defaultInputImage; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputFile let-property=\"property\" let-template=\"template\">\r\n <rw-file [formControlName]=\"property.name\" [fileName]=\"property.name\" [accept]=\"property.placeholder\"></rw-file>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.File\">\r\n <ng-container *ngTemplateOutlet=\"inputFileRef || defaultInputFile; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputObject let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\">\r\n <rw-form [formGroup]=\"(formGroup.controls[property.name] | as : FormGroup)\" [template]=\"property._templates.default\" [apiName]=\"apiName\"></rw-form>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Object\">\r\n <ng-container *ngTemplateOutlet=\"inputObjectRef || defaultInputObject; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputCollection let-property=\"property\" let-template=\"template\">\r\n <div class=\"flex align-items-center\">\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full\" cdkDropList [cdkDropListData]=\"{ property: property, formArray: (formGroup.controls[property.name] | as : FormArray)}\" (cdkDropListDropped)=\"collectionItemDropped($event)\">\r\n <div *ngFor=\"let template of getCollectionEntryTemplates(property)\" class=\"flex align-items-center\" cdkDrag>\r\n <i class=\"fas fa-grip-lines\" cdkDragHandle></i>\r\n <div class=\"brace\">\r\n </div>\r\n <div class=\"w-full flex justify-content-end\">\r\n <rw-form [formGroup]=\"((formGroup.controls[property.name] | as : FormArray).controls[Number.parseInt(template.title!)] | as : FormGroup)\" [template]=\"template\" [apiName]=\"apiName\" class=\"w-full\"></rw-form>\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-trash\" class=\"p-button-outlined p-button-danger ml-2 mb-3\" (click)=\"deleteItemFromCollection(property, formGroup.controls[property.name], template)\"></button>\r\n </div>\r\n </div>\r\n <div class=\"flex justify-content-end w-full\">\r\n <button pButton pRipple type=\"button\" icon=\"fas fa-plus\" class=\"p-button-outlined p-button-info\" (click)=\"addNewItemToCollection(property, formGroup.controls[property.name])\"></button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <ng-container *ngSwitchCase=\"PropertyType.Collection\">\r\n <ng-container *ngTemplateOutlet=\"inputCollectionRef || defaultInputCollection; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-template #defaultInputDefault let-property=\"property\" let-template=\"template\">\r\n <input [formControlName]=\"property.name\" [id]=\"property.name\" type=\"text\" pInputText class=\"w-full\" [class.p-disabled]=\"property.readOnly\" />\r\n </ng-template>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container *ngTemplateOutlet=\"inputDefaultRef || defaultInputDefault; context: { property: property, template: template, formGroup: formGroup, apiName: apiName }\"></ng-container>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n <val-errors [controlName]=\"property.name || null\">\r\n <ng-template valError=\"required\">The field '{{property.prompt || property.name}}' is required.</ng-template>\r\n <ng-template valError=\"email\">The email must be a valid email address.</ng-template>\r\n <ng-template valError=\"min\" let-error=\"error\">'{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.min }}.</ng-template>\r\n <ng-template valError=\"max\" let-error=\"error\">'{{property.prompt || property.name}}' must be smaller than or equal to {{ error.max }}.</ng-template>\r\n <ng-template valError=\"minlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be equal or greater than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"maxlength\" let-error=\"error\">The length of '{{property.prompt || property.name}}' must be shorter than or equal to {{ error.requiredLength }}.</ng-template>\r\n <ng-template valError=\"pattern\" let-error=\"error\">The value for '{{property.prompt || property.name}}' does not match the pattern {{ error }}.</ng-template>\r\n <ng-template valError=\"remote\" let-error=\"error\">{{ error }}</ng-template>\r\n </val-errors>\r\n </div>\r\n</div>\r\n", styles: [".brace{align-self:stretch;margin:.2rem .5rem;border-left:1px solid rgb(206,212,218);border-top:1px solid rgb(206,212,218);border-bottom:1px solid rgb(206,212,218);width:1rem}.cdk-drag-handle{cursor:move}.cdk-drag-preview{background-color:#ffffffd0;border:2px dashed rgb(206,212,218);cursor:move}.cdk-drag-placeholder{border:2px dashed rgb(206,212,218);margin:-2px}\n"], components: [{ type: i4.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "virtualScroll", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear"] }, { type: i5.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "autoZIndex", "baseZIndex", "filterBy", "virtualScroll", "itemSize", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "scrollHeight", "defaultLabel", "placeholder", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onPanelShow", "onPanelHide"] }, { type: i6.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "numberOfMonths", "view", "touchUI", "timeSeparator", "focusTrap", "firstDayOfWeek", "showTransitionOptions", "hideTransitionOptions", "tabindex", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { type: i7.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown"] }, { type: i8.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "trueValue", "falseValue"], outputs: ["onChange"] }, { type: i9.TriStateCheckbox, selector: "p-triStateCheckbox", inputs: ["disabled", "name", "ariaLabelledBy", "tabindex", "inputId", "style", "styleClass", "label", "readonly", "checkboxTrueIcon", "checkboxFalseIcon"], outputs: ["onChange"] }, { type: i10.RESTWorldImageViewComponent, selector: "rw-image", inputs: ["alt", "accept", "fileName", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "onlyScaleDown", "containWithinAspectRatio", "backgroundColor", "format"] }, { type: i11.RESTWorldFileViewComponent, selector: "rw-file", inputs: ["accept", "fileName"] }, { type: RestworldEditFormComponent, selector: "rw-form", inputs: ["formGroup", "template", "apiName"] }, { type: i12.ValidationErrorsComponent, selector: "val-errors", inputs: ["control", "controlName", "label"] }], directives: [{ type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i14.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i14.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i14.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i15.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i13.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i13.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i16.InputText, selector: "[pInputText]" }, { type: i14.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { type: i14.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i17.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "id", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListAutoScrollDisabled", "cdkDropListOrientation", "cdkDropListLockAxis", "cdkDropListData", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i17.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragDisabled", "cdkDragStartDelay", "cdkDragLockAxis", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragBoundary", "cdkDragRootElement", "cdkDragPreviewContainer", "cdkDragData", "cdkDragFreeDragPosition"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { type: i17.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { type: i18.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i19.Ripple, selector: "[pRipple]" }, { type: i13.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i12.ValidationErrorDirective, selector: "ng-template[valError]", inputs: ["valError"] }], pipes: { "as": i20.AsPipe } });
143
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.11", ngImport: i0, type: RestworldEditFormComponent, decorators: [{
144
+ type: Component,
145
+ args: [{
146
+ selector: 'rw-form',
147
+ templateUrl: './restworld-edit-form.component.html',
148
+ styleUrls: ['./restworld-edit-form.component.css']
149
+ }]
150
+ }], ctorParameters: function () { return [{ type: i1.FormService }, { type: i0.ChangeDetectorRef }, { type: i2.MessageService }, { type: i3.RESTworldClientCollection }]; }, propDecorators: { formGroup: [{
151
+ type: Input
152
+ }], template: [{
153
+ type: Input
154
+ }], apiName: [{
155
+ type: Input
156
+ }], inputOptionsSingleRef: [{
157
+ type: ContentChild,
158
+ args: ['inputOptionsSingle', { static: false }]
159
+ }], inputOptionsMultipleRef: [{
160
+ type: ContentChild,
161
+ args: ['inputOptionsMultiple', { static: false }]
162
+ }], inputOptionsRef: [{
163
+ type: ContentChild,
164
+ args: ['inputOptions', { static: false }]
165
+ }], inputHiddenRef: [{
166
+ type: ContentChild,
167
+ args: ['inputHidden', { static: false }]
168
+ }], inputTextRef: [{
169
+ type: ContentChild,
170
+ args: ['inputText', { static: false }]
171
+ }], inputTextareaRef: [{
172
+ type: ContentChild,
173
+ args: ['inputTextarea', { static: false }]
174
+ }], inputSearchRef: [{
175
+ type: ContentChild,
176
+ args: ['inputSearch', { static: false }]
177
+ }], inputTelRef: [{
178
+ type: ContentChild,
179
+ args: ['inputTel', { static: false }]
180
+ }], inputUrlRef: [{
181
+ type: ContentChild,
182
+ args: ['inputUrl', { static: false }]
183
+ }], inputEmailRef: [{
184
+ type: ContentChild,
185
+ args: ['inputEmail', { static: false }]
186
+ }], inputPasswordRef: [{
187
+ type: ContentChild,
188
+ args: ['inputPassword', { static: false }]
189
+ }], inputDateRef: [{
190
+ type: ContentChild,
191
+ args: ['inputDate', { static: false }]
192
+ }], inputMonthRef: [{
193
+ type: ContentChild,
194
+ args: ['inputMonth', { static: false }]
195
+ }], inputWeekRef: [{
196
+ type: ContentChild,
197
+ args: ['inputWeek', { static: false }]
198
+ }], inputTimeRef: [{
199
+ type: ContentChild,
200
+ args: ['inputTime', { static: false }]
201
+ }], inputDatetimeLocalRef: [{
202
+ type: ContentChild,
203
+ args: ['inputDatetimeLocal', { static: false }]
204
+ }], inputNumberRef: [{
205
+ type: ContentChild,
206
+ args: ['inputNumber', { static: false }]
207
+ }], inputRangeRef: [{
208
+ type: ContentChild,
209
+ args: ['inputRange', { static: false }]
210
+ }], inputColorRef: [{
211
+ type: ContentChild,
212
+ args: ['inputColor', { static: false }]
213
+ }], inputBoolRef: [{
214
+ type: ContentChild,
215
+ args: ['inputBool', { static: false }]
216
+ }], inputDatetimeOffsetRef: [{
217
+ type: ContentChild,
218
+ args: ['inputDatetimeOffset', { static: false }]
219
+ }], inputDurationRef: [{
220
+ type: ContentChild,
221
+ args: ['inputDuration', { static: false }]
222
+ }], inputImageRef: [{
223
+ type: ContentChild,
224
+ args: ['inputImage', { static: false }]
225
+ }], inputFileRef: [{
226
+ type: ContentChild,
227
+ args: ['inputFile', { static: false }]
228
+ }], inputObjectRef: [{
229
+ type: ContentChild,
230
+ args: ['inputObject', { static: false }]
231
+ }], inputCollectionRef: [{
232
+ type: ContentChild,
233
+ args: ['inputCollection', { static: false }]
234
+ }], inputDefaultRef: [{
235
+ type: ContentChild,
236
+ args: ['inputDefault', { static: false }]
237
+ }] } });
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LWZvcm0vcmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcmVzdHdvcmxkLWNsaWVudC9zcmMvbGliL3ZpZXdzL3Jlc3R3b3JsZC1lZGl0LWZvcm0vcmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBR0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBbUIsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBWSxZQUFZLEVBQVksUUFBUSxFQUFlLE1BQU0seUJBQXlCLENBQUM7QUFFbEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVTlELE1BQU0sT0FBTywwQkFBMEI7SUE0R3JDLFlBQ1UsWUFBeUIsRUFDekIsa0JBQXFDLEVBQ3JDLGVBQStCLEVBQy9CLFFBQW1DO1FBSG5DLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3pCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBbUI7UUFDckMsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQy9CLGFBQVEsR0FBUixRQUFRLENBQTJCO1FBUnRDLGNBQVMsR0FBRyxTQUFTLENBQUM7UUFDdEIsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QixXQUFNLEdBQUcsTUFBTSxDQUFDO0lBT25CLENBQUM7SUF0QkwsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENB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QURaLFlBQVk7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJN0MsYUFBYTtzQkFEWixZQUFZO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSTdDLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUk1QyxzQkFBc0I7c0JBRHJCLFlBQVk7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUl0RCxnQkFBZ0I7c0JBRGYsWUFBWTt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUloRCxhQUFhO3NCQURaLFlBQVk7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFJN0MsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSTVDLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUk5QyxrQkFBa0I7c0JBRGpCLFlBQVk7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUlsRCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0RyYWdEcm9wIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XHJcbmltcG9ydCB7IE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgSW5wdXQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBQcm9wZXJ0eSwgUHJvcGVydHlUeXBlLCBSZXNvdXJjZSwgVGVtcGxhdGUsIFRlbXBsYXRlRHRvIH0gZnJvbSAnQHdlcnR6dWkvbmd4LWhhbC1jbGllbnQnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgUHJvYmxlbURldGFpbHMgfSBmcm9tICcuLi8uLi9tb2RlbHMvcHJvYmxlbS1kZXRhaWxzJztcclxuaW1wb3J0IHsgRm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb3JtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSRVNUd29ybGRDbGllbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXN0d29ybGQtY2xpZW50JztcclxuaW1wb3J0IHsgUkVTVHdvcmxkQ2xpZW50Q29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3R3b3JsZC1jbGllbnQtY29sbGVjdGlvbic7XHJcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnctZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXN0d29ybGQtZWRpdC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVzdHdvcmxkLWVkaXQtZm9ybS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUmVzdHdvcmxkRWRpdEZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBmb3JtR3JvdXAhOiBGb3JtR3JvdXA7XG5cbiAgQElucHV0KClcbiAgdGVtcGxhdGUhOiBUZW1wbGF0ZTtcblxuICBASW5wdXQoKVxuICBhcGlOYW1lPzogc3RyaW5nO1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0T3B0aW9uc1NpbmdsZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dE9wdGlvbnNTaW5nbGVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dE9wdGlvbnNNdWx0aXBsZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dE9wdGlvbnNNdWx0aXBsZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0T3B0aW9ucycsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dE9wdGlvbnNSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dEhpZGRlbicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dEhpZGRlblJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0VGV4dCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFRleHRSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFRleHRhcmVhJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0VGV4dGFyZWFSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFNlYXJjaCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFNlYXJjaFJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0VGVsJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0VGVsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRVcmwnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRVcmxSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dEVtYWlsJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0RW1haWxSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFBhc3N3b3JkJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0UGFzc3dvcmRSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dERhdGUnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXREYXRlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRNb250aCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dE1vbnRoUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRXZWVrJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0V2Vla1JlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0VGltZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dFRpbWVSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dERhdGV0aW1lTG9jYWwnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXREYXRldGltZUxvY2FsUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXROdW1iZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXROdW1iZXJSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dFJhbmdlJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0UmFuZ2VSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dENvbG9yJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0Q29sb3JSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAQ29udGVudENoaWxkKCdpbnB1dEJvb2wnLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgaW5wdXRCb29sUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXREYXRldGltZU9mZnNldCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dERhdGV0aW1lT2Zmc2V0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXREdXJhdGlvbicsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dER1cmF0aW9uUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRJbWFnZScsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dEltYWdlUmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRGaWxlJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0RmlsZVJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0T2JqZWN0JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0T2JqZWN0UmVmPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZCgnaW5wdXRDb2xsZWN0aW9uJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGlucHV0Q29sbGVjdGlvblJlZj86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ2lucHV0RGVmYXVsdCcsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBpbnB1dERlZmF1bHRSZWY/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBwdWJsaWMgZ2V0IFByb3BlcnR5VHlwZSgpIHtcclxuICAgIHJldHVybiBQcm9wZXJ0eVR5cGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRhdGVGb3JtYXQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBuZXcgRGF0ZSgzMzMzLCAxMCwgMjIpXHJcbiAgICAgIC50b0xvY2FsZURhdGVTdHJpbmcoKVxyXG4gICAgICAucmVwbGFjZShcIjIyXCIsIFwiZGRcIilcclxuICAgICAgLnJlcGxhY2UoXCIxMVwiLCBcIm1tXCIpXHJcbiAgICAgIC5yZXBsYWNlKFwiMzMzM1wiLCBcInl5XCIpXHJcbiAgICAgIC5yZXBsYWNlKFwiMzNcIiwgXCJ5XCIpO1xyXG4gIH1cblxuICBwdWJsaWMgRm9ybUdyb3VwID0gRm9ybUdyb3VwO1xuICBwdWJsaWMgRm9ybUFycmF5ID0gRm9ybUFycmF5O1xuICBwdWJsaWMgTnVtYmVyID0gTnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2Zvcm1TZXJ2aWNlOiBGb3JtU2VydmljZSxcbiAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jbGllbnRzOiBSRVNUd29ybGRDbGllbnRDb2xsZWN0aW9uXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZm9ybUdyb3VwKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbZm9ybUdyb3VwXSBpcyByZXF1aXJlZCBvbiA8cnctZm9ybT5cIik7XHJcbiAgICBpZiAoIXRoaXMudGVtcGxhdGUpXHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlt0ZW1wbGF0ZV0gaXMgcmVxdWlyZWQgb24gPHJ3LWZvcm0+XCIpO1xyXG4gICAgaWYgKCF0aGlzLmFwaU5hbWUpXHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlthcGlOYW1lXSBpcyByZXF1aXJlZCBvbiA8cnctZm9ybT5cIik7XHJcbiAgfVxyXG5cbiAgcHVibGljIGdldFRvb2x0aXAocmVzb3VyY2U6IFJlc291cmNlLCBrZXlzVG9FeGNsdWRlPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IHRvb2x0aXAgPSBPYmplY3QuZW50cmllcyhyZXNvdXJjZSlcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhKGtleS5zdGFydHNXaXRoKCdfJykgfHwgWydjcmVhdGVkQXQnLCAnY3JlYXRlZEJ5JywgJ2xhc3RDaGFuZ2VkQXQnLCAnbGFzdENoYW5nZWRCeScsICd0aW1lc3RhbXAnXS5pbmNsdWRlcyhrZXkpIHx8IGtleXNUb0V4Y2x1ZGU/LmluY2x1ZGVzKGtleSkpKVxuICAgICAgLnJlZHVjZSgocHJldiwgW2tleSwgdmFsdWVdLCBpbmRleCkgPT4gYCR7cHJldn0ke2luZGV4ID09PSAwID8gJycgOiAnXFxuJ30ke2tleX06ICR7UmVzdHdvcmxkRWRpdEZvcm1Db21wb25lbnQuanNvblN0cmluZ2lmeVdpdGhFbGlwc2lzKHZhbHVlKX1gLCAnJyk7XG5cbiAgICByZXR1cm4gdG9vbHRpcDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGpzb25TdHJpbmdpZnlXaXRoRWxpcHNpcyh2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IG1heExlbmd0aCA9IDIwMDtcbiAgICBjb25zdCBlbmQgPSAxMDtcbiAgICBjb25zdCBzdGFydCA9IG1heExlbmd0aCAtIGVuZCAtIDI7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICBjb25zdCBzaG9ydGVuZWQgPSBqc29uLmxlbmd0aCA+IG1heExlbmd0aCA/IGpzb24uc3Vic3RyaW5nKDAsIHN0YXJ0KSArICfigKYnICsganNvbi5zdWJzdHJpbmcoanNvbi5sZW5ndGggLSBlbmQpIDoganNvbjtcblxuICAgIHJldHVybiBzaG9ydGVuZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sbGVjdGlvbkVudHJ5VGVtcGxhdGVzKHByb3BlcnR5PzogUHJvcGVydHkpOiBUZW1wbGF0ZVtdIHtcbiAgICBpZiAoIXByb3BlcnR5KVxyXG4gICAgICByZXR1cm4gW107XHJcblxyXG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHByb3BlcnR5Ll90ZW1wbGF0ZXMpXHJcbiAgICAgIC5maWx0ZXIoKFtrZXksXSkgPT4gTnVtYmVyLmlzSW50ZWdlcihOdW1iZXIucGFyc2VJbnQoa2V5KSkpXHJcbiAgICAgIC5tYXAoKFssIHZhbHVlXSkgPT4gdmFsdWUpO1xyXG4gIH1cblxuICBwdWJsaWMgYWRkTmV3SXRlbVRvQ29sbGVjdGlvbihwcm9wZXJ0eTogUHJvcGVydHksIGZvcm1BcnJheTogRm9ybUFycmF5IHwgQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgaWYgKCEoZm9ybUFycmF5IGluc3RhbmNlb2YgRm9ybUFycmF5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9ybUFycmF5IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBGb3JtQXJyYXkuJyk7XHJcblxyXG4gICAgY29uc3QgbWF4SW5kZXggPSBNYXRoLm1heCguLi5PYmplY3Qua2V5cyhwcm9wZXJ0eS5fdGVtcGxhdGVzKVxyXG4gICAgICAubWFwKGtleSA9PiBOdW1iZXIucGFyc2VJbnQoa2V5KSlcclxuICAgICAgLmZpbHRlcihrZXkgPT4gTnVtYmVyLmlzU2FmZUludGVnZXIoa2V5KSkpO1xyXG4gICAgY29uc3QgbmV4dEluZGV4ID0gbWF4SW5kZXggKyAxO1xuXG4gICAgY29uc3QgZGVmYXVsdFRlbXBsYXRlID0gcHJvcGVydHkuX3RlbXBsYXRlc1snZGVmYXVsdCddO1xyXG4gICAgY29uc3QgY29waWVkVGVtcGxhdGVEdG8gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRlZmF1bHRUZW1wbGF0ZSkpIGFzIFRlbXBsYXRlRHRvO1xyXG4gICAgY29uc3QgY29waWVkVGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoY29waWVkVGVtcGxhdGVEdG8pO1xyXG4gICAgY29waWVkVGVtcGxhdGUudGl0bGUgPSBuZXh0SW5kZXgudG9TdHJpbmcoKTtcclxuXHJcbiAgICBwcm9wZXJ0eS5fdGVtcGxhdGVzW2NvcGllZFRlbXBsYXRlLnRpdGxlXSA9IGNvcGllZFRlbXBsYXRlO1xyXG4gICAgZm9ybUFycmF5LnB1c2godGhpcy5fZm9ybVNlcnZpY2UuY3JlYXRlRm9ybUdyb3VwRnJvbVRlbXBsYXRlKGRlZmF1bHRUZW1wbGF0ZSkpO1xyXG4gIH1cblxuICBwdWJsaWMgZGVsZXRlSXRlbUZyb21Db2xsZWN0aW9uKHByb3BlcnR5OiBQcm9wZXJ0eSwgZm9ybUFycmF5OiBGb3JtQXJyYXkgfCBBYnN0cmFjdENvbnRyb2wsIHRlbXBsYXRlOiBUZW1wbGF0ZSk6IHZvaWQge1xuICAgIGlmICghdGVtcGxhdGUudGl0bGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBkZWxldGUgdGhlIGl0ZW0sIGJlY2F1c2UgdGhlIHRlbXBsYXRlICcke3RlbXBsYXRlfScgZG9lcyBub3QgaGF2ZSBhIHRpdGxlLmApO1xuXG4gICAgaWYgKCEoZm9ybUFycmF5IGluc3RhbmNlb2YgRm9ybUFycmF5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9ybUFycmF5IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBGb3JtQXJyYXkuJyk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBwcm9wZXJ0eS5fdGVtcGxhdGVzO1xyXG4gICAgZGVsZXRlIHRlbXBsYXRlc1t0ZW1wbGF0ZS50aXRsZV07XHJcblxyXG4gICAgZm9ybUFycmF5LnJlbW92ZUF0KE51bWJlci5wYXJzZUludCh0ZW1wbGF0ZS50aXRsZSkpO1xyXG4gIH1cblxuICBwdWJsaWMgY29sbGVjdGlvbkl0ZW1Ecm9wcGVkKCRldmVudDogQ2RrRHJhZ0Ryb3A8eyBwcm9wZXJ0eTogUHJvcGVydHk7IGZvcm1BcnJheTogRm9ybUFycmF5IH0+KSB7XG4gICAgY29uc3QgZm9ybUFycmF5ID0gJGV2ZW50LmNvbnRhaW5lci5kYXRhLmZvcm1BcnJheTtcclxuICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSAkZXZlbnQucHJldmlvdXNJbmRleDtcclxuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9ICRldmVudC5jdXJyZW50SW5kZXg7XHJcbiAgICBjb25zdCBtb3ZlbWVudERpcmVjdGlvbiA9IGN1cnJlbnRJbmRleCA+IHByZXZpb3VzSW5kZXggPyAxIDogLTE7XHJcblxyXG4gICAgLy8gTW92ZSBpbiBGb3JtQXJyYXlcclxuICAgIC8vIFdlIGRvIG5vdCBuZWVkIHRvIG1vdmUgdGhlIGl0ZW0gaW4gdGhlIF90ZW1wbGF0ZXMgb2JqZWN0XHJcbiAgICBjb25zdCBtb3ZlZENvbnRyb2wgPSBmb3JtQXJyYXkuYXQocHJldmlvdXNJbmRleCk7XHJcbiAgICBmb3IgKGxldCBpID0gcHJldmlvdXNJbmRleDsgaSAqIG1vdmVtZW50RGlyZWN0aW9uIDwgY3VycmVudEluZGV4ICogbW92ZW1lbnREaXJlY3Rpb247IGkgPSBpICsgbW92ZW1lbnREaXJlY3Rpb24pIHtcclxuICAgICAgZm9ybUFycmF5LnNldENvbnRyb2woaSwgZm9ybUFycmF5LmF0KGkgKyBtb3ZlbWVudERpcmVjdGlvbikpO1xyXG4gICAgfVxyXG4gICAgZm9ybUFycmF5LnNldENvbnRyb2woY3VycmVudEluZGV4LCBtb3ZlZENvbnRyb2wpO1xyXG5cclxuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCRldmVudCk7XHJcbiAgfVxuXHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbk9wdGlvbnNGaWx0ZXJlZChwcm9wZXJ0eTogUHJvcGVydHksIGV2ZW50OiB7IG9yaWdpbmFsRXZlbnQ6IHVua25vd247IGZpbHRlcjogc3RyaW5nIHwgbnVsbCB9KSB7XHJcbiAgICBjb25zdCBvcHRpb25zID0gcHJvcGVydHk/Lm9wdGlvbnM7XHJcblxyXG4gICAgaWYgKCFvcHRpb25zPy5saW5rPy5ocmVmIHx8ICFldmVudC5maWx0ZXIgfHwgZXZlbnQuZmlsdGVyID09PSAnJylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuXHJcbiAgICBjb25zdCB0ZW1wbGF0ZWRVcmkgPSBvcHRpb25zLmxpbmsuaHJlZjtcclxuICAgIGxldCBmaWx0ZXIgPSBgY29udGFpbnMoJHtvcHRpb25zLnByb21wdEZpZWxkfSwgJyR7ZXZlbnQuZmlsdGVyfScpYDtcclxuICAgIGlmIChvcHRpb25zLnZhbHVlRmllbGQ/LnRvTG93ZXJDYXNlKCkgPT09ICdpZCcgJiYgIU51bWJlci5pc05hTihOdW1iZXIucGFyc2VJbnQoZXZlbnQuZmlsdGVyKSkpXHJcbiAgICAgIGZpbHRlciA9IGAoJHtvcHRpb25zLnZhbHVlRmllbGR9IGVxICR7ZXZlbnQuZmlsdGVyfSkgIG9yICgke2ZpbHRlcn0pYDtcclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCkuZ2V0TGlzdEJ5VXJpKHRlbXBsYXRlZFVyaSwgeyAkZmlsdGVyOiBmaWx0ZXIsICR0b3A6IDEwIH0pO1xyXG4gICAgaWYgKCFyZXNwb25zZS5vayB8fCBQcm9ibGVtRGV0YWlscy5pc1Byb2JsZW1EZXRhaWxzKHJlc3BvbnNlLmJvZHkpIHx8ICFyZXNwb25zZS5ib2R5KSB7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2V0dGluZyB0aGUgZmlsdGVyZWQgaXRlbXMuYDtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogbWVzc2FnZSwgZGF0YTogcmVzcG9uc2UgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpdGVtcyA9IHJlc3BvbnNlLmJvZHkuX2VtYmVkZGVkLml0ZW1zO1xyXG4gICAgb3B0aW9ucy5pbmxpbmUgPSBpdGVtcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q2xpZW50KCk6IFJFU1R3b3JsZENsaWVudCB7XHJcbiAgICBpZiAoIXRoaXMuYXBpTmFtZSlcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGEgY2xpZW50LCBiZWNhdXNlIHRoZSBhcGlOYW1lIGlzIG5vdCBzZXQuJyk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudHMuZ2V0Q2xpZW50KHRoaXMuYXBpTmFtZSk7XHJcbiAgfVxufVxuIiwiPGRpdiAqbmdGb3I9XCJsZXQgcHJvcGVydHkgb2YgdGVtcGxhdGUucHJvcGVydGllc1wiIGNsYXNzPVwiZ3JpZCBmaWVsZFwiIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCI+XHJcbiAgPGxhYmVsICpuZ0lmPVwicHJvcGVydHkudHlwZSAhPT0gUHJvcGVydHlUeXBlLkhpZGRlblwiIFthdHRyLmZvcl09XCJwcm9wZXJ0eS5uYW1lXCIgY2xhc3M9XCJjb2wtMTIgbWItMiBtZDpjb2wtMiBtZDptYi0wXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIiBbY2xhc3MuaGFzQ2hpbGRyZW5dPVwicHJvcGVydHkuX3RlbXBsYXRlc1wiPnt7cHJvcGVydHkucHJvbXB0IHx8IHByb3BlcnR5Lm5hbWV9fTwvbGFiZWw+XHJcbiAgPGRpdiBjbGFzcz1cImNvbC0xMiBtZDpjb2wtMTBcIj5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dE9wdGlvbnMgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRPcHRpb25zU2luZ2xlIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICA8cC1kcm9wZG93biBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIFtvcHRpb25zXT1cInByb3BlcnR5Lm9wdGlvbnMuaW5saW5lXCIgW2ZpbHRlckJ5XT1cIihwcm9wZXJ0eS5vcHRpb25zLnByb21wdEZpZWxkIHx8ICdwcm9tcHQnKSArICcsJyArIChwcm9wZXJ0eS5vcHRpb25zLnZhbHVlRmllbGQgfHwgJ3ZhbHVlJylcIiBbb3B0aW9uVmFsdWVdPVwicHJvcGVydHkub3B0aW9ucy52YWx1ZUZpZWxkIHx8ICd2YWx1ZSdcIiBbcmVhZG9ubHldPVwicHJvcGVydHkucmVhZE9ubHlcIiBbcmVxdWlyZWRdPVwicHJvcGVydHkucmVxdWlyZWQgfHwgcHJvcGVydHkub3B0aW9ucy5taW5JdGVtcyA+IDBcIiBbZmlsdGVyXT1cInRydWVcIiBbYXV0b0Rpc3BsYXlGaXJzdF09XCJmYWxzZVwiIFtzaG93Q2xlYXJdPVwiIXByb3BlcnR5LnJlcXVpcmVkIHx8IHByb3BlcnR5Lm9wdGlvbnMubWluSXRlbXMgPD0gMFwiIChvbkZpbHRlcik9XCJvbk9wdGlvbnNGaWx0ZXJlZChwcm9wZXJ0eSwgJGV2ZW50KVwiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiBbZmlsdGVyUGxhY2Vob2xkZXJdPVwicHJvcGVydHk/Lm9wdGlvbnM/Lmxpbms/LmhyZWYgPyAnc2VhcmNoIGZvciBtb3JlIHJlc3VsdHMnIDogJydcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU9XCJzZWxlY3RlZEl0ZW1cIj5cclxuICAgICAgICAgICAgPHNwYW4gW3BUb29sdGlwXT1cImdldFRvb2x0aXAoaXRlbSwgW3Byb3BlcnR5Lm9wdGlvbnMucHJvbXB0RmllbGQgfHwgJ3Byb21wdCcsIHByb3BlcnR5Lm9wdGlvbnMudmFsdWVGaWVsZCB8fCAndmFsdWUnXSlcIj57e2l0ZW1bcHJvcGVydHkub3B0aW9ucy5wcm9tcHRGaWVsZCB8fCAncHJvbXB0J119fSAoe3tpdGVtW3Byb3BlcnR5Lm9wdGlvbnMudmFsdWVGaWVsZCB8fCAndmFsdWUnXX19KTwvc3Bhbj5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgbGV0LWl0ZW0gcFRlbXBsYXRlPVwiaXRlbVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBbcFRvb2x0aXBdPVwiZ2V0VG9vbHRpcChpdGVtLCBbcHJvcGVydHkub3B0aW9ucy5wcm9tcHRGaWVsZCB8fCAncHJvbXB0JywgcHJvcGVydHkub3B0aW9ucy52YWx1ZUZpZWxkIHx8ICd2YWx1ZSddKVwiPnt7aXRlbVtwcm9wZXJ0eS5vcHRpb25zLnByb21wdEZpZWxkIHx8ICdwcm9tcHQnXX19ICh7e2l0ZW1bcHJvcGVydHkub3B0aW9ucy52YWx1ZUZpZWxkIHx8ICd2YWx1ZSddfX0pPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L3AtZHJvcGRvd24+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhcHJvcGVydHkub3B0aW9ucy5tYXhJdGVtcyB8fCBwcm9wZXJ0eS5vcHRpb25zLm1heEl0ZW1zID09IDFcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRPcHRpb25zU2luZ2xlUmVmIHx8IGRlZmF1bHRJbnB1dE9wdGlvbnNTaW5nbGU7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dE9wdGlvbnNNdWx0aXBsZSBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgPHAtbXVsdGlTZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiBbb3B0aW9uc109XCJwcm9wZXJ0eS5vcHRpb25zLmlubGluZVwiIFtvcHRpb25MYWJlbF09XCJwcm9wZXJ0eS5vcHRpb25zLnByb21wdEZpZWxkIHx8ICdwcm9tcHQnXCIgW29wdGlvblZhbHVlXT1cInByb3BlcnR5Lm9wdGlvbnMudmFsdWVGaWVsZCB8fCAndmFsdWUnXCIgW3JlYWRvbmx5XT1cInByb3BlcnR5LnJlYWRPbmx5XCIgW3NlbGVjdGlvbkxpbWl0XT1cInByb3BlcnR5Lm9wdGlvbnMubWF4SXRlbXNcIiBbcmVxdWlyZWRdPVwicHJvcGVydHkucmVxdWlyZWQgfHwgcHJvcGVydHkub3B0aW9ucy5taW5JdGVtcyA+IDBcIj48L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9wZXJ0eS5vcHRpb25zLm1heEl0ZW1zID4gMVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dE9wdGlvbnNNdWx0aXBsZVJlZiB8fCBkZWZhdWx0SW5wdXRPcHRpb25zTXVsdGlwbGU7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9wZXJ0eS5vcHRpb25zXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dE9wdGlvbnNSZWYgfHwgZGVmYXVsdElucHV0T3B0aW9uczsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cIiFwcm9wZXJ0eS5vcHRpb25zXCI+XHJcbiAgICAgIDxkaXYgW25nU3dpdGNoXT1cInByb3BlcnR5LnR5cGVcIj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRIaWRkZW4gbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cImhpZGRlblwiIFt2YWx1ZV09XCJwcm9wZXJ0eS52YWx1ZVwiIC8+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuSGlkZGVuXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRIaWRkZW5SZWYgfHwgZGVmYXVsdElucHV0SGlkZGVuOyBjb250ZXh0OnsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRUZXh0IGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHR5cGU9XCJ0ZXh0XCIgcElucHV0VGV4dCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5UZXh0XCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRUZXh0UmVmIHx8IGRlZmF1bHRJbnB1dFRleHQ7IGNvbnRleHQ6eyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRUZXh0YXJlYSBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8dGV4dGFyZWEgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiBwSW5wdXRUZXh0YXJlYSBjbGFzcz1cInctZnVsbCBwLWlucHV0dGV4dGFyZWEgcC1pbnB1dHRleHQgcC1jb21wb25lbnQgcC1lbGVtZW50XCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIiBbY29sc109XCJwcm9wZXJ0eS5jb2xzXCIgW3Jvd3NdPVwicHJvcGVydHkucm93c1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuVGV4dGFyZWFcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dFRleHRhcmVhUmVmIHx8IGRlZmF1bHRJbnB1dFRleHRhcmVhOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFNlYXJjaCBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiB0eXBlPVwic2VhcmNoXCIgcElucHV0VGV4dCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5TZWFyY2hcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dFNlYXJjaFJlZiB8fCBkZWZhdWx0SW5wdXRTZWFyY2g7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0VGVsIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHR5cGU9XCJ0ZWxcIiBwSW5wdXRUZXh0IGNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIiAvPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLlRlbFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0VGVsUmVmIHx8IGRlZmF1bHRJbnB1dFRlbDsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRVcmwgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cInVybFwiIHBJbnB1dFRleHQgY2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIC8+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuVXJsXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRVcmxSZWYgfHwgZGVmYXVsdElucHV0VXJsOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dEVtYWlsIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHR5cGU9XCJlbWFpbFwiIHBJbnB1dFRleHQgY2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIC8+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuRW1haWxcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dEVtYWlsUmVmIHx8IGRlZmF1bHRJbnB1dEVtYWlsOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFBhc3N3b3JkIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHR5cGU9XCJwYXNzd29yZFwiIHBQYXNzd29yZCBjbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCIgLz5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5QYXNzd29yZFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0UGFzc3dvcmRSZWYgfHwgZGVmYXVsdElucHV0UGFzc3dvcmQ7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RGF0ZSBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8cC1jYWxlbmRhciBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIFtkYXRlRm9ybWF0XT1cImRhdGVGb3JtYXRcIiBbc2hvd1dlZWtdPVwidHJ1ZVwiIFtzaG93SWNvbl09XCJ0cnVlXCIgc3R5bGVDbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCI+PC9wLWNhbGVuZGFyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLkRhdGVcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dERhdGVSZWYgfHwgZGVmYXVsdElucHV0RGF0ZTsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRNb250aCBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8cC1jYWxlbmRhciBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIFtkYXRlRm9ybWF0XT1cImRhdGVGb3JtYXRcIiBbc2hvd1dlZWtdPVwiZmFsc2VcIiB2aWV3PVwibW9udGhcIiBbc2hvd0ljb25dPVwidHJ1ZVwiIHN0eWxlQ2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5Nb250aFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0TW9udGhSZWYgfHwgZGVmYXVsdElucHV0TW9udGg7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0V2VlayBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiB0eXBlPVwid2Vla1wiIHBJbnB1dFRleHQgY2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIC8+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuV2Vla1wiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0V2Vla1JlZiB8fCBkZWZhdWx0SW5wdXRXZWVrOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFRpbWUgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPHAtY2FsZW5kYXIgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiBbZGF0ZUZvcm1hdF09XCJkYXRlRm9ybWF0XCIgW3Nob3dUaW1lXT1cInRydWVcIiBbdGltZU9ubHldPVwidHJ1ZVwiIFtzaG93V2Vla109XCJmYWxzZVwiIFtzaG93SWNvbl09XCJ0cnVlXCIgc3R5bGVDbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCI+PC9wLWNhbGVuZGFyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLlRpbWVcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dFRpbWVSZWYgfHwgZGVmYXVsdElucHV0VGltZTsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXREYXRldGltZUxvY2FsIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxwLWNhbGVuZGFyIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgW2RhdGVGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiIFtzaG93VGltZV09XCJ0cnVlXCIgW3Nob3dXZWVrXT1cImZhbHNlXCIgW3Nob3dJY29uXT1cInRydWVcIiBzdHlsZUNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIj48L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuRGF0ZXRpbWVMb2NhbFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RGF0ZXRpbWVMb2NhbFJlZiB8fCBkZWZhdWx0SW5wdXREYXRldGltZUxvY2FsOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dE51bWJlciBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8cC1pbnB1dE51bWJlciBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIG1vZGU9XCJkZWNpbWFsXCIgW3Nob3dCdXR0b25zXT1cIiFwcm9wZXJ0eS5yZWFkT25seVwiIGNsYXNzPVwidy1mdWxsXCIgc3R5bGVDbGFzcz1cInctZnVsbFwiIFtjbGFzcy5wLWRpc2FibGVkXT1cInByb3BlcnR5LnJlYWRPbmx5XCI+PC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiUHJvcGVydHlUeXBlLk51bWJlclwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0TnVtYmVyUmVmIHx8IGRlZmF1bHRJbnB1dE51bWJlcjsgY29udGV4dDogeyBwcm9wZXJ0eTogcHJvcGVydHksIHRlbXBsYXRlOiB0ZW1wbGF0ZSwgZm9ybUdyb3VwOiBmb3JtR3JvdXAsIGFwaU5hbWU6IGFwaU5hbWUgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRSYW5nZSBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJwcm9wZXJ0eS5uYW1lXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiB0eXBlPVwicmFuZ2VcIiBbbWluXT1cInByb3BlcnR5Lm1pblwiIFttYXhdPVwicHJvcGVydHkubWF4XCIgW3N0ZXBdPVwicHJvcGVydHkuc3RlcFwiIHBJbnB1dFRleHQgY2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIC8+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuUmFuZ2VcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dFJhbmdlUmVmIHx8IGRlZmF1bHRJbnB1dFJhbmdlOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dENvbG9yIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIHR5cGU9XCJjb2xvclwiIHBJbnB1dFRleHQgY2xhc3M9XCJ3LWZ1bGxcIiBbY2xhc3MucC1kaXNhYmxlZF09XCJwcm9wZXJ0eS5yZWFkT25seVwiIC8+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuQ29sb3JcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dENvbG9yUmVmIHx8IGRlZmF1bHRJbnB1dENvbG9yOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dEJvb2wgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiIGxldC1mb3JtR3JvdXA9XCJmb3JtR3JvdXBcIj5cclxuICAgICAgICAgIDxwLWNoZWNrYm94ICpuZ0lmPVwicHJvcGVydHkucmVxdWlyZWRcIiBbYmluYXJ5XT1cInRydWVcIiBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BlcnR5Lm5hbWVdXCIgW2lkXT1cInByb3BlcnR5Lm5hbWVcIiBbcmVhZG9ubHldPVwicHJvcGVydHkucmVhZE9ubHlcIj48L3AtY2hlY2tib3g+XHJcbiAgICAgICAgICA8cC10cmlTdGF0ZUNoZWNrYm94ICpuZ0lmPVwiIXByb3BlcnR5LnJlcXVpcmVkXCIgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cC5jb250cm9sc1twcm9wZXJ0eS5uYW1lXVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgW3JlYWRvbmx5XT1cInByb3BlcnR5LnJlYWRPbmx5XCI+PC9wLXRyaVN0YXRlQ2hlY2tib3g+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuQm9vbFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0Qm9vbFJlZiB8fCBkZWZhdWx0SW5wdXRCb29sOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dERhdGV0aW1lT2Zmc2V0IGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxwLWNhbGVuZGFyIFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgW2RhdGVGb3JtYXRdPVwiZGF0ZUZvcm1hdFwiIFtzaG93VGltZV09XCJ0cnVlXCIgW3Nob3dXZWVrXT1cImZhbHNlXCIgW3Nob3dJY29uXT1cInRydWVcIiBzdHlsZUNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIj48L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuRGF0ZXRpbWVPZmZzZXRcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dERhdGV0aW1lT2Zmc2V0UmVmIHx8IGRlZmF1bHRJbnB1dERhdGV0aW1lT2Zmc2V0OyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dER1cmF0aW9uIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxwLWNhbGVuZGFyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuRHVyYXRpb25cIiBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbaWRdPVwicHJvcGVydHkubmFtZVwiIFtkYXRlRm9ybWF0XT1cImRhdGVGb3JtYXRcIiBbc2hvd1RpbWVdPVwidHJ1ZVwiIFt0aW1lT25seV09XCJ0cnVlXCIgW3Nob3dXZWVrXT1cImZhbHNlXCIgW3Nob3dJY29uXT1cInRydWVcIiBzdHlsZUNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIj48L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuRHVyYXRpb25cIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dER1cmF0aW9uUmVmIHx8IGRlZmF1bHRJbnB1dER1cmF0aW9uOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dEltYWdlIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LXRlbXBsYXRlPVwidGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxydy1pbWFnZSBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbYWNjZXB0XT1cInByb3BlcnR5LnBsYWNlaG9sZGVyXCI+PC9ydy1pbWFnZT5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlByb3BlcnR5VHlwZS5JbWFnZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0SW1hZ2VSZWYgfHwgZGVmYXVsdElucHV0SW1hZ2U7IGNvbnRleHQ6IHsgcHJvcGVydHk6IHByb3BlcnR5LCB0ZW1wbGF0ZTogdGVtcGxhdGUsIGZvcm1Hcm91cDogZm9ybUdyb3VwLCBhcGlOYW1lOiBhcGlOYW1lIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RmlsZSBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8cnctZmlsZSBbZm9ybUNvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWVcIiBbZmlsZU5hbWVdPVwicHJvcGVydHkubmFtZVwiIFthY2NlcHRdPVwicHJvcGVydHkucGxhY2Vob2xkZXJcIj48L3J3LWZpbGU+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuRmlsZVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RmlsZVJlZiB8fCBkZWZhdWx0SW5wdXRGaWxlOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dE9iamVjdCBsZXQtcHJvcGVydHk9XCJwcm9wZXJ0eVwiIGxldC10ZW1wbGF0ZT1cInRlbXBsYXRlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJyYWNlXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsXCI+XHJcbiAgICAgICAgICAgICAgPHJ3LWZvcm0gW2Zvcm1Hcm91cF09XCIoZm9ybUdyb3VwLmNvbnRyb2xzW3Byb3BlcnR5Lm5hbWVdIHwgYXMgOiBGb3JtR3JvdXApXCIgW3RlbXBsYXRlXT1cInByb3BlcnR5Ll90ZW1wbGF0ZXMuZGVmYXVsdFwiIFthcGlOYW1lXT1cImFwaU5hbWVcIj48L3J3LWZvcm0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuT2JqZWN0XCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRPYmplY3RSZWYgfHwgZGVmYXVsdElucHV0T2JqZWN0OyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dENvbGxlY3Rpb24gbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJicmFjZVwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiIGNka0Ryb3BMaXN0IFtjZGtEcm9wTGlzdERhdGFdPVwieyBwcm9wZXJ0eTogcHJvcGVydHksIGZvcm1BcnJheTogKGZvcm1Hcm91cC5jb250cm9sc1twcm9wZXJ0eS5uYW1lXSB8IGFzIDogRm9ybUFycmF5KX1cIiAoY2RrRHJvcExpc3REcm9wcGVkKT1cImNvbGxlY3Rpb25JdGVtRHJvcHBlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdGVtcGxhdGUgb2YgZ2V0Q29sbGVjdGlvbkVudHJ5VGVtcGxhdGVzKHByb3BlcnR5KVwiIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBjZGtEcmFnPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtZ3JpcC1saW5lc1wiIGNka0RyYWdIYW5kbGU+PC9pPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJyYWNlXCI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxydy1mb3JtIFtmb3JtR3JvdXBdPVwiKChmb3JtR3JvdXAuY29udHJvbHNbcHJvcGVydHkubmFtZV0gfCBhcyA6IEZvcm1BcnJheSkuY29udHJvbHNbTnVtYmVyLnBhcnNlSW50KHRlbXBsYXRlLnRpdGxlISldIHwgYXMgOiBGb3JtR3JvdXApXCIgW3RlbXBsYXRlXT1cInRlbXBsYXRlXCIgW2FwaU5hbWVdPVwiYXBpTmFtZVwiIGNsYXNzPVwidy1mdWxsXCI+PC9ydy1mb3JtPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cImZhcyBmYS10cmFzaFwiIGNsYXNzPVwicC1idXR0b24tb3V0bGluZWQgcC1idXR0b24tZGFuZ2VyIG1sLTIgbWItM1wiIChjbGljayk9XCJkZWxldGVJdGVtRnJvbUNvbGxlY3Rpb24ocHJvcGVydHksIGZvcm1Hcm91cC5jb250cm9sc1twcm9wZXJ0eS5uYW1lXSwgdGVtcGxhdGUpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIHctZnVsbFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGljb249XCJmYXMgZmEtcGx1c1wiIGNsYXNzPVwicC1idXR0b24tb3V0bGluZWQgcC1idXR0b24taW5mb1wiIChjbGljayk9XCJhZGROZXdJdGVtVG9Db2xsZWN0aW9uKHByb3BlcnR5LCBmb3JtR3JvdXAuY29udHJvbHNbcHJvcGVydHkubmFtZV0pXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJQcm9wZXJ0eVR5cGUuQ29sbGVjdGlvblwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0Q29sbGVjdGlvblJlZiB8fCBkZWZhdWx0SW5wdXRDb2xsZWN0aW9uOyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dERlZmF1bHQgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtdGVtcGxhdGU9XCJ0ZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPGlucHV0IFtmb3JtQ29udHJvbE5hbWVdPVwicHJvcGVydHkubmFtZVwiIFtpZF09XCJwcm9wZXJ0eS5uYW1lXCIgdHlwZT1cInRleHRcIiBwSW5wdXRUZXh0IGNsYXNzPVwidy1mdWxsXCIgW2NsYXNzLnAtZGlzYWJsZWRdPVwicHJvcGVydHkucmVhZE9ubHlcIiAvPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0RGVmYXVsdFJlZiB8fCBkZWZhdWx0SW5wdXREZWZhdWx0OyBjb250ZXh0OiB7IHByb3BlcnR5OiBwcm9wZXJ0eSwgdGVtcGxhdGU6IHRlbXBsYXRlLCBmb3JtR3JvdXA6IGZvcm1Hcm91cCwgYXBpTmFtZTogYXBpTmFtZSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHZhbC1lcnJvcnMgW2NvbnRyb2xOYW1lXT1cInByb3BlcnR5Lm5hbWUgfHwgbnVsbFwiPlxyXG4gICAgICA8bmctdGVtcGxhdGUgdmFsRXJyb3I9XCJyZXF1aXJlZFwiPlRoZSBmaWVsZCAne3twcm9wZXJ0eS5wcm9tcHQgfHwgcHJvcGVydHkubmFtZX19JyBpcyByZXF1aXJlZC48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgdmFsRXJyb3I9XCJlbWFpbFwiPlRoZSBlbWFpbCBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcy48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgdmFsRXJyb3I9XCJtaW5cIiBsZXQtZXJyb3I9XCJlcnJvclwiPid7e3Byb3BlcnR5LnByb21wdCB8fCBwcm9wZXJ0eS5uYW1lfX0nIG11c3QgYmUgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHt7IGVycm9yLm1pbiB9fS48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgdmFsRXJyb3I9XCJtYXhcIiBsZXQtZXJyb3I9XCJlcnJvclwiPid7e3Byb3BlcnR5LnByb21wdCB8fCBwcm9wZXJ0eS5uYW1lfX0nIG11c3QgYmUgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIHt7IGVycm9yLm1heCB9fS48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgdmFsRXJyb3I9XCJtaW5sZW5ndGhcIiBsZXQtZXJyb3I9XCJlcnJvclwiPlRoZSBsZW5ndGggb2YgJ3t7cHJvcGVydHkucHJvbXB0IHx8IHByb3BlcnR5Lm5hbWV9fScgbXVzdCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8ge3sgZXJyb3IucmVxdWlyZWRMZW5ndGggfX0uPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlIHZhbEVycm9yPVwibWF4bGVuZ3RoXCIgbGV0LWVycm9yPVwiZXJyb3JcIj5UaGUgbGVuZ3RoIG9mICd7e3Byb3BlcnR5LnByb21wdCB8fCBwcm9wZXJ0eS5uYW1lfX0nIG11c3QgYmUgc2hvcnRlciB0aGFuIG9yIGVxdWFsIHRvIHt7IGVycm9yLnJlcXVpcmVkTGVuZ3RoIH19LjwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSB2YWxFcnJvcj1cInBhdHRlcm5cIiBsZXQtZXJyb3I9XCJlcnJvclwiPlRoZSB2YWx1ZSBmb3IgJ3t7cHJvcGVydHkucHJvbXB0IHx8IHByb3BlcnR5Lm5hbWV9fScgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4ge3sgZXJyb3IgfX0uPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPG5nLXRlbXBsYXRlIHZhbEVycm9yPVwicmVtb3RlXCIgbGV0LWVycm9yPVwiZXJyb3JcIj57eyBlcnJvciB9fTwvbmctdGVtcGxhdGU+XHJcbiAgICA8L3ZhbC1lcnJvcnM+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=