@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
@@ -0,0 +1,183 @@
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
+ get form() {
26
+ return this._form;
27
+ }
28
+ set form(form) {
29
+ if (this._form !== form) {
30
+ this._form = form;
31
+ if (this._init) {
32
+ this._setCurrentForm();
33
+ }
34
+ }
35
+ }
36
+ get nodeTypes() {
37
+ return this._nodeTypes;
38
+ }
39
+ get nodeEntriesTree() {
40
+ return this._nodeEntriesTree;
41
+ }
42
+ get choicesOrigins() {
43
+ return this._choicesOrigins;
44
+ }
45
+ get connectedDropLists() {
46
+ return this._connectedDropLists;
47
+ }
48
+ constructor(_service, _dialog) {
49
+ this._service = _service;
50
+ this._dialog = _dialog;
51
+ /**
52
+ * The list of the ids of all the dropLists connected to the formbuilder source list.
53
+ */
54
+ this._connectedDropLists = this._service.connectedDropLists;
55
+ this._vc = new EventEmitter();
56
+ this._init = false;
57
+ this._editConditionSub = Subscription.EMPTY;
58
+ this._editConditionDialog = null;
59
+ this._beforeNodesUpdateSub = Subscription.EMPTY;
60
+ this._editChoicesOriginSub = Subscription.EMPTY;
61
+ this._editChoicesOriginDialog = null;
62
+ this._stringIdentifierDialog = null;
63
+ this._stringIdentifierSub = Subscription.EMPTY;
64
+ this._lastScrollTop = 0;
65
+ this._nodeTypes = _service.availableNodeTypes;
66
+ this._nodeEntriesTree = _service.nodeEntriesTree;
67
+ this._choicesOrigins = _service.choicesOrigins;
68
+ this._editConditionSub = this._service.editedCondition.subscribe((condition) => {
69
+ if (this._editConditionDialog != null) {
70
+ this._editConditionDialog.close();
71
+ this._editConditionDialog = null;
72
+ }
73
+ if (condition != null) {
74
+ this._editConditionDialog = this._dialog.open(AjfFbConditionEditorDialog, {
75
+ disableClose: true,
76
+ });
77
+ }
78
+ });
79
+ this._editChoicesOriginSub = this._service.editedChoicesOrigin.subscribe((choicesOrigin) => {
80
+ if (this._editChoicesOriginDialog != null) {
81
+ this._editChoicesOriginDialog.close();
82
+ this._editChoicesOriginDialog = null;
83
+ }
84
+ if (choicesOrigin != null) {
85
+ this._editChoicesOriginDialog = this._dialog.open(AjfFbChoicesOriginEditorDialog, {
86
+ disableClose: true,
87
+ });
88
+ }
89
+ });
90
+ this._beforeNodesUpdateSub = this._service.beforeNodesUpdate.subscribe(() => {
91
+ if (this.designerCont == null) {
92
+ return;
93
+ }
94
+ this._lastScrollTop = this.designerCont.nativeElement.scrollTop;
95
+ });
96
+ this.nodeEntriesTree.pipe(sample(this._vc)).subscribe(() => {
97
+ if (this.designerCont == null) {
98
+ return;
99
+ }
100
+ this.designerCont.nativeElement.scrollTop = this._lastScrollTop;
101
+ });
102
+ this._stringIdentifierSub = this._service.stringIdentifier.subscribe(() => { });
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
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AjfFormBuilder, deps: [{ token: i1.AjfFormBuilderService }, { token: i2.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
172
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", 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 }); }
173
+ }
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwvZm9ybS1idWlsZGVyL3NyYy9mb3JtLWJ1aWxkZXIudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXRlcmlhbC9mb3JtLWJ1aWxkZXIvc3JjL2Zvcm0tYnVpbGRlci5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXlCQSxPQUFPLEVBR0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLFNBQVMsRUFDVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFhLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEMsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUUsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFNckUsT0FBTyxFQUFDLHlCQUF5QixFQUFFLGFBQWEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlFLE9BQU8sRUFBQyxvQ0FBb0MsRUFBQyxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQVNoRixNQUFNLE9BQU8sY0FBYztJQUl6QixJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUNELElBQ0ksSUFBSSxDQUFDLElBQXlCO1FBQ2hDLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNkLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN4QjtTQUNGO0lBQ0gsQ0FBQztJQUdELElBQUksU0FBUztRQUNYLE9BQU8sSUFB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cEI7SUFDSCxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3RCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDOytHQXJMVSxjQUFjO21HQUFkLGNBQWMsME1DM0QzQiwrOUVBOERBOzs0RkRIYSxjQUFjO2tCQVAxQixTQUFTOytCQUNFLGtCQUFrQixtQkFHWCx1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJO29JQUdFLFlBQVk7c0JBQWxELFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFPakMsSUFBSTtzQkFEUCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChDKSBHbnVjb29wIHNvYy4gY29vcC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzXG4gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSxcbiAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKiBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLlxuICpcbiAqL1xuXG5pbXBvcnQge0FqZkNob2ljZXNPcmlnaW4sIEFqZkZvcm19IGZyb20gJ0BhamYvY29yZS9mb3Jtcyc7XG5pbXBvcnQge0FqZkNvbmRpdGlvbn0gZnJvbSAnQGFqZi9jb3JlL21vZGVscyc7XG5pbXBvcnQge0Nka0RyYWcsIENka0RyYWdEcm9wfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01hdERpYWxvZywgTWF0RGlhbG9nUmVmfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHtNYXRTbGlkZVRvZ2dsZUNoYW5nZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2xpZGUtdG9nZ2xlJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7c2FtcGxlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7QWpmRmJDaG9pY2VzT3JpZ2luRWRpdG9yRGlhbG9nfSBmcm9tICcuL2Nob2ljZXMtb3JpZ2luLWVkaXRvci1kaWFsb2cnO1xuaW1wb3J0IHtBamZGYkNvbmRpdGlvbkVkaXRvckRpYWxvZ30gZnJvbSAnLi9jb25kaXRpb24tZWRpdG9yLWRpYWxvZyc7XG5pbXBvcnQge1xuICBBamZGb3JtQnVpbGRlck5vZGVFbnRyeSxcbiAgQWpmRm9ybUJ1aWxkZXJOb2RlVHlwZUVudHJ5LFxuICBBamZGb3JtQnVpbGRlclNlcnZpY2UsXG59IGZyb20gJy4vZm9ybS1idWlsZGVyLXNlcnZpY2UnO1xuaW1wb3J0IHtkaXNhYmxlRmllbGREcm9wUHJlZGljYXRlLCBvbkRyb3BQcm9jZXNzfSBmcm9tICcuL2Zvcm0tYnVpbGRlci11dGlscyc7XG5pbXBvcnQge0FqZkZiU3RyaW5nSWRlbnRpZmllckRpYWxvZ0NvbXBvbmVudH0gZnJvbSAnLi9zdHJpbmctaWRlbnRpZmllci1kaWFsb2cnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhamYtZm9ybS1idWlsZGVyJyxcbiAgdGVtcGxhdGVVcmw6ICdmb3JtLWJ1aWxkZXIuaHRtbCcsXG4gIHN0eWxlVXJsczogWydmb3JtLWJ1aWxkZXIuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQWpmRm9ybUJ1aWxkZXIgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdkZXNpZ25lcicsIHtzdGF0aWM6IHRydWV9KSBkZXNpZ25lckNvbnQhOiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgX2Zvcm06IEFqZkZvcm0gfCB1bmRlZmluZWQ7XG4gIGdldCBmb3JtKCk6IEFqZkZvcm0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBmb3JtKGZvcm06IEFqZkZvcm0gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodGhpcy5fZm9ybSAhPT0gZm9ybSkge1xuICAgICAgdGhpcy5fZm9ybSA9IGZvcm07XG4gICAgICBpZiAodGhpcy5faW5pdCkge1xuICAgICAgICB0aGlzLl9zZXRDdXJyZW50Rm9ybSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX25vZGVUeXBlczogQWpmRm9ybUJ1aWxkZXJOb2RlVHlwZUVudHJ5W107XG4gIGdldCBub2RlVHlwZXMoKTogQWpmRm9ybUJ1aWxkZXJOb2RlVHlwZUVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLl9ub2RlVHlwZXM7XG4gIH1cblxuICBwcml2YXRlIF9ub2RlRW50cmllc1RyZWU6IE9ic2VydmFibGU8QWpmRm9ybUJ1aWxkZXJOb2RlRW50cnlbXT47XG4gIGdldCBub2RlRW50cmllc1RyZWUoKTogT2JzZXJ2YWJsZTxBamZGb3JtQnVpbGRlck5vZGVFbnRyeVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuX25vZGVFbnRyaWVzVHJlZTtcbiAgfVxuXG4gIHByaXZhdGUgX2Nob2ljZXNPcmlnaW5zOiBPYnNlcnZhYmxlPEFqZkNob2ljZXNPcmlnaW48YW55PltdPjtcbiAgZ2V0IGNob2ljZXNPcmlnaW5zKCk6IE9ic2VydmFibGU8QWpmQ2hvaWNlc09yaWdpbjxhbnk+W10+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hvaWNlc09yaWdpbnM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgdGhlIGlkcyBvZiBhbGwgdGhlIGRyb3BMaXN0cyBjb25uZWN0ZWQgdG8gdGhlIGZvcm1idWlsZGVyIHNvdXJjZSBsaXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBfY29ubmVjdGVkRHJvcExpc3RzOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiA9IHRoaXMuX3NlcnZpY2UuY29ubmVjdGVkRHJvcExpc3RzO1xuICBnZXQgY29ubmVjdGVkRHJvcExpc3RzKCk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGVkRHJvcExpc3RzO1xuICB9XG5cbiAgcHJpdmF0ZSBfdmM6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIF9pbml0ID0gZmFsc2U7XG4gIHByaXZhdGUgX2VkaXRDb25kaXRpb25TdWI6IFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgcHJpdmF0ZSBfZWRpdENvbmRpdGlvbkRpYWxvZzogTWF0RGlhbG9nUmVmPEFqZkZiQ29uZGl0aW9uRWRpdG9yRGlhbG9nPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9iZWZvcmVOb2Rlc1VwZGF0ZVN1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9lZGl0Q2hvaWNlc09yaWdpblN1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9lZGl0Q2hvaWNlc09yaWdpbkRpYWxvZzogTWF0RGlhbG9nUmVmPEFqZkZiQ2hvaWNlc09yaWdpbkVkaXRvckRpYWxvZz4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3RyaW5nSWRlbnRpZmllckRpYWxvZzogTWF0RGlhbG9nUmVmPEFqZkZiU3RyaW5nSWRlbnRpZmllckRpYWxvZ0NvbXBvbmVudD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3RyaW5nSWRlbnRpZmllclN1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIHByaXZhdGUgX2xhc3RTY3JvbGxUb3A6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc2VydmljZTogQWpmRm9ybUJ1aWxkZXJTZXJ2aWNlLCBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZykge1xuICAgIHRoaXMuX25vZGVUeXBlcyA9IF9zZXJ2aWNlLmF2YWlsYWJsZU5vZGVUeXBlcztcbiAgICB0aGlzLl9ub2RlRW50cmllc1RyZWUgPSBfc2VydmljZS5ub2RlRW50cmllc1RyZWU7XG4gICAgdGhpcy5fY2hvaWNlc09yaWdpbnMgPSBfc2VydmljZS5jaG9pY2VzT3JpZ2lucztcbiAgICB0aGlzLl9lZGl0Q29uZGl0aW9uU3ViID0gdGhpcy5fc2VydmljZS5lZGl0ZWRDb25kaXRpb24uc3Vic2NyaWJlKFxuICAgICAgKGNvbmRpdGlvbjogQWpmQ29uZGl0aW9uIHwgbnVsbCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fZWRpdENvbmRpdGlvbkRpYWxvZyAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fZWRpdENvbmRpdGlvbkRpYWxvZy5jbG9zZSgpO1xuICAgICAgICAgIHRoaXMuX2VkaXRDb25kaXRpb25EaWFsb2cgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25kaXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX2VkaXRDb25kaXRpb25EaWFsb2cgPSB0aGlzLl9kaWFsb2cub3BlbihBamZGYkNvbmRpdGlvbkVkaXRvckRpYWxvZywge1xuICAgICAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gICAgdGhpcy5fZWRpdENob2ljZXNPcmlnaW5TdWIgPSB0aGlzLl9zZXJ2aWNlLmVkaXRlZENob2ljZXNPcmlnaW4uc3Vic2NyaWJlKFxuICAgICAgKGNob2ljZXNPcmlnaW46IEFqZkNob2ljZXNPcmlnaW48YW55PiB8IG51bGwpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2VkaXRDaG9pY2VzT3JpZ2luRGlhbG9nICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9lZGl0Q2hvaWNlc09yaWdpbkRpYWxvZy5jbG9zZSgpO1xuICAgICAgICAgIHRoaXMuX2VkaXRDaG9pY2VzT3JpZ2luRGlhbG9nID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hvaWNlc09yaWdpbiAhPSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fZWRpdENob2ljZXNPcmlnaW5EaWFsb2cgPSB0aGlzLl9kaWFsb2cub3BlbihBamZGYkNob2ljZXNPcmlnaW5FZGl0b3JEaWFsb2csIHtcbiAgICAgICAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5fYmVmb3JlTm9kZXNVcGRhdGVTdWIgPSB0aGlzLl9zZXJ2aWNlLmJlZm9yZU5vZGVzVXBkYXRlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXNpZ25lckNvbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9sYXN0U2Nyb2xsVG9wID0gdGhpcy5kZXNpZ25lckNvbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgfSk7XG5cbiAgICB0aGlzLm5vZGVFbnRyaWVzVHJlZS5waXBlKHNhbXBsZSg8T2JzZXJ2YWJsZTx2b2lkPj50aGlzLl92YykpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kZXNpZ25lckNvbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmRlc2lnbmVyQ29udC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMuX2xhc3RTY3JvbGxUb3A7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9zdHJpbmdJZGVudGlmaWVyU3ViID0gdGhpcy5fc2VydmljZS5zdHJpbmdJZGVudGlmaWVyLnN1YnNjcmliZSgoKSA9PiB7fSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5fdmMuZW1pdCgpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3NldEN1cnJlbnRGb3JtKCk7XG4gICAgdGhpcy5faW5pdCA9IHRydWU7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0Q29uZGl0aW9uU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fYmVmb3JlTm9kZXNVcGRhdGVTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9lZGl0Q2hvaWNlc09yaWdpblN1Yi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3N0cmluZ0lkZW50aWZpZXJTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9zZXJ2aWNlLnNldEZvcm0obnVsbCk7XG4gICAgdGhpcy5fc2VydmljZS5yZXNldE5vZGVFbnRyaWVzVHJlZUV4cGFuZGVkU3RhdHVzKCk7XG4gICAgdGhpcy5fc2VydmljZS5yZXNldEVtcHR5Q291bnRlcnMoKTtcbiAgfVxuXG4gIGNyZWF0ZUNob2ljZXNPcmlnaW4oKTogdm9pZCB7XG4gICAgdGhpcy5fc2VydmljZS5jcmVhdGVDaG9pY2VzT3JpZ2luKCk7XG4gIH1cblxuICBkaXNhYmxlRHJvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBkaXNhYmxlRmllbGREcm9wKGl0ZW06IENka0RyYWc8QWpmRm9ybUJ1aWxkZXJOb2RlVHlwZUVudHJ5Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkaXNhYmxlRmllbGREcm9wUHJlZGljYXRlKGl0ZW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHdoZW4gYSBmaWVsZCBvciBzbGlkZSBub2RlIGlzIG1vdmVkIG9yIGluc2VydGVkIGJ5IGRyYWcmZHJvcHBpbmcgaW4gdGhlIGZvcm1idWlsZGVyLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGRyb3AgZXZlbnQuXG4gICAqIEBwYXJhbSBjb250ZW50IFRydWUgaWYgdGhlIGN1cnJlbnQgbm9kZUVudHJ5IGNvbnRhaW5zIG90aGVyIG5vZGVFbnRyaWVzLlxuICAgKi9cbiAgb25Ecm9wKFxuICAgIGV2ZW50OiBDZGtEcmFnRHJvcDxBamZGb3JtQnVpbGRlck5vZGVFbnRyeT4gfCBDZGtEcmFnRHJvcDxBamZGb3JtQnVpbGRlck5vZGVUeXBlRW50cnk+LFxuICAgIGNvbnRlbnQgPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgb25Ecm9wUHJvY2VzcyhldmVudCwgdGhpcy5fc2VydmljZSwgbnVsbCwgY29udGVudCk7XG4gIH1cblxuICBlZGl0Q2hvaWNlc09yaWdpbihjaG9pY2VzT3JpZ2luOiBBamZDaG9pY2VzT3JpZ2luPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLl9zZXJ2aWNlLmVkaXRDaG9pY2VzT3JpZ2luKGNob2ljZXNPcmlnaW4pO1xuICB9XG5cbiAgZWRpdFN0cmluZ0lkZW50aWZpZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N0cmluZ0lkZW50aWZpZXJEaWFsb2cgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fc3RyaW5nSWRlbnRpZmllckRpYWxvZy5jbG9zZSgpO1xuICAgICAgdGhpcy5fc3RyaW5nSWRlbnRpZmllckRpYWxvZyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuX3N0cmluZ0lkZW50aWZpZXJEaWFsb2cgPSB0aGlzLl9kaWFsb2cub3BlbihBamZGYlN0cmluZ0lkZW50aWZpZXJEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgIHdpZHRoOiAnNjAlJyxcbiAgICAgIGhlaWdodDogJzYwJScsXG4gICAgfSk7XG4gIH1cblxuICBleHBhbmRBbGwoKSB7XG4gICAgdGhpcy5fc2VydmljZS5leHBhbmRBbGwoKTtcbiAgfVxuXG4gIGNvbGxhcHNlQWxsKCkge1xuICAgIHRoaXMuX3NlcnZpY2UuY29sbGFwc2VBbGwoKTtcbiAgfVxuXG4gIGV4cGFuZFRvZ2dsZShldnQ6IE1hdFNsaWRlVG9nZ2xlQ2hhbmdlKSB7XG4gICAgaWYgKGV2dC5jaGVja2VkKSB7XG4gICAgICB0aGlzLmV4cGFuZEFsbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbGxhcHNlQWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q3VycmVudEZvcm0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2Zvcm0gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXJ2aWNlLnNldEZvcm0odGhpcy5fZm9ybSk7XG4gIH1cbn1cbiIsIjxtYXQtdG9vbGJhciBjbGFzcz1cImFqZi1mb3JtYnVpbGRlci10b29sYmFyXCI+XG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJsZWZ0U2lkZW5hdi50b2dnbGUoKVwiPlxuICAgIDxtYXQtaWNvbj5hZGRfYm94PC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG4gIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY2hvaWNlc01lbnVcIj57eydDaG9pY2VzJ3x0cmFuc2xvY299fTwvYnV0dG9uPlxuICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cImVkaXRTdHJpbmdJZGVudGlmaWVyKClcIj57eydJZGVudGlmaWVyJ3x0cmFuc2xvY299fTwvYnV0dG9uPlxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBhcmlhLWxhYmVsPVwiQ29sbGFwc2VkXCIgbWF0VG9vbHRpcD1cIktlZXAgc2xpZGVzIGNvbGxhcHNlZFwiPlxuICAgIDxtYXQtaWNvbj51bmZvbGRfbGVzczwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuICA8bWF0LXNsaWRlLXRvZ2dsZSBjb2xvcj1cInByaW1hcnlcIiAoY2hhbmdlKT1cImV4cGFuZFRvZ2dsZSgkZXZlbnQpXCI+PC9tYXQtc2xpZGUtdG9nZ2xlPlxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBhcmlhLWxhYmVsPVwiRXhwYW5kZWRcIiBtYXRUb29sdGlwPVwiS2VlcCBzbGlkZXMgZXhwYW5kZWRcIj5cbiAgICA8bWF0LWljb24+dW5mb2xkX21vcmU8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cbiAgPG1hdC1tZW51ICNjaG9pY2VzTWVudT5cbiAgICA8YnV0dG9uIChjbGljayk9XCJjcmVhdGVDaG9pY2VzT3JpZ2luKClcIiBtYXQtbWVudS1pdGVtPnt7J05ldy4uJ3x0cmFuc2xvY299fTwvYnV0dG9uPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaG9pY2VzT3JpZ2luc3xhc3luYyBhcyBjb3NcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgKm5nRm9yPVwibGV0IGNob2ljZXNPcmlnaW4gb2YgY29zXCJcbiAgICAgICAgKGNsaWNrKT1cImVkaXRDaG9pY2VzT3JpZ2luKGNob2ljZXNPcmlnaW4pXCJcbiAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgPlxuICAgICAgICB7eyAoY2hvaWNlc09yaWdpbi5sYWJlbCB8fCBjaG9pY2VzT3JpZ2luLm5hbWUpfCB0cmFuc2xvY28gfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L21hdC1tZW51PlxuICA8c3BhbiBjbGFzcz1cImFqZi1zcGFjZXJcIj48L3NwYW4+XG48L21hdC10b29sYmFyPlxuPGRpdiBjbGFzcz1cImFqZi1mb3JtdHJlZS1jb250YWluZXJcIj5cbiAgPG1hdC1kcmF3ZXItY29udGFpbmVyIGNka0Ryb3BMaXN0R3JvdXAgY2xhc3M9XCJhamYtZm9ybXRyZWUtZHJhd2VyLWNvbnRhaW5lclwiPlxuICAgIDxtYXQtZHJhd2VyICNsZWZ0U2lkZW5hdiBwb3NpdGlvbj1cInN0YXJ0XCIgbW9kZT1cIm92ZXJcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgI3NvdXJjZURyb3BMaXN0XG4gICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgIFtjZGtEcm9wTGlzdENvbm5lY3RlZFRvXT1cIihjb25uZWN0ZWREcm9wTGlzdHN8YXN5bmMpIVwiXG4gICAgICAgIFtjZGtEcm9wTGlzdEVudGVyUHJlZGljYXRlXT1cImRpc2FibGVEcm9wXCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJub2RlVHlwZXNcIlxuICAgICAgPlxuICAgICAgICA8YWpmLWZiLW5vZGUtdHlwZS1lbnRyeVxuICAgICAgICAgICpuZ0Zvcj1cImxldCBub2RlVHlwZSBvZiBub2RlVHlwZXNcIlxuICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwibm9kZVR5cGVcIlxuICAgICAgICAgIChjZGtEcmFnU3RhcnRlZCk9XCJsZWZ0U2lkZW5hdi5jbG9zZSgpXCJcbiAgICAgICAgICBbbm9kZVR5cGVdPVwibm9kZVR5cGVcIlxuICAgICAgICA+PC9hamYtZmItbm9kZS10eXBlLWVudHJ5PlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtZHJhd2VyPlxuICAgIDxkaXYgI2Rlc2lnbmVyIGNsYXNzPVwiYWpmLWRlc2lnbmVyXCI+XG4gICAgICA8YWpmLWZiLW5vZGUtZW50cnlcbiAgICAgICAgaWQ9XCJzbGlkZXMtbGlzdFwiXG4gICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25Ecm9wKCRldmVudClcIlxuICAgICAgICBbY2RrRHJvcExpc3RFbnRlclByZWRpY2F0ZV09XCJkaXNhYmxlRmllbGREcm9wXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IG5vZGVFbnRyeSBvZiAobm9kZUVudHJpZXNUcmVlfGFzeW5jKTsgbGV0IGlzRmlyc3QgPSBmaXJzdFwiXG4gICAgICAgIFtpc0ZpcnN0XT1cImlzRmlyc3RcIlxuICAgICAgICBbbm9kZUVudHJ5XT1cIm5vZGVFbnRyeVwiXG4gICAgICA+PC9hamYtZmItbm9kZS1lbnRyeT5cbiAgICA8L2Rpdj5cbiAgPC9tYXQtZHJhd2VyLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImFqZi1mb3JtdHJlZS1wcm9wZXJ0aWVzXCIgI3JpZ2h0U2lkZW5hdiBwb3NpdGlvbj1cImVuZFwiIG1vZGU9XCJzaWRlXCI+XG4gICAgPGFqZi1mYi1ub2RlLXByb3BlcnRpZXM+PC9hamYtZmItbm9kZS1wcm9wZXJ0aWVzPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,267 @@
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, forwardRef, 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
+ get hasContent() {
47
+ return this._hasContent;
48
+ }
49
+ get isFirst() {
50
+ return this._isFirst;
51
+ }
52
+ set isFirst(isFirst) {
53
+ this._isFirst = isFirst;
54
+ }
55
+ get isNodeEntry() {
56
+ return this._isNodeEntry;
57
+ }
58
+ get nodeEntry() {
59
+ return this._nodeEntry;
60
+ }
61
+ set nodeEntry(nodeEntry) {
62
+ this._nodeEntry = nodeEntry;
63
+ if (nodeEntry != null && nodeEntry.node !== void 0) {
64
+ const ne = nodeEntry;
65
+ this._isNodeEntry = true;
66
+ const node = ne.node;
67
+ this._hasContent = node != null && isContainerNode(node);
68
+ }
69
+ else {
70
+ this._isNodeEntry = false;
71
+ this._hasContent = false;
72
+ }
73
+ }
74
+ get level() {
75
+ return this._level;
76
+ }
77
+ set level(value) {
78
+ this._level = value;
79
+ }
80
+ get isDraggable() {
81
+ return this._isDraggable;
82
+ }
83
+ set isDraggable(draggable) {
84
+ this._isDraggable = draggable;
85
+ }
86
+ get realNodeEntry() {
87
+ return this._nodeEntry;
88
+ }
89
+ get branchColors() {
90
+ return this._branchColors;
91
+ }
92
+ get dropZones() {
93
+ return this._dropZones;
94
+ }
95
+ get slideDropZones() {
96
+ return this._slideDropZones;
97
+ }
98
+ get originOffset() {
99
+ return this._originOffset;
100
+ }
101
+ set originOffset(originOffset) {
102
+ this._originOffset = originOffset;
103
+ this._originLeftMargin = `${this._originOffset * 4}px`;
104
+ }
105
+ get originLeftMargin() {
106
+ return this._originLeftMargin;
107
+ }
108
+ get firstBranchColor() {
109
+ return this._firstBranchColor;
110
+ }
111
+ set firstBranchColor(firstBranchColor) {
112
+ const idx = branchColors.indexOf(firstBranchColor);
113
+ if (idx > 0) {
114
+ this._firstBranchColor = firstBranchColor;
115
+ this._branchColors = branchColors.slice(idx).concat(branchColors.slice(0, idx));
116
+ }
117
+ else {
118
+ this._firstBranchColor = branchColors[0];
119
+ this._branchColors = branchColors.slice(0);
120
+ }
121
+ }
122
+ get currentEditedNode() {
123
+ return this._currentEditedNode;
124
+ }
125
+ constructor(_service) {
126
+ this._service = _service;
127
+ this._hasContent = false;
128
+ this._isFirst = false;
129
+ this._isNodeEntry = false;
130
+ this._level = 0;
131
+ this._isDraggable = true;
132
+ this._branchColors = branchColors.slice(0);
133
+ this._dropZones = ['fbdz-node'];
134
+ this._slideDropZones = ['fbdz-slide'];
135
+ this._originOffset = 0;
136
+ this._originLeftMargin = '0';
137
+ this._firstBranchColor = branchColors[0];
138
+ this._branchLinesSubscription = Subscription.EMPTY;
139
+ this._childEntriesSubscription = Subscription.EMPTY;
140
+ this._currentEditedNode = this._service.editedNodeEntry;
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
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AjfFbNodeEntry, deps: [{ token: i1.AjfFormBuilderService }], target: i0.ɵɵFactoryTarget.Component }); }
243
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", 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: i0.forwardRef(function () { return 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:#fff;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:#fff;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 }); }
244
+ }
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", 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:#fff;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:#fff;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: [forwardRef(() => 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1lbnRyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL2Zvcm0tYnVpbGRlci9zcmMvbm9kZS1lbnRyeS50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hdGVyaWFsL2Zvcm0tYnVpbGRlci9zcmMvbm9kZS1lbnRyeS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE9BQU8sRUFBVSxlQUFlLEVBQUUsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkUsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixLQUFLLEVBR0wsWUFBWSxFQUNaLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWEsWUFBWSxFQUFFLEVBQUUsSUFBSSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFM0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQU85QyxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixhQUFhLEdBQ2QsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7O0FBRTlCLE1BQU0sWUFBWSxHQUFhO0lBQzdCLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTLEVBQUUsUUFBUTtDQUNwQixDQUFDO0FBV0YsTUFBTSxPQUFPLGNBQWM7SUFNekIsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFHRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQ0ksT0FBTyxDQUFDLE9BQWdCO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFHRCxJQUFJLFdBQVc7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QUFtQixRQUl2QixFQUFDLGlCQUFpQixFQUFFLFlBQVksRUFBQyxpQkFDeEIsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTTs0R0FHaEIsV0FBVztzQkFBekMsWUFBWTt1QkFBQyxlQUFlO2dCQUU3QixZQUFZO3NCQURYLFlBQVk7dUJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBQztnQkFhOUQsT0FBTztzQkFEVixLQUFLO2dCQWVGLFNBQVM7c0JBRFosS0FBSztnQkFtQkYsS0FBSztzQkFEUixLQUFLO2dCQVNGLFdBQVc7c0JBRGQsS0FBSztnQkE2QkYsWUFBWTtzQkFEZixLQUFLO2dCQWVGLGdCQUFnQjtzQkFEbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAoQykgR251Y29vcCBzb2MuIGNvb3AuXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3JcbiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhc1xuICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsXG4gKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEFmZmVyb1xuICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpLlxuICogSWYgbm90LCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLy5cbiAqXG4gKi9cblxuaW1wb3J0IHtBamZOb2RlLCBpc0NvbnRhaW5lck5vZGUsIGlzU2xpZGVzTm9kZX0gZnJvbSAnQGFqZi9jb3JlL2Zvcm1zJztcbmltcG9ydCB7Q2RrRHJhZywgQ2RrRHJhZ0Ryb3AsIENka0Ryb3BMaXN0fSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkcmVuLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgb2YgYXMgb2JzT2Z9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0FqZkZiQnJhbmNoTGluZX0gZnJvbSAnLi9icmFuY2gtbGluZSc7XG5pbXBvcnQge1xuICBBamZGb3JtQnVpbGRlck5vZGUsXG4gIEFqZkZvcm1CdWlsZGVyTm9kZUVudHJ5LFxuICBBamZGb3JtQnVpbGRlck5vZGVUeXBlRW50cnksXG4gIEFqZkZvcm1CdWlsZGVyU2VydmljZSxcbn0gZnJvbSAnLi9mb3JtLWJ1aWxkZXItc2VydmljZSc7XG5pbXBvcnQge1xuICBkaXNhYmxlRmllbGREcm9wUHJlZGljYXRlLFxuICBkaXNhYmxlU2xpZGVEcm9wUHJlZGljYXRlLFxuICBvbkRyb3BQcm9jZXNzLFxufSBmcm9tICcuL2Zvcm0tYnVpbGRlci11dGlscyc7XG5cbmNvbnN0IGJyYW5jaENvbG9yczogc3RyaW5nW10gPSBbXG4gICcjRjQ0MzM2JywgLy8gUkVEXG4gICcjNENBRjUwJywgLy8gR1JFRU5cbiAgJyMzRjUxQjUnLCAvLyBJTkRJR09cbiAgJyNGRkMxMDcnLCAvLyBBTUJFUlxuICAnIzc5NTU0OCcsIC8vIEJST1dOXG5dO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhamYtZmItbm9kZS1lbnRyeScsXG4gIHRlbXBsYXRlVXJsOiAnbm9kZS1lbnRyeS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ25vZGUtZW50cnkuc2NzcyddLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgaG9zdDogeycod2luZG93LnJlc2l6ZSknOiAnb25SZXNpemUoKSd9LFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQWpmRmJOb2RlRW50cnkgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkcmVuKEFqZkZiQnJhbmNoTGluZSkgYnJhbmNoTGluZXMhOiBRdWVyeUxpc3Q8QWpmRmJCcmFuY2hMaW5lPjtcbiAgQFZpZXdDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IEFqZkZiTm9kZUVudHJ5KSwge3JlYWQ6IEVsZW1lbnRSZWZ9KVxuICBjaGlsZEVudHJpZXMhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZj47XG5cbiAgcHJpdmF0ZSBfaGFzQ29udGVudCA9IGZhbHNlO1xuICBnZXQgaGFzQ29udGVudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGFzQ29udGVudDtcbiAgfVxuXG4gIHByaXZhdGUgX2lzRmlyc3QgPSBmYWxzZTtcbiAgZ2V0IGlzRmlyc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRmlyc3Q7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGlzRmlyc3QoaXNGaXJzdDogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzRmlyc3QgPSBpc0ZpcnN0O1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNOb2RlRW50cnkgPSBmYWxzZTtcbiAgZ2V0IGlzTm9kZUVudHJ5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc05vZGVFbnRyeTtcbiAgfVxuXG4gIHByaXZhdGUgX25vZGVFbnRyeTogQWpmRm9ybUJ1aWxkZXJOb2RlIHwgdW5kZWZpbmVkO1xuICBnZXQgbm9kZUVudHJ5KCk6IEFqZkZvcm1CdWlsZGVyTm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX25vZGVFbnRyeTtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgbm9kZUVudHJ5KG5vZGVFbnRyeTogQWpmRm9ybUJ1aWxkZXJOb2RlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fbm9kZUVudHJ5ID0gbm9kZUVudHJ5O1xuICAgIGlmIChub2RlRW50cnkgIT0gbnVsbCAmJiAoPEFqZkZvcm1CdWlsZGVyTm9kZUVudHJ5Pm5vZGVFbnRyeSkubm9kZSAhPT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBuZSA9IDxBamZGb3JtQnVpbGRlck5vZGVFbnRyeT5ub2RlRW50cnk7XG4gICAgICB0aGlzLl9pc05vZGVFbnRyeSA9IHRydWU7XG4gICAgICBjb25zdCBub2RlID0gbmUubm9kZTtcbiAgICAgIHRoaXMuX2hhc0NvbnRlbnQgPSBub2RlICE9IG51bGwgJiYgaXNDb250YWluZXJOb2RlKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pc05vZGVFbnRyeSA9IGZhbHNlO1xuICAgICAgdGhpcy5faGFzQ29udGVudCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xldmVsID0gMDtcbiAgZ2V0IGxldmVsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBsZXZlbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbGV2ZWwgPSB2YWx1ZTtcbiAgfVxuICBwcml2YXRlIF9pc0RyYWdnYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIGdldCBpc0RyYWdnYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNEcmFnZ2FibGU7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGlzRHJhZ2dhYmxlKGRyYWdnYWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzRHJhZ2dhYmxlID0gZHJhZ2dhYmxlO1xuICB9XG5cbiAgZ2V0IHJlYWxOb2RlRW50cnkoKTogQWpmRm9ybUJ1aWxkZXJOb2RlRW50cnkge1xuICAgIHJldHVybiB0aGlzLl9ub2RlRW50cnkgYXMgQWpmRm9ybUJ1aWxkZXJOb2RlRW50cnk7XG4gIH1cblxuICBwcml2YXRlIF9icmFuY2hDb2xvcnM6IHN0cmluZ1tdID0gYnJhbmNoQ29sb3JzLnNsaWNlKDApO1xuICBnZXQgYnJhbmNoQ29sb3JzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fYnJhbmNoQ29sb3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBfZHJvcFpvbmVzOiBzdHJpbmdbXSA9IFsnZmJkei1ub2RlJ107XG4gIGdldCBkcm9wWm9uZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9kcm9wWm9uZXM7XG4gIH1cblxuICBwcml2YXRlIF9zbGlkZURyb3Bab25lczogc3RyaW5nW10gPSBbJ2ZiZHotc2xpZGUnXTtcbiAgZ2V0IHNsaWRlRHJvcFpvbmVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fc2xpZGVEcm9wWm9uZXM7XG4gIH1cblxuICBwcml2YXRlIF9vcmlnaW5PZmZzZXQgPSAwO1xuICBnZXQgb3JpZ2luT2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX29yaWdpbk9mZnNldDtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgb3JpZ2luT2Zmc2V0KG9yaWdpbk9mZnNldDogbnVtYmVyKSB7XG4gICAgdGhpcy5fb3JpZ2luT2Zmc2V0ID0gb3JpZ2luT2Zmc2V0O1xuICAgIHRoaXMuX29yaWdpbkxlZnRNYXJnaW4gPSBgJHt0aGlzLl9vcmlnaW5PZmZzZXQgKiA0fXB4YDtcbiAgfVxuICBwcml2YXRlIF9vcmlnaW5MZWZ0TWFyZ2luID0gJzAnO1xuICBnZXQgb3JpZ2luTGVmdE1hcmdpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9vcmlnaW5MZWZ0TWFyZ2luO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlyc3RCcmFuY2hDb2xvciA9IGJyYW5jaENvbG9yc1swXTtcbiAgZ2V0IGZpcnN0QnJhbmNoQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RCcmFuY2hDb2xvcjtcbiAgfVxuICBASW5wdXQoKVxuICBzZXQgZmlyc3RCcmFuY2hDb2xvcihmaXJzdEJyYW5jaENvbG9yOiBzdHJpbmcpIHtcbiAgICBjb25zdCBpZHggPSBicmFuY2hDb2xvcnMuaW5kZXhPZihmaXJzdEJyYW5jaENvbG9yKTtcbiAgICBpZiAoaWR4ID4gMCkge1xuICAgICAgdGhpcy5fZmlyc3RCcmFuY2hDb2xvciA9IGZpcnN0QnJhbmNoQ29sb3I7XG4gICAgICB0aGlzLl9icmFuY2hDb2xvcnMgPSBicmFuY2hDb2xvcnMuc2xpY2UoaWR4KS5jb25jYXQoYnJhbmNoQ29sb3JzLnNsaWNlKDAsIGlkeCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9maXJzdEJyYW5jaENvbG9yID0gYnJhbmNoQ29sb3JzWzBdO1xuICAgICAgdGhpcy5fYnJhbmNoQ29sb3JzID0gYnJhbmNoQ29sb3JzLnNsaWNlKDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2N1cnJlbnRFZGl0ZWROb2RlOiBPYnNlcnZhYmxlPEFqZkZvcm1CdWlsZGVyTm9kZUVudHJ5IHwgbnVsbD47XG4gIGdldCBjdXJyZW50RWRpdGVkTm9kZSgpOiBPYnNlcnZhYmxlPEFqZkZvcm1CdWlsZGVyTm9kZUVudHJ5IHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLl9jdXJyZW50RWRpdGVkTm9kZTtcbiAgfVxuXG4gIHByaXZhdGUgX2JyYW5jaExpbmVzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgX2NoaWxkRW50cmllc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NlcnZpY2U6IEFqZkZvcm1CdWlsZGVyU2VydmljZSkge1xuICAgIHRoaXMuX2N1cnJlbnRFZGl0ZWROb2RlID0gdGhpcy5fc2VydmljZS5lZGl0ZWROb2RlRW50cnk7XG4gIH1cblxuICBvblJlc2l6ZSgpOiB2b2lkIHt9XG5cbiAgZWRpdChldnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICh0aGlzLm5vZGVFbnRyeSA9PSBudWxsIHx8ICF0aGlzLmlzTm9kZUVudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NlcnZpY2UuZWRpdE5vZGVFbnRyeSg8QWpmRm9ybUJ1aWxkZXJOb2RlRW50cnk+dGhpcy5ub2RlRW50cnkpO1xuICB9XG5cbiAgZGVsZXRlKGV2dDogRXZlbnQpOiB2b2lkIHtcbiAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMubm9kZUVudHJ5ID09IG51bGwgfHwgIXRoaXMuaXNOb2RlRW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fc2VydmljZS5jYW5jZWxOb2RlRW50cnlFZGl0KCk7XG4gICAgdGhpcy5fc2VydmljZS5kZWxldGVOb2RlRW50cnkoPEFqZkZvcm1CdWlsZGVyTm9kZUVudHJ5PnRoaXMubm9kZUVudHJ5KTtcbiAgfVxuXG4gIGlzTGFzdE5vZGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnJlYWxOb2RlRW50cnkgfHwgIXRoaXMucmVhbE5vZGVFbnRyeS5jaGlsZHJlbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gIXRoaXMucmVhbE5vZGVFbnRyeS5jaGlsZHJlblswXS5jaGlsZHJlbjtcbiAgfVxuXG4gIGlzU2xpZGUobm9kZTogQWpmTm9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1NsaWRlc05vZGUobm9kZSk7XG4gIH1cblxuICBpc0V4cGFuZGVkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGlmICh0aGlzLl9ub2RlRW50cnkgJiYgJ25vZGUnIGluIHRoaXMuX25vZGVFbnRyeSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NlcnZpY2UuZ2V0RXhwYW5kZWRTdGF0dXModGhpcy5fbm9kZUVudHJ5Lm5vZGUubmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBvYnNPZihmYWxzZSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVCcmFuY2hIZWlnaHRzKCk7XG4gICAgdGhpcy5fY2hpbGRFbnRyaWVzU3Vic2NyaXB0aW9uID0gdGhpcy5jaGlsZEVudHJpZXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVCcmFuY2hIZWlnaHRzKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9icmFuY2hMaW5lc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX2NoaWxkRW50cmllc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHdoZW4gYSBmaWVsZCBvciBzbGlkZSBub2RlIGlzIG1vdmVkIG9yIGluc2VydGVkIGJ5IGRyYWcmZHJvcHBpbmcgaW4gdGhlIGZvcm1idWlsZGVyLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGRyb3AgZXZlbnQuXG4gICAqIEBwYXJhbSBjb250ZW50IFRydWUgaWYgdGhlIGN1cnJlbnQgbm9kZUVudHJ5IGNvbnRhaW5zIG90aGVyIG5vZGVFbnRyaWVzLlxuICAgKi9cbiAgb25Ecm9wKFxuICAgIGV2ZW50OiBDZGtEcmFnRHJvcDxBamZGb3JtQnVpbGRlck5vZGVFbnRyeT4gfCBDZGtEcmFnRHJvcDxBamZGb3JtQnVpbGRlck5vZGVUeXBlRW50cnk+LFxuICAgIGNvbnRlbnQgPSBmYWxzZSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX25vZGVFbnRyeSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG9uRHJvcFByb2Nlc3MoZXZlbnQsIHRoaXMuX3NlcnZpY2UsIHRoaXMuX25vZGVFbnRyeSwgY29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICogQXNzaWducyBhIHByb2dyZXNzaXZlIGlkIHRvIHRoZSBkcm9wTGlzdCwgdG8gY29ubmVjdCBpdCB0byB0aGUgRm9ybUJ1aWxkZXIgc291cmNlIGxpc3QuXG4gICAqIEBwYXJhbSBlbXB0eSBUcnVlIGlmIHRoZSBsaXN0IGlzIG1hcmtlZCBhcyBlbXB0eS5cbiAgICovXG4gIGFzc2lnbklkKGVtcHR5OiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLmFzc2lnbkxpc3RJZCh0aGlzLnJlYWxOb2RlRW50cnkubm9kZSwgZW1wdHkpO1xuICB9XG5cbiAgZGlzYWJsZVNsaWRlRHJvcChpdGVtOiBDZGtEcmFnPEFqZkZvcm1CdWlsZGVyTm9kZVR5cGVFbnRyeT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZGlzYWJsZVNsaWRlRHJvcFByZWRpY2F0ZShpdGVtKTtcbiAgfVxuXG4gIGRpc2FibGVGaWVsZERyb3AoaXRlbTogQ2RrRHJhZzxBamZGb3JtQnVpbGRlck5vZGVUeXBlRW50cnk+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGRpc2FibGVGaWVsZERyb3BQcmVkaWNhdGUoaXRlbSk7XG4gIH1cblxuICBlbXB0eUFyZWFEcm9wUHJlZGljYXRlKCk6IChpdGVtOiBDZGtEcmFnLCBfZHJvcDogQ2RrRHJvcExpc3QpID0+IGJvb2xlYW4ge1xuICAgIHJldHVybiAoaXRlbTogQ2RrRHJhZywgX2Ryb3A6IENka0Ryb3BMaXN0KTogYm9vbGVhbiA9PiB7XG4gICAgICBpZiAodGhpcy5fbGV2ZWwgPiAwKSB7XG4gICAgICAgIHJldHVybiAhaXRlbS5kYXRhLmlzU2xpZGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlbS5kYXRhLmlzU2xpZGUgfHwgZmFsc2U7XG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZUJyYW5jaEhlaWdodHMoZGVsYXk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5ub2RlRW50cnkgPT0gbnVsbCB8fFxuICAgICAgICAhdGhpcy5pc05vZGVFbnRyeSB8fFxuICAgICAgICB0aGlzLmJyYW5jaExpbmVzID09IG51bGwgfHxcbiAgICAgICAgdGhpcy5jaGlsZEVudHJpZXMgPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vZGVFbnRyeSA9IDxBamZGb3JtQnVpbGRlck5vZGVFbnRyeT50aGlzLm5vZGVFbnRyeTtcbiAgICAgIGNvbnN0IGJyYW5jaExpbmVzOiBBamZGYkJyYW5jaExpbmVbXSA9IHRoaXMuYnJhbmNoTGluZXMudG9BcnJheSgpO1xuICAgICAgY29uc3Qgc2xpY2VJZHggPSBub2RlRW50cnkuY29udGVudCAhPSBudWxsID8gbm9kZUVudHJ5LmNvbnRlbnQubGVuZ3RoIDogMDtcbiAgICAgIGNvbnN0IGNoaWxkRW50cmllczogRWxlbWVudFJlZltdID0gdGhpcy5jaGlsZEVudHJpZXMudG9BcnJheSgpLnNsaWNlKHNsaWNlSWR4KTtcblxuICAgICAgaWYgKGJyYW5jaExpbmVzLmxlbmd0aCAhPSBjaGlsZEVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYnJhbmNoTGluZXMuZm9yRWFjaCgoYmw6IEFqZkZiQnJhbmNoTGluZSwgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgY2U6IEVsZW1lbnRSZWYgPSBjaGlsZEVudHJpZXNbaWR4XTtcbiAgICAgICAgYmwuaGVpZ2h0ID0gY2UubmF0aXZlRWxlbWVudC5vZmZzZXRUb3A7XG4gICAgICB9KTtcbiAgICB9LCBkZWxheSk7XG4gIH1cblxuICB1cGRhdGVFeHBhbmRlZFN0YXR1cyhleHBhbmRlZDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl9ub2RlRW50cnkgJiYgJ25vZGUnIGluIHRoaXMuX25vZGVFbnRyeSkge1xuICAgICAgdGhpcy5fc2VydmljZS51cGRhdGVFeHBhbmRlZFN0YXR1cyh0aGlzLl9ub2RlRW50cnkubm9kZS5uYW1lLCBleHBhbmRlZCk7XG4gICAgICB0aGlzLnVwZGF0ZUJyYW5jaEhlaWdodHMoNDAwKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJub2RlRW50cnk7IGVsc2Ugcm9vdEVtcHR5XCI+XG4gIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpc05vZGVFbnRyeSAmJiAhaXNMYXN0Tm9kZSgpXCI+XG4gICAgPGFqZi1mYi1icmFuY2gtbGluZVxuICAgICAgKm5nRm9yPVwibGV0IGNoaWxkTm9kZUVudHJ5IG9mIHJlYWxOb2RlRW50cnkuY2hpbGRyZW47IGxldCBpZHggPSBpbmRleFwiXG4gICAgICBbb2Zmc2V0XT1cImlkeFwiXG4gICAgICBbY29sb3JdPVwiYnJhbmNoQ29sb3JzW2lkeF1cIlxuICAgID48L2FqZi1mYi1icmFuY2gtbGluZT5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8ZGl2XG4gICAgY2xhc3M9XCJtYXQtY2FyZC1jb250YWluZXJcIlxuICAgIFtjbGFzcy5hamYtaGlnaGxpZ2h0ZWQtZm9ybWJ1aWxkZXItbm9kZV09XCIoY3VycmVudEVkaXRlZE5vZGV8YXN5bmMpID09PSBub2RlRW50cnlcIlxuICA+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCIhaXNGaXJzdFwiXG4gICAgICBjbGFzcz1cImFqZi1vcmlnaW4tbGluZVwiXG4gICAgICBbc3R5bGUubWFyZ2luLWxlZnRdPVwib3JpZ2luTGVmdE1hcmdpblwiXG4gICAgICBbc3R5bGUuYm9yZGVyLWNvbG9yXT1cImZpcnN0QnJhbmNoQ29sb3JcIlxuICAgID48L2Rpdj5cbiAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiaXNOb2RlRW50cnlcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNEcmFnZ2FibGU7IGVsc2UgZHJhZ2dhYmxlXCI+XG4gICAgICAgIDxtYXQtY2FyZCBhcHBlYXJhbmNlPVwib3V0bGluZWRcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FyZFRpdGxlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhcmRDb250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLXRlbXBsYXRlICNkcmFnZ2FibGU+XG4gICAgICAgIDxtYXQtY2FyZFxuICAgICAgICAgIGFwcGVhcmFuY2U9XCJvdXRsaW5lZFwiXG4gICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgIFtjZGtEcmFnRGF0YV09XCJyZWFsTm9kZUVudHJ5XCJcbiAgICAgICAgICBjbGFzcz1cImFqZi1kcmFnZ2FibGUtYm94XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1NsaWRlKHJlYWxOb2RlRW50cnkubm9kZSk7IGVsc2UgZmllbGRQYW5lbFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNsaWRlUGFuZWxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9tYXQtY2FyZD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2xpZGVQYW5lbD5cbiAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWxcbiAgICAgICAgICBbZXhwYW5kZWRdPVwiaXNFeHBhbmRlZCgpfGFzeW5jXCJcbiAgICAgICAgICAob3BlbmVkKT1cInVwZGF0ZUV4cGFuZGVkU3RhdHVzKHRydWUpXCJcbiAgICAgICAgICAoY2xvc2VkKT1cInVwZGF0ZUV4cGFuZGVkU3RhdHVzKGZhbHNlKVwiXG4gICAgICAgICAgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXpcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhcmRUaXRsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhcmRDb250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZmllbGRQYW5lbD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNhcmRUaXRsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2FyZENvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjY2FyZFRpdGxlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXRpdGxlLXJvd1wiPlxuICAgICAgICAgIDxhamYtbm9kZS1pY29uIFtub2RlXT1cInJlYWxOb2RlRW50cnkubm9kZVwiPjwvYWpmLW5vZGUtaWNvbj5cbiAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJhamYtdGl0bGVcIlxuICAgICAgICAgICAgW2lubmVySFRNTF09XCIocmVhbE5vZGVFbnRyeS5ub2RlLmxhYmVsIHx8IHJlYWxOb2RlRW50cnkubm9kZS5uYW1lKSAgfCB0cmFuc2xvY29cIlxuICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwicmVhbE5vZGVFbnRyeS5ub2RlLnZpc2liaWxpdHkgJiYgcmVhbE5vZGVFbnRyeS5ub2RlLnZpc2liaWxpdHk/LmNvbmRpdGlvbiAhPT0gJ3RydWUnXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWpmLXZpc2liaWxpdHktY29uZGl0aW9uXCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiJ0NvbmRpdGlvbjogKCcgKyByZWFsTm9kZUVudHJ5Lm5vZGUudmlzaWJpbGl0eS5jb25kaXRpb24gKyAnKSdcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJhamYtYWN0aW9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiKGN1cnJlbnRFZGl0ZWROb2RlfGFzeW5jKSA9PT0gbm9kZUVudHJ5XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImRlbGV0ZSgkZXZlbnQpXCIgbWF0LWljb24tYnV0dG9uPlxuICAgICAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI2NhcmRDb250ZW50PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzQ29udGVudFwiPlxuICAgICAgICAgIDxhamYtZmItbm9kZS1lbnRyeVxuICAgICAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgICAgIGNsYXNzPVwiYWpmLWZpZWxkcy1saXN0XCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjb250ZW50RW50cnkgb2YgcmVhbE5vZGVFbnRyeS5jb250ZW50OyBsZXQgaXNGaXJzdENoaWxkID0gZmlyc3Q7IGxldCBpZHggPSBpbmRleFwiXG4gICAgICAgICAgICBbaWRdPVwiYXNzaWduSWQoKVwiXG4gICAgICAgICAgICBbbGV2ZWxdPVwibGV2ZWwgKyAxXCJcbiAgICAgICAgICAgIFtpc0ZpcnN0XT1cImlzRmlyc3RDaGlsZFwiXG4gICAgICAgICAgICBbZmlyc3RCcmFuY2hDb2xvcl09XCJicmFuY2hDb2xvcnNbaWR4XVwiXG4gICAgICAgICAgICBbbm9kZUVudHJ5XT1cImNvbnRlbnRFbnRyeVwiXG4gICAgICAgICAgICBbY2RrRHJvcExpc3RFbnRlclByZWRpY2F0ZV09XCJkaXNhYmxlU2xpZGVEcm9wXCJcbiAgICAgICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25Ecm9wKCRldmVudCwgdHJ1ZSlcIlxuICAgICAgICAgID48L2FqZi1mYi1ub2RlLWVudHJ5PlxuICAgICAgICAgIDxtYXQtY2FyZFxuICAgICAgICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYWpmLWVtcHR5XCJcbiAgICAgICAgICAgICpuZ0lmPVwicmVhbE5vZGVFbnRyeS5jb250ZW50Lmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgICAgW2lkXT1cImFzc2lnbklkKHRydWUpXCJcbiAgICAgICAgICAgIFtjZGtEcm9wTGlzdEVudGVyUHJlZGljYXRlXT1cImRpc2FibGVTbGlkZURyb3BcIlxuICAgICAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkRyb3AoJGV2ZW50LCB0cnVlKVwiXG4gICAgICAgICAgICA+PG1hdC1jYXJkLXRpdGxlPkRyb3AgeW91ciBmaWVsZHMgaGVyZTwvbWF0LWNhcmQtdGl0bGU+PC9tYXQtY2FyZFxuICAgICAgICAgID5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuXG4gIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpc05vZGVFbnRyeVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNoaWxkTm9kZUVudHJ5IG9mIHJlYWxOb2RlRW50cnkuY2hpbGRyZW47IGxldCBpZHggPSBpbmRleFwiPlxuICAgICAgPGFqZi1mYi1ub2RlLWVudHJ5XG4gICAgICAgICpuZ0lmPVwiIWlzTGFzdE5vZGUoKVwiXG4gICAgICAgIFtsZXZlbF09XCJsZXZlbFwiXG4gICAgICAgIFtvcmlnaW5PZmZzZXRdPVwiaWR4XCJcbiAgICAgICAgW2ZpcnN0QnJhbmNoQ29sb3JdPVwiYnJhbmNoQ29sb3JzW2lkeF1cIlxuICAgICAgICBbbm9kZUVudHJ5XT1cImNoaWxkTm9kZUVudHJ5XCJcbiAgICAgID48L2FqZi1mYi1ub2RlLWVudHJ5PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjcm9vdEVtcHR5PlxuICA8ZGl2IGNsYXNzPVwibWF0LWNhcmQtY29udGFpbmVyXCI+XG4gICAgPG1hdC1jYXJkXG4gICAgICBhcHBlYXJhbmNlPVwib3V0bGluZWRcIlxuICAgICAgY2xhc3M9XCJhamYtZW1wdHlcIlxuICAgICAgY2RrRHJvcExpc3RcbiAgICAgIFtjZGtEcm9wTGlzdEVudGVyUHJlZGljYXRlXT1cImVtcHR5QXJlYURyb3BQcmVkaWNhdGUoKVwiXG4gICAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cIm9uRHJvcCgkZXZlbnQpXCJcbiAgICAgID48bWF0LWNhcmQtdGl0bGU+RHJvcCB5b3VyIHNsaWRlcyBoZXJlPC9tYXQtY2FyZC10aXRsZT5cbiAgICA8L21hdC1jYXJkPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=