@gravitee/ui-components 3.24.5 → 3.25.0-fix-gvcode-15ce1d2
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.
- package/CHANGELOG.md +1270 -0
- package/LICENSE.txt +202 -0
- package/README.md +195 -0
- package/assets/i18n/en.json +3 -0
- package/assets/i18n/fr.json +3 -0
- package/assets/icons/design.svg +1 -1
- package/package.json +1 -1
- package/src/.eslintrc.js +19 -0
- package/src/atoms/gv-autocomplete.js +156 -132
- package/src/atoms/gv-button.js +248 -73
- package/src/atoms/gv-checkbox.js +103 -45
- package/src/atoms/gv-date-picker-calendar.js +393 -312
- package/src/atoms/gv-date-picker-cell.js +81 -57
- package/src/atoms/gv-date-picker.js +319 -180
- package/src/atoms/gv-file-upload.js +195 -85
- package/src/atoms/gv-icon.js +34 -13
- package/src/atoms/gv-image.js +66 -31
- package/src/atoms/gv-input-message.js +37 -12
- package/src/atoms/gv-input.js +148 -117
- package/src/atoms/gv-link.js +125 -47
- package/src/atoms/gv-message.js +69 -18
- package/src/atoms/gv-metric.js +68 -19
- package/src/atoms/gv-relative-time.js +38 -67
- package/src/atoms/gv-select-native.js +215 -96
- package/src/atoms/gv-select.js +230 -110
- package/src/atoms/gv-spinner.js +26 -5
- package/src/atoms/gv-state.js +66 -25
- package/src/atoms/gv-switch.js +160 -40
- package/src/atoms/gv-tag.js +78 -26
- package/src/atoms/gv-text.js +83 -22
- package/src/charts/gv-chart-bar.js +18 -22
- package/src/charts/gv-chart-gauge.js +31 -28
- package/src/charts/gv-chart-histogram.js +10 -18
- package/src/charts/gv-chart-line.js +59 -70
- package/src/charts/gv-chart-map.js +42 -44
- package/src/charts/gv-chart-pie.js +14 -18
- package/src/index.js +0 -1
- package/src/lib/cron-expression.js +35 -40
- package/src/lib/date.js +1 -10
- package/src/lib/events.js +1 -3
- package/src/lib/http-client-schema-form.js +12 -13
- package/src/lib/http.js +56 -57
- package/src/lib/i18n.js +22 -30
- package/src/lib/item.js +12 -13
- package/src/lib/properties.js +42 -77
- package/src/lib/schema-form.js +5 -4
- package/src/lib/studio.js +60 -13
- package/src/lib/style.js +8 -8
- package/src/lib/text-format.js +7 -14
- package/src/lib/theme.js +5 -8
- package/src/lib/utils.js +18 -17
- package/src/mixins/chart-element.js +54 -31
- package/src/mixins/input-element.js +47 -60
- package/src/mixins/item-resource.js +32 -34
- package/src/mixins/keyboard-element.js +5 -6
- package/src/mixins/update-after-browser.js +1 -4
- package/src/mixins/with-resize-observer.js +13 -23
- package/src/mixins/with-skeleton-attribute.js +48 -54
- package/src/molecules/gv-card-full.js +147 -26
- package/src/molecules/gv-card-list.js +42 -13
- package/src/molecules/gv-card.js +91 -17
- package/src/molecules/gv-category-list.js +17 -6
- package/src/molecules/gv-category.js +103 -23
- package/src/molecules/gv-code.js +143 -81
- package/src/molecules/gv-confirm.js +71 -41
- package/src/molecules/gv-cron-editor.js +389 -143
- package/src/molecules/gv-dropdown-menu.js +46 -14
- package/src/molecules/gv-expandable.js +59 -31
- package/src/molecules/gv-expression-language.js +138 -176
- package/src/molecules/gv-identity-picture.js +65 -42
- package/src/molecules/gv-list.js +134 -42
- package/src/molecules/gv-metrics.js +49 -37
- package/src/molecules/gv-modal.js +95 -28
- package/src/molecules/gv-nav.js +75 -49
- package/src/molecules/gv-option.js +130 -57
- package/src/molecules/gv-plans.js +209 -86
- package/src/molecules/gv-popover.js +177 -57
- package/src/molecules/gv-promote.js +146 -28
- package/src/molecules/gv-rating-list.js +195 -69
- package/src/molecules/gv-rating.js +105 -52
- package/src/molecules/gv-row-expandable.js +11 -5
- package/src/molecules/gv-row.js +147 -21
- package/src/molecules/gv-stats.js +48 -23
- package/src/molecules/gv-stepper.js +187 -43
- package/src/molecules/gv-table.js +309 -199
- package/src/molecules/gv-tree.js +156 -33
- package/src/organisms/gv-documentation.js +128 -45
- package/src/organisms/gv-header.js +195 -37
- package/src/organisms/gv-http-client.js +168 -32
- package/src/organisms/gv-menu.js +158 -37
- package/src/organisms/gv-newsletter-subscription.js +189 -48
- package/src/organisms/gv-pagination.js +77 -49
- package/src/organisms/gv-properties.js +492 -271
- package/src/organisms/gv-resizable-views.js +259 -41
- package/src/organisms/gv-resources.js +275 -168
- package/src/organisms/gv-schema-form-array.js +159 -49
- package/src/organisms/gv-schema-form-control-object.js +73 -59
- package/src/organisms/gv-schema-form-control.js +134 -107
- package/src/organisms/gv-schema-form.js +324 -195
- package/src/organisms/gv-tabs.js +98 -66
- package/src/organisms/gv-user-menu.js +201 -36
- package/src/organisms/gv-vertical-menu.js +61 -20
- package/src/policy-studio/gv-flow-step.js +266 -105
- package/src/policy-studio/gv-flow.js +304 -125
- package/src/policy-studio/gv-policy-studio-menu.js +471 -157
- package/src/policy-studio/gv-policy-studio.js +777 -686
- package/src/styles/empty.js +20 -3
- package/src/styles/input.js +247 -3
- package/src/styles/link.js +16 -3
- package/src/styles/shapes.js +0 -1
- package/src/styles/skeleton.js +37 -3
- package/src/styles/zoom.js +24 -3
- package/src/theme/definition.json +1762 -0
- package/src/theme/gv-theme.js +60 -21
|
@@ -22,6 +22,7 @@ import { repeat } from 'lit/directives/repeat';
|
|
|
22
22
|
import { Validator } from 'jsonschema';
|
|
23
23
|
import { empty } from '../styles/empty';
|
|
24
24
|
import './gv-schema-form-control';
|
|
25
|
+
|
|
25
26
|
/**
|
|
26
27
|
* Schema form component
|
|
27
28
|
*
|
|
@@ -40,67 +41,26 @@ import './gv-schema-form-control';
|
|
|
40
41
|
* @cssprop {Color} [--gv-schema-form--bgc=#ffffff] - Background color
|
|
41
42
|
* @cssprop {Length} [--gv-schema-form-control--m=0.4rem] - Control margin
|
|
42
43
|
*/
|
|
43
|
-
|
|
44
44
|
export class GvSchemaForm extends LitElement {
|
|
45
45
|
static get properties() {
|
|
46
46
|
return {
|
|
47
|
-
schema: {
|
|
48
|
-
|
|
49
|
-
},
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
},
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
},
|
|
63
|
-
|
|
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
|
-
}
|
|
47
|
+
schema: { type: Object },
|
|
48
|
+
errors: { type: Object },
|
|
49
|
+
values: { type: Object },
|
|
50
|
+
submitLabel: { type: String },
|
|
51
|
+
hasFooter: { type: Boolean, attribute: 'has-footer' },
|
|
52
|
+
hasHeader: { type: Boolean, attribute: 'has-header' },
|
|
53
|
+
_confirm: { type: Object },
|
|
54
|
+
_values: { type: Object, attribute: false },
|
|
55
|
+
dirty: { type: Boolean, reflect: true },
|
|
56
|
+
hideDeprecated: { type: Boolean, attribute: 'hide-deprecated' },
|
|
57
|
+
validateOnRender: { type: Boolean, attribute: 'validate-on-render' },
|
|
58
|
+
_validatorResults: { type: Object },
|
|
59
|
+
skeleton: { type: Boolean, reflect: true },
|
|
60
|
+
_touch: { type: Boolean },
|
|
61
|
+
readonly: { type: Boolean, reflect: true },
|
|
62
|
+
scrollable: { type: Boolean, reflect: true },
|
|
63
|
+
groups: { type: Array },
|
|
104
64
|
};
|
|
105
65
|
}
|
|
106
66
|
|
|
@@ -117,6 +77,7 @@ export class GvSchemaForm extends LitElement {
|
|
|
117
77
|
this._ignoreProperties = [];
|
|
118
78
|
this._dynamicControls = [];
|
|
119
79
|
this._dynamicAttributes = ['disabled', 'required', 'hidden'];
|
|
80
|
+
this.groups = null;
|
|
120
81
|
this.addEventListener('gv-schema-form-control:default-value', this._onDefaultValue.bind(this));
|
|
121
82
|
this.addEventListener('gv-schema-form-control:change', this._onChange.bind(this));
|
|
122
83
|
this.addEventListener('gv-schema-form-control:control-ready', this._onControlReady.bind(this));
|
|
@@ -125,12 +86,10 @@ export class GvSchemaForm extends LitElement {
|
|
|
125
86
|
set values(values) {
|
|
126
87
|
if (!deepEqual(this._values, values)) {
|
|
127
88
|
if (values) {
|
|
128
|
-
this._initialValues = { ...values
|
|
129
|
-
};
|
|
89
|
+
this._initialValues = { ...values };
|
|
130
90
|
} else {
|
|
131
91
|
this._initialValues = {};
|
|
132
92
|
}
|
|
133
|
-
|
|
134
93
|
this._values = deepClone(this._initialValues);
|
|
135
94
|
}
|
|
136
95
|
}
|
|
@@ -142,10 +101,8 @@ export class GvSchemaForm extends LitElement {
|
|
|
142
101
|
reset(values = null) {
|
|
143
102
|
this._values = deepClone(values || this._initialValues);
|
|
144
103
|
this._touch = false;
|
|
145
|
-
|
|
146
104
|
this._setDirty(false);
|
|
147
|
-
|
|
148
|
-
this.getControls().forEach(s => {
|
|
105
|
+
this.getControls().forEach((s) => {
|
|
149
106
|
s.requestUpdate();
|
|
150
107
|
});
|
|
151
108
|
}
|
|
@@ -159,7 +116,6 @@ export class GvSchemaForm extends LitElement {
|
|
|
159
116
|
clearTimeout(this._validateTimeout);
|
|
160
117
|
this._validateTimeout = setTimeout(() => {
|
|
161
118
|
this.validate();
|
|
162
|
-
|
|
163
119
|
this._updateActions();
|
|
164
120
|
}, 350);
|
|
165
121
|
}
|
|
@@ -170,20 +126,13 @@ export class GvSchemaForm extends LitElement {
|
|
|
170
126
|
|
|
171
127
|
_onSubmit() {
|
|
172
128
|
const validatorResults = this.validate();
|
|
173
|
-
|
|
174
129
|
if (this.isValid()) {
|
|
175
130
|
this._initialValues = deepClone(this._values);
|
|
176
131
|
this.dirty = false;
|
|
177
132
|
this._touch = false;
|
|
178
|
-
dispatchCustomEvent(this, 'submit', {
|
|
179
|
-
values: this._values,
|
|
180
|
-
validatorResults
|
|
181
|
-
});
|
|
133
|
+
dispatchCustomEvent(this, 'submit', { values: this._values, validatorResults });
|
|
182
134
|
} else {
|
|
183
|
-
dispatchCustomEvent(this, 'error', {
|
|
184
|
-
values: this._values,
|
|
185
|
-
validatorResults
|
|
186
|
-
});
|
|
135
|
+
dispatchCustomEvent(this, 'error', { values: this._values, validatorResults });
|
|
187
136
|
}
|
|
188
137
|
}
|
|
189
138
|
|
|
@@ -200,26 +149,17 @@ export class GvSchemaForm extends LitElement {
|
|
|
200
149
|
if (this._confirm && this._confirm.promise) {
|
|
201
150
|
return this._confirm.promise;
|
|
202
151
|
}
|
|
203
|
-
|
|
204
|
-
const promise = new Promise((resolve, reject) => this._confirm = {
|
|
205
|
-
resolve,
|
|
206
|
-
reject
|
|
207
|
-
});
|
|
152
|
+
const promise = new Promise((resolve, reject) => (this._confirm = { resolve, reject }));
|
|
208
153
|
this._confirm.promise = promise;
|
|
209
154
|
return promise;
|
|
210
155
|
}
|
|
211
|
-
|
|
212
156
|
return Promise.resolve();
|
|
213
157
|
}
|
|
214
158
|
|
|
215
159
|
_onConfirmReset() {
|
|
216
|
-
const {
|
|
217
|
-
resolve
|
|
218
|
-
} = this._confirm;
|
|
160
|
+
const { resolve } = this._confirm;
|
|
219
161
|
this._confirm = null;
|
|
220
|
-
|
|
221
162
|
this._onReset();
|
|
222
|
-
|
|
223
163
|
this.requestUpdate();
|
|
224
164
|
this.updateComplete.then(() => {
|
|
225
165
|
resolve(this);
|
|
@@ -228,9 +168,7 @@ export class GvSchemaForm extends LitElement {
|
|
|
228
168
|
|
|
229
169
|
_onConfirmEdit() {
|
|
230
170
|
this._confirm.reject(this);
|
|
231
|
-
|
|
232
171
|
this._confirm = null;
|
|
233
|
-
|
|
234
172
|
this._updateChildren(this.validateOnRender);
|
|
235
173
|
}
|
|
236
174
|
|
|
@@ -245,43 +183,24 @@ export class GvSchemaForm extends LitElement {
|
|
|
245
183
|
_dispatchChange() {
|
|
246
184
|
clearTimeout(this._changeTimeout);
|
|
247
185
|
this._changeTimeout = setTimeout(() => {
|
|
248
|
-
dispatchCustomEvent(this, 'change', {
|
|
249
|
-
target: this,
|
|
250
|
-
values: this._values,
|
|
251
|
-
validation: this._validatorResults
|
|
252
|
-
});
|
|
186
|
+
dispatchCustomEvent(this, 'change', { target: this, values: this._values, validation: this._validatorResults });
|
|
253
187
|
}, 50);
|
|
254
188
|
}
|
|
255
189
|
|
|
256
|
-
_onDefaultValue({
|
|
257
|
-
|
|
258
|
-
currentTarget,
|
|
259
|
-
value,
|
|
260
|
-
control
|
|
261
|
-
}
|
|
262
|
-
}) {
|
|
263
|
-
if (control.type === 'integer' && value != null && (value.trim && value.length > 0 || value.length > 0)) {
|
|
190
|
+
_onDefaultValue({ detail: { currentTarget, value, control } }) {
|
|
191
|
+
if (control.type === 'integer' && value != null && ((value.trim && value.length > 0) || value.length > 0)) {
|
|
264
192
|
value = parseInt(value, 10);
|
|
265
193
|
}
|
|
266
|
-
|
|
267
194
|
set(this._values, currentTarget.id, value);
|
|
268
195
|
}
|
|
269
196
|
|
|
270
|
-
_onChange({
|
|
271
|
-
detail: {
|
|
272
|
-
currentTarget,
|
|
273
|
-
value,
|
|
274
|
-
control
|
|
275
|
-
}
|
|
276
|
-
}) {
|
|
197
|
+
_onChange({ detail: { currentTarget, value, control } }) {
|
|
277
198
|
this._setTouch(true);
|
|
278
|
-
|
|
279
199
|
if (control.type === 'integer') {
|
|
280
200
|
if (typeof value === 'string' && value.trim().length === 0) {
|
|
281
201
|
value = null;
|
|
282
202
|
} else {
|
|
283
203
|
const intValue = Number(value).valueOf();
|
|
284
|
-
|
|
285
204
|
if (!isNaN(intValue)) {
|
|
286
205
|
value = intValue;
|
|
287
206
|
} else {
|
|
@@ -297,7 +216,6 @@ export class GvSchemaForm extends LitElement {
|
|
|
297
216
|
value = null;
|
|
298
217
|
}
|
|
299
218
|
}
|
|
300
|
-
|
|
301
219
|
if (value == null) {
|
|
302
220
|
del(this._values, currentTarget.id);
|
|
303
221
|
} else {
|
|
@@ -305,12 +223,9 @@ export class GvSchemaForm extends LitElement {
|
|
|
305
223
|
}
|
|
306
224
|
|
|
307
225
|
this._updateDynamicControls();
|
|
308
|
-
|
|
309
226
|
this._validatorResults = this.validate();
|
|
310
227
|
this.dirty = true;
|
|
311
|
-
|
|
312
228
|
this._updateActions();
|
|
313
|
-
|
|
314
229
|
this._dispatchChange();
|
|
315
230
|
}
|
|
316
231
|
|
|
@@ -319,16 +234,12 @@ export class GvSchemaForm extends LitElement {
|
|
|
319
234
|
e.preventDefault();
|
|
320
235
|
const controlElement = e.detail.control;
|
|
321
236
|
const control = controlElement.control;
|
|
322
|
-
|
|
323
237
|
if (control['x-schema-form']) {
|
|
324
238
|
if (control['x-schema-form'].event) {
|
|
325
239
|
const event = control['x-schema-form'].event;
|
|
326
|
-
dispatchCustomEvent(this, event.name, { ...event,
|
|
327
|
-
...e.detail
|
|
328
|
-
});
|
|
240
|
+
dispatchCustomEvent(this, event.name, { ...event, ...e.detail });
|
|
329
241
|
} else if (this._hasCondition(control)) {
|
|
330
242
|
this._dynamicControls.push(controlElement);
|
|
331
|
-
|
|
332
243
|
this._updateDynamicControl(controlElement);
|
|
333
244
|
}
|
|
334
245
|
}
|
|
@@ -336,22 +247,18 @@ export class GvSchemaForm extends LitElement {
|
|
|
336
247
|
|
|
337
248
|
_updateDynamicControls() {
|
|
338
249
|
this._ignoreProperties = [];
|
|
339
|
-
|
|
340
|
-
this._dynamicControls.forEach(controlElement => {
|
|
250
|
+
this._dynamicControls.forEach((controlElement) => {
|
|
341
251
|
this._updateDynamicControl(controlElement);
|
|
342
252
|
});
|
|
343
253
|
}
|
|
344
254
|
|
|
345
255
|
_updateDynamicControl(controlElement) {
|
|
346
256
|
const control = controlElement.control;
|
|
347
|
-
|
|
348
257
|
if (control['x-schema-form']) {
|
|
349
|
-
this._dynamicAttributes.forEach(attribute => {
|
|
258
|
+
this._dynamicAttributes.forEach((attribute) => {
|
|
350
259
|
const is = this._evaluateCondition(control, attribute);
|
|
351
|
-
|
|
352
260
|
if (is) {
|
|
353
261
|
controlElement.setAttribute(attribute, '');
|
|
354
|
-
|
|
355
262
|
if (attribute === 'hidden') {
|
|
356
263
|
this._ignoreProperties.push(controlElement.id);
|
|
357
264
|
}
|
|
@@ -360,13 +267,12 @@ export class GvSchemaForm extends LitElement {
|
|
|
360
267
|
}
|
|
361
268
|
});
|
|
362
269
|
}
|
|
363
|
-
|
|
364
270
|
return null;
|
|
365
271
|
}
|
|
366
272
|
|
|
367
273
|
async performUpdate() {
|
|
368
|
-
await Promise.all(this.getControls().map(e => e.updateComplete));
|
|
369
|
-
this.getControls().forEach(s => {
|
|
274
|
+
await Promise.all(this.getControls().map((e) => e.updateComplete));
|
|
275
|
+
this.getControls().forEach((s) => {
|
|
370
276
|
s.requestUpdate();
|
|
371
277
|
});
|
|
372
278
|
super.performUpdate();
|
|
@@ -374,30 +280,34 @@ export class GvSchemaForm extends LitElement {
|
|
|
374
280
|
|
|
375
281
|
_renderControl(key) {
|
|
376
282
|
// This is require to clean cache of <gv-schema-form-control>
|
|
377
|
-
const control = { ...this.schema.properties[key]
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
const isRequired = this.schema.required && this.schema.required.includes(key) || this._evaluateCondition(control, 'required');
|
|
381
|
-
|
|
382
|
-
const isDisabled = this.schema.disabled && this.schema.disabled.includes(key) || this._evaluateCondition(control, 'disabled');
|
|
383
|
-
|
|
283
|
+
const control = { ...this.schema.properties[key] };
|
|
284
|
+
const isRequired = (this.schema.required && this.schema.required.includes(key)) || this._evaluateCondition(control, 'required');
|
|
285
|
+
const isDisabled = (this.schema.disabled && this.schema.disabled.includes(key)) || this._evaluateCondition(control, 'disabled');
|
|
384
286
|
const isHidden = this._evaluateCondition(control, 'hidden');
|
|
385
|
-
|
|
386
287
|
if (isHidden) {
|
|
387
288
|
this._ignoreProperties.push(key);
|
|
388
289
|
}
|
|
389
|
-
|
|
390
290
|
const isReadonly = this.readonly || control.readOnly === true;
|
|
391
291
|
const isWriteOnly = control.writeOnly === true;
|
|
392
292
|
const value = get(this._values, key);
|
|
393
|
-
return html`<gv-schema-form-control
|
|
293
|
+
return html`<gv-schema-form-control
|
|
294
|
+
.id="${key}"
|
|
295
|
+
.errors="${this.errors}"
|
|
296
|
+
.control="${control}"
|
|
297
|
+
.skeleton="${this.skeleton}"
|
|
298
|
+
.value="${value}"
|
|
299
|
+
?readonly="${isReadonly}"
|
|
300
|
+
?writeonly="${isWriteOnly}"
|
|
301
|
+
?required="${isRequired}"
|
|
302
|
+
?disabled="${isDisabled}"
|
|
303
|
+
?hidden="${isHidden}"
|
|
304
|
+
></gv-schema-form-control>`;
|
|
394
305
|
}
|
|
395
306
|
|
|
396
307
|
_hasCondition(control) {
|
|
397
308
|
if (control['x-schema-form']) {
|
|
398
|
-
return this._dynamicAttributes.find(condition => control['x-schema-form'][condition] != null) != null;
|
|
309
|
+
return this._dynamicAttributes.find((condition) => control['x-schema-form'][condition] != null) != null;
|
|
399
310
|
}
|
|
400
|
-
|
|
401
311
|
return false;
|
|
402
312
|
}
|
|
403
313
|
|
|
@@ -405,13 +315,10 @@ export class GvSchemaForm extends LitElement {
|
|
|
405
315
|
if (control['x-schema-form'] == null || control['x-schema-form'][conditionKey] == null) {
|
|
406
316
|
return false;
|
|
407
317
|
}
|
|
408
|
-
|
|
409
318
|
const condition = control['x-schema-form'][conditionKey];
|
|
410
|
-
|
|
411
319
|
if (typeof condition === 'boolean') {
|
|
412
320
|
return condition;
|
|
413
321
|
}
|
|
414
|
-
|
|
415
322
|
if (!Array.isArray(condition)) {
|
|
416
323
|
// condition isn't an array, ignore the condition
|
|
417
324
|
console.warn(`'${conditionKey}' attribute of 'x-schema-form' should be an array`);
|
|
@@ -419,7 +326,6 @@ export class GvSchemaForm extends LitElement {
|
|
|
419
326
|
}
|
|
420
327
|
|
|
421
328
|
let result = true;
|
|
422
|
-
|
|
423
329
|
for (const operation of condition) {
|
|
424
330
|
// operation only have one operator with a single object containing operand values
|
|
425
331
|
const operator = Object.keys(operation)[0];
|
|
@@ -428,19 +334,15 @@ export class GvSchemaForm extends LitElement {
|
|
|
428
334
|
case '$neq':
|
|
429
335
|
result = result && this._evaluateNotEqualsCondition(control, operation);
|
|
430
336
|
break;
|
|
431
|
-
|
|
432
337
|
case '$eq':
|
|
433
338
|
result = result && this._evaluateEqualsCondition(control, operation);
|
|
434
339
|
break;
|
|
435
|
-
|
|
436
340
|
case '$nodef':
|
|
437
341
|
result = result && this._evaluateNotDefCondition(control, operation);
|
|
438
342
|
break;
|
|
439
|
-
|
|
440
343
|
case '$def':
|
|
441
344
|
result = result && this._evaluateDefCondition(control, operation);
|
|
442
345
|
break;
|
|
443
|
-
|
|
444
346
|
default:
|
|
445
347
|
console.warn(`Unsupported operator '${operator}' on disable condition`);
|
|
446
348
|
result = false;
|
|
@@ -459,20 +361,19 @@ export class GvSchemaForm extends LitElement {
|
|
|
459
361
|
const operator = Object.keys(condition)[0];
|
|
460
362
|
const operands = condition[operator];
|
|
461
363
|
const modelAttributes = Object.keys(operands);
|
|
462
|
-
return modelAttributes
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
}).reduce((acc, current) => acc || current);
|
|
364
|
+
return modelAttributes
|
|
365
|
+
.map((modelAttribute) => {
|
|
366
|
+
const testValue = operands[modelAttribute];
|
|
367
|
+
let value = get(this._values, modelAttribute);
|
|
368
|
+
if (value == null && control.type === 'string') {
|
|
369
|
+
value = '';
|
|
370
|
+
}
|
|
371
|
+
if (Array.isArray(testValue)) {
|
|
372
|
+
return testValue.includes(value);
|
|
373
|
+
}
|
|
374
|
+
return value === testValue;
|
|
375
|
+
})
|
|
376
|
+
.reduce((acc, current) => acc || current);
|
|
476
377
|
}
|
|
477
378
|
|
|
478
379
|
_evaluateNotDefCondition(control, condition) {
|
|
@@ -487,12 +388,50 @@ export class GvSchemaForm extends LitElement {
|
|
|
487
388
|
|
|
488
389
|
_renderPart() {
|
|
489
390
|
if (this._confirm) {
|
|
490
|
-
return html`<div class="confirm-box">
|
|
391
|
+
return html`<div class="confirm-box">
|
|
392
|
+
<div class="error">The configuration is not valid and cannot be saved.</div>
|
|
393
|
+
<div class="confirm-box_actions">
|
|
394
|
+
<gv-button @gv-button:click="${this._onConfirmReset}" outlined icon="general:update" danger>Lose changes</gv-button>
|
|
395
|
+
<gv-button @gv-button:click="${this._onConfirmEdit}" icon="design:edit">Edit</gv-button>
|
|
396
|
+
</div>
|
|
397
|
+
</div>`;
|
|
491
398
|
}
|
|
492
|
-
|
|
493
399
|
const keys = this.schema.properties ? Object.keys(this.schema.properties) : [];
|
|
494
400
|
this._ignoreProperties = [];
|
|
495
|
-
|
|
401
|
+
|
|
402
|
+
if (this.groups) {
|
|
403
|
+
// Remove undefined group items
|
|
404
|
+
const groupsCleaned = this.groups.reduce((prev, group) => {
|
|
405
|
+
const itemsExistingInSchemaKeys = keys.filter((key) => [...(group.items || [])].includes(key));
|
|
406
|
+
prev.push({
|
|
407
|
+
...group,
|
|
408
|
+
items: itemsExistingInSchemaKeys || [],
|
|
409
|
+
});
|
|
410
|
+
return prev;
|
|
411
|
+
}, []);
|
|
412
|
+
|
|
413
|
+
// Add non grouped items inside default group
|
|
414
|
+
const defaultGroup = groupsCleaned.find((g) => g.default) || { default: true, items: [] };
|
|
415
|
+
const zipGroupedItems = groupsCleaned.reduce((prev, group) => [...prev, ...group.items], []);
|
|
416
|
+
defaultGroup.items = keys.filter((key) => !zipGroupedItems.includes(key));
|
|
417
|
+
|
|
418
|
+
return repeat(
|
|
419
|
+
groupsCleaned,
|
|
420
|
+
(group) =>
|
|
421
|
+
html`${group.name
|
|
422
|
+
? html`<h2 class="group-title">${group.name}</h2>
|
|
423
|
+
${repeat(group.items, (key) => this._renderControl(key))}`
|
|
424
|
+
: repeat(group.items, (key) => this._renderControl(key))} `,
|
|
425
|
+
);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
return html`${repeat([1], () =>
|
|
429
|
+
repeat(
|
|
430
|
+
keys,
|
|
431
|
+
(key) => key,
|
|
432
|
+
(key) => this._renderControl(key),
|
|
433
|
+
),
|
|
434
|
+
)}`;
|
|
496
435
|
}
|
|
497
436
|
|
|
498
437
|
getControls() {
|
|
@@ -504,20 +443,17 @@ export class GvSchemaForm extends LitElement {
|
|
|
504
443
|
}
|
|
505
444
|
|
|
506
445
|
_getErrors() {
|
|
507
|
-
return (this._validatorResults.errors || []).filter(error => {
|
|
446
|
+
return (this._validatorResults.errors || []).filter((error) => {
|
|
508
447
|
let id = `${error.property.replace('instance.', '')}`;
|
|
509
|
-
|
|
510
448
|
if (!Array.isArray(error.argument)) {
|
|
511
449
|
id = `${id}.${error.argument}`;
|
|
512
450
|
}
|
|
513
451
|
|
|
514
452
|
const errorKey = `x-schema-form.errors.${id}.${error.name}`;
|
|
515
453
|
const errorMessage = get(this.schema, errorKey);
|
|
516
|
-
|
|
517
454
|
if (errorMessage) {
|
|
518
455
|
error.message = errorMessage;
|
|
519
456
|
}
|
|
520
|
-
|
|
521
457
|
return !this._ignoreProperties.includes(id);
|
|
522
458
|
});
|
|
523
459
|
}
|
|
@@ -525,12 +461,9 @@ export class GvSchemaForm extends LitElement {
|
|
|
525
461
|
validate() {
|
|
526
462
|
if (this.schema) {
|
|
527
463
|
// Additional properties should not block the validation of the form
|
|
528
|
-
this._validatorResults = this._validator.validate(this._values, { ...this.schema,
|
|
529
|
-
additionalProperties: true
|
|
530
|
-
});
|
|
464
|
+
this._validatorResults = this._validator.validate(this._values, { ...this.schema, additionalProperties: true });
|
|
531
465
|
this.errors = this._getErrors();
|
|
532
466
|
}
|
|
533
|
-
|
|
534
467
|
return this._validatorResults;
|
|
535
468
|
}
|
|
536
469
|
|
|
@@ -538,12 +471,11 @@ export class GvSchemaForm extends LitElement {
|
|
|
538
471
|
if (this._validatorResults.valid) {
|
|
539
472
|
return true;
|
|
540
473
|
}
|
|
541
|
-
|
|
542
474
|
return this._getErrors() === 0;
|
|
543
475
|
}
|
|
544
476
|
|
|
545
477
|
isTouch() {
|
|
546
|
-
return this._touch || this.dirty && this.validateOnRender;
|
|
478
|
+
return this._touch || (this.dirty && this.validateOnRender);
|
|
547
479
|
}
|
|
548
480
|
|
|
549
481
|
canSubmit() {
|
|
@@ -552,7 +484,6 @@ export class GvSchemaForm extends LitElement {
|
|
|
552
484
|
|
|
553
485
|
_updateActions() {
|
|
554
486
|
const submitBtn = this._getSubmitBtn();
|
|
555
|
-
|
|
556
487
|
if (submitBtn != null) {
|
|
557
488
|
if (this.canSubmit()) {
|
|
558
489
|
this._getSubmitBtn().removeAttribute('disabled');
|
|
@@ -560,9 +491,7 @@ export class GvSchemaForm extends LitElement {
|
|
|
560
491
|
this._getSubmitBtn().setAttribute('disabled', true);
|
|
561
492
|
}
|
|
562
493
|
}
|
|
563
|
-
|
|
564
494
|
const resetBtn = this._getResetBtn();
|
|
565
|
-
|
|
566
495
|
if (resetBtn != null) {
|
|
567
496
|
if (this.dirty) {
|
|
568
497
|
resetBtn.removeAttribute('disabled');
|
|
@@ -584,39 +513,239 @@ export class GvSchemaForm extends LitElement {
|
|
|
584
513
|
|
|
585
514
|
async updated(changedProperties) {
|
|
586
515
|
clearTimeout(this._updateActionsTimeout);
|
|
587
|
-
|
|
588
516
|
if (changedProperties.has('_values')) {
|
|
589
|
-
this.getControls().forEach(control => {
|
|
517
|
+
this.getControls().forEach((control) => {
|
|
590
518
|
control.value = get(this._values, control.id);
|
|
591
519
|
});
|
|
592
520
|
}
|
|
593
|
-
|
|
594
521
|
this._updateChildren(this.validateOnRender && (changedProperties.has('_values') || changedProperties.has('schema')));
|
|
595
522
|
}
|
|
596
523
|
|
|
597
524
|
async getUpdateComplete() {
|
|
598
525
|
const result = await super.getUpdateComplete();
|
|
599
|
-
await Promise.all(this.getControls().map(e => e.updateComplete));
|
|
526
|
+
await Promise.all(this.getControls().map((e) => e.updateComplete));
|
|
600
527
|
return result;
|
|
601
528
|
}
|
|
602
529
|
|
|
603
530
|
render() {
|
|
604
|
-
return html`<form class="${classMap({
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
531
|
+
return html`<form class="${classMap({ scrollable: this.scrollable })}">
|
|
532
|
+
<div class="${classMap({ container: true, confirm: this._confirm })}">
|
|
533
|
+
${this.hasHeader === true
|
|
534
|
+
? html`
|
|
535
|
+
<div class="header">
|
|
536
|
+
<div class="${classMap({ title: true, center: this.hasHeader && !this.hasFooter })}">
|
|
537
|
+
<slot name="title"></slot>
|
|
538
|
+
</div>
|
|
539
|
+
<div class="left">
|
|
540
|
+
<slot name="header-left"></slot>
|
|
541
|
+
</div>
|
|
542
|
+
${this.readonly === true || this.hasFooter === true
|
|
543
|
+
? ''
|
|
544
|
+
: html`<div class="right">
|
|
545
|
+
<gv-button
|
|
546
|
+
id="reset"
|
|
547
|
+
outlined
|
|
548
|
+
small
|
|
549
|
+
@gv-button:click="${this._onReset}"
|
|
550
|
+
icon="general:update"
|
|
551
|
+
title="Reset"
|
|
552
|
+
></gv-button>
|
|
553
|
+
<gv-button
|
|
554
|
+
id="submit"
|
|
555
|
+
small
|
|
556
|
+
@gv-button:click="${this._onSubmit}"
|
|
557
|
+
icon="code:check"
|
|
558
|
+
.title="${this.submitLabel}"
|
|
559
|
+
></gv-button>
|
|
560
|
+
</div> `}
|
|
561
|
+
</div>
|
|
562
|
+
`
|
|
563
|
+
: ''}
|
|
564
|
+
<div class="content">${this.schema != null ? this._renderPart() : html``}</div>
|
|
565
|
+
${this.hasFooter === true && this.readonly !== true
|
|
566
|
+
? html`
|
|
567
|
+
<div class="footer">
|
|
568
|
+
<div class="left"></div>
|
|
569
|
+
<div class="right">
|
|
570
|
+
<gv-button id="reset" outlined @gv-button:click="${this._onReset}" icon="general:update" title="Reset">Reset</gv-button>
|
|
571
|
+
<gv-button id="submit" @gv-button:click="${this._onSubmit}" icon="code:check" .title="${this.submitLabel}"
|
|
572
|
+
>${this.submitLabel}</gv-button
|
|
573
|
+
>
|
|
574
|
+
</div>
|
|
575
|
+
</div>
|
|
576
|
+
`
|
|
577
|
+
: ''}
|
|
578
|
+
</div>
|
|
579
|
+
</form>`;
|
|
613
580
|
}
|
|
614
581
|
|
|
615
582
|
static get styles() {
|
|
616
|
-
return [
|
|
617
|
-
|
|
618
|
-
|
|
583
|
+
return [
|
|
584
|
+
empty,
|
|
585
|
+
// language=CSS
|
|
586
|
+
css`
|
|
587
|
+
:host {
|
|
588
|
+
box-sizing: border-box;
|
|
589
|
+
margin: 0.2rem;
|
|
590
|
+
--bgc: var(--gv-schema-form--bgc, #ffffff);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
form {
|
|
594
|
+
display: flex;
|
|
595
|
+
flex-direction: column;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
form.scrollable {
|
|
599
|
+
position: absolute;
|
|
600
|
+
width: 100%;
|
|
601
|
+
top: 0;
|
|
602
|
+
bottom: 0;
|
|
603
|
+
left: 0;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
.container {
|
|
607
|
+
flex-grow: 1;
|
|
608
|
+
|
|
609
|
+
background-color: var(--bgc);
|
|
610
|
+
display: flex;
|
|
611
|
+
flex-direction: column;
|
|
612
|
+
|
|
613
|
+
/* for Firefox */
|
|
614
|
+
min-height: 0;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
.header,
|
|
618
|
+
.footer,
|
|
619
|
+
.content {
|
|
620
|
+
background-color: var(--bgc);
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
.content {
|
|
624
|
+
flex-grow: 1;
|
|
625
|
+
display: flex;
|
|
626
|
+
flex-direction: column;
|
|
627
|
+
align-self: center;
|
|
628
|
+
width: 100%;
|
|
629
|
+
|
|
630
|
+
/* for Firefox */
|
|
631
|
+
min-height: 0;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
.content > gv-schema-form-control {
|
|
635
|
+
align-self: center;
|
|
636
|
+
width: 100%;
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
form.scrollable .content {
|
|
640
|
+
overflow: auto;
|
|
641
|
+
}
|
|
619
642
|
|
|
643
|
+
form.scrollable .content > gv-schema-form-control,
|
|
644
|
+
form.scrollable .content > .group-title {
|
|
645
|
+
max-width: 775px;
|
|
646
|
+
width: 95%;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
.header,
|
|
650
|
+
.footer {
|
|
651
|
+
display: flex;
|
|
652
|
+
box-sizing: border-box;
|
|
653
|
+
min-height: 45px;
|
|
654
|
+
--gv-icon--s: 26px;
|
|
655
|
+
--gv-icon--c: #bfbfbf;
|
|
656
|
+
align-items: center;
|
|
657
|
+
padding: 0 0.5rem;
|
|
658
|
+
position: relative;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
.header {
|
|
662
|
+
border-bottom: 1px solid #d9d9d9;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
.footer {
|
|
666
|
+
display: flex;
|
|
667
|
+
justify-content: space-between;
|
|
668
|
+
padding: 1rem;
|
|
669
|
+
border-top: 1px solid #d9d9d9;
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
form.scrollable .footer {
|
|
673
|
+
justify-content: center;
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
.footer .left,
|
|
677
|
+
.footer .right {
|
|
678
|
+
max-width: 400px;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
.header .left,
|
|
682
|
+
.footer .left,
|
|
683
|
+
.header .right,
|
|
684
|
+
.footer .right {
|
|
685
|
+
display: flex;
|
|
686
|
+
flex: 1;
|
|
687
|
+
z-index: 10;
|
|
688
|
+
align-items: center;
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
.header .right,
|
|
692
|
+
.footer .right {
|
|
693
|
+
justify-content: flex-end;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
.header .title {
|
|
697
|
+
color: #28444f;
|
|
698
|
+
font-size: 18px;
|
|
699
|
+
display: flex;
|
|
700
|
+
width: 100%;
|
|
701
|
+
align-items: center;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
.header .title.center {
|
|
705
|
+
position: absolute;
|
|
706
|
+
top: 0;
|
|
707
|
+
left: 0;
|
|
708
|
+
bottom: 0;
|
|
709
|
+
justify-content: center;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
.confirm-box {
|
|
713
|
+
height: 100%;
|
|
714
|
+
padding: 1rem;
|
|
715
|
+
font-style: italic;
|
|
716
|
+
display: flex;
|
|
717
|
+
flex-direction: column;
|
|
718
|
+
|
|
719
|
+
justify-content: center;
|
|
720
|
+
align-items: center;
|
|
721
|
+
text-align: center;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
.confirm-box_actions {
|
|
725
|
+
padding: 1rem 0;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
.confirm .header .left,
|
|
729
|
+
.confirm .header .right,
|
|
730
|
+
.confirm .footer .left,
|
|
731
|
+
.confirm .footer .right {
|
|
732
|
+
display: none;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
.group-title {
|
|
736
|
+
align-self: center;
|
|
737
|
+
width: 100%;
|
|
738
|
+
color: var(--gv-theme-font-color-dark);
|
|
739
|
+
font-size: 21px;
|
|
740
|
+
font-weight: 600;
|
|
741
|
+
padding-bottom: 0.3em;
|
|
742
|
+
border-bottom: 1px solid var(--gv-theme-font-color-dark);
|
|
743
|
+
margin-top: 24px;
|
|
744
|
+
margin-bottom: 16px;
|
|
745
|
+
}
|
|
746
|
+
`,
|
|
747
|
+
];
|
|
748
|
+
}
|
|
620
749
|
}
|
|
750
|
+
|
|
621
751
|
window.customElements.define('gv-schema-form', GvSchemaForm);
|
|
622
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL29yZ2FuaXNtcy9ndi1zY2hlbWEtZm9ybS5qcyJdLCJuYW1lcyI6WyJMaXRFbGVtZW50IiwiaHRtbCIsImNzcyIsImdldCIsInNldCIsImRlbCIsImRpc3BhdGNoQ3VzdG9tRXZlbnQiLCJkZWVwQ2xvbmUiLCJkZWVwRXF1YWwiLCJjbGFzc01hcCIsInJlcGVhdCIsIlZhbGlkYXRvciIsImVtcHR5IiwiR3ZTY2hlbWFGb3JtIiwicHJvcGVydGllcyIsInNjaGVtYSIsInR5cGUiLCJPYmplY3QiLCJlcnJvcnMiLCJ2YWx1ZXMiLCJzdWJtaXRMYWJlbCIsIlN0cmluZyIsImhhc0Zvb3RlciIsIkJvb2xlYW4iLCJhdHRyaWJ1dGUiLCJoYXNIZWFkZXIiLCJfY29uZmlybSIsIl92YWx1ZXMiLCJkaXJ0eSIsInJlZmxlY3QiLCJoaWRlRGVwcmVjYXRlZCIsInZhbGlkYXRlT25SZW5kZXIiLCJfdmFsaWRhdG9yUmVzdWx0cyIsInNrZWxldG9uIiwiX3RvdWNoIiwicmVhZG9ubHkiLCJzY3JvbGxhYmxlIiwiY29uc3RydWN0b3IiLCJfdmFsaWRhdG9yIiwiX2lnbm9yZVByb3BlcnRpZXMiLCJfZHluYW1pY0NvbnRyb2xzIiwiX2R5bmFtaWNBdHRyaWJ1dGVzIiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9vbkRlZmF1bHRWYWx1ZSIsImJpbmQiLCJfb25DaGFuZ2UiLCJfb25Db250cm9sUmVhZHkiLCJfaW5pdGlhbFZhbHVlcyIsInJlc2V0IiwiX3NldERpcnR5IiwiZ2V0Q29udHJvbHMiLCJmb3JFYWNoIiwicyIsInJlcXVlc3RVcGRhdGUiLCJfb25SZXNldCIsInJlcXVlc3RWYWxpZGF0aW9uIiwiY2xlYXJUaW1lb3V0IiwiX3ZhbGlkYXRlVGltZW91dCIsInNldFRpbWVvdXQiLCJ2YWxpZGF0ZSIsIl91cGRhdGVBY3Rpb25zIiwic3VibWl0IiwiX29uU3VibWl0IiwidmFsaWRhdG9yUmVzdWx0cyIsImlzVmFsaWQiLCJfc2V0VG91Y2giLCJ0b3VjaCIsImNvbmZpcm0iLCJpc1RvdWNoIiwicHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiX29uQ29uZmlybVJlc2V0IiwidXBkYXRlQ29tcGxldGUiLCJ0aGVuIiwiX29uQ29uZmlybUVkaXQiLCJfdXBkYXRlQ2hpbGRyZW4iLCJfZ2V0U3VibWl0QnRuIiwic2hhZG93Um9vdCIsInF1ZXJ5U2VsZWN0b3IiLCJfZ2V0UmVzZXRCdG4iLCJfZGlzcGF0Y2hDaGFuZ2UiLCJfY2hhbmdlVGltZW91dCIsInRhcmdldCIsInZhbGlkYXRpb24iLCJkZXRhaWwiLCJjdXJyZW50VGFyZ2V0IiwidmFsdWUiLCJjb250cm9sIiwidHJpbSIsImxlbmd0aCIsInBhcnNlSW50IiwiaWQiLCJpbnRWYWx1ZSIsIk51bWJlciIsInZhbHVlT2YiLCJpc05hTiIsImVudW0iLCJrZXlzIiwiX3VwZGF0ZUR5bmFtaWNDb250cm9scyIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsImNvbnRyb2xFbGVtZW50IiwiZXZlbnQiLCJuYW1lIiwiX2hhc0NvbmRpdGlvbiIsInB1c2giLCJfdXBkYXRlRHluYW1pY0NvbnRyb2wiLCJpcyIsIl9ldmFsdWF0ZUNvbmRpdGlvbiIsInNldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsInBlcmZvcm1VcGRhdGUiLCJhbGwiLCJtYXAiLCJfcmVuZGVyQ29udHJvbCIsImtleSIsImlzUmVxdWlyZWQiLCJyZXF1aXJlZCIsImluY2x1ZGVzIiwiaXNEaXNhYmxlZCIsImRpc2FibGVkIiwiaXNIaWRkZW4iLCJpc1JlYWRvbmx5IiwicmVhZE9ubHkiLCJpc1dyaXRlT25seSIsIndyaXRlT25seSIsImZpbmQiLCJjb25kaXRpb24iLCJjb25kaXRpb25LZXkiLCJBcnJheSIsImlzQXJyYXkiLCJjb25zb2xlIiwid2FybiIsInJlc3VsdCIsIm9wZXJhdGlvbiIsIm9wZXJhdG9yIiwiX2V2YWx1YXRlTm90RXF1YWxzQ29uZGl0aW9uIiwiX2V2YWx1YXRlRXF1YWxzQ29uZGl0aW9uIiwiX2V2YWx1YXRlTm90RGVmQ29uZGl0aW9uIiwiX2V2YWx1YXRlRGVmQ29uZGl0aW9uIiwib3BlcmFuZHMiLCJtb2RlbEF0dHJpYnV0ZXMiLCJtb2RlbEF0dHJpYnV0ZSIsInRlc3RWYWx1ZSIsInJlZHVjZSIsImFjYyIsImN1cnJlbnQiLCJ1bmRlZmluZWQiLCJfcmVuZGVyUGFydCIsImZyb20iLCJxdWVyeVNlbGVjdG9yQWxsIiwiZ2V0Q29udHJvbCIsIl9nZXRFcnJvcnMiLCJmaWx0ZXIiLCJlcnJvciIsInByb3BlcnR5IiwicmVwbGFjZSIsImFyZ3VtZW50IiwiZXJyb3JLZXkiLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJ2YWxpZCIsImNhblN1Ym1pdCIsInN1Ym1pdEJ0biIsInJlc2V0QnRuIiwid2l0aFZhbGlkYXRpb24iLCJfdXBkYXRlQWN0aW9uc1RpbWVvdXQiLCJ1cGRhdGVkIiwiY2hhbmdlZFByb3BlcnRpZXMiLCJoYXMiLCJnZXRVcGRhdGVDb21wbGV0ZSIsInJlbmRlciIsImNvbnRhaW5lciIsInRpdGxlIiwiY2VudGVyIiwic3R5bGVzIiwid2luZG93IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFVBQVQsRUFBcUJDLElBQXJCLEVBQTJCQyxHQUEzQixRQUFzQyxLQUF0QztBQUNBLFNBQVNDLEdBQVQsRUFBY0MsR0FBZCxFQUFtQkMsR0FBbkIsUUFBOEIsYUFBOUI7QUFDQSxTQUFTQyxtQkFBVCxRQUFvQyxlQUFwQztBQUNBLFNBQVNDLFNBQVQsRUFBb0JDLFNBQXBCLFFBQXFDLGNBQXJDO0FBQ0EsU0FBU0MsUUFBVCxRQUF5QiwwQkFBekI7QUFDQSxTQUFTQyxNQUFULFFBQXVCLHVC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QUFDbEIsV0FBTyxDQUNMdkssS0FESyxFQUVMO0FBQ0FWLElBQUFBLEdBQUcsNmxEQUhFLENBQVA7QUF3SkQ7O0FBcHBCMEM7QUF1cEI3Q2tMLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsTUFBdEIsQ0FBNkIsZ0JBQTdCLEVBQStDekssWUFBL0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCwgY3NzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGdldCwgc2V0LCBkZWwgfSBmcm9tICdvYmplY3QtcGF0aCc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgeyBkZWVwQ2xvbmUsIGRlZXBFcXVhbCB9IGZyb20gJy4uL2xpYi91dGlscyc7XG5pbXBvcnQgeyBjbGFzc01hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2NsYXNzLW1hcCc7XG5pbXBvcnQgeyByZXBlYXQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZXBlYXQnO1xuaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSAnanNvbnNjaGVtYSc7XG5pbXBvcnQgeyBlbXB0eSB9IGZyb20gJy4uL3N0eWxlcy9lbXB0eSc7XG5pbXBvcnQgJy4vZ3Ytc2NoZW1hLWZvcm0tY29udHJvbCc7XG5cbi8qKlxuICogU2NoZW1hIGZvcm0gY29tcG9uZW50XG4gKlxuICogQGZpcmVzIGd2LXNjaGVtYS1mb3JtOnN1Ym1pdCAtIGV2ZW50IHdoZW4gdXNlciBzdWJtaXQgdmFsaWQgZm9ybVxuICogQGZpcmVzIGd2LXNjaGVtYS1mb3JtOmVycm9yIC0gZXZlbnQgd2hlbiB1c2VyIHN1Ym1pdCBpbnZhbGlkIGZvcm1cbiAqIEBmaXJlcyBndi1zY2hlbWEtZm9ybTpjaGFuZ2UgLSBldmVudCB3aGVuIHdoZW4gZm9ybSBjaGFuZ2VcbiAqIEBmaXJlcyBndi1zY2hlbWEtZm9ybTpjYW5jZWwgLSBldmVudCB3aGVuIHVzZXIgY2FuY2VsIGZvcm1cbiAqXG4gKiBAYXR0ciB7T2JqZWN0fSBzY2hlbWEgLSB0aGUgc2NoZW1hIGZvcm0gY29uZmlndXJhdGlvblxuICogQGF0dHIge09iamVjdH0gdmFsdWVzIC0gdGhlIHZhbHVlcyBvZiBmaWVsZHNcbiAqIEBhdHRyIHtPYmplY3R9IGVycm9ycyAtIHRoZSBtYXAgb2YgZXJyb3JzIGJ5IGlucHV0IGtleVxuICogQGF0dHIge0Jvb2xlYW59IHZhbGlkYXRlIC0gdG8gZm9yY2UgdmFsaWRhdGlvbiBvbiBmaXJzdCByZW5kZXJcbiAqIEBhdHRyIHtCb29sZWFufSByZWFkb25seSAtIHRydWUgaWYgcmVhZG9ubHlcbiAqIEBhdHRyIHtCb29sZWFufSBzY3JvbGxhYmxlIC0gdXNlZnVsIGZvciBtYWtpbmcgY29udGVudCBzY3JvbGxhYmxlIHdpdGggZml4ZWQgaGVhZGVycyAvIGZvb3RlcnNcbiAqXG4gKiBAY3NzcHJvcCB7Q29sb3J9IFstLWd2LXNjaGVtYS1mb3JtLS1iZ2M9I2ZmZmZmZl0gLSBCYWNrZ3JvdW5kIGNvbG9yXG4gKiBAY3NzcHJvcCB7TGVuZ3RofSBbLS1ndi1zY2hlbWEtZm9ybS1jb250cm9sLS1tPTAuNHJlbV0gLSBDb250cm9sIG1hcmdpblxuICovXG5leHBvcnQgY2xhc3MgR3ZTY2hlbWFGb3JtIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgZXJyb3JzOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgdmFsdWVzOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgc3VibWl0TGFiZWw6IHsgdHlwZTogU3RyaW5nIH0sXG4gICAgICBoYXNGb290ZXI6IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAnaGFzLWZvb3RlcicgfSxcbiAgICAgIGhhc0hlYWRlcjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdoYXMtaGVhZGVyJyB9LFxuICAgICAgX2NvbmZpcm06IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBfdmFsdWVzOiB7IHR5cGU6IE9iamVjdCwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgZGlydHk6IHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgaGlkZURlcHJlY2F0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAnaGlkZS1kZXByZWNhdGVkJyB9LFxuICAgICAgdmFsaWRhdGVPblJlbmRlcjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICd2YWxpZGF0ZS1vbi1yZW5kZXInIH0sXG4gICAgICBfdmFsaWRhdG9yUmVzdWx0czogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIHNrZWxldG9uOiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIF90b3VjaDogeyB0eXBlOiBCb29sZWFuIH0sXG4gICAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0sXG4gICAgICBzY3JvbGxhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmhpZGVEZXByZWNhdGVkID0gZmFsc2U7XG4gICAgdGhpcy5fdmFsdWVzID0ge307XG4gICAgdGhpcy5zdWJtaXRMYWJlbCA9ICdPayc7XG4gICAgdGhpcy5oYXNIZWFkZXIgPSBmYWxzZTtcbiAgICB0aGlzLmhhc0Zvb3RlciA9IGZhbHNlO1xuICAgIHRoaXMuX3RvdWNoID0gZmFsc2U7XG4gICAgdGhpcy5fdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcigpO1xuICAgIHRoaXMuX3ZhbGlkYXRvclJlc3VsdHMgPSB7fTtcbiAgICB0aGlzLl9pZ25vcmVQcm9wZXJ0aWVzID0gW107XG4gICAgdGhpcy5fZHluYW1pY0NvbnRyb2xzID0gW107XG4gICAgdGhpcy5fZHluYW1pY0F0dHJpYnV0ZXMgPSBbJ2Rpc2FibGVkJywgJ3JlcXVpcmVkJywgJ2hpZGRlbiddO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZ3Ytc2NoZW1hLWZvcm0tY29udHJvbDpkZWZhdWx0LXZhbHVlJywgdGhpcy5fb25EZWZhdWx0VmFsdWUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdndi1zY2hlbWEtZm9ybS1jb250cm9sOmNoYW5nZScsIHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZ3Ytc2NoZW1hLWZvcm0tY29udHJvbDpjb250cm9sLXJlYWR5JywgdGhpcy5fb25Db250cm9sUmVhZHkuYmluZCh0aGlzKSk7XG4gIH1cblxuICBzZXQgdmFsdWVzKHZhbHVlcykge1xuICAgIGlmICghZGVlcEVxdWFsKHRoaXMuX3ZhbHVlcywgdmFsdWVzKSkge1xuICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICB0aGlzLl9pbml0aWFsVmFsdWVzID0geyAuLi52YWx1ZXMgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxWYWx1ZXMgPSB7fTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3ZhbHVlcyA9IGRlZXBDbG9uZSh0aGlzLl9pbml0aWFsVmFsdWVzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXM7XG4gIH1cblxuICByZXNldCh2YWx1ZXMgPSBudWxsKSB7XG4gICAgdGhpcy5fdmFsdWVzID0gZGVlcENsb25lKHZhbHVlcyB8fCB0aGlzLl9pbml0aWFsVmFsdWVzKTtcbiAgICB0aGlzLl90b3VjaCA9IGZhbHNlO1xuICAgIHRoaXMuX3NldERpcnR5KGZhbHNlKTtcbiAgICB0aGlzLmdldENvbnRyb2xzKCkuZm9yRWFjaCgocykgPT4ge1xuICAgICAgcy5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBfb25SZXNldCgpIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAncmVzZXQnKTtcbiAgfVxuXG4gIHJlcXVlc3RWYWxpZGF0aW9uKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl92YWxpZGF0ZVRpbWVvdXQpO1xuICAgIHRoaXMuX3ZhbGlkYXRlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5fdXBkYXRlQWN0aW9ucygpO1xuICAgIH0sIDM1MCk7XG4gIH1cblxuICBzdWJtaXQoKSB7XG4gICAgdGhpcy5fb25TdWJtaXQoKTtcbiAgfVxuXG4gIF9vblN1Ym1pdCgpIHtcbiAgICBjb25zdCB2YWxpZGF0b3JSZXN1bHRzID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGlmICh0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgdGhpcy5faW5pdGlhbFZhbHVlcyA9IGRlZXBDbG9uZSh0aGlzLl92YWx1ZXMpO1xuICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgICAgdGhpcy5fdG91Y2ggPSBmYWxzZTtcbiAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ3N1Ym1pdCcsIHsgdmFsdWVzOiB0aGlzLl92YWx1ZXMsIHZhbGlkYXRvclJlc3VsdHMgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2Vycm9yJywgeyB2YWx1ZXM6IHRoaXMuX3ZhbHVlcywgdmFsaWRhdG9yUmVzdWx0cyB9KTtcbiAgICB9XG4gIH1cblxuICBfc2V0RGlydHkoZGlydHkgPSB0cnVlKSB7XG4gICAgdGhpcy5kaXJ0eSA9ICEhZGlydHk7XG4gIH1cblxuICBfc2V0VG91Y2godG91Y2ggPSB0cnVlKSB7XG4gICAgdGhpcy5fdG91Y2ggPSAhIXRvdWNoO1xuICB9XG5cbiAgY29uZmlybSgpIHtcbiAgICBpZiAodGhpcy5pc1RvdWNoKCkpIHtcbiAgICAgIGlmICh0aGlzLl9jb25maXJtICYmIHRoaXMuX2NvbmZpcm0ucHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlybS5wcm9taXNlO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+ICh0aGlzLl9jb25maXJtID0geyByZXNvbHZlLCByZWplY3QgfSkpO1xuICAgICAgdGhpcy5fY29uZmlybS5wcm9taXNlID0gcHJvbWlzZTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBfb25Db25maXJtUmVzZXQoKSB7XG4gICAgY29uc3QgeyByZXNvbHZlIH0gPSB0aGlzLl9jb25maXJtO1xuICAgIHRoaXMuX2NvbmZpcm0gPSBudWxsO1xuICAgIHRoaXMuX29uUmVzZXQoKTtcbiAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgcmVzb2x2ZSh0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9vbkNvbmZpcm1FZGl0KCkge1xuICAgIHRoaXMuX2NvbmZpcm0ucmVqZWN0KHRoaXMpO1xuICAgIHRoaXMuX2NvbmZpcm0gPSBudWxsO1xuICAgIHRoaXMuX3VwZGF0ZUNoaWxkcmVuKHRoaXMudmFsaWRhdGVPblJlbmRlcik7XG4gIH1cblxuICBfZ2V0U3VibWl0QnRuKCkge1xuICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignI3N1Ym1pdCcpO1xuICB9XG5cbiAgX2dldFJlc2V0QnRuKCkge1xuICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignI3Jlc2V0Jyk7XG4gIH1cblxuICBfZGlzcGF0Y2hDaGFuZ2UoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2NoYW5nZVRpbWVvdXQpO1xuICAgIHRoaXMuX2NoYW5nZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2NoYW5nZScsIHsgdGFyZ2V0OiB0aGlzLCB2YWx1ZXM6IHRoaXMuX3ZhbHVlcywgdmFsaWRhdGlvbjogdGhpcy5fdmFsaWRhdG9yUmVzdWx0cyB9KTtcbiAgICB9LCA1MCk7XG4gIH1cblxuICBfb25EZWZhdWx0VmFsdWUoeyBkZXRhaWw6IHsgY3VycmVudFRhcmdldCwgdmFsdWUsIGNvbnRyb2wgfSB9KSB7XG4gICAgaWYgKGNvbnRyb2wudHlwZSA9PT0gJ2ludGVnZXInICYmIHZhbHVlICE9IG51bGwgJiYgKCh2YWx1ZS50cmltICYmIHZhbHVlLmxlbmd0aCA+IDApIHx8IHZhbHVlLmxlbmd0aCA+IDApKSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuICAgIHNldCh0aGlzLl92YWx1ZXMsIGN1cnJlbnRUYXJnZXQuaWQsIHZhbHVlKTtcbiAgfVxuXG4gIF9vbkNoYW5nZSh7IGRldGFpbDogeyBjdXJyZW50VGFyZ2V0LCB2YWx1ZSwgY29udHJvbCB9IH0pIHtcbiAgICB0aGlzLl9zZXRUb3VjaCh0cnVlKTtcbiAgICBpZiAoY29udHJvbC50eXBlID09PSAnaW50ZWdlcicpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW50VmFsdWUgPSBOdW1iZXIodmFsdWUpLnZhbHVlT2YoKTtcbiAgICAgICAgaWYgKCFpc05hTihpbnRWYWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IGludFZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09PSAnYXJyYXknICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID09PSAwICYmICFjb250cm9sLmVudW0pIHtcbiAgICAgIHZhbHVlID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2wudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlbCh0aGlzLl92YWx1ZXMsIGN1cnJlbnRUYXJnZXQuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXQodGhpcy5fdmFsdWVzLCBjdXJyZW50VGFyZ2V0LmlkLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlRHluYW1pY0NvbnRyb2xzKCk7XG4gICAgdGhpcy5fdmFsaWRhdG9yUmVzdWx0cyA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLl91cGRhdGVBY3Rpb25zKCk7XG4gICAgdGhpcy5fZGlzcGF0Y2hDaGFuZ2UoKTtcbiAgfVxuXG4gIF9vbkNvbnRyb2xSZWFkeShlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgY29udHJvbEVsZW1lbnQgPSBlLmRldGFpbC5jb250cm9sO1xuICAgIGNvbnN0IGNvbnRyb2wgPSBjb250cm9sRWxlbWVudC5jb250cm9sO1xuICAgIGlmIChjb250cm9sWyd4LXNjaGVtYS1mb3JtJ10pIHtcbiAgICAgIGlmIChjb250cm9sWyd4LXNjaGVtYS1mb3JtJ10uZXZlbnQpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBjb250cm9sWyd4LXNjaGVtYS1mb3JtJ10uZXZlbnQ7XG4gICAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgZXZlbnQubmFtZSwgeyAuLi5ldmVudCwgLi4uZS5kZXRhaWwgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2hhc0NvbmRpdGlvbihjb250cm9sKSkge1xuICAgICAgICB0aGlzLl9keW5hbWljQ29udHJvbHMucHVzaChjb250cm9sRWxlbWVudCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUR5bmFtaWNDb250cm9sKGNvbnRyb2xFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfdXBkYXRlRHluYW1pY0NvbnRyb2xzKCkge1xuICAgIHRoaXMuX2lnbm9yZVByb3BlcnRpZXMgPSBbXTtcbiAgICB0aGlzLl9keW5hbWljQ29udHJvbHMuZm9yRWFjaCgoY29udHJvbEVsZW1lbnQpID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZUR5bmFtaWNDb250cm9sKGNvbnRyb2xFbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIF91cGRhdGVEeW5hbWljQ29udHJvbChjb250cm9sRWxlbWVudCkge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBjb250cm9sRWxlbWVudC5jb250cm9sO1xuICAgIGlmIChjb250cm9sWyd4LXNjaGVtYS1mb3JtJ10pIHtcbiAgICAgIHRoaXMuX2R5bmFtaWNBdHRyaWJ1dGVzLmZvckVhY2goKGF0dHJpYnV0ZSkgPT4ge1xuICAgICAgICBjb25zdCBpcyA9IHRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uKGNvbnRyb2wsIGF0dHJpYnV0ZSk7XG4gICAgICAgIGlmIChpcykge1xuICAgICAgICAgIGNvbnRyb2xFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsICcnKTtcbiAgICAgICAgICBpZiAoYXR0cmlidXRlID09PSAnaGlkZGVuJykge1xuICAgICAgICAgICAgdGhpcy5faWdub3JlUHJvcGVydGllcy5wdXNoKGNvbnRyb2xFbGVtZW50LmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIHBlcmZvcm1VcGRhdGUoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5nZXRDb250cm9scygpLm1hcCgoZSkgPT4gZS51cGRhdGVDb21wbGV0ZSkpO1xuICAgIHRoaXMuZ2V0Q29udHJvbHMoKS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICBzLnJlcXVlc3RVcGRhdGUoKTtcbiAgICB9KTtcbiAgICBzdXBlci5wZXJmb3JtVXBkYXRlKCk7XG4gIH1cblxuICBfcmVuZGVyQ29udHJvbChrZXkpIHtcbiAgICAvLyBUaGlzIGlzIHJlcXVpcmUgdG8gY2xlYW4gY2FjaGUgb2YgPGd2LXNjaGVtYS1mb3JtLWNvbnRyb2w+XG4gICAgY29uc3QgY29udHJvbCA9IHsgLi4udGhpcy5zY2hlbWEucHJvcGVydGllc1trZXldIH07XG4gICAgY29uc3QgaXNSZXF1aXJlZCA9ICh0aGlzLnNjaGVtYS5yZXF1aXJlZCAmJiB0aGlzLnNjaGVtYS5yZXF1aXJlZC5pbmNsdWRlcyhrZXkpKSB8fCB0aGlzLl9ldmFsdWF0ZUNvbmRpdGlvbihjb250cm9sLCAncmVxdWlyZWQnKTtcbiAgICBjb25zdCBpc0Rpc2FibGVkID0gKHRoaXMuc2NoZW1hLmRpc2FibGVkICYmIHRoaXMuc2NoZW1hLmRpc2FibGVkLmluY2x1ZGVzKGtleSkpIHx8IHRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uKGNvbnRyb2wsICdkaXNhYmxlZCcpO1xuICAgIGNvbnN0IGlzSGlkZGVuID0gdGhpcy5fZXZhbHVhdGVDb25kaXRpb24oY29udHJvbCwgJ2hpZGRlbicpO1xuICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgdGhpcy5faWdub3JlUHJvcGVydGllcy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGNvbnN0IGlzUmVhZG9ubHkgPSB0aGlzLnJlYWRvbmx5IHx8IGNvbnRyb2wucmVhZE9ubHkgPT09IHRydWU7XG4gICAgY29uc3QgaXNXcml0ZU9ubHkgPSBjb250cm9sLndyaXRlT25seSA9PT0gdHJ1ZTtcbiAgICBjb25zdCB2YWx1ZSA9IGdldCh0aGlzLl92YWx1ZXMsIGtleSk7XG4gICAgcmV0dXJuIGh0bWxgPGd2LXNjaGVtYS1mb3JtLWNvbnRyb2xcbiAgICAgIC5pZD1cIiR7a2V5fVwiXG4gICAgICAuZXJyb3JzPVwiJHt0aGlzLmVycm9yc31cIlxuICAgICAgLmNvbnRyb2w9XCIke2NvbnRyb2x9XCJcbiAgICAgIC5za2VsZXRvbj1cIiR7dGhpcy5za2VsZXRvbn1cIlxuICAgICAgLnZhbHVlPVwiJHt2YWx1ZX1cIlxuICAgICAgP3JlYWRvbmx5PVwiJHtpc1JlYWRvbmx5fVwiXG4gICAgICA/d3JpdGVvbmx5PVwiJHtpc1dyaXRlT25seX1cIlxuICAgICAgP3JlcXVpcmVkPVwiJHtpc1JlcXVpcmVkfVwiXG4gICAgICA/ZGlzYWJsZWQ9XCIke2lzRGlzYWJsZWR9XCJcbiAgICAgID9oaWRkZW49XCIke2lzSGlkZGVufVwiXG4gICAgPjwvZ3Ytc2NoZW1hLWZvcm0tY29udHJvbD5gO1xuICB9XG5cbiAgX2hhc0NvbmRpdGlvbihjb250cm9sKSB7XG4gICAgaWYgKGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2R5bmFtaWNBdHRyaWJ1dGVzLmZpbmQoKGNvbmRpdGlvbikgPT4gY29udHJvbFsneC1zY2hlbWEtZm9ybSddW2NvbmRpdGlvbl0gIT0gbnVsbCkgIT0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX2V2YWx1YXRlQ29uZGl0aW9uKGNvbnRyb2wsIGNvbmRpdGlvbktleSkge1xuICAgIGlmIChjb250cm9sWyd4LXNjaGVtYS1mb3JtJ10gPT0gbnVsbCB8fCBjb250cm9sWyd4LXNjaGVtYS1mb3JtJ11bY29uZGl0aW9uS2V5XSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNvbmRpdGlvbiA9IGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXVtjb25kaXRpb25LZXldO1xuICAgIGlmICh0eXBlb2YgY29uZGl0aW9uID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBjb25kaXRpb247XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShjb25kaXRpb24pKSB7XG4gICAgICAvLyBjb25kaXRpb24gaXNuJ3QgYW4gYXJyYXksIGlnbm9yZSB0aGUgY29uZGl0aW9uXG4gICAgICBjb25zb2xlLndhcm4oYCcke2NvbmRpdGlvbktleX0nIGF0dHJpYnV0ZSBvZiAneC1zY2hlbWEtZm9ybScgc2hvdWxkIGJlIGFuIGFycmF5YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgY29uZGl0aW9uKSB7XG4gICAgICAvLyBvcGVyYXRpb24gb25seSBoYXZlIG9uZSBvcGVyYXRvciB3aXRoIGEgc2luZ2xlIG9iamVjdCBjb250YWluaW5nIG9wZXJhbmQgdmFsdWVzXG4gICAgICBjb25zdCBvcGVyYXRvciA9IE9iamVjdC5rZXlzKG9wZXJhdGlvbilbMF07XG5cbiAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSAnJG5lcSc6XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIHRoaXMuX2V2YWx1YXRlTm90RXF1YWxzQ29uZGl0aW9uKGNvbnRyb2wsIG9wZXJhdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJyRlcSc6XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIHRoaXMuX2V2YWx1YXRlRXF1YWxzQ29uZGl0aW9uKGNvbnRyb2wsIG9wZXJhdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJyRub2RlZic6XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIHRoaXMuX2V2YWx1YXRlTm90RGVmQ29uZGl0aW9uKGNvbnRyb2wsIG9wZXJhdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJyRkZWYnOlxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAmJiB0aGlzLl9ldmFsdWF0ZURlZkNvbmRpdGlvbihjb250cm9sLCBvcGVyYXRpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUud2FybihgVW5zdXBwb3J0ZWQgb3BlcmF0b3IgJyR7b3BlcmF0b3J9JyBvbiBkaXNhYmxlIGNvbmRpdGlvbmApO1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBfZXZhbHVhdGVOb3RFcXVhbHNDb25kaXRpb24oY29udHJvbCwgY29uZGl0aW9uKSB7XG4gICAgcmV0dXJuICF0aGlzLl9ldmFsdWF0ZUVxdWFsc0NvbmRpdGlvbihjb250cm9sLCBjb25kaXRpb24pO1xuICB9XG5cbiAgX2V2YWx1YXRlRXF1YWxzQ29uZGl0aW9uKGNvbnRyb2wsIGNvbmRpdGlvbikge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gT2JqZWN0LmtleXMoY29uZGl0aW9uKVswXTtcbiAgICBjb25zdCBvcGVyYW5kcyA9IGNvbmRpdGlvbltvcGVyYXRvcl07XG4gICAgY29uc3QgbW9kZWxBdHRyaWJ1dGVzID0gT2JqZWN0LmtleXMob3BlcmFuZHMpO1xuICAgIHJldHVybiBtb2RlbEF0dHJpYnV0ZXNcbiAgICAgIC5tYXAoKG1vZGVsQXR0cmlidXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlc3RWYWx1ZSA9IG9wZXJhbmRzW21vZGVsQXR0cmlidXRlXTtcbiAgICAgICAgbGV0IHZhbHVlID0gZ2V0KHRoaXMuX3ZhbHVlcywgbW9kZWxBdHRyaWJ1dGUpO1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiBjb250cm9sLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0ZXN0VmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRlc3RWYWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0ZXN0VmFsdWU7XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgoYWNjLCBjdXJyZW50KSA9PiBhY2MgfHwgY3VycmVudCk7XG4gIH1cblxuICBfZXZhbHVhdGVOb3REZWZDb25kaXRpb24oY29udHJvbCwgY29uZGl0aW9uKSB7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBPYmplY3Qua2V5cyhjb25kaXRpb24pWzBdO1xuICAgIGNvbnN0IG1vZGVsQXR0cmlidXRlID0gY29uZGl0aW9uW29wZXJhdG9yXTtcbiAgICByZXR1cm4gZ2V0KHRoaXMuX3ZhbHVlcywgbW9kZWxBdHRyaWJ1dGUpID09PSB1bmRlZmluZWQgfHwgZ2V0KHRoaXMuX3ZhbHVlcywgbW9kZWxBdHRyaWJ1dGUpID09PSBudWxsO1xuICB9XG5cbiAgX2V2YWx1YXRlRGVmQ29uZGl0aW9uKGNvbnRyb2wsIGNvbmRpdGlvbikge1xuICAgIHJldHVybiAhdGhpcy5fZXZhbHVhdGVOb3REZWZDb25kaXRpb24oY29udHJvbCwgY29uZGl0aW9uKTtcbiAgfVxuXG4gIF9yZW5kZXJQYXJ0KCkge1xuICAgIGlmICh0aGlzLl9jb25maXJtKSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwiY29uZmlybS1ib3hcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yXCI+VGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkIGFuZCBjYW5ub3QgYmUgc2F2ZWQuPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb25maXJtLWJveF9hY3Rpb25zXCI+XG4gICAgICAgICAgPGd2LWJ1dHRvbiBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbkNvbmZpcm1SZXNldH1cIiBvdXRsaW5lZCBpY29uPVwiZ2VuZXJhbDp1cGRhdGVcIiBkYW5nZXI+TG9zZSBjaGFuZ2VzPC9ndi1idXR0b24+XG4gICAgICAgICAgPGd2LWJ1dHRvbiBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbkNvbmZpcm1FZGl0fVwiIGljb249XCJkZXNpZ246ZWRpdFwiPkVkaXQ8L2d2LWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gdGhpcy5zY2hlbWEucHJvcGVydGllcyA/IE9iamVjdC5rZXlzKHRoaXMuc2NoZW1hLnByb3BlcnRpZXMpIDogW107XG4gICAgdGhpcy5faWdub3JlUHJvcGVydGllcyA9IFtdO1xuICAgIHJldHVybiByZXBlYXQoXG4gICAgICBrZXlzLFxuICAgICAgKGtleSkgPT4ga2V5LFxuICAgICAgKGtleSkgPT4gdGhpcy5fcmVuZGVyQ29udHJvbChrZXkpLFxuICAgICk7XG4gIH1cblxuICBnZXRDb250cm9scygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3Ytc2NoZW1hLWZvcm0tY29udHJvbCcpKTtcbiAgfVxuXG4gIGdldENvbnRyb2woaWQpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYFtpZD1cIiR7aWR9XCJdYCk7XG4gIH1cblxuICBfZ2V0RXJyb3JzKCkge1xuICAgIHJldHVybiAodGhpcy5fdmFsaWRhdG9yUmVzdWx0cy5lcnJvcnMgfHwgW10pLmZpbHRlcigoZXJyb3IpID0+IHtcbiAgICAgIGxldCBpZCA9IGAke2Vycm9yLnByb3BlcnR5LnJlcGxhY2UoJ2luc3RhbmNlLicsICcnKX1gO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVycm9yLmFyZ3VtZW50KSkge1xuICAgICAgICBpZCA9IGAke2lkfS4ke2Vycm9yLmFyZ3VtZW50fWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yS2V5ID0gYHgtc2NoZW1hLWZvcm0uZXJyb3JzLiR7aWR9LiR7ZXJyb3IubmFtZX1gO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZ2V0KHRoaXMuc2NoZW1hLCBlcnJvcktleSk7XG4gICAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gIXRoaXMuX2lnbm9yZVByb3BlcnRpZXMuaW5jbHVkZXMoaWQpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGUoKSB7XG4gICAgaWYgKHRoaXMuc2NoZW1hKSB7XG4gICAgICAvLyBBZGRpdGlvbmFsIHByb3BlcnRpZXMgc2hvdWxkIG5vdCBibG9jayB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZm9ybVxuICAgICAgdGhpcy5fdmFsaWRhdG9yUmVzdWx0cyA9IHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZSh0aGlzLl92YWx1ZXMsIHsgLi4udGhpcy5zY2hlbWEsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlIH0pO1xuICAgICAgdGhpcy5lcnJvcnMgPSB0aGlzLl9nZXRFcnJvcnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvclJlc3VsdHM7XG4gIH1cblxuICBpc1ZhbGlkKCkge1xuICAgIGlmICh0aGlzLl92YWxpZGF0b3JSZXN1bHRzLnZhbGlkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dldEVycm9ycygpID09PSAwO1xuICB9XG5cbiAgaXNUb3VjaCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdG91Y2ggfHwgKHRoaXMuZGlydHkgJiYgdGhpcy52YWxpZGF0ZU9uUmVuZGVyKTtcbiAgfVxuXG4gIGNhblN1Ym1pdCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RvdWNoKCkgJiYgdGhpcy5pc1ZhbGlkKCk7XG4gIH1cblxuICBfdXBkYXRlQWN0aW9ucygpIHtcbiAgICBjb25zdCBzdWJtaXRCdG4gPSB0aGlzLl9nZXRTdWJtaXRCdG4oKTtcbiAgICBpZiAoc3VibWl0QnRuICE9IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLmNhblN1Ym1pdCgpKSB7XG4gICAgICAgIHRoaXMuX2dldFN1Ym1pdEJ0bigpLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2dldFN1Ym1pdEJ0bigpLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzZXRCdG4gPSB0aGlzLl9nZXRSZXNldEJ0bigpO1xuICAgIGlmIChyZXNldEJ0biAhPSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgICByZXNldEJ0bi5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldEJ0bi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZUNoaWxkcmVuKHdpdGhWYWxpZGF0aW9uKSB7XG4gICAgaWYgKHdpdGhWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0b3JSZXN1bHRzID0ge307XG4gICAgICB0aGlzLmVycm9ycyA9IG51bGw7XG4gICAgICB0aGlzLnJlcXVlc3RWYWxpZGF0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUFjdGlvbnNUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl91cGRhdGVBY3Rpb25zKCksIDApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlQWN0aW9uc1RpbWVvdXQpO1xuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ192YWx1ZXMnKSkge1xuICAgICAgdGhpcy5nZXRDb250cm9scygpLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgY29udHJvbC52YWx1ZSA9IGdldCh0aGlzLl92YWx1ZXMsIGNvbnRyb2wuaWQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZUNoaWxkcmVuKHRoaXMudmFsaWRhdGVPblJlbmRlciAmJiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdfdmFsdWVzJykgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdzY2hlbWEnKSkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VXBkYXRlQ29tcGxldGUoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmdldENvbnRyb2xzKCkubWFwKChlKSA9PiBlLnVwZGF0ZUNvbXBsZXRlKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8Zm9ybSBjbGFzcz1cIiR7Y2xhc3NNYXAoeyBzY3JvbGxhYmxlOiB0aGlzLnNjcm9sbGFibGUgfSl9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiJHtjbGFzc01hcCh7IGNvbnRhaW5lcjogdHJ1ZSwgY29uZmlybTogdGhpcy5fY29uZmlybSB9KX1cIj5cbiAgICAgICAgJHt0aGlzLmhhc0hlYWRlciA9PT0gdHJ1ZVxuICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIke2NsYXNzTWFwKHsgdGl0bGU6IHRydWUsIGNlbnRlcjogdGhpcy5oYXNIZWFkZXIgJiYgIXRoaXMuaGFzRm9vdGVyIH0pfVwiPlxuICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cInRpdGxlXCI+PC9zbG90PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWxlZnRcIj48L3Nsb3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgJHt0aGlzLnJlYWRvbmx5ID09PSB0cnVlIHx8IHRoaXMuaGFzRm9vdGVyID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgICA6IGh0bWxgPGRpdiBjbGFzcz1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGd2LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uUmVzZXR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnZW5lcmFsOnVwZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlJlc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9ndi1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGd2LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uU3VibWl0fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiY29kZTpjaGVja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAudGl0bGU9XCIke3RoaXMuc3VibWl0TGFiZWx9XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9ndi1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiBgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGBcbiAgICAgICAgICA6ICcnfVxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPiR7dGhpcy5zY2hlbWEgIT0gbnVsbCA/IHRoaXMuX3JlbmRlclBhcnQoKSA6IGh0bWxgYH08L2Rpdj5cbiAgICAgICAgJHt0aGlzLmhhc0Zvb3RlciA9PT0gdHJ1ZSAmJiB0aGlzLnJlYWRvbmx5ICE9PSB0cnVlXG4gICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxndi1idXR0b24gaWQ9XCJyZXNldFwiIG91dGxpbmVkIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uUmVzZXR9XCIgaWNvbj1cImdlbmVyYWw6dXBkYXRlXCIgdGl0bGU9XCJSZXNldFwiPlJlc2V0PC9ndi1idXR0b24+XG4gICAgICAgICAgICAgICAgICA8Z3YtYnV0dG9uIGlkPVwic3VibWl0XCIgQGd2LWJ1dHRvbjpjbGljaz1cIiR7dGhpcy5fb25TdWJtaXR9XCIgaWNvbj1cImNvZGU6Y2hlY2tcIiAudGl0bGU9XCIke3RoaXMuc3VibWl0TGFiZWx9XCJcbiAgICAgICAgICAgICAgICAgICAgPiR7dGhpcy5zdWJtaXRMYWJlbH08L2d2LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGBcbiAgICAgICAgICA6ICcnfVxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPmA7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgZW1wdHksXG4gICAgICAvLyBsYW5ndWFnZT1DU1NcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgbWFyZ2luOiAwLjJyZW07XG4gICAgICAgICAgLS1iZ2M6IHZhcigtLWd2LXNjaGVtYS1mb3JtLS1iZ2MsICNmZmZmZmYpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybSB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybS5zY3JvbGxhYmxlIHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgdG9wOiAwO1xuICAgICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNvbnRhaW5lciB7XG4gICAgICAgICAgZmxleC1ncm93OiAxO1xuXG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmdjKTtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgICAgICAgICAvKiBmb3IgRmlyZWZveCAqL1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyLFxuICAgICAgICAuZm9vdGVyLFxuICAgICAgICAuY29udGVudCB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmdjKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250ZW50IHtcbiAgICAgICAgICBmbGV4LWdyb3c6IDE7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgICAgIC8qIGZvciBGaXJlZm94ICovXG4gICAgICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250ZW50ID4gZ3Ytc2NoZW1hLWZvcm0tY29udHJvbCB7XG4gICAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybS5zY3JvbGxhYmxlIC5jb250ZW50IHtcbiAgICAgICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm0uc2Nyb2xsYWJsZSAuY29udGVudCA+IGd2LXNjaGVtYS1mb3JtLWNvbnRyb2wge1xuICAgICAgICAgIG1heC13aWR0aDogNzc1cHg7XG4gICAgICAgICAgd2lkdGg6IDk1JTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIsXG4gICAgICAgIC5mb290ZXIge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBtaW4taGVpZ2h0OiA0NXB4O1xuICAgICAgICAgIC0tZ3YtaWNvbi0tczogMjZweDtcbiAgICAgICAgICAtLWd2LWljb24tLWM6ICNiZmJmYmY7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICBwYWRkaW5nOiAwIDAuNXJlbTtcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mb290ZXIge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICAgIHBhZGRpbmc6IDFyZW07XG4gICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkOWQ5ZDk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtLnNjcm9sbGFibGUgLmZvb3RlciB7XG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9vdGVyIC5sZWZ0LFxuICAgICAgICAuZm9vdGVyIC5yaWdodCB7XG4gICAgICAgICAgbWF4LXdpZHRoOiA0MDBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIgLmxlZnQsXG4gICAgICAgIC5mb290ZXIgLmxlZnQsXG4gICAgICAgIC5oZWFkZXIgLnJpZ2h0LFxuICAgICAgICAuZm9vdGVyIC5yaWdodCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC5yaWdodCxcbiAgICAgICAgLmZvb3RlciAucmlnaHQge1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC50aXRsZSB7XG4gICAgICAgICAgY29sb3I6ICMyODQ0NGY7XG4gICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIgLnRpdGxlLmNlbnRlciB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb25maXJtLWJveCB7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIHBhZGRpbmc6IDFyZW07XG4gICAgICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNvbmZpcm0tYm94X2FjdGlvbnMge1xuICAgICAgICAgIHBhZGRpbmc6IDFyZW0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb25maXJtIC5oZWFkZXIgLmxlZnQsXG4gICAgICAgIC5jb25maXJtIC5oZWFkZXIgLnJpZ2h0LFxuICAgICAgICAuY29uZmlybSAuZm9vdGVyIC5sZWZ0LFxuICAgICAgICAuY29uZmlybSAuZm9vdGVyIC5yaWdodCB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfVxuICAgICAgYCxcbiAgICBdO1xuICB9XG59XG5cbndpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2d2LXNjaGVtYS1mb3JtJywgR3ZTY2hlbWFGb3JtKTtcbiJdfQ==
|