@bryntum/calendar-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 (46) hide show
  1. package/README.md +44 -0
  2. package/bryntum-calendar-angular-thin.d.ts +5 -0
  3. package/bundles/bryntum-calendar-angular-thin.umd.js +22195 -0
  4. package/bundles/bryntum-calendar-angular-thin.umd.js.map +1 -0
  5. package/esm2015/bryntum-calendar-angular-thin.js +5 -0
  6. package/esm2015/lib/bryntum-agenda-view.component.js +2503 -0
  7. package/esm2015/lib/bryntum-calendar-date-picker.component.js +1045 -0
  8. package/esm2015/lib/bryntum-calendar-project-model.component.js +369 -0
  9. package/esm2015/lib/bryntum-calendar.component.js +2355 -0
  10. package/esm2015/lib/bryntum-day-agenda-view.component.js +1338 -0
  11. package/esm2015/lib/bryntum-day-resource-view.component.js +1347 -0
  12. package/esm2015/lib/bryntum-day-view.component.js +1323 -0
  13. package/esm2015/lib/bryntum-event-list.component.js +2453 -0
  14. package/esm2015/lib/bryntum-mode-selector.component.js +702 -0
  15. package/esm2015/lib/bryntum-month-agenda-view.component.js +1201 -0
  16. package/esm2015/lib/bryntum-month-grid.component.js +1262 -0
  17. package/esm2015/lib/bryntum-month-view.component.js +1337 -0
  18. package/esm2015/lib/bryntum-range-menu.component.js +884 -0
  19. package/esm2015/lib/bryntum-resource-view.component.js +1068 -0
  20. package/esm2015/lib/bryntum-week-view.component.js +1323 -0
  21. package/esm2015/lib/bryntum-year-view.component.js +1163 -0
  22. package/esm2015/lib/calendar.module.js +99 -0
  23. package/esm2015/lib/wrapper.helper.js +74 -0
  24. package/esm2015/public-api.js +21 -0
  25. package/fesm2015/bryntum-calendar-angular-thin.js +21714 -0
  26. package/fesm2015/bryntum-calendar-angular-thin.js.map +1 -0
  27. package/lib/bryntum-agenda-view.component.d.ts +2953 -0
  28. package/lib/bryntum-calendar-date-picker.component.d.ts +1525 -0
  29. package/lib/bryntum-calendar-project-model.component.d.ts +399 -0
  30. package/lib/bryntum-calendar.component.d.ts +2577 -0
  31. package/lib/bryntum-day-agenda-view.component.d.ts +1960 -0
  32. package/lib/bryntum-day-resource-view.component.d.ts +2025 -0
  33. package/lib/bryntum-day-view.component.d.ts +1980 -0
  34. package/lib/bryntum-event-list.component.d.ts +2888 -0
  35. package/lib/bryntum-mode-selector.component.d.ts +851 -0
  36. package/lib/bryntum-month-agenda-view.component.d.ts +1765 -0
  37. package/lib/bryntum-month-grid.component.d.ts +1731 -0
  38. package/lib/bryntum-month-view.component.d.ts +1897 -0
  39. package/lib/bryntum-range-menu.component.d.ts +1130 -0
  40. package/lib/bryntum-resource-view.component.d.ts +1512 -0
  41. package/lib/bryntum-week-view.component.d.ts +1980 -0
  42. package/lib/bryntum-year-view.component.d.ts +1661 -0
  43. package/lib/calendar.module.d.ts +22 -0
  44. package/lib/wrapper.helper.d.ts +26 -0
  45. package/package.json +33 -0
  46. package/public-api.d.ts +17 -0
@@ -0,0 +1,2355 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ /**
3
+ * Angular wrapper for Bryntum Calendar
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 { Calendar } from '@bryntum/calendar-thin';
9
+ import { StringHelper } from '@bryntum/core-thin';
10
+ import * as i0 from "@angular/core";
11
+ export class BryntumCalendarComponent {
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
+ * Fired when a change of view (Calendar mode) has completed. By default, view changes are animated and this
24
+ * event fires when the view is fully visible.
25
+ * @param {object} event Event object
26
+ * @param {Calendar.view.Calendar} event.source This Calendar instance.
27
+ * @param {CalendarView} event.prevActiveItem The previously active view.
28
+ * @param {CalendarView} event.activeItem The new active view.
29
+ * @param {boolean} event.containedFocus `true` if the outgoing view contained focus.
30
+ */
31
+ this.onActiveItemChange = new EventEmitter();
32
+ /**
33
+ * Fires on the owning Scheduler after editor is closed by any action - save, delete or cancel
34
+ * @param {object} event Event object
35
+ * @param {Scheduler.view.Scheduler} event.source The scheduler
36
+ * @param {'save','delete','cancel'} event.action The action that was taken to end the edit. One of 'save', 'delete' or 'cancel'
37
+ * @param {Scheduler.feature.SchedulerEventEdit} event.eventEdit The eventEdit feature
38
+ * @param {Scheduler.model.EventModel} event.eventRecord The record that has been edited.
39
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The Resource record for the event. If the event is being created, it will not contain a resource, so this parameter specifies the resource the event is being created for.
40
+ * @param {HTMLElement} event.eventElement The element which represents the event in the scheduler display.
41
+ * @param {Core.widget.Popup} event.editor The editor
42
+ */
43
+ this.onAfterEventEdit = new EventEmitter();
44
+ /**
45
+ * Fires on the owning Scheduler after an event is successfully saved
46
+ * @param {object} event Event object
47
+ * @param {Scheduler.view.Scheduler} event.source The scheduler instance
48
+ * @param {Scheduler.model.EventModel} event.eventRecord The record about to be saved
49
+ */
50
+ this.onAfterEventSave = new EventEmitter();
51
+ /**
52
+ * Fired before a change of view (Calendar mode) is initiated.
53
+ * @param {object} event Event object
54
+ * @param {Calendar.view.Calendar} event.source This Calendar instance.
55
+ * @param {CalendarView} event.prevActiveItem The previously active view.
56
+ * @param {CalendarView} event.activeItem The new active view.
57
+ */
58
+ this.onBeforeActiveItemChange = new EventEmitter();
59
+ /**
60
+ * Fires before an assignment is removed. Can be triggered by user pressing [DELETE] or [BACKSPACE] or
61
+ * by the event editor. Can for example be used to display a custom dialog to confirm deletion, in which
62
+ * case records should be "manually" removed after confirmation:
63
+ * ...
64
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-beforeAssignmentDelete)
65
+ * @param {object} event Event object
66
+ * @param {Scheduler.view.Scheduler} event.source The Scheduler instance
67
+ * @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The assignment records about to be deleted
68
+ * @param {object} event.context Additional removal context:
69
+ * @param {Function} event.context.finalize Function to call to finalize the removal. Used to asynchronously decide to remove the records or not. Provide `false` to the function to prevent the removal.
70
+ * @param {boolean} event.context.finalize.removeRecords Provide `false` to the function to prevent the removal.
71
+ */
72
+ this.onBeforeAssignmentDelete = new EventEmitter();
73
+ /**
74
+ * Fired any time there is going to be a change to the assignments selected in the Scheduler.
75
+ * Returning `false` prevents the change
76
+ * @param {object} event Event object
77
+ * @param {Scheduler.view.Scheduler} event.source This Scheduler instance.
78
+ * @param {'select','deselect','update','clear'} event.action One of the actions 'select', 'deselect', 'update', 'clear'
79
+ * @param {Scheduler.model.AssignmentModel[]} event.selected An array of assignments that will be added to the selection.
80
+ * @param {Scheduler.model.AssignmentModel[]} event.deselected An array of assignments that will be removed from the selection.
81
+ * @param {Scheduler.model.AssignmentModel[]} event.selection The currently selected assignments, before applying `selected` and `deselected`.
82
+ */
83
+ this.onBeforeAssignmentSelectionChange = new EventEmitter();
84
+ /**
85
+ * This event fires whenever a child view's [autoCreate gesture](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate) is detected and also when a [drag-create](#Calendar/feature/CalendarDrag) gesture is detected.
86
+ * ...
87
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-beforeAutoCreate)
88
+ * @param {object} event Event object
89
+ * @param {CalendarView} event.source The child view on which the event was initiated.
90
+ * @param {Event} event.domEvent The DOM event which initiated the creation.
91
+ * @param {Date} event.date *DEPRECATED in favour of `startDate`.* The starting time of the event to be created. If this is in a `DayView`, this will be snapped according to the specification in [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate)
92
+ * @param {Date} event.startDate The starting time of the event to be created. If this is in a `DayView`, this will be snapped according to the specification in [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate)
93
+ * @param {Date} event.endDate The ending time of the event to be created.
94
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource if the UI includes a resource.
95
+ */
96
+ this.onBeforeAutoCreate = new EventEmitter();
97
+ /**
98
+ * Fires on the owning Scheduler before a copy action is performed, return `false` to prevent the action
99
+ * @param {object} event Event object
100
+ * @param {Scheduler.view.Scheduler} event.source Owner scheduler
101
+ * @param {Scheduler.model.EventModel[]} event.eventRecords The event records about to be copied
102
+ * @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The assignment records about to be copied
103
+ * @param {boolean} event.isCut `true` if this is a cut action
104
+ * @param {string} event.entityName 'event' to distinguish this event from other beforeCopy events
105
+ */
106
+ this.onBeforeCopy = new EventEmitter();
107
+ /**
108
+ * Fires before a mode is created. The configuration block is passed to the handler for possible modification.
109
+ * @param {object} event Event object
110
+ * @param {Calendar.view.Calendar} event.source This Calendar
111
+ * @param {AgendaViewConfig,DayResourceViewConfig,DayViewConfig,EventListConfig,MonthViewConfig,ResourceViewConfig,WeekViewConfig,YearViewConfig,DayAgendaViewConfig,MonthAgendaViewConfig,CalendarContainerItemConfig} event.config The configuration block of the mode about to be created. Any property, including the `type` may be changed.
112
+ */
113
+ this.onBeforeCreateMode = new EventEmitter();
114
+ /**
115
+ * Fires on the owning Grid before CSV export starts. Return `false` to cancel the export.
116
+ * @param {object} event Event object
117
+ * @param {ExportConfig} event.config Export config
118
+ * @param {Grid.column.Column[]} event.columns An array of columns to export
119
+ * @param {Core.data.Model[]} event.rows An array of records to export
120
+ * @param {string} event.lineDelimiter The CSV delimiter to separate lines
121
+ * @param {string} event.columnDelimiter The CSV delimiter to separate values on one line
122
+ */
123
+ this.onBeforeCSVExport = new EventEmitter();
124
+ /**
125
+ * Fires before an object is destroyed.
126
+ * @param {object} event Event object
127
+ * @param {Core.Base} event.source The Object that is being destroyed.
128
+ */
129
+ this.onBeforeDestroy = new EventEmitter();
130
+ /**
131
+ * This event fires on the owning Calendar before a drag creation gesture is started. Return `false` to
132
+ * veto the operation.
133
+ * @param {object} event Event object
134
+ * @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
135
+ * @param {Core.util.drag.DragContext} event.drag The drag create context.
136
+ * @param {Event} event.domEvent The browser event.
137
+ * @param {Date} event.date The date at the drag DOM event position.
138
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
139
+ * @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
140
+ * @param {CalendarView} event.view The Calendar widget in which the drag is being started.
141
+ */
142
+ this.onBeforeDragCreate = new EventEmitter();
143
+ /**
144
+ * This event fires on the owning Calendar before a drag creation gesture is completed. Return `false` to
145
+ * immediately veto the operation or a Promise yielding `true` or `false` for async vetoing.
146
+ * @param {object} event Event object
147
+ * @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
148
+ * @param {Core.util.drag.DragContext} event.drag The drag create context.
149
+ * @param {Event} event.event The browser event.
150
+ * @param {Scheduler.model.EventModel} event.eventRecord The `EventModel` record being created that has not yet been added in the store.
151
+ * @param {Date} event.newStartDate The new start date.
152
+ * @param {Date} event.newEndDate The new end date.
153
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
154
+ * @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
155
+ * @param {boolean,ValidateCreateResult} event.validation The result of the [validateCreateFn](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag#config-validateCreateFn) if one was provided.
156
+ * @param {CalendarView} event.view The Calendar widget in which the drag completed.
157
+ */
158
+ this.onBeforeDragCreateEnd = new EventEmitter();
159
+ /**
160
+ * This event fires on the owning Calendar before a drag move gesture is started. Return `false` to
161
+ * veto the operation.
162
+ * @param {object} event Event object
163
+ * @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
164
+ * @param {Core.util.drag.DragContext} event.drag The drag move context.
165
+ * @param {Event} event.domEvent The browser event.
166
+ * @param {Scheduler.model.EventModel} event.eventRecord The `EventModel` record being moved.
167
+ * @param {Date} event.date The date at the drag DOM event position.
168
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
169
+ * @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
170
+ * @param {CalendarView} event.view The Calendar widget in which the drag is being started.
171
+ */
172
+ this.onBeforeDragMove = new EventEmitter();
173
+ /**
174
+ * This event fires on the owning Calendar before a drag move gesture is completed. Return `false` to immediately veto the operation
175
+ * or a Promise yielding `true` or `false` for async vetoing.
176
+ * @param {object} event Event object
177
+ * @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
178
+ * @param {Core.util.drag.DragContext} event.drag The drag create context.
179
+ * @param {Event} event.event The browser event.
180
+ * @param {Scheduler.model.EventModel} event.eventRecord The `EventModel` record that has *not yet been updated* in the store.
181
+ * @param {Scheduler.model.EventModel} event.proxyEventRecord The `EventModel` record that is being used as a proxy for the drag operation and being updated on every pointer move. This will contain changed values based on the drag position.
182
+ * @param {Date} event.newStartDate The new start date.
183
+ * @param {Date} event.newEndDate The new end date.
184
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
185
+ * @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
186
+ * @param {boolean,ValidateCreateResult} event.validation The result of the [validateMoveFn](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag#config-validateMoveFn) if one was provided.
187
+ * @param {CalendarView} event.view The Calendar widget in which the drag completed.
188
+ */
189
+ this.onBeforeDragMoveEnd = new EventEmitter();
190
+ /**
191
+ * This event fires on the owning Calendar before a drag resize gesture is started. Return `false` to
192
+ * veto the operation.
193
+ * @param {object} event Event object
194
+ * @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
195
+ * @param {Core.util.drag.DragContext} event.drag The drag resize context.
196
+ * @param {Event} event.domEvent The browser event.
197
+ * @param {Scheduler.model.EventModel} event.eventRecord The `EventModel` record being resized.
198
+ * @param {Date} event.date The date at the drag DOM event position.
199
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
200
+ * @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
201
+ * @param {CalendarView} event.view The Calendar widget in which the drag is being started.
202
+ */
203
+ this.onBeforeDragResize = new EventEmitter();
204
+ /**
205
+ * This event fires on the owning Calendar before a drag resize gesture is completed. Return `false` to immediately veto the operation
206
+ * or a Promise yielding `true` or `false` for async vetoing.
207
+ * @param {object} event Event object
208
+ * @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
209
+ * @param {Core.util.drag.DragContext} event.drag The drag create context.
210
+ * @param {Event} event.event The browser event.
211
+ * @param {Scheduler.model.EventModel} event.eventRecord The `EventModel` record that has *not yet been updated* in the store.
212
+ * @param {Scheduler.model.EventModel} event.proxyEventRecord The `EventModel` record that is being used as a proxy for the drag operation and being updated on every pointer move. This will contain changed values based on the drag position.
213
+ * @param {Date} event.newStartDate The new start date.
214
+ * @param {Date} event.newEndDate The new end date.
215
+ * @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
216
+ * @param {boolean,ValidateCreateResult} event.validation The result of the [validateResizeFn](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag#config-validateResizeFn) if one was provided.
217
+ * @param {CalendarView} event.view The Calendar widget in which the drag completed.
218
+ */
219
+ this.onBeforeDragResizeEnd = new EventEmitter();
220
+ /**
221
+ * This event is fired on the owning Calendar when dropping an event from the calendar on the
222
+ * external source <strong>if the [droppable](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-droppable) was configured</strong>. Returning `false`
223
+ * prevents the gesture from being completed.
224
+ * ...
225
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-beforeDropExternal)
226
+ * @param {object} event Event object
227
+ * @param {Scheduler.model.EventModel} event.eventRecord The event record being dragged.
228
+ * @param {boolean} event.dropOnCalendar `true` if the drop gesture is over the client Calendar. This feature also allows drag *out* of the Calendar and onto the external event source if the [droppable](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-droppable) config is set.
229
+ * @param {HTMLElement} event.itemElement The element in which the drag gesture started.
230
+ * @param {HTMLElement} event.targetElement The current over element.
231
+ * @param {Event} event.domEvent The pointer event associated with the drag point.
232
+ * @param {number} event.overIndex *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, the index of the row being moved over;
233
+ * @param {Core.data.Model} event.overRecord *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, the record being moved over;
234
+ * @param {boolean} event.isAbove *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, `true` if the pointer position is above the halfway line of the over row.
235
+ * @param {boolean} event.altKey `true` if the Alt key was down when the last event was processed.
236
+ * @param {boolean} event.ctrlKey `true` if the Ctrl key was down when the last event was processed.
237
+ * @param {boolean} event.metaKey `true` if the Meta key was down when the last event was processed.
238
+ * @param {boolean} event.shiftKey `true` if the Shift key was down when the last event was processed.
239
+ */
240
+ this.onBeforeDropExternal = new EventEmitter();
241
+ /**
242
+ * Fires before an event is removed. Can be triggered by user pressing [DELETE] or [BACKSPACE] or by the
243
+ * event editor. Can for example be used to display a custom dialog to confirm deletion, in which case
244
+ * records should be "manually" removed after confirmation:
245
+ * ...
246
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-beforeEventDelete)
247
+ * @param {object} event Event object
248
+ * @param {Calendar.view.Calendar} event.source The Calendar instance
249
+ * @param {Scheduler.model.EventModel[]} event.eventRecords The records about to be deleted
250
+ * @param {object} event.context Additional removal context:
251
+ * @param {Function} event.context.finalize Function to call to finalize the removal. Used to asynchronously decide to remove the records or not. Provide `false` to the function to prevent the removal.
252
+ * @param {boolean} event.context.finalize.removeRecords Provide `false` to the function to prevent the removal.
253
+ */
254
+ this.onBeforeEventDelete = new EventEmitter();
255
+ /**
256
+ * Fires on the owning Scheduler before an event is displayed in an editor.
257
+ * This may be listened for to allow an application to take over event editing duties. Returning `false`
258
+ * stops the default editing UI from being shown.
259
+ * ...
260
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-beforeEventEdit)
261
+ * @param {object} event Event object
262
+ * @param {Scheduler.view.Scheduler} event.source The scheduler
263
+ * @param {Scheduler.feature.SchedulerEventEdit} event.eventEdit The eventEdit feature
264
+ * @param {Scheduler.model.EventModel} event.eventRecord The record about to be shown in the event editor.
265
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The Resource record for the event. If the event is being created, it will not contain a resource, so this parameter specifies the resource the event is being created for.
266
+ * @param {HTMLElement} event.eventElement The element which represents the event in the scheduler display.
267
+ */
268
+ this.onBeforeEventEdit = new EventEmitter();
269
+ /**
270
+ * Fires on the owning Scheduler when the editor for an event is available but before it is populated with
271
+ * data and shown. Allows manipulating fields etc.
272
+ * @param {object} event Event object
273
+ * @param {Scheduler.view.Scheduler} event.source The scheduler
274
+ * @param {Scheduler.feature.SchedulerEventEdit} event.eventEdit The eventEdit feature
275
+ * @param {Scheduler.model.EventModel} event.eventRecord The record about to be shown in the event editor.
276
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The Resource record for the event. If the event is being created, it will not contain a resource, so this parameter specifies the resource the event is being created for.
277
+ * @param {HTMLElement} event.eventElement The element which represents the event in the scheduler display.
278
+ * @param {Core.widget.Popup} event.editor The editor
279
+ */
280
+ this.onBeforeEventEditShow = new EventEmitter();
281
+ /**
282
+ * Fires on the owning Scheduler before an event is saved.
283
+ * Return `false` to immediately prevent saving
284
+ * ...
285
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-beforeEventSave)
286
+ * @param {object} event Event object
287
+ * @param {Scheduler.view.Scheduler} event.source The scheduler instance
288
+ * @param {Scheduler.model.EventModel} event.eventRecord The record about to be saved
289
+ * @param {Scheduler.model.ResourceModel[]} event.resourceRecords The resources to which the event is assigned
290
+ * @param {object} event.values The new values
291
+ * @param {object} event.context Extended save context:
292
+ * @param {boolean} event.context.async Set this to `true` in a listener to indicate that the listener will asynchronously decide to prevent or not the event save.
293
+ * @param {Function} event.context.finalize Function to call to finalize the save. Used when `async` is `true`. Provide `false` to the function to prevent the save.
294
+ */
295
+ this.onBeforeEventSave = new EventEmitter();
296
+ /**
297
+ * Fired any time there is going to be a change to the events selected in the Scheduler.
298
+ * Returning `false` prevents the change
299
+ * @param {object} event Event object
300
+ * @param {Scheduler.view.Scheduler} event.source This Scheduler instance.
301
+ * @param {'select','deselect','update','clear'} event.action One of the actions 'select', 'deselect', 'update', 'clear'
302
+ * @param {Scheduler.model.EventModel[]} event.selected An array of events that will be added to the selection.
303
+ * @param {Scheduler.model.EventModel[]} event.deselected An array of events that will be removed from the selection.
304
+ * @param {Scheduler.model.EventModel[]} event.selection The currently selected events, before applying `selected` and `deselected`.
305
+ */
306
+ this.onBeforeEventSelectionChange = new EventEmitter();
307
+ /**
308
+ * Fires on the owning Grid before Excel export starts. Return `false` to cancel the export.
309
+ * @param {object} event Event object
310
+ * @param {ExportConfig} event.config Export config
311
+ * @param {XLSColumn[]} event.columns An array of columns to export
312
+ * @param {any[][]} event.rows An array of records to export
313
+ */
314
+ this.onBeforeExcelExport = new EventEmitter();
315
+ /**
316
+ * Triggered before a widget is hidden. Return `false` to prevent the action.
317
+ * @param {object} event Event object
318
+ * @param {Core.widget.Widget} event.source The widget being hidden.
319
+ */
320
+ this.onBeforeHide = new EventEmitter();
321
+ /**
322
+ * Fires on the owning Scheduler before a paste action is performed, return `false` to prevent the action.
323
+ * Depending on if the EventStore is using [singleAssignment](https://bryntum.com/products/calendar/docs/api/Scheduler/data/EventStore#config-singleAssignment) or the
324
+ * configuration of [copyPasteAction](https://bryntum.com/products/calendar/docs/api/Scheduler/feature/EventCopyPaste#config-copyPasteAction), either the `eventRecords` or the `assignmentRecords` param
325
+ * will be populated with record copies.
326
+ * @param {object} event Event object
327
+ * @param {Scheduler.view.Scheduler} event.source Owner scheduler
328
+ * @param {Scheduler.model.EventModel[]} event.eventRecords The events about to be pasted
329
+ * @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The assignments about to be pasted
330
+ * @param {Scheduler.model.EventModel[]} event.originalEventRecords The original event records
331
+ * @param {Scheduler.model.AssignmentModel[]} event.originalAssignmentRecords The original assignment record
332
+ * @param {Date} event.date The date when the pasted events will be scheduled
333
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The target resource record, the clipboard event records will be assigned to this resource.
334
+ * @param {boolean} event.isCut `true` if this is a cut action
335
+ * @param {string} event.entityName 'event' to distinguish this event from other beforePaste events
336
+ */
337
+ this.onBeforePaste = new EventEmitter();
338
+ /**
339
+ * Fires on the owning Calendar before print starts. Return `false` to cancel the print.
340
+ * @param {object} event Event object
341
+ * @param {object} event.config Print config
342
+ */
343
+ this.onBeforePrint = new EventEmitter();
344
+ /**
345
+ * Triggered before a new [responsiveState](https://bryntum.com/products/calendar/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
346
+ * @param {object} event Event object
347
+ * @param {Core.widget.Widget} event.source The widget whose `responsiveState` is to be changed
348
+ * @param {string} event.state The new value for the widget's `responsiveState`
349
+ * @param {string} event.oldState The previous value for the widget's `responsiveState`
350
+ */
351
+ this.onBeforeResponsiveStateChange = new EventEmitter();
352
+ /**
353
+ * Fired before this container will load record values into its child fields. This is useful if you
354
+ * want to modify the UI before data is loaded (e.g. set some input field to be readonly)
355
+ * @param {object} event Event object
356
+ * @param {Core.widget.Container} event.source The container
357
+ * @param {Core.data.Model} event.record The record
358
+ */
359
+ this.onBeforeSetRecord = new EventEmitter();
360
+ /**
361
+ * Triggered before a widget is shown. Return `false` to prevent the action.
362
+ * @param {object} event Event object
363
+ * @param {Core.widget.Widget,any} event.source The widget being shown
364
+ */
365
+ this.onBeforeShow = new EventEmitter();
366
+ /**
367
+ * Fired before state is applied to the source. Allows editing the state object or preventing the operation.
368
+ * @param {object} event Event object
369
+ * @param {any} event.state State object config
370
+ */
371
+ this.onBeforeStateApply = new EventEmitter();
372
+ /**
373
+ * Fired before state is saved by the StateProvider. Allows editing the state object or preventing the operation.
374
+ * @param {object} event Event object
375
+ * @param {any} event.state State object config
376
+ */
377
+ this.onBeforeStateSave = new EventEmitter();
378
+ /**
379
+ * Fires when any other event is fired from the object.
380
+ * ...
381
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-catchAll)
382
+ * @param {object} event Event object
383
+ * @param {{[key: string]: any, type: string}} event.event The Object that contains event details
384
+ * @param {string} event.event.type The type of the event which is caught by the listener
385
+ */
386
+ this.onCatchAll = new EventEmitter();
387
+ /**
388
+ * Fires when a cell overflow indicator is clicked or activated by the <kbd>ENTER</kbd> key in any view. This will include
389
+ * the cells of a [YearView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/YearView) and the `+ n more` overflow
390
+ * indicator of cells in a [MonthView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView), and "all day" events section
391
+ * of a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView).
392
+ * @param {object} event Event object
393
+ * @param {CalendarView} event.source The view which triggered the event.
394
+ * @param {Event} event.domEvent The initiating DOM event.
395
+ * @param {Date} event.date The date clicked on.
396
+ */
397
+ this.onCellOverflowClick = new EventEmitter();
398
+ /**
399
+ * Fires when a Panel is collapsed using the [collapsible](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-collapsible) setting.
400
+ * @param {object} event Event object
401
+ * @param {Core.widget.Panel} event.source This Panel.
402
+ */
403
+ this.onCollapse = new EventEmitter();
404
+ /**
405
+ * This event fires on the owning widget when an item is selected in the context menu.
406
+ * @param {object} event Event object
407
+ * @param {Core.widget.Widget} event.source The owning widget
408
+ * @param {Core.widget.Menu} event.menu The menu
409
+ * @param {Core.widget.MenuItem} event.item Selected menu item
410
+ */
411
+ this.onContextMenuItem = new EventEmitter();
412
+ /**
413
+ * This event fires on the owning widget when a check item is toggled in the context menu.
414
+ * @param {object} event Event object
415
+ * @param {Core.widget.Widget} event.source The owning widget
416
+ * @param {Core.widget.Menu} event.menu The menu
417
+ * @param {Core.widget.MenuItem} event.item Selected menu item
418
+ * @param {boolean} event.checked Checked or not
419
+ */
420
+ this.onContextMenuToggleItem = new EventEmitter();
421
+ /**
422
+ * Fires on the owning Scheduler after a copy action is performed. Depending on if the EventStore is using
423
+ * [singleAssignment](https://bryntum.com/products/calendar/docs/api/Scheduler/data/EventStore#config-singleAssignment) or the configuration of
424
+ * [copyPasteAction](https://bryntum.com/products/calendar/docs/api/Scheduler/feature/EventCopyPaste#config-copyPasteAction), either the `eventRecords` or the `assignmentRecords` param will be populated
425
+ * with record copies.
426
+ * @param {object} event Event object
427
+ * @param {Scheduler.view.Scheduler} event.source Owner scheduler
428
+ * @param {Scheduler.model.EventModel[]} event.eventRecords The event record copies
429
+ * @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The assignment record copies
430
+ * @param {Scheduler.model.EventModel[]} event.originalEventRecords The event records that were copied
431
+ * @param {Scheduler.model.AssignmentModel[]} event.originalAssignmentRecord The assignment records that were copied
432
+ * @param {boolean} event.isCut `true` if this is a cut action
433
+ * @param {string} event.entityName 'event' to distinguish this event from other copy events
434
+ */
435
+ this.onCopy = new EventEmitter();
436
+ /**
437
+ * Fires on the owning Scheduler/Gantt when the line indicating the current time is updated (see [currentTimeLineUpdateInterval](https://bryntum.com/products/calendar/docs/api/Scheduler/feature/TimeRanges#config-currentTimeLineUpdateInterval)).
438
+ * @param {object} event Event object
439
+ * @param {Scheduler.view.Scheduler} event.source The scheduler
440
+ * @param {Date} event.date The current date
441
+ */
442
+ this.onCurrentTimelineUpdate = new EventEmitter();
443
+ /**
444
+ * Fired when data in any of the projects stores changes.
445
+ * ...
446
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dataChange)
447
+ * @param {object} event Event object
448
+ * @param {typeof Scheduler.data.mixin.ProjectConsumer,any} event.source Owning component
449
+ * @param {typeof Scheduler.model.mixin.ProjectModelMixin,any} event.project Project model
450
+ * @param {Core.data.Store} event.store Affected store
451
+ * @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'`
452
+ * @param {Core.data.Model} event.record Changed record, for actions that affects exactly one record (`'update'`)
453
+ * @param {Core.data.Model[]} event.records Changed records, passed for all actions except `'removeAll'`
454
+ * @param {object} event.changes Passed for the `'update'` action, info on which record fields changed
455
+ */
456
+ this.onDataChange = new EventEmitter();
457
+ /**
458
+ * Fires when the calendar changes the date that it orientates its views around.
459
+ * ...
460
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dateChange)
461
+ * @param {object} event Event object
462
+ * @param {Calendar.view.Calendar} event.source This Calendar.
463
+ * @param {Date} event.oldDate The previous Calendar date.
464
+ * @param {Date} event.date The new Calendar date.
465
+ */
466
+ this.onDateChange = new EventEmitter();
467
+ /**
468
+ * Fired when the eventStore is queried for events by date range, and the date range
469
+ * requested is different from the last time the store was queried.
470
+ * ...
471
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dateRangeChange)
472
+ * @param {object} event Event object
473
+ * @param {Calendar.view.Calendar} event.source This Calendar instance
474
+ * @param {object} event.old The old date range
475
+ * @param {Date} event.old.startDate the old start date
476
+ * @param {Date} event.old.endDate the old end date
477
+ * @param {object} event.new The new date range
478
+ * @param {Date} event.new.startDate the new start date
479
+ * @param {Date} event.new.endDate the new end date
480
+ */
481
+ this.onDateRangeChange = new EventEmitter();
482
+ /**
483
+ * Fires when the [LoadOnDemand](https://bryntum.com/products/calendar/docs/api/Calendar/feature/LoadOnDemand) feature has loaded a range of events.
484
+ * @param {object} event Event object
485
+ * @param {object} event.response The decoded JSON response.
486
+ * @param {object} event.options The options object passed into the CrudManager [CrudManager](https://bryntum.com/products/calendar/docs/api/Scheduler/data/CrudManager) [load](https://bryntum.com/products/calendar/docs/api/Scheduler/crud/AbstractCrudManagerMixin#function-load) method.
487
+ * @param {Date} event.startDate The start date of the range to request.
488
+ * @param {Date} event.endDate The end date of the range to request. <strong>Note that Dates are timestamps</strong>.
489
+ */
490
+ this.onDateRangeLoad = new EventEmitter();
491
+ /**
492
+ * Fired <strong>every</strong> time the eventStore is queried for events by date range.
493
+ * ...
494
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dateRangeRequested)
495
+ * @param {object} event Event object
496
+ * @param {Calendar.view.Calendar} event.source This Calendar instance
497
+ * @param {object} event.old The old date range
498
+ * @param {Date} event.old.startDate the old start date
499
+ * @param {Date} event.old.endDate the old end date
500
+ * @param {object} event.new The new date range
501
+ * @param {Date} event.new.startDate the new start date
502
+ * @param {Date} event.new.endDate the new end date
503
+ * @param {boolean} event.changed `true` if the date range is different from the last time a request was made
504
+ */
505
+ this.onDateRangeRequested = new EventEmitter();
506
+ /**
507
+ * Fired by the active view after one day cell's events are collected in sorted order according to the
508
+ * [eventSorter](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-eventSorter)
509
+ * ...
510
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dayCellPopulated)
511
+ * @param {object} event Event object
512
+ * @param {CalendarView} event.source The view which triggered the event.
513
+ * @param {Scheduler.model.EventModel[]} event.events The events to be shown for the passed date
514
+ * @param {Date} event.The date the events are to be shown in.
515
+ */
516
+ this.onDayCellPopulated = new EventEmitter();
517
+ /**
518
+ * Fires when a day number is clicked or activated by the <kbd>ENTER</kbd> key in a view which shows day numbers.
519
+ * This will include the cells of a [YearView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/YearView), the cell header of cells
520
+ * in a [MonthView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView), and the day header in a [DayView](#Calendar/widget/DayView).
521
+ * ...
522
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dayNumberClick)
523
+ * @param {object} event Event object
524
+ * @param {CalendarView} event.source The view which triggered the event.
525
+ * @param {Event} event.domEvent The initiating DOM event.
526
+ * @param {Date} event.date The date clicked on.
527
+ * @param {DayCell} event.cellData An object that contains data about the calendar cell for the date.
528
+ * @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
529
+ */
530
+ this.onDayNumberClick = new EventEmitter();
531
+ /**
532
+ * Fires when an object is destroyed.
533
+ * @param {object} event Event object
534
+ * @param {Core.Base} event.source The Object that is being destroyed.
535
+ */
536
+ this.onDestroy = new EventEmitter();
537
+ /**
538
+ * Fires when a field is mutated and the state of the [hasChanges](https://bryntum.com/products/calendar/docs/api/Core/widget/Container#property-hasChanges) property changes
539
+ * @param {object} event Event object
540
+ * @param {Core.widget.Container} event.source The container.
541
+ * @param {boolean} event.dirty The dirty state of the Container - `true` if there are any fields which have been changed since initial load.
542
+ */
543
+ this.onDirtyStateChange = new EventEmitter();
544
+ /**
545
+ * This event fires on the owning Calendar when a drag creation gesture is completed.
546
+ * @param {object} event Event object
547
+ * @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
548
+ * @param {Core.util.drag.DragContext} event.drag The drag create context.
549
+ * @param {Event} event.event The browser event.
550
+ * @param {Scheduler.model.EventModel} event.eventRecord The new `EventModel` record added in the store.
551
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
552
+ * @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
553
+ * @param {boolean,ValidateCreateResult} event.validation The result of the [validateCreateFn](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag#config-validateCreateFn) if one was provided.
554
+ * @param {CalendarView} event.view The Calendar widget in which the drag completed.
555
+ */
556
+ this.onDragCreateEnd = new EventEmitter();
557
+ /**
558
+ * This event fires on the owning Calendar when a drag move gesture is completed. The `eventRecord` has already been added
559
+ * to the `eventStore` of the owning calendar.
560
+ * @param {object} event Event object
561
+ * @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
562
+ * @param {Core.util.drag.DragContext} event.drag The drag create context.
563
+ * @param {Event} event.event The browser event.
564
+ * @param {Scheduler.model.EventModel} event.eventRecord The updated `EventModel` record.
565
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The `ResourceModel` record if the gesture was performed in a resource-type view.
566
+ * @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
567
+ * @param {boolean,ValidateCreateResult} event.validation The result of the [validateMoveFn](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag#config-validateMoveFn) if one was provided.
568
+ * @param {CalendarView} event.view The Calendar widget in which the drag completed.
569
+ */
570
+ this.onDragMoveEnd = new EventEmitter();
571
+ /**
572
+ * This event is fired on the owning Calendar when dragging an event from the calendar over the
573
+ * external source <strong>if the [droppable](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-droppable) was configured</strong>.
574
+ * ...
575
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dragMoveExternal)
576
+ * @param {object} event Event object
577
+ * @param {Scheduler.model.EventModel} event.eventRecord The event record being dragged.
578
+ * @param {HTMLElement} event.itemElement The element in which the drag gesture started.
579
+ * @param {HTMLElement} event.targetElement The current over element.
580
+ * @param {Event} event.domEvent The pointer event associated with the drag point.
581
+ * @param {number} event.overIndex *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, the index of the row being moved over;
582
+ * @param {Core.data.Model} event.overRecord *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, the record being moved over;
583
+ * @param {boolean} event.isAbove *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, `true` if the pointer position is above the halfway line of the over row.
584
+ * @param {boolean} event.altKey `true` if the Alt key was down when the last event was processed.
585
+ * @param {boolean} event.ctrlKey `true` if the Ctrl key was down when the last event was processed.
586
+ * @param {boolean} event.metaKey `true` if the Meta key was down when the last event was processed.
587
+ * @param {boolean} event.shiftKey `true` if the Shift key was down when the last event was processed.
588
+ */
589
+ this.onDragMoveExternal = new EventEmitter();
590
+ /**
591
+ * This event fires on the owning Calendar when a drag resize gesture is completed.
592
+ * @param {object} event Event object
593
+ * @param {Calendar.view.Calendar} event.source The Calendar instance that fired the event.
594
+ * @param {Core.util.drag.DragContext} event.drag The drag create context.
595
+ * @param {Event} event.event The browser event.
596
+ * @param {Scheduler.model.EventModel} event.eventRecord The updated `EventModel` record.
597
+ * @param {Calendar.feature.CalendarDrag} event.feature The Calendar drag feature instance.
598
+ * @param {boolean,ValidateCreateResult} event.validation The result of the [validateResizeFn](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag#config-validateResizeFn) if one was provided.
599
+ * @param {CalendarView} event.view The Calendar widget in which the drag completed.
600
+ */
601
+ this.onDragResizeEnd = new EventEmitter();
602
+ /**
603
+ * This event is fired on the owning Calendar after dropping an event from the calendar on the
604
+ * external source has been completed <strong>if the [droppable](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-droppable) was configured</strong>.
605
+ * ...
606
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-dropExternal)
607
+ * @param {object} event Event object
608
+ * @param {Scheduler.model.EventModel} event.eventRecord The event record that was dropped.
609
+ * @param {boolean} event.dropOnCalendar `true` if the drop gesture is over the client Calendar. This feature also allows drag *out* of the Calendar and onto the external event source if the [droppable](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-droppable) config is set.
610
+ * @param {HTMLElement} event.itemElement The element in which the drag gesture started.
611
+ * @param {HTMLElement} event.targetElement The current over element.
612
+ * @param {Event} event.domEvent The pointer event associated with the drag point.
613
+ * @param {number} event.overIndex *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, the index of the row being moved over;
614
+ * @param {Core.data.Model} event.overRecord *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, the record being moved over;
615
+ * @param {boolean} event.isAbove *If [grid](https://bryntum.com/products/calendar/docs/api/Calendar/feature/ExternalEventSource#config-grid) was specified*, `true` if the pointer position is above the halfway line of the over row.
616
+ * @param {boolean} event.altKey `true` if the Alt key was down when the last event was processed.
617
+ * @param {boolean} event.ctrlKey `true` if the Ctrl key was down when the last event was processed.
618
+ * @param {boolean} event.metaKey `true` if the Meta key was down when the last event was processed.
619
+ * @param {boolean} event.shiftKey `true` if the Shift key was down when the last event was processed.
620
+ */
621
+ this.onDropExternal = new EventEmitter();
622
+ /**
623
+ * Triggered when a widget's [element](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#property-element) is available.
624
+ * @param {object} event Event object
625
+ * @param {HTMLElement} event.element The Widget's element.
626
+ */
627
+ this.onElementCreated = new EventEmitter();
628
+ /**
629
+ * Fired when an empty cell content area is clicked on in a [MonthView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView) or a
630
+ * [CalendarRow](https://bryntum.com/products/calendar/docs/api/Calendar/widget/CalendarRow).
631
+ * @param {object} event Event object
632
+ * @param {CalendarView} event.source The child view on which the event was initiated.
633
+ * @param {Event} event.domEvent The triggering DOM event.
634
+ * @param {Date} event.date The date which has no visible events
635
+ */
636
+ this.onEmptyCellClick = new EventEmitter();
637
+ /**
638
+ * Fired when an [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate) gesture has
639
+ * created a new event and added it to the event store.
640
+ * ...
641
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-eventAutoCreated)
642
+ * @param {object} event Event object
643
+ * @param {CalendarView} event.source The child view on which the event was initiated.
644
+ * @param {Scheduler.model.EventModel} event.eventRecord The new event record.
645
+ */
646
+ this.onEventAutoCreated = new EventEmitter();
647
+ /**
648
+ * Fires when an event bar is clicked in any view.
649
+ * @param {object} event Event object
650
+ * @param {CalendarView} event.source The view which triggered the event.
651
+ * @param {Event} event.domEvent The initiating DOM event.
652
+ * @param {Date} event.date The date of the UI element which contains the event.
653
+ * @param {HTMLElement} event.eventElement The UI element which represents the event.
654
+ * @param {Scheduler.model.EventModel} event.eventRecord The event clicked on.
655
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource clicked on if the UI includes a resource.
656
+ * @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
657
+ */
658
+ this.onEventClick = new EventEmitter();
659
+ /**
660
+ * Fires when an event bar is right-clicked in any view.
661
+ * @param {object} event Event object
662
+ * @param {CalendarView} event.source The view which triggered the event.
663
+ * @param {Event} event.domEvent The initiating DOM event.
664
+ * @param {Date} event.date The date of the UI element which contains the event.
665
+ * @param {HTMLElement} event.eventElement The UI element which represents the event.
666
+ * @param {Scheduler.model.EventModel} event.eventRecord The event right-clicked on.
667
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource right-clicked on if the UI includes a resource.
668
+ * @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
669
+ */
670
+ this.onEventContextMenu = new EventEmitter();
671
+ /**
672
+ * Fires when an event bar is double clicked in any view.
673
+ * @param {object} event Event object
674
+ * @param {CalendarView} event.source The view which triggered the event.
675
+ * @param {Event} event.domEvent The initiating DOM event.
676
+ * @param {Date} event.date The date of the UI element which contains the event.
677
+ * @param {HTMLElement} event.eventElement The UI element which represents the event.
678
+ * @param {Scheduler.model.EventModel} event.eventRecord The event double clicked on.
679
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource double clicked on if the UI includes a resource.
680
+ * @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
681
+ */
682
+ this.onEventDblClick = new EventEmitter();
683
+ /**
684
+ * Fired before the editor will load the event record data into its input fields. This is useful if you
685
+ * want to modify the fields before data is loaded (e.g. set some input field to be readonly)
686
+ * @param {object} event Event object
687
+ * @param {Core.widget.Container} event.source The editor widget
688
+ * @param {Scheduler.model.EventModel} event.record The record
689
+ */
690
+ this.onEventEditBeforeSetRecord = new EventEmitter();
691
+ /**
692
+ * Fires when a key is pressed while an event bar is focused.
693
+ * @param {object} event Event object
694
+ * @param {CalendarView} event.source The view which triggered the event.
695
+ * @param {Event} event.domEvent The initiating DOM event.
696
+ * @param {Date} event.date The date of the UI element which contains the event.
697
+ * @param {HTMLElement} event.eventElement The UI element which represents the event.
698
+ * @param {Scheduler.model.EventModel} event.eventRecord The event in which the key event was detected.
699
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource in which the key event was detected if the UI includes a resource.
700
+ * @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
701
+ */
702
+ this.onEventKeyDown = new EventEmitter();
703
+ /**
704
+ * This event fires on the owning Scheduler before the context menu is shown for an event. Allows manipulation of the items
705
+ * to show in the same way as in `processItems`. Returning `false` from a listener prevents the menu from
706
+ * being shown.
707
+ * @param {object} event Event object
708
+ * @param {Scheduler.view.Scheduler} event.source
709
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
710
+ * @param {Scheduler.model.EventModel} event.eventRecord Event record for which the menu was triggered
711
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
712
+ * @param {Scheduler.model.AssignmentModel} event.assignmentRecord Assignment record, if assignments are used
713
+ * @param {HTMLElement} event.eventElement
714
+ * @param {MouseEvent} event.event Pointer event which triggered the context menu (if any)
715
+ */
716
+ this.onEventMenuBeforeShow = new EventEmitter();
717
+ /**
718
+ * This event fires on the owning Scheduler when an item is selected in the context menu.
719
+ * @param {object} event Event object
720
+ * @param {Scheduler.view.Scheduler} event.source
721
+ * @param {Core.widget.MenuItem} event.item
722
+ * @param {Scheduler.model.EventModel} event.eventRecord
723
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord
724
+ * @param {Scheduler.model.AssignmentModel} event.assignmentRecord Assignment record, if assignments are used
725
+ * @param {HTMLElement} event.eventElement
726
+ */
727
+ this.onEventMenuItem = new EventEmitter();
728
+ /**
729
+ * This event fires on the owning Scheduler after showing the context menu for an event
730
+ * @param {object} event Event object
731
+ * @param {Scheduler.view.Scheduler} event.source
732
+ * @param {Core.widget.Menu} event.menu The menu
733
+ * @param {Scheduler.model.EventModel} event.eventRecord Event record for which the menu was triggered
734
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
735
+ * @param {Scheduler.model.AssignmentModel} event.assignmentRecord Assignment record, if assignments are used
736
+ * @param {HTMLElement} event.eventElement
737
+ */
738
+ this.onEventMenuShow = new EventEmitter();
739
+ /**
740
+ * Fires when an event bar is mousedowned in any view.
741
+ * @param {object} event Event object
742
+ * @param {CalendarView} event.source The view which triggered the event.
743
+ * @param {Event} event.domEvent The initiating DOM event.
744
+ * @param {Date} event.date The date of the UI element which contains the event.
745
+ * @param {HTMLElement} event.eventElement The UI element which represents the event.
746
+ * @param {Scheduler.model.EventModel} event.eventRecord The event mousedowned on.
747
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource mousedowned on if the UI includes a resource.
748
+ * @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
749
+ */
750
+ this.onEventMouseDown = new EventEmitter();
751
+ /**
752
+ * Fires when cursor enters an event bar in any view.
753
+ * @param {object} event Event object
754
+ * @param {CalendarView} event.source The view which triggered the event.
755
+ * @param {Event} event.domEvent The initiating DOM event.
756
+ * @param {Date} event.date The date of the UI element which contains the event.
757
+ * @param {HTMLElement} event.eventElement The UI element which represents the event.
758
+ * @param {Scheduler.model.EventModel} event.eventRecord The event record.
759
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource if the UI includes a resource.
760
+ * @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
761
+ */
762
+ this.onEventMouseEnter = new EventEmitter();
763
+ /**
764
+ * Fires when cursor leaves an event bar in any view.
765
+ * @param {object} event Event object
766
+ * @param {CalendarView} event.source The view which triggered the event.
767
+ * @param {Event} event.domEvent The initiating DOM event.
768
+ * @param {Date} event.date The date of the UI element which contains the event.
769
+ * @param {HTMLElement} event.eventElement The UI element which represents the event.
770
+ * @param {Scheduler.model.EventModel} event.eventRecord The event record.
771
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource if the UI includes a resource.
772
+ * @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
773
+ */
774
+ this.onEventMouseLeave = new EventEmitter();
775
+ /**
776
+ * Fires when an event bar is mouseouted in any view.
777
+ * @param {object} event Event object
778
+ * @param {CalendarView} event.source The view which triggered the event.
779
+ * @param {Event} event.domEvent The initiating DOM event.
780
+ * @param {Date} event.date The date of the UI element which contains the event.
781
+ * @param {HTMLElement} event.eventElement The UI element which represents the event.
782
+ * @param {Scheduler.model.EventModel} event.eventRecord The event mouseouted.
783
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource mouseouted if the UI includes a resource.
784
+ * @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
785
+ */
786
+ this.onEventMouseOut = new EventEmitter();
787
+ /**
788
+ * Fires when an event bar is mouseovered in any view.
789
+ * @param {object} event Event object
790
+ * @param {CalendarView} event.source The view which triggered the event.
791
+ * @param {Event} event.domEvent The initiating DOM event.
792
+ * @param {Date} event.date The date of the UI element which contains the event.
793
+ * @param {HTMLElement} event.eventElement The UI element which represents the event.
794
+ * @param {Scheduler.model.EventModel} event.eventRecord The event mouseovered.
795
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource mouseovered if the UI includes a resource.
796
+ * @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
797
+ */
798
+ this.onEventMouseOver = new EventEmitter();
799
+ /**
800
+ * Fires when an event bar is mouseupped in any view.
801
+ * @param {object} event Event object
802
+ * @param {CalendarView} event.source The view which triggered the event.
803
+ * @param {Event} event.domEvent The initiating DOM event.
804
+ * @param {Date} event.date The date of the UI element which contains the event.
805
+ * @param {HTMLElement} event.eventElement The UI element which represents the event.
806
+ * @param {Scheduler.model.EventModel} event.eventRecord The event mouseupped.
807
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource mouseupped if the UI includes a resource.
808
+ * @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
809
+ */
810
+ this.onEventMouseUp = new EventEmitter();
811
+ /**
812
+ * Fires when a day spanning event is found, and the date to which its encapsulating event bar
813
+ * extends has been calculated.
814
+ * ...
815
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-eventPropagate)
816
+ * @param {object} event Event object
817
+ * @param {CalendarView} event.source The view which triggered the event.
818
+ * @param {Date} event.eventEndDate The end date for which to calculate the propagate end date.
819
+ * @param {Date} event.propagateEndDate The system-calculated end point of the event bar.
820
+ * @param {boolean} event.isAllDay `true` if the event is an all day event, or spans multiple days.
821
+ * @param {boolean} event.isOverflow `true` if this is being called as part of further propagation.
822
+ * @param {boolean} event.overflows `true` if the event extends into future cells.
823
+ * @param {Scheduler.model.EventModel} event.eventRecord The event record being propagated.
824
+ * @param {Date} event.date The date from which the event is being propagated.
825
+ */
826
+ this.onEventPropagate = new EventEmitter();
827
+ /**
828
+ * Fires when a Panel is expanded using the [collapsible](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-collapsible) setting.
829
+ * @param {object} event Event object
830
+ * @param {Core.widget.Panel} event.source This Panel.
831
+ */
832
+ this.onExpand = new EventEmitter();
833
+ /**
834
+ * Fired when focus enters this Widget.
835
+ * @param {object} event Event object
836
+ * @param {Core.widget.Widget} event.source This Widget
837
+ * @param {HTMLElement} event.fromElement The element which lost focus.
838
+ * @param {HTMLElement} event.toElement The element which gained focus.
839
+ * @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
840
+ * @param {Core.widget.Widget} event.toWidget The widget which gained focus.
841
+ * @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
842
+ */
843
+ this.onFocusIn = new EventEmitter();
844
+ /**
845
+ * Fired when focus exits this Widget's ownership tree. This is different from a `blur` event.
846
+ * focus moving from within this Widget's ownership tree, even if there are floating widgets
847
+ * will not trigger this event. This is when focus exits this widget completely.
848
+ * @param {object} event Event object
849
+ * @param {Core.widget.Widget} event.source This Widget
850
+ * @param {HTMLElement} event.fromElement The element which lost focus.
851
+ * @param {HTMLElement} event.toElement The element which gained focus.
852
+ * @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
853
+ * @param {Core.widget.Widget} event.toWidget The widget which gained focus.
854
+ * @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
855
+ */
856
+ this.onFocusOut = new EventEmitter();
857
+ /**
858
+ * Triggered after a widget was hidden
859
+ * @param {object} event Event object
860
+ * @param {Core.widget.Widget} event.source The widget
861
+ */
862
+ this.onHide = new EventEmitter();
863
+ /**
864
+ * Fires when the [LoadOnDemand](https://bryntum.com/products/calendar/docs/api/Calendar/feature/LoadOnDemand) feature detects that a request
865
+ * for data from the server has failed.
866
+ * ...
867
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-loadOnDemandFail)
868
+ * @param {object} event Event object
869
+ * @param {Response} event.rawResponse The HTTP `fetch` response object.
870
+ * @param {object} event.request The CrudManager load data block.
871
+ * @param {object} event.response The decoded JSON response.
872
+ */
873
+ this.onLoadOnDemandFail = new EventEmitter();
874
+ /**
875
+ * Fires when a month name header in a [YearView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/YearView) or a [MonthGrid](#Calendar/widget/MonthGrid) is clicked
876
+ * or activated by the <kbd>ENTER</kbd> key.
877
+ * ...
878
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-monthNameClick)
879
+ * @param {object} event Event object
880
+ * @param {CalendarView} event.source The view which triggered the event.
881
+ * @param {Event} event.domEvent The initiating DOM event.
882
+ * @param {number} event.month The month index *(zero based)* clicked on.
883
+ * @param {Date} event.date The date of the first of the month clicked on.
884
+ */
885
+ this.onMonthNameClick = new EventEmitter();
886
+ /**
887
+ * Fired when a user gesture causes the active item to change.
888
+ * @param {object} event Event object
889
+ * @param {Event} event.event The browser event which instigated navigation. May be a click or key or focus event.
890
+ * @param {HTMLElement,null} event.item The newly active item, or `null` if focus moved out.
891
+ * @param {HTMLElement,null} event.oldItem The previously active item, or `null` if focus is moving in.
892
+ */
893
+ this.onNavigate = new EventEmitter();
894
+ /**
895
+ * Triggered when a widget which had been in a non-visible state for any reason
896
+ * achieves visibility.
897
+ * ...
898
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-paint)
899
+ * @param {object} event Event object
900
+ * @param {Core.widget.Widget} event.source The widget being painted.
901
+ * @param {boolean} event.firstPaint `true` if this is the first paint.
902
+ */
903
+ this.onPaint = new EventEmitter();
904
+ /**
905
+ * Fires on the owning Scheduler after a paste action is performed.
906
+ * @param {object} event Event object
907
+ * @param {Scheduler.view.Scheduler} event.source Owner scheduler
908
+ * @param {Scheduler.model.EventModel[]} event.eventRecords The pasted event records
909
+ * @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The pasted assignment records
910
+ * @param {Scheduler.model.EventModel[]} event.pastedEventRecords (DEPRECATED) Use eventRecords instead
911
+ * @param {Scheduler.model.EventModel[]} event.originalEventRecords The original copied event records
912
+ * @param {Scheduler.model.AssignmentModel[]} event.originalAssignmentRecords The original copied assignment records
913
+ * @param {Date} event.date date Pasted to this date
914
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The target resource record
915
+ * @param {boolean} event.isCut `true` if this is a cut action
916
+ * @param {string} event.entityName 'event' to distinguish this event from other paste events
917
+ */
918
+ this.onPaste = new EventEmitter();
919
+ /**
920
+ * Fires on the owning Scheduler if a paste action is not allowed. Depending on if the EventStore is using
921
+ * [singleAssignment](https://bryntum.com/products/calendar/docs/api/Scheduler/data/EventStore#config-singleAssignment) or the configuration of
922
+ * [copyPasteAction](https://bryntum.com/products/calendar/docs/api/Scheduler/feature/EventCopyPaste#config-copyPasteAction), either the `eventRecords` or the `assignmentRecords` param will be populated
923
+ * with record copies.
924
+ * @param {object} event Event object
925
+ * @param {Scheduler.view.Scheduler} event.source Owner scheduler
926
+ * @param {Scheduler.model.EventModel[]} event.eventRecords The event records about to be pasted
927
+ * @param {Scheduler.model.AssignmentModel[]} event.assignmentRecords The assignment records about to be pasted
928
+ * @param {Scheduler.model.EventModel[]} event.originalEventRecords The event records that were copied
929
+ * @param {Scheduler.model.AssignmentModel[]} event.originalAssignmentRecords The assignment records that were copied
930
+ * @param {Date} event.date The paste date
931
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The target resource record
932
+ * @param {boolean} event.isCut `true` if this is a cut action
933
+ * @param {string} event.entityName 'event' to distinguish this event from other `pasteNotAllowed` events
934
+ * @param {'overlappingEvents','resourceReadOnly'} event.reason A string id to use for displaying an error message to the user.
935
+ */
936
+ this.onPasteNotAllowed = new EventEmitter();
937
+ /**
938
+ * Fired when a Widget's read only state is toggled
939
+ * @param {object} event Event object
940
+ * @param {boolean} event.readOnly Read only or not
941
+ */
942
+ this.onReadOnly = new EventEmitter();
943
+ /**
944
+ * This event is fired after a widget's elements have been synchronized due to a direct or indirect call
945
+ * to [recompose](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#function-recompose), if this results in some change to the widget's rendered DOM elements.
946
+ */
947
+ this.onRecompose = new EventEmitter();
948
+ /**
949
+ * Fires when one of the views in this Calendar refreshes.
950
+ * @param {object} event Event object
951
+ * @param {CalendarView} event.source The view which refreshed.
952
+ */
953
+ this.onRefresh = new EventEmitter();
954
+ /**
955
+ * Fired when the encapsulating element of a Widget resizes *only when [monitorResize](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#config-monitorResize) is `true`*.
956
+ * @param {object} event Event object
957
+ * @param {Core.widget.Widget} event.source This Widget
958
+ * @param {number} event.width The new width
959
+ * @param {number} event.height The new height
960
+ * @param {number} event.oldWidth The old width
961
+ * @param {number} event.oldHeight The old height
962
+ */
963
+ this.onResize = new EventEmitter();
964
+ /**
965
+ * Fires when a click event is received by a view which supports resources.
966
+ * ...
967
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-resourceClick)
968
+ * @param {object} event Event object
969
+ * @param {CalendarView} event.source The view which triggered the event.
970
+ * @param {Event} event.domEvent The initiating DOM event.
971
+ * @param {Date} event.date The date of the UI element which contains the event.
972
+ * @param {HTMLElement} event.eventElement *If* an event was interacted with, the UI element which represents the event.
973
+ * @param {Scheduler.model.EventModel} event.eventRecord *If* an event was interacted with.
974
+ * @param {HTMLElement} event.resourceElement The UI element which encapsulates the resource.
975
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the target element.
976
+ * @param {boolean} event.fromOverflowPopup `true` if the interaction was through the source view's [overflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#property-overflowPopup).
977
+ */
978
+ this.onResourceClick = new EventEmitter();
979
+ /**
980
+ * Triggered when a new [responsiveState](https://bryntum.com/products/calendar/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
981
+ * @param {object} event Event object
982
+ * @param {Core.widget.Widget} event.source The widget whose `responsiveState` has changed
983
+ * @param {string} event.state The new value for the widget's `responsiveState`
984
+ * @param {string} event.oldState The previous value for the widget's `responsiveState`
985
+ */
986
+ this.onResponsiveStateChange = new EventEmitter();
987
+ /**
988
+ * Fires when a click made its way through to an empty part of any view.
989
+ * @param {object} event Event object
990
+ * @param {CalendarView} event.source The view which triggered the event.
991
+ * @param {Event} event.domEvent The initiating DOM event.
992
+ * @param {Date} event.date The date clicked on. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
993
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
994
+ */
995
+ this.onScheduleClick = new EventEmitter();
996
+ /**
997
+ * Fires when a context menu made its way through to an empty part of any view.
998
+ * @param {object} event Event object
999
+ * @param {CalendarView} event.source The view which triggered the event.
1000
+ * @param {Event} event.domEvent The initiating DOM event.
1001
+ * @param {Date} event.date The date clicked on. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
1002
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
1003
+ */
1004
+ this.onScheduleContextMenu = new EventEmitter();
1005
+ /**
1006
+ * Fires when a dblclick made its way through to an empty part of any view.
1007
+ * @param {object} event Event object
1008
+ * @param {CalendarView} event.source The view which triggered the event.
1009
+ * @param {Event} event.domEvent The initiating DOM event.
1010
+ * @param {Date} event.date The date double clicked on. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
1011
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
1012
+ */
1013
+ this.onScheduleDblClick = new EventEmitter();
1014
+ /**
1015
+ * This event fires on the owning Scheduler or Gantt widget before the context menu is shown for the schedule.
1016
+ * Allows manipulation of the items to show in the same way as in `processItems`. Returning `false` from a listener
1017
+ * prevents the menu from being shown.
1018
+ * @param {object} event Event object
1019
+ * @param {Scheduler.view.Scheduler} event.source
1020
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
1021
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord Resource record
1022
+ * @param {Date} event.date Clicked date, rounded according to viewPreset's settings
1023
+ * @param {Scheduler.model.AssignmentModel} event.assignmentRecord Assignment record, if assignments are used
1024
+ * @param {HTMLElement} event.eventElement
1025
+ */
1026
+ this.onScheduleMenuBeforeShow = new EventEmitter();
1027
+ /**
1028
+ * This event fires on the owning Scheduler or Gantt widget when an item is selected in the context menu.
1029
+ * @param {object} event Event object
1030
+ * @param {Scheduler.view.Scheduler} event.source
1031
+ * @param {Core.widget.MenuItem} event.item
1032
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord
1033
+ * @param {Date} event.date Clicked date, rounded according to viewPreset's settings
1034
+ * @param {HTMLElement} event.element
1035
+ */
1036
+ this.onScheduleMenuItem = new EventEmitter();
1037
+ /**
1038
+ * This event fires on the owning Scheduler or Gantt widget after showing the context menu for the schedule.
1039
+ * @param {object} event Event object
1040
+ * @param {Scheduler.view.Scheduler} event.source
1041
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
1042
+ * @param {Core.widget.Menu} event.menu The menu
1043
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord
1044
+ * @param {Date} event.date Clicked date, rounded according to viewPreset's settings
1045
+ * @param {HTMLElement} event.targetElement
1046
+ */
1047
+ this.onScheduleMenuShow = new EventEmitter();
1048
+ /**
1049
+ * Fires when a mousedown made its way through to an empty part of any view.
1050
+ * @param {object} event Event object
1051
+ * @param {CalendarView} event.source The view which triggered the event.
1052
+ * @param {Event} event.domEvent The initiating DOM event.
1053
+ * @param {Date} event.date The date mousedowned on. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
1054
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
1055
+ */
1056
+ this.onScheduleMouseDown = new EventEmitter();
1057
+ /**
1058
+ * Fires when a mouseout made it's way through to an empty part of any view.
1059
+ * @param {object} event Event object
1060
+ * @param {CalendarView} event.source The view which triggered the event.
1061
+ * @param {Event} event.domEvent The initiating DOM event.
1062
+ * @param {Date} event.date The date mouseouted. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
1063
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
1064
+ */
1065
+ this.onScheduleMouseOut = new EventEmitter();
1066
+ /**
1067
+ * Fires when a mouseover made its way through to an empty part of any view.
1068
+ * @param {object} event Event object
1069
+ * @param {CalendarView} event.source The view which triggered the event.
1070
+ * @param {Event} event.domEvent The initiating DOM event.
1071
+ * @param {Date} event.date The date mouseovered. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
1072
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
1073
+ */
1074
+ this.onScheduleMouseOver = new EventEmitter();
1075
+ /**
1076
+ * Fires when a mouseup made its way through to an empty part of any view.
1077
+ * @param {object} event Event object
1078
+ * @param {CalendarView} event.source The view which triggered the event.
1079
+ * @param {Event} event.domEvent The initiating DOM event.
1080
+ * @param {Date} event.date The date mouseupped on. _Note that in a [DayView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView), this will include granular time information. For other views, this is the *start* of the date.
1081
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource associated with the view if any. Only [ResourceView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/ResourceView) or a [DayResourceView](#Calendar/widget/DayResourceView) will include this.
1082
+ */
1083
+ this.onScheduleMouseUp = new EventEmitter();
1084
+ /**
1085
+ * Fired any time there is a change to the events selected in the Calendar.
1086
+ * @param {object} event Event object
1087
+ * @param {Calendar.view.Calendar} event.source The Calendar instance.
1088
+ * @param {'select','deselect','update','clear'} event.action One of the actions 'select', 'deselect', 'update', 'clear'
1089
+ * @param {Scheduler.model.EventModel[]} event.selected An array of the Events added to the selection.
1090
+ * @param {Scheduler.model.EventModel[]} event.deselected An array of the Event removed from the selection.
1091
+ * @param {Scheduler.model.EventModel[]} event.selection The new selection.
1092
+ */
1093
+ this.onSelectionChange = new EventEmitter();
1094
+ /**
1095
+ * Triggered after a widget is shown.
1096
+ * @param {object} event Event object
1097
+ * @param {Core.widget.Widget} event.source The widget
1098
+ */
1099
+ this.onShow = new EventEmitter();
1100
+ /**
1101
+ * Fired when the sidebar is collapsed either through the UI or programatically.
1102
+ * @param {object} event Event object
1103
+ * @param {Calendar.view.Calendar} event.source This Calendar instance
1104
+ */
1105
+ this.onSidebarCollapse = new EventEmitter();
1106
+ /**
1107
+ * Fired when the sidebar is expanded either through the UI or programatically.
1108
+ * @param {object} event Event object
1109
+ * @param {Calendar.view.Calendar} event.source This Calendar instance
1110
+ */
1111
+ this.onSidebarExpand = new EventEmitter();
1112
+ /**
1113
+ * Fired when a time axis of a DayView or WeekView is clicked on. If the handler returns
1114
+ * `false` the current pointer event is not processed further.
1115
+ * @param {object} event Event object
1116
+ * @param {CalendarView} event.source The view which triggered the event.
1117
+ * @param {Event} event.domEvent The triggering DOM event.
1118
+ * @param {Date} event.preciseTime The exact date and time at the clicked position
1119
+ * @param {Date} event.time The date and time at the clicked position snapped according to the [increment](https://bryntum.com/products/calendar/docs/api/Calendar/widget/DayView#config-increment) and [timeSnapType](#Calendar/widget/DayView#config-timeSnapType)
1120
+ */
1121
+ this.onTimeAxisClick = new EventEmitter();
1122
+ /**
1123
+ * Fired on the owning Scheduler or Gantt widget when a click happens on a time range header element
1124
+ * @param {object} event Event object
1125
+ * @param {Scheduler.view.Scheduler} event.source Scheduler instance
1126
+ * @param {Scheduler.model.TimeSpan} event.timeRangeRecord The record
1127
+ * @param {MouseEvent} event.domEvent Browser event
1128
+ */
1129
+ this.onTimeRangeHeaderClick = new EventEmitter();
1130
+ /**
1131
+ * Fired on the owning Scheduler or Gantt widget when a right click happens on a time range header element
1132
+ * @param {object} event Event object
1133
+ * @param {Scheduler.view.Scheduler} event.source Scheduler instance
1134
+ * @param {Scheduler.model.TimeSpan} event.timeRangeRecord The record
1135
+ * @param {MouseEvent} event.domEvent Browser event
1136
+ */
1137
+ this.onTimeRangeHeaderContextMenu = new EventEmitter();
1138
+ /**
1139
+ * Fired on the owning Scheduler or Gantt widget when a double click happens on a time range header element
1140
+ * @param {object} event Event object
1141
+ * @param {Scheduler.view.Scheduler} event.source Scheduler instance
1142
+ * @param {Scheduler.model.TimeSpan} event.timeRangeRecord The record
1143
+ * @param {MouseEvent} event.domEvent Browser event
1144
+ */
1145
+ this.onTimeRangeHeaderDblClick = new EventEmitter();
1146
+ /**
1147
+ * A header [tool](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-tools) has been clicked.
1148
+ * @param {object} event Event object
1149
+ * @param {Core.widget.Tool} event.source This Panel.
1150
+ * @param {Core.widget.Tool} event.tool The tool which is being clicked.
1151
+ */
1152
+ this.onToolClick = new EventEmitter();
1153
+ /**
1154
+ * Fires when one of the child views is painted. That is when it becomes visible.
1155
+ * Note that due to the slide-in animation, while the view is visible, it will not
1156
+ * yet be in its final position.
1157
+ * @param {object} event Event object
1158
+ * @param {CalendarView} event.source The widget being painted
1159
+ * @param {boolean} event.firstPaint `true` if this is the first paint
1160
+ */
1161
+ this.onViewPaint = new EventEmitter();
1162
+ /**
1163
+ * Fires when a week number is clicked or activated by the <kbd>ENTER</kbd> key. This will include the week number cells of a
1164
+ * [YearView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/YearView), the week number in the first cell
1165
+ * in each row of a [MonthView](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView)
1166
+ * ...
1167
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/view/Calendar#event-weekNumberClick)
1168
+ * @param {object} event Event object
1169
+ * @param {CalendarView} event.source The view which triggered the event.
1170
+ * @param {Event} event.domEvent The initiating DOM event.
1171
+ * @param {number[]} event.week The `[year, week]` clicked on.
1172
+ * @param {Date} event.date The date clicked on.
1173
+ */
1174
+ this.onWeekNumberClick = new EventEmitter();
1175
+ this.elementRef = element;
1176
+ }
1177
+ /**
1178
+ * Create and append the underlying widget
1179
+ */
1180
+ ngOnInit() {
1181
+ const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumCalendarComponent;
1182
+ bryntumConfigs.filter(prop => prop in this).forEach(prop => {
1183
+ // @ts-ignore
1184
+ WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
1185
+ if (['features', 'config'].includes(prop)) {
1186
+ WrapperHelper.devWarningConfigProp(instanceName, prop);
1187
+ }
1188
+ });
1189
+ // @ts-ignore
1190
+ bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
1191
+ const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
1192
+ // @ts-ignore
1193
+ bryntumConfig.listeners[eventName(event)] = e => {
1194
+ // @ts-ignore
1195
+ me[event].emit(e);
1196
+ // EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
1197
+ // in Angular listeners
1198
+ return e.returnValue;
1199
+ };
1200
+ });
1201
+ // If component has no container specified in config then use adopt to Wrapper's element
1202
+ const containerParam = [
1203
+ 'adopt',
1204
+ 'appendTo',
1205
+ 'insertAfter',
1206
+ 'insertBefore'
1207
+ // @ts-ignore
1208
+ ].find(prop => bryntumConfig[prop]);
1209
+ if (!containerParam) {
1210
+ if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
1211
+ // Button should always be <a> or <button> inside owner element
1212
+ bryntumConfig.appendTo = elementRef.nativeElement;
1213
+ }
1214
+ else {
1215
+ bryntumConfig.adopt = elementRef.nativeElement;
1216
+ }
1217
+ }
1218
+ else {
1219
+ WrapperHelper.devWarningContainer(instanceName, containerParam);
1220
+ }
1221
+ // @ts-ignore
1222
+ me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
1223
+ // Backwards compatibility for gridInstance, schedulerInstance etc.
1224
+ // @ts-ignore
1225
+ me[StringHelper.uncapitalize(instanceName) + 'Instance'] = me.instance;
1226
+ //
1227
+ }
1228
+ /**
1229
+ * Watch for changes
1230
+ * @param changes
1231
+ */
1232
+ ngOnChanges(changes) {
1233
+ const { instance } = this, { instanceName } = BryntumCalendarComponent;
1234
+ if (!instance) {
1235
+ return;
1236
+ }
1237
+ // Iterate over all changes
1238
+ Object.entries(changes).forEach(([prop, change]) => {
1239
+ const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumCalendarComponent;
1240
+ if (bryntumProps.includes(prop)) {
1241
+ WrapperHelper.applyPropValue(instance, prop, newValue, false);
1242
+ if (bryntumConfigsOnly.includes(prop)) {
1243
+ WrapperHelper.devWarningUpdateProp(instanceName, prop);
1244
+ }
1245
+ }
1246
+ });
1247
+ }
1248
+ /**
1249
+ * Destroy the component
1250
+ */
1251
+ ngOnDestroy() {
1252
+ // @ts-ignore
1253
+ if (this.instance && this.instance.destroy) {
1254
+ this.instance.destroy();
1255
+ }
1256
+ }
1257
+ }
1258
+ BryntumCalendarComponent.instanceClass = Calendar;
1259
+ BryntumCalendarComponent.instanceName = 'Calendar';
1260
+ BryntumCalendarComponent.bryntumEvents = [
1261
+ 'onActiveItemChange',
1262
+ 'onAfterEventEdit',
1263
+ 'onAfterEventSave',
1264
+ 'onBeforeActiveItemChange',
1265
+ 'onBeforeAssignmentDelete',
1266
+ 'onBeforeAssignmentSelectionChange',
1267
+ 'onBeforeAutoCreate',
1268
+ 'onBeforeCopy',
1269
+ 'onBeforeCreateMode',
1270
+ 'onBeforeCSVExport',
1271
+ 'onBeforeDestroy',
1272
+ 'onBeforeDragCreate',
1273
+ 'onBeforeDragCreateEnd',
1274
+ 'onBeforeDragMove',
1275
+ 'onBeforeDragMoveEnd',
1276
+ 'onBeforeDragResize',
1277
+ 'onBeforeDragResizeEnd',
1278
+ 'onBeforeDropExternal',
1279
+ 'onBeforeEventDelete',
1280
+ 'onBeforeEventEdit',
1281
+ 'onBeforeEventEditShow',
1282
+ 'onBeforeEventSave',
1283
+ 'onBeforeEventSelectionChange',
1284
+ 'onBeforeExcelExport',
1285
+ 'onBeforeHide',
1286
+ 'onBeforePaste',
1287
+ 'onBeforePrint',
1288
+ 'onBeforeResponsiveStateChange',
1289
+ 'onBeforeSetRecord',
1290
+ 'onBeforeShow',
1291
+ 'onBeforeStateApply',
1292
+ 'onBeforeStateSave',
1293
+ 'onCatchAll',
1294
+ 'onCellOverflowClick',
1295
+ 'onCollapse',
1296
+ 'onContextMenuItem',
1297
+ 'onContextMenuToggleItem',
1298
+ 'onCopy',
1299
+ 'onCurrentTimelineUpdate',
1300
+ 'onDataChange',
1301
+ 'onDateChange',
1302
+ 'onDateRangeChange',
1303
+ 'onDateRangeLoad',
1304
+ 'onDateRangeRequested',
1305
+ 'onDayCellPopulated',
1306
+ 'onDayNumberClick',
1307
+ 'onDestroy',
1308
+ 'onDirtyStateChange',
1309
+ 'onDragCreateEnd',
1310
+ 'onDragMoveEnd',
1311
+ 'onDragMoveExternal',
1312
+ 'onDragResizeEnd',
1313
+ 'onDropExternal',
1314
+ 'onElementCreated',
1315
+ 'onEmptyCellClick',
1316
+ 'onEventAutoCreated',
1317
+ 'onEventClick',
1318
+ 'onEventContextMenu',
1319
+ 'onEventDblClick',
1320
+ 'onEventEditBeforeSetRecord',
1321
+ 'onEventKeyDown',
1322
+ 'onEventMenuBeforeShow',
1323
+ 'onEventMenuItem',
1324
+ 'onEventMenuShow',
1325
+ 'onEventMouseDown',
1326
+ 'onEventMouseEnter',
1327
+ 'onEventMouseLeave',
1328
+ 'onEventMouseOut',
1329
+ 'onEventMouseOver',
1330
+ 'onEventMouseUp',
1331
+ 'onEventPropagate',
1332
+ 'onExpand',
1333
+ 'onFocusIn',
1334
+ 'onFocusOut',
1335
+ 'onHide',
1336
+ 'onLoadOnDemandFail',
1337
+ 'onMonthNameClick',
1338
+ 'onNavigate',
1339
+ 'onPaint',
1340
+ 'onPaste',
1341
+ 'onPasteNotAllowed',
1342
+ 'onReadOnly',
1343
+ 'onRecompose',
1344
+ 'onRefresh',
1345
+ 'onResize',
1346
+ 'onResourceClick',
1347
+ 'onResponsiveStateChange',
1348
+ 'onScheduleClick',
1349
+ 'onScheduleContextMenu',
1350
+ 'onScheduleDblClick',
1351
+ 'onScheduleMenuBeforeShow',
1352
+ 'onScheduleMenuItem',
1353
+ 'onScheduleMenuShow',
1354
+ 'onScheduleMouseDown',
1355
+ 'onScheduleMouseOut',
1356
+ 'onScheduleMouseOver',
1357
+ 'onScheduleMouseUp',
1358
+ 'onSelectionChange',
1359
+ 'onShow',
1360
+ 'onSidebarCollapse',
1361
+ 'onSidebarExpand',
1362
+ 'onTimeAxisClick',
1363
+ 'onTimeRangeHeaderClick',
1364
+ 'onTimeRangeHeaderContextMenu',
1365
+ 'onTimeRangeHeaderDblClick',
1366
+ 'onToolClick',
1367
+ 'onViewPaint',
1368
+ 'onWeekNumberClick'
1369
+ ];
1370
+ BryntumCalendarComponent.bryntumFeatureNames = [
1371
+ 'dragFeature',
1372
+ 'eventBufferFeature',
1373
+ 'eventCopyPasteFeature',
1374
+ 'eventEditFeature',
1375
+ 'eventMenuFeature',
1376
+ 'eventTooltipFeature',
1377
+ 'excelExporterFeature',
1378
+ 'externalEventSourceFeature',
1379
+ 'loadOnDemandFeature',
1380
+ 'printFeature',
1381
+ 'scheduleMenuFeature',
1382
+ 'scheduleTooltipFeature',
1383
+ 'timeRangesFeature',
1384
+ 'weekExpanderFeature'
1385
+ ];
1386
+ BryntumCalendarComponent.bryntumConfigs = BryntumCalendarComponent.bryntumFeatureNames.concat([
1387
+ 'activeDateCls',
1388
+ 'adopt',
1389
+ 'align',
1390
+ 'alignSelf',
1391
+ 'anchor',
1392
+ 'appendTo',
1393
+ 'ariaDescription',
1394
+ 'ariaLabel',
1395
+ 'assignments',
1396
+ 'assignmentStore',
1397
+ 'autoCreate',
1398
+ 'bbar',
1399
+ 'bodyCls',
1400
+ 'bubbleEvents',
1401
+ 'callOnFunctions',
1402
+ 'catchEventHandlerExceptions',
1403
+ 'centered',
1404
+ 'cls',
1405
+ 'collapsed',
1406
+ 'collapsible',
1407
+ 'color',
1408
+ 'column',
1409
+ 'config',
1410
+ 'constrainTo',
1411
+ 'contentElementCls',
1412
+ 'contextMenuTriggerEvent',
1413
+ 'crudManager',
1414
+ 'crudManagerClass',
1415
+ 'dataField',
1416
+ 'dataset',
1417
+ 'date',
1418
+ 'dateFormat',
1419
+ 'datePicker',
1420
+ 'defaultBindProperty',
1421
+ 'defaultCalendar',
1422
+ 'defaultFocus',
1423
+ 'defaults',
1424
+ 'deselectAllOnScheduleClick',
1425
+ 'deselectOnClick',
1426
+ 'destroyStores',
1427
+ 'detectCSSCompatibilityIssues',
1428
+ 'disabled',
1429
+ 'dock',
1430
+ 'draggable',
1431
+ 'drawer',
1432
+ 'elementAttributes',
1433
+ 'enableDeleteKey',
1434
+ 'enableRecurringEvents',
1435
+ 'enableUndoRedoKeys',
1436
+ 'events',
1437
+ 'eventSelectionDisabled',
1438
+ 'eventStore',
1439
+ 'extraData',
1440
+ 'filterEventResources',
1441
+ 'flex',
1442
+ 'floating',
1443
+ 'footer',
1444
+ 'header',
1445
+ 'height',
1446
+ 'hidden',
1447
+ 'hideAnimation',
1448
+ 'hideNonWorkingDays',
1449
+ 'hideWhenEmpty',
1450
+ 'highlightDate',
1451
+ 'highlightPredecessors',
1452
+ 'highlightSuccessors',
1453
+ 'icon',
1454
+ 'id',
1455
+ 'ignoreParentReadOnly',
1456
+ 'includeWeekendsButton',
1457
+ 'inputFieldAlign',
1458
+ 'insertBefore',
1459
+ 'insertFirst',
1460
+ 'isEventSelectable',
1461
+ 'itemCls',
1462
+ 'items',
1463
+ 'keyMap',
1464
+ 'labelPosition',
1465
+ 'layout',
1466
+ 'layoutStyle',
1467
+ 'lazyItems',
1468
+ 'listeners',
1469
+ 'loadMask',
1470
+ 'loadMaskDefaults',
1471
+ 'loadMaskError',
1472
+ 'localeClass',
1473
+ 'localizable',
1474
+ 'localizableProperties',
1475
+ 'maintainSelectionOnDatasetChange',
1476
+ 'margin',
1477
+ 'maskDefaults',
1478
+ 'masked',
1479
+ 'maxDate',
1480
+ 'maxHeight',
1481
+ 'maximizeOnMobile',
1482
+ 'maxWidth',
1483
+ 'minDate',
1484
+ 'minHeight',
1485
+ 'minWidth',
1486
+ 'mode',
1487
+ 'modeDefaults',
1488
+ 'modes',
1489
+ 'monitorResize',
1490
+ 'multiEventSelect',
1491
+ 'namedItems',
1492
+ 'navigatorPlacement',
1493
+ 'nonWorkingDays',
1494
+ 'overlaySidebar',
1495
+ 'owner',
1496
+ 'positioned',
1497
+ 'preventTooltipOnTouch',
1498
+ 'project',
1499
+ 'propagatedConfigs',
1500
+ 'readOnly',
1501
+ 'recurrenceConfirmationPopup',
1502
+ 'relayStoreEvents',
1503
+ 'rendition',
1504
+ 'resourceImagePath',
1505
+ 'resources',
1506
+ 'resourceStore',
1507
+ 'resourceTimeRanges',
1508
+ 'resourceTimeRangeStore',
1509
+ 'responsive',
1510
+ 'responsiveRoot',
1511
+ 'responsiveState',
1512
+ 'responsiveTarget',
1513
+ 'ripple',
1514
+ 'rootElement',
1515
+ 'rtl',
1516
+ 'scrollable',
1517
+ 'scrollAction',
1518
+ 'selectResourceOnEventNavigate',
1519
+ 'selectResourceOnScheduleClick',
1520
+ 'showAnimation',
1521
+ 'showRecurringUI',
1522
+ 'showTooltipWhenDisabled',
1523
+ 'sidebar',
1524
+ 'span',
1525
+ 'stateful',
1526
+ 'statefulEvents',
1527
+ 'stateId',
1528
+ 'stateProvider',
1529
+ 'strictRecordMapping',
1530
+ 'strips',
1531
+ 'syncMask',
1532
+ 'tab',
1533
+ 'tabBarItems',
1534
+ 'tag',
1535
+ 'tbar',
1536
+ 'textAlign',
1537
+ 'timeRanges',
1538
+ 'timeRangeStore',
1539
+ 'timeZone',
1540
+ 'title',
1541
+ 'tools',
1542
+ 'tooltip',
1543
+ 'trapFocus',
1544
+ 'triggerSelectionChangeOnRemove',
1545
+ 'type',
1546
+ 'ui',
1547
+ 'useContextualRecurrenceRules',
1548
+ 'viewContainer',
1549
+ 'weekStartDay',
1550
+ 'weight',
1551
+ 'width',
1552
+ 'x',
1553
+ 'y'
1554
+ ]);
1555
+ BryntumCalendarComponent.bryntumConfigsOnly = [
1556
+ 'adopt',
1557
+ 'align',
1558
+ 'anchor',
1559
+ 'ariaDescription',
1560
+ 'ariaLabel',
1561
+ 'assignmentStore',
1562
+ 'autoCreate',
1563
+ 'bbar',
1564
+ 'bodyCls',
1565
+ 'bubbleEvents',
1566
+ 'centered',
1567
+ 'collapsible',
1568
+ 'color',
1569
+ 'config',
1570
+ 'constrainTo',
1571
+ 'contentElementCls',
1572
+ 'contextMenuTriggerEvent',
1573
+ 'crudManagerClass',
1574
+ 'dataField',
1575
+ 'datePicker',
1576
+ 'defaultBindProperty',
1577
+ 'defaultFocus',
1578
+ 'defaults',
1579
+ 'deselectOnClick',
1580
+ 'destroyStores',
1581
+ 'detectCSSCompatibilityIssues',
1582
+ 'dock',
1583
+ 'draggable',
1584
+ 'drawer',
1585
+ 'elementAttributes',
1586
+ 'enableDeleteKey',
1587
+ 'enableRecurringEvents',
1588
+ 'enableUndoRedoKeys',
1589
+ 'eventSelectionDisabled',
1590
+ 'eventStore',
1591
+ 'filterEventResources',
1592
+ 'floating',
1593
+ 'footer',
1594
+ 'header',
1595
+ 'hideAnimation',
1596
+ 'hideWhenEmpty',
1597
+ 'highlightDate',
1598
+ 'highlightPredecessors',
1599
+ 'highlightSuccessors',
1600
+ 'icon',
1601
+ 'ignoreParentReadOnly',
1602
+ 'includeWeekendsButton',
1603
+ 'itemCls',
1604
+ 'lazyItems',
1605
+ 'listeners',
1606
+ 'loadMask',
1607
+ 'loadMaskDefaults',
1608
+ 'loadMaskError',
1609
+ 'localeClass',
1610
+ 'localizable',
1611
+ 'localizableProperties',
1612
+ 'maintainSelectionOnDatasetChange',
1613
+ 'maskDefaults',
1614
+ 'masked',
1615
+ 'monitorResize',
1616
+ 'multiEventSelect',
1617
+ 'namedItems',
1618
+ 'navigatorPlacement',
1619
+ 'overlaySidebar',
1620
+ 'owner',
1621
+ 'positioned',
1622
+ 'preventTooltipOnTouch',
1623
+ 'propagatedConfigs',
1624
+ 'relayStoreEvents',
1625
+ 'resourceImagePath',
1626
+ 'resourceStore',
1627
+ 'resourceTimeRangeStore',
1628
+ 'responsive',
1629
+ 'responsiveRoot',
1630
+ 'responsiveState',
1631
+ 'responsiveTarget',
1632
+ 'ripple',
1633
+ 'rootElement',
1634
+ 'scrollAction',
1635
+ 'showAnimation',
1636
+ 'showRecurringUI',
1637
+ 'showTooltipWhenDisabled',
1638
+ 'sidebar',
1639
+ 'stateful',
1640
+ 'statefulEvents',
1641
+ 'stateId',
1642
+ 'stateProvider',
1643
+ 'strips',
1644
+ 'syncMask',
1645
+ 'tab',
1646
+ 'tabBarItems',
1647
+ 'tag',
1648
+ 'tbar',
1649
+ 'textAlign',
1650
+ 'timeRangeStore',
1651
+ 'timeZone',
1652
+ 'trapFocus',
1653
+ 'triggerSelectionChangeOnRemove',
1654
+ 'type',
1655
+ 'ui',
1656
+ 'viewContainer',
1657
+ 'weekStartDay',
1658
+ 'weight'
1659
+ ];
1660
+ BryntumCalendarComponent.bryntumProps = BryntumCalendarComponent.bryntumFeatureNames.concat([
1661
+ 'activeDateCls',
1662
+ 'activeSubView',
1663
+ 'activeView',
1664
+ 'alignSelf',
1665
+ 'anchorSize',
1666
+ 'appendTo',
1667
+ 'assignments',
1668
+ 'callOnFunctions',
1669
+ 'catchEventHandlerExceptions',
1670
+ 'cls',
1671
+ 'collapsed',
1672
+ 'column',
1673
+ 'crudManager',
1674
+ 'dataset',
1675
+ 'date',
1676
+ 'dateFormat',
1677
+ 'defaultCalendar',
1678
+ 'deselectAllOnScheduleClick',
1679
+ 'disabled',
1680
+ 'events',
1681
+ 'extraData',
1682
+ 'flex',
1683
+ 'focusVisible',
1684
+ 'hasChanges',
1685
+ 'height',
1686
+ 'hidden',
1687
+ 'hideNonWorkingDays',
1688
+ 'id',
1689
+ 'inputFieldAlign',
1690
+ 'insertBefore',
1691
+ 'insertFirst',
1692
+ 'isEngineReady',
1693
+ 'isEventSelectable',
1694
+ 'isSettingValues',
1695
+ 'isValid',
1696
+ 'items',
1697
+ 'keyMap',
1698
+ 'labelPosition',
1699
+ 'layout',
1700
+ 'layoutStyle',
1701
+ 'margin',
1702
+ 'maxDate',
1703
+ 'maxHeight',
1704
+ 'maximizeOnMobile',
1705
+ 'maxWidth',
1706
+ 'minDate',
1707
+ 'minHeight',
1708
+ 'minWidth',
1709
+ 'mode',
1710
+ 'modeDefaults',
1711
+ 'modes',
1712
+ 'nonWorkingDays',
1713
+ 'parent',
1714
+ 'project',
1715
+ 'readOnly',
1716
+ 'record',
1717
+ 'recurrenceConfirmationPopup',
1718
+ 'rendition',
1719
+ 'resources',
1720
+ 'resourceTimeRanges',
1721
+ 'rtl',
1722
+ 'scrollable',
1723
+ 'selectedEvents',
1724
+ 'selectResourceOnEventNavigate',
1725
+ 'selectResourceOnScheduleClick',
1726
+ 'span',
1727
+ 'state',
1728
+ 'strictRecordMapping',
1729
+ 'timeRanges',
1730
+ 'title',
1731
+ 'tools',
1732
+ 'tooltip',
1733
+ 'useContextualRecurrenceRules',
1734
+ 'values',
1735
+ 'views',
1736
+ 'width',
1737
+ 'x',
1738
+ 'y'
1739
+ ]);
1740
+ BryntumCalendarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumCalendarComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1741
+ BryntumCalendarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumCalendarComponent, selector: "bryntum-calendar", inputs: { adopt: "adopt", align: "align", anchor: "anchor", ariaDescription: "ariaDescription", ariaLabel: "ariaLabel", assignmentStore: "assignmentStore", autoCreate: "autoCreate", bbar: "bbar", bodyCls: "bodyCls", bubbleEvents: "bubbleEvents", centered: "centered", collapsible: "collapsible", color: "color", config: "config", constrainTo: "constrainTo", contentElementCls: "contentElementCls", contextMenuTriggerEvent: "contextMenuTriggerEvent", crudManagerClass: "crudManagerClass", dataField: "dataField", datePicker: "datePicker", defaultBindProperty: "defaultBindProperty", defaultFocus: "defaultFocus", defaults: "defaults", deselectOnClick: "deselectOnClick", destroyStores: "destroyStores", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", dock: "dock", draggable: "draggable", drawer: "drawer", elementAttributes: "elementAttributes", enableDeleteKey: "enableDeleteKey", enableRecurringEvents: "enableRecurringEvents", enableUndoRedoKeys: "enableUndoRedoKeys", eventSelectionDisabled: "eventSelectionDisabled", eventStore: "eventStore", filterEventResources: "filterEventResources", floating: "floating", footer: "footer", header: "header", hideAnimation: "hideAnimation", hideWhenEmpty: "hideWhenEmpty", highlightDate: "highlightDate", highlightPredecessors: "highlightPredecessors", highlightSuccessors: "highlightSuccessors", icon: "icon", ignoreParentReadOnly: "ignoreParentReadOnly", includeWeekendsButton: "includeWeekendsButton", itemCls: "itemCls", lazyItems: "lazyItems", listeners: "listeners", loadMask: "loadMask", loadMaskDefaults: "loadMaskDefaults", loadMaskError: "loadMaskError", localeClass: "localeClass", localizable: "localizable", localizableProperties: "localizableProperties", maintainSelectionOnDatasetChange: "maintainSelectionOnDatasetChange", maskDefaults: "maskDefaults", masked: "masked", monitorResize: "monitorResize", multiEventSelect: "multiEventSelect", namedItems: "namedItems", navigatorPlacement: "navigatorPlacement", overlaySidebar: "overlaySidebar", owner: "owner", positioned: "positioned", preventTooltipOnTouch: "preventTooltipOnTouch", propagatedConfigs: "propagatedConfigs", relayStoreEvents: "relayStoreEvents", resourceImagePath: "resourceImagePath", resourceStore: "resourceStore", resourceTimeRangeStore: "resourceTimeRangeStore", responsive: "responsive", responsiveRoot: "responsiveRoot", responsiveState: "responsiveState", responsiveTarget: "responsiveTarget", ripple: "ripple", rootElement: "rootElement", scrollAction: "scrollAction", showAnimation: "showAnimation", showRecurringUI: "showRecurringUI", showTooltipWhenDisabled: "showTooltipWhenDisabled", sidebar: "sidebar", stateful: "stateful", statefulEvents: "statefulEvents", stateId: "stateId", stateProvider: "stateProvider", strips: "strips", syncMask: "syncMask", tab: "tab", tabBarItems: "tabBarItems", tag: "tag", tbar: "tbar", textAlign: "textAlign", timeRangeStore: "timeRangeStore", timeZone: "timeZone", trapFocus: "trapFocus", triggerSelectionChangeOnRemove: "triggerSelectionChangeOnRemove", type: "type", ui: "ui", viewContainer: "viewContainer", weekStartDay: "weekStartDay", weight: "weight", activeDateCls: "activeDateCls", alignSelf: "alignSelf", appendTo: "appendTo", assignments: "assignments", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cls: "cls", collapsed: "collapsed", column: "column", crudManager: "crudManager", dataset: "dataset", date: "date", dateFormat: "dateFormat", defaultCalendar: "defaultCalendar", deselectAllOnScheduleClick: "deselectAllOnScheduleClick", disabled: "disabled", events: "events", extraData: "extraData", flex: "flex", height: "height", hidden: "hidden", hideNonWorkingDays: "hideNonWorkingDays", id: "id", inputFieldAlign: "inputFieldAlign", insertBefore: "insertBefore", insertFirst: "insertFirst", isEventSelectable: "isEventSelectable", items: "items", keyMap: "keyMap", labelPosition: "labelPosition", layout: "layout", layoutStyle: "layoutStyle", margin: "margin", maxDate: "maxDate", maxHeight: "maxHeight", maximizeOnMobile: "maximizeOnMobile", maxWidth: "maxWidth", minDate: "minDate", minHeight: "minHeight", minWidth: "minWidth", mode: "mode", modeDefaults: "modeDefaults", modes: "modes", nonWorkingDays: "nonWorkingDays", project: "project", readOnly: "readOnly", recurrenceConfirmationPopup: "recurrenceConfirmationPopup", rendition: "rendition", resources: "resources", resourceTimeRanges: "resourceTimeRanges", rtl: "rtl", scrollable: "scrollable", selectResourceOnEventNavigate: "selectResourceOnEventNavigate", selectResourceOnScheduleClick: "selectResourceOnScheduleClick", span: "span", strictRecordMapping: "strictRecordMapping", timeRanges: "timeRanges", title: "title", tools: "tools", tooltip: "tooltip", useContextualRecurrenceRules: "useContextualRecurrenceRules", width: "width", x: "x", y: "y", activeSubView: "activeSubView", activeView: "activeView", anchorSize: "anchorSize", focusVisible: "focusVisible", hasChanges: "hasChanges", isEngineReady: "isEngineReady", isSettingValues: "isSettingValues", isValid: "isValid", parent: "parent", record: "record", selectedEvents: "selectedEvents", state: "state", values: "values", views: "views", dragFeature: "dragFeature", eventBufferFeature: "eventBufferFeature", eventCopyPasteFeature: "eventCopyPasteFeature", eventEditFeature: "eventEditFeature", eventMenuFeature: "eventMenuFeature", eventTooltipFeature: "eventTooltipFeature", excelExporterFeature: "excelExporterFeature", externalEventSourceFeature: "externalEventSourceFeature", loadOnDemandFeature: "loadOnDemandFeature", printFeature: "printFeature", scheduleMenuFeature: "scheduleMenuFeature", scheduleTooltipFeature: "scheduleTooltipFeature", timeRangesFeature: "timeRangesFeature", weekExpanderFeature: "weekExpanderFeature" }, outputs: { onActiveItemChange: "onActiveItemChange", onAfterEventEdit: "onAfterEventEdit", onAfterEventSave: "onAfterEventSave", onBeforeActiveItemChange: "onBeforeActiveItemChange", onBeforeAssignmentDelete: "onBeforeAssignmentDelete", onBeforeAssignmentSelectionChange: "onBeforeAssignmentSelectionChange", onBeforeAutoCreate: "onBeforeAutoCreate", onBeforeCopy: "onBeforeCopy", onBeforeCreateMode: "onBeforeCreateMode", onBeforeCSVExport: "onBeforeCSVExport", onBeforeDestroy: "onBeforeDestroy", onBeforeDragCreate: "onBeforeDragCreate", onBeforeDragCreateEnd: "onBeforeDragCreateEnd", onBeforeDragMove: "onBeforeDragMove", onBeforeDragMoveEnd: "onBeforeDragMoveEnd", onBeforeDragResize: "onBeforeDragResize", onBeforeDragResizeEnd: "onBeforeDragResizeEnd", onBeforeDropExternal: "onBeforeDropExternal", onBeforeEventDelete: "onBeforeEventDelete", onBeforeEventEdit: "onBeforeEventEdit", onBeforeEventEditShow: "onBeforeEventEditShow", onBeforeEventSave: "onBeforeEventSave", onBeforeEventSelectionChange: "onBeforeEventSelectionChange", onBeforeExcelExport: "onBeforeExcelExport", onBeforeHide: "onBeforeHide", onBeforePaste: "onBeforePaste", onBeforePrint: "onBeforePrint", onBeforeResponsiveStateChange: "onBeforeResponsiveStateChange", onBeforeSetRecord: "onBeforeSetRecord", onBeforeShow: "onBeforeShow", onBeforeStateApply: "onBeforeStateApply", onBeforeStateSave: "onBeforeStateSave", onCatchAll: "onCatchAll", onCellOverflowClick: "onCellOverflowClick", onCollapse: "onCollapse", onContextMenuItem: "onContextMenuItem", onContextMenuToggleItem: "onContextMenuToggleItem", onCopy: "onCopy", onCurrentTimelineUpdate: "onCurrentTimelineUpdate", onDataChange: "onDataChange", onDateChange: "onDateChange", onDateRangeChange: "onDateRangeChange", onDateRangeLoad: "onDateRangeLoad", onDateRangeRequested: "onDateRangeRequested", onDayCellPopulated: "onDayCellPopulated", onDayNumberClick: "onDayNumberClick", onDestroy: "onDestroy", onDirtyStateChange: "onDirtyStateChange", onDragCreateEnd: "onDragCreateEnd", onDragMoveEnd: "onDragMoveEnd", onDragMoveExternal: "onDragMoveExternal", onDragResizeEnd: "onDragResizeEnd", onDropExternal: "onDropExternal", onElementCreated: "onElementCreated", onEmptyCellClick: "onEmptyCellClick", onEventAutoCreated: "onEventAutoCreated", onEventClick: "onEventClick", onEventContextMenu: "onEventContextMenu", onEventDblClick: "onEventDblClick", onEventEditBeforeSetRecord: "onEventEditBeforeSetRecord", onEventKeyDown: "onEventKeyDown", onEventMenuBeforeShow: "onEventMenuBeforeShow", onEventMenuItem: "onEventMenuItem", onEventMenuShow: "onEventMenuShow", onEventMouseDown: "onEventMouseDown", onEventMouseEnter: "onEventMouseEnter", onEventMouseLeave: "onEventMouseLeave", onEventMouseOut: "onEventMouseOut", onEventMouseOver: "onEventMouseOver", onEventMouseUp: "onEventMouseUp", onEventPropagate: "onEventPropagate", onExpand: "onExpand", onFocusIn: "onFocusIn", onFocusOut: "onFocusOut", onHide: "onHide", onLoadOnDemandFail: "onLoadOnDemandFail", onMonthNameClick: "onMonthNameClick", onNavigate: "onNavigate", onPaint: "onPaint", onPaste: "onPaste", onPasteNotAllowed: "onPasteNotAllowed", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onRefresh: "onRefresh", onResize: "onResize", onResourceClick: "onResourceClick", onResponsiveStateChange: "onResponsiveStateChange", onScheduleClick: "onScheduleClick", onScheduleContextMenu: "onScheduleContextMenu", onScheduleDblClick: "onScheduleDblClick", onScheduleMenuBeforeShow: "onScheduleMenuBeforeShow", onScheduleMenuItem: "onScheduleMenuItem", onScheduleMenuShow: "onScheduleMenuShow", onScheduleMouseDown: "onScheduleMouseDown", onScheduleMouseOut: "onScheduleMouseOut", onScheduleMouseOver: "onScheduleMouseOver", onScheduleMouseUp: "onScheduleMouseUp", onSelectionChange: "onSelectionChange", onShow: "onShow", onSidebarCollapse: "onSidebarCollapse", onSidebarExpand: "onSidebarExpand", onTimeAxisClick: "onTimeAxisClick", onTimeRangeHeaderClick: "onTimeRangeHeaderClick", onTimeRangeHeaderContextMenu: "onTimeRangeHeaderContextMenu", onTimeRangeHeaderDblClick: "onTimeRangeHeaderDblClick", onToolClick: "onToolClick", onViewPaint: "onViewPaint", onWeekNumberClick: "onWeekNumberClick" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
1742
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumCalendarComponent, decorators: [{
1743
+ type: Component,
1744
+ args: [{
1745
+ selector: 'bryntum-calendar',
1746
+ template: ''
1747
+ }]
1748
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { adopt: [{
1749
+ type: Input
1750
+ }], align: [{
1751
+ type: Input
1752
+ }], anchor: [{
1753
+ type: Input
1754
+ }], ariaDescription: [{
1755
+ type: Input
1756
+ }], ariaLabel: [{
1757
+ type: Input
1758
+ }], assignmentStore: [{
1759
+ type: Input
1760
+ }], autoCreate: [{
1761
+ type: Input
1762
+ }], bbar: [{
1763
+ type: Input
1764
+ }], bodyCls: [{
1765
+ type: Input
1766
+ }], bubbleEvents: [{
1767
+ type: Input
1768
+ }], centered: [{
1769
+ type: Input
1770
+ }], collapsible: [{
1771
+ type: Input
1772
+ }], color: [{
1773
+ type: Input
1774
+ }], config: [{
1775
+ type: Input
1776
+ }], constrainTo: [{
1777
+ type: Input
1778
+ }], contentElementCls: [{
1779
+ type: Input
1780
+ }], contextMenuTriggerEvent: [{
1781
+ type: Input
1782
+ }], crudManagerClass: [{
1783
+ type: Input
1784
+ }], dataField: [{
1785
+ type: Input
1786
+ }], datePicker: [{
1787
+ type: Input
1788
+ }], defaultBindProperty: [{
1789
+ type: Input
1790
+ }], defaultFocus: [{
1791
+ type: Input
1792
+ }], defaults: [{
1793
+ type: Input
1794
+ }], deselectOnClick: [{
1795
+ type: Input
1796
+ }], destroyStores: [{
1797
+ type: Input
1798
+ }], detectCSSCompatibilityIssues: [{
1799
+ type: Input
1800
+ }], dock: [{
1801
+ type: Input
1802
+ }], draggable: [{
1803
+ type: Input
1804
+ }], drawer: [{
1805
+ type: Input
1806
+ }], elementAttributes: [{
1807
+ type: Input
1808
+ }], enableDeleteKey: [{
1809
+ type: Input
1810
+ }], enableRecurringEvents: [{
1811
+ type: Input
1812
+ }], enableUndoRedoKeys: [{
1813
+ type: Input
1814
+ }], eventSelectionDisabled: [{
1815
+ type: Input
1816
+ }], eventStore: [{
1817
+ type: Input
1818
+ }], filterEventResources: [{
1819
+ type: Input
1820
+ }], floating: [{
1821
+ type: Input
1822
+ }], footer: [{
1823
+ type: Input
1824
+ }], header: [{
1825
+ type: Input
1826
+ }], hideAnimation: [{
1827
+ type: Input
1828
+ }], hideWhenEmpty: [{
1829
+ type: Input
1830
+ }], highlightDate: [{
1831
+ type: Input
1832
+ }], highlightPredecessors: [{
1833
+ type: Input
1834
+ }], highlightSuccessors: [{
1835
+ type: Input
1836
+ }], icon: [{
1837
+ type: Input
1838
+ }], ignoreParentReadOnly: [{
1839
+ type: Input
1840
+ }], includeWeekendsButton: [{
1841
+ type: Input
1842
+ }], itemCls: [{
1843
+ type: Input
1844
+ }], lazyItems: [{
1845
+ type: Input
1846
+ }], listeners: [{
1847
+ type: Input
1848
+ }], loadMask: [{
1849
+ type: Input
1850
+ }], loadMaskDefaults: [{
1851
+ type: Input
1852
+ }], loadMaskError: [{
1853
+ type: Input
1854
+ }], localeClass: [{
1855
+ type: Input
1856
+ }], localizable: [{
1857
+ type: Input
1858
+ }], localizableProperties: [{
1859
+ type: Input
1860
+ }], maintainSelectionOnDatasetChange: [{
1861
+ type: Input
1862
+ }], maskDefaults: [{
1863
+ type: Input
1864
+ }], masked: [{
1865
+ type: Input
1866
+ }], monitorResize: [{
1867
+ type: Input
1868
+ }], multiEventSelect: [{
1869
+ type: Input
1870
+ }], namedItems: [{
1871
+ type: Input
1872
+ }], navigatorPlacement: [{
1873
+ type: Input
1874
+ }], overlaySidebar: [{
1875
+ type: Input
1876
+ }], owner: [{
1877
+ type: Input
1878
+ }], positioned: [{
1879
+ type: Input
1880
+ }], preventTooltipOnTouch: [{
1881
+ type: Input
1882
+ }], propagatedConfigs: [{
1883
+ type: Input
1884
+ }], relayStoreEvents: [{
1885
+ type: Input
1886
+ }], resourceImagePath: [{
1887
+ type: Input
1888
+ }], resourceStore: [{
1889
+ type: Input
1890
+ }], resourceTimeRangeStore: [{
1891
+ type: Input
1892
+ }], responsive: [{
1893
+ type: Input
1894
+ }], responsiveRoot: [{
1895
+ type: Input
1896
+ }], responsiveState: [{
1897
+ type: Input
1898
+ }], responsiveTarget: [{
1899
+ type: Input
1900
+ }], ripple: [{
1901
+ type: Input
1902
+ }], rootElement: [{
1903
+ type: Input
1904
+ }], scrollAction: [{
1905
+ type: Input
1906
+ }], showAnimation: [{
1907
+ type: Input
1908
+ }], showRecurringUI: [{
1909
+ type: Input
1910
+ }], showTooltipWhenDisabled: [{
1911
+ type: Input
1912
+ }], sidebar: [{
1913
+ type: Input
1914
+ }], stateful: [{
1915
+ type: Input
1916
+ }], statefulEvents: [{
1917
+ type: Input
1918
+ }], stateId: [{
1919
+ type: Input
1920
+ }], stateProvider: [{
1921
+ type: Input
1922
+ }], strips: [{
1923
+ type: Input
1924
+ }], syncMask: [{
1925
+ type: Input
1926
+ }], tab: [{
1927
+ type: Input
1928
+ }], tabBarItems: [{
1929
+ type: Input
1930
+ }], tag: [{
1931
+ type: Input
1932
+ }], tbar: [{
1933
+ type: Input
1934
+ }], textAlign: [{
1935
+ type: Input
1936
+ }], timeRangeStore: [{
1937
+ type: Input
1938
+ }], timeZone: [{
1939
+ type: Input
1940
+ }], trapFocus: [{
1941
+ type: Input
1942
+ }], triggerSelectionChangeOnRemove: [{
1943
+ type: Input
1944
+ }], type: [{
1945
+ type: Input
1946
+ }], ui: [{
1947
+ type: Input
1948
+ }], viewContainer: [{
1949
+ type: Input
1950
+ }], weekStartDay: [{
1951
+ type: Input
1952
+ }], weight: [{
1953
+ type: Input
1954
+ }], activeDateCls: [{
1955
+ type: Input
1956
+ }], alignSelf: [{
1957
+ type: Input
1958
+ }], appendTo: [{
1959
+ type: Input
1960
+ }], assignments: [{
1961
+ type: Input
1962
+ }], callOnFunctions: [{
1963
+ type: Input
1964
+ }], catchEventHandlerExceptions: [{
1965
+ type: Input
1966
+ }], cls: [{
1967
+ type: Input
1968
+ }], collapsed: [{
1969
+ type: Input
1970
+ }], column: [{
1971
+ type: Input
1972
+ }], crudManager: [{
1973
+ type: Input
1974
+ }], dataset: [{
1975
+ type: Input
1976
+ }], date: [{
1977
+ type: Input
1978
+ }], dateFormat: [{
1979
+ type: Input
1980
+ }], defaultCalendar: [{
1981
+ type: Input
1982
+ }], deselectAllOnScheduleClick: [{
1983
+ type: Input
1984
+ }], disabled: [{
1985
+ type: Input
1986
+ }], events: [{
1987
+ type: Input
1988
+ }], extraData: [{
1989
+ type: Input
1990
+ }], flex: [{
1991
+ type: Input
1992
+ }], height: [{
1993
+ type: Input
1994
+ }], hidden: [{
1995
+ type: Input
1996
+ }], hideNonWorkingDays: [{
1997
+ type: Input
1998
+ }], id: [{
1999
+ type: Input
2000
+ }], inputFieldAlign: [{
2001
+ type: Input
2002
+ }], insertBefore: [{
2003
+ type: Input
2004
+ }], insertFirst: [{
2005
+ type: Input
2006
+ }], isEventSelectable: [{
2007
+ type: Input
2008
+ }], items: [{
2009
+ type: Input
2010
+ }], keyMap: [{
2011
+ type: Input
2012
+ }], labelPosition: [{
2013
+ type: Input
2014
+ }], layout: [{
2015
+ type: Input
2016
+ }], layoutStyle: [{
2017
+ type: Input
2018
+ }], margin: [{
2019
+ type: Input
2020
+ }], maxDate: [{
2021
+ type: Input
2022
+ }], maxHeight: [{
2023
+ type: Input
2024
+ }], maximizeOnMobile: [{
2025
+ type: Input
2026
+ }], maxWidth: [{
2027
+ type: Input
2028
+ }], minDate: [{
2029
+ type: Input
2030
+ }], minHeight: [{
2031
+ type: Input
2032
+ }], minWidth: [{
2033
+ type: Input
2034
+ }], mode: [{
2035
+ type: Input
2036
+ }], modeDefaults: [{
2037
+ type: Input
2038
+ }], modes: [{
2039
+ type: Input
2040
+ }], nonWorkingDays: [{
2041
+ type: Input
2042
+ }], project: [{
2043
+ type: Input
2044
+ }], readOnly: [{
2045
+ type: Input
2046
+ }], recurrenceConfirmationPopup: [{
2047
+ type: Input
2048
+ }], rendition: [{
2049
+ type: Input
2050
+ }], resources: [{
2051
+ type: Input
2052
+ }], resourceTimeRanges: [{
2053
+ type: Input
2054
+ }], rtl: [{
2055
+ type: Input
2056
+ }], scrollable: [{
2057
+ type: Input
2058
+ }], selectResourceOnEventNavigate: [{
2059
+ type: Input
2060
+ }], selectResourceOnScheduleClick: [{
2061
+ type: Input
2062
+ }], span: [{
2063
+ type: Input
2064
+ }], strictRecordMapping: [{
2065
+ type: Input
2066
+ }], timeRanges: [{
2067
+ type: Input
2068
+ }], title: [{
2069
+ type: Input
2070
+ }], tools: [{
2071
+ type: Input
2072
+ }], tooltip: [{
2073
+ type: Input
2074
+ }], useContextualRecurrenceRules: [{
2075
+ type: Input
2076
+ }], width: [{
2077
+ type: Input
2078
+ }], x: [{
2079
+ type: Input
2080
+ }], y: [{
2081
+ type: Input
2082
+ }], activeSubView: [{
2083
+ type: Input
2084
+ }], activeView: [{
2085
+ type: Input
2086
+ }], anchorSize: [{
2087
+ type: Input
2088
+ }], focusVisible: [{
2089
+ type: Input
2090
+ }], hasChanges: [{
2091
+ type: Input
2092
+ }], isEngineReady: [{
2093
+ type: Input
2094
+ }], isSettingValues: [{
2095
+ type: Input
2096
+ }], isValid: [{
2097
+ type: Input
2098
+ }], parent: [{
2099
+ type: Input
2100
+ }], record: [{
2101
+ type: Input
2102
+ }], selectedEvents: [{
2103
+ type: Input
2104
+ }], state: [{
2105
+ type: Input
2106
+ }], values: [{
2107
+ type: Input
2108
+ }], views: [{
2109
+ type: Input
2110
+ }], dragFeature: [{
2111
+ type: Input
2112
+ }], eventBufferFeature: [{
2113
+ type: Input
2114
+ }], eventCopyPasteFeature: [{
2115
+ type: Input
2116
+ }], eventEditFeature: [{
2117
+ type: Input
2118
+ }], eventMenuFeature: [{
2119
+ type: Input
2120
+ }], eventTooltipFeature: [{
2121
+ type: Input
2122
+ }], excelExporterFeature: [{
2123
+ type: Input
2124
+ }], externalEventSourceFeature: [{
2125
+ type: Input
2126
+ }], loadOnDemandFeature: [{
2127
+ type: Input
2128
+ }], printFeature: [{
2129
+ type: Input
2130
+ }], scheduleMenuFeature: [{
2131
+ type: Input
2132
+ }], scheduleTooltipFeature: [{
2133
+ type: Input
2134
+ }], timeRangesFeature: [{
2135
+ type: Input
2136
+ }], weekExpanderFeature: [{
2137
+ type: Input
2138
+ }], onActiveItemChange: [{
2139
+ type: Output
2140
+ }], onAfterEventEdit: [{
2141
+ type: Output
2142
+ }], onAfterEventSave: [{
2143
+ type: Output
2144
+ }], onBeforeActiveItemChange: [{
2145
+ type: Output
2146
+ }], onBeforeAssignmentDelete: [{
2147
+ type: Output
2148
+ }], onBeforeAssignmentSelectionChange: [{
2149
+ type: Output
2150
+ }], onBeforeAutoCreate: [{
2151
+ type: Output
2152
+ }], onBeforeCopy: [{
2153
+ type: Output
2154
+ }], onBeforeCreateMode: [{
2155
+ type: Output
2156
+ }], onBeforeCSVExport: [{
2157
+ type: Output
2158
+ }], onBeforeDestroy: [{
2159
+ type: Output
2160
+ }], onBeforeDragCreate: [{
2161
+ type: Output
2162
+ }], onBeforeDragCreateEnd: [{
2163
+ type: Output
2164
+ }], onBeforeDragMove: [{
2165
+ type: Output
2166
+ }], onBeforeDragMoveEnd: [{
2167
+ type: Output
2168
+ }], onBeforeDragResize: [{
2169
+ type: Output
2170
+ }], onBeforeDragResizeEnd: [{
2171
+ type: Output
2172
+ }], onBeforeDropExternal: [{
2173
+ type: Output
2174
+ }], onBeforeEventDelete: [{
2175
+ type: Output
2176
+ }], onBeforeEventEdit: [{
2177
+ type: Output
2178
+ }], onBeforeEventEditShow: [{
2179
+ type: Output
2180
+ }], onBeforeEventSave: [{
2181
+ type: Output
2182
+ }], onBeforeEventSelectionChange: [{
2183
+ type: Output
2184
+ }], onBeforeExcelExport: [{
2185
+ type: Output
2186
+ }], onBeforeHide: [{
2187
+ type: Output
2188
+ }], onBeforePaste: [{
2189
+ type: Output
2190
+ }], onBeforePrint: [{
2191
+ type: Output
2192
+ }], onBeforeResponsiveStateChange: [{
2193
+ type: Output
2194
+ }], onBeforeSetRecord: [{
2195
+ type: Output
2196
+ }], onBeforeShow: [{
2197
+ type: Output
2198
+ }], onBeforeStateApply: [{
2199
+ type: Output
2200
+ }], onBeforeStateSave: [{
2201
+ type: Output
2202
+ }], onCatchAll: [{
2203
+ type: Output
2204
+ }], onCellOverflowClick: [{
2205
+ type: Output
2206
+ }], onCollapse: [{
2207
+ type: Output
2208
+ }], onContextMenuItem: [{
2209
+ type: Output
2210
+ }], onContextMenuToggleItem: [{
2211
+ type: Output
2212
+ }], onCopy: [{
2213
+ type: Output
2214
+ }], onCurrentTimelineUpdate: [{
2215
+ type: Output
2216
+ }], onDataChange: [{
2217
+ type: Output
2218
+ }], onDateChange: [{
2219
+ type: Output
2220
+ }], onDateRangeChange: [{
2221
+ type: Output
2222
+ }], onDateRangeLoad: [{
2223
+ type: Output
2224
+ }], onDateRangeRequested: [{
2225
+ type: Output
2226
+ }], onDayCellPopulated: [{
2227
+ type: Output
2228
+ }], onDayNumberClick: [{
2229
+ type: Output
2230
+ }], onDestroy: [{
2231
+ type: Output
2232
+ }], onDirtyStateChange: [{
2233
+ type: Output
2234
+ }], onDragCreateEnd: [{
2235
+ type: Output
2236
+ }], onDragMoveEnd: [{
2237
+ type: Output
2238
+ }], onDragMoveExternal: [{
2239
+ type: Output
2240
+ }], onDragResizeEnd: [{
2241
+ type: Output
2242
+ }], onDropExternal: [{
2243
+ type: Output
2244
+ }], onElementCreated: [{
2245
+ type: Output
2246
+ }], onEmptyCellClick: [{
2247
+ type: Output
2248
+ }], onEventAutoCreated: [{
2249
+ type: Output
2250
+ }], onEventClick: [{
2251
+ type: Output
2252
+ }], onEventContextMenu: [{
2253
+ type: Output
2254
+ }], onEventDblClick: [{
2255
+ type: Output
2256
+ }], onEventEditBeforeSetRecord: [{
2257
+ type: Output
2258
+ }], onEventKeyDown: [{
2259
+ type: Output
2260
+ }], onEventMenuBeforeShow: [{
2261
+ type: Output
2262
+ }], onEventMenuItem: [{
2263
+ type: Output
2264
+ }], onEventMenuShow: [{
2265
+ type: Output
2266
+ }], onEventMouseDown: [{
2267
+ type: Output
2268
+ }], onEventMouseEnter: [{
2269
+ type: Output
2270
+ }], onEventMouseLeave: [{
2271
+ type: Output
2272
+ }], onEventMouseOut: [{
2273
+ type: Output
2274
+ }], onEventMouseOver: [{
2275
+ type: Output
2276
+ }], onEventMouseUp: [{
2277
+ type: Output
2278
+ }], onEventPropagate: [{
2279
+ type: Output
2280
+ }], onExpand: [{
2281
+ type: Output
2282
+ }], onFocusIn: [{
2283
+ type: Output
2284
+ }], onFocusOut: [{
2285
+ type: Output
2286
+ }], onHide: [{
2287
+ type: Output
2288
+ }], onLoadOnDemandFail: [{
2289
+ type: Output
2290
+ }], onMonthNameClick: [{
2291
+ type: Output
2292
+ }], onNavigate: [{
2293
+ type: Output
2294
+ }], onPaint: [{
2295
+ type: Output
2296
+ }], onPaste: [{
2297
+ type: Output
2298
+ }], onPasteNotAllowed: [{
2299
+ type: Output
2300
+ }], onReadOnly: [{
2301
+ type: Output
2302
+ }], onRecompose: [{
2303
+ type: Output
2304
+ }], onRefresh: [{
2305
+ type: Output
2306
+ }], onResize: [{
2307
+ type: Output
2308
+ }], onResourceClick: [{
2309
+ type: Output
2310
+ }], onResponsiveStateChange: [{
2311
+ type: Output
2312
+ }], onScheduleClick: [{
2313
+ type: Output
2314
+ }], onScheduleContextMenu: [{
2315
+ type: Output
2316
+ }], onScheduleDblClick: [{
2317
+ type: Output
2318
+ }], onScheduleMenuBeforeShow: [{
2319
+ type: Output
2320
+ }], onScheduleMenuItem: [{
2321
+ type: Output
2322
+ }], onScheduleMenuShow: [{
2323
+ type: Output
2324
+ }], onScheduleMouseDown: [{
2325
+ type: Output
2326
+ }], onScheduleMouseOut: [{
2327
+ type: Output
2328
+ }], onScheduleMouseOver: [{
2329
+ type: Output
2330
+ }], onScheduleMouseUp: [{
2331
+ type: Output
2332
+ }], onSelectionChange: [{
2333
+ type: Output
2334
+ }], onShow: [{
2335
+ type: Output
2336
+ }], onSidebarCollapse: [{
2337
+ type: Output
2338
+ }], onSidebarExpand: [{
2339
+ type: Output
2340
+ }], onTimeAxisClick: [{
2341
+ type: Output
2342
+ }], onTimeRangeHeaderClick: [{
2343
+ type: Output
2344
+ }], onTimeRangeHeaderContextMenu: [{
2345
+ type: Output
2346
+ }], onTimeRangeHeaderDblClick: [{
2347
+ type: Output
2348
+ }], onToolClick: [{
2349
+ type: Output
2350
+ }], onViewPaint: [{
2351
+ type: Output
2352
+ }], onWeekNumberClick: [{
2353
+ type: Output
2354
+ }] } });
2355
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS1jYWxlbmRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnQvc3JjL2xpYi9icnludHVtLWNhbGVuZGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzREFBc0Q7QUFDdEQ7O0dBRUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFrRCxNQUFNLGVBQWUsQ0FBQztBQUVuSSxPQUFPLGFBQWEsTUFBTSxrQkFBa0IsQ0FBQztBQUU3QyxPQUFPLEVBQTZiLE1BQU0sRUFBZ0IsTUFBTSxvQkFBb0IsQ0FBQztBQUdyZixPQUFPLEVBQW9CLFFBQVEsRUFBKzdCLE1BQU0sd0JBQXdCLENBQUM7QUFFamdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFxbkNsRCxNQUFNLE9BQU8sd0JBQXdCO0lBdWZqQyxZQUFZLE9BQW1CO1FBVHZCLGtCQUFhLEdBQUc7WUFDcEIsS0FBSyxFQUFjLFNBQVM7WUFDNUIsUUFBUSxFQUFXLFNBQVM7WUFDNUIsSUFBSSxFQUFlLFNBQVM7WUFDNUIsZ0JBQWdCLEVBQUcsSUFBSTtZQUN2QixRQUFRLEVBQVcsRUFBRTtZQUNyQixTQUFTLEVBQVUsRUFBRTtTQUN4QixDQUFDO1FBME9GLGtCQUFrQjtRQUNsQjs7Ozs7Ozs7V0FRRztRQUNPLHVCQUFrQixHQUFRLElBQUksWUFBWSxFQUFtSSxDQUFDO1FBQ3hMOzs7Ozs7Ozs7O1dBVUc7UUFDTyxxQkFBZ0IsR0FBUSxJQUFJLFlBQVksRUFBc04sQ0FBQztRQUN6UTs7Ozs7V0FLRztRQUNPLHFCQUFnQixHQUFRLElBQUksWUFBWSxFQUE0RSxDQUFDO1FBQy9IOzs7Ozs7V0FNRztRQUNPLDZCQUF3QixHQUFRLElBQUksWUFBWSxFQUFtSSxDQUFDO1FBQzlMOzs7Ozs7Ozs7Ozs7V0FZRztRQUNPLDZCQUF3QixHQUFRLElBQUksWUFBWSxFQUFzSyxDQUFDO1FBQ2pPOzs7Ozs7Ozs7V0FTRztRQUNPLHNDQUFpQyxHQUFRLElBQUksWUFBWSxFQUFvTixDQUFDO1FBQ3hSOzs7Ozs7Ozs7OztXQVdHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQTJLLENBQUM7UUFDaE87Ozs7Ozs7O1dBUUc7UUFDTyxpQkFBWSxHQUFRLElBQUksWUFBWSxFQUFrTCxDQUFDO1FBQ2pPOzs7OztXQUtHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQWdTLENBQUM7UUFDclY7Ozs7Ozs7O1dBUUc7UUFDTyxzQkFBaUIsR0FBUSxJQUFJLFlBQVksRUFBaUssQ0FBQztRQUNyTjs7OztXQUlHO1FBQ08sb0JBQWUsR0FBUSxJQUFJLFlBQVksRUFBOEMsQ0FBQztRQUNoRzs7Ozs7Ozs7Ozs7V0FXRztRQUNPLHVCQUFrQixHQUFRLElBQUksWUFBWSxFQUFzTSxDQUFDO1FBQzNQOzs7Ozs7Ozs7Ozs7OztXQWNHO1FBQ08sMEJBQXFCLEdBQVEsSUFBSSxZQUFZLEVBQWdTLENBQUM7UUFDeFY7Ozs7Ozs7Ozs7OztXQVlHO1FBQ08scUJBQWdCLEdBQVEsSUFBSSxZQUFZLEVBQStOLENBQUM7UUFDbFI7Ozs7Ozs7Ozs7Ozs7OztXQWVHO1FBQ08sd0JBQW1CLEdBQVEsSUFBSSxZQUFZLEVBQThULENBQUM7UUFDcFg7Ozs7Ozs7Ozs7OztXQVlHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQStOLENBQUM7UUFDcFI7Ozs7Ozs7Ozs7Ozs7O1dBY0c7UUFDTywwQkFBcUIsR0FBUSxJQUFJLFlBQVksRUFBOFIsQ0FBQztRQUN0Vjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQW1CRztRQUNPLHlCQUFvQixHQUFRLElBQUksWUFBWSxFQUFrVCxDQUFDO1FBQ3pXOzs7Ozs7Ozs7Ozs7V0FZRztRQUNPLHdCQUFtQixHQUFRLElBQUksWUFBWSxFQUEySixDQUFDO1FBQ2pOOzs7Ozs7Ozs7Ozs7V0FZRztRQUNPLHNCQUFpQixHQUFRLElBQUksWUFBWSxFQUE4TCxDQUFDO1FBQ2xQOzs7Ozs7Ozs7O1dBVUc7UUFDTywwQkFBcUIsR0FBUSxJQUFJLFlBQVksRUFBb0wsQ0FBQztRQUM1Tzs7Ozs7Ozs7Ozs7OztXQWFHO1FBQ08sc0JBQWlCLEdBQVEsSUFBSSxZQUFZLEVBQXlNLENBQUM7UUFDN1A7Ozs7Ozs7OztXQVNHO1FBQ08saUNBQTRCLEdBQVEsSUFBSSxZQUFZLEVBQXFNLENBQUM7UUFDcFE7Ozs7OztXQU1HO1FBQ08sd0JBQW1CLEdBQVEsSUFBSSxZQUFZLEVBQWtILENBQUM7UUFDeEs7Ozs7V0FJRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQXlFLENBQUM7UUFDeEg7Ozs7Ozs7Ozs7Ozs7OztXQWVHO1FBQ08sa0JBQWEsR0FBUSxJQUFJLFlBQVksRUFBK1MsQ0FBQztRQUMvVjs7OztXQUlHO1FBQ08sa0JBQWEsR0FBUSxJQUFJLFlBQVksRUFBeUUsQ0FBQztRQUN6SDs7Ozs7O1dBTUc7UUFDTyxrQ0FBNkIsR0FBUSxJQUFJLFlBQVksRUFBaUYsQ0FBQztRQUNqSjs7Ozs7O1dBTUc7UUFDTyxzQkFBaUIsR0FBUSxJQUFJLFlBQVksRUFBa0UsQ0FBQztRQUN0SDs7OztXQUlHO1FBQ08saUJBQVksR0FBUSxJQUFJLFlBQVksRUFBNkUsQ0FBQztRQUM1SDs7OztXQUlHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQXFFLENBQUM7UUFDMUg7Ozs7V0FJRztRQUNPLHNCQUFpQixHQUFRLElBQUksWUFBWSxFQUFxRSxDQUFDO1FBQ3pIOzs7Ozs7O1dBT0c7UUFDTyxlQUFVLEdBQVEsSUFBSSxZQUFZLEVBQWdFLENBQUM7UUFDN0c7Ozs7Ozs7OztXQVNHO1FBQ08sd0JBQW1CLEdBQVEsSUFBSSxZQUFZLEVBQW1GLENBQUM7UUFDekk7Ozs7V0FJRztRQUNPLGVBQVUsR0FBUSxJQUFJLFlBQVksRUFBK0MsQ0FBQztRQUM1Rjs7Ozs7O1dBTUc7UUFDTyxzQkFBaUIsR0FBUSxJQUFJLFlBQVksRUFBNEUsQ0FBQztRQUNoSTs7Ozs7OztXQU9HO1FBQ08sNEJBQXVCLEdBQVEsSUFBSSxZQUFZLEVBQThGLENBQUM7UUFDeEo7Ozs7Ozs7Ozs7Ozs7V0FhRztRQUNPLFdBQU0sR0FBUSxJQUFJLFlBQVksRUFBME8sQ0FBQztRQUNuUjs7Ozs7V0FLRztRQUNPLDRCQUF1QixHQUFRLElBQUksWUFBWSxFQUErRCxDQUFDO1FBQ3pIOzs7Ozs7Ozs7Ozs7V0FZRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQW9RLENBQUM7UUFDblQ7Ozs7Ozs7O1dBUUc7UUFDTyxpQkFBWSxHQUFRLElBQUksWUFBWSxFQUE2RSxDQUFDO1FBQzVIOzs7Ozs7Ozs7Ozs7O1dBYUc7UUFDTyxzQkFBaUIsR0FBUSxJQUFJLFlBQVksRUFBb0ksQ0FBQztRQUN4TDs7Ozs7OztXQU9HO1FBQ08sb0JBQWUsR0FBUSxJQUFJLFlBQVksRUFBbUcsQ0FBQztRQUNySjs7Ozs7Ozs7Ozs7OztXQWFHO1FBQ08seUJBQW9CLEdBQVEsSUFBSSxZQUFZLEVBQXNKLENBQUM7UUFDN007Ozs7Ozs7OztXQVNHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQXVGLENBQUM7UUFDNUk7Ozs7Ozs7Ozs7OztXQVlHO1FBQ08scUJBQWdCLEdBQVEsSUFBSSxZQUFZLEVBQTJKLENBQUM7UUFDOU07Ozs7V0FJRztRQUNPLGNBQVMsR0FBUSxJQUFJLFlBQVksRUFBOEMsQ0FBQztRQUMxRjs7Ozs7V0FLRztRQUNPLHVCQUFrQixHQUFRLElBQUksWUFBWSxFQUFtRSxDQUFDO1FBQ3hIOzs7Ozs7Ozs7OztXQVdHO1FBQ08sb0JBQWUsR0FBUSxJQUFJLFlBQVksRUFBaU8sQ0FBQztRQUNuUjs7Ozs7Ozs7Ozs7O1dBWUc7UUFDTyxrQkFBYSxHQUFRLElBQUksWUFBWSxFQUFpTyxDQUFDO1FBQ2pSOzs7Ozs7Ozs7Ozs7Ozs7OztXQWlCRztRQUNPLHVCQUFrQixHQUFRLElBQUksWUFBWSxFQUFnUSxDQUFDO1FBQ3JUOzs7Ozs7Ozs7O1dBVUc7UUFDTyxvQkFBZSxHQUFRLElBQUksWUFBWSxFQUFpTSxDQUFDO1FBQ25QOzs7Ozs7Ozs7Ozs7Ozs7Ozs7V0FrQkc7UUFDTyxtQkFBYyxHQUFRLElBQUksWUFBWSxFQUF5UixDQUFDO1FBQzFVOzs7O1dBSUc7UUFDTyxxQkFBZ0IsR0FBUSxJQUFJLFlBQVksRUFBc0QsQ0FBQztRQUN6Rzs7Ozs7OztXQU9HO1FBQ08scUJBQWdCLEdBQVEsSUFBSSxZQUFZLEVBQW1GLENBQUM7UUFDdEk7Ozs7Ozs7O1dBUUc7UUFDTyx1QkFBa0IsR0FBUSxJQUFJLFlBQVksRUFBK0UsQ0FBQztRQUNwSTs7Ozs7Ozs7OztXQVVHO1FBQ08saUJBQVksR0FBUSxJQUFJLFlBQVksRUFBa00sQ0FBQztRQUNqUDs7Ozs7Ozs7OztXQVVHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQWtNLENBQUM7UUFDdlA7Ozs7Ozs7Ozs7V0FVRztRQUNPLG9CQUFlLEdBQVEsSUFBSSxZQUFZLEVBQWtNLENBQUM7UUFDcFA7Ozs7OztXQU1HO1FBQ08sK0JBQTBCLEdBQVEsSUFBSSxZQUFZLEVBQXVFLENBQUM7UUFDcEk7Ozs7Ozs7Ozs7V0FVRztRQUNPLG1CQUFjLEdBQVEsSUFBSSxZQUFZLEVBQWtNLENBQUM7UUFDblA7Ozs7Ozs7Ozs7OztXQVlHO1FBQ08sMEJBQXFCLEdBQVEsSUFBSSxZQUFZLEVBQTRQLENBQUM7UUFDcFQ7Ozs7Ozs7OztXQVNHO1FBQ08sb0JBQWUsR0FBUSxJQUFJLFlBQVksRUFBeUwsQ0FBQztRQUMzTzs7Ozs7Ozs7O1dBU0c7UUFDTyxvQkFBZSxHQUFRLElBQUksWUFBWSxFQUFxTCxDQUFDO1FBQ3ZPOzs7Ozs7Ozs7O1dBVUc7UUFDTyxxQkFBZ0IsR0FBUSxJQUFJLFlBQVksRUFBa00sQ0FBQztRQUNyUDs7Ozs7Ozs7OztXQVVHO1FBQ08sc0JBQWlCLEdBQVEsSUFBSSxZQUFZLEVBQWtNLENBQUM7UUFDdFA7Ozs7Ozs7Ozs7V0FVRztRQUNPLHNCQUFpQixHQUFRLElBQUksWUFBWSxFQUFrTSxDQUFDO1FBQ3RQOzs7Ozs7Ozs7O1dBVUc7UUFDTyxvQkFBZSxHQUFRLElBQUksWUFBWSxFQUFrTSxDQUFDO1FBQ3BQOzs7Ozs7Ozs7O1dBVUc7UUFDTyxxQkFBZ0IsR0FBUSxJQUFJLFlBQVksRUFBa00sQ0FBQztRQUNyUDs7Ozs7Ozs7OztXQVVHO1FBQ08sbUJBQWMsR0FBUSxJQUFJLFlBQVksRUFBa00sQ0FBQztRQUNuUDs7Ozs7Ozs7Ozs7Ozs7V0FjRztRQUNPLHFCQUFnQixHQUFRLElBQUksWUFBWSxFQUFtTSxDQUFDO1FBQ3RQOzs7O1dBSUc7UUFDTyxhQUFRLEdBQVEsSUFBSSxZQUFZLEVBQStDLENBQUM7UUFDMUY7Ozs7Ozs7OztXQVNHO1FBQ08sY0FBUyxHQUFRLElBQUksWUFBWSxFQUE0SixDQUFDO1FBQ3hNOzs7Ozs7Ozs7OztXQVdHO1FBQ08sZUFBVSxHQUFRLElBQUksWUFBWSxFQUE0SixDQUFDO1FBQ3pNOzs7O1dBSUc7UUFDTyxXQUFNLEdBQVEsSUFBSSxZQUFZLEVBQWdELENBQUM7UUFDekY7Ozs7Ozs7OztXQVNHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQXFGLENBQUM7UUFDMUk7Ozs7Ozs7Ozs7V0FVRztRQUNPLHFCQUFnQixHQUFRLElBQUksWUFBWSxFQUEySCxDQUFDO1FBQzlLOzs7Ozs7V0FNRztRQUNPLGVBQVUsR0FBUSxJQUFJLFlBQVksRUFBaUcsQ0FBQztRQUM5STs7Ozs7Ozs7V0FRRztRQUNPLFlBQU8sR0FBUSxJQUFJLFlBQVksRUFBcUUsQ0FBQztRQUMvRzs7Ozs7Ozs7Ozs7OztXQWFHO1FBQ08sWUFBTyxHQUFRLElBQUksWUFBWSxFQUF3VCxDQUFDO1FBQ2xXOzs7Ozs7Ozs7Ozs7Ozs7O1dBZ0JHO1FBQ08sc0JBQWlCLEdBQVEsSUFBSSxZQUFZLEVBQXNVLENBQUM7UUFDMVg7Ozs7V0FJRztRQUNPLGVBQVUsR0FBUSxJQUFJLFlBQVksRUFBbUQsQ0FBQztRQUNoRzs7O1dBR0c7UUFDTyxnQkFBVyxHQUFRLElBQUksWUFBWSxFQUF1QixDQUFDO1FBQ3JFOzs7O1dBSUc7UUFDTyxjQUFTLEdBQVEsSUFBSSxZQUFZLEVBQXNELENBQUM7UUFDbEc7Ozs7Ozs7O1dBUUc7UUFDTyxhQUFRLEdBQVEsSUFBSSxZQUFZLEVBQW9ILENBQUM7UUFDL0o7Ozs7Ozs7Ozs7Ozs7V0FhRztRQUNPLG9CQUFlLEdBQVEsSUFBSSxZQUFZLEVBQWdPLENBQUM7UUFDbFI7Ozs7OztXQU1HO1FBQ08sNEJBQXVCLEdBQVEsSUFBSSxZQUFZLEVBQWlGLENBQUM7UUFDM0k7Ozs7Ozs7V0FPRztRQUNPLG9CQUFlLEdBQVEsSUFBSSxZQUFZLEVBQWtILENBQUM7UUFDcEs7Ozs7Ozs7V0FPRztRQUNPLDBCQUFxQixHQUFRLElBQUksWUFBWSxFQUFrSCxDQUFDO1FBQzFLOzs7Ozs7O1dBT0c7UUFDTyx1QkFBa0IsR0FBUSxJQUFJLFlBQVksRUFBa0gsQ0FBQztRQUN2Szs7Ozs7Ozs7Ozs7V0FXRztRQUNPLDZCQUF3QixHQUFRLElBQUksWUFBWSxFQUEyTixDQUFDO1FBQ3RSOzs7Ozs7OztXQVFHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQW9JLENBQUM7UUFDekw7Ozs7Ozs7OztXQVNHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQTRLLENBQUM7UUFDak87Ozs7Ozs7V0FPRztRQUNPLHdCQUFtQixHQUFRLElBQUksWUFBWSxFQUFrSCxDQUFDO1FBQ3hLOzs7Ozs7O1dBT0c7UUFDTyx1QkFBa0IsR0FBUSxJQUFJLFlBQVksRUFBa0gsQ0FBQztRQUN2Szs7Ozs7OztXQU9HO1FBQ08sd0JBQW1CLEdBQVEsSUFBSSxZQUFZLEVBQWtILENBQUM7UUFDeEs7Ozs7Ozs7V0FPRztRQUNPLHNCQUFpQixHQUFRLElBQUksWUFBWSxFQUFrSCxDQUFDO1FBQ3RLOzs7Ozs7OztXQVFHO1FBQ08sc0JBQWlCLEdBQVEsSUFBSSxZQUFZLEVBQTJLLENBQUM7UUFDL047Ozs7V0FJRztRQUNPLFdBQU0sR0FBUSxJQUFJLFlBQVksRUFBZ0QsQ0FBQztRQUN6Rjs7OztXQUlHO1FBQ08sc0JBQWlCLEdBQVEsSUFBSSxZQUFZLEVBQWtELENBQUM7UUFDdEc7Ozs7V0FJRztRQUNPLG9CQUFlLEdBQVEsSUFBSSxZQUFZLEVBQWtELENBQUM7UUFDcEc7Ozs7Ozs7O1dBUUc7UUFDTyxvQkFBZSxHQUFRLElBQUksWUFBWSxFQUFzRyxDQUFDO1FBQ3hKOzs7Ozs7V0FNRztRQUNPLDJCQUFzQixHQUFRLElBQUksWUFBWSxFQUFvRyxDQUFDO1FBQzdKOzs7Ozs7V0FNRztRQUNPLGlDQUE0QixHQUFRLElBQUksWUFBWSxFQUFvRyxDQUFDO1FBQ25LOzs7Ozs7V0FNRztRQUNPLDhCQUF5QixHQUFRLElBQUksWUFBWSxFQUFvRyxDQUFDO1FBQ2hLOzs7OztXQUtHO1FBQ08sZ0JBQVcsR0FBUSxJQUFJLFlBQVksRUFBMEQsQ0FBQztRQUN4Rzs7Ozs7OztXQU9HO1FBQ08sZ0JBQVcsR0FBUSxJQUFJLFlBQVksRUFBMkUsQ0FBQztRQUN6SDs7Ozs7Ozs7Ozs7V0FXRztRQUNPLHNCQUFpQixHQUFRLElBQUksWUFBWSxFQUE0SCxDQUFDO1FBeDJDNUssSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7SUFDOUIsQ0FBQztJQXkyQ0Q7O09BRUc7SUFDSCxRQUFRO1FBQ0osTUFDSSxFQUFFLEdBQUcsSUFBSSxFQUNULEVBQ0ksVUFBVSxFQUNWLGFBQWEsRUFDaEIsR0FBRyxFQUFFLEVBQ04sRUFDSSxhQUFhLEVBQ2IsWUFBWSxFQUNaLGNBQWMsRUFDZCxhQUFhLEVBQ2hCLEdBQUcsd0JBQXdCLENBQUM7UUFFakMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkQsYUFBYTtZQUNiLGFBQWEsQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdkMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUMxRDtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsYUFBYTtRQUNiLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzNGLE1BQ0ksWUFBWSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQzFFLFNBQVMsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU1RCxhQUFhO1lBQ2IsYUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDNUMsYUFBYTtnQkFDYixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixzR0FBc0c7Z0JBQ3RHLHVCQUF1QjtnQkFDdkIsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQ3pCLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO1FBRUgsd0ZBQXdGO1FBQ3hGLE1BQ0ksY0FBYyxHQUFHO1lBQ2IsT0FBTztZQUNQLFVBQVU7WUFDVixhQUFhO1lBQ2IsY0FBYztZQUNkLGFBQWE7U0FDaEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ2pCLElBQUksWUFBWSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxZQUFZLFVBQVUsRUFBRTtnQkFDM0YsK0RBQStEO2dCQUMvRCxhQUFhLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7YUFDckQ7aUJBQ0k7Z0JBQ0QsYUFBYSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO2FBQ2xEO1NBQ0o7YUFDSTtZQUNELGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDbkU7UUFFRCxhQUFhO1FBQ2IsRUFBRSxDQUFDLFFBQVEsR0FBRyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUUxRyxtRUFBbUU7UUFDbkUsYUFBYTtRQUNiLEVBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFDdkUsR0FBRztJQUNQLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsTUFDSSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksRUFDbkIsRUFBRSxZQUFZLEVBQUUsR0FBRyx3QkFBd0IsQ0FBQztRQUNoRCxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ1gsT0FBTztTQUNWO1FBQ0QsMkJBQTJCO1FBQzNCLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxNQUNJLFFBQVEsR0FBSSxNQUF1QixDQUFDLFlBQVksRUFDaEQsRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLEVBQ25CLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLEdBQUcsd0JBQXdCLENBQUM7WUFDcEUsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM3QixhQUFhLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDbkMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDMUQ7YUFDSjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNQLGFBQWE7UUFDYixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMzQjtJQUNMLENBQUM7O0FBejhEYSxzQ0FBYSxHQUFHLFFBQVEsQ0FBQztBQUV6QixxQ0FBWSxHQUFHLFVBQVUsQ0FBQztBQUV6QixzQ0FBYSxHQUFhO0lBQ3JDLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLDBCQUEwQjtJQUMxQiwwQkFBMEI7SUFDMUIsbUNBQW1DO0lBQ25DLG9CQUFvQjtJQUNwQixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsb0JBQW9CO0lBQ3BCLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLHFCQUFxQjtJQUNyQixtQkFBbUI7SUFDbkIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQiw4QkFBOEI7SUFDOUIscUJBQXFCO0lBQ3JCLGNBQWM7SUFDZCxlQUFlO0lBQ2YsZUFBZTtJQUNmLCtCQUErQjtJQUMvQixtQkFBbUI7SUFDbkIsY0FBYztJQUNkLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsWUFBWTtJQUNaLHFCQUFxQjtJQUNyQixZQUFZO0lBQ1osbUJBQW1CO0lBQ25CLHlCQUF5QjtJQUN6QixRQUFRO0lBQ1IseUJBQXlCO0lBQ3pCLGNBQWM7SUFDZCxjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLGlCQUFpQjtJQUNqQixzQkFBc0I7SUFDdEIsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsb0JBQW9CO0lBQ3BCLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLGlCQUFpQjtJQUNqQixnQkFBZ0I7SUFDaEIsa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIsY0FBYztJQUNkLG9CQUFvQjtJQUNwQixpQkFBaUI7SUFDakIsNEJBQTRCO0lBQzVCLGdCQUFnQjtJQUNoQix1QkFBdUI7SUFDdkIsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLGdCQUFnQjtJQUNoQixrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFdBQVc7SUFDWCxZQUFZO0lBQ1osUUFBUTtJQUNSLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsWUFBWTtJQUNaLFNBQVM7SUFDVCxTQUFTO0lBQ1QsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixhQUFhO0lBQ2IsV0FBVztJQUNYLFVBQVU7SUFDVixpQkFBaUI7SUFDakIseUJBQXlCO0lBQ3pCLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsb0JBQW9CO0lBQ3BCLDBCQUEwQjtJQUMxQixvQkFBb0I7SUFDcEIsb0JBQW9CO0lBQ3BCLHFCQUFxQjtJQUNyQixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsUUFBUTtJQUNSLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLHdCQUF3QjtJQUN4Qiw4QkFBOEI7SUFDOUIsMkJBQTJCO0lBQzNCLGFBQWE7SUFDYixhQUFhO0lBQ2IsbUJBQW1CO0NBQ3RCLENBQUM7QUFFYSw0Q0FBbUIsR0FBYTtJQUMzQyxhQUFhO0lBQ2Isb0JBQW9CO0lBQ3BCLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLHFCQUFxQjtJQUNyQixzQkFBc0I7SUFDdEIsNEJBQTRCO0lBQzVCLHFCQUFxQjtJQUNyQixjQUFjO0lBQ2QscUJBQXFCO0lBQ3JCLHdCQUF3QjtJQUN4QixtQkFBbUI7SUFDbkIscUJBQXFCO0NBQ3hCLENBQUM7QUFFYSx1Q0FBYyxHQUFhLHdCQUF3QixDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztJQUMxRixlQUFlO0lBQ2YsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsUUFBUTtJQUNSLFVBQVU7SUFDVixpQkFBaUI7SUFDakIsV0FBVztJQUNYLGFBQWE7SUFDYixpQkFBaUI7SUFDakIsWUFBWTtJQUNaLE1BQU07SUFDTixTQUFTO0lBQ1QsY0FBYztJQUNkLGlCQUFpQjtJQUNqQiw2QkFBNkI7SUFDN0IsVUFBVTtJQUNWLEtBQUs7SUFDTCxXQUFXO0lBQ1gsYUFBYTtJQUNiLE9BQU87SUFDUCxRQUFRO0lBQ1IsUUFBUTtJQUNSLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIseUJBQXlCO0lBQ3pCLGFBQWE7SUFDYixrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFNBQVM7SUFDVCxNQUFNO0lBQ04sWUFBWTtJQUNaLFlBQVk7SUFDWixxQkFBcUI7SUFDckIsaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCxVQUFVO0lBQ1YsNEJBQTRCO0lBQzVCLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YsOEJBQThCO0lBQzlCLFVBQVU7SUFDVixNQUFNO0lBQ04sV0FBVztJQUNYLFFBQVE7SUFDUixtQkFBbUI7SUFDbkIsaUJBQWlCO0lBQ2pCLHVCQUF1QjtJQUN2QixvQkFBb0I7SUFDcEIsUUFBUTtJQUNSLHdCQUF3QjtJQUN4QixZQUFZO0lBQ1osV0FBVztJQUNYLHNCQUFzQjtJQUN0QixNQUFNO0lBQ04sVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFFBQVE7SUFDUixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLGVBQWU7SUFDZixlQUFlO0lBQ2YsdUJBQXVCO0lBQ3ZCLHFCQUFxQjtJQUNyQixNQUFNO0lBQ04sSUFBSTtJQUNKLHNCQUFzQjtJQUN0Qix1QkFBdUI7SUFDdkIsaUJBQWlCO0lBQ2pCLGNBQWM7SUFDZCxhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLGVBQWU7SUFDZixRQUFRO0lBQ1IsYUFBYTtJQUNiLFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsYUFBYTtJQUNiLGFBQWE7SUFDYix1QkFBdUI7SUFDdkIsa0NBQWtDO0lBQ2xDLFFBQVE7SUFDUixjQUFjO0lBQ2QsUUFBUTtJQUNSLFNBQVM7SUFDVCxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVixTQUFTO0lBQ1QsV0FBVztJQUNYLFVBQVU7SUFDVixNQUFNO0lBQ04sY0FBYztJQUNkLE9BQU87SUFDUCxlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixvQkFBb0I7SUFDcEIsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixPQUFPO0lBQ1AsWUFBWTtJQUNaLHVCQUF1QjtJQUN2QixTQUFTO0lBQ1QsbUJBQW1CO0lBQ25CLFVBQVU7SUFDViw2QkFBNkI7SUFDN0Isa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxtQkFBbUI7SUFDbkIsV0FBVztJQUNYLGVBQWU7SUFDZixvQkFBb0I7SUFDcEIsd0JBQXdCO0lBQ3hCLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsYUFBYTtJQUNiLEtBQUs7SUFDTCxZQUFZO0lBQ1osY0FBYztJQUNkLCtCQUErQjtJQUMvQiwrQkFBK0I7SUFDL0IsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQix5QkFBeUI7SUFDekIsU0FBUztJQUNULE1BQU07SUFDTixVQUFVO0lBQ1YsZ0JBQWdCO0lBQ2hCLFNBQVM7SUFDVCxlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLFFBQVE7SUFDUixVQUFVO0lBQ1YsS0FBSztJQUNMLGFBQWE7SUFDYixLQUFLO0lBQ0wsTUFBTTtJQUNOLFdBQVc7SUFDWCxZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLFVBQVU7SUFDVixPQUFPO0lBQ1AsT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lBQ1gsZ0NBQWdDO0lBQ2hDLE1BQU07SUFDTixJQUFJO0lBQ0osOEJBQThCO0lBQzlCLGVBQWU7SUFDZixjQUFjO0lBQ2QsUUFBUTtJQUNSLE9BQU87SUFDUCxHQUFHO0lBQ0gsR0FBRztDQUNOLENBQUMsQ0FBQztBQUVZLDJDQUFrQixHQUFhO0lBQzFDLE9BQU87SUFDUCxPQUFPO0lBQ1AsUUFBUTtJQUNSLGlCQUFpQjtJQUNqQixXQUFXO0lBQ1gsaUJBQWlCO0lBQ2pCLFlBQVk7SUFDWixNQUFNO0lBQ04sU0FBUztJQUNULGNBQWM7SUFDZCxVQUFVO0lBQ1YsYUFBYTtJQUNiLE9BQU87SUFDUCxRQUFRO0lBQ1IsYUFBYTtJQUNiLG1CQUFtQjtJQUNuQix5QkFBeUI7SUFDekIsa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxZQUFZO0lBQ1oscUJBQXFCO0lBQ3JCLGNBQWM7SUFDZCxVQUFVO0lBQ1YsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZiw4QkFBOEI7SUFDOUIsTUFBTTtJQUNOLFdBQVc7SUFDWCxRQUFRO0lBQ1IsbUJBQW1CO0lBQ25CLGlCQUFpQjtJQUNqQix1QkFBdUI7SUFDdkIsb0JBQW9CO0lBQ3BCLHdCQUF3QjtJQUN4QixZQUFZO0lBQ1osc0JBQXNCO0lBQ3RCLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLHVCQUF1QjtJQUN2QixxQkFBcUI7SUFDckIsTUFBTTtJQUNOLHNCQUFzQjtJQUN0Qix1QkFBdUI7SUFDdkIsU0FBUztJQUNULFdBQVc7SUFDWCxXQUFXO0lBQ1gsVUFBVTtJQUNWLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsYUFBYTtJQUNiLGFBQWE7SUFDYix1QkFBdUI7SUFDdkIsa0NBQWtDO0lBQ2xDLGNBQWM7SUFDZCxRQUFRO0lBQ1IsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osb0JBQW9CO0lBQ3BCLGdCQUFnQjtJQUNoQixPQUFPO0lBQ1AsWUFBWTtJQUNaLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsYUFBYTtJQUNiLGNBQWM7SUFDZCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLHlCQUF5QjtJQUN6QixTQUFTO0lBQ1QsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixTQUFTO0lBQ1QsZUFBZTtJQUNmLFFBQVE7SUFDUixVQUFVO0lBQ1YsS0FBSztJQUNMLGFBQWE7SUFDYixLQUFLO0lBQ0wsTUFBTTtJQUNOLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsVUFBVTtJQUNWLFdBQVc7SUFDWCxnQ0FBZ0M7SUFDaEMsTUFBTTtJQUNOLElBQUk7SUFDSixlQUFlO0lBQ2YsY0FBYztJQUNkLFFBQVE7Q0FDWCxDQUFDO0FBRWEscUNBQVksR0FBYSx3QkFBd0IsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7SUFDeEYsZUFBZTtJQUNmLGVBQWU7SUFDZixZQUFZO0lBQ1osV0FBVztJQUNYLFlBQVk7SUFDWixVQUFVO0lBQ1YsYUFBYTtJQUNiLGlCQUFpQjtJQUNqQiw2QkFBNkI7SUFDN0IsS0FBSztJQUNMLFdBQVc7SUFDWCxRQUFRO0lBQ1IsYUFBYTtJQUNiLFNBQVM7SUFDVCxNQUFNO0lBQ04sWUFBWTtJQUNaLGlCQUFpQjtJQUNqQiw0QkFBNEI7SUFDNUIsVUFBVTtJQUNWLFFBQVE7SUFDUixXQUFXO0lBQ1gsTUFBTTtJQUNOLGNBQWM7SUFDZCxZQUFZO0lBQ1osUUFBUTtJQUNSLFFBQVE7SUFDUixvQkFBb0I7SUFDcEIsSUFBSTtJQUNKLGlCQUFpQjtJQUNqQixjQUFjO0lBQ2QsYUFBYTtJQUNiLGVBQWU7SUFDZixtQkFBbUI7SUFDbkIsaUJBQWlCO0lBQ2pCLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLGVBQWU7SUFDZixRQUFRO0lBQ1IsYUFBYTtJQUNiLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsTUFBTTtJQUNOLGNBQWM7SUFDZCxPQUFPO0lBQ1AsZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixTQUFTO0lBQ1QsVUFBVTtJQUNWLFFBQVE7SUFDUiw2QkFBNkI7SUFDN0IsV0FBVztJQUNYLFdBQVc7SUFDWCxvQkFBb0I7SUFDcEIsS0FBSztJQUNMLFlBQVk7SUFDWixnQkFBZ0I7SUFDaEIsK0JBQStCO0lBQy9CLCtCQUErQjtJQUMvQixNQUFNO0lBQ04sT0FBTztJQUNQLHFCQUFxQjtJQUNyQixZQUFZO0lBQ1osT0FBTztJQUNQLE9BQU87SUFDUCxTQUFTO0lBQ1QsOEJBQThCO0lBQzlCLFFBQVE7SUFDUixPQUFPO0lBQ1AsT0FBTztJQUNQLEdBQUc7SUFDSCxHQUFHO0NBQ04sQ0FBQyxDQUFDO3FIQXplTSx3QkFBd0I7eUdBQXhCLHdCQUF3QixrMlRBRnRCLEVBQUU7MkZBRUosd0JBQXdCO2tCQUpwQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRyxrQkFBa0I7b0JBQzdCLFFBQVEsRUFBRyxFQUFFO2lCQUNoQjtpR0E2ZlksS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFPRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csNEJBQTRCO3NCQUFwQyxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBR0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFLRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxnQ0FBZ0M7c0JBQXhDLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFNRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyw4QkFBOEI7c0JBQXRDLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRywyQkFBMkI7c0JBQW5DLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csMEJBQTBCO3NCQUFsQyxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFDRyw2QkFBNkI7c0JBQXJDLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLDRCQUE0QjtzQkFBcEMsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csQ0FBQztzQkFBVCxLQUFLO2dCQUNHLENBQUM7c0JBQVQsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQVlJLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFZRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBT0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQVFHLHdCQUF3QjtzQkFBakMsTUFBTTtnQkFjRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBV0csaUNBQWlDO3NCQUExQyxNQUFNO2dCQWFHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFVRyxZQUFZO3NCQUFyQixNQUFNO2dCQU9HLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFVRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBTUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFhRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBZ0JHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFjRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBaUJHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFjRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBZ0JHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFxQkcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQWNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFjRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBWUcscUJBQXFCO3NCQUE5QixNQUFNO2dCQWVHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFXRyw0QkFBNEI7c0JBQXJDLE1BQU07Z0JBUUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQU1HLFlBQVk7c0JBQXJCLE1BQU07Z0JBaUJHLGFBQWE7c0JBQXRCLE1BQU07Z0JBTUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFRRyw2QkFBNkI7c0JBQXRDLE1BQU07Z0JBUUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQU1HLFlBQVk7c0JBQXJCLE1BQU07Z0JBTUcsa0JBQWtCO3NCQUEzQixNQUFNO2dCQU1HLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFTRyxVQUFVO3NCQUFuQixNQUFNO2dCQVdHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFNRyxVQUFVO3NCQUFuQixNQUFNO2dCQVFHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFTRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBZUcsTUFBTTtzQkFBZixNQUFNO2dCQU9HLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFjRyxZQUFZO3NCQUFyQixNQUFNO2dCQVVHLFlBQVk7c0JBQXJCLE1BQU07Z0JBZUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQVNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBZUcsb0JBQW9CO3NCQUE3QixNQUFNO2dCQVdHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFjRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBTUcsU0FBUztzQkFBbEIsTUFBTTtnQkFPRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBYUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFjRyxhQUFhO3NCQUF0QixNQUFNO2dCQW1CRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBWUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFvQkcsY0FBYztzQkFBdkIsTUFBTTtnQkFNRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBU0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQVVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFZRyxZQUFZO3NCQUFyQixNQUFNO2dCQVlHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFZRyxlQUFlO3NCQUF4QixNQUFNO2dCQVFHLDBCQUEwQjtzQkFBbkMsTUFBTTtnQkFZRyxjQUFjO3NCQUF2QixNQUFNO2dCQWNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFXRyxlQUFlO3NCQUF4QixNQUFNO2dCQVdHLGVBQWU7c0JBQXhCLE1BQU07Z0JBWUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQVlHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFZRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBWUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFZRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBWUcsY0FBYztzQkFBdkIsTUFBTTtnQkFnQkcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQU1HLFFBQVE7c0JBQWpCLE1BQU07Z0JBV0csU0FBUztzQkFBbEIsTUFBTTtnQkFhRyxVQUFVO3NCQUFuQixNQUFNO2dCQU1HLE1BQU07c0JBQWYsTUFBTTtnQkFXRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBWUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQVFHLFVBQVU7c0JBQW5CLE1BQU07Z0JBVUcsT0FBTztzQkFBaEIsTUFBTTtnQkFlRyxPQUFPO3NCQUFoQixNQUFNO2dCQWtCRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBTUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFLRyxXQUFXO3NCQUFwQixNQUFNO2dCQU1HLFNBQVM7c0JBQWxCLE1BQU07Z0JBVUcsUUFBUTtzQkFBakIsTUFBTTtnQkFlRyxlQUFlO3NCQUF4QixNQUFNO2dCQVFHLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFTRyxlQUFlO3NCQUF4QixNQUFNO2dCQVNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFTRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBYUcsd0JBQXdCO3NCQUFqQyxNQUFNO2dCQVVHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFXRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBU0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQVNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFTRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBU0csaUJBQWlCO3NCQUExQixNQUFNO2dCQVVHLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFNRyxNQUFNO3NCQUFmLE1BQU07Z0JBTUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQU1HLGVBQWU7c0JBQXhCLE1BQU07Z0JBVUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFRRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBUUcsNEJBQTRCO3NCQUFyQyxNQUFNO2dCQVFHLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFPRyxXQUFXO3NCQUFwQixNQUFNO2dCQVNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBYUcsaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKipcbiAqIEFuZ3VsYXIgd3JhcHBlciBmb3IgQnJ5bnR1bSBDYWxlbmRhclxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBTaW1wbGVDaGFuZ2UsIFNpbXBsZUNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCBXcmFwcGVySGVscGVyIGZyb20gJy4vd3JhcHBlci5oZWxwZXInO1xuXG5pbXBvcnQgeyBBbGlnblNwZWMsIEJhc2UsIEJ1dHRvbkNvbmZpZywgQ29udGFpbmVyLCBDb250YWluZXJDb25maWcsIERhdGVQaWNrZXJDb25maWcsIERvbUNvbmZpZywgRHJhZ0NvbnRleHQsIEtleU1hcENvbmZpZywgTGF5b3V0LCBNYXNrLCBNYXNrQ29uZmlnLCBNZW51LCBNZW51SXRlbSwgTWVudUl0ZW1Db25maWcsIE1lbnVJdGVtRW50cnksIE1vZGVsLCBQYWdpbmdUb29sYmFyQ29uZmlnLCBQYW5lbCwgUGFuZWxDb2xsYXBzZXJDb25maWcsIFBhbmVsQ29sbGFwc2VyT3ZlcmxheUNvbmZpZywgUGFuZWxIZWFkZXIsIFBvcHVwLCBSZWN0YW5nbGUsIFNjcm9sbGVyLCBTY3JvbGxlckNvbmZpZywgU3RhdGVQcm92aWRlciwgU3RvcmUsIFRhYkNvbmZpZywgVGV4dEZpZWxkQ29uZmlnLCBUb29sLCBUb29sQ29uZmlnLCBUb29sYmFyQ29uZmlnLCBUb29sYmFySXRlbXMsIFRvb2x0aXBDb25maWcsIFdpZGdldCwgV2lkZ2V0Q29uZmlnIH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcbmltcG9ydCB7IENvbHVtbiwgRXhwb3J0Q29uZmlnLCBYTFNDb2x1bW4gfSBmcm9tICdAYnJ5bnR1bS9ncmlkLXRoaW4nO1xuaW1wb3J0IHsgQXNzaWdubWVudE1vZGVsLCBBc3NpZ25tZW50TW9kZWxDb25maWcsIEFzc2lnbm1lbnRTdG9yZSwgQXNzaWdubWVudFN0b3JlQ29uZmlnLCBDcnVkTWFuYWdlciBhcyBTY2hlZHVsZXJDcnVkTWFuYWdlciwgRXZlbnRFZGl0IGFzIFNjaGVkdWxlckV2ZW50RWRpdCwgRXZlbnRNb2RlbCwgRXZlbnRNb2RlbENvbmZpZywgRXZlbnRTdG9yZSwgRXZlbnRTdG9yZUNvbmZpZywgUHJvamVjdENvbnN1bWVyLCBQcm9qZWN0TW9kZWxNaXhpbiwgUmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwLCBSZWN1cnJlbmNlQ29uZmlybWF0aW9uUG9wdXBDb25maWcsIFJlc291cmNlRmlsdGVyQ29uZmlnLCBSZXNvdXJjZU1vZGVsLCBSZXNvdXJjZU1vZGVsQ29uZmlnLCBSZXNvdXJjZVN0b3JlLCBSZXNvdXJjZVN0b3JlQ29uZmlnLCBSZXNvdXJjZVRpbWVSYW5nZU1vZGVsLCBSZXNvdXJjZVRpbWVSYW5nZU1vZGVsQ29uZmlnLCBSZXNvdXJjZVRpbWVSYW5nZVN0b3JlLCBSZXNvdXJjZVRpbWVSYW5nZVN0b3JlQ29uZmlnLCBTY2hlZHVsZXIsIFRpbWVTcGFuIH0gZnJvbSAnQGJyeW50dW0vc2NoZWR1bGVyLXRoaW4nO1xuaW1wb3J0IHsgQWdlbmRhVmlld0NvbmZpZywgQ2FsZW5kYXIsIENhbGVuZGFyRGF0ZVBpY2tlckNvbmZpZywgQ2FsZW5kYXJEcmFnLCBDYWxlbmRhckRyYWdDb25maWcsIENhbGVuZGFyTGlzdGVuZXJzLCBDYWxlbmRhclRvb2xiYXJDb25maWcsIENhbGVuZGFyVmlldywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnLCBDYWxlbmRhckNvbnRhaW5lckxheW91dENvbmZpZywgQ3J1ZE1hbmFnZXJDb25maWcsIERheUFnZW5kYVZpZXdDb25maWcsIERheUNlbGwsIERheVJlc291cmNlVmlld0NvbmZpZywgRGF5Vmlld0NvbmZpZywgRXZlbnRCdWZmZXIsIEV2ZW50QnVmZmVyQ29uZmlnLCBFdmVudENvcHlQYXN0ZSwgRXZlbnRDb3B5UGFzdGVDb25maWcsIEV2ZW50RWRpdCwgRXZlbnRFZGl0Q29uZmlnLCBFdmVudExpc3RDb25maWcsIEV2ZW50TWVudSwgRXZlbnRNZW51Q29uZmlnLCBFdmVudFRvb2x0aXAsIEV2ZW50VG9vbHRpcENvbmZpZywgRXhjZWxFeHBvcnRlciwgRXhjZWxFeHBvcnRlckNvbmZpZywgRXh0ZXJuYWxFdmVudFNvdXJjZSwgRXh0ZXJuYWxFdmVudFNvdXJjZUNvbmZpZywgTG9hZE9uRGVtYW5kLCBMb2FkT25EZW1hbmRDb25maWcsIE1vbnRoQWdlbmRhVmlld0NvbmZpZywgTW9udGhHcmlkQ29uZmlnLCBNb250aFZpZXdDb25maWcsIFByaW50LCBQcmludENvbmZpZywgUHJvamVjdE1vZGVsLCBQcm9qZWN0TW9kZWxDb25maWcsIFJlc291cmNlVmlld0NvbmZpZywgU2NoZWR1bGVNZW51LCBTY2hlZHVsZU1lbnVDb25maWcsIFNjaGVkdWxlVG9vbHRpcCwgU2NoZWR1bGVUb29sdGlwQ29uZmlnLCBUaW1lUmFuZ2VNb2RlbCwgVGltZVJhbmdlTW9kZWxDb25maWcsIFRpbWVSYW5nZVN0b3JlLCBUaW1lUmFuZ2VTdG9yZUNvbmZpZywgVGltZVJhbmdlcywgVGltZVJhbmdlc0NvbmZpZywgVmFsaWRhdGVDcmVhdGVSZXN1bHQsIFdlZWtFeHBhbmRlciwgV2Vla0V4cGFuZGVyQ29uZmlnLCBXZWVrVmlld0NvbmZpZywgWWVhclZpZXdDb25maWcgfSBmcm9tICdAYnJ5bnR1bS9jYWxlbmRhci10aGluJztcblxuaW1wb3J0IHsgU3RyaW5nSGVscGVyIH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcblxuZXhwb3J0IHR5cGUgQnJ5bnR1bUNhbGVuZGFyUHJvcHMgPSB7XG4gICAgLy8gQ29uZmlnc1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIENTUyBjbGFzcyBuYW1lIHRvIGFkZCB0byBjYWxlbmRhciBkYXRlIGNlbGxzIHdoaWNoIGVuY2Fwc3VsYXRlIHRoZSBjYWxlbmRhcidzXG4gICAgICogYWN0aXZlIFtkYXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjcHJvcGVydHktZGF0ZSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctYWN0aXZlRGF0ZUNscylcbiAgICAgKi9cbiAgICBhY3RpdmVEYXRlQ2xzID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciBlbGVtZW50IGlkKSB0byBhZG9wdCBhcyB0aGlzIFdpZGdldCdzIGVuY2Fwc3VsYXRpbmcgZWxlbWVudC4gVGhlIHdpZGdldCdzXG4gICAgICogY29udGVudCB3aWxsIGJlIHBsYWNlZCBpbnNpZGUgdGhpcyBlbGVtZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWFkb3B0KVxuICAgICAqL1xuICAgIGFkb3B0ID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWFsaWduKVxuICAgICAqL1xuICAgIGFsaWduID8gOiBBbGlnblNwZWN8c3RyaW5nXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIHdpZGdldCBpcyBhIGNoaWxkIG9mIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYmUgcGFydGljaXBhdGluZyBpbiBhXG4gICAgICogZmxleGJveCBsYXlvdXQuIFRoaXMgY29uZmlnIGFsbG93cyB5b3UgdG8gc2V0IHRoaXMgd2lkZ2V0J3NcbiAgICAgKiBbYWxpZ24tc2VsZl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2FsaWduLXNlbGYpIHN0eWxlLlxuICAgICAqL1xuICAgIGFsaWduU2VsZiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpIGFuZCBiZWluZyBzaG93biB0aHJvdWdoIFtzaG93QnldKCNDb3JlL3dpZGdldC9XaWRnZXQjZnVuY3Rpb24tc2hvd0J5KS4qXG4gICAgICogYHRydWVgIHRvIHNob3cgYSBjb25uZWN0b3IgYXJyb3cgcG9pbnRpbmcgdG8gdGhlIGFsaWduIHRhcmdldC5cbiAgICAgKi9cbiAgICBhbmNob3IgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciB0aGUgaWQgb2YgYW4gZWxlbWVudCkgdG8gYXBwZW5kIHRoaXMgd2lkZ2V0J3MgZWxlbWVudCB0by4gQ2FuIGJlIGNvbmZpZ3VyZWQsIG9yIHNldCBvbmNlIGF0XG4gICAgICogcnVudGltZS4gVG8gYWNjZXNzIHRoZSBlbGVtZW50IG9mIGEgcmVuZGVyZWQgd2lkZ2V0LCBzZWUgW2VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWVsZW1lbnQpLlxuICAgICAqL1xuICAgIGFwcGVuZFRvID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGxvY2FsaXphYmxlIHN0cmluZyAoTWF5IGNvbnRhaW4gYCdMe30nYCB0b2tlbnMgd2hpY2ggcmVzb2x2ZSBpbiB0aGUgbG9jYWxlIGZpbGUpIHRvIGluamVjdFxuICAgICAqIGludG8gYW4gZWxlbWVudCB3aGljaCB3aWxsIGJlIGxpbmtlZCB1c2luZyB0aGUgYGFyaWEtZGVzY3JpYmVkYnlgIGF0dHJpYnV0ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1hcmlhRGVzY3JpcHRpb24pXG4gICAgICovXG4gICAgYXJpYURlc2NyaXB0aW9uID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGxvY2FsaXphYmxlIHN0cmluZyAoTWF5IGNvbnRhaW4gYCdMe30nYCB0b2tlbnMgd2hpY2ggcmVzb2x2ZSBpbiB0aGUgbG9jYWxlIGZpbGUpIHRvIGluamVjdCBhc1xuICAgICAqIHRoZSBgYXJpYS1sYWJlbGAgYXR0cmlidXRlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWFyaWFMYWJlbClcbiAgICAgKi9cbiAgICBhcmlhTGFiZWwgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIElubGluZSBhc3NpZ25tZW50cywgd2lsbCBiZSBsb2FkZWQgaW50byB0aGUgW2Fzc2lnbm1lbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9taXhpbi9DYWxlbmRhclN0b3JlcyNwcm9wZXJ0eS1hc3NpZ25tZW50U3RvcmUpLlxuICAgICAqL1xuICAgIGFzc2lnbm1lbnRzID8gOiBBc3NpZ25tZW50TW9kZWxbXXxBc3NpZ25tZW50TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBbQXNzaWdubWVudFN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9kYXRhL0Fzc2lnbm1lbnRTdG9yZSkgb3IgYSByZWNvbmZpZ3VyaW5nIG9iamVjdCBmb3IgYSBzdG9yZSB3aGljaCB3aWxsIGhvbGQgYXNzaWdubWVudHMgbGlua2luZyByZXNvdXJjZXMgdG8gZXZlbnRzLlxuICAgICAqL1xuICAgIGFzc2lnbm1lbnRTdG9yZSA/IDogQXNzaWdubWVudFN0b3JlfEFzc2lnbm1lbnRTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIElmIHRoaXMgY29uZmlnIGlzIHNldCwgdGhlbiB0aGUgYGdlc3R1cmVgIGNvbmZpZ3VyZWQgKHdoaWNoIGRlZmF1bHRzIHRvIGBkYmxjbGlja2ApIGNyZWF0ZXMgYVxuICAgICAqIG5ldyBldmVudCBhdCB0aGUgbW91c2Ugb3IgdG91Y2ggZXZlbnQncyB0aW1lIHBvaW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWF1dG9DcmVhdGUpXG4gICAgICovXG4gICAgYXV0b0NyZWF0ZSA/IDoge1xuICAgICAgICBnZXN0dXJlPzogc3RyaW5nXG4gICAgICAgIG5ld05hbWU/OiBGdW5jdGlvbnxzdHJpbmdcbiAgICAgICAgc3RlcD86IHN0cmluZ1xuICAgICAgICBkdXJhdGlvbj86IHN0cmluZ1xuICAgICAgICBzdGFydEhvdXI/OiBudW1iZXJ8c3RyaW5nXG4gICAgfXxzdHJpbmd8Ym9vbGVhblxuICAgIC8qKlxuICAgICAqIEEgQ29uZmlnIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBbVG9vbGJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sYmFyKSxcbiAgICAgKiBvciBhcnJheSBvZiBjb25maWcgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGNoaWxkIGl0ZW1zIG9mIGEgVG9vbGJhci4gQW5vdGhlciB3YXkgdG8gYWRkIGEgYmJhciBpcyB0byB1c2UgW3N0cmlwc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctc3RyaXBzKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1iYmFyKVxuICAgICAqL1xuICAgIGJiYXIgPyA6IChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzc2VzIHRvIGFkZCB0byB0aGUgcGFuZWwncyBib2R5IGVsZW1lbnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctYm9keUNscylcbiAgICAgKi9cbiAgICBib2R5Q2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdoZXJlIHByb3BlcnR5IG5hbWVzIHdpdGggYSB0cnV0aHkgdmFsdWUgaW5kaWNhdGUgd2hpY2ggZXZlbnRzIHNob3VsZCBidWJibGUgdXAgdGhlIG93bmVyc2hpcFxuICAgICAqIGhpZXJhcmNoeSB3aGVuIHRyaWdnZXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1idWJibGVFdmVudHMpXG4gICAgICovXG4gICAgYnViYmxlRXZlbnRzID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBub3QgY2FsbCBvblhYWCBtZXRob2QgbmFtZXMgKGUuZy4gYG9uU2hvd2AsIGBvbkNsaWNrYCksIGFzIGFuIGVhc3kgd2F5IHRvIGxpc3RlbiBmb3IgZXZlbnRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWNhbGxPbkZ1bmN0aW9ucylcbiAgICAgKi9cbiAgICBjYWxsT25GdW5jdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCBpZiBhbiBldmVudCBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24sIHRoZSBlcnJvciBwcm9wYWdhdGVzIHVwIHRoZSBzdGFjayBhbmQgdGhlXG4gICAgICogYXBwbGljYXRpb24gc3RhdGUgaXMgdW5kZWZpbmVkLiBDb2RlIHdoaWNoIGZvbGxvd3MgdGhlIGV2ZW50IGhhbmRsZXIgd2lsbCAqbm90KiBiZSBleGVjdXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1jYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMpXG4gICAgICovXG4gICAgY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGNlbnRyZSB0aGUgV2lkZ2V0IGluIGJyb3dzZXIgdmlld3BvcnQgc3BhY2UuXG4gICAgICovXG4gICAgY2VudGVyZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIGVsZW1lbnQuXG4gICAgICogTWF5IGJlIHNwZWNpZmllZCBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIHdpdGggdHJ1dGh5IHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctY2xzKVxuICAgICAqL1xuICAgIGNscyA/IDogc3RyaW5nfG9iamVjdFxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHBhbmVsIGlzIGNvbGxhcHNlZCAodGhlIGJvZHkgb2YgdGhlIHBhbmVsIGlzIGhpZGRlbiB3aGlsZSBvbmx5IHRoZSBoZWFkZXIgaXNcbiAgICAgKiB2aXNpYmxlKS4gT25seSB2YWxpZCBpZiB0aGUgcGFuZWwgaXMgW2NvbGxhcHNpYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzaWJsZSkuXG4gICAgICovXG4gICAgY29sbGFwc2VkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhpcyBjb25maWcgZW5hYmxlcyBjb2xsYXBzaWJpbGl0eSBmb3IgdGhlIHBhbmVsLiBTZWUgW2NvbGxhcHNlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2VkKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1jb2xsYXBzaWJsZSlcbiAgICAgKi9cbiAgICBjb2xsYXBzaWJsZSA/IDogYm9vbGVhbnxQYW5lbENvbGxhcHNlckNvbmZpZ3xQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWdcbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIHRoZSBzcGVjaWZpZWQgY29sb3IgdG8gdGhlIHdpZGdldCwgYnkgc2V0dGluZyB0aGUgYC0tYi1wcmltYXJ5YCBDU1MgdmFyaWFibGUgaW4gdGhlIHdpZGdldHNcbiAgICAgKiBgc3R5bGVgIGJsb2NrLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWNvbG9yKVxuICAgICAqL1xuICAgIGNvbG9yID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBQcm9ncmFtbWF0aWMgY29udHJvbCBvdmVyIHdoaWNoIGNvbHVtbiB0byBzdGFydCBpbiB3aGVuIHVzZWQgaW4gYSBncmlkIGxheW91dC5cbiAgICAgKi9cbiAgICBjb2x1bW4gPyA6IG51bWJlclxuICAgIGNvbmZpZyA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpIG9yIFtwb3NpdGlvbmVkXSgjQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1wb3NpdGlvbmVkKS4qXG4gICAgICogRWxlbWVudCwgV2lkZ2V0IG9yIFJlY3RhbmdsZSB0byB3aGljaCB0aGlzIFdpZGdldCBpcyBjb25zdHJhaW5lZC5cbiAgICAgKi9cbiAgICBjb25zdHJhaW5UbyA/IDogSFRNTEVsZW1lbnR8V2lkZ2V0fFJlY3RhbmdsZVxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBDU1MgY2xhc3NlcyB0byBhZGQgdG8gdGhlIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktY29udGVudEVsZW1lbnQpLlxuICAgICAqIE1heSBiZSBzcGVjaWZpZWQgYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXNcbiAgICAgKiB3aXRoIHRydXRoeSB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWNvbnRlbnRFbGVtZW50Q2xzKVxuICAgICAqL1xuICAgIGNvbnRlbnRFbGVtZW50Q2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogRXZlbnQgd2hpY2ggaXMgdXNlZCB0byBzaG93IGNvbnRleHQgbWVudXMgdmlhIHRoZSBjb250ZXh0IG1lbnUgZmVhdHVyZXNcbiAgICAgKiBbRXZlbnRNZW51XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXZlbnRNZW51KSBhbmQgW1NjaGVkdWxlTWVudV0oI0NhbGVuZGFyL2ZlYXR1cmUvU2NoZWR1bGVNZW51KS5cbiAgICAgKiBBdmFpbGFibGUgb3B0aW9ucyBhcmU6ICdjb250ZXh0bWVudScsICdjbGljaycsICdkYmxjbGljaycuXG4gICAgICovXG4gICAgY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQgPyA6ICdjb250ZXh0bWVudSd8J2NsaWNrJ3wnZGJsY2xpY2snXG4gICAgLyoqXG4gICAgICogU3VwcGx5IGEgW0NydWRNYW5hZ2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9kYXRhL0NydWRNYW5hZ2VyKSBpbnN0YW5jZSBvciBhIGNvbmZpZyBvYmplY3QgaWYgeW91IHdhbnQgdG8gdXNlXG4gICAgICogQ3J1ZE1hbmFnZXIgZm9yIGhhbmRsaW5nIGRhdGEuXG4gICAgICovXG4gICAgY3J1ZE1hbmFnZXIgPyA6IENydWRNYW5hZ2VyQ29uZmlnfFNjaGVkdWxlckNydWRNYW5hZ2VyXG4gICAgLyoqXG4gICAgICogQ2xhc3MgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBhIENydWRNYW5hZ2VyIGluIGNhc2UgaXQncyBwcm92aWRlZCBhcyBhIHNpbXBsZSBvYmplY3QgdG9cbiAgICAgKiBbY3J1ZE1hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvbWl4aW4vQ2FsZW5kYXJTdG9yZXMjY29uZmlnLWNydWRNYW5hZ2VyKSBjb25maWcuXG4gICAgICovXG4gICAgY3J1ZE1hbmFnZXJDbGFzcyA/IDogU2NoZWR1bGVyQ3J1ZE1hbmFnZXJcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgV2lkZ2V0IGNvbmZpZ3VyYXRpb24gaXMgdXNlZCBpbiB0aGUgR3JpZCdzIFJvd0V4cGFuZGVyIGZlYXR1cmUncyBgd2lkZ2V0YCBjb25maWcsIHByb3ZpZGUgdGhlXG4gICAgICogZmllbGQgb24gdGhlIGV4cGFuZGVkIHJlY29yZCB0byB1c2UgZm9yIHBvcHVsYXRpbmcgdGhpcyB3aWRnZXQncyBzdG9yZSAoaWYgYXBwbGljYWJsZSlcbiAgICAgKi9cbiAgICBkYXRhRmllbGQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIE9iamVjdCB0byBhcHBseSB0byBlbGVtZW50cyBkYXRhc2V0IChlYWNoIGtleSB3aWxsIGJlIHVzZWQgYXMgYSBkYXRhLWF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudClcbiAgICAgKi9cbiAgICBkYXRhc2V0ID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hpY2ggdGhlIENhbGVuZGFyLCBpdHMgW3NpZGViYXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNwcm9wZXJ0eS1zaWRlYmFyKSdzIGRhdGUgcGlja2VyLCBhbmRcbiAgICAgKiBpdHMgYWN0aXZlIHZpZXcgc2hvdWxkIGVuY2Fwc3VsYXRlIHVwb24gY3JlYXRpb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctZGF0ZSlcbiAgICAgKi9cbiAgICBkYXRlID8gOiBEYXRlfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgW0RhdGVIZWxwZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRGF0ZUhlbHBlcikgZm9ybWF0IHN0cmluZyB0byB1c2UgdG8gY3JlYXRlIGRhdGUgb3V0cHV0IGZvclxuICAgICAqIHZpZXcgZGVzY3JpcHRpb25zLlxuICAgICAqL1xuICAgIGRhdGVGb3JtYXQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGNvbmZpZyBvYmplY3QgdG8gY29uZmlndXJlIHRoZSBbQ2FsZW5kYXJEYXRlUGlja2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9DYWxlbmRhckRhdGVQaWNrZXIpIHdoaWNoIGlzXG4gICAgICogc2hvd24gaW4gdGhlIFtzaWRlYmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjcHJvcGVydHktc2lkZWJhcikgbmV4dCB0byB0aGUgY2FsZW5kYXIgdmlld3MuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctZGF0ZVBpY2tlcilcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4sJ2NvdW50JywnZG90cyd9IGRhdGVQaWNrZXIuc2hvd0V2ZW50cyBEaXNwbGF5cyB0aGUgcHJlc2VuY2Ugb2YgZXZlbnRzIGluIGVhY2ggY2VsbC4gdmFsdWVzIG1heSBiZTogICogYGZhbHNlYCAtIERvIG5vdCBzaG93IGV2ZW50cyBpbiBjZWxscy4gKiBgdHJ1ZWAgLSBTaG93IGEgdGhlbWVhYmxlIGJ1bGxldCB0byBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2YgZXZlbnRzIGZvciBhIGRhdGUuICogYCdjb3VudCdgIC0gU2hvdyBhIHRoZW1lYWJsZSBiYWRnZSBjb250YWluaW5nIHRoZSBldmVudCBjb3VudCBmb3IgYSBkYXRlLiAqICdgZG90cydgIC0gU2hvdyBzbWFsbCBldmVudC1jb2xvdXJlZCBidWxsZXRzICh0byBhIG1heGltdW0gb2YgdGhyZWUpIGJlbG93IHRoZSBkYXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGF0ZVBpY2tlci5jb2xsYXBzaWJsZSBgdHJ1ZWAgdG8gZW5hYmxlIGNvbGxhcHNlIGludG8gYSBoZWFkZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGVQaWNrZXIudGl0bGUgVGhlIHRleHQgdG8gcGxhY2UgaW4gYSBoZWFkZXIgYWJvdmUgdGhlIHBpY2tlci5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRhdGVQaWNrZXIuZWRpdE1vbnRoIGB0cnVlYCB0byBlbmFibGUgc2V0dGluZyB0aGUgZGF0ZSB1c2luZyB0aGUgY29udHJvbHMgaW4gdGhlIERhdGVQaWNrZXIgaGVhZGVyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbiwncmFuZ2UnfSBtdWx0aVNlbGVjdCBUaGUgRGF0ZVBpY2tlciBjYW4gc2VsZWN0IFttdWx0aXBsZSBkYXRlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9EYXRlUGlja2VyI2NvbmZpZy1tdWx0aVNlbGVjdCkgaW4gdHdvIG1vZGVzOiAgKiBgdHJ1ZWAgdG8gbWVhbiBtYW55IGRpc2NvbnRpZ3VvdXMgZGF0ZXMgbWF5IGJlIHNlbGVjdGVkLiAqIGAncmFuZ2UnYCB0byBtZWFuIHRoYXQgYSBzdGFydCBkYXRlIGFuZCBlbmQgZGF0ZSBtYXkgYmUgc2VsZWN0ZWQuICBJZiBzZXQgdXAgdG8gbXVsdGkgc2VsZWN0LCB2aWV3cyB3aGljaCBhcmUgbm90IGZpeGVkIHRvIGEgZGF0ZSBkdXJhdGlvbiB3aWxsIG9iZXkgdGhlIGRhdGUgc2VsZWN0aW9uIGJ5IHVzaW5nIGEgW2RhdGVGaWx0ZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0RheVZpZXcjcHJvcGVydHktZGF0ZUZpbHRlcikgdG8gc2tpcCBkYXlzIHdoaWNoIGFyZSBub3Qgc2VsZWN0ZWQuIFRoZXNlIGluY2x1ZGU6ICAqIEFnZW5kYVZpZXcgICAgICAobW9kZSB0eXBlIGAnYWdlbmRhJ2ApICogRGF5Vmlld3MgICAgICAgICh2aWV3IHR5cGUgYCdkYXl2aWV3J2ApIHdoaWNoIHlvdSBhZGQgdG8gdGhlIG1vZGVzIC0gVGhlIGRlZmF1bHQgYGRheWAgYW5kIGB3ZWVrYCBtb2RlcyBoYXZlIGEgZml4ZWQgZHVyYXRpb24uICogUmVzb3VyY2VWaWV3ICAgICh2aWV3IHR5cGUgYCdyZXNvdXJjZXZpZXcnYCkgKiBEYXlSZXNvdXJjZVZpZXcgKHZpZXcgdHlwZSBgJ2RheXJlc291cmNldmlldydgKSAgVGhlIGBNb250aFZpZXdgLCBhbmQgdGhlIGBXZWVrVmlld2AgYW5kIHRoZSBidWlsdC1pbiBzaW5nbGUgZGF5IGBEYXlWaWV3YCA8c3Ryb25nPm1vZGU8L3N0cm9uZz4gYWxsIGhhdmUgZml4ZWQgZHVyYXRpb24gYW5kIHdpbGwgbm90IHBhcnRpY2lwYXRlIGluIHRoaXMuIElmIHlvdSBzZWxlY3QgYSBkaXNjb250aWd1b3VzIHJhbmdlLCB0aGVuIHRoZSB2aWV3cyB3aGljaCBhcmUgYW1lbmFibGUgdG8gYmVpbmcgY29udHJvbGxlZCBpbiB0aGlzIHdheSB3aWxsIHN3aXRjaCB0aGVpciByYW5nZSB0byBlbmNvbXBhc3Mgd2hhdCB5b3UgaGF2ZSBzZWxlY3RlZC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBzZWxlY3QgdGhlIGZpcnN0IHRvIHRoZSBsYXN0IGRheXMgb2YgYSBtb250aCwgdGhlIHZpZXcncyBbcmFuZ2VdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0RhdGVSYW5nZU93bmVyI3Byb3BlcnR5LXJhbmdlKSB3aWxsIGJlIHNldCB0byBgJzEgbW9udGgnYC4gVGhpcyBjaG9pY2Ugd2lsbCBiZSBtYWludGFpbmVkLCBhbmQgYnkgbmF2aWdhdGluZyB1c2luZyB0aGUgbmV4dCBhbmQgcHJldmlvdXMgdGJhciBidXR0b25zLCB0aGUgdmlld3Mgd2lsbCBtb3ZlIGJ5IGV4YWN0bHkgb25lIG1vbnRoLiBJZiB5b3VyIHNldCBvZiBzZWxlY3RlZCBkYXRlcyBpcyBlbmNsb3NlZCB3aXRoaW4gYSB0d28gd2VlayBibG9jaywgdGhlbiB0aGUgW3JhbmdlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXRlUmFuZ2VPd25lciNwcm9wZXJ0eS1yYW5nZSkgb2YgdGhlIHZpZXdzIHdpbGwgYmUgc2V0IHRvIGB7IHVuaXQgOiAnd2VlaycsIG1hZ25pdHVkZSA6IDIgfWAuIElmIHlvdSBzZWxlY3QgdGhlIDFzdCwgM3RoIGFuZCA1dGggb2YgdGhlIG1vbnRoLCBhbmQgdGhvc2UgZGF5cyBhcmUgYWxsIG9uIG9uZSB3ZWVrIHJvdywgdGhlIFtyYW5nZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF0ZVJhbmdlT3duZXIjcHJvcGVydHktcmFuZ2UpIG9mIHRoZSB2aWV3cyB3aWxsIGJlIHNldCB0byBgeyB1bml0IDogJ3dlZWsnLCBtYWduaXR1ZGUgOiAxIH1gLiBGb3Igc2VsZWN0aW9uIHJhbmdlcyBvdGhlciB0aGFuIGV4YWN0bHkgb25lIG1vbnRoLCBuYXZpZ2F0aW9uIGluIHRpbWUgd2lsbCBiZSBpbiBpbmNyZW1lbnRzIG9mIG9uZSB3ZWVrIGZvciBpbnR1aXRpdmUgbmF2aWdhdGlvbiB1cCBhbmQgZG93biB0aGUgZGF0ZSBwaWNrZXIuIFdoZW4gbmF2aWdhdGluZyBpbiB0aW1lLCB0aGUgc2VsZWN0ZWQgYmxvY2sgb2YgZGF0ZXMgbW92ZXMgYW5kICpmb2xsb3dzIHRoZSB0aW1lIG5hdmlnYXRpb24qIHNvIHRoYXQgdGhlcmUgYXJlIGFsd2F5cyBkYXRlcyBpbiB2aWV3LCBldmVuIGlmIHRoZXkgYXJlIGVtcHR5LlxuICAgICAqL1xuICAgIGRhdGVQaWNrZXIgPyA6IENhbGVuZGFyRGF0ZVBpY2tlckNvbmZpZ3xib29sZWFufG51bGxcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0IHdoZW4gYSBzaW5nbGUgdmFsdWUgaXMgdG8gYmUgYXBwbGllZCB0byB0aGlzIFdpZGdldC4gU3VjaCBhcyB3aGVuIHVzZWRcbiAgICAgKiBpbiBhIGdyaWQgV2lkZ2V0Q29sdW1uLCB0aGlzIGlzIHRoZSBwcm9wZXJ0eSB0byB3aGljaCB0aGUgY29sdW1uJ3MgYGZpZWxkYCBpcyBhcHBsaWVkLlxuICAgICAqL1xuICAgIGRlZmF1bHRCaW5kUHJvcGVydHkgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBjYWxlbmRhciAoW1Jlc291cmNlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9SZXNvdXJjZU1vZGVsKSksIChvciBpdHMgYGlkYCkgdG8gdXNlIGFzIHRoZVxuICAgICAqIGRlZmF1bHQgY2FsZW5kYXIgZm9yIG5ldyBldmVudHMgY3JlYXRlZCB1c2luZyBbZGJsY2xpY2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctYXV0b0NyZWF0ZSlcbiAgICAgKiBvciBbZHJhZy1jcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9DYWxlbmRhckRyYWcpLCBvciBbZHJhZ2dpbmcgaW5dKCNDYWxlbmRhci9mZWF0dXJlL0V4dGVybmFsRXZlbnRTb3VyY2UpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWRlZmF1bHRDYWxlbmRhcilcbiAgICAgKi9cbiAgICBkZWZhdWx0Q2FsZW5kYXIgPyA6IHN0cmluZ3xSZXNvdXJjZU1vZGVsXG4gICAgLyoqXG4gICAgICogQSBbcXVlcnldKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI2Z1bmN0aW9uLXF1ZXJ5KSBzZWxlY3RvciBmdW5jdGlvbiB3aGljaCBjYW4gaWRlbnRpZnkgdGhlIGRlc2NlbmRhbnQgd2lkZ2V0IHRvIHdoaWNoXG4gICAgICogZm9jdXMgc2hvdWxkIGJlIGRpcmVjdGVkIGJ5IGRlZmF1bHQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctZGVmYXVsdEZvY3VzKVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSB3aWRnZXQgV2lkZ2V0IHBhc3NlZCB0byBtZXRob2RcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1dGh5IHZhbHVlIGlmIHdpZGdldCBpcyB0aGUgZGVmYXVsdCBvbmVcbiAgICAgKi9cbiAgICBkZWZhdWx0Rm9jdXMgPyA6ICgod2lkZ2V0OiBXaWRnZXQpID0+IGJvb2xlYW4pfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgY29uZmlnIG9iamVjdCBjb250YWluaW5nIGRlZmF1bHQgc2V0dGluZ3MgdG8gYXBwbHkgdG8gYWxsIGNoaWxkIHdpZGdldHMuXG4gICAgICovXG4gICAgZGVmYXVsdHMgPyA6IENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgZmFsc2VgIHRvIHByZXNlcnZlIHNlbGVjdGlvbiB3aGVuIGNsaWNraW5nIHRoZSBlbXB0eSBzY2hlZHVsZSBhcmVhLlxuICAgICAqL1xuICAgIGRlc2VsZWN0QWxsT25TY2hlZHVsZUNsaWNrID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBkZXNlbGVjdCBhIHNlbGVjdGVkIGV2ZW50IHVwb24gY2xpY2suXG4gICAgICovXG4gICAgZGVzZWxlY3RPbkNsaWNrID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBkZXN0cm95IHRoZSBQcm9qZWN0IGFuZCBzdG9yZXMgd2hlbiBgdGhpc2AgaXMgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIGRlc3Ryb3lTdG9yZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDaGVjayBmb3IgQ1NTIGNvbXBhdGliaWxpdHkgaXNzdWVzIHdoZW4gdXBncmFkaW5nIHRvIHY3LiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGNoZWNrczpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1kZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzKVxuICAgICAqL1xuICAgIGRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIG9yIGVuYWJsZSB0aGUgd2lkZ2V0LiBJdCBpcyBzaW1pbGFyIHRvIFtyZWFkT25seV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXJlYWRPbmx5KSBleGNlcHQgYSBkaXNhYmxlZCB3aWRnZXRcbiAgICAgKiBjYW5ub3QgYmUgZm9jdXNlZCwgdXNlcyBhIGRpZmZlcmVudCByZW5kaXRpb24gKHVzdWFsbHkgZ3JleWlzaCkgYW5kIGRvZXMgbm90IGFsbG93IHNlbGVjdGluZyBpdHMgdmFsdWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctZGlzYWJsZWQpXG4gICAgICovXG4gICAgZGlzYWJsZWQgPyA6IGJvb2xlYW58J2luZXJ0J1xuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBwbGFjZW1lbnQgb2YgdGhpcyB3aWRnZXQgd2hlbiBpdCBpcyBhZGRlZCB0byBhIFtwYW5lbCdzIF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbClcbiAgICAgKiBbc3RyaXBzIGNvbGxlY3Rpb25dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXN0cmlwcykuIFR5cGljYWwgdmFsdWVzIGZvciB0aGlzIGNvbmZpZyBhcmUgYCd0b3AnYCxcbiAgICAgKiBgJ2JvdHRvbSdgLCBgJ2xlZnQnYCwgb3IgYCdyaWdodCdgLCB3aGljaCBjYXVzZSB0aGUgd2lkZ2V0IHRvIGJlIHBsYWNlZCBvbiB0aGF0IHNpZGUgb2YgdGhlIHBhbmVsJ3NcbiAgICAgKiBib2R5LiBTdWNoIHdpZGdldHMgYXJlIGNhbGxlZCBcImVkZ2Ugc3RyaXBzXCIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctZG9jaylcbiAgICAgKi9cbiAgICBkb2NrID8gOiAndG9wJ3wnYm90dG9tJ3wnbGVmdCd8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnfCdoZWFkZXInfCdwcmUtaGVhZGVyJ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gYmUgYWJsZSB0byBkcmFnIGEgd2lkZ2V0IGZyZWVseSBvbiB0aGUgcGFnZS4gT3Igc2V0IHRvIGFuIG9iamVjdCB3aXRoIGEgwrRoYW5kbGVTZWxlY3RvcsK0XG4gICAgICogcHJvcGVydHkgd2hpY2ggY29udHJvbHMgd2hlbiBhIGRyYWcgc2hvdWxkIHN0YXJ0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWRyYWdnYWJsZSlcbiAgICAgKi9cbiAgICBkcmFnZ2FibGUgPyA6IGJvb2xlYW58e1xuICAgICAgICBoYW5kbGVTZWxlY3Rvcj86IHN0cmluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlIHRoaXMgUGFuZWwgYSBkb2NrZWQgZHJhd2VyIHdoaWNoIHNsaWRlcyBvdXQgZnJvbSBvbmUgc2lkZSBvZiB0aGUgYnJvd3NlciB2aWV3cG9ydCBieSBkZWZhdWx0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWRyYXdlcilcbiAgICAgKiBAcGFyYW0geydzdGFydCcsJ2xlZnQnLCdlbmQnLCdyaWdodCcsJ3RvcCcsJ2JvdHRvbSd9IHNpZGUgVGhlIHNpZGUgb2YgdGhlIHZpZXdwb3J0IHRvIGRvY2sgdGhlIGRyYXdlciB0by4gICogYCdzdGFydCdgIG1lYW5zIHRoZSBgaW5saW5lLXN0YXJ0YCBzaWRlLiAqIGAnZW5kJ2AgbWVhbnMgdGhlIGBpbmxpbmUtZW5kYCBzaWRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nLG51bWJlcn0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZHJhd2VyIGluIGl0cyBjb2xsYXBzaWJsZSBheGlzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5saW5lIElmIHVzaW5nIHRoZSBbYXBwZW5kVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgdG8gcGxhY2UgdGhlIGRyYXdlciBpbnNpZGUgYSBob3N0IHdpZGdldCwgdGhpcyBtYXkgYmUgc2V0IHRvIGB0cnVlYCB0byBtYWtlIHRoZSBkcmF3ZXIgaW5saW5lIHdpdGhpbiB0aGF0IGhvc3QuIE5vdGUgdGhhdCwgaWYgdXNpbmcgdGhpcywgdGhlIGxheW91dCBvZiB0aGUgaG9zdCBlbGVtZW50IG11c3QgaGF2ZSBgZmxleC1kaXJlY3Rpb25gIHNldCBhcHByb3ByaWF0ZWx5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixvYmplY3R9IGF1dG9DbG9zZSBTcGVjaWZpZXMgd2hhdCB1c2VyIGFjdGlvbnMgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIGRyYXdlci4gRGVmYXVsdHMgdG8gY2xvc2luZyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIgb3Igd2hlbiBmb2N1cyBtb3ZlcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFuLHN0cmluZ30gYXV0b0Nsb3NlLm1vdXNlZG93biBJZiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSBvZiB0aGUgZHJhd2VyLCB0aGUgZHJhd2VyIHdpbGwgYXV0b21hdGljYWxseSBiZSBoaWRkZW4uIElmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZywgaXQgaXMgdXNlZCBhcyBhIENTUyBzZWxlY3RvciB0byBmaWx0ZXIgY2xpY2tzIHdoaWNoIHNob3VsZCBjbG9zZSB0aGUgZHJhd2VyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixzdHJpbmd9IGF1dG9DbG9zZS5mb2N1c291dCBJZiBmb2N1cyBtb3ZlcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIsIHRoZSBkcmF3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGhpZGRlbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0b0Nsb3NlLm1vdXNlb3V0IEhpZGVzIHRoZSBkcmF3ZXIgd2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBkcmF3ZXIgYWZ0ZXIgdGhlIGBhdXRvQ2xvc2VEZWxheWAgcGVyaW9kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdXRvQ2xvc2VEZWxheSBXaGVuIHVzaW5nIGBtb3VzZW91dGAsIHRoaXMgaXMgdGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuICAgICAqL1xuICAgIGRyYXdlciA/IDogYm9vbGVhbnx7c2lkZT86ICdzdGFydCd8J2xlZnQnfCdlbmQnfCdyaWdodCd8J3RvcCd8J2JvdHRvbScsIHNpemU/OiBzdHJpbmd8bnVtYmVyLCBpbmxpbmU/OiBib29sZWFuLCBhdXRvQ2xvc2U6IHsgbW91c2Vkb3duPzogYm9vbGVhbnxzdHJpbmcsIGZvY3Vzb3V0PzogYm9vbGVhbnxzdHJpbmcsIG1vdXNlb3V0Pzogc3RyaW5nIH0sIGF1dG9DbG9zZURlbGF5PzogbnVtYmVyfVxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIGF0dHJpYnV0ZXMgdG8gYXNzaWduIHRvIHRoZSByb290IGVsZW1lbnQgb2YgdGhpcyB3aWRnZXQuXG4gICAgICogU2V0IGBudWxsYCB2YWx1ZSB0byBhdHRyaWJ1dGUgdG8gcmVtb3ZlIGl0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAqL1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8bnVsbD5cbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2luZyBbRGVsZXRlXSBhbmQgW0JhY2tzcGFjZV0gdG8gcmVtb3ZlIGV2ZW50cy9hc3NpZ25tZW50c1xuICAgICAqL1xuICAgIGVuYWJsZURlbGV0ZUtleSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgZXZlbnRzIGJlaW5nIHJlY3VycmluZyBhbmQgYWxzbyBhZGRzIGV4dHJhIHJlY3VycmVuY2UgVUkgZmllbGRzIGluIHRoZSBidWlsdC1pbiBldmVudCBlZGl0b3IuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctZW5hYmxlUmVjdXJyaW5nRXZlbnRzKVxuICAgICAqL1xuICAgIGVuYWJsZVJlY3VycmluZ0V2ZW50cyA/IDogYm9vbGVhbnx7XG4gICAgICAgIGRlZmF1bHRBY3Rpb24/OiAnc2luZ2xlJ3wnZnV0dXJlJ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGxpc3RlbiBmb3IgQ1RSTC1aIChDTUQtWiBvbiBNYWMgT1MpIGtleWJvYXJkIGV2ZW50IGFuZCB0cmlnZ2VyIHVuZG8gKHJlZG8gd2hlbiBTSElGVCBpcyBwcmVzc2VkKS5cbiAgICAgKiBPbmx5IGFwcGxpY2FibGUgd2hlbiB1c2luZyBhIFtTdGF0ZVRyYWNraW5nTWFuYWdlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2RhdGEvc3RtL1N0YXRlVHJhY2tpbmdNYW5hZ2VyKS5cbiAgICAgKi9cbiAgICBlbmFibGVVbmRvUmVkb0tleXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBJbmxpbmUgZXZlbnRzLCB3aWxsIGJlIGxvYWRlZCBpbnRvIHRoZSBbZXZlbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9taXhpbi9DYWxlbmRhclN0b3JlcyNwcm9wZXJ0eS1ldmVudFN0b3JlKS5cbiAgICAgKi9cbiAgICBldmVudHMgPyA6IEV2ZW50TW9kZWxbXXxFdmVudE1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgLCBvciBzZXQgcHJvcGVydHkgdG8gYHRydWVgIHRvIGRpc2FibGUgZXZlbnQgc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIGV2ZW50U2VsZWN0aW9uRGlzYWJsZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgW0V2ZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL2RhdGEvRXZlbnRTdG9yZSkgb3IgYSByZWNvbmZpZ3VyaW5nIG9iamVjdCBmb3IgYSBzdG9yZSB3aGljaCB3aWxsIGhvbGRcbiAgICAgKiB0aGUgZXZlbnRzIHRvIGJlIHJlbmRlcmVkIGludG8gdGhlIENhbGVuZGFyLlxuICAgICAqL1xuICAgIGV2ZW50U3RvcmUgPyA6IEV2ZW50U3RvcmV8RXZlbnRTdG9yZUNvbmZpZ1xuICAgIGV4dHJhRGF0YSA/IDogYW55XG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBpcyBzZXQgdG8gYHRydWVgLCB0aGVuIHdoZW4gZGV0ZXJtaW5pbmcgd2hpY2ggYXNzaWduZWQgcmVzb3VyY2Ugb2YgYSBtdWx0aSBhc3NpZ25lZCBldmVudFxuICAgICAqIHRvIHVzZSB0byBjcmVhdGUgdGhlIGV2ZW50IFVJLCB0aGUgZmlyc3QgcmVzb3VyY2Ugd2hpY2ggaXMgc3RpbGwgc2VsZWN0ZWQgaW4gdGhlXG4gICAgICogW3Jlc291cmNlRmlsdGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9TaWRlYmFyI3Byb3BlcnR5LXJlc291cmNlRmlsdGVyKSBpcyB1c2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWZpbHRlckV2ZW50UmVzb3VyY2VzKVxuICAgICAqL1xuICAgIGZpbHRlckV2ZW50UmVzb3VyY2VzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIHdpZGdldCBpcyBhIGNoaWxkIG9mIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYmUgcGFydGljaXBhdGluZyBpbiBhXG4gICAgICogZmxleGJveCBsYXlvdXQuIFRoaXMgY29uZmlnIGFsbG93cyB5b3UgdG8gc2V0IHRoaXMgd2lkZ2V0J3NcbiAgICAgKiBbZmxleF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZsZXgpIHN0eWxlLlxuICAgICAqIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYSBzaW5nbGUgbnVtYmVyIG9yIGEgYCZsdDtmbGV4LWdyb3cmZ3Q7ICZsdDtmbGV4LXNocmluayZndDsgJmx0O2ZsZXgtYmFzaXMmZ3Q7YCBmb3JtYXQgc3RyaW5nLlxuICAgICAqIG51bWVyaWMtb25seSB2YWx1ZXMgYXJlIGludGVycHJldGVkIGFzIHRoZSBgZmxleC1ncm93YCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmbGV4ID8gOiBudW1iZXJ8c3RyaW5nXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBtb3ZlIHRoZSB3aWRnZXQgb3V0IG9mIHRoZSBkb2N1bWVudCBmbG93IGFuZCBwb3NpdGlvbiBpdFxuICAgICAqIGFic29sdXRlbHkgaW4gYnJvd3NlciB2aWV3cG9ydCBzcGFjZS5cbiAgICAgKi9cbiAgICBmbG9hdGluZyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZyBvYmplY3Qgb2YgYSBmb290ZXIuIE1heSBjb250YWluIGEgYGRvY2tgLCBgaHRtbGAgYW5kIGEgYGNsc2AgcHJvcGVydHkuIEEgZm9vdGVyIGlzIG5vdCBhIHdpZGdldCxcbiAgICAgKiBidXQgcmF0aGVyIHBsYWluIEhUTUwgdGhhdCBmb2xsb3dzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBhbmVsJ3MgYm9keSBhbmQgW3N0cmlwc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctc3RyaXBzKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1mb290ZXIpXG4gICAgICovXG4gICAgZm9vdGVyID8gOiB7XG4gICAgICAgIGRvY2s/OiAndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnc3RhcnQnfCdlbmQnXG4gICAgICAgIGh0bWw/OiBzdHJpbmdcbiAgICAgICAgY2xzPzogc3RyaW5nXG4gICAgfXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZyBbb2JqZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI3R5cGVkZWYtUGFuZWxIZWFkZXIpIGZvciB0aGUgcGFuZWwncyBoZWFkZXIgb3IgYSBzdHJpbmcgaW4gcGxhY2Ugb2YgYSBgdGl0bGVgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWhlYWRlcilcbiAgICAgKi9cbiAgICBoZWFkZXIgPyA6IHN0cmluZ3xib29sZWFufFBhbmVsSGVhZGVyXG4gICAgLyoqXG4gICAgICogV2lkZ2V0J3MgaGVpZ2h0LCB1c2VkIHRvIHNldCBlbGVtZW50IGBzdHlsZS5oZWlnaHRgLiBFaXRoZXIgc3BlY2lmeSBhIHZhbGlkIGhlaWdodCBzdHJpbmcgb3IgYSBudW1iZXIsXG4gICAgICogd2hpY2ggd2lsbCBnZXQgJ3B4JyBhcHBlbmRlZC4gV2UgcmVjb21tZW5kIHVzaW5nIENTUyBhcyB0aGUgcHJpbWFyeSB3YXkgdG8gY29udHJvbCBoZWlnaHQsIGJ1dCBpbiBzb21lXG4gICAgICogY2FzZXMgdGhpcyBjb25maWcgaXMgY29udmVuaWVudC5cbiAgICAgKi9cbiAgICBoZWlnaHQgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgd2l0aCB0cnVlIHRvIG1ha2Ugd2lkZ2V0IGluaXRpYWxseSBoaWRkZW4uXG4gICAgICovXG4gICAgaGlkZGVuID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1oaWRlQW5pbWF0aW9uKVxuICAgICAqL1xuICAgIGhpZGVBbmltYXRpb24gPyA6IGJvb2xlYW58b2JqZWN0XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBoaWRlIFtub25Xb3JraW5nRGF5c10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1ub25Xb3JraW5nRGF5cykgZm9yIGVhY2ggY2FsZW5kYXIgdmlld1xuICAgICAqL1xuICAgIGhpZGVOb25Xb3JraW5nRGF5cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYHRydWVgIHRvIG1ha2UgdGhpcyBjb250YWluZXIgaGlkZSB3aGVuIGl0IGhhcyBubyB2aXNpYmxlIGNoaWxkcmVuIChFaXRoZXIgZW1wdHlcbiAgICAgKiBvciBhbGwgY2hpbGRyZW4gaGlkZGVuKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1oaWRlV2hlbkVtcHR5KVxuICAgICAqL1xuICAgIGhpZGVXaGVuRW1wdHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgdGhpcyBhcyBgdHJ1ZWAgdG8gbWFrZSBwaWNraW5nIGEgZGF0ZSBpbiB0aGUgW3NpZGViYXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctc2lkZWJhciknc1xuICAgICAqIGRhdGUgcGlja2VyIGhpZ2hsaWdodCB0aGUgZGF0ZSBjZWxsIGluIHRoZSBhY3RpdmUgdmlldy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1oaWdobGlnaHREYXRlKVxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSBDZWxsIGRhdGVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgdG8gbWFrZSBwaWNraW5nIGEgZGF0ZSBpbiBhIGRhdGUgcGlja2VyXG4gICAgICovXG4gICAgaGlnaGxpZ2h0RGF0ZSA/IDogYm9vbGVhbnwoKGRhdGU6IERhdGUpID0+IGJvb2xlYW4pXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCwgb3Igc2V0IHByb3BlcnR5IHRvIGB0cnVlYCB0byBoaWdobGlnaHQgZGVwZW5kZW50IGV2ZW50cyBhcyB3ZWxsIHdoZW4gc2VsZWN0aW5nIGFuIGV2ZW50LlxuICAgICAqL1xuICAgIGhpZ2hsaWdodFByZWRlY2Vzc29ycyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAsIG9yIHNldCBwcm9wZXJ0eSB0byBgdHJ1ZWAgdG8gaGlnaGxpZ2h0IGRlcGVuZGVudCBldmVudHMgYXMgd2VsbCB3aGVuIHNlbGVjdGluZyBhbiBldmVudC5cbiAgICAgKi9cbiAgICBoaWdobGlnaHRTdWNjZXNzb3JzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQW4gaWNvbiB0byBzaG93IGJlZm9yZSB0aGUgW3RpdGxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy10aXRsZSkuIEVpdGhlciBwYXNzIGEgQ1NTIGNsYXNzIGFzIGEgc3RyaW5nLCBvciBwYXNzIGFcbiAgICAgKiBbRG9tQ29uZmlnXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvaGVscGVyL0RvbUhlbHBlciN0eXBlZGVmLURvbUNvbmZpZykgb2JqZWN0IGRlc2NyaWJpbmcgYW4gZWxlbWVudCB0byByZXByZXNlbnQgdGhlIGljb24uXG4gICAgICovXG4gICAgaWNvbiA/IDogc3RyaW5nfERvbUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFdpZGdldCBpZCwgaWYgbm90IHNwZWNpZmllZCBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQuIEFsc28gdXNlZCBmb3IgbG9va3VwcyB0aHJvdWdoIFdpZGdldC5nZXRCeUlkXG4gICAgICovXG4gICAgaWQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIHdpZGdldHMgcmVhZC1vbmx5IHN0YXRlIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IGl0cyBwYXJlbnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctaWdub3JlUGFyZW50UmVhZE9ubHkpXG4gICAgICovXG4gICAgaWdub3JlUGFyZW50UmVhZE9ubHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIHNob3cgdGhlIFwiV2Vla2VuZHNcIiB0b2dnbGUgYnV0dG9uIG9mIHRoZSBtb2RlIHNlbGVjdG9yLiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNvbmZpZ1xuICAgICAqIGNhbiBiZSBhIFtCdXR0b25dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQnV0dG9uKSBjb25maWcgb2JqZWN0IHRvIGNvbmZpZ3VyZSB0aGUgYnV0dG9uLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWluY2x1ZGVXZWVrZW5kc0J1dHRvbilcbiAgICAgKi9cbiAgICBpbmNsdWRlV2Vla2VuZHNCdXR0b24gPyA6IGJvb2xlYW58QnV0dG9uQ29uZmlnXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byBhbGlnbiBpbnB1dCBmaWVsZHMgb2YgY2hpbGQgd2lkZ2V0cy4gQnkgZGVmYXVsdCwgdGhlIEZpZWxkIGlucHV0IGVsZW1lbnQgaXNcbiAgICAgKiBwbGFjZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBgbGFiZWxgLiBJZiB5b3UgcHJlZmVyIHRvIGhhdmUgYWxsIGlucHV0IGZpZWxkcyBhbGlnbmVkIHRvIHRoZVxuICAgICAqIHJpZ2h0LCBzZXQgdGhpcyBjb25maWcgdG8gYCdlbmQnYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1pbnB1dEZpZWxkQWxpZ24pXG4gICAgICovXG4gICAgaW5wdXRGaWVsZEFsaWduID8gOiAnc3RhcnQnfCdlbmQnXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gaW5zZXJ0IHRoaXMgd2lkZ2V0IGJlZm9yZS4gSWYgcHJvdmlkZWQsIFthcHBlbmRUb10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgaXMgaWdub3JlZC5cbiAgICAgKi9cbiAgICBpbnNlcnRCZWZvcmUgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIGVsZW1lbnQgaWQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCBlbGVtZW50IHRvLCBhcyBhIGZpcnN0IGNoaWxkLiBJZiBwcm92aWRlZCwgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGluc2VydEZpcnN0ID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIHRlbXBsYXRlIG1ldGhvZCAoZW1wdHkgYnkgZGVmYXVsdCkgYWxsb3dpbmcgeW91IHRvIGNvbnRyb2wgaWYgYW4gZXZlbnQgY2FuIGJlIHNlbGVjdGVkIG9yIG5vdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1pc0V2ZW50U2VsZWN0YWJsZSlcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudCBUaGUgZXZlbnQgcmVjb3JkXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgZXZlbnQgY2FuIGJlIHNlbGVjdGVkLCBvdGhlcndpc2UgZmFsc2VcbiAgICAgKi9cbiAgICBpc0V2ZW50U2VsZWN0YWJsZSA/IDogKGV2ZW50OiBFdmVudE1vZGVsKSA9PiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQW4gb3B0aW9uYWwgQ1NTIGNsYXNzIHRvIGFkZCB0byBjaGlsZCBpdGVtcyBvZiB0aGlzIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBpdGVtQ2xzID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgY2hpbGQgaXRlbXMgb2YgdGhlIENhbGVuZGFyIHZpZXcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctaXRlbXMpXG4gICAgICovXG4gICAgaXRlbXMgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGtleSBzaG9ydGN1dHMgZm9yIHRoZSBDYWxlbmRhci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1rZXlNYXApXG4gICAgICovXG4gICAga2V5TWFwID8gOiBSZWNvcmQ8c3RyaW5nLCBLZXlNYXBDb25maWc+XG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byB1c2Ugc2FtZSBsYWJlbCBwbGFjZW1lbnQgb24gYWxsIGNoaWxkIHdpZGdldHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbGFiZWxQb3NpdGlvbilcbiAgICAgKi9cbiAgICBsYWJlbFBvc2l0aW9uID8gOiAnYmVmb3JlJ3wnYWJvdmUnfCdhbGlnbi1iZWZvcmUnfCdhdXRvJ3xudWxsXG4gICAgLyoqXG4gICAgICogVGhlIHNob3J0IG5hbWUgb2YgYSBoZWxwZXIgY2xhc3Mgd2hpY2ggbWFuYWdlcyByZW5kZXJpbmcgYW5kIHN0eWxpbmcgb2YgY2hpbGQgaXRlbXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbGF5b3V0KVxuICAgICAqL1xuICAgIGxheW91dCA/IDogc3RyaW5nfENhbGVuZGFyQ29udGFpbmVyTGF5b3V0Q29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIENTUyBzdHlsZSBwcm9wZXJ0aWVzIHRvIGFwcGx5IHRvIHRoZSBbY29udGVudEVsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWNvbnRlbnRFbGVtZW50KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1sYXlvdXRTdHlsZSlcbiAgICAgKi9cbiAgICBsYXlvdXRTdHlsZSA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgW2NoaWxkIGl0ZW1dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI2NvbmZpZy1pdGVtcykgKmNvbmZpZyBvYmplY3RzKiB3aGljaCBpcyB0byBiZSBjb252ZXJ0ZWQgaW50b1xuICAgICAqIGluc3RhbmNlcyBvbmx5IHdoZW4gdGhpcyBDb250YWluZXIgaXMgcmVuZGVyZWQsIHJhdGhlciB0aGFuIGVhZ2VybHkgYXQgY29uc3RydWN0IHRpbWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbGF6eUl0ZW1zKVxuICAgICAqL1xuICAgIGxhenlJdGVtcyA/IDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPnxDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWdbXXxXaWRnZXRbXVxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0ZW5lciBzZXQgZm9yIHRoaXMgb2JqZWN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWxpc3RlbmVycylcbiAgICAgKi9cbiAgICBsaXN0ZW5lcnMgPyA6IENhbGVuZGFyTGlzdGVuZXJzXG4gICAgLyoqXG4gICAgICogQSBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LCBvciBhIG1lc3NhZ2UgdG8gYmUgc2hvd24gd2hlbiBhIHN0b3JlIGlzIHBlcmZvcm1pbmcgYSByZW1vdGVcbiAgICAgKiBvcGVyYXRpb24sIG9yIENydWQgTWFuYWdlciBpcyBsb2FkaW5nIGRhdGEgZnJvbSB0aGUgc2V2ZXIuIFNldCB0byBgbnVsbGAgdG8gZGlzYWJsZSBkZWZhdWx0IGxvYWQgbWFzay5cbiAgICAgKi9cbiAgICBsb2FkTWFzayA/IDogc3RyaW5nfE1hc2tDb25maWd8bnVsbFxuICAgIC8qKlxuICAgICAqIEEgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY29uZmlnIG9iamVjdCB0byBhZGp1c3QgdGhlIFttYXNrRGVmYXVsdHNdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1hc2tEZWZhdWx0cylcbiAgICAgKiB3aGVuIGRhdGEgaXMgbG9hZGluZy4gVGhlIG1lc3NhZ2UgYW5kIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGVcbiAgICAgKiBbbG9hZE1hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9taXhpbi9Mb2FkTWFza2FibGUjY29uZmlnLWxvYWRNYXNrKSBjb25maWcgdGFrZSBwcmlvcml0eSBvdmVyIHRoZXNlIG9wdGlvbnMsIGp1c3QgYXMgdGhleSBkb1xuICAgICAqIGZvciBgbWFza0RlZmF1bHRzYCwgcmVzcGVjdGl2ZWx5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWxvYWRNYXNrRGVmYXVsdHMpXG4gICAgICovXG4gICAgbG9hZE1hc2tEZWZhdWx0cyA/IDogTWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY29uZmlnIG9iamVjdCB0byBhZGp1c3QgdGhlIFttYXNrRGVmYXVsdHNdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1hc2tEZWZhdWx0cylcbiAgICAgKiB3aGVuIGFuIGVycm9yIG9jY3VycyBsb2FkaW5nIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbG9hZE1hc2tFcnJvcilcbiAgICAgKi9cbiAgICBsb2FkTWFza0Vycm9yID8gOiBNYXNrQ29uZmlnfE1hc2t8Ym9vbGVhblxuICAgIC8qKlxuICAgICAqIEEgY2xhc3MgdHJhbnNsYXRpb25zIG9mIHdoaWNoIGFyZSB1c2VkIGZvciB0cmFuc2xhdGluZyB0aGlzIGVudGl0eS5cbiAgICAgKiBUaGlzIGlzIG9mdGVuIHVzZWQgd2hlbiB0cmFuc2xhdGlvbnMgb2YgYW4gaXRlbSBhcmUgZGVmaW5lZCBvbiBpdHMgY29udGFpbmVyIGNsYXNzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWxvY2FsZUNsYXNzKVxuICAgICAqL1xuICAgIGxvY2FsZUNsYXNzID8gOiB0eXBlb2YgQmFzZVxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIGRpc2FibGUgbG9jYWxpemF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgICAqL1xuICAgIGxvY2FsaXphYmxlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBwcm9wZXJ0aWVzIHdoaWNoIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNsYXRlZCBhdXRvbWF0aWNhbGx5IHVwb24gYSBsb2NhbGUgYXBwbHlpbmcuXG4gICAgICogSW4gY2FzZSB0aGVyZSBpcyBhIG5lZWQgdG8gbG9jYWxpemUgbm90IHR5cGljYWwgdmFsdWUgKG5vdCBhIFN0cmluZyB2YWx1ZSBvciBhIGZpZWxkIHdpdGggcmUtZGVmaW5lZCBzZXR0ZXIvZ2V0dGVyKSxcbiAgICAgKiB5b3UgY291bGQgdXNlICdsb2NhbGVLZXknIG1ldGEgY29uZmlndXJhdGlvbi5cbiAgICAgKiBFeGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWxvY2FsaXphYmxlUHJvcGVydGllcylcbiAgICAgKi9cbiAgICBsb2NhbGl6YWJsZVByb3BlcnRpZXMgPyA6IHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgU2NoZWR1bGVyIHNob3VsZCBwcmVzZXJ2ZSBpdHMgc2VsZWN0aW9uIG9mIGV2ZW50cyB3aGVuIGxvYWRpbmcgYSBuZXcgZGF0YXNldFxuICAgICAqIChpZiBzZWxlY3RlZCBldmVudCBpZHMgYXJlIGluY2x1ZGVkIGluIHRoZSBuZXdseSBsb2FkZWQgZGF0YXNldCkuXG4gICAgICovXG4gICAgbWFpbnRhaW5TZWxlY3Rpb25PbkRhdGFzZXRDaGFuZ2UgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaWRnZXQncyBtYXJnaW4uIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYSBzaW5nbGUgbnVtYmVyIG9yIGEgYFRSQkxgIGZvcm1hdCBzdHJpbmcuXG4gICAgICogbnVtZXJpYy1vbmx5IHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgcGl4ZWxzLlxuICAgICAqL1xuICAgIG1hcmdpbiA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgY29uZmlnIG9iamVjdCBjb250YWlucyB0aGUgZGVmYXVsdHMgZm9yIHRoZSBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjcmVhdGVkIGZvciB0aGVcbiAgICAgKiBbbWFza2VkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctbWFza2VkKSBjb25maWcuIEFueSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBpbiB0aGUgYG1hc2tlZGAgY29uZmlnIHdpbGwgb3ZlcnJpZGUgdGhlc2VcbiAgICAgKiB2YWx1ZXMuXG4gICAgICovXG4gICAgbWFza0RlZmF1bHRzID8gOiBNYXNrQ29uZmlnXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBhcHBseSB0aGUgZGVmYXVsdCBtYXNrIHRvIHRoZSB3aWRnZXQuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIHRoZSBtYXNrIG1lc3NhZ2Ugb3IgYVxuICAgICAqIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L01hc2spIGNvbmZpZyBvYmplY3QuXG4gICAgICovXG4gICAgbWFza2VkID8gOiBib29sZWFufHN0cmluZ3xNYXNrQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gZGF0ZSB0byB3aGljaCB0aGUgYGVuZERhdGVgIG9mIGFueSBjaGlsZCB2aWV3IG1heSBiZSBuYXZpZ2F0ZWQuXG4gICAgICovXG4gICAgbWF4RGF0ZSA/IDogRGF0ZXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudCdzIG1heEhlaWdodC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFtoZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1oZWlnaHQpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtYXhIZWlnaHQgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLW1heGltaXplT25Nb2JpbGUpXG4gICAgICovXG4gICAgbWF4aW1pemVPbk1vYmlsZSA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50cyBtYXhXaWR0aC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFt3aWR0aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXdpZHRoKSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWF4V2lkdGggPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBkYXRlIHRvIHdoaWNoIHRoZSBgc3RhcnREYXRlYCBvZiBhbnkgY2hpbGQgdmlldyBtYXkgYmUgbmF2aWdhdGVkLlxuICAgICAqL1xuICAgIG1pbkRhdGUgPyA6IERhdGV8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnQncyBtaW5IZWlnaHQuIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbaGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaGVpZ2h0KSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWluSGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnRzIG1pbldpZHRoLiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW3dpZHRoXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctd2lkdGgpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtaW5XaWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFdoaWNoIG9mIHRoZSBidWlsdC1pbiBbbW9kZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbW9kZXMpIHNob3VsZCBiZSB0aGUgaW5pdGlhbGx5IGFjdGl2ZSB2aWV3LlxuICAgICAqL1xuICAgIG1vZGUgPyA6ICdhZ2VuZGEnfCd5ZWFyJ3wnbW9udGgnfCd3ZWVrJ3wnZGF5J3wnbGlzdCd8J3Jlc291cmNlJ3wnZGF5cmVzb3VyY2UnfCdkYXlhZ2VuZGEnfCdtb250aGFnZW5kYSd8J21vbnRoZ3JpZCd8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHRvIHVzZSB0byBjb25maWd1cmUgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBbbW9kZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbW9kZXMpIHByaW9yIHRvIHRoZWlyIGNvbnN0cnVjdGlvbi5cbiAgICAgKi9cbiAgICBtb2RlRGVmYXVsdHMgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIHZpZXcgbW9kZXMgd2hpY2ggYXJlIHRvIGJlIGF2YWlsYWJsZSBpbiB0aGlzIENhbGVuZGFyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLW1vZGVzKVxuICAgICAqL1xuICAgIG1vZGVzID8gOiB7XG4gICAgICAgIFttb2RlOiBzdHJpbmddOiBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8Ym9vbGVhbnxudWxsfHVuZGVmaW5lZFxuICAgICAgICBhZ2VuZGE/OiBBZ2VuZGFWaWV3Q29uZmlnfGJvb2xlYW58bnVsbFxuICAgICAgICB5ZWFyPzogWWVhclZpZXdDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgICAgIG1vbnRoPzogTW9udGhWaWV3Q29uZmlnfGJvb2xlYW58bnVsbFxuICAgICAgICB3ZWVrPzogV2Vla1ZpZXdDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgICAgIGRheT86IERheVZpZXdDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgICAgIGxpc3Q/OiBFdmVudExpc3RDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgICAgIHJlc291cmNlPzogUmVzb3VyY2VWaWV3Q29uZmlnfGJvb2xlYW58bnVsbFxuICAgICAgICBkYXlyZXNvdXJjZXZpZXc/OiBEYXlSZXNvdXJjZVZpZXdDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgICAgIGRheWFnZW5kYT86IERheUFnZW5kYVZpZXdDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgICAgIG1vbnRoYWdlbmRhPzogTW9udGhBZ2VuZGFWaWV3Q29uZmlnfGJvb2xlYW58bnVsbFxuICAgICAgICBtb250aGdyaWQ/OiBNb250aEdyaWRDb25maWd8Ym9vbGVhbnxudWxsXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBpcyBjb25maWd1cmVkIGFzIGB0cnVlYCBhIFtSZXNpemVPYnNlcnZlcl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1Jlc2l6ZU9ic2VydmVyKVxuICAgICAqIGlzIHVzZWQgdG8gbW9uaXRvciB0aGlzIGVsZW1lbnQgZm9yIHNpemUgY2hhbmdlcyBjYXVzZWQgYnkgZWl0aGVyIHN0eWxlIG1hbmlwdWxhdGlvbiwgb3IgYnkgQ1NTXG4gICAgICogbGF5b3V0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLW1vbml0b3JSZXNpemUpXG4gICAgICovXG4gICAgbW9uaXRvclJlc2l6ZSA/IDogYm9vbGVhbnx7XG4gICAgICAgIGltbWVkaWF0ZT86IGJvb2xlYW5cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBhbGxvdyBgQ1RSTC9DTUQrY2xpY2tgIHRvIHNlbGVjdCBtdWx0aXBsZSBldmVudHMgaW4gdGhlIHNjaGVkdWxlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1tdWx0aUV2ZW50U2VsZWN0KVxuICAgICAqL1xuICAgIG11bHRpRXZlbnRTZWxlY3QgPyA6IGJvb2xlYW58e1xuICAgICAgICBjdHJsS2V5PzogYm9vbGVhblxuICAgICAgICBhbHRLZXk/OiBib29sZWFuXG4gICAgICAgIHNoaWZ0S2V5PzogYm9vbGVhblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBkZWZhdWx0IGNvbmZpZyBvYmplY3RzIHdoaWNoIG1heSBiZSByZWZlcmVuY2VkIGJ5IG5hbWUgaW4gdGhlIFtpdGVtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjY29uZmlnLWl0ZW1zKVxuICAgICAqIGNvbmZpZy4gRm9yIGV4YW1wbGUsIGEgc3BlY2lhbGl6ZWQgW01lbnVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWVudSkgc3ViY2xhc3MgbWF5IGhhdmUgYSBgbmFtZWRJdGVtc2AgZGVmYXVsdFxuICAgICAqIHZhbHVlIGRlZmluZWQgbGlrZSB0aGlzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLW5hbWVkSXRlbXMpXG4gICAgICovXG4gICAgbmFtZWRJdGVtcyA/IDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPlxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGVyZSB0aGUgTmV4dC9QcmV2aW91cy9Ub2RheSBidXR0b25zIHNob3VsZCBiZSBwbGFjZWQuXG4gICAgICovXG4gICAgbmF2aWdhdG9yUGxhY2VtZW50ID8gOiAndG9vbGJhcid8J3NpZGViYXInXG4gICAgLyoqXG4gICAgICogTm9uLXdvcmtpbmcgZGF5cyBhcyBhbiBvYmplY3Qgd2hlcmUga2V5cyBhcmUgZGF5IGluZGljZXMsIDAtNiAoU3VuZGF5LVNhdHVyZGF5KSwgYW5kIHRoZSB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctbm9uV29ya2luZ0RheXMpXG4gICAgICovXG4gICAgbm9uV29ya2luZ0RheXMgPyA6IFJlY29yZDxudW1iZXIsIGJvb2xlYW4+XG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIFtzaWRlYmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjcHJvcGVydHktc2lkZWJhcikgZXhwYW5kcyBhbmQgY29sbGFwc2VzIHRha2luZyB3aWR0aCBmcm9tIHRoZVxuICAgICAqIGNhbGVuZGFyIFVJLiBDb25maWd1cmUgYG92ZXJsYXlTaWRlYmFyYCBhcyBgdHJ1ZWAgdG8gaGF2ZSBpdCBzdGFydCBjb2xsYXBzZWQsIGFuZCB0aGVuXG4gICAgICogPHN0cm9uZz5vdmVybGF5PC9zdHJvbmc+IHRoZSBjYWxlbmRhciBVSSB3aGVuIHRoZSBleHBhbmQvY29sbGFwc2UgYnV0dG9uIGlzIHRvZ2dsZWQuXG4gICAgICovXG4gICAgb3ZlcmxheVNpZGViYXIgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgb3duaW5nIFdpZGdldCBvZiB0aGlzIFdpZGdldC4gSWYgdGhpcyBXaWRnZXQgaXMgZGlyZWN0bHkgY29udGFpbmVkICh0aGF0IGlzLCBpdCBpcyBvbmUgb2YgdGhlXG4gICAgICogW2l0ZW1zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciNwcm9wZXJ0eS1pdGVtcykgb2YgYSBDb250YWluZXIpLCB0aGlzIGNvbmZpZyB3aWxsIGJlIGlnbm9yZWQuIEluIHRoaXMgY2FzZVxuICAgICAqIHRoZSBvd25lciBpcyA8c3Ryb25nPmFsd2F5czwvc3Ryb25nPiB0aGUgZW5jYXBzdWxhdGluZyBDb250YWluZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctb3duZXIpXG4gICAgICovXG4gICAgb3duZXIgPyA6IFdpZGdldHxhbnlcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHdoZW4gYSB3aWRnZXQgaXMgcmVuZGVyZWQgaW50byBhbm90aGVyIHdpZGdldCdzIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktY29udGVudEVsZW1lbnQpLCBidXQgbXVzdFxuICAgICAqIG5vdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgc3RhbmRhcmQgbGF5b3V0IG9mIHRoYXQgd2lkZ2V0LCBhbmQgbXVzdCBiZSBwb3NpdGlvbmVkIHJlbGF0aXZlbHkgdG8gdGhhdFxuICAgICAqIHdpZGdldCdzIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktY29udGVudEVsZW1lbnQpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXBvc2l0aW9uZWQpXG4gICAgICovXG4gICAgcG9zaXRpb25lZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFByZXZlbnQgdG9vbHRpcCBmcm9tIGJlaW5nIGRpc3BsYXllZCBvbiB0b3VjaCBkZXZpY2VzLiBVc2VmdWwgZm9yIGV4YW1wbGUgZm9yIGJ1dHRvbnMgdGhhdCBkaXNwbGF5IGFcbiAgICAgKiBtZW51IG9uIGNsaWNrIGV0Yywgc2luY2UgdGhlIHRvb2x0aXAgd291bGQgYmUgZGlzcGxheWVkIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgICovXG4gICAgcHJldmVudFRvb2x0aXBPblRvdWNoID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBbUHJvamVjdE1vZGVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwpIGluc3RhbmNlIG9yIGEgY29uZmlnIG9iamVjdC4gVGhlIHByb2plY3QgaG9sZHMgYWxsIFNjaGVkdWxlciBkYXRhLlxuICAgICAqIENhbiBiZSBvbWl0dGVkIGluIGZhdm9yIG9mIGluZGl2aWR1YWwgc3RvcmUgY29uZmlncyBvciBbY3J1ZE1hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vU2NoZWR1bGVyU3RvcmVzI2NvbmZpZy1jcnVkTWFuYWdlcikgY29uZmlnLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXByb2plY3QpXG4gICAgICovXG4gICAgcHJvamVjdCA/IDogUHJvamVjdE1vZGVsfFByb2plY3RNb2RlbENvbmZpZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZXMgb2YgcHJvcGVydGllcyB3aGljaCBhcmUgcHJvcGFnYXRlZCBkb3duIGZyb20gdGhlIENhbGVuZGFyIHRvIGNoaWxkIHZpZXdzXG4gICAgICogdW5sZXNzIHRoZSB2aWV3IGhhcyBpdHMgb3duIHZhbHVlIGZvciB0aGF0IHByb3BlcnR5LlxuICAgICAqL1xuICAgIHByb3BhZ2F0ZWRDb25maWdzID8gOiBzdHJpbmdbXVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gbWFrZSB0aGUgY2FsZW5kYXIgcmVhZC1vbmx5LCBieSBkaXNhYmxpbmcgYW55IFVJcyBmb3IgbW9kaWZ5aW5nIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctcmVhZE9ubHkpXG4gICAgICovXG4gICAgcmVhZE9ubHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgY29uZmlybWF0aW9uIGRpYWxvZyBzaG93biB3aGVuIGEgcmVjdXJyaW5nIGV2ZW50IGlzIGVkaXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1yZWN1cnJlbmNlQ29uZmlybWF0aW9uUG9wdXApXG4gICAgICovXG4gICAgcmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwID8gOiBSZWN1cnJlbmNlQ29uZmlybWF0aW9uUG9wdXBDb25maWd8UmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwXG4gICAgcmVsYXlTdG9yZUV2ZW50cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIGRlZmF1bHQgYHJlbmRpdGlvbmAgdG8gYXBwbHkgdG8gYWxsIGNoaWxkIHdpZGdldHMsIG9yIGEgbWFwIG9mIHJlbmRpdGlvbnMga2V5ZWQgYnkgY2hpbGQgd2lkZ2V0XG4gICAgICogYHR5cGVgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXJlbmRpdGlvbilcbiAgICAgKi9cbiAgICByZW5kaXRpb24gPyA6IHN0cmluZ3xSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fG51bGxcbiAgICAvKipcbiAgICAgKiBQYXRoIHRvIGxvYWQgcmVzb3VyY2UgaW1hZ2VzIGZyb20uIFVzZWQgYnkgdGhlIHJlc291cmNlIGhlYWRlcnMgaW4gUmVzb3VyY2VWaWV3IGFuZCBieVxuICAgICAqIFtzaG93UmVzb3VyY2VBdmF0YXJzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1zaG93UmVzb3VyY2VBdmF0YXJzKSBpbiBldmVudC1kaXNwbGF5aW5nXG4gICAgICogbW9kZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctcmVzb3VyY2VJbWFnZVBhdGgpXG4gICAgICovXG4gICAgcmVzb3VyY2VJbWFnZVBhdGggPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIElubGluZSByZXNvdXJjZXMsIHdpbGwgYmUgbG9hZGVkIGludG8gdGhlIFtyZXNvdXJjZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL21peGluL0NhbGVuZGFyU3RvcmVzI3Byb3BlcnR5LXJlc291cmNlU3RvcmUpLlxuICAgICAqL1xuICAgIHJlc291cmNlcyA/IDogUmVzb3VyY2VNb2RlbFtdfFJlc291cmNlTW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBbUmVzb3VyY2VTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9TY2hlZHVsZXIvZGF0YS9SZXNvdXJjZVN0b3JlKSBvciBhIHJlY29uZmlndXJpbmcgb2JqZWN0IGZvciBhIHN0b3JlIHdoaWNoIHdpbGwgaG9sZCB0aGUgcmVzb3VyY2VzIHRvIGJlIHJlbmRlcmVkIGludG8gdGhlIENhbGVuZGFyLlxuICAgICAqL1xuICAgIHJlc291cmNlU3RvcmUgPyA6IFJlc291cmNlU3RvcmV8UmVzb3VyY2VTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIElubGluZSByZXNvdXJjZSB0aW1lIHJhbmdlcywgd2lsbCBiZSBsb2FkZWQgaW50byBbcmVzb3VyY2VUaW1lUmFuZ2VTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9taXhpbi9DYWxlbmRhclN0b3JlcyNwcm9wZXJ0eS1yZXNvdXJjZVRpbWVSYW5nZVN0b3JlKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1yZXNvdXJjZVRpbWVSYW5nZXMpXG4gICAgICovXG4gICAgcmVzb3VyY2VUaW1lUmFuZ2VzID8gOiBSZXNvdXJjZVRpbWVSYW5nZU1vZGVsW118UmVzb3VyY2VUaW1lUmFuZ2VNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIFtSZXNvdXJjZVRpbWVSYW5nZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9kYXRhL1Jlc291cmNlVGltZVJhbmdlU3RvcmUpIG9yIGEgcmVjb25maWd1cmluZyBvYmplY3QgZm9yIGEgc3RvcmUgd2hpY2ggd2lsbCBob2xkIHJlc291cmNlIHRpbWUgcmFuZ2VzLlxuICAgICAqIFRoZXNlIG1heSBiZSB1c2VkIGJ5IHRoZSBbVGltZVJhbmdlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL1RpbWVSYW5nZXMpIGZlYXR1cmUuXG4gICAgICovXG4gICAgcmVzb3VyY2VUaW1lUmFuZ2VTdG9yZSA/IDogUmVzb3VyY2VUaW1lUmFuZ2VTdG9yZXxSZXNvdXJjZVRpbWVSYW5nZVN0b3JlQ29uZmlnXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSB2YXJpb3VzIHJlc3BvbnNpdmUgc3RhdGUgb2JqZWN0cyBrZXllZCBieSB0aGVpciBuYW1lLiBFYWNoIGtleSAoZXhjZXB0IGAnKidgLCBzZWUgYmVsb3cpIGluXG4gICAgICogdGhpcyBvYmplY3QgaXMgYSBzdGF0ZSBuYW1lIChzZWUgW3Jlc3BvbnNpdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlU3RhdGUpKSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgdGhlXG4gICAgICogYXNzb2NpYXRlZCBbUmVzcG9uc2l2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjdHlwZWRlZi1SZXNwb25zaXZlU3RhdGUpIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1yZXNwb25zaXZlKVxuICAgICAqL1xuICAgIHJlc3BvbnNpdmUgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gbWFyayB0aGlzIGluc3RhbmNlIGFzIHRoZSBkZWZhdWx0IFtyZXNwb25zaXZlVGFyZ2V0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVUYXJnZXQpIGZvciBkZXNjZW5kYW50cyB0aGF0IGRvXG4gICAgICogbm90IHNwZWNpZnkgYW4gZXhwbGljaXQgW3Jlc3BvbnNpdmVUYXJnZXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVRhcmdldCkgb2YgdGhlaXIgb3duLlxuICAgICAqL1xuICAgIHJlc3BvbnNpdmVSb290ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgW3Jlc3BvbnNpdmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZSkgY29uZmlnLiBUaGlzIGlzIGFzc2lnbmVkIGludGVybmFsbHlcbiAgICAgKiBhbmQgc2hvdWxkIG5vdCBiZSBhc3NpZ25lZCBkaXJlY3RseS5cbiAgICAgKi9cbiAgICByZXNwb25zaXZlU3RhdGUgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSB3aWRnZXQgd2hvc2Ugc2l6ZSBhbmQgb3RoZXIgcHJvcGVydGllcyBkcml2ZSB0aGlzIG9iamVjdCdzIHJlc3BvbnNpdmUgYmVoYXZpb3IuIElmIHRoaXMgY29uZmlnIGlzIG5vdFxuICAgICAqIHNwZWNpZmllZCwgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgdGhhdCBzcGVjaWZpZWQgW3Jlc3BvbnNpdmVSb290PXRydWVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVJvb3QpIHdpbGwgYmVcbiAgICAgKiB1c2VkLiBJZiB0aGVyZSBpcyBubyBzdWNoIGFuY2VzdG9yLCB0aGVuIHRoZSBpbnN0YW5jZSB1c2luZyB0aGlzIG1peGluIGlzIHVzZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctcmVzcG9uc2l2ZVRhcmdldClcbiAgICAgKi9cbiAgICByZXNwb25zaXZlVGFyZ2V0ID8gOiBzdHJpbmd8V2lkZ2V0XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBoYXZlIHRoZSBjb21wb25lbnQgZGlzcGxheSBhIHRyYW5zbHVjZW50IHJpcHBsZSB3aGVuIGl0c1xuICAgICAqIFtmb2N1c0VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWZvY3VzRWxlbWVudCksIG9yIFtlbGVtZW50XSgjQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWVsZW1lbnQpIGlzIHRhcHBlZCA8ZW0+aWYgdGhlXG4gICAgICogY3VycmVudCB0aGVtZSBzdXBwb3J0cyByaXBwbGVzPC9lbT4uIE91dCBvZiB0aGUgYm94LCBvbmx5IHRoZSBNYXRlcmlhbCB0aGVtZSBzdXBwb3J0cyByaXBwbGVzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXJpcHBsZSlcbiAgICAgKi9cbiAgICByaXBwbGUgPyA6IGJvb2xlYW58e1xuICAgICAgICBkZWxlZ2F0ZT86IHN0cmluZ1xuICAgICAgICBjb2xvcj86IHN0cmluZ1xuICAgICAgICByYWRpdXM/OiBudW1iZXJcbiAgICAgICAgY2xpcD86IHN0cmluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB5b3UgYXJlIHJlbmRlcmluZyB0aGlzIHdpZGdldCB0byBhIHNoYWRvdyByb290IGluc2lkZSBhIHdlYiBjb21wb25lbnQsIHNldCB0aGlzIGNvbmZpZyB0byB0aGUgc2hhZG93Um9vdC4gSWYgbm90IGluc2lkZSBhIHdlYiBjb21wb25lbnQsIHNldCBpdCB0byBgZG9jdW1lbnQuYm9keWBcbiAgICAgKi9cbiAgICByb290RWxlbWVudCA/IDogU2hhZG93Um9vdHxIVE1MRWxlbWVudFxuICAgIC8qKlxuICAgICAqIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYHRydWVgIHRvIG1ha2UgdGhlIHdpZGdldCdzIGVsZW1lbnQgdXNlIHRoZSBgZGlyZWN0aW9uOnJ0bGAgc3R5bGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctcnRsKVxuICAgICAqL1xuICAgIHJ0bCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIChhbmQgb3B0aW9uYWxseSBpbiB3aGljaCBheGVzKSBhIFdpZGdldCBtYXkgc2Nyb2xsLiBgdHJ1ZWAgbWVhbnMgdGhpcyB3aWRnZXQgbWF5IHNjcm9sbFxuICAgICAqIGluIGJvdGggYXhlcy4gTWF5IGJlIGFuIG9iamVjdCBjb250YWluaW5nIGJvb2xlYW4gYG92ZXJmbG93WGAgYW5kIGBvdmVyZmxvd1lgIHByb3BlcnRpZXMgd2hpY2ggYXJlXG4gICAgICogYXBwbGllZCB0byBDU1Mgc3R5bGUgcHJvcGVydGllcyBgb3ZlcmZsb3dYYCBhbmQgYG92ZXJmbG93WWAuIElmIHRoZXkgYXJlIGJvb2xlYW4sIHRoZXkgYXJlIHRyYW5zbGF0ZWQgdG9cbiAgICAgKiBDU1Mgb3ZlcmZsb3cgcHJvcGVydGllcyB0aHVzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXNjcm9sbGFibGUpXG4gICAgICovXG4gICAgc2Nyb2xsYWJsZSA/IDogYm9vbGVhbnxTY3JvbGxlckNvbmZpZ3xTY3JvbGxlclxuICAgIC8qKlxuICAgICAqIERlZmluZXMgd2hhdCB0byBkbyBpZiBkb2N1bWVudCBpcyBzY3JvbGxlZCB3aGlsZSBXaWRnZXQgaXMgdmlzaWJsZSAob25seSByZWxldmFudCB3aGVuIGZsb2F0aW5nIGlzIHNldCB0byBgdHJ1ZWApLlxuICAgICAqIFZhbGlkIHZhbHVlczogwrRudWxswrQ6IGRvIG5vdGhpbmcsIMK0aGlkZcK0OiBoaWRlIHRoZSB3aWRnZXQgb3IgwrRyZWFsaWduwrQ6IHJlYWxpZ24gdG8gdGhlIHRhcmdldCBpZiBwb3NzaWJsZS5cbiAgICAgKi9cbiAgICBzY3JvbGxBY3Rpb24gPyA6ICdoaWRlJ3wncmVhbGlnbid8bnVsbFxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBzZWxlY3QgdGhlIHJlc291cmNlIG9mIHRoZSBldmVudCB3aGVuIGNsaWNraW5nIGFuIGV2ZW50IGJhci5cbiAgICAgKi9cbiAgICBzZWxlY3RSZXNvdXJjZU9uRXZlbnROYXZpZ2F0ZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBzZWxlY3QgdGhlIHJvdy9yZXNvdXJjZSB3aGVuIGNsaWNraW5nIHRoZSBlbXB0eSBhcmVhIGluIGEgdGltZSBheGlzIGNlbGwuXG4gICAgICovXG4gICAgc2VsZWN0UmVzb3VyY2VPblNjaGVkdWxlQ2xpY2sgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXNob3dBbmltYXRpb24pXG4gICAgICovXG4gICAgc2hvd0FuaW1hdGlvbiA/IDogYm9vbGVhbnxvYmplY3RcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBoaWRlIHJlY3VycmluZyBmaWVsZHMgaW4gZXZlbnQgZWRpdG9yLCBldmVuIGlmIHRoZVxuICAgICAqIFtSZWN1cnJpbmcgRXZlbnRzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L21peGluL1JlY3VycmluZ0V2ZW50cyNjb25maWctZW5hYmxlUmVjdXJyaW5nRXZlbnRzKSBpcyBgdHJ1ZWBcbiAgICAgKiBhbmQgYSByZWN1cnJpbmcgZXZlbnQgaXMgYmVpbmcgZWRpdGVkLlxuICAgICAqL1xuICAgIHNob3dSZWN1cnJpbmdVSSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBzaG93IHRoZSB0b29sdGlwIHdoZW4gdGhpcyB3aWRnZXQgaXMgW2Rpc2FibGVkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1kaXNhYmxlZClcbiAgICAgKi9cbiAgICBzaG93VG9vbHRpcFdoZW5EaXNhYmxlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGNvbmZpZyBvYmplY3QgdG8gY29uZmlndXJlIHRoZSBbU2lkZWJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvU2lkZWJhcikgd2hpY2ggaXNcbiAgICAgKiBzaG93biBuZXh0IHRvIHRoZSBjYWxlbmRhciB2aWV3cyBzcGVjaWZpZWQgYnkgdGhlIFttb2Rlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1tb2RlcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctc2lkZWJhcilcbiAgICAgKiBAcGFyYW0geydsZWZ0JywncmlnaHQnfSBzaWRlIFdoaWNoIFtzaWRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9TaWRlYmFyI2NvbmZpZy1zaWRlKSB0byBkb2NrIHRvLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gY29sbGFwc2VkIE1heSBiZSBpbml0aWFsbHkgW2NvbGxhcHNlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvU2lkZWJhciNjb25maWctY29sbGFwc2VkKS5cbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZz59IGl0ZW1zIFJlY29uZmlndXJlIG9yIGFkZCB0byB0aGUgc2lkZWJhciBVSS5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ30gaXRlbXMuY3VzdG9tIFNldHRpbmdzIHNwZWNpZmljIHRvIGN1c3RvbSBpdGVtLlxuICAgICAqIEBwYXJhbSB7RGF0ZVBpY2tlckNvbmZpZ30gaXRlbXMuZGF0ZVBpY2tlciBUaGUgW0RhdGVQaWNrZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvRGF0ZVBpY2tlcikgbWF5IGJlIHJlY29uZmlndXJlZCB1c2luZyBhbiBvYmplY3QsIG9yIGNvbmZpZ3VyZWQgYXdheSB1c2luZyBgbnVsbGAuIEl0cyBkZWZhdWx0IFt3ZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13ZWlnaHQpIGlzIDEwMC5cbiAgICAgKiBAcGFyYW0ge1RleHRGaWVsZENvbmZpZ30gaXRlbXMuZXZlbnRGaWx0ZXIgVGhlIGV2ZW50RmlsdGVyIGlzIGEgW1RleHRGaWVsZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9UZXh0RmllbGQpIHdoaWNoIG1heSBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZXZlbnRzIGJ5IG1hdGNoZWQgbmFtZS4gSXQgbWF5IGJlIHJlY29uZmlndXJlZCB1c2luZyBhbiBvYmplY3QsIG9yIGNvbmZpZ3VyZWQgYXdheSB1c2luZyBgbnVsbGAuIEl0cyBkZWZhdWx0IFt3ZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13ZWlnaHQpIGlzIDE1MC5cbiAgICAgKiBAcGFyYW0ge1Jlc291cmNlRmlsdGVyQ29uZmlnfSBpdGVtcy5yZXNvdXJjZUZpbHRlciBUaGUgW1Jlc291cmNlRmlsdGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci93aWRnZXQvUmVzb3VyY2VGaWx0ZXIpIG1heSBiZSByZWNvbmZpZ3VyZWQgdXNpbmcgYW4gb2JqZWN0LCBvciBjb25maWd1cmVkIGF3YXkgdXNpbmcgYG51bGxgLiBJdHMgZGVmYXVsdCBbd2VpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctd2VpZ2h0KSBpcyAyMDAuXG4gICAgICovXG4gICAgc2lkZWJhciA/IDoge3NpZGU/OiAnbGVmdCd8J3JpZ2h0JywgY29sbGFwc2VkPzogYm9vbGVhbiwgaXRlbXM6IHsgW21vZGU6IHN0cmluZ106IENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ3xudWxsfHVuZGVmaW5lZCwgZGF0ZVBpY2tlcj86IERhdGVQaWNrZXJDb25maWcsIGV2ZW50RmlsdGVyPzogVGV4dEZpZWxkQ29uZmlnLCByZXNvdXJjZUZpbHRlcj86IFJlc291cmNlRmlsdGVyQ29uZmlnIH19fGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBQcm9ncmFtbWF0aWMgY29udHJvbCBvdmVyIGhvdyBtYW55IGNvbHVtbnMgdG8gc3BhbiB3aGVuIHVzZWQgaW4gYSBncmlkIGxheW91dC5cbiAgICAgKi9cbiAgICBzcGFuID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGlzIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1zdGF0ZWZ1bClcbiAgICAgKi9cbiAgICBzdGF0ZWZ1bCA/IDogYm9vbGVhbnxvYmplY3R8c3RyaW5nW11cbiAgICAvKipcbiAgICAgKiBUaGUgZXZlbnRzIHRoYXQsIHdoZW4gZmlyZWQgYnkgdGhpcyBjb21wb25lbnQsIHNob3VsZCB0cmlnZ2VyIGl0IHRvIHNhdmUgaXRzIHN0YXRlIGJ5IGNhbGxpbmdcbiAgICAgKiBbc2F2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjZnVuY3Rpb24tc2F2ZVN0YXRlKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy1zdGF0ZWZ1bEV2ZW50cylcbiAgICAgKi9cbiAgICBzdGF0ZWZ1bEV2ZW50cyA/IDogb2JqZWN0fHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGtleSB0byB1c2Ugd2hlbiBzYXZpbmcgdGhpcyBvYmplY3QncyBzdGF0ZSBpbiB0aGUgW3N0YXRlUHJvdmlkZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNjb25maWctc3RhdGVQcm92aWRlcikuIElmIHRoaXMgY29uZmlnIGlzXG4gICAgICogbm90IGFzc2lnbmVkLCBhbmQgW3N0YXRlZnVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjY29uZmlnLXN0YXRlZnVsKSBpcyBub3Qgc2V0IHRvIGBmYWxzZWAsIHRoZSBbaWRdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWlkKVxuICAgICAqIChpZiBleHBsaWNpdGx5IHNwZWNpZmllZCkgd2lsbCBiZSB1c2VkIGFzIHRoZSBgc3RhdGVJZGAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctc3RhdGVJZClcbiAgICAgKi9cbiAgICBzdGF0ZUlkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgYFN0YXRlUHJvdmlkZXJgIHRvIHVzZSB0byBzYXZlIGFuZCByZXN0b3JlIHRoaXMgb2JqZWN0J3MgW3N0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjcHJvcGVydHktc3RhdGUpLiBCeSBkZWZhdWx0LCBgc3RhdGVgXG4gICAgICogd2lsbCBiZSBzYXZlZCB1c2luZyB0aGUgW2RlZmF1bHQgc3RhdGUgcHJvdmlkZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9zdGF0ZS9TdGF0ZVByb3ZpZGVyI3Byb3BlcnR5LWluc3RhbmNlLXN0YXRpYykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctc3RhdGVQcm92aWRlcilcbiAgICAgKi9cbiAgICBzdGF0ZVByb3ZpZGVyID8gOiBTdGF0ZVByb3ZpZGVyXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgdHJ1ZWAgdG8gbWF0Y2ggZmllbGRzIGJ5IHRoZWlyIGBuYW1lYCBwcm9wZXJ0eSBvbmx5IHdoZW4gYXNzaWduaW5nIGEgW3JlY29yZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjY29uZmlnLXJlY29yZCksXG4gICAgICogd2l0aG91dCBmYWxsaW5nIGJhY2sgdG8gYHJlZmAuXG4gICAgICovXG4gICAgc3RyaWN0UmVjb3JkTWFwcGluZyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBjb250YWluaW5nIHdpZGdldHMga2V5ZWQgYnkgbmFtZS4gQnkgZGVmYXVsdCAod2hlbiBubyBgdHlwZWAgaXMgZ2l2ZW4pLCBzdHJpcHMgYXJlXG4gICAgICogW3Rvb2xiYXJzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1Rvb2xiYXIpLiBJZiB5b3Ugd2FudCB0byBwYXNzIGFuIGFycmF5LCB5b3UgY2FuIHVzZVxuICAgICAqIHRoZSB0b29sYmFyJ3MgW2l0ZW1zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciNjb25maWctaXRlbXMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXN0cmlwcylcbiAgICAgKi9cbiAgICBzdHJpcHMgPyA6IFJlY29yZDxzdHJpbmcsIENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZz5cbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L01hc2spIGNvbmZpZyBvYmplY3QsIG9yIGEgbWVzc2FnZSB0byBiZSBzaG93biB3aGVuIENydWQgTWFuYWdlclxuICAgICAqIGlzIHBlcnNpc3RpbmcgY2hhbmdlcyBvbiB0aGUgc2VydmVyLiBTZXQgdG8gYG51bGxgIHRvIGRpc2FibGUgZGVmYXVsdCBzeW5jIG1hc2suXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctc3luY01hc2spXG4gICAgICovXG4gICAgc3luY01hc2sgPyA6IHN0cmluZ3xNYXNrQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBbdGFiXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYikgY3JlYXRlZCBmb3IgdGhpcyB3aWRnZXQgd2hlbiBpdCBpcyBwbGFjZWQgaW4gYVxuICAgICAqIFtUYWJQYW5lbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWJQYW5lbCkuIEZvciBleGFtcGxlLCB0aGlzIGNvbmZpZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBpY29uIG9mIHRoZSBgdGFiYCBmb3JcbiAgICAgKiB0aGlzIHdpZGdldDpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy10YWIpXG4gICAgICovXG4gICAgdGFiID8gOiBib29sZWFufFRhYkNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBjb250YWluZXIgaXMgdXNlZCBhcyBhIHRhYiBpbiBhIFRhYlBhbmVsLCB0aGVzZSBpdGVtcyBhcmUgYWRkZWQgdG8gdGhlXG4gICAgICogW1RhYkJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWJCYXIpIHdoZW4gdGhpcyBjb250YWluZXIgaXMgdGhlIGFjdGl2ZSB0YWIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctdGFiQmFySXRlbXMpXG4gICAgICovXG4gICAgdGFiQmFySXRlbXMgPyA6IFRvb2xiYXJJdGVtc1tdfFdpZGdldFtdXG4gICAgLyoqXG4gICAgICogVGhlIHRhZyBuYW1lIG9mIHRoaXMgV2lkZ2V0J3Mgcm9vdCBlbGVtZW50XG4gICAgICovXG4gICAgdGFnID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZyBvYmplY3QgY29udGFpbmluZyBkZWZpbml0aW9ucyBvZiB0aGUgdG9vbGJhciBvZiB0aGUgQ2FsZW5kYXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctdGJhcilcbiAgICAgKi9cbiAgICB0YmFyID8gOiAoQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfENhbGVuZGFyVG9vbGJhckNvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogVGV4dCBhbGlnbm1lbnQ6ICdsZWZ0JywgJ2NlbnRlcicgb3IgJ3JpZ2h0Jy4gQWxzbyBhY2NlcHRzIGRpcmVjdGlvbiBuZXV0cmFsICdzdGFydCcgYW5kICdlbmQnLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXRleHRBbGlnbilcbiAgICAgKi9cbiAgICB0ZXh0QWxpZ24gPyA6ICdsZWZ0J3wnY2VudGVyJ3wncmlnaHQnfCdzdGFydCd8J2VuZCdcbiAgICAvKipcbiAgICAgKiBJbmxpbmUgdGltZSByYW5nZXMsIHdpbGwgYmUgbG9hZGVkIGludG8gdGhlIFt0aW1lUmFuZ2VTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9taXhpbi9DYWxlbmRhclN0b3JlcyNwcm9wZXJ0eS10aW1lUmFuZ2VTdG9yZSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctdGltZVJhbmdlcylcbiAgICAgKi9cbiAgICB0aW1lUmFuZ2VzID8gOiBUaW1lUmFuZ2VNb2RlbFtdfFRpbWVSYW5nZU1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBUaGUgW1RpbWVSYW5nZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2RhdGEvVGltZVJhbmdlU3RvcmUpIG9yIGEgcmVjb25maWd1cmluZyBvYmplY3QgZm9yIGEgc3RvcmUgd2hpY2ggd2lsbCBob2xkIHRpbWUgcmFuZ2VzLlxuICAgICAqIFRoZXNlIG1heSBiZSB1c2VkIGJ5IHRoZSBbVGltZVJhbmdlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL1RpbWVSYW5nZXMpIGZlYXR1cmUuXG4gICAgICovXG4gICAgdGltZVJhbmdlU3RvcmUgPyA6IFRpbWVSYW5nZVN0b3JlfFRpbWVSYW5nZVN0b3JlQ29uZmlnXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGEgdGltZSB6b25lIG9yIGEgVVRDIG9mZnNldC4gVGhpcyB3aWxsIHNldCB0aGUgcHJvamVjdCdzXG4gICAgICogW3RpbWVab25lXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXRpbWVab25lKSBjb25maWcgYWNjb3JkaW5nbHkuIEFzIHRoaXMgY29uZmlnIGlzIG9ubHkgYSByZWZlcmVyLFxuICAgICAqIHBsZWFzZSBzZWUgcHJvamVjdCdzIGNvbmZpZyBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9TY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy10aW1lWm9uZSkgZm9yIG1vcmVcbiAgICAgKiBpbmZvcm1hdGlvbi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy10aW1lWm9uZSlcbiAgICAgKi9cbiAgICB0aW1lWm9uZSA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIEEgdGl0bGUgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyIG9yIG93bmluZyBUYWJQYW5lbC4gQ2F1c2VzIGNyZWF0aW9uIGFuZCBkb2NraW5nIG9mIGEgaGVhZGVyXG4gICAgICogdG8gdGhlIHRvcCBpZiBubyBoZWFkZXIgaXMgY29uZmlndXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy10aXRsZSlcbiAgICAgKi9cbiAgICB0aXRsZSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIFt0b29sc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sKSB0byBhZGQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgYHRpdGxlYCBpbiB0aGUgUGFuZWwgaGVhZGVyLiBFYWNoXG4gICAgICogcHJvcGVydHkgbmFtZSBpcyB0aGUgcmVmZXJlbmNlIGJ5IHdoaWNoIGFuIGluc3RhbnRpYXRlZCB0b29sIG1heSBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbGl2ZVxuICAgICAqIGBbdG9vbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vVG9vbGFibGUjcHJvcGVydHktdG9vbHMpYCBwcm9wZXJ0eS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy10b29scylcbiAgICAgKi9cbiAgICB0b29scyA/IDogUmVjb3JkPHN0cmluZywgVG9vbENvbmZpZz58bnVsbFxuICAgIC8qKlxuICAgICAqIFRvb2x0aXAgZm9yIHRoZSB3aWRnZXQsIGVpdGhlciBhcyBhIHN0cmluZyBvciBhcyBhIFRvb2x0aXAgY29uZmlnIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy10b29sdGlwKVxuICAgICAqL1xuICAgIHRvb2x0aXAgPyA6IHN0cmluZ3xUb29sdGlwQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0YWJiaW5nIHdpdGhpbiBhIFBhbmVsIGlzIG5vdCBjb250YWluZWQsIGllIHlvdSBjYW4gVEFCIG91dCBvZiB0aGUgUGFuZWxcbiAgICAgKiBmb3J3YXJkcyBvciBiYWNrd2FyZHMuXG4gICAgICogQ29uZmlndXJlIHRoaXMgYXMgYHRydWVgIHRvIGRpc2FsbG93IHRhYmJpbmcgb3V0IG9mIHRoZSBQYW5lbCwgYW5kIG1ha2UgdGFiYmluZyBjaXJjdWxhciB3aXRoaW4gdGhpcyBQYW5lbC5cbiAgICAgKi9cbiAgICB0cmFwRm9jdXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIHRyaWdnZXIgYHNlbGVjdGlvbkNoYW5nZWAgd2hlbiByZW1vdmluZyBhIHNlbGVjdGVkIGV2ZW50L2Fzc2lnbm1lbnQuXG4gICAgICovXG4gICAgdHJpZ2dlclNlbGVjdGlvbkNoYW5nZU9uUmVtb3ZlID8gOiBib29sZWFuXG4gICAgdHlwZSA/IDogJ2NhbGVuZGFyJ1xuICAgIC8qKlxuICAgICAqIEN1c3RvbSBDU1MgY2xhc3MgbmFtZSBzdWZmaXhlcyB0byBhcHBseSB0byB0aGUgZWxlbWVudHMgcmVuZGVyZWQgYnkgdGhpcyB3aWRnZXQuIFRoaXMgbWF5IGJlIHNwZWNpZmllZFxuICAgICAqIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIHN0cmluZywgYW4gYXJyYXkgb2Ygc3RyaW5ncywgb3IgYXMgYW4gb2JqZWN0IGluIHdoaWNoIHByb3BlcnR5IG5hbWVzIHdpdGggdHJ1dGh5XG4gICAgICogdmFsdWVzIGFyZSB1c2VkIGFzIHRoZSBjbGFzcyBuYW1lcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2NvbmZpZy11aSlcbiAgICAgKi9cbiAgICB1aSA/IDogJ3BsYWluJ3wndG9vbGJhcid8c3RyaW5nfG9iamVjdFxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBkYXkgb2Ygd2VlayBhbmQgd2VlayBvZiBtb250aCBvZiB0aGUgZXZlbnQncyBzdGFydCBkYXRlIGFyZSB1c2VkIHRvIGNyZWF0ZVxuICAgICAqIGhlbHBmdWwgY29udGV4dHVhbCByZWN1cnJlbmNlIHR5cGVzIHdoZW4gZWRpdGluZyBhIG5vbi1yZWN1cnJpbmcgZXZlbnQgcmVjb3JkIGFuZCBjaG9vc2luZ1xuICAgICAqIGFuIGluaXRpYWwgcmVjdXJyZW5jZSB0eXBlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXVzZUNvbnRleHR1YWxSZWN1cnJlbmNlUnVsZXMpXG4gICAgICovXG4gICAgdXNlQ29udGV4dHVhbFJlY3VycmVuY2VSdWxlcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBjaGFuZ2UgaG93IHRoZSBzdWJvcmRpbmF0ZSBbQ29udGFpbmVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lcikgd2hpY2ggY29udGFpbnNcbiAgICAgKiB0aGUgY2FsZW5kYXIncyBjaGlsZCB2aWV3cyBpcyBjcmVhdGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXZpZXdDb250YWluZXIpXG4gICAgICovXG4gICAgdmlld0NvbnRhaW5lciA/IDogQ29udGFpbmVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIHdlZWsgc3RhcnQgZGF5IHRvIGJlIHVzZWQgdGhyb3VnaG91dCB0aGlzIENhbGVuZGFyLCAwIG1lYW5pbmcgU3VuZGF5LCA2IG1lYW5pbmcgU2F0dXJkYXkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWctd2Vla1N0YXJ0RGF5KVxuICAgICAqL1xuICAgIHdlZWtTdGFydERheSA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogQSB3aWRnZXRzIHdlaWdodCBkZXRlcm1pbmVzIGl0cyBwb3NpdGlvbiBhbW9uZyBzaWJsaW5ncyB3aGVuIGFkZGVkIHRvIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLlxuICAgICAqIEhpZ2hlciB3ZWlnaHRzIGdvIGZ1cnRoZXIgZG93bi5cbiAgICAgKi9cbiAgICB3ZWlnaHQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIHdpZHRoLCB1c2VkIHRvIHNldCBlbGVtZW50IGBzdHlsZS53aWR0aGAuIEVpdGhlciBzcGVjaWZ5IGEgdmFsaWQgd2lkdGggc3RyaW5nIG9yIGEgbnVtYmVyLCB3aGljaFxuICAgICAqIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgd2lkdGgsIGJ1dCBpbiBzb21lIGNhc2VzXG4gICAgICogdGhpcyBjb25maWcgaXMgY29udmVuaWVudC5cbiAgICAgKi9cbiAgICB3aWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSB4IHBvc2l0aW9uIGZvciB0aGUgd2lkZ2V0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLXgpXG4gICAgICovXG4gICAgeCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIHkgcG9zaXRpb24gZm9yIHRoZSB3aWRnZXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNjb25maWcteSlcbiAgICAgKi9cbiAgICB5ID8gOiBudW1iZXJcblxuICAgIC8vIEZlYXR1cmVzXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIHByb3ZpZGVzIGRyYWctYmFzZWQgZXZlbnQgY3JlYXRpb24gYW5kIG1vZGlmaWNhdGlvbiBmb3IgQ2FsZW5kYXJzLiBXaGVuIGVuYWJsZWQgKHdoaWNoIGlzIHRoZSBkZWZhdWx0XG4gICAgICogZm9yIGNhbGVuZGFycyksIHRoZSB1c2VyIGNhbiBkbyB0aGUgZm9sbG93aW5nIHZpYSB0aGUgbW91c2Ugb3IgdG91Y2ggc2NyZWVuOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvQ2FsZW5kYXJEcmFnKVxuICAgICAqL1xuICAgIGRyYWdGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2FsZW5kYXJEcmFnfENhbGVuZGFyRHJhZ0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgRmVhdHVyZSB0aGF0IGFsbG93cyBzaG93aW5nIGFkZGl0aW9uYWwgdGltZSBiZWZvcmUgJmFtcDsgYWZ0ZXIgYW4gZXZlbnQsIHRvIHZpc3VhbGl6ZSB0aGluZ3MgbGlrZSB0cmF2ZWwgdGltZSAtIG9yIHRoZSB0aW1lIHlvdVxuICAgICAqIG5lZWQgdG8gcHJlcGFyZSBhIHJvb20gZm9yIGEgbWVldGluZyArIGNsZWFuIGl0IHVwIGFmdGVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXZlbnRCdWZmZXIpXG4gICAgICovXG4gICAgZXZlbnRCdWZmZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXZlbnRCdWZmZXJ8RXZlbnRCdWZmZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBBbGxvdyB1c2luZyBbQ3RybC9DTUQgKyBDL1gvVl0gdG8gY29weS9jdXQtYW5kLXBhc3RlIGV2ZW50cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V2ZW50Q29weVBhc3RlKVxuICAgICAqL1xuICAgIGV2ZW50Q29weVBhc3RlRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEV2ZW50Q29weVBhc3RlfEV2ZW50Q29weVBhc3RlQ29uZmlnXG4gICAgLyoqXG4gICAgICogRmVhdHVyZSB0aGF0IGRpc3BsYXlzIGEgcG9wdXAgY29udGFpbmluZyBmaWVsZHMgZm9yIGVkaXRpbmcgZXZlbnQgZGF0YS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V2ZW50RWRpdClcbiAgICAgKi9cbiAgICBldmVudEVkaXRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXZlbnRFZGl0fEV2ZW50RWRpdENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgZmVhdHVyZSB3aGljaCBzaG93cyBhIGNvbnRleHQgbWVudSB3aGVuIHJpZ2h0LWNsaWNraW5nIGV2ZW50cyBpbiB0aGUgY2FsZW5kYXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FdmVudE1lbnUpXG4gICAgICovXG4gICAgZXZlbnRNZW51RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEV2ZW50TWVudXxFdmVudE1lbnVDb25maWdcbiAgICAvKipcbiAgICAgKiBBIGZlYXR1cmUgd2hpY2ggZGlzcGxheXMgYSBbdG9vbHRpcF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V2ZW50VG9vbHRpcCNjb25maWctdG9vbHRpcCkgY29udGFpbmluZyBleHRyYSBpbmZvcm1hdGlvbi4gVGhlIHRvb2x0aXAgY2FuXG4gICAgICogYmUgdHJpZ2dlcmVkIGJ5IGNsaWNraW5nIG9yIGhvdmVyaW5nIGFuIGV2ZW50IGJhciBlbGVtZW50IChzZWUgW3Nob3dPbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V2ZW50VG9vbHRpcCNjb25maWctc2hvd09uKSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FdmVudFRvb2x0aXApXG4gICAgICovXG4gICAgZXZlbnRUb29sdGlwRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEV2ZW50VG9vbHRpcHxFdmVudFRvb2x0aXBDb25maWdcbiAgICAvKipcbiAgICAgKiBBIGZlYXR1cmUgdGhhdCBhbGxvd3MgZXhwb3J0aW5nIENhbGVuZGFyIGRhdGEgdG8gRXhjZWwgb3IgQ1NWIHdpdGhvdXQgaW52b2x2aW5nIHRoZSBzZXJ2ZXIuIEl0IHVzZXNcbiAgICAgKiBbVGFibGVFeHBvcnRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL3V0aWwvVGFibGVFeHBvcnRlcikgY2xhc3MgYXMgZGF0YSBwcm92aWRlciwgM3JkIHBhcnR5IHByb3ZpZGVyIHRvIGdlbmVyYXRlIFhMUyBmaWxlcywgYW5kXG4gICAgICogW01pY3Jvc29mdCBYTUwgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9vZmZpY2UvZG9jdW1lbnRmb3JtYXQub3BlbnhtbC5zcHJlYWRzaGVldC5hc3B4KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL2V4cGVyaW1lbnRhbC9FeGNlbEV4cG9ydGVyKVxuICAgICAqL1xuICAgIGV4Y2VsRXhwb3J0ZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXhjZWxFeHBvcnRlcnxFeGNlbEV4cG9ydGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogQSBDYWxlbmRhciBmZWF0dXJlIHdoaWNoIGFsbG93cyBuZXcgZXZlbnRzIHRvIGJlIGRyYWdnZWQgaW50byB0aGUgQ2FsZW5kYXIgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FeHRlcm5hbEV2ZW50U291cmNlKVxuICAgICAqL1xuICAgIGV4dGVybmFsRXZlbnRTb3VyY2VGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXh0ZXJuYWxFdmVudFNvdXJjZXxFeHRlcm5hbEV2ZW50U291cmNlQ29uZmlnXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGhvc3QgQ2FsZW5kYXIncyBbQ3J1ZE1hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vU2NoZWR1bGVyU3RvcmVzI2NvbmZpZy1jcnVkTWFuYWdlcikgb24gZGVtYW5kXG4gICAgICogYXMgdGhlIGRhdGUgcmFuZ2UgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgVUkgY2hhbmdlcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0xvYWRPbkRlbWFuZClcbiAgICAgKi9cbiAgICBsb2FkT25EZW1hbmRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8TG9hZE9uRGVtYW5kfExvYWRPbkRlbWFuZENvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmVhdHVyZSBlbmFibGVzIHByaW50aW5nIG9mIHRoZSBjdXJyZW50IENhbGVuZGFyIG1vZGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9wcmludC9QcmludClcbiAgICAgKi9cbiAgICBwcmludEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xQcmludHxQcmludENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgZmVhdHVyZSB3aGljaCBhZGRzIGEgY29udGV4dCBtZW51IHRvIHRoZSB1bm9jY3VwaWVkIHBhcnRzIG9mIGNhbGVuZGFyIHZpZXdzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvU2NoZWR1bGVNZW51KVxuICAgICAqL1xuICAgIHNjaGVkdWxlTWVudUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTY2hlZHVsZU1lbnV8U2NoZWR1bGVNZW51Q29uZmlnXG4gICAgLyoqXG4gICAgICogQSBmZWF0dXJlIHRoYXQgZGlzcGxheXMgYSB0b29sdGlwIGNvbnRhaW5pbmcgdGhlIHRpbWUgYXQgdGhlIG1vdXNlIHBvc2l0aW9uIHdoZW4gaG92ZXJpbmcgZW1wdHkgcGFydHMgb2YgdGhlIHNjaGVkdWxlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvU2NoZWR1bGVUb29sdGlwKVxuICAgICAqL1xuICAgIHNjaGVkdWxlVG9vbHRpcEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTY2hlZHVsZVRvb2x0aXB8U2NoZWR1bGVUb29sdGlwQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvIGhpZ2hsaWdodCByYW5nZXMgb2YgdGltZSBpbiBhIGNhbGVuZGFyJ3MgZGF5IGFuZCB3ZWVrIHZpZXdzLiBFYWNoIHRpbWUgcmFuZ2UgaXNcbiAgICAgKiByZXByZXNlbnRlZCB1c2luZyB0aGUgW1RpbWVSYW5nZU1vZGVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL21vZGVsL1RpbWVSYW5nZU1vZGVsKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL1RpbWVSYW5nZXMpXG4gICAgICovXG4gICAgdGltZVJhbmdlc0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUaW1lUmFuZ2VzfFRpbWVSYW5nZXNDb25maWdcbiAgICAvKipcbiAgICAgKiBBIEZlYXR1cmUgd2hpY2gsIHdoZW4gcHJlc2VudCwgYWRkcyBhIHdlZWsgcm93IGV4cGFuc2lvbiB0b29sIHRvIHdlZWsgcm93cyBpblxuICAgICAqIFtNb250aFZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldylzIHNvIHRoYXQgYSByb3cgd2hpY2ggY29udGFpbnMgb3ZlcmZsb3dpbmcgY2VsbHNcbiAgICAgKiBjYW4gYmUgZXhwYW5kZWQgdG8gc2hvdyBhbGwgZXZlbnRzIHdpdGggbm8gb3ZlcmZsb3cuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9XZWVrRXhwYW5kZXIpXG4gICAgICovXG4gICAgd2Vla0V4cGFuZGVyRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFdlZWtFeHBhbmRlcnxXZWVrRXhwYW5kZXJDb25maWdcblxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciA6ICdicnludHVtLWNhbGVuZGFyJyxcbiAgICB0ZW1wbGF0ZSA6ICcnXG59KVxuZXhwb3J0IGNsYXNzIEJyeW50dW1DYWxlbmRhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VDbGFzcyA9IENhbGVuZGFyO1xuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZU5hbWUgPSAnQ2FsZW5kYXInO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUV2ZW50czogc3RyaW5nW10gPSBbXG4gICAgICAgICdvbkFjdGl2ZUl0ZW1DaGFuZ2UnLFxuICAgICAgICAnb25BZnRlckV2ZW50RWRpdCcsXG4gICAgICAgICdvbkFmdGVyRXZlbnRTYXZlJyxcbiAgICAgICAgJ29uQmVmb3JlQWN0aXZlSXRlbUNoYW5nZScsXG4gICAgICAgICdvbkJlZm9yZUFzc2lnbm1lbnREZWxldGUnLFxuICAgICAgICAnb25CZWZvcmVBc3NpZ25tZW50U2VsZWN0aW9uQ2hhbmdlJyxcbiAgICAgICAgJ29uQmVmb3JlQXV0b0NyZWF0ZScsXG4gICAgICAgICdvbkJlZm9yZUNvcHknLFxuICAgICAgICAnb25CZWZvcmVDcmVhdGVNb2RlJyxcbiAgICAgICAgJ29uQmVmb3JlQ1NWRXhwb3J0JyxcbiAgICAgICAgJ29uQmVmb3JlRGVzdHJveScsXG4gICAgICAgICdvbkJlZm9yZURyYWdDcmVhdGUnLFxuICAgICAgICAnb25CZWZvcmVEcmFnQ3JlYXRlRW5kJyxcbiAgICAgICAgJ29uQmVmb3JlRHJhZ01vdmUnLFxuICAgICAgICAnb25CZWZvcmVEcmFnTW92ZUVuZCcsXG4gICAgICAgICdvbkJlZm9yZURyYWdSZXNpemUnLFxuICAgICAgICAnb25CZWZvcmVEcmFnUmVzaXplRW5kJyxcbiAgICAgICAgJ29uQmVmb3JlRHJvcEV4dGVybmFsJyxcbiAgICAgICAgJ29uQmVmb3JlRXZlbnREZWxldGUnLFxuICAgICAgICAnb25CZWZvcmVFdmVudEVkaXQnLFxuICAgICAgICAnb25CZWZvcmVFdmVudEVkaXRTaG93JyxcbiAgICAgICAgJ29uQmVmb3JlRXZlbnRTYXZlJyxcbiAgICAgICAgJ29uQmVmb3JlRXZlbnRTZWxlY3Rpb25DaGFuZ2UnLFxuICAgICAgICAnb25CZWZvcmVFeGNlbEV4cG9ydCcsXG4gICAgICAgICdvbkJlZm9yZUhpZGUnLFxuICAgICAgICAnb25CZWZvcmVQYXN0ZScsXG4gICAgICAgICdvbkJlZm9yZVByaW50JyxcbiAgICAgICAgJ29uQmVmb3JlUmVzcG9uc2l2ZVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uQmVmb3JlU2V0UmVjb3JkJyxcbiAgICAgICAgJ29uQmVmb3JlU2hvdycsXG4gICAgICAgICdvbkJlZm9yZVN0YXRlQXBwbHknLFxuICAgICAgICAnb25CZWZvcmVTdGF0ZVNhdmUnLFxuICAgICAgICAnb25DYXRjaEFsbCcsXG4gICAgICAgICdvbkNlbGxPdmVyZmxvd0NsaWNrJyxcbiAgICAgICAgJ29uQ29sbGFwc2UnLFxuICAgICAgICAnb25Db250ZXh0TWVudUl0ZW0nLFxuICAgICAgICAnb25Db250ZXh0TWVudVRvZ2dsZUl0ZW0nLFxuICAgICAgICAnb25Db3B5JyxcbiAgICAgICAgJ29uQ3VycmVudFRpbWVsaW5lVXBkYXRlJyxcbiAgICAgICAgJ29uRGF0YUNoYW5nZScsXG4gICAgICAgICdvbkRhdGVDaGFuZ2UnLFxuICAgICAgICAnb25EYXRlUmFuZ2VDaGFuZ2UnLFxuICAgICAgICAnb25EYXRlUmFuZ2VMb2FkJyxcbiAgICAgICAgJ29uRGF0ZVJhbmdlUmVxdWVzdGVkJyxcbiAgICAgICAgJ29uRGF5Q2VsbFBvcHVsYXRlZCcsXG4gICAgICAgICdvbkRheU51bWJlckNsaWNrJyxcbiAgICAgICAgJ29uRGVzdHJveScsXG4gICAgICAgICdvbkRpcnR5U3RhdGVDaGFuZ2UnLFxuICAgICAgICAnb25EcmFnQ3JlYXRlRW5kJyxcbiAgICAgICAgJ29uRHJhZ01vdmVFbmQnLFxuICAgICAgICAnb25EcmFnTW92ZUV4dGVybmFsJyxcbiAgICAgICAgJ29uRHJhZ1Jlc2l6ZUVuZCcsXG4gICAgICAgICdvbkRyb3BFeHRlcm5hbCcsXG4gICAgICAgICdvbkVsZW1lbnRDcmVhdGVkJyxcbiAgICAgICAgJ29uRW1wdHlDZWxsQ2xpY2snLFxuICAgICAgICAnb25FdmVudEF1dG9DcmVhdGVkJyxcbiAgICAgICAgJ29uRXZlbnRDbGljaycsXG4gICAgICAgICdvbkV2ZW50Q29udGV4dE1lbnUnLFxuICAgICAgICAnb25FdmVudERibENsaWNrJyxcbiAgICAgICAgJ29uRXZlbnRFZGl0QmVmb3JlU2V0UmVjb3JkJyxcbiAgICAgICAgJ29uRXZlbnRLZXlEb3duJyxcbiAgICAgICAgJ29uRXZlbnRNZW51QmVmb3JlU2hvdycsXG4gICAgICAgICdvbkV2ZW50TWVudUl0ZW0nLFxuICAgICAgICAnb25FdmVudE1lbnVTaG93JyxcbiAgICAgICAgJ29uRXZlbnRNb3VzZURvd24nLFxuICAgICAgICAnb25FdmVudE1vdXNlRW50ZXInLFxuICAgICAgICAnb25FdmVudE1vdXNlTGVhdmUnLFxuICAgICAgICAnb25FdmVudE1vdXNlT3V0JyxcbiAgICAgICAgJ29uRXZlbnRNb3VzZU92ZXInLFxuICAgICAgICAnb25FdmVudE1vdXNlVXAnLFxuICAgICAgICAnb25FdmVudFByb3BhZ2F0ZScsXG4gICAgICAgICdvbkV4cGFuZCcsXG4gICAgICAgICdvbkZvY3VzSW4nLFxuICAgICAgICAnb25Gb2N1c091dCcsXG4gICAgICAgICdvbkhpZGUnLFxuICAgICAgICAnb25Mb2FkT25EZW1hbmRGYWlsJyxcbiAgICAgICAgJ29uTW9udGhOYW1lQ2xpY2snLFxuICAgICAgICAnb25OYXZpZ2F0ZScsXG4gICAgICAgICdvblBhaW50JyxcbiAgICAgICAgJ29uUGFzdGUnLFxuICAgICAgICAnb25QYXN0ZU5vdEFsbG93ZWQnLFxuICAgICAgICAnb25SZWFkT25seScsXG4gICAgICAgICdvblJlY29tcG9zZScsXG4gICAgICAgICdvblJlZnJlc2gnLFxuICAgICAgICAnb25SZXNpemUnLFxuICAgICAgICAnb25SZXNvdXJjZUNsaWNrJyxcbiAgICAgICAgJ29uUmVzcG9uc2l2ZVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uU2NoZWR1bGVDbGljaycsXG4gICAgICAgICdvblNjaGVkdWxlQ29udGV4dE1lbnUnLFxuICAgICAgICAnb25TY2hlZHVsZURibENsaWNrJyxcbiAgICAgICAgJ29uU2NoZWR1bGVNZW51QmVmb3JlU2hvdycsXG4gICAgICAgICdvblNjaGVkdWxlTWVudUl0ZW0nLFxuICAgICAgICAnb25TY2hlZHVsZU1lbnVTaG93JyxcbiAgICAgICAgJ29uU2NoZWR1bGVNb3VzZURvd24nLFxuICAgICAgICAnb25TY2hlZHVsZU1vdXNlT3V0JyxcbiAgICAgICAgJ29uU2NoZWR1bGVNb3VzZU92ZXInLFxuICAgICAgICAnb25TY2hlZHVsZU1vdXNlVXAnLFxuICAgICAgICAnb25TZWxlY3Rpb25DaGFuZ2UnLFxuICAgICAgICAnb25TaG93JyxcbiAgICAgICAgJ29uU2lkZWJhckNvbGxhcHNlJyxcbiAgICAgICAgJ29uU2lkZWJhckV4cGFuZCcsXG4gICAgICAgICdvblRpbWVBeGlzQ2xpY2snLFxuICAgICAgICAnb25UaW1lUmFuZ2VIZWFkZXJDbGljaycsXG4gICAgICAgICdvblRpbWVSYW5nZUhlYWRlckNvbnRleHRNZW51JyxcbiAgICAgICAgJ29uVGltZVJhbmdlSGVhZGVyRGJsQ2xpY2snLFxuICAgICAgICAnb25Ub29sQ2xpY2snLFxuICAgICAgICAnb25WaWV3UGFpbnQnLFxuICAgICAgICAnb25XZWVrTnVtYmVyQ2xpY2snXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1GZWF0dXJlTmFtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAnZHJhZ0ZlYXR1cmUnLFxuICAgICAgICAnZXZlbnRCdWZmZXJGZWF0dXJlJyxcbiAgICAgICAgJ2V2ZW50Q29weVBhc3RlRmVhdHVyZScsXG4gICAgICAgICdldmVudEVkaXRGZWF0dXJlJyxcbiAgICAgICAgJ2V2ZW50TWVudUZlYXR1cmUnLFxuICAgICAgICAnZXZlbnRUb29sdGlwRmVhdHVyZScsXG4gICAgICAgICdleGNlbEV4cG9ydGVyRmVhdHVyZScsXG4gICAgICAgICdleHRlcm5hbEV2ZW50U291cmNlRmVhdHVyZScsXG4gICAgICAgICdsb2FkT25EZW1hbmRGZWF0dXJlJyxcbiAgICAgICAgJ3ByaW50RmVhdHVyZScsXG4gICAgICAgICdzY2hlZHVsZU1lbnVGZWF0dXJlJyxcbiAgICAgICAgJ3NjaGVkdWxlVG9vbHRpcEZlYXR1cmUnLFxuICAgICAgICAndGltZVJhbmdlc0ZlYXR1cmUnLFxuICAgICAgICAnd2Vla0V4cGFuZGVyRmVhdHVyZSdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3M6IHN0cmluZ1tdID0gQnJ5bnR1bUNhbGVuZGFyQ29tcG9uZW50LmJyeW50dW1GZWF0dXJlTmFtZXMuY29uY2F0KFtcbiAgICAgICAgJ2FjdGl2ZURhdGVDbHMnLFxuICAgICAgICAnYWRvcHQnLFxuICAgICAgICAnYWxpZ24nLFxuICAgICAgICAnYWxpZ25TZWxmJyxcbiAgICAgICAgJ2FuY2hvcicsXG4gICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICdhcmlhRGVzY3JpcHRpb24nLFxuICAgICAgICAnYXJpYUxhYmVsJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRzJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRTdG9yZScsXG4gICAgICAgICdhdXRvQ3JlYXRlJyxcbiAgICAgICAgJ2JiYXInLFxuICAgICAgICAnYm9keUNscycsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2NhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucycsXG4gICAgICAgICdjZW50ZXJlZCcsXG4gICAgICAgICdjbHMnLFxuICAgICAgICAnY29sbGFwc2VkJyxcbiAgICAgICAgJ2NvbGxhcHNpYmxlJyxcbiAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgJ2NvbHVtbicsXG4gICAgICAgICdjb25maWcnLFxuICAgICAgICAnY29uc3RyYWluVG8nLFxuICAgICAgICAnY29udGVudEVsZW1lbnRDbHMnLFxuICAgICAgICAnY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQnLFxuICAgICAgICAnY3J1ZE1hbmFnZXInLFxuICAgICAgICAnY3J1ZE1hbmFnZXJDbGFzcycsXG4gICAgICAgICdkYXRhRmllbGQnLFxuICAgICAgICAnZGF0YXNldCcsXG4gICAgICAgICdkYXRlJyxcbiAgICAgICAgJ2RhdGVGb3JtYXQnLFxuICAgICAgICAnZGF0ZVBpY2tlcicsXG4gICAgICAgICdkZWZhdWx0QmluZFByb3BlcnR5JyxcbiAgICAgICAgJ2RlZmF1bHRDYWxlbmRhcicsXG4gICAgICAgICdkZWZhdWx0Rm9jdXMnLFxuICAgICAgICAnZGVmYXVsdHMnLFxuICAgICAgICAnZGVzZWxlY3RBbGxPblNjaGVkdWxlQ2xpY2snLFxuICAgICAgICAnZGVzZWxlY3RPbkNsaWNrJyxcbiAgICAgICAgJ2Rlc3Ryb3lTdG9yZXMnLFxuICAgICAgICAnZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcycsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdkb2NrJyxcbiAgICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAgICdkcmF3ZXInLFxuICAgICAgICAnZWxlbWVudEF0dHJpYnV0ZXMnLFxuICAgICAgICAnZW5hYmxlRGVsZXRlS2V5JyxcbiAgICAgICAgJ2VuYWJsZVJlY3VycmluZ0V2ZW50cycsXG4gICAgICAgICdlbmFibGVVbmRvUmVkb0tleXMnLFxuICAgICAgICAnZXZlbnRzJyxcbiAgICAgICAgJ2V2ZW50U2VsZWN0aW9uRGlzYWJsZWQnLFxuICAgICAgICAnZXZlbnRTdG9yZScsXG4gICAgICAgICdleHRyYURhdGEnLFxuICAgICAgICAnZmlsdGVyRXZlbnRSZXNvdXJjZXMnLFxuICAgICAgICAnZmxleCcsXG4gICAgICAgICdmbG9hdGluZycsXG4gICAgICAgICdmb290ZXInLFxuICAgICAgICAnaGVhZGVyJyxcbiAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICdoaWRkZW4nLFxuICAgICAgICAnaGlkZUFuaW1hdGlvbicsXG4gICAgICAgICdoaWRlTm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnaGlkZVdoZW5FbXB0eScsXG4gICAgICAgICdoaWdobGlnaHREYXRlJyxcbiAgICAgICAgJ2hpZ2hsaWdodFByZWRlY2Vzc29ycycsXG4gICAgICAgICdoaWdobGlnaHRTdWNjZXNzb3JzJyxcbiAgICAgICAgJ2ljb24nLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaWdub3JlUGFyZW50UmVhZE9ubHknLFxuICAgICAgICAnaW5jbHVkZVdlZWtlbmRzQnV0dG9uJyxcbiAgICAgICAgJ2lucHV0RmllbGRBbGlnbicsXG4gICAgICAgICdpbnNlcnRCZWZvcmUnLFxuICAgICAgICAnaW5zZXJ0Rmlyc3QnLFxuICAgICAgICAnaXNFdmVudFNlbGVjdGFibGUnLFxuICAgICAgICAnaXRlbUNscycsXG4gICAgICAgICdpdGVtcycsXG4gICAgICAgICdrZXlNYXAnLFxuICAgICAgICAnbGFiZWxQb3NpdGlvbicsXG4gICAgICAgICdsYXlvdXQnLFxuICAgICAgICAnbGF5b3V0U3R5bGUnLFxuICAgICAgICAnbGF6eUl0ZW1zJyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdsb2FkTWFzaycsXG4gICAgICAgICdsb2FkTWFza0RlZmF1bHRzJyxcbiAgICAgICAgJ2xvYWRNYXNrRXJyb3InLFxuICAgICAgICAnbG9jYWxlQ2xhc3MnLFxuICAgICAgICAnbG9jYWxpemFibGUnLFxuICAgICAgICAnbG9jYWxpemFibGVQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ21haW50YWluU2VsZWN0aW9uT25EYXRhc2V0Q2hhbmdlJyxcbiAgICAgICAgJ21hcmdpbicsXG4gICAgICAgICdtYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbWFza2VkJyxcbiAgICAgICAgJ21heERhdGUnLFxuICAgICAgICAnbWF4SGVpZ2h0JyxcbiAgICAgICAgJ21heGltaXplT25Nb2JpbGUnLFxuICAgICAgICAnbWF4V2lkdGgnLFxuICAgICAgICAnbWluRGF0ZScsXG4gICAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgICAnbWluV2lkdGgnLFxuICAgICAgICAnbW9kZScsXG4gICAgICAgICdtb2RlRGVmYXVsdHMnLFxuICAgICAgICAnbW9kZXMnLFxuICAgICAgICAnbW9uaXRvclJlc2l6ZScsXG4gICAgICAgICdtdWx0aUV2ZW50U2VsZWN0JyxcbiAgICAgICAgJ25hbWVkSXRlbXMnLFxuICAgICAgICAnbmF2aWdhdG9yUGxhY2VtZW50JyxcbiAgICAgICAgJ25vbldvcmtpbmdEYXlzJyxcbiAgICAgICAgJ292ZXJsYXlTaWRlYmFyJyxcbiAgICAgICAgJ293bmVyJyxcbiAgICAgICAgJ3Bvc2l0aW9uZWQnLFxuICAgICAgICAncHJldmVudFRvb2x0aXBPblRvdWNoJyxcbiAgICAgICAgJ3Byb2plY3QnLFxuICAgICAgICAncHJvcGFnYXRlZENvbmZpZ3MnLFxuICAgICAgICAncmVhZE9ubHknLFxuICAgICAgICAncmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwJyxcbiAgICAgICAgJ3JlbGF5U3RvcmVFdmVudHMnLFxuICAgICAgICAncmVuZGl0aW9uJyxcbiAgICAgICAgJ3Jlc291cmNlSW1hZ2VQYXRoJyxcbiAgICAgICAgJ3Jlc291cmNlcycsXG4gICAgICAgICdyZXNvdXJjZVN0b3JlJyxcbiAgICAgICAgJ3Jlc291cmNlVGltZVJhbmdlcycsXG4gICAgICAgICdyZXNvdXJjZVRpbWVSYW5nZVN0b3JlJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmUnLFxuICAgICAgICAncmVzcG9uc2l2ZVJvb3QnLFxuICAgICAgICAncmVzcG9uc2l2ZVN0YXRlJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVUYXJnZXQnLFxuICAgICAgICAncmlwcGxlJyxcbiAgICAgICAgJ3Jvb3RFbGVtZW50JyxcbiAgICAgICAgJ3J0bCcsXG4gICAgICAgICdzY3JvbGxhYmxlJyxcbiAgICAgICAgJ3Njcm9sbEFjdGlvbicsXG4gICAgICAgICdzZWxlY3RSZXNvdXJjZU9uRXZlbnROYXZpZ2F0ZScsXG4gICAgICAgICdzZWxlY3RSZXNvdXJjZU9uU2NoZWR1bGVDbGljaycsXG4gICAgICAgICdzaG93QW5pbWF0aW9uJyxcbiAgICAgICAgJ3Nob3dSZWN1cnJpbmdVSScsXG4gICAgICAgICdzaG93VG9vbHRpcFdoZW5EaXNhYmxlZCcsXG4gICAgICAgICdzaWRlYmFyJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3RhdGVmdWwnLFxuICAgICAgICAnc3RhdGVmdWxFdmVudHMnLFxuICAgICAgICAnc3RhdGVJZCcsXG4gICAgICAgICdzdGF0ZVByb3ZpZGVyJyxcbiAgICAgICAgJ3N0cmljdFJlY29yZE1hcHBpbmcnLFxuICAgICAgICAnc3RyaXBzJyxcbiAgICAgICAgJ3N5bmNNYXNrJyxcbiAgICAgICAgJ3RhYicsXG4gICAgICAgICd0YWJCYXJJdGVtcycsXG4gICAgICAgICd0YWcnLFxuICAgICAgICAndGJhcicsXG4gICAgICAgICd0ZXh0QWxpZ24nLFxuICAgICAgICAndGltZVJhbmdlcycsXG4gICAgICAgICd0aW1lUmFuZ2VTdG9yZScsXG4gICAgICAgICd0aW1lWm9uZScsXG4gICAgICAgICd0aXRsZScsXG4gICAgICAgICd0b29scycsXG4gICAgICAgICd0b29sdGlwJyxcbiAgICAgICAgJ3RyYXBGb2N1cycsXG4gICAgICAgICd0cmlnZ2VyU2VsZWN0aW9uQ2hhbmdlT25SZW1vdmUnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICd1aScsXG4gICAgICAgICd1c2VDb250ZXh0dWFsUmVjdXJyZW5jZVJ1bGVzJyxcbiAgICAgICAgJ3ZpZXdDb250YWluZXInLFxuICAgICAgICAnd2Vla1N0YXJ0RGF5JyxcbiAgICAgICAgJ3dlaWdodCcsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgICd4JyxcbiAgICAgICAgJ3knXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtQ29uZmlnc09ubHk6IHN0cmluZ1tdID0gW1xuICAgICAgICAnYWRvcHQnLFxuICAgICAgICAnYWxpZ24nLFxuICAgICAgICAnYW5jaG9yJyxcbiAgICAgICAgJ2FyaWFEZXNjcmlwdGlvbicsXG4gICAgICAgICdhcmlhTGFiZWwnLFxuICAgICAgICAnYXNzaWdubWVudFN0b3JlJyxcbiAgICAgICAgJ2F1dG9DcmVhdGUnLFxuICAgICAgICAnYmJhcicsXG4gICAgICAgICdib2R5Q2xzJyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjZW50ZXJlZCcsXG4gICAgICAgICdjb2xsYXBzaWJsZScsXG4gICAgICAgICdjb2xvcicsXG4gICAgICAgICdjb25maWcnLFxuICAgICAgICAnY29uc3RyYWluVG8nLFxuICAgICAgICAnY29udGVudEVsZW1lbnRDbHMnLFxuICAgICAgICAnY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQnLFxuICAgICAgICAnY3J1ZE1hbmFnZXJDbGFzcycsXG4gICAgICAgICdkYXRhRmllbGQnLFxuICAgICAgICAnZGF0ZVBpY2tlcicsXG4gICAgICAgICdkZWZhdWx0QmluZFByb3BlcnR5JyxcbiAgICAgICAgJ2RlZmF1bHRGb2N1cycsXG4gICAgICAgICdkZWZhdWx0cycsXG4gICAgICAgICdkZXNlbGVjdE9uQ2xpY2snLFxuICAgICAgICAnZGVzdHJveVN0b3JlcycsXG4gICAgICAgICdkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzJyxcbiAgICAgICAgJ2RvY2snLFxuICAgICAgICAnZHJhZ2dhYmxlJyxcbiAgICAgICAgJ2RyYXdlcicsXG4gICAgICAgICdlbGVtZW50QXR0cmlidXRlcycsXG4gICAgICAgICdlbmFibGVEZWxldGVLZXknLFxuICAgICAgICAnZW5hYmxlUmVjdXJyaW5nRXZlbnRzJyxcbiAgICAgICAgJ2VuYWJsZVVuZG9SZWRvS2V5cycsXG4gICAgICAgICdldmVudFNlbGVjdGlvbkRpc2FibGVkJyxcbiAgICAgICAgJ2V2ZW50U3RvcmUnLFxuICAgICAgICAnZmlsdGVyRXZlbnRSZXNvdXJjZXMnLFxuICAgICAgICAnZmxvYXRpbmcnLFxuICAgICAgICAnZm9vdGVyJyxcbiAgICAgICAgJ2hlYWRlcicsXG4gICAgICAgICdoaWRlQW5pbWF0aW9uJyxcbiAgICAgICAgJ2hpZGVXaGVuRW1wdHknLFxuICAgICAgICAnaGlnaGxpZ2h0RGF0ZScsXG4gICAgICAgICdoaWdobGlnaHRQcmVkZWNlc3NvcnMnLFxuICAgICAgICAnaGlnaGxpZ2h0U3VjY2Vzc29ycycsXG4gICAgICAgICdpY29uJyxcbiAgICAgICAgJ2lnbm9yZVBhcmVudFJlYWRPbmx5JyxcbiAgICAgICAgJ2luY2x1ZGVXZWVrZW5kc0J1dHRvbicsXG4gICAgICAgICdpdGVtQ2xzJyxcbiAgICAgICAgJ2xhenlJdGVtcycsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnbG9hZE1hc2snLFxuICAgICAgICAnbG9hZE1hc2tEZWZhdWx0cycsXG4gICAgICAgICdsb2FkTWFza0Vycm9yJyxcbiAgICAgICAgJ2xvY2FsZUNsYXNzJyxcbiAgICAgICAgJ2xvY2FsaXphYmxlJyxcbiAgICAgICAgJ2xvY2FsaXphYmxlUHJvcGVydGllcycsXG4gICAgICAgICdtYWludGFpblNlbGVjdGlvbk9uRGF0YXNldENoYW5nZScsXG4gICAgICAgICdtYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbWFza2VkJyxcbiAgICAgICAgJ21vbml0b3JSZXNpemUnLFxuICAgICAgICAnbXVsdGlFdmVudFNlbGVjdCcsXG4gICAgICAgICduYW1lZEl0ZW1zJyxcbiAgICAgICAgJ25hdmlnYXRvclBsYWNlbWVudCcsXG4gICAgICAgICdvdmVybGF5U2lkZWJhcicsXG4gICAgICAgICdvd25lcicsXG4gICAgICAgICdwb3NpdGlvbmVkJyxcbiAgICAgICAgJ3ByZXZlbnRUb29sdGlwT25Ub3VjaCcsXG4gICAgICAgICdwcm9wYWdhdGVkQ29uZmlncycsXG4gICAgICAgICdyZWxheVN0b3JlRXZlbnRzJyxcbiAgICAgICAgJ3Jlc291cmNlSW1hZ2VQYXRoJyxcbiAgICAgICAgJ3Jlc291cmNlU3RvcmUnLFxuICAgICAgICAncmVzb3VyY2VUaW1lUmFuZ2VTdG9yZScsXG4gICAgICAgICdyZXNwb25zaXZlJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVSb290JyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVTdGF0ZScsXG4gICAgICAgICdyZXNwb25zaXZlVGFyZ2V0JyxcbiAgICAgICAgJ3JpcHBsZScsXG4gICAgICAgICdyb290RWxlbWVudCcsXG4gICAgICAgICdzY3JvbGxBY3Rpb24nLFxuICAgICAgICAnc2hvd0FuaW1hdGlvbicsXG4gICAgICAgICdzaG93UmVjdXJyaW5nVUknLFxuICAgICAgICAnc2hvd1Rvb2x0aXBXaGVuRGlzYWJsZWQnLFxuICAgICAgICAnc2lkZWJhcicsXG4gICAgICAgICdzdGF0ZWZ1bCcsXG4gICAgICAgICdzdGF0ZWZ1bEV2ZW50cycsXG4gICAgICAgICdzdGF0ZUlkJyxcbiAgICAgICAgJ3N0YXRlUHJvdmlkZXInLFxuICAgICAgICAnc3RyaXBzJyxcbiAgICAgICAgJ3N5bmNNYXNrJyxcbiAgICAgICAgJ3RhYicsXG4gICAgICAgICd0YWJCYXJJdGVtcycsXG4gICAgICAgICd0YWcnLFxuICAgICAgICAndGJhcicsXG4gICAgICAgICd0ZXh0QWxpZ24nLFxuICAgICAgICAndGltZVJhbmdlU3RvcmUnLFxuICAgICAgICAndGltZVpvbmUnLFxuICAgICAgICAndHJhcEZvY3VzJyxcbiAgICAgICAgJ3RyaWdnZXJTZWxlY3Rpb25DaGFuZ2VPblJlbW92ZScsXG4gICAgICAgICd0eXBlJyxcbiAgICAgICAgJ3VpJyxcbiAgICAgICAgJ3ZpZXdDb250YWluZXInLFxuICAgICAgICAnd2Vla1N0YXJ0RGF5JyxcbiAgICAgICAgJ3dlaWdodCdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bVByb3BzOiBzdHJpbmdbXSA9IEJyeW50dW1DYWxlbmRhckNvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhY3RpdmVEYXRlQ2xzJyxcbiAgICAgICAgJ2FjdGl2ZVN1YlZpZXcnLFxuICAgICAgICAnYWN0aXZlVmlldycsXG4gICAgICAgICdhbGlnblNlbGYnLFxuICAgICAgICAnYW5jaG9yU2l6ZScsXG4gICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICdhc3NpZ25tZW50cycsXG4gICAgICAgICdjYWxsT25GdW5jdGlvbnMnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NscycsXG4gICAgICAgICdjb2xsYXBzZWQnLFxuICAgICAgICAnY29sdW1uJyxcbiAgICAgICAgJ2NydWRNYW5hZ2VyJyxcbiAgICAgICAgJ2RhdGFzZXQnLFxuICAgICAgICAnZGF0ZScsXG4gICAgICAgICdkYXRlRm9ybWF0JyxcbiAgICAgICAgJ2RlZmF1bHRDYWxlbmRhcicsXG4gICAgICAgICdkZXNlbGVjdEFsbE9uU2NoZWR1bGVDbGljaycsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdldmVudHMnLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZm9jdXNWaXNpYmxlJyxcbiAgICAgICAgJ2hhc0NoYW5nZXMnLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlTm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaW5wdXRGaWVsZEFsaWduJyxcbiAgICAgICAgJ2luc2VydEJlZm9yZScsXG4gICAgICAgICdpbnNlcnRGaXJzdCcsXG4gICAgICAgICdpc0VuZ2luZVJlYWR5JyxcbiAgICAgICAgJ2lzRXZlbnRTZWxlY3RhYmxlJyxcbiAgICAgICAgJ2lzU2V0dGluZ1ZhbHVlcycsXG4gICAgICAgICdpc1ZhbGlkJyxcbiAgICAgICAgJ2l0ZW1zJyxcbiAgICAgICAgJ2tleU1hcCcsXG4gICAgICAgICdsYWJlbFBvc2l0aW9uJyxcbiAgICAgICAgJ2xheW91dCcsXG4gICAgICAgICdsYXlvdXRTdHlsZScsXG4gICAgICAgICdtYXJnaW4nLFxuICAgICAgICAnbWF4RGF0ZScsXG4gICAgICAgICdtYXhIZWlnaHQnLFxuICAgICAgICAnbWF4aW1pemVPbk1vYmlsZScsXG4gICAgICAgICdtYXhXaWR0aCcsXG4gICAgICAgICdtaW5EYXRlJyxcbiAgICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAgICdtaW5XaWR0aCcsXG4gICAgICAgICdtb2RlJyxcbiAgICAgICAgJ21vZGVEZWZhdWx0cycsXG4gICAgICAgICdtb2RlcycsXG4gICAgICAgICdub25Xb3JraW5nRGF5cycsXG4gICAgICAgICdwYXJlbnQnLFxuICAgICAgICAncHJvamVjdCcsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZWNvcmQnLFxuICAgICAgICAncmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwJyxcbiAgICAgICAgJ3JlbmRpdGlvbicsXG4gICAgICAgICdyZXNvdXJjZXMnLFxuICAgICAgICAncmVzb3VyY2VUaW1lUmFuZ2VzJyxcbiAgICAgICAgJ3J0bCcsXG4gICAgICAgICdzY3JvbGxhYmxlJyxcbiAgICAgICAgJ3NlbGVjdGVkRXZlbnRzJyxcbiAgICAgICAgJ3NlbGVjdFJlc291cmNlT25FdmVudE5hdmlnYXRlJyxcbiAgICAgICAgJ3NlbGVjdFJlc291cmNlT25TY2hlZHVsZUNsaWNrJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3RhdGUnLFxuICAgICAgICAnc3RyaWN0UmVjb3JkTWFwcGluZycsXG4gICAgICAgICd0aW1lUmFuZ2VzJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ3Rvb2xzJyxcbiAgICAgICAgJ3Rvb2x0aXAnLFxuICAgICAgICAndXNlQ29udGV4dHVhbFJlY3VycmVuY2VSdWxlcycsXG4gICAgICAgICd2YWx1ZXMnLFxuICAgICAgICAndmlld3MnLFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICAneCcsXG4gICAgICAgICd5J1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIHB1YmxpYyBpbnN0YW5jZSE6IENhbGVuZGFyO1xuXG4gICAgcHJpdmF0ZSBicnludHVtQ29uZmlnID0ge1xuICAgICAgICBhZG9wdCAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhcHBlbmRUbyAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBocmVmICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhbmd1bGFyQ29tcG9uZW50IDogdGhpcyxcbiAgICAgICAgZmVhdHVyZXMgICAgICAgICA6IHt9LFxuICAgICAgICBsaXN0ZW5lcnMgICAgICAgIDoge31cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIENvbmZpZ3Mgb25seVxuICAgIEBJbnB1dCgpIGFkb3B0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgYWxpZ24gICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IEFsaWduU3BlY3xzdHJpbmc7XG4gICAgQElucHV0KCkgYW5jaG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXJpYURlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhcmlhTGFiZWwgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFzc2lnbm1lbnRTdG9yZSAgICAgICAgICAgICAgICAgICEgOiBBc3NpZ25tZW50U3RvcmV8QXNzaWdubWVudFN0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGF1dG9DcmVhdGUgICAgICAgICAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGdlc3R1cmU/OiBzdHJpbmdcbiAgICAgICAgbmV3TmFtZT86IEZ1bmN0aW9ufHN0cmluZ1xuICAgICAgICBzdGVwPzogc3RyaW5nXG4gICAgICAgIGR1cmF0aW9uPzogc3RyaW5nXG4gICAgICAgIHN0YXJ0SG91cj86IG51bWJlcnxzdHJpbmdcbiAgICB9fHN0cmluZ3xib29sZWFuO1xuICAgIEBJbnB1dCgpIGJiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAoQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfFBhZ2luZ1Rvb2xiYXJDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSBib2R5Q2xzICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBidWJibGVFdmVudHMgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGNlbnRlcmVkICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNvbGxhcHNpYmxlICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFBhbmVsQ29sbGFwc2VyQ29uZmlnfFBhbmVsQ29sbGFwc2VyT3ZlcmxheUNvbmZpZztcbiAgICBASW5wdXQoKSBjb2xvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGNvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgY29uc3RyYWluVG8gICAgICAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fFdpZGdldHxSZWN0YW5nbGU7XG4gICAgQElucHV0KCkgY29udGVudEVsZW1lbnRDbHMgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQgICAgICAgICAgISA6ICdjb250ZXh0bWVudSd8J2NsaWNrJ3wnZGJsY2xpY2snO1xuICAgIEBJbnB1dCgpIGNydWRNYW5hZ2VyQ2xhc3MgICAgICAgICAgICAgICAgICEgOiBTY2hlZHVsZXJDcnVkTWFuYWdlcjtcbiAgICBASW5wdXQoKSBkYXRhRmllbGQgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRhdGVQaWNrZXIgICAgICAgICAgICAgICAgICAgICAgICEgOiBDYWxlbmRhckRhdGVQaWNrZXJDb25maWd8Ym9vbGVhbnxudWxsO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRCaW5kUHJvcGVydHkgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGVmYXVsdEZvY3VzICAgICAgICAgICAgICAgICAgICAgISA6ICgod2lkZ2V0OiBXaWRnZXQpID0+IGJvb2xlYW4pfHN0cmluZztcbiAgICBASW5wdXQoKSBkZWZhdWx0cyAgICAgICAgICAgICAgICAgICAgICAgICAhIDogQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnO1xuICAgIEBJbnB1dCgpIGRlc2VsZWN0T25DbGljayAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRlc3Ryb3lTdG9yZXMgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAndG9wJ3wnYm90dG9tJ3wnbGVmdCd8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnfCdoZWFkZXInfCdwcmUtaGVhZGVyJ3xvYmplY3Q7XG4gICAgQElucHV0KCkgZHJhZ2dhYmxlICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBoYW5kbGVTZWxlY3Rvcj86IHN0cmluZ1xuICAgIH07XG4gICAgQElucHV0KCkgZHJhd2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e3NpZGU/OiAnc3RhcnQnfCdsZWZ0J3wnZW5kJ3wncmlnaHQnfCd0b3AnfCdib3R0b20nLCBzaXplPzogc3RyaW5nfG51bWJlciwgaW5saW5lPzogYm9vbGVhbiwgYXV0b0Nsb3NlOiB7IG1vdXNlZG93bj86IGJvb2xlYW58c3RyaW5nLCBmb2N1c291dD86IGJvb2xlYW58c3RyaW5nLCBtb3VzZW91dD86IHN0cmluZyB9LCBhdXRvQ2xvc2VEZWxheT86IG51bWJlcn07XG4gICAgQElucHV0KCkgZWxlbWVudEF0dHJpYnV0ZXMgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ3xudWxsPjtcbiAgICBASW5wdXQoKSBlbmFibGVEZWxldGVLZXkgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBlbmFibGVSZWN1cnJpbmdFdmVudHMgICAgICAgICAgICAhIDogYm9vbGVhbnx7XG4gICAgICAgIGRlZmF1bHRBY3Rpb24/OiAnc2luZ2xlJ3wnZnV0dXJlJ1xuICAgIH07XG4gICAgQElucHV0KCkgZW5hYmxlVW5kb1JlZG9LZXlzICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZXZlbnRTZWxlY3Rpb25EaXNhYmxlZCAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZXZlbnRTdG9yZSAgICAgICAgICAgICAgICAgICAgICAgISA6IEV2ZW50U3RvcmV8RXZlbnRTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSBmaWx0ZXJFdmVudFJlc291cmNlcyAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmbG9hdGluZyAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmb290ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICBkb2NrPzogJ3RvcCd8J3JpZ2h0J3wnYm90dG9tJ3wnbGVmdCd8J3N0YXJ0J3wnZW5kJ1xuICAgICAgICBodG1sPzogc3RyaW5nXG4gICAgICAgIGNscz86IHN0cmluZ1xuICAgIH18c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8Ym9vbGVhbnxQYW5lbEhlYWRlcjtcbiAgICBASW5wdXQoKSBoaWRlQW5pbWF0aW9uICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3Q7XG4gICAgQElucHV0KCkgaGlkZVdoZW5FbXB0eSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGlnaGxpZ2h0RGF0ZSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58KChkYXRlOiBEYXRlKSA9PiBib29sZWFuKTtcbiAgICBASW5wdXQoKSBoaWdobGlnaHRQcmVkZWNlc3NvcnMgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaWdobGlnaHRTdWNjZXNzb3JzICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpY29uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfERvbUNvbmZpZztcbiAgICBASW5wdXQoKSBpZ25vcmVQYXJlbnRSZWFkT25seSAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpbmNsdWRlV2Vla2VuZHNCdXR0b24gICAgICAgICAgICAhIDogYm9vbGVhbnxCdXR0b25Db25maWc7XG4gICAgQElucHV0KCkgaXRlbUNscyAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBsYXp5SXRlbXMgICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPnxDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWdbXXxXaWRnZXRbXTtcbiAgICBASW5wdXQoKSBsaXN0ZW5lcnMgICAgICAgICAgICAgICAgICAgICAgICAhIDogQ2FsZW5kYXJMaXN0ZW5lcnM7XG4gICAgQElucHV0KCkgbG9hZE1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xNYXNrQ29uZmlnfG51bGw7XG4gICAgQElucHV0KCkgbG9hZE1hc2tEZWZhdWx0cyAgICAgICAgICAgICAgICAgISA6IE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbG9hZE1hc2tFcnJvciAgICAgICAgICAgICAgICAgICAgISA6IE1hc2tDb25maWd8TWFza3xib29sZWFuO1xuICAgIEBJbnB1dCgpIGxvY2FsZUNsYXNzICAgICAgICAgICAgICAgICAgICAgICEgOiB0eXBlb2YgQmFzZTtcbiAgICBASW5wdXQoKSBsb2NhbGl6YWJsZSAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBsb2NhbGl6YWJsZVByb3BlcnRpZXMgICAgICAgICAgICAhIDogc3RyaW5nW107XG4gICAgQElucHV0KCkgbWFpbnRhaW5TZWxlY3Rpb25PbkRhdGFzZXRDaGFuZ2UgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbWFza0RlZmF1bHRzICAgICAgICAgICAgICAgICAgICAgISA6IE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbWFza2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58c3RyaW5nfE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbW9uaXRvclJlc2l6ZSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBpbW1lZGlhdGU/OiBib29sZWFuXG4gICAgfTtcbiAgICBASW5wdXQoKSBtdWx0aUV2ZW50U2VsZWN0ICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7XG4gICAgICAgIGN0cmxLZXk/OiBib29sZWFuXG4gICAgICAgIGFsdEtleT86IGJvb2xlYW5cbiAgICAgICAgc2hpZnRLZXk/OiBib29sZWFuXG4gICAgfTtcbiAgICBASW5wdXQoKSBuYW1lZEl0ZW1zICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPjtcbiAgICBASW5wdXQoKSBuYXZpZ2F0b3JQbGFjZW1lbnQgICAgICAgICAgICAgICAhIDogJ3Rvb2xiYXInfCdzaWRlYmFyJztcbiAgICBASW5wdXQoKSBvdmVybGF5U2lkZWJhciAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBvd25lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogV2lkZ2V0fGFueTtcbiAgICBASW5wdXQoKSBwb3NpdGlvbmVkICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwcmV2ZW50VG9vbHRpcE9uVG91Y2ggICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwcm9wYWdhdGVkQ29uZmlncyAgICAgICAgICAgICAgICAhIDogc3RyaW5nW107XG4gICAgQElucHV0KCkgcmVsYXlTdG9yZUV2ZW50cyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVzb3VyY2VJbWFnZVBhdGggICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSByZXNvdXJjZVN0b3JlICAgICAgICAgICAgICAgICAgICAhIDogUmVzb3VyY2VTdG9yZXxSZXNvdXJjZVN0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIHJlc291cmNlVGltZVJhbmdlU3RvcmUgICAgICAgICAgICEgOiBSZXNvdXJjZVRpbWVSYW5nZVN0b3JlfFJlc291cmNlVGltZVJhbmdlU3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZSAgICAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSByZXNwb25zaXZlUm9vdCAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNwb25zaXZlU3RhdGUgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHJlc3BvbnNpdmVUYXJnZXQgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8V2lkZ2V0O1xuICAgIEBJbnB1dCgpIHJpcHBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtcbiAgICAgICAgZGVsZWdhdGU/OiBzdHJpbmdcbiAgICAgICAgY29sb3I/OiBzdHJpbmdcbiAgICAgICAgcmFkaXVzPzogbnVtYmVyXG4gICAgICAgIGNsaXA/OiBzdHJpbmdcbiAgICB9O1xuICAgIEBJbnB1dCgpIHJvb3RFbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICEgOiBTaGFkb3dSb290fEhUTUxFbGVtZW50O1xuICAgIEBJbnB1dCgpIHNjcm9sbEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICEgOiAnaGlkZSd8J3JlYWxpZ24nfG51bGw7XG4gICAgQElucHV0KCkgc2hvd0FuaW1hdGlvbiAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58b2JqZWN0O1xuICAgIEBJbnB1dCgpIHNob3dSZWN1cnJpbmdVSSAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNob3dUb29sdGlwV2hlbkRpc2FibGVkICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNpZGViYXIgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiB7c2lkZT86ICdsZWZ0J3wncmlnaHQnLCBjb2xsYXBzZWQ/OiBib29sZWFuLCBpdGVtczogeyBbbW9kZTogc3RyaW5nXTogQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfG51bGx8dW5kZWZpbmVkLCBkYXRlUGlja2VyPzogRGF0ZVBpY2tlckNvbmZpZywgZXZlbnRGaWx0ZXI/OiBUZXh0RmllbGRDb25maWcsIHJlc291cmNlRmlsdGVyPzogUmVzb3VyY2VGaWx0ZXJDb25maWcgfX18Ym9vbGVhbjtcbiAgICBASW5wdXQoKSBzdGF0ZWZ1bCAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3R8c3RyaW5nW107XG4gICAgQElucHV0KCkgc3RhdGVmdWxFdmVudHMgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdHxzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBzdGF0ZUlkICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHN0YXRlUHJvdmlkZXIgICAgICAgICAgICAgICAgICAgICEgOiBTdGF0ZVByb3ZpZGVyO1xuICAgIEBJbnB1dCgpIHN0cmlwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWc+O1xuICAgIEBJbnB1dCgpIHN5bmNNYXNrICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8TWFza0NvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIHRhYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFRhYkNvbmZpZztcbiAgICBASW5wdXQoKSB0YWJCYXJJdGVtcyAgICAgICAgICAgICAgICAgICAgICAhIDogVG9vbGJhckl0ZW1zW118V2lkZ2V0W107XG4gICAgQElucHV0KCkgdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSB0YmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogKENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ3xzdHJpbmcpW118VG9vbGJhckNvbmZpZ3xDYWxlbmRhclRvb2xiYXJDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSB0ZXh0QWxpZ24gICAgICAgICAgICAgICAgICAgICAgICAhIDogJ2xlZnQnfCdjZW50ZXInfCdyaWdodCd8J3N0YXJ0J3wnZW5kJztcbiAgICBASW5wdXQoKSB0aW1lUmFuZ2VTdG9yZSAgICAgICAgICAgICAgICAgICAhIDogVGltZVJhbmdlU3RvcmV8VGltZVJhbmdlU3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgdGltZVpvbmUgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgdHJhcEZvY3VzICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdHJpZ2dlclNlbGVjdGlvbkNoYW5nZU9uUmVtb3ZlICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6ICdjYWxlbmRhcic7XG4gICAgQElucHV0KCkgdWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6ICdwbGFpbid8J3Rvb2xiYXInfHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgdmlld0NvbnRhaW5lciAgICAgICAgICAgICAgICAgICAgISA6IENvbnRhaW5lckNvbmZpZztcbiAgICBASW5wdXQoKSB3ZWVrU3RhcnREYXkgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG5cbiAgICAvLyBDb25maWdzIGFuZCBwcm9wZXJ0aWVzXG4gICAgQElucHV0KCkgYWN0aXZlRGF0ZUNscyAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhbGlnblNlbGYgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFwcGVuZFRvICAgICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgYXNzaWdubWVudHMgICAgICAgICAgICAgICAgICAgISA6IEFzc2lnbm1lbnRNb2RlbFtdfEFzc2lnbm1lbnRNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGNhbGxPbkZ1bmN0aW9ucyAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNscyAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGNvbGxhcHNlZCAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNvbHVtbiAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgY3J1ZE1hbmFnZXIgICAgICAgICAgICAgICAgICAgISA6IFNjaGVkdWxlckNydWRNYW5hZ2VyfENydWRNYW5hZ2VyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGRhdGFzZXQgICAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3R8UmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBASW5wdXQoKSBkYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogRGF0ZXxzdHJpbmc7XG4gICAgQElucHV0KCkgZGF0ZUZvcm1hdCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkZWZhdWx0Q2FsZW5kYXIgICAgICAgICAgICAgICAhIDogUmVzb3VyY2VNb2RlbHxzdHJpbmc7XG4gICAgQElucHV0KCkgZGVzZWxlY3RBbGxPblNjaGVkdWxlQ2xpY2sgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58J2luZXJ0JztcbiAgICBASW5wdXQoKSBldmVudHMgICAgICAgICAgICAgICAgICAgICAgICAhIDogRXZlbnRNb2RlbFtdfEV2ZW50TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBleHRyYURhdGEgICAgICAgICAgICAgICAgICAgICAhIDogYW55O1xuICAgIEBJbnB1dCgpIGZsZXggICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhpZGRlbiAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhpZGVOb25Xb3JraW5nRGF5cyAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5wdXRGaWVsZEFsaWduICAgICAgICAgICAgICAgISA6ICdzdGFydCd8J2VuZCc7XG4gICAgQElucHV0KCkgaW5zZXJ0QmVmb3JlICAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBpbnNlcnRGaXJzdCAgICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGlzRXZlbnRTZWxlY3RhYmxlICAgICAgICAgICAgICEgOiAoZXZlbnQ6IEV2ZW50TW9kZWwpID0+IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXRlbXMgICAgICAgICAgICAgICAgICAgICAgICAgISA6IChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8TWVudUl0ZW1Db25maWd8V2lkZ2V0KVtdfFJlY29yZDxzdHJpbmcsIENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ3xNZW51SXRlbUNvbmZpZz58V2lkZ2V0W118b2JqZWN0fFdpZGdldENvbmZpZztcbiAgICBASW5wdXQoKSBrZXlNYXAgICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgS2V5TWFwQ29uZmlnPjtcbiAgICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uICAgICAgICAgICAgICAgICAhIDogJ2JlZm9yZSd8J2Fib3ZlJ3wnYWxpZ24tYmVmb3JlJ3wnYXV0byd8bnVsbDtcbiAgICBASW5wdXQoKSBsYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAhIDogTGF5b3V0fHN0cmluZ3xDYWxlbmRhckNvbnRhaW5lckxheW91dENvbmZpZztcbiAgICBASW5wdXQoKSBsYXlvdXRTdHlsZSAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIG1hcmdpbiAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heERhdGUgICAgICAgICAgICAgICAgICAgICAgICEgOiBEYXRlfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhIZWlnaHQgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtYXhpbWl6ZU9uTW9iaWxlICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhXaWR0aCAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5EYXRlICAgICAgICAgICAgICAgICAgICAgICAhIDogRGF0ZXxzdHJpbmc7XG4gICAgQElucHV0KCkgbWluSGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWluV2lkdGggICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3wnYWdlbmRhJ3wneWVhcid8J21vbnRoJ3wnd2Vlayd8J2RheSd8J2xpc3QnfCdyZXNvdXJjZSd8J2RheXJlc291cmNlJ3wnZGF5YWdlbmRhJ3wnbW9udGhhZ2VuZGEnfCdtb250aGdyaWQnO1xuICAgIEBJbnB1dCgpIG1vZGVEZWZhdWx0cyAgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgbW9kZXMgICAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIENhbGVuZGFyVmlldz58b2JqZWN0O1xuICAgIEBJbnB1dCgpIG5vbldvcmtpbmdEYXlzICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8bnVtYmVyLCBib29sZWFuPjtcbiAgICBASW5wdXQoKSBwcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgICAhIDogUHJvamVjdE1vZGVsfFByb2plY3RNb2RlbENvbmZpZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgcmVhZE9ubHkgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVjdXJyZW5jZUNvbmZpcm1hdGlvblBvcHVwICAgISA6IFJlY3VycmVuY2VDb25maXJtYXRpb25Qb3B1cENvbmZpZ3xSZWN1cnJlbmNlQ29uZmlybWF0aW9uUG9wdXA7XG4gICAgQElucHV0KCkgcmVuZGl0aW9uICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fG51bGw7XG4gICAgQElucHV0KCkgcmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgISA6IFJlc291cmNlTW9kZWxbXXxSZXNvdXJjZU1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgcmVzb3VyY2VUaW1lUmFuZ2VzICAgICAgICAgICAgISA6IFJlc291cmNlVGltZVJhbmdlTW9kZWxbXXxSZXNvdXJjZVRpbWVSYW5nZU1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgcnRsICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2Nyb2xsYWJsZSAgICAgICAgICAgICAgICAgICAgISA6IFNjcm9sbGVyfGJvb2xlYW58U2Nyb2xsZXJDb25maWc7XG4gICAgQElucHV0KCkgc2VsZWN0UmVzb3VyY2VPbkV2ZW50TmF2aWdhdGUgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2VsZWN0UmVzb3VyY2VPblNjaGVkdWxlQ2xpY2sgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc3BhbiAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzdHJpY3RSZWNvcmRNYXBwaW5nICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB0aW1lUmFuZ2VzICAgICAgICAgICAgICAgICAgICAhIDogVGltZVJhbmdlTW9kZWxbXXxUaW1lUmFuZ2VNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIHRpdGxlICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdG9vbHMgICAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIFRvb2x8VG9vbENvbmZpZz58bnVsbHxSZWNvcmQ8c3RyaW5nLCBUb29sPnxSZWNvcmQ8c3RyaW5nLCBUb29sQ29uZmlnPjtcbiAgICBASW5wdXQoKSB0b29sdGlwICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfFRvb2x0aXBDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSB1c2VDb250ZXh0dWFsUmVjdXJyZW5jZVJ1bGVzICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG5cbiAgICAvLyBQcm9wZXJ0aWVzIG9ubHlcbiAgICBASW5wdXQoKSBhY3RpdmVTdWJWaWV3ICAgISA6IENhbGVuZGFyVmlldztcbiAgICBASW5wdXQoKSBhY3RpdmVWaWV3ICAgICAgISA6IENhbGVuZGFyVmlldztcbiAgICBASW5wdXQoKSBhbmNob3JTaXplICAgICAgISA6IG51bWJlcltdO1xuICAgIEBJbnB1dCgpIGZvY3VzVmlzaWJsZSAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoYXNDaGFuZ2VzICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNFbmdpbmVSZWFkeSAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzU2V0dGluZ1ZhbHVlcyAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpc1ZhbGlkICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcGFyZW50ICAgICAgICAgICEgOiBXaWRnZXQ7XG4gICAgQElucHV0KCkgcmVjb3JkICAgICAgICAgICEgOiBNb2RlbDtcbiAgICBASW5wdXQoKSBzZWxlY3RlZEV2ZW50cyAgISA6IEV2ZW50TW9kZWxbXTtcbiAgICBASW5wdXQoKSBzdGF0ZSAgICAgICAgICAgISA6IGFueTtcbiAgICBASW5wdXQoKSB2YWx1ZXMgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIG9iamVjdD47XG4gICAgQElucHV0KCkgdmlld3MgICAgICAgICAgICEgOiBDYWxlbmRhclZpZXdbXTtcblxuICAgIC8vIEZlYXR1cmVzXG4gICAgQElucHV0KCkgZHJhZ0ZlYXR1cmUgICAgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2FsZW5kYXJEcmFnfENhbGVuZGFyRHJhZ0NvbmZpZztcbiAgICBASW5wdXQoKSBldmVudEJ1ZmZlckZlYXR1cmUgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xFdmVudEJ1ZmZlcnxFdmVudEJ1ZmZlckNvbmZpZztcbiAgICBASW5wdXQoKSBldmVudENvcHlQYXN0ZUZlYXR1cmUgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xFdmVudENvcHlQYXN0ZXxFdmVudENvcHlQYXN0ZUNvbmZpZztcbiAgICBASW5wdXQoKSBldmVudEVkaXRGZWF0dXJlICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xFdmVudEVkaXR8RXZlbnRFZGl0Q29uZmlnO1xuICAgIEBJbnB1dCgpIGV2ZW50TWVudUZlYXR1cmUgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEV2ZW50TWVudXxFdmVudE1lbnVDb25maWc7XG4gICAgQElucHV0KCkgZXZlbnRUb29sdGlwRmVhdHVyZSAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXZlbnRUb29sdGlwfEV2ZW50VG9vbHRpcENvbmZpZztcbiAgICBASW5wdXQoKSBleGNlbEV4cG9ydGVyRmVhdHVyZSAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xFeGNlbEV4cG9ydGVyfEV4Y2VsRXhwb3J0ZXJDb25maWc7XG4gICAgQElucHV0KCkgZXh0ZXJuYWxFdmVudFNvdXJjZUZlYXR1cmUgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXh0ZXJuYWxFdmVudFNvdXJjZXxFeHRlcm5hbEV2ZW50U291cmNlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGxvYWRPbkRlbWFuZEZlYXR1cmUgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfExvYWRPbkRlbWFuZHxMb2FkT25EZW1hbmRDb25maWc7XG4gICAgQElucHV0KCkgcHJpbnRGZWF0dXJlICAgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8UHJpbnR8UHJpbnRDb25maWc7XG4gICAgQElucHV0KCkgc2NoZWR1bGVNZW51RmVhdHVyZSAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U2NoZWR1bGVNZW51fFNjaGVkdWxlTWVudUNvbmZpZztcbiAgICBASW5wdXQoKSBzY2hlZHVsZVRvb2x0aXBGZWF0dXJlICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTY2hlZHVsZVRvb2x0aXB8U2NoZWR1bGVUb29sdGlwQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRpbWVSYW5nZXNGZWF0dXJlICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRpbWVSYW5nZXN8VGltZVJhbmdlc0NvbmZpZztcbiAgICBASW5wdXQoKSB3ZWVrRXhwYW5kZXJGZWF0dXJlICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xXZWVrRXhwYW5kZXJ8V2Vla0V4cGFuZGVyQ29uZmlnO1xuXG4gICAgLy8gRXZlbnRzIGVtaXR0ZXJzXG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIGNoYW5nZSBvZiB2aWV3IChDYWxlbmRhciBtb2RlKSBoYXMgY29tcGxldGVkLiBCeSBkZWZhdWx0LCB2aWV3IGNoYW5nZXMgYXJlIGFuaW1hdGVkIGFuZCB0aGlzXG4gICAgICogZXZlbnQgZmlyZXMgd2hlbiB0aGUgdmlldyBpcyBmdWxseSB2aXNpYmxlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGlzIENhbGVuZGFyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5wcmV2QWN0aXZlSXRlbSBUaGUgcHJldmlvdXNseSBhY3RpdmUgdmlldy5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuYWN0aXZlSXRlbSBUaGUgbmV3IGFjdGl2ZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29udGFpbmVkRm9jdXMgYHRydWVgIGlmIHRoZSBvdXRnb2luZyB2aWV3IGNvbnRhaW5lZCBmb2N1cy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25BY3RpdmVJdGVtQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgcHJldkFjdGl2ZUl0ZW06IENhbGVuZGFyVmlldywgYWN0aXZlSXRlbTogQ2FsZW5kYXJWaWV3LCBjb250YWluZWRGb2N1czogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYWZ0ZXIgZWRpdG9yIGlzIGNsb3NlZCBieSBhbnkgYWN0aW9uIC0gc2F2ZSwgZGVsZXRlIG9yIGNhbmNlbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoZSBzY2hlZHVsZXJcbiAgICAgKiBAcGFyYW0geydzYXZlJywnZGVsZXRlJywnY2FuY2VsJ30gZXZlbnQuYWN0aW9uIFRoZSBhY3Rpb24gdGhhdCB3YXMgdGFrZW4gdG8gZW5kIHRoZSBlZGl0LiBPbmUgb2YgJ3NhdmUnLCAnZGVsZXRlJyBvciAnY2FuY2VsJ1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmZlYXR1cmUuU2NoZWR1bGVyRXZlbnRFZGl0fSBldmVudC5ldmVudEVkaXQgVGhlIGV2ZW50RWRpdCBmZWF0dXJlXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIHJlY29yZCB0aGF0IGhhcyBiZWVuIGVkaXRlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgUmVzb3VyY2UgcmVjb3JkIGZvciB0aGUgZXZlbnQuIElmIHRoZSBldmVudCBpcyBiZWluZyBjcmVhdGVkLCBpdCB3aWxsIG5vdCBjb250YWluIGEgcmVzb3VyY2UsIHNvIHRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVzb3VyY2UgdGhlIGV2ZW50IGlzIGJlaW5nIGNyZWF0ZWQgZm9yLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmV2ZW50RWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCByZXByZXNlbnRzIHRoZSBldmVudCBpbiB0aGUgc2NoZWR1bGVyIGRpc3BsYXkuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Qb3B1cH0gZXZlbnQuZWRpdG9yIFRoZSBlZGl0b3JcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25BZnRlckV2ZW50RWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBhY3Rpb246ICdzYXZlJ3wnZGVsZXRlJ3wnY2FuY2VsJywgZXZlbnRFZGl0OiBTY2hlZHVsZXJFdmVudEVkaXQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZXZlbnRFbGVtZW50OiBIVE1MRWxlbWVudCwgZWRpdG9yOiBQb3B1cCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYWZ0ZXIgYW4gZXZlbnQgaXMgc3VjY2Vzc2Z1bGx5IHNhdmVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgVGhlIHNjaGVkdWxlciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSByZWNvcmQgYWJvdXQgdG8gYmUgc2F2ZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25BZnRlckV2ZW50U2F2ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBldmVudFJlY29yZDogRXZlbnRNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIGEgY2hhbmdlIG9mIHZpZXcgKENhbGVuZGFyIG1vZGUpIGlzIGluaXRpYXRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhpcyBDYWxlbmRhciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQucHJldkFjdGl2ZUl0ZW0gVGhlIHByZXZpb3VzbHkgYWN0aXZlIHZpZXcuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LmFjdGl2ZUl0ZW0gVGhlIG5ldyBhY3RpdmUgdmlldy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVBY3RpdmVJdGVtQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgcHJldkFjdGl2ZUl0ZW06IENhbGVuZGFyVmlldywgYWN0aXZlSXRlbTogQ2FsZW5kYXJWaWV3IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGFuIGFzc2lnbm1lbnQgaXMgcmVtb3ZlZC4gQ2FuIGJlIHRyaWdnZXJlZCBieSB1c2VyIHByZXNzaW5nIFtERUxFVEVdIG9yIFtCQUNLU1BBQ0VdIG9yXG4gICAgICogYnkgdGhlIGV2ZW50IGVkaXRvci4gQ2FuIGZvciBleGFtcGxlIGJlIHVzZWQgdG8gZGlzcGxheSBhIGN1c3RvbSBkaWFsb2cgdG8gY29uZmlybSBkZWxldGlvbiwgaW4gd2hpY2hcbiAgICAgKiBjYXNlIHJlY29yZHMgc2hvdWxkIGJlIFwibWFudWFsbHlcIiByZW1vdmVkIGFmdGVyIGNvbmZpcm1hdGlvbjpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2V2ZW50LWJlZm9yZUFzc2lnbm1lbnREZWxldGUpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgVGhlIFNjaGVkdWxlciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5hc3NpZ25tZW50UmVjb3JkcyBUaGUgYXNzaWdubWVudCByZWNvcmRzIGFib3V0IHRvIGJlIGRlbGV0ZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dCBBZGRpdGlvbmFsIHJlbW92YWwgY29udGV4dDpcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jb250ZXh0LmZpbmFsaXplIEZ1bmN0aW9uIHRvIGNhbGwgdG8gZmluYWxpemUgdGhlIHJlbW92YWwuIFVzZWQgdG8gYXN5bmNocm9ub3VzbHkgZGVjaWRlIHRvIHJlbW92ZSB0aGUgcmVjb3JkcyBvciBub3QuIFByb3ZpZGUgYGZhbHNlYCB0byB0aGUgZnVuY3Rpb24gdG8gcHJldmVudCB0aGUgcmVtb3ZhbC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbnRleHQuZmluYWxpemUucmVtb3ZlUmVjb3JkcyBQcm92aWRlIGBmYWxzZWAgdG8gdGhlIGZ1bmN0aW9uIHRvIHByZXZlbnQgdGhlIHJlbW92YWwuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQXNzaWdubWVudERlbGV0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBhc3NpZ25tZW50UmVjb3JkczogQXNzaWdubWVudE1vZGVsW10sIGNvbnRleHQ6IHsgZmluYWxpemU6IHsgcmVtb3ZlUmVjb3Jkcz86IGJvb2xlYW4gfSB9IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYW55IHRpbWUgdGhlcmUgaXMgZ29pbmcgdG8gYmUgYSBjaGFuZ2UgdG8gdGhlIGFzc2lnbm1lbnRzIHNlbGVjdGVkIGluIHRoZSBTY2hlZHVsZXIuXG4gICAgICogUmV0dXJuaW5nIGBmYWxzZWAgcHJldmVudHMgdGhlIGNoYW5nZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoaXMgU2NoZWR1bGVyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7J3NlbGVjdCcsJ2Rlc2VsZWN0JywndXBkYXRlJywnY2xlYXInfSBldmVudC5hY3Rpb24gT25lIG9mIHRoZSBhY3Rpb25zICdzZWxlY3QnLCAnZGVzZWxlY3QnLCAndXBkYXRlJywgJ2NsZWFyJ1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5zZWxlY3RlZCBBbiBhcnJheSBvZiBhc3NpZ25tZW50cyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5Bc3NpZ25tZW50TW9kZWxbXX0gZXZlbnQuZGVzZWxlY3RlZCBBbiBhcnJheSBvZiBhc3NpZ25tZW50cyB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZWxlY3Rpb24uXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuQXNzaWdubWVudE1vZGVsW119IGV2ZW50LnNlbGVjdGlvbiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGFzc2lnbm1lbnRzLCBiZWZvcmUgYXBwbHlpbmcgYHNlbGVjdGVkYCBhbmQgYGRlc2VsZWN0ZWRgLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUFzc2lnbm1lbnRTZWxlY3Rpb25DaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgYWN0aW9uOiAnc2VsZWN0J3wnZGVzZWxlY3QnfCd1cGRhdGUnfCdjbGVhcicsIHNlbGVjdGVkOiBBc3NpZ25tZW50TW9kZWxbXSwgZGVzZWxlY3RlZDogQXNzaWdubWVudE1vZGVsW10sIHNlbGVjdGlvbjogQXNzaWdubWVudE1vZGVsW10gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIHdoZW5ldmVyIGEgY2hpbGQgdmlldydzIFthdXRvQ3JlYXRlIGdlc3R1cmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLWF1dG9DcmVhdGUpIGlzIGRldGVjdGVkIGFuZCBhbHNvIHdoZW4gYSBbZHJhZy1jcmVhdGVdKCNDYWxlbmRhci9mZWF0dXJlL0NhbGVuZGFyRHJhZykgZ2VzdHVyZSBpcyBkZXRlY3RlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2V2ZW50LWJlZm9yZUF1dG9DcmVhdGUpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIGNoaWxkIHZpZXcgb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBpbml0aWF0ZWQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIERPTSBldmVudCB3aGljaCBpbml0aWF0ZWQgdGhlIGNyZWF0aW9uLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSAqREVQUkVDQVRFRCBpbiBmYXZvdXIgb2YgYHN0YXJ0RGF0ZWAuKiBUaGUgc3RhcnRpbmcgdGltZSBvZiB0aGUgZXZlbnQgdG8gYmUgY3JlYXRlZC4gSWYgdGhpcyBpcyBpbiBhIGBEYXlWaWV3YCwgdGhpcyB3aWxsIGJlIHNuYXBwZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGluIFthdXRvQ3JlYXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1hdXRvQ3JlYXRlKVxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuc3RhcnREYXRlIFRoZSBzdGFydGluZyB0aW1lIG9mIHRoZSBldmVudCB0byBiZSBjcmVhdGVkLiBJZiB0aGlzIGlzIGluIGEgYERheVZpZXdgLCB0aGlzIHdpbGwgYmUgc25hcHBlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gaW4gW2F1dG9DcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLWF1dG9DcmVhdGUpXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5lbmREYXRlIFRoZSBlbmRpbmcgdGltZSBvZiB0aGUgZXZlbnQgdG8gYmUgY3JlYXRlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgcmVzb3VyY2UgaWYgdGhlIFVJIGluY2x1ZGVzIGEgcmVzb3VyY2UuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQXV0b0NyZWF0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBiZWZvcmUgYSBjb3B5IGFjdGlvbiBpcyBwZXJmb3JtZWQsIHJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIE93bmVyIHNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuZXZlbnRSZWNvcmRzIFRoZSBldmVudCByZWNvcmRzIGFib3V0IHRvIGJlIGNvcGllZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5hc3NpZ25tZW50UmVjb3JkcyBUaGUgYXNzaWdubWVudCByZWNvcmRzIGFib3V0IHRvIGJlIGNvcGllZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNDdXQgYHRydWVgIGlmIHRoaXMgaXMgYSBjdXQgYWN0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmVudGl0eU5hbWUgJ2V2ZW50JyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgYmVmb3JlQ29weSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDb3B5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGV2ZW50UmVjb3JkczogRXZlbnRNb2RlbFtdLCBhc3NpZ25tZW50UmVjb3JkczogQXNzaWdubWVudE1vZGVsW10sIGlzQ3V0OiBib29sZWFuLCBlbnRpdHlOYW1lOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgYSBtb2RlIGlzIGNyZWF0ZWQuIFRoZSBjb25maWd1cmF0aW9uIGJsb2NrIGlzIHBhc3NlZCB0byB0aGUgaGFuZGxlciBmb3IgcG9zc2libGUgbW9kaWZpY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGlzIENhbGVuZGFyXG4gICAgICogQHBhcmFtIHtBZ2VuZGFWaWV3Q29uZmlnLERheVJlc291cmNlVmlld0NvbmZpZyxEYXlWaWV3Q29uZmlnLEV2ZW50TGlzdENvbmZpZyxNb250aFZpZXdDb25maWcsUmVzb3VyY2VWaWV3Q29uZmlnLFdlZWtWaWV3Q29uZmlnLFllYXJWaWV3Q29uZmlnLERheUFnZW5kYVZpZXdDb25maWcsTW9udGhBZ2VuZGFWaWV3Q29uZmlnLENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ30gZXZlbnQuY29uZmlnIFRoZSBjb25maWd1cmF0aW9uIGJsb2NrIG9mIHRoZSBtb2RlIGFib3V0IHRvIGJlIGNyZWF0ZWQuIEFueSBwcm9wZXJ0eSwgaW5jbHVkaW5nIHRoZSBgdHlwZWAgbWF5IGJlIGNoYW5nZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ3JlYXRlTW9kZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXIsIGNvbmZpZzogQWdlbmRhVmlld0NvbmZpZ3xEYXlSZXNvdXJjZVZpZXdDb25maWd8RGF5Vmlld0NvbmZpZ3xFdmVudExpc3RDb25maWd8TW9udGhWaWV3Q29uZmlnfFJlc291cmNlVmlld0NvbmZpZ3xXZWVrVmlld0NvbmZpZ3xZZWFyVmlld0NvbmZpZ3xEYXlBZ2VuZGFWaWV3Q29uZmlnfE1vbnRoQWdlbmRhVmlld0NvbmZpZ3xDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIENTViBleHBvcnQgc3RhcnRzLiBSZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGV4cG9ydC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtFeHBvcnRDb25maWd9IGV2ZW50LmNvbmZpZyBFeHBvcnQgY29uZmlnXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW5bXX0gZXZlbnQuY29sdW1ucyBBbiBhcnJheSBvZiBjb2x1bW5zIHRvIGV4cG9ydFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnJvd3MgQW4gYXJyYXkgb2YgcmVjb3JkcyB0byBleHBvcnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQubGluZURlbGltaXRlciBUaGUgQ1NWIGRlbGltaXRlciB0byBzZXBhcmF0ZSBsaW5lc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5jb2x1bW5EZWxpbWl0ZXIgVGhlIENTViBkZWxpbWl0ZXIgdG8gc2VwYXJhdGUgdmFsdWVzIG9uIG9uZSBsaW5lXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ1NWRXhwb3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY29uZmlnOiBFeHBvcnRDb25maWcsIGNvbHVtbnM6IENvbHVtbltdLCByb3dzOiBNb2RlbFtdLCBsaW5lRGVsaW1pdGVyOiBzdHJpbmcsIGNvbHVtbkRlbGltaXRlcjogc3RyaW5nIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5CYXNlfSBldmVudC5zb3VyY2UgVGhlIE9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVEZXN0cm95OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgQ2FsZW5kYXIgYmVmb3JlIGEgZHJhZyBjcmVhdGlvbiBnZXN0dXJlIGlzIHN0YXJ0ZWQuIFJldHVybiBgZmFsc2VgIHRvXG4gICAgICogdmV0byB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ2FsZW5kYXIgaW5zdGFuY2UgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtDb3JlLnV0aWwuZHJhZy5EcmFnQ29udGV4dH0gZXZlbnQuZHJhZyBUaGUgZHJhZyBjcmVhdGUgY29udGV4dC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgYXQgdGhlIGRyYWcgRE9NIGV2ZW50IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSBgUmVzb3VyY2VNb2RlbGAgcmVjb3JkIGlmIHRoZSBnZXN0dXJlIHdhcyBwZXJmb3JtZWQgaW4gYSByZXNvdXJjZS10eXBlIHZpZXcuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhci5mZWF0dXJlLkNhbGVuZGFyRHJhZ30gZXZlbnQuZmVhdHVyZSBUaGUgQ2FsZW5kYXIgZHJhZyBmZWF0dXJlIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC52aWV3IFRoZSBDYWxlbmRhciB3aWRnZXQgaW4gd2hpY2ggdGhlIGRyYWcgaXMgYmVpbmcgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVEcmFnQ3JlYXRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgZHJhZzogRHJhZ0NvbnRleHQsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ/OiBSZXNvdXJjZU1vZGVsLCBmZWF0dXJlOiBDYWxlbmRhckRyYWcsIHZpZXc6IENhbGVuZGFyVmlldyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBDYWxlbmRhciBiZWZvcmUgYSBkcmFnIGNyZWF0aW9uIGdlc3R1cmUgaXMgY29tcGxldGVkLiBSZXR1cm4gYGZhbHNlYCB0b1xuICAgICAqIGltbWVkaWF0ZWx5IHZldG8gdGhlIG9wZXJhdGlvbiBvciBhIFByb21pc2UgeWllbGRpbmcgYHRydWVgIG9yIGBmYWxzZWAgZm9yIGFzeW5jIHZldG9pbmcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXIudmlldy5DYWxlbmRhcn0gZXZlbnQuc291cmNlIFRoZSBDYWxlbmRhciBpbnN0YW5jZSB0aGF0IGZpcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0NvcmUudXRpbC5kcmFnLkRyYWdDb250ZXh0fSBldmVudC5kcmFnIFRoZSBkcmFnIGNyZWF0ZSBjb250ZXh0LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBicm93c2VyIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBgRXZlbnRNb2RlbGAgcmVjb3JkIGJlaW5nIGNyZWF0ZWQgdGhhdCBoYXMgbm90IHlldCBiZWVuIGFkZGVkIGluIHRoZSBzdG9yZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm5ld1N0YXJ0RGF0ZSBUaGUgbmV3IHN0YXJ0IGRhdGUuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5uZXdFbmREYXRlIFRoZSBuZXcgZW5kIGRhdGUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIGBSZXNvdXJjZU1vZGVsYCByZWNvcmQgaWYgdGhlIGdlc3R1cmUgd2FzIHBlcmZvcm1lZCBpbiBhIHJlc291cmNlLXR5cGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLmZlYXR1cmUuQ2FsZW5kYXJEcmFnfSBldmVudC5mZWF0dXJlIFRoZSBDYWxlbmRhciBkcmFnIGZlYXR1cmUgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtib29sZWFuLFZhbGlkYXRlQ3JlYXRlUmVzdWx0fSBldmVudC52YWxpZGF0aW9uIFRoZSByZXN1bHQgb2YgdGhlIFt2YWxpZGF0ZUNyZWF0ZUZuXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvQ2FsZW5kYXJEcmFnI2NvbmZpZy12YWxpZGF0ZUNyZWF0ZUZuKSBpZiBvbmUgd2FzIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC52aWV3IFRoZSBDYWxlbmRhciB3aWRnZXQgaW4gd2hpY2ggdGhlIGRyYWcgY29tcGxldGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURyYWdDcmVhdGVFbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyLCBkcmFnOiBEcmFnQ29udGV4dCwgZXZlbnQ6IEV2ZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgbmV3U3RhcnREYXRlOiBEYXRlLCBuZXdFbmREYXRlOiBEYXRlLCByZXNvdXJjZVJlY29yZD86IFJlc291cmNlTW9kZWwsIGZlYXR1cmU6IENhbGVuZGFyRHJhZywgdmFsaWRhdGlvbjogYm9vbGVhbnxWYWxpZGF0ZUNyZWF0ZVJlc3VsdCwgdmlldzogQ2FsZW5kYXJWaWV3IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIENhbGVuZGFyIGJlZm9yZSBhIGRyYWcgbW92ZSBnZXN0dXJlIGlzIHN0YXJ0ZWQuIFJldHVybiBgZmFsc2VgIHRvXG4gICAgICogdmV0byB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ2FsZW5kYXIgaW5zdGFuY2UgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtDb3JlLnV0aWwuZHJhZy5EcmFnQ29udGV4dH0gZXZlbnQuZHJhZyBUaGUgZHJhZyBtb3ZlIGNvbnRleHQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIGBFdmVudE1vZGVsYCByZWNvcmQgYmVpbmcgbW92ZWQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIGF0IHRoZSBkcmFnIERPTSBldmVudCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgYFJlc291cmNlTW9kZWxgIHJlY29yZCBpZiB0aGUgZ2VzdHVyZSB3YXMgcGVyZm9ybWVkIGluIGEgcmVzb3VyY2UtdHlwZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXIuZmVhdHVyZS5DYWxlbmRhckRyYWd9IGV2ZW50LmZlYXR1cmUgVGhlIENhbGVuZGFyIGRyYWcgZmVhdHVyZSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQudmlldyBUaGUgQ2FsZW5kYXIgd2lkZ2V0IGluIHdoaWNoIHRoZSBkcmFnIGlzIGJlaW5nIHN0YXJ0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRHJhZ01vdmU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyLCBkcmFnOiBEcmFnQ29udGV4dCwgZG9tRXZlbnQ6IEV2ZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgZGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ/OiBSZXNvdXJjZU1vZGVsLCBmZWF0dXJlOiBDYWxlbmRhckRyYWcsIHZpZXc6IENhbGVuZGFyVmlldyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBDYWxlbmRhciBiZWZvcmUgYSBkcmFnIG1vdmUgZ2VzdHVyZSBpcyBjb21wbGV0ZWQuIFJldHVybiBgZmFsc2VgIHRvIGltbWVkaWF0ZWx5IHZldG8gdGhlIG9wZXJhdGlvblxuICAgICAqIG9yIGEgUHJvbWlzZSB5aWVsZGluZyBgdHJ1ZWAgb3IgYGZhbHNlYCBmb3IgYXN5bmMgdmV0b2luZy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhlIENhbGVuZGFyIGluc3RhbmNlIHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7Q29yZS51dGlsLmRyYWcuRHJhZ0NvbnRleHR9IGV2ZW50LmRyYWcgVGhlIGRyYWcgY3JlYXRlIGNvbnRleHQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIGBFdmVudE1vZGVsYCByZWNvcmQgdGhhdCBoYXMgKm5vdCB5ZXQgYmVlbiB1cGRhdGVkKiBpbiB0aGUgc3RvcmUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQucHJveHlFdmVudFJlY29yZCBUaGUgYEV2ZW50TW9kZWxgIHJlY29yZCB0aGF0IGlzIGJlaW5nIHVzZWQgYXMgYSBwcm94eSBmb3IgdGhlIGRyYWcgb3BlcmF0aW9uIGFuZCBiZWluZyB1cGRhdGVkIG9uIGV2ZXJ5IHBvaW50ZXIgbW92ZS4gVGhpcyB3aWxsIGNvbnRhaW4gY2hhbmdlZCB2YWx1ZXMgYmFzZWQgb24gdGhlIGRyYWcgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5uZXdTdGFydERhdGUgVGhlIG5ldyBzdGFydCBkYXRlLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQubmV3RW5kRGF0ZSBUaGUgbmV3IGVuZCBkYXRlLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSBgUmVzb3VyY2VNb2RlbGAgcmVjb3JkIGlmIHRoZSBnZXN0dXJlIHdhcyBwZXJmb3JtZWQgaW4gYSByZXNvdXJjZS10eXBlIHZpZXcuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhci5mZWF0dXJlLkNhbGVuZGFyRHJhZ30gZXZlbnQuZmVhdHVyZSBUaGUgQ2FsZW5kYXIgZHJhZyBmZWF0dXJlIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixWYWxpZGF0ZUNyZWF0ZVJlc3VsdH0gZXZlbnQudmFsaWRhdGlvbiBUaGUgcmVzdWx0IG9mIHRoZSBbdmFsaWRhdGVNb3ZlRm5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9DYWxlbmRhckRyYWcjY29uZmlnLXZhbGlkYXRlTW92ZUZuKSBpZiBvbmUgd2FzIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC52aWV3IFRoZSBDYWxlbmRhciB3aWRnZXQgaW4gd2hpY2ggdGhlIGRyYWcgY29tcGxldGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURyYWdNb3ZlRW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgZHJhZzogRHJhZ0NvbnRleHQsIGV2ZW50OiBFdmVudCwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHByb3h5RXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIG5ld1N0YXJ0RGF0ZTogRGF0ZSwgbmV3RW5kRGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ/OiBSZXNvdXJjZU1vZGVsLCBmZWF0dXJlOiBDYWxlbmRhckRyYWcsIHZhbGlkYXRpb246IGJvb2xlYW58VmFsaWRhdGVDcmVhdGVSZXN1bHQsIHZpZXc6IENhbGVuZGFyVmlldyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBDYWxlbmRhciBiZWZvcmUgYSBkcmFnIHJlc2l6ZSBnZXN0dXJlIGlzIHN0YXJ0ZWQuIFJldHVybiBgZmFsc2VgIHRvXG4gICAgICogdmV0byB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ2FsZW5kYXIgaW5zdGFuY2UgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtDb3JlLnV0aWwuZHJhZy5EcmFnQ29udGV4dH0gZXZlbnQuZHJhZyBUaGUgZHJhZyByZXNpemUgY29udGV4dC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgYEV2ZW50TW9kZWxgIHJlY29yZCBiZWluZyByZXNpemVkLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBhdCB0aGUgZHJhZyBET00gZXZlbnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIGBSZXNvdXJjZU1vZGVsYCByZWNvcmQgaWYgdGhlIGdlc3R1cmUgd2FzIHBlcmZvcm1lZCBpbiBhIHJlc291cmNlLXR5cGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLmZlYXR1cmUuQ2FsZW5kYXJEcmFnfSBldmVudC5mZWF0dXJlIFRoZSBDYWxlbmRhciBkcmFnIGZlYXR1cmUgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnZpZXcgVGhlIENhbGVuZGFyIHdpZGdldCBpbiB3aGljaCB0aGUgZHJhZyBpcyBiZWluZyBzdGFydGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURyYWdSZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyLCBkcmFnOiBEcmFnQ29udGV4dCwgZG9tRXZlbnQ6IEV2ZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgZGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ/OiBSZXNvdXJjZU1vZGVsLCBmZWF0dXJlOiBDYWxlbmRhckRyYWcsIHZpZXc6IENhbGVuZGFyVmlldyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBDYWxlbmRhciBiZWZvcmUgYSBkcmFnIHJlc2l6ZSBnZXN0dXJlIGlzIGNvbXBsZXRlZC4gUmV0dXJuIGBmYWxzZWAgdG8gaW1tZWRpYXRlbHkgdmV0byB0aGUgb3BlcmF0aW9uXG4gICAgICogb3IgYSBQcm9taXNlIHlpZWxkaW5nIGB0cnVlYCBvciBgZmFsc2VgIGZvciBhc3luYyB2ZXRvaW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ2FsZW5kYXIgaW5zdGFuY2UgdGhhdCBmaXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtDb3JlLnV0aWwuZHJhZy5EcmFnQ29udGV4dH0gZXZlbnQuZHJhZyBUaGUgZHJhZyBjcmVhdGUgY29udGV4dC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgYEV2ZW50TW9kZWxgIHJlY29yZCB0aGF0IGhhcyAqbm90IHlldCBiZWVuIHVwZGF0ZWQqIGluIHRoZSBzdG9yZS5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5wcm94eUV2ZW50UmVjb3JkIFRoZSBgRXZlbnRNb2RlbGAgcmVjb3JkIHRoYXQgaXMgYmVpbmcgdXNlZCBhcyBhIHByb3h5IGZvciB0aGUgZHJhZyBvcGVyYXRpb24gYW5kIGJlaW5nIHVwZGF0ZWQgb24gZXZlcnkgcG9pbnRlciBtb3ZlLiBUaGlzIHdpbGwgY29udGFpbiBjaGFuZ2VkIHZhbHVlcyBiYXNlZCBvbiB0aGUgZHJhZyBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm5ld1N0YXJ0RGF0ZSBUaGUgbmV3IHN0YXJ0IGRhdGUuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5uZXdFbmREYXRlIFRoZSBuZXcgZW5kIGRhdGUuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhci5mZWF0dXJlLkNhbGVuZGFyRHJhZ30gZXZlbnQuZmVhdHVyZSBUaGUgQ2FsZW5kYXIgZHJhZyBmZWF0dXJlIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixWYWxpZGF0ZUNyZWF0ZVJlc3VsdH0gZXZlbnQudmFsaWRhdGlvbiBUaGUgcmVzdWx0IG9mIHRoZSBbdmFsaWRhdGVSZXNpemVGbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0NhbGVuZGFyRHJhZyNjb25maWctdmFsaWRhdGVSZXNpemVGbikgaWYgb25lIHdhcyBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQudmlldyBUaGUgQ2FsZW5kYXIgd2lkZ2V0IGluIHdoaWNoIHRoZSBkcmFnIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVEcmFnUmVzaXplRW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgZHJhZzogRHJhZ0NvbnRleHQsIGV2ZW50OiBFdmVudCwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHByb3h5RXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIG5ld1N0YXJ0RGF0ZTogRGF0ZSwgbmV3RW5kRGF0ZTogRGF0ZSwgZmVhdHVyZTogQ2FsZW5kYXJEcmFnLCB2YWxpZGF0aW9uOiBib29sZWFufFZhbGlkYXRlQ3JlYXRlUmVzdWx0LCB2aWV3OiBDYWxlbmRhclZpZXcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIG9uIHRoZSBvd25pbmcgQ2FsZW5kYXIgd2hlbiBkcm9wcGluZyBhbiBldmVudCBmcm9tIHRoZSBjYWxlbmRhciBvbiB0aGVcbiAgICAgKiBleHRlcm5hbCBzb3VyY2UgPHN0cm9uZz5pZiB0aGUgW2Ryb3BwYWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V4dGVybmFsRXZlbnRTb3VyY2UjY29uZmlnLWRyb3BwYWJsZSkgd2FzIGNvbmZpZ3VyZWQ8L3N0cm9uZz4uIFJldHVybmluZyBgZmFsc2VgXG4gICAgICogcHJldmVudHMgdGhlIGdlc3R1cmUgZnJvbSBiZWluZyBjb21wbGV0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1iZWZvcmVEcm9wRXh0ZXJuYWwpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCByZWNvcmQgYmVpbmcgZHJhZ2dlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmRyb3BPbkNhbGVuZGFyIGB0cnVlYCBpZiB0aGUgZHJvcCBnZXN0dXJlIGlzIG92ZXIgdGhlIGNsaWVudCBDYWxlbmRhci4gVGhpcyBmZWF0dXJlIGFsc28gYWxsb3dzIGRyYWcgKm91dCogb2YgdGhlIENhbGVuZGFyIGFuZCBvbnRvIHRoZSBleHRlcm5hbCBldmVudCBzb3VyY2UgaWYgdGhlIFtkcm9wcGFibGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FeHRlcm5hbEV2ZW50U291cmNlI2NvbmZpZy1kcm9wcGFibGUpIGNvbmZpZyBpcyBzZXQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuaXRlbUVsZW1lbnQgVGhlIGVsZW1lbnQgaW4gd2hpY2ggdGhlIGRyYWcgZ2VzdHVyZSBzdGFydGVkLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRhcmdldEVsZW1lbnQgVGhlIGN1cnJlbnQgb3ZlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBwb2ludGVyIGV2ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZHJhZyBwb2ludC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub3ZlckluZGV4ICpJZiBbZ3JpZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V4dGVybmFsRXZlbnRTb3VyY2UjY29uZmlnLWdyaWQpIHdhcyBzcGVjaWZpZWQqLCB0aGUgaW5kZXggb2YgdGhlIHJvdyBiZWluZyBtb3ZlZCBvdmVyO1xuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5vdmVyUmVjb3JkICpJZiBbZ3JpZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V4dGVybmFsRXZlbnRTb3VyY2UjY29uZmlnLWdyaWQpIHdhcyBzcGVjaWZpZWQqLCB0aGUgcmVjb3JkIGJlaW5nIG1vdmVkIG92ZXI7XG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5pc0Fib3ZlICpJZiBbZ3JpZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0V4dGVybmFsRXZlbnRTb3VyY2UjY29uZmlnLWdyaWQpIHdhcyBzcGVjaWZpZWQqLCBgdHJ1ZWAgaWYgdGhlIHBvaW50ZXIgcG9zaXRpb24gaXMgYWJvdmUgdGhlIGhhbGZ3YXkgbGluZSBvZiB0aGUgb3ZlciByb3cuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5hbHRLZXkgYHRydWVgIGlmIHRoZSBBbHQga2V5IHdhcyBkb3duIHdoZW4gdGhlIGxhc3QgZXZlbnQgd2FzIHByb2Nlc3NlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmN0cmxLZXkgYHRydWVgIGlmIHRoZSBDdHJsIGtleSB3YXMgZG93biB3aGVuIHRoZSBsYXN0IGV2ZW50IHdhcyBwcm9jZXNzZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5tZXRhS2V5IGB0cnVlYCBpZiB0aGUgTWV0YSBrZXkgd2FzIGRvd24gd2hlbiB0aGUgbGFzdCBldmVudCB3YXMgcHJvY2Vzc2VkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuc2hpZnRLZXkgYHRydWVgIGlmIHRoZSBTaGlmdCBrZXkgd2FzIGRvd24gd2hlbiB0aGUgbGFzdCBldmVudCB3YXMgcHJvY2Vzc2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURyb3BFeHRlcm5hbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCBkcm9wT25DYWxlbmRhcjogYm9vbGVhbiwgaXRlbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCwgZG9tRXZlbnQ6IEV2ZW50LCBvdmVySW5kZXg6IG51bWJlciwgb3ZlclJlY29yZDogTW9kZWwsIGlzQWJvdmU6IGJvb2xlYW4sIGFsdEtleTogYm9vbGVhbiwgY3RybEtleTogYm9vbGVhbiwgbWV0YUtleTogYm9vbGVhbiwgc2hpZnRLZXk6IGJvb2xlYW4gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgYW4gZXZlbnQgaXMgcmVtb3ZlZC4gQ2FuIGJlIHRyaWdnZXJlZCBieSB1c2VyIHByZXNzaW5nIFtERUxFVEVdIG9yIFtCQUNLU1BBQ0VdIG9yIGJ5IHRoZVxuICAgICAqIGV2ZW50IGVkaXRvci4gQ2FuIGZvciBleGFtcGxlIGJlIHVzZWQgdG8gZGlzcGxheSBhIGN1c3RvbSBkaWFsb2cgdG8gY29uZmlybSBkZWxldGlvbiwgaW4gd2hpY2ggY2FzZVxuICAgICAqIHJlY29yZHMgc2hvdWxkIGJlIFwibWFudWFsbHlcIiByZW1vdmVkIGFmdGVyIGNvbmZpcm1hdGlvbjpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2V2ZW50LWJlZm9yZUV2ZW50RGVsZXRlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ2FsZW5kYXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50LmV2ZW50UmVjb3JkcyBUaGUgcmVjb3JkcyBhYm91dCB0byBiZSBkZWxldGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNvbnRleHQgQWRkaXRpb25hbCByZW1vdmFsIGNvbnRleHQ6XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXZlbnQuY29udGV4dC5maW5hbGl6ZSBGdW5jdGlvbiB0byBjYWxsIHRvIGZpbmFsaXplIHRoZSByZW1vdmFsLiBVc2VkIHRvIGFzeW5jaHJvbm91c2x5IGRlY2lkZSB0byByZW1vdmUgdGhlIHJlY29yZHMgb3Igbm90LiBQcm92aWRlIGBmYWxzZWAgdG8gdGhlIGZ1bmN0aW9uIHRvIHByZXZlbnQgdGhlIHJlbW92YWwuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb250ZXh0LmZpbmFsaXplLnJlbW92ZVJlY29yZHMgUHJvdmlkZSBgZmFsc2VgIHRvIHRoZSBmdW5jdGlvbiB0byBwcmV2ZW50IHRoZSByZW1vdmFsLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUV2ZW50RGVsZXRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgZXZlbnRSZWNvcmRzOiBFdmVudE1vZGVsW10sIGNvbnRleHQ6IHsgZmluYWxpemU6IHsgcmVtb3ZlUmVjb3Jkcz86IGJvb2xlYW4gfSB9IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYmVmb3JlIGFuIGV2ZW50IGlzIGRpc3BsYXllZCBpbiBhbiBlZGl0b3IuXG4gICAgICogVGhpcyBtYXkgYmUgbGlzdGVuZWQgZm9yIHRvIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIHRha2Ugb3ZlciBldmVudCBlZGl0aW5nIGR1dGllcy4gUmV0dXJuaW5nIGBmYWxzZWBcbiAgICAgKiBzdG9wcyB0aGUgZGVmYXVsdCBlZGl0aW5nIFVJIGZyb20gYmVpbmcgc2hvd24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1iZWZvcmVFdmVudEVkaXQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgVGhlIHNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmZlYXR1cmUuU2NoZWR1bGVyRXZlbnRFZGl0fSBldmVudC5ldmVudEVkaXQgVGhlIGV2ZW50RWRpdCBmZWF0dXJlXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIHJlY29yZCBhYm91dCB0byBiZSBzaG93biBpbiB0aGUgZXZlbnQgZWRpdG9yLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSBSZXNvdXJjZSByZWNvcmQgZm9yIHRoZSBldmVudC4gSWYgdGhlIGV2ZW50IGlzIGJlaW5nIGNyZWF0ZWQsIGl0IHdpbGwgbm90IGNvbnRhaW4gYSByZXNvdXJjZSwgc28gdGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZXNvdXJjZSB0aGUgZXZlbnQgaXMgYmVpbmcgY3JlYXRlZCBmb3IuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50IGluIHRoZSBzY2hlZHVsZXIgZGlzcGxheS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVFdmVudEVkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgZXZlbnRFZGl0OiBTY2hlZHVsZXJFdmVudEVkaXQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZXZlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgU2NoZWR1bGVyIHdoZW4gdGhlIGVkaXRvciBmb3IgYW4gZXZlbnQgaXMgYXZhaWxhYmxlIGJ1dCBiZWZvcmUgaXQgaXMgcG9wdWxhdGVkIHdpdGhcbiAgICAgKiBkYXRhIGFuZCBzaG93bi4gQWxsb3dzIG1hbmlwdWxhdGluZyBmaWVsZHMgZXRjLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoZSBzY2hlZHVsZXJcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5mZWF0dXJlLlNjaGVkdWxlckV2ZW50RWRpdH0gZXZlbnQuZXZlbnRFZGl0IFRoZSBldmVudEVkaXQgZmVhdHVyZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSByZWNvcmQgYWJvdXQgdG8gYmUgc2hvd24gaW4gdGhlIGV2ZW50IGVkaXRvci5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgUmVzb3VyY2UgcmVjb3JkIGZvciB0aGUgZXZlbnQuIElmIHRoZSBldmVudCBpcyBiZWluZyBjcmVhdGVkLCBpdCB3aWxsIG5vdCBjb250YWluIGEgcmVzb3VyY2UsIHNvIHRoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgcmVzb3VyY2UgdGhlIGV2ZW50IGlzIGJlaW5nIGNyZWF0ZWQgZm9yLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmV2ZW50RWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCByZXByZXNlbnRzIHRoZSBldmVudCBpbiB0aGUgc2NoZWR1bGVyIGRpc3BsYXkuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Qb3B1cH0gZXZlbnQuZWRpdG9yIFRoZSBlZGl0b3JcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVFdmVudEVkaXRTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGV2ZW50RWRpdDogU2NoZWR1bGVyRXZlbnRFZGl0LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGV2ZW50RWxlbWVudDogSFRNTEVsZW1lbnQsIGVkaXRvcjogUG9wdXAgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgU2NoZWR1bGVyIGJlZm9yZSBhbiBldmVudCBpcyBzYXZlZC5cbiAgICAgKiBSZXR1cm4gYGZhbHNlYCB0byBpbW1lZGlhdGVseSBwcmV2ZW50IHNhdmluZ1xuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtYmVmb3JlRXZlbnRTYXZlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoZSBzY2hlZHVsZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgcmVjb3JkIGFib3V0IHRvIGJlIHNhdmVkXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbFtdfSBldmVudC5yZXNvdXJjZVJlY29yZHMgVGhlIHJlc291cmNlcyB0byB3aGljaCB0aGUgZXZlbnQgaXMgYXNzaWduZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQudmFsdWVzIFRoZSBuZXcgdmFsdWVzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNvbnRleHQgRXh0ZW5kZWQgc2F2ZSBjb250ZXh0OlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29udGV4dC5hc3luYyBTZXQgdGhpcyB0byBgdHJ1ZWAgaW4gYSBsaXN0ZW5lciB0byBpbmRpY2F0ZSB0aGF0IHRoZSBsaXN0ZW5lciB3aWxsIGFzeW5jaHJvbm91c2x5IGRlY2lkZSB0byBwcmV2ZW50IG9yIG5vdCB0aGUgZXZlbnQgc2F2ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBldmVudC5jb250ZXh0LmZpbmFsaXplIEZ1bmN0aW9uIHRvIGNhbGwgdG8gZmluYWxpemUgdGhlIHNhdmUuIFVzZWQgd2hlbiBgYXN5bmNgIGlzIGB0cnVlYC4gUHJvdmlkZSBgZmFsc2VgIHRvIHRoZSBmdW5jdGlvbiB0byBwcmV2ZW50IHRoZSBzYXZlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUV2ZW50U2F2ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmRzOiBSZXNvdXJjZU1vZGVsW10sIHZhbHVlczogb2JqZWN0LCBjb250ZXh0OiB7IGFzeW5jPzogYm9vbGVhbiwgZmluYWxpemU6IEZ1bmN0aW9uIH0gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBhbnkgdGltZSB0aGVyZSBpcyBnb2luZyB0byBiZSBhIGNoYW5nZSB0byB0aGUgZXZlbnRzIHNlbGVjdGVkIGluIHRoZSBTY2hlZHVsZXIuXG4gICAgICogUmV0dXJuaW5nIGBmYWxzZWAgcHJldmVudHMgdGhlIGNoYW5nZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFRoaXMgU2NoZWR1bGVyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7J3NlbGVjdCcsJ2Rlc2VsZWN0JywndXBkYXRlJywnY2xlYXInfSBldmVudC5hY3Rpb24gT25lIG9mIHRoZSBhY3Rpb25zICdzZWxlY3QnLCAnZGVzZWxlY3QnLCAndXBkYXRlJywgJ2NsZWFyJ1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuc2VsZWN0ZWQgQW4gYXJyYXkgb2YgZXZlbnRzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuZGVzZWxlY3RlZCBBbiBhcnJheSBvZiBldmVudHMgdGhhdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuc2VsZWN0aW9uIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZXZlbnRzLCBiZWZvcmUgYXBwbHlpbmcgYHNlbGVjdGVkYCBhbmQgYGRlc2VsZWN0ZWRgLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUV2ZW50U2VsZWN0aW9uQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGFjdGlvbjogJ3NlbGVjdCd8J2Rlc2VsZWN0J3wndXBkYXRlJ3wnY2xlYXInLCBzZWxlY3RlZDogRXZlbnRNb2RlbFtdLCBkZXNlbGVjdGVkOiBFdmVudE1vZGVsW10sIHNlbGVjdGlvbjogRXZlbnRNb2RlbFtdIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBFeGNlbCBleHBvcnQgc3RhcnRzLiBSZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGV4cG9ydC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtFeHBvcnRDb25maWd9IGV2ZW50LmNvbmZpZyBFeHBvcnQgY29uZmlnXG4gICAgICogQHBhcmFtIHtYTFNDb2x1bW5bXX0gZXZlbnQuY29sdW1ucyBBbiBhcnJheSBvZiBjb2x1bW5zIHRvIGV4cG9ydFxuICAgICAqIEBwYXJhbSB7YW55W11bXX0gZXZlbnQucm93cyBBbiBhcnJheSBvZiByZWNvcmRzIHRvIGV4cG9ydFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUV4Y2VsRXhwb3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY29uZmlnOiBFeHBvcnRDb25maWcsIGNvbHVtbnM6IFhMU0NvbHVtbltdLCByb3dzOiBhbnlbXSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBiZWZvcmUgYSB3aWRnZXQgaXMgaGlkZGVuLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBoaWRkZW4uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlSGlkZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYmVmb3JlIGEgcGFzdGUgYWN0aW9uIGlzIHBlcmZvcm1lZCwgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uLlxuICAgICAqIERlcGVuZGluZyBvbiBpZiB0aGUgRXZlbnRTdG9yZSBpcyB1c2luZyBbc2luZ2xlQXNzaWdubWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9TY2hlZHVsZXIvZGF0YS9FdmVudFN0b3JlI2NvbmZpZy1zaW5nbGVBc3NpZ25tZW50KSBvciB0aGVcbiAgICAgKiBjb25maWd1cmF0aW9uIG9mIFtjb3B5UGFzdGVBY3Rpb25dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL2ZlYXR1cmUvRXZlbnRDb3B5UGFzdGUjY29uZmlnLWNvcHlQYXN0ZUFjdGlvbiksIGVpdGhlciB0aGUgYGV2ZW50UmVjb3Jkc2Agb3IgdGhlIGBhc3NpZ25tZW50UmVjb3Jkc2AgcGFyYW1cbiAgICAgKiB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHJlY29yZCBjb3BpZXMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2UgT3duZXIgc2NoZWR1bGVyXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbFtdfSBldmVudC5ldmVudFJlY29yZHMgVGhlIGV2ZW50cyBhYm91dCB0byBiZSBwYXN0ZWRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5Bc3NpZ25tZW50TW9kZWxbXX0gZXZlbnQuYXNzaWdubWVudFJlY29yZHMgVGhlIGFzc2lnbm1lbnRzIGFib3V0IHRvIGJlIHBhc3RlZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQub3JpZ2luYWxFdmVudFJlY29yZHMgVGhlIG9yaWdpbmFsIGV2ZW50IHJlY29yZHNcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5Bc3NpZ25tZW50TW9kZWxbXX0gZXZlbnQub3JpZ2luYWxBc3NpZ25tZW50UmVjb3JkcyBUaGUgb3JpZ2luYWwgYXNzaWdubWVudCByZWNvcmRcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgd2hlbiB0aGUgcGFzdGVkIGV2ZW50cyB3aWxsIGJlIHNjaGVkdWxlZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSB0YXJnZXQgcmVzb3VyY2UgcmVjb3JkLCB0aGUgY2xpcGJvYXJkIGV2ZW50IHJlY29yZHMgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGlzIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNDdXQgYHRydWVgIGlmIHRoaXMgaXMgYSBjdXQgYWN0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmVudGl0eU5hbWUgJ2V2ZW50JyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgYmVmb3JlUGFzdGUgZXZlbnRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUGFzdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgZXZlbnRSZWNvcmRzOiBFdmVudE1vZGVsW10sIGFzc2lnbm1lbnRSZWNvcmRzOiBBc3NpZ25tZW50TW9kZWxbXSwgb3JpZ2luYWxFdmVudFJlY29yZHM6IEV2ZW50TW9kZWxbXSwgb3JpZ2luYWxBc3NpZ25tZW50UmVjb3JkczogQXNzaWdubWVudE1vZGVsW10sIGRhdGU6IERhdGUsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBpc0N1dDogYm9vbGVhbiwgZW50aXR5TmFtZTogc3RyaW5nIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBDYWxlbmRhciBiZWZvcmUgcHJpbnQgc3RhcnRzLiBSZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwgdGhlIHByaW50LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29uZmlnIFByaW50IGNvbmZpZ1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVByaW50OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY29uZmlnOiBvYmplY3QgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgbmV3IFtyZXNwb25zaXZlU3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVN0YXRlKSBpcyBhcHBsaWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgd2hvc2UgYHJlc3BvbnNpdmVTdGF0ZWAgaXMgdG8gYmUgY2hhbmdlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5zdGF0ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgd2lkZ2V0J3MgYHJlc3BvbnNpdmVTdGF0ZWBcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQub2xkU3RhdGUgVGhlIHByZXZpb3VzIHZhbHVlIGZvciB0aGUgd2lkZ2V0J3MgYHJlc3BvbnNpdmVTdGF0ZWBcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVSZXNwb25zaXZlU3RhdGVDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgc3RhdGU6IHN0cmluZywgb2xkU3RhdGU6IHN0cmluZyB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIHRoaXMgY29udGFpbmVyIHdpbGwgbG9hZCByZWNvcmQgdmFsdWVzIGludG8gaXRzIGNoaWxkIGZpZWxkcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91XG4gICAgICogd2FudCB0byBtb2RpZnkgdGhlIFVJIGJlZm9yZSBkYXRhIGlzIGxvYWRlZCAoZS5nLiBzZXQgc29tZSBpbnB1dCBmaWVsZCB0byBiZSByZWFkb25seSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Db250YWluZXJ9IGV2ZW50LnNvdXJjZSBUaGUgY29udGFpbmVyXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU2V0UmVjb3JkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDb250YWluZXIsIHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBiZWZvcmUgYSB3aWRnZXQgaXMgc2hvd24uIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXQsYW55fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBzaG93blxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldHxhbnkgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgc3RhdGUgaXMgYXBwbGllZCB0byB0aGUgc291cmNlLiBBbGxvd3MgZWRpdGluZyB0aGUgc3RhdGUgb2JqZWN0IG9yIHByZXZlbnRpbmcgdGhlIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHthbnl9IGV2ZW50LnN0YXRlIFN0YXRlIG9iamVjdCBjb25maWdcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTdGF0ZUFwcGx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc3RhdGU6IGFueSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBzdGF0ZSBpcyBzYXZlZCBieSB0aGUgU3RhdGVQcm92aWRlci4gQWxsb3dzIGVkaXRpbmcgdGhlIHN0YXRlIG9iamVjdCBvciBwcmV2ZW50aW5nIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudC5zdGF0ZSBTdGF0ZSBvYmplY3QgY29uZmlnXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU3RhdGVTYXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc3RhdGU6IGFueSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW55IG90aGVyIGV2ZW50IGlzIGZpcmVkIGZyb20gdGhlIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2V2ZW50LWNhdGNoQWxsKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3tba2V5OiBzdHJpbmddOiBhbnksIHR5cGU6IHN0cmluZ319IGV2ZW50LmV2ZW50IFRoZSBPYmplY3QgdGhhdCBjb250YWlucyBldmVudCBkZXRhaWxzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmV2ZW50LnR5cGUgVGhlIHR5cGUgb2YgdGhlIGV2ZW50IHdoaWNoIGlzIGNhdWdodCBieSB0aGUgbGlzdGVuZXJcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DYXRjaEFsbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7W2tleTogc3RyaW5nXTogYW55LCB0eXBlOiBzdHJpbmd9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGNlbGwgb3ZlcmZsb3cgaW5kaWNhdG9yIGlzIGNsaWNrZWQgb3IgYWN0aXZhdGVkIGJ5IHRoZSA8a2JkPkVOVEVSPC9rYmQ+IGtleSBpbiBhbnkgdmlldy4gVGhpcyB3aWxsIGluY2x1ZGVcbiAgICAgKiB0aGUgY2VsbHMgb2YgYSBbWWVhclZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L1llYXJWaWV3KSBhbmQgdGhlIGArIG4gbW9yZWAgb3ZlcmZsb3dcbiAgICAgKiBpbmRpY2F0b3Igb2YgY2VsbHMgaW4gYSBbTW9udGhWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcpLCBhbmQgXCJhbGwgZGF5XCIgZXZlbnRzIHNlY3Rpb25cbiAgICAgKiBvZiBhIFtEYXlWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9EYXlWaWV3KS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgY2xpY2tlZCBvbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsT3ZlcmZsb3dDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBQYW5lbCBpcyBjb2xsYXBzZWQgdXNpbmcgdGhlIFtjb2xsYXBzaWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2libGUpIHNldHRpbmcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuUGFuZWx9IGV2ZW50LnNvdXJjZSBUaGlzIFBhbmVsLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbGxhcHNlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBQYW5lbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIHdpZGdldCB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQgaW4gdGhlIGNvbnRleHQgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgb3duaW5nIHdpZGdldFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudUl0ZW19IGV2ZW50Lml0ZW0gU2VsZWN0ZWQgbWVudSBpdGVtXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29udGV4dE1lbnVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgd2lkZ2V0IHdoZW4gYSBjaGVjayBpdGVtIGlzIHRvZ2dsZWQgaW4gdGhlIGNvbnRleHQgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgb3duaW5nIHdpZGdldFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudUl0ZW19IGV2ZW50Lml0ZW0gU2VsZWN0ZWQgbWVudSBpdGVtXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jaGVja2VkIENoZWNrZWQgb3Igbm90XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29udGV4dE1lbnVUb2dnbGVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtLCBjaGVja2VkOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBhZnRlciBhIGNvcHkgYWN0aW9uIGlzIHBlcmZvcm1lZC4gRGVwZW5kaW5nIG9uIGlmIHRoZSBFdmVudFN0b3JlIGlzIHVzaW5nXG4gICAgICogW3NpbmdsZUFzc2lnbm1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL2RhdGEvRXZlbnRTdG9yZSNjb25maWctc2luZ2xlQXNzaWdubWVudCkgb3IgdGhlIGNvbmZpZ3VyYXRpb24gb2ZcbiAgICAgKiBbY29weVBhc3RlQWN0aW9uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9mZWF0dXJlL0V2ZW50Q29weVBhc3RlI2NvbmZpZy1jb3B5UGFzdGVBY3Rpb24pLCBlaXRoZXIgdGhlIGBldmVudFJlY29yZHNgIG9yIHRoZSBgYXNzaWdubWVudFJlY29yZHNgIHBhcmFtIHdpbGwgYmUgcG9wdWxhdGVkXG4gICAgICogd2l0aCByZWNvcmQgY29waWVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIE93bmVyIHNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuZXZlbnRSZWNvcmRzIFRoZSBldmVudCByZWNvcmQgY29waWVzXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuQXNzaWdubWVudE1vZGVsW119IGV2ZW50LmFzc2lnbm1lbnRSZWNvcmRzIFRoZSBhc3NpZ25tZW50IHJlY29yZCBjb3BpZXNcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50Lm9yaWdpbmFsRXZlbnRSZWNvcmRzIFRoZSBldmVudCByZWNvcmRzIHRoYXQgd2VyZSBjb3BpZWRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5Bc3NpZ25tZW50TW9kZWxbXX0gZXZlbnQub3JpZ2luYWxBc3NpZ25tZW50UmVjb3JkIFRoZSBhc3NpZ25tZW50IHJlY29yZHMgdGhhdCB3ZXJlIGNvcGllZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNDdXQgYHRydWVgIGlmIHRoaXMgaXMgYSBjdXQgYWN0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmVudGl0eU5hbWUgJ2V2ZW50JyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgY29weSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db3B5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGV2ZW50UmVjb3JkczogRXZlbnRNb2RlbFtdLCBhc3NpZ25tZW50UmVjb3JkczogQXNzaWdubWVudE1vZGVsW10sIG9yaWdpbmFsRXZlbnRSZWNvcmRzOiBFdmVudE1vZGVsW10sIG9yaWdpbmFsQXNzaWdubWVudFJlY29yZDogQXNzaWdubWVudE1vZGVsW10sIGlzQ3V0OiBib29sZWFuLCBlbnRpdHlOYW1lOiBzdHJpbmcgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgU2NoZWR1bGVyL0dhbnR0IHdoZW4gdGhlIGxpbmUgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lIGlzIHVwZGF0ZWQgKHNlZSBbY3VycmVudFRpbWVMaW5lVXBkYXRlSW50ZXJ2YWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL2ZlYXR1cmUvVGltZVJhbmdlcyNjb25maWctY3VycmVudFRpbWVMaW5lVXBkYXRlSW50ZXJ2YWwpKS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5TY2hlZHVsZXJ9IGV2ZW50LnNvdXJjZSBUaGUgc2NoZWR1bGVyXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBjdXJyZW50IGRhdGVcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DdXJyZW50VGltZWxpbmVVcGRhdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgZGF0ZTogRGF0ZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBkYXRhIGluIGFueSBvZiB0aGUgcHJvamVjdHMgc3RvcmVzIGNoYW5nZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1kYXRhQ2hhbmdlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3R5cGVvZiBTY2hlZHVsZXIuZGF0YS5taXhpbi5Qcm9qZWN0Q29uc3VtZXIsYW55fSBldmVudC5zb3VyY2UgT3duaW5nIGNvbXBvbmVudFxuICAgICAqIEBwYXJhbSB7dHlwZW9mIFNjaGVkdWxlci5tb2RlbC5taXhpbi5Qcm9qZWN0TW9kZWxNaXhpbixhbnl9IGV2ZW50LnByb2plY3QgUHJvamVjdCBtb2RlbFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLlN0b3JlfSBldmVudC5zdG9yZSBBZmZlY3RlZCBzdG9yZVxuICAgICAqIEBwYXJhbSB7J3JlbW92ZScsJ3JlbW92ZUFsbCcsJ2FkZCcsJ2NsZWFyY2hhbmdlcycsJ2ZpbHRlcicsJ3VwZGF0ZScsJ2RhdGFzZXQnLCdyZXBsYWNlJ30gZXZlbnQuYWN0aW9uIE5hbWUgb2YgYWN0aW9uIHdoaWNoIHRyaWdnZXJlZCB0aGUgY2hhbmdlLiBNYXkgYmUgb25lIG9mOiAgKiBgJ3JlbW92ZSdgICogYCdyZW1vdmVBbGwnYCAqIGAnYWRkJ2AgKiBgJ2NsZWFyY2hhbmdlcydgICogYCdmaWx0ZXInYCAqIGAndXBkYXRlJ2AgKiBgJ2RhdGFzZXQnYCAqIGAncmVwbGFjZSdgXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBDaGFuZ2VkIHJlY29yZCwgZm9yIGFjdGlvbnMgdGhhdCBhZmZlY3RzIGV4YWN0bHkgb25lIHJlY29yZCAoYCd1cGRhdGUnYClcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5yZWNvcmRzIENoYW5nZWQgcmVjb3JkcywgcGFzc2VkIGZvciBhbGwgYWN0aW9ucyBleGNlcHQgYCdyZW1vdmVBbGwnYFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jaGFuZ2VzIFBhc3NlZCBmb3IgdGhlIGAndXBkYXRlJ2AgYWN0aW9uLCBpbmZvIG9uIHdoaWNoIHJlY29yZCBmaWVsZHMgY2hhbmdlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRhdGFDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IHR5cGVvZiBQcm9qZWN0Q29uc3VtZXJ8YW55LCBwcm9qZWN0OiB0eXBlb2YgUHJvamVjdE1vZGVsTWl4aW58YW55LCBzdG9yZTogU3RvcmUsIGFjdGlvbjogJ3JlbW92ZSd8J3JlbW92ZUFsbCd8J2FkZCd8J2NsZWFyY2hhbmdlcyd8J2ZpbHRlcid8J3VwZGF0ZSd8J2RhdGFzZXQnfCdyZXBsYWNlJywgcmVjb3JkOiBNb2RlbCwgcmVjb3JkczogTW9kZWxbXSwgY2hhbmdlczogb2JqZWN0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHRoZSBjYWxlbmRhciBjaGFuZ2VzIHRoZSBkYXRlIHRoYXQgaXQgb3JpZW50YXRlcyBpdHMgdmlld3MgYXJvdW5kLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtZGF0ZUNoYW5nZSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhpcyBDYWxlbmRhci5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZERhdGUgVGhlIHByZXZpb3VzIENhbGVuZGFyIGRhdGUuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBuZXcgQ2FsZW5kYXIgZGF0ZS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EYXRlQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgb2xkRGF0ZTogRGF0ZSwgZGF0ZTogRGF0ZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgZXZlbnRTdG9yZSBpcyBxdWVyaWVkIGZvciBldmVudHMgYnkgZGF0ZSByYW5nZSwgYW5kIHRoZSBkYXRlIHJhbmdlXG4gICAgICogcmVxdWVzdGVkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IHRpbWUgdGhlIHN0b3JlIHdhcyBxdWVyaWVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtZGF0ZVJhbmdlQ2hhbmdlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLnZpZXcuQ2FsZW5kYXJ9IGV2ZW50LnNvdXJjZSBUaGlzIENhbGVuZGFyIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50Lm9sZCBUaGUgb2xkIGRhdGUgcmFuZ2VcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZC5zdGFydERhdGUgdGhlIG9sZCBzdGFydCBkYXRlXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5vbGQuZW5kRGF0ZSB0aGUgb2xkIGVuZCBkYXRlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50Lm5ldyBUaGUgbmV3IGRhdGUgcmFuZ2VcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm5ldy5zdGFydERhdGUgdGhlIG5ldyBzdGFydCBkYXRlXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5uZXcuZW5kRGF0ZSB0aGUgbmV3IGVuZCBkYXRlXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGF0ZVJhbmdlQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgb2xkOiB7IHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSB9LCBuZXc6IHsgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlIH0gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhlIFtMb2FkT25EZW1hbmRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9Mb2FkT25EZW1hbmQpIGZlYXR1cmUgaGFzIGxvYWRlZCBhIHJhbmdlIG9mIGV2ZW50cy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIEpTT04gcmVzcG9uc2UuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50Lm9wdGlvbnMgVGhlIG9wdGlvbnMgb2JqZWN0IHBhc3NlZCBpbnRvIHRoZSBDcnVkTWFuYWdlciBbQ3J1ZE1hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL2RhdGEvQ3J1ZE1hbmFnZXIpIFtsb2FkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1sb2FkKSBtZXRob2QuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5zdGFydERhdGUgVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHJhbmdlIHRvIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5lbmREYXRlIFRoZSBlbmQgZGF0ZSBvZiB0aGUgcmFuZ2UgdG8gcmVxdWVzdC4gPHN0cm9uZz5Ob3RlIHRoYXQgRGF0ZXMgYXJlIHRpbWVzdGFtcHM8L3N0cm9uZz4uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGF0ZVJhbmdlTG9hZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlc3BvbnNlOiBvYmplY3QsIG9wdGlvbnM6IG9iamVjdCwgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCA8c3Ryb25nPmV2ZXJ5PC9zdHJvbmc+IHRpbWUgdGhlIGV2ZW50U3RvcmUgaXMgcXVlcmllZCBmb3IgZXZlbnRzIGJ5IGRhdGUgcmFuZ2UuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1kYXRlUmFuZ2VSZXF1ZXN0ZWQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXIudmlldy5DYWxlbmRhcn0gZXZlbnQuc291cmNlIFRoaXMgQ2FsZW5kYXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQub2xkIFRoZSBvbGQgZGF0ZSByYW5nZVxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQub2xkLnN0YXJ0RGF0ZSB0aGUgb2xkIHN0YXJ0IGRhdGVcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZC5lbmREYXRlIHRoZSBvbGQgZW5kIGRhdGVcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQubmV3IFRoZSBuZXcgZGF0ZSByYW5nZVxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQubmV3LnN0YXJ0RGF0ZSB0aGUgbmV3IHN0YXJ0IGRhdGVcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm5ldy5lbmREYXRlIHRoZSBuZXcgZW5kIGRhdGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNoYW5nZWQgYHRydWVgIGlmIHRoZSBkYXRlIHJhbmdlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IHRpbWUgYSByZXF1ZXN0IHdhcyBtYWRlXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGF0ZVJhbmdlUmVxdWVzdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhciwgb2xkOiB7IHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSB9LCBuZXc6IHsgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlIH0sIGNoYW5nZWQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJ5IHRoZSBhY3RpdmUgdmlldyBhZnRlciBvbmUgZGF5IGNlbGwncyBldmVudHMgYXJlIGNvbGxlY3RlZCBpbiBzb3J0ZWQgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZVxuICAgICAqIFtldmVudFNvcnRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctZXZlbnRTb3J0ZXIpXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1kYXlDZWxsUG9wdWxhdGVkKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbFtdfSBldmVudC5ldmVudHMgVGhlIGV2ZW50cyB0byBiZSBzaG93biBmb3IgdGhlIHBhc3NlZCBkYXRlXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5UaGUgZGF0ZSB0aGUgZXZlbnRzIGFyZSB0byBiZSBzaG93biBpbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EYXlDZWxsUG9wdWxhdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGV2ZW50czogRXZlbnRNb2RlbFtdLCBUaGU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBkYXkgbnVtYmVyIGlzIGNsaWNrZWQgb3IgYWN0aXZhdGVkIGJ5IHRoZSA8a2JkPkVOVEVSPC9rYmQ+IGtleSBpbiBhIHZpZXcgd2hpY2ggc2hvd3MgZGF5IG51bWJlcnMuXG4gICAgICogVGhpcyB3aWxsIGluY2x1ZGUgdGhlIGNlbGxzIG9mIGEgW1llYXJWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9ZZWFyVmlldyksIHRoZSBjZWxsIGhlYWRlciBvZiBjZWxsc1xuICAgICAqIGluIGEgW01vbnRoVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3KSwgYW5kIHRoZSBkYXkgaGVhZGVyIGluIGEgW0RheVZpZXddKCNDYWxlbmRhci93aWRnZXQvRGF5VmlldykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1kYXlOdW1iZXJDbGljaylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgY2xpY2tlZCBvbi5cbiAgICAgKiBAcGFyYW0ge0RheUNlbGx9IGV2ZW50LmNlbGxEYXRhIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGRhdGEgYWJvdXQgdGhlIGNhbGVuZGFyIGNlbGwgZm9yIHRoZSBkYXRlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRheU51bWJlckNsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgY2VsbERhdGE6IERheUNlbGwsIGZyb21PdmVyZmxvd1BvcHVwOiBib29sZWFuIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhbiBvYmplY3QgaXMgZGVzdHJveWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuQmFzZX0gZXZlbnQuc291cmNlIFRoZSBPYmplY3QgdGhhdCBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGVzdHJveTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQmFzZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGZpZWxkIGlzIG11dGF0ZWQgYW5kIHRoZSBzdGF0ZSBvZiB0aGUgW2hhc0NoYW5nZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI3Byb3BlcnR5LWhhc0NoYW5nZXMpIHByb3BlcnR5IGNoYW5nZXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Db250YWluZXJ9IGV2ZW50LnNvdXJjZSBUaGUgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZGlydHkgVGhlIGRpcnR5IHN0YXRlIG9mIHRoZSBDb250YWluZXIgLSBgdHJ1ZWAgaWYgdGhlcmUgYXJlIGFueSBmaWVsZHMgd2hpY2ggaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgaW5pdGlhbCBsb2FkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRpcnR5U3RhdGVDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENvbnRhaW5lciwgZGlydHk6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBDYWxlbmRhciB3aGVuIGEgZHJhZyBjcmVhdGlvbiBnZXN0dXJlIGlzIGNvbXBsZXRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhlIENhbGVuZGFyIGluc3RhbmNlIHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7Q29yZS51dGlsLmRyYWcuRHJhZ0NvbnRleHR9IGV2ZW50LmRyYWcgVGhlIGRyYWcgY3JlYXRlIGNvbnRleHQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIG5ldyBgRXZlbnRNb2RlbGAgcmVjb3JkIGFkZGVkIGluIHRoZSBzdG9yZS5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgYFJlc291cmNlTW9kZWxgIHJlY29yZCBpZiB0aGUgZ2VzdHVyZSB3YXMgcGVyZm9ybWVkIGluIGEgcmVzb3VyY2UtdHlwZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXIuZmVhdHVyZS5DYWxlbmRhckRyYWd9IGV2ZW50LmZlYXR1cmUgVGhlIENhbGVuZGFyIGRyYWcgZmVhdHVyZSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4sVmFsaWRhdGVDcmVhdGVSZXN1bHR9IGV2ZW50LnZhbGlkYXRpb24gVGhlIHJlc3VsdCBvZiB0aGUgW3ZhbGlkYXRlQ3JlYXRlRm5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9DYWxlbmRhckRyYWcjY29uZmlnLXZhbGlkYXRlQ3JlYXRlRm4pIGlmIG9uZSB3YXMgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnZpZXcgVGhlIENhbGVuZGFyIHdpZGdldCBpbiB3aGljaCB0aGUgZHJhZyBjb21wbGV0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRHJhZ0NyZWF0ZUVuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXIsIGRyYWc6IERyYWdDb250ZXh0LCBldmVudDogRXZlbnQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZD86IFJlc291cmNlTW9kZWwsIGZlYXR1cmU6IENhbGVuZGFyRHJhZywgdmFsaWRhdGlvbjogYm9vbGVhbnxWYWxpZGF0ZUNyZWF0ZVJlc3VsdCwgdmlldzogQ2FsZW5kYXJWaWV3IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgQ2FsZW5kYXIgd2hlbiBhIGRyYWcgbW92ZSBnZXN0dXJlIGlzIGNvbXBsZXRlZC4gVGhlIGBldmVudFJlY29yZGAgaGFzIGFscmVhZHkgYmVlbiBhZGRlZFxuICAgICAqIHRvIHRoZSBgZXZlbnRTdG9yZWAgb2YgdGhlIG93bmluZyBjYWxlbmRhci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhlIENhbGVuZGFyIGluc3RhbmNlIHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7Q29yZS51dGlsLmRyYWcuRHJhZ0NvbnRleHR9IGV2ZW50LmRyYWcgVGhlIGRyYWcgY3JlYXRlIGNvbnRleHQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIHVwZGF0ZWQgYEV2ZW50TW9kZWxgIHJlY29yZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgYFJlc291cmNlTW9kZWxgIHJlY29yZCBpZiB0aGUgZ2VzdHVyZSB3YXMgcGVyZm9ybWVkIGluIGEgcmVzb3VyY2UtdHlwZSB2aWV3LlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXIuZmVhdHVyZS5DYWxlbmRhckRyYWd9IGV2ZW50LmZlYXR1cmUgVGhlIENhbGVuZGFyIGRyYWcgZmVhdHVyZSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4sVmFsaWRhdGVDcmVhdGVSZXN1bHR9IGV2ZW50LnZhbGlkYXRpb24gVGhlIHJlc3VsdCBvZiB0aGUgW3ZhbGlkYXRlTW92ZUZuXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvQ2FsZW5kYXJEcmFnI2NvbmZpZy12YWxpZGF0ZU1vdmVGbikgaWYgb25lIHdhcyBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQudmlldyBUaGUgQ2FsZW5kYXIgd2lkZ2V0IGluIHdoaWNoIHRoZSBkcmFnIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EcmFnTW92ZUVuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXIsIGRyYWc6IERyYWdDb250ZXh0LCBldmVudDogRXZlbnQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZD86IFJlc291cmNlTW9kZWwsIGZlYXR1cmU6IENhbGVuZGFyRHJhZywgdmFsaWRhdGlvbjogYm9vbGVhbnxWYWxpZGF0ZUNyZWF0ZVJlc3VsdCwgdmlldzogQ2FsZW5kYXJWaWV3IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIG9uIHRoZSBvd25pbmcgQ2FsZW5kYXIgd2hlbiBkcmFnZ2luZyBhbiBldmVudCBmcm9tIHRoZSBjYWxlbmRhciBvdmVyIHRoZVxuICAgICAqIGV4dGVybmFsIHNvdXJjZSA8c3Ryb25nPmlmIHRoZSBbZHJvcHBhYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXh0ZXJuYWxFdmVudFNvdXJjZSNjb25maWctZHJvcHBhYmxlKSB3YXMgY29uZmlndXJlZDwvc3Ryb25nPi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2V2ZW50LWRyYWdNb3ZlRXh0ZXJuYWwpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCByZWNvcmQgYmVpbmcgZHJhZ2dlZC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5pdGVtRWxlbWVudCBUaGUgZWxlbWVudCBpbiB3aGljaCB0aGUgZHJhZyBnZXN0dXJlIHN0YXJ0ZWQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudGFyZ2V0RWxlbWVudCBUaGUgY3VycmVudCBvdmVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIHBvaW50ZXIgZXZlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBkcmFnIHBvaW50LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5vdmVySW5kZXggKklmIFtncmlkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXh0ZXJuYWxFdmVudFNvdXJjZSNjb25maWctZ3JpZCkgd2FzIHNwZWNpZmllZCosIHRoZSBpbmRleCBvZiB0aGUgcm93IGJlaW5nIG1vdmVkIG92ZXI7XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50Lm92ZXJSZWNvcmQgKklmIFtncmlkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXh0ZXJuYWxFdmVudFNvdXJjZSNjb25maWctZ3JpZCkgd2FzIHNwZWNpZmllZCosIHRoZSByZWNvcmQgYmVpbmcgbW92ZWQgb3ZlcjtcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmlzQWJvdmUgKklmIFtncmlkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXh0ZXJuYWxFdmVudFNvdXJjZSNjb25maWctZ3JpZCkgd2FzIHNwZWNpZmllZCosIGB0cnVlYCBpZiB0aGUgcG9pbnRlciBwb3NpdGlvbiBpcyBhYm92ZSB0aGUgaGFsZndheSBsaW5lIG9mIHRoZSBvdmVyIHJvdy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmFsdEtleSBgdHJ1ZWAgaWYgdGhlIEFsdCBrZXkgd2FzIGRvd24gd2hlbiB0aGUgbGFzdCBldmVudCB3YXMgcHJvY2Vzc2VkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY3RybEtleSBgdHJ1ZWAgaWYgdGhlIEN0cmwga2V5IHdhcyBkb3duIHdoZW4gdGhlIGxhc3QgZXZlbnQgd2FzIHByb2Nlc3NlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50Lm1ldGFLZXkgYHRydWVgIGlmIHRoZSBNZXRhIGtleSB3YXMgZG93biB3aGVuIHRoZSBsYXN0IGV2ZW50IHdhcyBwcm9jZXNzZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5zaGlmdEtleSBgdHJ1ZWAgaWYgdGhlIFNoaWZ0IGtleSB3YXMgZG93biB3aGVuIHRoZSBsYXN0IGV2ZW50IHdhcyBwcm9jZXNzZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRHJhZ01vdmVFeHRlcm5hbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCBpdGVtRWxlbWVudDogSFRNTEVsZW1lbnQsIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBkb21FdmVudDogRXZlbnQsIG92ZXJJbmRleDogbnVtYmVyLCBvdmVyUmVjb3JkOiBNb2RlbCwgaXNBYm92ZTogYm9vbGVhbiwgYWx0S2V5OiBib29sZWFuLCBjdHJsS2V5OiBib29sZWFuLCBtZXRhS2V5OiBib29sZWFuLCBzaGlmdEtleTogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIENhbGVuZGFyIHdoZW4gYSBkcmFnIHJlc2l6ZSBnZXN0dXJlIGlzIGNvbXBsZXRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhlIENhbGVuZGFyIGluc3RhbmNlIHRoYXQgZmlyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7Q29yZS51dGlsLmRyYWcuRHJhZ0NvbnRleHR9IGV2ZW50LmRyYWcgVGhlIGRyYWcgY3JlYXRlIGNvbnRleHQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIHVwZGF0ZWQgYEV2ZW50TW9kZWxgIHJlY29yZC5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLmZlYXR1cmUuQ2FsZW5kYXJEcmFnfSBldmVudC5mZWF0dXJlIFRoZSBDYWxlbmRhciBkcmFnIGZlYXR1cmUgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtib29sZWFuLFZhbGlkYXRlQ3JlYXRlUmVzdWx0fSBldmVudC52YWxpZGF0aW9uIFRoZSByZXN1bHQgb2YgdGhlIFt2YWxpZGF0ZVJlc2l6ZUZuXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvQ2FsZW5kYXJEcmFnI2NvbmZpZy12YWxpZGF0ZVJlc2l6ZUZuKSBpZiBvbmUgd2FzIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC52aWV3IFRoZSBDYWxlbmRhciB3aWRnZXQgaW4gd2hpY2ggdGhlIGRyYWcgY29tcGxldGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRyYWdSZXNpemVFbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyLCBkcmFnOiBEcmFnQ29udGV4dCwgZXZlbnQ6IEV2ZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgZmVhdHVyZTogQ2FsZW5kYXJEcmFnLCB2YWxpZGF0aW9uOiBib29sZWFufFZhbGlkYXRlQ3JlYXRlUmVzdWx0LCB2aWV3OiBDYWxlbmRhclZpZXcgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgb24gdGhlIG93bmluZyBDYWxlbmRhciBhZnRlciBkcm9wcGluZyBhbiBldmVudCBmcm9tIHRoZSBjYWxlbmRhciBvbiB0aGVcbiAgICAgKiBleHRlcm5hbCBzb3VyY2UgaGFzIGJlZW4gY29tcGxldGVkIDxzdHJvbmc+aWYgdGhlIFtkcm9wcGFibGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FeHRlcm5hbEV2ZW50U291cmNlI2NvbmZpZy1kcm9wcGFibGUpIHdhcyBjb25maWd1cmVkPC9zdHJvbmc+LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtZHJvcEV4dGVybmFsKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgZXZlbnQgcmVjb3JkIHRoYXQgd2FzIGRyb3BwZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5kcm9wT25DYWxlbmRhciBgdHJ1ZWAgaWYgdGhlIGRyb3AgZ2VzdHVyZSBpcyBvdmVyIHRoZSBjbGllbnQgQ2FsZW5kYXIuIFRoaXMgZmVhdHVyZSBhbHNvIGFsbG93cyBkcmFnICpvdXQqIG9mIHRoZSBDYWxlbmRhciBhbmQgb250byB0aGUgZXh0ZXJuYWwgZXZlbnQgc291cmNlIGlmIHRoZSBbZHJvcHBhYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL2ZlYXR1cmUvRXh0ZXJuYWxFdmVudFNvdXJjZSNjb25maWctZHJvcHBhYmxlKSBjb25maWcgaXMgc2V0LlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50Lml0ZW1FbGVtZW50IFRoZSBlbGVtZW50IGluIHdoaWNoIHRoZSBkcmFnIGdlc3R1cmUgc3RhcnRlZC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50YXJnZXRFbGVtZW50IFRoZSBjdXJyZW50IG92ZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcG9pbnRlciBldmVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGRyYWcgcG9pbnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm92ZXJJbmRleCAqSWYgW2dyaWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FeHRlcm5hbEV2ZW50U291cmNlI2NvbmZpZy1ncmlkKSB3YXMgc3BlY2lmaWVkKiwgdGhlIGluZGV4IG9mIHRoZSByb3cgYmVpbmcgbW92ZWQgb3ZlcjtcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQub3ZlclJlY29yZCAqSWYgW2dyaWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FeHRlcm5hbEV2ZW50U291cmNlI2NvbmZpZy1ncmlkKSB3YXMgc3BlY2lmaWVkKiwgdGhlIHJlY29yZCBiZWluZyBtb3ZlZCBvdmVyO1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNBYm92ZSAqSWYgW2dyaWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9FeHRlcm5hbEV2ZW50U291cmNlI2NvbmZpZy1ncmlkKSB3YXMgc3BlY2lmaWVkKiwgYHRydWVgIGlmIHRoZSBwb2ludGVyIHBvc2l0aW9uIGlzIGFib3ZlIHRoZSBoYWxmd2F5IGxpbmUgb2YgdGhlIG92ZXIgcm93LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuYWx0S2V5IGB0cnVlYCBpZiB0aGUgQWx0IGtleSB3YXMgZG93biB3aGVuIHRoZSBsYXN0IGV2ZW50IHdhcyBwcm9jZXNzZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jdHJsS2V5IGB0cnVlYCBpZiB0aGUgQ3RybCBrZXkgd2FzIGRvd24gd2hlbiB0aGUgbGFzdCBldmVudCB3YXMgcHJvY2Vzc2VkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQubWV0YUtleSBgdHJ1ZWAgaWYgdGhlIE1ldGEga2V5IHdhcyBkb3duIHdoZW4gdGhlIGxhc3QgZXZlbnQgd2FzIHByb2Nlc3NlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LnNoaWZ0S2V5IGB0cnVlYCBpZiB0aGUgU2hpZnQga2V5IHdhcyBkb3duIHdoZW4gdGhlIGxhc3QgZXZlbnQgd2FzIHByb2Nlc3NlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Ecm9wRXh0ZXJuYWw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgZHJvcE9uQ2FsZW5kYXI6IGJvb2xlYW4sIGl0ZW1FbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQsIGRvbUV2ZW50OiBFdmVudCwgb3ZlckluZGV4OiBudW1iZXIsIG92ZXJSZWNvcmQ6IE1vZGVsLCBpc0Fib3ZlOiBib29sZWFuLCBhbHRLZXk6IGJvb2xlYW4sIGN0cmxLZXk6IGJvb2xlYW4sIG1ldGFLZXk6IGJvb2xlYW4sIHNoaWZ0S2V5OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHdpZGdldCdzIFtlbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KSBpcyBhdmFpbGFibGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmVsZW1lbnQgVGhlIFdpZGdldCdzIGVsZW1lbnQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRWxlbWVudENyZWF0ZWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBlbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhbiBlbXB0eSBjZWxsIGNvbnRlbnQgYXJlYSBpcyBjbGlja2VkIG9uIGluIGEgW01vbnRoVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3KSBvciBhXG4gICAgICogW0NhbGVuZGFyUm93XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9DYWxlbmRhclJvdykuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIGNoaWxkIHZpZXcgb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBpbml0aWF0ZWQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIHRyaWdnZXJpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSB3aGljaCBoYXMgbm8gdmlzaWJsZSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FbXB0eUNlbGxDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYW4gW2F1dG9DcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLWF1dG9DcmVhdGUpIGdlc3R1cmUgaGFzXG4gICAgICogY3JlYXRlZCBhIG5ldyBldmVudCBhbmQgYWRkZWQgaXQgdG8gdGhlIGV2ZW50IHN0b3JlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtZXZlbnRBdXRvQ3JlYXRlZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgY2hpbGQgdmlldyBvbiB3aGljaCB0aGUgZXZlbnQgd2FzIGluaXRpYXRlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgbmV3IGV2ZW50IHJlY29yZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FdmVudEF1dG9DcmVhdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFuIGV2ZW50IGJhciBpcyBjbGlja2VkIGluIGFueSB2aWV3LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBvZiB0aGUgVUkgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50IFRoZSBVSSBlbGVtZW50IHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCBjbGlja2VkIG9uLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBjbGlja2VkIG9uIGlmIHRoZSBVSSBpbmNsdWRlcyBhIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50Q2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCBldmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGZyb21PdmVyZmxvd1BvcHVwOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFuIGV2ZW50IGJhciBpcyByaWdodC1jbGlja2VkIGluIGFueSB2aWV3LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBvZiB0aGUgVUkgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50IFRoZSBVSSBlbGVtZW50IHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCByaWdodC1jbGlja2VkIG9uLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSByaWdodC1jbGlja2VkIG9uIGlmIHRoZSBVSSBpbmNsdWRlcyBhIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50Q29udGV4dE1lbnU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCBldmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGZyb21PdmVyZmxvd1BvcHVwOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFuIGV2ZW50IGJhciBpcyBkb3VibGUgY2xpY2tlZCBpbiBhbnkgdmlldy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgb2YgdGhlIFVJIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmV2ZW50RWxlbWVudCBUaGUgVUkgZWxlbWVudCB3aGljaCByZXByZXNlbnRzIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgZXZlbnQgZG91YmxlIGNsaWNrZWQgb24uXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIGRvdWJsZSBjbGlja2VkIG9uIGlmIHRoZSBVSSBpbmNsdWRlcyBhIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50RGJsQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCBldmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGZyb21PdmVyZmxvd1BvcHVwOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgdGhlIGVkaXRvciB3aWxsIGxvYWQgdGhlIGV2ZW50IHJlY29yZCBkYXRhIGludG8gaXRzIGlucHV0IGZpZWxkcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91XG4gICAgICogd2FudCB0byBtb2RpZnkgdGhlIGZpZWxkcyBiZWZvcmUgZGF0YSBpcyBsb2FkZWQgKGUuZy4gc2V0IHNvbWUgaW5wdXQgZmllbGQgdG8gYmUgcmVhZG9ubHkpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuQ29udGFpbmVyfSBldmVudC5zb3VyY2UgVGhlIGVkaXRvciB3aWRnZXRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50RWRpdEJlZm9yZVNldFJlY29yZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ29udGFpbmVyLCByZWNvcmQ6IEV2ZW50TW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBrZXkgaXMgcHJlc3NlZCB3aGlsZSBhbiBldmVudCBiYXIgaXMgZm9jdXNlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgb2YgdGhlIFVJIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmV2ZW50RWxlbWVudCBUaGUgVUkgZWxlbWVudCB3aGljaCByZXByZXNlbnRzIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgZXZlbnQgaW4gd2hpY2ggdGhlIGtleSBldmVudCB3YXMgZGV0ZWN0ZWQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIGluIHdoaWNoIHRoZSBrZXkgZXZlbnQgd2FzIGRldGVjdGVkIGlmIHRoZSBVSSBpbmNsdWRlcyBhIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50S2V5RG93bjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIGV2ZW50RWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZnJvbU92ZXJmbG93UG9wdXA6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYmVmb3JlIHRoZSBjb250ZXh0IG1lbnUgaXMgc2hvd24gZm9yIGFuIGV2ZW50LiBBbGxvd3MgbWFuaXB1bGF0aW9uIG9mIHRoZSBpdGVtc1xuICAgICAqIHRvIHNob3cgaW4gdGhlIHNhbWUgd2F5IGFzIGluIGBwcm9jZXNzSXRlbXNgLiBSZXR1cm5pbmcgYGZhbHNlYCBmcm9tIGEgbGlzdGVuZXIgcHJldmVudHMgdGhlIG1lbnUgZnJvbVxuICAgICAqIGJlaW5nIHNob3duLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5Pn0gZXZlbnQuaXRlbXMgTWVudSBpdGVtIGNvbmZpZ3NcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBFdmVudCByZWNvcmQgZm9yIHdoaWNoIHRoZSBtZW51IHdhcyB0cmlnZ2VyZWRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBSZXNvdXJjZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5Bc3NpZ25tZW50TW9kZWx9IGV2ZW50LmFzc2lnbm1lbnRSZWNvcmQgQXNzaWdubWVudCByZWNvcmQsIGlmIGFzc2lnbm1lbnRzIGFyZSB1c2VkXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBQb2ludGVyIGV2ZW50IHdoaWNoIHRyaWdnZXJlZCB0aGUgY29udGV4dCBtZW51IChpZiBhbnkpXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRNZW51QmVmb3JlU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBpdGVtczogUmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT4sIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgYXNzaWdubWVudFJlY29yZDogQXNzaWdubWVudE1vZGVsLCBldmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudD86IE1vdXNlRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgU2NoZWR1bGVyIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5Bc3NpZ25tZW50TW9kZWx9IGV2ZW50LmFzc2lnbm1lbnRSZWNvcmQgQXNzaWdubWVudCByZWNvcmQsIGlmIGFzc2lnbm1lbnRzIGFyZSB1c2VkXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRNZW51SXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBpdGVtOiBNZW51SXRlbSwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBhc3NpZ25tZW50UmVjb3JkOiBBc3NpZ25tZW50TW9kZWwsIGV2ZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYWZ0ZXIgc2hvd2luZyB0aGUgY29udGV4dCBtZW51IGZvciBhbiBldmVudFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgRXZlbnQgcmVjb3JkIGZvciB3aGljaCB0aGUgbWVudSB3YXMgdHJpZ2dlcmVkXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgUmVzb3VyY2UgcmVjb3JkXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuQXNzaWdubWVudE1vZGVsfSBldmVudC5hc3NpZ25tZW50UmVjb3JkIEFzc2lnbm1lbnQgcmVjb3JkLCBpZiBhc3NpZ25tZW50cyBhcmUgdXNlZFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmV2ZW50RWxlbWVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50TWVudVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgbWVudTogTWVudSwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBhc3NpZ25tZW50UmVjb3JkOiBBc3NpZ25tZW50TW9kZWwsIGV2ZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW4gZXZlbnQgYmFyIGlzIG1vdXNlZG93bmVkIGluIGFueSB2aWV3LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBvZiB0aGUgVUkgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50IFRoZSBVSSBlbGVtZW50IHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCBtb3VzZWRvd25lZCBvbi5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgcmVzb3VyY2UgbW91c2Vkb3duZWQgb24gaWYgdGhlIFVJIGluY2x1ZGVzIGEgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5mcm9tT3ZlcmZsb3dQb3B1cCBgdHJ1ZWAgaWYgdGhlIGludGVyYWN0aW9uIHdhcyB0aHJvdWdoIHRoZSBzb3VyY2UgdmlldydzIFtvdmVyZmxvd1BvcHVwXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXlDZWxsUmVuZGVyZXIjcHJvcGVydHktb3ZlcmZsb3dQb3B1cCkuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRNb3VzZURvd246IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCBldmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGZyb21PdmVyZmxvd1BvcHVwOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGN1cnNvciBlbnRlcnMgYW4gZXZlbnQgYmFyIGluIGFueSB2aWV3LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBvZiB0aGUgVUkgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50IFRoZSBVSSBlbGVtZW50IHdoaWNoIHJlcHJlc2VudHMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCByZWNvcmQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIGlmIHRoZSBVSSBpbmNsdWRlcyBhIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV2ZW50TW91c2VFbnRlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIGV2ZW50RWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZnJvbU92ZXJmbG93UG9wdXA6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gY3Vyc29yIGxlYXZlcyBhbiBldmVudCBiYXIgaW4gYW55IHZpZXcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIG9mIHRoZSBVSSBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5ldmVudEVsZW1lbnQgVGhlIFVJIGVsZW1lbnQgd2hpY2ggcmVwcmVzZW50cyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIGV2ZW50IHJlY29yZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgcmVzb3VyY2UgaWYgdGhlIFVJIGluY2x1ZGVzIGEgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5mcm9tT3ZlcmZsb3dQb3B1cCBgdHJ1ZWAgaWYgdGhlIGludGVyYWN0aW9uIHdhcyB0aHJvdWdoIHRoZSBzb3VyY2UgdmlldydzIFtvdmVyZmxvd1BvcHVwXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXlDZWxsUmVuZGVyZXIjcHJvcGVydHktb3ZlcmZsb3dQb3B1cCkuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRNb3VzZUxlYXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgZXZlbnRFbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBmcm9tT3ZlcmZsb3dQb3B1cDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhbiBldmVudCBiYXIgaXMgbW91c2VvdXRlZCBpbiBhbnkgdmlldy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgb2YgdGhlIFVJIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmV2ZW50RWxlbWVudCBUaGUgVUkgZWxlbWVudCB3aGljaCByZXByZXNlbnRzIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgZXZlbnQgbW91c2VvdXRlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgcmVzb3VyY2UgbW91c2VvdXRlZCBpZiB0aGUgVUkgaW5jbHVkZXMgYSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmZyb21PdmVyZmxvd1BvcHVwIGB0cnVlYCBpZiB0aGUgaW50ZXJhY3Rpb24gd2FzIHRocm91Z2ggdGhlIHNvdXJjZSB2aWV3J3MgW292ZXJmbG93UG9wdXBdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0RheUNlbGxSZW5kZXJlciNwcm9wZXJ0eS1vdmVyZmxvd1BvcHVwKS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FdmVudE1vdXNlT3V0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgZXZlbnRFbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBmcm9tT3ZlcmZsb3dQb3B1cDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhbiBldmVudCBiYXIgaXMgbW91c2VvdmVyZWQgaW4gYW55IHZpZXcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIG9mIHRoZSBVSSBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5ldmVudEVsZW1lbnQgVGhlIFVJIGVsZW1lbnQgd2hpY2ggcmVwcmVzZW50cyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIGV2ZW50IG1vdXNlb3ZlcmVkLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBtb3VzZW92ZXJlZCBpZiB0aGUgVUkgaW5jbHVkZXMgYSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmZyb21PdmVyZmxvd1BvcHVwIGB0cnVlYCBpZiB0aGUgaW50ZXJhY3Rpb24gd2FzIHRocm91Z2ggdGhlIHNvdXJjZSB2aWV3J3MgW292ZXJmbG93UG9wdXBdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0RheUNlbGxSZW5kZXJlciNwcm9wZXJ0eS1vdmVyZmxvd1BvcHVwKS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FdmVudE1vdXNlT3ZlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIGV2ZW50RWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZnJvbU92ZXJmbG93UG9wdXA6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW4gZXZlbnQgYmFyIGlzIG1vdXNldXBwZWQgaW4gYW55IHZpZXcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIG9mIHRoZSBVSSBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5ldmVudEVsZW1lbnQgVGhlIFVJIGVsZW1lbnQgd2hpY2ggcmVwcmVzZW50cyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIGV2ZW50IG1vdXNldXBwZWQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIG1vdXNldXBwZWQgaWYgdGhlIFVJIGluY2x1ZGVzIGEgcmVzb3VyY2UuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5mcm9tT3ZlcmZsb3dQb3B1cCBgdHJ1ZWAgaWYgdGhlIGludGVyYWN0aW9uIHdhcyB0aHJvdWdoIHRoZSBzb3VyY2UgdmlldydzIFtvdmVyZmxvd1BvcHVwXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXlDZWxsUmVuZGVyZXIjcHJvcGVydHktb3ZlcmZsb3dQb3B1cCkuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRNb3VzZVVwOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgZXZlbnRFbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBmcm9tT3ZlcmZsb3dQb3B1cDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGRheSBzcGFubmluZyBldmVudCBpcyBmb3VuZCwgYW5kIHRoZSBkYXRlIHRvIHdoaWNoIGl0cyBlbmNhcHN1bGF0aW5nIGV2ZW50IGJhclxuICAgICAqIGV4dGVuZHMgaGFzIGJlZW4gY2FsY3VsYXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci92aWV3L0NhbGVuZGFyI2V2ZW50LWV2ZW50UHJvcGFnYXRlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5ldmVudEVuZERhdGUgVGhlIGVuZCBkYXRlIGZvciB3aGljaCB0byBjYWxjdWxhdGUgdGhlIHByb3BhZ2F0ZSBlbmQgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LnByb3BhZ2F0ZUVuZERhdGUgVGhlIHN5c3RlbS1jYWxjdWxhdGVkIGVuZCBwb2ludCBvZiB0aGUgZXZlbnQgYmFyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNBbGxEYXkgYHRydWVgIGlmIHRoZSBldmVudCBpcyBhbiBhbGwgZGF5IGV2ZW50LCBvciBzcGFucyBtdWx0aXBsZSBkYXlzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNPdmVyZmxvdyBgdHJ1ZWAgaWYgdGhpcyBpcyBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiBmdXJ0aGVyIHByb3BhZ2F0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQub3ZlcmZsb3dzIGB0cnVlYCBpZiB0aGUgZXZlbnQgZXh0ZW5kcyBpbnRvIGZ1dHVyZSBjZWxscy5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgZXZlbnQgcmVjb3JkIGJlaW5nIHByb3BhZ2F0ZWQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIGZyb20gd2hpY2ggdGhlIGV2ZW50IGlzIGJlaW5nIHByb3BhZ2F0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRQcm9wYWdhdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZXZlbnRFbmREYXRlOiBEYXRlLCBwcm9wYWdhdGVFbmREYXRlOiBEYXRlLCBpc0FsbERheTogYm9vbGVhbiwgaXNPdmVyZmxvdzogYm9vbGVhbiwgb3ZlcmZsb3dzOiBib29sZWFuLCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgZGF0ZTogRGF0ZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIFBhbmVsIGlzIGV4cGFuZGVkIHVzaW5nIHRoZSBbY29sbGFwc2libGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNpYmxlKSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlBhbmVsfSBldmVudC5zb3VyY2UgVGhpcyBQYW5lbC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FeHBhbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFBhbmVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGZvY3VzIGVudGVycyB0aGlzIFdpZGdldC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGlzIFdpZGdldFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmZyb21FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudG9FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuZnJvbVdpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnRvV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuYmFja3dhcmRzIGB0cnVlYCBpZiB0aGUgYHRvRWxlbWVudGAgaXMgYmVmb3JlIHRoZSBgZnJvbUVsZW1lbnRgIGluIGRvY3VtZW50IG9yZGVyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZvY3VzSW46IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZnJvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBmcm9tV2lkZ2V0OiBXaWRnZXQsIHRvV2lkZ2V0OiBXaWRnZXQsIGJhY2t3YXJkczogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBmb2N1cyBleGl0cyB0aGlzIFdpZGdldCdzIG93bmVyc2hpcCB0cmVlLiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIGEgYGJsdXJgIGV2ZW50LlxuICAgICAqIGZvY3VzIG1vdmluZyBmcm9tIHdpdGhpbiB0aGlzIFdpZGdldCdzIG93bmVyc2hpcCB0cmVlLCBldmVuIGlmIHRoZXJlIGFyZSBmbG9hdGluZyB3aWRnZXRzXG4gICAgICogd2lsbCBub3QgdHJpZ2dlciB0aGlzIGV2ZW50LiBUaGlzIGlzIHdoZW4gZm9jdXMgZXhpdHMgdGhpcyB3aWRnZXQgY29tcGxldGVseS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGlzIFdpZGdldFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmZyb21FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudG9FbGVtZW50IFRoZSBlbGVtZW50IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuZnJvbVdpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGxvc3QgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnRvV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuYmFja3dhcmRzIGB0cnVlYCBpZiB0aGUgYHRvRWxlbWVudGAgaXMgYmVmb3JlIHRoZSBgZnJvbUVsZW1lbnRgIGluIGRvY3VtZW50IG9yZGVyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZvY3VzT3V0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIGZyb21FbGVtZW50OiBIVE1MRWxlbWVudCwgdG9FbGVtZW50OiBIVE1MRWxlbWVudCwgZnJvbVdpZGdldDogV2lkZ2V0LCB0b1dpZGdldDogV2lkZ2V0LCBiYWNrd2FyZHM6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBhZnRlciBhIHdpZGdldCB3YXMgaGlkZGVuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkhpZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiB0aGUgW0xvYWRPbkRlbWFuZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL0xvYWRPbkRlbWFuZCkgZmVhdHVyZSBkZXRlY3RzIHRoYXQgYSByZXF1ZXN0XG4gICAgICogZm9yIGRhdGEgZnJvbSB0aGUgc2VydmVyIGhhcyBmYWlsZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1sb2FkT25EZW1hbmRGYWlsKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Jlc3BvbnNlfSBldmVudC5yYXdSZXNwb25zZSBUaGUgSFRUUCBgZmV0Y2hgIHJlc3BvbnNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdCBUaGUgQ3J1ZE1hbmFnZXIgbG9hZCBkYXRhIGJsb2NrLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBKU09OIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkxvYWRPbkRlbWFuZEZhaWw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyByYXdSZXNwb25zZTogYW55LCByZXF1ZXN0OiBvYmplY3QsIHJlc3BvbnNlOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBtb250aCBuYW1lIGhlYWRlciBpbiBhIFtZZWFyVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvWWVhclZpZXcpIG9yIGEgW01vbnRoR3JpZF0oI0NhbGVuZGFyL3dpZGdldC9Nb250aEdyaWQpIGlzIGNsaWNrZWRcbiAgICAgKiBvciBhY3RpdmF0ZWQgYnkgdGhlIDxrYmQ+RU5URVI8L2tiZD4ga2V5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtbW9udGhOYW1lQ2xpY2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm1vbnRoIFRoZSBtb250aCBpbmRleCAqKHplcm8gYmFzZWQpKiBjbGlja2VkIG9uLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBvZiB0aGUgZmlyc3Qgb2YgdGhlIG1vbnRoIGNsaWNrZWQgb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTW9udGhOYW1lQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBtb250aDogbnVtYmVyLCBkYXRlOiBEYXRlIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHVzZXIgZ2VzdHVyZSBjYXVzZXMgdGhlIGFjdGl2ZSBpdGVtIHRvIGNoYW5nZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQgd2hpY2ggaW5zdGlnYXRlZCBuYXZpZ2F0aW9uLiBNYXkgYmUgYSBjbGljayBvciBrZXkgb3IgZm9jdXMgZXZlbnQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudCxudWxsfSBldmVudC5pdGVtIFRoZSBuZXdseSBhY3RpdmUgaXRlbSwgb3IgYG51bGxgIGlmIGZvY3VzIG1vdmVkIG91dC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50LG51bGx9IGV2ZW50Lm9sZEl0ZW0gVGhlIHByZXZpb3VzbHkgYWN0aXZlIGl0ZW0sIG9yIGBudWxsYCBpZiBmb2N1cyBpcyBtb3ZpbmcgaW4uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTmF2aWdhdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBldmVudDogRXZlbnQsIGl0ZW06IEhUTUxFbGVtZW50fG51bGwsIG9sZEl0ZW06IEhUTUxFbGVtZW50fG51bGwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgd2lkZ2V0IHdoaWNoIGhhZCBiZWVuIGluIGEgbm9uLXZpc2libGUgc3RhdGUgZm9yIGFueSByZWFzb25cbiAgICAgKiBhY2hpZXZlcyB2aXNpYmlsaXR5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtcGFpbnQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBwYWludGVkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZmlyc3RQYWludCBgdHJ1ZWAgaWYgdGhpcyBpcyB0aGUgZmlyc3QgcGFpbnQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUGFpbnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZmlyc3RQYWludDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgYWZ0ZXIgYSBwYXN0ZSBhY3Rpb24gaXMgcGVyZm9ybWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIE93bmVyIHNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuZXZlbnRSZWNvcmRzIFRoZSBwYXN0ZWQgZXZlbnQgcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5hc3NpZ25tZW50UmVjb3JkcyBUaGUgcGFzdGVkIGFzc2lnbm1lbnQgcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQucGFzdGVkRXZlbnRSZWNvcmRzIChERVBSRUNBVEVEKSBVc2UgZXZlbnRSZWNvcmRzIGluc3RlYWRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50Lm9yaWdpbmFsRXZlbnRSZWNvcmRzIFRoZSBvcmlnaW5hbCBjb3BpZWQgZXZlbnQgcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5vcmlnaW5hbEFzc2lnbm1lbnRSZWNvcmRzIFRoZSBvcmlnaW5hbCBjb3BpZWQgYXNzaWdubWVudCByZWNvcmRzXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIGRhdGUgUGFzdGVkIHRvIHRoaXMgZGF0ZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSB0YXJnZXQgcmVzb3VyY2UgcmVjb3JkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5pc0N1dCBgdHJ1ZWAgaWYgdGhpcyBpcyBhIGN1dCBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZW50aXR5TmFtZSAnZXZlbnQnIHRvIGRpc3Rpbmd1aXNoIHRoaXMgZXZlbnQgZnJvbSBvdGhlciBwYXN0ZSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25QYXN0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCBldmVudFJlY29yZHM6IEV2ZW50TW9kZWxbXSwgYXNzaWdubWVudFJlY29yZHM6IEFzc2lnbm1lbnRNb2RlbFtdLCBwYXN0ZWRFdmVudFJlY29yZHM6IEV2ZW50TW9kZWxbXSwgb3JpZ2luYWxFdmVudFJlY29yZHM6IEV2ZW50TW9kZWxbXSwgb3JpZ2luYWxBc3NpZ25tZW50UmVjb3JkczogQXNzaWdubWVudE1vZGVsW10sIGRhdGU6IERhdGUsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBpc0N1dDogYm9vbGVhbiwgZW50aXR5TmFtZTogc3RyaW5nIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBpZiBhIHBhc3RlIGFjdGlvbiBpcyBub3QgYWxsb3dlZC4gRGVwZW5kaW5nIG9uIGlmIHRoZSBFdmVudFN0b3JlIGlzIHVzaW5nXG4gICAgICogW3NpbmdsZUFzc2lnbm1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL2RhdGEvRXZlbnRTdG9yZSNjb25maWctc2luZ2xlQXNzaWdubWVudCkgb3IgdGhlIGNvbmZpZ3VyYXRpb24gb2ZcbiAgICAgKiBbY29weVBhc3RlQWN0aW9uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9mZWF0dXJlL0V2ZW50Q29weVBhc3RlI2NvbmZpZy1jb3B5UGFzdGVBY3Rpb24pLCBlaXRoZXIgdGhlIGBldmVudFJlY29yZHNgIG9yIHRoZSBgYXNzaWdubWVudFJlY29yZHNgIHBhcmFtIHdpbGwgYmUgcG9wdWxhdGVkXG4gICAgICogd2l0aCByZWNvcmQgY29waWVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIE93bmVyIHNjaGVkdWxlclxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuZXZlbnRSZWNvcmRzIFRoZSBldmVudCByZWNvcmRzIGFib3V0IHRvIGJlIHBhc3RlZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5hc3NpZ25tZW50UmVjb3JkcyBUaGUgYXNzaWdubWVudCByZWNvcmRzIGFib3V0IHRvIGJlIHBhc3RlZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQub3JpZ2luYWxFdmVudFJlY29yZHMgVGhlIGV2ZW50IHJlY29yZHMgdGhhdCB3ZXJlIGNvcGllZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbFtdfSBldmVudC5vcmlnaW5hbEFzc2lnbm1lbnRSZWNvcmRzIFRoZSBhc3NpZ25tZW50IHJlY29yZHMgdGhhdCB3ZXJlIGNvcGllZFxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgcGFzdGUgZGF0ZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSB0YXJnZXQgcmVzb3VyY2UgcmVjb3JkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5pc0N1dCBgdHJ1ZWAgaWYgdGhpcyBpcyBhIGN1dCBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZW50aXR5TmFtZSAnZXZlbnQnIHRvIGRpc3Rpbmd1aXNoIHRoaXMgZXZlbnQgZnJvbSBvdGhlciBgcGFzdGVOb3RBbGxvd2VkYCBldmVudHNcbiAgICAgKiBAcGFyYW0geydvdmVybGFwcGluZ0V2ZW50cycsJ3Jlc291cmNlUmVhZE9ubHknfSBldmVudC5yZWFzb24gQSBzdHJpbmcgaWQgdG8gdXNlIGZvciBkaXNwbGF5aW5nIGFuIGVycm9yIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUGFzdGVOb3RBbGxvd2VkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGV2ZW50UmVjb3JkczogRXZlbnRNb2RlbFtdLCBhc3NpZ25tZW50UmVjb3JkczogQXNzaWdubWVudE1vZGVsW10sIG9yaWdpbmFsRXZlbnRSZWNvcmRzOiBFdmVudE1vZGVsW10sIG9yaWdpbmFsQXNzaWdubWVudFJlY29yZHM6IEFzc2lnbm1lbnRNb2RlbFtdLCBkYXRlOiBEYXRlLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgaXNDdXQ6IGJvb2xlYW4sIGVudGl0eU5hbWU6IHN0cmluZywgcmVhc29uOiAnb3ZlcmxhcHBpbmdFdmVudHMnfCdyZXNvdXJjZVJlYWRPbmx5JyB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFdpZGdldCdzIHJlYWQgb25seSBzdGF0ZSBpcyB0b2dnbGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQucmVhZE9ubHkgUmVhZCBvbmx5IG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlYWRPbmx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVhZE9ubHk6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSB3aWRnZXQncyBlbGVtZW50cyBoYXZlIGJlZW4gc3luY2hyb25pemVkIGR1ZSB0byBhIGRpcmVjdCBvciBpbmRpcmVjdCBjYWxsXG4gICAgICogdG8gW3JlY29tcG9zZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjZnVuY3Rpb24tcmVjb21wb3NlKSwgaWYgdGhpcyByZXN1bHRzIGluIHNvbWUgY2hhbmdlIHRvIHRoZSB3aWRnZXQncyByZW5kZXJlZCBET00gZWxlbWVudHMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVjb21wb3NlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoKSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBvbmUgb2YgdGhlIHZpZXdzIGluIHRoaXMgQ2FsZW5kYXIgcmVmcmVzaGVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHJlZnJlc2hlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZWZyZXNoOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIGVuY2Fwc3VsYXRpbmcgZWxlbWVudCBvZiBhIFdpZGdldCByZXNpemVzICpvbmx5IHdoZW4gW21vbml0b3JSZXNpemVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1tb25pdG9yUmVzaXplKSBpcyBgdHJ1ZWAqLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LndpZHRoIFRoZSBuZXcgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQuaGVpZ2h0IFRoZSBuZXcgaGVpZ2h0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm9sZFdpZHRoIFRoZSBvbGQgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkSGVpZ2h0IFRoZSBvbGQgaGVpZ2h0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvbGRXaWR0aDogbnVtYmVyLCBvbGRIZWlnaHQ6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGNsaWNrIGV2ZW50IGlzIHJlY2VpdmVkIGJ5IGEgdmlldyB3aGljaCBzdXBwb3J0cyByZXNvdXJjZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvdmlldy9DYWxlbmRhciNldmVudC1yZXNvdXJjZUNsaWNrKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBvZiB0aGUgVUkgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZXZlbnRFbGVtZW50ICpJZiogYW4gZXZlbnQgd2FzIGludGVyYWN0ZWQgd2l0aCwgdGhlIFVJIGVsZW1lbnQgd2hpY2ggcmVwcmVzZW50cyB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgKklmKiBhbiBldmVudCB3YXMgaW50ZXJhY3RlZCB3aXRoLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnJlc291cmNlRWxlbWVudCBUaGUgVUkgZWxlbWVudCB3aGljaCBlbmNhcHN1bGF0ZXMgdGhlIHJlc291cmNlLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZnJvbU92ZXJmbG93UG9wdXAgYHRydWVgIGlmIHRoZSBpbnRlcmFjdGlvbiB3YXMgdGhyb3VnaCB0aGUgc291cmNlIHZpZXcncyBbb3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI3Byb3BlcnR5LW92ZXJmbG93UG9wdXApLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc291cmNlQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCBldmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VFbGVtZW50OiBIVE1MRWxlbWVudCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGZyb21PdmVyZmxvd1BvcHVwOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIG5ldyBbcmVzcG9uc2l2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVTdGF0ZSkgaXMgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IHdob3NlIGByZXNwb25zaXZlU3RhdGVgIGhhcyBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnN0YXRlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5vbGRTdGF0ZSBUaGUgcHJldmlvdXMgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc3BvbnNpdmVTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBzdGF0ZTogc3RyaW5nLCBvbGRTdGF0ZTogc3RyaW5nIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgY2xpY2sgbWFkZSBpdHMgd2F5IHRocm91Z2ggdG8gYW4gZW1wdHkgcGFydCBvZiBhbnkgdmlldy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgY2xpY2tlZCBvbi4gX05vdGUgdGhhdCBpbiBhIFtEYXlWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9EYXlWaWV3KSwgdGhpcyB3aWxsIGluY2x1ZGUgZ3JhbnVsYXIgdGltZSBpbmZvcm1hdGlvbi4gRm9yIG90aGVyIHZpZXdzLCB0aGlzIGlzIHRoZSAqc3RhcnQqIG9mIHRoZSBkYXRlLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXcgaWYgYW55LiBPbmx5IFtSZXNvdXJjZVZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L1Jlc291cmNlVmlldykgb3IgYSBbRGF5UmVzb3VyY2VWaWV3XSgjQ2FsZW5kYXIvd2lkZ2V0L0RheVJlc291cmNlVmlldykgd2lsbCBpbmNsdWRlIHRoaXMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2NoZWR1bGVDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgY29udGV4dCBtZW51IG1hZGUgaXRzIHdheSB0aHJvdWdoIHRvIGFuIGVtcHR5IHBhcnQgb2YgYW55IHZpZXcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIGNsaWNrZWQgb24uIF9Ob3RlIHRoYXQgaW4gYSBbRGF5Vmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRGF5VmlldyksIHRoaXMgd2lsbCBpbmNsdWRlIGdyYW51bGFyIHRpbWUgaW5mb3JtYXRpb24uIEZvciBvdGhlciB2aWV3cywgdGhpcyBpcyB0aGUgKnN0YXJ0KiBvZiB0aGUgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB2aWV3IGlmIGFueS4gT25seSBbUmVzb3VyY2VWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9SZXNvdXJjZVZpZXcpIG9yIGEgW0RheVJlc291cmNlVmlld10oI0NhbGVuZGFyL3dpZGdldC9EYXlSZXNvdXJjZVZpZXcpIHdpbGwgaW5jbHVkZSB0aGlzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNjaGVkdWxlQ29udGV4dE1lbnU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGRibGNsaWNrIG1hZGUgaXRzIHdheSB0aHJvdWdoIHRvIGFuIGVtcHR5IHBhcnQgb2YgYW55IHZpZXcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIGRvdWJsZSBjbGlja2VkIG9uLiBfTm90ZSB0aGF0IGluIGEgW0RheVZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0RheVZpZXcpLCB0aGlzIHdpbGwgaW5jbHVkZSBncmFudWxhciB0aW1lIGluZm9ybWF0aW9uLiBGb3Igb3RoZXIgdmlld3MsIHRoaXMgaXMgdGhlICpzdGFydCogb2YgdGhlIGRhdGUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlldyBpZiBhbnkuIE9ubHkgW1Jlc291cmNlVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvUmVzb3VyY2VWaWV3KSBvciBhIFtEYXlSZXNvdXJjZVZpZXddKCNDYWxlbmRhci93aWRnZXQvRGF5UmVzb3VyY2VWaWV3KSB3aWxsIGluY2x1ZGUgdGhpcy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TY2hlZHVsZURibENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgb3IgR2FudHQgd2lkZ2V0IGJlZm9yZSB0aGUgY29udGV4dCBtZW51IGlzIHNob3duIGZvciB0aGUgc2NoZWR1bGUuXG4gICAgICogQWxsb3dzIG1hbmlwdWxhdGlvbiBvZiB0aGUgaXRlbXMgdG8gc2hvdyBpbiB0aGUgc2FtZSB3YXkgYXMgaW4gYHByb2Nlc3NJdGVtc2AuIFJldHVybmluZyBgZmFsc2VgIGZyb20gYSBsaXN0ZW5lclxuICAgICAqIHByZXZlbnRzIHRoZSBtZW51IGZyb20gYmVpbmcgc2hvd24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFJlc291cmNlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBDbGlja2VkIGRhdGUsIHJvdW5kZWQgYWNjb3JkaW5nIHRvIHZpZXdQcmVzZXQncyBzZXR0aW5nc1xuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkFzc2lnbm1lbnRNb2RlbH0gZXZlbnQuYXNzaWdubWVudFJlY29yZCBBc3NpZ25tZW50IHJlY29yZCwgaWYgYXNzaWdubWVudHMgYXJlIHVzZWRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5ldmVudEVsZW1lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TY2hlZHVsZU1lbnVCZWZvcmVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5PiwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIGRhdGU6IERhdGUsIGFzc2lnbm1lbnRSZWNvcmQ6IEFzc2lnbm1lbnRNb2RlbCwgZXZlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgb3IgR2FudHQgd2lkZ2V0IHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIENsaWNrZWQgZGF0ZSwgcm91bmRlZCBhY2NvcmRpbmcgdG8gdmlld1ByZXNldCdzIHNldHRpbmdzXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZWxlbWVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNjaGVkdWxlTWVudUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgaXRlbTogTWVudUl0ZW0sIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCBkYXRlOiBEYXRlLCBlbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBvciBHYW50dCB3aWRnZXQgYWZ0ZXIgc2hvd2luZyB0aGUgY29udGV4dCBtZW51IGZvciB0aGUgc2NoZWR1bGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLnZpZXcuU2NoZWR1bGVyfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIENsaWNrZWQgZGF0ZSwgcm91bmRlZCBhY2NvcmRpbmcgdG8gdmlld1ByZXNldCdzIHNldHRpbmdzXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudGFyZ2V0RWxlbWVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNjaGVkdWxlTWVudVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlciwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCBtZW51OiBNZW51LCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgZGF0ZTogRGF0ZSwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBtb3VzZWRvd24gbWFkZSBpdHMgd2F5IHRocm91Z2ggdG8gYW4gZW1wdHkgcGFydCBvZiBhbnkgdmlldy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgbW91c2Vkb3duZWQgb24uIF9Ob3RlIHRoYXQgaW4gYSBbRGF5Vmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRGF5VmlldyksIHRoaXMgd2lsbCBpbmNsdWRlIGdyYW51bGFyIHRpbWUgaW5mb3JtYXRpb24uIEZvciBvdGhlciB2aWV3cywgdGhpcyBpcyB0aGUgKnN0YXJ0KiBvZiB0aGUgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBldmVudC5yZXNvdXJjZVJlY29yZCBUaGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB2aWV3IGlmIGFueS4gT25seSBbUmVzb3VyY2VWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9SZXNvdXJjZVZpZXcpIG9yIGEgW0RheVJlc291cmNlVmlld10oI0NhbGVuZGFyL3dpZGdldC9EYXlSZXNvdXJjZVZpZXcpIHdpbGwgaW5jbHVkZSB0aGlzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNjaGVkdWxlTW91c2VEb3duOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBtb3VzZW91dCBtYWRlIGl0J3Mgd2F5IHRocm91Z2ggdG8gYW4gZW1wdHkgcGFydCBvZiBhbnkgdmlldy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBpbml0aWF0aW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgbW91c2VvdXRlZC4gX05vdGUgdGhhdCBpbiBhIFtEYXlWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9EYXlWaWV3KSwgdGhpcyB3aWxsIGluY2x1ZGUgZ3JhbnVsYXIgdGltZSBpbmZvcm1hdGlvbi4gRm9yIG90aGVyIHZpZXdzLCB0aGlzIGlzIHRoZSAqc3RhcnQqIG9mIHRoZSBkYXRlLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIHZpZXcgaWYgYW55LiBPbmx5IFtSZXNvdXJjZVZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L1Jlc291cmNlVmlldykgb3IgYSBbRGF5UmVzb3VyY2VWaWV3XSgjQ2FsZW5kYXIvd2lkZ2V0L0RheVJlc291cmNlVmlldykgd2lsbCBpbmNsdWRlIHRoaXMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2NoZWR1bGVNb3VzZU91dDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgbW91c2VvdmVyIG1hZGUgaXRzIHdheSB0aHJvdWdoIHRvIGFuIGVtcHR5IHBhcnQgb2YgYW55IHZpZXcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBldmVudC5zb3VyY2UgVGhlIHZpZXcgd2hpY2ggdHJpZ2dlcmVkIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgaW5pdGlhdGluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIG1vdXNlb3ZlcmVkLiBfTm90ZSB0aGF0IGluIGEgW0RheVZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0RheVZpZXcpLCB0aGlzIHdpbGwgaW5jbHVkZSBncmFudWxhciB0aW1lIGluZm9ybWF0aW9uLiBGb3Igb3RoZXIgdmlld3MsIHRoaXMgaXMgdGhlICpzdGFydCogb2YgdGhlIGRhdGUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlldyBpZiBhbnkuIE9ubHkgW1Jlc291cmNlVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvUmVzb3VyY2VWaWV3KSBvciBhIFtEYXlSZXNvdXJjZVZpZXddKCNDYWxlbmRhci93aWRnZXQvRGF5UmVzb3VyY2VWaWV3KSB3aWxsIGluY2x1ZGUgdGhpcy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TY2hlZHVsZU1vdXNlT3ZlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgbW91c2V1cCBtYWRlIGl0cyB3YXkgdGhyb3VnaCB0byBhbiBlbXB0eSBwYXJ0IG9mIGFueSB2aWV3LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSBtb3VzZXVwcGVkIG9uLiBfTm90ZSB0aGF0IGluIGEgW0RheVZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0RheVZpZXcpLCB0aGlzIHdpbGwgaW5jbHVkZSBncmFudWxhciB0aW1lIGluZm9ybWF0aW9uLiBGb3Igb3RoZXIgdmlld3MsIHRoaXMgaXMgdGhlICpzdGFydCogb2YgdGhlIGRhdGUuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZXZlbnQucmVzb3VyY2VSZWNvcmQgVGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlldyBpZiBhbnkuIE9ubHkgW1Jlc291cmNlVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvUmVzb3VyY2VWaWV3KSBvciBhIFtEYXlSZXNvdXJjZVZpZXddKCNDYWxlbmRhci93aWRnZXQvRGF5UmVzb3VyY2VWaWV3KSB3aWxsIGluY2x1ZGUgdGhpcy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TY2hlZHVsZU1vdXNlVXA6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyVmlldywgZG9tRXZlbnQ6IEV2ZW50LCBkYXRlOiBEYXRlLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYW55IHRpbWUgdGhlcmUgaXMgYSBjaGFuZ2UgdG8gdGhlIGV2ZW50cyBzZWxlY3RlZCBpbiB0aGUgQ2FsZW5kYXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXIudmlldy5DYWxlbmRhcn0gZXZlbnQuc291cmNlIFRoZSBDYWxlbmRhciBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0geydzZWxlY3QnLCdkZXNlbGVjdCcsJ3VwZGF0ZScsJ2NsZWFyJ30gZXZlbnQuYWN0aW9uIE9uZSBvZiB0aGUgYWN0aW9ucyAnc2VsZWN0JywgJ2Rlc2VsZWN0JywgJ3VwZGF0ZScsICdjbGVhcidcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50LnNlbGVjdGVkIEFuIGFycmF5IG9mIHRoZSBFdmVudHMgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50LmRlc2VsZWN0ZWQgQW4gYXJyYXkgb2YgdGhlIEV2ZW50IHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuc2VsZWN0aW9uIFRoZSBuZXcgc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNlbGVjdGlvbkNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXIsIGFjdGlvbjogJ3NlbGVjdCd8J2Rlc2VsZWN0J3wndXBkYXRlJ3wnY2xlYXInLCBzZWxlY3RlZDogRXZlbnRNb2RlbFtdLCBkZXNlbGVjdGVkOiBFdmVudE1vZGVsW10sIHNlbGVjdGlvbjogRXZlbnRNb2RlbFtdIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYWZ0ZXIgYSB3aWRnZXQgaXMgc2hvd24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgc2lkZWJhciBpcyBjb2xsYXBzZWQgZWl0aGVyIHRocm91Z2ggdGhlIFVJIG9yIHByb2dyYW1hdGljYWxseS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhpcyBDYWxlbmRhciBpbnN0YW5jZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNpZGViYXJDb2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIHNpZGViYXIgaXMgZXhwYW5kZWQgZWl0aGVyIHRocm91Z2ggdGhlIFVJIG9yIHByb2dyYW1hdGljYWxseS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhci52aWV3LkNhbGVuZGFyfSBldmVudC5zb3VyY2UgVGhpcyBDYWxlbmRhciBpbnN0YW5jZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNpZGViYXJFeHBhbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENhbGVuZGFyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGEgdGltZSBheGlzIG9mIGEgRGF5VmlldyBvciBXZWVrVmlldyBpcyBjbGlja2VkIG9uLiBJZiB0aGUgaGFuZGxlciByZXR1cm5zXG4gICAgICogYGZhbHNlYCB0aGUgY3VycmVudCBwb2ludGVyIGV2ZW50IGlzIG5vdCBwcm9jZXNzZWQgZnVydGhlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgdmlldyB3aGljaCB0cmlnZ2VyZWQgdGhlIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSB0cmlnZ2VyaW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LnByZWNpc2VUaW1lIFRoZSBleGFjdCBkYXRlIGFuZCB0aW1lIGF0IHRoZSBjbGlja2VkIHBvc2l0aW9uXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC50aW1lIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHRoZSBjbGlja2VkIHBvc2l0aW9uIHNuYXBwZWQgYWNjb3JkaW5nIHRvIHRoZSBbaW5jcmVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9EYXlWaWV3I2NvbmZpZy1pbmNyZW1lbnQpIGFuZCBbdGltZVNuYXBUeXBlXSgjQ2FsZW5kYXIvd2lkZ2V0L0RheVZpZXcjY29uZmlnLXRpbWVTbmFwVHlwZSlcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UaW1lQXhpc0NsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgcHJlY2lzZVRpbWU6IERhdGUsIHRpbWU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIG9uIHRoZSBvd25pbmcgU2NoZWR1bGVyIG9yIEdhbnR0IHdpZGdldCB3aGVuIGEgY2xpY2sgaGFwcGVucyBvbiBhIHRpbWUgcmFuZ2UgaGVhZGVyIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIudmlldy5TY2hlZHVsZXJ9IGV2ZW50LnNvdXJjZSBTY2hlZHVsZXIgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5UaW1lU3Bhbn0gZXZlbnQudGltZVJhbmdlUmVjb3JkIFRoZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmRvbUV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UaW1lUmFuZ2VIZWFkZXJDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyLCB0aW1lUmFuZ2VSZWNvcmQ6IFRpbWVTcGFuLCBkb21FdmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgb24gdGhlIG93bmluZyBTY2hlZHVsZXIgb3IgR2FudHQgd2lkZ2V0IHdoZW4gYSByaWdodCBjbGljayBoYXBwZW5zIG9uIGEgdGltZSByYW5nZSBoZWFkZXIgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFNjaGVkdWxlciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlRpbWVTcGFufSBldmVudC50aW1lUmFuZ2VSZWNvcmQgVGhlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRpbWVSYW5nZUhlYWRlckNvbnRleHRNZW51OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIHRpbWVSYW5nZVJlY29yZDogVGltZVNwYW4sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBvbiB0aGUgb3duaW5nIFNjaGVkdWxlciBvciBHYW50dCB3aWRnZXQgd2hlbiBhIGRvdWJsZSBjbGljayBoYXBwZW5zIG9uIGEgdGltZSByYW5nZSBoZWFkZXIgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci52aWV3LlNjaGVkdWxlcn0gZXZlbnQuc291cmNlIFNjaGVkdWxlciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlRpbWVTcGFufSBldmVudC50aW1lUmFuZ2VSZWNvcmQgVGhlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRpbWVSYW5nZUhlYWRlckRibENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXIsIHRpbWVSYW5nZVJlY29yZDogVGltZVNwYW4sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBBIGhlYWRlciBbdG9vbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctdG9vbHMpIGhhcyBiZWVuIGNsaWNrZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuVG9vbH0gZXZlbnQuc291cmNlIFRoaXMgUGFuZWwuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Ub29sfSBldmVudC50b29sIFRoZSB0b29sIHdoaWNoIGlzIGJlaW5nIGNsaWNrZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVG9vbENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUb29sLCB0b29sOiBUb29sIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIG9uZSBvZiB0aGUgY2hpbGQgdmlld3MgaXMgcGFpbnRlZC4gVGhhdCBpcyB3aGVuIGl0IGJlY29tZXMgdmlzaWJsZS5cbiAgICAgKiBOb3RlIHRoYXQgZHVlIHRvIHRoZSBzbGlkZS1pbiBhbmltYXRpb24sIHdoaWxlIHRoZSB2aWV3IGlzIHZpc2libGUsIGl0IHdpbGwgbm90XG4gICAgICogeWV0IGJlIGluIGl0cyBmaW5hbCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIHBhaW50ZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmZpcnN0UGFpbnQgYHRydWVgIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhaW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVmlld1BhaW50OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGZpcnN0UGFpbnQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSB3ZWVrIG51bWJlciBpcyBjbGlja2VkIG9yIGFjdGl2YXRlZCBieSB0aGUgPGtiZD5FTlRFUjwva2JkPiBrZXkuIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSB3ZWVrIG51bWJlciBjZWxscyBvZiBhXG4gICAgICogW1llYXJWaWV3XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9ZZWFyVmlldyksIHRoZSB3ZWVrIG51bWJlciBpbiB0aGUgZmlyc3QgY2VsbFxuICAgICAqIGluIGVhY2ggcm93IG9mIGEgW01vbnRoVmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3KVxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjZXZlbnQtd2Vla051bWJlckNsaWNrKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQuc291cmNlIFRoZSB2aWV3IHdoaWNoIHRyaWdnZXJlZCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGluaXRpYXRpbmcgRE9NIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGV2ZW50LndlZWsgVGhlIGBbeWVhciwgd2Vla11gIGNsaWNrZWQgb24uXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIGNsaWNrZWQgb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uV2Vla051bWJlckNsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDYWxlbmRhclZpZXcsIGRvbUV2ZW50OiBFdmVudCwgd2VlazogbnVtYmVyW10sIGRhdGU6IERhdGUgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgYXBwZW5kIHRoZSB1bmRlcmx5aW5nIHdpZGdldFxuICAgICAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgbWUgPSB0aGlzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZ1xuICAgICAgICAgICAgfSA9IG1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2xhc3MsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VOYW1lLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdzLFxuICAgICAgICAgICAgICAgIGJyeW50dW1FdmVudHNcbiAgICAgICAgICAgIH0gPSBCcnludHVtQ2FsZW5kYXJDb21wb25lbnQ7XG5cbiAgICAgICAgYnJ5bnR1bUNvbmZpZ3MuZmlsdGVyKHByb3AgPT4gcHJvcCBpbiB0aGlzKS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5hcHBseVByb3BWYWx1ZShicnludHVtQ29uZmlnLCBwcm9wLCB0aGlzW3Byb3BdKTtcbiAgICAgICAgICAgIGlmIChbJ2ZlYXR1cmVzJywgJ2NvbmZpZyddLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29uZmlnUHJvcChpbnN0YW5jZU5hbWUsIHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBicnludHVtRXZlbnRzLmZpbHRlcihldmVudCA9PiB0aGlzW2V2ZW50XSAmJiB0aGlzW2V2ZW50XS5vYnNlcnZlcnMubGVuZ3RoID4gMCkuZm9yRWFjaChldmVudCA9PiB7XG4gICAgICAgICAgICBjb25zdFxuICAgICAgICAgICAgICAgIHVuY2FwaXRhbGl6ZSA9IChzdHI6IHN0cmluZykgPT4gc3RyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgc3RyLnNsaWNlKDEpLFxuICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IChzdHI6IHN0cmluZykgPT4gdW5jYXBpdGFsaXplKHN0ci5zbGljZSgyKSk7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGJyeW50dW1Db25maWcubGlzdGVuZXJzW2V2ZW50TmFtZShldmVudCldID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG1lW2V2ZW50XS5lbWl0KGUpO1xuICAgICAgICAgICAgICAgIC8vIEV2ZW50RW1pdHRlciBkb2VzIG5vdCByZXR1cm4gdmFsdWVzIGluIHRoZSBub3JtYWwgd2F5LCB3b3JrIGFyb3VuZCBpdCBieSBzZXR0aW5nIGByZXR1cm5WYWx1ZWAgZmxhZ1xuICAgICAgICAgICAgICAgIC8vIGluIEFuZ3VsYXIgbGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgcmV0dXJuIGUucmV0dXJuVmFsdWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiBjb21wb25lbnQgaGFzIG5vIGNvbnRhaW5lciBzcGVjaWZpZWQgaW4gY29uZmlnIHRoZW4gdXNlIGFkb3B0IHRvIFdyYXBwZXIncyBlbGVtZW50XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICBjb250YWluZXJQYXJhbSA9IFtcbiAgICAgICAgICAgICAgICAnYWRvcHQnLFxuICAgICAgICAgICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICAgICAgICAgJ2luc2VydEFmdGVyJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QmVmb3JlJ1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIF0uZmluZChwcm9wID0+IGJyeW50dW1Db25maWdbcHJvcF0pO1xuICAgICAgICBpZiAoIWNvbnRhaW5lclBhcmFtKSB7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2VOYW1lID09PSAnQnV0dG9uJyB8fCBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Um9vdE5vZGUoKSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgICAgICAvLyBCdXR0b24gc2hvdWxkIGFsd2F5cyBiZSA8YT4gb3IgPGJ1dHRvbj4gaW5zaWRlIG93bmVyIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFwcGVuZFRvID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5hZG9wdCA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ0NvbnRhaW5lcihpbnN0YW5jZU5hbWUsIGNvbnRhaW5lclBhcmFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWUuaW5zdGFuY2UgPSBpbnN0YW5jZU5hbWUgPT09ICdXaWRnZXQnID8gV2lkZ2V0LmNyZWF0ZShicnludHVtQ29uZmlnKSA6IG5ldyBpbnN0YW5jZUNsYXNzKGJyeW50dW1Db25maWcpO1xuXG4gICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBncmlkSW5zdGFuY2UsIHNjaGVkdWxlckluc3RhbmNlIGV0Yy5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZVtTdHJpbmdIZWxwZXIudW5jYXBpdGFsaXplKGluc3RhbmNlTmFtZSkgKyAnSW5zdGFuY2UnXSA9IG1lLmluc3RhbmNlO1xuICAgICAgICAvLyBcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYXRjaCBmb3IgY2hhbmdlc1xuICAgICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAgICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgIHsgaW5zdGFuY2VOYW1lIH0gPSBCcnludHVtQ2FsZW5kYXJDb21wb25lbnQ7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGNoYW5nZXNcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hhbmdlcykuZm9yRWFjaCgoW3Byb3AsIGNoYW5nZV0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSAoY2hhbmdlIGFzIFNpbXBsZUNoYW5nZSkuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIHsgaW5zdGFuY2UgfSA9IHRoaXMsXG4gICAgICAgICAgICAgICAgeyBicnludHVtQ29uZmlnc09ubHksIGJyeW50dW1Qcm9wcyB9ID0gQnJ5bnR1bUNhbGVuZGFyQ29tcG9uZW50O1xuICAgICAgICAgICAgaWYgKGJyeW50dW1Qcm9wcy5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuYXBwbHlQcm9wVmFsdWUoaW5zdGFuY2UsIHByb3AsIG5ld1ZhbHVlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGJyeW50dW1Db25maWdzT25seS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdVcGRhdGVQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXN0cm95IHRoZSBjb21wb25lbnRcbiAgICAgKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSAmJiB0aGlzLmluc3RhbmNlLmRlc3Ryb3kpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19