@rangertechnologies/ngnxt 2.1.106 → 2.1.107

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 (143) hide show
  1. package/esm2022/lib/ar.i18n.mjs +29 -0
  2. package/esm2022/lib/components/button/nxt-button.component.mjs +130 -0
  3. package/esm2022/lib/components/custom-button/custom-button.component.mjs +39 -0
  4. package/esm2022/lib/components/custom-calendar/custom-calendar.component.mjs +366 -0
  5. package/esm2022/lib/components/custom-date/custom-date.component.mjs +47 -0
  6. package/esm2022/lib/components/custom-date-picker/custom-date-picker.component.mjs +48 -0
  7. package/esm2022/lib/components/custom-dropdown/custom-dropdown.component.mjs +219 -0
  8. package/esm2022/lib/components/custom-image/custom-image.component.mjs +34 -0
  9. package/esm2022/lib/components/custom-input/custom-input.component.mjs +93 -0
  10. package/esm2022/lib/components/custom-label/custom-label.component.mjs +21 -0
  11. package/esm2022/lib/components/custom-model/custom-model.component.mjs +48 -0
  12. package/esm2022/lib/components/custom-radio/custom-radio.component.mjs +115 -0
  13. package/esm2022/lib/components/custom-rich-text/custom-rich-text.component.mjs +186 -0
  14. package/esm2022/lib/components/custom-table/custom-table.component.mjs +347 -0
  15. package/esm2022/lib/components/custom-text-area/custom-text-area.component.mjs +65 -0
  16. package/esm2022/lib/components/custom-time/custom-time.component.mjs +61 -0
  17. package/esm2022/lib/components/datatable/datatable.component.mjs +801 -0
  18. package/esm2022/lib/components/dependent-table/dependent-table.component.mjs +42 -0
  19. package/esm2022/lib/components/dropdown-with-flag/dropdown-with-flag.component.mjs +39 -0
  20. package/esm2022/lib/components/file-upload/file-upload.component.mjs +279 -0
  21. package/esm2022/lib/components/file-view/file-view.component.mjs +46 -0
  22. package/esm2022/lib/components/loader/loader.component.mjs +23 -0
  23. package/esm2022/lib/components/pagination/pagination.component.mjs +100 -0
  24. package/esm2022/lib/components/pick-location/pick-location.component.mjs +216 -0
  25. package/esm2022/lib/components/search-box/search-box.component.mjs +202 -0
  26. package/esm2022/lib/components/table-appendix/table-appendix.component.mjs +123 -0
  27. package/esm2022/lib/directives/componenthost/componenthost.directive.mjs +19 -0
  28. package/esm2022/lib/en.i18n.mjs +29 -0
  29. package/esm2022/lib/i18n-config.service.mjs +4 -0
  30. package/esm2022/lib/i18n.component.mjs +47 -0
  31. package/esm2022/lib/i18n.module.mjs +38 -0
  32. package/esm2022/lib/i18n.pipe.mjs +25 -0
  33. package/esm2022/lib/i18n.service.mjs +56 -0
  34. package/esm2022/lib/interfaces/actionMeta.mjs +2 -0
  35. package/esm2022/lib/interfaces/apimeta.mjs +2 -0
  36. package/esm2022/lib/interfaces/dependencyMeta.mjs +2 -0
  37. package/esm2022/lib/model/bookletWrapper.mjs +9 -0
  38. package/esm2022/lib/model/changeWrapper.mjs +11 -0
  39. package/esm2022/lib/model/errorWrapper.mjs +6 -0
  40. package/esm2022/lib/model/tableWrapper.mjs +20 -0
  41. package/esm2022/lib/nxt-app.component.mjs +22 -0
  42. package/esm2022/lib/nxt-app.module.mjs +399 -0
  43. package/esm2022/lib/nxt-app.service.mjs +14 -0
  44. package/esm2022/lib/pages/booklet/booklet.component.mjs +541 -0
  45. package/esm2022/lib/pages/builder/element/element.component.mjs +199 -0
  46. package/esm2022/lib/pages/builder/form/form.component.mjs +34 -0
  47. package/esm2022/lib/pages/builder/menu/menu.component.mjs +28 -0
  48. package/esm2022/lib/pages/builder/properties/properties.component.mjs +494 -0
  49. package/esm2022/lib/pages/questionbook/questionbook.component.mjs +458 -0
  50. package/esm2022/lib/pages/questionnaire/questionnaire.component.mjs +2387 -0
  51. package/esm2022/lib/pages/summary-page/summary-page.component.mjs +76 -0
  52. package/esm2022/lib/pipe/date/date.pipe.mjs +28 -0
  53. package/esm2022/lib/pipe/editColumnCheck/edit-column-check.pipe.mjs +28 -0
  54. package/esm2022/lib/pipe/editColumnDropdown/edit-column-dropdown.pipe.mjs +20 -0
  55. package/esm2022/lib/pipe/editColumnType/edit-column-type.pipe.mjs +20 -0
  56. package/esm2022/lib/pipe/get-value.pipe.mjs +50 -0
  57. package/esm2022/lib/pipe/search-filter/search-filter.pipe.mjs +39 -0
  58. package/esm2022/lib/pipe/time/time.pipe.mjs +26 -0
  59. package/esm2022/lib/sample.mjs +3715 -0
  60. package/esm2022/lib/services/change.service.mjs +53 -0
  61. package/esm2022/lib/services/data.service.mjs +80 -0
  62. package/esm2022/lib/services/form-builder.service.mjs +165 -0
  63. package/esm2022/lib/services/salesforce.service.mjs +46 -0
  64. package/esm2022/lib/services/shared.service.mjs +100 -0
  65. package/esm2022/lib/services/storage.service.mjs +44 -0
  66. package/esm2022/lib/tam.i18n.mjs +29 -0
  67. package/esm2022/lib/wrapper.mjs +175 -0
  68. package/esm2022/public-api.mjs +22 -0
  69. package/esm2022/rangertechnologies-ngnxt.mjs +5 -0
  70. package/fesm2022/rangertechnologies-ngnxt.mjs +12895 -0
  71. package/fesm2022/rangertechnologies-ngnxt.mjs.map +1 -0
  72. package/index.d.ts +5 -0
  73. package/lib/ar.i18n.d.ts +24 -0
  74. package/lib/components/button/nxt-button.component.d.ts +38 -0
  75. package/lib/components/custom-button/custom-button.component.d.ts +16 -0
  76. package/lib/components/custom-calendar/custom-calendar.component.d.ts +65 -0
  77. package/lib/components/custom-date/custom-date.component.d.ts +18 -0
  78. package/lib/components/custom-date-picker/custom-date-picker.component.d.ts +19 -0
  79. package/lib/components/custom-dropdown/custom-dropdown.component.d.ts +39 -0
  80. package/lib/components/custom-image/custom-image.component.d.ts +13 -0
  81. package/lib/components/custom-input/custom-input.component.d.ts +31 -0
  82. package/lib/components/custom-label/custom-label.component.d.ts +10 -0
  83. package/lib/components/custom-model/custom-model.component.d.ts +19 -0
  84. package/lib/components/custom-radio/custom-radio.component.d.ts +33 -0
  85. package/lib/components/custom-rich-text/custom-rich-text.component.d.ts +29 -0
  86. package/lib/components/custom-table/custom-table.component.d.ts +65 -0
  87. package/lib/components/custom-text-area/custom-text-area.component.d.ts +22 -0
  88. package/lib/components/custom-time/custom-time.component.d.ts +18 -0
  89. package/lib/components/datatable/datatable.component.d.ts +126 -0
  90. package/lib/components/dependent-table/dependent-table.component.d.ts +15 -0
  91. package/lib/components/dropdown-with-flag/dropdown-with-flag.component.d.ts +16 -0
  92. package/lib/components/file-upload/file-upload.component.d.ts +47 -0
  93. package/lib/components/file-view/file-view.component.d.ts +16 -0
  94. package/lib/components/loader/loader.component.d.ts +11 -0
  95. package/lib/components/pagination/pagination.component.d.ts +36 -0
  96. package/lib/components/pick-location/pick-location.component.d.ts +44 -0
  97. package/lib/components/search-box/search-box.component.d.ts +43 -0
  98. package/lib/components/table-appendix/table-appendix.component.d.ts +30 -0
  99. package/lib/directives/componenthost/componenthost.directive.d.ts +8 -0
  100. package/lib/en.i18n.d.ts +24 -0
  101. package/lib/i18n-config.service.d.ts +2 -0
  102. package/lib/i18n.component.d.ts +11 -0
  103. package/lib/i18n.module.d.ts +9 -0
  104. package/lib/i18n.pipe.d.ts +10 -0
  105. package/lib/i18n.service.d.ts +14 -0
  106. package/lib/interfaces/actionMeta.d.ts +5 -0
  107. package/lib/interfaces/apimeta.d.ts +15 -0
  108. package/lib/interfaces/dependencyMeta.d.ts +8 -0
  109. package/lib/model/bookletWrapper.d.ts +5 -0
  110. package/lib/model/changeWrapper.d.ts +10 -0
  111. package/lib/model/errorWrapper.d.ts +5 -0
  112. package/lib/model/tableWrapper.d.ts +18 -0
  113. package/lib/nxt-app.component.d.ts +8 -0
  114. package/lib/nxt-app.module.d.ts +52 -0
  115. package/lib/nxt-app.service.d.ts +6 -0
  116. package/lib/pages/booklet/booklet.component.d.ts +68 -0
  117. package/lib/pages/builder/element/element.component.d.ts +33 -0
  118. package/lib/pages/builder/form/form.component.d.ts +11 -0
  119. package/lib/pages/builder/menu/menu.component.d.ts +10 -0
  120. package/lib/pages/builder/properties/properties.component.d.ts +575 -0
  121. package/lib/pages/questionbook/questionbook.component.d.ts +68 -0
  122. package/lib/pages/questionnaire/questionnaire.component.d.ts +220 -0
  123. package/lib/pages/summary-page/summary-page.component.d.ts +20 -0
  124. package/lib/pipe/date/date.pipe.d.ts +7 -0
  125. package/lib/pipe/editColumnCheck/edit-column-check.pipe.d.ts +7 -0
  126. package/lib/pipe/editColumnDropdown/edit-column-dropdown.pipe.d.ts +7 -0
  127. package/lib/pipe/editColumnType/edit-column-type.pipe.d.ts +7 -0
  128. package/lib/pipe/get-value.pipe.d.ts +7 -0
  129. package/lib/pipe/search-filter/search-filter.pipe.d.ts +8 -0
  130. package/lib/pipe/time/time.pipe.d.ts +7 -0
  131. package/lib/sample.d.ts +11 -0
  132. package/lib/services/change.service.d.ts +22 -0
  133. package/lib/services/data.service.d.ts +13 -0
  134. package/lib/services/form-builder.service.d.ts +76 -0
  135. package/lib/services/salesforce.service.d.ts +11 -0
  136. package/lib/services/shared.service.d.ts +15 -0
  137. package/lib/services/storage.service.d.ts +13 -0
  138. package/lib/tam.i18n.d.ts +24 -0
  139. package/lib/wrapper.d.ts +203 -0
  140. package/package.json +1 -5
  141. package/public-api.d.ts +15 -0
  142. package/rangertechnologies-ngnxt-2.1.107.tgz +0 -0
  143. package/src/lib/style.css +1817 -0
@@ -0,0 +1,494 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common/http";
4
+ import * as i2 from "../../../services/form-builder.service";
5
+ import * as i3 from "@angular/common";
6
+ import * as i4 from "@angular/forms";
7
+ export class PropertiesComponent {
8
+ http;
9
+ formBuilderService;
10
+ formButtonHandler = new EventEmitter();
11
+ selectedOption = '';
12
+ selectedElementIndex = -1;
13
+ selectedElementType = '';
14
+ selectedAlign = 'align-left'; // Add this property
15
+ selectedStyles = []; // Using array since multiple styles can be selected
16
+ errorMessage = '';
17
+ selectedElement = null; // Receive the selected element
18
+ onToggleChange(key, event) {
19
+ const checked = event.target.checked;
20
+ this.selectedElement = { ...this.selectedElement, [key]: checked };
21
+ this.updateProperty(key, checked); //AP-06MAR25 Bug Fixed
22
+ }
23
+ updateProperties(elementType) {
24
+ // Reset alignment and styles if switching elements
25
+ this.selectedAlign = 'align-left';
26
+ this.selectedStyles = [];
27
+ // Fetch the properties of the selected element type
28
+ const properties = this.getProperties();
29
+ if (properties) {
30
+ // Make sure the properties are dynamically updated
31
+ }
32
+ }
33
+ onAlignSelect(value) {
34
+ if (this.selectedElement) {
35
+ this.selectedElement.textAlign = value;
36
+ }
37
+ }
38
+ onStyleSelect(value) {
39
+ if (!this.selectedElement)
40
+ return;
41
+ // Initialize styles array if it doesn't exist
42
+ this.selectedElement.styles = this.selectedElement.styles || [];
43
+ // Ensure only one style is selected at a time
44
+ this.selectedElement.styles = [value];
45
+ }
46
+ isStyleActive(value) {
47
+ return this.selectedElement?.styles?.includes(value) || false;
48
+ }
49
+ elementProperties = {
50
+ 'Text': {
51
+ elementProps: [
52
+ // questionText - Label-follow all element properties
53
+ { label: 'Label', placeholder: 'Enter Text ', type: 'text', key: 'questionText' },
54
+ // question - Placeholder-follow all element properties
55
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
56
+ { label: 'Help Text', placeholder: 'Enter Text ', type: 'text', key: 'helpText' },
57
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
58
+ // errorMessage - Error Msg-follow all element properties
59
+ { label: 'Error Msg', placeholder: 'Enter Text ', type: 'text', key: 'errorMessage' },
60
+ { label: 'Font', type: 'select', key: 'font',
61
+ options: ['Helvetica Neue', 'Arial', 'Times New Roman', 'Roboto'] },
62
+ { label: 'Weight', type: 'select', key: 'fontWeight',
63
+ options: [
64
+ { value: '400', label: '400-Normal' },
65
+ { value: '500', label: '500-Medium' },
66
+ { value: '600', label: '600-Semi Bold' },
67
+ { value: '700', label: '700-Bold' }
68
+ ] },
69
+ // { label: 'Size', unit: 'PX', type: 'number', key: 'size' },
70
+ // { label: 'Align', type: 'align', key: 'textAlign',
71
+ // options: [
72
+ // { value: 'left', icon: 'textalign-left' },
73
+ // { value: 'center', icon: 'align-center' },
74
+ // { value: 'right', icon: 'align-right' },
75
+ // { value: 'justifyleft', icon: 'align-justifyleft' },
76
+ // { value: 'justifyright', icon: 'align-justifyright' }
77
+ // ] },
78
+ // { label: 'Style', type: 'style',key: 'styles',
79
+ // options: [
80
+ // { value: 'italic', icon: 'italic' },
81
+ // { value: 'bold', icon: 'bold' },
82
+ // { value: 'underline', icon: 'underline' },
83
+ // { value: 'texticon', icon: 'texticon' },
84
+ // { value: 'capitalize', icon: 'capitalize' },
85
+ // { value: 'resize', icon: 'resize' }
86
+ // ] },
87
+ { label: 'Field Size', type: 'fieldSize', key: 'size' }
88
+ ],
89
+ fieldProps: [
90
+ { label: 'Field Required', type: 'radio', key: 'isRequired' },
91
+ { label: 'Default Value', placeholder: 'Enter Text ', type: 'text', key: 'defaultValue' },
92
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
93
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
94
+ { label: 'SubText', placeholder: 'Enter Text', type: 'text', key: 'subText' }
95
+ ]
96
+ },
97
+ 'CheckBox': {
98
+ elementProps: [
99
+ { label: 'Label', placeholder: 'Enter Text ', type: 'text', key: 'questionText' },
100
+ { label: 'Place Holder', placeholder: 'Enter Text ', type: 'text', key: 'question' },
101
+ { label: 'Help Text', placeholder: 'Enter Text ', type: 'text', key: 'helpText' },
102
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
103
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
104
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
105
+ ],
106
+ fieldProps: [
107
+ { label: 'Field Required', type: 'radio' },
108
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
109
+ {
110
+ label: 'Options',
111
+ type: 'checkbox',
112
+ key: 'options',
113
+ addOptionLabel: 'Add Option',
114
+ icon: 'plus'
115
+ },
116
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
117
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
118
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
119
+ ]
120
+ },
121
+ 'Calendar': {
122
+ elementProps: [
123
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
124
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
125
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
126
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
127
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
128
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
129
+ ],
130
+ fieldProps: [
131
+ { label: 'Field Required', type: 'radio' },
132
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
133
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
134
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
135
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
136
+ ]
137
+ },
138
+ 'Time': {
139
+ elementProps: [
140
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'label' },
141
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'placeholder' },
142
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
143
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
144
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
145
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
146
+ ],
147
+ fieldProps: [
148
+ { label: 'Field Required', type: 'radio' },
149
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
150
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
151
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
152
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
153
+ ]
154
+ },
155
+ 'Email': {
156
+ elementProps: [
157
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
158
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
159
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
160
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
161
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
162
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
163
+ ],
164
+ fieldProps: [
165
+ { label: 'Field Required', type: 'radio' },
166
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
167
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
168
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
169
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
170
+ ]
171
+ },
172
+ 'File': {
173
+ elementProps: [
174
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
175
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
176
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
177
+ { label: 'Support Type', type: 'select', key: 'supportType', options: [
178
+ { label: 'Images (JPEG, PNG, GIF)', value: 'image/*', extensions: ['.jpg', '.jpeg', '.png', '.gif'] },
179
+ { label: 'Audio (MP3, WAV, AIFF)', value: 'audio/*', extensions: ['.mp3', '.wav', '.aiff'] },
180
+ { label: 'Video (MP4, AVI, HEVC)', value: 'video/*', extensions: ['.mp4', '.avi', '.hevc'] },
181
+ { label: 'Documents (DOC, DOCX, PPT, PDF)', value: 'application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd.ms-powerpoint', extensions: ['.doc', '.docx', '.ppt', '.pdf'] },
182
+ { label: 'Executables (EXE, BAD, SH)', value: 'application/x-msdownload,application/x-sh', extensions: ['.exe', '.bad', '.sh'] },
183
+ { label: 'Archives (ZIP, RAR, Git-hub)', value: 'application/zip,application/x-rar-compressed,application/x-git', extensions: ['.zip', '.rar', '.git'] }
184
+ ] },
185
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
186
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
187
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
188
+ ],
189
+ fieldProps: [
190
+ { label: 'Field Required', type: 'radio' },
191
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
192
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
193
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
194
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
195
+ ]
196
+ },
197
+ 'List': {
198
+ elementProps: [
199
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
200
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
201
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
202
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
203
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
204
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
205
+ ],
206
+ fieldProps: [
207
+ { label: 'Field Required', type: 'radio' },
208
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
209
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
210
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
211
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
212
+ ]
213
+ },
214
+ 'TextArea': {
215
+ elementProps: [
216
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
217
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
218
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
219
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
220
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
221
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
222
+ ],
223
+ fieldProps: [
224
+ { label: 'Field Required', type: 'radio', key: 'required' },
225
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text', key: 'defaultValue' },
226
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
227
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
228
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
229
+ ]
230
+ },
231
+ 'RichTextArea': {
232
+ elementProps: [
233
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
234
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
235
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
236
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
237
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
238
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
239
+ ],
240
+ fieldProps: [
241
+ { label: 'Field Required', type: 'radio', key: 'required' },
242
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text', key: 'defaultValue' },
243
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
244
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
245
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
246
+ ]
247
+ },
248
+ 'Number': {
249
+ elementProps: [
250
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
251
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
252
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
253
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
254
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
255
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
256
+ ],
257
+ fieldProps: [
258
+ { label: 'Field Required', type: 'radio' },
259
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
260
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
261
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
262
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
263
+ ]
264
+ },
265
+ 'Dropdown': {
266
+ elementProps: [
267
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
268
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
269
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
270
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
271
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
272
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
273
+ ],
274
+ fieldProps: [
275
+ { label: 'Field Required', type: 'radio' },
276
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
277
+ {
278
+ label: 'Options',
279
+ type: 'dropdown',
280
+ key: 'options',
281
+ addOptionLabel: 'Add Variant',
282
+ icon: 'plus'
283
+ },
284
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
285
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
286
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
287
+ ]
288
+ },
289
+ 'Image': {
290
+ elementProps: [
291
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
292
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
293
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
294
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
295
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
296
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
297
+ ],
298
+ fieldProps: [
299
+ { label: 'Field Required', type: 'radio' },
300
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
301
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
302
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
303
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
304
+ ]
305
+ },
306
+ 'Radio': {
307
+ elementProps: [
308
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
309
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
310
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
311
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
312
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
313
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
314
+ ],
315
+ fieldProps: [
316
+ { label: 'Field Required', type: 'radio' },
317
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
318
+ {
319
+ label: 'Options',
320
+ type: 'radio',
321
+ key: 'options',
322
+ addOptionLabel: 'Add Option',
323
+ icon: 'plus'
324
+ },
325
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
326
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
327
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
328
+ ]
329
+ },
330
+ 'Label': {
331
+ elementProps: [
332
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
333
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
334
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
335
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
336
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
337
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
338
+ ],
339
+ fieldProps: [
340
+ { label: 'Field Required', type: 'radio' },
341
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
342
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
343
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
344
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
345
+ ]
346
+ },
347
+ 'Table': {
348
+ elementProps: [
349
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
350
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
351
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
352
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' }
353
+ ],
354
+ fieldProps: [
355
+ { label: 'Field Required', type: 'radio' },
356
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
357
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
358
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' },
359
+ ]
360
+ },
361
+ 'Book': {
362
+ elementProps: [
363
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
364
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
365
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
366
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
367
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
368
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
369
+ ],
370
+ fieldProps: [
371
+ { label: 'Field Required', type: 'radio' },
372
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
373
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
374
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
375
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
376
+ ]
377
+ },
378
+ 'Button': {
379
+ elementProps: [
380
+ { label: 'Label', placeholder: 'Enter Text', type: 'text', key: 'questionText' },
381
+ { label: 'Place Holder', placeholder: 'Enter Text', type: 'text', key: 'question' },
382
+ { label: 'Help Text', placeholder: 'Enter Text', type: 'text', key: 'helpText' },
383
+ { label: '', type: 'toggleGroup', key: 'toggleOptions' },
384
+ { label: 'Field Size', type: 'fieldSize', key: 'size' },
385
+ { label: 'Error Msg', placeholder: 'Enter Text', type: 'text', key: 'errorMessage' },
386
+ ],
387
+ fieldProps: [
388
+ { label: 'Field Required', type: 'radio' },
389
+ { label: 'Default Value', placeholder: 'Enter Text', type: 'text' },
390
+ { label: 'Reference', placeholder: 'Reference Field', type: 'text', key: 'referenceField' },
391
+ { label: 'Style', placeholder: 'Style JSON', type: 'text', key: 'style' },
392
+ { label: 'Sub Text', placeholder: 'Enter Text', type: 'text', key: 'subText' }
393
+ ]
394
+ },
395
+ };
396
+ constructor(http, formBuilderService) {
397
+ this.http = http;
398
+ this.formBuilderService = formBuilderService;
399
+ }
400
+ ngOnInit() {
401
+ this.formBuilderService.selectedElement$.subscribe(index => {
402
+ this.selectedElementIndex = index;
403
+ if (index >= 0) {
404
+ const elements = this.formBuilderService.getElements();
405
+ this.selectedElement = elements[index];
406
+ }
407
+ });
408
+ }
409
+ validateInput(value, type) {
410
+ if (type === 'label' || type === 'placeholder') {
411
+ const regex = /^[a-zA-Z0-9\s]*$/;
412
+ if (!regex.test(value)) {
413
+ this.errorMessage = 'Only letters and numbers are allowed';
414
+ return false;
415
+ }
416
+ }
417
+ this.errorMessage = '';
418
+ return true;
419
+ }
420
+ updateProperty(key, value) {
421
+ if (this.selectedElementIndex >= 0) {
422
+ if (key === 'questionText' || key === 'question') {
423
+ if (!this.validateInput(value, key)) {
424
+ return;
425
+ }
426
+ }
427
+ if (key === 'fontWeight') {
428
+ // Extract just the number value from the option
429
+ value = value.split('-')[0];
430
+ }
431
+ if (key === 'styles') {
432
+ const currentStyles = this.selectedElement.styles || [];
433
+ if (value === 'capitalize' || value === 'lowercase') {
434
+ // Remove the opposite case if it exists
435
+ const oppositeStyle = value === 'capitalize' ? 'lowercase' : 'capitalize';
436
+ const filteredStyles = currentStyles.filter(s => s !== oppositeStyle);
437
+ value = currentStyles.includes(value)
438
+ ? filteredStyles.filter(s => s !== value)
439
+ : [...filteredStyles, value];
440
+ }
441
+ else {
442
+ // Toggle other styles
443
+ value = currentStyles.includes(value)
444
+ ? currentStyles.filter(s => s !== value)
445
+ : [...currentStyles, value];
446
+ }
447
+ }
448
+ const update = { [key]: value };
449
+ this.formBuilderService.updateElement(this.selectedElementIndex, update);
450
+ // Special handling for font and font weight
451
+ if (key === 'font') {
452
+ this.selectedElement.font = value; // Directly update the selected element's font property
453
+ }
454
+ }
455
+ }
456
+ onRequiredChange(value) {
457
+ if (this.selectedElement) {
458
+ let label = this.selectedElement.label ? this.selectedElement.label.replace(/\s*\*+$/, '') : 'Label';
459
+ if (value) {
460
+ label = `${label} *`;
461
+ }
462
+ this.updateProperty('label', label);
463
+ this.updateProperty('isRequired', value);
464
+ }
465
+ }
466
+ getProperties() {
467
+ if (!this.selectedElement)
468
+ return null;
469
+ return this.elementProperties[this.selectedElement.type];
470
+ }
471
+ addOption(options) {
472
+ options.push({ label: '', value: '' });
473
+ }
474
+ removeOption(options, index) {
475
+ options.splice(index, 1);
476
+ }
477
+ // download() {
478
+ // console.log('Question Book:', this.formBuilderService.downloadElement());
479
+ // }
480
+ handleButtonClick() {
481
+ this.formButtonHandler.emit(this.formBuilderService.downloadElement());
482
+ }
483
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PropertiesComponent, deps: [{ token: i1.HttpClient }, { token: i2.FormBuilderService }], target: i0.ɵɵFactoryTarget.Component });
484
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PropertiesComponent, selector: "app-properties", inputs: { selectedElementType: "selectedElementType" }, outputs: { formButtonHandler: "formButtonHandler" }, ngImport: i0, template: "<!-- AP 22JAN25 - Field and Element Properties -->\n<link href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" rel=\"stylesheet\">\n<div class=\"properties\">\n\n<!-- Design Header Section -->\n<div class=\"design-header\">\n <h1 class=\"header-title\">Properties</h1>\n <!-- AP 25FEB25 - not used -->\n <!-- <div class=\"menu-container\">\n <div class=\"menu-item\" (click)=\"download()\">\n <span >Download</span>\n </div>\n <div class=\"menu-item\">\n <span>Start</span>\n </div>\n <div class=\"menu-item\">\n <span>Path</span>\n </div>\n <div class=\"menu-item\">\n <span>Clone</span>\n </div>\n </div> -->\n</div>\n\n<div class=\"all-properties\">\n<div *ngIf=\"errorMessage\" class=\"error-message\">{{ errorMessage }}</div>\n\n<!-- Element Properties -->\n <!-- AP-06MAR25 Select element type show -->\n<details class=\"first-properties\" open>\n <summary class=\"text-sm \">Elements Properties</summary>\n <div class=\"inner-content\" *ngIf=\"getProperties()\">\n {{selectedElement.type}}\n <ng-container *ngFor=\"let prop of getProperties().elementProps\">\n <div class=\"flex-items-center\">\n <label class=\"text-sm\">{{ prop.label }}</label>\n <div class=\"label-properties\">\n\n<!-- Text Input -->\n<input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [value]=\"selectedElement[prop.key]\"\n (input)=\"updateProperty(prop.key, $event.target.value)\"\n [class.read-only]=\"selectedElement.readOnly\"\n [readonly]=\"selectedElement.readOnly\"\n class=\"text-sm1 \"/>\n\n<div *ngIf=\"prop.key === 'helpText' && selectedElement.helpText\" class=\"help-text\">{{ selectedElement.helpText }}</div>\n\n<!-- Font Selection -->\n<div *ngIf=\"prop.key === 'font'\" class=\"font-selection\">\n <!-- <label>{{ prop.label }}</label> -->\n <select *ngIf=\"prop.type === 'select' && prop.key === 'font'\" class=\"font-selection1\" [value]=\"selectedElement?.font\"\n (change)=\"updateProperty('font', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\"> {{ option }} </option>\n </select>\n</div>\n\n<!-- file -->\n<!-- Add this inside the elementProps loop where other inputs are rendered -->\n<select *ngIf=\"prop.type === 'select' && prop.key === 'supportType'\" class=\"file\" [value]=\"selectedElement[prop.key]\"\n(change)=\"updateProperty(prop.key, $event.target.value)\">\n<option value=\"\">Select file category</option>\n<option *ngFor=\"let option of prop.options\" [value]=\"option.value\"> {{ option.label }} </option>\n</select>\n\n<!-- Font Weight Selection -->\n<div *ngIf=\"prop.key === 'fontWeight'\" class=\"font-weight\">\n <!-- <label>{{ prop.label }}</label> -->\n <select *ngIf=\"prop.type === 'select' && prop.key === 'fontWeight'\" class=\"font-weight\" [value]=\"selectedElement?.fontWeight\"\n (change)=\"updateProperty('fontWeight', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\"> {{ option.label }} </option>\n </select>\n</div>\n \n<!-- Toggle Group -->\n<div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\n <div class=\"toggle-item\">\n <span class=\"toggle-label\">Read Only</span>\n <label class=\"switch\">\n <input type=\"checkbox\" [checked]=\"selectedElement?.isReadOnly\" \n (change)=\"onToggleChange('isReadOnly', $event)\" />\n <span class=\"slider\"></span>\n </label>\n </div>\n\n <div class=\"toggle-item\">\n <span class=\"toggle-label\">Is Hide</span>\n <label class=\"switch\">\n <input type=\"checkbox\" [checked]=\"selectedElement?.isHidden\" \n (change)=\"onToggleChange('isHidden', $event)\" />\n <span class=\"slider\"></span>\n </label>\n </div>\n</div>\n\n<!-- Text Align Buttons -->\n<div *ngIf=\"prop.type === 'align'\"class=\"font-align\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onAlignSelect(option.value)\" \n [class.active]=\"selectedElement?.textAlign === option.value\" class=\"align-btn\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\"/>\n </button>\n</div>\n\n<div *ngIf=\"prop.type === 'style'\" class=\"font-style\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onStyleSelect(option.value)\"\n [class.active]=\"isStyleActive(option.value)\" class=\"style-btn\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\"/>\n </button>\n</div>\n\n<!-- Field Size Controls -->\n<!-- AP 25FEB25 - Change key size -->\n<div *ngIf=\"prop.key === 'size'\" class=\"field-size-controls\">\n <div class=\"size-group\">\n <label class=\"size-label\">Width</label>\n <div class=\"value-container\">\n <input type=\"number\" [value]=\"selectedElement?.size\" (input)=\"updateProperty('size', $event.target.value)\" class=\"size-input\"/>\n </div>\n </div>\n</div>\n\n</div>\n</div>\n</ng-container>\n</div>\n</details>\n\n<!-- Field Elements Properties -->\n <!-- AP-06MAR25 Show elements ID -->\n<details class=\"second-property\">\n <summary class=\"text-font-medium\">Field Elements Properties</summary>\n <div class=\"space-y-4\" *ngIf=\"getProperties()\">\n <div style=\"font-size: 13px; padding:5px;border-radius:3px;background-color:#eff8ff;\"> id : {{selectedElement.id}}</div>\n <ng-container *ngFor=\"let prop of getProperties().fieldProps\">\n <div class=\"flex-items-center \">\n <label class=\"text-sm\">{{ prop.label }}</label>\n <div class=\"input-box-field\">\n <!-- Input Box -->\n <div class=\"input-box-field\">\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\" [value]=\"selectedElement[prop.key]\"\n (input)=\"updateProperty(prop.key, $event.target.value)\"/> </div>\n \n <!-- Radio Group -->\n<div *ngIf=\"prop.type === 'radio'\" class=\"radio-item\">\n <div class=\"sizes\">\n <div class=\"flex-gap\">\n <div class=\"flex-items\">\n <input type=\"radio\" [checked]=\"selectedElement?.isRequired\" (change)=\"onRequiredChange(true)\" name=\"required\" class=\"radio-input\"/>\n <label class=\"text-label\"> Required </label>\n </div>\n <div class=\"flex-items\">\n <input type=\"radio\" [checked]=\"!selectedElement?.isRequired\" (change)=\"onRequiredChange(false)\" name=\"required\" class=\"radio-input\"/>\n <label class=\"text-sm text-gray-400\"> Not Required </label>\n </div>\n </div>\n</div>\n</div> \n\n<!-- AP 25FEB25 - handled options -->\n<div *ngIf=\"prop.type === 'dropdown' || prop.type === 'checkbox' || prop.type === 'radio' && prop.key === 'options'\" class=\"options-container\">\n <div *ngFor=\"let option of selectedElement[prop.key]; let i = index\" class=\"option-items\">\n <input type=\"text\" [(ngModel)]=\"selectedElement[prop.key][i].value\" placeholder=\"Option {{ i + 1 }}\" class=\"options\"/>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(selectedElement[prop.key], i)\">\n </div>\n <button (click)=\"addOption(selectedElement[prop.key])\">\n <div class=\"add-varient\">\n <span class=\"text-lg\">+</span>\n <span>Add</span>\n </div>\n </button>\n</div>\n\n</div>\n</div>\n</ng-container>\n</div>\n</details>\n\n<div class=\"design-footer\">\n <button class=\"btn\">Cancel</button>\n <button class=\"btn\" (click)=\"handleButtonClick()\">Save</button>\n</div>\n\n</div>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\";*{margin:0;padding:0;box-sizing:border-box;font-family:Roboto,sans-serif}.properties{height:100vh;overflow-y:auto}.design-header{display:flex;justify-content:center;align-items:center;padding:15px 20px;background:#fff;border-radius:8px;box-shadow:0 2px 10px #0000001a;margin-bottom:20px}.header-title{font-size:20px;font-weight:400;color:#222}.all-properties details{background:#fff;border:1px solid #ddd;border-radius:8px;margin-bottom:12px;padding:12px;box-shadow:0 2px 8px #0000000d}.all-properties summary{font-size:15px;font-weight:400;cursor:pointer;padding:6px;transition:color .3s}.all-properties summary:hover{color:#007bff}.inner-content{padding:12px 0}label{font-size:14px;font-weight:500;color:#444;margin-bottom:5px;display:block}input[type=text],input[type=number],select{width:100%;height:40px;padding:10px;font-size:14px;border:1px solid #ccc;border-radius:6px;outline:none;transition:.3s;background:#f8f8f8}input:focus,select:focus{border-color:#007bff;background:#fff;box-shadow:0 0 5px #007bff4d}button{padding:10px 15px;border:none;border-radius:6px;background:#007bff;color:#fff;font-size:15px;cursor:pointer;transition:.3s}button:hover{background:#0056b3;transform:translateY(-2px)}.toggle-group{display:flex;align-items:center;gap:20px}.toggle-item{display:flex;align-items:center;gap:10px}.switch{position:relative;width:42px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:20px;width:20px;left:1px;bottom:1px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#2196f3}input:checked+.slider:before{transform:translate(18px)}.radio-item{display:flex;align-items:center;gap:20px}.radio-item input{accent-color:#007bff}.options-container{display:flex;flex-direction:column;gap:12px}.options{width:100%}.field-size-controls{display:flex;align-items:center;gap:12px}.size-input{width:110px;text-align:center}.design-footer{display:flex;justify-content:space-between;margin-top:20px}.design-footer .btn{background:#007bff;color:#fff;padding:10px 18px;border-radius:6px;font-size:15px;transition:.3s}.design-footer .btn:hover{background:#0056b3}@media (max-width: 768px){.properties{max-width:100%;padding:12px}.design-header{flex-direction:column;align-items:flex-start;padding:15px}.toggle-group{flex-direction:column;gap:12px}.field-size-controls{flex-direction:column}.design-footer{flex-direction:column;gap:12px;align-items:center}}\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.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
485
+ }
486
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PropertiesComponent, decorators: [{
487
+ type: Component,
488
+ args: [{ selector: 'app-properties', template: "<!-- AP 22JAN25 - Field and Element Properties -->\n<link href=\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\" rel=\"stylesheet\">\n<div class=\"properties\">\n\n<!-- Design Header Section -->\n<div class=\"design-header\">\n <h1 class=\"header-title\">Properties</h1>\n <!-- AP 25FEB25 - not used -->\n <!-- <div class=\"menu-container\">\n <div class=\"menu-item\" (click)=\"download()\">\n <span >Download</span>\n </div>\n <div class=\"menu-item\">\n <span>Start</span>\n </div>\n <div class=\"menu-item\">\n <span>Path</span>\n </div>\n <div class=\"menu-item\">\n <span>Clone</span>\n </div>\n </div> -->\n</div>\n\n<div class=\"all-properties\">\n<div *ngIf=\"errorMessage\" class=\"error-message\">{{ errorMessage }}</div>\n\n<!-- Element Properties -->\n <!-- AP-06MAR25 Select element type show -->\n<details class=\"first-properties\" open>\n <summary class=\"text-sm \">Elements Properties</summary>\n <div class=\"inner-content\" *ngIf=\"getProperties()\">\n {{selectedElement.type}}\n <ng-container *ngFor=\"let prop of getProperties().elementProps\">\n <div class=\"flex-items-center\">\n <label class=\"text-sm\">{{ prop.label }}</label>\n <div class=\"label-properties\">\n\n<!-- Text Input -->\n<input *ngIf=\"prop.type === 'text'\"\n type=\"text\"\n [placeholder]=\"prop.placeholder\"\n [value]=\"selectedElement[prop.key]\"\n (input)=\"updateProperty(prop.key, $event.target.value)\"\n [class.read-only]=\"selectedElement.readOnly\"\n [readonly]=\"selectedElement.readOnly\"\n class=\"text-sm1 \"/>\n\n<div *ngIf=\"prop.key === 'helpText' && selectedElement.helpText\" class=\"help-text\">{{ selectedElement.helpText }}</div>\n\n<!-- Font Selection -->\n<div *ngIf=\"prop.key === 'font'\" class=\"font-selection\">\n <!-- <label>{{ prop.label }}</label> -->\n <select *ngIf=\"prop.type === 'select' && prop.key === 'font'\" class=\"font-selection1\" [value]=\"selectedElement?.font\"\n (change)=\"updateProperty('font', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option\"> {{ option }} </option>\n </select>\n</div>\n\n<!-- file -->\n<!-- Add this inside the elementProps loop where other inputs are rendered -->\n<select *ngIf=\"prop.type === 'select' && prop.key === 'supportType'\" class=\"file\" [value]=\"selectedElement[prop.key]\"\n(change)=\"updateProperty(prop.key, $event.target.value)\">\n<option value=\"\">Select file category</option>\n<option *ngFor=\"let option of prop.options\" [value]=\"option.value\"> {{ option.label }} </option>\n</select>\n\n<!-- Font Weight Selection -->\n<div *ngIf=\"prop.key === 'fontWeight'\" class=\"font-weight\">\n <!-- <label>{{ prop.label }}</label> -->\n <select *ngIf=\"prop.type === 'select' && prop.key === 'fontWeight'\" class=\"font-weight\" [value]=\"selectedElement?.fontWeight\"\n (change)=\"updateProperty('fontWeight', $event.target.value)\">\n <option *ngFor=\"let option of prop.options\" [value]=\"option.value\"> {{ option.label }} </option>\n </select>\n</div>\n \n<!-- Toggle Group -->\n<div *ngIf=\"prop.type === 'toggleGroup'\" class=\"toggle-group\">\n <div class=\"toggle-item\">\n <span class=\"toggle-label\">Read Only</span>\n <label class=\"switch\">\n <input type=\"checkbox\" [checked]=\"selectedElement?.isReadOnly\" \n (change)=\"onToggleChange('isReadOnly', $event)\" />\n <span class=\"slider\"></span>\n </label>\n </div>\n\n <div class=\"toggle-item\">\n <span class=\"toggle-label\">Is Hide</span>\n <label class=\"switch\">\n <input type=\"checkbox\" [checked]=\"selectedElement?.isHidden\" \n (change)=\"onToggleChange('isHidden', $event)\" />\n <span class=\"slider\"></span>\n </label>\n </div>\n</div>\n\n<!-- Text Align Buttons -->\n<div *ngIf=\"prop.type === 'align'\"class=\"font-align\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onAlignSelect(option.value)\" \n [class.active]=\"selectedElement?.textAlign === option.value\" class=\"align-btn\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\"/>\n </button>\n</div>\n\n<div *ngIf=\"prop.type === 'style'\" class=\"font-style\">\n <button *ngFor=\"let option of prop.options\" (click)=\"onStyleSelect(option.value)\"\n [class.active]=\"isStyleActive(option.value)\" class=\"style-btn\" [title]=\"option.value\">\n <img [src]=\"'../assets/icons/' + option.icon + '.svg'\" [alt]=\"option.value\" class=\"icon-size\"/>\n </button>\n</div>\n\n<!-- Field Size Controls -->\n<!-- AP 25FEB25 - Change key size -->\n<div *ngIf=\"prop.key === 'size'\" class=\"field-size-controls\">\n <div class=\"size-group\">\n <label class=\"size-label\">Width</label>\n <div class=\"value-container\">\n <input type=\"number\" [value]=\"selectedElement?.size\" (input)=\"updateProperty('size', $event.target.value)\" class=\"size-input\"/>\n </div>\n </div>\n</div>\n\n</div>\n</div>\n</ng-container>\n</div>\n</details>\n\n<!-- Field Elements Properties -->\n <!-- AP-06MAR25 Show elements ID -->\n<details class=\"second-property\">\n <summary class=\"text-font-medium\">Field Elements Properties</summary>\n <div class=\"space-y-4\" *ngIf=\"getProperties()\">\n <div style=\"font-size: 13px; padding:5px;border-radius:3px;background-color:#eff8ff;\"> id : {{selectedElement.id}}</div>\n <ng-container *ngFor=\"let prop of getProperties().fieldProps\">\n <div class=\"flex-items-center \">\n <label class=\"text-sm\">{{ prop.label }}</label>\n <div class=\"input-box-field\">\n <!-- Input Box -->\n <div class=\"input-box-field\">\n <input *ngIf=\"prop.type === 'text'\" type=\"text\" [placeholder]=\"prop.placeholder\" [value]=\"selectedElement[prop.key]\"\n (input)=\"updateProperty(prop.key, $event.target.value)\"/> </div>\n \n <!-- Radio Group -->\n<div *ngIf=\"prop.type === 'radio'\" class=\"radio-item\">\n <div class=\"sizes\">\n <div class=\"flex-gap\">\n <div class=\"flex-items\">\n <input type=\"radio\" [checked]=\"selectedElement?.isRequired\" (change)=\"onRequiredChange(true)\" name=\"required\" class=\"radio-input\"/>\n <label class=\"text-label\"> Required </label>\n </div>\n <div class=\"flex-items\">\n <input type=\"radio\" [checked]=\"!selectedElement?.isRequired\" (change)=\"onRequiredChange(false)\" name=\"required\" class=\"radio-input\"/>\n <label class=\"text-sm text-gray-400\"> Not Required </label>\n </div>\n </div>\n</div>\n</div> \n\n<!-- AP 25FEB25 - handled options -->\n<div *ngIf=\"prop.type === 'dropdown' || prop.type === 'checkbox' || prop.type === 'radio' && prop.key === 'options'\" class=\"options-container\">\n <div *ngFor=\"let option of selectedElement[prop.key]; let i = index\" class=\"option-items\">\n <input type=\"text\" [(ngModel)]=\"selectedElement[prop.key][i].value\" placeholder=\"Option {{ i + 1 }}\" class=\"options\"/>\n <img src=\"../assets/icons/Trash.svg\" (click)=\"removeOption(selectedElement[prop.key], i)\">\n </div>\n <button (click)=\"addOption(selectedElement[prop.key])\">\n <div class=\"add-varient\">\n <span class=\"text-lg\">+</span>\n <span>Add</span>\n </div>\n </button>\n</div>\n\n</div>\n</div>\n</ng-container>\n</div>\n</details>\n\n<div class=\"design-footer\">\n <button class=\"btn\">Cancel</button>\n <button class=\"btn\" (click)=\"handleButtonClick()\">Save</button>\n</div>\n\n</div>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap\";*{margin:0;padding:0;box-sizing:border-box;font-family:Roboto,sans-serif}.properties{height:100vh;overflow-y:auto}.design-header{display:flex;justify-content:center;align-items:center;padding:15px 20px;background:#fff;border-radius:8px;box-shadow:0 2px 10px #0000001a;margin-bottom:20px}.header-title{font-size:20px;font-weight:400;color:#222}.all-properties details{background:#fff;border:1px solid #ddd;border-radius:8px;margin-bottom:12px;padding:12px;box-shadow:0 2px 8px #0000000d}.all-properties summary{font-size:15px;font-weight:400;cursor:pointer;padding:6px;transition:color .3s}.all-properties summary:hover{color:#007bff}.inner-content{padding:12px 0}label{font-size:14px;font-weight:500;color:#444;margin-bottom:5px;display:block}input[type=text],input[type=number],select{width:100%;height:40px;padding:10px;font-size:14px;border:1px solid #ccc;border-radius:6px;outline:none;transition:.3s;background:#f8f8f8}input:focus,select:focus{border-color:#007bff;background:#fff;box-shadow:0 0 5px #007bff4d}button{padding:10px 15px;border:none;border-radius:6px;background:#007bff;color:#fff;font-size:15px;cursor:pointer;transition:.3s}button:hover{background:#0056b3;transform:translateY(-2px)}.toggle-group{display:flex;align-items:center;gap:20px}.toggle-item{display:flex;align-items:center;gap:10px}.switch{position:relative;width:42px;height:22px}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:24px}.slider:before{position:absolute;content:\"\";height:20px;width:20px;left:1px;bottom:1px;background-color:#fff;transition:.4s;border-radius:50%}input:checked+.slider{background-color:#2196f3}input:checked+.slider:before{transform:translate(18px)}.radio-item{display:flex;align-items:center;gap:20px}.radio-item input{accent-color:#007bff}.options-container{display:flex;flex-direction:column;gap:12px}.options{width:100%}.field-size-controls{display:flex;align-items:center;gap:12px}.size-input{width:110px;text-align:center}.design-footer{display:flex;justify-content:space-between;margin-top:20px}.design-footer .btn{background:#007bff;color:#fff;padding:10px 18px;border-radius:6px;font-size:15px;transition:.3s}.design-footer .btn:hover{background:#0056b3}@media (max-width: 768px){.properties{max-width:100%;padding:12px}.design-header{flex-direction:column;align-items:flex-start;padding:15px}.toggle-group{flex-direction:column;gap:12px}.field-size-controls{flex-direction:column}.design-footer{flex-direction:column;gap:12px;align-items:center}}\n"] }]
489
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.FormBuilderService }], propDecorators: { formButtonHandler: [{
490
+ type: Output
491
+ }], selectedElementType: [{
492
+ type: Input
493
+ }] } });
494
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvcGFnZXMvYnVpbGRlci9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL3BhZ2VzL2J1aWxkZXIvcHJvcGVydGllcy9wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFRMUcsTUFBTSxPQUFPLG1CQUFtQjtJQXlhVjtJQUF5QjtJQXZhbkMsaUJBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUN0RCxjQUFjLEdBQVcsRUFBRSxDQUFDO0lBQzVCLG9CQUFvQixHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3pCLG1CQUFtQixHQUFXLEVBQUUsQ0FBQztJQUMxQyxhQUFhLEdBQVcsWUFBWSxDQUFDLENBQUUsb0JBQW9CO0lBQzNELGNBQWMsR0FBYSxFQUFFLENBQUMsQ0FBRSxvREFBb0Q7SUFDcEYsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUMxQixlQUFlLEdBQVEsSUFBSSxDQUFDLENBQUUsK0JBQStCO0lBRTdELGNBQWMsQ0FBQyxHQUFXLEVBQUUsS0FBWTtRQUN0QyxNQUFNLE9BQU8sR0FBSSxLQUFLLENBQUMsTUFBMkIsQ0FBQyxPQUFPLENBQUM7UUFDM0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ25FLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMs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ZUFBZTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELFNBQVMsQ0FBQyxPQUFjO1FBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxZQUFZLENBQUMsT0FBYyxFQUFFLEtBQWE7UUFDeEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGVBQWU7SUFDZiw4RUFBOEU7SUFDOUUsSUFBSTtJQUVKLGlCQUFpQjtRQUNmLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQzt3R0ExZ0JVLG1CQUFtQjs0RkFBbkIsbUJBQW1CLG1LQ1ZoQyxtalBBMkxBOzs0RkRqTGEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGdCQUFnQjtnSEFNaEIsaUJBQWlCO3NCQUExQixNQUFNO2dCQUdFLG1CQUFtQjtzQkFBM0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFQIDIySkFOMjVcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mb3JtLWJ1aWxkZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1wcm9wZXJ0aWVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb3BlcnRpZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0aWVzLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBQcm9wZXJ0aWVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBAT3V0cHV0KCkgZm9ybUJ1dHRvbkhhbmRsZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTsgXG4gIHNlbGVjdGVkT3B0aW9uOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRFbGVtZW50SW5kZXg6IG51bWJlciA9IC0xO1xuICBASW5wdXQoKSBzZWxlY3RlZEVsZW1lbnRUeXBlOiBzdHJpbmcgPSAnJztcbiAgc2VsZWN0ZWRBbGlnbjogc3RyaW5nID0gJ2FsaWduLWxlZnQnOyAgLy8gQWRkIHRoaXMgcHJvcGVydHlcbiAgc2VsZWN0ZWRTdHlsZXM6IHN0cmluZ1tdID0gW107ICAvLyBVc2luZyBhcnJheSBzaW5jZSBtdWx0aXBsZSBzdHlsZXMgY2FuIGJlIHNlbGVjdGVkXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIHNlbGVjdGVkRWxlbWVudDogYW55ID0gbnVsbDsgIC8vIFJlY2VpdmUgdGhlIHNlbGVjdGVkIGVsZW1lbnRcblxuICBvblRvZ2dsZUNoYW5nZShrZXk6IHN0cmluZywgZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgY2hlY2tlZCA9IChldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudCA9IHsgLi4udGhpcy5zZWxlY3RlZEVsZW1lbnQsIFtrZXldOiBjaGVja2VkIH07XG4gICAgdGhpcy51cGRhdGVQcm9wZXJ0eShrZXksY2hlY2tlZCk7IC8vQVAtMDZNQVIyNSBCdWcgRml4ZWRcbiAgfSAgXG5cbiAgdXBkYXRlUHJvcGVydGllcyhlbGVtZW50VHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgYWxpZ25tZW50IGFuZCBzdHlsZXMgaWYgc3dpdGNoaW5nIGVsZW1lbnRzXG4gICAgdGhpcy5zZWxlY3RlZEFsaWduID0gJ2FsaWduLWxlZnQnO1xuICAgIHRoaXMuc2VsZWN0ZWRTdHlsZXMgPSBbXTtcblxuICAgIC8vIEZldGNoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50IHR5cGVcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5nZXRQcm9wZXJ0aWVzKCk7XG4gICAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvcGVydGllcyBhcmUgZHluYW1pY2FsbHkgdXBkYXRlZFxuICAgIH1cbiAgfVxuXG4gIG9uQWxpZ25TZWxlY3QodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQudGV4dEFsaWduID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb25TdHlsZVNlbGVjdCh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRWxlbWVudCkgcmV0dXJuO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzdHlsZXMgYXJyYXkgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50LnN0eWxlcyA9IHRoaXMuc2VsZWN0ZWRFbGVtZW50LnN0eWxlcyB8fCBbXTtcblxuICAgIC8vIEVuc3VyZSBvbmx5IG9uZSBzdHlsZSBpcyBzZWxlY3RlZCBhdCBhIHRpbWVcbiAgICB0aGlzLnNlbGVjdGVkRWxlbWVudC5zdHlsZXMgPSBbdmFsdWVdO1xuXG4gIH1cblxuICBpc1N0eWxlQWN0aXZlKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEVsZW1lbnQ/LnN0eWxlcz8uaW5jbHVkZXModmFsdWUpIHx8IGZhbHNlO1xuICB9XG5cbiAgZWxlbWVudFByb3BlcnRpZXMgPSB7XG5cbiAgICdUZXh0Jzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG5cbiAgICAgICAgLy8gcXVlc3Rpb25UZXh0IC0gTGFiZWwtZm9sbG93IGFsbCBlbGVtZW50IHByb3BlcnRpZXNcbiAgICAgICAgeyBsYWJlbDogJ0xhYmVsJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdxdWVzdGlvblRleHQnIH0sXG5cbiAgICAgICAgLy8gcXVlc3Rpb24gLSBQbGFjZWhvbGRlci1mb2xsb3cgYWxsIGVsZW1lbnQgcHJvcGVydGllc1xuICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnICwga2V5OiAncXVlc3Rpb24nfSxcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcsa2V5OiAnaGVscFRleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnLCBrZXk6ICd0b2dnbGVPcHRpb25zJyB9LFxuXG4gICAgICAgIC8vIGVycm9yTWVzc2FnZSAtIEVycm9yIE1zZy1mb2xsb3cgYWxsIGVsZW1lbnQgcHJvcGVydGllc1xuICAgICAgICB7IGxhYmVsOiAnRXJyb3IgTXNnJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdlcnJvck1lc3NhZ2UnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGb250JywgdHlwZTogJ3NlbGVjdCcsICBrZXk6ICdmb250JyAsXG4gICAgICAgICAgb3B0aW9uczogWydIZWx2ZXRpY2EgTmV1ZScsICdBcmlhbCcsICdUaW1lcyBOZXcgUm9tYW4nLCAnUm9ib3RvJ10gfSxcbiAgICAgICAgeyBsYWJlbDogJ1dlaWdodCcsIHR5cGU6ICdzZWxlY3QnLGtleTogJ2ZvbnRXZWlnaHQnLFxuICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgIHsgdmFsdWU6ICc0MDAnLCBsYWJlbDogJzQwMC1Ob3JtYWwnIH0sXG4gICAgICAgICAgICB7IHZhbHVlOiAnNTAwJywgbGFiZWw6ICc1MDAtTWVkaXVtJyB9LFxuICAgICAgICAgICAgeyB2YWx1ZTogJzYwMCcsIGxhYmVsOiAnNjAwLVNlbWkgQm9sZCcgfSxcbiAgICAgICAgICAgIHsgdmFsdWU6ICc3MDAnLCBsYWJlbDogJzcwMC1Cb2xkJyB9XG4gICAgICAgICAgXSB9LFxuICAgICAgICAvLyB7IGxhYmVsOiAnU2l6ZScsIHVuaXQ6ICdQWCcsIHR5cGU6ICdudW1iZXInLCBrZXk6ICdzaXplJyAgfSxcbiAgICAgICAgLy8geyBsYWJlbDogJ0FsaWduJywgdHlwZTogJ2FsaWduJywga2V5OiAndGV4dEFsaWduJyxcbiAgICAgICAgLy8gICBvcHRpb25zOiBbXG4gICAgICAgIC8vICAgICB7IHZhbHVlOiAnbGVmdCcsIGljb246ICd0ZXh0YWxpZ24tbGVmdCcgfSxcbiAgICAgICAgLy8gICAgIHsgdmFsdWU6ICdjZW50ZXInLCBpY29uOiAnYWxpZ24tY2VudGVyJyB9LFxuICAgICAgICAvLyAgICAgeyB2YWx1ZTogJ3JpZ2h0JywgaWNvbjogJ2FsaWduLXJpZ2h0JyB9LFxuICAgICAgICAvLyAgICAgeyB2YWx1ZTogJ2p1c3RpZnlsZWZ0JywgaWNvbjogJ2FsaWduLWp1c3RpZnlsZWZ0JyB9LFxuICAgICAgICAvLyAgICAgeyB2YWx1ZTogJ2p1c3RpZnlyaWdodCcsIGljb246ICdhbGlnbi1qdXN0aWZ5cmlnaHQnIH1cblxuICAgICAgICAvLyAgIF0gfSxcbiAgICAgICAgLy8geyBsYWJlbDogJ1N0eWxlJywgdHlwZTogJ3N0eWxlJyxrZXk6ICdzdHlsZXMnLFxuXG4gICAgICAgIC8vICAgb3B0aW9uczogW1xuICAgICAgICAvLyAgICAgeyB2YWx1ZTogJ2l0YWxpYycsIGljb246ICdpdGFsaWMnIH0sXG4gICAgICAgIC8vICAgICB7IHZhbHVlOiAnYm9sZCcsIGljb246ICdib2xkJyB9LFxuICAgICAgICAvLyAgICAgeyB2YWx1ZTogJ3VuZGVybGluZScsIGljb246ICd1bmRlcmxpbmUnIH0sXG4gICAgICAgIC8vICAgICB7IHZhbHVlOiAndGV4dGljb24nLCBpY29uOiAndGV4dGljb24nIH0sXG4gICAgICAgIC8vICAgICB7IHZhbHVlOiAnY2FwaXRhbGl6ZScsIGljb246ICdjYXBpdGFsaXplJyB9LFxuICAgICAgICAvLyAgICAgeyB2YWx1ZTogJ3Jlc2l6ZScsIGljb246ICdyZXNpemUnIH1cblxuXG4gICAgICAgIC8vICAgXSB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdGaWVsZCBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ3NpemUnIH1cblxuICAgICAgXSxcbiAgICAgIGZpZWxkUHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFJlcXVpcmVkJywgdHlwZTogJ3JhZGlvJywga2V5OiAnaXNSZXF1aXJlZCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQgJywgdHlwZTogJ3RleHQnLGtleTogJ2RlZmF1bHRWYWx1ZScgIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdHlsZScsIHBsYWNlaG9sZGVyOiAnU3R5bGUgSlNPTicsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3R5bGUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdWJUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0JyB9XG4gICAgICBdXG4gICAgfSxcblxuICAgICdDaGVja0JveCc6IHtcbiAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQgJywgdHlwZTogJ3RleHQnLGtleTogJ3F1ZXN0aW9uVGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1BsYWNlIEhvbGRlcicsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCAnLCB0eXBlOiAndGV4dCcgLCBrZXk6ICdxdWVzdGlvbid9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0ICcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdoZWxwVGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJycsIHR5cGU6ICd0b2dnbGVHcm91cCcsIGtleTogJ3RvZ2dsZU9wdGlvbnMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ3NpemUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFcnJvciBNc2cnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnZXJyb3JNZXNzYWdlJyB9LFxuICAgICAgXSxcbiAgICAgIGZpZWxkUHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFJlcXVpcmVkJywgdHlwZTogJ3JhZGlvJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6ICdPcHRpb25zJyxcbiAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLCBcbiAgICAgICAgICBrZXk6ICdvcHRpb25zJyxcbiAgICAgICAgICBhZGRPcHRpb25MYWJlbDogJ0FkZCBPcHRpb24nLFxuICAgICAgICAgIGljb246ICdwbHVzJ1xuICAgICAgICB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3JlZmVyZW5jZUZpZWxkJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3R5bGUnLCBwbGFjZWhvbGRlcjogJ1N0eWxlIEpTT04nLCB0eXBlOiAndGV4dCcsIGtleTogJ3N0eWxlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3N1YlRleHQnIH1cbiAgICAgIF1cbiAgICB9LFxuXG4gICAgJ0NhbGVuZGFyJzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdxdWVzdGlvblRleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgLCBrZXk6ICdxdWVzdGlvbid9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnc2l6ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Vycm9yIE1zZycsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdlcnJvck1lc3NhZ2UnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdHlsZScsIHBsYWNlaG9sZGVyOiAnU3R5bGUgSlNPTicsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3R5bGUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdWIgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dCcgfVxuICAgICAgXVxuICAgIH0sXG5cbiAgICAnVGltZSc6IHtcbiAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnbGFiZWwnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgLCBrZXk6ICdwbGFjZWhvbGRlcid9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnc2l6ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Vycm9yIE1zZycsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdlcnJvck1lc3NhZ2UnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdHlsZScsIHBsYWNlaG9sZGVyOiAnU3R5bGUgSlNPTicsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3R5bGUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdWIgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dCcgfVxuICAgICAgXVxuICAgIH0sXG5cbiAgICAnRW1haWwnOiB7XG4gICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0xhYmVsJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ3F1ZXN0aW9uVGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1BsYWNlIEhvbGRlcicsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyAsIGtleTogJ3F1ZXN0aW9uJ30sXG4gICAgICAgIHsgbGFiZWw6ICdIZWxwIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnaGVscFRleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnLCBrZXk6ICd0b2dnbGVPcHRpb25zJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdzaXplJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRXJyb3IgTXNnJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2Vycm9yTWVzc2FnZScgfSxcbiAgICAgIF0sXG4gICAgICBmaWVsZFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBSZXF1aXJlZCcsIHR5cGU6ICdyYWRpbycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZScsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N0eWxlJywgcGxhY2Vob2xkZXI6ICdTdHlsZSBKU09OJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdHlsZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1YiBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0JyB9XG4gICAgICBdXG4gICAgfSxcblxuICAgICdGaWxlJzoge1xuICAgICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgICB7IGxhYmVsOiAnTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3F1ZXN0aW9uVGV4dCcgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdxdWVzdGlvbicgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdoZWxwVGV4dCcgfSxcblxuICAgICAgICAgIHsgbGFiZWw6ICdTdXBwb3J0IFR5cGUnLCB0eXBlOiAnc2VsZWN0Jywga2V5OiAnc3VwcG9ydFR5cGUnLCBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnSW1hZ2VzIChKUEVHLCBQTkcsIEdJRiknLCB2YWx1ZTogJ2ltYWdlLyonLCBleHRlbnNpb25zOiBbJy5qcGcnLCcuanBlZycsJy5wbmcnLCcuZ2lmJ10gfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdBdWRpbyAoTVAzLCBXQVYsIEFJRkYpJywgdmFsdWU6ICdhdWRpby8qJywgZXh0ZW5zaW9uczogWycubXAzJywnLndhdicsJy5haWZmJ10gfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdWaWRlbyAoTVA0LCBBVkksIEhFVkMpJywgdmFsdWU6ICd2aWRlby8qJywgZXh0ZW5zaW9uczogWycubXA0JywnLmF2aScsJy5oZXZjJ10gfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdEb2N1bWVudHMgKERPQywgRE9DWCwgUFBULCBQREYpJywgdmFsdWU6ICdhcHBsaWNhdGlvbi9wZGYsYXBwbGljYXRpb24vbXN3b3JkLGFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50LGFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywgZXh0ZW5zaW9uczogWycuZG9jJywnLmRvY3gnLCcucHB0JywnLnBkZiddIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnRXhlY3V0YWJsZXMgKEVYRSwgQkFELCBTSCknLCB2YWx1ZTogJ2FwcGxpY2F0aW9uL3gtbXNkb3dubG9hZCxhcHBsaWNhdGlvbi94LXNoJywgZXh0ZW5zaW9uczogWycuZXhlJywnLmJhZCcsJy5zaCddIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnQXJjaGl2ZXMgKFpJUCwgUkFSLCBHaXQtaHViKScsIHZhbHVlOiAnYXBwbGljYXRpb24vemlwLGFwcGxpY2F0aW9uL3gtcmFyLWNvbXByZXNzZWQsYXBwbGljYXRpb24veC1naXQnLCBleHRlbnNpb25zOiBbJy56aXAnLCcucmFyJywnLmdpdCddIH1cbiAgICAgICAgICBdfSxcbiAgICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdzaXplJyB9LFxuICAgICAgICAgIHsgbGFiZWw6ICdFcnJvciBNc2cnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ2Vycm9yTWVzc2FnZScgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICAgIHsgbGFiZWw6ICdGaWVsZCBSZXF1aXJlZCcsIHR5cGU6ICdyYWRpbycgfSxcbiAgICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZScsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N0eWxlJywgcGxhY2Vob2xkZXI6ICdTdHlsZSBKU09OJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdHlsZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1YiBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0JyB9XG4gICAgICAgIF1cbiAgICB9LFxuXG4gICAgJ0xpc3QnOiB7XG4gICAgICBlbGVtZW50UHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0xhYmVsJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ3F1ZXN0aW9uVGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1BsYWNlIEhvbGRlcicsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyAsIGtleTogJ3F1ZXN0aW9uJ30sXG4gICAgICAgIHsgbGFiZWw6ICdIZWxwIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnaGVscFRleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICcnLCB0eXBlOiAndG9nZ2xlR3JvdXAnLCBrZXk6ICd0b2dnbGVPcHRpb25zJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdzaXplJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRXJyb3IgTXNnJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2Vycm9yTWVzc2FnZScgfSxcbiAgICAgIF0sXG4gICAgICBmaWVsZFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBSZXF1aXJlZCcsIHR5cGU6ICdyYWRpbycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZScsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N0eWxlJywgcGxhY2Vob2xkZXI6ICdTdHlsZSBKU09OJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdHlsZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1YiBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0JyB9XG4gICAgICBdXG4gICAgfSwgXG4gICAgXG4gICAgJ1RleHRBcmVhJzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdxdWVzdGlvblRleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgLCBrZXk6ICdxdWVzdGlvbid9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnc2l6ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Vycm9yIE1zZycsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdlcnJvck1lc3NhZ2UnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nLCBrZXk6ICdyZXF1aXJlZCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ2RlZmF1bHRWYWx1ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZScsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N0eWxlJywgcGxhY2Vob2xkZXI6ICdTdHlsZSBKU09OJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdHlsZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1YiBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0JyB9XG4gICAgICBdXG4gICAgfSxcbiAgICBcbiAgICAnUmljaFRleHRBcmVhJzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdxdWVzdGlvblRleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgLCBrZXk6ICdxdWVzdGlvbid9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnc2l6ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Vycm9yIE1zZycsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdlcnJvck1lc3NhZ2UnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nLCBrZXk6ICdyZXF1aXJlZCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0RlZmF1bHQgVmFsdWUnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ2RlZmF1bHRWYWx1ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlZmVyZW5jZScsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N0eWxlJywgcGxhY2Vob2xkZXI6ICdTdHlsZSBKU09OJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdHlsZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1YiBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0JyB9XG4gICAgICBdXG4gICAgfSxcbiAgICBcbiAgICAnTnVtYmVyJzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdxdWVzdGlvblRleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgLCBrZXk6ICdxdWVzdGlvbid9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnc2l6ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Vycm9yIE1zZycsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdlcnJvck1lc3NhZ2UnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdHlsZScsIHBsYWNlaG9sZGVyOiAnU3R5bGUgSlNPTicsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3R5bGUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdWIgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dCcgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXG4gICAgJ0Ryb3Bkb3duJzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdxdWVzdGlvblRleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgLCBrZXk6ICdxdWVzdGlvbid9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnc2l6ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Vycm9yIE1zZycsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdlcnJvck1lc3NhZ2UnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ09wdGlvbnMnLFxuICAgICAgICAgIHR5cGU6ICdkcm9wZG93bicsXG4gICAgICAgICAga2V5OiAnb3B0aW9ucycsIFxuICAgICAgICAgIGFkZE9wdGlvbkxhYmVsOiAnQWRkIFZhcmlhbnQnLFxuICAgICAgICAgIGljb246ICdwbHVzJ1xuICAgICAgICB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3JlZmVyZW5jZUZpZWxkJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3R5bGUnLCBwbGFjZWhvbGRlcjogJ1N0eWxlIEpTT04nLCB0eXBlOiAndGV4dCcsIGtleTogJ3N0eWxlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3N1YlRleHQnIH1cblxuICAgICAgXVxuICAgIH0sXG4gICAgXG4gICAgJ0ltYWdlJzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdxdWVzdGlvblRleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgLCBrZXk6ICdxdWVzdGlvbid9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnc2l6ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Vycm9yIE1zZycsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdlcnJvck1lc3NhZ2UnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdHlsZScsIHBsYWNlaG9sZGVyOiAnU3R5bGUgSlNPTicsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3R5bGUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdWIgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dCcgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXG4gICAgJ1JhZGlvJzoge1xuICBlbGVtZW50UHJvcHM6IFtcbiAgICB7IGxhYmVsOiAnTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3F1ZXN0aW9uVGV4dCcgfSxcbiAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdxdWVzdGlvbicgfSxcbiAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdoZWxwVGV4dCcgfSxcbiAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdzaXplJyB9LFxuICAgIHsgbGFiZWw6ICdFcnJvciBNc2cnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ2Vycm9yTWVzc2FnZScgfSxcbiAgXSxcbiAgZmllbGRQcm9wczogW1xuICAgIHsgbGFiZWw6ICdGaWVsZCBSZXF1aXJlZCcsIHR5cGU6ICdyYWRpbycgfSxcbiAgICB7IGxhYmVsOiAnRGVmYXVsdCBWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnT3B0aW9ucycsXG4gICAgICB0eXBlOiAncmFkaW8nLCBcbiAgICAgIGtleTogJ29wdGlvbnMnLFxuICAgICAgYWRkT3B0aW9uTGFiZWw6ICdBZGQgT3B0aW9uJyxcbiAgICAgIGljb246ICdwbHVzJ1xuICAgIH0sXG4gICAgeyBsYWJlbDogJ1JlZmVyZW5jZScsIHBsYWNlaG9sZGVyOiAnUmVmZXJlbmNlIEZpZWxkJywgdHlwZTogJ3RleHQnLCBrZXk6ICdyZWZlcmVuY2VGaWVsZCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N0eWxlJywgcGxhY2Vob2xkZXI6ICdTdHlsZSBKU09OJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdHlsZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1YiBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdWJUZXh0JyB9XG4gIF1cbiAgICB9LFxuICAgIFxuICAgICdMYWJlbCc6IHtcbiAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAncXVlc3Rpb25UZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnICwga2V5OiAncXVlc3Rpb24nfSxcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdoZWxwVGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJycsIHR5cGU6ICd0b2dnbGVHcm91cCcsIGtleTogJ3RvZ2dsZU9wdGlvbnMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ3NpemUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFcnJvciBNc2cnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnZXJyb3JNZXNzYWdlJyB9LFxuICAgICAgXSxcbiAgICAgIGZpZWxkUHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFJlcXVpcmVkJywgdHlwZTogJ3JhZGlvJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3JlZmVyZW5jZUZpZWxkJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3R5bGUnLCBwbGFjZWhvbGRlcjogJ1N0eWxlIEpTT04nLCB0eXBlOiAndGV4dCcsIGtleTogJ3N0eWxlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3N1YlRleHQnIH1cbiAgICAgIF1cbiAgICB9LFxuXG4gICAgJ1RhYmxlJzoge1xuICBlbGVtZW50UHJvcHM6IFtcbiAgICB7IGxhYmVsOiAnTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3F1ZXN0aW9uVGV4dCcgfSxcbiAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLCBrZXk6ICdoZWxwVGV4dCcgfSxcbiAgICB7IGxhYmVsOiAnRmllbGQgU2l6ZScsIHR5cGU6ICdmaWVsZFNpemUnLCBrZXk6ICdzaXplJyB9LFxuICAgIHsgbGFiZWw6ICdFcnJvciBNc2cnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ2Vycm9yTWVzc2FnZScgfVxuICBdLFxuICBmaWVsZFByb3BzOiBbXG4gICAgeyBsYWJlbDogJ0ZpZWxkIFJlcXVpcmVkJywgdHlwZTogJ3JhZGlvJyB9LFxuICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgeyBsYWJlbDogJ1N0eWxlJywgcGxhY2Vob2xkZXI6ICdTdHlsZSBKU09OJywgdHlwZTogJ3RleHQnLCBrZXk6ICdzdHlsZScgfSxcbiAgICB7IGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3N1YlRleHQnIH0sXG4gIF1cbiAgICB9LFxuICAgIFxuICAgICdCb29rJzoge1xuICAgICAgZWxlbWVudFByb3BzOiBbXG4gICAgICAgIHsgbGFiZWw6ICdMYWJlbCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdxdWVzdGlvblRleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQbGFjZSBIb2xkZXInLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcgLCBrZXk6ICdxdWVzdGlvbid9LFxuICAgICAgICB7IGxhYmVsOiAnSGVscCBUZXh0JywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnLGtleTogJ2hlbHBUZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnJywgdHlwZTogJ3RvZ2dsZUdyb3VwJywga2V5OiAndG9nZ2xlT3B0aW9ucycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFNpemUnLCB0eXBlOiAnZmllbGRTaXplJywga2V5OiAnc2l6ZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Vycm9yIE1zZycsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdlcnJvck1lc3NhZ2UnIH0sXG4gICAgICBdLFxuICAgICAgZmllbGRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnRmllbGQgUmVxdWlyZWQnLCB0eXBlOiAncmFkaW8nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEZWZhdWx0IFZhbHVlJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWZlcmVuY2UnLCBwbGFjZWhvbGRlcjogJ1JlZmVyZW5jZSBGaWVsZCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAncmVmZXJlbmNlRmllbGQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdHlsZScsIHBsYWNlaG9sZGVyOiAnU3R5bGUgSlNPTicsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3R5bGUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdWIgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0Jywga2V5OiAnc3ViVGV4dCcgfVxuICAgICAgXVxuICAgIH0sXG4gICAgXG4gICAgJ0J1dHRvbic6IHtcbiAgICAgIGVsZW1lbnRQcm9wczogW1xuICAgICAgICB7IGxhYmVsOiAnTGFiZWwnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAncXVlc3Rpb25UZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnUGxhY2UgSG9sZGVyJywgcGxhY2Vob2xkZXI6ICdFbnRlciBUZXh0JywgdHlwZTogJ3RleHQnICwga2V5OiAncXVlc3Rpb24nfSxcbiAgICAgICAgeyBsYWJlbDogJ0hlbHAgVGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyxrZXk6ICdoZWxwVGV4dCcgfSxcbiAgICAgICAgeyBsYWJlbDogJycsIHR5cGU6ICd0b2dnbGVHcm91cCcsIGtleTogJ3RvZ2dsZU9wdGlvbnMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGaWVsZCBTaXplJywgdHlwZTogJ2ZpZWxkU2l6ZScsIGtleTogJ3NpemUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFcnJvciBNc2cnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsa2V5OiAnZXJyb3JNZXNzYWdlJyB9LFxuICAgICAgXSxcbiAgICAgIGZpZWxkUHJvcHM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0ZpZWxkIFJlcXVpcmVkJywgdHlwZTogJ3JhZGlvJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRGVmYXVsdCBWYWx1ZScsIHBsYWNlaG9sZGVyOiAnRW50ZXIgVGV4dCcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVmZXJlbmNlJywgcGxhY2Vob2xkZXI6ICdSZWZlcmVuY2UgRmllbGQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3JlZmVyZW5jZUZpZWxkJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3R5bGUnLCBwbGFjZWhvbGRlcjogJ1N0eWxlIEpTT04nLCB0eXBlOiAndGV4dCcsIGtleTogJ3N0eWxlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3ViIFRleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIFRleHQnLCB0eXBlOiAndGV4dCcsIGtleTogJ3N1YlRleHQnIH1cbiAgICAgIF1cbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxwcml2YXRlIGZvcm1CdWlsZGVyU2VydmljZTogRm9ybUJ1aWxkZXJTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZm9ybUJ1aWxkZXJTZXJ2aWNlLnNlbGVjdGVkRWxlbWVudCQuc3Vic2NyaWJlKGluZGV4ID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXggPSBpbmRleDtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZ2V0RWxlbWVudHMoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07XG4gICAgICB9XG4gICAgICBcbiAgICB9KTsgICAgXG4gIH1cblxuICB2YWxpZGF0ZUlucHV0KHZhbHVlOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlID09PSAnbGFiZWwnIHx8IHR5cGUgPT09ICdwbGFjZWhvbGRlcicpIHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gL15bYS16QS1aMC05XFxzXSokLztcbiAgICAgIGlmICghcmVnZXgudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSAnT25seSBsZXR0ZXJzIGFuZCBudW1iZXJzIGFyZSBhbGxvd2VkJztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdXBkYXRlUHJvcGVydHkoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEVsZW1lbnRJbmRleCA+PSAwKSB7XG4gICAgICBpZiAoa2V5ID09PSAncXVlc3Rpb25UZXh0JyB8fCBrZXkgPT09ICdxdWVzdGlvbicpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlSW5wdXQodmFsdWUsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PT0gJ2ZvbnRXZWlnaHQnKSB7XG4gICAgICAgIC8vIEV4dHJhY3QganVzdCB0aGUgbnVtYmVyIHZhbHVlIGZyb20gdGhlIG9wdGlvblxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KCctJylbMF07XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT09ICdzdHlsZXMnKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdHlsZXMgPSB0aGlzLnNlbGVjdGVkRWxlbWVudC5zdHlsZXMgfHwgW107XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ2NhcGl0YWxpemUnIHx8IHZhbHVlID09PSAnbG93ZXJjYXNlJykge1xuICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb3Bwb3NpdGUgY2FzZSBpZiBpdCBleGlzdHNcbiAgICAgICAgICBjb25zdCBvcHBvc2l0ZVN0eWxlID0gdmFsdWUgPT09ICdjYXBpdGFsaXplJyA/ICdsb3dlcmNhc2UnIDogJ2NhcGl0YWxpemUnO1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkU3R5bGVzID0gY3VycmVudFN0eWxlcy5maWx0ZXIocyA9PiBzICE9PSBvcHBvc2l0ZVN0eWxlKTtcbiAgICAgICAgICB2YWx1ZSA9IGN1cnJlbnRTdHlsZXMuaW5jbHVkZXModmFsdWUpXG4gICAgICAgICAgICA/IGZpbHRlcmVkU3R5bGVzLmZpbHRlcihzID0+IHMgIT09IHZhbHVlKVxuICAgICAgICAgICAgOiBbLi4uZmlsdGVyZWRTdHlsZXMsIHZhbHVlXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUb2dnbGUgb3RoZXIgc3R5bGVzXG4gICAgICAgICAgdmFsdWUgPSBjdXJyZW50U3R5bGVzLmluY2x1ZGVzKHZhbHVlKVxuICAgICAgICAgICAgPyBjdXJyZW50U3R5bGVzLmZpbHRlcihzID0+IHMgIT09IHZhbHVlKVxuICAgICAgICAgICAgOiBbLi4uY3VycmVudFN0eWxlcywgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHsgW2tleV06IHZhbHVlIH07XG4gICAgICB0aGlzLmZvcm1CdWlsZGVyU2VydmljZS51cGRhdGVFbGVtZW50KHRoaXMuc2VsZWN0ZWRFbGVtZW50SW5kZXgsIHVwZGF0ZSk7XG5cbiAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGZvbnQgYW5kIGZvbnQgd2VpZ2h0XG4gICAgICBpZiAoa2V5ID09PSAnZm9udCcpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVsZW1lbnQuZm9udCA9IHZhbHVlOyAvLyBEaXJlY3RseSB1cGRhdGUgdGhlIHNlbGVjdGVkIGVsZW1lbnQncyBmb250IHByb3BlcnR5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25SZXF1aXJlZENoYW5nZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudCkge1xuICAgICAgbGV0IGxhYmVsID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQubGFiZWwgPyB0aGlzLnNlbGVjdGVkRWxlbWVudC5sYWJlbC5yZXBsYWNlKC9cXHMqXFwqKyQvLCAnJykgOiAnTGFiZWwnO1xuICBcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBsYWJlbCA9IGAke2xhYmVsfSAqYDsgXG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlUHJvcGVydHkoJ2xhYmVsJywgbGFiZWwpO1xuICAgICAgdGhpcy51cGRhdGVQcm9wZXJ0eSgnaXNSZXF1aXJlZCcsIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgXG4gIGdldFByb3BlcnRpZXMoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRWxlbWVudCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFByb3BlcnRpZXNbdGhpcy5zZWxlY3RlZEVsZW1lbnQudHlwZV07XG4gIH1cbiAgXG4gIGFkZE9wdGlvbihvcHRpb25zOiBhbnlbXSkge1xuICAgIG9wdGlvbnMucHVzaCh7IGxhYmVsOiAnJywgdmFsdWU6ICcnIH0pOyBcbiAgfVxuXG4gIHJlbW92ZU9wdGlvbihvcHRpb25zOiBhbnlbXSwgaW5kZXg6IG51bWJlcikge1xuICAgIG9wdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfSAgXG5cbiAgLy8gZG93bmxvYWQoKSB7XG4gIC8vICAgY29uc29sZS5sb2coJ1F1ZXN0aW9uIEJvb2s6JywgdGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZG93bmxvYWRFbGVtZW50KCkpO1xuICAvLyB9XG5cbiAgaGFuZGxlQnV0dG9uQ2xpY2soKXtcbiAgICB0aGlzLmZvcm1CdXR0b25IYW5kbGVyLmVtaXQodGhpcy5mb3JtQnVpbGRlclNlcnZpY2UuZG93bmxvYWRFbGVtZW50KCkpO1xuICB9XG5cbn1cbiIsIjwhLS0gQVAgMjJKQU4yNSAtIEZpZWxkIGFuZCBFbGVtZW50IFByb3BlcnRpZXMgLS0+XG48bGluayBocmVmPVwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzozMDAsNDAwLDUwMCZkaXNwbGF5PXN3YXBcIiByZWw9XCJzdHlsZXNoZWV0XCI+XG48ZGl2IGNsYXNzPVwicHJvcGVydGllc1wiPlxuXG48IS0tIERlc2lnbiBIZWFkZXIgU2VjdGlvbiAtLT5cbjxkaXYgY2xhc3M9XCJkZXNpZ24taGVhZGVyXCI+XG4gIDxoMSBjbGFzcz1cImhlYWRlci10aXRsZVwiPlByb3BlcnRpZXM8L2gxPlxuICA8IS0tIEFQIDI1RkVCMjUgLSBub3QgdXNlZCAtLT5cbiAgPCEtLSA8ZGl2IGNsYXNzPVwibWVudS1jb250YWluZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtXCIgKGNsaWNrKT1cImRvd25sb2FkKClcIj5cbiAgICAgIDxzcGFuID5Eb3dubG9hZDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtXCI+XG4gICAgICA8c3Bhbj5TdGFydDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWVudS1pdGVtXCI+XG4gICAgICA8c3Bhbj5QYXRoPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtZW51LWl0ZW1cIj5cbiAgICAgIDxzcGFuPkNsb25lPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj4gLS0+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImFsbC1wcm9wZXJ0aWVzXCI+XG48ZGl2ICpuZ0lmPVwiZXJyb3JNZXNzYWdlXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+e3sgZXJyb3JNZXNzYWdlIH19PC9kaXY+XG5cbjwhLS0gRWxlbWVudCBQcm9wZXJ0aWVzIC0tPlxuIDwhLS0gQVAtMDZNQVIyNSBTZWxlY3QgZWxlbWVudCB0eXBlIHNob3cgLS0+XG48ZGV0YWlscyBjbGFzcz1cImZpcnN0LXByb3BlcnRpZXNcIiBvcGVuPlxuICA8c3VtbWFyeSBjbGFzcz1cInRleHQtc20gXCI+RWxlbWVudHMgUHJvcGVydGllczwvc3VtbWFyeT5cbiAgICA8ZGl2IGNsYXNzPVwiaW5uZXItY29udGVudFwiICpuZ0lmPVwiZ2V0UHJvcGVydGllcygpXCI+XG4gICAgICB7e3NlbGVjdGVkRWxlbWVudC50eXBlfX1cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3Agb2YgZ2V0UHJvcGVydGllcygpLmVsZW1lbnRQcm9wc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LXNtXCI+e3sgcHJvcC5sYWJlbCB9fTwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxhYmVsLXByb3BlcnRpZXNcIj5cblxuPCEtLSBUZXh0IElucHV0IC0tPlxuPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInByb3AucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudFtwcm9wLmtleV1cIlxuICAgICAgICAgICAgKGlucHV0KT1cInVwZGF0ZVByb3BlcnR5KHByb3Aua2V5LCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXG4gICAgICAgICAgICBbY2xhc3MucmVhZC1vbmx5XT1cInNlbGVjdGVkRWxlbWVudC5yZWFkT25seVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwic2VsZWN0ZWRFbGVtZW50LnJlYWRPbmx5XCJcbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1zbTEgXCIvPlxuXG48ZGl2ICpuZ0lmPVwicHJvcC5rZXkgPT09ICdoZWxwVGV4dCcgJiYgc2VsZWN0ZWRFbGVtZW50LmhlbHBUZXh0XCIgY2xhc3M9XCJoZWxwLXRleHRcIj57eyBzZWxlY3RlZEVsZW1lbnQuaGVscFRleHQgfX08L2Rpdj5cblxuPCEtLSBGb250IFNlbGVjdGlvbiAtLT5cbjxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2ZvbnQnXCIgY2xhc3M9XCJmb250LXNlbGVjdGlvblwiPlxuICA8IS0tIDxsYWJlbD57eyBwcm9wLmxhYmVsIH19PC9sYWJlbD4gLS0+XG4gIDxzZWxlY3QgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzZWxlY3QnICYmIHByb3Aua2V5ID09PSAnZm9udCdcIiBjbGFzcz1cImZvbnQtc2VsZWN0aW9uMVwiIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnQ/LmZvbnRcIlxuICAgIChjaGFuZ2UpPVwidXBkYXRlUHJvcGVydHkoJ2ZvbnQnLCAkZXZlbnQudGFyZ2V0LnZhbHVlKVwiPlxuICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uXCI+IHt7IG9wdGlvbiB9fSA8L29wdGlvbj5cbiAgPC9zZWxlY3Q+XG48L2Rpdj5cblxuPCEtLSBmaWxlIC0tPlxuPCEtLSBBZGQgdGhpcyBpbnNpZGUgdGhlIGVsZW1lbnRQcm9wcyBsb29wIHdoZXJlIG90aGVyIGlucHV0cyBhcmUgcmVuZGVyZWQgLS0+XG48c2VsZWN0ICpuZ0lmPVwicHJvcC50eXBlID09PSAnc2VsZWN0JyAmJiBwcm9wLmtleSA9PT0gJ3N1cHBvcnRUeXBlJ1wiIGNsYXNzPVwiZmlsZVwiIFt2YWx1ZV09XCJzZWxlY3RlZEVsZW1lbnRbcHJvcC5rZXldXCJcbihjaGFuZ2UpPVwidXBkYXRlUHJvcGVydHkocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCI+XG48b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IGZpbGUgY2F0ZWdvcnk8L29wdGlvbj5cbjxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+IHt7IG9wdGlvbi5sYWJlbCB9fSA8L29wdGlvbj5cbjwvc2VsZWN0PlxuXG48IS0tIEZvbnQgV2VpZ2h0IFNlbGVjdGlvbiAtLT5cbjxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ2ZvbnRXZWlnaHQnXCIgY2xhc3M9XCJmb250LXdlaWdodFwiPlxuICA8IS0tIDxsYWJlbD57eyBwcm9wLmxhYmVsIH19PC9sYWJlbD4gLS0+XG4gIDxzZWxlY3QgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzZWxlY3QnICYmIHByb3Aua2V5ID09PSAnZm9udFdlaWdodCdcIiBjbGFzcz1cImZvbnQtd2VpZ2h0XCIgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudD8uZm9udFdlaWdodFwiXG4gICAgKGNoYW5nZSk9XCJ1cGRhdGVQcm9wZXJ0eSgnZm9udFdlaWdodCcsICRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb24udmFsdWVcIj4ge3sgb3B0aW9uLmxhYmVsIH19IDwvb3B0aW9uPlxuICA8L3NlbGVjdD5cbjwvZGl2PlxuICAgICAgICBcbjwhLS0gVG9nZ2xlIEdyb3VwIC0tPlxuPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ3RvZ2dsZUdyb3VwJ1wiIGNsYXNzPVwidG9nZ2xlLWdyb3VwXCI+XG4gIDxkaXYgY2xhc3M9XCJ0b2dnbGUtaXRlbVwiPlxuICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCI+UmVhZCBPbmx5PC9zcGFuPlxuICAgIDxsYWJlbCBjbGFzcz1cInN3aXRjaFwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cInNlbGVjdGVkRWxlbWVudD8uaXNSZWFkT25seVwiIFxuICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVDaGFuZ2UoJ2lzUmVhZE9ubHknLCAkZXZlbnQpXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2xpZGVyXCI+PC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJ0b2dnbGUtaXRlbVwiPlxuICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLWxhYmVsXCI+SXMgSGlkZTwvc3Bhbj5cbiAgICA8bGFiZWwgY2xhc3M9XCJzd2l0Y2hcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQ/LmlzSGlkZGVuXCIgXG4gICAgICAgICAgICAgKGNoYW5nZSk9XCJvblRvZ2dsZUNoYW5nZSgnaXNIaWRkZW4nLCAkZXZlbnQpXCIgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2xpZGVyXCI+PC9zcGFuPlxuICAgIDwvbGFiZWw+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gVGV4dCBBbGlnbiBCdXR0b25zIC0tPlxuPGRpdiAqbmdJZj1cInByb3AudHlwZSA9PT0gJ2FsaWduJ1wiY2xhc3M9XCJmb250LWFsaWduXCI+XG4gPGJ1dHRvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHByb3Aub3B0aW9uc1wiIChjbGljayk9XCJvbkFsaWduU2VsZWN0KG9wdGlvbi52YWx1ZSlcIiBcbiAgW2NsYXNzLmFjdGl2ZV09XCJzZWxlY3RlZEVsZW1lbnQ/LnRleHRBbGlnbiA9PT0gb3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJhbGlnbi1idG5cIiBbdGl0bGVdPVwib3B0aW9uLnZhbHVlXCI+XG4gIDxpbWcgW3NyY109XCInLi4vYXNzZXRzL2ljb25zLycgKyBvcHRpb24uaWNvbiArICcuc3ZnJ1wiIFthbHRdPVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJpY29uLXNpemVcIi8+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdzdHlsZSdcIiAgY2xhc3M9XCJmb250LXN0eWxlXCI+XG4gIDxidXR0b24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBwcm9wLm9wdGlvbnNcIiAoY2xpY2spPVwib25TdHlsZVNlbGVjdChvcHRpb24udmFsdWUpXCJcbiAgW2NsYXNzLmFjdGl2ZV09XCJpc1N0eWxlQWN0aXZlKG9wdGlvbi52YWx1ZSlcIiBjbGFzcz1cInN0eWxlLWJ0blwiIFt0aXRsZV09XCJvcHRpb24udmFsdWVcIj5cbiAgIDxpbWcgW3NyY109XCInLi4vYXNzZXRzL2ljb25zLycgKyBvcHRpb24uaWNvbiArICcuc3ZnJ1wiIFthbHRdPVwib3B0aW9uLnZhbHVlXCIgY2xhc3M9XCJpY29uLXNpemVcIi8+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG5cbjwhLS0gRmllbGQgU2l6ZSBDb250cm9scyAtLT5cbjwhLS0gQVAgMjVGRUIyNSAtIENoYW5nZSBrZXkgc2l6ZSAtLT5cbjxkaXYgKm5nSWY9XCJwcm9wLmtleSA9PT0gJ3NpemUnXCIgY2xhc3M9XCJmaWVsZC1zaXplLWNvbnRyb2xzXCI+XG4gIDxkaXYgY2xhc3M9XCJzaXplLWdyb3VwXCI+XG4gICAgPGxhYmVsICBjbGFzcz1cInNpemUtbGFiZWxcIj5XaWR0aDwvbGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cInZhbHVlLWNvbnRhaW5lclwiPlxuICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudD8uc2l6ZVwiIChpbnB1dCk9XCJ1cGRhdGVQcm9wZXJ0eSgnc2l6ZScsICRldmVudC50YXJnZXQudmFsdWUpXCIgY2xhc3M9XCJzaXplLWlucHV0XCIvPlxuICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPC9kaXY+XG48L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG48L2RldGFpbHM+XG5cbjwhLS0gRmllbGQgRWxlbWVudHMgUHJvcGVydGllcyAtLT5cbiA8IS0tIEFQLTA2TUFSMjUgU2hvdyBlbGVtZW50cyBJRCAgLS0+XG48ZGV0YWlscyBjbGFzcz1cInNlY29uZC1wcm9wZXJ0eVwiPlxuICA8c3VtbWFyeSBjbGFzcz1cInRleHQtZm9udC1tZWRpdW1cIj5GaWVsZCBFbGVtZW50cyBQcm9wZXJ0aWVzPC9zdW1tYXJ5PlxuICA8ZGl2IGNsYXNzPVwic3BhY2UteS00XCIgKm5nSWY9XCJnZXRQcm9wZXJ0aWVzKClcIj5cbiAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxM3B4OyBwYWRkaW5nOjVweDtib3JkZXItcmFkaXVzOjNweDtiYWNrZ3JvdW5kLWNvbG9yOiNlZmY4ZmY7XCI+IGlkIDoge3tzZWxlY3RlZEVsZW1lbnQuaWR9fTwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3Agb2YgZ2V0UHJvcGVydGllcygpLmZpZWxkUHJvcHNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWl0ZW1zLWNlbnRlciBcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbVwiPnt7IHByb3AubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtYm94LWZpZWxkXCI+XG4gICAgICAgICAgPCEtLSBJbnB1dCBCb3ggLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWJveC1maWVsZFwiPlxuICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwicHJvcC50eXBlID09PSAndGV4dCdcIiB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJwcm9wLnBsYWNlaG9sZGVyXCIgW3ZhbHVlXT1cInNlbGVjdGVkRWxlbWVudFtwcm9wLmtleV1cIlxuICAgICAgICAgICAgICAoaW5wdXQpPVwidXBkYXRlUHJvcGVydHkocHJvcC5rZXksICRldmVudC50YXJnZXQudmFsdWUpXCIvPiA8L2Rpdj5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgPCEtLSBSYWRpbyBHcm91cCAtLT5cbjxkaXYgKm5nSWY9XCJwcm9wLnR5cGUgPT09ICdyYWRpbydcIiBjbGFzcz1cInJhZGlvLWl0ZW1cIj5cbiAgPGRpdiBjbGFzcz1cInNpemVzXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgtZ2FwXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgtaXRlbXNcIj5cbiAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBbY2hlY2tlZF09XCJzZWxlY3RlZEVsZW1lbnQ/LmlzUmVxdWlyZWRcIiAoY2hhbmdlKT1cIm9uUmVxdWlyZWRDaGFuZ2UodHJ1ZSlcIiBuYW1lPVwicmVxdWlyZWRcIiBjbGFzcz1cInJhZGlvLWlucHV0XCIvPlxuICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1sYWJlbFwiPiBSZXF1aXJlZCA8L2xhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWl0ZW1zXCI+XG4gICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgW2NoZWNrZWRdPVwiIXNlbGVjdGVkRWxlbWVudD8uaXNSZXF1aXJlZFwiIChjaGFuZ2UpPVwib25SZXF1aXJlZENoYW5nZShmYWxzZSlcIiBuYW1lPVwicmVxdWlyZWRcIiBjbGFzcz1cInJhZGlvLWlucHV0XCIvPlxuICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1zbSB0ZXh0LWdyYXktNDAwXCI+IE5vdCBSZXF1aXJlZCA8L2xhYmVsPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPC9kaXY+IFxuXG48IS0tIEFQIDI1RkVCMjUgLSBoYW5kbGVkIG9wdGlvbnMgLS0+XG48ZGl2ICpuZ0lmPVwicHJvcC50eXBlID09PSAnZHJvcGRvd24nIHx8IHByb3AudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBwcm9wLnR5cGUgPT09ICdyYWRpbycgJiYgcHJvcC5rZXkgPT09ICdvcHRpb25zJ1wiIGNsYXNzPVwib3B0aW9ucy1jb250YWluZXJcIj5cbiAgPGRpdiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNlbGVjdGVkRWxlbWVudFtwcm9wLmtleV07IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm9wdGlvbi1pdGVtc1wiPlxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFbGVtZW50W3Byb3Aua2V5XVtpXS52YWx1ZVwiIHBsYWNlaG9sZGVyPVwiT3B0aW9uIHt7IGkgKyAxIH19XCIgY2xhc3M9XCJvcHRpb25zXCIvPlxuICAgIDxpbWcgc3JjPVwiLi4vYXNzZXRzL2ljb25zL1RyYXNoLnN2Z1wiIChjbGljayk9XCJyZW1vdmVPcHRpb24oc2VsZWN0ZWRFbGVtZW50W3Byb3Aua2V5XSwgaSlcIj5cbiAgPC9kaXY+XG4gIDxidXR0b24gKGNsaWNrKT1cImFkZE9wdGlvbihzZWxlY3RlZEVsZW1lbnRbcHJvcC5rZXldKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJhZGQtdmFyaWVudFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxnXCI+Kzwvc3Bhbj5cbiAgICAgIDxzcGFuPkFkZDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9idXR0b24+XG48L2Rpdj5cblxuPC9kaXY+XG48L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuPC9kaXY+XG48L2RldGFpbHM+XG5cbjxkaXYgY2xhc3M9XCJkZXNpZ24tZm9vdGVyXCI+XG4gIDxidXR0b24gY2xhc3M9XCJidG5cIj5DYW5jZWw8L2J1dHRvbj5cbiAgPGJ1dHRvbiBjbGFzcz1cImJ0blwiIChjbGljayk9XCJoYW5kbGVCdXR0b25DbGljaygpXCI+U2F2ZTwvYnV0dG9uPlxuPC9kaXY+XG5cbjwvZGl2PlxuPC9kaXY+XG4iXX0=