@bryntum/scheduler-angular-thin 7.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -0
- package/bryntum-scheduler-angular-thin.d.ts +5 -0
- package/bundles/bryntum-scheduler-angular-thin.umd.js +18832 -0
- package/bundles/bryntum-scheduler-angular-thin.umd.js.map +1 -0
- package/esm2015/bryntum-scheduler-angular-thin.js +5 -0
- package/esm2015/lib/bryntum-event-color-field.component.js +795 -0
- package/esm2015/lib/bryntum-project-combo.component.js +937 -0
- package/esm2015/lib/bryntum-resource-combo.component.js +937 -0
- package/esm2015/lib/bryntum-resource-filter.component.js +743 -0
- package/esm2015/lib/bryntum-scheduler-base.component.js +4589 -0
- package/esm2015/lib/bryntum-scheduler-date-picker.component.js +1021 -0
- package/esm2015/lib/bryntum-scheduler-project-model.component.js +365 -0
- package/esm2015/lib/bryntum-scheduler.component.js +4593 -0
- package/esm2015/lib/bryntum-timeline-histogram.component.js +2888 -0
- package/esm2015/lib/bryntum-undo-redo.component.js +698 -0
- package/esm2015/lib/bryntum-view-preset-combo.component.js +746 -0
- package/esm2015/lib/scheduler.module.js +74 -0
- package/esm2015/lib/wrapper.helper.js +74 -0
- package/esm2015/public-api.js +16 -0
- package/fesm2015/bryntum-scheduler-angular-thin.js +18371 -0
- package/fesm2015/bryntum-scheduler-angular-thin.js.map +1 -0
- package/lib/bryntum-event-color-field.component.d.ts +966 -0
- package/lib/bryntum-project-combo.component.d.ts +1202 -0
- package/lib/bryntum-resource-combo.component.d.ts +1205 -0
- package/lib/bryntum-resource-filter.component.d.ts +888 -0
- package/lib/bryntum-scheduler-base.component.d.ts +5014 -0
- package/lib/bryntum-scheduler-date-picker.component.d.ts +1363 -0
- package/lib/bryntum-scheduler-project-model.component.d.ts +392 -0
- package/lib/bryntum-scheduler.component.d.ts +5016 -0
- package/lib/bryntum-timeline-histogram.component.d.ts +3312 -0
- package/lib/bryntum-undo-redo.component.d.ts +847 -0
- package/lib/bryntum-view-preset-combo.component.d.ts +885 -0
- package/lib/scheduler.module.d.ts +17 -0
- package/lib/wrapper.helper.d.ts +26 -0
- package/package.json +33 -0
- package/public-api.d.ts +12 -0
|
@@ -0,0 +1,2888 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
/**
|
|
3
|
+
* Angular wrapper for Bryntum TimelineHistogram
|
|
4
|
+
*/
|
|
5
|
+
import { Component, EventEmitter, Output, Input } from '@angular/core';
|
|
6
|
+
import WrapperHelper from './wrapper.helper';
|
|
7
|
+
import { Widget } from '@bryntum/core-thin';
|
|
8
|
+
import { TimelineHistogram } from '@bryntum/scheduler-thin';
|
|
9
|
+
import { StringHelper } from '@bryntum/core-thin';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
export class BryntumTimelineHistogramComponent {
|
|
12
|
+
constructor(element) {
|
|
13
|
+
this.bryntumConfig = {
|
|
14
|
+
adopt: undefined,
|
|
15
|
+
appendTo: undefined,
|
|
16
|
+
href: undefined,
|
|
17
|
+
angularComponent: this,
|
|
18
|
+
features: {},
|
|
19
|
+
listeners: {}
|
|
20
|
+
};
|
|
21
|
+
// Events emitters
|
|
22
|
+
/**
|
|
23
|
+
* Fires before an assignment is removed. Can be triggered by user pressing [DELETE] or [BACKSPACE] or
|
|
24
|
+
* by the event editor. Can for example be used to display a custom dialog to confirm deletion, in which
|
|
25
|
+
* case records should be "manually" removed after confirmation:
|
|
26
|
+
* ...
|
|
27
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-beforeAssignmentDelete)
|
|
28
|
+
* @param {object} event Event object
|
|
29
|
+
* @param {Scheduler.view.Scheduler} event.source The Scheduler instance
|
|
30
|
+
* @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The assignment records about to be deleted
|
|
31
|
+
* @param {object} event.context Additional removal context:
|
|
32
|
+
* @param {Function} event.context.finalize Function to call to finalize the removal. Used to asynchronously decide to remove the records or not. Provide `false` to the function to prevent the removal.
|
|
33
|
+
* @param {boolean} event.context.finalize.removeRecords Provide `false` to the function to prevent the removal.
|
|
34
|
+
*/
|
|
35
|
+
this.onBeforeAssignmentDelete = new EventEmitter();
|
|
36
|
+
/**
|
|
37
|
+
* Fires on the owning Grid before the cell editing is canceled, return `false` to prevent cancellation.
|
|
38
|
+
* @param {object} event Event object
|
|
39
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
40
|
+
* @param {Grid.util.GridLocation} event.editorContext Editing context
|
|
41
|
+
*/
|
|
42
|
+
this.onBeforeCancelCellEdit = new EventEmitter();
|
|
43
|
+
/**
|
|
44
|
+
* Fires on the owning Grid before the row editing is canceled, return false to signal that the value is invalid and editing should not be finalized.
|
|
45
|
+
* ...
|
|
46
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-beforeCancelRowEdit)
|
|
47
|
+
* @param {object} event Event object
|
|
48
|
+
* @param {Grid.view.Grid} event.grid Target grid
|
|
49
|
+
* @param {RowEditorContext} event.editorContext Editing context
|
|
50
|
+
*/
|
|
51
|
+
this.onBeforeCancelRowEdit = new EventEmitter();
|
|
52
|
+
/**
|
|
53
|
+
* Fires on the owning Grid before editing starts, return `false` to prevent editing
|
|
54
|
+
* @param {object} event Event object
|
|
55
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
56
|
+
* @param {CellEditorContext} event.editorContext Editing context
|
|
57
|
+
*/
|
|
58
|
+
this.onBeforeCellEditStart = new EventEmitter();
|
|
59
|
+
/**
|
|
60
|
+
* Fires on the owning Grid before deleting a range of selected cell values by pressing `Backspace` or `Del`
|
|
61
|
+
* buttons while [autoEdit](https://bryntum.com/products/scheduler/docs/api/Grid/feature/CellEdit#config-autoEdit) is set to `true`. Return `false` to prevent editing.
|
|
62
|
+
* @param {object} event Event object
|
|
63
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
64
|
+
* @param {(Grid.util.GridLocation|Core.data.Model)[]} event.gridSelection An array of cell selectors or records that will have their values deleted (the records themselves will not get deleted, only visible column values).
|
|
65
|
+
*/
|
|
66
|
+
this.onBeforeCellRangeDelete = new EventEmitter();
|
|
67
|
+
/**
|
|
68
|
+
* Fires for each selected record on the owning Grid before editing a range of selected cell values
|
|
69
|
+
* @param {object} event Event object
|
|
70
|
+
* @param {Core.data.Model} event.record Current selected record from the range
|
|
71
|
+
* @param {string} event.field The field being changed
|
|
72
|
+
* @param {any} event.value The value being set
|
|
73
|
+
*/
|
|
74
|
+
this.onBeforeCellRangeEdit = new EventEmitter();
|
|
75
|
+
/**
|
|
76
|
+
* This event is fired prior to starting a column drag gesture. The drag is canceled if a listener returns `false`.
|
|
77
|
+
* @param {object} event Event object
|
|
78
|
+
* @param {Grid.view.Grid} event.source The grid instance.
|
|
79
|
+
* @param {Grid.column.Column} event.column The dragged column.
|
|
80
|
+
* @param {Event} event.event The browser event.
|
|
81
|
+
*/
|
|
82
|
+
this.onBeforeColumnDragStart = new EventEmitter();
|
|
83
|
+
/**
|
|
84
|
+
* This event is fired when a column is dropped, and you can return false from a listener to abort the operation.
|
|
85
|
+
* @param {object} event Event object
|
|
86
|
+
* @param {Grid.view.Grid} event.source The grid instance.
|
|
87
|
+
* @param {Grid.column.Column} event.column The dragged column.
|
|
88
|
+
* @param {Grid.column.Column} event.insertBefore The column before which the dragged column will be inserted.
|
|
89
|
+
* @param {Grid.column.Column} event.newParent The new parent column.
|
|
90
|
+
* @param {Event} event.event The browser event.
|
|
91
|
+
* @param {string} event.region The region where the column was dropped.
|
|
92
|
+
*/
|
|
93
|
+
this.onBeforeColumnDropFinalize = new EventEmitter();
|
|
94
|
+
/**
|
|
95
|
+
* This event is fired prior to starting a column resize gesture. The resize is canceled if a listener returns
|
|
96
|
+
* `false`.
|
|
97
|
+
* @param {object} event Event object
|
|
98
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
99
|
+
* @param {Grid.column.Column} event.column The column
|
|
100
|
+
* @param {Event} event.domEvent The browser event
|
|
101
|
+
*/
|
|
102
|
+
this.onBeforeColumnResize = new EventEmitter();
|
|
103
|
+
/**
|
|
104
|
+
* Fires on the owning Grid before a copy action is performed, return `false` to prevent the action
|
|
105
|
+
* @param {object} event Event object
|
|
106
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
107
|
+
* @param {Grid.util.GridLocation[]} event.cells The cells about to be copied or cut
|
|
108
|
+
* @param {string} event.data The string data about to be copied or cut
|
|
109
|
+
* @param {boolean} event.isCut `true` if this is a cut action
|
|
110
|
+
* @param {string} event.entityName 'cell' to distinguish this event from other beforeCopy events
|
|
111
|
+
*/
|
|
112
|
+
this.onBeforeCopy = new EventEmitter();
|
|
113
|
+
/**
|
|
114
|
+
* Fires on the owning Grid before CSV export starts. Return `false` to cancel the export.
|
|
115
|
+
* @param {object} event Event object
|
|
116
|
+
* @param {ExportConfig} event.config Export config
|
|
117
|
+
* @param {Grid.column.Column[]} event.columns An array of columns to export
|
|
118
|
+
* @param {Core.data.Model[]} event.rows An array of records to export
|
|
119
|
+
* @param {string} event.lineDelimiter The CSV delimiter to separate lines
|
|
120
|
+
* @param {string} event.columnDelimiter The CSV delimiter to separate values on one line
|
|
121
|
+
*/
|
|
122
|
+
this.onBeforeCSVExport = new EventEmitter();
|
|
123
|
+
/**
|
|
124
|
+
* Fires before an object is destroyed.
|
|
125
|
+
* @param {object} event Event object
|
|
126
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
127
|
+
*/
|
|
128
|
+
this.onBeforeDestroy = new EventEmitter();
|
|
129
|
+
/**
|
|
130
|
+
* Fires before an event is removed. Can be triggered by user pressing [DELETE] or [BACKSPACE] or by the
|
|
131
|
+
* event editor. Return `false` to immediately veto the removal (or a `Promise` yielding `true` or `false`
|
|
132
|
+
* for async vetoing).
|
|
133
|
+
* ...
|
|
134
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-beforeEventDelete)
|
|
135
|
+
* @param {object} event Event object
|
|
136
|
+
* @param {Scheduler.view.Scheduler,any} event.source The Scheduler instance
|
|
137
|
+
* @param {Scheduler.model.EventModel[]} event.eventRecords The records about to be deleted
|
|
138
|
+
* @param {object} event.context Additional removal context:
|
|
139
|
+
* @param {Function} event.context.finalize Function to call to finalize the removal. Used to asynchronously decide to remove the records or not. Provide `false` to the function to prevent the removal.
|
|
140
|
+
* @param {boolean} event.context.finalize.removeRecords Provide `false` to the function to prevent the removal.
|
|
141
|
+
*/
|
|
142
|
+
this.onBeforeEventDelete = new EventEmitter();
|
|
143
|
+
/**
|
|
144
|
+
* Fires on the owning Grid before Excel export starts. Return `false` to cancel the export.
|
|
145
|
+
* @param {object} event Event object
|
|
146
|
+
* @param {ExportConfig} event.config Export config
|
|
147
|
+
* @param {XLSColumn[]} event.columns An array of columns to export
|
|
148
|
+
* @param {any[][]} event.rows An array of records to export
|
|
149
|
+
*/
|
|
150
|
+
this.onBeforeExcelExport = new EventEmitter();
|
|
151
|
+
/**
|
|
152
|
+
* Fired before dragging of the FillHandle starts, return `false` to prevent the drag operation.
|
|
153
|
+
* @param {object} event Event object
|
|
154
|
+
* @param {Grid.util.GridLocation} event.cell Information about the column / record
|
|
155
|
+
* @param {MouseEvent} event.domEvent The raw DOM event
|
|
156
|
+
*/
|
|
157
|
+
this.onBeforeFillHandleDragStart = new EventEmitter();
|
|
158
|
+
/**
|
|
159
|
+
* Fires on the owning Grid before the cell editing is finished, return false to signal that the value is invalid and editing should not be finalized.
|
|
160
|
+
* @param {object} event Event object
|
|
161
|
+
* @param {Grid.view.Grid} event.grid Target grid
|
|
162
|
+
* @param {CellEditorContext} event.editorContext Editing context
|
|
163
|
+
*/
|
|
164
|
+
this.onBeforeFinishCellEdit = new EventEmitter();
|
|
165
|
+
/**
|
|
166
|
+
* Fires on the owning Grid before the row editing is finished, return false to signal that the value is invalid and editing should not be finalized.
|
|
167
|
+
* ...
|
|
168
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-beforeFinishRowEdit)
|
|
169
|
+
* @param {object} event Event object
|
|
170
|
+
* @param {Grid.view.Grid} event.grid Target grid
|
|
171
|
+
* @param {RowEditorContext} event.editorContext Editing context
|
|
172
|
+
*/
|
|
173
|
+
this.onBeforeFinishRowEdit = new EventEmitter();
|
|
174
|
+
/**
|
|
175
|
+
* Triggered before a widget is hidden. Return `false` to prevent the action.
|
|
176
|
+
* @param {object} event Event object
|
|
177
|
+
* @param {Core.widget.Widget} event.source The widget being hidden.
|
|
178
|
+
*/
|
|
179
|
+
this.onBeforeHide = new EventEmitter();
|
|
180
|
+
/**
|
|
181
|
+
* Fires before the component stores a record's histogram data into the cache.
|
|
182
|
+
* ...
|
|
183
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-beforeHistogramDataCacheSet)
|
|
184
|
+
* @param {object} event Event object
|
|
185
|
+
* @param {Scheduler.view.TimelineHistogram} event.source The component instance
|
|
186
|
+
* @param {Core.data.Model} event.record Record the histogram data of which is ready.
|
|
187
|
+
* @param {object} event.data The record histogram data.
|
|
188
|
+
*/
|
|
189
|
+
this.onBeforeHistogramDataCacheSet = new EventEmitter();
|
|
190
|
+
/**
|
|
191
|
+
* Fires on the owning Scheduler or Gantt widget before pan starts. Return `false` to prevent the operation.
|
|
192
|
+
* @param {object} event Event object
|
|
193
|
+
* @param {Event} event.event The native browser DOM event
|
|
194
|
+
*/
|
|
195
|
+
this.onBeforePan = new EventEmitter();
|
|
196
|
+
/**
|
|
197
|
+
* Fires on the owning Grid before a paste action is performed, return `false` to prevent the action
|
|
198
|
+
* @param {object} event Event object
|
|
199
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
200
|
+
* @param {string} event.clipboardData The clipboardData about to be pasted
|
|
201
|
+
* @param {Grid.util.GridLocation} event.targetCell The cell from which the paste will be started
|
|
202
|
+
* @param {string} event.entityName 'cell' to distinguish this event from other beforePaste events
|
|
203
|
+
* @param {string} event.text The raw text from clipboard
|
|
204
|
+
*/
|
|
205
|
+
this.onBeforePaste = new EventEmitter();
|
|
206
|
+
/**
|
|
207
|
+
* Fires on the owning Grid before export started. Return `false` to cancel the export.
|
|
208
|
+
* @param {object} event Event object
|
|
209
|
+
* @param {object} event.config Export config
|
|
210
|
+
*/
|
|
211
|
+
this.onBeforePdfExport = new EventEmitter();
|
|
212
|
+
/**
|
|
213
|
+
* Fired before the [viewPreset](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/mixin/TimelineViewPresets#config-viewPreset) is changed.
|
|
214
|
+
* @param {object} event Event object
|
|
215
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler instance.
|
|
216
|
+
* @param {Date} event.startDate The new start date of the timeline.
|
|
217
|
+
* @param {Date} event.endDate The new end date of the timeline.
|
|
218
|
+
* @param {Scheduler.preset.ViewPreset} event.from The outgoing ViewPreset.
|
|
219
|
+
* @param {Scheduler.preset.ViewPreset} event.to The ViewPreset being switched to.
|
|
220
|
+
*/
|
|
221
|
+
this.onBeforePresetChange = new EventEmitter();
|
|
222
|
+
/**
|
|
223
|
+
* Fires before the component renders a row.
|
|
224
|
+
* ...
|
|
225
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-beforeRenderHistogramRow)
|
|
226
|
+
* @param {object} event Event object
|
|
227
|
+
* @param {Scheduler.view.TimelineHistogram} event.source The component instance
|
|
228
|
+
* @param {Core.data.Model} event.record Record the histogram data of which is ready.
|
|
229
|
+
* @param {HistogramConfig} event.histogramConfig Configuration object that will be applied to `histogramWidget`.
|
|
230
|
+
* @param {Core.widget.graph.Histogram} event.histogramWidget The underlying widget that is used to render a chart.
|
|
231
|
+
*/
|
|
232
|
+
this.onBeforeRenderHistogramRow = new EventEmitter();
|
|
233
|
+
/**
|
|
234
|
+
* Fires before the component renders a histogram in a cell.
|
|
235
|
+
* @param {object} event Event object
|
|
236
|
+
* @param {Scheduler.view.TimelineHistogram} event.source The component instance
|
|
237
|
+
* @param {Core.data.Model} event.record Record the histogram data of which is ready.
|
|
238
|
+
* @param {HistogramConfig} event.histogramConfig Configuration object that will be applied to `histogramWidget`.
|
|
239
|
+
* @param {Core.widget.graph.Histogram} event.histogramWidget The underlying widget that is used to render a chart.
|
|
240
|
+
*/
|
|
241
|
+
this.onBeforeRenderRecordHistogram = new EventEmitter();
|
|
242
|
+
/**
|
|
243
|
+
* Fires before a row is rendered.
|
|
244
|
+
* @param {object} event Event object
|
|
245
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance.
|
|
246
|
+
* @param {Grid.row.Row} event.row The row about to be rendered.
|
|
247
|
+
* @param {Core.data.Model} event.record The record for the row.
|
|
248
|
+
* @param {number} event.recordIndex The zero-based index of the record.
|
|
249
|
+
*/
|
|
250
|
+
this.onBeforeRenderRow = new EventEmitter();
|
|
251
|
+
/**
|
|
252
|
+
* Grid rows are about to be rendered
|
|
253
|
+
* @param {object} event Event object
|
|
254
|
+
* @param {Grid.view.Grid} event.source This grid.
|
|
255
|
+
*/
|
|
256
|
+
this.onBeforeRenderRows = new EventEmitter();
|
|
257
|
+
/**
|
|
258
|
+
* This event fires before row collapse is started.
|
|
259
|
+
* ...
|
|
260
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-beforeRowCollapse)
|
|
261
|
+
* @param {object} event Event object
|
|
262
|
+
* @param {Core.data.Model} event.record Record
|
|
263
|
+
*/
|
|
264
|
+
this.onBeforeRowCollapse = new EventEmitter();
|
|
265
|
+
/**
|
|
266
|
+
* This event fires before row expand is started.
|
|
267
|
+
* ...
|
|
268
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-beforeRowExpand)
|
|
269
|
+
* @param {object} event Event object
|
|
270
|
+
* @param {Core.data.Model} event.record Record
|
|
271
|
+
*/
|
|
272
|
+
this.onBeforeRowExpand = new EventEmitter();
|
|
273
|
+
/**
|
|
274
|
+
* Fires before the selection changes. Returning `false` from a listener prevents the change
|
|
275
|
+
* @param {object} event Event object
|
|
276
|
+
* @param {string} event.action `'select'`/`'deselect'`
|
|
277
|
+
* @param {'row','cell'} event.mode `'row'`/`'cell'`
|
|
278
|
+
* @param {Grid.view.Grid} event.source
|
|
279
|
+
* @param {Core.data.Model[]} event.deselected The records to be deselected in this operation.
|
|
280
|
+
* @param {Core.data.Model[]} event.selected The records to be selected in this operation.
|
|
281
|
+
* @param {Core.data.Model[]} event.selection The records in the current selection, before applying `selected` and `deselected`
|
|
282
|
+
* @param {Grid.util.GridLocation[]} event.deselectedCells The cells to be deselected in this operation.
|
|
283
|
+
* @param {Grid.util.GridLocation[]} event.selectedCells The cells to be selected in this operation.
|
|
284
|
+
* @param {Grid.util.GridLocation[]} event.cellSelection The cells in the current selection, before applying `selectedCells` and `deselectedCells`
|
|
285
|
+
*/
|
|
286
|
+
this.onBeforeSelectionChange = new EventEmitter();
|
|
287
|
+
/**
|
|
288
|
+
* Fired before this container will load record values into its child fields. This is useful if you
|
|
289
|
+
* want to modify the UI before data is loaded (e.g. set some input field to be readonly)
|
|
290
|
+
* @param {object} event Event object
|
|
291
|
+
* @param {Core.widget.Container} event.source The container
|
|
292
|
+
* @param {Core.data.Model} event.record The record
|
|
293
|
+
*/
|
|
294
|
+
this.onBeforeSetRecord = new EventEmitter();
|
|
295
|
+
/**
|
|
296
|
+
* Triggered before a widget is shown. Return `false` to prevent the action.
|
|
297
|
+
* @param {object} event Event object
|
|
298
|
+
* @param {Core.widget.Widget,any} event.source The widget being shown
|
|
299
|
+
*/
|
|
300
|
+
this.onBeforeShow = new EventEmitter();
|
|
301
|
+
/**
|
|
302
|
+
* Fires on the owning Grid before editing starts, return `false` to prevent editing
|
|
303
|
+
* @param {object} event Event object
|
|
304
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
305
|
+
* @param {RowEditorContext} event.editorContext Editing context
|
|
306
|
+
*/
|
|
307
|
+
this.onBeforeStartRowEdit = new EventEmitter();
|
|
308
|
+
/**
|
|
309
|
+
* Fired before state is applied to the source. Allows editing the state object or preventing the operation.
|
|
310
|
+
* @param {object} event Event object
|
|
311
|
+
* @param {GridStateInfo} event.state State object config
|
|
312
|
+
*/
|
|
313
|
+
this.onBeforeStateApply = new EventEmitter();
|
|
314
|
+
/**
|
|
315
|
+
* Fired before state is saved by the StateProvider. Allows editing the state object or preventing the operation.
|
|
316
|
+
* @param {object} event Event object
|
|
317
|
+
* @param {GridStateInfo} event.state State object config
|
|
318
|
+
*/
|
|
319
|
+
this.onBeforeStateSave = new EventEmitter();
|
|
320
|
+
/**
|
|
321
|
+
* Fired when a group is going to be expanded or collapsed using the UI.
|
|
322
|
+
* Returning `false` from a listener prevents the operation
|
|
323
|
+
* @param {object} event Event object
|
|
324
|
+
* @param {Core.data.Model} event.groupRecord [DEPRECATED] Use `groupRecords` param instead
|
|
325
|
+
* @param {Core.data.Model[]} event.groupRecords The group records being toggled
|
|
326
|
+
* @param {boolean} event.collapse Collapsed (true) or expanded (false)
|
|
327
|
+
* @param {Event} event.domEvent The user interaction event (eg a `click` event) if the toggle request was instigated by user interaction.
|
|
328
|
+
*/
|
|
329
|
+
this.onBeforeToggleGroup = new EventEmitter();
|
|
330
|
+
/**
|
|
331
|
+
* Fired before a parent node record toggles its collapsed state.
|
|
332
|
+
* @param {object} event Event object
|
|
333
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance.
|
|
334
|
+
* @param {Core.data.Model} event.record The record being toggled.
|
|
335
|
+
* @param {boolean} event.collapse `true` if the node is being collapsed.
|
|
336
|
+
*/
|
|
337
|
+
this.onBeforeToggleNode = new EventEmitter();
|
|
338
|
+
/**
|
|
339
|
+
* Fires on the owning Grid when editing is cancelled
|
|
340
|
+
* @param {object} event Event object
|
|
341
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
342
|
+
* @param {Grid.util.GridLocation} event.editorContext Editing context
|
|
343
|
+
* @param {Event} event.event Included if the cancellation was triggered by a DOM event
|
|
344
|
+
*/
|
|
345
|
+
this.onCancelCellEdit = new EventEmitter();
|
|
346
|
+
/**
|
|
347
|
+
* Fires when any other event is fired from the object.
|
|
348
|
+
* ...
|
|
349
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-catchAll)
|
|
350
|
+
* @param {object} event Event object
|
|
351
|
+
* @param {{[key: string]: any, type: string}} event.event The Object that contains event details
|
|
352
|
+
* @param {string} event.event.type The type of the event which is caught by the listener
|
|
353
|
+
*/
|
|
354
|
+
this.onCatchAll = new EventEmitter();
|
|
355
|
+
/**
|
|
356
|
+
* Fired when user clicks in a grid cell
|
|
357
|
+
* @param {object} event Event object
|
|
358
|
+
* @param {Grid.view.Grid} event.grid The grid instance
|
|
359
|
+
* @param {Core.data.Model} event.record The record representing the row
|
|
360
|
+
* @param {Grid.column.Column} event.column The column to which the cell belongs
|
|
361
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
362
|
+
* @param {HTMLElement} event.target The target element
|
|
363
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
364
|
+
*/
|
|
365
|
+
this.onCellClick = new EventEmitter();
|
|
366
|
+
/**
|
|
367
|
+
* Fired when user activates contextmenu in a grid cell
|
|
368
|
+
* @param {object} event Event object
|
|
369
|
+
* @param {Grid.view.Grid} event.grid The grid instance
|
|
370
|
+
* @param {Core.data.Model} event.record The record representing the row
|
|
371
|
+
* @param {Grid.column.Column} event.column The column to which the cell belongs
|
|
372
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
373
|
+
* @param {HTMLElement} event.target The target element
|
|
374
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
375
|
+
*/
|
|
376
|
+
this.onCellContextMenu = new EventEmitter();
|
|
377
|
+
/**
|
|
378
|
+
* Fired when user double clicks a grid cell
|
|
379
|
+
* @param {object} event Event object
|
|
380
|
+
* @param {Grid.view.Grid} event.grid The grid instance
|
|
381
|
+
* @param {Core.data.Model} event.record The record representing the row
|
|
382
|
+
* @param {Grid.column.Column} event.column The column to which the cell belongs
|
|
383
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
384
|
+
* @param {HTMLElement} event.target The target element
|
|
385
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
386
|
+
*/
|
|
387
|
+
this.onCellDblClick = new EventEmitter();
|
|
388
|
+
/**
|
|
389
|
+
* This event fires on the owning grid before the context menu is shown for a cell.
|
|
390
|
+
* Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/scheduler/docs/api/Grid/feature/CellMenu#config-processItems).
|
|
391
|
+
* ...
|
|
392
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-cellMenuBeforeShow)
|
|
393
|
+
* @param {object} event Event object
|
|
394
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
395
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
396
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
397
|
+
* @param {Grid.column.Column} event.column Column
|
|
398
|
+
* @param {Core.data.Model} event.record Record
|
|
399
|
+
*/
|
|
400
|
+
this.onCellMenuBeforeShow = new EventEmitter();
|
|
401
|
+
/**
|
|
402
|
+
* This event fires on the owning grid when an item is selected in the cell context menu.
|
|
403
|
+
* @param {object} event Event object
|
|
404
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
405
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
406
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
407
|
+
* @param {Grid.column.Column} event.column Column
|
|
408
|
+
* @param {Core.data.Model} event.record Record
|
|
409
|
+
*/
|
|
410
|
+
this.onCellMenuItem = new EventEmitter();
|
|
411
|
+
/**
|
|
412
|
+
* This event fires on the owning grid after the context menu is shown for a cell.
|
|
413
|
+
* @param {object} event Event object
|
|
414
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
415
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
416
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
417
|
+
* @param {Grid.column.Column} event.column Column
|
|
418
|
+
* @param {Core.data.Model} event.record Record
|
|
419
|
+
*/
|
|
420
|
+
this.onCellMenuShow = new EventEmitter();
|
|
421
|
+
/**
|
|
422
|
+
* This event fires on the owning grid when a check item is toggled in the cell context menu.
|
|
423
|
+
* @param {object} event Event object
|
|
424
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
425
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
426
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
427
|
+
* @param {Grid.column.Column} event.column Column
|
|
428
|
+
* @param {Core.data.Model} event.record Record
|
|
429
|
+
* @param {boolean} event.checked Checked or not
|
|
430
|
+
*/
|
|
431
|
+
this.onCellMenuToggleItem = new EventEmitter();
|
|
432
|
+
/**
|
|
433
|
+
* Fired when the mouse enters a cell
|
|
434
|
+
* @param {object} event Event object
|
|
435
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
436
|
+
* @param {Core.data.Model} event.record The record representing the hovered cell
|
|
437
|
+
* @param {Grid.column.Column} event.column The column currently hovered
|
|
438
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
439
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
440
|
+
*/
|
|
441
|
+
this.onCellMouseEnter = new EventEmitter();
|
|
442
|
+
/**
|
|
443
|
+
* Fired when the mouse leaves a cell
|
|
444
|
+
* @param {object} event Event object
|
|
445
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
446
|
+
* @param {Core.data.Model} event.record The record representing the cell that the mouse left
|
|
447
|
+
* @param {Grid.column.Column} event.column The column representing the cell that the mouse left
|
|
448
|
+
* @param {HTMLElement} event.cellElement The cell HTML element that the mouse left
|
|
449
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
450
|
+
*/
|
|
451
|
+
this.onCellMouseLeave = new EventEmitter();
|
|
452
|
+
/**
|
|
453
|
+
* Fired when a user moves the mouse out of a grid cell
|
|
454
|
+
* @param {object} event Event object
|
|
455
|
+
* @param {Grid.view.Grid} event.grid The grid instance
|
|
456
|
+
* @param {Core.data.Model} event.record The record representing the row
|
|
457
|
+
* @param {Grid.column.Column} event.column The column to which the cell belongs
|
|
458
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
459
|
+
* @param {HTMLElement} event.target The target element
|
|
460
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
461
|
+
*/
|
|
462
|
+
this.onCellMouseOut = new EventEmitter();
|
|
463
|
+
/**
|
|
464
|
+
* Fired when user moves the mouse over a grid cell
|
|
465
|
+
* @param {object} event Event object
|
|
466
|
+
* @param {Grid.view.Grid} event.grid The grid instance
|
|
467
|
+
* @param {Core.data.Model} event.record The record representing the row
|
|
468
|
+
* @param {Grid.column.Column} event.column The column to which the cell belongs
|
|
469
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
470
|
+
* @param {HTMLElement} event.target The target element
|
|
471
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
472
|
+
*/
|
|
473
|
+
this.onCellMouseOver = new EventEmitter();
|
|
474
|
+
/**
|
|
475
|
+
* Fires when a Panel is collapsed using the [collapsible](https://bryntum.com/products/scheduler/docs/api/Core/widget/Panel#config-collapsible) setting.
|
|
476
|
+
* @param {object} event Event object
|
|
477
|
+
* @param {Core.widget.Panel} event.source This Panel.
|
|
478
|
+
*/
|
|
479
|
+
this.onCollapse = new EventEmitter();
|
|
480
|
+
/**
|
|
481
|
+
* Fired before a parent node record is collapsed.
|
|
482
|
+
* @param {object} event Event object
|
|
483
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance.
|
|
484
|
+
* @param {Core.data.Model} event.record The record which has been collapsed.
|
|
485
|
+
*/
|
|
486
|
+
this.onCollapseNode = new EventEmitter();
|
|
487
|
+
/**
|
|
488
|
+
* This event is fired when a column is being dragged, and you can set the `valid` flag on the `context` object
|
|
489
|
+
* to indicate whether the drop position is valid or not.
|
|
490
|
+
* @param {object} event Event object
|
|
491
|
+
* @param {Grid.view.Grid} event.source The grid instance.
|
|
492
|
+
* @param {Grid.column.Column} event.column The dragged column.
|
|
493
|
+
* @param {Grid.column.Column} event.insertBefore The column before which the dragged column will be inserted (if not last).
|
|
494
|
+
* @param {Event} event.event The browser event.
|
|
495
|
+
* @param {object} event.context
|
|
496
|
+
* @param {boolean} event.context.valid Set this to `true` or `false` to indicate whether the drop position is valid.
|
|
497
|
+
*/
|
|
498
|
+
this.onColumnDrag = new EventEmitter();
|
|
499
|
+
/**
|
|
500
|
+
* This event is fired when a column drag gesture has started.
|
|
501
|
+
* @param {object} event Event object
|
|
502
|
+
* @param {Grid.view.Grid} event.source The grid instance.
|
|
503
|
+
* @param {Grid.column.Column} event.column The dragged column.
|
|
504
|
+
* @param {Event} event.event The browser event.
|
|
505
|
+
*/
|
|
506
|
+
this.onColumnDragStart = new EventEmitter();
|
|
507
|
+
/**
|
|
508
|
+
* This event is always fired after a column is dropped. The `valid` param is `true` if the operation was not
|
|
509
|
+
* vetoed and the column was moved in the column store.
|
|
510
|
+
* @param {object} event Event object
|
|
511
|
+
* @param {Grid.view.Grid} event.source The grid instance.
|
|
512
|
+
* @param {Grid.column.Column} event.column The dragged column.
|
|
513
|
+
* @param {Grid.column.Column} event.insertBefore The column before which the dragged column will be inserted.
|
|
514
|
+
* @param {Grid.column.Column} event.newParent The new parent column.
|
|
515
|
+
* @param {boolean} event.valid `true` if the operation was not vetoed.
|
|
516
|
+
* @param {Event} event.event The browser event.
|
|
517
|
+
* @param {string} event.region The region where the column was dropped.
|
|
518
|
+
*/
|
|
519
|
+
this.onColumnDrop = new EventEmitter();
|
|
520
|
+
/**
|
|
521
|
+
* This event is fired after a resize gesture is completed.
|
|
522
|
+
* @param {object} event Event object
|
|
523
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
524
|
+
* @param {Grid.column.Column} event.column The resized column
|
|
525
|
+
* @param {Event} event.domEvent The browser event
|
|
526
|
+
*/
|
|
527
|
+
this.onColumnResize = new EventEmitter();
|
|
528
|
+
/**
|
|
529
|
+
* This event is fired when a column resize gesture starts.
|
|
530
|
+
* @param {object} event Event object
|
|
531
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
532
|
+
* @param {Grid.column.Column} event.column The column
|
|
533
|
+
* @param {Event} event.domEvent The browser event
|
|
534
|
+
*/
|
|
535
|
+
this.onColumnResizeStart = new EventEmitter();
|
|
536
|
+
/**
|
|
537
|
+
* This event fires on the owning widget when an item is selected in the context menu.
|
|
538
|
+
* @param {object} event Event object
|
|
539
|
+
* @param {Core.widget.Widget} event.source The owning widget
|
|
540
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
541
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
542
|
+
*/
|
|
543
|
+
this.onContextMenuItem = new EventEmitter();
|
|
544
|
+
/**
|
|
545
|
+
* This event fires on the owning widget when a check item is toggled in the context menu.
|
|
546
|
+
* @param {object} event Event object
|
|
547
|
+
* @param {Core.widget.Widget} event.source The owning widget
|
|
548
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
549
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
550
|
+
* @param {boolean} event.checked Checked or not
|
|
551
|
+
*/
|
|
552
|
+
this.onContextMenuToggleItem = new EventEmitter();
|
|
553
|
+
/**
|
|
554
|
+
* Fires on the owning Grid after a copy action is performed.
|
|
555
|
+
* @param {object} event Event object
|
|
556
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
557
|
+
* @param {Grid.util.GridLocation[]} event.cells The cells about to be copied or cut
|
|
558
|
+
* @param {string} event.copiedDataString The concatenated data string that was copied or cut
|
|
559
|
+
* @param {boolean} event.isCut `true` if this was a cut action
|
|
560
|
+
* @param {string} event.entityName 'cell' to distinguish this event from other copy events
|
|
561
|
+
*/
|
|
562
|
+
this.onCopy = new EventEmitter();
|
|
563
|
+
/**
|
|
564
|
+
* Fires on the owning Scheduler/Gantt when the line indicating the current time is updated (see [currentTimeLineUpdateInterval](https://bryntum.com/products/scheduler/docs/api/Scheduler/feature/TimeRanges#config-currentTimeLineUpdateInterval)).
|
|
565
|
+
* @param {object} event Event object
|
|
566
|
+
* @param {Scheduler.view.Scheduler} event.source The scheduler
|
|
567
|
+
* @param {Date} event.date The current date
|
|
568
|
+
*/
|
|
569
|
+
this.onCurrentTimelineUpdate = new EventEmitter();
|
|
570
|
+
/**
|
|
571
|
+
* Fired when data in the store changes.
|
|
572
|
+
* ...
|
|
573
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-dataChange)
|
|
574
|
+
* @param {object} event Event object
|
|
575
|
+
* @param {Grid.view.Grid} event.source Owning grid
|
|
576
|
+
* @param {Core.data.Store} event.store The originating store
|
|
577
|
+
* @param {'remove','removeAll','add','clearchanges','filter','update','dataset','replace'} event.action Name of action which triggered the change. May be one of: * `'remove'` * `'removeAll'` * `'add'` * `'clearchanges'` * `'filter'` * `'update'` * `'dataset'` * `'replace'`
|
|
578
|
+
* @param {Core.data.Model} event.record Changed record, for actions that affects exactly one record (`'update'`)
|
|
579
|
+
* @param {Core.data.Model[]} event.records Changed records, passed for all actions except `'removeAll'`
|
|
580
|
+
* @param {object} event.changes Passed for the `'update'` action, info on which record fields changed
|
|
581
|
+
*/
|
|
582
|
+
this.onDataChange = new EventEmitter();
|
|
583
|
+
/**
|
|
584
|
+
* Fired when the range of dates encapsulated by the UI changes. This will be when
|
|
585
|
+
* moving a view in time by reconfiguring its [timeAxis](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineBase#config-timeAxis). This will happen
|
|
586
|
+
* when zooming, or changing [viewPreset](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineBase#config-viewPreset).
|
|
587
|
+
* ...
|
|
588
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-dateRangeChange)
|
|
589
|
+
* @param {object} event Event object
|
|
590
|
+
* @param {Scheduler.view.TimelineBase} event.source This Scheduler/Gantt instance.
|
|
591
|
+
* @param {object} event.old The old date range
|
|
592
|
+
* @param {Date} event.old.startDate the old start date.
|
|
593
|
+
* @param {Date} event.old.endDate the old end date.
|
|
594
|
+
* @param {object} event.new The new date range
|
|
595
|
+
* @param {Date} event.new.startDate the new start date.
|
|
596
|
+
* @param {Date} event.new.endDate the new end date.
|
|
597
|
+
*/
|
|
598
|
+
this.onDateRangeChange = new EventEmitter();
|
|
599
|
+
/**
|
|
600
|
+
* Fires when an object is destroyed.
|
|
601
|
+
* @param {object} event Event object
|
|
602
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
603
|
+
*/
|
|
604
|
+
this.onDestroy = new EventEmitter();
|
|
605
|
+
/**
|
|
606
|
+
* Fires when a field is mutated and the state of the [hasChanges](https://bryntum.com/products/scheduler/docs/api/Core/widget/Container#property-hasChanges) property changes
|
|
607
|
+
* @param {object} event Event object
|
|
608
|
+
* @param {Core.widget.Container} event.source The container.
|
|
609
|
+
* @param {boolean} event.dirty The dirty state of the Container - `true` if there are any fields which have been changed since initial load.
|
|
610
|
+
*/
|
|
611
|
+
this.onDirtyStateChange = new EventEmitter();
|
|
612
|
+
/**
|
|
613
|
+
* Fires while drag selecting. UI will update with current range, but the cells will not be selected until
|
|
614
|
+
* mouse up. This event can be listened for to perform actions while drag selecting.
|
|
615
|
+
* @param {object} event Event object
|
|
616
|
+
* @param {Grid.view.Grid} event.source
|
|
617
|
+
* @param {GridLocationConfig[],Grid.util.GridLocation[]} event.selectedCells The cells that is currently being dragged over
|
|
618
|
+
* @param {Core.data.Model[]} event.selectedRecords The records that is currently being dragged over
|
|
619
|
+
*/
|
|
620
|
+
this.onDragSelecting = new EventEmitter();
|
|
621
|
+
/**
|
|
622
|
+
* Triggered when a widget's [element](https://bryntum.com/products/scheduler/docs/api/Core/widget/Widget#property-element) is available.
|
|
623
|
+
* @param {object} event Event object
|
|
624
|
+
* @param {HTMLElement} event.element The Widget's element.
|
|
625
|
+
*/
|
|
626
|
+
this.onElementCreated = new EventEmitter();
|
|
627
|
+
/**
|
|
628
|
+
* Fires when a Panel is expanded using the [collapsible](https://bryntum.com/products/scheduler/docs/api/Core/widget/Panel#config-collapsible) setting.
|
|
629
|
+
* @param {object} event Event object
|
|
630
|
+
* @param {Core.widget.Panel} event.source This Panel.
|
|
631
|
+
*/
|
|
632
|
+
this.onExpand = new EventEmitter();
|
|
633
|
+
/**
|
|
634
|
+
* Fired after a parent node record is expanded.
|
|
635
|
+
* @param {object} event Event object
|
|
636
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance.
|
|
637
|
+
* @param {Core.data.Model} event.record The record which has been expanded.
|
|
638
|
+
*/
|
|
639
|
+
this.onExpandNode = new EventEmitter();
|
|
640
|
+
/**
|
|
641
|
+
* Fired when a file is dropped on the widget element
|
|
642
|
+
* @param {object} event Event object
|
|
643
|
+
* @param {Grid.view.Grid} event.source The owning Grid instance
|
|
644
|
+
* @param {DataTransferItem} event.file The dropped file descriptor
|
|
645
|
+
* @param {DragEvent} event.domEvent The native DragEvent
|
|
646
|
+
*/
|
|
647
|
+
this.onFileDrop = new EventEmitter();
|
|
648
|
+
/**
|
|
649
|
+
* Fired before the FillHandle dragging is finalized and values are applied to cells, return `false` to prevent the
|
|
650
|
+
* drag operation from applying data changes.
|
|
651
|
+
* @param {object} event Event object
|
|
652
|
+
* @param {Grid.util.GridLocation} event.from The from cell
|
|
653
|
+
* @param {Grid.util.GridLocation} event.to The to cell
|
|
654
|
+
* @param {MouseEvent} event.domEvent The raw DOM event
|
|
655
|
+
*/
|
|
656
|
+
this.onFillHandleBeforeDragFinalize = new EventEmitter();
|
|
657
|
+
/**
|
|
658
|
+
* Fired while dragging the FillHandle.
|
|
659
|
+
* @param {object} event Event object
|
|
660
|
+
* @param {Grid.util.GridLocation} event.from The from cell
|
|
661
|
+
* @param {Grid.util.GridLocation} event.to The to cell
|
|
662
|
+
* @param {MouseEvent} event.domEvent The raw DOM event
|
|
663
|
+
*/
|
|
664
|
+
this.onFillHandleDrag = new EventEmitter();
|
|
665
|
+
/**
|
|
666
|
+
* Fired when a FillHandle drag operation is aborted.
|
|
667
|
+
*/
|
|
668
|
+
this.onFillHandleDragAbort = new EventEmitter();
|
|
669
|
+
/**
|
|
670
|
+
* Fired after a FillHandle drag operation.
|
|
671
|
+
* @param {object} event Event object
|
|
672
|
+
* @param {Grid.util.GridLocation} event.from The from cell
|
|
673
|
+
* @param {Grid.util.GridLocation} event.to The to cell
|
|
674
|
+
* @param {MouseEvent} event.domEvent The raw DOM event
|
|
675
|
+
*/
|
|
676
|
+
this.onFillHandleDragEnd = new EventEmitter();
|
|
677
|
+
/**
|
|
678
|
+
* Fired when dragging of the FillHandle starts.
|
|
679
|
+
* @param {object} event Event object
|
|
680
|
+
* @param {Grid.util.GridLocation} event.cell Information about the column / record
|
|
681
|
+
* @param {MouseEvent} event.domEvent The raw DOM event
|
|
682
|
+
*/
|
|
683
|
+
this.onFillHandleDragStart = new EventEmitter();
|
|
684
|
+
/**
|
|
685
|
+
* Fires on the owning Grid when cell editing is finished
|
|
686
|
+
* @param {object} event Event object
|
|
687
|
+
* @param {Grid.view.Grid} event.grid Target grid
|
|
688
|
+
* @param {CellEditorContext} event.editorContext Editing context
|
|
689
|
+
*/
|
|
690
|
+
this.onFinishCellEdit = new EventEmitter();
|
|
691
|
+
/**
|
|
692
|
+
* Fires on the owning Grid before the row editing is finished, return false to signal that the value is invalid and editing should not be finalized.
|
|
693
|
+
* ...
|
|
694
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-finishRowEdit)
|
|
695
|
+
* @param {object} event Event object
|
|
696
|
+
* @param {Grid.view.Grid} event.grid Target grid
|
|
697
|
+
* @param {RowEditorContext} event.editorContext Editing context
|
|
698
|
+
*/
|
|
699
|
+
this.onFinishRowEdit = new EventEmitter();
|
|
700
|
+
/**
|
|
701
|
+
* Fired when focus enters this Widget.
|
|
702
|
+
* @param {object} event Event object
|
|
703
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
704
|
+
* @param {HTMLElement} event.fromElement The element which lost focus.
|
|
705
|
+
* @param {HTMLElement} event.toElement The element which gained focus.
|
|
706
|
+
* @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
|
|
707
|
+
* @param {Core.widget.Widget} event.toWidget The widget which gained focus.
|
|
708
|
+
* @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
|
|
709
|
+
*/
|
|
710
|
+
this.onFocusIn = new EventEmitter();
|
|
711
|
+
/**
|
|
712
|
+
* Fired when focus exits this Widget's ownership tree. This is different from a `blur` event.
|
|
713
|
+
* focus moving from within this Widget's ownership tree, even if there are floating widgets
|
|
714
|
+
* will not trigger this event. This is when focus exits this widget completely.
|
|
715
|
+
* @param {object} event Event object
|
|
716
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
717
|
+
* @param {HTMLElement} event.fromElement The element which lost focus.
|
|
718
|
+
* @param {HTMLElement} event.toElement The element which gained focus.
|
|
719
|
+
* @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
|
|
720
|
+
* @param {Core.widget.Widget} event.toWidget The widget which gained focus.
|
|
721
|
+
* @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
|
|
722
|
+
*/
|
|
723
|
+
this.onFocusOut = new EventEmitter();
|
|
724
|
+
/**
|
|
725
|
+
* Fired before dragging starts, return false to prevent the drag operation.
|
|
726
|
+
* @param {object} event Event object
|
|
727
|
+
* @param {Grid.view.GridBase} event.source
|
|
728
|
+
* @param {object} event.context
|
|
729
|
+
* @param {Core.data.Model[]} event.context.records The dragged row records
|
|
730
|
+
* @param {MouseEvent,TouchEvent} event.event
|
|
731
|
+
*/
|
|
732
|
+
this.onGridRowBeforeDragStart = new EventEmitter();
|
|
733
|
+
/**
|
|
734
|
+
* Fired before the row drop operation is finalized. You can return false to abort the drop operation, or a
|
|
735
|
+
* Promise yielding `true` / `false` which allows for asynchronous abort (e.g. first show user a confirmation dialog).
|
|
736
|
+
* @param {object} event Event object
|
|
737
|
+
* @param {Grid.view.GridBase} event.source
|
|
738
|
+
* @param {object} event.context
|
|
739
|
+
* @param {boolean} event.context.valid Set this to true or false to indicate whether the drop position is valid
|
|
740
|
+
* @param {Core.data.Model} event.context.insertBefore The record to insert before (`null` if inserting at last position of a parent node)
|
|
741
|
+
* @param {Core.data.Model} event.context.parent The parent record of the current drop position (only applicable for trees)
|
|
742
|
+
* @param {Core.data.Model[]} event.context.records The dragged row records
|
|
743
|
+
* @param {RecordPositionContext[]} event.context.oldPositionContext An array of objects with information about the previous tree position. Objects contain the `record`, and its original `parentIndex` and `parentId` values
|
|
744
|
+
* @param {MouseEvent} event.event
|
|
745
|
+
*/
|
|
746
|
+
this.onGridRowBeforeDropFinalize = new EventEmitter();
|
|
747
|
+
/**
|
|
748
|
+
* Fired while the row is being dragged, in the listener function you have access to `context.insertBefore` a grid /
|
|
749
|
+
* tree record, and additionally `context.parent` (a TreeNode) for trees. You can signal that the drop position is
|
|
750
|
+
* valid or invalid by setting `context.valid = false;`
|
|
751
|
+
* @param {object} event Event object
|
|
752
|
+
* @param {Grid.view.GridBase} event.source
|
|
753
|
+
* @param {object} event.context
|
|
754
|
+
* @param {boolean} event.context.valid Set this to true or false to indicate whether the drop position is valid.
|
|
755
|
+
* @param {Core.data.Model} event.context.insertBefore The record to insert before (`null` if inserting at last position of a parent node)
|
|
756
|
+
* @param {Core.data.Model} event.context.parent The parent record of the current drop position (only applicable for trees)
|
|
757
|
+
* @param {Core.data.Model[]} event.context.records The dragged row records
|
|
758
|
+
* @param {MouseEvent} event.event
|
|
759
|
+
*/
|
|
760
|
+
this.onGridRowDrag = new EventEmitter();
|
|
761
|
+
/**
|
|
762
|
+
* Fired when a row drag operation is aborted
|
|
763
|
+
* @param {object} event Event object
|
|
764
|
+
* @param {Grid.view.GridBase} event.source
|
|
765
|
+
* @param {object} event.context
|
|
766
|
+
* @param {Core.data.Model[]} event.context.records The dragged row records
|
|
767
|
+
* @param {MouseEvent} event.event
|
|
768
|
+
*/
|
|
769
|
+
this.onGridRowDragAbort = new EventEmitter();
|
|
770
|
+
/**
|
|
771
|
+
* Fired when dragging starts.
|
|
772
|
+
* @param {object} event Event object
|
|
773
|
+
* @param {Grid.view.GridBase} event.source
|
|
774
|
+
* @param {object} event.context
|
|
775
|
+
* @param {Core.data.Model[]} event.context.records The dragged row records
|
|
776
|
+
* @param {MouseEvent,TouchEvent} event.event
|
|
777
|
+
*/
|
|
778
|
+
this.onGridRowDragStart = new EventEmitter();
|
|
779
|
+
/**
|
|
780
|
+
* Fired after the row drop operation has completed, regardless of validity
|
|
781
|
+
* @param {object} event Event object
|
|
782
|
+
* @param {Grid.view.GridBase} event.source
|
|
783
|
+
* @param {object} event.context
|
|
784
|
+
* @param {boolean} event.context.valid true or false depending on whether the drop position was valid
|
|
785
|
+
* @param {Core.data.Model} event.context.insertBefore The record to insert before (`null` if inserting at last position of a parent node)
|
|
786
|
+
* @param {Core.data.Model} event.context.parent The parent record of the current drop position (only applicable for trees)
|
|
787
|
+
* @param {Core.data.Model[]} event.context.records The dragged row records
|
|
788
|
+
* @param {RecordPositionContext[]} event.context.oldPositionContext An array of objects with information about the previous tree position. Objects contain the record, and its original `parentIndex` and `parentId` values
|
|
789
|
+
* @param {MouseEvent} event.event
|
|
790
|
+
*/
|
|
791
|
+
this.onGridRowDrop = new EventEmitter();
|
|
792
|
+
/**
|
|
793
|
+
* Fired when a grid header is clicked on.
|
|
794
|
+
* ...
|
|
795
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-headerClick)
|
|
796
|
+
* @param {object} event Event object
|
|
797
|
+
* @param {Event} event.domEvent The triggering DOM event.
|
|
798
|
+
* @param {Grid.column.Column} event.column The column clicked on.
|
|
799
|
+
*/
|
|
800
|
+
this.onHeaderClick = new EventEmitter();
|
|
801
|
+
/**
|
|
802
|
+
* This event fires on the owning Grid before the context menu is shown for a header.
|
|
803
|
+
* Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/scheduler/docs/api/Grid/feature/HeaderMenu#config-processItems).
|
|
804
|
+
* ...
|
|
805
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-headerMenuBeforeShow)
|
|
806
|
+
* @param {object} event Event object
|
|
807
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
808
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
809
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
810
|
+
* @param {Grid.column.Column} event.column Column
|
|
811
|
+
*/
|
|
812
|
+
this.onHeaderMenuBeforeShow = new EventEmitter();
|
|
813
|
+
/**
|
|
814
|
+
* This event fires on the owning Grid when an item is selected in the header context menu.
|
|
815
|
+
* @param {object} event Event object
|
|
816
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
817
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
818
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
819
|
+
* @param {Grid.column.Column} event.column Column
|
|
820
|
+
*/
|
|
821
|
+
this.onHeaderMenuItem = new EventEmitter();
|
|
822
|
+
/**
|
|
823
|
+
* This event fires on the owning Grid after the context menu is shown for a header
|
|
824
|
+
* @param {object} event Event object
|
|
825
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
826
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
827
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
828
|
+
* @param {Grid.column.Column} event.column Column
|
|
829
|
+
*/
|
|
830
|
+
this.onHeaderMenuShow = new EventEmitter();
|
|
831
|
+
/**
|
|
832
|
+
* This event fires on the owning Grid when a check item is toggled in the header context menu.
|
|
833
|
+
* @param {object} event Event object
|
|
834
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
835
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
836
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
837
|
+
* @param {Grid.column.Column} event.column Column
|
|
838
|
+
* @param {boolean} event.checked Checked or not
|
|
839
|
+
*/
|
|
840
|
+
this.onHeaderMenuToggleItem = new EventEmitter();
|
|
841
|
+
/**
|
|
842
|
+
* Triggered after a widget was hidden
|
|
843
|
+
* @param {object} event Event object
|
|
844
|
+
* @param {Core.widget.Widget} event.source The widget
|
|
845
|
+
*/
|
|
846
|
+
this.onHide = new EventEmitter();
|
|
847
|
+
/**
|
|
848
|
+
* Fires after the component retrieves a record's histogram data and stores
|
|
849
|
+
* it into the cache.
|
|
850
|
+
* ...
|
|
851
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-histogramDataCacheSet)
|
|
852
|
+
* @param {object} event Event object
|
|
853
|
+
* @param {Scheduler.view.TimelineHistogram} event.source The component instance
|
|
854
|
+
* @param {Core.data.Model} event.record Record the histogram data of which is ready.
|
|
855
|
+
* @param {object} event.data The record histogram data.
|
|
856
|
+
*/
|
|
857
|
+
this.onHistogramDataCacheSet = new EventEmitter();
|
|
858
|
+
/**
|
|
859
|
+
* Fires when row locking is enabled.
|
|
860
|
+
* @param {object} event Event object
|
|
861
|
+
* @param {Grid.view.GridBase} event.clone The created clone
|
|
862
|
+
*/
|
|
863
|
+
this.onLockRows = new EventEmitter();
|
|
864
|
+
/**
|
|
865
|
+
* Mouse moved out from element in grid
|
|
866
|
+
* @param {object} event Event object
|
|
867
|
+
* @param {MouseEvent} event.event The native browser event
|
|
868
|
+
*/
|
|
869
|
+
this.onMouseOut = new EventEmitter();
|
|
870
|
+
/**
|
|
871
|
+
* Mouse moved in over element in grid
|
|
872
|
+
* @param {object} event Event object
|
|
873
|
+
* @param {MouseEvent} event.event The native browser event
|
|
874
|
+
*/
|
|
875
|
+
this.onMouseOver = new EventEmitter();
|
|
876
|
+
/**
|
|
877
|
+
* Fires when the requested date range cannot fit into any zoom level higher than the current level.
|
|
878
|
+
* @param {object} event Event object
|
|
879
|
+
* @param {number} event.currentZoomLevel The current zoom level
|
|
880
|
+
* @param {Date} event.startDate The requested start date
|
|
881
|
+
* @param {Date} event.endDate The requested end date
|
|
882
|
+
*/
|
|
883
|
+
this.onNoZoomChange = new EventEmitter();
|
|
884
|
+
/**
|
|
885
|
+
* Triggered when a widget which had been in a non-visible state for any reason
|
|
886
|
+
* achieves visibility.
|
|
887
|
+
* ...
|
|
888
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-paint)
|
|
889
|
+
* @param {object} event Event object
|
|
890
|
+
* @param {Core.widget.Widget} event.source The widget being painted.
|
|
891
|
+
* @param {boolean} event.firstPaint `true` if this is the first paint.
|
|
892
|
+
*/
|
|
893
|
+
this.onPaint = new EventEmitter();
|
|
894
|
+
/**
|
|
895
|
+
* Fires on the owning Grid after a paste action is performed.
|
|
896
|
+
* @param {object} event Event object
|
|
897
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
898
|
+
* @param {string} event.clipboardData The clipboardData that was pasted
|
|
899
|
+
* @param {Core.data.Model[]} event.modifiedRecords The records which have been modified due to the paste action
|
|
900
|
+
* @param {Grid.util.GridLocation} event.targetCell The cell from which the paste will be started
|
|
901
|
+
* @param {string} event.entityName 'cell' to distinguish this event from other paste events
|
|
902
|
+
*/
|
|
903
|
+
this.onPaste = new EventEmitter();
|
|
904
|
+
/**
|
|
905
|
+
* Fires on the owning Grid when export has finished
|
|
906
|
+
* @param {object} event Event object
|
|
907
|
+
* @param {Response} event.response Optional response, if received
|
|
908
|
+
* @param {Error} event.error Optional error, if exception occurred
|
|
909
|
+
*/
|
|
910
|
+
this.onPdfExport = new EventEmitter();
|
|
911
|
+
/**
|
|
912
|
+
* Fired after the [viewPreset](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/mixin/TimelineViewPresets#config-viewPreset) has changed.
|
|
913
|
+
* @param {object} event Event object
|
|
914
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler instance.
|
|
915
|
+
* @param {Date} event.startDate The new start date of the timeline.
|
|
916
|
+
* @param {Date} event.centerDate The new center date of the timeline.
|
|
917
|
+
* @param {Date} event.endDate The new end date of the timeline.
|
|
918
|
+
* @param {Scheduler.preset.ViewPreset} event.from The outgoing ViewPreset.
|
|
919
|
+
* @param {Scheduler.preset.ViewPreset} event.to The ViewPreset being switched to.
|
|
920
|
+
*/
|
|
921
|
+
this.onPresetChange = new EventEmitter();
|
|
922
|
+
/**
|
|
923
|
+
* Fired when a Widget's read only state is toggled
|
|
924
|
+
* @param {object} event Event object
|
|
925
|
+
* @param {boolean} event.readOnly Read only or not
|
|
926
|
+
*/
|
|
927
|
+
this.onReadOnly = new EventEmitter();
|
|
928
|
+
/**
|
|
929
|
+
* This event is fired after a widget's elements have been synchronized due to a direct or indirect call
|
|
930
|
+
* to [recompose](https://bryntum.com/products/scheduler/docs/api/Core/widget/Widget#function-recompose), if this results in some change to the widget's rendered DOM elements.
|
|
931
|
+
*/
|
|
932
|
+
this.onRecompose = new EventEmitter();
|
|
933
|
+
/**
|
|
934
|
+
* Fires after a row is rendered.
|
|
935
|
+
* @param {object} event Event object
|
|
936
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance.
|
|
937
|
+
* @param {Grid.row.Row} event.row The row that has been rendered.
|
|
938
|
+
* @param {Core.data.Model} event.record The record for the row.
|
|
939
|
+
* @param {number} event.recordIndex The zero-based index of the record.
|
|
940
|
+
*/
|
|
941
|
+
this.onRenderRow = new EventEmitter();
|
|
942
|
+
/**
|
|
943
|
+
* Grid rows have been rendered
|
|
944
|
+
* @param {object} event Event object
|
|
945
|
+
* @param {Grid.view.Grid} event.source This grid.
|
|
946
|
+
*/
|
|
947
|
+
this.onRenderRows = new EventEmitter();
|
|
948
|
+
/**
|
|
949
|
+
* Fired when the encapsulating element of a Widget resizes *only when [monitorResize](https://bryntum.com/products/scheduler/docs/api/Core/widget/Widget#config-monitorResize) is `true`*.
|
|
950
|
+
* @param {object} event Event object
|
|
951
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
952
|
+
* @param {number} event.width The new width
|
|
953
|
+
* @param {number} event.height The new height
|
|
954
|
+
* @param {number} event.oldWidth The old width
|
|
955
|
+
* @param {number} event.oldHeight The old height
|
|
956
|
+
*/
|
|
957
|
+
this.onResize = new EventEmitter();
|
|
958
|
+
/**
|
|
959
|
+
* This event fires on the owning scheduler before the context menu is shown for a resource.
|
|
960
|
+
* Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/scheduler/docs/api/Scheduler/feature/ResourceMenu#config-processItems).
|
|
961
|
+
* ...
|
|
962
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-resourceMenuBeforeShow)
|
|
963
|
+
* @param {object} event Event object
|
|
964
|
+
* @param {Scheduler.view.Scheduler} event.source The grid
|
|
965
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
966
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
967
|
+
* @param {Grid.column.Column} event.column Column
|
|
968
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord Record
|
|
969
|
+
*/
|
|
970
|
+
this.onResourceMenuBeforeShow = new EventEmitter();
|
|
971
|
+
/**
|
|
972
|
+
* This event fires on the owning scheduler when an item is selected in the context menu.
|
|
973
|
+
* @param {object} event Event object
|
|
974
|
+
* @param {Scheduler.view.Scheduler} event.source The grid
|
|
975
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
976
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
977
|
+
* @param {Scheduler.model.ResourceModel} event.record Record
|
|
978
|
+
*/
|
|
979
|
+
this.onResourceMenuItem = new EventEmitter();
|
|
980
|
+
/**
|
|
981
|
+
* This event fires on the owning scheduler after the context menu is shown for a resource.
|
|
982
|
+
* @param {object} event Event object
|
|
983
|
+
* @param {Scheduler.view.Scheduler} event.source The grid
|
|
984
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
985
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
986
|
+
* @param {Scheduler.model.ResourceModel} event.record Record
|
|
987
|
+
*/
|
|
988
|
+
this.onResourceMenuShow = new EventEmitter();
|
|
989
|
+
/**
|
|
990
|
+
* This event fires on the owning grid when a check item is toggled in the context menu.
|
|
991
|
+
* @param {object} event Event object
|
|
992
|
+
* @param {Scheduler.view.Scheduler} event.source The grid
|
|
993
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
994
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
995
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord Record
|
|
996
|
+
* @param {boolean} event.checked Checked or not
|
|
997
|
+
*/
|
|
998
|
+
this.onResourceMenuToggleItem = new EventEmitter();
|
|
999
|
+
/**
|
|
1000
|
+
* Triggered for click on a resource time range. Only triggered if the ResourceTimeRange feature is configured with
|
|
1001
|
+
* `enableMouseEvents: true`.
|
|
1002
|
+
* @param {object} event Event object
|
|
1003
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler
|
|
1004
|
+
* @param {Scheduler.feature.ResourceTimeRanges} event.feature The ResourceTimeRange feature
|
|
1005
|
+
* @param {Scheduler.model.ResourceTimeRangeModel} event.resourceTimeRangeRecord Resource time range record
|
|
1006
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
|
|
1007
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1008
|
+
*/
|
|
1009
|
+
this.onResourceTimeRangeClick = new EventEmitter();
|
|
1010
|
+
/**
|
|
1011
|
+
* Triggered for right-click on a resource time range. Only triggered if the ResourceTimeRange feature is configured
|
|
1012
|
+
* with `enableMouseEvents: true`.
|
|
1013
|
+
* @param {object} event Event object
|
|
1014
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler
|
|
1015
|
+
* @param {Scheduler.feature.ResourceTimeRanges} event.feature The ResourceTimeRange feature
|
|
1016
|
+
* @param {Scheduler.model.ResourceTimeRangeModel} event.resourceTimeRangeRecord Resource time range record
|
|
1017
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
|
|
1018
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1019
|
+
*/
|
|
1020
|
+
this.onResourceTimeRangeContextMenu = new EventEmitter();
|
|
1021
|
+
/**
|
|
1022
|
+
* Triggered for double-click on a resource time range. Only triggered if the ResourceTimeRange feature is configured
|
|
1023
|
+
* with `enableMouseEvents: true`.
|
|
1024
|
+
* @param {object} event Event object
|
|
1025
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler
|
|
1026
|
+
* @param {Scheduler.feature.ResourceTimeRanges} event.feature The ResourceTimeRange feature
|
|
1027
|
+
* @param {Scheduler.model.ResourceTimeRangeModel} event.resourceTimeRangeRecord Resource time range record
|
|
1028
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
|
|
1029
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1030
|
+
*/
|
|
1031
|
+
this.onResourceTimeRangeDblClick = new EventEmitter();
|
|
1032
|
+
/**
|
|
1033
|
+
* Triggered for mouse down ona resource time range. Only triggered if the ResourceTimeRange feature is configured
|
|
1034
|
+
* with `enableMouseEvents: true`.
|
|
1035
|
+
* @param {object} event Event object
|
|
1036
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler
|
|
1037
|
+
* @param {Scheduler.feature.ResourceTimeRanges} event.feature The ResourceTimeRange feature
|
|
1038
|
+
* @param {Scheduler.model.ResourceTimeRangeModel} event.resourceTimeRangeRecord Resource time range record
|
|
1039
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
|
|
1040
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1041
|
+
*/
|
|
1042
|
+
this.onResourceTimeRangeMouseDown = new EventEmitter();
|
|
1043
|
+
/**
|
|
1044
|
+
* Triggered for mouse out of a resource time range. Only triggered if the ResourceTimeRange feature is configured
|
|
1045
|
+
* with `enableMouseEvents: true`.
|
|
1046
|
+
* @param {object} event Event object
|
|
1047
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler
|
|
1048
|
+
* @param {Scheduler.feature.ResourceTimeRanges} event.feature The ResourceTimeRange feature
|
|
1049
|
+
* @param {Scheduler.model.ResourceTimeRangeModel} event.resourceTimeRangeRecord Resource time range record
|
|
1050
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
|
|
1051
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1052
|
+
*/
|
|
1053
|
+
this.onResourceTimeRangeMouseOut = new EventEmitter();
|
|
1054
|
+
/**
|
|
1055
|
+
* Triggered for mouse over on a resource time range. Only triggered if the ResourceTimeRange feature is configured
|
|
1056
|
+
* with `enableMouseEvents: true`.
|
|
1057
|
+
* @param {object} event Event object
|
|
1058
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler
|
|
1059
|
+
* @param {Scheduler.feature.ResourceTimeRanges} event.feature The ResourceTimeRange feature
|
|
1060
|
+
* @param {Scheduler.model.ResourceTimeRangeModel} event.resourceTimeRangeRecord Resource time range record
|
|
1061
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
|
|
1062
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1063
|
+
*/
|
|
1064
|
+
this.onResourceTimeRangeMouseOver = new EventEmitter();
|
|
1065
|
+
/**
|
|
1066
|
+
* Triggered for mouse up ona resource time range. Only triggered if the ResourceTimeRange feature is configured
|
|
1067
|
+
* with `enableMouseEvents: true`.
|
|
1068
|
+
* @param {object} event Event object
|
|
1069
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler
|
|
1070
|
+
* @param {Scheduler.feature.ResourceTimeRanges} event.feature The ResourceTimeRange feature
|
|
1071
|
+
* @param {Scheduler.model.ResourceTimeRangeModel} event.resourceTimeRangeRecord Resource time range record
|
|
1072
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
|
|
1073
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1074
|
+
*/
|
|
1075
|
+
this.onResourceTimeRangeMouseUp = new EventEmitter();
|
|
1076
|
+
/**
|
|
1077
|
+
* Grid resize lead to a new responsive level being applied
|
|
1078
|
+
* @param {object} event Event object
|
|
1079
|
+
* @param {Grid.view.Grid} event.grid Grid that was resized
|
|
1080
|
+
* @param {string} event.level New responsive level (small, large, etc)
|
|
1081
|
+
* @param {number} event.width New width in px
|
|
1082
|
+
* @param {string} event.oldLevel Old responsive level
|
|
1083
|
+
* @param {number} event.oldWidth Old width in px
|
|
1084
|
+
*/
|
|
1085
|
+
this.onResponsive = new EventEmitter();
|
|
1086
|
+
/**
|
|
1087
|
+
* This event fires when a row has finished collapsing.
|
|
1088
|
+
* @param {object} event Event object
|
|
1089
|
+
* @param {Core.data.Model} event.record Record
|
|
1090
|
+
*/
|
|
1091
|
+
this.onRowCollapse = new EventEmitter();
|
|
1092
|
+
/**
|
|
1093
|
+
* This event fires when a row expand has finished expanding.
|
|
1094
|
+
* ...
|
|
1095
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-rowExpand)
|
|
1096
|
+
* @param {object} event Event object
|
|
1097
|
+
* @param {Core.data.Model} event.record Record
|
|
1098
|
+
* @param {object} event.expandedElements An object with the Grid region name as property and the expanded body element as value
|
|
1099
|
+
* @param {Core.widget.Widget} event.widget In case of expanding a Widget, this will be a reference to the instance created by the actual expansion. If there is multiple Grid regions, use the `widgets` param instead.
|
|
1100
|
+
* @param {object} event.widgets In case of expanding a Widget, this will be an object with the Grid region name as property and the reference to the widget instance created by the actual expansion
|
|
1101
|
+
*/
|
|
1102
|
+
this.onRowExpand = new EventEmitter();
|
|
1103
|
+
/**
|
|
1104
|
+
* Fired when the mouse enters a row
|
|
1105
|
+
* @param {object} event Event object
|
|
1106
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
1107
|
+
* @param {Core.data.Model} event.record The record representing the hovered row
|
|
1108
|
+
* @param {Grid.column.Column} event.column The column currently hovered
|
|
1109
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
1110
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
1111
|
+
*/
|
|
1112
|
+
this.onRowMouseEnter = new EventEmitter();
|
|
1113
|
+
/**
|
|
1114
|
+
* Fired when the mouse leaves a row
|
|
1115
|
+
* @param {object} event Event object
|
|
1116
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
1117
|
+
* @param {Core.data.Model} event.record The record representing the row that the mouse left
|
|
1118
|
+
* @param {HTMLElement} event.cellElement The cell HTML element that the mouse left
|
|
1119
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
1120
|
+
*/
|
|
1121
|
+
this.onRowMouseLeave = new EventEmitter();
|
|
1122
|
+
/**
|
|
1123
|
+
* Grid has scrolled vertically
|
|
1124
|
+
* @param {object} event Event object
|
|
1125
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance.
|
|
1126
|
+
* @param {number} event.scrollTop The vertical scroll position.
|
|
1127
|
+
*/
|
|
1128
|
+
this.onScroll = new EventEmitter();
|
|
1129
|
+
/**
|
|
1130
|
+
* The selection has been changed.
|
|
1131
|
+
* @param {object} event Event object
|
|
1132
|
+
* @param {'select','deselect'} event.action `'select'`/`'deselect'`
|
|
1133
|
+
* @param {'row','cell'} event.mode `'row'`/`'cell'`
|
|
1134
|
+
* @param {Grid.view.Grid} event.source
|
|
1135
|
+
* @param {Core.data.Model[]} event.deselected The records deselected in this operation.
|
|
1136
|
+
* @param {Core.data.Model[]} event.selected The records selected in this operation.
|
|
1137
|
+
* @param {Core.data.Model[]} event.selection The records in the new selection.
|
|
1138
|
+
* @param {Grid.util.GridLocation[]} event.deselectedCells The cells deselected in this operation.
|
|
1139
|
+
* @param {Grid.util.GridLocation[]} event.selectedCells The cells selected in this operation.
|
|
1140
|
+
* @param {Grid.util.GridLocation[]} event.cellSelection The cells in the new selection.
|
|
1141
|
+
*/
|
|
1142
|
+
this.onSelectionChange = new EventEmitter();
|
|
1143
|
+
/**
|
|
1144
|
+
* The selectionMode configuration has been changed.
|
|
1145
|
+
* @param {object} event Event object
|
|
1146
|
+
* @param {object} event.selectionMode The new [selectionMode](https://bryntum.com/products/scheduler/docs/api/Grid/view/mixin/GridSelection#config-selectionMode)
|
|
1147
|
+
*/
|
|
1148
|
+
this.onSelectionModeChange = new EventEmitter();
|
|
1149
|
+
/**
|
|
1150
|
+
* Triggered after a widget is shown.
|
|
1151
|
+
* @param {object} event Event object
|
|
1152
|
+
* @param {Core.widget.Widget} event.source The widget
|
|
1153
|
+
*/
|
|
1154
|
+
this.onShow = new EventEmitter();
|
|
1155
|
+
/**
|
|
1156
|
+
* Fires when splitting the Grid.
|
|
1157
|
+
* @param {object} event Event object
|
|
1158
|
+
* @param {Grid.view.GridBase[]} event.subViews The sub views created by the split
|
|
1159
|
+
* @param {object} event.options The options passed to the split call
|
|
1160
|
+
* @param {'horizontal','vertical','both'} event.options.direction The direction of the split
|
|
1161
|
+
* @param {Grid.column.Column} event.options.atColumn The column to split at
|
|
1162
|
+
* @param {Core.data.Model} event.options.atRecord The record to split at
|
|
1163
|
+
*/
|
|
1164
|
+
this.onSplit = new EventEmitter();
|
|
1165
|
+
/**
|
|
1166
|
+
* Fired by the Grid when the collapse icon is clicked. Return `false` to prevent the default collapse action,
|
|
1167
|
+
* if you want to implement your own behavior.
|
|
1168
|
+
* @param {object} event Event object
|
|
1169
|
+
* @param {Grid.view.Grid} event.source The Grid instance.
|
|
1170
|
+
* @param {Grid.view.SubGrid} event.subGrid The subgrid
|
|
1171
|
+
* @param {Event} event.domEvent The native DOM event
|
|
1172
|
+
*/
|
|
1173
|
+
this.onSplitterCollapseClick = new EventEmitter();
|
|
1174
|
+
/**
|
|
1175
|
+
* Fired by the Grid after a sub-grid has been resized using the splitter
|
|
1176
|
+
* @param {object} event Event object
|
|
1177
|
+
* @param {Grid.view.Grid} event.source The Grid instance.
|
|
1178
|
+
* @param {Grid.view.SubGrid} event.subGrid The resized subgrid
|
|
1179
|
+
* @param {Event} event.domEvent The native DOM event
|
|
1180
|
+
*/
|
|
1181
|
+
this.onSplitterDragEnd = new EventEmitter();
|
|
1182
|
+
/**
|
|
1183
|
+
* Fired by the Grid when a sub-grid resize gesture starts
|
|
1184
|
+
* @param {object} event Event object
|
|
1185
|
+
* @param {Grid.view.Grid} event.source The Grid instance.
|
|
1186
|
+
* @param {Grid.view.SubGrid} event.subGrid The subgrid about to be resized
|
|
1187
|
+
* @param {Event} event.domEvent The native DOM event
|
|
1188
|
+
*/
|
|
1189
|
+
this.onSplitterDragStart = new EventEmitter();
|
|
1190
|
+
/**
|
|
1191
|
+
* Fired by the Grid when the expand icon is clicked. Return `false` to prevent the default expand action,
|
|
1192
|
+
* if you want to implement your own behavior.
|
|
1193
|
+
* @param {object} event Event object
|
|
1194
|
+
* @param {Grid.view.Grid} event.source The Grid instance.
|
|
1195
|
+
* @param {Grid.view.SubGrid} event.subGrid The subgrid
|
|
1196
|
+
* @param {Event} event.domEvent The native DOM event
|
|
1197
|
+
*/
|
|
1198
|
+
this.onSplitterExpandClick = new EventEmitter();
|
|
1199
|
+
/**
|
|
1200
|
+
* Fires on the owning Grid when editing starts
|
|
1201
|
+
* @param {object} event Event object
|
|
1202
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
1203
|
+
* @param {CellEditorContext} event.editorContext Editing context
|
|
1204
|
+
*/
|
|
1205
|
+
this.onStartCellEdit = new EventEmitter();
|
|
1206
|
+
/**
|
|
1207
|
+
* Fires on the owning Grid when editing starts
|
|
1208
|
+
* @param {object} event Event object
|
|
1209
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
1210
|
+
* @param {RowEditorContext} event.editorContext Editing context
|
|
1211
|
+
*/
|
|
1212
|
+
this.onStartRowEdit = new EventEmitter();
|
|
1213
|
+
/**
|
|
1214
|
+
* Fires after a sub grid is collapsed.
|
|
1215
|
+
* @param {object} event Event object
|
|
1216
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance
|
|
1217
|
+
* @param {Grid.view.SubGrid} event.subGrid The sub grid instance
|
|
1218
|
+
*/
|
|
1219
|
+
this.onSubGridCollapse = new EventEmitter();
|
|
1220
|
+
/**
|
|
1221
|
+
* Fires after a sub grid is expanded.
|
|
1222
|
+
* @param {object} event Event object
|
|
1223
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance
|
|
1224
|
+
* @param {Grid.view.SubGrid} event.subGrid The sub grid instance
|
|
1225
|
+
*/
|
|
1226
|
+
this.onSubGridExpand = new EventEmitter();
|
|
1227
|
+
/**
|
|
1228
|
+
* Fired when the tick size changes.
|
|
1229
|
+
* ...
|
|
1230
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-tickSizeChange)
|
|
1231
|
+
* @param {object} event Event object
|
|
1232
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler instance.
|
|
1233
|
+
* @param {number} event.tickSize The tick size in pixels
|
|
1234
|
+
*/
|
|
1235
|
+
this.onTickSizeChange = new EventEmitter();
|
|
1236
|
+
/**
|
|
1237
|
+
* Fired when the timeaxis has changed, for example by zooming or configuring a new time span.
|
|
1238
|
+
* @param {object} event Event object
|
|
1239
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler
|
|
1240
|
+
* @param {object} event.config Config object used to reconfigure the time axis.
|
|
1241
|
+
* @param {Date} event.config.startDate New start date (if supplied)
|
|
1242
|
+
* @param {Date} event.config.endDate New end date (if supplied)
|
|
1243
|
+
*/
|
|
1244
|
+
this.onTimeAxisChange = new EventEmitter();
|
|
1245
|
+
/**
|
|
1246
|
+
* Fires after a click on a time axis cell
|
|
1247
|
+
* @param {object} event Event object
|
|
1248
|
+
* @param {Scheduler.column.TimeAxisColumn,Scheduler.column.VerticalTimeAxisColumn} event.source The column object
|
|
1249
|
+
* @param {Date} event.startDate The start date of the header cell
|
|
1250
|
+
* @param {Date} event.endDate The end date of the header cell
|
|
1251
|
+
* @param {Event} event.event The event object
|
|
1252
|
+
*/
|
|
1253
|
+
this.onTimeAxisHeaderClick = new EventEmitter();
|
|
1254
|
+
/**
|
|
1255
|
+
* Fires after a right click on a time axis cell
|
|
1256
|
+
* @param {object} event Event object
|
|
1257
|
+
* @param {Scheduler.column.TimeAxisColumn,Scheduler.column.VerticalTimeAxisColumn} event.source The column object
|
|
1258
|
+
* @param {Date} event.startDate The start date of the header cell
|
|
1259
|
+
* @param {Date} event.endDate The end date of the header cell
|
|
1260
|
+
* @param {Event} event.event The event object
|
|
1261
|
+
*/
|
|
1262
|
+
this.onTimeAxisHeaderContextMenu = new EventEmitter();
|
|
1263
|
+
/**
|
|
1264
|
+
* Fires after a double click on a time axis cell
|
|
1265
|
+
* @param {object} event Event object
|
|
1266
|
+
* @param {Scheduler.column.TimeAxisColumn,Scheduler.column.VerticalTimeAxisColumn} event.source The column object
|
|
1267
|
+
* @param {Date} event.startDate The start date of the header cell
|
|
1268
|
+
* @param {Date} event.endDate The end date of the header cell
|
|
1269
|
+
* @param {Event} event.event The event object
|
|
1270
|
+
*/
|
|
1271
|
+
this.onTimeAxisHeaderDblClick = new EventEmitter();
|
|
1272
|
+
/**
|
|
1273
|
+
* This event fires on the owning Scheduler or Gantt widget before the context menu is shown for the time axis header.
|
|
1274
|
+
* Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/scheduler/docs/api/Scheduler/feature/TimeAxisHeaderMenu#config-processItems).
|
|
1275
|
+
* ...
|
|
1276
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-timeAxisHeaderMenuBeforeShow)
|
|
1277
|
+
* @param {object} event Event object
|
|
1278
|
+
* @param {Scheduler.view.Scheduler} event.source The scheduler
|
|
1279
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
1280
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
1281
|
+
* @param {Grid.column.Column} event.column Time axis column
|
|
1282
|
+
*/
|
|
1283
|
+
this.onTimeAxisHeaderMenuBeforeShow = new EventEmitter();
|
|
1284
|
+
/**
|
|
1285
|
+
* This event fires on the owning Scheduler or Gantt widget when an item is selected in the header context menu.
|
|
1286
|
+
* @param {object} event Event object
|
|
1287
|
+
* @param {Scheduler.view.Scheduler} event.source The scheduler
|
|
1288
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
1289
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
1290
|
+
* @param {Grid.column.Column} event.column Time axis column
|
|
1291
|
+
*/
|
|
1292
|
+
this.onTimeAxisHeaderMenuItem = new EventEmitter();
|
|
1293
|
+
/**
|
|
1294
|
+
* This event fires on the owning Scheduler or Gantt widget after the context menu is shown for a header
|
|
1295
|
+
* @param {object} event Event object
|
|
1296
|
+
* @param {Scheduler.view.Scheduler} event.source The scheduler
|
|
1297
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
1298
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
1299
|
+
* @param {Grid.column.Column} event.column Time axis column
|
|
1300
|
+
*/
|
|
1301
|
+
this.onTimeAxisHeaderMenuShow = new EventEmitter();
|
|
1302
|
+
/**
|
|
1303
|
+
* Fired when the pointer-activated [timelineContext](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/mixin/TimelineDomEvents#property-timelineContext) has changed.
|
|
1304
|
+
* @param {object} event Event object
|
|
1305
|
+
* @param {Scheduler.util.TimelineContext} event.oldContext The tick/resource context being deactivated.
|
|
1306
|
+
* @param {Scheduler.util.TimelineContext} event.context The tick/resource context being activated.
|
|
1307
|
+
*/
|
|
1308
|
+
this.onTimelineContextChange = new EventEmitter();
|
|
1309
|
+
/**
|
|
1310
|
+
* Fired when the *scheduler* viewport (not the overall Scheduler element) changes size.
|
|
1311
|
+
* This happens when the grid changes height, or when the subgrid which encapsulates the
|
|
1312
|
+
* scheduler column changes width.
|
|
1313
|
+
* @param {object} event Event object
|
|
1314
|
+
* @param {Core.widget.Widget} event.source This Scheduler
|
|
1315
|
+
* @param {number} event.width The new width
|
|
1316
|
+
* @param {number} event.height The new height
|
|
1317
|
+
* @param {number} event.oldWidth The old width
|
|
1318
|
+
* @param {number} event.oldHeight The old height
|
|
1319
|
+
*/
|
|
1320
|
+
this.onTimelineViewportResize = new EventEmitter();
|
|
1321
|
+
/**
|
|
1322
|
+
* Fired on the owning Scheduler or Gantt widget when a click happens on a time range header element
|
|
1323
|
+
* @param {object} event Event object
|
|
1324
|
+
* @param {Scheduler.view.Scheduler} event.source Scheduler instance
|
|
1325
|
+
* @param {Scheduler.model.TimeSpan} event.timeRangeRecord The record
|
|
1326
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1327
|
+
*/
|
|
1328
|
+
this.onTimeRangeHeaderClick = new EventEmitter();
|
|
1329
|
+
/**
|
|
1330
|
+
* Fired on the owning Scheduler or Gantt widget when a right click happens on a time range header element
|
|
1331
|
+
* @param {object} event Event object
|
|
1332
|
+
* @param {Scheduler.view.Scheduler} event.source Scheduler instance
|
|
1333
|
+
* @param {Scheduler.model.TimeSpan} event.timeRangeRecord The record
|
|
1334
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1335
|
+
*/
|
|
1336
|
+
this.onTimeRangeHeaderContextMenu = new EventEmitter();
|
|
1337
|
+
/**
|
|
1338
|
+
* Fired on the owning Scheduler or Gantt widget when a double click happens on a time range header element
|
|
1339
|
+
* @param {object} event Event object
|
|
1340
|
+
* @param {Scheduler.view.Scheduler} event.source Scheduler instance
|
|
1341
|
+
* @param {Scheduler.model.TimeSpan} event.timeRangeRecord The record
|
|
1342
|
+
* @param {MouseEvent} event.domEvent Browser event
|
|
1343
|
+
*/
|
|
1344
|
+
this.onTimeRangeHeaderDblClick = new EventEmitter();
|
|
1345
|
+
/**
|
|
1346
|
+
* Fired when one or more groups are expanded or collapsed
|
|
1347
|
+
* @param {object} event Event object
|
|
1348
|
+
* @param {Core.data.Model} event.groupRecord [DEPRECATED] Use `groupRecords` param instead
|
|
1349
|
+
* @param {Core.data.Model[]} event.groupRecords The group records being toggled
|
|
1350
|
+
* @param {boolean} event.collapse Collapsed (true) or expanded (false)
|
|
1351
|
+
* @param {boolean} event.allRecords True if this event is part of toggling all groups
|
|
1352
|
+
*/
|
|
1353
|
+
this.onToggleGroup = new EventEmitter();
|
|
1354
|
+
/**
|
|
1355
|
+
* Fired after a parent node record toggles its collapsed state.
|
|
1356
|
+
* @param {object} event Event object
|
|
1357
|
+
* @param {Core.data.Model} event.record The record being toggled.
|
|
1358
|
+
* @param {boolean} event.collapse `true` if the node is being collapsed.
|
|
1359
|
+
*/
|
|
1360
|
+
this.onToggleNode = new EventEmitter();
|
|
1361
|
+
/**
|
|
1362
|
+
* A header [tool](https://bryntum.com/products/scheduler/docs/api/Core/widget/Panel#config-tools) has been clicked.
|
|
1363
|
+
* @param {object} event Event object
|
|
1364
|
+
* @param {Core.widget.Tool} event.source This Panel.
|
|
1365
|
+
* @param {Core.widget.Tool} event.tool The tool which is being clicked.
|
|
1366
|
+
*/
|
|
1367
|
+
this.onToolClick = new EventEmitter();
|
|
1368
|
+
/**
|
|
1369
|
+
* Fires when row locking is disabled.
|
|
1370
|
+
* @param {object} event Event object
|
|
1371
|
+
* @param {Grid.view.GridBase} event.clone The locked clone that will be destroyed
|
|
1372
|
+
*/
|
|
1373
|
+
this.onUnlockRows = new EventEmitter();
|
|
1374
|
+
/**
|
|
1375
|
+
* Fires when un-splitting the Grid.
|
|
1376
|
+
*/
|
|
1377
|
+
this.onUnsplit = new EventEmitter();
|
|
1378
|
+
/**
|
|
1379
|
+
* Fired when the range of dates visible within the viewport changes. This will be when
|
|
1380
|
+
* scrolling along a time axis.
|
|
1381
|
+
* ...
|
|
1382
|
+
* [View online docs...](https://bryntum.com/products/scheduler/docs/api/Scheduler/view/TimelineHistogram#event-visibleDateRangeChange)
|
|
1383
|
+
* @param {object} event Event object
|
|
1384
|
+
* @param {Scheduler.view.Scheduler} event.source This Scheduler instance.
|
|
1385
|
+
* @param {object} event.old The old date range
|
|
1386
|
+
* @param {Date} event.old.startDate the old start date.
|
|
1387
|
+
* @param {Date} event.old.endDate the old end date.
|
|
1388
|
+
* @param {object} event.new The new date range
|
|
1389
|
+
* @param {Date} event.new.startDate the new start date.
|
|
1390
|
+
* @param {Date} event.new.endDate the new end date.
|
|
1391
|
+
*/
|
|
1392
|
+
this.onVisibleDateRangeChange = new EventEmitter();
|
|
1393
|
+
this.elementRef = element;
|
|
1394
|
+
}
|
|
1395
|
+
/**
|
|
1396
|
+
* Create and append the underlying widget
|
|
1397
|
+
*/
|
|
1398
|
+
ngOnInit() {
|
|
1399
|
+
const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumTimelineHistogramComponent;
|
|
1400
|
+
bryntumConfigs.filter(prop => prop in this).forEach(prop => {
|
|
1401
|
+
// @ts-ignore
|
|
1402
|
+
WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
|
|
1403
|
+
if (['features', 'config'].includes(prop)) {
|
|
1404
|
+
WrapperHelper.devWarningConfigProp(instanceName, prop);
|
|
1405
|
+
}
|
|
1406
|
+
});
|
|
1407
|
+
// @ts-ignore
|
|
1408
|
+
bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
|
|
1409
|
+
const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
|
|
1410
|
+
// @ts-ignore
|
|
1411
|
+
bryntumConfig.listeners[eventName(event)] = e => {
|
|
1412
|
+
// @ts-ignore
|
|
1413
|
+
me[event].emit(e);
|
|
1414
|
+
// EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
|
|
1415
|
+
// in Angular listeners
|
|
1416
|
+
return e.returnValue;
|
|
1417
|
+
};
|
|
1418
|
+
});
|
|
1419
|
+
// If component has no container specified in config then use adopt to Wrapper's element
|
|
1420
|
+
const containerParam = [
|
|
1421
|
+
'adopt',
|
|
1422
|
+
'appendTo',
|
|
1423
|
+
'insertAfter',
|
|
1424
|
+
'insertBefore'
|
|
1425
|
+
// @ts-ignore
|
|
1426
|
+
].find(prop => bryntumConfig[prop]);
|
|
1427
|
+
if (!containerParam) {
|
|
1428
|
+
if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
|
|
1429
|
+
// Button should always be <a> or <button> inside owner element
|
|
1430
|
+
bryntumConfig.appendTo = elementRef.nativeElement;
|
|
1431
|
+
}
|
|
1432
|
+
else {
|
|
1433
|
+
bryntumConfig.adopt = elementRef.nativeElement;
|
|
1434
|
+
}
|
|
1435
|
+
}
|
|
1436
|
+
else {
|
|
1437
|
+
WrapperHelper.devWarningContainer(instanceName, containerParam);
|
|
1438
|
+
}
|
|
1439
|
+
// @ts-ignore
|
|
1440
|
+
me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
|
|
1441
|
+
// Backwards compatibility for gridInstance, schedulerInstance etc.
|
|
1442
|
+
// @ts-ignore
|
|
1443
|
+
me[StringHelper.uncapitalize(instanceName) + 'Instance'] = me.instance;
|
|
1444
|
+
//
|
|
1445
|
+
}
|
|
1446
|
+
/**
|
|
1447
|
+
* Watch for changes
|
|
1448
|
+
* @param changes
|
|
1449
|
+
*/
|
|
1450
|
+
ngOnChanges(changes) {
|
|
1451
|
+
const { instance } = this, { instanceName } = BryntumTimelineHistogramComponent;
|
|
1452
|
+
if (!instance) {
|
|
1453
|
+
return;
|
|
1454
|
+
}
|
|
1455
|
+
// Iterate over all changes
|
|
1456
|
+
Object.entries(changes).forEach(([prop, change]) => {
|
|
1457
|
+
const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumTimelineHistogramComponent;
|
|
1458
|
+
if (bryntumProps.includes(prop)) {
|
|
1459
|
+
WrapperHelper.applyPropValue(instance, prop, newValue, false);
|
|
1460
|
+
if (bryntumConfigsOnly.includes(prop)) {
|
|
1461
|
+
WrapperHelper.devWarningUpdateProp(instanceName, prop);
|
|
1462
|
+
}
|
|
1463
|
+
}
|
|
1464
|
+
});
|
|
1465
|
+
}
|
|
1466
|
+
/**
|
|
1467
|
+
* Destroy the component
|
|
1468
|
+
*/
|
|
1469
|
+
ngOnDestroy() {
|
|
1470
|
+
// @ts-ignore
|
|
1471
|
+
if (this.instance && this.instance.destroy) {
|
|
1472
|
+
this.instance.destroy();
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
}
|
|
1476
|
+
BryntumTimelineHistogramComponent.instanceClass = TimelineHistogram;
|
|
1477
|
+
BryntumTimelineHistogramComponent.instanceName = 'TimelineHistogram';
|
|
1478
|
+
BryntumTimelineHistogramComponent.bryntumEvents = [
|
|
1479
|
+
'onBeforeAssignmentDelete',
|
|
1480
|
+
'onBeforeCancelCellEdit',
|
|
1481
|
+
'onBeforeCancelRowEdit',
|
|
1482
|
+
'onBeforeCellEditStart',
|
|
1483
|
+
'onBeforeCellRangeDelete',
|
|
1484
|
+
'onBeforeCellRangeEdit',
|
|
1485
|
+
'onBeforeColumnDragStart',
|
|
1486
|
+
'onBeforeColumnDropFinalize',
|
|
1487
|
+
'onBeforeColumnResize',
|
|
1488
|
+
'onBeforeCopy',
|
|
1489
|
+
'onBeforeCSVExport',
|
|
1490
|
+
'onBeforeDestroy',
|
|
1491
|
+
'onBeforeEventDelete',
|
|
1492
|
+
'onBeforeExcelExport',
|
|
1493
|
+
'onBeforeFillHandleDragStart',
|
|
1494
|
+
'onBeforeFinishCellEdit',
|
|
1495
|
+
'onBeforeFinishRowEdit',
|
|
1496
|
+
'onBeforeHide',
|
|
1497
|
+
'onBeforeHistogramDataCacheSet',
|
|
1498
|
+
'onBeforePan',
|
|
1499
|
+
'onBeforePaste',
|
|
1500
|
+
'onBeforePdfExport',
|
|
1501
|
+
'onBeforePresetChange',
|
|
1502
|
+
'onBeforeRenderHistogramRow',
|
|
1503
|
+
'onBeforeRenderRecordHistogram',
|
|
1504
|
+
'onBeforeRenderRow',
|
|
1505
|
+
'onBeforeRenderRows',
|
|
1506
|
+
'onBeforeRowCollapse',
|
|
1507
|
+
'onBeforeRowExpand',
|
|
1508
|
+
'onBeforeSelectionChange',
|
|
1509
|
+
'onBeforeSetRecord',
|
|
1510
|
+
'onBeforeShow',
|
|
1511
|
+
'onBeforeStartRowEdit',
|
|
1512
|
+
'onBeforeStateApply',
|
|
1513
|
+
'onBeforeStateSave',
|
|
1514
|
+
'onBeforeToggleGroup',
|
|
1515
|
+
'onBeforeToggleNode',
|
|
1516
|
+
'onCancelCellEdit',
|
|
1517
|
+
'onCatchAll',
|
|
1518
|
+
'onCellClick',
|
|
1519
|
+
'onCellContextMenu',
|
|
1520
|
+
'onCellDblClick',
|
|
1521
|
+
'onCellMenuBeforeShow',
|
|
1522
|
+
'onCellMenuItem',
|
|
1523
|
+
'onCellMenuShow',
|
|
1524
|
+
'onCellMenuToggleItem',
|
|
1525
|
+
'onCellMouseEnter',
|
|
1526
|
+
'onCellMouseLeave',
|
|
1527
|
+
'onCellMouseOut',
|
|
1528
|
+
'onCellMouseOver',
|
|
1529
|
+
'onCollapse',
|
|
1530
|
+
'onCollapseNode',
|
|
1531
|
+
'onColumnDrag',
|
|
1532
|
+
'onColumnDragStart',
|
|
1533
|
+
'onColumnDrop',
|
|
1534
|
+
'onColumnResize',
|
|
1535
|
+
'onColumnResizeStart',
|
|
1536
|
+
'onContextMenuItem',
|
|
1537
|
+
'onContextMenuToggleItem',
|
|
1538
|
+
'onCopy',
|
|
1539
|
+
'onCurrentTimelineUpdate',
|
|
1540
|
+
'onDataChange',
|
|
1541
|
+
'onDateRangeChange',
|
|
1542
|
+
'onDestroy',
|
|
1543
|
+
'onDirtyStateChange',
|
|
1544
|
+
'onDragSelecting',
|
|
1545
|
+
'onElementCreated',
|
|
1546
|
+
'onExpand',
|
|
1547
|
+
'onExpandNode',
|
|
1548
|
+
'onFileDrop',
|
|
1549
|
+
'onFillHandleBeforeDragFinalize',
|
|
1550
|
+
'onFillHandleDrag',
|
|
1551
|
+
'onFillHandleDragAbort',
|
|
1552
|
+
'onFillHandleDragEnd',
|
|
1553
|
+
'onFillHandleDragStart',
|
|
1554
|
+
'onFinishCellEdit',
|
|
1555
|
+
'onFinishRowEdit',
|
|
1556
|
+
'onFocusIn',
|
|
1557
|
+
'onFocusOut',
|
|
1558
|
+
'onGridRowBeforeDragStart',
|
|
1559
|
+
'onGridRowBeforeDropFinalize',
|
|
1560
|
+
'onGridRowDrag',
|
|
1561
|
+
'onGridRowDragAbort',
|
|
1562
|
+
'onGridRowDragStart',
|
|
1563
|
+
'onGridRowDrop',
|
|
1564
|
+
'onHeaderClick',
|
|
1565
|
+
'onHeaderMenuBeforeShow',
|
|
1566
|
+
'onHeaderMenuItem',
|
|
1567
|
+
'onHeaderMenuShow',
|
|
1568
|
+
'onHeaderMenuToggleItem',
|
|
1569
|
+
'onHide',
|
|
1570
|
+
'onHistogramDataCacheSet',
|
|
1571
|
+
'onLockRows',
|
|
1572
|
+
'onMouseOut',
|
|
1573
|
+
'onMouseOver',
|
|
1574
|
+
'onNoZoomChange',
|
|
1575
|
+
'onPaint',
|
|
1576
|
+
'onPaste',
|
|
1577
|
+
'onPdfExport',
|
|
1578
|
+
'onPresetChange',
|
|
1579
|
+
'onReadOnly',
|
|
1580
|
+
'onRecompose',
|
|
1581
|
+
'onRenderRow',
|
|
1582
|
+
'onRenderRows',
|
|
1583
|
+
'onResize',
|
|
1584
|
+
'onResourceMenuBeforeShow',
|
|
1585
|
+
'onResourceMenuItem',
|
|
1586
|
+
'onResourceMenuShow',
|
|
1587
|
+
'onResourceMenuToggleItem',
|
|
1588
|
+
'onResourceTimeRangeClick',
|
|
1589
|
+
'onResourceTimeRangeContextMenu',
|
|
1590
|
+
'onResourceTimeRangeDblClick',
|
|
1591
|
+
'onResourceTimeRangeMouseDown',
|
|
1592
|
+
'onResourceTimeRangeMouseOut',
|
|
1593
|
+
'onResourceTimeRangeMouseOver',
|
|
1594
|
+
'onResourceTimeRangeMouseUp',
|
|
1595
|
+
'onResponsive',
|
|
1596
|
+
'onRowCollapse',
|
|
1597
|
+
'onRowExpand',
|
|
1598
|
+
'onRowMouseEnter',
|
|
1599
|
+
'onRowMouseLeave',
|
|
1600
|
+
'onScroll',
|
|
1601
|
+
'onSelectionChange',
|
|
1602
|
+
'onSelectionModeChange',
|
|
1603
|
+
'onShow',
|
|
1604
|
+
'onSplit',
|
|
1605
|
+
'onSplitterCollapseClick',
|
|
1606
|
+
'onSplitterDragEnd',
|
|
1607
|
+
'onSplitterDragStart',
|
|
1608
|
+
'onSplitterExpandClick',
|
|
1609
|
+
'onStartCellEdit',
|
|
1610
|
+
'onStartRowEdit',
|
|
1611
|
+
'onSubGridCollapse',
|
|
1612
|
+
'onSubGridExpand',
|
|
1613
|
+
'onTickSizeChange',
|
|
1614
|
+
'onTimeAxisChange',
|
|
1615
|
+
'onTimeAxisHeaderClick',
|
|
1616
|
+
'onTimeAxisHeaderContextMenu',
|
|
1617
|
+
'onTimeAxisHeaderDblClick',
|
|
1618
|
+
'onTimeAxisHeaderMenuBeforeShow',
|
|
1619
|
+
'onTimeAxisHeaderMenuItem',
|
|
1620
|
+
'onTimeAxisHeaderMenuShow',
|
|
1621
|
+
'onTimelineContextChange',
|
|
1622
|
+
'onTimelineViewportResize',
|
|
1623
|
+
'onTimeRangeHeaderClick',
|
|
1624
|
+
'onTimeRangeHeaderContextMenu',
|
|
1625
|
+
'onTimeRangeHeaderDblClick',
|
|
1626
|
+
'onToggleGroup',
|
|
1627
|
+
'onToggleNode',
|
|
1628
|
+
'onToolClick',
|
|
1629
|
+
'onUnlockRows',
|
|
1630
|
+
'onUnsplit',
|
|
1631
|
+
'onVisibleDateRangeChange'
|
|
1632
|
+
];
|
|
1633
|
+
BryntumTimelineHistogramComponent.bryntumFeatureNames = [
|
|
1634
|
+
'aiFilterFeature',
|
|
1635
|
+
'cellCopyPasteFeature',
|
|
1636
|
+
'cellEditFeature',
|
|
1637
|
+
'cellMenuFeature',
|
|
1638
|
+
'cellTooltipFeature',
|
|
1639
|
+
'chartsFeature',
|
|
1640
|
+
'columnAutoWidthFeature',
|
|
1641
|
+
'columnDragToolbarFeature',
|
|
1642
|
+
'columnLinesFeature',
|
|
1643
|
+
'columnPickerFeature',
|
|
1644
|
+
'columnRenameFeature',
|
|
1645
|
+
'columnReorderFeature',
|
|
1646
|
+
'columnResizeFeature',
|
|
1647
|
+
'excelExporterFeature',
|
|
1648
|
+
'fileDropFeature',
|
|
1649
|
+
'fillHandleFeature',
|
|
1650
|
+
'filterFeature',
|
|
1651
|
+
'filterBarFeature',
|
|
1652
|
+
'groupFeature',
|
|
1653
|
+
'groupSummaryFeature',
|
|
1654
|
+
'headerMenuFeature',
|
|
1655
|
+
'headerZoomFeature',
|
|
1656
|
+
'lockRowsFeature',
|
|
1657
|
+
'mergeCellsFeature',
|
|
1658
|
+
'nonWorkingTimeFeature',
|
|
1659
|
+
'panFeature',
|
|
1660
|
+
'pdfExportFeature',
|
|
1661
|
+
'pinColumnsFeature',
|
|
1662
|
+
'printFeature',
|
|
1663
|
+
'quickFindFeature',
|
|
1664
|
+
'regionResizeFeature',
|
|
1665
|
+
'resourceMenuFeature',
|
|
1666
|
+
'resourceTimeRangesFeature',
|
|
1667
|
+
'rowCopyPasteFeature',
|
|
1668
|
+
'rowEditFeature',
|
|
1669
|
+
'rowExpanderFeature',
|
|
1670
|
+
'rowReorderFeature',
|
|
1671
|
+
'rowResizeFeature',
|
|
1672
|
+
'scheduleTooltipFeature',
|
|
1673
|
+
'searchFeature',
|
|
1674
|
+
'sortFeature',
|
|
1675
|
+
'splitFeature',
|
|
1676
|
+
'stickyCellsFeature',
|
|
1677
|
+
'stripeFeature',
|
|
1678
|
+
'summaryFeature',
|
|
1679
|
+
'timeAxisHeaderMenuFeature',
|
|
1680
|
+
'timeRangesFeature',
|
|
1681
|
+
'treeFeature',
|
|
1682
|
+
'treeGroupFeature'
|
|
1683
|
+
];
|
|
1684
|
+
BryntumTimelineHistogramComponent.bryntumConfigs = BryntumTimelineHistogramComponent.bryntumFeatureNames.concat([
|
|
1685
|
+
'adopt',
|
|
1686
|
+
'aggregateDataEntry',
|
|
1687
|
+
'aggregateHistogramDataForGroups',
|
|
1688
|
+
'alignSelf',
|
|
1689
|
+
'animateFilterRemovals',
|
|
1690
|
+
'animateRemovingRows',
|
|
1691
|
+
'animateTreeNodeToggle',
|
|
1692
|
+
'appendTo',
|
|
1693
|
+
'ariaDescription',
|
|
1694
|
+
'ariaLabel',
|
|
1695
|
+
'autoAdjustTimeAxis',
|
|
1696
|
+
'autoHeight',
|
|
1697
|
+
'barMargin',
|
|
1698
|
+
'barTooltipTemplate',
|
|
1699
|
+
'bbar',
|
|
1700
|
+
'bodyCls',
|
|
1701
|
+
'bubbleEvents',
|
|
1702
|
+
'bufferCoef',
|
|
1703
|
+
'bufferThreshold',
|
|
1704
|
+
'callOnFunctions',
|
|
1705
|
+
'catchEventHandlerExceptions',
|
|
1706
|
+
'cellEllipsis',
|
|
1707
|
+
'cls',
|
|
1708
|
+
'collapsed',
|
|
1709
|
+
'collapsible',
|
|
1710
|
+
'color',
|
|
1711
|
+
'column',
|
|
1712
|
+
'columnLines',
|
|
1713
|
+
'columns',
|
|
1714
|
+
'config',
|
|
1715
|
+
'contentElementCls',
|
|
1716
|
+
'contextMenuTriggerEvent',
|
|
1717
|
+
'data',
|
|
1718
|
+
'dataField',
|
|
1719
|
+
'dataModelField',
|
|
1720
|
+
'dataset',
|
|
1721
|
+
'defaultRegion',
|
|
1722
|
+
'destroyStore',
|
|
1723
|
+
'detectCSSCompatibilityIssues',
|
|
1724
|
+
'disabled',
|
|
1725
|
+
'disableGridColumnIdWarning',
|
|
1726
|
+
'disableGridRowModelWarning',
|
|
1727
|
+
'displayDateFormat',
|
|
1728
|
+
'dock',
|
|
1729
|
+
'drawer',
|
|
1730
|
+
'durationDisplayPrecision',
|
|
1731
|
+
'elementAttributes',
|
|
1732
|
+
'emptyText',
|
|
1733
|
+
'enableEventAnimations',
|
|
1734
|
+
'enableRecurringEvents',
|
|
1735
|
+
'enableSticky',
|
|
1736
|
+
'enableTextSelection',
|
|
1737
|
+
'enableUndoRedoKeys',
|
|
1738
|
+
'endDate',
|
|
1739
|
+
'eventColor',
|
|
1740
|
+
'eventStyle',
|
|
1741
|
+
'extraData',
|
|
1742
|
+
'fillLastColumn',
|
|
1743
|
+
'fillTicks',
|
|
1744
|
+
'fixedRowHeight',
|
|
1745
|
+
'flex',
|
|
1746
|
+
'footer',
|
|
1747
|
+
'forceFit',
|
|
1748
|
+
'formulaProviders',
|
|
1749
|
+
'fullRowRefresh',
|
|
1750
|
+
'getBarClass',
|
|
1751
|
+
'getBarDOMConfig',
|
|
1752
|
+
'getBarText',
|
|
1753
|
+
'getBarTextDOMConfig',
|
|
1754
|
+
'getDataEntryForAggregating',
|
|
1755
|
+
'getOutlineClass',
|
|
1756
|
+
'getOutlineDOMConfig',
|
|
1757
|
+
'getRecordData',
|
|
1758
|
+
'getRowHeight',
|
|
1759
|
+
'hardRefreshOnTimeAxisReconfigure',
|
|
1760
|
+
'header',
|
|
1761
|
+
'height',
|
|
1762
|
+
'hidden',
|
|
1763
|
+
'hideFooters',
|
|
1764
|
+
'hideHeaders',
|
|
1765
|
+
'hideHorizontalScrollbar',
|
|
1766
|
+
'hideRowHover',
|
|
1767
|
+
'histogramWidget',
|
|
1768
|
+
'histogramWidgetClass',
|
|
1769
|
+
'hoverCls',
|
|
1770
|
+
'icon',
|
|
1771
|
+
'id',
|
|
1772
|
+
'ignoreDomEventsWhileScrolling',
|
|
1773
|
+
'ignoreParentReadOnly',
|
|
1774
|
+
'infiniteScroll',
|
|
1775
|
+
'initAggregatedDataEntry',
|
|
1776
|
+
'inputFieldAlign',
|
|
1777
|
+
'insertBefore',
|
|
1778
|
+
'insertFirst',
|
|
1779
|
+
'keyMap',
|
|
1780
|
+
'labelPosition',
|
|
1781
|
+
'listeners',
|
|
1782
|
+
'loadMask',
|
|
1783
|
+
'loadMaskDefaults',
|
|
1784
|
+
'loadMaskError',
|
|
1785
|
+
'localizable',
|
|
1786
|
+
'longPressTime',
|
|
1787
|
+
'managedEventSizing',
|
|
1788
|
+
'margin',
|
|
1789
|
+
'maskDefaults',
|
|
1790
|
+
'masked',
|
|
1791
|
+
'maxDate',
|
|
1792
|
+
'maxHeight',
|
|
1793
|
+
'maxTimeAxisUnit',
|
|
1794
|
+
'maxWidth',
|
|
1795
|
+
'maxZoomLevel',
|
|
1796
|
+
'minDate',
|
|
1797
|
+
'minHeight',
|
|
1798
|
+
'minWidth',
|
|
1799
|
+
'minZoomLevel',
|
|
1800
|
+
'monitorResize',
|
|
1801
|
+
'owner',
|
|
1802
|
+
'partner',
|
|
1803
|
+
'plugins',
|
|
1804
|
+
'preserveFocusOnDatasetChange',
|
|
1805
|
+
'preserveScroll',
|
|
1806
|
+
'preserveScrollOnDatasetChange',
|
|
1807
|
+
'presets',
|
|
1808
|
+
'preventTooltipOnTouch',
|
|
1809
|
+
'readOnly',
|
|
1810
|
+
'recurrenceConfirmationPopup',
|
|
1811
|
+
'relayStoreEvents',
|
|
1812
|
+
'rendition',
|
|
1813
|
+
'resizable',
|
|
1814
|
+
'resizeToFitIncludesHeader',
|
|
1815
|
+
'resourceTimeRangeRenderer',
|
|
1816
|
+
'responsiveLevels',
|
|
1817
|
+
'ripple',
|
|
1818
|
+
'rootElement',
|
|
1819
|
+
'rowHeight',
|
|
1820
|
+
'rowLines',
|
|
1821
|
+
'rtl',
|
|
1822
|
+
'scaleColumn',
|
|
1823
|
+
'scalePoints',
|
|
1824
|
+
'scrollable',
|
|
1825
|
+
'scrollerClass',
|
|
1826
|
+
'scrollManager',
|
|
1827
|
+
'selectionMode',
|
|
1828
|
+
'series',
|
|
1829
|
+
'showBarTip',
|
|
1830
|
+
'showBarTipWhenNavigatingTimeAxis',
|
|
1831
|
+
'showDirty',
|
|
1832
|
+
'snap',
|
|
1833
|
+
'snapRelativeToEventStartDate',
|
|
1834
|
+
'span',
|
|
1835
|
+
'startDate',
|
|
1836
|
+
'stateful',
|
|
1837
|
+
'statefulEvents',
|
|
1838
|
+
'stateId',
|
|
1839
|
+
'stateProvider',
|
|
1840
|
+
'stateSettings',
|
|
1841
|
+
'stickyHeaders',
|
|
1842
|
+
'store',
|
|
1843
|
+
'strips',
|
|
1844
|
+
'subGridConfigs',
|
|
1845
|
+
'suppressFit',
|
|
1846
|
+
'syncMask',
|
|
1847
|
+
'tab',
|
|
1848
|
+
'tabBarItems',
|
|
1849
|
+
'tbar',
|
|
1850
|
+
'tickSize',
|
|
1851
|
+
'timeAxis',
|
|
1852
|
+
'timeResolution',
|
|
1853
|
+
'timeZone',
|
|
1854
|
+
'title',
|
|
1855
|
+
'tools',
|
|
1856
|
+
'transition',
|
|
1857
|
+
'transitionDuration',
|
|
1858
|
+
'type',
|
|
1859
|
+
'ui',
|
|
1860
|
+
'viewPreset',
|
|
1861
|
+
'visibleDate',
|
|
1862
|
+
'visibleZoomFactor',
|
|
1863
|
+
'weekStartDay',
|
|
1864
|
+
'weight',
|
|
1865
|
+
'width',
|
|
1866
|
+
'workingTime',
|
|
1867
|
+
'zoomKeepsOriginalTimespan',
|
|
1868
|
+
'zoomOnMouseWheel',
|
|
1869
|
+
'zoomOnTimeAxisDoubleClick'
|
|
1870
|
+
]);
|
|
1871
|
+
BryntumTimelineHistogramComponent.bryntumConfigsOnly = [
|
|
1872
|
+
'adopt',
|
|
1873
|
+
'aggregateDataEntry',
|
|
1874
|
+
'aggregateHistogramDataForGroups',
|
|
1875
|
+
'animateFilterRemovals',
|
|
1876
|
+
'animateRemovingRows',
|
|
1877
|
+
'ariaDescription',
|
|
1878
|
+
'ariaLabel',
|
|
1879
|
+
'autoAdjustTimeAxis',
|
|
1880
|
+
'autoHeight',
|
|
1881
|
+
'barTooltipTemplate',
|
|
1882
|
+
'bbar',
|
|
1883
|
+
'bodyCls',
|
|
1884
|
+
'bubbleEvents',
|
|
1885
|
+
'bufferCoef',
|
|
1886
|
+
'bufferThreshold',
|
|
1887
|
+
'collapsible',
|
|
1888
|
+
'color',
|
|
1889
|
+
'config',
|
|
1890
|
+
'contentElementCls',
|
|
1891
|
+
'contextMenuTriggerEvent',
|
|
1892
|
+
'dataField',
|
|
1893
|
+
'dataModelField',
|
|
1894
|
+
'defaultRegion',
|
|
1895
|
+
'destroyStore',
|
|
1896
|
+
'detectCSSCompatibilityIssues',
|
|
1897
|
+
'disableGridColumnIdWarning',
|
|
1898
|
+
'disableGridRowModelWarning',
|
|
1899
|
+
'dock',
|
|
1900
|
+
'drawer',
|
|
1901
|
+
'durationDisplayPrecision',
|
|
1902
|
+
'elementAttributes',
|
|
1903
|
+
'enableRecurringEvents',
|
|
1904
|
+
'enableSticky',
|
|
1905
|
+
'enableTextSelection',
|
|
1906
|
+
'fillLastColumn',
|
|
1907
|
+
'fixedRowHeight',
|
|
1908
|
+
'footer',
|
|
1909
|
+
'formulaProviders',
|
|
1910
|
+
'fullRowRefresh',
|
|
1911
|
+
'getBarClass',
|
|
1912
|
+
'getBarDOMConfig',
|
|
1913
|
+
'getBarText',
|
|
1914
|
+
'getBarTextDOMConfig',
|
|
1915
|
+
'getDataEntryForAggregating',
|
|
1916
|
+
'getOutlineClass',
|
|
1917
|
+
'getOutlineDOMConfig',
|
|
1918
|
+
'getRecordData',
|
|
1919
|
+
'getRowHeight',
|
|
1920
|
+
'hardRefreshOnTimeAxisReconfigure',
|
|
1921
|
+
'header',
|
|
1922
|
+
'hideHorizontalScrollbar',
|
|
1923
|
+
'histogramWidgetClass',
|
|
1924
|
+
'hoverCls',
|
|
1925
|
+
'icon',
|
|
1926
|
+
'ignoreDomEventsWhileScrolling',
|
|
1927
|
+
'ignoreParentReadOnly',
|
|
1928
|
+
'initAggregatedDataEntry',
|
|
1929
|
+
'listeners',
|
|
1930
|
+
'loadMask',
|
|
1931
|
+
'loadMaskDefaults',
|
|
1932
|
+
'loadMaskError',
|
|
1933
|
+
'localizable',
|
|
1934
|
+
'managedEventSizing',
|
|
1935
|
+
'maskDefaults',
|
|
1936
|
+
'masked',
|
|
1937
|
+
'maxDate',
|
|
1938
|
+
'maxTimeAxisUnit',
|
|
1939
|
+
'minDate',
|
|
1940
|
+
'monitorResize',
|
|
1941
|
+
'owner',
|
|
1942
|
+
'partner',
|
|
1943
|
+
'plugins',
|
|
1944
|
+
'preserveFocusOnDatasetChange',
|
|
1945
|
+
'preserveScrollOnDatasetChange',
|
|
1946
|
+
'preventTooltipOnTouch',
|
|
1947
|
+
'relayStoreEvents',
|
|
1948
|
+
'resizable',
|
|
1949
|
+
'resizeToFitIncludesHeader',
|
|
1950
|
+
'resourceTimeRangeRenderer',
|
|
1951
|
+
'responsiveLevels',
|
|
1952
|
+
'ripple',
|
|
1953
|
+
'rootElement',
|
|
1954
|
+
'scaleColumn',
|
|
1955
|
+
'scrollerClass',
|
|
1956
|
+
'scrollManager',
|
|
1957
|
+
'series',
|
|
1958
|
+
'showBarTipWhenNavigatingTimeAxis',
|
|
1959
|
+
'showDirty',
|
|
1960
|
+
'snapRelativeToEventStartDate',
|
|
1961
|
+
'stateful',
|
|
1962
|
+
'statefulEvents',
|
|
1963
|
+
'stateId',
|
|
1964
|
+
'stateProvider',
|
|
1965
|
+
'stickyHeaders',
|
|
1966
|
+
'strips',
|
|
1967
|
+
'subGridConfigs',
|
|
1968
|
+
'syncMask',
|
|
1969
|
+
'tab',
|
|
1970
|
+
'tabBarItems',
|
|
1971
|
+
'tbar',
|
|
1972
|
+
'timeAxis',
|
|
1973
|
+
'type',
|
|
1974
|
+
'ui',
|
|
1975
|
+
'visibleZoomFactor',
|
|
1976
|
+
'weekStartDay',
|
|
1977
|
+
'weight',
|
|
1978
|
+
'zoomKeepsOriginalTimespan',
|
|
1979
|
+
'zoomOnMouseWheel',
|
|
1980
|
+
'zoomOnTimeAxisDoubleClick'
|
|
1981
|
+
];
|
|
1982
|
+
BryntumTimelineHistogramComponent.bryntumProps = BryntumTimelineHistogramComponent.bryntumFeatureNames.concat([
|
|
1983
|
+
'alignSelf',
|
|
1984
|
+
'animateTreeNodeToggle',
|
|
1985
|
+
'appendTo',
|
|
1986
|
+
'barMargin',
|
|
1987
|
+
'callOnFunctions',
|
|
1988
|
+
'catchEventHandlerExceptions',
|
|
1989
|
+
'cellEllipsis',
|
|
1990
|
+
'cls',
|
|
1991
|
+
'collapsed',
|
|
1992
|
+
'column',
|
|
1993
|
+
'columnLines',
|
|
1994
|
+
'columns',
|
|
1995
|
+
'data',
|
|
1996
|
+
'dataset',
|
|
1997
|
+
'disabled',
|
|
1998
|
+
'displayDateFormat',
|
|
1999
|
+
'emptyText',
|
|
2000
|
+
'enableEventAnimations',
|
|
2001
|
+
'enableUndoRedoKeys',
|
|
2002
|
+
'endDate',
|
|
2003
|
+
'eventColor',
|
|
2004
|
+
'eventStyle',
|
|
2005
|
+
'extraData',
|
|
2006
|
+
'fillTicks',
|
|
2007
|
+
'flex',
|
|
2008
|
+
'focusVisible',
|
|
2009
|
+
'forceFit',
|
|
2010
|
+
'hasChanges',
|
|
2011
|
+
'height',
|
|
2012
|
+
'hidden',
|
|
2013
|
+
'hideFooters',
|
|
2014
|
+
'hideHeaders',
|
|
2015
|
+
'hideRowHover',
|
|
2016
|
+
'histogramWidget',
|
|
2017
|
+
'id',
|
|
2018
|
+
'infiniteScroll',
|
|
2019
|
+
'inputFieldAlign',
|
|
2020
|
+
'insertBefore',
|
|
2021
|
+
'insertFirst',
|
|
2022
|
+
'keyMap',
|
|
2023
|
+
'labelPosition',
|
|
2024
|
+
'longPressTime',
|
|
2025
|
+
'margin',
|
|
2026
|
+
'maxHeight',
|
|
2027
|
+
'maxWidth',
|
|
2028
|
+
'maxZoomLevel',
|
|
2029
|
+
'minHeight',
|
|
2030
|
+
'minWidth',
|
|
2031
|
+
'minZoomLevel',
|
|
2032
|
+
'originalStore',
|
|
2033
|
+
'parent',
|
|
2034
|
+
'preserveScroll',
|
|
2035
|
+
'presets',
|
|
2036
|
+
'readOnly',
|
|
2037
|
+
'recurrenceConfirmationPopup',
|
|
2038
|
+
'rendition',
|
|
2039
|
+
'rowHeight',
|
|
2040
|
+
'rowLines',
|
|
2041
|
+
'rtl',
|
|
2042
|
+
'scalePoints',
|
|
2043
|
+
'scrollable',
|
|
2044
|
+
'scrollLeft',
|
|
2045
|
+
'scrollTop',
|
|
2046
|
+
'scrollX',
|
|
2047
|
+
'selectedCell',
|
|
2048
|
+
'selectedCells',
|
|
2049
|
+
'selectedRecord',
|
|
2050
|
+
'selectedRecords',
|
|
2051
|
+
'selectedRows',
|
|
2052
|
+
'selectionMode',
|
|
2053
|
+
'showBarTip',
|
|
2054
|
+
'snap',
|
|
2055
|
+
'span',
|
|
2056
|
+
'startDate',
|
|
2057
|
+
'state',
|
|
2058
|
+
'stateSettings',
|
|
2059
|
+
'store',
|
|
2060
|
+
'suppressFit',
|
|
2061
|
+
'tickSize',
|
|
2062
|
+
'timeResolution',
|
|
2063
|
+
'timeZone',
|
|
2064
|
+
'title',
|
|
2065
|
+
'tools',
|
|
2066
|
+
'tooltip',
|
|
2067
|
+
'transition',
|
|
2068
|
+
'transitionDuration',
|
|
2069
|
+
'viewPreset',
|
|
2070
|
+
'visibleDate',
|
|
2071
|
+
'width',
|
|
2072
|
+
'workingTime',
|
|
2073
|
+
'zoomLevel'
|
|
2074
|
+
]);
|
|
2075
|
+
BryntumTimelineHistogramComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumTimelineHistogramComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
2076
|
+
BryntumTimelineHistogramComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumTimelineHistogramComponent, selector: "bryntum-timeline-histogram", inputs: { adopt: "adopt", aggregateDataEntry: "aggregateDataEntry", aggregateHistogramDataForGroups: "aggregateHistogramDataForGroups", animateFilterRemovals: "animateFilterRemovals", animateRemovingRows: "animateRemovingRows", ariaDescription: "ariaDescription", ariaLabel: "ariaLabel", autoAdjustTimeAxis: "autoAdjustTimeAxis", autoHeight: "autoHeight", barTooltipTemplate: "barTooltipTemplate", bbar: "bbar", bodyCls: "bodyCls", bubbleEvents: "bubbleEvents", bufferCoef: "bufferCoef", bufferThreshold: "bufferThreshold", collapsible: "collapsible", color: "color", config: "config", contentElementCls: "contentElementCls", contextMenuTriggerEvent: "contextMenuTriggerEvent", dataField: "dataField", dataModelField: "dataModelField", defaultRegion: "defaultRegion", destroyStore: "destroyStore", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", disableGridColumnIdWarning: "disableGridColumnIdWarning", disableGridRowModelWarning: "disableGridRowModelWarning", dock: "dock", drawer: "drawer", durationDisplayPrecision: "durationDisplayPrecision", elementAttributes: "elementAttributes", enableRecurringEvents: "enableRecurringEvents", enableSticky: "enableSticky", enableTextSelection: "enableTextSelection", fillLastColumn: "fillLastColumn", fixedRowHeight: "fixedRowHeight", footer: "footer", formulaProviders: "formulaProviders", fullRowRefresh: "fullRowRefresh", getBarClass: "getBarClass", getBarDOMConfig: "getBarDOMConfig", getBarText: "getBarText", getBarTextDOMConfig: "getBarTextDOMConfig", getDataEntryForAggregating: "getDataEntryForAggregating", getOutlineClass: "getOutlineClass", getOutlineDOMConfig: "getOutlineDOMConfig", getRecordData: "getRecordData", getRowHeight: "getRowHeight", hardRefreshOnTimeAxisReconfigure: "hardRefreshOnTimeAxisReconfigure", header: "header", hideHorizontalScrollbar: "hideHorizontalScrollbar", histogramWidgetClass: "histogramWidgetClass", hoverCls: "hoverCls", icon: "icon", ignoreDomEventsWhileScrolling: "ignoreDomEventsWhileScrolling", ignoreParentReadOnly: "ignoreParentReadOnly", initAggregatedDataEntry: "initAggregatedDataEntry", listeners: "listeners", loadMask: "loadMask", loadMaskDefaults: "loadMaskDefaults", loadMaskError: "loadMaskError", localizable: "localizable", managedEventSizing: "managedEventSizing", maskDefaults: "maskDefaults", masked: "masked", maxDate: "maxDate", maxTimeAxisUnit: "maxTimeAxisUnit", minDate: "minDate", monitorResize: "monitorResize", owner: "owner", partner: "partner", plugins: "plugins", preserveFocusOnDatasetChange: "preserveFocusOnDatasetChange", preserveScrollOnDatasetChange: "preserveScrollOnDatasetChange", preventTooltipOnTouch: "preventTooltipOnTouch", relayStoreEvents: "relayStoreEvents", resizable: "resizable", resizeToFitIncludesHeader: "resizeToFitIncludesHeader", resourceTimeRangeRenderer: "resourceTimeRangeRenderer", responsiveLevels: "responsiveLevels", ripple: "ripple", rootElement: "rootElement", scaleColumn: "scaleColumn", scrollerClass: "scrollerClass", scrollManager: "scrollManager", series: "series", showBarTipWhenNavigatingTimeAxis: "showBarTipWhenNavigatingTimeAxis", showDirty: "showDirty", snapRelativeToEventStartDate: "snapRelativeToEventStartDate", stateful: "stateful", statefulEvents: "statefulEvents", stateId: "stateId", stateProvider: "stateProvider", stickyHeaders: "stickyHeaders", strips: "strips", subGridConfigs: "subGridConfigs", syncMask: "syncMask", tab: "tab", tabBarItems: "tabBarItems", tbar: "tbar", timeAxis: "timeAxis", type: "type", ui: "ui", visibleZoomFactor: "visibleZoomFactor", weekStartDay: "weekStartDay", weight: "weight", zoomKeepsOriginalTimespan: "zoomKeepsOriginalTimespan", zoomOnMouseWheel: "zoomOnMouseWheel", zoomOnTimeAxisDoubleClick: "zoomOnTimeAxisDoubleClick", alignSelf: "alignSelf", animateTreeNodeToggle: "animateTreeNodeToggle", appendTo: "appendTo", barMargin: "barMargin", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cellEllipsis: "cellEllipsis", cls: "cls", collapsed: "collapsed", column: "column", columnLines: "columnLines", columns: "columns", data: "data", dataset: "dataset", disabled: "disabled", displayDateFormat: "displayDateFormat", emptyText: "emptyText", enableEventAnimations: "enableEventAnimations", enableUndoRedoKeys: "enableUndoRedoKeys", endDate: "endDate", eventColor: "eventColor", eventStyle: "eventStyle", extraData: "extraData", fillTicks: "fillTicks", flex: "flex", forceFit: "forceFit", height: "height", hidden: "hidden", hideFooters: "hideFooters", hideHeaders: "hideHeaders", hideRowHover: "hideRowHover", histogramWidget: "histogramWidget", id: "id", infiniteScroll: "infiniteScroll", inputFieldAlign: "inputFieldAlign", insertBefore: "insertBefore", insertFirst: "insertFirst", keyMap: "keyMap", labelPosition: "labelPosition", longPressTime: "longPressTime", margin: "margin", maxHeight: "maxHeight", maxWidth: "maxWidth", maxZoomLevel: "maxZoomLevel", minHeight: "minHeight", minWidth: "minWidth", minZoomLevel: "minZoomLevel", preserveScroll: "preserveScroll", presets: "presets", readOnly: "readOnly", recurrenceConfirmationPopup: "recurrenceConfirmationPopup", rendition: "rendition", rowHeight: "rowHeight", rowLines: "rowLines", rtl: "rtl", scalePoints: "scalePoints", scrollable: "scrollable", selectionMode: "selectionMode", showBarTip: "showBarTip", snap: "snap", span: "span", startDate: "startDate", stateSettings: "stateSettings", store: "store", suppressFit: "suppressFit", tickSize: "tickSize", timeResolution: "timeResolution", timeZone: "timeZone", title: "title", tools: "tools", transition: "transition", transitionDuration: "transitionDuration", viewPreset: "viewPreset", visibleDate: "visibleDate", width: "width", workingTime: "workingTime", focusVisible: "focusVisible", hasChanges: "hasChanges", originalStore: "originalStore", parent: "parent", scrollLeft: "scrollLeft", scrollTop: "scrollTop", scrollX: "scrollX", selectedCell: "selectedCell", selectedCells: "selectedCells", selectedRecord: "selectedRecord", selectedRecords: "selectedRecords", selectedRows: "selectedRows", state: "state", tooltip: "tooltip", zoomLevel: "zoomLevel", aiFilterFeature: "aiFilterFeature", cellCopyPasteFeature: "cellCopyPasteFeature", cellEditFeature: "cellEditFeature", cellMenuFeature: "cellMenuFeature", cellTooltipFeature: "cellTooltipFeature", chartsFeature: "chartsFeature", columnAutoWidthFeature: "columnAutoWidthFeature", columnDragToolbarFeature: "columnDragToolbarFeature", columnLinesFeature: "columnLinesFeature", columnPickerFeature: "columnPickerFeature", columnRenameFeature: "columnRenameFeature", columnReorderFeature: "columnReorderFeature", columnResizeFeature: "columnResizeFeature", excelExporterFeature: "excelExporterFeature", fileDropFeature: "fileDropFeature", fillHandleFeature: "fillHandleFeature", filterFeature: "filterFeature", filterBarFeature: "filterBarFeature", groupFeature: "groupFeature", groupSummaryFeature: "groupSummaryFeature", headerMenuFeature: "headerMenuFeature", headerZoomFeature: "headerZoomFeature", lockRowsFeature: "lockRowsFeature", mergeCellsFeature: "mergeCellsFeature", nonWorkingTimeFeature: "nonWorkingTimeFeature", panFeature: "panFeature", pdfExportFeature: "pdfExportFeature", pinColumnsFeature: "pinColumnsFeature", printFeature: "printFeature", quickFindFeature: "quickFindFeature", regionResizeFeature: "regionResizeFeature", resourceMenuFeature: "resourceMenuFeature", resourceTimeRangesFeature: "resourceTimeRangesFeature", rowCopyPasteFeature: "rowCopyPasteFeature", rowEditFeature: "rowEditFeature", rowExpanderFeature: "rowExpanderFeature", rowReorderFeature: "rowReorderFeature", rowResizeFeature: "rowResizeFeature", scheduleTooltipFeature: "scheduleTooltipFeature", searchFeature: "searchFeature", sortFeature: "sortFeature", splitFeature: "splitFeature", stickyCellsFeature: "stickyCellsFeature", stripeFeature: "stripeFeature", summaryFeature: "summaryFeature", timeAxisHeaderMenuFeature: "timeAxisHeaderMenuFeature", timeRangesFeature: "timeRangesFeature", treeFeature: "treeFeature", treeGroupFeature: "treeGroupFeature" }, outputs: { onBeforeAssignmentDelete: "onBeforeAssignmentDelete", onBeforeCancelCellEdit: "onBeforeCancelCellEdit", onBeforeCancelRowEdit: "onBeforeCancelRowEdit", onBeforeCellEditStart: "onBeforeCellEditStart", onBeforeCellRangeDelete: "onBeforeCellRangeDelete", onBeforeCellRangeEdit: "onBeforeCellRangeEdit", onBeforeColumnDragStart: "onBeforeColumnDragStart", onBeforeColumnDropFinalize: "onBeforeColumnDropFinalize", onBeforeColumnResize: "onBeforeColumnResize", onBeforeCopy: "onBeforeCopy", onBeforeCSVExport: "onBeforeCSVExport", onBeforeDestroy: "onBeforeDestroy", onBeforeEventDelete: "onBeforeEventDelete", onBeforeExcelExport: "onBeforeExcelExport", onBeforeFillHandleDragStart: "onBeforeFillHandleDragStart", onBeforeFinishCellEdit: "onBeforeFinishCellEdit", onBeforeFinishRowEdit: "onBeforeFinishRowEdit", onBeforeHide: "onBeforeHide", onBeforeHistogramDataCacheSet: "onBeforeHistogramDataCacheSet", onBeforePan: "onBeforePan", onBeforePaste: "onBeforePaste", onBeforePdfExport: "onBeforePdfExport", onBeforePresetChange: "onBeforePresetChange", onBeforeRenderHistogramRow: "onBeforeRenderHistogramRow", onBeforeRenderRecordHistogram: "onBeforeRenderRecordHistogram", onBeforeRenderRow: "onBeforeRenderRow", onBeforeRenderRows: "onBeforeRenderRows", onBeforeRowCollapse: "onBeforeRowCollapse", onBeforeRowExpand: "onBeforeRowExpand", onBeforeSelectionChange: "onBeforeSelectionChange", onBeforeSetRecord: "onBeforeSetRecord", onBeforeShow: "onBeforeShow", onBeforeStartRowEdit: "onBeforeStartRowEdit", onBeforeStateApply: "onBeforeStateApply", onBeforeStateSave: "onBeforeStateSave", onBeforeToggleGroup: "onBeforeToggleGroup", onBeforeToggleNode: "onBeforeToggleNode", onCancelCellEdit: "onCancelCellEdit", onCatchAll: "onCatchAll", onCellClick: "onCellClick", onCellContextMenu: "onCellContextMenu", onCellDblClick: "onCellDblClick", onCellMenuBeforeShow: "onCellMenuBeforeShow", onCellMenuItem: "onCellMenuItem", onCellMenuShow: "onCellMenuShow", onCellMenuToggleItem: "onCellMenuToggleItem", onCellMouseEnter: "onCellMouseEnter", onCellMouseLeave: "onCellMouseLeave", onCellMouseOut: "onCellMouseOut", onCellMouseOver: "onCellMouseOver", onCollapse: "onCollapse", onCollapseNode: "onCollapseNode", onColumnDrag: "onColumnDrag", onColumnDragStart: "onColumnDragStart", onColumnDrop: "onColumnDrop", onColumnResize: "onColumnResize", onColumnResizeStart: "onColumnResizeStart", onContextMenuItem: "onContextMenuItem", onContextMenuToggleItem: "onContextMenuToggleItem", onCopy: "onCopy", onCurrentTimelineUpdate: "onCurrentTimelineUpdate", onDataChange: "onDataChange", onDateRangeChange: "onDateRangeChange", onDestroy: "onDestroy", onDirtyStateChange: "onDirtyStateChange", onDragSelecting: "onDragSelecting", onElementCreated: "onElementCreated", onExpand: "onExpand", onExpandNode: "onExpandNode", onFileDrop: "onFileDrop", onFillHandleBeforeDragFinalize: "onFillHandleBeforeDragFinalize", onFillHandleDrag: "onFillHandleDrag", onFillHandleDragAbort: "onFillHandleDragAbort", onFillHandleDragEnd: "onFillHandleDragEnd", onFillHandleDragStart: "onFillHandleDragStart", onFinishCellEdit: "onFinishCellEdit", onFinishRowEdit: "onFinishRowEdit", onFocusIn: "onFocusIn", onFocusOut: "onFocusOut", onGridRowBeforeDragStart: "onGridRowBeforeDragStart", onGridRowBeforeDropFinalize: "onGridRowBeforeDropFinalize", onGridRowDrag: "onGridRowDrag", onGridRowDragAbort: "onGridRowDragAbort", onGridRowDragStart: "onGridRowDragStart", onGridRowDrop: "onGridRowDrop", onHeaderClick: "onHeaderClick", onHeaderMenuBeforeShow: "onHeaderMenuBeforeShow", onHeaderMenuItem: "onHeaderMenuItem", onHeaderMenuShow: "onHeaderMenuShow", onHeaderMenuToggleItem: "onHeaderMenuToggleItem", onHide: "onHide", onHistogramDataCacheSet: "onHistogramDataCacheSet", onLockRows: "onLockRows", onMouseOut: "onMouseOut", onMouseOver: "onMouseOver", onNoZoomChange: "onNoZoomChange", onPaint: "onPaint", onPaste: "onPaste", onPdfExport: "onPdfExport", onPresetChange: "onPresetChange", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onRenderRow: "onRenderRow", onRenderRows: "onRenderRows", onResize: "onResize", onResourceMenuBeforeShow: "onResourceMenuBeforeShow", onResourceMenuItem: "onResourceMenuItem", onResourceMenuShow: "onResourceMenuShow", onResourceMenuToggleItem: "onResourceMenuToggleItem", onResourceTimeRangeClick: "onResourceTimeRangeClick", onResourceTimeRangeContextMenu: "onResourceTimeRangeContextMenu", onResourceTimeRangeDblClick: "onResourceTimeRangeDblClick", onResourceTimeRangeMouseDown: "onResourceTimeRangeMouseDown", onResourceTimeRangeMouseOut: "onResourceTimeRangeMouseOut", onResourceTimeRangeMouseOver: "onResourceTimeRangeMouseOver", onResourceTimeRangeMouseUp: "onResourceTimeRangeMouseUp", onResponsive: "onResponsive", onRowCollapse: "onRowCollapse", onRowExpand: "onRowExpand", onRowMouseEnter: "onRowMouseEnter", onRowMouseLeave: "onRowMouseLeave", onScroll: "onScroll", onSelectionChange: "onSelectionChange", onSelectionModeChange: "onSelectionModeChange", onShow: "onShow", onSplit: "onSplit", onSplitterCollapseClick: "onSplitterCollapseClick", onSplitterDragEnd: "onSplitterDragEnd", onSplitterDragStart: "onSplitterDragStart", onSplitterExpandClick: "onSplitterExpandClick", onStartCellEdit: "onStartCellEdit", onStartRowEdit: "onStartRowEdit", onSubGridCollapse: "onSubGridCollapse", onSubGridExpand: "onSubGridExpand", onTickSizeChange: "onTickSizeChange", onTimeAxisChange: "onTimeAxisChange", onTimeAxisHeaderClick: "onTimeAxisHeaderClick", onTimeAxisHeaderContextMenu: "onTimeAxisHeaderContextMenu", onTimeAxisHeaderDblClick: "onTimeAxisHeaderDblClick", onTimeAxisHeaderMenuBeforeShow: "onTimeAxisHeaderMenuBeforeShow", onTimeAxisHeaderMenuItem: "onTimeAxisHeaderMenuItem", onTimeAxisHeaderMenuShow: "onTimeAxisHeaderMenuShow", onTimelineContextChange: "onTimelineContextChange", onTimelineViewportResize: "onTimelineViewportResize", onTimeRangeHeaderClick: "onTimeRangeHeaderClick", onTimeRangeHeaderContextMenu: "onTimeRangeHeaderContextMenu", onTimeRangeHeaderDblClick: "onTimeRangeHeaderDblClick", onToggleGroup: "onToggleGroup", onToggleNode: "onToggleNode", onToolClick: "onToolClick", onUnlockRows: "onUnlockRows", onUnsplit: "onUnsplit", onVisibleDateRangeChange: "onVisibleDateRangeChange" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
|
|
2077
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumTimelineHistogramComponent, decorators: [{
|
|
2078
|
+
type: Component,
|
|
2079
|
+
args: [{
|
|
2080
|
+
selector: 'bryntum-timeline-histogram',
|
|
2081
|
+
template: ''
|
|
2082
|
+
}]
|
|
2083
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { adopt: [{
|
|
2084
|
+
type: Input
|
|
2085
|
+
}], aggregateDataEntry: [{
|
|
2086
|
+
type: Input
|
|
2087
|
+
}], aggregateHistogramDataForGroups: [{
|
|
2088
|
+
type: Input
|
|
2089
|
+
}], animateFilterRemovals: [{
|
|
2090
|
+
type: Input
|
|
2091
|
+
}], animateRemovingRows: [{
|
|
2092
|
+
type: Input
|
|
2093
|
+
}], ariaDescription: [{
|
|
2094
|
+
type: Input
|
|
2095
|
+
}], ariaLabel: [{
|
|
2096
|
+
type: Input
|
|
2097
|
+
}], autoAdjustTimeAxis: [{
|
|
2098
|
+
type: Input
|
|
2099
|
+
}], autoHeight: [{
|
|
2100
|
+
type: Input
|
|
2101
|
+
}], barTooltipTemplate: [{
|
|
2102
|
+
type: Input
|
|
2103
|
+
}], bbar: [{
|
|
2104
|
+
type: Input
|
|
2105
|
+
}], bodyCls: [{
|
|
2106
|
+
type: Input
|
|
2107
|
+
}], bubbleEvents: [{
|
|
2108
|
+
type: Input
|
|
2109
|
+
}], bufferCoef: [{
|
|
2110
|
+
type: Input
|
|
2111
|
+
}], bufferThreshold: [{
|
|
2112
|
+
type: Input
|
|
2113
|
+
}], collapsible: [{
|
|
2114
|
+
type: Input
|
|
2115
|
+
}], color: [{
|
|
2116
|
+
type: Input
|
|
2117
|
+
}], config: [{
|
|
2118
|
+
type: Input
|
|
2119
|
+
}], contentElementCls: [{
|
|
2120
|
+
type: Input
|
|
2121
|
+
}], contextMenuTriggerEvent: [{
|
|
2122
|
+
type: Input
|
|
2123
|
+
}], dataField: [{
|
|
2124
|
+
type: Input
|
|
2125
|
+
}], dataModelField: [{
|
|
2126
|
+
type: Input
|
|
2127
|
+
}], defaultRegion: [{
|
|
2128
|
+
type: Input
|
|
2129
|
+
}], destroyStore: [{
|
|
2130
|
+
type: Input
|
|
2131
|
+
}], detectCSSCompatibilityIssues: [{
|
|
2132
|
+
type: Input
|
|
2133
|
+
}], disableGridColumnIdWarning: [{
|
|
2134
|
+
type: Input
|
|
2135
|
+
}], disableGridRowModelWarning: [{
|
|
2136
|
+
type: Input
|
|
2137
|
+
}], dock: [{
|
|
2138
|
+
type: Input
|
|
2139
|
+
}], drawer: [{
|
|
2140
|
+
type: Input
|
|
2141
|
+
}], durationDisplayPrecision: [{
|
|
2142
|
+
type: Input
|
|
2143
|
+
}], elementAttributes: [{
|
|
2144
|
+
type: Input
|
|
2145
|
+
}], enableRecurringEvents: [{
|
|
2146
|
+
type: Input
|
|
2147
|
+
}], enableSticky: [{
|
|
2148
|
+
type: Input
|
|
2149
|
+
}], enableTextSelection: [{
|
|
2150
|
+
type: Input
|
|
2151
|
+
}], fillLastColumn: [{
|
|
2152
|
+
type: Input
|
|
2153
|
+
}], fixedRowHeight: [{
|
|
2154
|
+
type: Input
|
|
2155
|
+
}], footer: [{
|
|
2156
|
+
type: Input
|
|
2157
|
+
}], formulaProviders: [{
|
|
2158
|
+
type: Input
|
|
2159
|
+
}], fullRowRefresh: [{
|
|
2160
|
+
type: Input
|
|
2161
|
+
}], getBarClass: [{
|
|
2162
|
+
type: Input
|
|
2163
|
+
}], getBarDOMConfig: [{
|
|
2164
|
+
type: Input
|
|
2165
|
+
}], getBarText: [{
|
|
2166
|
+
type: Input
|
|
2167
|
+
}], getBarTextDOMConfig: [{
|
|
2168
|
+
type: Input
|
|
2169
|
+
}], getDataEntryForAggregating: [{
|
|
2170
|
+
type: Input
|
|
2171
|
+
}], getOutlineClass: [{
|
|
2172
|
+
type: Input
|
|
2173
|
+
}], getOutlineDOMConfig: [{
|
|
2174
|
+
type: Input
|
|
2175
|
+
}], getRecordData: [{
|
|
2176
|
+
type: Input
|
|
2177
|
+
}], getRowHeight: [{
|
|
2178
|
+
type: Input
|
|
2179
|
+
}], hardRefreshOnTimeAxisReconfigure: [{
|
|
2180
|
+
type: Input
|
|
2181
|
+
}], header: [{
|
|
2182
|
+
type: Input
|
|
2183
|
+
}], hideHorizontalScrollbar: [{
|
|
2184
|
+
type: Input
|
|
2185
|
+
}], histogramWidgetClass: [{
|
|
2186
|
+
type: Input
|
|
2187
|
+
}], hoverCls: [{
|
|
2188
|
+
type: Input
|
|
2189
|
+
}], icon: [{
|
|
2190
|
+
type: Input
|
|
2191
|
+
}], ignoreDomEventsWhileScrolling: [{
|
|
2192
|
+
type: Input
|
|
2193
|
+
}], ignoreParentReadOnly: [{
|
|
2194
|
+
type: Input
|
|
2195
|
+
}], initAggregatedDataEntry: [{
|
|
2196
|
+
type: Input
|
|
2197
|
+
}], listeners: [{
|
|
2198
|
+
type: Input
|
|
2199
|
+
}], loadMask: [{
|
|
2200
|
+
type: Input
|
|
2201
|
+
}], loadMaskDefaults: [{
|
|
2202
|
+
type: Input
|
|
2203
|
+
}], loadMaskError: [{
|
|
2204
|
+
type: Input
|
|
2205
|
+
}], localizable: [{
|
|
2206
|
+
type: Input
|
|
2207
|
+
}], managedEventSizing: [{
|
|
2208
|
+
type: Input
|
|
2209
|
+
}], maskDefaults: [{
|
|
2210
|
+
type: Input
|
|
2211
|
+
}], masked: [{
|
|
2212
|
+
type: Input
|
|
2213
|
+
}], maxDate: [{
|
|
2214
|
+
type: Input
|
|
2215
|
+
}], maxTimeAxisUnit: [{
|
|
2216
|
+
type: Input
|
|
2217
|
+
}], minDate: [{
|
|
2218
|
+
type: Input
|
|
2219
|
+
}], monitorResize: [{
|
|
2220
|
+
type: Input
|
|
2221
|
+
}], owner: [{
|
|
2222
|
+
type: Input
|
|
2223
|
+
}], partner: [{
|
|
2224
|
+
type: Input
|
|
2225
|
+
}], plugins: [{
|
|
2226
|
+
type: Input
|
|
2227
|
+
}], preserveFocusOnDatasetChange: [{
|
|
2228
|
+
type: Input
|
|
2229
|
+
}], preserveScrollOnDatasetChange: [{
|
|
2230
|
+
type: Input
|
|
2231
|
+
}], preventTooltipOnTouch: [{
|
|
2232
|
+
type: Input
|
|
2233
|
+
}], relayStoreEvents: [{
|
|
2234
|
+
type: Input
|
|
2235
|
+
}], resizable: [{
|
|
2236
|
+
type: Input
|
|
2237
|
+
}], resizeToFitIncludesHeader: [{
|
|
2238
|
+
type: Input
|
|
2239
|
+
}], resourceTimeRangeRenderer: [{
|
|
2240
|
+
type: Input
|
|
2241
|
+
}], responsiveLevels: [{
|
|
2242
|
+
type: Input
|
|
2243
|
+
}], ripple: [{
|
|
2244
|
+
type: Input
|
|
2245
|
+
}], rootElement: [{
|
|
2246
|
+
type: Input
|
|
2247
|
+
}], scaleColumn: [{
|
|
2248
|
+
type: Input
|
|
2249
|
+
}], scrollerClass: [{
|
|
2250
|
+
type: Input
|
|
2251
|
+
}], scrollManager: [{
|
|
2252
|
+
type: Input
|
|
2253
|
+
}], series: [{
|
|
2254
|
+
type: Input
|
|
2255
|
+
}], showBarTipWhenNavigatingTimeAxis: [{
|
|
2256
|
+
type: Input
|
|
2257
|
+
}], showDirty: [{
|
|
2258
|
+
type: Input
|
|
2259
|
+
}], snapRelativeToEventStartDate: [{
|
|
2260
|
+
type: Input
|
|
2261
|
+
}], stateful: [{
|
|
2262
|
+
type: Input
|
|
2263
|
+
}], statefulEvents: [{
|
|
2264
|
+
type: Input
|
|
2265
|
+
}], stateId: [{
|
|
2266
|
+
type: Input
|
|
2267
|
+
}], stateProvider: [{
|
|
2268
|
+
type: Input
|
|
2269
|
+
}], stickyHeaders: [{
|
|
2270
|
+
type: Input
|
|
2271
|
+
}], strips: [{
|
|
2272
|
+
type: Input
|
|
2273
|
+
}], subGridConfigs: [{
|
|
2274
|
+
type: Input
|
|
2275
|
+
}], syncMask: [{
|
|
2276
|
+
type: Input
|
|
2277
|
+
}], tab: [{
|
|
2278
|
+
type: Input
|
|
2279
|
+
}], tabBarItems: [{
|
|
2280
|
+
type: Input
|
|
2281
|
+
}], tbar: [{
|
|
2282
|
+
type: Input
|
|
2283
|
+
}], timeAxis: [{
|
|
2284
|
+
type: Input
|
|
2285
|
+
}], type: [{
|
|
2286
|
+
type: Input
|
|
2287
|
+
}], ui: [{
|
|
2288
|
+
type: Input
|
|
2289
|
+
}], visibleZoomFactor: [{
|
|
2290
|
+
type: Input
|
|
2291
|
+
}], weekStartDay: [{
|
|
2292
|
+
type: Input
|
|
2293
|
+
}], weight: [{
|
|
2294
|
+
type: Input
|
|
2295
|
+
}], zoomKeepsOriginalTimespan: [{
|
|
2296
|
+
type: Input
|
|
2297
|
+
}], zoomOnMouseWheel: [{
|
|
2298
|
+
type: Input
|
|
2299
|
+
}], zoomOnTimeAxisDoubleClick: [{
|
|
2300
|
+
type: Input
|
|
2301
|
+
}], alignSelf: [{
|
|
2302
|
+
type: Input
|
|
2303
|
+
}], animateTreeNodeToggle: [{
|
|
2304
|
+
type: Input
|
|
2305
|
+
}], appendTo: [{
|
|
2306
|
+
type: Input
|
|
2307
|
+
}], barMargin: [{
|
|
2308
|
+
type: Input
|
|
2309
|
+
}], callOnFunctions: [{
|
|
2310
|
+
type: Input
|
|
2311
|
+
}], catchEventHandlerExceptions: [{
|
|
2312
|
+
type: Input
|
|
2313
|
+
}], cellEllipsis: [{
|
|
2314
|
+
type: Input
|
|
2315
|
+
}], cls: [{
|
|
2316
|
+
type: Input
|
|
2317
|
+
}], collapsed: [{
|
|
2318
|
+
type: Input
|
|
2319
|
+
}], column: [{
|
|
2320
|
+
type: Input
|
|
2321
|
+
}], columnLines: [{
|
|
2322
|
+
type: Input
|
|
2323
|
+
}], columns: [{
|
|
2324
|
+
type: Input
|
|
2325
|
+
}], data: [{
|
|
2326
|
+
type: Input
|
|
2327
|
+
}], dataset: [{
|
|
2328
|
+
type: Input
|
|
2329
|
+
}], disabled: [{
|
|
2330
|
+
type: Input
|
|
2331
|
+
}], displayDateFormat: [{
|
|
2332
|
+
type: Input
|
|
2333
|
+
}], emptyText: [{
|
|
2334
|
+
type: Input
|
|
2335
|
+
}], enableEventAnimations: [{
|
|
2336
|
+
type: Input
|
|
2337
|
+
}], enableUndoRedoKeys: [{
|
|
2338
|
+
type: Input
|
|
2339
|
+
}], endDate: [{
|
|
2340
|
+
type: Input
|
|
2341
|
+
}], eventColor: [{
|
|
2342
|
+
type: Input
|
|
2343
|
+
}], eventStyle: [{
|
|
2344
|
+
type: Input
|
|
2345
|
+
}], extraData: [{
|
|
2346
|
+
type: Input
|
|
2347
|
+
}], fillTicks: [{
|
|
2348
|
+
type: Input
|
|
2349
|
+
}], flex: [{
|
|
2350
|
+
type: Input
|
|
2351
|
+
}], forceFit: [{
|
|
2352
|
+
type: Input
|
|
2353
|
+
}], height: [{
|
|
2354
|
+
type: Input
|
|
2355
|
+
}], hidden: [{
|
|
2356
|
+
type: Input
|
|
2357
|
+
}], hideFooters: [{
|
|
2358
|
+
type: Input
|
|
2359
|
+
}], hideHeaders: [{
|
|
2360
|
+
type: Input
|
|
2361
|
+
}], hideRowHover: [{
|
|
2362
|
+
type: Input
|
|
2363
|
+
}], histogramWidget: [{
|
|
2364
|
+
type: Input
|
|
2365
|
+
}], id: [{
|
|
2366
|
+
type: Input
|
|
2367
|
+
}], infiniteScroll: [{
|
|
2368
|
+
type: Input
|
|
2369
|
+
}], inputFieldAlign: [{
|
|
2370
|
+
type: Input
|
|
2371
|
+
}], insertBefore: [{
|
|
2372
|
+
type: Input
|
|
2373
|
+
}], insertFirst: [{
|
|
2374
|
+
type: Input
|
|
2375
|
+
}], keyMap: [{
|
|
2376
|
+
type: Input
|
|
2377
|
+
}], labelPosition: [{
|
|
2378
|
+
type: Input
|
|
2379
|
+
}], longPressTime: [{
|
|
2380
|
+
type: Input
|
|
2381
|
+
}], margin: [{
|
|
2382
|
+
type: Input
|
|
2383
|
+
}], maxHeight: [{
|
|
2384
|
+
type: Input
|
|
2385
|
+
}], maxWidth: [{
|
|
2386
|
+
type: Input
|
|
2387
|
+
}], maxZoomLevel: [{
|
|
2388
|
+
type: Input
|
|
2389
|
+
}], minHeight: [{
|
|
2390
|
+
type: Input
|
|
2391
|
+
}], minWidth: [{
|
|
2392
|
+
type: Input
|
|
2393
|
+
}], minZoomLevel: [{
|
|
2394
|
+
type: Input
|
|
2395
|
+
}], preserveScroll: [{
|
|
2396
|
+
type: Input
|
|
2397
|
+
}], presets: [{
|
|
2398
|
+
type: Input
|
|
2399
|
+
}], readOnly: [{
|
|
2400
|
+
type: Input
|
|
2401
|
+
}], recurrenceConfirmationPopup: [{
|
|
2402
|
+
type: Input
|
|
2403
|
+
}], rendition: [{
|
|
2404
|
+
type: Input
|
|
2405
|
+
}], rowHeight: [{
|
|
2406
|
+
type: Input
|
|
2407
|
+
}], rowLines: [{
|
|
2408
|
+
type: Input
|
|
2409
|
+
}], rtl: [{
|
|
2410
|
+
type: Input
|
|
2411
|
+
}], scalePoints: [{
|
|
2412
|
+
type: Input
|
|
2413
|
+
}], scrollable: [{
|
|
2414
|
+
type: Input
|
|
2415
|
+
}], selectionMode: [{
|
|
2416
|
+
type: Input
|
|
2417
|
+
}], showBarTip: [{
|
|
2418
|
+
type: Input
|
|
2419
|
+
}], snap: [{
|
|
2420
|
+
type: Input
|
|
2421
|
+
}], span: [{
|
|
2422
|
+
type: Input
|
|
2423
|
+
}], startDate: [{
|
|
2424
|
+
type: Input
|
|
2425
|
+
}], stateSettings: [{
|
|
2426
|
+
type: Input
|
|
2427
|
+
}], store: [{
|
|
2428
|
+
type: Input
|
|
2429
|
+
}], suppressFit: [{
|
|
2430
|
+
type: Input
|
|
2431
|
+
}], tickSize: [{
|
|
2432
|
+
type: Input
|
|
2433
|
+
}], timeResolution: [{
|
|
2434
|
+
type: Input
|
|
2435
|
+
}], timeZone: [{
|
|
2436
|
+
type: Input
|
|
2437
|
+
}], title: [{
|
|
2438
|
+
type: Input
|
|
2439
|
+
}], tools: [{
|
|
2440
|
+
type: Input
|
|
2441
|
+
}], transition: [{
|
|
2442
|
+
type: Input
|
|
2443
|
+
}], transitionDuration: [{
|
|
2444
|
+
type: Input
|
|
2445
|
+
}], viewPreset: [{
|
|
2446
|
+
type: Input
|
|
2447
|
+
}], visibleDate: [{
|
|
2448
|
+
type: Input
|
|
2449
|
+
}], width: [{
|
|
2450
|
+
type: Input
|
|
2451
|
+
}], workingTime: [{
|
|
2452
|
+
type: Input
|
|
2453
|
+
}], focusVisible: [{
|
|
2454
|
+
type: Input
|
|
2455
|
+
}], hasChanges: [{
|
|
2456
|
+
type: Input
|
|
2457
|
+
}], originalStore: [{
|
|
2458
|
+
type: Input
|
|
2459
|
+
}], parent: [{
|
|
2460
|
+
type: Input
|
|
2461
|
+
}], scrollLeft: [{
|
|
2462
|
+
type: Input
|
|
2463
|
+
}], scrollTop: [{
|
|
2464
|
+
type: Input
|
|
2465
|
+
}], scrollX: [{
|
|
2466
|
+
type: Input
|
|
2467
|
+
}], selectedCell: [{
|
|
2468
|
+
type: Input
|
|
2469
|
+
}], selectedCells: [{
|
|
2470
|
+
type: Input
|
|
2471
|
+
}], selectedRecord: [{
|
|
2472
|
+
type: Input
|
|
2473
|
+
}], selectedRecords: [{
|
|
2474
|
+
type: Input
|
|
2475
|
+
}], selectedRows: [{
|
|
2476
|
+
type: Input
|
|
2477
|
+
}], state: [{
|
|
2478
|
+
type: Input
|
|
2479
|
+
}], tooltip: [{
|
|
2480
|
+
type: Input
|
|
2481
|
+
}], zoomLevel: [{
|
|
2482
|
+
type: Input
|
|
2483
|
+
}], aiFilterFeature: [{
|
|
2484
|
+
type: Input
|
|
2485
|
+
}], cellCopyPasteFeature: [{
|
|
2486
|
+
type: Input
|
|
2487
|
+
}], cellEditFeature: [{
|
|
2488
|
+
type: Input
|
|
2489
|
+
}], cellMenuFeature: [{
|
|
2490
|
+
type: Input
|
|
2491
|
+
}], cellTooltipFeature: [{
|
|
2492
|
+
type: Input
|
|
2493
|
+
}], chartsFeature: [{
|
|
2494
|
+
type: Input
|
|
2495
|
+
}], columnAutoWidthFeature: [{
|
|
2496
|
+
type: Input
|
|
2497
|
+
}], columnDragToolbarFeature: [{
|
|
2498
|
+
type: Input
|
|
2499
|
+
}], columnLinesFeature: [{
|
|
2500
|
+
type: Input
|
|
2501
|
+
}], columnPickerFeature: [{
|
|
2502
|
+
type: Input
|
|
2503
|
+
}], columnRenameFeature: [{
|
|
2504
|
+
type: Input
|
|
2505
|
+
}], columnReorderFeature: [{
|
|
2506
|
+
type: Input
|
|
2507
|
+
}], columnResizeFeature: [{
|
|
2508
|
+
type: Input
|
|
2509
|
+
}], excelExporterFeature: [{
|
|
2510
|
+
type: Input
|
|
2511
|
+
}], fileDropFeature: [{
|
|
2512
|
+
type: Input
|
|
2513
|
+
}], fillHandleFeature: [{
|
|
2514
|
+
type: Input
|
|
2515
|
+
}], filterFeature: [{
|
|
2516
|
+
type: Input
|
|
2517
|
+
}], filterBarFeature: [{
|
|
2518
|
+
type: Input
|
|
2519
|
+
}], groupFeature: [{
|
|
2520
|
+
type: Input
|
|
2521
|
+
}], groupSummaryFeature: [{
|
|
2522
|
+
type: Input
|
|
2523
|
+
}], headerMenuFeature: [{
|
|
2524
|
+
type: Input
|
|
2525
|
+
}], headerZoomFeature: [{
|
|
2526
|
+
type: Input
|
|
2527
|
+
}], lockRowsFeature: [{
|
|
2528
|
+
type: Input
|
|
2529
|
+
}], mergeCellsFeature: [{
|
|
2530
|
+
type: Input
|
|
2531
|
+
}], nonWorkingTimeFeature: [{
|
|
2532
|
+
type: Input
|
|
2533
|
+
}], panFeature: [{
|
|
2534
|
+
type: Input
|
|
2535
|
+
}], pdfExportFeature: [{
|
|
2536
|
+
type: Input
|
|
2537
|
+
}], pinColumnsFeature: [{
|
|
2538
|
+
type: Input
|
|
2539
|
+
}], printFeature: [{
|
|
2540
|
+
type: Input
|
|
2541
|
+
}], quickFindFeature: [{
|
|
2542
|
+
type: Input
|
|
2543
|
+
}], regionResizeFeature: [{
|
|
2544
|
+
type: Input
|
|
2545
|
+
}], resourceMenuFeature: [{
|
|
2546
|
+
type: Input
|
|
2547
|
+
}], resourceTimeRangesFeature: [{
|
|
2548
|
+
type: Input
|
|
2549
|
+
}], rowCopyPasteFeature: [{
|
|
2550
|
+
type: Input
|
|
2551
|
+
}], rowEditFeature: [{
|
|
2552
|
+
type: Input
|
|
2553
|
+
}], rowExpanderFeature: [{
|
|
2554
|
+
type: Input
|
|
2555
|
+
}], rowReorderFeature: [{
|
|
2556
|
+
type: Input
|
|
2557
|
+
}], rowResizeFeature: [{
|
|
2558
|
+
type: Input
|
|
2559
|
+
}], scheduleTooltipFeature: [{
|
|
2560
|
+
type: Input
|
|
2561
|
+
}], searchFeature: [{
|
|
2562
|
+
type: Input
|
|
2563
|
+
}], sortFeature: [{
|
|
2564
|
+
type: Input
|
|
2565
|
+
}], splitFeature: [{
|
|
2566
|
+
type: Input
|
|
2567
|
+
}], stickyCellsFeature: [{
|
|
2568
|
+
type: Input
|
|
2569
|
+
}], stripeFeature: [{
|
|
2570
|
+
type: Input
|
|
2571
|
+
}], summaryFeature: [{
|
|
2572
|
+
type: Input
|
|
2573
|
+
}], timeAxisHeaderMenuFeature: [{
|
|
2574
|
+
type: Input
|
|
2575
|
+
}], timeRangesFeature: [{
|
|
2576
|
+
type: Input
|
|
2577
|
+
}], treeFeature: [{
|
|
2578
|
+
type: Input
|
|
2579
|
+
}], treeGroupFeature: [{
|
|
2580
|
+
type: Input
|
|
2581
|
+
}], onBeforeAssignmentDelete: [{
|
|
2582
|
+
type: Output
|
|
2583
|
+
}], onBeforeCancelCellEdit: [{
|
|
2584
|
+
type: Output
|
|
2585
|
+
}], onBeforeCancelRowEdit: [{
|
|
2586
|
+
type: Output
|
|
2587
|
+
}], onBeforeCellEditStart: [{
|
|
2588
|
+
type: Output
|
|
2589
|
+
}], onBeforeCellRangeDelete: [{
|
|
2590
|
+
type: Output
|
|
2591
|
+
}], onBeforeCellRangeEdit: [{
|
|
2592
|
+
type: Output
|
|
2593
|
+
}], onBeforeColumnDragStart: [{
|
|
2594
|
+
type: Output
|
|
2595
|
+
}], onBeforeColumnDropFinalize: [{
|
|
2596
|
+
type: Output
|
|
2597
|
+
}], onBeforeColumnResize: [{
|
|
2598
|
+
type: Output
|
|
2599
|
+
}], onBeforeCopy: [{
|
|
2600
|
+
type: Output
|
|
2601
|
+
}], onBeforeCSVExport: [{
|
|
2602
|
+
type: Output
|
|
2603
|
+
}], onBeforeDestroy: [{
|
|
2604
|
+
type: Output
|
|
2605
|
+
}], onBeforeEventDelete: [{
|
|
2606
|
+
type: Output
|
|
2607
|
+
}], onBeforeExcelExport: [{
|
|
2608
|
+
type: Output
|
|
2609
|
+
}], onBeforeFillHandleDragStart: [{
|
|
2610
|
+
type: Output
|
|
2611
|
+
}], onBeforeFinishCellEdit: [{
|
|
2612
|
+
type: Output
|
|
2613
|
+
}], onBeforeFinishRowEdit: [{
|
|
2614
|
+
type: Output
|
|
2615
|
+
}], onBeforeHide: [{
|
|
2616
|
+
type: Output
|
|
2617
|
+
}], onBeforeHistogramDataCacheSet: [{
|
|
2618
|
+
type: Output
|
|
2619
|
+
}], onBeforePan: [{
|
|
2620
|
+
type: Output
|
|
2621
|
+
}], onBeforePaste: [{
|
|
2622
|
+
type: Output
|
|
2623
|
+
}], onBeforePdfExport: [{
|
|
2624
|
+
type: Output
|
|
2625
|
+
}], onBeforePresetChange: [{
|
|
2626
|
+
type: Output
|
|
2627
|
+
}], onBeforeRenderHistogramRow: [{
|
|
2628
|
+
type: Output
|
|
2629
|
+
}], onBeforeRenderRecordHistogram: [{
|
|
2630
|
+
type: Output
|
|
2631
|
+
}], onBeforeRenderRow: [{
|
|
2632
|
+
type: Output
|
|
2633
|
+
}], onBeforeRenderRows: [{
|
|
2634
|
+
type: Output
|
|
2635
|
+
}], onBeforeRowCollapse: [{
|
|
2636
|
+
type: Output
|
|
2637
|
+
}], onBeforeRowExpand: [{
|
|
2638
|
+
type: Output
|
|
2639
|
+
}], onBeforeSelectionChange: [{
|
|
2640
|
+
type: Output
|
|
2641
|
+
}], onBeforeSetRecord: [{
|
|
2642
|
+
type: Output
|
|
2643
|
+
}], onBeforeShow: [{
|
|
2644
|
+
type: Output
|
|
2645
|
+
}], onBeforeStartRowEdit: [{
|
|
2646
|
+
type: Output
|
|
2647
|
+
}], onBeforeStateApply: [{
|
|
2648
|
+
type: Output
|
|
2649
|
+
}], onBeforeStateSave: [{
|
|
2650
|
+
type: Output
|
|
2651
|
+
}], onBeforeToggleGroup: [{
|
|
2652
|
+
type: Output
|
|
2653
|
+
}], onBeforeToggleNode: [{
|
|
2654
|
+
type: Output
|
|
2655
|
+
}], onCancelCellEdit: [{
|
|
2656
|
+
type: Output
|
|
2657
|
+
}], onCatchAll: [{
|
|
2658
|
+
type: Output
|
|
2659
|
+
}], onCellClick: [{
|
|
2660
|
+
type: Output
|
|
2661
|
+
}], onCellContextMenu: [{
|
|
2662
|
+
type: Output
|
|
2663
|
+
}], onCellDblClick: [{
|
|
2664
|
+
type: Output
|
|
2665
|
+
}], onCellMenuBeforeShow: [{
|
|
2666
|
+
type: Output
|
|
2667
|
+
}], onCellMenuItem: [{
|
|
2668
|
+
type: Output
|
|
2669
|
+
}], onCellMenuShow: [{
|
|
2670
|
+
type: Output
|
|
2671
|
+
}], onCellMenuToggleItem: [{
|
|
2672
|
+
type: Output
|
|
2673
|
+
}], onCellMouseEnter: [{
|
|
2674
|
+
type: Output
|
|
2675
|
+
}], onCellMouseLeave: [{
|
|
2676
|
+
type: Output
|
|
2677
|
+
}], onCellMouseOut: [{
|
|
2678
|
+
type: Output
|
|
2679
|
+
}], onCellMouseOver: [{
|
|
2680
|
+
type: Output
|
|
2681
|
+
}], onCollapse: [{
|
|
2682
|
+
type: Output
|
|
2683
|
+
}], onCollapseNode: [{
|
|
2684
|
+
type: Output
|
|
2685
|
+
}], onColumnDrag: [{
|
|
2686
|
+
type: Output
|
|
2687
|
+
}], onColumnDragStart: [{
|
|
2688
|
+
type: Output
|
|
2689
|
+
}], onColumnDrop: [{
|
|
2690
|
+
type: Output
|
|
2691
|
+
}], onColumnResize: [{
|
|
2692
|
+
type: Output
|
|
2693
|
+
}], onColumnResizeStart: [{
|
|
2694
|
+
type: Output
|
|
2695
|
+
}], onContextMenuItem: [{
|
|
2696
|
+
type: Output
|
|
2697
|
+
}], onContextMenuToggleItem: [{
|
|
2698
|
+
type: Output
|
|
2699
|
+
}], onCopy: [{
|
|
2700
|
+
type: Output
|
|
2701
|
+
}], onCurrentTimelineUpdate: [{
|
|
2702
|
+
type: Output
|
|
2703
|
+
}], onDataChange: [{
|
|
2704
|
+
type: Output
|
|
2705
|
+
}], onDateRangeChange: [{
|
|
2706
|
+
type: Output
|
|
2707
|
+
}], onDestroy: [{
|
|
2708
|
+
type: Output
|
|
2709
|
+
}], onDirtyStateChange: [{
|
|
2710
|
+
type: Output
|
|
2711
|
+
}], onDragSelecting: [{
|
|
2712
|
+
type: Output
|
|
2713
|
+
}], onElementCreated: [{
|
|
2714
|
+
type: Output
|
|
2715
|
+
}], onExpand: [{
|
|
2716
|
+
type: Output
|
|
2717
|
+
}], onExpandNode: [{
|
|
2718
|
+
type: Output
|
|
2719
|
+
}], onFileDrop: [{
|
|
2720
|
+
type: Output
|
|
2721
|
+
}], onFillHandleBeforeDragFinalize: [{
|
|
2722
|
+
type: Output
|
|
2723
|
+
}], onFillHandleDrag: [{
|
|
2724
|
+
type: Output
|
|
2725
|
+
}], onFillHandleDragAbort: [{
|
|
2726
|
+
type: Output
|
|
2727
|
+
}], onFillHandleDragEnd: [{
|
|
2728
|
+
type: Output
|
|
2729
|
+
}], onFillHandleDragStart: [{
|
|
2730
|
+
type: Output
|
|
2731
|
+
}], onFinishCellEdit: [{
|
|
2732
|
+
type: Output
|
|
2733
|
+
}], onFinishRowEdit: [{
|
|
2734
|
+
type: Output
|
|
2735
|
+
}], onFocusIn: [{
|
|
2736
|
+
type: Output
|
|
2737
|
+
}], onFocusOut: [{
|
|
2738
|
+
type: Output
|
|
2739
|
+
}], onGridRowBeforeDragStart: [{
|
|
2740
|
+
type: Output
|
|
2741
|
+
}], onGridRowBeforeDropFinalize: [{
|
|
2742
|
+
type: Output
|
|
2743
|
+
}], onGridRowDrag: [{
|
|
2744
|
+
type: Output
|
|
2745
|
+
}], onGridRowDragAbort: [{
|
|
2746
|
+
type: Output
|
|
2747
|
+
}], onGridRowDragStart: [{
|
|
2748
|
+
type: Output
|
|
2749
|
+
}], onGridRowDrop: [{
|
|
2750
|
+
type: Output
|
|
2751
|
+
}], onHeaderClick: [{
|
|
2752
|
+
type: Output
|
|
2753
|
+
}], onHeaderMenuBeforeShow: [{
|
|
2754
|
+
type: Output
|
|
2755
|
+
}], onHeaderMenuItem: [{
|
|
2756
|
+
type: Output
|
|
2757
|
+
}], onHeaderMenuShow: [{
|
|
2758
|
+
type: Output
|
|
2759
|
+
}], onHeaderMenuToggleItem: [{
|
|
2760
|
+
type: Output
|
|
2761
|
+
}], onHide: [{
|
|
2762
|
+
type: Output
|
|
2763
|
+
}], onHistogramDataCacheSet: [{
|
|
2764
|
+
type: Output
|
|
2765
|
+
}], onLockRows: [{
|
|
2766
|
+
type: Output
|
|
2767
|
+
}], onMouseOut: [{
|
|
2768
|
+
type: Output
|
|
2769
|
+
}], onMouseOver: [{
|
|
2770
|
+
type: Output
|
|
2771
|
+
}], onNoZoomChange: [{
|
|
2772
|
+
type: Output
|
|
2773
|
+
}], onPaint: [{
|
|
2774
|
+
type: Output
|
|
2775
|
+
}], onPaste: [{
|
|
2776
|
+
type: Output
|
|
2777
|
+
}], onPdfExport: [{
|
|
2778
|
+
type: Output
|
|
2779
|
+
}], onPresetChange: [{
|
|
2780
|
+
type: Output
|
|
2781
|
+
}], onReadOnly: [{
|
|
2782
|
+
type: Output
|
|
2783
|
+
}], onRecompose: [{
|
|
2784
|
+
type: Output
|
|
2785
|
+
}], onRenderRow: [{
|
|
2786
|
+
type: Output
|
|
2787
|
+
}], onRenderRows: [{
|
|
2788
|
+
type: Output
|
|
2789
|
+
}], onResize: [{
|
|
2790
|
+
type: Output
|
|
2791
|
+
}], onResourceMenuBeforeShow: [{
|
|
2792
|
+
type: Output
|
|
2793
|
+
}], onResourceMenuItem: [{
|
|
2794
|
+
type: Output
|
|
2795
|
+
}], onResourceMenuShow: [{
|
|
2796
|
+
type: Output
|
|
2797
|
+
}], onResourceMenuToggleItem: [{
|
|
2798
|
+
type: Output
|
|
2799
|
+
}], onResourceTimeRangeClick: [{
|
|
2800
|
+
type: Output
|
|
2801
|
+
}], onResourceTimeRangeContextMenu: [{
|
|
2802
|
+
type: Output
|
|
2803
|
+
}], onResourceTimeRangeDblClick: [{
|
|
2804
|
+
type: Output
|
|
2805
|
+
}], onResourceTimeRangeMouseDown: [{
|
|
2806
|
+
type: Output
|
|
2807
|
+
}], onResourceTimeRangeMouseOut: [{
|
|
2808
|
+
type: Output
|
|
2809
|
+
}], onResourceTimeRangeMouseOver: [{
|
|
2810
|
+
type: Output
|
|
2811
|
+
}], onResourceTimeRangeMouseUp: [{
|
|
2812
|
+
type: Output
|
|
2813
|
+
}], onResponsive: [{
|
|
2814
|
+
type: Output
|
|
2815
|
+
}], onRowCollapse: [{
|
|
2816
|
+
type: Output
|
|
2817
|
+
}], onRowExpand: [{
|
|
2818
|
+
type: Output
|
|
2819
|
+
}], onRowMouseEnter: [{
|
|
2820
|
+
type: Output
|
|
2821
|
+
}], onRowMouseLeave: [{
|
|
2822
|
+
type: Output
|
|
2823
|
+
}], onScroll: [{
|
|
2824
|
+
type: Output
|
|
2825
|
+
}], onSelectionChange: [{
|
|
2826
|
+
type: Output
|
|
2827
|
+
}], onSelectionModeChange: [{
|
|
2828
|
+
type: Output
|
|
2829
|
+
}], onShow: [{
|
|
2830
|
+
type: Output
|
|
2831
|
+
}], onSplit: [{
|
|
2832
|
+
type: Output
|
|
2833
|
+
}], onSplitterCollapseClick: [{
|
|
2834
|
+
type: Output
|
|
2835
|
+
}], onSplitterDragEnd: [{
|
|
2836
|
+
type: Output
|
|
2837
|
+
}], onSplitterDragStart: [{
|
|
2838
|
+
type: Output
|
|
2839
|
+
}], onSplitterExpandClick: [{
|
|
2840
|
+
type: Output
|
|
2841
|
+
}], onStartCellEdit: [{
|
|
2842
|
+
type: Output
|
|
2843
|
+
}], onStartRowEdit: [{
|
|
2844
|
+
type: Output
|
|
2845
|
+
}], onSubGridCollapse: [{
|
|
2846
|
+
type: Output
|
|
2847
|
+
}], onSubGridExpand: [{
|
|
2848
|
+
type: Output
|
|
2849
|
+
}], onTickSizeChange: [{
|
|
2850
|
+
type: Output
|
|
2851
|
+
}], onTimeAxisChange: [{
|
|
2852
|
+
type: Output
|
|
2853
|
+
}], onTimeAxisHeaderClick: [{
|
|
2854
|
+
type: Output
|
|
2855
|
+
}], onTimeAxisHeaderContextMenu: [{
|
|
2856
|
+
type: Output
|
|
2857
|
+
}], onTimeAxisHeaderDblClick: [{
|
|
2858
|
+
type: Output
|
|
2859
|
+
}], onTimeAxisHeaderMenuBeforeShow: [{
|
|
2860
|
+
type: Output
|
|
2861
|
+
}], onTimeAxisHeaderMenuItem: [{
|
|
2862
|
+
type: Output
|
|
2863
|
+
}], onTimeAxisHeaderMenuShow: [{
|
|
2864
|
+
type: Output
|
|
2865
|
+
}], onTimelineContextChange: [{
|
|
2866
|
+
type: Output
|
|
2867
|
+
}], onTimelineViewportResize: [{
|
|
2868
|
+
type: Output
|
|
2869
|
+
}], onTimeRangeHeaderClick: [{
|
|
2870
|
+
type: Output
|
|
2871
|
+
}], onTimeRangeHeaderContextMenu: [{
|
|
2872
|
+
type: Output
|
|
2873
|
+
}], onTimeRangeHeaderDblClick: [{
|
|
2874
|
+
type: Output
|
|
2875
|
+
}], onToggleGroup: [{
|
|
2876
|
+
type: Output
|
|
2877
|
+
}], onToggleNode: [{
|
|
2878
|
+
type: Output
|
|
2879
|
+
}], onToolClick: [{
|
|
2880
|
+
type: Output
|
|
2881
|
+
}], onUnlockRows: [{
|
|
2882
|
+
type: Output
|
|
2883
|
+
}], onUnsplit: [{
|
|
2884
|
+
type: Output
|
|
2885
|
+
}], onVisibleDateRangeChange: [{
|
|
2886
|
+
type: Output
|
|
2887
|
+
}] } });
|
|
2888
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS10aW1lbGluZS1oaXN0b2dyYW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50L3NyYy9saWIvYnJ5bnR1bS10aW1lbGluZS1oaXN0b2dyYW0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRDtBQUN0RDs7R0FFRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWtELE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sYUFBYSxNQUFNLGtCQUFrQixDQUFDO0FBRTdDLE9BQU8sRUFBOGUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFeGhCLE9BQU8sRUFBMHdCLGlCQUFpQixFQUFvSCxNQUFNLHlCQUF5QixDQUFDO0FBRXQ3QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBNGhEbEQsTUFBTSxPQUFPLGlDQUFpQztJQTRtQjFDLFlBQVksT0FBbUI7UUFUdkIsa0JBQWEsR0FBRztZQUNwQixLQUFLLEVBQWMsU0FBUztZQUM1QixRQUFRLEVBQVcsU0FBUztZQUM1QixJQUFJLEVBQWUsU0FBUztZQUM1QixnQkFBZ0IsRUFBRyxJQUFJO1lBQ3ZCLFFBQVEsRUFBVyxFQUFFO1lBQ3JCLFNBQVMsRUFBVSxFQUFFO1NBQ3hCLENBQUM7UUE4U0Ysa0JBQWtCO1FBQ2xCOzs7Ozs7Ozs7Ozs7V0FZRztRQUNPLDZCQUF3QixHQUFRLElBQUksWUFBWSxFQUFzSyxDQUFDO1FBQ2pPOzs7OztXQUtHO1FBQ08sMkJBQXNCLEdBQVEsSUFBSSxZQUFZLEVBQW9HLENBQUM7UUFDN0o7Ozs7Ozs7V0FPRztRQUNPLDBCQUFxQixHQUFRLElBQUksWUFBWSxFQUFzRyxDQUFDO1FBQzlKOzs7OztXQUtHO1FBQ08sMEJBQXFCLEdBQVEsSUFBSSxZQUFZLEVBQXlHLENBQUM7UUFDaks7Ozs7OztXQU1HO1FB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TUFBTTtnQkFTRywyQkFBMkI7c0JBQXBDLE1BQU07Z0JBU0csd0JBQXdCO3NCQUFqQyxNQUFNO2dCQVlHLDhCQUE4QjtzQkFBdkMsTUFBTTtnQkFTRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBU0csd0JBQXdCO3NCQUFqQyxNQUFNO2dCQU9HLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFZRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBUUcsc0JBQXNCO3NCQUEvQixNQUFNO2dCQVFHLDRCQUE0QjtzQkFBckMsTUFBTTtnQkFRRyx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBU0csYUFBYTtzQkFBdEIsTUFBTTtnQkFPRyxZQUFZO3NCQUFyQixNQUFNO2dCQU9HLFdBQVc7c0JBQXBCLE1BQU07Z0JBTUcsWUFBWTtzQkFBckIsTUFBTTtnQkFJRyxTQUFTO3NCQUFsQixNQUFNO2dCQWVHLHdCQUF3QjtzQkFBakMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyoqXG4gKiBBbmd1bGFyIHdyYXBwZXIgZm9yIEJyeW50dW0gVGltZWxpbmVIaXN0b2dyYW1cbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgU2ltcGxlQ2hhbmdlLCBTaW1wbGVDaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgV3JhcHBlckhlbHBlciBmcm9tICcuL3dyYXBwZXIuaGVscGVyJztcblxuaW1wb3J0IHsgQWpheFN0b3JlLCBBamF4U3RvcmVDb25maWcsIEJhc2UsIENvbnRhaW5lciwgRG9tQ29uZmlnLCBEdXJhdGlvblVuaXQsIEZvcm11bGFQcm92aWRlckNvbmZpZywgSGlzdG9ncmFtLCBIaXN0b2dyYW1Db25maWcsIEhpc3RvZ3JhbVNlcmllcywgS2V5TWFwQ29uZmlnLCBNYXNrLCBNYXNrQ29uZmlnLCBNZW51LCBNZW51SXRlbSwgTWVudUl0ZW1FbnRyeSwgTW9kZWwsIE1vZGVsQ29uZmlnLCBQYWdpbmdUb29sYmFyQ29uZmlnLCBQYW5lbCwgUGFuZWxDb2xsYXBzZXJDb25maWcsIFBhbmVsQ29sbGFwc2VyT3ZlcmxheUNvbmZpZywgUGFuZWxIZWFkZXIsIFNjcm9sbE1hbmFnZXIsIFNjcm9sbE1hbmFnZXJDb25maWcsIFNjcm9sbGVyLCBTY3JvbGxlckNvbmZpZywgU3RhdGVQcm92aWRlciwgU3RvcmUsIFN0b3JlQ29uZmlnLCBUYWJDb25maWcsIFRvb2wsIFRvb2xDb25maWcsIFRvb2xiYXJDb25maWcsIFRvb2xiYXJJdGVtcywgVG9vbHRpcCwgVG9vbHRpcENvbmZpZywgV2lkZ2V0IH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcbmltcG9ydCB7IEFJRmlsdGVyLCBBSUZpbHRlckNvbmZpZywgQ2VsbENvcHlQYXN0ZSwgQ2VsbENvcHlQYXN0ZUNvbmZpZywgQ2VsbEVkaXQsIENlbGxFZGl0Q29uZmlnLCBDZWxsRWRpdG9yQ29udGV4dCwgQ2VsbE1lbnUsIENlbGxNZW51Q29uZmlnLCBDZWxsVG9vbHRpcCwgQ2VsbFRvb2x0aXBDb25maWcsIENoYXJ0cywgQ2hhcnRzQ29uZmlnLCBDb2x1bW4sIENvbHVtbkF1dG9XaWR0aCwgQ29sdW1uQXV0b1dpZHRoQ29uZmlnLCBDb2x1bW5EcmFnVG9vbGJhciwgQ29sdW1uRHJhZ1Rvb2xiYXJDb25maWcsIENvbHVtblBpY2tlciwgQ29sdW1uUGlja2VyQ29uZmlnLCBDb2x1bW5SZW5hbWUsIENvbHVtblJlbmFtZUNvbmZpZywgQ29sdW1uUmVvcmRlciwgQ29sdW1uUmVvcmRlckNvbmZpZywgQ29sdW1uUmVzaXplLCBDb2x1bW5SZXNpemVDb25maWcsIENvbHVtblN0b3JlLCBDb2x1bW5TdG9yZUNvbmZpZywgRW1wdHlUZXh0RG9tQ29uZmlnLCBFeGNlbEV4cG9ydGVyIGFzIEdyaWRFeGNlbEV4cG9ydGVyLCBFeGNlbEV4cG9ydGVyQ29uZmlnIGFzIEdyaWRFeGNlbEV4cG9ydGVyQ29uZmlnLCBFeHBvcnRDb25maWcsIEZpbGVEcm9wLCBGaWxlRHJvcENvbmZpZywgRmlsbEhhbmRsZSwgRmlsbEhhbmRsZUNvbmZpZywgRmlsdGVyLCBGaWx0ZXJCYXIsIEZpbHRlckJhckNvbmZpZywgRmlsdGVyQ29uZmlnLCBHcmlkLCBHcmlkQmFzZSwgR3JpZExvY2F0aW9uLCBHcmlkTG9jYXRpb25Db25maWcsIEdyaWRTZWxlY3Rpb25Nb2RlLCBHcmlkU3RhdGVJbmZvLCBHcm91cCwgR3JvdXBDb25maWcsIEhlYWRlck1lbnUsIEhlYWRlck1lbnVDb25maWcsIExvY2tSb3dzIGFzIEdyaWRMb2NrUm93cywgTG9ja1Jvd3NDb25maWcgYXMgR3JpZExvY2tSb3dzQ29uZmlnLCBNZXJnZUNlbGxzLCBNZXJnZUNlbGxzQ29uZmlnLCBQZGZFeHBvcnQgYXMgR3JpZFBkZkV4cG9ydCwgUGRmRXhwb3J0Q29uZmlnIGFzIEdyaWRQZGZFeHBvcnRDb25maWcsIFBpbkNvbHVtbnMsIFBpbkNvbHVtbnNDb25maWcsIFByZXNlcnZlU2Nyb2xsT3B0aW9ucywgUHJpbnQgYXMgR3JpZFByaW50LCBQcmludENvbmZpZyBhcyBHcmlkUHJpbnRDb25maWcsIFF1aWNrRmluZCwgUXVpY2tGaW5kQ29uZmlnLCBSZWNvcmRQb3NpdGlvbkNvbnRleHQsIFJlZ2lvblJlc2l6ZSwgUmVnaW9uUmVzaXplQ29uZmlnLCBSZXNwb25zaXZlTGV2ZWxDb25maWcsIFJvdywgUm93Q29weVBhc3RlLCBSb3dDb3B5UGFzdGVDb25maWcsIFJvd0VkaXQsIFJvd0VkaXRDb25maWcsIFJvd0VkaXRvckNvbnRleHQsIFJvd0V4cGFuZGVyLCBSb3dFeHBhbmRlckNvbmZpZywgUm93UmVzaXplIGFzIEdyaWRSb3dSZXNpemUsIFJvd1Jlc2l6ZUNvbmZpZyBhcyBHcmlkUm93UmVzaXplQ29uZmlnLCBTZWFyY2gsIFNlYXJjaENvbmZpZywgU29ydCwgU29ydENvbmZpZywgU3RpY2t5Q2VsbHMsIFN0aWNreUNlbGxzQ29uZmlnLCBTdHJpcGUsIFN0cmlwZUNvbmZpZywgU3ViR3JpZCwgU3ViR3JpZENvbmZpZywgVHJlZSwgVHJlZUNvbmZpZywgVHJlZUdyb3VwLCBUcmVlR3JvdXBDb25maWcsIFhMU0NvbHVtbiB9IGZyb20gJ0BicnludHVtL2dyaWQtdGhpbic7XG5pbXBvcnQgeyBBc3NpZ25tZW50TW9kZWwsIENvbHVtbkxpbmVzLCBDb2x1bW5MaW5lc0NvbmZpZywgU2NoZWR1bGVyQ29udGFpbmVySXRlbUNvbmZpZywgRXZlbnRDb2xvciwgRXZlbnRNb2RlbCwgU2NoZWR1bGVyQ29sdW1uQ29uZmlnLCBHcm91cFN1bW1hcnksIEdyb3VwU3VtbWFyeUNvbmZpZywgSGVhZGVyWm9vbSwgSGVhZGVyWm9vbUNvbmZpZywgSGlzdG9ncmFtUmVuZGVyRGF0YSwgTm9uV29ya2luZ1RpbWUsIE5vbldvcmtpbmdUaW1lQ29uZmlnLCBQYW4sIFBhbkNvbmZpZywgUHJlc2V0U3RvcmUsIFJlY3VycmVuY2VDb25maXJtYXRpb25Qb3B1cCwgUmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwQ29uZmlnLCBSZXNvdXJjZU1lbnUsIFJlc291cmNlTWVudUNvbmZpZywgUmVzb3VyY2VNb2RlbCwgUmVzb3VyY2VUaW1lUmFuZ2VNb2RlbCwgUmVzb3VyY2VUaW1lUmFuZ2VzLCBSZXNvdXJjZVRpbWVSYW5nZXNDb25maWcsIFJvd1Jlb3JkZXIsIFJvd1Jlb3JkZXJDb25maWcsIFNjYWxlQ29sdW1uQ29uZmlnLCBTY2FsZVBvaW50LCBTY2hlZHVsZVRvb2x0aXAsIFNjaGVkdWxlVG9vbHRpcENvbmZpZywgU2NoZWR1bGVyLCBTcGxpdCwgU3BsaXRDb25maWcsIFN1bW1hcnksIFN1bW1hcnlDb25maWcsIFRpbWVBeGlzLCBUaW1lQXhpc0NvbHVtbiwgVGltZUF4aXNDb25maWcsIFRpbWVBeGlzSGVhZGVyTWVudSwgVGltZUF4aXNIZWFkZXJNZW51Q29uZmlnLCBUaW1lUmFuZ2VzLCBUaW1lUmFuZ2VzQ29uZmlnLCBUaW1lU3BhbiwgVGltZWxpbmVCYXNlLCBUaW1lbGluZUNvbnRleHQsIFRpbWVsaW5lSGlzdG9ncmFtLCBUaW1lbGluZUhpc3RvZ3JhbUxpc3RlbmVycywgVGltZWxpbmVTdGF0ZUluZm8sIFZlcnRpY2FsVGltZUF4aXNDb2x1bW4sIFZpZXdQcmVzZXQsIFZpZXdQcmVzZXRDb25maWcsIFZpc2libGVEYXRlIH0gZnJvbSAnQGJyeW50dW0vc2NoZWR1bGVyLXRoaW4nO1xuXG5pbXBvcnQgeyBTdHJpbmdIZWxwZXIgfSBmcm9tICdAYnJ5bnR1bS9jb3JlLXRoaW4nO1xuXG5leHBvcnQgdHlwZSBCcnludHVtVGltZWxpbmVIaXN0b2dyYW1Qcm9wcyA9IHtcbiAgICAvLyBDb25maWdzXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gYWRvcHQgYXMgdGhpcyBXaWRnZXQncyBlbmNhcHN1bGF0aW5nIGVsZW1lbnQuIFRoZSB3aWRnZXQnc1xuICAgICAqIGNvbnRlbnQgd2lsbCBiZSBwbGFjZWQgaW5zaWRlIHRoaXMgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWFkb3B0KVxuICAgICAqL1xuICAgIGFkb3B0ID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIHVzZWQgZm9yIGFnZ3JlZ2F0aW5nIGNoaWxkIHJlY29yZHMgaGlzdG9ncmFtIGRhdGEgZW50cmllcyB0byB0aGVpciBwYXJlbnQgZW50cnkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1hZ2dyZWdhdGVEYXRhRW50cnkpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGFnZ3JlZ2F0ZURhdGFFbnRyeS5hZ2dyZWdhdGVkIFRhcmdldCBwYXJlbnQgZGF0YSBlbnRyeSB0byBhZ2dyZWdhdGUgdGhlIGVudHJ5IGludG8uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGFnZ3JlZ2F0ZURhdGFFbnRyeS5lbnRyeSBDdXJyZW50IGVudHJ5IHRvIGFnZ3JlZ2F0ZSBpbnRvIGBhZ2dyZWdhdGVkYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWdncmVnYXRlRGF0YUVudHJ5LmFycmF5SW5kZXggSW5kZXggb2YgY3VycmVudCBhcnJheSAoaW5kZXggb2YgdGhlIHJlY29yZCBhbW9uZyBvdGhlciByZWNvcmRzIGJlaW5nIGFnZ3JlZ2F0ZWQpLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0W119IGFnZ3JlZ2F0ZURhdGFFbnRyeS5lbnRyeUluZGV4IEluZGV4IG9mIGBlbnRyeWAgaW4gdGhlIGN1cnJlbnQgYXJyYXkuXG4gICAgICogQHJldHVybnMge29iamVjdH0gUmV0dXJuIHZhbHVlIGJlY29tZXMgdGhlIHZhbHVlIG9mIHRoZSBgYWdncmVnYXRlZGAgcGFyYW1ldGVyIG9uIHRoZSBuZXh0IGludm9jYXRpb24gb2YgdGhpcyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBhZ2dyZWdhdGVEYXRhRW50cnkgPyA6ICgoYWdncmVnYXRlRGF0YUVudHJ5OiB7IGFnZ3JlZ2F0ZWQ6IG9iamVjdCwgZW50cnk6IG9iamVjdCwgYXJyYXlJbmRleDogbnVtYmVyLCBlbnRyeUluZGV4OiBvYmplY3RbXSB9KSA9PiBvYmplY3QpfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgIHRoZSBjb21wb25lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZSBkYXRhIGZvciBncm91cCByZWNvcmRzXG4gICAgICogYmFzZWQgb24gdGhlIGdyb3VwcyBtZW1iZXJzIGRhdGEgYnkgY2FsbGluZyBbZ2V0R3JvdXBSZWNvcmRIaXN0b2dyYW1EYXRhXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9taXhpbi9UaW1lbGluZUhpc3RvZ3JhbUdyb3VwaW5nI2Z1bmN0aW9uLWdldEdyb3VwUmVjb3JkSGlzdG9ncmFtRGF0YSkgbWV0aG9kLlxuICAgICAqL1xuICAgIGFnZ3JlZ2F0ZUhpc3RvZ3JhbURhdGFGb3JHcm91cHMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgd2lkZ2V0IGlzIGEgY2hpbGQgb2YgYSBbQ29udGFpbmVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYmUgcGFydGljaXBhdGluZyBpbiBhXG4gICAgICogZmxleGJveCBsYXlvdXQuIFRoaXMgY29uZmlnIGFsbG93cyB5b3UgdG8gc2V0IHRoaXMgd2lkZ2V0J3NcbiAgICAgKiBbYWxpZ24tc2VsZl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2FsaWduLXNlbGYpIHN0eWxlLlxuICAgICAqL1xuICAgIGFsaWduU2VsZiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBhbmltYXRlIHJvdyByZW1vdmFscyBjYXVzZWQgYnkgZmlsdGVyaW5nLlxuICAgICAqIEBkZXByZWNhdGVkIDcuMC4wIERlcHJlY2F0ZWQgYGFuaW1hdGVGaWx0ZXJSZW1vdmFsc2AuIFVzZSBgdHJhbnNpdGlvbi5maWx0ZXJSZW1vdmFsYCBpbnN0ZWFkXG4gICAgICovXG4gICAgYW5pbWF0ZUZpbHRlclJlbW92YWxzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgaWYgcmVtb3ZpbmcgYW5kIGluc2VydGluZyByb3dzIHNob3VsZCBiZSBhbmltYXRlZC4gU2V0IHRvIGBmYWxzZWAgdG8gcHJldmVudCB0aG9zZSBhbmltYXRpb25zLFxuICAgICAqIHJlbW92aW5nIHRoZSByZWxhdGVkIGRlbGF5cy5cbiAgICAgKiBAZGVwcmVjYXRlZCA3LjAuMCBEZXByZWNhdGVkIGBhbmltYXRlUmVtb3ZpbmdSb3dzYC4gVXNlIGB0cmFuc2l0aW9uLnJlbW92ZVJlY29yZGAgaW5zdGVhZFxuICAgICAqL1xuICAgIGFuaW1hdGVSZW1vdmluZ1Jvd3MgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBbVHJlZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1RyZWUpIGZlYXR1cmUgaXMgaW4gdXNlIGFuZCB0aGUgU3RvcmUgaXMgYSB0cmVlIHN0b3JlLCB0aGlzXG4gICAgICogY29uZmlnIG1heSBiZSBzZXQgdG8gYHRydWVgIHRvIHZpc3VhbGx5IGFuaW1hdGUgYnJhbmNoIG5vZGUgZXhwYW5kIGFuZCBjb2xsYXBzZSBvcGVyYXRpb25zLlxuICAgICAqICpUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gU2NoZWR1bGVyIGFuZCBHYW50dCpcbiAgICAgKiBAZGVwcmVjYXRlZCA3LjAuMCBEZXByZWNhdGVkIGBhbmltYXRlVHJlZU5vZGVUb2dnbGVgLiBVc2UgYHRyYW5zaXRpb24udG9nZ2xlVHJlZU5vZGVgIGluc3RlYWRcbiAgICAgKi9cbiAgICBhbmltYXRlVHJlZU5vZGVUb2dnbGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciB0aGUgaWQgb2YgYW4gZWxlbWVudCkgdG8gYXBwZW5kIHRoaXMgd2lkZ2V0J3MgZWxlbWVudCB0by4gQ2FuIGJlIGNvbmZpZ3VyZWQsIG9yIHNldCBvbmNlIGF0XG4gICAgICogcnVudGltZS4gVG8gYWNjZXNzIHRoZSBlbGVtZW50IG9mIGEgcmVuZGVyZWQgd2lkZ2V0LCBzZWUgW2VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KS5cbiAgICAgKi9cbiAgICBhcHBlbmRUbyA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBsb2NhbGl6YWJsZSBzdHJpbmcgKE1heSBjb250YWluIGAnTHt9J2AgdG9rZW5zIHdoaWNoIHJlc29sdmUgaW4gdGhlIGxvY2FsZSBmaWxlKSB0byBpbmplY3RcbiAgICAgKiBpbnRvIGFuIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBsaW5rZWQgdXNpbmcgdGhlIGBhcmlhLWRlc2NyaWJlZGJ5YCBhdHRyaWJ1dGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1hcmlhRGVzY3JpcHRpb24pXG4gICAgICovXG4gICAgYXJpYURlc2NyaXB0aW9uID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGxvY2FsaXphYmxlIHN0cmluZyAoTWF5IGNvbnRhaW4gYCdMe30nYCB0b2tlbnMgd2hpY2ggcmVzb2x2ZSBpbiB0aGUgbG9jYWxlIGZpbGUpIHRvIGluamVjdCBhc1xuICAgICAqIHRoZSBgYXJpYS1sYWJlbGAgYXR0cmlidXRlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctYXJpYUxhYmVsKVxuICAgICAqL1xuICAgIGFyaWFMYWJlbCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogWW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gYGZhbHNlYCB0byBtYWtlIHRoZSB0aW1lbGluZSBwYW5lbCBzdGFydCBhbmQgZW5kIG9uIHRoZSBleGFjdCBwcm92aWRlZFxuICAgICAqIFtzdGFydERhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lQmFzZSNjb25maWctc3RhcnREYXRlKS9bZW5kRGF0ZV0oI1NjaGVkdWxlci92aWV3L1RpbWVsaW5lQmFzZSNjb25maWctZW5kRGF0ZSkgdy9vIGFkanVzdGluZyB0aGVtLlxuICAgICAqL1xuICAgIGF1dG9BZGp1c3RUaW1lQXhpcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEF1dG9tYXRpY2FsbHkgc2V0IGdyaWRzIGhlaWdodCB0byBmaXQgYWxsIHJvd3MgKG5vIHNjcm9sbGluZyBpbiB0aGUgZ3JpZCkuIEluIGdlbmVyYWwgeW91IHNob3VsZCBhdm9pZFxuICAgICAqIHVzaW5nIGBhdXRvSGVpZ2h0OiB0cnVlYCwgc2luY2UgaXQgd2lsbCBieXBhc3MgR3JpZHMgdmlydHVhbCByZW5kZXJpbmcgYW5kIHJlbmRlciBhbGwgcm93cyBhdCBvbmNlLCB3aGljaFxuICAgICAqIGluIGEgbGFyZ2VyIGdyaWQgaXMgcmVhbGx5IGJhZCBmb3IgcGVyZm9ybWFuY2UuXG4gICAgICovXG4gICAgYXV0b0hlaWdodCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIGhvdyBtdWNoIHNwYWNlIHRvIGxlYXZlIGJldHdlZW4gc3RhY2tlZCBldmVudCBiYXJzIGluIHB4LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctYmFyTWFyZ2luKVxuICAgICAqL1xuICAgIGJhck1hcmdpbiA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogQSBGdW5jdGlvbiB3aGljaCByZXR1cm5zIHRoZSB0b29sdGlwIHRleHQgdG8gZGlzcGxheSB3aGVuIGhvdmVyaW5nIGEgYmFyLlxuICAgICAqIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgcGFzc2VkOlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0IFRoZSB0b29sdGlwIGNvbnRleHQgaW5mb1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0LmRhdHVtIFRoZSBoaXN0b2dyYW0gYmFyIGJlaW5nIGhvdmVyZWQgaW5mb1xuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuVG9vbHRpcH0gY29udGV4dC50aXAgVGhlIHRvb2x0aXAgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250ZXh0LmVsZW1lbnQgVGhlIEVsZW1lbnQgZm9yIHdoaWNoIHRoZSBUb29sdGlwIGlzIG1vbml0b3JpbmcgbW91c2UgbW92ZW1lbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250ZXh0LmFjdGl2ZVRhcmdldCBUaGUgdGFyZ2V0IGVsZW1lbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIHNob3dcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBjb250ZXh0LmV2ZW50IFRoZSByYXcgRE9NIGV2ZW50XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGNvbnRleHQucmVjb3JkIFRoZSByZWNvcmQgd2hpY2ggdmFsdWUgdGhlIGhvdmVyZWQgYmFyIGRpc3BsYXlzLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRvb2x0aXAgSFRNTCBjb250ZW50XG4gICAgICovXG4gICAgYmFyVG9vbHRpcFRlbXBsYXRlID8gOiAoY29udGV4dDogeyBkYXR1bTogb2JqZWN0LCB0aXA6IFRvb2x0aXAsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBhY3RpdmVUYXJnZXQ6IEhUTUxFbGVtZW50LCBldmVudDogRXZlbnQsIHJlY29yZDogTW9kZWwgfSkgPT4gc3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBDb25maWcgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIFtUb29sYmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sYmFyKSxcbiAgICAgKiBvciBhcnJheSBvZiBjb25maWcgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGNoaWxkIGl0ZW1zIG9mIGEgVG9vbGJhci4gQW5vdGhlciB3YXkgdG8gYWRkIGEgYmJhciBpcyB0byB1c2UgW3N0cmlwc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXN0cmlwcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1iYmFyKVxuICAgICAqL1xuICAgIGJiYXIgPyA6IChTY2hlZHVsZXJDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfFBhZ2luZ1Rvb2xiYXJDb25maWd8bnVsbFxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBDU1MgY2xhc3NlcyB0byBhZGQgdG8gdGhlIHBhbmVsJ3MgYm9keSBlbGVtZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctYm9keUNscylcbiAgICAgKi9cbiAgICBib2R5Q2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdoZXJlIHByb3BlcnR5IG5hbWVzIHdpdGggYSB0cnV0aHkgdmFsdWUgaW5kaWNhdGUgd2hpY2ggZXZlbnRzIHNob3VsZCBidWJibGUgdXAgdGhlIG93bmVyc2hpcFxuICAgICAqIGhpZXJhcmNoeSB3aGVuIHRyaWdnZXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWJ1YmJsZUV2ZW50cylcbiAgICAgKi9cbiAgICBidWJibGVFdmVudHMgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIFRoaXMgY29uZmlnIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgaW52aXNpYmxlIHBhcnRzIG9mIHRoZSB0aW1lc3BhbiB3aGVuIFtpbmZpbml0ZVNjcm9sbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vVGltZWxpbmVTY3JvbGwjY29uZmlnLWluZmluaXRlU2Nyb2xsKSBzZXQgdG8gYHRydWVgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctYnVmZmVyQ29lZilcbiAgICAgKi9cbiAgICBidWZmZXJDb2VmID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbmZpZyBkZWZpbmVzIHRoZSBzY3JvbGwgbGltaXQsIHdoaWNoLCB3aGVuIGV4Y2VlZGVkIHdpbGwgY2F1c2UgYSB0aW1lc3BhbiBzaGlmdC5cbiAgICAgKiBUaGUgbGltaXQgaXMgY2FsY3VsYXRlZCBhcyB0aGUgYHBhbmVsV2lkdGggKiBbYnVmZmVyQ29lZl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vVGltZWxpbmVTY3JvbGwjY29uZmlnLWJ1ZmZlckNvZWYpICogYnVmZmVyVGhyZXNob2xkYC4gRHVyaW5nIHNjcm9sbGluZywgaWYgdGhlIGxlZnQgb3IgcmlnaHQgc2lkZVxuICAgICAqIGhhcyBsZXNzIHRoYW4gdGhhdCBvZiB0aGUgcmVuZGVyZWQgY29udGVudCAtIGEgc2hpZnQgaXMgdHJpZ2dlcmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctYnVmZmVyVGhyZXNob2xkKVxuICAgICAqL1xuICAgIGJ1ZmZlclRocmVzaG9sZCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gbm90IGNhbGwgb25YWFggbWV0aG9kIG5hbWVzIChlLmcuIGBvblNob3dgLCBgb25DbGlja2ApLCBhcyBhbiBlYXN5IHdheSB0byBsaXN0ZW4gZm9yIGV2ZW50cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWNhbGxPbkZ1bmN0aW9ucylcbiAgICAgKi9cbiAgICBjYWxsT25GdW5jdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCBpZiBhbiBldmVudCBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24sIHRoZSBlcnJvciBwcm9wYWdhdGVzIHVwIHRoZSBzdGFjayBhbmQgdGhlXG4gICAgICogYXBwbGljYXRpb24gc3RhdGUgaXMgdW5kZWZpbmVkLiBDb2RlIHdoaWNoIGZvbGxvd3MgdGhlIGV2ZW50IGhhbmRsZXIgd2lsbCAqbm90KiBiZSBleGVjdXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucylcbiAgICAgKi9cbiAgICBjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBjcm9wIHRleHQgaW4gZ3JpZCBjZWxscyB3aXRob3V0IGVsbGlwc2lzICguLi4pLiBXaGVuIGVuYWJsZWQsIGNlbGxzIGNvbnRhaW5pbmcgcHVyZVxuICAgICAqIHVzZSBgZGlzcGxheSA6IGJsb2NrYCwgaW5zdGVhZCBvZiBgZGlzcGxheSA6IGZsZXhgIHRvIGFsbG93IGVsbGlwc2lzIHRvIHdvcmsuXG4gICAgICogPHN0cm9uZz5OT1RFPC9zdHJvbmc+IE9ubHkgc3VwcG9ydGVkIGluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBgOmhhcygpYCBDU1Mgc2VsZWN0b3JcbiAgICAgKi9cbiAgICBjZWxsRWxsaXBzaXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIGVsZW1lbnQuXG4gICAgICogTWF5IGJlIHNwZWNpZmllZCBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIHdpdGggdHJ1dGh5IHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1jbHMpXG4gICAgICovXG4gICAgY2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgcGFuZWwgaXMgY29sbGFwc2VkICh0aGUgYm9keSBvZiB0aGUgcGFuZWwgaXMgaGlkZGVuIHdoaWxlIG9ubHkgdGhlIGhlYWRlciBpc1xuICAgICAqIHZpc2libGUpLiBPbmx5IHZhbGlkIGlmIHRoZSBwYW5lbCBpcyBbY29sbGFwc2libGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzaWJsZSkuXG4gICAgICovXG4gICAgY29sbGFwc2VkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhpcyBjb25maWcgZW5hYmxlcyBjb2xsYXBzaWJpbGl0eSBmb3IgdGhlIHBhbmVsLiBTZWUgW2NvbGxhcHNlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNlZCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1jb2xsYXBzaWJsZSlcbiAgICAgKi9cbiAgICBjb2xsYXBzaWJsZSA/IDogYm9vbGVhbnxQYW5lbENvbGxhcHNlckNvbmZpZ3xQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWdcbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBzcGVjaWZpZWQgY29sb3IgdG8gdGhlIHdpZGdldCwgYnkgc2V0dGluZyB0aGUgYC0tYi1wcmltYXJ5YCBDU1MgdmFyaWFibGUgaW4gdGhlIHdpZGdldHNcbiAgICAgKiBgc3R5bGVgIGJsb2NrLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctY29sb3IpXG4gICAgICovXG4gICAgY29sb3IgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFByb2dyYW1tYXRpYyBjb250cm9sIG92ZXIgd2hpY2ggY29sdW1uIHRvIHN0YXJ0IGluIHdoZW4gdXNlZCBpbiBhIGdyaWQgbGF5b3V0LlxuICAgICAqL1xuICAgIGNvbHVtbiA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gbm90IHNob3cgY29sdW1uIGxpbmVzLiBFbmQgcmVzdWx0IG1pZ2h0IGJlIG92ZXJydWxlZCBieS9kaWZmZXIgYmV0d2VlbiB0aGVtZXMuXG4gICAgICovXG4gICAgY29sdW1uTGluZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBY2NlcHRzIGNvbHVtbiBkZWZpbml0aW9ucyBmb3IgdGhlIGdyaWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBUaGV5IHdpbGwgYmUgdXNlZCB0byBjcmVhdGVcbiAgICAgKiBbQ29sdW1uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2NvbHVtbi9Db2x1bW4pIGluc3RhbmNlcyB0aGF0IGFyZSBhZGRlZCB0byBhIFtDb2x1bW5TdG9yZV0oI0dyaWQvZGF0YS9Db2x1bW5TdG9yZSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1jb2x1bW5zKVxuICAgICAqL1xuICAgIGNvbHVtbnMgPyA6IENvbHVtblN0b3JlfFNjaGVkdWxlckNvbHVtbkNvbmZpZ1tdfENvbHVtblN0b3JlQ29uZmlnXG4gICAgY29uZmlnID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIHRoZSBbY29udGVudEVsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCkuXG4gICAgICogTWF5IGJlIHNwZWNpZmllZCBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIHdpdGggdHJ1dGh5IHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1jb250ZW50RWxlbWVudENscylcbiAgICAgKi9cbiAgICBjb250ZW50RWxlbWVudENscyA/IDogc3RyaW5nfG9iamVjdFxuICAgIC8qKlxuICAgICAqIEV2ZW50IHdoaWNoIGlzIHVzZWQgdG8gc2hvdyBjb250ZXh0IG1lbnVzLlxuICAgICAqIEF2YWlsYWJsZSBvcHRpb25zIGFyZTogJ2NvbnRleHRtZW51JywgJ2NsaWNrJywgJ2RibGNsaWNrJy5cbiAgICAgKi9cbiAgICBjb250ZXh0TWVudVRyaWdnZXJFdmVudCA/IDogJ2NvbnRleHRtZW51J3wnY2xpY2snfCdkYmxjbGljaydcbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW50IHNob3J0Y3V0IHRvIHNldCBkYXRhIGluIGdyaWRzIHN0b3JlIGJvdGggZHVyaW5nIGluaXRpYWxpemF0aW9uIGFuZCBhdCBydW50aW1lLiBDYW4gYWxzbyBiZVxuICAgICAqIHVzZWQgdG8gcmV0cmlldmUgZGF0YSBhdCBydW50aW1lLCBhbHRob3VnaCB3ZSBkbyByZWNvbW1lbmQgaW50ZXJhY3Rpbmcgd2l0aCBHcmlkcyBzdG9yZSBpbnN0ZWFkIHVzaW5nXG4gICAgICogdGhlIFtzdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI3Byb3BlcnR5LXN0b3JlKSBwcm9wZXJ0eS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWRhdGEpXG4gICAgICovXG4gICAgZGF0YSA/IDogb2JqZWN0W118TW9kZWxbXXxNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIFdpZGdldCBjb25maWd1cmF0aW9uIGlzIHVzZWQgaW4gdGhlIEdyaWQncyBSb3dFeHBhbmRlciBmZWF0dXJlJ3MgYHdpZGdldGAgY29uZmlnLCBwcm92aWRlIHRoZVxuICAgICAqIGZpZWxkIG9uIHRoZSBleHBhbmRlZCByZWNvcmQgdG8gdXNlIGZvciBwb3B1bGF0aW5nIHRoaXMgd2lkZ2V0J3Mgc3RvcmUgKGlmIGFwcGxpY2FibGUpXG4gICAgICovXG4gICAgZGF0YUZpZWxkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBSZWNvcmQgZmllbGQgZnJvbSB3aGljaCB0aGUgaGlzdG9ncmFtIGRhdGEgd2lsbCBiZSBjb2xsZWN0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1kYXRhTW9kZWxGaWVsZClcbiAgICAgKi9cbiAgICBkYXRhTW9kZWxGaWVsZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogT2JqZWN0IHRvIGFwcGx5IHRvIGVsZW1lbnRzIGRhdGFzZXQgKGVhY2gga2V5IHdpbGwgYmUgdXNlZCBhcyBhIGRhdGEtYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50KVxuICAgICAqL1xuICAgIGRhdGFzZXQgPyA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICAvKipcbiAgICAgKiBSZWdpb24gdG8gd2hpY2ggY29sdW1ucyBhcmUgYWRkZWQgd2hlbiB0aGV5IGhhdmUgbm9uZSBzcGVjaWZpZWRcbiAgICAgKi9cbiAgICBkZWZhdWx0UmVnaW9uID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGRlc3Ryb3kgdGhlIHN0b3JlIHdoZW4gdGhlIGdyaWQgaXMgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIGRlc3Ryb3lTdG9yZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENoZWNrIGZvciBDU1MgY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2hlbiB1cGdyYWRpbmcgdG8gdjcuIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgY2hlY2tzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgICAgKi9cbiAgICBkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBvciBlbmFibGUgdGhlIHdpZGdldC4gSXQgaXMgc2ltaWxhciB0byBbcmVhZE9ubHldKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctcmVhZE9ubHkpIGV4Y2VwdCBhIGRpc2FibGVkIHdpZGdldFxuICAgICAqIGNhbm5vdCBiZSBmb2N1c2VkLCB1c2VzIGEgZGlmZmVyZW50IHJlbmRpdGlvbiAodXN1YWxseSBncmV5aXNoKSBhbmQgZG9lcyBub3QgYWxsb3cgc2VsZWN0aW5nIGl0cyB2YWx1ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWRpc2FibGVkKVxuICAgICAqL1xuICAgIGRpc2FibGVkID8gOiBib29sZWFufCdpbmVydCdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIG5vdCBnZXQgYSB3YXJuaW5nIHdoZW4gY2FsbGluZyBbZ2V0U3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNmdW5jdGlvbi1nZXRTdGF0ZSkgd2hlbiB0aGVyZSBpcyBhIGNvbHVtblxuICAgICAqIGNvbmZpZ3VyZWQgd2l0aG91dCBhbiBgaWRgLiBCdXQgdGhlIHJlY29tbWVuZGVkIGFjdGlvbiBpcyB0byBhbHdheXMgY29uZmlndXJlIGNvbHVtbnMgd2l0aCBhbiBgaWRgIHdoZW5cbiAgICAgKiB1c2luZyBzdGF0ZXMuXG4gICAgICovXG4gICAgZGlzYWJsZUdyaWRDb2x1bW5JZFdhcm5pbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIG5vdCBnZXQgYSB3YXJuaW5nIHdoZW4gdXNpbmcgYW5vdGhlciBiYXNlIGNsYXNzIHRoYW4gR3JpZFJvd01vZGVsIGZvciB5b3VyIGdyaWQgZGF0YS4gSWZcbiAgICAgKiB5b3UgZG8sIGFuZCB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgZnVsbCBmZWF0dXJlIHNldCBvZiB0aGUgZ3JpZCB0aGVuIGluY2x1ZGUgdGhlIGZpZWxkcyBmcm9tIEdyaWRSb3dNb2RlbFxuICAgICAqIGluIHlvdXIgbW9kZWwgZGVmaW5pdGlvbi5cbiAgICAgKi9cbiAgICBkaXNhYmxlR3JpZFJvd01vZGVsV2FybmluZyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIERlZmluZXMgaG93IGRhdGVzIHdpbGwgYmUgZm9ybWF0dGVkIGluIHRvb2x0aXBzIGV0Yy4gVGhpcyBjb25maWcgaGFzIHByaW9yaXR5IG92ZXIgc2ltaWxhciBjb25maWcgb24gdGhlXG4gICAgICogdmlldyBwcmVzZXQuIEZvciBhbGxvd2VkIHZhbHVlcyBzZWUgW2Zvcm1hdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRGF0ZUhlbHBlciNmdW5jdGlvbi1mb3JtYXQtc3RhdGljKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWRpc3BsYXlEYXRlRm9ybWF0KVxuICAgICAqL1xuICAgIGRpc3BsYXlEYXRlRm9ybWF0ID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDb250cm9scyB0aGUgcGxhY2VtZW50IG9mIHRoaXMgd2lkZ2V0IHdoZW4gaXQgaXMgYWRkZWQgdG8gYSBbcGFuZWwncyBdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsKVxuICAgICAqIFtzdHJpcHMgY29sbGVjdGlvbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXN0cmlwcykuIFR5cGljYWwgdmFsdWVzIGZvciB0aGlzIGNvbmZpZyBhcmUgYCd0b3AnYCxcbiAgICAgKiBgJ2JvdHRvbSdgLCBgJ2xlZnQnYCwgb3IgYCdyaWdodCdgLCB3aGljaCBjYXVzZSB0aGUgd2lkZ2V0IHRvIGJlIHBsYWNlZCBvbiB0aGF0IHNpZGUgb2YgdGhlIHBhbmVsJ3NcbiAgICAgKiBib2R5LiBTdWNoIHdpZGdldHMgYXJlIGNhbGxlZCBcImVkZ2Ugc3RyaXBzXCIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1kb2NrKVxuICAgICAqL1xuICAgIGRvY2sgPyA6ICd0b3AnfCdib3R0b20nfCdsZWZ0J3wncmlnaHQnfCdzdGFydCd8J2VuZCd8J2hlYWRlcid8J3ByZS1oZWFkZXInfG9iamVjdFxuICAgIC8qKlxuICAgICAqIE1ha2UgdGhpcyBQYW5lbCBhIGRvY2tlZCBkcmF3ZXIgd2hpY2ggc2xpZGVzIG91dCBmcm9tIG9uZSBzaWRlIG9mIHRoZSBicm93c2VyIHZpZXdwb3J0IGJ5IGRlZmF1bHQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1kcmF3ZXIpXG4gICAgICogQHBhcmFtIHsnc3RhcnQnLCdsZWZ0JywnZW5kJywncmlnaHQnLCd0b3AnLCdib3R0b20nfSBzaWRlIFRoZSBzaWRlIG9mIHRoZSB2aWV3cG9ydCB0byBkb2NrIHRoZSBkcmF3ZXIgdG8uICAqIGAnc3RhcnQnYCBtZWFucyB0aGUgYGlubGluZS1zdGFydGAgc2lkZS4gKiBgJ2VuZCdgIG1lYW5zIHRoZSBgaW5saW5lLWVuZGAgc2lkZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZyxudW1iZXJ9IHNpemUgVGhlIHNpemUgb2YgdGhlIGRyYXdlciBpbiBpdHMgY29sbGFwc2libGUgYXhpcy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlubGluZSBJZiB1c2luZyB0aGUgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyB0byBwbGFjZSB0aGUgZHJhd2VyIGluc2lkZSBhIGhvc3Qgd2lkZ2V0LCB0aGlzIG1heSBiZSBzZXQgdG8gYHRydWVgIHRvIG1ha2UgdGhlIGRyYXdlciBpbmxpbmUgd2l0aGluIHRoYXQgaG9zdC4gTm90ZSB0aGF0LCBpZiB1c2luZyB0aGlzLCB0aGUgbGF5b3V0IG9mIHRoZSBob3N0IGVsZW1lbnQgbXVzdCBoYXZlIGBmbGV4LWRpcmVjdGlvbmAgc2V0IGFwcHJvcHJpYXRlbHkuXG4gICAgICogQHBhcmFtIHtib29sZWFuLG9iamVjdH0gYXV0b0Nsb3NlIFNwZWNpZmllcyB3aGF0IHVzZXIgYWN0aW9ucyBzaG91bGQgYXV0b21hdGljYWxseSBjbG9zZSB0aGUgZHJhd2VyLiBEZWZhdWx0cyB0byBjbG9zaW5nIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG91dHNpZGUgb2YgdGhlIGRyYXdlciBvciB3aGVuIGZvY3VzIG1vdmVzIG91dHNpZGUgb2YgdGhlIGRyYXdlci5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4sc3RyaW5nfSBhdXRvQ2xvc2UubW91c2Vkb3duIElmIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIsIHRoZSBkcmF3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGhpZGRlbi4gSWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLCBpdCBpcyB1c2VkIGFzIGEgQ1NTIHNlbGVjdG9yIHRvIGZpbHRlciBjbGlja3Mgd2hpY2ggc2hvdWxkIGNsb3NlIHRoZSBkcmF3ZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFuLHN0cmluZ30gYXV0b0Nsb3NlLmZvY3Vzb3V0IElmIGZvY3VzIG1vdmVzIG91dHNpZGUgb2YgdGhlIGRyYXdlciwgdGhlIGRyYXdlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaGlkZGVuLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRvQ2xvc2UubW91c2VvdXQgSGlkZXMgdGhlIGRyYXdlciB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGRyYXdlciBhZnRlciB0aGUgYGF1dG9DbG9zZURlbGF5YCBwZXJpb2QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF1dG9DbG9zZURlbGF5IFdoZW4gdXNpbmcgYG1vdXNlb3V0YCwgdGhpcyBpcyB0aGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgZHJhd2VyID8gOiBib29sZWFufHtzaWRlPzogJ3N0YXJ0J3wnbGVmdCd8J2VuZCd8J3JpZ2h0J3wndG9wJ3wnYm90dG9tJywgc2l6ZT86IHN0cmluZ3xudW1iZXIsIGlubGluZT86IGJvb2xlYW4sIGF1dG9DbG9zZTogeyBtb3VzZWRvd24/OiBib29sZWFufHN0cmluZywgZm9jdXNvdXQ/OiBib29sZWFufHN0cmluZywgbW91c2VvdXQ/OiBzdHJpbmcgfSwgYXV0b0Nsb3NlRGVsYXk/OiBudW1iZXJ9XG4gICAgLyoqXG4gICAgICogRGVjaW1hbCBwcmVjaXNpb24gdXNlZCB3aGVuIGRpc3BsYXlpbmcgZHVyYXRpb25zLCB1c2VkIGJ5IHRvb2x0aXBzIGFuZCBEdXJhdGlvbkNvbHVtbi5cbiAgICAgKiBTcGVjaWZ5IGBmYWxzZWAgdG8gdXNlIHJhdyB2YWx1ZVxuICAgICAqL1xuICAgIGR1cmF0aW9uRGlzcGxheVByZWNpc2lvbiA/IDogbnVtYmVyfGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgc3BlY2lmeWluZyBhdHRyaWJ1dGVzIHRvIGFzc2lnbiB0byB0aGUgcm9vdCBlbGVtZW50IG9mIHRoaXMgd2lkZ2V0LlxuICAgICAqIFNldCBgbnVsbGAgdmFsdWUgdG8gYXR0cmlidXRlIHRvIHJlbW92ZSBpdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAqL1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8bnVsbD5cbiAgICAvKipcbiAgICAgKiBUZXh0IG9yIEhUTUwsIG9yIGEgW0VtcHR5VGV4dERvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI3R5cGVkZWYtRW1wdHlUZXh0RG9tQ29uZmlnKSBibG9jayB0byBkaXNwbGF5IHdoZW4gdGhlcmUgaXMgbm8gZGF0YSB0byBkaXNwbGF5IGluIHRoZSBncmlkLlxuICAgICAqIFdoZW4gdXNpbmcgbXVsdGlwbGUgR3JpZCByZWdpb25zLCBwcm92aWRlIHRoZSBgcmVnaW9uYCBwcm9wZXJ0eSB0byBkZWNpZGUgd2hlcmUgdGhlIHRleHQgaXMgc2hvd24uXG4gICAgICogQnkgZGVmYXVsdCwgaXQgaXMgc2hvd24gaW4gdGhlIGZpcnN0IHJlZ2lvbi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWVtcHR5VGV4dClcbiAgICAgKi9cbiAgICBlbXB0eVRleHQgPyA6IHN0cmluZ3xFbXB0eVRleHREb21Db25maWdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCBpZiB5b3UgZG9uJ3Qgd2FudCBldmVudCBiYXIgRE9NIHVwZGF0ZXMgdG8gYW5pbWF0ZS5cbiAgICAgKiBAZGVwcmVjYXRlZCA3LjAuMCBEZXByZWNhdGVkIGBlbmFibGVFdmVudEFuaW1hdGlvbnNgLiBVc2UgYHRyYW5zaXRpb24uY2hhbmdlRXZlbnRgIGluc3RlYWRcbiAgICAgKi9cbiAgICBlbmFibGVFdmVudEFuaW1hdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHNob3dpbmcgb2NjdXJyZW5jZXMgb2YgcmVjdXJyaW5nIGV2ZW50cyBhY3Jvc3MgdGhlIHNjaGVkdWxlcidzIHRpbWUgYXhpcy4gSWYgeW91IHdhbnQgdG8gZGlzYWJsZVxuICAgICAqIHRoZSByZWN1cnJlbmNlIHBvcHVwLCB5b3UgY2FuIGNob29zZSBzZXQgdGhlIGBkZWZhdWx0QWN0aW9uYCB0byBgZnV0dXJlYCB0byBhZmZlY3QgYWxsIGZ1dHVyZVxuICAgICAqIG9jY3VycmVuY2VzLCBvciBgc2luZ2xlYCB0byBqdXN0IGFmZmVjdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGV2ZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctZW5hYmxlUmVjdXJyaW5nRXZlbnRzKVxuICAgICAqL1xuICAgIGVuYWJsZVJlY3VycmluZ0V2ZW50cyA/IDogYm9vbGVhbnx7XG4gICAgICAgIGRlZmF1bHRBY3Rpb24/OiAnc2luZ2xlJ3wnZnV0dXJlJ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgdGhpcyBhcyBgdHJ1ZWAgdG8gYWxsb3cgZWxlbWVudHMgd2l0aGluIGNlbGxzIHRvIGJlIHN0eWxlZCBhcyBgcG9zaXRpb246IHN0aWNreWAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1lbmFibGVTdGlja3kpXG4gICAgICovXG4gICAgZW5hYmxlU3RpY2t5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBhbGxvdyB0ZXh0IHNlbGVjdGlvbiBpbiB0aGUgZ3JpZCBjZWxscy4gTm90ZSwgdGhpcyBjYW5ub3QgYmUgdXNlZCBzaW11bHRhbmVvdXNseSB3aXRoIHRoZVxuICAgICAqIGBSb3dSZW9yZGVyYCBmZWF0dXJlLlxuICAgICAqL1xuICAgIGVuYWJsZVRleHRTZWxlY3Rpb24gPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGxpc3RlbiBmb3IgQ1RSTC1aIChDTUQtWiBvbiBNYWMgT1MpIGtleWJvYXJkIGV2ZW50IGFuZCB0cmlnZ2VyIHVuZG8gKHJlZG8gd2hlbiBTSElGVCBpc1xuICAgICAqIHByZXNzZWQpLiBPbmx5IGFwcGxpY2FibGUgd2hlbiB1c2luZyBhIFtTdGF0ZVRyYWNraW5nTWFuYWdlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS9kYXRhL3N0bS9TdGF0ZVRyYWNraW5nTWFuYWdlcikuXG4gICAgICovXG4gICAgZW5hYmxlVW5kb1JlZG9LZXlzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSB0aW1lbGluZSAoaWYgbm90IGNvbmZpZ3VyZSB3aXRoIFtpbmZpbml0ZVNjcm9sbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVCYXNlI2NvbmZpZy1pbmZpbml0ZVNjcm9sbCkpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctZW5kRGF0ZSlcbiAgICAgKi9cbiAgICBlbmREYXRlID8gOiBEYXRlfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEV2ZW50IGNvbG9yIHVzZWQgYnkgZGVmYXVsdC4gRXZlbnRzIGFuZCByZXNvdXJjZXMgY2FuIHNwZWNpZnkgdGhlaXIgb3duIGNvbG9yLCB3aXRoIHByaW9yaXR5IG9yZGVyIGJlaW5nOlxuICAgICAqIEV2ZW50IC0mZ3Q7IFJlc291cmNlIC0mZ3Q7IFNjaGVkdWxlciBkZWZhdWx0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctZXZlbnRDb2xvcilcbiAgICAgKi9cbiAgICBldmVudENvbG9yID8gOiBFdmVudENvbG9yXG4gICAgLyoqXG4gICAgICogRXZlbnQgc3R5bGUgdXNlZCBieSBkZWZhdWx0LiBFdmVudHMgYW5kIHJlc291cmNlcyBjYW4gc3BlY2lmeSB0aGVpciBvd24gc3R5bGUsIHdpdGggcHJpb3JpdHkgb3JkZXIgYmVpbmc6XG4gICAgICogRXZlbnQgLSZndDsgUmVzb3VyY2UgLSZndDsgU2NoZWR1bGVyIGRlZmF1bHQuIERldGVybWluZXMgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGV2ZW50IGJ5IGFzc2lnbmluZyBhIENTUyBjbGFzc1xuICAgICAqIHRvIGl0LiBBdmFpbGFibGUgc3R5bGVzIGFyZTpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWV2ZW50U3R5bGUpXG4gICAgICovXG4gICAgZXZlbnRTdHlsZSA/IDogJ3RvbmFsJ3wnZmlsbGVkJ3wnYm9yZGVyZWQnfCd0cmFjZWQnfCdvdXRsaW5lZCd8J2luZGVudGVkJ3wnbGluZSd8J2Rhc2hlZCd8J21pbmltYWwnfCdyb3VuZGVkJ3wnY2FsZW5kYXInfCdpbnRlcmRheSd8J2dhbnR0J3xudWxsXG4gICAgZXh0cmFEYXRhID8gOiBhbnlcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIHN0cmV0Y2ggdGhlIGxhc3QgY29sdW1uIGluIGEgZ3JpZCB3aXRoIGFsbCBmaXhlZCB3aWR0aCBjb2x1bW5zXG4gICAgICogdG8gZmlsbCBleHRyYSBhdmFpbGFibGUgc3BhY2UgaWYgdGhlIGdyaWQncyB3aWR0aCBpcyB3aWRlciB0aGFuIHRoZSBzdW0gb2YgYWxsXG4gICAgICogY29uZmlndXJlZCBjb2x1bW4gd2lkdGhzLlxuICAgICAqL1xuICAgIGZpbGxMYXN0Q29sdW1uID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgdHJ1ZWAgdG8gZm9yY2UgcmVuZGVyZWQgZXZlbnRzL3Rhc2tzIHRvIGZpbGwgZW50aXJlIHRpY2tzLiBUaGlzIG9ubHkgYWZmZWN0cyByZW5kZXJpbmcsIHN0YXJ0XG4gICAgICogYW5kIGVuZCBkYXRlcyByZXRhaW4gdGhlaXIgdmFsdWUgb24gdGhlIGRhdGEgbGV2ZWwuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1maWxsVGlja3MpXG4gICAgICovXG4gICAgZmlsbFRpY2tzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVXNlIGZpeGVkIHJvdyBoZWlnaHQuIFNldHRpbmcgdGhpcyB0byBgdHJ1ZWAgd2lsbCBjb25maWd1cmUgdGhlIHVuZGVybHlpbmcgUm93TWFuYWdlciB0byB1c2UgZml4ZWQgcm93XG4gICAgICogaGVpZ2h0LCB3aGljaCBzYWNyaWZpY2VzIHRoZSBhYmlsaXR5IHRvIHVzZSByb3dzIHdpdGggdmFyaWFibGUgaGVpZ2h0IHRvIGdhaW4gYSBmcmFjdGlvbiBiZXR0ZXJcbiAgICAgKiBwZXJmb3JtYW5jZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWZpeGVkUm93SGVpZ2h0KVxuICAgICAqL1xuICAgIGZpeGVkUm93SGVpZ2h0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIHdpZGdldCBpcyBhIGNoaWxkIG9mIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKSwgaXQgd2lsbCBieSBkZWZhdWx0IGJlIHBhcnRpY2lwYXRpbmcgaW4gYVxuICAgICAqIGZsZXhib3ggbGF5b3V0LiBUaGlzIGNvbmZpZyBhbGxvd3MgeW91IHRvIHNldCB0aGlzIHdpZGdldCdzXG4gICAgICogW2ZsZXhdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mbGV4KSBzdHlsZS5cbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG51bWJlciBvciBhIGAmbHQ7ZmxleC1ncm93Jmd0OyAmbHQ7ZmxleC1zaHJpbmsmZ3Q7ICZsdDtmbGV4LWJhc2lzJmd0O2AgZm9ybWF0IHN0cmluZy5cbiAgICAgKiBudW1lcmljLW9ubHkgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyB0aGUgYGZsZXgtZ3Jvd2AgdmFsdWUuXG4gICAgICovXG4gICAgZmxleCA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbmZpZyBvYmplY3Qgb2YgYSBmb290ZXIuIE1heSBjb250YWluIGEgYGRvY2tgLCBgaHRtbGAgYW5kIGEgYGNsc2AgcHJvcGVydHkuIEEgZm9vdGVyIGlzIG5vdCBhIHdpZGdldCxcbiAgICAgKiBidXQgcmF0aGVyIHBsYWluIEhUTUwgdGhhdCBmb2xsb3dzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBhbmVsJ3MgYm9keSBhbmQgW3N0cmlwc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXN0cmlwcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1mb290ZXIpXG4gICAgICovXG4gICAgZm9vdGVyID8gOiB7XG4gICAgICAgIGRvY2s/OiAndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnc3RhcnQnfCdlbmQnXG4gICAgICAgIGh0bWw/OiBzdHJpbmdcbiAgICAgICAgY2xzPzogc3RyaW5nXG4gICAgfXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGZvcmNlIHRoZSB0aW1lIGNvbHVtbnMgdG8gZml0IHRvIHRoZSBhdmFpbGFibGUgc3BhY2UgKGhvcml6b250YWwgb3IgdmVydGljYWwgZGVwZW5kcyBvbiBtb2RlKS5cbiAgICAgKiBOb3RlIHRoYXQgc2V0dGluZyBbc3VwcHJlc3NGaXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lQmFzZSNjb25maWctc3VwcHJlc3NGaXQpIHRvIGB0cnVlYCwgd2lsbCBkaXNhYmxlIGBmb3JjZUZpdGAgZnVuY3Rpb25hbGl0eS4gWm9vbWluZ1xuICAgICAqIGNhbm5vdCBiZSB1c2VkIHdoZW4gYGZvcmNlRml0YCBpcyBzZXQuXG4gICAgICovXG4gICAgZm9yY2VGaXQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hpY2ggbmFtZXMgZm9ybXVsYSBwcmVmaXhlcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGNvbHVtbnMgY29uZmlndXJlZCB3aXRoXG4gICAgICogYGZvcm11bGEgOiB0cnVlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWZvcm11bGFQcm92aWRlcnMpXG4gICAgICovXG4gICAgZm9ybXVsYVByb3ZpZGVycyA/IDogUmVjb3JkPHN0cmluZywgRm9ybXVsYVByb3ZpZGVyQ29uZmlnPlxuICAgIC8qKlxuICAgICAqIFJlZnJlc2ggZW50aXJlIHJvdyB3aGVuIGEgcmVjb3JkIGNoYW5nZXMgKGB0cnVlYCkgb3IsIGlmIHBvc3NpYmxlLCBvbmx5IHRoZSBjZWxscyBhZmZlY3RlZCAoYGZhbHNlYCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1mdWxsUm93UmVmcmVzaClcbiAgICAgKi9cbiAgICBmdWxsUm93UmVmcmVzaCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEEgRnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIENTUyBjbGFzcyBuYW1lIHRvIGFkZCB0byBhIHJlY3RhbmdsZSBlbGVtZW50LlxuICAgICAqIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgcGFzc2VkOlxuICAgICAqIEBwYXJhbSB7SGlzdG9ncmFtU2VyaWVzfSBzZXJpZXMgVGhlIHNlcmllcyBiZWluZyByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7RG9tQ29uZmlnfSBkb21Db25maWcgVGhlIHJlY3RhbmdsZSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkYXR1bSBUaGUgZGF0dW0gYmVpbmcgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBkYXR1bSBiZWluZyByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7SGlzdG9ncmFtUmVuZGVyRGF0YX0gcmVuZGVyRGF0YSBDdXJyZW50IHJlbmRlciBkYXRhIGdpdmluZyBhY2Nlc3MgdG8gdGhlIHJlY29yZCwgcm93IGFuZCBjZWxsIGJlaW5nIHJlbmRlcmVkLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IENTUyBjbGFzc2VzIG9mIHRoZSByZWN0YW5nbGUgZWxlbWVudFxuICAgICAqL1xuICAgIGdldEJhckNsYXNzID8gOiAoc2VyaWVzOiBIaXN0b2dyYW1TZXJpZXMsIGRvbUNvbmZpZzogRG9tQ29uZmlnLCBkYXR1bTogb2JqZWN0LCBpbmRleDogbnVtYmVyLCByZW5kZXJEYXRhOiBIaXN0b2dyYW1SZW5kZXJEYXRhKSA9PiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIEZ1bmN0aW9uIHdoaWNoIGlmIHByb3ZpZGVkIHNob3VsZCByZXR1cm4gYSBET00gY29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGEgYmFyXG4gICAgICogKGEgYFJFQ1RgIGVsZW1lbnQgcmVwcmVzZW50aW5nIGEgc2luZ2xlIFwiYmFyXCItdHlwZSB2YWx1ZSkuXG4gICAgICogVGhlIGZ1bmN0aW9uIGlzIHBhc3NlZCBhIGRlZmF1bHQgcHJlcGFyZWQgRE9NIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBpbiBhbiBhcmd1bWVudCB3aGljaCB0aGVuIGNhbiBiZSBwcm9jZXNzZWQgYW5kIHJldHVybmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctZ2V0QmFyRE9NQ29uZmlnKVxuICAgICAqIEBwYXJhbSB7SGlzdG9ncmFtU2VyaWVzfSBzZXJpZXMgVGhlIHNlcmllcyBiZWluZyByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7RG9tQ29uZmlnfSBkb21Db25maWcgVGhlIHJlY3RhbmdsZSBET00gY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0dW0gVGhlIGRhdHVtIGJlaW5nIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZGF0dW0gYmVpbmcgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge0hpc3RvZ3JhbVJlbmRlckRhdGF9IHJlbmRlckRhdGEgQ3VycmVudCByZW5kZXIgZGF0YSBnaXZpbmcgYWNjZXNzIHRvIHRoZSByZWNvcmQsIHJvdyBhbmQgY2VsbCBiZWluZyByZW5kZXJlZC5cbiAgICAgKiBAcmV0dXJucyB7b2JqZWN0fSBSZXN1bHRpbmcgRE9NIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiBJZiBubyB2YWx1ZSByZXR1cm5lZCB0aGUgYmFyIGlzIG5vdCBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgZ2V0QmFyRE9NQ29uZmlnID8gOiAoc2VyaWVzOiBIaXN0b2dyYW1TZXJpZXMsIGRvbUNvbmZpZzogRG9tQ29uZmlnLCBkYXR1bTogb2JqZWN0LCBpbmRleDogbnVtYmVyLCByZW5kZXJEYXRhOiBIaXN0b2dyYW1SZW5kZXJEYXRhKSA9PiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBBIEZ1bmN0aW9uIHdoaWNoIHJldHVybnMgdGhlIHRleHQgdG8gcmVuZGVyIGluc2lkZSBhIGJhci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWdldEJhclRleHQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRhdHVtIFRoZSBkYXR1bSBiZWluZyByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGRhdHVtIGJlaW5nIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtIaXN0b2dyYW1TZXJpZXN9IHNlcmllcyBUaGUgc2VyaWVzIChwcm92aWRlZCBpZiBoaXN0b2dyYW0gd2lkZ2V0IFtzaW5nbGVUZXh0Rm9yQWxsQmFyc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvZ3JhcGgvSGlzdG9ncmFtI2NvbmZpZy1zaW5nbGVUZXh0Rm9yQWxsQmFycykgaXMgYGZhbHNlYClcbiAgICAgKiBAcGFyYW0ge0hpc3RvZ3JhbVJlbmRlckRhdGF9IHJlbmRlckRhdGEgQ3VycmVudCByZW5kZXIgZGF0YSBnaXZpbmcgYWNjZXNzIHRvIHRoZSByZWNvcmQsIHJvdyBhbmQgY2VsbCBiZWluZyByZW5kZXJlZC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUZXh0IHRvIHJlbmRlciBpbnNpZGUgdGhlIGJhclxuICAgICAqL1xuICAgIGdldEJhclRleHQgPyA6IChkYXR1bTogb2JqZWN0LCBpbmRleDogbnVtYmVyLCBzZXJpZXM6IEhpc3RvZ3JhbVNlcmllcywgcmVuZGVyRGF0YTogSGlzdG9ncmFtUmVuZGVyRGF0YSkgPT4gc3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBGdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgRE9NIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0ZXh0IGVsZW1lbnRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctZ2V0QmFyVGV4dERPTUNvbmZpZylcbiAgICAgKiBAcGFyYW0ge0RvbUNvbmZpZ30gZG9tQ29uZmlnIFRoZSBgVEVYVGAgZWxlbWVudCBET00gY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGF0dW0gVGhlIGRhdHVtIGJlaW5nIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZGF0dW0gYmVpbmcgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge0hpc3RvZ3JhbVNlcmllc30gc2VyaWVzIFRoZSBzZXJpZXMgKHByb3ZpZGVkIGlmIGhpc3RvZ3JhbSB3aWRnZXQgW3NpbmdsZVRleHRGb3JBbGxCYXJzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9ncmFwaC9IaXN0b2dyYW0jY29uZmlnLXNpbmdsZVRleHRGb3JBbGxCYXJzKSBpcyBgZmFsc2VgKVxuICAgICAqIEBwYXJhbSB7SGlzdG9ncmFtUmVuZGVyRGF0YX0gcmVuZGVyRGF0YSBDdXJyZW50IHJlbmRlciBkYXRhIGdpdmluZyBhY2Nlc3MgdG8gdGhlIHJlY29yZCwgcm93IGFuZCBjZWxsIGJlaW5nIHJlbmRlcmVkLlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBgVEVYVGAgZWxlbWVudCBET00gY29uZmlndXJhdGlvbiBvYmplY3QuIElmIG5vIHZhbHVlIHJldHVybmVkIHRoZSB0ZXh0IGVsZW1lbnQgaXMgbm90IGRpc3BsYXllZC5cbiAgICAgKi9cbiAgICBnZXRCYXJUZXh0RE9NQ29uZmlnID8gOiAoZG9tQ29uZmlnOiBEb21Db25maWcsIGRhdHVtOiBvYmplY3QsIGluZGV4OiBudW1iZXIsIHNlcmllczogSGlzdG9ncmFtU2VyaWVzLCByZW5kZXJEYXRhOiBIaXN0b2dyYW1SZW5kZXJEYXRhKSA9PiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB0aGF0IGV4dHJhY3RzIGEgcmVjb3JkIGhpc3RvZ3JhbSBkYXRhIGVudHJ5IGZvciBhZ2dyZWdhdGluZy5cbiAgICAgKiBCeSBkZWZhdWx0IGl0IHJldHVybnMgdGhlIGVudHJ5IGFzIGlzLiBPdmVycmlkZSB0aGUgZnVuY3Rpb24gaWYgeW91IG5lZWQgYSBtb3JlIGNvbXBsZXggd2F5XG4gICAgICogdG8gcmV0cmlldmUgdGhlIHZhbHVlIGZvciBhZ2dyZWdhdGluZy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWdldERhdGFFbnRyeUZvckFnZ3JlZ2F0aW5nKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBnZXREYXRhRW50cnlGb3JBZ2dyZWdhdGluZy5lbnRyeSBDdXJyZW50IGRhdGEgZW50cnkuXG4gICAgICogQHJldHVybnMge29iamVjdH0gRW50cnkgdG8gYWdncmVnYXRlXG4gICAgICovXG4gICAgZ2V0RGF0YUVudHJ5Rm9yQWdncmVnYXRpbmcgPyA6ICgoZ2V0RGF0YUVudHJ5Rm9yQWdncmVnYXRpbmc6IHsgZW50cnk6IG9iamVjdCB9KSA9PiBvYmplY3QpfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgRnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIENTUyBjbGFzcyBuYW1lIHRvIGFkZCB0byBhIHBhdGggZWxlbWVudFxuICAgICAqIGJ1aWx0IGZvciBhbiBgb3V0bGluZWAgdHlwZSBzZXJpZXMuXG4gICAgICogVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQ6XG4gICAgICogQHBhcmFtIHtIaXN0b2dyYW1TZXJpZXN9IHNlcmllcyBUaGUgc2VyaWVzIGJlaW5nIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtvYmplY3RbXX0gZGF0YSBUaGUgc2VyaWVzIGRhdGFcbiAgICAgKiBAcGFyYW0ge0hpc3RvZ3JhbVJlbmRlckRhdGF9IHJlbmRlckRhdGEgQ3VycmVudCByZW5kZXIgZGF0YSBnaXZpbmcgYWNjZXNzIHRvIHRoZSByZWNvcmQsIHJvdyBhbmQgY2VsbCBiZWluZyByZW5kZXJlZC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDU1MgY2xhc3MgbmFtZSBvZiB0aGUgcGF0aCBlbGVtZW50XG4gICAgICovXG4gICAgZ2V0T3V0bGluZUNsYXNzID8gOiAoc2VyaWVzOiBIaXN0b2dyYW1TZXJpZXMsIGRhdGE6IG9iamVjdFtdLCByZW5kZXJEYXRhOiBIaXN0b2dyYW1SZW5kZXJEYXRhKSA9PiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIEZ1bmN0aW9uIHdoaWNoIGlmIHByb3ZpZGVkIHNob3VsZCByZXR1cm4gYSBET00gY29uZmlndXJhdGlvbiBvYmplY3QgZm9yXG4gICAgICogYSBgcGF0aGAgZWxlbWVudCBidWlsdCBmb3IgYW4gYG91dGxpbmVgIHR5cGUgc2VyaWVzLlxuICAgICAqIFRoZSBmdW5jdGlvbiBhY2NlcHRzIGEgZGVmYXVsdCBwcmVwYXJlZCBET00gY29uZmlndXJhdGlvblxuICAgICAqIGluIGFuIGFyZ3VtZW50IHdoaWNoIHRoZW4gY2FuIGJlIHByb2Nlc3NlZCBhbmQgcmV0dXJuZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1nZXRPdXRsaW5lRE9NQ29uZmlnKVxuICAgICAqIEBwYXJhbSB7SGlzdG9ncmFtU2VyaWVzfSBzZXJpZXMgVGhlIHNlcmllcyBiZWluZyByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7RG9tQ29uZmlnfSBkb21Db25maWcgVGhlIGBwYXRoYCBlbGVtZW50IERPTSBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0W119IGRhdGEgVGhlIHNlcmllcyBkYXRhXG4gICAgICogQHJldHVybnMge29iamVjdH0gUmVzdWx0aW5nIERPTSBjb25maWd1cmF0aW9uIG9iamVjdC4gSWYgbm8gdmFsdWUgcmV0dXJuZWQgdGhlIHBhdGggaXMgbm90IGRpc3BsYXllZC5cbiAgICAgKi9cbiAgICBnZXRPdXRsaW5lRE9NQ29uZmlnID8gOiAoc2VyaWVzOiBIaXN0b2dyYW1TZXJpZXMsIGRvbUNvbmZpZzogRG9tQ29uZmlnLCBkYXRhOiBvYmplY3RbXSkgPT4gb2JqZWN0XG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiwgb3IgbmFtZSBvZiBhIGZ1bmN0aW9uIHdoaWNoIGJ1aWxkcyBoaXN0b2dyYW0gZGF0YSBmb3IgdGhlIHByb3ZpZGVkIHJlY29yZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWdldFJlY29yZERhdGEpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGdldFJlY29yZERhdGEucmVjb3JkIFJlY29yZCB0byBnZXQgaGlzdG9ncmFtIGRhdGEgZm9yLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBhZ2dyZWdhdGlvbkNvbnRleHQgQ29udGV4dCBvYmplY3QgcGFzc2VkIGluIGNhc2UgdGhlIGRhdGEgaXMgYmVpbmcgcmV0cmlldmVkIGFzIGEgcGFydCBvZiBzb21lIHBhcmVudCByZWNvcmQgZGF0YSBjb2xsZWN0aW5nLlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IEhpc3RvZ3JhbSBkYXRhLlxuICAgICAqL1xuICAgIGdldFJlY29yZERhdGEgPyA6ICgoZ2V0UmVjb3JkRGF0YTogeyByZWNvcmQ6IE1vZGVsIH0sIGFnZ3JlZ2F0aW9uQ29udGV4dD86IG9iamVjdCkgPT4gb2JqZWN0KXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIGNhbGxlZCBmb3IgZWFjaCByb3cgdG8gZGV0ZXJtaW5lIGl0cyBoZWlnaHQuIEl0IGlzIHBhc3NlZCBhIFtyZWNvcmRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvZGF0YS9Nb2RlbCkgYW5kXG4gICAgICogZXhwZWN0ZWQgdG8gcmV0dXJuIHRoZSBkZXNpcmVkIGhlaWdodCBvZiB0aGF0IHJlY29yZHMgcm93LiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIGZhbHN5IHZhbHVlLCBHcmlkc1xuICAgICAqIGNvbmZpZ3VyZWQgW3Jvd0hlaWdodF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1yb3dIZWlnaHQpIGlzIHVzZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1nZXRSb3dIZWlnaHQpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGdldFJvd0hlaWdodC5yZWNvcmQgUmVjb3JkIHRvIGRldGVybWluZSByb3cgaGVpZ2h0IGZvclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IERlc2lyZWQgcm93IGhlaWdodFxuICAgICAqL1xuICAgIGdldFJvd0hlaWdodCA/IDogKGdldFJvd0hlaWdodDogeyByZWNvcmQ6IE1vZGVsIH0pID0+IG51bWJlclxuICAgIC8qKlxuICAgICAqIFdoZW4gc2V0IHRvIGB0cnVlYCAoZGVmYXVsdCkgdGhlIGNvbXBvbmVudCByZWFjdHMgb24gdGltZSBheGlzIGNoYW5nZXNcbiAgICAgKiAoem9vbWluZyBvciBjaGFuZ2luZyB0aGUgZGlzcGxheWVkIHRpbWUgc3BhbiksIGNsZWFycyB0aGUgaGlzdG9ncmFtIGRhdGEgY2FjaGUgb2YgdGhlIHJlY29yZHNcbiAgICAgKiBhbmQgdGhlbiByZWZyZXNoZXMgdGhlIHZpZXcuXG4gICAgICovXG4gICAgaGFyZFJlZnJlc2hPblRpbWVBeGlzUmVjb25maWd1cmUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZyBbb2JqZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCN0eXBlZGVmLVBhbmVsSGVhZGVyKSBmb3IgdGhlIHBhbmVsJ3MgaGVhZGVyIG9yIGEgc3RyaW5nIGluIHBsYWNlIG9mIGEgYHRpdGxlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWhlYWRlcilcbiAgICAgKi9cbiAgICBoZWFkZXIgPyA6IHN0cmluZ3xib29sZWFufFBhbmVsSGVhZGVyXG4gICAgLyoqXG4gICAgICogV2lkZ2V0J3MgaGVpZ2h0LCB1c2VkIHRvIHNldCBlbGVtZW50IGBzdHlsZS5oZWlnaHRgLiBFaXRoZXIgc3BlY2lmeSBhIHZhbGlkIGhlaWdodCBzdHJpbmcgb3IgYSBudW1iZXIsXG4gICAgICogd2hpY2ggd2lsbCBnZXQgJ3B4JyBhcHBlbmRlZC4gV2UgcmVjb21tZW5kIHVzaW5nIENTUyBhcyB0aGUgcHJpbWFyeSB3YXkgdG8gY29udHJvbCBoZWlnaHQsIGJ1dCBpbiBzb21lXG4gICAgICogY2FzZXMgdGhpcyBjb25maWcgaXMgY29udmVuaWVudC5cbiAgICAgKi9cbiAgICBoZWlnaHQgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgd2l0aCB0cnVlIHRvIG1ha2Ugd2lkZ2V0IGluaXRpYWxseSBoaWRkZW4uXG4gICAgICovXG4gICAgaGlkZGVuID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBoaWRlIHRoZSBmb290ZXIgZWxlbWVudHNcbiAgICAgKi9cbiAgICBoaWRlRm9vdGVycyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gaGlkZSB0aGUgY29sdW1uIGhlYWRlciBlbGVtZW50c1xuICAgICAqL1xuICAgIGhpZGVIZWFkZXJzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBoaWRlIHRoZSBHcmlkJ3MgaG9yaXpvbnRhbCBzY3JvbGxiYXIocylcbiAgICAgKi9cbiAgICBoaWRlSG9yaXpvbnRhbFNjcm9sbGJhciA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHJvdyBob3ZlciBlZmZlY3QgaXMgbm90IHZpc2libGUgaW4gdGhlIFNjaGVkdWxlciBwYXJ0IG9mIHRoZSBncmlkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctaGlkZVJvd0hvdmVyKVxuICAgICAqL1xuICAgIGhpZGVSb3dIb3ZlciA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9yIGEgY29uZmlndXJhdGlvbiBvYmplY3Qgb2YgdGhlIHVuZGVybHlpbmcgW0hpc3RvZ3JhbV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvZ3JhcGgvSGlzdG9ncmFtKVxuICAgICAqIGNvbXBvbmVudCB0aGF0IGlzIHVzZWQgdW5kZXIgdGhlIGhvb2QgdG8gcmVuZGVyIGFjdHVhbCBjaGFydHMuXG4gICAgICogSW4gY2FzZSBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlzIHByb3ZpZGVkIHRoZSBidWlsdCBjbGFzcyBpcyBkZWZpbmVkIHdpdGhcbiAgICAgKiBbaGlzdG9ncmFtV2lkZ2V0Q2xhc3NdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtQmFzZSNjb25maWctaGlzdG9ncmFtV2lkZ2V0Q2xhc3MpIGNvbmZpZy5cbiAgICAgKi9cbiAgICBoaXN0b2dyYW1XaWRnZXQgPyA6IEhpc3RvZ3JhbXxIaXN0b2dyYW1Db25maWdcbiAgICAvKipcbiAgICAgKiBUaGUgY2xhc3MgdXNlZCBmb3IgYnVpbGRpbmcgdGhlIFtoaXN0b2dyYW0gd2lkZ2V0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbUJhc2UjcHJvcGVydHktaGlzdG9ncmFtV2lkZ2V0KVxuICAgICAqL1xuICAgIGhpc3RvZ3JhbVdpZGdldENsYXNzID8gOiBIaXN0b2dyYW1cbiAgICAvKipcbiAgICAgKiBBIENTUyBjbGFzcyB0byBhZGQgdG8gaG92ZXJlZCByb3cgZWxlbWVudHNcbiAgICAgKi9cbiAgICBob3ZlckNscyA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQW4gaWNvbiB0byBzaG93IGJlZm9yZSB0aGUgW3RpdGxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctdGl0bGUpLiBFaXRoZXIgcGFzcyBhIENTUyBjbGFzcyBhcyBhIHN0cmluZywgb3IgcGFzcyBhXG4gICAgICogW0RvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRG9tSGVscGVyI3R5cGVkZWYtRG9tQ29uZmlnKSBvYmplY3QgZGVzY3JpYmluZyBhbiBlbGVtZW50IHRvIHJlcHJlc2VudCB0aGUgaWNvbi5cbiAgICAgKi9cbiAgICBpY29uID8gOiBzdHJpbmd8RG9tQ29uZmlnXG4gICAgLyoqXG4gICAgICogV2lkZ2V0IGlkLCBpZiBub3Qgc3BlY2lmaWVkIG9uZSB3aWxsIGJlIGdlbmVyYXRlZC4gQWxzbyB1c2VkIGZvciBsb29rdXBzIHRocm91Z2ggV2lkZ2V0LmdldEJ5SWRcbiAgICAgKi9cbiAgICBpZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBpZ25vcmUgcmVhY3RpbmcgdG8gRE9NIGV2ZW50cyAobW91c2VvdmVyL21vdXNlb3V0IGV0Yykgd2hpbGUgc2Nyb2xsaW5nLiBVc2VmdWwgaWYgeW91XG4gICAgICogd2FudCB0byBtYXhpbWl6ZSBzY3JvbGwgcGVyZm9ybWFuY2UuXG4gICAgICovXG4gICAgaWdub3JlRG9tRXZlbnRzV2hpbGVTY3JvbGxpbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB3aWRnZXRzIHJlYWQtb25seSBzdGF0ZSBzaG91bGQgYmUgY29udHJvbGxlZCBieSBpdHMgcGFyZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctaWdub3JlUGFyZW50UmVhZE9ubHkpXG4gICAgICovXG4gICAgaWdub3JlUGFyZW50UmVhZE9ubHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRoZSBwYW5lbCB0aW1lc3BhbiBkdXJpbmcgc2Nyb2xsaW5nIGluIHRoZSB0aW1lIGRpbWVuc2lvbixcbiAgICAgKiB3aGVuIHRoZSBzY3JvbGxlciBjb21lcyBjbG9zZSB0byB0aGUgc3RhcnQvZW5kIGVkZ2VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctaW5maW5pdGVTY3JvbGwpXG4gICAgICovXG4gICAgaW5maW5pdGVTY3JvbGwgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgYSB0YXJnZXQgZ3JvdXAgcmVjb3JkIGVudHJ5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctaW5pdEFnZ3JlZ2F0ZWREYXRhRW50cnkpXG4gICAgICogQHJldHVybnMge29iamVjdH0gVGFyZ2V0IGFnZ3JlZ2F0ZWQgZW50cnlcbiAgICAgKi9cbiAgICBpbml0QWdncmVnYXRlZERhdGFFbnRyeSA/IDogKCgpID0+IG9iamVjdCl8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byBhbGlnbiBpbnB1dCBmaWVsZHMgb2YgY2hpbGQgd2lkZ2V0cy4gQnkgZGVmYXVsdCwgdGhlIEZpZWxkIGlucHV0IGVsZW1lbnQgaXNcbiAgICAgKiBwbGFjZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBgbGFiZWxgLiBJZiB5b3UgcHJlZmVyIHRvIGhhdmUgYWxsIGlucHV0IGZpZWxkcyBhbGlnbmVkIHRvIHRoZVxuICAgICAqIHJpZ2h0LCBzZXQgdGhpcyBjb25maWcgdG8gYCdlbmQnYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWlucHV0RmllbGRBbGlnbilcbiAgICAgKi9cbiAgICBpbnB1dEZpZWxkQWxpZ24gPyA6ICdzdGFydCd8J2VuZCdcbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciBlbGVtZW50IGlkKSB0byBpbnNlcnQgdGhpcyB3aWRnZXQgYmVmb3JlLiBJZiBwcm92aWRlZCwgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgaXMgaWdub3JlZC5cbiAgICAgKi9cbiAgICBpbnNlcnRCZWZvcmUgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIGVsZW1lbnQgaWQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCBlbGVtZW50IHRvLCBhcyBhIGZpcnN0IGNoaWxkLiBJZiBwcm92aWRlZCwgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgaXMgaWdub3JlZC5cbiAgICAgKi9cbiAgICBpbnNlcnRGaXJzdCA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogU2VlIFtLZXlib2FyZCBzaG9ydGN1dHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2tleWJvYXJkLXNob3J0Y3V0cykgZm9yIGRldGFpbHNcbiAgICAgKi9cbiAgICBrZXlNYXAgPyA6IFJlY29yZDxzdHJpbmcsIEtleU1hcENvbmZpZz5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBzZXR0aW5nIHRvIHVzZSBzYW1lIGxhYmVsIHBsYWNlbWVudCBvbiBhbGwgY2hpbGQgd2lkZ2V0cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWxhYmVsUG9zaXRpb24pXG4gICAgICovXG4gICAgbGFiZWxQb3NpdGlvbiA/IDogJ2JlZm9yZSd8J2Fib3ZlJ3wnYWxpZ24tYmVmb3JlJ3wnYXV0byd8bnVsbFxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0ZW5lciBzZXQgZm9yIHRoaXMgb2JqZWN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctbGlzdGVuZXJzKVxuICAgICAqL1xuICAgIGxpc3RlbmVycyA/IDogVGltZWxpbmVIaXN0b2dyYW1MaXN0ZW5lcnNcbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LCBvciBhIG1lc3NhZ2UgdG8gYmUgc2hvd24gd2hlbiBhIHN0b3JlIGlzIHBlcmZvcm1pbmcgYSByZW1vdGVcbiAgICAgKiBvcGVyYXRpb24sIG9yIENydWQgTWFuYWdlciBpcyBsb2FkaW5nIGRhdGEgZnJvbSB0aGUgc2V2ZXIuIFNldCB0byBgbnVsbGAgdG8gZGlzYWJsZSBkZWZhdWx0IGxvYWQgbWFzay5cbiAgICAgKi9cbiAgICBsb2FkTWFzayA/IDogc3RyaW5nfE1hc2tDb25maWd8bnVsbFxuICAgIC8qKlxuICAgICAqIEEgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L01hc2spIGNvbmZpZyBvYmplY3QgdG8gYWRqdXN0IHRoZSBbbWFza0RlZmF1bHRzXSgjQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1tYXNrRGVmYXVsdHMpXG4gICAgICogd2hlbiBkYXRhIGlzIGxvYWRpbmcuIFRoZSBtZXNzYWdlIGFuZCBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZyb20gdGhlXG4gICAgICogW2xvYWRNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL21peGluL0xvYWRNYXNrYWJsZSNjb25maWctbG9hZE1hc2spIGNvbmZpZyB0YWtlIHByaW9yaXR5IG92ZXIgdGhlc2Ugb3B0aW9ucywganVzdCBhcyB0aGV5IGRvXG4gICAgICogZm9yIGBtYXNrRGVmYXVsdHNgLCByZXNwZWN0aXZlbHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1sb2FkTWFza0RlZmF1bHRzKVxuICAgICAqL1xuICAgIGxvYWRNYXNrRGVmYXVsdHMgPyA6IE1hc2tDb25maWdcbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0IHRvIGFkanVzdCB0aGUgW21hc2tEZWZhdWx0c10oI0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctbWFza0RlZmF1bHRzKVxuICAgICAqIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGxvYWRpbmcgZGF0YS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLWxvYWRNYXNrRXJyb3IpXG4gICAgICovXG4gICAgbG9hZE1hc2tFcnJvciA/IDogTWFza0NvbmZpZ3xNYXNrfGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIGxvY2FsaXphdGlvbiBvZiB0aGlzIG9iamVjdC5cbiAgICAgKi9cbiAgICBsb2NhbGl6YWJsZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRpbWUgaW4gbXMgdW50aWwgYSBsb25ncHJlc3MgaXMgdHJpZ2dlcmVkXG4gICAgICovXG4gICAgbG9uZ1ByZXNzVGltZSA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGV2ZW50cyBhcmUgc2l6ZWQgYW5kIHBvc2l0aW9uZWQgYmFzZWQgb24gcm93SGVpZ2h0LCByZXNvdXJjZU1hcmdpbiBhbmQgYmFyTWFyZ2luIHNldHRpbmdzLlxuICAgICAqIFNldCB0aGlzIHRvIGBmYWxzZWAgaWYgeW91IHdhbnQgdG8gY29udHJvbCBoZWlnaHQgYW5kIHZlcnRpY2FsIHBvc2l0aW9uIHVzaW5nIENTUyBpbnN0ZWFkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctbWFuYWdlZEV2ZW50U2l6aW5nKVxuICAgICAqL1xuICAgIG1hbmFnZWRFdmVudFNpemluZyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIG1hcmdpbi4gVGhpcyBtYXkgYmUgY29uZmlndXJlZCBhcyBhIHNpbmdsZSBudW1iZXIgb3IgYSBgVFJCTGAgZm9ybWF0IHN0cmluZy5cbiAgICAgKiBudW1lcmljLW9ubHkgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBwaXhlbHMuXG4gICAgICovXG4gICAgbWFyZ2luID8gOiBudW1iZXJ8c3RyaW5nXG4gICAgLyoqXG4gICAgICogR3JpZHMgY2hhbmdlIHRoZSBgbWFza0RlZmF1bHRzYCB0byBjb3ZlciBvbmx5IHRoZWlyIGBib2R5YCBlbGVtZW50LlxuICAgICAqL1xuICAgIG1hc2tEZWZhdWx0cyA/IDogTWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gYXBwbHkgdGhlIGRlZmF1bHQgbWFzayB0byB0aGUgd2lkZ2V0LiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNhbiBiZSB0aGUgbWFzayBtZXNzYWdlIG9yIGFcbiAgICAgKiBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY29uZmlnIG9iamVjdC5cbiAgICAgKi9cbiAgICBtYXNrZWQgPyA6IGJvb2xlYW58c3RyaW5nfE1hc2tDb25maWdcbiAgICAvKipcbiAgICAgKiBHZXQvc2V0IGVuZCBkYXRlIGxpbWl0IG9mIHRoZSB0aW1lbGluZS5cbiAgICAgKiBBY3Rpb25zIHN1Y2ggYXMgdGltZWxpbmUgc2Nyb2xsaW5nLCBhbGwgdHlwZXMgb2YgdGltZWxpbmUgem9vbXMgYW5kIHNoaWZ0c1xuICAgICAqIHdpbGwgcmVzcGVjdCB0aGlzIGxpbWl0LlxuICAgICAqL1xuICAgIG1heERhdGUgPyA6IERhdGV8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnQncyBtYXhIZWlnaHQuIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbaGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWhlaWdodCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1heEhlaWdodCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIHRpbWUgYXhpcyB1bml0IHRvIGRpc3BsYXkgbm9uLXdvcmtpbmcgcmFuZ2VzIGZvciAoJ2hvdXInIG9yICdkYXknIGV0YykuXG4gICAgICogV2hlbiB6b29taW5nIHRvIGEgdmlldyB3aXRoIGEgbGFyZ2VyIHVuaXQsIG5vIG5vbi13b3JraW5nIHRpbWUgZWxlbWVudHMgd2lsbCBiZSByZW5kZXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLW1heFRpbWVBeGlzVW5pdClcbiAgICAgKi9cbiAgICBtYXhUaW1lQXhpc1VuaXQgPyA6IER1cmF0aW9uVW5pdFxuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50cyBtYXhXaWR0aC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFt3aWR0aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1heFdpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gem9vbSBsZXZlbCB0byB3aGljaCBbem9vbUluXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9taXhpbi9UaW1lbGluZVpvb21hYmxlI2Z1bmN0aW9uLXpvb21Jbikgd2lsbCB3b3JrLiBEZWZhdWx0cyB0byB0aGUgbnVtYmVyIG9mXG4gICAgICogW1ZpZXdQcmVzZXRzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvcHJlc2V0L1ZpZXdQcmVzZXQpIGF2YWlsYWJsZSwgc2VlIFtwcmVzZXRzXSgjU2NoZWR1bGVyL3ZpZXcvbWl4aW4vVGltZWxpbmVWaWV3UHJlc2V0cyNwcm9wZXJ0eS1wcmVzZXRzKVxuICAgICAqIGZvciBpbmZvcm1hdGlvbi4gVW5sZXNzIHlvdSBoYXZlIG1vZGlmaWVkIHRoZSBjb2xsZWN0aW9uIG9mIGF2YWlsYWJsZSBwcmVzZXRzLCB0aGUgbWF4IHpvb20gbGV2ZWwgaXNcbiAgICAgKiBtaWxsaXNlY29uZHMuXG4gICAgICovXG4gICAgbWF4Wm9vbUxldmVsID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBHZXQvc2V0IHN0YXJ0IGRhdGUgbGltaXQgb2YgdGhlIHRpbWVsaW5lLlxuICAgICAqIEFjdGlvbnMgc3VjaCBhcyB0aW1lbGluZSBzY3JvbGxpbmcsIGFsbCB0eXBlcyBvZiB0aW1lbGluZSB6b29tcyBhbmQgc2hpZnRzXG4gICAgICogd2lsbCByZXNwZWN0IHRoaXMgbGltaXQuXG4gICAgICovXG4gICAgbWluRGF0ZSA/IDogRGF0ZXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBHcmlkJ3MgYG1pbi1oZWlnaHRgLiBEZWZhdWx0cyB0byBgMTBlbWAgdG8gYmUgc3VyZSB0aGF0IHRoZSBHcmlkIGFsd2F5cyBoYXMgYSBoZWlnaHQgd2hlcmV2ZXIgaXQgaXNcbiAgICAgKiBpbnNlcnRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLW1pbkhlaWdodClcbiAgICAgKi9cbiAgICBtaW5IZWlnaHQgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudHMgbWluV2lkdGguIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbd2lkdGhdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctd2lkdGgpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtaW5XaWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHpvb20gbGV2ZWwgdG8gd2hpY2ggW3pvb21PdXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L21peGluL1RpbWVsaW5lWm9vbWFibGUjZnVuY3Rpb24tem9vbU91dCkgd2lsbCB3b3JrLiBEZWZhdWx0cyB0byAwICh5ZWFyIHRpY2tzKVxuICAgICAqL1xuICAgIG1pblpvb21MZXZlbCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogR3JpZCBtb25pdG9ycyB3aW5kb3cgcmVzaXplIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgbW9uaXRvclJlc2l6ZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSBvd25pbmcgV2lkZ2V0IG9mIHRoaXMgV2lkZ2V0LiBJZiB0aGlzIFdpZGdldCBpcyBkaXJlY3RseSBjb250YWluZWQgKHRoYXQgaXMsIGl0IGlzIG9uZSBvZiB0aGVcbiAgICAgKiBbaXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciNwcm9wZXJ0eS1pdGVtcykgb2YgYSBDb250YWluZXIpLCB0aGlzIGNvbmZpZyB3aWxsIGJlIGlnbm9yZWQuIEluIHRoaXMgY2FzZVxuICAgICAqIHRoZSBvd25lciBpcyA8c3Ryb25nPmFsd2F5czwvc3Ryb25nPiB0aGUgZW5jYXBzdWxhdGluZyBDb250YWluZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1vd25lcilcbiAgICAgKi9cbiAgICBvd25lciA/IDogV2lkZ2V0fGFueVxuICAgIC8qKlxuICAgICAqIFBhcnRuZXJzIHRoaXMgVGltZWxpbmUgcGFuZWwgd2l0aCBhbm90aGVyIFRpbWVsaW5lIGluIG9yZGVyIHRvIHN5bmMgdGhlaXIgcmVnaW9uIHNpemVzIChzdWItZ3JpZHMgbGlrZSBsb2NrZWQsIG5vcm1hbCB3aWxsIGdldCB0aGUgc2FtZSB3aWR0aCksXG4gICAgICogc3RhcnQgYW5kIGVuZCBkYXRlcywgdmlldyBwcmVzZXQsIHpvb20gbGV2ZWwgYW5kIHNjcm9sbGluZyBwb3NpdGlvbi4gQWxsIHRoZXNlIHZhbHVlcyB3aWxsIGJlIHN5bmNlZCB3aXRoIHRoZSB0aW1lbGluZSBkZWZpbmVkIGFzIHRoZSBgcGFydG5lcmAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1wYXJ0bmVyKVxuICAgICAqL1xuICAgIHBhcnRuZXIgPyA6IFRpbWVsaW5lQmFzZVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgcGx1Z2lucyAoYW4gYXJyYXkgb2YgY2xhc3NlcykgaW4gY29uZmlnXG4gICAgICovXG4gICAgcGx1Z2lucyA/IDogRnVuY3Rpb25bXVxuICAgIC8qKlxuICAgICAqIFRydWUgdG8gcHJlc2VydmUgZm9jdXNlZCBjZWxsIGFmdGVyIGxvYWRpbmcgbmV3IGRhdGFcbiAgICAgKi9cbiAgICBwcmVzZXJ2ZUZvY3VzT25EYXRhc2V0Q2hhbmdlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogUHJlc2VydmUgdGhlIGdyaWQncyB2ZXJ0aWNhbCBzY3JvbGwgcG9zaXRpb24gd2hlbiBjaGFuZ2VzZXRzIGFyZSBhcHBsaWVkLCBhcyBpbiB0aGUgY2FzZSBvZiByZW1vdGVcbiAgICAgKiBjaGFuZ2VzLCBvciB3aGVuIHN0b3JlcyBhcmUgY29uZmlndXJlZCB3aXRoIFtzeW5jRGF0YU9uTG9hZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlI2NvbmZpZy1zeW5jRGF0YU9uTG9hZCkuXG4gICAgICovXG4gICAgcHJlc2VydmVTY3JvbGwgPyA6IFByZXNlcnZlU2Nyb2xsT3B0aW9uc3xib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgdHJ1ZWAgdG8gcHJlc2VydmUgdmVydGljYWwgc2Nyb2xsIHBvc2l0aW9uIGFmdGVyIHN0b3JlIGFjdGlvbnMgdGhhdCB0cmlnZ2VyIGEgYHJlZnJlc2hgIGV2ZW50LFxuICAgICAqIHN1Y2ggYXMgbG9hZGluZyBuZXcgZGF0YSBhbmQgZmlsdGVyaW5nLlxuICAgICAqL1xuICAgIHByZXNlcnZlU2Nyb2xsT25EYXRhc2V0Q2hhbmdlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgW1ZpZXdQcmVzZXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci9wcmVzZXQvVmlld1ByZXNldCkgY29uZmlnIG9iamVjdHNcbiAgICAgKiB3aGljaCBkZXNjcmliZXMgdGhlIGF2YWlsYWJsZSB0aW1lbGluZSBsYXlvdXRzIGZvciB0aGlzIHNjaGVkdWxlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLXByZXNldHMpXG4gICAgICovXG4gICAgcHJlc2V0cyA/IDogVmlld1ByZXNldENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogUHJldmVudCB0b29sdGlwIGZyb20gYmVpbmcgZGlzcGxheWVkIG9uIHRvdWNoIGRldmljZXMuIFVzZWZ1bCBmb3IgZXhhbXBsZSBmb3IgYnV0dG9ucyB0aGF0IGRpc3BsYXkgYVxuICAgICAqIG1lbnUgb24gY2xpY2sgZXRjLCBzaW5jZSB0aGUgdG9vbHRpcCB3b3VsZCBiZSBkaXNwbGF5ZWQgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgKi9cbiAgICBwcmV2ZW50VG9vbHRpcE9uVG91Y2ggPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIG1ha2UgdGhlIGdyaWQgcmVhZC1vbmx5LCBieSBkaXNhYmxpbmcgYW55IFVJcyBmb3IgbW9kaWZ5aW5nIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1yZWFkT25seSlcbiAgICAgKi9cbiAgICByZWFkT25seSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25maXJtYXRpb24gZGlhbG9nIHNob3duIHdoZW4gYSByZWN1cnJpbmcgZXZlbnQgaXMgZWRpdGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctcmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwKVxuICAgICAqL1xuICAgIHJlY3VycmVuY2VDb25maXJtYXRpb25Qb3B1cCA/IDogUmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwQ29uZmlnfFJlY3VycmVuY2VDb25maXJtYXRpb25Qb3B1cFxuICAgIHJlbGF5U3RvcmVFdmVudHMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSBkZWZhdWx0IGByZW5kaXRpb25gIHRvIGFwcGx5IHRvIGFsbCBjaGlsZCB3aWRnZXRzLCBvciBhIG1hcCBvZiByZW5kaXRpb25zIGtleWVkIGJ5IGNoaWxkIHdpZGdldFxuICAgICAqIGB0eXBlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLXJlbmRpdGlvbilcbiAgICAgKi9cbiAgICByZW5kaXRpb24gPyA6IHN0cmluZ3xSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fG51bGxcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgdGhpcyBwcm9wZXJ0eSB0byBhbGxvdyB0aGUgd2lkZ2V0L2NvbXBvbmVudCB0byBiZSByZXNpemVkLiBQcmVzc2luZyA8a2JkPlNoaWZ0PC9rYmQ+IHdoaWxlIHJlc2l6aW5nIHdpbGxcbiAgICAgKiBjb25zdHJhaW4gdGhlIGFzcGVjdCByYXRpby5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLXJlc2l6YWJsZSlcbiAgICAgKi9cbiAgICByZXNpemFibGUgPyA6IGJvb2xlYW58e1xuICAgICAgICBtaW5XaWR0aD86IG51bWJlclxuICAgICAgICBtYXhXaWR0aD86IG51bWJlclxuICAgICAgICBtaW5IZWlnaHQ/OiBudW1iZXJcbiAgICAgICAgbWF4SGVpZ2h0PzogbnVtYmVyXG4gICAgICAgIGhhbmRsZXM/OiBvYmplY3RcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gb25seSBtZWFzdXJlIGNlbGwgY29udGVudHMgd2hlbiBkb3VibGUtY2xpY2tpbmcgdGhlIGVkZ2UgYmV0d2VlbiBjb2x1bW4gaGVhZGVycy5cbiAgICAgKi9cbiAgICByZXNpemVUb0ZpdEluY2x1ZGVzSGVhZGVyID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQW4gZW1wdHkgZnVuY3Rpb24gYnkgZGVmYXVsdCwgYnV0IHByb3ZpZGVkIHNvIHRoYXQgeW91IGNhbiBvdmVycmlkZSBpdC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZWFjaCB0aW1lXG4gICAgICogYSByZXNvdXJjZSB0aW1lIHJhbmdlIGlzIHJlbmRlcmVkIGludG8gdGhlIHNjaGVkdWxlLiBJdCdzIGNhbGxlZCB3aXRoIGByZXNvdXJjZVRpbWVSYW5nZVJlY29yZGAsIGByZXNvdXJjZVJlY29yZGAsXG4gICAgICogYW5kIGByZW5kZXJEYXRhYCBwYXJhbXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1yZXNvdXJjZVRpbWVSYW5nZVJlbmRlcmVyKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byByZW5kZXIgYSBSZXNvdXJjZVRpbWVSYW5nZU1vZGVsLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlVGltZVJhbmdlTW9kZWx9IGRldGFpbC5yZXNvdXJjZVRpbWVSYW5nZVJlY29yZCBUaGUgcmVzb3VyY2UgdGltZSByYW5nZSByZWNvcmQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZGV0YWlsLnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSByZWNvcmQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhIEFuIG9iamVjdCBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIGV2ZW50IHJlbmRlcmluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nLERvbUNvbmZpZyxEb21Db25maWdbXX0gQSBzaW1wbGUgc3RyaW5nLCBvciBhIERvbUNvbmZpZyBvYmplY3QgZGVzY3JpYmluZyB0aGUgbWFya3VwXG4gICAgICovXG4gICAgcmVzb3VyY2VUaW1lUmFuZ2VSZW5kZXJlciA/IDogKGRldGFpbDogeyByZXNvdXJjZVRpbWVSYW5nZVJlY29yZDogUmVzb3VyY2VUaW1lUmFuZ2VNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIHJlbmRlckRhdGE6IG9iamVjdCB9KSA9PiBzdHJpbmd8RG9tQ29uZmlnfERvbUNvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogXCJCcmVhayBwb2ludHNcIiBmb3Igd2hpY2ggcmVzcG9uc2l2ZSBjb25maWcgdG8gdXNlIGZvciBjb2x1bW5zIGFuZCBjc3MuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1yZXNwb25zaXZlTGV2ZWxzKVxuICAgICAqL1xuICAgIHJlc3BvbnNpdmVMZXZlbHMgPyA6IFJlY29yZDxzdHJpbmcsIG51bWJlcnxzdHJpbmd8UmVzcG9uc2l2ZUxldmVsQ29uZmlnPlxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gaGF2ZSB0aGUgY29tcG9uZW50IGRpc3BsYXkgYSB0cmFuc2x1Y2VudCByaXBwbGUgd2hlbiBpdHNcbiAgICAgKiBbZm9jdXNFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZm9jdXNFbGVtZW50KSwgb3IgW2VsZW1lbnRdKCNDb3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkgaXMgdGFwcGVkIDxlbT5pZiB0aGVcbiAgICAgKiBjdXJyZW50IHRoZW1lIHN1cHBvcnRzIHJpcHBsZXM8L2VtPi4gT3V0IG9mIHRoZSBib3gsIG9ubHkgdGhlIE1hdGVyaWFsIHRoZW1lIHN1cHBvcnRzIHJpcHBsZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1yaXBwbGUpXG4gICAgICovXG4gICAgcmlwcGxlID8gOiBib29sZWFufHtcbiAgICAgICAgZGVsZWdhdGU/OiBzdHJpbmdcbiAgICAgICAgY29sb3I/OiBzdHJpbmdcbiAgICAgICAgcmFkaXVzPzogbnVtYmVyXG4gICAgICAgIGNsaXA/OiBzdHJpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgeW91IGFyZSByZW5kZXJpbmcgdGhpcyB3aWRnZXQgdG8gYSBzaGFkb3cgcm9vdCBpbnNpZGUgYSB3ZWIgY29tcG9uZW50LCBzZXQgdGhpcyBjb25maWcgdG8gdGhlIHNoYWRvd1Jvb3QuIElmIG5vdCBpbnNpZGUgYSB3ZWIgY29tcG9uZW50LCBzZXQgaXQgdG8gYGRvY3VtZW50LmJvZHlgXG4gICAgICovXG4gICAgcm9vdEVsZW1lbnQgPyA6IFNoYWRvd1Jvb3R8SFRNTEVsZW1lbnRcbiAgICAvKipcbiAgICAgKiBSb3cgaGVpZ2h0IGluIHBpeGVscy4gVGhpcyBhbGxvd3MgdGhlIGRlZmF1bHQgaGVpZ2h0IGZvciByb3dzIHRvIGJlIGNvbnRyb2xsZWQuIE5vdGUgdGhhdCBpdCBtYXkgYmVcbiAgICAgKiBvdmVycmlkZW4gYnkgc3BlY2lmeWluZyBhIFtyb3dIZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvZGF0YS9HcmlkUm93TW9kZWwjZmllbGQtcm93SGVpZ2h0KSBvbiBhIHBlciByZWNvcmQgYmFzaXMsIG9yIGZyb21cbiAgICAgKiBhIGNvbHVtbiBbcmVuZGVyZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvY29sdW1uL0NvbHVtbiNjb25maWctcmVuZGVyZXIpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctcm93SGVpZ2h0KVxuICAgICAqL1xuICAgIHJvd0hlaWdodCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gbm90IHNob3cgcm93IGxpbmVzLiBFbmQgcmVzdWx0IG1pZ2h0IGJlIG92ZXJydWxlZCBieS9kaWZmZXIgYmV0d2VlbiB0aGVtZXMuXG4gICAgICovXG4gICAgcm93TGluZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGB0cnVlYCB0byBtYWtlIHRoZSB3aWRnZXQncyBlbGVtZW50IHVzZSB0aGUgYGRpcmVjdGlvbjpydGxgIHN0eWxlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctcnRsKVxuICAgICAqL1xuICAgIHJ0bCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBbU2NhbGVDb2x1bW5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci9jb2x1bW4vU2NhbGVDb2x1bW4pLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctc2NhbGVDb2x1bW4pXG4gICAgICovXG4gICAgc2NhbGVDb2x1bW4gPyA6IFNjYWxlQ29sdW1uQ29uZmlnXG4gICAgLyoqXG4gICAgICogQXJyYXkgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIFtzY2FsZSBjb2x1bW5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L21peGluL1RpbWVsaW5lSGlzdG9ncmFtU2NhbGVDb2x1bW4jY29uZmlnLXNjYWxlQ29sdW1uKSBzY2FsZSBwb2ludHMuXG4gICAgICogVGhlIGNvbmZpZyBiYXNpY2FsbHkgaXMgYSBtYXBwaW5nIHRvIHRoZSBjb2x1bW4gW3NjYWxlUG9pbnRzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvY29sdW1uL1NjYWxlQ29sdW1uI2NvbmZpZy1zY2FsZVBvaW50cylcbiAgICAgKiBjb25maWcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1zY2FsZVBvaW50cylcbiAgICAgKi9cbiAgICBzY2FsZVBvaW50cyA/IDogU2NhbGVQb2ludFtdXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB3aGV0aGVyIHRoZSBncmlkIGlzIHNjcm9sbGFibGUgaW4gdGhlIGBZYCBheGlzLiBUaGlzIGlzIHVzZWQgdG8gY29uZmlndXJlIGEgW1Njcm9sbGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL2hlbHBlci91dGlsL1Njcm9sbGVyKS5cbiAgICAgKiBTZWUgdGhlIFtzY3JvbGxlckNsYXNzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLXNjcm9sbGVyQ2xhc3MpIGNvbmZpZyBvcHRpb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1zY3JvbGxhYmxlKVxuICAgICAqL1xuICAgIHNjcm9sbGFibGUgPyA6IGJvb2xlYW58U2Nyb2xsZXJDb25maWd8U2Nyb2xsZXJcbiAgICAvKipcbiAgICAgKiBUaGUgY2xhc3MgdG8gaW5zdGFudGlhdGUgdG8gdXNlIGFzIHRoZSBbc2Nyb2xsYWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1zY3JvbGxhYmxlKS4gRGVmYXVsdHMgdG8gW1Njcm9sbGVyXSgjQ29yZS9oZWxwZXIvdXRpbC9TY3JvbGxlcikuXG4gICAgICovXG4gICAgc2Nyb2xsZXJDbGFzcyA/IDogdHlwZW9mIFNjcm9sbGVyXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJhdGlvbiB2YWx1ZXMgZm9yIHRoZSBbU2Nyb2xsTWFuYWdlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS91dGlsL1Njcm9sbE1hbmFnZXIpIGNsYXNzIG9uIGluaXRpYWxpemF0aW9uLiBSZXR1cm5zIHRoZVxuICAgICAqIFtTY3JvbGxNYW5hZ2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3V0aWwvU2Nyb2xsTWFuYWdlcikgYXQgcnVudGltZS5cbiAgICAgKi9cbiAgICBzY3JvbGxNYW5hZ2VyID8gOiBTY3JvbGxNYW5hZ2VyQ29uZmlnfFNjcm9sbE1hbmFnZXJcbiAgICAvKipcbiAgICAgKiBTZWxlY3Rpb24gY29uZmlndXJhdGlvbiBzZXR0aW5ncywgY2hhbmdlIHRoZXNlIHByb3BlcnRpZXMgdG8gY29udHJvbCBob3cgc2VsZWN0aW9uIHdvcmtzIGFuZCB3aGF0IGNhbiBiZVxuICAgICAqIHNlbGVjdGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctc2VsZWN0aW9uTW9kZSlcbiAgICAgKi9cbiAgICBzZWxlY3Rpb25Nb2RlID8gOiBHcmlkU2VsZWN0aW9uTW9kZVxuICAgIC8qKlxuICAgICAqIE9iamVjdCBlbnVtZXJhdGluZyBkYXRhIHNlcmllcyBmb3IgdGhlIGhpc3RvZ3JhbS5cbiAgICAgKiBUaGUgb2JqZWN0IGtleXMgYXJlIHRyZWF0ZWQgYXMgdGhlIHNlcmllcyBpZGVudGlmaWVycyBhbmQgdmFsdWVzIGFyZSBvYmplY3RzIHRoYXRcbiAgICAgKiBtdXN0IGNvbnRhaW4gdHdvIHByb3BlcnRpZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1zZXJpZXMpXG4gICAgICovXG4gICAgc2VyaWVzID8gOiBSZWNvcmQ8c3RyaW5nLCBIaXN0b2dyYW1TZXJpZXM+XG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCBpZiB5b3Ugd2FudCB0byBkaXNwbGF5IGEgdG9vbHRpcCB3aGVuIGhvdmVyaW5nIGFuIGFsbG9jYXRpb24gYmFyLiBZb3UgY2FuIGFsc28gcGFzcyBhXG4gICAgICogW1Rvb2x0aXAjY29uZmlnc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbHRpcCNjb25maWdzKSBjb25maWcgb2JqZWN0LlxuICAgICAqIFBsZWFzZSB1c2UgW2JhclRvb2x0aXBUZW1wbGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW1CYXNlI2NvbmZpZy1iYXJUb29sdGlwVGVtcGxhdGUpIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSB0aGUgdG9vbHRpcCBjb250ZW50cy5cbiAgICAgKi9cbiAgICBzaG93QmFyVGlwID8gOiBib29sZWFufFRvb2x0aXBDb25maWdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGRpc3BsYXkgdGhlIFtiYXIgdG9vbHRpcF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW1CYXNlI2NvbmZpZy1zaG93QmFyVGlwKSB3aGVuIG5hdmlnYXRpbmcgdGhlIHRpbWVheGlzIGNlbGxzXG4gICAgICogdXNpbmcgW1NjaGVkdWxlQ29udGV4dF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL2ZlYXR1cmUvU2NoZWR1bGVDb250ZXh0KSBmZWF0dXJlLlxuICAgICAqIFRoZSB0b29sdGlwIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgd2hlbiBuYXZpZ2F0aW5nIHRvIG1ha2UgdGhlIG5hdmlnYXRpb24gZWFzaWVyLlxuICAgICAqL1xuICAgIHNob3dCYXJUaXBXaGVuTmF2aWdhdGluZ1RpbWVBeGlzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBoYXZlIHRoZSBncmlkIHNob3cgYSByZWQgXCJjaGFuZ2VkXCIgdGFnIGluIGNlbGxzIHdob3NlXG4gICAgICogZmllbGQgdmFsdWUgaGFzIGNoYW5nZWQgYW5kIG5vdCB5ZXQgYmVlbiBjb21taXR0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1zaG93RGlydHkpXG4gICAgICovXG4gICAgc2hvd0RpcnR5ID8gOiBib29sZWFufHtcbiAgICAgICAgZHVyaW5nRWRpdD86IGJvb2xlYW5cbiAgICAgICAgbmV3UmVjb3JkPzogYm9vbGVhblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIHNuYXAgdG8gdGhlIGN1cnJlbnQgdGltZSByZXNvbHV0aW9uIGluY3JlbWVudCB3aGlsZSBpbnRlcmFjdGluZyB3aXRoIHNjaGVkdWxlZCBldmVudHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1zbmFwKVxuICAgICAqL1xuICAgIHNuYXAgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBZmZlY3RzIGRyYWcgZHJvcCBhbmQgcmVzaXppbmcgb2YgZXZlbnRzIHdoZW4gW3NuYXBdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L21peGluL1RpbWVsaW5lRGF0ZU1hcHBlciNjb25maWctc25hcClcbiAgICAgKiBpcyBlbmFibGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctc25hcFJlbGF0aXZlVG9FdmVudFN0YXJ0RGF0ZSlcbiAgICAgKi9cbiAgICBzbmFwUmVsYXRpdmVUb0V2ZW50U3RhcnREYXRlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogUHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciBob3cgbWFueSBjb2x1bW5zIHRvIHNwYW4gd2hlbiB1c2VkIGluIGEgZ3JpZCBsYXlvdXQuXG4gICAgICovXG4gICAgc3BhbiA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRpbWVsaW5lIChpZiBub3QgY29uZmlndXJlIHdpdGggW2luZmluaXRlU2Nyb2xsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUJhc2UjY29uZmlnLWluZmluaXRlU2Nyb2xsKSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1zdGFydERhdGUpXG4gICAgICovXG4gICAgc3RhcnREYXRlID8gOiBEYXRlfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctc3RhdGVmdWwpXG4gICAgICovXG4gICAgc3RhdGVmdWwgPyA6IGJvb2xlYW58b2JqZWN0fHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50cyB0aGF0LCB3aGVuIGZpcmVkIGJ5IHRoaXMgY29tcG9uZW50LCBzaG91bGQgdHJpZ2dlciBpdCB0byBzYXZlIGl0cyBzdGF0ZSBieSBjYWxsaW5nXG4gICAgICogW3NhdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNmdW5jdGlvbi1zYXZlU3RhdGUpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctc3RhdGVmdWxFdmVudHMpXG4gICAgICovXG4gICAgc3RhdGVmdWxFdmVudHMgPyA6IG9iamVjdHxzdHJpbmdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgdG8gdXNlIHdoZW4gc2F2aW5nIHRoaXMgb2JqZWN0J3Mgc3RhdGUgaW4gdGhlIFtzdGF0ZVByb3ZpZGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL21peGluL1N0YXRlI2NvbmZpZy1zdGF0ZVByb3ZpZGVyKS4gSWYgdGhpcyBjb25maWcgaXNcbiAgICAgKiBub3QgYXNzaWduZWQsIGFuZCBbc3RhdGVmdWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjY29uZmlnLXN0YXRlZnVsKSBpcyBub3Qgc2V0IHRvIGBmYWxzZWAsIHRoZSBbaWRdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWlkKVxuICAgICAqIChpZiBleHBsaWNpdGx5IHNwZWNpZmllZCkgd2lsbCBiZSB1c2VkIGFzIHRoZSBgc3RhdGVJZGAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy1zdGF0ZUlkKVxuICAgICAqL1xuICAgIHN0YXRlSWQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBgU3RhdGVQcm92aWRlcmAgdG8gdXNlIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhpcyBvYmplY3QncyBbc3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjcHJvcGVydHktc3RhdGUpLiBCeSBkZWZhdWx0LCBgc3RhdGVgXG4gICAgICogd2lsbCBiZSBzYXZlZCB1c2luZyB0aGUgW2RlZmF1bHQgc3RhdGUgcHJvdmlkZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvc3RhdGUvU3RhdGVQcm92aWRlciNwcm9wZXJ0eS1pbnN0YW5jZS1zdGF0aWMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctc3RhdGVQcm92aWRlcilcbiAgICAgKi9cbiAgICBzdGF0ZVByb3ZpZGVyID8gOiBTdGF0ZVByb3ZpZGVyXG4gICAgLyoqXG4gICAgICogVGhlIHByb3BlcnRpZXMgb2YgdGhpcyBzZXR0aW5ncyBvYmplY3QgY29udHJvbHMgaG93IGdyaWQgaXMgcmVzdG9yZWQgZnJvbSBzdGF0ZSBkYXRhLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctc3RhdGVTZXR0aW5ncylcbiAgICAgKi9cbiAgICBzdGF0ZVNldHRpbmdzID8gOiB7XG4gICAgICAgIHJlc3RvcmVVbmNvbmZpZ3VyZWRDb2x1bW5zPzogYm9vbGVhblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGVuIHNldCwgdGhlIHRleHQgaW4gdGhlIG1ham9yIHRpbWUgYXhpcyBoZWFkZXIgc3RpY2tzIGluIHRoZSBzY3JvbGxpbmcgdmlld3BvcnQgYXMgbG9uZyBhcyBwb3NzaWJsZS5cbiAgICAgKi9cbiAgICBzdGlja3lIZWFkZXJzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3RvcmUgdGhhdCBob2xkcyByZWNvcmRzIHRvIGRpc3BsYXkgaW4gdGhlIGdyaWQsIG9yIGEgc3RvcmUgY29uZmlnIG9iamVjdC4gSWYgdGhlIGNvbmZpZ3VyYXRpb24gY29udGFpbnNcbiAgICAgKiBhIGByZWFkVXJsYCwgYW4gYEFqYXhTdG9yZWAgd2lsbCBiZSBjcmVhdGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctc3RvcmUpXG4gICAgICovXG4gICAgc3RvcmUgPyA6IFN0b3JlfFN0b3JlQ29uZmlnfEFqYXhTdG9yZXxBamF4U3RvcmVDb25maWdcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB3aWRnZXRzIGtleWVkIGJ5IG5hbWUuIEJ5IGRlZmF1bHQgKHdoZW4gbm8gYHR5cGVgIGlzIGdpdmVuKSwgc3RyaXBzIGFyZVxuICAgICAqIFt0b29sYmFyc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbGJhcikuIElmIHlvdSB3YW50IHRvIHBhc3MgYW4gYXJyYXksIHlvdSBjYW4gdXNlXG4gICAgICogdGhlIHRvb2xiYXIncyBbaXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciNjb25maWctaXRlbXMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctc3RyaXBzKVxuICAgICAqL1xuICAgIHN0cmlwcyA/IDogUmVjb3JkPHN0cmluZywgU2NoZWR1bGVyQ29udGFpbmVySXRlbUNvbmZpZz5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBzdWIgZ3JpZCBjb25maWd1cmF0aW9uIG9iamVjdHMga2V5ZWQgYnkgYSBgcmVnaW9uYCBwcm9wZXJ0eS5cbiAgICAgKiBCeSBkZWZhdWx0LCBncmlkIGhhcyBhICdsb2NrZWQnIHJlZ2lvbiAoaWYgY29uZmlndXJlZCB3aXRoIGxvY2tlZCBjb2x1bW5zKSBhbmQgYSAnbm9ybWFsJyByZWdpb24uXG4gICAgICogVGhlICdub3JtYWwnIHJlZ2lvbiBkZWZhdWx0cyB0byB1c2UgYGZsZXg6IDFgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctc3ViR3JpZENvbmZpZ3MpXG4gICAgICovXG4gICAgc3ViR3JpZENvbmZpZ3MgPyA6IFJlY29yZDxzdHJpbmcsIFN1YkdyaWRDb25maWc+XG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBwcmV2ZW50IGF1dG8gY2FsY3VsYXRpbmcgb2YgYSBtaW5pbWFsIFt0aWNrU2l6ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vVGltZWxpbmVFdmVudFJlbmRlcmluZyNwcm9wZXJ0eS10aWNrU2l6ZSlcbiAgICAgKiB0byBhbHdheXMgZml0IHRoZSBjb250ZW50IHRvIHRoZSBzY3JlZW4gc2l6ZS4gU2V0dGluZyB0aGlzIHByb3BlcnR5IG9uIGB0cnVlYCB3aWxsIGRpc2FibGUgW2ZvcmNlRml0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUJhc2UjY29uZmlnLWZvcmNlRml0KSBiZWhhdmlvdXIuXG4gICAgICovXG4gICAgc3VwcHJlc3NGaXQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LCBvciBhIG1lc3NhZ2UgdG8gYmUgc2hvd24gd2hlbiBDcnVkIE1hbmFnZXJcbiAgICAgKiBpcyBwZXJzaXN0aW5nIGNoYW5nZXMgb24gdGhlIHNlcnZlci4gU2V0IHRvIGBudWxsYCB0byBkaXNhYmxlIGRlZmF1bHQgc3luYyBtYXNrLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctc3luY01hc2spXG4gICAgICovXG4gICAgc3luY01hc2sgPyA6IHN0cmluZ3xNYXNrQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBbdGFiXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWIpIGNyZWF0ZWQgZm9yIHRoaXMgd2lkZ2V0IHdoZW4gaXQgaXMgcGxhY2VkIGluIGFcbiAgICAgKiBbVGFiUGFuZWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYlBhbmVsKS4gRm9yIGV4YW1wbGUsIHRoaXMgY29uZmlnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGljb24gb2YgdGhlIGB0YWJgIGZvclxuICAgICAqIHRoaXMgd2lkZ2V0OlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctdGFiKVxuICAgICAqL1xuICAgIHRhYiA/IDogYm9vbGVhbnxUYWJDb25maWdcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgY29udGFpbmVyIGlzIHVzZWQgYXMgYSB0YWIgaW4gYSBUYWJQYW5lbCwgdGhlc2UgaXRlbXMgYXJlIGFkZGVkIHRvIHRoZVxuICAgICAqIFtUYWJCYXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYkJhcikgd2hlbiB0aGlzIGNvbnRhaW5lciBpcyB0aGUgYWN0aXZlIHRhYi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLXRhYkJhckl0ZW1zKVxuICAgICAqL1xuICAgIHRhYkJhckl0ZW1zID8gOiBUb29sYmFySXRlbXNbXXxXaWRnZXRbXVxuICAgIC8qKlxuICAgICAqIEEgQ29uZmlnIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBbVG9vbGJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbGJhciksXG4gICAgICogb3IgYXJyYXkgb2YgY29uZmlnIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBjaGlsZCBpdGVtcyBvZiBhIFRvb2xiYXIuXG4gICAgICogVGhpcyBjcmVhdGVzIGEgdG9vbGJhciBkb2NrZWQgdG8gdGhlIHRvcCBvZiB0aGUgcGFuZWwgaW1tZWRpYXRlbHkgYmVsb3cgdGhlIGhlYWRlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLXRiYXIpXG4gICAgICovXG4gICAgdGJhciA/IDogKFNjaGVkdWxlckNvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogVGhlIHdpZHRoL2hlaWdodCAoZGVwZW5kaW5nIG9uIHZlcnRpY2FsIC8gaG9yaXpvbnRhbCBtb2RlKSBvZiBhbGwgdGhlIHRpbWUgY29sdW1ucy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLXRpY2tTaXplKVxuICAgICAqL1xuICAgIHRpY2tTaXplID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBBIFtUaW1lQXhpc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL2RhdGEvVGltZUF4aXMpIGNvbmZpZyBvYmplY3Qgb3IgaW5zdGFuY2UsIHVzZWQgdG8gY3JlYXRlIGEgYmFja2luZyBkYXRhIHN0b3JlIG9mXG4gICAgICogJ3RpY2tzJyBwcm92aWRpbmcgdGhlIGlucHV0IGRhdGUgZGF0YSBmb3IgdGhlIHRpbWUgYXhpcyBvZiB0aW1lbGluZSBwYW5lbC4gQ3JlYXRlZCBhdXRvbWF0aWNhbGx5IGlmIG5vbmVcbiAgICAgKiBzdXBwbGllZC5cbiAgICAgKi9cbiAgICB0aW1lQXhpcyA/IDogVGltZUF4aXNDb25maWd8VGltZUF4aXNcbiAgICAvKipcbiAgICAgKiBHZXRzL3NldHMgdGhlIGN1cnJlbnQgdGltZSByZXNvbHV0aW9uIG9iamVjdCwgd2hpY2ggY29udGFpbnMgYSB1bml0IGlkZW50aWZpZXIgYW5kIGFuIGluY3JlbWVudCBjb3VudFxuICAgICAqIGB7IHVuaXQsIGluY3JlbWVudCB9YC4gVGhpcyB2YWx1ZSBtZWFucyBtaW5pbWFsIHRhc2sgZHVyYXRpb24geW91IGNhbiBjcmVhdGUgdXNpbmcgVUkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy10aW1lUmVzb2x1dGlvbilcbiAgICAgKi9cbiAgICB0aW1lUmVzb2x1dGlvbiA/IDoge1xuICAgICAgICBpbmNyZW1lbnQ/OiBudW1iZXJcbiAgICAgICAgdW5pdD86IER1cmF0aW9uVW5pdFxuICAgIH18bnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGEgdGltZSB6b25lIG9yIGEgVVRDIG9mZnNldC4gVGhpcyB3aWxsIHNldCB0aGUgcHJvamVjdHNcbiAgICAgKiBbdGltZVpvbmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXRpbWVab25lKSBjb25maWcgYWNjb3JkaW5nbHkuIEFzIHRoaXMgY29uZmlnIGlzIG9ubHkgYSByZWZlcmVyLFxuICAgICAqIHBsZWFzZSBzZWUgcHJvamVjdCdzIGNvbmZpZyBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdGltZVpvbmUpIGZvciBtb3JlXG4gICAgICogaW5mb3JtYXRpb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy10aW1lWm9uZSlcbiAgICAgKi9cbiAgICB0aW1lWm9uZSA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIEEgdGl0bGUgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyIG9yIG93bmluZyBUYWJQYW5lbC4gQ2F1c2VzIGNyZWF0aW9uIGFuZCBkb2NraW5nIG9mIGEgaGVhZGVyXG4gICAgICogdG8gdGhlIHRvcCBpZiBubyBoZWFkZXIgaXMgY29uZmlndXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jY29uZmlnLXRpdGxlKVxuICAgICAqL1xuICAgIHRpdGxlID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgW3Rvb2xzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sKSB0byBhZGQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgYHRpdGxlYCBpbiB0aGUgUGFuZWwgaGVhZGVyLiBFYWNoXG4gICAgICogcHJvcGVydHkgbmFtZSBpcyB0aGUgcmVmZXJlbmNlIGJ5IHdoaWNoIGFuIGluc3RhbnRpYXRlZCB0b29sIG1heSBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbGl2ZVxuICAgICAqIGBbdG9vbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Rvb2xhYmxlI3Byb3BlcnR5LXRvb2xzKWAgcHJvcGVydHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy10b29scylcbiAgICAgKi9cbiAgICB0b29scyA/IDogUmVjb3JkPHN0cmluZywgVG9vbENvbmZpZz58bnVsbFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBVSSB0cmFuc2l0aW9ucyBmb3IgdmFyaW91cyBhY3Rpb25zIGluIHRoZSBncmlkLlxuICAgICAqL1xuICAgIHRyYW5zaXRpb24gPyA6IHtcbiAgICAgICAgaW5zZXJ0UmVjb3JkPzogYm9vbGVhblxuICAgICAgICByZW1vdmVSZWNvcmQ/OiBib29sZWFuXG4gICAgICAgIHRvZ2dsZUNvbHVtbj86IGJvb2xlYW5cbiAgICAgICAgZXhwYW5kQ29sbGFwc2VDb2x1bW4/OiBib29sZWFuXG4gICAgICAgIHRvZ2dsZVJlZ2lvbj86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlVHJlZU5vZGU/OiBib29sZWFuXG4gICAgICAgIHRvZ2dsZUdyb3VwPzogYm9vbGVhblxuICAgICAgICBmaWx0ZXJSZW1vdmFsPzogYm9vbGVhblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbmltYXRpb24gdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gICAgICovXG4gICAgdHJhbnNpdGlvbkR1cmF0aW9uID8gOiBudW1iZXJcbiAgICB0eXBlID8gOiAndGltZWxpbmVoaXN0b2dyYW0nXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzcyBuYW1lIHN1ZmZpeGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50cyByZW5kZXJlZCBieSB0aGlzIHdpZGdldC4gVGhpcyBtYXkgYmUgc3BlY2lmaWVkXG4gICAgICogYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBhbiBhcnJheSBvZiBzdHJpbmdzLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXMgd2l0aCB0cnV0aHlcbiAgICAgKiB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctdWkpXG4gICAgICovXG4gICAgdWkgPyA6ICdwbGFpbid8J3Rvb2xiYXInfHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBrZXkgdXNlZCB0byBsb29rdXAgYSBwcmVkZWZpbmVkIFtWaWV3UHJlc2V0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvcHJlc2V0L1ZpZXdQcmVzZXQpIChlLmcuICd3ZWVrQW5kRGF5JywgJ2hvdXJBbmREYXknKSxcbiAgICAgKiBtYW5hZ2VkIGJ5IFtQcmVzZXRNYW5hZ2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvcHJlc2V0L1ByZXNldE1hbmFnZXIpLiBTZWUgW1ByZXNldE1hbmFnZXJdKCNTY2hlZHVsZXIvcHJlc2V0L1ByZXNldE1hbmFnZXIpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAqIE9yIGEgY29uZmlnIG9iamVjdCBmb3IgYSB2aWV3UHJlc2V0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctdmlld1ByZXNldClcbiAgICAgKi9cbiAgICB2aWV3UHJlc2V0ID8gOiBzdHJpbmd8Vmlld1ByZXNldENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSB0byBicmluZyBpbnRvIHZpZXcgaW5pdGlhbGx5IG9uIHRoZSBzY3JvbGxhYmxlIHRpbWVsaW5lLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNjb25maWctdmlzaWJsZURhdGUpXG4gICAgICovXG4gICAgdmlzaWJsZURhdGUgPyA6IERhdGV8VmlzaWJsZURhdGVcbiAgICAvKipcbiAgICAgKiBJbnRlZ2VyIG51bWJlciBpbmRpY2F0aW5nIHRoZSBzaXplIG9mIHRpbWVzcGFuIGR1cmluZyB6b29taW5nLiBXaGVuIHpvb21pbmcsIHRoZSB0aW1lc3BhbiBpcyBhZGp1c3RlZCB0byBtYWtlXG4gICAgICogdGhlIHNjcm9sbGluZyBhcmVhIGB2aXNpYmxlWm9vbUZhY3RvcmAgdGltZXMgd2lkZXIgdGhhbiB0aGUgdGltZWxpbmUgYXJlYSBpdHNlbGYuIFVzZWQgaW5cbiAgICAgKiBbem9vbVRvU3Bhbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vVGltZWxpbmVab29tYWJsZSNmdW5jdGlvbi16b29tVG9TcGFuKSBhbmQgW3pvb21Ub0xldmVsXSgjU2NoZWR1bGVyL3ZpZXcvbWl4aW4vVGltZWxpbmVab29tYWJsZSNmdW5jdGlvbi16b29tVG9MZXZlbCkgZnVuY3Rpb25zLlxuICAgICAqL1xuICAgIHZpc2libGVab29tRmFjdG9yID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIEpTIGRheSBpbmRleCBiZXR3ZWVuIDAtNiAoMDogU3VuZGF5LCAxOiBNb25kYXkgZXRjLikgdG8gYmUgY29uc2lkZXJlZCB0aGUgc3RhcnQgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAqIFdoZW4gb21pdHRlZCwgdGhlIHdlZWsgc3RhcnQgZGF5IGlzIHJldHJpZXZlZCBmcm9tIHRoZSBhY3RpdmUgbG9jYWxlIGNsYXNzLlxuICAgICAqL1xuICAgIHdlZWtTdGFydERheSA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogQSB3aWRnZXRzIHdlaWdodCBkZXRlcm1pbmVzIGl0cyBwb3NpdGlvbiBhbW9uZyBzaWJsaW5ncyB3aGVuIGFkZGVkIHRvIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKS5cbiAgICAgKiBIaWdoZXIgd2VpZ2h0cyBnbyBmdXJ0aGVyIGRvd24uXG4gICAgICovXG4gICAgd2VpZ2h0ID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBXaWRnZXQncyB3aWR0aCwgdXNlZCB0byBzZXQgZWxlbWVudCBgc3R5bGUud2lkdGhgLiBFaXRoZXIgc3BlY2lmeSBhIHZhbGlkIHdpZHRoIHN0cmluZyBvciBhIG51bWJlciwgd2hpY2hcbiAgICAgKiB3aWxsIGdldCAncHgnIGFwcGVuZGVkLiBXZSByZWNvbW1lbmQgdXNpbmcgQ1NTIGFzIHRoZSBwcmltYXJ5IHdheSB0byBjb250cm9sIHdpZHRoLCBidXQgaW4gc29tZSBjYXNlc1xuICAgICAqIHRoaXMgY29uZmlnIGlzIGNvbnZlbmllbnQuXG4gICAgICovXG4gICAgd2lkdGggPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBmb3JtYXQgYHsgZnJvbURheSwgdG9EYXksIGZyb21Ib3VyLCB0b0hvdXIgfWAgdGhhdCBkZXNjcmliZXMgdGhlIHdvcmtpbmcgZGF5cyBhbmQgaG91cnMuXG4gICAgICogVGhpcyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIHBvcHVsYXRlIFRpbWVBeGlzIFtpbmNsdWRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvZGF0YS9UaW1lQXhpcyNjb25maWctaW5jbHVkZSkgcHJvcGVydHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2NvbmZpZy13b3JraW5nVGltZSlcbiAgICAgKi9cbiAgICB3b3JraW5nVGltZSA/IDoge1xuICAgICAgICBmcm9tRGF5PzogbnVtYmVyXG4gICAgICAgIHRvRGF5PzogbnVtYmVyXG4gICAgICAgIGZyb21Ib3VyPzogbnVtYmVyXG4gICAgICAgIHRvSG91cj86IG51bWJlclxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBvcmlnaW5hbGx5IHJlbmRlcmVkIHRpbWVzcGFuIHNob3VsZCBiZSBwcmVzZXJ2ZWQgd2hpbGUgem9vbWluZy4gQnkgZGVmYXVsdCwgaXQgaXMgc2V0IHRvIGBmYWxzZWAsXG4gICAgICogbWVhbmluZyB0aGUgdGltZWxpbmUgcGFuZWwgd2lsbCBhZGp1c3QgdGhlIGN1cnJlbnRseSByZW5kZXJlZCB0aW1lc3BhbiB0byBsaW1pdCB0aGUgYW1vdW50IG9mIEhUTUwgY29udGVudCB0b1xuICAgICAqIHJlbmRlci4gV2hlbiBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIGB0cnVlYCwgYmUgY2FyZWZ1bCBub3QgdG8gYWxsb3cgdG8gem9vbSBhIGJpZyB0aW1lc3BhbiBpbiBzZWNvbmRzXG4gICAgICogcmVzb2x1dGlvbiBmb3IgZXhhbXBsZS4gVGhhdCB3aWxsIGNhdXNlIDxzdHJvbmc+YSBsb3Q8L3N0cm9uZz4gb2YgSFRNTCBjb250ZW50IHRvIGJlIHJlbmRlcmVkIGFuZCBhZmZlY3QgcGVyZm9ybWFuY2UuIFlvdVxuICAgICAqIGNhbiB1c2UgW21pblpvb21MZXZlbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vVGltZWxpbmVab29tYWJsZSNjb25maWctbWluWm9vbUxldmVsKSBhbmQgW21heFpvb21MZXZlbF0oI1NjaGVkdWxlci92aWV3L21peGluL1RpbWVsaW5lWm9vbWFibGUjY29uZmlnLW1heFpvb21MZXZlbCkgY29uZmlnIG9wdGlvbnMgZm9yIHRoYXQuXG4gICAgICovXG4gICAgem9vbUtlZXBzT3JpZ2luYWxUaW1lc3BhbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIElmIHRydWUsIHlvdSBjYW4gem9vbSBpbiBhbmQgb3V0IG9uIHRoZSB0aW1lIGF4aXMgdXNpbmcgQ1RSTC1rZXkgKyBtb3VzZSB3aGVlbC5cbiAgICAgKi9cbiAgICB6b29tT25Nb3VzZVdoZWVsID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVHJ1ZSB0byB6b29tIHRvIHRpbWUgc3BhbiB3aGVuIGRvdWJsZS1jbGlja2luZyBhIHRpbWUgYXhpcyBjZWxsLlxuICAgICAqL1xuICAgIHpvb21PblRpbWVBeGlzRG91YmxlQ2xpY2sgPyA6IGJvb2xlYW5cblxuICAgIC8vIEZlYXR1cmVzXG4gICAgLyoqXG4gICAgICogQUktcG93ZXJlZCBmaWx0ZXIgZmVhdHVyZSBmb3IgR3JpZC4gQWxsb3dzIHVzZXJzIHRvIHR5cGUgbmF0dXJhbCBsYW5ndWFnZSBxdWVyaWVzIHRvIGZpbHRlciBncmlkIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9haS9BSUZpbHRlcilcbiAgICAgKi9cbiAgICBhaUZpbHRlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xBSUZpbHRlcnxBSUZpbHRlckNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyB1c2luZyBgW0N0cmwvQ01EICsgQ11gLCBgW0N0cmwvQ01EICsgWF1gIGFuZCBgW0N0cmwvQ01EICsgVl1gIHRvIGN1dCwgY29weSBhbmQgcGFzdGUgY2VsbCBvciBjZWxsIHJhbmdlcy4gQWxzb1xuICAgICAqIG1ha2VzIGN1dCwgY29weSBhbmQgcGFzdGUgYWN0aW9ucyBhdmFpbGFibGUgdmlhIHRoZSBjZWxsIGNvbnRleHQgbWVudS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NlbGxDb3B5UGFzdGUpXG4gICAgICovXG4gICAgY2VsbENvcHlQYXN0ZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDZWxsQ29weVBhc3RlfENlbGxDb3B5UGFzdGVDb25maWdcbiAgICAvKipcbiAgICAgKiBBZGRpbmcgdGhpcyBmZWF0dXJlIHRvIHRoZSBncmlkIGFuZCBvdGhlciBCcnludHVtIHByb2R1Y3RzIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgR3JpZCAoaS5lLiBTY2hlZHVsZXIsIFNjaGVkdWxlclBybywgYW5kIEdhbnR0KVxuICAgICAqIGVuYWJsZXMgY2VsbCBlZGl0aW5nLiBBbnkgc3ViY2xhc3Mgb2YgW0ZpZWxkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9GaWVsZCkgY2FuIGJlIHVzZWRcbiAgICAgKiBhcyBlZGl0b3IgZm9yIHRoZSBbQ29sdW1uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2NvbHVtbi9Db2x1bW4pLiBUaGUgbW9zdCBwb3B1bGFyIGFyZTpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NlbGxFZGl0KVxuICAgICAqL1xuICAgIGNlbGxFZGl0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENlbGxFZGl0fENlbGxFZGl0Q29uZmlnXG4gICAgLyoqXG4gICAgICogUmlnaHQgY2xpY2sgdG8gZGlzcGxheSBjb250ZXh0IG1lbnUgZm9yIGNlbGxzLiBUbyBpbnZva2UgdGhlIGNlbGwgbWVudSBpbiBhIGtleWJvYXJkLWFjY2Vzc2libGUgbWFubmVyLCB1c2UgdGhlXG4gICAgICogYFNQQUNFYCBrZXkgd2hlbiB0aGUgY2VsbCBpcyBmb2N1c2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ2VsbE1lbnUpXG4gICAgICovXG4gICAgY2VsbE1lbnVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2VsbE1lbnV8Q2VsbE1lbnVDb25maWdcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIHRvb2x0aXAgd2hlbiBob3ZlcmluZyBjZWxscy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NlbGxUb29sdGlwKVxuICAgICAqL1xuICAgIGNlbGxUb29sdGlwRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENlbGxUb29sdGlwfENlbGxUb29sdGlwQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWRkcyBpbnRlcmFjdGl2ZSBjaGFydGluZyB0byBhIEdyaWQuIFtDaGFydHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NoYXJ0L3dpZGdldC9DaGFydCkgY2FuIGJlIGNyZWF0ZWQgZnJvbSBhIHNlbGVjdGlvbiBvZiBHcmlkIGRhdGFcbiAgICAgKiBhbmQgdXBkYXRlZCBpbiByZWFsdGltZSBhcyBkYXRhIGNoYW5nZXMuIFN1cHBvcnRzIG1hbnkgY29tbW9uIGNoYXJ0IHR5cGVzIHdpdGggZXh0ZW5zaXZlIHN0eWxpbmcgYW5kIGN1c3RvbWl6YXRpb25cbiAgICAgKiBvcHRpb25zLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ2hhcnRzKVxuICAgICAqL1xuICAgIGNoYXJ0c0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDaGFydHN8Q2hhcnRzQ29uZmlnXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgW2F1dG9XaWR0aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9jb2x1bW4vQ29sdW1uI2NvbmZpZy1hdXRvV2lkdGgpIGNvbmZpZyBmb3IgYSBncmlkJ3MgY29sdW1ucy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NvbHVtbkF1dG9XaWR0aClcbiAgICAgKi9cbiAgICBjb2x1bW5BdXRvV2lkdGhGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uQXV0b1dpZHRofENvbHVtbkF1dG9XaWR0aENvbmZpZ1xuICAgIC8qKlxuICAgICAqIERpc3BsYXlzIGEgdG9vbGJhciB3aGlsZSBkcmFnZ2luZyBjb2x1bW4gaGVhZGVycy4gRHJvcCBvbiBhIGJ1dHRvbiBpbiB0aGUgdG9vbGJhciB0byBhY3RpdmF0ZSBhIGNlcnRhaW4gZnVuY3Rpb24sXG4gICAgICogZm9yIGV4YW1wbGUgdG8gZ3JvdXAgYnkgdGhhdCBjb2x1bW4uIFRoaXMgZmVhdHVyZSBzaW1wbGlmaWVzIGNlcnRhaW4gb3BlcmF0aW9ucyBvbiB0b3VjaCBkZXZpY2VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ29sdW1uRHJhZ1Rvb2xiYXIpXG4gICAgICovXG4gICAgY29sdW1uRHJhZ1Rvb2xiYXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uRHJhZ1Rvb2xiYXJ8Q29sdW1uRHJhZ1Rvb2xiYXJDb25maWdcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBjb2x1bW4gbGluZXMgZm9yIHRpY2tzLCB3aXRoIGEgZGlmZmVyZW50IHN0eWxpbmcgZm9yIG1ham9yIHRpY2tzIChieSBkZWZhdWx0IHRoZXkgYXJlIGRhcmtlcikuIElmIHRoaXNcbiAgICAgKiBmZWF0dXJlIGlzIGRpc2FibGVkLCBubyBsaW5lcyBhcmUgc2hvd24uIElmIGl0J3MgZW5hYmxlZCwgbGluZSBhcmUgc2hvd24gZm9yIHRoZSB0aWNrIGxldmVsIHdoaWNoIGlzIHNldCBpbiBjdXJyZW50XG4gICAgICogVmlld1ByZXNldC4gUGxlYXNlIHNlZSBbY29sdW1uTGluZXNGb3JdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci9wcmVzZXQvVmlld1ByZXNldCNmaWVsZC1jb2x1bW5MaW5lc0ZvcikgY29uZmlnIGZvciBkZXRhaWxzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvZmVhdHVyZS9Db2x1bW5MaW5lcylcbiAgICAgKi9cbiAgICBjb2x1bW5MaW5lc0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5MaW5lc3xDb2x1bW5MaW5lc0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIERpc3BsYXlzIGEgY29sdW1uIHBpY2tlciAodG8gc2hvdy9oaWRlIGNvbHVtbnMpIGluIHRoZSBoZWFkZXIgY29udGV4dCBtZW51LiBDb2x1bW5zIGNhbiBiZSBkaXNwbGF5ZWQgaW4gc3ViIG1lbnVzXG4gICAgICogYnkgcmVnaW9uIG9yIHRhZy4gR3JvdXBlZCBoZWFkZXJzIGFyZSBkaXNwbGF5ZWQgYXMgbWVudSBoaWVyYXJjaGllcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NvbHVtblBpY2tlcilcbiAgICAgKi9cbiAgICBjb2x1bW5QaWNrZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUGlja2VyfENvbHVtblBpY2tlckNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyB1c2VyIHRvIHJlbmFtZSBjb2x1bW5zIGJ5IGVpdGhlciByaWdodC1jbGlja2luZyBjb2x1bW4gaGVhZGVyIG9yIHVzaW5nIGtleWJvYXJkIHNob3J0Y3V0cyB3aGVuIGNvbHVtbiBoZWFkZXJcbiAgICAgKiBpcyBmb2N1c2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ29sdW1uUmVuYW1lKVxuICAgICAqL1xuICAgIGNvbHVtblJlbmFtZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5SZW5hbWV8Q29sdW1uUmVuYW1lQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWxsb3dzIHVzZXIgdG8gcmVvcmRlciBjb2x1bW5zIGJ5IGRyYWdnaW5nIGhlYWRlcnMuIFRvIGdldCBub3RpZmllZCBhYm91dCBjb2x1bW4gcmVvcmRlciBsaXN0ZW4gdG8gYGNoYW5nZWAgZXZlbnRcbiAgICAgKiBvbiBbY29sdW1uc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9kYXRhL0NvbHVtblN0b3JlKSBzdG9yZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NvbHVtblJlb3JkZXIpXG4gICAgICovXG4gICAgY29sdW1uUmVvcmRlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5SZW9yZGVyfENvbHVtblJlb3JkZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHVzZXIgdG8gcmVzaXplIGNvbHVtbnMgYnkgZHJhZ2dpbmcgYSBoYW5kbGUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgaGVhZGVyLiBUbyBnZXQgbm90aWZpZWQgYWJvdXQgY29sdW1uXG4gICAgICogcmVzaXplIGxpc3RlbiB0byBgY2hhbmdlYCBldmVudCBvbiBbY29sdW1uc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9kYXRhL0NvbHVtblN0b3JlKSBzdG9yZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NvbHVtblJlc2l6ZSlcbiAgICAgKi9cbiAgICBjb2x1bW5SZXNpemVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUmVzaXplfENvbHVtblJlc2l6ZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgZmVhdHVyZSB0aGF0IGFsbG93cyBleHBvcnRpbmcgR3JpZCBkYXRhIHRvIEV4Y2VsIG9yIENTViB3aXRob3V0IGludm9sdmluZyB0aGUgc2VydmVyLiBJdCB1c2VzXG4gICAgICogW1RhYmxlRXhwb3J0ZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvdXRpbC9UYWJsZUV4cG9ydGVyKSBjbGFzcyBhcyBkYXRhIHByb3ZpZGVyLCAzcmQgcGFydHkgcHJvdmlkZXIgdG8gZ2VuZXJhdGUgWExTIGZpbGVzLCBhbmRcbiAgICAgKiBbTWljcm9zb2Z0IFhNTCBzcGVjaWZpY2F0aW9uXShodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L29mZmljZS9kb2N1bWVudGZvcm1hdC5vcGVueG1sLnNwcmVhZHNoZWV0LmFzcHgpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvZXhwZXJpbWVudGFsL0V4Y2VsRXhwb3J0ZXIpXG4gICAgICovXG4gICAgZXhjZWxFeHBvcnRlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xHcmlkRXhjZWxFeHBvcnRlcnxHcmlkRXhjZWxFeHBvcnRlckNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIHRoYXQgbGV0cyB1c2VycyBkcm9wIGZpbGVzIG9uIGEgV2lkZ2V0LiBUaGUgd2lkZ2V0IGZpcmVzIGFuIGV2ZW50IHdoZW4gYSBmaWxlIGlzIGRyb3BwZWQgb250byBpdC5cbiAgICAgKiBJbiB0aGUgZXZlbnQsIHlvdSBnZXQgYWNjZXNzIHRvIHRoZSByYXcgZmlsZXMgYXMgc3RyaW5ncywgdGhhdCB3ZXJlIHBhcnNlZCBieSBjYWxsaW5nIGByZWFkQXNCaW5hcnlTdHJpbmdgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvZXhwZXJpbWVudGFsL0ZpbGVEcm9wKVxuICAgICAqL1xuICAgIGZpbGVEcm9wRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbGVEcm9wfEZpbGVEcm9wQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIGFkZHMgYSBmaWxsIGhhbmRsZSB0byBhIEdyaWQgcmFuZ2Ugc2VsZWN0aW9uLCB3aGljaCB3aGVuIGRyYWdnZWQsIGZpbGxzIHRoZSBjZWxscyBiZWluZyBkcmFnZ2VkIG92ZXJcbiAgICAgKiB3aXRoIHZhbHVlcyBiYXNlZCBvbiB0aGUgdmFsdWVzIGluIHRoZSBvcmlnaW5hbCBzZWxlY3RlZCByYW5nZS4gVGhpcyBpcyBzaW1pbGFyIHRvIGZ1bmN0aW9uYWxpdHkgbm9ybWFsbHkgc2VlbiBpblxuICAgICAqIHZhcmlvdXMgc3ByZWFkc2hlZXQgYXBwbGljYXRpb25zLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvRmlsbEhhbmRsZSlcbiAgICAgKi9cbiAgICBmaWxsSGFuZGxlRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbGxIYW5kbGV8RmlsbEhhbmRsZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEZlYXR1cmUgdGhhdCBhbGxvd3MgZmlsdGVyaW5nIG9mIHRoZSBncmlkIGJ5IHNldHRpbmdzIGZpbHRlcnMgb24gY29sdW1ucy4gVGhlIGFjdHVhbCBmaWx0ZXJpbmcgaXMgZG9uZSBieSB0aGUgc3RvcmUuXG4gICAgICogRm9yIGluZm8gb24gcHJvZ3JhbW1hdGljYWxseSBoYW5kbGluZyBmaWx0ZXJzLCBzZWUgW1N0b3JlRmlsdGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL2RhdGEvbWl4aW4vU3RvcmVGaWx0ZXIpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvRmlsdGVyKVxuICAgICAqL1xuICAgIGZpbHRlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWx0ZXJ8RmlsdGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogRmVhdHVyZSB0aGF0IGFsbG93cyBmaWx0ZXJpbmcgb2YgdGhlIGdyaWQgYnkgZW50ZXJpbmcgZmlsdGVycyBvbiBjb2x1bW4gaGVhZGVycy5cbiAgICAgKiBUaGUgYWN0dWFsIGZpbHRlcmluZyBpcyBkb25lIGJ5IHRoZSBzdG9yZS5cbiAgICAgKiBGb3IgaW5mbyBvbiBwcm9ncmFtbWF0aWNhbGx5IGhhbmRsaW5nIGZpbHRlcnMsIHNlZSBbU3RvcmVGaWx0ZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvZGF0YS9taXhpbi9TdG9yZUZpbHRlcikuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9GaWx0ZXJCYXIpXG4gICAgICovXG4gICAgZmlsdGVyQmFyRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbHRlckJhcnxGaWx0ZXJCYXJDb25maWdcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHJlbmRlcmluZyBhbmQgaGFuZGxpbmcgb2Ygcm93IGdyb3Vwcy4gVGhlIGFjdHVhbCBncm91cGluZyBpcyBkb25lIGluIHRoZSBzdG9yZSwgYnV0IHRyaWdnZXJlZCBieVxuICAgICAqIDxrYmQ+c2hpZnQ8L2tiZD4gKyBjbGlja2luZyBoZWFkZXJzLCBvciBieSB1c2luZyB0aGUgY29udGV4dCBtZW51LCBvciBieSB1c2luZyB0d28gZmluZ2VyIHRhcCAob25lIG9uIGhlYWRlcixcbiAgICAgKiBvbmUgYW55d2hlcmUgb24gZ3JpZCkuIFVzZSA8a2JkPnNoaWZ0PC9rYmQ+ICsgPGtiZD5hbHQ8L2tiZD4gKyBjbGljaywgb3IgdGhlIGNvbnRleHQgbWVudSwgdG8gcmVtb3ZlIGEgY29sdW1uXG4gICAgICogZ3JvdXBlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0dyb3VwKVxuICAgICAqL1xuICAgIGdyb3VwRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyb3VwfEdyb3VwQ29uZmlnXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIEdyaWQgR3JvdXBTdW1tYXJ5IGZlYXR1cmUgdGhhdCBlbmFibGVzIHN1bW1hcmllcyB3aXRoaW4gc2NoZWR1bGVyLiBUbyB1c2UgYSBzaW5nbGUgc3VtbWFyeVxuICAgICAqIGl0IGlzIGVhc2llc3QgdG8gY29uZmlndXJlIFtyZW5kZXJlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL2ZlYXR1cmUvR3JvdXBTdW1tYXJ5I2NvbmZpZy1yZW5kZXJlciksIGZvciBtdWx0aXBsZSBzdW1tYXJpZXMgc2VlIFtzdW1tYXJpZXNdKCNTY2hlZHVsZXIvZmVhdHVyZS9Hcm91cFN1bW1hcnkjY29uZmlnLXN1bW1hcmllcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci9mZWF0dXJlL0dyb3VwU3VtbWFyeSlcbiAgICAgKi9cbiAgICBncm91cFN1bW1hcnlGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JvdXBTdW1tYXJ5fEdyb3VwU3VtbWFyeUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFJpZ2h0IGNsaWNrIGNvbHVtbiBoZWFkZXIgb3IgZm9jdXMgaXQgYW5kIHByZXNzIFNQQUNFIGtleSB0byBzaG93IHRoZSBjb250ZXh0IG1lbnUgZm9yIGhlYWRlcnMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9IZWFkZXJNZW51KVxuICAgICAqL1xuICAgIGhlYWRlck1lbnVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8SGVhZGVyTWVudXxIZWFkZXJNZW51Q29uZmlnXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB1c2VycyB0byBjbGljayBhbmQgZHJhZyB0byB6b29tIHRvIGEgZGF0ZSByYW5nZSBpbiBTY2hlZHVsZXIncyBoZWFkZXIgdGltZSBheGlzLiBPbmx5IHN1cHBvcnRlZCBpbiBob3Jpem9udGFsXG4gICAgICogbW9kZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL2ZlYXR1cmUvSGVhZGVyWm9vbSlcbiAgICAgKi9cbiAgICBoZWFkZXJab29tRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEhlYWRlclpvb218SGVhZGVyWm9vbUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmVhdHVyZSBhbGxvd3MgcmVjb3JkcyB3aGljaCBzYXRpc2Z5IGEgY2VydGFpbiBjb25kaXRpb24gdG8gYmUgbG9ja2VkIGF0IHRoZSB0b3Agb2YgdGhlIGdyaWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Mb2NrUm93cylcbiAgICAgKi9cbiAgICBsb2NrUm93c0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xHcmlkTG9ja1Jvd3N8R3JpZExvY2tSb3dzQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIG1lcmdlcyBjZWxscyB0aGF0IGhhdmUgdGhlIHNhbWUgdmFsdWUgaW4gc29ydGVkIChvciBbb3B0aW9uYWxseV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL01lcmdlQ2VsbHMjY29uZmlnLXNvcnRlZE9ubHkpIGFueSkgY29sdW1uc1xuICAgICAqIGNvbmZpZ3VyZWQgdG8gW21lcmdlQ2VsbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvY29sdW1uL0NvbHVtbiNjb25maWctbWVyZ2VDZWxscykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9NZXJnZUNlbGxzKVxuICAgICAqL1xuICAgIG1lcmdlQ2VsbHNGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8TWVyZ2VDZWxsc3xNZXJnZUNlbGxzQ29uZmlnXG4gICAgLyoqXG4gICAgICogRmVhdHVyZSB0aGF0IGFsbG93cyBzdHlsaW5nIG9mIHdlZWtlbmRzIChhbmQgb3RoZXIgbm9uLXdvcmtpbmcgdGltZSkgYnkgYWRkaW5nIHRpbWVSYW5nZXMgZm9yIHRob3NlIGRheXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci9mZWF0dXJlL05vbldvcmtpbmdUaW1lKVxuICAgICAqL1xuICAgIG5vbldvcmtpbmdUaW1lRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfE5vbldvcmtpbmdUaW1lfE5vbldvcmtpbmdUaW1lQ29uZmlnXG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIHNjaGVkdWxlcidzIHRpbWVsaW5lIHBhbm5hYmxlIGJ5IGRyYWdnaW5nIHdpdGggdGhlIG1vdXNlLiBUcnkgaXQgb3V0IGluIHRoZSBkZW1vIGJlbG93LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvZmVhdHVyZS9QYW4pXG4gICAgICovXG4gICAgcGFuRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFBhbnxQYW5Db25maWdcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgUERGL1BORyBmaWxlcyBmcm9tIHRoZSBHcmlkIGNvbXBvbmVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL2V4cG9ydC9QZGZFeHBvcnQpXG4gICAgICovXG4gICAgcGRmRXhwb3J0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyaWRQZGZFeHBvcnR8R3JpZFBkZkV4cG9ydENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyBwaW5uaW5nIGNvbHVtbnMgdG8gdGhlIHN0YXJ0IG9yIGVuZCByZWdpb24gb2YgdGhlIGdyaWQgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBzdWJHcmlkIGNvbmZpZ3VyYXRpb25zLlxuICAgICAqIFdoZW4gcGlubmluZyB0byBhIHJlZ2lvbiB0aGF0IGRvZXMgbm90IHlldCBleGlzdCwgdGhlIGZlYXR1cmUgY3JlYXRlcyB0aGUgcmVxdWlyZWQgc3ViR3JpZCBvbiB0aGUgZmx5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUGluQ29sdW1ucylcbiAgICAgKi9cbiAgICBwaW5Db2x1bW5zRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFBpbkNvbHVtbnN8UGluQ29sdW1uc0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyBwcmludGluZyBHcmlkIGNvbnRlbnRzIHVzaW5nIGJyb3dzZXIgcHJpbnQgZGlhbG9nLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvZXhwb3J0L1ByaW50KVxuICAgICAqL1xuICAgIHByaW50RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyaWRQcmludHxHcmlkUHJpbnRDb25maWdcbiAgICAvKipcbiAgICAgKiBGZWF0dXJlIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlYXJjaCBpbiBhIGNvbHVtbiBieSBmb2N1c2luZyBhIGNlbGwgYW5kIHR5cGluZy4gTmF2aWdhdGUgYmV0d2VlbiBoaXRzIHVzaW5nIHRoZVxuICAgICAqIGtleWJvYXJkLCBbZjNdIG9yIFtjdHJsXS9bY21kXSArIFtnXSBtb3ZlcyB0byBuZXh0LCBhbHNvIHByZXNzaW5nIFtzaGlmdF0gbW92ZXMgdG8gcHJldmlvdXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9RdWlja0ZpbmQpXG4gICAgICovXG4gICAgcXVpY2tGaW5kRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFF1aWNrRmluZHxRdWlja0ZpbmRDb25maWdcbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgc3BsaXR0ZXIgYmV0d2VlbiBncmlkIFtzZWN0aW9uc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC92aWV3L1N1YkdyaWQpIGRyYWdnYWJsZSwgdG8gbGV0IHVzZXJzIHJlc2l6ZSwgYW5kXG4gICAgICogY29sbGFwc2UvZXhwYW5kIHRoZSBzZWN0aW9ucy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1JlZ2lvblJlc2l6ZSlcbiAgICAgKi9cbiAgICByZWdpb25SZXNpemVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8UmVnaW9uUmVzaXplfFJlZ2lvblJlc2l6ZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFwcGxpY2FibGUgb25seSBmb3IgU2NoZWR1bGVyIGluIGB2ZXJ0aWNhbGAgbW9kZS4gUmlnaHQgY2xpY2sgcmVzb3VyY2UgaGVhZGVyIGNlbGxzIHRvIGRpc3BsYXkgYSBjb250ZXh0IG1lbnUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci9mZWF0dXJlL1Jlc291cmNlTWVudSlcbiAgICAgKi9cbiAgICByZXNvdXJjZU1lbnVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8UmVzb3VyY2VNZW51fFJlc291cmNlTWVudUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEZlYXR1cmUgdGhhdCBkcmF3cyByZXNvdXJjZSB0aW1lIHJhbmdlcywgc2hhZGVkIGFyZWFzIGRpc3BsYXllZCBiZWhpbmQgZXZlbnRzLiBUaGVzZSB6b25lcyBhcmUgc2ltaWxhciB0byBldmVudHMgaW5cbiAgICAgKiB0aGF0IHRoZXkgaGF2ZSBhIHN0YXJ0IGFuZCBlbmQgZGF0ZSBidXQgZGlmZmVyZW50IGluIHRoYXQgdGhleSBkbyBub3QgdGFrZSBwYXJ0IGluIHRoZSBldmVudCBsYXlvdXQsIGFuZCB0aGV5IGFsd2F5c1xuICAgICAqIG9jY3VweSBmdWxsIHJvdyBoZWlnaHQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci9mZWF0dXJlL1Jlc291cmNlVGltZVJhbmdlcylcbiAgICAgKi9cbiAgICByZXNvdXJjZVRpbWVSYW5nZXNGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8UmVzb3VyY2VUaW1lUmFuZ2VzfFJlc291cmNlVGltZVJhbmdlc0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93IHVzaW5nIFtDdHJsL0NNRCArIEMvWF0gYW5kIFtDdHJsL0NNRCArIFZdIHRvIGNvcHkvY3V0LWFuZC1wYXN0ZSByb3dzLiBBbHNvIG1ha2VzIGN1dCwgY29weSBhbmQgcGFzdGUgYWN0aW9uc1xuICAgICAqIGF2YWlsYWJsZSB2aWEgdGhlIGNlbGwgY29udGV4dCBtZW51LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUm93Q29weVBhc3RlKVxuICAgICAqL1xuICAgIHJvd0NvcHlQYXN0ZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xSb3dDb3B5UGFzdGV8Um93Q29weVBhc3RlQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIGFsbG93cyBlZGl0aW5nIG9mIGVudGlyZSByb3dzIGluIGEgZ3JpZCBpbiBhIGRvY2tlZCBwYW5lbCB3aGljaCBieSBkZWZhdWx0IHNsaWRlcyBvdXQgZnJvbSB0aGUgcmlnaHQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Sb3dFZGl0KVxuICAgICAqL1xuICAgIHJvd0VkaXRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Um93RWRpdHxSb3dFZGl0Q29uZmlnXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBleHBhbmRpbmcgb2YgR3JpZCByb3dzIGJ5IGVpdGhlciByb3cgY2xpY2sgb3IgZG91YmxlIGNsaWNrLCBvciBieSBhZGRpbmcgYSBzZXBhcmF0ZSBHcmlkIGNvbHVtbiB3aGljaCByZW5kZXJzXG4gICAgICogYSBidXR0b24gdGhhdCBleHBhbmRzIG9yIGNvbGxhcHNlcyB0aGUgcm93LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUm93RXhwYW5kZXIpXG4gICAgICovXG4gICAgcm93RXhwYW5kZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Um93RXhwYW5kZXJ8Um93RXhwYW5kZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGlzIGZlYXR1cmUgaW1wbGVtZW50cyBzdXBwb3J0IGZvciBwcm9qZWN0IHRyYW5zYWN0aW9ucyBhbmQgdXNlZCBieSBkZWZhdWx0IGluIEdhbnR0LiBGb3IgZ2VuZXJhbCBSb3dSZW9yZGVyIGZlYXR1cmVcbiAgICAgKiBkb2N1bWVudGF0aW9uIHNlZSBbUm93UmVvcmRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1Jvd1Jlb3JkZXIpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvZmVhdHVyZS9Sb3dSZW9yZGVyKVxuICAgICAqL1xuICAgIHJvd1Jlb3JkZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Um93UmVvcmRlcnxSb3dSZW9yZGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB1c2VyIHRvIGNoYW5nZSByb3cgaGVpZ2h0IGJ5IGRyYWdnaW5nIHRoZSBib3R0b20gcm93IGJvcmRlci4gQWZ0ZXIgYSByZXNpemUgb3BlcmF0aW9uLCB0aGUgW3Jvd0hlaWdodF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9kYXRhL0dyaWRSb3dNb2RlbCNmaWVsZC1yb3dIZWlnaHQpXG4gICAgICogZmllbGQgb2YgdGhlIHJlY29yZCBpcyB1cGRhdGVkICh3aGVuIFthcHBseVRvQWxsUm93c10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1Jvd1Jlc2l6ZSNjb25maWctYXBwbHlUb0FsbFJvd3MpIGlzIGBmYWxzZWApLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUm93UmVzaXplKVxuICAgICAqL1xuICAgIHJvd1Jlc2l6ZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xHcmlkUm93UmVzaXplfEdyaWRSb3dSZXNpemVDb25maWdcbiAgICAvKipcbiAgICAgKiBGZWF0dXJlIHRoYXQgZGlzcGxheXMgYSB0b29sdGlwIGNvbnRhaW5pbmcgdGhlIHRpbWUgYXQgdGhlIG1vdXNlIHBvc2l0aW9uIHdoZW4gaG92ZXJpbmcgZW1wdHkgcGFydHMgb2YgdGhlIHNjaGVkdWxlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvZmVhdHVyZS9TY2hlZHVsZVRvb2x0aXApXG4gICAgICovXG4gICAgc2NoZWR1bGVUb29sdGlwRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNjaGVkdWxlVG9vbHRpcHxTY2hlZHVsZVRvb2x0aXBDb25maWdcbiAgICAvKipcbiAgICAgKiA8ZGl2IGNsYXNzPVwiZXh0ZXJuYWwtZXhhbXBsZSB2ZXJ0aWNhbFwiIGRhdGEtZmlsZT1cIkdyaWQvZmVhdHVyZS9TZWFyY2guanNcIj48L2Rpdj5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1NlYXJjaClcbiAgICAgKi9cbiAgICBzZWFyY2hGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U2VhcmNofFNlYXJjaENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyBzb3J0aW5nIG9mIGdyaWQgYnkgY2xpY2tpbmcgKG9yIHRhcHBpbmcpIGhlYWRlcnMsIGFsc28gZGlzcGxheXMgd2hpY2ggY29sdW1ucyBncmlkIGlzIHNvcnRlZCBieSAobnVtYmVyZWQgaWZcbiAgICAgKiB1c2luZyBtdWx0aXNvcnQpLiBVc2UgbW9kaWZpZXIga2V5cyBmb3IgbXVsdGlzb3J0aW5nOiBbQ3RybC9DTUQgKyBjbGlja10gdG8gYWRkIHNvcnRlciwgW0N0cmwvQ01EICsgQWx0ICsgY2xpY2tdIHRvIHJlbW92ZSBzb3J0ZXIuXG4gICAgICogVGhlIGFjdHVhbCBzb3J0aW5nIGlzIGRvbmUgYnkgdGhlIHN0b3JlLCBzZWUgW1N0b3JlLnNvcnQoKV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS9kYXRhL21peGluL1N0b3JlU29ydCNmdW5jdGlvbi1zb3J0KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1NvcnQpXG4gICAgICovXG4gICAgc29ydEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTb3J0fFNvcnRDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGlzIGZlYXR1cmUgYWxsb3dzIHNwbGl0dGluZyB0aGUgU2NoZWR1bGVyIGludG8gbXVsdGlwbGUgdmlld3MsIGVpdGhlciBieSB1c2luZyB0aGUgY2VsbCBjb250ZXh0IG1lbnUsIG9yXG4gICAgICogcHJvZ3JhbW1hdGljYWxseSBieSBjYWxsaW5nIFtzcGxpdCgpXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvZmVhdHVyZS9TcGxpdCNmdW5jdGlvbi1zcGxpdCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci9mZWF0dXJlL1NwbGl0KVxuICAgICAqL1xuICAgIHNwbGl0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNwbGl0fFNwbGl0Q29uZmlnXG4gICAgLyoqXG4gICAgICogQSBmZWF0dXJlIHdoaWNoIHBpbnMgY29uZmlndXJhYmxlIGNvbnRlbnQgZnJvbSBhIGdyaWQgcm93IHRvIHRoZSB0b3Agb2YgdGhlIGdyaWRcbiAgICAgKiB3aGlsZSB0aGUgcm93IHNjcm9sbHMgb2ZmIHRoZSB0b3AgYnV0IGlzIHN0aWxsIHZpc2libGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9TdGlja3lDZWxscylcbiAgICAgKi9cbiAgICBzdGlja3lDZWxsc0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTdGlja3lDZWxsc3xTdGlja3lDZWxsc0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFN0cmlwZXMgcm93cyBieSBhZGRpbmcgYWx0ZXJuYXRpbmcgQ1NTIGNsYXNzZXMgdG8gYWxsIHJvdyBlbGVtZW50cyAoYGItZXZlbmAgYW5kIGBiLW9kZGApLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvU3RyaXBlKVxuICAgICAqL1xuICAgIHN0cmlwZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTdHJpcGV8U3RyaXBlQ29uZmlnXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsIHZlcnNpb24gb2YgdGhlIEdyaWQgU3VtbWFyeSBmZWF0dXJlLiBUaGlzIGZlYXR1cmUgZGlzcGxheXMgYSBzdW1tYXJ5IHJvdyBpbiB0aGUgZ3JpZCBmb290ZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci9mZWF0dXJlL1N1bW1hcnkpXG4gICAgICovXG4gICAgc3VtbWFyeUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTdW1tYXJ5fFN1bW1hcnlDb25maWdcbiAgICAvKipcbiAgICAgKiBBZGRzIHNjaGVkdWxlciBzcGVjaWZpYyBtZW51IGl0ZW1zIHRvIHRoZSB0aW1lbGluZSBoZWFkZXIgY29udGV4dCBtZW51LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvZmVhdHVyZS9UaW1lQXhpc0hlYWRlck1lbnUpXG4gICAgICovXG4gICAgdGltZUF4aXNIZWFkZXJNZW51RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRpbWVBeGlzSGVhZGVyTWVudXxUaW1lQXhpc0hlYWRlck1lbnVDb25maWdcbiAgICAvKipcbiAgICAgKiBGZWF0dXJlIHRoYXQgcmVuZGVycyBnbG9iYWwgcmFuZ2VzIG9mIHRpbWUgaW4gdGhlIHRpbWVsaW5lLiBVc2UgdGhpcyBmZWF0dXJlIHRvIHZpc3VhbGl6ZSBhIGByYW5nZWAgbGlrZSBhIDEgaHIgbHVuY2hcbiAgICAgKiBvciBzb21lIGltcG9ydGFudCBwb2ludCBpbiB0aW1lIChhIGBsaW5lYCwgaS5lLiBhIHJhbmdlIHdpdGggMCBkdXJhdGlvbikuIFRoaXMgZmVhdHVyZSBjYW4gYWxzbyBzaG93IGEgY3VycmVudCB0aW1lXG4gICAgICogaW5kaWNhdG9yIGlmIHlvdSBzZXQgW3Nob3dDdXJyZW50VGltZUxpbmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci9mZWF0dXJlL1RpbWVSYW5nZXMjY29uZmlnLXNob3dDdXJyZW50VGltZUxpbmUpIHRvIHRydWUuIFRvIHN0eWxlIHRoZSByZW5kZXJlZCBlbGVtZW50cywgdXNlIHRoZVxuICAgICAqIFtjbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9UaW1lU3BhbiNmaWVsZC1jbHMpIGZpZWxkIG9mIHRoZSBgVGltZVNwYW5gIGNsYXNzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvZmVhdHVyZS9UaW1lUmFuZ2VzKVxuICAgICAqL1xuICAgIHRpbWVSYW5nZXNGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8VGltZVJhbmdlc3xUaW1lUmFuZ2VzQ29uZmlnXG4gICAgLyoqXG4gICAgICogRmVhdHVyZSB0aGF0IG1ha2VzIHRoZSBncmlkIHdvcmsgbW9yZSBsaWtlIGEgdHJlZS4gSW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBbVHJlZUdyaWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvdmlldy9UcmVlR3JpZCkuIFJlcXVpcmVzXG4gICAgICogZXhhY3RseSBvbmUgW1RyZWVDb2x1bW5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvY29sdW1uL1RyZWVDb2x1bW4pIGFtb25nIGdyaWRzIGNvbHVtbnMuIFRoYXQgY29sdW1uIHdpbGwgaGF2ZSBpdHMgcmVuZGVyZXIgcmVwbGFjZWQgd2l0aCBhXG4gICAgICogdHJlZSByZW5kZXJlciB0aGF0IGFkZHMgcGFkZGluZyBhbmQgaWNvbiB0byBnaXZlIHRoZSBhcHBlYXJhbmNlIG9mIGEgdHJlZS4gVGhlIG9yaWdpbmFsIHJlbmRlcmVyIGlzIHByZXNlcnZlZCBhbmRcbiAgICAgKiBhbHNvIGNhbGxlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1RyZWUpXG4gICAgICovXG4gICAgdHJlZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUcmVlfFRyZWVDb25maWdcbiAgICAvKipcbiAgICAgKiBBIGZlYXR1cmUgdGhhdCBhbGxvd3MgdHJhbnNmb3JtaW5nIGEgZmxhdCBkYXRhc2V0IChvciB0aGUgbGVhdmVzIG9mIGEgaGllcmFyY2hpY2FsKSBpbnRvIGEgdHJlZSBieSBzcGVjaWZ5aW5nIGFcbiAgICAgKiByZWNvcmQgZmllbGQgcGVyIHBhcmVudCBsZXZlbC4gUGFyZW50cyBhcmUgZ2VuZXJhdGVkIGJhc2VkIG9uIGVhY2ggbGVhZidzIHZhbHVlIGZvciB0aG9zZSBmaWVsZHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9UcmVlR3JvdXApXG4gICAgICovXG4gICAgdHJlZUdyb3VwRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRyZWVHcm91cHxUcmVlR3JvdXBDb25maWdcblxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciA6ICdicnludHVtLXRpbWVsaW5lLWhpc3RvZ3JhbScsXG4gICAgdGVtcGxhdGUgOiAnJ1xufSlcbmV4cG9ydCBjbGFzcyBCcnludHVtVGltZWxpbmVIaXN0b2dyYW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlQ2xhc3MgPSBUaW1lbGluZUhpc3RvZ3JhbTtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VOYW1lID0gJ1RpbWVsaW5lSGlzdG9ncmFtJztcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1FdmVudHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAnb25CZWZvcmVBc3NpZ25tZW50RGVsZXRlJyxcbiAgICAgICAgJ29uQmVmb3JlQ2FuY2VsQ2VsbEVkaXQnLFxuICAgICAgICAnb25CZWZvcmVDYW5jZWxSb3dFZGl0JyxcbiAgICAgICAgJ29uQmVmb3JlQ2VsbEVkaXRTdGFydCcsXG4gICAgICAgICdvbkJlZm9yZUNlbGxSYW5nZURlbGV0ZScsXG4gICAgICAgICdvbkJlZm9yZUNlbGxSYW5nZUVkaXQnLFxuICAgICAgICAnb25CZWZvcmVDb2x1bW5EcmFnU3RhcnQnLFxuICAgICAgICAnb25CZWZvcmVDb2x1bW5Ecm9wRmluYWxpemUnLFxuICAgICAgICAnb25CZWZvcmVDb2x1bW5SZXNpemUnLFxuICAgICAgICAnb25CZWZvcmVDb3B5JyxcbiAgICAgICAgJ29uQmVmb3JlQ1NWRXhwb3J0JyxcbiAgICAgICAgJ29uQmVmb3JlRGVzdHJveScsXG4gICAgICAgICdvbkJlZm9yZUV2ZW50RGVsZXRlJyxcbiAgICAgICAgJ29uQmVmb3JlRXhjZWxFeHBvcnQnLFxuICAgICAgICAnb25CZWZvcmVGaWxsSGFuZGxlRHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uQmVmb3JlRmluaXNoQ2VsbEVkaXQnLFxuICAgICAgICAnb25CZWZvcmVGaW5pc2hSb3dFZGl0JyxcbiAgICAgICAgJ29uQmVmb3JlSGlkZScsXG4gICAgICAgICdvbkJlZm9yZUhpc3RvZ3JhbURhdGFDYWNoZVNldCcsXG4gICAgICAgICdvbkJlZm9yZVBhbicsXG4gICAgICAgICdvbkJlZm9yZVBhc3RlJyxcbiAgICAgICAgJ29uQmVmb3JlUGRmRXhwb3J0JyxcbiAgICAgICAgJ29uQmVmb3JlUHJlc2V0Q2hhbmdlJyxcbiAgICAgICAgJ29uQmVmb3JlUmVuZGVySGlzdG9ncmFtUm93JyxcbiAgICAgICAgJ29uQmVmb3JlUmVuZGVyUmVjb3JkSGlzdG9ncmFtJyxcbiAgICAgICAgJ29uQmVmb3JlUmVuZGVyUm93JyxcbiAgICAgICAgJ29uQmVmb3JlUmVuZGVyUm93cycsXG4gICAgICAgICdvbkJlZm9yZVJvd0NvbGxhcHNlJyxcbiAgICAgICAgJ29uQmVmb3JlUm93RXhwYW5kJyxcbiAgICAgICAgJ29uQmVmb3JlU2VsZWN0aW9uQ2hhbmdlJyxcbiAgICAgICAgJ29uQmVmb3JlU2V0UmVjb3JkJyxcbiAgICAgICAgJ29uQmVmb3JlU2hvdycsXG4gICAgICAgICdvbkJlZm9yZVN0YXJ0Um93RWRpdCcsXG4gICAgICAgICdvbkJlZm9yZVN0YXRlQXBwbHknLFxuICAgICAgICAnb25CZWZvcmVTdGF0ZVNhdmUnLFxuICAgICAgICAnb25CZWZvcmVUb2dnbGVHcm91cCcsXG4gICAgICAgICdvbkJlZm9yZVRvZ2dsZU5vZGUnLFxuICAgICAgICAnb25DYW5jZWxDZWxsRWRpdCcsXG4gICAgICAgICdvbkNhdGNoQWxsJyxcbiAgICAgICAgJ29uQ2VsbENsaWNrJyxcbiAgICAgICAgJ29uQ2VsbENvbnRleHRNZW51JyxcbiAgICAgICAgJ29uQ2VsbERibENsaWNrJyxcbiAgICAgICAgJ29uQ2VsbE1lbnVCZWZvcmVTaG93JyxcbiAgICAgICAgJ29uQ2VsbE1lbnVJdGVtJyxcbiAgICAgICAgJ29uQ2VsbE1lbnVTaG93JyxcbiAgICAgICAgJ29uQ2VsbE1lbnVUb2dnbGVJdGVtJyxcbiAgICAgICAgJ29uQ2VsbE1vdXNlRW50ZXInLFxuICAgICAgICAnb25DZWxsTW91c2VMZWF2ZScsXG4gICAgICAgICdvbkNlbGxNb3VzZU91dCcsXG4gICAgICAgICdvbkNlbGxNb3VzZU92ZXInLFxuICAgICAgICAnb25Db2xsYXBzZScsXG4gICAgICAgICdvbkNvbGxhcHNlTm9kZScsXG4gICAgICAgICdvbkNvbHVtbkRyYWcnLFxuICAgICAgICAnb25Db2x1bW5EcmFnU3RhcnQnLFxuICAgICAgICAnb25Db2x1bW5Ecm9wJyxcbiAgICAgICAgJ29uQ29sdW1uUmVzaXplJyxcbiAgICAgICAgJ29uQ29sdW1uUmVzaXplU3RhcnQnLFxuICAgICAgICAnb25Db250ZXh0TWVudUl0ZW0nLFxuICAgICAgICAnb25Db250ZXh0TWVudVRvZ2dsZUl0ZW0nLFxuICAgICAgICAnb25Db3B5JyxcbiAgICAgICAgJ29uQ3VycmVudFRpbWVsaW5lVXBkYXRlJyxcbiAgICAgICAgJ29uRGF0YUNoYW5nZScsXG4gICAgICAgICdvbkRhdGVSYW5nZUNoYW5nZScsXG4gICAgICAgICdvbkRlc3Ryb3knLFxuICAgICAgICAnb25EaXJ0eVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uRHJhZ1NlbGVjdGluZycsXG4gICAgICAgICdvbkVsZW1lbnRDcmVhdGVkJyxcbiAgICAgICAgJ29uRXhwYW5kJyxcbiAgICAgICAgJ29uRXhwYW5kTm9kZScsXG4gICAgICAgICdvbkZpbGVEcm9wJyxcbiAgICAgICAgJ29uRmlsbEhhbmRsZUJlZm9yZURyYWdGaW5hbGl6ZScsXG4gICAgICAgICdvbkZpbGxIYW5kbGVEcmFnJyxcbiAgICAgICAgJ29uRmlsbEhhbmRsZURyYWdBYm9ydCcsXG4gICAgICAgICdvbkZpbGxIYW5kbGVEcmFnRW5kJyxcbiAgICAgICAgJ29uRmlsbEhhbmRsZURyYWdTdGFydCcsXG4gICAgICAgICdvbkZpbmlzaENlbGxFZGl0JyxcbiAgICAgICAgJ29uRmluaXNoUm93RWRpdCcsXG4gICAgICAgICdvbkZvY3VzSW4nLFxuICAgICAgICAnb25Gb2N1c091dCcsXG4gICAgICAgICdvbkdyaWRSb3dCZWZvcmVEcmFnU3RhcnQnLFxuICAgICAgICAnb25HcmlkUm93QmVmb3JlRHJvcEZpbmFsaXplJyxcbiAgICAgICAgJ29uR3JpZFJvd0RyYWcnLFxuICAgICAgICAnb25HcmlkUm93RHJhZ0Fib3J0JyxcbiAgICAgICAgJ29uR3JpZFJvd0RyYWdTdGFydCcsXG4gICAgICAgICdvbkdyaWRSb3dEcm9wJyxcbiAgICAgICAgJ29uSGVhZGVyQ2xpY2snLFxuICAgICAgICAnb25IZWFkZXJNZW51QmVmb3JlU2hvdycsXG4gICAgICAgICdvbkhlYWRlck1lbnVJdGVtJyxcbiAgICAgICAgJ29uSGVhZGVyTWVudVNob3cnLFxuICAgICAgICAnb25IZWFkZXJNZW51VG9nZ2xlSXRlbScsXG4gICAgICAgICdvbkhpZGUnLFxuICAgICAgICAnb25IaXN0b2dyYW1EYXRhQ2FjaGVTZXQnLFxuICAgICAgICAnb25Mb2NrUm93cycsXG4gICAgICAgICdvbk1vdXNlT3V0JyxcbiAgICAgICAgJ29uTW91c2VPdmVyJyxcbiAgICAgICAgJ29uTm9ab29tQ2hhbmdlJyxcbiAgICAgICAgJ29uUGFpbnQnLFxuICAgICAgICAnb25QYXN0ZScsXG4gICAgICAgICdvblBkZkV4cG9ydCcsXG4gICAgICAgICdvblByZXNldENoYW5nZScsXG4gICAgICAgICdvblJlYWRPbmx5JyxcbiAgICAgICAgJ29uUmVjb21wb3NlJyxcbiAgICAgICAgJ29uUmVuZGVyUm93JyxcbiAgICAgICAgJ29uUmVuZGVyUm93cycsXG4gICAgICAgICdvblJlc2l6ZScsXG4gICAgICAgICdvblJlc291cmNlTWVudUJlZm9yZVNob3cnLFxuICAgICAgICAnb25SZXNvdXJjZU1lbnVJdGVtJyxcbiAgICAgICAgJ29uUmVzb3VyY2VNZW51U2hvdycsXG4gICAgICAgICdvblJlc291cmNlTWVudVRvZ2dsZUl0ZW0nLFxuICAgICAgICAnb25SZXNvdXJjZVRpbWVSYW5nZUNsaWNrJyxcbiAgICAgICAgJ29uUmVzb3VyY2VUaW1lUmFuZ2VDb250ZXh0TWVudScsXG4gICAgICAgICdvblJlc291cmNlVGltZVJhbmdlRGJsQ2xpY2snLFxuICAgICAgICAnb25SZXNvdXJjZVRpbWVSYW5nZU1vdXNlRG93bicsXG4gICAgICAgICdvblJlc291cmNlVGltZVJhbmdlTW91c2VPdXQnLFxuICAgICAgICAnb25SZXNvdXJjZVRpbWVSYW5nZU1vdXNlT3ZlcicsXG4gICAgICAgICdvblJlc291cmNlVGltZVJhbmdlTW91c2VVcCcsXG4gICAgICAgICdvblJlc3BvbnNpdmUnLFxuICAgICAgICAnb25Sb3dDb2xsYXBzZScsXG4gICAgICAgICdvblJvd0V4cGFuZCcsXG4gICAgICAgICdvblJvd01vdXNlRW50ZXInLFxuICAgICAgICAnb25Sb3dNb3VzZUxlYXZlJyxcbiAgICAgICAgJ29uU2Nyb2xsJyxcbiAgICAgICAgJ29uU2VsZWN0aW9uQ2hhbmdlJyxcbiAgICAgICAgJ29uU2VsZWN0aW9uTW9kZUNoYW5nZScsXG4gICAgICAgICdvblNob3cnLFxuICAgICAgICAnb25TcGxpdCcsXG4gICAgICAgICdvblNwbGl0dGVyQ29sbGFwc2VDbGljaycsXG4gICAgICAgICdvblNwbGl0dGVyRHJhZ0VuZCcsXG4gICAgICAgICdvblNwbGl0dGVyRHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uU3BsaXR0ZXJFeHBhbmRDbGljaycsXG4gICAgICAgICdvblN0YXJ0Q2VsbEVkaXQnLFxuICAgICAgICAnb25TdGFydFJvd0VkaXQnLFxuICAgICAgICAnb25TdWJHcmlkQ29sbGFwc2UnLFxuICAgICAgICAnb25TdWJHcmlkRXhwYW5kJyxcbiAgICAgICAgJ29uVGlja1NpemVDaGFuZ2UnLFxuICAgICAgICAnb25UaW1lQXhpc0NoYW5nZScsXG4gICAgICAgICdvblRpbWVBeGlzSGVhZGVyQ2xpY2snLFxuICAgICAgICAnb25UaW1lQXhpc0hlYWRlckNvbnRleHRNZW51JyxcbiAgICAgICAgJ29uVGltZUF4aXNIZWFkZXJEYmxDbGljaycsXG4gICAgICAgICdvblRpbWVBeGlzSGVhZGVyTWVudUJlZm9yZVNob3cnLFxuICAgICAgICAnb25UaW1lQXhpc0hlYWRlck1lbnVJdGVtJyxcbiAgICAgICAgJ29uVGltZUF4aXNIZWFkZXJNZW51U2hvdycsXG4gICAgICAgICdvblRpbWVsaW5lQ29udGV4dENoYW5nZScsXG4gICAgICAgICdvblRpbWVsaW5lVmlld3BvcnRSZXNpemUnLFxuICAgICAgICAnb25UaW1lUmFuZ2VIZWFkZXJDbGljaycsXG4gICAgICAgICdvblRpbWVSYW5nZUhlYWRlckNvbnRleHRNZW51JyxcbiAgICAgICAgJ29uVGltZVJhbmdlSGVhZGVyRGJsQ2xpY2snLFxuICAgICAgICAnb25Ub2dnbGVHcm91cCcsXG4gICAgICAgICdvblRvZ2dsZU5vZGUnLFxuICAgICAgICAnb25Ub29sQ2xpY2snLFxuICAgICAgICAnb25VbmxvY2tSb3dzJyxcbiAgICAgICAgJ29uVW5zcGxpdCcsXG4gICAgICAgICdvblZpc2libGVEYXRlUmFuZ2VDaGFuZ2UnXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1GZWF0dXJlTmFtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAnYWlGaWx0ZXJGZWF0dXJlJyxcbiAgICAgICAgJ2NlbGxDb3B5UGFzdGVGZWF0dXJlJyxcbiAgICAgICAgJ2NlbGxFZGl0RmVhdHVyZScsXG4gICAgICAgICdjZWxsTWVudUZlYXR1cmUnLFxuICAgICAgICAnY2VsbFRvb2x0aXBGZWF0dXJlJyxcbiAgICAgICAgJ2NoYXJ0c0ZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uQXV0b1dpZHRoRmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5EcmFnVG9vbGJhckZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uTGluZXNGZWF0dXJlJyxcbiAgICAgICAgJ2NvbHVtblBpY2tlckZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uUmVuYW1lRmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5SZW9yZGVyRmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5SZXNpemVGZWF0dXJlJyxcbiAgICAgICAgJ2V4Y2VsRXhwb3J0ZXJGZWF0dXJlJyxcbiAgICAgICAgJ2ZpbGVEcm9wRmVhdHVyZScsXG4gICAgICAgICdmaWxsSGFuZGxlRmVhdHVyZScsXG4gICAgICAgICdmaWx0ZXJGZWF0dXJlJyxcbiAgICAgICAgJ2ZpbHRlckJhckZlYXR1cmUnLFxuICAgICAgICAnZ3JvdXBGZWF0dXJlJyxcbiAgICAgICAgJ2dyb3VwU3VtbWFyeUZlYXR1cmUnLFxuICAgICAgICAnaGVhZGVyTWVudUZlYXR1cmUnLFxuICAgICAgICAnaGVhZGVyWm9vbUZlYXR1cmUnLFxuICAgICAgICAnbG9ja1Jvd3NGZWF0dXJlJyxcbiAgICAgICAgJ21lcmdlQ2VsbHNGZWF0dXJlJyxcbiAgICAgICAgJ25vbldvcmtpbmdUaW1lRmVhdHVyZScsXG4gICAgICAgICdwYW5GZWF0dXJlJyxcbiAgICAgICAgJ3BkZkV4cG9ydEZlYXR1cmUnLFxuICAgICAgICAncGluQ29sdW1uc0ZlYXR1cmUnLFxuICAgICAgICAncHJpbnRGZWF0dXJlJyxcbiAgICAgICAgJ3F1aWNrRmluZEZlYXR1cmUnLFxuICAgICAgICAncmVnaW9uUmVzaXplRmVhdHVyZScsXG4gICAgICAgICdyZXNvdXJjZU1lbnVGZWF0dXJlJyxcbiAgICAgICAgJ3Jlc291cmNlVGltZVJhbmdlc0ZlYXR1cmUnLFxuICAgICAgICAncm93Q29weVBhc3RlRmVhdHVyZScsXG4gICAgICAgICdyb3dFZGl0RmVhdHVyZScsXG4gICAgICAgICdyb3dFeHBhbmRlckZlYXR1cmUnLFxuICAgICAgICAncm93UmVvcmRlckZlYXR1cmUnLFxuICAgICAgICAncm93UmVzaXplRmVhdHVyZScsXG4gICAgICAgICdzY2hlZHVsZVRvb2x0aXBGZWF0dXJlJyxcbiAgICAgICAgJ3NlYXJjaEZlYXR1cmUnLFxuICAgICAgICAnc29ydEZlYXR1cmUnLFxuICAgICAgICAnc3BsaXRGZWF0dXJlJyxcbiAgICAgICAgJ3N0aWNreUNlbGxzRmVhdHVyZScsXG4gICAgICAgICdzdHJpcGVGZWF0dXJlJyxcbiAgICAgICAgJ3N1bW1hcnlGZWF0dXJlJyxcbiAgICAgICAgJ3RpbWVBeGlzSGVhZGVyTWVudUZlYXR1cmUnLFxuICAgICAgICAndGltZVJhbmdlc0ZlYXR1cmUnLFxuICAgICAgICAndHJlZUZlYXR1cmUnLFxuICAgICAgICAndHJlZUdyb3VwRmVhdHVyZSdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3M6IHN0cmluZ1tdID0gQnJ5bnR1bVRpbWVsaW5lSGlzdG9ncmFtQ29tcG9uZW50LmJyeW50dW1GZWF0dXJlTmFtZXMuY29uY2F0KFtcbiAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgJ2FnZ3JlZ2F0ZURhdGFFbnRyeScsXG4gICAgICAgICdhZ2dyZWdhdGVIaXN0b2dyYW1EYXRhRm9yR3JvdXBzJyxcbiAgICAgICAgJ2FsaWduU2VsZicsXG4gICAgICAgICdhbmltYXRlRmlsdGVyUmVtb3ZhbHMnLFxuICAgICAgICAnYW5pbWF0ZVJlbW92aW5nUm93cycsXG4gICAgICAgICdhbmltYXRlVHJlZU5vZGVUb2dnbGUnLFxuICAgICAgICAnYXBwZW5kVG8nLFxuICAgICAgICAnYXJpYURlc2NyaXB0aW9uJyxcbiAgICAgICAgJ2FyaWFMYWJlbCcsXG4gICAgICAgICdhdXRvQWRqdXN0VGltZUF4aXMnLFxuICAgICAgICAnYXV0b0hlaWdodCcsXG4gICAgICAgICdiYXJNYXJnaW4nLFxuICAgICAgICAnYmFyVG9vbHRpcFRlbXBsYXRlJyxcbiAgICAgICAgJ2JiYXInLFxuICAgICAgICAnYm9keUNscycsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnYnVmZmVyQ29lZicsXG4gICAgICAgICdidWZmZXJUaHJlc2hvbGQnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2NhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucycsXG4gICAgICAgICdjZWxsRWxsaXBzaXMnLFxuICAgICAgICAnY2xzJyxcbiAgICAgICAgJ2NvbGxhcHNlZCcsXG4gICAgICAgICdjb2xsYXBzaWJsZScsXG4gICAgICAgICdjb2xvcicsXG4gICAgICAgICdjb2x1bW4nLFxuICAgICAgICAnY29sdW1uTGluZXMnLFxuICAgICAgICAnY29sdW1ucycsXG4gICAgICAgICdjb25maWcnLFxuICAgICAgICAnY29udGVudEVsZW1lbnRDbHMnLFxuICAgICAgICAnY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQnLFxuICAgICAgICAnZGF0YScsXG4gICAgICAgICdkYXRhRmllbGQnLFxuICAgICAgICAnZGF0YU1vZGVsRmllbGQnLFxuICAgICAgICAnZGF0YXNldCcsXG4gICAgICAgICdkZWZhdWx0UmVnaW9uJyxcbiAgICAgICAgJ2Rlc3Ryb3lTdG9yZScsXG4gICAgICAgICdkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzJyxcbiAgICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgICAgJ2Rpc2FibGVHcmlkQ29sdW1uSWRXYXJuaW5nJyxcbiAgICAgICAgJ2Rpc2FibGVHcmlkUm93TW9kZWxXYXJuaW5nJyxcbiAgICAgICAgJ2Rpc3BsYXlEYXRlRm9ybWF0JyxcbiAgICAgICAgJ2RvY2snLFxuICAgICAgICAnZHJhd2VyJyxcbiAgICAgICAgJ2R1cmF0aW9uRGlzcGxheVByZWNpc2lvbicsXG4gICAgICAgICdlbGVtZW50QXR0cmlidXRlcycsXG4gICAgICAgICdlbXB0eVRleHQnLFxuICAgICAgICAnZW5hYmxlRXZlbnRBbmltYXRpb25zJyxcbiAgICAgICAgJ2VuYWJsZVJlY3VycmluZ0V2ZW50cycsXG4gICAgICAgICdlbmFibGVTdGlja3knLFxuICAgICAgICAnZW5hYmxlVGV4dFNlbGVjdGlvbicsXG4gICAgICAgICdlbmFibGVVbmRvUmVkb0tleXMnLFxuICAgICAgICAnZW5kRGF0ZScsXG4gICAgICAgICdldmVudENvbG9yJyxcbiAgICAgICAgJ2V2ZW50U3R5bGUnLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZpbGxMYXN0Q29sdW1uJyxcbiAgICAgICAgJ2ZpbGxUaWNrcycsXG4gICAgICAgICdmaXhlZFJvd0hlaWdodCcsXG4gICAgICAgICdmbGV4JyxcbiAgICAgICAgJ2Zvb3RlcicsXG4gICAgICAgICdmb3JjZUZpdCcsXG4gICAgICAgICdmb3JtdWxhUHJvdmlkZXJzJyxcbiAgICAgICAgJ2Z1bGxSb3dSZWZyZXNoJyxcbiAgICAgICAgJ2dldEJhckNsYXNzJyxcbiAgICAgICAgJ2dldEJhckRPTUNvbmZpZycsXG4gICAgICAgICdnZXRCYXJUZXh0JyxcbiAgICAgICAgJ2dldEJhclRleHRET01Db25maWcnLFxuICAgICAgICAnZ2V0RGF0YUVudHJ5Rm9yQWdncmVnYXRpbmcnLFxuICAgICAgICAnZ2V0T3V0bGluZUNsYXNzJyxcbiAgICAgICAgJ2dldE91dGxpbmVET01Db25maWcnLFxuICAgICAgICAnZ2V0UmVjb3JkRGF0YScsXG4gICAgICAgICdnZXRSb3dIZWlnaHQnLFxuICAgICAgICAnaGFyZFJlZnJlc2hPblRpbWVBeGlzUmVjb25maWd1cmUnLFxuICAgICAgICAnaGVhZGVyJyxcbiAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICdoaWRkZW4nLFxuICAgICAgICAnaGlkZUZvb3RlcnMnLFxuICAgICAgICAnaGlkZUhlYWRlcnMnLFxuICAgICAgICAnaGlkZUhvcml6b250YWxTY3JvbGxiYXInLFxuICAgICAgICAnaGlkZVJvd0hvdmVyJyxcbiAgICAgICAgJ2hpc3RvZ3JhbVdpZGdldCcsXG4gICAgICAgICdoaXN0b2dyYW1XaWRnZXRDbGFzcycsXG4gICAgICAgICdob3ZlckNscycsXG4gICAgICAgICdpY29uJyxcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ2lnbm9yZURvbUV2ZW50c1doaWxlU2Nyb2xsaW5nJyxcbiAgICAgICAgJ2lnbm9yZVBhcmVudFJlYWRPbmx5JyxcbiAgICAgICAgJ2luZmluaXRlU2Nyb2xsJyxcbiAgICAgICAgJ2luaXRBZ2dyZWdhdGVkRGF0YUVudHJ5JyxcbiAgICAgICAgJ2lucHV0RmllbGRBbGlnbicsXG4gICAgICAgICdpbnNlcnRCZWZvcmUnLFxuICAgICAgICAnaW5zZXJ0Rmlyc3QnLFxuICAgICAgICAna2V5TWFwJyxcbiAgICAgICAgJ2xhYmVsUG9zaXRpb24nLFxuICAgICAgICAnbGlzdGVuZXJzJyxcbiAgICAgICAgJ2xvYWRNYXNrJyxcbiAgICAgICAgJ2xvYWRNYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbG9hZE1hc2tFcnJvcicsXG4gICAgICAgICdsb2NhbGl6YWJsZScsXG4gICAgICAgICdsb25nUHJlc3NUaW1lJyxcbiAgICAgICAgJ21hbmFnZWRFdmVudFNpemluZycsXG4gICAgICAgICdtYXJnaW4nLFxuICAgICAgICAnbWFza0RlZmF1bHRzJyxcbiAgICAgICAgJ21hc2tlZCcsXG4gICAgICAgICdtYXhEYXRlJyxcbiAgICAgICAgJ21heEhlaWdodCcsXG4gICAgICAgICdtYXhUaW1lQXhpc1VuaXQnLFxuICAgICAgICAnbWF4V2lkdGgnLFxuICAgICAgICAnbWF4Wm9vbUxldmVsJyxcbiAgICAgICAgJ21pbkRhdGUnLFxuICAgICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICAgJ21pbldpZHRoJyxcbiAgICAgICAgJ21pblpvb21MZXZlbCcsXG4gICAgICAgICdtb25pdG9yUmVzaXplJyxcbiAgICAgICAgJ293bmVyJyxcbiAgICAgICAgJ3BhcnRuZXInLFxuICAgICAgICAncGx1Z2lucycsXG4gICAgICAgICdwcmVzZXJ2ZUZvY3VzT25EYXRhc2V0Q2hhbmdlJyxcbiAgICAgICAgJ3ByZXNlcnZlU2Nyb2xsJyxcbiAgICAgICAgJ3ByZXNlcnZlU2Nyb2xsT25EYXRhc2V0Q2hhbmdlJyxcbiAgICAgICAgJ3ByZXNldHMnLFxuICAgICAgICAncHJldmVudFRvb2x0aXBPblRvdWNoJyxcbiAgICAgICAgJ3JlYWRPbmx5JyxcbiAgICAgICAgJ3JlY3VycmVuY2VDb25maXJtYXRpb25Qb3B1cCcsXG4gICAgICAgICdyZWxheVN0b3JlRXZlbnRzJyxcbiAgICAgICAgJ3JlbmRpdGlvbicsXG4gICAgICAgICdyZXNpemFibGUnLFxuICAgICAgICAncmVzaXplVG9GaXRJbmNsdWRlc0hlYWRlcicsXG4gICAgICAgICdyZXNvdXJjZVRpbWVSYW5nZVJlbmRlcmVyJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVMZXZlbHMnLFxuICAgICAgICAncmlwcGxlJyxcbiAgICAgICAgJ3Jvb3RFbGVtZW50JyxcbiAgICAgICAgJ3Jvd0hlaWdodCcsXG4gICAgICAgICdyb3dMaW5lcycsXG4gICAgICAgICdydGwnLFxuICAgICAgICAnc2NhbGVDb2x1bW4nLFxuICAgICAgICAnc2NhbGVQb2ludHMnLFxuICAgICAgICAnc2Nyb2xsYWJsZScsXG4gICAgICAgICdzY3JvbGxlckNsYXNzJyxcbiAgICAgICAgJ3Njcm9sbE1hbmFnZXInLFxuICAgICAgICAnc2VsZWN0aW9uTW9kZScsXG4gICAgICAgICdzZXJpZXMnLFxuICAgICAgICAnc2hvd0JhclRpcCcsXG4gICAgICAgICdzaG93QmFyVGlwV2hlbk5hdmlnYXRpbmdUaW1lQXhpcycsXG4gICAgICAgICdzaG93RGlydHknLFxuICAgICAgICAnc25hcCcsXG4gICAgICAgICdzbmFwUmVsYXRpdmVUb0V2ZW50U3RhcnREYXRlJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3RhcnREYXRlJyxcbiAgICAgICAgJ3N0YXRlZnVsJyxcbiAgICAgICAgJ3N0YXRlZnVsRXZlbnRzJyxcbiAgICAgICAgJ3N0YXRlSWQnLFxuICAgICAgICAnc3RhdGVQcm92aWRlcicsXG4gICAgICAgICdzdGF0ZVNldHRpbmdzJyxcbiAgICAgICAgJ3N0aWNreUhlYWRlcnMnLFxuICAgICAgICAnc3RvcmUnLFxuICAgICAgICAnc3RyaXBzJyxcbiAgICAgICAgJ3N1YkdyaWRDb25maWdzJyxcbiAgICAgICAgJ3N1cHByZXNzRml0JyxcbiAgICAgICAgJ3N5bmNNYXNrJyxcbiAgICAgICAgJ3RhYicsXG4gICAgICAgICd0YWJCYXJJdGVtcycsXG4gICAgICAgICd0YmFyJyxcbiAgICAgICAgJ3RpY2tTaXplJyxcbiAgICAgICAgJ3RpbWVBeGlzJyxcbiAgICAgICAgJ3RpbWVSZXNvbHV0aW9uJyxcbiAgICAgICAgJ3RpbWVab25lJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ3Rvb2xzJyxcbiAgICAgICAgJ3RyYW5zaXRpb24nLFxuICAgICAgICAndHJhbnNpdGlvbkR1cmF0aW9uJyxcbiAgICAgICAgJ3R5cGUnLFxuICAgICAgICAndWknLFxuICAgICAgICAndmlld1ByZXNldCcsXG4gICAgICAgICd2aXNpYmxlRGF0ZScsXG4gICAgICAgICd2aXNpYmxlWm9vbUZhY3RvcicsXG4gICAgICAgICd3ZWVrU3RhcnREYXknLFxuICAgICAgICAnd2VpZ2h0JyxcbiAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgJ3dvcmtpbmdUaW1lJyxcbiAgICAgICAgJ3pvb21LZWVwc09yaWdpbmFsVGltZXNwYW4nLFxuICAgICAgICAnem9vbU9uTW91c2VXaGVlbCcsXG4gICAgICAgICd6b29tT25UaW1lQXhpc0RvdWJsZUNsaWNrJ1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3NPbmx5OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgJ2FnZ3JlZ2F0ZURhdGFFbnRyeScsXG4gICAgICAgICdhZ2dyZWdhdGVIaXN0b2dyYW1EYXRhRm9yR3JvdXBzJyxcbiAgICAgICAgJ2FuaW1hdGVGaWx0ZXJSZW1vdmFscycsXG4gICAgICAgICdhbmltYXRlUmVtb3ZpbmdSb3dzJyxcbiAgICAgICAgJ2FyaWFEZXNjcmlwdGlvbicsXG4gICAgICAgICdhcmlhTGFiZWwnLFxuICAgICAgICAnYXV0b0FkanVzdFRpbWVBeGlzJyxcbiAgICAgICAgJ2F1dG9IZWlnaHQnLFxuICAgICAgICAnYmFyVG9vbHRpcFRlbXBsYXRlJyxcbiAgICAgICAgJ2JiYXInLFxuICAgICAgICAnYm9keUNscycsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnYnVmZmVyQ29lZicsXG4gICAgICAgICdidWZmZXJUaHJlc2hvbGQnLFxuICAgICAgICAnY29sbGFwc2libGUnLFxuICAgICAgICAnY29sb3InLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnRlbnRFbGVtZW50Q2xzJyxcbiAgICAgICAgJ2NvbnRleHRNZW51VHJpZ2dlckV2ZW50JyxcbiAgICAgICAgJ2RhdGFGaWVsZCcsXG4gICAgICAgICdkYXRhTW9kZWxGaWVsZCcsXG4gICAgICAgICdkZWZhdWx0UmVnaW9uJyxcbiAgICAgICAgJ2Rlc3Ryb3lTdG9yZScsXG4gICAgICAgICdkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzJyxcbiAgICAgICAgJ2Rpc2FibGVHcmlkQ29sdW1uSWRXYXJuaW5nJyxcbiAgICAgICAgJ2Rpc2FibGVHcmlkUm93TW9kZWxXYXJuaW5nJyxcbiAgICAgICAgJ2RvY2snLFxuICAgICAgICAnZHJhd2VyJyxcbiAgICAgICAgJ2R1cmF0aW9uRGlzcGxheVByZWNpc2lvbicsXG4gICAgICAgICdlbGVtZW50QXR0cmlidXRlcycsXG4gICAgICAgICdlbmFibGVSZWN1cnJpbmdFdmVudHMnLFxuICAgICAgICAnZW5hYmxlU3RpY2t5JyxcbiAgICAgICAgJ2VuYWJsZVRleHRTZWxlY3Rpb24nLFxuICAgICAgICAnZmlsbExhc3RDb2x1bW4nLFxuICAgICAgICAnZml4ZWRSb3dIZWlnaHQnLFxuICAgICAgICAnZm9vdGVyJyxcbiAgICAgICAgJ2Zvcm11bGFQcm92aWRlcnMnLFxuICAgICAgICAnZnVsbFJvd1JlZnJlc2gnLFxuICAgICAgICAnZ2V0QmFyQ2xhc3MnLFxuICAgICAgICAnZ2V0QmFyRE9NQ29uZmlnJyxcbiAgICAgICAgJ2dldEJhclRleHQnLFxuICAgICAgICAnZ2V0QmFyVGV4dERPTUNvbmZpZycsXG4gICAgICAgICdnZXREYXRhRW50cnlGb3JBZ2dyZWdhdGluZycsXG4gICAgICAgICdnZXRPdXRsaW5lQ2xhc3MnLFxuICAgICAgICAnZ2V0T3V0bGluZURPTUNvbmZpZycsXG4gICAgICAgICdnZXRSZWNvcmREYXRhJyxcbiAgICAgICAgJ2dldFJvd0hlaWdodCcsXG4gICAgICAgICdoYXJkUmVmcmVzaE9uVGltZUF4aXNSZWNvbmZpZ3VyZScsXG4gICAgICAgICdoZWFkZXInLFxuICAgICAgICAnaGlkZUhvcml6b250YWxTY3JvbGxiYXInLFxuICAgICAgICAnaGlzdG9ncmFtV2lkZ2V0Q2xhc3MnLFxuICAgICAgICAnaG92ZXJDbHMnLFxuICAgICAgICAnaWNvbicsXG4gICAgICAgICdpZ25vcmVEb21FdmVudHNXaGlsZVNjcm9sbGluZycsXG4gICAgICAgICdpZ25vcmVQYXJlbnRSZWFkT25seScsXG4gICAgICAgICdpbml0QWdncmVnYXRlZERhdGFFbnRyeScsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnbG9hZE1hc2snLFxuICAgICAgICAnbG9hZE1hc2tEZWZhdWx0cycsXG4gICAgICAgICdsb2FkTWFza0Vycm9yJyxcbiAgICAgICAgJ2xvY2FsaXphYmxlJyxcbiAgICAgICAgJ21hbmFnZWRFdmVudFNpemluZycsXG4gICAgICAgICdtYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbWFza2VkJyxcbiAgICAgICAgJ21heERhdGUnLFxuICAgICAgICAnbWF4VGltZUF4aXNVbml0JyxcbiAgICAgICAgJ21pbkRhdGUnLFxuICAgICAgICAnbW9uaXRvclJlc2l6ZScsXG4gICAgICAgICdvd25lcicsXG4gICAgICAgICdwYXJ0bmVyJyxcbiAgICAgICAgJ3BsdWdpbnMnLFxuICAgICAgICAncHJlc2VydmVGb2N1c09uRGF0YXNldENoYW5nZScsXG4gICAgICAgICdwcmVzZXJ2ZVNjcm9sbE9uRGF0YXNldENoYW5nZScsXG4gICAgICAgICdwcmV2ZW50VG9vbHRpcE9uVG91Y2gnLFxuICAgICAgICAncmVsYXlTdG9yZUV2ZW50cycsXG4gICAgICAgICdyZXNpemFibGUnLFxuICAgICAgICAncmVzaXplVG9GaXRJbmNsdWRlc0hlYWRlcicsXG4gICAgICAgICdyZXNvdXJjZVRpbWVSYW5nZVJlbmRlcmVyJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVMZXZlbHMnLFxuICAgICAgICAncmlwcGxlJyxcbiAgICAgICAgJ3Jvb3RFbGVtZW50JyxcbiAgICAgICAgJ3NjYWxlQ29sdW1uJyxcbiAgICAgICAgJ3Njcm9sbGVyQ2xhc3MnLFxuICAgICAgICAnc2Nyb2xsTWFuYWdlcicsXG4gICAgICAgICdzZXJpZXMnLFxuICAgICAgICAnc2hvd0JhclRpcFdoZW5OYXZpZ2F0aW5nVGltZUF4aXMnLFxuICAgICAgICAnc2hvd0RpcnR5JyxcbiAgICAgICAgJ3NuYXBSZWxhdGl2ZVRvRXZlbnRTdGFydERhdGUnLFxuICAgICAgICAnc3RhdGVmdWwnLFxuICAgICAgICAnc3RhdGVmdWxFdmVudHMnLFxuICAgICAgICAnc3RhdGVJZCcsXG4gICAgICAgICdzdGF0ZVByb3ZpZGVyJyxcbiAgICAgICAgJ3N0aWNreUhlYWRlcnMnLFxuICAgICAgICAnc3RyaXBzJyxcbiAgICAgICAgJ3N1YkdyaWRDb25maWdzJyxcbiAgICAgICAgJ3N5bmNNYXNrJyxcbiAgICAgICAgJ3RhYicsXG4gICAgICAgICd0YWJCYXJJdGVtcycsXG4gICAgICAgICd0YmFyJyxcbiAgICAgICAgJ3RpbWVBeGlzJyxcbiAgICAgICAgJ3R5cGUnLFxuICAgICAgICAndWknLFxuICAgICAgICAndmlzaWJsZVpvb21GYWN0b3InLFxuICAgICAgICAnd2Vla1N0YXJ0RGF5JyxcbiAgICAgICAgJ3dlaWdodCcsXG4gICAgICAgICd6b29tS2VlcHNPcmlnaW5hbFRpbWVzcGFuJyxcbiAgICAgICAgJ3pvb21Pbk1vdXNlV2hlZWwnLFxuICAgICAgICAnem9vbU9uVGltZUF4aXNEb3VibGVDbGljaydcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bVByb3BzOiBzdHJpbmdbXSA9IEJyeW50dW1UaW1lbGluZUhpc3RvZ3JhbUNvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhbGlnblNlbGYnLFxuICAgICAgICAnYW5pbWF0ZVRyZWVOb2RlVG9nZ2xlJyxcbiAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgJ2Jhck1hcmdpbicsXG4gICAgICAgICdjYWxsT25GdW5jdGlvbnMnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NlbGxFbGxpcHNpcycsXG4gICAgICAgICdjbHMnLFxuICAgICAgICAnY29sbGFwc2VkJyxcbiAgICAgICAgJ2NvbHVtbicsXG4gICAgICAgICdjb2x1bW5MaW5lcycsXG4gICAgICAgICdjb2x1bW5zJyxcbiAgICAgICAgJ2RhdGEnLFxuICAgICAgICAnZGF0YXNldCcsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdkaXNwbGF5RGF0ZUZvcm1hdCcsXG4gICAgICAgICdlbXB0eVRleHQnLFxuICAgICAgICAnZW5hYmxlRXZlbnRBbmltYXRpb25zJyxcbiAgICAgICAgJ2VuYWJsZVVuZG9SZWRvS2V5cycsXG4gICAgICAgICdlbmREYXRlJyxcbiAgICAgICAgJ2V2ZW50Q29sb3InLFxuICAgICAgICAnZXZlbnRTdHlsZScsXG4gICAgICAgICdleHRyYURhdGEnLFxuICAgICAgICAnZmlsbFRpY2tzJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZm9jdXNWaXNpYmxlJyxcbiAgICAgICAgJ2ZvcmNlRml0JyxcbiAgICAgICAgJ2hhc0NoYW5nZXMnLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlRm9vdGVycycsXG4gICAgICAgICdoaWRlSGVhZGVycycsXG4gICAgICAgICdoaWRlUm93SG92ZXInLFxuICAgICAgICAnaGlzdG9ncmFtV2lkZ2V0JyxcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ2luZmluaXRlU2Nyb2xsJyxcbiAgICAgICAgJ2lucHV0RmllbGRBbGlnbicsXG4gICAgICAgICdpbnNlcnRCZWZvcmUnLFxuICAgICAgICAnaW5zZXJ0Rmlyc3QnLFxuICAgICAgICAna2V5TWFwJyxcbiAgICAgICAgJ2xhYmVsUG9zaXRpb24nLFxuICAgICAgICAnbG9uZ1ByZXNzVGltZScsXG4gICAgICAgICdtYXJnaW4nLFxuICAgICAgICAnbWF4SGVpZ2h0JyxcbiAgICAgICAgJ21heFdpZHRoJyxcbiAgICAgICAgJ21heFpvb21MZXZlbCcsXG4gICAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgICAnbWluV2lkdGgnLFxuICAgICAgICAnbWluWm9vbUxldmVsJyxcbiAgICAgICAgJ29yaWdpbmFsU3RvcmUnLFxuICAgICAgICAncGFyZW50JyxcbiAgICAgICAgJ3ByZXNlcnZlU2Nyb2xsJyxcbiAgICAgICAgJ3ByZXNldHMnLFxuICAgICAgICAncmVhZE9ubHknLFxuICAgICAgICAncmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwJyxcbiAgICAgICAgJ3JlbmRpdGlvbicsXG4gICAgICAgICdyb3dIZWlnaHQnLFxuICAgICAgICAncm93TGluZXMnLFxuICAgICAgICAncnRsJyxcbiAgICAgICAgJ3NjYWxlUG9pbnRzJyxcbiAgICAgICAgJ3Njcm9sbGFibGUnLFxuICAgICAgICAnc2Nyb2xsTGVmdCcsXG4gICAgICAgICdzY3JvbGxUb3AnLFxuICAgICAgICAnc2Nyb2xsWCcsXG4gICAgICAgICdzZWxlY3RlZENlbGwnLFxuICAgICAgICAnc2VsZWN0ZWRDZWxscycsXG4gICAgICAgICdzZWxlY3RlZFJlY29yZCcsXG4gICAgICAgICdzZWxlY3RlZFJlY29yZHMnLFxuICAgICAgICAnc2VsZWN0ZWRSb3dzJyxcbiAgICAgICAgJ3NlbGVjdGlvbk1vZGUnLFxuICAgICAgICAnc2hvd0JhclRpcCcsXG4gICAgICAgICdzbmFwJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3RhcnREYXRlJyxcbiAgICAgICAgJ3N0YXRlJyxcbiAgICAgICAgJ3N0YXRlU2V0dGluZ3MnLFxuICAgICAgICAnc3RvcmUnLFxuICAgICAgICAnc3VwcHJlc3NGaXQnLFxuICAgICAgICAndGlja1NpemUnLFxuICAgICAgICAndGltZVJlc29sdXRpb24nLFxuICAgICAgICAndGltZVpvbmUnLFxuICAgICAgICAndGl0bGUnLFxuICAgICAgICAndG9vbHMnLFxuICAgICAgICAndG9vbHRpcCcsXG4gICAgICAgICd0cmFuc2l0aW9uJyxcbiAgICAgICAgJ3RyYW5zaXRpb25EdXJhdGlvbicsXG4gICAgICAgICd2aWV3UHJlc2V0JyxcbiAgICAgICAgJ3Zpc2libGVEYXRlJyxcbiAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgJ3dvcmtpbmdUaW1lJyxcbiAgICAgICAgJ3pvb21MZXZlbCdcbiAgICBdKTtcblxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgICBwdWJsaWMgaW5zdGFuY2UhOiBUaW1lbGluZUhpc3RvZ3JhbTtcblxuICAgIHByaXZhdGUgYnJ5bnR1bUNvbmZpZyA9IHtcbiAgICAgICAgYWRvcHQgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYXBwZW5kVG8gICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgaHJlZiAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYW5ndWxhckNvbXBvbmVudCA6IHRoaXMsXG4gICAgICAgIGZlYXR1cmVzICAgICAgICAgOiB7fSxcbiAgICAgICAgbGlzdGVuZXJzICAgICAgICA6IHt9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBDb25maWdzIG9ubHlcbiAgICBASW5wdXQoKSBhZG9wdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGFnZ3JlZ2F0ZURhdGFFbnRyeSAgICAgICAgICAgICAgICEgOiAoKGFnZ3JlZ2F0ZURhdGFFbnRyeTogeyBhZ2dyZWdhdGVkOiBvYmplY3QsIGVudHJ5OiBvYmplY3QsIGFycmF5SW5kZXg6IG51bWJlciwgZW50cnlJbmRleDogb2JqZWN0W10gfSkgPT4gb2JqZWN0KXxzdHJpbmc7XG4gICAgQElucHV0KCkgYWdncmVnYXRlSGlzdG9ncmFtRGF0YUZvckdyb3VwcyAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYW5pbWF0ZUZpbHRlclJlbW92YWxzICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYW5pbWF0ZVJlbW92aW5nUm93cyAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXJpYURlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhcmlhTGFiZWwgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGF1dG9BZGp1c3RUaW1lQXhpcyAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGF1dG9IZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGJhclRvb2x0aXBUZW1wbGF0ZSAgICAgICAgICAgICAgICEgOiAoY29udGV4dDogeyBkYXR1bTogb2JqZWN0LCB0aXA6IFRvb2x0aXAsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBhY3RpdmVUYXJnZXQ6IEhUTUxFbGVtZW50LCBldmVudDogRXZlbnQsIHJlY29yZDogTW9kZWwgfSkgPT4gc3RyaW5nO1xuICAgIEBJbnB1dCgpIGJiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAoU2NoZWR1bGVyQ29udGFpbmVySXRlbUNvbmZpZ3xzdHJpbmcpW118VG9vbGJhckNvbmZpZ3xQYWdpbmdUb29sYmFyQ29uZmlnfG51bGw7XG4gICAgQElucHV0KCkgYm9keUNscyAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgYnViYmxlRXZlbnRzICAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSBidWZmZXJDb2VmICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGJ1ZmZlclRocmVzaG9sZCAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgY29sbGFwc2libGUgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58UGFuZWxDb2xsYXBzZXJDb25maWd8UGFuZWxDb2xsYXBzZXJPdmVybGF5Q29uZmlnO1xuICAgIEBJbnB1dCgpIGNvbG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSBjb250ZW50RWxlbWVudENscyAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBjb250ZXh0TWVudVRyaWdnZXJFdmVudCAgICAgICAgICAhIDogJ2NvbnRleHRtZW51J3wnY2xpY2snfCdkYmxjbGljayc7XG4gICAgQElucHV0KCkgZGF0YUZpZWxkICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkYXRhTW9kZWxGaWVsZCAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRSZWdpb24gICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGVzdHJveVN0b3JlICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcyAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGlzYWJsZUdyaWRDb2x1bW5JZFdhcm5pbmcgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGlzYWJsZUdyaWRSb3dNb2RlbFdhcm5pbmcgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6ICd0b3AnfCdib3R0b20nfCdsZWZ0J3wncmlnaHQnfCdzdGFydCd8J2VuZCd8J2hlYWRlcid8J3ByZS1oZWFkZXInfG9iamVjdDtcbiAgICBASW5wdXQoKSBkcmF3ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7c2lkZT86ICdzdGFydCd8J2xlZnQnfCdlbmQnfCdyaWdodCd8J3RvcCd8J2JvdHRvbScsIHNpemU/OiBzdHJpbmd8bnVtYmVyLCBpbmxpbmU/OiBib29sZWFuLCBhdXRvQ2xvc2U6IHsgbW91c2Vkb3duPzogYm9vbGVhbnxzdHJpbmcsIGZvY3Vzb3V0PzogYm9vbGVhbnxzdHJpbmcsIG1vdXNlb3V0Pzogc3RyaW5nIH0sIGF1dG9DbG9zZURlbGF5PzogbnVtYmVyfTtcbiAgICBASW5wdXQoKSBkdXJhdGlvbkRpc3BsYXlQcmVjaXNpb24gICAgICAgICAhIDogbnVtYmVyfGJvb2xlYW47XG4gICAgQElucHV0KCkgZWxlbWVudEF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ3xudWxsPjtcbiAgICBASW5wdXQoKSBlbmFibGVSZWN1cnJpbmdFdmVudHMgICAgICAgICAgICAhIDogYm9vbGVhbnx7XG4gICAgICAgIGRlZmF1bHRBY3Rpb24/OiAnc2luZ2xlJ3wnZnV0dXJlJ1xuICAgIH07XG4gICAgQElucHV0KCkgZW5hYmxlU3RpY2t5ICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZW5hYmxlVGV4dFNlbGVjdGlvbiAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZmlsbExhc3RDb2x1bW4gICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZml4ZWRSb3dIZWlnaHQgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZm9vdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHtcbiAgICAgICAgZG9jaz86ICd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfCdzdGFydCd8J2VuZCdcbiAgICAgICAgaHRtbD86IHN0cmluZ1xuICAgICAgICBjbHM/OiBzdHJpbmdcbiAgICB9fHN0cmluZztcbiAgICBASW5wdXQoKSBmb3JtdWxhUHJvdmlkZXJzICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgRm9ybXVsYVByb3ZpZGVyQ29uZmlnPjtcbiAgICBASW5wdXQoKSBmdWxsUm93UmVmcmVzaCAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBnZXRCYXJDbGFzcyAgICAgICAgICAgICAgICAgICAgICAhIDogKHNlcmllczogSGlzdG9ncmFtU2VyaWVzLCBkb21Db25maWc6IERvbUNvbmZpZywgZGF0dW06IG9iamVjdCwgaW5kZXg6IG51bWJlciwgcmVuZGVyRGF0YTogSGlzdG9ncmFtUmVuZGVyRGF0YSkgPT4gc3RyaW5nO1xuICAgIEBJbnB1dCgpIGdldEJhckRPTUNvbmZpZyAgICAgICAgICAgICAgICAgICEgOiAoc2VyaWVzOiBIaXN0b2dyYW1TZXJpZXMsIGRvbUNvbmZpZzogRG9tQ29uZmlnLCBkYXR1bTogb2JqZWN0LCBpbmRleDogbnVtYmVyLCByZW5kZXJEYXRhOiBIaXN0b2dyYW1SZW5kZXJEYXRhKSA9PiBvYmplY3Q7XG4gICAgQElucHV0KCkgZ2V0QmFyVGV4dCAgICAgICAgICAgICAgICAgICAgICAgISA6IChkYXR1bTogb2JqZWN0LCBpbmRleDogbnVtYmVyLCBzZXJpZXM6IEhpc3RvZ3JhbVNlcmllcywgcmVuZGVyRGF0YTogSGlzdG9ncmFtUmVuZGVyRGF0YSkgPT4gc3RyaW5nO1xuICAgIEBJbnB1dCgpIGdldEJhclRleHRET01Db25maWcgICAgICAgICAgICAgICEgOiAoZG9tQ29uZmlnOiBEb21Db25maWcsIGRhdHVtOiBvYmplY3QsIGluZGV4OiBudW1iZXIsIHNlcmllczogSGlzdG9ncmFtU2VyaWVzLCByZW5kZXJEYXRhOiBIaXN0b2dyYW1SZW5kZXJEYXRhKSA9PiBvYmplY3Q7XG4gICAgQElucHV0KCkgZ2V0RGF0YUVudHJ5Rm9yQWdncmVnYXRpbmcgICAgICAgISA6ICgoZ2V0RGF0YUVudHJ5Rm9yQWdncmVnYXRpbmc6IHsgZW50cnk6IG9iamVjdCB9KSA9PiBvYmplY3QpfHN0cmluZztcbiAgICBASW5wdXQoKSBnZXRPdXRsaW5lQ2xhc3MgICAgICAgICAgICAgICAgICAhIDogKHNlcmllczogSGlzdG9ncmFtU2VyaWVzLCBkYXRhOiBvYmplY3RbXSwgcmVuZGVyRGF0YTogSGlzdG9ncmFtUmVuZGVyRGF0YSkgPT4gc3RyaW5nO1xuICAgIEBJbnB1dCgpIGdldE91dGxpbmVET01Db25maWcgICAgICAgICAgICAgICEgOiAoc2VyaWVzOiBIaXN0b2dyYW1TZXJpZXMsIGRvbUNvbmZpZzogRG9tQ29uZmlnLCBkYXRhOiBvYmplY3RbXSkgPT4gb2JqZWN0O1xuICAgIEBJbnB1dCgpIGdldFJlY29yZERhdGEgICAgICAgICAgICAgICAgICAgICEgOiAoKGdldFJlY29yZERhdGE6IHsgcmVjb3JkOiBNb2RlbCB9LCBhZ2dyZWdhdGlvbkNvbnRleHQ/OiBvYmplY3QpID0+IG9iamVjdCl8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGdldFJvd0hlaWdodCAgICAgICAgICAgICAgICAgICAgICEgOiAoZ2V0Um93SGVpZ2h0OiB7IHJlY29yZDogTW9kZWwgfSkgPT4gbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhhcmRSZWZyZXNoT25UaW1lQXhpc1JlY29uZmlndXJlICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8Ym9vbGVhbnxQYW5lbEhlYWRlcjtcbiAgICBASW5wdXQoKSBoaWRlSG9yaXpvbnRhbFNjcm9sbGJhciAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaXN0b2dyYW1XaWRnZXRDbGFzcyAgICAgICAgICAgICAhIDogSGlzdG9ncmFtO1xuICAgIEBJbnB1dCgpIGhvdmVyQ2xzICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xEb21Db25maWc7XG4gICAgQElucHV0KCkgaWdub3JlRG9tRXZlbnRzV2hpbGVTY3JvbGxpbmcgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaWdub3JlUGFyZW50UmVhZE9ubHkgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaW5pdEFnZ3JlZ2F0ZWREYXRhRW50cnkgICAgICAgICAgISA6ICgoKSA9PiBvYmplY3QpfHN0cmluZztcbiAgICBASW5wdXQoKSBsaXN0ZW5lcnMgICAgICAgICAgICAgICAgICAgICAgICAhIDogVGltZWxpbmVIaXN0b2dyYW1MaXN0ZW5lcnM7XG4gICAgQElucHV0KCkgbG9hZE1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xNYXNrQ29uZmlnfG51bGw7XG4gICAgQElucHV0KCkgbG9hZE1hc2tEZWZhdWx0cyAgICAgICAgICAgICAgICAgISA6IE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbG9hZE1hc2tFcnJvciAgICAgICAgICAgICAgICAgICAgISA6IE1hc2tDb25maWd8TWFza3xib29sZWFuO1xuICAgIEBJbnB1dCgpIGxvY2FsaXphYmxlICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIG1hbmFnZWRFdmVudFNpemluZyAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIG1hc2tEZWZhdWx0cyAgICAgICAgICAgICAgICAgICAgICEgOiBNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIG1hc2tlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHN0cmluZ3xNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIG1heERhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBEYXRlfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhUaW1lQXhpc1VuaXQgICAgICAgICAgICAgICAgICAhIDogRHVyYXRpb25Vbml0O1xuICAgIEBJbnB1dCgpIG1pbkRhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBEYXRlfHN0cmluZztcbiAgICBASW5wdXQoKSBtb25pdG9yUmVzaXplICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBvd25lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogV2lkZ2V0fGFueTtcbiAgICBASW5wdXQoKSBwYXJ0bmVyICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogVGltZWxpbmVCYXNlO1xuICAgIEBJbnB1dCgpIHBsdWdpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBGdW5jdGlvbltdO1xuICAgIEBJbnB1dCgpIHByZXNlcnZlRm9jdXNPbkRhdGFzZXRDaGFuZ2UgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHByZXNlcnZlU2Nyb2xsT25EYXRhc2V0Q2hhbmdlICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHByZXZlbnRUb29sdGlwT25Ub3VjaCAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlbGF5U3RvcmVFdmVudHMgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlc2l6YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtcbiAgICAgICAgbWluV2lkdGg/OiBudW1iZXJcbiAgICAgICAgbWF4V2lkdGg/OiBudW1iZXJcbiAgICAgICAgbWluSGVpZ2h0PzogbnVtYmVyXG4gICAgICAgIG1heEhlaWdodD86IG51bWJlclxuICAgICAgICBoYW5kbGVzPzogb2JqZWN0XG4gICAgfTtcbiAgICBASW5wdXQoKSByZXNpemVUb0ZpdEluY2x1ZGVzSGVhZGVyICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNvdXJjZVRpbWVSYW5nZVJlbmRlcmVyICAgICAgICAhIDogKGRldGFpbDogeyByZXNvdXJjZVRpbWVSYW5nZVJlY29yZDogUmVzb3VyY2VUaW1lUmFuZ2VNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIHJlbmRlckRhdGE6IG9iamVjdCB9KSA9PiBzdHJpbmd8RG9tQ29uZmlnfERvbUNvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIHJlc3BvbnNpdmVMZXZlbHMgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXJ8c3RyaW5nfFJlc3BvbnNpdmVMZXZlbENvbmZpZz47XG4gICAgQElucHV0KCkgcmlwcGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBkZWxlZ2F0ZT86IHN0cmluZ1xuICAgICAgICBjb2xvcj86IHN0cmluZ1xuICAgICAgICByYWRpdXM/OiBudW1iZXJcbiAgICAgICAgY2xpcD86IHN0cmluZ1xuICAgIH07XG4gICAgQElucHV0KCkgcm9vdEVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgISA6IFNoYWRvd1Jvb3R8SFRNTEVsZW1lbnQ7XG4gICAgQElucHV0KCkgc2NhbGVDb2x1bW4gICAgICAgICAgICAgICAgICAgICAgISA6IFNjYWxlQ29sdW1uQ29uZmlnO1xuICAgIEBJbnB1dCgpIHNjcm9sbGVyQ2xhc3MgICAgICAgICAgICAgICAgICAgICEgOiB0eXBlb2YgU2Nyb2xsZXI7XG4gICAgQElucHV0KCkgc2Nyb2xsTWFuYWdlciAgICAgICAgICAgICAgICAgICAgISA6IFNjcm9sbE1hbmFnZXJDb25maWd8U2Nyb2xsTWFuYWdlcjtcbiAgICBASW5wdXQoKSBzZXJpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgSGlzdG9ncmFtU2VyaWVzPjtcbiAgICBASW5wdXQoKSBzaG93QmFyVGlwV2hlbk5hdmlnYXRpbmdUaW1lQXhpcyAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaG93RGlydHkgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7XG4gICAgICAgIGR1cmluZ0VkaXQ/OiBib29sZWFuXG4gICAgICAgIG5ld1JlY29yZD86IGJvb2xlYW5cbiAgICB9O1xuICAgIEBJbnB1dCgpIHNuYXBSZWxhdGl2ZVRvRXZlbnRTdGFydERhdGUgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHN0YXRlZnVsICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufG9iamVjdHxzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBzdGF0ZWZ1bEV2ZW50cyAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0fHN0cmluZ1tdO1xuICAgIEBJbnB1dCgpIHN0YXRlSWQgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgc3RhdGVQcm92aWRlciAgICAgICAgICAgICAgICAgICAgISA6IFN0YXRlUHJvdmlkZXI7XG4gICAgQElucHV0KCkgc3RpY2t5SGVhZGVycyAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc3RyaXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIFNjaGVkdWxlckNvbnRhaW5lckl0ZW1Db25maWc+O1xuICAgIEBJbnB1dCgpIHN1YkdyaWRDb25maWdzICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBTdWJHcmlkQ29uZmlnPjtcbiAgICBASW5wdXQoKSBzeW5jTWFzayAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfE1hc2tDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSB0YWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxUYWJDb25maWc7XG4gICAgQElucHV0KCkgdGFiQmFySXRlbXMgICAgICAgICAgICAgICAgICAgICAgISA6IFRvb2xiYXJJdGVtc1tdfFdpZGdldFtdO1xuICAgIEBJbnB1dCgpIHRiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAoU2NoZWR1bGVyQ29udGFpbmVySXRlbUNvbmZpZ3xzdHJpbmcpW118VG9vbGJhckNvbmZpZ3xQYWdpbmdUb29sYmFyQ29uZmlnfG51bGw7XG4gICAgQElucHV0KCkgdGltZUF4aXMgICAgICAgICAgICAgICAgICAgICAgICAgISA6IFRpbWVBeGlzQ29uZmlnfFRpbWVBeGlzO1xuICAgIEBJbnB1dCgpIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAndGltZWxpbmVoaXN0b2dyYW0nO1xuICAgIEBJbnB1dCgpIHVpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAncGxhaW4nfCd0b29sYmFyJ3xzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIHZpc2libGVab29tRmFjdG9yICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgd2Vla1N0YXJ0RGF5ICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSB3ZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHpvb21LZWVwc09yaWdpbmFsVGltZXNwYW4gICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHpvb21Pbk1vdXNlV2hlZWwgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHpvb21PblRpbWVBeGlzRG91YmxlQ2xpY2sgICAgICAgICEgOiBib29sZWFuO1xuXG4gICAgLy8gQ29uZmlncyBhbmQgcHJvcGVydGllc1xuICAgIEBJbnB1dCgpIGFsaWduU2VsZiAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFuaW1hdGVUcmVlTm9kZVRvZ2dsZSAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhcHBlbmRUbyAgICAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBiYXJNYXJnaW4gICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBjYWxsT25GdW5jdGlvbnMgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNlbGxFbGxpcHNpcyAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjbHMgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgY29sbGFwc2VkICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNvbHVtbiAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGNvbHVtbkxpbmVzICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjb2x1bW5zICAgICAgICAgICAgICAgICAgICAgISA6IENvbHVtblN0b3JlfFNjaGVkdWxlckNvbHVtbkNvbmZpZ1tdfENvbHVtblN0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0W118TW9kZWxbXXxNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGRhdGFzZXQgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0fFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgQElucHV0KCkgZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufCdpbmVydCc7XG4gICAgQElucHV0KCkgZGlzcGxheURhdGVGb3JtYXQgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZW1wdHlUZXh0ICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8RW1wdHlUZXh0RG9tQ29uZmlnO1xuICAgIEBJbnB1dCgpIGVuYWJsZUV2ZW50QW5pbWF0aW9ucyAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBlbmFibGVVbmRvUmVkb0tleXMgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZW5kRGF0ZSAgICAgICAgICAgICAgICAgICAgICEgOiBEYXRlfHN0cmluZztcbiAgICBASW5wdXQoKSBldmVudENvbG9yICAgICAgICAgICAgICAgICAgISA6IEV2ZW50Q29sb3I7XG4gICAgQElucHV0KCkgZXZlbnRTdHlsZSAgICAgICAgICAgICAgICAgICEgOiAndG9uYWwnfCdmaWxsZWQnfCdib3JkZXJlZCd8J3RyYWNlZCd8J291dGxpbmVkJ3wnaW5kZW50ZWQnfCdsaW5lJ3wnZGFzaGVkJ3wnbWluaW1hbCd8J3JvdW5kZWQnfCdjYWxlbmRhcid8J2ludGVyZGF5J3wnZ2FudHQnfG51bGw7XG4gICAgQElucHV0KCkgZXh0cmFEYXRhICAgICAgICAgICAgICAgICAgICEgOiBhbnk7XG4gICAgQElucHV0KCkgZmlsbFRpY2tzICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGZsZXggICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBmb3JjZUZpdCAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhpZGRlbiAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaWRlRm9vdGVycyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGlkZUhlYWRlcnMgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhpZGVSb3dIb3ZlciAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaXN0b2dyYW1XaWRnZXQgICAgICAgICAgICAgISA6IEhpc3RvZ3JhbXxIaXN0b2dyYW1Db25maWc7XG4gICAgQElucHV0KCkgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5maW5pdGVTY3JvbGwgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlucHV0RmllbGRBbGlnbiAgICAgICAgICAgICAhIDogJ3N0YXJ0J3wnZW5kJztcbiAgICBASW5wdXQoKSBpbnNlcnRCZWZvcmUgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBpbnNlcnRGaXJzdCAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBrZXlNYXAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIEtleU1hcENvbmZpZz47XG4gICAgQElucHV0KCkgbGFiZWxQb3NpdGlvbiAgICAgICAgICAgICAgICEgOiAnYmVmb3JlJ3wnYWJvdmUnfCdhbGlnbi1iZWZvcmUnfCdhdXRvJ3xudWxsO1xuICAgIEBJbnB1dCgpIGxvbmdQcmVzc1RpbWUgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIG1hcmdpbiAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhIZWlnaHQgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWF4V2lkdGggICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIG1heFpvb21MZXZlbCAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIG1pbkhlaWdodCAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5XaWR0aCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWluWm9vbUxldmVsICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgcHJlc2VydmVTY3JvbGwgICAgICAgICAgICAgICEgOiBQcmVzZXJ2ZVNjcm9sbE9wdGlvbnN8Ym9vbGVhbjtcbiAgICBASW5wdXQoKSBwcmVzZXRzICAgICAgICAgICAgICAgICAgICAgISA6IFByZXNldFN0b3JlfFZpZXdQcmVzZXRDb25maWdbXTtcbiAgICBASW5wdXQoKSByZWFkT25seSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwICEgOiBSZWN1cnJlbmNlQ29uZmlybWF0aW9uUG9wdXBDb25maWd8UmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwO1xuICAgIEBJbnB1dCgpIHJlbmRpdGlvbiAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfFJlY29yZDxzdHJpbmcsIHN0cmluZz58bnVsbDtcbiAgICBASW5wdXQoKSByb3dIZWlnaHQgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSByb3dMaW5lcyAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcnRsICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNjYWxlUG9pbnRzICAgICAgICAgICAgICAgICAhIDogU2NhbGVQb2ludFtdO1xuICAgIEBJbnB1dCgpIHNjcm9sbGFibGUgICAgICAgICAgICAgICAgICAhIDogU2Nyb2xsZXJ8Ym9vbGVhbnxTY3JvbGxlckNvbmZpZztcbiAgICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlICAgICAgICAgICAgICAgISA6IEdyaWRTZWxlY3Rpb25Nb2RlO1xuICAgIEBJbnB1dCgpIHNob3dCYXJUaXAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxUb29sdGlwQ29uZmlnO1xuICAgIEBJbnB1dCgpIHNuYXAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzcGFuICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzdGFydERhdGUgICAgICAgICAgICAgICAgICAgISA6IERhdGV8c3RyaW5nO1xuICAgIEBJbnB1dCgpIHN0YXRlU2V0dGluZ3MgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICByZXN0b3JlVW5jb25maWd1cmVkQ29sdW1ucz86IGJvb2xlYW5cbiAgICB9O1xuICAgIEBJbnB1dCgpIHN0b3JlICAgICAgICAgICAgICAgICAgICAgICAhIDogU3RvcmV8U3RvcmVDb25maWd8QWpheFN0b3JlfEFqYXhTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSBzdXBwcmVzc0ZpdCAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdGlja1NpemUgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgdGltZVJlc29sdXRpb24gICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGluY3JlbWVudD86IG51bWJlclxuICAgICAgICB1bml0PzogRHVyYXRpb25Vbml0XG4gICAgfXxudW1iZXI7XG4gICAgQElucHV0KCkgdGltZVpvbmUgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIHRpdGxlICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHRvb2xzICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgVG9vbHxUb29sQ29uZmlnPnxudWxsfFJlY29yZDxzdHJpbmcsIFRvb2w+fFJlY29yZDxzdHJpbmcsIFRvb2xDb25maWc+O1xuICAgIEBJbnB1dCgpIHRyYW5zaXRpb24gICAgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICBpbnNlcnRSZWNvcmQ/OiBib29sZWFuXG4gICAgICAgIHJlbW92ZVJlY29yZD86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlQ29sdW1uPzogYm9vbGVhblxuICAgICAgICBleHBhbmRDb2xsYXBzZUNvbHVtbj86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlUmVnaW9uPzogYm9vbGVhblxuICAgICAgICB0b2dnbGVUcmVlTm9kZT86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlR3JvdXA/OiBib29sZWFuXG4gICAgICAgIGZpbHRlclJlbW92YWw/OiBib29sZWFuXG4gICAgfTtcbiAgICBASW5wdXQoKSB0cmFuc2l0aW9uRHVyYXRpb24gICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSB2aWV3UHJlc2V0ICAgICAgICAgICAgICAgICAgISA6IFZpZXdQcmVzZXR8Vmlld1ByZXNldENvbmZpZ3xzdHJpbmc7XG4gICAgQElucHV0KCkgdmlzaWJsZURhdGUgICAgICAgICAgICAgICAgICEgOiBvYmplY3R8RGF0ZXxWaXNpYmxlRGF0ZTtcbiAgICBASW5wdXQoKSB3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgd29ya2luZ1RpbWUgICAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGZyb21EYXk/OiBudW1iZXJcbiAgICAgICAgdG9EYXk/OiBudW1iZXJcbiAgICAgICAgZnJvbUhvdXI/OiBudW1iZXJcbiAgICAgICAgdG9Ib3VyPzogbnVtYmVyXG4gICAgfTtcblxuICAgIC8vIFByb3BlcnRpZXMgb25seVxuICAgIEBJbnB1dCgpIGZvY3VzVmlzaWJsZSAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoYXNDaGFuZ2VzICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgb3JpZ2luYWxTdG9yZSAgICEgOiBTdG9yZTtcbiAgICBASW5wdXQoKSBwYXJlbnQgICAgICAgICAgISA6IFdpZGdldDtcbiAgICBASW5wdXQoKSBzY3JvbGxMZWZ0ICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzY3JvbGxUb3AgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzY3JvbGxYICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzZWxlY3RlZENlbGwgICAgISA6IEdyaWRMb2NhdGlvbnxHcmlkTG9jYXRpb25Db25maWc7XG4gICAgQElucHV0KCkgc2VsZWN0ZWRDZWxscyAgICEgOiBHcmlkTG9jYXRpb25bXXxHcmlkTG9jYXRpb25Db25maWdbXTtcbiAgICBASW5wdXQoKSBzZWxlY3RlZFJlY29yZCAgISA6IE1vZGVsO1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkUmVjb3JkcyAhIDogTW9kZWxbXXxudW1iZXJbXTtcbiAgICBASW5wdXQoKSBzZWxlY3RlZFJvd3MgICAgISA6IE1vZGVsW118bnVtYmVyW107XG4gICAgQElucHV0KCkgc3RhdGUgICAgICAgICAgICEgOiBUaW1lbGluZVN0YXRlSW5mbztcbiAgICBASW5wdXQoKSB0b29sdGlwICAgICAgICAgISA6IHN0cmluZ3xUb29sdGlwQ29uZmlnO1xuICAgIEBJbnB1dCgpIHpvb21MZXZlbCAgICAgICAhIDogbnVtYmVyO1xuXG4gICAgLy8gRmVhdHVyZXNcbiAgICBASW5wdXQoKSBhaUZpbHRlckZlYXR1cmUgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEFJRmlsdGVyfEFJRmlsdGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNlbGxDb3B5UGFzdGVGZWF0dXJlICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2VsbENvcHlQYXN0ZXxDZWxsQ29weVBhc3RlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNlbGxFZGl0RmVhdHVyZSAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2VsbEVkaXR8Q2VsbEVkaXRDb25maWc7XG4gICAgQElucHV0KCkgY2VsbE1lbnVGZWF0dXJlICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDZWxsTWVudXxDZWxsTWVudUNvbmZpZztcbiAgICBASW5wdXQoKSBjZWxsVG9vbHRpcEZlYXR1cmUgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENlbGxUb29sdGlwfENlbGxUb29sdGlwQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNoYXJ0c0ZlYXR1cmUgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2hhcnRzfENoYXJ0c0NvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5BdXRvV2lkdGhGZWF0dXJlICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtbkF1dG9XaWR0aHxDb2x1bW5BdXRvV2lkdGhDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uRHJhZ1Rvb2xiYXJGZWF0dXJlICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5EcmFnVG9vbGJhcnxDb2x1bW5EcmFnVG9vbGJhckNvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5MaW5lc0ZlYXR1cmUgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtbkxpbmVzfENvbHVtbkxpbmVzQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNvbHVtblBpY2tlckZlYXR1cmUgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUGlja2VyfENvbHVtblBpY2tlckNvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5SZW5hbWVGZWF0dXJlICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblJlbmFtZXxDb2x1bW5SZW5hbWVDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uUmVvcmRlckZlYXR1cmUgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5SZW9yZGVyfENvbHVtblJlb3JkZXJDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uUmVzaXplRmVhdHVyZSAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5SZXNpemV8Q29sdW1uUmVzaXplQ29uZmlnO1xuICAgIEBJbnB1dCgpIGV4Y2VsRXhwb3J0ZXJGZWF0dXJlICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JpZEV4Y2VsRXhwb3J0ZXJ8R3JpZEV4Y2VsRXhwb3J0ZXJDb25maWc7XG4gICAgQElucHV0KCkgZmlsZURyb3BGZWF0dXJlICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWxlRHJvcHxGaWxlRHJvcENvbmZpZztcbiAgICBASW5wdXQoKSBmaWxsSGFuZGxlRmVhdHVyZSAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbGxIYW5kbGV8RmlsbEhhbmRsZUNvbmZpZztcbiAgICBASW5wdXQoKSBmaWx0ZXJGZWF0dXJlICAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbHRlcnxGaWx0ZXJDb25maWc7XG4gICAgQElucHV0KCkgZmlsdGVyQmFyRmVhdHVyZSAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWx0ZXJCYXJ8RmlsdGVyQmFyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGdyb3VwRmVhdHVyZSAgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JvdXB8R3JvdXBDb25maWc7XG4gICAgQElucHV0KCkgZ3JvdXBTdW1tYXJ5RmVhdHVyZSAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xHcm91cFN1bW1hcnl8R3JvdXBTdW1tYXJ5Q29uZmlnO1xuICAgIEBJbnB1dCgpIGhlYWRlck1lbnVGZWF0dXJlICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8SGVhZGVyTWVudXxIZWFkZXJNZW51Q29uZmlnO1xuICAgIEBJbnB1dCgpIGhlYWRlclpvb21GZWF0dXJlICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8SGVhZGVyWm9vbXxIZWFkZXJab29tQ29uZmlnO1xuICAgIEBJbnB1dCgpIGxvY2tSb3dzRmVhdHVyZSAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JpZExvY2tSb3dzfEdyaWRMb2NrUm93c0NvbmZpZztcbiAgICBASW5wdXQoKSBtZXJnZUNlbGxzRmVhdHVyZSAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfE1lcmdlQ2VsbHN8TWVyZ2VDZWxsc0NvbmZpZztcbiAgICBASW5wdXQoKSBub25Xb3JraW5nVGltZUZlYXR1cmUgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfE5vbldvcmtpbmdUaW1lfE5vbldvcmtpbmdUaW1lQ29uZmlnO1xuICAgIEBJbnB1dCgpIHBhbkZlYXR1cmUgICAgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8UGFufFBhbkNvbmZpZztcbiAgICBASW5wdXQoKSBwZGZFeHBvcnRGZWF0dXJlICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyaWRQZGZFeHBvcnR8R3JpZFBkZkV4cG9ydENvbmZpZztcbiAgICBASW5wdXQoKSBwaW5Db2x1bW5zRmVhdHVyZSAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFBpbkNvbHVtbnN8UGluQ29sdW1uc0NvbmZpZztcbiAgICBASW5wdXQoKSBwcmludEZlYXR1cmUgICAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyaWRQcmludHxHcmlkUHJpbnRDb25maWc7XG4gICAgQElucHV0KCkgcXVpY2tGaW5kRmVhdHVyZSAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xRdWlja0ZpbmR8UXVpY2tGaW5kQ29uZmlnO1xuICAgIEBJbnB1dCgpIHJlZ2lvblJlc2l6ZUZlYXR1cmUgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8UmVnaW9uUmVzaXplfFJlZ2lvblJlc2l6ZUNvbmZpZztcbiAgICBASW5wdXQoKSByZXNvdXJjZU1lbnVGZWF0dXJlICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJlc291cmNlTWVudXxSZXNvdXJjZU1lbnVDb25maWc7XG4gICAgQElucHV0KCkgcmVzb3VyY2VUaW1lUmFuZ2VzRmVhdHVyZSAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xSZXNvdXJjZVRpbWVSYW5nZXN8UmVzb3VyY2VUaW1lUmFuZ2VzQ29uZmlnO1xuICAgIEBJbnB1dCgpIHJvd0NvcHlQYXN0ZUZlYXR1cmUgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Um93Q29weVBhc3RlfFJvd0NvcHlQYXN0ZUNvbmZpZztcbiAgICBASW5wdXQoKSByb3dFZGl0RmVhdHVyZSAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd0VkaXR8Um93RWRpdENvbmZpZztcbiAgICBASW5wdXQoKSByb3dFeHBhbmRlckZlYXR1cmUgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd0V4cGFuZGVyfFJvd0V4cGFuZGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIHJvd1Jlb3JkZXJGZWF0dXJlICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Um93UmVvcmRlcnxSb3dSZW9yZGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIHJvd1Jlc2l6ZUZlYXR1cmUgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JpZFJvd1Jlc2l6ZXxHcmlkUm93UmVzaXplQ29uZmlnO1xuICAgIEBJbnB1dCgpIHNjaGVkdWxlVG9vbHRpcEZlYXR1cmUgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U2NoZWR1bGVUb29sdGlwfFNjaGVkdWxlVG9vbHRpcENvbmZpZztcbiAgICBASW5wdXQoKSBzZWFyY2hGZWF0dXJlICAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNlYXJjaHxTZWFyY2hDb25maWc7XG4gICAgQElucHV0KCkgc29ydEZlYXR1cmUgICAgICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTb3J0fFNvcnRDb25maWc7XG4gICAgQElucHV0KCkgc3BsaXRGZWF0dXJlICAgICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTcGxpdHxTcGxpdENvbmZpZztcbiAgICBASW5wdXQoKSBzdGlja3lDZWxsc0ZlYXR1cmUgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFN0aWNreUNlbGxzfFN0aWNreUNlbGxzQ29uZmlnO1xuICAgIEBJbnB1dCgpIHN0cmlwZUZlYXR1cmUgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U3RyaXBlfFN0cmlwZUNvbmZpZztcbiAgICBASW5wdXQoKSBzdW1tYXJ5RmVhdHVyZSAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFN1bW1hcnl8U3VtbWFyeUNvbmZpZztcbiAgICBASW5wdXQoKSB0aW1lQXhpc0hlYWRlck1lbnVGZWF0dXJlICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRpbWVBeGlzSGVhZGVyTWVudXxUaW1lQXhpc0hlYWRlck1lbnVDb25maWc7XG4gICAgQElucHV0KCkgdGltZVJhbmdlc0ZlYXR1cmUgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUaW1lUmFuZ2VzfFRpbWVSYW5nZXNDb25maWc7XG4gICAgQElucHV0KCkgdHJlZUZlYXR1cmUgICAgICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUcmVlfFRyZWVDb25maWc7XG4gICAgQElucHV0KCkgdHJlZUdyb3VwRmVhdHVyZSAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUcmVlR3JvdXB8VHJlZUdyb3VwQ29uZmlnO1xuXG4gICAgLy8gRXZlbnRzIGVtaXR0ZXJzXG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGFuIGFzc2lnbm1lbnQgaXMgcmVtb3ZlZC4gQ2FuIGJlIHRyaWdnZXJlZCBieSB1c2VyIHByZXNzaW5nIFtERUxFVEVdIG9yIFtCQUNLU1BBQ0VdIG9yXG4gICAgICogYnkgdGhlIGV2ZW50IGVkaXRvci4gQ2FuIGZvciBleGFtcGxlIGJlIHVzZWQgdG8gZGlzcGxheSBhIGN1c3RvbSBkaWFsb2cgdG8gY29uZmlybSBkZWxldGlvbiwgaW4gd2hpY2hcbiAgICAgKiBjYXNlIHJlY29yZHMgc2hvdWxkIGJlIFwibWFudWFsbHlcIiByZW1vdmVkIGFmdGVyIGNvbmZpcm1hdGlvbjpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jZXZlbnQtYmVmb3JlQXNzaWdubWVudERlbGV0ZSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5TY2hlZHVsZXJ9IGV2ZW50LnNvdXJjZSBUaGUgU2NoZWR1bGVyIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuQXNzaWdubWVudE1vZGVsW119IGV2ZW50LmFzc2lnbm1lbnRSZWNvcmRzIFRoZSBhc3NpZ25tZW50IHJlY29yZHMgYWJvdXQgdG8gYmUgZGVsZXRlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0IEFkZGl0aW9uYWwgcmVtb3ZhbCBjb250ZXh0OlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGV2ZW50LmNvbnRleHQuZmluYWxpemUgRnVuY3Rpb24gdG8gY2FsbCB0byBmaW5hbGl6ZSB0aGUgcmVtb3ZhbC4gVXNlZCB0byBhc3luY2hyb25vdXNseSBkZWNpZGUgdG8gcmVtb3ZlIHRoZSByZWNvcmRzIG9yIG5vdC4gUHJvdmlkZSBgZmFsc2VgIHRvIHRoZSBmdW5jdGlvbiB0byBwcmV2ZW50IHRoZSByZW1vdmFsLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29udGV4dC5maW5hbGl6ZS5yZW1vdmVSZWNvcmRzIFByb3ZpZGUgYGZhbHNlYCB0byB0aGUgZnVuY3Rpb24gdG8gcHJldmVudCB0aGUgcmVtb3ZhbC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVBc3NpZ25tZW50RGVsZXRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGFzc2lnbm1lbnRSZWNvcmRzOiBBc3NpZ25tZW50TW9kZWxbXSwgY29udGV4dDogeyBmaW5hbGl6ZTogeyByZW1vdmVSZWNvcmRzPzogYm9vbGVhbiB9IH0gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIHRoZSBjZWxsIGVkaXRpbmcgaXMgY2FuY2VsZWQsIHJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgY2FuY2VsbGF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQuZWRpdG9yQ29udGV4dCBFZGl0aW5nIGNvbnRleHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDYW5jZWxDZWxsRWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZWRpdG9yQ29udGV4dDogR3JpZExvY2F0aW9uIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSB0aGUgcm93IGVkaXRpbmcgaXMgY2FuY2VsZWQsIHJldHVybiBmYWxzZSB0byBzaWduYWwgdGhhdCB0aGUgdmFsdWUgaXMgaW52YWxpZCBhbmQgZWRpdGluZyBzaG91bGQgbm90IGJlIGZpbmFsaXplZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jZXZlbnQtYmVmb3JlQ2FuY2VsUm93RWRpdClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuZ3JpZCBUYXJnZXQgZ3JpZFxuICAgICAqIEBwYXJhbSB7Um93RWRpdG9yQ29udGV4dH0gZXZlbnQuZWRpdG9yQ29udGV4dCBFZGl0aW5nIGNvbnRleHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDYW5jZWxSb3dFZGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgZWRpdG9yQ29udGV4dDogUm93RWRpdG9yQ29udGV4dCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgZWRpdGluZyBzdGFydHMsIHJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgZWRpdGluZ1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q2VsbEVkaXRvckNvbnRleHR9IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ2VsbEVkaXRTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZWRpdG9yQ29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIGRlbGV0aW5nIGEgcmFuZ2Ugb2Ygc2VsZWN0ZWQgY2VsbCB2YWx1ZXMgYnkgcHJlc3NpbmcgYEJhY2tzcGFjZWAgb3IgYERlbGBcbiAgICAgKiBidXR0b25zIHdoaWxlIFthdXRvRWRpdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NlbGxFZGl0I2NvbmZpZy1hdXRvRWRpdCkgaXMgc2V0IHRvIGB0cnVlYC4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCBlZGl0aW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7KEdyaWQudXRpbC5HcmlkTG9jYXRpb258Q29yZS5kYXRhLk1vZGVsKVtdfSBldmVudC5ncmlkU2VsZWN0aW9uIEFuIGFycmF5IG9mIGNlbGwgc2VsZWN0b3JzIG9yIHJlY29yZHMgdGhhdCB3aWxsIGhhdmUgdGhlaXIgdmFsdWVzIGRlbGV0ZWQgKHRoZSByZWNvcmRzIHRoZW1zZWx2ZXMgd2lsbCBub3QgZ2V0IGRlbGV0ZWQsIG9ubHkgdmlzaWJsZSBjb2x1bW4gdmFsdWVzKS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDZWxsUmFuZ2VEZWxldGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGdyaWRTZWxlY3Rpb246IChHcmlkTG9jYXRpb258TW9kZWwpW10gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBmb3IgZWFjaCBzZWxlY3RlZCByZWNvcmQgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBlZGl0aW5nIGEgcmFuZ2Ugb2Ygc2VsZWN0ZWQgY2VsbCB2YWx1ZXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBDdXJyZW50IHNlbGVjdGVkIHJlY29yZCBmcm9tIHRoZSByYW5nZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5maWVsZCBUaGUgZmllbGQgYmVpbmcgY2hhbmdlZFxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudC52YWx1ZSBUaGUgdmFsdWUgYmVpbmcgc2V0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ2VsbFJhbmdlRWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBhbnkgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHByaW9yIHRvIHN0YXJ0aW5nIGEgY29sdW1uIGRyYWcgZ2VzdHVyZS4gVGhlIGRyYWcgaXMgY2FuY2VsZWQgaWYgYSBsaXN0ZW5lciByZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBkcmFnZ2VkIGNvbHVtbi5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDb2x1bW5EcmFnU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBldmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBjb2x1bW4gaXMgZHJvcHBlZCwgYW5kIHlvdSBjYW4gcmV0dXJuIGZhbHNlIGZyb20gYSBsaXN0ZW5lciB0byBhYm9ydCB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgZHJhZ2dlZCBjb2x1bW4uXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50Lmluc2VydEJlZm9yZSBUaGUgY29sdW1uIGJlZm9yZSB3aGljaCB0aGUgZHJhZ2dlZCBjb2x1bW4gd2lsbCBiZSBpbnNlcnRlZC5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQubmV3UGFyZW50IFRoZSBuZXcgcGFyZW50IGNvbHVtbi5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQucmVnaW9uIFRoZSByZWdpb24gd2hlcmUgdGhlIGNvbHVtbiB3YXMgZHJvcHBlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDb2x1bW5Ecm9wRmluYWxpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBpbnNlcnRCZWZvcmU6IENvbHVtbiwgbmV3UGFyZW50OiBDb2x1bW4sIGV2ZW50OiBFdmVudCwgcmVnaW9uOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHByaW9yIHRvIHN0YXJ0aW5nIGEgY29sdW1uIHJlc2l6ZSBnZXN0dXJlLiBUaGUgcmVzaXplIGlzIGNhbmNlbGVkIGlmIGEgbGlzdGVuZXIgcmV0dXJuc1xuICAgICAqIGBmYWxzZWAuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGNvbHVtblxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBicm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ29sdW1uUmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjb2x1bW46IENvbHVtbiwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBhIGNvcHkgYWN0aW9uIGlzIHBlcmZvcm1lZCwgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9uW119IGV2ZW50LmNlbGxzIFRoZSBjZWxscyBhYm91dCB0byBiZSBjb3BpZWQgb3IgY3V0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmRhdGEgVGhlIHN0cmluZyBkYXRhIGFib3V0IHRvIGJlIGNvcGllZCBvciBjdXRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmlzQ3V0IGB0cnVlYCBpZiB0aGlzIGlzIGEgY3V0IGFjdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5lbnRpdHlOYW1lICdjZWxsJyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgYmVmb3JlQ29weSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDb3B5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjZWxsczogR3JpZExvY2F0aW9uW10sIGRhdGE6IHN0cmluZywgaXNDdXQ6IGJvb2xlYW4sIGVudGl0eU5hbWU6IHN0cmluZyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgQ1NWIGV4cG9ydCBzdGFydHMuIFJldHVybiBgZmFsc2VgIHRvIGNhbmNlbCB0aGUgZXhwb3J0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0V4cG9ydENvbmZpZ30gZXZlbnQuY29uZmlnIEV4cG9ydCBjb25maWdcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbltdfSBldmVudC5jb2x1bW5zIEFuIGFycmF5IG9mIGNvbHVtbnMgdG8gZXhwb3J0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQucm93cyBBbiBhcnJheSBvZiByZWNvcmRzIHRvIGV4cG9ydFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5saW5lRGVsaW1pdGVyIFRoZSBDU1YgZGVsaW1pdGVyIHRvIHNlcGFyYXRlIGxpbmVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmNvbHVtbkRlbGltaXRlciBUaGUgQ1NWIGRlbGltaXRlciB0byBzZXBhcmF0ZSB2YWx1ZXMgb24gb25lIGxpbmVcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDU1ZFeHBvcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjb25maWc6IEV4cG9ydENvbmZpZywgY29sdW1uczogQ29sdW1uW10sIHJvd3M6IE1vZGVsW10sIGxpbmVEZWxpbWl0ZXI6IHN0cmluZywgY29sdW1uRGVsaW1pdGVyOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgYW4gb2JqZWN0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLkJhc2V9IGV2ZW50LnNvdXJjZSBUaGUgT2JqZWN0IHRoYXQgaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURlc3Ryb3k6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBhbiBldmVudCBpcyByZW1vdmVkLiBDYW4gYmUgdHJpZ2dlcmVkIGJ5IHVzZXIgcHJlc3NpbmcgW0RFTEVURV0gb3IgW0JBQ0tTUEFDRV0gb3IgYnkgdGhlXG4gICAgICogZXZlbnQgZWRpdG9yLiBSZXR1cm4gYGZhbHNlYCB0byBpbW1lZGlhdGVseSB2ZXRvIHRoZSByZW1vdmFsIChvciBhIGBQcm9taXNlYCB5aWVsZGluZyBgdHJ1ZWAgb3IgYGZhbHNlYFxuICAgICAqIGZvciBhc3luYyB2ZXRvaW5nKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jZXZlbnQtYmVmb3JlRXZlbnREZWxldGUpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyLGFueX0gZXZlbnQuc291cmNlIFRoZSBTY2hlZHVsZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50LmV2ZW50UmVjb3JkcyBUaGUgcmVjb3JkcyBhYm91dCB0byBiZSBkZWxldGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNvbnRleHQgQWRkaXRpb25hbCByZW1vdmFsIGNvbnRleHQ6XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY29udGV4dC5maW5hbGl6ZSBGdW5jdGlvbiB0byBjYWxsIHRvIGZpbmFsaXplIHRoZSByZW1vdmFsLiBVc2VkIHRvIGFzeW5jaHJvbm91c2x5IGRlY2lkZSB0byByZW1vdmUgdGhlIHJlY29yZHMgb3Igbm90LiBQcm92aWRlIGBmYWxzZWAgdG8gdGhlIGZ1bmN0aW9uIHRvIHByZXZlbnQgdGhlIHJlbW92YWwuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb250ZXh0LmZpbmFsaXplLnJlbW92ZVJlY29yZHMgUHJvdmlkZSBgZmFsc2VgIHRvIHRoZSBmdW5jdGlvbiB0byBwcmV2ZW50IHRoZSByZW1vdmFsLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUV2ZW50RGVsZXRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXJ8YW55LCBldmVudFJlY29yZHM6IEV2ZW50TW9kZWxbXSwgY29udGV4dDogeyBmaW5hbGl6ZTogeyByZW1vdmVSZWNvcmRzPzogYm9vbGVhbiB9IH0gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIEV4Y2VsIGV4cG9ydCBzdGFydHMuIFJldHVybiBgZmFsc2VgIHRvIGNhbmNlbCB0aGUgZXhwb3J0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0V4cG9ydENvbmZpZ30gZXZlbnQuY29uZmlnIEV4cG9ydCBjb25maWdcbiAgICAgKiBAcGFyYW0ge1hMU0NvbHVtbltdfSBldmVudC5jb2x1bW5zIEFuIGFycmF5IG9mIGNvbHVtbnMgdG8gZXhwb3J0XG4gICAgICogQHBhcmFtIHthbnlbXVtdfSBldmVudC5yb3dzIEFuIGFycmF5IG9mIHJlY29yZHMgdG8gZXhwb3J0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRXhjZWxFeHBvcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjb25maWc6IEV4cG9ydENvbmZpZywgY29sdW1uczogWExTQ29sdW1uW10sIHJvd3M6IGFueVtdIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIGRyYWdnaW5nIG9mIHRoZSBGaWxsSGFuZGxlIHN0YXJ0cywgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgZHJhZyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQuY2VsbCBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sdW1uIC8gcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcmF3IERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUZpbGxIYW5kbGVEcmFnU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjZWxsOiBHcmlkTG9jYXRpb24sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSB0aGUgY2VsbCBlZGl0aW5nIGlzIGZpbmlzaGVkLCByZXR1cm4gZmFsc2UgdG8gc2lnbmFsIHRoYXQgdGhlIHZhbHVlIGlzIGludmFsaWQgYW5kIGVkaXRpbmcgc2hvdWxkIG5vdCBiZSBmaW5hbGl6ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGFyZ2V0IGdyaWRcbiAgICAgKiBAcGFyYW0ge0NlbGxFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUZpbmlzaENlbGxFZGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgZWRpdG9yQ29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgdGhlIHJvdyBlZGl0aW5nIGlzIGZpbmlzaGVkLCByZXR1cm4gZmFsc2UgdG8gc2lnbmFsIHRoYXQgdGhlIHZhbHVlIGlzIGludmFsaWQgYW5kIGVkaXRpbmcgc2hvdWxkIG5vdCBiZSBmaW5hbGl6ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2V2ZW50LWJlZm9yZUZpbmlzaFJvd0VkaXQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGFyZ2V0IGdyaWRcbiAgICAgKiBAcGFyYW0ge1Jvd0VkaXRvckNvbnRleHR9IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRmluaXNoUm93RWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIGVkaXRvckNvbnRleHQ6IFJvd0VkaXRvckNvbnRleHQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgd2lkZ2V0IGlzIGhpZGRlbi4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgaGlkZGVuLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUhpZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSB0aGUgY29tcG9uZW50IHN0b3JlcyBhIHJlY29yZCdzIGhpc3RvZ3JhbSBkYXRhIGludG8gdGhlIGNhY2hlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNldmVudC1iZWZvcmVIaXN0b2dyYW1EYXRhQ2FjaGVTZXQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuVGltZWxpbmVIaXN0b2dyYW19IGV2ZW50LnNvdXJjZSBUaGUgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmQgdGhlIGhpc3RvZ3JhbSBkYXRhIG9mIHdoaWNoIGlzIHJlYWR5LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5kYXRhIFRoZSByZWNvcmQgaGlzdG9ncmFtIGRhdGEuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlSGlzdG9ncmFtRGF0YUNhY2hlU2V0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUaW1lbGluZUhpc3RvZ3JhbSwgcmVjb3JkOiBNb2RlbCwgZGF0YTogb2JqZWN0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBvciBHYW50dCB3aWRnZXQgYmVmb3JlIHBhbiBzdGFydHMuIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIG5hdGl2ZSBicm93c2VyIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVBhbjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGV2ZW50OiBFdmVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgYSBwYXN0ZSBhY3Rpb24gaXMgcGVyZm9ybWVkLCByZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuY2xpcGJvYXJkRGF0YSBUaGUgY2xpcGJvYXJkRGF0YSBhYm91dCB0byBiZSBwYXN0ZWRcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LnRhcmdldENlbGwgVGhlIGNlbGwgZnJvbSB3aGljaCB0aGUgcGFzdGUgd2lsbCBiZSBzdGFydGVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmVudGl0eU5hbWUgJ2NlbGwnIHRvIGRpc3Rpbmd1aXNoIHRoaXMgZXZlbnQgZnJvbSBvdGhlciBiZWZvcmVQYXN0ZSBldmVudHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQudGV4dCBUaGUgcmF3IHRleHQgZnJvbSBjbGlwYm9hcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVQYXN0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY2xpcGJvYXJkRGF0YTogc3RyaW5nLCB0YXJnZXRDZWxsOiBHcmlkTG9jYXRpb24sIGVudGl0eU5hbWU6IHN0cmluZywgdGV4dDogc3RyaW5nIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBleHBvcnQgc3RhcnRlZC4gUmV0dXJuIGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBleHBvcnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb25maWcgRXhwb3J0IGNvbmZpZ1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVBkZkV4cG9ydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNvbmZpZzogb2JqZWN0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIHRoZSBbdmlld1ByZXNldF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vVGltZWxpbmVWaWV3UHJlc2V0cyNjb25maWctdmlld1ByZXNldCkgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5TY2hlZHVsZXJ9IGV2ZW50LnNvdXJjZSBUaGlzIFNjaGVkdWxlciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LnN0YXJ0RGF0ZSBUaGUgbmV3IHN0YXJ0IGRhdGUgb2YgdGhlIHRpbWVsaW5lLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZW5kRGF0ZSBUaGUgbmV3IGVuZCBkYXRlIG9mIHRoZSB0aW1lbGluZS5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5wcmVzZXQuVmlld1ByZXNldH0gZXZlbnQuZnJvbSBUaGUgb3V0Z29pbmcgVmlld1ByZXNldC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5wcmVzZXQuVmlld1ByZXNldH0gZXZlbnQudG8gVGhlIFZpZXdQcmVzZXQgYmVpbmcgc3dpdGNoZWQgdG8uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUHJlc2V0Q2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSwgZnJvbTogVmlld1ByZXNldCwgdG86IFZpZXdQcmVzZXQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgdGhlIGNvbXBvbmVudCByZW5kZXJzIGEgcm93LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNldmVudC1iZWZvcmVSZW5kZXJIaXN0b2dyYW1Sb3cpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuVGltZWxpbmVIaXN0b2dyYW19IGV2ZW50LnNvdXJjZSBUaGUgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmQgdGhlIGhpc3RvZ3JhbSBkYXRhIG9mIHdoaWNoIGlzIHJlYWR5LlxuICAgICAqIEBwYXJhbSB7SGlzdG9ncmFtQ29uZmlnfSBldmVudC5oaXN0b2dyYW1Db25maWcgQ29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gYGhpc3RvZ3JhbVdpZGdldGAuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5ncmFwaC5IaXN0b2dyYW19IGV2ZW50Lmhpc3RvZ3JhbVdpZGdldCBUaGUgdW5kZXJseWluZyB3aWRnZXQgdGhhdCBpcyB1c2VkIHRvIHJlbmRlciBhIGNoYXJ0LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVJlbmRlckhpc3RvZ3JhbVJvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGltZWxpbmVIaXN0b2dyYW0sIHJlY29yZDogTW9kZWwsIGhpc3RvZ3JhbUNvbmZpZzogSGlzdG9ncmFtQ29uZmlnLCBoaXN0b2dyYW1XaWRnZXQ6IEhpc3RvZ3JhbSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIHRoZSBjb21wb25lbnQgcmVuZGVycyBhIGhpc3RvZ3JhbSBpbiBhIGNlbGwuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuVGltZWxpbmVIaXN0b2dyYW19IGV2ZW50LnNvdXJjZSBUaGUgY29tcG9uZW50IGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmQgdGhlIGhpc3RvZ3JhbSBkYXRhIG9mIHdoaWNoIGlzIHJlYWR5LlxuICAgICAqIEBwYXJhbSB7SGlzdG9ncmFtQ29uZmlnfSBldmVudC5oaXN0b2dyYW1Db25maWcgQ29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gYGhpc3RvZ3JhbVdpZGdldGAuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5ncmFwaC5IaXN0b2dyYW19IGV2ZW50Lmhpc3RvZ3JhbVdpZGdldCBUaGUgdW5kZXJseWluZyB3aWRnZXQgdGhhdCBpcyB1c2VkIHRvIHJlbmRlciBhIGNoYXJ0LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVJlbmRlclJlY29yZEhpc3RvZ3JhbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGltZWxpbmVIaXN0b2dyYW0sIHJlY29yZDogTW9kZWwsIGhpc3RvZ3JhbUNvbmZpZzogSGlzdG9ncmFtQ29uZmlnLCBoaXN0b2dyYW1XaWRnZXQ6IEhpc3RvZ3JhbSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGEgcm93IGlzIHJlbmRlcmVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGZpcmluZyBHcmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5yb3cuUm93fSBldmVudC5yb3cgVGhlIHJvdyBhYm91dCB0byBiZSByZW5kZXJlZC5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgZm9yIHRoZSByb3cuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LnJlY29yZEluZGV4IFRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSByZWNvcmQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUmVuZGVyUm93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCByb3c6IFJvdywgcmVjb3JkOiBNb2RlbCwgcmVjb3JkSW5kZXg6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogR3JpZCByb3dzIGFyZSBhYm91dCB0byBiZSByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhpcyBncmlkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVJlbmRlclJvd3M6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgYmVmb3JlIHJvdyBjb2xsYXBzZSBpcyBzdGFydGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNldmVudC1iZWZvcmVSb3dDb2xsYXBzZSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVSb3dDb2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIGJlZm9yZSByb3cgZXhwYW5kIGlzIHN0YXJ0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2V2ZW50LWJlZm9yZVJvd0V4cGFuZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVSb3dFeHBhbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyByZWNvcmQ6IE1vZGVsIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4gUmV0dXJuaW5nIGBmYWxzZWAgZnJvbSBhIGxpc3RlbmVyIHByZXZlbnRzIHRoZSBjaGFuZ2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmFjdGlvbiBgJ3NlbGVjdCdgL2AnZGVzZWxlY3QnYFxuICAgICAqIEBwYXJhbSB7J3JvdycsJ2NlbGwnfSBldmVudC5tb2RlIGAncm93J2AvYCdjZWxsJ2BcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5kZXNlbGVjdGVkIFRoZSByZWNvcmRzIHRvIGJlIGRlc2VsZWN0ZWQgaW4gdGhpcyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuc2VsZWN0ZWQgVGhlIHJlY29yZHMgdG8gYmUgc2VsZWN0ZWQgaW4gdGhpcyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuc2VsZWN0aW9uIFRoZSByZWNvcmRzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgYmVmb3JlIGFwcGx5aW5nIGBzZWxlY3RlZGAgYW5kIGBkZXNlbGVjdGVkYFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbltdfSBldmVudC5kZXNlbGVjdGVkQ2VsbHMgVGhlIGNlbGxzIHRvIGJlIGRlc2VsZWN0ZWQgaW4gdGhpcyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9uW119IGV2ZW50LnNlbGVjdGVkQ2VsbHMgVGhlIGNlbGxzIHRvIGJlIHNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbltdfSBldmVudC5jZWxsU2VsZWN0aW9uIFRoZSBjZWxscyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24sIGJlZm9yZSBhcHBseWluZyBgc2VsZWN0ZWRDZWxsc2AgYW5kIGBkZXNlbGVjdGVkQ2VsbHNgXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU2VsZWN0aW9uQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgYWN0aW9uOiBzdHJpbmcsIG1vZGU6ICdyb3cnfCdjZWxsJywgc291cmNlOiBHcmlkLCBkZXNlbGVjdGVkOiBNb2RlbFtdLCBzZWxlY3RlZDogTW9kZWxbXSwgc2VsZWN0aW9uOiBNb2RlbFtdLCBkZXNlbGVjdGVkQ2VsbHM6IEdyaWRMb2NhdGlvbltdLCBzZWxlY3RlZENlbGxzOiBHcmlkTG9jYXRpb25bXSwgY2VsbFNlbGVjdGlvbjogR3JpZExvY2F0aW9uW10gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgdGhpcyBjb250YWluZXIgd2lsbCBsb2FkIHJlY29yZCB2YWx1ZXMgaW50byBpdHMgY2hpbGQgZmllbGRzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3VcbiAgICAgKiB3YW50IHRvIG1vZGlmeSB0aGUgVUkgYmVmb3JlIGRhdGEgaXMgbG9hZGVkIChlLmcuIHNldCBzb21lIGlucHV0IGZpZWxkIHRvIGJlIHJlYWRvbmx5KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbnRhaW5lcn0gZXZlbnQuc291cmNlIFRoZSBjb250YWluZXJcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTZXRSZWNvcmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENvbnRhaW5lciwgcmVjb3JkOiBNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJlZm9yZSBhIHdpZGdldCBpcyBzaG93bi4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldCxhbnl9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIHNob3duXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0fGFueSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgZWRpdGluZyBzdGFydHMsIHJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgZWRpdGluZ1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7Um93RWRpdG9yQ29udGV4dH0gZXZlbnQuZWRpdG9yQ29udGV4dCBFZGl0aW5nIGNvbnRleHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTdGFydFJvd0VkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGVkaXRvckNvbnRleHQ6IFJvd0VkaXRvckNvbnRleHQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgc3RhdGUgaXMgYXBwbGllZCB0byB0aGUgc291cmNlLiBBbGxvd3MgZWRpdGluZyB0aGUgc3RhdGUgb2JqZWN0IG9yIHByZXZlbnRpbmcgdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkU3RhdGVJbmZvfSBldmVudC5zdGF0ZSBTdGF0ZSBvYmplY3QgY29uZmlnXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU3RhdGVBcHBseTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHN0YXRlOiBHcmlkU3RhdGVJbmZvIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIHN0YXRlIGlzIHNhdmVkIGJ5IHRoZSBTdGF0ZVByb3ZpZGVyLiBBbGxvd3MgZWRpdGluZyB0aGUgc3RhdGUgb2JqZWN0IG9yIHByZXZlbnRpbmcgdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkU3RhdGVJbmZvfSBldmVudC5zdGF0ZSBTdGF0ZSBvYmplY3QgY29uZmlnXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU3RhdGVTYXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc3RhdGU6IEdyaWRTdGF0ZUluZm8gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgZ3JvdXAgaXMgZ29pbmcgdG8gYmUgZXhwYW5kZWQgb3IgY29sbGFwc2VkIHVzaW5nIHRoZSBVSS5cbiAgICAgKiBSZXR1cm5pbmcgYGZhbHNlYCBmcm9tIGEgbGlzdGVuZXIgcHJldmVudHMgdGhlIG9wZXJhdGlvblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQuZ3JvdXBSZWNvcmQgW0RFUFJFQ0FURURdIFVzZSBgZ3JvdXBSZWNvcmRzYCBwYXJhbSBpbnN0ZWFkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuZ3JvdXBSZWNvcmRzIFRoZSBncm91cCByZWNvcmRzIGJlaW5nIHRvZ2dsZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbGxhcHNlIENvbGxhcHNlZCAodHJ1ZSkgb3IgZXhwYW5kZWQgKGZhbHNlKVxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSB1c2VyIGludGVyYWN0aW9uIGV2ZW50IChlZyBhIGBjbGlja2AgZXZlbnQpIGlmIHRoZSB0b2dnbGUgcmVxdWVzdCB3YXMgaW5zdGlnYXRlZCBieSB1c2VyIGludGVyYWN0aW9uLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVRvZ2dsZUdyb3VwOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JvdXBSZWNvcmQ6IE1vZGVsLCBncm91cFJlY29yZHM6IE1vZGVsW10sIGNvbGxhcHNlOiBib29sZWFuLCBkb21FdmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgYSBwYXJlbnQgbm9kZSByZWNvcmQgdG9nZ2xlcyBpdHMgY29sbGFwc2VkIHN0YXRlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGZpcmluZyBHcmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCBiZWluZyB0b2dnbGVkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29sbGFwc2UgYHRydWVgIGlmIHRoZSBub2RlIGlzIGJlaW5nIGNvbGxhcHNlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVUb2dnbGVOb2RlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCByZWNvcmQ6IE1vZGVsLCBjb2xsYXBzZTogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIHdoZW4gZWRpdGluZyBpcyBjYW5jZWxsZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgSW5jbHVkZWQgaWYgdGhlIGNhbmNlbGxhdGlvbiB3YXMgdHJpZ2dlcmVkIGJ5IGEgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2FuY2VsQ2VsbEVkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGVkaXRvckNvbnRleHQ6IEdyaWRMb2NhdGlvbiwgZXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFueSBvdGhlciBldmVudCBpcyBmaXJlZCBmcm9tIHRoZSBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2V2ZW50LWNhdGNoQWxsKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3tba2V5OiBzdHJpbmddOiBhbnksIHR5cGU6IHN0cmluZ319IGV2ZW50LmV2ZW50IFRoZSBPYmplY3QgdGhhdCBjb250YWlucyBldmVudCBkZXRhaWxzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmV2ZW50LnR5cGUgVGhlIHR5cGUgb2YgdGhlIGV2ZW50IHdoaWNoIGlzIGNhdWdodCBieSB0aGUgbGlzdGVuZXJcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DYXRjaEFsbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7W2tleTogc3RyaW5nXTogYW55LCB0eXBlOiBzdHJpbmd9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB1c2VyIGNsaWNrcyBpbiBhIGdyaWQgY2VsbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgcm93XG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIHRvIHdoaWNoIHRoZSBjZWxsIGJlbG9uZ3NcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIHRhcmdldDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHVzZXIgYWN0aXZhdGVzIGNvbnRleHRtZW51IGluIGEgZ3JpZCBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSByb3dcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gdG8gd2hpY2ggdGhlIGNlbGwgYmVsb25nc1xuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRhcmdldCBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbENvbnRleHRNZW51OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdXNlciBkb3VibGUgY2xpY2tzIGEgZ3JpZCBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSByb3dcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gdG8gd2hpY2ggdGhlIGNlbGwgYmVsb25nc1xuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRhcmdldCBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbERibENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBncmlkIGJlZm9yZSB0aGUgY29udGV4dCBtZW51IGlzIHNob3duIGZvciBhIGNlbGwuXG4gICAgICogQWxsb3dzIG1hbmlwdWxhdGlvbiBvZiB0aGUgaXRlbXMgdG8gc2hvdyBpbiB0aGUgc2FtZSB3YXkgYXMgaW4gdGhlIFtwcm9jZXNzSXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9DZWxsTWVudSNjb25maWctcHJvY2Vzc0l0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jZXZlbnQtY2VsbE1lbnVCZWZvcmVTaG93KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gQ29sdW1uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTWVudUJlZm9yZVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIG1lbnU6IE1lbnUsIGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5PiwgY29sdW1uOiBDb2x1bW4sIHJlY29yZDogTW9kZWwgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgZ3JpZCB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQgaW4gdGhlIGNlbGwgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gQ29sdW1uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTWVudUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtLCBjb2x1bW46IENvbHVtbiwgcmVjb3JkOiBNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIGdyaWQgYWZ0ZXIgdGhlIGNvbnRleHQgbWVudSBpcyBzaG93biBmb3IgYSBjZWxsLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gQ29sdW1uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTWVudVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIG1lbnU6IE1lbnUsIGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5PiwgY29sdW1uOiBDb2x1bW4sIHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBncmlkIHdoZW4gYSBjaGVjayBpdGVtIGlzIHRvZ2dsZWQgaW4gdGhlIGNlbGwgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gQ29sdW1uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNoZWNrZWQgQ2hlY2tlZCBvciBub3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTWVudVRvZ2dsZUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtLCBjb2x1bW46IENvbHVtbiwgcmVjb3JkOiBNb2RlbCwgY2hlY2tlZDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgbW91c2UgZW50ZXJzIGEgY2VsbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSBob3ZlcmVkIGNlbGxcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gY3VycmVudGx5IGhvdmVyZWRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbE1vdXNlRW50ZXI6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgYSBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCByZXByZXNlbnRpbmcgdGhlIGNlbGwgdGhhdCB0aGUgbW91c2UgbGVmdFxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGNvbHVtbiByZXByZXNlbnRpbmcgdGhlIGNlbGwgdGhhdCB0aGUgbW91c2UgbGVmdFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudCB0aGF0IHRoZSBtb3VzZSBsZWZ0XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNb3VzZUxlYXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCByZWNvcmQ6IE1vZGVsLCBjb2x1bW46IENvbHVtbiwgY2VsbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHVzZXIgbW92ZXMgdGhlIG1vdXNlIG91dCBvZiBhIGdyaWQgY2VsbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgcm93XG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIHRvIHdoaWNoIHRoZSBjZWxsIGJlbG9uZ3NcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNb3VzZU91dDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIHRhcmdldDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHVzZXIgbW92ZXMgdGhlIG1vdXNlIG92ZXIgYSBncmlkIGNlbGxcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuZ3JpZCBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCByZXByZXNlbnRpbmcgdGhlIHJvd1xuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGNvbHVtbiB0byB3aGljaCB0aGUgY2VsbCBiZWxvbmdzXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuY2VsbEVsZW1lbnQgVGhlIGNlbGwgSFRNTCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudGFyZ2V0IFRoZSB0YXJnZXQgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTW91c2VPdmVyOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBQYW5lbCBpcyBjb2xsYXBzZWQgdXNpbmcgdGhlIFtjb2xsYXBzaWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNpYmxlKSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlBhbmVsfSBldmVudC5zb3VyY2UgVGhpcyBQYW5lbC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogUGFuZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBhIHBhcmVudCBub2RlIHJlY29yZCBpcyBjb2xsYXBzZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHdoaWNoIGhhcyBiZWVuIGNvbGxhcHNlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2xsYXBzZU5vZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGNvbHVtbiBpcyBiZWluZyBkcmFnZ2VkLCBhbmQgeW91IGNhbiBzZXQgdGhlIGB2YWxpZGAgZmxhZyBvbiB0aGUgYGNvbnRleHRgIG9iamVjdFxuICAgICAqIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gaXMgdmFsaWQgb3Igbm90LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgZHJhZ2dlZCBjb2x1bW4uXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50Lmluc2VydEJlZm9yZSBUaGUgY29sdW1uIGJlZm9yZSB3aGljaCB0aGUgZHJhZ2dlZCBjb2x1bW4gd2lsbCBiZSBpbnNlcnRlZCAoaWYgbm90IGxhc3QpLlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBicm93c2VyIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb250ZXh0LnZhbGlkIFNldCB0aGlzIHRvIGB0cnVlYCBvciBgZmFsc2VgIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gaXMgdmFsaWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uRHJhZzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY29sdW1uOiBDb2x1bW4sIGluc2VydEJlZm9yZTogQ29sdW1uLCBldmVudDogRXZlbnQsIGNvbnRleHQ6IHsgdmFsaWQ6IGJvb2xlYW4gfSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgY29sdW1uIGRyYWcgZ2VzdHVyZSBoYXMgc3RhcnRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGRyYWdnZWQgY29sdW1uLlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBicm93c2VyIGV2ZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtbkRyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY29sdW1uOiBDb2x1bW4sIGV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBhbHdheXMgZmlyZWQgYWZ0ZXIgYSBjb2x1bW4gaXMgZHJvcHBlZC4gVGhlIGB2YWxpZGAgcGFyYW0gaXMgYHRydWVgIGlmIHRoZSBvcGVyYXRpb24gd2FzIG5vdFxuICAgICAqIHZldG9lZCBhbmQgdGhlIGNvbHVtbiB3YXMgbW92ZWQgaW4gdGhlIGNvbHVtbiBzdG9yZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGRyYWdnZWQgY29sdW1uLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5pbnNlcnRCZWZvcmUgVGhlIGNvbHVtbiBiZWZvcmUgd2hpY2ggdGhlIGRyYWdnZWQgY29sdW1uIHdpbGwgYmUgaW5zZXJ0ZWQuXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50Lm5ld1BhcmVudCBUaGUgbmV3IHBhcmVudCBjb2x1bW4uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC52YWxpZCBgdHJ1ZWAgaWYgdGhlIG9wZXJhdGlvbiB3YXMgbm90IHZldG9lZC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQucmVnaW9uIFRoZSByZWdpb24gd2hlcmUgdGhlIGNvbHVtbiB3YXMgZHJvcHBlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5Ecm9wOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjb2x1bW46IENvbHVtbiwgaW5zZXJ0QmVmb3JlOiBDb2x1bW4sIG5ld1BhcmVudDogQ29sdW1uLCB2YWxpZDogYm9vbGVhbiwgZXZlbnQ6IEV2ZW50LCByZWdpb246IHN0cmluZyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSByZXNpemUgZ2VzdHVyZSBpcyBjb21wbGV0ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIHJlc2l6ZWQgY29sdW1uXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5SZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBkb21FdmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGNvbHVtbiByZXNpemUgZ2VzdHVyZSBzdGFydHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGNvbHVtblxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBicm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uUmVzaXplU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBkb21FdmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyB3aWRnZXQgd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkIGluIHRoZSBjb250ZXh0IG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIG93bmluZyB3aWRnZXRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbnRleHRNZW51SXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIHdpZGdldCB3aGVuIGEgY2hlY2sgaXRlbSBpcyB0b2dnbGVkIGluIHRoZSBjb250ZXh0IG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIG93bmluZyB3aWRnZXRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY2hlY2tlZCBDaGVja2VkIG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbnRleHRNZW51VG9nZ2xlSXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSwgY2hlY2tlZDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGFmdGVyIGEgY29weSBhY3Rpb24gaXMgcGVyZm9ybWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbltdfSBldmVudC5jZWxscyBUaGUgY2VsbHMgYWJvdXQgdG8gYmUgY29waWVkIG9yIGN1dFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5jb3BpZWREYXRhU3RyaW5nIFRoZSBjb25jYXRlbmF0ZWQgZGF0YSBzdHJpbmcgdGhhdCB3YXMgY29waWVkIG9yIGN1dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNDdXQgYHRydWVgIGlmIHRoaXMgd2FzIGEgY3V0IGFjdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5lbnRpdHlOYW1lICdjZWxsJyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgY29weSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db3B5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjZWxsczogR3JpZExvY2F0aW9uW10sIGNvcGllZERhdGFTdHJpbmc6IHN0cmluZywgaXNDdXQ6IGJvb2xlYW4sIGVudGl0eU5hbWU6IHN0cmluZyB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIvR2FudHQgd2hlbiB0aGUgbGluZSBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWUgaXMgdXBkYXRlZCAoc2VlIFtjdXJyZW50VGltZUxpbmVVcGRhdGVJbnRlcnZhbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL2ZlYXR1cmUvVGltZVJhbmdlcyNjb25maWctY3VycmVudFRpbWVMaW5lVXBkYXRlSW50ZXJ2YWwpKS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5TY2hlZHVsZXJ9IGV2ZW50LnNvdXJjZSBUaGUgc2NoZWR1bGVyXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBjdXJyZW50IGRhdGVcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DdXJyZW50VGltZWxpbmVVcGRhdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgZGF0ZTogRGF0ZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBkYXRhIGluIHRoZSBzdG9yZSBjaGFuZ2VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNldmVudC1kYXRhQ2hhbmdlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duaW5nIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5TdG9yZX0gZXZlbnQuc3RvcmUgVGhlIG9yaWdpbmF0aW5nIHN0b3JlXG4gICAgICogQHBhcmFtIHsncmVtb3ZlJywncmVtb3ZlQWxsJywnYWRkJywnY2xlYXJjaGFuZ2VzJywnZmlsdGVyJywndXBkYXRlJywnZGF0YXNldCcsJ3JlcGxhY2UnfSBldmVudC5hY3Rpb24gTmFtZSBvZiBhY3Rpb24gd2hpY2ggdHJpZ2dlcmVkIHRoZSBjaGFuZ2UuIE1heSBiZSBvbmUgb2Y6ICAqIGAncmVtb3ZlJ2AgKiBgJ3JlbW92ZUFsbCdgICogYCdhZGQnYCAqIGAnY2xlYXJjaGFuZ2VzJ2AgKiBgJ2ZpbHRlcidgICogYCd1cGRhdGUnYCAqIGAnZGF0YXNldCdgICogYCdyZXBsYWNlJ2BcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIENoYW5nZWQgcmVjb3JkLCBmb3IgYWN0aW9ucyB0aGF0IGFmZmVjdHMgZXhhY3RseSBvbmUgcmVjb3JkIChgJ3VwZGF0ZSdgKVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnJlY29yZHMgQ2hhbmdlZCByZWNvcmRzLCBwYXNzZWQgZm9yIGFsbCBhY3Rpb25zIGV4Y2VwdCBgJ3JlbW92ZUFsbCdgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNoYW5nZXMgUGFzc2VkIGZvciB0aGUgYCd1cGRhdGUnYCBhY3Rpb24sIGluZm8gb24gd2hpY2ggcmVjb3JkIGZpZWxkcyBjaGFuZ2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGF0YUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3RvcmU6IFN0b3JlLCBhY3Rpb246ICdyZW1vdmUnfCdyZW1vdmVBbGwnfCdhZGQnfCdjbGVhcmNoYW5nZXMnfCdmaWx0ZXInfCd1cGRhdGUnfCdkYXRhc2V0J3wncmVwbGFjZScsIHJlY29yZDogTW9kZWwsIHJlY29yZHM6IE1vZGVsW10sIGNoYW5nZXM6IG9iamVjdCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgcmFuZ2Ugb2YgZGF0ZXMgZW5jYXBzdWxhdGVkIGJ5IHRoZSBVSSBjaGFuZ2VzLiBUaGlzIHdpbGwgYmUgd2hlblxuICAgICAqIG1vdmluZyBhIHZpZXcgaW4gdGltZSBieSByZWNvbmZpZ3VyaW5nIGl0cyBbdGltZUF4aXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lQmFzZSNjb25maWctdGltZUF4aXMpLiBUaGlzIHdpbGwgaGFwcGVuXG4gICAgICogd2hlbiB6b29taW5nLCBvciBjaGFuZ2luZyBbdmlld1ByZXNldF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVCYXNlI2NvbmZpZy12aWV3UHJlc2V0KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jZXZlbnQtZGF0ZVJhbmdlQ2hhbmdlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlRpbWVsaW5lQmFzZX0gZXZlbnQuc291cmNlIFRoaXMgU2NoZWR1bGVyL0dhbnR0IGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5vbGQgVGhlIG9sZCBkYXRlIHJhbmdlXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5vbGQuc3RhcnREYXRlIHRoZSBvbGQgc3RhcnQgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZC5lbmREYXRlIHRoZSBvbGQgZW5kIGRhdGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50Lm5ldyBUaGUgbmV3IGRhdGUgcmFuZ2VcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm5ldy5zdGFydERhdGUgdGhlIG5ldyBzdGFydCBkYXRlLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQubmV3LmVuZERhdGUgdGhlIG5ldyBlbmQgZGF0ZS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EYXRlUmFuZ2VDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRpbWVsaW5lQmFzZSwgb2xkOiB7IHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSB9LCBuZXc6IHsgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlIH0gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW4gb2JqZWN0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLkJhc2V9IGV2ZW50LnNvdXJjZSBUaGUgT2JqZWN0IHRoYXQgaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRlc3Ryb3k6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtdXRhdGVkIGFuZCB0aGUgc3RhdGUgb2YgdGhlIFtoYXNDaGFuZ2VzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjcHJvcGVydHktaGFzQ2hhbmdlcykgcHJvcGVydHkgY2hhbmdlc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbnRhaW5lcn0gZXZlbnQuc291cmNlIFRoZSBjb250YWluZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5kaXJ0eSBUaGUgZGlydHkgc3RhdGUgb2YgdGhlIENvbnRhaW5lciAtIGB0cnVlYCBpZiB0aGVyZSBhcmUgYW55IGZpZWxkcyB3aGljaCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBpbml0aWFsIGxvYWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGlydHlTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ29udGFpbmVyLCBkaXJ0eTogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hpbGUgZHJhZyBzZWxlY3RpbmcuIFVJIHdpbGwgdXBkYXRlIHdpdGggY3VycmVudCByYW5nZSwgYnV0IHRoZSBjZWxscyB3aWxsIG5vdCBiZSBzZWxlY3RlZCB1bnRpbFxuICAgICAqIG1vdXNlIHVwLiBUaGlzIGV2ZW50IGNhbiBiZSBsaXN0ZW5lZCBmb3IgdG8gcGVyZm9ybSBhY3Rpb25zIHdoaWxlIGRyYWcgc2VsZWN0aW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge0dyaWRMb2NhdGlvbkNvbmZpZ1tdLEdyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuc2VsZWN0ZWRDZWxscyBUaGUgY2VsbHMgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgZHJhZ2dlZCBvdmVyXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuc2VsZWN0ZWRSZWNvcmRzIFRoZSByZWNvcmRzIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGRyYWdnZWQgb3ZlclxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRyYWdTZWxlY3Rpbmc6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHNlbGVjdGVkQ2VsbHM6IEdyaWRMb2NhdGlvbkNvbmZpZ1tdfEdyaWRMb2NhdGlvbltdLCBzZWxlY3RlZFJlY29yZHM6IE1vZGVsW10gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgd2lkZ2V0J3MgW2VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KSBpcyBhdmFpbGFibGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmVsZW1lbnQgVGhlIFdpZGdldCdzIGVsZW1lbnQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRWxlbWVudENyZWF0ZWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBlbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIFBhbmVsIGlzIGV4cGFuZGVkIHVzaW5nIHRoZSBbY29sbGFwc2libGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzaWJsZSkgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5QYW5lbH0gZXZlbnQuc291cmNlIFRoaXMgUGFuZWwuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXhwYW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBQYW5lbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYWZ0ZXIgYSBwYXJlbnQgbm9kZSByZWNvcmQgaXMgZXhwYW5kZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHdoaWNoIGhhcyBiZWVuIGV4cGFuZGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV4cGFuZE5vZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBmaWxlIGlzIGRyb3BwZWQgb24gdGhlIHdpZGdldCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgb3duaW5nIEdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0RhdGFUcmFuc2Zlckl0ZW19IGV2ZW50LmZpbGUgVGhlIGRyb3BwZWQgZmlsZSBkZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIHtEcmFnRXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBuYXRpdmUgRHJhZ0V2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRmlsZURyb3A6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGZpbGU6IERhdGFUcmFuc2Zlckl0ZW0sIGRvbUV2ZW50OiBEcmFnRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSB0aGUgRmlsbEhhbmRsZSBkcmFnZ2luZyBpcyBmaW5hbGl6ZWQgYW5kIHZhbHVlcyBhcmUgYXBwbGllZCB0byBjZWxscywgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGVcbiAgICAgKiBkcmFnIG9wZXJhdGlvbiBmcm9tIGFwcGx5aW5nIGRhdGEgY2hhbmdlcy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC5mcm9tIFRoZSBmcm9tIGNlbGxcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LnRvIFRoZSB0byBjZWxsXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcmF3IERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbGxIYW5kbGVCZWZvcmVEcmFnRmluYWxpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBmcm9tOiBHcmlkTG9jYXRpb24sIHRvOiBHcmlkTG9jYXRpb24sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hpbGUgZHJhZ2dpbmcgdGhlIEZpbGxIYW5kbGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQuZnJvbSBUaGUgZnJvbSBjZWxsXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC50byBUaGUgdG8gY2VsbFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIHJhdyBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25GaWxsSGFuZGxlRHJhZzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGZyb206IEdyaWRMb2NhdGlvbiwgdG86IEdyaWRMb2NhdGlvbiwgZG9tRXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBGaWxsSGFuZGxlIGRyYWcgb3BlcmF0aW9uIGlzIGFib3J0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRmlsbEhhbmRsZURyYWdBYm9ydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKCkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGFmdGVyIGEgRmlsbEhhbmRsZSBkcmFnIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC5mcm9tIFRoZSBmcm9tIGNlbGxcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LnRvIFRoZSB0byBjZWxsXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcmF3IERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbGxIYW5kbGVEcmFnRW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZnJvbTogR3JpZExvY2F0aW9uLCB0bzogR3JpZExvY2F0aW9uLCBkb21FdmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBkcmFnZ2luZyBvZiB0aGUgRmlsbEhhbmRsZSBzdGFydHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQuY2VsbCBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sdW1uIC8gcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcmF3IERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbGxIYW5kbGVEcmFnU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjZWxsOiBHcmlkTG9jYXRpb24sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIHdoZW4gY2VsbCBlZGl0aW5nIGlzIGZpbmlzaGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGFyZ2V0IGdyaWRcbiAgICAgKiBAcGFyYW0ge0NlbGxFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbmlzaENlbGxFZGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgZWRpdG9yQ29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgdGhlIHJvdyBlZGl0aW5nIGlzIGZpbmlzaGVkLCByZXR1cm4gZmFsc2UgdG8gc2lnbmFsIHRoYXQgdGhlIHZhbHVlIGlzIGludmFsaWQgYW5kIGVkaXRpbmcgc2hvdWxkIG5vdCBiZSBmaW5hbGl6ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2V2ZW50LWZpbmlzaFJvd0VkaXQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGFyZ2V0IGdyaWRcbiAgICAgKiBAcGFyYW0ge1Jvd0VkaXRvckNvbnRleHR9IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRmluaXNoUm93RWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIGVkaXRvckNvbnRleHQ6IFJvd0VkaXRvckNvbnRleHQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGZvY3VzIGVudGVycyB0aGlzIFdpZGdldC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGlzIFdpZGdldFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmZyb21FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudG9FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuZnJvbVdpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnRvV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuYmFja3dhcmRzIGB0cnVlYCBpZiB0aGUgYHRvRWxlbWVudGAgaXMgYmVmb3JlIHRoZSBgZnJvbUVsZW1lbnRgIGluIGRvY3VtZW50IG9yZGVyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZvY3VzSW46IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZnJvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBmcm9tV2lkZ2V0OiBXaWRnZXQsIHRvV2lkZ2V0OiBXaWRnZXQsIGJhY2t3YXJkczogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBmb2N1cyBleGl0cyB0aGlzIFdpZGdldCdzIG93bmVyc2hpcCB0cmVlLiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIGEgYGJsdXJgIGV2ZW50LlxuICAgICAqIGZvY3VzIG1vdmluZyBmcm9tIHdpdGhpbiB0aGlzIFdpZGdldCdzIG93bmVyc2hpcCB0cmVlLCBldmVuIGlmIHRoZXJlIGFyZSBmbG9hdGluZyB3aWRnZXRzXG4gICAgICogd2lsbCBub3QgdHJpZ2dlciB0aGlzIGV2ZW50LiBUaGlzIGlzIHdoZW4gZm9jdXMgZXhpdHMgdGhpcyB3aWRnZXQgY29tcGxldGVseS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGlzIFdpZGdldFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmZyb21FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudG9FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuZnJvbVdpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnRvV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuYmFja3dhcmRzIGB0cnVlYCBpZiB0aGUgYHRvRWxlbWVudGAgaXMgYmVmb3JlIHRoZSBgZnJvbUVsZW1lbnRgIGluIGRvY3VtZW50IG9yZGVyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZvY3VzT3V0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIGZyb21FbGVtZW50OiBIVE1MRWxlbWVudCwgdG9FbGVtZW50OiBIVE1MRWxlbWVudCwgZnJvbVdpZGdldDogV2lkZ2V0LCB0b1dpZGdldDogV2lkZ2V0LCBiYWNrd2FyZHM6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBkcmFnZ2luZyBzdGFydHMsIHJldHVybiBmYWxzZSB0byBwcmV2ZW50IHRoZSBkcmFnIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LnNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50LFRvdWNoRXZlbnR9IGV2ZW50LmV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uR3JpZFJvd0JlZm9yZURyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZEJhc2UsIGNvbnRleHQ6IHsgcmVjb3JkczogTW9kZWxbXSB9LCBldmVudDogTW91c2VFdmVudHxUb3VjaEV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIHRoZSByb3cgZHJvcCBvcGVyYXRpb24gaXMgZmluYWxpemVkLiBZb3UgY2FuIHJldHVybiBmYWxzZSB0byBhYm9ydCB0aGUgZHJvcCBvcGVyYXRpb24sIG9yIGFcbiAgICAgKiBQcm9taXNlIHlpZWxkaW5nIGB0cnVlYCAvIGBmYWxzZWAgd2hpY2ggYWxsb3dzIGZvciBhc3luY2hyb25vdXMgYWJvcnQgKGUuZy4gZmlyc3Qgc2hvdyB1c2VyIGEgY29uZmlybWF0aW9uIGRpYWxvZykuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29udGV4dC52YWxpZCBTZXQgdGhpcyB0byB0cnVlIG9yIGZhbHNlIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gaXMgdmFsaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQuY29udGV4dC5pbnNlcnRCZWZvcmUgVGhlIHJlY29yZCB0byBpbnNlcnQgYmVmb3JlIChgbnVsbGAgaWYgaW5zZXJ0aW5nIGF0IGxhc3QgcG9zaXRpb24gb2YgYSBwYXJlbnQgbm9kZSlcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQuY29udGV4dC5wYXJlbnQgVGhlIHBhcmVudCByZWNvcmQgb2YgdGhlIGN1cnJlbnQgZHJvcCBwb3NpdGlvbiAob25seSBhcHBsaWNhYmxlIGZvciB0cmVlcylcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5jb250ZXh0LnJlY29yZHMgVGhlIGRyYWdnZWQgcm93IHJlY29yZHNcbiAgICAgKiBAcGFyYW0ge1JlY29yZFBvc2l0aW9uQ29udGV4dFtdfSBldmVudC5jb250ZXh0Lm9sZFBvc2l0aW9uQ29udGV4dCBBbiBhcnJheSBvZiBvYmplY3RzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByZXZpb3VzIHRyZWUgcG9zaXRpb24uIE9iamVjdHMgY29udGFpbiB0aGUgYHJlY29yZGAsIGFuZCBpdHMgb3JpZ2luYWwgYHBhcmVudEluZGV4YCBhbmQgYHBhcmVudElkYCB2YWx1ZXNcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uR3JpZFJvd0JlZm9yZURyb3BGaW5hbGl6ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZEJhc2UsIGNvbnRleHQ6IHsgdmFsaWQ6IGJvb2xlYW4sIGluc2VydEJlZm9yZTogTW9kZWwsIHBhcmVudDogTW9kZWwsIHJlY29yZHM6IE1vZGVsW10sIG9sZFBvc2l0aW9uQ29udGV4dDogUmVjb3JkUG9zaXRpb25Db250ZXh0W10gfSwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGlsZSB0aGUgcm93IGlzIGJlaW5nIGRyYWdnZWQsIGluIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiB5b3UgaGF2ZSBhY2Nlc3MgdG8gYGNvbnRleHQuaW5zZXJ0QmVmb3JlYCBhIGdyaWQgL1xuICAgICAqIHRyZWUgcmVjb3JkLCBhbmQgYWRkaXRpb25hbGx5IGBjb250ZXh0LnBhcmVudGAgKGEgVHJlZU5vZGUpIGZvciB0cmVlcy4gWW91IGNhbiBzaWduYWwgdGhhdCB0aGUgZHJvcCBwb3NpdGlvbiBpc1xuICAgICAqIHZhbGlkIG9yIGludmFsaWQgYnkgc2V0dGluZyBgY29udGV4dC52YWxpZCA9IGZhbHNlO2BcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LnNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb250ZXh0LnZhbGlkIFNldCB0aGlzIHRvIHRydWUgb3IgZmFsc2UgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgZHJvcCBwb3NpdGlvbiBpcyB2YWxpZC5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQuY29udGV4dC5pbnNlcnRCZWZvcmUgVGhlIHJlY29yZCB0byBpbnNlcnQgYmVmb3JlIChgbnVsbGAgaWYgaW5zZXJ0aW5nIGF0IGxhc3QgcG9zaXRpb24gb2YgYSBwYXJlbnQgbm9kZSlcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQuY29udGV4dC5wYXJlbnQgVGhlIHBhcmVudCByZWNvcmQgb2YgdGhlIGN1cnJlbnQgZHJvcCBwb3NpdGlvbiAob25seSBhcHBsaWNhYmxlIGZvciB0cmVlcylcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5jb250ZXh0LnJlY29yZHMgVGhlIGRyYWdnZWQgcm93IHJlY29yZHNcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uR3JpZFJvd0RyYWc6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWRCYXNlLCBjb250ZXh0OiB7IHZhbGlkOiBib29sZWFuLCBpbnNlcnRCZWZvcmU6IE1vZGVsLCBwYXJlbnQ6IE1vZGVsLCByZWNvcmRzOiBNb2RlbFtdIH0sIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgcm93IGRyYWcgb3BlcmF0aW9uIGlzIGFib3J0ZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LnNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkdyaWRSb3dEcmFnQWJvcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWRCYXNlLCBjb250ZXh0OiB7IHJlY29yZHM6IE1vZGVsW10gfSwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZHJhZ2dpbmcgc3RhcnRzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkQmFzZX0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNvbnRleHRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5jb250ZXh0LnJlY29yZHMgVGhlIGRyYWdnZWQgcm93IHJlY29yZHNcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnQsVG91Y2hFdmVudH0gZXZlbnQuZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25HcmlkUm93RHJhZ1N0YXJ0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkQmFzZSwgY29udGV4dDogeyByZWNvcmRzOiBNb2RlbFtdIH0sIGV2ZW50OiBNb3VzZUV2ZW50fFRvdWNoRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGFmdGVyIHRoZSByb3cgZHJvcCBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZCwgcmVnYXJkbGVzcyBvZiB2YWxpZGl0eVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkQmFzZX0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNvbnRleHRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbnRleHQudmFsaWQgdHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZHJvcCBwb3NpdGlvbiB3YXMgdmFsaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQuY29udGV4dC5pbnNlcnRCZWZvcmUgVGhlIHJlY29yZCB0byBpbnNlcnQgYmVmb3JlIChgbnVsbGAgaWYgaW5zZXJ0aW5nIGF0IGxhc3QgcG9zaXRpb24gb2YgYSBwYXJlbnQgbm9kZSlcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQuY29udGV4dC5wYXJlbnQgVGhlIHBhcmVudCByZWNvcmQgb2YgdGhlIGN1cnJlbnQgZHJvcCBwb3NpdGlvbiAob25seSBhcHBsaWNhYmxlIGZvciB0cmVlcylcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5jb250ZXh0LnJlY29yZHMgVGhlIGRyYWdnZWQgcm93IHJlY29yZHNcbiAgICAgKiBAcGFyYW0ge1JlY29yZFBvc2l0aW9uQ29udGV4dFtdfSBldmVudC5jb250ZXh0Lm9sZFBvc2l0aW9uQ29udGV4dCBBbiBhcnJheSBvZiBvYmplY3RzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByZXZpb3VzIHRyZWUgcG9zaXRpb24uIE9iamVjdHMgY29udGFpbiB0aGUgcmVjb3JkLCBhbmQgaXRzIG9yaWdpbmFsIGBwYXJlbnRJbmRleGAgYW5kIGBwYXJlbnRJZGAgdmFsdWVzXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkdyaWRSb3dEcm9wOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkQmFzZSwgY29udGV4dDogeyB2YWxpZDogYm9vbGVhbiwgaW5zZXJ0QmVmb3JlOiBNb2RlbCwgcGFyZW50OiBNb2RlbCwgcmVjb3JkczogTW9kZWxbXSwgb2xkUG9zaXRpb25Db250ZXh0OiBSZWNvcmRQb3NpdGlvbkNvbnRleHRbXSB9LCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIGdyaWQgaGVhZGVyIGlzIGNsaWNrZWQgb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2V2ZW50LWhlYWRlckNsaWNrKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgdHJpZ2dlcmluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIGNsaWNrZWQgb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGVhZGVyQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBkb21FdmVudDogRXZlbnQsIGNvbHVtbjogQ29sdW1uIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIHRoZSBjb250ZXh0IG1lbnUgaXMgc2hvd24gZm9yIGEgaGVhZGVyLlxuICAgICAqIEFsbG93cyBtYW5pcHVsYXRpb24gb2YgdGhlIGl0ZW1zIHRvIHNob3cgaW4gdGhlIHNhbWUgd2F5IGFzIGluIHRoZSBbcHJvY2Vzc0l0ZW1zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvSGVhZGVyTWVudSNjb25maWctcHJvY2Vzc0l0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvVGltZWxpbmVIaXN0b2dyYW0jZXZlbnQtaGVhZGVyTWVudUJlZm9yZVNob3cpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT59IGV2ZW50Lml0ZW1zIE1lbnUgaXRlbSBjb25maWdzXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBDb2x1bW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IZWFkZXJNZW51QmVmb3JlU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgbWVudTogTWVudSwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCBjb2x1bW46IENvbHVtbiB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBHcmlkIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgaGVhZGVyIGNvbnRleHQgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbSBTZWxlY3RlZCBtZW51IGl0ZW1cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIENvbHVtblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkhlYWRlck1lbnVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSwgY29sdW1uOiBDb2x1bW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGFmdGVyIHRoZSBjb250ZXh0IG1lbnUgaXMgc2hvd24gZm9yIGEgaGVhZGVyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT59IGV2ZW50Lml0ZW1zIE1lbnUgaXRlbSBjb25maWdzXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBDb2x1bW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IZWFkZXJNZW51U2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgbWVudTogTWVudSwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCBjb2x1bW46IENvbHVtbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgd2hlbiBhIGNoZWNrIGl0ZW0gaXMgdG9nZ2xlZCBpbiB0aGUgaGVhZGVyIGNvbnRleHQgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbSBTZWxlY3RlZCBtZW51IGl0ZW1cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIENvbHVtblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY2hlY2tlZCBDaGVja2VkIG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkhlYWRlck1lbnVUb2dnbGVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSwgY29sdW1uOiBDb2x1bW4sIGNoZWNrZWQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBhZnRlciBhIHdpZGdldCB3YXMgaGlkZGVuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkhpZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgdGhlIGNvbXBvbmVudCByZXRyaWV2ZXMgYSByZWNvcmQncyBoaXN0b2dyYW0gZGF0YSBhbmQgc3RvcmVzXG4gICAgICogaXQgaW50byB0aGUgY2FjaGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2V2ZW50LWhpc3RvZ3JhbURhdGFDYWNoZVNldClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5UaW1lbGluZUhpc3RvZ3JhbX0gZXZlbnQuc291cmNlIFRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFJlY29yZCB0aGUgaGlzdG9ncmFtIGRhdGEgb2Ygd2hpY2ggaXMgcmVhZHkuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmRhdGEgVGhlIHJlY29yZCBoaXN0b2dyYW0gZGF0YS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IaXN0b2dyYW1EYXRhQ2FjaGVTZXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRpbWVsaW5lSGlzdG9ncmFtLCByZWNvcmQ6IE1vZGVsLCBkYXRhOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gcm93IGxvY2tpbmcgaXMgZW5hYmxlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LmNsb25lIFRoZSBjcmVhdGVkIGNsb25lXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTG9ja1Jvd3M6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjbG9uZTogR3JpZEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIE1vdXNlIG1vdmVkIG91dCBmcm9tIGVsZW1lbnQgaW4gZ3JpZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgYnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbk1vdXNlT3V0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIE1vdXNlIG1vdmVkIGluIG92ZXIgZWxlbWVudCBpbiBncmlkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgVGhlIG5hdGl2ZSBicm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTW91c2VPdmVyOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIHJlcXVlc3RlZCBkYXRlIHJhbmdlIGNhbm5vdCBmaXQgaW50byBhbnkgem9vbSBsZXZlbCBoaWdoZXIgdGhhbiB0aGUgY3VycmVudCBsZXZlbC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LmN1cnJlbnRab29tTGV2ZWwgVGhlIGN1cnJlbnQgem9vbSBsZXZlbFxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuc3RhcnREYXRlIFRoZSByZXF1ZXN0ZWQgc3RhcnQgZGF0ZVxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZW5kRGF0ZSBUaGUgcmVxdWVzdGVkIGVuZCBkYXRlXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTm9ab29tQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY3VycmVudFpvb21MZXZlbDogbnVtYmVyLCBzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgd2lkZ2V0IHdoaWNoIGhhZCBiZWVuIGluIGEgbm9uLXZpc2libGUgc3RhdGUgZm9yIGFueSByZWFzb25cbiAgICAgKiBhY2hpZXZlcyB2aXNpYmlsaXR5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNldmVudC1wYWludClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIHBhaW50ZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5maXJzdFBhaW50IGB0cnVlYCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBwYWludC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25QYWludDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBmaXJzdFBhaW50OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYWZ0ZXIgYSBwYXN0ZSBhY3Rpb24gaXMgcGVyZm9ybWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5jbGlwYm9hcmREYXRhIFRoZSBjbGlwYm9hcmREYXRhIHRoYXQgd2FzIHBhc3RlZFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50Lm1vZGlmaWVkUmVjb3JkcyBUaGUgcmVjb3JkcyB3aGljaCBoYXZlIGJlZW4gbW9kaWZpZWQgZHVlIHRvIHRoZSBwYXN0ZSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LnRhcmdldENlbGwgVGhlIGNlbGwgZnJvbSB3aGljaCB0aGUgcGFzdGUgd2lsbCBiZSBzdGFydGVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmVudGl0eU5hbWUgJ2NlbGwnIHRvIGRpc3Rpbmd1aXNoIHRoaXMgZXZlbnQgZnJvbSBvdGhlciBwYXN0ZSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25QYXN0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY2xpcGJvYXJkRGF0YTogc3RyaW5nLCBtb2RpZmllZFJlY29yZHM6IE1vZGVsW10sIHRhcmdldENlbGw6IEdyaWRMb2NhdGlvbiwgZW50aXR5TmFtZTogc3RyaW5nIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgd2hlbiBleHBvcnQgaGFzIGZpbmlzaGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7UmVzcG9uc2V9IGV2ZW50LnJlc3BvbnNlIE9wdGlvbmFsIHJlc3BvbnNlLCBpZiByZWNlaXZlZFxuICAgICAqIEBwYXJhbSB7RXJyb3J9IGV2ZW50LmVycm9yIE9wdGlvbmFsIGVycm9yLCBpZiBleGNlcHRpb24gb2NjdXJyZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25QZGZFeHBvcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyByZXNwb25zZT86IGFueSwgZXJyb3I/OiBFcnJvciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYWZ0ZXIgdGhlIFt2aWV3UHJlc2V0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9taXhpbi9UaW1lbGluZVZpZXdQcmVzZXRzI2NvbmZpZy12aWV3UHJlc2V0KSBoYXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5TY2hlZHVsZXJ9IGV2ZW50LnNvdXJjZSBUaGlzIFNjaGVkdWxlciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LnN0YXJ0RGF0ZSBUaGUgbmV3IHN0YXJ0IGRhdGUgb2YgdGhlIHRpbWVsaW5lLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuY2VudGVyRGF0ZSBUaGUgbmV3IGNlbnRlciBkYXRlIG9mIHRoZSB0aW1lbGluZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmVuZERhdGUgVGhlIG5ldyBlbmQgZGF0ZSBvZiB0aGUgdGltZWxpbmUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIucHJlc2V0LlZpZXdQcmVzZXR9IGV2ZW50LmZyb20gVGhlIG91dGdvaW5nIFZpZXdQcmVzZXQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIucHJlc2V0LlZpZXdQcmVzZXR9IGV2ZW50LnRvIFRoZSBWaWV3UHJlc2V0IGJlaW5nIHN3aXRjaGVkIHRvLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblByZXNldENoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBzdGFydERhdGU6IERhdGUsIGNlbnRlckRhdGU6IERhdGUsIGVuZERhdGU6IERhdGUsIGZyb206IFZpZXdQcmVzZXQsIHRvOiBWaWV3UHJlc2V0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFdpZGdldCdzIHJlYWQgb25seSBzdGF0ZSBpcyB0b2dnbGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQucmVhZE9ubHkgUmVhZCBvbmx5IG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlYWRPbmx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVhZE9ubHk6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSB3aWRnZXQncyBlbGVtZW50cyBoYXZlIGJlZW4gc3luY2hyb25pemVkIGR1ZSB0byBhIGRpcmVjdCBvciBpbmRpcmVjdCBjYWxsXG4gICAgICogdG8gW3JlY29tcG9zZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2Z1bmN0aW9uLXJlY29tcG9zZSksIGlmIHRoaXMgcmVzdWx0cyBpbiBzb21lIGNoYW5nZSB0byB0aGUgd2lkZ2V0J3MgcmVuZGVyZWQgRE9NIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlY29tcG9zZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKCkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGFmdGVyIGEgcm93IGlzIHJlbmRlcmVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGZpcmluZyBHcmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5yb3cuUm93fSBldmVudC5yb3cgVGhlIHJvdyB0aGF0IGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCBmb3IgdGhlIHJvdy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQucmVjb3JkSW5kZXggVGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHJlY29yZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZW5kZXJSb3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJvdzogUm93LCByZWNvcmQ6IE1vZGVsLCByZWNvcmRJbmRleDogbnVtYmVyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBHcmlkIHJvd3MgaGF2ZSBiZWVuIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGlzIGdyaWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVuZGVyUm93czogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgZW5jYXBzdWxhdGluZyBlbGVtZW50IG9mIGEgV2lkZ2V0IHJlc2l6ZXMgKm9ubHkgd2hlbiBbbW9uaXRvclJlc2l6ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1tb25pdG9yUmVzaXplKSBpcyBgdHJ1ZWAqLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LndpZHRoIFRoZSBuZXcgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQuaGVpZ2h0IFRoZSBuZXcgaGVpZ2h0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm9sZFdpZHRoIFRoZSBvbGQgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkSGVpZ2h0IFRoZSBvbGQgaGVpZ2h0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvbGRXaWR0aDogbnVtYmVyLCBvbGRIZWlnaHQ6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIHNjaGVkdWxlciBiZWZvcmUgdGhlIGNvbnRleHQgbWVudSBpcyBzaG93biBmb3IgYSByZXNvdXJjZS5cbiAgICAgKiBBbGxvd3MgbWFuaXB1bGF0aW9uIG9mIHRoZSBpdGVtcyB0byBzaG93IGluIHRoZSBzYW1lIHdheSBhcyBpbiB0aGUgW3Byb2Nlc3NJdGVtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL2ZlYXR1cmUvUmVzb3VyY2VNZW51I2NvbmZpZy1wcm9jZXNzSXRlbXMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNldmVudC1yZXNvdXJjZU1lbnVCZWZvcmVTaG93KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5Pn0gZXZlbnQuaXRlbXMgTWVudSBpdGVtIGNvbmZpZ3NcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIENvbHVtblxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc291cmNlTWVudUJlZm9yZVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgbWVudTogTWVudSwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCBjb2x1bW46IENvbHVtbiwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgc2NoZWR1bGVyIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbSBTZWxlY3RlZCBtZW51IGl0ZW1cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZWNvcmQgUmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVzb3VyY2VNZW51SXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSwgcmVjb3JkOiBSZXNvdXJjZU1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgc2NoZWR1bGVyIGFmdGVyIHRoZSBjb250ZXh0IG1lbnUgaXMgc2hvd24gZm9yIGEgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZXNvdXJjZU1lbnVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIG1lbnU6IE1lbnUsIGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5PiwgcmVjb3JkOiBSZXNvdXJjZU1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgZ3JpZCB3aGVuIGEgY2hlY2sgaXRlbSBpcyB0b2dnbGVkIGluIHRoZSBjb250ZXh0IG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFJlY29yZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY2hlY2tlZCBDaGVja2VkIG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc291cmNlTWVudVRvZ2dsZUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgbWVudTogTWVudSwgaXRlbTogTWVudUl0ZW0sIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBjaGVja2VkOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgZm9yIGNsaWNrIG9uIGEgcmVzb3VyY2UgdGltZSByYW5nZS4gT25seSB0cmlnZ2VyZWQgaWYgdGhlIFJlc291cmNlVGltZVJhbmdlIGZlYXR1cmUgaXMgY29uZmlndXJlZCB3aXRoXG4gICAgICogYGVuYWJsZU1vdXNlRXZlbnRzOiB0cnVlYC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5TY2hlZHVsZXJ9IGV2ZW50LnNvdXJjZSBUaGlzIFNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmZlYXR1cmUuUmVzb3VyY2VUaW1lUmFuZ2VzfSBldmVudC5mZWF0dXJlIFRoZSBSZXNvdXJjZVRpbWVSYW5nZSBmZWF0dXJlXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VUaW1lUmFuZ2VNb2RlbH0gZXZlbnQucmVzb3VyY2VUaW1lUmFuZ2VSZWNvcmQgUmVzb3VyY2UgdGltZSByYW5nZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBSZXNvdXJjZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmRvbUV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZXNvdXJjZVRpbWVSYW5nZUNsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGZlYXR1cmU6IFJlc291cmNlVGltZVJhbmdlcywgcmVzb3VyY2VUaW1lUmFuZ2VSZWNvcmQ6IFJlc291cmNlVGltZVJhbmdlTW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBkb21FdmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGZvciByaWdodC1jbGljayBvbiBhIHJlc291cmNlIHRpbWUgcmFuZ2UuIE9ubHkgdHJpZ2dlcmVkIGlmIHRoZSBSZXNvdXJjZVRpbWVSYW5nZSBmZWF0dXJlIGlzIGNvbmZpZ3VyZWRcbiAgICAgKiB3aXRoIGBlbmFibGVNb3VzZUV2ZW50czogdHJ1ZWAuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgVGhpcyBTY2hlZHVsZXJcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5mZWF0dXJlLlJlc291cmNlVGltZVJhbmdlc30gZXZlbnQuZmVhdHVyZSBUaGUgUmVzb3VyY2VUaW1lUmFuZ2UgZmVhdHVyZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlVGltZVJhbmdlTW9kZWx9IGV2ZW50LnJlc291cmNlVGltZVJhbmdlUmVjb3JkIFJlc291cmNlIHRpbWUgcmFuZ2UgcmVjb3JkXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgUmVzb3VyY2UgcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBCcm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVzb3VyY2VUaW1lUmFuZ2VDb250ZXh0TWVudTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBmZWF0dXJlOiBSZXNvdXJjZVRpbWVSYW5nZXMsIHJlc291cmNlVGltZVJhbmdlUmVjb3JkOiBSZXNvdXJjZVRpbWVSYW5nZU1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZG9tRXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBmb3IgZG91YmxlLWNsaWNrIG9uIGEgcmVzb3VyY2UgdGltZSByYW5nZS4gT25seSB0cmlnZ2VyZWQgaWYgdGhlIFJlc291cmNlVGltZVJhbmdlIGZlYXR1cmUgaXMgY29uZmlndXJlZFxuICAgICAqIHdpdGggYGVuYWJsZU1vdXNlRXZlbnRzOiB0cnVlYC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5TY2hlZHVsZXJ9IGV2ZW50LnNvdXJjZSBUaGlzIFNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmZlYXR1cmUuUmVzb3VyY2VUaW1lUmFuZ2VzfSBldmVudC5mZWF0dXJlIFRoZSBSZXNvdXJjZVRpbWVSYW5nZSBmZWF0dXJlXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VUaW1lUmFuZ2VNb2RlbH0gZXZlbnQucmVzb3VyY2VUaW1lUmFuZ2VSZWNvcmQgUmVzb3VyY2UgdGltZSByYW5nZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBSZXNvdXJjZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmRvbUV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZXNvdXJjZVRpbWVSYW5nZURibENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGZlYXR1cmU6IFJlc291cmNlVGltZVJhbmdlcywgcmVzb3VyY2VUaW1lUmFuZ2VSZWNvcmQ6IFJlc291cmNlVGltZVJhbmdlTW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBkb21FdmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGZvciBtb3VzZSBkb3duIG9uYSByZXNvdXJjZSB0aW1lIHJhbmdlLiBPbmx5IHRyaWdnZXJlZCBpZiB0aGUgUmVzb3VyY2VUaW1lUmFuZ2UgZmVhdHVyZSBpcyBjb25maWd1cmVkXG4gICAgICogd2l0aCBgZW5hYmxlTW91c2VFdmVudHM6IHRydWVgLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoaXMgU2NoZWR1bGVyXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuZmVhdHVyZS5SZXNvdXJjZVRpbWVSYW5nZXN9IGV2ZW50LmZlYXR1cmUgVGhlIFJlc291cmNlVGltZVJhbmdlIGZlYXR1cmVcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZVRpbWVSYW5nZU1vZGVsfSBldmVudC5yZXNvdXJjZVRpbWVSYW5nZVJlY29yZCBSZXNvdXJjZSB0aW1lIHJhbmdlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFJlc291cmNlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc291cmNlVGltZVJhbmdlTW91c2VEb3duOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGZlYXR1cmU6IFJlc291cmNlVGltZVJhbmdlcywgcmVzb3VyY2VUaW1lUmFuZ2VSZWNvcmQ6IFJlc291cmNlVGltZVJhbmdlTW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBkb21FdmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGZvciBtb3VzZSBvdXQgb2YgYSByZXNvdXJjZSB0aW1lIHJhbmdlLiBPbmx5IHRyaWdnZXJlZCBpZiB0aGUgUmVzb3VyY2VUaW1lUmFuZ2UgZmVhdHVyZSBpcyBjb25maWd1cmVkXG4gICAgICogd2l0aCBgZW5hYmxlTW91c2VFdmVudHM6IHRydWVgLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoaXMgU2NoZWR1bGVyXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuZmVhdHVyZS5SZXNvdXJjZVRpbWVSYW5nZXN9IGV2ZW50LmZlYXR1cmUgVGhlIFJlc291cmNlVGltZVJhbmdlIGZlYXR1cmVcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZVRpbWVSYW5nZU1vZGVsfSBldmVudC5yZXNvdXJjZVRpbWVSYW5nZVJlY29yZCBSZXNvdXJjZSB0aW1lIHJhbmdlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFJlc291cmNlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc291cmNlVGltZVJhbmdlTW91c2VPdXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgZmVhdHVyZTogUmVzb3VyY2VUaW1lUmFuZ2VzLCByZXNvdXJjZVRpbWVSYW5nZVJlY29yZDogUmVzb3VyY2VUaW1lUmFuZ2VNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgZm9yIG1vdXNlIG92ZXIgb24gYSByZXNvdXJjZSB0aW1lIHJhbmdlLiBPbmx5IHRyaWdnZXJlZCBpZiB0aGUgUmVzb3VyY2VUaW1lUmFuZ2UgZmVhdHVyZSBpcyBjb25maWd1cmVkXG4gICAgICogd2l0aCBgZW5hYmxlTW91c2VFdmVudHM6IHRydWVgLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoaXMgU2NoZWR1bGVyXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuZmVhdHVyZS5SZXNvdXJjZVRpbWVSYW5nZXN9IGV2ZW50LmZlYXR1cmUgVGhlIFJlc291cmNlVGltZVJhbmdlIGZlYXR1cmVcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZVRpbWVSYW5nZU1vZGVsfSBldmVudC5yZXNvdXJjZVRpbWVSYW5nZVJlY29yZCBSZXNvdXJjZSB0aW1lIHJhbmdlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFJlc291cmNlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc291cmNlVGltZVJhbmdlTW91c2VPdmVyOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGZlYXR1cmU6IFJlc291cmNlVGltZVJhbmdlcywgcmVzb3VyY2VUaW1lUmFuZ2VSZWNvcmQ6IFJlc291cmNlVGltZVJhbmdlTW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBkb21FdmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGZvciBtb3VzZSB1cCBvbmEgcmVzb3VyY2UgdGltZSByYW5nZS4gT25seSB0cmlnZ2VyZWQgaWYgdGhlIFJlc291cmNlVGltZVJhbmdlIGZlYXR1cmUgaXMgY29uZmlndXJlZFxuICAgICAqIHdpdGggYGVuYWJsZU1vdXNlRXZlbnRzOiB0cnVlYC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5TY2hlZHVsZXJ9IGV2ZW50LnNvdXJjZSBUaGlzIFNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmZlYXR1cmUuUmVzb3VyY2VUaW1lUmFuZ2VzfSBldmVudC5mZWF0dXJlIFRoZSBSZXNvdXJjZVRpbWVSYW5nZSBmZWF0dXJlXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VUaW1lUmFuZ2VNb2RlbH0gZXZlbnQucmVzb3VyY2VUaW1lUmFuZ2VSZWNvcmQgUmVzb3VyY2UgdGltZSByYW5nZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBSZXNvdXJjZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmRvbUV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZXNvdXJjZVRpbWVSYW5nZU1vdXNlVXA6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgZmVhdHVyZTogUmVzb3VyY2VUaW1lUmFuZ2VzLCByZXNvdXJjZVRpbWVSYW5nZVJlY29yZDogUmVzb3VyY2VUaW1lUmFuZ2VNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBHcmlkIHJlc2l6ZSBsZWFkIHRvIGEgbmV3IHJlc3BvbnNpdmUgbGV2ZWwgYmVpbmcgYXBwbGllZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIEdyaWQgdGhhdCB3YXMgcmVzaXplZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5sZXZlbCBOZXcgcmVzcG9uc2l2ZSBsZXZlbCAoc21hbGwsIGxhcmdlLCBldGMpXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LndpZHRoIE5ldyB3aWR0aCBpbiBweFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5vbGRMZXZlbCBPbGQgcmVzcG9uc2l2ZSBsZXZlbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5vbGRXaWR0aCBPbGQgd2lkdGggaW4gcHhcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZXNwb25zaXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgbGV2ZWw6IHN0cmluZywgd2lkdGg6IG51bWJlciwgb2xkTGV2ZWw6IHN0cmluZywgb2xkV2lkdGg6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyB3aGVuIGEgcm93IGhhcyBmaW5pc2hlZCBjb2xsYXBzaW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJvd0NvbGxhcHNlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVjb3JkOiBNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyB3aGVuIGEgcm93IGV4cGFuZCBoYXMgZmluaXNoZWQgZXhwYW5kaW5nLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvdmlldy9UaW1lbGluZUhpc3RvZ3JhbSNldmVudC1yb3dFeHBhbmQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgUmVjb3JkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmV4cGFuZGVkRWxlbWVudHMgQW4gb2JqZWN0IHdpdGggdGhlIEdyaWQgcmVnaW9uIG5hbWUgYXMgcHJvcGVydHkgYW5kIHRoZSBleHBhbmRlZCBib2R5IGVsZW1lbnQgYXMgdmFsdWVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQud2lkZ2V0IEluIGNhc2Ugb2YgZXhwYW5kaW5nIGEgV2lkZ2V0LCB0aGlzIHdpbGwgYmUgYSByZWZlcmVuY2UgdG8gdGhlIGluc3RhbmNlIGNyZWF0ZWQgYnkgdGhlIGFjdHVhbCBleHBhbnNpb24uIElmIHRoZXJlIGlzIG11bHRpcGxlIEdyaWQgcmVnaW9ucywgdXNlIHRoZSBgd2lkZ2V0c2AgcGFyYW0gaW5zdGVhZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQud2lkZ2V0cyBJbiBjYXNlIG9mIGV4cGFuZGluZyBhIFdpZGdldCwgdGhpcyB3aWxsIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBHcmlkIHJlZ2lvbiBuYW1lIGFzIHByb3BlcnR5IGFuZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSB3aWRnZXQgaW5zdGFuY2UgY3JlYXRlZCBieSB0aGUgYWN0dWFsIGV4cGFuc2lvblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJvd0V4cGFuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwsIGV4cGFuZGVkRWxlbWVudHM6IG9iamVjdCwgd2lkZ2V0OiBXaWRnZXQsIHdpZGdldHM6IG9iamVjdCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgbW91c2UgZW50ZXJzIGEgcm93XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCByZXByZXNlbnRpbmcgdGhlIGhvdmVyZWQgcm93XG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIGN1cnJlbnRseSBob3ZlcmVkXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuY2VsbEVsZW1lbnQgVGhlIGNlbGwgSFRNTCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJvd01vdXNlRW50ZXI6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgYSByb3dcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgcm93IHRoYXQgdGhlIG1vdXNlIGxlZnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnQgdGhhdCB0aGUgbW91c2UgbGVmdFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Sb3dNb3VzZUxlYXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCByZWNvcmQ6IE1vZGVsLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBHcmlkIGhhcyBzY3JvbGxlZCB2ZXJ0aWNhbGx5XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LnNjcm9sbFRvcCBUaGUgdmVydGljYWwgc2Nyb2xsIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNjcm9sbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc2Nyb2xsVG9wOiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWxlY3Rpb24gaGFzIGJlZW4gY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHsnc2VsZWN0JywnZGVzZWxlY3QnfSBldmVudC5hY3Rpb24gYCdzZWxlY3QnYC9gJ2Rlc2VsZWN0J2BcbiAgICAgKiBAcGFyYW0geydyb3cnLCdjZWxsJ30gZXZlbnQubW9kZSBgJ3JvdydgL2AnY2VsbCdgXG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuZGVzZWxlY3RlZCBUaGUgcmVjb3JkcyBkZXNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnNlbGVjdGVkIFRoZSByZWNvcmRzIHNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnNlbGVjdGlvbiBUaGUgcmVjb3JkcyBpbiB0aGUgbmV3IHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuZGVzZWxlY3RlZENlbGxzIFRoZSBjZWxscyBkZXNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbltdfSBldmVudC5zZWxlY3RlZENlbGxzIFRoZSBjZWxscyBzZWxlY3RlZCBpbiB0aGlzIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuY2VsbFNlbGVjdGlvbiBUaGUgY2VsbHMgaW4gdGhlIG5ldyBzZWxlY3Rpb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0aW9uQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgYWN0aW9uOiAnc2VsZWN0J3wnZGVzZWxlY3QnLCBtb2RlOiAncm93J3wnY2VsbCcsIHNvdXJjZTogR3JpZCwgZGVzZWxlY3RlZDogTW9kZWxbXSwgc2VsZWN0ZWQ6IE1vZGVsW10sIHNlbGVjdGlvbjogTW9kZWxbXSwgZGVzZWxlY3RlZENlbGxzOiBHcmlkTG9jYXRpb25bXSwgc2VsZWN0ZWRDZWxsczogR3JpZExvY2F0aW9uW10sIGNlbGxTZWxlY3Rpb246IEdyaWRMb2NhdGlvbltdIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VsZWN0aW9uTW9kZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5zZWxlY3Rpb25Nb2RlIFRoZSBuZXcgW3NlbGVjdGlvbk1vZGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL0dyaWQvdmlldy9taXhpbi9HcmlkU2VsZWN0aW9uI2NvbmZpZy1zZWxlY3Rpb25Nb2RlKVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNlbGVjdGlvbk1vZGVDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzZWxlY3Rpb25Nb2RlOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBhZnRlciBhIHdpZGdldCBpcyBzaG93bi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHNwbGl0dGluZyB0aGUgR3JpZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2VbXX0gZXZlbnQuc3ViVmlld3MgVGhlIHN1YiB2aWV3cyBjcmVhdGVkIGJ5IHRoZSBzcGxpdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5vcHRpb25zIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgc3BsaXQgY2FsbFxuICAgICAqIEBwYXJhbSB7J2hvcml6b250YWwnLCd2ZXJ0aWNhbCcsJ2JvdGgnfSBldmVudC5vcHRpb25zLmRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzcGxpdFxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5vcHRpb25zLmF0Q29sdW1uIFRoZSBjb2x1bW4gdG8gc3BsaXQgYXRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQub3B0aW9ucy5hdFJlY29yZCBUaGUgcmVjb3JkIHRvIHNwbGl0IGF0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3BsaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzdWJWaWV3czogR3JpZEJhc2VbXSwgb3B0aW9uczogeyBkaXJlY3Rpb246ICdob3Jpem9udGFsJ3wndmVydGljYWwnfCdib3RoJywgYXRDb2x1bW46IENvbHVtbiwgYXRSZWNvcmQ6IE1vZGVsIH0gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJ5IHRoZSBHcmlkIHdoZW4gdGhlIGNvbGxhcHNlIGljb24gaXMgY2xpY2tlZC4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgZGVmYXVsdCBjb2xsYXBzZSBhY3Rpb24sXG4gICAgICogaWYgeW91IHdhbnQgdG8gaW1wbGVtZW50IHlvdXIgb3duIGJlaGF2aW9yLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuU3ViR3JpZH0gZXZlbnQuc3ViR3JpZCBUaGUgc3ViZ3JpZFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3BsaXR0ZXJDb2xsYXBzZUNsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBzdWJHcmlkOiBTdWJHcmlkLCBkb21FdmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBieSB0aGUgR3JpZCBhZnRlciBhIHN1Yi1ncmlkIGhhcyBiZWVuIHJlc2l6ZWQgdXNpbmcgdGhlIHNwbGl0dGVyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgR3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSByZXNpemVkIHN1YmdyaWRcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNwbGl0dGVyRHJhZ0VuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3ViR3JpZDogU3ViR3JpZCwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBieSB0aGUgR3JpZCB3aGVuIGEgc3ViLWdyaWQgcmVzaXplIGdlc3R1cmUgc3RhcnRzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgR3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSBzdWJncmlkIGFib3V0IHRvIGJlIHJlc2l6ZWRcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNwbGl0dGVyRHJhZ1N0YXJ0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBzdWJHcmlkOiBTdWJHcmlkLCBkb21FdmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJ5IHRoZSBHcmlkIHdoZW4gdGhlIGV4cGFuZCBpY29uIGlzIGNsaWNrZWQuIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGRlZmF1bHQgZXhwYW5kIGFjdGlvbixcbiAgICAgKiBpZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQgeW91ciBvd24gYmVoYXZpb3IuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgR3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSBzdWJncmlkXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TcGxpdHRlckV4cGFuZENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBzdWJHcmlkOiBTdWJHcmlkLCBkb21FdmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgd2hlbiBlZGl0aW5nIHN0YXJ0c1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q2VsbEVkaXRvckNvbnRleHR9IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3RhcnRDZWxsRWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZWRpdG9yQ29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCB3aGVuIGVkaXRpbmcgc3RhcnRzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHtSb3dFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN0YXJ0Um93RWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZWRpdG9yQ29udGV4dDogUm93RWRpdG9yQ29udGV4dCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgYSBzdWIgZ3JpZCBpcyBjb2xsYXBzZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSBzdWIgZ3JpZCBpbnN0YW5jZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN1YkdyaWRDb2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3ViR3JpZDogU3ViR3JpZCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgYSBzdWIgZ3JpZCBpcyBleHBhbmRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBmaXJpbmcgR3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LlN1YkdyaWR9IGV2ZW50LnN1YkdyaWQgVGhlIHN1YiBncmlkIGluc3RhbmNlXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3ViR3JpZEV4cGFuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3ViR3JpZDogU3ViR3JpZCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgdGljayBzaXplIGNoYW5nZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2V2ZW50LXRpY2tTaXplQ2hhbmdlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoaXMgU2NoZWR1bGVyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC50aWNrU2l6ZSBUaGUgdGljayBzaXplIGluIHBpeGVsc1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRpY2tTaXplQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIHRpY2tTaXplOiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIHRpbWVheGlzIGhhcyBjaGFuZ2VkLCBmb3IgZXhhbXBsZSBieSB6b29taW5nIG9yIGNvbmZpZ3VyaW5nIGEgbmV3IHRpbWUgc3Bhbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5TY2hlZHVsZXJ9IGV2ZW50LnNvdXJjZSBUaGlzIFNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb25maWcgQ29uZmlnIG9iamVjdCB1c2VkIHRvIHJlY29uZmlndXJlIHRoZSB0aW1lIGF4aXMuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5jb25maWcuc3RhcnREYXRlIE5ldyBzdGFydCBkYXRlIChpZiBzdXBwbGllZClcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmNvbmZpZy5lbmREYXRlIE5ldyBlbmQgZGF0ZSAoaWYgc3VwcGxpZWQpXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGltZUF4aXNDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgY29uZmlnOiB7IHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSB9IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBhZnRlciBhIGNsaWNrIG9uIGEgdGltZSBheGlzIGNlbGxcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY29sdW1uLlRpbWVBeGlzQ29sdW1uLFNjaGVkdWxlci5jb2x1bW4uVmVydGljYWxUaW1lQXhpc0NvbHVtbn0gZXZlbnQuc291cmNlIFRoZSBjb2x1bW4gb2JqZWN0XG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5zdGFydERhdGUgVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIGhlYWRlciBjZWxsXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5lbmREYXRlIFRoZSBlbmQgZGF0ZSBvZiB0aGUgaGVhZGVyIGNlbGxcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBUaGUgZXZlbnQgb2JqZWN0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGltZUF4aXNIZWFkZXJDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGltZUF4aXNDb2x1bW58VmVydGljYWxUaW1lQXhpc0NvbHVtbiwgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlLCBldmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGFmdGVyIGEgcmlnaHQgY2xpY2sgb24gYSB0aW1lIGF4aXMgY2VsbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jb2x1bW4uVGltZUF4aXNDb2x1bW4sU2NoZWR1bGVyLmNvbHVtbi5WZXJ0aWNhbFRpbWVBeGlzQ29sdW1ufSBldmVudC5zb3VyY2UgVGhlIGNvbHVtbiBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LnN0YXJ0RGF0ZSBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgaGVhZGVyIGNlbGxcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmVuZERhdGUgVGhlIGVuZCBkYXRlIG9mIHRoZSBoZWFkZXIgY2VsbFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBldmVudCBvYmplY3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UaW1lQXhpc0hlYWRlckNvbnRleHRNZW51OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUaW1lQXhpc0NvbHVtbnxWZXJ0aWNhbFRpbWVBeGlzQ29sdW1uLCBzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUsIGV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgYSBkb3VibGUgY2xpY2sgb24gYSB0aW1lIGF4aXMgY2VsbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jb2x1bW4uVGltZUF4aXNDb2x1bW4sU2NoZWR1bGVyLmNvbHVtbi5WZXJ0aWNhbFRpbWVBeGlzQ29sdW1ufSBldmVudC5zb3VyY2UgVGhlIGNvbHVtbiBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LnN0YXJ0RGF0ZSBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgaGVhZGVyIGNlbGxcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmVuZERhdGUgVGhlIGVuZCBkYXRlIG9mIHRoZSBoZWFkZXIgY2VsbFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBldmVudCBvYmplY3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UaW1lQXhpc0hlYWRlckRibENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUaW1lQXhpc0NvbHVtbnxWZXJ0aWNhbFRpbWVBeGlzQ29sdW1uLCBzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUsIGV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBvciBHYW50dCB3aWRnZXQgYmVmb3JlIHRoZSBjb250ZXh0IG1lbnUgaXMgc2hvd24gZm9yIHRoZSB0aW1lIGF4aXMgaGVhZGVyLlxuICAgICAqIEFsbG93cyBtYW5pcHVsYXRpb24gb2YgdGhlIGl0ZW1zIHRvIHNob3cgaW4gdGhlIHNhbWUgd2F5IGFzIGluIHRoZSBbcHJvY2Vzc0l0ZW1zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzL2FwaS9TY2hlZHVsZXIvZmVhdHVyZS9UaW1lQXhpc0hlYWRlck1lbnUjY29uZmlnLXByb2Nlc3NJdGVtcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2V2ZW50LXRpbWVBeGlzSGVhZGVyTWVudUJlZm9yZVNob3cpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgVGhlIHNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT59IGV2ZW50Lml0ZW1zIE1lbnUgaXRlbSBjb25maWdzXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaW1lIGF4aXMgY29sdW1uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGltZUF4aXNIZWFkZXJNZW51QmVmb3JlU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBtZW51OiBNZW51LCBpdGVtczogUmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT4sIGNvbHVtbjogQ29sdW1uIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBvciBHYW50dCB3aWRnZXQgd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkIGluIHRoZSBoZWFkZXIgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoZSBzY2hlZHVsZXJcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGltZSBheGlzIGNvbHVtblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRpbWVBeGlzSGVhZGVyTWVudUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgbWVudTogTWVudSwgaXRlbTogTWVudUl0ZW0sIGNvbHVtbjogQ29sdW1uIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgU2NoZWR1bGVyIG9yIEdhbnR0IHdpZGdldCBhZnRlciB0aGUgY29udGV4dCBtZW51IGlzIHNob3duIGZvciBhIGhlYWRlclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoZSBzY2hlZHVsZXJcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGltZSBheGlzIGNvbHVtblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRpbWVBeGlzSGVhZGVyTWVudVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgbWVudTogTWVudSwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCBjb2x1bW46IENvbHVtbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgcG9pbnRlci1hY3RpdmF0ZWQgW3RpbWVsaW5lQ29udGV4dF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vVGltZWxpbmVEb21FdmVudHMjcHJvcGVydHktdGltZWxpbmVDb250ZXh0KSBoYXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudXRpbC5UaW1lbGluZUNvbnRleHR9IGV2ZW50Lm9sZENvbnRleHQgVGhlIHRpY2svcmVzb3VyY2UgY29udGV4dCBiZWluZyBkZWFjdGl2YXRlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci51dGlsLlRpbWVsaW5lQ29udGV4dH0gZXZlbnQuY29udGV4dCBUaGUgdGljay9yZXNvdXJjZSBjb250ZXh0IGJlaW5nIGFjdGl2YXRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UaW1lbGluZUNvbnRleHRDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBvbGRDb250ZXh0OiBUaW1lbGluZUNvbnRleHQsIGNvbnRleHQ6IFRpbWVsaW5lQ29udGV4dCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgKnNjaGVkdWxlciogdmlld3BvcnQgKG5vdCB0aGUgb3ZlcmFsbCBTY2hlZHVsZXIgZWxlbWVudCkgY2hhbmdlcyBzaXplLlxuICAgICAqIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBncmlkIGNoYW5nZXMgaGVpZ2h0LCBvciB3aGVuIHRoZSBzdWJncmlkIHdoaWNoIGVuY2Fwc3VsYXRlcyB0aGVcbiAgICAgKiBzY2hlZHVsZXIgY29sdW1uIGNoYW5nZXMgd2lkdGguXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBTY2hlZHVsZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQud2lkdGggVGhlIG5ldyB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5oZWlnaHQgVGhlIG5ldyBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkV2lkdGggVGhlIG9sZCB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5vbGRIZWlnaHQgVGhlIG9sZCBoZWlnaHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UaW1lbGluZVZpZXdwb3J0UmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvbGRXaWR0aDogbnVtYmVyLCBvbGRIZWlnaHQ6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgb3IgR2FudHQgd2lkZ2V0IHdoZW4gYSBjbGljayBoYXBwZW5zIG9uIGEgdGltZSByYW5nZSBoZWFkZXIgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFNjaGVkdWxlciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlRpbWVTcGFufSBldmVudC50aW1lUmFuZ2VSZWNvcmQgVGhlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRpbWVSYW5nZUhlYWRlckNsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIHRpbWVSYW5nZVJlY29yZDogVGltZVNwYW4sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBvciBHYW50dCB3aWRnZXQgd2hlbiBhIHJpZ2h0IGNsaWNrIGhhcHBlbnMgb24gYSB0aW1lIHJhbmdlIGhlYWRlciBlbGVtZW50XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgU2NoZWR1bGVyIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuVGltZVNwYW59IGV2ZW50LnRpbWVSYW5nZVJlY29yZCBUaGUgcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBCcm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGltZVJhbmdlSGVhZGVyQ29udGV4dE1lbnU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgdGltZVJhbmdlUmVjb3JkOiBUaW1lU3BhbiwgZG9tRXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIG9uIHRoZSBvd25pbmcgU2NoZWR1bGVyIG9yIEdhbnR0IHdpZGdldCB3aGVuIGEgZG91YmxlIGNsaWNrIGhhcHBlbnMgb24gYSB0aW1lIHJhbmdlIGhlYWRlciBlbGVtZW50XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgU2NoZWR1bGVyIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuVGltZVNwYW59IGV2ZW50LnRpbWVSYW5nZVJlY29yZCBUaGUgcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBCcm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGltZVJhbmdlSGVhZGVyRGJsQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgdGltZVJhbmdlUmVjb3JkOiBUaW1lU3BhbiwgZG9tRXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gb25lIG9yIG1vcmUgZ3JvdXBzIGFyZSBleHBhbmRlZCBvciBjb2xsYXBzZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50Lmdyb3VwUmVjb3JkIFtERVBSRUNBVEVEXSBVc2UgYGdyb3VwUmVjb3Jkc2AgcGFyYW0gaW5zdGVhZFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50Lmdyb3VwUmVjb3JkcyBUaGUgZ3JvdXAgcmVjb3JkcyBiZWluZyB0b2dnbGVkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb2xsYXBzZSBDb2xsYXBzZWQgKHRydWUpIG9yIGV4cGFuZGVkIChmYWxzZSlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmFsbFJlY29yZHMgVHJ1ZSBpZiB0aGlzIGV2ZW50IGlzIHBhcnQgb2YgdG9nZ2xpbmcgYWxsIGdyb3Vwc1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRvZ2dsZUdyb3VwOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JvdXBSZWNvcmQ6IE1vZGVsLCBncm91cFJlY29yZHM6IE1vZGVsW10sIGNvbGxhcHNlOiBib29sZWFuLCBhbGxSZWNvcmRzPzogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYWZ0ZXIgYSBwYXJlbnQgbm9kZSByZWNvcmQgdG9nZ2xlcyBpdHMgY29sbGFwc2VkIHN0YXRlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgYmVpbmcgdG9nZ2xlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbGxhcHNlIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBiZWluZyBjb2xsYXBzZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVG9nZ2xlTm9kZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwsIGNvbGxhcHNlOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBBIGhlYWRlciBbdG9vbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXRvb2xzKSBoYXMgYmVlbiBjbGlja2VkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlRvb2x9IGV2ZW50LnNvdXJjZSBUaGlzIFBhbmVsLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuVG9vbH0gZXZlbnQudG9vbCBUaGUgdG9vbCB3aGljaCBpcyBiZWluZyBjbGlja2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRvb2xDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVG9vbCwgdG9vbDogVG9vbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiByb3cgbG9ja2luZyBpcyBkaXNhYmxlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LmNsb25lIFRoZSBsb2NrZWQgY2xvbmUgdGhhdCB3aWxsIGJlIGRlc3Ryb3llZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblVubG9ja1Jvd3M6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjbG9uZTogR3JpZEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdW4tc3BsaXR0aW5nIHRoZSBHcmlkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblVuc3BsaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KCgpID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSByYW5nZSBvZiBkYXRlcyB2aXNpYmxlIHdpdGhpbiB0aGUgdmlld3BvcnQgY2hhbmdlcy4gVGhpcyB3aWxsIGJlIHdoZW5cbiAgICAgKiBzY3JvbGxpbmcgYWxvbmcgYSB0aW1lIGF4aXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L1RpbWVsaW5lSGlzdG9ncmFtI2V2ZW50LXZpc2libGVEYXRlUmFuZ2VDaGFuZ2UpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgVGhpcyBTY2hlZHVsZXIgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50Lm9sZCBUaGUgb2xkIGRhdGUgcmFuZ2VcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZC5zdGFydERhdGUgdGhlIG9sZCBzdGFydCBkYXRlLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQub2xkLmVuZERhdGUgdGhlIG9sZCBlbmQgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQubmV3IFRoZSBuZXcgZGF0ZSByYW5nZVxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQubmV3LnN0YXJ0RGF0ZSB0aGUgbmV3IHN0YXJ0IGRhdGUuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5uZXcuZW5kRGF0ZSB0aGUgbmV3IGVuZCBkYXRlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblZpc2libGVEYXRlUmFuZ2VDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgb2xkOiB7IHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSB9LCBuZXc6IHsgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlIH0gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuZCBhcHBlbmQgdGhlIHVuZGVybHlpbmcgd2lkZ2V0XG4gICAgICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICBtZSA9IHRoaXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZWxlbWVudFJlZixcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnXG4gICAgICAgICAgICB9ID0gbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDbGFzcyxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZU5hbWUsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZ3MsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUV2ZW50c1xuICAgICAgICAgICAgfSA9IEJyeW50dW1UaW1lbGluZUhpc3RvZ3JhbUNvbXBvbmVudDtcblxuICAgICAgICBicnludHVtQ29uZmlncy5maWx0ZXIocHJvcCA9PiBwcm9wIGluIHRoaXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGJyeW50dW1Db25maWcsIHByb3AsIHRoaXNbcHJvcF0pO1xuICAgICAgICAgICAgaWYgKFsnZmVhdHVyZXMnLCAnY29uZmlnJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb25maWdQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGJyeW50dW1FdmVudHMuZmlsdGVyKGV2ZW50ID0+IHRoaXNbZXZlbnRdICYmIHRoaXNbZXZlbnRdLm9ic2VydmVycy5sZW5ndGggPiAwKS5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgdW5jYXBpdGFsaXplID0gKHN0cjogc3RyaW5nKSA9PiBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSksXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lID0gKHN0cjogc3RyaW5nKSA9PiB1bmNhcGl0YWxpemUoc3RyLnNsaWNlKDIpKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5saXN0ZW5lcnNbZXZlbnROYW1lKGV2ZW50KV0gPSBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbWVbZXZlbnRdLmVtaXQoZSk7XG4gICAgICAgICAgICAgICAgLy8gRXZlbnRFbWl0dGVyIGRvZXMgbm90IHJldHVybiB2YWx1ZXMgaW4gdGhlIG5vcm1hbCB3YXksIHdvcmsgYXJvdW5kIGl0IGJ5IHNldHRpbmcgYHJldHVyblZhbHVlYCBmbGFnXG4gICAgICAgICAgICAgICAgLy8gaW4gQW5ndWxhciBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIHNwZWNpZmllZCBpbiBjb25maWcgdGhlbiB1c2UgYWRvcHQgdG8gV3JhcHBlcidzIGVsZW1lbnRcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIGNvbnRhaW5lclBhcmFtID0gW1xuICAgICAgICAgICAgICAgICdhZG9wdCcsXG4gICAgICAgICAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QWZ0ZXInLFxuICAgICAgICAgICAgICAgICdpbnNlcnRCZWZvcmUnXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgXS5maW5kKHByb3AgPT4gYnJ5bnR1bUNvbmZpZ1twcm9wXSk7XG4gICAgICAgIGlmICghY29udGFpbmVyUGFyYW0pIHtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU5hbWUgPT09ICdCdXR0b24nIHx8IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRSb290Tm9kZSgpIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbiBzaG91bGQgYWx3YXlzIGJlIDxhPiBvciA8YnV0dG9uPiBpbnNpZGUgb3duZXIgZWxlbWVudFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYXBwZW5kVG8gPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFkb3B0ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29udGFpbmVyKGluc3RhbmNlTmFtZSwgY29udGFpbmVyUGFyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZS5pbnN0YW5jZSA9IGluc3RhbmNlTmFtZSA9PT0gJ1dpZGdldCcgPyBXaWRnZXQuY3JlYXRlKGJyeW50dW1Db25maWcpIDogbmV3IGluc3RhbmNlQ2xhc3MoYnJ5bnR1bUNvbmZpZyk7XG5cbiAgICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIGdyaWRJbnN0YW5jZSwgc2NoZWR1bGVySW5zdGFuY2UgZXRjLlxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lW1N0cmluZ0hlbHBlci51bmNhcGl0YWxpemUoaW5zdGFuY2VOYW1lKSArICdJbnN0YW5jZSddID0gbWUuaW5zdGFuY2U7XG4gICAgICAgIC8vIFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdhdGNoIGZvciBjaGFuZ2VzXG4gICAgICogQHBhcmFtIGNoYW5nZXNcbiAgICAgKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICB7IGluc3RhbmNlIH0gPSB0aGlzLFxuICAgICAgICAgICAgeyBpbnN0YW5jZU5hbWUgfSA9IEJyeW50dW1UaW1lbGluZUhpc3RvZ3JhbUNvbXBvbmVudDtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgY2hhbmdlc1xuICAgICAgICBPYmplY3QuZW50cmllcyhjaGFuZ2VzKS5mb3JFYWNoKChbcHJvcCwgY2hhbmdlXSkgPT4ge1xuICAgICAgICAgICAgY29uc3RcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IChjaGFuZ2UgYXMgU2ltcGxlQ2hhbmdlKS5jdXJyZW50VmFsdWUsXG4gICAgICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgICAgICB7IGJyeW50dW1Db25maWdzT25seSwgYnJ5bnR1bVByb3BzIH0gPSBCcnludHVtVGltZWxpbmVIaXN0b2dyYW1Db21wb25lbnQ7XG4gICAgICAgICAgICBpZiAoYnJ5bnR1bVByb3BzLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5hcHBseVByb3BWYWx1ZShpbnN0YW5jZSwgcHJvcCwgbmV3VmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJ5bnR1bUNvbmZpZ3NPbmx5LmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ1VwZGF0ZVByb3AoaW5zdGFuY2VOYW1lLCBwcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMuaW5zdGFuY2UuZGVzdHJveSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|