@bryntum/grid-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.
Files changed (34) hide show
  1. package/README.md +44 -0
  2. package/bryntum-grid-angular-thin.d.ts +5 -0
  3. package/bundles/bryntum-grid-angular-thin.umd.js +12313 -0
  4. package/bundles/bryntum-grid-angular-thin.umd.js.map +1 -0
  5. package/esm2015/bryntum-grid-angular-thin.js +5 -0
  6. package/esm2015/lib/bryntum-a-i-filter-field.component.js +792 -0
  7. package/esm2015/lib/bryntum-checklist-filter-combo.component.js +944 -0
  8. package/esm2015/lib/bryntum-grid-base.component.js +2100 -0
  9. package/esm2015/lib/bryntum-grid-chart-designer.component.js +589 -0
  10. package/esm2015/lib/bryntum-grid-field-filter-picker-group.component.js +755 -0
  11. package/esm2015/lib/bryntum-grid-field-filter-picker.component.js +745 -0
  12. package/esm2015/lib/bryntum-grid.component.js +2104 -0
  13. package/esm2015/lib/bryntum-group-bar.component.js +728 -0
  14. package/esm2015/lib/bryntum-tree-combo.component.js +933 -0
  15. package/esm2015/lib/bryntum-tree-grid.component.js +2104 -0
  16. package/esm2015/lib/grid.module.js +69 -0
  17. package/esm2015/lib/wrapper.helper.js +74 -0
  18. package/esm2015/public-api.js +15 -0
  19. package/fesm2015/bryntum-grid-angular-thin.js +11856 -0
  20. package/fesm2015/bryntum-grid-angular-thin.js.map +1 -0
  21. package/lib/bryntum-a-i-filter-field.component.d.ts +969 -0
  22. package/lib/bryntum-checklist-filter-combo.component.d.ts +1211 -0
  23. package/lib/bryntum-grid-base.component.d.ts +2272 -0
  24. package/lib/bryntum-grid-chart-designer.component.d.ts +692 -0
  25. package/lib/bryntum-grid-field-filter-picker-group.component.d.ts +930 -0
  26. package/lib/bryntum-grid-field-filter-picker.component.d.ts +917 -0
  27. package/lib/bryntum-grid.component.d.ts +2274 -0
  28. package/lib/bryntum-group-bar.component.d.ts +873 -0
  29. package/lib/bryntum-tree-combo.component.d.ts +1200 -0
  30. package/lib/bryntum-tree-grid.component.d.ts +2274 -0
  31. package/lib/grid.module.d.ts +16 -0
  32. package/lib/wrapper.helper.d.ts +26 -0
  33. package/package.json +33 -0
  34. package/public-api.d.ts +11 -0
@@ -0,0 +1,2104 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ /**
3
+ * Angular wrapper for Bryntum Grid
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 { Grid } from '@bryntum/grid-thin';
9
+ import { StringHelper } from '@bryntum/core-thin';
10
+ import * as i0 from "@angular/core";
11
+ export class BryntumGridComponent {
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 on the owning Grid before the cell editing is canceled, return `false` to prevent cancellation.
24
+ * @param {object} event Event object
25
+ * @param {Grid.view.Grid} event.source Owner grid
26
+ * @param {Grid.util.GridLocation} event.editorContext Editing context
27
+ */
28
+ this.onBeforeCancelCellEdit = new EventEmitter();
29
+ /**
30
+ * 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.
31
+ * ...
32
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/Grid#event-beforeCancelRowEdit)
33
+ * @param {object} event Event object
34
+ * @param {Grid.view.Grid} event.grid Target grid
35
+ * @param {RowEditorContext} event.editorContext Editing context
36
+ */
37
+ this.onBeforeCancelRowEdit = new EventEmitter();
38
+ /**
39
+ * Fires on the owning Grid before editing starts, return `false` to prevent editing
40
+ * @param {object} event Event object
41
+ * @param {Grid.view.Grid} event.source Owner grid
42
+ * @param {CellEditorContext} event.editorContext Editing context
43
+ */
44
+ this.onBeforeCellEditStart = new EventEmitter();
45
+ /**
46
+ * Fires on the owning Grid before deleting a range of selected cell values by pressing `Backspace` or `Del`
47
+ * buttons while [autoEdit](https://bryntum.com/products/grid/docs/api/Grid/feature/CellEdit#config-autoEdit) is set to `true`. Return `false` to prevent editing.
48
+ * @param {object} event Event object
49
+ * @param {Grid.view.Grid} event.source Owner grid
50
+ * @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).
51
+ */
52
+ this.onBeforeCellRangeDelete = new EventEmitter();
53
+ /**
54
+ * Fires for each selected record on the owning Grid before editing a range of selected cell values
55
+ * @param {object} event Event object
56
+ * @param {Core.data.Model} event.record Current selected record from the range
57
+ * @param {string} event.field The field being changed
58
+ * @param {any} event.value The value being set
59
+ */
60
+ this.onBeforeCellRangeEdit = new EventEmitter();
61
+ /**
62
+ * This event is fired prior to starting a column drag gesture. The drag is canceled if a listener returns `false`.
63
+ * @param {object} event Event object
64
+ * @param {Grid.view.Grid} event.source The grid instance.
65
+ * @param {Grid.column.Column} event.column The dragged column.
66
+ * @param {Event} event.event The browser event.
67
+ */
68
+ this.onBeforeColumnDragStart = new EventEmitter();
69
+ /**
70
+ * This event is fired when a column is dropped, and you can return false from a listener to abort the operation.
71
+ * @param {object} event Event object
72
+ * @param {Grid.view.Grid} event.source The grid instance.
73
+ * @param {Grid.column.Column} event.column The dragged column.
74
+ * @param {Grid.column.Column} event.insertBefore The column before which the dragged column will be inserted.
75
+ * @param {Grid.column.Column} event.newParent The new parent column.
76
+ * @param {Event} event.event The browser event.
77
+ * @param {string} event.region The region where the column was dropped.
78
+ */
79
+ this.onBeforeColumnDropFinalize = new EventEmitter();
80
+ /**
81
+ * This event is fired prior to starting a column resize gesture. The resize is canceled if a listener returns
82
+ * `false`.
83
+ * @param {object} event Event object
84
+ * @param {Grid.view.Grid} event.source The grid instance
85
+ * @param {Grid.column.Column} event.column The column
86
+ * @param {Event} event.domEvent The browser event
87
+ */
88
+ this.onBeforeColumnResize = new EventEmitter();
89
+ /**
90
+ * Fires on the owning Grid before a copy action is performed, return `false` to prevent the action
91
+ * @param {object} event Event object
92
+ * @param {Grid.view.Grid} event.source Owner grid
93
+ * @param {Grid.util.GridLocation[]} event.cells The cells about to be copied or cut
94
+ * @param {string} event.data The string data about to be copied or cut
95
+ * @param {boolean} event.isCut `true` if this is a cut action
96
+ * @param {string} event.entityName 'cell' to distinguish this event from other beforeCopy events
97
+ */
98
+ this.onBeforeCopy = new EventEmitter();
99
+ /**
100
+ * Fires on the owning Grid before CSV export starts. Return `false` to cancel the export.
101
+ * @param {object} event Event object
102
+ * @param {ExportConfig} event.config Export config
103
+ * @param {Grid.column.Column[]} event.columns An array of columns to export
104
+ * @param {Core.data.Model[]} event.rows An array of records to export
105
+ * @param {string} event.lineDelimiter The CSV delimiter to separate lines
106
+ * @param {string} event.columnDelimiter The CSV delimiter to separate values on one line
107
+ */
108
+ this.onBeforeCSVExport = new EventEmitter();
109
+ /**
110
+ * Fires before an object is destroyed.
111
+ * @param {object} event Event object
112
+ * @param {Core.Base} event.source The Object that is being destroyed.
113
+ */
114
+ this.onBeforeDestroy = new EventEmitter();
115
+ /**
116
+ * Fires on the owning Grid before Excel export starts. Return `false` to cancel the export.
117
+ * @param {object} event Event object
118
+ * @param {ExportConfig} event.config Export config
119
+ * @param {XLSColumn[]} event.columns An array of columns to export
120
+ * @param {any[][]} event.rows An array of records to export
121
+ */
122
+ this.onBeforeExcelExport = new EventEmitter();
123
+ /**
124
+ * Fired before dragging of the FillHandle starts, return `false` to prevent the drag operation.
125
+ * @param {object} event Event object
126
+ * @param {Grid.util.GridLocation} event.cell Information about the column / record
127
+ * @param {MouseEvent} event.domEvent The raw DOM event
128
+ */
129
+ this.onBeforeFillHandleDragStart = new EventEmitter();
130
+ /**
131
+ * 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.
132
+ * @param {object} event Event object
133
+ * @param {Grid.view.Grid} event.grid Target grid
134
+ * @param {CellEditorContext} event.editorContext Editing context
135
+ */
136
+ this.onBeforeFinishCellEdit = new EventEmitter();
137
+ /**
138
+ * 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.
139
+ * ...
140
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/Grid#event-beforeFinishRowEdit)
141
+ * @param {object} event Event object
142
+ * @param {Grid.view.Grid} event.grid Target grid
143
+ * @param {RowEditorContext} event.editorContext Editing context
144
+ */
145
+ this.onBeforeFinishRowEdit = new EventEmitter();
146
+ /**
147
+ * Triggered before a widget is hidden. Return `false` to prevent the action.
148
+ * @param {object} event Event object
149
+ * @param {Core.widget.Widget} event.source The widget being hidden.
150
+ */
151
+ this.onBeforeHide = new EventEmitter();
152
+ /**
153
+ * Fires on the owning Grid before a paste action is performed, return `false` to prevent the action
154
+ * @param {object} event Event object
155
+ * @param {Grid.view.Grid} event.source Owner grid
156
+ * @param {string} event.clipboardData The clipboardData about to be pasted
157
+ * @param {Grid.util.GridLocation} event.targetCell The cell from which the paste will be started
158
+ * @param {string} event.entityName 'cell' to distinguish this event from other beforePaste events
159
+ * @param {string} event.text The raw text from clipboard
160
+ */
161
+ this.onBeforePaste = new EventEmitter();
162
+ /**
163
+ * Fires on the owning Grid before export started. Return `false` to cancel the export.
164
+ * @param {object} event Event object
165
+ * @param {object} event.config Export config
166
+ */
167
+ this.onBeforePdfExport = new EventEmitter();
168
+ /**
169
+ * Fires before a row is rendered.
170
+ * @param {object} event Event object
171
+ * @param {Grid.view.Grid} event.source The firing Grid instance.
172
+ * @param {Grid.row.Row} event.row The row about to be rendered.
173
+ * @param {Core.data.Model} event.record The record for the row.
174
+ * @param {number} event.recordIndex The zero-based index of the record.
175
+ */
176
+ this.onBeforeRenderRow = new EventEmitter();
177
+ /**
178
+ * Grid rows are about to be rendered
179
+ * @param {object} event Event object
180
+ * @param {Grid.view.Grid} event.source This grid.
181
+ */
182
+ this.onBeforeRenderRows = new EventEmitter();
183
+ /**
184
+ * This event fires before row collapse is started.
185
+ * ...
186
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/Grid#event-beforeRowCollapse)
187
+ * @param {object} event Event object
188
+ * @param {Core.data.Model} event.record Record
189
+ */
190
+ this.onBeforeRowCollapse = new EventEmitter();
191
+ /**
192
+ * This event fires before row expand is started.
193
+ * ...
194
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/Grid#event-beforeRowExpand)
195
+ * @param {object} event Event object
196
+ * @param {Core.data.Model} event.record Record
197
+ */
198
+ this.onBeforeRowExpand = new EventEmitter();
199
+ /**
200
+ * Fires before the selection changes. Returning `false` from a listener prevents the change
201
+ * @param {object} event Event object
202
+ * @param {string} event.action `'select'`/`'deselect'`
203
+ * @param {'row','cell'} event.mode `'row'`/`'cell'`
204
+ * @param {Grid.view.Grid} event.source
205
+ * @param {Core.data.Model[]} event.deselected The records to be deselected in this operation.
206
+ * @param {Core.data.Model[]} event.selected The records to be selected in this operation.
207
+ * @param {Core.data.Model[]} event.selection The records in the current selection, before applying `selected` and `deselected`
208
+ * @param {Grid.util.GridLocation[]} event.deselectedCells The cells to be deselected in this operation.
209
+ * @param {Grid.util.GridLocation[]} event.selectedCells The cells to be selected in this operation.
210
+ * @param {Grid.util.GridLocation[]} event.cellSelection The cells in the current selection, before applying `selectedCells` and `deselectedCells`
211
+ */
212
+ this.onBeforeSelectionChange = new EventEmitter();
213
+ /**
214
+ * Fired before this container will load record values into its child fields. This is useful if you
215
+ * want to modify the UI before data is loaded (e.g. set some input field to be readonly)
216
+ * @param {object} event Event object
217
+ * @param {Core.widget.Container} event.source The container
218
+ * @param {Core.data.Model} event.record The record
219
+ */
220
+ this.onBeforeSetRecord = new EventEmitter();
221
+ /**
222
+ * Triggered before a widget is shown. Return `false` to prevent the action.
223
+ * @param {object} event Event object
224
+ * @param {Core.widget.Widget,any} event.source The widget being shown
225
+ */
226
+ this.onBeforeShow = new EventEmitter();
227
+ /**
228
+ * Fires on the owning Grid before editing starts, return `false` to prevent editing
229
+ * @param {object} event Event object
230
+ * @param {Grid.view.Grid} event.source Owner grid
231
+ * @param {RowEditorContext} event.editorContext Editing context
232
+ */
233
+ this.onBeforeStartRowEdit = new EventEmitter();
234
+ /**
235
+ * Fired before state is applied to the source. Allows editing the state object or preventing the operation.
236
+ * @param {object} event Event object
237
+ * @param {GridStateInfo} event.state State object config
238
+ */
239
+ this.onBeforeStateApply = new EventEmitter();
240
+ /**
241
+ * Fired before state is saved by the StateProvider. Allows editing the state object or preventing the operation.
242
+ * @param {object} event Event object
243
+ * @param {GridStateInfo} event.state State object config
244
+ */
245
+ this.onBeforeStateSave = new EventEmitter();
246
+ /**
247
+ * Fired when a group is going to be expanded or collapsed using the UI.
248
+ * Returning `false` from a listener prevents the operation
249
+ * @param {object} event Event object
250
+ * @param {Core.data.Model} event.groupRecord [DEPRECATED] Use `groupRecords` param instead
251
+ * @param {Core.data.Model[]} event.groupRecords The group records being toggled
252
+ * @param {boolean} event.collapse Collapsed (true) or expanded (false)
253
+ * @param {Event} event.domEvent The user interaction event (eg a `click` event) if the toggle request was instigated by user interaction.
254
+ */
255
+ this.onBeforeToggleGroup = new EventEmitter();
256
+ /**
257
+ * Fired before a parent node record toggles its collapsed state.
258
+ * @param {object} event Event object
259
+ * @param {Grid.view.Grid} event.source The firing Grid instance.
260
+ * @param {Core.data.Model} event.record The record being toggled.
261
+ * @param {boolean} event.collapse `true` if the node is being collapsed.
262
+ */
263
+ this.onBeforeToggleNode = new EventEmitter();
264
+ /**
265
+ * Fires on the owning Grid when editing is cancelled
266
+ * @param {object} event Event object
267
+ * @param {Grid.view.Grid} event.source Owner grid
268
+ * @param {Grid.util.GridLocation} event.editorContext Editing context
269
+ * @param {Event} event.event Included if the cancellation was triggered by a DOM event
270
+ */
271
+ this.onCancelCellEdit = new EventEmitter();
272
+ /**
273
+ * Fires when any other event is fired from the object.
274
+ * ...
275
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/Grid#event-catchAll)
276
+ * @param {object} event Event object
277
+ * @param {{[key: string]: any, type: string}} event.event The Object that contains event details
278
+ * @param {string} event.event.type The type of the event which is caught by the listener
279
+ */
280
+ this.onCatchAll = new EventEmitter();
281
+ /**
282
+ * Fired when user clicks in a grid cell
283
+ * @param {object} event Event object
284
+ * @param {Grid.view.Grid} event.grid The grid instance
285
+ * @param {Core.data.Model} event.record The record representing the row
286
+ * @param {Grid.column.Column} event.column The column to which the cell belongs
287
+ * @param {HTMLElement} event.cellElement The cell HTML element
288
+ * @param {HTMLElement} event.target The target element
289
+ * @param {MouseEvent} event.event The native DOM event
290
+ */
291
+ this.onCellClick = new EventEmitter();
292
+ /**
293
+ * Fired when user activates contextmenu in a grid cell
294
+ * @param {object} event Event object
295
+ * @param {Grid.view.Grid} event.grid The grid instance
296
+ * @param {Core.data.Model} event.record The record representing the row
297
+ * @param {Grid.column.Column} event.column The column to which the cell belongs
298
+ * @param {HTMLElement} event.cellElement The cell HTML element
299
+ * @param {HTMLElement} event.target The target element
300
+ * @param {MouseEvent} event.event The native DOM event
301
+ */
302
+ this.onCellContextMenu = new EventEmitter();
303
+ /**
304
+ * Fired when user double clicks a grid cell
305
+ * @param {object} event Event object
306
+ * @param {Grid.view.Grid} event.grid The grid instance
307
+ * @param {Core.data.Model} event.record The record representing the row
308
+ * @param {Grid.column.Column} event.column The column to which the cell belongs
309
+ * @param {HTMLElement} event.cellElement The cell HTML element
310
+ * @param {HTMLElement} event.target The target element
311
+ * @param {MouseEvent} event.event The native DOM event
312
+ */
313
+ this.onCellDblClick = new EventEmitter();
314
+ /**
315
+ * This event fires on the owning grid before the context menu is shown for a cell.
316
+ * Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/grid/docs/api/Grid/feature/CellMenu#config-processItems).
317
+ * ...
318
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/Grid#event-cellMenuBeforeShow)
319
+ * @param {object} event Event object
320
+ * @param {Grid.view.Grid} event.source The grid
321
+ * @param {Core.widget.Menu} event.menu The menu
322
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
323
+ * @param {Grid.column.Column} event.column Column
324
+ * @param {Core.data.Model} event.record Record
325
+ */
326
+ this.onCellMenuBeforeShow = new EventEmitter();
327
+ /**
328
+ * This event fires on the owning grid when an item is selected in the cell context menu.
329
+ * @param {object} event Event object
330
+ * @param {Grid.view.Grid} event.source The grid
331
+ * @param {Core.widget.Menu} event.menu The menu
332
+ * @param {Core.widget.MenuItem} event.item Selected menu item
333
+ * @param {Grid.column.Column} event.column Column
334
+ * @param {Core.data.Model} event.record Record
335
+ */
336
+ this.onCellMenuItem = new EventEmitter();
337
+ /**
338
+ * This event fires on the owning grid after the context menu is shown for a cell.
339
+ * @param {object} event Event object
340
+ * @param {Grid.view.Grid} event.source The grid
341
+ * @param {Core.widget.Menu} event.menu The menu
342
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
343
+ * @param {Grid.column.Column} event.column Column
344
+ * @param {Core.data.Model} event.record Record
345
+ */
346
+ this.onCellMenuShow = new EventEmitter();
347
+ /**
348
+ * This event fires on the owning grid when a check item is toggled in the cell context menu.
349
+ * @param {object} event Event object
350
+ * @param {Grid.view.Grid} event.source The grid
351
+ * @param {Core.widget.Menu} event.menu The menu
352
+ * @param {Core.widget.MenuItem} event.item Selected menu item
353
+ * @param {Grid.column.Column} event.column Column
354
+ * @param {Core.data.Model} event.record Record
355
+ * @param {boolean} event.checked Checked or not
356
+ */
357
+ this.onCellMenuToggleItem = new EventEmitter();
358
+ /**
359
+ * Fired when the mouse enters a cell
360
+ * @param {object} event Event object
361
+ * @param {Grid.view.Grid} event.source The grid instance
362
+ * @param {Core.data.Model} event.record The record representing the hovered cell
363
+ * @param {Grid.column.Column} event.column The column currently hovered
364
+ * @param {HTMLElement} event.cellElement The cell HTML element
365
+ * @param {MouseEvent} event.event The native DOM event
366
+ */
367
+ this.onCellMouseEnter = new EventEmitter();
368
+ /**
369
+ * Fired when the mouse leaves a cell
370
+ * @param {object} event Event object
371
+ * @param {Grid.view.Grid} event.source The grid instance
372
+ * @param {Core.data.Model} event.record The record representing the cell that the mouse left
373
+ * @param {Grid.column.Column} event.column The column representing the cell that the mouse left
374
+ * @param {HTMLElement} event.cellElement The cell HTML element that the mouse left
375
+ * @param {MouseEvent} event.event The native DOM event
376
+ */
377
+ this.onCellMouseLeave = new EventEmitter();
378
+ /**
379
+ * Fired when a user moves the mouse out of a grid cell
380
+ * @param {object} event Event object
381
+ * @param {Grid.view.Grid} event.grid The grid instance
382
+ * @param {Core.data.Model} event.record The record representing the row
383
+ * @param {Grid.column.Column} event.column The column to which the cell belongs
384
+ * @param {HTMLElement} event.cellElement The cell HTML element
385
+ * @param {HTMLElement} event.target The target element
386
+ * @param {MouseEvent} event.event The native DOM event
387
+ */
388
+ this.onCellMouseOut = new EventEmitter();
389
+ /**
390
+ * Fired when user moves the mouse over a grid cell
391
+ * @param {object} event Event object
392
+ * @param {Grid.view.Grid} event.grid The grid instance
393
+ * @param {Core.data.Model} event.record The record representing the row
394
+ * @param {Grid.column.Column} event.column The column to which the cell belongs
395
+ * @param {HTMLElement} event.cellElement The cell HTML element
396
+ * @param {HTMLElement} event.target The target element
397
+ * @param {MouseEvent} event.event The native DOM event
398
+ */
399
+ this.onCellMouseOver = new EventEmitter();
400
+ /**
401
+ * Fires when a Panel is collapsed using the [collapsible](https://bryntum.com/products/grid/docs/api/Core/widget/Panel#config-collapsible) setting.
402
+ * @param {object} event Event object
403
+ * @param {Core.widget.Panel} event.source This Panel.
404
+ */
405
+ this.onCollapse = new EventEmitter();
406
+ /**
407
+ * Fired before a parent node record is collapsed.
408
+ * @param {object} event Event object
409
+ * @param {Grid.view.Grid} event.source The firing Grid instance.
410
+ * @param {Core.data.Model} event.record The record which has been collapsed.
411
+ */
412
+ this.onCollapseNode = new EventEmitter();
413
+ /**
414
+ * This event is fired when a column is being dragged, and you can set the `valid` flag on the `context` object
415
+ * to indicate whether the drop position is valid or not.
416
+ * @param {object} event Event object
417
+ * @param {Grid.view.Grid} event.source The grid instance.
418
+ * @param {Grid.column.Column} event.column The dragged column.
419
+ * @param {Grid.column.Column} event.insertBefore The column before which the dragged column will be inserted (if not last).
420
+ * @param {Event} event.event The browser event.
421
+ * @param {object} event.context
422
+ * @param {boolean} event.context.valid Set this to `true` or `false` to indicate whether the drop position is valid.
423
+ */
424
+ this.onColumnDrag = new EventEmitter();
425
+ /**
426
+ * This event is fired when a column drag gesture has started.
427
+ * @param {object} event Event object
428
+ * @param {Grid.view.Grid} event.source The grid instance.
429
+ * @param {Grid.column.Column} event.column The dragged column.
430
+ * @param {Event} event.event The browser event.
431
+ */
432
+ this.onColumnDragStart = new EventEmitter();
433
+ /**
434
+ * This event is always fired after a column is dropped. The `valid` param is `true` if the operation was not
435
+ * vetoed and the column was moved in the column store.
436
+ * @param {object} event Event object
437
+ * @param {Grid.view.Grid} event.source The grid instance.
438
+ * @param {Grid.column.Column} event.column The dragged column.
439
+ * @param {Grid.column.Column} event.insertBefore The column before which the dragged column will be inserted.
440
+ * @param {Grid.column.Column} event.newParent The new parent column.
441
+ * @param {boolean} event.valid `true` if the operation was not vetoed.
442
+ * @param {Event} event.event The browser event.
443
+ * @param {string} event.region The region where the column was dropped.
444
+ */
445
+ this.onColumnDrop = new EventEmitter();
446
+ /**
447
+ * This event is fired after a resize gesture is completed.
448
+ * @param {object} event Event object
449
+ * @param {Grid.view.Grid} event.source The grid instance
450
+ * @param {Grid.column.Column} event.column The resized column
451
+ * @param {Event} event.domEvent The browser event
452
+ */
453
+ this.onColumnResize = new EventEmitter();
454
+ /**
455
+ * This event is fired when a column resize gesture starts.
456
+ * @param {object} event Event object
457
+ * @param {Grid.view.Grid} event.source The grid instance
458
+ * @param {Grid.column.Column} event.column The column
459
+ * @param {Event} event.domEvent The browser event
460
+ */
461
+ this.onColumnResizeStart = new EventEmitter();
462
+ /**
463
+ * This event fires on the owning widget when an item is selected in the context menu.
464
+ * @param {object} event Event object
465
+ * @param {Core.widget.Widget} event.source The owning widget
466
+ * @param {Core.widget.Menu} event.menu The menu
467
+ * @param {Core.widget.MenuItem} event.item Selected menu item
468
+ */
469
+ this.onContextMenuItem = new EventEmitter();
470
+ /**
471
+ * This event fires on the owning widget when a check item is toggled in the context menu.
472
+ * @param {object} event Event object
473
+ * @param {Core.widget.Widget} event.source The owning widget
474
+ * @param {Core.widget.Menu} event.menu The menu
475
+ * @param {Core.widget.MenuItem} event.item Selected menu item
476
+ * @param {boolean} event.checked Checked or not
477
+ */
478
+ this.onContextMenuToggleItem = new EventEmitter();
479
+ /**
480
+ * Fires on the owning Grid after a copy action is performed.
481
+ * @param {object} event Event object
482
+ * @param {Grid.view.Grid} event.source Owner grid
483
+ * @param {Grid.util.GridLocation[]} event.cells The cells about to be copied or cut
484
+ * @param {string} event.copiedDataString The concatenated data string that was copied or cut
485
+ * @param {boolean} event.isCut `true` if this was a cut action
486
+ * @param {string} event.entityName 'cell' to distinguish this event from other copy events
487
+ */
488
+ this.onCopy = new EventEmitter();
489
+ /**
490
+ * Fired when data in the store changes.
491
+ * ...
492
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/Grid#event-dataChange)
493
+ * @param {object} event Event object
494
+ * @param {Grid.view.Grid} event.source Owning grid
495
+ * @param {Core.data.Store} event.store The originating store
496
+ * @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'`
497
+ * @param {Core.data.Model} event.record Changed record, for actions that affects exactly one record (`'update'`)
498
+ * @param {Core.data.Model[]} event.records Changed records, passed for all actions except `'removeAll'`
499
+ * @param {object} event.changes Passed for the `'update'` action, info on which record fields changed
500
+ */
501
+ this.onDataChange = new EventEmitter();
502
+ /**
503
+ * Fires when an object is destroyed.
504
+ * @param {object} event Event object
505
+ * @param {Core.Base} event.source The Object that is being destroyed.
506
+ */
507
+ this.onDestroy = new EventEmitter();
508
+ /**
509
+ * Fires when a field is mutated and the state of the [hasChanges](https://bryntum.com/products/grid/docs/api/Core/widget/Container#property-hasChanges) property changes
510
+ * @param {object} event Event object
511
+ * @param {Core.widget.Container} event.source The container.
512
+ * @param {boolean} event.dirty The dirty state of the Container - `true` if there are any fields which have been changed since initial load.
513
+ */
514
+ this.onDirtyStateChange = new EventEmitter();
515
+ /**
516
+ * Fires while drag selecting. UI will update with current range, but the cells will not be selected until
517
+ * mouse up. This event can be listened for to perform actions while drag selecting.
518
+ * @param {object} event Event object
519
+ * @param {Grid.view.Grid} event.source
520
+ * @param {GridLocationConfig[],Grid.util.GridLocation[]} event.selectedCells The cells that is currently being dragged over
521
+ * @param {Core.data.Model[]} event.selectedRecords The records that is currently being dragged over
522
+ */
523
+ this.onDragSelecting = new EventEmitter();
524
+ /**
525
+ * Triggered when a widget's [element](https://bryntum.com/products/grid/docs/api/Core/widget/Widget#property-element) is available.
526
+ * @param {object} event Event object
527
+ * @param {HTMLElement} event.element The Widget's element.
528
+ */
529
+ this.onElementCreated = new EventEmitter();
530
+ /**
531
+ * Fires when a Panel is expanded using the [collapsible](https://bryntum.com/products/grid/docs/api/Core/widget/Panel#config-collapsible) setting.
532
+ * @param {object} event Event object
533
+ * @param {Core.widget.Panel} event.source This Panel.
534
+ */
535
+ this.onExpand = new EventEmitter();
536
+ /**
537
+ * Fired after a parent node record is expanded.
538
+ * @param {object} event Event object
539
+ * @param {Grid.view.Grid} event.source The firing Grid instance.
540
+ * @param {Core.data.Model} event.record The record which has been expanded.
541
+ */
542
+ this.onExpandNode = new EventEmitter();
543
+ /**
544
+ * Fired when a file is dropped on the widget element
545
+ * @param {object} event Event object
546
+ * @param {Grid.view.Grid} event.source The owning Grid instance
547
+ * @param {DataTransferItem} event.file The dropped file descriptor
548
+ * @param {DragEvent} event.domEvent The native DragEvent
549
+ */
550
+ this.onFileDrop = new EventEmitter();
551
+ /**
552
+ * Fired before the FillHandle dragging is finalized and values are applied to cells, return `false` to prevent the
553
+ * drag operation from applying data changes.
554
+ * @param {object} event Event object
555
+ * @param {Grid.util.GridLocation} event.from The from cell
556
+ * @param {Grid.util.GridLocation} event.to The to cell
557
+ * @param {MouseEvent} event.domEvent The raw DOM event
558
+ */
559
+ this.onFillHandleBeforeDragFinalize = new EventEmitter();
560
+ /**
561
+ * Fired while dragging the FillHandle.
562
+ * @param {object} event Event object
563
+ * @param {Grid.util.GridLocation} event.from The from cell
564
+ * @param {Grid.util.GridLocation} event.to The to cell
565
+ * @param {MouseEvent} event.domEvent The raw DOM event
566
+ */
567
+ this.onFillHandleDrag = new EventEmitter();
568
+ /**
569
+ * Fired when a FillHandle drag operation is aborted.
570
+ */
571
+ this.onFillHandleDragAbort = new EventEmitter();
572
+ /**
573
+ * Fired after a FillHandle drag operation.
574
+ * @param {object} event Event object
575
+ * @param {Grid.util.GridLocation} event.from The from cell
576
+ * @param {Grid.util.GridLocation} event.to The to cell
577
+ * @param {MouseEvent} event.domEvent The raw DOM event
578
+ */
579
+ this.onFillHandleDragEnd = new EventEmitter();
580
+ /**
581
+ * Fired when dragging of the FillHandle starts.
582
+ * @param {object} event Event object
583
+ * @param {Grid.util.GridLocation} event.cell Information about the column / record
584
+ * @param {MouseEvent} event.domEvent The raw DOM event
585
+ */
586
+ this.onFillHandleDragStart = new EventEmitter();
587
+ /**
588
+ * Fires on the owning Grid when cell editing is finished
589
+ * @param {object} event Event object
590
+ * @param {Grid.view.Grid} event.grid Target grid
591
+ * @param {CellEditorContext} event.editorContext Editing context
592
+ */
593
+ this.onFinishCellEdit = new EventEmitter();
594
+ /**
595
+ * 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.
596
+ * ...
597
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/Grid#event-finishRowEdit)
598
+ * @param {object} event Event object
599
+ * @param {Grid.view.Grid} event.grid Target grid
600
+ * @param {RowEditorContext} event.editorContext Editing context
601
+ */
602
+ this.onFinishRowEdit = new EventEmitter();
603
+ /**
604
+ * Fired when focus enters this Widget.
605
+ * @param {object} event Event object
606
+ * @param {Core.widget.Widget} event.source This Widget
607
+ * @param {HTMLElement} event.fromElement The element which lost focus.
608
+ * @param {HTMLElement} event.toElement The element which gained focus.
609
+ * @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
610
+ * @param {Core.widget.Widget} event.toWidget The widget which gained focus.
611
+ * @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
612
+ */
613
+ this.onFocusIn = new EventEmitter();
614
+ /**
615
+ * Fired when focus exits this Widget's ownership tree. This is different from a `blur` event.
616
+ * focus moving from within this Widget's ownership tree, even if there are floating widgets
617
+ * will not trigger this event. This is when focus exits this widget completely.
618
+ * @param {object} event Event object
619
+ * @param {Core.widget.Widget} event.source This Widget
620
+ * @param {HTMLElement} event.fromElement The element which lost focus.
621
+ * @param {HTMLElement} event.toElement The element which gained focus.
622
+ * @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
623
+ * @param {Core.widget.Widget} event.toWidget The widget which gained focus.
624
+ * @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
625
+ */
626
+ this.onFocusOut = new EventEmitter();
627
+ /**
628
+ * Fired before dragging starts, return false to prevent the drag operation.
629
+ * @param {object} event Event object
630
+ * @param {Grid.view.GridBase} event.source
631
+ * @param {object} event.context
632
+ * @param {Core.data.Model[]} event.context.records The dragged row records
633
+ * @param {MouseEvent,TouchEvent} event.event
634
+ */
635
+ this.onGridRowBeforeDragStart = new EventEmitter();
636
+ /**
637
+ * Fired before the row drop operation is finalized. You can return false to abort the drop operation, or a
638
+ * Promise yielding `true` / `false` which allows for asynchronous abort (e.g. first show user a confirmation dialog).
639
+ * @param {object} event Event object
640
+ * @param {Grid.view.GridBase} event.source
641
+ * @param {object} event.context
642
+ * @param {boolean} event.context.valid Set this to true or false to indicate whether the drop position is valid
643
+ * @param {Core.data.Model} event.context.insertBefore The record to insert before (`null` if inserting at last position of a parent node)
644
+ * @param {Core.data.Model} event.context.parent The parent record of the current drop position (only applicable for trees)
645
+ * @param {Core.data.Model[]} event.context.records The dragged row records
646
+ * @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
647
+ * @param {MouseEvent} event.event
648
+ */
649
+ this.onGridRowBeforeDropFinalize = new EventEmitter();
650
+ /**
651
+ * Fired while the row is being dragged, in the listener function you have access to `context.insertBefore` a grid /
652
+ * tree record, and additionally `context.parent` (a TreeNode) for trees. You can signal that the drop position is
653
+ * valid or invalid by setting `context.valid = false;`
654
+ * @param {object} event Event object
655
+ * @param {Grid.view.GridBase} event.source
656
+ * @param {object} event.context
657
+ * @param {boolean} event.context.valid Set this to true or false to indicate whether the drop position is valid.
658
+ * @param {Core.data.Model} event.context.insertBefore The record to insert before (`null` if inserting at last position of a parent node)
659
+ * @param {Core.data.Model} event.context.parent The parent record of the current drop position (only applicable for trees)
660
+ * @param {Core.data.Model[]} event.context.records The dragged row records
661
+ * @param {MouseEvent} event.event
662
+ */
663
+ this.onGridRowDrag = new EventEmitter();
664
+ /**
665
+ * Fired when a row drag operation is aborted
666
+ * @param {object} event Event object
667
+ * @param {Grid.view.GridBase} event.source
668
+ * @param {object} event.context
669
+ * @param {Core.data.Model[]} event.context.records The dragged row records
670
+ * @param {MouseEvent} event.event
671
+ */
672
+ this.onGridRowDragAbort = new EventEmitter();
673
+ /**
674
+ * Fired when dragging starts.
675
+ * @param {object} event Event object
676
+ * @param {Grid.view.GridBase} event.source
677
+ * @param {object} event.context
678
+ * @param {Core.data.Model[]} event.context.records The dragged row records
679
+ * @param {MouseEvent,TouchEvent} event.event
680
+ */
681
+ this.onGridRowDragStart = new EventEmitter();
682
+ /**
683
+ * Fired after the row drop operation has completed, regardless of validity
684
+ * @param {object} event Event object
685
+ * @param {Grid.view.GridBase} event.source
686
+ * @param {object} event.context
687
+ * @param {boolean} event.context.valid true or false depending on whether the drop position was valid
688
+ * @param {Core.data.Model} event.context.insertBefore The record to insert before (`null` if inserting at last position of a parent node)
689
+ * @param {Core.data.Model} event.context.parent The parent record of the current drop position (only applicable for trees)
690
+ * @param {Core.data.Model[]} event.context.records The dragged row records
691
+ * @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
692
+ * @param {MouseEvent} event.event
693
+ */
694
+ this.onGridRowDrop = new EventEmitter();
695
+ /**
696
+ * Fired when a grid header is clicked on.
697
+ * ...
698
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/Grid#event-headerClick)
699
+ * @param {object} event Event object
700
+ * @param {Event} event.domEvent The triggering DOM event.
701
+ * @param {Grid.column.Column} event.column The column clicked on.
702
+ */
703
+ this.onHeaderClick = new EventEmitter();
704
+ /**
705
+ * This event fires on the owning Grid before the context menu is shown for a header.
706
+ * Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/grid/docs/api/Grid/feature/HeaderMenu#config-processItems).
707
+ * ...
708
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/Grid#event-headerMenuBeforeShow)
709
+ * @param {object} event Event object
710
+ * @param {Grid.view.Grid} event.source The grid
711
+ * @param {Core.widget.Menu} event.menu The menu
712
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
713
+ * @param {Grid.column.Column} event.column Column
714
+ */
715
+ this.onHeaderMenuBeforeShow = new EventEmitter();
716
+ /**
717
+ * This event fires on the owning Grid when an item is selected in the header context menu.
718
+ * @param {object} event Event object
719
+ * @param {Grid.view.Grid} event.source The grid
720
+ * @param {Core.widget.Menu} event.menu The menu
721
+ * @param {Core.widget.MenuItem} event.item Selected menu item
722
+ * @param {Grid.column.Column} event.column Column
723
+ */
724
+ this.onHeaderMenuItem = new EventEmitter();
725
+ /**
726
+ * This event fires on the owning Grid after the context menu is shown for a header
727
+ * @param {object} event Event object
728
+ * @param {Grid.view.Grid} event.source The grid
729
+ * @param {Core.widget.Menu} event.menu The menu
730
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
731
+ * @param {Grid.column.Column} event.column Column
732
+ */
733
+ this.onHeaderMenuShow = new EventEmitter();
734
+ /**
735
+ * This event fires on the owning Grid when a check item is toggled in the header context menu.
736
+ * @param {object} event Event object
737
+ * @param {Grid.view.Grid} event.source The grid
738
+ * @param {Core.widget.Menu} event.menu The menu
739
+ * @param {Core.widget.MenuItem} event.item Selected menu item
740
+ * @param {Grid.column.Column} event.column Column
741
+ * @param {boolean} event.checked Checked or not
742
+ */
743
+ this.onHeaderMenuToggleItem = new EventEmitter();
744
+ /**
745
+ * Triggered after a widget was hidden
746
+ * @param {object} event Event object
747
+ * @param {Core.widget.Widget} event.source The widget
748
+ */
749
+ this.onHide = new EventEmitter();
750
+ /**
751
+ * Fires when row locking is enabled.
752
+ * @param {object} event Event object
753
+ * @param {Grid.view.GridBase} event.clone The created clone
754
+ */
755
+ this.onLockRows = new EventEmitter();
756
+ /**
757
+ * Mouse moved out from element in grid
758
+ * @param {object} event Event object
759
+ * @param {MouseEvent} event.event The native browser event
760
+ */
761
+ this.onMouseOut = new EventEmitter();
762
+ /**
763
+ * Mouse moved in over element in grid
764
+ * @param {object} event Event object
765
+ * @param {MouseEvent} event.event The native browser event
766
+ */
767
+ this.onMouseOver = new EventEmitter();
768
+ /**
769
+ * Triggered when a widget which had been in a non-visible state for any reason
770
+ * achieves visibility.
771
+ * ...
772
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/Grid#event-paint)
773
+ * @param {object} event Event object
774
+ * @param {Core.widget.Widget} event.source The widget being painted.
775
+ * @param {boolean} event.firstPaint `true` if this is the first paint.
776
+ */
777
+ this.onPaint = new EventEmitter();
778
+ /**
779
+ * Fires on the owning Grid after a paste action is performed.
780
+ * @param {object} event Event object
781
+ * @param {Grid.view.Grid} event.source Owner grid
782
+ * @param {string} event.clipboardData The clipboardData that was pasted
783
+ * @param {Core.data.Model[]} event.modifiedRecords The records which have been modified due to the paste action
784
+ * @param {Grid.util.GridLocation} event.targetCell The cell from which the paste will be started
785
+ * @param {string} event.entityName 'cell' to distinguish this event from other paste events
786
+ */
787
+ this.onPaste = new EventEmitter();
788
+ /**
789
+ * Fires on the owning Grid when export has finished
790
+ * @param {object} event Event object
791
+ * @param {Response} event.response Optional response, if received
792
+ * @param {Error} event.error Optional error, if exception occurred
793
+ */
794
+ this.onPdfExport = new EventEmitter();
795
+ /**
796
+ * Fired when a Widget's read only state is toggled
797
+ * @param {object} event Event object
798
+ * @param {boolean} event.readOnly Read only or not
799
+ */
800
+ this.onReadOnly = new EventEmitter();
801
+ /**
802
+ * This event is fired after a widget's elements have been synchronized due to a direct or indirect call
803
+ * to [recompose](https://bryntum.com/products/grid/docs/api/Core/widget/Widget#function-recompose), if this results in some change to the widget's rendered DOM elements.
804
+ */
805
+ this.onRecompose = new EventEmitter();
806
+ /**
807
+ * Fires after a row is rendered.
808
+ * @param {object} event Event object
809
+ * @param {Grid.view.Grid} event.source The firing Grid instance.
810
+ * @param {Grid.row.Row} event.row The row that has been rendered.
811
+ * @param {Core.data.Model} event.record The record for the row.
812
+ * @param {number} event.recordIndex The zero-based index of the record.
813
+ */
814
+ this.onRenderRow = new EventEmitter();
815
+ /**
816
+ * Grid rows have been rendered
817
+ * @param {object} event Event object
818
+ * @param {Grid.view.Grid} event.source This grid.
819
+ */
820
+ this.onRenderRows = new EventEmitter();
821
+ /**
822
+ * Fired when the encapsulating element of a Widget resizes *only when [monitorResize](https://bryntum.com/products/grid/docs/api/Core/widget/Widget#config-monitorResize) is `true`*.
823
+ * @param {object} event Event object
824
+ * @param {Core.widget.Widget} event.source This Widget
825
+ * @param {number} event.width The new width
826
+ * @param {number} event.height The new height
827
+ * @param {number} event.oldWidth The old width
828
+ * @param {number} event.oldHeight The old height
829
+ */
830
+ this.onResize = new EventEmitter();
831
+ /**
832
+ * Grid resize lead to a new responsive level being applied
833
+ * @param {object} event Event object
834
+ * @param {Grid.view.Grid} event.grid Grid that was resized
835
+ * @param {string} event.level New responsive level (small, large, etc)
836
+ * @param {number} event.width New width in px
837
+ * @param {string} event.oldLevel Old responsive level
838
+ * @param {number} event.oldWidth Old width in px
839
+ */
840
+ this.onResponsive = new EventEmitter();
841
+ /**
842
+ * This event fires when a row has finished collapsing.
843
+ * @param {object} event Event object
844
+ * @param {Core.data.Model} event.record Record
845
+ */
846
+ this.onRowCollapse = new EventEmitter();
847
+ /**
848
+ * This event fires when a row expand has finished expanding.
849
+ * ...
850
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/Grid#event-rowExpand)
851
+ * @param {object} event Event object
852
+ * @param {Core.data.Model} event.record Record
853
+ * @param {object} event.expandedElements An object with the Grid region name as property and the expanded body element as value
854
+ * @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.
855
+ * @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
856
+ */
857
+ this.onRowExpand = new EventEmitter();
858
+ /**
859
+ * Fired when the mouse enters a row
860
+ * @param {object} event Event object
861
+ * @param {Grid.view.Grid} event.source The grid instance
862
+ * @param {Core.data.Model} event.record The record representing the hovered row
863
+ * @param {Grid.column.Column} event.column The column currently hovered
864
+ * @param {HTMLElement} event.cellElement The cell HTML element
865
+ * @param {MouseEvent} event.event The native DOM event
866
+ */
867
+ this.onRowMouseEnter = new EventEmitter();
868
+ /**
869
+ * Fired when the mouse leaves a row
870
+ * @param {object} event Event object
871
+ * @param {Grid.view.Grid} event.source The grid instance
872
+ * @param {Core.data.Model} event.record The record representing the row that the mouse left
873
+ * @param {HTMLElement} event.cellElement The cell HTML element that the mouse left
874
+ * @param {MouseEvent} event.event The native DOM event
875
+ */
876
+ this.onRowMouseLeave = new EventEmitter();
877
+ /**
878
+ * Grid has scrolled vertically
879
+ * @param {object} event Event object
880
+ * @param {Grid.view.Grid} event.source The firing Grid instance.
881
+ * @param {number} event.scrollTop The vertical scroll position.
882
+ */
883
+ this.onScroll = new EventEmitter();
884
+ /**
885
+ * The selection has been changed.
886
+ * @param {object} event Event object
887
+ * @param {'select','deselect'} event.action `'select'`/`'deselect'`
888
+ * @param {'row','cell'} event.mode `'row'`/`'cell'`
889
+ * @param {Grid.view.Grid} event.source
890
+ * @param {Core.data.Model[]} event.deselected The records deselected in this operation.
891
+ * @param {Core.data.Model[]} event.selected The records selected in this operation.
892
+ * @param {Core.data.Model[]} event.selection The records in the new selection.
893
+ * @param {Grid.util.GridLocation[]} event.deselectedCells The cells deselected in this operation.
894
+ * @param {Grid.util.GridLocation[]} event.selectedCells The cells selected in this operation.
895
+ * @param {Grid.util.GridLocation[]} event.cellSelection The cells in the new selection.
896
+ */
897
+ this.onSelectionChange = new EventEmitter();
898
+ /**
899
+ * The selectionMode configuration has been changed.
900
+ * @param {object} event Event object
901
+ * @param {object} event.selectionMode The new [selectionMode](https://bryntum.com/products/grid/docs/api/Grid/view/mixin/GridSelection#config-selectionMode)
902
+ */
903
+ this.onSelectionModeChange = new EventEmitter();
904
+ /**
905
+ * Triggered after a widget is shown.
906
+ * @param {object} event Event object
907
+ * @param {Core.widget.Widget} event.source The widget
908
+ */
909
+ this.onShow = new EventEmitter();
910
+ /**
911
+ * Fires when splitting the Grid.
912
+ * @param {object} event Event object
913
+ * @param {Grid.view.GridBase[]} event.subViews The sub views created by the split
914
+ * @param {object} event.options The options passed to the split call
915
+ * @param {'horizontal','vertical','both'} event.options.direction The direction of the split
916
+ * @param {Grid.column.Column} event.options.atColumn The column to split at
917
+ * @param {Core.data.Model} event.options.atRecord The record to split at
918
+ */
919
+ this.onSplit = new EventEmitter();
920
+ /**
921
+ * Fired by the Grid when the collapse icon is clicked. Return `false` to prevent the default collapse action,
922
+ * if you want to implement your own behavior.
923
+ * @param {object} event Event object
924
+ * @param {Grid.view.Grid} event.source The Grid instance.
925
+ * @param {Grid.view.SubGrid} event.subGrid The subgrid
926
+ * @param {Event} event.domEvent The native DOM event
927
+ */
928
+ this.onSplitterCollapseClick = new EventEmitter();
929
+ /**
930
+ * Fired by the Grid after a sub-grid has been resized using the splitter
931
+ * @param {object} event Event object
932
+ * @param {Grid.view.Grid} event.source The Grid instance.
933
+ * @param {Grid.view.SubGrid} event.subGrid The resized subgrid
934
+ * @param {Event} event.domEvent The native DOM event
935
+ */
936
+ this.onSplitterDragEnd = new EventEmitter();
937
+ /**
938
+ * Fired by the Grid when a sub-grid resize gesture starts
939
+ * @param {object} event Event object
940
+ * @param {Grid.view.Grid} event.source The Grid instance.
941
+ * @param {Grid.view.SubGrid} event.subGrid The subgrid about to be resized
942
+ * @param {Event} event.domEvent The native DOM event
943
+ */
944
+ this.onSplitterDragStart = new EventEmitter();
945
+ /**
946
+ * Fired by the Grid when the expand icon is clicked. Return `false` to prevent the default expand action,
947
+ * if you want to implement your own behavior.
948
+ * @param {object} event Event object
949
+ * @param {Grid.view.Grid} event.source The Grid instance.
950
+ * @param {Grid.view.SubGrid} event.subGrid The subgrid
951
+ * @param {Event} event.domEvent The native DOM event
952
+ */
953
+ this.onSplitterExpandClick = new EventEmitter();
954
+ /**
955
+ * Fires on the owning Grid when editing starts
956
+ * @param {object} event Event object
957
+ * @param {Grid.view.Grid} event.source Owner grid
958
+ * @param {CellEditorContext} event.editorContext Editing context
959
+ */
960
+ this.onStartCellEdit = new EventEmitter();
961
+ /**
962
+ * Fires on the owning Grid when editing starts
963
+ * @param {object} event Event object
964
+ * @param {Grid.view.Grid} event.source Owner grid
965
+ * @param {RowEditorContext} event.editorContext Editing context
966
+ */
967
+ this.onStartRowEdit = new EventEmitter();
968
+ /**
969
+ * Fires after a sub grid is collapsed.
970
+ * @param {object} event Event object
971
+ * @param {Grid.view.Grid} event.source The firing Grid instance
972
+ * @param {Grid.view.SubGrid} event.subGrid The sub grid instance
973
+ */
974
+ this.onSubGridCollapse = new EventEmitter();
975
+ /**
976
+ * Fires after a sub grid is expanded.
977
+ * @param {object} event Event object
978
+ * @param {Grid.view.Grid} event.source The firing Grid instance
979
+ * @param {Grid.view.SubGrid} event.subGrid The sub grid instance
980
+ */
981
+ this.onSubGridExpand = new EventEmitter();
982
+ /**
983
+ * Fired when one or more groups are expanded or collapsed
984
+ * @param {object} event Event object
985
+ * @param {Core.data.Model} event.groupRecord [DEPRECATED] Use `groupRecords` param instead
986
+ * @param {Core.data.Model[]} event.groupRecords The group records being toggled
987
+ * @param {boolean} event.collapse Collapsed (true) or expanded (false)
988
+ * @param {boolean} event.allRecords True if this event is part of toggling all groups
989
+ */
990
+ this.onToggleGroup = new EventEmitter();
991
+ /**
992
+ * Fired after a parent node record toggles its collapsed state.
993
+ * @param {object} event Event object
994
+ * @param {Core.data.Model} event.record The record being toggled.
995
+ * @param {boolean} event.collapse `true` if the node is being collapsed.
996
+ */
997
+ this.onToggleNode = new EventEmitter();
998
+ /**
999
+ * A header [tool](https://bryntum.com/products/grid/docs/api/Core/widget/Panel#config-tools) has been clicked.
1000
+ * @param {object} event Event object
1001
+ * @param {Core.widget.Tool} event.source This Panel.
1002
+ * @param {Core.widget.Tool} event.tool The tool which is being clicked.
1003
+ */
1004
+ this.onToolClick = new EventEmitter();
1005
+ /**
1006
+ * Fires when row locking is disabled.
1007
+ * @param {object} event Event object
1008
+ * @param {Grid.view.GridBase} event.clone The locked clone that will be destroyed
1009
+ */
1010
+ this.onUnlockRows = new EventEmitter();
1011
+ /**
1012
+ * Fires when un-splitting the Grid.
1013
+ */
1014
+ this.onUnsplit = new EventEmitter();
1015
+ this.elementRef = element;
1016
+ }
1017
+ /**
1018
+ * Create and append the underlying widget
1019
+ */
1020
+ ngOnInit() {
1021
+ const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumGridComponent;
1022
+ bryntumConfigs.filter(prop => prop in this).forEach(prop => {
1023
+ // @ts-ignore
1024
+ WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
1025
+ if (['features', 'config'].includes(prop)) {
1026
+ WrapperHelper.devWarningConfigProp(instanceName, prop);
1027
+ }
1028
+ });
1029
+ // @ts-ignore
1030
+ bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
1031
+ const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
1032
+ // @ts-ignore
1033
+ bryntumConfig.listeners[eventName(event)] = e => {
1034
+ // @ts-ignore
1035
+ me[event].emit(e);
1036
+ // EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
1037
+ // in Angular listeners
1038
+ return e.returnValue;
1039
+ };
1040
+ });
1041
+ // If component has no container specified in config then use adopt to Wrapper's element
1042
+ const containerParam = [
1043
+ 'adopt',
1044
+ 'appendTo',
1045
+ 'insertAfter',
1046
+ 'insertBefore'
1047
+ // @ts-ignore
1048
+ ].find(prop => bryntumConfig[prop]);
1049
+ if (!containerParam) {
1050
+ if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
1051
+ // Button should always be <a> or <button> inside owner element
1052
+ bryntumConfig.appendTo = elementRef.nativeElement;
1053
+ }
1054
+ else {
1055
+ bryntumConfig.adopt = elementRef.nativeElement;
1056
+ }
1057
+ }
1058
+ else {
1059
+ WrapperHelper.devWarningContainer(instanceName, containerParam);
1060
+ }
1061
+ // @ts-ignore
1062
+ me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
1063
+ // Backwards compatibility for gridInstance, schedulerInstance etc.
1064
+ // @ts-ignore
1065
+ me[StringHelper.uncapitalize(instanceName) + 'Instance'] = me.instance;
1066
+ //
1067
+ }
1068
+ /**
1069
+ * Watch for changes
1070
+ * @param changes
1071
+ */
1072
+ ngOnChanges(changes) {
1073
+ const { instance } = this, { instanceName } = BryntumGridComponent;
1074
+ if (!instance) {
1075
+ return;
1076
+ }
1077
+ // Iterate over all changes
1078
+ Object.entries(changes).forEach(([prop, change]) => {
1079
+ const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumGridComponent;
1080
+ if (bryntumProps.includes(prop)) {
1081
+ WrapperHelper.applyPropValue(instance, prop, newValue, false);
1082
+ if (bryntumConfigsOnly.includes(prop)) {
1083
+ WrapperHelper.devWarningUpdateProp(instanceName, prop);
1084
+ }
1085
+ }
1086
+ });
1087
+ }
1088
+ /**
1089
+ * Destroy the component
1090
+ */
1091
+ ngOnDestroy() {
1092
+ // @ts-ignore
1093
+ if (this.instance && this.instance.destroy) {
1094
+ this.instance.destroy();
1095
+ }
1096
+ }
1097
+ }
1098
+ BryntumGridComponent.instanceClass = Grid;
1099
+ BryntumGridComponent.instanceName = 'Grid';
1100
+ BryntumGridComponent.bryntumEvents = [
1101
+ 'onBeforeCancelCellEdit',
1102
+ 'onBeforeCancelRowEdit',
1103
+ 'onBeforeCellEditStart',
1104
+ 'onBeforeCellRangeDelete',
1105
+ 'onBeforeCellRangeEdit',
1106
+ 'onBeforeColumnDragStart',
1107
+ 'onBeforeColumnDropFinalize',
1108
+ 'onBeforeColumnResize',
1109
+ 'onBeforeCopy',
1110
+ 'onBeforeCSVExport',
1111
+ 'onBeforeDestroy',
1112
+ 'onBeforeExcelExport',
1113
+ 'onBeforeFillHandleDragStart',
1114
+ 'onBeforeFinishCellEdit',
1115
+ 'onBeforeFinishRowEdit',
1116
+ 'onBeforeHide',
1117
+ 'onBeforePaste',
1118
+ 'onBeforePdfExport',
1119
+ 'onBeforeRenderRow',
1120
+ 'onBeforeRenderRows',
1121
+ 'onBeforeRowCollapse',
1122
+ 'onBeforeRowExpand',
1123
+ 'onBeforeSelectionChange',
1124
+ 'onBeforeSetRecord',
1125
+ 'onBeforeShow',
1126
+ 'onBeforeStartRowEdit',
1127
+ 'onBeforeStateApply',
1128
+ 'onBeforeStateSave',
1129
+ 'onBeforeToggleGroup',
1130
+ 'onBeforeToggleNode',
1131
+ 'onCancelCellEdit',
1132
+ 'onCatchAll',
1133
+ 'onCellClick',
1134
+ 'onCellContextMenu',
1135
+ 'onCellDblClick',
1136
+ 'onCellMenuBeforeShow',
1137
+ 'onCellMenuItem',
1138
+ 'onCellMenuShow',
1139
+ 'onCellMenuToggleItem',
1140
+ 'onCellMouseEnter',
1141
+ 'onCellMouseLeave',
1142
+ 'onCellMouseOut',
1143
+ 'onCellMouseOver',
1144
+ 'onCollapse',
1145
+ 'onCollapseNode',
1146
+ 'onColumnDrag',
1147
+ 'onColumnDragStart',
1148
+ 'onColumnDrop',
1149
+ 'onColumnResize',
1150
+ 'onColumnResizeStart',
1151
+ 'onContextMenuItem',
1152
+ 'onContextMenuToggleItem',
1153
+ 'onCopy',
1154
+ 'onDataChange',
1155
+ 'onDestroy',
1156
+ 'onDirtyStateChange',
1157
+ 'onDragSelecting',
1158
+ 'onElementCreated',
1159
+ 'onExpand',
1160
+ 'onExpandNode',
1161
+ 'onFileDrop',
1162
+ 'onFillHandleBeforeDragFinalize',
1163
+ 'onFillHandleDrag',
1164
+ 'onFillHandleDragAbort',
1165
+ 'onFillHandleDragEnd',
1166
+ 'onFillHandleDragStart',
1167
+ 'onFinishCellEdit',
1168
+ 'onFinishRowEdit',
1169
+ 'onFocusIn',
1170
+ 'onFocusOut',
1171
+ 'onGridRowBeforeDragStart',
1172
+ 'onGridRowBeforeDropFinalize',
1173
+ 'onGridRowDrag',
1174
+ 'onGridRowDragAbort',
1175
+ 'onGridRowDragStart',
1176
+ 'onGridRowDrop',
1177
+ 'onHeaderClick',
1178
+ 'onHeaderMenuBeforeShow',
1179
+ 'onHeaderMenuItem',
1180
+ 'onHeaderMenuShow',
1181
+ 'onHeaderMenuToggleItem',
1182
+ 'onHide',
1183
+ 'onLockRows',
1184
+ 'onMouseOut',
1185
+ 'onMouseOver',
1186
+ 'onPaint',
1187
+ 'onPaste',
1188
+ 'onPdfExport',
1189
+ 'onReadOnly',
1190
+ 'onRecompose',
1191
+ 'onRenderRow',
1192
+ 'onRenderRows',
1193
+ 'onResize',
1194
+ 'onResponsive',
1195
+ 'onRowCollapse',
1196
+ 'onRowExpand',
1197
+ 'onRowMouseEnter',
1198
+ 'onRowMouseLeave',
1199
+ 'onScroll',
1200
+ 'onSelectionChange',
1201
+ 'onSelectionModeChange',
1202
+ 'onShow',
1203
+ 'onSplit',
1204
+ 'onSplitterCollapseClick',
1205
+ 'onSplitterDragEnd',
1206
+ 'onSplitterDragStart',
1207
+ 'onSplitterExpandClick',
1208
+ 'onStartCellEdit',
1209
+ 'onStartRowEdit',
1210
+ 'onSubGridCollapse',
1211
+ 'onSubGridExpand',
1212
+ 'onToggleGroup',
1213
+ 'onToggleNode',
1214
+ 'onToolClick',
1215
+ 'onUnlockRows',
1216
+ 'onUnsplit'
1217
+ ];
1218
+ BryntumGridComponent.bryntumFeatureNames = [
1219
+ 'aiFilterFeature',
1220
+ 'cellCopyPasteFeature',
1221
+ 'cellEditFeature',
1222
+ 'cellMenuFeature',
1223
+ 'cellTooltipFeature',
1224
+ 'chartsFeature',
1225
+ 'columnAutoWidthFeature',
1226
+ 'columnDragToolbarFeature',
1227
+ 'columnPickerFeature',
1228
+ 'columnRenameFeature',
1229
+ 'columnReorderFeature',
1230
+ 'columnResizeFeature',
1231
+ 'excelExporterFeature',
1232
+ 'fileDropFeature',
1233
+ 'fillHandleFeature',
1234
+ 'filterFeature',
1235
+ 'filterBarFeature',
1236
+ 'groupFeature',
1237
+ 'groupSummaryFeature',
1238
+ 'headerMenuFeature',
1239
+ 'lockRowsFeature',
1240
+ 'mergeCellsFeature',
1241
+ 'pdfExportFeature',
1242
+ 'pinColumnsFeature',
1243
+ 'printFeature',
1244
+ 'quickFindFeature',
1245
+ 'regionResizeFeature',
1246
+ 'rowCopyPasteFeature',
1247
+ 'rowEditFeature',
1248
+ 'rowExpanderFeature',
1249
+ 'rowReorderFeature',
1250
+ 'rowResizeFeature',
1251
+ 'searchFeature',
1252
+ 'sortFeature',
1253
+ 'splitFeature',
1254
+ 'stickyCellsFeature',
1255
+ 'stripeFeature',
1256
+ 'summaryFeature',
1257
+ 'treeFeature',
1258
+ 'treeGroupFeature'
1259
+ ];
1260
+ BryntumGridComponent.bryntumConfigs = BryntumGridComponent.bryntumFeatureNames.concat([
1261
+ 'adopt',
1262
+ 'alignSelf',
1263
+ 'animateFilterRemovals',
1264
+ 'animateRemovingRows',
1265
+ 'animateTreeNodeToggle',
1266
+ 'appendTo',
1267
+ 'ariaDescription',
1268
+ 'ariaLabel',
1269
+ 'autoHeight',
1270
+ 'bbar',
1271
+ 'bodyCls',
1272
+ 'bubbleEvents',
1273
+ 'callOnFunctions',
1274
+ 'catchEventHandlerExceptions',
1275
+ 'cellEllipsis',
1276
+ 'cls',
1277
+ 'collapsed',
1278
+ 'collapsible',
1279
+ 'color',
1280
+ 'column',
1281
+ 'columnLines',
1282
+ 'columns',
1283
+ 'config',
1284
+ 'contentElementCls',
1285
+ 'contextMenuTriggerEvent',
1286
+ 'data',
1287
+ 'dataField',
1288
+ 'dataset',
1289
+ 'defaultRegion',
1290
+ 'destroyStore',
1291
+ 'detectCSSCompatibilityIssues',
1292
+ 'disabled',
1293
+ 'disableGridColumnIdWarning',
1294
+ 'disableGridRowModelWarning',
1295
+ 'dock',
1296
+ 'drawer',
1297
+ 'elementAttributes',
1298
+ 'emptyText',
1299
+ 'enableSticky',
1300
+ 'enableTextSelection',
1301
+ 'enableUndoRedoKeys',
1302
+ 'extraData',
1303
+ 'fillLastColumn',
1304
+ 'fixedRowHeight',
1305
+ 'flex',
1306
+ 'footer',
1307
+ 'formulaProviders',
1308
+ 'fullRowRefresh',
1309
+ 'getRowHeight',
1310
+ 'header',
1311
+ 'height',
1312
+ 'hidden',
1313
+ 'hideFooters',
1314
+ 'hideHeaders',
1315
+ 'hideHorizontalScrollbar',
1316
+ 'hoverCls',
1317
+ 'icon',
1318
+ 'id',
1319
+ 'ignoreParentReadOnly',
1320
+ 'inputFieldAlign',
1321
+ 'insertBefore',
1322
+ 'insertFirst',
1323
+ 'keyMap',
1324
+ 'labelPosition',
1325
+ 'listeners',
1326
+ 'loadMask',
1327
+ 'loadMaskDefaults',
1328
+ 'loadMaskError',
1329
+ 'localizable',
1330
+ 'longPressTime',
1331
+ 'margin',
1332
+ 'maskDefaults',
1333
+ 'masked',
1334
+ 'maxHeight',
1335
+ 'maxWidth',
1336
+ 'minHeight',
1337
+ 'minWidth',
1338
+ 'monitorResize',
1339
+ 'owner',
1340
+ 'plugins',
1341
+ 'preserveFocusOnDatasetChange',
1342
+ 'preserveScroll',
1343
+ 'preserveScrollOnDatasetChange',
1344
+ 'preventTooltipOnTouch',
1345
+ 'readOnly',
1346
+ 'relayStoreEvents',
1347
+ 'rendition',
1348
+ 'resizable',
1349
+ 'resizeToFitIncludesHeader',
1350
+ 'responsiveLevels',
1351
+ 'ripple',
1352
+ 'rootElement',
1353
+ 'rowHeight',
1354
+ 'rowLines',
1355
+ 'rtl',
1356
+ 'scrollable',
1357
+ 'scrollerClass',
1358
+ 'scrollManager',
1359
+ 'selectionMode',
1360
+ 'showDirty',
1361
+ 'span',
1362
+ 'stateful',
1363
+ 'statefulEvents',
1364
+ 'stateId',
1365
+ 'stateProvider',
1366
+ 'stateSettings',
1367
+ 'store',
1368
+ 'strips',
1369
+ 'subGridConfigs',
1370
+ 'syncMask',
1371
+ 'tab',
1372
+ 'tabBarItems',
1373
+ 'tbar',
1374
+ 'title',
1375
+ 'tools',
1376
+ 'transition',
1377
+ 'transitionDuration',
1378
+ 'type',
1379
+ 'ui',
1380
+ 'weight',
1381
+ 'width'
1382
+ ]);
1383
+ BryntumGridComponent.bryntumConfigsOnly = [
1384
+ 'adopt',
1385
+ 'animateFilterRemovals',
1386
+ 'animateRemovingRows',
1387
+ 'ariaDescription',
1388
+ 'ariaLabel',
1389
+ 'autoHeight',
1390
+ 'bbar',
1391
+ 'bodyCls',
1392
+ 'bubbleEvents',
1393
+ 'collapsible',
1394
+ 'color',
1395
+ 'config',
1396
+ 'contentElementCls',
1397
+ 'contextMenuTriggerEvent',
1398
+ 'dataField',
1399
+ 'defaultRegion',
1400
+ 'destroyStore',
1401
+ 'detectCSSCompatibilityIssues',
1402
+ 'disableGridColumnIdWarning',
1403
+ 'disableGridRowModelWarning',
1404
+ 'dock',
1405
+ 'drawer',
1406
+ 'elementAttributes',
1407
+ 'enableSticky',
1408
+ 'enableTextSelection',
1409
+ 'fillLastColumn',
1410
+ 'fixedRowHeight',
1411
+ 'footer',
1412
+ 'formulaProviders',
1413
+ 'fullRowRefresh',
1414
+ 'getRowHeight',
1415
+ 'header',
1416
+ 'hideHorizontalScrollbar',
1417
+ 'hoverCls',
1418
+ 'icon',
1419
+ 'ignoreParentReadOnly',
1420
+ 'listeners',
1421
+ 'loadMask',
1422
+ 'loadMaskDefaults',
1423
+ 'loadMaskError',
1424
+ 'localizable',
1425
+ 'maskDefaults',
1426
+ 'masked',
1427
+ 'monitorResize',
1428
+ 'owner',
1429
+ 'plugins',
1430
+ 'preserveFocusOnDatasetChange',
1431
+ 'preserveScrollOnDatasetChange',
1432
+ 'preventTooltipOnTouch',
1433
+ 'relayStoreEvents',
1434
+ 'resizable',
1435
+ 'resizeToFitIncludesHeader',
1436
+ 'responsiveLevels',
1437
+ 'ripple',
1438
+ 'rootElement',
1439
+ 'scrollerClass',
1440
+ 'scrollManager',
1441
+ 'showDirty',
1442
+ 'stateful',
1443
+ 'statefulEvents',
1444
+ 'stateId',
1445
+ 'stateProvider',
1446
+ 'strips',
1447
+ 'subGridConfigs',
1448
+ 'syncMask',
1449
+ 'tab',
1450
+ 'tabBarItems',
1451
+ 'tbar',
1452
+ 'type',
1453
+ 'ui',
1454
+ 'weight'
1455
+ ];
1456
+ BryntumGridComponent.bryntumProps = BryntumGridComponent.bryntumFeatureNames.concat([
1457
+ 'alignSelf',
1458
+ 'animateTreeNodeToggle',
1459
+ 'appendTo',
1460
+ 'callOnFunctions',
1461
+ 'catchEventHandlerExceptions',
1462
+ 'cellEllipsis',
1463
+ 'cls',
1464
+ 'collapsed',
1465
+ 'column',
1466
+ 'columnLines',
1467
+ 'columns',
1468
+ 'data',
1469
+ 'dataset',
1470
+ 'disabled',
1471
+ 'emptyText',
1472
+ 'enableUndoRedoKeys',
1473
+ 'extraData',
1474
+ 'flex',
1475
+ 'focusVisible',
1476
+ 'hasChanges',
1477
+ 'height',
1478
+ 'hidden',
1479
+ 'hideFooters',
1480
+ 'hideHeaders',
1481
+ 'id',
1482
+ 'inputFieldAlign',
1483
+ 'insertBefore',
1484
+ 'insertFirst',
1485
+ 'keyMap',
1486
+ 'labelPosition',
1487
+ 'longPressTime',
1488
+ 'margin',
1489
+ 'maxHeight',
1490
+ 'maxWidth',
1491
+ 'minHeight',
1492
+ 'minWidth',
1493
+ 'originalStore',
1494
+ 'parent',
1495
+ 'preserveScroll',
1496
+ 'readOnly',
1497
+ 'rendition',
1498
+ 'rowHeight',
1499
+ 'rowLines',
1500
+ 'rtl',
1501
+ 'scrollable',
1502
+ 'selectedCell',
1503
+ 'selectedCells',
1504
+ 'selectedRecord',
1505
+ 'selectedRecords',
1506
+ 'selectedRows',
1507
+ 'selectionMode',
1508
+ 'span',
1509
+ 'state',
1510
+ 'stateSettings',
1511
+ 'store',
1512
+ 'title',
1513
+ 'tools',
1514
+ 'tooltip',
1515
+ 'transition',
1516
+ 'transitionDuration',
1517
+ 'width'
1518
+ ]);
1519
+ BryntumGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumGridComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1520
+ BryntumGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumGridComponent, selector: "bryntum-grid", inputs: { adopt: "adopt", animateFilterRemovals: "animateFilterRemovals", animateRemovingRows: "animateRemovingRows", ariaDescription: "ariaDescription", ariaLabel: "ariaLabel", autoHeight: "autoHeight", bbar: "bbar", bodyCls: "bodyCls", bubbleEvents: "bubbleEvents", collapsible: "collapsible", color: "color", config: "config", contentElementCls: "contentElementCls", contextMenuTriggerEvent: "contextMenuTriggerEvent", dataField: "dataField", defaultRegion: "defaultRegion", destroyStore: "destroyStore", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", disableGridColumnIdWarning: "disableGridColumnIdWarning", disableGridRowModelWarning: "disableGridRowModelWarning", dock: "dock", drawer: "drawer", elementAttributes: "elementAttributes", enableSticky: "enableSticky", enableTextSelection: "enableTextSelection", fillLastColumn: "fillLastColumn", fixedRowHeight: "fixedRowHeight", footer: "footer", formulaProviders: "formulaProviders", fullRowRefresh: "fullRowRefresh", getRowHeight: "getRowHeight", header: "header", hideHorizontalScrollbar: "hideHorizontalScrollbar", hoverCls: "hoverCls", icon: "icon", ignoreParentReadOnly: "ignoreParentReadOnly", listeners: "listeners", loadMask: "loadMask", loadMaskDefaults: "loadMaskDefaults", loadMaskError: "loadMaskError", localizable: "localizable", maskDefaults: "maskDefaults", masked: "masked", monitorResize: "monitorResize", owner: "owner", plugins: "plugins", preserveFocusOnDatasetChange: "preserveFocusOnDatasetChange", preserveScrollOnDatasetChange: "preserveScrollOnDatasetChange", preventTooltipOnTouch: "preventTooltipOnTouch", relayStoreEvents: "relayStoreEvents", resizable: "resizable", resizeToFitIncludesHeader: "resizeToFitIncludesHeader", responsiveLevels: "responsiveLevels", ripple: "ripple", rootElement: "rootElement", scrollerClass: "scrollerClass", scrollManager: "scrollManager", showDirty: "showDirty", stateful: "stateful", statefulEvents: "statefulEvents", stateId: "stateId", stateProvider: "stateProvider", strips: "strips", subGridConfigs: "subGridConfigs", syncMask: "syncMask", tab: "tab", tabBarItems: "tabBarItems", tbar: "tbar", type: "type", ui: "ui", weight: "weight", alignSelf: "alignSelf", animateTreeNodeToggle: "animateTreeNodeToggle", appendTo: "appendTo", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cellEllipsis: "cellEllipsis", cls: "cls", collapsed: "collapsed", column: "column", columnLines: "columnLines", columns: "columns", data: "data", dataset: "dataset", disabled: "disabled", emptyText: "emptyText", enableUndoRedoKeys: "enableUndoRedoKeys", extraData: "extraData", flex: "flex", height: "height", hidden: "hidden", hideFooters: "hideFooters", hideHeaders: "hideHeaders", id: "id", inputFieldAlign: "inputFieldAlign", insertBefore: "insertBefore", insertFirst: "insertFirst", keyMap: "keyMap", labelPosition: "labelPosition", longPressTime: "longPressTime", margin: "margin", maxHeight: "maxHeight", maxWidth: "maxWidth", minHeight: "minHeight", minWidth: "minWidth", preserveScroll: "preserveScroll", readOnly: "readOnly", rendition: "rendition", rowHeight: "rowHeight", rowLines: "rowLines", rtl: "rtl", scrollable: "scrollable", selectionMode: "selectionMode", span: "span", stateSettings: "stateSettings", store: "store", title: "title", tools: "tools", transition: "transition", transitionDuration: "transitionDuration", width: "width", focusVisible: "focusVisible", hasChanges: "hasChanges", originalStore: "originalStore", parent: "parent", selectedCell: "selectedCell", selectedCells: "selectedCells", selectedRecord: "selectedRecord", selectedRecords: "selectedRecords", selectedRows: "selectedRows", state: "state", tooltip: "tooltip", aiFilterFeature: "aiFilterFeature", cellCopyPasteFeature: "cellCopyPasteFeature", cellEditFeature: "cellEditFeature", cellMenuFeature: "cellMenuFeature", cellTooltipFeature: "cellTooltipFeature", chartsFeature: "chartsFeature", columnAutoWidthFeature: "columnAutoWidthFeature", columnDragToolbarFeature: "columnDragToolbarFeature", columnPickerFeature: "columnPickerFeature", columnRenameFeature: "columnRenameFeature", columnReorderFeature: "columnReorderFeature", columnResizeFeature: "columnResizeFeature", excelExporterFeature: "excelExporterFeature", fileDropFeature: "fileDropFeature", fillHandleFeature: "fillHandleFeature", filterFeature: "filterFeature", filterBarFeature: "filterBarFeature", groupFeature: "groupFeature", groupSummaryFeature: "groupSummaryFeature", headerMenuFeature: "headerMenuFeature", lockRowsFeature: "lockRowsFeature", mergeCellsFeature: "mergeCellsFeature", pdfExportFeature: "pdfExportFeature", pinColumnsFeature: "pinColumnsFeature", printFeature: "printFeature", quickFindFeature: "quickFindFeature", regionResizeFeature: "regionResizeFeature", rowCopyPasteFeature: "rowCopyPasteFeature", rowEditFeature: "rowEditFeature", rowExpanderFeature: "rowExpanderFeature", rowReorderFeature: "rowReorderFeature", rowResizeFeature: "rowResizeFeature", searchFeature: "searchFeature", sortFeature: "sortFeature", splitFeature: "splitFeature", stickyCellsFeature: "stickyCellsFeature", stripeFeature: "stripeFeature", summaryFeature: "summaryFeature", treeFeature: "treeFeature", treeGroupFeature: "treeGroupFeature" }, outputs: { onBeforeCancelCellEdit: "onBeforeCancelCellEdit", onBeforeCancelRowEdit: "onBeforeCancelRowEdit", onBeforeCellEditStart: "onBeforeCellEditStart", onBeforeCellRangeDelete: "onBeforeCellRangeDelete", onBeforeCellRangeEdit: "onBeforeCellRangeEdit", onBeforeColumnDragStart: "onBeforeColumnDragStart", onBeforeColumnDropFinalize: "onBeforeColumnDropFinalize", onBeforeColumnResize: "onBeforeColumnResize", onBeforeCopy: "onBeforeCopy", onBeforeCSVExport: "onBeforeCSVExport", onBeforeDestroy: "onBeforeDestroy", onBeforeExcelExport: "onBeforeExcelExport", onBeforeFillHandleDragStart: "onBeforeFillHandleDragStart", onBeforeFinishCellEdit: "onBeforeFinishCellEdit", onBeforeFinishRowEdit: "onBeforeFinishRowEdit", onBeforeHide: "onBeforeHide", onBeforePaste: "onBeforePaste", onBeforePdfExport: "onBeforePdfExport", 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", onDataChange: "onDataChange", 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", onLockRows: "onLockRows", onMouseOut: "onMouseOut", onMouseOver: "onMouseOver", onPaint: "onPaint", onPaste: "onPaste", onPdfExport: "onPdfExport", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onRenderRow: "onRenderRow", onRenderRows: "onRenderRows", onResize: "onResize", 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", onToggleGroup: "onToggleGroup", onToggleNode: "onToggleNode", onToolClick: "onToolClick", onUnlockRows: "onUnlockRows", onUnsplit: "onUnsplit" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
1521
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumGridComponent, decorators: [{
1522
+ type: Component,
1523
+ args: [{
1524
+ selector: 'bryntum-grid',
1525
+ template: ''
1526
+ }]
1527
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { adopt: [{
1528
+ type: Input
1529
+ }], animateFilterRemovals: [{
1530
+ type: Input
1531
+ }], animateRemovingRows: [{
1532
+ type: Input
1533
+ }], ariaDescription: [{
1534
+ type: Input
1535
+ }], ariaLabel: [{
1536
+ type: Input
1537
+ }], autoHeight: [{
1538
+ type: Input
1539
+ }], bbar: [{
1540
+ type: Input
1541
+ }], bodyCls: [{
1542
+ type: Input
1543
+ }], bubbleEvents: [{
1544
+ type: Input
1545
+ }], collapsible: [{
1546
+ type: Input
1547
+ }], color: [{
1548
+ type: Input
1549
+ }], config: [{
1550
+ type: Input
1551
+ }], contentElementCls: [{
1552
+ type: Input
1553
+ }], contextMenuTriggerEvent: [{
1554
+ type: Input
1555
+ }], dataField: [{
1556
+ type: Input
1557
+ }], defaultRegion: [{
1558
+ type: Input
1559
+ }], destroyStore: [{
1560
+ type: Input
1561
+ }], detectCSSCompatibilityIssues: [{
1562
+ type: Input
1563
+ }], disableGridColumnIdWarning: [{
1564
+ type: Input
1565
+ }], disableGridRowModelWarning: [{
1566
+ type: Input
1567
+ }], dock: [{
1568
+ type: Input
1569
+ }], drawer: [{
1570
+ type: Input
1571
+ }], elementAttributes: [{
1572
+ type: Input
1573
+ }], enableSticky: [{
1574
+ type: Input
1575
+ }], enableTextSelection: [{
1576
+ type: Input
1577
+ }], fillLastColumn: [{
1578
+ type: Input
1579
+ }], fixedRowHeight: [{
1580
+ type: Input
1581
+ }], footer: [{
1582
+ type: Input
1583
+ }], formulaProviders: [{
1584
+ type: Input
1585
+ }], fullRowRefresh: [{
1586
+ type: Input
1587
+ }], getRowHeight: [{
1588
+ type: Input
1589
+ }], header: [{
1590
+ type: Input
1591
+ }], hideHorizontalScrollbar: [{
1592
+ type: Input
1593
+ }], hoverCls: [{
1594
+ type: Input
1595
+ }], icon: [{
1596
+ type: Input
1597
+ }], ignoreParentReadOnly: [{
1598
+ type: Input
1599
+ }], listeners: [{
1600
+ type: Input
1601
+ }], loadMask: [{
1602
+ type: Input
1603
+ }], loadMaskDefaults: [{
1604
+ type: Input
1605
+ }], loadMaskError: [{
1606
+ type: Input
1607
+ }], localizable: [{
1608
+ type: Input
1609
+ }], maskDefaults: [{
1610
+ type: Input
1611
+ }], masked: [{
1612
+ type: Input
1613
+ }], monitorResize: [{
1614
+ type: Input
1615
+ }], owner: [{
1616
+ type: Input
1617
+ }], plugins: [{
1618
+ type: Input
1619
+ }], preserveFocusOnDatasetChange: [{
1620
+ type: Input
1621
+ }], preserveScrollOnDatasetChange: [{
1622
+ type: Input
1623
+ }], preventTooltipOnTouch: [{
1624
+ type: Input
1625
+ }], relayStoreEvents: [{
1626
+ type: Input
1627
+ }], resizable: [{
1628
+ type: Input
1629
+ }], resizeToFitIncludesHeader: [{
1630
+ type: Input
1631
+ }], responsiveLevels: [{
1632
+ type: Input
1633
+ }], ripple: [{
1634
+ type: Input
1635
+ }], rootElement: [{
1636
+ type: Input
1637
+ }], scrollerClass: [{
1638
+ type: Input
1639
+ }], scrollManager: [{
1640
+ type: Input
1641
+ }], showDirty: [{
1642
+ type: Input
1643
+ }], stateful: [{
1644
+ type: Input
1645
+ }], statefulEvents: [{
1646
+ type: Input
1647
+ }], stateId: [{
1648
+ type: Input
1649
+ }], stateProvider: [{
1650
+ type: Input
1651
+ }], strips: [{
1652
+ type: Input
1653
+ }], subGridConfigs: [{
1654
+ type: Input
1655
+ }], syncMask: [{
1656
+ type: Input
1657
+ }], tab: [{
1658
+ type: Input
1659
+ }], tabBarItems: [{
1660
+ type: Input
1661
+ }], tbar: [{
1662
+ type: Input
1663
+ }], type: [{
1664
+ type: Input
1665
+ }], ui: [{
1666
+ type: Input
1667
+ }], weight: [{
1668
+ type: Input
1669
+ }], alignSelf: [{
1670
+ type: Input
1671
+ }], animateTreeNodeToggle: [{
1672
+ type: Input
1673
+ }], appendTo: [{
1674
+ type: Input
1675
+ }], callOnFunctions: [{
1676
+ type: Input
1677
+ }], catchEventHandlerExceptions: [{
1678
+ type: Input
1679
+ }], cellEllipsis: [{
1680
+ type: Input
1681
+ }], cls: [{
1682
+ type: Input
1683
+ }], collapsed: [{
1684
+ type: Input
1685
+ }], column: [{
1686
+ type: Input
1687
+ }], columnLines: [{
1688
+ type: Input
1689
+ }], columns: [{
1690
+ type: Input
1691
+ }], data: [{
1692
+ type: Input
1693
+ }], dataset: [{
1694
+ type: Input
1695
+ }], disabled: [{
1696
+ type: Input
1697
+ }], emptyText: [{
1698
+ type: Input
1699
+ }], enableUndoRedoKeys: [{
1700
+ type: Input
1701
+ }], extraData: [{
1702
+ type: Input
1703
+ }], flex: [{
1704
+ type: Input
1705
+ }], height: [{
1706
+ type: Input
1707
+ }], hidden: [{
1708
+ type: Input
1709
+ }], hideFooters: [{
1710
+ type: Input
1711
+ }], hideHeaders: [{
1712
+ type: Input
1713
+ }], id: [{
1714
+ type: Input
1715
+ }], inputFieldAlign: [{
1716
+ type: Input
1717
+ }], insertBefore: [{
1718
+ type: Input
1719
+ }], insertFirst: [{
1720
+ type: Input
1721
+ }], keyMap: [{
1722
+ type: Input
1723
+ }], labelPosition: [{
1724
+ type: Input
1725
+ }], longPressTime: [{
1726
+ type: Input
1727
+ }], margin: [{
1728
+ type: Input
1729
+ }], maxHeight: [{
1730
+ type: Input
1731
+ }], maxWidth: [{
1732
+ type: Input
1733
+ }], minHeight: [{
1734
+ type: Input
1735
+ }], minWidth: [{
1736
+ type: Input
1737
+ }], preserveScroll: [{
1738
+ type: Input
1739
+ }], readOnly: [{
1740
+ type: Input
1741
+ }], rendition: [{
1742
+ type: Input
1743
+ }], rowHeight: [{
1744
+ type: Input
1745
+ }], rowLines: [{
1746
+ type: Input
1747
+ }], rtl: [{
1748
+ type: Input
1749
+ }], scrollable: [{
1750
+ type: Input
1751
+ }], selectionMode: [{
1752
+ type: Input
1753
+ }], span: [{
1754
+ type: Input
1755
+ }], stateSettings: [{
1756
+ type: Input
1757
+ }], store: [{
1758
+ type: Input
1759
+ }], title: [{
1760
+ type: Input
1761
+ }], tools: [{
1762
+ type: Input
1763
+ }], transition: [{
1764
+ type: Input
1765
+ }], transitionDuration: [{
1766
+ type: Input
1767
+ }], width: [{
1768
+ type: Input
1769
+ }], focusVisible: [{
1770
+ type: Input
1771
+ }], hasChanges: [{
1772
+ type: Input
1773
+ }], originalStore: [{
1774
+ type: Input
1775
+ }], parent: [{
1776
+ type: Input
1777
+ }], selectedCell: [{
1778
+ type: Input
1779
+ }], selectedCells: [{
1780
+ type: Input
1781
+ }], selectedRecord: [{
1782
+ type: Input
1783
+ }], selectedRecords: [{
1784
+ type: Input
1785
+ }], selectedRows: [{
1786
+ type: Input
1787
+ }], state: [{
1788
+ type: Input
1789
+ }], tooltip: [{
1790
+ type: Input
1791
+ }], aiFilterFeature: [{
1792
+ type: Input
1793
+ }], cellCopyPasteFeature: [{
1794
+ type: Input
1795
+ }], cellEditFeature: [{
1796
+ type: Input
1797
+ }], cellMenuFeature: [{
1798
+ type: Input
1799
+ }], cellTooltipFeature: [{
1800
+ type: Input
1801
+ }], chartsFeature: [{
1802
+ type: Input
1803
+ }], columnAutoWidthFeature: [{
1804
+ type: Input
1805
+ }], columnDragToolbarFeature: [{
1806
+ type: Input
1807
+ }], columnPickerFeature: [{
1808
+ type: Input
1809
+ }], columnRenameFeature: [{
1810
+ type: Input
1811
+ }], columnReorderFeature: [{
1812
+ type: Input
1813
+ }], columnResizeFeature: [{
1814
+ type: Input
1815
+ }], excelExporterFeature: [{
1816
+ type: Input
1817
+ }], fileDropFeature: [{
1818
+ type: Input
1819
+ }], fillHandleFeature: [{
1820
+ type: Input
1821
+ }], filterFeature: [{
1822
+ type: Input
1823
+ }], filterBarFeature: [{
1824
+ type: Input
1825
+ }], groupFeature: [{
1826
+ type: Input
1827
+ }], groupSummaryFeature: [{
1828
+ type: Input
1829
+ }], headerMenuFeature: [{
1830
+ type: Input
1831
+ }], lockRowsFeature: [{
1832
+ type: Input
1833
+ }], mergeCellsFeature: [{
1834
+ type: Input
1835
+ }], pdfExportFeature: [{
1836
+ type: Input
1837
+ }], pinColumnsFeature: [{
1838
+ type: Input
1839
+ }], printFeature: [{
1840
+ type: Input
1841
+ }], quickFindFeature: [{
1842
+ type: Input
1843
+ }], regionResizeFeature: [{
1844
+ type: Input
1845
+ }], rowCopyPasteFeature: [{
1846
+ type: Input
1847
+ }], rowEditFeature: [{
1848
+ type: Input
1849
+ }], rowExpanderFeature: [{
1850
+ type: Input
1851
+ }], rowReorderFeature: [{
1852
+ type: Input
1853
+ }], rowResizeFeature: [{
1854
+ type: Input
1855
+ }], searchFeature: [{
1856
+ type: Input
1857
+ }], sortFeature: [{
1858
+ type: Input
1859
+ }], splitFeature: [{
1860
+ type: Input
1861
+ }], stickyCellsFeature: [{
1862
+ type: Input
1863
+ }], stripeFeature: [{
1864
+ type: Input
1865
+ }], summaryFeature: [{
1866
+ type: Input
1867
+ }], treeFeature: [{
1868
+ type: Input
1869
+ }], treeGroupFeature: [{
1870
+ type: Input
1871
+ }], onBeforeCancelCellEdit: [{
1872
+ type: Output
1873
+ }], onBeforeCancelRowEdit: [{
1874
+ type: Output
1875
+ }], onBeforeCellEditStart: [{
1876
+ type: Output
1877
+ }], onBeforeCellRangeDelete: [{
1878
+ type: Output
1879
+ }], onBeforeCellRangeEdit: [{
1880
+ type: Output
1881
+ }], onBeforeColumnDragStart: [{
1882
+ type: Output
1883
+ }], onBeforeColumnDropFinalize: [{
1884
+ type: Output
1885
+ }], onBeforeColumnResize: [{
1886
+ type: Output
1887
+ }], onBeforeCopy: [{
1888
+ type: Output
1889
+ }], onBeforeCSVExport: [{
1890
+ type: Output
1891
+ }], onBeforeDestroy: [{
1892
+ type: Output
1893
+ }], onBeforeExcelExport: [{
1894
+ type: Output
1895
+ }], onBeforeFillHandleDragStart: [{
1896
+ type: Output
1897
+ }], onBeforeFinishCellEdit: [{
1898
+ type: Output
1899
+ }], onBeforeFinishRowEdit: [{
1900
+ type: Output
1901
+ }], onBeforeHide: [{
1902
+ type: Output
1903
+ }], onBeforePaste: [{
1904
+ type: Output
1905
+ }], onBeforePdfExport: [{
1906
+ type: Output
1907
+ }], onBeforeRenderRow: [{
1908
+ type: Output
1909
+ }], onBeforeRenderRows: [{
1910
+ type: Output
1911
+ }], onBeforeRowCollapse: [{
1912
+ type: Output
1913
+ }], onBeforeRowExpand: [{
1914
+ type: Output
1915
+ }], onBeforeSelectionChange: [{
1916
+ type: Output
1917
+ }], onBeforeSetRecord: [{
1918
+ type: Output
1919
+ }], onBeforeShow: [{
1920
+ type: Output
1921
+ }], onBeforeStartRowEdit: [{
1922
+ type: Output
1923
+ }], onBeforeStateApply: [{
1924
+ type: Output
1925
+ }], onBeforeStateSave: [{
1926
+ type: Output
1927
+ }], onBeforeToggleGroup: [{
1928
+ type: Output
1929
+ }], onBeforeToggleNode: [{
1930
+ type: Output
1931
+ }], onCancelCellEdit: [{
1932
+ type: Output
1933
+ }], onCatchAll: [{
1934
+ type: Output
1935
+ }], onCellClick: [{
1936
+ type: Output
1937
+ }], onCellContextMenu: [{
1938
+ type: Output
1939
+ }], onCellDblClick: [{
1940
+ type: Output
1941
+ }], onCellMenuBeforeShow: [{
1942
+ type: Output
1943
+ }], onCellMenuItem: [{
1944
+ type: Output
1945
+ }], onCellMenuShow: [{
1946
+ type: Output
1947
+ }], onCellMenuToggleItem: [{
1948
+ type: Output
1949
+ }], onCellMouseEnter: [{
1950
+ type: Output
1951
+ }], onCellMouseLeave: [{
1952
+ type: Output
1953
+ }], onCellMouseOut: [{
1954
+ type: Output
1955
+ }], onCellMouseOver: [{
1956
+ type: Output
1957
+ }], onCollapse: [{
1958
+ type: Output
1959
+ }], onCollapseNode: [{
1960
+ type: Output
1961
+ }], onColumnDrag: [{
1962
+ type: Output
1963
+ }], onColumnDragStart: [{
1964
+ type: Output
1965
+ }], onColumnDrop: [{
1966
+ type: Output
1967
+ }], onColumnResize: [{
1968
+ type: Output
1969
+ }], onColumnResizeStart: [{
1970
+ type: Output
1971
+ }], onContextMenuItem: [{
1972
+ type: Output
1973
+ }], onContextMenuToggleItem: [{
1974
+ type: Output
1975
+ }], onCopy: [{
1976
+ type: Output
1977
+ }], onDataChange: [{
1978
+ type: Output
1979
+ }], onDestroy: [{
1980
+ type: Output
1981
+ }], onDirtyStateChange: [{
1982
+ type: Output
1983
+ }], onDragSelecting: [{
1984
+ type: Output
1985
+ }], onElementCreated: [{
1986
+ type: Output
1987
+ }], onExpand: [{
1988
+ type: Output
1989
+ }], onExpandNode: [{
1990
+ type: Output
1991
+ }], onFileDrop: [{
1992
+ type: Output
1993
+ }], onFillHandleBeforeDragFinalize: [{
1994
+ type: Output
1995
+ }], onFillHandleDrag: [{
1996
+ type: Output
1997
+ }], onFillHandleDragAbort: [{
1998
+ type: Output
1999
+ }], onFillHandleDragEnd: [{
2000
+ type: Output
2001
+ }], onFillHandleDragStart: [{
2002
+ type: Output
2003
+ }], onFinishCellEdit: [{
2004
+ type: Output
2005
+ }], onFinishRowEdit: [{
2006
+ type: Output
2007
+ }], onFocusIn: [{
2008
+ type: Output
2009
+ }], onFocusOut: [{
2010
+ type: Output
2011
+ }], onGridRowBeforeDragStart: [{
2012
+ type: Output
2013
+ }], onGridRowBeforeDropFinalize: [{
2014
+ type: Output
2015
+ }], onGridRowDrag: [{
2016
+ type: Output
2017
+ }], onGridRowDragAbort: [{
2018
+ type: Output
2019
+ }], onGridRowDragStart: [{
2020
+ type: Output
2021
+ }], onGridRowDrop: [{
2022
+ type: Output
2023
+ }], onHeaderClick: [{
2024
+ type: Output
2025
+ }], onHeaderMenuBeforeShow: [{
2026
+ type: Output
2027
+ }], onHeaderMenuItem: [{
2028
+ type: Output
2029
+ }], onHeaderMenuShow: [{
2030
+ type: Output
2031
+ }], onHeaderMenuToggleItem: [{
2032
+ type: Output
2033
+ }], onHide: [{
2034
+ type: Output
2035
+ }], onLockRows: [{
2036
+ type: Output
2037
+ }], onMouseOut: [{
2038
+ type: Output
2039
+ }], onMouseOver: [{
2040
+ type: Output
2041
+ }], onPaint: [{
2042
+ type: Output
2043
+ }], onPaste: [{
2044
+ type: Output
2045
+ }], onPdfExport: [{
2046
+ type: Output
2047
+ }], onReadOnly: [{
2048
+ type: Output
2049
+ }], onRecompose: [{
2050
+ type: Output
2051
+ }], onRenderRow: [{
2052
+ type: Output
2053
+ }], onRenderRows: [{
2054
+ type: Output
2055
+ }], onResize: [{
2056
+ type: Output
2057
+ }], onResponsive: [{
2058
+ type: Output
2059
+ }], onRowCollapse: [{
2060
+ type: Output
2061
+ }], onRowExpand: [{
2062
+ type: Output
2063
+ }], onRowMouseEnter: [{
2064
+ type: Output
2065
+ }], onRowMouseLeave: [{
2066
+ type: Output
2067
+ }], onScroll: [{
2068
+ type: Output
2069
+ }], onSelectionChange: [{
2070
+ type: Output
2071
+ }], onSelectionModeChange: [{
2072
+ type: Output
2073
+ }], onShow: [{
2074
+ type: Output
2075
+ }], onSplit: [{
2076
+ type: Output
2077
+ }], onSplitterCollapseClick: [{
2078
+ type: Output
2079
+ }], onSplitterDragEnd: [{
2080
+ type: Output
2081
+ }], onSplitterDragStart: [{
2082
+ type: Output
2083
+ }], onSplitterExpandClick: [{
2084
+ type: Output
2085
+ }], onStartCellEdit: [{
2086
+ type: Output
2087
+ }], onStartRowEdit: [{
2088
+ type: Output
2089
+ }], onSubGridCollapse: [{
2090
+ type: Output
2091
+ }], onSubGridExpand: [{
2092
+ type: Output
2093
+ }], onToggleGroup: [{
2094
+ type: Output
2095
+ }], onToggleNode: [{
2096
+ type: Output
2097
+ }], onToolClick: [{
2098
+ type: Output
2099
+ }], onUnlockRows: [{
2100
+ type: Output
2101
+ }], onUnsplit: [{
2102
+ type: Output
2103
+ }] } });
2104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudC9zcmMvbGliL2JyeW50dW0tZ3JpZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0RBQXNEO0FBQ3REOztHQUVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0QsTUFBTSxlQUFlLENBQUM7QUFFbkksT0FBTyxhQUFhLE1BQU0sa0JBQWtCLENBQUM7QUFFN0MsT0FBTyxFQUEwYSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwZCxPQUFPLEVBQTRvQixJQUFJLEVBQW8xQixNQUFNLG9CQUFvQixDQUFDO0FBRXRnRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7O0FBd2dDbEQsTUFBTSxPQUFPLG9CQUFvQjtJQTBiN0IsWUFBWSxPQUFtQjtRQVR2QixrQkFBYSxHQUFHO1lBQ3BCLEtBQUssRUFBYyxTQUFTO1lBQzVCLFFBQVEsRUFBVyxTQUFTO1lBQzVCLElBQUksRUFBZSxTQUFTO1lBQzVCLGdCQUFnQixFQUFHLElBQUk7WUFDdkIsUUFBUSxFQUFXLEVBQUU7WUFDckIsU0FBUyxFQUFVLEVBQUU7U0FDeEIsQ0FBQztRQXVORixrQkFBa0I7UUFDbEI7Ozs7O1dBS0c7UUFDTywyQkFBc0IsR0FBUSxJQUFJLFlBQVksRUFBb0csQ0FBQztRQUM3Sjs7Ozs7OztXQU9HO1FBQ08sMEJBQXFCLEdBQVEsSUFBSSxZQUFZLEVBQXNHLENBQUM7UUFDOUo7Ozs7O1dBS0c7UUFDTywwQkFBcUIsR0FBUSxJQUFJLFlBQVksRUFBeUcsQ0FBQztRQUNqSzs7Ozs7O1dBTUc7UUFDTyw0QkFBdUIsR0FBUSxJQUFJLFlBQVksRUFBOEcsQ0FBQztRQUN4Szs7Ozs7O1dBTUc7UUFDTywwQkFBcUIsR0FBUSxJQUFJLFlBQVksRUFBbUcsQ0FBQztR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QUFXO3NCQUFwQixNQUFNO2dCQVNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBTUcsWUFBWTtzQkFBckIsTUFBTTtnQkFVRyxRQUFRO3NCQUFqQixNQUFNO2dCQVVHLFlBQVk7c0JBQXJCLE1BQU07Z0JBTUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFXRyxXQUFXO3NCQUFwQixNQUFNO2dCQVVHLGVBQWU7c0JBQXhCLE1BQU07Z0JBU0csZUFBZTtzQkFBeEIsTUFBTTtnQkFPRyxRQUFRO3NCQUFqQixNQUFNO2dCQWNHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFNRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBTUcsTUFBTTtzQkFBZixNQUFNO2dCQVVHLE9BQU87c0JBQWhCLE1BQU07Z0JBU0csdUJBQXVCO3NCQUFoQyxNQUFNO2dCQVFHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFRRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBU0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQU9HLGVBQWU7c0JBQXhCLE1BQU07Z0JBT0csY0FBYztzQkFBdkIsTUFBTTtnQkFPRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBT0csZUFBZTtzQkFBeEIsTUFBTTtnQkFTRyxhQUFhO3NCQUF0QixNQUFNO2dCQU9HLFlBQVk7c0JBQXJCLE1BQU07Z0JBT0csV0FBVztzQkFBcEIsTUFBTTtnQkFNRyxZQUFZO3NCQUFyQixNQUFNO2dCQUlHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qKlxuICogQW5ndWxhciB3cmFwcGVyIGZvciBCcnludHVtIEdyaWRcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgU2ltcGxlQ2hhbmdlLCBTaW1wbGVDaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgV3JhcHBlckhlbHBlciBmcm9tICcuL3dyYXBwZXIuaGVscGVyJztcblxuaW1wb3J0IHsgQWpheFN0b3JlLCBBamF4U3RvcmVDb25maWcsIEJhc2UsIENvbnRhaW5lciwgRG9tQ29uZmlnLCBGb3JtdWxhUHJvdmlkZXJDb25maWcsIEtleU1hcENvbmZpZywgTWFzaywgTWFza0NvbmZpZywgTWVudSwgTWVudUl0ZW0sIE1lbnVJdGVtRW50cnksIE1vZGVsLCBNb2RlbENvbmZpZywgUGFnaW5nVG9vbGJhckNvbmZpZywgUGFuZWwsIFBhbmVsQ29sbGFwc2VyQ29uZmlnLCBQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWcsIFBhbmVsSGVhZGVyLCBTY3JvbGxNYW5hZ2VyLCBTY3JvbGxNYW5hZ2VyQ29uZmlnLCBTY3JvbGxlciwgU2Nyb2xsZXJDb25maWcsIFN0YXRlUHJvdmlkZXIsIFN0b3JlLCBTdG9yZUNvbmZpZywgVGFiQ29uZmlnLCBUb29sLCBUb29sQ29uZmlnLCBUb29sYmFyQ29uZmlnLCBUb29sYmFySXRlbXMsIFRvb2x0aXBDb25maWcsIFdpZGdldCB9IGZyb20gJ0BicnludHVtL2NvcmUtdGhpbic7XG5pbXBvcnQgeyBBSUZpbHRlciwgQUlGaWx0ZXJDb25maWcsIENlbGxDb3B5UGFzdGUsIENlbGxDb3B5UGFzdGVDb25maWcsIENlbGxFZGl0LCBDZWxsRWRpdENvbmZpZywgQ2VsbEVkaXRvckNvbnRleHQsIENlbGxNZW51LCBDZWxsTWVudUNvbmZpZywgQ2VsbFRvb2x0aXAsIENlbGxUb29sdGlwQ29uZmlnLCBDaGFydHMsIENoYXJ0c0NvbmZpZywgQ29sdW1uLCBDb2x1bW5BdXRvV2lkdGgsIENvbHVtbkF1dG9XaWR0aENvbmZpZywgQ29sdW1uRHJhZ1Rvb2xiYXIsIENvbHVtbkRyYWdUb29sYmFyQ29uZmlnLCBDb2x1bW5QaWNrZXIsIENvbHVtblBpY2tlckNvbmZpZywgQ29sdW1uUmVuYW1lLCBDb2x1bW5SZW5hbWVDb25maWcsIENvbHVtblJlb3JkZXIsIENvbHVtblJlb3JkZXJDb25maWcsIENvbHVtblJlc2l6ZSwgQ29sdW1uUmVzaXplQ29uZmlnLCBDb2x1bW5TdG9yZSwgQ29sdW1uU3RvcmVDb25maWcsIEdyaWRDb250YWluZXJJdGVtQ29uZmlnLCBFbXB0eVRleHREb21Db25maWcsIEV4Y2VsRXhwb3J0ZXIsIEV4Y2VsRXhwb3J0ZXJDb25maWcsIEV4cG9ydENvbmZpZywgRmlsZURyb3AsIEZpbGVEcm9wQ29uZmlnLCBGaWxsSGFuZGxlLCBGaWxsSGFuZGxlQ29uZmlnLCBGaWx0ZXIsIEZpbHRlckJhciwgRmlsdGVyQmFyQ29uZmlnLCBGaWx0ZXJDb25maWcsIEdyaWQsIEdyaWRCYXNlLCBHcmlkQ29sdW1uQ29uZmlnLCBHcmlkTGlzdGVuZXJzLCBHcmlkTG9jYXRpb24sIEdyaWRMb2NhdGlvbkNvbmZpZywgR3JpZFNlbGVjdGlvbk1vZGUsIEdyaWRTdGF0ZUluZm8sIEdyb3VwLCBHcm91cENvbmZpZywgR3JvdXBTdW1tYXJ5LCBHcm91cFN1bW1hcnlDb25maWcsIEhlYWRlck1lbnUsIEhlYWRlck1lbnVDb25maWcsIExvY2tSb3dzLCBMb2NrUm93c0NvbmZpZywgTWVyZ2VDZWxscywgTWVyZ2VDZWxsc0NvbmZpZywgUGRmRXhwb3J0LCBQZGZFeHBvcnRDb25maWcsIFBpbkNvbHVtbnMsIFBpbkNvbHVtbnNDb25maWcsIFByZXNlcnZlU2Nyb2xsT3B0aW9ucywgUHJpbnQsIFByaW50Q29uZmlnLCBRdWlja0ZpbmQsIFF1aWNrRmluZENvbmZpZywgUmVjb3JkUG9zaXRpb25Db250ZXh0LCBSZWdpb25SZXNpemUsIFJlZ2lvblJlc2l6ZUNvbmZpZywgUmVzcG9uc2l2ZUxldmVsQ29uZmlnLCBSb3csIFJvd0NvcHlQYXN0ZSwgUm93Q29weVBhc3RlQ29uZmlnLCBSb3dFZGl0LCBSb3dFZGl0Q29uZmlnLCBSb3dFZGl0b3JDb250ZXh0LCBSb3dFeHBhbmRlciwgUm93RXhwYW5kZXJDb25maWcsIFJvd1Jlb3JkZXIsIFJvd1Jlb3JkZXJDb25maWcsIFJvd1Jlc2l6ZSwgUm93UmVzaXplQ29uZmlnLCBTZWFyY2gsIFNlYXJjaENvbmZpZywgU29ydCwgU29ydENvbmZpZywgU3BsaXQsIFNwbGl0Q29uZmlnLCBTdGlja3lDZWxscywgU3RpY2t5Q2VsbHNDb25maWcsIFN0cmlwZSwgU3RyaXBlQ29uZmlnLCBTdWJHcmlkLCBTdWJHcmlkQ29uZmlnLCBTdW1tYXJ5LCBTdW1tYXJ5Q29uZmlnLCBUcmVlLCBUcmVlQ29uZmlnLCBUcmVlR3JvdXAsIFRyZWVHcm91cENvbmZpZywgWExTQ29sdW1uIH0gZnJvbSAnQGJyeW50dW0vZ3JpZC10aGluJztcblxuaW1wb3J0IHsgU3RyaW5nSGVscGVyIH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcblxuZXhwb3J0IHR5cGUgQnJ5bnR1bUdyaWRQcm9wcyA9IHtcbiAgICAvLyBDb25maWdzXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gYWRvcHQgYXMgdGhpcyBXaWRnZXQncyBlbmNhcHN1bGF0aW5nIGVsZW1lbnQuIFRoZSB3aWRnZXQnc1xuICAgICAqIGNvbnRlbnQgd2lsbCBiZSBwbGFjZWQgaW5zaWRlIHRoaXMgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1hZG9wdClcbiAgICAgKi9cbiAgICBhZG9wdCA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIHdpZGdldCBpcyBhIGNoaWxkIG9mIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciksIGl0IHdpbGwgYnkgZGVmYXVsdCBiZSBwYXJ0aWNpcGF0aW5nIGluIGFcbiAgICAgKiBmbGV4Ym94IGxheW91dC4gVGhpcyBjb25maWcgYWxsb3dzIHlvdSB0byBzZXQgdGhpcyB3aWRnZXQnc1xuICAgICAqIFthbGlnbi1zZWxmXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvYWxpZ24tc2VsZikgc3R5bGUuXG4gICAgICovXG4gICAgYWxpZ25TZWxmID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGFuaW1hdGUgcm93IHJlbW92YWxzIGNhdXNlZCBieSBmaWx0ZXJpbmcuXG4gICAgICogQGRlcHJlY2F0ZWQgNy4wLjAgRGVwcmVjYXRlZCBgYW5pbWF0ZUZpbHRlclJlbW92YWxzYC4gVXNlIGB0cmFuc2l0aW9uLmZpbHRlclJlbW92YWxgIGluc3RlYWRcbiAgICAgKi9cbiAgICBhbmltYXRlRmlsdGVyUmVtb3ZhbHMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb250cm9scyBpZiByZW1vdmluZyBhbmQgaW5zZXJ0aW5nIHJvd3Mgc2hvdWxkIGJlIGFuaW1hdGVkLiBTZXQgdG8gYGZhbHNlYCB0byBwcmV2ZW50IHRob3NlIGFuaW1hdGlvbnMsXG4gICAgICogcmVtb3ZpbmcgdGhlIHJlbGF0ZWQgZGVsYXlzLlxuICAgICAqIEBkZXByZWNhdGVkIDcuMC4wIERlcHJlY2F0ZWQgYGFuaW1hdGVSZW1vdmluZ1Jvd3NgLiBVc2UgYHRyYW5zaXRpb24ucmVtb3ZlUmVjb3JkYCBpbnN0ZWFkXG4gICAgICovXG4gICAgYW5pbWF0ZVJlbW92aW5nUm93cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIFtUcmVlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1RyZWUpIGZlYXR1cmUgaXMgaW4gdXNlIGFuZCB0aGUgU3RvcmUgaXMgYSB0cmVlIHN0b3JlLCB0aGlzXG4gICAgICogY29uZmlnIG1heSBiZSBzZXQgdG8gYHRydWVgIHRvIHZpc3VhbGx5IGFuaW1hdGUgYnJhbmNoIG5vZGUgZXhwYW5kIGFuZCBjb2xsYXBzZSBvcGVyYXRpb25zLlxuICAgICAqICpUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gU2NoZWR1bGVyIGFuZCBHYW50dCpcbiAgICAgKiBAZGVwcmVjYXRlZCA3LjAuMCBEZXByZWNhdGVkIGBhbmltYXRlVHJlZU5vZGVUb2dnbGVgLiBVc2UgYHRyYW5zaXRpb24udG9nZ2xlVHJlZU5vZGVgIGluc3RlYWRcbiAgICAgKi9cbiAgICBhbmltYXRlVHJlZU5vZGVUb2dnbGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciB0aGUgaWQgb2YgYW4gZWxlbWVudCkgdG8gYXBwZW5kIHRoaXMgd2lkZ2V0J3MgZWxlbWVudCB0by4gQ2FuIGJlIGNvbmZpZ3VyZWQsIG9yIHNldCBvbmNlIGF0XG4gICAgICogcnVudGltZS4gVG8gYWNjZXNzIHRoZSBlbGVtZW50IG9mIGEgcmVuZGVyZWQgd2lkZ2V0LCBzZWUgW2VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkuXG4gICAgICovXG4gICAgYXBwZW5kVG8gPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgbG9jYWxpemFibGUgc3RyaW5nIChNYXkgY29udGFpbiBgJ0x7fSdgIHRva2VucyB3aGljaCByZXNvbHZlIGluIHRoZSBsb2NhbGUgZmlsZSkgdG8gaW5qZWN0XG4gICAgICogaW50byBhbiBlbGVtZW50IHdoaWNoIHdpbGwgYmUgbGlua2VkIHVzaW5nIHRoZSBgYXJpYS1kZXNjcmliZWRieWAgYXR0cmlidXRlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLWFyaWFEZXNjcmlwdGlvbilcbiAgICAgKi9cbiAgICBhcmlhRGVzY3JpcHRpb24gPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgbG9jYWxpemFibGUgc3RyaW5nIChNYXkgY29udGFpbiBgJ0x7fSdgIHRva2VucyB3aGljaCByZXNvbHZlIGluIHRoZSBsb2NhbGUgZmlsZSkgdG8gaW5qZWN0IGFzXG4gICAgICogdGhlIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctYXJpYUxhYmVsKVxuICAgICAqL1xuICAgIGFyaWFMYWJlbCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQXV0b21hdGljYWxseSBzZXQgZ3JpZHMgaGVpZ2h0IHRvIGZpdCBhbGwgcm93cyAobm8gc2Nyb2xsaW5nIGluIHRoZSBncmlkKS4gSW4gZ2VuZXJhbCB5b3Ugc2hvdWxkIGF2b2lkXG4gICAgICogdXNpbmcgYGF1dG9IZWlnaHQ6IHRydWVgLCBzaW5jZSBpdCB3aWxsIGJ5cGFzcyBHcmlkcyB2aXJ0dWFsIHJlbmRlcmluZyBhbmQgcmVuZGVyIGFsbCByb3dzIGF0IG9uY2UsIHdoaWNoXG4gICAgICogaW4gYSBsYXJnZXIgZ3JpZCBpcyByZWFsbHkgYmFkIGZvciBwZXJmb3JtYW5jZS5cbiAgICAgKi9cbiAgICBhdXRvSGVpZ2h0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBDb25maWcgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIFtUb29sYmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbGJhciksXG4gICAgICogb3IgYXJyYXkgb2YgY29uZmlnIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBjaGlsZCBpdGVtcyBvZiBhIFRvb2xiYXIuIEFub3RoZXIgd2F5IHRvIGFkZCBhIGJiYXIgaXMgdG8gdXNlIFtzdHJpcHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctc3RyaXBzKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1iYmFyKVxuICAgICAqL1xuICAgIGJiYXIgPyA6IChHcmlkQ29udGFpbmVySXRlbUNvbmZpZ3xzdHJpbmcpW118VG9vbGJhckNvbmZpZ3xQYWdpbmdUb29sYmFyQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIHRoZSBwYW5lbCdzIGJvZHkgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1ib2R5Q2xzKVxuICAgICAqL1xuICAgIGJvZHlDbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hlcmUgcHJvcGVydHkgbmFtZXMgd2l0aCBhIHRydXRoeSB2YWx1ZSBpbmRpY2F0ZSB3aGljaCBldmVudHMgc2hvdWxkIGJ1YmJsZSB1cCB0aGUgb3duZXJzaGlwXG4gICAgICogaGllcmFyY2h5IHdoZW4gdHJpZ2dlcmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLWJ1YmJsZUV2ZW50cylcbiAgICAgKi9cbiAgICBidWJibGVFdmVudHMgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBjYWxsIG9uWFhYIG1ldGhvZCBuYW1lcyAoZS5nLiBgb25TaG93YCwgYG9uQ2xpY2tgKSwgYXMgYW4gZWFzeSB3YXkgdG8gbGlzdGVuIGZvciBldmVudHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctY2FsbE9uRnVuY3Rpb25zKVxuICAgICAqL1xuICAgIGNhbGxPbkZ1bmN0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGlmIGFuIGV2ZW50IGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdGhlIGVycm9yIHByb3BhZ2F0ZXMgdXAgdGhlIHN0YWNrIGFuZCB0aGVcbiAgICAgKiBhcHBsaWNhdGlvbiBzdGF0ZSBpcyB1bmRlZmluZWQuIENvZGUgd2hpY2ggZm9sbG93cyB0aGUgZXZlbnQgaGFuZGxlciB3aWxsICpub3QqIGJlIGV4ZWN1dGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLWNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucylcbiAgICAgKi9cbiAgICBjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBjcm9wIHRleHQgaW4gZ3JpZCBjZWxscyB3aXRob3V0IGVsbGlwc2lzICguLi4pLiBXaGVuIGVuYWJsZWQsIGNlbGxzIGNvbnRhaW5pbmcgcHVyZVxuICAgICAqIHVzZSBgZGlzcGxheSA6IGJsb2NrYCwgaW5zdGVhZCBvZiBgZGlzcGxheSA6IGZsZXhgIHRvIGFsbG93IGVsbGlwc2lzIHRvIHdvcmsuXG4gICAgICogPHN0cm9uZz5OT1RFPC9zdHJvbmc+IE9ubHkgc3VwcG9ydGVkIGluIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBgOmhhcygpYCBDU1Mgc2VsZWN0b3JcbiAgICAgKi9cbiAgICBjZWxsRWxsaXBzaXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIGVsZW1lbnQuXG4gICAgICogTWF5IGJlIHNwZWNpZmllZCBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIHdpdGggdHJ1dGh5IHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctY2xzKVxuICAgICAqL1xuICAgIGNscyA/IDogc3RyaW5nfG9iamVjdFxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHBhbmVsIGlzIGNvbGxhcHNlZCAodGhlIGJvZHkgb2YgdGhlIHBhbmVsIGlzIGhpZGRlbiB3aGlsZSBvbmx5IHRoZSBoZWFkZXIgaXNcbiAgICAgKiB2aXNpYmxlKS4gT25seSB2YWxpZCBpZiB0aGUgcGFuZWwgaXMgW2NvbGxhcHNpYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNpYmxlKS5cbiAgICAgKi9cbiAgICBjb2xsYXBzZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbmZpZyBlbmFibGVzIGNvbGxhcHNpYmlsaXR5IGZvciB0aGUgcGFuZWwuIFNlZSBbY29sbGFwc2VkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNlZCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctY29sbGFwc2libGUpXG4gICAgICovXG4gICAgY29sbGFwc2libGUgPyA6IGJvb2xlYW58UGFuZWxDb2xsYXBzZXJDb25maWd8UGFuZWxDb2xsYXBzZXJPdmVybGF5Q29uZmlnXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgc3BlY2lmaWVkIGNvbG9yIHRvIHRoZSB3aWRnZXQsIGJ5IHNldHRpbmcgdGhlIGAtLWItcHJpbWFyeWAgQ1NTIHZhcmlhYmxlIGluIHRoZSB3aWRnZXRzXG4gICAgICogYHN0eWxlYCBibG9jay5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1jb2xvcilcbiAgICAgKi9cbiAgICBjb2xvciA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogUHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciB3aGljaCBjb2x1bW4gdG8gc3RhcnQgaW4gd2hlbiB1c2VkIGluIGEgZ3JpZCBsYXlvdXQuXG4gICAgICovXG4gICAgY29sdW1uID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBub3Qgc2hvdyBjb2x1bW4gbGluZXMuIEVuZCByZXN1bHQgbWlnaHQgYmUgb3ZlcnJ1bGVkIGJ5L2RpZmZlciBiZXR3ZWVuIHRoZW1lcy5cbiAgICAgKi9cbiAgICBjb2x1bW5MaW5lcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFjY2VwdHMgY29sdW1uIGRlZmluaXRpb25zIGZvciB0aGUgZ3JpZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIFRoZXkgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZVxuICAgICAqIFtDb2x1bW5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2NvbHVtbi9Db2x1bW4pIGluc3RhbmNlcyB0aGF0IGFyZSBhZGRlZCB0byBhIFtDb2x1bW5TdG9yZV0oI0dyaWQvZGF0YS9Db2x1bW5TdG9yZSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctY29sdW1ucylcbiAgICAgKi9cbiAgICBjb2x1bW5zID8gOiBDb2x1bW5TdG9yZXxHcmlkQ29sdW1uQ29uZmlnW118Q29sdW1uU3RvcmVDb25maWdcbiAgICBjb25maWcgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBDU1MgY2xhc3NlcyB0byBhZGQgdG8gdGhlIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCkuXG4gICAgICogTWF5IGJlIHNwZWNpZmllZCBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIHdpdGggdHJ1dGh5IHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctY29udGVudEVsZW1lbnRDbHMpXG4gICAgICovXG4gICAgY29udGVudEVsZW1lbnRDbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGljaCBpcyB1c2VkIHRvIHNob3cgY29udGV4dCBtZW51cy5cbiAgICAgKiBBdmFpbGFibGUgb3B0aW9ucyBhcmU6ICdjb250ZXh0bWVudScsICdjbGljaycsICdkYmxjbGljaycuXG4gICAgICovXG4gICAgY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQgPyA6ICdjb250ZXh0bWVudSd8J2NsaWNrJ3wnZGJsY2xpY2snXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVudCBzaG9ydGN1dCB0byBzZXQgZGF0YSBpbiBncmlkcyBzdG9yZSBib3RoIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgYXQgcnVudGltZS4gQ2FuIGFsc28gYmVcbiAgICAgKiB1c2VkIHRvIHJldHJpZXZlIGRhdGEgYXQgcnVudGltZSwgYWx0aG91Z2ggd2UgZG8gcmVjb21tZW5kIGludGVyYWN0aW5nIHdpdGggR3JpZHMgc3RvcmUgaW5zdGVhZCB1c2luZ1xuICAgICAqIHRoZSBbc3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjcHJvcGVydHktc3RvcmUpIHByb3BlcnR5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLWRhdGEpXG4gICAgICovXG4gICAgZGF0YSA/IDogb2JqZWN0W118TW9kZWxbXXxNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIFdpZGdldCBjb25maWd1cmF0aW9uIGlzIHVzZWQgaW4gdGhlIEdyaWQncyBSb3dFeHBhbmRlciBmZWF0dXJlJ3MgYHdpZGdldGAgY29uZmlnLCBwcm92aWRlIHRoZVxuICAgICAqIGZpZWxkIG9uIHRoZSBleHBhbmRlZCByZWNvcmQgdG8gdXNlIGZvciBwb3B1bGF0aW5nIHRoaXMgd2lkZ2V0J3Mgc3RvcmUgKGlmIGFwcGxpY2FibGUpXG4gICAgICovXG4gICAgZGF0YUZpZWxkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBPYmplY3QgdG8gYXBwbHkgdG8gZWxlbWVudHMgZGF0YXNldCAoZWFjaCBrZXkgd2lsbCBiZSB1c2VkIGFzIGEgZGF0YS1hdHRyaWJ1dGUgb24gdGhlIGVsZW1lbnQpXG4gICAgICovXG4gICAgZGF0YXNldCA/IDogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgIC8qKlxuICAgICAqIFJlZ2lvbiB0byB3aGljaCBjb2x1bW5zIGFyZSBhZGRlZCB3aGVuIHRoZXkgaGF2ZSBub25lIHNwZWNpZmllZFxuICAgICAqL1xuICAgIGRlZmF1bHRSZWdpb24gPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gZGVzdHJveSB0aGUgc3RvcmUgd2hlbiB0aGUgZ3JpZCBpcyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgZGVzdHJveVN0b3JlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgZm9yIENTUyBjb21wYXRpYmlsaXR5IGlzc3VlcyB3aGVuIHVwZ3JhZGluZyB0byB2Ny4gUGVyZm9ybXMgdGhlIGZvbGxvd2luZyBjaGVja3M6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgICAgKi9cbiAgICBkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBvciBlbmFibGUgdGhlIHdpZGdldC4gSXQgaXMgc2ltaWxhciB0byBbcmVhZE9ubHldKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXJlYWRPbmx5KSBleGNlcHQgYSBkaXNhYmxlZCB3aWRnZXRcbiAgICAgKiBjYW5ub3QgYmUgZm9jdXNlZCwgdXNlcyBhIGRpZmZlcmVudCByZW5kaXRpb24gKHVzdWFsbHkgZ3JleWlzaCkgYW5kIGRvZXMgbm90IGFsbG93IHNlbGVjdGluZyBpdHMgdmFsdWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctZGlzYWJsZWQpXG4gICAgICovXG4gICAgZGlzYWJsZWQgPyA6IGJvb2xlYW58J2luZXJ0J1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gbm90IGdldCBhIHdhcm5pbmcgd2hlbiBjYWxsaW5nIFtnZXRTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNmdW5jdGlvbi1nZXRTdGF0ZSkgd2hlbiB0aGVyZSBpcyBhIGNvbHVtblxuICAgICAqIGNvbmZpZ3VyZWQgd2l0aG91dCBhbiBgaWRgLiBCdXQgdGhlIHJlY29tbWVuZGVkIGFjdGlvbiBpcyB0byBhbHdheXMgY29uZmlndXJlIGNvbHVtbnMgd2l0aCBhbiBgaWRgIHdoZW5cbiAgICAgKiB1c2luZyBzdGF0ZXMuXG4gICAgICovXG4gICAgZGlzYWJsZUdyaWRDb2x1bW5JZFdhcm5pbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIG5vdCBnZXQgYSB3YXJuaW5nIHdoZW4gdXNpbmcgYW5vdGhlciBiYXNlIGNsYXNzIHRoYW4gR3JpZFJvd01vZGVsIGZvciB5b3VyIGdyaWQgZGF0YS4gSWZcbiAgICAgKiB5b3UgZG8sIGFuZCB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgZnVsbCBmZWF0dXJlIHNldCBvZiB0aGUgZ3JpZCB0aGVuIGluY2x1ZGUgdGhlIGZpZWxkcyBmcm9tIEdyaWRSb3dNb2RlbFxuICAgICAqIGluIHlvdXIgbW9kZWwgZGVmaW5pdGlvbi5cbiAgICAgKi9cbiAgICBkaXNhYmxlR3JpZFJvd01vZGVsV2FybmluZyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBwbGFjZW1lbnQgb2YgdGhpcyB3aWRnZXQgd2hlbiBpdCBpcyBhZGRlZCB0byBhIFtwYW5lbCdzIF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsKVxuICAgICAqIFtzdHJpcHMgY29sbGVjdGlvbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1zdHJpcHMpLiBUeXBpY2FsIHZhbHVlcyBmb3IgdGhpcyBjb25maWcgYXJlIGAndG9wJ2AsXG4gICAgICogYCdib3R0b20nYCwgYCdsZWZ0J2AsIG9yIGAncmlnaHQnYCwgd2hpY2ggY2F1c2UgdGhlIHdpZGdldCB0byBiZSBwbGFjZWQgb24gdGhhdCBzaWRlIG9mIHRoZSBwYW5lbCdzXG4gICAgICogYm9keS4gU3VjaCB3aWRnZXRzIGFyZSBjYWxsZWQgXCJlZGdlIHN0cmlwc1wiLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLWRvY2spXG4gICAgICovXG4gICAgZG9jayA/IDogJ3RvcCd8J2JvdHRvbSd8J2xlZnQnfCdyaWdodCd8J3N0YXJ0J3wnZW5kJ3wnaGVhZGVyJ3wncHJlLWhlYWRlcid8b2JqZWN0XG4gICAgLyoqXG4gICAgICogTWFrZSB0aGlzIFBhbmVsIGEgZG9ja2VkIGRyYXdlciB3aGljaCBzbGlkZXMgb3V0IGZyb20gb25lIHNpZGUgb2YgdGhlIGJyb3dzZXIgdmlld3BvcnQgYnkgZGVmYXVsdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1kcmF3ZXIpXG4gICAgICogQHBhcmFtIHsnc3RhcnQnLCdsZWZ0JywnZW5kJywncmlnaHQnLCd0b3AnLCdib3R0b20nfSBzaWRlIFRoZSBzaWRlIG9mIHRoZSB2aWV3cG9ydCB0byBkb2NrIHRoZSBkcmF3ZXIgdG8uICAqIGAnc3RhcnQnYCBtZWFucyB0aGUgYGlubGluZS1zdGFydGAgc2lkZS4gKiBgJ2VuZCdgIG1lYW5zIHRoZSBgaW5saW5lLWVuZGAgc2lkZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZyxudW1iZXJ9IHNpemUgVGhlIHNpemUgb2YgdGhlIGRyYXdlciBpbiBpdHMgY29sbGFwc2libGUgYXhpcy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlubGluZSBJZiB1c2luZyB0aGUgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgdG8gcGxhY2UgdGhlIGRyYXdlciBpbnNpZGUgYSBob3N0IHdpZGdldCwgdGhpcyBtYXkgYmUgc2V0IHRvIGB0cnVlYCB0byBtYWtlIHRoZSBkcmF3ZXIgaW5saW5lIHdpdGhpbiB0aGF0IGhvc3QuIE5vdGUgdGhhdCwgaWYgdXNpbmcgdGhpcywgdGhlIGxheW91dCBvZiB0aGUgaG9zdCBlbGVtZW50IG11c3QgaGF2ZSBgZmxleC1kaXJlY3Rpb25gIHNldCBhcHByb3ByaWF0ZWx5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixvYmplY3R9IGF1dG9DbG9zZSBTcGVjaWZpZXMgd2hhdCB1c2VyIGFjdGlvbnMgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIGRyYXdlci4gRGVmYXVsdHMgdG8gY2xvc2luZyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIgb3Igd2hlbiBmb2N1cyBtb3ZlcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFuLHN0cmluZ30gYXV0b0Nsb3NlLm1vdXNlZG93biBJZiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSBvZiB0aGUgZHJhd2VyLCB0aGUgZHJhd2VyIHdpbGwgYXV0b21hdGljYWxseSBiZSBoaWRkZW4uIElmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZywgaXQgaXMgdXNlZCBhcyBhIENTUyBzZWxlY3RvciB0byBmaWx0ZXIgY2xpY2tzIHdoaWNoIHNob3VsZCBjbG9zZSB0aGUgZHJhd2VyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixzdHJpbmd9IGF1dG9DbG9zZS5mb2N1c291dCBJZiBmb2N1cyBtb3ZlcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIsIHRoZSBkcmF3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGhpZGRlbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0b0Nsb3NlLm1vdXNlb3V0IEhpZGVzIHRoZSBkcmF3ZXIgd2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBkcmF3ZXIgYWZ0ZXIgdGhlIGBhdXRvQ2xvc2VEZWxheWAgcGVyaW9kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdXRvQ2xvc2VEZWxheSBXaGVuIHVzaW5nIGBtb3VzZW91dGAsIHRoaXMgaXMgdGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuICAgICAqL1xuICAgIGRyYXdlciA/IDogYm9vbGVhbnx7c2lkZT86ICdzdGFydCd8J2xlZnQnfCdlbmQnfCdyaWdodCd8J3RvcCd8J2JvdHRvbScsIHNpemU/OiBzdHJpbmd8bnVtYmVyLCBpbmxpbmU/OiBib29sZWFuLCBhdXRvQ2xvc2U6IHsgbW91c2Vkb3duPzogYm9vbGVhbnxzdHJpbmcsIGZvY3Vzb3V0PzogYm9vbGVhbnxzdHJpbmcsIG1vdXNlb3V0Pzogc3RyaW5nIH0sIGF1dG9DbG9zZURlbGF5PzogbnVtYmVyfVxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIGF0dHJpYnV0ZXMgdG8gYXNzaWduIHRvIHRoZSByb290IGVsZW1lbnQgb2YgdGhpcyB3aWRnZXQuXG4gICAgICogU2V0IGBudWxsYCB2YWx1ZSB0byBhdHRyaWJ1dGUgdG8gcmVtb3ZlIGl0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLWVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAqL1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8bnVsbD5cbiAgICAvKipcbiAgICAgKiBUZXh0IG9yIEhUTUwsIG9yIGEgW0VtcHR5VGV4dERvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSN0eXBlZGVmLUVtcHR5VGV4dERvbUNvbmZpZykgYmxvY2sgdG8gZGlzcGxheSB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgdG8gZGlzcGxheSBpbiB0aGUgZ3JpZC5cbiAgICAgKiBXaGVuIHVzaW5nIG11bHRpcGxlIEdyaWQgcmVnaW9ucywgcHJvdmlkZSB0aGUgYHJlZ2lvbmAgcHJvcGVydHkgdG8gZGVjaWRlIHdoZXJlIHRoZSB0ZXh0IGlzIHNob3duLlxuICAgICAqIEJ5IGRlZmF1bHQsIGl0IGlzIHNob3duIGluIHRoZSBmaXJzdCByZWdpb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctZW1wdHlUZXh0KVxuICAgICAqL1xuICAgIGVtcHR5VGV4dCA/IDogc3RyaW5nfEVtcHR5VGV4dERvbUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGlzIGFzIGB0cnVlYCB0byBhbGxvdyBlbGVtZW50cyB3aXRoaW4gY2VsbHMgdG8gYmUgc3R5bGVkIGFzIGBwb3NpdGlvbjogc3RpY2t5YC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1lbmFibGVTdGlja3kpXG4gICAgICovXG4gICAgZW5hYmxlU3RpY2t5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBhbGxvdyB0ZXh0IHNlbGVjdGlvbiBpbiB0aGUgZ3JpZCBjZWxscy4gTm90ZSwgdGhpcyBjYW5ub3QgYmUgdXNlZCBzaW11bHRhbmVvdXNseSB3aXRoIHRoZVxuICAgICAqIGBSb3dSZW9yZGVyYCBmZWF0dXJlLlxuICAgICAqL1xuICAgIGVuYWJsZVRleHRTZWxlY3Rpb24gPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGxpc3RlbiBmb3IgQ1RSTC1aIChDTUQtWiBvbiBNYWMgT1MpIGtleWJvYXJkIGV2ZW50IGFuZCB0cmlnZ2VyIHVuZG8gKHJlZG8gd2hlbiBTSElGVCBpc1xuICAgICAqIHByZXNzZWQpLiBPbmx5IGFwcGxpY2FibGUgd2hlbiB1c2luZyBhIFtTdGF0ZVRyYWNraW5nTWFuYWdlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvZGF0YS9zdG0vU3RhdGVUcmFja2luZ01hbmFnZXIpLlxuICAgICAqL1xuICAgIGVuYWJsZVVuZG9SZWRvS2V5cyA/IDogYm9vbGVhblxuICAgIGV4dHJhRGF0YSA/IDogYW55XG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBzdHJldGNoIHRoZSBsYXN0IGNvbHVtbiBpbiBhIGdyaWQgd2l0aCBhbGwgZml4ZWQgd2lkdGggY29sdW1uc1xuICAgICAqIHRvIGZpbGwgZXh0cmEgYXZhaWxhYmxlIHNwYWNlIGlmIHRoZSBncmlkJ3Mgd2lkdGggaXMgd2lkZXIgdGhhbiB0aGUgc3VtIG9mIGFsbFxuICAgICAqIGNvbmZpZ3VyZWQgY29sdW1uIHdpZHRocy5cbiAgICAgKi9cbiAgICBmaWxsTGFzdENvbHVtbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFVzZSBmaXhlZCByb3cgaGVpZ2h0LiBTZXR0aW5nIHRoaXMgdG8gYHRydWVgIHdpbGwgY29uZmlndXJlIHRoZSB1bmRlcmx5aW5nIFJvd01hbmFnZXIgdG8gdXNlIGZpeGVkIHJvd1xuICAgICAqIGhlaWdodCwgd2hpY2ggc2FjcmlmaWNlcyB0aGUgYWJpbGl0eSB0byB1c2Ugcm93cyB3aXRoIHZhcmlhYmxlIGhlaWdodCB0byBnYWluIGEgZnJhY3Rpb24gYmV0dGVyXG4gICAgICogcGVyZm9ybWFuY2UuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctZml4ZWRSb3dIZWlnaHQpXG4gICAgICovXG4gICAgZml4ZWRSb3dIZWlnaHQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgd2lkZ2V0IGlzIGEgY2hpbGQgb2YgYSBbQ29udGFpbmVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKSwgaXQgd2lsbCBieSBkZWZhdWx0IGJlIHBhcnRpY2lwYXRpbmcgaW4gYVxuICAgICAqIGZsZXhib3ggbGF5b3V0LiBUaGlzIGNvbmZpZyBhbGxvd3MgeW91IHRvIHNldCB0aGlzIHdpZGdldCdzXG4gICAgICogW2ZsZXhdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mbGV4KSBzdHlsZS5cbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG51bWJlciBvciBhIGAmbHQ7ZmxleC1ncm93Jmd0OyAmbHQ7ZmxleC1zaHJpbmsmZ3Q7ICZsdDtmbGV4LWJhc2lzJmd0O2AgZm9ybWF0IHN0cmluZy5cbiAgICAgKiBudW1lcmljLW9ubHkgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyB0aGUgYGZsZXgtZ3Jvd2AgdmFsdWUuXG4gICAgICovXG4gICAgZmxleCA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbmZpZyBvYmplY3Qgb2YgYSBmb290ZXIuIE1heSBjb250YWluIGEgYGRvY2tgLCBgaHRtbGAgYW5kIGEgYGNsc2AgcHJvcGVydHkuIEEgZm9vdGVyIGlzIG5vdCBhIHdpZGdldCxcbiAgICAgKiBidXQgcmF0aGVyIHBsYWluIEhUTUwgdGhhdCBmb2xsb3dzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBhbmVsJ3MgYm9keSBhbmQgW3N0cmlwc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1zdHJpcHMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLWZvb3RlcilcbiAgICAgKi9cbiAgICBmb290ZXIgPyA6IHtcbiAgICAgICAgZG9jaz86ICd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfCdzdGFydCd8J2VuZCdcbiAgICAgICAgaHRtbD86IHN0cmluZ1xuICAgICAgICBjbHM/OiBzdHJpbmdcbiAgICB9fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aGljaCBuYW1lcyBmb3JtdWxhIHByZWZpeGVzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgY29sdW1ucyBjb25maWd1cmVkIHdpdGhcbiAgICAgKiBgZm9ybXVsYSA6IHRydWVgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLWZvcm11bGFQcm92aWRlcnMpXG4gICAgICovXG4gICAgZm9ybXVsYVByb3ZpZGVycyA/IDogUmVjb3JkPHN0cmluZywgRm9ybXVsYVByb3ZpZGVyQ29uZmlnPlxuICAgIC8qKlxuICAgICAqIFJlZnJlc2ggZW50aXJlIHJvdyB3aGVuIGEgcmVjb3JkIGNoYW5nZXMgKGB0cnVlYCkgb3IsIGlmIHBvc3NpYmxlLCBvbmx5IHRoZSBjZWxscyBhZmZlY3RlZCAoYGZhbHNlYCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctZnVsbFJvd1JlZnJlc2gpXG4gICAgICovXG4gICAgZnVsbFJvd1JlZnJlc2ggPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIGNhbGxlZCBmb3IgZWFjaCByb3cgdG8gZGV0ZXJtaW5lIGl0cyBoZWlnaHQuIEl0IGlzIHBhc3NlZCBhIFtyZWNvcmRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL2RhdGEvTW9kZWwpIGFuZFxuICAgICAqIGV4cGVjdGVkIHRvIHJldHVybiB0aGUgZGVzaXJlZCBoZWlnaHQgb2YgdGhhdCByZWNvcmRzIHJvdy4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBmYWxzeSB2YWx1ZSwgR3JpZHNcbiAgICAgKiBjb25maWd1cmVkIFtyb3dIZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLXJvd0hlaWdodCkgaXMgdXNlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1nZXRSb3dIZWlnaHQpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGdldFJvd0hlaWdodC5yZWNvcmQgUmVjb3JkIHRvIGRldGVybWluZSByb3cgaGVpZ2h0IGZvclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IERlc2lyZWQgcm93IGhlaWdodFxuICAgICAqL1xuICAgIGdldFJvd0hlaWdodCA/IDogKGdldFJvd0hlaWdodDogeyByZWNvcmQ6IE1vZGVsIH0pID0+IG51bWJlclxuICAgIC8qKlxuICAgICAqIEEgY29uZmlnIFtvYmplY3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCN0eXBlZGVmLVBhbmVsSGVhZGVyKSBmb3IgdGhlIHBhbmVsJ3MgaGVhZGVyIG9yIGEgc3RyaW5nIGluIHBsYWNlIG9mIGEgYHRpdGxlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1oZWFkZXIpXG4gICAgICovXG4gICAgaGVhZGVyID8gOiBzdHJpbmd8Ym9vbGVhbnxQYW5lbEhlYWRlclxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIGhlaWdodCwgdXNlZCB0byBzZXQgZWxlbWVudCBgc3R5bGUuaGVpZ2h0YC4gRWl0aGVyIHNwZWNpZnkgYSB2YWxpZCBoZWlnaHQgc3RyaW5nIG9yIGEgbnVtYmVyLFxuICAgICAqIHdoaWNoIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgaGVpZ2h0LCBidXQgaW4gc29tZVxuICAgICAqIGNhc2VzIHRoaXMgY29uZmlnIGlzIGNvbnZlbmllbnQuXG4gICAgICovXG4gICAgaGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHdpdGggdHJ1ZSB0byBtYWtlIHdpZGdldCBpbml0aWFsbHkgaGlkZGVuLlxuICAgICAqL1xuICAgIGhpZGRlbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gaGlkZSB0aGUgZm9vdGVyIGVsZW1lbnRzXG4gICAgICovXG4gICAgaGlkZUZvb3RlcnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGhpZGUgdGhlIGNvbHVtbiBoZWFkZXIgZWxlbWVudHNcbiAgICAgKi9cbiAgICBoaWRlSGVhZGVycyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gaGlkZSB0aGUgR3JpZCdzIGhvcml6b250YWwgc2Nyb2xsYmFyKHMpXG4gICAgICovXG4gICAgaGlkZUhvcml6b250YWxTY3JvbGxiYXIgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIENTUyBjbGFzcyB0byBhZGQgdG8gaG92ZXJlZCByb3cgZWxlbWVudHNcbiAgICAgKi9cbiAgICBob3ZlckNscyA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQW4gaWNvbiB0byBzaG93IGJlZm9yZSB0aGUgW3RpdGxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXRpdGxlKS4gRWl0aGVyIHBhc3MgYSBDU1MgY2xhc3MgYXMgYSBzdHJpbmcsIG9yIHBhc3MgYVxuICAgICAqIFtEb21Db25maWddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL2hlbHBlci9Eb21IZWxwZXIjdHlwZWRlZi1Eb21Db25maWcpIG9iamVjdCBkZXNjcmliaW5nIGFuIGVsZW1lbnQgdG8gcmVwcmVzZW50IHRoZSBpY29uLlxuICAgICAqL1xuICAgIGljb24gPyA6IHN0cmluZ3xEb21Db25maWdcbiAgICAvKipcbiAgICAgKiBXaWRnZXQgaWQsIGlmIG5vdCBzcGVjaWZpZWQgb25lIHdpbGwgYmUgZ2VuZXJhdGVkLiBBbHNvIHVzZWQgZm9yIGxvb2t1cHMgdGhyb3VnaCBXaWRnZXQuZ2V0QnlJZFxuICAgICAqL1xuICAgIGlkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB3aWRnZXRzIHJlYWQtb25seSBzdGF0ZSBzaG91bGQgYmUgY29udHJvbGxlZCBieSBpdHMgcGFyZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLWlnbm9yZVBhcmVudFJlYWRPbmx5KVxuICAgICAqL1xuICAgIGlnbm9yZVBhcmVudFJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byBhbGlnbiBpbnB1dCBmaWVsZHMgb2YgY2hpbGQgd2lkZ2V0cy4gQnkgZGVmYXVsdCwgdGhlIEZpZWxkIGlucHV0IGVsZW1lbnQgaXNcbiAgICAgKiBwbGFjZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBgbGFiZWxgLiBJZiB5b3UgcHJlZmVyIHRvIGhhdmUgYWxsIGlucHV0IGZpZWxkcyBhbGlnbmVkIHRvIHRoZVxuICAgICAqIHJpZ2h0LCBzZXQgdGhpcyBjb25maWcgdG8gYCdlbmQnYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1pbnB1dEZpZWxkQWxpZ24pXG4gICAgICovXG4gICAgaW5wdXRGaWVsZEFsaWduID8gOiAnc3RhcnQnfCdlbmQnXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gaW5zZXJ0IHRoaXMgd2lkZ2V0IGJlZm9yZS4gSWYgcHJvdmlkZWQsIFthcHBlbmRUb10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGluc2VydEJlZm9yZSA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gYXBwZW5kIHRoaXMgd2lkZ2V0IGVsZW1lbnQgdG8sIGFzIGEgZmlyc3QgY2hpbGQuIElmIHByb3ZpZGVkLCBbYXBwZW5kVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgaXMgaWdub3JlZC5cbiAgICAgKi9cbiAgICBpbnNlcnRGaXJzdCA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogU2VlIFtLZXlib2FyZCBzaG9ydGN1dHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNrZXlib2FyZC1zaG9ydGN1dHMpIGZvciBkZXRhaWxzXG4gICAgICovXG4gICAga2V5TWFwID8gOiBSZWNvcmQ8c3RyaW5nLCBLZXlNYXBDb25maWc+XG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byB1c2Ugc2FtZSBsYWJlbCBwbGFjZW1lbnQgb24gYWxsIGNoaWxkIHdpZGdldHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctbGFiZWxQb3NpdGlvbilcbiAgICAgKi9cbiAgICBsYWJlbFBvc2l0aW9uID8gOiAnYmVmb3JlJ3wnYWJvdmUnfCdhbGlnbi1iZWZvcmUnfCdhdXRvJ3xudWxsXG4gICAgLyoqXG4gICAgICogVGhlIGxpc3RlbmVyIHNldCBmb3IgdGhpcyBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctbGlzdGVuZXJzKVxuICAgICAqL1xuICAgIGxpc3RlbmVycyA/IDogR3JpZExpc3RlbmVyc1xuICAgIC8qKlxuICAgICAqIEEgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LCBvciBhIG1lc3NhZ2UgdG8gYmUgc2hvd24gd2hlbiBhIHN0b3JlIGlzIHBlcmZvcm1pbmcgYSByZW1vdGVcbiAgICAgKiBvcGVyYXRpb24sIG9yIENydWQgTWFuYWdlciBpcyBsb2FkaW5nIGRhdGEgZnJvbSB0aGUgc2V2ZXIuIFNldCB0byBgbnVsbGAgdG8gZGlzYWJsZSBkZWZhdWx0IGxvYWQgbWFzay5cbiAgICAgKi9cbiAgICBsb2FkTWFzayA/IDogc3RyaW5nfE1hc2tDb25maWd8bnVsbFxuICAgIC8qKlxuICAgICAqIEEgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0IHRvIGFkanVzdCB0aGUgW21hc2tEZWZhdWx0c10oI0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctbWFza0RlZmF1bHRzKVxuICAgICAqIHdoZW4gZGF0YSBpcyBsb2FkaW5nLiBUaGUgbWVzc2FnZSBhbmQgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBmcm9tIHRoZVxuICAgICAqIFtsb2FkTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvbWl4aW4vTG9hZE1hc2thYmxlI2NvbmZpZy1sb2FkTWFzaykgY29uZmlnIHRha2UgcHJpb3JpdHkgb3ZlciB0aGVzZSBvcHRpb25zLCBqdXN0IGFzIHRoZXkgZG9cbiAgICAgKiBmb3IgYG1hc2tEZWZhdWx0c2AsIHJlc3BlY3RpdmVseS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1sb2FkTWFza0RlZmF1bHRzKVxuICAgICAqL1xuICAgIGxvYWRNYXNrRGVmYXVsdHMgPyA6IE1hc2tDb25maWdcbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY29uZmlnIG9iamVjdCB0byBhZGp1c3QgdGhlIFttYXNrRGVmYXVsdHNdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1hc2tEZWZhdWx0cylcbiAgICAgKiB3aGVuIGFuIGVycm9yIG9jY3VycyBsb2FkaW5nIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctbG9hZE1hc2tFcnJvcilcbiAgICAgKi9cbiAgICBsb2FkTWFza0Vycm9yID8gOiBNYXNrQ29uZmlnfE1hc2t8Ym9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIGRpc2FibGUgbG9jYWxpemF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgICAqL1xuICAgIGxvY2FsaXphYmxlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGltZSBpbiBtcyB1bnRpbCBhIGxvbmdwcmVzcyBpcyB0cmlnZ2VyZWRcbiAgICAgKi9cbiAgICBsb25nUHJlc3NUaW1lID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBXaWRnZXQncyBtYXJnaW4uIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYSBzaW5nbGUgbnVtYmVyIG9yIGEgYFRSQkxgIGZvcm1hdCBzdHJpbmcuXG4gICAgICogbnVtZXJpYy1vbmx5IHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgcGl4ZWxzLlxuICAgICAqL1xuICAgIG1hcmdpbiA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEdyaWRzIGNoYW5nZSB0aGUgYG1hc2tEZWZhdWx0c2AgdG8gY292ZXIgb25seSB0aGVpciBgYm9keWAgZWxlbWVudC5cbiAgICAgKi9cbiAgICBtYXNrRGVmYXVsdHMgPyA6IE1hc2tDb25maWdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGFwcGx5IHRoZSBkZWZhdWx0IG1hc2sgdG8gdGhlIHdpZGdldC4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgdGhlIG1hc2sgbWVzc2FnZSBvciBhXG4gICAgICogW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIG1hc2tlZCA/IDogYm9vbGVhbnxzdHJpbmd8TWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50J3MgbWF4SGVpZ2h0LiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW2hlaWdodF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaGVpZ2h0KSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWF4SGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnRzIG1heFdpZHRoLiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW3dpZHRoXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1heFdpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogR3JpZCdzIGBtaW4taGVpZ2h0YC4gRGVmYXVsdHMgdG8gYDEwZW1gIHRvIGJlIHN1cmUgdGhhdCB0aGUgR3JpZCBhbHdheXMgaGFzIGEgaGVpZ2h0IHdoZXJldmVyIGl0IGlzXG4gICAgICogaW5zZXJ0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctbWluSGVpZ2h0KVxuICAgICAqL1xuICAgIG1pbkhlaWdodCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50cyBtaW5XaWR0aC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFt3aWR0aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctd2lkdGgpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtaW5XaWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIEdyaWQgbW9uaXRvcnMgd2luZG93IHJlc2l6ZSBieSBkZWZhdWx0LlxuICAgICAqL1xuICAgIG1vbml0b3JSZXNpemUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgb3duaW5nIFdpZGdldCBvZiB0aGlzIFdpZGdldC4gSWYgdGhpcyBXaWRnZXQgaXMgZGlyZWN0bHkgY29udGFpbmVkICh0aGF0IGlzLCBpdCBpcyBvbmUgb2YgdGhlXG4gICAgICogW2l0ZW1zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI3Byb3BlcnR5LWl0ZW1zKSBvZiBhIENvbnRhaW5lciksIHRoaXMgY29uZmlnIHdpbGwgYmUgaWdub3JlZC4gSW4gdGhpcyBjYXNlXG4gICAgICogdGhlIG93bmVyIGlzIDxzdHJvbmc+YWx3YXlzPC9zdHJvbmc+IHRoZSBlbmNhcHN1bGF0aW5nIENvbnRhaW5lci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1vd25lcilcbiAgICAgKi9cbiAgICBvd25lciA/IDogV2lkZ2V0fGFueVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgcGx1Z2lucyAoYW4gYXJyYXkgb2YgY2xhc3NlcykgaW4gY29uZmlnXG4gICAgICovXG4gICAgcGx1Z2lucyA/IDogRnVuY3Rpb25bXVxuICAgIC8qKlxuICAgICAqIFRydWUgdG8gcHJlc2VydmUgZm9jdXNlZCBjZWxsIGFmdGVyIGxvYWRpbmcgbmV3IGRhdGFcbiAgICAgKi9cbiAgICBwcmVzZXJ2ZUZvY3VzT25EYXRhc2V0Q2hhbmdlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogUHJlc2VydmUgdGhlIGdyaWQncyB2ZXJ0aWNhbCBzY3JvbGwgcG9zaXRpb24gd2hlbiBjaGFuZ2VzZXRzIGFyZSBhcHBsaWVkLCBhcyBpbiB0aGUgY2FzZSBvZiByZW1vdGVcbiAgICAgKiBjaGFuZ2VzLCBvciB3aGVuIHN0b3JlcyBhcmUgY29uZmlndXJlZCB3aXRoIFtzeW5jRGF0YU9uTG9hZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvZGF0YS9TdG9yZSNjb25maWctc3luY0RhdGFPbkxvYWQpLlxuICAgICAqL1xuICAgIHByZXNlcnZlU2Nyb2xsID8gOiBQcmVzZXJ2ZVNjcm9sbE9wdGlvbnN8Ym9vbGVhblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYHRydWVgIHRvIHByZXNlcnZlIHZlcnRpY2FsIHNjcm9sbCBwb3NpdGlvbiBhZnRlciBzdG9yZSBhY3Rpb25zIHRoYXQgdHJpZ2dlciBhIGByZWZyZXNoYCBldmVudCxcbiAgICAgKiBzdWNoIGFzIGxvYWRpbmcgbmV3IGRhdGEgYW5kIGZpbHRlcmluZy5cbiAgICAgKi9cbiAgICBwcmVzZXJ2ZVNjcm9sbE9uRGF0YXNldENoYW5nZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFByZXZlbnQgdG9vbHRpcCBmcm9tIGJlaW5nIGRpc3BsYXllZCBvbiB0b3VjaCBkZXZpY2VzLiBVc2VmdWwgZm9yIGV4YW1wbGUgZm9yIGJ1dHRvbnMgdGhhdCBkaXNwbGF5IGFcbiAgICAgKiBtZW51IG9uIGNsaWNrIGV0Yywgc2luY2UgdGhlIHRvb2x0aXAgd291bGQgYmUgZGlzcGxheWVkIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgICovXG4gICAgcHJldmVudFRvb2x0aXBPblRvdWNoID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBtYWtlIHRoZSBncmlkIHJlYWQtb25seSwgYnkgZGlzYWJsaW5nIGFueSBVSXMgZm9yIG1vZGlmeWluZyBkYXRhLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLXJlYWRPbmx5KVxuICAgICAqL1xuICAgIHJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgcmVsYXlTdG9yZUV2ZW50cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIGRlZmF1bHQgYHJlbmRpdGlvbmAgdG8gYXBwbHkgdG8gYWxsIGNoaWxkIHdpZGdldHMsIG9yIGEgbWFwIG9mIHJlbmRpdGlvbnMga2V5ZWQgYnkgY2hpbGQgd2lkZ2V0XG4gICAgICogYHR5cGVgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLXJlbmRpdGlvbilcbiAgICAgKi9cbiAgICByZW5kaXRpb24gPyA6IHN0cmluZ3xSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fG51bGxcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgdGhpcyBwcm9wZXJ0eSB0byBhbGxvdyB0aGUgd2lkZ2V0L2NvbXBvbmVudCB0byBiZSByZXNpemVkLiBQcmVzc2luZyA8a2JkPlNoaWZ0PC9rYmQ+IHdoaWxlIHJlc2l6aW5nIHdpbGxcbiAgICAgKiBjb25zdHJhaW4gdGhlIGFzcGVjdCByYXRpby5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1yZXNpemFibGUpXG4gICAgICovXG4gICAgcmVzaXphYmxlID8gOiBib29sZWFufHtcbiAgICAgICAgbWluV2lkdGg/OiBudW1iZXJcbiAgICAgICAgbWF4V2lkdGg/OiBudW1iZXJcbiAgICAgICAgbWluSGVpZ2h0PzogbnVtYmVyXG4gICAgICAgIG1heEhlaWdodD86IG51bWJlclxuICAgICAgICBoYW5kbGVzPzogb2JqZWN0XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG9ubHkgbWVhc3VyZSBjZWxsIGNvbnRlbnRzIHdoZW4gZG91YmxlLWNsaWNraW5nIHRoZSBlZGdlIGJldHdlZW4gY29sdW1uIGhlYWRlcnMuXG4gICAgICovXG4gICAgcmVzaXplVG9GaXRJbmNsdWRlc0hlYWRlciA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFwiQnJlYWsgcG9pbnRzXCIgZm9yIHdoaWNoIHJlc3BvbnNpdmUgY29uZmlnIHRvIHVzZSBmb3IgY29sdW1ucyBhbmQgY3NzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLXJlc3BvbnNpdmVMZXZlbHMpXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZUxldmVscyA/IDogUmVjb3JkPHN0cmluZywgbnVtYmVyfHN0cmluZ3xSZXNwb25zaXZlTGV2ZWxDb25maWc+XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBoYXZlIHRoZSBjb21wb25lbnQgZGlzcGxheSBhIHRyYW5zbHVjZW50IHJpcHBsZSB3aGVuIGl0c1xuICAgICAqIFtmb2N1c0VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZm9jdXNFbGVtZW50KSwgb3IgW2VsZW1lbnRdKCNDb3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkgaXMgdGFwcGVkIDxlbT5pZiB0aGVcbiAgICAgKiBjdXJyZW50IHRoZW1lIHN1cHBvcnRzIHJpcHBsZXM8L2VtPi4gT3V0IG9mIHRoZSBib3gsIG9ubHkgdGhlIE1hdGVyaWFsIHRoZW1lIHN1cHBvcnRzIHJpcHBsZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctcmlwcGxlKVxuICAgICAqL1xuICAgIHJpcHBsZSA/IDogYm9vbGVhbnx7XG4gICAgICAgIGRlbGVnYXRlPzogc3RyaW5nXG4gICAgICAgIGNvbG9yPzogc3RyaW5nXG4gICAgICAgIHJhZGl1cz86IG51bWJlclxuICAgICAgICBjbGlwPzogc3RyaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHlvdSBhcmUgcmVuZGVyaW5nIHRoaXMgd2lkZ2V0IHRvIGEgc2hhZG93IHJvb3QgaW5zaWRlIGEgd2ViIGNvbXBvbmVudCwgc2V0IHRoaXMgY29uZmlnIHRvIHRoZSBzaGFkb3dSb290LiBJZiBub3QgaW5zaWRlIGEgd2ViIGNvbXBvbmVudCwgc2V0IGl0IHRvIGBkb2N1bWVudC5ib2R5YFxuICAgICAqL1xuICAgIHJvb3RFbGVtZW50ID8gOiBTaGFkb3dSb290fEhUTUxFbGVtZW50XG4gICAgLyoqXG4gICAgICogUm93IGhlaWdodCBpbiBwaXhlbHMuIFRoaXMgYWxsb3dzIHRoZSBkZWZhdWx0IGhlaWdodCBmb3Igcm93cyB0byBiZSBjb250cm9sbGVkLiBOb3RlIHRoYXQgaXQgbWF5IGJlXG4gICAgICogb3ZlcnJpZGVuIGJ5IHNwZWNpZnlpbmcgYSBbcm93SGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9kYXRhL0dyaWRSb3dNb2RlbCNmaWVsZC1yb3dIZWlnaHQpIG9uIGEgcGVyIHJlY29yZCBiYXNpcywgb3IgZnJvbVxuICAgICAqIGEgY29sdW1uIFtyZW5kZXJlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvY29sdW1uL0NvbHVtbiNjb25maWctcmVuZGVyZXIpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLXJvd0hlaWdodClcbiAgICAgKi9cbiAgICByb3dIZWlnaHQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBzaG93IHJvdyBsaW5lcy4gRW5kIHJlc3VsdCBtaWdodCBiZSBvdmVycnVsZWQgYnkvZGlmZmVyIGJldHdlZW4gdGhlbWVzLlxuICAgICAqL1xuICAgIHJvd0xpbmVzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhpcyBtYXkgYmUgY29uZmlndXJlZCBhcyBgdHJ1ZWAgdG8gbWFrZSB0aGUgd2lkZ2V0J3MgZWxlbWVudCB1c2UgdGhlIGBkaXJlY3Rpb246cnRsYCBzdHlsZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1ydGwpXG4gICAgICovXG4gICAgcnRsID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB3aGV0aGVyIHRoZSBncmlkIGlzIHNjcm9sbGFibGUgaW4gdGhlIGBZYCBheGlzLiBUaGlzIGlzIHVzZWQgdG8gY29uZmlndXJlIGEgW1Njcm9sbGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9oZWxwZXIvdXRpbC9TY3JvbGxlcikuXG4gICAgICogU2VlIHRoZSBbc2Nyb2xsZXJDbGFzc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctc2Nyb2xsZXJDbGFzcykgY29uZmlnIG9wdGlvbi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1zY3JvbGxhYmxlKVxuICAgICAqL1xuICAgIHNjcm9sbGFibGUgPyA6IGJvb2xlYW58U2Nyb2xsZXJDb25maWd8U2Nyb2xsZXJcbiAgICAvKipcbiAgICAgKiBUaGUgY2xhc3MgdG8gaW5zdGFudGlhdGUgdG8gdXNlIGFzIHRoZSBbc2Nyb2xsYWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctc2Nyb2xsYWJsZSkuIERlZmF1bHRzIHRvIFtTY3JvbGxlcl0oI0NvcmUvaGVscGVyL3V0aWwvU2Nyb2xsZXIpLlxuICAgICAqL1xuICAgIHNjcm9sbGVyQ2xhc3MgPyA6IHR5cGVvZiBTY3JvbGxlclxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gdmFsdWVzIGZvciB0aGUgW1Njcm9sbE1hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3V0aWwvU2Nyb2xsTWFuYWdlcikgY2xhc3Mgb24gaW5pdGlhbGl6YXRpb24uIFJldHVybnMgdGhlXG4gICAgICogW1Njcm9sbE1hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3V0aWwvU2Nyb2xsTWFuYWdlcikgYXQgcnVudGltZS5cbiAgICAgKi9cbiAgICBzY3JvbGxNYW5hZ2VyID8gOiBTY3JvbGxNYW5hZ2VyQ29uZmlnfFNjcm9sbE1hbmFnZXJcbiAgICAvKipcbiAgICAgKiBTZWxlY3Rpb24gY29uZmlndXJhdGlvbiBzZXR0aW5ncywgY2hhbmdlIHRoZXNlIHByb3BlcnRpZXMgdG8gY29udHJvbCBob3cgc2VsZWN0aW9uIHdvcmtzIGFuZCB3aGF0IGNhbiBiZVxuICAgICAqIHNlbGVjdGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLXNlbGVjdGlvbk1vZGUpXG4gICAgICovXG4gICAgc2VsZWN0aW9uTW9kZSA/IDogR3JpZFNlbGVjdGlvbk1vZGVcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIGhhdmUgdGhlIGdyaWQgc2hvdyBhIHJlZCBcImNoYW5nZWRcIiB0YWcgaW4gY2VsbHMgd2hvc2VcbiAgICAgKiBmaWVsZCB2YWx1ZSBoYXMgY2hhbmdlZCBhbmQgbm90IHlldCBiZWVuIGNvbW1pdHRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1zaG93RGlydHkpXG4gICAgICovXG4gICAgc2hvd0RpcnR5ID8gOiBib29sZWFufHtcbiAgICAgICAgZHVyaW5nRWRpdD86IGJvb2xlYW5cbiAgICAgICAgbmV3UmVjb3JkPzogYm9vbGVhblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9ncmFtbWF0aWMgY29udHJvbCBvdmVyIGhvdyBtYW55IGNvbHVtbnMgdG8gc3BhbiB3aGVuIHVzZWQgaW4gYSBncmlkIGxheW91dC5cbiAgICAgKi9cbiAgICBzcGFuID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGlzIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1zdGF0ZWZ1bClcbiAgICAgKi9cbiAgICBzdGF0ZWZ1bCA/IDogYm9vbGVhbnxvYmplY3R8c3RyaW5nW11cbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnRzIHRoYXQsIHdoZW4gZmlyZWQgYnkgdGhpcyBjb21wb25lbnQsIHNob3VsZCB0cmlnZ2VyIGl0IHRvIHNhdmUgaXRzIHN0YXRlIGJ5IGNhbGxpbmdcbiAgICAgKiBbc2F2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNmdW5jdGlvbi1zYXZlU3RhdGUpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLXN0YXRlZnVsRXZlbnRzKVxuICAgICAqL1xuICAgIHN0YXRlZnVsRXZlbnRzID8gOiBvYmplY3R8c3RyaW5nW11cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IHRvIHVzZSB3aGVuIHNhdmluZyB0aGlzIG9iamVjdCdzIHN0YXRlIGluIHRoZSBbc3RhdGVQcm92aWRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjY29uZmlnLXN0YXRlUHJvdmlkZXIpLiBJZiB0aGlzIGNvbmZpZyBpc1xuICAgICAqIG5vdCBhc3NpZ25lZCwgYW5kIFtzdGF0ZWZ1bF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjY29uZmlnLXN0YXRlZnVsKSBpcyBub3Qgc2V0IHRvIGBmYWxzZWAsIHRoZSBbaWRdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWlkKVxuICAgICAqIChpZiBleHBsaWNpdGx5IHNwZWNpZmllZCkgd2lsbCBiZSB1c2VkIGFzIHRoZSBgc3RhdGVJZGAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctc3RhdGVJZClcbiAgICAgKi9cbiAgICBzdGF0ZUlkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgYFN0YXRlUHJvdmlkZXJgIHRvIHVzZSB0byBzYXZlIGFuZCByZXN0b3JlIHRoaXMgb2JqZWN0J3MgW3N0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNwcm9wZXJ0eS1zdGF0ZSkuIEJ5IGRlZmF1bHQsIGBzdGF0ZWBcbiAgICAgKiB3aWxsIGJlIHNhdmVkIHVzaW5nIHRoZSBbZGVmYXVsdCBzdGF0ZSBwcm92aWRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvc3RhdGUvU3RhdGVQcm92aWRlciNwcm9wZXJ0eS1pbnN0YW5jZS1zdGF0aWMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLXN0YXRlUHJvdmlkZXIpXG4gICAgICovXG4gICAgc3RhdGVQcm92aWRlciA/IDogU3RhdGVQcm92aWRlclxuICAgIC8qKlxuICAgICAqIFRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgc2V0dGluZ3Mgb2JqZWN0IGNvbnRyb2xzIGhvdyBncmlkIGlzIHJlc3RvcmVkIGZyb20gc3RhdGUgZGF0YS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1zdGF0ZVNldHRpbmdzKVxuICAgICAqL1xuICAgIHN0YXRlU2V0dGluZ3MgPyA6IHtcbiAgICAgICAgcmVzdG9yZVVuY29uZmlndXJlZENvbHVtbnM/OiBib29sZWFuXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0b3JlIHRoYXQgaG9sZHMgcmVjb3JkcyB0byBkaXNwbGF5IGluIHRoZSBncmlkLCBvciBhIHN0b3JlIGNvbmZpZyBvYmplY3QuIElmIHRoZSBjb25maWd1cmF0aW9uIGNvbnRhaW5zXG4gICAgICogYSBgcmVhZFVybGAsIGFuIGBBamF4U3RvcmVgIHdpbGwgYmUgY3JlYXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1zdG9yZSlcbiAgICAgKi9cbiAgICBzdG9yZSA/IDogU3RvcmV8U3RvcmVDb25maWd8QWpheFN0b3JlfEFqYXhTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBjb250YWluaW5nIHdpZGdldHMga2V5ZWQgYnkgbmFtZS4gQnkgZGVmYXVsdCAod2hlbiBubyBgdHlwZWAgaXMgZ2l2ZW4pLCBzdHJpcHMgYXJlXG4gICAgICogW3Rvb2xiYXJzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbGJhcikuIElmIHlvdSB3YW50IHRvIHBhc3MgYW4gYXJyYXksIHlvdSBjYW4gdXNlXG4gICAgICogdGhlIHRvb2xiYXIncyBbaXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjY29uZmlnLWl0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy1zdHJpcHMpXG4gICAgICovXG4gICAgc3RyaXBzID8gOiBSZWNvcmQ8c3RyaW5nLCBHcmlkQ29udGFpbmVySXRlbUNvbmZpZz5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBzdWIgZ3JpZCBjb25maWd1cmF0aW9uIG9iamVjdHMga2V5ZWQgYnkgYSBgcmVnaW9uYCBwcm9wZXJ0eS5cbiAgICAgKiBCeSBkZWZhdWx0LCBncmlkIGhhcyBhICdsb2NrZWQnIHJlZ2lvbiAoaWYgY29uZmlndXJlZCB3aXRoIGxvY2tlZCBjb2x1bW5zKSBhbmQgYSAnbm9ybWFsJyByZWdpb24uXG4gICAgICogVGhlICdub3JtYWwnIHJlZ2lvbiBkZWZhdWx0cyB0byB1c2UgYGZsZXg6IDFgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLXN1YkdyaWRDb25maWdzKVxuICAgICAqL1xuICAgIHN1YkdyaWRDb25maWdzID8gOiBSZWNvcmQ8c3RyaW5nLCBTdWJHcmlkQ29uZmlnPlxuICAgIC8qKlxuICAgICAqIEEgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LCBvciBhIG1lc3NhZ2UgdG8gYmUgc2hvd24gd2hlbiBDcnVkIE1hbmFnZXJcbiAgICAgKiBpcyBwZXJzaXN0aW5nIGNoYW5nZXMgb24gdGhlIHNlcnZlci4gU2V0IHRvIGBudWxsYCB0byBkaXNhYmxlIGRlZmF1bHQgc3luYyBtYXNrLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLXN5bmNNYXNrKVxuICAgICAqL1xuICAgIHN5bmNNYXNrID8gOiBzdHJpbmd8TWFza0NvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogQSBjb25maWd1cmF0aW9uIGZvciB0aGUgW3RhYl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYikgY3JlYXRlZCBmb3IgdGhpcyB3aWRnZXQgd2hlbiBpdCBpcyBwbGFjZWQgaW4gYVxuICAgICAqIFtUYWJQYW5lbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYlBhbmVsKS4gRm9yIGV4YW1wbGUsIHRoaXMgY29uZmlnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGljb24gb2YgdGhlIGB0YWJgIGZvclxuICAgICAqIHRoaXMgd2lkZ2V0OlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLXRhYilcbiAgICAgKi9cbiAgICB0YWIgPyA6IGJvb2xlYW58VGFiQ29uZmlnXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIGNvbnRhaW5lciBpcyB1c2VkIGFzIGEgdGFiIGluIGEgVGFiUGFuZWwsIHRoZXNlIGl0ZW1zIGFyZSBhZGRlZCB0byB0aGVcbiAgICAgKiBbVGFiQmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVGFiQmFyKSB3aGVuIHRoaXMgY29udGFpbmVyIGlzIHRoZSBhY3RpdmUgdGFiLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLXRhYkJhckl0ZW1zKVxuICAgICAqL1xuICAgIHRhYkJhckl0ZW1zID8gOiBUb29sYmFySXRlbXNbXXxXaWRnZXRbXVxuICAgIC8qKlxuICAgICAqIEEgQ29uZmlnIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBbVG9vbGJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1Rvb2xiYXIpLFxuICAgICAqIG9yIGFycmF5IG9mIGNvbmZpZyBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgY2hpbGQgaXRlbXMgb2YgYSBUb29sYmFyLlxuICAgICAqIFRoaXMgY3JlYXRlcyBhIHRvb2xiYXIgZG9ja2VkIHRvIHRoZSB0b3Agb2YgdGhlIHBhbmVsIGltbWVkaWF0ZWx5IGJlbG93IHRoZSBoZWFkZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctdGJhcilcbiAgICAgKi9cbiAgICB0YmFyID8gOiAoR3JpZENvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogQSB0aXRsZSB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIgb3Igb3duaW5nIFRhYlBhbmVsLiBDYXVzZXMgY3JlYXRpb24gYW5kIGRvY2tpbmcgb2YgYSBoZWFkZXJcbiAgICAgKiB0byB0aGUgdG9wIGlmIG5vIGhlYWRlciBpcyBjb25maWd1cmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjY29uZmlnLXRpdGxlKVxuICAgICAqL1xuICAgIHRpdGxlID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgW3Rvb2xzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbCkgdG8gYWRkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGB0aXRsZWAgaW4gdGhlIFBhbmVsIGhlYWRlci4gRWFjaFxuICAgICAqIHByb3BlcnR5IG5hbWUgaXMgdGhlIHJlZmVyZW5jZSBieSB3aGljaCBhbiBpbnN0YW50aWF0ZWQgdG9vbCBtYXkgYmUgcmV0cmlldmVkIGZyb20gdGhlIGxpdmVcbiAgICAgKiBgW3Rvb2xzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vVG9vbGFibGUjcHJvcGVydHktdG9vbHMpYCBwcm9wZXJ0eS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2NvbmZpZy10b29scylcbiAgICAgKi9cbiAgICB0b29scyA/IDogUmVjb3JkPHN0cmluZywgVG9vbENvbmZpZz58bnVsbFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBVSSB0cmFuc2l0aW9ucyBmb3IgdmFyaW91cyBhY3Rpb25zIGluIHRoZSBncmlkLlxuICAgICAqL1xuICAgIHRyYW5zaXRpb24gPyA6IHtcbiAgICAgICAgaW5zZXJ0UmVjb3JkPzogYm9vbGVhblxuICAgICAgICByZW1vdmVSZWNvcmQ/OiBib29sZWFuXG4gICAgICAgIHRvZ2dsZUNvbHVtbj86IGJvb2xlYW5cbiAgICAgICAgZXhwYW5kQ29sbGFwc2VDb2x1bW4/OiBib29sZWFuXG4gICAgICAgIHRvZ2dsZVJlZ2lvbj86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlVHJlZU5vZGU/OiBib29sZWFuXG4gICAgICAgIHRvZ2dsZUdyb3VwPzogYm9vbGVhblxuICAgICAgICBmaWx0ZXJSZW1vdmFsPzogYm9vbGVhblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbmltYXRpb24gdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gICAgICovXG4gICAgdHJhbnNpdGlvbkR1cmF0aW9uID8gOiBudW1iZXJcbiAgICB0eXBlID8gOiAnZ3JpZCdcbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzIG5hbWUgc3VmZml4ZXMgdG8gYXBwbHkgdG8gdGhlIGVsZW1lbnRzIHJlbmRlcmVkIGJ5IHRoaXMgd2lkZ2V0LiBUaGlzIG1heSBiZSBzcGVjaWZpZWRcbiAgICAgKiBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIGFuIGFycmF5IG9mIHN0cmluZ3MsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lcyB3aXRoIHRydXRoeVxuICAgICAqIHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNjb25maWctdWkpXG4gICAgICovXG4gICAgdWkgPyA6ICdwbGFpbid8J3Rvb2xiYXInfHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBBIHdpZGdldHMgd2VpZ2h0IGRldGVybWluZXMgaXRzIHBvc2l0aW9uIGFtb25nIHNpYmxpbmdzIHdoZW4gYWRkZWQgdG8gYSBbQ29udGFpbmVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKS5cbiAgICAgKiBIaWdoZXIgd2VpZ2h0cyBnbyBmdXJ0aGVyIGRvd24uXG4gICAgICovXG4gICAgd2VpZ2h0ID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBXaWRnZXQncyB3aWR0aCwgdXNlZCB0byBzZXQgZWxlbWVudCBgc3R5bGUud2lkdGhgLiBFaXRoZXIgc3BlY2lmeSBhIHZhbGlkIHdpZHRoIHN0cmluZyBvciBhIG51bWJlciwgd2hpY2hcbiAgICAgKiB3aWxsIGdldCAncHgnIGFwcGVuZGVkLiBXZSByZWNvbW1lbmQgdXNpbmcgQ1NTIGFzIHRoZSBwcmltYXJ5IHdheSB0byBjb250cm9sIHdpZHRoLCBidXQgaW4gc29tZSBjYXNlc1xuICAgICAqIHRoaXMgY29uZmlnIGlzIGNvbnZlbmllbnQuXG4gICAgICovXG4gICAgd2lkdGggPyA6IHN0cmluZ3xudW1iZXJcblxuICAgIC8vIEZlYXR1cmVzXG4gICAgLyoqXG4gICAgICogQUktcG93ZXJlZCBmaWx0ZXIgZmVhdHVyZSBmb3IgR3JpZC4gQWxsb3dzIHVzZXJzIHRvIHR5cGUgbmF0dXJhbCBsYW5ndWFnZSBxdWVyaWVzIHRvIGZpbHRlciBncmlkIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvYWkvQUlGaWx0ZXIpXG4gICAgICovXG4gICAgYWlGaWx0ZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8QUlGaWx0ZXJ8QUlGaWx0ZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBBbGxvd3MgdXNpbmcgYFtDdHJsL0NNRCArIENdYCwgYFtDdHJsL0NNRCArIFhdYCBhbmQgYFtDdHJsL0NNRCArIFZdYCB0byBjdXQsIGNvcHkgYW5kIHBhc3RlIGNlbGwgb3IgY2VsbCByYW5nZXMuIEFsc29cbiAgICAgKiBtYWtlcyBjdXQsIGNvcHkgYW5kIHBhc3RlIGFjdGlvbnMgYXZhaWxhYmxlIHZpYSB0aGUgY2VsbCBjb250ZXh0IG1lbnUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ2VsbENvcHlQYXN0ZSlcbiAgICAgKi9cbiAgICBjZWxsQ29weVBhc3RlRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENlbGxDb3B5UGFzdGV8Q2VsbENvcHlQYXN0ZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFkZGluZyB0aGlzIGZlYXR1cmUgdG8gdGhlIGdyaWQgYW5kIG90aGVyIEJyeW50dW0gcHJvZHVjdHMgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBHcmlkIChpLmUuIFNjaGVkdWxlciwgU2NoZWR1bGVyUHJvLCBhbmQgR2FudHQpXG4gICAgICogZW5hYmxlcyBjZWxsIGVkaXRpbmcuIEFueSBzdWJjbGFzcyBvZiBbRmllbGRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9GaWVsZCkgY2FuIGJlIHVzZWRcbiAgICAgKiBhcyBlZGl0b3IgZm9yIHRoZSBbQ29sdW1uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9jb2x1bW4vQ29sdW1uKS4gVGhlIG1vc3QgcG9wdWxhciBhcmU6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ2VsbEVkaXQpXG4gICAgICovXG4gICAgY2VsbEVkaXRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2VsbEVkaXR8Q2VsbEVkaXRDb25maWdcbiAgICAvKipcbiAgICAgKiBSaWdodCBjbGljayB0byBkaXNwbGF5IGNvbnRleHQgbWVudSBmb3IgY2VsbHMuIFRvIGludm9rZSB0aGUgY2VsbCBtZW51IGluIGEga2V5Ym9hcmQtYWNjZXNzaWJsZSBtYW5uZXIsIHVzZSB0aGVcbiAgICAgKiBgU1BBQ0VgIGtleSB3aGVuIHRoZSBjZWxsIGlzIGZvY3VzZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ2VsbE1lbnUpXG4gICAgICovXG4gICAgY2VsbE1lbnVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2VsbE1lbnV8Q2VsbE1lbnVDb25maWdcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIHRvb2x0aXAgd2hlbiBob3ZlcmluZyBjZWxscy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9DZWxsVG9vbHRpcClcbiAgICAgKi9cbiAgICBjZWxsVG9vbHRpcEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDZWxsVG9vbHRpcHxDZWxsVG9vbHRpcENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFkZHMgaW50ZXJhY3RpdmUgY2hhcnRpbmcgdG8gYSBHcmlkLiBbQ2hhcnRzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ2hhcnQvd2lkZ2V0L0NoYXJ0KSBjYW4gYmUgY3JlYXRlZCBmcm9tIGEgc2VsZWN0aW9uIG9mIEdyaWQgZGF0YVxuICAgICAqIGFuZCB1cGRhdGVkIGluIHJlYWx0aW1lIGFzIGRhdGEgY2hhbmdlcy4gU3VwcG9ydHMgbWFueSBjb21tb24gY2hhcnQgdHlwZXMgd2l0aCBleHRlbnNpdmUgc3R5bGluZyBhbmQgY3VzdG9taXphdGlvblxuICAgICAqIG9wdGlvbnMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ2hhcnRzKVxuICAgICAqL1xuICAgIGNoYXJ0c0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDaGFydHN8Q2hhcnRzQ29uZmlnXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB0aGUgW2F1dG9XaWR0aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvY29sdW1uL0NvbHVtbiNjb25maWctYXV0b1dpZHRoKSBjb25maWcgZm9yIGEgZ3JpZCdzIGNvbHVtbnMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ29sdW1uQXV0b1dpZHRoKVxuICAgICAqL1xuICAgIGNvbHVtbkF1dG9XaWR0aEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5BdXRvV2lkdGh8Q29sdW1uQXV0b1dpZHRoQ29uZmlnXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSB0b29sYmFyIHdoaWxlIGRyYWdnaW5nIGNvbHVtbiBoZWFkZXJzLiBEcm9wIG9uIGEgYnV0dG9uIGluIHRoZSB0b29sYmFyIHRvIGFjdGl2YXRlIGEgY2VydGFpbiBmdW5jdGlvbixcbiAgICAgKiBmb3IgZXhhbXBsZSB0byBncm91cCBieSB0aGF0IGNvbHVtbi4gVGhpcyBmZWF0dXJlIHNpbXBsaWZpZXMgY2VydGFpbiBvcGVyYXRpb25zIG9uIHRvdWNoIGRldmljZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ29sdW1uRHJhZ1Rvb2xiYXIpXG4gICAgICovXG4gICAgY29sdW1uRHJhZ1Rvb2xiYXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uRHJhZ1Rvb2xiYXJ8Q29sdW1uRHJhZ1Rvb2xiYXJDb25maWdcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIGNvbHVtbiBwaWNrZXIgKHRvIHNob3cvaGlkZSBjb2x1bW5zKSBpbiB0aGUgaGVhZGVyIGNvbnRleHQgbWVudS4gQ29sdW1ucyBjYW4gYmUgZGlzcGxheWVkIGluIHN1YiBtZW51c1xuICAgICAqIGJ5IHJlZ2lvbiBvciB0YWcuIEdyb3VwZWQgaGVhZGVycyBhcmUgZGlzcGxheWVkIGFzIG1lbnUgaGllcmFyY2hpZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ29sdW1uUGlja2VyKVxuICAgICAqL1xuICAgIGNvbHVtblBpY2tlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5QaWNrZXJ8Q29sdW1uUGlja2VyQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWxsb3dzIHVzZXIgdG8gcmVuYW1lIGNvbHVtbnMgYnkgZWl0aGVyIHJpZ2h0LWNsaWNraW5nIGNvbHVtbiBoZWFkZXIgb3IgdXNpbmcga2V5Ym9hcmQgc2hvcnRjdXRzIHdoZW4gY29sdW1uIGhlYWRlclxuICAgICAqIGlzIGZvY3VzZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ29sdW1uUmVuYW1lKVxuICAgICAqL1xuICAgIGNvbHVtblJlbmFtZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5SZW5hbWV8Q29sdW1uUmVuYW1lQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWxsb3dzIHVzZXIgdG8gcmVvcmRlciBjb2x1bW5zIGJ5IGRyYWdnaW5nIGhlYWRlcnMuIFRvIGdldCBub3RpZmllZCBhYm91dCBjb2x1bW4gcmVvcmRlciBsaXN0ZW4gdG8gYGNoYW5nZWAgZXZlbnRcbiAgICAgKiBvbiBbY29sdW1uc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZGF0YS9Db2x1bW5TdG9yZSkgc3RvcmUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ29sdW1uUmVvcmRlcilcbiAgICAgKi9cbiAgICBjb2x1bW5SZW9yZGVyRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblJlb3JkZXJ8Q29sdW1uUmVvcmRlckNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdXNlciB0byByZXNpemUgY29sdW1ucyBieSBkcmFnZ2luZyBhIGhhbmRsZSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBoZWFkZXIuIFRvIGdldCBub3RpZmllZCBhYm91dCBjb2x1bW5cbiAgICAgKiByZXNpemUgbGlzdGVuIHRvIGBjaGFuZ2VgIGV2ZW50IG9uIFtjb2x1bW5zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9kYXRhL0NvbHVtblN0b3JlKSBzdG9yZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Db2x1bW5SZXNpemUpXG4gICAgICovXG4gICAgY29sdW1uUmVzaXplRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblJlc2l6ZXxDb2x1bW5SZXNpemVDb25maWdcbiAgICAvKipcbiAgICAgKiBBIGZlYXR1cmUgdGhhdCBhbGxvd3MgZXhwb3J0aW5nIEdyaWQgZGF0YSB0byBFeGNlbCBvciBDU1Ygd2l0aG91dCBpbnZvbHZpbmcgdGhlIHNlcnZlci4gSXQgdXNlc1xuICAgICAqIFtUYWJsZUV4cG9ydGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC91dGlsL1RhYmxlRXhwb3J0ZXIpIGNsYXNzIGFzIGRhdGEgcHJvdmlkZXIsIDNyZCBwYXJ0eSBwcm92aWRlciB0byBnZW5lcmF0ZSBYTFMgZmlsZXMsIGFuZFxuICAgICAqIFtNaWNyb3NvZnQgWE1MIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvb2ZmaWNlL2RvY3VtZW50Zm9ybWF0Lm9wZW54bWwuc3ByZWFkc2hlZXQuYXNweCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvZXhwZXJpbWVudGFsL0V4Y2VsRXhwb3J0ZXIpXG4gICAgICovXG4gICAgZXhjZWxFeHBvcnRlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xFeGNlbEV4cG9ydGVyfEV4Y2VsRXhwb3J0ZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBBbiBleHBlcmltZW50YWwgZmVhdHVyZSB0aGF0IGxldHMgdXNlcnMgZHJvcCBmaWxlcyBvbiBhIFdpZGdldC4gVGhlIHdpZGdldCBmaXJlcyBhbiBldmVudCB3aGVuIGEgZmlsZSBpcyBkcm9wcGVkIG9udG8gaXQuXG4gICAgICogSW4gdGhlIGV2ZW50LCB5b3UgZ2V0IGFjY2VzcyB0byB0aGUgcmF3IGZpbGVzIGFzIHN0cmluZ3MsIHRoYXQgd2VyZSBwYXJzZWQgYnkgY2FsbGluZyBgcmVhZEFzQmluYXJ5U3RyaW5nYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9leHBlcmltZW50YWwvRmlsZURyb3ApXG4gICAgICovXG4gICAgZmlsZURyb3BGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RmlsZURyb3B8RmlsZURyb3BDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGlzIGZlYXR1cmUgYWRkcyBhIGZpbGwgaGFuZGxlIHRvIGEgR3JpZCByYW5nZSBzZWxlY3Rpb24sIHdoaWNoIHdoZW4gZHJhZ2dlZCwgZmlsbHMgdGhlIGNlbGxzIGJlaW5nIGRyYWdnZWQgb3ZlclxuICAgICAqIHdpdGggdmFsdWVzIGJhc2VkIG9uIHRoZSB2YWx1ZXMgaW4gdGhlIG9yaWdpbmFsIHNlbGVjdGVkIHJhbmdlLiBUaGlzIGlzIHNpbWlsYXIgdG8gZnVuY3Rpb25hbGl0eSBub3JtYWxseSBzZWVuIGluXG4gICAgICogdmFyaW91cyBzcHJlYWRzaGVldCBhcHBsaWNhdGlvbnMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvRmlsbEhhbmRsZSlcbiAgICAgKi9cbiAgICBmaWxsSGFuZGxlRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbGxIYW5kbGV8RmlsbEhhbmRsZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEZlYXR1cmUgdGhhdCBhbGxvd3MgZmlsdGVyaW5nIG9mIHRoZSBncmlkIGJ5IHNldHRpbmdzIGZpbHRlcnMgb24gY29sdW1ucy4gVGhlIGFjdHVhbCBmaWx0ZXJpbmcgaXMgZG9uZSBieSB0aGUgc3RvcmUuXG4gICAgICogRm9yIGluZm8gb24gcHJvZ3JhbW1hdGljYWxseSBoYW5kbGluZyBmaWx0ZXJzLCBzZWUgW1N0b3JlRmlsdGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9kYXRhL21peGluL1N0b3JlRmlsdGVyKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9GaWx0ZXIpXG4gICAgICovXG4gICAgZmlsdGVyRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbHRlcnxGaWx0ZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBGZWF0dXJlIHRoYXQgYWxsb3dzIGZpbHRlcmluZyBvZiB0aGUgZ3JpZCBieSBlbnRlcmluZyBmaWx0ZXJzIG9uIGNvbHVtbiBoZWFkZXJzLlxuICAgICAqIFRoZSBhY3R1YWwgZmlsdGVyaW5nIGlzIGRvbmUgYnkgdGhlIHN0b3JlLlxuICAgICAqIEZvciBpbmZvIG9uIHByb2dyYW1tYXRpY2FsbHkgaGFuZGxpbmcgZmlsdGVycywgc2VlIFtTdG9yZUZpbHRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvZGF0YS9taXhpbi9TdG9yZUZpbHRlcikuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvRmlsdGVyQmFyKVxuICAgICAqL1xuICAgIGZpbHRlckJhckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWx0ZXJCYXJ8RmlsdGVyQmFyQ29uZmlnXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyByZW5kZXJpbmcgYW5kIGhhbmRsaW5nIG9mIHJvdyBncm91cHMuIFRoZSBhY3R1YWwgZ3JvdXBpbmcgaXMgZG9uZSBpbiB0aGUgc3RvcmUsIGJ1dCB0cmlnZ2VyZWQgYnlcbiAgICAgKiA8a2JkPnNoaWZ0PC9rYmQ+ICsgY2xpY2tpbmcgaGVhZGVycywgb3IgYnkgdXNpbmcgdGhlIGNvbnRleHQgbWVudSwgb3IgYnkgdXNpbmcgdHdvIGZpbmdlciB0YXAgKG9uZSBvbiBoZWFkZXIsXG4gICAgICogb25lIGFueXdoZXJlIG9uIGdyaWQpLiBVc2UgPGtiZD5zaGlmdDwva2JkPiArIDxrYmQ+YWx0PC9rYmQ+ICsgY2xpY2ssIG9yIHRoZSBjb250ZXh0IG1lbnUsIHRvIHJlbW92ZSBhIGNvbHVtblxuICAgICAqIGdyb3VwZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvR3JvdXApXG4gICAgICovXG4gICAgZ3JvdXBGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JvdXB8R3JvdXBDb25maWdcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIHN1bW1hcnkgcm93IGFzIGEgZ3JvdXAgZm9vdGVyIGluIGEgZ3JvdXBlZCBncmlkLiBVc2VzIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvbiBjb2x1bW5zIGFzXG4gICAgICogW1N1bW1hcnldKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvU3VtbWFyeSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvR3JvdXBTdW1tYXJ5KVxuICAgICAqL1xuICAgIGdyb3VwU3VtbWFyeUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xHcm91cFN1bW1hcnl8R3JvdXBTdW1tYXJ5Q29uZmlnXG4gICAgLyoqXG4gICAgICogUmlnaHQgY2xpY2sgY29sdW1uIGhlYWRlciBvciBmb2N1cyBpdCBhbmQgcHJlc3MgU1BBQ0Uga2V5IHRvIHNob3cgdGhlIGNvbnRleHQgbWVudSBmb3IgaGVhZGVycy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9IZWFkZXJNZW51KVxuICAgICAqL1xuICAgIGhlYWRlck1lbnVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8SGVhZGVyTWVudXxIZWFkZXJNZW51Q29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIGFsbG93cyByZWNvcmRzIHdoaWNoIHNhdGlzZnkgYSBjZXJ0YWluIGNvbmRpdGlvbiB0byBiZSBsb2NrZWQgYXQgdGhlIHRvcCBvZiB0aGUgZ3JpZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Mb2NrUm93cylcbiAgICAgKi9cbiAgICBsb2NrUm93c0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xMb2NrUm93c3xMb2NrUm93c0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmVhdHVyZSBtZXJnZXMgY2VsbHMgdGhhdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGluIHNvcnRlZCAob3IgW29wdGlvbmFsbHldKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvTWVyZ2VDZWxscyNjb25maWctc29ydGVkT25seSkgYW55KSBjb2x1bW5zXG4gICAgICogY29uZmlndXJlZCB0byBbbWVyZ2VDZWxsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvY29sdW1uL0NvbHVtbiNjb25maWctbWVyZ2VDZWxscykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvTWVyZ2VDZWxscylcbiAgICAgKi9cbiAgICBtZXJnZUNlbGxzRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfE1lcmdlQ2VsbHN8TWVyZ2VDZWxsc0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBQREYvUE5HIGZpbGVzIGZyb20gdGhlIEdyaWQgY29tcG9uZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL2V4cG9ydC9QZGZFeHBvcnQpXG4gICAgICovXG4gICAgcGRmRXhwb3J0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFBkZkV4cG9ydHxQZGZFeHBvcnRDb25maWdcbiAgICAvKipcbiAgICAgKiBBbGxvd3MgcGlubmluZyBjb2x1bW5zIHRvIHRoZSBzdGFydCBvciBlbmQgcmVnaW9uIG9mIHRoZSBncmlkIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgc3ViR3JpZCBjb25maWd1cmF0aW9ucy5cbiAgICAgKiBXaGVuIHBpbm5pbmcgdG8gYSByZWdpb24gdGhhdCBkb2VzIG5vdCB5ZXQgZXhpc3QsIHRoZSBmZWF0dXJlIGNyZWF0ZXMgdGhlIHJlcXVpcmVkIHN1YkdyaWQgb24gdGhlIGZseS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9QaW5Db2x1bW5zKVxuICAgICAqL1xuICAgIHBpbkNvbHVtbnNGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8UGluQ29sdW1uc3xQaW5Db2x1bW5zQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWxsb3dzIHByaW50aW5nIEdyaWQgY29udGVudHMgdXNpbmcgYnJvd3NlciBwcmludCBkaWFsb2cuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvZXhwb3J0L1ByaW50KVxuICAgICAqL1xuICAgIHByaW50RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFByaW50fFByaW50Q29uZmlnXG4gICAgLyoqXG4gICAgICogRmVhdHVyZSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBzZWFyY2ggaW4gYSBjb2x1bW4gYnkgZm9jdXNpbmcgYSBjZWxsIGFuZCB0eXBpbmcuIE5hdmlnYXRlIGJldHdlZW4gaGl0cyB1c2luZyB0aGVcbiAgICAgKiBrZXlib2FyZCwgW2YzXSBvciBbY3RybF0vW2NtZF0gKyBbZ10gbW92ZXMgdG8gbmV4dCwgYWxzbyBwcmVzc2luZyBbc2hpZnRdIG1vdmVzIHRvIHByZXZpb3VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1F1aWNrRmluZClcbiAgICAgKi9cbiAgICBxdWlja0ZpbmRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8UXVpY2tGaW5kfFF1aWNrRmluZENvbmZpZ1xuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBzcGxpdHRlciBiZXR3ZWVuIGdyaWQgW3NlY3Rpb25zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L1N1YkdyaWQpIGRyYWdnYWJsZSwgdG8gbGV0IHVzZXJzIHJlc2l6ZSwgYW5kXG4gICAgICogY29sbGFwc2UvZXhwYW5kIHRoZSBzZWN0aW9ucy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9SZWdpb25SZXNpemUpXG4gICAgICovXG4gICAgcmVnaW9uUmVzaXplRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJlZ2lvblJlc2l6ZXxSZWdpb25SZXNpemVDb25maWdcbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2luZyBbQ3RybC9DTUQgKyBDL1hdIGFuZCBbQ3RybC9DTUQgKyBWXSB0byBjb3B5L2N1dC1hbmQtcGFzdGUgcm93cy4gQWxzbyBtYWtlcyBjdXQsIGNvcHkgYW5kIHBhc3RlIGFjdGlvbnNcbiAgICAgKiBhdmFpbGFibGUgdmlhIHRoZSBjZWxsIGNvbnRleHQgbWVudS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Sb3dDb3B5UGFzdGUpXG4gICAgICovXG4gICAgcm93Q29weVBhc3RlRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd0NvcHlQYXN0ZXxSb3dDb3B5UGFzdGVDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGlzIGZlYXR1cmUgYWxsb3dzIGVkaXRpbmcgb2YgZW50aXJlIHJvd3MgaW4gYSBncmlkIGluIGEgZG9ja2VkIHBhbmVsIHdoaWNoIGJ5IGRlZmF1bHQgc2xpZGVzIG91dCBmcm9tIHRoZSByaWdodC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Sb3dFZGl0KVxuICAgICAqL1xuICAgIHJvd0VkaXRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Um93RWRpdHxSb3dFZGl0Q29uZmlnXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBleHBhbmRpbmcgb2YgR3JpZCByb3dzIGJ5IGVpdGhlciByb3cgY2xpY2sgb3IgZG91YmxlIGNsaWNrLCBvciBieSBhZGRpbmcgYSBzZXBhcmF0ZSBHcmlkIGNvbHVtbiB3aGljaCByZW5kZXJzXG4gICAgICogYSBidXR0b24gdGhhdCBleHBhbmRzIG9yIGNvbGxhcHNlcyB0aGUgcm93LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1Jvd0V4cGFuZGVyKVxuICAgICAqL1xuICAgIHJvd0V4cGFuZGVyRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd0V4cGFuZGVyfFJvd0V4cGFuZGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWxsb3dzIHVzZXIgdG8gcmVvcmRlciByb3dzIGJ5IGRyYWdnaW5nIHRoZW0uIFRvIGdldCBub3RpZmllZCBhYm91dCByb3cgcmVvcmRlciBsaXN0ZW4gdG8gYGNoYW5nZWAgZXZlbnRcbiAgICAgKiBvbiB0aGUgZ3JpZCBbc3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL2RhdGEvU3RvcmUpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1Jvd1Jlb3JkZXIpXG4gICAgICovXG4gICAgcm93UmVvcmRlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xSb3dSZW9yZGVyfFJvd1Jlb3JkZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHVzZXIgdG8gY2hhbmdlIHJvdyBoZWlnaHQgYnkgZHJhZ2dpbmcgdGhlIGJvdHRvbSByb3cgYm9yZGVyLiBBZnRlciBhIHJlc2l6ZSBvcGVyYXRpb24sIHRoZSBbcm93SGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9kYXRhL0dyaWRSb3dNb2RlbCNmaWVsZC1yb3dIZWlnaHQpXG4gICAgICogZmllbGQgb2YgdGhlIHJlY29yZCBpcyB1cGRhdGVkICh3aGVuIFthcHBseVRvQWxsUm93c10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Sb3dSZXNpemUjY29uZmlnLWFwcGx5VG9BbGxSb3dzKSBpcyBgZmFsc2VgKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Sb3dSZXNpemUpXG4gICAgICovXG4gICAgcm93UmVzaXplRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd1Jlc2l6ZXxSb3dSZXNpemVDb25maWdcbiAgICAvKipcbiAgICAgKiA8ZGl2IGNsYXNzPVwiZXh0ZXJuYWwtZXhhbXBsZSB2ZXJ0aWNhbFwiIGRhdGEtZmlsZT1cIkdyaWQvZmVhdHVyZS9TZWFyY2guanNcIj48L2Rpdj5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9TZWFyY2gpXG4gICAgICovXG4gICAgc2VhcmNoRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNlYXJjaHxTZWFyY2hDb25maWdcbiAgICAvKipcbiAgICAgKiBBbGxvd3Mgc29ydGluZyBvZiBncmlkIGJ5IGNsaWNraW5nIChvciB0YXBwaW5nKSBoZWFkZXJzLCBhbHNvIGRpc3BsYXlzIHdoaWNoIGNvbHVtbnMgZ3JpZCBpcyBzb3J0ZWQgYnkgKG51bWJlcmVkIGlmXG4gICAgICogdXNpbmcgbXVsdGlzb3J0KS4gVXNlIG1vZGlmaWVyIGtleXMgZm9yIG11bHRpc29ydGluZzogW0N0cmwvQ01EICsgY2xpY2tdIHRvIGFkZCBzb3J0ZXIsIFtDdHJsL0NNRCArIEFsdCArIGNsaWNrXSB0byByZW1vdmUgc29ydGVyLlxuICAgICAqIFRoZSBhY3R1YWwgc29ydGluZyBpcyBkb25lIGJ5IHRoZSBzdG9yZSwgc2VlIFtTdG9yZS5zb3J0KCldKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL2RhdGEvbWl4aW4vU3RvcmVTb3J0I2Z1bmN0aW9uLXNvcnQpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1NvcnQpXG4gICAgICovXG4gICAgc29ydEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTb3J0fFNvcnRDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGlzIGZlYXR1cmUgYWxsb3dzIHNwbGl0dGluZyB0aGUgR3JpZCBpbnRvIG11bHRpcGxlIHZpZXdzLCBlaXRoZXIgYnkgdXNpbmcgdGhlIGNlbGwgY29udGV4dCBtZW51LCBvclxuICAgICAqIHByb2dyYW1tYXRpY2FsbHkgYnkgY2FsbGluZyBbc3BsaXQoKV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9TcGxpdCNmdW5jdGlvbi1zcGxpdCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvU3BsaXQpXG4gICAgICovXG4gICAgc3BsaXRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U3BsaXR8U3BsaXRDb25maWdcbiAgICAvKipcbiAgICAgKiBBIGZlYXR1cmUgd2hpY2ggcGlucyBjb25maWd1cmFibGUgY29udGVudCBmcm9tIGEgZ3JpZCByb3cgdG8gdGhlIHRvcCBvZiB0aGUgZ3JpZFxuICAgICAqIHdoaWxlIHRoZSByb3cgc2Nyb2xscyBvZmYgdGhlIHRvcCBidXQgaXMgc3RpbGwgdmlzaWJsZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9TdGlja3lDZWxscylcbiAgICAgKi9cbiAgICBzdGlja3lDZWxsc0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTdGlja3lDZWxsc3xTdGlja3lDZWxsc0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFN0cmlwZXMgcm93cyBieSBhZGRpbmcgYWx0ZXJuYXRpbmcgQ1NTIGNsYXNzZXMgdG8gYWxsIHJvdyBlbGVtZW50cyAoYGItZXZlbmAgYW5kIGBiLW9kZGApLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1N0cmlwZSlcbiAgICAgKi9cbiAgICBzdHJpcGVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U3RyaXBlfFN0cmlwZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIERpc3BsYXlzIGEgc3VtbWFyeSByb3cgaW4gdGhlIGdyaWQgZm9vdGVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1N1bW1hcnkpXG4gICAgICovXG4gICAgc3VtbWFyeUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTdW1tYXJ5fFN1bW1hcnlDb25maWdcbiAgICAvKipcbiAgICAgKiBGZWF0dXJlIHRoYXQgbWFrZXMgdGhlIGdyaWQgd29yayBtb3JlIGxpa2UgYSB0cmVlLiBJbmNsdWRlZCBieSBkZWZhdWx0IGluIFtUcmVlR3JpZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9UcmVlR3JpZCkuIFJlcXVpcmVzXG4gICAgICogZXhhY3RseSBvbmUgW1RyZWVDb2x1bW5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2NvbHVtbi9UcmVlQ29sdW1uKSBhbW9uZyBncmlkcyBjb2x1bW5zLiBUaGF0IGNvbHVtbiB3aWxsIGhhdmUgaXRzIHJlbmRlcmVyIHJlcGxhY2VkIHdpdGggYVxuICAgICAqIHRyZWUgcmVuZGVyZXIgdGhhdCBhZGRzIHBhZGRpbmcgYW5kIGljb24gdG8gZ2l2ZSB0aGUgYXBwZWFyYW5jZSBvZiBhIHRyZWUuIFRoZSBvcmlnaW5hbCByZW5kZXJlciBpcyBwcmVzZXJ2ZWQgYW5kXG4gICAgICogYWxzbyBjYWxsZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvVHJlZSlcbiAgICAgKi9cbiAgICB0cmVlRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRyZWV8VHJlZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgZmVhdHVyZSB0aGF0IGFsbG93cyB0cmFuc2Zvcm1pbmcgYSBmbGF0IGRhdGFzZXQgKG9yIHRoZSBsZWF2ZXMgb2YgYSBoaWVyYXJjaGljYWwpIGludG8gYSB0cmVlIGJ5IHNwZWNpZnlpbmcgYVxuICAgICAqIHJlY29yZCBmaWVsZCBwZXIgcGFyZW50IGxldmVsLiBQYXJlbnRzIGFyZSBnZW5lcmF0ZWQgYmFzZWQgb24gZWFjaCBsZWFmJ3MgdmFsdWUgZm9yIHRob3NlIGZpZWxkcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9UcmVlR3JvdXApXG4gICAgICovXG4gICAgdHJlZUdyb3VwRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRyZWVHcm91cHxUcmVlR3JvdXBDb25maWdcblxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciA6ICdicnludHVtLWdyaWQnLFxuICAgIHRlbXBsYXRlIDogJydcbn0pXG5leHBvcnQgY2xhc3MgQnJ5bnR1bUdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlQ2xhc3MgPSBHcmlkO1xuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZU5hbWUgPSAnR3JpZCc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRXZlbnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ29uQmVmb3JlQ2FuY2VsQ2VsbEVkaXQnLFxuICAgICAgICAnb25CZWZvcmVDYW5jZWxSb3dFZGl0JyxcbiAgICAgICAgJ29uQmVmb3JlQ2VsbEVkaXRTdGFydCcsXG4gICAgICAgICdvbkJlZm9yZUNlbGxSYW5nZURlbGV0ZScsXG4gICAgICAgICdvbkJlZm9yZUNlbGxSYW5nZUVkaXQnLFxuICAgICAgICAnb25CZWZvcmVDb2x1bW5EcmFnU3RhcnQnLFxuICAgICAgICAnb25CZWZvcmVDb2x1bW5Ecm9wRmluYWxpemUnLFxuICAgICAgICAnb25CZWZvcmVDb2x1bW5SZXNpemUnLFxuICAgICAgICAnb25CZWZvcmVDb3B5JyxcbiAgICAgICAgJ29uQmVmb3JlQ1NWRXhwb3J0JyxcbiAgICAgICAgJ29uQmVmb3JlRGVzdHJveScsXG4gICAgICAgICdvbkJlZm9yZUV4Y2VsRXhwb3J0JyxcbiAgICAgICAgJ29uQmVmb3JlRmlsbEhhbmRsZURyYWdTdGFydCcsXG4gICAgICAgICdvbkJlZm9yZUZpbmlzaENlbGxFZGl0JyxcbiAgICAgICAgJ29uQmVmb3JlRmluaXNoUm93RWRpdCcsXG4gICAgICAgICdvbkJlZm9yZUhpZGUnLFxuICAgICAgICAnb25CZWZvcmVQYXN0ZScsXG4gICAgICAgICdvbkJlZm9yZVBkZkV4cG9ydCcsXG4gICAgICAgICdvbkJlZm9yZVJlbmRlclJvdycsXG4gICAgICAgICdvbkJlZm9yZVJlbmRlclJvd3MnLFxuICAgICAgICAnb25CZWZvcmVSb3dDb2xsYXBzZScsXG4gICAgICAgICdvbkJlZm9yZVJvd0V4cGFuZCcsXG4gICAgICAgICdvbkJlZm9yZVNlbGVjdGlvbkNoYW5nZScsXG4gICAgICAgICdvbkJlZm9yZVNldFJlY29yZCcsXG4gICAgICAgICdvbkJlZm9yZVNob3cnLFxuICAgICAgICAnb25CZWZvcmVTdGFydFJvd0VkaXQnLFxuICAgICAgICAnb25CZWZvcmVTdGF0ZUFwcGx5JyxcbiAgICAgICAgJ29uQmVmb3JlU3RhdGVTYXZlJyxcbiAgICAgICAgJ29uQmVmb3JlVG9nZ2xlR3JvdXAnLFxuICAgICAgICAnb25CZWZvcmVUb2dnbGVOb2RlJyxcbiAgICAgICAgJ29uQ2FuY2VsQ2VsbEVkaXQnLFxuICAgICAgICAnb25DYXRjaEFsbCcsXG4gICAgICAgICdvbkNlbGxDbGljaycsXG4gICAgICAgICdvbkNlbGxDb250ZXh0TWVudScsXG4gICAgICAgICdvbkNlbGxEYmxDbGljaycsXG4gICAgICAgICdvbkNlbGxNZW51QmVmb3JlU2hvdycsXG4gICAgICAgICdvbkNlbGxNZW51SXRlbScsXG4gICAgICAgICdvbkNlbGxNZW51U2hvdycsXG4gICAgICAgICdvbkNlbGxNZW51VG9nZ2xlSXRlbScsXG4gICAgICAgICdvbkNlbGxNb3VzZUVudGVyJyxcbiAgICAgICAgJ29uQ2VsbE1vdXNlTGVhdmUnLFxuICAgICAgICAnb25DZWxsTW91c2VPdXQnLFxuICAgICAgICAnb25DZWxsTW91c2VPdmVyJyxcbiAgICAgICAgJ29uQ29sbGFwc2UnLFxuICAgICAgICAnb25Db2xsYXBzZU5vZGUnLFxuICAgICAgICAnb25Db2x1bW5EcmFnJyxcbiAgICAgICAgJ29uQ29sdW1uRHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uQ29sdW1uRHJvcCcsXG4gICAgICAgICdvbkNvbHVtblJlc2l6ZScsXG4gICAgICAgICdvbkNvbHVtblJlc2l6ZVN0YXJ0JyxcbiAgICAgICAgJ29uQ29udGV4dE1lbnVJdGVtJyxcbiAgICAgICAgJ29uQ29udGV4dE1lbnVUb2dnbGVJdGVtJyxcbiAgICAgICAgJ29uQ29weScsXG4gICAgICAgICdvbkRhdGFDaGFuZ2UnLFxuICAgICAgICAnb25EZXN0cm95JyxcbiAgICAgICAgJ29uRGlydHlTdGF0ZUNoYW5nZScsXG4gICAgICAgICdvbkRyYWdTZWxlY3RpbmcnLFxuICAgICAgICAnb25FbGVtZW50Q3JlYXRlZCcsXG4gICAgICAgICdvbkV4cGFuZCcsXG4gICAgICAgICdvbkV4cGFuZE5vZGUnLFxuICAgICAgICAnb25GaWxlRHJvcCcsXG4gICAgICAgICdvbkZpbGxIYW5kbGVCZWZvcmVEcmFnRmluYWxpemUnLFxuICAgICAgICAnb25GaWxsSGFuZGxlRHJhZycsXG4gICAgICAgICdvbkZpbGxIYW5kbGVEcmFnQWJvcnQnLFxuICAgICAgICAnb25GaWxsSGFuZGxlRHJhZ0VuZCcsXG4gICAgICAgICdvbkZpbGxIYW5kbGVEcmFnU3RhcnQnLFxuICAgICAgICAnb25GaW5pc2hDZWxsRWRpdCcsXG4gICAgICAgICdvbkZpbmlzaFJvd0VkaXQnLFxuICAgICAgICAnb25Gb2N1c0luJyxcbiAgICAgICAgJ29uRm9jdXNPdXQnLFxuICAgICAgICAnb25HcmlkUm93QmVmb3JlRHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uR3JpZFJvd0JlZm9yZURyb3BGaW5hbGl6ZScsXG4gICAgICAgICdvbkdyaWRSb3dEcmFnJyxcbiAgICAgICAgJ29uR3JpZFJvd0RyYWdBYm9ydCcsXG4gICAgICAgICdvbkdyaWRSb3dEcmFnU3RhcnQnLFxuICAgICAgICAnb25HcmlkUm93RHJvcCcsXG4gICAgICAgICdvbkhlYWRlckNsaWNrJyxcbiAgICAgICAgJ29uSGVhZGVyTWVudUJlZm9yZVNob3cnLFxuICAgICAgICAnb25IZWFkZXJNZW51SXRlbScsXG4gICAgICAgICdvbkhlYWRlck1lbnVTaG93JyxcbiAgICAgICAgJ29uSGVhZGVyTWVudVRvZ2dsZUl0ZW0nLFxuICAgICAgICAnb25IaWRlJyxcbiAgICAgICAgJ29uTG9ja1Jvd3MnLFxuICAgICAgICAnb25Nb3VzZU91dCcsXG4gICAgICAgICdvbk1vdXNlT3ZlcicsXG4gICAgICAgICdvblBhaW50JyxcbiAgICAgICAgJ29uUGFzdGUnLFxuICAgICAgICAnb25QZGZFeHBvcnQnLFxuICAgICAgICAnb25SZWFkT25seScsXG4gICAgICAgICdvblJlY29tcG9zZScsXG4gICAgICAgICdvblJlbmRlclJvdycsXG4gICAgICAgICdvblJlbmRlclJvd3MnLFxuICAgICAgICAnb25SZXNpemUnLFxuICAgICAgICAnb25SZXNwb25zaXZlJyxcbiAgICAgICAgJ29uUm93Q29sbGFwc2UnLFxuICAgICAgICAnb25Sb3dFeHBhbmQnLFxuICAgICAgICAnb25Sb3dNb3VzZUVudGVyJyxcbiAgICAgICAgJ29uUm93TW91c2VMZWF2ZScsXG4gICAgICAgICdvblNjcm9sbCcsXG4gICAgICAgICdvblNlbGVjdGlvbkNoYW5nZScsXG4gICAgICAgICdvblNlbGVjdGlvbk1vZGVDaGFuZ2UnLFxuICAgICAgICAnb25TaG93JyxcbiAgICAgICAgJ29uU3BsaXQnLFxuICAgICAgICAnb25TcGxpdHRlckNvbGxhcHNlQ2xpY2snLFxuICAgICAgICAnb25TcGxpdHRlckRyYWdFbmQnLFxuICAgICAgICAnb25TcGxpdHRlckRyYWdTdGFydCcsXG4gICAgICAgICdvblNwbGl0dGVyRXhwYW5kQ2xpY2snLFxuICAgICAgICAnb25TdGFydENlbGxFZGl0JyxcbiAgICAgICAgJ29uU3RhcnRSb3dFZGl0JyxcbiAgICAgICAgJ29uU3ViR3JpZENvbGxhcHNlJyxcbiAgICAgICAgJ29uU3ViR3JpZEV4cGFuZCcsXG4gICAgICAgICdvblRvZ2dsZUdyb3VwJyxcbiAgICAgICAgJ29uVG9nZ2xlTm9kZScsXG4gICAgICAgICdvblRvb2xDbGljaycsXG4gICAgICAgICdvblVubG9ja1Jvd3MnLFxuICAgICAgICAnb25VbnNwbGl0J1xuICAgIF07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRmVhdHVyZU5hbWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2FpRmlsdGVyRmVhdHVyZScsXG4gICAgICAgICdjZWxsQ29weVBhc3RlRmVhdHVyZScsXG4gICAgICAgICdjZWxsRWRpdEZlYXR1cmUnLFxuICAgICAgICAnY2VsbE1lbnVGZWF0dXJlJyxcbiAgICAgICAgJ2NlbGxUb29sdGlwRmVhdHVyZScsXG4gICAgICAgICdjaGFydHNGZWF0dXJlJyxcbiAgICAgICAgJ2NvbHVtbkF1dG9XaWR0aEZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uRHJhZ1Rvb2xiYXJGZWF0dXJlJyxcbiAgICAgICAgJ2NvbHVtblBpY2tlckZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uUmVuYW1lRmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5SZW9yZGVyRmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5SZXNpemVGZWF0dXJlJyxcbiAgICAgICAgJ2V4Y2VsRXhwb3J0ZXJGZWF0dXJlJyxcbiAgICAgICAgJ2ZpbGVEcm9wRmVhdHVyZScsXG4gICAgICAgICdmaWxsSGFuZGxlRmVhdHVyZScsXG4gICAgICAgICdmaWx0ZXJGZWF0dXJlJyxcbiAgICAgICAgJ2ZpbHRlckJhckZlYXR1cmUnLFxuICAgICAgICAnZ3JvdXBGZWF0dXJlJyxcbiAgICAgICAgJ2dyb3VwU3VtbWFyeUZlYXR1cmUnLFxuICAgICAgICAnaGVhZGVyTWVudUZlYXR1cmUnLFxuICAgICAgICAnbG9ja1Jvd3NGZWF0dXJlJyxcbiAgICAgICAgJ21lcmdlQ2VsbHNGZWF0dXJlJyxcbiAgICAgICAgJ3BkZkV4cG9ydEZlYXR1cmUnLFxuICAgICAgICAncGluQ29sdW1uc0ZlYXR1cmUnLFxuICAgICAgICAncHJpbnRGZWF0dXJlJyxcbiAgICAgICAgJ3F1aWNrRmluZEZlYXR1cmUnLFxuICAgICAgICAncmVnaW9uUmVzaXplRmVhdHVyZScsXG4gICAgICAgICdyb3dDb3B5UGFzdGVGZWF0dXJlJyxcbiAgICAgICAgJ3Jvd0VkaXRGZWF0dXJlJyxcbiAgICAgICAgJ3Jvd0V4cGFuZGVyRmVhdHVyZScsXG4gICAgICAgICdyb3dSZW9yZGVyRmVhdHVyZScsXG4gICAgICAgICdyb3dSZXNpemVGZWF0dXJlJyxcbiAgICAgICAgJ3NlYXJjaEZlYXR1cmUnLFxuICAgICAgICAnc29ydEZlYXR1cmUnLFxuICAgICAgICAnc3BsaXRGZWF0dXJlJyxcbiAgICAgICAgJ3N0aWNreUNlbGxzRmVhdHVyZScsXG4gICAgICAgICdzdHJpcGVGZWF0dXJlJyxcbiAgICAgICAgJ3N1bW1hcnlGZWF0dXJlJyxcbiAgICAgICAgJ3RyZWVGZWF0dXJlJyxcbiAgICAgICAgJ3RyZWVHcm91cEZlYXR1cmUnXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1Db25maWdzOiBzdHJpbmdbXSA9IEJyeW50dW1HcmlkQ29tcG9uZW50LmJyeW50dW1GZWF0dXJlTmFtZXMuY29uY2F0KFtcbiAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgJ2FsaWduU2VsZicsXG4gICAgICAgICdhbmltYXRlRmlsdGVyUmVtb3ZhbHMnLFxuICAgICAgICAnYW5pbWF0ZVJlbW92aW5nUm93cycsXG4gICAgICAgICdhbmltYXRlVHJlZU5vZGVUb2dnbGUnLFxuICAgICAgICAnYXBwZW5kVG8nLFxuICAgICAgICAnYXJpYURlc2NyaXB0aW9uJyxcbiAgICAgICAgJ2FyaWFMYWJlbCcsXG4gICAgICAgICdhdXRvSGVpZ2h0JyxcbiAgICAgICAgJ2JiYXInLFxuICAgICAgICAnYm9keUNscycsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2NhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucycsXG4gICAgICAgICdjZWxsRWxsaXBzaXMnLFxuICAgICAgICAnY2xzJyxcbiAgICAgICAgJ2NvbGxhcHNlZCcsXG4gICAgICAgICdjb2xsYXBzaWJsZScsXG4gICAgICAgICdjb2xvcicsXG4gICAgICAgICdjb2x1bW4nLFxuICAgICAgICAnY29sdW1uTGluZXMnLFxuICAgICAgICAnY29sdW1ucycsXG4gICAgICAgICdjb25maWcnLFxuICAgICAgICAnY29udGVudEVsZW1lbnRDbHMnLFxuICAgICAgICAnY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQnLFxuICAgICAgICAnZGF0YScsXG4gICAgICAgICdkYXRhRmllbGQnLFxuICAgICAgICAnZGF0YXNldCcsXG4gICAgICAgICdkZWZhdWx0UmVnaW9uJyxcbiAgICAgICAgJ2Rlc3Ryb3lTdG9yZScsXG4gICAgICAgICdkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzJyxcbiAgICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgICAgJ2Rpc2FibGVHcmlkQ29sdW1uSWRXYXJuaW5nJyxcbiAgICAgICAgJ2Rpc2FibGVHcmlkUm93TW9kZWxXYXJuaW5nJyxcbiAgICAgICAgJ2RvY2snLFxuICAgICAgICAnZHJhd2VyJyxcbiAgICAgICAgJ2VsZW1lbnRBdHRyaWJ1dGVzJyxcbiAgICAgICAgJ2VtcHR5VGV4dCcsXG4gICAgICAgICdlbmFibGVTdGlja3knLFxuICAgICAgICAnZW5hYmxlVGV4dFNlbGVjdGlvbicsXG4gICAgICAgICdlbmFibGVVbmRvUmVkb0tleXMnLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZpbGxMYXN0Q29sdW1uJyxcbiAgICAgICAgJ2ZpeGVkUm93SGVpZ2h0JyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZm9vdGVyJyxcbiAgICAgICAgJ2Zvcm11bGFQcm92aWRlcnMnLFxuICAgICAgICAnZnVsbFJvd1JlZnJlc2gnLFxuICAgICAgICAnZ2V0Um93SGVpZ2h0JyxcbiAgICAgICAgJ2hlYWRlcicsXG4gICAgICAgICdoZWlnaHQnLFxuICAgICAgICAnaGlkZGVuJyxcbiAgICAgICAgJ2hpZGVGb290ZXJzJyxcbiAgICAgICAgJ2hpZGVIZWFkZXJzJyxcbiAgICAgICAgJ2hpZGVIb3Jpem9udGFsU2Nyb2xsYmFyJyxcbiAgICAgICAgJ2hvdmVyQ2xzJyxcbiAgICAgICAgJ2ljb24nLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaWdub3JlUGFyZW50UmVhZE9ubHknLFxuICAgICAgICAnaW5wdXRGaWVsZEFsaWduJyxcbiAgICAgICAgJ2luc2VydEJlZm9yZScsXG4gICAgICAgICdpbnNlcnRGaXJzdCcsXG4gICAgICAgICdrZXlNYXAnLFxuICAgICAgICAnbGFiZWxQb3NpdGlvbicsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnbG9hZE1hc2snLFxuICAgICAgICAnbG9hZE1hc2tEZWZhdWx0cycsXG4gICAgICAgICdsb2FkTWFza0Vycm9yJyxcbiAgICAgICAgJ2xvY2FsaXphYmxlJyxcbiAgICAgICAgJ2xvbmdQcmVzc1RpbWUnLFxuICAgICAgICAnbWFyZ2luJyxcbiAgICAgICAgJ21hc2tEZWZhdWx0cycsXG4gICAgICAgICdtYXNrZWQnLFxuICAgICAgICAnbWF4SGVpZ2h0JyxcbiAgICAgICAgJ21heFdpZHRoJyxcbiAgICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAgICdtaW5XaWR0aCcsXG4gICAgICAgICdtb25pdG9yUmVzaXplJyxcbiAgICAgICAgJ293bmVyJyxcbiAgICAgICAgJ3BsdWdpbnMnLFxuICAgICAgICAncHJlc2VydmVGb2N1c09uRGF0YXNldENoYW5nZScsXG4gICAgICAgICdwcmVzZXJ2ZVNjcm9sbCcsXG4gICAgICAgICdwcmVzZXJ2ZVNjcm9sbE9uRGF0YXNldENoYW5nZScsXG4gICAgICAgICdwcmV2ZW50VG9vbHRpcE9uVG91Y2gnLFxuICAgICAgICAncmVhZE9ubHknLFxuICAgICAgICAncmVsYXlTdG9yZUV2ZW50cycsXG4gICAgICAgICdyZW5kaXRpb24nLFxuICAgICAgICAncmVzaXphYmxlJyxcbiAgICAgICAgJ3Jlc2l6ZVRvRml0SW5jbHVkZXNIZWFkZXInLFxuICAgICAgICAncmVzcG9uc2l2ZUxldmVscycsXG4gICAgICAgICdyaXBwbGUnLFxuICAgICAgICAncm9vdEVsZW1lbnQnLFxuICAgICAgICAncm93SGVpZ2h0JyxcbiAgICAgICAgJ3Jvd0xpbmVzJyxcbiAgICAgICAgJ3J0bCcsXG4gICAgICAgICdzY3JvbGxhYmxlJyxcbiAgICAgICAgJ3Njcm9sbGVyQ2xhc3MnLFxuICAgICAgICAnc2Nyb2xsTWFuYWdlcicsXG4gICAgICAgICdzZWxlY3Rpb25Nb2RlJyxcbiAgICAgICAgJ3Nob3dEaXJ0eScsXG4gICAgICAgICdzcGFuJyxcbiAgICAgICAgJ3N0YXRlZnVsJyxcbiAgICAgICAgJ3N0YXRlZnVsRXZlbnRzJyxcbiAgICAgICAgJ3N0YXRlSWQnLFxuICAgICAgICAnc3RhdGVQcm92aWRlcicsXG4gICAgICAgICdzdGF0ZVNldHRpbmdzJyxcbiAgICAgICAgJ3N0b3JlJyxcbiAgICAgICAgJ3N0cmlwcycsXG4gICAgICAgICdzdWJHcmlkQ29uZmlncycsXG4gICAgICAgICdzeW5jTWFzaycsXG4gICAgICAgICd0YWInLFxuICAgICAgICAndGFiQmFySXRlbXMnLFxuICAgICAgICAndGJhcicsXG4gICAgICAgICd0aXRsZScsXG4gICAgICAgICd0b29scycsXG4gICAgICAgICd0cmFuc2l0aW9uJyxcbiAgICAgICAgJ3RyYW5zaXRpb25EdXJhdGlvbicsXG4gICAgICAgICd0eXBlJyxcbiAgICAgICAgJ3VpJyxcbiAgICAgICAgJ3dlaWdodCcsXG4gICAgICAgICd3aWR0aCdcbiAgICBdKTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1Db25maWdzT25seTogc3RyaW5nW10gPSBbXG4gICAgICAgICdhZG9wdCcsXG4gICAgICAgICdhbmltYXRlRmlsdGVyUmVtb3ZhbHMnLFxuICAgICAgICAnYW5pbWF0ZVJlbW92aW5nUm93cycsXG4gICAgICAgICdhcmlhRGVzY3JpcHRpb24nLFxuICAgICAgICAnYXJpYUxhYmVsJyxcbiAgICAgICAgJ2F1dG9IZWlnaHQnLFxuICAgICAgICAnYmJhcicsXG4gICAgICAgICdib2R5Q2xzJyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjb2xsYXBzaWJsZScsXG4gICAgICAgICdjb2xvcicsXG4gICAgICAgICdjb25maWcnLFxuICAgICAgICAnY29udGVudEVsZW1lbnRDbHMnLFxuICAgICAgICAnY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQnLFxuICAgICAgICAnZGF0YUZpZWxkJyxcbiAgICAgICAgJ2RlZmF1bHRSZWdpb24nLFxuICAgICAgICAnZGVzdHJveVN0b3JlJyxcbiAgICAgICAgJ2RldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMnLFxuICAgICAgICAnZGlzYWJsZUdyaWRDb2x1bW5JZFdhcm5pbmcnLFxuICAgICAgICAnZGlzYWJsZUdyaWRSb3dNb2RlbFdhcm5pbmcnLFxuICAgICAgICAnZG9jaycsXG4gICAgICAgICdkcmF3ZXInLFxuICAgICAgICAnZWxlbWVudEF0dHJpYnV0ZXMnLFxuICAgICAgICAnZW5hYmxlU3RpY2t5JyxcbiAgICAgICAgJ2VuYWJsZVRleHRTZWxlY3Rpb24nLFxuICAgICAgICAnZmlsbExhc3RDb2x1bW4nLFxuICAgICAgICAnZml4ZWRSb3dIZWlnaHQnLFxuICAgICAgICAnZm9vdGVyJyxcbiAgICAgICAgJ2Zvcm11bGFQcm92aWRlcnMnLFxuICAgICAgICAnZnVsbFJvd1JlZnJlc2gnLFxuICAgICAgICAnZ2V0Um93SGVpZ2h0JyxcbiAgICAgICAgJ2hlYWRlcicsXG4gICAgICAgICdoaWRlSG9yaXpvbnRhbFNjcm9sbGJhcicsXG4gICAgICAgICdob3ZlckNscycsXG4gICAgICAgICdpY29uJyxcbiAgICAgICAgJ2lnbm9yZVBhcmVudFJlYWRPbmx5JyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdsb2FkTWFzaycsXG4gICAgICAgICdsb2FkTWFza0RlZmF1bHRzJyxcbiAgICAgICAgJ2xvYWRNYXNrRXJyb3InLFxuICAgICAgICAnbG9jYWxpemFibGUnLFxuICAgICAgICAnbWFza0RlZmF1bHRzJyxcbiAgICAgICAgJ21hc2tlZCcsXG4gICAgICAgICdtb25pdG9yUmVzaXplJyxcbiAgICAgICAgJ293bmVyJyxcbiAgICAgICAgJ3BsdWdpbnMnLFxuICAgICAgICAncHJlc2VydmVGb2N1c09uRGF0YXNldENoYW5nZScsXG4gICAgICAgICdwcmVzZXJ2ZVNjcm9sbE9uRGF0YXNldENoYW5nZScsXG4gICAgICAgICdwcmV2ZW50VG9vbHRpcE9uVG91Y2gnLFxuICAgICAgICAncmVsYXlTdG9yZUV2ZW50cycsXG4gICAgICAgICdyZXNpemFibGUnLFxuICAgICAgICAncmVzaXplVG9GaXRJbmNsdWRlc0hlYWRlcicsXG4gICAgICAgICdyZXNwb25zaXZlTGV2ZWxzJyxcbiAgICAgICAgJ3JpcHBsZScsXG4gICAgICAgICdyb290RWxlbWVudCcsXG4gICAgICAgICdzY3JvbGxlckNsYXNzJyxcbiAgICAgICAgJ3Njcm9sbE1hbmFnZXInLFxuICAgICAgICAnc2hvd0RpcnR5JyxcbiAgICAgICAgJ3N0YXRlZnVsJyxcbiAgICAgICAgJ3N0YXRlZnVsRXZlbnRzJyxcbiAgICAgICAgJ3N0YXRlSWQnLFxuICAgICAgICAnc3RhdGVQcm92aWRlcicsXG4gICAgICAgICdzdHJpcHMnLFxuICAgICAgICAnc3ViR3JpZENvbmZpZ3MnLFxuICAgICAgICAnc3luY01hc2snLFxuICAgICAgICAndGFiJyxcbiAgICAgICAgJ3RhYkJhckl0ZW1zJyxcbiAgICAgICAgJ3RiYXInLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICd1aScsXG4gICAgICAgICd3ZWlnaHQnXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1Qcm9wczogc3RyaW5nW10gPSBCcnludHVtR3JpZENvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhbGlnblNlbGYnLFxuICAgICAgICAnYW5pbWF0ZVRyZWVOb2RlVG9nZ2xlJyxcbiAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgJ2NhbGxPbkZ1bmN0aW9ucycsXG4gICAgICAgICdjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMnLFxuICAgICAgICAnY2VsbEVsbGlwc2lzJyxcbiAgICAgICAgJ2NscycsXG4gICAgICAgICdjb2xsYXBzZWQnLFxuICAgICAgICAnY29sdW1uJyxcbiAgICAgICAgJ2NvbHVtbkxpbmVzJyxcbiAgICAgICAgJ2NvbHVtbnMnLFxuICAgICAgICAnZGF0YScsXG4gICAgICAgICdkYXRhc2V0JyxcbiAgICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgICAgJ2VtcHR5VGV4dCcsXG4gICAgICAgICdlbmFibGVVbmRvUmVkb0tleXMnLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZm9jdXNWaXNpYmxlJyxcbiAgICAgICAgJ2hhc0NoYW5nZXMnLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlRm9vdGVycycsXG4gICAgICAgICdoaWRlSGVhZGVycycsXG4gICAgICAgICdpZCcsXG4gICAgICAgICdpbnB1dEZpZWxkQWxpZ24nLFxuICAgICAgICAnaW5zZXJ0QmVmb3JlJyxcbiAgICAgICAgJ2luc2VydEZpcnN0JyxcbiAgICAgICAgJ2tleU1hcCcsXG4gICAgICAgICdsYWJlbFBvc2l0aW9uJyxcbiAgICAgICAgJ2xvbmdQcmVzc1RpbWUnLFxuICAgICAgICAnbWFyZ2luJyxcbiAgICAgICAgJ21heEhlaWdodCcsXG4gICAgICAgICdtYXhXaWR0aCcsXG4gICAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgICAnbWluV2lkdGgnLFxuICAgICAgICAnb3JpZ2luYWxTdG9yZScsXG4gICAgICAgICdwYXJlbnQnLFxuICAgICAgICAncHJlc2VydmVTY3JvbGwnLFxuICAgICAgICAncmVhZE9ubHknLFxuICAgICAgICAncmVuZGl0aW9uJyxcbiAgICAgICAgJ3Jvd0hlaWdodCcsXG4gICAgICAgICdyb3dMaW5lcycsXG4gICAgICAgICdydGwnLFxuICAgICAgICAnc2Nyb2xsYWJsZScsXG4gICAgICAgICdzZWxlY3RlZENlbGwnLFxuICAgICAgICAnc2VsZWN0ZWRDZWxscycsXG4gICAgICAgICdzZWxlY3RlZFJlY29yZCcsXG4gICAgICAgICdzZWxlY3RlZFJlY29yZHMnLFxuICAgICAgICAnc2VsZWN0ZWRSb3dzJyxcbiAgICAgICAgJ3NlbGVjdGlvbk1vZGUnLFxuICAgICAgICAnc3BhbicsXG4gICAgICAgICdzdGF0ZScsXG4gICAgICAgICdzdGF0ZVNldHRpbmdzJyxcbiAgICAgICAgJ3N0b3JlJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ3Rvb2xzJyxcbiAgICAgICAgJ3Rvb2x0aXAnLFxuICAgICAgICAndHJhbnNpdGlvbicsXG4gICAgICAgICd0cmFuc2l0aW9uRHVyYXRpb24nLFxuICAgICAgICAnd2lkdGgnXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gICAgcHVibGljIGluc3RhbmNlITogR3JpZDtcblxuICAgIHByaXZhdGUgYnJ5bnR1bUNvbmZpZyA9IHtcbiAgICAgICAgYWRvcHQgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYXBwZW5kVG8gICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgaHJlZiAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYW5ndWxhckNvbXBvbmVudCA6IHRoaXMsXG4gICAgICAgIGZlYXR1cmVzICAgICAgICAgOiB7fSxcbiAgICAgICAgbGlzdGVuZXJzICAgICAgICA6IHt9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBDb25maWdzIG9ubHlcbiAgICBASW5wdXQoKSBhZG9wdCAgICAgICAgICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGFuaW1hdGVGaWx0ZXJSZW1vdmFscyAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGFuaW1hdGVSZW1vdmluZ1Jvd3MgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGFyaWFEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYXJpYUxhYmVsICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhdXRvSGVpZ2h0ICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBiYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogKEdyaWRDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfFBhZ2luZ1Rvb2xiYXJDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSBib2R5Q2xzICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBidWJibGVFdmVudHMgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGNvbGxhcHNpYmxlICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFBhbmVsQ29sbGFwc2VyQ29uZmlnfFBhbmVsQ29sbGFwc2VyT3ZlcmxheUNvbmZpZztcbiAgICBASW5wdXQoKSBjb2xvciAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGNvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgY29udGVudEVsZW1lbnRDbHMgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQgICAgICAgISA6ICdjb250ZXh0bWVudSd8J2NsaWNrJ3wnZGJsY2xpY2snO1xuICAgIEBJbnB1dCgpIGRhdGFGaWVsZCAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGVmYXVsdFJlZ2lvbiAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkZXN0cm95U3RvcmUgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBkaXNhYmxlR3JpZENvbHVtbklkV2FybmluZyAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBkaXNhYmxlR3JpZFJvd01vZGVsV2FybmluZyAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBkb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogJ3RvcCd8J2JvdHRvbSd8J2xlZnQnfCdyaWdodCd8J3N0YXJ0J3wnZW5kJ3wnaGVhZGVyJ3wncHJlLWhlYWRlcid8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGRyYXdlciAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtzaWRlPzogJ3N0YXJ0J3wnbGVmdCd8J2VuZCd8J3JpZ2h0J3wndG9wJ3wnYm90dG9tJywgc2l6ZT86IHN0cmluZ3xudW1iZXIsIGlubGluZT86IGJvb2xlYW4sIGF1dG9DbG9zZTogeyBtb3VzZWRvd24/OiBib29sZWFufHN0cmluZywgZm9jdXNvdXQ/OiBib29sZWFufHN0cmluZywgbW91c2VvdXQ/OiBzdHJpbmcgfSwgYXV0b0Nsb3NlRGVsYXk/OiBudW1iZXJ9O1xuICAgIEBJbnB1dCgpIGVsZW1lbnRBdHRyaWJ1dGVzICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8bnVsbD47XG4gICAgQElucHV0KCkgZW5hYmxlU3RpY2t5ICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZW5hYmxlVGV4dFNlbGVjdGlvbiAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZmlsbExhc3RDb2x1bW4gICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZml4ZWRSb3dIZWlnaHQgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZm9vdGVyICAgICAgICAgICAgICAgICAgICAgICAgISA6IHtcbiAgICAgICAgZG9jaz86ICd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfCdzdGFydCd8J2VuZCdcbiAgICAgICAgaHRtbD86IHN0cmluZ1xuICAgICAgICBjbHM/OiBzdHJpbmdcbiAgICB9fHN0cmluZztcbiAgICBASW5wdXQoKSBmb3JtdWxhUHJvdmlkZXJzICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgRm9ybXVsYVByb3ZpZGVyQ29uZmlnPjtcbiAgICBASW5wdXQoKSBmdWxsUm93UmVmcmVzaCAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBnZXRSb3dIZWlnaHQgICAgICAgICAgICAgICAgICAhIDogKGdldFJvd0hlaWdodDogeyByZWNvcmQ6IE1vZGVsIH0pID0+IG51bWJlcjtcbiAgICBASW5wdXQoKSBoZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfGJvb2xlYW58UGFuZWxIZWFkZXI7XG4gICAgQElucHV0KCkgaGlkZUhvcml6b250YWxTY3JvbGxiYXIgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaG92ZXJDbHMgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBpY29uICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfERvbUNvbmZpZztcbiAgICBASW5wdXQoKSBpZ25vcmVQYXJlbnRSZWFkT25seSAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBsaXN0ZW5lcnMgICAgICAgICAgICAgICAgICAgICAhIDogR3JpZExpc3RlbmVycztcbiAgICBASW5wdXQoKSBsb2FkTWFzayAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfE1hc2tDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSBsb2FkTWFza0RlZmF1bHRzICAgICAgICAgICAgICAhIDogTWFza0NvbmZpZztcbiAgICBASW5wdXQoKSBsb2FkTWFza0Vycm9yICAgICAgICAgICAgICAgICAhIDogTWFza0NvbmZpZ3xNYXNrfGJvb2xlYW47XG4gICAgQElucHV0KCkgbG9jYWxpemFibGUgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbWFza0RlZmF1bHRzICAgICAgICAgICAgICAgICAgISA6IE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbWFza2VkICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58c3RyaW5nfE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbW9uaXRvclJlc2l6ZSAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgb3duZXIgICAgICAgICAgICAgICAgICAgICAgICAgISA6IFdpZGdldHxhbnk7XG4gICAgQElucHV0KCkgcGx1Z2lucyAgICAgICAgICAgICAgICAgICAgICAgISA6IEZ1bmN0aW9uW107XG4gICAgQElucHV0KCkgcHJlc2VydmVGb2N1c09uRGF0YXNldENoYW5nZSAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHJlc2VydmVTY3JvbGxPbkRhdGFzZXRDaGFuZ2UgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHJldmVudFRvb2x0aXBPblRvdWNoICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVsYXlTdG9yZUV2ZW50cyAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVzaXphYmxlICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBtaW5XaWR0aD86IG51bWJlclxuICAgICAgICBtYXhXaWR0aD86IG51bWJlclxuICAgICAgICBtaW5IZWlnaHQ/OiBudW1iZXJcbiAgICAgICAgbWF4SGVpZ2h0PzogbnVtYmVyXG4gICAgICAgIGhhbmRsZXM/OiBvYmplY3RcbiAgICB9O1xuICAgIEBJbnB1dCgpIHJlc2l6ZVRvRml0SW5jbHVkZXNIZWFkZXIgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlc3BvbnNpdmVMZXZlbHMgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXJ8c3RyaW5nfFJlc3BvbnNpdmVMZXZlbENvbmZpZz47XG4gICAgQElucHV0KCkgcmlwcGxlICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBkZWxlZ2F0ZT86IHN0cmluZ1xuICAgICAgICBjb2xvcj86IHN0cmluZ1xuICAgICAgICByYWRpdXM/OiBudW1iZXJcbiAgICAgICAgY2xpcD86IHN0cmluZ1xuICAgIH07XG4gICAgQElucHV0KCkgcm9vdEVsZW1lbnQgICAgICAgICAgICAgICAgICAgISA6IFNoYWRvd1Jvb3R8SFRNTEVsZW1lbnQ7XG4gICAgQElucHV0KCkgc2Nyb2xsZXJDbGFzcyAgICAgICAgICAgICAgICAgISA6IHR5cGVvZiBTY3JvbGxlcjtcbiAgICBASW5wdXQoKSBzY3JvbGxNYW5hZ2VyICAgICAgICAgICAgICAgICAhIDogU2Nyb2xsTWFuYWdlckNvbmZpZ3xTY3JvbGxNYW5hZ2VyO1xuICAgIEBJbnB1dCgpIHNob3dEaXJ0eSAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtcbiAgICAgICAgZHVyaW5nRWRpdD86IGJvb2xlYW5cbiAgICAgICAgbmV3UmVjb3JkPzogYm9vbGVhblxuICAgIH07XG4gICAgQElucHV0KCkgc3RhdGVmdWwgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58b2JqZWN0fHN0cmluZ1tdO1xuICAgIEBJbnB1dCgpIHN0YXRlZnVsRXZlbnRzICAgICAgICAgICAgICAgICEgOiBvYmplY3R8c3RyaW5nW107XG4gICAgQElucHV0KCkgc3RhdGVJZCAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBzdGF0ZVByb3ZpZGVyICAgICAgICAgICAgICAgICAhIDogU3RhdGVQcm92aWRlcjtcbiAgICBASW5wdXQoKSBzdHJpcHMgICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgR3JpZENvbnRhaW5lckl0ZW1Db25maWc+O1xuICAgIEBJbnB1dCgpIHN1YkdyaWRDb25maWdzICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBTdWJHcmlkQ29uZmlnPjtcbiAgICBASW5wdXQoKSBzeW5jTWFzayAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfE1hc2tDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSB0YWIgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxUYWJDb25maWc7XG4gICAgQElucHV0KCkgdGFiQmFySXRlbXMgICAgICAgICAgICAgICAgICAgISA6IFRvb2xiYXJJdGVtc1tdfFdpZGdldFtdO1xuICAgIEBJbnB1dCgpIHRiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAoR3JpZENvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAnZ3JpZCc7XG4gICAgQElucHV0KCkgdWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6ICdwbGFpbid8J3Rvb2xiYXInfHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgd2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcblxuICAgIC8vIENvbmZpZ3MgYW5kIHByb3BlcnRpZXNcbiAgICBASW5wdXQoKSBhbGlnblNlbGYgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhbmltYXRlVHJlZU5vZGVUb2dnbGUgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXBwZW5kVG8gICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgY2FsbE9uRnVuY3Rpb25zICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjZWxsRWxsaXBzaXMgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2xzICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGNvbGxhcHNlZCAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjb2x1bW4gICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBjb2x1bW5MaW5lcyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY29sdW1ucyAgICAgICAgICAgICAgICAgICAgICEgOiBDb2x1bW5TdG9yZXxHcmlkQ29sdW1uQ29uZmlnW118Q29sdW1uU3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3RbXXxNb2RlbFtdfE1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgZGF0YXNldCAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3R8UmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBASW5wdXQoKSBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58J2luZXJ0JztcbiAgICBASW5wdXQoKSBlbXB0eVRleHQgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xFbXB0eVRleHREb21Db25maWc7XG4gICAgQElucHV0KCkgZW5hYmxlVW5kb1JlZG9LZXlzICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGV4dHJhRGF0YSAgICAgICAgICAgICAgICAgICAhIDogYW55O1xuICAgIEBJbnB1dCgpIGZsZXggICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBoZWlnaHQgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgaGlkZGVuICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhpZGVGb290ZXJzICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaWRlSGVhZGVycyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5wdXRGaWVsZEFsaWduICAgICAgICAgICAgICEgOiAnc3RhcnQnfCdlbmQnO1xuICAgIEBJbnB1dCgpIGluc2VydEJlZm9yZSAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGluc2VydEZpcnN0ICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGtleU1hcCAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgS2V5TWFwQ29uZmlnPjtcbiAgICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uICAgICAgICAgICAgICAgISA6ICdiZWZvcmUnfCdhYm92ZSd8J2FsaWduLWJlZm9yZSd8J2F1dG8nfG51bGw7XG4gICAgQElucHV0KCkgbG9uZ1ByZXNzVGltZSAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgbWFyZ2luICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heEhlaWdodCAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtYXhXaWR0aCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWluSGVpZ2h0ICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIG1pbldpZHRoICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBwcmVzZXJ2ZVNjcm9sbCAgICAgICAgICAgICAgISA6IFByZXNlcnZlU2Nyb2xsT3B0aW9uc3xib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlYWRPbmx5ICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZW5kaXRpb24gICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fG51bGw7XG4gICAgQElucHV0KCkgcm93SGVpZ2h0ICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgcm93TGluZXMgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJ0bCAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzY3JvbGxhYmxlICAgICAgICAgICAgICAgICAgISA6IFNjcm9sbGVyfGJvb2xlYW58U2Nyb2xsZXJDb25maWc7XG4gICAgQElucHV0KCkgc2VsZWN0aW9uTW9kZSAgICAgICAgICAgICAgICEgOiBHcmlkU2VsZWN0aW9uTW9kZTtcbiAgICBASW5wdXQoKSBzcGFuICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzdGF0ZVNldHRpbmdzICAgICAgICAgICAgICAgISA6IHtcbiAgICAgICAgcmVzdG9yZVVuY29uZmlndXJlZENvbHVtbnM/OiBib29sZWFuXG4gICAgfTtcbiAgICBASW5wdXQoKSBzdG9yZSAgICAgICAgICAgICAgICAgICAgICAgISA6IFN0b3JlfFN0b3JlQ29uZmlnfEFqYXhTdG9yZXxBamF4U3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgdGl0bGUgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdG9vbHMgICAgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBUb29sfFRvb2xDb25maWc+fG51bGx8UmVjb3JkPHN0cmluZywgVG9vbD58UmVjb3JkPHN0cmluZywgVG9vbENvbmZpZz47XG4gICAgQElucHV0KCkgdHJhbnNpdGlvbiAgICAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGluc2VydFJlY29yZD86IGJvb2xlYW5cbiAgICAgICAgcmVtb3ZlUmVjb3JkPzogYm9vbGVhblxuICAgICAgICB0b2dnbGVDb2x1bW4/OiBib29sZWFuXG4gICAgICAgIGV4cGFuZENvbGxhcHNlQ29sdW1uPzogYm9vbGVhblxuICAgICAgICB0b2dnbGVSZWdpb24/OiBib29sZWFuXG4gICAgICAgIHRvZ2dsZVRyZWVOb2RlPzogYm9vbGVhblxuICAgICAgICB0b2dnbGVHcm91cD86IGJvb2xlYW5cbiAgICAgICAgZmlsdGVyUmVtb3ZhbD86IGJvb2xlYW5cbiAgICB9O1xuICAgIEBJbnB1dCgpIHRyYW5zaXRpb25EdXJhdGlvbiAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHdpZHRoICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcblxuICAgIC8vIFByb3BlcnRpZXMgb25seVxuICAgIEBJbnB1dCgpIGZvY3VzVmlzaWJsZSAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoYXNDaGFuZ2VzICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgb3JpZ2luYWxTdG9yZSAgICEgOiBTdG9yZTtcbiAgICBASW5wdXQoKSBwYXJlbnQgICAgICAgICAgISA6IFdpZGdldDtcbiAgICBASW5wdXQoKSBzZWxlY3RlZENlbGwgICAgISA6IEdyaWRMb2NhdGlvbnxHcmlkTG9jYXRpb25Db25maWc7XG4gICAgQElucHV0KCkgc2VsZWN0ZWRDZWxscyAgICEgOiBHcmlkTG9jYXRpb25bXXxHcmlkTG9jYXRpb25Db25maWdbXTtcbiAgICBASW5wdXQoKSBzZWxlY3RlZFJlY29yZCAgISA6IE1vZGVsO1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkUmVjb3JkcyAhIDogTW9kZWxbXXxudW1iZXJbXTtcbiAgICBASW5wdXQoKSBzZWxlY3RlZFJvd3MgICAgISA6IE1vZGVsW118bnVtYmVyW107XG4gICAgQElucHV0KCkgc3RhdGUgICAgICAgICAgICEgOiBHcmlkU3RhdGVJbmZvO1xuICAgIEBJbnB1dCgpIHRvb2x0aXAgICAgICAgICAhIDogc3RyaW5nfFRvb2x0aXBDb25maWc7XG5cbiAgICAvLyBGZWF0dXJlc1xuICAgIEBJbnB1dCgpIGFpRmlsdGVyRmVhdHVyZSAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xBSUZpbHRlcnxBSUZpbHRlckNvbmZpZztcbiAgICBASW5wdXQoKSBjZWxsQ29weVBhc3RlRmVhdHVyZSAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2VsbENvcHlQYXN0ZXxDZWxsQ29weVBhc3RlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNlbGxFZGl0RmVhdHVyZSAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDZWxsRWRpdHxDZWxsRWRpdENvbmZpZztcbiAgICBASW5wdXQoKSBjZWxsTWVudUZlYXR1cmUgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2VsbE1lbnV8Q2VsbE1lbnVDb25maWc7XG4gICAgQElucHV0KCkgY2VsbFRvb2x0aXBGZWF0dXJlICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENlbGxUb29sdGlwfENlbGxUb29sdGlwQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNoYXJ0c0ZlYXR1cmUgICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDaGFydHN8Q2hhcnRzQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNvbHVtbkF1dG9XaWR0aEZlYXR1cmUgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5BdXRvV2lkdGh8Q29sdW1uQXV0b1dpZHRoQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNvbHVtbkRyYWdUb29sYmFyRmVhdHVyZSAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5EcmFnVG9vbGJhcnxDb2x1bW5EcmFnVG9vbGJhckNvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5QaWNrZXJGZWF0dXJlICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUGlja2VyfENvbHVtblBpY2tlckNvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5SZW5hbWVGZWF0dXJlICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUmVuYW1lfENvbHVtblJlbmFtZUNvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5SZW9yZGVyRmVhdHVyZSAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUmVvcmRlcnxDb2x1bW5SZW9yZGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNvbHVtblJlc2l6ZUZlYXR1cmUgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5SZXNpemV8Q29sdW1uUmVzaXplQ29uZmlnO1xuICAgIEBJbnB1dCgpIGV4Y2VsRXhwb3J0ZXJGZWF0dXJlICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xFeGNlbEV4cG9ydGVyfEV4Y2VsRXhwb3J0ZXJDb25maWc7XG4gICAgQElucHV0KCkgZmlsZURyb3BGZWF0dXJlICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbGVEcm9wfEZpbGVEcm9wQ29uZmlnO1xuICAgIEBJbnB1dCgpIGZpbGxIYW5kbGVGZWF0dXJlICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWxsSGFuZGxlfEZpbGxIYW5kbGVDb25maWc7XG4gICAgQElucHV0KCkgZmlsdGVyRmVhdHVyZSAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbHRlcnxGaWx0ZXJDb25maWc7XG4gICAgQElucHV0KCkgZmlsdGVyQmFyRmVhdHVyZSAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbHRlckJhcnxGaWx0ZXJCYXJDb25maWc7XG4gICAgQElucHV0KCkgZ3JvdXBGZWF0dXJlICAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyb3VwfEdyb3VwQ29uZmlnO1xuICAgIEBJbnB1dCgpIGdyb3VwU3VtbWFyeUZlYXR1cmUgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xHcm91cFN1bW1hcnl8R3JvdXBTdW1tYXJ5Q29uZmlnO1xuICAgIEBJbnB1dCgpIGhlYWRlck1lbnVGZWF0dXJlICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xIZWFkZXJNZW51fEhlYWRlck1lbnVDb25maWc7XG4gICAgQElucHV0KCkgbG9ja1Jvd3NGZWF0dXJlICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfExvY2tSb3dzfExvY2tSb3dzQ29uZmlnO1xuICAgIEBJbnB1dCgpIG1lcmdlQ2VsbHNGZWF0dXJlICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xNZXJnZUNlbGxzfE1lcmdlQ2VsbHNDb25maWc7XG4gICAgQElucHV0KCkgcGRmRXhwb3J0RmVhdHVyZSAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFBkZkV4cG9ydHxQZGZFeHBvcnRDb25maWc7XG4gICAgQElucHV0KCkgcGluQ29sdW1uc0ZlYXR1cmUgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFBpbkNvbHVtbnN8UGluQ29sdW1uc0NvbmZpZztcbiAgICBASW5wdXQoKSBwcmludEZlYXR1cmUgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8UHJpbnR8UHJpbnRDb25maWc7XG4gICAgQElucHV0KCkgcXVpY2tGaW5kRmVhdHVyZSAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFF1aWNrRmluZHxRdWlja0ZpbmRDb25maWc7XG4gICAgQElucHV0KCkgcmVnaW9uUmVzaXplRmVhdHVyZSAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJlZ2lvblJlc2l6ZXxSZWdpb25SZXNpemVDb25maWc7XG4gICAgQElucHV0KCkgcm93Q29weVBhc3RlRmVhdHVyZSAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd0NvcHlQYXN0ZXxSb3dDb3B5UGFzdGVDb25maWc7XG4gICAgQElucHV0KCkgcm93RWRpdEZlYXR1cmUgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd0VkaXR8Um93RWRpdENvbmZpZztcbiAgICBASW5wdXQoKSByb3dFeHBhbmRlckZlYXR1cmUgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Um93RXhwYW5kZXJ8Um93RXhwYW5kZXJDb25maWc7XG4gICAgQElucHV0KCkgcm93UmVvcmRlckZlYXR1cmUgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd1Jlb3JkZXJ8Um93UmVvcmRlckNvbmZpZztcbiAgICBASW5wdXQoKSByb3dSZXNpemVGZWF0dXJlICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Um93UmVzaXplfFJvd1Jlc2l6ZUNvbmZpZztcbiAgICBASW5wdXQoKSBzZWFyY2hGZWF0dXJlICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U2VhcmNofFNlYXJjaENvbmZpZztcbiAgICBASW5wdXQoKSBzb3J0RmVhdHVyZSAgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U29ydHxTb3J0Q29uZmlnO1xuICAgIEBJbnB1dCgpIHNwbGl0RmVhdHVyZSAgICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTcGxpdHxTcGxpdENvbmZpZztcbiAgICBASW5wdXQoKSBzdGlja3lDZWxsc0ZlYXR1cmUgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U3RpY2t5Q2VsbHN8U3RpY2t5Q2VsbHNDb25maWc7XG4gICAgQElucHV0KCkgc3RyaXBlRmVhdHVyZSAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFN0cmlwZXxTdHJpcGVDb25maWc7XG4gICAgQElucHV0KCkgc3VtbWFyeUZlYXR1cmUgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFN1bW1hcnl8U3VtbWFyeUNvbmZpZztcbiAgICBASW5wdXQoKSB0cmVlRmVhdHVyZSAgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8VHJlZXxUcmVlQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRyZWVHcm91cEZlYXR1cmUgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUcmVlR3JvdXB8VHJlZUdyb3VwQ29uZmlnO1xuXG4gICAgLy8gRXZlbnRzIGVtaXR0ZXJzXG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSB0aGUgY2VsbCBlZGl0aW5nIGlzIGNhbmNlbGVkLCByZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGNhbmNlbGxhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ2FuY2VsQ2VsbEVkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGVkaXRvckNvbnRleHQ6IEdyaWRMb2NhdGlvbiB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgdGhlIHJvdyBlZGl0aW5nIGlzIGNhbmNlbGVkLCByZXR1cm4gZmFsc2UgdG8gc2lnbmFsIHRoYXQgdGhlIHZhbHVlIGlzIGludmFsaWQgYW5kIGVkaXRpbmcgc2hvdWxkIG5vdCBiZSBmaW5hbGl6ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNldmVudC1iZWZvcmVDYW5jZWxSb3dFZGl0KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRhcmdldCBncmlkXG4gICAgICogQHBhcmFtIHtSb3dFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNhbmNlbFJvd0VkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncmlkOiBHcmlkLCBlZGl0b3JDb250ZXh0OiBSb3dFZGl0b3JDb250ZXh0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBlZGl0aW5nIHN0YXJ0cywgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCBlZGl0aW5nXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHtDZWxsRWRpdG9yQ29udGV4dH0gZXZlbnQuZWRpdG9yQ29udGV4dCBFZGl0aW5nIGNvbnRleHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDZWxsRWRpdFN0YXJ0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBlZGl0b3JDb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgZGVsZXRpbmcgYSByYW5nZSBvZiBzZWxlY3RlZCBjZWxsIHZhbHVlcyBieSBwcmVzc2luZyBgQmFja3NwYWNlYCBvciBgRGVsYFxuICAgICAqIGJ1dHRvbnMgd2hpbGUgW2F1dG9FZGl0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NlbGxFZGl0I2NvbmZpZy1hdXRvRWRpdCkgaXMgc2V0IHRvIGB0cnVlYC4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCBlZGl0aW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7KEdyaWQudXRpbC5HcmlkTG9jYXRpb258Q29yZS5kYXRhLk1vZGVsKVtdfSBldmVudC5ncmlkU2VsZWN0aW9uIEFuIGFycmF5IG9mIGNlbGwgc2VsZWN0b3JzIG9yIHJlY29yZHMgdGhhdCB3aWxsIGhhdmUgdGhlaXIgdmFsdWVzIGRlbGV0ZWQgKHRoZSByZWNvcmRzIHRoZW1zZWx2ZXMgd2lsbCBub3QgZ2V0IGRlbGV0ZWQsIG9ubHkgdmlzaWJsZSBjb2x1bW4gdmFsdWVzKS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDZWxsUmFuZ2VEZWxldGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGdyaWRTZWxlY3Rpb246IChHcmlkTG9jYXRpb258TW9kZWwpW10gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBmb3IgZWFjaCBzZWxlY3RlZCByZWNvcmQgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBlZGl0aW5nIGEgcmFuZ2Ugb2Ygc2VsZWN0ZWQgY2VsbCB2YWx1ZXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBDdXJyZW50IHNlbGVjdGVkIHJlY29yZCBmcm9tIHRoZSByYW5nZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5maWVsZCBUaGUgZmllbGQgYmVpbmcgY2hhbmdlZFxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudC52YWx1ZSBUaGUgdmFsdWUgYmVpbmcgc2V0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ2VsbFJhbmdlRWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBhbnkgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHByaW9yIHRvIHN0YXJ0aW5nIGEgY29sdW1uIGRyYWcgZ2VzdHVyZS4gVGhlIGRyYWcgaXMgY2FuY2VsZWQgaWYgYSBsaXN0ZW5lciByZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBkcmFnZ2VkIGNvbHVtbi5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDb2x1bW5EcmFnU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBldmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBjb2x1bW4gaXMgZHJvcHBlZCwgYW5kIHlvdSBjYW4gcmV0dXJuIGZhbHNlIGZyb20gYSBsaXN0ZW5lciB0byBhYm9ydCB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgZHJhZ2dlZCBjb2x1bW4uXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50Lmluc2VydEJlZm9yZSBUaGUgY29sdW1uIGJlZm9yZSB3aGljaCB0aGUgZHJhZ2dlZCBjb2x1bW4gd2lsbCBiZSBpbnNlcnRlZC5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQubmV3UGFyZW50IFRoZSBuZXcgcGFyZW50IGNvbHVtbi5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQucmVnaW9uIFRoZSByZWdpb24gd2hlcmUgdGhlIGNvbHVtbiB3YXMgZHJvcHBlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDb2x1bW5Ecm9wRmluYWxpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBpbnNlcnRCZWZvcmU6IENvbHVtbiwgbmV3UGFyZW50OiBDb2x1bW4sIGV2ZW50OiBFdmVudCwgcmVnaW9uOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHByaW9yIHRvIHN0YXJ0aW5nIGEgY29sdW1uIHJlc2l6ZSBnZXN0dXJlLiBUaGUgcmVzaXplIGlzIGNhbmNlbGVkIGlmIGEgbGlzdGVuZXIgcmV0dXJuc1xuICAgICAqIGBmYWxzZWAuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGNvbHVtblxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBicm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ29sdW1uUmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjb2x1bW46IENvbHVtbiwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBhIGNvcHkgYWN0aW9uIGlzIHBlcmZvcm1lZCwgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9uW119IGV2ZW50LmNlbGxzIFRoZSBjZWxscyBhYm91dCB0byBiZSBjb3BpZWQgb3IgY3V0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmRhdGEgVGhlIHN0cmluZyBkYXRhIGFib3V0IHRvIGJlIGNvcGllZCBvciBjdXRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmlzQ3V0IGB0cnVlYCBpZiB0aGlzIGlzIGEgY3V0IGFjdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5lbnRpdHlOYW1lICdjZWxsJyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgYmVmb3JlQ29weSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDb3B5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjZWxsczogR3JpZExvY2F0aW9uW10sIGRhdGE6IHN0cmluZywgaXNDdXQ6IGJvb2xlYW4sIGVudGl0eU5hbWU6IHN0cmluZyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgQ1NWIGV4cG9ydCBzdGFydHMuIFJldHVybiBgZmFsc2VgIHRvIGNhbmNlbCB0aGUgZXhwb3J0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0V4cG9ydENvbmZpZ30gZXZlbnQuY29uZmlnIEV4cG9ydCBjb25maWdcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbltdfSBldmVudC5jb2x1bW5zIEFuIGFycmF5IG9mIGNvbHVtbnMgdG8gZXhwb3J0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQucm93cyBBbiBhcnJheSBvZiByZWNvcmRzIHRvIGV4cG9ydFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5saW5lRGVsaW1pdGVyIFRoZSBDU1YgZGVsaW1pdGVyIHRvIHNlcGFyYXRlIGxpbmVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmNvbHVtbkRlbGltaXRlciBUaGUgQ1NWIGRlbGltaXRlciB0byBzZXBhcmF0ZSB2YWx1ZXMgb24gb25lIGxpbmVcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDU1ZFeHBvcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjb25maWc6IEV4cG9ydENvbmZpZywgY29sdW1uczogQ29sdW1uW10sIHJvd3M6IE1vZGVsW10sIGxpbmVEZWxpbWl0ZXI6IHN0cmluZywgY29sdW1uRGVsaW1pdGVyOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgYW4gb2JqZWN0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLkJhc2V9IGV2ZW50LnNvdXJjZSBUaGUgT2JqZWN0IHRoYXQgaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURlc3Ryb3k6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgRXhjZWwgZXhwb3J0IHN0YXJ0cy4gUmV0dXJuIGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBleHBvcnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7RXhwb3J0Q29uZmlnfSBldmVudC5jb25maWcgRXhwb3J0IGNvbmZpZ1xuICAgICAqIEBwYXJhbSB7WExTQ29sdW1uW119IGV2ZW50LmNvbHVtbnMgQW4gYXJyYXkgb2YgY29sdW1ucyB0byBleHBvcnRcbiAgICAgKiBAcGFyYW0ge2FueVtdW119IGV2ZW50LnJvd3MgQW4gYXJyYXkgb2YgcmVjb3JkcyB0byBleHBvcnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVFeGNlbEV4cG9ydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNvbmZpZzogRXhwb3J0Q29uZmlnLCBjb2x1bW5zOiBYTFNDb2x1bW5bXSwgcm93czogYW55W10gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgZHJhZ2dpbmcgb2YgdGhlIEZpbGxIYW5kbGUgc3RhcnRzLCByZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBkcmFnIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC5jZWxsIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2x1bW4gLyByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSByYXcgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRmlsbEhhbmRsZURyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNlbGw6IEdyaWRMb2NhdGlvbiwgZG9tRXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIHRoZSBjZWxsIGVkaXRpbmcgaXMgZmluaXNoZWQsIHJldHVybiBmYWxzZSB0byBzaWduYWwgdGhhdCB0aGUgdmFsdWUgaXMgaW52YWxpZCBhbmQgZWRpdGluZyBzaG91bGQgbm90IGJlIGZpbmFsaXplZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuZ3JpZCBUYXJnZXQgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q2VsbEVkaXRvckNvbnRleHR9IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRmluaXNoQ2VsbEVkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncmlkOiBHcmlkLCBlZGl0b3JDb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSB0aGUgcm93IGVkaXRpbmcgaXMgZmluaXNoZWQsIHJldHVybiBmYWxzZSB0byBzaWduYWwgdGhhdCB0aGUgdmFsdWUgaXMgaW52YWxpZCBhbmQgZWRpdGluZyBzaG91bGQgbm90IGJlIGZpbmFsaXplZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2V2ZW50LWJlZm9yZUZpbmlzaFJvd0VkaXQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGFyZ2V0IGdyaWRcbiAgICAgKiBAcGFyYW0ge1Jvd0VkaXRvckNvbnRleHR9IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRmluaXNoUm93RWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIGVkaXRvckNvbnRleHQ6IFJvd0VkaXRvckNvbnRleHQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgd2lkZ2V0IGlzIGhpZGRlbi4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgaGlkZGVuLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUhpZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgYSBwYXN0ZSBhY3Rpb24gaXMgcGVyZm9ybWVkLCByZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuY2xpcGJvYXJkRGF0YSBUaGUgY2xpcGJvYXJkRGF0YSBhYm91dCB0byBiZSBwYXN0ZWRcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LnRhcmdldENlbGwgVGhlIGNlbGwgZnJvbSB3aGljaCB0aGUgcGFzdGUgd2lsbCBiZSBzdGFydGVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmVudGl0eU5hbWUgJ2NlbGwnIHRvIGRpc3Rpbmd1aXNoIHRoaXMgZXZlbnQgZnJvbSBvdGhlciBiZWZvcmVQYXN0ZSBldmVudHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQudGV4dCBUaGUgcmF3IHRleHQgZnJvbSBjbGlwYm9hcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVQYXN0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY2xpcGJvYXJkRGF0YTogc3RyaW5nLCB0YXJnZXRDZWxsOiBHcmlkTG9jYXRpb24sIGVudGl0eU5hbWU6IHN0cmluZywgdGV4dDogc3RyaW5nIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBleHBvcnQgc3RhcnRlZC4gUmV0dXJuIGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBleHBvcnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb25maWcgRXhwb3J0IGNvbmZpZ1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVBkZkV4cG9ydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNvbmZpZzogb2JqZWN0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGEgcm93IGlzIHJlbmRlcmVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGZpcmluZyBHcmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5yb3cuUm93fSBldmVudC5yb3cgVGhlIHJvdyBhYm91dCB0byBiZSByZW5kZXJlZC5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgZm9yIHRoZSByb3cuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LnJlY29yZEluZGV4IFRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSByZWNvcmQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUmVuZGVyUm93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCByb3c6IFJvdywgcmVjb3JkOiBNb2RlbCwgcmVjb3JkSW5kZXg6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogR3JpZCByb3dzIGFyZSBhYm91dCB0byBiZSByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhpcyBncmlkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVJlbmRlclJvd3M6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgYmVmb3JlIHJvdyBjb2xsYXBzZSBpcyBzdGFydGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjZXZlbnQtYmVmb3JlUm93Q29sbGFwc2UpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgUmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUm93Q29sbGFwc2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyByZWNvcmQ6IE1vZGVsIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBiZWZvcmUgcm93IGV4cGFuZCBpcyBzdGFydGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjZXZlbnQtYmVmb3JlUm93RXhwYW5kKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVJvd0V4cGFuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgdGhlIHNlbGVjdGlvbiBjaGFuZ2VzLiBSZXR1cm5pbmcgYGZhbHNlYCBmcm9tIGEgbGlzdGVuZXIgcHJldmVudHMgdGhlIGNoYW5nZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuYWN0aW9uIGAnc2VsZWN0J2AvYCdkZXNlbGVjdCdgXG4gICAgICogQHBhcmFtIHsncm93JywnY2VsbCd9IGV2ZW50Lm1vZGUgYCdyb3cnYC9gJ2NlbGwnYFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LmRlc2VsZWN0ZWQgVGhlIHJlY29yZHMgdG8gYmUgZGVzZWxlY3RlZCBpbiB0aGlzIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5zZWxlY3RlZCBUaGUgcmVjb3JkcyB0byBiZSBzZWxlY3RlZCBpbiB0aGlzIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5zZWxlY3Rpb24gVGhlIHJlY29yZHMgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBiZWZvcmUgYXBwbHlpbmcgYHNlbGVjdGVkYCBhbmQgYGRlc2VsZWN0ZWRgXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9uW119IGV2ZW50LmRlc2VsZWN0ZWRDZWxscyBUaGUgY2VsbHMgdG8gYmUgZGVzZWxlY3RlZCBpbiB0aGlzIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuc2VsZWN0ZWRDZWxscyBUaGUgY2VsbHMgdG8gYmUgc2VsZWN0ZWQgaW4gdGhpcyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9uW119IGV2ZW50LmNlbGxTZWxlY3Rpb24gVGhlIGNlbGxzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgYmVmb3JlIGFwcGx5aW5nIGBzZWxlY3RlZENlbGxzYCBhbmQgYGRlc2VsZWN0ZWRDZWxsc2BcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTZWxlY3Rpb25DaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBhY3Rpb246IHN0cmluZywgbW9kZTogJ3Jvdyd8J2NlbGwnLCBzb3VyY2U6IEdyaWQsIGRlc2VsZWN0ZWQ6IE1vZGVsW10sIHNlbGVjdGVkOiBNb2RlbFtdLCBzZWxlY3Rpb246IE1vZGVsW10sIGRlc2VsZWN0ZWRDZWxsczogR3JpZExvY2F0aW9uW10sIHNlbGVjdGVkQ2VsbHM6IEdyaWRMb2NhdGlvbltdLCBjZWxsU2VsZWN0aW9uOiBHcmlkTG9jYXRpb25bXSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSB0aGlzIGNvbnRhaW5lciB3aWxsIGxvYWQgcmVjb3JkIHZhbHVlcyBpbnRvIGl0cyBjaGlsZCBmaWVsZHMuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdVxuICAgICAqIHdhbnQgdG8gbW9kaWZ5IHRoZSBVSSBiZWZvcmUgZGF0YSBpcyBsb2FkZWQgKGUuZy4gc2V0IHNvbWUgaW5wdXQgZmllbGQgdG8gYmUgcmVhZG9ubHkpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuQ29udGFpbmVyfSBldmVudC5zb3VyY2UgVGhlIGNvbnRhaW5lclxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVNldFJlY29yZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ29udGFpbmVyLCByZWNvcmQ6IE1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgd2lkZ2V0IGlzIHNob3duLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0LGFueX0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgc2hvd25cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXR8YW55IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBlZGl0aW5nIHN0YXJ0cywgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCBlZGl0aW5nXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHtSb3dFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVN0YXJ0Um93RWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZWRpdG9yQ29udGV4dDogUm93RWRpdG9yQ29udGV4dCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBzdGF0ZSBpcyBhcHBsaWVkIHRvIHRoZSBzb3VyY2UuIEFsbG93cyBlZGl0aW5nIHRoZSBzdGF0ZSBvYmplY3Qgb3IgcHJldmVudGluZyB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWRTdGF0ZUluZm99IGV2ZW50LnN0YXRlIFN0YXRlIG9iamVjdCBjb25maWdcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTdGF0ZUFwcGx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc3RhdGU6IEdyaWRTdGF0ZUluZm8gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgc3RhdGUgaXMgc2F2ZWQgYnkgdGhlIFN0YXRlUHJvdmlkZXIuIEFsbG93cyBlZGl0aW5nIHRoZSBzdGF0ZSBvYmplY3Qgb3IgcHJldmVudGluZyB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWRTdGF0ZUluZm99IGV2ZW50LnN0YXRlIFN0YXRlIG9iamVjdCBjb25maWdcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTdGF0ZVNhdmU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzdGF0ZTogR3JpZFN0YXRlSW5mbyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBncm91cCBpcyBnb2luZyB0byBiZSBleHBhbmRlZCBvciBjb2xsYXBzZWQgdXNpbmcgdGhlIFVJLlxuICAgICAqIFJldHVybmluZyBgZmFsc2VgIGZyb20gYSBsaXN0ZW5lciBwcmV2ZW50cyB0aGUgb3BlcmF0aW9uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5ncm91cFJlY29yZCBbREVQUkVDQVRFRF0gVXNlIGBncm91cFJlY29yZHNgIHBhcmFtIGluc3RlYWRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5ncm91cFJlY29yZHMgVGhlIGdyb3VwIHJlY29yZHMgYmVpbmcgdG9nZ2xlZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29sbGFwc2UgQ29sbGFwc2VkICh0cnVlKSBvciBleHBhbmRlZCAoZmFsc2UpXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIHVzZXIgaW50ZXJhY3Rpb24gZXZlbnQgKGVnIGEgYGNsaWNrYCBldmVudCkgaWYgdGhlIHRvZ2dsZSByZXF1ZXN0IHdhcyBpbnN0aWdhdGVkIGJ5IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlVG9nZ2xlR3JvdXA6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncm91cFJlY29yZDogTW9kZWwsIGdyb3VwUmVjb3JkczogTW9kZWxbXSwgY29sbGFwc2U6IGJvb2xlYW4sIGRvbUV2ZW50OiBFdmVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBhIHBhcmVudCBub2RlIHJlY29yZCB0b2dnbGVzIGl0cyBjb2xsYXBzZWQgc3RhdGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIGJlaW5nIHRvZ2dsZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb2xsYXBzZSBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYmVpbmcgY29sbGFwc2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVRvZ2dsZU5vZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbGxhcHNlOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgd2hlbiBlZGl0aW5nIGlzIGNhbmNlbGxlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQuZWRpdG9yQ29udGV4dCBFZGl0aW5nIGNvbnRleHRcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBJbmNsdWRlZCBpZiB0aGUgY2FuY2VsbGF0aW9uIHdhcyB0cmlnZ2VyZWQgYnkgYSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DYW5jZWxDZWxsRWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZWRpdG9yQ29udGV4dDogR3JpZExvY2F0aW9uLCBldmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW55IG90aGVyIGV2ZW50IGlzIGZpcmVkIGZyb20gdGhlIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2V2ZW50LWNhdGNoQWxsKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3tba2V5OiBzdHJpbmddOiBhbnksIHR5cGU6IHN0cmluZ319IGV2ZW50LmV2ZW50IFRoZSBPYmplY3QgdGhhdCBjb250YWlucyBldmVudCBkZXRhaWxzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmV2ZW50LnR5cGUgVGhlIHR5cGUgb2YgdGhlIGV2ZW50IHdoaWNoIGlzIGNhdWdodCBieSB0aGUgbGlzdGVuZXJcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DYXRjaEFsbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7W2tleTogc3RyaW5nXTogYW55LCB0eXBlOiBzdHJpbmd9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB1c2VyIGNsaWNrcyBpbiBhIGdyaWQgY2VsbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgcm93XG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIHRvIHdoaWNoIHRoZSBjZWxsIGJlbG9uZ3NcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIHRhcmdldDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHVzZXIgYWN0aXZhdGVzIGNvbnRleHRtZW51IGluIGEgZ3JpZCBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSByb3dcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gdG8gd2hpY2ggdGhlIGNlbGwgYmVsb25nc1xuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRhcmdldCBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbENvbnRleHRNZW51OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdXNlciBkb3VibGUgY2xpY2tzIGEgZ3JpZCBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSByb3dcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gdG8gd2hpY2ggdGhlIGNlbGwgYmVsb25nc1xuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRhcmdldCBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbERibENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBncmlkIGJlZm9yZSB0aGUgY29udGV4dCBtZW51IGlzIHNob3duIGZvciBhIGNlbGwuXG4gICAgICogQWxsb3dzIG1hbmlwdWxhdGlvbiBvZiB0aGUgaXRlbXMgdG8gc2hvdyBpbiB0aGUgc2FtZSB3YXkgYXMgaW4gdGhlIFtwcm9jZXNzSXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ2VsbE1lbnUjY29uZmlnLXByb2Nlc3NJdGVtcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNldmVudC1jZWxsTWVudUJlZm9yZVNob3cpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT59IGV2ZW50Lml0ZW1zIE1lbnUgaXRlbSBjb25maWdzXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBDb2x1bW5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNZW51QmVmb3JlU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgbWVudTogTWVudSwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCBjb2x1bW46IENvbHVtbiwgcmVjb3JkOiBNb2RlbCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBncmlkIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgY2VsbCBjb250ZXh0IG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudUl0ZW19IGV2ZW50Lml0ZW0gU2VsZWN0ZWQgbWVudSBpdGVtXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBDb2x1bW5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNZW51SXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgbWVudTogTWVudSwgaXRlbTogTWVudUl0ZW0sIGNvbHVtbjogQ29sdW1uLCByZWNvcmQ6IE1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgZ3JpZCBhZnRlciB0aGUgY29udGV4dCBtZW51IGlzIHNob3duIGZvciBhIGNlbGwuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT59IGV2ZW50Lml0ZW1zIE1lbnUgaXRlbSBjb25maWdzXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBDb2x1bW5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNZW51U2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgbWVudTogTWVudSwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCBjb2x1bW46IENvbHVtbiwgcmVjb3JkOiBNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIGdyaWQgd2hlbiBhIGNoZWNrIGl0ZW0gaXMgdG9nZ2xlZCBpbiB0aGUgY2VsbCBjb250ZXh0IG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudUl0ZW19IGV2ZW50Lml0ZW0gU2VsZWN0ZWQgbWVudSBpdGVtXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBDb2x1bW5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFJlY29yZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY2hlY2tlZCBDaGVja2VkIG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNZW51VG9nZ2xlSXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgbWVudTogTWVudSwgaXRlbTogTWVudUl0ZW0sIGNvbHVtbjogQ29sdW1uLCByZWNvcmQ6IE1vZGVsLCBjaGVja2VkOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBtb3VzZSBlbnRlcnMgYSBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCByZXByZXNlbnRpbmcgdGhlIGhvdmVyZWQgY2VsbFxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGNvbHVtbiBjdXJyZW50bHkgaG92ZXJlZFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTW91c2VFbnRlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIG1vdXNlIGxlYXZlcyBhIGNlbGxcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgY2VsbCB0aGF0IHRoZSBtb3VzZSBsZWZ0XG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIHJlcHJlc2VudGluZyB0aGUgY2VsbCB0aGF0IHRoZSBtb3VzZSBsZWZ0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuY2VsbEVsZW1lbnQgVGhlIGNlbGwgSFRNTCBlbGVtZW50IHRoYXQgdGhlIG1vdXNlIGxlZnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbE1vdXNlTGVhdmU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgdXNlciBtb3ZlcyB0aGUgbW91c2Ugb3V0IG9mIGEgZ3JpZCBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSByb3dcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gdG8gd2hpY2ggdGhlIGNlbGwgYmVsb25nc1xuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRhcmdldCBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbE1vdXNlT3V0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdXNlciBtb3ZlcyB0aGUgbW91c2Ugb3ZlciBhIGdyaWQgY2VsbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgcm93XG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIHRvIHdoaWNoIHRoZSBjZWxsIGJlbG9uZ3NcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNb3VzZU92ZXI6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncmlkOiBHcmlkLCByZWNvcmQ6IE1vZGVsLCBjb2x1bW46IENvbHVtbiwgY2VsbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0YXJnZXQ6IEhUTUxFbGVtZW50LCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIFBhbmVsIGlzIGNvbGxhcHNlZCB1c2luZyB0aGUgW2NvbGxhcHNpYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNpYmxlKSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlBhbmVsfSBldmVudC5zb3VyY2UgVGhpcyBQYW5lbC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogUGFuZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBhIHBhcmVudCBub2RlIHJlY29yZCBpcyBjb2xsYXBzZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHdoaWNoIGhhcyBiZWVuIGNvbGxhcHNlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2xsYXBzZU5vZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGNvbHVtbiBpcyBiZWluZyBkcmFnZ2VkLCBhbmQgeW91IGNhbiBzZXQgdGhlIGB2YWxpZGAgZmxhZyBvbiB0aGUgYGNvbnRleHRgIG9iamVjdFxuICAgICAqIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gaXMgdmFsaWQgb3Igbm90LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgZHJhZ2dlZCBjb2x1bW4uXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50Lmluc2VydEJlZm9yZSBUaGUgY29sdW1uIGJlZm9yZSB3aGljaCB0aGUgZHJhZ2dlZCBjb2x1bW4gd2lsbCBiZSBpbnNlcnRlZCAoaWYgbm90IGxhc3QpLlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBicm93c2VyIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb250ZXh0LnZhbGlkIFNldCB0aGlzIHRvIGB0cnVlYCBvciBgZmFsc2VgIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gaXMgdmFsaWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uRHJhZzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY29sdW1uOiBDb2x1bW4sIGluc2VydEJlZm9yZTogQ29sdW1uLCBldmVudDogRXZlbnQsIGNvbnRleHQ6IHsgdmFsaWQ6IGJvb2xlYW4gfSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgY29sdW1uIGRyYWcgZ2VzdHVyZSBoYXMgc3RhcnRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGRyYWdnZWQgY29sdW1uLlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBicm93c2VyIGV2ZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtbkRyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY29sdW1uOiBDb2x1bW4sIGV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBhbHdheXMgZmlyZWQgYWZ0ZXIgYSBjb2x1bW4gaXMgZHJvcHBlZC4gVGhlIGB2YWxpZGAgcGFyYW0gaXMgYHRydWVgIGlmIHRoZSBvcGVyYXRpb24gd2FzIG5vdFxuICAgICAqIHZldG9lZCBhbmQgdGhlIGNvbHVtbiB3YXMgbW92ZWQgaW4gdGhlIGNvbHVtbiBzdG9yZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGRyYWdnZWQgY29sdW1uLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5pbnNlcnRCZWZvcmUgVGhlIGNvbHVtbiBiZWZvcmUgd2hpY2ggdGhlIGRyYWdnZWQgY29sdW1uIHdpbGwgYmUgaW5zZXJ0ZWQuXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50Lm5ld1BhcmVudCBUaGUgbmV3IHBhcmVudCBjb2x1bW4uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC52YWxpZCBgdHJ1ZWAgaWYgdGhlIG9wZXJhdGlvbiB3YXMgbm90IHZldG9lZC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQucmVnaW9uIFRoZSByZWdpb24gd2hlcmUgdGhlIGNvbHVtbiB3YXMgZHJvcHBlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5Ecm9wOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjb2x1bW46IENvbHVtbiwgaW5zZXJ0QmVmb3JlOiBDb2x1bW4sIG5ld1BhcmVudDogQ29sdW1uLCB2YWxpZDogYm9vbGVhbiwgZXZlbnQ6IEV2ZW50LCByZWdpb246IHN0cmluZyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSByZXNpemUgZ2VzdHVyZSBpcyBjb21wbGV0ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIHJlc2l6ZWQgY29sdW1uXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5SZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBkb21FdmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGNvbHVtbiByZXNpemUgZ2VzdHVyZSBzdGFydHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGNvbHVtblxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBicm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uUmVzaXplU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBkb21FdmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyB3aWRnZXQgd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkIGluIHRoZSBjb250ZXh0IG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIG93bmluZyB3aWRnZXRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbnRleHRNZW51SXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIHdpZGdldCB3aGVuIGEgY2hlY2sgaXRlbSBpcyB0b2dnbGVkIGluIHRoZSBjb250ZXh0IG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIG93bmluZyB3aWRnZXRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY2hlY2tlZCBDaGVja2VkIG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbnRleHRNZW51VG9nZ2xlSXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSwgY2hlY2tlZDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGFmdGVyIGEgY29weSBhY3Rpb24gaXMgcGVyZm9ybWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbltdfSBldmVudC5jZWxscyBUaGUgY2VsbHMgYWJvdXQgdG8gYmUgY29waWVkIG9yIGN1dFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5jb3BpZWREYXRhU3RyaW5nIFRoZSBjb25jYXRlbmF0ZWQgZGF0YSBzdHJpbmcgdGhhdCB3YXMgY29waWVkIG9yIGN1dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNDdXQgYHRydWVgIGlmIHRoaXMgd2FzIGEgY3V0IGFjdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5lbnRpdHlOYW1lICdjZWxsJyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgY29weSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db3B5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjZWxsczogR3JpZExvY2F0aW9uW10sIGNvcGllZERhdGFTdHJpbmc6IHN0cmluZywgaXNDdXQ6IGJvb2xlYW4sIGVudGl0eU5hbWU6IHN0cmluZyB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBkYXRhIGluIHRoZSBzdG9yZSBjaGFuZ2VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjZXZlbnQtZGF0YUNoYW5nZSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmluZyBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuU3RvcmV9IGV2ZW50LnN0b3JlIFRoZSBvcmlnaW5hdGluZyBzdG9yZVxuICAgICAqIEBwYXJhbSB7J3JlbW92ZScsJ3JlbW92ZUFsbCcsJ2FkZCcsJ2NsZWFyY2hhbmdlcycsJ2ZpbHRlcicsJ3VwZGF0ZScsJ2RhdGFzZXQnLCdyZXBsYWNlJ30gZXZlbnQuYWN0aW9uIE5hbWUgb2YgYWN0aW9uIHdoaWNoIHRyaWdnZXJlZCB0aGUgY2hhbmdlLiBNYXkgYmUgb25lIG9mOiAgKiBgJ3JlbW92ZSdgICogYCdyZW1vdmVBbGwnYCAqIGAnYWRkJ2AgKiBgJ2NsZWFyY2hhbmdlcydgICogYCdmaWx0ZXInYCAqIGAndXBkYXRlJ2AgKiBgJ2RhdGFzZXQnYCAqIGAncmVwbGFjZSdgXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBDaGFuZ2VkIHJlY29yZCwgZm9yIGFjdGlvbnMgdGhhdCBhZmZlY3RzIGV4YWN0bHkgb25lIHJlY29yZCAoYCd1cGRhdGUnYClcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5yZWNvcmRzIENoYW5nZWQgcmVjb3JkcywgcGFzc2VkIGZvciBhbGwgYWN0aW9ucyBleGNlcHQgYCdyZW1vdmVBbGwnYFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jaGFuZ2VzIFBhc3NlZCBmb3IgdGhlIGAndXBkYXRlJ2AgYWN0aW9uLCBpbmZvIG9uIHdoaWNoIHJlY29yZCBmaWVsZHMgY2hhbmdlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRhdGFDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHN0b3JlOiBTdG9yZSwgYWN0aW9uOiAncmVtb3ZlJ3wncmVtb3ZlQWxsJ3wnYWRkJ3wnY2xlYXJjaGFuZ2VzJ3wnZmlsdGVyJ3wndXBkYXRlJ3wnZGF0YXNldCd8J3JlcGxhY2UnLCByZWNvcmQ6IE1vZGVsLCByZWNvcmRzOiBNb2RlbFtdLCBjaGFuZ2VzOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW4gb2JqZWN0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLkJhc2V9IGV2ZW50LnNvdXJjZSBUaGUgT2JqZWN0IHRoYXQgaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRlc3Ryb3k6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtdXRhdGVkIGFuZCB0aGUgc3RhdGUgb2YgdGhlIFtoYXNDaGFuZ2VzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI3Byb3BlcnR5LWhhc0NoYW5nZXMpIHByb3BlcnR5IGNoYW5nZXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Db250YWluZXJ9IGV2ZW50LnNvdXJjZSBUaGUgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZGlydHkgVGhlIGRpcnR5IHN0YXRlIG9mIHRoZSBDb250YWluZXIgLSBgdHJ1ZWAgaWYgdGhlcmUgYXJlIGFueSBmaWVsZHMgd2hpY2ggaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgaW5pdGlhbCBsb2FkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRpcnR5U3RhdGVDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENvbnRhaW5lciwgZGlydHk6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoaWxlIGRyYWcgc2VsZWN0aW5nLiBVSSB3aWxsIHVwZGF0ZSB3aXRoIGN1cnJlbnQgcmFuZ2UsIGJ1dCB0aGUgY2VsbHMgd2lsbCBub3QgYmUgc2VsZWN0ZWQgdW50aWxcbiAgICAgKiBtb3VzZSB1cC4gVGhpcyBldmVudCBjYW4gYmUgbGlzdGVuZWQgZm9yIHRvIHBlcmZvcm0gYWN0aW9ucyB3aGlsZSBkcmFnIHNlbGVjdGluZy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtHcmlkTG9jYXRpb25Db25maWdbXSxHcmlkLnV0aWwuR3JpZExvY2F0aW9uW119IGV2ZW50LnNlbGVjdGVkQ2VsbHMgVGhlIGNlbGxzIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGRyYWdnZWQgb3ZlclxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnNlbGVjdGVkUmVjb3JkcyBUaGUgcmVjb3JkcyB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBkcmFnZ2VkIG92ZXJcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EcmFnU2VsZWN0aW5nOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBzZWxlY3RlZENlbGxzOiBHcmlkTG9jYXRpb25Db25maWdbXXxHcmlkTG9jYXRpb25bXSwgc2VsZWN0ZWRSZWNvcmRzOiBNb2RlbFtdIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHdpZGdldCdzIFtlbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWVsZW1lbnQpIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZWxlbWVudCBUaGUgV2lkZ2V0J3MgZWxlbWVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FbGVtZW50Q3JlYXRlZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGVsZW1lbnQ6IEhUTUxFbGVtZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgUGFuZWwgaXMgZXhwYW5kZWQgdXNpbmcgdGhlIFtjb2xsYXBzaWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzaWJsZSkgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5QYW5lbH0gZXZlbnQuc291cmNlIFRoaXMgUGFuZWwuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXhwYW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBQYW5lbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYWZ0ZXIgYSBwYXJlbnQgbm9kZSByZWNvcmQgaXMgZXhwYW5kZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHdoaWNoIGhhcyBiZWVuIGV4cGFuZGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV4cGFuZE5vZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBmaWxlIGlzIGRyb3BwZWQgb24gdGhlIHdpZGdldCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgb3duaW5nIEdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0RhdGFUcmFuc2Zlckl0ZW19IGV2ZW50LmZpbGUgVGhlIGRyb3BwZWQgZmlsZSBkZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIHtEcmFnRXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBuYXRpdmUgRHJhZ0V2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRmlsZURyb3A6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGZpbGU6IERhdGFUcmFuc2Zlckl0ZW0sIGRvbUV2ZW50OiBEcmFnRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSB0aGUgRmlsbEhhbmRsZSBkcmFnZ2luZyBpcyBmaW5hbGl6ZWQgYW5kIHZhbHVlcyBhcmUgYXBwbGllZCB0byBjZWxscywgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGVcbiAgICAgKiBkcmFnIG9wZXJhdGlvbiBmcm9tIGFwcGx5aW5nIGRhdGEgY2hhbmdlcy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC5mcm9tIFRoZSBmcm9tIGNlbGxcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LnRvIFRoZSB0byBjZWxsXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcmF3IERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbGxIYW5kbGVCZWZvcmVEcmFnRmluYWxpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBmcm9tOiBHcmlkTG9jYXRpb24sIHRvOiBHcmlkTG9jYXRpb24sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hpbGUgZHJhZ2dpbmcgdGhlIEZpbGxIYW5kbGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQuZnJvbSBUaGUgZnJvbSBjZWxsXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC50byBUaGUgdG8gY2VsbFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIHJhdyBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25GaWxsSGFuZGxlRHJhZzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGZyb206IEdyaWRMb2NhdGlvbiwgdG86IEdyaWRMb2NhdGlvbiwgZG9tRXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBGaWxsSGFuZGxlIGRyYWcgb3BlcmF0aW9uIGlzIGFib3J0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRmlsbEhhbmRsZURyYWdBYm9ydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKCkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGFmdGVyIGEgRmlsbEhhbmRsZSBkcmFnIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC5mcm9tIFRoZSBmcm9tIGNlbGxcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LnRvIFRoZSB0byBjZWxsXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcmF3IERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbGxIYW5kbGVEcmFnRW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZnJvbTogR3JpZExvY2F0aW9uLCB0bzogR3JpZExvY2F0aW9uLCBkb21FdmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBkcmFnZ2luZyBvZiB0aGUgRmlsbEhhbmRsZSBzdGFydHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQuY2VsbCBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sdW1uIC8gcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcmF3IERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbGxIYW5kbGVEcmFnU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjZWxsOiBHcmlkTG9jYXRpb24sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIHdoZW4gY2VsbCBlZGl0aW5nIGlzIGZpbmlzaGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGFyZ2V0IGdyaWRcbiAgICAgKiBAcGFyYW0ge0NlbGxFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbmlzaENlbGxFZGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgZWRpdG9yQ29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgdGhlIHJvdyBlZGl0aW5nIGlzIGZpbmlzaGVkLCByZXR1cm4gZmFsc2UgdG8gc2lnbmFsIHRoYXQgdGhlIHZhbHVlIGlzIGludmFsaWQgYW5kIGVkaXRpbmcgc2hvdWxkIG5vdCBiZSBmaW5hbGl6ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZCNldmVudC1maW5pc2hSb3dFZGl0KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRhcmdldCBncmlkXG4gICAgICogQHBhcmFtIHtSb3dFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbmlzaFJvd0VkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncmlkOiBHcmlkLCBlZGl0b3JDb250ZXh0OiBSb3dFZGl0b3JDb250ZXh0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBmb2N1cyBlbnRlcnMgdGhpcyBXaWRnZXQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBXaWRnZXRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5mcm9tRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRvRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LmZyb21XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC50b1dpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmJhY2t3YXJkcyBgdHJ1ZWAgaWYgdGhlIGB0b0VsZW1lbnRgIGlzIGJlZm9yZSB0aGUgYGZyb21FbGVtZW50YCBpbiBkb2N1bWVudCBvcmRlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Gb2N1c0luOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIGZyb21FbGVtZW50OiBIVE1MRWxlbWVudCwgdG9FbGVtZW50OiBIVE1MRWxlbWVudCwgZnJvbVdpZGdldDogV2lkZ2V0LCB0b1dpZGdldDogV2lkZ2V0LCBiYWNrd2FyZHM6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZm9jdXMgZXhpdHMgdGhpcyBXaWRnZXQncyBvd25lcnNoaXAgdHJlZS4gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBhIGBibHVyYCBldmVudC5cbiAgICAgKiBmb2N1cyBtb3ZpbmcgZnJvbSB3aXRoaW4gdGhpcyBXaWRnZXQncyBvd25lcnNoaXAgdHJlZSwgZXZlbiBpZiB0aGVyZSBhcmUgZmxvYXRpbmcgd2lkZ2V0c1xuICAgICAqIHdpbGwgbm90IHRyaWdnZXIgdGhpcyBldmVudC4gVGhpcyBpcyB3aGVuIGZvY3VzIGV4aXRzIHRoaXMgd2lkZ2V0IGNvbXBsZXRlbHkuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBXaWRnZXRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5mcm9tRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRvRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LmZyb21XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC50b1dpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmJhY2t3YXJkcyBgdHJ1ZWAgaWYgdGhlIGB0b0VsZW1lbnRgIGlzIGJlZm9yZSB0aGUgYGZyb21FbGVtZW50YCBpbiBkb2N1bWVudCBvcmRlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Gb2N1c091dDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBmcm9tRWxlbWVudDogSFRNTEVsZW1lbnQsIHRvRWxlbWVudDogSFRNTEVsZW1lbnQsIGZyb21XaWRnZXQ6IFdpZGdldCwgdG9XaWRnZXQ6IFdpZGdldCwgYmFja3dhcmRzOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgZHJhZ2dpbmcgc3RhcnRzLCByZXR1cm4gZmFsc2UgdG8gcHJldmVudCB0aGUgZHJhZyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LmNvbnRleHQucmVjb3JkcyBUaGUgZHJhZ2dlZCByb3cgcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudCxUb3VjaEV2ZW50fSBldmVudC5ldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkdyaWRSb3dCZWZvcmVEcmFnU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWRCYXNlLCBjb250ZXh0OiB7IHJlY29yZHM6IE1vZGVsW10gfSwgZXZlbnQ6IE1vdXNlRXZlbnR8VG91Y2hFdmVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSB0aGUgcm93IGRyb3Agb3BlcmF0aW9uIGlzIGZpbmFsaXplZC4gWW91IGNhbiByZXR1cm4gZmFsc2UgdG8gYWJvcnQgdGhlIGRyb3Agb3BlcmF0aW9uLCBvciBhXG4gICAgICogUHJvbWlzZSB5aWVsZGluZyBgdHJ1ZWAgLyBgZmFsc2VgIHdoaWNoIGFsbG93cyBmb3IgYXN5bmNocm9ub3VzIGFib3J0IChlLmcuIGZpcnN0IHNob3cgdXNlciBhIGNvbmZpcm1hdGlvbiBkaWFsb2cpLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkQmFzZX0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNvbnRleHRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbnRleHQudmFsaWQgU2V0IHRoaXMgdG8gdHJ1ZSBvciBmYWxzZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBkcm9wIHBvc2l0aW9uIGlzIHZhbGlkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQuaW5zZXJ0QmVmb3JlIFRoZSByZWNvcmQgdG8gaW5zZXJ0IGJlZm9yZSAoYG51bGxgIGlmIGluc2VydGluZyBhdCBsYXN0IHBvc2l0aW9uIG9mIGEgcGFyZW50IG5vZGUpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQucGFyZW50IFRoZSBwYXJlbnQgcmVjb3JkIG9mIHRoZSBjdXJyZW50IGRyb3AgcG9zaXRpb24gKG9ubHkgYXBwbGljYWJsZSBmb3IgdHJlZXMpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtSZWNvcmRQb3NpdGlvbkNvbnRleHRbXX0gZXZlbnQuY29udGV4dC5vbGRQb3NpdGlvbkNvbnRleHQgQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91cyB0cmVlIHBvc2l0aW9uLiBPYmplY3RzIGNvbnRhaW4gdGhlIGByZWNvcmRgLCBhbmQgaXRzIG9yaWdpbmFsIGBwYXJlbnRJbmRleGAgYW5kIGBwYXJlbnRJZGAgdmFsdWVzXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkdyaWRSb3dCZWZvcmVEcm9wRmluYWxpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWRCYXNlLCBjb250ZXh0OiB7IHZhbGlkOiBib29sZWFuLCBpbnNlcnRCZWZvcmU6IE1vZGVsLCBwYXJlbnQ6IE1vZGVsLCByZWNvcmRzOiBNb2RlbFtdLCBvbGRQb3NpdGlvbkNvbnRleHQ6IFJlY29yZFBvc2l0aW9uQ29udGV4dFtdIH0sIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hpbGUgdGhlIHJvdyBpcyBiZWluZyBkcmFnZ2VkLCBpbiB0aGUgbGlzdGVuZXIgZnVuY3Rpb24geW91IGhhdmUgYWNjZXNzIHRvIGBjb250ZXh0Lmluc2VydEJlZm9yZWAgYSBncmlkIC9cbiAgICAgKiB0cmVlIHJlY29yZCwgYW5kIGFkZGl0aW9uYWxseSBgY29udGV4dC5wYXJlbnRgIChhIFRyZWVOb2RlKSBmb3IgdHJlZXMuIFlvdSBjYW4gc2lnbmFsIHRoYXQgdGhlIGRyb3AgcG9zaXRpb24gaXNcbiAgICAgKiB2YWxpZCBvciBpbnZhbGlkIGJ5IHNldHRpbmcgYGNvbnRleHQudmFsaWQgPSBmYWxzZTtgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29udGV4dC52YWxpZCBTZXQgdGhpcyB0byB0cnVlIG9yIGZhbHNlIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gaXMgdmFsaWQuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQuaW5zZXJ0QmVmb3JlIFRoZSByZWNvcmQgdG8gaW5zZXJ0IGJlZm9yZSAoYG51bGxgIGlmIGluc2VydGluZyBhdCBsYXN0IHBvc2l0aW9uIG9mIGEgcGFyZW50IG5vZGUpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQucGFyZW50IFRoZSBwYXJlbnQgcmVjb3JkIG9mIHRoZSBjdXJyZW50IGRyb3AgcG9zaXRpb24gKG9ubHkgYXBwbGljYWJsZSBmb3IgdHJlZXMpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkdyaWRSb3dEcmFnOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkQmFzZSwgY29udGV4dDogeyB2YWxpZDogYm9vbGVhbiwgaW5zZXJ0QmVmb3JlOiBNb2RlbCwgcGFyZW50OiBNb2RlbCwgcmVjb3JkczogTW9kZWxbXSB9LCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHJvdyBkcmFnIG9wZXJhdGlvbiBpcyBhYm9ydGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LmNvbnRleHQucmVjb3JkcyBUaGUgZHJhZ2dlZCByb3cgcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25HcmlkUm93RHJhZ0Fib3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkQmFzZSwgY29udGV4dDogeyByZWNvcmRzOiBNb2RlbFtdIH0sIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGRyYWdnaW5nIHN0YXJ0cy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LnNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50LFRvdWNoRXZlbnR9IGV2ZW50LmV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uR3JpZFJvd0RyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZEJhc2UsIGNvbnRleHQ6IHsgcmVjb3JkczogTW9kZWxbXSB9LCBldmVudDogTW91c2VFdmVudHxUb3VjaEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBhZnRlciB0aGUgcm93IGRyb3Agb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQsIHJlZ2FyZGxlc3Mgb2YgdmFsaWRpdHlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LnNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb250ZXh0LnZhbGlkIHRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gd2FzIHZhbGlkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQuaW5zZXJ0QmVmb3JlIFRoZSByZWNvcmQgdG8gaW5zZXJ0IGJlZm9yZSAoYG51bGxgIGlmIGluc2VydGluZyBhdCBsYXN0IHBvc2l0aW9uIG9mIGEgcGFyZW50IG5vZGUpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQucGFyZW50IFRoZSBwYXJlbnQgcmVjb3JkIG9mIHRoZSBjdXJyZW50IGRyb3AgcG9zaXRpb24gKG9ubHkgYXBwbGljYWJsZSBmb3IgdHJlZXMpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtSZWNvcmRQb3NpdGlvbkNvbnRleHRbXX0gZXZlbnQuY29udGV4dC5vbGRQb3NpdGlvbkNvbnRleHQgQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91cyB0cmVlIHBvc2l0aW9uLiBPYmplY3RzIGNvbnRhaW4gdGhlIHJlY29yZCwgYW5kIGl0cyBvcmlnaW5hbCBgcGFyZW50SW5kZXhgIGFuZCBgcGFyZW50SWRgIHZhbHVlc1xuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25HcmlkUm93RHJvcDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZEJhc2UsIGNvbnRleHQ6IHsgdmFsaWQ6IGJvb2xlYW4sIGluc2VydEJlZm9yZTogTW9kZWwsIHBhcmVudDogTW9kZWwsIHJlY29yZHM6IE1vZGVsW10sIG9sZFBvc2l0aW9uQ29udGV4dDogUmVjb3JkUG9zaXRpb25Db250ZXh0W10gfSwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBncmlkIGhlYWRlciBpcyBjbGlja2VkIG9uLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjZXZlbnQtaGVhZGVyQ2xpY2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSB0cmlnZ2VyaW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gY2xpY2tlZCBvbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IZWFkZXJDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGRvbUV2ZW50OiBFdmVudCwgY29sdW1uOiBDb2x1bW4gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgdGhlIGNvbnRleHQgbWVudSBpcyBzaG93biBmb3IgYSBoZWFkZXIuXG4gICAgICogQWxsb3dzIG1hbmlwdWxhdGlvbiBvZiB0aGUgaXRlbXMgdG8gc2hvdyBpbiB0aGUgc2FtZSB3YXkgYXMgaW4gdGhlIFtwcm9jZXNzSXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvSGVhZGVyTWVudSNjb25maWctcHJvY2Vzc0l0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2V2ZW50LWhlYWRlck1lbnVCZWZvcmVTaG93KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gQ29sdW1uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGVhZGVyTWVudUJlZm9yZVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIG1lbnU6IE1lbnUsIGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5PiwgY29sdW1uOiBDb2x1bW4gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQgaW4gdGhlIGhlYWRlciBjb250ZXh0IG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudUl0ZW19IGV2ZW50Lml0ZW0gU2VsZWN0ZWQgbWVudSBpdGVtXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBDb2x1bW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IZWFkZXJNZW51SXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgbWVudTogTWVudSwgaXRlbTogTWVudUl0ZW0sIGNvbHVtbjogQ29sdW1uIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBhZnRlciB0aGUgY29udGV4dCBtZW51IGlzIHNob3duIGZvciBhIGhlYWRlclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gQ29sdW1uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGVhZGVyTWVudVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIG1lbnU6IE1lbnUsIGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5PiwgY29sdW1uOiBDb2x1bW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBHcmlkIHdoZW4gYSBjaGVjayBpdGVtIGlzIHRvZ2dsZWQgaW4gdGhlIGhlYWRlciBjb250ZXh0IG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudUl0ZW19IGV2ZW50Lml0ZW0gU2VsZWN0ZWQgbWVudSBpdGVtXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBDb2x1bW5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNoZWNrZWQgQ2hlY2tlZCBvciBub3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IZWFkZXJNZW51VG9nZ2xlSXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgbWVudTogTWVudSwgaXRlbTogTWVudUl0ZW0sIGNvbHVtbjogQ29sdW1uLCBjaGVja2VkOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYWZ0ZXIgYSB3aWRnZXQgd2FzIGhpZGRlblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IaWRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gcm93IGxvY2tpbmcgaXMgZW5hYmxlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LmNsb25lIFRoZSBjcmVhdGVkIGNsb25lXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTG9ja1Jvd3M6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjbG9uZTogR3JpZEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIE1vdXNlIG1vdmVkIG91dCBmcm9tIGVsZW1lbnQgaW4gZ3JpZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgYnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbk1vdXNlT3V0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIE1vdXNlIG1vdmVkIGluIG92ZXIgZWxlbWVudCBpbiBncmlkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgVGhlIG5hdGl2ZSBicm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTW91c2VPdmVyOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgd2lkZ2V0IHdoaWNoIGhhZCBiZWVuIGluIGEgbm9uLXZpc2libGUgc3RhdGUgZm9yIGFueSByZWFzb25cbiAgICAgKiBhY2hpZXZlcyB2aXNpYmlsaXR5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQjZXZlbnQtcGFpbnQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBwYWludGVkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZmlyc3RQYWludCBgdHJ1ZWAgaWYgdGhpcyBpcyB0aGUgZmlyc3QgcGFpbnQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUGFpbnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZmlyc3RQYWludDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGFmdGVyIGEgcGFzdGUgYWN0aW9uIGlzIHBlcmZvcm1lZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuY2xpcGJvYXJkRGF0YSBUaGUgY2xpcGJvYXJkRGF0YSB0aGF0IHdhcyBwYXN0ZWRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5tb2RpZmllZFJlY29yZHMgVGhlIHJlY29yZHMgd2hpY2ggaGF2ZSBiZWVuIG1vZGlmaWVkIGR1ZSB0byB0aGUgcGFzdGUgYWN0aW9uXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC50YXJnZXRDZWxsIFRoZSBjZWxsIGZyb20gd2hpY2ggdGhlIHBhc3RlIHdpbGwgYmUgc3RhcnRlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5lbnRpdHlOYW1lICdjZWxsJyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgcGFzdGUgZXZlbnRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUGFzdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNsaXBib2FyZERhdGE6IHN0cmluZywgbW9kaWZpZWRSZWNvcmRzOiBNb2RlbFtdLCB0YXJnZXRDZWxsOiBHcmlkTG9jYXRpb24sIGVudGl0eU5hbWU6IHN0cmluZyB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIHdoZW4gZXhwb3J0IGhhcyBmaW5pc2hlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Jlc3BvbnNlfSBldmVudC5yZXNwb25zZSBPcHRpb25hbCByZXNwb25zZSwgaWYgcmVjZWl2ZWRcbiAgICAgKiBAcGFyYW0ge0Vycm9yfSBldmVudC5lcnJvciBPcHRpb25hbCBlcnJvciwgaWYgZXhjZXB0aW9uIG9jY3VycmVkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUGRmRXhwb3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVzcG9uc2U/OiBhbnksIGVycm9yPzogRXJyb3IgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBXaWRnZXQncyByZWFkIG9ubHkgc3RhdGUgaXMgdG9nZ2xlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LnJlYWRPbmx5IFJlYWQgb25seSBvciBub3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZWFkT25seTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlYWRPbmx5OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGEgd2lkZ2V0J3MgZWxlbWVudHMgaGF2ZSBiZWVuIHN5bmNocm9uaXplZCBkdWUgdG8gYSBkaXJlY3Qgb3IgaW5kaXJlY3QgY2FsbFxuICAgICAqIHRvIFtyZWNvbXBvc2VdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjZnVuY3Rpb24tcmVjb21wb3NlKSwgaWYgdGhpcyByZXN1bHRzIGluIHNvbWUgY2hhbmdlIHRvIHRoZSB3aWRnZXQncyByZW5kZXJlZCBET00gZWxlbWVudHMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVjb21wb3NlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoKSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgYSByb3cgaXMgcmVuZGVyZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLnJvdy5Sb3d9IGV2ZW50LnJvdyBUaGUgcm93IHRoYXQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIGZvciB0aGUgcm93LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5yZWNvcmRJbmRleCBUaGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgcmVjb3JkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlbmRlclJvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgcm93OiBSb3csIHJlY29yZDogTW9kZWwsIHJlY29yZEluZGV4OiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEdyaWQgcm93cyBoYXZlIGJlZW4gcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoaXMgZ3JpZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZW5kZXJSb3dzOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBlbmNhcHN1bGF0aW5nIGVsZW1lbnQgb2YgYSBXaWRnZXQgcmVzaXplcyAqb25seSB3aGVuIFttb25pdG9yUmVzaXplXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1tb25pdG9yUmVzaXplKSBpcyBgdHJ1ZWAqLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LndpZHRoIFRoZSBuZXcgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQuaGVpZ2h0IFRoZSBuZXcgaGVpZ2h0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm9sZFdpZHRoIFRoZSBvbGQgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkSGVpZ2h0IFRoZSBvbGQgaGVpZ2h0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvbGRXaWR0aDogbnVtYmVyLCBvbGRIZWlnaHQ6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogR3JpZCByZXNpemUgbGVhZCB0byBhIG5ldyByZXNwb25zaXZlIGxldmVsIGJlaW5nIGFwcGxpZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuZ3JpZCBHcmlkIHRoYXQgd2FzIHJlc2l6ZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQubGV2ZWwgTmV3IHJlc3BvbnNpdmUgbGV2ZWwgKHNtYWxsLCBsYXJnZSwgZXRjKVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC53aWR0aCBOZXcgd2lkdGggaW4gcHhcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQub2xkTGV2ZWwgT2xkIHJlc3BvbnNpdmUgbGV2ZWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkV2lkdGggT2xkIHdpZHRoIGluIHB4XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVzcG9uc2l2ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIGxldmVsOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIG9sZExldmVsOiBzdHJpbmcsIG9sZFdpZHRoOiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgd2hlbiBhIHJvdyBoYXMgZmluaXNoZWQgY29sbGFwc2luZy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Sb3dDb2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgd2hlbiBhIHJvdyBleHBhbmQgaGFzIGZpbmlzaGVkIGV4cGFuZGluZy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2V2ZW50LXJvd0V4cGFuZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuZXhwYW5kZWRFbGVtZW50cyBBbiBvYmplY3Qgd2l0aCB0aGUgR3JpZCByZWdpb24gbmFtZSBhcyBwcm9wZXJ0eSBhbmQgdGhlIGV4cGFuZGVkIGJvZHkgZWxlbWVudCBhcyB2YWx1ZVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC53aWRnZXQgSW4gY2FzZSBvZiBleHBhbmRpbmcgYSBXaWRnZXQsIHRoaXMgd2lsbCBiZSBhIHJlZmVyZW5jZSB0byB0aGUgaW5zdGFuY2UgY3JlYXRlZCBieSB0aGUgYWN0dWFsIGV4cGFuc2lvbi4gSWYgdGhlcmUgaXMgbXVsdGlwbGUgR3JpZCByZWdpb25zLCB1c2UgdGhlIGB3aWRnZXRzYCBwYXJhbSBpbnN0ZWFkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC53aWRnZXRzIEluIGNhc2Ugb2YgZXhwYW5kaW5nIGEgV2lkZ2V0LCB0aGlzIHdpbGwgYmUgYW4gb2JqZWN0IHdpdGggdGhlIEdyaWQgcmVnaW9uIG5hbWUgYXMgcHJvcGVydHkgYW5kIHRoZSByZWZlcmVuY2UgdG8gdGhlIHdpZGdldCBpbnN0YW5jZSBjcmVhdGVkIGJ5IHRoZSBhY3R1YWwgZXhwYW5zaW9uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUm93RXhwYW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVjb3JkOiBNb2RlbCwgZXhwYW5kZWRFbGVtZW50czogb2JqZWN0LCB3aWRnZXQ6IFdpZGdldCwgd2lkZ2V0czogb2JqZWN0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBtb3VzZSBlbnRlcnMgYSByb3dcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgaG92ZXJlZCByb3dcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gY3VycmVudGx5IGhvdmVyZWRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUm93TW91c2VFbnRlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIG1vdXNlIGxlYXZlcyBhIHJvd1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSByb3cgdGhhdCB0aGUgbW91c2UgbGVmdFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudCB0aGF0IHRoZSBtb3VzZSBsZWZ0XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJvd01vdXNlTGVhdmU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEdyaWQgaGFzIHNjcm9sbGVkIHZlcnRpY2FsbHlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBmaXJpbmcgR3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQuc2Nyb2xsVG9wIFRoZSB2ZXJ0aWNhbCBzY3JvbGwgcG9zaXRpb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2Nyb2xsOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBzY3JvbGxUb3A6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhlIHNlbGVjdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0geydzZWxlY3QnLCdkZXNlbGVjdCd9IGV2ZW50LmFjdGlvbiBgJ3NlbGVjdCdgL2AnZGVzZWxlY3QnYFxuICAgICAqIEBwYXJhbSB7J3JvdycsJ2NlbGwnfSBldmVudC5tb2RlIGAncm93J2AvYCdjZWxsJ2BcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5kZXNlbGVjdGVkIFRoZSByZWNvcmRzIGRlc2VsZWN0ZWQgaW4gdGhpcyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuc2VsZWN0ZWQgVGhlIHJlY29yZHMgc2VsZWN0ZWQgaW4gdGhpcyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuc2VsZWN0aW9uIFRoZSByZWNvcmRzIGluIHRoZSBuZXcgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbltdfSBldmVudC5kZXNlbGVjdGVkQ2VsbHMgVGhlIGNlbGxzIGRlc2VsZWN0ZWQgaW4gdGhpcyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9uW119IGV2ZW50LnNlbGVjdGVkQ2VsbHMgVGhlIGNlbGxzIHNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbltdfSBldmVudC5jZWxsU2VsZWN0aW9uIFRoZSBjZWxscyBpbiB0aGUgbmV3IHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TZWxlY3Rpb25DaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBhY3Rpb246ICdzZWxlY3QnfCdkZXNlbGVjdCcsIG1vZGU6ICdyb3cnfCdjZWxsJywgc291cmNlOiBHcmlkLCBkZXNlbGVjdGVkOiBNb2RlbFtdLCBzZWxlY3RlZDogTW9kZWxbXSwgc2VsZWN0aW9uOiBNb2RlbFtdLCBkZXNlbGVjdGVkQ2VsbHM6IEdyaWRMb2NhdGlvbltdLCBzZWxlY3RlZENlbGxzOiBHcmlkTG9jYXRpb25bXSwgY2VsbFNlbGVjdGlvbjogR3JpZExvY2F0aW9uW10gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWxlY3Rpb25Nb2RlIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnNlbGVjdGlvbk1vZGUgVGhlIG5ldyBbc2VsZWN0aW9uTW9kZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9taXhpbi9HcmlkU2VsZWN0aW9uI2NvbmZpZy1zZWxlY3Rpb25Nb2RlKVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNlbGVjdGlvbk1vZGVDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzZWxlY3Rpb25Nb2RlOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBhZnRlciBhIHdpZGdldCBpcyBzaG93bi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHNwbGl0dGluZyB0aGUgR3JpZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2VbXX0gZXZlbnQuc3ViVmlld3MgVGhlIHN1YiB2aWV3cyBjcmVhdGVkIGJ5IHRoZSBzcGxpdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5vcHRpb25zIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgc3BsaXQgY2FsbFxuICAgICAqIEBwYXJhbSB7J2hvcml6b250YWwnLCd2ZXJ0aWNhbCcsJ2JvdGgnfSBldmVudC5vcHRpb25zLmRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzcGxpdFxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5vcHRpb25zLmF0Q29sdW1uIFRoZSBjb2x1bW4gdG8gc3BsaXQgYXRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQub3B0aW9ucy5hdFJlY29yZCBUaGUgcmVjb3JkIHRvIHNwbGl0IGF0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3BsaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzdWJWaWV3czogR3JpZEJhc2VbXSwgb3B0aW9uczogeyBkaXJlY3Rpb246ICdob3Jpem9udGFsJ3wndmVydGljYWwnfCdib3RoJywgYXRDb2x1bW46IENvbHVtbiwgYXRSZWNvcmQ6IE1vZGVsIH0gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJ5IHRoZSBHcmlkIHdoZW4gdGhlIGNvbGxhcHNlIGljb24gaXMgY2xpY2tlZC4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgZGVmYXVsdCBjb2xsYXBzZSBhY3Rpb24sXG4gICAgICogaWYgeW91IHdhbnQgdG8gaW1wbGVtZW50IHlvdXIgb3duIGJlaGF2aW9yLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuU3ViR3JpZH0gZXZlbnQuc3ViR3JpZCBUaGUgc3ViZ3JpZFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3BsaXR0ZXJDb2xsYXBzZUNsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBzdWJHcmlkOiBTdWJHcmlkLCBkb21FdmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBieSB0aGUgR3JpZCBhZnRlciBhIHN1Yi1ncmlkIGhhcyBiZWVuIHJlc2l6ZWQgdXNpbmcgdGhlIHNwbGl0dGVyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgR3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSByZXNpemVkIHN1YmdyaWRcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNwbGl0dGVyRHJhZ0VuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3ViR3JpZDogU3ViR3JpZCwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBieSB0aGUgR3JpZCB3aGVuIGEgc3ViLWdyaWQgcmVzaXplIGdlc3R1cmUgc3RhcnRzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgR3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSBzdWJncmlkIGFib3V0IHRvIGJlIHJlc2l6ZWRcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNwbGl0dGVyRHJhZ1N0YXJ0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBzdWJHcmlkOiBTdWJHcmlkLCBkb21FdmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJ5IHRoZSBHcmlkIHdoZW4gdGhlIGV4cGFuZCBpY29uIGlzIGNsaWNrZWQuIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGRlZmF1bHQgZXhwYW5kIGFjdGlvbixcbiAgICAgKiBpZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQgeW91ciBvd24gYmVoYXZpb3IuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgR3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSBzdWJncmlkXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TcGxpdHRlckV4cGFuZENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBzdWJHcmlkOiBTdWJHcmlkLCBkb21FdmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgd2hlbiBlZGl0aW5nIHN0YXJ0c1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q2VsbEVkaXRvckNvbnRleHR9IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3RhcnRDZWxsRWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZWRpdG9yQ29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCB3aGVuIGVkaXRpbmcgc3RhcnRzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHtSb3dFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN0YXJ0Um93RWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZWRpdG9yQ29udGV4dDogUm93RWRpdG9yQ29udGV4dCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgYSBzdWIgZ3JpZCBpcyBjb2xsYXBzZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSBzdWIgZ3JpZCBpbnN0YW5jZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN1YkdyaWRDb2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3ViR3JpZDogU3ViR3JpZCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgYSBzdWIgZ3JpZCBpcyBleHBhbmRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBmaXJpbmcgR3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LlN1YkdyaWR9IGV2ZW50LnN1YkdyaWQgVGhlIHN1YiBncmlkIGluc3RhbmNlXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3ViR3JpZEV4cGFuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3ViR3JpZDogU3ViR3JpZCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBvbmUgb3IgbW9yZSBncm91cHMgYXJlIGV4cGFuZGVkIG9yIGNvbGxhcHNlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQuZ3JvdXBSZWNvcmQgW0RFUFJFQ0FURURdIFVzZSBgZ3JvdXBSZWNvcmRzYCBwYXJhbSBpbnN0ZWFkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuZ3JvdXBSZWNvcmRzIFRoZSBncm91cCByZWNvcmRzIGJlaW5nIHRvZ2dsZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbGxhcHNlIENvbGxhcHNlZCAodHJ1ZSkgb3IgZXhwYW5kZWQgKGZhbHNlKVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuYWxsUmVjb3JkcyBUcnVlIGlmIHRoaXMgZXZlbnQgaXMgcGFydCBvZiB0b2dnbGluZyBhbGwgZ3JvdXBzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVG9nZ2xlR3JvdXA6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncm91cFJlY29yZDogTW9kZWwsIGdyb3VwUmVjb3JkczogTW9kZWxbXSwgY29sbGFwc2U6IGJvb2xlYW4sIGFsbFJlY29yZHM/OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBhZnRlciBhIHBhcmVudCBub2RlIHJlY29yZCB0b2dnbGVzIGl0cyBjb2xsYXBzZWQgc3RhdGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCBiZWluZyB0b2dnbGVkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29sbGFwc2UgYHRydWVgIGlmIHRoZSBub2RlIGlzIGJlaW5nIGNvbGxhcHNlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Ub2dnbGVOb2RlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVjb3JkOiBNb2RlbCwgY29sbGFwc2U6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEEgaGVhZGVyIFt0b29sXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXRvb2xzKSBoYXMgYmVlbiBjbGlja2VkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlRvb2x9IGV2ZW50LnNvdXJjZSBUaGlzIFBhbmVsLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuVG9vbH0gZXZlbnQudG9vbCBUaGUgdG9vbCB3aGljaCBpcyBiZWluZyBjbGlja2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRvb2xDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVG9vbCwgdG9vbDogVG9vbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiByb3cgbG9ja2luZyBpcyBkaXNhYmxlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LmNsb25lIFRoZSBsb2NrZWQgY2xvbmUgdGhhdCB3aWxsIGJlIGRlc3Ryb3llZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblVubG9ja1Jvd3M6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjbG9uZTogR3JpZEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdW4tc3BsaXR0aW5nIHRoZSBHcmlkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblVuc3BsaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KCgpID0+IHZvaWQpfHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgYXBwZW5kIHRoZSB1bmRlcmx5aW5nIHdpZGdldFxuICAgICAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgbWUgPSB0aGlzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZ1xuICAgICAgICAgICAgfSA9IG1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2xhc3MsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VOYW1lLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdzLFxuICAgICAgICAgICAgICAgIGJyeW50dW1FdmVudHNcbiAgICAgICAgICAgIH0gPSBCcnludHVtR3JpZENvbXBvbmVudDtcblxuICAgICAgICBicnludHVtQ29uZmlncy5maWx0ZXIocHJvcCA9PiBwcm9wIGluIHRoaXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGJyeW50dW1Db25maWcsIHByb3AsIHRoaXNbcHJvcF0pO1xuICAgICAgICAgICAgaWYgKFsnZmVhdHVyZXMnLCAnY29uZmlnJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb25maWdQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGJyeW50dW1FdmVudHMuZmlsdGVyKGV2ZW50ID0+IHRoaXNbZXZlbnRdICYmIHRoaXNbZXZlbnRdLm9ic2VydmVycy5sZW5ndGggPiAwKS5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgdW5jYXBpdGFsaXplID0gKHN0cjogc3RyaW5nKSA9PiBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSksXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lID0gKHN0cjogc3RyaW5nKSA9PiB1bmNhcGl0YWxpemUoc3RyLnNsaWNlKDIpKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5saXN0ZW5lcnNbZXZlbnROYW1lKGV2ZW50KV0gPSBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbWVbZXZlbnRdLmVtaXQoZSk7XG4gICAgICAgICAgICAgICAgLy8gRXZlbnRFbWl0dGVyIGRvZXMgbm90IHJldHVybiB2YWx1ZXMgaW4gdGhlIG5vcm1hbCB3YXksIHdvcmsgYXJvdW5kIGl0IGJ5IHNldHRpbmcgYHJldHVyblZhbHVlYCBmbGFnXG4gICAgICAgICAgICAgICAgLy8gaW4gQW5ndWxhciBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIHNwZWNpZmllZCBpbiBjb25maWcgdGhlbiB1c2UgYWRvcHQgdG8gV3JhcHBlcidzIGVsZW1lbnRcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIGNvbnRhaW5lclBhcmFtID0gW1xuICAgICAgICAgICAgICAgICdhZG9wdCcsXG4gICAgICAgICAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QWZ0ZXInLFxuICAgICAgICAgICAgICAgICdpbnNlcnRCZWZvcmUnXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgXS5maW5kKHByb3AgPT4gYnJ5bnR1bUNvbmZpZ1twcm9wXSk7XG4gICAgICAgIGlmICghY29udGFpbmVyUGFyYW0pIHtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU5hbWUgPT09ICdCdXR0b24nIHx8IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRSb290Tm9kZSgpIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbiBzaG91bGQgYWx3YXlzIGJlIDxhPiBvciA8YnV0dG9uPiBpbnNpZGUgb3duZXIgZWxlbWVudFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYXBwZW5kVG8gPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFkb3B0ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29udGFpbmVyKGluc3RhbmNlTmFtZSwgY29udGFpbmVyUGFyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZS5pbnN0YW5jZSA9IGluc3RhbmNlTmFtZSA9PT0gJ1dpZGdldCcgPyBXaWRnZXQuY3JlYXRlKGJyeW50dW1Db25maWcpIDogbmV3IGluc3RhbmNlQ2xhc3MoYnJ5bnR1bUNvbmZpZyk7XG5cbiAgICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIGdyaWRJbnN0YW5jZSwgc2NoZWR1bGVySW5zdGFuY2UgZXRjLlxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lW1N0cmluZ0hlbHBlci51bmNhcGl0YWxpemUoaW5zdGFuY2VOYW1lKSArICdJbnN0YW5jZSddID0gbWUuaW5zdGFuY2U7XG4gICAgICAgIC8vIFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdhdGNoIGZvciBjaGFuZ2VzXG4gICAgICogQHBhcmFtIGNoYW5nZXNcbiAgICAgKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICB7IGluc3RhbmNlIH0gPSB0aGlzLFxuICAgICAgICAgICAgeyBpbnN0YW5jZU5hbWUgfSA9IEJyeW50dW1HcmlkQ29tcG9uZW50O1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBjaGFuZ2VzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNoYW5nZXMpLmZvckVhY2goKFtwcm9wLCBjaGFuZ2VdKSA9PiB7XG4gICAgICAgICAgICBjb25zdFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gKGNoYW5nZSBhcyBTaW1wbGVDaGFuZ2UpLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgICB7IGluc3RhbmNlIH0gPSB0aGlzLFxuICAgICAgICAgICAgICAgIHsgYnJ5bnR1bUNvbmZpZ3NPbmx5LCBicnludHVtUHJvcHMgfSA9IEJyeW50dW1HcmlkQ29tcG9uZW50O1xuICAgICAgICAgICAgaWYgKGJyeW50dW1Qcm9wcy5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuYXBwbHlQcm9wVmFsdWUoaW5zdGFuY2UsIHByb3AsIG5ld1ZhbHVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGJyeW50dW1Db25maWdzT25seS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdVcGRhdGVQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSBjb21wb25lbnRcbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLmluc3RhbmNlLmRlc3Ryb3kpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19