ontimize-web-ngx 15.3.4 → 15.4.0

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 (54) hide show
  1. package/esm2020/lib/components/grid/o-grid.component.mjs +2 -1
  2. package/esm2020/lib/components/input/date-range/o-daterange-input.component.mjs +240 -218
  3. package/esm2020/lib/components/input/date-range/o-daterange-input.module.mjs +3 -5
  4. package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.component.mjs +353 -0
  5. package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.directive.mjs +381 -0
  6. package/esm2020/lib/components/input/date-range-legacy/o-daterange-input.module.mjs +21 -0
  7. package/esm2020/lib/components/input/date-range-legacy/o-daterange-picker.component.mjs +1009 -0
  8. package/esm2020/lib/components/input/date-range-legacy/o-daterange-picker.config.mjs +2 -0
  9. package/esm2020/lib/components/input/index.mjs +7 -5
  10. package/esm2020/lib/components/list/o-list.component.mjs +2 -1
  11. package/esm2020/lib/components/o-service-base-component.class.mjs +24 -9
  12. package/esm2020/lib/components/o-service-component.class.mjs +2 -1
  13. package/esm2020/lib/components/table/o-table.component.mjs +17 -7
  14. package/esm2020/lib/config/o-modules.mjs +5 -3
  15. package/esm2020/lib/i18n/i18n.mjs +9 -3
  16. package/esm2020/lib/interfaces/form-layout-manager.interface.mjs +2 -0
  17. package/esm2020/lib/interfaces/index.mjs +3 -1
  18. package/esm2020/lib/interfaces/pagination-context.interface.mjs +2 -0
  19. package/esm2020/lib/layouts/form-layout/o-form-layout-manager-base.class.mjs +1 -1
  20. package/esm2020/lib/layouts/form-layout/o-form-layout-manager.component.mjs +1 -1
  21. package/esm2020/lib/ontimize-web-ngx.module.mjs +7 -6
  22. package/esm2020/lib/services/base-service.class.mjs +12 -1
  23. package/esm2020/lib/services/index.mjs +2 -1
  24. package/esm2020/lib/services/pagination-context.service.mjs +25 -0
  25. package/fesm2015/ontimize-web-ngx.mjs +477 -43
  26. package/fesm2015/ontimize-web-ngx.mjs.map +1 -1
  27. package/fesm2020/ontimize-web-ngx.mjs +466 -43
  28. package/fesm2020/ontimize-web-ngx.mjs.map +1 -1
  29. package/lib/components/input/date-range/o-daterange-input.component.d.ts +47 -33
  30. package/lib/components/input/date-range/o-daterange-input.module.d.ts +4 -6
  31. package/lib/components/input/date-range-legacy/o-daterange-input.component.d.ts +70 -0
  32. package/lib/components/input/date-range-legacy/o-daterange-input.module.d.ts +11 -0
  33. package/lib/components/input/index.d.ts +6 -4
  34. package/lib/components/o-service-base-component.class.d.ts +1 -0
  35. package/lib/components/table/extensions/header/o-table-header-components.d.ts +2 -2
  36. package/lib/components/table/o-table.component.d.ts +2 -0
  37. package/lib/i18n/i18n.d.ts +6 -0
  38. package/lib/interfaces/form-layout-manager.interface.d.ts +43 -0
  39. package/lib/interfaces/index.d.ts +2 -0
  40. package/lib/interfaces/pagination-context.interface.d.ts +6 -0
  41. package/lib/layouts/form-layout/o-form-layout-manager-base.class.d.ts +30 -12
  42. package/lib/layouts/form-layout/o-form-layout-manager.component.d.ts +2 -1
  43. package/lib/ontimize-web-ngx.module.d.ts +5 -4
  44. package/lib/services/base-service.class.d.ts +6 -0
  45. package/lib/services/index.d.ts +1 -0
  46. package/lib/services/pagination-context.service.d.ts +11 -0
  47. package/package.json +1 -1
  48. package/theme.scss +2 -2
  49. package/esm2020/lib/components/input/date-range/o-daterange-input.directive.mjs +0 -381
  50. package/esm2020/lib/components/input/date-range/o-daterange-picker.component.mjs +0 -1009
  51. package/esm2020/lib/components/input/date-range/o-daterange-picker.config.mjs +0 -2
  52. /package/lib/components/input/{date-range → date-range-legacy}/o-daterange-input.directive.d.ts +0 -0
  53. /package/lib/components/input/{date-range → date-range-legacy}/o-daterange-picker.component.d.ts +0 -0
  54. /package/lib/components/input/{date-range → date-range-legacy}/o-daterange-picker.config.d.ts +0 -0
@@ -1,381 +0,0 @@
1
- import { ESCAPE, UP_ARROW } from '@angular/cdk/keycodes';
2
- import { Overlay, OverlayConfig, ScrollStrategyOptions } from '@angular/cdk/overlay';
3
- import { ComponentPortal } from '@angular/cdk/portal';
4
- import { ChangeDetectorRef, Directive, ElementRef, EventEmitter, forwardRef, Input, KeyValueDiffers, NgZone, Output, ViewContainerRef } from '@angular/core';
5
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
6
- import { MatDialog } from '@angular/material/dialog';
7
- import moment from 'moment';
8
- import { merge } from 'rxjs';
9
- import { filter, take } from 'rxjs/operators';
10
- import { DaterangepickerComponent } from './o-daterange-picker.component';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "@angular/material/dialog";
13
- import * as i2 from "@angular/cdk/overlay";
14
- export class ODaterangepickerDirective {
15
- set separator(value) {
16
- if (value !== null) {
17
- this._separator = value;
18
- if (this._locale) {
19
- this._locale.separator = value;
20
- }
21
- }
22
- }
23
- set locale(value) {
24
- if (value !== null) {
25
- this._locale = value;
26
- if (this._separator) {
27
- this._locale.separator = this._separator;
28
- }
29
- }
30
- }
31
- get locale() {
32
- return this._locale;
33
- }
34
- set startKey(value) {
35
- if (value && value !== null) {
36
- this._startKey = value;
37
- }
38
- else {
39
- this._startKey = 'startDate';
40
- }
41
- }
42
- get startKey() {
43
- return this._startKey;
44
- }
45
- set endKey(value) {
46
- if (value && value !== null) {
47
- this._endKey = value;
48
- }
49
- else {
50
- this._endKey = 'endDate';
51
- }
52
- }
53
- get endKey() {
54
- return this._endKey;
55
- }
56
- get value() {
57
- return this._value || null;
58
- }
59
- set value(val) {
60
- this._value = val;
61
- this._onChange(val);
62
- this._changeDetectorRef.markForCheck();
63
- }
64
- constructor(_dialog, _ngZone, _overlay, _viewContainerRef, _changeDetectorRef, _el, differs, scrollStrategy) {
65
- this._dialog = _dialog;
66
- this._ngZone = _ngZone;
67
- this._overlay = _overlay;
68
- this._viewContainerRef = _viewContainerRef;
69
- this._changeDetectorRef = _changeDetectorRef;
70
- this._el = _el;
71
- this.differs = differs;
72
- this.scrollStrategy = scrollStrategy;
73
- this._onChange = Function.prototype;
74
- this._onTouched = Function.prototype;
75
- this._validatorChange = Function.prototype;
76
- this.minDate = null;
77
- this.maxDate = null;
78
- this.dateLimit = null;
79
- this.showCancel = false;
80
- this.timePicker = false;
81
- this.showRanges = false;
82
- this.timePicker24Hour = false;
83
- this.timePickerIncrement = 1;
84
- this.timePickerSeconds = false;
85
- this._endKey = 'endDate';
86
- this._startKey = 'startDate';
87
- this.ranges = {
88
- 'DATERANGE.today': [moment(), moment()],
89
- 'DATERANGE.yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
90
- 'DATERANGE.last_7days': [moment().subtract(6, 'days'), moment()],
91
- 'DATERANGE.last_30days': [moment().subtract(29, 'days'), moment()],
92
- 'DATERANGE.this_month': [moment().startOf('month'), moment().endOf('month')],
93
- 'DATERANGE.last_month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
94
- 'DATERANGE.this_year': [moment().startOf('year'), moment().endOf('year')]
95
- };
96
- this.oTouchUi = false;
97
- this.notForChangesProperty = [
98
- 'locale',
99
- 'endKey',
100
- 'startKey'
101
- ];
102
- this.onChange = new EventEmitter();
103
- this.rangeClicked = new EventEmitter();
104
- this.datesUpdated = new EventEmitter();
105
- this.drops = 'down';
106
- this.opens = 'right';
107
- }
108
- initializeListeners(instance) {
109
- instance.rangeClicked.asObservable().subscribe((range) => {
110
- this.rangeClicked.emit(range);
111
- });
112
- instance.datesUpdated.asObservable().subscribe((range) => {
113
- this.datesUpdated.emit(range);
114
- });
115
- instance.choosedDate.asObservable().subscribe((change) => {
116
- if (change) {
117
- const value = {};
118
- value[this._startKey] = change.startDate;
119
- value[this._endKey] = change.endDate;
120
- this.value = value;
121
- this.onChange.emit(value);
122
- if (typeof change.chosenLabel === 'string') {
123
- this._el.nativeElement.value = change.chosenLabel;
124
- }
125
- }
126
- });
127
- instance.firstMonthDayClass = this.firstMonthDayClass;
128
- instance.lastMonthDayClass = this.lastMonthDayClass;
129
- instance.emptyWeekRowClass = this.emptyWeekRowClass;
130
- instance.firstDayOfNextMonthClass = this.firstDayOfNextMonthClass;
131
- instance.lastDayOfPreviousMonthClass = this.lastDayOfPreviousMonthClass;
132
- instance.drops = this.drops;
133
- instance.opens = this.opens;
134
- instance.minDate = this.minDate;
135
- instance.maxDate = this.maxDate;
136
- instance.locale = this.locale;
137
- instance.showWeekNumbers = this.showWeekNumbers;
138
- instance.singleDatePicker = this.singleDatePicker;
139
- if (this.showRanges) {
140
- instance.ranges = this.ranges;
141
- instance.keepCalendarOpeningWithRange = true;
142
- instance.alwaysShowCalendars = true;
143
- }
144
- this.localeDiffer = this.differs.find(this.locale).create();
145
- }
146
- onBlur() {
147
- this._onTouched();
148
- }
149
- open() {
150
- if (!this.oTouchUi) {
151
- this.openAsPopup();
152
- }
153
- else {
154
- this.openAsDialog();
155
- }
156
- }
157
- ngOnDestroy() {
158
- this.close();
159
- if (this._popupRef) {
160
- this._popupRef.dispose();
161
- this._popupComponentRef = null;
162
- }
163
- }
164
- clear() {
165
- this._popupComponentRef.instance.clear();
166
- }
167
- writeValue(value) {
168
- this.setValue(value);
169
- }
170
- registerOnChange(fn) {
171
- this._onChange = fn;
172
- }
173
- registerOnTouched(fn) {
174
- this._onTouched = fn;
175
- }
176
- setValueInDateComponent(instance, val) {
177
- if (val) {
178
- if (val[this._startKey]) {
179
- instance.setStartDate(val[this._startKey]);
180
- }
181
- if (val[this._endKey]) {
182
- instance.setEndDate(val[this._endKey]);
183
- }
184
- instance.calculateChosenLabel();
185
- if (instance.chosenLabel) {
186
- this._el.nativeElement.value = instance.chosenLabel;
187
- }
188
- }
189
- else {
190
- instance.clear();
191
- }
192
- }
193
- setValue(val) {
194
- if (val) {
195
- this.value = val;
196
- }
197
- }
198
- openAsPopup() {
199
- if (!this._calendarPortal) {
200
- this._calendarPortal = new ComponentPortal(DaterangepickerComponent, this._viewContainerRef);
201
- }
202
- if (!this._popupRef) {
203
- this._createPopup();
204
- }
205
- if (!this._popupRef.hasAttached()) {
206
- this._popupComponentRef = this._popupRef.attach(this._calendarPortal);
207
- this.initializeListeners(this._popupComponentRef.instance);
208
- if (this.value) {
209
- this.setValueInDateComponent(this._popupComponentRef.instance, this.value);
210
- }
211
- this._ngZone.onStable.asObservable().pipe(take(1)).subscribe(() => {
212
- this._popupRef.updatePosition();
213
- });
214
- }
215
- }
216
- _createPopup() {
217
- const overlayConfig = new OverlayConfig({
218
- positionStrategy: this._createPopupPositionStrategy(),
219
- hasBackdrop: true,
220
- backdropClass: 'mat-overlay-transparent-backdrop',
221
- direction: 'ltr',
222
- panelClass: 'o-daterangepicker-popup',
223
- scrollStrategy: this.scrollStrategy.close()
224
- });
225
- this._popupRef = this._overlay.create(overlayConfig);
226
- this._popupRef.overlayElement.setAttribute('role', 'dialog');
227
- merge(this._popupRef.backdropClick(), this._popupRef.detachments(), this._popupRef.keydownEvents().pipe(filter(event => {
228
- return event.keyCode === ESCAPE ||
229
- (this._el && event.altKey && event.keyCode === UP_ARROW);
230
- }))).subscribe(() => this.close());
231
- }
232
- _createPopupPositionStrategy() {
233
- return this._overlay.position()
234
- .flexibleConnectedTo(this._el)
235
- .withViewportMargin(8)
236
- .withPositions([
237
- {
238
- originX: 'start',
239
- originY: 'bottom',
240
- overlayX: 'start',
241
- overlayY: 'top'
242
- },
243
- {
244
- originX: 'start',
245
- originY: 'top',
246
- overlayX: 'start',
247
- overlayY: 'bottom'
248
- },
249
- {
250
- originX: 'end',
251
- originY: 'bottom',
252
- overlayX: 'end',
253
- overlayY: 'top'
254
- },
255
- {
256
- originX: 'end',
257
- originY: 'top',
258
- overlayX: 'end',
259
- overlayY: 'bottom'
260
- }
261
- ]);
262
- }
263
- openAsDialog() {
264
- if (this._dialogRef) {
265
- this._dialogRef.close();
266
- }
267
- this._dialogRef = this._dialog.open(DaterangepickerComponent, {
268
- direction: 'ltr',
269
- viewContainerRef: this._viewContainerRef,
270
- panelClass: 'mat-datepicker-dialog',
271
- });
272
- this.initializeListeners(this._dialogRef.componentInstance);
273
- if (this.value) {
274
- this.setValueInDateComponent(this._dialogRef.componentInstance, this.value);
275
- }
276
- this._dialogRef.afterClosed().subscribe(() => this.close());
277
- }
278
- close() {
279
- if (this._popupRef && this._popupRef.hasAttached()) {
280
- this._popupRef.detach();
281
- }
282
- if (this._dialogRef) {
283
- this._dialogRef.close();
284
- }
285
- if (this._calendarPortal && this._calendarPortal.isAttached) {
286
- this._calendarPortal.detach();
287
- }
288
- }
289
- }
290
- ODaterangepickerDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODaterangepickerDirective, deps: [{ token: i1.MatDialog }, { token: i0.NgZone }, { token: i2.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.KeyValueDiffers }, { token: i2.ScrollStrategyOptions }], target: i0.ɵɵFactoryTarget.Directive });
291
- ODaterangepickerDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ODaterangepickerDirective, selector: "input[o-daterange-input]", inputs: { minDate: "minDate", maxDate: "maxDate", showCustomRangeLabel: "showCustomRangeLabel", linkedCalendars: "linkedCalendars", dateLimit: "dateLimit", singleDatePicker: "singleDatePicker", showWeekNumbers: "showWeekNumbers", showISOWeekNumbers: "showISOWeekNumbers", showDropdowns: "showDropdowns", isInvalidDate: "isInvalidDate", isCustomDate: "isCustomDate", opens: "opens", drops: "drops", lastMonthDayClass: "lastMonthDayClass", emptyWeekRowClass: "emptyWeekRowClass", firstDayOfNextMonthClass: "firstDayOfNextMonthClass", lastDayOfPreviousMonthClass: "lastDayOfPreviousMonthClass", keepCalendarOpeningWithRange: "keepCalendarOpeningWithRange", showRangeLabelOnInput: "showRangeLabelOnInput", showCancel: "showCancel", timePicker: "timePicker", showRanges: "showRanges", timePicker24Hour: "timePicker24Hour", timePickerIncrement: "timePickerIncrement", timePickerSeconds: "timePickerSeconds", separator: "separator", locale: "locale", _endKey: "_endKey", oTouchUi: "oTouchUi", startKey: "startKey", endKey: "endKey" }, outputs: { onChange: "onChange", rangeClicked: "rangeClicked", datesUpdated: "datesUpdated" }, host: { listeners: { "keyup.esc": "close()", "blur": "onBlur()" } }, providers: [
292
- {
293
- provide: NG_VALUE_ACCESSOR,
294
- useExisting: forwardRef(() => ODaterangepickerDirective), multi: true
295
- }
296
- ], ngImport: i0 });
297
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ODaterangepickerDirective, decorators: [{
298
- type: Directive,
299
- args: [{
300
- selector: 'input[o-daterange-input]',
301
- host: {
302
- '(keyup.esc)': 'close()',
303
- '(blur)': 'onBlur()'
304
- },
305
- providers: [
306
- {
307
- provide: NG_VALUE_ACCESSOR,
308
- useExisting: forwardRef(() => ODaterangepickerDirective), multi: true
309
- }
310
- ]
311
- }]
312
- }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i0.NgZone }, { type: i2.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.KeyValueDiffers }, { type: i2.ScrollStrategyOptions }]; }, propDecorators: { minDate: [{
313
- type: Input
314
- }], maxDate: [{
315
- type: Input
316
- }], showCustomRangeLabel: [{
317
- type: Input
318
- }], linkedCalendars: [{
319
- type: Input
320
- }], dateLimit: [{
321
- type: Input
322
- }], singleDatePicker: [{
323
- type: Input
324
- }], showWeekNumbers: [{
325
- type: Input
326
- }], showISOWeekNumbers: [{
327
- type: Input
328
- }], showDropdowns: [{
329
- type: Input
330
- }], isInvalidDate: [{
331
- type: Input
332
- }], isCustomDate: [{
333
- type: Input
334
- }], opens: [{
335
- type: Input
336
- }], drops: [{
337
- type: Input
338
- }], lastMonthDayClass: [{
339
- type: Input
340
- }], emptyWeekRowClass: [{
341
- type: Input
342
- }], firstDayOfNextMonthClass: [{
343
- type: Input
344
- }], lastDayOfPreviousMonthClass: [{
345
- type: Input
346
- }], keepCalendarOpeningWithRange: [{
347
- type: Input
348
- }], showRangeLabelOnInput: [{
349
- type: Input
350
- }], showCancel: [{
351
- type: Input
352
- }], timePicker: [{
353
- type: Input
354
- }], showRanges: [{
355
- type: Input
356
- }], timePicker24Hour: [{
357
- type: Input
358
- }], timePickerIncrement: [{
359
- type: Input
360
- }], timePickerSeconds: [{
361
- type: Input
362
- }], separator: [{
363
- type: Input
364
- }], locale: [{
365
- type: Input
366
- }], _endKey: [{
367
- type: Input
368
- }], oTouchUi: [{
369
- type: Input
370
- }], startKey: [{
371
- type: Input
372
- }], endKey: [{
373
- type: Input
374
- }], onChange: [{
375
- type: Output
376
- }], rangeClicked: [{
377
- type: Output
378
- }], datesUpdated: [{
379
- type: Output
380
- }] } });
381
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1kYXRlcmFuZ2UtaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb250aW1pemUtd2ViLW5neC9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvZGF0ZS1yYW5nZS9vLWRhdGVyYW5nZS1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBZ0MscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFnQixTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFrQixlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN0TSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQTtBQUMzQixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7QUFlMUUsTUFBTSxPQUFPLHlCQUF5QjtJQW9FcEMsSUFBYSxTQUFTLENBQUMsS0FBSztRQUMxQixJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDeEIs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Z0JBR04sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBR04sZUFBZTtzQkFEZCxLQUFLO2dCQUdOLGtCQUFrQjtzQkFEakIsS0FBSztnQkFHTixhQUFhO3NCQURaLEtBQUs7Z0JBR04sYUFBYTtzQkFEWixLQUFLO2dCQUdOLFlBQVk7c0JBRFgsS0FBSztnQkFPTixLQUFLO3NCQURKLEtBQUs7Z0JBR04sS0FBSztzQkFESixLQUFLO2dCQUlOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFHTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBR04sd0JBQXdCO3NCQUR2QixLQUFLO2dCQUdOLDJCQUEyQjtzQkFEMUIsS0FBSztnQkFHTiw0QkFBNEI7c0JBRDNCLEtBQUs7Z0JBR04scUJBQXFCO3NCQURwQixLQUFLO2dCQUdOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBR04sVUFBVTtzQkFEVCxLQUFLO2dCQUdOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUdOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFHTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBS08sU0FBUztzQkFBckIsS0FBSztnQkFTTyxNQUFNO3NCQUFsQixLQUFLO2dCQWFFLE9BQU87c0JBRGQsS0FBSztnQkFlTixRQUFRO3NCQURQLEtBQUs7Z0JBR08sUUFBUTtzQkFBcEIsS0FBSztnQkFVTyxNQUFNO3NCQUFsQixLQUFLO2dCQXdCSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVTQ0FQRSwgVVBfQVJST1cgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZiwgUG9zaXRpb25TdHJhdGVneSwgU2Nyb2xsU3RyYXRlZ3lPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50UmVmLCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIEtleVZhbHVlRGlmZmVyLCBLZXlWYWx1ZURpZmZlcnMsIE5nWm9uZSwgT3V0cHV0LCBWaWV3Q29udGFpbmVyUmVmLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGF0ZXJhbmdlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9vLWRhdGVyYW5nZS1waWNrZXIuY29tcG9uZW50JztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaW5wdXRbby1kYXRlcmFuZ2UtaW5wdXRdJyxcbiAgaG9zdDoge1xuICAgICcoa2V5dXAuZXNjKSc6ICdjbG9zZSgpJyxcbiAgICAnKGJsdXIpJzogJ29uQmx1cigpJ1xuICB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE9EYXRlcmFuZ2VwaWNrZXJEaXJlY3RpdmUpLCBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBPRGF0ZXJhbmdlcGlja2VyRGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICBwcml2YXRlIF9vbkNoYW5nZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuICBwdWJsaWMgX3ZhbGlkYXRvckNoYW5nZSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbiAgcHJpdmF0ZSBfdmFsdWU6IGFueTtcblxuICBwdWJsaWMgbG9jYWxlRGlmZmVyOiBLZXlWYWx1ZURpZmZlcjxzdHJpbmcsIGFueT47XG5cbiAgQElucHV0KClcbiAgbWluRGF0ZTogbW9tZW50Lk1vbWVudCA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIG1heERhdGU6IG1vbWVudC5Nb21lbnQgPSBudWxsO1xuICBASW5wdXQoKVxuICBzaG93Q3VzdG9tUmFuZ2VMYWJlbDogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgbGlua2VkQ2FsZW5kYXJzOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBkYXRlTGltaXQ6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpXG4gIHNpbmdsZURhdGVQaWNrZXI6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHNob3dXZWVrTnVtYmVyczogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgc2hvd0lTT1dlZWtOdW1iZXJzOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBzaG93RHJvcGRvd25zOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBpc0ludmFsaWREYXRlOiAoKSA9PiBib29sZWFuO1xuICBASW5wdXQoKVxuICBpc0N1c3RvbURhdGU6ICgpID0+IGJvb2xlYW47XG4gIC8vIEBJbnB1dCgpXG4gIC8vIHNob3dDbGVhckJ1dHRvbjogYm9vbGVhbjtcblxuXG4gIEBJbnB1dCgpXG4gIG9wZW5zOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIGRyb3BzOiBzdHJpbmc7XG4gIGZpcnN0TW9udGhEYXlDbGFzczogc3RyaW5nO1xuICBASW5wdXQoKVxuICBsYXN0TW9udGhEYXlDbGFzczogc3RyaW5nO1xuICBASW5wdXQoKVxuICBlbXB0eVdlZWtSb3dDbGFzczogc3RyaW5nO1xuICBASW5wdXQoKVxuICBmaXJzdERheU9mTmV4dE1vbnRoQ2xhc3M6IHN0cmluZztcbiAgQElucHV0KClcbiAgbGFzdERheU9mUHJldmlvdXNNb250aENsYXNzOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIGtlZXBDYWxlbmRhck9wZW5pbmdXaXRoUmFuZ2U6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHNob3dSYW5nZUxhYmVsT25JbnB1dDogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgc2hvd0NhbmNlbDogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyB0aW1lcGlja2VyIHZhcmlhYmxlc1xuICBASW5wdXQoKVxuICB0aW1lUGlja2VyOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIHNob3dSYW5nZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgdGltZVBpY2tlcjI0SG91cjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKVxuICB0aW1lUGlja2VySW5jcmVtZW50OiBudW1iZXIgPSAxO1xuICBASW5wdXQoKVxuICB0aW1lUGlja2VyU2Vjb25kczogYm9vbGVhbiA9IGZhbHNlO1xuICBfbG9jYWxlOiBhbnk7XG4gIF9zZXBhcmF0b3I6IHN0cmluZztcblxuICBASW5wdXQoKSBzZXQgc2VwYXJhdG9yKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9zZXBhcmF0b3IgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLl9sb2NhbGUpIHtcbiAgICAgICAgdGhpcy5fbG9jYWxlLnNlcGFyYXRvciA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBsb2NhbGUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2xvY2FsZSA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMuX3NlcGFyYXRvcikge1xuICAgICAgICB0aGlzLl9sb2NhbGUuc2VwYXJhdG9yID0gdGhpcy5fc2VwYXJhdG9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgbG9jYWxlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgX2VuZEtleTogc3RyaW5nID0gJ2VuZERhdGUnO1xuICBwcml2YXRlIF9zdGFydEtleTogc3RyaW5nID0gJ3N0YXJ0RGF0ZSc7XG5cbiAgcHVibGljIHJhbmdlczogYW55ID0ge1xuICAgICdEQVRFUkFOR0UudG9kYXknOiBbbW9tZW50KCksIG1vbWVudCgpXSxcbiAgICAnREFURVJBTkdFLnllc3RlcmRheSc6IFttb21lbnQoKS5zdWJ0cmFjdCgxLCAnZGF5cycpLCBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnZGF5cycpXSxcbiAgICAnREFURVJBTkdFLmxhc3RfN2RheXMnOiBbbW9tZW50KCkuc3VidHJhY3QoNiwgJ2RheXMnKSwgbW9tZW50KCldLFxuICAgICdEQVRFUkFOR0UubGFzdF8zMGRheXMnOiBbbW9tZW50KCkuc3VidHJhY3QoMjksICdkYXlzJyksIG1vbWVudCgpXSxcbiAgICAnREFURVJBTkdFLnRoaXNfbW9udGgnOiBbbW9tZW50KCkuc3RhcnRPZignbW9udGgnKSwgbW9tZW50KCkuZW5kT2YoJ21vbnRoJyldLFxuICAgICdEQVRFUkFOR0UubGFzdF9tb250aCc6IFttb21lbnQoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5zdGFydE9mKCdtb250aCcpLCBtb21lbnQoKS5zdWJ0cmFjdCgxLCAnbW9udGgnKS5lbmRPZignbW9udGgnKV0sXG4gICAgJ0RBVEVSQU5HRS50aGlzX3llYXInOiBbbW9tZW50KCkuc3RhcnRPZigneWVhcicpLCBtb21lbnQoKS5lbmRPZigneWVhcicpXVxuICB9O1xuXG4gIEBJbnB1dCgpXG4gIG9Ub3VjaFVpOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgc2V0IHN0YXJ0S2V5KHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9zdGFydEtleSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdGFydEtleSA9ICdzdGFydERhdGUnO1xuICAgIH1cbiAgfVxuICBnZXQgc3RhcnRLZXkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRLZXk7XG4gIH1cbiAgQElucHV0KCkgc2V0IGVuZEtleSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fZW5kS2V5ID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2VuZEtleSA9ICdlbmREYXRlJztcbiAgICB9XG4gIH1cbiAgZ2V0IGVuZEtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9lbmRLZXk7XG4gIH1cbiAgbm90Rm9yQ2hhbmdlc1Byb3BlcnR5OiBBcnJheTxzdHJpbmc+ID0gW1xuICAgICdsb2NhbGUnLFxuICAgICdlbmRLZXknLFxuICAgICdzdGFydEtleSdcbiAgXTtcblxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlIHx8IG51bGw7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbCkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgIHRoaXMuX29uQ2hhbmdlKHZhbCk7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgQE91dHB1dCgpIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8b2JqZWN0PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHJhbmdlQ2xpY2tlZDogRXZlbnRFbWl0dGVyPG9iamVjdD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBkYXRlc1VwZGF0ZWQ6IEV2ZW50RW1pdHRlcjxvYmplY3Q+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByaXZhdGUgX3BvcHVwQ29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8RGF0ZXJhbmdlcGlja2VyQ29tcG9uZW50PiB8IG51bGw7XG4gIHByaXZhdGUgX2NhbGVuZGFyUG9ydGFsOiBDb21wb25lbnRQb3J0YWw8RGF0ZXJhbmdlcGlja2VyQ29tcG9uZW50PjtcbiAgX3BvcHVwUmVmOiBPdmVybGF5UmVmO1xuICBwcml2YXRlIF9kaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxEYXRlcmFuZ2VwaWNrZXJDb21wb25lbnQ+IHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIF9vdmVybGF5OiBPdmVybGF5LFxuICAgIHB1YmxpYyBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwdWJsaWMgX2NoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwdWJsaWMgX2VsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgZGlmZmVyczogS2V5VmFsdWVEaWZmZXJzLFxuICAgIHByaXZhdGUgc2Nyb2xsU3RyYXRlZ3k6IFNjcm9sbFN0cmF0ZWd5T3B0aW9uc1xuICApIHtcbiAgICB0aGlzLmRyb3BzID0gJ2Rvd24nO1xuICAgIHRoaXMub3BlbnMgPSAncmlnaHQnO1xuICB9XG5cbiAgaW5pdGlhbGl6ZUxpc3RlbmVycyhpbnN0YW5jZSkge1xuICAgIGluc3RhbmNlLnJhbmdlQ2xpY2tlZC5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKHJhbmdlOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmFuZ2VDbGlja2VkLmVtaXQocmFuZ2UpO1xuICAgIH0pO1xuICAgIGluc3RhbmNlLmRhdGVzVXBkYXRlZC5hc09ic2VydmFibGUoKS5zdWJzY3JpYmUoKHJhbmdlOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuZGF0ZXNVcGRhdGVkLmVtaXQocmFuZ2UpO1xuICAgIH0pO1xuICAgIGluc3RhbmNlLmNob29zZWREYXRlLmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoY2hhbmdlOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGFuZ2UpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB7fTtcbiAgICAgICAgdmFsdWVbdGhpcy5fc3RhcnRLZXldID0gY2hhbmdlLnN0YXJ0RGF0ZTtcbiAgICAgICAgdmFsdWVbdGhpcy5fZW5kS2V5XSA9IGNoYW5nZS5lbmREYXRlO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICAgIGlmICh0eXBlb2YgY2hhbmdlLmNob3NlbkxhYmVsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMuX2VsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBjaGFuZ2UuY2hvc2VuTGFiZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbnN0YW5jZS5maXJzdE1vbnRoRGF5Q2xhc3MgPSB0aGlzLmZpcnN0TW9udGhEYXlDbGFzcztcbiAgICBpbnN0YW5jZS5sYXN0TW9udGhEYXlDbGFzcyA9IHRoaXMubGFzdE1vbnRoRGF5Q2xhc3M7XG4gICAgaW5zdGFuY2UuZW1wdHlXZWVrUm93Q2xhc3MgPSB0aGlzLmVtcHR5V2Vla1Jvd0NsYXNzO1xuICAgIGluc3RhbmNlLmZpcnN0RGF5T2ZOZXh0TW9udGhDbGFzcyA9IHRoaXMuZmlyc3REYXlPZk5leHRNb250aENsYXNzO1xuICAgIGluc3RhbmNlLmxhc3REYXlPZlByZXZpb3VzTW9udGhDbGFzcyA9IHRoaXMubGFzdERheU9mUHJldmlvdXNNb250aENsYXNzO1xuICAgIGluc3RhbmNlLmRyb3BzID0gdGhpcy5kcm9wcztcbiAgICBpbnN0YW5jZS5vcGVucyA9IHRoaXMub3BlbnM7XG4gICAgaW5zdGFuY2UubWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcbiAgICBpbnN0YW5jZS5tYXhEYXRlID0gdGhpcy5tYXhEYXRlO1xuICAgIGluc3RhbmNlLmxvY2FsZSA9IHRoaXMubG9jYWxlO1xuICAgIGluc3RhbmNlLnNob3dXZWVrTnVtYmVycyA9IHRoaXMuc2hvd1dlZWtOdW1iZXJzO1xuICAgIGluc3RhbmNlLnNpbmdsZURhdGVQaWNrZXIgPSB0aGlzLnNpbmdsZURhdGVQaWNrZXI7XG5cbiAgICBpZiAodGhpcy5zaG93UmFuZ2VzKSB7XG4gICAgICBpbnN0YW5jZS5yYW5nZXMgPSB0aGlzLnJhbmdlcztcbiAgICAgIGluc3RhbmNlLmtlZXBDYWxlbmRhck9wZW5pbmdXaXRoUmFuZ2UgPSB0cnVlO1xuICAgICAgaW5zdGFuY2UuYWx3YXlzU2hvd0NhbGVuZGFycyA9IHRydWU7XG4gICAgfVxuICAgIHRoaXMubG9jYWxlRGlmZmVyID0gdGhpcy5kaWZmZXJzLmZpbmQodGhpcy5sb2NhbGUpLmNyZWF0ZSgpO1xuICB9XG5cbiAgLy8gbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQgIHtcbiAgLy8gICBmb3IgKGxldCBjaGFuZ2UgaW4gY2hhbmdlcykge1xuICAvLyAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoY2hhbmdlKSkge1xuICAvLyAgICAgICBpZiAodGhpcy5ub3RGb3JDaGFuZ2VzUHJvcGVydHkuaW5kZXhPZihjaGFuZ2UpID09PSAtMSkge1xuICAvLyAgICAgICAgIHRoaXMucGlja2VyW2NoYW5nZV0gPSBjaGFuZ2VzW2NoYW5nZV0uY3VycmVudFZhbHVlO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgLy8gbmdEb0NoZWNrKCkge1xuICAvLyAgIGlmICh0aGlzLmxvY2FsZURpZmZlcikge1xuICAvLyAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMubG9jYWxlRGlmZmVyLmRpZmYodGhpcy5sb2NhbGUpO1xuICAvLyAgICAgaWYgKGNoYW5nZXMpIHtcbiAgLy8gICAgICAgdGhpcy5waWNrZXIudXBkYXRlTG9jYWxlKHRoaXMubG9jYWxlKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cblxuICBvbkJsdXIoKSB7XG4gICAgdGhpcy5fb25Ub3VjaGVkKCk7XG4gIH1cblxuICBvcGVuKCkge1xuICAgIGlmICghdGhpcy5vVG91Y2hVaSkge1xuICAgICAgdGhpcy5vcGVuQXNQb3B1cCgpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3BlbkFzRGlhbG9nKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5jbG9zZSgpO1xuXG4gICAgaWYgKHRoaXMuX3BvcHVwUmVmKSB7XG4gICAgICB0aGlzLl9wb3B1cFJlZi5kaXNwb3NlKCk7XG4gICAgICB0aGlzLl9wb3B1cENvbXBvbmVudFJlZiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5fcG9wdXBDb21wb25lbnRSZWYuaW5zdGFuY2UuY2xlYXIoKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWUpIHtcbiAgICB0aGlzLnNldFZhbHVlKHZhbHVlKTtcbiAgfVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7XG4gICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcbiAgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbikge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0VmFsdWVJbkRhdGVDb21wb25lbnQoaW5zdGFuY2UsIHZhbCkge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIGlmICh2YWxbdGhpcy5fc3RhcnRLZXldKSB7XG4gICAgICAgIGluc3RhbmNlLnNldFN0YXJ0RGF0ZSh2YWxbdGhpcy5fc3RhcnRLZXldKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxbdGhpcy5fZW5kS2V5XSkge1xuICAgICAgICBpbnN0YW5jZS5zZXRFbmREYXRlKHZhbFt0aGlzLl9lbmRLZXldKTtcbiAgICAgIH1cbiAgICAgIGluc3RhbmNlLmNhbGN1bGF0ZUNob3NlbkxhYmVsKCk7XG4gICAgICBpZiAoaW5zdGFuY2UuY2hvc2VuTGFiZWwpIHtcbiAgICAgICAgdGhpcy5fZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IGluc3RhbmNlLmNob3NlbkxhYmVsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS5jbGVhcigpO1xuICAgIH1cblxuICB9XG4gIHByaXZhdGUgc2V0VmFsdWUodmFsOiBhbnkpIHtcbiAgICBpZiAodmFsKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsO1xuXG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBTZXQgcG9zaXRpb24gb2YgdGhlIGNhbGVuZGFyXG4gICAqL1xuICAvLyBzZXRQb3NpdGlvbigpIHtcbiAgLy8gICBsZXQgc3R5bGU7XG4gIC8vICAgbGV0IGNvbnRhaW5lclRvcDtcbiAgLy8gICBjb25zdCBjb250YWluZXIgPSB0aGlzLnBpY2tlci5waWNrZXJDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgLy8gICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWwubmF0aXZlRWxlbWVudDtcbiAgLy8gICBpZiAodGhpcy5kcm9wcyAmJiB0aGlzLmRyb3BzID09ICd1cCcpIHtcbiAgLy8gICAgIGNvbnRhaW5lclRvcCA9IChlbGVtZW50Lm9mZnNldFRvcCAtIGNvbnRhaW5lci5jbGllbnRIZWlnaHQpICsgJ3B4JztcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgY29udGFpbmVyVG9wID0gJ2F1dG8nO1xuICAvLyAgIH1cbiAgLy8gICBpZiAodGhpcy5vcGVucyA9PSAnbGVmdCcpIHtcbiAgLy8gICAgIHN0eWxlID0ge1xuICAvLyAgICAgICAgIHRvcDogY29udGFpbmVyVG9wLFxuICAvLyAgICAgICAgIGxlZnQ6IChlbGVtZW50Lm9mZnNldExlZnQgLSBjb250YWluZXIuY2xpZW50V2lkdGggKyBlbGVtZW50LmNsaWVudFdpZHRoKSArICdweCcsXG4gIC8vICAgICAgICAgcmlnaHQ6ICdhdXRvJ1xuICAvLyAgICAgfTtcbiAgLy8gICB9IGVsc2UgaWYgKHRoaXMub3BlbnMgPT0gJ2NlbnRlcicpIHtcbiAgLy8gICAgICAgc3R5bGUgPSB7XG4gIC8vICAgICAgICAgdG9wOiBjb250YWluZXJUb3AsXG4gIC8vICAgICAgICAgbGVmdDogKGVsZW1lbnQub2Zmc2V0TGVmdCAgKyAgZWxlbWVudC5jbGllbnRXaWR0aCAvIDJcbiAgLy8gICAgICAgICAgICAgICAgIC0gY29udGFpbmVyLmNsaWVudFdpZHRoIC8gMikgKyAncHgnLFxuICAvLyAgICAgICAgIHJpZ2h0OiAnYXV0bydcbiAgLy8gICAgICAgfTtcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgICBzdHlsZSA9IHtcbiAgLy8gICAgICAgICB0b3A6IGNvbnRhaW5lclRvcCxcbiAgLy8gICAgICAgICBsZWZ0OiBlbGVtZW50Lm9mZnNldExlZnQgICsgJ3B4JyxcbiAgLy8gICAgICAgICByaWdodDogJ2F1dG8nXG4gIC8vICAgICAgIH1cbiAgLy8gICB9XG4gIC8vICAgaWYgKHN0eWxlKSB7XG4gIC8vICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShjb250YWluZXIsICd0b3AnLCBzdHlsZS50b3ApO1xuICAvLyAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAnbGVmdCcsIHN0eWxlLmxlZnQpO1xuICAvLyAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoY29udGFpbmVyLCAncmlnaHQnLCBzdHlsZS5yaWdodCk7XG4gIC8vICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShjb250YWluZXIsICdwb3NpdGlvbicsICdmaXhlZCcpO1xuICAvLyAgIH1cbiAgLy8gfVxuICAvKipcbiAgICogRm9yIGNsaWNrIG91dHNpZGUgb2YgdGhlIGNhbGVuZGFyJ3MgY29udGFpbmVyXG4gICAqIEBwYXJhbSBldmVudCBldmVudCBvYmplY3RcbiAgICogQHBhcmFtIHRhcmdldEVsZW1lbnQgdGFyZ2V0IGVsZW1lbnQgb2JqZWN0XG4gICAqL1xuICAvLyBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50JywgJyRldmVudC50YXJnZXQnXSlcbiAgLy8gb3V0c2lkZUNsaWNrKGV2ZW50LCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAvLyAgICAgaWYgKCF0YXJnZXRFbGVtZW50KSB7XG4gIC8vICAgICAgIHJldHVybjtcbiAgLy8gICAgIH1cbiAgLy8gICAgIGlmICh0YXJnZXRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbmd4LWRhdGVyYW5nZXBpY2tlci1hY3Rpb24nKSkge1xuICAvLyAgICAgICByZXR1cm47XG4gIC8vICAgICB9XG4gIC8vICAgICBjb25zdCBjbGlja2VkSW5zaWRlID0gdGhpcy5fZWwubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXRFbGVtZW50KTtcbiAgLy8gICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xuICAvLyAgICAgICAgdGhpcy5oaWRlKClcbiAgLy8gICAgIH1cbiAgLy8gfVxuXG5cblxuICAvKiogKi9cbiAgcHVibGljIG9wZW5Bc1BvcHVwKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY2FsZW5kYXJQb3J0YWwpIHtcbiAgICAgIHRoaXMuX2NhbGVuZGFyUG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbDxEYXRlcmFuZ2VwaWNrZXJDb21wb25lbnQ+KERhdGVyYW5nZXBpY2tlckNvbXBvbmVudCxcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZik7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9wb3B1cFJlZikge1xuICAgICAgdGhpcy5fY3JlYXRlUG9wdXAoKTtcbiAgICB9XG5cblxuICAgIGlmICghdGhpcy5fcG9wdXBSZWYuaGFzQXR0YWNoZWQoKSkge1xuICAgICAgdGhpcy5fcG9wdXBDb21wb25lbnRSZWYgPSB0aGlzLl9wb3B1cFJlZi5hdHRhY2godGhpcy5fY2FsZW5kYXJQb3J0YWwpO1xuICAgICAgdGhpcy5pbml0aWFsaXplTGlzdGVuZXJzKHRoaXMuX3BvcHVwQ29tcG9uZW50UmVmLmluc3RhbmNlKTtcbiAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0VmFsdWVJbkRhdGVDb21wb25lbnQodGhpcy5fcG9wdXBDb21wb25lbnRSZWYuaW5zdGFuY2UsIHRoaXMudmFsdWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9uY2UgdGhlIGNhbGVuZGFyIGhhcyByZW5kZXJlZC5cbiAgICAgIHRoaXMuX25nWm9uZS5vblN0YWJsZS5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3BvcHVwUmVmLnVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLyoqIENyZWF0ZSB0aGUgcG9wdXAuICovXG4gIHByaXZhdGUgX2NyZWF0ZVBvcHVwKCk6IHZvaWQge1xuICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLl9jcmVhdGVQb3B1cFBvc2l0aW9uU3RyYXRlZ3koKSxcbiAgICAgIGhhc0JhY2tkcm9wOiB0cnVlLFxuICAgICAgYmFja2Ryb3BDbGFzczogJ21hdC1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJyxcbiAgICAgIGRpcmVjdGlvbjogJ2x0cicsXG4gICAgICBwYW5lbENsYXNzOiAnby1kYXRlcmFuZ2VwaWNrZXItcG9wdXAnLFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuc2Nyb2xsU3RyYXRlZ3kuY2xvc2UoKVxuICAgIH0pO1xuXG4gICAgdGhpcy5fcG9wdXBSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZShvdmVybGF5Q29uZmlnKTtcbiAgICB0aGlzLl9wb3B1cFJlZi5vdmVybGF5RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnZGlhbG9nJyk7XG5cbiAgICBtZXJnZShcbiAgICAgIHRoaXMuX3BvcHVwUmVmLmJhY2tkcm9wQ2xpY2soKSxcbiAgICAgIHRoaXMuX3BvcHVwUmVmLmRldGFjaG1lbnRzKCksXG4gICAgICB0aGlzLl9wb3B1cFJlZi5rZXlkb3duRXZlbnRzKCkucGlwZShmaWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgICAvLyBDbG9zaW5nIG9uIGFsdCArIHVwIGlzIG9ubHkgdmFsaWQgd2hlbiB0aGVyZSdzIGFuIGlucHV0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0ZXBpY2tlci5cbiAgICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSB8fFxuICAgICAgICAgICh0aGlzLl9lbCAmJiBldmVudC5hbHRLZXkgJiYgZXZlbnQua2V5Q29kZSA9PT0gVVBfQVJST1cpO1xuICAgICAgfSkpXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbG9zZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVBvcHVwUG9zaXRpb25TdHJhdGVneSgpOiBQb3NpdGlvblN0cmF0ZWd5IHtcbiAgICByZXR1cm4gdGhpcy5fb3ZlcmxheS5wb3NpdGlvbigpXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9lbClcbiAgICAgIC8vIC53aXRoVHJhbnNmb3JtT3JpZ2luT24oJy5tYXQtZGF0ZXBpY2tlci1jb250ZW50JylcbiAgICAgIC8vIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgLndpdGhWaWV3cG9ydE1hcmdpbig4KVxuICAgICAgLy8gLndpdGhMb2NrZWRQb3NpdGlvbigpXG4gICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgIHtcbiAgICAgICAgICBvcmlnaW5YOiAnc3RhcnQnLFxuICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLFxuICAgICAgICAgIG92ZXJsYXlZOiAndG9wJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcbiAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICdib3R0b20nLFxuICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcbiAgICAgICAgICBvdmVybGF5WTogJ3RvcCdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG9yaWdpblg6ICdlbmQnLFxuICAgICAgICAgIG9yaWdpblk6ICd0b3AnLFxuICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJyxcbiAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbSdcbiAgICAgICAgfVxuICAgICAgXSk7XG4gIH1cblxuXG4gIC8qKiBPcGVuIHRoZSBjYWxlbmRhciBhcyBhIGRpYWxvZy4gKi9cbiAgcHVibGljIG9wZW5Bc0RpYWxvZygpOiB2b2lkIHtcbiAgICAvLyBVc3VhbGx5IHRoaXMgd291bGQgYmUgaGFuZGxlZCBieSBgb3BlbmAgd2hpY2ggZW5zdXJlcyB0aGF0IHdlIGNhbiBvbmx5IGhhdmUgb25lIG92ZXJsYXlcbiAgICAvLyBvcGVuIGF0IGEgdGltZSwgaG93ZXZlciBzaW5jZSB3ZSByZXNldCB0aGUgdmFyaWFibGVzIGluIGFzeW5jIGhhbmRsZXJzIHNvbWUgb3ZlcmxheXNcbiAgICAvLyBtYXkgc2xpcCB0aHJvdWdoIGlmIHRoZSB1c2VyIG9wZW5zIGFuZCBjbG9zZXMgbXVsdGlwbGUgdGltZXMgaW4gcXVpY2sgc3VjY2Vzc2lvbiAoZS5nLlxuICAgIC8vIGJ5IGhvbGRpbmcgZG93biB0aGUgZW50ZXIga2V5KS5cbiAgICBpZiAodGhpcy5fZGlhbG9nUmVmKSB7XG4gICAgICB0aGlzLl9kaWFsb2dSZWYuY2xvc2UoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kaWFsb2dSZWYgPSB0aGlzLl9kaWFsb2cub3BlbjxEYXRlcmFuZ2VwaWNrZXJDb21wb25lbnQ+KERhdGVyYW5nZXBpY2tlckNvbXBvbmVudCwge1xuICAgICAgZGlyZWN0aW9uOiAnbHRyJyxcbiAgICAgIHZpZXdDb250YWluZXJSZWY6IHRoaXMuX3ZpZXdDb250YWluZXJSZWYsXG4gICAgICBwYW5lbENsYXNzOiAnbWF0LWRhdGVwaWNrZXItZGlhbG9nJyxcbiAgICB9KTtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZUxpc3RlbmVycyh0aGlzLl9kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UpO1xuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLnNldFZhbHVlSW5EYXRlQ29tcG9uZW50KHRoaXMuX2RpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZSwgdGhpcy52YWx1ZSk7XG4gICAgfVxuICAgIHRoaXMuX2RpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNsb3NlKCkpO1xuICAgIC8vIHRoaXMuX2RpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS4gPSB0aGlzO1xuXG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcG9wdXBSZWYgJiYgdGhpcy5fcG9wdXBSZWYuaGFzQXR0YWNoZWQoKSkge1xuICAgICAgdGhpcy5fcG9wdXBSZWYuZGV0YWNoKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RpYWxvZ1JlZikge1xuICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NhbGVuZGFyUG9ydGFsICYmIHRoaXMuX2NhbGVuZGFyUG9ydGFsLmlzQXR0YWNoZWQpIHtcbiAgICAgIHRoaXMuX2NhbGVuZGFyUG9ydGFsLmRldGFjaCgpO1xuICAgIH1cbiAgfVxufVxuIl19