@ajf/material 15.3.14 → 16.0.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 (169) hide show
  1. package/{esm2020 → esm2022}/barcode/barcode-module.mjs +19 -19
  2. package/{esm2020 → esm2022}/barcode/barcode.mjs +4 -4
  3. package/{esm2020 → esm2022}/calendar/calendar-module.mjs +5 -5
  4. package/{esm2020 → esm2022}/calendar/calendar.mjs +4 -4
  5. package/{esm2020 → esm2022}/checkbox-group/checkbox-group-item.mjs +4 -4
  6. package/{esm2020 → esm2022}/checkbox-group/checkbox-group-module.mjs +5 -5
  7. package/esm2022/form-builder/branch-line.mjs +69 -0
  8. package/{esm2020 → esm2022}/form-builder/choices-origin-editor-dialog.mjs +7 -7
  9. package/{esm2020 → esm2022}/form-builder/choices-origin-editor.mjs +5 -5
  10. package/{esm2020 → esm2022}/form-builder/condition-editor-dialog.mjs +7 -7
  11. package/{esm2020 → esm2022}/form-builder/condition-editor.mjs +9 -9
  12. package/{esm2020 → esm2022}/form-builder/form-builder-module.mjs +64 -64
  13. package/esm2022/form-builder/form-builder-service.mjs +923 -0
  14. package/esm2022/form-builder/form-builder.mjs +183 -0
  15. package/esm2022/form-builder/node-entry.mjs +267 -0
  16. package/{esm2020 → esm2022}/form-builder/node-properties-name-validator.mjs +4 -4
  17. package/esm2022/form-builder/node-properties.mjs +1030 -0
  18. package/{esm2020 → esm2022}/form-builder/node-type-entry.mjs +7 -7
  19. package/{esm2020 → esm2022}/form-builder/string-identifier-dialog.mjs +4 -4
  20. package/{esm2020 → esm2022}/form-builder/validation-condition-editor-dialog.mjs +7 -7
  21. package/{esm2020 → esm2022}/form-builder/warning-condition-editor-dialog.mjs +7 -7
  22. package/{esm2020 → esm2022}/forms/barcode-field.mjs +4 -4
  23. package/{esm2020 → esm2022}/forms/boolean-field.mjs +4 -4
  24. package/{esm2020 → esm2022}/forms/date-field.mjs +4 -4
  25. package/{esm2020 → esm2022}/forms/date-input-field.mjs +4 -4
  26. package/{esm2020 → esm2022}/forms/empty-field.mjs +4 -4
  27. package/{esm2020 → esm2022}/forms/field-service.mjs +4 -4
  28. package/{esm2020 → esm2022}/forms/field-warning-dialog.mjs +4 -4
  29. package/{esm2020 → esm2022}/forms/field.mjs +4 -4
  30. package/esm2022/forms/form.mjs +58 -0
  31. package/{esm2020 → esm2022}/forms/forms-module.mjs +81 -81
  32. package/{esm2020 → esm2022}/forms/geolocation-field.mjs +4 -4
  33. package/{esm2020 → esm2022}/forms/input-field.mjs +4 -4
  34. package/{esm2020 → esm2022}/forms/multiple-choice-field.mjs +4 -4
  35. package/{esm2020 → esm2022}/forms/range-field.mjs +4 -4
  36. package/{esm2020 → esm2022}/forms/signature-field.mjs +4 -4
  37. package/{esm2020 → esm2022}/forms/single-choice-field.mjs +4 -4
  38. package/{esm2020 → esm2022}/forms/table-field.mjs +4 -4
  39. package/{esm2020 → esm2022}/forms/text-field.mjs +4 -4
  40. package/{esm2020 → esm2022}/forms/time-field.mjs +4 -4
  41. package/{esm2020 → esm2022}/forms/video-url-field.mjs +4 -4
  42. package/{esm2020 → esm2022}/forms/warning-alert-service.mjs +4 -4
  43. package/{esm2020 → esm2022}/geolocation/geolocation-module.mjs +15 -15
  44. package/{esm2020 → esm2022}/geolocation/geolocation.mjs +4 -4
  45. package/{esm2020 → esm2022}/image/image-module.mjs +5 -5
  46. package/{esm2020 → esm2022}/image/image.mjs +4 -4
  47. package/{esm2020 → esm2022}/node-icon/node-icon-module.mjs +5 -5
  48. package/{esm2020 → esm2022}/node-icon/node-icon.mjs +4 -4
  49. package/{esm2020 → esm2022}/page-slider/page-slider-module.mjs +5 -5
  50. package/{esm2020 → esm2022}/page-slider/page-slider.mjs +4 -4
  51. package/{esm2020 → esm2022}/reports/chart-widget.mjs +4 -4
  52. package/{esm2020 → esm2022}/reports/filter-widget.mjs +4 -4
  53. package/{esm2020 → esm2022}/reports/formula-widget.mjs +4 -4
  54. package/{esm2020 → esm2022}/reports/graph-widget.mjs +4 -4
  55. package/{esm2020 → esm2022}/reports/heat-map-widget.mjs +4 -4
  56. package/{esm2020 → esm2022}/reports/image-container-widget.mjs +4 -4
  57. package/{esm2020 → esm2022}/reports/image-widget.mjs +4 -4
  58. package/{esm2020 → esm2022}/reports/map-widget.mjs +4 -4
  59. package/{esm2020 → esm2022}/reports/page-break-widget.mjs +4 -4
  60. package/{esm2020 → esm2022}/reports/report.mjs +4 -4
  61. package/{esm2020 → esm2022}/reports/reports-module.mjs +50 -50
  62. package/{esm2020 → esm2022}/reports/table-widget.mjs +4 -4
  63. package/{esm2020 → esm2022}/reports/text-widget.mjs +4 -4
  64. package/esm2022/reports/widget.mjs +368 -0
  65. package/{esm2020 → esm2022}/signature/signature-module.mjs +15 -15
  66. package/{esm2020 → esm2022}/signature/signature.mjs +4 -4
  67. package/{esm2020 → esm2022}/time/time-module.mjs +5 -5
  68. package/{esm2020 → esm2022}/time/time.mjs +4 -4
  69. package/{fesm2020 → fesm2022}/ajf-material-barcode.mjs +21 -21
  70. package/{fesm2020 → fesm2022}/ajf-material-barcode.mjs.map +1 -1
  71. package/{fesm2020 → fesm2022}/ajf-material-calendar.mjs +7 -7
  72. package/{fesm2015 → fesm2022}/ajf-material-calendar.mjs.map +1 -1
  73. package/{fesm2020 → fesm2022}/ajf-material-checkbox-group.mjs +7 -7
  74. package/{fesm2015 → fesm2022}/ajf-material-checkbox-group.mjs.map +1 -1
  75. package/{fesm2020 → fesm2022}/ajf-material-form-builder.mjs +284 -284
  76. package/fesm2022/ajf-material-form-builder.mjs.map +1 -0
  77. package/fesm2022/ajf-material-forms.mjs +1102 -0
  78. package/fesm2022/ajf-material-forms.mjs.map +1 -0
  79. package/{fesm2015 → fesm2022}/ajf-material-geolocation.mjs +17 -17
  80. package/{fesm2015 → fesm2022}/ajf-material-geolocation.mjs.map +1 -1
  81. package/{fesm2015 → fesm2022}/ajf-material-image.mjs +7 -7
  82. package/{fesm2020 → fesm2022}/ajf-material-image.mjs.map +1 -1
  83. package/{fesm2015 → fesm2022}/ajf-material-node-icon.mjs +7 -7
  84. package/{fesm2020 → fesm2022}/ajf-material-node-icon.mjs.map +1 -1
  85. package/{fesm2020 → fesm2022}/ajf-material-page-slider.mjs +7 -7
  86. package/{fesm2015 → fesm2022}/ajf-material-page-slider.mjs.map +1 -1
  87. package/{fesm2020 → fesm2022}/ajf-material-reports.mjs +135 -135
  88. package/{fesm2015 → fesm2022}/ajf-material-reports.mjs.map +1 -1
  89. package/{fesm2020 → fesm2022}/ajf-material-signature.mjs +17 -17
  90. package/{fesm2020 → fesm2022}/ajf-material-signature.mjs.map +1 -1
  91. package/{fesm2015 → fesm2022}/ajf-material-time.mjs +7 -7
  92. package/{fesm2020 → fesm2022}/ajf-material-time.mjs.map +1 -1
  93. package/form-builder/branch-line.d.ts +1 -1
  94. package/form-builder/choices-origin-data-source.d.ts +1 -1
  95. package/form-builder/choices-origin-editor.d.ts +1 -1
  96. package/form-builder/condition-editor.d.ts +1 -1
  97. package/form-builder/form-builder-service.d.ts +2 -2
  98. package/form-builder/form-builder.d.ts +1 -1
  99. package/form-builder/node-entry.d.ts +1 -1
  100. package/form-builder/node-type-entry.d.ts +1 -1
  101. package/forms/form.d.ts +1 -1
  102. package/package.json +49 -79
  103. package/esm2020/form-builder/branch-line.mjs +0 -69
  104. package/esm2020/form-builder/form-builder-service.mjs +0 -923
  105. package/esm2020/form-builder/form-builder.mjs +0 -183
  106. package/esm2020/form-builder/node-entry.mjs +0 -267
  107. package/esm2020/form-builder/node-properties.mjs +0 -1030
  108. package/esm2020/forms/form.mjs +0 -58
  109. package/esm2020/reports/widget.mjs +0 -368
  110. package/fesm2015/ajf-material-barcode.mjs +0 -170
  111. package/fesm2015/ajf-material-barcode.mjs.map +0 -1
  112. package/fesm2015/ajf-material-calendar.mjs +0 -116
  113. package/fesm2015/ajf-material-checkbox-group.mjs +0 -120
  114. package/fesm2015/ajf-material-form-builder.mjs +0 -3120
  115. package/fesm2015/ajf-material-form-builder.mjs.map +0 -1
  116. package/fesm2015/ajf-material-forms.mjs +0 -1134
  117. package/fesm2015/ajf-material-forms.mjs.map +0 -1
  118. package/fesm2015/ajf-material-image.mjs.map +0 -1
  119. package/fesm2015/ajf-material-node-icon.mjs.map +0 -1
  120. package/fesm2015/ajf-material-page-slider.mjs +0 -109
  121. package/fesm2015/ajf-material-reports.mjs +0 -943
  122. package/fesm2015/ajf-material-signature.mjs +0 -164
  123. package/fesm2015/ajf-material-signature.mjs.map +0 -1
  124. package/fesm2015/ajf-material-time.mjs.map +0 -1
  125. package/fesm2020/ajf-material-calendar.mjs.map +0 -1
  126. package/fesm2020/ajf-material-checkbox-group.mjs.map +0 -1
  127. package/fesm2020/ajf-material-form-builder.mjs.map +0 -1
  128. package/fesm2020/ajf-material-forms.mjs +0 -1102
  129. package/fesm2020/ajf-material-forms.mjs.map +0 -1
  130. package/fesm2020/ajf-material-geolocation.mjs +0 -136
  131. package/fesm2020/ajf-material-geolocation.mjs.map +0 -1
  132. package/fesm2020/ajf-material-image.mjs +0 -105
  133. package/fesm2020/ajf-material-node-icon.mjs +0 -149
  134. package/fesm2020/ajf-material-page-slider.mjs.map +0 -1
  135. package/fesm2020/ajf-material-reports.mjs.map +0 -1
  136. package/fesm2020/ajf-material-time.mjs +0 -111
  137. package/fesm2020/ajf-material.mjs +0 -28
  138. package/fesm2020/ajf-material.mjs.map +0 -1
  139. /package/{esm2020 → esm2022}/ajf-material.mjs +0 -0
  140. /package/{esm2020 → esm2022}/barcode/ajf-material-barcode.mjs +0 -0
  141. /package/{esm2020 → esm2022}/barcode/public_api.mjs +0 -0
  142. /package/{esm2020 → esm2022}/calendar/ajf-material-calendar.mjs +0 -0
  143. /package/{esm2020 → esm2022}/calendar/public_api.mjs +0 -0
  144. /package/{esm2020 → esm2022}/checkbox-group/ajf-material-checkbox-group.mjs +0 -0
  145. /package/{esm2020 → esm2022}/checkbox-group/public_api.mjs +0 -0
  146. /package/{esm2020 → esm2022}/form-builder/ajf-material-form-builder.mjs +0 -0
  147. /package/{esm2020 → esm2022}/form-builder/choices-origin-data-source.mjs +0 -0
  148. /package/{esm2020 → esm2022}/form-builder/form-builder-utils.mjs +0 -0
  149. /package/{esm2020 → esm2022}/form-builder/operations.mjs +0 -0
  150. /package/{esm2020 → esm2022}/form-builder/public_api.mjs +0 -0
  151. /package/{esm2020 → esm2022}/forms/ajf-material-forms.mjs +0 -0
  152. /package/{esm2020 → esm2022}/forms/public_api.mjs +0 -0
  153. /package/{esm2020 → esm2022}/geolocation/ajf-material-geolocation.mjs +0 -0
  154. /package/{esm2020 → esm2022}/geolocation/public_api.mjs +0 -0
  155. /package/{esm2020 → esm2022}/image/ajf-material-image.mjs +0 -0
  156. /package/{esm2020 → esm2022}/image/public_api.mjs +0 -0
  157. /package/{esm2020 → esm2022}/node-icon/ajf-material-node-icon.mjs +0 -0
  158. /package/{esm2020 → esm2022}/node-icon/public_api.mjs +0 -0
  159. /package/{esm2020 → esm2022}/page-slider/ajf-material-page-slider.mjs +0 -0
  160. /package/{esm2020 → esm2022}/page-slider/public_api.mjs +0 -0
  161. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  162. /package/{esm2020 → esm2022}/reports/ajf-material-reports.mjs +0 -0
  163. /package/{esm2020 → esm2022}/reports/public_api.mjs +0 -0
  164. /package/{esm2020 → esm2022}/signature/ajf-material-signature.mjs +0 -0
  165. /package/{esm2020 → esm2022}/signature/public_api.mjs +0 -0
  166. /package/{esm2020 → esm2022}/time/ajf-material-time.mjs +0 -0
  167. /package/{esm2020 → esm2022}/time/public_api.mjs +0 -0
  168. /package/{fesm2015 → fesm2022}/ajf-material.mjs +0 -0
  169. /package/{fesm2015 → fesm2022}/ajf-material.mjs.map +0 -0
@@ -1,183 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, ViewChild, ViewEncapsulation, } from '@angular/core';
2
- import { Subscription } from 'rxjs';
3
- import { sample } from 'rxjs/operators';
4
- import { AjfFbChoicesOriginEditorDialog } from './choices-origin-editor-dialog';
5
- import { AjfFbConditionEditorDialog } from './condition-editor-dialog';
6
- import { disableFieldDropPredicate, onDropProcess } from './form-builder-utils';
7
- import { AjfFbStringIdentifierDialogComponent } from './string-identifier-dialog';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "./form-builder-service";
10
- import * as i2 from "@angular/material/dialog";
11
- import * as i3 from "@angular/common";
12
- import * as i4 from "@angular/cdk/drag-drop";
13
- import * as i5 from "@angular/material/button";
14
- import * as i6 from "@angular/material/icon";
15
- import * as i7 from "@angular/material/menu";
16
- import * as i8 from "@angular/material/sidenav";
17
- import * as i9 from "@angular/material/toolbar";
18
- import * as i10 from "@angular/material/tooltip";
19
- import * as i11 from "@angular/material/slide-toggle";
20
- import * as i12 from "./node-entry";
21
- import * as i13 from "./node-properties";
22
- import * as i14 from "./node-type-entry";
23
- import * as i15 from "@ngneat/transloco";
24
- export class AjfFormBuilder {
25
- constructor(_service, _dialog) {
26
- this._service = _service;
27
- this._dialog = _dialog;
28
- /**
29
- * The list of the ids of all the dropLists connected to the formbuilder source list.
30
- */
31
- this._connectedDropLists = this._service.connectedDropLists;
32
- this._vc = new EventEmitter();
33
- this._init = false;
34
- this._editConditionSub = Subscription.EMPTY;
35
- this._editConditionDialog = null;
36
- this._beforeNodesUpdateSub = Subscription.EMPTY;
37
- this._editChoicesOriginSub = Subscription.EMPTY;
38
- this._editChoicesOriginDialog = null;
39
- this._stringIdentifierDialog = null;
40
- this._stringIdentifierSub = Subscription.EMPTY;
41
- this._lastScrollTop = 0;
42
- this._nodeTypes = _service.availableNodeTypes;
43
- this._nodeEntriesTree = _service.nodeEntriesTree;
44
- this._choicesOrigins = _service.choicesOrigins;
45
- this._editConditionSub = this._service.editedCondition.subscribe((condition) => {
46
- if (this._editConditionDialog != null) {
47
- this._editConditionDialog.close();
48
- this._editConditionDialog = null;
49
- }
50
- if (condition != null) {
51
- this._editConditionDialog = this._dialog.open(AjfFbConditionEditorDialog, {
52
- disableClose: true,
53
- });
54
- }
55
- });
56
- this._editChoicesOriginSub = this._service.editedChoicesOrigin.subscribe((choicesOrigin) => {
57
- if (this._editChoicesOriginDialog != null) {
58
- this._editChoicesOriginDialog.close();
59
- this._editChoicesOriginDialog = null;
60
- }
61
- if (choicesOrigin != null) {
62
- this._editChoicesOriginDialog = this._dialog.open(AjfFbChoicesOriginEditorDialog, {
63
- disableClose: true,
64
- });
65
- }
66
- });
67
- this._beforeNodesUpdateSub = this._service.beforeNodesUpdate.subscribe(() => {
68
- if (this.designerCont == null) {
69
- return;
70
- }
71
- this._lastScrollTop = this.designerCont.nativeElement.scrollTop;
72
- });
73
- this.nodeEntriesTree.pipe(sample(this._vc)).subscribe(() => {
74
- if (this.designerCont == null) {
75
- return;
76
- }
77
- this.designerCont.nativeElement.scrollTop = this._lastScrollTop;
78
- });
79
- this._stringIdentifierSub = this._service.stringIdentifier.subscribe(() => { });
80
- }
81
- get form() {
82
- return this._form;
83
- }
84
- set form(form) {
85
- if (this._form !== form) {
86
- this._form = form;
87
- if (this._init) {
88
- this._setCurrentForm();
89
- }
90
- }
91
- }
92
- get nodeTypes() {
93
- return this._nodeTypes;
94
- }
95
- get nodeEntriesTree() {
96
- return this._nodeEntriesTree;
97
- }
98
- get choicesOrigins() {
99
- return this._choicesOrigins;
100
- }
101
- get connectedDropLists() {
102
- return this._connectedDropLists;
103
- }
104
- ngAfterViewChecked() {
105
- this._vc.emit();
106
- }
107
- ngAfterContentInit() {
108
- this._setCurrentForm();
109
- this._init = true;
110
- }
111
- ngOnDestroy() {
112
- this._editConditionSub.unsubscribe();
113
- this._beforeNodesUpdateSub.unsubscribe();
114
- this._editChoicesOriginSub.unsubscribe();
115
- this._stringIdentifierSub.unsubscribe();
116
- this._service.setForm(null);
117
- this._service.resetNodeEntriesTreeExpandedStatus();
118
- this._service.resetEmptyCounters();
119
- }
120
- createChoicesOrigin() {
121
- this._service.createChoicesOrigin();
122
- }
123
- disableDrop() {
124
- return false;
125
- }
126
- disableFieldDrop(item) {
127
- return disableFieldDropPredicate(item);
128
- }
129
- /**
130
- * Triggers when a field or slide node is moved or inserted by drag&dropping in the formbuilder.
131
- * @param event The drop event.
132
- * @param content True if the current nodeEntry contains other nodeEntries.
133
- */
134
- onDrop(event, content = false) {
135
- onDropProcess(event, this._service, null, content);
136
- }
137
- editChoicesOrigin(choicesOrigin) {
138
- this._service.editChoicesOrigin(choicesOrigin);
139
- }
140
- editStringIdentifier() {
141
- if (this._stringIdentifierDialog != null) {
142
- this._stringIdentifierDialog.close();
143
- this._stringIdentifierDialog = null;
144
- }
145
- this._stringIdentifierDialog = this._dialog.open(AjfFbStringIdentifierDialogComponent, {
146
- disableClose: true,
147
- width: '60%',
148
- height: '60%',
149
- });
150
- }
151
- expandAll() {
152
- this._service.expandAll();
153
- }
154
- collapseAll() {
155
- this._service.collapseAll();
156
- }
157
- expandToggle(evt) {
158
- if (evt.checked) {
159
- this.expandAll();
160
- }
161
- else {
162
- this.collapseAll();
163
- }
164
- }
165
- _setCurrentForm() {
166
- if (this._form == null) {
167
- return;
168
- }
169
- this._service.setForm(this._form);
170
- }
171
- }
172
- AjfFormBuilder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AjfFormBuilder, deps: [{ token: i1.AjfFormBuilderService }, { token: i2.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
173
- AjfFormBuilder.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: AjfFormBuilder, selector: "ajf-form-builder", inputs: { form: "form" }, viewQueries: [{ propertyName: "designerCont", first: true, predicate: ["designer"], descendants: true, static: true }], ngImport: i0, template: "<mat-toolbar class=\"ajf-formbuilder-toolbar\">\n <button mat-icon-button (click)=\"leftSidenav.toggle()\">\n <mat-icon>add_box</mat-icon>\n </button>\n <button mat-button [matMenuTriggerFor]=\"choicesMenu\">{{'Choices'|transloco}}</button>\n <button mat-button (click)=\"editStringIdentifier()\">{{'Identifier'|transloco}}</button>\n <button mat-icon-button aria-label=\"Collapsed\" matTooltip=\"Keep slides collapsed\">\n <mat-icon>unfold_less</mat-icon>\n </button>\n <mat-slide-toggle color=\"primary\" (change)=\"expandToggle($event)\"></mat-slide-toggle>\n <button mat-icon-button aria-label=\"Expanded\" matTooltip=\"Keep slides expanded\">\n <mat-icon>unfold_more</mat-icon>\n </button>\n <mat-menu #choicesMenu>\n <button (click)=\"createChoicesOrigin()\" mat-menu-item>{{'New..'|transloco}}</button>\n <ng-container *ngIf=\"choicesOrigins|async as cos\">\n <button\n *ngFor=\"let choicesOrigin of cos\"\n (click)=\"editChoicesOrigin(choicesOrigin)\"\n mat-menu-item\n >\n {{ (choicesOrigin.label || choicesOrigin.name)| transloco }}\n </button>\n </ng-container>\n </mat-menu>\n <span class=\"ajf-spacer\"></span>\n</mat-toolbar>\n<div class=\"ajf-formtree-container\">\n <mat-drawer-container cdkDropListGroup class=\"ajf-formtree-drawer-container\">\n <mat-drawer #leftSidenav position=\"start\" mode=\"over\">\n <div\n #sourceDropList\n cdkDropList\n [cdkDropListConnectedTo]=\"(connectedDropLists|async)!\"\n [cdkDropListEnterPredicate]=\"disableDrop\"\n [cdkDropListData]=\"nodeTypes\"\n >\n <ajf-fb-node-type-entry\n *ngFor=\"let nodeType of nodeTypes\"\n cdkDrag\n [cdkDragData]=\"nodeType\"\n (cdkDragStarted)=\"leftSidenav.close()\"\n [nodeType]=\"nodeType\"\n ></ajf-fb-node-type-entry>\n </div>\n </mat-drawer>\n <div #designer class=\"ajf-designer\">\n <ajf-fb-node-entry\n id=\"slides-list\"\n cdkDropList\n (cdkDropListDropped)=\"onDrop($event)\"\n [cdkDropListEnterPredicate]=\"disableFieldDrop\"\n *ngFor=\"let nodeEntry of (nodeEntriesTree|async); let isFirst = first\"\n [isFirst]=\"isFirst\"\n [nodeEntry]=\"nodeEntry\"\n ></ajf-fb-node-entry>\n </div>\n </mat-drawer-container>\n <div class=\"ajf-formtree-properties\" #rightSidenav position=\"end\" mode=\"side\">\n <ajf-fb-node-properties></ajf-fb-node-properties>\n </div>\n</div>\n", styles: ["ajf-form-builder{display:flex;position:relative;min-height:300px;flex-direction:column;align-items:stretch}ajf-form-builder mat-toolbar.ajf-formbuilder-toolbar{position:sticky;top:0;z-index:2;padding:2px 0}ajf-form-builder mat-toolbar.ajf-formbuilder-toolbar mat-menu div[mat-menu-item]>button[mat-button]{flex:1 0 auto}ajf-form-builder mat-toolbar.ajf-formbuilder-toolbar mat-menu div[mat-menu-item]>button[mat-icon-button]{flex:0 0 auto}ajf-form-builder .ajf-formtree-container{display:flex;flex-flow:row;align-items:start;justify-content:space-between}ajf-form-builder .ajf-formtree-container mat-drawer-container.ajf-formtree-drawer-container{flex:1 0 auto;min-height:50vh}ajf-form-builder .ajf-formtree-container mat-drawer-container.ajf-formtree-drawer-container mat-drawer{max-width:20%}ajf-form-builder .ajf-formtree-container mat-drawer-container.ajf-formtree-drawer-container .ajf-designer{padding:2}ajf-form-builder .ajf-formtree-container mat-drawer-container.ajf-formtree-drawer-container .mat-expansion-panel-body{padding:10px}ajf-form-builder .ajf-formtree-container .ajf-formtree-properties{flex:0 1 auto;max-width:20%;max-height:60vh;overflow-y:auto;position:sticky;top:32px}ajf-form-builder mat-toolbar .ajf-spacer{flex:1 1 auto}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i4.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i4.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i8.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: i8.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i9.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i11.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i12.AjfFbNodeEntry, selector: "ajf-fb-node-entry", inputs: ["isFirst", "nodeEntry", "level", "isDraggable", "originOffset", "firstBranchColor"] }, { kind: "component", type: i13.AjfFbNodeProperties, selector: "ajf-fb-node-properties" }, { kind: "component", type: i14.AjfFbNodeTypeEntry, selector: "ajf-fb-node-type-entry", inputs: ["nodeType"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i15.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
174
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AjfFormBuilder, decorators: [{
175
- type: Component,
176
- args: [{ selector: 'ajf-form-builder', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<mat-toolbar class=\"ajf-formbuilder-toolbar\">\n <button mat-icon-button (click)=\"leftSidenav.toggle()\">\n <mat-icon>add_box</mat-icon>\n </button>\n <button mat-button [matMenuTriggerFor]=\"choicesMenu\">{{'Choices'|transloco}}</button>\n <button mat-button (click)=\"editStringIdentifier()\">{{'Identifier'|transloco}}</button>\n <button mat-icon-button aria-label=\"Collapsed\" matTooltip=\"Keep slides collapsed\">\n <mat-icon>unfold_less</mat-icon>\n </button>\n <mat-slide-toggle color=\"primary\" (change)=\"expandToggle($event)\"></mat-slide-toggle>\n <button mat-icon-button aria-label=\"Expanded\" matTooltip=\"Keep slides expanded\">\n <mat-icon>unfold_more</mat-icon>\n </button>\n <mat-menu #choicesMenu>\n <button (click)=\"createChoicesOrigin()\" mat-menu-item>{{'New..'|transloco}}</button>\n <ng-container *ngIf=\"choicesOrigins|async as cos\">\n <button\n *ngFor=\"let choicesOrigin of cos\"\n (click)=\"editChoicesOrigin(choicesOrigin)\"\n mat-menu-item\n >\n {{ (choicesOrigin.label || choicesOrigin.name)| transloco }}\n </button>\n </ng-container>\n </mat-menu>\n <span class=\"ajf-spacer\"></span>\n</mat-toolbar>\n<div class=\"ajf-formtree-container\">\n <mat-drawer-container cdkDropListGroup class=\"ajf-formtree-drawer-container\">\n <mat-drawer #leftSidenav position=\"start\" mode=\"over\">\n <div\n #sourceDropList\n cdkDropList\n [cdkDropListConnectedTo]=\"(connectedDropLists|async)!\"\n [cdkDropListEnterPredicate]=\"disableDrop\"\n [cdkDropListData]=\"nodeTypes\"\n >\n <ajf-fb-node-type-entry\n *ngFor=\"let nodeType of nodeTypes\"\n cdkDrag\n [cdkDragData]=\"nodeType\"\n (cdkDragStarted)=\"leftSidenav.close()\"\n [nodeType]=\"nodeType\"\n ></ajf-fb-node-type-entry>\n </div>\n </mat-drawer>\n <div #designer class=\"ajf-designer\">\n <ajf-fb-node-entry\n id=\"slides-list\"\n cdkDropList\n (cdkDropListDropped)=\"onDrop($event)\"\n [cdkDropListEnterPredicate]=\"disableFieldDrop\"\n *ngFor=\"let nodeEntry of (nodeEntriesTree|async); let isFirst = first\"\n [isFirst]=\"isFirst\"\n [nodeEntry]=\"nodeEntry\"\n ></ajf-fb-node-entry>\n </div>\n </mat-drawer-container>\n <div class=\"ajf-formtree-properties\" #rightSidenav position=\"end\" mode=\"side\">\n <ajf-fb-node-properties></ajf-fb-node-properties>\n </div>\n</div>\n", styles: ["ajf-form-builder{display:flex;position:relative;min-height:300px;flex-direction:column;align-items:stretch}ajf-form-builder mat-toolbar.ajf-formbuilder-toolbar{position:sticky;top:0;z-index:2;padding:2px 0}ajf-form-builder mat-toolbar.ajf-formbuilder-toolbar mat-menu div[mat-menu-item]>button[mat-button]{flex:1 0 auto}ajf-form-builder mat-toolbar.ajf-formbuilder-toolbar mat-menu div[mat-menu-item]>button[mat-icon-button]{flex:0 0 auto}ajf-form-builder .ajf-formtree-container{display:flex;flex-flow:row;align-items:start;justify-content:space-between}ajf-form-builder .ajf-formtree-container mat-drawer-container.ajf-formtree-drawer-container{flex:1 0 auto;min-height:50vh}ajf-form-builder .ajf-formtree-container mat-drawer-container.ajf-formtree-drawer-container mat-drawer{max-width:20%}ajf-form-builder .ajf-formtree-container mat-drawer-container.ajf-formtree-drawer-container .ajf-designer{padding:2}ajf-form-builder .ajf-formtree-container mat-drawer-container.ajf-formtree-drawer-container .mat-expansion-panel-body{padding:10px}ajf-form-builder .ajf-formtree-container .ajf-formtree-properties{flex:0 1 auto;max-width:20%;max-height:60vh;overflow-y:auto;position:sticky;top:32px}ajf-form-builder mat-toolbar .ajf-spacer{flex:1 1 auto}\n"] }]
177
- }], ctorParameters: function () { return [{ type: i1.AjfFormBuilderService }, { type: i2.MatDialog }]; }, propDecorators: { designerCont: [{
178
- type: ViewChild,
179
- args: ['designer', { static: true }]
180
- }], form: [{
181
- type: Input
182
- }] } });
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvZm9ybS1idWlsZGVyL3NyYy9mb3JtLWJ1aWxkZXIudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9mb3JtLWJ1aWxkZXIvc3JjL2Zvcm0tYnVpbGRlci5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXlCQSxPQUFPLEVBR0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFhLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEMsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUUsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFNckUsT0FBTyxFQUFDLHlCQUF5QixFQUFFLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlFLE9BQU8sRUFBQyxvQ0FBb0MsRUFBQyxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVNoRixNQUFNLE9BQU8sY0FBYztJQXFEekIsWUFBb0IsUUFBK0IsRUFBVSxPQUFrQjtRQUEzRCxhQUFRLEdBQVIsUUFBUSxDQUF1QjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFyQi9FOztXQUVHO1FBQ0ssd0JBQW1CLEdBQXlCLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUM7UUFLN0UsUUFBRyxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBRW5ELFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxzQkFBaUIsR0FBaUIsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUNyRCx5QkFBb0IsR0FBb0QsSUFBSSxD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U0FDcEI7SUFDSCxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3RCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDOzsyR0FyTFUsY0FBYzsrRkFBZCxjQUFjLDBNQzNEM0IsKzlFQThEQTsyRkRIYSxjQUFjO2tCQVAxQixTQUFTOytCQUNFLGtCQUFrQixtQkFHWCx1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJO29JQUdFLFlBQVk7c0JBQWxELFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFPakMsSUFBSTtzQkFEUCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChDKSBHbnVjb29wIHNvYy4gY29vcC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzXG4gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSxcbiAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKiBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLlxuICpcbiAqL1xuXG5pbXBvcnQge0FqZkNob2ljZXNPcmlnaW4sIEFqZkZvcm19IGZyb20gJ0BhamYvY29yZS9mb3Jtcyc7XG5pbXBvcnQge0FqZkNvbmRpdGlvbn0gZnJvbSAnQGFqZi9jb3JlL21vZGVscyc7XG5pbXBvcnQge0Nka0RyYWcsIENka0RyYWdEcm9wfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdERpYWxvZywgTWF0RGlhbG9nUmVmfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHtNYXRTbGlkZVRvZ2dsZUNoYW5nZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7c2FtcGxlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7QWpmRmJDaG9pY2VzT3JpZ2luRWRpdG9yRGlhbG9nfSBmcm9tICcuL2Nob2ljZXMtb3JpZ2luLWVkaXRvci1kaWFsb2cnO1xuaW1wb3J0IHtBamZGYkNvbmRpdGlvbkVkaXRvckRpYWxvZ30gZnJvbSAnLi9jb25kaXRpb24tZWRpdG9yLWRpYWxvZyc7XG5pbXBvcnQge1xuICBBamZGb3JtQnVpbGRlck5vZGVFbnRyeSxcbiAgQWpmRm9ybUJ1aWxkZXJOb2RlVHlwZUVudHJ5LFxuICBBamZGb3JtQnVpbGRlclNlcnZpY2UsXG59IGZyb20gJy4vZm9ybS1idWlsZGVyLXNlcnZpY2UnO1xuaW1wb3J0IHtkaXNhYmxlRmllbGREcm9wUHJlZGljYXRlLCBvbkRyb3BQcm9jZXNzfSBmcm9tICcuL2Zvcm0tYnVpbGRlci11dGlscyc7XG5pbXBvcnQge0FqZkZiU3RyaW5nSWRlbnRpZmllckRpYWxvZ0NvbXBvbmVudH0gZnJvbSAnLi9zdHJpbmctaWRlbnRpZmllci1kaWFsb2cnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhamYtZm9ybS1idWlsZGVyJyxcbiAgdGVtcGxhdGVVcmw6ICdmb3JtLWJ1aWxkZXIuaHRtbCcsXG4gIHN0eWxlVXJsczogWydmb3JtLWJ1aWxkZXIuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQWpmRm9ybUJ1aWxkZXIgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdkZXNpZ25lcicsIHtzdGF0aWM6IHRydWV9KSBkZXNpZ25lckNvbnQhOiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgX2Zvcm06IEFqZkZvcm0gfCB1bmRlZmluZWQ7XG4gIGdldCBmb3JtKCk6IEFqZkZvcm0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBmb3JtKGZvcm06IEFqZkZvcm0gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodGhpcy5fZm9ybSAhPT0gZm9ybSkge1xuICAgICAgdGhpcy5fZm9ybSA9IGZvcm07XG4gICAgICBpZiAodGhpcy5faW5pdCkge1xuICAgICAgICB0aGlzLl9zZXRDdXJyZW50Rm9ybSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX25vZGVUeXBlczogQWpmRm9ybUJ1aWxkZXJOb2RlVHlwZUVudHJ5W107XG4gIGdldCBub2RlVHlwZXMoKTogQWpmRm9ybUJ1aWxkZXJOb2RlVHlwZUVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLl9ub2RlVHlwZXM7XG4gIH1cblxuICBwcml2YXRlIF9ub2RlRW50cmllc1RyZWU6IE9ic2VydmFibGU8QWpmRm9ybUJ1aWxkZXJOb2RlRW50cnlbXT47XG4gIGdldCBub2RlRW50cmllc1RyZWUoKTogT2JzZXJ2YWJsZTxBamZGb3JtQnVpbGRlck5vZGVFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuX25vZGVFbnRyaWVzVHJlZTtcbiAgfVxuXG4gIHByaXZhdGUgX2Nob2ljZXNPcmlnaW5zOiBPYnNlcnZhYmxlPEFqZkNob2ljZXNPcmlnaW48YW55PltdPjtcbiAgZ2V0IGNob2ljZXNPcmlnaW5zKCk6IE9ic2VydmFibGU8QWpmQ2hvaWNlc09yaWdpbjxhbnk+W10+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hvaWNlc09yaWdpbnM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgdGhlIGlkcyBvZiBhbGwgdGhlIGRyb3BMaXN0cyBjb25uZWN0ZWQgdG8gdGhlIGZvcm1idWlsZGVyIHNvdXJjZSBsaXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBfY29ubmVjdGVkRHJvcExpc3RzOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiA9IHRoaXMuX3NlcnZpY2UuY29ubmVjdGVkRHJvcExpc3RzO1xuICBnZXQgY29ubmVjdGVkRHJvcExpc3RzKCk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGVkRHJvcExpc3RzO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmM6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIF9pbml0ID0gZmFsc2U7XG4gIHByaXZhdGUgX2VkaXRDb25kaXRpb25TdWI6IFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgcHJpdmF0ZSBfZWRpdENvbmRpdGlvbkRpYWxvZzogTWF0RGlhbG9nUmVmPEFqZkZiQ29uZGl0aW9uRWRpdG9yRGlhbG9nPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9iZWZvcmVOb2Rlc1VwZGF0ZVN1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9lZGl0Q2hvaWNlc09yaWdpblN1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9lZGl0Q2hvaWNlc09yaWdpbkRpYWxvZzogTWF0RGlhbG9nUmVmPEFqZkZiQ2hvaWNlc09yaWdpbkVkaXRvckRpYWxvZz4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3RyaW5nSWRlbnRpZmllckRpYWxvZzogTWF0RGlhbG9nUmVmPEFqZkZiU3RyaW5nSWRlbnRpZmllckRpYWxvZ0NvbXBvbmVudD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3RyaW5nSWRlbnRpZmllclN1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIHByaXZhdGUgX2xhc3RTY3JvbGxUb3A6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc2VydmljZTogQWpmRm9ybUJ1aWxkZXJTZXJ2aWNlLCBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZykge1xuICAgIHRoaXMuX25vZGVUeXBlcyA9IF9zZXJ2aWNlLmF2YWlsYWJsZU5vZGVUeXBlcztcbiAgICB0aGlzLl9ub2RlRW50cmllc1RyZWUgPSBfc2VydmljZS5ub2RlRW50cmllc1RyZWU7XG4gICAgdGhpcy5fY2hvaWNlc09yaWdpbnMgPSBfc2VydmljZS5jaG9pY2VzT3JpZ2lucztcbiAgICB0aGlzLl9lZGl0Q29uZGl0aW9uU3ViID0gdGhpcy5fc2VydmljZS5lZGl0ZWRDb25kaXRpb24uc3Vic2NyaWJlKFxuICAgICAgKGNvbmRpdGlvbjogQWpmQ29uZGl0aW9uIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fZWRpdENvbmRpdGlvbkRpYWxvZyAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fZWRpdENvbmRpdGlvbkRpYWxvZy5jbG9zZSgpO1xuICAgICAgICAgIHRoaXMuX2VkaXRDb25kaXRpb25EaWFsb2cgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX2VkaXRDb25kaXRpb25EaWFsb2cgPSB0aGlzLl9kaWFsb2cub3BlbihBamZGYkNvbmRpdGlvbkVkaXRvckRpYWxvZywge1xuICAgICAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5fZWRpdENob2ljZXNPcmlnaW5TdWIgPSB0aGlzLl9zZXJ2aWNlLmVkaXRlZENob2ljZXNPcmlnaW4uc3Vic2NyaWJlKFxuICAgICAgKGNob2ljZXNPcmlnaW46IEFqZkNob2ljZXNPcmlnaW48YW55PiB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2VkaXRDaG9pY2VzT3JpZ2luRGlhbG9nICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9lZGl0Q2hvaWNlc09yaWdpbkRpYWxvZy5jbG9zZSgpO1xuICAgICAgICAgIHRoaXMuX2VkaXRDaG9pY2VzT3JpZ2luRGlhbG9nID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hvaWNlc09yaWdpbiAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fZWRpdENob2ljZXNPcmlnaW5EaWFsb2cgPSB0aGlzLl9kaWFsb2cub3BlbihBamZGYkNob2ljZXNPcmlnaW5FZGl0b3JEaWFsb2csIHtcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5fYmVmb3JlTm9kZXNVcGRhdGVTdWIgPSB0aGlzLl9zZXJ2aWNlLmJlZm9yZU5vZGVzVXBkYXRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXNpZ25lckNvbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9sYXN0U2Nyb2xsVG9wID0gdGhpcy5kZXNpZ25lckNvbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgfSk7XG5cbiAgICB0aGlzLm5vZGVFbnRyaWVzVHJlZS5waXBlKHNhbXBsZSg8T2JzZXJ2YWJsZTx2b2lkPj50aGlzLl92YykpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXNpZ25lckNvbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmRlc2lnbmVyQ29udC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMuX2xhc3RTY3JvbGxUb3A7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9zdHJpbmdJZGVudGlmaWVyU3ViID0gdGhpcy5fc2VydmljZS5zdHJpbmdJZGVudGlmaWVyLnN1YnNjcmliZSgoKSA9PiB7fSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5fdmMuZW1pdCgpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3NldEN1cnJlbnRGb3JtKCk7XG4gICAgdGhpcy5faW5pdCA9IHRydWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0Q29uZGl0aW9uU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fYmVmb3JlTm9kZXNVcGRhdGVTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9lZGl0Q2hvaWNlc09yaWdpblN1Yi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3N0cmluZ0lkZW50aWZpZXJTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9zZXJ2aWNlLnNldEZvcm0obnVsbCk7XG4gICAgdGhpcy5fc2VydmljZS5yZXNldE5vZGVFbnRyaWVzVHJlZUV4cGFuZGVkU3RhdHVzKCk7XG4gICAgdGhpcy5fc2VydmljZS5yZXNldEVtcHR5Q291bnRlcnMoKTtcbiAgfVxuXG4gIGNyZWF0ZUNob2ljZXNPcmlnaW4oKTogdm9pZCB7XG4gICAgdGhpcy5fc2VydmljZS5jcmVhdGVDaG9pY2VzT3JpZ2luKCk7XG4gIH1cblxuICBkaXNhYmxlRHJvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBkaXNhYmxlRmllbGREcm9wKGl0ZW06IENka0RyYWc8QWpmRm9ybUJ1aWxkZXJOb2RlVHlwZUVudHJ5Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkaXNhYmxlRmllbGREcm9wUHJlZGljYXRlKGl0ZW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHdoZW4gYSBmaWVsZCBvciBzbGlkZSBub2RlIGlzIG1vdmVkIG9yIGluc2VydGVkIGJ5IGRyYWcmZHJvcHBpbmcgaW4gdGhlIGZvcm1idWlsZGVyLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGRyb3AgZXZlbnQuXG4gICAqIEBwYXJhbSBjb250ZW50IFRydWUgaWYgdGhlIGN1cnJlbnQgbm9kZUVudHJ5IGNvbnRhaW5zIG90aGVyIG5vZGVFbnRyaWVzLlxuICAgKi9cbiAgb25Ecm9wKFxuICAgIGV2ZW50OiBDZGtEcmFnRHJvcDxBamZGb3JtQnVpbGRlck5vZGVFbnRyeT4gfCBDZGtEcmFnRHJvcDxBamZGb3JtQnVpbGRlck5vZGVUeXBlRW50cnk+LFxuICAgIGNvbnRlbnQgPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgb25Ecm9wUHJvY2VzcyhldmVudCwgdGhpcy5fc2VydmljZSwgbnVsbCwgY29udGVudCk7XG4gIH1cblxuICBlZGl0Q2hvaWNlc09yaWdpbihjaG9pY2VzT3JpZ2luOiBBamZDaG9pY2VzT3JpZ2luPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLl9zZXJ2aWNlLmVkaXRDaG9pY2VzT3JpZ2luKGNob2ljZXNPcmlnaW4pO1xuICB9XG5cbiAgZWRpdFN0cmluZ0lkZW50aWZpZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N0cmluZ0lkZW50aWZpZXJEaWFsb2cgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fc3RyaW5nSWRlbnRpZmllckRpYWxvZy5jbG9zZSgpO1xuICAgICAgdGhpcy5fc3RyaW5nSWRlbnRpZmllckRpYWxvZyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX3N0cmluZ0lkZW50aWZpZXJEaWFsb2cgPSB0aGlzLl9kaWFsb2cub3BlbihBamZGYlN0cmluZ0lkZW50aWZpZXJEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgIHdpZHRoOiAnNjAlJyxcbiAgICAgIGhlaWdodDogJzYwJScsXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRBbGwoKSB7XG4gICAgdGhpcy5fc2VydmljZS5leHBhbmRBbGwoKTtcbiAgfVxuXG4gIGNvbGxhcHNlQWxsKCkge1xuICAgIHRoaXMuX3NlcnZpY2UuY29sbGFwc2VBbGwoKTtcbiAgfVxuXG4gIGV4cGFuZFRvZ2dsZShldnQ6IE1hdFNsaWRlVG9nZ2xlQ2hhbmdlKSB7XG4gICAgaWYgKGV2dC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbGxhcHNlQWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q3VycmVudEZvcm0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2Zvcm0gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXJ2aWNlLnNldEZvcm0odGhpcy5fZm9ybSk7XG4gIH1cbn1cbiIsIjxtYXQtdG9vbGJhciBjbGFzcz1cImFqZi1mb3JtYnVpbGRlci10b29sYmFyXCI+XG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJsZWZ0U2lkZW5hdi50b2dnbGUoKVwiPlxuICAgIDxtYXQtaWNvbj5hZGRfYm94PC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG4gIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY2hvaWNlc01lbnVcIj57eydDaG9pY2VzJ3x0cmFuc2xvY299fTwvYnV0dG9uPlxuICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cImVkaXRTdHJpbmdJZGVudGlmaWVyKClcIj57eydJZGVudGlmaWVyJ3x0cmFuc2xvY299fTwvYnV0dG9uPlxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBhcmlhLWxhYmVsPVwiQ29sbGFwc2VkXCIgbWF0VG9vbHRpcD1cIktlZXAgc2xpZGVzIGNvbGxhcHNlZFwiPlxuICAgIDxtYXQtaWNvbj51bmZvbGRfbGVzczwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuICA8bWF0LXNsaWRlLXRvZ2dsZSBjb2xvcj1cInByaW1hcnlcIiAoY2hhbmdlKT1cImV4cGFuZFRvZ2dsZSgkZXZlbnQpXCI+PC9tYXQtc2xpZGUtdG9nZ2xlPlxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBhcmlhLWxhYmVsPVwiRXhwYW5kZWRcIiBtYXRUb29sdGlwPVwiS2VlcCBzbGlkZXMgZXhwYW5kZWRcIj5cbiAgICA8bWF0LWljb24+dW5mb2xkX21vcmU8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbiAgPG1hdC1tZW51ICNjaG9pY2VzTWVudT5cbiAgICA8YnV0dG9uIChjbGljayk9XCJjcmVhdGVDaG9pY2VzT3JpZ2luKClcIiBtYXQtbWVudS1pdGVtPnt7J05ldy4uJ3x0cmFuc2xvY299fTwvYnV0dG9uPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VzT3JpZ2luc3xhc3luYyBhcyBjb3NcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nRm9yPVwibGV0IGNob2ljZXNPcmlnaW4gb2YgY29zXCJcbiAgICAgICAgKGNsaWNrKT1cImVkaXRDaG9pY2VzT3JpZ2luKGNob2ljZXNPcmlnaW4pXCJcbiAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgPlxuICAgICAgICB7eyAoY2hvaWNlc09yaWdpbi5sYWJlbCB8fCBjaG9pY2VzT3JpZ2luLm5hbWUpfCB0cmFuc2xvY28gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L21hdC1tZW51PlxuICA8c3BhbiBjbGFzcz1cImFqZi1zcGFjZXJcIj48L3NwYW4+XG48L21hdC10b29sYmFyPlxuPGRpdiBjbGFzcz1cImFqZi1mb3JtdHJlZS1jb250YWluZXJcIj5cbiAgPG1hdC1kcmF3ZXItY29udGFpbmVyIGNka0Ryb3BMaXN0R3JvdXAgY2xhc3M9XCJhamYtZm9ybXRyZWUtZHJhd2VyLWNvbnRhaW5lclwiPlxuICAgIDxtYXQtZHJhd2VyICNsZWZ0U2lkZW5hdiBwb3NpdGlvbj1cInN0YXJ0XCIgbW9kZT1cIm92ZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgI3NvdXJjZURyb3BMaXN0XG4gICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgIFtjZGtEcm9wTGlzdENvbm5lY3RlZFRvXT1cIihjb25uZWN0ZWREcm9wTGlzdHN8YXN5bmMpIVwiXG4gICAgICAgIFtjZGtEcm9wTGlzdEVudGVyUHJlZGljYXRlXT1cImRpc2FibGVEcm9wXCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJub2RlVHlwZXNcIlxuICAgICAgPlxuICAgICAgICA8YWpmLWZiLW5vZGUtdHlwZS1lbnRyeVxuICAgICAgICAgICpuZ0Zvcj1cImxldCBub2RlVHlwZSBvZiBub2RlVHlwZXNcIlxuICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwibm9kZVR5cGVcIlxuICAgICAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJsZWZ0U2lkZW5hdi5jbG9zZSgpXCJcbiAgICAgICAgICBbbm9kZVR5cGVdPVwibm9kZVR5cGVcIlxuICAgICAgICA+PC9hamYtZmItbm9kZS10eXBlLWVudHJ5PlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtZHJhd2VyPlxuICAgIDxkaXYgI2Rlc2lnbmVyIGNsYXNzPVwiYWpmLWRlc2lnbmVyXCI+XG4gICAgICA8YWpmLWZiLW5vZGUtZW50cnlcbiAgICAgICAgaWQ9XCJzbGlkZXMtbGlzdFwiXG4gICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25Ecm9wKCRldmVudClcIlxuICAgICAgICBbY2RrRHJvcExpc3RFbnRlclByZWRpY2F0ZV09XCJkaXNhYmxlRmllbGREcm9wXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IG5vZGVFbnRyeSBvZiAobm9kZUVudHJpZXNUcmVlfGFzeW5jKTsgbGV0IGlzRmlyc3QgPSBmaXJzdFwiXG4gICAgICAgIFtpc0ZpcnN0XT1cImlzRmlyc3RcIlxuICAgICAgICBbbm9kZUVudHJ5XT1cIm5vZGVFbnRyeVwiXG4gICAgICA+PC9hamYtZmItbm9kZS1lbnRyeT5cbiAgICA8L2Rpdj5cbiAgPC9tYXQtZHJhd2VyLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImFqZi1mb3JtdHJlZS1wcm9wZXJ0aWVzXCIgI3JpZ2h0U2lkZW5hdiBwb3NpdGlvbj1cImVuZFwiIG1vZGU9XCJzaWRlXCI+XG4gICAgPGFqZi1mYi1ub2RlLXByb3BlcnRpZXM+PC9hamYtZmItbm9kZS1wcm9wZXJ0aWVzPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -1,267 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright (C) Gnucoop soc. coop.
4
- *
5
- * This file is part of the Advanced JSON forms (ajf).
6
- *
7
- * Advanced JSON forms (ajf) is free software: you can redistribute it and/or
8
- * modify it under the terms of the GNU Affero General Public License as
9
- * published by the Free Software Foundation, either version 3 of the License,
10
- * or (at your option) any later version.
11
- *
12
- * Advanced JSON forms (ajf) is distributed in the hope that it will be useful,
13
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero
15
- * General Public License for more details.
16
- *
17
- * You should have received a copy of the GNU Affero General Public License
18
- * along with Advanced JSON forms (ajf).
19
- * If not, see http://www.gnu.org/licenses/.
20
- *
21
- */
22
- import { isContainerNode, isSlidesNode } from '@ajf/core/forms';
23
- import { ChangeDetectionStrategy, Component, ElementRef, Input, ViewChildren, ViewEncapsulation, } from '@angular/core';
24
- import { Subscription, of as obsOf } from 'rxjs';
25
- import { AjfFbBranchLine } from './branch-line';
26
- import { disableFieldDropPredicate, disableSlideDropPredicate, onDropProcess, } from './form-builder-utils';
27
- import * as i0 from "@angular/core";
28
- import * as i1 from "./form-builder-service";
29
- import * as i2 from "@ajf/material/node-icon";
30
- import * as i3 from "@angular/common";
31
- import * as i4 from "@angular/cdk/drag-drop";
32
- import * as i5 from "@angular/material/button";
33
- import * as i6 from "@angular/material/card";
34
- import * as i7 from "@angular/material/icon";
35
- import * as i8 from "@angular/material/expansion";
36
- import * as i9 from "./branch-line";
37
- import * as i10 from "@ngneat/transloco";
38
- const branchColors = [
39
- '#F44336',
40
- '#4CAF50',
41
- '#3F51B5',
42
- '#FFC107',
43
- '#795548', // BROWN
44
- ];
45
- export class AjfFbNodeEntry {
46
- constructor(_service) {
47
- this._service = _service;
48
- this._hasContent = false;
49
- this._isFirst = false;
50
- this._isNodeEntry = false;
51
- this._level = 0;
52
- this._isDraggable = true;
53
- this._branchColors = branchColors.slice(0);
54
- this._dropZones = ['fbdz-node'];
55
- this._slideDropZones = ['fbdz-slide'];
56
- this._originOffset = 0;
57
- this._originLeftMargin = '0';
58
- this._firstBranchColor = branchColors[0];
59
- this._branchLinesSubscription = Subscription.EMPTY;
60
- this._childEntriesSubscription = Subscription.EMPTY;
61
- this._currentEditedNode = this._service.editedNodeEntry;
62
- }
63
- get hasContent() {
64
- return this._hasContent;
65
- }
66
- get isFirst() {
67
- return this._isFirst;
68
- }
69
- set isFirst(isFirst) {
70
- this._isFirst = isFirst;
71
- }
72
- get isNodeEntry() {
73
- return this._isNodeEntry;
74
- }
75
- get nodeEntry() {
76
- return this._nodeEntry;
77
- }
78
- set nodeEntry(nodeEntry) {
79
- this._nodeEntry = nodeEntry;
80
- if (nodeEntry != null && nodeEntry.node !== void 0) {
81
- const ne = nodeEntry;
82
- this._isNodeEntry = true;
83
- const node = ne.node;
84
- this._hasContent = node != null && isContainerNode(node);
85
- }
86
- else {
87
- this._isNodeEntry = false;
88
- this._hasContent = false;
89
- }
90
- }
91
- get level() {
92
- return this._level;
93
- }
94
- set level(value) {
95
- this._level = value;
96
- }
97
- get isDraggable() {
98
- return this._isDraggable;
99
- }
100
- set isDraggable(draggable) {
101
- this._isDraggable = draggable;
102
- }
103
- get realNodeEntry() {
104
- return this._nodeEntry;
105
- }
106
- get branchColors() {
107
- return this._branchColors;
108
- }
109
- get dropZones() {
110
- return this._dropZones;
111
- }
112
- get slideDropZones() {
113
- return this._slideDropZones;
114
- }
115
- get originOffset() {
116
- return this._originOffset;
117
- }
118
- set originOffset(originOffset) {
119
- this._originOffset = originOffset;
120
- this._originLeftMargin = `${this._originOffset * 4}px`;
121
- }
122
- get originLeftMargin() {
123
- return this._originLeftMargin;
124
- }
125
- get firstBranchColor() {
126
- return this._firstBranchColor;
127
- }
128
- set firstBranchColor(firstBranchColor) {
129
- const idx = branchColors.indexOf(firstBranchColor);
130
- if (idx > 0) {
131
- this._firstBranchColor = firstBranchColor;
132
- this._branchColors = branchColors.slice(idx).concat(branchColors.slice(0, idx));
133
- }
134
- else {
135
- this._firstBranchColor = branchColors[0];
136
- this._branchColors = branchColors.slice(0);
137
- }
138
- }
139
- get currentEditedNode() {
140
- return this._currentEditedNode;
141
- }
142
- onResize() { }
143
- edit(evt) {
144
- evt.stopPropagation();
145
- if (this.nodeEntry == null || !this.isNodeEntry) {
146
- return;
147
- }
148
- this._service.editNodeEntry(this.nodeEntry);
149
- }
150
- delete(evt) {
151
- evt.stopPropagation();
152
- if (this.nodeEntry == null || !this.isNodeEntry) {
153
- return;
154
- }
155
- this._service.cancelNodeEntryEdit();
156
- this._service.deleteNodeEntry(this.nodeEntry);
157
- }
158
- isLastNode() {
159
- if (!this.realNodeEntry || !this.realNodeEntry.children) {
160
- return false;
161
- }
162
- return !this.realNodeEntry.children[0].children;
163
- }
164
- isSlide(node) {
165
- return isSlidesNode(node);
166
- }
167
- isExpanded() {
168
- if (this._nodeEntry && 'node' in this._nodeEntry) {
169
- return this._service.getExpandedStatus(this._nodeEntry.node.name);
170
- }
171
- return obsOf(false);
172
- }
173
- ngAfterViewInit() {
174
- this.updateBranchHeights();
175
- this._childEntriesSubscription = this.childEntries.changes.subscribe(() => {
176
- this.updateBranchHeights();
177
- });
178
- }
179
- ngOnDestroy() {
180
- this._branchLinesSubscription.unsubscribe();
181
- this._childEntriesSubscription.unsubscribe();
182
- }
183
- /**
184
- * Triggers when a field or slide node is moved or inserted by drag&dropping in the formbuilder.
185
- * @param event The drop event.
186
- * @param content True if the current nodeEntry contains other nodeEntries.
187
- */
188
- onDrop(event, content = false) {
189
- if (this._nodeEntry == null) {
190
- return;
191
- }
192
- onDropProcess(event, this._service, this._nodeEntry, content);
193
- }
194
- /**
195
- * Assigns a progressive id to the dropList, to connect it to the FormBuilder source list.
196
- * @param empty True if the list is marked as empty.
197
- */
198
- assignId(empty = false) {
199
- return this._service.assignListId(this.realNodeEntry.node, empty);
200
- }
201
- disableSlideDrop(item) {
202
- return disableSlideDropPredicate(item);
203
- }
204
- disableFieldDrop(item) {
205
- return disableFieldDropPredicate(item);
206
- }
207
- emptyAreaDropPredicate() {
208
- return (item, _drop) => {
209
- if (this._level > 0) {
210
- return !item.data.isSlide;
211
- }
212
- return item.data.isSlide || false;
213
- };
214
- }
215
- updateBranchHeights(delay = 0) {
216
- setTimeout(() => {
217
- if (this.nodeEntry == null ||
218
- !this.isNodeEntry ||
219
- this.branchLines == null ||
220
- this.childEntries == null) {
221
- return;
222
- }
223
- const nodeEntry = this.nodeEntry;
224
- const branchLines = this.branchLines.toArray();
225
- const sliceIdx = nodeEntry.content != null ? nodeEntry.content.length : 0;
226
- const childEntries = this.childEntries.toArray().slice(sliceIdx);
227
- if (branchLines.length != childEntries.length) {
228
- return;
229
- }
230
- branchLines.forEach((bl, idx) => {
231
- const ce = childEntries[idx];
232
- bl.height = ce.nativeElement.offsetTop;
233
- });
234
- }, delay);
235
- }
236
- updateExpandedStatus(expanded) {
237
- if (this._nodeEntry && 'node' in this._nodeEntry) {
238
- this._service.updateExpandedStatus(this._nodeEntry.node.name, expanded);
239
- this.updateBranchHeights(400);
240
- }
241
- }
242
- }
243
- AjfFbNodeEntry.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AjfFbNodeEntry, deps: [{ token: i1.AjfFormBuilderService }], target: i0.ɵɵFactoryTarget.Component });
244
- AjfFbNodeEntry.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: AjfFbNodeEntry, selector: "ajf-fb-node-entry", inputs: { isFirst: "isFirst", nodeEntry: "nodeEntry", level: "level", isDraggable: "isDraggable", originOffset: "originOffset", firstBranchColor: "firstBranchColor" }, host: { listeners: { "window.resize": "onResize()" } }, viewQueries: [{ propertyName: "branchLines", predicate: AjfFbBranchLine, descendants: true }, { propertyName: "childEntries", predicate: AjfFbNodeEntry, descendants: true, read: ElementRef }], ngImport: i0, template: "<ng-container *ngIf=\"nodeEntry; else rootEmpty\">\n <ng-template [ngIf]=\"isNodeEntry && !isLastNode()\">\n <ajf-fb-branch-line\n *ngFor=\"let childNodeEntry of realNodeEntry.children; let idx = index\"\n [offset]=\"idx\"\n [color]=\"branchColors[idx]\"\n ></ajf-fb-branch-line>\n </ng-template>\n\n <div\n class=\"mat-card-container\"\n [class.ajf-highlighted-formbuilder-node]=\"(currentEditedNode|async) === nodeEntry\"\n >\n <div\n *ngIf=\"!isFirst\"\n class=\"ajf-origin-line\"\n [style.margin-left]=\"originLeftMargin\"\n [style.border-color]=\"firstBranchColor\"\n ></div>\n <ng-template [ngIf]=\"isNodeEntry\">\n <ng-container *ngIf=\"!isDraggable; else draggable\">\n <mat-card appearance=\"outlined\">\n <ng-container *ngTemplateOutlet=\"cardTitle\"></ng-container>\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n </mat-card>\n </ng-container>\n\n <ng-template #draggable>\n <mat-card\n appearance=\"outlined\"\n cdkDrag\n [cdkDragData]=\"realNodeEntry\"\n class=\"ajf-draggable-box\"\n >\n <ng-container *ngIf=\"isSlide(realNodeEntry.node); else fieldPanel\">\n <ng-container *ngTemplateOutlet=\"slidePanel\"></ng-container>\n </ng-container>\n </mat-card>\n </ng-template>\n\n <ng-template #slidePanel>\n <mat-expansion-panel\n [expanded]=\"isExpanded()|async\"\n (opened)=\"updateExpandedStatus(true)\"\n (closed)=\"updateExpandedStatus(false)\"\n class=\"mat-elevation-z\"\n >\n <mat-expansion-panel-header>\n <ng-container *ngTemplateOutlet=\"cardTitle\"></ng-container>\n </mat-expansion-panel-header>\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n </mat-expansion-panel>\n </ng-template>\n\n <ng-template #fieldPanel>\n <ng-container *ngTemplateOutlet=\"cardTitle\"></ng-container>\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n </ng-template>\n\n <ng-template #cardTitle>\n <div class=\"ajf-title-row\">\n <ajf-node-icon [node]=\"realNodeEntry.node\"></ajf-node-icon>\n &nbsp;\n <span\n class=\"ajf-title\"\n [innerHTML]=\"(realNodeEntry.node.label || realNodeEntry.node.name) | transloco\"\n ></span>\n <span\n *ngIf=\"realNodeEntry.node.visibility && realNodeEntry.node.visibility?.condition !== 'true'\"\n class=\"ajf-visibility-condition\"\n [innerHTML]=\"'Condition: (' + realNodeEntry.node.visibility.condition + ')'\"\n >\n </span>\n <span class=\"ajf-actions\">\n <button\n [disabled]=\"(currentEditedNode|async) === nodeEntry\"\n (click)=\"edit($event)\"\n mat-icon-button\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button (click)=\"delete($event)\" mat-icon-button>\n <mat-icon>delete</mat-icon>\n </button>\n </span>\n </div>\n </ng-template>\n\n <ng-template #cardContent>\n <div *ngIf=\"hasContent\">\n <ajf-fb-node-entry\n cdkDropList\n class=\"ajf-fields-list\"\n *ngFor=\"let contentEntry of realNodeEntry.content; let isFirstChild = first; let idx = index\"\n [id]=\"assignId()\"\n [level]=\"level + 1\"\n [isFirst]=\"isFirstChild\"\n [firstBranchColor]=\"branchColors[idx]\"\n [nodeEntry]=\"contentEntry\"\n [cdkDropListEnterPredicate]=\"disableSlideDrop\"\n (cdkDropListDropped)=\"onDrop($event, true)\"\n ></ajf-fb-node-entry>\n <mat-card\n appearance=\"outlined\"\n class=\"ajf-empty\"\n *ngIf=\"realNodeEntry.content.length === 0\"\n cdkDropList\n [id]=\"assignId(true)\"\n [cdkDropListEnterPredicate]=\"disableSlideDrop\"\n (cdkDropListDropped)=\"onDrop($event, true)\"\n ><mat-card-title>Drop your fields here</mat-card-title></mat-card\n >\n </div>\n </ng-template>\n </ng-template>\n </div>\n\n <ng-template [ngIf]=\"isNodeEntry\">\n <ng-container *ngFor=\"let childNodeEntry of realNodeEntry.children; let idx = index\">\n <ajf-fb-node-entry\n *ngIf=\"!isLastNode()\"\n [level]=\"level\"\n [originOffset]=\"idx\"\n [firstBranchColor]=\"branchColors[idx]\"\n [nodeEntry]=\"childNodeEntry\"\n ></ajf-fb-node-entry>\n </ng-container>\n </ng-template>\n</ng-container>\n\n<ng-template #rootEmpty>\n <div class=\"mat-card-container\">\n <mat-card\n appearance=\"outlined\"\n class=\"ajf-empty\"\n cdkDropList\n [cdkDropListEnterPredicate]=\"emptyAreaDropPredicate()\"\n (cdkDropListDropped)=\"onDrop($event)\"\n ><mat-card-title>Drop your slides here</mat-card-title>\n </mat-card>\n </div>\n</ng-template>\n", styles: ["ajf-fb-node-entry{display:block;position:relative}ajf-fb-node-entry .mat-card-container{position:relative}ajf-fb-node-entry .mat-card-container .ajf-origin-line{position:absolute;top:0;left:25px;width:25px;height:25px;border-bottom:2px solid;border-left:2px solid;border-bottom-left-radius:.5em}ajf-fb-node-entry .mat-card-container .mat-mdc-card{margin-left:50px;padding:.5em 1em;background-color:#fff}ajf-fb-node-entry .mat-card-container .mat-mdc-card .ajf-title-row{display:flex;flex:1 1 auto;flex-direction:row wrap;align-items:center}ajf-fb-node-entry .mat-card-container .mat-mdc-card .ajf-title-row>.ajf-title{flex:1 1 auto;max-width:25vw;margin-right:10px}ajf-fb-node-entry .mat-card-container .mat-mdc-card .ajf-title-row>.ajf-visibility-condition{flex:1 1 auto;font-size:10px;color:#999;max-height:100px;max-width:25vw;overflow:hidden;text-overflow:ellipsis}ajf-fb-node-entry .mat-card-container .mat-mdc-card .ajf-title-row>.ajf-actions{flex:1 1 auto;display:flex;justify-content:flex-end;white-space:nowrap;justify-self:flex-end}ajf-fb-node-entry .mat-card-container .mat-mdc-card.ajf-empty{line-height:36px;border:2px dashed;box-shadow:none;box-sizing:border-box;text-align:center;color:#ccc}ajf-fb-node-entry .mat-card-container .mat-mdc-card.ajf-draggable-box{padding:5px;border-bottom:solid 1px #ccc;border-right:solid 1px #ccc;color:#000000de;box-sizing:border-box;cursor:move;background:white;font-size:14px}ajf-fb-node-entry .mat-card-container.ajf-highlighted-formbuilder-node>mat-card{background-color:#fff9c4!important}ajf-fb-node-entry .ajf-highlighted-formbuilder-node .mat-mdc-card .mat-expansion-panel .mat-expansion-panel-header{background-color:#fff9c4!important}ajf-fb-node-entry.ajf-fields-list{max-width:80%;min-height:60px;display:block;background:white;border-radius:4px;overflow:hidden}ajf-fb-node-entry .cdk-drag-placeholder{opacity:.4;min-height:60px;margin-left:50px;border:1px solid #ccc;border-radius:4px;background-color:#fff9c4}ajf-fb-node-entry .ajf-fields-list.cdk-drop-list-dragging .ajf-draggable-box:not(.cdk-drag-placeholder),ajf-fb-node-entry .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "component", type: i2.AjfNodeIcon, selector: "ajf-node-icon" }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i4.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i8.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "component", type: i9.AjfFbBranchLine, selector: "ajf-fb-branch-line", inputs: ["offset", "color", "height"] }, { kind: "component", type: AjfFbNodeEntry, selector: "ajf-fb-node-entry", inputs: ["isFirst", "nodeEntry", "level", "isDraggable", "originOffset", "firstBranchColor"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
245
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: AjfFbNodeEntry, decorators: [{
246
- type: Component,
247
- args: [{ selector: 'ajf-fb-node-entry', host: { '(window.resize)': 'onResize()' }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"nodeEntry; else rootEmpty\">\n <ng-template [ngIf]=\"isNodeEntry && !isLastNode()\">\n <ajf-fb-branch-line\n *ngFor=\"let childNodeEntry of realNodeEntry.children; let idx = index\"\n [offset]=\"idx\"\n [color]=\"branchColors[idx]\"\n ></ajf-fb-branch-line>\n </ng-template>\n\n <div\n class=\"mat-card-container\"\n [class.ajf-highlighted-formbuilder-node]=\"(currentEditedNode|async) === nodeEntry\"\n >\n <div\n *ngIf=\"!isFirst\"\n class=\"ajf-origin-line\"\n [style.margin-left]=\"originLeftMargin\"\n [style.border-color]=\"firstBranchColor\"\n ></div>\n <ng-template [ngIf]=\"isNodeEntry\">\n <ng-container *ngIf=\"!isDraggable; else draggable\">\n <mat-card appearance=\"outlined\">\n <ng-container *ngTemplateOutlet=\"cardTitle\"></ng-container>\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n </mat-card>\n </ng-container>\n\n <ng-template #draggable>\n <mat-card\n appearance=\"outlined\"\n cdkDrag\n [cdkDragData]=\"realNodeEntry\"\n class=\"ajf-draggable-box\"\n >\n <ng-container *ngIf=\"isSlide(realNodeEntry.node); else fieldPanel\">\n <ng-container *ngTemplateOutlet=\"slidePanel\"></ng-container>\n </ng-container>\n </mat-card>\n </ng-template>\n\n <ng-template #slidePanel>\n <mat-expansion-panel\n [expanded]=\"isExpanded()|async\"\n (opened)=\"updateExpandedStatus(true)\"\n (closed)=\"updateExpandedStatus(false)\"\n class=\"mat-elevation-z\"\n >\n <mat-expansion-panel-header>\n <ng-container *ngTemplateOutlet=\"cardTitle\"></ng-container>\n </mat-expansion-panel-header>\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n </mat-expansion-panel>\n </ng-template>\n\n <ng-template #fieldPanel>\n <ng-container *ngTemplateOutlet=\"cardTitle\"></ng-container>\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n </ng-template>\n\n <ng-template #cardTitle>\n <div class=\"ajf-title-row\">\n <ajf-node-icon [node]=\"realNodeEntry.node\"></ajf-node-icon>\n &nbsp;\n <span\n class=\"ajf-title\"\n [innerHTML]=\"(realNodeEntry.node.label || realNodeEntry.node.name) | transloco\"\n ></span>\n <span\n *ngIf=\"realNodeEntry.node.visibility && realNodeEntry.node.visibility?.condition !== 'true'\"\n class=\"ajf-visibility-condition\"\n [innerHTML]=\"'Condition: (' + realNodeEntry.node.visibility.condition + ')'\"\n >\n </span>\n <span class=\"ajf-actions\">\n <button\n [disabled]=\"(currentEditedNode|async) === nodeEntry\"\n (click)=\"edit($event)\"\n mat-icon-button\n >\n <mat-icon>edit</mat-icon>\n </button>\n <button (click)=\"delete($event)\" mat-icon-button>\n <mat-icon>delete</mat-icon>\n </button>\n </span>\n </div>\n </ng-template>\n\n <ng-template #cardContent>\n <div *ngIf=\"hasContent\">\n <ajf-fb-node-entry\n cdkDropList\n class=\"ajf-fields-list\"\n *ngFor=\"let contentEntry of realNodeEntry.content; let isFirstChild = first; let idx = index\"\n [id]=\"assignId()\"\n [level]=\"level + 1\"\n [isFirst]=\"isFirstChild\"\n [firstBranchColor]=\"branchColors[idx]\"\n [nodeEntry]=\"contentEntry\"\n [cdkDropListEnterPredicate]=\"disableSlideDrop\"\n (cdkDropListDropped)=\"onDrop($event, true)\"\n ></ajf-fb-node-entry>\n <mat-card\n appearance=\"outlined\"\n class=\"ajf-empty\"\n *ngIf=\"realNodeEntry.content.length === 0\"\n cdkDropList\n [id]=\"assignId(true)\"\n [cdkDropListEnterPredicate]=\"disableSlideDrop\"\n (cdkDropListDropped)=\"onDrop($event, true)\"\n ><mat-card-title>Drop your fields here</mat-card-title></mat-card\n >\n </div>\n </ng-template>\n </ng-template>\n </div>\n\n <ng-template [ngIf]=\"isNodeEntry\">\n <ng-container *ngFor=\"let childNodeEntry of realNodeEntry.children; let idx = index\">\n <ajf-fb-node-entry\n *ngIf=\"!isLastNode()\"\n [level]=\"level\"\n [originOffset]=\"idx\"\n [firstBranchColor]=\"branchColors[idx]\"\n [nodeEntry]=\"childNodeEntry\"\n ></ajf-fb-node-entry>\n </ng-container>\n </ng-template>\n</ng-container>\n\n<ng-template #rootEmpty>\n <div class=\"mat-card-container\">\n <mat-card\n appearance=\"outlined\"\n class=\"ajf-empty\"\n cdkDropList\n [cdkDropListEnterPredicate]=\"emptyAreaDropPredicate()\"\n (cdkDropListDropped)=\"onDrop($event)\"\n ><mat-card-title>Drop your slides here</mat-card-title>\n </mat-card>\n </div>\n</ng-template>\n", styles: ["ajf-fb-node-entry{display:block;position:relative}ajf-fb-node-entry .mat-card-container{position:relative}ajf-fb-node-entry .mat-card-container .ajf-origin-line{position:absolute;top:0;left:25px;width:25px;height:25px;border-bottom:2px solid;border-left:2px solid;border-bottom-left-radius:.5em}ajf-fb-node-entry .mat-card-container .mat-mdc-card{margin-left:50px;padding:.5em 1em;background-color:#fff}ajf-fb-node-entry .mat-card-container .mat-mdc-card .ajf-title-row{display:flex;flex:1 1 auto;flex-direction:row wrap;align-items:center}ajf-fb-node-entry .mat-card-container .mat-mdc-card .ajf-title-row>.ajf-title{flex:1 1 auto;max-width:25vw;margin-right:10px}ajf-fb-node-entry .mat-card-container .mat-mdc-card .ajf-title-row>.ajf-visibility-condition{flex:1 1 auto;font-size:10px;color:#999;max-height:100px;max-width:25vw;overflow:hidden;text-overflow:ellipsis}ajf-fb-node-entry .mat-card-container .mat-mdc-card .ajf-title-row>.ajf-actions{flex:1 1 auto;display:flex;justify-content:flex-end;white-space:nowrap;justify-self:flex-end}ajf-fb-node-entry .mat-card-container .mat-mdc-card.ajf-empty{line-height:36px;border:2px dashed;box-shadow:none;box-sizing:border-box;text-align:center;color:#ccc}ajf-fb-node-entry .mat-card-container .mat-mdc-card.ajf-draggable-box{padding:5px;border-bottom:solid 1px #ccc;border-right:solid 1px #ccc;color:#000000de;box-sizing:border-box;cursor:move;background:white;font-size:14px}ajf-fb-node-entry .mat-card-container.ajf-highlighted-formbuilder-node>mat-card{background-color:#fff9c4!important}ajf-fb-node-entry .ajf-highlighted-formbuilder-node .mat-mdc-card .mat-expansion-panel .mat-expansion-panel-header{background-color:#fff9c4!important}ajf-fb-node-entry.ajf-fields-list{max-width:80%;min-height:60px;display:block;background:white;border-radius:4px;overflow:hidden}ajf-fb-node-entry .cdk-drag-placeholder{opacity:.4;min-height:60px;margin-left:50px;border:1px solid #ccc;border-radius:4px;background-color:#fff9c4}ajf-fb-node-entry .ajf-fields-list.cdk-drop-list-dragging .ajf-draggable-box:not(.cdk-drag-placeholder),ajf-fb-node-entry .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}\n"] }]
248
- }], ctorParameters: function () { return [{ type: i1.AjfFormBuilderService }]; }, propDecorators: { branchLines: [{
249
- type: ViewChildren,
250
- args: [AjfFbBranchLine]
251
- }], childEntries: [{
252
- type: ViewChildren,
253
- args: [AjfFbNodeEntry, { read: ElementRef }]
254
- }], isFirst: [{
255
- type: Input
256
- }], nodeEntry: [{
257
- type: Input
258
- }], level: [{
259
- type: Input
260
- }], isDraggable: [{
261
- type: Input
262
- }], originOffset: [{
263
- type: Input
264
- }], firstBranchColor: [{
265
- type: Input
266
- }] } });
267
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL2Zvcm0tYnVpbGRlci9zcmMvbm9kZS1lbnRyeS50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL2Zvcm0tYnVpbGRlci9zcmMvbm9kZS1lbnRyeS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBVSxlQUFlLEVBQUUsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkUsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFHTCxZQUFZLEVBQ1osaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBYSxZQUFZLEVBQUUsRUFBRSxJQUFJLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUUzRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBTzlDLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLGFBQWEsR0FDZCxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7Ozs7QUFFOUIsTUFBTSxZQUFZLEdBQWE7SUFDN0IsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVMsRUFBRSxRQUFRO0NBQ3BCLENBQUM7QUFXRixNQUFNLE9BQU8sY0FBYztJQW1IekIsWUFBb0IsUUFBK0I7UUFBL0IsYUFBUSxHQUFSLFFBQVEsQ0FBdUI7UUEvRzNDLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBS3BCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFTakIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUF1QnJCLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFRWCxpQkFBWSxHQUFZLElBQUksQ0FBQztRQWE3QixrQkFBYSxHQUFhLFlBQVksQ0FBQyxLQUFL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dkIsRUFBQyxpQkFBaUIsRUFBRSxZQUFZLEVBQUMsaUJBQ3hCLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07NEdBR2hCLFdBQVc7c0JBQXpDLFlBQVk7dUJBQUMsZUFBZTtnQkFDcUIsWUFBWTtzQkFBN0QsWUFBWTt1QkFBQyxjQUFjLEVBQUUsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDO2dCQVk1QyxPQUFPO3NCQURWLEtBQUs7Z0JBZUYsU0FBUztzQkFEWixLQUFLO2dCQW1CRixLQUFLO3NCQURSLEtBQUs7Z0JBU0YsV0FBVztzQkFEZCxLQUFLO2dCQTZCRixZQUFZO3NCQURmLEtBQUs7Z0JBZUYsZ0JBQWdCO3NCQURuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChDKSBHbnVjb29wIHNvYy4gY29vcC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzXG4gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSxcbiAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKiBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLlxuICpcbiAqL1xuXG5pbXBvcnQge0FqZk5vZGUsIGlzQ29udGFpbmVyTm9kZSwgaXNTbGlkZXNOb2RlfSBmcm9tICdAYWpmL2NvcmUvZm9ybXMnO1xuaW1wb3J0IHtDZGtEcmFnLCBDZGtEcmFnRHJvcCwgQ2RrRHJvcExpc3R9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGRyZW4sXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBvZiBhcyBvYnNPZn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7QWpmRmJCcmFuY2hMaW5lfSBmcm9tICcuL2JyYW5jaC1saW5lJztcbmltcG9ydCB7XG4gIEFqZkZvcm1CdWlsZGVyTm9kZSxcbiAgQWpmRm9ybUJ1aWxkZXJOb2RlRW50cnksXG4gIEFqZkZvcm1CdWlsZGVyTm9kZVR5cGVFbnRyeSxcbiAgQWpmRm9ybUJ1aWxkZXJTZXJ2aWNlLFxufSBmcm9tICcuL2Zvcm0tYnVpbGRlci1zZXJ2aWNlJztcbmltcG9ydCB7XG4gIGRpc2FibGVGaWVsZERyb3BQcmVkaWNhdGUsXG4gIGRpc2FibGVTbGlkZURyb3BQcmVkaWNhdGUsXG4gIG9uRHJvcFByb2Nlc3MsXG59IGZyb20gJy4vZm9ybS1idWlsZGVyLXV0aWxzJztcblxuY29uc3QgYnJhbmNoQ29sb3JzOiBzdHJpbmdbXSA9IFtcbiAgJyNGNDQzMzYnLCAvLyBSRURcbiAgJyM0Q0FGNTAnLCAvLyBHUkVFTlxuICAnIzNGNTFCNScsIC8vIElORElHT1xuICAnI0ZGQzEwNycsIC8vIEFNQkVSXG4gICcjNzk1NTQ4JywgLy8gQlJPV05cbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FqZi1mYi1ub2RlLWVudHJ5JyxcbiAgdGVtcGxhdGVVcmw6ICdub2RlLWVudHJ5Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnbm9kZS1lbnRyeS5zY3NzJ10sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBob3N0OiB7Jyh3aW5kb3cucmVzaXplKSc6ICdvblJlc2l6ZSgpJ30sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBamZGYk5vZGVFbnRyeSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGRyZW4oQWpmRmJCcmFuY2hMaW5lKSBicmFuY2hMaW5lcyE6IFF1ZXJ5TGlzdDxBamZGYkJyYW5jaExpbmU+O1xuICBAVmlld0NoaWxkcmVuKEFqZkZiTm9kZUVudHJ5LCB7cmVhZDogRWxlbWVudFJlZn0pIGNoaWxkRW50cmllcyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcblxuICBwcml2YXRlIF9oYXNDb250ZW50ID0gZmFsc2U7XG4gIGdldCBoYXNDb250ZW50KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9oYXNDb250ZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNGaXJzdCA9IGZhbHNlO1xuICBnZXQgaXNGaXJzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNGaXJzdDtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgaXNGaXJzdChpc0ZpcnN0OiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNGaXJzdCA9IGlzRmlyc3Q7XG4gIH1cblxuICBwcml2YXRlIF9pc05vZGVFbnRyeSA9IGZhbHNlO1xuICBnZXQgaXNOb2RlRW50cnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTm9kZUVudHJ5O1xuICB9XG5cbiAgcHJpdmF0ZSBfbm9kZUVudHJ5OiBBamZGb3JtQnVpbGRlck5vZGUgfCB1bmRlZmluZWQ7XG4gIGdldCBub2RlRW50cnkoKTogQWpmRm9ybUJ1aWxkZXJOb2RlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbm9kZUVudHJ5O1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBub2RlRW50cnkobm9kZUVudHJ5OiBBamZGb3JtQnVpbGRlck5vZGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ub2RlRW50cnkgPSBub2RlRW50cnk7XG4gICAgaWYgKG5vZGVFbnRyeSAhPSBudWxsICYmICg8QWpmRm9ybUJ1aWxkZXJOb2RlRW50cnk+bm9kZUVudHJ5KS5ub2RlICE9PSB2b2lkIDApIHtcbiAgICAgIGNvbnN0IG5lID0gPEFqZkZvcm1CdWlsZGVyTm9kZUVudHJ5Pm5vZGVFbnRyeTtcbiAgICAgIHRoaXMuX2lzTm9kZUVudHJ5ID0gdHJ1ZTtcbiAgICAgIGNvbnN0IG5vZGUgPSBuZS5ub2RlO1xuICAgICAgdGhpcy5faGFzQ29udGVudCA9IG5vZGUgIT0gbnVsbCAmJiBpc0NvbnRhaW5lck5vZGUobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lzTm9kZUVudHJ5ID0gZmFsc2U7XG4gICAgICB0aGlzLl9oYXNDb250ZW50ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbGV2ZWwgPSAwO1xuICBnZXQgbGV2ZWwoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGxldmVsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9sZXZlbCA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX2lzRHJhZ2dhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgZ2V0IGlzRHJhZ2dhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0RyYWdnYWJsZTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgaXNEcmFnZ2FibGUoZHJhZ2dhYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNEcmFnZ2FibGUgPSBkcmFnZ2FibGU7XG4gIH1cblxuICBnZXQgcmVhbE5vZGVFbnRyeSgpOiBBamZGb3JtQnVpbGRlck5vZGVFbnRyeSB7XG4gICAgcmV0dXJuIHRoaXMuX25vZGVFbnRyeSBhcyBBamZGb3JtQnVpbGRlck5vZGVFbnRyeTtcbiAgfVxuXG4gIHByaXZhdGUgX2JyYW5jaENvbG9yczogc3RyaW5nW10gPSBicmFuY2hDb2xvcnMuc2xpY2UoMCk7XG4gIGdldCBicmFuY2hDb2xvcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9icmFuY2hDb2xvcnM7XG4gIH1cblxuICBwcml2YXRlIF9kcm9wWm9uZXM6IHN0cmluZ1tdID0gWydmYmR6LW5vZGUnXTtcbiAgZ2V0IGRyb3Bab25lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2Ryb3Bab25lcztcbiAgfVxuXG4gIHByaXZhdGUgX3NsaWRlRHJvcFpvbmVzOiBzdHJpbmdbXSA9IFsnZmJkei1zbGlkZSddO1xuICBnZXQgc2xpZGVEcm9wWm9uZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9zbGlkZURyb3Bab25lcztcbiAgfVxuXG4gIHByaXZhdGUgX29yaWdpbk9mZnNldCA9IDA7XG4gIGdldCBvcmlnaW5PZmZzZXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fb3JpZ2luT2Zmc2V0O1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBvcmlnaW5PZmZzZXQob3JpZ2luT2Zmc2V0OiBudW1iZXIpIHtcbiAgICB0aGlzLl9vcmlnaW5PZmZzZXQgPSBvcmlnaW5PZmZzZXQ7XG4gICAgdGhpcy5fb3JpZ2luTGVmdE1hcmdpbiA9IGAke3RoaXMuX29yaWdpbk9mZnNldCAqIDR9cHhgO1xuICB9XG4gIHByaXZhdGUgX29yaWdpbkxlZnRNYXJnaW4gPSAnMCc7XG4gIGdldCBvcmlnaW5MZWZ0TWFyZ2luKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbkxlZnRNYXJnaW47XG4gIH1cblxuICBwcml2YXRlIF9maXJzdEJyYW5jaENvbG9yID0gYnJhbmNoQ29sb3JzWzBdO1xuICBnZXQgZmlyc3RCcmFuY2hDb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maXJzdEJyYW5jaENvbG9yO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBmaXJzdEJyYW5jaENvbG9yKGZpcnN0QnJhbmNoQ29sb3I6IHN0cmluZykge1xuICAgIGNvbnN0IGlkeCA9IGJyYW5jaENvbG9ycy5pbmRleE9mKGZpcnN0QnJhbmNoQ29sb3IpO1xuICAgIGlmIChpZHggPiAwKSB7XG4gICAgICB0aGlzLl9maXJzdEJyYW5jaENvbG9yID0gZmlyc3RCcmFuY2hDb2xvcjtcbiAgICAgIHRoaXMuX2JyYW5jaENvbG9ycyA9IGJyYW5jaENvbG9ycy5zbGljZShpZHgpLmNvbmNhdChicmFuY2hDb2xvcnMuc2xpY2UoMCwgaWR4KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ZpcnN0QnJhbmNoQ29sb3IgPSBicmFuY2hDb2xvcnNbMF07XG4gICAgICB0aGlzLl9icmFuY2hDb2xvcnMgPSBicmFuY2hDb2xvcnMuc2xpY2UoMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY3VycmVudEVkaXRlZE5vZGU6IE9ic2VydmFibGU8QWpmRm9ybUJ1aWxkZXJOb2RlRW50cnkgfCBudWxsPjtcbiAgZ2V0IGN1cnJlbnRFZGl0ZWROb2RlKCk6IE9ic2VydmFibGU8QWpmRm9ybUJ1aWxkZXJOb2RlRW50cnkgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRFZGl0ZWROb2RlO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnJhbmNoTGluZXNTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgcHJpdmF0ZSBfY2hpbGRFbnRyaWVzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc2VydmljZTogQWpmRm9ybUJ1aWxkZXJTZXJ2aWNlKSB7XG4gICAgdGhpcy5fY3VycmVudEVkaXRlZE5vZGUgPSB0aGlzLl9zZXJ2aWNlLmVkaXRlZE5vZGVFbnRyeTtcbiAgfVxuXG4gIG9uUmVzaXplKCk6IHZvaWQge31cblxuICBlZGl0KGV2dDogRXZlbnQpOiB2b2lkIHtcbiAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMubm9kZUVudHJ5ID09IG51bGwgfHwgIXRoaXMuaXNOb2RlRW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2VydmljZS5lZGl0Tm9kZUVudHJ5KDxBamZGb3JtQnVpbGRlck5vZGVFbnRyeT50aGlzLm5vZGVFbnRyeSk7XG4gIH1cblxuICBkZWxldGUoZXZ0OiBFdmVudCk6IHZvaWQge1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5ub2RlRW50cnkgPT0gbnVsbCB8fCAhdGhpcy5pc05vZGVFbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXJ2aWNlLmNhbmNlbE5vZGVFbnRyeUVkaXQoKTtcbiAgICB0aGlzLl9zZXJ2aWNlLmRlbGV0ZU5vZGVFbnRyeSg8QWpmRm9ybUJ1aWxkZXJOb2RlRW50cnk+dGhpcy5ub2RlRW50cnkpO1xuICB9XG5cbiAgaXNMYXN0Tm9kZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucmVhbE5vZGVFbnRyeSB8fCAhdGhpcy5yZWFsTm9kZUVudHJ5LmNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhdGhpcy5yZWFsTm9kZUVudHJ5LmNoaWxkcmVuWzBdLmNoaWxkcmVuO1xuICB9XG5cbiAgaXNTbGlkZShub2RlOiBBamZOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU2xpZGVzTm9kZShub2RlKTtcbiAgfVxuXG4gIGlzRXhwYW5kZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuX25vZGVFbnRyeSAmJiAnbm9kZScgaW4gdGhpcy5fbm9kZUVudHJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2VydmljZS5nZXRFeHBhbmRlZFN0YXR1cyh0aGlzLl9ub2RlRW50cnkubm9kZS5uYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIG9ic09mKGZhbHNlKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUJyYW5jaEhlaWdodHMoKTtcbiAgICB0aGlzLl9jaGlsZEVudHJpZXNTdWJzY3JpcHRpb24gPSB0aGlzLmNoaWxkRW50cmllcy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUJyYW5jaEhlaWdodHMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2JyYW5jaExpbmVzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fY2hpbGRFbnRyaWVzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgd2hlbiBhIGZpZWxkIG9yIHNsaWRlIG5vZGUgaXMgbW92ZWQgb3IgaW5zZXJ0ZWQgYnkgZHJhZyZkcm9wcGluZyBpbiB0aGUgZm9ybWJ1aWxkZXIuXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZHJvcCBldmVudC5cbiAgICogQHBhcmFtIGNvbnRlbnQgVHJ1ZSBpZiB0aGUgY3VycmVudCBub2RlRW50cnkgY29udGFpbnMgb3RoZXIgbm9kZUVudHJpZXMuXG4gICAqL1xuICBvbkRyb3AoXG4gICAgZXZlbnQ6IENka0RyYWdEcm9wPEFqZkZvcm1CdWlsZGVyTm9kZUVudHJ5PiB8IENka0RyYWdEcm9wPEFqZkZvcm1CdWlsZGVyTm9kZVR5cGVFbnRyeT4sXG4gICAgY29udGVudCA9IGZhbHNlLFxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbm9kZUVudHJ5ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb25Ecm9wUHJvY2VzcyhldmVudCwgdGhpcy5fc2VydmljZSwgdGhpcy5fbm9kZUVudHJ5LCBjb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ25zIGEgcHJvZ3Jlc3NpdmUgaWQgdG8gdGhlIGRyb3BMaXN0LCB0byBjb25uZWN0IGl0IHRvIHRoZSBGb3JtQnVpbGRlciBzb3VyY2UgbGlzdC5cbiAgICogQHBhcmFtIGVtcHR5IFRydWUgaWYgdGhlIGxpc3QgaXMgbWFya2VkIGFzIGVtcHR5LlxuICAgKi9cbiAgYXNzaWduSWQoZW1wdHk6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2UuYXNzaWduTGlzdElkKHRoaXMucmVhbE5vZGVFbnRyeS5ub2RlLCBlbXB0eSk7XG4gIH1cblxuICBkaXNhYmxlU2xpZGVEcm9wKGl0ZW06IENka0RyYWc8QWpmRm9ybUJ1aWxkZXJOb2RlVHlwZUVudHJ5Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkaXNhYmxlU2xpZGVEcm9wUHJlZGljYXRlKGl0ZW0pO1xuICB9XG5cbiAgZGlzYWJsZUZpZWxkRHJvcChpdGVtOiBDZGtEcmFnPEFqZkZvcm1CdWlsZGVyTm9kZVR5cGVFbnRyeT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGlzYWJsZUZpZWxkRHJvcFByZWRpY2F0ZShpdGVtKTtcbiAgfVxuXG4gIGVtcHR5QXJlYURyb3BQcmVkaWNhdGUoKTogKGl0ZW06IENka0RyYWcsIF9kcm9wOiBDZGtEcm9wTGlzdCkgPT4gYm9vbGVhbiB7XG4gICAgcmV0dXJuIChpdGVtOiBDZGtEcmFnLCBfZHJvcDogQ2RrRHJvcExpc3QpOiBib29sZWFuID0+IHtcbiAgICAgIGlmICh0aGlzLl9sZXZlbCA+IDApIHtcbiAgICAgICAgcmV0dXJuICFpdGVtLmRhdGEuaXNTbGlkZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVtLmRhdGEuaXNTbGlkZSB8fCBmYWxzZTtcbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlQnJhbmNoSGVpZ2h0cyhkZWxheTogbnVtYmVyID0gMCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm5vZGVFbnRyeSA9PSBudWxsIHx8XG4gICAgICAgICF0aGlzLmlzTm9kZUVudHJ5IHx8XG4gICAgICAgIHRoaXMuYnJhbmNoTGluZXMgPT0gbnVsbCB8fFxuICAgICAgICB0aGlzLmNoaWxkRW50cmllcyA9PSBudWxsXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9kZUVudHJ5ID0gPEFqZkZvcm1CdWlsZGVyTm9kZUVudHJ5PnRoaXMubm9kZUVudHJ5O1xuICAgICAgY29uc3QgYnJhbmNoTGluZXM6IEFqZkZiQnJhbmNoTGluZVtdID0gdGhpcy5icmFuY2hMaW5lcy50b0FycmF5KCk7XG4gICAgICBjb25zdCBzbGljZUlkeCA9IG5vZGVFbnRyeS5jb250ZW50ICE9IG51bGwgPyBub2RlRW50cnkuY29udGVudC5sZW5ndGggOiAwO1xuICAgICAgY29uc3QgY2hpbGRFbnRyaWVzOiBFbGVtZW50UmVmW10gPSB0aGlzLmNoaWxkRW50cmllcy50b0FycmF5KCkuc2xpY2Uoc2xpY2VJZHgpO1xuXG4gICAgICBpZiAoYnJhbmNoTGluZXMubGVuZ3RoICE9IGNoaWxkRW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBicmFuY2hMaW5lcy5mb3JFYWNoKChibDogQWpmRmJCcmFuY2hMaW5lLCBpZHg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBjZTogRWxlbWVudFJlZiA9IGNoaWxkRW50cmllc1tpZHhdO1xuICAgICAgICBibC5oZWlnaHQgPSBjZS5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcDtcbiAgICAgIH0pO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIHVwZGF0ZUV4cGFuZGVkU3RhdHVzKGV4cGFuZGVkOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuX25vZGVFbnRyeSAmJiAnbm9kZScgaW4gdGhpcy5fbm9kZUVudHJ5KSB7XG4gICAgICB0aGlzLl9zZXJ2aWNlLnVwZGF0ZUV4cGFuZGVkU3RhdHVzKHRoaXMuX25vZGVFbnRyeS5ub2RlLm5hbWUsIGV4cGFuZGVkKTtcbiAgICAgIHRoaXMudXBkYXRlQnJhbmNoSGVpZ2h0cyg0MDApO1xuICAgIH1cbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGVFbnRyeTsgZWxzZSByb290RW1wdHlcIj5cbiAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImlzTm9kZUVudHJ5ICYmICFpc0xhc3ROb2RlKClcIj5cbiAgICA8YWpmLWZiLWJyYW5jaC1saW5lXG4gICAgICAqbmdGb3I9XCJsZXQgY2hpbGROb2RlRW50cnkgb2YgcmVhbE5vZGVFbnRyeS5jaGlsZHJlbjsgbGV0IGlkeCA9IGluZGV4XCJcbiAgICAgIFtvZmZzZXRdPVwiaWR4XCJcbiAgICAgIFtjb2xvcl09XCJicmFuY2hDb2xvcnNbaWR4XVwiXG4gICAgPjwvYWpmLWZiLWJyYW5jaC1saW5lPlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cIm1hdC1jYXJkLWNvbnRhaW5lclwiXG4gICAgW2NsYXNzLmFqZi1oaWdobGlnaHRlZC1mb3JtYnVpbGRlci1ub2RlXT1cIihjdXJyZW50RWRpdGVkTm9kZXxhc3luYykgPT09IG5vZGVFbnRyeVwiXG4gID5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cIiFpc0ZpcnN0XCJcbiAgICAgIGNsYXNzPVwiYWpmLW9yaWdpbi1saW5lXCJcbiAgICAgIFtzdHlsZS5tYXJnaW4tbGVmdF09XCJvcmlnaW5MZWZ0TWFyZ2luXCJcbiAgICAgIFtzdHlsZS5ib3JkZXItY29sb3JdPVwiZmlyc3RCcmFuY2hDb2xvclwiXG4gICAgPjwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpc05vZGVFbnRyeVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0RyYWdnYWJsZTsgZWxzZSBkcmFnZ2FibGVcIj5cbiAgICAgICAgPG1hdC1jYXJkIGFwcGVhcmFuY2U9XCJvdXRsaW5lZFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXJkVGl0bGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FyZENvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9tYXQtY2FyZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI2RyYWdnYWJsZT5cbiAgICAgICAgPG1hdC1jYXJkXG4gICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCJcbiAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgW2Nka0RyYWdEYXRhXT1cInJlYWxOb2RlRW50cnlcIlxuICAgICAgICAgIGNsYXNzPVwiYWpmLWRyYWdnYWJsZS1ib3hcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU2xpZGUocmVhbE5vZGVFbnRyeS5ub2RlKTsgZWxzZSBmaWVsZFBhbmVsXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2xpZGVQYW5lbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L21hdC1jYXJkPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlICNzbGlkZVBhbmVsPlxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbFxuICAgICAgICAgIFtleHBhbmRlZF09XCJpc0V4cGFuZGVkKCl8YXN5bmNcIlxuICAgICAgICAgIChvcGVuZWQpPVwidXBkYXRlRXhwYW5kZWRTdGF0dXModHJ1ZSlcIlxuICAgICAgICAgIChjbG9zZWQpPVwidXBkYXRlRXhwYW5kZWRTdGF0dXMoZmFsc2UpXCJcbiAgICAgICAgICBjbGFzcz1cIm1hdC1lbGV2YXRpb24telwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FyZFRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FyZENvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlICNmaWVsZFBhbmVsPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FyZFRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjYXJkQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLXRlbXBsYXRlICNjYXJkVGl0bGU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhamYtdGl0bGUtcm93XCI+XG4gICAgICAgICAgPGFqZi1ub2RlLWljb24gW25vZGVdPVwicmVhbE5vZGVFbnRyeS5ub2RlXCI+PC9hamYtbm9kZS1pY29uPlxuICAgICAgICAgICZuYnNwO1xuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cImFqZi10aXRsZVwiXG4gICAgICAgICAgICBbaW5uZXJIVE1MXT1cIihyZWFsTm9kZUVudHJ5Lm5vZGUubGFiZWwgfHwgcmVhbE5vZGVFbnRyeS5ub2RlLm5hbWUpICB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJyZWFsTm9kZUVudHJ5Lm5vZGUudmlzaWJpbGl0eSAmJiByZWFsTm9kZUVudHJ5Lm5vZGUudmlzaWJpbGl0eT8uY29uZGl0aW9uICE9PSAndHJ1ZSdcIlxuICAgICAgICAgICAgY2xhc3M9XCJhamYtdmlzaWJpbGl0eS1jb25kaXRpb25cIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCInQ29uZGl0aW9uOiAoJyArIHJlYWxOb2RlRW50cnkubm9kZS52aXNpYmlsaXR5LmNvbmRpdGlvbiArICcpJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImFqZi1hY3Rpb25zXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIoY3VycmVudEVkaXRlZE5vZGV8YXN5bmMpID09PSBub2RlRW50cnlcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZGVsZXRlKCRldmVudClcIiBtYXQtaWNvbi1idXR0b24+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY2FyZENvbnRlbnQ+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJoYXNDb250ZW50XCI+XG4gICAgICAgICAgPGFqZi1mYi1ub2RlLWVudHJ5XG4gICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgY2xhc3M9XCJhamYtZmllbGRzLWxpc3RcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRlbnRFbnRyeSBvZiByZWFsTm9kZUVudHJ5LmNvbnRlbnQ7IGxldCBpc0ZpcnN0Q2hpbGQgPSBmaXJzdDsgbGV0IGlkeCA9IGluZGV4XCJcbiAgICAgICAgICAgIFtpZF09XCJhc3NpZ25JZCgpXCJcbiAgICAgICAgICAgIFtsZXZlbF09XCJsZXZlbCArIDFcIlxuICAgICAgICAgICAgW2lzRmlyc3RdPVwiaXNGaXJzdENoaWxkXCJcbiAgICAgICAgICAgIFtmaXJzdEJyYW5jaENvbG9yXT1cImJyYW5jaENvbG9yc1tpZHhdXCJcbiAgICAgICAgICAgIFtub2RlRW50cnldPVwiY29udGVudEVudHJ5XCJcbiAgICAgICAgICAgIFtjZGtEcm9wTGlzdEVudGVyUHJlZGljYXRlXT1cImRpc2FibGVTbGlkZURyb3BcIlxuICAgICAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkRyb3AoJGV2ZW50LCB0cnVlKVwiXG4gICAgICAgICAgPjwvYWpmLWZiLW5vZGUtZW50cnk+XG4gICAgICAgICAgPG1hdC1jYXJkXG4gICAgICAgICAgICBhcHBlYXJhbmNlPVwib3V0bGluZWRcIlxuICAgICAgICAgICAgY2xhc3M9XCJhamYtZW1wdHlcIlxuICAgICAgICAgICAgKm5nSWY9XCJyZWFsTm9kZUVudHJ5LmNvbnRlbnQubGVuZ3RoID09PSAwXCJcbiAgICAgICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgICAgICBbaWRdPVwiYXNzaWduSWQodHJ1ZSlcIlxuICAgICAgICAgICAgW2Nka0Ryb3BMaXN0RW50ZXJQcmVkaWNhdGVdPVwiZGlzYWJsZVNsaWRlRHJvcFwiXG4gICAgICAgICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cIm9uRHJvcCgkZXZlbnQsIHRydWUpXCJcbiAgICAgICAgICAgID48bWF0LWNhcmQtdGl0bGU+RHJvcCB5b3VyIGZpZWxkcyBoZXJlPC9tYXQtY2FyZC10aXRsZT48L21hdC1jYXJkXG4gICAgICAgICAgPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImlzTm9kZUVudHJ5XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hpbGROb2RlRW50cnkgb2YgcmVhbE5vZGVFbnRyeS5jaGlsZHJlbjsgbGV0IGlkeCA9IGluZGV4XCI+XG4gICAgICA8YWpmLWZiLW5vZGUtZW50cnlcbiAgICAgICAgKm5nSWY9XCIhaXNMYXN0Tm9kZSgpXCJcbiAgICAgICAgW2xldmVsXT1cImxldmVsXCJcbiAgICAgICAgW29yaWdpbk9mZnNldF09XCJpZHhcIlxuICAgICAgICBbZmlyc3RCcmFuY2hDb2xvcl09XCJicmFuY2hDb2xvcnNbaWR4XVwiXG4gICAgICAgIFtub2RlRW50cnldPVwiY2hpbGROb2RlRW50cnlcIlxuICAgICAgPjwvYWpmLWZiLW5vZGUtZW50cnk+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctdGVtcGxhdGU+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNyb290RW1wdHk+XG4gIDxkaXYgY2xhc3M9XCJtYXQtY2FyZC1jb250YWluZXJcIj5cbiAgICA8bWF0LWNhcmRcbiAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lZFwiXG4gICAgICBjbGFzcz1cImFqZi1lbXB0eVwiXG4gICAgICBjZGtEcm9wTGlzdFxuICAgICAgW2Nka0Ryb3BMaXN0RW50ZXJQcmVkaWNhdGVdPVwiZW1wdHlBcmVhRHJvcFByZWRpY2F0ZSgpXCJcbiAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25Ecm9wKCRldmVudClcIlxuICAgICAgPjxtYXQtY2FyZC10aXRsZT5Ecm9wIHlvdXIgc2xpZGVzIGhlcmU8L21hdC1jYXJkLXRpdGxlPlxuICAgIDwvbWF0LWNhcmQ+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==