@gravitee/ui-components 3.25.2 → 3.25.3-typescript-5a46c7d

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 (183) hide show
  1. package/package.json +13 -4
  2. package/src/atoms/gv-autocomplete.js +1 -437
  3. package/src/atoms/gv-button.js +1 -235
  4. package/src/atoms/gv-checkbox.js +1 -129
  5. package/src/atoms/gv-date-picker-calendar.js +1 -813
  6. package/src/atoms/gv-date-picker-cell.js +1 -166
  7. package/src/atoms/gv-date-picker.js +1 -532
  8. package/src/atoms/gv-file-upload.js +1 -257
  9. package/src/atoms/gv-icon.js +1 -82
  10. package/src/atoms/gv-image.js +1 -109
  11. package/src/atoms/gv-input-message.js +1 -59
  12. package/src/atoms/gv-input.js +1 -530
  13. package/src/atoms/gv-link.js +1 -132
  14. package/src/atoms/gv-message.js +1 -77
  15. package/src/atoms/gv-metric.js +1 -68
  16. package/src/atoms/gv-relative-time.js +1 -185
  17. package/src/atoms/gv-select-native.js +1 -269
  18. package/src/atoms/gv-select.js +1 -317
  19. package/src/atoms/gv-spinner.js +1 -36
  20. package/src/atoms/gv-state.js +1 -89
  21. package/src/atoms/gv-switch.js +1 -123
  22. package/src/atoms/gv-tag.js +1 -116
  23. package/src/atoms/gv-text.js +1 -107
  24. package/src/charts/gv-chart-bar.js +1 -107
  25. package/src/charts/gv-chart-gauge.js +1 -97
  26. package/src/charts/gv-chart-histogram.js +1 -91
  27. package/src/charts/gv-chart-line.js +1 -235
  28. package/src/charts/gv-chart-map.js +1 -114
  29. package/src/charts/gv-chart-pie.js +1 -95
  30. package/src/index.js +1 -78
  31. package/src/lib/cron-expression.js +1 -210
  32. package/src/lib/date.js +1 -53
  33. package/src/lib/events.js +1 -28
  34. package/src/lib/http-client-schema-form.js +1 -68
  35. package/src/lib/http.js +1 -238
  36. package/src/lib/i18n.js +1 -111
  37. package/src/lib/item.js +1 -119
  38. package/src/lib/properties.js +1 -224
  39. package/src/lib/schema-form.js +1 -43
  40. package/src/lib/studio.js +1 -94
  41. package/src/lib/style.js +1 -41
  42. package/src/lib/text-format.js +1 -76
  43. package/src/lib/theme.js +1 -66
  44. package/src/lib/utils.js +1 -110
  45. package/src/mixins/chart-element.js +1 -142
  46. package/src/mixins/input-element.js +1 -157
  47. package/src/mixins/item-resource.js +1 -122
  48. package/src/mixins/keyboard-element.js +1 -70
  49. package/src/mixins/update-after-browser.js +1 -33
  50. package/src/mixins/with-resize-observer.js +1 -78
  51. package/src/mixins/with-skeleton-attribute.js +1 -118
  52. package/src/molecules/gv-card-full.js +1 -97
  53. package/src/molecules/gv-card-list.js +1 -84
  54. package/src/molecules/gv-card.js +1 -59
  55. package/src/molecules/gv-category-list.js +1 -49
  56. package/src/molecules/gv-category.js +1 -90
  57. package/src/molecules/gv-code.js +1 -297
  58. package/src/molecules/gv-confirm.js +1 -158
  59. package/src/molecules/gv-cron-editor.js +1 -464
  60. package/src/molecules/gv-dropdown-menu.js +1 -84
  61. package/src/molecules/gv-expandable.js +1 -94
  62. package/src/molecules/gv-expression-language.js +1 -308
  63. package/src/molecules/gv-identity-picture.js +1 -125
  64. package/src/molecules/gv-list.js +1 -135
  65. package/src/molecules/gv-metrics.js +1 -150
  66. package/src/molecules/gv-modal.js +1 -146
  67. package/src/molecules/gv-nav.js +1 -170
  68. package/src/molecules/gv-option.js +1 -169
  69. package/src/molecules/gv-plans.js +1 -306
  70. package/src/molecules/gv-popover.js +1 -231
  71. package/src/molecules/gv-promote.js +1 -91
  72. package/src/molecules/gv-rating-list.js +1 -239
  73. package/src/molecules/gv-rating.js +1 -200
  74. package/src/molecules/gv-row-expandable.js +1 -39
  75. package/src/molecules/gv-row.js +1 -84
  76. package/src/molecules/gv-stats.js +1 -96
  77. package/src/molecules/gv-stepper.js +1 -144
  78. package/src/molecules/gv-table.js +1 -575
  79. package/src/molecules/gv-tree.js +1 -127
  80. package/src/organisms/gv-documentation.js +1 -132
  81. package/src/organisms/gv-header.js +1 -130
  82. package/src/organisms/gv-http-client.js +1 -139
  83. package/src/organisms/gv-menu.js +1 -142
  84. package/src/organisms/gv-newsletter-subscription.js +1 -130
  85. package/src/organisms/gv-pagination.js +1 -170
  86. package/src/organisms/gv-properties.js +1 -699
  87. package/src/organisms/gv-resizable-views.js +1 -178
  88. package/src/organisms/gv-resources.js +1 -428
  89. package/src/organisms/gv-schema-form-array.js +1 -140
  90. package/src/organisms/gv-schema-form-control-object.js +1 -140
  91. package/src/organisms/gv-schema-form-control.js +1 -416
  92. package/src/organisms/gv-schema-form.js +1 -646
  93. package/src/organisms/gv-tabs.js +1 -178
  94. package/src/organisms/gv-user-menu.js +1 -149
  95. package/src/organisms/gv-vertical-menu.js +1 -82
  96. package/src/policy-studio/gv-flow-step.js +1 -304
  97. package/src/policy-studio/gv-flow.js +1 -442
  98. package/src/policy-studio/gv-policy-studio-menu.js +1 -436
  99. package/src/policy-studio/gv-policy-studio.js +1 -1778
  100. package/src/styles/empty.js +1 -19
  101. package/src/styles/input.js +1 -19
  102. package/src/styles/link.js +1 -19
  103. package/src/styles/shapes.js +1 -18
  104. package/src/styles/skeleton.js +1 -19
  105. package/src/styles/zoom.js +1 -19
  106. package/src/theme/gv-theme.js +1 -164
  107. package/wc/gv-autocomplete.js +1 -1
  108. package/wc/gv-button.js +1 -1
  109. package/wc/gv-card-full.js +1 -1
  110. package/wc/gv-card-list.js +1 -1
  111. package/wc/gv-card.js +1 -1
  112. package/wc/gv-category-list.js +1 -1
  113. package/wc/gv-category.js +1 -1
  114. package/wc/gv-chart-bar.js +1 -1
  115. package/wc/gv-chart-gauge.js +1 -1
  116. package/wc/gv-chart-histogram.js +1 -1
  117. package/wc/gv-chart-line.js +1 -1
  118. package/wc/gv-chart-map.js +1 -1
  119. package/wc/gv-chart-pie.js +1 -1
  120. package/wc/gv-checkbox.js +1 -1
  121. package/wc/gv-code.js +1 -1
  122. package/wc/gv-confirm.js +1 -1
  123. package/wc/gv-cron-editor.js +1 -1
  124. package/wc/gv-date-picker-calendar.js +1 -1
  125. package/wc/gv-date-picker-cell.js +1 -1
  126. package/wc/gv-date-picker.js +1 -1
  127. package/wc/gv-documentation.js +1 -1
  128. package/wc/gv-dropdown-menu.js +1 -1
  129. package/wc/gv-expandable.js +1 -1
  130. package/wc/gv-expression-language.js +1 -1
  131. package/wc/gv-file-upload.js +1 -1
  132. package/wc/gv-flow-step.js +1 -1
  133. package/wc/gv-flow.js +1 -1
  134. package/wc/gv-header.js +1 -1
  135. package/wc/gv-http-client.js +1 -1
  136. package/wc/gv-icon.js +1 -1
  137. package/wc/gv-identity-picture.js +1 -1
  138. package/wc/gv-image.js +1 -1
  139. package/wc/gv-input-message.js +1 -1
  140. package/wc/gv-input.js +1 -1
  141. package/wc/gv-link.js +1 -1
  142. package/wc/gv-list.js +1 -1
  143. package/wc/gv-menu.js +1 -1
  144. package/wc/gv-message.js +1 -1
  145. package/wc/gv-metric.js +1 -1
  146. package/wc/gv-metrics.js +1 -1
  147. package/wc/gv-modal.js +1 -1
  148. package/wc/gv-nav.js +1 -1
  149. package/wc/gv-newsletter-subscription.js +1 -1
  150. package/wc/gv-option.js +1 -1
  151. package/wc/gv-pagination.js +1 -1
  152. package/wc/gv-plans.js +1 -1
  153. package/wc/gv-policy-studio-menu.js +1 -1
  154. package/wc/gv-policy-studio.js +1 -1
  155. package/wc/gv-popover.js +1 -1
  156. package/wc/gv-promote.js +1 -1
  157. package/wc/gv-properties.js +1 -1
  158. package/wc/gv-rating-list.js +1 -1
  159. package/wc/gv-rating.js +1 -1
  160. package/wc/gv-relative-time.js +1 -1
  161. package/wc/gv-resizable-views.js +1 -1
  162. package/wc/gv-resources.js +1 -1
  163. package/wc/gv-row-expandable.js +1 -1
  164. package/wc/gv-row.js +1 -1
  165. package/wc/gv-schema-form-array.js +1 -1
  166. package/wc/gv-schema-form-control-object.js +1 -1
  167. package/wc/gv-schema-form-control.js +1 -1
  168. package/wc/gv-schema-form.js +1 -1
  169. package/wc/gv-select-native.js +1 -1
  170. package/wc/gv-select.js +1 -1
  171. package/wc/gv-spinner.js +1 -1
  172. package/wc/gv-state.js +1 -1
  173. package/wc/gv-stats.js +1 -1
  174. package/wc/gv-stepper.js +1 -1
  175. package/wc/gv-switch.js +1 -1
  176. package/wc/gv-table.js +1 -1
  177. package/wc/gv-tabs.js +1 -1
  178. package/wc/gv-tag.js +1 -1
  179. package/wc/gv-text.js +1 -1
  180. package/wc/gv-theme.js +1 -1
  181. package/wc/gv-tree.js +1 -1
  182. package/wc/gv-user-menu.js +1 -1
  183. package/wc/gv-vertical-menu.js +1 -1
@@ -1,646 +1 @@
1
- /*
2
- * Copyright (C) 2015 The Gravitee team (http://gravitee.io)
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { LitElement, html, css } from 'lit';
17
- import { get, set, del } from 'object-path';
18
- import { dispatchCustomEvent } from '../lib/events';
19
- import { deepClone, deepEqual } from '../lib/utils';
20
- import { classMap } from 'lit/directives/class-map';
21
- import { repeat } from 'lit/directives/repeat';
22
- import { Validator } from 'jsonschema';
23
- import { empty } from '../styles/empty';
24
- import './gv-schema-form-control';
25
- /**
26
- * Schema form component
27
- *
28
- * @fires gv-schema-form:submit - event when user submit valid form
29
- * @fires gv-schema-form:error - event when user submit invalid form
30
- * @fires gv-schema-form:change - event when when form change
31
- * @fires gv-schema-form:cancel - event when user cancel form
32
- *
33
- * @attr {Object} schema - the schema form configuration
34
- * @attr {Object} values - the values of fields
35
- * @attr {Object} errors - the map of errors by input key
36
- * @attr {Boolean} validate - to force validation on first render
37
- * @attr {Boolean} readonly - true if readonly
38
- * @attr {Boolean} scrollable - useful for making content scrollable with fixed headers / footers
39
- *
40
- * @cssprop {Color} [--gv-schema-form--bgc=#ffffff] - Background color
41
- * @cssprop {Length} [--gv-schema-form-control--m=0.4rem] - Control margin
42
- */
43
-
44
- export class GvSchemaForm extends LitElement {
45
- static get properties() {
46
- return {
47
- schema: {
48
- type: Object
49
- },
50
- errors: {
51
- type: Object
52
- },
53
- values: {
54
- type: Object
55
- },
56
- submitLabel: {
57
- type: String
58
- },
59
- hasFooter: {
60
- type: Boolean,
61
- attribute: 'has-footer'
62
- },
63
- hasHeader: {
64
- type: Boolean,
65
- attribute: 'has-header'
66
- },
67
- _confirm: {
68
- type: Object
69
- },
70
- _values: {
71
- type: Object,
72
- attribute: false
73
- },
74
- dirty: {
75
- type: Boolean,
76
- reflect: true
77
- },
78
- hideDeprecated: {
79
- type: Boolean,
80
- attribute: 'hide-deprecated'
81
- },
82
- validateOnRender: {
83
- type: Boolean,
84
- attribute: 'validate-on-render'
85
- },
86
- _validatorResults: {
87
- type: Object
88
- },
89
- skeleton: {
90
- type: Boolean,
91
- reflect: true
92
- },
93
- _touch: {
94
- type: Boolean
95
- },
96
- readonly: {
97
- type: Boolean,
98
- reflect: true
99
- },
100
- scrollable: {
101
- type: Boolean,
102
- reflect: true
103
- },
104
- groups: {
105
- type: Array
106
- }
107
- };
108
- }
109
-
110
- constructor() {
111
- super();
112
- this.hideDeprecated = false;
113
- this._values = {};
114
- this.submitLabel = 'Ok';
115
- this.hasHeader = false;
116
- this.hasFooter = false;
117
- this._touch = false;
118
- this._validator = new Validator();
119
- this._validatorResults = {};
120
- this._ignoreProperties = [];
121
- this._dynamicControls = [];
122
- this._dynamicAttributes = ['disabled', 'required', 'hidden'];
123
- this.groups = null;
124
- this.addEventListener('gv-schema-form-control:default-value', this._onDefaultValue.bind(this));
125
- this.addEventListener('gv-schema-form-control:change', this._onChange.bind(this));
126
- this.addEventListener('gv-schema-form-control:control-ready', this._onControlReady.bind(this));
127
- }
128
-
129
- set values(values) {
130
- if (!deepEqual(this._values, values)) {
131
- if (values) {
132
- this._initialValues = { ...values
133
- };
134
- } else {
135
- this._initialValues = {};
136
- }
137
-
138
- this._values = deepClone(this._initialValues);
139
- }
140
- }
141
-
142
- get values() {
143
- return this._values;
144
- }
145
-
146
- reset(values = null) {
147
- this._values = deepClone(values || this._initialValues);
148
- this._touch = false;
149
-
150
- this._setDirty(false);
151
-
152
- this.getControls().forEach(s => {
153
- s.requestUpdate();
154
- });
155
- }
156
-
157
- _onReset() {
158
- this.reset();
159
- dispatchCustomEvent(this, 'reset');
160
- }
161
-
162
- requestValidation() {
163
- clearTimeout(this._validateTimeout);
164
- this._validateTimeout = setTimeout(() => {
165
- this.validate();
166
-
167
- this._updateActions();
168
- }, 350);
169
- }
170
-
171
- submit() {
172
- this._onSubmit();
173
- }
174
-
175
- _onSubmit() {
176
- const validatorResults = this.validate();
177
-
178
- if (this.isValid()) {
179
- this._initialValues = deepClone(this._values);
180
- this.dirty = false;
181
- this._touch = false;
182
- dispatchCustomEvent(this, 'submit', {
183
- values: this._values,
184
- validatorResults
185
- });
186
- } else {
187
- dispatchCustomEvent(this, 'error', {
188
- values: this._values,
189
- validatorResults
190
- });
191
- }
192
- }
193
-
194
- _setDirty(dirty = true) {
195
- this.dirty = !!dirty;
196
- }
197
-
198
- _setTouch(touch = true) {
199
- this._touch = !!touch;
200
- }
201
-
202
- confirm() {
203
- if (this.isTouch()) {
204
- if (this._confirm && this._confirm.promise) {
205
- return this._confirm.promise;
206
- }
207
-
208
- const promise = new Promise((resolve, reject) => this._confirm = {
209
- resolve,
210
- reject
211
- });
212
- this._confirm.promise = promise;
213
- return promise;
214
- }
215
-
216
- return Promise.resolve();
217
- }
218
-
219
- _onConfirmReset() {
220
- const {
221
- resolve
222
- } = this._confirm;
223
- this._confirm = null;
224
-
225
- this._onReset();
226
-
227
- this.requestUpdate();
228
- this.updateComplete.then(() => {
229
- resolve(this);
230
- });
231
- }
232
-
233
- _onConfirmEdit() {
234
- this._confirm.reject(this);
235
-
236
- this._confirm = null;
237
-
238
- this._updateChildren(this.validateOnRender);
239
- }
240
-
241
- _getSubmitBtn() {
242
- return this.shadowRoot.querySelector('#submit');
243
- }
244
-
245
- _getResetBtn() {
246
- return this.shadowRoot.querySelector('#reset');
247
- }
248
-
249
- _dispatchChange() {
250
- clearTimeout(this._changeTimeout);
251
- this._changeTimeout = setTimeout(() => {
252
- dispatchCustomEvent(this, 'change', {
253
- target: this,
254
- values: this._values,
255
- validation: this._validatorResults
256
- });
257
- }, 50);
258
- }
259
-
260
- _onDefaultValue({
261
- detail: {
262
- currentTarget,
263
- value,
264
- control
265
- }
266
- }) {
267
- if (control.type === 'integer' && value != null && (value.trim && value.length > 0 || value.length > 0)) {
268
- value = parseInt(value, 10);
269
- }
270
-
271
- set(this._values, currentTarget.id, value);
272
- }
273
-
274
- _onChange({
275
- detail: {
276
- currentTarget,
277
- value,
278
- control
279
- }
280
- }) {
281
- this._setTouch(true);
282
-
283
- if (control.type === 'integer') {
284
- if (typeof value === 'string' && value.trim().length === 0) {
285
- value = null;
286
- } else {
287
- const intValue = Number(value).valueOf();
288
-
289
- if (!isNaN(intValue)) {
290
- value = intValue;
291
- } else {
292
- value = null;
293
- }
294
- }
295
- } else if (control.type === 'array' && value.length === 0) {
296
- value = null;
297
- } else if (control.type === 'string' && value.trim().length === 0 && !control.enum) {
298
- value = null;
299
- } else if (control.type === 'object') {
300
- if (Object.keys(value).length === 0) {
301
- value = null;
302
- }
303
- }
304
-
305
- if (value == null) {
306
- del(this._values, currentTarget.id);
307
- } else {
308
- set(this._values, currentTarget.id, value);
309
- }
310
-
311
- this._updateDynamicControls();
312
-
313
- this._validatorResults = this.validate();
314
- this.dirty = true;
315
-
316
- this._updateActions();
317
-
318
- this._dispatchChange();
319
- }
320
-
321
- _onControlReady(e) {
322
- e.stopPropagation();
323
- e.preventDefault();
324
- const controlElement = e.detail.control;
325
- const control = controlElement.control;
326
-
327
- if (control['x-schema-form']) {
328
- if (control['x-schema-form'].event) {
329
- const event = control['x-schema-form'].event;
330
- dispatchCustomEvent(this, event.name, { ...event,
331
- ...e.detail
332
- });
333
- } else if (this._hasCondition(control)) {
334
- this._dynamicControls.push(controlElement);
335
-
336
- this._updateDynamicControl(controlElement);
337
- }
338
- }
339
- }
340
-
341
- _updateDynamicControls() {
342
- this._ignoreProperties = [];
343
-
344
- this._dynamicControls.forEach(controlElement => {
345
- this._updateDynamicControl(controlElement);
346
- });
347
- }
348
-
349
- _updateDynamicControl(controlElement) {
350
- const control = controlElement.control;
351
-
352
- if (control['x-schema-form']) {
353
- this._dynamicAttributes.forEach(attribute => {
354
- const is = this._evaluateCondition(control, attribute);
355
-
356
- if (is) {
357
- controlElement.setAttribute(attribute, '');
358
-
359
- if (attribute === 'hidden') {
360
- this._ignoreProperties.push(controlElement.id);
361
- }
362
- } else {
363
- controlElement.removeAttribute(attribute);
364
- }
365
- });
366
- }
367
-
368
- return null;
369
- }
370
-
371
- async performUpdate() {
372
- await Promise.all(this.getControls().map(e => e.updateComplete));
373
- this.getControls().forEach(s => {
374
- s.requestUpdate();
375
- });
376
- super.performUpdate();
377
- }
378
-
379
- _renderControl(key) {
380
- // This is require to clean cache of <gv-schema-form-control>
381
- const control = { ...this.schema.properties[key]
382
- };
383
-
384
- const isRequired = this.schema.required && this.schema.required.includes(key) || this._evaluateCondition(control, 'required');
385
-
386
- const isDisabled = this.schema.disabled && this.schema.disabled.includes(key) || this._evaluateCondition(control, 'disabled');
387
-
388
- const isHidden = this._evaluateCondition(control, 'hidden');
389
-
390
- if (isHidden) {
391
- this._ignoreProperties.push(key);
392
- }
393
-
394
- const isReadonly = this.readonly || control.readOnly === true;
395
- const isWriteOnly = control.writeOnly === true;
396
- const value = get(this._values, key);
397
- return html`<gv-schema-form-control .id="${key}" .errors="${this.errors}" .control="${control}" .skeleton="${this.skeleton}" .value="${value}" ?readonly="${isReadonly}" ?writeonly="${isWriteOnly}" ?required="${isRequired}" ?disabled="${isDisabled}" ?hidden="${isHidden}"></gv-schema-form-control>`;
398
- }
399
-
400
- _hasCondition(control) {
401
- if (control['x-schema-form']) {
402
- return this._dynamicAttributes.find(condition => control['x-schema-form'][condition] != null) != null;
403
- }
404
-
405
- return false;
406
- }
407
-
408
- _evaluateCondition(control, conditionKey) {
409
- if (control['x-schema-form'] == null || control['x-schema-form'][conditionKey] == null) {
410
- return false;
411
- }
412
-
413
- const condition = control['x-schema-form'][conditionKey];
414
-
415
- if (typeof condition === 'boolean') {
416
- return condition;
417
- }
418
-
419
- if (!Array.isArray(condition)) {
420
- // condition isn't an array, ignore the condition
421
- console.warn(`'${conditionKey}' attribute of 'x-schema-form' should be an array`);
422
- return false;
423
- }
424
-
425
- let result = true;
426
-
427
- for (const operation of condition) {
428
- // operation only have one operator with a single object containing operand values
429
- const operator = Object.keys(operation)[0];
430
-
431
- switch (operator) {
432
- case '$neq':
433
- result = result && this._evaluateNotEqualsCondition(control, operation);
434
- break;
435
-
436
- case '$eq':
437
- result = result && this._evaluateEqualsCondition(control, operation);
438
- break;
439
-
440
- case '$nodef':
441
- result = result && this._evaluateNotDefCondition(control, operation);
442
- break;
443
-
444
- case '$def':
445
- result = result && this._evaluateDefCondition(control, operation);
446
- break;
447
-
448
- default:
449
- console.warn(`Unsupported operator '${operator}' on disable condition`);
450
- result = false;
451
- break;
452
- }
453
- }
454
-
455
- return result;
456
- }
457
-
458
- _evaluateNotEqualsCondition(control, condition) {
459
- return !this._evaluateEqualsCondition(control, condition);
460
- }
461
-
462
- _evaluateEqualsCondition(control, condition) {
463
- const operator = Object.keys(condition)[0];
464
- const operands = condition[operator];
465
- const modelAttributes = Object.keys(operands);
466
- return modelAttributes.map(modelAttribute => {
467
- const testValue = operands[modelAttribute];
468
- let value = get(this._values, modelAttribute);
469
-
470
- if (value == null && control.type === 'string') {
471
- value = '';
472
- }
473
-
474
- if (Array.isArray(testValue)) {
475
- return testValue.includes(value);
476
- }
477
-
478
- return value === testValue;
479
- }).reduce((acc, current) => acc || current);
480
- }
481
-
482
- _evaluateNotDefCondition(control, condition) {
483
- const operator = Object.keys(condition)[0];
484
- const modelAttribute = condition[operator];
485
- return get(this._values, modelAttribute) === undefined || get(this._values, modelAttribute) === null;
486
- }
487
-
488
- _evaluateDefCondition(control, condition) {
489
- return !this._evaluateNotDefCondition(control, condition);
490
- }
491
-
492
- _renderPart() {
493
- if (this._confirm) {
494
- return html`<div class="confirm-box"> <div class="error">The configuration is not valid and cannot be saved.</div> <div class="confirm-box_actions"> <gv-button @gv-button:click="${this._onConfirmReset}" outlined icon="general:update" danger>Lose changes</gv-button> <gv-button @gv-button:click="${this._onConfirmEdit}" icon="design:edit">Edit</gv-button> </div> </div>`;
495
- }
496
-
497
- const keys = this.schema.properties ? Object.keys(this.schema.properties) : [];
498
- this._ignoreProperties = [];
499
-
500
- if (this.groups) {
501
- // Remove undefined group items
502
- const groupsCleaned = this.groups.reduce((prev, group) => {
503
- const itemsExistingInSchemaKeys = keys.filter(key => [...(group.items || [])].includes(key));
504
- prev.push({ ...group,
505
- items: itemsExistingInSchemaKeys || []
506
- });
507
- return prev;
508
- }, []); // Add non grouped items inside default group
509
-
510
- const defaultGroup = groupsCleaned.find(g => g.default) || {
511
- default: true,
512
- items: []
513
- };
514
- const zipGroupedItems = groupsCleaned.reduce((prev, group) => [...prev, ...group.items], []);
515
- defaultGroup.items = keys.filter(key => !zipGroupedItems.includes(key));
516
- return repeat(groupsCleaned, group => html`${group.name ? html`<h2 class="group-title">${group.name}</h2> ${repeat(group.items, key => this._renderControl(key))}` : repeat(group.items, key => this._renderControl(key))} `);
517
- }
518
-
519
- return html`${repeat([1], () => repeat(keys, key => key, key => this._renderControl(key)))}`;
520
- }
521
-
522
- getControls() {
523
- return Array.from(this.shadowRoot.querySelectorAll('gv-schema-form-control'));
524
- }
525
-
526
- getControl(id) {
527
- return this.shadowRoot.querySelector(`[id="${id}"]`);
528
- }
529
-
530
- _getErrors() {
531
- return (this._validatorResults.errors || []).filter(error => {
532
- let id = `${error.property.replace('instance.', '')}`;
533
-
534
- if (!Array.isArray(error.argument)) {
535
- id = `${id}.${error.argument}`;
536
- }
537
-
538
- const errorKey = `x-schema-form.errors.${id}.${error.name}`;
539
- const errorMessage = get(this.schema, errorKey);
540
-
541
- if (errorMessage) {
542
- error.message = errorMessage;
543
- }
544
-
545
- return !this._ignoreProperties.includes(id);
546
- });
547
- }
548
-
549
- validate() {
550
- if (this.schema) {
551
- // Additional properties should not block the validation of the form
552
- this._validatorResults = this._validator.validate(this._values, { ...this.schema,
553
- additionalProperties: {}
554
- });
555
- this.errors = this._getErrors();
556
- }
557
-
558
- return this._validatorResults;
559
- }
560
-
561
- isValid() {
562
- if (this._validatorResults.valid) {
563
- return true;
564
- }
565
-
566
- return this._getErrors() === 0;
567
- }
568
-
569
- isTouch() {
570
- return this._touch || this.dirty && this.validateOnRender;
571
- }
572
-
573
- canSubmit() {
574
- return this.isTouch() && this.isValid();
575
- }
576
-
577
- _updateActions() {
578
- const submitBtn = this._getSubmitBtn();
579
-
580
- if (submitBtn != null) {
581
- if (this.canSubmit()) {
582
- this._getSubmitBtn().removeAttribute('disabled');
583
- } else {
584
- this._getSubmitBtn().setAttribute('disabled', true);
585
- }
586
- }
587
-
588
- const resetBtn = this._getResetBtn();
589
-
590
- if (resetBtn != null) {
591
- if (this.dirty) {
592
- resetBtn.removeAttribute('disabled');
593
- } else {
594
- resetBtn.setAttribute('disabled', true);
595
- }
596
- }
597
- }
598
-
599
- _updateChildren(withValidation) {
600
- if (withValidation) {
601
- this._validatorResults = {};
602
- this.errors = null;
603
- this.requestValidation();
604
- } else {
605
- this._updateActionsTimeout = setTimeout(() => this._updateActions(), 0);
606
- }
607
- }
608
-
609
- async updated(changedProperties) {
610
- clearTimeout(this._updateActionsTimeout);
611
-
612
- if (changedProperties.has('_values')) {
613
- this.getControls().forEach(control => {
614
- control.value = get(this._values, control.id);
615
- });
616
- }
617
-
618
- this._updateChildren(this.validateOnRender && (changedProperties.has('_values') || changedProperties.has('schema')));
619
- }
620
-
621
- async getUpdateComplete() {
622
- const result = await super.getUpdateComplete();
623
- await Promise.all(this.getControls().map(e => e.updateComplete));
624
- return result;
625
- }
626
-
627
- render() {
628
- return html`<form class="${classMap({
629
- scrollable: this.scrollable
630
- })}"> <div class="${classMap({
631
- container: true,
632
- confirm: this._confirm
633
- })}"> ${this.hasHeader === true ? html` <div class="header"> <div class="${classMap({
634
- title: true,
635
- center: this.hasHeader && !this.hasFooter
636
- })}"> <slot name="title"></slot> </div> <div class="left"> <slot name="header-left"></slot> </div> ${this.readonly === true || this.hasFooter === true ? '' : html`<div class="right"> <gv-button id="reset" outlined small @gv-button:click="${this._onReset}" icon="general:update" title="Reset"></gv-button> <gv-button id="submit" small @gv-button:click="${this._onSubmit}" icon="code:check" .title="${this.submitLabel}"></gv-button> </div> `} </div> ` : ''} <div class="content">${this.schema != null ? this._renderPart() : html``}</div> ${this.hasFooter === true && this.readonly !== true ? html` <div class="footer"> <div class="left"></div> <div class="right"> <gv-button id="reset" outlined @gv-button:click="${this._onReset}" icon="general:update" title="Reset">Reset</gv-button> <gv-button id="submit" @gv-button:click="${this._onSubmit}" icon="code:check" .title="${this.submitLabel}">${this.submitLabel}</gv-button> </div> </div> ` : ''} </div> </form>`;
637
- }
638
-
639
- static get styles() {
640
- return [empty, // language=CSS
641
- css`:host{box-sizing:border-box;margin:.2rem;--bgc:var(--gv-schema-form--bgc, #ffffff)}form{display:flex;flex-direction:column}form.scrollable{position:absolute;width:100%;top:0;bottom:0;left:0}.container{flex-grow:1;background-color:var(--bgc);display:flex;flex-direction:column;min-height:0}.content,.footer,.header{background-color:var(--bgc)}.content{flex-grow:1;display:flex;flex-direction:column;align-self:center;width:100%;min-height:0}.content>gv-schema-form-control{align-self:center;width:100%}form.scrollable .content{overflow:auto}form.scrollable .content>.group-title,form.scrollable .content>gv-schema-form-control{max-width:775px;width:95%}.footer,.header{display:flex;box-sizing:border-box;min-height:45px;--gv-icon--s:26px;--gv-icon--c:#bfbfbf;align-items:center;padding:0 .5rem;position:relative}.header{border-bottom:1px solid #d9d9d9}.footer{display:flex;justify-content:space-between;padding:1rem;border-top:1px solid #d9d9d9}form.scrollable .footer{justify-content:center}.footer .left,.footer .right{max-width:400px}.footer .left,.footer .right,.header .left,.header .right{display:flex;flex:1;z-index:10;align-items:center}.footer .right,.header .right{justify-content:flex-end}.header .title{color:#28444f;font-size:18px;display:flex;width:100%;align-items:center}.header .title.center{position:absolute;top:0;left:0;bottom:0;justify-content:center}.confirm-box{height:100%;padding:1rem;font-style:italic;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.confirm-box_actions{padding:1rem 0}.confirm .footer .left,.confirm .footer .right,.confirm .header .left,.confirm .header .right{display:none}.group-title{align-self:center;width:100%;color:var(--gv-theme-font-color-dark);font-size:21px;font-weight:600;padding-bottom:.3em;border-bottom:1px solid var(--gv-theme-font-color-dark);margin-top:24px;margin-bottom:16px}`];
642
- }
643
-
644
- }
645
- window.customElements.define('gv-schema-form', GvSchemaForm);
646
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL29yZ2FuaXNtcy9ndi1zY2hlbWEtZm9ybS5qcyJdLCJuYW1lcyI6WyJMaXRFbGVtZW50IiwiaHRtbCIsImNzcyIsImdldCIsInNldCIsImRlbCIsImRpc3BhdGNoQ3VzdG9tRXZlbnQiLCJkZWVwQ2xvbmUiLCJkZWVwRXF1YWwiLCJjbGFzc01hcCIsInJlcGVhdCIsIlZhbGlkYXRvciIsImVtcHR5IiwiR3ZTY2hlbWFGb3JtIiwicHJvcGVydGllcyIsInNjaGVtYSIsInR5cGUiLCJPYmplY3QiLCJlcnJvcnMiLCJ2YWx1ZXMiLCJzdWJtaXRMYWJlbCIsIlN0cmluZyIsImhhc0Zvb3RlciIsIkJvb2xlYW4iLCJhdHRyaWJ1dGUiLCJoYXNIZWFkZXIiLCJfY29uZmlybSIsIl92YWx1ZXMiLCJkaXJ0eSIsInJlZmxlY3QiLCJoaWRlRGVwcmVjYXRlZCIsInZhbGlkYXRlT25SZW5kZXIiLCJfdmFsaWRhdG9yUmVzdWx0cyIsInNrZWxldG9uIiwiX3RvdWNoIiwicmVhZG9ubHkiLCJzY3JvbGxhYmxlIiwiZ3JvdXBzIiwiQXJyYXkiLCJjb25zdHJ1Y3RvciIsIl92YWxpZGF0b3IiLCJfaWdub3JlUHJvcGVydGllcyIsIl9keW5hbWljQ29udHJvbHMiLCJfZHluYW1pY0F0dHJpYnV0ZXMiLCJhZGRFdmVudExpc3RlbmVyIiwiX29uRGVmYXVsdFZhbHVlIiwiYmluZCIsIl9vbkNoYW5nZSIsIl9vbkNvbnRyb2xSZWFkeSIsIl9pbml0aWFsVmFsdWVzIiwicmVzZXQiLCJfc2V0RGlydHkiLCJnZXRDb250cm9scyIsImZvckVhY2giLCJzIiwicmVxdWVzdFVwZGF0ZSIsIl9vblJlc2V0IiwicmVxdWVzdFZhbGlkYXRpb24iLCJjbGVhclRpbWVvdXQiLCJfdmFsaWRhdGVUaW1lb3V0Iiwic2V0VGltZW91dCIsInZhbGlkYXRlIiwiX3VwZGF0ZUFjdGlvbnMiLCJzdWJtaXQiLCJfb25TdWJtaXQiLCJ2YWxpZGF0b3JSZXN1bHRzIiwiaXNWYWxpZCIsIl9zZXRUb3VjaCIsInRvdWNoIiwiY29uZmlybSIsImlzVG91Y2giLCJwcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJfb25Db25maXJtUmVzZXQiLCJ1cGRhdGVDb21wbGV0ZSIsInRoZW4iLCJfb25Db25maXJtRWRpdCIsIl91cGRhdGVDaGlsZHJlbiIsIl9nZXRTdWJtaXRCdG4iLCJzaGFkb3dSb290IiwicXVlcnlTZWxlY3RvciIsIl9nZXRSZXNldEJ0biIsIl9kaXNwYXRjaENoYW5nZSIsIl9jaGFuZ2VUaW1lb3V0IiwidGFyZ2V0IiwidmFsaWRhdGlvbiIsImRldGFpbCIsImN1cnJlbnRUYXJnZXQiLCJ2YWx1ZSIsImNvbnRyb2wiLCJ0cmltIiwibGVuZ3RoIiwicGFyc2VJbnQiLCJpZCIsImludFZhbHVlIiwiTnVtYmVyIiwidmFsdWVPZiIsImlzTmFOIiwiZW51bSIsImtleXMiLCJfdXBkYXRlRHluYW1pY0NvbnRyb2xzIiwiZSIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwiY29udHJvbEVsZW1lbnQiLCJldmVudCIsIm5hbWUiLCJfaGFzQ29uZGl0aW9uIiwicHVzaCIsIl91cGRhdGVEeW5hbWljQ29udHJvbCIsImlzIiwiX2V2YWx1YXRlQ29uZGl0aW9uIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwicGVyZm9ybVVwZGF0ZSIsImFsbCIsIm1hcCIsIl9yZW5kZXJDb250cm9sIiwia2V5IiwiaXNSZXF1aXJlZCIsInJlcXVpcmVkIiwiaW5jbHVkZXMiLCJpc0Rpc2FibGVkIiwiZGlzYWJsZWQiLCJpc0hpZGRlbiIsImlzUmVhZG9ubHkiLCJyZWFkT25seSIsImlzV3JpdGVPbmx5Iiwid3JpdGVPbmx5IiwiZmluZCIsImNvbmRpdGlvbiIsImNvbmRpdGlvbktleSIsImlzQXJyYXkiLCJjb25zb2xlIiwid2FybiIsInJlc3VsdCIsIm9wZXJhdGlvbiIsIm9wZXJhdG9yIiwiX2V2YWx1YXRlTm90RXF1YWxzQ29uZGl0aW9uIiwiX2V2YWx1YXRlRXF1YWxzQ29uZGl0aW9uIiwiX2V2YWx1YXRlTm90RGVmQ29uZGl0aW9uIiwiX2V2YWx1YXRlRGVmQ29uZGl0aW9uIiwib3BlcmFuZHMiLCJtb2RlbEF0dHJpYnV0ZXMiLCJtb2RlbEF0dHJpYnV0ZSIsInRlc3RWYWx1ZSIsInJlZHVjZSIsImFjYyIsImN1cnJlbnQiLCJ1bmRlZmluZWQiLCJfcmVuZGVyUGFydCIsImdyb3Vwc0NsZWFuZWQiLCJwcmV2IiwiZ3JvdXAiLCJpdGVtc0V4aXN0aW5nSW5TY2hlbWFLZXlzIiwiZmlsdGVyIiwiaXRlbXMiLCJkZWZhdWx0R3JvdXAiLCJnIiwiZGVmYXVsdCIsInppcEdyb3VwZWRJdGVtcyIsImZyb20iLCJxdWVyeVNlbGVjdG9yQWxsIiwiZ2V0Q29udHJvbCIsIl9nZXRFcnJvcnMiLCJlcnJvciIsInByb3BlcnR5IiwicmVwbGFjZSIsImFyZ3VtZW50IiwiZXJyb3JLZXkiLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJ2YWxpZCIsImNhblN1Ym1pdCIsInN1Ym1pdEJ0biIsInJlc2V0QnRuIiwid2l0aFZhbGlkYXRpb24iLCJfdXBkYXRlQWN0aW9uc1RpbWVvdXQiLCJ1cGRhdGVkIiwiY2hhbmdlZFByb3BlcnRpZXMiLCJoYXMiLCJnZXRVcGRhdGVDb21wbGV0ZSIsInJlbmRlciIsImNvbnRhaW5lciIsInRpdGxlIiwiY2VudGVyIiwic3R5bGVzIiwid2luZG93IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFVBQVQsRUFBcUJDLElBQXJCLEVBQTJCQyxHQUEzQixRQUFzQyxLQUF0QztBQUNBLFNBQVNDLEdBQVQsRUFBY0MsR0FBZCxFQUFtQkMsR0FBbkIsUUFBOEIsYUFBOUI7QUFDQSxTQUFTQyxtQkFBVCxRQUFvQyxlQUFwQztBQUNBLFNBQVNDLFNBQVQsRUFBb0JDLFNBQXBCLFFBQXFDLGNBQXJDO0FBQ0EsU0FBU0MsUUFBVCxRQUF5QiwwQkFBekI7QUFDQSxTQUFTQyxNQUFULFFBQXVCLHVCQUF2QjtBQUNBLFNBQVNDLFNBQVQsUUFBMEIsWUFBMUI7QUFDQSxTQUFTQyxLQUFULFFBQXNCLGlCQUF0QjtBQUNBLE9BQU8sMEJBQVA7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxZQUFOLFNBQTJCYixVQUEzQixDQUFzQztBQUN0QixhQUFWYyxVQUFVLEdBQUc7QUFDdEIsV0FBTztBQUNMQyxNQUFBQSxNQUFNLEVBQUU7QUFBRUMsUUFBQUEsSUFBSSxFQUFFQztBQUFSLE9BREg7QUFFTEMsTUFBQUEsTUFBTSxFQUFFO0FBQUVGLFFBQUFBLElBQUksRUFBRUM7QUFBUixPQUZIO0FBR0xFLE1BQUFBLE1BQU0sRUFBRTtBQUFFSCxRQUFBQSxJQUFJLEVBQUVDO0FBQVIsT0FISDtBQUlMRyxNQUFBQSxXQUFXLEVBQUU7QUFBRUosUUFBQUEsSUFBSSxFQUFFSztBQUFSLE9BSlI7QUFLTEMsTUFBQUEsU0FBUyxFQUFFO0FBQUVOLFFBQUFBLElBQUksRUFBRU8sT0FBUjtBQUFpQkMsUUFBQUEsU0FBUyxFQUFFO0FBQTVCLE9BTE47QUFNTEMsTUFBQUEsU0FBUyxFQUFFO0FBQUVULFFBQUFBLElBQUksRUFBRU8sT0FBUjtBQUFpQkMsUUFBQUEsU0FBUyxFQUFFO0FBQTVCLE9BTk47QUFPTEUsTUFBQUEsUUFBUSxFQUFFO0FBQUVWLFFBQUFBLElBQUksRUFBRUM7QUFBUixPQVBMO0FBUUxVLE1BQUFBLE9BQU8sRUFBRTtBQUFFWCxRQUFBQSxJQUFJLEVBQUVDLE1BQVI7QUFBZ0JPLFFBQUFBLFNBQVMsRUFBRTtBQUEzQixPQVJKO0FBU0xJLE1BQUFBLEtBQUssRUFBRTtBQUFFWixRQUFBQSxJQUFJLEVBQUVPLE9BQVI7QUFBaUJNLFFBQUFBLE9BQU8sRUFBRTtBQUExQixPQVRGO0FBVUxDLE1BQUFBLGNBQWMsRUFBRTtBQUFFZCxRQUFBQSxJQUFJLEVBQUVPLE9BQVI7QUFBaUJDLFFBQUFBLFNBQVMsRUFBRTtBQUE1QixPQVZYO0FBV0xPLE1BQUFBLGdCQUFnQixFQUFFO0FBQUVmLFFBQUFBLElBQUksRUFBRU8sT0FBUjtBQUFpQkMsUUFBQUEsU0FBUyxFQUFFO0FBQTVCLE9BWGI7QUFZTFEsTUFBQUEsaUJBQWlCLEVBQUU7QUFBRWhCLFFBQUFBLElBQUksRUFBRUM7QUFBUixPQVpkO0FBYUxnQixNQUFBQSxRQUFRLEVBQUU7QUFBRWpCLFFBQUFBLElBQUksRUFBRU8sT0FBUjtBQUFpQk0sUUFBQUEsT0FBTyxFQUFFO0FBQTFCLE9BYkw7QUFjTEssTUFBQUEsTUFBTSxFQUFFO0FBQUVsQixRQUFBQSxJQUFJLEVBQUVPO0FBQVIsT0FkSDtBQWVMWSxNQUFBQSxRQUFRLEVBQUU7QUFBRW5CLFFBQUFBLElBQUksRUFBRU8sT0FBUjtBQUFpQk0sUUFBQUEsT0FBTyxFQUFFO0FBQTFCLE9BZkw7QUFnQkxPLE1BQUFBLFVBQVUsRUFBRTtBQUFFcEIsUUFBQUEsSUFBSSxFQUFFTyxPQUFSO0FBQWlCTSxRQUFBQSxPQUFPLEVBQUU7QUFBMUIsT0FoQlA7QUFpQkxRLE1BQUFBLE1BQU0sRUFBRTtBQUFFckIsUUFBQUEsSUFBSSxFQUFFc0I7QUFBUjtBQWpCSCxLQUFQO0FBbUJEOztBQUVEQyxFQUFBQSxXQUFXLEdBQUc7QUFDWjtBQUNBLFNBQUtULGNBQUwsR0FBc0IsS0FBdEI7QUFDQSxTQUFLSCxPQUFMLEdBQWUsRUFBZjtBQUNBLFNBQUtQLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxTQUFLSyxTQUFMLEdBQWlCLEtBQWpCO0FBQ0EsU0FBS0gsU0FBTCxHQUFpQixLQUFqQjtBQUNBLFNBQUtZLE1BQUwsR0FBYyxLQUFkO0FBQ0EsU0FBS00sVUFBTCxHQUFrQixJQUFJN0IsU0FBSixFQUFsQjtBQUNBLFNBQUtxQixpQkFBTCxHQUF5QixFQUF6QjtBQUNBLFNBQUtTLGlCQUFMLEdBQXlCLEVBQXpCO0FBQ0EsU0FBS0MsZ0JBQUwsR0FBd0IsRUFBeEI7QUFDQSxTQUFLQyxrQkFBTCxHQUEwQixDQUFDLFVBQUQsRUFBYSxVQUFiLEVBQXlCLFFBQXpCLENBQTFCO0FBQ0EsU0FBS04sTUFBTCxHQUFjLElBQWQ7QUFDQSxTQUFLTyxnQkFBTCxDQUFzQixzQ0FBdEIsRUFBOEQsS0FBS0MsZUFBTCxDQUFxQkMsSUFBckIsQ0FBMEIsSUFBMUIsQ0FBOUQ7QUFDQSxTQUFLRixnQkFBTCxDQUFzQiwrQkFBdEIsRUFBdUQsS0FBS0csU0FBTCxDQUFlRCxJQUFmLENBQW9CLElBQXBCLENBQXZEO0FBQ0EsU0FBS0YsZ0JBQUwsQ0FBc0Isc0NBQXRCLEVBQThELEtBQUtJLGVBQUwsQ0FBcUJGLElBQXJCLENBQTBCLElBQTFCLENBQTlEO0FBQ0Q7O0FBRVMsTUFBTjNCLE1BQU0sQ0FBQ0EsTUFBRCxFQUFTO0FBQ2pCLFFBQUksQ0FBQ1gsU0FBUyxDQUFDLEtBQUttQixPQUFOLEVBQWVSLE1BQWYsQ0FBZCxFQUFzQztBQUNwQyxVQUFJQSxNQUFKLEVBQVk7QUFDVixhQUFLOEIsY0FBTCxHQUFzQixFQUFFLEdBQUc5QjtBQUFMLFNBQXRCO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsYUFBSzhCLGNBQUwsR0FBc0IsRUFBdEI7QUFDRDs7QUFDRCxXQUFLdEIsT0FBTCxHQUFlcEIsU0FBUyxDQUFDLEtBQUswQyxjQUFOLENBQXhCO0FBQ0Q7QUFDRjs7QUFFUyxNQUFOOUIsTUFBTSxHQUFHO0FBQ1gsV0FBTyxLQUFLUSxPQUFaO0FBQ0Q7O0FBRUR1QixFQUFBQSxLQUFLLENBQUMvQixNQUFNLEdBQUcsSUFBVixFQUFnQjtBQUNuQixTQUFLUSxPQUFMLEdBQWVwQixTQUFTLENBQUNZLE1BQU0sSUFBSSxLQUFLOEIsY0FBaEIsQ0FBeEI7QUFDQSxTQUFLZixNQUFMLEdBQWMsS0FBZDs7QUFDQSxTQUFLaUIsU0FBTCxDQUFlLEtBQWY7O0FBQ0EsU0FBS0MsV0FBTCxHQUFtQkMsT0FBbkIsQ0FBNEJDLENBQUQsSUFBTztBQUNoQ0EsTUFBQUEsQ0FBQyxDQUFDQyxhQUFGO0FBQ0QsS0FGRDtBQUdEOztBQUVEQyxFQUFBQSxRQUFRLEdBQUc7QUFDVCxTQUFLTixLQUFMO0FBQ0E1QyxJQUFBQSxtQkFBbUIsQ0FBQyxJQUFELEVBQU8sT0FBUCxDQUFuQjtBQUNEOztBQUVEbUQsRUFBQUEsaUJBQWlCLEdBQUc7QUFDbEJDLElBQUFBLFlBQVksQ0FBQyxLQUFLQyxnQkFBTixDQUFaO0FBQ0EsU0FBS0EsZ0JBQUwsR0FBd0JDLFVBQVUsQ0FBQyxNQUFNO0FBQ3ZDLFdBQUtDLFFBQUw7O0FBQ0EsV0FBS0MsY0FBTDtBQUNELEtBSGlDLEVBRy9CLEdBSCtCLENBQWxDO0FBSUQ7O0FBRURDLEVBQUFBLE1BQU0sR0FBRztBQUNQLFNBQUtDLFNBQUw7QUFDRDs7QUFFREEsRUFBQUEsU0FBUyxHQUFHO0FBQ1YsVUFBTUMsZ0JBQWdCLEdBQUcsS0FBS0osUUFBTCxFQUF6Qjs7QUFDQSxRQUFJLEtBQUtLLE9BQUwsRUFBSixFQUFvQjtBQUNsQixXQUFLakIsY0FBTCxHQUFzQjFDLFNBQVMsQ0FBQyxLQUFLb0IsT0FBTixDQUEvQjtBQUNBLFdBQUtDLEtBQUwsR0FBYSxLQUFiO0FBQ0EsV0FBS00sTUFBTCxHQUFjLEtBQWQ7QUFDQTVCLE1BQUFBLG1CQUFtQixDQUFDLElBQUQsRUFBTyxRQUFQLEVBQWlCO0FBQUVhLFFBQUFBLE1BQU0sRUFBRSxLQUFLUSxPQUFmO0FBQXdCc0MsUUFBQUE7QUFBeEIsT0FBakIsQ0FBbkI7QUFDRCxLQUxELE1BS087QUFDTDNELE1BQUFBLG1CQUFtQixDQUFDLElBQUQsRUFBTyxPQUFQLEVBQWdCO0FBQUVhLFFBQUFBLE1BQU0sRUFBRSxLQUFLUSxPQUFmO0FBQXdCc0MsUUFBQUE7QUFBeEIsT0FBaEIsQ0FBbkI7QUFDRDtBQUNGOztBQUVEZCxFQUFBQSxTQUFTLENBQUN2QixLQUFLLEdBQUcsSUFBVCxFQUFlO0FBQ3RCLFNBQUtBLEtBQUwsR0FBYSxDQUFDLENBQUNBLEtBQWY7QUFDRDs7QUFFRHVDLEVBQUFBLFNBQVMsQ0FBQ0MsS0FBSyxHQUFHLElBQVQsRUFBZTtBQUN0QixTQUFLbEMsTUFBTCxHQUFjLENBQUMsQ0FBQ2tDLEtBQWhCO0FBQ0Q7O0FBRURDLEVBQUFBLE9BQU8sR0FBRztBQUNSLFFBQUksS0FBS0MsT0FBTCxFQUFKLEVBQW9CO0FBQ2xCLFVBQUksS0FBSzVDLFFBQUwsSUFBaUIsS0FBS0EsUUFBTCxDQUFjNkMsT0FBbkMsRUFBNEM7QUFDMUMsZUFBTyxLQUFLN0MsUUFBTCxDQUFjNkMsT0FBckI7QUFDRDs7QUFDRCxZQUFNQSxPQUFPLEdBQUcsSUFBSUMsT0FBSixDQUFZLENBQUNDLE9BQUQsRUFBVUMsTUFBVixLQUFzQixLQUFLaEQsUUFBTCxHQUFnQjtBQUFFK0MsUUFBQUEsT0FBRjtBQUFXQyxRQUFBQTtBQUFYLE9BQWxELENBQWhCO0FBQ0EsV0FBS2hELFFBQUwsQ0FBYzZDLE9BQWQsR0FBd0JBLE9BQXhCO0FBQ0EsYUFBT0EsT0FBUDtBQUNEOztBQUNELFdBQU9DLE9BQU8sQ0FBQ0MsT0FBUixFQUFQO0FBQ0Q7O0FBRURFLEVBQUFBLGVBQWUsR0FBRztBQUNoQixVQUFNO0FBQUVGLE1BQUFBO0FBQUYsUUFBYyxLQUFLL0MsUUFBekI7QUFDQSxTQUFLQSxRQUFMLEdBQWdCLElBQWhCOztBQUNBLFNBQUs4QixRQUFMOztBQUNBLFNBQUtELGFBQUw7QUFDQSxTQUFLcUIsY0FBTCxDQUFvQkMsSUFBcEIsQ0FBeUIsTUFBTTtBQUM3QkosTUFBQUEsT0FBTyxDQUFDLElBQUQsQ0FBUDtBQUNELEtBRkQ7QUFHRDs7QUFFREssRUFBQUEsY0FBYyxHQUFHO0FBQ2YsU0FBS3BELFFBQUwsQ0FBY2dELE1BQWQsQ0FBcUIsSUFBckI7O0FBQ0EsU0FBS2hELFFBQUwsR0FBZ0IsSUFBaEI7O0FBQ0EsU0FBS3FELGVBQUwsQ0FBcUIsS0FBS2hELGdCQUExQjtBQUNEOztBQUVEaUQsRUFBQUEsYUFBYSxHQUFHO0FBQ2QsV0FBTyxLQUFLQyxVQUFMLENBQWdCQyxhQUFoQixDQUE4QixTQUE5QixDQUFQO0FBQ0Q7O0FBRURDLEVBQUFBLFlBQVksR0FBRztBQUNiLFdBQU8sS0FBS0YsVUFBTCxDQUFnQkMsYUFBaEIsQ0FBOEIsUUFBOUIsQ0FBUDtBQUNEOztBQUVERSxFQUFBQSxlQUFlLEdBQUc7QUFDaEIxQixJQUFBQSxZQUFZLENBQUMsS0FBSzJCLGNBQU4sQ0FBWjtBQUNBLFNBQUtBLGNBQUwsR0FBc0J6QixVQUFVLENBQUMsTUFBTTtBQUNyQ3RELE1BQUFBLG1CQUFtQixDQUFDLElBQUQsRUFBTyxRQUFQLEVBQWlCO0FBQUVnRixRQUFBQSxNQUFNLEVBQUUsSUFBVjtBQUFnQm5FLFFBQUFBLE1BQU0sRUFBRSxLQUFLUSxPQUE3QjtBQUFzQzRELFFBQUFBLFVBQVUsRUFBRSxLQUFLdkQ7QUFBdkQsT0FBakIsQ0FBbkI7QUFDRCxLQUYrQixFQUU3QixFQUY2QixDQUFoQztBQUdEOztBQUVEYSxFQUFBQSxlQUFlLENBQUM7QUFBRTJDLElBQUFBLE1BQU0sRUFBRTtBQUFFQyxNQUFBQSxhQUFGO0FBQWlCQyxNQUFBQSxLQUFqQjtBQUF3QkMsTUFBQUE7QUFBeEI7QUFBVixHQUFELEVBQWdEO0FBQzdELFFBQUlBLE9BQU8sQ0FBQzNFLElBQVIsS0FBaUIsU0FBakIsSUFBOEIwRSxLQUFLLElBQUksSUFBdkMsS0FBaURBLEtBQUssQ0FBQ0UsSUFBTixJQUFjRixLQUFLLENBQUNHLE1BQU4sR0FBZSxDQUE5QixJQUFvQ0gsS0FBSyxDQUFDRyxNQUFOLEdBQWUsQ0FBbkcsQ0FBSixFQUEyRztBQUN6R0gsTUFBQUEsS0FBSyxHQUFHSSxRQUFRLENBQUNKLEtBQUQsRUFBUSxFQUFSLENBQWhCO0FBQ0Q7O0FBQ0R0RixJQUFBQSxHQUFHLENBQUMsS0FBS3VCLE9BQU4sRUFBZThELGFBQWEsQ0FBQ00sRUFBN0IsRUFBaUNMLEtBQWpDLENBQUg7QUFDRDs7QUFFRDNDLEVBQUFBLFNBQVMsQ0FBQztBQUFFeUMsSUFBQUEsTUFBTSxFQUFFO0FBQUVDLE1BQUFBLGFBQUY7QUFBaUJDLE1BQUFBLEtBQWpCO0FBQXdCQyxNQUFBQTtBQUF4QjtBQUFWLEdBQUQsRUFBZ0Q7QUFDdkQsU0FBS3hCLFNBQUwsQ0FBZSxJQUFmOztBQUNBLFFBQUl3QixPQUFPLENBQUMzRSxJQUFSLEtBQWlCLFNBQXJCLEVBQWdDO0FBQzlCLFVBQUksT0FBTzBFLEtBQVAsS0FBaUIsUUFBakIsSUFBNkJBLEtBQUssQ0FBQ0UsSUFBTixHQUFhQyxNQUFiLEtBQXdCLENBQXpELEVBQTREO0FBQzFESCxRQUFBQSxLQUFLLEdBQUcsSUFBUjtBQUNELE9BRkQsTUFFTztBQUNMLGNBQU1NLFFBQVEsR0FBR0MsTUFBTSxDQUFDUCxLQUFELENBQU4sQ0FBY1EsT0FBZCxFQUFqQjs7QUFDQSxZQUFJLENBQUNDLEtBQUssQ0FBQ0gsUUFBRCxDQUFWLEVBQXNCO0FBQ3BCTixVQUFBQSxLQUFLLEdBQUdNLFFBQVI7QUFDRCxTQUZELE1BRU87QUFDTE4sVUFBQUEsS0FBSyxHQUFHLElBQVI7QUFDRDtBQUNGO0FBQ0YsS0FYRCxNQVdPLElBQUlDLE9BQU8sQ0FBQzNFLElBQVIsS0FBaUIsT0FBakIsSUFBNEIwRSxLQUFLLENBQUNHLE1BQU4sS0FBaUIsQ0FBakQsRUFBb0Q7QUFDekRILE1BQUFBLEtBQUssR0FBRyxJQUFSO0FBQ0QsS0FGTSxNQUVBLElBQUlDLE9BQU8sQ0FBQzNFLElBQVIsS0FBaUIsUUFBakIsSUFBNkIwRSxLQUFLLENBQUNFLElBQU4sR0FBYUMsTUFBYixLQUF3QixDQUFyRCxJQUEwRCxDQUFDRixPQUFPLENBQUNTLElBQXZFLEVBQTZFO0FBQ2xGVixNQUFBQSxLQUFLLEdBQUcsSUFBUjtBQUNELEtBRk0sTUFFQSxJQUFJQyxPQUFPLENBQUMzRSxJQUFSLEtBQWlCLFFBQXJCLEVBQStCO0FBQ3BDLFVBQUlDLE1BQU0sQ0FBQ29GLElBQVAsQ0FBWVgsS0FBWixFQUFtQkcsTUFBbkIsS0FBOEIsQ0FBbEMsRUFBcUM7QUFDbkNILFFBQUFBLEtBQUssR0FBRyxJQUFSO0FBQ0Q7QUFDRjs7QUFDRCxRQUFJQSxLQUFLLElBQUksSUFBYixFQUFtQjtBQUNqQnJGLE1BQUFBLEdBQUcsQ0FBQyxLQUFLc0IsT0FBTixFQUFlOEQsYUFBYSxDQUFDTSxFQUE3QixDQUFIO0FBQ0QsS0FGRCxNQUVPO0FBQ0wzRixNQUFBQSxHQUFHLENBQUMsS0FBS3VCLE9BQU4sRUFBZThELGFBQWEsQ0FBQ00sRUFBN0IsRUFBaUNMLEtBQWpDLENBQUg7QUFDRDs7QUFFRCxTQUFLWSxzQkFBTDs7QUFDQSxTQUFLdEUsaUJBQUwsR0FBeUIsS0FBSzZCLFFBQUwsRUFBekI7QUFDQSxTQUFLakMsS0FBTCxHQUFhLElBQWI7O0FBQ0EsU0FBS2tDLGNBQUw7O0FBQ0EsU0FBS3NCLGVBQUw7QUFDRDs7QUFFRHBDLEVBQUFBLGVBQWUsQ0FBQ3VELENBQUQsRUFBSTtBQUNqQkEsSUFBQUEsQ0FBQyxDQUFDQyxlQUFGO0FBQ0FELElBQUFBLENBQUMsQ0FBQ0UsY0FBRjtBQUNBLFVBQU1DLGNBQWMsR0FBR0gsQ0FBQyxDQUFDZixNQUFGLENBQVNHLE9BQWhDO0FBQ0EsVUFBTUEsT0FBTyxHQUFHZSxjQUFjLENBQUNmLE9BQS9COztBQUNBLFFBQUlBLE9BQU8sQ0FBQyxlQUFELENBQVgsRUFBOEI7QUFDNUIsVUFBSUEsT0FBTyxDQUFDLGVBQUQsQ0FBUCxDQUF5QmdCLEtBQTdCLEVBQW9DO0FBQ2xDLGNBQU1BLEtBQUssR0FBR2hCLE9BQU8sQ0FBQyxlQUFELENBQVAsQ0FBeUJnQixLQUF2QztBQUNBckcsUUFBQUEsbUJBQW1CLENBQUMsSUFBRCxFQUFPcUcsS0FBSyxDQUFDQyxJQUFiLEVBQW1CLEVBQUUsR0FBR0QsS0FBTDtBQUFZLGFBQUdKLENBQUMsQ0FBQ2Y7QUFBakIsU0FBbkIsQ0FBbkI7QUFDRCxPQUhELE1BR08sSUFBSSxLQUFLcUIsYUFBTCxDQUFtQmxCLE9BQW5CLENBQUosRUFBaUM7QUFDdEMsYUFBS2pELGdCQUFMLENBQXNCb0UsSUFBdEIsQ0FBMkJKLGNBQTNCOztBQUNBLGFBQUtLLHFCQUFMLENBQTJCTCxjQUEzQjtBQUNEO0FBQ0Y7QUFDRjs7QUFFREosRUFBQUEsc0JBQXNCLEdBQUc7QUFDdkIsU0FBSzdELGlCQUFMLEdBQXlCLEVBQXpCOztBQUNBLFNBQUtDLGdCQUFMLENBQXNCVyxPQUF0QixDQUErQnFELGNBQUQsSUFBb0I7QUFDaEQsV0FBS0sscUJBQUwsQ0FBMkJMLGNBQTNCO0FBQ0QsS0FGRDtBQUdEOztBQUVESyxFQUFBQSxxQkFBcUIsQ0FBQ0wsY0FBRCxFQUFpQjtBQUNwQyxVQUFNZixPQUFPLEdBQUdlLGNBQWMsQ0FBQ2YsT0FBL0I7O0FBQ0EsUUFBSUEsT0FBTyxDQUFDLGVBQUQsQ0FBWCxFQUE4QjtBQUM1QixXQUFLaEQsa0JBQUwsQ0FBd0JVLE9BQXhCLENBQWlDN0IsU0FBRCxJQUFlO0FBQzdDLGNBQU13RixFQUFFLEdBQUcsS0FBS0Msa0JBQUwsQ0FBd0J0QixPQUF4QixFQUFpQ25FLFNBQWpDLENBQVg7O0FBQ0EsWUFBSXdGLEVBQUosRUFBUTtBQUNOTixVQUFBQSxjQUFjLENBQUNRLFlBQWYsQ0FBNEIxRixTQUE1QixFQUF1QyxFQUF2Qzs7QUFDQSxjQUFJQSxTQUFTLEtBQUssUUFBbEIsRUFBNEI7QUFDMUIsaUJBQUtpQixpQkFBTCxDQUF1QnFFLElBQXZCLENBQTRCSixjQUFjLENBQUNYLEVBQTNDO0FBQ0Q7QUFDRixTQUxELE1BS087QUFDTFcsVUFBQUEsY0FBYyxDQUFDUyxlQUFmLENBQStCM0YsU0FBL0I7QUFDRDtBQUNGLE9BVkQ7QUFXRDs7QUFDRCxXQUFPLElBQVA7QUFDRDs7QUFFa0IsUUFBYjRGLGFBQWEsR0FBRztBQUNwQixVQUFNNUMsT0FBTyxDQUFDNkMsR0FBUixDQUFZLEtBQUtqRSxXQUFMLEdBQW1Ca0UsR0FBbkIsQ0FBd0JmLENBQUQsSUFBT0EsQ0FBQyxDQUFDM0IsY0FBaEMsQ0FBWixDQUFOO0FBQ0EsU0FBS3hCLFdBQUwsR0FBbUJDLE9BQW5CLENBQTRCQyxDQUFELElBQU87QUFDaENBLE1BQUFBLENBQUMsQ0FBQ0MsYUFBRjtBQUNELEtBRkQ7QUFHQSxVQUFNNkQsYUFBTjtBQUNEOztBQUVERyxFQUFBQSxjQUFjLENBQUNDLEdBQUQsRUFBTTtBQUNsQjtBQUNBLFVBQU03QixPQUFPLEdBQUcsRUFBRSxHQUFHLEtBQUs1RSxNQUFMLENBQVlELFVBQVosQ0FBdUIwRyxHQUF2QjtBQUFMLEtBQWhCOztBQUNBLFVBQU1DLFVBQVUsR0FBSSxLQUFLMUcsTUFBTCxDQUFZMkcsUUFBWixJQUF3QixLQUFLM0csTUFBTCxDQUFZMkcsUUFBWixDQUFxQkMsUUFBckIsQ0FBOEJILEdBQTlCLENBQXpCLElBQWdFLEtBQUtQLGtCQUFMLENBQXdCdEIsT0FBeEIsRUFBaUMsVUFBakMsQ0FBbkY7O0FBQ0EsVUFBTWlDLFVBQVUsR0FBSSxLQUFLN0csTUFBTCxDQUFZOEcsUUFBWixJQUF3QixLQUFLOUcsTUFBTCxDQUFZOEcsUUFBWixDQUFxQkYsUUFBckIsQ0FBOEJILEdBQTlCLENBQXpCLElBQWdFLEtBQUtQLGtCQUFMLENBQXdCdEIsT0FBeEIsRUFBaUMsVUFBakMsQ0FBbkY7O0FBQ0EsVUFBTW1DLFFBQVEsR0FBRyxLQUFLYixrQkFBTCxDQUF3QnRCLE9BQXhCLEVBQWlDLFFBQWpDLENBQWpCOztBQUNBLFFBQUltQyxRQUFKLEVBQWM7QUFDWixXQUFLckYsaUJBQUwsQ0FBdUJxRSxJQUF2QixDQUE0QlUsR0FBNUI7QUFDRDs7QUFDRCxVQUFNTyxVQUFVLEdBQUcsS0FBSzVGLFFBQUwsSUFBaUJ3RCxPQUFPLENBQUNxQyxRQUFSLEtBQXFCLElBQXpEO0FBQ0EsVUFBTUMsV0FBVyxHQUFHdEMsT0FBTyxDQUFDdUMsU0FBUixLQUFzQixJQUExQztBQUNBLFVBQU14QyxLQUFLLEdBQUd2RixHQUFHLENBQUMsS0FBS3dCLE9BQU4sRUFBZTZGLEdBQWYsQ0FBakI7QUFDQSxXQUFPdkgsSUFBSSxnQ0FDRnVILEdBREUsY0FFRSxLQUFLdEcsTUFGUCxlQUdHeUUsT0FISCxnQkFJSSxLQUFLMUQsUUFKVCxhQUtDeUQsS0FMRCxnQkFNSXFDLFVBTkosaUJBT0tFLFdBUEwsZ0JBUUlSLFVBUkosZ0JBU0lHLFVBVEosY0FVRUUsUUFWRiw2QkFBWDtBQVlEOztBQUVEakIsRUFBQUEsYUFBYSxDQUFDbEIsT0FBRCxFQUFVO0FBQ3JCLFFBQUlBLE9BQU8sQ0FBQyxlQUFELENBQVgsRUFBOEI7QUFDNUIsYUFBTyxLQUFLaEQsa0JBQUwsQ0FBd0J3RixJQUF4QixDQUE4QkMsU0FBRCxJQUFlekMsT0FBTyxDQUFDLGVBQUQsQ0FBUCxDQUF5QnlDLFNBQXpCLEtBQXVDLElBQW5GLEtBQTRGLElBQW5HO0FBQ0Q7O0FBQ0QsV0FBTyxLQUFQO0FBQ0Q7O0FBRURuQixFQUFBQSxrQkFBa0IsQ0FBQ3RCLE9BQUQsRUFBVTBDLFlBQVYsRUFBd0I7QUFDeEMsUUFBSTFDLE9BQU8sQ0FBQyxlQUFELENBQVAsSUFBNEIsSUFBNUIsSUFBb0NBLE9BQU8sQ0FBQyxlQUFELENBQVAsQ0FBeUIwQyxZQUF6QixLQUEwQyxJQUFsRixFQUF3RjtBQUN0RixhQUFPLEtBQVA7QUFDRDs7QUFDRCxVQUFNRCxTQUFTLEdBQUd6QyxPQUFPLENBQUMsZUFBRCxDQUFQLENBQXlCMEMsWUFBekIsQ0FBbEI7O0FBQ0EsUUFBSSxPQUFPRCxTQUFQLEtBQXFCLFNBQXpCLEVBQW9DO0FBQ2xDLGFBQU9BLFNBQVA7QUFDRDs7QUFDRCxRQUFJLENBQUM5RixLQUFLLENBQUNnRyxPQUFOLENBQWNGLFNBQWQsQ0FBTCxFQUErQjtBQUM3QjtBQUNBRyxNQUFBQSxPQUFPLENBQUNDLElBQVIsQ0FBYyxJQUFHSCxZQUFhLG1EQUE5QjtBQUNBLGFBQU8sS0FBUDtBQUNEOztBQUVELFFBQUlJLE1BQU0sR0FBRyxJQUFiOztBQUNBLFNBQUssTUFBTUMsU0FBWCxJQUF3Qk4sU0FBeEIsRUFBbUM7QUFDakM7QUFDQSxZQUFNTyxRQUFRLEdBQUcxSCxNQUFNLENBQUNvRixJQUFQLENBQVlxQyxTQUFaLEVBQXVCLENBQXZCLENBQWpCOztBQUVBLGNBQVFDLFFBQVI7QUFDRSxhQUFLLE1BQUw7QUFDRUYsVUFBQUEsTUFBTSxHQUFHQSxNQUFNLElBQUksS0FBS0csMkJBQUwsQ0FBaUNqRCxPQUFqQyxFQUEwQytDLFNBQTFDLENBQW5CO0FBQ0E7O0FBQ0YsYUFBSyxLQUFMO0FBQ0VELFVBQUFBLE1BQU0sR0FBR0EsTUFBTSxJQUFJLEtBQUtJLHdCQUFMLENBQThCbEQsT0FBOUIsRUFBdUMrQyxTQUF2QyxDQUFuQjtBQUNBOztBQUNGLGFBQUssUUFBTDtBQUNFRCxVQUFBQSxNQUFNLEdBQUdBLE1BQU0sSUFBSSxLQUFLSyx3QkFBTCxDQUE4Qm5ELE9BQTlCLEVBQXVDK0MsU0FBdkMsQ0FBbkI7QUFDQTs7QUFDRixhQUFLLE1BQUw7QUFDRUQsVUFBQUEsTUFBTSxHQUFHQSxNQUFNLElBQUksS0FBS00scUJBQUwsQ0FBMkJwRCxPQUEzQixFQUFvQytDLFNBQXBDLENBQW5CO0FBQ0E7O0FBQ0Y7QUFDRUgsVUFBQUEsT0FBTyxDQUFDQyxJQUFSLENBQWMseUJBQXdCRyxRQUFTLHdCQUEvQztBQUNBRixVQUFBQSxNQUFNLEdBQUcsS0FBVDtBQUNBO0FBaEJKO0FBa0JEOztBQUVELFdBQU9BLE1BQVA7QUFDRDs7QUFFREcsRUFBQUEsMkJBQTJCLENBQUNqRCxPQUFELEVBQVV5QyxTQUFWLEVBQXFCO0FBQzlDLFdBQU8sQ0FBQyxLQUFLUyx3QkFBTCxDQUE4QmxELE9BQTlCLEVBQXVDeUMsU0FBdkMsQ0FBUjtBQUNEOztBQUVEUyxFQUFBQSx3QkFBd0IsQ0FBQ2xELE9BQUQsRUFBVXlDLFNBQVYsRUFBcUI7QUFDM0MsVUFBTU8sUUFBUSxHQUFHMUgsTUFBTSxDQUFDb0YsSUFBUCxDQUFZK0IsU0FBWixFQUF1QixDQUF2QixDQUFqQjtBQUNBLFVBQU1ZLFFBQVEsR0FBR1osU0FBUyxDQUFDTyxRQUFELENBQTFCO0FBQ0EsVUFBTU0sZUFBZSxHQUFHaEksTUFBTSxDQUFDb0YsSUFBUCxDQUFZMkMsUUFBWixDQUF4QjtBQUNBLFdBQU9DLGVBQWUsQ0FDbkIzQixHQURJLENBQ0M0QixjQUFELElBQW9CO0FBQ3ZCLFlBQU1DLFNBQVMsR0FBR0gsUUFBUSxDQUFDRSxjQUFELENBQTFCO0FBQ0EsVUFBSXhELEtBQUssR0FBR3ZGLEdBQUcsQ0FBQyxLQUFLd0IsT0FBTixFQUFldUgsY0FBZixDQUFmOztBQUNBLFVBQUl4RCxLQUFLLElBQUksSUFBVCxJQUFpQkMsT0FBTyxDQUFDM0UsSUFBUixLQUFpQixRQUF0QyxFQUFnRDtBQUM5QzBFLFFBQUFBLEtBQUssR0FBRyxFQUFSO0FBQ0Q7O0FBQ0QsVUFBSXBELEtBQUssQ0FBQ2dHLE9BQU4sQ0FBY2EsU0FBZCxDQUFKLEVBQThCO0FBQzVCLGVBQU9BLFNBQVMsQ0FBQ3hCLFFBQVYsQ0FBbUJqQyxLQUFuQixDQUFQO0FBQ0Q7O0FBQ0QsYUFBT0EsS0FBSyxLQUFLeUQsU0FBakI7QUFDRCxLQVhJLEVBWUpDLE1BWkksQ0FZRyxDQUFDQyxHQUFELEVBQU1DLE9BQU4sS0FBa0JELEdBQUcsSUFBSUMsT0FaNUIsQ0FBUDtBQWFEOztBQUVEUixFQUFBQSx3QkFBd0IsQ0FBQ25ELE9BQUQsRUFBVXlDLFNBQVYsRUFBcUI7QUFDM0MsVUFBTU8sUUFBUSxHQUFHMUgsTUFBTSxDQUFDb0YsSUFBUCxDQUFZK0IsU0FBWixFQUF1QixDQUF2QixDQUFqQjtBQUNBLFVBQU1jLGNBQWMsR0FBR2QsU0FBUyxDQUFDTyxRQUFELENBQWhDO0FBQ0EsV0FBT3hJLEdBQUcsQ0FBQyxLQUFLd0IsT0FBTixFQUFldUgsY0FBZixDQUFILEtBQXNDSyxTQUF0QyxJQUFtRHBKLEdBQUcsQ0FBQyxLQUFLd0IsT0FBTixFQUFldUgsY0FBZixDQUFILEtBQXNDLElBQWhHO0FBQ0Q7O0FBRURILEVBQUFBLHFCQUFxQixDQUFDcEQsT0FBRCxFQUFVeUMsU0FBVixFQUFxQjtBQUN4QyxXQUFPLENBQUMsS0FBS1Usd0JBQUwsQ0FBOEJuRCxPQUE5QixFQUF1Q3lDLFNBQXZDLENBQVI7QUFDRDs7QUFFRG9CLEVBQUFBLFdBQVcsR0FBRztBQUNaLFFBQUksS0FBSzlILFFBQVQsRUFBbUI7QUFDakIsYUFBT3pCLElBQUkseUtBR3dCLEtBQUswRSxlQUg3QixpR0FJd0IsS0FBS0csY0FKN0IscURBQVg7QUFPRDs7QUFDRCxVQUFNdUIsSUFBSSxHQUFHLEtBQUt0RixNQUFMLENBQVlELFVBQVosR0FBeUJHLE1BQU0sQ0FBQ29GLElBQVAsQ0FBWSxLQUFLdEYsTUFBTCxDQUFZRCxVQUF4QixDQUF6QixHQUErRCxFQUE1RTtBQUNBLFNBQUsyQixpQkFBTCxHQUF5QixFQUF6Qjs7QUFFQSxRQUFJLEtBQUtKLE1BQVQsRUFBaUI7QUFDZjtBQUNBLFlBQU1vSCxhQUFhLEdBQUcsS0FBS3BILE1BQUwsQ0FBWStHLE1BQVosQ0FBbUIsQ0FBQ00sSUFBRCxFQUFPQyxLQUFQLEtBQWlCO0FBQ3hELGNBQU1DLHlCQUF5QixHQUFHdkQsSUFBSSxDQUFDd0QsTUFBTCxDQUFhckMsR0FBRCxJQUFTLENBQUMsSUFBSW1DLEtBQUssQ0FBQ0csS0FBTixJQUFlLEVBQW5CLENBQUQsRUFBeUJuQyxRQUF6QixDQUFrQ0gsR0FBbEMsQ0FBckIsQ0FBbEM7QUFDQWtDLFFBQUFBLElBQUksQ0FBQzVDLElBQUwsQ0FBVSxFQUNSLEdBQUc2QyxLQURLO0FBRVJHLFVBQUFBLEtBQUssRUFBRUYseUJBQXlCLElBQUk7QUFGNUIsU0FBVjtBQUlBLGVBQU9GLElBQVA7QUFDRCxPQVBxQixFQU9uQixFQVBtQixDQUF0QixDQUZlLENBV2Y7O0FBQ0EsWUFBTUssWUFBWSxHQUFHTixhQUFhLENBQUN0QixJQUFkLENBQW9CNkIsQ0FBRCxJQUFPQSxDQUFDLENBQUNDLE9BQTVCLEtBQXdDO0FBQUVBLFFBQUFBLE9BQU8sRUFBRSxJQUFYO0FBQWlCSCxRQUFBQSxLQUFLLEVBQUU7QUFBeEIsT0FBN0Q7QUFDQSxZQUFNSSxlQUFlLEdBQUdULGFBQWEsQ0FBQ0wsTUFBZCxDQUFxQixDQUFDTSxJQUFELEVBQU9DLEtBQVAsS0FBaUIsQ0FBQyxHQUFHRCxJQUFKLEVBQVUsR0FBR0MsS0FBSyxDQUFDRyxLQUFuQixDQUF0QyxFQUFpRSxFQUFqRSxDQUF4QjtBQUNBQyxNQUFBQSxZQUFZLENBQUNELEtBQWIsR0FBcUJ6RCxJQUFJLENBQUN3RCxNQUFMLENBQWFyQyxHQUFELElBQVMsQ0FBQzBDLGVBQWUsQ0FBQ3ZDLFFBQWhCLENBQXlCSCxHQUF6QixDQUF0QixDQUFyQjtBQUVBLGFBQU85RyxNQUFNLENBQ1grSSxhQURXLEVBRVZFLEtBQUQsSUFDRTFKLElBQUksR0FBRzBKLEtBQUssQ0FBQy9DLElBQU4sR0FDSDNHLElBQUksMkJBQTJCMEosS0FBSyxDQUFDL0MsSUFBakMsU0FDQWxHLE1BQU0sQ0FBQ2lKLEtBQUssQ0FBQ0csS0FBUCxFQUFldEMsR0FBRCxJQUFTLEtBQUtELGNBQUwsQ0FBb0JDLEdBQXBCLENBQXZCLENBRE4sRUFERCxHQUdIOUcsTUFBTSxDQUFDaUosS0FBSyxDQUFDRyxLQUFQLEVBQWV0QyxHQUFELElBQVMsS0FBS0QsY0FBTCxDQUFvQkMsR0FBcEIsQ0FBdkIsQ0FITixHQUhLLENBQWI7QUFRRDs7QUFFRCxXQUFPdkgsSUFBSSxHQUFHUyxNQUFNLENBQUMsQ0FBQyxDQUFELENBQUQsRUFBTSxNQUN4QkEsTUFBTSxDQUNKMkYsSUFESSxFQUVIbUIsR0FBRCxJQUFTQSxHQUZMLEVBR0hBLEdBQUQsSUFBUyxLQUFLRCxjQUFMLENBQW9CQyxHQUFwQixDQUhMLENBRFksQ0FBVCxFQUFYO0FBT0Q7O0FBRURwRSxFQUFBQSxXQUFXLEdBQUc7QUFDWixXQUFPZCxLQUFLLENBQUM2SCxJQUFOLENBQVcsS0FBS2xGLFVBQUwsQ0FBZ0JtRixnQkFBaEIsQ0FBaUMsd0JBQWpDLENBQVgsQ0FBUDtBQUNEOztBQUVEQyxFQUFBQSxVQUFVLENBQUN0RSxFQUFELEVBQUs7QUFDYixXQUFPLEtBQUtkLFVBQUwsQ0FBZ0JDLGFBQWhCLENBQStCLFFBQU9hLEVBQUcsSUFBekMsQ0FBUDtBQUNEOztBQUVEdUUsRUFBQUEsVUFBVSxHQUFHO0FBQ1gsV0FBTyxDQUFDLEtBQUt0SSxpQkFBTCxDQUF1QmQsTUFBdkIsSUFBaUMsRUFBbEMsRUFBc0MySSxNQUF0QyxDQUE4Q1UsS0FBRCxJQUFXO0FBQzdELFVBQUl4RSxFQUFFLEdBQUksR0FBRXdFLEtBQUssQ0FBQ0MsUUFBTixDQUFlQyxPQUFmLENBQXVCLFdBQXZCLEVBQW9DLEVBQXBDLENBQXdDLEVBQXBEOztBQUNBLFVBQUksQ0FBQ25JLEtBQUssQ0FBQ2dHLE9BQU4sQ0FBY2lDLEtBQUssQ0FBQ0csUUFBcEIsQ0FBTCxFQUFvQztBQUNsQzNFLFFBQUFBLEVBQUUsR0FBSSxHQUFFQSxFQUFHLElBQUd3RSxLQUFLLENBQUNHLFFBQVMsRUFBN0I7QUFDRDs7QUFFRCxZQUFNQyxRQUFRLEdBQUksd0JBQXVCNUUsRUFBRyxJQUFHd0UsS0FBSyxDQUFDM0QsSUFBSyxFQUExRDtBQUNBLFlBQU1nRSxZQUFZLEdBQUd6SyxHQUFHLENBQUMsS0FBS1ksTUFBTixFQUFjNEosUUFBZCxDQUF4Qjs7QUFDQSxVQUFJQyxZQUFKLEVBQWtCO0FBQ2hCTCxRQUFBQSxLQUFLLENBQUNNLE9BQU4sR0FBZ0JELFlBQWhCO0FBQ0Q7O0FBQ0QsYUFBTyxDQUFDLEtBQUtuSSxpQkFBTCxDQUF1QmtGLFFBQXZCLENBQWdDNUIsRUFBaEMsQ0FBUjtBQUNELEtBWk0sQ0FBUDtBQWFEOztBQUVEbEMsRUFBQUEsUUFBUSxHQUFHO0FBQ1QsUUFBSSxLQUFLOUMsTUFBVCxFQUFpQjtBQUNmO0FBQ0EsV0FBS2lCLGlCQUFMLEdBQXlCLEtBQUtRLFVBQUwsQ0FBZ0JxQixRQUFoQixDQUF5QixLQUFLbEMsT0FBOUIsRUFBdUMsRUFBRSxHQUFHLEtBQUtaLE1BQVY7QUFBa0IrSixRQUFBQSxvQkFBb0IsRUFBRTtBQUF4QyxPQUF2QyxDQUF6QjtBQUNBLFdBQUs1SixNQUFMLEdBQWMsS0FBS29KLFVBQUwsRUFBZDtBQUNEOztBQUNELFdBQU8sS0FBS3RJLGlCQUFaO0FBQ0Q7O0FBRURrQyxFQUFBQSxPQUFPLEdBQUc7QUFDUixRQUFJLEtBQUtsQyxpQkFBTCxDQUF1QitJLEtBQTNCLEVBQWtDO0FBQ2hDLGFBQU8sSUFBUDtBQUNEOztBQUNELFdBQU8sS0FBS1QsVUFBTCxPQUFzQixDQUE3QjtBQUNEOztBQUVEaEcsRUFBQUEsT0FBTyxHQUFHO0FBQ1IsV0FBTyxLQUFLcEMsTUFBTCxJQUFnQixLQUFLTixLQUFMLElBQWMsS0FBS0csZ0JBQTFDO0FBQ0Q7O0FBRURpSixFQUFBQSxTQUFTLEdBQUc7QUFDVixXQUFPLEtBQUsxRyxPQUFMLE1BQWtCLEtBQUtKLE9BQUwsRUFBekI7QUFDRDs7QUFFREosRUFBQUEsY0FBYyxHQUFHO0FBQ2YsVUFBTW1ILFNBQVMsR0FBRyxLQUFLakcsYUFBTCxFQUFsQjs7QUFDQSxRQUFJaUcsU0FBUyxJQUFJLElBQWpCLEVBQXVCO0FBQ3JCLFVBQUksS0FBS0QsU0FBTCxFQUFKLEVBQXNCO0FBQ3BCLGFBQUtoRyxhQUFMLEdBQXFCbUMsZUFBckIsQ0FBcUMsVUFBckM7QUFDRCxPQUZELE1BRU87QUFDTCxhQUFLbkMsYUFBTCxHQUFxQmtDLFlBQXJCLENBQWtDLFVBQWxDLEVBQThDLElBQTlDO0FBQ0Q7QUFDRjs7QUFDRCxVQUFNZ0UsUUFBUSxHQUFHLEtBQUsvRixZQUFMLEVBQWpCOztBQUNBLFFBQUkrRixRQUFRLElBQUksSUFBaEIsRUFBc0I7QUFDcEIsVUFBSSxLQUFLdEosS0FBVCxFQUFnQjtBQUNkc0osUUFBQUEsUUFBUSxDQUFDL0QsZUFBVCxDQUF5QixVQUF6QjtBQUNELE9BRkQsTUFFTztBQUNMK0QsUUFBQUEsUUFBUSxDQUFDaEUsWUFBVCxDQUFzQixVQUF0QixFQUFrQyxJQUFsQztBQUNEO0FBQ0Y7QUFDRjs7QUFFRG5DLEVBQUFBLGVBQWUsQ0FBQ29HLGNBQUQsRUFBaUI7QUFDOUIsUUFBSUEsY0FBSixFQUFvQjtBQUNsQixXQUFLbkosaUJBQUwsR0FBeUIsRUFBekI7QUFDQSxXQUFLZCxNQUFMLEdBQWMsSUFBZDtBQUNBLFdBQUt1QyxpQkFBTDtBQUNELEtBSkQsTUFJTztBQUNMLFdBQUsySCxxQkFBTCxHQUE2QnhILFVBQVUsQ0FBQyxNQUFNLEtBQUtFLGNBQUwsRUFBUCxFQUE4QixDQUE5QixDQUF2QztBQUNEO0FBQ0Y7O0FBRVksUUFBUHVILE9BQU8sQ0FBQ0MsaUJBQUQsRUFBb0I7QUFDL0I1SCxJQUFBQSxZQUFZLENBQUMsS0FBSzBILHFCQUFOLENBQVo7O0FBQ0EsUUFBSUUsaUJBQWlCLENBQUNDLEdBQWxCLENBQXNCLFNBQXRCLENBQUosRUFBc0M7QUFDcEMsV0FBS25JLFdBQUwsR0FBbUJDLE9BQW5CLENBQTRCc0MsT0FBRCxJQUFhO0FBQ3RDQSxRQUFBQSxPQUFPLENBQUNELEtBQVIsR0FBZ0J2RixHQUFHLENBQUMsS0FBS3dCLE9BQU4sRUFBZWdFLE9BQU8sQ0FBQ0ksRUFBdkIsQ0FBbkI7QUFDRCxPQUZEO0FBR0Q7O0FBQ0QsU0FBS2hCLGVBQUwsQ0FBcUIsS0FBS2hELGdCQUFMLEtBQTBCdUosaUJBQWlCLENBQUNDLEdBQWxCLENBQXNCLFNBQXRCLEtBQW9DRCxpQkFBaUIsQ0FBQ0MsR0FBbEIsQ0FBc0IsUUFBdEIsQ0FBOUQsQ0FBckI7QUFDRDs7QUFFc0IsUUFBakJDLGlCQUFpQixHQUFHO0FBQ3hCLFVBQU0vQyxNQUFNLEdBQUcsTUFBTSxNQUFNK0MsaUJBQU4sRUFBckI7QUFDQSxVQUFNaEgsT0FBTyxDQUFDNkMsR0FBUixDQUFZLEtBQUtqRSxXQUFMLEdBQW1Ca0UsR0FBbkIsQ0FBd0JmLENBQUQsSUFBT0EsQ0FBQyxDQUFDM0IsY0FBaEMsQ0FBWixDQUFOO0FBQ0EsV0FBTzZELE1BQVA7QUFDRDs7QUFFRGdELEVBQUFBLE1BQU0sR0FBRztBQUNQLFdBQU94TCxJQUFJLGdCQUFnQlEsUUFBUSxDQUFDO0FBQUUyQixNQUFBQSxVQUFVLEVBQUUsS0FBS0E7QUFBbkIsS0FBRCxDQUF4QixrQkFDSzNCLFFBQVEsQ0FBQztBQUFFaUwsTUFBQUEsU0FBUyxFQUFFLElBQWI7QUFBbUJySCxNQUFBQSxPQUFPLEVBQUUsS0FBSzNDO0FBQWpDLEtBQUQsQ0FEYixNQUVMLEtBQUtELFNBQUwsS0FBbUIsSUFBbkIsR0FDRXhCLElBQUkscUNBRWNRLFFBQVEsQ0FBQztBQUFFa0wsTUFBQUEsS0FBSyxFQUFFLElBQVQ7QUFBZUMsTUFBQUEsTUFBTSxFQUFFLEtBQUtuSyxTQUFMLElBQWtCLENBQUMsS0FBS0g7QUFBL0MsS0FBRCxDQUZ0QixtR0FRRSxLQUFLYSxRQUFMLEtBQWtCLElBQWxCLElBQTBCLEtBQUtiLFNBQUwsS0FBbUIsSUFBN0MsR0FDRSxFQURGLEdBRUVyQixJQUFJLDhFQUtvQixLQUFLdUQsUUFMekIscUdBWW9CLEtBQUtRLFNBWnpCLCtCQWNVLEtBQUs1QyxXQWRmLHdCQVZSLFVBRE4sR0E4QkUsRUFoQ0cseUJBaUNnQixLQUFLTCxNQUFMLElBQWUsSUFBZixHQUFzQixLQUFLeUksV0FBTCxFQUF0QixHQUEyQ3ZKLElBQUksRUFqQy9ELFVBa0NMLEtBQUtxQixTQUFMLEtBQW1CLElBQW5CLElBQTJCLEtBQUthLFFBQUwsS0FBa0IsSUFBN0MsR0FDRWxDLElBQUksdUhBSXFELEtBQUt1RCxRQUoxRCxvR0FLNkMsS0FBS1EsU0FMbEQsK0JBSzBGLEtBQUs1QyxXQUwvRixLQU1PLEtBQUtBLFdBTlosNkJBRE4sR0FZRSxFQTlDRyxpQkFBWDtBQWlERDs7QUFFZ0IsYUFBTnlLLE1BQU0sR0FBRztBQUNsQixXQUFPLENBQ0xqTCxLQURLLEVBRUw7QUFDQVYsSUFBQUEsR0FBRyxpMkRBSEUsQ0FBUDtBQXFLRDs7QUFoc0IwQztBQW1zQjdDNEwsTUFBTSxDQUFDQyxjQUFQLENBQXNCQyxNQUF0QixDQUE2QixnQkFBN0IsRUFBK0NuTCxZQUEvQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sLCBjc3MgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZ2V0LCBzZXQsIGRlbCB9IGZyb20gJ29iamVjdC1wYXRoJztcbmltcG9ydCB7IGRpc3BhdGNoQ3VzdG9tRXZlbnQgfSBmcm9tICcuLi9saWIvZXZlbnRzJztcbmltcG9ydCB7IGRlZXBDbG9uZSwgZGVlcEVxdWFsIH0gZnJvbSAnLi4vbGliL3V0aWxzJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdCc7XG5pbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tICdqc29uc2NoZW1hJztcbmltcG9ydCB7IGVtcHR5IH0gZnJvbSAnLi4vc3R5bGVzL2VtcHR5JztcbmltcG9ydCAnLi9ndi1zY2hlbWEtZm9ybS1jb250cm9sJztcblxuLyoqXG4gKiBTY2hlbWEgZm9ybSBjb21wb25lbnRcbiAqXG4gKiBAZmlyZXMgZ3Ytc2NoZW1hLWZvcm06c3VibWl0IC0gZXZlbnQgd2hlbiB1c2VyIHN1Ym1pdCB2YWxpZCBmb3JtXG4gKiBAZmlyZXMgZ3Ytc2NoZW1hLWZvcm06ZXJyb3IgLSBldmVudCB3aGVuIHVzZXIgc3VibWl0IGludmFsaWQgZm9ybVxuICogQGZpcmVzIGd2LXNjaGVtYS1mb3JtOmNoYW5nZSAtIGV2ZW50IHdoZW4gd2hlbiBmb3JtIGNoYW5nZVxuICogQGZpcmVzIGd2LXNjaGVtYS1mb3JtOmNhbmNlbCAtIGV2ZW50IHdoZW4gdXNlciBjYW5jZWwgZm9ybVxuICpcbiAqIEBhdHRyIHtPYmplY3R9IHNjaGVtYSAtIHRoZSBzY2hlbWEgZm9ybSBjb25maWd1cmF0aW9uXG4gKiBAYXR0ciB7T2JqZWN0fSB2YWx1ZXMgLSB0aGUgdmFsdWVzIG9mIGZpZWxkc1xuICogQGF0dHIge09iamVjdH0gZXJyb3JzIC0gdGhlIG1hcCBvZiBlcnJvcnMgYnkgaW5wdXQga2V5XG4gKiBAYXR0ciB7Qm9vbGVhbn0gdmFsaWRhdGUgLSB0byBmb3JjZSB2YWxpZGF0aW9uIG9uIGZpcnN0IHJlbmRlclxuICogQGF0dHIge0Jvb2xlYW59IHJlYWRvbmx5IC0gdHJ1ZSBpZiByZWFkb25seVxuICogQGF0dHIge0Jvb2xlYW59IHNjcm9sbGFibGUgLSB1c2VmdWwgZm9yIG1ha2luZyBjb250ZW50IHNjcm9sbGFibGUgd2l0aCBmaXhlZCBoZWFkZXJzIC8gZm9vdGVyc1xuICpcbiAqIEBjc3Nwcm9wIHtDb2xvcn0gWy0tZ3Ytc2NoZW1hLWZvcm0tLWJnYz0jZmZmZmZmXSAtIEJhY2tncm91bmQgY29sb3JcbiAqIEBjc3Nwcm9wIHtMZW5ndGh9IFstLWd2LXNjaGVtYS1mb3JtLWNvbnRyb2wtLW09MC40cmVtXSAtIENvbnRyb2wgbWFyZ2luXG4gKi9cbmV4cG9ydCBjbGFzcyBHdlNjaGVtYUZvcm0gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBlcnJvcnM6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICB2YWx1ZXM6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBzdWJtaXRMYWJlbDogeyB0eXBlOiBTdHJpbmcgfSxcbiAgICAgIGhhc0Zvb3RlcjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdoYXMtZm9vdGVyJyB9LFxuICAgICAgaGFzSGVhZGVyOiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogJ2hhcy1oZWFkZXInIH0sXG4gICAgICBfY29uZmlybTogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIF92YWx1ZXM6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBkaXJ0eTogeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0sXG4gICAgICBoaWRlRGVwcmVjYXRlZDogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdoaWRlLWRlcHJlY2F0ZWQnIH0sXG4gICAgICB2YWxpZGF0ZU9uUmVuZGVyOiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogJ3ZhbGlkYXRlLW9uLXJlbmRlcicgfSxcbiAgICAgIF92YWxpZGF0b3JSZXN1bHRzOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgc2tlbGV0b246IHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgX3RvdWNoOiB7IHR5cGU6IEJvb2xlYW4gfSxcbiAgICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIHNjcm9sbGFibGU6IHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgZ3JvdXBzOiB7IHR5cGU6IEFycmF5IH0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5oaWRlRGVwcmVjYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3ZhbHVlcyA9IHt9O1xuICAgIHRoaXMuc3VibWl0TGFiZWwgPSAnT2snO1xuICAgIHRoaXMuaGFzSGVhZGVyID0gZmFsc2U7XG4gICAgdGhpcy5oYXNGb290ZXIgPSBmYWxzZTtcbiAgICB0aGlzLl90b3VjaCA9IGZhbHNlO1xuICAgIHRoaXMuX3ZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3IoKTtcbiAgICB0aGlzLl92YWxpZGF0b3JSZXN1bHRzID0ge307XG4gICAgdGhpcy5faWdub3JlUHJvcGVydGllcyA9IFtdO1xuICAgIHRoaXMuX2R5bmFtaWNDb250cm9scyA9IFtdO1xuICAgIHRoaXMuX2R5bmFtaWNBdHRyaWJ1dGVzID0gWydkaXNhYmxlZCcsICdyZXF1aXJlZCcsICdoaWRkZW4nXTtcbiAgICB0aGlzLmdyb3VwcyA9IG51bGw7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdndi1zY2hlbWEtZm9ybS1jb250cm9sOmRlZmF1bHQtdmFsdWUnLCB0aGlzLl9vbkRlZmF1bHRWYWx1ZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2d2LXNjaGVtYS1mb3JtLWNvbnRyb2w6Y2hhbmdlJywgdGhpcy5fb25DaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdndi1zY2hlbWEtZm9ybS1jb250cm9sOmNvbnRyb2wtcmVhZHknLCB0aGlzLl9vbkNvbnRyb2xSZWFkeS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHNldCB2YWx1ZXModmFsdWVzKSB7XG4gICAgaWYgKCFkZWVwRXF1YWwodGhpcy5fdmFsdWVzLCB2YWx1ZXMpKSB7XG4gICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxWYWx1ZXMgPSB7IC4uLnZhbHVlcyB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5pdGlhbFZhbHVlcyA9IHt9O1xuICAgICAgfVxuICAgICAgdGhpcy5fdmFsdWVzID0gZGVlcENsb25lKHRoaXMuX2luaXRpYWxWYWx1ZXMpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgfVxuXG4gIHJlc2V0KHZhbHVlcyA9IG51bGwpIHtcbiAgICB0aGlzLl92YWx1ZXMgPSBkZWVwQ2xvbmUodmFsdWVzIHx8IHRoaXMuX2luaXRpYWxWYWx1ZXMpO1xuICAgIHRoaXMuX3RvdWNoID0gZmFsc2U7XG4gICAgdGhpcy5fc2V0RGlydHkoZmFsc2UpO1xuICAgIHRoaXMuZ2V0Q29udHJvbHMoKS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICBzLnJlcXVlc3RVcGRhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9vblJlc2V0KCkge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdyZXNldCcpO1xuICB9XG5cbiAgcmVxdWVzdFZhbGlkYXRpb24oKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3ZhbGlkYXRlVGltZW91dCk7XG4gICAgdGhpcy5fdmFsaWRhdGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLl91cGRhdGVBY3Rpb25zKCk7XG4gICAgfSwgMzUwKTtcbiAgfVxuXG4gIHN1Ym1pdCgpIHtcbiAgICB0aGlzLl9vblN1Ym1pdCgpO1xuICB9XG5cbiAgX29uU3VibWl0KCkge1xuICAgIGNvbnN0IHZhbGlkYXRvclJlc3VsdHMgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICB0aGlzLl9pbml0aWFsVmFsdWVzID0gZGVlcENsb25lKHRoaXMuX3ZhbHVlcyk7XG4gICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgICB0aGlzLl90b3VjaCA9IGZhbHNlO1xuICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnc3VibWl0JywgeyB2YWx1ZXM6IHRoaXMuX3ZhbHVlcywgdmFsaWRhdG9yUmVzdWx0cyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZXJyb3InLCB7IHZhbHVlczogdGhpcy5fdmFsdWVzLCB2YWxpZGF0b3JSZXN1bHRzIH0pO1xuICAgIH1cbiAgfVxuXG4gIF9zZXREaXJ0eShkaXJ0eSA9IHRydWUpIHtcbiAgICB0aGlzLmRpcnR5ID0gISFkaXJ0eTtcbiAgfVxuXG4gIF9zZXRUb3VjaCh0b3VjaCA9IHRydWUpIHtcbiAgICB0aGlzLl90b3VjaCA9ICEhdG91Y2g7XG4gIH1cblxuICBjb25maXJtKCkge1xuICAgIGlmICh0aGlzLmlzVG91Y2goKSkge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpcm0gJiYgdGhpcy5fY29uZmlybS5wcm9taXNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maXJtLnByb21pc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gKHRoaXMuX2NvbmZpcm0gPSB7IHJlc29sdmUsIHJlamVjdCB9KSk7XG4gICAgICB0aGlzLl9jb25maXJtLnByb21pc2UgPSBwcm9taXNlO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIF9vbkNvbmZpcm1SZXNldCgpIHtcbiAgICBjb25zdCB7IHJlc29sdmUgfSA9IHRoaXMuX2NvbmZpcm07XG4gICAgdGhpcy5fY29uZmlybSA9IG51bGw7XG4gICAgdGhpcy5fb25SZXNldCgpO1xuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB7XG4gICAgICByZXNvbHZlKHRoaXMpO1xuICAgIH0pO1xuICB9XG5cbiAgX29uQ29uZmlybUVkaXQoKSB7XG4gICAgdGhpcy5fY29uZmlybS5yZWplY3QodGhpcyk7XG4gICAgdGhpcy5fY29uZmlybSA9IG51bGw7XG4gICAgdGhpcy5fdXBkYXRlQ2hpbGRyZW4odGhpcy52YWxpZGF0ZU9uUmVuZGVyKTtcbiAgfVxuXG4gIF9nZXRTdWJtaXRCdG4oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjc3VibWl0Jyk7XG4gIH1cblxuICBfZ2V0UmVzZXRCdG4oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjcmVzZXQnKTtcbiAgfVxuXG4gIF9kaXNwYXRjaENoYW5nZSgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fY2hhbmdlVGltZW91dCk7XG4gICAgdGhpcy5fY2hhbmdlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnY2hhbmdlJywgeyB0YXJnZXQ6IHRoaXMsIHZhbHVlczogdGhpcy5fdmFsdWVzLCB2YWxpZGF0aW9uOiB0aGlzLl92YWxpZGF0b3JSZXN1bHRzIH0pO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIF9vbkRlZmF1bHRWYWx1ZSh7IGRldGFpbDogeyBjdXJyZW50VGFyZ2V0LCB2YWx1ZSwgY29udHJvbCB9IH0pIHtcbiAgICBpZiAoY29udHJvbC50eXBlID09PSAnaW50ZWdlcicgJiYgdmFsdWUgIT0gbnVsbCAmJiAoKHZhbHVlLnRyaW0gJiYgdmFsdWUubGVuZ3RoID4gMCkgfHwgdmFsdWUubGVuZ3RoID4gMCkpIHtcbiAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gICAgc2V0KHRoaXMuX3ZhbHVlcywgY3VycmVudFRhcmdldC5pZCwgdmFsdWUpO1xuICB9XG5cbiAgX29uQ2hhbmdlKHsgZGV0YWlsOiB7IGN1cnJlbnRUYXJnZXQsIHZhbHVlLCBjb250cm9sIH0gfSkge1xuICAgIHRoaXMuX3NldFRvdWNoKHRydWUpO1xuICAgIGlmIChjb250cm9sLnR5cGUgPT09ICdpbnRlZ2VyJykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbnRWYWx1ZSA9IE51bWJlcih2YWx1ZSkudmFsdWVPZigpO1xuICAgICAgICBpZiAoIWlzTmFOKGludFZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gaW50VmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb250cm9sLnR5cGUgPT09ICdhcnJheScgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIGlmIChjb250cm9sLnR5cGUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIWNvbnRyb2wuZW51bSkge1xuICAgICAgdmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgZGVsKHRoaXMuX3ZhbHVlcywgY3VycmVudFRhcmdldC5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldCh0aGlzLl92YWx1ZXMsIGN1cnJlbnRUYXJnZXQuaWQsIHZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVEeW5hbWljQ29udHJvbHMoKTtcbiAgICB0aGlzLl92YWxpZGF0b3JSZXN1bHRzID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIHRoaXMuX3VwZGF0ZUFjdGlvbnMoKTtcbiAgICB0aGlzLl9kaXNwYXRjaENoYW5nZSgpO1xuICB9XG5cbiAgX29uQ29udHJvbFJlYWR5KGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBjb250cm9sRWxlbWVudCA9IGUuZGV0YWlsLmNvbnRyb2w7XG4gICAgY29uc3QgY29udHJvbCA9IGNvbnRyb2xFbGVtZW50LmNvbnRyb2w7XG4gICAgaWYgKGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXSkge1xuICAgICAgaWYgKGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXS5ldmVudCkge1xuICAgICAgICBjb25zdCBldmVudCA9IGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXS5ldmVudDtcbiAgICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCBldmVudC5uYW1lLCB7IC4uLmV2ZW50LCAuLi5lLmRldGFpbCB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5faGFzQ29uZGl0aW9uKGNvbnRyb2wpKSB7XG4gICAgICAgIHRoaXMuX2R5bmFtaWNDb250cm9scy5wdXNoKGNvbnRyb2xFbGVtZW50KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRHluYW1pY0NvbnRyb2woY29udHJvbEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVEeW5hbWljQ29udHJvbHMoKSB7XG4gICAgdGhpcy5faWdub3JlUHJvcGVydGllcyA9IFtdO1xuICAgIHRoaXMuX2R5bmFtaWNDb250cm9scy5mb3JFYWNoKChjb250cm9sRWxlbWVudCkgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlRHluYW1pY0NvbnRyb2woY29udHJvbEVsZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgX3VwZGF0ZUR5bmFtaWNDb250cm9sKGNvbnRyb2xFbGVtZW50KSB7XG4gICAgY29uc3QgY29udHJvbCA9IGNvbnRyb2xFbGVtZW50LmNvbnRyb2w7XG4gICAgaWYgKGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXSkge1xuICAgICAgdGhpcy5fZHluYW1pY0F0dHJpYnV0ZXMuZm9yRWFjaCgoYXR0cmlidXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzID0gdGhpcy5fZXZhbHVhdGVDb25kaXRpb24oY29udHJvbCwgYXR0cmlidXRlKTtcbiAgICAgICAgaWYgKGlzKSB7XG4gICAgICAgICAgY29udHJvbEVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgJycpO1xuICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICB0aGlzLl9pZ25vcmVQcm9wZXJ0aWVzLnB1c2goY29udHJvbEVsZW1lbnQuaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgcGVyZm9ybVVwZGF0ZSgpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmdldENvbnRyb2xzKCkubWFwKChlKSA9PiBlLnVwZGF0ZUNvbXBsZXRlKSk7XG4gICAgdGhpcy5nZXRDb250cm9scygpLmZvckVhY2goKHMpID0+IHtcbiAgICAgIHMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIH0pO1xuICAgIHN1cGVyLnBlcmZvcm1VcGRhdGUoKTtcbiAgfVxuXG4gIF9yZW5kZXJDb250cm9sKGtleSkge1xuICAgIC8vIFRoaXMgaXMgcmVxdWlyZSB0byBjbGVhbiBjYWNoZSBvZiA8Z3Ytc2NoZW1hLWZvcm0tY29udHJvbD5cbiAgICBjb25zdCBjb250cm9sID0geyAuLi50aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gfTtcbiAgICBjb25zdCBpc1JlcXVpcmVkID0gKHRoaXMuc2NoZW1hLnJlcXVpcmVkICYmIHRoaXMuc2NoZW1hLnJlcXVpcmVkLmluY2x1ZGVzKGtleSkpIHx8IHRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uKGNvbnRyb2wsICdyZXF1aXJlZCcpO1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSAodGhpcy5zY2hlbWEuZGlzYWJsZWQgJiYgdGhpcy5zY2hlbWEuZGlzYWJsZWQuaW5jbHVkZXMoa2V5KSkgfHwgdGhpcy5fZXZhbHVhdGVDb25kaXRpb24oY29udHJvbCwgJ2Rpc2FibGVkJyk7XG4gICAgY29uc3QgaXNIaWRkZW4gPSB0aGlzLl9ldmFsdWF0ZUNvbmRpdGlvbihjb250cm9sLCAnaGlkZGVuJyk7XG4gICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICB0aGlzLl9pZ25vcmVQcm9wZXJ0aWVzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgY29uc3QgaXNSZWFkb25seSA9IHRoaXMucmVhZG9ubHkgfHwgY29udHJvbC5yZWFkT25seSA9PT0gdHJ1ZTtcbiAgICBjb25zdCBpc1dyaXRlT25seSA9IGNvbnRyb2wud3JpdGVPbmx5ID09PSB0cnVlO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0KHRoaXMuX3ZhbHVlcywga2V5KTtcbiAgICByZXR1cm4gaHRtbGA8Z3Ytc2NoZW1hLWZvcm0tY29udHJvbFxuICAgICAgLmlkPVwiJHtrZXl9XCJcbiAgICAgIC5lcnJvcnM9XCIke3RoaXMuZXJyb3JzfVwiXG4gICAgICAuY29udHJvbD1cIiR7Y29udHJvbH1cIlxuICAgICAgLnNrZWxldG9uPVwiJHt0aGlzLnNrZWxldG9ufVwiXG4gICAgICAudmFsdWU9XCIke3ZhbHVlfVwiXG4gICAgICA/cmVhZG9ubHk9XCIke2lzUmVhZG9ubHl9XCJcbiAgICAgID93cml0ZW9ubHk9XCIke2lzV3JpdGVPbmx5fVwiXG4gICAgICA/cmVxdWlyZWQ9XCIke2lzUmVxdWlyZWR9XCJcbiAgICAgID9kaXNhYmxlZD1cIiR7aXNEaXNhYmxlZH1cIlxuICAgICAgP2hpZGRlbj1cIiR7aXNIaWRkZW59XCJcbiAgICA+PC9ndi1zY2hlbWEtZm9ybS1jb250cm9sPmA7XG4gIH1cblxuICBfaGFzQ29uZGl0aW9uKGNvbnRyb2wpIHtcbiAgICBpZiAoY29udHJvbFsneC1zY2hlbWEtZm9ybSddKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZHluYW1pY0F0dHJpYnV0ZXMuZmluZCgoY29uZGl0aW9uKSA9PiBjb250cm9sWyd4LXNjaGVtYS1mb3JtJ11bY29uZGl0aW9uXSAhPSBudWxsKSAhPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBfZXZhbHVhdGVDb25kaXRpb24oY29udHJvbCwgY29uZGl0aW9uS2V5KSB7XG4gICAgaWYgKGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXSA9PSBudWxsIHx8IGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXVtjb25kaXRpb25LZXldID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY29uZGl0aW9uID0gY29udHJvbFsneC1zY2hlbWEtZm9ybSddW2NvbmRpdGlvbktleV07XG4gICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIGNvbmRpdGlvbjtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmRpdGlvbikpIHtcbiAgICAgIC8vIGNvbmRpdGlvbiBpc24ndCBhbiBhcnJheSwgaWdub3JlIHRoZSBjb25kaXRpb25cbiAgICAgIGNvbnNvbGUud2FybihgJyR7Y29uZGl0aW9uS2V5fScgYXR0cmlidXRlIG9mICd4LXNjaGVtYS1mb3JtJyBzaG91bGQgYmUgYW4gYXJyYXlgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBjb25kaXRpb24pIHtcbiAgICAgIC8vIG9wZXJhdGlvbiBvbmx5IGhhdmUgb25lIG9wZXJhdG9yIHdpdGggYSBzaW5nbGUgb2JqZWN0IGNvbnRhaW5pbmcgb3BlcmFuZCB2YWx1ZXNcbiAgICAgIGNvbnN0IG9wZXJhdG9yID0gT2JqZWN0LmtleXMob3BlcmF0aW9uKVswXTtcblxuICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICBjYXNlICckbmVxJzpcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgdGhpcy5fZXZhbHVhdGVOb3RFcXVhbHNDb25kaXRpb24oY29udHJvbCwgb3BlcmF0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnJGVxJzpcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgdGhpcy5fZXZhbHVhdGVFcXVhbHNDb25kaXRpb24oY29udHJvbCwgb3BlcmF0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnJG5vZGVmJzpcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgdGhpcy5fZXZhbHVhdGVOb3REZWZDb25kaXRpb24oY29udHJvbCwgb3BlcmF0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnJGRlZic6XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIHRoaXMuX2V2YWx1YXRlRGVmQ29uZGl0aW9uKGNvbnRyb2wsIG9wZXJhdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS53YXJuKGBVbnN1cHBvcnRlZCBvcGVyYXRvciAnJHtvcGVyYXRvcn0nIG9uIGRpc2FibGUgY29uZGl0aW9uYCk7XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIF9ldmFsdWF0ZU5vdEVxdWFsc0NvbmRpdGlvbihjb250cm9sLCBjb25kaXRpb24pIHtcbiAgICByZXR1cm4gIXRoaXMuX2V2YWx1YXRlRXF1YWxzQ29uZGl0aW9uKGNvbnRyb2wsIGNvbmRpdGlvbik7XG4gIH1cblxuICBfZXZhbHVhdGVFcXVhbHNDb25kaXRpb24oY29udHJvbCwgY29uZGl0aW9uKSB7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBPYmplY3Qua2V5cyhjb25kaXRpb24pWzBdO1xuICAgIGNvbnN0IG9wZXJhbmRzID0gY29uZGl0aW9uW29wZXJhdG9yXTtcbiAgICBjb25zdCBtb2RlbEF0dHJpYnV0ZXMgPSBPYmplY3Qua2V5cyhvcGVyYW5kcyk7XG4gICAgcmV0dXJuIG1vZGVsQXR0cmlidXRlc1xuICAgICAgLm1hcCgobW9kZWxBdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgY29uc3QgdGVzdFZhbHVlID0gb3BlcmFuZHNbbW9kZWxBdHRyaWJ1dGVdO1xuICAgICAgICBsZXQgdmFsdWUgPSBnZXQodGhpcy5fdmFsdWVzLCBtb2RlbEF0dHJpYnV0ZSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIGNvbnRyb2wudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRlc3RWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdGVzdFZhbHVlLmluY2x1ZGVzKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRlc3RWYWx1ZTtcbiAgICAgIH0pXG4gICAgICAucmVkdWNlKChhY2MsIGN1cnJlbnQpID0+IGFjYyB8fCBjdXJyZW50KTtcbiAgfVxuXG4gIF9ldmFsdWF0ZU5vdERlZkNvbmRpdGlvbihjb250cm9sLCBjb25kaXRpb24pIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IE9iamVjdC5rZXlzKGNvbmRpdGlvbilbMF07XG4gICAgY29uc3QgbW9kZWxBdHRyaWJ1dGUgPSBjb25kaXRpb25bb3BlcmF0b3JdO1xuICAgIHJldHVybiBnZXQodGhpcy5fdmFsdWVzLCBtb2RlbEF0dHJpYnV0ZSkgPT09IHVuZGVmaW5lZCB8fCBnZXQodGhpcy5fdmFsdWVzLCBtb2RlbEF0dHJpYnV0ZSkgPT09IG51bGw7XG4gIH1cblxuICBfZXZhbHVhdGVEZWZDb25kaXRpb24oY29udHJvbCwgY29uZGl0aW9uKSB7XG4gICAgcmV0dXJuICF0aGlzLl9ldmFsdWF0ZU5vdERlZkNvbmRpdGlvbihjb250cm9sLCBjb25kaXRpb24pO1xuICB9XG5cbiAgX3JlbmRlclBhcnQoKSB7XG4gICAgaWYgKHRoaXMuX2NvbmZpcm0pIHtcbiAgICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJjb25maXJtLWJveFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXJyb3JcIj5UaGUgY29uZmlndXJhdGlvbiBpcyBub3QgdmFsaWQgYW5kIGNhbm5vdCBiZSBzYXZlZC48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpcm0tYm94X2FjdGlvbnNcIj5cbiAgICAgICAgICA8Z3YtYnV0dG9uIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uQ29uZmlybVJlc2V0fVwiIG91dGxpbmVkIGljb249XCJnZW5lcmFsOnVwZGF0ZVwiIGRhbmdlcj5Mb3NlIGNoYW5nZXM8L2d2LWJ1dHRvbj5cbiAgICAgICAgICA8Z3YtYnV0dG9uIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uQ29uZmlybUVkaXR9XCIgaWNvbj1cImRlc2lnbjplZGl0XCI+RWRpdDwvZ3YtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzID8gT2JqZWN0LmtleXModGhpcy5zY2hlbWEucHJvcGVydGllcykgOiBbXTtcbiAgICB0aGlzLl9pZ25vcmVQcm9wZXJ0aWVzID0gW107XG5cbiAgICBpZiAodGhpcy5ncm91cHMpIHtcbiAgICAgIC8vIFJlbW92ZSB1bmRlZmluZWQgZ3JvdXAgaXRlbXNcbiAgICAgIGNvbnN0IGdyb3Vwc0NsZWFuZWQgPSB0aGlzLmdyb3Vwcy5yZWR1Y2UoKHByZXYsIGdyb3VwKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zRXhpc3RpbmdJblNjaGVtYUtleXMgPSBrZXlzLmZpbHRlcigoa2V5KSA9PiBbLi4uKGdyb3VwLml0ZW1zIHx8IFtdKV0uaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgIHByZXYucHVzaCh7XG4gICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgaXRlbXM6IGl0ZW1zRXhpc3RpbmdJblNjaGVtYUtleXMgfHwgW10sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sIFtdKTtcblxuICAgICAgLy8gQWRkIG5vbiBncm91cGVkIGl0ZW1zIGluc2lkZSBkZWZhdWx0IGdyb3VwXG4gICAgICBjb25zdCBkZWZhdWx0R3JvdXAgPSBncm91cHNDbGVhbmVkLmZpbmQoKGcpID0+IGcuZGVmYXVsdCkgfHwgeyBkZWZhdWx0OiB0cnVlLCBpdGVtczogW10gfTtcbiAgICAgIGNvbnN0IHppcEdyb3VwZWRJdGVtcyA9IGdyb3Vwc0NsZWFuZWQucmVkdWNlKChwcmV2LCBncm91cCkgPT4gWy4uLnByZXYsIC4uLmdyb3VwLml0ZW1zXSwgW10pO1xuICAgICAgZGVmYXVsdEdyb3VwLml0ZW1zID0ga2V5cy5maWx0ZXIoKGtleSkgPT4gIXppcEdyb3VwZWRJdGVtcy5pbmNsdWRlcyhrZXkpKTtcblxuICAgICAgcmV0dXJuIHJlcGVhdChcbiAgICAgICAgZ3JvdXBzQ2xlYW5lZCxcbiAgICAgICAgKGdyb3VwKSA9PlxuICAgICAgICAgIGh0bWxgJHtncm91cC5uYW1lXG4gICAgICAgICAgICA/IGh0bWxgPGgyIGNsYXNzPVwiZ3JvdXAtdGl0bGVcIj4ke2dyb3VwLm5hbWV9PC9oMj5cbiAgICAgICAgICAgICAgICAke3JlcGVhdChncm91cC5pdGVtcywgKGtleSkgPT4gdGhpcy5fcmVuZGVyQ29udHJvbChrZXkpKX1gXG4gICAgICAgICAgICA6IHJlcGVhdChncm91cC5pdGVtcywgKGtleSkgPT4gdGhpcy5fcmVuZGVyQ29udHJvbChrZXkpKX0gYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgJHtyZXBlYXQoWzFdLCAoKSA9PlxuICAgICAgcmVwZWF0KFxuICAgICAgICBrZXlzLFxuICAgICAgICAoa2V5KSA9PiBrZXksXG4gICAgICAgIChrZXkpID0+IHRoaXMuX3JlbmRlckNvbnRyb2woa2V5KSxcbiAgICAgICksXG4gICAgKX1gO1xuICB9XG5cbiAgZ2V0Q29udHJvbHMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2d2LXNjaGVtYS1mb3JtLWNvbnRyb2wnKSk7XG4gIH1cblxuICBnZXRDb250cm9sKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke2lkfVwiXWApO1xuICB9XG5cbiAgX2dldEVycm9ycygpIHtcbiAgICByZXR1cm4gKHRoaXMuX3ZhbGlkYXRvclJlc3VsdHMuZXJyb3JzIHx8IFtdKS5maWx0ZXIoKGVycm9yKSA9PiB7XG4gICAgICBsZXQgaWQgPSBgJHtlcnJvci5wcm9wZXJ0eS5yZXBsYWNlKCdpbnN0YW5jZS4nLCAnJyl9YDtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShlcnJvci5hcmd1bWVudCkpIHtcbiAgICAgICAgaWQgPSBgJHtpZH0uJHtlcnJvci5hcmd1bWVudH1gO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcktleSA9IGB4LXNjaGVtYS1mb3JtLmVycm9ycy4ke2lkfS4ke2Vycm9yLm5hbWV9YDtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdldCh0aGlzLnNjaGVtYSwgZXJyb3JLZXkpO1xuICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gZXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmV0dXJuICF0aGlzLl9pZ25vcmVQcm9wZXJ0aWVzLmluY2x1ZGVzKGlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlKCkge1xuICAgIGlmICh0aGlzLnNjaGVtYSkge1xuICAgICAgLy8gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHNob3VsZCBub3QgYmxvY2sgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZvcm1cbiAgICAgIHRoaXMuX3ZhbGlkYXRvclJlc3VsdHMgPSB0aGlzLl92YWxpZGF0b3IudmFsaWRhdGUodGhpcy5fdmFsdWVzLCB7IC4uLnRoaXMuc2NoZW1hLCBhZGRpdGlvbmFsUHJvcGVydGllczoge30gfSk7XG4gICAgICB0aGlzLmVycm9ycyA9IHRoaXMuX2dldEVycm9ycygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yUmVzdWx0cztcbiAgfVxuXG4gIGlzVmFsaWQoKSB7XG4gICAgaWYgKHRoaXMuX3ZhbGlkYXRvclJlc3VsdHMudmFsaWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ2V0RXJyb3JzKCkgPT09IDA7XG4gIH1cblxuICBpc1RvdWNoKCkge1xuICAgIHJldHVybiB0aGlzLl90b3VjaCB8fCAodGhpcy5kaXJ0eSAmJiB0aGlzLnZhbGlkYXRlT25SZW5kZXIpO1xuICB9XG5cbiAgY2FuU3VibWl0KCkge1xuICAgIHJldHVybiB0aGlzLmlzVG91Y2goKSAmJiB0aGlzLmlzVmFsaWQoKTtcbiAgfVxuXG4gIF91cGRhdGVBY3Rpb25zKCkge1xuICAgIGNvbnN0IHN1Ym1pdEJ0biA9IHRoaXMuX2dldFN1Ym1pdEJ0bigpO1xuICAgIGlmIChzdWJtaXRCdG4gIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuY2FuU3VibWl0KCkpIHtcbiAgICAgICAgdGhpcy5fZ2V0U3VibWl0QnRuKCkucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZ2V0U3VibWl0QnRuKCkuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXNldEJ0biA9IHRoaXMuX2dldFJlc2V0QnRuKCk7XG4gICAgaWYgKHJlc2V0QnRuICE9IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICAgIHJlc2V0QnRuLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc2V0QnRuLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfdXBkYXRlQ2hpbGRyZW4od2l0aFZhbGlkYXRpb24pIHtcbiAgICBpZiAod2l0aFZhbGlkYXRpb24pIHtcbiAgICAgIHRoaXMuX3ZhbGlkYXRvclJlc3VsdHMgPSB7fTtcbiAgICAgIHRoaXMuZXJyb3JzID0gbnVsbDtcbiAgICAgIHRoaXMucmVxdWVzdFZhbGlkYXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdXBkYXRlQWN0aW9uc1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3VwZGF0ZUFjdGlvbnMoKSwgMCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlZChjaGFuZ2VkUHJvcGVydGllcykge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl91cGRhdGVBY3Rpb25zVGltZW91dCk7XG4gICAgaWYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnX3ZhbHVlcycpKSB7XG4gICAgICB0aGlzLmdldENvbnRyb2xzKCkuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgICBjb250cm9sLnZhbHVlID0gZ2V0KHRoaXMuX3ZhbHVlcywgY29udHJvbC5pZCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlQ2hpbGRyZW4odGhpcy52YWxpZGF0ZU9uUmVuZGVyICYmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ192YWx1ZXMnKSB8fCBjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ3NjaGVtYScpKSk7XG4gIH1cblxuICBhc3luYyBnZXRVcGRhdGVDb21wbGV0ZSgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdXBlci5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuZ2V0Q29udHJvbHMoKS5tYXAoKGUpID0+IGUudXBkYXRlQ29tcGxldGUpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxmb3JtIGNsYXNzPVwiJHtjbGFzc01hcCh7IHNjcm9sbGFibGU6IHRoaXMuc2Nyb2xsYWJsZSB9KX1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCIke2NsYXNzTWFwKHsgY29udGFpbmVyOiB0cnVlLCBjb25maXJtOiB0aGlzLl9jb25maXJtIH0pfVwiPlxuICAgICAgICAke3RoaXMuaGFzSGVhZGVyID09PSB0cnVlXG4gICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiR7Y2xhc3NNYXAoeyB0aXRsZTogdHJ1ZSwgY2VudGVyOiB0aGlzLmhhc0hlYWRlciAmJiAhdGhpcy5oYXNGb290ZXIgfSl9XCI+XG4gICAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwidGl0bGVcIj48L3Nsb3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj5cbiAgICAgICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJoZWFkZXItbGVmdFwiPjwvc2xvdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAke3RoaXMucmVhZG9ubHkgPT09IHRydWUgfHwgdGhpcy5oYXNGb290ZXIgPT09IHRydWVcbiAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgIDogaHRtbGA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8Z3YtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInJlc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBzbWFsbFxuICAgICAgICAgICAgICAgICAgICAgICAgQGd2LWJ1dHRvbjpjbGljaz1cIiR7dGhpcy5fb25SZXNldH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImdlbmVyYWw6dXBkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiUmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2d2LWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8Z3YtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzbWFsbFxuICAgICAgICAgICAgICAgICAgICAgICAgQGd2LWJ1dHRvbjpjbGljaz1cIiR7dGhpcy5fb25TdWJtaXR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJjb2RlOmNoZWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aXRsZT1cIiR7dGhpcy5zdWJtaXRMYWJlbH1cIlxuICAgICAgICAgICAgICAgICAgICAgID48L2d2LWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IGB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYFxuICAgICAgICAgIDogJyd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+JHt0aGlzLnNjaGVtYSAhPSBudWxsID8gdGhpcy5fcmVuZGVyUGFydCgpIDogaHRtbGBgfTwvZGl2PlxuICAgICAgICAke3RoaXMuaGFzRm9vdGVyID09PSB0cnVlICYmIHRoaXMucmVhZG9ubHkgIT09IHRydWVcbiAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICAgICAgICAgICAgICAgICAgPGd2LWJ1dHRvbiBpZD1cInJlc2V0XCIgb3V0bGluZWQgQGd2LWJ1dHRvbjpjbGljaz1cIiR7dGhpcy5fb25SZXNldH1cIiBpY29uPVwiZ2VuZXJhbDp1cGRhdGVcIiB0aXRsZT1cIlJlc2V0XCI+UmVzZXQ8L2d2LWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxndi1idXR0b24gaWQ9XCJzdWJtaXRcIiBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vblN1Ym1pdH1cIiBpY29uPVwiY29kZTpjaGVja1wiIC50aXRsZT1cIiR7dGhpcy5zdWJtaXRMYWJlbH1cIlxuICAgICAgICAgICAgICAgICAgICA+JHt0aGlzLnN1Ym1pdExhYmVsfTwvZ3YtYnV0dG9uXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYFxuICAgICAgICAgIDogJyd9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+YDtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBlbXB0eSxcbiAgICAgIC8vIGxhbmd1YWdlPUNTU1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBtYXJnaW46IDAuMnJlbTtcbiAgICAgICAgICAtLWJnYzogdmFyKC0tZ3Ytc2NoZW1hLWZvcm0tLWJnYywgI2ZmZmZmZik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtLnNjcm9sbGFibGUge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICB0b3A6IDA7XG4gICAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAuY29udGFpbmVyIHtcbiAgICAgICAgICBmbGV4LWdyb3c6IDE7XG5cbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZ2MpO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgICAgICAgIC8qIGZvciBGaXJlZm94ICovXG4gICAgICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIsXG4gICAgICAgIC5mb290ZXIsXG4gICAgICAgIC5jb250ZW50IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1iZ2MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNvbnRlbnQge1xuICAgICAgICAgIGZsZXgtZ3JvdzogMTtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgICAgICAgLyogZm9yIEZpcmVmb3ggKi9cbiAgICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNvbnRlbnQgPiBndi1zY2hlbWEtZm9ybS1jb250cm9sIHtcbiAgICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtLnNjcm9sbGFibGUgLmNvbnRlbnQge1xuICAgICAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybS5zY3JvbGxhYmxlIC5jb250ZW50ID4gZ3Ytc2NoZW1hLWZvcm0tY29udHJvbCxcbiAgICAgICAgZm9ybS5zY3JvbGxhYmxlIC5jb250ZW50ID4gLmdyb3VwLXRpdGxlIHtcbiAgICAgICAgICBtYXgtd2lkdGg6IDc3NXB4O1xuICAgICAgICAgIHdpZHRoOiA5NSU7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyLFxuICAgICAgICAuZm9vdGVyIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgbWluLWhlaWdodDogNDVweDtcbiAgICAgICAgICAtLWd2LWljb24tLXM6IDI2cHg7XG4gICAgICAgICAgLS1ndi1pY29uLS1jOiAjYmZiZmJmO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgcGFkZGluZzogMCAwLjVyZW07XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB9XG5cbiAgICAgICAgLmhlYWRlciB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkOWQ5ZDk7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9vdGVyIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtO1xuICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZDlkOWQ5O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybS5zY3JvbGxhYmxlIC5mb290ZXIge1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLmZvb3RlciAubGVmdCxcbiAgICAgICAgLmZvb3RlciAucmlnaHQge1xuICAgICAgICAgIG1heC13aWR0aDogNDAwcHg7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC5sZWZ0LFxuICAgICAgICAuZm9vdGVyIC5sZWZ0LFxuICAgICAgICAuaGVhZGVyIC5yaWdodCxcbiAgICAgICAgLmZvb3RlciAucmlnaHQge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleDogMTtcbiAgICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLmhlYWRlciAucmlnaHQsXG4gICAgICAgIC5mb290ZXIgLnJpZ2h0IHtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgICB9XG5cbiAgICAgICAgLmhlYWRlciAudGl0bGUge1xuICAgICAgICAgIGNvbG9yOiAjMjg0NDRmO1xuICAgICAgICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC50aXRsZS5jZW50ZXIge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB0b3A6IDA7XG4gICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgICBib3R0b206IDA7XG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAuY29uZmlybS1ib3gge1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtO1xuICAgICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb25maXJtLWJveF9hY3Rpb25zIHtcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtIDA7XG4gICAgICAgIH1cblxuICAgICAgICAuY29uZmlybSAuaGVhZGVyIC5sZWZ0LFxuICAgICAgICAuY29uZmlybSAuaGVhZGVyIC5yaWdodCxcbiAgICAgICAgLmNvbmZpcm0gLmZvb3RlciAubGVmdCxcbiAgICAgICAgLmNvbmZpcm0gLmZvb3RlciAucmlnaHQge1xuICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgIH1cblxuICAgICAgICAuZ3JvdXAtdGl0bGUge1xuICAgICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBjb2xvcjogdmFyKC0tZ3YtdGhlbWUtZm9udC1jb2xvci1kYXJrKTtcbiAgICAgICAgICBmb250LXNpemU6IDIxcHg7XG4gICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgICBwYWRkaW5nLWJvdHRvbTogMC4zZW07XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWd2LXRoZW1lLWZvbnQtY29sb3ItZGFyayk7XG4gICAgICAgICAgbWFyZ2luLXRvcDogMjRweDtcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgICB9XG4gICAgICBgLFxuICAgIF07XG4gIH1cbn1cblxud2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZ3Ytc2NoZW1hLWZvcm0nLCBHdlNjaGVtYUZvcm0pO1xuIl19
1
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.GvSchemaForm=void 0;const t=require("lit"),e=require("object-path"),i=require("../lib/events"),s=require("../lib/utils"),o=require("lit/directives/class-map"),r=require("lit/directives/repeat"),a=require("jsonschema"),n=require("../styles/empty");require("./gv-schema-form-control");class l extends t.LitElement{static get properties(){return{schema:{type:Object},errors:{type:Object},values:{type:Object},submitLabel:{type:String},hasFooter:{type:Boolean,attribute:"has-footer"},hasHeader:{type:Boolean,attribute:"has-header"},_confirm:{type:Object},_values:{type:Object,attribute:!1},dirty:{type:Boolean,reflect:!0},hideDeprecated:{type:Boolean,attribute:"hide-deprecated"},validateOnRender:{type:Boolean,attribute:"validate-on-render"},_validatorResults:{type:Object},skeleton:{type:Boolean,reflect:!0},_touch:{type:Boolean},readonly:{type:Boolean,reflect:!0},scrollable:{type:Boolean,reflect:!0},groups:{type:Array}}}constructor(){super(),this.hideDeprecated=!1,this._values={},this.submitLabel="Ok",this.hasHeader=!1,this.hasFooter=!1,this._touch=!1,this._validator=new a.Validator,this._validatorResults={},this._ignoreProperties=[],this._dynamicControls=[],this._dynamicAttributes=["disabled","required","hidden"],this.groups=null,this.addEventListener("gv-schema-form-control:default-value",this._onDefaultValue.bind(this)),this.addEventListener("gv-schema-form-control:change",this._onChange.bind(this)),this.addEventListener("gv-schema-form-control:control-ready",this._onControlReady.bind(this))}set values(t){(0,s.deepEqual)(this._values,t)||(this._initialValues=t?{...t}:{},this._values=(0,s.deepClone)(this._initialValues))}get values(){return this._values}reset(t=null){this._values=(0,s.deepClone)(t||this._initialValues),this._touch=!1,this._setDirty(!1),this.getControls().forEach((t=>{t.requestUpdate()}))}_onReset(){this.reset(),(0,i.dispatchCustomEvent)(this,"reset")}requestValidation(){clearTimeout(this._validateTimeout),this._validateTimeout=setTimeout((()=>{this.validate(),this._updateActions()}),350)}submit(){this._onSubmit()}_onSubmit(){const t=this.validate();this.isValid()?(this._initialValues=(0,s.deepClone)(this._values),this.dirty=!1,this._touch=!1,(0,i.dispatchCustomEvent)(this,"submit",{values:this._values,validatorResults:t})):(0,i.dispatchCustomEvent)(this,"error",{values:this._values,validatorResults:t})}_setDirty(t=!0){this.dirty=!!t}_setTouch(t=!0){this._touch=!!t}confirm(){if(this.isTouch()){if(this._confirm&&this._confirm.promise)return this._confirm.promise;const t=new Promise(((t,e)=>this._confirm={resolve:t,reject:e}));return this._confirm.promise=t,t}return Promise.resolve()}_onConfirmReset(){const{resolve:t}=this._confirm;this._confirm=null,this._onReset(),this.requestUpdate(),this.updateComplete.then((()=>{t(this)}))}_onConfirmEdit(){this._confirm.reject(this),this._confirm=null,this._updateChildren(this.validateOnRender)}_getSubmitBtn(){return this.shadowRoot.querySelector("#submit")}_getResetBtn(){return this.shadowRoot.querySelector("#reset")}_dispatchChange(){clearTimeout(this._changeTimeout),this._changeTimeout=setTimeout((()=>{(0,i.dispatchCustomEvent)(this,"change",{target:this,values:this._values,validation:this._validatorResults})}),50)}_onDefaultValue({detail:{currentTarget:t,value:i,control:s}}){"integer"===s.type&&null!=i&&(i.trim&&i.length>0||i.length>0)&&(i=parseInt(i,10)),(0,e.set)(this._values,t.id,i)}_onChange({detail:{currentTarget:t,value:i,control:s}}){if(this._setTouch(!0),"integer"===s.type)if("string"==typeof i&&0===i.trim().length)i=null;else{const t=Number(i).valueOf();i=isNaN(t)?null:t}else"array"===s.type&&0===i.length?i=null:"string"!==s.type||0!==i.trim().length||s.enum?"object"===s.type&&0===Object.keys(i).length&&(i=null):i=null;null==i?(0,e.del)(this._values,t.id):(0,e.set)(this._values,t.id,i),this._updateDynamicControls(),this._validatorResults=this.validate(),this.dirty=!0,this._updateActions(),this._dispatchChange()}_onControlReady(t){t.stopPropagation(),t.preventDefault();const e=t.detail.control,s=e.control;if(s["x-schema-form"])if(s["x-schema-form"].event){const e=s["x-schema-form"].event;(0,i.dispatchCustomEvent)(this,e.name,{...e,...t.detail})}else this._hasCondition(s)&&(this._dynamicControls.push(e),this._updateDynamicControl(e))}_updateDynamicControls(){this._ignoreProperties=[],this._dynamicControls.forEach((t=>{this._updateDynamicControl(t)}))}_updateDynamicControl(t){const e=t.control;return e["x-schema-form"]&&this._dynamicAttributes.forEach((i=>{this._evaluateCondition(e,i)?(t.setAttribute(i,""),"hidden"===i&&this._ignoreProperties.push(t.id)):t.removeAttribute(i)})),null}async performUpdate(){await Promise.all(this.getControls().map((t=>t.updateComplete))),this.getControls().forEach((t=>{t.requestUpdate()})),super.performUpdate()}_renderControl(i){const s={...this.schema.properties[i]},o=this.schema.required&&this.schema.required.includes(i)||this._evaluateCondition(s,"required"),r=this.schema.disabled&&this.schema.disabled.includes(i)||this._evaluateCondition(s,"disabled"),a=this._evaluateCondition(s,"hidden");a&&this._ignoreProperties.push(i);const n=this.readonly||!0===s.readOnly,l=!0===s.writeOnly,h=(0,e.get)(this._values,i);return t.html`<gv-schema-form-control .id="${i}" .errors="${this.errors}" .control="${s}" .skeleton="${this.skeleton}" .value="${h}" ?readonly="${n}" ?writeonly="${l}" ?required="${o}" ?disabled="${r}" ?hidden="${a}"></gv-schema-form-control>`}_hasCondition(t){return!!t["x-schema-form"]&&null!=this._dynamicAttributes.find((e=>null!=t["x-schema-form"][e]))}_evaluateCondition(t,e){if(null==t["x-schema-form"]||null==t["x-schema-form"][e])return!1;const i=t["x-schema-form"][e];if("boolean"==typeof i)return i;if(!Array.isArray(i))return console.warn(`'${e}' attribute of 'x-schema-form' should be an array`),!1;let s=!0;for(const e of i){const i=Object.keys(e)[0];switch(i){case"$neq":s=s&&this._evaluateNotEqualsCondition(t,e);break;case"$eq":s=s&&this._evaluateEqualsCondition(t,e);break;case"$nodef":s=s&&this._evaluateNotDefCondition(t,e);break;case"$def":s=s&&this._evaluateDefCondition(t,e);break;default:console.warn(`Unsupported operator '${i}' on disable condition`),s=!1}}return s}_evaluateNotEqualsCondition(t,e){return!this._evaluateEqualsCondition(t,e)}_evaluateEqualsCondition(t,i){const s=i[Object.keys(i)[0]];return Object.keys(s).map((i=>{const o=s[i];let r=(0,e.get)(this._values,i);return null==r&&"string"===t.type&&(r=""),Array.isArray(o)?o.includes(r):r===o})).reduce(((t,e)=>t||e))}_evaluateNotDefCondition(t,i){const s=i[Object.keys(i)[0]];return void 0===(0,e.get)(this._values,s)||null===(0,e.get)(this._values,s)}_evaluateDefCondition(t,e){return!this._evaluateNotDefCondition(t,e)}_renderPart(){if(this._confirm)return t.html`<div class="confirm-box"><div class="error">The configuration is not valid and cannot be saved.</div><div class="confirm-box_actions"><gv-button @gv-button:click="${this._onConfirmReset}" outlined icon="general:update" danger>Lose changes</gv-button><gv-button @gv-button:click="${this._onConfirmEdit}" icon="design:edit">Edit</gv-button></div></div>`;const e=this.schema.properties?Object.keys(this.schema.properties):[];if(this._ignoreProperties=[],this.groups){const i=this.groups.reduce(((t,i)=>{const s=e.filter((t=>[...i.items||[]].includes(t)));return t.push({...i,items:s||[]}),t}),[]),s=i.find((t=>t.default))||{default:!0,items:[]},o=i.reduce(((t,e)=>[...t,...e.items]),[]);return s.items=e.filter((t=>!o.includes(t))),(0,r.repeat)(i,(e=>t.html`${e.name?t.html`<h2 class="group-title">${e.name}</h2>${(0,r.repeat)(e.items,(t=>this._renderControl(t)))}`:(0,r.repeat)(e.items,(t=>this._renderControl(t)))}`))}return t.html`${(0,r.repeat)([1],(()=>(0,r.repeat)(e,(t=>t),(t=>this._renderControl(t)))))}`}getControls(){return Array.from(this.shadowRoot.querySelectorAll("gv-schema-form-control"))}getControl(t){return this.shadowRoot.querySelector(`[id="${t}"]`)}_getErrors(){return(this._validatorResults.errors||[]).filter((t=>{let i=`${t.property.replace("instance.","")}`;Array.isArray(t.argument)||(i=`${i}.${t.argument}`);const s=`x-schema-form.errors.${i}.${t.name}`,o=(0,e.get)(this.schema,s);return o&&(t.message=o),!this._ignoreProperties.includes(i)}))}validate(){return this.schema&&(this._validatorResults=this._validator.validate(this._values,{...this.schema,additionalProperties:{}}),this.errors=this._getErrors()),this._validatorResults}isValid(){return!!this._validatorResults.valid||0===this._getErrors()}isTouch(){return this._touch||this.dirty&&this.validateOnRender}canSubmit(){return this.isTouch()&&this.isValid()}_updateActions(){null!=this._getSubmitBtn()&&(this.canSubmit()?this._getSubmitBtn().removeAttribute("disabled"):this._getSubmitBtn().setAttribute("disabled",!0));const t=this._getResetBtn();null!=t&&(this.dirty?t.removeAttribute("disabled"):t.setAttribute("disabled",!0))}_updateChildren(t){t?(this._validatorResults={},this.errors=null,this.requestValidation()):this._updateActionsTimeout=setTimeout((()=>this._updateActions()),0)}async updated(t){clearTimeout(this._updateActionsTimeout),t.has("_values")&&this.getControls().forEach((t=>{t.value=(0,e.get)(this._values,t.id)})),this._updateChildren(this.validateOnRender&&(t.has("_values")||t.has("schema")))}async getUpdateComplete(){const t=await super.getUpdateComplete();return await Promise.all(this.getControls().map((t=>t.updateComplete))),t}render(){return t.html`<form class="${(0,o.classMap)({scrollable:this.scrollable})}"><div class="${(0,o.classMap)({container:!0,confirm:this._confirm})}">${!0===this.hasHeader?t.html`<div class="header"><div class="${(0,o.classMap)({title:!0,center:this.hasHeader&&!this.hasFooter})}"><slot name="title"></slot></div><div class="left"><slot name="header-left"></slot></div>${!0===this.readonly||!0===this.hasFooter?"":t.html`<div class="right"><gv-button id="reset" outlined small @gv-button:click="${this._onReset}" icon="general:update" title="Reset"></gv-button><gv-button id="submit" small @gv-button:click="${this._onSubmit}" icon="code:check" .title="${this.submitLabel}"></gv-button></div>`}</div>`:""}<div class="content">${null!=this.schema?this._renderPart():t.html``}</div>${!0===this.hasFooter&&!0!==this.readonly?t.html`<div class="footer"><div class="left"></div><div class="right"><gv-button id="reset" outlined @gv-button:click="${this._onReset}" icon="general:update" title="Reset">Reset</gv-button><gv-button id="submit" @gv-button:click="${this._onSubmit}" icon="code:check" .title="${this.submitLabel}">${this.submitLabel}</gv-button></div></div>`:""}</div></form>`}static get styles(){return[n.empty,t.css`:host{box-sizing:border-box;margin:.2rem;--bgc:var(--gv-schema-form--bgc, #ffffff)}form{display:flex;flex-direction:column}form.scrollable{position:absolute;width:100%;top:0;bottom:0;left:0}.container{flex-grow:1;background-color:var(--bgc);display:flex;flex-direction:column;min-height:0}.content,.footer,.header{background-color:var(--bgc)}.content{flex-grow:1;display:flex;flex-direction:column;align-self:center;width:100%;min-height:0}.content>gv-schema-form-control{align-self:center;width:100%}form.scrollable .content{overflow:auto}form.scrollable .content>.group-title,form.scrollable .content>gv-schema-form-control{max-width:775px;width:95%}.footer,.header{display:flex;box-sizing:border-box;min-height:45px;--gv-icon--s:26px;--gv-icon--c:#bfbfbf;align-items:center;padding:0 .5rem;position:relative}.header{border-bottom:1px solid #d9d9d9}.footer{display:flex;justify-content:space-between;padding:1rem;border-top:1px solid #d9d9d9}form.scrollable .footer{justify-content:center}.footer .left,.footer .right{max-width:400px}.footer .left,.footer .right,.header .left,.header .right{display:flex;flex:1;z-index:10;align-items:center}.footer .right,.header .right{justify-content:flex-end}.header .title{color:#28444f;font-size:18px;display:flex;width:100%;align-items:center}.header .title.center{position:absolute;top:0;left:0;bottom:0;justify-content:center}.confirm-box{height:100%;padding:1rem;font-style:italic;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.confirm-box_actions{padding:1rem 0}.confirm .footer .left,.confirm .footer .right,.confirm .header .left,.confirm .header .right{display:none}.group-title{align-self:center;width:100%;color:var(--gv-theme-font-color-dark);font-size:21px;font-weight:600;padding-bottom:.3em;border-bottom:1px solid var(--gv-theme-font-color-dark);margin-top:24px;margin-bottom:16px}`]}}exports.GvSchemaForm=l,window.customElements.define("gv-schema-form",l);