kwikid-forms 0.3.20 → 0.4.1

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 (48) hide show
  1. package/bundles/kwikid-forms.umd.js +8985 -7725
  2. package/bundles/kwikid-forms.umd.js.map +1 -1
  3. package/esm2015/lib/builder/builder.component.js +2 -2
  4. package/esm2015/lib/builder/builder.module.js +8 -11
  5. package/esm2015/lib/builder/element-config-editor/editors/basic/radio-config.editor.component.js +10 -10
  6. package/esm2015/lib/builder/element-config-editor/editors/basic/select-config.editor.component.js +302 -0
  7. package/esm2015/lib/builder/element-config-editor/editors/basic/text-config.editor.component.js +6 -6
  8. package/esm2015/lib/builder/element-config-editor/editors/basic-element-config.editor.component.js +25 -25
  9. package/esm2015/lib/builder/element-config-editor/editors/document/pan-number-config.editor.component.js +6 -6
  10. package/esm2015/lib/builder/element-config-editor/editors/document-element-config.editor.component.js +18 -18
  11. package/esm2015/lib/builder/shared/elements.js +12 -3
  12. package/esm2015/lib/builder2/builder-form-editor/builder-form-editor.component.js +268 -0
  13. package/esm2015/lib/builder2/builder-form-editor/builder-form-editor.module.js +38 -0
  14. package/esm2015/lib/builder2/builder-form-editor/builder-form-editor.pipe.js +19 -0
  15. package/esm2015/lib/builder2/builder-form-editor/builder.form-editor.constants.js +178 -0
  16. package/esm2015/lib/builder2/builder-form-list/builder-forms-list.component.js +85 -0
  17. package/esm2015/lib/builder2/builder-form-list/builder-forms-list.module.js +37 -0
  18. package/esm2015/lib/builder2/builder2.component.js +169 -0
  19. package/esm2015/lib/builder2/builder2.module.js +46 -0
  20. package/esm2015/lib/kwikid-forms.module.js +16 -4
  21. package/esm2015/lib/renderer/config-converter.helper.js +86 -9
  22. package/esm2015/lib/renderer/form-view/definitions/form-view.fields.definition.js +4 -1
  23. package/esm2015/lib/renderer/form-view/form-view.component.js +200 -31
  24. package/esm2015/lib/renderer/form-view/helpers/form-view.fields.helper.js +17 -2
  25. package/esm2015/lib/renderer/forms-list/forms-list.component.js +6 -4
  26. package/esm2015/lib/renderer/renderer.component.js +73 -25
  27. package/esm2015/lib/renderer/renderer.definitions.js +6 -0
  28. package/esm2015/public_api.js +3 -1
  29. package/fesm2015/kwikid-forms.js +1304 -181
  30. package/fesm2015/kwikid-forms.js.map +1 -1
  31. package/lib/builder/builder.module.d.ts +2 -2
  32. package/lib/builder/element-config-editor/editors/basic/{dropdown-with-search-config.editor.component.d.ts → select-config.editor.component.d.ts} +5 -5
  33. package/lib/builder2/builder-form-editor/builder-form-editor.component.d.ts +48 -0
  34. package/lib/builder2/builder-form-editor/builder-form-editor.module.d.ts +12 -0
  35. package/lib/builder2/builder-form-editor/builder-form-editor.pipe.d.ts +7 -0
  36. package/lib/builder2/builder-form-editor/builder.form-editor.constants.d.ts +620 -0
  37. package/lib/builder2/builder-form-list/builder-forms-list.component.d.ts +19 -0
  38. package/lib/builder2/builder-form-list/builder-forms-list.module.d.ts +11 -0
  39. package/lib/builder2/builder2.component.d.ts +37 -0
  40. package/lib/builder2/builder2.module.d.ts +13 -0
  41. package/lib/kwikid-forms.module.d.ts +3 -2
  42. package/lib/renderer/form-view/definitions/form-view.fields.definition.d.ts +10 -7
  43. package/lib/renderer/form-view/form-view.component.d.ts +20 -3
  44. package/lib/renderer/form-view/helpers/form-view.fields.helper.d.ts +1 -0
  45. package/lib/renderer/renderer.definitions.d.ts +5 -0
  46. package/package.json +3 -16
  47. package/public_api.d.ts +2 -0
  48. package/esm2015/lib/builder/element-config-editor/editors/basic/dropdown-with-search-config.editor.component.js +0 -302
@@ -0,0 +1,268 @@
1
+ import { __decorate } from "tslib";
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from "@angular/core";
3
+ import { FormControl, FormGroup } from "@angular/forms";
4
+ import { checkObjectKeyExists, getObjectValueFromPath, logMethod, mergeObjects, setValueToObjectPath } from "kwikid-toolkit";
5
+ import _ from "lodash";
6
+ import { FIELD_PROPERTIES_CONFIG, FIELD_VALIDATORS_CONFIG, OPTIONS, TABLE_COLUMNS } from "./builder.form-editor.constants";
7
+ import { animate, style, transition, trigger } from "@angular/animations";
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ import * as i2 from "@angular/forms";
11
+ export class KwikIDBuilderFormEditorComponent {
12
+ constructor() {
13
+ this.activeFormConfig = {};
14
+ this.onClickSaveActiveFormConfig = new EventEmitter();
15
+ this.activeEditor = "fields";
16
+ this.activeFormConfig_Fields = [];
17
+ this.activeFormConfig_NoFields = {};
18
+ this.loader = false;
19
+ this.rows = [];
20
+ this.columns = TABLE_COLUMNS;
21
+ this.showPreview = false;
22
+ // Constants
23
+ this.options = OPTIONS;
24
+ this.fieldValidators = FIELD_VALIDATORS_CONFIG;
25
+ this.fieldProperties = FIELD_PROPERTIES_CONFIG;
26
+ // Forms
27
+ this.formGroup = {};
28
+ }
29
+ ngOnInit() { }
30
+ ngOnChanges(changes) {
31
+ const verifyChange = (key) => {
32
+ return checkObjectKeyExists(changes, key) && !changes[key].firstChange;
33
+ };
34
+ if (verifyChange("activeFormConfig")) {
35
+ this.activeFormConfig = changes.activeFormConfig.currentValue;
36
+ this.initializeActiveFormConfig(this.activeFormConfig);
37
+ }
38
+ }
39
+ initializeActiveFormConfig(activeFormConfig) {
40
+ this.loader = true;
41
+ this.activeFormConfig_Fields = JSON.parse(JSON.stringify(activeFormConfig.fields));
42
+ this.activeFormConfig_NoFields = JSON.parse(JSON.stringify(activeFormConfig));
43
+ delete this.activeFormConfig_NoFields.fields;
44
+ this.rows = this.activeFormConfig_Fields.map((field) => {
45
+ return {
46
+ key: field.key,
47
+ label: field.label,
48
+ type: field.type,
49
+ disabled: field.disabled,
50
+ validators: Object.assign(Object.assign({}, this.fieldValidators), field.validators),
51
+ properties: Object.assign(Object.assign({}, this.fieldProperties[field.type]), field.properties)
52
+ };
53
+ });
54
+ // Create the nested FormGroup dynamically
55
+ this.formGroup = this.createNestedFormGroup(this.rows);
56
+ console.log(this.formGroup);
57
+ this.loader = false;
58
+ }
59
+ createNestedFormGroup(object) {
60
+ const formGroup = {};
61
+ for (let index in object) {
62
+ formGroup[index] = new FormControl(object[index]);
63
+ }
64
+ return new FormGroup(formGroup);
65
+ }
66
+ handleOnClickChangeEditor(editorType) {
67
+ this.activeEditor = editorType;
68
+ }
69
+ handleOnClickSaveActiveFormConfig_NoFields(e) {
70
+ this.activeFormConfig_NoFields = JSON.parse(e);
71
+ }
72
+ handleOnInput(e) {
73
+ const fieldConfig = this.formGroup.getRawValue()[e.index];
74
+ const finalPath = e.path !== "" ? `${e.path}.${e.key}` : e.key;
75
+ let newFieldConfig = setValueToObjectPath(fieldConfig, finalPath, e.value.new);
76
+ // Update properties config if type is changed
77
+ if (e.key === "type") {
78
+ this.loader = true;
79
+ const updatedPropertiesConfig = Object.assign({}, FIELD_PROPERTIES_CONFIG[e.value.new]);
80
+ newFieldConfig = Object.assign(Object.assign({}, newFieldConfig), { properties: updatedPropertiesConfig });
81
+ // Update properties config in this.rows as well
82
+ const rowIndex = this.rows.findIndex((row) => row.key === fieldConfig.key);
83
+ if (rowIndex !== -1) {
84
+ this.rows[rowIndex].properties = updatedPropertiesConfig;
85
+ }
86
+ this.loader = false;
87
+ }
88
+ this.formGroup.controls[e.index].setValue(newFieldConfig, {
89
+ emitEvent: false
90
+ });
91
+ }
92
+ handleOnClickPreview() {
93
+ this.showPreview = true;
94
+ }
95
+ handleOnClickAddField() { }
96
+ handleOnClickDeleteField(e) {
97
+ this.rows = this.rows.filter((row) => {
98
+ if (row.key !== e.key) {
99
+ return row;
100
+ }
101
+ });
102
+ console.log(JSON.parse(JSON.stringify(this.rows)));
103
+ // Create the nested FormGroup dynamically
104
+ this.formGroup = this.createNestedFormGroup(this.rows);
105
+ console.log(this.formGroup);
106
+ this.formGroup.updateValueAndValidity();
107
+ }
108
+ handleOnClickSaveActiveFormConfig() {
109
+ // print deep copies of rows and activeFormFields_Fields
110
+ this.activeFormConfig_Fields = this.activeFormConfig_Fields
111
+ .filter((field) => _.some(this.rows, { key: field.key }))
112
+ .map((field) => {
113
+ const matchingRow = _.find(this.rows, { key: field.key });
114
+ return _.merge({}, field, matchingRow);
115
+ });
116
+ this.activeFormConfig = mergeObjects(this.activeFormConfig_NoFields, {
117
+ fields: this.activeFormConfig_Fields
118
+ });
119
+ this.onClickSaveActiveFormConfig.emit(this.activeFormConfig);
120
+ }
121
+ /**
122
+ * Other Methods
123
+ */
124
+ copyToClipboard() {
125
+ navigator.clipboard.writeText(JSON.stringify(this.activeFormConfig));
126
+ }
127
+ downloadJSON() {
128
+ const DATA = JSON.stringify(this.activeFormConfig); // Convert object to JSON string
129
+ const type = "application/json";
130
+ const FILE_NAME = `${this.activeFormConfig.key}.json`;
131
+ const blob = new Blob([DATA], { type });
132
+ const url = window.URL.createObjectURL(blob);
133
+ const link = document.createElement("a");
134
+ link.download = FILE_NAME;
135
+ link.href = url;
136
+ link.click();
137
+ window.URL.revokeObjectURL(url);
138
+ }
139
+ closeJSONPopup() {
140
+ this.showPreview = false;
141
+ }
142
+ /**
143
+ * Misc Methods
144
+ */
145
+ trackByFn(index, item) {
146
+ const key = (item === null || item === void 0 ? void 0 : item.key) || "";
147
+ const value = (item === null || item === void 0 ? void 0 : item.value) || "";
148
+ if (typeof item === "string") {
149
+ return `${String(index)}_${item}_${new Date().getTime()}`;
150
+ }
151
+ else {
152
+ return `${String(index)}_${key}_${value}_${new Date().getTime()}`;
153
+ }
154
+ }
155
+ getOptions(index, value, key, path) {
156
+ if (path.includes("properties")) {
157
+ const fieldType = this.rows[index].type;
158
+ const finalPath = `${path}['${fieldType}'].${key}`;
159
+ return getObjectValueFromPath(this.options, finalPath);
160
+ }
161
+ else {
162
+ const finalPath = path !== "" ? `${path}.${key}` : key;
163
+ return getObjectValueFromPath(this.options, finalPath);
164
+ }
165
+ }
166
+ isOptions(index, value, key, path) {
167
+ if (path.includes("properties")) {
168
+ const fieldType = this.rows[index].type;
169
+ const finalPath = `${path}['${fieldType}'].${key}`;
170
+ return Array.isArray(getObjectValueFromPath(this.options, finalPath));
171
+ }
172
+ else {
173
+ const finalPath = path !== "" ? `${path}.${key}` : key;
174
+ return Array.isArray(getObjectValueFromPath(this.options, finalPath));
175
+ }
176
+ }
177
+ isBoolean(value) {
178
+ return typeof value === "boolean";
179
+ }
180
+ isString(value) {
181
+ return typeof value === "string";
182
+ }
183
+ isNumber(value) {
184
+ return typeof value === "number";
185
+ }
186
+ isObject(value) {
187
+ return typeof value === "object" && value !== null;
188
+ }
189
+ }
190
+ /** @nocollapse */ KwikIDBuilderFormEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDBuilderFormEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
191
+ /** @nocollapse */ KwikIDBuilderFormEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDBuilderFormEditorComponent, selector: "kwikid-builder-form-editor", inputs: { activeFormConfig: "activeFormConfig" }, outputs: { onClickSaveActiveFormConfig: "onClickSaveActiveFormConfig" }, usesOnChanges: true, ngImport: i0, template: "<div\n ngClass=\"container\"\n *ngIf=\"activeFormConfig\"\n>\n <header>\n <div>{{ activeFormConfig.title }} Form Editor</div>\n <div ngClass=\"header-form-editor-btns\">\n <button (click)=\"handleOnClickChangeEditor('non-fields')\">\n Edit Non-Fields\n </button>\n <button (click)=\"handleOnClickChangeEditor('fields')\">Edit Fields</button>\n </div>\n </header>\n <main>\n <div\n ngClass=\"form-config-no-fields\"\n *ngIf=\"activeEditor != 'fields'\"\n >\n <pre\n contenteditable=\"true\"\n (keyup)=\"\n handleOnClickSaveActiveFormConfig_NoFields($event.target.innerHTML)\n \"\n >{{ activeFormConfig_NoFields | json }}</pre\n >\n </div>\n <div\n ngClass=\"form-config-fields\"\n *ngIf=\"activeEditor == 'fields'\"\n >\n <table>\n <thead>\n <tr>\n <th *ngFor=\"let column of columns; trackBy: trackByFn\">{{\n column\n }}</th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngFor=\"let row of rows; let i = index; trackBy: trackByFn\"\n >\n <tr>\n <ng-container\n *ngFor=\"\n let column of columns;\n let j = index;\n trackBy: trackByFn\n \"\n >\n <td>\n <div [ngClass]=\"column\">\n <ng-container\n *ngIf=\"column !== 'delete'\"\n [ngTemplateOutlet]=\"getFieldTemplate\"\n [ngTemplateOutletContext]=\"{\n index: i,\n fieldValue: row[column],\n fieldKey: column,\n parentPath: ''\n }\"\n ></ng-container>\n <ng-container *ngIf=\"column === 'delete'\">\n <button\n (click)=\"\n handleOnClickDeleteField({\n index: i,\n key: row['key']\n })\n \"\n [disabled]=\"rows.length === 1\"\n >\n Delete\n </button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </main>\n <footer>\n <button (click)=\"handleOnClickPreview()\">Preview</button>\n <button (click)=\"handleOnClickAddField()\">Add Field</button>\n <button (click)=\"handleOnClickSaveActiveFormConfig()\">Save</button>\n </footer>\n</div>\n<div\n ngClass=\"container\"\n *ngIf=\"!activeFormConfig\"\n>\n <h1 ngClass=\"no-form-selected\">Please select a form</h1>\n</div>\n\n<!-- Template for rendering different field types -->\n<ng-template\n #getFieldTemplate\n let-index=\"index\"\n let-value=\"fieldValue\"\n let-key=\"fieldKey\"\n let-path=\"parentPath\"\n>\n <div>\n <ng-container\n [ngTemplateOutlet]=\"\n isObject(value) ? objectFieldTemplate : notObjectFieldTemplate\n \"\n [ngTemplateOutletContext]=\"{\n index: index,\n fieldValue: value,\n fieldKey: key,\n parentPath: path\n }\"\n >\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template\n #objectFieldTemplate\n let-index=\"index\"\n let-value=\"fieldValue\"\n let-key=\"fieldKey\"\n let-path=\"parentPath\"\n>\n <ng-container *ngFor=\"let item of value | keyvalue; trackBy: trackByFn\">\n <ng-container\n [ngTemplateOutlet]=\"getFieldTemplate\"\n [ngTemplateOutletContext]=\"{\n index: index,\n fieldValue: item.value,\n fieldKey: item.key,\n parentPath: path === '' ? key : path + '.' + key\n }\"\n >\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template\n #notObjectFieldTemplate\n let-index=\"index\"\n let-value=\"fieldValue\"\n let-key=\"fieldKey\"\n let-path=\"parentPath\"\n>\n <div>\n <ng-container *ngIf=\"isOptions(index, value, key, path)\">\n <ng-container\n [ngTemplateOutlet]=\"optionFieldTemplate\"\n [ngTemplateOutletContext]=\"{\n index: index,\n key: key,\n value: value,\n path: path,\n options: getOptions(index, value, key, path)\n }\"\n ></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"!isOptions(index, value, key, path) && isString(value)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n textFieldTemplate;\n context: { index: index, key: key, value: value, path: path }\n \"\n ></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"!isOptions(index, value, key, path) && isNumber(value)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n numberFieldTemplate;\n context: { index: index, key: key, value: value, path: path }\n \"\n ></ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template\n #optionFieldTemplate\n let-index=\"index\"\n let-key=\"key\"\n let-value=\"value\"\n let-path=\"path\"\n let-options=\"options\"\n>\n <div class=\"field-container options\">\n <label for=\"\">{{ path }}.{{ key }}</label>\n <select\n (change)=\"handleOnInput({ index, key, value: { previous: value, new: $event.target.value }, path })\"\n >\n <option\n *ngFor=\"let option of options; trackBy: trackByFn\"\n [value]=\"option\"\n [selected]=\"option === value\"\n >{{ option }}</option\n >\n </select>\n </div>\n</ng-template>\n\n<ng-template\n #booleanFieldTemplate\n let-index=\"index\"\n let-key=\"key\"\n let-value=\"value\"\n let-path=\"path\"\n>\n <div class=\"field-container checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"value\"\n (change)=\"handleOnInput({ index, key, value: { previous: value, new: $event.target.checked }, path })\"\n />\n <span>{{ path }}.{{ key }}</span>\n </div>\n</ng-template>\n\n<ng-template\n #textFieldTemplate\n let-index=\"index\"\n let-key=\"key\"\n let-value=\"value\"\n let-path=\"path\"\n>\n <div class=\"field-container text\">\n <label for=\"\">{{ path }}.{{ key }}</label>\n <input\n placeholder=\"Enter {{ key }}\"\n type=\"text\"\n [value]=\"value\"\n (keyup)=\"handleOnInput({ index, key, value: { previous: value, new: $event.target.value }, path })\"\n />\n </div>\n</ng-template>\n\n<ng-template\n #numberFieldTemplate\n let-index=\"index\"\n let-key=\"key\"\n let-value=\"value\"\n let-path=\"path\"\n>\n <div class=\"field-container number\">\n <label>{{ path }}.{{ key }}</label>\n <input\n placeholder=\"Enter {{ key }}\"\n type=\"number\"\n [value]=\"value\"\n (keyup)=\"handleOnInput({ index, key, value: { previous: value, new: $event.target.value }, path })\"\n />\n </div>\n</ng-template>\n\n<div\n ngClass=\"kwikid-forms-builder-loader\"\n *ngIf=\"loader\"\n>\n <div class=\"loader-container\">\n <span class=\"loader\"></span>\n <div class=\"loader-text\">Please wait</div>\n </div>\n</div>\n\n<div\n class=\"modal\"\n *ngIf=\"showPreview\"\n [@panelInOut]\n>\n <div class=\"modal-box\">\n <div class=\"modal-content\">\n <div class=\"modal-heading\">\n <div class=\"modal-title\">\n {{ activeFormConfig.title }}'s Config Preview\n </div>\n <div class=\"modal-actions\">\n <button (click)=\"downloadJSON()\">Download Config</button>\n <button (click)=\"copyToClipboard()\">Copy Config to Clipboard</button>\n <button (click)=\"closeJSONPopup()\">Close</button>\n </div>\n </div>\n <div class=\"modal-body\">\n <pre>\n <code>{{ activeFormConfig | json }}</code>\n </pre>\n </div>\n </div>\n </div>\n</div>\n", styles: ["input[type=text],input[type=number]{width:100%;padding:6px;border:1px solid #ccc;border-radius:4px;box-sizing:border-box;-webkit-appearance:auto!important;appearance:auto!important}input[type=checkbox]{margin-right:5px;-webkit-appearance:auto!important;appearance:auto!important}select{width:100%;padding:6px;border:1px solid #ccc;border-radius:4px;box-sizing:border-box}textarea{overflow-wrap:anywhere;resize:none;unicode-bidi:embed;white-space:pre-wrap}button{display:inline-block;padding:10px 20px;background-color:#007bff;color:#fff;text-decoration:none;border-radius:4px;border:none;cursor:pointer}button:hover{background-color:#0069d9}button:active{background-color:#0056b3}button:focus{outline:none}.field-container{display:flex;margin-bottom:10px}.field-container label{color:gray}.field-container.checkbox{flex-direction:row;align-items:center}.field-container.options,.field-container.number,.field-container.text{flex-direction:column}.kwikid-forms-builder-loader{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(211,211,211,.5);display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-gap:1rem;gap:1rem;z-index:100}.kwikid-forms-builder-loader .loader-container{display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;padding:2em 1.5em;grid-gap:1rem;gap:1rem;background-color:#fff;box-shadow:#959da533 0 8px 24px;border-radius:.5rem}.kwikid-forms-builder-loader .loader-container .loader{width:28px;height:28px;border-radius:50%;display:inline-block;position:relative;border:3px solid;box-sizing:border-box;border-color:var(--tui-primary) transparent transparent;animation:rotation 1s ease-out infinite}@keyframes rotation{0%{transform:rotate(0);animation-timing-function:ease-in}25%{animation-timing-function:linear}50%{transform:rotate(180deg);animation-timing-function:ease-out}75%{animation-timing-function:linear}to{transform:rotate(360deg);animation-timing-function:ease-in}}.kwikid-forms-builder-loader .loader-container .loader-text{font-size:1rem;color:#000;margin:0}.kwikid-forms-builder-loader .t-loader{display:none!important}\n", "::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:gray}:host{all:unset;position:relative;width:100%;height:100%;overflow:auto}.container{display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;height:100%}.container header{padding:.5rem;display:flex;flex-direction:row;align-content:center;justify-content:space-between;align-items:center;border-bottom:1px solid lightgray}.container header .header-form-editor-btns{display:flex;flex-direction:row;align-content:center;justify-content:space-between;align-items:center;grid-gap:1rem;gap:1rem}.container main{padding:.5rem;flex-grow:1;overflow:auto;display:flex;flex-direction:row;justify-content:flex-start;align-items:stretch;grid-gap:1rem;gap:1rem;white-space:nowrap}.container main .form-config-no-fields{overflow:auto;width:100%}.container main .form-config-fields{overflow:auto;width:100%}.container main .validators,.container main .properties{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;grid-gap:.5rem;gap:.5rem}.container main .input-checkbox-container{display:flex;flex-direction:row}.container footer{padding:.5rem;display:flex;flex-direction:row;justify-content:flex-end;align-items:stretch;grid-gap:1rem;gap:1rem;border-top:1px solid lightgray}.container .no-form-selected{display:flex;flex-direction:column;align-items:center;justify-content:center;grid-gap:1rem;gap:1rem;flex-grow:1}.modal{position:absolute;top:0;background-color:#0000004d;width:100%;height:100%;display:flex;justify-content:center;align-items:center;left:0;flex-direction:row}.modal-box{width:75%;height:75%;margin:auto;background-color:#fff;border-radius:1rem;box-shadow:#64646f33 0 7px 29px}.modal-content{display:flex;flex-direction:column;align-content:center;justify-content:flex-start;align-items:stretch;width:100%;height:100%}.modal-heading{padding:.5rem 1rem;width:100%;display:flex;flex-direction:row;justify-content:space-between;border-bottom:1px solid lightgray;align-items:center}.modal-title{font-weight:bold;font-size:1rem}.modal-actions{display:flex;flex-direction:row;grid-gap:1rem;gap:1rem;cursor:pointer}.modal-body{overflow:auto}.modal-body pre{padding:1rem}pre{white-space:pre-wrap;overflow:auto}table{width:100%;border-collapse:collapse;margin-bottom:20px}table th,table td{padding:8px;text-align:left;border:1px solid #ccc;vertical-align:top}table th{background-color:#f2f2f2}table tr:nth-child(even){background-color:#f9f9f9}table tr:hover{background-color:#eaeaea}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], pipes: { "json": i1.JsonPipe, "keyvalue": i1.KeyValuePipe }, animations: [
192
+ trigger("panelInOut", [
193
+ transition(":enter", [
194
+ style({ transform: "translateY(100%)" }),
195
+ animate(150)
196
+ ]),
197
+ transition(":leave", [
198
+ animate(100, style({ transform: "translateY(100%)" }))
199
+ ])
200
+ ])
201
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
202
+ __decorate([
203
+ logMethod
204
+ ], KwikIDBuilderFormEditorComponent.prototype, "ngOnChanges", null);
205
+ __decorate([
206
+ logMethod
207
+ ], KwikIDBuilderFormEditorComponent.prototype, "initializeActiveFormConfig", null);
208
+ __decorate([
209
+ logMethod
210
+ ], KwikIDBuilderFormEditorComponent.prototype, "createNestedFormGroup", null);
211
+ __decorate([
212
+ logMethod
213
+ ], KwikIDBuilderFormEditorComponent.prototype, "handleOnClickChangeEditor", null);
214
+ __decorate([
215
+ logMethod
216
+ ], KwikIDBuilderFormEditorComponent.prototype, "handleOnClickSaveActiveFormConfig_NoFields", null);
217
+ __decorate([
218
+ logMethod
219
+ ], KwikIDBuilderFormEditorComponent.prototype, "handleOnInput", null);
220
+ __decorate([
221
+ logMethod
222
+ ], KwikIDBuilderFormEditorComponent.prototype, "handleOnClickPreview", null);
223
+ __decorate([
224
+ logMethod
225
+ ], KwikIDBuilderFormEditorComponent.prototype, "handleOnClickAddField", null);
226
+ __decorate([
227
+ logMethod
228
+ ], KwikIDBuilderFormEditorComponent.prototype, "handleOnClickDeleteField", null);
229
+ __decorate([
230
+ logMethod
231
+ ], KwikIDBuilderFormEditorComponent.prototype, "handleOnClickSaveActiveFormConfig", null);
232
+ __decorate([
233
+ logMethod
234
+ ], KwikIDBuilderFormEditorComponent.prototype, "copyToClipboard", null);
235
+ __decorate([
236
+ logMethod
237
+ ], KwikIDBuilderFormEditorComponent.prototype, "downloadJSON", null);
238
+ __decorate([
239
+ logMethod
240
+ ], KwikIDBuilderFormEditorComponent.prototype, "closeJSONPopup", null);
241
+ __decorate([
242
+ logMethod
243
+ ], KwikIDBuilderFormEditorComponent.prototype, "trackByFn", null);
244
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDBuilderFormEditorComponent, decorators: [{
245
+ type: Component,
246
+ args: [{
247
+ selector: "kwikid-builder-form-editor",
248
+ templateUrl: "./builder-form-editor.component.html",
249
+ styleUrls: ["../shared.scss", "./builder-form-editor.component.scss"],
250
+ changeDetection: ChangeDetectionStrategy.OnPush,
251
+ animations: [
252
+ trigger("panelInOut", [
253
+ transition(":enter", [
254
+ style({ transform: "translateY(100%)" }),
255
+ animate(150)
256
+ ]),
257
+ transition(":leave", [
258
+ animate(100, style({ transform: "translateY(100%)" }))
259
+ ])
260
+ ])
261
+ ]
262
+ }]
263
+ }], ctorParameters: function () { return []; }, propDecorators: { activeFormConfig: [{
264
+ type: Input
265
+ }], onClickSaveActiveFormConfig: [{
266
+ type: Output
267
+ }], ngOnChanges: [], initializeActiveFormConfig: [], createNestedFormGroup: [], handleOnClickChangeEditor: [], handleOnClickSaveActiveFormConfig_NoFields: [], handleOnInput: [], handleOnClickPreview: [], handleOnClickAddField: [], handleOnClickDeleteField: [], handleOnClickSaveActiveFormConfig: [], copyToClipboard: [], downloadJSON: [], closeJSONPopup: [], trackByFn: [] } });
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1mb3JtLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9idWlsZGVyMi9idWlsZGVyLWZvcm0tZWRpdG9yL2J1aWxkZXItZm9ybS1lZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvYnVpbGRlcjIvYnVpbGRlci1mb3JtLWVkaXRvci9idWlsZGVyLWZvcm0tZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLFNBQVMsRUFDVCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3JCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLE9BQU8sRUFDUCxhQUFhLEVBQ2QsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFtQjFFLE1BQU0sT0FBTyxnQ0FBZ0M7SUEwQjNDO1FBeEJBLHFCQUFnQixHQUFRLEVBQUUsQ0FBQztRQUczQixnQ0FBMkIsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV6RSxpQkFBWSxHQUFXLFFBQVEsQ0FBQztRQUNoQyw0QkFBdUIsR0FBVSxFQUFFLENBQUM7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LENBQUM7b0JBQ3JFLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxVQUFVLEVBQUU7d0JBQ1YsT0FBTyxDQUFDLFlBQVksRUFBRTs0QkFDcEIsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQ0FDbkIsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLENBQUM7Z0NBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUM7NkJBQ2IsQ0FBQzs0QkFDRixVQUFVLENBQUMsUUFBUSxFQUFFO2dDQUNuQixPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7NkJBQ3ZELENBQUM7eUJBQ0gsQ0FBQztxQkFDSDtpQkFDRjswRUFHQyxnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTiwyQkFBMkI7c0JBRDFCLE1BQU07Z0JBMkJQLFdBQVcsTUFZWCwwQkFBMEIsTUErQjFCLHFCQUFxQixNQVdyQix5QkFBeUIsTUFLekIsMENBQTBDLE1BSzFDLGFBQWEsTUF1Q2Isb0JBQW9CLE1BS3BCLHFCQUFxQixNQUdyQix3QkFBd0IsTUFpQnhCLGlDQUFpQyxNQXFCakMsZUFBZSxNQUtmLFlBQVksTUFlWixjQUFjLE1BUWQsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gIGNoZWNrT2JqZWN0S2V5RXhpc3RzLFxuICBnZXRPYmplY3RWYWx1ZUZyb21QYXRoLFxuICBsb2dNZXRob2QsXG4gIG1lcmdlT2JqZWN0cyxcbiAgc2V0VmFsdWVUb09iamVjdFBhdGhcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQgXyBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQge1xuICBGSUVMRF9QUk9QRVJUSUVTX0NPTkZJRyxcbiAgRklFTERfVkFMSURBVE9SU19DT05GSUcsXG4gIE9QVElPTlMsXG4gIFRBQkxFX0NPTFVNTlNcbn0gZnJvbSBcIi4vYnVpbGRlci5mb3JtLWVkaXRvci5jb25zdGFudHNcIjtcbmltcG9ydCB7IGFuaW1hdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSBcIkBhbmd1bGFyL2FuaW1hdGlvbnNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImt3aWtpZC1idWlsZGVyLWZvcm0tZWRpdG9yXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vYnVpbGRlci1mb3JtLWVkaXRvci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4uL3NoYXJlZC5zY3NzXCIsIFwiLi9idWlsZGVyLWZvcm0tZWRpdG9yLmNvbXBvbmVudC5zY3NzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoXCJwYW5lbEluT3V0XCIsIFtcbiAgICAgIHRyYW5zaXRpb24oXCI6ZW50ZXJcIiwgW1xuICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKDEwMCUpXCIgfSksXG4gICAgICAgIGFuaW1hdGUoMTUwKVxuICAgICAgXSksXG4gICAgICB0cmFuc2l0aW9uKFwiOmxlYXZlXCIsIFtcbiAgICAgICAgYW5pbWF0ZSgxMDAsIHN0eWxlKHsgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZVkoMTAwJSlcIiB9KSlcbiAgICAgIF0pXG4gICAgXSlcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBLd2lrSURCdWlsZGVyRm9ybUVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KClcbiAgYWN0aXZlRm9ybUNvbmZpZzogYW55ID0ge307XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2xpY2tTYXZlQWN0aXZlRm9ybUNvbmZpZzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBhY3RpdmVFZGl0b3I6IHN0cmluZyA9IFwiZmllbGRzXCI7XG4gIGFjdGl2ZUZvcm1Db25maWdfRmllbGRzOiBhbnlbXSA9IFtdO1xuICBhY3RpdmVGb3JtQ29uZmlnX05vRmllbGRzOiBhbnkgPSB7fTtcblxuICBsb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICByb3dzOiBhbnlbXSA9IFtdO1xuICBjb2x1bW5zOiBhbnlbXSA9IFRBQkxFX0NPTFVNTlM7XG5cbiAgc2hvd1ByZXZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBDb25zdGFudHNcbiAgb3B0aW9uczogYW55ID0gT1BUSU9OUztcbiAgZmllbGRWYWxpZGF0b3JzOiBhbnkgPSBGSUVMRF9WQUxJREFUT1JTX0NPTkZJRztcbiAgZmllbGRQcm9wZXJ0aWVzOiBhbnkgPSBGSUVMRF9QUk9QRVJUSUVTX0NPTkZJRztcblxuICAvLyBGb3Jtc1xuICBmb3JtR3JvdXA6IGFueSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgdmVyaWZ5Q2hhbmdlID0gKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gY2hlY2tPYmplY3RLZXlFeGlzdHMoY2hhbmdlcywga2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImFjdGl2ZUZvcm1Db25maWdcIikpIHtcbiAgICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZyA9IGNoYW5nZXMuYWN0aXZlRm9ybUNvbmZpZy5jdXJyZW50VmFsdWU7XG5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUFjdGl2ZUZvcm1Db25maWcodGhpcy5hY3RpdmVGb3JtQ29uZmlnKTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGluaXRpYWxpemVBY3RpdmVGb3JtQ29uZmlnKGFjdGl2ZUZvcm1Db25maWc6IGFueSkge1xuICAgIHRoaXMubG9hZGVyID0gdHJ1ZTtcblxuICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZ19GaWVsZHMgPSBKU09OLnBhcnNlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoYWN0aXZlRm9ybUNvbmZpZy5maWVsZHMpXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUZvcm1Db25maWdfTm9GaWVsZHMgPSBKU09OLnBhcnNlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoYWN0aXZlRm9ybUNvbmZpZylcbiAgICApO1xuICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZUZvcm1Db25maWdfTm9GaWVsZHMuZmllbGRzO1xuXG4gICAgdGhpcy5yb3dzID0gdGhpcy5hY3RpdmVGb3JtQ29uZmlnX0ZpZWxkcy5tYXAoKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICBsYWJlbDogZmllbGQubGFiZWwsXG4gICAgICAgIHR5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgIGRpc2FibGVkOiBmaWVsZC5kaXNhYmxlZCxcbiAgICAgICAgdmFsaWRhdG9yczogeyAuLi50aGlzLmZpZWxkVmFsaWRhdG9ycywgLi4uZmllbGQudmFsaWRhdG9ycyB9LFxuICAgICAgICBwcm9wZXJ0aWVzOiB7IC4uLnRoaXMuZmllbGRQcm9wZXJ0aWVzW2ZpZWxkLnR5cGVdLCAuLi5maWVsZC5wcm9wZXJ0aWVzIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIG5lc3RlZCBGb3JtR3JvdXAgZHluYW1pY2FsbHlcbiAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuY3JlYXRlTmVzdGVkRm9ybUdyb3VwKHRoaXMucm93cyk7XG5cbiAgICBjb25zb2xlLmxvZyh0aGlzLmZvcm1Hcm91cCk7XG5cbiAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBjcmVhdGVOZXN0ZWRGb3JtR3JvdXAob2JqZWN0OiBhbnlbXSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgZm9ybUdyb3VwID0ge307XG5cbiAgICBmb3IgKGxldCBpbmRleCBpbiBvYmplY3QpIHtcbiAgICAgIGZvcm1Hcm91cFtpbmRleF0gPSBuZXcgRm9ybUNvbnRyb2wob2JqZWN0W2luZGV4XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGb3JtR3JvdXAoZm9ybUdyb3VwKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja0NoYW5nZUVkaXRvcihlZGl0b3JUeXBlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFjdGl2ZUVkaXRvciA9IGVkaXRvclR5cGU7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tTYXZlQWN0aXZlRm9ybUNvbmZpZ19Ob0ZpZWxkcyhlOiBhbnkpIHtcbiAgICB0aGlzLmFjdGl2ZUZvcm1Db25maWdfTm9GaWVsZHMgPSBKU09OLnBhcnNlKGUpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbklucHV0KGU6IGFueSkge1xuICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gdGhpcy5mb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKVtlLmluZGV4XTtcbiAgICBjb25zdCBmaW5hbFBhdGggPSBlLnBhdGggIT09IFwiXCIgPyBgJHtlLnBhdGh9LiR7ZS5rZXl9YCA6IGUua2V5O1xuXG4gICAgbGV0IG5ld0ZpZWxkQ29uZmlnID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICBmaWVsZENvbmZpZyxcbiAgICAgIGZpbmFsUGF0aCxcbiAgICAgIGUudmFsdWUubmV3XG4gICAgKTtcblxuICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzIGNvbmZpZyBpZiB0eXBlIGlzIGNoYW5nZWRcbiAgICBpZiAoZS5rZXkgPT09IFwidHlwZVwiKSB7XG4gICAgICB0aGlzLmxvYWRlciA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRQcm9wZXJ0aWVzQ29uZmlnID0ge1xuICAgICAgICAuLi5GSUVMRF9QUk9QRVJUSUVTX0NPTkZJR1tlLnZhbHVlLm5ld11cbiAgICAgIH07XG4gICAgICBuZXdGaWVsZENvbmZpZyA9IHtcbiAgICAgICAgLi4ubmV3RmllbGRDb25maWcsXG4gICAgICAgIHByb3BlcnRpZXM6IHVwZGF0ZWRQcm9wZXJ0aWVzQ29uZmlnXG4gICAgICB9O1xuXG4gICAgICAvLyBVcGRhdGUgcHJvcGVydGllcyBjb25maWcgaW4gdGhpcy5yb3dzIGFzIHdlbGxcbiAgICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5yb3dzLmZpbmRJbmRleChcbiAgICAgICAgKHJvdykgPT4gcm93LmtleSA9PT0gZmllbGRDb25maWcua2V5XG4gICAgICApO1xuICAgICAgaWYgKHJvd0luZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLnJvd3Nbcm93SW5kZXhdLnByb3BlcnRpZXMgPSB1cGRhdGVkUHJvcGVydGllc0NvbmZpZztcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tlLmluZGV4XS5zZXRWYWx1ZShuZXdGaWVsZENvbmZpZywge1xuICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbkNsaWNrUHJldmlldygpIHtcbiAgICB0aGlzLnNob3dQcmV2aWV3ID0gdHJ1ZTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja0FkZEZpZWxkKCkge31cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tEZWxldGVGaWVsZChlKSB7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5yb3dzLmZpbHRlcigocm93KSA9PiB7XG4gICAgICBpZiAocm93LmtleSAhPT0gZS5rZXkpIHtcbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5yb3dzKSkpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBuZXN0ZWQgRm9ybUdyb3VwIGR5bmFtaWNhbGx5XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmNyZWF0ZU5lc3RlZEZvcm1Hcm91cCh0aGlzLnJvd3MpO1xuXG4gICAgY29uc29sZS5sb2codGhpcy5mb3JtR3JvdXApO1xuICAgIHRoaXMuZm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja1NhdmVBY3RpdmVGb3JtQ29uZmlnKCkge1xuICAgIC8vIHByaW50IGRlZXAgY29waWVzIG9mIHJvd3MgYW5kIGFjdGl2ZUZvcm1GaWVsZHNfRmllbGRzXG5cbiAgICB0aGlzLmFjdGl2ZUZvcm1Db25maWdfRmllbGRzID0gdGhpcy5hY3RpdmVGb3JtQ29uZmlnX0ZpZWxkc1xuICAgICAgLmZpbHRlcigoZmllbGQpID0+IF8uc29tZSh0aGlzLnJvd3MsIHsga2V5OiBmaWVsZC5rZXkgfSkpXG4gICAgICAubWFwKChmaWVsZCkgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaGluZ1JvdyA9IF8uZmluZCh0aGlzLnJvd3MsIHsga2V5OiBmaWVsZC5rZXkgfSk7XG4gICAgICAgIHJldHVybiBfLm1lcmdlKHt9LCBmaWVsZCwgbWF0Y2hpbmdSb3cpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmFjdGl2ZUZvcm1Db25maWcgPSBtZXJnZU9iamVjdHModGhpcy5hY3RpdmVGb3JtQ29uZmlnX05vRmllbGRzLCB7XG4gICAgICBmaWVsZHM6IHRoaXMuYWN0aXZlRm9ybUNvbmZpZ19GaWVsZHNcbiAgICB9KTtcblxuICAgIHRoaXMub25DbGlja1NhdmVBY3RpdmVGb3JtQ29uZmlnLmVtaXQodGhpcy5hY3RpdmVGb3JtQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdGhlciBNZXRob2RzXG4gICAqL1xuICBAbG9nTWV0aG9kXG4gIGNvcHlUb0NsaXBib2FyZCgpIHtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChKU09OLnN0cmluZ2lmeSh0aGlzLmFjdGl2ZUZvcm1Db25maWcpKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZG93bmxvYWRKU09OKCkge1xuICAgIGNvbnN0IERBVEEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmFjdGl2ZUZvcm1Db25maWcpOyAvLyBDb252ZXJ0IG9iamVjdCB0byBKU09OIHN0cmluZ1xuICAgIGNvbnN0IHR5cGUgPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBjb25zdCBGSUxFX05BTUUgPSBgJHt0aGlzLmFjdGl2ZUZvcm1Db25maWcua2V5fS5qc29uYDtcblxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbREFUQV0sIHsgdHlwZSB9KTtcbiAgICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgbGluay5kb3dubG9hZCA9IEZJTEVfTkFNRTtcbiAgICBsaW5rLmhyZWYgPSB1cmw7XG4gICAgbGluay5jbGljaygpO1xuICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGNsb3NlSlNPTlBvcHVwKCkge1xuICAgIHRoaXMuc2hvd1ByZXZpZXcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaXNjIE1ldGhvZHNcbiAgICovXG4gIEBsb2dNZXRob2RcbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IGFueSB7XG4gICAgY29uc3Qga2V5ID0gaXRlbT8ua2V5IHx8IFwiXCI7XG4gICAgY29uc3QgdmFsdWUgPSBpdGVtPy52YWx1ZSB8fCBcIlwiO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gYCR7U3RyaW5nKGluZGV4KX1fJHtpdGVtfV8ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtTdHJpbmcoaW5kZXgpfV8ke2tleX1fJHt2YWx1ZX1fJHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gO1xuICAgIH1cbiAgfVxuXG4gIGdldE9wdGlvbnMoaW5kZXgsIHZhbHVlLCBrZXksIHBhdGgpIHtcbiAgICBpZiAocGF0aC5pbmNsdWRlcyhcInByb3BlcnRpZXNcIikpIHtcbiAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHRoaXMucm93c1tpbmRleF0udHlwZTtcblxuICAgICAgY29uc3QgZmluYWxQYXRoID0gYCR7cGF0aH1bJyR7ZmllbGRUeXBlfSddLiR7a2V5fWA7XG5cbiAgICAgIHJldHVybiBnZXRPYmplY3RWYWx1ZUZyb21QYXRoKHRoaXMub3B0aW9ucywgZmluYWxQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmluYWxQYXRoID0gcGF0aCAhPT0gXCJcIiA/IGAke3BhdGh9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIHJldHVybiBnZXRPYmplY3RWYWx1ZUZyb21QYXRoKHRoaXMub3B0aW9ucywgZmluYWxQYXRoKTtcbiAgICB9XG4gIH1cblxuICBpc09wdGlvbnMoaW5kZXgsIHZhbHVlLCBrZXksIHBhdGgpIHtcbiAgICBpZiAocGF0aC5pbmNsdWRlcyhcInByb3BlcnRpZXNcIikpIHtcbiAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHRoaXMucm93c1tpbmRleF0udHlwZTtcblxuICAgICAgY29uc3QgZmluYWxQYXRoID0gYCR7cGF0aH1bJyR7ZmllbGRUeXBlfSddLiR7a2V5fWA7XG5cbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGdldE9iamVjdFZhbHVlRnJvbVBhdGgodGhpcy5vcHRpb25zLCBmaW5hbFBhdGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmluYWxQYXRoID0gcGF0aCAhPT0gXCJcIiA/IGAke3BhdGh9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGdldE9iamVjdFZhbHVlRnJvbVBhdGgodGhpcy5vcHRpb25zLCBmaW5hbFBhdGgpKTtcbiAgICB9XG4gIH1cblxuICBpc0Jvb2xlYW4odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiO1xuICB9XG5cbiAgaXNTdHJpbmcodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XG4gIH1cblxuICBpc051bWJlcih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIjtcbiAgfVxuXG4gIGlzT2JqZWN0KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsO1xuICB9XG59XG4iLCI8ZGl2XG4gIG5nQ2xhc3M9XCJjb250YWluZXJcIlxuICAqbmdJZj1cImFjdGl2ZUZvcm1Db25maWdcIlxuPlxuICA8aGVhZGVyPlxuICAgIDxkaXY+e3sgYWN0aXZlRm9ybUNvbmZpZy50aXRsZSB9fSBGb3JtIEVkaXRvcjwvZGl2PlxuICAgIDxkaXYgbmdDbGFzcz1cImhlYWRlci1mb3JtLWVkaXRvci1idG5zXCI+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVPbkNsaWNrQ2hhbmdlRWRpdG9yKCdub24tZmllbGRzJylcIj5cbiAgICAgICAgRWRpdCBOb24tRmllbGRzXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZU9uQ2xpY2tDaGFuZ2VFZGl0b3IoJ2ZpZWxkcycpXCI+RWRpdCBGaWVsZHM8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9oZWFkZXI+XG4gIDxtYWluPlxuICAgIDxkaXZcbiAgICAgIG5nQ2xhc3M9XCJmb3JtLWNvbmZpZy1uby1maWVsZHNcIlxuICAgICAgKm5nSWY9XCJhY3RpdmVFZGl0b3IgIT0gJ2ZpZWxkcydcIlxuICAgID5cbiAgICAgIDxwcmVcbiAgICAgICAgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChrZXl1cCk9XCJcbiAgICAgICAgICBoYW5kbGVPbkNsaWNrU2F2ZUFjdGl2ZUZvcm1Db25maWdfTm9GaWVsZHMoJGV2ZW50LnRhcmdldC5pbm5lckhUTUwpXG4gICAgICAgIFwiXG4gICAgICAgID57eyBhY3RpdmVGb3JtQ29uZmlnX05vRmllbGRzIHwganNvbiB9fTwvcHJlXG4gICAgICA+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgbmdDbGFzcz1cImZvcm0tY29uZmlnLWZpZWxkc1wiXG4gICAgICAqbmdJZj1cImFjdGl2ZUVkaXRvciA9PSAnZmllbGRzJ1wiXG4gICAgPlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgdHJhY2tCeTogdHJhY2tCeUZuXCI+e3tcbiAgICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgICB9fTwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2Ygcm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW4gb2YgY29sdW1ucztcbiAgICAgICAgICAgICAgICAgIGxldCBqID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5Rm5cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJjb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uICE9PSAnZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0RmllbGRUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZTogcm93W2NvbHVtbl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEtleTogY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50UGF0aDogJydcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uID09PSAnZGVsZXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT25DbGlja0RlbGV0ZUZpZWxkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHJvd1sna2V5J11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93cy5sZW5ndGggPT09IDFcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG4gIDwvbWFpbj5cbiAgPGZvb3Rlcj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVPbkNsaWNrUHJldmlldygpXCI+UHJldmlldzwvYnV0dG9uPlxuICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZU9uQ2xpY2tBZGRGaWVsZCgpXCI+QWRkIEZpZWxkPC9idXR0b24+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlT25DbGlja1NhdmVBY3RpdmVGb3JtQ29uZmlnKClcIj5TYXZlPC9idXR0b24+XG4gIDwvZm9vdGVyPlxuPC9kaXY+XG48ZGl2XG4gIG5nQ2xhc3M9XCJjb250YWluZXJcIlxuICAqbmdJZj1cIiFhY3RpdmVGb3JtQ29uZmlnXCJcbj5cbiAgPGgxIG5nQ2xhc3M9XCJuby1mb3JtLXNlbGVjdGVkXCI+UGxlYXNlIHNlbGVjdCBhIGZvcm08L2gxPlxuPC9kaXY+XG5cbjwhLS0gVGVtcGxhdGUgZm9yIHJlbmRlcmluZyBkaWZmZXJlbnQgZmllbGQgdHlwZXMgLS0+XG48bmctdGVtcGxhdGVcbiAgI2dldEZpZWxkVGVtcGxhdGVcbiAgbGV0LWluZGV4PVwiaW5kZXhcIlxuICBsZXQtdmFsdWU9XCJmaWVsZFZhbHVlXCJcbiAgbGV0LWtleT1cImZpZWxkS2V5XCJcbiAgbGV0LXBhdGg9XCJwYXJlbnRQYXRoXCJcbj5cbiAgPGRpdj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJcbiAgICAgICAgaXNPYmplY3QodmFsdWUpID8gb2JqZWN0RmllbGRUZW1wbGF0ZSA6IG5vdE9iamVjdEZpZWxkVGVtcGxhdGVcbiAgICAgIFwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgIGZpZWxkVmFsdWU6IHZhbHVlLFxuICAgICAgICBmaWVsZEtleToga2V5LFxuICAgICAgICBwYXJlbnRQYXRoOiBwYXRoXG4gICAgICB9XCJcbiAgICA+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNvYmplY3RGaWVsZFRlbXBsYXRlXG4gIGxldC1pbmRleD1cImluZGV4XCJcbiAgbGV0LXZhbHVlPVwiZmllbGRWYWx1ZVwiXG4gIGxldC1rZXk9XCJmaWVsZEtleVwiXG4gIGxldC1wYXRoPVwicGFyZW50UGF0aFwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdmFsdWUgfCBrZXl2YWx1ZTsgdHJhY2tCeTogdHJhY2tCeUZuXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0RmllbGRUZW1wbGF0ZVwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgIGZpZWxkVmFsdWU6IGl0ZW0udmFsdWUsXG4gICAgICAgIGZpZWxkS2V5OiBpdGVtLmtleSxcbiAgICAgICAgcGFyZW50UGF0aDogcGF0aCA9PT0gJycgPyBrZXkgOiBwYXRoICsgJy4nICsga2V5XG4gICAgICB9XCJcbiAgICA+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNub3RPYmplY3RGaWVsZFRlbXBsYXRlXG4gIGxldC1pbmRleD1cImluZGV4XCJcbiAgbGV0LXZhbHVlPVwiZmllbGRWYWx1ZVwiXG4gIGxldC1rZXk9XCJmaWVsZEtleVwiXG4gIGxldC1wYXRoPVwicGFyZW50UGF0aFwiXG4+XG4gIDxkaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzT3B0aW9ucyhpbmRleCwgdmFsdWUsIGtleSwgcGF0aClcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uRmllbGRUZW1wbGF0ZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgIG9wdGlvbnM6IGdldE9wdGlvbnMoaW5kZXgsIHZhbHVlLCBrZXksIHBhdGgpXG4gICAgICAgIH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0lmPVwiIWlzT3B0aW9ucyhpbmRleCwgdmFsdWUsIGtleSwgcGF0aCkgJiYgaXNTdHJpbmcodmFsdWUpXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgdGV4dEZpZWxkVGVtcGxhdGU7XG4gICAgICAgICAgY29udGV4dDogeyBpbmRleDogaW5kZXgsIGtleToga2V5LCB2YWx1ZTogdmFsdWUsIHBhdGg6IHBhdGggfVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0lmPVwiIWlzT3B0aW9ucyhpbmRleCwgdmFsdWUsIGtleSwgcGF0aCkgJiYgaXNOdW1iZXIodmFsdWUpXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgbnVtYmVyRmllbGRUZW1wbGF0ZTtcbiAgICAgICAgICBjb250ZXh0OiB7IGluZGV4OiBpbmRleCwga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSwgcGF0aDogcGF0aCB9XG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNvcHRpb25GaWVsZFRlbXBsYXRlXG4gIGxldC1pbmRleD1cImluZGV4XCJcbiAgbGV0LWtleT1cImtleVwiXG4gIGxldC12YWx1ZT1cInZhbHVlXCJcbiAgbGV0LXBhdGg9XCJwYXRoXCJcbiAgbGV0LW9wdGlvbnM9XCJvcHRpb25zXCJcbj5cbiAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lciBvcHRpb25zXCI+XG4gICAgPGxhYmVsIGZvcj1cIlwiPnt7IHBhdGggfX0ue3sga2V5IH19PC9sYWJlbD5cbiAgICA8c2VsZWN0XG4gICAgICAoY2hhbmdlKT1cImhhbmRsZU9uSW5wdXQoeyBpbmRleCwga2V5LCB2YWx1ZTogeyBwcmV2aW91czogdmFsdWUsIG5ldzogJGV2ZW50LnRhcmdldC52YWx1ZSB9LCBwYXRoIH0pXCJcbiAgICA+XG4gICAgICA8b3B0aW9uXG4gICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uczsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiXG4gICAgICAgIFtzZWxlY3RlZF09XCJvcHRpb24gPT09IHZhbHVlXCJcbiAgICAgICAgPnt7IG9wdGlvbiB9fTwvb3B0aW9uXG4gICAgICA+XG4gICAgPC9zZWxlY3Q+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNib29sZWFuRmllbGRUZW1wbGF0ZVxuICBsZXQtaW5kZXg9XCJpbmRleFwiXG4gIGxldC1rZXk9XCJrZXlcIlxuICBsZXQtdmFsdWU9XCJ2YWx1ZVwiXG4gIGxldC1wYXRoPVwicGF0aFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250YWluZXIgY2hlY2tib3hcIj5cbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICBbY2hlY2tlZF09XCJ2YWx1ZVwiXG4gICAgICAoY2hhbmdlKT1cImhhbmRsZU9uSW5wdXQoeyBpbmRleCwga2V5LCB2YWx1ZTogeyBwcmV2aW91czogdmFsdWUsIG5ldzogJGV2ZW50LnRhcmdldC5jaGVja2VkIH0sIHBhdGggfSlcIlxuICAgIC8+XG4gICAgPHNwYW4+e3sgcGF0aCB9fS57eyBrZXkgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICN0ZXh0RmllbGRUZW1wbGF0ZVxuICBsZXQtaW5kZXg9XCJpbmRleFwiXG4gIGxldC1rZXk9XCJrZXlcIlxuICBsZXQtdmFsdWU9XCJ2YWx1ZVwiXG4gIGxldC1wYXRoPVwicGF0aFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250YWluZXIgdGV4dFwiPlxuICAgIDxsYWJlbCBmb3I9XCJcIj57eyBwYXRoIH19Lnt7IGtleSB9fTwvbGFiZWw+XG4gICAgPGlucHV0XG4gICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHt7IGtleSB9fVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgKGtleXVwKT1cImhhbmRsZU9uSW5wdXQoeyBpbmRleCwga2V5LCB2YWx1ZTogeyBwcmV2aW91czogdmFsdWUsIG5ldzogJGV2ZW50LnRhcmdldC52YWx1ZSB9LCBwYXRoIH0pXCJcbiAgICAvPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjbnVtYmVyRmllbGRUZW1wbGF0ZVxuICBsZXQtaW5kZXg9XCJpbmRleFwiXG4gIGxldC1rZXk9XCJrZXlcIlxuICBsZXQtdmFsdWU9XCJ2YWx1ZVwiXG4gIGxldC1wYXRoPVwicGF0aFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250YWluZXIgbnVtYmVyXCI+XG4gICAgPGxhYmVsPnt7IHBhdGggfX0ue3sga2V5IH19PC9sYWJlbD5cbiAgICA8aW5wdXRcbiAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIge3sga2V5IH19XCJcbiAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgIChrZXl1cCk9XCJoYW5kbGVPbklucHV0KHsgaW5kZXgsIGtleSwgdmFsdWU6IHsgcHJldmlvdXM6IHZhbHVlLCBuZXc6ICRldmVudC50YXJnZXQudmFsdWUgfSwgcGF0aCB9KVwiXG4gICAgLz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2XG4gIG5nQ2xhc3M9XCJrd2lraWQtZm9ybXMtYnVpbGRlci1sb2FkZXJcIlxuICAqbmdJZj1cImxvYWRlclwiXG4+XG4gIDxkaXYgY2xhc3M9XCJsb2FkZXItY29udGFpbmVyXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJsb2FkZXJcIj48L3NwYW4+XG4gICAgPGRpdiBjbGFzcz1cImxvYWRlci10ZXh0XCI+UGxlYXNlIHdhaXQ8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdlxuICBjbGFzcz1cIm1vZGFsXCJcbiAgKm5nSWY9XCJzaG93UHJldmlld1wiXG4gIFtAcGFuZWxJbk91dF1cbj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJveFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGluZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5cbiAgICAgICAgICB7eyBhY3RpdmVGb3JtQ29uZmlnLnRpdGxlIH19J3MgQ29uZmlnIFByZXZpZXdcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZG93bmxvYWRKU09OKClcIj5Eb3dubG9hZCBDb25maWc8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjb3B5VG9DbGlwYm9hcmQoKVwiPkNvcHkgQ29uZmlnIHRvIENsaXBib2FyZDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImNsb3NlSlNPTlBvcHVwKClcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgPHByZT5cbiAgICAgICAgICA8Y29kZT57eyBhY3RpdmVGb3JtQ29uZmlnIHwganNvbiB9fTwvY29kZT5cbiAgICAgICAgPC9wcmU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,38 @@
1
+ import { CommonModule } from "@angular/common";
2
+ import { NgModule } from "@angular/core";
3
+ import { FormsModule, ReactiveFormsModule } from "@angular/forms";
4
+ import { TuiSvgModule } from "@taiga-ui/core";
5
+ import { KwikUIModule } from "kwikui";
6
+ import { KwikIDBuilderFormEditorComponent } from "./builder-form-editor.component";
7
+ import { ValueFormatterPipe } from "./builder-form-editor.pipe";
8
+ import * as i0 from "@angular/core";
9
+ export class KwikIDBuilderFormEditorModule {
10
+ }
11
+ /** @nocollapse */ KwikIDBuilderFormEditorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDBuilderFormEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
12
+ /** @nocollapse */ KwikIDBuilderFormEditorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDBuilderFormEditorModule, declarations: [KwikIDBuilderFormEditorComponent, ValueFormatterPipe], imports: [CommonModule,
13
+ FormsModule,
14
+ ReactiveFormsModule,
15
+ KwikUIModule,
16
+ TuiSvgModule], exports: [KwikIDBuilderFormEditorComponent] });
17
+ /** @nocollapse */ KwikIDBuilderFormEditorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDBuilderFormEditorModule, imports: [[
18
+ CommonModule,
19
+ FormsModule,
20
+ ReactiveFormsModule,
21
+ KwikUIModule,
22
+ TuiSvgModule
23
+ ]] });
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDBuilderFormEditorModule, decorators: [{
25
+ type: NgModule,
26
+ args: [{
27
+ declarations: [KwikIDBuilderFormEditorComponent, ValueFormatterPipe],
28
+ imports: [
29
+ CommonModule,
30
+ FormsModule,
31
+ ReactiveFormsModule,
32
+ KwikUIModule,
33
+ TuiSvgModule
34
+ ],
35
+ exports: [KwikIDBuilderFormEditorComponent]
36
+ }]
37
+ }] });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1mb3JtLWVkaXRvci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9idWlsZGVyMi9idWlsZGVyLWZvcm0tZWRpdG9yL2J1aWxkZXItZm9ybS1lZGl0b3IubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFhaEUsTUFBTSxPQUFPLDZCQUE2Qjs7OElBQTdCLDZCQUE2QjsrSUFBN0IsNkJBQTZCLGlCQVZ6QixnQ0FBZ0MsRUFBRSxrQkFBa0IsYUFFakUsWUFBWTtRQUNaLFdBQVc7UUFDWCxtQkFBbUI7UUFDbkIsWUFBWTtRQUNaLFlBQVksYUFFSixnQ0FBZ0M7K0lBRS9CLDZCQUE2QixZQVQvQjtZQUNQLFlBQVk7WUFDWixXQUFXO1lBQ1gsbUJBQW1CO1lBQ25CLFlBQVk7WUFDWixZQUFZO1NBQ2I7NEZBR1UsNkJBQTZCO2tCQVh6QyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLGdDQUFnQyxFQUFFLGtCQUFrQixDQUFDO29CQUNwRSxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixZQUFZO3FCQUNiO29CQUNELE9BQU8sRUFBRSxDQUFDLGdDQUFnQyxDQUFDO2lCQUM1QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBUdWlTdmdNb2R1bGUgfSBmcm9tIFwiQHRhaWdhLXVpL2NvcmVcIjtcbmltcG9ydCB7IEt3aWtVSU1vZHVsZSB9IGZyb20gXCJrd2lrdWlcIjtcbmltcG9ydCB7IEt3aWtJREJ1aWxkZXJGb3JtRWRpdG9yQ29tcG9uZW50IH0gZnJvbSBcIi4vYnVpbGRlci1mb3JtLWVkaXRvci5jb21wb25lbnRcIjtcbmltcG9ydCB7IFZhbHVlRm9ybWF0dGVyUGlwZSB9IGZyb20gXCIuL2J1aWxkZXItZm9ybS1lZGl0b3IucGlwZVwiO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtLd2lrSURCdWlsZGVyRm9ybUVkaXRvckNvbXBvbmVudCwgVmFsdWVGb3JtYXR0ZXJQaXBlXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEt3aWtVSU1vZHVsZSxcbiAgICBUdWlTdmdNb2R1bGVcbiAgXSxcbiAgZXhwb3J0czogW0t3aWtJREJ1aWxkZXJGb3JtRWRpdG9yQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBLd2lrSURCdWlsZGVyRm9ybUVkaXRvck1vZHVsZSB7fVxuIl19
@@ -0,0 +1,19 @@
1
+ import { Pipe } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ export class ValueFormatterPipe {
4
+ transform(value) {
5
+ if (value && typeof value === "object") {
6
+ return JSON.stringify(value);
7
+ }
8
+ else {
9
+ return value;
10
+ }
11
+ }
12
+ }
13
+ /** @nocollapse */ ValueFormatterPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ValueFormatterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
14
+ /** @nocollapse */ ValueFormatterPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ValueFormatterPipe, name: "valueFormatter" });
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ValueFormatterPipe, decorators: [{
16
+ type: Pipe,
17
+ args: [{ name: "valueFormatter" }]
18
+ }] });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1mb3JtLWVkaXRvci5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvYnVpbGRlcjIvYnVpbGRlci1mb3JtLWVkaXRvci9idWlsZGVyLWZvcm0tZWRpdG9yLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBR3BELE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsU0FBUyxDQUFDLEtBQVU7UUFDbEIsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM5QjthQUFNO1lBQ0wsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7O21JQVBVLGtCQUFrQjtpSUFBbEIsa0JBQWtCOzRGQUFsQixrQkFBa0I7a0JBRDlCLElBQUk7bUJBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuQFBpcGUoeyBuYW1lOiBcInZhbHVlRm9ybWF0dGVyXCIgfSlcbmV4cG9ydCBjbGFzcyBWYWx1ZUZvcm1hdHRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==